IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwpQSwMEFAAAAAAAAAAhAAAAAAAAAAAAAAAAAAsAAABfX2luaXRfXy5weVBLAwQUAAAAAAAAACEAi5OU/4MfAACDHwAACwAAAF9fbWFpbl9fLnB5IyBDb3B5cmlnaHQgMjAxNyBUaGUgQmF6ZWwgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIwojIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwojIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIwojICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAojCiMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQojIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAojIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoiIiJUaGUgcGlwdG9vbCBtb2R1bGUgaW1wb3J0cyBwaXAgcmVxdWlyZW1lbnRzIGludG8gQmF6ZWwgcnVsZXMuIiIiCgojIEJvaWxlcnBsYXRlIGFkZGVkIGJ5IHN1YnBhci9jb21waWxlci9weXRob25fYXJjaGl2ZS5weQpmcm9tIHN1YnBhci5ydW50aW1lIGltcG9ydCBzdXBwb3J0IGFzIF8KXy5zZXR1cChpbXBvcnRfcm9vdHM9WydweXBpX19zZXR1cHRvb2xzXzM4XzJfNCcsICdweXBpX19waXBfOV8wXzMnLCAncHlwaV9fd2hlZWxfMF8zMF8wYTAnLCAnYmF6ZWxfdG9vbHMnLCAncHlwaV9fcGlwXzlfMF8zJywgJ3B5cGlfX3NldHVwdG9vbHNfMzhfMl80JywgJ3B5cGlfX3doZWVsXzBfMzBfMGEwJywgJ3J1bGVzX3B5dGhvbiddLCB6aXBfc2FmZT1UcnVlKQpkZWwgXwojIEVuZCBib2lsZXJwbGF0ZQppbXBvcnQgYXJncGFyc2UKaW1wb3J0IGF0ZXhpdAppbXBvcnQganNvbgppbXBvcnQgb3MKaW1wb3J0IHBrZ3V0aWwKaW1wb3J0IHBrZ19yZXNvdXJjZXMKaW1wb3J0IHJlCmltcG9ydCBzaHV0aWwKaW1wb3J0IHN5cwppbXBvcnQgdGVtcGZpbGUKaW1wb3J0IHppcGZpbGUKCiMgTm90ZTogV2UgY2FyZWZ1bGx5IGltcG9ydCB0aGUgZm9sbG93aW5nIG1vZHVsZXMgaW4gYSBwYXJ0aWN1bGFyCiMgb3JkZXIsIHNpbmNlIHRoZXNlIG1vZHVsZXMgbW9kaWZ5IHRoZSBpbXBvcnQgcGF0aCBhbmQgbWFjaGluZXJ5LgppbXBvcnQgcGtnX3Jlc291cmNlcwoKCmRlZiBleHRyYWN0X3BhY2thZ2VzKHBhY2thZ2VfbmFtZXMpOgogICAgIiIiRXh0cmFjdCB6aXBmaWxlIGNvbnRlbnRzIHRvIGRpc2sgYW5kIGFkZCB0byBpbXBvcnQgcGF0aCIiIgoKICAgICMgU2V0IGEgc2FmZSBleHRyYWN0aW9uIGRpcgogICAgZXh0cmFjdGlvbl90bXBkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKICAgIGF0ZXhpdC5yZWdpc3RlcihsYW1iZGE6IHNodXRpbC5ybXRyZWUoCiAgICAgICAgZXh0cmFjdGlvbl90bXBkaXIsIGlnbm9yZV9lcnJvcnM9VHJ1ZSkpCiAgICBwa2dfcmVzb3VyY2VzLnNldF9leHRyYWN0aW9uX3BhdGgoZXh0cmFjdGlvbl90bXBkaXIpCgogICAgIyBFeHRyYWN0IGVhY2ggcGFja2FnZSB0byBkaXNrCiAgICBkaXJzX3RvX2FkZCA9IFtdCiAgICBmb3IgcGFja2FnZV9uYW1lIGluIHBhY2thZ2VfbmFtZXM6CiAgICAgICAgcmVxID0gcGtnX3Jlc291cmNlcy5SZXF1aXJlbWVudC5wYXJzZShwYWNrYWdlX25hbWUpCiAgICAgICAgZXh0cmFjdGlvbl9kaXIgPSBwa2dfcmVzb3VyY2VzLnJlc291cmNlX2ZpbGVuYW1lKHJlcSwgJycpCiAgICAgICAgZGlyc190b19hZGQuYXBwZW5kKGV4dHJhY3Rpb25fZGlyKQoKICAgICMgQWRkIGV4dHJhY3RlZCBkaXJlY3RvcmllcyB0byBpbXBvcnQgcGF0aCBhaGVhZCBvZiB0aGVpciB6aXAgZmlsZQogICAgIyBjb3VudGVycGFydHMuCiAgICBzeXMucGF0aFswOjBdID0gZGlyc190b19hZGQKICAgIGV4aXN0aW5nX3B5dGhvbnBhdGggPSBvcy5lbnZpcm9uLmdldCgnUFlUSE9OUEFUSCcpCiAgICBpZiBleGlzdGluZ19weXRob25wYXRoOgogICAgICAgIGRpcnNfdG9fYWRkLmV4dGVuZChleGlzdGluZ19weXRob25wYXRoLnNwbGl0KCc6JykpCiAgICBvcy5lbnZpcm9uWydQWVRIT05QQVRIJ10gPSAnOicuam9pbihkaXJzX3RvX2FkZCkKCgojIFdoZWVsLCBwaXAsIGFuZCBzZXR1cHRvb2xzIGFyZSBtdWNoIGhhcHBpZXIgcnVubmluZyBmcm9tIGFjdHVhbAojIGZpbGVzIG9uIGRpc2ssIHJhdGhlciB0aGFuIGVudHJpZXMgaW4gYSB6aXBmaWxlLiAgRXh0cmFjdCB6aXBmaWxlCiMgY29udGVudHMsIGFkZCB0aG9zZSBjb250ZW50cyB0byB0aGUgcGF0aCwgdGhlbiBpbXBvcnQgdGhlbS4KZXh0cmFjdF9wYWNrYWdlcyhbJ3BpcCcsICdzZXR1cHRvb2xzJywgJ3doZWVsJ10pCgojIERlZmVhdCBwaXAncyBhdHRlbXB0IHRvIG1hbmdsZSBzeXMucGF0aApzYXZlZF9zeXNfcGF0aCA9IHN5cy5wYXRoCnN5cy5wYXRoID0gc3lzLnBhdGhbOl0KaW1wb3J0IHBpcApzeXMucGF0aCA9IHNhdmVkX3N5c19wYXRoCgppbXBvcnQgc2V0dXB0b29scwppbXBvcnQgd2hlZWwKCgpkZWYgcGlwX21haW4oYXJndik6CiAgICAjIEV4dHJhY3QgdGhlIGNlcnRpZmljYXRlcyBmcm9tIHRoZSBQQVIgZm9sbG93aW5nIHRoZSBleGFtcGxlIG9mIGdldC1waXAucHkKICAgICMgaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvZ2V0LXBpcC9ibG9iLzQzMGJhMzc3NzZhZTJhZDg5L3RlbXBsYXRlLnB5I0wxNjQtTDE2OAogICAgY2VydF90bXBkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKICAgIGNlcnRfcGF0aCA9IG9zLnBhdGguam9pbihjZXJ0X3RtcGRpciwgImNhY2VydC5wZW0iKQogICAgYXRleGl0LnJlZ2lzdGVyKGxhbWJkYTogc2h1dGlsLnJtdHJlZShjZXJ0X3RtcGRpciwgaWdub3JlX2Vycm9ycz1UcnVlKSkKICAgIHdpdGggb3BlbihjZXJ0X3BhdGgsICJ3YiIpIGFzIGNlcnQ6CiAgICAgIGNlcnQud3JpdGUocGtndXRpbC5nZXRfZGF0YSgicGlwLl92ZW5kb3IucmVxdWVzdHMiLCAiY2FjZXJ0LnBlbSIpKQogICAgYXJndiA9IFsiLS1pc29sYXRlZCIsICItLWRpc2FibGUtcGlwLXZlcnNpb24tY2hlY2siLCAiLS1jZXJ0IiwgY2VydF9wYXRoXSArIGFyZ3YKICAgIHJldHVybiBwaXAubWFpbihhcmd2KQoKZnJvbSBwYWNrYWdpbmcud2hsIGltcG9ydCBXaGVlbAoKcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoCiAgICBkZXNjcmlwdGlvbj0nSW1wb3J0IFB5dGhvbiBkZXBlbmRlbmNpZXMgaW50byBCYXplbC4nKQoKcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1weXRob25faW50ZXJwcmV0ZXInLCBhY3Rpb249J3N0b3JlJywKICAgICAgICAgICAgICAgICAgICBoZWxwPSgnVGhlIFB5dGhvbiBpbnRlcnByZXRlciB0byB1c2Ugd2hlbiBleHRyYWN0aW5nICcKICAgICAgICAgICAgICAgICAgICAgICAgICAnd2hlZWxzLicpKQoKcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1uYW1lJywgYWN0aW9uPSdzdG9yZScsCiAgICAgICAgICAgICAgICAgICAgaGVscD0oJ1RoZSBuYW1lc3BhY2Ugb2YgdGhlIGltcG9ydC4nKSkKCnBhcnNlci5hZGRfYXJndW1lbnQoJy0taW5wdXQnLCBhY3Rpb249J3N0b3JlJywKICAgICAgICAgICAgICAgICAgICBoZWxwPSgnVGhlIHJlcXVpcmVtZW50cy50eHQgZmlsZSB0byBpbXBvcnQuJykpCgpwYXJzZXIuYWRkX2FyZ3VtZW50KCctLW91dHB1dCcsIGFjdGlvbj0nc3RvcmUnLAogICAgICAgICAgICAgICAgICAgIGhlbHA9KCdUaGUgcmVxdWlyZW1lbnRzLmJ6bCBmaWxlIHRvIGV4cG9ydC4nKSkKCnBhcnNlci5hZGRfYXJndW1lbnQoJy0tZGlyZWN0b3J5JywgYWN0aW9uPSdzdG9yZScsCiAgICAgICAgICAgICAgICAgICAgaGVscD0oJ1RoZSBkaXJlY3RvcnkgaW50byB3aGljaCB0byBwdXQgLndobCBmaWxlcy4nKSkKCmRlZiBkZXRlcm1pbmVfcG9zc2libGVfZXh0cmFzKHdobHMpOgogICIiIkRldGVybWluZXMgdGhlIGxpc3Qgb2YgcG9zc2libGUgImV4dHJhcyIgZm9yIGVhY2ggLndobAoKICBUaGUgcG9zc2liaWxpdHkgb2YgYW4gZXh0cmEgaXMgZGV0ZXJtaW5lZCBieSBsb29raW5nIGF0IGl0cwogIGFkZGl0aW9uYWwgcmVxdWlyZW1lbnRzLCBhbmQgZGV0ZXJtaW5pbmUgd2hldGhlciB0aGV5IGFyZQogIHNhdGlzZmllZCBieSB0aGUgY29tcGxldGUgbGlzdCBvZiBhdmFpbGFibGUgd2hlZWxzLgoKICBBcmdzOgogICAgd2hsczogYSBsaXN0IG9mIFdoZWVsIG9iamVjdHMKCiAgUmV0dXJuczoKICAgIGEgZGljdCB0aGF0IGlzIGtleWVkIGJ5IHRoZSBXaGVlbCBvYmplY3RzIGluIHdobHMsIGFuZCB3aG9zZQogICAgdmFsdWVzIGFyZSBsaXN0cyBvZiBwb3NzaWJsZSBleHRyYXMuCiAgIiIiCiAgd2hsX21hcCA9IHsKICAgIHdobC5kaXN0cmlidXRpb24oKTogd2hsCiAgICBmb3Igd2hsIGluIHdobHMKICB9CgogICMgVE9ETyhtYXR0bW9vcik6IENvbnNpZGVyIG1lbW9pemluZyBpZiB0aGlzIHJlY3Vyc2lvbiBldmVyIGJlY29tZXMKICAjIGV4cGVuc2l2ZSBlbm91Z2ggdG8gd2FycmFudCBpdC4KICBkZWYgaXNfcG9zc2libGUoZGlzdHJvLCBleHRyYSk6CiAgICBkaXN0cm8gPSBkaXN0cm8ucmVwbGFjZSgiLSIsICJfIikKICAgICMgSWYgd2UgZG9uJ3QgaGF2ZSB0aGUgLndobCBhdCBhbGwsIHRoZW4gdGhpcyBpc24ndCBwb3NzaWJsZS4KICAgIGlmIGRpc3RybyBub3QgaW4gd2hsX21hcDoKICAgICAgcmV0dXJuIEZhbHNlCiAgICB3aGwgPSB3aGxfbWFwW2Rpc3Ryb10KICAgICMgSWYgd2UgaGF2ZSB0aGUgLndobCwgYW5kIHdlIGRvbid0IG5lZWQgYW55dGhpbmcgZXh0cmEgdGhlbgogICAgIyB3ZSBjYW4gc2F0aXNmeSB0aGlzIGRlcGVuZGVuY3kuCiAgICBpZiBub3QgZXh0cmE6CiAgICAgIHJldHVybiBUcnVlCiAgICAjIElmIHdlIGRvIG5lZWQgc29tZXRoaW5nIGV4dHJhLCB0aGVuIGNoZWNrIHRoZSBleHRyYSdzCiAgICAjIGRlcGVuZGVuY2llcyB0byBtYWtlIHN1cmUgdGhleSBhcmUgZnVsbHkgc2F0aXNmaWVkLgogICAgZm9yIGV4dHJhX2RlcCBpbiB3aGwuZGVwZW5kZW5jaWVzKGV4dHJhPWV4dHJhKToKICAgICAgcmVxID0gcGtnX3Jlc291cmNlcy5SZXF1aXJlbWVudC5wYXJzZShleHRyYV9kZXApCiAgICAgICMgQ2hlY2sgdGhhdCB0aGUgZGVwIGFuZCBhbnkgZXh0cmFzIGFyZSBhbGwgcG9zc2libGUuCiAgICAgIGlmIG5vdCBpc19wb3NzaWJsZShyZXEucHJvamVjdF9uYW1lLCBOb25lKToKICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgZm9yIGUgaW4gcmVxLmV4dHJhczoKICAgICAgICBpZiBub3QgaXNfcG9zc2libGUocmVxLnByb2plY3RfbmFtZSwgZSk6CiAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICMgSWYgYWxsIG9mIHRoZSBkZXBlbmRlbmNpZXMgb2YgdGhlIGV4dHJhIGFyZSBzYXRpc2ZpYWJsZSB0aGVuCiAgICAjIGl0IGlzIHBvc3NpYmxlIHRvIGNvbnN0cnVjdCB0aGlzIGRlcGVuZGVuY3kuCiAgICByZXR1cm4gVHJ1ZQoKICByZXR1cm4gewogICAgd2hsOiBbCiAgICAgIGV4dHJhCiAgICAgIGZvciBleHRyYSBpbiB3aGwuZXh0cmFzKCkKICAgICAgaWYgaXNfcG9zc2libGUod2hsLmRpc3RyaWJ1dGlvbigpLCBleHRyYSkKICAgIF0KICAgIGZvciB3aGwgaW4gd2hscwogIH0KCmRlZiBtYWluKCk6CiAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKCiAgIyBodHRwczovL2dpdGh1Yi5jb20vcHlwYS9waXAvYmxvYi85LjAuMS9waXAvX19pbml0X18ucHkjTDIwOQogIGlmIHBpcF9tYWluKFsid2hlZWwiLCAiLXciLCBhcmdzLmRpcmVjdG9yeSwgIi1yIiwgYXJncy5pbnB1dF0pOgogICAgc3lzLmV4aXQoMSkKCiAgIyBFbnVtZXJhdGUgdGhlIC53aGwgZmlsZXMgd2UgZG93bmxvYWRlZC4KICBkZWYgbGlzdF93aGxzKCk6CiAgICBkaXIgPSBhcmdzLmRpcmVjdG9yeSArICcvJwogICAgZm9yIHJvb3QsIHVudXNlZF9kaXJuYW1lcywgZmlsZW5hbWVzIGluIG9zLndhbGsoZGlyKToKICAgICAgZm9yIGZuYW1lIGluIGZpbGVuYW1lczoKICAgICAgICBpZiBmbmFtZS5lbmRzd2l0aCgnLndobCcpOgogICAgICAgICAgeWllbGQgb3MucGF0aC5qb2luKHJvb3QsIGZuYW1lKQoKICB3aGxzID0gW1doZWVsKHBhdGgpIGZvciBwYXRoIGluIGxpc3Rfd2hscygpXQogIHBvc3NpYmxlX2V4dHJhcyA9IGRldGVybWluZV9wb3NzaWJsZV9leHRyYXMod2hscykKCiAgZGVmIHdobF9saWJyYXJ5KHdoZWVsKToKICAgICMgSW5kZW50YXRpb24gaGVyZSBtYXR0ZXJzLiAgd2hsX2xpYnJhcnkgbXVzdCBiZSB3aXRoaW4gdGhlIHNjb3BlCiAgICAjIG9mIHRoZSBmdW5jdGlvbiBiZWxvdy4gIFdlIGFsc28gYXZvaWQgcmVpbXBvcnRpbmcgYW4gZXhpc3RpbmcgV0hMLgogICAgcmV0dXJuICIiIgogIGlmICJ7cmVwb19uYW1lfSIgbm90IGluIG5hdGl2ZS5leGlzdGluZ19ydWxlcygpOgogICAgd2hsX2xpYnJhcnkoCiAgICAgICAgbmFtZSA9ICJ7cmVwb19uYW1lfSIsCiAgICAgICAgcHl0aG9uX2ludGVycHJldGVyID0gIntweXRob25faW50ZXJwcmV0ZXJ9IiwKICAgICAgICB3aGwgPSAiQHtuYW1lfS8vOntwYXRofSIsCiAgICAgICAgcmVxdWlyZW1lbnRzID0gIkB7bmFtZX0vLzpyZXF1aXJlbWVudHMuYnpsIiwKICAgICAgICBleHRyYXMgPSBbe2V4dHJhc31dCiAgICApIiIiLmZvcm1hdChuYW1lPWFyZ3MubmFtZSwgcmVwb19uYW1lPXdoZWVsLnJlcG9zaXRvcnlfbmFtZSgpLAogICAgICAgICAgICAgICAgcHl0aG9uX2ludGVycHJldGVyPWFyZ3MucHl0aG9uX2ludGVycHJldGVyLAogICAgICAgICAgICAgICAgcGF0aD13aGVlbC5iYXNlbmFtZSgpLAogICAgICAgICAgICAgICAgZXh0cmFzPScsJy5qb2luKFsKICAgICAgICAgICAgICAgICAgJyIlcyInICUgZXh0cmEKICAgICAgICAgICAgICAgICAgZm9yIGV4dHJhIGluIHBvc3NpYmxlX2V4dHJhcy5nZXQod2hlZWwsIFtdKQogICAgICAgICAgICAgICAgXSkpCgogIHdobF90YXJnZXRzID0gJywnLmpvaW4oWwogICAgJywnLmpvaW4oWwogICAgICAnIiVzIjogIkAlcy8vOnBrZyInICUgKHdobC5kaXN0cmlidXRpb24oKS5sb3dlcigpLCB3aGwucmVwb3NpdG9yeV9uYW1lKCkpCiAgICBdICsgWwogICAgICAjIEZvciBldmVyeSBleHRyYSB0aGF0IGlzIHBvc3NpYmxlIGZyb20gdGhpcyByZXF1aXJlbWVudHMudHh0CiAgICAgICciJXNbJXNdIjogIkAlcy8vOiVzIicgJSAod2hsLmRpc3RyaWJ1dGlvbigpLmxvd2VyKCksIGV4dHJhLmxvd2VyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hsLnJlcG9zaXRvcnlfbmFtZSgpLCBleHRyYSkKICAgICAgZm9yIGV4dHJhIGluIHBvc3NpYmxlX2V4dHJhcy5nZXQod2hsLCBbXSkKICAgIF0pCiAgICBmb3Igd2hsIGluIHdobHMKICBdKQoKICB3aXRoIG9wZW4oYXJncy5vdXRwdXQsICd3JykgYXMgZjoKICAgIGYud3JpdGUoIiIiXAojIEluc3RhbGwgcGlwIHJlcXVpcmVtZW50cy4KIwojIEdlbmVyYXRlZCBmcm9tIHtpbnB1dH0KCmxvYWQoIkBydWxlc19weXRob24vL3B5dGhvbjp3aGwuYnpsIiwgIndobF9saWJyYXJ5IikKCmRlZiBwaXBfaW5zdGFsbCgpOgogIHt3aGxfbGlicmFyaWVzfQoKX3JlcXVpcmVtZW50cyA9IHt7CiAge21hcHBpbmdzfQp9fQoKYWxsX3JlcXVpcmVtZW50cyA9IF9yZXF1aXJlbWVudHMudmFsdWVzKCkKCmRlZiByZXF1aXJlbWVudChuYW1lKToKICBuYW1lX2tleSA9IG5hbWUucmVwbGFjZSgiLSIsICJfIikubG93ZXIoKQogIGlmIG5hbWVfa2V5IG5vdCBpbiBfcmVxdWlyZW1lbnRzOgogICAgZmFpbCgiQ291bGQgbm90IGZpbmQgcGlwLXByb3ZpZGVkIGRlcGVuZGVuY3k6ICclcyciICUgbmFtZSkKICByZXR1cm4gX3JlcXVpcmVtZW50c1tuYW1lX2tleV0KIiIiLmZvcm1hdChpbnB1dD1hcmdzLmlucHV0LAogICAgICAgICAgIHdobF9saWJyYXJpZXM9J1xuJy5qb2luKG1hcCh3aGxfbGlicmFyeSwgd2hscykpIGlmIHdobHMgZWxzZSAicGFzcyIsCiAgICAgICAgICAgbWFwcGluZ3M9d2hsX3RhcmdldHMpKQoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICBtYWluKCkKUEsDBBQAAAAAAAAAIQBPOWlV4g0AAOINAAAmAAAAYmF6ZWxfdG9vbHMvdG9vbHMvcHl0aG9uL3B5M3dyYXBwZXIuc2gjIS9iaW4vc2gKCiMgRG9uJ3Qgc2V0IC1lIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSByb2J1c3QgdHJhcHBpbmcgYW5kIHByaW50aW5nIG9mIGVycm9ycy4Kc2V0IC11CgojIFdlIHVzZSAvYmluL3NoIHJhdGhlciB0aGFuIC9iaW4vYmFzaCBmb3IgcG9ydGFiaWxpdHkuIFNlZSBkaXNjdXNzaW9uIGhlcmU6CiMgaHR0cHM6Ly9ncm91cHMuZ29vZ2xlLmNvbS9mb3J1bS8/bm9tb2JpbGU9dHJ1ZSMhdG9waWMvYmF6ZWwtZGV2LzRRbF83ZURjTEMwCiMgV2UgZG8gbG9zZSB0aGUgYWJpbGl0eSB0byBzZXQgLW8gcGlwZWZhaWwuCgpTVFJJQ1Q9IjEiCgppZiBbICIkU1RSSUNUIiA9ICIxIiBdOyB0aGVuCiAgRkFJTFVSRV9IRUFERVI9IlwKRXJyb3Igb2NjdXJyZWQgd2hpbGUgYXR0ZW1wdGluZyB0byB1c2UgdGhlIGRlZmF1bHQgUHl0aG9uIHRvb2xjaGFpbiBcCihAYmF6ZWxfdG9vbHMvL3Rvb2xzL3B5dGhvbjphdXRvZGV0ZWN0aW5nX3Rvb2xjaGFpbikuIgplbHNlCiAgRkFJTFVSRV9IRUFERVI9IlwKRXJyb3Igb2NjdXJyZWQgd2hpbGUgYXR0ZW1wdGluZyB0byB1c2UgdGhlIG5vbi1zdHJpY3QgYXV0b2RldGVjdGluZyBQeXRob24gXAp0b29sY2hhaW4gKEBiYXplbF90b29scy8vdG9vbHMvcHl0aG9uOmF1dG9kZXRlY3RpbmdfdG9vbGNoYWluX25vbnN0cmljdCkuIgpmaQoKZGllKCkgewogIGVjaG8gIiRGQUlMVVJFX0hFQURFUiIgMT4mMgogIGVjaG8gIiQxIiAxPiYyCiAgZXhpdCAxCn0KCiMgV2UgdXNlIGB3aGljaGAgdG8gbG9jYXRlIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgY29tbWFuZCBvbiBQQVRILiBgY29tbWFuZCAtdmAKIyBpcyBhbm90aGVyIG9wdGlvbiwgYnV0IGl0IGRvZXNuJ3QgY2hlY2sgd2hldGhlciB0aGUgZmlsZSBpdCBmaW5kcyBoYXMgdGhlCiMgZXhlY3V0YWJsZSBiaXQuCiMKIyBBIHRyaWNreSBzaXR1YXRpb24gaGFwcGVucyB3aGVuIHRoaXMgd3JhcHBlciBpcyBpbnZva2VkIGFzIHBhcnQgb2YgcnVubmluZyBhCiMgdG9vbCwgZS5nLiBwYXNzaW5nIGEgcHlfYmluYXJ5IHRhcmdldCB0byBgY3R4LmFjdGlvbnMucnVuKClgLiBCYXplbCB3aWxsIHVuc2V0CiMgdGhlIFBBVEggdmFyaWFibGUuIFRoZW4gdGhlIHNoZWxsIHdpbGwgc2VlIHRoZXJlJ3Mgbm8gUEFUSCBhbmQgaW5pdGlhbGl6ZSBpdHMKIyBvd24sIHNvbWV0aW1lcyB3aXRob3V0IGV4cG9ydGluZyBpdC4gVGhpcyBjYXVzZXMgYHdoaWNoYCB0byBmYWlsIGFuZCB0aGlzCiMgc2NyaXB0IHRvIHRoaW5rIHRoZXJlJ3Mgbm8gUHl0aG9uIGludGVycHJldGVyIGluc3RhbGxlZC4gVG8gYXZvaWQgdGhpcyB3ZQojIGV4cGxpY2l0bHkgcGFzcyBQQVRIIHRvIGVhY2ggYHdoaWNoYCBpbnZvY2F0aW9uLiBXZSBjYW4ndCBqdXN0IGV4cG9ydCBQQVRICiMgYmVjYXVzZSB0aGF0IHdvdWxkIG1vZGlmeSB0aGUgZW52aXJvbm1lbnQgc2VlbiBieSB0aGUgZmluYWwgdXNlciBQeXRob24KIyBwcm9ncmFtLgojCiMgU2VlIGFsc286CiMKIyAgICAgaHR0cHM6Ly9naXRodWIuY29tL2JhemVsYnVpbGQvY29udGludW91cy1pbnRlZ3JhdGlvbi9pc3N1ZXMvNTc4CiMgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9iYXplbGJ1aWxkL2JhemVsL2lzc3Vlcy84NDE0CiMgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9iYXplbGJ1aWxkL2JhemVsL2lzc3Vlcy84NDE1CgojIFRyeSB0aGUgInB5dGhvbjMiIGNvbW1hbmQgbmFtZSBmaXJzdCwgdGhlbiBmYWxsIGJhY2sgb24gInB5dGhvbiIuClBZVEhPTl9CSU49IiQoUEFUSD0iJFBBVEgiIHdoaWNoIHB5dGhvbjMgMj4gL2Rldi9udWxsKSIKVVNFRF9GQUxMQkFDSz0iMCIKaWYgWyAteiAiJHtQWVRIT05fQklOOi19IiBdOyB0aGVuCiAgUFlUSE9OX0JJTj0iJChQQVRIPSIkUEFUSCIgd2hpY2ggcHl0aG9uIDI+L2Rldi9udWxsKSIKICBVU0VEX0ZBTExCQUNLPSIxIgpmaQppZiBbIC16ICIke1BZVEhPTl9CSU46LX0iIF07IHRoZW4KICBkaWUgIk5laXRoZXIgJ3B5dGhvbjMnIG5vciAncHl0aG9uJyB3ZXJlIGZvdW5kIG9uIHRoZSB0YXJnZXQgXApwbGF0Zm9ybSdzIFBBVEgsIHdoaWNoIGlzOgoKJFBBVEgKClBsZWFzZSBlbnN1cmUgYW4gaW50ZXJwcmV0ZXIgaXMgYXZhaWxhYmxlIG9uIHRoaXMgcGxhdGZvcm0gKGFuZCBtYXJrZWQgXApleGVjdXRhYmxlKSwgb3IgZWxzZSByZWdpc3RlciBhbiBhcHByb3ByaWF0ZSBQeXRob24gdG9vbGNoYWluIGFzIHBlciB0aGUgXApkb2N1bWVudGF0aW9uIGZvciBweV9ydW50aW1lX3BhaXIgXAooaHR0cHM6Ly9naXRodWIuY29tL2JhemVsYnVpbGQvYmF6ZWwvYmxvYi9tYXN0ZXIvdG9vbHMvcHl0aG9uL3Rvb2xjaGFpbi5iemwpLiIKZmkKCmlmIFsgIiRTVFJJQ1QiID0gIjEiIF07IHRoZW4KICAjIFZlcmlmeSB0aGF0IHdlIGdyYWJiZWQgYW4gaW50ZXJwcmV0ZXIgd2l0aCB0aGUgcmlnaHQgdmVyc2lvbi4KICBWRVJTSU9OX1NUUj0iJCgiJFBZVEhPTl9CSU4iIC1WIDI+JjEpIiBcCiAgICAgIHx8IGRpZSAiQ291bGQgbm90IGdldCBpbnRlcnByZXRlciB2ZXJzaW9uIHZpYSAnJFBZVEhPTl9CSU4gLVYnIgogIGlmICEgZWNobyAiJFZFUlNJT05fU1RSIiB8IGdyZXAgLXEgIiAzXC4iIDsgdGhlbgogICAgICBkaWUgIkFjY29yZGluZyB0byAnJFBZVEhPTl9CSU4gLVYnLCB2ZXJzaW9uIGlzICckVkVSU0lPTl9TVFInLCBidXQgd2UgXApuZWVkIHZlcnNpb24gMy4gUEFUSCBpczoKCiRQQVRICgpQbGVhc2UgZW5zdXJlIGFuIGludGVycHJldGVyIHdpdGggdmVyc2lvbiAzIGlzIGF2YWlsYWJsZSBvbiB0aGlzIFwKcGxhdGZvcm0gYXMgJ3B5dGhvbjMnIG9yICdweXRob24nLCBvciBlbHNlIHJlZ2lzdGVyIGFuIGFwcHJvcHJpYXRlIFwKUHl0aG9uIHRvb2xjaGFpbiBhcyBwZXIgdGhlIGRvY3VtZW50YXRpb24gZm9yIHB5X3J1bnRpbWVfcGFpciBcCihodHRwczovL2dpdGh1Yi5jb20vYmF6ZWxidWlsZC9iYXplbC9ibG9iL21hc3Rlci90b29scy9weXRob24vdG9vbGNoYWluLmJ6bCkuCgpOb3RlIHRoYXQgcHJpb3IgdG8gQmF6ZWwgMC4yNywgdGhlcmUgd2FzIG5vIGNoZWNrIHRvIGVuc3VyZSB0aGF0IHRoZSBcCmludGVycHJldGVyJ3MgdmVyc2lvbiBtYXRjaGVkIHRoZSB2ZXJzaW9uIGRlY2xhcmVkIGJ5IHRoZSB0YXJnZXQgKCM0ODE1KS4gSWYgXAp5b3VyIGJ1aWxkIHdvcmtlZCBwcmlvciB0byBCYXplbCAwLjI3LCBhbmQgeW91J3JlIHN1cmUgeW91ciB0YXJnZXRzIGRvIG5vdCBcCnJlcXVpcmUgUHl0aG9uIDMsIHlvdSBjYW4gb3B0IG91dCBvZiB0aGlzIHZlcnNpb24gY2hlY2sgYnkgdXNpbmcgdGhlIFwKbm9uLXN0cmljdCBhdXRvZGV0ZWN0aW5nIHRvb2xjaGFpbiBpbnN0ZWFkIG9mIHRoZSBzdGFuZGFyZCBhdXRvZGV0ZWN0aW5nIFwKdG9vbGNoYWluLiBUaGlzIGNhbiBiZSBkb25lIGJ5IHBhc3NpbmcgdGhlIGZsYWcgXApcYC0tZXh0cmFfdG9vbGNoYWlucz1AYmF6ZWxfdG9vbHMvL3Rvb2xzL3B5dGhvbjphdXRvZGV0ZWN0aW5nX3Rvb2xjaGFpbl9ub25zdHJpY3RcYCBcCm9uIHRoZSBjb21tYW5kIGxpbmUgb3IgYWRkaW5nIGl0IHRvIHlvdXIgYmF6ZWxyYy4iCiAgZmkKZmkKCmV4ZWMgIiRQWVRIT05fQklOIiAiJEAiClBLAwQUAAAAAAAAACEAAAAAAAAAAAAAAAAAGwAAAHB5cGlfX3BpcF85XzBfMy9fX2luaXRfXy5weVBLAwQUAAAAAAAAACEAq3E0VwcFAAAHBQAAMwAAAHB5cGlfX3BpcF85XzBfMy9waXAtOS4wLjMuZGlzdC1pbmZvL0RFU0NSSVBUSU9OLnJzdHBpcAo9PT0KClRoZSBgUHlQQSByZWNvbW1lbmRlZAo8aHR0cHM6Ly9wYWNrYWdpbmcucHl0aG9uLm9yZy9lbi9sYXRlc3QvY3VycmVudC8+YF8KdG9vbCBmb3IgaW5zdGFsbGluZyBQeXRob24gcGFja2FnZXMuCgoqIGBJbnN0YWxsYXRpb24gPGh0dHBzOi8vcGlwLnB5cGEuaW8vZW4vc3RhYmxlL2luc3RhbGxpbmcuaHRtbD5gXwoqIGBEb2N1bWVudGF0aW9uIDxodHRwczovL3BpcC5weXBhLmlvLz5gXwoqIGBDaGFuZ2Vsb2cgPGh0dHBzOi8vcGlwLnB5cGEuaW8vZW4vc3RhYmxlL25ld3MuaHRtbD5gXwoqIGBHaXRodWIgUGFnZSA8aHR0cHM6Ly9naXRodWIuY29tL3B5cGEvcGlwPmBfCiogYElzc3VlIFRyYWNraW5nIDxodHRwczovL2dpdGh1Yi5jb20vcHlwYS9waXAvaXNzdWVzPmBfCiogYFVzZXIgbWFpbGluZyBsaXN0IDxodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXAvcHl0aG9uLXZpcnR1YWxlbnY+YF8KKiBgRGV2IG1haWxpbmcgbGlzdCA8aHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3VwL3B5cGEtZGV2PmBfCiogVXNlciBJUkM6ICNweXBhIG9uIEZyZWVub2RlLgoqIERldiBJUkM6ICNweXBhLWRldiBvbiBGcmVlbm9kZS4KCgouLiBpbWFnZTo6IGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vcHlwaS92L3BpcC5zdmcKICAgOnRhcmdldDogaHR0cHM6Ly9weXBpLnB5dGhvbi5vcmcvcHlwaS9waXAKCi4uIGltYWdlOjogaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby90cmF2aXMvcHlwYS9waXAvbWFzdGVyLnN2ZwogICA6dGFyZ2V0OiBodHRwOi8vdHJhdmlzLWNpLm9yZy9weXBhL3BpcAoKLi4gaW1hZ2U6OiBodHRwczovL2ltZy5zaGllbGRzLmlvL2FwcHZleW9yL2NpL3B5cGEvcGlwLnN2ZwogICA6dGFyZ2V0OiBodHRwczovL2NpLmFwcHZleW9yLmNvbS9wcm9qZWN0L3B5cGEvcGlwL2hpc3RvcnkKCi4uIGltYWdlOjogaHR0cHM6Ly9yZWFkdGhlZG9jcy5vcmcvcHJvamVjdHMvcGlwL2JhZGdlLz92ZXJzaW9uPXN0YWJsZQogICA6dGFyZ2V0OiBodHRwczovL3BpcC5weXBhLmlvL2VuL3N0YWJsZQoKQ29kZSBvZiBDb25kdWN0Ci0tLS0tLS0tLS0tLS0tLQoKRXZlcnlvbmUgaW50ZXJhY3RpbmcgaW4gdGhlIHBpcCBwcm9qZWN0J3MgY29kZWJhc2VzLCBpc3N1ZSB0cmFja2VycywgY2hhdApyb29tcywgYW5kIG1haWxpbmcgbGlzdHMgaXMgZXhwZWN0ZWQgdG8gZm9sbG93IHRoZSBgUHlQQSBDb2RlIG9mIENvbmR1Y3RgXy4KCi4uIF9QeVBBIENvZGUgb2YgQ29uZHVjdDogaHR0cHM6Ly93d3cucHlwYS5pby9lbi9sYXRlc3QvY29kZS1vZi1jb25kdWN0LwoKClBLAwQUAAAAAAAAACEAPFB/JfkJAAD5CQAALAAAAHB5cGlfX3BpcF85XzBfMy9waXAtOS4wLjMuZGlzdC1pbmZvL01FVEFEQVRBTWV0YWRhdGEtVmVyc2lvbjogMi4wCk5hbWU6IHBpcApWZXJzaW9uOiA5LjAuMwpTdW1tYXJ5OiBUaGUgUHlQQSByZWNvbW1lbmRlZCB0b29sIGZvciBpbnN0YWxsaW5nIFB5dGhvbiBwYWNrYWdlcy4KSG9tZS1wYWdlOiBodHRwczovL3BpcC5weXBhLmlvLwpBdXRob3I6IFRoZSBwaXAgZGV2ZWxvcGVycwpBdXRob3ItZW1haWw6IHB5dGhvbi12aXJ0dWFsZW52QGdyb3Vwcy5nb29nbGUuY29tCkxpY2Vuc2U6IE1JVApLZXl3b3JkczogZWFzeV9pbnN0YWxsIGRpc3R1dGlscyBzZXR1cHRvb2xzIGVnZyB2aXJ0dWFsZW52ClBsYXRmb3JtOiBVTktOT1dOCkNsYXNzaWZpZXI6IERldmVsb3BtZW50IFN0YXR1cyA6OiA1IC0gUHJvZHVjdGlvbi9TdGFibGUKQ2xhc3NpZmllcjogSW50ZW5kZWQgQXVkaWVuY2UgOjogRGV2ZWxvcGVycwpDbGFzc2lmaWVyOiBMaWNlbnNlIDo6IE9TSSBBcHByb3ZlZCA6OiBNSVQgTGljZW5zZQpDbGFzc2lmaWVyOiBUb3BpYyA6OiBTb2Z0d2FyZSBEZXZlbG9wbWVudCA6OiBCdWlsZCBUb29scwpDbGFzc2lmaWVyOiBQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMgpDbGFzc2lmaWVyOiBQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMi42CkNsYXNzaWZpZXI6IFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAyLjcKQ2xhc3NpZmllcjogUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMKQ2xhc3NpZmllcjogUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuMwpDbGFzc2lmaWVyOiBQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy40CkNsYXNzaWZpZXI6IFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjUKQ2xhc3NpZmllcjogUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IEltcGxlbWVudGF0aW9uIDo6IFB5UHkKUmVxdWlyZXMtUHl0aG9uOiA+PTIuNiwhPTMuMC4qLCE9My4xLiosIT0zLjIuKgpQcm92aWRlcy1FeHRyYTogdGVzdGluZwpQcm92aWRlcy1FeHRyYTogdGVzdGluZwpSZXF1aXJlcy1EaXN0OiBweXRlc3Q7IGV4dHJhID09ICd0ZXN0aW5nJwpSZXF1aXJlcy1EaXN0OiB2aXJ0dWFsZW52ICg+PTEuMTApOyBleHRyYSA9PSAndGVzdGluZycKUmVxdWlyZXMtRGlzdDogc2NyaXB0dGVzdCAoPj0xLjMpOyBleHRyYSA9PSAndGVzdGluZycKUmVxdWlyZXMtRGlzdDogbW9jazsgZXh0cmEgPT0gJ3Rlc3RpbmcnClJlcXVpcmVzLURpc3Q6IHByZXRlbmQ7IGV4dHJhID09ICd0ZXN0aW5nJwoKcGlwCj09PQoKVGhlIGBQeVBBIHJlY29tbWVuZGVkCjxodHRwczovL3BhY2thZ2luZy5weXRob24ub3JnL2VuL2xhdGVzdC9jdXJyZW50Lz5gXwp0b29sIGZvciBpbnN0YWxsaW5nIFB5dGhvbiBwYWNrYWdlcy4KCiogYEluc3RhbGxhdGlvbiA8aHR0cHM6Ly9waXAucHlwYS5pby9lbi9zdGFibGUvaW5zdGFsbGluZy5odG1sPmBfCiogYERvY3VtZW50YXRpb24gPGh0dHBzOi8vcGlwLnB5cGEuaW8vPmBfCiogYENoYW5nZWxvZyA8aHR0cHM6Ly9waXAucHlwYS5pby9lbi9zdGFibGUvbmV3cy5odG1sPmBfCiogYEdpdGh1YiBQYWdlIDxodHRwczovL2dpdGh1Yi5jb20vcHlwYS9waXA+YF8KKiBgSXNzdWUgVHJhY2tpbmcgPGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3BpcC9pc3N1ZXM+YF8KKiBgVXNlciBtYWlsaW5nIGxpc3QgPGh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cC9weXRob24tdmlydHVhbGVudj5gXwoqIGBEZXYgbWFpbGluZyBsaXN0IDxodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXAvcHlwYS1kZXY+YF8KKiBVc2VyIElSQzogI3B5cGEgb24gRnJlZW5vZGUuCiogRGV2IElSQzogI3B5cGEtZGV2IG9uIEZyZWVub2RlLgoKCi4uIGltYWdlOjogaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9weXBpL3YvcGlwLnN2ZwogICA6dGFyZ2V0OiBodHRwczovL3B5cGkucHl0aG9uLm9yZy9weXBpL3BpcAoKLi4gaW1hZ2U6OiBodHRwczovL2ltZy5zaGllbGRzLmlvL3RyYXZpcy9weXBhL3BpcC9tYXN0ZXIuc3ZnCiAgIDp0YXJnZXQ6IGh0dHA6Ly90cmF2aXMtY2kub3JnL3B5cGEvcGlwCgouLiBpbWFnZTo6IGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYXBwdmV5b3IvY2kvcHlwYS9waXAuc3ZnCiAgIDp0YXJnZXQ6IGh0dHBzOi8vY2kuYXBwdmV5b3IuY29tL3Byb2plY3QvcHlwYS9waXAvaGlzdG9yeQoKLi4gaW1hZ2U6OiBodHRwczovL3JlYWR0aGVkb2NzLm9yZy9wcm9qZWN0cy9waXAvYmFkZ2UvP3ZlcnNpb249c3RhYmxlCiAgIDp0YXJnZXQ6IGh0dHBzOi8vcGlwLnB5cGEuaW8vZW4vc3RhYmxlCgpDb2RlIG9mIENvbmR1Y3QKLS0tLS0tLS0tLS0tLS0tCgpFdmVyeW9uZSBpbnRlcmFjdGluZyBpbiB0aGUgcGlwIHByb2plY3QncyBjb2RlYmFzZXMsIGlzc3VlIHRyYWNrZXJzLCBjaGF0CnJvb21zLCBhbmQgbWFpbGluZyBsaXN0cyBpcyBleHBlY3RlZCB0byBmb2xsb3cgdGhlIGBQeVBBIENvZGUgb2YgQ29uZHVjdGBfLgoKLi4gX1B5UEEgQ29kZSBvZiBDb25kdWN0OiBodHRwczovL3d3dy5weXBhLmlvL2VuL2xhdGVzdC9jb2RlLW9mLWNvbmR1Y3QvCgoKUEsDBBQAAAAAAAAAIQBX/iPlmGIAAJhiAAAqAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC05LjAuMy5kaXN0LWluZm8vUkVDT1JEcGlwL19faW5pdF9fLnB5LHNoYTI1Nj1heHZJaldfTWdobUdiOVZRRWJSZmt5czFhNWpLR3N5eVowZGYwTS1iZVBVLDExOTU2DQpwaXAvX19tYWluX18ucHksc2hhMjU2PVY2S2gtSUVERUZwdDFjYWhSRTZNYWpVRl8xNHFKUl9Rc3ZuNE1qV1pYekUsNTg0DQpwaXAvYmFzZWNvbW1hbmQucHksc2hhMjU2PVRUbG1aZXNRNFZ1eGN0bzJLcXdaR21nbU41aW9IRWxfRGVGZXY5aWVfU0EsMTE5MTANCnBpcC9iYXNlcGFyc2VyLnB5LHNoYTI1Nj1BS01PZUYzZlRyUnJvaXYwRG1UUWJkaUxXMERRdXgyS3FHQ19kSkpCOWQwLDEwNDY1DQpwaXAvY21kb3B0aW9ucy5weSxzaGEyNTY9OEpDY0Yya0tBRjJjRm5WNzdvVy0zRHNISmlmcjlqRjJXdUNoenp3Z2N3ZywxNjQ3NA0KcGlwL2Rvd25sb2FkLnB5LHNoYTI1Nj1fVkphTkdzZGF3T05kOXNoYXNsN014TnpUbzhnMEVBQ24yZ2E2R1JqTTVvLDMyMTUzDQpwaXAvZXhjZXB0aW9ucy5weSxzaGEyNTY9QnZxSC1KdzN0UDJiLTJJSjJranJRZW1PQVBNcUtyUU1MUklaSFpRcEpYayw4MTIxDQpwaXAvaW5kZXgucHksc2hhMjU2PUw2VWh0QUVaYzJxdzdCcWZRcmtQUWN3MmdDZ0V3M0d1a0xSU0E5NUJOeUksMzk5NTANCnBpcC9sb2NhdGlvbnMucHksc2hhMjU2PTlySlJsZ29uQzZRQzJ6R0RJbl83bVhhb1o5X3RGX0lITTJCUWhXVlJnYm8sNTYyNg0KcGlwL3BlcDQyNXRhZ3MucHksc2hhMjU2PXEza2VjNGY2TkhzenVHWUloR0liVnZzODk2RDA2dUpBbktGZ0pfd2NlNDQsMTA5ODANCnBpcC9zdGF0dXNfY29kZXMucHksc2hhMjU2PUY2dURHNkdqN1JOS1FKVURuZDg3UUtxSTE2VXMtdC1CMHdQRl80UU1wV2MsMTU2DQpwaXAvd2hlZWwucHksc2hhMjU2PVFTV21HczJ1aS1uNFVNV20wSlVZNmFNQ2N3Tkt1bmdWemJXc3hJOUtsSlEsMzIwMTANCnBpcC9fdmVuZG9yL19faW5pdF9fLnB5LHNoYTI1Nj1XYWFTSjNyb1NTSl9VdjR5S0F4bEdvaEtFSDlZVUEzYUloMVhnMklqZmdVLDQ2NzANCnBpcC9fdmVuZG9yL2FwcGRpcnMucHksc2hhMjU2PS05VU9JWnk2MmFoQ1FWWTktYjdObjZfNV80WTZvb0hudjcydE04aUhpOVksMjIzNjgNCnBpcC9fdmVuZG9yL2Rpc3Ryby5weSxzaGEyNTY9QTREb3V3OXBjcWRZeERUcDViLU9SMDJmeFZYbmZXcy13QzF3QTg5cmhSaywzODM0OQ0KcGlwL192ZW5kb3IvaXBhZGRyZXNzLnB5LHNoYTI1Nj13aW1icWNFN3J3d0VUbHVjbjhBXzRRZF8tTktYUE9CY054SkhhclVvWG5nLDgwMTc2DQpwaXAvX3ZlbmRvci9vcmRlcmVkZGljdC5weSxzaGEyNTY9NEtzRnVjNlY4SWdIUk9DSFV1LTR2Q3JyMjFaUFBlYTdaMGN2WDlBalE3dyw0MDk0DQpwaXAvX3ZlbmRvci9weXBhcnNpbmcucHksc2hhMjU2PTd2QXVVVmJoNnR4VUtRUjJJeko4XzlES21ENXZ0bTVNRHNzV2tJMGthOG8sMjI0MTcxDQpwaXAvX3ZlbmRvci9yZS12ZW5kb3IucHksc2hhMjU2PVBjZFo0MGQwb2hNc2RKbUE0dDBBZUFXYlBYaTF0RnN2QXdBNUtFNUZHZVksNzczDQpwaXAvX3ZlbmRvci9yZXRyeWluZy5weSxzaGEyNTY9azNmZmxmNV9NbTBYY0lKWWhCN1RqMzRicUNDUGhVRGtZYngxTnZXMkZQRSw5OTcyDQpwaXAvX3ZlbmRvci9zaXgucHksc2hhMjU2PUE2aGRKWlZqSTN0X2dlZWJaOUJ6VXZ3UnJJWG8wbGZ3elFsTTJMY0t5YXMsMzAwOTgNCnBpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9fX2luaXRfXy5weSxzaGEyNTY9VVB5Rmx6MGRJanh1c3U1SVRpZzlVREZKZFNZNUxUd2lqaGxkbjBBZnl6VSwzMDINCnBpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9fY21kLnB5LHNoYTI1Nj1NUHhaZlpkMkxLRHpWcnM1NVgzd0ExcnNJMll1UDhldkxaU3dRajBkSWswLDEzMjANCnBpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9hZGFwdGVyLnB5LHNoYTI1Nj1SYUdZeVJBLVJBMUowQW5FNjdHekVZRlBCdTRZSDRFUVV2UXFUS2E1N2lNLDQ2MDgNCnBpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9jYWNoZS5weSxzaGEyNTY9eHRsLVYtcHI5S1N0OVZ2RkRSQ0I5eXJIUEV2cXZiay01TTF2QUluWmI1ayw3OTANCnBpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9jb21wYXQucHksc2hhMjU2PTJNVE95STFKbEdfZ0pwZnV5My1VUVFsS01SaUppbVItWFhCMHNyNDR3ajAsMzgwDQpwaXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvY29udHJvbGxlci5weSxzaGEyNTY9ZWxEc0xjYVlBMTVuY29kUm1IbldRcDZla1Vfb2NFR3REZUdMYnNuVGp6bywxMzAyNA0KcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL2ZpbGV3cmFwcGVyLnB5LHNoYTI1Nj1fSzhjU3RtWHFEMzNtMTVQZnNROHJscG82RmZYalZiS21qdkxYeUlDUmdJLDI1MzENCnBpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9oZXVyaXN0aWNzLnB5LHNoYTI1Nj1XdEpyVnN5V2pwUDlXb1VpRFZkVFpaUk5CQ3o1WlZwdGFRcFlucW9mRFFVLDQxNDENCnBpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9zZXJpYWxpemUucHksc2hhMjU2PVhNNmVsRzlEU05leHdhT0NnTWpVdGZySEhXNU5BQjZUU2JJZjN4MjM1eHMsNjUzNg0KcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL3dyYXBwZXIucHksc2hhMjU2PUtxeXVfM1RXXzU0WER1ZGhhNC1IRjIxdnlFT0FKNFpuUlhGeXNUaUxtWEEsNDk4DQpwaXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvY2FjaGVzL19faW5pdF9fLnB5LHNoYTI1Nj11V25VdHlNdkhZX0xVTGFMXzRfSVIxRl94UGdLNXpIZkp5Um5CcTREblBFLDM2OQ0KcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL2NhY2hlcy9maWxlX2NhY2hlLnB5LHNoYTI1Nj1Gc0R1ZzNid1VBUTNva2pqZkd6eGxEYUJmMmZ3VlNuMWlCS01UTDZTeUdVLDM1MzINCnBpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9jYWNoZXMvcmVkaXNfY2FjaGUucHksc2hhMjU2PVh5d3F4a1M5TWtDYWZsVE9ZX3dqckUwMm5lS2R5d0I5WXdsT0JiUDdZd2MsOTczDQpwaXAvX3ZlbmRvci9jZXJ0aWZpL19faW5pdF9fLnB5LHNoYTI1Nj1RU1J5MVV6dEUtaTA5SXVHSUtLdWMxOTBrMDdsdDZrdGFiYmVsUE1JWm9jLDYzDQpwaXAvX3ZlbmRvci9jZXJ0aWZpL19fbWFpbl9fLnB5LHNoYTI1Nj1GaU9ZdDFGbHRzdDd3azlEUmE2R0NvQnI4cUJVeGxOUXVfTUtKZjA0RTZzLDQxDQpwaXAvX3ZlbmRvci9jZXJ0aWZpL2NhY2VydC5wZW0sc2hhMjU2PTdDRVhmTEh4RHd2RHB3VnUweV8ybGZKWWs2M2NVLUtVS0lfREwxTHE4VW8sMjcxMDg4DQpwaXAvX3ZlbmRvci9jZXJ0aWZpL2NvcmUucHksc2hhMjU2PXhQUURkR19zaXk1QTdCZnFHV2E3UkpoY0E2MXhYRXFQaVNydzlHTnloSEUsODM2DQpwaXAvX3ZlbmRvci9jaGFyZGV0L19faW5pdF9fLnB5LHNoYTI1Nj1Zc1A1d1Fsc0hKMmF1RjFSWkpmeXBpU3JDQTdfYlFpUm0zRVNfTkk3Ni1ZLDE1NTkNCnBpcC9fdmVuZG9yL2NoYXJkZXQvYmlnNWZyZXEucHksc2hhMjU2PURfeks1R3l6b1ZzUmVzMEhrTEp6aWx0RlFYMGJLQ0xPckZlOV94RHZPXzgsMzEyNTQNCnBpcC9fdmVuZG9yL2NoYXJkZXQvYmlnNXByb2Jlci5weSxzaGEyNTY9a0J4SGJkZXRCcFBlN3hybGItZTk5MGlvdDY0Z19lR1NMZDMybEI3X2gzTSwxNzU3DQpwaXAvX3ZlbmRvci9jaGFyZGV0L2NoYXJkaXN0cmlidXRpb24ucHksc2hhMjU2PTN3b1dTNjJLckdvb0t5cXo0elFTbmpGYkpwYTZWN2cwMmRhQWliVHdjbDgsOTQxMQ0KcGlwL192ZW5kb3IvY2hhcmRldC9jaGFyc2V0Z3JvdXBwcm9iZXIucHksc2hhMjU2PTZiRHU4WUlpUnVTY1g0Y2E5SWdiMFU2OVRBMlBHWFhEZWo2Q2M0XzlrTzQsMzc4Nw0KcGlwL192ZW5kb3IvY2hhcmRldC9jaGFyc2V0cHJvYmVyLnB5LHNoYTI1Nj1LU213SkVyanlweWowYlJabUM1RjVlTTdjOFlRZ0xZSWpaWGludFpOc3RnLDUxMTANCnBpcC9fdmVuZG9yL2NoYXJkZXQvY29kaW5nc3RhdGVtYWNoaW5lLnB5LHNoYTI1Nj1WWXBfNmN5eWtpNXNIZ1hEU1puWFc0cTFvZWxIYzNjdTlBeVFUWDd1dWc4LDM1OTANCnBpcC9fdmVuZG9yL2NoYXJkZXQvY29tcGF0LnB5LHNoYTI1Nj1QS1R6SGtTYnRiSERxUzlQeXVqTWJYNzRxMWE4bU1wZVFURFZzUWhaTVJ3LDExMzQNCnBpcC9fdmVuZG9yL2NoYXJkZXQvY3A5NDlwcm9iZXIucHksc2hhMjU2PVRaNDM0UVg4enpCc25VdkxfOHdtNEFRVlRaMlprcUVFUUxfbE53OWY5b3csMTg1NQ0KcGlwL192ZW5kb3IvY2hhcmRldC9lbnVtcy5weSxzaGEyNTY9QWltd2RiOWFzMWRKS1phRk5VSDJPaFdJVkJWZDZaa0pKX1dLNXNOWThjVSwxNjYxDQpwaXAvX3ZlbmRvci9jaGFyZGV0L2VzY3Byb2Jlci5weSxzaGEyNTY9a2t5cVZnMVl3M0RJT0FNSjJiZGx5UWdVRlFodUhBVzhkVUdza1RvTldTYywzOTUwDQpwaXAvX3ZlbmRvci9jaGFyZGV0L2VzY3NtLnB5LHNoYTI1Nj1SdVhsZ052VElEYXJuZHZsbE5DazVXWkJJcGRDeFEwa2NkOUVBdXhVaDg0LDEwNTEwDQpwaXAvX3ZlbmRvci9jaGFyZGV0L2V1Y2pwcHJvYmVyLnB5LHNoYTI1Nj1pRDhKZHAwSVNSamdqaVZON2YwZTh4R2VRSjVHTTJvZVoxZEE4bmJTZVV3LDM3NDkNCnBpcC9fdmVuZG9yL2NoYXJkZXQvZXVja3JmcmVxLnB5LHNoYTI1Nj0tN0dkbXZnV2V6NC1lTzRTdVhwYTd0QmlEaTV2UlhROFd2ZEZBelZhU2ZvLDEzNTQ2DQpwaXAvX3ZlbmRvci9jaGFyZGV0L2V1Y2tycHJvYmVyLnB5LHNoYTI1Nj1NcUZNVFFYeFc0SGJ6SXBaOWxLREhCM0dOOFNQNHlpSGVuVG1mOGdfUHhZLDE3NDgNCnBpcC9fdmVuZG9yL2NoYXJkZXQvZXVjdHdmcmVxLnB5LHNoYTI1Nj1ObzFXeWR1Rk9nQjVWSVRVQTdQTHlDNW9KUk56UnlNYkJ4YUtJMWwxNk1BLDMxNjIxDQpwaXAvX3ZlbmRvci9jaGFyZGV0L2V1Y3R3cHJvYmVyLnB5LHNoYTI1Nj0xM3A2RVA0eVJheHFuUDRpSHR4SE9KNlIyenhIcTFfbThoVFJqelZaOTVjLDE3NDcNCnBpcC9fdmVuZG9yL2NoYXJkZXQvZ2IyMzEyZnJlcS5weSxzaGEyNTY9Slg4bHN3ZUtMbW5Dd21rOFVIRVFzTGdrcl9yUF9rRWJ2aXZDNHFQT3JsYywyMDcxNQ0KcGlwL192ZW5kb3IvY2hhcmRldC9nYjIzMTJwcm9iZXIucHksc2hhMjU2PWdHdklXaTlXaERqRS14UVhIdk5JeXJuTHZFYk1BWWd5VVNaNjVIVWZ5bHcsMTc1NA0KcGlwL192ZW5kb3IvY2hhcmRldC9oZWJyZXdwcm9iZXIucHksc2hhMjU2PWMzU1otSzdodnl6R1k2SlJBWnhKZ3dKX3NVUzlrMFdZa3ZNWTAwWUJZRm8sMTM4MzgNCnBpcC9fdmVuZG9yL2NoYXJkZXQvamlzZnJlcS5weSxzaGEyNTY9dnBtSnYyQnUwSjhnbk1WUlBITUZlZlRSdm9faGExbXJ5TGlnOENCd2dPZywyNTc3Nw0KcGlwL192ZW5kb3IvY2hhcmRldC9qcGNudHgucHksc2hhMjU2PVBZbE5xUlVRVDhMTTNjVDVGbUhHUDBpaXNjRmxUV0VEOTJNQUx2QnVuZ28sMTk2NDMNCnBpcC9fdmVuZG9yL2NoYXJkZXQvbGFuZ2J1bGdhcmlhbm1vZGVsLnB5LHNoYTI1Nj0xSHFRUzlQYnRuajF4UWd4aXRKTXZ3OFg2a0tyNU9vY2tOQ1pXZkVRclBFLDEyODM5DQpwaXAvX3ZlbmRvci9jaGFyZGV0L2xhbmdjeXJpbGxpY21vZGVsLnB5LHNoYTI1Nj1MT0RhanZzZXRIODd5WUREUUtBMkNVTFhVSDg3dEkyMjNkaGZqaDlaeDljLDE3OTQ4DQpwaXAvX3ZlbmRvci9jaGFyZGV0L2xhbmdncmVla21vZGVsLnB5LHNoYTI1Nj04WUFXN2JVOFl3U0phcDBrSUpTYlBNdzFCRXF6R2pXenFjcWYwV2dVS0FBLDEyNjg4DQpwaXAvX3ZlbmRvci9jaGFyZGV0L2xhbmdoZWJyZXdtb2RlbC5weSxzaGEyNTY9SlNucW1FNUU2MnRETFRQVHZMcFFzZzVnT01PNFBiZFdSdlY3QXZrYzBIQSwxMTM0NQ0KcGlwL192ZW5kb3IvY2hhcmRldC9sYW5naHVuZ2FyaWFubW9kZWwucHksc2hhMjU2PVJoYXBZU0c1bDBaYU8tVlY0RmFuNXNXMFdSR1FxaHdCTTYxeXgzeXh5T0EsMTI1OTINCnBpcC9fdmVuZG9yL2NoYXJkZXQvbGFuZ3RoYWltb2RlbC5weSxzaGEyNTY9OGwwMTczR3VfVzZHOG14bVFPVEVGNGxzMllkRTdGeFdmM1FrU3hFR1hKUSwxMTI5MA0KcGlwL192ZW5kb3IvY2hhcmRldC9sYW5ndHVya2lzaG1vZGVsLnB5LHNoYTI1Nj1XMjJlUk5Kc3FJNnVXQWZ3WFNLVldXbkNlcllxckk4ZFpRVG1fTTBsUkZrLDExMTAyDQpwaXAvX3ZlbmRvci9jaGFyZGV0L2xhdGluMXByb2Jlci5weSxzaGEyNTY9UzJJb09SaEZrMzlGRUZPbFNGV3RnVnliUmlQNmg3QmxMbGRIVmNsTmtVOCw1MzcwDQpwaXAvX3ZlbmRvci9jaGFyZGV0L21iY2hhcnNldHByb2Jlci5weSxzaGEyNTY9QVI5NWVGSDl2dXFTZnZMUVpOLUw1aWplYTI1Tk9CQ29YcXc4czVPOXhMUSwzNDEzDQpwaXAvX3ZlbmRvci9jaGFyZGV0L21iY3Nncm91cHByb2Jlci5weSxzaGEyNTY9aDZUUm5uWXEyT3hHMVdkRDVKT3l4Y2RWcG43ZEcwcS12QjhuV3I1bWJoNCwyMDEyDQpwaXAvX3ZlbmRvci9jaGFyZGV0L21iY3NzbS5weSxzaGEyNTY9U1kzMndWSUYzSHpjalkzQmFFc3B5OW1ldGJOU0t4SUlCMFJLUG43dGpwSSwyNTQ4MQ0KcGlwL192ZW5kb3IvY2hhcmRldC9zYmNoYXJzZXRwcm9iZXIucHksc2hhMjU2PUxEU3BDbGREQ0ZsWXdVa0drd0Qyb0Z4TGxQV0lXWFQwOWFrSF8yUGlZNzQsNTY1Nw0KcGlwL192ZW5kb3IvY2hhcmRldC9zYmNzZ3JvdXBwcm9iZXIucHksc2hhMjU2PTFJcHJjQ0JfazFxZm1ueEdDNk1CYnhFTGxLcUQzc2NXNlM4WUl3ZGV5WEEsMzU0Ng0KcGlwL192ZW5kb3IvY2hhcmRldC9zamlzcHJvYmVyLnB5LHNoYTI1Nj1JSXQtbFpqMFdKcUs0cm1VWnpLWlA0R0psRThLVUV0RllWdVk5NmVrNU1RLDM3NzQNCnBpcC9fdmVuZG9yL2NoYXJkZXQvdW5pdmVyc2FsZGV0ZWN0b3IucHksc2hhMjU2PXFMMDE3NGxTWkU0NDJlQjIxbm5rdFQ5X1ZjQXllMDdsYUZXVWVVcmp0dFksMTI0ODUNCnBpcC9fdmVuZG9yL2NoYXJkZXQvdXRmOHByb2Jlci5weSxzaGEyNTY9SWREOHYzeldPc0I4T0xpeVBpLXlfZnF3aXBSRnhWOU5jMWVLQkxTdUlFdywyNzY2DQpwaXAvX3ZlbmRvci9jaGFyZGV0L3ZlcnNpb24ucHksc2hhMjU2PXNwM0IwOG1yRFhCLXBmM0s5ZnFKX3plREhPQ0xDOFJybmdReURGYXBfN2csMjQyDQpwaXAvX3ZlbmRvci9jaGFyZGV0L2NsaS9fX2luaXRfXy5weSxzaGEyNTY9QWJwSEdjZ0xiLWtSc0pHbndGRWt0azd1enBaT0NjQlk3NC1ZQmRyS1ZHcywxDQpwaXAvX3ZlbmRvci9jaGFyZGV0L2NsaS9jaGFyZGV0ZWN0LnB5LHNoYTI1Nj1ZQk84TDRtWG8wV1I2Xy1GamhfOFF4UEJvRUJOcUI5b054TnJkYzU0QVFzLDI3MzgNCnBpcC9fdmVuZG9yL2NvbG9yYW1hL19faW5pdF9fLnB5LHNoYTI1Nj05eEJ5clR2azl1cGtMNU5HVjVJdDJFamU0LWt6Tkx3YV8xbEdQV3BYb05VLDI0MA0KcGlwL192ZW5kb3IvY29sb3JhbWEvYW5zaS5weSxzaGEyNTY9RmkwdW4tUUxxUm0tdjdvX25LaU9xeUM4UGFwQkpLN0RMVl9xOUxLdFRPMCwyNTI0DQpwaXAvX3ZlbmRvci9jb2xvcmFtYS9hbnNpdG93aW4zMi5weSxzaGEyNTY9Z0paQjM1TGJkamF0eWtkMnpyVVVub2tNemt2Y0Znc2N5bl90Tnh4TUZIQSw5NjY4DQpwaXAvX3ZlbmRvci9jb2xvcmFtYS9pbml0aWFsaXNlLnB5LHNoYTI1Nj1jSHFWSnRiODJPRzdIVUN4dlEyam9HN05fQ294YklLYklfZmdyeVprajIwLDE5MTcNCnBpcC9fdmVuZG9yL2NvbG9yYW1hL3dpbjMyLnB5LHNoYTI1Nj1fU0NFb1RLX0dBMnRVMW5oYmF5S0thYy12OUpuOThsQ1BJRk9lRk1HQ0hRLDUzNjUNCnBpcC9fdmVuZG9yL2NvbG9yYW1hL3dpbnRlcm0ucHksc2hhMjU2PVY3VTdvandHMXE0bjZQS3JpcGpFdldfaHRZUWk1dWVYU00zTFVVb3FxRFksNjI5MA0KcGlwL192ZW5kb3IvZGlzdGxpYi9fX2luaXRfXy5weSxzaGEyNTY9LWFVZU5OQ2ZpSUdfMVRxZjE5QkgweExOdUJLR1gxSTdsTmhjTFlnRlVFQSw1ODENCnBpcC9fdmVuZG9yL2Rpc3RsaWIvY29tcGF0LnB5LHNoYTI1Nj1GektsUDlkTlVNSC1qXzFMQ1Zuamd4NktnVWJwblJqVGpZa1RrRFlSUGxJLDQwODAxDQpwaXAvX3ZlbmRvci9kaXN0bGliL2RhdGFiYXNlLnB5LHNoYTI1Nj1qbmlKbVlrME1qMnQ2Z1pZYm5uNjhUdlF3blZaMGtYeWV1Zl8zQXhGY2xrLDQ5NjcyDQpwaXAvX3ZlbmRvci9kaXN0bGliL2luZGV4LnB5LHNoYTI1Nj1DdzhneEZxXzd4WHZkZ0V4TDNlZmpMQVkzRUFQRE1TTDNWQTQyUmtiUUJzLDIxMDg1DQpwaXAvX3ZlbmRvci9kaXN0bGliL2xvY2F0b3JzLnB5LHNoYTI1Nj1oRF9IbTNhU0w5RGtsWTlDeHljdDJuXzc0Z1oweE5GRkdCNUw3TTZkczE0LDUxMDEzDQpwaXAvX3ZlbmRvci9kaXN0bGliL21hbmlmZXN0LnB5LHNoYTI1Nj0zcUV1WmhIbERidnlZWjFCWmJkYXBEQWl2Z01nVXdXcFowMGNtWHFjbjE4LDE0ODEwDQpwaXAvX3ZlbmRvci9kaXN0bGliL21hcmtlcnMucHksc2hhMjU2PWlSclZXd3B5Vndqa0tKU1g4TkVROTJfTVJNd3BST2NmTkdLQ0QtQ2gxUU0sNjI4Mg0KcGlwL192ZW5kb3IvZGlzdGxpYi9tZXRhZGF0YS5weSxzaGEyNTY9aFVzZjdRaDJBZTRDQ2tMMzNxSzhwcHdDOFpUelQ3ZXA2SGo5UktwaWpLVSwzODgzMw0KcGlwL192ZW5kb3IvZGlzdGxpYi9yZXNvdXJjZXMucHksc2hhMjU2PVZGQlZiRnFMVnFEQlNRRFhjRlFIclgxS0VjdW9EeFRLNjk5WWRpX2JleWMsMTA3NjYNCnBpcC9fdmVuZG9yL2Rpc3RsaWIvc2NyaXB0cy5weSxzaGEyNTY9eHBlaE5mSVNHUFROeFFadTAySzlSdzJRYk54XzJRNGVtZVB2M1c1WDBpdywxNTIyNA0KcGlwL192ZW5kb3IvZGlzdGxpYi90MzIuZXhlLHNoYTI1Nj1jcDBVQVVERHIxdEdBeDhhZGxLeFdiQ0hJYS1vQjNieGV2NXpZemdBcjhFLDg5MDg4DQpwaXAvX3ZlbmRvci9kaXN0bGliL3Q2NC5leGUsc2hhMjU2PUZpbGpEUGNYOXF2b2U5RllFXzlwTkVIcWJxTW5oY0NPdUlfb0xKNEY5RjgsOTc3OTINCnBpcC9fdmVuZG9yL2Rpc3RsaWIvdXRpbC5weSxzaGEyNTY9RTJ3VS1SWlNoUE1GVU1KcjlrUG1lbVRVTGluTTRxRHpvc05QaWhDdUtFMCw1Mjk5MQ0KcGlwL192ZW5kb3IvZGlzdGxpYi92ZXJzaW9uLnB5LHNoYTI1Nj1DZ2doT1V5bHhHRDdkRUEyUzNNdldqeDdtWV8yYldzbHVGME9mM1l4bDRZLDIzNzExDQpwaXAvX3ZlbmRvci9kaXN0bGliL3czMi5leGUsc2hhMjU2PUxJdHJCSmVzRXF0MlFUUXVCLXloYTJZYk1lZ1VSSG1IbWRTeGhqQnFtbmMsODU1MDQNCnBpcC9fdmVuZG9yL2Rpc3RsaWIvdzY0LmV4ZSxzaGEyNTY9bl9QaW9CQzdsdHo3c0FrMVdMYkx6WkpnUzRSMmF4U3lfMEhQZjhaQ3NFZyw5NDIwOA0KcGlwL192ZW5kb3IvZGlzdGxpYi93aGVlbC5weSxzaGEyNTY9VVA1M2NLeE9NNXI3YkhTUy1uNXByRjZod0pFVnNNVzlaTkp1dE91QzI2YywzOTExNQ0KcGlwL192ZW5kb3IvZGlzdGxpYi9fYmFja3BvcnQvX19pbml0X18ucHksc2hhMjU2PWJxU19kVE9INnVXOWlHZ2QwdXpmcFBqbzZ2WjR4cFBaN2t5ZlpKMnZOYXcsMjc0DQpwaXAvX3ZlbmRvci9kaXN0bGliL19iYWNrcG9ydC9taXNjLnB5LHNoYTI1Nj1LV2VjSU5kYkZOT3hTT1AxZkdGNjgwQ0puYUM2UzRmQlJnRXRhWVR3MGlnLDk3MQ0KcGlwL192ZW5kb3IvZGlzdGxpYi9fYmFja3BvcnQvc2h1dGlsLnB5LHNoYTI1Nj1WVzF0M3VZcVVqV1pIN2pWLTZRaWltTGhubGRvVjV1SXBINEV1aVQxamZ3LDI1NjQ3DQpwaXAvX3ZlbmRvci9kaXN0bGliL19iYWNrcG9ydC9zeXNjb25maWcuY2ZnLHNoYTI1Nj1zd1pLeHE5Ulk1ZTlyM1BYQ3JsdlFQTXN2T2RpV1pCVEhMRWJxUzhMSkxVLDI2MTcNCnBpcC9fdmVuZG9yL2Rpc3RsaWIvX2JhY2twb3J0L3N5c2NvbmZpZy5weSxzaGEyNTY9ZVNFeUpnN2p4Rl9lSGxIRzhJT3RsOTNrYjA3VW9NSVJwMXdZc1BlR2k5aywyNjk1NQ0KcGlwL192ZW5kb3IvZGlzdGxpYi9fYmFja3BvcnQvdGFyZmlsZS5weSxzaGEyNTY9SWhwN3JYUmNqYklLdzhDT205d1NlUFY5QVJHWGJTRjlnR1hBTW4yUS1LVSw5MjYyOA0KcGlwL192ZW5kb3IvaHRtbDVsaWIvX19pbml0X18ucHksc2hhMjU2PUpzSXdtRmxkay05cmFCYWRQU1RTNzRKcmZtSnZvemMtM2Fla01pN0hyOXMsNzgwDQpwaXAvX3ZlbmRvci9odG1sNWxpYi9faWhhdGV4bWwucHksc2hhMjU2PXR6WHlnWW1pc1VtaUVVdDJ2N0UxQWI1MEFLUXNyRC1TZ2xQUm5ZNzV2TUUsMTY3MDUNCnBpcC9fdmVuZG9yL2h0bWw1bGliL19pbnB1dHN0cmVhbS5weSxzaGEyNTY9QzRsWDVnVUJ3ZWJPV3k0MWhZUDJaQnBrUFZOdnhrX2haQm0zT1Z5UFpNNCwzMjUzMg0KcGlwL192ZW5kb3IvaHRtbDVsaWIvX3Rva2VuaXplci5weSxzaGEyNTY9WUFhT0VCRDZxYzVJU3E5WHQ5TmlmMU9GZ2N5YlRUZk1kd3FCa1pocEFxNCw3NjU4MA0KcGlwL192ZW5kb3IvaHRtbDVsaWIvX3V0aWxzLnB5LHNoYTI1Nj1iUzZUSFZsTDhaeVRjSTZDSXhpTTZ4eHVIc0U4aTFqNU9nZDNIYTFHODRVLDQwOTYNCnBpcC9fdmVuZG9yL2h0bWw1bGliL2NvbnN0YW50cy5weSxzaGEyNTY9RGZjMUZ2M185ZnJrdGdXamc0dGJqLUNqTU1wMDJLbzlxTWU0aWwxQlZkbyw4MzM4Nw0KcGlwL192ZW5kb3IvaHRtbDVsaWIvaHRtbDVwYXJzZXIucHksc2hhMjU2PURtbHU5aGxxNXdfaWQ2bUJaeVlfc0U1THVrSUFDZ3ZHNGtwZ0lzZGVkOFEsMTE3MTcwDQpwaXAvX3ZlbmRvci9odG1sNWxpYi9zZXJpYWxpemVyLnB5LHNoYTI1Nj1VcnJzYTBjUFBMcU5YLVViSldTMmdVaHNfMDZxVmJOeFp2VW5ybUdaSzZFLDE0MTc3DQpwaXAvX3ZlbmRvci9odG1sNWxpYi9fdHJpZS9fX2luaXRfXy5weSxzaGEyNTY9OFZSMWJjZ0QyT3BlUzJYRXhwdTV5QmhQX1ExSy1sd0tiQktJQ0JQZjFrVSwyODkNCnBpcC9fdmVuZG9yL2h0bWw1bGliL190cmllL19iYXNlLnB5LHNoYTI1Nj02UF9BY0lvR2p0d0IycUFsaFY4SDRWUC16dFF4b1hGR3d0NE55TXFHX0t3LDk3OQ0KcGlwL192ZW5kb3IvaHRtbDVsaWIvX3RyaWUvZGF0cmllLnB5LHNoYTI1Nj1FUXBxU2ZrWlJ1VGJFLUR1aFc3eE1kVkR4ZFpOWjBDZm1uWWZIQV8zenhNLDExNzgNCnBpcC9fdmVuZG9yL2h0bWw1bGliL190cmllL3B5LnB5LHNoYTI1Nj13WG1RTHJaUmY0TXlXTnlnMG0zaDgxbTlJbmhMUjdHSjAwMm1JSVpoLThvLDE3NzUNCnBpcC9fdmVuZG9yL2h0bWw1bGliL2ZpbHRlcnMvX19pbml0X18ucHksc2hhMjU2PTQ3REVRcGo4SEJTYS1fVEltVy01SkNldVFlUmttNU5NcEpXWkczaFN1RlUsMA0KcGlwL192ZW5kb3IvaHRtbDVsaWIvZmlsdGVycy9hbHBoYWJldGljYWxhdHRyaWJ1dGVzLnB5LHNoYTI1Nj1EWHYtUDJ2ZFE1RjNPVFdNNlFaNktoeURsQVdtOTBwYmZyRDFCazlEX2wwLDYyMQ0KcGlwL192ZW5kb3IvaHRtbDVsaWIvZmlsdGVycy9iYXNlLnB5LHNoYTI1Nj16LUlVOVpBWWpwc1ZzcW1WdDdrdVdDNjNqUjExaERNcjZDVnJ2dWFvOFcwLDI4Ng0KcGlwL192ZW5kb3IvaHRtbDVsaWIvZmlsdGVycy9pbmplY3RfbWV0YV9jaGFyc2V0LnB5LHNoYTI1Nj0yUV9Kbk1zY25fdE5iVl9xcGdZTl81TTNQbkJHZm11dkVDTUtERXhIVWNZLDI3NDINCnBpcC9fdmVuZG9yL2h0bWw1bGliL2ZpbHRlcnMvbGludC5weSxzaGEyNTY9cWY1Y0xyVDZ4WGQ4VjdHSDFSXzNsS3hJanVKU2ZwYldUcFN3YWdsWWREdywzMzY1DQpwaXAvX3ZlbmRvci9odG1sNWxpYi9maWx0ZXJzL29wdGlvbmFsdGFncy5weSxzaGEyNTY9RUhpZzRrTS1RaUxqdXhWSjNGQUFGTnktMTBrNGFWNkhKYlF6SEtaXzN1OCwxMDUzNA0KcGlwL192ZW5kb3IvaHRtbDVsaWIvZmlsdGVycy9zYW5pdGl6ZXIucHksc2hhMjU2PTdQcUpyaG02bW8zSnZhSGsySVFXN2k3NE9yN1F0ZC1GVjhVZnRKSXlEeXMsMjUxMTINCnBpcC9fdmVuZG9yL2h0bWw1bGliL2ZpbHRlcnMvd2hpdGVzcGFjZS5weSxzaGEyNTY9S1B0MDY3bllUcXFpOEtMVENseXlubjRlVnpORENfLU1BcFhOVkhSWFZYMCwxMTM5DQpwaXAvX3ZlbmRvci9odG1sNWxpYi90cmVlYWRhcHRlcnMvX19pbml0X18ucHksc2hhMjU2PWwzTGNxTVNFeW9oOTlKaF9lV2pHZXhIbkl2S2hMQVhvUC1MRHo4OHdodU0sMjA4DQpwaXAvX3ZlbmRvci9odG1sNWxpYi90cmVlYWRhcHRlcnMvZ2Vuc2hpLnB5LHNoYTI1Nj02Vkl1SEROb0V4djFKV3YzZVBqNlY1Q00tdGN5aVVTV2U1X0hkMmVqYndZLDE1NTUNCnBpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWVhZGFwdGVycy9zYXgucHksc2hhMjU2PTNvZjR2dmFVWUlBaWM3cG5nZWJ3SlYyNGhwT1M3Wmc5Z2dKYV9XUWVneTQsMTY2MQ0KcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZWJ1aWxkZXJzL19faW5pdF9fLnB5LHNoYTI1Nj1VbEI0b3JrVGdaaEZJS1FkWHJ0aVduOWNwS1NzdWhuT1FPSUhlRDBGdjRrLDM0MDYNCnBpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWVidWlsZGVycy9iYXNlLnB5LHNoYTI1Nj00dmRqbV9aMmZfR1RRQndLbldscnpWY2N0VGItSzVzZk44cFhEYVdPRGlBLDEzOTQyDQpwaXAvX3ZlbmRvci9odG1sNWxpYi90cmVlYnVpbGRlcnMvZG9tLnB5LHNoYTI1Nj1TWTNNc2lqWHl6ZE5QYzhhSzVJUXN1cEJvTThKNjd5NTZEZ050R3ZzYjlnLDg4MzUNCnBpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWVidWlsZGVycy9ldHJlZS5weSxzaGEyNTY9YXFJQk9Hal9kRllxQlVSSWNUZWdHTkJoQUlKT3c1aUZESGI0anJrWUgtOCwxMjc2NA0KcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZWJ1aWxkZXJzL2V0cmVlX2x4bWwucHksc2hhMjU2PUNFZ3dITUlRWnZJREZBcWN0NGtxUGtWdHlLSW05ZWZIRnFfVmVFeEVQQ0EsMTQxNjENCnBpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWV3YWxrZXJzL19faW5pdF9fLnB5LHNoYTI1Nj1DRnBVT0NmTHVoQWdWSjhOWWs5d3ZpQ3Uxa2hZbnY3WFJTdHZ5elUxRndzLDU1NDQNCnBpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWV3YWxrZXJzL2Jhc2UucHksc2hhMjU2PWVpLTJjRmJORmQwZ1JqeWFGbXhueFpHTE5JRDRvMGJIRkNIOWJNeVo1QmssNDkzOQ0KcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZXdhbGtlcnMvZG9tLnB5LHNoYTI1Nj1FSHlGUjhEOGxZTm55RFU5bHhfSUtpZ1ZKUnllY1VHdWEwbU9pN0hCdWtjLDE0MTMNCnBpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWV3YWxrZXJzL2V0cmVlLnB5LHNoYTI1Nj04alZMRVkyRmpnTjRSRnVnd2hBaDQ0bDlTY1ZZb0RTdFFGQ25sUHd2YWZJLDQ2ODQNCnBpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWV3YWxrZXJzL2V0cmVlX2x4bWwucHksc2hhMjU2PXNZNndmUnNoV1RsbHU2bjQ4VFBXcEtzUVJQcC0wQ1FyVDBoal9BZHpIU1UsNjMwOQ0KcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZXdhbGtlcnMvZ2Vuc2hpLnB5LHNoYTI1Nj00RDJQRUNaNW4zWk4zcXUzak1sOXlZN0I4MWpuUUFwQlFTVmxmYUl1WWJBLDIzMDkNCnBpcC9fdmVuZG9yL2lkbmEvX19pbml0X18ucHksc2hhMjU2PTlOdDd4cHlldDNEbU9yUFVHb29EZEF3bUhaWnUxcVVBeTJFYUo5M2tHaVEsNTgNCnBpcC9fdmVuZG9yL2lkbmEvY29kZWMucHksc2hhMjU2PWx2WWI3eXU3UGhBcUZhQUlBZFdjd2dhV0kyVW1nc2VVdWEtMWMwQXNHMEEsMzI5OQ0KcGlwL192ZW5kb3IvaWRuYS9jb21wYXQucHksc2hhMjU2PVItaDI5RC02bXJuSnpiWHh5bXJXVVc3aVpVdnktMjZUUXdaMGlqNTdpNFUsMjMyDQpwaXAvX3ZlbmRvci9pZG5hL2NvcmUucHksc2hhMjU2PUdhZmlXZFlRSUs1VFNqV2RSekNZQ2hvNzA0QUx0TUNyVl9kblhYbjU3VTAsMTEzOTANCnBpcC9fdmVuZG9yL2lkbmEvaWRuYWRhdGEucHksc2hhMjU2PS1DZzgzbHVyS29BOXA3bGIwbE1Bc29zMHJGejFkbktyR2VCRTNvOFV1Q0EsMzI5OTkNCnBpcC9fdmVuZG9yL2lkbmEvaW50cmFuZ2VzLnB5LHNoYTI1Nj1UWTFscHhaSVFXRVA2dE5xalprRkE1aGdvTVdPajFPQm1uVUc4aWhUODdFLDE3NDkNCnBpcC9fdmVuZG9yL2lkbmEvcGFja2FnZV9kYXRhLnB5LHNoYTI1Nj1LTVNVVFNfTTdaWjdVZ2xfVl9FT3hWLUQzbzd2N3lWa3Q0NUpLX2JwVzI0LDIxDQpwaXAvX3ZlbmRvci9pZG5hL3V0czQ2ZGF0YS5weSxzaGEyNTY9WXlsUVlCZmxqQXhfV1ZxUjJEN0hnY0dHeVZDV3dQbTZ1RjM4YUVSdWh5dywxODQ5NDQNCnBpcC9fdmVuZG9yL2xvY2tmaWxlL19faW5pdF9fLnB5LHNoYTI1Nj1UcXB6OTBEd0tZZmhQc2Z6Vk9KbDg0VEw4N3BkRkU1ZVBOSGRYQXhzNFRrLDkzNzENCnBpcC9fdmVuZG9yL2xvY2tmaWxlL2xpbmtsb2NrZmlsZS5weSxzaGEyNTY9QzdPSDNINEdkSzY4dTRGUWdwOGZrUDJrTzRmeVVUU3lqM1g2YmxnZm9iYywyNjUyDQpwaXAvX3ZlbmRvci9sb2NrZmlsZS9ta2RpcmxvY2tmaWxlLnB5LHNoYTI1Nj1lM3FnSUwtZXRaTUxzUy0zZnQxOWlXXzhJUTM2MEhOa0dPcUUzeUJLc1V3LDMwOTYNCnBpcC9fdmVuZG9yL2xvY2tmaWxlL3BpZGxvY2tmaWxlLnB5LHNoYTI1Nj11a0g5dWs2TkZ1eHlWbUc1UWlXdzRpS3EzZlQ3TWpxVWd1WDk1YXZZUElZLDYwOTANCnBpcC9fdmVuZG9yL2xvY2tmaWxlL3NxbGl0ZWxvY2tmaWxlLnB5LHNoYTI1Nj1vMlRNa01SWTBpd24taUwxWE1SUklGU3RNVWtTNGkzYWpjZWVZTm50S0ZnLDU1MDYNCnBpcC9fdmVuZG9yL2xvY2tmaWxlL3N5bWxpbmtsb2NrZmlsZS5weSxzaGEyNTY9QUJ3WFhtdlRIdkNsNXZpUGJsU2hMM1BHLWdHc0xpVDFyb0FNZkRSd2hpOCwyNjE2DQpwaXAvX3ZlbmRvci9wYWNrYWdpbmcvX19hYm91dF9fLnB5LHNoYTI1Nj16a2NDUFROXzZUY0xXME5ybGcwMTc2LVIxUVFfV1ZQVG04c3oxUjQtSGpNLDcyMA0KcGlwL192ZW5kb3IvcGFja2FnaW5nL19faW5pdF9fLnB5LHNoYTI1Nj1fdk5hYzVUcnp3c3J6Yk9GSWJGLTVjSHFjX1kyYVBUMkQ3enJJUjA2Qk9vLDUxMw0KcGlwL192ZW5kb3IvcGFja2FnaW5nL19jb21wYXQucHksc2hhMjU2PVZpX0EwckFRZUhiVS1hOVgwdHQxeVFtOVJxa2dRYkRTeHpSdzhXbFU5a0EsODYwDQpwaXAvX3ZlbmRvci9wYWNrYWdpbmcvX3N0cnVjdHVyZXMucHksc2hhMjU2PVJJbUVDSjRjX3dUbGFUWVl3WllMSEVpZWJETWFBSm1LMW9QQVJodzFUNW8sMTQxNg0KcGlwL192ZW5kb3IvcGFja2FnaW5nL21hcmtlcnMucHksc2hhMjU2PW10ZzJucGhKRTFvUU8zOWcxRGdzZFBzTU8tZ3VCQkNscFItQUVZRnJiTWcsODIzMA0KcGlwL192ZW5kb3IvcGFja2FnaW5nL3JlcXVpcmVtZW50cy5weSxzaGEyNTY9U0Q3ZFZKR2pkUFVxdG9IYjQ3cXdLNndXSlRRZC1aWFdqeHBKZzgzVWNCQSw0MzI3DQpwaXAvX3ZlbmRvci9wYWNrYWdpbmcvc3BlY2lmaWVycy5weSxzaGEyNTY9U0FNUmVyek8zZksySWtGWkNhWmt1d1phTF9FR3FITk96NHBuaTR2aG5OMCwyODAyNQ0KcGlwL192ZW5kb3IvcGFja2FnaW5nL3V0aWxzLnB5LHNoYTI1Nj0zbTZXdlBtNk5OeEU4cmtUR21uMHI3NUJfR1pTR2c3aWthZnhIc0JOMVdBLDQyMQ0KcGlwL192ZW5kb3IvcGFja2FnaW5nL3ZlcnNpb24ucHksc2hhMjU2PU93R254WWZyMmdoTnpZeDU5cVdJQmtySzNTbkI2bi1aZmQxWGFMcG5uTTAsMTE1NTYNCnBpcC9fdmVuZG9yL3BrZ19yZXNvdXJjZXMvX19pbml0X18ucHksc2hhMjU2PUNjd3VIdENCWm45T1RrbWdGOWNGcGFkSUFNaGxyblpUVktUT280VjJwNTgsMTAzMjMwDQpwaXAvX3ZlbmRvci9wcm9ncmVzcy9fX2luaXRfXy5weSxzaGEyNTY9V24xMDc0TFVEWm92ZDR6Zm9WWW9qblBCZ09jNmN0SGJRWDdycF9wOGxSQSwzMDIzDQpwaXAvX3ZlbmRvci9wcm9ncmVzcy9iYXIucHksc2hhMjU2PVlOUEplUnJ3WVZLRk8ybnlhRXdzUWpZQnlhbU1XVGdKTXZRTzFOcEQtQVksMjY4NQ0KcGlwL192ZW5kb3IvcHJvZ3Jlc3MvY291bnRlci5weSxzaGEyNTY9a0VxQThqV0Vkd3JjNlBfOVZhUng3YmpPSHdrOWd4bC1ROW9WYlEwOHY1YywxNTAyDQpwaXAvX3ZlbmRvci9wcm9ncmVzcy9oZWxwZXJzLnB5LHNoYTI1Nj1GZWhmd1pUdi01Y0Nmc2JjTWx2bFVrbTN4WjBjUmhzZXY2WFZwbWVURjRjLDI4NTQNCnBpcC9fdmVuZG9yL3Byb2dyZXNzL3NwaW5uZXIucHksc2hhMjU2PWlDVnRVUWJhSlVGSFRqbjFaTFBRTFBZZWFvNGxDOWFYQWFfSHhJZVVLNmssMTMxNA0KcGlwL192ZW5kb3IvcmVxdWVzdHMvX19pbml0X18ucHksc2hhMjU2PUpSRlZCdzZKeVY5OFdRU3F2OGpzaGM1X2c5eEliTGhldkk1TEhhVmk5STQsMzU3NQ0KcGlwL192ZW5kb3IvcmVxdWVzdHMvX192ZXJzaW9uX18ucHksc2hhMjU2PUJRMjc5YmpxUV84UEhodkRfRk4zNlV1RnFqYlNVcXNtN2JNZXlKVi1rVm8sNDM2DQpwaXAvX3ZlbmRvci9yZXF1ZXN0cy9faW50ZXJuYWxfdXRpbHMucHksc2hhMjU2PVp4M1BuRVVjY3lmc0ItaWUxMW5aVkFXOHFDbEp5MGd4MXFOTUU3cmdUMTgsMTA5Ng0KcGlwL192ZW5kb3IvcmVxdWVzdHMvYWRhcHRlcnMucHksc2hhMjU2PUxBYXkzT0gwWmJ2STZiRFdfTTVPZjA2dFU1ejJmbkNmbHJwX1htMzhLc1ksMjEwMTYNCnBpcC9fdmVuZG9yL3JlcXVlc3RzL2FwaS5weSxzaGEyNTY9QnFWWm52c1d1NlB3bTB2UTNmd19EajlfSS1nY09SOUNiU2NCMmh0UEFyQSw2MjM3DQpwaXAvX3ZlbmRvci9yZXF1ZXN0cy9hdXRoLnB5LHNoYTI1Nj00S0NGUUhyTDFMY294M3VNaDR0ak9oM09ySmh3LUY1enRpOTF3WS1aeVRZLDk3MjgNCnBpcC9fdmVuZG9yL3JlcXVlc3RzL2NhY2VydC5wZW0sc2hhMjU2PTdDRVhmTEh4RHd2RHB3VnUweV8ybGZKWWs2M2NVLUtVS0lfREwxTHE4VW8sMjcxMDg4DQpwaXAvX3ZlbmRvci9yZXF1ZXN0cy9jZXJ0cy5weSxzaGEyNTY9blhSVnE5RHRHbXZfMUFZYndqVHU5VXJnQWNkSnYwNVp2a05lYW9MT1p4WSw0NjUNCnBpcC9fdmVuZG9yL3JlcXVlc3RzL2NvbXBhdC5weSxzaGEyNTY9a2NxaFY3VTQzYzRpOE91azVlNVlkSlhNREVtV05MVDk3TFltNlVvci03NCwxNjI2DQpwaXAvX3ZlbmRvci9yZXF1ZXN0cy9jb29raWVzLnB5LHNoYTI1Nj11N1FDNWhtbG9Nd2RUOS0ydGF6NUdwd0F2enAyTFRVUzljUDRTV1VLbmZNLDE4MjA4DQpwaXAvX3ZlbmRvci9yZXF1ZXN0cy9leGNlcHRpb25zLnB5LHNoYTI1Nj1vWndZd0NtNjVZMEZNdUZxb2pFZ1VsV1VCUTRNa1hSeTVVUkhWMWI5OEw0LDMxMTUNCnBpcC9fdmVuZG9yL3JlcXVlc3RzL2hlbHAucHksc2hhMjU2PVV1QlR0Yzd0RXBuVV9pdm5wdWsyaGpnenVTNno3R25URWtTYkVObGMxWFEsMzY2Nw0KcGlwL192ZW5kb3IvcmVxdWVzdHMvaG9va3MucHksc2hhMjU2PUhYQUhvQzFGTlRGUlpYNi1sTmR2UE03VHN0NGt2R3dZVE4tQU9LUnhvUlUsNzY3DQpwaXAvX3ZlbmRvci9yZXF1ZXN0cy9tb2RlbHMucHksc2hhMjU2PWxjejJHRU9lMmVPdS1HcUFHZHBBMHZKVXBJN0VFNGVEU2xXSTc4UjhZNjQsMzQwNTENCnBpcC9fdmVuZG9yL3JlcXVlc3RzL3BhY2thZ2VzLnB5LHNoYTI1Nj1uakptVmlmWTRhU2N0dVczUFA1RUZSQ3hqRXdNUkRPNkpfZmVHMmRLV3NJLDY5NQ0KcGlwL192ZW5kb3IvcmVxdWVzdHMvc2Vzc2lvbnMucHksc2hhMjU2PV9BNXFwZnJvaEhWRllMRXVWeUVKNHYzLWxJbE53TzNHcEhHLUx6a1dGQ00sMjc1NDYNCnBpcC9fdmVuZG9yL3JlcXVlc3RzL3N0YXR1c19jb2Rlcy5weSxzaGEyNTY9YTlid3VVN2xNcjRIc2hzUlpkekJiVXNZVnNJbzRGdTlHWWcxWEZURkZQYywzMzIzDQpwaXAvX3ZlbmRvci9yZXF1ZXN0cy9zdHJ1Y3R1cmVzLnB5LHNoYTI1Nj15ZXhDdldiWDQwTTZFOG1MUU9wQUdaWi1ab0FueWFUMmRuaS1CcC1iNDJnLDMwMTINCnBpcC9fdmVuZG9yL3JlcXVlc3RzL3V0aWxzLnB5LHNoYTI1Nj1zUEVrU1ZMWG5HbGZvYmJKTW54NUU5VmM0a2Z2NlRwRldwSEtGQjh3TzhVLDI3NjUyDQpwaXAvX3ZlbmRvci91cmxsaWIzL19faW5pdF9fLnB5LHNoYTI1Nj1FZlVQRjlSSHZlYUY5ZzVkY0s1a0JzR0RwNUxySUItMzk2TXBLMlJRazFJLDI4NTMNCnBpcC9fdmVuZG9yL3VybGxpYjMvX2NvbGxlY3Rpb25zLnB5LHNoYTI1Nj1iMC14NDVMQkFyczk2UnVtNXhHQWJQc3Jpd2ZCM01aVlFic3Y3bEZpVXdFLDEwMjA0DQpwaXAvX3ZlbmRvci91cmxsaWIzL2Nvbm5lY3Rpb24ucHksc2hhMjU2PTRHS1I4dVhIejZJcHp0WWh0dWhLQnFYajg0SGJiRlVGM0N2d3ltR2ZMRDAsMTMwMDMNCnBpcC9fdmVuZG9yL3VybGxpYjMvY29ubmVjdGlvbnBvb2wucHksc2hhMjU2PTV1YjhDWG5LczF3YzJYLU15dVZWUG8zXzlzY1dMZ2hTZ2JIT0pUcFFYdUUsMzUzNTgNCnBpcC9fdmVuZG9yL3VybGxpYjMvZXhjZXB0aW9ucy5weSxzaGEyNTY9ZHoxZ0JFZ3RST25Mclc4VjkxMUtoVlpXZUFuM0gyT2hER3p0V05YUXByMCw2NjAzDQpwaXAvX3ZlbmRvci91cmxsaWIzL2ZpZWxkcy5weSxzaGEyNTY9WXJOUk04UkJVbU04Z3VYS1VRRmEza3dqNlh2UVo3OFo4aW5FNmwtWUstRSw1OTQzDQpwaXAvX3ZlbmRvci91cmxsaWIzL2ZpbGVwb3N0LnB5LHNoYTI1Nj1ORjZSbHk2NmJpbFdVLXNkVUxYakNkUWdOMXVSeGZGUmVkZWlmY1JMemtVLDIzMjENCnBpcC9fdmVuZG9yL3VybGxpYjMvcG9vbG1hbmFnZXIucHksc2hhMjU2PS01MUJBUGxEME1nRUNZZHVIaGZiWkNFaVpvVV9OREZPS1lsaFNqaWZmMlEsMTYzNDUNCnBpcC9fdmVuZG9yL3VybGxpYjMvcmVxdWVzdC5weSxzaGEyNTY9d3J0MkQwU1dMTGdUUktyUm5hWm9waHEyeFhwQ3ZOUmQ3Uk1UNkY1bzVoWSw1OTQ2DQpwaXAvX3ZlbmRvci91cmxsaWIzL3Jlc3BvbnNlLnB5LHNoYTI1Nj03bUdVSDM1TDJJUHVaVk9ZN1F2RFExR1NTS0lmNlY2Z2VKWFRoZGptUUQ0LDIyOTAzDQpwaXAvX3ZlbmRvci91cmxsaWIzL2NvbnRyaWIvX19pbml0X18ucHksc2hhMjU2PTQ3REVRcGo4SEJTYS1fVEltVy01SkNldVFlUmttNU5NcEpXWkczaFN1RlUsMA0KcGlwL192ZW5kb3IvdXJsbGliMy9jb250cmliL2FwcGVuZ2luZS5weSxzaGEyNTY9NDFsM2FyVHkta0JCcE9kVnBTUFlWQzY0UW83UkxuWG5ERUQ2aGNJdGhBMCwxMDg2NQ0KcGlwL192ZW5kb3IvdXJsbGliMy9jb250cmliL250bG1wb29sLnB5LHNoYTI1Nj1ROS1yTzVSaDItSXF5RWQ0WmljcFREZk1uT2xmMElQUENramhDaEJDalY0LDQ0NzgNCnBpcC9fdmVuZG9yL3VybGxpYjMvY29udHJpYi9weW9wZW5zc2wucHksc2hhMjU2PUJ4SjF5TVBFNjJkdXVISlA2amxaeEx6X0ZOVEtiV0kwYi1uVlJLbEJEZ0ksMTUzNTQNCnBpcC9fdmVuZG9yL3VybGxpYjMvY29udHJpYi9zZWN1cmV0cmFuc3BvcnQucHksc2hhMjU2PVpSUHo2UTF0bnN1OUgxQk9BUVZVU0hJeW93V21mYUJiN3BHbGJHNWlPUGssMzA1MDENCnBpcC9fdmVuZG9yL3VybGxpYjMvY29udHJpYi9zb2Nrcy5weSxzaGEyNTY9elBZVUtNZ19jMG45SEZqWlBHOW5HTjJranBhSDdxVUNaeHJENUI3RzBfSSw2MTk1DQpwaXAvX3ZlbmRvci91cmxsaWIzL2NvbnRyaWIvX3NlY3VyZXRyYW5zcG9ydC9fX2luaXRfXy5weSxzaGEyNTY9NDdERVFwajhIQlNhLV9USW1XLTVKQ2V1UWVSa201Tk1wSldaRzNoU3VGVSwwDQpwaXAvX3ZlbmRvci91cmxsaWIzL2NvbnRyaWIvX3NlY3VyZXRyYW5zcG9ydC9iaW5kaW5ncy5weSxzaGEyNTY9eDJrTFNoLUFTWktzdW4wRnh0cmFCdUxWZTNvSHV0aDRZVzZ5WjVWb2YtdywxNzU2MA0KcGlwL192ZW5kb3IvdXJsbGliMy9jb250cmliL19zZWN1cmV0cmFuc3BvcnQvbG93X2xldmVsLnB5LHNoYTI1Nj1VYmhVeWtFSDZIVUlKdWQ5X3JuXzZZV2ppb25rNWlxX3JxNllyaFZNNkNvLDEyMDYyDQpwaXAvX3ZlbmRvci91cmxsaWIzL3BhY2thZ2VzL19faW5pdF9fLnB5LHNoYTI1Nj1ubENockd6a2pDa21oQ1g5SHJGX3FIUFVnb3Nmc1BRa1ZJSnhpaUxoazlnLDEwOQ0KcGlwL192ZW5kb3IvdXJsbGliMy9wYWNrYWdlcy9vcmRlcmVkX2RpY3QucHksc2hhMjU2PVZRYVBPTmZoVk1zYjhCNjNYZzdaT3lkSnFJRV9qemVNaFZOM1BlYzZvZ3csODkzNQ0KcGlwL192ZW5kb3IvdXJsbGliMy9wYWNrYWdlcy9zaXgucHksc2hhMjU2PUE2aGRKWlZqSTN0X2dlZWJaOUJ6VXZ3UnJJWG8wbGZ3elFsTTJMY0t5YXMsMzAwOTgNCnBpcC9fdmVuZG9yL3VybGxpYjMvcGFja2FnZXMvYmFja3BvcnRzL19faW5pdF9fLnB5LHNoYTI1Nj00N0RFUXBqOEhCU2EtX1RJbVctNUpDZXVRZVJrbTVOTXBKV1pHM2hTdUZVLDANCnBpcC9fdmVuZG9yL3VybGxpYjMvcGFja2FnZXMvYmFja3BvcnRzL21ha2VmaWxlLnB5LHNoYTI1Nj1yMUlBRG9sX3BCQnEyWTF1YjRDUHl1UzJoWHVTaEs0N25mRm5nWlJjUmhJLDE0NjENCnBpcC9fdmVuZG9yL3VybGxpYjMvcGFja2FnZXMvc3NsX21hdGNoX2hvc3RuYW1lL19faW5pdF9fLnB5LHNoYTI1Nj1XQlZieFFCb2pOQXhmWndOYXZrb3gzQmdKaU1BOUJKbW0tX2Z3ZDBqRF9vLDY4OA0KcGlwL192ZW5kb3IvdXJsbGliMy9wYWNrYWdlcy9zc2xfbWF0Y2hfaG9zdG5hbWUvX2ltcGxlbWVudGF0aW9uLnB5LHNoYTI1Nj1sQWo3cUdDWkxPbGRobjhnWkRZNlRxcDRtdmdrYlRmeTRrNGdESURSbzhnLDU3MDINCnBpcC9fdmVuZG9yL3VybGxpYjMvdXRpbC9fX2luaXRfXy5weSxzaGEyNTY9NlJhbjRvQVZJeTQwQ3Vfb0VQV25OVjlid0Y1clh4NkcxRFVaN29laGpQWSwxMDQ0DQpwaXAvX3ZlbmRvci91cmxsaWIzL3V0aWwvY29ubmVjdGlvbi5weSxzaGEyNTY9XzZfNUpaSkYzSEhSWFI3SGF4SGczbWs3cU1LSzNOMG5sM0RMOGdGQWZvNCw0MjM3DQpwaXAvX3ZlbmRvci91cmxsaWIzL3V0aWwvcmVxdWVzdC5weSxzaGEyNTY9SDVfbHJIdnR3bDJVMkJiVDFVWU45SHBydU5jMWdzTkZsejJualFtaFByUSwzNzA1DQpwaXAvX3ZlbmRvci91cmxsaWIzL3V0aWwvcmVzcG9uc2UucHksc2hhMjU2PVNTTkw4ODhXLU1ROHQzSEFpNDRrTkdnRjY4MnA2SF9feXRFWHpCWXhWX00sMjM0Mw0KcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL3JldHJ5LnB5LHNoYTI1Nj1wNExIbS1PVmFOZE55Wi1ob0FvZFRJb3hOb2NBdXVlZ1QzNkh4X0djd2tnLDE0NjAxDQpwaXAvX3ZlbmRvci91cmxsaWIzL3V0aWwvc2VsZWN0b3JzLnB5LHNoYTI1Nj1QSUlOendqaUQ1WjZJeVRLQTF0UjVuMWtDT1h5VGhwRENFMmZDVkZ6TGVNLDIxMTQ3DQpwaXAvX3ZlbmRvci91cmxsaWIzL3V0aWwvc3NsXy5weSxzaGEyNTY9WXBjaU0wbU5fcmQyN3djaExFTlN4VE5hN1BXRWdaMk1QOWF0ZUZ1ckNlbywxMjIwOA0KcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL3RpbWVvdXQucHksc2hhMjU2PTdsSE5yZ0w1WUgyY0kxai15Wm56Vl9KOGpCbFJWZG1GaFFhTnlNMV8yYjgsOTc1Nw0KcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL3VybC5weSxzaGEyNTY9cUNZX0hIVVh2bzA1d0FzRUVSQUxnRXh0bGd4TG5BSFNRN2NlMWItZzNTTSw2NDg3DQpwaXAvX3ZlbmRvci91cmxsaWIzL3V0aWwvd2FpdC5weSxzaGEyNTY9UV9wZF9iRDZpYVBnUkt3RW1jalRZRHJTUGo0RGQ0b2p5a21xQTM5OGI4bywxNDUxDQpwaXAvX3ZlbmRvci93ZWJlbmNvZGluZ3MvX19pbml0X18ucHksc2hhMjU2PXQ3ckFRUXhYd2FsWS1hazloVGw3M3FIamhpYTlVSC1zTC1lMDBxUXJCcG8sMTA1NzYNCnBpcC9fdmVuZG9yL3dlYmVuY29kaW5ncy9sYWJlbHMucHksc2hhMjU2PTRBT19LeFRkZHFHdHJMOW5zN2tBUGpiMENjTjZ4c0NJeGJLMzdIWTlyM0UsODk3OQ0KcGlwL192ZW5kb3Ivd2ViZW5jb2RpbmdzL21rbGFiZWxzLnB5LHNoYTI1Nj1HWUlleXducGFMblAwR1NpYzhMRldnZDBVVnZPX2wxTmM2WW9GLTg3Ul80LDEzMDUNCnBpcC9fdmVuZG9yL3dlYmVuY29kaW5ncy90ZXN0cy5weSxzaGEyNTY9N3ZUazdMZ09Kbl90MVh0VF92aW9mWmxFSjdjSkN6UGVfaHZWSE9rY1FsOCw2NTYyDQpwaXAvX3ZlbmRvci93ZWJlbmNvZGluZ3MveF91c2VyX2RlZmluZWQucHksc2hhMjU2PTcyY2ZQUmhiZmtSQ0dra0E4Wm52VlY3VW5vaUxiNXVQTWhYd2hyWGlMUGssNDMwNg0KcGlwL2NvbW1hbmRzL19faW5pdF9fLnB5LHNoYTI1Nj0yVXEzSENkamNoSkQ5RkwxTEI3cmQ1djZVeVNWQVZpelgwVzNFWDNoSW9FLDIyNDQNCnBpcC9jb21tYW5kcy9jaGVjay5weSxzaGEyNTY9LUE3R0kxLVdaQmg5YTRQNlVvSF9hUi1KN0k4THo4bHk3bTN3bkNqbWV2cywxMzgyDQpwaXAvY29tbWFuZHMvY29tcGxldGlvbi5weSxzaGEyNTY9a2tQZ1ZYN1NVY0pfOEp1dzVHa2dXYXhITjlfNDV3bUFyOW1HczF6WEVFcywyNDUzDQpwaXAvY29tbWFuZHMvZG93bmxvYWQucHksc2hhMjU2PThSdXVQbVNZZ0FxM2lFRFRxWllfMVBEWFJxUkVkVVVMSE5qV0plQXY3TW8sNzgxMA0KcGlwL2NvbW1hbmRzL2ZyZWV6ZS5weSxzaGEyNTY9aDYteUZNcGpDamJOajgtZ09tNVV1b0Y2Y2cxNE41clBWNFRDaTNfQ2V1SSwyODM1DQpwaXAvY29tbWFuZHMvaGFzaC5weSxzaGEyNTY9TUN0NGpFRnlmb2NlMGxWZU5FejF4NDl1YVRZLVZEa0tpQnZ2eHJWY0hrdywxNTk3DQpwaXAvY29tbWFuZHMvaGVscC5weSxzaGEyNTY9ODRIV2tFZG5HUF9BRUJIbm44Z0pQMlRlMFhUWFJLRm9YcVhvcGJPWlRObyw5ODINCnBpcC9jb21tYW5kcy9pbnN0YWxsLnB5LHNoYTI1Nj1vdkc5cDluMVgyTlBxTWdGVnRTdVQ5a01iTEFkeDFyM1lTU2lYU3ZnT0tJLDE3NDEyDQpwaXAvY29tbWFuZHMvbGlzdC5weSxzaGEyNTY9OTNiQ2lGeXQyUXV0X1lIa1lISk1aSHBYbGFkbXhzalMteU90WmViM3VxSSwxMTM2OQ0KcGlwL2NvbW1hbmRzL3NlYXJjaC5weSxzaGEyNTY9b1RzOVFOZGVmbnJtQ1ZfSmVmdEcwUEdpTXVZVm1pRURGMU9VYVlzbURhbyw0NTAyDQpwaXAvY29tbWFuZHMvc2hvdy5weSxzaGEyNTY9WllNNTdfN1U4S1A5TVFJSXlIS1FkWnhtaUVaQnl5LURSekI2OTdWRm9UWSw1ODkxDQpwaXAvY29tbWFuZHMvdW5pbnN0YWxsLnB5LHNoYTI1Nj10ejhjWHo0V2RwVWRudDNSdnBkUXdINl9TTk1CNTBlZ0JJWldhMWR3ZmNjLDI4ODQNCnBpcC9jb21tYW5kcy93aGVlbC5weSxzaGEyNTY9ejVTRWh3czJZUk1iME1sMUlFa2c2akZaTUxScExsODZiSENyUWJZdDV6byw3NzI5DQpwaXAvY29tcGF0L19faW5pdF9fLnB5LHNoYTI1Nj0yWHNfSXBzbWRSZ0hiUWdRTzBjOF9sUHZISm5RWEh5R1d4UGJMYllKTDRjLDQ2NzINCnBpcC9jb21wYXQvZGljdGNvbmZpZy5weSxzaGEyNTY9ZFJyZWxQRFdyY2VEU3pGVDUxUlRFVlkyR3VNN1VEeWM1SWdoX3RuNEZ2aywyMzA5Ng0KcGlwL21vZGVscy9fX2luaXRfXy5weSxzaGEyNTY9MFJzN19SQTREeGVPa1dUNUNxNENRekRyU0VodlljTjNUSDJjYXpyNzJQRSw3MQ0KcGlwL21vZGVscy9pbmRleC5weSxzaGEyNTY9cFVmYk9fX3YzbUQ5ai0ybl9DbHdQUzhwVnl4NGwyd0l3eXZXdDhHTUNSQSw0ODcNCnBpcC9vcGVyYXRpb25zL19faW5pdF9fLnB5LHNoYTI1Nj00N0RFUXBqOEhCU2EtX1RJbVctNUpDZXVRZVJrbTVOTXBKV1pHM2hTdUZVLDANCnBpcC9vcGVyYXRpb25zL2NoZWNrLnB5LHNoYTI1Nj11d1VOOWNzMXNQbzdjMFNqNnBSclN2N2IyMlBrMjlTWFVJbVRlbFZjaE1RLDE1OTANCnBpcC9vcGVyYXRpb25zL2ZyZWV6ZS5weSxzaGEyNTY9ay03dzdMc00tUnBQdjdFUkJ6SGlQcFlrSC1HdVlmSEx5Ui1DcF8xVlBMMCw1MTk0DQpwaXAvcmVxL19faW5pdF9fLnB5LHNoYTI1Nj12RndaWThfVmMxV1UxekZBZXNwZzFNeV9yX0FUM243Y04wVzllWDBFRnFrLDI3Ng0KcGlwL3JlcS9yZXFfZmlsZS5weSxzaGEyNTY9Zkc5TURzWFVOUGhtR3d4VWl3cklYRXlueUQ4UTdzM0w0Ny1oTFpQRFhxMCwxMTkyNg0KcGlwL3JlcS9yZXFfaW5zdGFsbC5weSxzaGEyNTY9Z1lySC1sd1FNbXQ1NVZWYmF2X0V0UklQdTk0Y1FiSEZIbV9LcTZBZUhiZyw0NjQ4Nw0KcGlwL3JlcS9yZXFfc2V0LnB5LHNoYTI1Nj1qSHNwWHFjQTJGeGNGMDVkZ1VJQVo1aHVZUHY2Ym4wd1JVWDBaN1BLbWFBLDM0NDYyDQpwaXAvcmVxL3JlcV91bmluc3RhbGwucHksc2hhMjU2PWZkSDJWZ0NqRUM4TlJZRFM3ZlJ1M1pKYUJCVUV5LU41bXV3eERYNU1CTk0sNjg5Nw0KcGlwL3V0aWxzL19faW5pdF9fLnB5LHNoYTI1Nj1IWF93WVMxNW9pWU96LUgzcUcxS2JpMUNZN0FHV0NOSzVqbG9pRDBmYXVjLDI3MTg3DQpwaXAvdXRpbHMvYXBwZGlycy5weSxzaGEyNTY9a2oyTEstSTJmQzVRbkVoX0Ffdi1ldl9JUU1jWGFXV0Y1REUzOXNOdkNMUSw4ODExDQpwaXAvdXRpbHMvYnVpbGQucHksc2hhMjU2PTRzbUxScmZTQ21YbWpFblZuTUZoMnRCRXBOY1NMUmU2SjBlalpKLXdXSkUsMTMxMg0KcGlwL3V0aWxzL2RlcHJlY2F0aW9uLnB5LHNoYTI1Nj1YX0ZNanREYk1KcWZxRWtkUnJraS1tWXlJZFBCNkk2REhVVENBX0NoWTZNLDIyMzINCnBpcC91dGlscy9lbmNvZGluZy5weSxzaGEyNTY9TlF4R2lGUzVHYmVBdmVMWlRueDkydDVyMFBZcXZ0MGlSblAydTlTR0cxdyw5NzENCnBpcC91dGlscy9maWxlc3lzdGVtLnB5LHNoYTI1Nj1aRVZCdVlNM2ZxcjJfbGdPRVNoNFk3ZlBGc3pHRDQ3NHpWbV9NM01iNVRrLDg5OQ0KcGlwL3V0aWxzL2dsaWJjLnB5LHNoYTI1Nj1qY1FZanRfb0pMUEtWWkIyOEthdXk0U3c3MHpTLXdhd3hvVTFISFgzNl8wLDI5MzkNCnBpcC91dGlscy9oYXNoZXMucHksc2hhMjU2PW9NazdjZDNQYkpnenBTUXlYcTFNeXRNdWQ1ZjZINU9hMllZNWhZdUNxNkksMjg2Ng0KcGlwL3V0aWxzL2xvZ2dpbmcucHksc2hhMjU2PTd5V3U0Z1p3LVFjbGo3WDgwUVZkcEdXa2RUV0dLVDRMaVVWS2NFMDRwcm8sMzMyNw0KcGlwL3V0aWxzL291dGRhdGVkLnB5LHNoYTI1Nj1mTndPQ0w1cjJFZnRQR2hnQ1lHTUt1MDMySEM4Y1YtSkFyOWxwMEhtVG9NLDU0NTUNCnBpcC91dGlscy9wYWNrYWdpbmcucHksc2hhMjU2PXFobWxpMTRvZHc2REloV0pnUVlTMlEwUnJTYnI4blhOY0c0OGY1eVRSbXMsMjA4MA0KcGlwL3V0aWxzL3NldHVwdG9vbHNfYnVpbGQucHksc2hhMjU2PTBibGZzY21OSldfaVo1RGNzd0plREJfUGJ0VEVqZks5UkwxUjFXRURXMkUsMjc4DQpwaXAvdXRpbHMvdWkucHksc2hhMjU2PXBiRGtTQWV1bVo2amRaY09KMnlBYng4aUJnZVAyemZwcU5uTEpLMWdza1EsMTE1OTcNCnBpcC92Y3MvX19pbml0X18ucHksc2hhMjU2PVdhZkZsaVVUSE1tc1NJU1Y4UEhwMU01RVhETlNXeUpyNzh6S2FRbVBMZFksMTIzNzQNCnBpcC92Y3MvYmF6YWFyLnB5LHNoYTI1Nj10WVR3YzRiNG9mZjhtcjBPMm84U2lHZWpxQkRKeGNiREJNU01kOS1JU1ljLDM4MDMNCnBpcC92Y3MvZ2l0LnB5LHNoYTI1Nj01TGZXcnlpNzhBLTJVTGpFWkp2Q1RhckpfM2w4dmVud1hBU2x3bThoaXVnLDExMTk3DQpwaXAvdmNzL21lcmN1cmlhbC5weSxzaGEyNTY9eEc2ckRpd0hDUnl0SkVzMjNTSUhCWGxfU3dRbzJqa2tkRF82clZWUDVoNCwzNDcyDQpwaXAvdmNzL3N1YnZlcnNpb24ucHksc2hhMjU2PUdBdVgyU2s3SVp2SnlFekVOS2NWbGRfd0dCclEzZnBYRGxYamFwWkVZZEksOTM1MA0KcGlwLTkuMC4zLmRpc3QtaW5mby9ERVNDUklQVElPTi5yc3Qsc2hhMjU2PVZhOFdqMVhCcFRiVlEyWjQxbVpSSmRBTEVlemlpU19aZXdXbjFIMmVjWTQsMTI4Nw0KcGlwLTkuMC4zLmRpc3QtaW5mby9NRVRBREFUQSxzaGEyNTY9a00yelhEb0lQaVoycW9qZmthREM3YUtxVEZ3dXdnTVJWSjdGWVV0QUFWaywyNTUzDQpwaXAtOS4wLjMuZGlzdC1pbmZvL1JFQ09SRCwsDQpwaXAtOS4wLjMuZGlzdC1pbmZvL1dIRUVMLHNoYTI1Nj1rZHNOLTVPSkFaSWlITi1pTzRSaGw4Mkt5UzBiRFdmNHVCd01ia05hZnI4LDExMA0KcGlwLTkuMC4zLmRpc3QtaW5mby9lbnRyeV9wb2ludHMudHh0LHNoYTI1Nj1RLWZSMnRjcDlEUmRlWG9HbjF3UjY3WGVjeTMybzVFeVFFbnpEZ2h3cXFrLDY4DQpwaXAtOS4wLjMuZGlzdC1pbmZvL21ldGFkYXRhLmpzb24sc2hhMjU2PTRMbXJ1aTNrbkwwYmdveGwxOHNjeXMxVXp0T2Z1Z1VmQ3pBUmNwS1c0ekEsMTU2NQ0KcGlwLTkuMC4zLmRpc3QtaW5mby90b3BfbGV2ZWwudHh0LHNoYTI1Nj16dXV1ZTRrbm95Si1Vd1BQWGc4ZmV6UzdWQ3JYSlFyQVA3emVOdXd2RlFnLDQNClBLAwQUAAAAAAAAACEA9t3Svm4AAABuAAAAKQAAAHB5cGlfX3BpcF85XzBfMy9waXAtOS4wLjMuZGlzdC1pbmZvL1dIRUVMV2hlZWwtVmVyc2lvbjogMS4wCkdlbmVyYXRvcjogYmRpc3Rfd2hlZWwgKDAuMzAuMCkKUm9vdC1Jcy1QdXJlbGliOiB0cnVlClRhZzogcHkyLW5vbmUtYW55ClRhZzogcHkzLW5vbmUtYW55CgpQSwMEFAAAAAAAAAAhALQXmMREAAAARAAAADQAAABweXBpX19waXBfOV8wXzMvcGlwLTkuMC4zLmRpc3QtaW5mby9lbnRyeV9wb2ludHMudHh0W2NvbnNvbGVfc2NyaXB0c10KcGlwID0gcGlwOm1haW4KcGlwMyA9IHBpcDptYWluCnBpcDMuNiA9IHBpcDptYWluCgpQSwMEFAAAAAAAAAAhAMjgt5sdBgAAHQYAADEAAABweXBpX19waXBfOV8wXzMvcGlwLTkuMC4zLmRpc3QtaW5mby9tZXRhZGF0YS5qc29ueyJjbGFzc2lmaWVycyI6IFsiRGV2ZWxvcG1lbnQgU3RhdHVzIDo6IDUgLSBQcm9kdWN0aW9uL1N0YWJsZSIsICJJbnRlbmRlZCBBdWRpZW5jZSA6OiBEZXZlbG9wZXJzIiwgIkxpY2Vuc2UgOjogT1NJIEFwcHJvdmVkIDo6IE1JVCBMaWNlbnNlIiwgIlRvcGljIDo6IFNvZnR3YXJlIERldmVsb3BtZW50IDo6IEJ1aWxkIFRvb2xzIiwgIlByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAyIiwgIlByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAyLjYiLCAiUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDIuNyIsICJQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMyIsICJQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy4zIiwgIlByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjQiLCAiUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuNSIsICJQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogSW1wbGVtZW50YXRpb24gOjogUHlQeSJdLCAiZXh0ZW5zaW9ucyI6IHsicHl0aG9uLmNvbW1hbmRzIjogeyJ3cmFwX2NvbnNvbGUiOiB7InBpcCI6ICJwaXA6bWFpbiIsICJwaXAzIjogInBpcDptYWluIiwgInBpcDMuNiI6ICJwaXA6bWFpbiJ9fSwgInB5dGhvbi5kZXRhaWxzIjogeyJjb250YWN0cyI6IFt7ImVtYWlsIjogInB5dGhvbi12aXJ0dWFsZW52QGdyb3Vwcy5nb29nbGUuY29tIiwgIm5hbWUiOiAiVGhlIHBpcCBkZXZlbG9wZXJzIiwgInJvbGUiOiAiYXV0aG9yIn1dLCAiZG9jdW1lbnRfbmFtZXMiOiB7ImRlc2NyaXB0aW9uIjogIkRFU0NSSVBUSU9OLnJzdCJ9LCAicHJvamVjdF91cmxzIjogeyJIb21lIjogImh0dHBzOi8vcGlwLnB5cGEuaW8vIn19LCAicHl0aG9uLmV4cG9ydHMiOiB7ImNvbnNvbGVfc2NyaXB0cyI6IHsicGlwIjogInBpcDptYWluIiwgInBpcDMiOiAicGlwOm1haW4iLCAicGlwMy42IjogInBpcDptYWluIn19fSwgImV4dHJhcyI6IFsidGVzdGluZyJdLCAiZ2VuZXJhdG9yIjogImJkaXN0X3doZWVsICgwLjMwLjApIiwgImtleXdvcmRzIjogWyJlYXN5X2luc3RhbGwiLCAiZGlzdHV0aWxzIiwgInNldHVwdG9vbHMiLCAiZWdnIiwgInZpcnR1YWxlbnYiXSwgImxpY2Vuc2UiOiAiTUlUIiwgIm1ldGFkYXRhX3ZlcnNpb24iOiAiMi4wIiwgIm5hbWUiOiAicGlwIiwgInJlcXVpcmVzX3B5dGhvbiI6ICI+PTIuNiwhPTMuMC4qLCE9My4xLiosIT0zLjIuKiIsICJydW5fcmVxdWlyZXMiOiBbeyJleHRyYSI6ICJ0ZXN0aW5nIiwgInJlcXVpcmVzIjogWyJtb2NrIiwgInByZXRlbmQiLCAicHl0ZXN0IiwgInNjcmlwdHRlc3QgKD49MS4zKSIsICJ2aXJ0dWFsZW52ICg+PTEuMTApIl19XSwgInN1bW1hcnkiOiAiVGhlIFB5UEEgcmVjb21tZW5kZWQgdG9vbCBmb3IgaW5zdGFsbGluZyBQeXRob24gcGFja2FnZXMuIiwgInRlc3RfcmVxdWlyZXMiOiBbeyJyZXF1aXJlcyI6IFsibW9jayIsICJwcmV0ZW5kIiwgInB5dGVzdCIsICJzY3JpcHR0ZXN0ICg+PTEuMykiLCAidmlydHVhbGVudiAoPj0xLjEwKSJdfV0sICJ2ZXJzaW9uIjogIjkuMC4zIn1QSwMEFAAAAAAAAAAhAMcfl8IEAAAABAAAADEAAABweXBpX19waXBfOV8wXzMvcGlwLTkuMC4zLmRpc3QtaW5mby90b3BfbGV2ZWwudHh0cGlwClBLAwQUAAAAAAAAACEADVvQdrQuAAC0LgAAHwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX19pbml0X18ucHkjIS91c3IvYmluL2VudiBweXRob24KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBsb2NhbGUKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG9zCmltcG9ydCBvcHRwYXJzZQppbXBvcnQgd2FybmluZ3MKCmltcG9ydCBzeXMKaW1wb3J0IHJlCgojIDIwMTYtMDYtMTcgYmFycnlAZGViaWFuLm9yZzogdXJsbGliMyAxLjE0IGFkZGVkIG9wdGlvbmFsIHN1cHBvcnQgZm9yIHNvY2tzLAojIGJ1dCBpZiBpbnZva2VkIChpLmUuIGltcG9ydGVkKSwgaXQgd2lsbCBpc3N1ZSBhIHdhcm5pbmcgdG8gc3RkZXJyIGlmIHNvY2tzCiMgaXNuJ3QgYXZhaWxhYmxlLiAgcmVxdWVzdHMgdW5jb25kaXRpb25hbGx5IGltcG9ydHMgdXJsbGliMydzIHNvY2tzIGNvbnRyaWIKIyBtb2R1bGUsIHRyaWdnZXJpbmcgdGhpcyB3YXJuaW5nLiAgVGhlIHdhcm5pbmcgYnJlYWtzIERFUC04IHRlc3RzIChiZWNhdXNlIG9mCiMgdGhlIHN0ZGVyciBvdXRwdXQpIGFuZCBpcyBqdXN0IHBsYWluIGFubm95aW5nIGluIG5vcm1hbCB1c2FnZS4gIEkgZG9uJ3Qgd2FudAojIHRvIGFkZCBzb2NrcyBhcyB5ZXQgYW5vdGhlciBkZXBlbmRlbmN5IGZvciBwaXAsIG5vciBkbyBJIHdhbnQgdG8gYWxsb3ctc3RkZXIKIyBpbiB0aGUgREVQLTggdGVzdHMsIHNvIGp1c3Qgc3VwcHJlc3MgdGhlIHdhcm5pbmcuICBwZGIgdGVsbHMgbWUgdGhpcyBoYXMgdG8KIyBiZSBkb25lIGJlZm9yZSB0aGUgaW1wb3J0IG9mIHBpcC52Y3MuCmZyb20gcGlwLl92ZW5kb3IudXJsbGliMy5leGNlcHRpb25zIGltcG9ydCBEZXBlbmRlbmN5V2FybmluZwp3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwgY2F0ZWdvcnk9RGVwZW5kZW5jeVdhcm5pbmcpICAjIG5vcWEKCiMgV2Ugd2FudCB0byBpbmplY3QgdGhlIHVzZSBvZiBTZWN1cmVUcmFuc3BvcnQgYXMgZWFybHkgYXMgcG9zc2libGUgc28gdGhhdCBhbnkKIyByZWZlcmVuY2VzIG9yIHNlc3Npb25zIG9yIHdoYXQgaGF2ZSB5b3UgYXJlIGVuc3VyZWQgdG8gaGF2ZSBpdCwgaG93ZXZlciB3ZQojIG9ubHkgd2FudCB0byBkbyB0aGlzIGluIHRoZSBjYXNlIHRoYXQgd2UncmUgcnVubmluZyBvbiBtYWNPUyBhbmQgdGhlIGxpbmtlZAojIE9wZW5TU0wgaXMgdG9vIG9sZCB0byBoYW5kbGUgVExTdjEuMgp0cnk6CiAgICBpbXBvcnQgc3NsCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIHBhc3MKZWxzZToKICAgIGlmIChzeXMucGxhdGZvcm0gPT0gImRhcndpbiIgYW5kCiAgICAgICAgICAgIGdldGF0dHIoc3NsLCAiT1BFTlNTTF9WRVJTSU9OX05VTUJFUiIsIDApIDwgMHgxMDAwMTAwZik6ICAjIE9wZW5TU0wgMS4wLjEKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZyb20gcGlwLl92ZW5kb3IudXJsbGliMy5jb250cmliIGltcG9ydCBzZWN1cmV0cmFuc3BvcnQKICAgICAgICBleGNlcHQgKEltcG9ydEVycm9yLCBPU0Vycm9yKToKICAgICAgICAgICAgcGFzcwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlY3VyZXRyYW5zcG9ydC5pbmplY3RfaW50b191cmxsaWIzKCkKCmZyb20gcGlwLmV4Y2VwdGlvbnMgaW1wb3J0IEluc3RhbGxhdGlvbkVycm9yLCBDb21tYW5kRXJyb3IsIFBpcEVycm9yCmZyb20gcGlwLnV0aWxzIGltcG9ydCBnZXRfaW5zdGFsbGVkX2Rpc3RyaWJ1dGlvbnMsIGdldF9wcm9nCmZyb20gcGlwLnV0aWxzIGltcG9ydCBkZXByZWNhdGlvbiwgZGlzdF9pc19lZGl0YWJsZQpmcm9tIHBpcC52Y3MgaW1wb3J0IGdpdCwgbWVyY3VyaWFsLCBzdWJ2ZXJzaW9uLCBiYXphYXIgICMgbm9xYQpmcm9tIHBpcC5iYXNlcGFyc2VyIGltcG9ydCBDb25maWdPcHRpb25QYXJzZXIsIFVwZGF0aW5nRGVmYXVsdHNIZWxwRm9ybWF0dGVyCmZyb20gcGlwLmNvbW1hbmRzIGltcG9ydCBnZXRfc3VtbWFyaWVzLCBnZXRfc2ltaWxhcl9jb21tYW5kcwpmcm9tIHBpcC5jb21tYW5kcyBpbXBvcnQgY29tbWFuZHNfZGljdApmcm9tIHBpcC5fdmVuZG9yLnVybGxpYjMuZXhjZXB0aW9ucyBpbXBvcnQgSW5zZWN1cmVSZXF1ZXN0V2FybmluZwoKCiMgYXNzaWdubWVudCBmb3IgZmxha2U4IHRvIGJlIGhhcHB5CgojIFRoaXMgZml4ZXMgYSBwZWN1bGlhcml0eSB3aGVuIGltcG9ydGluZyB2aWEgX19pbXBvcnRfXyAtIGFzIHdlIGFyZQojIGluaXRpYWxpc2luZyB0aGUgcGlwIG1vZHVsZSwgImZyb20gcGlwIGltcG9ydCBjbWRvcHRpb25zIiBpcyByZWN1cnNpdmUKIyBhbmQgYXBwZWFycyBub3QgdG8gd29yayBwcm9wZXJseSBpbiB0aGF0IHNpdHVhdGlvbi4KaW1wb3J0IHBpcC5jbWRvcHRpb25zCmNtZG9wdGlvbnMgPSBwaXAuY21kb3B0aW9ucwoKIyBUaGUgdmVyc2lvbiBhcyB1c2VkIGluIHRoZSBzZXR1cC5weSBhbmQgdGhlIGRvY3MgY29uZi5weQpfX3ZlcnNpb25fXyA9ICI5LjAuMyIKCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCiMgSGlkZSB0aGUgSW5zZWN1cmVSZXF1ZXN0V2FybmluZyBmcm9tIHVybGxpYjMKd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsIGNhdGVnb3J5PUluc2VjdXJlUmVxdWVzdFdhcm5pbmcpCgoKZGVmIGF1dG9jb21wbGV0ZSgpOgogICAgIiIiQ29tbWFuZCBhbmQgb3B0aW9uIGNvbXBsZXRpb24gZm9yIHRoZSBtYWluIG9wdGlvbiBwYXJzZXIgKGFuZCBvcHRpb25zKQogICAgYW5kIGl0cyBzdWJjb21tYW5kcyAoYW5kIG9wdGlvbnMpLgoKICAgIEVuYWJsZSBieSBzb3VyY2luZyBvbmUgb2YgdGhlIGNvbXBsZXRpb24gc2hlbGwgc2NyaXB0cyAoYmFzaCwgenNoIG9yIGZpc2gpLgogICAgIiIiCiAgICAjIERvbid0IGNvbXBsZXRlIGlmIHVzZXIgaGFzbid0IHNvdXJjZWQgYmFzaF9jb21wbGV0aW9uIGZpbGUuCiAgICBpZiAnUElQX0FVVE9fQ09NUExFVEUnIG5vdCBpbiBvcy5lbnZpcm9uOgogICAgICAgIHJldHVybgogICAgY3dvcmRzID0gb3MuZW52aXJvblsnQ09NUF9XT1JEUyddLnNwbGl0KClbMTpdCiAgICBjd29yZCA9IGludChvcy5lbnZpcm9uWydDT01QX0NXT1JEJ10pCiAgICB0cnk6CiAgICAgICAgY3VycmVudCA9IGN3b3Jkc1tjd29yZCAtIDFdCiAgICBleGNlcHQgSW5kZXhFcnJvcjoKICAgICAgICBjdXJyZW50ID0gJycKCiAgICBzdWJjb21tYW5kcyA9IFtjbWQgZm9yIGNtZCwgc3VtbWFyeSBpbiBnZXRfc3VtbWFyaWVzKCldCiAgICBvcHRpb25zID0gW10KICAgICMgc3ViY29tbWFuZAogICAgdHJ5OgogICAgICAgIHN1YmNvbW1hbmRfbmFtZSA9IFt3IGZvciB3IGluIGN3b3JkcyBpZiB3IGluIHN1YmNvbW1hbmRzXVswXQogICAgZXhjZXB0IEluZGV4RXJyb3I6CiAgICAgICAgc3ViY29tbWFuZF9uYW1lID0gTm9uZQoKICAgIHBhcnNlciA9IGNyZWF0ZV9tYWluX3BhcnNlcigpCiAgICAjIHN1YmNvbW1hbmQgb3B0aW9ucwogICAgaWYgc3ViY29tbWFuZF9uYW1lOgogICAgICAgICMgc3BlY2lhbCBjYXNlOiAnaGVscCcgc3ViY29tbWFuZCBoYXMgbm8gb3B0aW9ucwogICAgICAgIGlmIHN1YmNvbW1hbmRfbmFtZSA9PSAnaGVscCc6CiAgICAgICAgICAgIHN5cy5leGl0KDEpCiAgICAgICAgIyBzcGVjaWFsIGNhc2U6IGxpc3QgbG9jYWxseSBpbnN0YWxsZWQgZGlzdHMgZm9yIHVuaW5zdGFsbCBjb21tYW5kCiAgICAgICAgaWYgc3ViY29tbWFuZF9uYW1lID09ICd1bmluc3RhbGwnIGFuZCBub3QgY3VycmVudC5zdGFydHN3aXRoKCctJyk6CiAgICAgICAgICAgIGluc3RhbGxlZCA9IFtdCiAgICAgICAgICAgIGxjID0gY3VycmVudC5sb3dlcigpCiAgICAgICAgICAgIGZvciBkaXN0IGluIGdldF9pbnN0YWxsZWRfZGlzdHJpYnV0aW9ucyhsb2NhbF9vbmx5PVRydWUpOgogICAgICAgICAgICAgICAgaWYgZGlzdC5rZXkuc3RhcnRzd2l0aChsYykgYW5kIGRpc3Qua2V5IG5vdCBpbiBjd29yZHNbMTpdOgogICAgICAgICAgICAgICAgICAgIGluc3RhbGxlZC5hcHBlbmQoZGlzdC5rZXkpCiAgICAgICAgICAgICMgaWYgdGhlcmUgYXJlIG5vIGRpc3RzIGluc3RhbGxlZCwgZmFsbCBiYWNrIHRvIG9wdGlvbiBjb21wbGV0aW9uCiAgICAgICAgICAgIGlmIGluc3RhbGxlZDoKICAgICAgICAgICAgICAgIGZvciBkaXN0IGluIGluc3RhbGxlZDoKICAgICAgICAgICAgICAgICAgICBwcmludChkaXN0KQogICAgICAgICAgICAgICAgc3lzLmV4aXQoMSkKCiAgICAgICAgc3ViY29tbWFuZCA9IGNvbW1hbmRzX2RpY3Rbc3ViY29tbWFuZF9uYW1lXSgpCiAgICAgICAgb3B0aW9ucyArPSBbKG9wdC5nZXRfb3B0X3N0cmluZygpLCBvcHQubmFyZ3MpCiAgICAgICAgICAgICAgICAgICAgZm9yIG9wdCBpbiBzdWJjb21tYW5kLnBhcnNlci5vcHRpb25fbGlzdF9hbGwKICAgICAgICAgICAgICAgICAgICBpZiBvcHQuaGVscCAhPSBvcHRwYXJzZS5TVVBQUkVTU19IRUxQXQoKICAgICAgICAjIGZpbHRlciBvdXQgcHJldmlvdXNseSBzcGVjaWZpZWQgb3B0aW9ucyBmcm9tIGF2YWlsYWJsZSBvcHRpb25zCiAgICAgICAgcHJldl9vcHRzID0gW3guc3BsaXQoJz0nKVswXSBmb3IgeCBpbiBjd29yZHNbMTpjd29yZCAtIDFdXQogICAgICAgIG9wdGlvbnMgPSBbKHgsIHYpIGZvciAoeCwgdikgaW4gb3B0aW9ucyBpZiB4IG5vdCBpbiBwcmV2X29wdHNdCiAgICAgICAgIyBmaWx0ZXIgb3B0aW9ucyBieSBjdXJyZW50IGlucHV0CiAgICAgICAgb3B0aW9ucyA9IFsoaywgdikgZm9yIGssIHYgaW4gb3B0aW9ucyBpZiBrLnN0YXJ0c3dpdGgoY3VycmVudCldCiAgICAgICAgZm9yIG9wdGlvbiBpbiBvcHRpb25zOgogICAgICAgICAgICBvcHRfbGFiZWwgPSBvcHRpb25bMF0KICAgICAgICAgICAgIyBhcHBlbmQgJz0nIHRvIG9wdGlvbnMgd2hpY2ggcmVxdWlyZSBhcmdzCiAgICAgICAgICAgIGlmIG9wdGlvblsxXToKICAgICAgICAgICAgICAgIG9wdF9sYWJlbCArPSAnPScKICAgICAgICAgICAgcHJpbnQob3B0X2xhYmVsKQogICAgZWxzZToKICAgICAgICAjIHNob3cgbWFpbiBwYXJzZXIgb3B0aW9ucyBvbmx5IHdoZW4gbmVjZXNzYXJ5CiAgICAgICAgaWYgY3VycmVudC5zdGFydHN3aXRoKCctJykgb3IgY3VycmVudC5zdGFydHN3aXRoKCctLScpOgogICAgICAgICAgICBvcHRzID0gW2kub3B0aW9uX2xpc3QgZm9yIGkgaW4gcGFyc2VyLm9wdGlvbl9ncm91cHNdCiAgICAgICAgICAgIG9wdHMuYXBwZW5kKHBhcnNlci5vcHRpb25fbGlzdCkKICAgICAgICAgICAgb3B0cyA9IChvIGZvciBpdCBpbiBvcHRzIGZvciBvIGluIGl0KQoKICAgICAgICAgICAgc3ViY29tbWFuZHMgKz0gW2kuZ2V0X29wdF9zdHJpbmcoKSBmb3IgaSBpbiBvcHRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBpLmhlbHAgIT0gb3B0cGFyc2UuU1VQUFJFU1NfSEVMUF0KCiAgICAgICAgcHJpbnQoJyAnLmpvaW4oW3ggZm9yIHggaW4gc3ViY29tbWFuZHMgaWYgeC5zdGFydHN3aXRoKGN1cnJlbnQpXSkpCiAgICBzeXMuZXhpdCgxKQoKCmRlZiBjcmVhdGVfbWFpbl9wYXJzZXIoKToKICAgIHBhcnNlcl9rdyA9IHsKICAgICAgICAndXNhZ2UnOiAnXG4lcHJvZyA8Y29tbWFuZD4gW29wdGlvbnNdJywKICAgICAgICAnYWRkX2hlbHBfb3B0aW9uJzogRmFsc2UsCiAgICAgICAgJ2Zvcm1hdHRlcic6IFVwZGF0aW5nRGVmYXVsdHNIZWxwRm9ybWF0dGVyKCksCiAgICAgICAgJ25hbWUnOiAnZ2xvYmFsJywKICAgICAgICAncHJvZyc6IGdldF9wcm9nKCksCiAgICB9CgogICAgcGFyc2VyID0gQ29uZmlnT3B0aW9uUGFyc2VyKCoqcGFyc2VyX2t3KQogICAgcGFyc2VyLmRpc2FibGVfaW50ZXJzcGVyc2VkX2FyZ3MoKQoKICAgIHBpcF9wa2dfZGlyID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmFic3BhdGgoX19maWxlX18pKSkKICAgIHBhcnNlci52ZXJzaW9uID0gJ3BpcCAlcyBmcm9tICVzIChweXRob24gJXMpJyAlICgKICAgICAgICBfX3ZlcnNpb25fXywgcGlwX3BrZ19kaXIsIHN5cy52ZXJzaW9uWzozXSkKCiAgICAjIGFkZCB0aGUgZ2VuZXJhbCBvcHRpb25zCiAgICBnZW5fb3B0cyA9IGNtZG9wdGlvbnMubWFrZV9vcHRpb25fZ3JvdXAoY21kb3B0aW9ucy5nZW5lcmFsX2dyb3VwLCBwYXJzZXIpCiAgICBwYXJzZXIuYWRkX29wdGlvbl9ncm91cChnZW5fb3B0cykKCiAgICBwYXJzZXIubWFpbiA9IFRydWUgICMgc28gdGhlIGhlbHAgZm9ybWF0dGVyIGtub3dzCgogICAgIyBjcmVhdGUgY29tbWFuZCBsaXN0aW5nIGZvciBkZXNjcmlwdGlvbgogICAgY29tbWFuZF9zdW1tYXJpZXMgPSBnZXRfc3VtbWFyaWVzKCkKICAgIGRlc2NyaXB0aW9uID0gWycnXSArIFsnJS0yN3MgJXMnICUgKGksIGopIGZvciBpLCBqIGluIGNvbW1hbmRfc3VtbWFyaWVzXQogICAgcGFyc2VyLmRlc2NyaXB0aW9uID0gJ1xuJy5qb2luKGRlc2NyaXB0aW9uKQoKICAgIHJldHVybiBwYXJzZXIKCgpkZWYgcGFyc2VvcHRzKGFyZ3MpOgogICAgcGFyc2VyID0gY3JlYXRlX21haW5fcGFyc2VyKCkKCiAgICAjIE5vdGU6IHBhcnNlciBjYWxscyBkaXNhYmxlX2ludGVyc3BlcnNlZF9hcmdzKCksIHNvIHRoZSByZXN1bHQgb2YgdGhpcwogICAgIyBjYWxsIGlzIHRvIHNwbGl0IHRoZSBpbml0aWFsIGFyZ3MgaW50byB0aGUgZ2VuZXJhbCBvcHRpb25zIGJlZm9yZSB0aGUKICAgICMgc3ViY29tbWFuZCBhbmQgZXZlcnl0aGluZyBlbHNlLgogICAgIyBGb3IgZXhhbXBsZToKICAgICMgIGFyZ3M6IFsnLS10aW1lb3V0PTUnLCAnaW5zdGFsbCcsICctLXVzZXInLCAnSU5JVG9vbHMnXQogICAgIyAgZ2VuZXJhbF9vcHRpb25zOiBbJy0tdGltZW91dD09NSddCiAgICAjICBhcmdzX2Vsc2U6IFsnaW5zdGFsbCcsICctLXVzZXInLCAnSU5JVG9vbHMnXQogICAgZ2VuZXJhbF9vcHRpb25zLCBhcmdzX2Vsc2UgPSBwYXJzZXIucGFyc2VfYXJncyhhcmdzKQoKICAgICMgLS12ZXJzaW9uCiAgICBpZiBnZW5lcmFsX29wdGlvbnMudmVyc2lvbjoKICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKHBhcnNlci52ZXJzaW9uKQogICAgICAgIHN5cy5zdGRvdXQud3JpdGUob3MubGluZXNlcCkKICAgICAgICBzeXMuZXhpdCgpCgogICAgIyBwaXAgfHwgcGlwIGhlbHAgLT4gcHJpbnRfaGVscCgpCiAgICBpZiBub3QgYXJnc19lbHNlIG9yIChhcmdzX2Vsc2VbMF0gPT0gJ2hlbHAnIGFuZCBsZW4oYXJnc19lbHNlKSA9PSAxKToKICAgICAgICBwYXJzZXIucHJpbnRfaGVscCgpCiAgICAgICAgc3lzLmV4aXQoKQoKICAgICMgdGhlIHN1YmNvbW1hbmQgbmFtZQogICAgY21kX25hbWUgPSBhcmdzX2Vsc2VbMF0KCiAgICBpZiBjbWRfbmFtZSBub3QgaW4gY29tbWFuZHNfZGljdDoKICAgICAgICBndWVzcyA9IGdldF9zaW1pbGFyX2NvbW1hbmRzKGNtZF9uYW1lKQoKICAgICAgICBtc2cgPSBbJ3Vua25vd24gY29tbWFuZCAiJXMiJyAlIGNtZF9uYW1lXQogICAgICAgIGlmIGd1ZXNzOgogICAgICAgICAgICBtc2cuYXBwZW5kKCdtYXliZSB5b3UgbWVhbnQgIiVzIicgJSBndWVzcykKCiAgICAgICAgcmFpc2UgQ29tbWFuZEVycm9yKCcgLSAnLmpvaW4obXNnKSkKCiAgICAjIGFsbCB0aGUgYXJncyB3aXRob3V0IHRoZSBzdWJjb21tYW5kCiAgICBjbWRfYXJncyA9IGFyZ3NbOl0KICAgIGNtZF9hcmdzLnJlbW92ZShjbWRfbmFtZSkKCiAgICByZXR1cm4gY21kX25hbWUsIGNtZF9hcmdzCgoKZGVmIGNoZWNrX2lzb2xhdGVkKGFyZ3MpOgogICAgaXNvbGF0ZWQgPSBGYWxzZQoKICAgIGlmICItLWlzb2xhdGVkIiBpbiBhcmdzOgogICAgICAgIGlzb2xhdGVkID0gVHJ1ZQoKICAgIHJldHVybiBpc29sYXRlZAoKCmRlZiBtYWluKGFyZ3M9Tm9uZSk6CiAgICBpZiBhcmdzIGlzIE5vbmU6CiAgICAgICAgYXJncyA9IHN5cy5hcmd2WzE6XQoKICAgICMgQ29uZmlndXJlIG91ciBkZXByZWNhdGlvbiB3YXJuaW5ncyB0byBiZSBzZW50IHRocm91Z2ggbG9nZ2VycwogICAgZGVwcmVjYXRpb24uaW5zdGFsbF93YXJuaW5nX2xvZ2dlcigpCgogICAgYXV0b2NvbXBsZXRlKCkKCiAgICB0cnk6CiAgICAgICAgY21kX25hbWUsIGNtZF9hcmdzID0gcGFyc2VvcHRzKGFyZ3MpCiAgICBleGNlcHQgUGlwRXJyb3IgYXMgZXhjOgogICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIkVSUk9SOiAlcyIgJSBleGMpCiAgICAgICAgc3lzLnN0ZGVyci53cml0ZShvcy5saW5lc2VwKQogICAgICAgIHN5cy5leGl0KDEpCgogICAgIyBOZWVkZWQgZm9yIGxvY2FsZS5nZXRwcmVmZXJyZWRlbmNvZGluZyhGYWxzZSkgdG8gd29yawogICAgIyBpbiBwaXAudXRpbHMuZW5jb2RpbmcuYXV0b19kZWNvZGUKICAgIHRyeToKICAgICAgICBsb2NhbGUuc2V0bG9jYWxlKGxvY2FsZS5MQ19BTEwsICcnKQogICAgZXhjZXB0IGxvY2FsZS5FcnJvciBhcyBlOgogICAgICAgICMgc2V0bG9jYWxlIGNhbiBhcHBhcmVudGx5IGNyYXNoIGlmIGxvY2FsZSBhcmUgdW5pbml0aWFsaXplZAogICAgICAgIGxvZ2dlci5kZWJ1ZygiSWdub3JpbmcgZXJyb3IgJXMgd2hlbiBzZXR0aW5nIGxvY2FsZSIsIGUpCiAgICBjb21tYW5kID0gY29tbWFuZHNfZGljdFtjbWRfbmFtZV0oaXNvbGF0ZWQ9Y2hlY2tfaXNvbGF0ZWQoY21kX2FyZ3MpKQogICAgcmV0dXJuIGNvbW1hbmQubWFpbihjbWRfYXJncykKCgojICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgIyBXcml0aW5nIGZyZWV6ZSBmaWxlcwoKY2xhc3MgRnJvemVuUmVxdWlyZW1lbnQob2JqZWN0KToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgcmVxLCBlZGl0YWJsZSwgY29tbWVudHM9KCkpOgogICAgICAgIHNlbGYubmFtZSA9IG5hbWUKICAgICAgICBzZWxmLnJlcSA9IHJlcQogICAgICAgIHNlbGYuZWRpdGFibGUgPSBlZGl0YWJsZQogICAgICAgIHNlbGYuY29tbWVudHMgPSBjb21tZW50cwoKICAgIF9yZXZfcmUgPSByZS5jb21waWxlKHInLXIoXGQrKSQnKQogICAgX2RhdGVfcmUgPSByZS5jb21waWxlKHInLSgyMFxkXGRcZFxkXGRcZCkkJykKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBmcm9tX2Rpc3QoY2xzLCBkaXN0LCBkZXBlbmRlbmN5X2xpbmtzKToKICAgICAgICBsb2NhdGlvbiA9IG9zLnBhdGgubm9ybWNhc2Uob3MucGF0aC5hYnNwYXRoKGRpc3QubG9jYXRpb24pKQogICAgICAgIGNvbW1lbnRzID0gW10KICAgICAgICBmcm9tIHBpcC52Y3MgaW1wb3J0IHZjcywgZ2V0X3NyY19yZXF1aXJlbWVudAogICAgICAgIGlmIGRpc3RfaXNfZWRpdGFibGUoZGlzdCkgYW5kIHZjcy5nZXRfYmFja2VuZF9uYW1lKGxvY2F0aW9uKToKICAgICAgICAgICAgZWRpdGFibGUgPSBUcnVlCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJlcSA9IGdldF9zcmNfcmVxdWlyZW1lbnQoZGlzdCwgbG9jYXRpb24pCiAgICAgICAgICAgIGV4Y2VwdCBJbnN0YWxsYXRpb25FcnJvciBhcyBleGM6CiAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICAgICAiRXJyb3Igd2hlbiB0cnlpbmcgdG8gZ2V0IHJlcXVpcmVtZW50IGZvciBWQ1Mgc3lzdGVtICVzLCAiCiAgICAgICAgICAgICAgICAgICAgImZhbGxpbmcgYmFjayB0byB1bmVkaXRhYmxlIGZvcm1hdCIsIGV4YwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgcmVxID0gTm9uZQogICAgICAgICAgICBpZiByZXEgaXMgTm9uZToKICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgICAgICdDb3VsZCBub3QgZGV0ZXJtaW5lIHJlcG9zaXRvcnkgbG9jYXRpb24gb2YgJXMnLCBsb2NhdGlvbgogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgY29tbWVudHMuYXBwZW5kKAogICAgICAgICAgICAgICAgICAgICcjIyAhISBDb3VsZCBub3QgZGV0ZXJtaW5lIHJlcG9zaXRvcnkgbG9jYXRpb24nCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICByZXEgPSBkaXN0LmFzX3JlcXVpcmVtZW50KCkKICAgICAgICAgICAgICAgIGVkaXRhYmxlID0gRmFsc2UKICAgICAgICBlbHNlOgogICAgICAgICAgICBlZGl0YWJsZSA9IEZhbHNlCiAgICAgICAgICAgIHJlcSA9IGRpc3QuYXNfcmVxdWlyZW1lbnQoKQogICAgICAgICAgICBzcGVjcyA9IHJlcS5zcGVjcwogICAgICAgICAgICBhc3NlcnQgbGVuKHNwZWNzKSA9PSAxIGFuZCBzcGVjc1swXVswXSBpbiBbIj09IiwgIj09PSJdLCBcCiAgICAgICAgICAgICAgICAnRXhwZWN0ZWQgMSBzcGVjIHdpdGggPT0gb3IgPT09OyBzcGVjcyA9ICVyOyBkaXN0ID0gJXInICUgXAogICAgICAgICAgICAgICAgKHNwZWNzLCBkaXN0KQogICAgICAgICAgICB2ZXJzaW9uID0gc3BlY3NbMF1bMV0KICAgICAgICAgICAgdmVyX21hdGNoID0gY2xzLl9yZXZfcmUuc2VhcmNoKHZlcnNpb24pCiAgICAgICAgICAgIGRhdGVfbWF0Y2ggPSBjbHMuX2RhdGVfcmUuc2VhcmNoKHZlcnNpb24pCiAgICAgICAgICAgIGlmIHZlcl9tYXRjaCBvciBkYXRlX21hdGNoOgogICAgICAgICAgICAgICAgc3ZuX2JhY2tlbmQgPSB2Y3MuZ2V0X2JhY2tlbmQoJ3N2bicpCiAgICAgICAgICAgICAgICBpZiBzdm5fYmFja2VuZDoKICAgICAgICAgICAgICAgICAgICBzdm5fbG9jYXRpb24gPSBzdm5fYmFja2VuZCgpLmdldF9sb2NhdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgZGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jeV9saW5rcywKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBpZiBub3Qgc3ZuX2xvY2F0aW9uOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAnV2FybmluZzogY2Fubm90IGZpbmQgc3ZuIGxvY2F0aW9uIGZvciAlcycsIHJlcSkKICAgICAgICAgICAgICAgICAgICBjb21tZW50cy5hcHBlbmQoCiAgICAgICAgICAgICAgICAgICAgICAgICcjIyBGSVhNRTogY291bGQgbm90IGZpbmQgc3ZuIFVSTCBpbiBkZXBlbmRlbmN5X2xpbmtzICcKICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvciB0aGlzIHBhY2thZ2U6JwogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgY29tbWVudHMuYXBwZW5kKAogICAgICAgICAgICAgICAgICAgICAgICAnIyBJbnN0YWxsaW5nIGFzIGVkaXRhYmxlIHRvIHNhdGlzZnkgcmVxdWlyZW1lbnQgJXM6JyAlCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICBpZiB2ZXJfbWF0Y2g6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldiA9IHZlcl9tYXRjaC5ncm91cCgxKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldiA9ICd7JXN9JyAlIGRhdGVfbWF0Y2guZ3JvdXAoMSkKICAgICAgICAgICAgICAgICAgICBlZGl0YWJsZSA9IFRydWUKICAgICAgICAgICAgICAgICAgICByZXEgPSAnJXNAJXMjZWdnPSVzJyAlICgKICAgICAgICAgICAgICAgICAgICAgICAgc3ZuX2xvY2F0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICByZXYsCiAgICAgICAgICAgICAgICAgICAgICAgIGNscy5lZ2dfbmFtZShkaXN0KQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICByZXR1cm4gY2xzKGRpc3QucHJvamVjdF9uYW1lLCByZXEsIGVkaXRhYmxlLCBjb21tZW50cykKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgZWdnX25hbWUoZGlzdCk6CiAgICAgICAgbmFtZSA9IGRpc3QuZWdnX25hbWUoKQogICAgICAgIG1hdGNoID0gcmUuc2VhcmNoKHInLXB5XGRcLlxkJCcsIG5hbWUpCiAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgIG5hbWUgPSBuYW1lWzptYXRjaC5zdGFydCgpXQogICAgICAgIHJldHVybiBuYW1lCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmVxID0gc2VsZi5yZXEKICAgICAgICBpZiBzZWxmLmVkaXRhYmxlOgogICAgICAgICAgICByZXEgPSAnLWUgJXMnICUgcmVxCiAgICAgICAgcmV0dXJuICdcbicuam9pbihsaXN0KHNlbGYuY29tbWVudHMpICsgW3N0cihyZXEpXSkgKyAnXG4nCgoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIHN5cy5leGl0KG1haW4oKSkKUEsDBBQAAAAAAAAAIQBLSaRlSAIAAEgCAAAfAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fX21haW5fXy5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgb3MKaW1wb3J0IHN5cwoKIyBJZiB3ZSBhcmUgcnVubmluZyBmcm9tIGEgd2hlZWwsIGFkZCB0aGUgd2hlZWwgdG8gc3lzLnBhdGgKIyBUaGlzIGFsbG93cyB0aGUgdXNhZ2UgcHl0aG9uIHBpcC0qLndobC9waXAgaW5zdGFsbCBwaXAtKi53aGwKaWYgX19wYWNrYWdlX18gPT0gJyc6CiAgICAjIF9fZmlsZV9fIGlzIHBpcC0qLndobC9waXAvX19tYWluX18ucHkKICAgICMgZmlyc3QgZGlybmFtZSBjYWxsIHN0cmlwcyBvZiAnL19fbWFpbl9fLnB5Jywgc2Vjb25kIHN0cmlwcyBvZmYgJy9waXAnCiAgICAjIFJlc3VsdGluZyBwYXRoIGlzIHRoZSBuYW1lIG9mIHRoZSB3aGVlbCBpdHNlbGYKICAgICMgQWRkIHRoYXQgdG8gc3lzLnBhdGggc28gd2UgY2FuIGltcG9ydCBwaXAKICAgIHBhdGggPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkKICAgIHN5cy5wYXRoLmluc2VydCgwLCBwYXRoKQoKaW1wb3J0IHBpcCAgIyBub3FhCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgc3lzLmV4aXQocGlwLm1haW4oKSkKUEsDBBQAAAAAAAAAIQBPvcxIPhIAAD4SAAAnAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL19faW5pdF9fLnB5IiIiCnBpcC5fdmVuZG9yIGlzIGZvciB2ZW5kb3JpbmcgZGVwZW5kZW5jaWVzIG9mIHBpcCB0byBwcmV2ZW50IG5lZWRpbmcgcGlwIHRvCmRlcGVuZCBvbiBzb21ldGhpbmcgZXh0ZXJuYWwuCgpGaWxlcyBpbnNpZGUgb2YgcGlwLl92ZW5kb3Igc2hvdWxkIGJlIGNvbnNpZGVyZWQgaW1tdXRhYmxlIGFuZCBzaG91bGQgb25seSBiZQp1cGRhdGVkIHRvIHZlcnNpb25zIGZyb20gdXBzdHJlYW0uCiIiIgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGdsb2IKaW1wb3J0IG9zLnBhdGgKaW1wb3J0IHN5cwoKIyBEb3duc3RyZWFtIHJlZGlzdHJpYnV0b3JzIHdoaWNoIGhhdmUgZGVidW5kbGVkIG91ciBkZXBlbmRlbmNpZXMgc2hvdWxkIGFsc28KIyBwYXRjaCB0aGlzIHZhbHVlIHRvIGJlIHRydWUuIFRoaXMgd2lsbCB0cmlnZ2VyIHRoZSBhZGRpdGlvbmFsIHBhdGNoaW5nCiMgdG8gY2F1c2UgdGhpbmdzIGxpa2UgInNpeCIgdG8gYmUgYXZhaWxhYmxlIGFzIHBpcC4KREVCVU5ETEVEID0gRmFsc2UKCiMgQnkgZGVmYXVsdCwgbG9vayBpbiB0aGlzIGRpcmVjdG9yeSBmb3IgYSBidW5jaCBvZiAud2hsIGZpbGVzIHdoaWNoIHdlIHdpbGwKIyBhZGQgdG8gdGhlIGJlZ2lubmluZyBvZiBzeXMucGF0aCBiZWZvcmUgYXR0ZW1wdGluZyB0byBpbXBvcnQgYW55dGhpbmcuIFRoaXMKIyBpcyBkb25lIHRvIHN1cHBvcnQgZG93bnN0cmVhbSByZS1kaXN0cmlidXRvcnMgbGlrZSBEZWJpYW4gYW5kIEZlZG9yYSB3aG8KIyB3aXNoIHRvIGNyZWF0ZSB0aGVpciBvd24gV2hlZWxzIGZvciBvdXIgZGVwZW5kZW5jaWVzIHRvIGFpZCBpbiBkZWJ1bmRsaW5nLgpXSEVFTF9ESVIgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkKCgojIERlZmluZSBhIHNtYWxsIGhlbHBlciBmdW5jdGlvbiB0byBhbGlhcyBvdXIgdmVuZG9yZWQgbW9kdWxlcyB0byB0aGUgcmVhbCBvbmVzCiMgaWYgdGhlIHZlbmRvcmVkIG9uZXMgZG8gbm90IGV4aXN0LiBUaGlzIGlkZWEgb2YgdGhpcyB3YXMgdGFrZW4gZnJvbQojIGh0dHBzOi8vZ2l0aHViLmNvbS9rZW5uZXRocmVpdHovcmVxdWVzdHMvcHVsbC8yNTY3LgpkZWYgdmVuZG9yZWQobW9kdWxlbmFtZSk6CiAgICB2ZW5kb3JlZF9uYW1lID0gInswfS57MX0iLmZvcm1hdChfX25hbWVfXywgbW9kdWxlbmFtZSkKCiAgICB0cnk6CiAgICAgICAgX19pbXBvcnRfXyh2ZW5kb3JlZF9uYW1lLCBnbG9iYWxzKCksIGxvY2FscygpLCBsZXZlbD0wKQogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIHRyeToKICAgICAgICAgICAgX19pbXBvcnRfXyhtb2R1bGVuYW1lLCBnbG9iYWxzKCksIGxvY2FscygpLCBsZXZlbD0wKQogICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgICAgIyBXZSBjYW4ganVzdCBzaWxlbnRseSBhbGxvdyBpbXBvcnQgZmFpbHVyZXMgdG8gcGFzcyBoZXJlLiBJZiB3ZQogICAgICAgICAgICAjIGdvdCB0byB0aGlzIHBvaW50IGl0IG1lYW5zIHRoYXQgYGBpbXBvcnQgcGlwLl92ZW5kb3Iud2hhdGV2ZXJgYAogICAgICAgICAgICAjIGZhaWxlZCBhbmQgc28gZGlkIGBgaW1wb3J0IHdoYXRldmVyYGAuIFNpbmNlIHdlJ3JlIGltcG9ydGluZyB0aGlzCiAgICAgICAgICAgICMgdXBmcm9udCBpbiBhbiBhdHRlbXB0IHRvIGFsaWFzIGltcG9ydHMsIG5vdCBlcnJvcmluZyBoZXJlIHdpbGwKICAgICAgICAgICAgIyBqdXN0IG1lYW4gd2UgZ2V0IGEgcmVndWxhciBpbXBvcnQgZXJyb3Igd2hlbmV2ZXIgcGlwICphY3R1YWxseSoKICAgICAgICAgICAgIyB0cmllcyB0byBpbXBvcnQgb25lIG9mIHRoZXNlIG1vZHVsZXMgdG8gdXNlIGl0LCB3aGljaCBhY3R1YWxseQogICAgICAgICAgICAjIGdpdmVzIHVzIGEgYmV0dGVyIGVycm9yIG1lc3NhZ2UgdGhhbiB3ZSB3b3VsZCBoYXZlIG90aGVyd2lzZQogICAgICAgICAgICAjIGdvdHRlbi4KICAgICAgICAgICAgcGFzcwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHN5cy5tb2R1bGVzW3ZlbmRvcmVkX25hbWVdID0gc3lzLm1vZHVsZXNbbW9kdWxlbmFtZV0KICAgICAgICAgICAgYmFzZSwgaGVhZCA9IHZlbmRvcmVkX25hbWUucnNwbGl0KCIuIiwgMSkKICAgICAgICAgICAgc2V0YXR0cihzeXMubW9kdWxlc1tiYXNlXSwgaGVhZCwgc3lzLm1vZHVsZXNbbW9kdWxlbmFtZV0pCgoKIyBJZiB3ZSdyZSBvcGVyYXRpbmcgaW4gYSBkZWJ1bmRsZWQgc2V0dXAsIHRoZW4gd2Ugd2FudCB0byBnbyBhaGVhZCBhbmQgdHJpZ2dlcgojIHRoZSBhbGlhc2luZyBvZiBvdXIgdmVuZG9yZWQgbGlicmFyaWVzIGFzIHdlbGwgYXMgbG9va2luZyBmb3Igd2hlZWxzIHRvIGFkZAojIHRvIG91ciBzeXMucGF0aC4gVGhpcyB3aWxsIGNhdXNlIGFsbCBvZiB0aGlzIGNvZGUgdG8gYmUgYSBuby1vcCB0eXBpY2FsbHkKIyBob3dldmVyIGRvd25zdHJlYW0gcmVkaXN0cmlidXRvcnMgY2FuIGVuYWJsZSBpdCBpbiBhIGNvbnNpc3RlbnQgd2F5IGFjcm9zcwojIGFsbCBwbGF0Zm9ybXMuCmlmIERFQlVORExFRDoKICAgICMgQWN0dWFsbHkgbG9vayBpbnNpZGUgb2YgV0hFRUxfRElSIHRvIGZpbmQgLndobCBmaWxlcyBhbmQgYWRkIHRoZW0gdG8gdGhlCiAgICAjIGZyb250IG9mIG91ciBzeXMucGF0aC4KICAgIHN5cy5wYXRoWzpdID0gZ2xvYi5nbG9iKG9zLnBhdGguam9pbihXSEVFTF9ESVIsICIqLndobCIpKSArIHN5cy5wYXRoCgogICAgIyBBY3R1YWxseSBhbGlhcyBhbGwgb2Ygb3VyIHZlbmRvcmVkIGRlcGVuZGVuY2llcy4KICAgIHZlbmRvcmVkKCJjYWNoZWNvbnRyb2wiKQogICAgdmVuZG9yZWQoImNvbG9yYW1hIikKICAgIHZlbmRvcmVkKCJkaXN0bGliIikKICAgIHZlbmRvcmVkKCJkaXN0cm8iKQogICAgdmVuZG9yZWQoImh0bWw1bGliIikKICAgIHZlbmRvcmVkKCJsb2NrZmlsZSIpCiAgICB2ZW5kb3JlZCgic2l4IikKICAgIHZlbmRvcmVkKCJzaXgubW92ZXMiKQogICAgdmVuZG9yZWQoInNpeC5tb3Zlcy51cmxsaWIiKQogICAgdmVuZG9yZWQoInBhY2thZ2luZyIpCiAgICB2ZW5kb3JlZCgicGFja2FnaW5nLnZlcnNpb24iKQogICAgdmVuZG9yZWQoInBhY2thZ2luZy5zcGVjaWZpZXJzIikKICAgIHZlbmRvcmVkKCJwa2dfcmVzb3VyY2VzIikKICAgIHZlbmRvcmVkKCJwcm9ncmVzcyIpCiAgICB2ZW5kb3JlZCgicmV0cnlpbmciKQogICAgdmVuZG9yZWQoInJlcXVlc3RzIikKICAgIHZlbmRvcmVkKCJyZXF1ZXN0cy5wYWNrYWdlcyIpCiAgICB2ZW5kb3JlZCgicmVxdWVzdHMucGFja2FnZXMudXJsbGliMyIpCiAgICB2ZW5kb3JlZCgicmVxdWVzdHMucGFja2FnZXMudXJsbGliMy5fY29sbGVjdGlvbnMiKQogICAgdmVuZG9yZWQoInJlcXVlc3RzLnBhY2thZ2VzLnVybGxpYjMuY29ubmVjdGlvbiIpCiAgICB2ZW5kb3JlZCgicmVxdWVzdHMucGFja2FnZXMudXJsbGliMy5jb25uZWN0aW9ucG9vbCIpCiAgICB2ZW5kb3JlZCgicmVxdWVzdHMucGFja2FnZXMudXJsbGliMy5jb250cmliIikKICAgIHZlbmRvcmVkKCJyZXF1ZXN0cy5wYWNrYWdlcy51cmxsaWIzLmNvbnRyaWIubnRsbXBvb2wiKQogICAgdmVuZG9yZWQoInJlcXVlc3RzLnBhY2thZ2VzLnVybGxpYjMuY29udHJpYi5weW9wZW5zc2wiKQogICAgdmVuZG9yZWQoInJlcXVlc3RzLnBhY2thZ2VzLnVybGxpYjMuZXhjZXB0aW9ucyIpCiAgICB2ZW5kb3JlZCgicmVxdWVzdHMucGFja2FnZXMudXJsbGliMy5maWVsZHMiKQogICAgdmVuZG9yZWQoInJlcXVlc3RzLnBhY2thZ2VzLnVybGxpYjMuZmlsZXBvc3QiKQogICAgdmVuZG9yZWQoInJlcXVlc3RzLnBhY2thZ2VzLnVybGxpYjMucGFja2FnZXMiKQogICAgdmVuZG9yZWQoInJlcXVlc3RzLnBhY2thZ2VzLnVybGxpYjMucGFja2FnZXMub3JkZXJlZF9kaWN0IikKICAgIHZlbmRvcmVkKCJyZXF1ZXN0cy5wYWNrYWdlcy51cmxsaWIzLnBhY2thZ2VzLnNpeCIpCiAgICB2ZW5kb3JlZCgicmVxdWVzdHMucGFja2FnZXMudXJsbGliMy5wYWNrYWdlcy5zc2xfbWF0Y2hfaG9zdG5hbWUiKQogICAgdmVuZG9yZWQoInJlcXVlc3RzLnBhY2thZ2VzLnVybGxpYjMucGFja2FnZXMuc3NsX21hdGNoX2hvc3RuYW1lLiIKICAgICAgICAgICAgICJfaW1wbGVtZW50YXRpb24iKQogICAgdmVuZG9yZWQoInJlcXVlc3RzLnBhY2thZ2VzLnVybGxpYjMucG9vbG1hbmFnZXIiKQogICAgdmVuZG9yZWQoInJlcXVlc3RzLnBhY2thZ2VzLnVybGxpYjMucmVxdWVzdCIpCiAgICB2ZW5kb3JlZCgicmVxdWVzdHMucGFja2FnZXMudXJsbGliMy5yZXNwb25zZSIpCiAgICB2ZW5kb3JlZCgicmVxdWVzdHMucGFja2FnZXMudXJsbGliMy51dGlsIikKICAgIHZlbmRvcmVkKCJyZXF1ZXN0cy5wYWNrYWdlcy51cmxsaWIzLnV0aWwuY29ubmVjdGlvbiIpCiAgICB2ZW5kb3JlZCgicmVxdWVzdHMucGFja2FnZXMudXJsbGliMy51dGlsLnJlcXVlc3QiKQogICAgdmVuZG9yZWQoInJlcXVlc3RzLnBhY2thZ2VzLnVybGxpYjMudXRpbC5yZXNwb25zZSIpCiAgICB2ZW5kb3JlZCgicmVxdWVzdHMucGFja2FnZXMudXJsbGliMy51dGlsLnJldHJ5IikKICAgIHZlbmRvcmVkKCJyZXF1ZXN0cy5wYWNrYWdlcy51cmxsaWIzLnV0aWwuc3NsXyIpCiAgICB2ZW5kb3JlZCgicmVxdWVzdHMucGFja2FnZXMudXJsbGliMy51dGlsLnRpbWVvdXQiKQogICAgdmVuZG9yZWQoInJlcXVlc3RzLnBhY2thZ2VzLnVybGxpYjMudXRpbC51cmwiKQpQSwMEFAAAAAAAAAAhAIWJlopgVwAAYFcAACYAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvYXBwZGlycy5weSMhL3Vzci9iaW4vZW52IHB5dGhvbgojIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQojIENvcHlyaWdodCAoYykgMjAwNS0yMDEwIEFjdGl2ZVN0YXRlIFNvZnR3YXJlIEluYy4KIyBDb3B5cmlnaHQgKGMpIDIwMTMgRWRkeSBQZXRyaciZb3IKCiIiIlV0aWxpdGllcyBmb3IgZGV0ZXJtaW5pbmcgYXBwbGljYXRpb24tc3BlY2lmaWMgZGlycy4KClNlZSA8aHR0cDovL2dpdGh1Yi5jb20vQWN0aXZlU3RhdGUvYXBwZGlycz4gZm9yIGRldGFpbHMgYW5kIHVzYWdlLgoiIiIKIyBEZXYgTm90ZXM6CiMgLSBNU0ROIG9uIHdoZXJlIHRvIHN0b3JlIGFwcCBkYXRhIGZpbGVzOgojICAgaHR0cDovL3N1cHBvcnQubWljcm9zb2Z0LmNvbS9kZWZhdWx0LmFzcHg/c2NpZD1rYjtlbi11czszMTAyOTQjWFNMVEgzMTk0MTIxMTIzMTIwMTIxMTIwMTIwCiMgLSBtYWNPUzogaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vZG9jdW1lbnRhdGlvbi9NYWNPU1gvQ29uY2VwdHVhbC9CUEZpbGVTeXN0ZW0vaW5kZXguaHRtbAojIC0gWERHIHNwZWMgZm9yIFVuKng6IGh0dHA6Ly9zdGFuZGFyZHMuZnJlZWRlc2t0b3Aub3JnL2Jhc2VkaXItc3BlYy9iYXNlZGlyLXNwZWMtbGF0ZXN0Lmh0bWwKCl9fdmVyc2lvbl9pbmZvX18gPSAoMSwgNCwgMCkKX192ZXJzaW9uX18gPSAnLicuam9pbihtYXAoc3RyLCBfX3ZlcnNpb25faW5mb19fKSkKCgppbXBvcnQgc3lzCmltcG9ydCBvcwoKUFkzID0gc3lzLnZlcnNpb25faW5mb1swXSA9PSAzCgppZiBQWTM6CiAgICB1bmljb2RlID0gc3RyCgppZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnamF2YScpOgogICAgaW1wb3J0IHBsYXRmb3JtCiAgICBvc19uYW1lID0gcGxhdGZvcm0uamF2YV92ZXIoKVszXVswXQogICAgaWYgb3NfbmFtZS5zdGFydHN3aXRoKCdXaW5kb3dzJyk6ICMgIldpbmRvd3MgWFAiLCAiV2luZG93cyA3IiwgZXRjLgogICAgICAgIHN5c3RlbSA9ICd3aW4zMicKICAgIGVsaWYgb3NfbmFtZS5zdGFydHN3aXRoKCdNYWMnKTogIyAibWFjT1MiLCBldGMuCiAgICAgICAgc3lzdGVtID0gJ2RhcndpbicKICAgIGVsc2U6ICMgIkxpbnV4IiwgIlN1bk9TIiwgIkZyZWVCU0QiLCBldGMuCiAgICAgICAgIyBTZXR0aW5nIHRoaXMgdG8gImxpbnV4MiIgaXMgbm90IGlkZWFsLCBidXQgb25seSBXaW5kb3dzIG9yIE1hYwogICAgICAgICMgYXJlIGFjdHVhbGx5IGNoZWNrZWQgZm9yIGFuZCB0aGUgcmVzdCBvZiB0aGUgbW9kdWxlIGV4cGVjdHMKICAgICAgICAjICpzeXMucGxhdGZvcm0qIHN0eWxlIHN0cmluZ3MuCiAgICAgICAgc3lzdGVtID0gJ2xpbnV4MicKZWxzZToKICAgIHN5c3RlbSA9IHN5cy5wbGF0Zm9ybQoKCgpkZWYgdXNlcl9kYXRhX2RpcihhcHBuYW1lPU5vbmUsIGFwcGF1dGhvcj1Ob25lLCB2ZXJzaW9uPU5vbmUsIHJvYW1pbmc9RmFsc2UpOgogICAgciIiIlJldHVybiBmdWxsIHBhdGggdG8gdGhlIHVzZXItc3BlY2lmaWMgZGF0YSBkaXIgZm9yIHRoaXMgYXBwbGljYXRpb24uCgogICAgICAgICJhcHBuYW1lIiBpcyB0aGUgbmFtZSBvZiBhcHBsaWNhdGlvbi4KICAgICAgICAgICAgSWYgTm9uZSwganVzdCB0aGUgc3lzdGVtIGRpcmVjdG9yeSBpcyByZXR1cm5lZC4KICAgICAgICAiYXBwYXV0aG9yIiAob25seSB1c2VkIG9uIFdpbmRvd3MpIGlzIHRoZSBuYW1lIG9mIHRoZQogICAgICAgICAgICBhcHBhdXRob3Igb3IgZGlzdHJpYnV0aW5nIGJvZHkgZm9yIHRoaXMgYXBwbGljYXRpb24uIFR5cGljYWxseQogICAgICAgICAgICBpdCBpcyB0aGUgb3duaW5nIGNvbXBhbnkgbmFtZS4gVGhpcyBmYWxscyBiYWNrIHRvIGFwcG5hbWUuIFlvdSBtYXkKICAgICAgICAgICAgcGFzcyBGYWxzZSB0byBkaXNhYmxlIGl0LgogICAgICAgICJ2ZXJzaW9uIiBpcyBhbiBvcHRpb25hbCB2ZXJzaW9uIHBhdGggZWxlbWVudCB0byBhcHBlbmQgdG8gdGhlCiAgICAgICAgICAgIHBhdGguIFlvdSBtaWdodCB3YW50IHRvIHVzZSB0aGlzIGlmIHlvdSB3YW50IG11bHRpcGxlIHZlcnNpb25zCiAgICAgICAgICAgIG9mIHlvdXIgYXBwIHRvIGJlIGFibGUgdG8gcnVuIGluZGVwZW5kZW50bHkuIElmIHVzZWQsIHRoaXMKICAgICAgICAgICAgd291bGQgdHlwaWNhbGx5IGJlICI8bWFqb3I+LjxtaW5vcj4iLgogICAgICAgICAgICBPbmx5IGFwcGxpZWQgd2hlbiBhcHBuYW1lIGlzIHByZXNlbnQuCiAgICAgICAgInJvYW1pbmciIChib29sZWFuLCBkZWZhdWx0IEZhbHNlKSBjYW4gYmUgc2V0IFRydWUgdG8gdXNlIHRoZSBXaW5kb3dzCiAgICAgICAgICAgIHJvYW1pbmcgYXBwZGF0YSBkaXJlY3RvcnkuIFRoYXQgbWVhbnMgdGhhdCBmb3IgdXNlcnMgb24gYSBXaW5kb3dzCiAgICAgICAgICAgIG5ldHdvcmsgc2V0dXAgZm9yIHJvYW1pbmcgcHJvZmlsZXMsIHRoaXMgdXNlciBkYXRhIHdpbGwgYmUKICAgICAgICAgICAgc3luYydkIG9uIGxvZ2luLiBTZWUKICAgICAgICAgICAgPGh0dHA6Ly90ZWNobmV0Lm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9jYzc2NjQ4OShXUy4xMCkuYXNweD4KICAgICAgICAgICAgZm9yIGEgZGlzY3Vzc2lvbiBvZiBpc3N1ZXMuCgogICAgVHlwaWNhbCB1c2VyIGRhdGEgZGlyZWN0b3JpZXMgYXJlOgogICAgICAgIG1hY09TOiAgICAgICAgICAgICAgICAgIH4vTGlicmFyeS9BcHBsaWNhdGlvbiBTdXBwb3J0LzxBcHBOYW1lPgogICAgICAgIFVuaXg6ICAgICAgICAgICAgICAgICAgIH4vLmxvY2FsL3NoYXJlLzxBcHBOYW1lPiAgICAjIG9yIGluICRYREdfREFUQV9IT01FLCBpZiBkZWZpbmVkCiAgICAgICAgV2luIFhQIChub3Qgcm9hbWluZyk6ICAgQzpcRG9jdW1lbnRzIGFuZCBTZXR0aW5nc1w8dXNlcm5hbWU+XEFwcGxpY2F0aW9uIERhdGFcPEFwcEF1dGhvcj5cPEFwcE5hbWU+CiAgICAgICAgV2luIFhQIChyb2FtaW5nKTogICAgICAgQzpcRG9jdW1lbnRzIGFuZCBTZXR0aW5nc1w8dXNlcm5hbWU+XExvY2FsIFNldHRpbmdzXEFwcGxpY2F0aW9uIERhdGFcPEFwcEF1dGhvcj5cPEFwcE5hbWU+CiAgICAgICAgV2luIDcgIChub3Qgcm9hbWluZyk6ICAgQzpcVXNlcnNcPHVzZXJuYW1lPlxBcHBEYXRhXExvY2FsXDxBcHBBdXRob3I+XDxBcHBOYW1lPgogICAgICAgIFdpbiA3ICAocm9hbWluZyk6ICAgICAgIEM6XFVzZXJzXDx1c2VybmFtZT5cQXBwRGF0YVxSb2FtaW5nXDxBcHBBdXRob3I+XDxBcHBOYW1lPgoKICAgIEZvciBVbml4LCB3ZSBmb2xsb3cgdGhlIFhERyBzcGVjIGFuZCBzdXBwb3J0ICRYREdfREFUQV9IT01FLgogICAgVGhhdCBtZWFucywgYnkgZGVmYXVsdCAifi8ubG9jYWwvc2hhcmUvPEFwcE5hbWU+Ii4KICAgICIiIgogICAgaWYgc3lzdGVtID09ICJ3aW4zMiI6CiAgICAgICAgaWYgYXBwYXV0aG9yIGlzIE5vbmU6CiAgICAgICAgICAgIGFwcGF1dGhvciA9IGFwcG5hbWUKICAgICAgICBjb25zdCA9IHJvYW1pbmcgYW5kICJDU0lETF9BUFBEQVRBIiBvciAiQ1NJRExfTE9DQUxfQVBQREFUQSIKICAgICAgICBwYXRoID0gb3MucGF0aC5ub3JtcGF0aChfZ2V0X3dpbl9mb2xkZXIoY29uc3QpKQogICAgICAgIGlmIGFwcG5hbWU6CiAgICAgICAgICAgIGlmIGFwcGF1dGhvciBpcyBub3QgRmFsc2U6CiAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcGF1dGhvciwgYXBwbmFtZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwbmFtZSkKICAgIGVsaWYgc3lzdGVtID09ICdkYXJ3aW4nOgogICAgICAgIHBhdGggPSBvcy5wYXRoLmV4cGFuZHVzZXIoJ34vTGlicmFyeS9BcHBsaWNhdGlvbiBTdXBwb3J0LycpCiAgICAgICAgaWYgYXBwbmFtZToKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBuYW1lKQogICAgZWxzZToKICAgICAgICBwYXRoID0gb3MuZ2V0ZW52KCdYREdfREFUQV9IT01FJywgb3MucGF0aC5leHBhbmR1c2VyKCJ+Ly5sb2NhbC9zaGFyZSIpKQogICAgICAgIGlmIGFwcG5hbWU6CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwbmFtZSkKICAgIGlmIGFwcG5hbWUgYW5kIHZlcnNpb246CiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCB2ZXJzaW9uKQogICAgcmV0dXJuIHBhdGgKCgpkZWYgc2l0ZV9kYXRhX2RpcihhcHBuYW1lPU5vbmUsIGFwcGF1dGhvcj1Ob25lLCB2ZXJzaW9uPU5vbmUsIG11bHRpcGF0aD1GYWxzZSk6CiAgICAiIiJSZXR1cm4gZnVsbCBwYXRoIHRvIHRoZSB1c2VyLXNoYXJlZCBkYXRhIGRpciBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KCiAgICAgICAgImFwcG5hbWUiIGlzIHRoZSBuYW1lIG9mIGFwcGxpY2F0aW9uLgogICAgICAgICAgICBJZiBOb25lLCBqdXN0IHRoZSBzeXN0ZW0gZGlyZWN0b3J5IGlzIHJldHVybmVkLgogICAgICAgICJhcHBhdXRob3IiIChvbmx5IHVzZWQgb24gV2luZG93cykgaXMgdGhlIG5hbWUgb2YgdGhlCiAgICAgICAgICAgIGFwcGF1dGhvciBvciBkaXN0cmlidXRpbmcgYm9keSBmb3IgdGhpcyBhcHBsaWNhdGlvbi4gVHlwaWNhbGx5CiAgICAgICAgICAgIGl0IGlzIHRoZSBvd25pbmcgY29tcGFueSBuYW1lLiBUaGlzIGZhbGxzIGJhY2sgdG8gYXBwbmFtZS4gWW91IG1heQogICAgICAgICAgICBwYXNzIEZhbHNlIHRvIGRpc2FibGUgaXQuCiAgICAgICAgInZlcnNpb24iIGlzIGFuIG9wdGlvbmFsIHZlcnNpb24gcGF0aCBlbGVtZW50IHRvIGFwcGVuZCB0byB0aGUKICAgICAgICAgICAgcGF0aC4gWW91IG1pZ2h0IHdhbnQgdG8gdXNlIHRoaXMgaWYgeW91IHdhbnQgbXVsdGlwbGUgdmVyc2lvbnMKICAgICAgICAgICAgb2YgeW91ciBhcHAgdG8gYmUgYWJsZSB0byBydW4gaW5kZXBlbmRlbnRseS4gSWYgdXNlZCwgdGhpcwogICAgICAgICAgICB3b3VsZCB0eXBpY2FsbHkgYmUgIjxtYWpvcj4uPG1pbm9yPiIuCiAgICAgICAgICAgIE9ubHkgYXBwbGllZCB3aGVuIGFwcG5hbWUgaXMgcHJlc2VudC4KICAgICAgICAibXVsdGlwYXRoIiBpcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgb25seSBhcHBsaWNhYmxlIHRvICpuaXgKICAgICAgICAgICAgd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIGVudGlyZSBsaXN0IG9mIGRhdGEgZGlycyBzaG91bGQgYmUKICAgICAgICAgICAgcmV0dXJuZWQuIEJ5IGRlZmF1bHQsIHRoZSBmaXJzdCBpdGVtIGZyb20gWERHX0RBVEFfRElSUyBpcwogICAgICAgICAgICByZXR1cm5lZCwgb3IgJy91c3IvbG9jYWwvc2hhcmUvPEFwcE5hbWU+JywKICAgICAgICAgICAgaWYgWERHX0RBVEFfRElSUyBpcyBub3Qgc2V0CgogICAgVHlwaWNhbCB1c2VyIGRhdGEgZGlyZWN0b3JpZXMgYXJlOgogICAgICAgIG1hY09TOiAgICAgIC9MaWJyYXJ5L0FwcGxpY2F0aW9uIFN1cHBvcnQvPEFwcE5hbWU+CiAgICAgICAgVW5peDogICAgICAgL3Vzci9sb2NhbC9zaGFyZS88QXBwTmFtZT4gb3IgL3Vzci9zaGFyZS88QXBwTmFtZT4KICAgICAgICBXaW4gWFA6ICAgICBDOlxEb2N1bWVudHMgYW5kIFNldHRpbmdzXEFsbCBVc2Vyc1xBcHBsaWNhdGlvbiBEYXRhXDxBcHBBdXRob3I+XDxBcHBOYW1lPgogICAgICAgIFZpc3RhOiAgICAgIChGYWlsISAiQzpcUHJvZ3JhbURhdGEiIGlzIGEgaGlkZGVuICpzeXN0ZW0qIGRpcmVjdG9yeSBvbiBWaXN0YS4pCiAgICAgICAgV2luIDc6ICAgICAgQzpcUHJvZ3JhbURhdGFcPEFwcEF1dGhvcj5cPEFwcE5hbWU+ICAgIyBIaWRkZW4sIGJ1dCB3cml0ZWFibGUgb24gV2luIDcuCgogICAgRm9yIFVuaXgsIHRoaXMgaXMgdXNpbmcgdGhlICRYREdfREFUQV9ESVJTWzBdIGRlZmF1bHQuCgogICAgV0FSTklORzogRG8gbm90IHVzZSB0aGlzIG9uIFdpbmRvd3MuIFNlZSB0aGUgVmlzdGEtRmFpbCBub3RlIGFib3ZlIGZvciB3aHkuCiAgICAiIiIKICAgIGlmIHN5c3RlbSA9PSAid2luMzIiOgogICAgICAgIGlmIGFwcGF1dGhvciBpcyBOb25lOgogICAgICAgICAgICBhcHBhdXRob3IgPSBhcHBuYW1lCiAgICAgICAgcGF0aCA9IG9zLnBhdGgubm9ybXBhdGgoX2dldF93aW5fZm9sZGVyKCJDU0lETF9DT01NT05fQVBQREFUQSIpKQogICAgICAgIGlmIGFwcG5hbWU6CiAgICAgICAgICAgIGlmIGFwcGF1dGhvciBpcyBub3QgRmFsc2U6CiAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcGF1dGhvciwgYXBwbmFtZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwbmFtZSkKICAgIGVsaWYgc3lzdGVtID09ICdkYXJ3aW4nOgogICAgICAgIHBhdGggPSBvcy5wYXRoLmV4cGFuZHVzZXIoJy9MaWJyYXJ5L0FwcGxpY2F0aW9uIFN1cHBvcnQnKQogICAgICAgIGlmIGFwcG5hbWU6CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwbmFtZSkKICAgIGVsc2U6CiAgICAgICAgIyBYREcgZGVmYXVsdCBmb3IgJFhER19EQVRBX0RJUlMKICAgICAgICAjIG9ubHkgZmlyc3QsIGlmIG11bHRpcGF0aCBpcyBGYWxzZQogICAgICAgIHBhdGggPSBvcy5nZXRlbnYoJ1hER19EQVRBX0RJUlMnLAogICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aHNlcC5qb2luKFsnL3Vzci9sb2NhbC9zaGFyZScsICcvdXNyL3NoYXJlJ10pKQogICAgICAgIHBhdGhsaXN0ID0gW29zLnBhdGguZXhwYW5kdXNlcih4LnJzdHJpcChvcy5zZXApKSBmb3IgeCBpbiBwYXRoLnNwbGl0KG9zLnBhdGhzZXApXQogICAgICAgIGlmIGFwcG5hbWU6CiAgICAgICAgICAgIGlmIHZlcnNpb246CiAgICAgICAgICAgICAgICBhcHBuYW1lID0gb3MucGF0aC5qb2luKGFwcG5hbWUsIHZlcnNpb24pCiAgICAgICAgICAgIHBhdGhsaXN0ID0gW29zLnNlcC5qb2luKFt4LCBhcHBuYW1lXSkgZm9yIHggaW4gcGF0aGxpc3RdCgogICAgICAgIGlmIG11bHRpcGF0aDoKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGhzZXAuam9pbihwYXRobGlzdCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBwYXRoID0gcGF0aGxpc3RbMF0KICAgICAgICByZXR1cm4gcGF0aAoKICAgIGlmIGFwcG5hbWUgYW5kIHZlcnNpb246CiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCB2ZXJzaW9uKQogICAgcmV0dXJuIHBhdGgKCgpkZWYgdXNlcl9jb25maWdfZGlyKGFwcG5hbWU9Tm9uZSwgYXBwYXV0aG9yPU5vbmUsIHZlcnNpb249Tm9uZSwgcm9hbWluZz1GYWxzZSk6CiAgICByIiIiUmV0dXJuIGZ1bGwgcGF0aCB0byB0aGUgdXNlci1zcGVjaWZpYyBjb25maWcgZGlyIGZvciB0aGlzIGFwcGxpY2F0aW9uLgoKICAgICAgICAiYXBwbmFtZSIgaXMgdGhlIG5hbWUgb2YgYXBwbGljYXRpb24uCiAgICAgICAgICAgIElmIE5vbmUsIGp1c3QgdGhlIHN5c3RlbSBkaXJlY3RvcnkgaXMgcmV0dXJuZWQuCiAgICAgICAgImFwcGF1dGhvciIgKG9ubHkgdXNlZCBvbiBXaW5kb3dzKSBpcyB0aGUgbmFtZSBvZiB0aGUKICAgICAgICAgICAgYXBwYXV0aG9yIG9yIGRpc3RyaWJ1dGluZyBib2R5IGZvciB0aGlzIGFwcGxpY2F0aW9uLiBUeXBpY2FsbHkKICAgICAgICAgICAgaXQgaXMgdGhlIG93bmluZyBjb21wYW55IG5hbWUuIFRoaXMgZmFsbHMgYmFjayB0byBhcHBuYW1lLiBZb3UgbWF5CiAgICAgICAgICAgIHBhc3MgRmFsc2UgdG8gZGlzYWJsZSBpdC4KICAgICAgICAidmVyc2lvbiIgaXMgYW4gb3B0aW9uYWwgdmVyc2lvbiBwYXRoIGVsZW1lbnQgdG8gYXBwZW5kIHRvIHRoZQogICAgICAgICAgICBwYXRoLiBZb3UgbWlnaHQgd2FudCB0byB1c2UgdGhpcyBpZiB5b3Ugd2FudCBtdWx0aXBsZSB2ZXJzaW9ucwogICAgICAgICAgICBvZiB5b3VyIGFwcCB0byBiZSBhYmxlIHRvIHJ1biBpbmRlcGVuZGVudGx5LiBJZiB1c2VkLCB0aGlzCiAgICAgICAgICAgIHdvdWxkIHR5cGljYWxseSBiZSAiPG1ham9yPi48bWlub3I+Ii4KICAgICAgICAgICAgT25seSBhcHBsaWVkIHdoZW4gYXBwbmFtZSBpcyBwcmVzZW50LgogICAgICAgICJyb2FtaW5nIiAoYm9vbGVhbiwgZGVmYXVsdCBGYWxzZSkgY2FuIGJlIHNldCBUcnVlIHRvIHVzZSB0aGUgV2luZG93cwogICAgICAgICAgICByb2FtaW5nIGFwcGRhdGEgZGlyZWN0b3J5LiBUaGF0IG1lYW5zIHRoYXQgZm9yIHVzZXJzIG9uIGEgV2luZG93cwogICAgICAgICAgICBuZXR3b3JrIHNldHVwIGZvciByb2FtaW5nIHByb2ZpbGVzLCB0aGlzIHVzZXIgZGF0YSB3aWxsIGJlCiAgICAgICAgICAgIHN5bmMnZCBvbiBsb2dpbi4gU2VlCiAgICAgICAgICAgIDxodHRwOi8vdGVjaG5ldC5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvY2M3NjY0ODkoV1MuMTApLmFzcHg+CiAgICAgICAgICAgIGZvciBhIGRpc2N1c3Npb24gb2YgaXNzdWVzLgoKICAgIFR5cGljYWwgdXNlciBkYXRhIGRpcmVjdG9yaWVzIGFyZToKICAgICAgICBtYWNPUzogICAgICAgICAgICAgICAgICBzYW1lIGFzIHVzZXJfZGF0YV9kaXIKICAgICAgICBVbml4OiAgICAgICAgICAgICAgICAgICB+Ly5jb25maWcvPEFwcE5hbWU+ICAgICAjIG9yIGluICRYREdfQ09ORklHX0hPTUUsIGlmIGRlZmluZWQKICAgICAgICBXaW4gKjogICAgICAgICAgICAgICAgICBzYW1lIGFzIHVzZXJfZGF0YV9kaXIKCiAgICBGb3IgVW5peCwgd2UgZm9sbG93IHRoZSBYREcgc3BlYyBhbmQgc3VwcG9ydCAkWERHX0NPTkZJR19IT01FLgogICAgVGhhdCBtZWFucywgYnkgZGVhZnVsdCAifi8uY29uZmlnLzxBcHBOYW1lPiIuCiAgICAiIiIKICAgIGlmIHN5c3RlbSBpbiBbIndpbjMyIiwgImRhcndpbiJdOgogICAgICAgIHBhdGggPSB1c2VyX2RhdGFfZGlyKGFwcG5hbWUsIGFwcGF1dGhvciwgTm9uZSwgcm9hbWluZykKICAgIGVsc2U6CiAgICAgICAgcGF0aCA9IG9zLmdldGVudignWERHX0NPTkZJR19IT01FJywgb3MucGF0aC5leHBhbmR1c2VyKCJ+Ly5jb25maWciKSkKICAgICAgICBpZiBhcHBuYW1lOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcG5hbWUpCiAgICBpZiBhcHBuYW1lIGFuZCB2ZXJzaW9uOgogICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgdmVyc2lvbikKICAgIHJldHVybiBwYXRoCgoKZGVmIHNpdGVfY29uZmlnX2RpcihhcHBuYW1lPU5vbmUsIGFwcGF1dGhvcj1Ob25lLCB2ZXJzaW9uPU5vbmUsIG11bHRpcGF0aD1GYWxzZSk6CiAgICAiIiJSZXR1cm4gZnVsbCBwYXRoIHRvIHRoZSB1c2VyLXNoYXJlZCBkYXRhIGRpciBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KCiAgICAgICAgImFwcG5hbWUiIGlzIHRoZSBuYW1lIG9mIGFwcGxpY2F0aW9uLgogICAgICAgICAgICBJZiBOb25lLCBqdXN0IHRoZSBzeXN0ZW0gZGlyZWN0b3J5IGlzIHJldHVybmVkLgogICAgICAgICJhcHBhdXRob3IiIChvbmx5IHVzZWQgb24gV2luZG93cykgaXMgdGhlIG5hbWUgb2YgdGhlCiAgICAgICAgICAgIGFwcGF1dGhvciBvciBkaXN0cmlidXRpbmcgYm9keSBmb3IgdGhpcyBhcHBsaWNhdGlvbi4gVHlwaWNhbGx5CiAgICAgICAgICAgIGl0IGlzIHRoZSBvd25pbmcgY29tcGFueSBuYW1lLiBUaGlzIGZhbGxzIGJhY2sgdG8gYXBwbmFtZS4gWW91IG1heQogICAgICAgICAgICBwYXNzIEZhbHNlIHRvIGRpc2FibGUgaXQuCiAgICAgICAgInZlcnNpb24iIGlzIGFuIG9wdGlvbmFsIHZlcnNpb24gcGF0aCBlbGVtZW50IHRvIGFwcGVuZCB0byB0aGUKICAgICAgICAgICAgcGF0aC4gWW91IG1pZ2h0IHdhbnQgdG8gdXNlIHRoaXMgaWYgeW91IHdhbnQgbXVsdGlwbGUgdmVyc2lvbnMKICAgICAgICAgICAgb2YgeW91ciBhcHAgdG8gYmUgYWJsZSB0byBydW4gaW5kZXBlbmRlbnRseS4gSWYgdXNlZCwgdGhpcwogICAgICAgICAgICB3b3VsZCB0eXBpY2FsbHkgYmUgIjxtYWpvcj4uPG1pbm9yPiIuCiAgICAgICAgICAgIE9ubHkgYXBwbGllZCB3aGVuIGFwcG5hbWUgaXMgcHJlc2VudC4KICAgICAgICAibXVsdGlwYXRoIiBpcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgb25seSBhcHBsaWNhYmxlIHRvICpuaXgKICAgICAgICAgICAgd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIGVudGlyZSBsaXN0IG9mIGNvbmZpZyBkaXJzIHNob3VsZCBiZQogICAgICAgICAgICByZXR1cm5lZC4gQnkgZGVmYXVsdCwgdGhlIGZpcnN0IGl0ZW0gZnJvbSBYREdfQ09ORklHX0RJUlMgaXMKICAgICAgICAgICAgcmV0dXJuZWQsIG9yICcvZXRjL3hkZy88QXBwTmFtZT4nLCBpZiBYREdfQ09ORklHX0RJUlMgaXMgbm90IHNldAoKICAgIFR5cGljYWwgdXNlciBkYXRhIGRpcmVjdG9yaWVzIGFyZToKICAgICAgICBtYWNPUzogICAgICBzYW1lIGFzIHNpdGVfZGF0YV9kaXIKICAgICAgICBVbml4OiAgICAgICAvZXRjL3hkZy88QXBwTmFtZT4gb3IgJFhER19DT05GSUdfRElSU1tpXS88QXBwTmFtZT4gZm9yIGVhY2ggdmFsdWUgaW4KICAgICAgICAgICAgICAgICAgICAkWERHX0NPTkZJR19ESVJTCiAgICAgICAgV2luICo6ICAgICAgc2FtZSBhcyBzaXRlX2RhdGFfZGlyCiAgICAgICAgVmlzdGE6ICAgICAgKEZhaWwhICJDOlxQcm9ncmFtRGF0YSIgaXMgYSBoaWRkZW4gKnN5c3RlbSogZGlyZWN0b3J5IG9uIFZpc3RhLikKCiAgICBGb3IgVW5peCwgdGhpcyBpcyB1c2luZyB0aGUgJFhER19DT05GSUdfRElSU1swXSBkZWZhdWx0LCBpZiBtdWx0aXBhdGg9RmFsc2UKCiAgICBXQVJOSU5HOiBEbyBub3QgdXNlIHRoaXMgb24gV2luZG93cy4gU2VlIHRoZSBWaXN0YS1GYWlsIG5vdGUgYWJvdmUgZm9yIHdoeS4KICAgICIiIgogICAgaWYgc3lzdGVtIGluIFsid2luMzIiLCAiZGFyd2luIl06CiAgICAgICAgcGF0aCA9IHNpdGVfZGF0YV9kaXIoYXBwbmFtZSwgYXBwYXV0aG9yKQogICAgICAgIGlmIGFwcG5hbWUgYW5kIHZlcnNpb246CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgdmVyc2lvbikKICAgIGVsc2U6CiAgICAgICAgIyBYREcgZGVmYXVsdCBmb3IgJFhER19DT05GSUdfRElSUwogICAgICAgICMgb25seSBmaXJzdCwgaWYgbXVsdGlwYXRoIGlzIEZhbHNlCiAgICAgICAgcGF0aCA9IG9zLmdldGVudignWERHX0NPTkZJR19ESVJTJywgJy9ldGMveGRnJykKICAgICAgICBwYXRobGlzdCA9IFtvcy5wYXRoLmV4cGFuZHVzZXIoeC5yc3RyaXAob3Muc2VwKSkgZm9yIHggaW4gcGF0aC5zcGxpdChvcy5wYXRoc2VwKV0KICAgICAgICBpZiBhcHBuYW1lOgogICAgICAgICAgICBpZiB2ZXJzaW9uOgogICAgICAgICAgICAgICAgYXBwbmFtZSA9IG9zLnBhdGguam9pbihhcHBuYW1lLCB2ZXJzaW9uKQogICAgICAgICAgICBwYXRobGlzdCA9IFtvcy5zZXAuam9pbihbeCwgYXBwbmFtZV0pIGZvciB4IGluIHBhdGhsaXN0XQoKICAgICAgICBpZiBtdWx0aXBhdGg6CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoc2VwLmpvaW4ocGF0aGxpc3QpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcGF0aCA9IHBhdGhsaXN0WzBdCiAgICByZXR1cm4gcGF0aAoKCmRlZiB1c2VyX2NhY2hlX2RpcihhcHBuYW1lPU5vbmUsIGFwcGF1dGhvcj1Ob25lLCB2ZXJzaW9uPU5vbmUsIG9waW5pb249VHJ1ZSk6CiAgICByIiIiUmV0dXJuIGZ1bGwgcGF0aCB0byB0aGUgdXNlci1zcGVjaWZpYyBjYWNoZSBkaXIgZm9yIHRoaXMgYXBwbGljYXRpb24uCgogICAgICAgICJhcHBuYW1lIiBpcyB0aGUgbmFtZSBvZiBhcHBsaWNhdGlvbi4KICAgICAgICAgICAgSWYgTm9uZSwganVzdCB0aGUgc3lzdGVtIGRpcmVjdG9yeSBpcyByZXR1cm5lZC4KICAgICAgICAiYXBwYXV0aG9yIiAob25seSB1c2VkIG9uIFdpbmRvd3MpIGlzIHRoZSBuYW1lIG9mIHRoZQogICAgICAgICAgICBhcHBhdXRob3Igb3IgZGlzdHJpYnV0aW5nIGJvZHkgZm9yIHRoaXMgYXBwbGljYXRpb24uIFR5cGljYWxseQogICAgICAgICAgICBpdCBpcyB0aGUgb3duaW5nIGNvbXBhbnkgbmFtZS4gVGhpcyBmYWxscyBiYWNrIHRvIGFwcG5hbWUuIFlvdSBtYXkKICAgICAgICAgICAgcGFzcyBGYWxzZSB0byBkaXNhYmxlIGl0LgogICAgICAgICJ2ZXJzaW9uIiBpcyBhbiBvcHRpb25hbCB2ZXJzaW9uIHBhdGggZWxlbWVudCB0byBhcHBlbmQgdG8gdGhlCiAgICAgICAgICAgIHBhdGguIFlvdSBtaWdodCB3YW50IHRvIHVzZSB0aGlzIGlmIHlvdSB3YW50IG11bHRpcGxlIHZlcnNpb25zCiAgICAgICAgICAgIG9mIHlvdXIgYXBwIHRvIGJlIGFibGUgdG8gcnVuIGluZGVwZW5kZW50bHkuIElmIHVzZWQsIHRoaXMKICAgICAgICAgICAgd291bGQgdHlwaWNhbGx5IGJlICI8bWFqb3I+LjxtaW5vcj4iLgogICAgICAgICAgICBPbmx5IGFwcGxpZWQgd2hlbiBhcHBuYW1lIGlzIHByZXNlbnQuCiAgICAgICAgIm9waW5pb24iIChib29sZWFuKSBjYW4gYmUgRmFsc2UgdG8gZGlzYWJsZSB0aGUgYXBwZW5kaW5nIG9mCiAgICAgICAgICAgICJDYWNoZSIgdG8gdGhlIGJhc2UgYXBwIGRhdGEgZGlyIGZvciBXaW5kb3dzLiBTZWUKICAgICAgICAgICAgZGlzY3Vzc2lvbiBiZWxvdy4KCiAgICBUeXBpY2FsIHVzZXIgY2FjaGUgZGlyZWN0b3JpZXMgYXJlOgogICAgICAgIG1hY09TOiAgICAgIH4vTGlicmFyeS9DYWNoZXMvPEFwcE5hbWU+CiAgICAgICAgVW5peDogICAgICAgfi8uY2FjaGUvPEFwcE5hbWU+IChYREcgZGVmYXVsdCkKICAgICAgICBXaW4gWFA6ICAgICBDOlxEb2N1bWVudHMgYW5kIFNldHRpbmdzXDx1c2VybmFtZT5cTG9jYWwgU2V0dGluZ3NcQXBwbGljYXRpb24gRGF0YVw8QXBwQXV0aG9yPlw8QXBwTmFtZT5cQ2FjaGUKICAgICAgICBWaXN0YTogICAgICBDOlxVc2Vyc1w8dXNlcm5hbWU+XEFwcERhdGFcTG9jYWxcPEFwcEF1dGhvcj5cPEFwcE5hbWU+XENhY2hlCgogICAgT24gV2luZG93cyB0aGUgb25seSBzdWdnZXN0aW9uIGluIHRoZSBNU0ROIGRvY3MgaXMgdGhhdCBsb2NhbCBzZXR0aW5ncyBnbyBpbgogICAgdGhlIGBDU0lETF9MT0NBTF9BUFBEQVRBYCBkaXJlY3RvcnkuIFRoaXMgaXMgaWRlbnRpY2FsIHRvIHRoZSBub24tcm9hbWluZwogICAgYXBwIGRhdGEgZGlyICh0aGUgZGVmYXVsdCByZXR1cm5lZCBieSBgdXNlcl9kYXRhX2RpcmAgYWJvdmUpLiBBcHBzIHR5cGljYWxseQogICAgcHV0IGNhY2hlIGRhdGEgc29tZXdoZXJlICp1bmRlciogdGhlIGdpdmVuIGRpciBoZXJlLiBTb21lIGV4YW1wbGVzOgogICAgICAgIC4uLlxNb3ppbGxhXEZpcmVmb3hcUHJvZmlsZXNcPFByb2ZpbGVOYW1lPlxDYWNoZQogICAgICAgIC4uLlxBY21lXFN1cGVyQXBwXENhY2hlXDEuMAogICAgT1BJTklPTjogVGhpcyBmdW5jdGlvbiBhcHBlbmRzICJDYWNoZSIgdG8gdGhlIGBDU0lETF9MT0NBTF9BUFBEQVRBYCB2YWx1ZS4KICAgIFRoaXMgY2FuIGJlIGRpc2FibGVkIHdpdGggdGhlIGBvcGluaW9uPUZhbHNlYCBvcHRpb24uCiAgICAiIiIKICAgIGlmIHN5c3RlbSA9PSAid2luMzIiOgogICAgICAgIGlmIGFwcGF1dGhvciBpcyBOb25lOgogICAgICAgICAgICBhcHBhdXRob3IgPSBhcHBuYW1lCiAgICAgICAgcGF0aCA9IG9zLnBhdGgubm9ybXBhdGgoX2dldF93aW5fZm9sZGVyKCJDU0lETF9MT0NBTF9BUFBEQVRBIikpCiAgICAgICAgaWYgYXBwbmFtZToKICAgICAgICAgICAgaWYgYXBwYXV0aG9yIGlzIG5vdCBGYWxzZToKICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwYXV0aG9yLCBhcHBuYW1lKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBuYW1lKQogICAgICAgICAgICBpZiBvcGluaW9uOgogICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCAiQ2FjaGUiKQogICAgZWxpZiBzeXN0ZW0gPT0gJ2Rhcndpbic6CiAgICAgICAgcGF0aCA9IG9zLnBhdGguZXhwYW5kdXNlcignfi9MaWJyYXJ5L0NhY2hlcycpCiAgICAgICAgaWYgYXBwbmFtZToKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCBhcHBuYW1lKQogICAgZWxzZToKICAgICAgICBwYXRoID0gb3MuZ2V0ZW52KCdYREdfQ0FDSEVfSE9NRScsIG9zLnBhdGguZXhwYW5kdXNlcignfi8uY2FjaGUnKSkKICAgICAgICBpZiBhcHBuYW1lOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcG5hbWUpCiAgICBpZiBhcHBuYW1lIGFuZCB2ZXJzaW9uOgogICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgdmVyc2lvbikKICAgIHJldHVybiBwYXRoCgoKZGVmIHVzZXJfbG9nX2RpcihhcHBuYW1lPU5vbmUsIGFwcGF1dGhvcj1Ob25lLCB2ZXJzaW9uPU5vbmUsIG9waW5pb249VHJ1ZSk6CiAgICByIiIiUmV0dXJuIGZ1bGwgcGF0aCB0byB0aGUgdXNlci1zcGVjaWZpYyBsb2cgZGlyIGZvciB0aGlzIGFwcGxpY2F0aW9uLgoKICAgICAgICAiYXBwbmFtZSIgaXMgdGhlIG5hbWUgb2YgYXBwbGljYXRpb24uCiAgICAgICAgICAgIElmIE5vbmUsIGp1c3QgdGhlIHN5c3RlbSBkaXJlY3RvcnkgaXMgcmV0dXJuZWQuCiAgICAgICAgImFwcGF1dGhvciIgKG9ubHkgdXNlZCBvbiBXaW5kb3dzKSBpcyB0aGUgbmFtZSBvZiB0aGUKICAgICAgICAgICAgYXBwYXV0aG9yIG9yIGRpc3RyaWJ1dGluZyBib2R5IGZvciB0aGlzIGFwcGxpY2F0aW9uLiBUeXBpY2FsbHkKICAgICAgICAgICAgaXQgaXMgdGhlIG93bmluZyBjb21wYW55IG5hbWUuIFRoaXMgZmFsbHMgYmFjayB0byBhcHBuYW1lLiBZb3UgbWF5CiAgICAgICAgICAgIHBhc3MgRmFsc2UgdG8gZGlzYWJsZSBpdC4KICAgICAgICAidmVyc2lvbiIgaXMgYW4gb3B0aW9uYWwgdmVyc2lvbiBwYXRoIGVsZW1lbnQgdG8gYXBwZW5kIHRvIHRoZQogICAgICAgICAgICBwYXRoLiBZb3UgbWlnaHQgd2FudCB0byB1c2UgdGhpcyBpZiB5b3Ugd2FudCBtdWx0aXBsZSB2ZXJzaW9ucwogICAgICAgICAgICBvZiB5b3VyIGFwcCB0byBiZSBhYmxlIHRvIHJ1biBpbmRlcGVuZGVudGx5LiBJZiB1c2VkLCB0aGlzCiAgICAgICAgICAgIHdvdWxkIHR5cGljYWxseSBiZSAiPG1ham9yPi48bWlub3I+Ii4KICAgICAgICAgICAgT25seSBhcHBsaWVkIHdoZW4gYXBwbmFtZSBpcyBwcmVzZW50LgogICAgICAgICJvcGluaW9uIiAoYm9vbGVhbikgY2FuIGJlIEZhbHNlIHRvIGRpc2FibGUgdGhlIGFwcGVuZGluZyBvZgogICAgICAgICAgICAiTG9ncyIgdG8gdGhlIGJhc2UgYXBwIGRhdGEgZGlyIGZvciBXaW5kb3dzLCBhbmQgImxvZyIgdG8gdGhlCiAgICAgICAgICAgIGJhc2UgY2FjaGUgZGlyIGZvciBVbml4LiBTZWUgZGlzY3Vzc2lvbiBiZWxvdy4KCiAgICBUeXBpY2FsIHVzZXIgY2FjaGUgZGlyZWN0b3JpZXMgYXJlOgogICAgICAgIG1hY09TOiAgICAgIH4vTGlicmFyeS9Mb2dzLzxBcHBOYW1lPgogICAgICAgIFVuaXg6ICAgICAgIH4vLmNhY2hlLzxBcHBOYW1lPi9sb2cgICMgb3IgdW5kZXIgJFhER19DQUNIRV9IT01FIGlmIGRlZmluZWQKICAgICAgICBXaW4gWFA6ICAgICBDOlxEb2N1bWVudHMgYW5kIFNldHRpbmdzXDx1c2VybmFtZT5cTG9jYWwgU2V0dGluZ3NcQXBwbGljYXRpb24gRGF0YVw8QXBwQXV0aG9yPlw8QXBwTmFtZT5cTG9ncwogICAgICAgIFZpc3RhOiAgICAgIEM6XFVzZXJzXDx1c2VybmFtZT5cQXBwRGF0YVxMb2NhbFw8QXBwQXV0aG9yPlw8QXBwTmFtZT5cTG9ncwoKICAgIE9uIFdpbmRvd3MgdGhlIG9ubHkgc3VnZ2VzdGlvbiBpbiB0aGUgTVNETiBkb2NzIGlzIHRoYXQgbG9jYWwgc2V0dGluZ3MKICAgIGdvIGluIHRoZSBgQ1NJRExfTE9DQUxfQVBQREFUQWAgZGlyZWN0b3J5LiAoTm90ZTogSSdtIGludGVyZXN0ZWQgaW4KICAgIGV4YW1wbGVzIG9mIHdoYXQgc29tZSB3aW5kb3dzIGFwcHMgdXNlIGZvciBhIGxvZ3MgZGlyLikKCiAgICBPUElOSU9OOiBUaGlzIGZ1bmN0aW9uIGFwcGVuZHMgIkxvZ3MiIHRvIHRoZSBgQ1NJRExfTE9DQUxfQVBQREFUQWAKICAgIHZhbHVlIGZvciBXaW5kb3dzIGFuZCBhcHBlbmRzICJsb2ciIHRvIHRoZSB1c2VyIGNhY2hlIGRpciBmb3IgVW5peC4KICAgIFRoaXMgY2FuIGJlIGRpc2FibGVkIHdpdGggdGhlIGBvcGluaW9uPUZhbHNlYCBvcHRpb24uCiAgICAiIiIKICAgIGlmIHN5c3RlbSA9PSAiZGFyd2luIjoKICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKAogICAgICAgICAgICBvcy5wYXRoLmV4cGFuZHVzZXIoJ34vTGlicmFyeS9Mb2dzJyksCiAgICAgICAgICAgIGFwcG5hbWUpCiAgICBlbGlmIHN5c3RlbSA9PSAid2luMzIiOgogICAgICAgIHBhdGggPSB1c2VyX2RhdGFfZGlyKGFwcG5hbWUsIGFwcGF1dGhvciwgdmVyc2lvbikKICAgICAgICB2ZXJzaW9uID0gRmFsc2UKICAgICAgICBpZiBvcGluaW9uOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsICJMb2dzIikKICAgIGVsc2U6CiAgICAgICAgcGF0aCA9IHVzZXJfY2FjaGVfZGlyKGFwcG5hbWUsIGFwcGF1dGhvciwgdmVyc2lvbikKICAgICAgICB2ZXJzaW9uID0gRmFsc2UKICAgICAgICBpZiBvcGluaW9uOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsICJsb2ciKQogICAgaWYgYXBwbmFtZSBhbmQgdmVyc2lvbjoKICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIHZlcnNpb24pCiAgICByZXR1cm4gcGF0aAoKCmNsYXNzIEFwcERpcnMob2JqZWN0KToKICAgICIiIkNvbnZlbmllbmNlIHdyYXBwZXIgZm9yIGdldHRpbmcgYXBwbGljYXRpb24gZGlycy4iIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhcHBuYW1lLCBhcHBhdXRob3I9Tm9uZSwgdmVyc2lvbj1Ob25lLCByb2FtaW5nPUZhbHNlLAogICAgICAgICAgICAgICAgIG11bHRpcGF0aD1GYWxzZSk6CiAgICAgICAgc2VsZi5hcHBuYW1lID0gYXBwbmFtZQogICAgICAgIHNlbGYuYXBwYXV0aG9yID0gYXBwYXV0aG9yCiAgICAgICAgc2VsZi52ZXJzaW9uID0gdmVyc2lvbgogICAgICAgIHNlbGYucm9hbWluZyA9IHJvYW1pbmcKICAgICAgICBzZWxmLm11bHRpcGF0aCA9IG11bHRpcGF0aAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHVzZXJfZGF0YV9kaXIoc2VsZik6CiAgICAgICAgcmV0dXJuIHVzZXJfZGF0YV9kaXIoc2VsZi5hcHBuYW1lLCBzZWxmLmFwcGF1dGhvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPXNlbGYudmVyc2lvbiwgcm9hbWluZz1zZWxmLnJvYW1pbmcpCgogICAgQHByb3BlcnR5CiAgICBkZWYgc2l0ZV9kYXRhX2RpcihzZWxmKToKICAgICAgICByZXR1cm4gc2l0ZV9kYXRhX2RpcihzZWxmLmFwcG5hbWUsIHNlbGYuYXBwYXV0aG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb249c2VsZi52ZXJzaW9uLCBtdWx0aXBhdGg9c2VsZi5tdWx0aXBhdGgpCgogICAgQHByb3BlcnR5CiAgICBkZWYgdXNlcl9jb25maWdfZGlyKHNlbGYpOgogICAgICAgIHJldHVybiB1c2VyX2NvbmZpZ19kaXIoc2VsZi5hcHBuYW1lLCBzZWxmLmFwcGF1dGhvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb249c2VsZi52ZXJzaW9uLCByb2FtaW5nPXNlbGYucm9hbWluZykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBzaXRlX2NvbmZpZ19kaXIoc2VsZik6CiAgICAgICAgcmV0dXJuIHNpdGVfY29uZmlnX2RpcihzZWxmLmFwcG5hbWUsIHNlbGYuYXBwYXV0aG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb249c2VsZi52ZXJzaW9uLCBtdWx0aXBhdGg9c2VsZi5tdWx0aXBhdGgpCgogICAgQHByb3BlcnR5CiAgICBkZWYgdXNlcl9jYWNoZV9kaXIoc2VsZik6CiAgICAgICAgcmV0dXJuIHVzZXJfY2FjaGVfZGlyKHNlbGYuYXBwbmFtZSwgc2VsZi5hcHBhdXRob3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb249c2VsZi52ZXJzaW9uKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHVzZXJfbG9nX2RpcihzZWxmKToKICAgICAgICByZXR1cm4gdXNlcl9sb2dfZGlyKHNlbGYuYXBwbmFtZSwgc2VsZi5hcHBhdXRob3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPXNlbGYudmVyc2lvbikKCgojLS0tLSBpbnRlcm5hbCBzdXBwb3J0IHN0dWZmCgpkZWYgX2dldF93aW5fZm9sZGVyX2Zyb21fcmVnaXN0cnkoY3NpZGxfbmFtZSk6CiAgICAiIiJUaGlzIGlzIGEgZmFsbGJhY2sgdGVjaG5pcXVlIGF0IGJlc3QuIEknbSBub3Qgc3VyZSBpZiB1c2luZyB0aGUKICAgIHJlZ2lzdHJ5IGZvciB0aGlzIGd1YXJhbnRlZXMgdXMgdGhlIGNvcnJlY3QgYW5zd2VyIGZvciBhbGwgQ1NJRExfKgogICAgbmFtZXMuCiAgICAiIiIKICAgIGltcG9ydCBfd2lucmVnCgogICAgc2hlbGxfZm9sZGVyX25hbWUgPSB7CiAgICAgICAgIkNTSURMX0FQUERBVEEiOiAiQXBwRGF0YSIsCiAgICAgICAgIkNTSURMX0NPTU1PTl9BUFBEQVRBIjogIkNvbW1vbiBBcHBEYXRhIiwKICAgICAgICAiQ1NJRExfTE9DQUxfQVBQREFUQSI6ICJMb2NhbCBBcHBEYXRhIiwKICAgIH1bY3NpZGxfbmFtZV0KCiAgICBrZXkgPSBfd2lucmVnLk9wZW5LZXkoCiAgICAgICAgX3dpbnJlZy5IS0VZX0NVUlJFTlRfVVNFUiwKICAgICAgICByIlNvZnR3YXJlXE1pY3Jvc29mdFxXaW5kb3dzXEN1cnJlbnRWZXJzaW9uXEV4cGxvcmVyXFNoZWxsIEZvbGRlcnMiCiAgICApCiAgICBkaXIsIHR5cGUgPSBfd2lucmVnLlF1ZXJ5VmFsdWVFeChrZXksIHNoZWxsX2ZvbGRlcl9uYW1lKQogICAgcmV0dXJuIGRpcgoKCmRlZiBfZ2V0X3dpbl9mb2xkZXJfd2l0aF9weXdpbjMyKGNzaWRsX25hbWUpOgogICAgZnJvbSB3aW4zMmNvbS5zaGVsbCBpbXBvcnQgc2hlbGxjb24sIHNoZWxsCiAgICBkaXIgPSBzaGVsbC5TSEdldEZvbGRlclBhdGgoMCwgZ2V0YXR0cihzaGVsbGNvbiwgY3NpZGxfbmFtZSksIDAsIDApCiAgICAjIFRyeSB0byBtYWtlIHRoaXMgYSB1bmljb2RlIHBhdGggYmVjYXVzZSBTSEdldEZvbGRlclBhdGggZG9lcwogICAgIyBub3QgcmV0dXJuIHVuaWNvZGUgc3RyaW5ncyB3aGVuIHRoZXJlIGlzIHVuaWNvZGUgZGF0YSBpbiB0aGUKICAgICMgcGF0aC4KICAgIHRyeToKICAgICAgICBkaXIgPSB1bmljb2RlKGRpcikKCiAgICAgICAgIyBEb3duZ3JhZGUgdG8gc2hvcnQgcGF0aCBuYW1lIGlmIGhhdmUgaGlnaGJpdCBjaGFycy4gU2VlCiAgICAgICAgIyA8aHR0cDovL2J1Z3MuYWN0aXZlc3RhdGUuY29tL3Nob3dfYnVnLmNnaT9pZD04NTA5OT4uCiAgICAgICAgaGFzX2hpZ2hfY2hhciA9IEZhbHNlCiAgICAgICAgZm9yIGMgaW4gZGlyOgogICAgICAgICAgICBpZiBvcmQoYykgPiAyNTU6CiAgICAgICAgICAgICAgICBoYXNfaGlnaF9jaGFyID0gVHJ1ZQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBpZiBoYXNfaGlnaF9jaGFyOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBpbXBvcnQgd2luMzJhcGkKICAgICAgICAgICAgICAgIGRpciA9IHdpbjMyYXBpLkdldFNob3J0UGF0aE5hbWUoZGlyKQogICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgICAgICAgICBwYXNzCiAgICBleGNlcHQgVW5pY29kZUVycm9yOgogICAgICAgIHBhc3MKICAgIHJldHVybiBkaXIKCgpkZWYgX2dldF93aW5fZm9sZGVyX3dpdGhfY3R5cGVzKGNzaWRsX25hbWUpOgogICAgaW1wb3J0IGN0eXBlcwoKICAgIGNzaWRsX2NvbnN0ID0gewogICAgICAgICJDU0lETF9BUFBEQVRBIjogMjYsCiAgICAgICAgIkNTSURMX0NPTU1PTl9BUFBEQVRBIjogMzUsCiAgICAgICAgIkNTSURMX0xPQ0FMX0FQUERBVEEiOiAyOCwKICAgIH1bY3NpZGxfbmFtZV0KCiAgICBidWYgPSBjdHlwZXMuY3JlYXRlX3VuaWNvZGVfYnVmZmVyKDEwMjQpCiAgICBjdHlwZXMud2luZGxsLnNoZWxsMzIuU0hHZXRGb2xkZXJQYXRoVyhOb25lLCBjc2lkbF9jb25zdCwgTm9uZSwgMCwgYnVmKQoKICAgICMgRG93bmdyYWRlIHRvIHNob3J0IHBhdGggbmFtZSBpZiBoYXZlIGhpZ2hiaXQgY2hhcnMuIFNlZQogICAgIyA8aHR0cDovL2J1Z3MuYWN0aXZlc3RhdGUuY29tL3Nob3dfYnVnLmNnaT9pZD04NTA5OT4uCiAgICBoYXNfaGlnaF9jaGFyID0gRmFsc2UKICAgIGZvciBjIGluIGJ1ZjoKICAgICAgICBpZiBvcmQoYykgPiAyNTU6CiAgICAgICAgICAgIGhhc19oaWdoX2NoYXIgPSBUcnVlCiAgICAgICAgICAgIGJyZWFrCiAgICBpZiBoYXNfaGlnaF9jaGFyOgogICAgICAgIGJ1ZjIgPSBjdHlwZXMuY3JlYXRlX3VuaWNvZGVfYnVmZmVyKDEwMjQpCiAgICAgICAgaWYgY3R5cGVzLndpbmRsbC5rZXJuZWwzMi5HZXRTaG9ydFBhdGhOYW1lVyhidWYudmFsdWUsIGJ1ZjIsIDEwMjQpOgogICAgICAgICAgICBidWYgPSBidWYyCgogICAgcmV0dXJuIGJ1Zi52YWx1ZQoKZGVmIF9nZXRfd2luX2ZvbGRlcl93aXRoX2puYShjc2lkbF9uYW1lKToKICAgIGltcG9ydCBhcnJheQogICAgZnJvbSBjb20uc3VuIGltcG9ydCBqbmEKICAgIGZyb20gY29tLnN1bi5qbmEucGxhdGZvcm0gaW1wb3J0IHdpbjMyCgogICAgYnVmX3NpemUgPSB3aW4zMi5XaW5EZWYuTUFYX1BBVEggKiAyCiAgICBidWYgPSBhcnJheS56ZXJvcygnYycsIGJ1Zl9zaXplKQogICAgc2hlbGwgPSB3aW4zMi5TaGVsbDMyLklOU1RBTkNFCiAgICBzaGVsbC5TSEdldEZvbGRlclBhdGgoTm9uZSwgZ2V0YXR0cih3aW4zMi5TaGxPYmosIGNzaWRsX25hbWUpLCBOb25lLCB3aW4zMi5TaGxPYmouU0hHRlBfVFlQRV9DVVJSRU5ULCBidWYpCiAgICBkaXIgPSBqbmEuTmF0aXZlLnRvU3RyaW5nKGJ1Zi50b3N0cmluZygpKS5yc3RyaXAoIlwwIikKCiAgICAjIERvd25ncmFkZSB0byBzaG9ydCBwYXRoIG5hbWUgaWYgaGF2ZSBoaWdoYml0IGNoYXJzLiBTZWUKICAgICMgPGh0dHA6Ly9idWdzLmFjdGl2ZXN0YXRlLmNvbS9zaG93X2J1Zy5jZ2k/aWQ9ODUwOTk+LgogICAgaGFzX2hpZ2hfY2hhciA9IEZhbHNlCiAgICBmb3IgYyBpbiBkaXI6CiAgICAgICAgaWYgb3JkKGMpID4gMjU1OgogICAgICAgICAgICBoYXNfaGlnaF9jaGFyID0gVHJ1ZQogICAgICAgICAgICBicmVhawogICAgaWYgaGFzX2hpZ2hfY2hhcjoKICAgICAgICBidWYgPSBhcnJheS56ZXJvcygnYycsIGJ1Zl9zaXplKQogICAgICAgIGtlcm5lbCA9IHdpbjMyLktlcm5lbDMyLklOU1RBTkNFCiAgICAgICAgaWYga2VybmFsLkdldFNob3J0UGF0aE5hbWUoZGlyLCBidWYsIGJ1Zl9zaXplKToKICAgICAgICAgICAgZGlyID0gam5hLk5hdGl2ZS50b1N0cmluZyhidWYudG9zdHJpbmcoKSkucnN0cmlwKCJcMCIpCgogICAgcmV0dXJuIGRpcgoKaWYgc3lzdGVtID09ICJ3aW4zMiI6CiAgICB0cnk6CiAgICAgICAgaW1wb3J0IHdpbjMyY29tLnNoZWxsCiAgICAgICAgX2dldF93aW5fZm9sZGVyID0gX2dldF93aW5fZm9sZGVyX3dpdGhfcHl3aW4zMgogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIHRyeToKICAgICAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IHdpbmRsbAogICAgICAgICAgICBfZ2V0X3dpbl9mb2xkZXIgPSBfZ2V0X3dpbl9mb2xkZXJfd2l0aF9jdHlwZXMKICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGltcG9ydCBjb20uc3VuLmpuYQogICAgICAgICAgICAgICAgX2dldF93aW5fZm9sZGVyID0gX2dldF93aW5fZm9sZGVyX3dpdGhfam5hCiAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgICAgICAgIF9nZXRfd2luX2ZvbGRlciA9IF9nZXRfd2luX2ZvbGRlcl9mcm9tX3JlZ2lzdHJ5CgoKIy0tLS0gc2VsZiB0ZXN0IGNvZGUKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICBhcHBuYW1lID0gIk15QXBwIgogICAgYXBwYXV0aG9yID0gIk15Q29tcGFueSIKCiAgICBwcm9wcyA9ICgidXNlcl9kYXRhX2RpciIsICJzaXRlX2RhdGFfZGlyIiwKICAgICAgICAgICAgICJ1c2VyX2NvbmZpZ19kaXIiLCAic2l0ZV9jb25maWdfZGlyIiwKICAgICAgICAgICAgICJ1c2VyX2NhY2hlX2RpciIsICJ1c2VyX2xvZ19kaXIiKQoKICAgIHByaW50KCItLSBhcHAgZGlycyAod2l0aCBvcHRpb25hbCAndmVyc2lvbicpIikKICAgIGRpcnMgPSBBcHBEaXJzKGFwcG5hbWUsIGFwcGF1dGhvciwgdmVyc2lvbj0iMS4wIikKICAgIGZvciBwcm9wIGluIHByb3BzOgogICAgICAgIHByaW50KCIlczogJXMiICUgKHByb3AsIGdldGF0dHIoZGlycywgcHJvcCkpKQoKICAgIHByaW50KCJcbi0tIGFwcCBkaXJzICh3aXRob3V0IG9wdGlvbmFsICd2ZXJzaW9uJykiKQogICAgZGlycyA9IEFwcERpcnMoYXBwbmFtZSwgYXBwYXV0aG9yKQogICAgZm9yIHByb3AgaW4gcHJvcHM6CiAgICAgICAgcHJpbnQoIiVzOiAlcyIgJSAocHJvcCwgZ2V0YXR0cihkaXJzLCBwcm9wKSkpCgogICAgcHJpbnQoIlxuLS0gYXBwIGRpcnMgKHdpdGhvdXQgb3B0aW9uYWwgJ2FwcGF1dGhvcicpIikKICAgIGRpcnMgPSBBcHBEaXJzKGFwcG5hbWUpCiAgICBmb3IgcHJvcCBpbiBwcm9wczoKICAgICAgICBwcmludCgiJXM6ICVzIiAlIChwcm9wLCBnZXRhdHRyKGRpcnMsIHByb3ApKSkKCiAgICBwcmludCgiXG4tLSBhcHAgZGlycyAod2l0aCBkaXNhYmxlZCAnYXBwYXV0aG9yJykiKQogICAgZGlycyA9IEFwcERpcnMoYXBwbmFtZSwgYXBwYXV0aG9yPUZhbHNlKQogICAgZm9yIHByb3AgaW4gcHJvcHM6CiAgICAgICAgcHJpbnQoIiVzOiAlcyIgJSAocHJvcCwgZ2V0YXR0cihkaXJzLCBwcm9wKSkpClBLAwQUAAAAAAAAACEAAFasOi4BAAAuAQAANAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvX19pbml0X18ucHkiIiJDYWNoZUNvbnRyb2wgaW1wb3J0IEludGVyZmFjZS4KCk1ha2UgaXQgZWFzeSB0byBpbXBvcnQgZnJvbSBjYWNoZWNvbnRyb2wgd2l0aG91dCBsb25nIG5hbWVzcGFjZXMuCiIiIgpfX2F1dGhvcl9fID0gJ0VyaWMgTGFyc29uJwpfX2VtYWlsX18gPSAnZXJpY0Bpb25yb2NrLm9yZycKX192ZXJzaW9uX18gPSAnMC4xMS43JwoKZnJvbSAud3JhcHBlciBpbXBvcnQgQ2FjaGVDb250cm9sCmZyb20gLmFkYXB0ZXIgaW1wb3J0IENhY2hlQ29udHJvbEFkYXB0ZXIKZnJvbSAuY29udHJvbGxlciBpbXBvcnQgQ2FjaGVDb250cm9sbGVyClBLAwQUAAAAAAAAACEA2lRGpSgFAAAoBQAAMAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvX2NtZC5weWltcG9ydCBsb2dnaW5nCgpmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCByZXF1ZXN0cwoKZnJvbSBwaXAuX3ZlbmRvci5jYWNoZWNvbnRyb2wuYWRhcHRlciBpbXBvcnQgQ2FjaGVDb250cm9sQWRhcHRlcgpmcm9tIHBpcC5fdmVuZG9yLmNhY2hlY29udHJvbC5jYWNoZSBpbXBvcnQgRGljdENhY2hlCmZyb20gcGlwLl92ZW5kb3IuY2FjaGVjb250cm9sLmNvbnRyb2xsZXIgaW1wb3J0IGxvZ2dlcgoKZnJvbSBhcmdwYXJzZSBpbXBvcnQgQXJndW1lbnRQYXJzZXIKCgpkZWYgc2V0dXBfbG9nZ2luZygpOgogICAgbG9nZ2VyLnNldExldmVsKGxvZ2dpbmcuREVCVUcpCiAgICBoYW5kbGVyID0gbG9nZ2luZy5TdHJlYW1IYW5kbGVyKCkKICAgIGxvZ2dlci5hZGRIYW5kbGVyKGhhbmRsZXIpCgoKZGVmIGdldF9zZXNzaW9uKCk6CiAgICBhZGFwdGVyID0gQ2FjaGVDb250cm9sQWRhcHRlcigKICAgICAgICBEaWN0Q2FjaGUoKSwKICAgICAgICBjYWNoZV9ldGFncz1UcnVlLAogICAgICAgIHNlcmlhbGl6ZXI9Tm9uZSwKICAgICAgICBoZXVyaXN0aWM9Tm9uZSwKICAgICkKICAgIHNlc3MgPSByZXF1ZXN0cy5TZXNzaW9uKCkKICAgIHNlc3MubW91bnQoJ2h0dHA6Ly8nLCBhZGFwdGVyKQogICAgc2Vzcy5tb3VudCgnaHR0cHM6Ly8nLCBhZGFwdGVyKQoKICAgIHNlc3MuY2FjaGVfY29udHJvbGxlciA9IGFkYXB0ZXIuY29udHJvbGxlcgogICAgcmV0dXJuIHNlc3MKCgpkZWYgZ2V0X2FyZ3MoKToKICAgIHBhcnNlciA9IEFyZ3VtZW50UGFyc2VyKCkKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJ3VybCcsIGhlbHA9J1RoZSBVUkwgdG8gdHJ5IGFuZCBjYWNoZScpCiAgICByZXR1cm4gcGFyc2VyLnBhcnNlX2FyZ3MoKQoKCmRlZiBtYWluKGFyZ3M9Tm9uZSk6CiAgICBhcmdzID0gZ2V0X2FyZ3MoKQogICAgc2VzcyA9IGdldF9zZXNzaW9uKCkKCiAgICAjIE1ha2UgYSByZXF1ZXN0IHRvIGdldCBhIHJlc3BvbnNlCiAgICByZXNwID0gc2Vzcy5nZXQoYXJncy51cmwpCgogICAgIyBUdXJuIG9uIGxvZ2dpbmcKICAgIHNldHVwX2xvZ2dpbmcoKQoKICAgICMgdHJ5IHNldHRpbmcgdGhlIGNhY2hlCiAgICBzZXNzLmNhY2hlX2NvbnRyb2xsZXIuY2FjaGVfcmVzcG9uc2UocmVzcC5yZXF1ZXN0LCByZXNwLnJhdykKCiAgICAjIE5vdyB0cnkgdG8gZ2V0IGl0CiAgICBpZiBzZXNzLmNhY2hlX2NvbnRyb2xsZXIuY2FjaGVkX3JlcXVlc3QocmVzcC5yZXF1ZXN0KToKICAgICAgICBwcmludCgnQ2FjaGVkIScpCiAgICBlbHNlOgogICAgICAgIHByaW50KCdOb3QgY2FjaGVkIDooJykKCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgbWFpbigpClBLAwQUAAAAAAAAACEAUOapLAASAAAAEgAAMwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvYWRhcHRlci5weWltcG9ydCB0eXBlcwppbXBvcnQgZnVuY3Rvb2xzCgpmcm9tIHBpcC5fdmVuZG9yLnJlcXVlc3RzLmFkYXB0ZXJzIGltcG9ydCBIVFRQQWRhcHRlcgoKZnJvbSAuY29udHJvbGxlciBpbXBvcnQgQ2FjaGVDb250cm9sbGVyCmZyb20gLmNhY2hlIGltcG9ydCBEaWN0Q2FjaGUKZnJvbSAuZmlsZXdyYXBwZXIgaW1wb3J0IENhbGxiYWNrRmlsZVdyYXBwZXIKCgpjbGFzcyBDYWNoZUNvbnRyb2xBZGFwdGVyKEhUVFBBZGFwdGVyKToKICAgIGludmFsaWRhdGluZ19tZXRob2RzID0gc2V0KFsnUFVUJywgJ0RFTEVURSddKQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjYWNoZT1Ob25lLAogICAgICAgICAgICAgICAgIGNhY2hlX2V0YWdzPVRydWUsCiAgICAgICAgICAgICAgICAgY29udHJvbGxlcl9jbGFzcz1Ob25lLAogICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXI9Tm9uZSwKICAgICAgICAgICAgICAgICBoZXVyaXN0aWM9Tm9uZSwKICAgICAgICAgICAgICAgICAqYXJncywgKiprdyk6CiAgICAgICAgc3VwZXIoQ2FjaGVDb250cm9sQWRhcHRlciwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3cpCiAgICAgICAgc2VsZi5jYWNoZSA9IGNhY2hlIG9yIERpY3RDYWNoZSgpCiAgICAgICAgc2VsZi5oZXVyaXN0aWMgPSBoZXVyaXN0aWMKCiAgICAgICAgY29udHJvbGxlcl9mYWN0b3J5ID0gY29udHJvbGxlcl9jbGFzcyBvciBDYWNoZUNvbnRyb2xsZXIKICAgICAgICBzZWxmLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyX2ZhY3RvcnkoCiAgICAgICAgICAgIHNlbGYuY2FjaGUsCiAgICAgICAgICAgIGNhY2hlX2V0YWdzPWNhY2hlX2V0YWdzLAogICAgICAgICAgICBzZXJpYWxpemVyPXNlcmlhbGl6ZXIsCiAgICAgICAgKQoKICAgIGRlZiBzZW5kKHNlbGYsIHJlcXVlc3QsICoqa3cpOgogICAgICAgICIiIgogICAgICAgIFNlbmQgYSByZXF1ZXN0LiBVc2UgdGhlIHJlcXVlc3QgaW5mb3JtYXRpb24gdG8gc2VlIGlmIGl0CiAgICAgICAgZXhpc3RzIGluIHRoZSBjYWNoZSBhbmQgY2FjaGUgdGhlIHJlc3BvbnNlIGlmIHdlIG5lZWQgdG8gYW5kIGNhbi4KICAgICAgICAiIiIKICAgICAgICBpZiByZXF1ZXN0Lm1ldGhvZCA9PSAnR0VUJzoKICAgICAgICAgICAgY2FjaGVkX3Jlc3BvbnNlID0gc2VsZi5jb250cm9sbGVyLmNhY2hlZF9yZXF1ZXN0KHJlcXVlc3QpCiAgICAgICAgICAgIGlmIGNhY2hlZF9yZXNwb25zZToKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmJ1aWxkX3Jlc3BvbnNlKHJlcXVlc3QsIGNhY2hlZF9yZXNwb25zZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21fY2FjaGU9VHJ1ZSkKCiAgICAgICAgICAgICMgY2hlY2sgZm9yIGV0YWdzIGFuZCBhZGQgaGVhZGVycyBpZiBhcHByb3ByaWF0ZQogICAgICAgICAgICByZXF1ZXN0LmhlYWRlcnMudXBkYXRlKAogICAgICAgICAgICAgICAgc2VsZi5jb250cm9sbGVyLmNvbmRpdGlvbmFsX2hlYWRlcnMocmVxdWVzdCkKICAgICAgICAgICAgKQoKICAgICAgICByZXNwID0gc3VwZXIoQ2FjaGVDb250cm9sQWRhcHRlciwgc2VsZikuc2VuZChyZXF1ZXN0LCAqKmt3KQoKICAgICAgICByZXR1cm4gcmVzcAoKICAgIGRlZiBidWlsZF9yZXNwb25zZShzZWxmLCByZXF1ZXN0LCByZXNwb25zZSwgZnJvbV9jYWNoZT1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgQnVpbGQgYSByZXNwb25zZSBieSBtYWtpbmcgYSByZXF1ZXN0IG9yIHVzaW5nIHRoZSBjYWNoZS4KCiAgICAgICAgVGhpcyB3aWxsIGVuZCB1cCBjYWxsaW5nIHNlbmQgYW5kIHJldHVybmluZyBhIHBvdGVudGlhbGx5CiAgICAgICAgY2FjaGVkIHJlc3BvbnNlCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IGZyb21fY2FjaGUgYW5kIHJlcXVlc3QubWV0aG9kID09ICdHRVQnOgogICAgICAgICAgICAjIENoZWNrIGZvciBhbnkgaGV1cmlzdGljcyB0aGF0IG1pZ2h0IHVwZGF0ZSBoZWFkZXJzCiAgICAgICAgICAgICMgYmVmb3JlIHRyeWluZyB0byBjYWNoZS4KICAgICAgICAgICAgaWYgc2VsZi5oZXVyaXN0aWM6CiAgICAgICAgICAgICAgICByZXNwb25zZSA9IHNlbGYuaGV1cmlzdGljLmFwcGx5KHJlc3BvbnNlKQoKICAgICAgICAgICAgIyBhcHBseSBhbnkgZXhwaXJhdGlvbiBoZXVyaXN0aWNzCiAgICAgICAgICAgIGlmIHJlc3BvbnNlLnN0YXR1cyA9PSAzMDQ6CiAgICAgICAgICAgICAgICAjIFdlIG11c3QgaGF2ZSBzZW50IGFuIEVUYWcgcmVxdWVzdC4gVGhpcyBjb3VsZCBtZWFuCiAgICAgICAgICAgICAgICAjIHRoYXQgd2UndmUgYmVlbiBleHBpcmVkIGFscmVhZHkgb3IgdGhhdCB3ZSBzaW1wbHkKICAgICAgICAgICAgICAgICMgaGF2ZSBhbiBldGFnLiBJbiBlaXRoZXIgY2FzZSwgd2Ugd2FudCB0byB0cnkgYW5kCiAgICAgICAgICAgICAgICAjIHVwZGF0ZSB0aGUgY2FjaGUgaWYgdGhhdCBpcyB0aGUgY2FzZS4KICAgICAgICAgICAgICAgIGNhY2hlZF9yZXNwb25zZSA9IHNlbGYuY29udHJvbGxlci51cGRhdGVfY2FjaGVkX3Jlc3BvbnNlKAogICAgICAgICAgICAgICAgICAgIHJlcXVlc3QsIHJlc3BvbnNlCiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgaWYgY2FjaGVkX3Jlc3BvbnNlIGlzIG5vdCByZXNwb25zZToKICAgICAgICAgICAgICAgICAgICBmcm9tX2NhY2hlID0gVHJ1ZQoKICAgICAgICAgICAgICAgICMgV2UgYXJlIGRvbmUgd2l0aCB0aGUgc2VydmVyIHJlc3BvbnNlLCByZWFkIGEKICAgICAgICAgICAgICAgICMgcG9zc2libGUgcmVzcG9uc2UgYm9keSAoY29tcGxpYW50IHNlcnZlcnMgd2lsbAogICAgICAgICAgICAgICAgIyBub3QgcmV0dXJuIG9uZSwgYnV0IHdlIGNhbm5vdCBiZSAxMDAlIHN1cmUpIGFuZAogICAgICAgICAgICAgICAgIyByZWxlYXNlIHRoZSBjb25uZWN0aW9uIGJhY2sgdG8gdGhlIHBvb2wuCiAgICAgICAgICAgICAgICByZXNwb25zZS5yZWFkKGRlY29kZV9jb250ZW50PUZhbHNlKQogICAgICAgICAgICAgICAgcmVzcG9uc2UucmVsZWFzZV9jb25uKCkKCiAgICAgICAgICAgICAgICByZXNwb25zZSA9IGNhY2hlZF9yZXNwb25zZQoKICAgICAgICAgICAgIyBXZSBhbHdheXMgY2FjaGUgdGhlIDMwMSByZXNwb25zZXMKICAgICAgICAgICAgZWxpZiByZXNwb25zZS5zdGF0dXMgPT0gMzAxOgogICAgICAgICAgICAgICAgc2VsZi5jb250cm9sbGVyLmNhY2hlX3Jlc3BvbnNlKHJlcXVlc3QsIHJlc3BvbnNlKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBXcmFwIHRoZSByZXNwb25zZSBmaWxlIHdpdGggYSB3cmFwcGVyIHRoYXQgd2lsbCBjYWNoZSB0aGUKICAgICAgICAgICAgICAgICMgICByZXNwb25zZSB3aGVuIHRoZSBzdHJlYW0gaGFzIGJlZW4gY29uc3VtZWQuCiAgICAgICAgICAgICAgICByZXNwb25zZS5fZnAgPSBDYWxsYmFja0ZpbGVXcmFwcGVyKAogICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLl9mcCwKICAgICAgICAgICAgICAgICAgICBmdW5jdG9vbHMucGFydGlhbCgKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250cm9sbGVyLmNhY2hlX3Jlc3BvbnNlLAogICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LAogICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBpZiByZXNwb25zZS5jaHVua2VkOgogICAgICAgICAgICAgICAgICAgIHN1cGVyX3VwZGF0ZV9jaHVua19sZW5ndGggPSByZXNwb25zZS5fdXBkYXRlX2NodW5rX2xlbmd0aAoKICAgICAgICAgICAgICAgICAgICBkZWYgX3VwZGF0ZV9jaHVua19sZW5ndGgoc2VsZik6CiAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyX3VwZGF0ZV9jaHVua19sZW5ndGgoKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmNodW5rX2xlZnQgPT0gMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2ZwLl9jbG9zZSgpCiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuX3VwZGF0ZV9jaHVua19sZW5ndGggPSB0eXBlcy5NZXRob2RUeXBlKF91cGRhdGVfY2h1bmtfbGVuZ3RoLCByZXNwb25zZSkKCiAgICAgICAgcmVzcCA9IHN1cGVyKENhY2hlQ29udHJvbEFkYXB0ZXIsIHNlbGYpLmJ1aWxkX3Jlc3BvbnNlKAogICAgICAgICAgICByZXF1ZXN0LCByZXNwb25zZQogICAgICAgICkKCiAgICAgICAgIyBTZWUgaWYgd2Ugc2hvdWxkIGludmFsaWRhdGUgdGhlIGNhY2hlLgogICAgICAgIGlmIHJlcXVlc3QubWV0aG9kIGluIHNlbGYuaW52YWxpZGF0aW5nX21ldGhvZHMgYW5kIHJlc3Aub2s6CiAgICAgICAgICAgIGNhY2hlX3VybCA9IHNlbGYuY29udHJvbGxlci5jYWNoZV91cmwocmVxdWVzdC51cmwpCiAgICAgICAgICAgIHNlbGYuY2FjaGUuZGVsZXRlKGNhY2hlX3VybCkKCiAgICAgICAgIyBHaXZlIHRoZSByZXF1ZXN0IGEgZnJvbV9jYWNoZSBhdHRyIHRvIGxldCBwZW9wbGUgdXNlIGl0CiAgICAgICAgcmVzcC5mcm9tX2NhY2hlID0gZnJvbV9jYWNoZQoKICAgICAgICByZXR1cm4gcmVzcAoKICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICBzZWxmLmNhY2hlLmNsb3NlKCkKICAgICAgICBzdXBlcihDYWNoZUNvbnRyb2xBZGFwdGVyLCBzZWxmKS5jbG9zZSgpClBLAwQUAAAAAAAAACEAEqrG8BYDAAAWAwAAMQAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvY2FjaGUucHkiIiIKVGhlIGNhY2hlIG9iamVjdCBBUEkgZm9yIGltcGxlbWVudGluZyBjYWNoZXMuIFRoZSBkZWZhdWx0IGlzIGEgdGhyZWFkCnNhZmUgaW4tbWVtb3J5IGRpY3Rpb25hcnkuCiIiIgpmcm9tIHRocmVhZGluZyBpbXBvcnQgTG9jawoKCmNsYXNzIEJhc2VDYWNoZShvYmplY3QpOgoKICAgIGRlZiBnZXQoc2VsZiwga2V5KToKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZCgpCgogICAgZGVmIHNldChzZWxmLCBrZXksIHZhbHVlKToKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZCgpCgogICAgZGVmIGRlbGV0ZShzZWxmLCBrZXkpOgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkKCkKCiAgICBkZWYgY2xvc2Uoc2VsZik6CiAgICAgICAgcGFzcwoKCmNsYXNzIERpY3RDYWNoZShCYXNlQ2FjaGUpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpbml0X2RpY3Q9Tm9uZSk6CiAgICAgICAgc2VsZi5sb2NrID0gTG9jaygpCiAgICAgICAgc2VsZi5kYXRhID0gaW5pdF9kaWN0IG9yIHt9CgogICAgZGVmIGdldChzZWxmLCBrZXkpOgogICAgICAgIHJldHVybiBzZWxmLmRhdGEuZ2V0KGtleSwgTm9uZSkKCiAgICBkZWYgc2V0KHNlbGYsIGtleSwgdmFsdWUpOgogICAgICAgIHdpdGggc2VsZi5sb2NrOgogICAgICAgICAgICBzZWxmLmRhdGEudXBkYXRlKHtrZXk6IHZhbHVlfSkKCiAgICBkZWYgZGVsZXRlKHNlbGYsIGtleSk6CiAgICAgICAgd2l0aCBzZWxmLmxvY2s6CiAgICAgICAgICAgIGlmIGtleSBpbiBzZWxmLmRhdGE6CiAgICAgICAgICAgICAgICBzZWxmLmRhdGEucG9wKGtleSkKUEsDBBQAAAAAAAAAIQCeHVb8cQEAAHEBAAA7AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9jYWNoZXMvX19pbml0X18ucHlmcm9tIHRleHR3cmFwIGltcG9ydCBkZWRlbnQKCnRyeToKICAgIGZyb20gLmZpbGVfY2FjaGUgaW1wb3J0IEZpbGVDYWNoZQpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBub3RpY2UgPSBkZWRlbnQoJycnCiAgICBOT1RFOiBJbiBvcmRlciB0byB1c2UgdGhlIEZpbGVDYWNoZSB5b3UgbXVzdCBoYXZlCiAgICBsb2NrZmlsZSBpbnN0YWxsZWQuIFlvdSBjYW4gaW5zdGFsbCBpdCB2aWEgcGlwOgogICAgICBwaXAgaW5zdGFsbCBsb2NrZmlsZQogICAgJycnKQogICAgcHJpbnQobm90aWNlKQoKCnRyeToKICAgIGltcG9ydCByZWRpcwogICAgZnJvbSAucmVkaXNfY2FjaGUgaW1wb3J0IFJlZGlzQ2FjaGUKZXhjZXB0IEltcG9ydEVycm9yOgogICAgcGFzcwpQSwMEFAAAAAAAAAAhAMGnBv/MDQAAzA0AAD0AAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL2NhY2hlcy9maWxlX2NhY2hlLnB5aW1wb3J0IGhhc2hsaWIKaW1wb3J0IG9zCgpmcm9tIHBpcC5fdmVuZG9yLmxvY2tmaWxlIGltcG9ydCBMb2NrRmlsZQpmcm9tIHBpcC5fdmVuZG9yLmxvY2tmaWxlLm1rZGlybG9ja2ZpbGUgaW1wb3J0IE1rZGlyTG9ja0ZpbGUKCmZyb20gLi5jYWNoZSBpbXBvcnQgQmFzZUNhY2hlCmZyb20gLi5jb250cm9sbGVyIGltcG9ydCBDYWNoZUNvbnRyb2xsZXIKCgpkZWYgX3NlY3VyZV9vcGVuX3dyaXRlKGZpbGVuYW1lLCBmbW9kZSk6CiAgICAjIFdlIG9ubHkgd2FudCB0byB3cml0ZSB0byB0aGlzIGZpbGUsIHNvIG9wZW4gaXQgaW4gd3JpdGUgb25seSBtb2RlCiAgICBmbGFncyA9IG9zLk9fV1JPTkxZCgogICAgIyBvcy5PX0NSRUFUIHwgb3MuT19FWENMIHdpbGwgZmFpbCBpZiB0aGUgZmlsZSBhbHJlYWR5IGV4aXN0cywgc28gd2Ugb25seQogICAgIyAgd2lsbCBvcGVuICpuZXcqIGZpbGVzLgogICAgIyBXZSBzcGVjaWZ5IHRoaXMgYmVjYXVzZSB3ZSB3YW50IHRvIGVuc3VyZSB0aGF0IHRoZSBtb2RlIHdlIHBhc3MgaXMgdGhlCiAgICAjIG1vZGUgb2YgdGhlIGZpbGUuCiAgICBmbGFncyB8PSBvcy5PX0NSRUFUIHwgb3MuT19FWENMCgogICAgIyBEbyBub3QgZm9sbG93IHN5bWxpbmtzIHRvIHByZXZlbnQgc29tZW9uZSBmcm9tIG1ha2luZyBhIHN5bWxpbmsgdGhhdAogICAgIyB3ZSBmb2xsb3cgYW5kIGluc2VjdXJlbHkgb3BlbiBhIGNhY2hlIGZpbGUuCiAgICBpZiBoYXNhdHRyKG9zLCAiT19OT0ZPTExPVyIpOgogICAgICAgIGZsYWdzIHw9IG9zLk9fTk9GT0xMT1cKCiAgICAjIE9uIFdpbmRvd3Mgd2UnbGwgbWFyayB0aGlzIGZpbGUgYXMgYmluYXJ5CiAgICBpZiBoYXNhdHRyKG9zLCAiT19CSU5BUlkiKToKICAgICAgICBmbGFncyB8PSBvcy5PX0JJTkFSWQoKICAgICMgQmVmb3JlIHdlIG9wZW4gb3VyIGZpbGUsIHdlIHdhbnQgdG8gZGVsZXRlIGFueSBleGlzdGluZyBmaWxlIHRoYXQgaXMKICAgICMgdGhlcmUKICAgIHRyeToKICAgICAgICBvcy5yZW1vdmUoZmlsZW5hbWUpCiAgICBleGNlcHQgKElPRXJyb3IsIE9TRXJyb3IpOgogICAgICAgICMgVGhlIGZpbGUgbXVzdCBub3QgZXhpc3QgYWxyZWFkeSwgc28gd2UgY2FuIGp1c3Qgc2tpcCBhaGVhZCB0byBvcGVuaW5nCiAgICAgICAgcGFzcwoKICAgICMgT3BlbiBvdXIgZmlsZSwgdGhlIHVzZSBvZiBvcy5PX0NSRUFUIHwgb3MuT19FWENMIHdpbGwgZW5zdXJlIHRoYXQgaWYgYQogICAgIyByYWNlIGNvbmRpdGlvbiBoYXBwZW5zIGJldHdlZW4gdGhlIG9zLnJlbW92ZSBhbmQgdGhpcyBsaW5lLCB0aGF0IGFuCiAgICAjIGVycm9yIHdpbGwgYmUgcmFpc2VkLiBCZWNhdXNlIHdlIHV0aWxpemUgYSBsb2NrZmlsZSB0aGlzIHNob3VsZCBvbmx5CiAgICAjIGhhcHBlbiBpZiBzb21lb25lIGlzIGF0dGVtcHRpbmcgdG8gYXR0YWNrIHVzLgogICAgZmQgPSBvcy5vcGVuKGZpbGVuYW1lLCBmbGFncywgZm1vZGUpCiAgICB0cnk6CiAgICAgICAgcmV0dXJuIG9zLmZkb3BlbihmZCwgIndiIikKICAgIGV4Y2VwdDoKICAgICAgICAjIEFuIGVycm9yIG9jY3VycmVkIHdyYXBwaW5nIG91ciBGRCBpbiBhIGZpbGUgb2JqZWN0CiAgICAgICAgb3MuY2xvc2UoZmQpCiAgICAgICAgcmFpc2UKCgpjbGFzcyBGaWxlQ2FjaGUoQmFzZUNhY2hlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkaXJlY3RvcnksIGZvcmV2ZXI9RmFsc2UsIGZpbGVtb2RlPTBvMDYwMCwKICAgICAgICAgICAgICAgICBkaXJtb2RlPTBvMDcwMCwgdXNlX2Rpcl9sb2NrPU5vbmUsIGxvY2tfY2xhc3M9Tm9uZSk6CgogICAgICAgIGlmIHVzZV9kaXJfbG9jayBpcyBub3QgTm9uZSBhbmQgbG9ja19jbGFzcyBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiQ2Fubm90IHVzZSB1c2VfZGlyX2xvY2sgYW5kIGxvY2tfY2xhc3MgdG9nZXRoZXIiKQoKICAgICAgICBpZiB1c2VfZGlyX2xvY2s6CiAgICAgICAgICAgIGxvY2tfY2xhc3MgPSBNa2RpckxvY2tGaWxlCgogICAgICAgIGlmIGxvY2tfY2xhc3MgaXMgTm9uZToKICAgICAgICAgICAgbG9ja19jbGFzcyA9IExvY2tGaWxlCgogICAgICAgIHNlbGYuZGlyZWN0b3J5ID0gZGlyZWN0b3J5CiAgICAgICAgc2VsZi5mb3JldmVyID0gZm9yZXZlcgogICAgICAgIHNlbGYuZmlsZW1vZGUgPSBmaWxlbW9kZQogICAgICAgIHNlbGYuZGlybW9kZSA9IGRpcm1vZGUKICAgICAgICBzZWxmLmxvY2tfY2xhc3MgPSBsb2NrX2NsYXNzCgoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBlbmNvZGUoeCk6CiAgICAgICAgcmV0dXJuIGhhc2hsaWIuc2hhMjI0KHguZW5jb2RlKCkpLmhleGRpZ2VzdCgpCgogICAgZGVmIF9mbihzZWxmLCBuYW1lKToKICAgICAgICAjIE5PVEU6IFRoaXMgbWV0aG9kIHNob3VsZCBub3QgY2hhbmdlIGFzIHNvbWUgbWF5IGRlcGVuZCBvbiBpdC4KICAgICAgICAjICAgICAgIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2lvbnJvY2svY2FjaGVjb250cm9sL2lzc3Vlcy82MwogICAgICAgIGhhc2hlZCA9IHNlbGYuZW5jb2RlKG5hbWUpCiAgICAgICAgcGFydHMgPSBsaXN0KGhhc2hlZFs6NV0pICsgW2hhc2hlZF0KICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKHNlbGYuZGlyZWN0b3J5LCAqcGFydHMpCgogICAgZGVmIGdldChzZWxmLCBrZXkpOgogICAgICAgIG5hbWUgPSBzZWxmLl9mbihrZXkpCiAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKG5hbWUpOgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICB3aXRoIG9wZW4obmFtZSwgJ3JiJykgYXMgZmg6CiAgICAgICAgICAgIHJldHVybiBmaC5yZWFkKCkKCiAgICBkZWYgc2V0KHNlbGYsIGtleSwgdmFsdWUpOgogICAgICAgIG5hbWUgPSBzZWxmLl9mbihrZXkpCgogICAgICAgICMgTWFrZSBzdXJlIHRoZSBkaXJlY3RvcnkgZXhpc3RzCiAgICAgICAgdHJ5OgogICAgICAgICAgICBvcy5tYWtlZGlycyhvcy5wYXRoLmRpcm5hbWUobmFtZSksIHNlbGYuZGlybW9kZSkKICAgICAgICBleGNlcHQgKElPRXJyb3IsIE9TRXJyb3IpOgogICAgICAgICAgICBwYXNzCgogICAgICAgIHdpdGggc2VsZi5sb2NrX2NsYXNzKG5hbWUpIGFzIGxvY2s6CiAgICAgICAgICAgICMgV3JpdGUgb3VyIGFjdHVhbCBmaWxlCiAgICAgICAgICAgIHdpdGggX3NlY3VyZV9vcGVuX3dyaXRlKGxvY2sucGF0aCwgc2VsZi5maWxlbW9kZSkgYXMgZmg6CiAgICAgICAgICAgICAgICBmaC53cml0ZSh2YWx1ZSkKCiAgICBkZWYgZGVsZXRlKHNlbGYsIGtleSk6CiAgICAgICAgbmFtZSA9IHNlbGYuX2ZuKGtleSkKICAgICAgICBpZiBub3Qgc2VsZi5mb3JldmVyOgogICAgICAgICAgICBvcy5yZW1vdmUobmFtZSkKCgpkZWYgdXJsX3RvX2ZpbGVfcGF0aCh1cmwsIGZpbGVjYWNoZSk6CiAgICAiIiJSZXR1cm4gdGhlIGZpbGUgY2FjaGUgcGF0aCBiYXNlZCBvbiB0aGUgVVJMLgoKICAgIFRoaXMgZG9lcyBub3QgZW5zdXJlIHRoZSBmaWxlIGV4aXN0cyEKICAgICIiIgogICAga2V5ID0gQ2FjaGVDb250cm9sbGVyLmNhY2hlX3VybCh1cmwpCiAgICByZXR1cm4gZmlsZWNhY2hlLl9mbihrZXkpClBLAwQUAAAAAAAAACEA04jGVM0DAADNAwAAPgAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvY2FjaGVzL3JlZGlzX2NhY2hlLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBkaXZpc2lvbgoKZnJvbSBkYXRldGltZSBpbXBvcnQgZGF0ZXRpbWUKCgpkZWYgdG90YWxfc2Vjb25kcyh0ZCk6CiAgICAiIiJQeXRob24gMi42IGNvbXBhdGFiaWxpdHkiIiIKICAgIGlmIGhhc2F0dHIodGQsICd0b3RhbF9zZWNvbmRzJyk6CiAgICAgICAgcmV0dXJuIHRkLnRvdGFsX3NlY29uZHMoKQoKICAgIG1zID0gdGQubWljcm9zZWNvbmRzCiAgICBzZWNzID0gKHRkLnNlY29uZHMgKyB0ZC5kYXlzICogMjQgKiAzNjAwKQogICAgcmV0dXJuIChtcyArIHNlY3MgKiAxMCoqNikgLyAxMCoqNgoKCmNsYXNzIFJlZGlzQ2FjaGUob2JqZWN0KToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgY29ubik6CiAgICAgICAgc2VsZi5jb25uID0gY29ubgoKICAgIGRlZiBnZXQoc2VsZiwga2V5KToKICAgICAgICByZXR1cm4gc2VsZi5jb25uLmdldChrZXkpCgogICAgZGVmIHNldChzZWxmLCBrZXksIHZhbHVlLCBleHBpcmVzPU5vbmUpOgogICAgICAgIGlmIG5vdCBleHBpcmVzOgogICAgICAgICAgICBzZWxmLmNvbm4uc2V0KGtleSwgdmFsdWUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZXhwaXJlcyA9IGV4cGlyZXMgLSBkYXRldGltZS5ub3coKQogICAgICAgICAgICBzZWxmLmNvbm4uc2V0ZXgoa2V5LCB0b3RhbF9zZWNvbmRzKGV4cGlyZXMpLCB2YWx1ZSkKCiAgICBkZWYgZGVsZXRlKHNlbGYsIGtleSk6CiAgICAgICAgc2VsZi5jb25uLmRlbGV0ZShrZXkpCgogICAgZGVmIGNsZWFyKHNlbGYpOgogICAgICAgICIiIkhlbHBlciBmb3IgY2xlYXJpbmcgYWxsIHRoZSBrZXlzIGluIGEgZGF0YWJhc2UuIFVzZSB3aXRoCiAgICAgICAgY2F1dGlvbiEiIiIKICAgICAgICBmb3Iga2V5IGluIHNlbGYuY29ubi5rZXlzKCk6CiAgICAgICAgICAgIHNlbGYuY29ubi5kZWxldGUoa2V5KQoKICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICBzZWxmLmNvbm4uZGlzY29ubmVjdCgpClBLAwQUAAAAAAAAACEALTwtM3wBAAB8AQAAMgAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvY29tcGF0LnB5dHJ5OgogICAgZnJvbSB1cmxsaWIucGFyc2UgaW1wb3J0IHVybGpvaW4KZXhjZXB0IEltcG9ydEVycm9yOgogICAgZnJvbSB1cmxwYXJzZSBpbXBvcnQgdXJsam9pbgoKCnRyeToKICAgIGltcG9ydCBjUGlja2xlIGFzIHBpY2tsZQpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBpbXBvcnQgcGlja2xlCgoKZnJvbSBwaXAuX3ZlbmRvci51cmxsaWIzLnJlc3BvbnNlIGltcG9ydCBIVFRQUmVzcG9uc2UKZnJvbSBwaXAuX3ZlbmRvci51cmxsaWIzLnV0aWwgaW1wb3J0IGlzX2ZwX2Nsb3NlZAoKIyBSZXBsaWNhdGUgc29tZSBzaXggYmVoYXZpb3VyCnRyeToKICAgIHRleHRfdHlwZSA9ICh1bmljb2RlLCkKZXhjZXB0IE5hbWVFcnJvcjoKICAgIHRleHRfdHlwZSA9IChzdHIsKQpQSwMEFAAAAAAAAAAhAMdgud7gMgAA4DIAADYAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL2NvbnRyb2xsZXIucHkiIiIKVGhlIGh0dHBsaWIyIGFsZ29yaXRobXMgcG9ydGVkIGZvciB1c2Ugd2l0aCByZXF1ZXN0cy4KIiIiCmltcG9ydCBsb2dnaW5nCmltcG9ydCByZQppbXBvcnQgY2FsZW5kYXIKaW1wb3J0IHRpbWUKZnJvbSBlbWFpbC51dGlscyBpbXBvcnQgcGFyc2VkYXRlX3R6Cgpmcm9tIHBpcC5fdmVuZG9yLnJlcXVlc3RzLnN0cnVjdHVyZXMgaW1wb3J0IENhc2VJbnNlbnNpdGl2ZURpY3QKCmZyb20gLmNhY2hlIGltcG9ydCBEaWN0Q2FjaGUKZnJvbSAuc2VyaWFsaXplIGltcG9ydCBTZXJpYWxpemVyCgoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgpVUkkgPSByZS5jb21waWxlKHIiXigoW146Lz8jXSspOik/KC8vKFteLz8jXSopKT8oW14/I10qKShcPyhbXiNdKikpPygjKC4qKSk/IikKCgpkZWYgcGFyc2VfdXJpKHVyaSk6CiAgICAiIiJQYXJzZXMgYSBVUkkgdXNpbmcgdGhlIHJlZ2V4IGdpdmVuIGluIEFwcGVuZGl4IEIgb2YgUkZDIDM5ODYuCgogICAgICAgIChzY2hlbWUsIGF1dGhvcml0eSwgcGF0aCwgcXVlcnksIGZyYWdtZW50KSA9IHBhcnNlX3VyaSh1cmkpCiAgICAiIiIKICAgIGdyb3VwcyA9IFVSSS5tYXRjaCh1cmkpLmdyb3VwcygpCiAgICByZXR1cm4gKGdyb3Vwc1sxXSwgZ3JvdXBzWzNdLCBncm91cHNbNF0sIGdyb3Vwc1s2XSwgZ3JvdXBzWzhdKQoKCmNsYXNzIENhY2hlQ29udHJvbGxlcihvYmplY3QpOgogICAgIiIiQW4gaW50ZXJmYWNlIHRvIHNlZSBpZiByZXF1ZXN0IHNob3VsZCBjYWNoZWQgb3Igbm90LgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgY2FjaGU9Tm9uZSwgY2FjaGVfZXRhZ3M9VHJ1ZSwgc2VyaWFsaXplcj1Ob25lKToKICAgICAgICBzZWxmLmNhY2hlID0gY2FjaGUgb3IgRGljdENhY2hlKCkKICAgICAgICBzZWxmLmNhY2hlX2V0YWdzID0gY2FjaGVfZXRhZ3MKICAgICAgICBzZWxmLnNlcmlhbGl6ZXIgPSBzZXJpYWxpemVyIG9yIFNlcmlhbGl6ZXIoKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF91cmxub3JtKGNscywgdXJpKToKICAgICAgICAiIiJOb3JtYWxpemUgdGhlIFVSTCB0byBjcmVhdGUgYSBzYWZlIGtleSBmb3IgdGhlIGNhY2hlIiIiCiAgICAgICAgKHNjaGVtZSwgYXV0aG9yaXR5LCBwYXRoLCBxdWVyeSwgZnJhZ21lbnQpID0gcGFyc2VfdXJpKHVyaSkKICAgICAgICBpZiBub3Qgc2NoZW1lIG9yIG5vdCBhdXRob3JpdHk6CiAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiT25seSBhYnNvbHV0ZSBVUklzIGFyZSBhbGxvd2VkLiB1cmkgPSAlcyIgJSB1cmkpCgogICAgICAgIHNjaGVtZSA9IHNjaGVtZS5sb3dlcigpCiAgICAgICAgYXV0aG9yaXR5ID0gYXV0aG9yaXR5Lmxvd2VyKCkKCiAgICAgICAgaWYgbm90IHBhdGg6CiAgICAgICAgICAgIHBhdGggPSAiLyIKCiAgICAgICAgIyBDb3VsZCBkbyBzeW50YXggYmFzZWQgbm9ybWFsaXphdGlvbiBvZiB0aGUgVVJJIGJlZm9yZQogICAgICAgICMgY29tcHV0aW5nIHRoZSBkaWdlc3QuIFNlZSBTZWN0aW9uIDYuMi4yIG9mIFN0ZCA2Ni4KICAgICAgICByZXF1ZXN0X3VyaSA9IHF1ZXJ5IGFuZCAiPyIuam9pbihbcGF0aCwgcXVlcnldKSBvciBwYXRoCiAgICAgICAgZGVmcmFnX3VyaSA9IHNjaGVtZSArICI6Ly8iICsgYXV0aG9yaXR5ICsgcmVxdWVzdF91cmkKCiAgICAgICAgcmV0dXJuIGRlZnJhZ191cmkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBjYWNoZV91cmwoY2xzLCB1cmkpOgogICAgICAgIHJldHVybiBjbHMuX3VybG5vcm0odXJpKQoKICAgIGRlZiBwYXJzZV9jYWNoZV9jb250cm9sKHNlbGYsIGhlYWRlcnMpOgogICAgICAgICIiIgogICAgICAgIFBhcnNlIHRoZSBjYWNoZSBjb250cm9sIGhlYWRlcnMgcmV0dXJuaW5nIGEgZGljdGlvbmFyeSB3aXRoIHZhbHVlcwogICAgICAgIGZvciB0aGUgZGlmZmVyZW50IGRpcmVjdGl2ZXMuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dmFsID0ge30KCiAgICAgICAgY2NfaGVhZGVyID0gJ2NhY2hlLWNvbnRyb2wnCiAgICAgICAgaWYgJ0NhY2hlLUNvbnRyb2wnIGluIGhlYWRlcnM6CiAgICAgICAgICAgIGNjX2hlYWRlciA9ICdDYWNoZS1Db250cm9sJwoKICAgICAgICBpZiBjY19oZWFkZXIgaW4gaGVhZGVyczoKICAgICAgICAgICAgcGFydHMgPSBoZWFkZXJzW2NjX2hlYWRlcl0uc3BsaXQoJywnKQogICAgICAgICAgICBwYXJ0c193aXRoX2FyZ3MgPSBbCiAgICAgICAgICAgICAgICB0dXBsZShbeC5zdHJpcCgpLmxvd2VyKCkgZm9yIHggaW4gcGFydC5zcGxpdCgiPSIsIDEpXSkKICAgICAgICAgICAgICAgIGZvciBwYXJ0IGluIHBhcnRzIGlmIC0xICE9IHBhcnQuZmluZCgiPSIpCiAgICAgICAgICAgIF0KICAgICAgICAgICAgcGFydHNfd29fYXJncyA9IFsKICAgICAgICAgICAgICAgIChuYW1lLnN0cmlwKCkubG93ZXIoKSwgMSkKICAgICAgICAgICAgICAgIGZvciBuYW1lIGluIHBhcnRzIGlmIC0xID09IG5hbWUuZmluZCgiPSIpCiAgICAgICAgICAgIF0KICAgICAgICAgICAgcmV0dmFsID0gZGljdChwYXJ0c193aXRoX2FyZ3MgKyBwYXJ0c193b19hcmdzKQogICAgICAgIHJldHVybiByZXR2YWwKCiAgICBkZWYgY2FjaGVkX3JlcXVlc3Qoc2VsZiwgcmVxdWVzdCk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGEgY2FjaGVkIHJlc3BvbnNlIGlmIGl0IGV4aXN0cyBpbiB0aGUgY2FjaGUsIG90aGVyd2lzZQogICAgICAgIHJldHVybiBGYWxzZS4KICAgICAgICAiIiIKICAgICAgICBjYWNoZV91cmwgPSBzZWxmLmNhY2hlX3VybChyZXF1ZXN0LnVybCkKICAgICAgICBsb2dnZXIuZGVidWcoJ0xvb2tpbmcgdXAgIiVzIiBpbiB0aGUgY2FjaGUnLCBjYWNoZV91cmwpCiAgICAgICAgY2MgPSBzZWxmLnBhcnNlX2NhY2hlX2NvbnRyb2wocmVxdWVzdC5oZWFkZXJzKQoKICAgICAgICAjIEJhaWwgb3V0IGlmIHRoZSByZXF1ZXN0IGluc2lzdHMgb24gZnJlc2ggZGF0YQogICAgICAgIGlmICduby1jYWNoZScgaW4gY2M6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnUmVxdWVzdCBoZWFkZXIgaGFzICJuby1jYWNoZSIsIGNhY2hlIGJ5cGFzc2VkJykKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIGlmICdtYXgtYWdlJyBpbiBjYyBhbmQgY2NbJ21heC1hZ2UnXSA9PSAwOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1JlcXVlc3QgaGVhZGVyIGhhcyAibWF4X2FnZSIgYXMgMCwgY2FjaGUgYnlwYXNzZWQnKQogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBSZXF1ZXN0IGFsbG93cyBzZXJ2aW5nIGZyb20gdGhlIGNhY2hlLCBsZXQncyBzZWUgaWYgd2UgZmluZCBzb21ldGhpbmcKICAgICAgICBjYWNoZV9kYXRhID0gc2VsZi5jYWNoZS5nZXQoY2FjaGVfdXJsKQogICAgICAgIGlmIGNhY2hlX2RhdGEgaXMgTm9uZToKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdObyBjYWNoZSBlbnRyeSBhdmFpbGFibGUnKQogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBDaGVjayB3aGV0aGVyIGl0IGNhbiBiZSBkZXNlcmlhbGl6ZWQKICAgICAgICByZXNwID0gc2VsZi5zZXJpYWxpemVyLmxvYWRzKHJlcXVlc3QsIGNhY2hlX2RhdGEpCiAgICAgICAgaWYgbm90IHJlc3A6CiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdDYWNoZSBlbnRyeSBkZXNlcmlhbGl6YXRpb24gZmFpbGVkLCBlbnRyeSBpZ25vcmVkJykKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgSWYgd2UgaGF2ZSBhIGNhY2hlZCAzMDEsIHJldHVybiBpdCBpbW1lZGlhdGVseS4gV2UgZG9uJ3QKICAgICAgICAjIG5lZWQgdG8gdGVzdCBvdXIgcmVzcG9uc2UgZm9yIG90aGVyIGhlYWRlcnMgYi9jIGl0IGlzCiAgICAgICAgIyBpbnRyaW5zaWNhbGx5ICJjYWNoZWFibGUiIGFzIGl0IGlzIFBlcm1hbmVudC4KICAgICAgICAjIFNlZToKICAgICAgICAjICAgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzEjc2VjdGlvbi02LjQuMgogICAgICAgICMKICAgICAgICAjIENsaWVudCBjYW4gdHJ5IHRvIHJlZnJlc2ggdGhlIHZhbHVlIGJ5IHJlcGVhdGluZyB0aGUgcmVxdWVzdAogICAgICAgICMgd2l0aCBjYWNoZSBidXN0aW5nIGhlYWRlcnMgYXMgdXN1YWwgKGllIG5vLWNhY2hlKS4KICAgICAgICBpZiByZXNwLnN0YXR1cyA9PSAzMDE6CiAgICAgICAgICAgIG1zZyA9ICgnUmV0dXJuaW5nIGNhY2hlZCAiMzAxIE1vdmVkIFBlcm1hbmVudGx5IiByZXNwb25zZSAnCiAgICAgICAgICAgICAgICAgICAnKGlnbm9yaW5nIGRhdGUgYW5kIGV0YWcgaW5mb3JtYXRpb24pJykKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKG1zZykKICAgICAgICAgICAgcmV0dXJuIHJlc3AKCiAgICAgICAgaGVhZGVycyA9IENhc2VJbnNlbnNpdGl2ZURpY3QocmVzcC5oZWFkZXJzKQogICAgICAgIGlmIG5vdCBoZWFkZXJzIG9yICdkYXRlJyBub3QgaW4gaGVhZGVyczoKICAgICAgICAgICAgaWYgJ2V0YWcnIG5vdCBpbiBoZWFkZXJzOgogICAgICAgICAgICAgICAgIyBXaXRob3V0IGRhdGUgb3IgZXRhZywgdGhlIGNhY2hlZCByZXNwb25zZSBjYW4gbmV2ZXIgYmUgdXNlZAogICAgICAgICAgICAgICAgIyBhbmQgc2hvdWxkIGJlIGRlbGV0ZWQuCiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1B1cmdpbmcgY2FjaGVkIHJlc3BvbnNlOiBubyBkYXRlIG9yIGV0YWcnKQogICAgICAgICAgICAgICAgc2VsZi5jYWNoZS5kZWxldGUoY2FjaGVfdXJsKQogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0lnbm9yaW5nIGNhY2hlZCByZXNwb25zZTogbm8gZGF0ZScpCiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICBub3cgPSB0aW1lLnRpbWUoKQogICAgICAgIGRhdGUgPSBjYWxlbmRhci50aW1lZ20oCiAgICAgICAgICAgIHBhcnNlZGF0ZV90eihoZWFkZXJzWydkYXRlJ10pCiAgICAgICAgKQogICAgICAgIGN1cnJlbnRfYWdlID0gbWF4KDAsIG5vdyAtIGRhdGUpCiAgICAgICAgbG9nZ2VyLmRlYnVnKCdDdXJyZW50IGFnZSBiYXNlZCBvbiBkYXRlOiAlaScsIGN1cnJlbnRfYWdlKQoKICAgICAgICAjIFRPRE86IFRoZXJlIGlzIGFuIGFzc3VtcHRpb24gdGhhdCB0aGUgcmVzdWx0IHdpbGwgYmUgYQogICAgICAgICMgICAgICAgdXJsbGliMyByZXNwb25zZSBvYmplY3QuIFRoaXMgbWF5IG5vdCBiZSBiZXN0IHNpbmNlIHdlCiAgICAgICAgIyAgICAgICBjb3VsZCBwcm9iYWJseSBhdm9pZCBpbnN0YW50aWF0aW5nIG9yIGNvbnN0cnVjdGluZyB0aGUKICAgICAgICAjICAgICAgIHJlc3BvbnNlIHVudGlsIHdlIGtub3cgd2UgbmVlZCBpdC4KICAgICAgICByZXNwX2NjID0gc2VsZi5wYXJzZV9jYWNoZV9jb250cm9sKGhlYWRlcnMpCgogICAgICAgICMgZGV0ZXJtaW5lIGZyZXNobmVzcwogICAgICAgIGZyZXNobmVzc19saWZldGltZSA9IDAKCiAgICAgICAgIyBDaGVjayB0aGUgbWF4LWFnZSBwcmFnbWEgaW4gdGhlIGNhY2hlIGNvbnRyb2wgaGVhZGVyCiAgICAgICAgaWYgJ21heC1hZ2UnIGluIHJlc3BfY2MgYW5kIHJlc3BfY2NbJ21heC1hZ2UnXS5pc2RpZ2l0KCk6CiAgICAgICAgICAgIGZyZXNobmVzc19saWZldGltZSA9IGludChyZXNwX2NjWydtYXgtYWdlJ10pCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnRnJlc2huZXNzIGxpZmV0aW1lIGZyb20gbWF4LWFnZTogJWknLAogICAgICAgICAgICAgICAgICAgICAgICAgZnJlc2huZXNzX2xpZmV0aW1lKQoKICAgICAgICAjIElmIHRoZXJlIGlzbid0IGEgbWF4LWFnZSwgY2hlY2sgZm9yIGFuIGV4cGlyZXMgaGVhZGVyCiAgICAgICAgZWxpZiAnZXhwaXJlcycgaW4gaGVhZGVyczoKICAgICAgICAgICAgZXhwaXJlcyA9IHBhcnNlZGF0ZV90eihoZWFkZXJzWydleHBpcmVzJ10pCiAgICAgICAgICAgIGlmIGV4cGlyZXMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBleHBpcmVfdGltZSA9IGNhbGVuZGFyLnRpbWVnbShleHBpcmVzKSAtIGRhdGUKICAgICAgICAgICAgICAgIGZyZXNobmVzc19saWZldGltZSA9IG1heCgwLCBleHBpcmVfdGltZSkKICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiRnJlc2huZXNzIGxpZmV0aW1lIGZyb20gZXhwaXJlczogJWkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZXNobmVzc19saWZldGltZSkKCiAgICAgICAgIyBEZXRlcm1pbmUgaWYgd2UgYXJlIHNldHRpbmcgZnJlc2huZXNzIGxpbWl0IGluIHRoZQogICAgICAgICMgcmVxdWVzdC4gTm90ZSwgdGhpcyBvdmVycmlkZXMgd2hhdCB3YXMgaW4gdGhlIHJlc3BvbnNlLgogICAgICAgIGlmICdtYXgtYWdlJyBpbiBjYzoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZnJlc2huZXNzX2xpZmV0aW1lID0gaW50KGNjWydtYXgtYWdlJ10pCiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0ZyZXNobmVzcyBsaWZldGltZSBmcm9tIHJlcXVlc3QgbWF4LWFnZTogJWknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZXNobmVzc19saWZldGltZSkKICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICBmcmVzaG5lc3NfbGlmZXRpbWUgPSAwCgogICAgICAgIGlmICdtaW4tZnJlc2gnIGluIGNjOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBtaW5fZnJlc2ggPSBpbnQoY2NbJ21pbi1mcmVzaCddKQogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgIG1pbl9mcmVzaCA9IDAKICAgICAgICAgICAgIyBhZGp1c3Qgb3VyIGN1cnJlbnQgYWdlIGJ5IG91ciBtaW4gZnJlc2gKICAgICAgICAgICAgY3VycmVudF9hZ2UgKz0gbWluX2ZyZXNoCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnQWRqdXN0ZWQgY3VycmVudCBhZ2UgZnJvbSBtaW4tZnJlc2g6ICVpJywKICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfYWdlKQoKICAgICAgICAjIFJldHVybiBlbnRyeSBpZiBpdCBpcyBmcmVzaCBlbm91Z2gKICAgICAgICBpZiBmcmVzaG5lc3NfbGlmZXRpbWUgPiBjdXJyZW50X2FnZToKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdUaGUgcmVzcG9uc2UgaXMgImZyZXNoIiwgcmV0dXJuaW5nIGNhY2hlZCByZXNwb25zZScpCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnJWkgPiAlaScsIGZyZXNobmVzc19saWZldGltZSwgY3VycmVudF9hZ2UpCiAgICAgICAgICAgIHJldHVybiByZXNwCgogICAgICAgICMgd2UncmUgbm90IGZyZXNoLiBJZiB3ZSBkb24ndCBoYXZlIGFuIEV0YWcsIGNsZWFyIGl0IG91dAogICAgICAgIGlmICdldGFnJyBub3QgaW4gaGVhZGVyczoKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKAogICAgICAgICAgICAgICAgJ1RoZSBjYWNoZWQgcmVzcG9uc2UgaXMgInN0YWxlIiB3aXRoIG5vIGV0YWcsIHB1cmdpbmcnCiAgICAgICAgICAgICkKICAgICAgICAgICAgc2VsZi5jYWNoZS5kZWxldGUoY2FjaGVfdXJsKQoKICAgICAgICAjIHJldHVybiB0aGUgb3JpZ2luYWwgaGFuZGxlcgogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBjb25kaXRpb25hbF9oZWFkZXJzKHNlbGYsIHJlcXVlc3QpOgogICAgICAgIGNhY2hlX3VybCA9IHNlbGYuY2FjaGVfdXJsKHJlcXVlc3QudXJsKQogICAgICAgIHJlc3AgPSBzZWxmLnNlcmlhbGl6ZXIubG9hZHMocmVxdWVzdCwgc2VsZi5jYWNoZS5nZXQoY2FjaGVfdXJsKSkKICAgICAgICBuZXdfaGVhZGVycyA9IHt9CgogICAgICAgIGlmIHJlc3A6CiAgICAgICAgICAgIGhlYWRlcnMgPSBDYXNlSW5zZW5zaXRpdmVEaWN0KHJlc3AuaGVhZGVycykKCiAgICAgICAgICAgIGlmICdldGFnJyBpbiBoZWFkZXJzOgogICAgICAgICAgICAgICAgbmV3X2hlYWRlcnNbJ0lmLU5vbmUtTWF0Y2gnXSA9IGhlYWRlcnNbJ0VUYWcnXQoKICAgICAgICAgICAgaWYgJ2xhc3QtbW9kaWZpZWQnIGluIGhlYWRlcnM6CiAgICAgICAgICAgICAgICBuZXdfaGVhZGVyc1snSWYtTW9kaWZpZWQtU2luY2UnXSA9IGhlYWRlcnNbJ0xhc3QtTW9kaWZpZWQnXQoKICAgICAgICByZXR1cm4gbmV3X2hlYWRlcnMKCiAgICBkZWYgY2FjaGVfcmVzcG9uc2Uoc2VsZiwgcmVxdWVzdCwgcmVzcG9uc2UsIGJvZHk9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgQWxnb3JpdGhtIGZvciBjYWNoaW5nIHJlcXVlc3RzLgoKICAgICAgICBUaGlzIGFzc3VtZXMgYSByZXF1ZXN0cyBSZXNwb25zZSBvYmplY3QuCiAgICAgICAgIiIiCiAgICAgICAgIyBGcm9tIGh0dHBsaWIyOiBEb24ndCBjYWNoZSAyMDYncyBzaW5jZSB3ZSBhcmVuJ3QgZ29pbmcgdG8KICAgICAgICAjICAgICAgICAgICAgICAgIGhhbmRsZSBieXRlIHJhbmdlIHJlcXVlc3RzCiAgICAgICAgY2FjaGVhYmxlX3N0YXR1c19jb2RlcyA9IFsyMDAsIDIwMywgMzAwLCAzMDFdCiAgICAgICAgaWYgcmVzcG9uc2Uuc3RhdHVzIG5vdCBpbiBjYWNoZWFibGVfc3RhdHVzX2NvZGVzOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoCiAgICAgICAgICAgICAgICAnU3RhdHVzIGNvZGUgJXMgbm90IGluICVzJywKICAgICAgICAgICAgICAgIHJlc3BvbnNlLnN0YXR1cywKICAgICAgICAgICAgICAgIGNhY2hlYWJsZV9zdGF0dXNfY29kZXMKICAgICAgICAgICAgKQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgcmVzcG9uc2VfaGVhZGVycyA9IENhc2VJbnNlbnNpdGl2ZURpY3QocmVzcG9uc2UuaGVhZGVycykKCiAgICAgICAgIyBJZiB3ZSd2ZSBiZWVuIGdpdmVuIGEgYm9keSwgb3VyIHJlc3BvbnNlIGhhcyBhIENvbnRlbnQtTGVuZ3RoLCB0aGF0CiAgICAgICAgIyBDb250ZW50LUxlbmd0aCBpcyB2YWxpZCB0aGVuIHdlIGNhbiBjaGVjayB0byBzZWUgaWYgdGhlIGJvZHkgd2UndmUKICAgICAgICAjIGJlZW4gZ2l2ZW4gbWF0Y2hlcyB0aGUgZXhwZWN0ZWQgc2l6ZSwgYW5kIGlmIGl0IGRvZXNuJ3Qgd2UnbGwganVzdAogICAgICAgICMgc2tpcCB0cnlpbmcgdG8gY2FjaGUgaXQuCiAgICAgICAgaWYgKGJvZHkgaXMgbm90IE5vbmUgYW5kCiAgICAgICAgICAgICAgICAiY29udGVudC1sZW5ndGgiIGluIHJlc3BvbnNlX2hlYWRlcnMgYW5kCiAgICAgICAgICAgICAgICByZXNwb25zZV9oZWFkZXJzWyJjb250ZW50LWxlbmd0aCJdLmlzZGlnaXQoKSBhbmQKICAgICAgICAgICAgICAgIGludChyZXNwb25zZV9oZWFkZXJzWyJjb250ZW50LWxlbmd0aCJdKSAhPSBsZW4oYm9keSkpOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgY2NfcmVxID0gc2VsZi5wYXJzZV9jYWNoZV9jb250cm9sKHJlcXVlc3QuaGVhZGVycykKICAgICAgICBjYyA9IHNlbGYucGFyc2VfY2FjaGVfY29udHJvbChyZXNwb25zZV9oZWFkZXJzKQoKICAgICAgICBjYWNoZV91cmwgPSBzZWxmLmNhY2hlX3VybChyZXF1ZXN0LnVybCkKICAgICAgICBsb2dnZXIuZGVidWcoJ1VwZGF0aW5nIGNhY2hlIHdpdGggcmVzcG9uc2UgZnJvbSAiJXMiJywgY2FjaGVfdXJsKQoKICAgICAgICAjIERlbGV0ZSBpdCBmcm9tIHRoZSBjYWNoZSBpZiB3ZSBoYXBwZW4gdG8gaGF2ZSBpdCBzdG9yZWQgdGhlcmUKICAgICAgICBub19zdG9yZSA9IEZhbHNlCiAgICAgICAgaWYgY2MuZ2V0KCduby1zdG9yZScpOgogICAgICAgICAgICBub19zdG9yZSA9IFRydWUKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdSZXNwb25zZSBoZWFkZXIgaGFzICJuby1zdG9yZSInKQogICAgICAgIGlmIGNjX3JlcS5nZXQoJ25vLXN0b3JlJyk6CiAgICAgICAgICAgIG5vX3N0b3JlID0gVHJ1ZQogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1JlcXVlc3QgaGVhZGVyIGhhcyAibm8tc3RvcmUiJykKICAgICAgICBpZiBub19zdG9yZSBhbmQgc2VsZi5jYWNoZS5nZXQoY2FjaGVfdXJsKToKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdQdXJnaW5nIGV4aXN0aW5nIGNhY2hlIGVudHJ5IHRvIGhvbm9yICJuby1zdG9yZSInKQogICAgICAgICAgICBzZWxmLmNhY2hlLmRlbGV0ZShjYWNoZV91cmwpCgogICAgICAgICMgSWYgd2UndmUgYmVlbiBnaXZlbiBhbiBldGFnLCB0aGVuIGtlZXAgdGhlIHJlc3BvbnNlCiAgICAgICAgaWYgc2VsZi5jYWNoZV9ldGFncyBhbmQgJ2V0YWcnIGluIHJlc3BvbnNlX2hlYWRlcnM6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnQ2FjaGluZyBkdWUgdG8gZXRhZycpCiAgICAgICAgICAgIHNlbGYuY2FjaGUuc2V0KAogICAgICAgICAgICAgICAgY2FjaGVfdXJsLAogICAgICAgICAgICAgICAgc2VsZi5zZXJpYWxpemVyLmR1bXBzKHJlcXVlc3QsIHJlc3BvbnNlLCBib2R5PWJvZHkpLAogICAgICAgICAgICApCgogICAgICAgICMgQWRkIHRvIHRoZSBjYWNoZSBhbnkgMzAxcy4gV2UgZG8gdGhpcyBiZWZvcmUgbG9va2luZyB0aGF0CiAgICAgICAgIyB0aGUgRGF0ZSBoZWFkZXJzLgogICAgICAgIGVsaWYgcmVzcG9uc2Uuc3RhdHVzID09IDMwMToKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdDYWNoaW5nIHBlcm1hbmFudCByZWRpcmVjdCcpCiAgICAgICAgICAgIHNlbGYuY2FjaGUuc2V0KAogICAgICAgICAgICAgICAgY2FjaGVfdXJsLAogICAgICAgICAgICAgICAgc2VsZi5zZXJpYWxpemVyLmR1bXBzKHJlcXVlc3QsIHJlc3BvbnNlKQogICAgICAgICAgICApCgogICAgICAgICMgQWRkIHRvIHRoZSBjYWNoZSBpZiB0aGUgcmVzcG9uc2UgaGVhZGVycyBkZW1hbmQgaXQuIElmIHRoZXJlCiAgICAgICAgIyBpcyBubyBkYXRlIGhlYWRlciB0aGVuIHdlIGNhbid0IGRvIGFueXRoaW5nIGFib3V0IGV4cGlyaW5nCiAgICAgICAgIyB0aGUgY2FjaGUuCiAgICAgICAgZWxpZiAnZGF0ZScgaW4gcmVzcG9uc2VfaGVhZGVyczoKICAgICAgICAgICAgIyBjYWNoZSB3aGVuIHRoZXJlIGlzIGEgbWF4LWFnZSA+IDAKICAgICAgICAgICAgaWYgY2MgYW5kIGNjLmdldCgnbWF4LWFnZScpOgogICAgICAgICAgICAgICAgaWYgY2NbJ21heC1hZ2UnXS5pc2RpZ2l0KCkgYW5kIGludChjY1snbWF4LWFnZSddKSA+IDA6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdDYWNoaW5nIGIvYyBkYXRlIGV4aXN0cyBhbmQgbWF4LWFnZSA+IDAnKQogICAgICAgICAgICAgICAgICAgIHNlbGYuY2FjaGUuc2V0KAogICAgICAgICAgICAgICAgICAgICAgICBjYWNoZV91cmwsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VyaWFsaXplci5kdW1wcyhyZXF1ZXN0LCByZXNwb25zZSwgYm9keT1ib2R5KSwKICAgICAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAjIElmIHRoZSByZXF1ZXN0IGNhbiBleHBpcmUsIGl0IG1lYW5zIHdlIHNob3VsZCBjYWNoZSBpdAogICAgICAgICAgICAjIGluIHRoZSBtZWFudGltZS4KICAgICAgICAgICAgZWxpZiAnZXhwaXJlcycgaW4gcmVzcG9uc2VfaGVhZGVyczoKICAgICAgICAgICAgICAgIGlmIHJlc3BvbnNlX2hlYWRlcnNbJ2V4cGlyZXMnXToKICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0NhY2hpbmcgYi9jIG9mIGV4cGlyZXMgaGVhZGVyJykKICAgICAgICAgICAgICAgICAgICBzZWxmLmNhY2hlLnNldCgKICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVfdXJsLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlcmlhbGl6ZXIuZHVtcHMocmVxdWVzdCwgcmVzcG9uc2UsIGJvZHk9Ym9keSksCiAgICAgICAgICAgICAgICAgICAgKQoKICAgIGRlZiB1cGRhdGVfY2FjaGVkX3Jlc3BvbnNlKHNlbGYsIHJlcXVlc3QsIHJlc3BvbnNlKToKICAgICAgICAiIiJPbiBhIDMwNCB3ZSB3aWxsIGdldCBhIG5ldyBzZXQgb2YgaGVhZGVycyB0aGF0IHdlIHdhbnQgdG8KICAgICAgICB1cGRhdGUgb3VyIGNhY2hlZCB2YWx1ZSB3aXRoLCBhc3N1bWluZyB3ZSBoYXZlIG9uZS4KCiAgICAgICAgVGhpcyBzaG91bGQgb25seSBldmVyIGJlIGNhbGxlZCB3aGVuIHdlJ3ZlIHNlbnQgYW4gRVRhZyBhbmQKICAgICAgICBnb3R0ZW4gYSAzMDQgYXMgdGhlIHJlc3BvbnNlLgogICAgICAgICIiIgogICAgICAgIGNhY2hlX3VybCA9IHNlbGYuY2FjaGVfdXJsKHJlcXVlc3QudXJsKQoKICAgICAgICBjYWNoZWRfcmVzcG9uc2UgPSBzZWxmLnNlcmlhbGl6ZXIubG9hZHMoCiAgICAgICAgICAgIHJlcXVlc3QsCiAgICAgICAgICAgIHNlbGYuY2FjaGUuZ2V0KGNhY2hlX3VybCkKICAgICAgICApCgogICAgICAgIGlmIG5vdCBjYWNoZWRfcmVzcG9uc2U6CiAgICAgICAgICAgICMgd2UgZGlkbid0IGhhdmUgYSBjYWNoZWQgcmVzcG9uc2UKICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlCgogICAgICAgICMgTGV0cyB1cGRhdGUgb3VyIGhlYWRlcnMgd2l0aCB0aGUgaGVhZGVycyBmcm9tIHRoZSBuZXcgcmVxdWVzdDoKICAgICAgICAjIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL2RyYWZ0LWlldGYtaHR0cGJpcy1wNC1jb25kaXRpb25hbC0yNiNzZWN0aW9uLTQuMQogICAgICAgICMKICAgICAgICAjIFRoZSBzZXJ2ZXIgaXNuJ3Qgc3VwcG9zZWQgdG8gc2VuZCBoZWFkZXJzIHRoYXQgd291bGQgbWFrZQogICAgICAgICMgdGhlIGNhY2hlZCBib2R5IGludmFsaWQuIEJ1dC4uLiBqdXN0IGluIGNhc2UsIHdlJ2xsIGJlIHN1cmUKICAgICAgICAjIHRvIHN0cmlwIG91dCBvbmVzIHdlIGtub3cgdGhhdCBtaWdodCBiZSBwcm9ibG1hdGljIGR1ZSB0bwogICAgICAgICMgdHlwaWNhbCBhc3N1bXB0aW9ucy4KICAgICAgICBleGNsdWRlZF9oZWFkZXJzID0gWwogICAgICAgICAgICAiY29udGVudC1sZW5ndGgiLAogICAgICAgIF0KCiAgICAgICAgY2FjaGVkX3Jlc3BvbnNlLmhlYWRlcnMudXBkYXRlKAogICAgICAgICAgICBkaWN0KChrLCB2KSBmb3IgaywgdiBpbiByZXNwb25zZS5oZWFkZXJzLml0ZW1zKCkKICAgICAgICAgICAgICAgICBpZiBrLmxvd2VyKCkgbm90IGluIGV4Y2x1ZGVkX2hlYWRlcnMpCiAgICAgICAgKQoKICAgICAgICAjIHdlIHdhbnQgYSAyMDAgYi9jIHdlIGhhdmUgY29udGVudCB2aWEgdGhlIGNhY2hlCiAgICAgICAgY2FjaGVkX3Jlc3BvbnNlLnN0YXR1cyA9IDIwMAoKICAgICAgICAjIHVwZGF0ZSBvdXIgY2FjaGUKICAgICAgICBzZWxmLmNhY2hlLnNldCgKICAgICAgICAgICAgY2FjaGVfdXJsLAogICAgICAgICAgICBzZWxmLnNlcmlhbGl6ZXIuZHVtcHMocmVxdWVzdCwgY2FjaGVkX3Jlc3BvbnNlKSwKICAgICAgICApCgogICAgICAgIHJldHVybiBjYWNoZWRfcmVzcG9uc2UKUEsDBBQAAAAAAAAAIQBsJjR84wkAAOMJAAA3AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9maWxld3JhcHBlci5weWZyb20gaW8gaW1wb3J0IEJ5dGVzSU8KCgpjbGFzcyBDYWxsYmFja0ZpbGVXcmFwcGVyKG9iamVjdCk6CiAgICAiIiIKICAgIFNtYWxsIHdyYXBwZXIgYXJvdW5kIGEgZnAgb2JqZWN0IHdoaWNoIHdpbGwgdGVlIGV2ZXJ5dGhpbmcgcmVhZCBpbnRvIGEKICAgIGJ1ZmZlciwgYW5kIHdoZW4gdGhhdCBmaWxlIGlzIGNsb3NlZCBpdCB3aWxsIGV4ZWN1dGUgYSBjYWxsYmFjayB3aXRoIHRoZQogICAgY29udGVudHMgb2YgdGhhdCBidWZmZXIuCgogICAgQWxsIGF0dHJpYnV0ZXMgYXJlIHByb3hpZWQgdG8gdGhlIHVuZGVybHlpbmcgZmlsZSBvYmplY3QuCgogICAgVGhpcyBjbGFzcyB1c2VzIG1lbWJlcnMgd2l0aCBhIGRvdWJsZSB1bmRlcnNjb3JlIChfXykgbGVhZGluZyBwcmVmaXggc28gYXMKICAgIG5vdCB0byBhY2NpZGVudGFsbHkgc2hhZG93IGFuIGF0dHJpYnV0ZS4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmcCwgY2FsbGJhY2spOgogICAgICAgIHNlbGYuX19idWYgPSBCeXRlc0lPKCkKICAgICAgICBzZWxmLl9fZnAgPSBmcAogICAgICAgIHNlbGYuX19jYWxsYmFjayA9IGNhbGxiYWNrCgogICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgogICAgICAgICMgVGhlIHZhZ3VhcmllcyBvZiBnYXJiYWdlIGNvbGxlY3Rpb24gbWVhbnMgdGhhdCBzZWxmLl9fZnAgaXMKICAgICAgICAjIG5vdCBhbHdheXMgc2V0LiAgQnkgdXNpbmcgX19nZXRhdHRyaWJ1dGVfXyBhbmQgdGhlIHByaXZhdGUKICAgICAgICAjIG5hbWVbMF0gYWxsb3dzIGxvb2tpbmcgdXAgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBhbmQgcmFpc2luZyBhbgogICAgICAgICMgQXR0cmlidXRlRXJyb3Igd2hlbiBpdCBkb2Vzbid0IGV4aXN0LiBUaGlzIHN0b3AgdGhpZ25zIGZyb20KICAgICAgICAjIGluZmluaXRlbHkgcmVjdXJzaW5nIGNhbGxzIHRvIGdldGF0dHIgaW4gdGhlIGNhc2Ugd2hlcmUKICAgICAgICAjIHNlbGYuX19mcCBoYXNuJ3QgYmVlbiBzZXQuCiAgICAgICAgIwogICAgICAgICMgWzBdIGh0dHBzOi8vZG9jcy5weXRob24ub3JnLzIvcmVmZXJlbmNlL2V4cHJlc3Npb25zLmh0bWwjYXRvbS1pZGVudGlmaWVycwogICAgICAgIGZwID0gc2VsZi5fX2dldGF0dHJpYnV0ZV9fKCdfQ2FsbGJhY2tGaWxlV3JhcHBlcl9fZnAnKQogICAgICAgIHJldHVybiBnZXRhdHRyKGZwLCBuYW1lKQoKICAgIGRlZiBfX2lzX2ZwX2Nsb3NlZChzZWxmKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9fZnAuZnAgaXMgTm9uZQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgcGFzcwoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9fZnAuY2xvc2VkCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBwYXNzCgogICAgICAgICMgV2UganVzdCBkb24ndCBjYWNoZSBpdCB0aGVuLgogICAgICAgICMgVE9ETzogQWRkIHNvbWUgbG9nZ2luZyBoZXJlLi4uCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIF9jbG9zZShzZWxmKToKICAgICAgICBpZiBzZWxmLl9fY2FsbGJhY2s6CiAgICAgICAgICAgIHNlbGYuX19jYWxsYmFjayhzZWxmLl9fYnVmLmdldHZhbHVlKCkpCgogICAgICAgICMgV2UgYXNzaWduIHRoaXMgdG8gTm9uZSBoZXJlLCBiZWNhdXNlIG90aGVyd2lzZSB3ZSBjYW4gZ2V0IGludG8KICAgICAgICAjIHJlYWxseSB0cmlja3kgcHJvYmxlbXMgd2hlcmUgdGhlIENQeXRob24gaW50ZXJwcmV0ZXIgZGVhZCBsb2NrcwogICAgICAgICMgYmVjYXVzZSB0aGUgY2FsbGJhY2sgaXMgaG9sZGluZyBhIHJlZmVyZW5jZSB0byBzb21ldGhpbmcgd2hpY2gKICAgICAgICAjIGhhcyBhIF9fZGVsX18gbWV0aG9kLiBTZXR0aW5nIHRoaXMgdG8gTm9uZSBicmVha3MgdGhlIGN5Y2xlCiAgICAgICAgIyBhbmQgYWxsb3dzIHRoZSBnYXJiYWdlIGNvbGxlY3RvciB0byBkbyBpdCdzIHRoaW5nIG5vcm1hbGx5LgogICAgICAgIHNlbGYuX19jYWxsYmFjayA9IE5vbmUKCiAgICBkZWYgcmVhZChzZWxmLCBhbXQ9Tm9uZSk6CiAgICAgICAgZGF0YSA9IHNlbGYuX19mcC5yZWFkKGFtdCkKICAgICAgICBzZWxmLl9fYnVmLndyaXRlKGRhdGEpCiAgICAgICAgaWYgc2VsZi5fX2lzX2ZwX2Nsb3NlZCgpOgogICAgICAgICAgICBzZWxmLl9jbG9zZSgpCgogICAgICAgIHJldHVybiBkYXRhCgogICAgZGVmIF9zYWZlX3JlYWQoc2VsZiwgYW10KToKICAgICAgICBkYXRhID0gc2VsZi5fX2ZwLl9zYWZlX3JlYWQoYW10KQogICAgICAgIGlmIGFtdCA9PSAyIGFuZCBkYXRhID09IGInXHJcbic6CiAgICAgICAgICAgICMgdXJsbGliIGV4ZWN1dGVzIHRoaXMgcmVhZCB0byB0b3NzIHRoZSBDUkxGIGF0IHRoZSBlbmQKICAgICAgICAgICAgIyBvZiB0aGUgY2h1bmsuCiAgICAgICAgICAgIHJldHVybiBkYXRhCgogICAgICAgIHNlbGYuX19idWYud3JpdGUoZGF0YSkKICAgICAgICBpZiBzZWxmLl9faXNfZnBfY2xvc2VkKCk6CiAgICAgICAgICAgIHNlbGYuX2Nsb3NlKCkKCiAgICAgICAgcmV0dXJuIGRhdGEKUEsDBBQAAAAAAAAAIQAOVB78LRAAAC0QAAA2AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9oZXVyaXN0aWNzLnB5aW1wb3J0IGNhbGVuZGFyCmltcG9ydCB0aW1lCgpmcm9tIGVtYWlsLnV0aWxzIGltcG9ydCBmb3JtYXRkYXRlLCBwYXJzZWRhdGUsIHBhcnNlZGF0ZV90egoKZnJvbSBkYXRldGltZSBpbXBvcnQgZGF0ZXRpbWUsIHRpbWVkZWx0YQoKVElNRV9GTVQgPSAiJWEsICVkICViICVZICVIOiVNOiVTIEdNVCIKCgpkZWYgZXhwaXJlX2FmdGVyKGRlbHRhLCBkYXRlPU5vbmUpOgogICAgZGF0ZSA9IGRhdGUgb3IgZGF0ZXRpbWUubm93KCkKICAgIHJldHVybiBkYXRlICsgZGVsdGEKCgpkZWYgZGF0ZXRpbWVfdG9faGVhZGVyKGR0KToKICAgIHJldHVybiBmb3JtYXRkYXRlKGNhbGVuZGFyLnRpbWVnbShkdC50aW1ldHVwbGUoKSkpCgoKY2xhc3MgQmFzZUhldXJpc3RpYyhvYmplY3QpOgoKICAgIGRlZiB3YXJuaW5nKHNlbGYsIHJlc3BvbnNlKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gYSB2YWxpZCAxeHggd2FybmluZyBoZWFkZXIgdmFsdWUgZGVzY3JpYmluZyB0aGUgY2FjaGUKICAgICAgICBhZGp1c3RtZW50cy4KCiAgICAgICAgVGhlIHJlc3BvbnNlIGlzIHByb3ZpZGVkIHRvbyBhbGxvdyB3YXJuaW5ncyBsaWtlIDExMwogICAgICAgIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzQjc2VjdGlvbi01LjUuNCB3aGVyZSB3ZSBuZWVkCiAgICAgICAgdG8gZXhwbGljaXRseSBzYXkgcmVzcG9uc2UgaXMgb3ZlciAyNCBob3VycyBvbGQuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuICcxMTAgLSAiUmVzcG9uc2UgaXMgU3RhbGUiJwoKICAgIGRlZiB1cGRhdGVfaGVhZGVycyhzZWxmLCByZXNwb25zZSk6CiAgICAgICAgIiIiVXBkYXRlIHRoZSByZXNwb25zZSBoZWFkZXJzIHdpdGggYW55IG5ldyBoZWFkZXJzLgoKICAgICAgICBOT1RFOiBUaGlzIFNIT1VMRCBhbHdheXMgaW5jbHVkZSBzb21lIFdhcm5pbmcgaGVhZGVyIHRvCiAgICAgICAgICAgICAgc2lnbmlmeSB0aGF0IHRoZSByZXNwb25zZSB3YXMgY2FjaGVkIGJ5IHRoZSBjbGllbnQsIG5vdAogICAgICAgICAgICAgIGJ5IHdheSBvZiB0aGUgcHJvdmlkZWQgaGVhZGVycy4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4ge30KCiAgICBkZWYgYXBwbHkoc2VsZiwgcmVzcG9uc2UpOgogICAgICAgIHVwZGF0ZWRfaGVhZGVycyA9IHNlbGYudXBkYXRlX2hlYWRlcnMocmVzcG9uc2UpCgogICAgICAgIGlmIHVwZGF0ZWRfaGVhZGVyczoKICAgICAgICAgICAgcmVzcG9uc2UuaGVhZGVycy51cGRhdGUodXBkYXRlZF9oZWFkZXJzKQogICAgICAgICAgICB3YXJuaW5nX2hlYWRlcl92YWx1ZSA9IHNlbGYud2FybmluZyhyZXNwb25zZSkKICAgICAgICAgICAgaWYgd2FybmluZ19oZWFkZXJfdmFsdWUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICByZXNwb25zZS5oZWFkZXJzLnVwZGF0ZSh7J1dhcm5pbmcnOiB3YXJuaW5nX2hlYWRlcl92YWx1ZX0pCgogICAgICAgIHJldHVybiByZXNwb25zZQoKCmNsYXNzIE9uZURheUNhY2hlKEJhc2VIZXVyaXN0aWMpOgogICAgIiIiCiAgICBDYWNoZSB0aGUgcmVzcG9uc2UgYnkgcHJvdmlkaW5nIGFuIGV4cGlyZXMgMSBkYXkgaW4gdGhlCiAgICBmdXR1cmUuCiAgICAiIiIKICAgIGRlZiB1cGRhdGVfaGVhZGVycyhzZWxmLCByZXNwb25zZSk6CiAgICAgICAgaGVhZGVycyA9IHt9CgogICAgICAgIGlmICdleHBpcmVzJyBub3QgaW4gcmVzcG9uc2UuaGVhZGVyczoKICAgICAgICAgICAgZGF0ZSA9IHBhcnNlZGF0ZShyZXNwb25zZS5oZWFkZXJzWydkYXRlJ10pCiAgICAgICAgICAgIGV4cGlyZXMgPSBleHBpcmVfYWZ0ZXIodGltZWRlbHRhKGRheXM9MSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZT1kYXRldGltZSgqZGF0ZVs6Nl0pKQogICAgICAgICAgICBoZWFkZXJzWydleHBpcmVzJ10gPSBkYXRldGltZV90b19oZWFkZXIoZXhwaXJlcykKICAgICAgICAgICAgaGVhZGVyc1snY2FjaGUtY29udHJvbCddID0gJ3B1YmxpYycKICAgICAgICByZXR1cm4gaGVhZGVycwoKCmNsYXNzIEV4cGlyZXNBZnRlcihCYXNlSGV1cmlzdGljKToKICAgICIiIgogICAgQ2FjaGUgKiphbGwqKiByZXF1ZXN0cyBmb3IgYSBkZWZpbmVkIHRpbWUgcGVyaW9kLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsICoqa3cpOgogICAgICAgIHNlbGYuZGVsdGEgPSB0aW1lZGVsdGEoKiprdykKCiAgICBkZWYgdXBkYXRlX2hlYWRlcnMoc2VsZiwgcmVzcG9uc2UpOgogICAgICAgIGV4cGlyZXMgPSBleHBpcmVfYWZ0ZXIoc2VsZi5kZWx0YSkKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAnZXhwaXJlcyc6IGRhdGV0aW1lX3RvX2hlYWRlcihleHBpcmVzKSwKICAgICAgICAgICAgJ2NhY2hlLWNvbnRyb2wnOiAncHVibGljJywKICAgICAgICB9CgogICAgZGVmIHdhcm5pbmcoc2VsZiwgcmVzcG9uc2UpOgogICAgICAgIHRtcGwgPSAnMTEwIC0gQXV0b21hdGljYWxseSBjYWNoZWQgZm9yICVzLiBSZXNwb25zZSBtaWdodCBiZSBzdGFsZScKICAgICAgICByZXR1cm4gdG1wbCAlIHNlbGYuZGVsdGEKCgpjbGFzcyBMYXN0TW9kaWZpZWQoQmFzZUhldXJpc3RpYyk6CiAgICAiIiIKICAgIElmIHRoZXJlIGlzIG5vIEV4cGlyZXMgaGVhZGVyIGFscmVhZHksIGZhbGwgYmFjayBvbiBMYXN0LU1vZGlmaWVkCiAgICB1c2luZyB0aGUgaGV1cmlzdGljIGZyb20KICAgIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzQjc2VjdGlvbi00LjIuMgogICAgdG8gY2FsY3VsYXRlIGEgcmVhc29uYWJsZSB2YWx1ZS4KCiAgICBGaXJlZm94IGFsc28gZG9lcyBzb21ldGhpbmcgbGlrZSB0aGlzIHBlcgogICAgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRUUC9DYWNoaW5nX0ZBUQogICAgaHR0cDovL2x4ci5tb3ppbGxhLm9yZy9tb3ppbGxhLXJlbGVhc2Uvc291cmNlL25ldHdlcmsvcHJvdG9jb2wvaHR0cC9uc0h0dHBSZXNwb25zZUhlYWQuY3BwIzM5NwogICAgVW5saWtlIG1vemlsbGEgd2UgbGltaXQgdGhpcyB0byAyNC1oci4KICAgICIiIgogICAgY2FjaGVhYmxlX2J5X2RlZmF1bHRfc3RhdHVzZXMgPSBzZXQoWwogICAgICAgIDIwMCwgMjAzLCAyMDQsIDIwNiwgMzAwLCAzMDEsIDQwNCwgNDA1LCA0MTAsIDQxNCwgNTAxCiAgICBdKQoKICAgIGRlZiB1cGRhdGVfaGVhZGVycyhzZWxmLCByZXNwKToKICAgICAgICBoZWFkZXJzID0gcmVzcC5oZWFkZXJzCgogICAgICAgIGlmICdleHBpcmVzJyBpbiBoZWFkZXJzOgogICAgICAgICAgICByZXR1cm4ge30KCiAgICAgICAgaWYgJ2NhY2hlLWNvbnRyb2wnIGluIGhlYWRlcnMgYW5kIGhlYWRlcnNbJ2NhY2hlLWNvbnRyb2wnXSAhPSAncHVibGljJzoKICAgICAgICAgICAgcmV0dXJuIHt9CgogICAgICAgIGlmIHJlc3Auc3RhdHVzIG5vdCBpbiBzZWxmLmNhY2hlYWJsZV9ieV9kZWZhdWx0X3N0YXR1c2VzOgogICAgICAgICAgICByZXR1cm4ge30KCiAgICAgICAgaWYgJ2RhdGUnIG5vdCBpbiBoZWFkZXJzIG9yICdsYXN0LW1vZGlmaWVkJyBub3QgaW4gaGVhZGVyczoKICAgICAgICAgICAgcmV0dXJuIHt9CgogICAgICAgIGRhdGUgPSBjYWxlbmRhci50aW1lZ20ocGFyc2VkYXRlX3R6KGhlYWRlcnNbJ2RhdGUnXSkpCiAgICAgICAgbGFzdF9tb2RpZmllZCA9IHBhcnNlZGF0ZShoZWFkZXJzWydsYXN0LW1vZGlmaWVkJ10pCiAgICAgICAgaWYgZGF0ZSBpcyBOb25lIG9yIGxhc3RfbW9kaWZpZWQgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIHt9CgogICAgICAgIG5vdyA9IHRpbWUudGltZSgpCiAgICAgICAgY3VycmVudF9hZ2UgPSBtYXgoMCwgbm93IC0gZGF0ZSkKICAgICAgICBkZWx0YSA9IGRhdGUgLSBjYWxlbmRhci50aW1lZ20obGFzdF9tb2RpZmllZCkKICAgICAgICBmcmVzaG5lc3NfbGlmZXRpbWUgPSBtYXgoMCwgbWluKGRlbHRhIC8gMTAsIDI0ICogMzYwMCkpCiAgICAgICAgaWYgZnJlc2huZXNzX2xpZmV0aW1lIDw9IGN1cnJlbnRfYWdlOgogICAgICAgICAgICByZXR1cm4ge30KCiAgICAgICAgZXhwaXJlcyA9IGRhdGUgKyBmcmVzaG5lc3NfbGlmZXRpbWUKICAgICAgICByZXR1cm4geydleHBpcmVzJzogdGltZS5zdHJmdGltZShUSU1FX0ZNVCwgdGltZS5nbXRpbWUoZXhwaXJlcykpfQoKICAgIGRlZiB3YXJuaW5nKHNlbGYsIHJlc3ApOgogICAgICAgIHJldHVybiBOb25lClBLAwQUAAAAAAAAACEAEmGAuIgZAACIGQAANQAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvc2VyaWFsaXplLnB5aW1wb3J0IGJhc2U2NAppbXBvcnQgaW8KaW1wb3J0IGpzb24KaW1wb3J0IHpsaWIKCmZyb20gcGlwLl92ZW5kb3IucmVxdWVzdHMuc3RydWN0dXJlcyBpbXBvcnQgQ2FzZUluc2Vuc2l0aXZlRGljdAoKZnJvbSAuY29tcGF0IGltcG9ydCBIVFRQUmVzcG9uc2UsIHBpY2tsZSwgdGV4dF90eXBlCgoKZGVmIF9iNjRfZW5jb2RlX2J5dGVzKGIpOgogICAgcmV0dXJuIGJhc2U2NC5iNjRlbmNvZGUoYikuZGVjb2RlKCJhc2NpaSIpCgoKZGVmIF9iNjRfZW5jb2RlX3N0cihzKToKICAgIHJldHVybiBfYjY0X2VuY29kZV9ieXRlcyhzLmVuY29kZSgidXRmOCIpKQoKCmRlZiBfYjY0X2VuY29kZShzKToKICAgIGlmIGlzaW5zdGFuY2UocywgdGV4dF90eXBlKToKICAgICAgICByZXR1cm4gX2I2NF9lbmNvZGVfc3RyKHMpCiAgICByZXR1cm4gX2I2NF9lbmNvZGVfYnl0ZXMocykKCgpkZWYgX2I2NF9kZWNvZGVfYnl0ZXMoYik6CiAgICByZXR1cm4gYmFzZTY0LmI2NGRlY29kZShiLmVuY29kZSgiYXNjaWkiKSkKCgpkZWYgX2I2NF9kZWNvZGVfc3RyKHMpOgogICAgcmV0dXJuIF9iNjRfZGVjb2RlX2J5dGVzKHMpLmRlY29kZSgidXRmOCIpCgoKY2xhc3MgU2VyaWFsaXplcihvYmplY3QpOgoKICAgIGRlZiBkdW1wcyhzZWxmLCByZXF1ZXN0LCByZXNwb25zZSwgYm9keT1Ob25lKToKICAgICAgICByZXNwb25zZV9oZWFkZXJzID0gQ2FzZUluc2Vuc2l0aXZlRGljdChyZXNwb25zZS5oZWFkZXJzKQoKICAgICAgICBpZiBib2R5IGlzIE5vbmU6CiAgICAgICAgICAgIGJvZHkgPSByZXNwb25zZS5yZWFkKGRlY29kZV9jb250ZW50PUZhbHNlKQoKICAgICAgICAgICAgIyBOT1RFOiA5OSUgc3VyZSB0aGlzIGlzIGRlYWQgY29kZS4gSSdtIG9ubHkgbGVhdmluZyBpdAogICAgICAgICAgICAjICAgICAgIGhlcmUgYi9jIEkgZG9uJ3QgaGF2ZSBhIHRlc3QgeWV0IHRvIHByb3ZlCiAgICAgICAgICAgICMgICAgICAgaXQuIEJhc2ljYWxseSwgYmVmb3JlIHVzaW5nCiAgICAgICAgICAgICMgICAgICAgYGNhY2hlY29udHJvbC5maWxld3JhcHBlci5DYWxsYmFja0ZpbGVXcmFwcGVyYCwKICAgICAgICAgICAgIyAgICAgICB0aGlzIG1hZGUgYW4gZWZmb3J0IHRvIHJlc2V0IHRoZSBmaWxlIGhhbmRsZS4gVGhlCiAgICAgICAgICAgICMgICAgICAgYENhbGxiYWNrRmlsZVdyYXBwZXJgIHNob3J0IGNpcmN1aXRzIHRoaXMgY29kZSBieQogICAgICAgICAgICAjICAgICAgIHNldHRpbmcgdGhlIGJvZHkgYXMgdGhlIGNvbnRlbnQgaXMgY29uc3VtZWQsIHRoZQogICAgICAgICAgICAjICAgICAgIHJlc3VsdCBiZWluZyBhIGBib2R5YCBhcmd1bWVudCBpcyAqYWx3YXlzKiBwYXNzZWQKICAgICAgICAgICAgIyAgICAgICBpbnRvIGNhY2hlX3Jlc3BvbnNlLCBhbmQgaW4gdHVybiwKICAgICAgICAgICAgIyAgICAgICBgU2VyaWFsaXplci5kdW1wYC4KICAgICAgICAgICAgcmVzcG9uc2UuX2ZwID0gaW8uQnl0ZXNJTyhib2R5KQoKICAgICAgICBkYXRhID0gewogICAgICAgICAgICAicmVzcG9uc2UiOiB7CiAgICAgICAgICAgICAgICAiYm9keSI6IF9iNjRfZW5jb2RlX2J5dGVzKGJvZHkpLAogICAgICAgICAgICAgICAgImhlYWRlcnMiOiBkaWN0KAogICAgICAgICAgICAgICAgICAgIChfYjY0X2VuY29kZShrKSwgX2I2NF9lbmNvZGUodikpCiAgICAgICAgICAgICAgICAgICAgZm9yIGssIHYgaW4gcmVzcG9uc2UuaGVhZGVycy5pdGVtcygpCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgInN0YXR1cyI6IHJlc3BvbnNlLnN0YXR1cywKICAgICAgICAgICAgICAgICJ2ZXJzaW9uIjogcmVzcG9uc2UudmVyc2lvbiwKICAgICAgICAgICAgICAgICJyZWFzb24iOiBfYjY0X2VuY29kZV9zdHIocmVzcG9uc2UucmVhc29uKSwKICAgICAgICAgICAgICAgICJzdHJpY3QiOiByZXNwb25zZS5zdHJpY3QsCiAgICAgICAgICAgICAgICAiZGVjb2RlX2NvbnRlbnQiOiByZXNwb25zZS5kZWNvZGVfY29udGVudCwKICAgICAgICAgICAgfSwKICAgICAgICB9CgogICAgICAgICMgQ29uc3RydWN0IG91ciB2YXJ5IGhlYWRlcnMKICAgICAgICBkYXRhWyJ2YXJ5Il0gPSB7fQogICAgICAgIGlmICJ2YXJ5IiBpbiByZXNwb25zZV9oZWFkZXJzOgogICAgICAgICAgICB2YXJpZWRfaGVhZGVycyA9IHJlc3BvbnNlX2hlYWRlcnNbJ3ZhcnknXS5zcGxpdCgnLCcpCiAgICAgICAgICAgIGZvciBoZWFkZXIgaW4gdmFyaWVkX2hlYWRlcnM6CiAgICAgICAgICAgICAgICBoZWFkZXIgPSBoZWFkZXIuc3RyaXAoKQogICAgICAgICAgICAgICAgZGF0YVsidmFyeSJdW2hlYWRlcl0gPSByZXF1ZXN0LmhlYWRlcnMuZ2V0KGhlYWRlciwgTm9uZSkKCiAgICAgICAgIyBFbmNvZGUgb3VyIFZhcnkgaGVhZGVycyB0byBlbnN1cmUgdGhleSBjYW4gYmUgc2VyaWFsaXplZCBhcyBKU09OCiAgICAgICAgZGF0YVsidmFyeSJdID0gZGljdCgKICAgICAgICAgICAgKF9iNjRfZW5jb2RlKGspLCBfYjY0X2VuY29kZSh2KSBpZiB2IGlzIG5vdCBOb25lIGVsc2UgdikKICAgICAgICAgICAgZm9yIGssIHYgaW4gZGF0YVsidmFyeSJdLml0ZW1zKCkKICAgICAgICApCgogICAgICAgIHJldHVybiBiIiwiLmpvaW4oWwogICAgICAgICAgICBiImNjPTIiLAogICAgICAgICAgICB6bGliLmNvbXByZXNzKAogICAgICAgICAgICAgICAganNvbi5kdW1wcygKICAgICAgICAgICAgICAgICAgICBkYXRhLCBzZXBhcmF0b3JzPSgiLCIsICI6IiksIHNvcnRfa2V5cz1UcnVlLAogICAgICAgICAgICAgICAgKS5lbmNvZGUoInV0ZjgiKSwKICAgICAgICAgICAgKSwKICAgICAgICBdKQoKICAgIGRlZiBsb2FkcyhzZWxmLCByZXF1ZXN0LCBkYXRhKToKICAgICAgICAjIFNob3J0IGNpcmN1aXQgaWYgd2UndmUgYmVlbiBnaXZlbiBhbiBlbXB0eSBzZXQgb2YgZGF0YQogICAgICAgIGlmIG5vdCBkYXRhOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyBEZXRlcm1pbmUgd2hhdCB2ZXJzaW9uIG9mIHRoZSBzZXJpYWxpemVyIHRoZSBkYXRhIHdhcyBzZXJpYWxpemVkCiAgICAgICAgIyB3aXRoCiAgICAgICAgdHJ5OgogICAgICAgICAgICB2ZXIsIGRhdGEgPSBkYXRhLnNwbGl0KGIiLCIsIDEpCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIHZlciA9IGIiY2M9MCIKCiAgICAgICAgIyBNYWtlIHN1cmUgdGhhdCBvdXIgInZlciIgaXMgYWN0dWFsbHkgYSB2ZXJzaW9uIGFuZCBpc24ndCBhIGZhbHNlCiAgICAgICAgIyBwb3NpdGl2ZSBmcm9tIGEgLCBiZWluZyBpbiB0aGUgZGF0YSBzdHJlYW0uCiAgICAgICAgaWYgdmVyWzozXSAhPSBiImNjPSI6CiAgICAgICAgICAgIGRhdGEgPSB2ZXIgKyBkYXRhCiAgICAgICAgICAgIHZlciA9IGIiY2M9MCIKCiAgICAgICAgIyBHZXQgdGhlIHZlcnNpb24gbnVtYmVyIG91dCBvZiB0aGUgY2M9TgogICAgICAgIHZlciA9IHZlci5zcGxpdChiIj0iLCAxKVstMV0uZGVjb2RlKCJhc2NpaSIpCgogICAgICAgICMgRGlzcGF0Y2ggdG8gdGhlIGFjdHVhbCBsb2FkIG1ldGhvZCBmb3IgdGhlIGdpdmVuIHZlcnNpb24KICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYsICJfbG9hZHNfdnswfSIuZm9ybWF0KHZlcikpKHJlcXVlc3QsIGRhdGEpCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICAjIFRoaXMgaXMgYSB2ZXJzaW9uIHdlIGRvbid0IGhhdmUgYSBsb2FkcyBmdW5jdGlvbiBmb3IsIHNvIHdlJ2xsCiAgICAgICAgICAgICMganVzdCB0cmVhdCBpdCBhcyBhIG1pc3MgYW5kIHJldHVybiBOb25lCiAgICAgICAgICAgIHJldHVybgoKICAgIGRlZiBwcmVwYXJlX3Jlc3BvbnNlKHNlbGYsIHJlcXVlc3QsIGNhY2hlZCk6CiAgICAgICAgIiIiVmVyaWZ5IG91ciB2YXJ5IGhlYWRlcnMgbWF0Y2ggYW5kIGNvbnN0cnVjdCBhIHJlYWwgdXJsbGliMwogICAgICAgIEhUVFBSZXNwb25zZSBvYmplY3QuCiAgICAgICAgIiIiCiAgICAgICAgIyBTcGVjaWFsIGNhc2UgdGhlICcqJyBWYXJ5IHZhbHVlIGFzIGl0IG1lYW5zIHdlIGNhbm5vdCBhY3R1YWxseQogICAgICAgICMgZGV0ZXJtaW5lIGlmIHRoZSBjYWNoZWQgcmVzcG9uc2UgaXMgc3VpdGFibGUgZm9yIHRoaXMgcmVxdWVzdC4KICAgICAgICBpZiAiKiIgaW4gY2FjaGVkLmdldCgidmFyeSIsIHt9KToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICMgRW5zdXJlIHRoYXQgdGhlIFZhcnkgaGVhZGVycyBmb3IgdGhlIGNhY2hlZCByZXNwb25zZSBtYXRjaCBvdXIKICAgICAgICAjIHJlcXVlc3QKICAgICAgICBmb3IgaGVhZGVyLCB2YWx1ZSBpbiBjYWNoZWQuZ2V0KCJ2YXJ5Iiwge30pLml0ZW1zKCk6CiAgICAgICAgICAgIGlmIHJlcXVlc3QuaGVhZGVycy5nZXQoaGVhZGVyLCBOb25lKSAhPSB2YWx1ZToKICAgICAgICAgICAgICAgIHJldHVybgoKICAgICAgICBib2R5X3JhdyA9IGNhY2hlZFsicmVzcG9uc2UiXS5wb3AoImJvZHkiKQoKICAgICAgICBoZWFkZXJzID0gQ2FzZUluc2Vuc2l0aXZlRGljdChkYXRhPWNhY2hlZFsncmVzcG9uc2UnXVsnaGVhZGVycyddKQogICAgICAgIGlmIGhlYWRlcnMuZ2V0KCd0cmFuc2Zlci1lbmNvZGluZycsICcnKSA9PSAnY2h1bmtlZCc6CiAgICAgICAgICAgIGhlYWRlcnMucG9wKCd0cmFuc2Zlci1lbmNvZGluZycpCgogICAgICAgIGNhY2hlZFsncmVzcG9uc2UnXVsnaGVhZGVycyddID0gaGVhZGVycwoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGJvZHkgPSBpby5CeXRlc0lPKGJvZHlfcmF3KQogICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CiAgICAgICAgICAgICMgVGhpcyBjYW4gaGFwcGVuIGlmIGNhY2hlY29udHJvbCBzZXJpYWxpemVkIHRvIHYxIGZvcm1hdCAocGlja2xlKQogICAgICAgICAgICAjIHVzaW5nIFB5dGhvbiAyLiBBIFB5dGhvbiAyIHN0cihieXRlIHN0cmluZykgd2lsbCBiZSB1bnBpY2tsZWQgYXMKICAgICAgICAgICAgIyBhIFB5dGhvbiAzIHN0ciAodW5pY29kZSBzdHJpbmcpLCB3aGljaCB3aWxsIGNhdXNlIHRoZSBhYm92ZSB0bwogICAgICAgICAgICAjIGZhaWwgd2l0aDoKICAgICAgICAgICAgIwogICAgICAgICAgICAjICAgICBUeXBlRXJyb3I6ICdzdHInIGRvZXMgbm90IHN1cHBvcnQgdGhlIGJ1ZmZlciBpbnRlcmZhY2UKICAgICAgICAgICAgYm9keSA9IGlvLkJ5dGVzSU8oYm9keV9yYXcuZW5jb2RlKCd1dGY4JykpCgogICAgICAgIHJldHVybiBIVFRQUmVzcG9uc2UoCiAgICAgICAgICAgIGJvZHk9Ym9keSwKICAgICAgICAgICAgcHJlbG9hZF9jb250ZW50PUZhbHNlLAogICAgICAgICAgICAqKmNhY2hlZFsicmVzcG9uc2UiXQogICAgICAgICkKCiAgICBkZWYgX2xvYWRzX3YwKHNlbGYsIHJlcXVlc3QsIGRhdGEpOgogICAgICAgICMgVGhlIG9yaWdpbmFsIGxlZ2FjeSBjYWNoZSBkYXRhLiBUaGlzIGRvZXNuJ3QgY29udGFpbiBlbm91Z2gKICAgICAgICAjIGluZm9ybWF0aW9uIHRvIGNvbnN0cnVjdCBldmVyeXRoaW5nIHdlIG5lZWQsIHNvIHdlJ2xsIHRyZWF0IHRoaXMgYXMKICAgICAgICAjIGEgbWlzcy4KICAgICAgICByZXR1cm4KCiAgICBkZWYgX2xvYWRzX3YxKHNlbGYsIHJlcXVlc3QsIGRhdGEpOgogICAgICAgIHRyeToKICAgICAgICAgICAgY2FjaGVkID0gcGlja2xlLmxvYWRzKGRhdGEpCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICByZXR1cm4gc2VsZi5wcmVwYXJlX3Jlc3BvbnNlKHJlcXVlc3QsIGNhY2hlZCkKCiAgICBkZWYgX2xvYWRzX3YyKHNlbGYsIHJlcXVlc3QsIGRhdGEpOgogICAgICAgIHRyeToKICAgICAgICAgICAgY2FjaGVkID0ganNvbi5sb2Fkcyh6bGliLmRlY29tcHJlc3MoZGF0YSkuZGVjb2RlKCJ1dGY4IikpCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIFdlIG5lZWQgdG8gZGVjb2RlIHRoZSBpdGVtcyB0aGF0IHdlJ3ZlIGJhc2U2NCBlbmNvZGVkCiAgICAgICAgY2FjaGVkWyJyZXNwb25zZSJdWyJib2R5Il0gPSBfYjY0X2RlY29kZV9ieXRlcygKICAgICAgICAgICAgY2FjaGVkWyJyZXNwb25zZSJdWyJib2R5Il0KICAgICAgICApCiAgICAgICAgY2FjaGVkWyJyZXNwb25zZSJdWyJoZWFkZXJzIl0gPSBkaWN0KAogICAgICAgICAgICAoX2I2NF9kZWNvZGVfc3RyKGspLCBfYjY0X2RlY29kZV9zdHIodikpCiAgICAgICAgICAgIGZvciBrLCB2IGluIGNhY2hlZFsicmVzcG9uc2UiXVsiaGVhZGVycyJdLml0ZW1zKCkKICAgICAgICApCiAgICAgICAgY2FjaGVkWyJyZXNwb25zZSJdWyJyZWFzb24iXSA9IF9iNjRfZGVjb2RlX3N0cigKICAgICAgICAgICAgY2FjaGVkWyJyZXNwb25zZSJdWyJyZWFzb24iXSwKICAgICAgICApCiAgICAgICAgY2FjaGVkWyJ2YXJ5Il0gPSBkaWN0KAogICAgICAgICAgICAoX2I2NF9kZWNvZGVfc3RyKGspLCBfYjY0X2RlY29kZV9zdHIodikgaWYgdiBpcyBub3QgTm9uZSBlbHNlIHYpCiAgICAgICAgICAgIGZvciBrLCB2IGluIGNhY2hlZFsidmFyeSJdLml0ZW1zKCkKICAgICAgICApCgogICAgICAgIHJldHVybiBzZWxmLnByZXBhcmVfcmVzcG9uc2UocmVxdWVzdCwgY2FjaGVkKQpQSwMEFAAAAAAAAAAhAIt7xULyAQAA8gEAADMAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL3dyYXBwZXIucHlmcm9tIC5hZGFwdGVyIGltcG9ydCBDYWNoZUNvbnRyb2xBZGFwdGVyCmZyb20gLmNhY2hlIGltcG9ydCBEaWN0Q2FjaGUKCgpkZWYgQ2FjaGVDb250cm9sKHNlc3MsCiAgICAgICAgICAgICAgICAgY2FjaGU9Tm9uZSwKICAgICAgICAgICAgICAgICBjYWNoZV9ldGFncz1UcnVlLAogICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXI9Tm9uZSwKICAgICAgICAgICAgICAgICBoZXVyaXN0aWM9Tm9uZSk6CgogICAgY2FjaGUgPSBjYWNoZSBvciBEaWN0Q2FjaGUoKQogICAgYWRhcHRlciA9IENhY2hlQ29udHJvbEFkYXB0ZXIoCiAgICAgICAgY2FjaGUsCiAgICAgICAgY2FjaGVfZXRhZ3M9Y2FjaGVfZXRhZ3MsCiAgICAgICAgc2VyaWFsaXplcj1zZXJpYWxpemVyLAogICAgICAgIGhldXJpc3RpYz1oZXVyaXN0aWMsCiAgICApCiAgICBzZXNzLm1vdW50KCdodHRwOi8vJywgYWRhcHRlcikKICAgIHNlc3MubW91bnQoJ2h0dHBzOi8vJywgYWRhcHRlcikKCiAgICByZXR1cm4gc2VzcwpQSwMEFAAAAAAAAAAhABRwBUc/AAAAPwAAAC8AAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2VydGlmaS9fX2luaXRfXy5weWZyb20gLmNvcmUgaW1wb3J0IHdoZXJlLCBvbGRfd2hlcmUKCl9fdmVyc2lvbl9fID0gIjIwMTguMDEuMTgiClBLAwQUAAAAAAAAACEAgyvawSkAAAApAAAALwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jZXJ0aWZpL19fbWFpbl9fLnB5ZnJvbSBjZXJ0aWZpIGltcG9ydCB3aGVyZQpwcmludCh3aGVyZSgpKQpQSwMEFAAAAAAAAAAhAAWh2vXwIgQA8CIEAC4AAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2VydGlmaS9jYWNlcnQucGVtCiMgSXNzdWVyOiBDTj1HbG9iYWxTaWduIFJvb3QgQ0EgTz1HbG9iYWxTaWduIG52LXNhIE9VPVJvb3QgQ0EKIyBTdWJqZWN0OiBDTj1HbG9iYWxTaWduIFJvb3QgQ0EgTz1HbG9iYWxTaWduIG52LXNhIE9VPVJvb3QgQ0EKIyBMYWJlbDogIkdsb2JhbFNpZ24gUm9vdCBDQSIKIyBTZXJpYWw6IDQ4MzU3MDMyNzg0NTk3MDc2NjkwMDUyMDQKIyBNRDUgRmluZ2VycHJpbnQ6IDNlOjQ1OjUyOjE1OjA5OjUxOjkyOmUxOmI3OjVkOjM3OjlmOmIxOjg3OjI5OjhhCiMgU0hBMSBGaW5nZXJwcmludDogYjE6YmM6OTY6OGI6ZDQ6ZjQ6OWQ6NjI6MmE6YTg6OWE6ODE6ZjI6MTU6MDE6NTI6YTQ6MWQ6ODI6OWMKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGViOmQ0OjEwOjQwOmU0OmJiOjNlOmM3OjQyOmM5OmUzOjgxOmQzOjFlOmYyOmE0OjFhOjQ4OmI2OjY4OjVjOjk2OmU3OmNlOmYzOmMxOmRmOjZjOmQ0OjMzOjFjOjk5Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEZFRDQ0FsMmdBd0lCQWdJTEJBQUFBQUFCRlV0YXc1UXdEUVlKS29aSWh2Y05BUUVGQlFBd1Z6RUxNQWtHCkExVUVCaE1DUWtVeEdUQVhCZ05WQkFvVEVFZHNiMkpoYkZOcFoyNGdibll0YzJFeEVEQU9CZ05WQkFzVEIxSnYKYjNRZ1EwRXhHekFaQmdOVkJBTVRFa2RzYjJKaGJGTnBaMjRnVW05dmRDQkRRVEFlRncwNU9EQTVNREV4TWpBdwpNREJhRncweU9EQXhNamd4TWpBd01EQmFNRmN4Q3pBSkJnTlZCQVlUQWtKRk1Sa3dGd1lEVlFRS0V4QkhiRzlpCllXeFRhV2R1SUc1MkxYTmhNUkF3RGdZRFZRUUxFd2RTYjI5MElFTkJNUnN3R1FZRFZRUURFeEpIYkc5aVlXeFQKYVdkdUlGSnZiM1FnUTBFd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUURhRHVhWgpqYzZqNDArS2Z2dnhpNE1sYStwSUgvRXFzTG1WRVFTOThHUFI0bWRtenh6ZHp4dElLKzZOaVk2YXJ5bUFaYXZwCnh5MFN5NnNjVEhBSG9UMEtNTTBWalUvNDNkU01VQlVjNzFEdXhDNzMvT2xTOHBGOTRHM1ZOVENPWGtOejhrSHAKMVdyanNvazZWams0YndZOGlHbGJLazNGcDFTNGJJbk1tL2s4eXVYOWlmVVNQSko0bHRiY2RHNlRSR0hSamNkRwpzblVPaHVnWml0VnRiTlY0RnBXaTZjZ0tPT3Z5SkJOUGMxU1RFNFU2Rzd3ZU5MV0xCWXk1ZDR1eDJ4OGdrYXNKClUyNlF6bnMzZExsd1I1RWlVV01XZWE2eHJrRW1DTWdaSzlGR3FraldaQ3JYZ3pUL0xDckJiQmxEU2dlRjU5TjgKOWlGbzcrcnlVcDkvazVEUEFnTUJBQUdqUWpCQU1BNEdBMVVkRHdFQi93UUVBd0lCQmpBUEJnTlZIUk1CQWY4RQpCVEFEQVFIL01CMEdBMVVkRGdRV0JCUmdlMllhUlEyWHlvbFFMMzBFelRTby8vejlTekFOQmdrcWhraUc5dzBCCkFRVUZBQU9DQVFFQTFuUG5mRTkyMEkyLzdMcWl2alRGS0RLMWZQeHNuQ3dydlFtZVU3OXJYcW9SU0xibENLT3oKeWoxaFRkTkdDYk0rdzZEalkxVWI4cnJ2clRuaFE3azRvK1l2aWlZNzc2QlFWdm5HQ3YwNHpjUUxjRkdVbDVnRQozOE5mbE5VVnlSUkJuTVJkZFdRVkRmOVZNT3lHai84Tjd5eTVZMGIycXZ6ZnZHbjlMaEpJWkpyZ2xmQ203eW1QCkFiRVZ0UXdkcGY1cExHa2tlQjZ6cHh4eFl1N0t5SmVzRjEyS3d2aEhobTRxeEZZeGxkQm5pWVVyK1d5bVhVYWQKREtxQzVKbFIzWEMzMjFZOVllUnE0VnpXOXY0OTNrSE1CNjVqVXI5VFUvUXI2Y2Y5dHZlQ1g0WFNRUmpiZ2JNRQpITVVmcElCdkZTREozZ3lJQ2gzV1psWGkvRWpKS1NacDRBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUdsb2JhbFNpZ24gTz1HbG9iYWxTaWduIE9VPUdsb2JhbFNpZ24gUm9vdCBDQSAtIFIyCiMgU3ViamVjdDogQ049R2xvYmFsU2lnbiBPPUdsb2JhbFNpZ24gT1U9R2xvYmFsU2lnbiBSb290IENBIC0gUjIKIyBMYWJlbDogIkdsb2JhbFNpZ24gUm9vdCBDQSAtIFIyIgojIFNlcmlhbDogNDgzNTcwMzI3ODQ1OTY4Mjg4NTY1ODEyNQojIE1ENSBGaW5nZXJwcmludDogOTQ6MTQ6Nzc6N2U6M2U6NWU6ZmQ6OGY6MzA6YmQ6NDE6YjA6Y2Y6ZTc6ZDA6MzAKIyBTSEExIEZpbmdlcnByaW50OiA3NTplMDphYjpiNjoxMzo4NToxMjoyNzoxYzowNDpmODo1ZjpkZDpkZTozODplNDpiNzoyNDoyZTpmZQojIFNIQTI1NiBGaW5nZXJwcmludDogY2E6NDI6ZGQ6NDE6NzQ6NWY6ZDA6Yjg6MWU6Yjk6MDI6MzY6MmM6Zjk6ZDg6YmY6NzE6OWQ6YTE6YmQ6MWI6MWU6ZmM6OTQ6NmY6NWI6NGM6OTk6ZjQ6MmM6MWI6OWUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR1akNDQXFLZ0F3SUJBZ0lMQkFBQUFBQUJENFltNWcwd0RRWUpLb1pJaHZjTkFRRUZCUUF3VERFZ01CNEcKQTFVRUN4TVhSMnh2WW1Gc1UybG5iaUJTYjI5MElFTkJJQzBnVWpJeEV6QVJCZ05WQkFvVENrZHNiMkpoYkZOcApaMjR4RXpBUkJnTlZCQU1UQ2tkc2IySmhiRk5wWjI0d0hoY05NRFl4TWpFMU1EZ3dNREF3V2hjTk1qRXhNakUxCk1EZ3dNREF3V2pCTU1TQXdIZ1lEVlFRTEV4ZEhiRzlpWVd4VGFXZHVJRkp2YjNRZ1EwRWdMU0JTTWpFVE1CRUcKQTFVRUNoTUtSMnh2WW1Gc1UybG5iakVUTUJFR0ExVUVBeE1LUjJ4dlltRnNVMmxuYmpDQ0FTSXdEUVlKS29aSQpodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUtiUEpBNitMbThvbVVWQ3hLcytJVlNiQzlOL2hIRDZFclBMCnY0ZGZ4bitHMDdJd1hOYjlyZkY3M09YNFlKWUpraEQxMEZQZSszdCtjNGlzVW9oN1NxYktTYVplcUtlTVdoRzgKZW9McnZvenBzNnlXSlFlWFNwa3FCeSswSG5lL2lnKzFBbndibHJqRnVUb3N2TllTdWV0WmZlTFFCb1pmWGtscQp0VGxlaURUc3ZIZ01DSmlFYktqTlM3U2dmUXg1VGZDNExjc2h5dFZzVzMzaG9DbUVvZm5UbEVuTEpHS1JJTHpkCkM5WFp6UG5xSndvcmM1SEduUnVzeU12bzRLRDBMNUNMVGZ1d05odjJHWHFGNEczeVlST0lYSi9na3dwUmw0cGEKenErcjFmZXFDYXBndmR6Wlg5OXlxV0FUWGdBQnlVcjZQNlRxQndNaEFvNkN5Z1BDbTQ4Q0F3RUFBYU9CbkRDQgptVEFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVVtK0lIClYyY2NIc0JxQnQ1WnRKb3QzOXdaaGk0d05nWURWUjBmQkM4d0xUQXJvQ21nSjRZbGFIUjBjRG92TDJOeWJDNW4KYkc5aVlXeHphV2R1TG01bGRDOXliMjkwTFhJeUxtTnliREFmQmdOVkhTTUVHREFXZ0JTYjRnZFhaeHdld0dvRwozbG0wbWkzZjNCbUdMakFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBbVlGVGh4eG9sNGFSN09CS3VFUUxxNEdzCkowL1d3YmdjUTNpekRKcjg2aXc4Ym1FYlRVc3A5WjhGSFNiQnVPbURBR0pGdHFrSWs3bXBNMHNZbXNMNGg0aE8KMjkxeE5CckJWTnBHUCtEVEtxdHRWQ0wxT21MTklHKzZLWW5YM1pIdTAxeWlQcUZiUWZYZjVXUkRMZW5WT2F2UwpvdCszaTlEQWdCa2NSY0F0ak9qNExhUjBWa25GQmJWUEZkNXVSSGc1aDZoK3UvTjVHSkc3OUcrZHdmQ01OWXhkCkFmdkRiYm52UkcxNVJqRitDdjZwZ3NILzc2dHVJTVJReVYrZFRac1hqQXpsQWNtZ1FXcHpVL3FsVUxSdUpRLzcKVEJqMC9WTFpqbW14NkJFUDNvalkreDFKOTZyZWxjOGdlTUpnRXRzbFFJeHEvSDVDT0VCa0V2ZWVnZUdUTGc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VmVyaVNpZ24gQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczIE89VmVyaVNpZ24sIEluYy4gT1U9VmVyaVNpZ24gVHJ1c3QgTmV0d29yay8oYykgMTk5OSBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgU3ViamVjdDogQ049VmVyaVNpZ24gQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczIE89VmVyaVNpZ24sIEluYy4gT1U9VmVyaVNpZ24gVHJ1c3QgTmV0d29yay8oYykgMTk5OSBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgTGFiZWw6ICJWZXJpc2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzMiCiMgU2VyaWFsOiAyMDY2ODQ2OTYyNzk0NzIzMTAyNTQyNzc4NzAxODA5NjY3MjM0MTUKIyBNRDUgRmluZ2VycHJpbnQ6IGNkOjY4OmI2OmE3OmM3OmM0OmNlOjc1OmUwOjFkOjRmOjU3OjQ0OjYxOjkyOjA5CiMgU0hBMSBGaW5nZXJwcmludDogMTM6MmQ6MGQ6NDU6NTM6NGI6Njk6OTc6Y2Q6YjI6ZDU6YzM6Mzk6ZTI6NTU6NzY6NjA6OWI6NWM6YzYKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGViOjA0OmNmOjVlOmIxOmYzOjlhOmZhOjc2OjJmOjJiOmIxOjIwOmYyOjk2OmNiOmE1OjIwOmMxOmI5OjdkOmIxOjU4Ojk1OjY1OmI4OjFjOmI5OmExOjdiOjcyOjQ0Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFR2pDQ0F3SUNFUUNiZmdaSm96NWl1ZFh1a0VoeEtlOVhNQTBHQ1NxR1NJYjNEUUVCQlFVQU1JSEtNUXN3CkNRWURWUVFHRXdKVlV6RVhNQlVHQTFVRUNoTU9WbVZ5YVZOcFoyNHNJRWx1WXk0eEh6QWRCZ05WQkFzVEZsWmwKY21sVGFXZHVJRlJ5ZFhOMElFNWxkSGR2Y21zeE9qQTRCZ05WQkFzVE1TaGpLU0F4T1RrNUlGWmxjbWxUYVdkdQpMQ0JKYm1NdUlDMGdSbTl5SUdGMWRHaHZjbWw2WldRZ2RYTmxJRzl1YkhreFJUQkRCZ05WQkFNVFBGWmxjbWxUCmFXZHVJRU5zWVhOeklETWdVSFZpYkdsaklGQnlhVzFoY25rZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnAKZEhrZ0xTQkhNekFlRncwNU9URXdNREV3TURBd01EQmFGdzB6TmpBM01UWXlNelU1TlRsYU1JSEtNUXN3Q1FZRApWUVFHRXdKVlV6RVhNQlVHQTFVRUNoTU9WbVZ5YVZOcFoyNHNJRWx1WXk0eEh6QWRCZ05WQkFzVEZsWmxjbWxUCmFXZHVJRlJ5ZFhOMElFNWxkSGR2Y21zeE9qQTRCZ05WQkFzVE1TaGpLU0F4T1RrNUlGWmxjbWxUYVdkdUxDQkoKYm1NdUlDMGdSbTl5SUdGMWRHaHZjbWw2WldRZ2RYTmxJRzl1YkhreFJUQkRCZ05WQkFNVFBGWmxjbWxUYVdkdQpJRU5zWVhOeklETWdVSFZpYkdsaklGQnlhVzFoY25rZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGtnCkxTQkhNekNDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFNdTZuRkw4ZUI4YUhtOGIKTjNPOStNbHJsQkl3VC9BMlIvWFFrUXIxRjhpbFljRVdRRTM3aW1HUTVYWWd3UkVHZmFzc2JxYjFFVUdPK2kydApLbUZacEdjbVRORG92RkpiY0NBRVdORjZ5YVJwdklNWFpLMEZpN3pRV002TmpQWHI4RUpKQzUyWEoyY3lidUd1Cmt4VWNjTHdnVFM4WTNwS0k2R3lGVnhFYTZYN2pKaEZVb2tXV1ZZUEtNSW5vM05pajdTcUFQMzk1WlZjK0ZTQm0KQ0MrVms3K3FSeStvUnBmd0V1TCt3Z29yVWVaMjVyZEd0K0lOcHN5b3cweFpWWW5tNkZOY0hPcWQ4R0lXQzZmSgpYd3p3M3NKMnpxLzNhdkw2UWFhaU14VEo1WHBqMDU1aU45V0ZaWjRPNWxNa2RCdGVIUkpUVzhjczU0TkpPeFd1CmltaTVWNWNDQXdFQUFUQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFFUlNXd2F1U0NQYy9MOG15L3VSYW4yVGUKMnlGUGhwazBkalpYM2RBVkw4V3RmeFVmTjJKelB0VG5YODRYQTlzMStpdmJybUFKWHg1ZmoyNjdDejNxV2hNZQpER0J2dGNDMUl5SXVCd3ZMcVhUTFI3c2R3ZGVsYTh3djBrTDlTZDJuaWM5VHV0b0FXaWkvZ3QvNHVoTWRVSWFDCi9ZNHdqeWxHc0I0OU5kbzRZaFlZU3EzbXRsRnMzcTlpNndIUUhpVCtlbzhTR2hKb3VQdG1tUlFVUlZ5dTU2NXAKRjRFcldqZkpYaXIweHVLaFhGU2JwbFFBei9EeHdjZVlNQm83TmhiYm8yN3EvYTJ5d3RydkFrY1Rpc0R4c3pHdApUeHpoVDV5dkR3eWQ5M2dOMlBRMVZvRGF0MjBYajUwZWdXVGgvc1ZGdXExcnVRcDZUazlMaE81TDhYM2RFUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1FbnRydXN0Lm5ldCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAoMjA0OCkgTz1FbnRydXN0Lm5ldCBPVT13d3cuZW50cnVzdC5uZXQvQ1BTXzIwNDggaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pLyhjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQKIyBTdWJqZWN0OiBDTj1FbnRydXN0Lm5ldCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAoMjA0OCkgTz1FbnRydXN0Lm5ldCBPVT13d3cuZW50cnVzdC5uZXQvQ1BTXzIwNDggaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pLyhjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQKIyBMYWJlbDogIkVudHJ1c3QubmV0IFByZW1pdW0gMjA0OCBTZWN1cmUgU2VydmVyIENBIgojIFNlcmlhbDogOTQ2MDY5MjQwCiMgTUQ1IEZpbmdlcnByaW50OiBlZToyOTozMTpiYzozMjo3ZTo5YTplNjplODpiNTpmNzo1MTpiNDozNDo3MTo5MAojIFNIQTEgRmluZ2VycHJpbnQ6IDUwOjMwOjA2OjA5OjFkOjk3OmQ0OmY1OmFlOjM5OmY3OmNiOmU3OjkyOjdkOjdkOjY1OjJkOjM0OjMxCiMgU0hBMjU2IEZpbmdlcnByaW50OiA2ZDpjNDo3MTo3MjplMDoxYzpiYzpiMDpiZjo2Mjo1ODowZDo4OTo1ZjplMjpiODphYzo5YTpkNDpmODo3Mzo4MDoxZTowYzoxMDpiOTpjODozNzpkMjoxZTpiMTo3NwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUtqQ0NBeEtnQXdJQkFnSUVPR1BlK0RBTkJna3Foa2lHOXcwQkFRVUZBRENCdERFVU1CSUdBMVVFQ2hNTApSVzUwY25WemRDNXVaWFF4UURBK0JnTlZCQXNVTjNkM2R5NWxiblJ5ZFhOMExtNWxkQzlEVUZOZk1qQTBPQ0JwCmJtTnZjbkF1SUdKNUlISmxaaTRnS0d4cGJXbDBjeUJzYVdGaUxpa3hKVEFqQmdOVkJBc1RIQ2hqS1NBeE9UazUKSUVWdWRISjFjM1F1Ym1WMElFeHBiV2wwWldReE16QXhCZ05WQkFNVEtrVnVkSEoxYzNRdWJtVjBJRU5sY25ScApabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVJQ2d5TURRNEtUQWVGdzA1T1RFeU1qUXhOelV3TlRGYUZ3MHlPVEEzCk1qUXhOREUxTVRKYU1JRzBNUlF3RWdZRFZRUUtFd3RGYm5SeWRYTjBMbTVsZERGQU1ENEdBMVVFQ3hRM2QzZDMKTG1WdWRISjFjM1F1Ym1WMEwwTlFVMTh5TURRNElHbHVZMjl5Y0M0Z1lua2djbVZtTGlBb2JHbHRhWFJ6SUd4cApZV0l1S1RFbE1DTUdBMVVFQ3hNY0tHTXBJREU1T1RrZ1JXNTBjblZ6ZEM1dVpYUWdUR2x0YVhSbFpERXpNREVHCkExVUVBeE1xUlc1MGNuVnpkQzV1WlhRZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGtnS0RJd05EZ3AKTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFyVTFMcVJLR3N1cWpJQWNWRm1RcQpLMHZSdnd0S1RZN3RnSGFsWjdkNFFNQnpRc2hvd050VEs5MWV1SGFZTlpPTEdwMThFem9PSDF1M0hzL2xKQlFlCnNZR3BqWDI0ekd0TEEvRUNETnlycFVBa0FIOTBsS0dkQ0NtemlBdjFoM2VkVmMza3czN1hhbVNyaFJTR2xWdVgKTWxCdlBjaTZaZ3pqL0wyNFNjRjJpVWtaL2NDb3ZZbWpaeS9Hbjd4eEdXQzRMZWtzeVpCMlpudVU0cTk0MW1WVApYVHpXbkxMUEtRUDVMNlJRc3RSSXpnVXlWWXI5c21STUR1U1lCM1hiZjkrNUNGVmdoVEFwK1h0SXBHbUc0elUvCkhvWmRlbm9WdmU4QWpoVWlWQmNBa0NhVHZBNUphSkcvK0VmVG5aVkN3UTVOMzI4bXo4TVlJV0ptUTNEVzFjQUgKNFFJREFRQUJvMEl3UURBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVgpIUTRFRmdRVVZlU0IwUkdBdnRpSnVRaWpNZm1oSkFrV3VYQXdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBRHViCmoxYWJNT2RUbVh4NmVhZE5sOWNabFpEN0JoL0tNM3hHWTQrV1ppVDZRQnNoSjhybWNuUHlULzR4bWYzSURFeG8KVThhQWdoT1krcmF0MmwwOThjNXU5aFVSbElJTTdqK1ZyeEdyRDljdjNoOERqMWNzSHNtN21ocEVsZXNZVDZZZgp6WDFYRUMrYkJBbGFoTFZ1MkIwNjRkYWUwV3g1WG5rY0ZNWGowRXlUTzJVODdkODl2cWJsbFJyRHRSbkR2VjViCnUvOGo3MmdaeXhLVEoxd0RMVzh3MEI2MkdxemVXdmZScXFnbnB2NTVnY1I1bVROWHVoS3dxZUJDYkpQS1Z0NysKYllRTENJdCtqZXJYbUNIRzgrYzhlUzllbk5GTUZZM2g3Q0kzekpwREM1ZmNnSkNOczJlYmIwZ0lGVmJQdi9FcgpmRjZhZHVsWmtNVjhnelVSWlZFPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QmFsdGltb3JlIEN5YmVyVHJ1c3QgUm9vdCBPPUJhbHRpbW9yZSBPVT1DeWJlclRydXN0CiMgU3ViamVjdDogQ049QmFsdGltb3JlIEN5YmVyVHJ1c3QgUm9vdCBPPUJhbHRpbW9yZSBPVT1DeWJlclRydXN0CiMgTGFiZWw6ICJCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290IgojIFNlcmlhbDogMzM1NTQ2MTcKIyBNRDUgRmluZ2VycHJpbnQ6IGFjOmI2Ojk0OmE1OjljOjE3OmUwOmQ3OjkxOjUyOjliOmIxOjk3OjA2OmE2OmU0CiMgU0hBMSBGaW5nZXJwcmludDogZDQ6ZGU6MjA6ZDA6NWU6NjY6ZmM6NTM6ZmU6MWE6NTA6ODg6MmM6Nzg6ZGI6Mjg6NTI6Y2E6ZTQ6NzQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDE2OmFmOjU3OmE5OmY2Ojc2OmIwOmFiOjEyOjYwOjk1OmFhOjVlOmJhOmRlOmYyOjJhOmIzOjExOjE5OmQ2OjQ0OmFjOjk1OmNkOjRiOjkzOmRiOmYzOmYyOjZhOmViCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEZHpDQ0FsK2dBd0lCQWdJRUFnQUF1VEFOQmdrcWhraUc5dzBCQVFVRkFEQmFNUXN3Q1FZRFZRUUdFd0pKClJURVNNQkFHQTFVRUNoTUpRbUZzZEdsdGIzSmxNUk13RVFZRFZRUUxFd3BEZVdKbGNsUnlkWE4wTVNJd0lBWUQKVlFRREV4bENZV3gwYVcxdmNtVWdRM2xpWlhKVWNuVnpkQ0JTYjI5ME1CNFhEVEF3TURVeE1qRTRORFl3TUZvWApEVEkxTURVeE1qSXpOVGt3TUZvd1dqRUxNQWtHQTFVRUJoTUNTVVV4RWpBUUJnTlZCQW9UQ1VKaGJIUnBiVzl5ClpURVRNQkVHQTFVRUN4TUtRM2xpWlhKVWNuVnpkREVpTUNBR0ExVUVBeE1aUW1Gc2RHbHRiM0psSUVONVltVnkKVkhKMWMzUWdVbTl2ZERDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBS01FdXlLcgptRDFYNkNaeW1yVjUxQ25pNGVpVmdMR3c0MXVPS3ltYVpOK2hYZTJ3Q1FWdDJ5Z3V6bUtpWXY2MGlOb1M2empyCklaM0FRU3NCVW51SWQ5TWNqOGU2dVlpMWFnbm5jK2dSUUtmUnpNcGlqUzNsand1bVVOS29VTU1vNnZXckpZZUsKbXBZY3FXZTRQd3pWOS9sU0V5L0NHOVZ3Y1BDUHdCTEtCc3VhNGRuS00zcDMxdmpzdWZGb1JFSklFOUxBd3FTdQpYbUQrdHFZRi9MVGRCMWtDMUZrWW1HUDFwV1Bna0F4OVhiSUdldk9GNnV2VUE2NWVoRDVmL3hYdGFiejVPVFp5CmRjOTNVazN6eVpBc3VUM2x5U05UUHg4a21DRmNCNWtwdmNZNjdPZHVoanBybDNSak03MW9HREh3ZUkxMnYveWUKamwwcWhxZE5rTnduR2prQ0F3RUFBYU5GTUVNd0hRWURWUjBPQkJZRUZPV2RXVENDUjFqTXJQb0lWRGFHZXpxMQpCRTN3TUJJR0ExVWRFd0VCL3dRSU1BWUJBZjhDQVFNd0RnWURWUjBQQVFIL0JBUURBZ0VHTUEwR0NTcUdTSWIzCkRRRUJCUVVBQTRJQkFRQ0ZERjJPNUc5UmFFSUZvTjI3VHljbGhBTzk5MlQ5TGRjdzQ2UVFGK3ZhS1NtMmVUOTIKOWhrVEk3Z1FDdmxZcE5SaGNMMEVZV29TaWhmVkNyM0Z2REI4MXVrTUpZMkdRRS9zektOK09NWTNFVS90M1dneApqa3pTc3dGMDdyNTFYZ2RJR245dy94WmNoTUI1aGJnRi9YKytaUkdqRDhBQ3RQaFNOemtFMWFreGVoaS9vQ3IwCkVwbjNvMFdDNHp4ZTlaMmV0Y2llZkM3SXBKNU9DQlJMYmYxd2JXc2FZNzFrNWgrM3p2RHlueTY3RzdmeVVJaHoKa3NMaTR4YU5taklDcTQ0WTNla1FFZTUrTmF1UXJ6NHdsSHJRTXoyblpRLzEvSTZlWXM5SFJDd0JYYnNkdFRMUwpSOUk0THREK2dkd3lhaDYxN2p6Vi9PZUJIUm5ESkVMcVl6bXAKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3QgTz1BZGRUcnVzdCBBQiBPVT1BZGRUcnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yawojIFN1YmplY3Q6IENOPUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3QgTz1BZGRUcnVzdCBBQiBPVT1BZGRUcnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yawojIExhYmVsOiAiQWRkVHJ1c3QgRXh0ZXJuYWwgUm9vdCIKIyBTZXJpYWw6IDEKIyBNRDUgRmluZ2VycHJpbnQ6IDFkOjM1OjU0OjA0Ojg1Ojc4OmIwOjNmOjQyOjQyOjRkOmJmOjIwOjczOjBhOjNmCiMgU0hBMSBGaW5nZXJwcmludDogMDI6ZmE6ZjM6ZTI6OTE6NDM6NTQ6Njg6NjA6Nzg6NTc6Njk6NGQ6ZjU6ZTQ6NWI6Njg6ODU6MTg6NjgKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDY4OjdmOmE0OjUxOjM4OjIyOjc4OmZmOmYwOmM4OmIxOjFmOjhkOjQzOmQ1Ojc2OjY3OjFjOjZlOmIyOmJjOmVhOmI0OjEzOmZiOjgzOmQ5OjY1OmQwOjZkOjJmOmYyCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFTmpDQ0F4NmdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCdk1Rc3dDUVlEVlFRR0V3SlRSVEVVCk1CSUdBMVVFQ2hNTFFXUmtWSEoxYzNRZ1FVSXhKakFrQmdOVkJBc1RIVUZrWkZSeWRYTjBJRVY0ZEdWeWJtRnMKSUZSVVVDQk9aWFIzYjNKck1TSXdJQVlEVlFRREV4bEJaR1JVY25WemRDQkZlSFJsY201aGJDQkRRU0JTYjI5MApNQjRYRFRBd01EVXpNREV3TkRnek9Gb1hEVEl3TURVek1ERXdORGd6T0Zvd2J6RUxNQWtHQTFVRUJoTUNVMFV4CkZEQVNCZ05WQkFvVEMwRmtaRlJ5ZFhOMElFRkNNU1l3SkFZRFZRUUxFeDFCWkdSVWNuVnpkQ0JGZUhSbGNtNWgKYkNCVVZGQWdUbVYwZDI5eWF6RWlNQ0FHQTFVRUF4TVpRV1JrVkhKMWMzUWdSWGgwWlhKdVlXd2dRMEVnVW05dgpkRENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFMZjNHalBtOGdBRUxUbmdUbHZ0Ckg3eHNEODIxK2lPMnp0NmJFVE9YcENsTWZaT2Z2VXE4ayswREd1T1B6K1Z0VUZyV2x5bVVXb0N3U1hyYkxwWDkKdU1xL056Z3RIajZSUWExd1ZzZndUei9vTXA1MHlzaVFWT25HWHc5NG5acEFQQTZzWWFwZUZJK2VoNkZxVU56WAptazZ2QmJPbWNaU2NjYk5RWUFySEU1MDRCNFlDcU9tb2FTWVlrS3RNc0U4anF6cFBoTmpmenAvaGFXKzcxMExYCmEwVGt4NjN1YlVGZmNscHhDRGV6ZVdXa1dhQ1VOL2NBTHczQ2tuTGEwRGh5MnhTb1JjUmRLbjIzdE5iRTdxek4KRTBTM3lTdmRRd0FsK21HNWFXcFlJeEczcHpPUFZuVlo5YzBwMTBhM0NpdGx0dE5DYnhXeXVIdjc3K2xkVTlVMApXaWNDQXdFQUFhT0IzRENCMlRBZEJnTlZIUTRFRmdRVXJiMlllalMwSnZmNnhDWlU3d085NENUTFZCb3dDd1lEClZSMFBCQVFEQWdFR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d2daa0dBMVVkSXdTQmtUQ0Jqb0FVcmIyWWVqUzAKSnZmNnhDWlU3d085NENUTFZCcWhjNlJ4TUc4eEN6QUpCZ05WQkFZVEFsTkZNUlF3RWdZRFZRUUtFd3RCWkdSVQpjblZ6ZENCQlFqRW1NQ1FHQTFVRUN4TWRRV1JrVkhKMWMzUWdSWGgwWlhKdVlXd2dWRlJRSUU1bGRIZHZjbXN4CklqQWdCZ05WQkFNVEdVRmtaRlJ5ZFhOMElFVjRkR1Z5Ym1Gc0lFTkJJRkp2YjNTQ0FRRXdEUVlKS29aSWh2Y04KQVFFRkJRQURnZ0VCQUxDYjRJVWx3dFlqNGcrV0JwS2RRWmljMllSNWdka2VXeFFISXpabGo3RFlkN3VzUVd4SApZSU5Sc1BreVBlZjg5aVlUeDRBV3BiOWEvSWZQZUhtSklacmlUQWNLaGpXODh0NVJ4TktXdDl4K1R1NXcvUnc1CjZ3d0NVUlF0anIwVzRNSGZSblhuSkszczlFSzBoWk53RUdlNm5RWTFTaGpUSzNyTVVVS2hlbVBSNXJ1aHhTdkMKTnI0VERlYTlZMzU1ZTZjSkRVQ3JhdDJQaXNQMjlvd2FRZ1ZSMUVYMW42ZGlJV2dWSUVNOG1lZDh2U1RZcVpFWApjNGcvVmhzeE9CaTBjUSthemNnT25vNHVHK0dNbUlQTEh6SHhSRXpHQkhOSmRtQVB4L2k5RjRCckx1bk1UQTVhCm1ua1BJQW91MVo1akpoNVZrcFRZZ2hkYWU5Qzh4NDlPaGdRPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89RW50cnVzdCwgSW5jLiBPVT13d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVuY2UvKGMpIDIwMDYgRW50cnVzdCwgSW5jLgojIFN1YmplY3Q6IENOPUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPUVudHJ1c3QsIEluYy4gT1U9d3d3LmVudHJ1c3QubmV0L0NQUyBpcyBpbmNvcnBvcmF0ZWQgYnkgcmVmZXJlbmNlLyhjKSAyMDA2IEVudHJ1c3QsIEluYy4KIyBMYWJlbDogIkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSIKIyBTZXJpYWw6IDExNjQ2NjA4MjAKIyBNRDUgRmluZ2VycHJpbnQ6IGQ2OmE1OmMzOmVkOjVkOmRkOjNlOjAwOmMxOjNkOjg3OjkyOjFmOjFkOjNmOmU0CiMgU0hBMSBGaW5nZXJwcmludDogYjM6MWU6YjE6Yjc6NDA6ZTM6NmM6ODQ6MDI6ZGE6ZGM6Mzc6ZDQ6NGQ6ZjU6ZDQ6Njc6NDk6NTI6ZjkKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDczOmMxOjc2OjQzOjRmOjFiOmM2OmQ1OmFkOmY0OjViOjBlOjc2OmU3OjI3OjI4OjdjOjhkOmU1Ojc2OjE2OmMxOmU2OmU2OjE0OjFhOjJiOjJjOmJjOjdkOjhlOjRjCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFa1RDQ0EzbWdBd0lCQWdJRVJXdFFWREFOQmdrcWhraUc5dzBCQVFVRkFEQ0JzREVMTUFrR0ExVUVCaE1DClZWTXhGakFVQmdOVkJBb1REVVZ1ZEhKMWMzUXNJRWx1WXk0eE9UQTNCZ05WQkFzVE1IZDNkeTVsYm5SeWRYTjAKTG01bGRDOURVRk1nYVhNZ2FXNWpiM0p3YjNKaGRHVmtJR0o1SUhKbFptVnlaVzVqWlRFZk1CMEdBMVVFQ3hNVwpLR01wSURJd01EWWdSVzUwY25WemRDd2dTVzVqTGpFdE1Dc0dBMVVFQXhNa1JXNTBjblZ6ZENCU2IyOTBJRU5sCmNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNQjRYRFRBMk1URXlOekl3TWpNME1sb1hEVEkyTVRFeU56SXcKTlRNME1sb3dnYkF4Q3pBSkJnTlZCQVlUQWxWVE1SWXdGQVlEVlFRS0V3MUZiblJ5ZFhOMExDQkpibU11TVRrdwpOd1lEVlFRTEV6QjNkM2N1Wlc1MGNuVnpkQzV1WlhRdlExQlRJR2x6SUdsdVkyOXljRzl5WVhSbFpDQmllU0J5ClpXWmxjbVZ1WTJVeEh6QWRCZ05WQkFzVEZpaGpLU0F5TURBMklFVnVkSEoxYzNRc0lFbHVZeTR4TFRBckJnTlYKQkFNVEpFVnVkSEoxYzNRZ1VtOXZkQ0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQ0NBU0l3RFFZSgpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFMYVZ0a05DK3NadEttOUkzNVJNT1ZjRjdzTjVFVUZvCk51M3MvcG9CajZFNEtQejNFRVptTGswZUdyRWFUc2JSd0pXSXNNbi9NWXN6QTl1M2czcytJSVJlN2JKV0tLZjQKNExsQWNUZkZ5MGNPbHlwb3dDS1ZZaFhiUjluMTBDdi9na3ZKclQ3ZVROdVFnRkEvQ1lxRUFPd3dDajBZemZ2OQpLbG1hSTVVWExFV2VIMjVEZVcwTVhKaitTS2ZGSTBkY1h2MXU1eDYwOW1oRjBZYURXNktLamJIaktZRCtKWEdJCnJiNjhqNnhTbGt1cVVZM2tFekVaNkU1Tm45dXNzMnJWdkRsVWNjcDZlbitRM1gwZGdObUJ1MWttd2hIKzVwUGkKOTREa1pmczBOdzRwZ0hCTnJ6aUdMcDUvVjYrZUY2N3JITXNvSVYrMkhOam5vZ1FpK2RQYTJNc0NBd0VBQWFPQgpzRENCclRBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFyQmdOVkhSQUVKREFpCmdBOHlNREEyTVRFeU56SXdNak0wTWxxQkR6SXdNall4TVRJM01qQTFNelF5V2pBZkJnTlZIU01FR0RBV2dCUm8Ka09SbnBLWlRnTWVHWnFUeDkwdEQrNFM5YlRBZEJnTlZIUTRFRmdRVWFKRGtaNlNtVTRESGhtYWs4ZmRMUS91RQp2VzB3SFFZSktvWklodlo5QjBFQUJCQXdEaHNJVmpjdU1UbzBMakFEQWdTUU1BMEdDU3FHU0liM0RRRUJCUVVBCkE0SUJBUUNUMURDdzF3TWdLdEQ1WStpUkRBVWdxVjhaeW50eVR0U3gyOUNXKzFSYUdTd01DUGV5dklXb25YOXQKTzFLekt0dm4xSVNNWS9ZUHl5WUJrVkJzOUY4VTRwTjB3Qk9lTURwUTQ3Umd4Unp3SWtTTmNVZXN5QnJKNlp1YQpBR0FULzNCK1h4Rk5TUnV6RlZKN3lWVGF2NTJWcjJ1YTJKN3A4ZVJEamVJUlJEcS9yNzJEUW5OU2k2cTdweW5QCjlXUWNDazNSdktxc255clEvMzkvMm4zcXNlMHdKY0dFMmpUU1czaURWdXljTnNNbTRoSDJaMGtka3F1TSsrdi8KZXU2RlNxZFFnUENuWEVxVUxsOEZtVHhTUWVETnRHUFBBVU82bklQY2oyQTc4MXEwdEh1dTJndVFPSFh2Z1IxbQowdmRYY0RhenYvd29yM0VsaFZzVC9oNS9XclE4Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1HZW9UcnVzdCBHbG9iYWwgQ0EgTz1HZW9UcnVzdCBJbmMuCiMgU3ViamVjdDogQ049R2VvVHJ1c3QgR2xvYmFsIENBIE89R2VvVHJ1c3QgSW5jLgojIExhYmVsOiAiR2VvVHJ1c3QgR2xvYmFsIENBIgojIFNlcmlhbDogMTQ0NDcwCiMgTUQ1IEZpbmdlcnByaW50OiBmNzo3NTphYjoyOTpmYjo1MTo0ZTpiNzo3Nzo1ZTpmZjowNTozYzo5OTo4ZTpmNQojIFNIQTEgRmluZ2VycHJpbnQ6IGRlOjI4OmY0OmE0OmZmOmU1OmI5OjJmOmEzOmM1OjAzOmQxOmEzOjQ5OmE3OmY5Ojk2OjJhOjgyOjEyCiMgU0hBMjU2IEZpbmdlcnByaW50OiBmZjo4NTo2YToyZDoyNToxZDpjZDo4ODpkMzo2Njo1NjpmNDo1MDoxMjo2Nzo5ODpjZjphYjphYTpkZTo0MDo3OTo5Yzo3MjoyZDplNDpkMjpiNTpkYjozNjphNzozYQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFZEQ0NBanlnQXdJQkFnSURBalJXTUEwR0NTcUdTSWIzRFFFQkJRVUFNRUl4Q3pBSkJnTlZCQVlUQWxWVApNUll3RkFZRFZRUUtFdzFIWlc5VWNuVnpkQ0JKYm1NdU1Sc3dHUVlEVlFRREV4SkhaVzlVY25WemRDQkhiRzlpCllXd2dRMEV3SGhjTk1ESXdOVEl4TURRd01EQXdXaGNOTWpJd05USXhNRFF3TURBd1dqQkNNUXN3Q1FZRFZRUUcKRXdKVlV6RVdNQlFHQTFVRUNoTU5SMlZ2VkhKMWMzUWdTVzVqTGpFYk1Ca0dBMVVFQXhNU1IyVnZWSEoxYzNRZwpSMnh2WW1Gc0lFTkJNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQTJzd1lZekQ5CjlCY2pHbForVzk4OGJEamtjYmQ0a2RTOG9kaE0rS2hEdGdQcFRTRUhDSWphV0M5bU9TbTlCWGlMblRqb0JiZHEKZm5HazVzUmdwckR2Z09TSktBK2VKZGJ0Zy9PdHBwSEhtTWxDR0RVVW5hMllScEl1VDhyeGgwUEJGcFZYTFZEdgppUzJBZWxldDh1NWZhOUlBamJrVStCUVZOZG5BUnFON2NzaVJ2OGxWSzgzUWx6NmNKbVRNMzg2REdYSEtUdWJVCjFYdXBHYzFWM3NqczBsNDRVK1ZjVDR3dC9sQWpOdnhtNXN1T3BEa1pBTGVWQWptUkN3NytPQzdSSFFXYTlrMCsKYnc4SEhhOHNIbzlnT2VMNk5sTVRPZFJlSml2YlBhZ1V2VExyR0FNb1VnUng1YXN6UGVFNHV3YzJoR0tjZWVvVwpNUFJmd0N2b2NXdmsrUUlEQVFBQm8xTXdVVEFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlRBCmVwaG9qWW43cXdWa0RCRjlxbjFsdU1yTVRqQWZCZ05WSFNNRUdEQVdnQlRBZXBob2pZbjdxd1ZrREJGOXFuMWwKdU1yTVRqQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFOZU1wYXVVdlhWU09LVkNVbjVrYUZPU1BlQ3BpbEtJbgpaNTdRenhwZVIrbkJzcVRQM1VFYUJVNmJTKzVLYjFWU3N5U2hOd3JyWkhZcUxpenovVHQxa0wvNmNkakhQVGZTCnRRV1ZZcm1tM29rOU5uczRkMGlYcktZZ2p5Nm15UXpDc3BsRkFNZk9FVkVpSXVDbDZyWVZTQWxrNmw1UGRQY0YKUHNlS1VnemJGYlM5Ylp2bHhyRlVhS25qYVpDMm1xVVB1TGsvSUgydVNyVzRuT1FkdHF2bWxLWEJ4NE90Mi9VbgpodzRFYk5YLzNhQmQ3WWRTdHlzVkFxNDVwbXAwNmRyRTU3eE5OQjZwWEUwelg1SUpMNGhtWFhlWHh4MTJFNm5WCjVmRVdDUkUxMWF6YkpIRndMSmhXQzlrWHROSGpVU3RlZGVqVjBOeFBOTzNDQldhQW9jdm1Ndz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1HZW9UcnVzdCBVbml2ZXJzYWwgQ0EgTz1HZW9UcnVzdCBJbmMuCiMgU3ViamVjdDogQ049R2VvVHJ1c3QgVW5pdmVyc2FsIENBIE89R2VvVHJ1c3QgSW5jLgojIExhYmVsOiAiR2VvVHJ1c3QgVW5pdmVyc2FsIENBIgojIFNlcmlhbDogMQojIE1ENSBGaW5nZXJwcmludDogOTI6NjU6NTg6OGI6YTI6MWE6MzE6NzI6NzM6Njg6NWM6YjQ6YTU6N2E6MDc6NDgKIyBTSEExIEZpbmdlcnByaW50OiBlNjoyMTpmMzozNTo0Mzo3OTowNTo5YTo0Yjo2ODozMDo5ZDo4YToyZjo3NDoyMjoxNTo4NzplYzo3OQojIFNIQTI1NiBGaW5nZXJwcmludDogYTA6NDU6OWI6OWY6NjM6YjI6MjU6NTk6ZjU6ZmE6NWQ6NGM6NmQ6YjM6Zjk6Zjc6MmY6ZjE6OTM6NDI6MDM6MzU6Nzg6ZjA6NzM6YmY6MWQ6MWI6NDY6Y2I6Yjk6MTIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZhRENDQTFDZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRVUZBREJGTVFzd0NRWURWUVFHRXdKVlV6RVcKTUJRR0ExVUVDaE1OUjJWdlZISjFjM1FnU1c1akxqRWVNQndHQTFVRUF4TVZSMlZ2VkhKMWMzUWdWVzVwZG1WeQpjMkZzSUVOQk1CNFhEVEEwTURNd05EQTFNREF3TUZvWERUSTVNRE13TkRBMU1EQXdNRm93UlRFTE1Ba0dBMVVFCkJoTUNWVk14RmpBVUJnTlZCQW9URFVkbGIxUnlkWE4wSUVsdVl5NHhIakFjQmdOVkJBTVRGVWRsYjFSeWRYTjAKSUZWdWFYWmxjbk5oYkNCRFFUQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQUtZVgpWYUNqeHVBZmpKMGhVTmZCdml0YnRhU2VvZGx5V0wwQUcweS9ZY2tVSFVXQ3E4WWRnTlk5NnhDY09xOXRKUGk4CmNRR2VCdlY4WHg3QkRsWEtnNXBaTUs0Wnl6QklsZTBpTjQzMFNwcHlaajZ0bGNEZ0ZnRGdFQjhyTVE3WGxGVFQKUWpPZ05CMGVSWGJkVDhvWU4reUZGWG9aQ1B6Vng1enc4cWt1RUttUzVqMVlQYWtXYUR3dmRTRVlmeWgzcGVGaApGN2VtNmZnZW1kdHpidlFLb2lGczd0cXFoWkptci9aNmE0TGF1aUlJTlEvUFF2RTErbXJ1ZmlzbHpEb1I1RzJ2CmM3SjJIYTNRc25obkdxUTVIRkVMWjFhRC9UaGREYzdkOExzcmxoL2VlekpTL1IyN3RRYWhzaUZlcGRhVmFIL3cKbVo3Y1JRZys1OUlKRFRXVTNZQk9VNWZYdFFsRUlHUVdGd01DVEZNTmFON1ZxbkpOazIyQ0R0dWN2YyswODF4ZApWSHBwQ1piVzJ4SEJqWFdvdE04NXlNNDh2Q1I4NW1MSzRiMTlwNzFYWlF2ay9pWHR0bWtRM0NnYVJyMEJIZENYCnRlR1lPOEEzWk5ZOWxPNEw0ZlVvcmd0V3YzR0xJeWxCam9iRlMxSjcySEdySDRvVnBqdURXdGRZQVZIR1RFSFoKZjloQlozS2lLTjlnZzZtZXlIdjhVM055V2ZXVGVoZDJEczczNVZ6WkMxVTBvcXBidFdwVTV4UEtWK3lYYmZSZQpCaTlGaTFqVUl4YVM1Qlp1S0dOWk1OOVFBWnhqaVJxZjJ4ZVVnbkEzd3lTZW1rZldXc3BPcUdtSmNoK1JiTnQrCm5odXR4eDl6M1N4UEdXWDlmNU5BRUM3UzhPMDhuaTRvUG1rbU04VjdBZ01CQUFHall6QmhNQThHQTFVZEV3RUIKL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRk5xN0xxcXdETGlJSmxGMFhHMEQwOERZajNyV01COEdBMVVkSXdRWQpNQmFBRk5xN0xxcXdETGlJSmxGMFhHMEQwOERZajNyV01BNEdBMVVkRHdFQi93UUVBd0lCaGpBTkJna3Foa2lHCjl3MEJBUVVGQUFPQ0FnRUFNWGpteDdYZnVKUkF5WEhFcURYc1JoM0NoZk1vV0lhd0MveU9zam1QUkZXclpJUmMKYWFuUW1qZzgrdVVmTmVWRTQ0QjVsR2lrdThTZlBlRTB6VEJHaTFRcmxhWHY5eitaaFAwMTVzOHh4dHhxdjZmWApJd2pobUY3RFdnaDJxYWF2ZHkrM1lMMUVSbXJ2bC85emxjR082SlA3L1RHMzdGY1JFVVdiTVBFYWlEbkJUenluCkFOWEgvS3R0Z0NKd3BRemdYUVFwQXZ2TG9KSFJmTmJEZmxEVm5WaStRVGpydVhVOEZkbWJ5VXFEV2NEYVUvMHoKdXpZWW00VVBGZDN1TGF4Mms3blpBWTFJRUtqNzlUaUc4ZHNLeHIyRW95TkIzdFozYjRYVWhSeFE0SzVSaXJxTgpQbmJpdWNvbjhsK2Y3MjVaRFFiWUt4ZWswbnhydTE4VUdraVBHa3puczBjY2preEZLeUR1U04vbjNRbU9HS2phClFJMlNKaEZUWVhOZDY3M254RTBwTjJIcnJEa3RaeTRXMXZVQWc0V2h6SDkyeEgza3QwdG03d05GWUdtMkRGS1cKa29SZXBxTzFwRDRyMmN6WUcwZXE4a1RhVC9rRDZQQVV5ei96Zzk3UXdWVGp0K2dLTjAyTElGa0RNQm1oTE1pOQpFUi9mcnNsS3hmTW5abWFHckdpUi85bm1VeHdQaTF4cFpRb215QjQwdzExUmU5ZXBuQWFoTnQzVmlaUzgyZVF0CkRGNEpiQWlYZktNOWZKUC9QNkVVcDgrMVhldmIyeHpFZHQrSXViMUZCWlVicnZ4R2FreXZTT1BPcmcvU2Z1dm0KYkp4UGdXcDZaS3k3UHRYbnkzWXV4YWRJd1Z5UUQ4dklQL3JtTXVHTkcyK2s1bzdZK1NsSWlzNXovaXc9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1HZW9UcnVzdCBVbml2ZXJzYWwgQ0EgMiBPPUdlb1RydXN0IEluYy4KIyBTdWJqZWN0OiBDTj1HZW9UcnVzdCBVbml2ZXJzYWwgQ0EgMiBPPUdlb1RydXN0IEluYy4KIyBMYWJlbDogIkdlb1RydXN0IFVuaXZlcnNhbCBDQSAyIgojIFNlcmlhbDogMQojIE1ENSBGaW5nZXJwcmludDogMzQ6ZmM6Yjg6ZDA6MzY6ZGI6OWU6MTQ6YjM6YzI6ZjI6ZGI6OGY6ZTQ6OTQ6YzcKIyBTSEExIEZpbmdlcnByaW50OiAzNzo5YToxOTo3Yjo0MTo4NTo0NTozNTowYzphNjowMzo2OTpmMzozYzoyZTphZjo0Nzo0ZjoyMDo3OQojIFNIQTI1NiBGaW5nZXJwcmludDogYTA6MjM6NGY6M2I6Yzg6NTI6N2M6YTU6NjI6OGU6ZWM6ODE6YWQ6NWQ6Njk6ODk6NWQ6YTU6Njg6MGQ6Yzk6MWQ6MWM6Yjg6NDc6N2Y6MzM6Zjg6Nzg6Yjk6NWI6MGIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZiRENDQTFTZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRVUZBREJITVFzd0NRWURWUVFHRXdKVlV6RVcKTUJRR0ExVUVDaE1OUjJWdlZISjFjM1FnU1c1akxqRWdNQjRHQTFVRUF4TVhSMlZ2VkhKMWMzUWdWVzVwZG1WeQpjMkZzSUVOQklESXdIaGNOTURRd016QTBNRFV3TURBd1doY05Namt3TXpBME1EVXdNREF3V2pCSE1Rc3dDUVlEClZRUUdFd0pWVXpFV01CUUdBMVVFQ2hNTlIyVnZWSEoxYzNRZ1NXNWpMakVnTUI0R0ExVUVBeE1YUjJWdlZISjEKYzNRZ1ZXNXBkbVZ5YzJGc0lFTkJJREl3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQwpBUUN6VkZMQnlUN3kyZHl4VXhwWktlZXh3MFVvNWRmUjdjWEZTNkdxZEh0WHIwb20vTmoxWHFkdUdkdDBERTgxCld6SUxBZVBiNjNwM05lcXFXdURXNktGWGxQQ1FvM1JXbEVRd0F4NWNUaXVGSm5TQ2VneDJvRzlOemtFdG9CVUcKRkYrM1FzMTdqMWhoTk53cUNQa3V3d0dtSWtRY1RBZUM1bHZPMEVwOEJOTVpjeWZ3cXBoL0xxOU82NGNlSkhkcQpYYmJvVzBXNjNNT2hCVzlXam84UUpxVkp3eTdYUVljaTRFK0d5bUMxNnFGandBR1hFSG05QUR3U2JTc1ZzYXhMCnNlNFl1VTZXM054Mi96dSt6MThEd1B3NzZMNUdHLy9hUU1KUzkvN2pPdmRxZHpYUTJvM3JYaGhxTWNjZXVqd2IKS05aclZNYXFXOWVpTEJzWnpLSUM5cHRadlRkcmhyVnRncnJZNnNsV3ZLazJXUDArR2ZQdERDYXBremo0VDhGZApJZ2JRbCtyaHJjWlY0SUVyS0lNNit2UjdJVkVBdmxJNHpzMW1lYWowZ1ZiaTBJTUpSMUZiVUdyUDIwZ2FYVDczCnkvWmw5Mnp4bGZnQ096Sldnamw2VzcwdmlSdS9vYlRvLzMrTmpOOEQ4V0JPV0JGTTY2TS9FQ3VEbWdGejJaUnQKaEFBblpxendjRUFKUXBLdFQ1TU5ZUWxSSk5pUzFRdVVZYktIc3UzL21qWC9oVlRLN1VSRHJCczhGbXRJU2dvYwpRSWdma3NJTEFBWC84c2dDU3FTcXFjeVpscHd2V09COTRiNjdCOXhmQkhKY01UVEQ3Rjh0NEQxa2tDTG0wZXk0Ckx0MVpydG1oTjc5VU5keHpNaytNQkI0enNzbEc4ZGhjeUZWUXlXaTlxTG8yQ1FJREFRQUJvMk13WVRBUEJnTlYKSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCUjI4MVhoK3FRMisvQ2ZYR0p4N1R6MFJ6Z1FLekFmQmdOVgpIU01FR0RBV2dCUjI4MVhoK3FRMisvQ2ZYR0p4N1R6MFJ6Z1FLekFPQmdOVkhROEJBZjhFQkFNQ0FZWXdEUVlKCktvWklodmNOQVFFRkJRQURnZ0lCQUdiQnhpUHoyZUF1Ymwvb3o2NndzQ1ZOSy9nN1dKdEFKRGRheTZzV1NmK3oKZFhrem9TOXRjQmMwa2Y1bmZvL3NtK1ZlZ3FsVkh5L2MxRkVIRXY2c0ZqNHNOY1pqL053UTZ3MmpxdEI4ek5IUQpMMUV1eEJSYTN1Z1o0VDdHektRcDV5NkVxZ1l3ZUhaVWN5aVlXVGpnQUExaTAwSjlJWit1UFRxTTFmcDNEUmdyCkZnNWZOdUg4S3JVd0pNL2dZd3g3V0JyK21icENFckdSOUh4bzRzam9yeXpxeVg2dXV5bzlEUlhjTkpXMkdIU28KYWcvSHRQUVR4T1JiN1FyU3BKZE1LdTB2YkJLSlBmRW5jS3BxQTFJaG4wQ29aMUR5ODFvZjM5OGo5dHg0VHVhWQpUMVU2VStQdjh2U2Z4M3pZV0s4cElwZTQ0TDJSTHJCMjdGY1J6KzhwUlBQcGhYcGdZK1JkTTRrWDJUR3EydGJ6CkdEVnl6NGNyTDJNamhGMkVqRDlYb0lqOG1aRW9KbW1aMUkrWFJMNk8xVWl4cENncDhSVzA0ZVdlM2ZpUHBtOG0KMXdrOE9od1JEcVpzTi9ldFJJY3NLTWZZZElLejBHOUtWN3MxS1NlZ2krZ2hwNGRrTmwzTTJCYXN4N0luUUpKVgpPQ2lOVVc3ZEZHZFRiSEZjSm9STmRWcTJmbUJXcVUydCs1c2VsL01OMmRLWFZIZmFQUkszNEI3dkNBYXMrWVdICjZhTGNyMzRZRW9QOVZoZEJMdFVwZ24yWjlESDJjYW5QTEFFbnBRVzVxckpJVGlydm41TlNVWlU4VW5PT1Zrd1gKUU1BSktPU0xha2hUMit6TlZWWHh4dmpwb2l4TXB0RW1YMzZ2V2t6YUg2YnlIQ3grcmdJVzBsYlFMMWRUUitpUwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VmlzYSBlQ29tbWVyY2UgUm9vdCBPPVZJU0EgT1U9VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24KIyBTdWJqZWN0OiBDTj1WaXNhIGVDb21tZXJjZSBSb290IE89VklTQSBPVT1WaXNhIEludGVybmF0aW9uYWwgU2VydmljZSBBc3NvY2lhdGlvbgojIExhYmVsOiAiVmlzYSBlQ29tbWVyY2UgUm9vdCIKIyBTZXJpYWw6IDI1OTUyMTgwNzc2Mjg1ODM2MDQ4MDI0ODkwMjQxNTA1NTY1Nzk0CiMgTUQ1IEZpbmdlcnByaW50OiBmYzoxMTpiODpkODowODo5MzozMDowMDo2ZDoyMzpmOTo3ZTplYjo1MjoxZTowMgojIFNIQTEgRmluZ2VycHJpbnQ6IDcwOjE3OjliOjg2OjhjOjAwOmE0OmZhOjYwOjkxOjUyOjIyOjNmOjlmOjNlOjMyOmJkOmUwOjA1OjYyCiMgU0hBMjU2IEZpbmdlcnByaW50OiA2OTpmYTpjOTpiZDo1NTpmYjowYTpjNzo4ZDo1MzpiYjplZTo1YzpmMTpkNTo5Nzo5ODo5ZjpkMDphYTphYjoyMDphMjo1MTo1MTpiZDpmMTo3MzozZTplNzpkMToyMgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRG9qQ0NBb3FnQXdJQkFnSVFFNFkxVFIwL0J2TEIrV1VGMVpBY1lqQU5CZ2txaGtpRzl3MEJBUVVGQURCcgpNUXN3Q1FZRFZRUUdFd0pWVXpFTk1Bc0dBMVVFQ2hNRVZrbFRRVEV2TUMwR0ExVUVDeE1tVm1sellTQkpiblJsCmNtNWhkR2x2Ym1Gc0lGTmxjblpwWTJVZ1FYTnpiMk5wWVhScGIyNHhIREFhQmdOVkJBTVRFMVpwYzJFZ1pVTnYKYlcxbGNtTmxJRkp2YjNRd0hoY05NREl3TmpJMk1ESXhPRE0yV2hjTk1qSXdOakkwTURBeE5qRXlXakJyTVFzdwpDUVlEVlFRR0V3SlZVekVOTUFzR0ExVUVDaE1FVmtsVFFURXZNQzBHQTFVRUN4TW1WbWx6WVNCSmJuUmxjbTVoCmRHbHZibUZzSUZObGNuWnBZMlVnUVhOemIyTnBZWFJwYjI0eEhEQWFCZ05WQkFNVEUxWnBjMkVnWlVOdmJXMWwKY21ObElGSnZiM1F3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3ZWOTVXSG02aAoybUN4bENmTEY5c0hQNENGVDhpY3R0RDBiMC9QbWRqaDI4SklYRHFzT1RQSEgycUxKajByTmZWSXNaSEJBazRFCmxwRjdzRFB3c1JST0VXKzFRSzhiUmFWSzczNjJyUEtnSDFnL0VrWmdQSTJoNEgzUFZ6NHpIdnRIOGFvVmx3ZFYKWnFXMUxTN1lnRm15cHcyM1J1d2hZLzgxcTZVQ3p5cjBUUDU3OVpSZGhFMm84bUNQMnc0bFBKOXpjYytVMzBycQoyOTl5T0l6emxyM3hGN3pTdWp0RldzYW45c1lYaXdHZC9CbW9Lb01XdURwSS9rNCtvS3NHR2VsVDg0QVRCKzB0CnZ6OEtQRlVnT1N3c0FHbDBsVXE4SUxLcGVlVVlpWkdvM0J4Tjc3dCtOd3RkL2ptbGlGS01BR3pzR0h4QnZmYUwKZFhlNllKMkU1LzR0QWdNQkFBR2pRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRRApBZ0VHTUIwR0ExVWREZ1FXQkJRVk9JTVBQeXcvY0RNZXpVYitCNHdnNE5mRHR6QU5CZ2txaGtpRzl3MEJBUVVGCkFBT0NBUUVBWC9GQmZYeGNDTGtyNE5XU1IvcG5YS1VUd3dNaG15dE1pVWJQV1UzSi9xVkF0bVBOM1hFb2xXY1IKekNTczAwUnNjYTRCSUdzRG9vOFl0eWs2ZmVVV1lGTjRQTUN2RllQM2oxSXpKTDFrazVmdWkvZmJHS2h0Y2JQMwpMQmZRZENWcDkvNXJQSlMrVFV0QmpFN2ljOURqa0NKelE4M3o3K3B6emtXS3NLWkovMHg5blhHSXhIWWRrRnNkCjd2M005Kzc5WUtXeGVoWngwUmJRZkJJOGJHbVgyNjVmT1pwd0x3VThHVVlFbVNBMjBHQnVZUWE3RmtLTWNQY3cKKytEYlpxTUFBYjNtTE5xUlg2QkdpMDFxbkQwOTNRVkcvbmEvb0FvODVBRG1KN2YvaEMzZXVpSW5saEJ4NnlMdAozOTh6bk0vanJhNk8xSTdtVDFHdkZwTGdYUFlIRHc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QUFBIENlcnRpZmljYXRlIFNlcnZpY2VzIE89Q29tb2RvIENBIExpbWl0ZWQKIyBTdWJqZWN0OiBDTj1BQUEgQ2VydGlmaWNhdGUgU2VydmljZXMgTz1Db21vZG8gQ0EgTGltaXRlZAojIExhYmVsOiAiQ29tb2RvIEFBQSBTZXJ2aWNlcyByb290IgojIFNlcmlhbDogMQojIE1ENSBGaW5nZXJwcmludDogNDk6Nzk6MDQ6YjA6ZWI6ODc6MTk6YWM6NDc6YjA6YmM6MTE6NTE6OWI6NzQ6ZDAKIyBTSEExIEZpbmdlcnByaW50OiBkMTplYjoyMzphNDo2ZDoxNzpkNjo4ZjpkOToyNTo2NDpjMjpmMTpmMTo2MDoxNzo2NDpkODplMzo0OQojIFNIQTI1NiBGaW5nZXJwcmludDogZDc6YTc6YTA6ZmI6NWQ6N2U6Mjc6MzE6ZDc6NzE6ZTk6NDg6NGU6YmM6ZGU6Zjc6MWQ6NWY6MGM6M2U6MGE6Mjk6NDg6Nzg6MmI6Yzg6M2U6ZTA6ZWE6Njk6OWU6ZjQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVNakNDQXhxZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRVUZBREI3TVFzd0NRWURWUVFHRXdKSFFqRWIKTUJrR0ExVUVDQXdTUjNKbFlYUmxjaUJOWVc1amFHVnpkR1Z5TVJBd0RnWURWUVFIREFkVFlXeG1iM0prTVJvdwpHQVlEVlFRS0RCRkRiMjF2Wkc4Z1EwRWdUR2x0YVhSbFpERWhNQjhHQTFVRUF3d1lRVUZCSUVObGNuUnBabWxqCllYUmxJRk5sY25acFkyVnpNQjRYRFRBME1ERXdNVEF3TURBd01Gb1hEVEk0TVRJek1USXpOVGsxT1Zvd2V6RUwKTUFrR0ExVUVCaE1DUjBJeEd6QVpCZ05WQkFnTUVrZHlaV0YwWlhJZ1RXRnVZMmhsYzNSbGNqRVFNQTRHQTFVRQpCd3dIVTJGc1ptOXlaREVhTUJnR0ExVUVDZ3dSUTI5dGIyUnZJRU5CSUV4cGJXbDBaV1F4SVRBZkJnTlZCQU1NCkdFRkJRU0JEWlhKMGFXWnBZMkYwWlNCVFpYSjJhV05sY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVAKQURDQ0FRb0NnZ0VCQUw1QW5mUnU0ZXAyaHh4TlJVU092a2JJZ3dhZHdTcitHQitPNUFMNjg2dGRVSW9XTVF1YQpCdERGY0NMTlNTMVVZOHkyYm1oR0MxUHF5MHdrd0x4eVR1cnhGYTcwVkpvU0NzTjZzak5nNHRxSlZmTWlXUFBlCjNNL3ZnNGFpakpSUG4yanltSkJHaENmSGRyL2p6RFVzaTE0SFpHV0N3RWl3cUpINVlaOTJJRkNva2NkbXRldDQKWWdOVzhJb2FFK294b3g2Z21mMDQ5dlluTWxodkIvVnJ1UHNVSzYrM3FzeldZMTl6ak5vRm1hZzRxTXNYZURaUgpyT21lOUhnNmpjOFAyVUxpbUF5ckw1OE9BZDd2bjVsSjhTM2ZySFJORzVpMVI4WGxLZEg1a0JqSFlweStnOGNtCmV6NktKY2ZBM1ozbU5XZ1FJSjJQMk43U3c0U2NEVjdvTDhrQ0F3RUFBYU9Cd0RDQnZUQWRCZ05WSFE0RUZnUVUKb0JFS0l6Nlc4UWZzNHE4cDc0S2xmOUF3cExRd0RnWURWUjBQQVFIL0JBUURBZ0VHTUE4R0ExVWRFd0VCL3dRRgpNQU1CQWY4d2V3WURWUjBmQkhRd2NqQTRvRGFnTklZeWFIUjBjRG92TDJOeWJDNWpiMjF2Wkc5allTNWpiMjB2ClFVRkJRMlZ5ZEdsbWFXTmhkR1ZUWlhKMmFXTmxjeTVqY213d05xQTBvREtHTUdoMGRIQTZMeTlqY213dVkyOXQKYjJSdkxtNWxkQzlCUVVGRFpYSjBhV1pwWTJGMFpWTmxjblpwWTJWekxtTnliREFOQmdrcWhraUc5dzBCQVFVRgpBQU9DQVFFQUNGYjhBdkNiNlArayt0Wjd4a1NBemsvRXhmWUFXTXltdHJ3VVNXZ0VkdWptN2wzc0FnOWcxbzFRCkdFOG1UZ0hqNXJDbDdyKzhkRlJCdi8zOEVyakhUMXIwaVdBRmYyQzNCVXJ6OXZIQ3Y4UzVkSWEyTFgxcnpOTHoKUnQwdnh1QnF3OE0wQXl4OWx0MWF3ZzZuQ3BuQkJZdXJEQy96WERyUGJEZFZDWWZlVTBCc1dPLzh0cXRsYmdUMgpHOXc4NEZvVnhwN1o4VmxJTUNGbEEyenM2U0Z6N0pzRG9lQTNyYUFWR0kvNnVnTE9weXlwRUJNczFPVUlKcXNpCmwyRDRrRjUwMUtLYVU3M3lxV2pnb203QzEyeXhvdytldit0bzUxYnlydkxqS3pnNkNZRzFhNFhYdmkzdFB4cTMKc21QaTlXSXNndFJxQUVGUThUbURuNVhwTnBhWWJnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVF1b1ZhZGlzIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1RdW9WYWRpcyBMaW1pdGVkIE9VPVJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBTdWJqZWN0OiBDTj1RdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89UXVvVmFkaXMgTGltaXRlZCBPVT1Sb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgTGFiZWw6ICJRdW9WYWRpcyBSb290IENBIgojIFNlcmlhbDogOTg1MDI2Njk5CiMgTUQ1IEZpbmdlcnByaW50OiAyNzpkZTozNjpmZTo3MjpiNzowMDowMzowMDo5ZDpmNDpmMDoxZTo2YzowNDoyNAojIFNIQTEgRmluZ2VycHJpbnQ6IGRlOjNmOjQwOmJkOjUwOjkzOmQzOjliOjZjOjYwOmY2OmRhOmJjOjA3OjYyOjAxOjAwOjg5Ojc2OmM5CiMgU0hBMjU2IEZpbmdlcnByaW50OiBhNDo1ZTpkZTozYjpiYjpmMDo5Yzo4YTplMTo1Yzo3MjplZjpjMDo3Mjo2ODpkNjo5MzphMjoxYzo5OTo2ZjpkNToxZTo2NzpjYTowNzo5NDo2MDpmZDo2ZDo4ODo3MwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRjBEQ0NCTGlnQXdJQkFnSUVPclpRaXpBTkJna3Foa2lHOXcwQkFRVUZBREIvTVFzd0NRWURWUVFHRXdKQwpUVEVaTUJjR0ExVUVDaE1RVVhWdlZtRmthWE1nVEdsdGFYUmxaREVsTUNNR0ExVUVDeE1jVW05dmRDQkRaWEowCmFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVURXVNQ3dHQTFVRUF4TWxVWFZ2Vm1Ga2FYTWdVbTl2ZENCRFpYSjAKYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRBZUZ3MHdNVEF6TVRreE9ETXpNek5hRncweU1UQXpNVGN4T0RNegpNek5hTUg4eEN6QUpCZ05WQkFZVEFrSk5NUmt3RndZRFZRUUtFeEJSZFc5V1lXUnBjeUJNYVcxcGRHVmtNU1V3Ckl3WURWUVFMRXh4U2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1TNHdMQVlEVlFRREV5VlIKZFc5V1lXUnBjeUJTYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TUlJQklqQU5CZ2txaGtpRwo5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBdjJHMWxWTzZWL3o2OG1jTE9ocmZFWUJrbGJUUnZNMTZ6L1lwCmxpNGtWRUFrT1BjYWhkeFlUTXVrSjBLWDBKK0Rpc1BrQmdOYkFLVlJIbkFFZE9MQjFEcXIxNjA3QnhnRmp2MkQKck9wbTJSZ2JhSXIxVnhxWXV2WHRkajE4MmQ2VWFqdExGOEhWajcxbE9EcVYwRDFWTms3ZmVWY3hLaDdZV1dWSgpXQ0NZZnF0ZmZwL3AxazNzZzNTcHgyelk3aWxLaFNvR0ZQbFU1dFBhWlFlTFl6Y1MxOURzdzNzZ1FVU2o3Y3VnCkYrRnhaYzRkWmpIM2RnRVp5SDBEV0xhVlNSMm1FaWJveGd4MjRPTm15K3BkcGlidTVjeGZ2V2VuQVNjT29zcFUKeGJGNmxSMXhIa29waWdQY2FrWEJwQmxlYnpiTnc2S3d0LzVjT09KU3ZQaEVRK2FRdXdJREFRQUJvNElDVWpDQwpBazR3UFFZSUt3WUJCUVVIQVFFRU1UQXZNQzBHQ0NzR0FRVUZCekFCaGlGb2RIUndjem92TDI5amMzQXVjWFZ2CmRtRmthWE52Wm1aemFHOXlaUzVqYjIwd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pDQ0FSb0dBMVVkSUFTQ0FSRXcKZ2dFTk1JSUJDUVlKS3dZQkJBRytXQUFCTUlIN01JSFVCZ2dyQmdFRkJRY0NBakNCeHhxQnhGSmxiR2xoYm1ObApJRzl1SUhSb1pTQlJkVzlXWVdScGN5QlNiMjkwSUVObGNuUnBabWxqWVhSbElHSjVJR0Z1ZVNCd1lYSjBlU0JoCmMzTjFiV1Z6SUdGalkyVndkR0Z1WTJVZ2IyWWdkR2hsSUhSb1pXNGdZWEJ3YkdsallXSnNaU0J6ZEdGdVpHRnkKWkNCMFpYSnRjeUJoYm1RZ1kyOXVaR2wwYVc5dWN5QnZaaUIxYzJVc0lHTmxjblJwWm1sallYUnBiMjRnY0hKaApZM1JwWTJWekxDQmhibVFnZEdobElGRjFiMVpoWkdseklFTmxjblJwWm1sallYUmxJRkJ2YkdsamVTNHdJZ1lJCkt3WUJCUVVIQWdFV0ZtaDBkSEE2THk5M2QzY3VjWFZ2ZG1Ga2FYTXVZbTB3SFFZRFZSME9CQllFRkl0TGJlM1QKS2JrR0dldzVPYW53bDRScXkrL2ZNSUd1QmdOVkhTTUVnYVl3Z2FPQUZJdExiZTNUS2JrR0dldzVPYW53bDRScQp5Ky9mb1lHRXBJR0JNSDh4Q3pBSkJnTlZCQVlUQWtKTk1Sa3dGd1lEVlFRS0V4QlJkVzlXWVdScGN5Qk1hVzFwCmRHVmtNU1V3SXdZRFZRUUxFeHhTYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TVM0d0xBWUQKVlFRREV5VlJkVzlXWVdScGN5QlNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVnZ1E2dGxDTApNQTRHQTFVZER3RUIvd1FFQXdJQkJqQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFpdFFVdGY3MG1wS25HZFNrCmZuSVlqOWxvZkZJazNXZHZPWHJFcWw0OTRsaXdUWENZaEdIb0crTnBHQTdPKzBkUW9FNy84Q1FmdmJMTzlTZjgKN0M5VHFuTjdBejEwYnVZV251dWxMc1MvVmlkUUsySzZ2a3NjUEZWY1FSMGt2b0lnUjEzVlJINTZGbWpmZlUxUgpjSGhYSFRNZS9RS1puQXpOQ2dWUHg3dU9wSFg2U20yeGdJNEpWcm1jR21EK1hjSFhldHdSZU5EV1hjRzMxYTB5Cm1RTTZpc3hVSlRreGdYc1RJbEc2Um15aHU1NzZCR3hKSm5TUDBuUHJ6RENpNXVwWklvZjRsL1VPL2VyTWtxUVcKeEZJWTZpSE9zZkhtaElIbHVxbUdLUEpEV2wwU25hd2UyYWpsQ21xbmY2Q0hLYy95aVUzVTdNWGk1bnJRTmlPSwpTblEyK1E9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049UXVvVmFkaXMgUm9vdCBDQSAyIE89UXVvVmFkaXMgTGltaXRlZAojIFN1YmplY3Q6IENOPVF1b1ZhZGlzIFJvb3QgQ0EgMiBPPVF1b1ZhZGlzIExpbWl0ZWQKIyBMYWJlbDogIlF1b1ZhZGlzIFJvb3QgQ0EgMiIKIyBTZXJpYWw6IDEyODkKIyBNRDUgRmluZ2VycHJpbnQ6IDVlOjM5OjdiOmRkOmY4OmJhOmVjOjgyOmU5OmFjOjYyOmJhOjBjOjU0OjAwOjJiCiMgU0hBMSBGaW5nZXJwcmludDogY2E6M2E6ZmI6Y2Y6MTI6NDA6MzY6NGI6NDQ6YjI6MTY6MjA6ODg6ODA6NDg6Mzk6MTk6OTM6N2M6ZjcKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDg1OmEwOmRkOjdkOmQ3OjIwOmFkOmI3OmZmOjA1OmY4OjNkOjU0OjJiOjIwOjlkOmM3OmZmOjQ1OjI4OmY3OmQ2Ojc3OmIxOjgzOjg5OmZlOmE1OmU1OmM0OjllOjg2Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGdHpDQ0E1K2dBd0lCQWdJQ0JRa3dEUVlKS29aSWh2Y05BUUVGQlFBd1JURUxNQWtHQTFVRUJoTUNRazB4CkdUQVhCZ05WQkFvVEVGRjFiMVpoWkdseklFeHBiV2wwWldReEd6QVpCZ05WQkFNVEVsRjFiMVpoWkdseklGSnYKYjNRZ1EwRWdNakFlRncwd05qRXhNalF4T0RJM01EQmFGdzB6TVRFeE1qUXhPREl6TXpOYU1FVXhDekFKQmdOVgpCQVlUQWtKTk1Sa3dGd1lEVlFRS0V4QlJkVzlXWVdScGN5Qk1hVzFwZEdWa01Sc3dHUVlEVlFRREV4SlJkVzlXCllXUnBjeUJTYjI5MElFTkJJREl3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ2EKR01wTGxBMEFMYThES1lyd0Q0SElya3daaFIwSW42c3BSSVh6TDRHdE1oNlFScitqaGlZYUh2NStIQmc2WEp4ZwpGeW82ZElNek1IMWhWQkhMN2F2ZzV0S2lmdlZyYnhpM0Nnc3QvZWsrN3dyR3N4RHAzTUpHRi9oZC9hVGEvNTVKCldwem1NK1lrbHZjL3Vsc3JISG8xd3Rabi9xdG1VSXR0S0dBcjc5ZGd3OGVUdkkwMmtmTi8rTnNSRThTY2QzYkIKcnJjQ2FvRjZxVVdENGdYbXVWYkJsRGVQU0hGakl1d1haUWVWaWt2Zmo4WmFDdVd3NDE5ZWF4R3JEUG1GNjBUcAorQVJ6OHVuK1hKaU05WE92YTdSK3pkUmNBaXRNT2VHeWxaVXRRb2ZYMWJPUVE3ZHNFL0hlM2ZiRStJay8wWFgxCmtzT1IxWXFJMEpEczNHM2VpY0psY1phTERRUDluTDliRnF5UzIrcitlWHl0NjYvM0ZzdmJ6U1VyNVIvN21wL2kKVWN3NlV3eEk1ZzY5eWJSMkJsTG1FUk9GY21NREJPQUVOaXNnR1FMb2RLY2Z0c2xXWnZCMUpkeG53UTVoWUlpegpQdEdvL0tQYUhiRFJzU05VMzBSMmJlMUIyTUd5SXJaVEhOODFIZHloZHlveDVDMzE1ZVhieU9ELzVZRFhDMk9nCi96T2hEN29zRlJYcWw3UFNvclcrOG95V0hocVBIV3lrWVRlNWhuTXoxNWVXbmlOOWdxUk1nZUtoMGJwblg1VUgKb3ljUjdoWVFlN3hGU2t5eUJOS3I3OVg5REZIT1VHb0lNZm1SMmd5UFpGd0R3enFMSUQ5dWpXYzlPdGIrZlZ1SQp5Vjc3ekdIY2l6TjMwMFF5TlFsaUJKSVdFTmllSjBmN095SGorT3NkV3dJREFRQUJvNEd3TUlHdE1BOEdBMVVkCkV3RUIvd1FGTUFNQkFmOHdDd1lEVlIwUEJBUURBZ0VHTUIwR0ExVWREZ1FXQkJRYWhHSzhTRXd6SlFUVTd0RDIKQThRWlJ0R1VhekJ1QmdOVkhTTUVaekJsZ0JRYWhHSzhTRXd6SlFUVTd0RDJBOFFaUnRHVWE2RkpwRWN3UlRFTApNQWtHQTFVRUJoTUNRazB4R1RBWEJnTlZCQW9URUZGMWIxWmhaR2x6SUV4cGJXbDBaV1F4R3pBWkJnTlZCQU1UCkVsRjFiMVpoWkdseklGSnZiM1FnUTBFZ01vSUNCUWt3RFFZSktvWklodmNOQVFFRkJRQURnZ0lCQUQ0S0ZrMmYKQmx1b3JuRmRMd1V2WitZVFJZUEVOdmJ6d0NZTURiVkhaRjM0dEhMSlJxVURHQ2RWaVhoOWR1cVdOSUFYSU56bgpnL2lOL0FlNDJsOU5MbWV5aFAzWlJQeDNVSUhtZkxUSkRRdHlVL2gyQndkQlI1WU0rK0NDSnBOVmpQNGlIMkJsCmZGL25KclAzTXBDWVVOUTNjVlgya2lGNDk1VjUrdmd0Sm9kbVZqQjNwamQ0TTFJUVdLNC9ZWTd5YXJIdkdINUsKV1dQS2phSlcxYWN2dkZZZnp6bkI0dnNLcUJVc2ZVMTZZOFpzbDBRODBtL0RTaGNLK0pEU1Y2SVpVYVV0bDBIYQpCMCtwVU5xUWpaUkc0VDd3bFAwUUFEajFPK2hBNGJSdVZob2d6RzlZamUwdVJZL1c2Wk0vNTdFczN6cldJb3pjCmhMc2liOUQ0NU1ZNTZRU0lQTU82NjFWNmJZQ1pKUFZzQWZ2NGw3Q1VXK3Y5MG0veGQyZ05OV1FqckxoVm9RUFIKVFVJWjNQaDFXVmFqK2FoSmVmaXZEcmtSb0h5M2F1MDAwTFltWWpnYWh3ejQ2UDB1MDVCL0I1RXFIZForWElXRAptYkE0Q0QvcFh2azFCK1RKWW01WGY2ZFFsZmU2eUp2bWpxSUJ4ZFptdjNsaDh6d2M0Ym1DWEYyZ3crbllTTDBaCm9oRVVHVzZ5aGh0b1BrZzNHb2kzWFpaZW5NZnZKMklJNHBFWlhOTHhJZDI2RjBLQ2wzR0JVekdwbi9aOVlyOXkKNGFPVEhjeUtKbG9KT05ETzF3MkFGclI0cFRxSFRJMktwZFZHbC9Jc0VMbThWQ0xBQVZCcFE1NzBzdTl0K096YQo4ZU94NzkrUmoxUXFDeVhCSmhuRVVoQUZaZFdDRU9yQ01jMHUKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVF1b1ZhZGlzIFJvb3QgQ0EgMyBPPVF1b1ZhZGlzIExpbWl0ZWQKIyBTdWJqZWN0OiBDTj1RdW9WYWRpcyBSb290IENBIDMgTz1RdW9WYWRpcyBMaW1pdGVkCiMgTGFiZWw6ICJRdW9WYWRpcyBSb290IENBIDMiCiMgU2VyaWFsOiAxNDc4CiMgTUQ1IEZpbmdlcnByaW50OiAzMTo4NTozYzo2Mjo5NDo5Nzo2MzpiOTphYTpmZDo4OTo0ZTphZjo2ZjplMDpjZgojIFNIQTEgRmluZ2VycHJpbnQ6IDFmOjQ5OjE0OmY3OmQ4Ojc0Ojk1OjFkOmRkOmFlOjAyOmMwOmJlOmZkOjNhOjJkOjgyOjc1OjUxOjg1CiMgU0hBMjU2IEZpbmdlcnByaW50OiAxODpmMTpmYzo3ZjoyMDo1ZDpmODphZDpkZDplYjo3ZjplMDowNzpkZDo1NzplMzphZjozNzo1YTo5Yzo0ZDo4ZDo3Mzo1NDo2YjpmNDpmMTpmZTpkMTplMTo4ZDozNQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJR25UQ0NCSVdnQXdJQkFnSUNCY1l3RFFZSktvWklodmNOQVFFRkJRQXdSVEVMTUFrR0ExVUVCaE1DUWsweApHVEFYQmdOVkJBb1RFRkYxYjFaaFpHbHpJRXhwYldsMFpXUXhHekFaQmdOVkJBTVRFbEYxYjFaaFpHbHpJRkp2CmIzUWdRMEVnTXpBZUZ3MHdOakV4TWpReE9URXhNak5hRncwek1URXhNalF4T1RBMk5EUmFNRVV4Q3pBSkJnTlYKQkFZVEFrSk5NUmt3RndZRFZRUUtFeEJSZFc5V1lXUnBjeUJNYVcxcGRHVmtNUnN3R1FZRFZRUURFeEpSZFc5VwpZV1JwY3lCU2IyOTBJRU5CSURNd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUURNClYwSVdWSnptbU5QVFRlNys3Y2VmUXpsS1piUG9Gb2cwMncxWmtYVFBrcmdFUUswQ1N6R3J2STJSYU5nZ0Rob0IKNGhwN1RoZGQ0b3EzUDVrYXpldGhxOEpscGgrM3Q3MjNqL3o5Y0k4TG9HZStBYUpaejNIbUR5bDIvN0ZXZVVVcgpINTU2Vk9paktUVm9wQUZQRDZRdU4rOGJ2K09QRUtoeXExaFg1MVNHeU1uelc5b3MybDJPYmp5alB0cjdndVhkCjhseXlCVE52aWpiTzBCTk8vNzlLRERSTXBzTWh2VkFFVmV1eHU1MzdSUjVrRmQ1VkFZd0NkclhMb1Q5Q2Fid3YKdldoREZsYUpLamRoa2YybXJrN0F5eFJsbERkTGtnYnZCTkRJbklqYkMzdUJyN0U5S3NSbE9uaTI3dHlBc2RMVAptWnc2N210YWE3T050OVhPbk1LK3BVc3ZGckdlYURzR2I2NTluL2plN013cHA1aWpKVU12Ny9GZkp1R0lUZmhlCmJ0ZlpGRzRaTTJtbk80U0prOFJUVlJPaFVYaEErTGpKb3U1N3VsSkNnNTRVN1FWU1dsbFdwNWY4blQ4S0tkamMKVDVFT0U3emVsYVRmaTVtK3JKc3ppTysxZ2E4YnhpSlR5UGJIN3BjVXNNVjhlRkxJOE01dWQyQ0VwdWtxZGlEdApXQUVYTUpQcEdvdmdjMlBaYXBLVVNVNjByVXFGeEtNaU1Qd0o3V2dpYzZhSURGVWhXTVhoT3A4cTNjcmhrT0RaCmM2dHNnTGpvQzJTVG9KeU1HZit6MGd6c2tTYUhpck9pNFhDUExBcmx6VzFvVWV2YVB3Vi9pekxtRTF4ci9sOUEKNGlMSXRMUmtUOWE2ZlVnK3FHa00xN3VHY2NsenVEODduU1ZMMnY5QTZ3SURBUUFCbzRJQmxUQ0NBWkV3RHdZRApWUjBUQVFIL0JBVXdBd0VCL3pDQjRRWURWUjBnQklIWk1JSFdNSUhUQmdrckJnRUVBYjVZQUFNd2djVXdnWk1HCkNDc0dBUVVGQndJQ01JR0dHb0dEUVc1NUlIVnpaU0J2WmlCMGFHbHpJRU5sY25ScFptbGpZWFJsSUdOdmJuTjAKYVhSMWRHVnpJR0ZqWTJWd2RHRnVZMlVnYjJZZ2RHaGxJRkYxYjFaaFpHbHpJRkp2YjNRZ1EwRWdNeUJEWlhKMAphV1pwWTJGMFpTQlFiMnhwWTNrZ0x5QkRaWEowYVdacFkyRjBhVzl1SUZCeVlXTjBhV05sSUZOMFlYUmxiV1Z1CmRDNHdMUVlJS3dZQkJRVUhBZ0VXSVdoMGRIQTZMeTkzZDNjdWNYVnZkbUZrYVhObmJHOWlZV3d1WTI5dEwyTncKY3pBTEJnTlZIUThFQkFNQ0FRWXdIUVlEVlIwT0JCWUVGUExBRStDQ1F6Nzc3aTluTXBZMVhOdTR5d0xRTUc0RwpBMVVkSXdSbk1HV0FGUExBRStDQ1F6Nzc3aTluTXBZMVhOdTR5d0xRb1Vta1J6QkZNUXN3Q1FZRFZRUUdFd0pDClRURVpNQmNHQTFVRUNoTVFVWFZ2Vm1Ga2FYTWdUR2x0YVhSbFpERWJNQmtHQTFVRUF4TVNVWFZ2Vm1Ga2FYTWcKVW05dmRDQkRRU0F6Z2dJRnhqQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FnRUFUNjJnTEV6NndQSnY5MlpWcXlNMAo3dWNwMnNOYnRyQ0QyZERRNGlINzgyQ25PMTFnVXllaW0vWUlJaXJudjZCeTVad2thakd4a0hvbjI0UVJpU2VtCmQxbzQxNytzaHZ6dVhZTzhCc2JSZDJzUGJTUXZTM3BzcHdlV3l1T0VuNjJJaXgyckZvMWJaaGZaRnZTTGdOTGQKK0xKMncvdzRFNm9NM2tKcEsyN3pQT3VBSjl2MXBrUU5uMXBWV1F2VkRWSkl4YTZmOGkrQXhlb3lVRFVTbHk3Qgo0Zi94STRoUk9KL3labFoyNXc5Umw2VlNERTFKVVpVMlBiK2lTd3dRSFlhWlRLcnpjaEdUNU9yMm05cW9YYWROCnQ1NENybk1BeU5vakErajU2aGwwWWdDVXl5SWd2cFNuV2JXQ2FyNlplWHFwOGtva1V2ZDAvYnBPNXFnZEFtNngKRFlCRXdhN1RJemRmdTRWOEs1SXU2SDZsaTkyWjRiOG5ieTFkcW51SC9ncmRTL3lPOVNia2JuQkNialBzTVo1NwprOEhreVdrYVBjQnJUaUp0N3F0WVRjYlFRY0VyNms4U2gxN3JSZGhzOVpnQzA2RFlWWW9HbVJtaW9IZlJNSjZzCnpIWHVnL1d3WWpuUGJGZmlUTktSQ3c1MUtCdWF2LzBhUS9IS2QvczdqMkc0YVNnV1FnUmVjQ29jSWRpUDRiMGoKV3kxMFFKTFpZeGtOYzkxcHZHSkh2T0IwSzdMcmZiNUJHN1hBUnNXaElzdGZUc0Vva3Q0WXV0VXFLTHNSaXhlVAptSmxnbEZ3anoxb25sMTRMQlFhVE54NDdhVGJycVo1aEhZOHkybzRNMW5RK2V3a2syZ0YzUjhRN3pUU01tZlhLCjRTVmhNN0paRytKdTF6ZFh0ZzJwRXRvPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogTz1TRUNPTSBUcnVzdC5uZXQgT1U9U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0ExCiMgU3ViamVjdDogTz1TRUNPTSBUcnVzdC5uZXQgT1U9U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0ExCiMgTGFiZWw6ICJTZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3QgQ0EiCiMgU2VyaWFsOiAwCiMgTUQ1IEZpbmdlcnByaW50OiBmMTpiYzo2Mzo2YTo1NDplMDpiNToyNzpmNTpjZDplNzoxYTplMzo0ZDo2ZTo0YQojIFNIQTEgRmluZ2VycHJpbnQ6IDM2OmIxOjJiOjQ5OmY5OjgxOjllOmQ3OjRjOjllOmJjOjM4OjBmOmM2OjU2OjhmOjVkOmFjOmIyOmY3CiMgU0hBMjU2IEZpbmdlcnByaW50OiBlNzo1ZTo3MjplZDo5Zjo1NjowZTplYzo2ZTpiNDo4MDowMDo3MzphNDozZjpjMzphZDoxOToxOTo1YTozOToyMjo4MjowMTo3ODo5NTo5Nzo0YTo5OTowMjo2Yjo2YwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFdqQ0NBa0tnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFVRkFEQlFNUXN3Q1FZRFZRUUdFd0pLVURFWQpNQllHQTFVRUNoTVBVMFZEVDAwZ1ZISjFjM1F1Ym1WME1TY3dKUVlEVlFRTEV4NVRaV04xY21sMGVTQkRiMjF0CmRXNXBZMkYwYVc5dUlGSnZiM1JEUVRFd0hoY05NRE13T1RNd01EUXlNRFE1V2hjTk1qTXdPVE13TURReU1EUTUKV2pCUU1Rc3dDUVlEVlFRR0V3SktVREVZTUJZR0ExVUVDaE1QVTBWRFQwMGdWSEoxYzNRdWJtVjBNU2N3SlFZRApWUVFMRXg1VFpXTjFjbWwwZVNCRGIyMXRkVzVwWTJGMGFXOXVJRkp2YjNSRFFURXdnZ0VpTUEwR0NTcUdTSWIzCkRRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3pzLzUvMDIyeDd4WjhWNlVNYlhhS0wwdS9aUHRNN29ydzh5bDgKOWYvdUt1RHA2YnBiWkNLYW1tOHNPaVpwVVFXWkp0elZIR3B4eHBwOUhwM2RmR3pHakdkblNqNzRjYkFaSjZrSgpES2FWdjB1TURQcFZtRHZZNkNLaFMzRTRlYXlYa21temlYN3FJV2dHbUJTV2g5SmhOcnh0SjFhZVYrN0F3RmI5Ck1zK2syWTdDSTllTnFQUFlKYXlYNUhBNDlMWTZ0SjA3bHlaRG82RzhTVmx5VENNd2h3Rlk5azYrSEdoV1pxL04KUVYzSXMwMHFWVWFySDlvZTRrQTkyODE5dVpLQW5EZmRESlprbmR3aTkyU0wzMkhlRlpSU0ZhQjlVc2xMcUNISgp4ckh0eThPVllORVA4S3R3K04vTFRYN3MxdnFyMmIxL1ZQS2w2WG42MmRaMkpDaHpBZ01CQUFHalB6QTlNQjBHCkExVWREZ1FXQkJTZ2MwbVphTnlGVzJYam15Z3ZWNSs5TTd3SFNEQUxCZ05WSFE4RUJBTUNBUVl3RHdZRFZSMFQKQVFIL0JBVXdBd0VCL3pBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQWFFQ3BxTHZrVDExNXN3VzFGN05nRSt2RwprbDNnMGROcS92dSttMjIveHdWdFdTREVIUEMzMm9SWUFtUDZTQmJ2VDZVTDkwcVk4aitlRzYxSGEyUE9DRWZyClVqOTRuSzlOcnZqVlQ4K2FtQ29RUVRsU3hOM1ptdzd2a3dHdXNpN0thRUlrUW15d3N6byt6ZW5hU01RVnkrbjUKQncrU1VFbUszVEdYWDhucE42bzdXV1dYbERMSnM1OCtPbUpZeFVtdFlnNXhwVEtxTDhhSmRrTkFFeE5uUGFKVQpKUkRMOFRyeTJmcmJTVmE3cHY2blFUWEQ0SWhoeVlqSDN6WVFJcGhaNnJCSysxWVdjMjZzVGZjaW9VK3RIWG90ClJTZmxNTUZlOHRvVHl5VkNVWlZIQTR4c0ljeDBRdTFUL3pPTGp3OVhBUll2ejZidXlYQWlGTDM5dm13TEF3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVNvbmVyYSBDbGFzczIgQ0EgTz1Tb25lcmEKIyBTdWJqZWN0OiBDTj1Tb25lcmEgQ2xhc3MyIENBIE89U29uZXJhCiMgTGFiZWw6ICJTb25lcmEgQ2xhc3MgMiBSb290IENBIgojIFNlcmlhbDogMjkKIyBNRDUgRmluZ2VycHJpbnQ6IGEzOmVjOjc1OjBmOjJlOjg4OmRmOmZhOjQ4OjAxOjRlOjBiOjVjOjQ4OjZmOmZiCiMgU0hBMSBGaW5nZXJwcmludDogMzc6Zjc6NmQ6ZTY6MDc6N2M6OTA6YzU6YjE6M2U6OTM6MWE6Yjc6NDE6MTA6YjQ6ZjI6ZTQ6OWE6MjcKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDc5OjA4OmI0OjAzOjE0OmMxOjM4OjEwOjBiOjUxOjhkOjA3OjM1OjgwOjdmOmZiOmZjOmY4OjUxOjhhOjAwOjk1OjMzOjcxOjA1OmJhOjM4OjZiOjE1OjNkOmQ5OjI3Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlESURDQ0FnaWdBd0lCQWdJQkhUQU5CZ2txaGtpRzl3MEJBUVVGQURBNU1Rc3dDUVlEVlFRR0V3SkdTVEVQCk1BMEdBMVVFQ2hNR1UyOXVaWEpoTVJrd0Z3WURWUVFERXhCVGIyNWxjbUVnUTJ4aGMzTXlJRU5CTUI0WERUQXgKTURRd05qQTNNamswTUZvWERUSXhNRFF3TmpBM01qazBNRm93T1RFTE1Ba0dBMVVFQmhNQ1Jra3hEekFOQmdOVgpCQW9UQmxOdmJtVnlZVEVaTUJjR0ExVUVBeE1RVTI5dVpYSmhJRU5zWVhOek1pQkRRVENDQVNJd0RRWUpLb1pJCmh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBSkFYU2pXZHl2QU5sc2RFK2hZMy9FaTl2WCtBTFRVNzRXK28KWjZtL0F4eE5qRzh5UjlWQmFLUVRCTUUxREpxRVEveGNIZitKcytnWEdNMlJYL3VKNCtxL1RsMThHeWJUZFhudAo1b1RqVitXdEtjVDBPaWpucFh1RU5tbXovVjUydmFNdG1kT1FUaU1vZlJoajhWUTdKcDEyVzVkQ3N2K3U4RTdzCjNUbVZUb01HZitkSlFNakZBYkpVV21ZZFBmejU2VHdLbm9HNGNQQUJpK1FqVkh6SXJ2aVFIZ0NXY3RSVXoyRWoKdk9yN25RS1YwYmE1Y1RwcENEOFB0T0ZDeDRqMVA1aW9wN29jNEhGeDcxaFhnVkI2WEd0MFJnNkRBNWpEanFodQo4bll5YmllRHduUHozQmpvdEpQcWRVUnJCR0FnY1ZlSG5mTytvSkFqUFlvazRkb2gyOE1DQXdFQUFhTXpNREV3CkR3WURWUjBUQVFIL0JBVXdBd0VCL3pBUkJnTlZIUTRFQ2dRSVNxQ3FXSVRUWGp3d0N3WURWUjBQQkFRREFnRUcKTUEwR0NTcUdTSWIzRFFFQkJRVUFBNElCQVFCYXpvZjVGbklWVjBzZDJadm5vaVl3N0pObjM5WXQwalN2OXppbAp6cXNXdWFzdmZEWExyTkFQdEV3ci9JRHZhNHlSWHpaMjk5dXpHeG5xOUxJUi9XRnhSTDhvc3pvZHY3TkQ2SisvCjNERUljYkNkamRZMFJ6S1F4bVVrOTZCS2ZBUnpqemx2RjR4eXRiMUx5SHI0ZTRQREtFNmNDZXBuUDdKbkJCdkQKRk5yNDUwa2trZEFkYXZwaE9lOXI1eUYxQmdmWUVyUWhJSEJDY1lIYVBKbzJ2cVpiRFdwc21oK1JlL241NzBLNgpUazZlekF5TmxOelpSWnhlN0VKUVk2NzBYY1N4RXR6S082Z3VuUlJhQlhXMzdOZGo0cm8xdGdRSWtlamFuWnoyClpyVVlyQXFtVkNZME05SWJ3ZFIvR2pxT0M2b3lidHY4VHlXZjJUTEhsbHB3ck45TQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049WFJhbXAgR2xvYmFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89WFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jIE9VPXd3dy54cmFtcHNlY3VyaXR5LmNvbQojIFN1YmplY3Q6IENOPVhSYW1wIEdsb2JhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPVhSYW1wIFNlY3VyaXR5IFNlcnZpY2VzIEluYyBPVT13d3cueHJhbXBzZWN1cml0eS5jb20KIyBMYWJlbDogIlhSYW1wIEdsb2JhbCBDQSBSb290IgojIFNlcmlhbDogMTA3MTA4OTA4ODAzNjUxNTA5NjkyOTgwMTI0MjMzNzQ1MDE0OTU3CiMgTUQ1IEZpbmdlcnByaW50OiBhMTowYjo0NDpiMzpjYToxMDpkODowMDo2ZTo5ZDowZjpkODowZjo5MjowYTpkMQojIFNIQTEgRmluZ2VycHJpbnQ6IGI4OjAxOjg2OmQxOmViOjljOjg2OmE1OjQxOjA0OmNmOjMwOjU0OmYzOjRjOjUyOmI3OmU1OjU4OmM2CiMgU0hBMjU2IEZpbmdlcnByaW50OiBjZTpjZDpkYzo5MDo1MDo5OTpkODpkYTpkZjpjNTpiMTpkMjowOTpiNzozNzpjYjplMjpjMTo4YzpmYjoyYzoxMDpjMDpmZjowYjpjZjowZDozMjo4NjpmYzoxYTphMgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRU1EQ0NBeGlnQXdJQkFnSVFVSlJzN0JqcTFaeE4xWmZ2ZFkrZ3JUQU5CZ2txaGtpRzl3MEJBUVVGQURDQgpnakVMTUFrR0ExVUVCaE1DVlZNeEhqQWNCZ05WQkFzVEZYZDNkeTU0Y21GdGNITmxZM1Z5YVhSNUxtTnZiVEVrCk1DSUdBMVVFQ2hNYldGSmhiWEFnVTJWamRYSnBkSGtnVTJWeWRtbGpaWE1nU1c1ak1TMHdLd1lEVlFRREV5UlkKVW1GdGNDQkhiRzlpWVd3Z1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt3SGhjTk1EUXhNVEF4TVRjeApOREEwV2hjTk16VXdNVEF4TURVek56RTVXakNCZ2pFTE1Ba0dBMVVFQmhNQ1ZWTXhIakFjQmdOVkJBc1RGWGQzCmR5NTRjbUZ0Y0hObFkzVnlhWFI1TG1OdmJURWtNQ0lHQTFVRUNoTWJXRkpoYlhBZ1UyVmpkWEpwZEhrZ1UyVnkKZG1salpYTWdTVzVqTVMwd0t3WURWUVFERXlSWVVtRnRjQ0JIYkc5aVlXd2dRMlZ5ZEdsbWFXTmhkR2x2YmlCQgpkWFJvYjNKcGRIa3dnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDWUpCNjlGYlM2CjM4ZU1wU2UyT0F0cDg3Wk9xQ3d1SVIxY1JOOGhYWDRqZFA1ZWZyUkt0NmF0SDY3Z0JoYmltMXZaWjNSclhZQ1AKS1oyR0c5bWNEWmh0ZGhBb1dPUmxzSDlLbUhtZjRNTXhmb0FydFl6QVFEc1JodERMb29ZMllLVFZNSUp0Mlc3UQpEeElFTTVkZlQyRmE4T1Q1a2F2bkhUdTg2TS8wYXkwMGZPSklZUnlPODJGRXpHK2dTcW1Vc0UzYTU2azBlbkk0CnFFSE1QSlFSZmV2SXBveTNoc3ZLTXp2WlBUZUwrM28raGl6bmM5Y0tWNnhrbXhucjlBOEVDSXFzQXhjWlpQUmEKSlNLTk5DeXk5bWdkRW0zVGloNFUyc1NQcHVJamhkVjZEYjFxNE9uczdCZTdRaHRucWlYdFJZTWgvTUhKZk5WaQpQdnJ5eFMzVC9kUmxBZ01CQUFHamdaOHdnWnd3RXdZSkt3WUJCQUdDTnhRQ0JBWWVCQUJEQUVFd0N3WURWUjBQCkJBUURBZ0dHTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRk1aUG9qMEdZNFFKbk01aTVBU3MKalZ5MTZiWWJNRFlHQTFVZEh3UXZNQzB3SzZBcG9DZUdKV2gwZEhBNkx5OWpjbXd1ZUhKaGJYQnpaV04xY21sMAplUzVqYjIwdldFZERRUzVqY213d0VBWUpLd1lCQkFHQ054VUJCQU1DQVFFd0RRWUpLb1pJaHZjTkFRRUZCUUFECmdnRUJBSkVWT1FNQkcyZjdTaHo1Q21CYm9kcE5sMkw1SkZNbjE0SmtUcEF1dzBrYks1cmMvS2g0WnpYeEhmQVIKdmJkSTR4RDJEZDgvMHNtMnFsV2tTTG9DMjk1WkxoVmJPNTBXZlVmWE4rcGZUWFlTTnJzZjE2R0JCRVlnb3l4dApxWjRCZmo4cHpnQ1QzLzNKa25PSmlXU2U1eXZrSEpFczBybk9mYzV2TVpuVDVyN1NIcER3Q1JSNVhDT3JUZExhCklSOU5tWG1kNGM4bm54Q2JISWdOc0lwa1FURzREbXlRSktTYlhIR1B1cnQrSEJ2YmFvQVBJYnpwMjZhM1FQU3kKaTZteDVPK2FHdEE5YVpudXFDaWo0VHl6OExJUm5NOThRT2JkNTBOOW90ZzZ0YW1OOGpTWnhOUVE0UWI5Q1lRUQpPKzdFVFBUc0ozeEN3blI4Z29vSnliUURKYnc9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBPPVRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLiBPVT1HbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgU3ViamVjdDogTz1UaGUgR28gRGFkZHkgR3JvdXAsIEluYy4gT1U9R28gRGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIExhYmVsOiAiR28gRGFkZHkgQ2xhc3MgMiBDQSIKIyBTZXJpYWw6IDAKIyBNRDUgRmluZ2VycHJpbnQ6IDkxOmRlOjA2OjI1OmFiOmRhOmZkOjMyOjE3OjBjOmJiOjI1OjE3OjJhOjg0OjY3CiMgU0hBMSBGaW5nZXJwcmludDogMjc6OTY6YmE6ZTY6M2Y6MTg6MDE6ZTI6Nzc6MjY6MWI6YTA6ZDc6Nzc6NzA6MDI6OGY6MjA6ZWU6ZTQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGMzOjg0OjZiOmYyOjRiOjllOjkzOmNhOjY0OjI3OjRjOjBlOmM2OjdjOjFlOmNjOjVlOjAyOjRmOmZjOmFjOmQyOmQ3OjQwOjE5OjM1OjBlOjgxOmZlOjU0OjZhOmU0Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFQURDQ0F1aWdBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUVVGQURCak1Rc3dDUVlEVlFRR0V3SlZVekVoCk1COEdBMVVFQ2hNWVZHaGxJRWR2SUVSaFpHUjVJRWR5YjNWd0xDQkpibU11TVRFd0x3WURWUVFMRXloSGJ5QkUKWVdSa2VTQkRiR0Z6Y3lBeUlFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TUI0WERUQTBNRFl5T1RFMwpNRFl5TUZvWERUTTBNRFl5T1RFM01EWXlNRm93WXpFTE1Ba0dBMVVFQmhNQ1ZWTXhJVEFmQmdOVkJBb1RHRlJvClpTQkhieUJFWVdSa2VTQkhjbTkxY0N3Z1NXNWpMakV4TUM4R0ExVUVDeE1vUjI4Z1JHRmtaSGtnUTJ4aGMzTWcKTWlCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVENDQVNBd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFTgpBRENDQVFnQ2dnRUJBTjZkMStwWEdFbWhXK3ZYWDBpRzZyN2QvK1R2Wnh6MFpXaXpWM0dnWG5lNzdadEo2WENBClBWWVlZd2h2MnZMTTBEOS9BbFFpVkJEWXNvSFV3SFU5UzMvSGQ4TStlS3NhQTdVZ2F5OXFLN0hGaUg3RXV4NncKd2RoRkoyK3FOMWozaHliWDJDMzJxUmUzSDNJMlRxWVhQMldZa3RzcWJsMmkvb2pnQzk1LzVZMFY0ZXZMT3RYaQpFcUlUTGRpT3IxOFNQYUFJQlFpMlhLVmxPQVJGbVI2allHQjB4VUdsY21JYllzVWZiMThhUXI0Q1VXV29yaU1ZCmF2eDRBNmxOZjRERCtxdGEvS0ZBcE1vWkZ2Nnl5TzllY3czdWQ3MmE5bm1ZdkxFSFo2SVZEZDJnV01aRWV3bysKWWloZnVrRUhVMWpQRVg0NGRNWDQvN1Zwa0krRWRPcVhHNjhDQVFPamdjQXdnYjB3SFFZRFZSME9CQllFRk5MRQpzTktSMUV3UmNiTmh5ejJoL3Qyb2F0VGpNSUdOQmdOVkhTTUVnWVV3Z1lLQUZOTEVzTktSMUV3UmNiTmh5ejJoCi90Mm9hdFRqb1dla1pUQmpNUXN3Q1FZRFZRUUdFd0pWVXpFaE1COEdBMVVFQ2hNWVZHaGxJRWR2SUVSaFpHUjUKSUVkeWIzVndMQ0JKYm1NdU1URXdMd1lEVlFRTEV5aEhieUJFWVdSa2VTQkRiR0Z6Y3lBeUlFTmxjblJwWm1sagpZWFJwYjI0Z1FYVjBhRzl5YVhSNWdnRUFNQXdHQTFVZEV3UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUZCUUFECmdnRUJBREpMODdMS1BwSDhFc2FoQjR5T2Q2QXpCaFJja0I0WTl3aW1QUW9aK1llQUVXNXA1SllYTVA4MGtXTnkKT083TUhBR2pIWlFvcERIMmVzUlUxL2JsTVZnRG9zek9ZdHVVUlhPMXYwWEpKTFhWZ2dLdEkzbHBqYmkyVGM3UApUTW96SStnY2lLcWRpMEZ1RnNrZzVZbWV6VHZhY1BkK21TWWdGRlFscTI1emhlYWJJWjBLYklJT3FQakNEUG9RCkhteVc3NGNOeEE5aGk2M3VneXVWK0k2U2hISTU2eURxZysyRHpaZHVDTHpyVGlhMmN5dmswL1pNL2laeDRtRVIKZEVyL1Z4cUhEM1ZJTHM5UmFSZWdBaEpobGRYUlFMSVFUTzdFckJCRHBxV2VDdFdWWXBvTno0aUN4VElNNUN1ZgpSZVlObnlpY3Nia3FXbGV0TncrdkhYL2J2Wjg9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBPPVN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4gT1U9U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBTdWJqZWN0OiBPPVN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4gT1U9U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBMYWJlbDogIlN0YXJmaWVsZCBDbGFzcyAyIENBIgojIFNlcmlhbDogMAojIE1ENSBGaW5nZXJwcmludDogMzI6NGE6NGI6YmI6Yzg6NjM6Njk6OWI6YmU6NzQ6OWE6YzY6ZGQ6MWQ6NDY6MjQKIyBTSEExIEZpbmdlcnByaW50OiBhZDo3ZToxYzoyODpiMDo2NDplZjo4Zjo2MDowMzo0MDoyMDoxNDpjMzpkMDplMzozNzowZTpiNTo4YQojIFNIQTI1NiBGaW5nZXJwcmludDogMTQ6NjU6ZmE6MjA6NTM6OTc6Yjg6NzY6ZmE6YTY6ZjA6YTk6OTU6OGU6NTU6OTA6ZTQ6MGY6Y2M6N2Y6YWE6NGY6Yjc6YzI6Yzg6Njc6NzU6MjE6ZmI6NWY6YjY6NTgKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVEekNDQXZlZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRVUZBREJvTVFzd0NRWURWUVFHRXdKVlV6RWwKTUNNR0ExVUVDaE1jVTNSaGNtWnBaV3hrSUZSbFkyaHViMnh2WjJsbGN5d2dTVzVqTGpFeU1EQUdBMVVFQ3hNcApVM1JoY21acFpXeGtJRU5zWVhOeklESWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrd0hoY05NRFF3Ck5qSTVNVGN6T1RFMldoY05NelF3TmpJNU1UY3pPVEUyV2pCb01Rc3dDUVlEVlFRR0V3SlZVekVsTUNNR0ExVUUKQ2hNY1UzUmhjbVpwWld4a0lGUmxZMmh1YjJ4dloybGxjeXdnU1c1akxqRXlNREFHQTFVRUN4TXBVM1JoY21acApaV3hrSUVOc1lYTnpJRElnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa3dnZ0VnTUEwR0NTcUdTSWIzCkRRRUJBUVVBQTRJQkRRQXdnZ0VJQW9JQkFRQzNNc2orNlhHbUJJV3REQkZrMzg1Tjc4Z0RHSWMvb2F2N1BLYWYKOE1PaDJ0VFliaXRUa1Bza3BENkU4SjdvWCt6bEowVDFLS1kvZTk3Z0t2RElyMU12bnNvRkFaTWVqMlljT2FkTgorbHEyY3dRbFp1dDNmK2RaeGtxWkpSUlU2eWJIODM4WjFUQndqNit3UmlyL3Jlc3A3ZGVmcWdTSG85VDVpYVUwClg5dERrWUkyMldZOHNiaTVndjJjT2o0UXlEdnZCbVZtZXBzWkdEMy9jVkU4TUM1ZnZqMTNjN0pkQm16REkxYWEKSzRVbWtoeW5BclBrUHcydkNIbUN1RFk5NnB6VE5iTzhhY3Ixekozby9XU05GNEF6Ymw1S1habkpIb2UwblJyQQoxVzRUTlNOZTM1dGZQZS9XOTNiQzZqNjdlQTBjUW1kckJOajQxdHB2aS9KRW9BR3JBZ0VEbzRIRk1JSENNQjBHCkExVWREZ1FXQkJTL1g3ZlJ6dDBmaHZSYlZhemMxeERDRHFtSTV6Q0JrZ1lEVlIwakJJR0tNSUdIZ0JTL1g3ZlIKenQwZmh2UmJWYXpjMXhEQ0RxbUk1NkZzcEdvd2FERUxNQWtHQTFVRUJoTUNWVk14SlRBakJnTlZCQW9USEZOMApZWEptYVdWc1pDQlVaV05vYm05c2IyZHBaWE1zSUVsdVl5NHhNakF3QmdOVkJBc1RLVk4wWVhKbWFXVnNaQ0JECmJHRnpjeUF5SUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVnZ0VBTUF3R0ExVWRFd1FGTUFNQkFmOHcKRFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUFXZFA0aWQwY2thVmFHc2FmUHpXZHFiQVljYVQxZXBvWGtKS3R2MwpMN0llek1kZWF0aURoNkdYNzBrMVBuY0dRVmhpdjQ1WXVBcG5QK3l6M1NGbUg4bFUrbkxNUFV4QTJJR3ZkNTZECmVydWl4L1UwRjQ3WkVVRDAvQ3dxVFJWL3AySmRMaVhUQUFzZ0doMW8rUmU0OUwyTDdTaFozVTBXaXhlRHlMSmwKeHkxNnBhcThVNFp0M1Zla3l2Z2dRUXRvOFBUN2RMNVdYWHA1OWZrZGhlTXRsYjcxY1pCRHpJMGZtZ0FLaHlucApWU0pZQUNQcTR4SkRLVnRIQ04yTVFXcGxCcWpsSWFwQnRKVWhsYmw5MFRTckU5YXR2TnppUFRuTnZUNTFjS0VZCldRUEpJclNQbk5WZUt0ZWx0dFFLYmZpM1FCRkdtaDk1RG1LL0Q1ZnM0QzhmRjVRPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogTz1Hb3Zlcm5tZW50IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBTdWJqZWN0OiBPPUdvdmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIExhYmVsOiAiVGFpd2FuIEdSQ0EiCiMgU2VyaWFsOiA0MjAyMzA3MDgwNzcwODcyNDE1OTk5MTE0MDU1NjUyNzA2Njg3MAojIE1ENSBGaW5nZXJwcmludDogMzc6ODU6NDQ6NTM6MzI6NDU6MWY6MjA6ZjA6ZjM6OTU6ZTE6MjU6YzQ6NDM6NGUKIyBTSEExIEZpbmdlcnByaW50OiBmNDo4YjoxMTpiZjpkZTphYjpiZTo5NDo1NDoyMDo3MTplNjo0MTpkZTo2YjpiZTo4ODoyYjo0MDpiOQojIFNIQTI1NiBGaW5nZXJwcmludDogNzY6MDA6Mjk6NWU6ZWY6ZTg6NWI6OWU6MWY6ZDY6MjQ6ZGI6NzY6MDY6MmE6YWE6YWU6NTk6ODE6OGE6NTQ6ZDI6Nzc6NGM6ZDQ6YzA6YjI6YzA6MTE6MzE6ZTE6YjMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZjakNDQTFxZ0F3SUJBZ0lRSDUxWld0Y3Z3Z1pFcFlBSWFlTmU5akFOQmdrcWhraUc5dzBCQVFVRkFEQS8KTVFzd0NRWURWUVFHRXdKVVZ6RXdNQzRHQTFVRUNnd25SMjkyWlhKdWJXVnVkQ0JTYjI5MElFTmxjblJwWm1sagpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1CNFhEVEF5TVRJd05URXpNak16TTFvWERUTXlNVEl3TlRFek1qTXpNMW93ClB6RUxNQWtHQTFVRUJoTUNWRmN4TURBdUJnTlZCQW9NSjBkdmRtVnlibTFsYm5RZ1VtOXZkQ0JEWlhKMGFXWnAKWTJGMGFXOXVJRUYxZEdodmNtbDBlVENDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQgpBSm9sdU96TW9uV29lL2ZPVzFtS3lkR0dFZ2hVN0p6eTUwYjJpUE44NmFYZlRFYzJwQnNCSEg4ZVY0cU53OFhSCkllUGFKRDlJSy91ZkxxR1U1eXdjazlHL0d3R0hVNW5PcC9VS0lYWjMvNm0zeG5PVVQwYjNFRWszK3FoWlNWMXEKZ1FkVzhvcjVCdEQzY0NKTnRMZEJ1VEs0c2ZDeHc1dy9jUDFUM1lHcTJHTjQ5dGhUYnFHc2FvUWtjbFNHeHRLeQp5aHdPZVlIV3RYQmlDQUV1VGs4TzFSR3ZxYS9sbXIvY3pJZHRKdVRKVjZMN2x2bk00VDlUakd4TWZwdFRDQXRzCkYvdG55TUt0c2MyQXRKZmNkZ0VXRmVscTE2VGhlRWZPaHRYN01mUDZNYjQwcWlqN2NFd2RTY2V2TEoxdFpxYTIKaldSK3RTQnFuVHVCdG85QUFHZExpWWE0ekdYK0ZWUHBCTUhXWHgxRTF3b3ZKNXBHZmFFTmRhMVVoaFhjU1R2eApsczRQbTZEc28zcGR2dFVxZFVMbGU5Nmx0cXF2S0t5c2tLdzR0OVZvTlNaNjNQYzc4LzFGbTlHN1EzaHViL0ZDClZHcVk4QTJ0bCtsU1h1blZhbkxlYXZjYllCVDBwZVMyY1dlcUgrcmlUY0ZDUVA1blJoYzRMMGMvY1p5dTVTSEsKWVMxdEI2aUVmQzN1VVNYeFk1Q2UvZUZYaUd2dmlpTnRzZWE5UDYzUlBaWUxoWTNOYXllN3R3V2I3THVScVFvSApFZ0tYVGlDUThQOE5IdUpCTzlOQU91ZU5YZHBtNUFLd0IxS1lYQTZPTTV6Q3BwWDdWUmx1VEk2dVN3Kzl3VGhOClhvK0VIV2JOeFdDV3RGSmFCWW1PbFhxWXdaRThsU095RHZSNXRNbDh3VW9oQWdNQkFBR2phakJvTUIwR0ExVWQKRGdRV0JCVE16Ty9NS1dDa083R1N0ano2TW1LUHJDVVZPekFNQmdOVkhSTUVCVEFEQVFIL01Ea0dCR2NxQndBRQpNVEF2TUMwQ0FRQXdDUVlGS3c0REFob0ZBREFIQmdWbktnTUFBQVFVQTV2d0loUC9sU2cyMDl5ZXdETDdNVHFLClVXVXdEUVlKS29aSWh2Y05BUUVGQlFBRGdnSUJBRUNBU3ZvbXljNWVNTjFQaG5SMldQV3VzNE16ZUtSNmRCY1oKVHVsU3RibmdDblJpcW1qS2VLQk1tbzRzSXk3VmFoSWt2OVJvMDRyUTJKeWZ0QjhNM2poK1Z6ajhqZUpQWGd5ZgpxenZTLzNXWHk2VGpad2ovNWNBV3RVZ0JmZW41Q3Y4YjVXcHB2M2docU1Lbkk2bUdxM1pXNkE0TTloUGRLbWFLClpFazlHaGlIa0FTZlFsSzNUOHYrUjBGMk5lLy9BSFkyUlRLYnhrYUZYZUlrc0I3alNKYVlWMGVVVlhvUFFiRkUKSlBQQi9ocHJ2NGo5d2FiYWsyQmVnVXFaSUp4SVpobTFBSGxVRDdnc0wwdThxVjFiWUgrTWg2WGdVbU1xdnRnNwpoVUFWL2g2MlpUL0ZTOXArdFhvMUthTXVlcGhnSXFQMGZTZE9MZXEwZER6cEQ2UXpEeEFSdkJNQjF1VU8wNysxCkVxTGhSU1BBekFodVliZUpxNFBqSkI3bVhRZm5IeUErejJmSTU2d3diU2RMYUc1TEtsd0NDRFRiK0hia1o2TW0KbkQraU1zSkt4WUVZTVJCV3FvVHZMUXIvdUI5MzByK2xXS0JpNU5kTGtYV05pWUNZZm0zTFUwNWVyL2F5bDRXWAp1ZHBWQnJrazd0ZkdPQjVqR3hJN2xlRllyUExmaE5WZm1TOE5WVnZtT05zdVAzTHBTSVhMdXlrVGp4NDRWYm56CnNzUXdtU05PWGZKSW9SSU0zQktRQ1pCVWtRTThSK1hWeVdYZ3QwdDk3RWZUc3dzK3JaN1FkQUFPNjcxUnJjRGUKTE1ERGF2N3YzQXVuK2tiZllOdWNwbGxRZFNOcGM1T3krZndDMDBmbWNjNFFBdTRuaklUL3JFVU5FMXlETXVBbApwWVlzZlBRUwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IENBIE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBTdWJqZWN0OiBDTj1EaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIExhYmVsOiAiRGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IENBIgojIFNlcmlhbDogMTcxNTQ3MTc5MzQxMjA1ODc4NjIxNjc3OTQ5MTQwNzE0MjUwODEKIyBNRDUgRmluZ2VycHJpbnQ6IDg3OmNlOjBiOjdiOjJhOjBlOjQ5OjAwOmUxOjU4OjcxOjliOjM3OmE4OjkzOjcyCiMgU0hBMSBGaW5nZXJwcmludDogMDU6NjM6Yjg6NjM6MGQ6NjI6ZDc6NWE6YmI6Yzg6YWI6MWU6NGI6ZGY6YjU6YTg6OTk6YjI6NGQ6NDMKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDNlOjkwOjk5OmI1OjAxOjVlOjhmOjQ4OjZjOjAwOmJjOmVhOjlkOjExOjFlOmU3OjIxOmZhOmJhOjM1OjVhOjg5OmJjOmYxOmRmOjY5OjU2OjFlOjNkOmM2OjMyOjVjCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEdHpDQ0FwK2dBd0lCQWdJUURPZmc1UmZZUnY2UDVXRDhHL0F3T1RBTkJna3Foa2lHOXcwQkFRVUZBREJsCk1Rc3dDUVlEVlFRR0V3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjMKZDNjdVpHbG5hV05sY25RdVkyOXRNU1F3SWdZRFZRUURFeHRFYVdkcFEyVnlkQ0JCYzNOMWNtVmtJRWxFSUZKdgpiM1FnUTBFd0hoY05NRFl4TVRFd01EQXdNREF3V2hjTk16RXhNVEV3TURBd01EQXdXakJsTVFzd0NRWURWUVFHCkV3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjNkM2N1WkdsbmFXTmwKY25RdVkyOXRNU1F3SWdZRFZRUURFeHRFYVdkcFEyVnlkQ0JCYzNOMWNtVmtJRWxFSUZKdmIzUWdRMEV3Z2dFaQpNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUN0RGhYTzVFT0FYTEdIODdkZytYRVNwYTdjCkpwU0lxdlRPOVNBNUtGaGdEUGlBMnFrVmxUSmhQTFd4S0lTS2l0eWZDZ3lERjNxUGtLeUs1M2xUWERHRUt2WVAKbURJMmRzemUzVHlvb3U5cSt5SHlVbUhmbnlEWEgrS3gyZjRZWk5JU1cxLzVXQmcxdkVmTm9UYjVhMy9Vc0RnKwp3UnZEakRQWjJDOFkvaWdQczZlRDFzTnVSTUJoTlpZVy9sbWNpM1p0MS9HaVN3MHIvd3R5MnA1ZzBJNlFOY1o0ClZZY2dvYy9sYlFySVNYd3htRE5zSXVtSDBESmFvcm9UZ2hIdE9SZWRtVHB5b2ViNnBOblZGekYxcm9WOUlxNC8KQVVhRzlpaDV5TEhhNUZjWHhINGNEckMwa3FaV3M3MnlsKzJxcC9DM3hhZy9sUmJRLzZHVzZ3aGZHSGRQQWdNQgpBQUdqWXpCaE1BNEdBMVVkRHdFQi93UUVBd0lCaGpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXCkJCUkY2Nkt2OUpMTGdqRXRVWXVucHlHZDgyM0lEekFmQmdOVkhTTUVHREFXZ0JSRjY2S3Y5SkxMZ2pFdFVZdW4KcHlHZDgyM0lEekFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBb2c2ODMrTHQ4T055YzNwa2xMLzNjbWJZTXVSQwpkV0t1aCt2eTFkbmVWck9mek00VUtMa05sMkJjRWt4WTVOTTlnMGxGV0pjMWFScW9SK3BXeG5tckV0aG5nWVRmCmZ3azhsT2E0Sml3Z3ZUMnpLSW4zWC84aTRwZUVIK2xsNzRmZzM4Rm5TYk5kNjdJSkt1c203WGkrZlQ4cjg3Y20KTlcxZmlRRzJTVnVmQVFXYnF6MGx3Y3kyZjhMeGI0YkcrbVJvNjRFdGxPdEN0L3FNSHQxaThiNVFaN2RzdmZQeApIMnNNTmdjV2Z6ZDhxVnR0ZXZFU1JtQ0QxeWNFdmt2T2w3N0RaeXBvRWQrQTV3d3pacjhURFJSdTgzOGZZeEFlCitvMGJKVzFzajZXM1lRR3gwcU1tb1JCeG5hM2l3L25EbVZHM0t3Y0l6aTdtVUxLbitncEZMNkx3OGc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RGlnaUNlcnQgR2xvYmFsIFJvb3QgQ0EgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIFN1YmplY3Q6IENOPURpZ2lDZXJ0IEdsb2JhbCBSb290IENBIE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBMYWJlbDogIkRpZ2lDZXJ0IEdsb2JhbCBSb290IENBIgojIFNlcmlhbDogMTA5NDQ3MTk1OTg5NTIwNDAzNzQ5NTE4MzI5NjM3OTQ0NTQzNDYKIyBNRDUgRmluZ2VycHJpbnQ6IDc5OmU0OmE5Ojg0OjBkOjdkOjNhOjk2OmQ3OmMwOjRmOmUyOjQzOjRjOjg5OjJlCiMgU0hBMSBGaW5nZXJwcmludDogYTg6OTg6NWQ6M2E6NjU6ZTU6ZTU6YzQ6YjI6ZDc6ZDY6NmQ6NDA6YzY6ZGQ6MmY6YjE6OWM6NTQ6MzYKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDQzOjQ4OmEwOmU5OjQ0OjRjOjc4OmNiOjI2OjVlOjA1OjhkOjVlOjg5OjQ0OmI0OmQ4OjRmOjk2OjYyOmJkOjI2OmRiOjI1OjdmOjg5OjM0OmE0OjQzOmM3OjAxOjYxCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEcnpDQ0FwZWdBd0lCQWdJUUNEdmdWcEJDUnJHaGRXckpXWkhIU2pBTkJna3Foa2lHOXcwQkFRVUZBREJoCk1Rc3dDUVlEVlFRR0V3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjMKZDNjdVpHbG5hV05sY25RdVkyOXRNU0F3SGdZRFZRUURFeGRFYVdkcFEyVnlkQ0JIYkc5aVlXd2dVbTl2ZENCRApRVEFlRncwd05qRXhNVEF3TURBd01EQmFGdzB6TVRFeE1UQXdNREF3TURCYU1HRXhDekFKQmdOVkJBWVRBbFZUCk1SVXdFd1lEVlFRS0V3eEVhV2RwUTJWeWRDQkpibU14R1RBWEJnTlZCQXNURUhkM2R5NWthV2RwWTJWeWRDNWoKYjIweElEQWVCZ05WQkFNVEYwUnBaMmxEWlhKMElFZHNiMkpoYkNCU2IyOTBJRU5CTUlJQklqQU5CZ2txaGtpRwo5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBNGp2aEVYTGVxS1RUbzFlcVVLS1BDM2VReWFLbDdoTE9sbHNCCkNTRE1BWk9uVGpDM1UvZER4R2tBVjUzaWpTTGRod1pBQUlFSnpzNGJnNy9melR0eFJ1TFdac2NGczNZbkZvOTcKbmg2VmZlNjNTS01JMnRhdmVndzVCbVYvU2wwZnZCZjRxNzd1S05kMGYzcDRtVm1GYUc1Y0l6Skx2MDdBNkZwdAo0M0MvZHhDLy9BSDJoZG1vUkJCWU1xbDFHTlhSb3I1SDRpZHE5Sm96K0VrSVlJdlVYN1E2aEwraHFrcE1mVDdQClQxOXNkbDZnU3plUm50d2k1bTNPRkJxT2Fzdit6Yk1VWkJmSFd5bWVNci95N3ZyVEMwTFVxN2RCTXRvTTFPLzQKZ2RXN2pWZy90UnZvU1NpaWNOb3hCTjMzc2hieVRBcE9CNmp0U2oxZXRYK2prTU92SndJREFRQUJvMk13WVRBTwpCZ05WSFE4QkFmOEVCQU1DQVlZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVUE5NVFOVmJSClRMdG04S1BpR3h2RGw3STkwVlV3SHdZRFZSMGpCQmd3Rm9BVUE5NVFOVmJSVEx0bThLUGlHeHZEbDdJOTBWVXcKRFFZSktvWklodmNOQVFFRkJRQURnZ0VCQU11Y042cElFeElLK3QxRW5FOVNzUFRmcmdUMWVYa0lveVFZL0VzcgpoTUF0dWRYSC92VEJIMWpMdUcyY2VuVG5tQ21yRWJYamNLQ2h6VXlJbVpPTWtYRGlxdzhjdnBPcC8yUFY1QWRnCjA2Ty9uVnNKOGRXTzQxUDBqbVA2UDZmYnRHYmZZbWJXMFc1QmpmSXR0ZXAzU3ArZFdPSXJXY0JBSSswdEtJSkYKUG5sVWtpYVk0SUJJcURmdjhOWjVZQmJlck9nT3pXNnNSQmM0TDBuYTRVVStLcmsyVTg4NlVBYjNMdWpFVjBscwpZU0VZMVFTdGVEd3NPb0JycCt1dkZSVHAySW5CdVRoczRwRnNpdjlrdVhjbFZ6REFHeVNqNGR6cDMwZDh0YlFrCkNBVXc3QzI5Qzc5RnYxQzVxZlBybUFFU3JjaUl4cGcwWDQwS1BNYnAxWldWYmQ0PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RGlnaUNlcnQgSGlnaCBBc3N1cmFuY2UgRVYgUm9vdCBDQSBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgU3ViamVjdDogQ049RGlnaUNlcnQgSGlnaCBBc3N1cmFuY2UgRVYgUm9vdCBDQSBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgTGFiZWw6ICJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBIgojIFNlcmlhbDogMzU1MzQwMDA3NjQxMDU0NzkxOTcyNDczMDczNDM3ODEwMDA4NwojIE1ENSBGaW5nZXJwcmludDogZDQ6NzQ6ZGU6NTc6NWM6Mzk6YjI6ZDM6OWM6ODU6ODM6YzU6YzA6NjU6NDk6OGEKIyBTSEExIEZpbmdlcnByaW50OiA1ZjpiNzplZTowNjozMzplMjo1OTpkYjphZDowYzo0Yzo5YTplNjpkMzo4ZjoxYTo2MTpjNzpkYzoyNQojIFNIQTI1NiBGaW5nZXJwcmludDogNzQ6MzE6ZTU6ZjQ6YzM6YzE6Y2U6NDY6OTA6Nzc6NGY6MGI6NjE6ZTA6NTQ6NDA6ODg6M2I6YTk6YTA6MWU6ZDA6MGI6YTY6YWI6ZDc6ODA6NmU6ZDM6YjE6MTg6Y2YKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR4VENDQXEyZ0F3SUJBZ0lRQXF4Y0ptb0xRSnVQQzNueXJrWWxkekFOQmdrcWhraUc5dzBCQVFVRkFEQnMKTVFzd0NRWURWUVFHRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCMwpkM2N1WkdsbmFXTmxjblF1WTI5dE1Tc3dLUVlEVlFRREV5SkVhV2RwUTJWeWRDQklhV2RvSUVGemMzVnlZVzVqClpTQkZWaUJTYjI5MElFTkJNQjRYRFRBMk1URXhNREF3TURBd01Gb1hEVE14TVRFeE1EQXdNREF3TUZvd2JERUwKTUFrR0ExVUVCaE1DVlZNeEZUQVRCZ05WQkFvVERFUnBaMmxEWlhKMElFbHVZekVaTUJjR0ExVUVDeE1RZDNkMwpMbVJwWjJsalpYSjBMbU52YlRFck1Da0dBMVVFQXhNaVJHbG5hVU5sY25RZ1NHbG5hQ0JCYzNOMWNtRnVZMlVnClJWWWdVbTl2ZENCRFFUQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU1iTTVYUG0KKzlTNzVTMHRNcWJmNVlFL3ljMGxTYlp4S3NQVmxEUm5vZ29jc0Y5cHBrQ3h4TGV5ajlDWXBLbEJXVHJUM0pUVwpQTnQwT0tSS3pFMGxndmRLcFZNU09PN3pTVzF4a1g1anRxdW1YOE9raFBoUFlsRysrTVhzMnppUzR3YmxDSkVNCnhDaEJWZnZMV29rVmZuSG9OYjlOY2drOXZqbzRVRnQzTVJ1TnM4Y2tSWnFuckcwQUZGb0V0N29UNjFFS21FRkIKSWs1bFlZZUJRVkNtZVZ5SjNobEtWOVV1NWwwY1V5eCttTTBhQmhha2FIUFFOQVFUWEtGeDAxcDhWZHRlWk9FMwpoekJXQk9VUnRDbUFFdkY1T1lpaUFoRjhKMmEzaUxkNDhzb0txRGlyQ21UQ3YyWmRsWVRCb1NVZWgxMGFVQXNnCkVzeEJ1MjRMVVRpNFM4c0NBd0VBQWFOak1HRXdEZ1lEVlIwUEFRSC9CQVFEQWdHR01BOEdBMVVkRXdFQi93UUYKTUFNQkFmOHdIUVlEVlIwT0JCWUVGTEUrdzJrRCtMOUhBZFNZSmhvSUF1OWpaQ3ZETUI4R0ExVWRJd1FZTUJhQQpGTEUrdzJrRCtMOUhBZFNZSmhvSUF1OWpaQ3ZETUEwR0NTcUdTSWIzRFFFQkJRVUFBNElCQVFBY0dnYVgzTmVjCm56eUlaZ1lJVnlIYklVZjRLbWVxdnhneWRrQVFWOEdLODNyWkVXV09OZnFlL0VXMW50bE1NVXU0a2VoRExJNnoKZU03YjQxTjVjZGJsSVpRQjJsV0htaVJrOW9wbXpONmNOODJvTkxGcG15UElubmdpSzNCRDQxVkhNV0VaNzFqRgpoUzlPTVBhZ01SWWp5T2ZpWlJZenk3OGFHNkE5K01wZWl6R0xZQWlKTFF3R1hGSzN4UGtLbU5FVlg1OFN2bncyCll6aTlSS1IvNUNZckNzU1hhUTNwak9MQUVGZTR5SFlTa1ZYeVNHbll2Q29DV3c5RTFDQXgyL1M2Y0NaZGtHQ2UKdkVzWENTKzB5eDVEYU1rSEo4SFNYUGZxSWJsb0VwdzhuTCtlL0lCY20yUE43RWVxSlNkbm9EZnpBSUo5Vk5lcAorT2t1RTZOMzZCOUsKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUNsYXNzIDIgUHJpbWFyeSBDQSBPPUNlcnRwbHVzCiMgU3ViamVjdDogQ049Q2xhc3MgMiBQcmltYXJ5IENBIE89Q2VydHBsdXMKIyBMYWJlbDogIkNlcnRwbHVzIENsYXNzIDIgUHJpbWFyeSBDQSIKIyBTZXJpYWw6IDE3Nzc3MDIwODA0NTkzNDA0MDI0MTQ2ODc2MDQ4ODMyNzU5NTA0MwojIE1ENSBGaW5nZXJwcmludDogODg6MmM6OGM6NTI6Yjg6YTI6M2M6ZjM6Zjc6YmI6MDM6ZWE6YWU6YWM6NDI6MGIKIyBTSEExIEZpbmdlcnByaW50OiA3NDoyMDo3NDo0MTo3Mjo5YzpkZDo5MjplYzo3OTozMTpkODoyMzoxMDo4ZDpjMjo4MTo5MjplMjpiYgojIFNIQTI1NiBGaW5nZXJwcmludDogMGY6OTk6M2M6OGE6ZWY6OTc6YmE6YWY6NTY6ODc6MTQ6MGU6ZDU6OWE6ZDE6ODI6MWI6YjQ6YWY6YWM6ZjA6YWE6OWE6NTg6YjU6ZDU6N2E6MzM6OGE6M2E6ZmI6Y2IKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURrakNDQW5xZ0F3SUJBZ0lSQUlXOVMvUFkydU5wOXBUWFg4T2xSQ013RFFZSktvWklodmNOQVFFRkJRQXcKUFRFTE1Ba0dBMVVFQmhNQ1JsSXhFVEFQQmdOVkJBb1RDRU5sY25Sd2JIVnpNUnN3R1FZRFZRUURFeEpEYkdGegpjeUF5SUZCeWFXMWhjbmtnUTBFd0hoY05PVGt3TnpBM01UY3dOVEF3V2hjTk1Ua3dOekEyTWpNMU9UVTVXakE5Ck1Rc3dDUVlEVlFRR0V3SkdVakVSTUE4R0ExVUVDaE1JUTJWeWRIQnNkWE14R3pBWkJnTlZCQU1URWtOc1lYTnoKSURJZ1VISnBiV0Z5ZVNCRFFUQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU54UQpsdEFTK0RYU0NIaDZ0bEp3L1cvdXo3a1J5MTEzNGV6cGZnU04xc3h2YzBOWFlLd3pDa1RzQTE4Y2dDU1I1YWlSClZoS0M5K0FyOU51dVlTNkpFSTFyYkxxekFyM1ZOc1ZJTnlQaThGbzNVak1YRXVMUllFMitMMEVSNC9ZWEpReUwKa2NBYm1YdVpWZzJ2N3RLOFIxZmplVWw3TklrbkpJVGVzZXpwV0U3K1R0OWF2a0d0ckFqRkdBN3YwbFB1Yk5DZApFZ0VUamR5QVl2ZVZxVVNJU25GT1lGV2UyeU1aZVZZSEREOWpDMXl3NHI1K0ZmeVVNMWhCT0hURTRZK0wzeWFzCkg3V0xPN2REV1d1d0pLWnRrSXZFY3VwZE01aTN5OTVlZSsrVThScyt5c2tod2NXWUFxcWk5bHQzbS9WK2xsVTAKSEdkcHdQRkM0MGVzL0NnY1psVUNBd0VBQWFPQmpEQ0JpVEFQQmdOVkhSTUVDREFHQVFIL0FnRUtNQXNHQTFVZApEd1FFQXdJQkJqQWRCZ05WSFE0RUZnUVU0M010MzhzT0tBemUzYk9reW5tNGpydm9NSWt3RVFZSllJWklBWWI0ClFnRUJCQVFEQWdFR01EY0dBMVVkSHdRd01DNHdMS0Fxb0NpR0ptaDBkSEE2THk5M2QzY3VZMlZ5ZEhCc2RYTXUKWTI5dEwwTlNUQzlqYkdGemN6SXVZM0pzTUEwR0NTcUdTSWIzRFFFQkJRVUFBNElCQVFDblZNK0lSQm5MMzlSLwpBTjlXTTJLMTkxRUJrT3ZEUDlHSVJPa2tYZS9uRkwwZ3Q1bzhBUDV0bjl1UTNOZjBZdGFMY0YzbjVRUklxV2g4CnlmRkM4MngveFhwOEhWR0l1dElLUGlkZDNpMVJUdE1UWkdua0x1UFQ1NXNKbWFiZ2xadk9HdGQvdmp6T1VyTVIKRmNFUEY4MER1NXdsRmJxaWRvbjhCdkVZMEpOTERueUN0NlgwOWwvKzdVQ21uWVIwT2JuY0hvVVcyaWtiaGlNQQp5YnVKZm02QWlCNHZGTFFESktneWJ3T2FSeXd3dmxiR3AwSUNjQnZxUU5pNkJRTndCNlNXLy8xSU13cmgzS1dCCmtKdE4zWDNuNTdMTlhNaHFsZmlsOW8zRVhYZ0l2bnNHMWtuUEdUWlFJeTRJNXA0RlRVY1kxUmJwc2RhMkVOVzcKbDcraWpyUlUKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPURTVCBSb290IENBIFgzIE89RGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uCiMgU3ViamVjdDogQ049RFNUIFJvb3QgQ0EgWDMgTz1EaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4KIyBMYWJlbDogIkRTVCBSb290IENBIFgzIgojIFNlcmlhbDogOTEyOTk3MzU1NzUzMzk5NTMzMzU5MTkyNjY5NjU4MDM3NzgxNTUKIyBNRDUgRmluZ2VycHJpbnQ6IDQxOjAzOjUyOmRjOjBmOmY3OjUwOjFiOjE2OmYwOjAyOjhlOmJhOjZmOjQ1OmM1CiMgU0hBMSBGaW5nZXJwcmludDogZGE6Yzk6MDI6NGY6NTQ6ZDg6ZjY6ZGY6OTQ6OTM6NWY6YjE6NzM6MjY6Mzg6Y2E6NmE6ZDc6N2M6MTMKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDA2Ojg3OjI2OjAzOjMxOmE3OjI0OjAzOmQ5OjA5OmYxOjA1OmU2OjliOmNmOjBkOjMyOmUxOmJkOjI0OjkzOmZmOmM2OmQ5OjIwOjZkOjExOmJjOmQ2Ojc3OjA3OjM5Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEU2pDQ0FqS2dBd0lCQWdJUVJLK3dnTmFqSjdxSk1EbUdMdmhBYXpBTkJna3Foa2lHOXcwQkFRVUZBREEvCk1TUXdJZ1lEVlFRS0V4dEVhV2RwZEdGc0lGTnBaMjVoZEhWeVpTQlVjblZ6ZENCRGJ5NHhGekFWQmdOVkJBTVQKRGtSVFZDQlNiMjkwSUVOQklGZ3pNQjRYRFRBd01Ea3pNREl4TVRJeE9Wb1hEVEl4TURrek1ERTBNREV4TlZvdwpQekVrTUNJR0ExVUVDaE1iUkdsbmFYUmhiQ0JUYVdkdVlYUjFjbVVnVkhKMWMzUWdRMjh1TVJjd0ZRWURWUVFECkV3NUVVMVFnVW05dmRDQkRRU0JZTXpDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUIKQU4rdjZaZFFDSU5YdE14aVpmYVFndXpIMHl4ck1NcGI3Tm5EZmNkQXdSZ1VpK0RvTTNaSkt1TS9JVW1UckU0TwpyejVJeTJYdS9OTWhEMlhTS3RreWo0emw5M2V3RW51MWxjQ0pvNm02N1hNdWVnd0dNb09pZm9vVU1NMFJvT0VxCk9MbDVDakg5VUwyQVpkKzNVV09EeU9LSVllcExZWUhzVW11NW91SkxHaWlmU0tPZUROb0pqajRYTGg3ZElOOWIKeGlxS3F5NjljSzNGQ3hvbGtIUnl4WHRxcXpUV01Jbi81V2dUZTFRTHlOYXU3RnFja2g0OVpMT014dCsveVVGdwo3Qlp5MVNic09GVTVROUQ4L1JoY1FQR1g2OVdhbTQwZHV0b2x1Y2JZMzhFVkFqcXIybTd4UGk3MVhBaWNQTmFECmFlUVFteGtxdGlsWDQrVTltNS93QWwwQ0F3RUFBYU5DTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlYKSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPQkJZRUZNU25zYVI3TEhINjIrRkxrSFgveEJWZ2hZa1FNQTBHQ1NxRwpTSWIzRFFFQkJRVUFBNElCQVFDakdpeWJGd0JjcVI3dUtHWTNPcitEeHo5THd3bWdsU0JkNDlsWlJOSStEVDY5CmlrdWdkQi9PRUlLY2RCb2RmcGdhM2NzVFM3TWdST1NSNmN6OGZhWGJhdVgrNXYzZ1R0MjNBRHExY0Vtdjh1WHIKQXZIUkFvc1p5NVE2WGtqRUdCNVlHVjhlQWxyd0RQR3hyYW5jV1lhTGJ1bVI5WWJLK3JsbU02cFpXODdpcHhaegpSOHNyekptd04walA0MVpMOWM4UERISXloOGJ3Ukx0VGNtMUQ5U1pJbWxKbnQxaXIvbWQyY1hqYkRhSldGQk01CkpER0ZvcWdDV2pCSDRkMVFCN3dDQ1pBQTYyUmpZSnNXdklqSkV1YlNmWkdMK1QweWpXVzA2WHl4VjNicXhiWW8KT2I4VlpSekk5bmVXYWdxTmR3dllrUXNFamdmYktiWUs3cDJDTlRVUQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U3dpc3NTaWduIEdvbGQgQ0EgLSBHMiBPPVN3aXNzU2lnbiBBRwojIFN1YmplY3Q6IENOPVN3aXNzU2lnbiBHb2xkIENBIC0gRzIgTz1Td2lzc1NpZ24gQUcKIyBMYWJlbDogIlN3aXNzU2lnbiBHb2xkIENBIC0gRzIiCiMgU2VyaWFsOiAxMzQ5MjgxNTU2MTgwNjk5MTI4MAojIE1ENSBGaW5nZXJwcmludDogMjQ6Nzc6ZDk6YTg6OTE6ZDE6M2I6ZmE6ODg6MmQ6YzI6ZmY6Zjg6Y2Q6MzM6OTMKIyBTSEExIEZpbmdlcnByaW50OiBkODpjNTozODo4YTpiNzozMDoxYjoxYjo2ZTpkNDo3YTplNjo0NToyNTozYTo2Zjo5ZjoxYToyNzo2MQojIFNIQTI1NiBGaW5nZXJwcmludDogNjI6ZGQ6MGI6ZTk6Yjk6ZjU6MGE6MTY6M2U6YTA6Zjg6ZTc6NWM6MDU6M2I6MWU6Y2E6NTc6ZWE6NTU6Yzg6Njg6OGY6NjQ6N2M6Njg6ODE6ZjI6Yzg6MzU6N2I6OTUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZ1akNDQTZLZ0F3SUJBZ0lKQUx0QUhFUDFYayt3TUEwR0NTcUdTSWIzRFFFQkJRVUFNRVV4Q3pBSkJnTlYKQkFZVEFrTklNUlV3RXdZRFZRUUtFd3hUZDJsemMxTnBaMjRnUVVjeEh6QWRCZ05WQkFNVEZsTjNhWE56VTJsbgpiaUJIYjJ4a0lFTkJJQzBnUnpJd0hoY05NRFl4TURJMU1EZ3pNRE0xV2hjTk16WXhNREkxTURnek1ETTFXakJGCk1Rc3dDUVlEVlFRR0V3SkRTREVWTUJNR0ExVUVDaE1NVTNkcGMzTlRhV2R1SUVGSE1SOHdIUVlEVlFRREV4WlQKZDJsemMxTnBaMjRnUjI5c1pDQkRRU0F0SUVjeU1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBTUlJQwpDZ0tDQWdFQXIrVHVmb3NrRGhKdXFWQXRGa1E3a3BKY3lyaGRoSkpDRXlxOFpWZUNRRDVYSk0xUWl5VXF0Mi84Cjc2TFF3QjhDSkVvVGxvOGpFK1lvV0FDalI4Y0dwNFFqSzd1OWxpdC9WY3lMd1ZjZkRtSmxEOTA5Vm9wejJxNSsKYmJxQkhINUNqQ0ExMlVOTmhQcUUyMUlzOHc0bmR3dHJ2eEV2Y25pZkx0Zys1aGczV2lweStkcGlrSktWeWgrYwo2Yk04Szh2ekFSTy9Xcy9CdFFwZ3ZkMjFtV1JUdUtDV3MyL2lKbmVSak9CaUVBS2ZOQStrMVpJelVkNitqYnFFCmVtQThhdHVmSyt6ZTNnRS9iazNsVUliTHRLL3RSRURGeWxxTTJ0SXJmS2p1dnFibENxb09wZDhGVXJkVnh5SmQKTW1xWGwyTVQyOG5iZVRaN2hUcEt4VktKK1NUbm5YZXBndjlWSEtWeGFTdlJBaVR5c3liVWE5b0VWZVhCQ3NkdApNRGVRS3VTZUZETmVGaGRWeFZ1MXl6U0prdkdkSm8raEI5VEdzbmhRMnd3TUMzd0xqRUhYdWVuZGpJajNvMDJ5Ck1zellGOXJOdDg1bW5kVDlYdis5bHo0cGRlZCtwMkpZcnlVMHBVSEhQYndOVU1vREF3OElXaCtWYzNoaXY2OXkKRkdrT3BlVUREbmlPSmloQzhBY0xZaUFRWnpsRytxa0R6QVE0ZW1idklJTzFqRXBXanBFQS9JNWNndDZJb01QaQphRzU5amU4ODNXWDBYYXhSN3lTQXJxcFdsMi81clgzYVlUK1lkenlsa2JZY2pDYmFaYUlKYmNIaVZPTzV5a3hNCmdJOTNlMkNhSHQrMjhrZ2VEcnBPVkcyWTRPR2lHcUozVU0vRVk1THNSeG1kNitacnpzRUNBd0VBQWFPQnJEQ0IKcVRBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVV3lWNwpscVJsVVg2NE9mUEFlR1plNkRybjhPNHdId1lEVlIwakJCZ3dGb0FVV3lWN2xxUmxVWDY0T2ZQQWVHWmU2RHJuCjhPNHdSZ1lEVlIwZ0JEOHdQVEE3QmdsZ2hYUUJXUUVDQVFFd0xqQXNCZ2dyQmdFRkJRY0NBUllnYUhSMGNEb3YKTDNKbGNHOXphWFJ2Y25rdWMzZHBjM056YVdkdUxtTnZiUzh3RFFZSktvWklodmNOQVFFRkJRQURnZ0lCQUNlNgo0NVI4OGE3QTNoZm01ZGpWOVZTd2cvUzd6VjRGZTArZmRXYXZQT2hXZnZ4eWVEZ0QyU3RpR3dDNStPbGd6Y3pPClVZckhVREZ1NFVwK0dDOXBXYlk5WklFcjQ0T0U1aUtIam4zZzdnS1pZYmdlOUxncmlCSVdoTUl4a3ppV01hYTUKTzFNL3d5U1RWbHRwa3V6RndiczRBT1BzRjZtNDNNZDhBWU9mTWtlNlVpSTBIVEo2Q1ZhbmZDVTJxVDFMMnNDQwpid3E3RXNpSFN5Y1IrUjR0eDVNL250dGZKbXRTMlM2SzhSVEdSSTBWcWJlL3ZkNm1HdTZ1TGZ0SWR4Zit1K3l2CkdQVXFVZkE1aEplVmJHNGJ3eXZFZEdCNUpiQUtKOS9mWHRJNXowVjlRa3Zmc3l3ZXhjWmR5bFU2b0p4cG1vL2EKNzdLd1BKK0hiQklyWlhBVlVqRWFKTTl2TVNOUUg0eFBqeVBEZEVGakhGV29GTjArNEZGUXovRWJNRllPa3JDQwpoZGlEeXlKa3ZDMjRKZFZVb3JnRzZxMlNwQ1Nnd1lhMVNoTnFSODh1QzFhVlZNdk9tdHRxdEtheTIwRUloaWQzCjkycWdRbXdMT003WGRWQXlrc0xmS3pBaVNORFZRVGdsWGFUcFhaL0dsSFhRUmYwd2wwT1BrS3NLeDRaellFcHAKTGQ2bGVOY0cybXFlU3o1M09pQVRJZ0hRdjJpZVkyQnJOVTBMYmJxaFBjQ1Q0SDhqczFXdGNpVk9Sdm5TRnUrdwpaTUVCbnVuS29HcVlEcy9ZWVBJdlNiamtRdUU0TlJiMHlHNVA5NEZXNkxxanZpT3ZydjF2QStBQ096QjIraHR0ClFjOEJzZW00eVdiMDJ5YnpPcVIwOGtra1c4bXcwRmZCK2o1NjRaZkoKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVN3aXNzU2lnbiBTaWx2ZXIgQ0EgLSBHMiBPPVN3aXNzU2lnbiBBRwojIFN1YmplY3Q6IENOPVN3aXNzU2lnbiBTaWx2ZXIgQ0EgLSBHMiBPPVN3aXNzU2lnbiBBRwojIExhYmVsOiAiU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyIgojIFNlcmlhbDogNTcwMDM4MzA1MzExNzU5OTU2MwojIE1ENSBGaW5nZXJwcmludDogZTA6MDY6YTE6Yzk6N2Q6Y2Y6Yzk6ZmM6MGQ6YzA6NTY6NzU6OTY6ZDg6NjI6MTMKIyBTSEExIEZpbmdlcnByaW50OiA5YjphYTplNTo5Zjo1NjplZToyMTpjYjo0Mzo1YTpiZToyNTo5MzpkZjphNzpmMDo0MDpkMToxZDpjYgojIFNIQTI1NiBGaW5nZXJwcmludDogYmU6NmM6NGQ6YTI6YmI6Yjk6YmE6NTk6YjY6ZjM6OTM6OTc6Njg6Mzc6NDI6NDY6YzM6YzA6MDU6OTk6M2Y6YTk6OGY6MDI6MGQ6MWQ6ZWQ6YmU6ZDQ6OGE6ODE6ZDUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZ2VENDQTZXZ0F3SUJBZ0lJVHh2VUwxUzdMMHN3RFFZSktvWklodmNOQVFFRkJRQXdSekVMTUFrR0ExVUUKQmhNQ1EwZ3hGVEFUQmdOVkJBb1RERk4zYVhOelUybG5iaUJCUnpFaE1COEdBMVVFQXhNWVUzZHBjM05UYVdkdQpJRk5wYkhabGNpQkRRU0F0SUVjeU1CNFhEVEEyTVRBeU5UQTRNekkwTmxvWERUTTJNVEF5TlRBNE16STBObG93ClJ6RUxNQWtHQTFVRUJoTUNRMGd4RlRBVEJnTlZCQW9UREZOM2FYTnpVMmxuYmlCQlJ6RWhNQjhHQTFVRUF4TVkKVTNkcGMzTlRhV2R1SUZOcGJIWmxjaUJEUVNBdElFY3lNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQWc4QQpNSUlDQ2dLQ0FnRUF4UEdIZjlONE1mYzR5ZmpEbVVPOHgvZThOK2RPY2JwTGo2VnpIVnh1bUs0RFY2NDROME12CkZ6MGZ5TTVvRU1GNHJoa0RLeEQ2TEhtRDl1aTVhTGxWOGdSRXB6bjUvQVNMSHZHaVRTZjVZWHU2dCtXaUU3YnIKWVQ3UWJOSG0rL3BlN1IyMG5xQTFXNkdTeS9CSmt2NkZDZ1UrNXRrTDRrKzczSlUzL0pIcE1qVWkwUjg2VGllRgpuYkFWbERMYVlRMUhUV0JDcnBKSDZJTmFVRmpwaW91NVhhSGMzWmxLSHpabnUwamtnN1kzNjBnNnJ3OW5qeGNICjZBVEs3Mm94aDlUQXR2bVVjWHRuWkxpMmtVcENlMlV1TUdvTTlaRHVsZWJ5ellMczJhRks3UGF5UytWRmhlWnQKZUpNRUxweUNiVGFweERGa0g0YURDeXIwTlFwNHlWWFBRYkJINlRDZm1iNWhxQWFFdVNoNlh6alpHNms0c0lOLwpjOEhETzBncWdnOGhtN2pNcURYRGhCdURzejYrcEpWcEFUcUpBSGdFMmNuMG1SbXJWbjViaTRZNUZaR2tFQ3dKCk1vQmdzNVBBS3JZWUM1MStqVW55RUVwLytkVkdMeG1TbzVtbkpxeTdqRHptRHJ4SEI5eHpVZkZ3WkM4SStiUkgKSFRCc1JPb3BONFdTYUdhOGd6aitlemt1MDFEd0gvdGVZTGFwcHZvblFmR2JHSEx5OVlSMFNzbG54RlN1U0dUZgpqTkZ1c0IzaEI0OElIcG1jY2VsTTJLWDNSeElmZE5GUm5vYnp3cUlqUUF0ejIwdW01M01Hak1HZzZjRlpyRWI2CjVpLzR6M0djUm0yNXhCV05PSGtEUlVqdnhGM1hDTzZIT1NLR3NnMFBXRVAzY2FsSUx2M3ExaDhDQXdFQUFhT0IKckRDQnFUQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVQpGNkROd2VSQnRqcGJPOHRGbmIwY3dwajZobGd3SHdZRFZSMGpCQmd3Rm9BVUY2RE53ZVJCdGpwYk84dEZuYjBjCndwajZobGd3UmdZRFZSMGdCRDh3UFRBN0JnbGdoWFFCV1FFREFRRXdMakFzQmdnckJnRUZCUWNDQVJZZ2FIUjAKY0RvdkwzSmxjRzl6YVhSdmNua3VjM2RwYzNOemFXZHVMbU52YlM4d0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dJQgpBSFBHZ2VBbjBpMFA0SlV3NHBwQmYxQXNYMTlpWWFtR2Fta1lESFJKMWwyRTZrRlNHRzlZclZCV0lHckd2U2hwCldKSGNrUkUxcVRvZHZCcWxZSjdZSDM5RmtXblpmcnQ0Y3NFR0R5ck9qNFZ3WWF5Z3pRdTRPU2xXaERKT2hyczkKeENyWjF4OXk3djVSb1NKQnNYRUNZeHFDc0dLclhsY1NIOS9MM1hXZ3dGMTVrSXdiNEZEbTNqSCttSHR3WDZXUQoySzM0QXJadjAyRGRRRXNpeFQydE9ucWZHaHBIa1hrenVvTGNNbWtEbG00ZlMvQngvdU5uY3FDeHYxeUw1UHFaCklzZUV1UnVOSTVjLzdTWGd6Mlc3OVdFRTc5MGVzbHBCSWxxaG4xMHM2RnZKYmFrTURIaXFZTVpXandGYURHaTgKYVJsNXhCOStsd1cveGVra1VWN1UxVXRUN2RraldqWURaYVBCQTYxQk1QTkdHNFdRcjJXMTFiSGtGbHQ0ZFIyWAplbTFacVNxUGU5N0RoNGtRbVVsemVNZzl2VkUxZENyVjhYNXBHeXE3TzcwbHVKcGFQWEpoa0dhSDdneldUZFFSCmRBdHEvZ3NEL0tOVlY0bitTc3V1V3hjRnlQS05JekZUT05JdGFqK0N1WTBJYXZkZVFYUnV3eEYrQjZ3cFlKRS8KT01wWEVBMjlNQy9IcGVaQm9OcXVCWWVhb0tSbGJFd0pESW02dU5PNXdKT0tNUHFONVpwckZRRk9aNnJhWWxZKwpoQWhtMHNRMmZhYytFUHlJNE5TQTVRQzlxdk5PQnFONmF2bGljdU1KVCt1YkRnRWo4Wis3Zk56Y2JCR1hKYkx5CnRHTVUwZ1lxWjR5RDljN3FCOWlhYWg3czVBcTdLa3pyQ1dBNXpzcGkyQzV1Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1HZW9UcnVzdCBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89R2VvVHJ1c3QgSW5jLgojIFN1YmplY3Q6IENOPUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1HZW9UcnVzdCBJbmMuCiMgTGFiZWw6ICJHZW9UcnVzdCBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IgojIFNlcmlhbDogMzI3OTgyMjY1NTEyNTY5NjMzMjQzMTM4MDY0MzY5ODE5ODIzNjkKIyBNRDUgRmluZ2VycHJpbnQ6IDAyOjI2OmMzOjAxOjVlOjA4OjMwOjM3OjQzOmE5OmQwOjdkOmNmOjM3OmU2OmJmCiMgU0hBMSBGaW5nZXJwcmludDogMzI6M2M6MTE6OGU6MWI6Zjc6Yjg6YjY6NTI6NTQ6ZTI6ZTI6MTA6MGQ6ZDY6MDI6OTA6Mzc6ZjA6OTYKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDM3OmQ1OjEwOjA2OmM1OjEyOmVhOmFiOjYyOjY0OjIxOmYxOmVjOjhjOjkyOjAxOjNmOmM1OmY4OjJhOmU5OjhlOmU1OjMzOmViOjQ2OjE5OmI4OmRlOmI0OmQwOjZjCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEZkRDQ0FtU2dBd0lCQWdJUUdLeTFhdjFwdGhVNlkyeXYydnJFb1RBTkJna3Foa2lHOXcwQkFRVUZBREJZCk1Rc3dDUVlEVlFRR0V3SlZVekVXTUJRR0ExVUVDaE1OUjJWdlZISjFjM1FnU1c1akxqRXhNQzhHQTFVRUF4TW8KUjJWdlZISjFjM1FnVUhKcGJXRnllU0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQWVGdzB3TmpFeApNamN3TURBd01EQmFGdzB6TmpBM01UWXlNelU1TlRsYU1GZ3hDekFKQmdOVkJBWVRBbFZUTVJZd0ZBWURWUVFLCkV3MUhaVzlVY25WemRDQkpibU11TVRFd0x3WURWUVFERXloSFpXOVVjblZ6ZENCUWNtbHRZWEo1SUVObGNuUnAKWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQwpBUUVBdnJnVmUvL1VmSDFucllOa2U4aENVeTNmOW9RSUlHSFdBVmxxbkVRUnIrOTIvWlYrem1Fd3UzcURYd0s5CkFXYks3aFdOYjZFd25MMmhoWjZVT3ZOV2lBQXh6OWp1YXBZQzJlMERqUHQxYmVmcXVGVVdCUmFhOU9CZXNZakEKWklWY0ZVMkl4N2U2NEhYcHJRVTluY2VKU09DN0tNZ0Q0VENUWkY1U3dGbHdJalZYaUlyeGxRcUQxN3d4Y3dFMAo3ZTlHY2VCckFxZzFjbXVYbTJiZ3l4eDVYOWdhQkdnZVJ3TG1uV0RpTnBjQjM4NDFrdCsrWjhkdGQxazdqNTNXCmtCV1V2RUkwRU1FNStiRW5QbjdXaW5YRnNxK1cwNkxlbStTWXZuM2g2WUd0dG0vODF3N2E0RFN3RFJwMzUrTUkKbU85WStweUV0emF2d3QrczB2UVFCbkJ4TlFJREFRQUJvMEl3UURBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUE0RwpBMVVkRHdFQi93UUVBd0lCQmpBZEJnTlZIUTRFRmdRVUxOVlFRWmNWaS9DUE5tRmJTdnRyMlpuSk01SXdEUVlKCktvWklodmNOQVFFRkJRQURnZ0VCQUZwd2Z5emR0elJQOVlaUnFTYStTN2lxOFhFTjNHSEhvT28wSG5wM0R3UTEKNkNlUGJKQy9rUllrUmo1S1RzNHJGdFVMVWgzOEgyZWlBa1V4VDg3eitnT25lWjFUYXRuYVl6cjRnTmZUbWVHbAo0YjdVVlhHWU5UcStrK3F1clVLeWtHL2cvQ0ZOTldNemlVbldtMDdLeCtkT0NRRDMyc2Z2bVdLWmQ3YVZJbDZLCm9LdjB1SGlZeWpnWm1jbHlubmpOUzZ5dkdhQnpFaTM4d2tHNmdaSGFGbG94dC9tMGNZQVNTSmx5YzFwWlU4RmoKVWpQdHA4blNPUUp3K3VDeFFtWXBxcHRSN1RCVUloUmYyYXNkd2VTVThQajFLL2ZxeW5oRzFyaVIvYVlOS3hvVQpBVDZBOEVLZ2xRZGViYzNNUzZSRmphc1M2TFBlV3VXZ2ZPZ1BJaDFhNlZrPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049dGhhd3RlIFByaW1hcnkgUm9vdCBDQSBPPXRoYXd0ZSwgSW5jLiBPVT1DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uLyhjKSAyMDA2IHRoYXd0ZSwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgU3ViamVjdDogQ049dGhhd3RlIFByaW1hcnkgUm9vdCBDQSBPPXRoYXd0ZSwgSW5jLiBPVT1DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uLyhjKSAyMDA2IHRoYXd0ZSwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgTGFiZWw6ICJ0aGF3dGUgUHJpbWFyeSBSb290IENBIgojIFNlcmlhbDogNjk1MjkxODE5OTIwMzkyMDM1NjYyOTg5NTM3ODc3MTI5NDA5MDkKIyBNRDUgRmluZ2VycHJpbnQ6IDhjOmNhOmRjOjBiOjIyOmNlOmY1OmJlOjcyOmFjOjQxOjFhOjExOmE4OmQ4OjEyCiMgU0hBMSBGaW5nZXJwcmludDogOTE6YzY6ZDY6ZWU6M2U6OGE6Yzg6NjM6ODQ6ZTU6NDg6YzI6OTk6Mjk6NWM6NzU6NmM6ODE6N2I6ODEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDhkOjcyOjJmOjgxOmE5OmMxOjEzOmMwOjc5OjFkOmYxOjM2OmEyOjk2OjZkOmIyOjZjOjk1OjBhOjk3OjFkOmI0OjZiOjQxOjk5OmY0OmVhOjU0OmI3OjhiOmZiOjlmCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFSURDQ0F3aWdBd0lCQWdJUU5FN1ZWeURWN2V4SjlDL09OOXNyYlRBTkJna3Foa2lHOXcwQkFRVUZBRENCCnFURUxNQWtHQTFVRUJoTUNWVk14RlRBVEJnTlZCQW9UREhSb1lYZDBaU3dnU1c1akxqRW9NQ1lHQTFVRUN4TWYKUTJWeWRHbG1hV05oZEdsdmJpQlRaWEoyYVdObGN5QkVhWFpwYzJsdmJqRTRNRFlHQTFVRUN4TXZLR01wSURJdwpNRFlnZEdoaGQzUmxMQ0JKYm1NdUlDMGdSbTl5SUdGMWRHaHZjbWw2WldRZ2RYTmxJRzl1YkhreEh6QWRCZ05WCkJBTVRGblJvWVhkMFpTQlFjbWx0WVhKNUlGSnZiM1FnUTBFd0hoY05NRFl4TVRFM01EQXdNREF3V2hjTk16WXcKTnpFMk1qTTFPVFU1V2pDQnFURUxNQWtHQTFVRUJoTUNWVk14RlRBVEJnTlZCQW9UREhSb1lYZDBaU3dnU1c1agpMakVvTUNZR0ExVUVDeE1mUTJWeWRHbG1hV05oZEdsdmJpQlRaWEoyYVdObGN5QkVhWFpwYzJsdmJqRTRNRFlHCkExVUVDeE12S0dNcElESXdNRFlnZEdoaGQzUmxMQ0JKYm1NdUlDMGdSbTl5SUdGMWRHaHZjbWw2WldRZ2RYTmwKSUc5dWJIa3hIekFkQmdOVkJBTVRGblJvWVhkMFpTQlFjbWx0WVhKNUlGSnZiM1FnUTBFd2dnRWlNQTBHQ1NxRwpTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDc29QRDdnRm5Vbk1la3o1MmhXWE1KRUVVTURTeHVhUEZzClcwaG9TVmszL0FzekdjSjNmOHdRTFpVMEhPYnJUUW1uSE5LNHlaYzJBcmVKMUNSZkJzRE1SSlNValFKaWIrdGEKM1JHTktKcGNoSkFRZWcyOWRHWXZhamlnNHRWVVJPc2RCNThIdW0vdTZmMU9DeW4xUG9TZ0FmR2NxL2djZm9tawo2S0hZY1dVTm8xRjc3cnpTSW1BTnVWdWQzN3I4VVZzTHI1aXk2UzdwQk9oaWg5NHJ5TmRPd1V4a0h0M1BoMWk2ClNrL0thQWNkSEoxS3h0VXZrY3g4Y1hJY3hjQm42ekw5eVpKY2xOcUZ3SnUvVTMwckNmU01uWkVmbDJwU3k5NEoKTnFSMzJIdUhVRVRWUG00cGFmczVTU1llQ2FXQWUwQXQ2K2duaGNuK1lmMSs1bnlYSGRXZEFnTUJBQUdqUWpCQQpNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01CMEdBMVVkRGdRV0JCUjdXMFhQCnI4N0xldjB4a2hwcXR2Tkc2MWRJVURBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQWVSSEFTN09SdHZ6dzZXZlUKRFc1RnZsWG9rOUxPQXovdDJpV3dIVmZMSGpwMm9FenNVSGJvWkhJTXBLbnh1SXZXMW9lRXV6TGxRUkhBZDltegpZSjNyRzlYUmJrUkVxYVlCN0ZWaUhYZTRYSTVJU1h5Y08xY1JySzF6TjQ0dmVGeVFhRWZaWUdEbS9BYzlJaUFYCnhQY1c2Y1RZY3ZuSWMzemZGaThWcVQ3OWFpZTJvZXRhdXBnZjFlTk5aQXFkRThoaHV2VTVISWU2dUwxN0luLzIKL3F4QWVlV3NFRzg5anh0NWRvdkVON01oR0lUbE5nRHJZeUNadWVuK013UzdRY2pCQXZsRVl5Q2VnYzVDMDlZLwpMSGJUWTV4WjNZK200UTZnTGtIM0xwVkh6N3o5TS9QMkMyRitmcEVyZ1VmQ0p6RHVweEJkTjQ5Y09TdmtCUEI3CmpWYU1hQT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1WZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUgTz1WZXJpU2lnbiwgSW5jLiBPVT1WZXJpU2lnbiBUcnVzdCBOZXR3b3JrLyhjKSAyMDA2IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBTdWJqZWN0OiBDTj1WZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUgTz1WZXJpU2lnbiwgSW5jLiBPVT1WZXJpU2lnbiBUcnVzdCBOZXR3b3JrLyhjKSAyMDA2IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBMYWJlbDogIlZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHNSIKIyBTZXJpYWw6IDMzMDM3NjQ0MTY3NTY4MDU4OTcwMTY0NzE5NDc1Njc2MTAxNDUwCiMgTUQ1IEZpbmdlcnByaW50OiBjYjoxNzplNDozMTo2NzozZTplMjowOTpmZTo0NTo1Nzo5MzpmMzowYTpmYToxYwojIFNIQTEgRmluZ2VycHJpbnQ6IDRlOmI2OmQ1Ojc4OjQ5OjliOjFjOmNmOjVmOjU4OjFlOmFkOjU2OmJlOjNkOjliOjY3OjQ0OmE1OmU1CiMgU0hBMjU2IEZpbmdlcnByaW50OiA5YTpjZjphYjo3ZTo0MzpjODpkODo4MDpkMDo2YjoyNjoyYTo5NDpkZTplZTplNDpiNDo2NTo5OTo4OTpjMzpkMDpjYTpmMTo5YjphZjo2NDowNTplNDoxYTpiNzpkZgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRTB6Q0NBN3VnQXdJQkFnSVFHTnJSbmlaOTZMdEtJVmpOekdzN1NqQU5CZ2txaGtpRzl3MEJBUVVGQURDQgp5akVMTUFrR0ExVUVCaE1DVlZNeEZ6QVZCZ05WQkFvVERsWmxjbWxUYVdkdUxDQkpibU11TVI4d0hRWURWUVFMCkV4WldaWEpwVTJsbmJpQlVjblZ6ZENCT1pYUjNiM0pyTVRvd09BWURWUVFMRXpFb1l5a2dNakF3TmlCV1pYSnAKVTJsbmJpd2dTVzVqTGlBdElFWnZjaUJoZFhSb2IzSnBlbVZrSUhWelpTQnZibXg1TVVVd1F3WURWUVFERXp4VwpaWEpwVTJsbmJpQkRiR0Z6Y3lBeklGQjFZbXhwWXlCUWNtbHRZWEo1SUVObGNuUnBabWxqWVhScGIyNGdRWFYwCmFHOXlhWFI1SUMwZ1J6VXdIaGNOTURZeE1UQTRNREF3TURBd1doY05Nell3TnpFMk1qTTFPVFU1V2pDQnlqRUwKTUFrR0ExVUVCaE1DVlZNeEZ6QVZCZ05WQkFvVERsWmxjbWxUYVdkdUxDQkpibU11TVI4d0hRWURWUVFMRXhaVwpaWEpwVTJsbmJpQlVjblZ6ZENCT1pYUjNiM0pyTVRvd09BWURWUVFMRXpFb1l5a2dNakF3TmlCV1pYSnBVMmxuCmJpd2dTVzVqTGlBdElFWnZjaUJoZFhSb2IzSnBlbVZrSUhWelpTQnZibXg1TVVVd1F3WURWUVFERXp4V1pYSnAKVTJsbmJpQkRiR0Z6Y3lBeklGQjFZbXhwWXlCUWNtbHRZWEo1SUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eQphWFI1SUMwZ1J6VXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDdkpBZ0lLWG8xCm5tQU1xdWRMTzA3Y2ZMdzhSUnk3SytEK0tRTDVWd2lqWklVVkovWHhyY2d4aVYwaTZDcXFwa0t6ai9pNVZiZXgKdDB1ei9vOStCMWZzNzBQYlptSVZZYzlnRGFUWTN2amd3MklJUFZRVDYwbktXVlNGSnVVcmp4dWY2L1doa2NJegpTZGhEWTJwU1M5S1A2SEJSVGRHSmFYdkhjUGF6M0JKMDIzdGRTMWJUbHI4VmQ2R3c5S0lsOHE4Y2ttY1k1ZlFHCkJPK1F1ZVFBNU4wNnRSbi9BcnIwUE83Z2krczNpK3owMTZ6eTl2QTlyOTExa1RNWkhSeEF5M1FrR1NHVDJSVCsKckNwU3g0L1ZCRW5raldOSGlEeHBnOHYrUjcwcmZrL0ZsYTRPbmRUUlE4Qm5jK01VQ0g3bFA1OXp1RE1LejEwLwpOSWVXaXU1VDZDVVZBZ01CQUFHamdiSXdnYTh3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFCkJBTUNBUVl3YlFZSUt3WUJCUVVIQVF3RVlUQmZvVjJnV3pCWk1GY3dWUllKYVcxaFoyVXZaMmxtTUNFd0h6QUgKQmdVckRnTUNHZ1FVaitYVEdvYXNqWTVydzgrQWF0UklHQ3g3R1M0d0pSWWphSFIwY0RvdkwyeHZaMjh1ZG1WeQphWE5wWjI0dVkyOXRMM1p6Ykc5bmJ5NW5hV1l3SFFZRFZSME9CQllFRkgvVFphZkMzZXk3OERBSjgwTTUrZ0t2Ck16RXpNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUNUSkVvd1gyTFAyQnFZTHozcTNKa3R2WGYycFhraU9PekUKcDZCNEVxMWlEa1Z3Wk1YbmwyWXRtQWwrWDYvV3pDaGw4Z0dxQ0JwSDN2bjVmSkphQ0drZ0RkaytiVzQ4RFc3WQo1Z2FSUUJpNStNSHQzOXRCcXVDV0lNbk5aQlU0Z2NtVTdxS0VLUXNUYjQ3YkROMGxBdHVraXhsRTBrRjZCV2xLCldFOWd5bjZDYWdzQ3FpVVhPYlhiZitlRVpTcVZpcjJHM2w2QkZvTXRFTXplL2FpQ0ttMG9IdzBMeE9YbkdpWVoKNGZRUmJ4QzFsZnpuUWdVeTI4NmRVVjRvdHA2RjAxdnZwWDFGUUhLT3R3NXJEZ2I3TXpWSWNiaWRKNHZFWlY4TgpobmFjUkhyMmxWejJYVElJTTZSVXRoZy9hRnp5UWtxRk9GU0RYOUhvTFBLc0VkYW83V05xCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1TZWN1cmVUcnVzdCBDQSBPPVNlY3VyZVRydXN0IENvcnBvcmF0aW9uCiMgU3ViamVjdDogQ049U2VjdXJlVHJ1c3QgQ0EgTz1TZWN1cmVUcnVzdCBDb3Jwb3JhdGlvbgojIExhYmVsOiAiU2VjdXJlVHJ1c3QgQ0EiCiMgU2VyaWFsOiAxNzE5OTc3NDU4OTEyNTI3Nzc4ODM2Mjc1NzAxNDI2Njg2MjAzMgojIE1ENSBGaW5nZXJwcmludDogZGM6MzI6YzM6YTc6NmQ6MjU6NTc6Yzc6Njg6MDk6OWQ6ZWE6MmQ6YTk6YTI6ZDEKIyBTSEExIEZpbmdlcnByaW50OiA4Nzo4MjpjNjpjMzowNDozNTozYjpjZjpkMjo5Njo5MjpkMjo1OTozZTo3ZDo0NDpkOTozNDpmZjoxMQojIFNIQTI1NiBGaW5nZXJwcmludDogZjE6YzE6YjU6MGE6ZTU6YTI6MGQ6ZDg6MDM6MGU6Yzk6ZjY6YmM6MjQ6ODI6M2Q6ZDM6Njc6YjU6MjU6NTc6NTk6YjQ6ZTc6MWI6NjE6ZmM6ZTk6Zjc6Mzc6NWQ6NzMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR1RENDQXFDZ0F3SUJBZ0lRRFBDT1hBZ1dwYTFDZi9Eckp4aFowREFOQmdrcWhraUc5dzBCQVFVRkFEQkkKTVFzd0NRWURWUVFHRXdKVlV6RWdNQjRHQTFVRUNoTVhVMlZqZFhKbFZISjFjM1FnUTI5eWNHOXlZWFJwYjI0eApGekFWQmdOVkJBTVREbE5sWTNWeVpWUnlkWE4wSUVOQk1CNFhEVEEyTVRFd056RTVNekV4T0ZvWERUSTVNVEl6Ck1URTVOREExTlZvd1NERUxNQWtHQTFVRUJoTUNWVk14SURBZUJnTlZCQW9URjFObFkzVnlaVlJ5ZFhOMElFTnYKY25CdmNtRjBhVzl1TVJjd0ZRWURWUVFERXc1VFpXTjFjbVZVY25WemRDQkRRVENDQVNJd0RRWUpLb1pJaHZjTgpBUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBS3VrZ2VXVnpmWDJGSTdDVDhyVTRuaVZXSnhCNFEyWlFDUVhPWkV6Clp1bSs0WU92WWx5SjBmd2tXMkd6NEJFUlFSd2RidkM0dS9qZXA0RzZwa2pHbngyOXZvNnBRVDY0bE8wcEd0U08KMGdNZEErOXREV2NjVjljR3Jjckk5ZjRPcjJZbFNBU1dDMTJqdWhiRENFL1JSdmdVWFBMSVhnR1piZjJJeklhbwp3Vzh4UW14U1Btakw4eGswMzd1SEdGYUFKc1RRM01CdjM5Nmd3cEVXb0dRUlMwUzhIdmJuK21QZVpxeDJwSEdqCjdEYVVhSHAzcExIbkRpK0JldUsxY29idm9tdUw4QS9iMDFrL3VuSzhSQ1NjNDNPejk2OVhMMEltbmFsMHVnQlMKOGt2TlUzeEhDemFGRG1hcENKY1dORmZCWnZlQTQrMXdWTWVUNEM0b0ZWbUh1cnNDQXdFQUFhT0JuVENCbWpBVApCZ2tyQmdFRUFZSTNGQUlFQmg0RUFFTUFRVEFMQmdOVkhROEVCQU1DQVlZd0R3WURWUjBUQVFIL0JBVXdBd0VCCi96QWRCZ05WSFE0RUZnUVVRaksyRnZvRS9mNWRTM3JEL2ZkTVFCMWFRNjh3TkFZRFZSMGZCQzB3S3pBcG9DZWcKSllZamFIUjBjRG92TDJOeWJDNXpaV04xY21WMGNuVnpkQzVqYjIwdlUxUkRRUzVqY213d0VBWUpLd1lCQkFHQwpOeFVCQkFNQ0FRQXdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBRER0VDByaFdEcFNjbHUxcHFObEdLYTdVVHQzCjZaM3EwNTljNEVWbGV3M0tXK0p3VUxLVUJSU3VTY2VOUVFjU2M1UitEQ01oL2J3UWYyQVFXbkwxbUE2czdMbC8KM1hwdlhkTWM5UCtJQldsQ3FRVnh5TGVzSnVndXRJeHEvM0hjdUxIZm1ieDhJVlFyNUZpaXUxY3BycDZwb3hrbQpENWt1Q0xEdi9XblBtUm9KamVPbm55dkpOalI3SkxONFRKVVhwQVltSHJaa1VqWmZZR2Zabk1VRmRBdm5aeVBTCkNQeUk2YTZMZitFdzlEZCsvY1l5MmkyZVJEQXdiTzRIM3RJMC9OTC9RUFpMOUdaR0JsU204aklLWXlZd2E1dlIKM0l0SHV1RzUxV0xRb3FEMFp3VjRLV01hYndUVytNWk1vNXF4TjdTTjVTaExIWjRzd3Job3ZPMEM3akU9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1TZWN1cmUgR2xvYmFsIENBIE89U2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24KIyBTdWJqZWN0OiBDTj1TZWN1cmUgR2xvYmFsIENBIE89U2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24KIyBMYWJlbDogIlNlY3VyZSBHbG9iYWwgQ0EiCiMgU2VyaWFsOiA5NzUxODM2MTY3NzMxMDUxNTU0MjMyMTE5NDgxNDU2OTc4NTk3CiMgTUQ1IEZpbmdlcnByaW50OiBjZjpmNDoyNzowZDpkNDplZDpkYzo2NToxNjo0OTo2ZDozZDpkYTpiZjo2ZTpkZQojIFNIQTEgRmluZ2VycHJpbnQ6IDNhOjQ0OjczOjVhOmU1OjgxOjkwOjFmOjI0Ojg2OjYxOjQ2OjFlOjNiOjljOmM0OjVmOmY1OjNhOjFiCiMgU0hBMjU2IEZpbmdlcnByaW50OiA0MjowMDpmNTowNDozYTpjODo1OTowZTpiYjo1Mjo3ZDoyMDo5ZTpkMTo1MDozMDoyOTpmYjpjYjpkNDoxYzphMTpiNTowNjplYzoyNzpmMTo1YTpkZTo3ZDphYzo2OQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHZEQ0NBcVNnQXdJQkFnSVFCMVlpcE9qVWlvbE45QlBJOFBqcXBUQU5CZ2txaGtpRzl3MEJBUVVGQURCSwpNUXN3Q1FZRFZRUUdFd0pWVXpFZ01CNEdBMVVFQ2hNWFUyVmpkWEpsVkhKMWMzUWdRMjl5Y0c5eVlYUnBiMjR4CkdUQVhCZ05WQkFNVEVGTmxZM1Z5WlNCSGJHOWlZV3dnUTBFd0hoY05NRFl4TVRBM01UazBNakk0V2hjTk1qa3gKTWpNeE1UazFNakEyV2pCS01Rc3dDUVlEVlFRR0V3SlZVekVnTUI0R0ExVUVDaE1YVTJWamRYSmxWSEoxYzNRZwpRMjl5Y0c5eVlYUnBiMjR4R1RBWEJnTlZCQU1URUZObFkzVnlaU0JIYkc5aVlXd2dRMEV3Z2dFaU1BMEdDU3FHClNJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUN2TlM3WXJHeFZhUVp4NVJOb0pMTlAyTXdoUi9qeFlEaUoKaVFQcHZlcGVSbE1KM0Z6MVd1ajNSU29DNnpGaDF5a3pUTTdIZkFvM2ZnKzZNcGpoSFpldmo4ZmN5VGlXODlzYQovRkh0YU1iUWJxUjhKTkd1UXNpV1VHTXU0UDUxL3Bpblgwa3VsZU01TTJTT0hxUmZrTkpuUExMWi9rRzVWYWNKCmpuSUZIb3ZkUklXQ1F0Qkp3QjFnOE5FWExKWHI5cVhCa3FQRndxY0lZQTFnQkJDV2VaNFdOT2FwdHZvbFJUbkkKSG1YNWsvV3E4VkxjbVpnOXBZWWFERFV6K2t1bEJBWVZIREdBNzZvWWE4SjcxOXJPK1RNZzFmVzlhak10Z1FUNwpzRnpVbktQaVhCM2pxVUoxWG52VWQrODVWTHJKQ2hnYkVwbEpMNGhML1ZCaTBYUG5qM3BEQWdNQkFBR2pnWjB3Cmdab3dFd1lKS3dZQkJBR0NOeFFDQkFZZUJBQkRBRUV3Q3dZRFZSMFBCQVFEQWdHR01BOEdBMVVkRXdFQi93UUYKTUFNQkFmOHdIUVlEVlIwT0JCWUVGSzlFQk1KQmZraUQyMDQ1QXV6c2hIcm16c21rTURRR0ExVWRId1F0TUNzdwpLYUFub0NXR0kyaDBkSEE2THk5amNtd3VjMlZqZFhKbGRISjFjM1F1WTI5dEwxTkhRMEV1WTNKc01CQUdDU3NHCkFRUUJnamNWQVFRREFnRUFNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUJqR2doQWZhUmVVdzEzMkhxdUh3MEwKVVJZRDd4aDh5T092YWxpVEZHQ1Jzb1RjaUU2K09ZbzY4K2FDaVYwQk43T3JKS1FWRHBJMVdrcEVYazVYK25YTwpIMGpPWnZROFFDYVNtR3diN2lSR0RCZXpVcVhicFpHUnp6ZlRiK2NuQ0RwT0dSODZwMWhjRjg5NVA0dmtwOU1tCkk1MG1EMWhwL0VkK3N0Q05pNU8vS1U5RGFYUjJaMHZQQjR6bUF2ZTE0YlJEdFVzdEZKLzUzQ1lOdjZaSGRBYlkKaU5FNktUQ0V6dEk1Z0dJYnFNZFhTYnhxVlZGbkZVcStOUWZrMVhXWU4za3dGTnNwbld6RmFjeEhWYUl3OTh4YwpmOExEbUJ4clRoYUE2M3A0WlVXaUFCcXZEQTFWWkRSSXVKSzU4YlJRS2ZKUEl4L2FiS3dmUk9IZEkzaFJXOGNXCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1DT01PRE8gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1DT01PRE8gQ0EgTGltaXRlZAojIFN1YmplY3Q6IENOPUNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPUNPTU9ETyBDQSBMaW1pdGVkCiMgTGFiZWw6ICJDT01PRE8gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkiCiMgU2VyaWFsOiAxMDQzNTA1MTM2NDgyNDkyMzI5NDE5OTg1MDg5ODU4MzQ0NjQ1NzMKIyBNRDUgRmluZ2VycHJpbnQ6IDVjOjQ4OmRjOmY3OjQyOjcyOmVjOjU2Ojk0OjZkOjFjOmNjOjcxOjM1OjgwOjc1CiMgU0hBMSBGaW5nZXJwcmludDogNjY6MzE6YmY6OWU6Zjc6NGY6OWU6YjY6Yzk6ZDU6YTY6MGM6YmE6NmE6YmU6ZDE6Zjc6YmQ6ZWY6N2IKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDBjOjJjOmQ2OjNkOmY3OjgwOjZmOmEzOjk5OmVkOmU4OjA5OjExOjZiOjU3OjViOmY4Ojc5Ojg5OmYwOjY1OjE4OmY5OjgwOjhjOjg2OjA1OjAzOjE3OjhiOmFmOjY2Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFSFRDQ0F3V2dBd0lCQWdJUVRvRXRpb0psNEFzQzdqNDFBa2JsUFRBTkJna3Foa2lHOXcwQkFRVUZBRENCCmdURUxNQWtHQTFVRUJoTUNSMEl4R3pBWkJnTlZCQWdURWtkeVpXRjBaWElnVFdGdVkyaGxjM1JsY2pFUU1BNEcKQTFVRUJ4TUhVMkZzWm05eVpERWFNQmdHQTFVRUNoTVJRMDlOVDBSUElFTkJJRXhwYldsMFpXUXhKekFsQmdOVgpCQU1USGtOUFRVOUVUeUJEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQWVGdzB3TmpFeU1ERXdNREF3Ck1EQmFGdzB5T1RFeU16RXlNelU1TlRsYU1JR0JNUXN3Q1FZRFZRUUdFd0pIUWpFYk1Ca0dBMVVFQ0JNU1IzSmwKWVhSbGNpQk5ZVzVqYUdWemRHVnlNUkF3RGdZRFZRUUhFd2RUWVd4bWIzSmtNUm93R0FZRFZRUUtFeEZEVDAxUApSRThnUTBFZ1RHbHRhWFJsWkRFbk1DVUdBMVVFQXhNZVEwOU5UMFJQSUVObGNuUnBabWxqWVhScGIyNGdRWFYwCmFHOXlhWFI1TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUEwRUNMaTNMamtSdjMKVWNFYlZBU1kwNm0vd2VhS1hUdUgrN3VJemczakx6OEdsdkNpS1ZDWnJ0czdvVmV3ZEZGeHplMUNrVTFCL3FuSQoyR3FHZDBTN1dXYVhVRjYwMUN4d1JNL2FONVZDYVR3d3hIR3pVdkFoVGFIWXVqbDhISjZqSkozeWd4YVlxaFo4ClE1c1ZXN2V1TkpIKzFHSW1HRWFhUCt2QitmR1FWK3VzZWcyTDIzSXdhbWJWNEVhamNOeG8yZjhFU0lsMzNyWHAKKzJkdFFlbThPYjB5MldJQzhiR29QVzQzbk9JdjR0T2lKb3ZHdUZWRGlPRWpQcVhTSkRscVI2c0ExS0d6cVNYKwpEVCtuSGJyVFVjRUxwTnFzT085VlVDUUZaVWFUTkU4dGphM0cxQ0VaMG83S0JXRnhCM05INVlvWkVyMEVUYzVPCm5LVklyTHNtOXdJREFRQUJvNEdPTUlHTE1CMEdBMVVkRGdRV0JCUUxXT1dMeGt3Vk42UkFxVENwSWI1SE5scFcKL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekJKQmdOVkhSOEVRakJBTUQ2ZwpQS0E2aGpob2RIUndPaTh2WTNKc0xtTnZiVzlrYjJOaExtTnZiUzlEVDAxUFJFOURaWEowYVdacFkyRjBhVzl1ClFYVjBhRzl5YVhSNUxtTnliREFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBUHBpZW0vWWI2ZGM1dDNpdUhYSVkKU2RPSDVFT0M2ei9KcXZXb3RlOVZmQ0ZTWmZuVkRlRnM5RDZNazNPUkxnTEVUZ2R4YjhDUE9HRUlxQjZCQ3NBdgpJQzlCaTVIY1NFVzg4Y2JldW5ack04Z0FMVEZHVE8zbm5jK0lsUDh6d0Zib0pJWW11Tmc0T044cWE5MFN6TWMvClJ4ZE1vc0lHbGduVzIvNC9QRVpCMzFqaVZnODhPOEVja3pYWk9GS3M3c2pzTGpCT2xEVzBKQjlMZUduYThnSTQKekpWU2svQndKVm1jSUdmRTd2bUxWMkgwa25aOVA0U05WYmZvNWF6VjhmVVpWcVphKzVBY3I1UHI1UnpVWjVkZApCQTYrQzRPbUY0TzVNQktneFRNVkJia04rOGNGZHVQWVNvMzhOQmVqeGlFb3ZqQkZNUjdIZUw1WVlUaXNPK0lCClpRPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPU5ldHdvcmsgU29sdXRpb25zIENlcnRpZmljYXRlIEF1dGhvcml0eSBPPU5ldHdvcmsgU29sdXRpb25zIEwuTC5DLgojIFN1YmplY3Q6IENOPU5ldHdvcmsgU29sdXRpb25zIENlcnRpZmljYXRlIEF1dGhvcml0eSBPPU5ldHdvcmsgU29sdXRpb25zIEwuTC5DLgojIExhYmVsOiAiTmV0d29yayBTb2x1dGlvbnMgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IgojIFNlcmlhbDogMTE2Njk3OTE1MTUyOTM3NDk3NDkwNDM3NTU2Mzg2ODEyNDg3OTA0CiMgTUQ1IEZpbmdlcnByaW50OiBkMzpmMzphNjoxNjpjMDpmYTo2YjoxZDo1OTpiMToyZDo5Njo0ZDowZToxMToyZQojIFNIQTEgRmluZ2VycHJpbnQ6IDc0OmY4OmEzOmMzOmVmOmU3OmIzOjkwOjA2OjRiOjgzOjkwOjNjOjIxOjY0OjYwOjIwOmU1OmRmOmNlCiMgU0hBMjU2IEZpbmdlcnByaW50OiAxNTpmMDpiYTowMDphMzphYzo3YTpmMzphYzo4ODo0YzowNzoyYjoxMDoxMTphMDo3NzpiZDo3NzpjMDo5NzpmNDowMTo2NDpiMjpmODo1OTo4YTpiZDo4Mzo4NjowYwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRDVqQ0NBczZnQXdJQkFnSVFWOHN6YjhKY0Z1WkhGaGZqa0RGbzREQU5CZ2txaGtpRzl3MEJBUVVGQURCaQpNUXN3Q1FZRFZRUUdFd0pWVXpFaE1COEdBMVVFQ2hNWVRtVjBkMjl5YXlCVGIyeDFkR2x2Ym5NZ1RDNU1Ma011Ck1UQXdMZ1lEVlFRREV5ZE9aWFIzYjNKcklGTnZiSFYwYVc5dWN5QkRaWEowYVdacFkyRjBaU0JCZFhSb2IzSnAKZEhrd0hoY05NRFl4TWpBeE1EQXdNREF3V2hjTk1qa3hNak14TWpNMU9UVTVXakJpTVFzd0NRWURWUVFHRXdKVgpVekVoTUI4R0ExVUVDaE1ZVG1WMGQyOXlheUJUYjJ4MWRHbHZibk1nVEM1TUxrTXVNVEF3TGdZRFZRUURFeWRPClpYUjNiM0pySUZOdmJIVjBhVzl1Y3lCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcGRIa3dnZ0VpTUEwR0NTcUcKU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRGt2SDZTTUczRzJJNHJDN3hHenVBbmx0N2UrZm9TMHp3egpjN01FTDd4eGpPV2Z0aUpnUGw5ZHpnbi9nZ3dibWxGUUdpYUozZFZoWFJuY0VnOHRDcUpEWFJmUU5KSWc2blBQCk9Dd0dKZ2w2Y3ZmNlVETDR3cFBUYWFJanprR3h6T1RWSHpiUmlqcjRqR1BpRkZscDdRM1RmMnZvdUFQbFQycmwKbUdOcFNBVytMdjh6dHVtWFdXbjRaeG11azJHV1JCWFRjckEvdkdwOTdFaC9qY09ycW5FclUybEJVelMxc0xuRgpCZ3JFc0VYMVFWMXVpVVY3UFRzbWpIVEM1ZExSZmJJUjFQdFlNaUthZ01uYy9RenBmMTREbDg0N0FCU0hKM0E0CnFZNXVzeWQybUZIZ0JlTWhxeHJWaFNJOEtiV2FGc1dBcVBTN2F6Q1BMMFlDb3JFTUl1RFRBZ01CQUFHamdaY3cKZ1pRd0hRWURWUjBPQkJZRUZDRXd5ZnNBMTA2WTJvZXFLdENuTHJGQU1hZE1NQTRHQTFVZER3RUIvd1FFQXdJQgpCakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NRklHQTFVZEh3UkxNRWt3UjZCRm9FT0dRV2gwZEhBNkx5OWpjbXd1CmJtVjBjMjlzYzNOc0xtTnZiUzlPWlhSM2IzSnJVMjlzZFhScGIyNXpRMlZ5ZEdsbWFXTmhkR1ZCZFhSb2IzSnAKZEhrdVkzSnNNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUM3cmt2bnQxZnJmNm90dDNOSGhXckI1S1VkNU9jOAo2ZlJaWlhlMWVsdGFqU1UyNEhxWExqakFWMkNEbUFhRG43bDJlbTVRNExxSUxQeEZ6Qml3bVpWUkR1d2R1SWovCmgxQWNnc0xqNERLQXY2QUxSOGpETWUrWlp6S0FUeGNoZVF4cFhONWVOSzRDdFNicVVOOS9HR1VzeWZKajRha0gKL254eEgyc3pKR29lQmZjRmFNQnFFc3N1WG1ITHJpalRmc0swWnBFbVh6d3VKRi9MV0EvcktPeXZFWmJ6M0h0dgp3S2VJOGxOM3MyQmVycTRvMmpVc2J6UkYweWJoM3V4YlR5ZHJGbnk5UkFRWWdyT0plUmNRY1QxNm9oWk85UUhOCnBHeGxhS0ZKZGx4RHlkaThObWRzcFpTMTFNeTV2V28xVmlIZTJNUHIrOHVrWUV5d1ZhQ2dlMWV5Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1DT01PRE8gRUNDIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89Q09NT0RPIENBIExpbWl0ZWQKIyBTdWJqZWN0OiBDTj1DT01PRE8gRUNDIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89Q09NT0RPIENBIExpbWl0ZWQKIyBMYWJlbDogIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkiCiMgU2VyaWFsOiA0MTU3ODI4Mzg2NzA4NjY5MjYzODI1NjkyMTU4OTcwNzkzODA5MAojIE1ENSBGaW5nZXJwcmludDogN2M6NjI6ZmY6NzQ6OWQ6MzE6NTM6NWU6Njg6NGE6ZDU6Nzg6YWE6MWU6YmY6MjMKIyBTSEExIEZpbmdlcnByaW50OiA5Zjo3NDo0ZTo5ZjoyYjo0ZDpiYTplYzowZjozMToyYzo1MDpiNjo1NjozYjo4ZToyZDo5MzpjMzoxMQojIFNIQTI1NiBGaW5nZXJwcmludDogMTc6OTM6OTI6N2E6MDY6MTQ6NTQ6OTc6ODk6YWQ6Y2U6MmY6OGY6MzQ6Zjc6ZjA6YjY6NmQ6MGY6M2E6ZTM6YTM6Yjg6NGQ6MjE6ZWM6MTU6ZGI6YmE6NGY6YWQ6YzcKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNpVENDQWcrZ0F3SUJBZ0lRSDBldnFtSUFjRkJVVEFHZW0yT1pLakFLQmdncWhrak9QUVFEQXpDQmhURUwKTUFrR0ExVUVCaE1DUjBJeEd6QVpCZ05WQkFnVEVrZHlaV0YwWlhJZ1RXRnVZMmhsYzNSbGNqRVFNQTRHQTFVRQpCeE1IVTJGc1ptOXlaREVhTUJnR0ExVUVDaE1SUTA5TlQwUlBJRU5CSUV4cGJXbDBaV1F4S3pBcEJnTlZCQU1UCklrTlBUVTlFVHlCRlEwTWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrd0hoY05NRGd3TXpBMk1EQXcKTURBd1doY05Nemd3TVRFNE1qTTFPVFU1V2pDQmhURUxNQWtHQTFVRUJoTUNSMEl4R3pBWkJnTlZCQWdURWtkeQpaV0YwWlhJZ1RXRnVZMmhsYzNSbGNqRVFNQTRHQTFVRUJ4TUhVMkZzWm05eVpERWFNQmdHQTFVRUNoTVJRMDlOClQwUlBJRU5CSUV4cGJXbDBaV1F4S3pBcEJnTlZCQU1USWtOUFRVOUVUeUJGUTBNZ1EyVnlkR2xtYVdOaGRHbHYKYmlCQmRYUm9iM0pwZEhrd2RqQVFCZ2NxaGtqT1BRSUJCZ1VyZ1FRQUlnTmlBQVFEUjNzdmRjbUNGWVg3ZGVTUgpGdFNyWXBuMVBsSUxCczVCQUgrWDRRb2tQQjBCQk80OTBvMEpsd3pnZGVUNiszZUtLdlVEWUVzMml4WWpGcTBKCmNmUks5Q2hRdFA2SUhHNC9iQzh2Q1ZsYnBWc0xNNW5pd3oySitXb3M3N0xUQnVtalFqQkFNQjBHQTFVZERnUVcKQkJSMWNhY1pTQm04blozcVFVZmZsTVJJZDVuVGVUQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFILwpCQVV3QXdFQi96QUtCZ2dxaGtqT1BRUURBd05vQURCbEFqRUE3d05iZXF5M2VBcHl0NGpmLzdWR0ZBa0srcURtCmZRakdHb2U5R0toenZTYktZQXlkenBtZnoxd1BNT0crRkRIcUFqQVU5Sk04U2FjemVwQkdSN05qZlJPYlRyZHYKR0RlQVUvN2RJT0ExbWpiUnh3RzU1dHpkOC84ZExEb1dWOW1TT2RZPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049T0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQSBPPVdJU2VLZXkgT1U9Q29weXJpZ2h0IChjKSAyMDA1L09JU1RFIEZvdW5kYXRpb24gRW5kb3JzZWQKIyBTdWJqZWN0OiBDTj1PSVNURSBXSVNlS2V5IEdsb2JhbCBSb290IEdBIENBIE89V0lTZUtleSBPVT1Db3B5cmlnaHQgKGMpIDIwMDUvT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZAojIExhYmVsOiAiT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQSIKIyBTZXJpYWw6IDg2NzE4ODc3ODcxMTMzMTU5MDkwMDgwNTU1OTExODIzNTQ4MzE0CiMgTUQ1IEZpbmdlcnByaW50OiBiYzo2Yzo1MTozMzphNzplOTpkMzo2Njo2Mzo1NDoxNTo3MjoxYjoyMTo5Mjo5MwojIFNIQTEgRmluZ2VycHJpbnQ6IDU5OjIyOmExOmUxOjVhOmVhOjE2OjM1OjIxOmY4Ojk4OjM5OjZhOjQ2OjQ2OmIwOjQ0OjFiOjBmOmE5CiMgU0hBMjU2IEZpbmdlcnByaW50OiA0MTpjOToyMzo4Njo2YTpiNDpjYTpkNjpiNzphZDo1Nzo4MDo4MTo1ODoyZTowMjowNzo5NzphNjpjYjpkZjo0ZjpmZjo3ODpjZTo4Mzo5NjpiMzo4OTozNzpkNzpmNQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRDhUQ0NBdG1nQXdJQkFnSVFRVDF5eC9Sckg0RkRmZkhTS0ZUZm1qQU5CZ2txaGtpRzl3MEJBUVVGQURDQgppakVMTUFrR0ExVUVCaE1DUTBneEVEQU9CZ05WQkFvVEIxZEpVMlZMWlhreEd6QVpCZ05WQkFzVEVrTnZjSGx5CmFXZG9kQ0FvWXlrZ01qQXdOVEVpTUNBR0ExVUVDeE1aVDBsVFZFVWdSbTkxYm1SaGRHbHZiaUJGYm1SdmNuTmwKWkRFb01DWUdBMVVFQXhNZlQwbFRWRVVnVjBsVFpVdGxlU0JIYkc5aVlXd2dVbTl2ZENCSFFTQkRRVEFlRncwdwpOVEV5TVRFeE5qQXpORFJhRncwek56RXlNVEV4TmpBNU5URmFNSUdLTVFzd0NRWURWUVFHRXdKRFNERVFNQTRHCkExVUVDaE1IVjBsVFpVdGxlVEViTUJrR0ExVUVDeE1TUTI5d2VYSnBaMmgwSUNoaktTQXlNREExTVNJd0lBWUQKVlFRTEV4bFBTVk5VUlNCR2IzVnVaR0YwYVc5dUlFVnVaRzl5YzJWa01TZ3dKZ1lEVlFRREV4OVBTVk5VUlNCWApTVk5sUzJWNUlFZHNiMkpoYkNCU2IyOTBJRWRCSUVOQk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBCk1JSUJDZ0tDQVFFQXkwK3pBSnM5TnQzNTBVbHFheEJKSCt6WUs3TEcrREtCS1VPVlRKb1pJeUVWUmQ3anlCeFIKVlZ1dWsrZzMveXRyNmRUcXZpcmRxRkVyMTJiRFlWeGdBc2oxem5KN083anlUbVVJbXMya2FobkJBYnR6cHRmMgp3OTNOdktTTHRabGh1QUdpbzlSTjFBVTlrYTM0dEFoeFpLOXc4UnhyZnZiRGQ1MGtjM3ZrREl6aDJUYmhtWXNGCm1RdnRSVEVKeXNJQTIvZHlvSmFxbFlmUWpzZTJZWE1OZG1hTTNCdTBZNktmZjVNVE1QR2hKOXZaL3l4VmlKR2cKNEU4SHNDaFdqQmdibDBTT2lkM2dGMjduS3UrUE9Rb3hoSUxZUUJSSkxucEI1S2YrNDJUTXdWbHhTeXdocDF0OQo0QjNSTG9HYnc5aG85NzJXRzZ4d3NSWVVDOXRndVNZQkJRSURBUUFCbzFFd1R6QUxCZ05WSFE4RUJBTUNBWVl3CkR3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVXN3TityamE4c0huUjNKUW10aEcrSWJKcGhwUXcKRUFZSkt3WUJCQUdDTnhVQkJBTUNBUUF3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUV1aC93dUhiclA1d1VPeApTUE1vd0IwdXlRbEIrcFFBSEtTa3EwbFBqejBlNzAxdnZieWs5dkltTU1rUXloMkkrM1FaSDRWRnZiQnNVZmsyCmZ0djFUREk2UVU5YlI4L29DeTIyeEJtZGRNVkh4anRxRDZ3VTJ6ejBjNXlwQmQ4QTNIUjQrdmcxWUZrQ0V4aDgKdlB0TnNDQnRRN3RnTUhwbk0xekZtZEg0TFRsU2MvdU1xcGNsWEhMWkNCNnJUanpqZ1RHZkE2Yjd3UDRwaUZYYQpoTlZRQTdiaWhLT21OcW9ST2dIaEdFdldSR2l6UGZsVGRJU3pScEZHbGdDM2dDeTI0ZU1RNHR1aTV5aVBBWlppCkZqNEE0eHlsTm9FWW9reFNkc0FSbzI3bUhicmpXcjQyVThVK2RZK0dhU2xZVTdXY3UyK2ZYTVVZN04wdjRaakoKL0w3ZkNnMD0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUNlcnRpZ25hIE89RGhpbXlvdGlzCiMgU3ViamVjdDogQ049Q2VydGlnbmEgTz1EaGlteW90aXMKIyBMYWJlbDogIkNlcnRpZ25hIgojIFNlcmlhbDogMTgzNjQ4MDI5NzQyMDkzNjIxNzUKIyBNRDUgRmluZ2VycHJpbnQ6IGFiOjU3OmE2OjViOjdkOjQyOjgyOjE5OmI1OmQ4OjU4OjI2OjI4OjVlOmZkOmZmCiMgU0hBMSBGaW5nZXJwcmludDogYjE6MmU6MTM6NjM6NDU6ODY6YTQ6NmY6MWE6YjI6NjA6Njg6Mzc6NTg6MmQ6YzQ6YWM6ZmQ6OTQ6OTcKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGUzOmI2OmEyOmRiOjJlOmQ3OmNlOjQ4Ojg0OjJmOjdhOmM1OjMyOjQxOmM3OmI3OjFkOjU0OjE0OjRiOmZiOjQwOmMxOjFmOjNmOjFkOjBiOjQyOmY1OmVlOmExOjJkCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEcURDQ0FwQ2dBd0lCQWdJSkFQN2M0d0VQeVVqL01BMEdDU3FHU0liM0RRRUJCUVVBTURReEN6QUpCZ05WCkJBWVRBa1pTTVJJd0VBWURWUVFLREFsRWFHbHRlVzkwYVhNeEVUQVBCZ05WQkFNTUNFTmxjblJwWjI1aE1CNFgKRFRBM01EWXlPVEUxTVRNd05Wb1hEVEkzTURZeU9URTFNVE13TlZvd05ERUxNQWtHQTFVRUJoTUNSbEl4RWpBUQpCZ05WQkFvTUNVUm9hVzE1YjNScGN6RVJNQThHQTFVRUF3d0lRMlZ5ZEdsbmJtRXdnZ0VpTUEwR0NTcUdTSWIzCkRRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRElhUEhKMXRhek5IVW1naDdzdEw3cVhPRW03UkZIWWVHaWZCWjQKUUNIa1lKNWF5R1BoeExHV2t2OFliV2tqNFN0aTk5M2lOaStSQjdsSXp3N3NlYllzNXpSTGNBZ2xvenlIR3hueQpnUWNQT0pBWjB4SCtoclR5MFY0ZUhwYk5nR3pPT3pHVHR2S2cwS21WRW4ybG1zeHJ5SVJXaWpPcDV5SVZVeGJ3CnpCZnNWMS9wb2dxWUNkN2pYNXh2M0VqamhRc1ZXcWE2bjZ4STR3bXk5L1F5M2w0MHZoeDRYVUpiemc0aWowMlEKMTMweUdMTUxMR3Evamo4VUVZa2dEbmNVdFQyVUNJZjNKUjdWc21BQTdHOHFLQ1Z1S2o0WVl4Y2xQejVFSUJiMgpKc2dscmdWS3RPZGpMUE9NRmxOK1hQc1JHZ2pCUm1LZklyanh3bzFwM1BvNldBYmZBZ01CQUFHamdid3dnYmt3CkR3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVUd1MytRVG1RdENSWnZnSHlVdFZGOWxvNTNCRXcKWkFZRFZSMGpCRjB3VzRBVUd1MytRVG1RdENSWnZnSHlVdFZGOWxvNTNCR2hPS1EyTURReEN6QUpCZ05WQkFZVApBa1pTTVJJd0VBWURWUVFLREFsRWFHbHRlVzkwYVhNeEVUQVBCZ05WQkFNTUNFTmxjblJwWjI1aGdna0EvdHpqCkFRL0pTUDh3RGdZRFZSMFBBUUgvQkFRREFnRUdNQkVHQ1dDR1NBR0crRUlCQVFRRUF3SUFCekFOQmdrcWhraUcKOXcwQkFRVUZBQU9DQVFFQWhRTWVrbkgyUXEvaG8yR2U2L1BBRC9LbDFOcVY1dGErYURZOWZtNGZUSXJ2MFE4aApiVjZsVW1QT0V2anZLdHB2NnpmK0V3TEh5enMrSW12YVlTNS8xSEk5M1REaEhreEFHWXdQMTV6Umd6QjdtRm5jCmZjYTVEQ2xNb1RPaTYyYzZaWVRUbHVMdGRrVndqN1VyM3ZrajFrbHVQQlMxeHA4MUhsRFF3WTlxY0VRQ1lzdXUKSFdoQnA2cFg2Rk9xQjlJRzl0VVVCZ3VSQTNVc2JISzFZWldhRFl1NURlZjEzMVROM3ViWTFna0lsMlBsd1M2dwp0MFFtd0NiQXIxVXduanZWTmlvWkJQUmNIdi9QTExmLzBQMkhRQkhWRVNPN1NNQWhxYVFvTGYwVitMQk9LL1F3Cld5SDhFWkUwdmtIdmU1MlhkZitYbGNDV1dDL3F1MGJYdStUWkxnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPURldXRzY2hlIFRlbGVrb20gUm9vdCBDQSAyIE89RGV1dHNjaGUgVGVsZWtvbSBBRyBPVT1ULVRlbGVTZWMgVHJ1c3QgQ2VudGVyCiMgU3ViamVjdDogQ049RGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIgTz1EZXV0c2NoZSBUZWxla29tIEFHIE9VPVQtVGVsZVNlYyBUcnVzdCBDZW50ZXIKIyBMYWJlbDogIkRldXRzY2hlIFRlbGVrb20gUm9vdCBDQSAyIgojIFNlcmlhbDogMzgKIyBNRDUgRmluZ2VycHJpbnQ6IDc0OjAxOjRhOjkxOmIxOjA4OmM0OjU4OmNlOjQ3OmNkOmYwOmRkOjExOjUzOjA4CiMgU0hBMSBGaW5nZXJwcmludDogODU6YTQ6MDg6YzA6OWM6MTk6M2U6NWQ6NTE6NTg6N2Q6Y2Q6ZDY6MTM6MzA6ZmQ6OGM6ZGU6Mzc6YmYKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGI2OjE5OjFhOjUwOmQwOmMzOjk3OjdmOjdkOmE5OjliOmNkOmFhOmM4OjZhOjIyOjdkOmFlOmI5OjY3OjllOmM3OjBiOmEzOmIwOmM5OmQ5OjIyOjcxOmMxOjcwOmQzCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEbnpDQ0FvZWdBd0lCQWdJQkpqQU5CZ2txaGtpRzl3MEJBUVVGQURCeE1Rc3dDUVlEVlFRR0V3SkVSVEVjCk1Cb0dBMVVFQ2hNVFJHVjFkSE5qYUdVZ1ZHVnNaV3R2YlNCQlJ6RWZNQjBHQTFVRUN4TVdWQzFVWld4bFUyVmoKSUZSeWRYTjBJRU5sYm5SbGNqRWpNQ0VHQTFVRUF4TWFSR1YxZEhOamFHVWdWR1ZzWld0dmJTQlNiMjkwSUVOQgpJREl3SGhjTk9Ua3dOekE1TVRJeE1UQXdXaGNOTVRrd056QTVNak0xT1RBd1dqQnhNUXN3Q1FZRFZRUUdFd0pFClJURWNNQm9HQTFVRUNoTVRSR1YxZEhOamFHVWdWR1ZzWld0dmJTQkJSekVmTUIwR0ExVUVDeE1XVkMxVVpXeGwKVTJWaklGUnlkWE4wSUVObGJuUmxjakVqTUNFR0ExVUVBeE1hUkdWMWRITmphR1VnVkdWc1pXdHZiU0JTYjI5MApJRU5CSURJd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUNyQzZNMTRJc3BGTEVVCmhhODhFT1E1YnpWZFNxN2Q2bUdObFVuMGIyU2pHbUJtcEtsQUlvVFoxS1hsZUpNT2FBR3R1VTFjT3M3VHVLaEMKUU4vUG83cUNXV3FTRzZ3Y210b0lLeVVuK1dralIvSGc2eXg2bS9VVEF0QitOSHpDbmp3QVdhdjEyZ3oxTWp3cgpyRkRhMXNQZWc1VEtxQXlaTWc0SVNGWmJhdnZhNFZoWUFVbGZja0U4RlFZQmpsMnRxcmlUdE0yZTY2Zm9haTFTCk5OczY3MXgxVWRyYjh6SDU3bkdZTXNSVUZVUU0rWnRWN2EzZkdBaWdvNGFLU2U1VEJZOFpUTlhlV0htYjBtb2MKUXF2RjFhZlBhQStXNU9GaG1IWmh5SkY4MWo0QTRwRlFoK0dkQ3VhdGw5SWR4anA5eTd6YUF6VFZqbHNCOVdvSAp0eGEyYmtwL0FnTUJBQUdqUWpCQU1CMEdBMVVkRGdRV0JCUXh3M2tidXZWVDF4ZmdpWG90RjJ3S3N5dWRNekFQCkJnTlZIUk1FQ0RBR0FRSC9BZ0VGTUE0R0ExVWREd0VCL3dRRUF3SUJCakFOQmdrcWhraUc5dzBCQVFVRkFBT0MKQVFFQWxHUlpyVGxrNXluckUvNWF3NHNUVjhnRUpQQjBkOEJnNDJmNzZZbW1nNytXZ254dTFNTTk3NTZBYnJzcAp0Smg2c1R0VTZ6a1hSMzRhamd2OEh6RlpNUVN5emhmekxNZGlObFhpSXRpSlZiU1lTS3BrK3RZY050aEVlRnBhCkl6cFhsL1Y2TUUrdW4ycE1TeXVPb0FQalB1Q3AxTko3MHJPbzRuSThyWjcvZ0Zua20wVzA5anV3elRrWm1ETGwKNmlGaGtPUXhJWTQwc2Zjdk5VcUZFTnJuaWpjaHZsbGo0UEtGaURGVDFGUVVoWEI1OUM0R2R5ZDFMeCs0aXZuKwp4YnJZTnVTRDdPZGx0NzlqV3ZOR3I0R1VOOVJCak5ZajFoN1A5V2diUkdPaVdycW5OVm1oNVhBRm13NGpWNW1VCkNtMjZPV01vaHBMekdJVFkrOUhQQlZaa1Z3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUN5YmVydHJ1c3QgR2xvYmFsIFJvb3QgTz1DeWJlcnRydXN0LCBJbmMKIyBTdWJqZWN0OiBDTj1DeWJlcnRydXN0IEdsb2JhbCBSb290IE89Q3liZXJ0cnVzdCwgSW5jCiMgTGFiZWw6ICJDeWJlcnRydXN0IEdsb2JhbCBSb290IgojIFNlcmlhbDogNDgzNTcwMzI3ODQ1OTY4Mjg3NzQ4NDM2MAojIE1ENSBGaW5nZXJwcmludDogNzI6ZTQ6NGE6ODc6ZTM6Njk6NDA6ODA6Nzc6ZWE6YmM6ZTM6ZjQ6ZmY6ZjA6ZTEKIyBTSEExIEZpbmdlcnByaW50OiA1Zjo0MzplNTpiMTpiZjpmODo3ODo4YzphYzoxYzpjNzpjYTo0YTo5YTpjNjoyMjoyYjpjYzozNDpjNgojIFNIQTI1NiBGaW5nZXJwcmludDogOTY6MGE6ZGY6MDA6NjM6ZTk6NjM6NTY6NzU6MGM6Mjk6NjU6ZGQ6MGE6MDg6Njc6ZGE6MGI6OWM6YmQ6NmU6Nzc6NzE6NGE6ZWE6ZmI6MjM6NDk6YWI6Mzk6M2Q6YTMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURvVENDQW9tZ0F3SUJBZ0lMQkFBQUFBQUJENFdxTFVnd0RRWUpLb1pJaHZjTkFRRUZCUUF3T3pFWU1CWUcKQTFVRUNoTVBRM2xpWlhKMGNuVnpkQ3dnU1c1ak1SOHdIUVlEVlFRREV4WkRlV0psY25SeWRYTjBJRWRzYjJKaApiQ0JTYjI5ME1CNFhEVEEyTVRJeE5UQTRNREF3TUZvWERUSXhNVEl4TlRBNE1EQXdNRm93T3pFWU1CWUdBMVVFCkNoTVBRM2xpWlhKMGNuVnpkQ3dnU1c1ak1SOHdIUVlEVlFRREV4WkRlV0psY25SeWRYTjBJRWRzYjJKaGJDQlMKYjI5ME1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBK01pOHZSUlFaaFAvOE5ONQo3Q1B5dHhySGpvWHhFbk9tR2FvUTI1eWlaWFJhZHo1UmZWYjIzQ08yMU8xZldMRTNUZFZKRG03MWFvZlcwb3pTCko4YmkvemFmbUdXZ0UwN0dLbVNiMVpBU3p4UUc5RHZqMUNpKzZBNzRxMDVJbEcyT2xURVFYTzJpTGIzVk9tMnkKSEx0Z3dFWkxBZlZKcm41R2l0QjBqYUVNQXM3dS9PZVB1R3RtODM5RUFMOW1KUlFyM1JBd0hRZVdQMDMyYTdpUAp0M3NNcFRqcjNrZmIxVjA1L0lpbjg5Y3FkUEhvV3FJN24xQzZwb3hGTmNKUVpaWGNZNEx2M2I5M1RaeGl5V056CkZ0QXBEMG1wU1BDenFyZHN4YWN3T1VCZHJzVGlYU1pUOE00Y0l3aGhxSlFadWdSaVFPd2ZPSEIzRWdaeHB6QVkKWFNVbnBRSURBUUFCbzRHbE1JR2lNQTRHQTFVZER3RUIvd1FFQXdJQkJqQVBCZ05WSFJNQkFmOEVCVEFEQVFILwpNQjBHQTFVZERnUVdCQlMyQ0hzTmVzeXNJRXlHVmpKZXo2dHVoUzF3VnpBL0JnTlZIUjhFT0RBMk1EU2dNcUF3CmhpNW9kSFJ3T2k4dmQzZDNNaTV3ZFdKc2FXTXRkSEoxYzNRdVkyOXRMMk55YkM5amRDOWpkSEp2YjNRdVkzSnMKTUI4R0ExVWRJd1FZTUJhQUZMWUlldzE2ekt3Z1RJWldNbDdQcTI2RkxYQlhNQTBHQ1NxR1NJYjNEUUVCQlFVQQpBNElCQVFCVzd3b2pvRlJPbFpmSitJbmFSY0hVb3dBbDlCOFRxN2VqaFZocHdqQ3QyQldLTGVQSnpZRmErSE1qCldxZDhCZlA5SWpzTzBRYkUyelpNY3dTTzViQWk1TVh6THFYWkkrTzRUa29ncDI0Q0pKOGlZR2Q3aXgxeUNjVXgKWE9sNW40QkhQYTJoQ3djVVBVZi9BMmthREF0RTUyTWxwMyt5eWJoMmhPMGo5bjBIcTBWKzA5K3p2K21LdHMybwpvbWNyVXRXM1pmQTVUR09na1htVFVnOVUzWU83bjlHUHAxTnp3OHYvTU94OEJMallSQitUWDNFSklyZHVQdW9jCkEwNmRHaUJoKzRFMzdGNzhDa1dyMStjWFZkQ2c2bUNicHZiampGc3B3Z1pnRkowdGwweXBreFdkWWNRQlgwalcKV0wxV01SSk9FY2doNExNUmtXWGJ0S2FJT001VgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogTz1DaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLiBPVT1lUEtJIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBTdWJqZWN0OiBPPUNodW5naHdhIFRlbGVjb20gQ28uLCBMdGQuIE9VPWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIExhYmVsOiAiZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IgojIFNlcmlhbDogMjg5NTYwODg2ODI3MzUxODk2NTUwMzA1MjkwNTczNTI3NjA0NzcKIyBNRDUgRmluZ2VycHJpbnQ6IDFiOjJlOjAwOmNhOjI2OjA2OjkwOjNkOmFkOmZlOjZmOjE1OjY4OmQzOjZiOmIzCiMgU0hBMSBGaW5nZXJwcmludDogNjc6NjU6MGQ6ZjE6N2U6OGU6N2U6NWI6ODI6NDA6YTQ6ZjQ6NTY6NGI6Y2Y6ZTI6M2Q6Njk6YzY6ZjAKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGMwOmE2OmY0OmRjOjYzOmEyOjRiOmZkOmNmOjU0OmVmOjJhOjZhOjA4OjJhOjBhOjcyOmRlOjM1OjgwOjNlOjJmOmY1OmZmOjUyOjdhOmU1OmQ4OjcyOjA2OmRmOmQ1Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGc0RDQ0E1aWdBd0lCQWdJUUZjaTlaVWRjcjdpWEFGN2tCdEs4blRBTkJna3Foa2lHOXcwQkFRVUZBREJlCk1Rc3dDUVlEVlFRR0V3SlVWekVqTUNFR0ExVUVDZ3dhUTJoMWJtZG9kMkVnVkdWc1pXTnZiU0JEYnk0c0lFeDAKWkM0eEtqQW9CZ05WQkFzTUlXVlFTMGtnVW05dmRDQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRBZQpGdzB3TkRFeU1qQXdNak14TWpkYUZ3MHpOREV5TWpBd01qTXhNamRhTUY0eEN6QUpCZ05WQkFZVEFsUlhNU013CklRWURWUVFLREJwRGFIVnVaMmgzWVNCVVpXeGxZMjl0SUVOdkxpd2dUSFJrTGpFcU1DZ0dBMVVFQ3d3aFpWQkwKU1NCU2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1JSUNJakFOQmdrcWhraUc5dzBCQVFFRgpBQU9DQWc4QU1JSUNDZ0tDQWdFQTRTVVA3bzNiaUROMVo4MnRIMzA2VG0yZDB5OFU4Mk4weXdFaGFqZnFoRkFIClN5WmJDVU5zSVo1cXlOVUQ5V0Jwajh6d0l1UWY1L2RxSWpHM0xCWHk0UDRBYWtQL2gyWEd0UnJCcDB4dEluQWgKaWpIeWwzU0pDUkltSEo3SzJSS2lsVHphNldlL0NLQms0OVpDdDBYdmwvVDI5ZGUxU2hVQ1dIMllXRXRndk0zWApEWm9UTTFQUllmbDYxZGQ0czVvejl3Q0d6aDFObERpdnFPeDRVWENLWEJDRFVTSDNFVDAwaGw3bFNNMlhnWUkxClRCbnNaZlpyeFFXaDdrY1Qxck1oSjVRUUN0a2tPN3ErUkJOR01EK1hQTmpYMTJydU96ampLOVNYRHJrYjV3ZEoKZnpjcStYZDR6MVR0VzBhZG80QU9rVVBCMWx0ZkZMcWZwbzBrUjBCWnYzSTRzalpzTi8rWjBWME9XUXFyYWZmQQpzZ1JGZWxRQXJyNVQ5clhuNGZnOG96SFNxZjRoVW1URnBtZndkUWNHbEJTQlZjWW41QUdQRjhGcWNkZStTL3VVCldIMStFVE94UXZkaWJCald6d2xvUG45czloNlBZcTJsWTlzSnB4OGlRa0VlYjVtS1B0ZjVQMEI2ZWJDbEFaTFMKblQwSUZhVVFBUzJ6TW5hb2xRMnplcHI3QnhCNEVXL2hqOGU2RHlVYWRDcmxISmhCbWQ4aGgraVZCbW9LczJwSApkbVgyT3MrUFloY1pld29velJyU2d4NGh4eXkvdnY5aGFMZG5HN3Q0VFkzT1orWGt3WTYzSTJiaW5aQjFOSmlwCk5pdUttcFM1bmV6TWlySDRKWWxjV3JZdmpCOXRlU1NuVW1qRGhEWGlabzFqRGlWTjFSbXk1bmszcHlLZFZERUMKQXdFQUFhTnFNR2d3SFFZRFZSME9CQllFRkI0TTk3Wm44dUdTSmdsRndGVTVMbmMvUWtxaU1Bd0dBMVVkRXdRRgpNQU1CQWY4d09RWUVaeW9IQUFReE1DOHdMUUlCQURBSkJnVXJEZ01DR2dVQU1BY0dCV2NxQXdBQUJCUkZzTUxICkNsWjg3bHQ0REpYNUdGUEJwaHpZRURBTkJna3Foa2lHOXcwQkFRVUZBQU9DQWdFQUNiT0RVMWtCUHBWSnVmR0IKdXZsMklDTzFKMkIwMUdxWk5GNXNBRlBabi9LbXNTUUhSR29xeHFXT2VCTG9SOWxZR3hNcVhubWJud29xWjZZbApQd1pwVm5QRGltWkkreW1CVjNRR3lwenFLT2c0WnlZcjhkVzFQMldUK0RaZGpvMk5RQ0NIR2Vydko4QTl0RGtQCkpYdG9VSFJWbkF4WmZWbzlRWlFsVWdqZ1J5d1ZNUm5WdndkVnhyc1N0WmYwWDRPRnVuSEIyV3lCRVhZS0NyQy8KZ3BmMzZqMzYrdXd0cVNpVU8xYmQwbEV1cnNDOUNCV01kMUkwbHRhYnJOTWRqbUVQTlh1YnJqbHBDMkpnUUNBMgpqNi83TnU0dENFb2R1TCtiWFBqcXBSdWdjNmJZK0c3Z013UmZhS29uaCszWndaQ2M3YjNqYWpXdlk5K3JHTm02CjV1bEs2bENLRDJHVEh1SXRHZUl3bERXU1hRNjJCNjhaZ0k5SGtGRkxMazNkaGVMU0NsSUtGNXI4R3JCUUF1VUIKbzJNM0lVeEV4SnRSbVJFT2M1d0dqMVF1cHloZVJEbUhWaTAzdllWRWxPRU1TeXljdzVLRk5HSExEN2liU2tOUwovalE2ZmJqcEtkeDJxY2d3K0JSeGdNWWVOa2gwSWtGY2g0TG9HSEdMUVlsRTUzNVlXNmk0alJQcHAyekRSKzJ6CkdwMWlybzJDNnBTZTNWa1F3NjNkNGszak1kWEg3T2p5c1A2U0hoWUtHdnpaOC9nbnRzbStIYlJzWkpCLzlPVEUKVzljM3JrSU8zYVFhYjN5SVZNVVdidUY2YUM3NE9yOE5wRHlKTzNpblRtT0RCQ0VJWjQzeWdrblFXLzJ4elErRApoTlErSUlYM1NqMHJuUDBxQ2dsTjZvSDRFWnc9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBPPWNlcnRTSUdOIE9VPWNlcnRTSUdOIFJPT1QgQ0EKIyBTdWJqZWN0OiBPPWNlcnRTSUdOIE9VPWNlcnRTSUdOIFJPT1QgQ0EKIyBMYWJlbDogImNlcnRTSUdOIFJPT1QgQ0EiCiMgU2VyaWFsOiAzNTIxMDIyNzI0OTE1NAojIE1ENSBGaW5nZXJwcmludDogMTg6OTg6YzA6ZDY6ZTk6M2E6ZmM6Zjk6YjA6ZjU6MGM6Zjc6NGI6MDE6NDQ6MTcKIyBTSEExIEZpbmdlcnByaW50OiBmYTpiNzplZTozNjo5NzoyNjo2MjpmYjoyZDpiMDoyYTpmNjpiZjowMzpmZDplODo3Yzo0YjoyZjo5YgojIFNIQTI1NiBGaW5nZXJwcmludDogZWE6YTk6NjI6YzQ6ZmE6NGE6NmI6YWY6ZWI6ZTQ6MTU6MTk6NmQ6MzU6MWM6Y2Q6ODg6OGQ6NGY6NTM6ZjM6ZmE6OGE6ZTY6ZDc6YzQ6NjY6YTk6NGU6NjA6NDI6YmIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURPRENDQWlDZ0F3SUJBZ0lHSUFZRkZuQUNNQTBHQ1NxR1NJYjNEUUVCQlFVQU1Ec3hDekFKQmdOVkJBWVQKQWxKUE1SRXdEd1lEVlFRS0V3aGpaWEowVTBsSFRqRVpNQmNHQTFVRUN4TVFZMlZ5ZEZOSlIwNGdVazlQVkNCRApRVEFlRncwd05qQTNNRFF4TnpJd01EUmFGdzB6TVRBM01EUXhOekl3TURSYU1Ec3hDekFKQmdOVkJBWVRBbEpQCk1SRXdEd1lEVlFRS0V3aGpaWEowVTBsSFRqRVpNQmNHQTFVRUN4TVFZMlZ5ZEZOSlIwNGdVazlQVkNCRFFUQ0MKQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFMY3p1WDdJSlVxT3RkdTBLQnVxVjVEbwowU0xUWkxyVGsralVySVpoUUdwZ1YyaFVoRTI4YWxRQ0JmL2ZtNW9xcmwwSGowckRLSC92K3l2NmVmSEhyZkFRClV5U1FpMmJKcUlpcnIxcWpBT20rdWtidVczTjdMQmVDZ1Y1aUxLRUNaYk85eFNzQWZzVDhBek5YRGUzaStzNWQKUmRZNHpUVzJzc0hRbklGS3F1U3lBVndkajErWnhMR3QyNGdoNjVBSWdvRHpNS05ENXBDQ3JsVW9TZTFiMTZrUQpPQTcrajB4Ym0wYnFRZld3Q0hURDBJZ3p0bnpYZE4vY2hORkREblU1b1NWQUtPcDR5dzRzTGptZGpJdHVGaHd2CkpvSVE0dU5sbEFvRXdGNzNYVnY0RU9MUXVucEwrOTQzQUFBYVd5amowcHh6UGpLSG1LSEpVUy9YM3F3enMwOEMKQXdFQUFhTkNNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FjWXdIUVlEVlIwTwpCQllFRk9DTW05c2xTYlB4ZkliV3NrS0hDOUJyb05ua01BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQSswaHlKCkxqWDgrSFhkNW45bGlQUnlUTWtzMXpKTzg5MFplVWU5amp0Ymt3OVFTU1FUYXhRR2N1OEowNkdoNDBDRXllY1kKTW5ROFNHNFBuMHZVOXg3VGs0WmtWSmRqY2xEVlZjLzZJSk1Db3B2REk1Tk9GbFYyb0hCNWJjMGhIODh2TGJ3Wgo0NGd4K0ZrYWdRbklsNloweDJERVc4eFhqckoxL1JzQ0NkdFpiM0tUYWZjeFFkYUlPTCtIc3IwV2VmbXE1TDZJCkpkMWhKeU1jdFRFSEJEYTBHcEM5b0hSeFVJbHR2QlRqRDRhdThhcyt4NkFKektOSTBlRGJaT2VTdGMrdmNrTncKaS9uRGhEd1RxbjZTbTFkVGsvcHd3cEVPTWZtYloxM3BsamhlWDdOelRvZ1ZaOTZlZGhCaUlMNVZhWlZEQURsTgo5dTZ3V2s1SlJGUllYMEtECi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1HZW9UcnVzdCBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzMgTz1HZW9UcnVzdCBJbmMuIE9VPShjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIFN1YmplY3Q6IENOPUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMyBPPUdlb1RydXN0IEluYy4gT1U9KGMpIDIwMDggR2VvVHJ1c3QgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgTGFiZWw6ICJHZW9UcnVzdCBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzMiCiMgU2VyaWFsOiAyODgwOTEwNTc2OTkyODU2NDMxMzk4NDA4NTIwOTk3NTg4NTU5OQojIE1ENSBGaW5nZXJwcmludDogYjU6ZTg6MzQ6MzY6Yzk6MTA6NDQ6NTg6NDg6NzA6NmQ6MmU6ODM6ZDQ6Yjg6MDUKIyBTSEExIEZpbmdlcnByaW50OiAwMzo5ZTplZDpiODowYjplNzphMDozYzo2OTo1Mzo4OTozYjoyMDpkMjpkOTozMjozYTo0YzoyYTpmZAojIFNIQTI1NiBGaW5nZXJwcmludDogYjQ6Nzg6Yjg6MTI6MjU6MGQ6Zjg6Nzg6NjM6NWM6MmE6YTc6ZWM6N2Q6MTU6NWU6YWE6NjI6NWU6ZTg6Mjk6MTY6ZTI6Y2Q6Mjk6NDM6NjE6ODg6NmM6ZDE6ZmI6ZDQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQvakNDQXVhZ0F3SUJBZ0lRRmF4dWxCbXllVXRCOWllcHd4Z1BIekFOQmdrcWhraUc5dzBCQVFzRkFEQ0IKbURFTE1Ba0dBMVVFQmhNQ1ZWTXhGakFVQmdOVkJBb1REVWRsYjFSeWRYTjBJRWx1WXk0eE9UQTNCZ05WQkFzVApNQ2hqS1NBeU1EQTRJRWRsYjFSeWRYTjBJRWx1WXk0Z0xTQkdiM0lnWVhWMGFHOXlhWHBsWkNCMWMyVWdiMjVzCmVURTJNRFFHQTFVRUF4TXRSMlZ2VkhKMWMzUWdVSEpwYldGeWVTQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHYKY21sMGVTQXRJRWN6TUI0WERUQTRNRFF3TWpBd01EQXdNRm9YRFRNM01USXdNVEl6TlRrMU9Wb3dnWmd4Q3pBSgpCZ05WQkFZVEFsVlRNUll3RkFZRFZRUUtFdzFIWlc5VWNuVnpkQ0JKYm1NdU1Ua3dOd1lEVlFRTEV6QW9ZeWtnCk1qQXdPQ0JIWlc5VWNuVnpkQ0JKYm1NdUlDMGdSbTl5SUdGMWRHaHZjbWw2WldRZ2RYTmxJRzl1YkhreE5qQTAKQmdOVkJBTVRMVWRsYjFSeWRYTjBJRkJ5YVcxaGNua2dRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrZwpMU0JITXpDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTnppWG1KWUhUTlhPVEl6Cit1dkxoNHluMUVyZEJvanFaSTR4bUtVNGtCNll6eTVqSy9CR3ZFU3lpYUhBS0F4SmNDR1ZuMlRBcHBNU0FtVW0KaHNhbGlmRDYxNFNnY0s5UEdwYy9Ca1RWeWV0eUVIM2tNU2o3SEdIbUtBZEVjNUlpYWFjRGlHeWRZOGhTMnBnbgo1d2hNY0Q2MHlSTEJ4V2VEWFRQekF4SHNhdEJUNHRHNk5tQ1VnTHRoWTJ4YkYzN2ZRSlFlcXczQ0lTaHdpUC9XCkpteHNZQVFsVGxWK2ZlKy9sRWpldHgzZGNJMEZYNGlsbS9MQzd1clJRRUZ0WWpnZFZnYkZBMGRSSUJuOGV4QUwKRG1LdWRsVy9YM2UrUGtrQlV6MllKUU4ySkZvZHROdUo2bm5sdHJNN1A3cE1LRUYvQnF4cWpzSFE5Z1VkZmVaQwpodU9sMVVjQ0F3RUFBYU5DTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3CkhRWURWUjBPQkJZRUZNUjV5bzZoVGdNZEhOeHIyekZibEQ0L01IOHRNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUIKQVFBdHhSUFBWb0I3ZW5pOW42NHNtZWZ2MnQrVVhnbHBwK2R1YUl5OWNyNUhxUTZYRXJoSzhXVFRPZDhsTk5UQgp6VTZCOEE4RXhDU3pOSmJHcHFvdzMyaGhjOWY1am9XSjd3NWVsU2hLS2llUEVJNHVmSWJFQXA3YURIZGxEa1FOCmt2MzlzeFkyK2hFTkhZd09CNGxxS1ZiM2N2VGRGWngzTldaWHF4TlQySTdCUU1YWEV4WmFjc2UzYVFIRWVyR0QKQVdoOWpVR2hsQmpCSlZ6ODhQNkRBb2Q4RFEzUExnaGNTa0FOUHV5QlllWWsyOHJnRGkwSHNqNVczSTMxUVlVSApTSnNNQzh0SlAzM3N0LzNMaldlSkdxdnR1eDZqQUFnSUZ5cUNYREZkUm9vdEQ0YWJkTmxGKzlSQXNYcXFhQzJHCnNwa2k0Y0VyeDV6NDgxK29naExyR1JFdAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049dGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcyIE89dGhhd3RlLCBJbmMuIE9VPShjKSAyMDA3IHRoYXd0ZSwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgU3ViamVjdDogQ049dGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcyIE89dGhhd3RlLCBJbmMuIE9VPShjKSAyMDA3IHRoYXd0ZSwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgTGFiZWw6ICJ0aGF3dGUgUHJpbWFyeSBSb290IENBIC0gRzIiCiMgU2VyaWFsOiA3MTc1ODMyMDY3MjgyNTQxMDAyMDY2MTYyMTA4NTI1NjQ3MjQwNgojIE1ENSBGaW5nZXJwcmludDogNzQ6OWQ6ZWE6NjA6MjQ6YzQ6ZmQ6MjI6NTM6M2U6Y2M6M2E6NzI6ZDk6Mjk6NGYKIyBTSEExIEZpbmdlcnByaW50OiBhYTpkYjpiYzoyMjoyMzo4ZjpjNDowMTphMToyNzpiYjozODpkZDpmNDoxZDpkYjowODo5ZTpmMDoxMgojIFNIQTI1NiBGaW5nZXJwcmludDogYTQ6MzE6MGQ6NTA6YWY6MTg6YTY6NDQ6NzE6OTA6Mzc6MmE6ODY6YWY6YWY6OGI6OTU6MWY6ZmI6NDM6MWQ6ODM6N2Y6MWU6NTY6ODg6YjQ6NTk6NzE6ZWQ6MTU6NTcKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNpRENDQWcyZ0F3SUJBZ0lRTmZ3bVhObUVUOGs5SmoxWG02N1hWakFLQmdncWhrak9QUVFEQXpDQmhERUwKTUFrR0ExVUVCaE1DVlZNeEZUQVRCZ05WQkFvVERIUm9ZWGQwWlN3Z1NXNWpMakU0TURZR0ExVUVDeE12S0dNcApJREl3TURjZ2RHaGhkM1JsTENCSmJtTXVJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sSUc5dWJIa3hKREFpCkJnTlZCQU1URzNSb1lYZDBaU0JRY21sdFlYSjVJRkp2YjNRZ1EwRWdMU0JITWpBZUZ3MHdOekV4TURVd01EQXcKTURCYUZ3MHpPREF4TVRneU16VTVOVGxhTUlHRU1Rc3dDUVlEVlFRR0V3SlZVekVWTUJNR0ExVUVDaE1NZEdoaApkM1JsTENCSmJtTXVNVGd3TmdZRFZRUUxFeThvWXlrZ01qQXdOeUIwYUdGM2RHVXNJRWx1WXk0Z0xTQkdiM0lnCllYVjBhRzl5YVhwbFpDQjFjMlVnYjI1c2VURWtNQ0lHQTFVRUF4TWJkR2hoZDNSbElGQnlhVzFoY25rZ1VtOXYKZENCRFFTQXRJRWN5TUhZd0VBWUhLb1pJemowQ0FRWUZLNEVFQUNJRFlnQUVvdFdjZ251Vm5mRlNlSWYraWhhLwpCZWJmb3dKUERRZkdBRkc2REFKU0xTS2tRam5FL28vcXljRysxRTMvbjNxZTRyRjhtcTJuaGdsemg5SG5tdU42CnBhcHUrN3F6Y01CbmlLSTExS09hc2YydHd1OHgrcWk1OC9zSXhwSFIreW1WbzBJd1FEQVBCZ05WSFJNQkFmOEUKQlRBREFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQkJqQWRCZ05WSFE0RUZnUVVtdGdBTUFEbmEzK0ZHTzZMdHM2SwpEUGdSNGJzd0NnWUlLb1pJemowRUF3TURhUUF3WmdJeEFOMzQ0RmRIVzZmbUNzTzk5WUNLbHpVTkc0azhWSVozCktNcWg5SG5ldGVZNHNQQmxjSXgvQWxUQ3YvL1lvVDdaendJeEFNU05sUHpjVTlMY25YZ1dIeFV6STFOUzQxb3gKWFozS3JyMFRLVVFOSjF1bzUyaWNFdmRZUHk1eUFsZWpqNkVVTGc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049dGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczIE89dGhhd3RlLCBJbmMuIE9VPUNlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24vKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBTdWJqZWN0OiBDTj10aGF3dGUgUHJpbWFyeSBSb290IENBIC0gRzMgTz10aGF3dGUsIEluYy4gT1U9Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbi8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIExhYmVsOiAidGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczIgojIFNlcmlhbDogMTI3NjE0MTU3MDU2NjgxMjk5ODA1NTU2NDc2Mjc1OTk1NDE0Nzc5CiMgTUQ1IEZpbmdlcnByaW50OiBmYjoxYjo1ZDo0Mzo4YTo5NDpjZDo0NDpjNjo3NjpmMjo0Mzo0Yjo0NzplNzozMQojIFNIQTEgRmluZ2VycHJpbnQ6IGYxOjhiOjUzOjhkOjFiOmU5OjAzOmI2OmE2OmYwOjU2OjQzOjViOjE3OjE1Ojg5OmNhOmYzOjZiOmYyCiMgU0hBMjU2IEZpbmdlcnByaW50OiA0YjowMzpmNDo1ODowNzphZDo3MDpmMjoxYjpmYzoyYzphZTo3MTpjOTpmZDplNDo2MDo0YzowNjo0YzpmNTpmZjpiNjo4NjpiYTplNTpkYjphYTpkNzpmZDpkMzo0YwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUtqQ0NBeEtnQXdJQkFnSVFZQUdYdDBhbjZyUzBtdFpMTC9lUSt6QU5CZ2txaGtpRzl3MEJBUXNGQURDQgpyakVMTUFrR0ExVUVCaE1DVlZNeEZUQVRCZ05WQkFvVERIUm9ZWGQwWlN3Z1NXNWpMakVvTUNZR0ExVUVDeE1mClEyVnlkR2xtYVdOaGRHbHZiaUJUWlhKMmFXTmxjeUJFYVhacGMybHZiakU0TURZR0ExVUVDeE12S0dNcElESXcKTURnZ2RHaGhkM1JsTENCSmJtTXVJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sSUc5dWJIa3hKREFpQmdOVgpCQU1URzNSb1lYZDBaU0JRY21sdFlYSjVJRkp2YjNRZ1EwRWdMU0JITXpBZUZ3MHdPREEwTURJd01EQXdNREJhCkZ3MHpOekV5TURFeU16VTVOVGxhTUlHdU1Rc3dDUVlEVlFRR0V3SlZVekVWTUJNR0ExVUVDaE1NZEdoaGQzUmwKTENCSmJtTXVNU2d3SmdZRFZRUUxFeDlEWlhKMGFXWnBZMkYwYVc5dUlGTmxjblpwWTJWeklFUnBkbWx6YVc5dQpNVGd3TmdZRFZRUUxFeThvWXlrZ01qQXdPQ0IwYUdGM2RHVXNJRWx1WXk0Z0xTQkdiM0lnWVhWMGFHOXlhWHBsClpDQjFjMlVnYjI1c2VURWtNQ0lHQTFVRUF4TWJkR2hoZDNSbElGQnlhVzFoY25rZ1VtOXZkQ0JEUVNBdElFY3oKTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFzcjhuTFB2YjJGdmRlSHNibm5kbQpnY3Mrdkh5dTg2WW5talNqYURGeE9ETmk1UE54Wm5teHFXV2pwWXZWajJBdFAwTE1xbXN5d0NQTExFSGQ1Ti84CllaemljN0lpbFJGREdGL0V0aDlYYkFvRldDTElOa3c2ZktYUno0YXZpS2RFQWhOMGNYTUtRbGtDK0JzVWEwTGYKYjErNmE0S2luVnZuU3IwZUFYTGJTM1RvTzM5L2ZSOEV0Q2FiNExSYXJFYzlWYmpYc0NaU0tBRXhRR2JZMlNTOQo5aXJZN0NGSlhKdjJldWwvVlRWK2xtdU5rNU1ueTVLNzZxeEF3Si9DK0lEUFhmUmEzTTUwaHFZK2JBdFR5cjJTCnpoa0djdVlNWERocHh3VFd2R3pPVy9iM2FKemNKUlZJaUtIcHFmaVluT0R6MVRFb1lSRnNaNWFOT1puTHdrVWsKT1FJREFRQUJvMEl3UURBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUJCakFkQmdOVgpIUTRFRmdRVXJXeXFsR0NjN2VULytqNEtkQ3RqQS9lMldiOHdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBQnBBCjJKVmxyQW1TaWNZNTlCRGxxUTVtVTExNDN2b2trYnZuUkZIZnhoWTBDdTlxUkZIcUt3ZUtBM3JENno4S0xGSVcKb0N0RHVTV1FQM0NwTXlWdFJSb29PeWZQcXNNcFFodmZPMHpBTXpSYlFZaS9heXRscnlqdnN2WERxbWJPZTFidQp0OGpMWjhISm5Cb1l1TVREU1FQeFlBNVF6VWJGODNkNTk3WVY0RGpieHk4b29Bdy9keVowMlNVUzJqSGFHaDdjCktVR1JJanhwcDdzQzhyWmNKd09KOUFicW0rUnlndU9oQ2NIcEFCblRQdFJ3YTdweHBxcFlydlM3Nld5Mjc0Zk0KbTd2L09lWldZZE1LcDhSY1RHQjdCWGNtZXIvWUIxSXNZdmR3WTlrNXZHOGN3bm5jZGltdnpzVXNaQVJlaURadQpNZFJBR21JME5qODFBYTZzWTZBPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyIE89R2VvVHJ1c3QgSW5jLiBPVT0oYykgMjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBTdWJqZWN0OiBDTj1HZW9UcnVzdCBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIgTz1HZW9UcnVzdCBJbmMuIE9VPShjKSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIExhYmVsOiAiR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyIgojIFNlcmlhbDogODA2ODI4NjMyMDMzODEwNjU3ODIxNzc5MDg3NTE3OTQ2MTkyNDMKIyBNRDUgRmluZ2VycHJpbnQ6IDAxOjVlOmQ4OjZiOmJkOjZmOjNkOjhlOmExOjMxOmY4OjEyOmUwOjk4OjczOjZhCiMgU0hBMSBGaW5nZXJwcmludDogOGQ6MTc6ODQ6ZDU6Mzc6ZjM6MDM6N2Q6ZWM6NzA6ZmU6NTc6OGI6NTE6OWE6OTk6ZTY6MTA6ZDc6YjAKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDVlOmRiOjdhOmM0OjNiOjgyOmEwOjZhOjg3OjYxOmU4OmQ3OmJlOjQ5Ojc5OmViOmYyOjYxOjFmOjdkOmQ3OjliOmY5OjFjOjFjOjZiOjU2OjZhOjIxOjllOmQ3OjY2Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDcmpDQ0FqV2dBd0lCQWdJUVBMTDBTQW9BNHY3ckpEdGVZRDdEYXpBS0JnZ3Foa2pPUFFRREF6Q0JtREVMCk1Ba0dBMVVFQmhNQ1ZWTXhGakFVQmdOVkJBb1REVWRsYjFSeWRYTjBJRWx1WXk0eE9UQTNCZ05WQkFzVE1DaGoKS1NBeU1EQTNJRWRsYjFSeWRYTjBJRWx1WXk0Z0xTQkdiM0lnWVhWMGFHOXlhWHBsWkNCMWMyVWdiMjVzZVRFMgpNRFFHQTFVRUF4TXRSMlZ2VkhKMWMzUWdVSEpwYldGeWVTQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwCmVTQXRJRWN5TUI0WERUQTNNVEV3TlRBd01EQXdNRm9YRFRNNE1ERXhPREl6TlRrMU9Wb3dnWmd4Q3pBSkJnTlYKQkFZVEFsVlRNUll3RkFZRFZRUUtFdzFIWlc5VWNuVnpkQ0JKYm1NdU1Ua3dOd1lEVlFRTEV6QW9ZeWtnTWpBdwpOeUJIWlc5VWNuVnpkQ0JKYm1NdUlDMGdSbTl5SUdGMWRHaHZjbWw2WldRZ2RYTmxJRzl1YkhreE5qQTBCZ05WCkJBTVRMVWRsYjFSeWRYTjBJRkJ5YVcxaGNua2dRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrZ0xTQkgKTWpCMk1CQUdCeXFHU000OUFnRUdCU3VCQkFBaUEySUFCQld4NlAwREZVUGxyT3VITnhGaTc5S0RObEo5UlZjTApTbzE3VkRzNmJsOFZBc0JRcHM4bEwzM0tTTGpIVUdNY0tpRUlmSm8yMkF2KzBTYkZXREV3S0NYelhWMmp1TGFsCnRKTHRiQ3lmNjkxRGlhSThTMGlSSFZEc0p0L1dZQzY5SWFOQ01FQXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU8KQmdOVkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUVGQlZmTlZkUlZmc2xzcTBEYWZ3Qm8vcStFVlhWTUFvRwpDQ3FHU000OUJBTURBMmNBTUdRQ01HU1dXYWJvQ2Q2THV2cGFpSWp3SDVIVFJxanlTa3dDWS90c1h6amJMa0dUCnFRN21uZHd4SExLZ3B4Z2NlZUhITmdJd09sYXZtblJzOXZ1RDREUFRDRitobk1KYm4wYld0c3VSQm1PaUJ1Y3oKckQ2b2dSTFF5N3JRa2d1Mm5wYXFCQStLCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPVZlcmlTaWduLCBJbmMuIE9VPVZlcmlTaWduIFRydXN0IE5ldHdvcmsvKGMpIDIwMDggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIFN1YmplY3Q6IENOPVZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89VmVyaVNpZ24sIEluYy4gT1U9VmVyaVNpZ24gVHJ1c3QgTmV0d29yay8oYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgTGFiZWw6ICJWZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSIKIyBTZXJpYWw6IDg1MjA5NTc0NzM0MDg0NTgxOTE3NzYzNzUyNjQ0MDMxNzI2ODc3CiMgTUQ1IEZpbmdlcnByaW50OiA4ZTphZDpiNTowMTphYTo0ZDo4MTplNDo4YzoxZDpkMTplMToxNDowMDo5NToxOQojIFNIQTEgRmluZ2VycHJpbnQ6IDM2Ojc5OmNhOjM1OjY2Ojg3OjcyOjMwOjRkOjMwOmE1OmZiOjg3OjNiOjBmOmE3OjdiOmI3OjBkOjU0CiMgU0hBMjU2IEZpbmdlcnByaW50OiAyMzo5OTo1NjoxMToyNzphNTo3MToyNTpkZTo4YzplZjplYTo2MTowZDpkZjoyZjphMDo3ODpiNTpjODowNjo3Zjo0ZTo4Mjo4Mjo5MDpiZjpiODo2MDplODo0YjozYwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRXVUQ0NBNkdnQXdJQkFnSVFRQnJFWkNHekV5RUREcnZrRWhyRkhUQU5CZ2txaGtpRzl3MEJBUXNGQURDQgp2VEVMTUFrR0ExVUVCaE1DVlZNeEZ6QVZCZ05WQkFvVERsWmxjbWxUYVdkdUxDQkpibU11TVI4d0hRWURWUVFMCkV4WldaWEpwVTJsbmJpQlVjblZ6ZENCT1pYUjNiM0pyTVRvd09BWURWUVFMRXpFb1l5a2dNakF3T0NCV1pYSnAKVTJsbmJpd2dTVzVqTGlBdElFWnZjaUJoZFhSb2IzSnBlbVZrSUhWelpTQnZibXg1TVRnd05nWURWUVFERXk5VwpaWEpwVTJsbmJpQlZibWwyWlhKellXd2dVbTl2ZENCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEFlCkZ3MHdPREEwTURJd01EQXdNREJhRncwek56RXlNREV5TXpVNU5UbGFNSUc5TVFzd0NRWURWUVFHRXdKVlV6RVgKTUJVR0ExVUVDaE1PVm1WeWFWTnBaMjRzSUVsdVl5NHhIekFkQmdOVkJBc1RGbFpsY21sVGFXZHVJRlJ5ZFhOMApJRTVsZEhkdmNtc3hPakE0QmdOVkJBc1RNU2hqS1NBeU1EQTRJRlpsY21sVGFXZHVMQ0JKYm1NdUlDMGdSbTl5CklHRjFkR2h2Y21sNlpXUWdkWE5sSUc5dWJIa3hPREEyQmdOVkJBTVRMMVpsY21sVGFXZHVJRlZ1YVhabGNuTmgKYkNCU2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1JSUJJakFOQmdrcWhraUc5dzBCQVFFRgpBQU9DQVE4QU1JSUJDZ0tDQVFFQXgyRTNYckVCTk50aTF4V2IvMWhhakNNajFtQ09rZGVRbUlONjVsZ1pPSXpGCjl1VmtoYlNpY2Z2dHZibmF6VTBBdE1ndGM2WEhhWEdWSHprOHNrUUhuT2dPK2sxS3hDSGZLV0dQTWlKaGdzV0gKSDI2TWZGOFdJRkZFMFhCUFYrcmpIT1BNZWU1WTJBN0NzMFdUd0N6bm1oY3Jld0EzZWtFemVPRXo0dk1RR24rSApMTDcyOWZkQzR1Vy9oMktKWHdCTDM4WGQ1SFZFTWtFNkhuRnVhY3NMZFVZSTBjclNLNVhRei91NVFHdGtqRmROCi9CTVJlWVR0WGxUMk5KOElBZk1RSlFZWFN0cnhIWHBtYTVoZ1pxVFo3OUl1Z3ZIdzd3bnFSTWtWYXVJRGJqUFQKcko5VkFNZjJDR3FVdVYvYzREUHhoR0Q1V3ljUnRQd1c4cnRXYW9BbGpRSURBUUFCbzRHeU1JR3ZNQThHQTFVZApFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnRUdNRzBHQ0NzR0FRVUZCd0VNQkdFd1g2RmRvRnN3CldUQlhNRlVXQ1dsdFlXZGxMMmRwWmpBaE1COHdCd1lGS3c0REFob0VGSS9sMHhxR3JJMk9hOFBQZ0dyVVNCZ3MKZXhrdU1DVVdJMmgwZEhBNkx5OXNiMmR2TG5abGNtbHphV2R1TG1OdmJTOTJjMnh2WjI4dVoybG1NQjBHQTFVZApEZ1FXQkJTMmQvcHBTRWVmVXhMVnd1b0hNbllIMFpjSEdUQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUFTdmo0CnNBUG1MR2Q3NUpSM1k4eHVUUGw5RGczY3lMazF1WEJQWS9vaytteURqRWVkTzJQem12bDJNcFdSc1hlOHJKcSsKc2VReEljYUJsVlphRHJIQzFMR21XYXp4WTh1NFRCMVprRXJ2a0JZb0gxcXVFUHVCVURnTWJNenhQY1AxWStPego0eUhKSkRucC9SVm1SdlFiRWRCTmM2TjlSdms5N2FoZll0VHhQL2pnZEZjckdKMkJ0TVFvMnBTWHBYRHJyQjIrCkJ4SHcxZHZkNVl6dzFUS3dnK1pYNG8rL3ZxR3F2ejBkdGRRNDZ0ZXdYRHBQYWorUHdHWnNZNnJwMmFRVzlJSFIKbFJRT2ZjMlZOTm5TajNCemdYdWNmcjJZWWRoRmg1aVF4ZXVHTU1ZMXYvRC93MVdJZzB2dkJaSUdjZks0bUpPMwo3TTJDWWZFNDVrK1htQ3BhalE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VmVyaVNpZ24gQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0IE89VmVyaVNpZ24sIEluYy4gT1U9VmVyaVNpZ24gVHJ1c3QgTmV0d29yay8oYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgU3ViamVjdDogQ049VmVyaVNpZ24gQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0IE89VmVyaVNpZ24sIEluYy4gT1U9VmVyaVNpZ24gVHJ1c3QgTmV0d29yay8oYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgTGFiZWw6ICJWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQiCiMgU2VyaWFsOiA2MzE0MzQ4NDM0ODE1MzUwNjY2NTMxMTk4NTUwMTQ1ODY0MDA1MQojIE1ENSBGaW5nZXJwcmludDogM2E6NTI6ZTE6ZTc6ZmQ6NmY6M2E6ZTM6NmY6ZjM6NmY6OTk6MWI6Zjk6MjI6NDEKIyBTSEExIEZpbmdlcnByaW50OiAyMjpkNTpkODpkZjo4ZjowMjozMTpkMTo4ZDpmNzo5ZDpiNzpjZjo4YToyZDo2NDpjOTozZjo2YzozYQojIFNIQTI1NiBGaW5nZXJwcmludDogNjk6ZGQ6ZDc6ZWE6OTA6YmI6NTc6Yzk6M2U6MTM6NWQ6Yzg6NWU6YTY6ZmM6ZDU6NDg6MGI6NjA6MzI6Mzk6YmQ6YzQ6NTQ6ZmM6NzU6OGI6MmE6MjY6Y2Y6N2Y6NzkKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURoRENDQXdxZ0F3SUJBZ0lRTDREK0k0d09JZzlJWnhJb2tZZXNzekFLQmdncWhrak9QUVFEQXpDQnlqRUwKTUFrR0ExVUVCaE1DVlZNeEZ6QVZCZ05WQkFvVERsWmxjbWxUYVdkdUxDQkpibU11TVI4d0hRWURWUVFMRXhaVwpaWEpwVTJsbmJpQlVjblZ6ZENCT1pYUjNiM0pyTVRvd09BWURWUVFMRXpFb1l5a2dNakF3TnlCV1pYSnBVMmxuCmJpd2dTVzVqTGlBdElFWnZjaUJoZFhSb2IzSnBlbVZrSUhWelpTQnZibXg1TVVVd1F3WURWUVFERXp4V1pYSnAKVTJsbmJpQkRiR0Z6Y3lBeklGQjFZbXhwWXlCUWNtbHRZWEo1SUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eQphWFI1SUMwZ1J6UXdIaGNOTURjeE1UQTFNREF3TURBd1doY05Nemd3TVRFNE1qTTFPVFU1V2pDQnlqRUxNQWtHCkExVUVCaE1DVlZNeEZ6QVZCZ05WQkFvVERsWmxjbWxUYVdkdUxDQkpibU11TVI4d0hRWURWUVFMRXhaV1pYSnAKVTJsbmJpQlVjblZ6ZENCT1pYUjNiM0pyTVRvd09BWURWUVFMRXpFb1l5a2dNakF3TnlCV1pYSnBVMmxuYml3ZwpTVzVqTGlBdElFWnZjaUJoZFhSb2IzSnBlbVZrSUhWelpTQnZibXg1TVVVd1F3WURWUVFERXp4V1pYSnBVMmxuCmJpQkRiR0Z6Y3lBeklGQjFZbXhwWXlCUWNtbHRZWEo1SUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjUKSUMwZ1J6UXdkakFRQmdjcWhrak9QUUlCQmdVcmdRUUFJZ05pQUFTblZucDhVdHBrbXc0dFhOaGVySkk5L2dIbQpHVW85RkFOTCttQW5JTm1EaVduNlZNYWFHRjVWS21UZUJ2YU5TanV0RUR4bFBaQ0lCSW5nTUdHenJsMEJwM3ZlCmZMSyt5bVZoQUlhdTJvOTcwSW10VFIxWm1rR3h2RWVBM0o1aXcvbWpnYkl3Z2E4d0R3WURWUjBUQVFIL0JBVXcKQXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd2JRWUlLd1lCQlFVSEFRd0VZVEJmb1YyZ1d6QlpNRmN3VlJZSgphVzFoWjJVdloybG1NQ0V3SHpBSEJnVXJEZ01DR2dRVWorWFRHb2Fzalk1cnc4K0FhdFJJR0N4N0dTNHdKUllqCmFIUjBjRG92TDJ4dloyOHVkbVZ5YVhOcFoyNHVZMjl0TDNaemJHOW5ieTVuYVdZd0hRWURWUjBPQkJZRUZMTVcKa2YzdXBtN2t0UzVKajRkNGdZRHM1YkcxTUFvR0NDcUdTTTQ5QkFNREEyZ0FNR1VDTUdZaERCZ21ZRm80ZTFaQwo0S2Y4Tm9SUmtTQXNkazFEUGNRZGhDUFFyTlo4TlFiT3pXbTlrQTNiYkVoQ0hRNnFRZ0l4QUp3OVNEa2pPVmdhCkZSSlphcDd2MVZteUhWSXNtWEhOeHluZkd5cGhlM0hSM3ZQQTVRMDZTcW90cDlpR0t0MHVFQT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1OZXRMb2NrIEFyYW55IChDbGFzcyBHb2xkKSBGXHUwMTUxdGFuXHhmYXNceGVkdHZceGUxbnkgTz1OZXRMb2NrIEtmdC4gT1U9VGFuXHhmYXNceGVkdHZceGUxbnlraWFkXHhmM2sgKENlcnRpZmljYXRpb24gU2VydmljZXMpCiMgU3ViamVjdDogQ049TmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRlx1MDE1MXRhblx4ZmFzXHhlZHR2XHhlMW55IE89TmV0TG9jayBLZnQuIE9VPVRhblx4ZmFzXHhlZHR2XHhlMW55a2lhZFx4ZjNrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKQojIExhYmVsOiAiTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRlx1MDE1MXRhblx4ZmFzXHhlZHR2XHhlMW55IgojIFNlcmlhbDogODA1NDQyNzQ4NDE2MTYKIyBNRDUgRmluZ2VycHJpbnQ6IGM1OmExOmI3OmZmOjczOmRkOmQ2OmQ3OjM0OjMyOjE4OmRmOmZjOjNjOmFkOjg4CiMgU0hBMSBGaW5nZXJwcmludDogMDY6MDg6M2Y6NTk6M2Y6MTU6YTE6MDQ6YTA6Njk6YTQ6NmI6YTk6MDM6ZDA6MDY6Yjc6OTc6MDk6OTEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDZjOjYxOmRhOmMzOmEyOmRlOmYwOjMxOjUwOjZiOmUwOjM2OmQyOmE2OmZlOjQwOjE5Ojk0OmZiOmQxOjNkOmY5OmM4OmQ0OjY2OjU5OjkyOjc0OmM0OjQ2OmVjOjk4Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFRlRDQ0F2MmdBd0lCQWdJR1NVRXM1QUFRTUEwR0NTcUdTSWIzRFFFQkN3VUFNSUduTVFzd0NRWURWUVFHCkV3SklWVEVSTUE4R0ExVUVCd3dJUW5Wa1lYQmxjM1F4RlRBVEJnTlZCQW9NREU1bGRFeHZZMnNnUzJaMExqRTMKTURVR0ExVUVDd3d1VkdGdXc3cHp3NjEwZHNPaGJubHJhV0ZrdzdOcklDaERaWEowYVdacFkyRjBhVzl1SUZObApjblpwWTJWektURTFNRE1HQTFVRUF3d3NUbVYwVEc5amF5QkJjbUZ1ZVNBb1EyeGhjM01nUjI5c1pDa2dSc1dSCmRHRnV3N3B6dzYxMGRzT2hibmt3SGhjTk1EZ3hNakV4TVRVd09ESXhXaGNOTWpneE1qQTJNVFV3T0RJeFdqQ0IKcHpFTE1Ba0dBMVVFQmhNQ1NGVXhFVEFQQmdOVkJBY01DRUoxWkdGd1pYTjBNUlV3RXdZRFZRUUtEQXhPWlhSTQpiMk5ySUV0bWRDNHhOekExQmdOVkJBc01MbFJoYnNPNmM4T3RkSGJEb1c1NWEybGhaTU96YXlBb1EyVnlkR2xtCmFXTmhkR2x2YmlCVFpYSjJhV05sY3lreE5UQXpCZ05WQkFNTUxFNWxkRXh2WTJzZ1FYSmhibmtnS0VOc1lYTnoKSUVkdmJHUXBJRWJGa1hSaGJzTzZjOE90ZEhiRG9XNTVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QQpNSUlCQ2dLQ0FRRUF4Q1JlYzc1TGJSVERvZlRqbDVCdTBqQkZIanp1WjlsazRCcUtmOG93eW9QaklNSGo5RHJUCmxGOGFmRnR0dnpCUGhDZjJueDlKdk1hWkNwRHlEL1YvUTRRM1kxR0xlcVZ3L0hwWXpZNmI3Y05HYklSd1hkcnoKQVpBai9FNHdxWDdoSjJQbjdXUThvTGpKTTJQK0ZwRC9zTGo5MTZqQXdKUkRDN2JWV2FhZVZ0QWtIM0I1cjlzNQpWQTFsZGRrVlFaUUJyMTdzOW8zeC82MWsvaUNhMTF6ci9xWWZDR1NqaTNaVnJSNDdLR0F1aHlYb3FxOGZ4bVJHCklMZHdmenplU051V1U3YzVkK1FhNHNjV2hIYVhXeSs3R1JXRitHbUY5Wm1ucWZJMHA2bTJwZ1A4YjRZOVZIeDIKQkp0citVQmRBRFRITHBsMW5lV0lBNnBOK0FQU1FuYkFHd0lEQUtpTG8wVXdRekFTQmdOVkhSTUJBZjhFQ0RBRwpBUUgvQWdFRU1BNEdBMVVkRHdFQi93UUVBd0lCQmpBZEJnTlZIUTRFRmdRVXpQcG5rL0MydU5DbHdCN3pVLzJNClU5K0QxNVl3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUt0Lzdod1dxWnc4VVFDZ3dCRUlCYWVaNW04QmlGUmgKYnZHNUdLMUtyZjZCUUNPVUwvdDFmQzhvUzJJa2dZSUw5V0h4SEc2NFlUanJnZnBpb1R0YVl0T1VaY1RoNW0yQworQzhsY0xJaEpzRnlVUitNTE1PRWtNTmFqN3JQOUtkbHBldVkwZnNGc2taMUZTTnFiNFZqTUlEdzFaNGZLUnpDCmJMQlFXVjJRV3p1b0RURFB2MzEvenZHZGc3M0pSbTRncHZsaFVib2hMM3UrcFJWam9kU1ZoL0dldWZPSjh6MkYKdUxqYnZyVzVLZm5hTndVQVNaUURoRVRudjBNeHozV0xKZEgwcG1UMWt2YXJCZXM5NmFVTE5tTGF6QVpmTm91MgpYakc0S3Z0ZTluSGZSQ2FleE9ZTmtiUXVkWldBVVdwTE1LYXdZcUdUOFp2WXpzUmpkVDlaUjdFPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U3RhYXQgZGVyIE5lZGVybGFuZGVuIFJvb3QgQ0EgLSBHMiBPPVN0YWF0IGRlciBOZWRlcmxhbmRlbgojIFN1YmplY3Q6IENOPVN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENBIC0gRzIgTz1TdGFhdCBkZXIgTmVkZXJsYW5kZW4KIyBMYWJlbDogIlN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENBIC0gRzIiCiMgU2VyaWFsOiAxMDAwMDAxMgojIE1ENSBGaW5nZXJwcmludDogN2M6YTU6MGY6Zjg6NWI6OWE6N2Q6NmQ6MzA6YWU6NTQ6NWE6ZTM6NDI6YTI6OGEKIyBTSEExIEZpbmdlcnByaW50OiA1OTphZjo4Mjo3OTo5MTo4NjpjNzpiNDo3NTowNzpjYjpjZjowMzo1Nzo0NjplYjowNDpkZDpiNzoxNgojIFNIQTI1NiBGaW5nZXJwcmludDogNjY6OGM6ODM6OTQ6N2Q6YTY6M2I6NzI6NGI6ZWM6ZTE6NzQ6M2M6MzE6YTA6ZTY6YWU6ZDA6ZGI6OGU6YzU6YjM6MWI6ZTM6Nzc6YmI6Nzg6NGY6OTE6YjY6NzE6NmYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZ5akNDQTdLZ0F3SUJBZ0lFQUppV2pEQU5CZ2txaGtpRzl3MEJBUXNGQURCYU1Rc3dDUVlEVlFRR0V3Sk8KVERFZU1Cd0dBMVVFQ2d3VlUzUmhZWFFnWkdWeUlFNWxaR1Z5YkdGdVpHVnVNU3N3S1FZRFZRUUREQ0pUZEdGaApkQ0JrWlhJZ1RtVmtaWEpzWVc1a1pXNGdVbTl2ZENCRFFTQXRJRWN5TUI0WERUQTRNRE15TmpFeE1UZ3hOMW9YCkRUSXdNRE15TlRFeE1ETXhNRm93V2pFTE1Ba0dBMVVFQmhNQ1Rrd3hIakFjQmdOVkJBb01GVk4wWVdGMElHUmwKY2lCT1pXUmxjbXhoYm1SbGJqRXJNQ2tHQTFVRUF3d2lVM1JoWVhRZ1pHVnlJRTVsWkdWeWJHRnVaR1Z1SUZKdgpiM1FnUTBFZ0xTQkhNakNDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFNVlo1MjkxCnFqNUxuTFc0cko0TDVQblp5cXRkajdVNUVJTFhyMUhnTytFQVNHclAydUVHUXhHWnFoUWxFcTBpNkFCdFE4U3AKdU9VZmlVdG52V0ZJNy8zUzRHQ0k1YmtZWUNqRGR5dXRzRGVxTjk1a1dTcEdWK1JMdWZnM2ZOVTI1NERCdHZQVQpaNXVXNk03WHhncFQwR3RKbHZPakN3VjNTUGNsNVhDc01CUWdKZU4vZFZybFNQaE9ld01IQlBxQ1lZZHU4RHZFCnBNZlE5WFErcFYwYUNQS2JKZEwyckFRbVBsVTZZaWlsZTdJd3IvZzN3dEc2MWpqOTlPOUpNRGVaSmlGSWhRR3AKNVJibjNKQlYzdy9vT00yWk55RlBYZlVpYjJyRkVoWmdGMVh5WldhbXB6Q1JPTUU0SFlZRWhMb2FKWGhlbmEvTQpVR0RXRTRkUzdXTWZiV1Y5d2hVWWRNcmhmbVFwakhMWUZoTjlDMGxLOFNnYklIUnJ4VDNkc0twSUNUMHVncFROCkdtWFpLNGlhbWJ3WWZwL3VmV1o4UHIyVXVJSE96Wmd3ZU1Gdlo5QytYK0JvN2Q3aXNja3NXWGlTcXQ4cllHUHkKNVY2NTQ4cjZmMUNHUHFJMEdBd0phQ2dSSE9UaHVWdytSN295UHhqTVc0VDE4MnQweEhKMDRlT0xvRXE5aldZdgo2cTAxMmlEVGlJSmg4QklpdHJ6UTFhVHNyMVNJSlNROHAyMnhjaWsvUGxlbWYxV3ZiaWJHL3VmTVFGeFJSSUVLCmVONUt6bFcvSGRYWnQxYnY4SGIvQzNtMXI3MzdxV21SUnBkb2dCUTJIYk4vdXltWU5xVWcrb0pnWWpPazdOYTYKQjZkdXhjOFVwdWZXa2pUWWdmWDhIVjJxWEI3Mm8wMDd1UGM1QWdNQkFBR2pnWmN3Z1pRd0R3WURWUjBUQVFILwpCQVV3QXdFQi96QlNCZ05WSFNBRVN6QkpNRWNHQkZVZElBQXdQekE5QmdnckJnRUZCUWNDQVJZeGFIUjBjRG92CkwzZDNkeTV3YTJsdmRtVnlhR1ZwWkM1dWJDOXdiMnhwWTJsbGN5OXliMjkwTFhCdmJHbGplUzFITWpBT0JnTlYKSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPQkJZRUZKRm9Nb2NWSFluaXRmR3NOaWcwalF0OFlvanJNQTBHQ1NxRwpTSWIzRFFFQkN3VUFBNElDQVFDb1FVcG5LcEtCZ2xCdTRkZllzems3OHdJVkNWQlI3eTI5Skh1SWhqdjV0THlTCkNaYTU5c0NySTJBR2VZd1JUbEhTZVlBeis1MUl2dXhCUTRFZmZrZEFIT1Y2Q01xcWkzV3RGTVRDNkdZOGdnZW4KNWllQ1d4am1EMjdaVUQ2S1FoZ3B4clJXL0ZZUW9BVVh2UXdqZi9TVDdad2FVYjdkUlVHL2tTUzBINHpwWDg5NwpJWm1mbFo4NU9rWWNiUG5OZTV5UXpTaXB4NmxWdTZ4aU5HSTFFMHNVT2xXRHVZYU5rcWJHOUFjbFZNd1dWeEpLCmduaklGTmtYZ2lZdFhTQWZlYTcrMUhBV0ZwV0QyRFU1LzFKZGRSd1d4Uk5WejBmTWRXVlNTdDd3c0tma0NwWUwKKzYzQzRpV0VzdDNrdlg1WmJKdnc4TmpueXZMcGx6aCtpYjdNK3prWFlUOXkyenFSMkdVQkdSMnRVS1JYQ254TAp2Snh4Y3lwRlVSbUZ6STc5UjZkMGxSMm8wYTlPRjdGcEpzS3FlRmRieFUybjVaNEZGNVRLc2wrZ1NSaU5OT2ttCmJFZ2VxbWlTQmVHQ2MxcWIzQWRiQ0cxOW5kZU5JZG44RkNDcXdrWGZQK2NBc2xIa3d2Z0Z1WGthakRUem5sdmsKTjF0clN0OHNWNHBBV2phNjNYVkVDRGRDY0F6KzNGNGhvS09Ld0pDY2FOcFE1a1VRUjNpMlR0Smx5Y00zMytGQwpZN0JYTjBVdGU0cWN2d1hxWlZVejl6a1F4U2dxSVhvYmlzUWsrVDhWeUpvVklQVlZZcGJ0YlpOUXZPU3FlSzNaCnl3cGxoNlptd2NTQm8zYzZXQjRMN29PTG5SN1NVcVRNSFcrd21HMlVNYlg0Y1FyY3VmeDlNbURtNjYrS0FRPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUhvbmdrb25nIFBvc3QgUm9vdCBDQSAxIE89SG9uZ2tvbmcgUG9zdAojIFN1YmplY3Q6IENOPUhvbmdrb25nIFBvc3QgUm9vdCBDQSAxIE89SG9uZ2tvbmcgUG9zdAojIExhYmVsOiAiSG9uZ2tvbmcgUG9zdCBSb290IENBIDEiCiMgU2VyaWFsOiAxMDAwCiMgTUQ1IEZpbmdlcnByaW50OiBhODowZDo2ZjozOTo3ODpiOTo0Mzo2ZDo3Nzo0Mjo2ZDo5ODo1YTpjYzoyMzpjYQojIFNIQTEgRmluZ2VycHJpbnQ6IGQ2OmRhOmE4OjIwOjhkOjA5OmQyOjE1OjRkOjI0OmI1OjJmOmNiOjM0OjZlOmIyOjU4OmIyOjhhOjU4CiMgU0hBMjU2IEZpbmdlcnByaW50OiBmOTplNjo3ZDozMzo2Yzo1MTowMDoyYTpjMDo1NDpjNjozMjowMjoyZDo2NjpkZDphMjplNzplMzpmZjpmMTowYTpkMDo2MTplZDozMTpkODpiYjpiNDoxMDpjZjpiMgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRE1EQ0NBaGlnQXdJQkFnSUNBK2d3RFFZSktvWklodmNOQVFFRkJRQXdSekVMTUFrR0ExVUVCaE1DU0VzeApGakFVQmdOVkJBb1REVWh2Ym1kcmIyNW5JRkJ2YzNReElEQWVCZ05WQkFNVEYwaHZibWRyYjI1bklGQnZjM1FnClVtOXZkQ0JEUVNBeE1CNFhEVEF6TURVeE5UQTFNVE14TkZvWERUSXpNRFV4TlRBME5USXlPVm93UnpFTE1Ba0cKQTFVRUJoTUNTRXN4RmpBVUJnTlZCQW9URFVodmJtZHJiMjVuSUZCdmMzUXhJREFlQmdOVkJBTVRGMGh2Ym1kcgpiMjVuSUZCdmMzUWdVbTl2ZENCRFFTQXhNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDCkFRRUFyUDg0dHVsbUFrbmpvclRoa1BsQWozbjU0cjE1L2dLOTdpU1NIU0wyMm9WeWFmN1hQd25VM1pHMUFwelEKalZyaFZjTlFocmtwSnNMajJhRHhhUU1vSUlCRklpMVdwenRVbFZZaVdSOG8zeDhnUFcyaU5yNGpvTEZ1dGJFbgpQemxUQ2VxcmF1aDBzc0psWEk2L2ZNTjRoTTJlRnZ6MUxrOGdLZ2lmZC9QRkhzU2FVbVllU0Y3akVBYVBJcGpoClpZNGJYU05tTzdpbE1sSElocXFocVo1L2RwVENwbXkzUWZEVnlBWTQ1dFFNNHZNN1RHMVFqTVNESjhFVGhGazkKbm5WMHR0Z0NYanFRZXNCQ05uTHNhazNjNzhRQTN4TVlWMThtZU1qV0NubDN2L2V2dDNhNXBRdUVGMTBRNm0vaApxNVVSWDIwOG8xeE5nMXZ5c3htS2dJc0xod0lEQVFBQm95WXdKREFTQmdOVkhSTUJBZjhFQ0RBR0FRSC9BZ0VECk1BNEdBMVVkRHdFQi93UUVBd0lCeGpBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQURrYlZQSzdpaDlsZWdZc0MKbUVFSWpFeTgydHZ1Snh1QzUycEY3QmFMVDRXZzg3Snd2VnFXdXNwdWJlNUdpMjduS2k2V3N4a3o2N1NmcUxJMwo3cGlvbDdZdXRtY24xS1pKL1J5VFpYYWVRaS9jSW15YVQvSmFGVG14Y2RjclVlaHRISmpBMlNyMG9ZSjcxY2xCCm9pTUJkRGhWaXcrNUxtZWlJQVEzMnB3TDB4Y2g0SStYZVRSdmhFZ0NJRE1iNWpSRW41Rnc5SUJlaEVQQ0tkSnMKRWhUa1lZMnNFSkNlaEZDNzhKWnZSWitLODhwc1Qvb1JPaFVWUnNQTkg0TmJMVUVTN1ZCblFSTTlJYXVVaXFwTwpmTUd4KzZmV3RTY3ZsNnR1NEIzaTBSd3NIMFRpL0w2Um9aejcxaWxUYzRhZlU5aEREbDNXWTRKeEhZQjB5dmJpCkFtdlpXZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1TZWN1cmVTaWduIFJvb3RDQTExIE89SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLgojIFN1YmplY3Q6IENOPVNlY3VyZVNpZ24gUm9vdENBMTEgTz1KYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuCiMgTGFiZWw6ICJTZWN1cmVTaWduIFJvb3RDQTExIgojIFNlcmlhbDogMQojIE1ENSBGaW5nZXJwcmludDogYjc6NTI6NzQ6ZTI6OTI6YjQ6ODA6OTM6ZjI6NzU6ZTQ6Y2M6ZDc6ZjI6ZWE6MjYKIyBTSEExIEZpbmdlcnByaW50OiAzYjpjNDo5Zjo0ODpmODpmMzo3MzphMDo5YzoxZTpiZDpmODo1YjpiMTpjMzo2NTpjNzpkODoxMTpiMwojIFNIQTI1NiBGaW5nZXJwcmludDogYmY6MGY6ZWU6ZmI6OWU6M2E6NTg6MWE6ZDU6Zjk6ZTk6ZGI6NzU6ODk6OTg6NTc6NDM6ZDI6NjE6MDg6NWM6NGQ6MzE6NGY6NmY6NWQ6NzI6NTk6YWE6NDI6MTY6MTIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURiVENDQWxXZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRVUZBREJZTVFzd0NRWURWUVFHRXdKS1VERXIKTUNrR0ExVUVDaE1pU21Gd1lXNGdRMlZ5ZEdsbWFXTmhkR2x2YmlCVFpYSjJhV05sY3l3Z1NXNWpMakVjTUJvRwpBMVVFQXhNVFUyVmpkWEpsVTJsbmJpQlNiMjkwUTBFeE1UQWVGdzB3T1RBME1EZ3dORFUyTkRkYUZ3MHlPVEEwCk1EZ3dORFUyTkRkYU1GZ3hDekFKQmdOVkJBWVRBa3BRTVNzd0tRWURWUVFLRXlKS1lYQmhiaUJEWlhKMGFXWnAKWTJGMGFXOXVJRk5sY25acFkyVnpMQ0JKYm1NdU1Sd3dHZ1lEVlFRREV4TlRaV04xY21WVGFXZHVJRkp2YjNSRApRVEV4TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUEvWGVxcFJ5UUJUdkxUSnN6Cmkxb1VSYVRua0JiUjMxZlNJUkNrRi8zZnJOWWZwK1RiZlBmczM3Z0QycFJZL1YxeWZJdy9Yd0ZuZEJXVzR3STgKaDl1dXl3R093dk5teG9WRjlBTEdPclZpc3EvNm5MK2s1dFNBTUpqekRiYVRqNm5VMkRieXNQeUt5aXloRlRPVgpNZHJBRy9MdVlwbUdZeisvM1pNcWc2aDJ1Uk1mdDg1T1FvV1BJdWN1R3ZLVkNiSUZ0VVJPZDZFZ3ZhbnlUZ3A5ClVLMzFCUTFGVDBaeC9TZytVL3NFMkMzWFpSMUtHL3JQTzdBeG1qVnV5SXNHMHdDUjhwUUlaVXl4TkFZQWVvbmkKOE1jRFdjL1YxdWluTXJQbW1FQ0d4YzBuRW92TWU4NjNFVHhpWUFjalBpdEFicFNBQ1cyMnMyOTNielVJVVBzQwpoOFUraVFJREFRQUJvMEl3UURBZEJnTlZIUTRFRmdRVVcvaE5UN0tsaHRRNjB2RmptcUMrQ2ZaWHQ5NHdEZ1lEClZSMFBBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUIKQUtDaE9CWm1McWRXSHlHY0J2b2Q3YmtpeFRnbTJFNVA3S04vZWQ1R0lhR0hkNDhIQ0pxeXBNV3ZEektZQzN4bQpLYmFiZlNWU1NVT3JUQzRyYm5wd3J4WU80d0pzKzBMbUdKMUYyRlhJNkR2ZDUrSDBMZ3NjTkZ4c1dFcjdqSWhRClg1VWN2KzJySXJWbHM0VzZuZys0cmVWNkc0cFFPaDI5RGJ4N1ZGQUx1VUt2VmFBWWdhMWxtZSsrNUp5L3hJV3IKUWJKVWI5d2x6ZTE0NG80TWpRbEozV043V21tV0FpR292VkpaNlgwMXk4aFN5bitCL3RscjAvY1I3U1hmK09mNQpwUHB5bDRSVERhWFFNaGhSZGxrVWJBL3I3RitBakhWRGc4T0ZtUDlNbmkwTjVIZURrMDYxbGdlTEtCT2JqQm1OClFTZEpRTzdlNWlORU9keWhJdGE2QS9JPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049TWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQSAyMDA5IE89TWljcm9zZWMgTHRkLgojIFN1YmplY3Q6IENOPU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOSBPPU1pY3Jvc2VjIEx0ZC4KIyBMYWJlbDogIk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOSIKIyBTZXJpYWw6IDE0MDE0NzEyNzc2MTk1Nzg0NDczCiMgTUQ1IEZpbmdlcnByaW50OiBmODo0OTpmNDowMzpiYzo0NDoyZDo4MzpiZTo0ODo2OTo3ZDoyOTo2NDpmYzpiMQojIFNIQTEgRmluZ2VycHJpbnQ6IDg5OmRmOjc0OmZlOjVjOmY0OjBmOjRhOjgwOmY5OmUzOjM3OjdkOjU0OmRhOjkxOmUxOjAxOjMxOjhlCiMgU0hBMjU2IEZpbmdlcnByaW50OiAzYzo1Zjo4MTpmZTphNTpmYTpiODoyYzo2NDpiZjphMjplYTplYzphZjpjZDplODplMDo3NzpmYzo4NjoyMDphNzpjYTplNTozNzoxNjozZDpmMzo2ZTpkYjpmMzo3OAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUNqQ0NBdktnQXdJQkFnSUpBTUorUXdST1J6OFpNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1JR0NNUXN3Q1FZRApWUVFHRXdKSVZURVJNQThHQTFVRUJ3d0lRblZrWVhCbGMzUXhGakFVQmdOVkJBb01EVTFwWTNKdmMyVmpJRXgwClpDNHhKekFsQmdOVkJBTU1IazFwWTNKdmMyVmpJR1V0VTNwcFoyNXZJRkp2YjNRZ1EwRWdNakF3T1RFZk1CMEcKQ1NxR1NJYjNEUUVKQVJZUWFXNW1iMEJsTFhONmFXZHVieTVvZFRBZUZ3MHdPVEEyTVRZeE1UTXdNVGhhRncweQpPVEV5TXpBeE1UTXdNVGhhTUlHQ01Rc3dDUVlEVlFRR0V3SklWVEVSTUE4R0ExVUVCd3dJUW5Wa1lYQmxjM1F4CkZqQVVCZ05WQkFvTURVMXBZM0p2YzJWaklFeDBaQzR4SnpBbEJnTlZCQU1NSGsxcFkzSnZjMlZqSUdVdFUzcHAKWjI1dklGSnZiM1FnUTBFZ01qQXdPVEVmTUIwR0NTcUdTSWIzRFFFSkFSWVFhVzVtYjBCbExYTjZhV2R1Ynk1bwpkVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFPbjRqL05qcmRxRzJLZmdRdnZQCmtkNm1KdmlacFdOd3JadXV5ak5BZlcyV2JxRU9STzdoRTUyVVFsS2F2WFdGZEN5b0RoMlR0aGkzakN5b3ovdGMKY2JuYTdQN29mby9rTHgyeXFIV0gyTGVoNVR2UG1VcEcwSU1aZmNDaEVoeVZiVXIwMk1lbFRUTXVoVGxBZFg0VQpmSUFTbUZESFFXZTRvSUJoVktac1RoL2duUTRINmNtNk0rZit3RlVvTEFLQXB4bjFudHhWVXdPWGV3ZEkvNW43Ck40b2t4Rm5NVUJCampxcXBHckNFR29iNVg3dXhVRzZrMFFyTTFYRitINmNiZlBWVGJpSmZ5eXZtMUh4ZHJ0YkMKeGt6bEJRSFo3VmY4d1NONS9QcklKSU9WODdWcVVRSFFkOWJwRXFINUdvUDdnaHU1c0pmMGRnWXpRMG1nL3d1MQorclVDQXdFQUFhT0JnREIrTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnRUdNQjBHCkExVWREZ1FXQkJUTEQ4YmZRa1BNUGN1MVNDT2hHbnFtS3JzMGFEQWZCZ05WSFNNRUdEQVdnQlRMRDhiZlFrUE0KUGN1MVNDT2hHbnFtS3JzMGFEQWJCZ05WSFJFRUZEQVNnUkJwYm1adlFHVXRjM3BwWjI1dkxtaDFNQTBHQ1NxRwpTSWIzRFFFQkN3VUFBNElCQVFESjBRNWVMdFhNczN3K3kvdzkvdzBvbFpNRXlML2F6WG00UTVEd3BMN3Y4dThoCm1MelUxRjBHOXU1QzdEQnNvS3FweXZHdml2by9DM05xUHVvdVFINGZybFJoZWVzdUNEZlhJL09Nbjc0ZHNlR2sKZGR1ZzRsUVVzYm9jS2FRWTloSzZvaFFVNHpFMXlFRC90K0FGZGxmQkhGbnkrTC9rN1NWaVhJVHdmbjRmczc3NQp0eUVSekFNQlZuQ25FSkllR3pTQkhxMmNHc01FUE8wQ1lkWWVCdk5mT29meUsvRkZoK1U5ck5ISFY0UzlhNjdjCjJQbTJHMkp3Q3owMnlVTHlNdGQ2WWViUzJ6M1B5S25KbTl6YldFVFhieml2ZjNqVG82MGFkYm9jd1RaOGp4NXQKSE1OMVJxNDFCYWIyWEQwaDdsYnd5WUlpTFhwVXEzRERmU0psZ25DVwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049R2xvYmFsU2lnbiBPPUdsb2JhbFNpZ24gT1U9R2xvYmFsU2lnbiBSb290IENBIC0gUjMKIyBTdWJqZWN0OiBDTj1HbG9iYWxTaWduIE89R2xvYmFsU2lnbiBPVT1HbG9iYWxTaWduIFJvb3QgQ0EgLSBSMwojIExhYmVsOiAiR2xvYmFsU2lnbiBSb290IENBIC0gUjMiCiMgU2VyaWFsOiA0ODM1NzAzMjc4NDU5NzU5NDI2MjA5OTU0CiMgTUQ1IEZpbmdlcnByaW50OiBjNTpkZjpiODo0OTpjYTowNToxMzo1NTplZToyZDpiYToxYTpjMzozZTpiMDoyOAojIFNIQTEgRmluZ2VycHJpbnQ6IGQ2OjliOjU2OjExOjQ4OmYwOjFjOjc3OmM1OjQ1Ojc4OmMxOjA5OjI2OmRmOjViOjg1OjY5Ojc2OmFkCiMgU0hBMjU2IEZpbmdlcnByaW50OiBjYjpiNToyMjpkNzpiNzpmMToyNzphZDo2YTowMToxMzo4Njo1YjpkZjoxYzpkNDoxMDoyZTo3ZDowNzo1OTphZjo2Mzo1YTo3YzpmNDo3MjowZDpjOTo2MzpjNTozYgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFh6Q0NBa2VnQXdJQkFnSUxCQUFBQUFBQklWaFRDS0l3RFFZSktvWklodmNOQVFFTEJRQXdUREVnTUI0RwpBMVVFQ3hNWFIyeHZZbUZzVTJsbmJpQlNiMjkwSUVOQklDMGdVak14RXpBUkJnTlZCQW9UQ2tkc2IySmhiRk5wCloyNHhFekFSQmdOVkJBTVRDa2RzYjJKaGJGTnBaMjR3SGhjTk1Ea3dNekU0TVRBd01EQXdXaGNOTWprd016RTQKTVRBd01EQXdXakJNTVNBd0hnWURWUVFMRXhkSGJHOWlZV3hUYVdkdUlGSnZiM1FnUTBFZ0xTQlNNekVUTUJFRwpBMVVFQ2hNS1IyeHZZbUZzVTJsbmJqRVRNQkVHQTFVRUF4TUtSMnh2WW1Gc1UybG5iakNDQVNJd0RRWUpLb1pJCmh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTXdsZHBCNUJuZ2lGdlhBZzdhRXlpaWUvUVYyRWNXdGlITDgKUmdKRHg3S0tuUVJmSk1zdVMrRmdna2JoVXFzTWdVZHdiTjFrMGV2MUxLTVBnajBNSzY2WDE3WVVoaEI1dXpzVApnSGVNQ09GSjBtcGlMeDllK3BabzM0a25sVGlmQnRjK3ljc21XUTF6M3JESTZTWU9neFhHNzF1TDBnUmd5a21tCktQWnBPL2JMeUNpUjVaMktZVmMzckhRVTNIVGdPdTV5THk2Yys5Qzd2L1U5QU9FR00raUNLNjVUcGpvV2M0emQKUVE0Z09zQzBwNkhwc2srUUxqSmc2VmZMdVFTU2FHamxPQ1pnZGJLZmQvK1JGTyt1SUVuOHJVQVZTTkVDTVdFWgpYcmlYNzYxM3QyU2Flcjlmd1JQdm0yTDdEV3pnVkdrV3FRUGFidW1EazNGMnhtbUZnaGNDQXdFQUFhTkNNRUF3CkRnWURWUjBQQVFIL0JBUURBZ0VHTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRkkvd1MzK28KTGtVa3JrMVErbU9haTk3aTNSdThNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUJMUU52QVVLcit5QXp2OTVaVQpSVW03bGdBSlFheXpFNGFHS0Fjenltdm1kTG02QUMydXBBclQ5Zkh4RDRxL2MyZEtnOGRFZTNqZ3IyNXNid01wCmpqTTVSY09PNUxsWGJLcjhFcGJzVThZdDVDUnN1WlJqKzl4VGFHZFdQb080enpVaHc4bG8vczdhd2xPcXpKQ0sKNmZCZFJveVYzWHBZS0JvdkhkN05BRGRCaisxRWJkZFRLSmQrODJjRUhoWFhpcGEwMDk1TUo2Uk1HM056ZHZRWAptY0lmZWc3akxRaXRDaHdzL3p5clZRNFBrWDQyNjhOWFNiN2hMaTE4WUl2RFFWRVRJNTNPOXpKcmxBR29tZWNzCk14ODZPeVhTaGtET095eUdlTWxoTHhTNjd0dFZiOStFN2dVSlRiMG8ySExPMDJKUVpSN3JrcGVETWRtenRjcEgKV0Q5ZgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QXV0b3JpZGFkIGRlIENlcnRpZmljYWNpb24gRmlybWFwcm9mZXNpb25hbCBDSUYgQTYyNjM0MDY4CiMgU3ViamVjdDogQ049QXV0b3JpZGFkIGRlIENlcnRpZmljYWNpb24gRmlybWFwcm9mZXNpb25hbCBDSUYgQTYyNjM0MDY4CiMgTGFiZWw6ICJBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgiCiMgU2VyaWFsOiA2MDQ3Mjc0Mjk3MjYyNzUzODg3CiMgTUQ1IEZpbmdlcnByaW50OiA3MzozYTo3NDo3YTplYzpiYjphMzo5NjphNjpjMjplNDplMjpjODo5YjpjMDpjMwojIFNIQTEgRmluZ2VycHJpbnQ6IGFlOmM1OmZiOjNmOmM4OmUxOmJmOmM0OmU1OjRmOjAzOjA3OjVhOjlhOmU4OjAwOmI3OmY3OmI2OmZhCiMgU0hBMjU2IEZpbmdlcnByaW50OiAwNDowNDo4MDoyODpiZjoxZjoyODo2NDpkNDo4Zjo5YTpkNDpkODozMjo5NDozNjo2YTo4Mjo4ODo1Njo1NTozZjozYjoxNDozMDozZjo5MDoxNDo3Zjo1ZDo0MDplZgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJR0ZEQ0NBL3lnQXdJQkFnSUlVK3c3N3Z1eVNGOHdEUVlKS29aSWh2Y05BUUVGQlFBd1VURUxNQWtHQTFVRQpCaE1DUlZNeFFqQkFCZ05WQkFNTU9VRjFkRzl5YVdSaFpDQmtaU0JEWlhKMGFXWnBZMkZqYVc5dUlFWnBjbTFoCmNISnZabVZ6YVc5dVlXd2dRMGxHSUVFMk1qWXpOREEyT0RBZUZ3MHdPVEExTWpBd09ETTRNVFZhRncwek1ERXkKTXpFd09ETTRNVFZhTUZFeEN6QUpCZ05WQkFZVEFrVlRNVUl3UUFZRFZRUURERGxCZFhSdmNtbGtZV1FnWkdVZwpRMlZ5ZEdsbWFXTmhZMmx2YmlCR2FYSnRZWEJ5YjJabGMybHZibUZzSUVOSlJpQkJOakkyTXpRd05qZ3dnZ0lpCk1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRREtsbXVPNnZqNzhhSTE0SDlNMnVERFV0ZDkKdGhESUFsNnpReXJFVDJxeXloeGRLSnA0RVJwcFdWZXZ0U0JDNUlzUDV0OWJwZ09TTC9VUjVHTFhNbkU0MlFRTQpjYXM5VVg0UEI5OWpCVnpwdjVSdndTbUN3TFRhVWJEQlBMdXROMHBjeXZGTE5nNGtxNy9EaEhmOXFGRDBzZWZHCkw5SXRXWTE2Q2s2V2FWSUNxamFZN1B6NkZJTU1OeC9Ka2pkLzE0RXQ1Y1M1NEQ0MC9tZjBQbWJSMC9SQXoxNWkKTkE5d0JqNGdHRnJPOTNJYkpXeVRkQlNUbzNPeERxcUhFQ05aWHlBRkdVZnRhSTZTRXNwZC9OWXJzcEk4SU0vaApYNjhndnFCMmYzYmw3QnFHWVRNKzUzdTBQNkFQanFLNWFtKzVoeVp2UVd5SXBsRDlhbU1MOVpNV0d4bVBzdTJiCm04bVE5UUVNM3hrOUR6NDRJOGt2and6UkF2NGJWZFpPMEkwOHIwK2s4LzZ2S3RNRm5Ya0lvY3RYTWJTY3lKQ3kKWi9RWUZwTTYvRWZZMFhpV01SKzZLd3hmWFptdFk0bGFKQ0IyMk4vOXEwNm1JcXFkWHVZbmluMW9LYVBuaXJqYQpFYnNYTFptZEV5Ukc5OFhpMkorT2Y4ZVBkRzFhc3VoeTlhenVKQkN0THhUYS95MmFSbkZIdmtMZnV3SGI5SC9UCktJOHhXVnZUeVFLbXRGTEticGY3UThVSUptK0s5THY5bnlpcURkVkY4eE02SGRqQWVJOUJaendlbEdTdWV3dkYKNk5rQmlEa2FsNFprUWRVN2h3eHUrZy9HdlVnVXZ6bE4xSjVCdG8rV0hXT1drOW1WQm5neGFKNDNCanVBaVVWaApPU1BIRzBTakZlVWMrSkl3dXdJREFRQUJvNEh2TUlIc01CSUdBMVVkRXdFQi93UUlNQVlCQWY4Q0FRRXdEZ1lEClZSMFBBUUgvQkFRREFnRUdNQjBHQTFVZERnUVdCQlJsemV1ck5SNEFQbjdWZE1BY3RITkhEaHBrTHpDQnBnWUQKVlIwZ0JJR2VNSUdiTUlHWUJnUlZIU0FBTUlHUE1DOEdDQ3NHQVFVRkJ3SUJGaU5vZEhSd09pOHZkM2QzTG1acApjbTFoY0hKdlptVnphVzl1WVd3dVkyOXRMMk53Y3pCY0JnZ3JCZ0VGQlFjQ0FqQlFIazRBVUFCaEFITUFaUUJ2CkFDQUFaQUJsQUNBQWJBQmhBQ0FBUWdCdkFHNEFZUUJ1QUc4QWRnQmhBQ0FBTkFBM0FDQUFRZ0JoQUhJQVl3QmwKQUd3QWJ3QnVBR0VBSUFBd0FEZ0FNQUF4QURjd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dJQkFCZDlvUG0wM2NYRgo2NjFMSkxXaEFxdmRwWWhLc2c5VlN5dFhqRHZsTWQzK3hETHg1MXRrbGpZeUdPeWxNbmZYNDBTMndCRXFnTGs5CmFtNThtOU90L01QV28rWmtLWHpSNFRnZWdpdi9KMld2K3hZVnhDNXhoT1cxLy9xa1I3MWtNcnYySllTaUowTDEKSUxEQ0V4QVJ6UkFWdWtLUUt0SkU0WlltNnpGSUV2MHEyc2tHejNRZXFVdlZoeWo1ZVRTU1BpNUU2UGFQVDQ4MQpQeVd6T2R4aktwQnJJRi9FVWhKT2x5d3FySjJYM2tqeW8yYmJ3dEtEbGFabXA1NGxEK2tMTTVGbENsckQyVlFTCjNhL0RUZzRmSmw0TjNMT043TldCY043U1R5UUY4MnhPOVV4SlpvM1IvOUlMSlVGSS9sR0V4a0t2Z0FUUDBINWsKU2VUeTM2THNzVXpBS2gzbnRMRmxvc1M4OFpqMHFuQUhZN1M0Mmp0TStrQWlNRnNScHZBRkRzWUNBMGlyaHB1RgozZHZkNnFKMmdITjk5WndFeEVXTjU3a2NpNTdxMTNYUmNySGVkVVRuUW4zaVYydDkzSm04UFlNbzZvQ1RqY1ZNClpjRndnYmc0L0VNeHN2WURORWV5clBzaUJzc2UzUmRISEY5bXVkTWFvdG9Sc2FTOEk4bmt2b2YvdVpTMitGMGcKU3RSZjU3MW9lMlh5RlI3U09xa3Q2ZGhySkt5WFdFUkhyVmtZOFNGbGNON09OR0NvUVBIelBLVERLQ09NL2ljegpRMENnRnp6cjZqdXdjcWFqdVVwTFhoWkk5TEs4eUl5U3haMmZySEkydkRTQU5HdXBpNUxBdUJmdDdIWlQ5U1FCCmpMTWk2RXQ4VmNhZCtxTVV1MldGYm01UEVuNEtQSjJWCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1JemVucGUuY29tIE89SVpFTlBFIFMuQS4KIyBTdWJqZWN0OiBDTj1JemVucGUuY29tIE89SVpFTlBFIFMuQS4KIyBMYWJlbDogIkl6ZW5wZS5jb20iCiMgU2VyaWFsOiA5MTc1NjMwNjU0OTAzODkyNDE1OTU1MzY2ODY5OTE0MDI2MjEKIyBNRDUgRmluZ2VycHJpbnQ6IGE2OmIwOmNkOjg1OjgwOmRhOjVjOjUwOjM0OmEzOjM5OjkwOjJmOjU1OjY3OjczCiMgU0hBMSBGaW5nZXJwcmludDogMmY6Nzg6M2Q6MjU6NTI6MTg6YTc6NGE6NjU6Mzk6NzE6YjU6MmM6YTI6OWM6NDU6MTU6NmY6ZTk6MTkKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDI1OjMwOmNjOjhlOjk4OjMyOjE1OjAyOmJhOmQ5OjZmOjliOjFmOmJhOjFiOjA5OjllOjJkOjI5OjllOjBmOjQ1OjQ4OmJiOjkxOjRmOjM2OjNiOmMwOmQ0OjUzOjFmCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGOFRDQ0E5bWdBd0lCQWdJUUFMQzNXaFpJWDcvaHkvV0wxeG5tZlRBTkJna3Foa2lHOXcwQkFRc0ZBREE0Ck1Rc3dDUVlEVlFRR0V3SkZVekVVTUJJR0ExVUVDZ3dMU1ZwRlRsQkZJRk11UVM0eEV6QVJCZ05WQkFNTUNrbDYKWlc1d1pTNWpiMjB3SGhjTk1EY3hNakV6TVRNd09ESTRXaGNOTXpjeE1qRXpNRGd5TnpJMVdqQTRNUXN3Q1FZRApWUVFHRXdKRlV6RVVNQklHQTFVRUNnd0xTVnBGVGxCRklGTXVRUzR4RXpBUkJnTlZCQU1NQ2tsNlpXNXdaUzVqCmIyMHdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFESjAzcktEeDZzcDRib0ZtVnEKc2NJYlJUSnhsZG4rRUZ2TXIrZWxlUUdQaWNQSzhsVng5M2UrZDVUemNxUXNSTmlla3BzVU9xSG5KSkFLQ2xhTwp4ZGdtbE9IWlNPRXRQdG9LY3Qyam1SWGFnYUtIOUh0dUpuZUpXSzNXNnd5eVFYcHpibTNiZW5oQjZRaUlFbjZICkxtWVJZMnhVK3p5ZGNzQzhMdi9DdDkwTmR1TTYxL2UwYUw2aTllT0Jic0ZHYjEyTjRFM0dWRldKR2pNeENyRlgKdWFPS21NUHNPelRGbFVGcGZuWENQQ0RGWWJwUlI2QWdrSk9oa0V2elRueUZSVlNhMFFVbVFiQzFUUjB6dnNRRAp5Q1Y4d1hEYk8vUUpMVlFuU0t3djRjU3NQc2pMa2t4VE9UY2o3Tk1CK2VBSlJFMU5aTURoRFZxSElyeXRHNlArCkpyVVY4NmY4aEJucDdLR0l0RVJwaElQemlkRjBCcW5NQzliQzNpZUZVQ2JLRjdqSmVvZFdMQm9CSG15K0U2MFEKckxVazlUaVJvZFpMMnZHNzB0NUh0Zkc4Z2ZaWmE4OFpVK21ORmN0S3k2bHZST1ViUWMvaGhxZkswR3FmdkV5TgpCak5hb29YbGtEV2dZbHdXVHZEam92b0RHclFzY2JOWUxONTdDOXNhRCt2ZUlSOEdkd1lEc01udm1mekF1VThMCmhpaiswcm5xNDlxbHcwZHBFdURiOFBZWmkrMTdjTmNDMXUySEdDZ3NCQ1JNZCtSSWlockdPNXJVRDhyNmRkSUIKUUZxTmViK0x6MHZQcWhiQmxlU3RUSW8rRjVIVXNXTGxndVdBQktRRGZvMi8ybitpRDVkUEROTU4rOWZSNVhKKwpITWgzLzF1YUQ3ZXVCVWJsOGFnVzdFZWtGd0lEQVFBQm80SDJNSUh6TUlHd0JnTlZIUkVFZ2Fnd2dhV0JEMmx1ClptOUFhWHBsYm5CbExtTnZiYVNCa1RDQmpqRkhNRVVHQTFVRUNndytTVnBGVGxCRklGTXVRUzRnTFNCRFNVWWcKUVRBeE16TTNNall3TFZKTlpYSmpMbFpwZEc5eWFXRXRSMkZ6ZEdWcGVpQlVNVEExTlNCR05qSWdVemd4UXpCQgpCZ05WQkFrTU9rRjJaR0VnWkdWc0lFMWxaR2wwWlhKeVlXNWxieUJGZEc5eVltbGtaV0VnTVRRZ0xTQXdNVEF4Ck1DQldhWFJ2Y21saExVZGhjM1JsYVhvd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUMKQVFZd0hRWURWUjBPQkJZRUZCMGNaUTZvOGlWN3RKSFA1TEd4NXIxVmRHd0ZNQTBHQ1NxR1NJYjNEUUVCQ3dVQQpBNElDQVFCNHBnd1dTcDlNaURyQXl3NmxGbjJmdVVoZkdJOE5ZamIyelJscnJLdlY5cEY5cm5IelA3TU9lSVdiCmxhUW5JVWRDU254SU92VkZmTE1NamxGNHJKVVQzc2I5ZmJnYWtFeXJrZ1BIN1VJQnpnL1lzZnFpa3VGZ2JhNTYKYXdtcXhpbnVhRWxuTUlBa2VqRVdPVnQrOFJ3dTNXd0pyZkl4d1lKT3VidjV2cjhxaFQvQVFLTTZXZnhaU3p3bwpKTnUwRlhXdURZaTZMblBBdlZpSDVVTHk2MTd1SGpBaW1jczMwY1FoYklIc3ZtMG01aHprUWlDZVI3Q3NnMWx3CkxEWFdyelkwdE0wNytES283K040aWZ1TlJTemFuTGgrUUJ4aDV6NmlraXhMOHMzNm1MWXAvL1B5ZTZrZkxxQ1QKVnl2ZWhRUDVhVGZMbm5ocUJiVEZNWGlKN0hxbmhlRzVlenpldmg1NWhNNmZjQTVad2pVdWtDb3gyZVJGZWtHawpMaE9iTkE1bWUwbXJaSmZRUnNONW5YSlFZNmFZV3dhOVNHM1lPWU53NkRYd0JkR3F2T1BieUFMcWZQMkMyc0piClVqV3VtRHF0dWpXVEk2Y2ZTTjAxUnBpeUVHamtwVEhDQ2xndUdZRVF5VkIxL09wYUZzNFIxKzd2VUlndFlmOC8KUW5NRmxFUFZqanhPQVRvWnBSOUdUbmZRWGVXQklpR0gvcFI5aE5pVHJkWm9RMGl5Mit0ekpPZVJmMVNrdG9BKwpuYU04VEhMQ1Y4U2cxTXc0Sjg3VkJwNmlTTm5wbjg2Q2NEYVRtanZmbGlIaldiY00ycEUzOFAxWldyT1p5R2xzClF5WUJOV05nVllrRE9uWFl1a3JaVlAvdTNvRFlMZEU0MVY0dEM1aDlQbXpiL0NhSXh3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUNoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4IE89QUMgQ2FtZXJmaXJtYSBTLkEuCiMgU3ViamVjdDogQ049Q2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDggTz1BQyBDYW1lcmZpcm1hIFMuQS4KIyBMYWJlbDogIkNoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4IgojIFNlcmlhbDogMTE4MDY4MjI0ODQ4MDE1OTcxNDYKIyBNRDUgRmluZ2VycHJpbnQ6IDVlOjgwOjllOjg0OjVhOjBlOjY1OjBiOjE3OjAyOmYzOjU1OjE4OjJhOjNlOmQ3CiMgU0hBMSBGaW5nZXJwcmludDogNzg6NmE6NzQ6YWM6NzY6YWI6MTQ6N2Y6OWM6NmE6MzA6NTA6YmE6OWU6YTg6N2U6ZmU6OWE6Y2U6M2MKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDA2OjNlOjRhOmZhOmM0OjkxOmRmOmQzOjMyOmYzOjA4OjliOjg1OjQyOmU5OjQ2OjE3OmQ4OjkzOmQ3OmZlOjk0OjRlOjEwOmE3OjkzOjdlOmUyOjlkOjk2OjkzOmMwCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlIVHpDQ0JUZWdBd0lCQWdJSkFLUGFRbjZrc2E3YU1BMEdDU3FHU0liM0RRRUJCUVVBTUlHdU1Rc3dDUVlEClZRUUdFd0pGVlRGRE1FRUdBMVVFQnhNNlRXRmtjbWxrSUNoelpXVWdZM1Z5Y21WdWRDQmhaR1J5WlhOeklHRjAKSUhkM2R5NWpZVzFsY21acGNtMWhMbU52YlM5aFpHUnlaWE56S1RFU01CQUdBMVVFQlJNSlFUZ3lOelF6TWpnMwpNUnN3R1FZRFZRUUtFeEpCUXlCRFlXMWxjbVpwY20xaElGTXVRUzR4S1RBbkJnTlZCQU1USUVOb1lXMWlaWEp6CklHOW1JRU52YlcxbGNtTmxJRkp2YjNRZ0xTQXlNREE0TUI0WERUQTRNRGd3TVRFeU1qazFNRm9YRFRNNE1EY3oKTVRFeU1qazFNRm93Z2E0eEN6QUpCZ05WQkFZVEFrVlZNVU13UVFZRFZRUUhFenBOWVdSeWFXUWdLSE5sWlNCagpkWEp5Wlc1MElHRmtaSEpsYzNNZ1lYUWdkM2QzTG1OaGJXVnlabWx5YldFdVkyOXRMMkZrWkhKbGMzTXBNUkl3CkVBWURWUVFGRXdsQk9ESTNORE15T0RjeEd6QVpCZ05WQkFvVEVrRkRJRU5oYldWeVptbHliV0VnVXk1QkxqRXAKTUNjR0ExVUVBeE1nUTJoaGJXSmxjbk1nYjJZZ1EyOXRiV1Z5WTJVZ1VtOXZkQ0F0SURJd01EZ3dnZ0lpTUEwRwpDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ3ZBTXR3Tnl1QVdrbzZiSGlVZmFOL0doLzJOZFc5CjI4c05SSEkrSnJLUVVycGpPeWhZYjZXemJaU204OTFrREZYMjl1ZnlJaUtBWHVGaXhyWXA0WUZzOHIvbGZUSnEKVktBeUdWbitINHZYUFdDR2hTUnY0eEd6ZHo0Z2xqVWhhN01JMlhBdVpQZUVrbFBXRHJDUWlvcmpoNDBHMDcyUQpEdUtab1J1R0R0cWFDcnNMWVZBR1V2R2VmM2JzeXcvUUhnM1BtVEE5SE1SRkVGaXMxdFBvMStYcXhRRUhkOVpSCjVnTi9pa2lsVFdoMXVlbThuazRaY2ZVeVM1eHRZQmtMKzh5ZGRkeS9KczJQazNnNWVYTmVKUTdLWE90M0VnZkwKWkVGSGNwT3JVTVByQ1haa05OSTV0M1lSQ1ExMlJjU3ByajFxcjdWOVpTK1VXQkRzWEh5dmZ1SzJHTm5RbTA1YQpTZCtwWmd2TVBNWjRmS2VjSGVQT2psTytCZDVnRDJ2bEd0cy80K0VoeVNuQjhlc0huRkliQVVSUlBIc2wxOFRsClVsUmRKUWZLRmlDNHJlUkI3bm9JL3Bsdmc2YVJBckJzTmxWcTUzMzFsdWJLZ2RhWDhaU0Q2ZTJ3c1dzU2FSNnMKKzEycHhaanB0RnRZZXI0OW9rUTZZMW5VQ3lYZUcwKzk1UUdlemRJcDFaOFhHUXB2dnd5UTB3bGYyZU9LTmN4NQpXazBaTjVLM3hNR3RyL1I1SkpxeUFRdXhyMXlXODRBeSsxdzltUEdnUDByZXZxK1VMdGxWbWhkdVlKMWpiTGhqCnlhNkJYQmcxNEpDN3ZqeFBOeUs1ZnV2UG5uY2hwajA0Z2Z0STJqRTlLK09KOWRDMXZYN2dVTVFTaWJNam1oQXgKaGR1dWIrODRNeGgyRVFJREFRQUJvNElCYkRDQ0FXZ3dFZ1lEVlIwVEFRSC9CQWd3QmdFQi93SUJEREFkQmdOVgpIUTRFRmdRVStTU3NEN0sxK0huQSttQ0lHOFRaVFFLZUZ4a3dnZU1HQTFVZEl3U0IyekNCMklBVStTU3NEN0sxCitIbkErbUNJRzhUWlRRS2VGeG1oZ2JTa2diRXdnYTR4Q3pBSkJnTlZCQVlUQWtWVk1VTXdRUVlEVlFRSEV6cE4KWVdSeWFXUWdLSE5sWlNCamRYSnlaVzUwSUdGa1pISmxjM01nWVhRZ2QzZDNMbU5oYldWeVptbHliV0V1WTI5dApMMkZrWkhKbGMzTXBNUkl3RUFZRFZRUUZFd2xCT0RJM05ETXlPRGN4R3pBWkJnTlZCQW9URWtGRElFTmhiV1Z5ClptbHliV0VnVXk1QkxqRXBNQ2NHQTFVRUF4TWdRMmhoYldKbGNuTWdiMllnUTI5dGJXVnlZMlVnVW05dmRDQXQKSURJd01EaUNDUUNqMmtKK3BMR3UyakFPQmdOVkhROEJBZjhFQkFNQ0FRWXdQUVlEVlIwZ0JEWXdOREF5QmdSVgpIU0FBTUNvd0tBWUlLd1lCQlFVSEFnRVdIR2gwZEhBNkx5OXdiMnhwWTNrdVkyRnRaWEptYVhKdFlTNWpiMjB3CkRRWUpLb1pJaHZjTkFRRUZCUUFEZ2dJQkFKQVNyeUkxd3FNNThDN2U2YlhwZUh4SXZqOTlSWkplNmRxeEdmd1cKUEorMFcyYWVhdWZEdVYySTZBK3R6eU1QM2lVNlhzeFBwY0cxTGF3azBsZ0gzcUxQYVlSZ00rZ1FEUk9wSTlDRgo1WTU3cHA0OWNoTnlNL1dxZmNaakh3ajAvZ0YvSk04ckxGUUozdUlyYlpMR09VOFc2angrZWtiVVJXcEdxT3QxCmdsYW5xNkI4YUJNejlwMHc4RzhuT1NRaktwRDlrQ2sxOHBQZk5LWEc5L2p2akE5aVNueXUwL1ZVK0kyMm1sYUgKRm9JNk02dGFJZ2ozZ3JycUx1QkhtclMxUmFNRk85bmNMa1ZBTytyY2YrZzc2OUhzSnRnMXBEREZPcXhYbnJOMgpwU0I3K1I1S0JXSUJwaWgxWUplU0RXNCtUVGRERFpJVm5CZ2l6Vkdab0NrYVBGK0tNak5iTU1lSkwwZVlENk1ECnh2YnhyTjh5OE5tQkd1U2N2ZmFBRlBEUkxMbUY5ZGlqc2NpbEllVWNFNWZ1RHIzZkthbnZORk5iMCtScUU0UUcKdGpJQ3hGS3VJdExjc2lGQ0d0cEE4Q25KN0FvTVhPTFF1c3hJMHpjS3pCSUtpbm13UFFOL2FVdjBOQ0I5c3pUcQpqa3RrOVQ3OXN5Tm5GUTBFdVBBdHdRbFJQTEpzRmZDbEk5ZURkT1RsTHNuK21DZEN4cXZHbnJEUVd6aWxtMURlCmZoaVl0VVU3OW5tMDZQY2Fld2FEKzlDTDJydkh2UmlyQ0c4OGdHdEFQeGtadW1XSzVyN1ZYTk0yMSs5QVVpUmcKT0djRU1leVA4NExHM3JsVjh6c3hrVnJjdFFnVnJYWWxDZzE3TG9maURLWUd2Q1lRYlRlZDdOMTRqSHlBeGZEWgpkMGpRCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDggTz1BQyBDYW1lcmZpcm1hIFMuQS4KIyBTdWJqZWN0OiBDTj1HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDggTz1BQyBDYW1lcmZpcm1hIFMuQS4KIyBMYWJlbDogIkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwOCIKIyBTZXJpYWw6IDE0NTQxNTExNzczMTExNzg4NDk0CiMgTUQ1IEZpbmdlcnByaW50OiA5ZTo4MDpmZjo3ODowMTowYzoyZTpjMTozNjpiZDpmZTo5Njo5MDo2ZTowODpmMwojIFNIQTEgRmluZ2VycHJpbnQ6IDRhOmJkOmVlOmVjOjk1OjBkOjM1OjljOjg5OmFlOmM3OjUyOmExOjJjOjViOjI5OmY2OmQ2OmFhOjBjCiMgU0hBMjU2IEZpbmdlcnByaW50OiAxMzo2MzozNTo0Mzo5MzozNDphNzo2OTo4MDoxNjphMDpkMzoyNDpkZTo3MjoyODo0ZTowNzo5ZDo3Yjo1MjoyMDpiYjo4ZjpiZDo3NDo3ODoxNjplZTpiZTpiYTpjYQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJSFNUQ0NCVEdnQXdJQkFnSUpBTW5OMCtuVmZTUE9NQTBHQ1NxR1NJYjNEUUVCQlFVQU1JR3NNUXN3Q1FZRApWUVFHRXdKRlZURkRNRUVHQTFVRUJ4TTZUV0ZrY21sa0lDaHpaV1VnWTNWeWNtVnVkQ0JoWkdSeVpYTnpJR0YwCklIZDNkeTVqWVcxbGNtWnBjbTFoTG1OdmJTOWhaR1J5WlhOektURVNNQkFHQTFVRUJSTUpRVGd5TnpRek1qZzMKTVJzd0dRWURWUVFLRXhKQlF5QkRZVzFsY21acGNtMWhJRk11UVM0eEp6QWxCZ05WQkFNVEhrZHNiMkpoYkNCRAphR0Z0WW1WeWMybG5iaUJTYjI5MElDMGdNakF3T0RBZUZ3MHdPREE0TURFeE1qTXhOREJhRncwek9EQTNNekV4Ck1qTXhOREJhTUlHc01Rc3dDUVlEVlFRR0V3SkZWVEZETUVFR0ExVUVCeE02VFdGa2NtbGtJQ2h6WldVZ1kzVnkKY21WdWRDQmhaR1J5WlhOeklHRjBJSGQzZHk1allXMWxjbVpwY20xaExtTnZiUzloWkdSeVpYTnpLVEVTTUJBRwpBMVVFQlJNSlFUZ3lOelF6TWpnM01Sc3dHUVlEVlFRS0V4SkJReUJEWVcxbGNtWnBjbTFoSUZNdVFTNHhKekFsCkJnTlZCQU1USGtkc2IySmhiQ0JEYUdGdFltVnljMmxuYmlCU2IyOTBJQzBnTWpBd09EQ0NBaUl3RFFZSktvWkkKaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFNRGZWdFBrT3B0MlJiUVQyLy9CdGhtTE4wRVlsVkpINnhlZApLWWlPTld3R01pNUhZdk5KQkw5OVJEYXhjY3k5V2dsejFkbUZSUCtSVnlYZlhqYU9jTkZjY1VNZDJkcnZYTkw3Ckc3MDZ0Y3V0bzh4RXB3MnVJUlUvdVhwYmtuWFlwQkk0aVJtS3Q0RFM0akp2VnB5UjFvZ1FDN04wWkpKMFlQUDIKenhoUFlMSWowTWM3em1GTG1ZL0NETkJBc3BqY0RhaE9vN2tLcm1DZ3JVVlNZN3BtdldqZytiNGFxSUc3SGtGNApkZFBCL2dCVnNJZFU2Q2VRTlIxTU02MlgvSmN1bUlTL0xNbWp2OUdZRVJUdFkvakttSWhZRjVudFJRT1hmanlHCkhvaU12dktSaEk5bE5OZ0FUSDIzTVJkYUtYb0tHQ1F3b3plMWVxa0JmU2JXK1E2T1dmSDlHek8xS1RzWE8wRzIKSWQzVXdEMmxuNThmUTFESnU3eHNlcGVZN3MyTUgvdWNVYTZMY0wwbm4zSEFhNng5a0dibzExMDZEYkRWd28zVgp5SjJkd1czUTBMOVI1T1A0d3pnMnJ0YW5kZWF2aEVOZGs1SU1hZ2ZlT3gyWUl0YXN3VFhibzZBbC8zSzFkaDNlCmJla3NaaXhTaE5CRmtzNGM1ZVV6SGR3SFUxU2pxb0k3bWpjdjNOMmdaT25tM2IydS9HU0ZIVHlueVFiZWhQOXIKNkdzYVBNV2lzMEw3aXdrK1h3aFN4MkxFMUFWeHY4Ums1UGloZytnK0VwdW9IdFEyVFM5eDlvMG85b09wRTlKaAp3Wkc3U01BMGowR01TMHpiYVJML1VKU2NJSU5aYysxOG9mTHgvZDMzU2RORFdLQldZOG85UGVVMVZsbnBEc29nCnpDdExreWtQQWdNQkFBR2pnZ0ZxTUlJQlpqQVNCZ05WSFJNQkFmOEVDREFHQVFIL0FnRU1NQjBHQTFVZERnUVcKQkJTNUNjcWNIdHZUYkRwcnJ1MVU4VnVUQmpVdVhqQ0I0UVlEVlIwakJJSFpNSUhXZ0JTNUNjcWNIdHZUYkRwcgpydTFVOFZ1VEJqVXVYcUdCc3FTQnJ6Q0JyREVMTUFrR0ExVUVCaE1DUlZVeFF6QkJCZ05WQkFjVE9rMWhaSEpwClpDQW9jMlZsSUdOMWNuSmxiblFnWVdSa2NtVnpjeUJoZENCM2QzY3VZMkZ0WlhKbWFYSnRZUzVqYjIwdllXUmsKY21WemN5a3hFakFRQmdOVkJBVVRDVUU0TWpjME16STROekViTUJrR0ExVUVDaE1TUVVNZ1EyRnRaWEptYVhKdApZU0JUTGtFdU1TY3dKUVlEVlFRREV4NUhiRzlpWVd3Z1EyaGhiV0psY25OcFoyNGdVbTl2ZENBdElESXdNRGlDCkNRREp6ZFBwMVgwanpqQU9CZ05WSFE4QkFmOEVCQU1DQVFZd1BRWURWUjBnQkRZd05EQXlCZ1JWSFNBQU1Db3cKS0FZSUt3WUJCUVVIQWdFV0hHaDBkSEE2THk5d2IyeHBZM2t1WTJGdFpYSm1hWEp0WVM1amIyMHdEUVlKS29aSQpodmNOQVFFRkJRQURnZ0lCQUlDSWYzRGVraWpaQlpSRy81QlhxZkV2M3hvTmEvcDhEaHhKSkhrbjJFYXFieWxaClVvaHdFdXJkUGZXYlUxUnY0V0NpcUFtNTdPdFpmTVkxOGR3WTZmRm41YSs2UmVBSjNzcEVEOElYRG5lUlJYb3oKWDErV0xHaUx3VWVQbUpzOXdPekw5ZFdDa29RMTBiNDJPRlp5TVZ0SExhb1hwR05SNndvQnJYL3NkWjdMb1IveApmeEt4dWVSa2YyZldJeXIwdURsZG1PZ2hwK0c5UFVJYWRKcHdyMmhzVUYxSnovLzdEbDNtTEVmWGdUcFpBTFZ6CmEyTWc5akZGQ0RrTzlIQitRSEJhUDlCclFxbDBQU2d2QW0xMWNwVUpqVWhqeHNZalY1S1RYalhCamZrSzl5eWQKWWh6MnJYemRwakVldHJISGZvVW0rcVJxdGRwak1OSHZremV5Wmk5OUJmZm50MHVZbERYQTJUb3B3WjJ5VURNZApTcWxhcHNrRDcrMzA1Nmh1aXJSWGhPdWtQOUR1cXFxSFcyUG9rK0pycU5TNGNuaHJHKzA1NUYzTG02cUgxVTlPCkFQN1phcDg4TVE4b0FnRjltT2luc0tKa25ubjRTUElWcWN6bXlFVHJQM2laOG50eFBqenhtS2ZGR0JJLzVyc28KTTBMcFJRcDhiZktHZVMvRmdobDlDWWw4c2xSMmlLN2V3ZlBNNFc3Yk1kYVRycG1nN3lWcWM1aUpXem91RTRnZQp2OENTbERRYjR5ZTNpeDV2UXYvbjZUZWJVQjB0b3ZrQzdzdFlXRHB4dkdqanFzR3ZIQ2dmb3R3alpUK0I2cTZaCjA5Z3d6eE1OVHhYSmhMeW5TQzM0TUNOMzJFWkxlVzMyak8wNmYyQVJlUFRwbTY3VlZNQjBnTkVMUXAvQgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049R28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMiBPPUdvRGFkZHkuY29tLCBJbmMuCiMgU3ViamVjdDogQ049R28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMiBPPUdvRGFkZHkuY29tLCBJbmMuCiMgTGFiZWw6ICJHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyIgojIFNlcmlhbDogMAojIE1ENSBGaW5nZXJwcmludDogODA6M2E6YmM6MjI6YzE6ZTY6ZmI6OGQ6OWI6M2I6Mjc6NGE6MzI6MWI6OWE6MDEKIyBTSEExIEZpbmdlcnByaW50OiA0NzpiZTphYjpjOToyMjplYTplODowZTo3ODo3ODozNDo2MjphNzo5Zjo0NTpjMjo1NDpmZDplNjo4YgojIFNIQTI1NiBGaW5nZXJwcmludDogNDU6MTQ6MGI6MzI6NDc6ZWI6OWM6Yzg6YzU6YjQ6ZjA6ZDc6YjU6MzA6OTE6Zjc6MzI6OTI6MDg6OWU6NmU6NWE6NjM6ZTI6NzQ6OWQ6ZDM6YWM6YTk6MTk6OGU6ZGEKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR4VENDQXEyZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBRENCZ3pFTE1Ba0dBMVVFQmhNQ1ZWTXgKRURBT0JnTlZCQWdUQjBGeWFYcHZibUV4RXpBUkJnTlZCQWNUQ2xOamIzUjBjMlJoYkdVeEdqQVlCZ05WQkFvVApFVWR2UkdGa1pIa3VZMjl0TENCSmJtTXVNVEV3THdZRFZRUURFeWhIYnlCRVlXUmtlU0JTYjI5MElFTmxjblJwClptbGpZWFJsSUVGMWRHaHZjbWwwZVNBdElFY3lNQjRYRFRBNU1Ea3dNVEF3TURBd01Gb1hEVE0zTVRJek1USXoKTlRrMU9Wb3dnWU14Q3pBSkJnTlZCQVlUQWxWVE1SQXdEZ1lEVlFRSUV3ZEJjbWw2YjI1aE1STXdFUVlEVlFRSApFd3BUWTI5MGRITmtZV3hsTVJvd0dBWURWUVFLRXhGSGIwUmhaR1I1TG1OdmJTd2dTVzVqTGpFeE1DOEdBMVVFCkF4TW9SMjhnUkdGa1pIa2dVbTl2ZENCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcGRIa2dMU0JITWpDQ0FTSXcKRFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUw5eFlnangrbGswOXh2SkdLUDNnRWxZNlNLRApFNmJGSUVNQk80VHg1b1ZKbnlmcTlvUWJUcUMwMjNDWXh6SUJzUVUrQjA3dTlQcFBMMWt3SXVlckdWWnI0b0FICi9QTVdkWUE1VVh2bCtUVzJkRTZwallJVDVMWS9xUU9EK3FLK2loVnFmOTRMdzdZWkZBWEs2c09vQkpRN1Jud3kKRGZNQVppTElqV2x0Tm93UkdMZlRzaHhndERqNkFvek8wOTFHQjk0S1B1dGRmTWg4KzdBclU2U1NZbWxSSlFWaApHa1NCakN5cFE1WWozNnc2Z1pvT0tjVWNxZWxkSHJhZW5qQUtPYzd4aUlEN1MxM01NdXlGWWtNbE5BSldKd0dSCnREdHdLajl1c2VpY2lBRjluOVQ1MjFOdFlKMi9MT2RZcTdoZlJ2ek94QnNEUEFuclNURmNhVWF6NEVjQ0F3RUEKQWFOQ01FQXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPQkJZRQpGRHFhaFFjUVp5aTI3L2E5QlVGdUlNR1UyZy9lTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFDWjIxMTUxZm1YCldXY0RZZkYrT3dZeGRTMmhJSTVQWlllMDk2YWN2TmpwTDlEYld1N1BkSXh6dERoQzJnVjcrQUoxdVAybHNkZXUKOXRmZUU4dFRFSDZLUnRHWCtyY3VLeEdya0xBbmdQbm9uMXJwTjUrcjVOOXNzNFVYblQzWkpFOTVrVFhXWHdUcgpnSU9ybWdJdHRSRDAySkRIQkhOQTdYSWxvS21mN0o2cmFCS1pWOGFQRWpvSnBMMUUvUVlWTjhHYjVES2o3VGpvCjJHVHpMSDRVL0FMcW44My9CMmdYMnlLUU9DMTZqZEZVOFdualh6UEtlajE3Q3VQS2YxODU1ZUoxdXNWMkdEUE8KTFBBdlRLMzNzZWZPVDZqRW0wcFVCc1YvZmRVSUQrSWMvbjRYdUt4ZTl0UVdza01KREUzMnAydTBtWVJseW5xSQo0dUpFdmx6MzZoejEKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyIE89U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLgojIFN1YmplY3Q6IENOPVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyIE89U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLgojIExhYmVsOiAiU3RhcmZpZWxkIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIiCiMgU2VyaWFsOiAwCiMgTUQ1IEZpbmdlcnByaW50OiBkNjozOTo4MTpjNjo1Mjo3ZTo5Njo2OTpmYzpmYzpjYTo2NjplZDowNTpmMjo5NgojIFNIQTEgRmluZ2VycHJpbnQ6IGI1OjFjOjA2OjdjOmVlOjJiOjBjOjNkOmY4OjU1OmFiOjJkOjkyOmY0OmZlOjM5OmQ0OmU3OjBmOjBlCiMgU0hBMjU2IEZpbmdlcnByaW50OiAyYzplMTpjYjowYjpmOTpkMjpmOTplMTowMjo5OTozZjpiZToyMTo1MTo1MjpjMzpiMjpkZDowYzphYjpkZToxYzo2ODplNTozMTo5Yjo4Mzo5MTo1NDpkYjpiNzpmNQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRDNUQ0NBc1dnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFzRkFEQ0JqekVMTUFrR0ExVUVCaE1DVlZNeApFREFPQmdOVkJBZ1RCMEZ5YVhwdmJtRXhFekFSQmdOVkJBY1RDbE5qYjNSMGMyUmhiR1V4SlRBakJnTlZCQW9UCkhGTjBZWEptYVdWc1pDQlVaV05vYm05c2IyZHBaWE1zSUVsdVl5NHhNakF3QmdOVkJBTVRLVk4wWVhKbWFXVnMKWkNCU2IyOTBJRU5sY25ScFptbGpZWFJsSUVGMWRHaHZjbWwwZVNBdElFY3lNQjRYRFRBNU1Ea3dNVEF3TURBdwpNRm9YRFRNM01USXpNVEl6TlRrMU9Wb3dnWTh4Q3pBSkJnTlZCQVlUQWxWVE1SQXdEZ1lEVlFRSUV3ZEJjbWw2CmIyNWhNUk13RVFZRFZRUUhFd3BUWTI5MGRITmtZV3hsTVNVd0l3WURWUVFLRXh4VGRHRnlabWxsYkdRZ1ZHVmoKYUc1dmJHOW5hV1Z6TENCSmJtTXVNVEl3TUFZRFZRUURFeWxUZEdGeVptbGxiR1FnVW05dmRDQkRaWEowYVdacApZMkYwWlNCQmRYUm9iM0pwZEhrZ0xTQkhNakNDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DCmdnRUJBTDN0d1FQODlvLzhBckZ2VzU5STJaMTU0cUszQTJGV0dNTkh0dGZLUFRVdWlVUDNvV21iM29vYS9STWcKbkxSSmR6SXBWdjI1N0l6ZEl2cHkzQ2RobCs3MldvVHNiaG01aVN6Y2hGdlZkUHRyWDhXSnBSQlNpVVpWOUxoMQpIT1ovNUZTdVMvaFZjbGNDR2ZnWGNWbnJIaWdIZE1XZFNMNXN0UFNrc1BOa04zbVN3T3hHWG4vaGJWTk1ZcS9OCkh3dGp1enFkKy94NUFKaGhkTThtZ2tCajg3SnlhaGtObWNyVURuWE1OL3VMaWNGWjhXSi9YN05mWlRENHA3ZE4KZGxvZWRsNDB3T2lXVnBtS3MvQi9wTTI5M0RJeGZKSFA0RjhSK0d1cVNWelJtWlRSb3VOald3bDJ0VlppNFV0MApIWmJVSnRRSUJGblFtQTRPNXQ3OHcrd2ZrUEVDQXdFQUFhTkNNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPCkJnTlZIUThCQWY4RUJBTUNBUVl3SFFZRFZSME9CQllFRkh3TU1oK24yVEIveEgxb28yS29vYzZyQjFzbk1BMEcKQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUFSV2ZvbFR3TnZsSms3bWgrQ2hUblVkZ1dVWHVFb2syMWlYUW5Db0tqVQpzSFU0OFRScW5lU2Zpb1ltVWVZczBjWXRicFVnU3BJQjdMaUtaM3N4NG1jdWpKVURKaTVEblVveDlnNjFETHUzCjRqZC9Jcm9Bb3c1N1V2dHJ1enZFMDNsUlRzMlE5R2NIR2NnOFJub05BWDNGV09kdDVvVXdGNW9reEJEZ0JQZmcKOG4vVXFnci9RaDAzN1pUbFpGa1NJSGM0MHpJK09JRjFsblA2YUkreHk4NGZ4ZXo2bkg3UGZySHhCeTIyL0wvSwpwTC9RbHdWS3ZPb1lLQUtRdlZSNENTRngwOUY5SGRrV3NLbGhQZEFLQUNMOHgzdkxDV1JGQ3p0QWdmZDlmREwxCm1NcFlqbjBxN3BCWmMyVDVOblJlSmFIMVpnVXVmemtWcVNyN1VJdU9oV24wCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1TdGFyZmllbGQgU2VydmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMiBPPVN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4KIyBTdWJqZWN0OiBDTj1TdGFyZmllbGQgU2VydmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMiBPPVN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4KIyBMYWJlbDogIlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyIgojIFNlcmlhbDogMAojIE1ENSBGaW5nZXJwcmludDogMTc6MzU6NzQ6YWY6N2I6NjE6MWM6ZWI6ZjQ6Zjk6M2M6ZTI6ZWU6NDA6Zjk6YTIKIyBTSEExIEZpbmdlcnByaW50OiA5Mjo1YTo4Zjo4ZDoyYzo2ZDowNDplMDo2Njo1Zjo1OTo2YTpmZjoyMjpkODo2MzplODoyNTo2ZjozZgojIFNIQTI1NiBGaW5nZXJwcmludDogNTY6OGQ6Njk6MDU6YTI6Yzg6ODc6MDg6YTQ6YjM6MDI6NTE6OTA6ZWQ6Y2Y6ZWQ6YjE6OTc6NGE6NjA6NmE6MTM6YzY6ZTU6Mjk6MGY6Y2I6MmE6ZTY6M2U6ZGE6YjUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQ3ekNDQXRlZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBRENCbURFTE1Ba0dBMVVFQmhNQ1ZWTXgKRURBT0JnTlZCQWdUQjBGeWFYcHZibUV4RXpBUkJnTlZCQWNUQ2xOamIzUjBjMlJoYkdVeEpUQWpCZ05WQkFvVApIRk4wWVhKbWFXVnNaQ0JVWldOb2JtOXNiMmRwWlhNc0lFbHVZeTR4T3pBNUJnTlZCQU1UTWxOMFlYSm1hV1ZzClpDQlRaWEoyYVdObGN5QlNiMjkwSUVObGNuUnBabWxqWVhSbElFRjFkR2h2Y21sMGVTQXRJRWN5TUI0WERUQTUKTURrd01UQXdNREF3TUZvWERUTTNNVEl6TVRJek5UazFPVm93Z1pneEN6QUpCZ05WQkFZVEFsVlRNUkF3RGdZRApWUVFJRXdkQmNtbDZiMjVoTVJNd0VRWURWUVFIRXdwVFkyOTBkSE5rWVd4bE1TVXdJd1lEVlFRS0V4eFRkR0Z5ClptbGxiR1FnVkdWamFHNXZiRzluYVdWekxDQkpibU11TVRzd09RWURWUVFERXpKVGRHRnlabWxsYkdRZ1UyVnkKZG1salpYTWdVbTl2ZENCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcGRIa2dMU0JITWpDQ0FTSXdEUVlKS29aSQpodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU5VTU9zUXErVTdpOWI0WmwxK09pRk94SHovTHo1OGdFMjBwCk9zZ1BmVHozYTNZNFk5azJZS2liWGx3QWdMSXZXWC8yaC9rbFE0Ym5hUnRTbXBEaGNlUFlMUTFPYi9iSVNkbTIKOHhwV3JpdTJkQlRyei9zbTR4cTZIWll1YWp0WWxJbEhWdjhsb0pOd1U0UGFoSFFVdzJlZUJHZzYzNDVBV2gxSwpUczlEa1R2blZ0WUFjTXRTN250OXJqcm52REg1UmZiQ1lNOFRXUUlyZ013MFI5KzUzcEJsYlFMUExKR21wdWZlCmhSaEpmR1pPb3pwdHFiWHVOQzY2RFFPNE05OUg2N0ZyalNYWm04NkIwVVZHTXBad2g5NENEa2xEaGJac2M3dGsKNm1GQnJNblVWTitITDhjaXNpYk1uMWxVYUovOHZpb3Z4RlVjZFVCZ0Y0VUNWVG1MZndVQ0F3RUFBYU5DTUVBdwpEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPQkJZRUZKeGZBTitxCkFkY3dLemlJb3JodFNwenlFWkdETUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFCTE5xYUVkMm5kT3htZlp5TUkKYnc1aHlmMkUzRi9ZTm9ITjJCdEJMWjlnM2NjYWFOblJib2JoaUNQUEU5NUR6K0kwc3dTZEh5blZ2L2hleU5YQgp2ZTZTYnpKMDhwR0NMNzJDUW5xdEtyY2dmVTI4ZWxVU3doWHF2ZmRxbFM1c2RKL1BITFR5eFFHamhkQnlQcTF6CnF3dWJkUXh0UmJlT2xLeVdON1dnMEk4VlJ3N2o2SVBkai8zdlFRRjN6Q2VwWW9VejhqY0k3M0hQZHdiZXlCa2QKaUVEUGZVWWQveDdINGM3L0k5dkcrbzFWVHFrQzUwY1JSajcwL2IxN0tTYTdxV0ZpTnlpMkxTcjJFSVpreVhDbgowcTIzS1hCNTZqemFZeVdmL1dpM01PeHcrM1dLdDIxZ1o3SWV5TG5wMktodkFvdG5EVTBtVjNIYUlQekJTbENOCnNTaTYKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUFmZmlybVRydXN0IENvbW1lcmNpYWwgTz1BZmZpcm1UcnVzdAojIFN1YmplY3Q6IENOPUFmZmlybVRydXN0IENvbW1lcmNpYWwgTz1BZmZpcm1UcnVzdAojIExhYmVsOiAiQWZmaXJtVHJ1c3QgQ29tbWVyY2lhbCIKIyBTZXJpYWw6IDg2MDgzNTU5Nzc5NjQxMzg4NzYKIyBNRDUgRmluZ2VycHJpbnQ6IDgyOjkyOmJhOjViOmVmOmNkOjhhOjZmOmE2OjNkOjU1OmY5Ojg0OmY2OmQ2OmI3CiMgU0hBMSBGaW5nZXJwcmludDogZjk6YjU6YjY6MzI6NDU6NWY6OWM6YmU6ZWM6NTc6NWY6ODA6ZGM6ZTk6NmU6MmM6Yzc6YjI6Nzg6YjcKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDAzOjc2OmFiOjFkOjU0OmM1OmY5OjgwOjNjOmU0OmIyOmUyOjAxOmEwOmVlOjdlOmVmOjdiOjU3OmI2OjM2OmU4OmE5OjNjOjliOjhkOjQ4OjYwOmM5OjZmOjVmOmE3Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEVERDQ0FqU2dBd0lCQWdJSWQzY0dKeWFwc1h3d0RRWUpLb1pJaHZjTkFRRUxCUUF3UkRFTE1Ba0dBMVVFCkJoTUNWVk14RkRBU0JnTlZCQW9NQzBGbVptbHliVlJ5ZFhOME1SOHdIUVlEVlFRRERCWkJabVpwY20xVWNuVnoKZENCRGIyMXRaWEpqYVdGc01CNFhEVEV3TURFeU9URTBNRFl3TmxvWERUTXdNVEl6TVRFME1EWXdObG93UkRFTApNQWtHQTFVRUJoTUNWVk14RkRBU0JnTlZCQW9NQzBGbVptbHliVlJ5ZFhOME1SOHdIUVlEVlFRRERCWkJabVpwCmNtMVVjblZ6ZENCRGIyMXRaWEpqYVdGc01JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0MKQVFFQTlodFBad2Nyb1JYMUJpTExId0d5NDNORkJrUkpMTHRKSlJUV3pzTzNxeXhQeGtFeWxGZjZFcWRiRHVLUApIeDZHR2FlcXRTMjVYdzJLd3ErRk5Ya3lMYnNjWWpmeXNWdEtQY3JOY1YvcFFyNlU2TWplK1NKSVpNYmxxOFlyCmJhMEY4UHJWQzgrYTVmQlFwSXM3UjZValczcDYrRE0vdU8rWmwrTWd3ZFlvaWMrVSs3bEY3ZU5BRnhIVWRQQUwKTWVJckptcWJURmV1ckNBK3VrVjZCZk85bTJrVnJuMU9JR1BFTlhZNkJ3TEpOLzNIUis3bzhYWWRjeFh5bDZTMQp5SHA1MlVLcUszOWMvczRtVDZObWdUV3ZSTHBVSGh3d01tV2Q1anlUWGxCT2V1TTYxRzdNR3Z2NTBqZXVKQ3FyClZ3TWlLQTFKZFgrM0tOcDF2NDdqM0E1NU1RSURBUUFCbzBJd1FEQWRCZ05WSFE0RUZnUVVuWlBHVTR0ZXlxOC8Kbng0UDVabVZ2Q1QybEk4d0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3RFFZSgpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFGaXM5QVFPemNBTi93cjkxTG9XWHltOWUyaVpXRW5TdEIwM1RYOG5mVVlHClhVUEdoaTQrYzdJbWZVK1RxYmJFS3BxcklaY1VzZDZNMDZ1SkZkaHJKTlR4RnE3WXBGelVmMUdPN1JnQnNaTmoKdmJ6NFlZQ2FuckhPUW5EaXFYMEdKWDBub2Y1djdMTWVKTnJqUzFVYUFEczF0RHZaMTEwdy9ZRVRpZkxDQml2dApaOFNPeVVPeVhHc1ZpUUs4WXZ4TzhyVXpxckp2MHdxaVVPUDJPK2d1Uk1MYlpqaXBNMVpJOFcwYk00ME5qRDlnCk41M1R5bTErTkg0Tm4zSjJpeHVmY3YxU05VRkZBcFl2SExLYWMwa2hzVWxIUlVlMDcybzBFY2xObXN4WnQ5WUMKbmxwT1piV1VyaHZmS2JBVzhiOEFuZ2M2RjJTMUJMVWpJWmtLbFR1WGZPOD0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUFmZmlybVRydXN0IE5ldHdvcmtpbmcgTz1BZmZpcm1UcnVzdAojIFN1YmplY3Q6IENOPUFmZmlybVRydXN0IE5ldHdvcmtpbmcgTz1BZmZpcm1UcnVzdAojIExhYmVsOiAiQWZmaXJtVHJ1c3QgTmV0d29ya2luZyIKIyBTZXJpYWw6IDg5NTczODI4MjcyMDY1NDc3NTcKIyBNRDUgRmluZ2VycHJpbnQ6IDQyOjY1OmNhOmJlOjAxOjlhOjlhOjRjOmE5OjhjOjQxOjQ5OmNkOmMwOmQ1OjdmCiMgU0hBMSBGaW5nZXJwcmludDogMjk6MzY6MjE6MDI6OGI6MjA6ZWQ6MDI6ZjU6NjY6YzU6MzI6ZDE6ZDY6ZWQ6OTA6OWY6NDU6MDA6MmYKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDBhOjgxOmVjOjVhOjkyOjk3Ojc3OmYxOjQ1OjkwOjRhOmYzOjhkOjVkOjUwOjlmOjY2OmI1OmUyOmM1OjhmOmNkOmI1OjMxOjA1OjhiOjBlOjE3OmYzOmYwOmI0OjFiCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEVERDQ0FqU2dBd0lCQWdJSWZFOEVPUnpVbVMwd0RRWUpLb1pJaHZjTkFRRUZCUUF3UkRFTE1Ba0dBMVVFCkJoTUNWVk14RkRBU0JnTlZCQW9NQzBGbVptbHliVlJ5ZFhOME1SOHdIUVlEVlFRRERCWkJabVpwY20xVWNuVnoKZENCT1pYUjNiM0pyYVc1bk1CNFhEVEV3TURFeU9URTBNRGd5TkZvWERUTXdNVEl6TVRFME1EZ3lORm93UkRFTApNQWtHQTFVRUJoTUNWVk14RkRBU0JnTlZCQW9NQzBGbVptbHliVlJ5ZFhOME1SOHdIUVlEVlFRRERCWkJabVpwCmNtMVVjblZ6ZENCT1pYUjNiM0pyYVc1bk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0MKQVFFQXRJVE1NeGN1YTVSc2EyRlNvT3VqejNtVVRPV1VnSm5MVldSRVpZOW5aT0lHNDF3M1NmWXZtNFNFSGkzeQpZSjB3VHN5RWhlSXN6eDZlL2phck0zYzFSTmcxbGhvOU51aDZEdGpWUjZGcWFZdlovTHM2cm5sYTFmVFdjYnVhCmtDTnJtcmVJZEljTUhsKzVuaTM2cTFNcjNMdDJQcE5NQ0FpTUhxSWpITlJxclNLNm1RRXViV1hMdmlSbVZTUkwKUUVTeEc5Zmh3b1hBM2hBL1BlMjQvUEh4STFQY3YyV1hiOW41UUhHTmZiMlYxTTYrb0Y0bkk5NzlwdEFtRGdBcAo2enhHOEQxZ3Z6OVEwdHdtUVZHZUZEZENCS053VjZnYmgrMHQrbnZ1akFyanFXYUpHY3RCK2QxRU5tSFA0bmRHCnlIMzI5SktCTnYzYk5QRnlmdk1NRnIyMEZRSURBUUFCbzBJd1FEQWRCZ05WSFE0RUZnUVVCeC9TNTV6YXdtNmkKUUxTd2VsQVFVSFRFeUwwd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3RFFZSgpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFJbFhzaFo2cU1MOTF0bWJtelRDbkxReUZFMm5wTi9zdnFlKytFUGJrVGZPCnRESXVVRlVhTlU1MlEzRWc3NU4zVGhWd0xvZkR3UjF0M011MUo5UXNWdEZTVXpwRTBuUEl4QnNGWlZwaWtwenUKUVkweDIrYzA2bGtoMVFGNjEyUzRaRG5OeWUydjdVc0RTS2VnbVFHQTNHV2pOcTVsV1VoUGdrdklaZkZYSGVWWgpMZ28vYk5qUjllVUp0R3hVQUFyZ0ZVMkhkVzIzV0paYTNXM1NBS0QwbTBpK3d6ZWt1amJnZkllRmx4b1ZvdDR1Cm9sdTlyeGo1a0ZETmNGbjRKMmRIeThlZ0J6cDkwU3hkYkJrNlpyVjkvWkZ2Z3JHK0NKUGJGRWZ4b2pmSFJaNDgKeDNldlpLaVQzL1pwZzRKZzhrbENOTzFhQUZTRkhCWTJrZ3hjK3FhdHY5cz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUFmZmlybVRydXN0IFByZW1pdW0gTz1BZmZpcm1UcnVzdAojIFN1YmplY3Q6IENOPUFmZmlybVRydXN0IFByZW1pdW0gTz1BZmZpcm1UcnVzdAojIExhYmVsOiAiQWZmaXJtVHJ1c3QgUHJlbWl1bSIKIyBTZXJpYWw6IDc4OTM3MDY1NDA3MzQzNTIxMTAKIyBNRDUgRmluZ2VycHJpbnQ6IGM0OjVkOjBlOjQ4OmI2OmFjOjI4OjMwOjRlOjBhOmJjOmY5OjM4OjE2Ojg3OjU3CiMgU0hBMSBGaW5nZXJwcmludDogZDg6YTY6MzM6MmM6ZTA6MDM6NmY6YjE6ODU6ZjY6NjM6NGY6N2Q6NmE6MDY6NjU6MjY6MzI6Mjg6MjcKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDcwOmE3OjNmOjdmOjM3OjZiOjYwOjA3OjQyOjQ4OjkwOjQ1OjM0OmIxOjE0OjgyOmQ1OmJmOjBlOjY5OjhlOmNjOjQ5OjhkOmY1OjI1Ojc3OmViOmYyOmU5OjNiOjlhCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGUmpDQ0F5NmdBd0lCQWdJSWJZd1VSckdtQ3U0d0RRWUpLb1pJaHZjTkFRRU1CUUF3UVRFTE1Ba0dBMVVFCkJoTUNWVk14RkRBU0JnTlZCQW9NQzBGbVptbHliVlJ5ZFhOME1Sd3dHZ1lEVlFRRERCTkJabVpwY20xVWNuVnoKZENCUWNtVnRhWFZ0TUI0WERURXdNREV5T1RFME1UQXpObG9YRFRRd01USXpNVEUwTVRBek5sb3dRVEVMTUFrRwpBMVVFQmhNQ1ZWTXhGREFTQmdOVkJBb01DMEZtWm1seWJWUnlkWE4wTVJ3d0dnWURWUVFEREJOQlptWnBjbTFVCmNuVnpkQ0JRY21WdGFYVnRNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQWc4QU1JSUNDZ0tDQWdFQXhCTGYKcVYvK1FkM2Q5WitLNC9hczRUeDRtcnpZOEg5Nm9ETXEzSTBnVzY0dGIrZVQyVFp3YW1qUGpsR2poVnRuQktBUQpKRzlkS0lMQmwxZllTQ2tUdHVHK2tVM2ZoUXhUR0pvZUpLSlBqL0NpaFF2TDlDbC8wcVJZN2laTnlhcW9lNXJaCitqamVSRmNWNWZpTXlObEk0ZzBXSngwZXlJT0ZKYmU2cWxWQnpBTWlTeTJSall2bWlhOW14K24vSytrOHJOclMKczhQaGFKeUorSG9BVnQ3MFZaVnMrN3BrM1dLTDN3dDNNdXRpekNhYW03dXFZb05NdEFaNk1NZ3B2KzBHVFplNQpITVF4SzlWZnZGTVNGNXlaVnlsbWQyRWhNUWN1SlVtZEdQTHU4eXR4akxXNk9RZEpkL3p2THBLUUJZMHRMM2Q3CjcwTy9OYnVhMlBsenB5enkwRmZ1S0U0bVg0K1FhQWt2dVBqY0J1a3VtajVScDlFaXhBcW5PRWhzcy9uL2ZhdUcKVitPNjFvVjRkN3BENmtoLzl0aStJMjBldjlFMmJGaGM4ZTZrR1ZRYTlRUFNkdWJoakwwOHM5TklTK0xJK0grUwpxSFpHbkVKbFBxUWV3UWNEV2tZdHVKZnp0OVd5VlNIdnV0eE1BSmY3RkpVbk03L29RMGRHMGdpWkZtQTdtbjdTCjV1MDQ2dXdCSGp4SVZra0p4MHczQUo2SURzQno0VzltNlhKSE1ENFE1UXNEeVpwQ0FHekZsSDVoeElyZmY0SWEKQzFuRVdUSjNzN3hnYVZZNS9iUUdleXpXWkRiWnZVanRoQjkrcFNLUEtyaEM5SUszMUZPUWVFNHRHdjJCYjBUWApPd0YwbGtMZ0FPSXVhK3JGN25Lc3U3Lys2cXFvK056MnNubUt0bWNDQXdFQUFhTkNNRUF3SFFZRFZSME9CQllFCkZKM0FaNllNSXRrbTlVV3JwbVZTRVNmWVJheGpNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC8KQkFRREFnRUdNQTBHQ1NxR1NJYjNEUUVCREFVQUE0SUNBUUN6VjAwUVlrNDY1S3pxdUJ5dk1pUElzMGxhVVp4MgpLSTE1cWxkR0Y5WDFVdmEzUk9nSVJMOFloTklMZ00zRkV2MEFWUVZoaDBIY3RTU2VQTVRZeVB0d25pOTRsb01nCk50NThEMmtUaUtWMU5wZ0lwc2Jmck03aldOYTNQdDY2OCtzMFFOaWlnZlY0UHkvVnBmelpvdFJlQkE0WHJmNUIKOE9XeWN2cEVnak5DNkMxWTkxYU1Zais2UXJDY0RGeCtMbVVtWEZOUEFMSjRmcUVObVMyTnVCMk9vc1N3L1dEUQpNS1NPeUFSaXFjVHROZDU2bCswT09GNlNMNU53cGFtY2I2ZDlFeDEreGdoSXNWNW42MUVJSmVubUpXdFNLWkdjCjBqbHpDRmZlbVFhMFc1MFFCdUhDQUtpNEhFb0NDaFRRd1VISys0dzFJWDJDT1BLcFZKRVpOWk9VYldvNnhiTFEKdTRtR2sraWJ5UTg2cDNxNG9mQjRSdnI4TnkvbGlvVHozLzRFMmFGb29DOGs0Z21WQnRXVnl1RWtsdXQ4OXBNRgp1KzF6NlMzUmRUblg1eVRiMkU1ZlE0K2UwQlE1djFWd1NKbFhNYlNjN2txWUE1WXdIMkFHN2hzai9vRmdJeHBICllvV2x6QmswZ0crenJCcmpuL0I3U0szVkFkbG50cWx5aytvdFpyV3l1T1E5UExMdlRJenE2d2UvcXpXYVZZYTgKR0thMXFGNjBnMnhyYVVEVG45enh3MmxydWVGdENmVHhxbEIyQ25wOWVoZWhWWlpDbVRFSjNXQVJqUVV3ZnVhTwpSdEdkRk5ySEYrUUZsb3pFSkxVYnp4UUhza0Q0bzU1Qmhyd0UwR3VXeUNxQU5QMi83d2FqM1ZqRmhUMCtqLzZlCktlQzJ1QWxvR1J3WVF3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUFmZmlybVRydXN0IFByZW1pdW0gRUNDIE89QWZmaXJtVHJ1c3QKIyBTdWJqZWN0OiBDTj1BZmZpcm1UcnVzdCBQcmVtaXVtIEVDQyBPPUFmZmlybVRydXN0CiMgTGFiZWw6ICJBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQyIKIyBTZXJpYWw6IDg0MDEyMjQ5MDc4NjE0OTAyNjAKIyBNRDUgRmluZ2VycHJpbnQ6IDY0OmIwOjA5OjU1OmNmOmIxOmQ1Ojk5OmUyOmJlOjEzOmFiOmE2OjVkOmVhOjRkCiMgU0hBMSBGaW5nZXJwcmludDogYjg6MjM6NmI6MDA6MmY6MWQ6MTY6ODY6NTM6MDE6NTU6NmM6MTE6YTQ6Mzc6Y2E6ZWI6ZmY6YzM6YmIKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGJkOjcxOmZkOmY2OmRhOjk3OmU0OmNmOjYyOmQxOjY0OjdhOmRkOjI1OjgxOmIwOjdkOjc5OmFkOmY4OjM5OjdlOmI0OmVjOmJhOjljOjVlOjg0Ojg4OjgyOjE0OjIzCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlCL2pDQ0FZV2dBd0lCQWdJSWRKY2xpc2MvZWxRd0NnWUlLb1pJemowRUF3TXdSVEVMTUFrR0ExVUVCaE1DClZWTXhGREFTQmdOVkJBb01DMEZtWm1seWJWUnlkWE4wTVNBd0hnWURWUVFEREJkQlptWnBjbTFVY25WemRDQlEKY21WdGFYVnRJRVZEUXpBZUZ3MHhNREF4TWpreE5ESXdNalJhRncwME1ERXlNekV4TkRJd01qUmFNRVV4Q3pBSgpCZ05WQkFZVEFsVlRNUlF3RWdZRFZRUUtEQXRCWm1acGNtMVVjblZ6ZERFZ01CNEdBMVVFQXd3WFFXWm1hWEp0ClZISjFjM1FnVUhKbGJXbDFiU0JGUTBNd2RqQVFCZ2NxaGtqT1BRSUJCZ1VyZ1FRQUlnTmlBQVFOTUY0YkZaMEQKMEtGNU5iYzZQSko2eWhVY3pXTHpuQ1pjQnozbFZQcWoxc3dTNnZRVVgraU9HYXN2TGtqbXJCaERlS3pRTjhPOQpzczBzNWtmaUd1Wmp1RDB1TDNqRVQ5djBENlJvVEZWeWE1VWRUaGhDbFhqTU56eVI0cHRsS3ltalFqQkFNQjBHCkExVWREZ1FXQkJTYXJ5bDZ3QkUxTlNaUk1BRERhdjVBMWE3V1BEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEcKQTFVZER3RUIvd1FFQXdJQkJqQUtCZ2dxaGtqT1BRUURBd05uQURCa0FqQVhDZk9IaUZCYXI4akFRcjlIWC9Wcwphb2JneENkMDVEaFQxd1YvR3pUanhpK3p5Z2s4TjUzWDU3aEc4ZjJoNG5FQ01FSlpoMFBVVWQrNjB3a3lXczZJCmZsYzluRjlDYS9VSExiWHdncFA1V1crdVpQcFk1WXNlNDJPK3RZSE5id0tNZVE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049Q2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSBPPVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4gT1U9Q2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgU3ViamVjdDogQ049Q2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSBPPVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4gT1U9Q2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgTGFiZWw6ICJDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBIgojIFNlcmlhbDogMjc5NzQ0CiMgTUQ1IEZpbmdlcnByaW50OiBkNTplOTo4MTo0MDpjNToxODo2OTpmYzo0NjoyYzo4OTo3NTo2MjowZjphYTo3OAojIFNIQTEgRmluZ2VycHJpbnQ6IDA3OmUwOjMyOmUwOjIwOmI3OjJjOjNmOjE5OjJmOjA2OjI4OmEyOjU5OjNhOjE5OmE3OjBmOjA2OjllCiMgU0hBMjU2IEZpbmdlcnByaW50OiA1Yzo1ODo0Njo4ZDo1NTpmNTo4ZTo0OTo3ZTo3NDozOTo4MjpkMjpiNTowMDoxMDpiNjpkMTo2NTozNzo0YTpjZjo4MzphNzpkNDphMzoyZDpiNzo2ODpjNDo0MDo4ZQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHV6Q0NBcU9nQXdJQkFnSURCRVRBTUEwR0NTcUdTSWIzRFFFQkJRVUFNSDR4Q3pBSkJnTlZCQVlUQWxCTQpNU0l3SUFZRFZRUUtFeGxWYm1sNlpYUnZJRlJsWTJodWIyeHZaMmxsY3lCVExrRXVNU2N3SlFZRFZRUUxFeDVEClpYSjBkVzBnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa3hJakFnQmdOVkJBTVRHVU5sY25SMWJTQlUKY25WemRHVmtJRTVsZEhkdmNtc2dRMEV3SGhjTk1EZ3hNREl5TVRJd056TTNXaGNOTWpreE1qTXhNVEl3TnpNMwpXakIrTVFzd0NRWURWUVFHRXdKUVRERWlNQ0FHQTFVRUNoTVpWVzVwZW1WMGJ5QlVaV05vYm05c2IyZHBaWE1nClV5NUJMakVuTUNVR0ExVUVDeE1lUTJWeWRIVnRJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1TSXcKSUFZRFZRUURFeGxEWlhKMGRXMGdWSEoxYzNSbFpDQk9aWFIzYjNKcklFTkJNSUlCSWpBTkJna3Foa2lHOXcwQgpBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUE0L3Q5bzNLNnd2REpGSWYxYXdGTzRXNUFCN3B0SjExLzkxc3RzMXJIClVWK3JwREttWVllMmJnK0cwakFDbC9qWGFWZWhHRGxkYW1SNXhnRlpyRHd4U2poODBnVFNTeWpvSUY4N0I2TE0KVFhQYjg2NVB4MWJWV3FlV2lmcnpxMmpVSTRaWko4OEpKN3lzYm5LREhEQnkzK0NpNmRMaGRIVVp2U3FlZXhWVQpCQnZYUXptdFZTakY0aHE3OU1Ea3JqaEpNOHgyaFo4NVJkS2tudklTakZINGZPUXRmL1dzWCtzV243RXQwYnJNCmtVSjNUQ1hKa0RodjIvRE0rNDRlbDFrKzFXQk81Z1VvN1VsNUUwdTZTTnN2K1hMVE9jcitIOWcwY3ZXMFFNOHgKQWNQczNoRXRGMTBmdUZEUlhobW5hZDRITXlqS1VKWDVwMVRMVklaUVJhbjVTUUlEQVFBQm8wSXdRREFQQmdOVgpIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJRSWRzM0xCLzhrOXNYTjdidVF2T0tFTjBaMTl6QU9CZ05WCkhROEJBZjhFQkFNQ0FRWXdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBS2FvclNMT0FUMm1vLzlpMEVpZGkxNXkKc0hoRTQ5d2Nyd245STBqNnZTckV1VlVFdFJDampTZmVDNEpqME83ZUREZDVRVnNpc3JDYVFWeW1jT0RVMEhmTApJOU1BNEd4V0wrRnBEUTNacXI4aGdWRFpCcVdvLzVVMzBLcis0clAxbVMxRmhJcmxRZ25YZEFJdjk0blltZW04Cko5UkhqYm9OUmh4M3p4U2tITG1rTWNTY0tIUUROUDh6R1NhbDZRMTB0ejZYeG5ib0o1YWpadDNocnZKQlc4cVkKVm9OemNPU0dHdEl4UWJvdnZpMFRXblp2VHVoT2dRNC9Xd01pb0JLK1psZ1JTc3NEeExRcUtpMldGK0E1Vkx4SQowM1lublpvdEJxYko3RG5TcTl1Zm1nc25BalVwc1VDVjUvbm9uRldJR1ViV3R6VDFmczQ1bXRrNDhWSDNUeXc9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1UV0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1UQUlXQU4tQ0EgT1U9Um9vdCBDQQojIFN1YmplY3Q6IENOPVRXQ0EgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPVRBSVdBTi1DQSBPVT1Sb290IENBCiMgTGFiZWw6ICJUV0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkiCiMgU2VyaWFsOiAxCiMgTUQ1IEZpbmdlcnByaW50OiBhYTowODo4ZjpmNjpmOTo3YjpiNzpmMjpiMTphNzoxZTo5YjplYTplYTpiZDo3OQojIFNIQTEgRmluZ2VycHJpbnQ6IGNmOjllOjg3OjZkOmQzOmViOmZjOjQyOjI2Ojk3OmEzOmI1OmEzOjdhOmEwOjc2OmE5OjA2OjIzOjQ4CiMgU0hBMjU2IEZpbmdlcnByaW50OiBiZjpkODo4ZjplMToxMDoxYzo0MTphZTozZTo4MDoxYjpmODpiZTo1NjozNTowZTplOTpiYTpkMTphNjpiOTpiZDo1MTo1ZTpkYzo1Yzo2ZDo1Yjo4NzoxMTphYzo0NAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGV6Q0NBbU9nQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFVRkFEQmZNUXN3Q1FZRFZRUUdFd0pVVnpFUwpNQkFHQTFVRUNnd0pWRUZKVjBGT0xVTkJNUkF3RGdZRFZRUUxEQWRTYjI5MElFTkJNU293S0FZRFZRUUREQ0ZVClYwTkJJRkp2YjNRZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt3SGhjTk1EZ3dPREk0TURjeU5ETXoKV2hjTk16QXhNak14TVRVMU9UVTVXakJmTVFzd0NRWURWUVFHRXdKVVZ6RVNNQkFHQTFVRUNnd0pWRUZKVjBGTwpMVU5CTVJBd0RnWURWUVFMREFkU2IyOTBJRU5CTVNvd0tBWURWUVFERENGVVYwTkJJRkp2YjNRZ1EyVnlkR2xtCmFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUIKQVFDd2ZuSzRwQU9VNXFmZUNUaVJTaEZBaDZkOFdXUVVlN1VSRU4zK3Y5WEF1MWJpaFNYME5YSVArRlBRUWVGRQpBY0swSE1NeFFoWkhoVE1pZHJJS2J3L2xKVkJQaFlhK3Y1Z3VFR2NldmhFRmhnV1F4Rm5RZkhnUXNJQmN0K0hICkszWExmSit1dGRHZEl6ZGpwOXhDb2kyU0JCdFF3WHU0UGh2SlZnU0xMMUticmFsVzZjSC9yYWxZaHpDMmdmZVgKUmZ3WlZ6c3JiK1JIOUpsRi9oM3grSmVqaUIwM0hGeVA0SFlsbWxENG9GVC9SSkIySTlJeXhzT3JCci84KzcvegpyWDJTWWdKYktkTTFvNU9hUTJSZ1hiTDZNdjg3Qks5TlFHcjV4K1B2SS8xcnkrVVBpemdON2dyOC9nK1luekF4CjNXeFNaZm1MZ2I0aTRSeFlBN3FSRzRrSEFnTUJBQUdqUWpCQU1BNEdBMVVkRHdFQi93UUVBd0lCQmpBUEJnTlYKSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCUnFPRnNtamQ2TFd2SlBlbFNER1JqakNEV211akFOQmdrcQpoa2lHOXcwQkFRVUZBQU9DQVFFQVBOVjNQZHJmaWJxSERBaFVhaUJRa3I2d1FUMjVKbVNEQ2kvb1FNQ1hLQ2VDCk1FckprLzlxNTZZQWY0bENtdFlSNVZQT0w4enkyZ1hFL3VKUXhEcUdmY3phZmhBSk81STFLbE95L3VzckJkbHMKWGViUTc5TnFacDRWS0lWNjZJSUFyQjZuQ1dsV1F0Tm9VUmkrVkpxL1JFRzZTYjRndW1sYzdyaDN6YzVzSDYyRApsaGg5RHJVVU9ZVHhLT2t0bzU1N0hucHlXb096ZVcvdnRQelFDcVZZVDBiZisyMTVXZktFSWxLdUQ4ejdmRHZuCmFzcEhZY042K05PU0JCKzRJSVRoTmxRV3gwRGVPNHB6M04vR0NVemY3TnIvMUZOQ29jbnlZaDBpZ3p5WHhma1oKWWllc1pTTFgwenpHNVk2eVU4eEp6cnd3L25zT001RDc3ZElVa1I4SHJ3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IE89U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELiBPVT1TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTIKIyBTdWJqZWN0OiBPPVNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4gT1U9U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyCiMgTGFiZWw6ICJTZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTIiCiMgU2VyaWFsOiAwCiMgTUQ1IEZpbmdlcnByaW50OiA2YzozOTo3ZDphNDowZTo1NTo1OTpiMjozZjpkNjo0MTpiMToxMjo1MDpkZTo0MwojIFNIQTEgRmluZ2VycHJpbnQ6IDVmOjNiOjhjOmYyOmY4OjEwOmIzOjdkOjc4OmI0OmNlOmVjOjE5OjE5OmMzOjczOjM0OmI5OmM3Ojc0CiMgU0hBMjU2IEZpbmdlcnByaW50OiA1MTozYjoyYzplYzpiODoxMDpkNDpjZDplNTpkZDo4NTozOToxYTpkZjpjNjpjMjpkZDo2MDpkODo3YjpiNzozNjpkMjpiNToyMTo0ODo0YTphNDo3YTowZTpiZTpmNgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGR6Q0NBbCtnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFzRkFEQmRNUXN3Q1FZRFZRUUdFd0pLVURFbApNQ01HQTFVRUNoTWNVMFZEVDAwZ1ZISjFjM1FnVTNsemRHVnRjeUJEVHk0c1RGUkVMakVuTUNVR0ExVUVDeE1lClUyVmpkWEpwZEhrZ1EyOXRiWFZ1YVdOaGRHbHZiaUJTYjI5MFEwRXlNQjRYRFRBNU1EVXlPVEExTURBek9Wb1gKRFRJNU1EVXlPVEExTURBek9Wb3dYVEVMTUFrR0ExVUVCaE1DU2xBeEpUQWpCZ05WQkFvVEhGTkZRMDlOSUZSeQpkWE4wSUZONWMzUmxiWE1nUTA4dUxFeFVSQzR4SnpBbEJnTlZCQXNUSGxObFkzVnlhWFI1SUVOdmJXMTFibWxqCllYUnBiMjRnVW05dmRFTkJNakNDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFOQVYKT1ZLeFVyTzZ4Vm1DeEYxU3JqcERaWUJMeC9LV3ZOczJsOWFtWkl5b1h2RGpDaHozMzVjOVM2NzJYZXdodFVHcgp6YmwrZHArKytUNDJOS0E3d2ZZeEVVVjBrejFYZ01YNWlabks1YXRxMUxYYVFaQVF3ZGJXUW9uQ3YvUTRFcFZNClZBWDNOdVJGZzNzVVpkYmNERTNSM240TXF6dkVGYjQ2VnFaYWIzWnBVcWw2dWNqcmFwcGRVdEF0Q21zMUZna1EKaE5CcXlqb0dBRGRINUg1WFR6K0w2MmU0aUtyRnZsTlZzcEhFZmJtd2hSa0dlQzdiWVJyNmhmVktrYUhuRnRXTwpvam5mbExod0h5Zy9pL3hBWG1PRFBJTXFHcGxyejk1WmFqdjhieGJYSC8xS0VPdE9naFk2ckNjTVUvR3QxU1N3CmF3TlF3UzA4RnQxRU5DY2FkZnNDQXdFQUFhTkNNRUF3SFFZRFZSME9CQllFRkFxRnFYZGxCWmg4UUlINEQ1Y3MKT1BFSzdEelBNQTRHQTFVZER3RUIvd1FFQXdJQkJqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BMEdDU3FHU0liMwpEUUVCQ3dVQUE0SUJBUUJNT3FORXJMbEZzY2VUZnNnTENrTGZaT29jN2xsc0NMcUpYMnJLU3BXZWVvOEh4ZHBGCmNvSnhEanJTekcrbnRLRWp1L1lrbjhzWC9veW16c0xTMjh5Ti9ISDhBeW5CYkYwelgyUzJaVHVKYnhoMmVQWGMKb2tnZkdUK09rK3Z4K2hmdXpVN2pCQkpWMXVYazNmcytCWHppSFY3R3A3eVhUMmc2OWVrdUNrTzJyMWRjWW1oOAp0LzJqaW9TZ3JHSytLd21ITlBCcUFidWJLVlk4L2dBM3p5TnM4VTZxdG5SR0VteVI3alRWN0pxUjUwUytrREZ5CjFVa0M5Z0xsOUIvcmZObVdWYW4vN0lyNW1VZi9OVm9DcWdUTGlsdUhjU21SdmFTMGVnMjltdlZYSXdBSElSYy8KU2puUkJVa0xwN1kzZ2FWZGpLb3pYb0VvZktkOUorc0FybzAzCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1IZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExIE89SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkKIyBTdWJqZWN0OiBDTj1IZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExIE89SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkKIyBMYWJlbDogIkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTEiCiMgU2VyaWFsOiAwCiMgTUQ1IEZpbmdlcnByaW50OiA3Mzo5Zjo0Yzo0Yjo3Mzo1Yjo3OTplOTpmYTpiYToxYzplZjo2ZTpjYjpkNTpjOQojIFNIQTEgRmluZ2VycHJpbnQ6IGZlOjQ1OjY1OjliOjc5OjAzOjViOjk4OmExOjYxOmI1OjUxOjJlOmFjOmRhOjU4OjA5OjQ4OjIyOjRkCiMgU0hBMjU2IEZpbmdlcnByaW50OiBiYzoxMDo0ZjoxNTphNDo4YjplNzowOTpkYzphNTo0MjphNzplMTpkNDpiOTpkZjo2ZjowNTo0NToyNzplODowMjplYTphOToyZDo1OTo1NDo0NDoyNTo4YTpmZTo3MQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRU1UQ0NBeG1nQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFVRkFEQ0JsVEVMTUFrR0ExVUVCaE1DUjFJeApSREJDQmdOVkJBb1RPMGhsYkd4bGJtbGpJRUZqWVdSbGJXbGpJR0Z1WkNCU1pYTmxZWEpqYUNCSmJuTjBhWFIxCmRHbHZibk1nUTJWeWRDNGdRWFYwYUc5eWFYUjVNVUF3UGdZRFZRUURFemRJWld4c1pXNXBZeUJCWTJGa1pXMXAKWXlCaGJtUWdVbVZ6WldGeVkyZ2dTVzV6ZEdsMGRYUnBiMjV6SUZKdmIzUkRRU0F5TURFeE1CNFhEVEV4TVRJdwpOakV6TkRrMU1sb1hEVE14TVRJd01URXpORGsxTWxvd2daVXhDekFKQmdOVkJBWVRBa2RTTVVRd1FnWURWUVFLCkV6dElaV3hzWlc1cFl5QkJZMkZrWlcxcFl5QmhibVFnVW1WelpXRnlZMmdnU1c1emRHbDBkWFJwYjI1eklFTmwKY25RdUlFRjFkR2h2Y21sMGVURkFNRDRHQTFVRUF4TTNTR1ZzYkdWdWFXTWdRV05oWkdWdGFXTWdZVzVrSUZKbApjMlZoY21Ob0lFbHVjM1JwZEhWMGFXOXVjeUJTYjI5MFEwRWdNakF4TVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCCkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUtsVEFPTXVwdmFPK21EWUxaVSsrQ3dxVkU3TnVZUmhsRmhQanoyTDVFUHoKZFltTlVlVEROOUtLaUUxNUhyY1MzVU40U29xUzV0ZEkxUStrT2lsRU5iZ0g5bWdkVmMwNFVmQ01KREdGcjRQSgpmZWwzciswYWU1MFgrYk9kT0ZBUHBscDVrWUN2TjY2bTB6SDd0U1lKblR4YTcxSEZLOStXWGVzeUhnTGFjRW5zCmJnekltamVOOS9FMllFc21MSUtlMEhqekRROWpwRkV3NGZrckp4SUgyT3E5R0dLWXNGazNmYjd1OHlCUlFscUQKNzVPNmFSWHhZcDJmbVRtQ29iZDBMb3ZVeFF0N0wvRElDdG85ZVFxYWt4eWxLSEp6a1VPYXA5Rk5oWVM1cVhTUApGRURIM042c1FXUnN0Qm1iQW1OdEpHU1BSTElsNnM1ZGRBeGpNbHlOaCtVQ0F3RUFBYU9CaVRDQmhqQVBCZ05WCkhSTUJBZjhFQlRBREFRSC9NQXNHQTFVZER3UUVBd0lCQmpBZEJnTlZIUTRFRmdRVXBwRkMvUk5oU2lPZUNLUXAKNWRnVEJDUHVRU1V3UndZRFZSMGVCRUF3UHFBOE1BV0NBeTVuY2pBRmdnTXVaWFV3Qm9JRUxtVmtkVEFHZ2dRdQpiM0puTUFXQkF5NW5jakFGZ1FNdVpYVXdCb0VFTG1Wa2RUQUdnUVF1YjNKbk1BMEdDU3FHU0liM0RRRUJCUVVBCkE0SUJBUUFmNzNsQjRYdHVQN0tNaGpkQ1NrNGNOeDZOWnJva2djbFBFZzhod0FPWGhpVnRYZE1pS2Foc29nMnAKNnowR1c1azZ4OHpEbWpSL3F3N0lUaHpoK3VUY3pRMit2eVQrYk9kcndnM0lCcDVPaldFb3Btcjk1ZlppNmhnOApUcUJUbmJJNm5PdWxuSkVXdGsyQzRBd0ZTS2xzOWN6NHk1MUp0UEFDcGYxd0ErMktJYVd1RTRaSnd6Tnp2b2M3CmRJc1hSU1pNRnBHRC9tZDl6VTFqWi9yekF4S1dlQWFOc1dmdGpqKytuMDhDOWJNSkwvTk1oOThxeTVWOEFjeXMKTm5xL29uTjY5NC9CdFpxaEZMS1BNNThON3lMY1pudUV2VVVYQmowOHlybDNOSS9LNnM4L01UN2ppT09BU1NYSQpsN1dkbXBsTnNEejRTZ0NiWk4yZk9VdlJKOWU0Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1BY3RhbGlzIEF1dGhlbnRpY2F0aW9uIFJvb3QgQ0EgTz1BY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NwojIFN1YmplY3Q6IENOPUFjdGFsaXMgQXV0aGVudGljYXRpb24gUm9vdCBDQSBPPUFjdGFsaXMgUy5wLkEuLzAzMzU4NTIwOTY3CiMgTGFiZWw6ICJBY3RhbGlzIEF1dGhlbnRpY2F0aW9uIFJvb3QgQ0EiCiMgU2VyaWFsOiA2MjcxODQ0NzcyNDI0NzcwNTA4CiMgTUQ1IEZpbmdlcnByaW50OiA2OTpjMTowZDo0ZjowNzphMzoxYjpjMzpmZTo1NjozZDowNDpiYzoxMTpmNjphNgojIFNIQTEgRmluZ2VycHJpbnQ6IGYzOjczOmIzOjg3OjA2OjVhOjI4Ojg0OjhhOmYyOmYzOjRhOmNlOjE5OjJiOmRkOmM3OjhlOjljOmFjCiMgU0hBMjU2IEZpbmdlcnByaW50OiA1NTo5Mjo2MDo4NDplYzo5NjozYTo2NDpiOTo2ZToyYTpiZTowMTpjZTowYjphODo2YTo2NDpmYjpmZTpiYzpjNzphYTpiNTphZjpjMTo1NTpiMzo3ZjpkNzo2MDo2NgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRnV6Q0NBNk9nQXdJQkFnSUlWd29SbDBMRTQ4d3dEUVlKS29aSWh2Y05BUUVMQlFBd2F6RUxNQWtHQTFVRQpCaE1DU1ZReERqQU1CZ05WQkFjTUJVMXBiR0Z1TVNNd0lRWURWUVFLREJwQlkzUmhiR2x6SUZNdWNDNUJMaTh3Ck16TTFPRFV5TURrMk56RW5NQ1VHQTFVRUF3d2VRV04wWVd4cGN5QkJkWFJvWlc1MGFXTmhkR2x2YmlCU2IyOTAKSUVOQk1CNFhEVEV4TURreU1qRXhNakl3TWxvWERUTXdNRGt5TWpFeE1qSXdNbG93YXpFTE1Ba0dBMVVFQmhNQwpTVlF4RGpBTUJnTlZCQWNNQlUxcGJHRnVNU013SVFZRFZRUUtEQnBCWTNSaGJHbHpJRk11Y0M1QkxpOHdNek0xCk9EVXlNRGsyTnpFbk1DVUdBMVVFQXd3ZVFXTjBZV3hwY3lCQmRYUm9aVzUwYVdOaGRHbHZiaUJTYjI5MElFTkIKTUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FnOEFNSUlDQ2dLQ0FnRUFwOGJFcFNta0xPL2xHTVd3VUtOdgpVVHVmQ2xySndrZzRDc0ljb0JoL2tiV0h1VUEvM1Ixb0h3aUQxUzBlaUtENGoxYVBiWmtDa3BBVzFWOEliSW5YCjRheThJTUt4NElOUmltbE5BSlphYnkvQVJINmpEdVNSelZqdTNQdkhIa1ZIM1NlNUNBR2ZwaUVkOVVFdEwwejkKS0szZ2lxMGl0Rlpsam9aVWo1TkRLZDQ1Um5pak1DTzZ6ZkI5RTFmQVhkS0RhMGhNeEt1ZmdGcGJPcjNKcHlJLwpnQ2N6V3c2M2lneGRCemNJeTJ6U2VrY2lSRFhGek13dWp0MHE3YmQ5WmcxZllWRWlWUnZqUnVQalBkQTFZcHJiCnJ4VElXNkhNaVJ2aE1DYjhvSnNmZ2FkSEh3VHJvem1TQnArWjA3L1Q2azlRbkJuK2xvY2VQR1gyb3hna2c0WVEKNTFRK3FEcDJKRStCSWNYakR3TDRrNVJISUx2KzFBN1RhTG5keEhxRWd1TlRWSG5kMjV6UzhnZWJMcmE4UHUyRgpiZThsRWZLWEdrSmg5MHFYNkl1eEVBZjZaWUd5b2puUDl6ei9HUHZHOFZxTFdlSUNySHVTMEU0VVQxbEY5Z3hlCktGK3c2RDlGejgrdm0yLzdoTk4zV3BWdnJKU0VudTY4d0VxUFNwUDRSQ0hpTVVWaFVFNFEyT00xZkV3WnRONEYKdjZNR244aTF6ZVFmMXhjR0RYcVZkRlVOYUJyOEVCdGlaSjF0NEpXZ3c1UUhWdzBVNXIwRis3aWY1dCtMNHNibgpmcGIyVThXQU5GQW9XUEFTVUhFWE1Mcm1lR084OUxLdG15dXkvdUU1akY2NkN5Q1UzbnVEdVAvalZvMjNFZWs3CmpQS3h3VjJkcEF0TUs5bXlHUFcxbjBzQ0F3RUFBYU5qTUdFd0hRWURWUjBPQkJZRUZGTFlpRHJJbjNobTdZbnoKZXpod2xNa0NBamJRTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SHdZRFZSMGpCQmd3Rm9BVVV0aUlPc2lmZUdidAppZk43T0hDVXlRSUNOdEF3RGdZRFZSMFBBUUgvQkFRREFnRUdNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUNBUUFMCmUzS0h3R0NtU1V5SVdPWWRpUGNVWkVpbTJGZ0tEazhUTmQ4MUhkVHRCakhJZ1Q1cTFkMDdHakx1a0QwUjBpNzAKanNOakxpTm1zR2UrYjdiQUV6bGdxcUkwSlpOMVV0Nm5uYTBPaDRsU2NXb1dQQmtkZy9pYUtXVys5RCthMmZEegpXb2NoY1lCTnkrQTRteis3K3VBd1RjK0cwMlVRR1JqUmx3S3hLM0pDYUt5Z3ZVNWEyaGkvYTVpQjBQMmF2bDRWClNNMFJGYm5BS1Z5MDZJajNQamF1dDJMOUhtTGVjSGdRSEVoYjJyeWtPTHBuN1ZVK1hsZmYxQU5BVElHazBrOWoKcHdsQ0NSVDhBS25DZ0hOUExzQkEyUkY3U09wNkFzRFQ2eWdCSmxoMHdjQnpJbTJUbGYwNWZic3E0L2FDNHl5WApYMDRma1pUNi9peWoySFlhdUUyeU9FK2IraDFJWUhrbTR2UDlxZENhNkhDUFNYclc1YjBLRHRzdDg0Mi82K09rCmZjdkhsWEhvMnFOOHhjTDRkSklFRzRhc3BDSlRRTGFzL2t4MnovdVVNc0ExbjNZL2J1V1FicUNtSnFLNExMN1IKSzRYOXAyakl1Z0Vyc1d4MEhiaHpsZWZ1dDhjbDhBQk1BTEordGd1TEhQUEFVSjRsdWVBSTNqWm0vemVsMGJ0VQpaQ3pKSjdWTGtuNWwvOU10NGJsT3ZIK2tRU0dRUVhlbU9SL3FudU9mMEdadkJleXFkbjYvYXhhZzY3WEgvSkpVCkx5c1JKeVUzZUV4UmFyRHp6RmhkRlBGcVNCWC93Z2Uyc1kwUGpseFFSck05dndHWVQ3SlpWRWMrTkh0NGJWYVQKTG5QcVppaDR6UjBVdjZDUEx5NjRMbzd5RklyTTZiVjgrMnlkREtYaGxnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IE89VHJ1c3RpcyBMaW1pdGVkIE9VPVRydXN0aXMgRlBTIFJvb3QgQ0EKIyBTdWJqZWN0OiBPPVRydXN0aXMgTGltaXRlZCBPVT1UcnVzdGlzIEZQUyBSb290IENBCiMgTGFiZWw6ICJUcnVzdGlzIEZQUyBSb290IENBIgojIFNlcmlhbDogMzYwNTM2NDAzNzUzOTkwMzQzMDQ3MjQ5ODg5NzU1NjM3MTA1NTMKIyBNRDUgRmluZ2VycHJpbnQ6IDMwOmM5OmU3OjFlOjZiOmU2OjE0OmViOjY1OmIyOjE2OjY5OjIwOjMxOjY3OjRkCiMgU0hBMSBGaW5nZXJwcmludDogM2I6YzA6Mzg6MGI6MzM6YzM6ZjY6YTY6MGM6ODY6MTU6MjI6OTM6ZDk6ZGY6ZjU6NGI6ODE6YzA6MDQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGMxOmI0OjgyOjk5OmFiOmE1OjIwOjhmOmU5OjYzOjBhOmNlOjU1OmNhOjY4OmEwOjNlOmRhOjVhOjUxOjljOjg4OjAyOmEwOmQzOmE2OjczOmJlOjhmOjhlOjU1OjdkCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEWnpDQ0FrK2dBd0lCQWdJUUd4K3R0aUQ1Sk5NMmEvZkg4WXlnV1RBTkJna3Foa2lHOXcwQkFRVUZBREJGCk1Rc3dDUVlEVlFRR0V3SkhRakVZTUJZR0ExVUVDaE1QVkhKMWMzUnBjeUJNYVcxcGRHVmtNUnd3R2dZRFZRUUwKRXhOVWNuVnpkR2x6SUVaUVV5QlNiMjkwSUVOQk1CNFhEVEF6TVRJeU16RXlNVFF3TmxvWERUSTBNREV5TVRFeApNelkxTkZvd1JURUxNQWtHQTFVRUJoTUNSMEl4R0RBV0JnTlZCQW9URDFSeWRYTjBhWE1nVEdsdGFYUmxaREVjCk1Cb0dBMVVFQ3hNVFZISjFjM1JwY3lCR1VGTWdVbTl2ZENCRFFUQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQUQKZ2dFUEFEQ0NBUW9DZ2dFQkFNVlFlNTQ3TmREZnhJek5qcHZ0bzhBMm1mUkM2cWMrZ0lNUHBxZFpoOG1RUlVOKwpBT3FHZVNvRHZUMDNtWWxtdCtXS1ZvYVRuR2hMYUFTTWs1TUNQakRTTnpvaVlZa2NoVTU5ajlXdmV6WDJmaWhICmlUSGNEbmxrSDVuU1c3citmMkMvcmV2blBEZ3BhaS9sa1F0Vi8reHZXTlV0eWQ1TVpuR1BETmNFMmdmbUhoamoKdlNrQ3FQb2M0VnU1ZzZoQlNMd2FjWTNuWXVVdHN1dmZmTS9icTFyS01mRk1Jdk1GRS9lQytYTjVETDdYU3h6QQowUlU4azBGazBlYStJeGNpQUlsZUgydWxyRzZuUzR6dG8zTG1yMk5OTDRYU0ZEV2FMazZNNmpLWUtJYWhrUWxCCk9yVGg0L0w2OE1rS29rSGRxZU1EeDRnVk94elVHcFRYbjJSWkVtMENBd0VBQWFOVE1GRXdEd1lEVlIwVEFRSC8KQkFVd0F3RUIvekFmQmdOVkhTTUVHREFXZ0JTNituRWxlWXRYUVNVaGhndHg2N0prRG9zaFp6QWRCZ05WSFE0RQpGZ1FVdXZweEpYbUxWMEVsSVlZTGNldXlaQTZMSVdjd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFINVkvLzAxCkdYMmNHRStlc0N1OGpvd1UveXlnMmtkYncrK0JMYThGNm5SSVcvTStUZ2ZIYmNXems4OGlOVnkyUDNVblh3bVcKemFEK3ZrQU1YQkpWK0pPQ3lpbnBYajlXVjRzNE52ZEZHa3dvelo1QnVPMVdUSVNrUU1pNHNLVXJhWEFFYXNQNAoxQkl5K1E3RHNkd3loRVFzYjh0R0QrcG1RUTlQOFZpbHBnME5EMkhlcFo1ZGZXV2hQQmZucUZWTzc2REg3Y1pFCmYxVDFvK0NQOEh4VklvOHB0b0dqNFcxT0xCdUFaK3l0SUo4TVltSFZsLzlEN1MzQjJsMHBLb1UvckdYdWhnOEYKalpCZjMrNmY5TC91SGZ1WTVIK1FLNFI0RUE1c1NWUHZGVnRsUmtwZHI3cjdPbklkemZZbGlCNlh6Q0djS1FFTgpaZXRYMmZOWGxydEl6WUU9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1CdXlwYXNzIENsYXNzIDIgUm9vdCBDQSBPPUJ1eXBhc3MgQVMtOTgzMTYzMzI3CiMgU3ViamVjdDogQ049QnV5cGFzcyBDbGFzcyAyIFJvb3QgQ0EgTz1CdXlwYXNzIEFTLTk4MzE2MzMyNwojIExhYmVsOiAiQnV5cGFzcyBDbGFzcyAyIFJvb3QgQ0EiCiMgU2VyaWFsOiAyCiMgTUQ1IEZpbmdlcnByaW50OiA0NjphNzpkMjpmZTo0NTpmYjo2NDo1YTphODo1OTo5MDo5Yjo3ODo0NDo5YjoyOQojIFNIQTEgRmluZ2VycHJpbnQ6IDQ5OjBhOjc1Ojc0OmRlOjg3OjBhOjQ3OmZlOjU4OmVlOmY2OmM3OjZiOmViOmM2OjBiOjEyOjQwOjk5CiMgU0hBMjU2IEZpbmdlcnByaW50OiA5YToxMTo0MDoyNToxOTo3Yzo1YjpiOTo1ZDo5NDplNjozZDo1NTpjZDo0Mzo3OTowODo0NzpiNjo0NjpiMjozYzpkZjoxMTphZDphNDphMDowZTpmZjoxNTpmYjo0OAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRldUQ0NBMEdnQXdJQkFnSUJBakFOQmdrcWhraUc5dzBCQVFzRkFEQk9NUXN3Q1FZRFZRUUdFd0pPVHpFZApNQnNHQTFVRUNnd1VRblY1Y0dGemN5QkJVeTA1T0RNeE5qTXpNamN4SURBZUJnTlZCQU1NRjBKMWVYQmhjM01nClEyeGhjM01nTWlCU2IyOTBJRU5CTUI0WERURXdNVEF5TmpBNE16Z3dNMW9YRFRRd01UQXlOakE0TXpnd00xb3cKVGpFTE1Ba0dBMVVFQmhNQ1RrOHhIVEFiQmdOVkJBb01GRUoxZVhCaGMzTWdRVk10T1Rnek1UWXpNekkzTVNBdwpIZ1lEVlFRRERCZENkWGx3WVhOeklFTnNZWE56SURJZ1VtOXZkQ0JEUVRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCCkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQU5mSFh2ZkJCOVIzKzBNaDlQVDFhZVR1TWdIYm80WWY1RmtOdXVkMWcxTHIKNmh4aEZVaTdIUWZLaks2dzNKYWQ2c05na29hQ0tIT2NWZ2IvUzJUd0RDbzNTYlhsend4ODd2Rkt1M013WmZQVgpMNE8yZnVQbjlaNnJZUG5UOFoyU2RJcmtISmFzVzREcHRmUXhoNk5SL01kK29XK09VM2ZVbDhGVk01SStHQzkxCjFLMkdTY3VWcjFRR2JOZ0dFNDFiLytFbUdWbkFKTHFCY1htUVJGQm9KSlJmdUxNUjhTbEJZYU5CeXlNMjFjSHgKTWxBUVRuLzBocFBzaE5PT3ZFdS9YQUZPQnozY0ZJcVVDcVRxYy9zTFVlZ1RCeGo2RHZFcjBWUVZmVHpoOTdRWgpRbWRpWG5mZ29sWHN0dGxwRjlVNnIwVHRTc1dlNUhvbmZPVjExNnJMSmVmZmF3cmJEMDJUVHFpZ3pYc3U4bGtCCmFyY051QWVCZm9zNEd6am1DbGVaUGU0aDZLUDFEQmJkaSt3MGpwd3FIQUFWRjQxb2c5SndueGdJelJGbzFjbHIKVXMzRVJvL2N0ZlBZVjNNZTZaUTVCTC9UM2pqZXRGUHNhUnlpZnNTUDVCdHdyZktpK2Z2M0ZtUm1hWjlKVWFMaQpGUmhuQmtwLzFXeTFUYk16NEdIclhiN3BtQTh5MXgxTFBDNWFBVktSQ2ZMZjZvM1lCa0JqcWhIay9zTTNuaFJTClAvVGl6UEpoazlIOVoydlhVcTYvYUt0QVE2QlhOVk40OEZQNFlVSUhaTWJYYjV0TU9BMWpyR0t2Tm91aWN3b04KOVNHOWRLcE42bklEU2R2SFh4MWlZOGY5M1pIc00rNzFiYlJ1TUdqZXlOWW1zSFZlZTdRSElKaWhkaks0VFd4UApBZ01CQUFHalFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUVGTW1BZCtCaWtvTDFScHp6CnV2ZE13OTY0bzYwNU1BNEdBMVVkRHdFQi93UUVBd0lCQmpBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQWdFQVUxOGgKOWJxd09sSTVMSkt3YkFESjc4NGc3d2J5bHA3cHBIUi9laGI4dC9XMit4VWJQNnVtd0hKZEVMRng3cnhQNDYycwpBMjB1Y1M2dnhPT3RvNzBNRWFlMC8wcXlleEFRSDZkWFFiTEFydlFzV2RaSEVJanpJVkVwTU1wZ2hxOUdxeDN0Ck9sdXdsTjVFNDBFSW9zSHNIZGI5VDdiV1I5QVVDOHJteXJWN2QzNUJIMTZEeDdhTU9aYXdQNWFCUVc5Z2tPTG8KK2ZzaWNkbDlzejFHdjdTRXI1QWNENDhTYXEvdjdoNTZyZ0pLaWhjcmR2NnNWSWtrTEU4L3RyS25Ub3lva1pmNwpLY1o3WEMyNXkyYTJ0NmhiRWxHRnRRbCtZbmh3L3FscVlMWWREbmtNL2NycUpJQnl3NWMvOG5lclF5SUt4K3UyCkRJU0NMSUJyUVlvSXdPdWxhOStaRXN1SzFWNkFESkhnSmdnMlNNWDZPQkUxL3lXRExmSjZ2OXI5anY2bHkwVXMKSDhTSVU2NTNEdG1hZHNXT0xCMmp1dFhzTXE3QXFxejMwWHBONjlRSDRrajNJbzZ3cEo5cXpvNnlzbUQwb3lMUQpJK3VVV25wcDNRKy9RRmVzYTFsUTJhT1o0VzcralFGNUp5TVYzcEtkZXdsTld1ZExTREJhR09ZS2JlYVA0Tks3CjV0OThiaUdDd1dnNVRiU1lXR1ppekVxUVhzUDZKd1N4ZVJWMG1jeStyU0RlSm1BYzYxWlJwcVBxNUtNL3AvOWgKM1BGYVRXd3lJMFB1cktqdTdrb1NDVHhkY2NLK2VmckNoMmdkQy8xY2Fjd0cwSnA5VkprcXlUa2FHYTlMS2tQegpZMTFhV09JdjR4M2txZGJRQ3RDZXY5ZUJDZkhKeHlZTnJKZ1dWcUE9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1CdXlwYXNzIENsYXNzIDMgUm9vdCBDQSBPPUJ1eXBhc3MgQVMtOTgzMTYzMzI3CiMgU3ViamVjdDogQ049QnV5cGFzcyBDbGFzcyAzIFJvb3QgQ0EgTz1CdXlwYXNzIEFTLTk4MzE2MzMyNwojIExhYmVsOiAiQnV5cGFzcyBDbGFzcyAzIFJvb3QgQ0EiCiMgU2VyaWFsOiAyCiMgTUQ1IEZpbmdlcnByaW50OiAzZDozYjoxODo5ZToyYzo2NDo1YTplODpkNTo4ODpjZTowZTpmOTozNzpjMjplYwojIFNIQTEgRmluZ2VycHJpbnQ6IGRhOmZhOmY3OmZhOjY2Ojg0OmVjOjA2OjhmOjE0OjUwOmJkOmM3OmMyOjgxOmE1OmJjOmE5OjY0OjU3CiMgU0hBMjU2IEZpbmdlcnByaW50OiBlZDpmNzplYjpiYzphMjo3YToyYTozODo0ZDozODo3Yjo3ZDo0MDoxMDpjNjo2NjplMjplZDpiNDo4NDozZTo0YzoyOTpiNDphZToxZDo1Yjo5MzozMjplNjpiMjo0ZAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRldUQ0NBMEdnQXdJQkFnSUJBakFOQmdrcWhraUc5dzBCQVFzRkFEQk9NUXN3Q1FZRFZRUUdFd0pPVHpFZApNQnNHQTFVRUNnd1VRblY1Y0dGemN5QkJVeTA1T0RNeE5qTXpNamN4SURBZUJnTlZCQU1NRjBKMWVYQmhjM01nClEyeGhjM01nTXlCU2IyOTBJRU5CTUI0WERURXdNVEF5TmpBNE1qZzFPRm9YRFRRd01UQXlOakE0TWpnMU9Gb3cKVGpFTE1Ba0dBMVVFQmhNQ1RrOHhIVEFiQmdOVkJBb01GRUoxZVhCaGMzTWdRVk10T1Rnek1UWXpNekkzTVNBdwpIZ1lEVlFRRERCZENkWGx3WVhOeklFTnNZWE56SURNZ1VtOXZkQ0JEUVRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCCkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQUtYYUNwVVdVT09WOGw2ZGRqRUdNbnFiOFJCMnVBQ2F0VkkyelNSSHNKOFkKWkx5YTl2clZlZGlRWWt3aUw5NDRQZGJncU9rY0xOdDRFZW1PYUZFVmNzZnpNNGZrb0YwTFhPQlhCeW93OWMzRQpOM2NvVFJpUjVyL1ZVdjF4TFhBKzU4YkVpdVB3S0F2MGRwaWhpNGRWc2pvVC9MYytKemVPSXVPb1R5cnZZTHM5CnR6bkREZ0ZIbVYwU1Q5dEQrbGVoN2ZtZHZoRkhKbHNUbUt0ZEZvcXdOeHhYblVYL2lKWTJ2N3ZLQjN0dmgyUFgKMERKcTFsMXNEUEd6YmpuaWF6RXVPUUFuRk40NHdPd1pab1lTNkoxeUZoTmtVc2VwTnh6OWdqRHRoQmdkOUs1YwovM0FUQU91eDlUTjZTOVpWK0FXTlMybXc5Yk1vTmx3VXhGRnpUV3NMOFRRSDJ4YzUxOXdvZTJ2MW4vTXV3VThYCktoRHp6TXJvNi8xcnF5NmFueTJDYmdUVVVnR1RMVDJHL0g3ODMrOUNIYVpyNzdrZ3h2ZTlvS2VWL2FmbWlTVFkKekl3MGJPSWpMOWtTR2lHNVZaRnZDNUY1R1F5dFFJZ0xjT0o2MGc3WWFFaTdnaE01RUZqcDJDb0h4aExiV052UwpPMVVRUndVVloySitHR09tUmo4SkRsUXlYcjhOWW5vbjc0RG8yOWxMQmxvM1dpWFFDQkozMUc4SlVKYzl5QjNECjM0eEZNRmJHMDJTclp2UEFYcGFjdzhUdnczeHJpenA1ZjdOSnp6M2lpWitnTUV1RnVaeVVKSG1QZld1cFJXZ1AKSzlEeDJoekxhYmpLU1dKdHlOQmpZdDFnRDFpcWo2RzhCYVZtb3M4YmRyS0VaTEZNT1ZMQU1McndqRXNDc0xhMwpBZ01CQUFHalFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUVGRWU0emYvbGIrNzRzdXd2ClRnNzVKYkNPUEd2RE1BNEdBMVVkRHdFQi93UUVBd0lCQmpBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQWdFQUFDQWoKUVRVRWtNSkFZbUR2NGpWTTF6K3M0alNRdUtGdmR2b1dGcVJJTnl6cGtNTHlQUGdLbjlpQjVidGIyaVVzcEtkVgpjU1F5OXNnTDhyeHErSk9zc2dmQ1g1L2J6TWlLcXI1cWIrRkpFTXd4MTRDN3U4allvZzVrVitxaTljS3BNUlhTCklHcnMvQ0lCS00rR3VJQWVxY3dScFR6eUZyTkhuZnpTZ0NIRXk5QkhjRUdoeW9NWkNDeHQ4bDEzbklvVUU5UTIKSEpMdzVRWTMzS2Jta0pzNGoxeHJHMGFHUTBKZlBnRUhVMVJkWlgzM2luT2htbFJhSHlsREZDZkNoUSsxaUhzYQpPNVMzSFdDbnRaem5LV2xYV3B1VGVrTXdHd1BYWXNoQXBxcjhaT1JLMTVGVEFhZ2dpRzZjWDBTNXkyQ0JOT3h2CjAzM2FTRi9ydEpDOExha2NDNndjMWFKb0lJQUUxdnl4ankrN1NqRU5Tb1ljNitJMktTYjEydGpFOG5WaHozNnUKZG1OS2VrQmxrNGY0SG9DTWh1V0cxbzhPL0ZNc1lPZ1dZUnFpUGtON3pUbGdWR3IxOG9rbUFXaURTS0l6Nk1rRQprYklSTkJFKzZ0QkRHUjhEazVBTS8xRTlWL1JCYnVITG9MN3J5V1BOYmN6aytEYXFhSjN0dlYyWGNFUU50ZzQxCjNPRU1YYnVnVVpUTGZoYnJFUytqa2tYSVRISFp2TW1aVWxkR0wxRFB2VFZwOUQwVnpnYWxMQTgrOW9HNmxMdkQKdTc5bGVOS0dlZjlKT3hxRERQRGVlT3pJOGsxTUd0NkNLZmpCV3RydDd1WW5YdWhGMEowY1VhaG9xMFRqMEl0cQo0L2c3dTl4TjEyVHlVYjdtcXF0YTZUSHVCcnh6dnhOaUNwL0h1WmM9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1ULVRlbGVTZWMgR2xvYmFsUm9vdCBDbGFzcyAzIE89VC1TeXN0ZW1zIEVudGVycHJpc2UgU2VydmljZXMgR21iSCBPVT1ULVN5c3RlbXMgVHJ1c3QgQ2VudGVyCiMgU3ViamVjdDogQ049VC1UZWxlU2VjIEdsb2JhbFJvb3QgQ2xhc3MgMyBPPVQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkggT1U9VC1TeXN0ZW1zIFRydXN0IENlbnRlcgojIExhYmVsOiAiVC1UZWxlU2VjIEdsb2JhbFJvb3QgQ2xhc3MgMyIKIyBTZXJpYWw6IDEKIyBNRDUgRmluZ2VycHJpbnQ6IGNhOmZiOjQwOmE4OjRlOjM5OjkyOjhhOjFkOmZlOjhlOjJmOmM0OjI3OmVhOmVmCiMgU0hBMSBGaW5nZXJwcmludDogNTU6YTY6NzI6M2U6Y2I6ZjI6ZWM6Y2Q6YzM6MjM6NzQ6NzA6MTk6OWQ6MmE6YmU6MTE6ZTM6ODE6ZDEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGZkOjczOmRhOmQzOjFjOjY0OjRmOmYxOmI0OjNiOmVmOjBjOmNkOmRhOjk2OjcxOjBiOjljOmQ5Ojg3OjVlOmNhOjdlOjMxOjcwOjdhOmYzOmU5OjZkOjUyOjJiOmJkCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEd3pDQ0FxdWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUXNGQURDQmdqRUxNQWtHQTFVRUJoTUNSRVV4Ckt6QXBCZ05WQkFvTUlsUXRVM2x6ZEdWdGN5QkZiblJsY25CeWFYTmxJRk5sY25acFkyVnpJRWR0WWtneEh6QWQKQmdOVkJBc01GbFF0VTNsemRHVnRjeUJVY25WemRDQkRaVzUwWlhJeEpUQWpCZ05WQkFNTUhGUXRWR1ZzWlZObApZeUJIYkc5aVlXeFNiMjkwSUVOc1lYTnpJRE13SGhjTk1EZ3hNREF4TVRBeU9UVTJXaGNOTXpNeE1EQXhNak0xCk9UVTVXakNCZ2pFTE1Ba0dBMVVFQmhNQ1JFVXhLekFwQmdOVkJBb01JbFF0VTNsemRHVnRjeUJGYm5SbGNuQnkKYVhObElGTmxjblpwWTJWeklFZHRZa2d4SHpBZEJnTlZCQXNNRmxRdFUzbHpkR1Z0Y3lCVWNuVnpkQ0JEWlc1MApaWEl4SlRBakJnTlZCQU1NSEZRdFZHVnNaVk5sWXlCSGJHOWlZV3hTYjI5MElFTnNZWE56SURNd2dnRWlNQTBHCkNTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDOWRaUHdZaUp2Sks3Z2VuYXNmYjNaSk5XNHQvek4KOEVMZzYzaUlWbDZibWxRZFRReUs5dFBQY1BSU3RkaVRCT05HaG5GQlNpdndLaXhWQTlaSXcrQTVPTzN5WER3LwpSTHlUUFdHclRzME52dkFnSjFnT1JIOEVHb2VsMTVZVU5wRFFTWHVoZGZzYWEzT3grTTZwQ1N6eVU5WERGRVM0CmhxWDJpeXM1MnFNelZObjZjaHIzSWhVY2lKRnJmMmJsdzJxQXNDVHozNFpGaVAwWmYzV0hIeCt4R3dwekpGdTUKWmVBc1ZNaGcwMllYUCtITVZETnprUUk2cG45N2RqbWlINWEyT0s2MXlKTjBIWjY1dE9WZ25TOVcwZURyWGx0TQpFbkFNYkVRZ3F4SFk5Qm4yMHB4U04rZjZ0c0l4TzByVUZKbXR4eHIxWFYvNkI3aDhEUi9XZ3g2ekFnTUJBQUdqClFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01CMEdBMVVkRGdRV0JCUzEKQS9kMk8yR0NhaEtxR0ZQckF5R1V2LzdPeWpBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQVZqM3ZsTlc5Mm5PeQpXTDZ1a0syWUo1ZitBYkd3VWdDNFRlUWJJWFFiZnNEdVhta3FKYTljMWgzYTBubko4NWNwNElhSDNnUlpEL0ZaCjFHU0ZTNW12SlFRZXlVYXBsOTZDc2h0d241ejJyM0V4M1hzRnBTelR1Y3BIOXNyeTl1ZXR1VWcvdkJhM3dXMzAKNmdtdjdQTzE1d1dlcGg2S1UxSFdrNEhNZEpQMnVkcW1KUVYwZVZwK1FENkNTeVlSTUc3aFAwSEhSd0ExMWZYVAo5MVErZ1QzYVNXcWFzKzhRUGVicmI5SElJa2ZMek04Qk1aTFpHT01pdmdrZUdqNWFzdVJyREZSNmZVTk91SW1sCmU5ZWlQWmFHelBJbU5DMXFrcDJhR3RBdzRsMU9CTEJmaXlCK2Q4RTlsWUxSUnBvN1BIaTRiNkhRRFdTaWVCNHAKVHBQRHBGUVVXdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBSb290IENBIE89QVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1cwojIFN1YmplY3Q6IENOPUVFIENlcnRpZmljYXRpb24gQ2VudHJlIFJvb3QgQ0EgTz1BUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzCiMgTGFiZWw6ICJFRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBSb290IENBIgojIFNlcmlhbDogMTEyMzI0ODI4Njc2MjAwMjkxODcxOTI2NDMxODg4NDk0OTQ1ODY2CiMgTUQ1IEZpbmdlcnByaW50OiA0Mzo1ZTo4ODpkNDo3ZDoxYTo0YTo3ZTpmZDo4NDoyZTo1MjplYjowMTpkNDo2ZgojIFNIQTEgRmluZ2VycHJpbnQ6IGM5OmE4OmI5OmU3OjU1OjgwOjVlOjU4OmUzOjUzOjc3OmE3OjI1OmViOmFmOmMzOjdiOjI3OmNjOmQ3CiMgU0hBMjU2IEZpbmdlcnByaW50OiAzZTo4NDpiYTo0Mzo0Mjo5MDo4NToxNjplNzo3NTo3MzpjMDo5OToyZjowOTo3OTpjYTowODo0ZTo0Njo4NTo2ODoxZjpmMTo5NTpjYzpiYTo4YToyMjo5Yjo4YTo3NgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUF6Q0NBdXVnQXdJQkFnSVFWSUQ1b0hQdFB3Qk15b25ZNDNIbVNqQU5CZ2txaGtpRzl3MEJBUVVGQURCMQpNUXN3Q1FZRFZRUUdFd0pGUlRFaU1DQUdBMVVFQ2d3WlFWTWdVMlZ5ZEdsbWFYUnpaV1Z5YVcxcGMydGxjMnQxCmN6RW9NQ1lHQTFVRUF3d2ZSVVVnUTJWeWRHbG1hV05oZEdsdmJpQkRaVzUwY21VZ1VtOXZkQ0JEUVRFWU1CWUcKQ1NxR1NJYjNEUUVKQVJZSmNHdHBRSE5yTG1WbE1DSVlEekl3TVRBeE1ETXdNVEF4TURNd1doZ1BNakF6TURFeQpNVGN5TXpVNU5UbGFNSFV4Q3pBSkJnTlZCQVlUQWtWRk1TSXdJQVlEVlFRS0RCbEJVeUJUWlhKMGFXWnBkSE5sClpYSnBiV2x6YTJWemEzVnpNU2d3SmdZRFZRUUREQjlGUlNCRFpYSjBhV1pwWTJGMGFXOXVJRU5sYm5SeVpTQlMKYjI5MElFTkJNUmd3RmdZSktvWklodmNOQVFrQkZnbHdhMmxBYzJzdVpXVXdnZ0VpTUEwR0NTcUdTSWIzRFFFQgpBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRElJTURzNE1WTHF3ZDRsZk5FN3ZzTERQOTBqbUc3c1dMcUk5aXJvV1V5CmV1dU9GMCtXMkFwN2thSmpiTWVNVEM1NXY2a0YvR2xjbFkxaStibHc3Y05SZmRDVDVtenJNRXZodkgyL1Vwdk8KYm50bDhqaXh3S0l5NzJLeWFPQmhVOEUybGYvc2xMbzJycHdjcHpJUDVYeTB4bTkwL1hzWTZLeFg3UVlnU3pJdwpXRnY5emFqbW9meHd2STZTYzl1WHAzd2hyajNCOVVpSGJDZTlueVYwZ1ZXdzkzWDJQYVJrYTlaUDU4NUFyUS9kCk10TzhpaEpUbU1tSit4QWRUWDdOZmg5V0RTRndoZllnZ3gvMnVoOEVqK3AzaURYRS8rcE9vWXROUDJNYlJNTkUKMUNWMnlyZU4xeDVLWm1UTlhNV2NnK0hDQ0lpYTdFNmo4VDRjTE5sc0hhRkxBZ01CQUFHamdZb3dnWWN3RHdZRApWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3SFFZRFZSME9CQllFRkJMeVdqN3FWaHkvCnpRYXM4ZkVseWFsTDFCU1pNRVVHQTFVZEpRUStNRHdHQ0NzR0FRVUZCd01DQmdnckJnRUZCUWNEQVFZSUt3WUIKQlFVSEF3TUdDQ3NHQVFVRkJ3TUVCZ2dyQmdFRkJRY0RDQVlJS3dZQkJRVUhBd2t3RFFZSktvWklodmNOQVFFRgpCUUFEZ2dFQkFIdjI1TUFOcWhsSHQwMVhvLzZ0dTdGcTFRK2UyK1JqeFk2aFVGYVRscmc0d0NRaVpyeFRGR0dWCnY5REhLcFk1UDMwb3N4QkFJV3JFcjdCU2R4amhsdGhXWGVQZE5sNGRwMUJVb01VcTVLcU1sSXBQblRYL2RxUUcKRTVHaW9uMEFSRDlWMDRJOEd0VmJ2RlpNSWk1R1E0b2tRQzN6RXJnN2NCcWtscmthcjRkQkdtb1lEUVpQeHo1dQp1U2xORFVtSkVZY3lXK1pMQk1qa1hPWjBjNVJkRnBnVGxmNzcyN0ZFNVRwd3JEZHI1ck16Y2lqSnMxZWc5Z0lXCmlBWUx0cVpMSUNqVTNqMkxyVGNGVTNUK2JzeThReGR4WHZuRnpCcXBZZTczZGd6emN2UnlyYzl5QWpZSFI4L3YKR1ZDSllNenBKSlVQd3NzZDhtOTJrTWZNZGNHV3haMD0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOSBPPUQtVHJ1c3QgR21iSAojIFN1YmplY3Q6IENOPUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOSBPPUQtVHJ1c3QgR21iSAojIExhYmVsOiAiRC1UUlVTVCBSb290IENsYXNzIDMgQ0EgMiAyMDA5IgojIFNlcmlhbDogNjIzNjAzCiMgTUQ1IEZpbmdlcnByaW50OiBjZDplMDoyNTo2OTo4ZDo0NzphYzo5Yzo4OTozNTo5MDpmNzpmZDo1MTozZDoyZgojIFNIQTEgRmluZ2VycHJpbnQ6IDU4OmU4OmFiOmIwOjM2OjE1OjMzOmZiOjgwOmY3OjliOjFiOjZkOjI5OmQzOmZmOjhkOjVmOjAwOmYwCiMgU0hBMjU2IEZpbmdlcnByaW50OiA0OTplNzphNDo0MjphYzpmMDplYTo2Mjo4NzowNTowMDo1NDpiNToyNTo2NDpiNjo1MDplNDpmNDo5ZTo0MjplMzo0ODpkNjphYTozODplMDozOTplOTo1NzpiMTpjMQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRU16Q0NBeHVnQXdJQkFnSURDWVB6TUEwR0NTcUdTSWIzRFFFQkN3VUFNRTB4Q3pBSkJnTlZCQVlUQWtSRgpNUlV3RXdZRFZRUUtEQXhFTFZSeWRYTjBJRWR0WWtneEp6QWxCZ05WQkFNTUhrUXRWRkpWVTFRZ1VtOXZkQ0JECmJHRnpjeUF6SUVOQklESWdNakF3T1RBZUZ3MHdPVEV4TURVd09ETTFOVGhhRncweU9URXhNRFV3T0RNMU5UaGEKTUUweEN6QUpCZ05WQkFZVEFrUkZNUlV3RXdZRFZRUUtEQXhFTFZSeWRYTjBJRWR0WWtneEp6QWxCZ05WQkFNTQpIa1F0VkZKVlUxUWdVbTl2ZENCRGJHRnpjeUF6SUVOQklESWdNakF3T1RDQ0FTSXdEUVlKS29aSWh2Y05BUUVCCkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU5PeVNzOTZSKzkxbXlQNk9pL1dVRVdKTlRyR2E5disyd0JvcU9BREVSMDMKVUFpZlRVcG9sRFd6VTlHVVk2Y2dWcS9lVVhqc0tqM3pTRWhRUGdyZlJsV0xKMjNERUUwTmtWSkQySWZnWFU0Mgp0U0hLWHpsQUJGOWJmc3lqeGl1cFFCN1pOb1RXU1BPU0hqUkdJQ1RCcEZHT1NocnZVRDlwWFJsL1JjUEhBWTlSCnlTUG9jcTYwdkZZSmZ4TExITEd2S1pBS3lWWE1EOU8wR3UxSE5WcEs3Wnh6QkNIUXFyME1FN1VBeWlac3hHc00KbEZxVmxOcFFtdkgvcFN0bU1hVEpPS0RmSFIrNENTN3pwK2huVXF1VkgrQkdQdGlrdzhwYXhUR0E2RWlhbjVScAovaG5kMkhOOGdjcVczbzd0c3pJRlpZUTA1dWI5VnhDMVgzYS9MN0FRRGNVQ0F3RUFBYU9DQVJvd2dnRVdNQThHCkExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRlAzYUZNU2ZNTjRodlI1Q09meXJZeU5KNFBHRU1BNEcKQTFVZER3RUIvd1FFQXdJQkJqQ0Iwd1lEVlIwZkJJSExNSUhJTUlHQW9INmdmSVo2YkdSaGNEb3ZMMlJwY21WagpkRzl5ZVM1a0xYUnlkWE4wTG01bGRDOURUajFFTFZSU1ZWTlVKVEl3VW05dmRDVXlNRU5zWVhOekpUSXdNeVV5Ck1FTkJKVEl3TWlVeU1ESXdNRGtzVHoxRUxWUnlkWE4wSlRJd1IyMWlTQ3hEUFVSRlAyTmxjblJwWm1sallYUmwKY21WMmIyTmhkR2x2Ym14cGMzUXdRNkJCb0QrR1BXaDBkSEE2THk5M2QzY3VaQzEwY25WemRDNXVaWFF2WTNKcwpMMlF0ZEhKMWMzUmZjbTl2ZEY5amJHRnpjMTh6WDJOaFh6SmZNakF3T1M1amNtd3dEUVlKS29aSWh2Y05BUUVMCkJRQURnZ0VCQUgrWDJ6REkzNlNjZlNGNmdIRE9GQkpwaUJTVllFUUJyTExwTUUrYlVNSm0ySDZOTUxWd01lbmkKYWNmemNOc2dGWWJRRGZDK3JBRjFoTTUrbjAyL3QyQTduUFBLSGVKZWFOaWpuWmZsUUdEU05pSCswTFM0RjlwMApvMy9VMzdDWUFxeHZhMnNzSlNSeW9XWHVKVnJsNWpMbjh0K3JTZnJ6a0drajJ3VFo1MXhZL0dYVWw3N00vQzRLCnpDVXFOUVQ0WUpFVmRUMUIveU1mR2NoczY0SlRCS2JrVENKTmpZeTZ6bHR6N0dSVVVHM1JuRlg3YWNNMnc0eTgKUElXbWF3b21EZUNUbUdDdWZzWWtsNHBoWDVHT1pwSUpoemJOaTVzdFB2WlIxRkRVV1NpOWcvTE1LSHRUaG0zWQpKb2h3MStxUnpUNjV5c0NRYmxyR1huUmwxMXorbytJPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RC1UUlVTVCBSb290IENsYXNzIDMgQ0EgMiBFViAyMDA5IE89RC1UcnVzdCBHbWJICiMgU3ViamVjdDogQ049RC1UUlVTVCBSb290IENsYXNzIDMgQ0EgMiBFViAyMDA5IE89RC1UcnVzdCBHbWJICiMgTGFiZWw6ICJELVRSVVNUIFJvb3QgQ2xhc3MgMyBDQSAyIEVWIDIwMDkiCiMgU2VyaWFsOiA2MjM2MDQKIyBNRDUgRmluZ2VycHJpbnQ6IGFhOmM2OjQzOjJjOjVlOjJkOmNkOmM0OjM0OmMwOjUwOjRmOjExOjAyOjRmOmI2CiMgU0hBMSBGaW5nZXJwcmludDogOTY6Yzk6MWI6MGI6OTU6YjQ6MTA6OTg6NDI6ZmE6ZDA6ZDg6MjI6Nzk6ZmU6NjA6ZmE6Yjk6MTY6ODMKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGVlOmM1OjQ5OjZiOjk4OjhjOmU5Ojg2OjI1OmI5OjM0OjA5OjJlOmVjOjI5OjA4OmJlOmQwOmIwOmYzOjE2OmMyOmQ0OjczOjBjOjg0OmVhOmYxOmYzOmQzOjQ4OjgxCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFUXpDQ0F5dWdBd0lCQWdJRENZUDBNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1GQXhDekFKQmdOVkJBWVRBa1JGCk1SVXdFd1lEVlFRS0RBeEVMVlJ5ZFhOMElFZHRZa2d4S2pBb0JnTlZCQU1NSVVRdFZGSlZVMVFnVW05dmRDQkQKYkdGemN5QXpJRU5CSURJZ1JWWWdNakF3T1RBZUZ3MHdPVEV4TURVd09EVXdORFphRncweU9URXhNRFV3T0RVdwpORFphTUZBeEN6QUpCZ05WQkFZVEFrUkZNUlV3RXdZRFZRUUtEQXhFTFZSeWRYTjBJRWR0WWtneEtqQW9CZ05WCkJBTU1JVVF0VkZKVlUxUWdVbTl2ZENCRGJHRnpjeUF6SUVOQklESWdSVllnTWpBd09UQ0NBU0l3RFFZSktvWkkKaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFKbnhoRFJ3dWkrM01LQ092WHdFejc1aXZKbjlncGZTZWdwbgpsamdKOWhCT2xTSnptWTNhRlMzbkJmd1pjeUszanBnQXZEdzlyS0ZzKzlaNUpVdXQ4TXhrMm9nK0tiZ1BDZE0wCjNUUDFZdEhoelJucDdoaFBURml1NGg3V0RGc1ZXdGc2dU1RWVpCN2pNN0sxaVhkT0RML1psR3NUbDI4U28vNloKcVFUTUZleGdhRGJ0Q0h1MzliK1Q3V1l4ZzR6R2NUU0hUaGZxcjR1UmpSeFdRYTRpTjE0MzhoM1owUzBOTDJsUgpwNzVtcG9vNktyM0hHckhoRlBDK09oMjV6MXV4YXY2MHNVWWdvdnNlTzNEdms1aDlqSE9XOHNYdmhYQ3RLU2I4CkhnUStIS0RZRDh0U2cySjg3b3RUbFpDcFY2THFZUVhZK1UzRUovcHVyZTM1MTFIM2E2VUNBd0VBQWFPQ0FTUXcKZ2dFZ01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZOT1Vpa3hpRXlvWkxzeXZjb3A5TnRlYQpITnhuTUE0R0ExVWREd0VCL3dRRUF3SUJCakNCM1FZRFZSMGZCSUhWTUlIU01JR0hvSUdFb0lHQmhuOXNaR0Z3Ck9pOHZaR2x5WldOMGIzSjVMbVF0ZEhKMWMzUXVibVYwTDBOT1BVUXRWRkpWVTFRbE1qQlNiMjkwSlRJd1EyeGgKYzNNbE1qQXpKVEl3UTBFbE1qQXlKVEl3UlZZbE1qQXlNREE1TEU4OVJDMVVjblZ6ZENVeU1FZHRZa2dzUXoxRQpSVDlqWlhKMGFXWnBZMkYwWlhKbGRtOWpZWFJwYjI1c2FYTjBNRWFnUktCQ2hrQm9kSFJ3T2k4dmQzZDNMbVF0CmRISjFjM1F1Ym1WMEwyTnliQzlrTFhSeWRYTjBYM0p2YjNSZlkyeGhjM05mTTE5allWOHlYMlYyWHpJd01Ea3UKWTNKc01BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQTA3WHRhUEtTVWlPOGFFWFVITDdQK1BQb2VVU2JyaC9ZcAozdUR4MU1Za0NlbkJ6MVVidEREWnpocitCbEdtRmFRdDc3Skx2eUFvSlVuUnBqWjNOT2hrMzFLeEVjZHplczA1Cm5zS3RqSEVoOGxwcnI5ODhUbFd2c29SbEZJbTVkOHNxTWI3UG8yM1BiMGlVTWtadjUzR01vS2FFR1RjSDhnTkYKQ1N1R2RYemZYMmxYQU50dTJLWnlJa3RRMUhXWVZ0KzNHUDlEUTFDdWVrUjc4SGxSMTBNOXA5T0IwL0RKVDduYQp4cGVHMElMRDVFSnQvckRpWkU0T0p1ZEFOQ2ExQ0luWENHTmpPQ2QxSGpQcWJxamRuNWxQZEUyQmlZQkwzWnFYCktWd3Z2b0ZCdVl6LzZuMWdCcDdOMXozVExxTVZ2S2ptSnVWdnc5eTRBeUhxbnhieExGUzEKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUNBIERpc2lnIFJvb3QgUjIgTz1EaXNpZyBhLnMuCiMgU3ViamVjdDogQ049Q0EgRGlzaWcgUm9vdCBSMiBPPURpc2lnIGEucy4KIyBMYWJlbDogIkNBIERpc2lnIFJvb3QgUjIiCiMgU2VyaWFsOiAxMDU3MjM1MDYwMjM5MzMzODIxMQojIE1ENSBGaW5nZXJwcmludDogMjY6MDE6ZmI6ZDg6Mjc6YTc6MTc6OWE6NDU6NTQ6Mzg6MWE6NDM6MDE6M2I6MDMKIyBTSEExIEZpbmdlcnByaW50OiBiNTo2MTplYjplYTphNDpkZTplNDoyNTo0Yjo2OToxYTo5ODphNTo1Nzo0NzpjMjozNDpjNzpkOTo3MQojIFNIQTI1NiBGaW5nZXJwcmludDogZTI6M2Q6NGE6MDM6NmQ6N2I6NzA6ZTk6ZjU6OTU6YjE6NDI6MjA6Nzk6ZDI6Yjk6MWU6ZGY6YmI6MWY6YjY6NTE6YTA6NjM6M2U6YWE6OGE6OWQ6YzU6Zjg6MDc6MDMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZhVENDQTFHZ0F3SUJBZ0lKQUpLNGlOdXdpc0ZqTUEwR0NTcUdTSWIzRFFFQkN3VUFNRkl4Q3pBSkJnTlYKQkFZVEFsTkxNUk13RVFZRFZRUUhFd3BDY21GMGFYTnNZWFpoTVJNd0VRWURWUVFLRXdwRWFYTnBaeUJoTG5NdQpNUmt3RndZRFZRUURFeEJEUVNCRWFYTnBaeUJTYjI5MElGSXlNQjRYRFRFeU1EY3hPVEE1TVRVek1Gb1hEVFF5Ck1EY3hPVEE1TVRVek1Gb3dVakVMTUFrR0ExVUVCaE1DVTBzeEV6QVJCZ05WQkFjVENrSnlZWFJwYzJ4aGRtRXgKRXpBUkJnTlZCQW9UQ2tScGMybG5JR0V1Y3k0eEdUQVhCZ05WQkFNVEVFTkJJRVJwYzJsbklGSnZiM1FnVWpJdwpnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDaW84UUFDZGFGWFMxdEZQYkN3M09lCk5jSnhWWDZCKzZ0R1VPREJmRWw0NXF0NVdEemEvM3djbjlpWEFuZythMEVFNlVHOXZnTXNSZll2Wk5TclhhTkgKUFdTYjZXaWF4c3diUDdxK3NvczBBaTZZVlJuOGpHK3FYOXBNemswRElhUFkwalNUVnBiTFRBd0FGanhmR3MzSQp4MnltcmRNeHA3em81ZUZtMXRMN0E3UkJaY2tRcmc0Rlk4YUFhbWt3L2RMdWtPOE5KOStmbFhQMDRTWGFiQmJlClFUZzA2b3Y4MGVnRUZHRXRRWDZzeDNkT3kxRlUrMTZTR0JzRVdtakd5Y1Q2dHhPZ21MY1JLN2ZXVjh4OG5oZlIKeXlYK2hrNGtMbFlNZUUyZUFSS21LNmNCWlc1OFloMkVoTi9xd0d1MXBTcVZnOE5URVF4ekhRdXlScERSUWpyTwpRRzZWcmYvR2xLMXVsNFNPZlcrZWlvQU5TVzF6NG51U0hzUHp3ZlByTGdWdjJSdlBOM1lFeUxSYTVCZW55OTEyCkg5QVpkdWdzQmJQV25EVFlsdHhoaDVFRjVFUUlNOEhhdVFobDFLNnlOZzNydWppNkRPV2JudXVOWnQyWno5YUoKUWZZRWtvb3BLVzFyT2h6bmRYMENjUTd6d09lOXl4bmRuV0N5d21aZ3RyRUU3c25taHJtYVprQ281eEh0Z1VVRAppL1puV2VqQkJoRzkzYytBQWs5bFFIaGNSMURJbStZZmdYdmtSS2hiaFpyaTNsclZ4L2s2UkdaTDVESlVmT1JzCm5MTU9QUmVpc2pRUzFuNnlxRW03MFhvb1FMNmlGaC9mNURjZkVYUDdrQXBsUTZJTmZQZ0dBVlV6ZmJBTnVQVDEKcnFWQ1YzdzJFWXg3WHNRRG5ZeDVuUUlEQVFBQm8wSXdRREFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZApEd0VCL3dRRUF3SUJCakFkQmdOVkhRNEVGZ1FVdFpuNHI3Q1U5ZU1nMWdxdHprNVdwQzV1UXUwd0RRWUpLb1pJCmh2Y05BUUVMQlFBRGdnSUJBQ1lHWG5EblpUUElnbTdabkJjNkczcG1zZ0gyZUR0cFhpL3EvMDc1S01PWUttRk0KdENRU2luMXRFUlQzbkxYSzVyeWVKNDVNR2NpcHZYckExellPYllWeWJxakdvbTMyK25OamY3eHVlUWdjbllxZgpHb3BUcHRpNzJUVlZzUkhGcVFPelZqdTVoSk1pWG43QjloSlNpK29zWjd6K05rejF1TS9SczBtU085TXBEcGtiCmx2ZGh1RHZFSzdaNGJMUWpiL0Q5MDdKZWRSK1psYWlzOXRyaHhURjcrOUZHczlLOFo3UmlWTG9KOTJPd2s2S2EKK2VsU0xvdGdFcXY4OVdCVzd4QmNpOFFhUXR5RFcyUU95N1c4MWsvQmZEeHVqUk50KzN2ck1ORGNUYS9GMWJhbApURnR4eWVneHZ1ZzRCa2loR3VMcTB0NFNPVmdhLzRBT2duWG10OGtIYkE3di96anhtSEhFdDM4T0ZkQWxhYjBpCm5TdnRCZlpHUjZ6dHdQRFVPK0xzN3BaYmtCTk9IbFk2NjdEdmxydVdJeEc2OGtPR2RHU1Z5Q2gxM3gwMXV0STMKZ3poVE9EWTd6MnpwK1dzTzBQc0U2RTkzMTJVQmVJWU1lajRoWXZGL1kzRU15WjlFMjZnbm9uVytib0UrMThEcgpHNWdQY0Z3MHNvck13SVVZNjI1NnMvZGFvUWUvcVVLUzgyQWlsK1FVb1FlYlRuYkFqbjM5cENYSFIrMy9IM09zCnpNT2w2VzhLanB0bHdsQ0Z0YU9nVXhMTVZZZGg4NEd1RUVaaHZVUWh1TUk5ZE05K0pEWDZIQWNPbXowaXl1OHgKTDR5c0VyM3ZRQ2o4S1dlZnNoTlBaaVRFVXhucEhpa1Y3K1p0c0g4dFovM3piQnQxUnFQbFNoZnBwTmNMCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1BQ0NWUkFJWjEgTz1BQ0NWIE9VPVBLSUFDQ1YKIyBTdWJqZWN0OiBDTj1BQ0NWUkFJWjEgTz1BQ0NWIE9VPVBLSUFDQ1YKIyBMYWJlbDogIkFDQ1ZSQUlaMSIKIyBTZXJpYWw6IDY4Mjg1MDMzODQ3NDg2OTY4MDAKIyBNRDUgRmluZ2VycHJpbnQ6IGQwOmEwOjVhOmVlOjA1OmI2OjA5Ojk0OjIxOmExOjdkOmYxOmIyOjI5OjgyOjAyCiMgU0hBMSBGaW5nZXJwcmludDogOTM6MDU6N2E6ODg6MTU6YzY6NGY6Y2U6ODg6MmY6ZmE6OTE6MTY6NTI6Mjg6Nzg6YmM6NTM6NjQ6MTcKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDlhOjZlOmMwOjEyOmUxOmE3OmRhOjlkOmJlOjM0OjE5OjRkOjQ3OjhhOmQ3OmMwOmRiOjE4OjIyOmZiOjA3OjFkOmYxOjI5OjgxOjQ5OjZlOmQxOjA0OjM4OjQxOjEzCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlIMHpDQ0JidWdBd0lCQWdJSVhzTzNwa04vcE9Bd0RRWUpLb1pJaHZjTkFRRUZCUUF3UWpFU01CQUdBMVVFCkF3d0pRVU5EVmxKQlNWb3hNUkF3RGdZRFZRUUxEQWRRUzBsQlEwTldNUTB3Q3dZRFZRUUtEQVJCUTBOV01Rc3cKQ1FZRFZRUUdFd0pGVXpBZUZ3MHhNVEExTURVd09UTTNNemRhRncwek1ERXlNekV3T1RNM016ZGFNRUl4RWpBUQpCZ05WQkFNTUNVRkRRMVpTUVVsYU1URVFNQTRHQTFVRUN3d0hVRXRKUVVORFZqRU5NQXNHQTFVRUNnd0VRVU5EClZqRUxNQWtHQTFVRUJoTUNSVk13Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ2IKcWF1L1lVcVhyeStYWnBwMFg5RFpsdjNQNHVSbTd4OGZSelBDUktQZm10NGZ0VlRkRlh4cE5SRnZ1OGdNam1vWQpIdGlQMlJhOEVFZzJYUEJqczVCYVhDUTMxNlBXeXdseHVmRUJjb1N3ZmR0TmdNMzgwMi9KK05xMkRvTFNSWVdvCkcyaW9QZWowUkd5OW9jTExBNzZNUGhNQWhOOUtTTURqSWdybzZUZW5HRXl4Q1EwalZuOEVUZGtYaEJpbHlOcEEKbEhQcnpnNVhQQU9CT3AwS29WZERhYXhYYlhtUWVPVzF0RHZZdkV5TktLR25vNmU2QWs0bDBTcXU3YTRESXJocgpJQTh3S0ZTVmYrRHV6Z3BtbmRGQUxXNGlyNTBhd1FVWjBtL0E4cC80ZTdNQ1F2dFFxUjB0a3c4anE4YkJENUwvCjBLSVY5Vk1KY1J6L1JST0U1aVplK09DSUhBcjhGcmFvY3dhNDhHT0VBcURHV3V6bmROOXdycU9ESmVyV3g1ZUgKazZmR2lvb3psMkEzRUQ2WFBtNHBGZGFoRDlHSUxCS2ZiNnFreGtMclFhTGpsVVBUQVlWdGpyczc4eU0yeC80Nwo0S0VsQjBpcnlZbDAvd2lQZ0wvQWxtWHo3dXhMYUwyZGlNTXhzMER4Nk0vMk9MdWM1TkYvMU9WWW0zejYxUE1PCm0zV1I1THBTTGhsKzBmWE5XaG44dWdiMisxS29TNWtFM2ZqNXRJdFFvMDVpaWZDSEpQcURRc0dIK3RVdEtTcGEKY1hwa2F0Y25ZR01OMjg1SjlZMGZrSWt5Ri9oelE3alNXcE9HWWRiaGRRcnFlV1oyaUU5eDZ3UWwxZ3BhZXBQbAp1VXNYUUEreHRybjEzay9jNExPc094RndZSVJLUTI2WklNQXBjUXJBWlFJREFRQUJvNElDeXpDQ0FzY3dmUVlJCkt3WUJCUVVIQVFFRWNUQnZNRXdHQ0NzR0FRVUZCekFDaGtCb2RIUndPaTh2ZDNkM0xtRmpZM1l1WlhNdlptbHMKWldGa2JXbHVMMEZ5WTJocGRtOXpMMk5sY25ScFptbGpZV1J2Y3k5eVlXbDZZV05qZGpFdVkzSjBNQjhHQ0NzRwpBUVVGQnpBQmhoTm9kSFJ3T2k4dmIyTnpjQzVoWTJOMkxtVnpNQjBHQTFVZERnUVdCQlRTaDdUajN6Y25rMVgyClZ1cUI1VGJNakI0L3ZUQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01COEdBMVVkSXdRWU1CYUFGTktIdE9QZk55ZVQKVmZaVzZvSGxOc3lNSGorOU1JSUJjd1lEVlIwZ0JJSUJhakNDQVdZd2dnRmlCZ1JWSFNBQU1JSUJXRENDQVNJRwpDQ3NHQVFVRkJ3SUNNSUlCRkI2Q0FSQUFRUUIxQUhRQWJ3QnlBR2tBWkFCaEFHUUFJQUJrQUdVQUlBQkRBR1VBCmNnQjBBR2tBWmdCcEFHTUFZUUJqQUdrQTh3QnVBQ0FBVWdCaEFPMEFlZ0FnQUdRQVpRQWdBR3dBWVFBZ0FFRUEKUXdCREFGWUFJQUFvQUVFQVp3QmxBRzRBWXdCcEFHRUFJQUJrQUdVQUlBQlVBR1VBWXdCdUFHOEFiQUJ2QUdjQQo3UUJoQUNBQWVRQWdBRU1BWlFCeUFIUUFhUUJtQUdrQVl3QmhBR01BYVFEekFHNEFJQUJGQUd3QVpRQmpBSFFBCmNnRHpBRzRBYVFCakFHRUFMQUFnQUVNQVNRQkdBQ0FBVVFBMEFEWUFNQUF4QURFQU5RQTJBRVVBS1FBdUFDQUEKUXdCUUFGTUFJQUJsQUc0QUlBQm9BSFFBZEFCd0FEb0FMd0F2QUhjQWR3QjNBQzRBWVFCakFHTUFkZ0F1QUdVQQpjekF3QmdnckJnRUZCUWNDQVJZa2FIUjBjRG92TDNkM2R5NWhZMk4yTG1WekwyeGxaMmx6YkdGamFXOXVYMk11CmFIUnRNRlVHQTFVZEh3Uk9NRXd3U3FCSW9FYUdSR2gwZEhBNkx5OTNkM2N1WVdOamRpNWxjeTltYVd4bFlXUnQKYVc0dlFYSmphR2wyYjNNdlkyVnlkR2xtYVdOaFpHOXpMM0poYVhwaFkyTjJNVjlrWlhJdVkzSnNNQTRHQTFVZApEd0VCL3dRRUF3SUJCakFYQmdOVkhSRUVFREFPZ1F4aFkyTjJRR0ZqWTNZdVpYTXdEUVlKS29aSWh2Y05BUUVGCkJRQURnZ0lCQUpjeEFwL24vVU5uU0VRVTVDbUg3VXdvWnRDUE5kcE5ZYmRLbDAyMTI1RGdCUzRPeG5uUThwZHAKRDcwRVI5bSsyN1VwMnB2WnJxbVoxZE04TUpQMWphR28vQWFOUlBUS0ZwVjhNOXhpaTZnMytDZllDUzBiNzhnVQpKeUNwWkVUL0x0WjFxbXhOWUVBWlNVTlVZOXJpekxwbTVVOUVlbHZaYW9FclFOVi8rUUVuV0N6STdVaVJmRCttCkFNL0VLWE1STnQ2R0dUNmQ3aG1LRzlXdzdZNDluQ3JBRGRnOVp1TThEYjNWbEZ6aTRxYzFHd1FBOWo5YWplcEQKdlYrSkhhbkJzTXlaNGswQUN0ckpKMXZuRTVCYzVQVXpvbFZ0M09BSlRTK3hKbHNuZFFBSnhHSjNLUWhmbmxtcwp0bjZ0bjFRd0lnUEJIbkZrL3ZrNENwWVkzUUlVckNQTEJod2VwSDJORGQ0blFlaXQyaFczc0NQZEs2alQyaVdICjdlaFZSRTJJOURaK2hKcDRyUGNPVmtrTzFqTWwxb1JRUW13Z0VoMHExYjY4OG5DQnBIQmd2Z1cxbTU0RVJMNWgKSTZ6cHBTU01FWUNVV3FLaXVVblN3ZHpScCsweEVTeWVHYWJ1NFZYaHdPclBEWVRrRjdlaWZLWGVWU1VHN3N6QQpoMXhBMnN5VlAxWGdOY2U0aEw2MFhjMTZnd0Z5N29mbVh4MnV0WVhHSnQvbXdacnBIZ0pIbnlxb2JhbGJ6K3hGCmQzK1lKNW95WFNyamhPN0ZtR1l2bGlBZDNkakRKOWV3K2Y3WmZjM1FuNDhMRkZoUm55K0x3emd0M3VpUDFvMkgKcFBWV1F4YVpMUFNrVnJRMHVHRTN5Y0pZZ0J1Z2w2SDhXWTNwRWZiUkQwdFZORVlxaTRZNwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VFdDQSBHbG9iYWwgUm9vdCBDQSBPPVRBSVdBTi1DQSBPVT1Sb290IENBCiMgU3ViamVjdDogQ049VFdDQSBHbG9iYWwgUm9vdCBDQSBPPVRBSVdBTi1DQSBPVT1Sb290IENBCiMgTGFiZWw6ICJUV0NBIEdsb2JhbCBSb290IENBIgojIFNlcmlhbDogMzI2MgojIE1ENSBGaW5nZXJwcmludDogZjk6MDM6N2U6Y2Y6ZTY6OWU6M2M6NzM6N2E6MmE6OTA6MDc6Njk6ZmY6MmI6OTYKIyBTSEExIEZpbmdlcnByaW50OiA5YzpiYjo0ODo1MzpmNjphNDpmNjpkMzo1MjphNDplODozMjo1Mjo1NTo2MDoxMzpmNTphZDphZjo2NQojIFNIQTI1NiBGaW5nZXJwcmludDogNTk6NzY6OTA6MDc6Zjc6Njg6NWQ6MGY6Y2Q6NTA6ODc6MmY6OWY6OTU6ZDU6NzU6NWE6NWI6MmI6NDU6N2Q6ODE6ZjM6Njk6MmI6NjE6MGE6OTg6Njc6MmY6MGU6MWIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZRVENDQXltZ0F3SUJBZ0lDREw0d0RRWUpLb1pJaHZjTkFRRUxCUUF3VVRFTE1Ba0dBMVVFQmhNQ1ZGY3gKRWpBUUJnTlZCQW9UQ1ZSQlNWZEJUaTFEUVRFUU1BNEdBMVVFQ3hNSFVtOXZkQ0JEUVRFY01Cb0dBMVVFQXhNVApWRmREUVNCSGJHOWlZV3dnVW05dmRDQkRRVEFlRncweE1qQTJNamN3TmpJNE16TmFGdzB6TURFeU16RXhOVFU1Ck5UbGFNRkV4Q3pBSkJnTlZCQVlUQWxSWE1SSXdFQVlEVlFRS0V3bFVRVWxYUVU0dFEwRXhFREFPQmdOVkJBc1QKQjFKdmIzUWdRMEV4SERBYUJnTlZCQU1URTFSWFEwRWdSMnh2WW1Gc0lGSnZiM1FnUTBFd2dnSWlNQTBHQ1NxRwpTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDd0Jkdkk2NHpFYm9vaDc0NU5uSEVLSDFKdzdXMkNuSmZGCjEweE9SVW5MUUVLMUVqUnNHY0owcERGZmhRS1g3RU16Q2xQU25JeU90N2g1Mnl2VmF2S09ac1R1S3dFSGt0U3oKMEFMZlVQWlZyMllPeStCSFlDOHJNamsxVWpvb2cvaDdGc1lZdUdMV1J5V1J6dkFaRWsydFkvWFRQM1ZmS2ZDaApNQndxb0ppbUZiM3UvUmsyOE9LUlE0LzZ5dFlRSjBsTTc5M0I4WVZ3bThycXFGcEQvRzJHYjNQcE4wV3A4RGJICnpJaDFIcnRzQnYrYmF6NFg3R0dxY1h6R0hhTDNTZWtWdFR6V29XSDFFZmNGYngzOUViN1FNQWZDS2JBSlRpYmMKNDZLb2tXb2Z3cEZGaUZ6bG1MaHhwUlVaeVh4MUVjeHdkRTh0bXgyUlJQMVdLS0QrdTRacXlQcGNDMWpjeGt0Mgp5S3NpMlhNUHBmUmFBb2svVDU0aWd1NmlkRk1xUFZNbmFSMXNqaklzWkFBbVkyRTJUcU5HdHo5OXN5MnNiWkNpCmxhTE96OXFDNXdjMEdaYnB1Q0dxS1g2bU9MNk9LVW9oWm5rZnM4TzFDV2ZlMXRRSFJ2TXEydVlpTjJETGdiWVAKb0EvcHlKVi92MVdSQlhyUFBSWEFiOTRKbEFHRDF6UWJ6RUNsOExpYlo5V1lrVHVuaEhpVkpxUmFDUGdyZExRQQpCRHpmdUJTTzZOK3BqV3hua2pNZHdMZlM3SkxJdmdtL0xDa0Zid0pybnUrOHZ5cThXOEJRajBGd2NZZXlUYmNFCnFZU2pNcSt1N21zWGk3S3gvbXpoa0l5SXFKZEl6c2hOeS9NR3oxOXFDa0t4SGg1M0w0Nmc1cElPQnZ3Rkl0SW0KNFRGUmZUTGNEd0lEQVFBQm95TXdJVEFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQgovekFOQmdrcWhraUc5dzBCQVFzRkFBT0NBZ0VBWHpTQmR1K1dIZFhsdGRrQ1k0UVd3YTZnY0ZHbjkweEhOY2dMCjF5ZzlpWEhacWpOQjZoUWJiQ0VBd0d4Q0dYNmZhVnNnUXQraTB0ckVmSmRMamJEb3JNanVwV2tFbVFxU3Bxc24KTGhwTmdiK0UxSEFlclVmKy9VcWRNK0R5dWNSRkNDRUsybWxwYzNJTnZqVCtsSXV0d3g0MTE2S0Q3K1U0eDZXRgpINnZQTk93L0tQNE04VmVHVHNsVjl4elUyS1Y5Qm5wdjFkOFEzNEZPSVdXeHR1RVhlWlZGQnM1ZnpOeEdpV05vClJJMlQ5R1J3b0QyZEtBWERPWEM0WW5zZy9lVGI2UWlodUo0OUNjZFAreXo0azNaQjNsTGc0VmZTblFPOGQ1NysKbmlsZTk4RlJZQi9lMmd1eUxYVzNRMGlUNS9aNXhvUmRnRmxnbFB4NG1JODhrMUh0UUpBSDMyUmpKTXRPY1FXaAoxNVFhaURMeEluUWlycVdtMkJKcFRHQ2pBdTRyN05SamtndGV2aTkyYTZPMkpyeVBBOWdLOGt4a1JyMDVZdVdXCjZ6UmpFU2pNbGZHdDcrL2NnRmhJNlV1NDZtV3M2ZnlBdGJYSVJmbXN3Wi9adWVwaWlJN0U4VXVERXEzbWk0VFcKbnNMcmd4aWZhcnNiSkdBemNNenM5ekx6WE5sNWZlK2VwUDdKSThNazdoV1NzVDJSVHlhR3ZXWnpKQlBxcEs1agp3YTE5aEFNOEVIaUdHM25qeFBQeUJKVWdyaU9DeExNNkFHSy81allrNFZlNnh4NlFkZFZmUDVWaEs4RTd6ZVd6CmFHSFFSaWFwSVZKcExlc3V4K3QzenFZNnRRTXpUM2JSNTF4VUFWM0xlUFRKREwvUEVvNFhMU05vbE9lci9xbXkKS3diUUJNMD0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVRlbGlhU29uZXJhIFJvb3QgQ0EgdjEgTz1UZWxpYVNvbmVyYQojIFN1YmplY3Q6IENOPVRlbGlhU29uZXJhIFJvb3QgQ0EgdjEgTz1UZWxpYVNvbmVyYQojIExhYmVsOiAiVGVsaWFTb25lcmEgUm9vdCBDQSB2MSIKIyBTZXJpYWw6IDE5OTA0MTk2Njc0MTA5MDEwNzk2NDkwNDI4NzIxNzc4NjgwMTU1OAojIE1ENSBGaW5nZXJwcmludDogMzc6NDE6NDk6MWI6MTg6NTY6OWE6MjY6ZjU6YWQ6YzI6NjY6ZmI6NDA6YTU6NGMKIyBTSEExIEZpbmdlcnByaW50OiA0MzoxMzpiYjo5NjpmMTpkNTo4Njo5YjpjMTo0ZTo2YTo5MjpmNjpjZjpmNjozNDo2OTo4Nzo4MjozNwojIFNIQTI1NiBGaW5nZXJwcmludDogZGQ6Njk6MzY6ZmU6MjE6Zjg6ZjA6Nzc6YzE6MjM6YTE6YTU6MjE6YzE6MjI6MjQ6Zjc6MjI6NTU6Yjc6M2U6MDM6YTc6MjY6MDY6OTM6ZTg6YTI6NGI6MGY6YTM6ODkKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZPRENDQXlDZ0F3SUJBZ0lSQUpXK0ZxRDNMa2J4ZXptQ2N2cUx6Wll3RFFZSktvWklodmNOQVFFRkJRQXcKTnpFVU1CSUdBMVVFQ2d3TFZHVnNhV0ZUYjI1bGNtRXhIekFkQmdOVkJBTU1GbFJsYkdsaFUyOXVaWEpoSUZKdgpiM1FnUTBFZ2RqRXdIaGNOTURjeE1ERTRNVEl3TURVd1doY05Nekl4TURFNE1USXdNRFV3V2pBM01SUXdFZ1lEClZRUUtEQXRVWld4cFlWTnZibVZ5WVRFZk1CMEdBMVVFQXd3V1ZHVnNhV0ZUYjI1bGNtRWdVbTl2ZENCRFFTQjIKTVRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBTUsrNnlmd0lhUHphU1pWZnAzRgpWUmFSWFAzdkliOVRnSG90MHBHTVl6SHc3Q1R3dzZYU2Nud1FiZlEzdCtYbWZIbnFqTFdDaTY1SXRxd0EzR1YxCjdDcE5YOEdIOVNCbEs0R29SejZKSTVVd0ZwQi82RmNIU09jWnJyOUZaN0UzR3dZcS90NzVySDJEKzE2NjVJK1gKWjc1TGpvMWtCMWM0VldrME5qMFRTTzlQNHRObUhxVFBHcmRlTmpQVXRBYTlHQUg5ZDRSUUFFWDFqRjNvSTd4KwovalhoN1ZCN3FUQ05HZE1Kam1oblhiODhseGhUdXlsaXhjcGVjc0hIbHRUYkxhQzBIMmtEN09yaVVQRU1QUENzCjgxTXQ4QnoxN1d3NU9YT0FGc2hTc0NQTjREN2MzVHhIb0xzMWl1S1lhSXUrNWI5eTd0TDZwZTBTN2Z5WUdLa20KZHR3b1N4QWdITk4vRm5jdDdXK0E5MG03VXdXN1hXakgxTWgxRmorSldvdjNGMGZVVFBIU2lYaytUVDJZcUdIZQpPaDdTK0Y0RDRNSEpISXpUalUzVGxUYXpOMTlqWTVzekZQQXRKbXRUZkltTU1zSnU3RDBoQURuSm9XamlVSU11CnNEb3I4emFnckMva2IySENVUWs1UG90VHVidG4ydHhUdVhaWk5wMUQ1U0RnUFRKZ2hTSlJ0OGN6dTkwVkw2UjQKcGdkN2dVWTJCSWJkZVRYSGxTdzdzS01YTmVWekg3UmNXZS9hNmhCbGUzclFmNSt6dENvM08zQ0xtMXU1SzdmcwpzbEVTbDFNcFd0VHdFaERjVHdLN0VwSXZZdFEvYVVOOERkYjhXSFVCaUoxWUZrdmV1cEQvUndHSkJtcjJYN0tRCmFyTUNwZ0tJdjdOSGZpcloxZnBvZURWTkFnTUJBQUdqUHpBOU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0N3WUQKVlIwUEJBUURBZ0VHTUIwR0ExVWREZ1FXQkJUd2oxazRBTFAxajVxV0ROWHIrbnVxRitnVEVqQU5CZ2txaGtpRwo5dzBCQVFVRkFBT0NBZ0VBdnVSY1lrNGs5QXdJLy9EVERHamtrMGtpUDBRbmI3dHQzb05tenFqTURmejFtZ2JsCmR4U1I2NTFCZTVrcWhPWC8vQ0hCWGZEa0gxZTNkYW1oWHdJbS85Zkg5MDdlVC9qM0hFYkFlazlBTENJMThCbXgKMEd0bkxMQ280TUJBTnpYMmhGeGM0NjlDZVA2bnlRMVE2ZzJFZHZaUjc0TlR4bnIvRGxaSkxvOTYxZ3ptSjFUagpUUXBnY21MTmtRZldwYi9JbVd2dHhCbm1xMHdST01Wdk1lSnVTY2cvZG9BbUF5WXA0RGIyOWlCVDR4ZHdOQmVkClkyZ2VhK3pEVFlhNEV6QXZYVVlOUjBQVkc2cFpEcmxjalFaSXJYU0hYOGY4TVZSQkUrTEhJUTZlNEI0TjRjQjcKUTRXUXhZcFl4bVVLZUZmeXhpTVBBZGtnUzk0UCs1S0ZkU3BjYzQxdGV5V1J5dTVGcmdaTEFNelRzVmxRMmpxSQpPeWxEUmw2WEsxVE9VMitOU3VlVytyOXhEa0tMZlAwb29OQkl5dHJFZ1V5N29uT1RKc2pyRE5ZbWlMYkFKTSs3CnZWdnJkWDNwQ0k2R015eDVkd2xwcFluOHMzQ1FoM2FQMHlLN1FzNjljd3NnSmlyUW16MXdIaVJzellkMnFSZVcKdDg4Tmt2dU9HS21ZU2RHZS9tQkVjaUc1R2UzQzlUSHhPVWlJa0NSMVZCYXR6dlQ0YVJSa09mdWp1THB3UU1jbgpITC9FVmxQNlkyWFE4eHdPRnZWcmhsaE5HTlRrRFk2bG5WdVIzSFlrVUQvR0t2dlp0NXkxMXViUTJlZ1ppeFZ4ClNLMjM2dGhaaU5TUXZ4YXoyZW1zV1dGVXlCeTZ5c0hLNGJrZ1RJODZrNG1sb015LzAvWjFwSFdXYlZZPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RS1UdWdyYSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPUUtVHVcdTAxMWZyYSBFQkcgQmlsaVx1MDE1ZmltIFRla25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLlx1MDE1ZS4gT1U9RS1UdWdyYSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkKIyBTdWJqZWN0OiBDTj1FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89RS1UdVx1MDExZnJhIEVCRyBCaWxpXHUwMTVmaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXptZXRsZXJpIEEuXHUwMTVlLiBPVT1FLVR1Z3JhIFNlcnRpZmlrYXN5b24gTWVya2V6aQojIExhYmVsOiAiRS1UdWdyYSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSIKIyBTZXJpYWw6IDc2Njc0NDcyMDY3MDMyNTQzNTUKIyBNRDUgRmluZ2VycHJpbnQ6IGI4OmExOjAzOjYzOmIwOmJkOjIxOjcxOjcwOjhhOjZmOjEzOjNhOmJiOjc5OjQ5CiMgU0hBMSBGaW5nZXJwcmludDogNTE6YzY6ZTc6MDg6NDk6MDY6NmU6ZjM6OTI6ZDQ6NWM6YTA6MGQ6NmQ6YTM6NjI6OGY6YzM6NTI6MzkKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGIwOmJmOmQ1OjJiOmIwOmQ3OmQ5OmJkOjkyOmJmOjVkOjRkOmMxOjNkOmEyOjU1OmMwOjJjOjU0OjJmOjM3OjgzOjY1OmVhOjg5OjM5OjExOmY1OjVlOjU1OmYyOjNjCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlHU3pDQ0JET2dBd0lCQWdJSWFtZytuRkdieTFNd0RRWUpLb1pJaHZjTkFRRUxCUUF3Z2JJeEN6QUpCZ05WCkJBWVRBbFJTTVE4d0RRWURWUVFIREFaQmJtdGhjbUV4UURBK0JnTlZCQW9NTjBVdFZIWEVuM0poSUVWQ1J5QkMKYVd4cHhaOXBiU0JVWld0dWIyeHZhbWxzWlhKcElIWmxJRWhwZW0xbGRHeGxjbWtnUVM3Rm5pNHhKakFrQmdOVgpCQXNNSFVVdFZIVm5jbUVnVTJWeWRHbG1hV3RoYzNsdmJpQk5aWEpyWlhwcE1TZ3dKZ1lEVlFRRERCOUZMVlIxClozSmhJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1CNFhEVEV6TURNd05URXlNRGswT0ZvWERUSXoKTURNd016RXlNRGswT0Zvd2diSXhDekFKQmdOVkJBWVRBbFJTTVE4d0RRWURWUVFIREFaQmJtdGhjbUV4UURBKwpCZ05WQkFvTU4wVXRWSFhFbjNKaElFVkNSeUJDYVd4cHhaOXBiU0JVWld0dWIyeHZhbWxzWlhKcElIWmxJRWhwCmVtMWxkR3hsY21rZ1FTN0ZuaTR4SmpBa0JnTlZCQXNNSFVVdFZIVm5jbUVnVTJWeWRHbG1hV3RoYzNsdmJpQk4KWlhKclpYcHBNU2d3SmdZRFZRUUREQjlGTFZSMVozSmhJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNQpNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQWc4QU1JSUNDZ0tDQWdFQTR2VS9rd1ZSSG9WaVZGNTZDL1VZCkI0T3VmcTk4OTlTS2E2VmpRem01Uy9mRHhtU0pQWlF1VklCU09Ua0hTMHZkaFFkMmg4eS9MNVZNekgyblBieEgKRDVodytJeUZIblNPa20wYlFOR1pEYnQxYnNpcGE1ckFoREd2eWtQTDZ5czA2SStYYXdHYjFRNUtDS3Bia25TRgpROU9BcnFHSVc2Nno2bDdMRnBwM1JNaWg5bFJvenQ2UGx5dTZXMEFDREdRWHdMV1R6ZUh4RTJiT0RIbnYwWkVvCnExK2dFbEl3Y3htT2orR01CNkxEdTBydzZoOFZxTzRsektSRytCc2k3N01PUTdvc0pMakZMRnpVSFBoZFpMM0QKazE0b3B6OG44WTRlMHlwUUJhTlYyY3ZuT1ZQQW1KNk1WR0tMSnJEM2ZZMTg1TWFlWmtKVmdrZm5zbGlOWnZjSApmQzQyNWxBY1A5dERKTVcvaGtkNXMza2M5MXIwRSt4cytEL2lXUitWN2tJK3VhMm9Nb1ZKbDBiK1N6R1BXc3V0CmRFY2Y2WkczM3lnRUlxRFVEMTNpZVUvcWJJV0d2YWltenVUNncrR3pydDQ4VWU3TEUzd0JmNFFPWFZHVW5oTU0KdGk2bFRQazVjRFp2bHNvdURFUlZ4Y3I2WFFLajM5WmtqRnF6QVFxcHRRcEhGLy92a1VBcWpxRkdPakdZNVJIOAp6THRKVm9yOHVkQmhtbTlsYk9iRHl6NTFTZjZQcCtLSnhXZlhuVVlUVGpGMk95U3puaEZsaHF0Lzd4M1UrTHpuCnJGcGN0MXBIWEZYT1ZiUWljVnRiQy9EUDNLQmhaT3FwMTJnS1k2ZmdEVCtncjlPcTBuN3ZVYURtVVN0VmtoVVgKVTh1M1pnNW1UUGo1ZFV5UTV4Snd4MFVDQXdFQUFhTmpNR0V3SFFZRFZSME9CQllFRkM3ajI3SkowSnhVZVZ6NgpKeXIrekU3UzZFNVVNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdId1lEVlIwakJCZ3dGb0FVTHVQYnNrblFuRlI1ClhQb25LdjdNVHRMb1RsUXdEZ1lEVlIwUEFRSC9CQVFEQWdFR01BMEdDU3FHU0liM0RRRUJDd1VBQTRJQ0FRQUYKTnpyMFRiZEY0a1YxSkkrMmQxTG9ITmdRazJYejhsa0dwRDRlS2V4ZDBkQ3JmT0FLa0VoNDdVNllBNW4rS0dDUgpIVEFkdUdOOHFPWTF0ZnJUWVhibTFnZEx5bW1hc29SNmQ1TkZGeFdmSk5DWUV4TC91NkF1L1U1TWgvak9YS3FZCkd3WGdBRVpLZ29DbE00c28zTzA0MDkvbFB1bisrMW5kWVlSUDBsU1dFMkVUUG8rQWFiNlRSN1UxUTlKYXV6MWMKNzdOQ1I4MDdWUk1Hc0FuYi9XUDJPb2dLbVc5KzRjNGJVMnBFWmlOUkNIdThXMUtpL1FZM09FQmhqMHFXdUpBMworR2JIZUpBQUZTNkxyVkUxVXdlb2EyaXUrVTQ4QnliTkNBVnd6RGsvZHIybDAyY21BWWFtVTlKZ08zeERmMVdLCnZKVWF3U2c1VEI5RDBwSDBjbG1LdVZiOFA3U2QybkNjZGxxTVExRHVqakJ5VGQvL1NmZkdxV2ZaYmF3Q0VlSTYKRmlXbldBakxiMU5CbkVnNFIyZ3owZGZIajlSMElkVERCWkI2Lzg2V2lMRVZLVjBqcTlCZ29SSlAzdlFYelRMbAp5Yi9JUTYzOUxvN3hyK0wwbVBvU0h5RFl3S2NNaGNXUTlEc3RsaWF4TEw1TXErdXgwb3JKMjNnVER4NEpuVzJQCkFKOEMyc0g2SDNwNkNjUks1b2dxbDUrSmkvMDNYMTg2empoWmhrdXZjUXUwMlBKd1Q1OHlFK093cDFmbDJ0cEQKeTRRMDhpakU2bTMwS3UvQmEzYmErMzY3aFR6U1U4Sk52bkhoUmRIOUkyY05FM1g3ejJWbklwMnVzQW5SQ2Y4ZApOTC8rSTVjMzBqbjZQUTBHQzdUYk82T3JiMXdkdG43b3M0STA3UVpjSkE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VC1UZWxlU2VjIEdsb2JhbFJvb3QgQ2xhc3MgMiBPPVQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkggT1U9VC1TeXN0ZW1zIFRydXN0IENlbnRlcgojIFN1YmplY3Q6IENOPVQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIgTz1ULVN5c3RlbXMgRW50ZXJwcmlzZSBTZXJ2aWNlcyBHbWJIIE9VPVQtU3lzdGVtcyBUcnVzdCBDZW50ZXIKIyBMYWJlbDogIlQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIiCiMgU2VyaWFsOiAxCiMgTUQ1IEZpbmdlcnByaW50OiAyYjo5Yjo5ZTplNDo3Yjo2YzoxZjowMDo3MjoxYTpjYzpjMTo3Nzo3OTpkZjo2YQojIFNIQTEgRmluZ2VycHJpbnQ6IDU5OjBkOjJkOjdkOjg4OjRmOjQwOjJlOjYxOjdlOmE1OjYyOjMyOjE3OjY1OmNmOjE3OmQ4Ojk0OmU5CiMgU0hBMjU2IEZpbmdlcnByaW50OiA5MTplMjpmNTo3ODo4ZDo1ODoxMDplYjphNzpiYTo1ODo3Mzo3ZDplMTo1NDo4YTo4ZTpjYTpjZDowMTo0NTo5ODpiYzowYjoxNDozZTowNDoxYjoxNzowNToyNTo1MgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHd6Q0NBcXVnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFzRkFEQ0JnakVMTUFrR0ExVUVCaE1DUkVVeApLekFwQmdOVkJBb01JbFF0VTNsemRHVnRjeUJGYm5SbGNuQnlhWE5sSUZObGNuWnBZMlZ6SUVkdFlrZ3hIekFkCkJnTlZCQXNNRmxRdFUzbHpkR1Z0Y3lCVWNuVnpkQ0JEWlc1MFpYSXhKVEFqQmdOVkJBTU1IRlF0VkdWc1pWTmwKWXlCSGJHOWlZV3hTYjI5MElFTnNZWE56SURJd0hoY05NRGd4TURBeE1UQTBNREUwV2hjTk16TXhNREF4TWpNMQpPVFU1V2pDQmdqRUxNQWtHQTFVRUJoTUNSRVV4S3pBcEJnTlZCQW9NSWxRdFUzbHpkR1Z0Y3lCRmJuUmxjbkJ5CmFYTmxJRk5sY25acFkyVnpJRWR0WWtneEh6QWRCZ05WQkFzTUZsUXRVM2x6ZEdWdGN5QlVjblZ6ZENCRFpXNTAKWlhJeEpUQWpCZ05WQkFNTUhGUXRWR1ZzWlZObFl5QkhiRzlpWVd4U2IyOTBJRU5zWVhOeklESXdnZ0VpTUEwRwpDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3FYOW9iWCtoemtlWGFYUFNpNWtmbDgyaFZZQVVkCkFxU3ptMW56SG9xdk5LMzhEY0xaU0JudWFZL0pJUHdocWdjWjdiQmNyR1hIWCswQ2ZIdDhMUnZXdXJtQXdoaUMKRm9UNlpyQUl4bFFqZ2VUTnVVay85azl1TjBnb09BL0Z2dWRvY1AwNWwwM1N4NWlSVUtyRVJMTWpmVGxINlZKaQoxaEtUWHJjeGxrSUYrM2FuSHFQMXd2enBlc1ZzcVhGUDZzdDR2R0N2eDk3MDJjdStmak9sYnBTRDhEVDZJYXZxCmpuS2dQNlRlTUZ2dmhrMXFsVnREUktnUUZSemxBVmZGbVBIbUJpaVJxaURGdDFNbVVVT3lDeEdWV09IQUQzYloKd0kxOGdmTnljSjV2L2hxTzJWODF4ckp2Tkh5K1NFL2lXam5YMkoxNG5wK0dQZ05lR1l0RW90WEhBZ01CQUFHagpRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnRUdNQjBHQTFVZERnUVdCQlMvCldTQTJBSG1nb0NKcmpOWHlZZEs0TE11Q1NqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUFNUU9pWVFzZmRPaHkKTnNadCtVMmUraUtvNFlGV3o4MjduK3Fya1JrNHI2cDhGVTN6dHFPTnBmU085a1NwcCtnaGxhMCtBR0lXaVBBQwp1dnhoSStZem16QjZhelppZTYwRUk0UllaZUxiSzRybkpWTTNZbE5mdk5vQllpbWlwaWR4NWpvaWZzRnZIWlZ3CklFb0hOTi9xL3hXQTViclhldGhiZFh3RmVpbEhma0NvTVJOM3pVQTd0RkZIZWk0UjQwY1IzcDFtMEl2VlZHYjYKZzFYcWZNSXBpUnZwYjdQTzRnV0V5UzgrZUlWaWJzbGZ3WGhqZEZqQVNCZ01tVG5ycE13YXRYbGFqUldjMkJRTgo5bm9IVjhjaWd3VXRQSnNsSmowWXM2bERmTWpJcTJTUERxTy9uQnVkTU52YTBCa3Vxanp4K3pPQWR1VE5yUmxQCkJTZU9FNkZ1d2c9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QXRvcyBUcnVzdGVkUm9vdCAyMDExIE89QXRvcwojIFN1YmplY3Q6IENOPUF0b3MgVHJ1c3RlZFJvb3QgMjAxMSBPPUF0b3MKIyBMYWJlbDogIkF0b3MgVHJ1c3RlZFJvb3QgMjAxMSIKIyBTZXJpYWw6IDY2NDM4Nzc0OTc4MTMzMTY0MDIKIyBNRDUgRmluZ2VycHJpbnQ6IGFlOmI5OmM0OjMyOjRiOmFjOjdmOjVkOjY2OmNjOjc3Ojk0OmJiOjJhOjc3OjU2CiMgU0hBMSBGaW5nZXJwcmludDogMmI6YjE6ZjU6M2U6NTU6MGM6MWQ6YzU6ZjE6ZDQ6ZTY6Yjc6NmE6NDY6NGI6NTU6MDY6MDI6YWM6MjEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGYzOjU2OmJlOmEyOjQ0OmI3OmE5OjFlOmIzOjVkOjUzOmNhOjlhOmQ3Ojg2OjRhOmNlOjAxOjhlOjJkOjM1OmQ1OmY4OmY5OjZkOmRmOjY4OmE2OmY0OjFhOmE0Ojc0Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEZHpDQ0FsK2dBd0lCQWdJSVhEUExZaXhmc3pJd0RRWUpLb1pJaHZjTkFRRUxCUUF3UERFZU1Cd0dBMVVFCkF3d1ZRWFJ2Y3lCVWNuVnpkR1ZrVW05dmRDQXlNREV4TVEwd0N3WURWUVFLREFSQmRHOXpNUXN3Q1FZRFZRUUcKRXdKRVJUQWVGdzB4TVRBM01EY3hORFU0TXpCYUZ3MHpNREV5TXpFeU16VTVOVGxhTUR3eEhqQWNCZ05WQkFNTQpGVUYwYjNNZ1ZISjFjM1JsWkZKdmIzUWdNakF4TVRFTk1Bc0dBMVVFQ2d3RVFYUnZjekVMTUFrR0ExVUVCaE1DClJFVXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDVmhUdVhieW83TGp2UHB2TXAKTmI3UEdLdytxdG40VGFBK0drZTV2SnJmOHY3TVBrZm9lcGJDSkk0MTlLa00vSUw5YmNGeVlpZTk2bXZyNTRyTQpWRDZRVU0rQTFKWDc2TFdDMUJURnRxbFZKVmZic1ZEMnNHQmtXWHBwendPM2J3Mit5ajV2ZEhMcXFqQXFjMksrClNaRmh5QkgrRGdNcTkyb2czQUlWRFY0VmF2empnc0cxeFoxa0NXeWpXWmdISjhjYmxpdGhkSEZzUS9IM05Za1EKNEo3c1ZhRTNJcUtIQkFVc1IzMjBITGxpS1dZb3lyZmhrL1drbEFPWnVYQ0Z0ZVpJNm8xUS9ObmV6RzhIRHQwTApjcDJBTUJZSGxUOG9EdjNGZFU5VDFuU2F0Q1F1amdLUnozYkZteDVWZEp4NEliSHdMZkVMbjhMVmxoZ2Y4RlFpCmVvd0hBZ01CQUFHamZUQjdNQjBHQTFVZERnUVdCQlNucFFheExLWUpZTzdSbCtsd3JydzdHV3piSVRBUEJnTlYKSFJNQkFmOEVCVEFEQVFIL01COEdBMVVkSXdRWU1CYUFGS2VsQnJFc3BnbGc3dEdYNlhDdXZEc1piTnNoTUJnRwpBMVVkSUFRUk1BOHdEUVlMS3dZQkJBR3dMUU1FQVFFd0RnWURWUjBQQVFIL0JBUURBZ0dHTUEwR0NTcUdTSWIzCkRRRUJDd1VBQTRJQkFRQW1kelRibEVpR0trR2RMRDRHa0dERWpLd0xWTGdmdVh2VEJ6bmsrajU3c2oxTzdaOGoKdlpmemExenY3djFBcHQraGs2RUtocXp2SU5CNUFiMTQ5eG5ZSkRFMEJBR211aFdhd3lmYzJFOFB6QmhqLzVrUApEcEZyZFJiaElmellKc2RIdDZiUFdISnhmcnJoVFpWSE84bXZiYUcwd2V5SjlyUVBPTFhpWk53bHo2YmI2NXBjCm1hSEZDTjc5NXRyVjFscEZETVMzd3JVVTc3UVIvdzRWdGZYMTI4YTk2MXFuOEZZaXFUeGxWTVlWcUwyR25zMkQKbG1oNmNZR0o0UXZoNmhFYmFBak1hWjdzbmtHZVJESW1ldUtIQ25FOTYrUmFwTkxieGMzRzNtQi91Zk5QUkpMdgpLcmNZUHFjWjJRdDlzVGRCUXJDNllCM3kvZ2tSc1BDSGU2ZWQKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMyBPPVF1b1ZhZGlzIExpbWl0ZWQKIyBTdWJqZWN0OiBDTj1RdW9WYWRpcyBSb290IENBIDEgRzMgTz1RdW9WYWRpcyBMaW1pdGVkCiMgTGFiZWw6ICJRdW9WYWRpcyBSb290IENBIDEgRzMiCiMgU2VyaWFsOiA2ODcwNDk2NDk2MjY2NjkyNTA3MzYyNzEwMzc2MDY1NTQ2MjQwNzg3MjAwMzQxOTUKIyBNRDUgRmluZ2VycHJpbnQ6IGE0OmJjOjViOjNmOmZlOjM3OjlhOmZhOjY0OmYwOmUyOmZhOjA1OjNkOjBiOmFiCiMgU0hBMSBGaW5nZXJwcmludDogMWI6OGU6ZWE6NTc6OTY6Mjk6MWE6Yzk6Mzk6ZWE6Yjg6MGE6ODE6MWE6NzM6NzM6YzA6OTM6Nzk6NjcKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDhhOjg2OjZmOmQxOmIyOjc2OmI1OjdlOjU3OjhlOjkyOjFjOjY1OjgyOjhhOjJiOmVkOjU4OmU5OmYyOmYyOjg4OjA1OjQxOjM0OmI3OmYxOmY0OmJmOmM5OmNjOjc0Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGWURDQ0EwaWdBd0lCQWdJVWVGaGZMcTBzR1V2ak53YzFOQk1vdFpiVVpaTXdEUVlKS29aSWh2Y05BUUVMCkJRQXdTREVMTUFrR0ExVUVCaE1DUWsweEdUQVhCZ05WQkFvVEVGRjFiMVpoWkdseklFeHBiV2wwWldReEhqQWMKQmdOVkJBTVRGVkYxYjFaaFpHbHpJRkp2YjNRZ1EwRWdNU0JITXpBZUZ3MHhNakF4TVRJeE56STNORFJhRncwMApNakF4TVRJeE56STNORFJhTUVneEN6QUpCZ05WQkFZVEFrSk5NUmt3RndZRFZRUUtFeEJSZFc5V1lXUnBjeUJNCmFXMXBkR1ZrTVI0d0hBWURWUVFERXhWUmRXOVdZV1JwY3lCU2IyOTBJRU5CSURFZ1J6TXdnZ0lpTUEwR0NTcUcKU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ2d2bEFRanVueWJFQzBCSnlGdVRISzNDM2tFYWtFUEJ0Vgp3ZWRZTUIwa3RNUHZoZDZNTE9IQlBkK0M1ayt0UjRkczdGdEp3VXJWdTQvc2g2eC9ncHFHN0QwRG1WSUIwaldlCnJOcndVOGxtUE5Tc0FnSGFKTk03cUFKR3I2UWM0L2h6V0hhMzlnNlFEYlh3ejh6NitjWk01Y09HTUFxTkYzNDEKNjhYZnV3NmN3STJINDRnNGhXZjZQc2VyNEJPY0JSaVl6NVAxc1pLMC9DUFR6OVhFSjBuZ25qeWJDS09MWFNvaAo0UHc1cWxQYWZYN1BHZ2xUdkYwRkJNK2hTbytMZG9JTm9malN4eFIzVzVBMkI0R2JQZ2I2VWw1anhhWUEvcVhwClVodFN0Wkk1Y2dNSllyMndZQlp1cHQwbHdnTm0zZk1FMFVEaVRvdUc5Ry9sZzZBbmhGNEV3ZldRdlRBOXhPK28KYWJ3NG02U2tsdEZpMm1uQUFaYXV5OFJSTk9vTXF2OGhqbG1QU2x6a1lacW4wdWtxZUkxUlBUb1Y3cUpaanFsYwozc1g1a0NMbGlFVngzWkdaYkhxZlBUMllmRjcydmhab29GNnVDeVA4V2crcUluWXR5YUVRSGVUVFJDT1FpSi9HCkt1Ylg5WnF6V0I0dk1Ja0lHMVNpdFpnajdBaDNISlZkWWRITGlaeGZva3FSbXU4aHFra1dDS2k5WVNneHlYU3QKaGZiWnhiR0wwZVVRTWsxZml5QTZQRWtmTTRWWkRkdkxDWFZEYVhQN2EzRjk4Ti9FVEgzR295N0lsWG5MYzZLTwpUazBrKzE3a0JMNXlHNlluTFVsYW1YclhYQWtndDMrVXVVL3hEUnhlaUVJYkViZm5rZHVlYlBScTM0d0dtQU90CnpDanZwVWZ6VXdJREFRQUJvMEl3UURBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUIKQmpBZEJnTlZIUTRFRmdRVW81Zlc4MTZpRU9HclJaODhGMlE4N2dGd25Nd3dEUVlKS29aSWh2Y05BUUVMQlFBRApnZ0lCQUJqNlczWDhQbnJIWDNmSHl0L1BYOE1TeEVCZDFES3F1R3JYMVJVVlJwZ2pwZWFRV3hpWlRPT3RRcU9DCk1UYUl6ZW43eEFTV1NJc0J4NDBCejFzekJwWkdablFkVCszQnRybTBEV0hNWTM3WExuZU1saHdxSTJocmhWZDIKY0RNVC91RlBwaU4zR1BvYWpPaTlaY25QUC9USkY5enJ4N3pBQkM0dFJpOXBac01iai83c1B0UEtsTDkyQ2lVTgpxWHNDSEtuUU8xOEx3SUU2UFdUaHY2Y3RUcjFOeE5ncHhpSVkwTVdzY2dLQ1A2bzZvam9pbHpIZENHUERkUlM1CllDZ3RXMmpnRnFsbWdpTlI5ZXRUMkRHYmUrbTNuVXZyaUJiUCtWMDRpa2t3aiszeDZ4bjBkeG94R0UxblZHd3YKYjJYNTJ6M3NJZXhlOVBTTHltQmxWTkZ4WlBUNXBxT0JNell6Y2ZDa2VGOU9yWU1oM2pSSmplaFpySjN5ZGxvMgo4aFAwcitBSngyRXFiUGZnbmE2N2hrb29ieTd1dEhuTmtEUERzM2I2OWZCc25RR1ErcDZROXB4eXowZmF3eC9rCk5TQlQ4bFRSMzJHRHBnTGlKVGplaFRJdFhuT1FVbDFDeE00OVMrSDVHWVFkMWFKUXpFSDdRUlREdmRiSldxTmoKWmdLQXZRVTZPMGVjN0FBbVRQV0lVYitvSTM4WUI3QUw3WXNtb1dUVFlVcnJYSi9lczY5bkE3TWYzVzFkYVdocApxMTQ2N0h4cHZNYzdoVTZlRmJtMEZVL0RsWHBZMThsczZXeTU4eWxqWHJRczhDMDk3VnBsNEtsYlFNSkltWUZ0Cm5oOEdLandTdElzUG02SWs4S2FOMW5yZ1M3WmtsbU9WaE1KS3pSd3VKSWN6WU9YRAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049UXVvVmFkaXMgUm9vdCBDQSAyIEczIE89UXVvVmFkaXMgTGltaXRlZAojIFN1YmplY3Q6IENOPVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMyBPPVF1b1ZhZGlzIExpbWl0ZWQKIyBMYWJlbDogIlF1b1ZhZGlzIFJvb3QgQ0EgMiBHMyIKIyBTZXJpYWw6IDM5MDE1NjA3OTQ1ODk1OTI1NzQ0NjEzMzE2OTI2NjA3OTk2MjAyNjgyNDcyNTgwMAojIE1ENSBGaW5nZXJwcmludDogYWY6MGM6ODY6NmU6YmY6NDA6MmQ6N2Y6MGI6M2U6MTI6NTA6YmE6MTI6M2Q6MDYKIyBTSEExIEZpbmdlcnByaW50OiAwOTozYzo2MTpmMzo4Yjo4YjpkYzo3ZDo1NTpkZjo3NTozODowMjowNTowMDplMToyNTpmNTpjODozNgojIFNIQTI1NiBGaW5nZXJwcmludDogOGY6ZTQ6ZmI6MGE6Zjk6M2E6NGQ6MGQ6Njc6ZGI6MGI6ZWI6YjI6M2U6Mzc6Yzc6MWI6ZjM6MjU6ZGM6YmM6ZGQ6MjQ6MGU6YTA6NGQ6YWY6NTg6YjQ6N2U6MTg6NDAKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZZRENDQTBpZ0F3SUJBZ0lVUkZjMEpGdUJpWnMxOHM2NEt6dGJweWJ3ZFNnd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1NERUxNQWtHQTFVRUJoTUNRazB4R1RBWEJnTlZCQW9URUZGMWIxWmhaR2x6SUV4cGJXbDBaV1F4SGpBYwpCZ05WQkFNVEZWRjFiMVpoWkdseklGSnZiM1FnUTBFZ01pQkhNekFlRncweE1qQXhNVEl4T0RVNU16SmFGdzAwCk1qQXhNVEl4T0RVNU16SmFNRWd4Q3pBSkJnTlZCQVlUQWtKTk1Sa3dGd1lEVlFRS0V4QlJkVzlXWVdScGN5Qk0KYVcxcGRHVmtNUjR3SEFZRFZRUURFeFZSZFc5V1lXUnBjeUJTYjI5MElFTkJJRElnUnpNd2dnSWlNQTBHQ1NxRwpTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDaHJpV3lBUmpjVjRnL1J1djVyK0xySTNIaW10RmhaaUZmCnFxOG5VZVZ1R3hiVUxYMVFzRk4zdlhnNllPSmtBcHQ4aHB2V0dvNnQveDhWZjlXVkhoTEw1aFNFQk1IZk5yTVcKbjRyanlkdVlOTTdZTXhjb1J2eW55ZkRTdE5WTkNYSkorZktINDZuYWZhRjlhN0k2SmFsdFVrU3MrTDV1Kzl5bQpjNUdRWWFZREZDRHk1NGVqaUsydG9Jei9wZ3NsVWlYbkZnSFZ5N2cxZ1F5ak8vRGg0ZnhhWGM2QWNXMzRTYXMrCk83cTQxNEFCKzZYclc3UEZYbUFxTWFDdk4rZ2dPcCtvTWl3TXpBa2QwNTZPWGJ4TW1PN0ZHbWg3N0ZPbTZSUTEKbzkvTmdKOE1TUHNjOVBHL1NyajYxWXh4U3NjZnJmNUJtck9EWGZLRVZ1K2xWMFBPS2EyTXExVy94UHRiQWQwagpJYUZZQUk3RDBHb1Q3UlBqRWl1QTNHZm1sYkxOSGlKdUt2aEIxUExLRkFlTmlsVVN4bW4xdUlab0wxTmVzTktxCkljR1k1akRqWjFYSG0yNnNHYWhWcGtVRzBDTTYyK3RsWFNvUkVmQTdUOHB0OURURWNlVC9BRnIyWEs0allJVnoKOGVRUXNTV3UxWks3RThFTTREbmF0RGxYdGFzMXFuSWhPNE0xNXpIZmVpRnV1RElJZlIweWtSVktZbkxQNDNlaAp2TlVSRzNZQlp3amdRUXZENnhWdStLUVoyYUtycitJblVsWXJBb29zRkNUNXYwSUN2eWJJeG8vZ2JqaDlVeTNsCjdaaXpsV05vZi9rMTlOK0l4V0Exa3NCOGFSeGhsUmJRNjk0THJ6NEVFRVZsV0ZBNHIwanlXYllXOGp3TmtBTEcKY0M0QnJUd1Yxd0lEQVFBQm8wSXdRREFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQgpCakFkQmdOVkhRNEVGZ1FVN2VkdmRscS9ZT3hKVzhhbGQ3dHlGbkdieEQwd0RRWUpLb1pJaHZjTkFRRUxCUUFECmdnSUJBSkhmZ0Q5RENYNXh3dmZyczRpUDRWR3l2RDExK1NoZHlMeVptM3RkcXVYSzRRcjM2TExUbjkxbk1YNjYKQWFySGFrRTdrTlFJWExKZ2FwRHd5TTREWXZtTDdmdHVLdHdHVFR3cEQ0a1dpbGhNU0Evb2hHSHFQSEttZCtSQwpyb2lqUTFoNWZxN0twVk1OcVQxd3ZTQVpZYVJzT1B4RE11SEJSLy80N1BFUklqS1duTUwyVzJtV2V5QU1RMEdhClcvWlpHWWplVllnM1VRdDRYQW9lbzBMOXg1MklEOER5ZUFJa1ZKT3ZpWWVJeVVxQUhlclFiajVoTGphN05RNG4KbHYxbU5EdGhjblB4Rmx4SEJsUkpBSHBZRXJBSzc0WDlzYmd6ZFdxVEhCTG1ZRjV2SFgvSkh5UExoR0dmSG9KRQorVit0WWxVa21sS1k3Vkhub1g2WE91WXZIeEhhVTRBc2haNnJOUkRiSWw5cXhWNlhVL0l5QWdrd28xandEUUhWCmNzYXhmR2w3dy9VMlJjeGhibDVNbE1WZXJ1Z09Yb3UvOTgzZzdhRU9HelB1VkJqK0Q3N3Zmb1JyUStOd21OdGQKZGJJTldRZUZGU001MXZIZnFTWVAxa2pIczZZaTlUTTNXcFZIbjN1NkdCVnYvOVlVWklOSjBncG5JZHNQTldOZwpLQ0xqc1pXRHpZV20zUzhQNTJkU2Jyc3ZoWHoxU25QbnhUN0F2U0VTQlQvOHR3TkpBbHZJSmViaVZEajFlWWVNCkhWT3lUb1Y3QmpqSExQajRzSEtOSmVWM1V2UURIRWltVUYrSUlEQnU4b0pEcXoyWGhPZFQreUhCVHc4aW1vYTQKV1NyMlJ6MFppQzNvaGVHZTdJVUlhckZzTk1rZDdFZ3JPM2p0WnNTT2VXbUQzbitNCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1RdW9WYWRpcyBSb290IENBIDMgRzMgTz1RdW9WYWRpcyBMaW1pdGVkCiMgU3ViamVjdDogQ049UXVvVmFkaXMgUm9vdCBDQSAzIEczIE89UXVvVmFkaXMgTGltaXRlZAojIExhYmVsOiAiUXVvVmFkaXMgUm9vdCBDQSAzIEczIgojIFNlcmlhbDogMjY4MDkwNzYxMTcwNDYxNDYyNDYzOTk1OTUyMTU3MzI3MjQyMTM3MDg5MjM5NTgxCiMgTUQ1IEZpbmdlcnByaW50OiBkZjo3ZDpiOTphZDo1NDo2Zjo2ODphMTpkZjo4OTo1NzowMzo5Nzo0MzpiMDpkNwojIFNIQTEgRmluZ2VycHJpbnQ6IDQ4OjEyOmJkOjkyOjNjOmE4OmM0OjM5OjA2OmU3OjMwOjZkOjI3Ojk2OmU2OmE0OmNmOjIyOjJlOjdkCiMgU0hBMjU2IEZpbmdlcnByaW50OiA4ODplZjo4MTpkZToyMDoyZTpiMDoxODo0NToyZTo0MzpmODo2NDo3Mjo1YzplYTo1ZjpiZDoxZjpjMjpkOTpkMjowNTo3MzowNzowOTpjNTpkODpiODo2OTowZjo0NgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRllEQ0NBMGlnQXdJQkFnSVVMdldiQWlpbjIzci8xYU9wN3IwRG9NOFNhaDB3RFFZSktvWklodmNOQVFFTApCUUF3U0RFTE1Ba0dBMVVFQmhNQ1FrMHhHVEFYQmdOVkJBb1RFRkYxYjFaaFpHbHpJRXhwYldsMFpXUXhIakFjCkJnTlZCQU1URlZGMWIxWmhaR2x6SUZKdmIzUWdRMEVnTXlCSE16QWVGdzB4TWpBeE1USXlNREkyTXpKYUZ3MDAKTWpBeE1USXlNREkyTXpKYU1FZ3hDekFKQmdOVkJBWVRBa0pOTVJrd0Z3WURWUVFLRXhCUmRXOVdZV1JwY3lCTQphVzFwZEdWa01SNHdIQVlEVlFRREV4VlJkVzlXWVdScGN5QlNiMjkwSUVOQklETWdSek13Z2dJaU1BMEdDU3FHClNJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUN6eXc0UVo0N3FGSmVuTWlvS1ZqWi9hRXpIczI4Nkl4U1IKL3hsL3BjcXM3ck4yblhycGl4dXJhekhiK2d0VFRLL0ZwUnA1UElwTS82emZKZDVPMllJeUMwVGV5dHVNcktOdQpGb003cG1STE1vbjdGaFk0ZnV0RDR0TjBTc0ppQ25NSzNVbXpWOUt3Q29XZGNUemVvOHZBTXZNQk9TQkRHelhSClU3T3g3c1dUYVlJK0ZyVW9ScUhlNm9rSjdVTzRCVWFLaHZWWlI3NGJid0VoRUxuOXFkSW95aEE1Q2NvVE5zK2MKcmExQWRIa3JBajgwLy9vZ2FYM1Q3bUgxdXJQbk1OQTNJNFp5WVVVcFNGbG9iM2VtTG9HK0IwMXZyODdFUlJPUgpGSEFHangrZitJZHBzUTd2dzRrWjYrb2NZZng2YklyYzFnTUxuaWE2RXQzVVZEbXJKcU16Nm5XQjJpM05EMC9rCkE5SHZGWmNiYTVERkFwQ1RaZ0loc1VmZWk1cEtnTGxWajdXaUw4RFdNMmZhZnNTbnRBUkU2MGY3NWxpNTl3encKZXl1eHdIQXB3MEJpTFR0SWFkd2pQRWpyZXdsNXFXM2FxRENZejRCeUE0aW1XMGF1Y25sOENBTWhaYTYzNFJ5bApzU3FpTWQ1bUJQZkFkT2h4M3Y4OVdjeVdKaEtMaFpWWEdxdHJkUXRFUFJFb1BIdGh0K0tQWjAvbDdEeE1ZSUJwClZ6Z2VBVnVOVmVqSDM4RE1keU0wU1hWODlwZ1I2eTNlN1VFdUZBVUNmK0QrSU9zMTV4R3NJczVYUGQ3Sk1HMFEKQTRYTjhmK01GclhCc2o2SWJHQi9rRStWOS9ZdHJRRTVCd1Q2ZFlCOXYwbFE3ZS9KeEh3YzY0QisyN2JRM1JQKwp5ZE9jMTdLWHFRSURBUUFCbzBJd1FEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCCkJqQWRCZ05WSFE0RUZnUVV4aGZRdktqcUFrUHlHd2FaWFN1UUlMblhuT1F3RFFZSktvWklodmNOQVFFTEJRQUQKZ2dJQkFEUmgyVmExRW9kVlRkMmpOVEZHdTZRSGNyeGZZV0xvcGZzTE43RTh0clA2S1oxL0F2V2t5YWlUdDNweApLR21QYytGU2tOclZ2anJsdDNacVZvQWgzMTNtNlRxZTVUNzJvbW5IS2dxd0dFZmNJSEI5VXFNK1dYekJ1c25JCkZVQmh5bkxXY0t6U3QvQWM1SVlwOE03dmFHUFF0U0NLRldHYWZvYVl0TW5DZHZ2TXVqQVd6S05oeG5RVDVXdnYKb3hYcUEvNFRpMlRrMDhIUzZJVDdTZEVRVFhsbTY2cjk5STB4SG5BVXJkemVaeE5NZ1JWaHZMZlprWGR4R1lGZwp1L0JZcGJXY0MvZVBJbFVud0VzQmJUdVpEZFFkbTJObkw5RHVEY3BtdkpSUHBxM3QvTzVqckZjL1pTWFBzb2FQCjBBai91SFlVYnQ3bEoreXJlTFZUdWJZLzZDRDUwcWkrWVViS2g0eUU4L254b0dpYkloNkJKcHNRQkpGeHdBWWYKM0tEVHVWYW40NWd0ZjRPZDM0d3JuREtPTXBUd0FUd2lLcDlEd2k3RG1Ea0hPSHY4WGdCQ0gvTXlKbm1EaFBibAo4TUZSRXNBTEhnUWpERlNsVEM5SnhVclJ0bTVnRFd2OGE0dUZKR1MzaVE2ckpVZGJQTTkrU2IzSDZRckcydmQrCkRoY0kwMGlYMEhHUzhBODVQalJxSEgzWThpS3V1Mm4wTTdTbVNGWFJEdzRtNk95MkN5Mm5oVFhOL1ZuSW45SE4KUGxvcE5MazloTTZ4WmRSWmtaRldkU0hCZDU3NWV1RmduZE90QkJqMGZPdGVrNDlUU2lJcCtFZ3JQazJHckZ0Lwp5d2FaV1dEWVdHV1ZqVVRSOTM5K0ozOTlyb0QxQjB5MlBweHhWSmtFUy8xWStaajAKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPURpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBHMiBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgU3ViamVjdDogQ049RGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IEcyIE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBMYWJlbDogIkRpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBHMiIKIyBTZXJpYWw6IDE1Mzg1MzQ4MTYwODQwMjEzOTM4NjQzMDMzNjIwODk0OTA1NDE5CiMgTUQ1IEZpbmdlcnByaW50OiA5MjozODpiOTpmODo2MzoyNDo4Mjo2NToyYzo1NzozMzplNjpmZTo4MTo4Zjo5ZAojIFNIQTEgRmluZ2VycHJpbnQ6IGExOjRiOjQ4OmQ5OjQzOmVlOjBhOjBlOjQwOjkwOjRmOjNjOmUwOmE0OmMwOjkxOjkzOjUxOjVkOjNmCiMgU0hBMjU2IEZpbmdlcnByaW50OiA3ZDowNTplYjpiNjo4MjozMzo5Zjo4Yzo5NDo1MTplZTowOTo0ZTplYjpmZTpmYTo3OTo1MzphMToxNDplZDpiMjpmNDo0OTo0OTo0NToyZjphYjo3ZDoyZjpjMTo4NQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGxqQ0NBbjZnQXdJQkFnSVFDNU1jT3RZNVorcG5JNy9EcjVyMFN6QU5CZ2txaGtpRzl3MEJBUXNGQURCbApNUXN3Q1FZRFZRUUdFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzCmQzY3VaR2xuYVdObGNuUXVZMjl0TVNRd0lnWURWUVFERXh0RWFXZHBRMlZ5ZENCQmMzTjFjbVZrSUVsRUlGSnYKYjNRZ1J6SXdIaGNOTVRNd09EQXhNVEl3TURBd1doY05Nemd3TVRFMU1USXdNREF3V2pCbE1Rc3dDUVlEVlFRRwpFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzZDNjdVpHbG5hV05sCmNuUXVZMjl0TVNRd0lnWURWUVFERXh0RWFXZHBRMlZ5ZENCQmMzTjFjbVZrSUVsRUlGSnZiM1FnUnpJd2dnRWkKTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFEWjV5Z3ZVajgyY2ttSWt6VHorR29lTVZTQQpuNjFVUWJWSDM1YW8xSytBTGJrS3ozWDlpYVY5SlByaklnd3J2SlVYQ3pPL0dVMUJCcEFBdlF4TkVQNEh0ZWNjCmJpSlZNV1dYdmRNWDBoNWk4OXZxYkZDTVA0UU1scyszeXdQZ3ltMmhGRXdiaWQzdEFMQlNmSytSYkxFNEU5SHAKRWdqQUFMQWNLeEhhZDNBMm02N09lWWZjZ25EbUNYUndWV212bzJpZnY5MjJlYlB5blhBcFZmU3IvNVZoODhsQQpieDNSdnBPNzA0Z3F1NTIvY2xwV2NUcy8xUFBSQ3Y0bzc2UHUyWm12QTlPUFlMZnlrcUd4dlltSkh6RE53Nll1CllqT3VGZ0ozUkZybmdRbzhwMFF1ZWJnL0JMeGNvSWZoRzY5UmpzM3NMUHI0L20zd09ueXFpK1JubFRHTkFnTUIKQUFHalFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdHR01CMEdBMVVkRGdRVwpCQlRPdzBxNW1WWHl1TnRndjZsK3ZWYTFsemFuMWpBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQXlxVlZqT1BJClFXNXBKNmQxRWU4OGhqWnYwcDNHZURnZGFaYWlrbWt1T0d5YmZRVFVpYVd4TVRlS3lTSE1xMnpOaXh5YTFyOUkKMGpKbXdZckE4eTg2NzhEajFKR0cwVkRqQTl0emQyOUtPVlB0M2liSHRYMnZLMExSZFdMalNpc0N4MUJMNEduaQpsbXdPUkdZUVJJK3RCZXY0ZWF5bUcrZzNOSjFUeVdHcW9sS3ZTbkFXaHNJNnlMRVRjRGJZeis3MENqVFZXMHo5CkI1eWl1dGtCY2x6elRjSGREckVjRGNSanZxMzBGUHVKN0tKQkRrek15RmRBMEc0RHFzME1qb21abVd6d1BEQ3YKT045dnZLTytLU0FucTNUL0V5SjQzcGRTVlI2RHRWUWdBKzZ1d0U5VzNqZk13MytxQkNlNzAzZTRZdHNYZkp3bwpJaE56Yk04bTlZb3A1dz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1EaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIFN1YmplY3Q6IENOPURpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBHMyBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgTGFiZWw6ICJEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMiCiMgU2VyaWFsOiAxNTQ1OTMxMjk4MTAwODU1MzczMTkyODM4NDk1MzEzNTQyNjc5NgojIE1ENSBGaW5nZXJwcmludDogN2M6N2Y6NjU6MzE6MGM6ODE6ZGY6OGQ6YmE6M2U6OTk6ZTI6NWM6YWQ6NmU6ZmIKIyBTSEExIEZpbmdlcnByaW50OiBmNToxNzphMjo0Zjo5YTo0ODpjNjpjOTpmODphMjowMDoyNjo5ZjpkYzowZjo0ODoyYzphYjozMDo4OQojIFNIQTI1NiBGaW5nZXJwcmludDogN2U6Mzc6Y2I6OGI6NGM6NDc6MDk6MGM6YWI6MzY6NTU6MWI6YTY6ZjQ6NWQ6Yjg6NDA6Njg6MGY6YmE6MTY6NmE6OTU6MmQ6YjE6MDA6NzE6N2Y6NDM6MDU6M2Y6YzIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNSakNDQWMyZ0F3SUJBZ0lRQzZGYStoM2ZvTFZKUksvTkpLQnM3REFLQmdncWhrak9QUVFEQXpCbE1Rc3cKQ1FZRFZRUUdFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzZDNjdQpaR2xuYVdObGNuUXVZMjl0TVNRd0lnWURWUVFERXh0RWFXZHBRMlZ5ZENCQmMzTjFjbVZrSUVsRUlGSnZiM1FnClJ6TXdIaGNOTVRNd09EQXhNVEl3TURBd1doY05Nemd3TVRFMU1USXdNREF3V2pCbE1Rc3dDUVlEVlFRR0V3SlYKVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzZDNjdVpHbG5hV05sY25RdQpZMjl0TVNRd0lnWURWUVFERXh0RWFXZHBRMlZ5ZENCQmMzTjFjbVZrSUVsRUlGSnZiM1FnUnpNd2RqQVFCZ2NxCmhrak9QUUlCQmdVcmdRUUFJZ05pQUFRWjU3eXNSR1h0emJnL1dQdU5zVmVwUkMwRkZmTHZDLzhRZEorMVlsSmYKWm40ZjVkd2JSWGtMek1aVENwMk5YUUxacVZuZUFscjJsU29PalRoS2lrbkd2TVlET0FkZlZkcCtDVzdpZjE3UQpSU0FQV1hZUTFxQWs4QzNlTnZKc0tUbWpRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvCkJBUURBZ0dHTUIwR0ExVWREZ1FXQkJUTDBMMnA0WmdGVWFGTk42S0RlYzZOSFNya2hEQUtCZ2dxaGtqT1BRUUQKQXdObkFEQmtBakFscElGRkFtc1NTM1YwVDhnajQzRHlkWExlZklud3o1RnlZWjVlRUpKWlZybUR4eERuT09sWQpKalo5MWVRMGhqa0NNSHcyVS9BdzVXSmpPcG5pdHFNN216VDZIdG9Ra25GZWtST24zYVJ1a3N3eTF2VWhac2N2CjZwWmphbVZGa3BVQnRBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPURpZ2lDZXJ0IEdsb2JhbCBSb290IEcyIE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBTdWJqZWN0OiBDTj1EaWdpQ2VydCBHbG9iYWwgUm9vdCBHMiBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgTGFiZWw6ICJEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMiIKIyBTZXJpYWw6IDQyOTM3NDM1NDAwNDY5NzUzNzg1MzQ4Nzk1MDMyMDIyNTM1NDEKIyBNRDUgRmluZ2VycHJpbnQ6IGU0OmE2OjhhOmM4OjU0OmFjOjUyOjQyOjQ2OjBhOmZkOjcyOjQ4OjFiOjJhOjQ0CiMgU0hBMSBGaW5nZXJwcmludDogZGY6M2M6MjQ6Zjk6YmY6ZDY6NjY6NzY6MWI6MjY6ODA6NzM6ZmU6MDY6ZDE6Y2M6OGQ6NGY6ODI6YTQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGNiOjNjOmNiOmI3OjYwOjMxOmU1OmUwOjEzOjhmOjhkOmQzOjlhOjIzOmY5OmRlOjQ3OmZmOmMzOjVlOjQzOmMxOjE0OjRjOmVhOjI3OmQ0OjZhOjVhOmIxOmNiOjVmCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEampDQ0FuYWdBd0lCQWdJUUF6cng1cWNScWFDN0tHU3hIUW42NVRBTkJna3Foa2lHOXcwQkFRc0ZBREJoCk1Rc3dDUVlEVlFRR0V3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjMKZDNjdVpHbG5hV05sY25RdVkyOXRNU0F3SGdZRFZRUURFeGRFYVdkcFEyVnlkQ0JIYkc5aVlXd2dVbTl2ZENCSApNakFlRncweE16QTRNREV4TWpBd01EQmFGdzB6T0RBeE1UVXhNakF3TURCYU1HRXhDekFKQmdOVkJBWVRBbFZUCk1SVXdFd1lEVlFRS0V3eEVhV2RwUTJWeWRDQkpibU14R1RBWEJnTlZCQXNURUhkM2R5NWthV2RwWTJWeWRDNWoKYjIweElEQWVCZ05WQkFNVEYwUnBaMmxEWlhKMElFZHNiMkpoYkNCU2IyOTBJRWN5TUlJQklqQU5CZ2txaGtpRwo5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBdXpmTk5OeDdhOG15YUpDdFNuWC9Scm9oQ2dpTjlSbFV5ZnVJCjIvT3U4anFKa1R4NjVxc0dHbXZQckMzb1hna2tSTHBpbW43V282aCs0RlIxSUFXc1VMZWNZeHBzTU56YUh4bXgKMXg3ZS9kZmd5NVNETjY3c0gwTk8zWHNzMHIwdXBTL2txYml0T3RTWnBMWWw2WnRyQUdDU1lQOVBJVWtZOTJlUQpxMkVHbkkveXV1bTA2Wkl5YTdYelYraGRHODJNSGF1VkJKVko4elV0bHVOSmJkMTM0L3RKUzdTc1ZRZXBqNVd6CnRDTzdURzFGOFBhcHNwVXd0UDFNVll3blNsY1VmSUtkelhPUzB4WktCZ3lNVU5HUEhnbStGNkhtSWNyOWcrVVEKdklPbENzUm5LUFp6RkJROVJuYkRoeFNKSVRSTnJ3OUZES1pKb2JxN25NV3hNNE1waFFJREFRQUJvMEl3UURBUApCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCaGpBZEJnTlZIUTRFRmdRVVRpSlVJQmlWCjV1TnU1Zy82K3JrUzdRWVhqemt3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUdCbktKUnZEa2hqNnpIZDZtY1kKMVlsOVBNV0xTbi9wdnRzckY5K3dYM04zS2pJVE9ZRm5Rb1FqOGtWbk5leUl2L2lQc0dFTU5LU3VJRXlFeHR2NApOZUYyMmQrbVFydkhSQWlHZnpaMEpGcmFiQTBVV1RXOThrbmR0aC9Kc3cxSEtqMlpMN3RjdTdYVUlPR1pYMU5HCkZkdG9tL0R6TU5VK01lS05oSjdqaXRyYWxqNDFFNlZmOFBsd1VIQkhRUkZYR1U3QWo2NEd4SlVURnk4YkpaOTEKOHJHT21hRnZFN0ZCY2Y2SUtzaFBFQ0JWMS9NVVJlWGdSUFRxaDVVeWt3NytVMGI2TEozL2l5SzVTOWtKUmFUZQpwTGlhV04wYmZWS2ZqbGxEaUlHa25pYlZiNjNkRGNZM2ZlMERraHZsZDE5MjdqeU54RjFXVzZMWlptNnpOVGZsCk1yWT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPURpZ2lDZXJ0IEdsb2JhbCBSb290IEczIE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBTdWJqZWN0OiBDTj1EaWdpQ2VydCBHbG9iYWwgUm9vdCBHMyBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgTGFiZWw6ICJEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMyIKIyBTZXJpYWw6IDcwODkyNDQ0NjkwMzAyOTMyOTE3NjAwODMzMzM4ODQzNjQxNDYKIyBNRDUgRmluZ2VycHJpbnQ6IGY1OjVkOmE0OjUwOmE1OmZiOjI4OjdlOjFlOjBmOjBkOmNjOjk2OjU3OjU2OmNhCiMgU0hBMSBGaW5nZXJwcmludDogN2U6MDQ6ZGU6ODk6NmE6M2U6NjY6NmQ6MDA6ZTY6ODc6ZDM6M2Y6ZmE6ZDk6M2I6ZTg6M2Q6MzQ6OWUKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDMxOmFkOjY2OjQ4OmY4OjEwOjQxOjM4OmM3OjM4OmYzOjllOmE0OjMyOjAxOjMzOjM5OjNlOjNhOjE4OmNjOjAyOjI5OjZlOmY5OjdjOjJhOmM5OmVmOjY3OjMxOmQwCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDUHpDQ0FjV2dBd0lCQWdJUUJWVld2UEplcERVMXc2UVAxYXRGY2pBS0JnZ3Foa2pPUFFRREF6QmhNUXN3CkNRWURWUVFHRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCM2QzY3UKWkdsbmFXTmxjblF1WTI5dE1TQXdIZ1lEVlFRREV4ZEVhV2RwUTJWeWRDQkhiRzlpWVd3Z1VtOXZkQ0JITXpBZQpGdzB4TXpBNE1ERXhNakF3TURCYUZ3MHpPREF4TVRVeE1qQXdNREJhTUdFeEN6QUpCZ05WQkFZVEFsVlRNUlV3CkV3WURWUVFLRXd4RWFXZHBRMlZ5ZENCSmJtTXhHVEFYQmdOVkJBc1RFSGQzZHk1a2FXZHBZMlZ5ZEM1amIyMHgKSURBZUJnTlZCQU1URjBScFoybERaWEowSUVkc2IySmhiQ0JTYjI5MElFY3pNSFl3RUFZSEtvWkl6ajBDQVFZRgpLNEVFQUNJRFlnQUUzYWZadTRxNEMvc0xmeUhTOEw2K2MvTXpYUnE4Tk9yZXhwdTgwSlgyOE16UUM3cGhXMUZHCmZwNHRuKzZPWXd3WDdBZHc5YytFTGtDRG5PZy9RVzA3cmRPa0ZGazJlSjBEUSs0UUUyeHkzcTZJcDZGcnRVUE8KWjl3ai93TWNvK0krbzBJd1FEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCaGpBZApCZ05WSFE0RUZnUVVzOXRJcFBtaHhkaXVOa0hNRVdOcFlpbThTOFl3Q2dZSUtvWkl6ajBFQXdNRGFBQXdaUUl4CkFLMjg4bXcvRWtyUkxUbkRDZ21YYy9TSU5veUlKN3ZtaUkxUWhhZGorWjR5M21hVEQvSE1zUW1QM1d5cittdC8Kb0FJd09XWmJ3bVNOdUo1UTNLalZTYUx0eDl6UlNYOFhBYmpJaG85T2pJZ3JxSnFwaXNYUkFMMzRWT0thNVZ0OApzeWNYCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1EaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIFN1YmplY3Q6IENOPURpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNCBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgTGFiZWw6ICJEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQiCiMgU2VyaWFsOiA3NDUxNTAwNTU4OTc3MzcwNzc3OTMwMDg0ODY5MDE2NjE0MjM2CiMgTUQ1IEZpbmdlcnByaW50OiA3ODpmMjpmYzphYTo2MDoxZjoyZjpiNDplYjpjOTozNzpiYTo1MzoyZTo3NTo0OQojIFNIQTEgRmluZ2VycHJpbnQ6IGRkOmZiOjE2OmNkOjQ5OjMxOmM5OjczOmEyOjAzOjdkOjNmOmM4OjNhOjRkOjdkOjc3OjVkOjA1OmU0CiMgU0hBMjU2IEZpbmdlcnByaW50OiA1NToyZjo3YjpkYzpmMTphNzphZjo5ZTo2YzplNjo3MjowMTo3Zjo0ZjoxMjphYjpmNzo3Mjo0MDpjNzo4ZTo3NjoxYTpjMjowMzpkMTpkOTpkMjowYTpjODo5OTo4OAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmtEQ0NBM2lnQXdJQkFnSVFCWnNiVjU2T0lUTGlPUWU5cDNkMVhEQU5CZ2txaGtpRzl3MEJBUXdGQURCaQpNUXN3Q1FZRFZRUUdFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzCmQzY3VaR2xuYVdObGNuUXVZMjl0TVNFd0h3WURWUVFERXhoRWFXZHBRMlZ5ZENCVWNuVnpkR1ZrSUZKdmIzUWcKUnpRd0hoY05NVE13T0RBeE1USXdNREF3V2hjTk16Z3dNVEUxTVRJd01EQXdXakJpTVFzd0NRWURWUVFHRXdKVgpVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjNkM2N1WkdsbmFXTmxjblF1ClkyOXRNU0V3SHdZRFZRUURFeGhFYVdkcFEyVnlkQ0JVY25WemRHVmtJRkp2YjNRZ1J6UXdnZ0lpTUEwR0NTcUcKU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQy81cEJ6YU42NzVGMUtQREFpTUdrejdNS25KUzdKSVQzeQppdGhad3VFcHB6MVlxM2FhemE1N0c0UU54REFmOHh1a09CYnJWc2FYYlIycnNubnl5aEhTNUYvV0JUeFNEMUlmCnhwNFZwWDYrbjZsWEZsbFZjcTlvazNEQ3NycDFtV3B6TXBUUkVFUVFMdCtDOHdlRTVuUTdiWEhpTFF3YjdpRFYKeVNBZFl5a3R6dXhlVHNpVCtDRmhtelRyQmNaZTdGc2F2T3ZKejgyc05FQmZzWHBtN25mSVNLaG1WMWVmVkZpTwpEQ3UzVDZjdzJWYnV5bnRkNDYzSlQxN2xOZWN4eTlxVFh0eU9qNERhdHBHWVFKQjV3M2pIdHJIRXRXb1lPQU1RCmpkalVONlF1QlgySTlZSStFSkZ3cTFXQ1FUTFgyd1J6S202UkFYd2hUTlM4cmhzRGRWMTRadGs2TVVTYU0wQy8KQ05kYVNhVEM1cW1nWjkya0o3eWhUem0xRVZnWDl5UmNSbzlrOThGcGlIYVlkajFaWFVKMmg0bVhhWHBJOE9DaQpFaHRtbW5USzNrc2U1dzVqcnViVTc1S1NPcDQ5M0FEa1JTV0p0cHBFR1N0K3dKUzAwbUZ0NnpQWnhkOUxCQURNCmZSeVZ3NC8zSWJLeUViZTdmL0xWakhBc1FXQ3FzV01ZUkpVYWRtSis5b0N3Kytoa3BqUFJpUWZodmJmbVE2UVkKdUtaM0FlRVBsQXdoSGJKVUtTV0piT1VPVWxGSGRMNG1yTFpCZGQ1NnJGK05QOG04MDBFUkVsdmxFRkRyTWNYSwpjaFlpQ2Q5OFRIVS9ZK3doWDhRZ1VXdHZzYXVHaTAvQzFrVmZuU0Q4b1I3RndJK2lzWDRLSnBuMTVHa3ZtQjB0CjlkbXBzaDNsR3dJREFRQUJvMEl3UURBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUIKaGpBZEJnTlZIUTRFRmdRVTdOZmpndEp4WFdSTTN5NW5QK2U2bUs0Y0QwOHdEUVlKS29aSWh2Y05BUUVNQlFBRApnZ0lCQUx0aDJYMnBiTDRYeEpFYnc2R2lBSTNqWkdnUFZzOTNybkQ1L1pwS21ibkplRndNREYvazVoUXBWZ3MyClNWMUVZK0N0bkpZWVpoc2pEVDE1NlcxcjFsVDQwanpCUTBDdUhWRDFVdnlRTzd1WW1XbHJ4OEducUdpa0o5eWQKK1NldU1JVzU5bWROT2o2UFdUa2lVMFRyeUYwRHl1MVFlbjFpSVFxQXlITm0wYUFGWUYvb3BiU25yNmozYlRXYwpmRnFLMXFJNG1mTjRpL1JOMGlBTDNnVHVqSnRIZ1hJTndCUXk3ekJaTHE3Z2NmSlc1R3FYYjVKUWJaYU5hSHFhCnNqWVVlZ2J5SkxrSkVWRFhDTEc0aVhxRUkyRkNLZVdqemFJZ1FkZlJuR1RaNmlhaGl4VFhUQm15VUVGeFBUOU4KY0NPR0RFcmNnZExNTXBTRURRZ0pseHhQd081cklIUXcwdUE1TkJDRklSVUJDT2hWTXQ1eFNka29GMUJONXI1TgowWFdzME1yN1FiaERwYXJUd3dWRVR5dzJtK0w2NGtXNEkxTnNCbTluVlg5R3RVdy9iaWhhZVNiU3BLaGlsOUllCjR1MUtpN3diL1VkS0RkOW5abjZ5VzBIUU8rVDBPL1FFWStudndsUUFVYUNLS3NuT2VNelY2b2NFR0xQT3IwbUkKci9PU21iYXo1bUVQMG9VQTUxQWE1QnVWblJtaHVaeXhtN0VBSHUvUUQwOUNiTWtLdk81RCtqcHhwY2hOSnFVMQovWWxkdklWaUhUTFNvQ3RVN1pwWHdkdjZFTThadDR0S0c0OEJ0aWVWVStpMmlXMWJ2R2pVSStpTFVhSlcrZkNtCmdLRFdIck84RHc5VGRTbXE2aE4zNU42TWdTR3RCeEJIRWEySFBRZlJkYnpQODJaKwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049Q09NT0RPIFJTQSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPUNPTU9ETyBDQSBMaW1pdGVkCiMgU3ViamVjdDogQ049Q09NT0RPIFJTQSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPUNPTU9ETyBDQSBMaW1pdGVkCiMgTGFiZWw6ICJDT01PRE8gUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IgojIFNlcmlhbDogMTAxOTA5MDg0NTM3NTgyMDkzMzA4OTQxMzYzNTI0ODczMTkzMTE3CiMgTUQ1IEZpbmdlcnByaW50OiAxYjozMTpiMDo3MTo0MDozNjpjYzoxNDozNjo5MTphZDpjNDozZTpmZDplYzoxOAojIFNIQTEgRmluZ2VycHJpbnQ6IGFmOmU1OmQyOjQ0OmE4OmQxOjE5OjQyOjMwOmZmOjQ3OjlmOmUyOmY4Ojk3OmJiOmNkOjdhOjhjOmI0CiMgU0hBMjU2IEZpbmdlcnByaW50OiA1MjpmMDplMTpjNDplNTo4ZTpjNjoyOToyOToxYjo2MDozMTo3ZjowNzo0Njo3MTpiODo1ZDo3ZTphODowZDo1YjowNzoyNzozNDo2Mzo1Mzo0YjozMjpiNDowMjozNAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRjJEQ0NBOENnQXdJQkFnSVFUS3I1eXR0amIrQWY5MDdZV3dPR25UQU5CZ2txaGtpRzl3MEJBUXdGQURDQgpoVEVMTUFrR0ExVUVCaE1DUjBJeEd6QVpCZ05WQkFnVEVrZHlaV0YwWlhJZ1RXRnVZMmhsYzNSbGNqRVFNQTRHCkExVUVCeE1IVTJGc1ptOXlaREVhTUJnR0ExVUVDaE1SUTA5TlQwUlBJRU5CSUV4cGJXbDBaV1F4S3pBcEJnTlYKQkFNVElrTlBUVTlFVHlCU1UwRWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrd0hoY05NVEF3TVRFNQpNREF3TURBd1doY05Nemd3TVRFNE1qTTFPVFU1V2pDQmhURUxNQWtHQTFVRUJoTUNSMEl4R3pBWkJnTlZCQWdUCkVrZHlaV0YwWlhJZ1RXRnVZMmhsYzNSbGNqRVFNQTRHQTFVRUJ4TUhVMkZzWm05eVpERWFNQmdHQTFVRUNoTVIKUTA5TlQwUlBJRU5CSUV4cGJXbDBaV1F4S3pBcEJnTlZCQU1USWtOUFRVOUVUeUJTVTBFZ1EyVnlkR2xtYVdOaApkR2x2YmlCQmRYUm9iM0pwZEhrd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUNSCjZGU1MwZ3BXc2F3TkpOM0Z6MFJuZEprck42TjlJM0FBY2J4VDM4VDZLaEtQUzM4UVZyMmZjSEszWVgvSlN3OFgKcHozanNBUmg3djhSbDhmMGhqNEsrajVjK1pQbU5IclpGR3ZubkxPRm9JSjZkcTl4a05mcy9RMzZuR3o2MzdDQwo5QlIrK2I3RXBpOVBmNWwvdGZ4blEzSzlEQURXaWV0ckxOUHRqNWdjRkt0KzVlTnUvTmlvNUpJazJrTnJZcmhWCi9lckJ2R3kyaS9NT2pacmttMnhwbWZoNFNEQkYxYTNoRFR4RllQd3lsbEVudkdmRHlpNjJhK3BHeDhjZ29MRWYKWmQ1SUNMcWtUcW55ZzBZM2hPdm96SUZJUTJkT2NpcWJYTDFNR3lpS1hDSjd0S3VZMmU3Z1VZUERDVVpPYlQ2WgorcFVYMm53elYwRThqVkh0QzdaY3J5eGpHdDlYeUQrODZWM0VtNjlGbWVLaldpUzB1cWxXUGM5dnF2OUpXTDd3CnFQLzB1SzNwTi91NnVQUUxPdm5vUTBJZWlkaUV5eFB4MmJ2aGlXQzRqQ2hXckJRZG5Bcm5jZXZQRHQwOXFaYWgKU0wwODk2KzFEU0pNd0JHQjdGWTc5dE9pNGx1M3NnUWlVcFdBazJub2preGw4WkVETFhCMEF1cUxaeFVwYVZJQwp1OWZmVUdwVlJyK2dveWhoZjNEUXc2S3FMQ0dxUjg0b25BWkZkcitDR0NlMDFhNjB5MURtYS9STWhuRXc2YWJmCkZvYmcyUDlBM2Z2UVFvaC9vek02TGx3ZVFSR0JZODRZY1dzcjdLYUt0ekZjT21wSDRNTjVXZFlnR3EveWFwaXEKY3J4WFN0SkxuYnNRL0xCTVFlWHRIVDFlS0oyY3pMK3pVZHFuUitXRVV3SURBUUFCbzBJd1FEQWRCZ05WSFE0RQpGZ1FVdTY5K0FqMzZwdkU4aEk2dDdqaVk3Tmt5TXRRd0RnWURWUjBQQVFIL0JBUURBZ0VHTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRU1CUUFEZ2dJQkFBcngxVWFFdDY1UnUyeXlUVUVVQUpOTW5NdmwKd0ZUUG9DV09Bdm45c0tJTjlTQ1lQQk10ckZhaXNOWitFWkxwTHJxZUxwcHlzYjBaUkd4aE5hS2F0QllTYVZxTQo0ZGMrcEJyb0x3UDBybUVkRUJzcXBJdDZ4ZjRGcHVIQTFzaitucTZQSzdvOW1malljd2xZUm02bW5QVFhKOU9WCjJqZURjaHpUYytDaVI1a0RPRjNWU1hrQUtSekg3SnNnSEFja2FWZDRzam44T29TZ3RaeDhqYjh1azJJbnR6bmEKRnhpdXZUd0phUCtFbXp6VjFnc0Q0MWVlRlBmUjYwL0l2WWNqdDdaSlEzbUZYTHJya2d1aHh1aG9xRXdXc1JxWgpDdWhUTEpLN29Ra1lkUXhscUh2TEk3Y2F3aWlGd3h2LzBDdGk3NlI3Q1pHWVo0d1VBYzFvQm1waklYVURnSWlLCmJvSEdoZktwcEMzbjlLVWtFRWVEeXMzMGpYbFlzUWFiNXhvcTJaMEIxNVI5N1FOS3l2RGI2S2tCUHZWV21ja2UKamtrOXUrVUp1ZUJQU1pJOUZvSkF6TXhaeHVZNjdSSXVhVHhzbGJIOXFoMTdmNGErSGc0eVJ2djdFNDkxZjB5TApTMFpqL2dBMFFIREJ3N21oM2FadzRnU3pRYnpwZ0pIcVpKeDY0U0lEcVp4dWJ3NWxUMnlIaDE3emJxRDVkYVdiClFPaFRzaWVkU3JuQWR5R04vNGZ5M3J5TTd4ZmZ0MGtMMGZKdU1Bc2FEazUyN1JIODllbFdzbjIveDIwS2s0eWwKME1DMkhiNDZUcFNpMTI1c0M4S0tmUG9nODhUazVjME5xTXVSa3JGOGhleTFGR2xtRG9MbnpjN0lMYVpSZnlIQgpOVk9GQmtwZG42MjdHMTkwCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1VU0VSVHJ1c3QgUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89VGhlIFVTRVJUUlVTVCBOZXR3b3JrCiMgU3ViamVjdDogQ049VVNFUlRydXN0IFJTQSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPVRoZSBVU0VSVFJVU1QgTmV0d29yawojIExhYmVsOiAiVVNFUlRydXN0IFJTQSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSIKIyBTZXJpYWw6IDI2NDUwOTM3NjQ3ODEwNTg3ODc1OTE4NzE2NDU2NjU3ODg3MTcKIyBNRDUgRmluZ2VycHJpbnQ6IDFiOmZlOjY5OmQxOjkxOmI3OjE5OjMzOmEzOjcyOmE4OjBmOmUxOjU1OmU1OmI1CiMgU0hBMSBGaW5nZXJwcmludDogMmI6OGY6MWI6NTc6MzM6MGQ6YmI6YTI6ZDA6N2E6NmM6NTE6Zjc6MGU6ZTk6MGQ6ZGE6Yjk6YWQ6OGUKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGU3OjkzOmM5OmIwOjJmOmQ4OmFhOjEzOmUyOjFjOjMxOjIyOjhhOmNjOmIwOjgxOjE5OjY0OjNiOjc0OjljOjg5Ojg5OjY0OmIxOjc0OjZkOjQ2OmMzOmQ0OmNiOmQyCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGM2pDQ0E4YWdBd0lCQWdJUUFmMXRNUHlqeWxHb0c3eGtEalVETFRBTkJna3Foa2lHOXcwQkFRd0ZBRENCCmlERUxNQWtHQTFVRUJoTUNWVk14RXpBUkJnTlZCQWdUQ2s1bGR5QktaWEp6WlhreEZEQVNCZ05WQkFjVEMwcGwKY25ObGVTQkRhWFI1TVI0d0hBWURWUVFLRXhWVWFHVWdWVk5GVWxSU1ZWTlVJRTVsZEhkdmNtc3hMakFzQmdOVgpCQU1USlZWVFJWSlVjblZ6ZENCU1UwRWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrd0hoY05NVEF3Ck1qQXhNREF3TURBd1doY05Nemd3TVRFNE1qTTFPVFU1V2pDQmlERUxNQWtHQTFVRUJoTUNWVk14RXpBUkJnTlYKQkFnVENrNWxkeUJLWlhKelpYa3hGREFTQmdOVkJBY1RDMHBsY25ObGVTQkRhWFI1TVI0d0hBWURWUVFLRXhWVQphR1VnVlZORlVsUlNWVk5VSUU1bGRIZHZjbXN4TGpBc0JnTlZCQU1USlZWVFJWSlVjblZ6ZENCU1UwRWdRMlZ5CmRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa3dnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUsKQW9JQ0FRQ0FFbVVYTmc3RDJ3aXowS3hYRFhidHpTZlRUSzFRZzJIaXFpQk5DUzFrQ2R6T2laL01QYW5zOXMvQgozUEhUc2RaN055Z1JLMGZhT2NhOE9obTBYNmE5ZloyalkwSzJkdktwT3l1UitPSnYwT3dXSUpBSlB1TG9kTWtZCnRKSFVZbVRiZjZNRzhZZ1lhcEFpUEx6K0UvQ0hGSHYyNUIrTzFPUlJ4aEZuUmdoUnk0WVVWRCs4TS81K2JKei8KRnAwWXZWR09OYWFuWnNoeVo5c2hackhVbTNnRHdGQTY2TXp3M0x5ZVRQNnZCWlkxSDFkYXQvL08rVDIzTExiMgpWTjNJNXhJNlRhNU1pcmRjbXJTM0lEM0tmeUkwcm40N2FHWUJST2NCVGtaVG16Tmc5NVMrVXplUWMwUHpNc05UCjc5dXEvblJPYWNkcmpHQ1Qzc1RIRE4vaE1xN01renRSZUpWbmkrNDlWdjRNMEdrUEd3L3pKU1pyTTIzM2JrZjYKYzBQbGZnNmxackVwZkRLRVkxV0p4QTNCazFRd0dST3MwMzAzcCt0ZE9tdzFYTnRCMXhMYXFVa0wzOWlBaWdtVApZbzYxWnM4bGlNMkV1TEUvcERrUDJRS2U2eEpNbFh6emF3V3BYaGFEekxobjR1Z1RuY3hiZ3ROTXMrMWIvOTdsCmM2d2pPeTBBdnpWVmRBbEoyRWxZR24rU051WlJrZzd6Sm4wY1RSZTh5ZXhESnRDL1FWOUFxVVJFOUpublY0ZWUKVUI5WFZLZysvWFJqTDdGUVpRbm1XRUl1UXhwTXRQQWxSMW42QkI2VDFDWkdTbENCc3Q2K2VMZjhaeFhoeVZlRQpIZzlqMXVsaXV0WmZWUzdxWE1Zb0NBUWxPYmdPSzZueVRKY2NCejhOVXZYdDd5K0NEd0lEQVFBQm8wSXdRREFkCkJnTlZIUTRFRmdRVVUzbS9XcW9yU3M5VWdPSFltOENkOHJJRFpzc3dEZ1lEVlIwUEFRSC9CQVFEQWdFR01BOEcKQTFVZEV3RUIvd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVNQlFBRGdnSUJBRnpVZkEzUDl3RjlRWmxsREhQRgpVcC9MK00rWkJuOGIya01WbjU0Q1ZWZVdGUEZTUENlSGxDanRIem9CTjZKMi9GTlF3SVNieG10T3Vvd2hUNktPClZXS1I4MmtWMkx5STQ4U3FDLzN2cU9sTFZTb0dJRzFWZUNrWjdsOHdYRXNrRVZYL0pKcHVYaW9yN2d0Tm4zLzMKQVRpVUZKVkRCd243WUtudUhLc1NqS0NhWHFlWWFsbHRpejhJKzhqUlJhOFlGV1NRRWc5ektDN0Y0aVJPL0Zqcwo4UFJGL2lLejZ5K08wdGxGWVFYQmwyK29kbktQaTR3MnI3OE5CYzV4amVhbWJ4OXNwbkZpeGRqUWczSU04V2NSCmlReWNFMHh5Tk4rODFYSGZxbkhkNGJsc2pEd1NYV1hhdlZjU3RrTnIvK1hlVFdZUlVjK1pydXdYdHVoeGtZemUKU2Y3ZE5YR2lGU2VVSE05aDR5YTdiNk5uSlNGZDV0MGRDeTVvR3p1Q3IreURaNFhVbUZGMHNibVpnSW4vZjNnWgpYSGxLWUM2U1FLNU1OeW9zeWNkaXlBNWQ5elpieXVBbEpRRzAzUm9IbkhjQVA5RGMxZXc5MVBxN1A4eUYxbTkvCnFTM2Z1UUwzOVplYXRUWGF3MmV3aDBxcEtKNGpqdjljSjJ2aHNFL3pCKzRBTHRSWmg4dFNRWlhxOUVmWDdtUkIKVlh5TldRS1YzV0tkd3JudVdpaDBoS1didDVESERBZmY5WWsyZERMV0tNR3dzQXZnbkV6REhOYjg0Mm0xUjBhQgpMNktDcTlOalJIREVqZjh0TTdxdGozdTFjSWl1UGhuUFFDalkvTWlRdTEyWkl2VlM1bGpGSDRneFErNklIZGZHCmpqeERhaDJuR041OVBSYnhZdm5La0tqOQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VVNFUlRydXN0IEVDQyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPVRoZSBVU0VSVFJVU1QgTmV0d29yawojIFN1YmplY3Q6IENOPVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1UaGUgVVNFUlRSVVNUIE5ldHdvcmsKIyBMYWJlbDogIlVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkiCiMgU2VyaWFsOiAxMjMwMTM4MjM3MjAxOTk0ODE0NTY1Njk3MjA0NDM5OTc1NzIxMzQKIyBNRDUgRmluZ2VycHJpbnQ6IGZhOjY4OmJjOmQ5OmI1OjdmOmFkOmZkOmM5OjFkOjA2OjgzOjI4OmNjOjI0OmMxCiMgU0hBMSBGaW5nZXJwcmludDogZDE6Y2I6Y2E6NWQ6YjI6ZDU6MmE6N2Y6Njk6M2I6Njc6NGQ6ZTU6ZjA6NWE6MWQ6MGM6OTU6N2Q6ZjAKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDRmOmY0OjYwOmQ1OjRiOjljOjg2OmRhOmJmOmJjOmZjOjU3OjEyOmUwOjQwOjBkOjJiOmVkOjNmOmJjOjRkOjRmOmJkOmFhOjg2OmUwOjZhOmRjOmQyOmE5OmFkOjdhCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDanpDQ0FoV2dBd0lCQWdJUVhJdVp4VnFVeGRKeFZ0N05pWURNSmpBS0JnZ3Foa2pPUFFRREF6Q0JpREVMCk1Ba0dBMVVFQmhNQ1ZWTXhFekFSQmdOVkJBZ1RDazVsZHlCS1pYSnpaWGt4RkRBU0JnTlZCQWNUQzBwbGNuTmwKZVNCRGFYUjVNUjR3SEFZRFZRUUtFeFZVYUdVZ1ZWTkZVbFJTVlZOVUlFNWxkSGR2Y21zeExqQXNCZ05WQkFNVApKVlZUUlZKVWNuVnpkQ0JGUTBNZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt3SGhjTk1UQXdNakF4Ck1EQXdNREF3V2hjTk16Z3dNVEU0TWpNMU9UVTVXakNCaURFTE1Ba0dBMVVFQmhNQ1ZWTXhFekFSQmdOVkJBZ1QKQ2s1bGR5QktaWEp6WlhreEZEQVNCZ05WQkFjVEMwcGxjbk5sZVNCRGFYUjVNUjR3SEFZRFZRUUtFeFZVYUdVZwpWVk5GVWxSU1ZWTlVJRTVsZEhkdmNtc3hMakFzQmdOVkJBTVRKVlZUUlZKVWNuVnpkQ0JGUTBNZ1EyVnlkR2xtCmFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrd2RqQVFCZ2NxaGtqT1BRSUJCZ1VyZ1FRQUlnTmlBQVFhckZSYXFmbG8KSStkNjFTUnZVOFphMkV1cnh0VzIwZVp6Y2E3ZG5OWU1ZZjNib0lrRHVBVVU3RmZPN2wwLzRpR3p6dmZVaW5uZwpvNE4rTFpmUVljVHhtZHdsa1dPcmZ6Q2p0SERpeDZFem5QTy9MbHhUc1YremZUSi9palRqZVhtalFqQkFNQjBHCkExVWREZ1FXQkJRNjRRbUcxTThad3BaMmRFbDIzT0ExeG1Oam1qQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WUQKVlIwVEFRSC9CQVV3QXdFQi96QUtCZ2dxaGtqT1BRUURBd05vQURCbEFqQTJaNkVXQ056a2x3QkJIVTYrNFdNQgp6enVxUWhGa29KMlVPUUlSZVZ4N0hmcGt1ZTRXUXJPL2lzSUp4T3prc1UwQ01RRHBLbUZIakZKS1MwNFljUGJXClJOWnU5WU82YlZpOUpObFdTT3J2eEtKR2dZaHFPa2JScVp0TnlXSGEwVjFYYWhnPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049R2xvYmFsU2lnbiBPPUdsb2JhbFNpZ24gT1U9R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0CiMgU3ViamVjdDogQ049R2xvYmFsU2lnbiBPPUdsb2JhbFNpZ24gT1U9R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0CiMgTGFiZWw6ICJHbG9iYWxTaWduIEVDQyBSb290IENBIC0gUjQiCiMgU2VyaWFsOiAxNDM2NzE0ODI5NDkyMjk2NDQ4MDg1OTAyMjEyNTgwMDk3Nzg5NzQ3NAojIE1ENSBGaW5nZXJwcmludDogMjA6ZjA6Mjc6Njg6ZDE6N2U6YTA6OWQ6MGU6ZTY6MmE6Y2E6ZGY6NWM6ODk6OGUKIyBTSEExIEZpbmdlcnByaW50OiA2OTo2OTo1NjoyZTo0MDo4MDpmNDoyNDphMTplNzoxOTo5ZjoxNDpiYTpmMzplZTo1ODphYjo2YTpiYgojIFNIQTI1NiBGaW5nZXJwcmludDogYmU6Yzk6NDk6MTE6YzI6OTU6NTY6NzY6ZGI6NmM6MGE6NTU6MDk6ODY6ZDc6NmU6M2I6YTA6MDU6NjY6N2M6NDQ6MmM6OTc6NjI6YjQ6ZmI6Yjc6NzM6ZGU6MjI6OGMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUI0VENDQVllZ0F3SUJBZ0lSS2ppa0hKWUtCTjVDc2lpbEMrZzBtQUl3Q2dZSUtvWkl6ajBFQXdJd1VERWsKTUNJR0ExVUVDeE1iUjJ4dlltRnNVMmxuYmlCRlEwTWdVbTl2ZENCRFFTQXRJRkkwTVJNd0VRWURWUVFLRXdwSApiRzlpWVd4VGFXZHVNUk13RVFZRFZRUURFd3BIYkc5aVlXeFRhV2R1TUI0WERURXlNVEV4TXpBd01EQXdNRm9YCkRUTTRNREV4T1RBek1UUXdOMW93VURFa01DSUdBMVVFQ3hNYlIyeHZZbUZzVTJsbmJpQkZRME1nVW05dmRDQkQKUVNBdElGSTBNUk13RVFZRFZRUUtFd3BIYkc5aVlXeFRhV2R1TVJNd0VRWURWUVFERXdwSGJHOWlZV3hUYVdkdQpNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUV1TVo1MDQ5c0pRNmZMamtaSEFPa3JwcmxPUWNKCkZzcGpzYm1HK0lwWHdWZk9RdnB6b2ZkbFF2OGV3UUN5Ym5NTy84Y2g1UmlrcXRseFA2alV1YzZNSGFOQ01FQXcKRGdZRFZSMFBBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUVGRlN3ZTYxRgp1T0pBZi9zS2J2dStNOGs4bzRUVk1Bb0dDQ3FHU000OUJBTUNBMGdBTUVVQ0lRRGNrcUdnRTZiUEE3RG14Q0dYCmtQb1VWeTBEN080ODAyN0txR3gydktMZXV3SWdKNmlGSnpXYlZzYWo4a2ZTdDI0YkFnQVhxbWVtRlpIZStwVHMKZXd2NG40UT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUdsb2JhbFNpZ24gTz1HbG9iYWxTaWduIE9VPUdsb2JhbFNpZ24gRUNDIFJvb3QgQ0EgLSBSNQojIFN1YmplY3Q6IENOPUdsb2JhbFNpZ24gTz1HbG9iYWxTaWduIE9VPUdsb2JhbFNpZ24gRUNDIFJvb3QgQ0EgLSBSNQojIExhYmVsOiAiR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1IgojIFNlcmlhbDogMzI3ODU3OTIwOTk5OTA1MDcyMjY2ODA2OTgwMTE1NjA5NDc5MzEyNDQKIyBNRDUgRmluZ2VycHJpbnQ6IDlmOmFkOjNiOjFjOjAyOjFlOjhhOmJhOjE3Ojc0OjM4OjgxOjBjOmEyOmJjOjA4CiMgU0hBMSBGaW5nZXJwcmludDogMWY6MjQ6YzY6MzA6Y2Q6YTQ6MTg6ZWY6MjA6Njk6ZmY6YWQ6NGY6ZGQ6NWY6NDY6M2E6MWI6Njk6YWEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDE3OjlmOmJjOjE0OjhhOjNkOmQwOjBmOmQyOjRlOmExOjM0OjU4OmNjOjQzOmJmOmE3OmY1OjljOjgxOjgyOmQ3OjgzOmE1OjEzOmY2OmViOmVjOjEwOjBjOjg5OjI0Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDSGpDQ0FhU2dBd0lCQWdJUllGbEo0Q1l1dTFYNUNuZUtjZmxLMkd3d0NnWUlLb1pJemowRUF3TXdVREVrCk1DSUdBMVVFQ3hNYlIyeHZZbUZzVTJsbmJpQkZRME1nVW05dmRDQkRRU0F0SUZJMU1STXdFUVlEVlFRS0V3cEgKYkc5aVlXeFRhV2R1TVJNd0VRWURWUVFERXdwSGJHOWlZV3hUYVdkdU1CNFhEVEV5TVRFeE16QXdNREF3TUZvWApEVE00TURFeE9UQXpNVFF3TjFvd1VERWtNQ0lHQTFVRUN4TWJSMnh2WW1Gc1UybG5iaUJGUTBNZ1VtOXZkQ0JEClFTQXRJRkkxTVJNd0VRWURWUVFLRXdwSGJHOWlZV3hUYVdkdU1STXdFUVlEVlFRREV3cEhiRzlpWVd4VGFXZHUKTUhZd0VBWUhLb1pJemowQ0FRWUZLNEVFQUNJRFlnQUVSMFVPbHZ0OVhiL3BPZEVoK0o4THR0VjdIcEk2U0ZrYwo4R0l4TGNCNktQNGFwMXl6dHN5WDUwWFVXUHJSZDIxRG9zQ0haVFFLSDNyZDZ6d3pvY1dkVGFSdlFaVTRmOGtlCmhPdlJua21TaDVTSEREcUZTbWFmblZtVFRaZGhCb1pLbzBJd1FEQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WUQKVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVVQZVlwU0p2cUI4b2hSRW9tM203ZTBvUFFuMWt3Q2dZSQpLb1pJemowRUF3TURhQUF3WlFJeEFPVnBFc2x1MjhZeHVnbEI0WmY0Ky8yYTRuMFN5ZTE4Wk5QTEJTV0xWdG1nCjUxNWRUZ3VEbkZ0MkthQUpKaUZxWWdJd2NkSzFqMXpxTytGNENZV29kWkk3eUZ6OVNPOE5kQ0tvQ09KdXhVbk8KeHd5OHAyRnA4ZmM3NFNyTCtTdnpacEEzCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1TdGFhdCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEczIE89U3RhYXQgZGVyIE5lZGVybGFuZGVuCiMgU3ViamVjdDogQ049U3RhYXQgZGVyIE5lZGVybGFuZGVuIFJvb3QgQ0EgLSBHMyBPPVN0YWF0IGRlciBOZWRlcmxhbmRlbgojIExhYmVsOiAiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJvb3QgQ0EgLSBHMyIKIyBTZXJpYWw6IDEwMDAzMDAxCiMgTUQ1IEZpbmdlcnByaW50OiAwYjo0Njo2NzowNzpkYjoxMDoyZjoxOTo4YzozNTo1MDo2MDpkMTowYjpmNDozNwojIFNIQTEgRmluZ2VycHJpbnQ6IGQ4OmViOjZiOjQxOjUxOjkyOjU5OmUwOmYzOmU3Ojg1OjAwOmMwOjNkOmI2Ojg4Ojk3OmM5OmVlOmZjCiMgU0hBMjU2IEZpbmdlcnByaW50OiAzYzo0ZjpiMDpiOTo1YTpiODpiMzowMDozMjpmNDozMjpiODo2Zjo1Mzo1ZjplMTo3MjpjMTo4NTpkMDpmZDozOTo4Njo1ODozNzpjZjozNjoxODo3ZjphNjpmNDoyOAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmREQ0NBMXlnQXdJQkFnSUVBSmlpT1RBTkJna3Foa2lHOXcwQkFRc0ZBREJhTVFzd0NRWURWUVFHRXdKTwpUREVlTUJ3R0ExVUVDZ3dWVTNSaFlYUWdaR1Z5SUU1bFpHVnliR0Z1WkdWdU1Tc3dLUVlEVlFRRERDSlRkR0ZoCmRDQmtaWElnVG1Wa1pYSnNZVzVrWlc0Z1VtOXZkQ0JEUVNBdElFY3pNQjRYRFRFek1URXhOREV4TWpnME1sb1gKRFRJNE1URXhNekl6TURBd01Gb3dXakVMTUFrR0ExVUVCaE1DVGt3eEhqQWNCZ05WQkFvTUZWTjBZV0YwSUdSbApjaUJPWldSbGNteGhibVJsYmpFck1Da0dBMVVFQXd3aVUzUmhZWFFnWkdWeUlFNWxaR1Z5YkdGdVpHVnVJRkp2CmIzUWdRMEVnTFNCSE16Q0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQUw0eW9sUVAKY1Bzc1hGbnJiTVNrVWVpRktyUE1TalR5c0YvekRzY2NQVk1laUFobzJHODlyY0tleklKbkJ5ZUhhSEU2bjNXVwpJa1lGc08ydHgxdWVLdDZjL0RyR2xhZjFGMmNZNXk5SkNBeGN6K2JNTk8xNCsxQ3gzR3N5OEtMK3Rqems3RnFYCnh6OGVjQWd3b056RnMyMXYwSUp5RWF2U2dXaFpnaGUzZUpKZytzemVQNFRyalRnemtBcHlJL28xekNaeE1kRnkKS0pMWld5TnRaclZ0QjBMcnBqUE9rdHZBOW14amVNM0tUajIxNVZLYjhiNDc1bFJnc0dZZUNhc0gvbFNKRVVMUgo5eVM2WUhnYW1QZkpFZjBXd1RVYVZIWHZROVBscms3TzUzdkR4azVoVVV1cm1rVkxvUjlCdlVoVEZYRmtDNGF6CjVTNit6cVFid1NtRW9yWExDQ04yUXlJa0h4Y0UxRzZjeHZ4L0syWWE3SXJsMXM5TjlXTUp0eFU1MW51czYrTjgKNlU3OGRVTEk3VmlWREFaQ29wejM1SEN6MzNKdldqZEFpZGlGcE5meEM5NURHZFJLV0N5TWlqbWV2NFNIOFJZNwpOZ3pwMDdUS2JCbEJVZ21oSGJCcXY0THZjRkVoTXR3RmRvekw5MlRrQTFDdmpKRm5xOFh5N2xqWTNyNzM1ekhQCmJNazdjY0hWaUxWbHZNRG9GeGNIRXJWYzBxc2drN1RtZ29Od05zWE5vNDJ0aSt5andVT0g1a1BpTkw2Vml6WHQKQnpuYXFCMTZuemFlRXJBTVpSS1FGV0RaSmtCRTQxWmdwUkRVYWp6OVFkd09Xa2UyNzVkaGRVL1ovc2V5SGRUdApYVW16cVdyTFpvUVQxVnlnM045dWR3YlJjWFhJVjIrdkQzZGJBZ01CQUFHalFqQkFNQThHQTFVZEV3RUIvd1FGCk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnRUdNQjBHQTFVZERnUVdCQlJVcmZySGtsZXV5aldjTGhMNzVMcGQKSU55VVZ6QU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUFNSm1kQlRMSVhnNDdtQUU2aXFUbkIvZDYrT2VhMzFCRApVNWNxUGNvOFI1Z3U0UlY3OFpMellkcVFKUlpsd0o5VVhRNERPMXQzQXB5RXRnMllYelRkTzJQQ3d5aUJ3cHdwCkxpbml5TU1COGpQcUtxck1DUWozWldmR3pkL1R0aXVudmN6UkRuQmZ1Q1BSeTVGT0N2VElldVhaWXpiQjFOLzgKSXBmM1lGM3FLUzlZc3IxWXZZMldUeEIxdjBoN1BWR0hvVHgwSXNMOEIzK0EzTVNzL21yQmNEQ3c2WTVwNGl4cApnWlFKdXQzK1RjQ0RqSlJZd0VZZ3I1d2ZBdmcxVlVrdlJ0VEE4S0NXQWc4enhYSHpuaU45bExmOU90TUpnd1loCi9XQTlyakxBMHU2TnB2RG50SUo4Q3N4d3lYbUErUDVNOXpXRUdZb3grd3JaMTMrYjhLS2FhOE1GU3UxQllCUXcKMGFvUlFtN1RJd0lFQzhabDNkMVNkOXFCYTdLbytnRTR1WmJxS214bmw0bVVucnpoVk5Ya2FuanZTcjBybWoxQQpmc2JBZGRKdSsyZ3c3T3lMbmZsSk5ab2FMTm16bFRuVkhwTDNwcmxsTCtVOWJUcElUQWpjNUNnU0tMNTlOVnpxCjRCWitFeHRxMXo3WG52d3RkYkxCRk5VakE5dGJid3MrZUM4TjNqT05GcmRJNTRPYWdROTd3VU5OVlFRWE9FcFIKMVZtaWlYVFRuNzRlUzlmR2JiZUlKRzlna2FTQ2hWdFdRYnpRUkt0cUU3N1JMRmkzRWpOWXNqZGozQlAxbEIwLwpRRkgxVC9VNjdjakY2OEllSFJhVmVzZCtRbkdUYmtzVnR6RGZxdTFYaFVpc0hXcmRPV25rNFhsNHZzNEZ2NkVNCjk0QjdJV2NuTUZrPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U3RhYXQgZGVyIE5lZGVybGFuZGVuIEVWIFJvb3QgQ0EgTz1TdGFhdCBkZXIgTmVkZXJsYW5kZW4KIyBTdWJqZWN0OiBDTj1TdGFhdCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQSBPPVN0YWF0IGRlciBOZWRlcmxhbmRlbgojIExhYmVsOiAiU3RhYXQgZGVyIE5lZGVybGFuZGVuIEVWIFJvb3QgQ0EiCiMgU2VyaWFsOiAxMDAwMDAxMwojIE1ENSBGaW5nZXJwcmludDogZmM6MDY6YWY6N2I6ZTg6MWE6ZjE6OWE6YjQ6ZTg6ZDI6NzA6MWY6YzA6ZjU6YmEKIyBTSEExIEZpbmdlcnByaW50OiA3NjplMjo3ZTpjMTo0ZjpkYjo4MjpjMTpjMDphNjo3NTpiNTowNTpiZTozZDoyOTpiNDplZDpkYjpiYgojIFNIQTI1NiBGaW5nZXJwcmludDogNGQ6MjQ6OTE6NDE6NGM6ZmU6OTU6Njc6NDY6ZWM6NGM6ZWY6YTY6Y2Y6NmY6NzI6ZTI6OGE6MTM6Mjk6NDM6MmY6OWQ6OGE6OTA6N2E6YzQ6Y2I6NWQ6YWQ6YzE6NWEKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZjRENDQTFpZ0F3SUJBZ0lFQUppV2pUQU5CZ2txaGtpRzl3MEJBUXNGQURCWU1Rc3dDUVlEVlFRR0V3Sk8KVERFZU1Cd0dBMVVFQ2d3VlUzUmhZWFFnWkdWeUlFNWxaR1Z5YkdGdVpHVnVNU2t3SndZRFZRUUREQ0JUZEdGaApkQ0JrWlhJZ1RtVmtaWEpzWVc1a1pXNGdSVllnVW05dmRDQkRRVEFlRncweE1ERXlNRGd4TVRFNU1qbGFGdzB5Ck1qRXlNRGd4TVRFd01qaGFNRmd4Q3pBSkJnTlZCQVlUQWs1TU1SNHdIQVlEVlFRS0RCVlRkR0ZoZENCa1pYSWcKVG1Wa1pYSnNZVzVrWlc0eEtUQW5CZ05WQkFNTUlGTjBZV0YwSUdSbGNpQk9aV1JsY214aGJtUmxiaUJGVmlCUwpiMjkwSUVOQk1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBNDhkK2lma2tTenJTCk00TTFMR25zM0FtazQxR29KU3Q1dUFnOTRKRzZoSVhHaGFUSzVza3VVNlRKSkI3OVZXWnhYU3pGWUdnRXQ5bkMKVWlZNGlLVFdPMENtd3MwL3paaVRzMVFVV0paVjFWRCtocTJrWTM5Y2gvYU81aWVTWnhlU0FnTXMzTlptZE8zZApaLy9CWVkxalR3K2JiUmN3SnUrcjBoOFFvUG5GZnhacGdRTkg3UjVvalhLaFRiSW14cnBzWDIzV3I5R3hFNDZwCnJmTmVhWFVtR0Q1Qkt5Ri83b3RkQndhZFE4UXBDaXY4S2o2R3l6eURPdm5KRGRyRm1lSzhlRUV6ZHVHL0wxM2wKcEpoUURCWGQ0UHFjZnpobzBMS21lcWZSTWIxK2lsZ25RN082TTVIVHA1Z1ZYSnJtMHc5MTJmeEJtSmMrcWlYYgpqNUl1c0hzTVgvRmpxVGY1bTNWcFRDZ21KZHJWOGhKd1JWWGozM05lTi9VaGJKQ09OVnJKMHlQcjA4QytlS3hDCktGaG1wVVp0Y0FMWEVQbExWUHhkaGtxSHozL0tSYXdSV3JVZ1VZMHZpRWVYT2NEUHVzQkNBVUNaU0NFTGE2ZlMKL1piVjBiNUduVW5nQzZhZ0lrNDQwTUU4TUx4d2p5eDF6TkRGakZFN1BaUUlaQ1poZmJuRFpZOFVuQ0hRcXYwWApjZ09Qdlp1TTVsNVRucm1kNzRLNzRiemlja0ZiSVpUVFJUZVUwZDhKT1Yzbkk2cWFIY3B0cUFxR2hZcUN2a0lICjF2STRnblBhaDF2bFBOT2VQcWM3bnZRRHMvbnhmUk4wQXYrN29lWDZBSGtjcG1aQmlGeGdWNll1Q2NTNi9aclAKcHg5QXc3dk1XZ3BWU3pzNGRsRzRZNHVFbEJibVZ2TUNBd0VBQWFOQ01FQXdEd1lEVlIwVEFRSC9CQVV3QXdFQgovekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUVGUDZyQUpDWW5pVDhxY3dhaXZzbnVMOHdicWc3Ck1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQ0FRRFBkeXh1VnI1T3M3YUVBSlNyUjhrTjBuYkhocDhkQjlPMnRMc0kKZUs5cDBndEozalBGckszQ2lBSjlCcmMxQXNGZ3liL0U2SlRlMU5PcEV5VmEvbTZpcm4wRjNIM3piUEIrcG8zdQoyZGZPV0Jmb3FTbXVjMGlINTV2S2JpbWhaRjhaRS9ldUJoRC9VY2FiVFZVbFQ1T1pFQUZUZGZFVHpzZW1RVUhTCnY0aWxmMFg4ckxpbHRUTU1nc1Q3Qi9acTVTV0VYd2JLd1lZNUVkdFl6WGM3TE1KTUQxNmE0L0NyUG1FYlVDVEMKd1BUeEdmQVJLYmFsR0FLYjEyTk1jSXhIb3dORFhMbGRScUFOYi85WmpyN2RuM0xEV3l2ZmpGdk81UXhHYkpLeQpDcU5NVkVJWUZSSVl2ZHI4dW5SdS84RzJvR1RZcVY5VnJwOWNhbmFXMkhObmgvdE5mMXp1YWNwekVQdUtxZjJlCnZUWTRTVW1IOUE0VThPbUh1RCtuVDNwYWpublVrK1M3YUZLRXJHenA4NWh3VlhJeStUU3JLMG0xelNCaTVEcDYKWjJPcmx0eHRycGZzL0o5MlZvZ3VaczlidHNta3NOY0Z1dUVuTDVPN0ppcWlrN0FiODQ2K0hVQ2p1VGFQUG9JYQpHbDZJNmxENFdlS0RSaWtMNDBSYzRaVzJhWkNhRkcrWHJvSFBhTytabXI2MTUrRi8rUG9UUnhaTXpHMElRT2VMCmVHOVFna1JRUDJZR2lxdERoRlpLRHlBdGhnNzEwdHZTZW9wTHphWG9UdkZlSmlVQldTT2dmdEwyZmlGWDF5ZTgKRlZkTXBFYkI0SU1lREV4TkgwOEdHZUw1cVBRNmdxR3llVU41MXExdmVpZVFBNlRxSkljLzJiM1o2ZkpmVUVrYwo3dXpYTGc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049SWRlblRydXN0IENvbW1lcmNpYWwgUm9vdCBDQSAxIE89SWRlblRydXN0CiMgU3ViamVjdDogQ049SWRlblRydXN0IENvbW1lcmNpYWwgUm9vdCBDQSAxIE89SWRlblRydXN0CiMgTGFiZWw6ICJJZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEiCiMgU2VyaWFsOiAxMzI5ODgyMTAzNDk0NjM0MjM5MDUyMDAwMzg3Nzc5NjgzOTQyNgojIE1ENSBGaW5nZXJwcmludDogYjM6M2U6Nzc6NzM6NzU6ZWU6YTA6ZDM6ZTM6N2U6NDk6NjM6NDk6NTk6YmI6YzcKIyBTSEExIEZpbmdlcnByaW50OiBkZjo3MTo3ZTphYTo0YTpkOTo0ZTpjOTo1NTo4NDo5OTo2MDoyZDo0ODpkZTo1ZjpiYzpmMDozYToyNQojIFNIQTI1NiBGaW5nZXJwcmludDogNWQ6NTY6NDk6OWI6ZTQ6ZDI6ZTA6OGI6Y2Y6Y2E6ZDA6OGE6M2U6Mzg6NzI6M2Q6NTA6NTA6M2I6ZGU6NzA6Njk6NDg6ZTQ6MmY6NTU6NjA6MzA6MTk6ZTU6Mjg6YWUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZZRENDQTBpZ0F3SUJBZ0lRQ2dGQ2dBQUFBVVVqeUVTMUFBQUFBakFOQmdrcWhraUc5dzBCQVFzRkFEQksKTVFzd0NRWURWUVFHRXdKVlV6RVNNQkFHQTFVRUNoTUpTV1JsYmxSeWRYTjBNU2N3SlFZRFZRUURFeDVKWkdWdQpWSEoxYzNRZ1EyOXRiV1Z5WTJsaGJDQlNiMjkwSUVOQklERXdIaGNOTVRRd01URTJNVGd4TWpJeldoY05NelF3Ck1URTJNVGd4TWpJeldqQktNUXN3Q1FZRFZRUUdFd0pWVXpFU01CQUdBMVVFQ2hNSlNXUmxibFJ5ZFhOME1TY3cKSlFZRFZRUURFeDVKWkdWdVZISjFjM1FnUTI5dGJXVnlZMmxoYkNCU2IyOTBJRU5CSURFd2dnSWlNQTBHQ1NxRwpTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDblVCbmVQNWs5MURORzhXOVJZWUt5cVUrUFo0bGRoTmxUCjNRd28yZGZ3LzY2VlEzS1orYlZkZklyQlF1RXhVSFRSZ1ExOHpac2hxMFBpcksxZWhtN3pDWW9mV2pLOW91dVUKK2VoY0N1ei9tTkt2Y2JPMFU1OU9oKytTdkwzc1R6SXdpRXNYWGxmRVU4TDJBcGVOMldJcnZ5UWZZbzNmdzdncApTMGw0UEpOZ2lDTDhtZG8yeU1LaTFDeFVBR2MxYm5PL0FsandwTjNsc0tJbWVzcmdOcVVaRnZYOXQrK3VQMEQxCmJWb0UvYzQweWlUY2RDTWJYVE1URWwzRUFTWDJNTjBDWFovZzFVZTl0T3Nib2J0SlNkaWZXd0x6aXVRa2tPUmkKVDAvQnI0c09kQmVvMFhLSWFub0JTY3kwUm5uR0Y3SGFtQjRIV2ZwMUlZVmwzWkJXenZ1cnBXQ2R4SjM1VXJDTAp2WWY1anlzakNpTjJPL2N6NGNrQTgybjVTNkxnVHJ4K2t6bUVCL2RFY0g3K0IxcmxzYXpSR016eU5lVkpTUWpLClZzazkrdzhZZllzN3dSUENUWS9KVHc0MzZSK2hEbXJmWWk3TE5RWlJlU3pJSlRqMCtrdW5pVnljMHVNTk9ZWksKZEh6VldZZkNQMDRNWEZMMFBmZFNndkhxbzZ6OVNUUWFLUE5CaURvVDd1amUvNWtkWDdyTDZCN3l1VkJnd0RIVApjK1h2dnFEdE13dDB2aUFneEdkczhBZ0RlbFdBZjBaT2xxZjBIajdoOXRnSjRUTmtLMlBYTWw2ZitjQjdEM2h2Cmw3eVRtdm1jRXBCNGVvQ0hGZGR5ZEp4VmRIaXh1dUZ1Y0FTNlQ2QzZhTU43L3pId2N6MDlsQ3F4QzBFT29QNU4KaUdWcmVUTzAxd0lEQVFBQm8wSXdRREFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQgovekFkQmdOVkhRNEVGZ1FVN1VRWndOUHdCb3Z1cEh1K1F1Y21WTWlPTm5Zd0RRWUpLb1pJaHZjTkFRRUxCUUFECmdnSUJBQTJ1a0RMMnBrdDhSSFlaWVI0bktNMWVWTzhsdk9NSWtQa3AxNjVvQ09HVUFGanZMaTUrVTFLTXRsd0gKNm9pNm1ZdFFsTmVDZ045aENRQ1RyUTBVNXM3QjhqZVVlTEJmbkxPaWM3aVBCWk00elkwK3NMajd3TSt4OHV3dApMUnZNN0txYXM2cGdnaHN0TzhPRVBWZUtsaDZjZGJqVE1NMWdDSU9RMDQ1VThVMW13RjEwQTBDajdvVit3aDkzCm5BYm93YWNZWFZLVjdjbmRKWjV0K3FudG96bzAwRmw3MnUxUTh6Vy83ZXNVVFRISFlQVGE4WWVjNGtqaXhzVTMKK3dZUStuVlpaakZIS2RwMm1oenBncTd2bXJsUjk0Z2ptbW1WWWp6bFZZQTIxMVFDLy9HNVhjN1VJMi9ZUllSSwpXMlh2aVF6ZEZLY2d5eGlsSmJRTitRSHdvdEwwQU1oMGpxRXFTSTVsMnhQRTRpVVhmZXUraDFzWElGUlJrMHBUCkF3dnNYY296N1dMOVJjY3ZXOXhZb0lBNTV2clgvaE1VcHUwOWxFcENkTlREZDFsenpZOUd2bFU0Ny9yb2tUTHEKbDFnRUl0NDR3OHk4YmNrek9tb0thVCtneU9weWo0eGpoaU85YlR5V25wWGdTVXlxb3JrcUc1dzJnWGp0dytoRwo0aVpaUkhVZTJYV0pVYzBRaEoxaFlNdGQrWmNpVFk2WTV1Ti85bHU3cnMzS1NvRnJYZ3Z6VWVGMEsrbCtKNmZaCm1VbE8rS1dBMnlVUEhHTmlpc2t6WjJzOEVJUEdyZDZvelJhT2pmQUhOM0dmOHF2OFFmWEJpK3dBTjEwSjVVNkEKNy9xeFhEZ0dwUnRLNGR3NExUemNxeCtRR3RWS25PN1JjR3pNN3ZSWCtCaTZoRzZICi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1JZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEgTz1JZGVuVHJ1c3QKIyBTdWJqZWN0OiBDTj1JZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEgTz1JZGVuVHJ1c3QKIyBMYWJlbDogIklkZW5UcnVzdCBQdWJsaWMgU2VjdG9yIFJvb3QgQ0EgMSIKIyBTZXJpYWw6IDEzMjk4ODIxMDM0OTQ2MzQyMzkwNTIxOTc2MTU2ODQzOTMzNjk4CiMgTUQ1IEZpbmdlcnByaW50OiAzNzowNjphNTpiMDpmYzo4OTo5ZDpiYTpmNDo2Yjo4YzoxYTo2NDpjZDpkNTpiYQojIFNIQTEgRmluZ2VycHJpbnQ6IGJhOjI5OjQxOjYwOjc3Ojk4OjNmOmY0OmYzOmVmOmYyOjMxOjA1OjNiOjJlOmVhOjZkOjRkOjQ1OmZkCiMgU0hBMjU2IEZpbmdlcnByaW50OiAzMDpkMDo4OTo1YTo5YTo0NDo4YToyNjoyMDo5MTo2Mzo1NToyMjpkMTpmNToyMDoxMDpiNTo4Njo3YTpjYTplMToyYzo3ODplZjo5NTo4ZjpkNDpmNDozODo5ZjoyZgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRlpqQ0NBMDZnQXdJQkFnSVFDZ0ZDZ0FBQUFVVWp6MFo4QUFBQUFqQU5CZ2txaGtpRzl3MEJBUXNGQURCTgpNUXN3Q1FZRFZRUUdFd0pWVXpFU01CQUdBMVVFQ2hNSlNXUmxibFJ5ZFhOME1Tb3dLQVlEVlFRREV5RkpaR1Z1ClZISjFjM1FnVUhWaWJHbGpJRk5sWTNSdmNpQlNiMjkwSUVOQklERXdIaGNOTVRRd01URTJNVGMxTXpNeVdoY04KTXpRd01URTJNVGMxTXpNeVdqQk5NUXN3Q1FZRFZRUUdFd0pWVXpFU01CQUdBMVVFQ2hNSlNXUmxibFJ5ZFhOMApNU293S0FZRFZRUURFeUZKWkdWdVZISjFjM1FnVUhWaWJHbGpJRk5sWTNSdmNpQlNiMjkwSUVOQklERXdnZ0lpCk1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQzJJcFQ4cEVpdjZFZHJDdnNuZHVUeVA0bzcKZWtvc01TcU1qYkNwd3pGcnFIZDJoQ2EycklGQ0RRanJWVmk3ZXZpOFpYM3lvRzJMcUVmcFluWWVFZTRJRk5HeQpSQmIwNnRENkhpOWUyOHR6UWE2OEFMQktLMEN5ck9FN1M4SXRuZVNobSt3YU9oN3dDTFBRNUNRMUI1K2N0TWxTCmJkc0h5bysxVy9DRDgwL0hMYVhJcmN1VklLUXhLRmRZV3VTTkc1cXJuZzBNOGdvek9TSTVDcGN1ODFOM3VVUkYKL1lUTE5pQ0JXUzJhYjIxSVNHSEtUTjlUMGE5U3ZFU2ZxeTlyZzNMdmRZRGFCak1iWGNqYVk4Wk56YXhtTWMzUgozajZIRURiaHVhUjY3MkJRc3N2S3BsYmdONityTkJNNUplZzVadVNZZXFvU21KeFpab1krcmZHd3lqNEdEM3Z3CkVVczNvRVJ0ZTh1b2pISDAxYldSTnN6d0ZjWXIzbEVYc1pkTVVEMnhsVmw4QlgwdElkVUF2d0Zub2w1N3BsenkKOXlMeGtBMlQyNnBFVVdiTWZYWUQ2MnFvS2pnWmwzWU5hNHBoK2J6MjduYjljQ3ZkS1R6NENoNWJRaHlMVmk5VgpHeHloTHJYSEZ1YjRxanlTam1tMkFjRzFocDJKRHdzNGxGVG82dHllUFNXOFV5YnQxYXM1cXNWQVRGU3JzclRaCjJmalhjdHNjdkcyOVpWL3ZpRFVxWmkvdTlyTmw4RE9OZkpoQmFVWVBReHhwK3B1MTBHRnF6Y3BMMlV5UVJxc1YKV2FGSFZDa3VneWhmSE1LaXEzSVhBQWFPUmV5TDRqTTlmOW9aUk9SaWNzUGZJc2J5VnRUZFg1Vnk3VzFmOTBnRApXLzNGS3FEMmN5T0VFQnNCNXdJREFRQUJvMEl3UURBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvCkJBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVTQzSGdudGluUXRuYmNaRnJsSlBydzZQUkZLTXdEUVlKS29aSWh2Y04KQVFFTEJRQURnZ0lCQUVmNjNRcXdFWkU0clUxZDkrVU9sMVFaZ2tpSFZJeXFaSm5ZV3Y2SUFjVllwWm14STFRagp0Mm9kSUZmbEFXSkJGOU1KMjNYTGJsU1FkZjRhbjRFS3d0M1g5d25RVzNJVjVCNEphajB6OHlHYTVoVityVkhWCkRSRHRmVUxBais3QW1nalZRZFpjRGlGcGJvQmhEaFhBdU0vRlNSSlN6TDQ2ek5RdU9BWGVOZjBmYjdpQWFKZzkKVGFES1FHWFNjM3oxaTlrS2xUL1lQeU50R3RFcUpCblpoYk1YNzNodXFWalJJOVBIRSsxeUpYOWRzWE53MEg4Rwpsd21FS1lCaEhmcGUvM09zb09PSnVCeHhGY2JlTVg4UzNPRnRtNi9uNko5MWVFeXJSanVhenI4RkdGMU5GVHdXCm1obFFCSnF5bW05bGkxSmZQRmdFS0NYQVptRXhmcm5nZGJrYXFJSFdjaGV6eFFNeE5SRjRlS0xnNlRDTWY0RGYKV044OHVpZVc0b0EwYmVPWTAyUW5yRWgrS0hkY3hpVmhKZmlGREdYNnhESXZwWmdGNVBnTFp4WVd4b0s0TWhuNQorYmw1M0IvTjY2K3JEdDBiMjBYa2V1Y0M0cFZkL0dud1UybGhsWFY1QzE1VjVqZ2NsS2xaTTU3SWNYUjVmMUdKCnRzaHF1RERJYWpqRGJwN2hOeGJxQldKTVd4Skg3YWUwczFoV3gwbnpmeEpvQ1RGeDhHMzRUa2Y3MW9YdXhWaEEKR2FRZHAvbExRemZjYUZwUHordkNaSFRldEJYWjlGUlVHaThjMTVkeFZKQ08yU0NkVXl0L3E0L2k2akM4VURmdgo4VWUxZlh3c0JPeG9uYlJKUkJEMGNrc2NaT2Y4NW11UTNXbDlhZjBBVnFXM3JMYXR0OG8rQWUrYwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIgTz1FbnRydXN0LCBJbmMuIE9VPVNlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMvKGMpIDIwMDkgRW50cnVzdCwgSW5jLiAtIGZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgU3ViamVjdDogQ049RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIgTz1FbnRydXN0LCBJbmMuIE9VPVNlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMvKGMpIDIwMDkgRW50cnVzdCwgSW5jLiAtIGZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgTGFiZWw6ICJFbnRydXN0IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMiIKIyBTZXJpYWw6IDEyNDY5ODkzNTIKIyBNRDUgRmluZ2VycHJpbnQ6IDRiOmUyOmM5OjkxOjk2OjY1OjBjOmY0OjBlOjVhOjkzOjkyOmEwOjBhOmZlOmIyCiMgU0hBMSBGaW5nZXJwcmludDogOGM6ZjQ6Mjc6ZmQ6Nzk6MGM6M2E6ZDE6NjY6MDY6OGQ6ZTg6MWU6NTc6ZWY6YmI6OTM6MjI6NzI6ZDQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDQzOmRmOjU3Ojc0OmIwOjNlOjdmOmVmOjVmOmU0OjBkOjkzOjFhOjdiOmVkOmYxOmJiOjJlOjZiOjQyOjczOjhjOjRlOjZkOjM4OjQxOjEwOjNkOjNhOmE3OmYzOjM5Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFUGpDQ0F5YWdBd0lCQWdJRVNsT01LREFOQmdrcWhraUc5dzBCQVFzRkFEQ0J2akVMTUFrR0ExVUVCaE1DClZWTXhGakFVQmdOVkJBb1REVVZ1ZEhKMWMzUXNJRWx1WXk0eEtEQW1CZ05WQkFzVEgxTmxaU0IzZDNjdVpXNTAKY25WemRDNXVaWFF2YkdWbllXd3RkR1Z5YlhNeE9UQTNCZ05WQkFzVE1DaGpLU0F5TURBNUlFVnVkSEoxYzNRcwpJRWx1WXk0Z0xTQm1iM0lnWVhWMGFHOXlhWHBsWkNCMWMyVWdiMjVzZVRFeU1EQUdBMVVFQXhNcFJXNTBjblZ6CmRDQlNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVJQzBnUnpJd0hoY05NRGt3TnpBM01UY3kKTlRVMFdoY05NekF4TWpBM01UYzFOVFUwV2pDQnZqRUxNQWtHQTFVRUJoTUNWVk14RmpBVUJnTlZCQW9URFVWdQpkSEoxYzNRc0lFbHVZeTR4S0RBbUJnTlZCQXNUSDFObFpTQjNkM2N1Wlc1MGNuVnpkQzV1WlhRdmJHVm5ZV3d0CmRHVnliWE14T1RBM0JnTlZCQXNUTUNoaktTQXlNREE1SUVWdWRISjFjM1FzSUVsdVl5NGdMU0JtYjNJZ1lYVjAKYUc5eWFYcGxaQ0IxYzJVZ2IyNXNlVEV5TURBR0ExVUVBeE1wUlc1MGNuVnpkQ0JTYjI5MElFTmxjblJwWm1sagpZWFJwYjI0Z1FYVjBhRzl5YVhSNUlDMGdSekl3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLCkFvSUJBUUM2aExaeTI1NE1hK0taNlRBQnAzYnFNcmlWUVJySjJtRk9XSExQL3ZhQ2ViOXpZUVlLcFNmWXMxL1QKUlU0Y2N0Wk9Ndkp5aWcvM2d4blFhb0NBQUVVZXNNZm5tcjhTVnljY28yZ3ZDb2U5YW1zT1htWHpISGZWMUlXTgpjQ0cwc3pMbmk2TFZoamtDc2JqU1I4N2t5VW5FTzZmZSsxUjlWNzd3Nkc3Q2ViSTZDMVhpVUpnV01oTmNMM2hXCndjS1VzL0phNUNlYW55VFh4dXpRbXlXQzQ4ekN4RVhGakpkNkJtc3FFWitwQ201SU8yL2IxQkVaUXZlUEI3LzEKVTErY1B2UVhMT1pwckU0eVRHSjM2cmZvNWJzMHZCbUxycHhSNTdkK3RWT3hNeUxsYmM5d1BCcjY0cHRudG9QMApqYVd2WWt4TjRGaXNaRFFTQS9pMmpaUmpKS1J4QWdNQkFBR2pRakJBTUE0R0ExVWREd0VCL3dRRUF3SUJCakFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJScWNpWjYwQjd2ZmVjN2FWSFViSTJma0JKbXF6QU4KQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBZVo4ZGxzYTJlVDhpallmVGh3TUVZR3BybWk1WmlYTVJyRVBSOVJQLwpqVGtyd1BLOVQzQ01xUy9xRjhRTFZKN1VHNWFZTXp5b3JXS2lBSGFyV1dsdUJoMSt4TGxFalppdkV0Umgyd29aClJrZno2L2Rqd1VBRlFLWFN0L1MxbWphL3FZaDJpQVJWQkN1Y2gzOGFOengrTGFVYTJOU0pYc3E5ckQxczJHMnYKMWZOMkQ4MDdpRGdpbld5VG1zUTl2NEliWlQrbUQxMnEvT1d5RmNxMXJjYThQZENFNk9vR2NyQk5PVEo0dno0UgpuQXVrblpvaDgvQ2JDekI0MjhIY2gwUCt2R09heXNYQ0hNbkhqZjg3RWxnSTVyWTk3SG9zVHZ1RGxzNE1QR21IClZIT2tjOEtULzFFUXJCVlVBZGo4QmJHSm9YOTBnNXBKMTl4T2U0cEliNHRGOWc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxIE89RW50cnVzdCwgSW5jLiBPVT1TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2FsLXRlcm1zLyhjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIFN1YmplY3Q6IENOPUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMSBPPUVudHJ1c3QsIEluYy4gT1U9U2VlIHd3dy5lbnRydXN0Lm5ldC9sZWdhbC10ZXJtcy8oYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBMYWJlbDogIkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMSIKIyBTZXJpYWw6IDUxNTQzMTI0NDgxOTMwNjQ5MTE0MTE2MTMzMzY5CiMgTUQ1IEZpbmdlcnByaW50OiBiNjo3ZToxZDpmMDo1ODpjNTo0OTo2YzoyNDozYjozZDplZDo5ODoxODplZDpiYwojIFNIQTEgRmluZ2VycHJpbnQ6IDIwOmQ4OjA2OjQwOmRmOjliOjI1OmY1OjEyOjI1OjNhOjExOmVhOmY3OjU5OjhhOmViOjE0OmI1OjQ3CiMgU0hBMjU2IEZpbmdlcnByaW50OiAwMjplZDowZTpiMjo4YzoxNDpkYTo0NToxNjo1Yzo1Njo2Nzo5MTo3MDowZDo2NDo1MTpkNzpmYjo1NjpmMDpiMjphYjoxZDozYjo4ZTpiMDo3MDplNTo2ZTpkZjpmNQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQytUQ0NBb0NnQXdJQkFnSU5BS2FMZVNrQUFBQUFVTkNSK1RBS0JnZ3Foa2pPUFFRREF6Q0J2ekVMTUFrRwpBMVVFQmhNQ1ZWTXhGakFVQmdOVkJBb1REVVZ1ZEhKMWMzUXNJRWx1WXk0eEtEQW1CZ05WQkFzVEgxTmxaU0IzCmQzY3VaVzUwY25WemRDNXVaWFF2YkdWbllXd3RkR1Z5YlhNeE9UQTNCZ05WQkFzVE1DaGpLU0F5TURFeUlFVnUKZEhKMWMzUXNJRWx1WXk0Z0xTQm1iM0lnWVhWMGFHOXlhWHBsWkNCMWMyVWdiMjVzZVRFek1ERUdBMVVFQXhNcQpSVzUwY25WemRDQlNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVJQzBnUlVNeE1CNFhEVEV5Ck1USXhPREUxTWpVek5sb1hEVE0zTVRJeE9ERTFOVFV6Tmxvd2diOHhDekFKQmdOVkJBWVRBbFZUTVJZd0ZBWUQKVlFRS0V3MUZiblJ5ZFhOMExDQkpibU11TVNnd0pnWURWUVFMRXg5VFpXVWdkM2QzTG1WdWRISjFjM1F1Ym1WMApMMnhsWjJGc0xYUmxjbTF6TVRrd053WURWUVFMRXpBb1l5a2dNakF4TWlCRmJuUnlkWE4wTENCSmJtTXVJQzBnClptOXlJR0YxZEdodmNtbDZaV1FnZFhObElHOXViSGt4TXpBeEJnTlZCQU1US2tWdWRISjFjM1FnVW05dmRDQkQKWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVTQXRJRVZETVRCMk1CQUdCeXFHU000OUFnRUdCU3VCQkFBaQpBMklBQklRVHlkQzZiVUY3NG16UTYxVmZaZ0lhSlBSYmlXbEg0N2pDZmZIeUFzV2ZvUFpiMVlzR0dZWlBVeEJ0CkJ5UW5vYUQ0MVVjWllVeDl5cE1uNm5RTTcyK1dDZjVqN0hCZE5xMW5kNjdKblh4VlJEcWlZMUVmOWVOaTFLbEgKQno3TUlLTkNNRUF3RGdZRFZSMFBBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwTwpCQllFRkxkajV4cmRqZWtJcGxXRHBPQnFVRUZsRVVKSk1Bb0dDQ3FHU000OUJBTURBMmNBTUdRQ01HRjUyT1ZDClI5OGNybE9aRjdadkhIM2h2eEdVMFFPSWRlU05pYVNLZDBiZWJXSHZBdlg3dGQvTS9rNy8vcW5tcHdJd1c1blgKaFRjR3RYc0kvZXNuaTBxVStlSDZwNDRtQ09oOGttaHRjOWh2SnF3aEFyaVp0eVpCV3lWZ3J0QklHdTRHCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1DRkNBIEVWIFJPT1QgTz1DaGluYSBGaW5hbmNpYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBTdWJqZWN0OiBDTj1DRkNBIEVWIFJPT1QgTz1DaGluYSBGaW5hbmNpYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBMYWJlbDogIkNGQ0EgRVYgUk9PVCIKIyBTZXJpYWw6IDQwNzU1NTI4NgojIE1ENSBGaW5nZXJwcmludDogNzQ6ZTE6YjY6ZWQ6MjY6N2E6N2E6NDQ6MzA6MzM6OTQ6YWI6N2I6Mjc6ODE6MzAKIyBTSEExIEZpbmdlcnByaW50OiBlMjpiODoyOTo0Yjo1NTo4NDphYjo2Yjo1ODpjMjo5MDo0Njo2YzphYzozZjpiODozOTo4Zjo4NDo4MwojIFNIQTI1NiBGaW5nZXJwcmludDogNWM6YzM6ZDc6OGU6NGU6MWQ6NWU6NDU6NTQ6N2E6MDQ6ZTY6ODc6M2U6NjQ6Zjk6MGM6Zjk6NTM6NmQ6MWM6Y2M6MmU6Zjg6MDA6ZjM6NTU6YzQ6YzU6ZmQ6NzA6ZmQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZqVENDQTNXZ0F3SUJBZ0lFR0VyTTFqQU5CZ2txaGtpRzl3MEJBUXNGQURCV01Rc3dDUVlEVlFRR0V3SkQKVGpFd01DNEdBMVVFQ2d3blEyaHBibUVnUm1sdVlXNWphV0ZzSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eQphWFI1TVJVd0V3WURWUVFEREF4RFJrTkJJRVZXSUZKUFQxUXdIaGNOTVRJd09EQTRNRE13TnpBeFdoY05Namt4Ck1qTXhNRE13TnpBeFdqQldNUXN3Q1FZRFZRUUdFd0pEVGpFd01DNEdBMVVFQ2d3blEyaHBibUVnUm1sdVlXNWoKYVdGc0lFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TVJVd0V3WURWUVFEREF4RFJrTkJJRVZXSUZKUApUMVF3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRRFhYV3ZORUQ4ZkJWblZCVTAzCnNRN3NtQ3VPRlIzNmswc1hnaUZ4RUZMWFVXUndGc0pWYVUyT0ZXMmZ2d3did3VDalo5WU1yTThpcnE5M1ZDcEwKVElwVFVuckQ3aTdlczNFbHdlbGRQZTZoTDZQM0tqekpJeDFxcXgyaHAvSHo3S0RWUk04VnozSXZIV09YNkpuNQovWk9rVklCTVV0UlNxeTVKMzVETnVGKytQOTZoeWswZzFDWG9oQ2xUdDdHSUgvLzYycENmQ3FrdFFUK3g4UmdwCjdoWlpMRFJKR3FnRzE2aUkwZ055ZWpMaTZtaE5iaXlXWlh2S1dmcnk0dDN1TUN6N3pFYXN4R1ByYjM4Mkt6UnoKRXBSLzM4d21udkZ5WFZCbFdZOXBzNGRlTW0vREdJcTFsWSt3ZWpmZVdrVTd4emJoNzJmUk9kT1hXM05pR1VndApoeHdHKzNTWUlFbHo4QVhTRzdHZ283Y2JjTk9JYWJsYTFqajBZdHdsaTNpLytPaCt1RnpKbFU5ZnB5MjVJR3ZQCmE5MzFEZlNDdC9TeVppNFFLUGFYV251V0ZvOEJHUzFzYm44NVdBWmtnd0dEZzhOTmt0MHl4b2VrTitrV3pxb3QKYUs4S2dXVTZjTUdiclUxdFZNb3FMVXVGRzdPQTVuQkZEV3RlTmZCL083aWM1QVJ3aVJJbGs5b0ttU0pnYW1OZwpUbllHbUU2OWc2MGRXSW9saGRMSFpSNHRqc2JmdHNiaGY0b0VJUlVwZFBBK25KQ2REQzd4aWo1YXFnd0pIc2ZWClBLUHRsOE1lTlBvNCtRZ080OEJkSzRQUlZtckp0cWhVVXk1NE1tYzlnbjkwMFB2aHRnVmd1WERiamd2NUUxaHYKY1dBUVVoQzV3VUVKNzNJZlp6RjQvNVlGalFJREFRQUJvMk13WVRBZkJnTlZIU01FR0RBV2dCVGovaTM5S05BTAp0YnEyb3NTL0Jxb0ZqSlA3THpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUJCakFkCkJnTlZIUTRFRmdRVTQvNHQvU2pRQzdXNnRxTEV2d2FxQll5VCt5OHdEUVlKS29aSWh2Y05BUUVMQlFBRGdnSUIKQUNYR3VtdnJoOHZlZ2ptV1BmQkVwMnVFY3dQZW5TdFB1aUIvdkhpeXo1ZXdHNXp6MTNrdTlVaTIwdnNYaU9iVAplai90VXhQUTRpOXFlY3NBSXlqbUhqZFhOWW1Fd25aUE5EYXRaOFBPUVFhSXhmZnUyQnE0MWd0L1VQK1RxaGRMCmpPenRVbUN5cEFicVR1djBheG45Ni9VYTRDVXFtdHpIUVRiM3lIUUZoRG1WT2RZTE82UW4rZ2pZWEI3NEJHQlMKRVNnb0EvL3ZVMllBcFVvMEZtWjgvUW1rcnA1bkdtOUJDMnNHRTV1UGhuRUZ0QytOaVdZektYWlVtaEg0Si9xeQpQNUhnemcwYjh6QWFyYjhpWFJ2VHZ5VUZUZUdTR24rWm56eEVrOHJVUUVsc2dJZlhCRHJETWxJMURsYjRwZDE5CnhJc05FUjlUeXg2eUY3Wm9kMXJnMU12SUI2NzFPaTZPTjdmUUFVdERLWGVNT1plUGdscjRVZVdKb0JqbmFIOWQKQ2k3N28wY09QYVlqZXNZQng0L0lYcjl0Z0ZhK2lpUzZNK3FmNFRJUm52SFNUNEQyRzBDdk9KNFJVSGx6RWhMTgo1bXlkTEloeVBEQ0JCcEVpNmxtdDJoa3VJc0tOdVl5SDRHYThjeU5mSVdSamdFajFvRHdZUFpUSVNFRWRRTHBlCi92NVdPYUhJejE2ZUdXUkdFTm9Ya2JjRmdLeUxtWko5NTZMWUJ3czJKK2RJZVdDS3c5Y1RYUGh5UU45S3k4K1oKQUFvQUN4R1YybFpGQTRnS24yZlExWG14cUkxQWJRM0Nla0Q2ODE5a1I1TExVN203V2M1UC9kQVZVd0hZMyt2Wgo1bmJ2MENPN082bDVzOVVDS2MySm81WVBTalhuVGtMQWRjMEh6K1lzNjNzdQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VFx4ZGNSS1RSVVNUIEVsZWt0cm9uaWsgU2VydGlmaWthIEhpem1ldCBTYVx1MDExZmxheVx1MDEzMWNcdTAxMzFzXHUwMTMxIEg1IE89VFx4ZGNSS1RSVVNUIEJpbGdpIFx1MDEzMGxldGlcdTAxNWZpbSB2ZSBCaWxpXHUwMTVmaW0gR1x4ZmN2ZW5saVx1MDExZmkgSGl6bWV0bGVyaSBBLlx1MDE1ZS4KIyBTdWJqZWN0OiBDTj1UXHhkY1JLVFJVU1QgRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhXHUwMTFmbGF5XHUwMTMxY1x1MDEzMXNcdTAxMzEgSDUgTz1UXHhkY1JLVFJVU1QgQmlsZ2kgXHUwMTMwbGV0aVx1MDE1ZmltIHZlIEJpbGlcdTAxNWZpbSBHXHhmY3ZlbmxpXHUwMTFmaSBIaXptZXRsZXJpIEEuXHUwMTVlLgojIExhYmVsOiAiVFx4ZGNSS1RSVVNUIEVsZWt0cm9uaWsgU2VydGlmaWthIEhpem1ldCBTYVx1MDExZmxheVx1MDEzMWNcdTAxMzFzXHUwMTMxIEg1IgojIFNlcmlhbDogMTU2MjMzNjk5MTcyNDgxCiMgTUQ1IEZpbmdlcnByaW50OiBkYTo3MDo4ZTpmMDoyMjpkZjo5MzoyNjpmNjo1Zjo5ZjpkMzoxNTowNjo1Mjo0ZQojIFNIQTEgRmluZ2VycHJpbnQ6IGM0OjE4OmY2OjRkOjQ2OmQxOmRmOjAwOjNkOjI3OjMwOjEzOjcyOjQzOmE5OjEyOjExOmM2Ojc1OmZiCiMgU0hBMjU2IEZpbmdlcnByaW50OiA0OTozNToxYjo5MDozNDo0NDpjMTo4NTpjYzpkYzo1Yzo2OTozZDoyNDpkODo1NTo1YzpiMjowODpkNjphODoxNDoxMzowNzo2OTo5Zjo0YTpmMDo2MzoxOTo5ZDo3OAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUp6Q0NBdytnQXdJQkFnSUhBSTRYL2lRZ2dUQU5CZ2txaGtpRzl3MEJBUXNGQURDQnNURUxNQWtHQTFVRQpCaE1DVkZJeER6QU5CZ05WQkFjTUJrRnVhMkZ5WVRGTk1Fc0dBMVVFQ2d4RVZNT2NVa3RVVWxWVFZDQkNhV3huCmFTREVzR3hsZEduRm4ybHRJSFpsSUVKcGJHbkZuMmx0SUVmRHZIWmxibXhweEo5cElFaHBlbTFsZEd4bGNta2cKUVM3Rm5pNHhRakJBQmdOVkJBTU1PVlREbkZKTFZGSlZVMVFnUld4bGEzUnliMjVwYXlCVFpYSjBhV1pwYTJFZwpTR2w2YldWMElGTmh4SjlzWVhuRXNXUEVzWFBFc1NCSU5UQWVGdzB4TXpBME16QXdPREEzTURGYUZ3MHlNekEwCk1qZ3dPREEzTURGYU1JR3hNUXN3Q1FZRFZRUUdFd0pVVWpFUE1BMEdBMVVFQnd3R1FXNXJZWEpoTVUwd1N3WUQKVlFRS0RFUlV3NXhTUzFSU1ZWTlVJRUpwYkdkcElNU3diR1YwYWNXZmFXMGdkbVVnUW1sc2FjV2ZhVzBnUjhPOApkbVZ1YkduRW4ya2dTR2w2YldWMGJHVnlhU0JCTHNXZUxqRkNNRUFHQTFVRUF3dzVWTU9jVWt0VVVsVlRWQ0JGCmJHVnJkSEp2Ym1scklGTmxjblJwWm1scllTQklhWHB0WlhRZ1UySEVuMnhoZWNTeFk4U3hjOFN4SUVnMU1JSUIKSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXBDVVo0V1dlNjBnaFVFb0k1Ukh3V3JvbQovNE5aemtRcUwvN2h6bUFEL0kwRHBlMy9hNmk2ekRRR24xazE5dXdzdTUzN2pWSnA0NXduRUZQenBBTEZwL2tSCkdtbDFic01kaTlHWWpaT0hwM0dYRFNISG1mbFMweXhqWFZXODZCOEJTTGxnL2tKSzlzaUFyczFtZXA1RmltaDMKNGtob242TGE4ZUhCRUovclBDbUJwK0V5Q05TZ0JiR00rNDJXQUE0K0pkOVRoaUk3L1BTOTh3bCtkK3lHNnc4ego1VU5QOUZSMWJTbVpMbVphUTkvTFhNckk1VGp4ZmpzMW5RLzB4VnFoelBNZ2dDVFRWK3dWdW5VbG0raGtTN00wCmhPOEV1UGJKYktvQ1ByWlY0akkzWC94bWwxL04xcDdISUw5Tnhxdy9kVjhjN1RLY2ZHa0FhWkhqSXhoVDZRSUQKQVFBQm8wSXdRREFkQmdOVkhRNEVGZ1FVVnBrSEh0T3NER2xrdEF4UVI5NURMTDRnd1Bzd0RnWURWUjBQQVFILwpCQVFEQWdFR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFKNUZkbnNYClNETHlPSXNwdmU2V1NrNkJHTEZSUnlETjBHU3hEc25aQWRrSnpzaVozR2dsRTlSYzhxUG9CUDV5Q2NjTHFoMGwKVlg2V21sZTN1c1VSZWhubXAzNDloUTcxK1M0cEwrZjViRmdXVjFBbDlqNHVQcXJ0ZDNHcXFwbVdSZ3F1anV3cQpVUmF3WHMzcVp3UWNXREQxWUlxOXByMU41WmEwL0VLSkFXdjJjTWhRT1F3dDFXYlp5Tkt6TXJjYkdXM0xNL25mCnBlWVZoRGZ3d3ZKbGxwS1FkL0N0OUpEcEVYalhrNG5BUFF1NktmVG9tWjF5anUyZEwrNlNmYUh4LzEyNk0yQ0YKWXY0SEFxR0VWa2ErbGdxYUU5Y2hUTGQ4QjU5T1RqK1JkUHNublJITTNlYXh5bkZORXhjNUpzVXBJU3VUS1dxVworcXRCNFV1Mk5RdkFteFU9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1DZXJ0aW5vbWlzIC0gUm9vdCBDQSBPPUNlcnRpbm9taXMgT1U9MDAwMiA0MzM5OTg5MDMKIyBTdWJqZWN0OiBDTj1DZXJ0aW5vbWlzIC0gUm9vdCBDQSBPPUNlcnRpbm9taXMgT1U9MDAwMiA0MzM5OTg5MDMKIyBMYWJlbDogIkNlcnRpbm9taXMgLSBSb290IENBIgojIFNlcmlhbDogMQojIE1ENSBGaW5nZXJwcmludDogMTQ6MGE6ZmQ6OGQ6YTg6Mjg6YjU6Mzg6Njk6ZGI6NTY6N2U6NjE6MjI6MDM6M2YKIyBTSEExIEZpbmdlcnByaW50OiA5ZDo3MDpiYjowMTphNTphNDphMDoxODoxMToyZTpmNzoxYzowMTpiOTozMjpjNTozNDplNzo4ODphOAojIFNIQTI1NiBGaW5nZXJwcmludDogMmE6OTk6ZjU6YmM6MTE6NzQ6Yjc6M2M6YmI6MWQ6NjI6MDg6ODQ6ZTA6MWM6MzQ6ZTU6MWM6Y2I6Mzk6Nzg6ZGE6MTI6NWY6MGU6MzM6MjY6ODg6ODM6YmY6NDE6NTgKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZrakNDQTNxZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRc0ZBREJhTVFzd0NRWURWUVFHRXdKR1VqRVQKTUJFR0ExVUVDaE1LUTJWeWRHbHViMjFwY3pFWE1CVUdBMVVFQ3hNT01EQXdNaUEwTXpNNU9UZzVNRE14SFRBYgpCZ05WQkFNVEZFTmxjblJwYm05dGFYTWdMU0JTYjI5MElFTkJNQjRYRFRFek1UQXlNVEE1TVRjeE9Gb1hEVE16Ck1UQXlNVEE1TVRjeE9Gb3dXakVMTUFrR0ExVUVCaE1DUmxJeEV6QVJCZ05WQkFvVENrTmxjblJwYm05dGFYTXgKRnpBVkJnTlZCQXNURGpBd01ESWdORE16T1RrNE9UQXpNUjB3R3dZRFZRUURFeFJEWlhKMGFXNXZiV2x6SUMwZwpVbTl2ZENCRFFUQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQU5UTUNRb3NQNUwyCmZ4U2VDNXlhYWgxQU1HVDlxdDhPSGdaYm4xQ0Y2czJOcTBObjNyRDZmb0NXbm9SNGtralc0em51enVSWldKZmwKTGllWTZwT29kNXRLOE85MGdDM3JNQisxMmNlQW5HSW5rWWp3U29uZDNJam1GUG5WQXkvL2xkdTluK3dzK2hRVgpXWlVLeGtkOGFSaTVwd1A1eW5hcHo4ZHZ0RjRGL3U3QlVySjFNb2ZzN1NsbU8vTktGb0wyMXByYmNwanAzdkRGClRLV3J0ZW9CNG93dVpIOWtiLzJqSlpPTHlLSU9TWTAwOEIvc1dFVXVOS3FFVUwzbnNrb1R1TEFQcmpoZHNLa2IKNW5QSldxSFpaa0NxcVUybU5BS3RoSDZ5SThIN0tzWm45RFMyc0pWcU0wOXhSTFd0d0hremlPQy83YU9nRkxTYwpDYkFLNDJDKytQaG1pTTFiOFhjRjRMVnpic0Y5Umk2T1N5ZW16VFVLL2VWTmZhb3FveW5IV21nRTZPWFdrNlJpCndzWG05RS9HK1o4YWpZSkpHWXJLV1VNNjZBMHl3ZlJNRXdOdmJxWS9rWFBMeW5OdkVpQ0w3c0NDZU41TExzSkoKd3gzdEZ2WWs5Q2NiWEZjeDNGWHVxQjV2Ykt6aVJjeFhWNHAxVnhuZ3RWaVpTVFl4UERNQmJSWkt6YmdxZzRTRwptL2xnMGg5dGtRUFRZS2JWUFpyZGQ1QTlOYVNmRDE3MVVrUnB1Y0M2M005OTMzelp4S3lHSWpLOGUydVI3M3I0CkYyaXc0bE5WWUMydlBzS0QyTmtKSy9EQVpOdUhpNUhNa2VzRS9YYTBsWnJtRkFZYjFUUWR2dGovZEJ4VGhabmcKV1ZKS1llMklubXRKaVVaK0lGclo1MHJsYXU3U1pSRkRBZ01CQUFHall6QmhNQTRHQTFVZER3RUIvd1FFQXdJQgpCakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlR2a1V6MXBjTXc2QzhJNnROeElxU1NhSGgwCjJUQWZCZ05WSFNNRUdEQVdnQlR2a1V6MXBjTXc2QzhJNnROeElxU1NhSGgwMlRBTkJna3Foa2lHOXcwQkFRc0YKQUFPQ0FnRUFmajFVMmlKZEdsZytPMVFudXJyTXlPTWFhdW8rK1JMclZsODlVTTdnNmtnbUpzOTVWbjZSSEprLwowS0dSSEN3UFQ1aVZXVk85MENMWWlGMmNOL3o3Wk1GNGpJdWFZQW5xMWZvaFg5QjBaZWRReGI4dXVRc0xyYld3CkY2WVNqTlJpZU9wV2F1d0swa0REUEFVd1BrMlV0NTlLQTlOOUowdTIva1RPK2hrekdtMmtRdEhkek1qSTF4WlMKZzA4MWxMTVNWWDNsNGtMcjVKeVRDY0JNV3dlcngyMFJvRkFYbENPb3RRcVNEN0o2d1dBc09Nd2FwbHYvOGd6agpxaDhjM0xpZ2t5ZmVZK04vSVo4NjVaNzY0Qk5xZGV1V1hHS1JsSTVuVTdhSitCSUp5MjlTV3dOeWhsQ1ZDTlNOCmg0WVZINVVrMktSdm1zNmtuWnR0MHJKMkJvYkdWZ2pGNnduYU5zSWJXMEcrWVNyamNPYTRwdmkyV3NTOUlmZi8KcWwraGJIWTVadGJxVEZYaEFET2JFNWhqeVcvUUFTQUpOMUxuREU4K3piejFYNVlucHlBQ2xlQXU2QWRCQlI4VgpidGF3NUJuZ0R3S1RBQ2R5eFl2UlZCOWRTc05BbDM1VnBuekJNd1FVQVIxSklHa0xHWk9kYmxnaTkwQU1SZ3dqClkvTTUwbjkyVWFmMHlLSHhESFlpSTBaU0tTM2lvMEVIVm1tWTBnVUp2R25IV21ITmo0RmdGVTJBM1pEaWZjUlEKOG93N2Jrckh4dWFBS3p5QnZCR0FGaEFuMS9ETlAzbk1jeXJEZmxPUjFtNzQ5ZlBIMEZGTmprdWxXK1laRnp2VwpnUW5jSXR6dWpybkVqMVBoWjdzenVJZ1ZScy90YVRYL2RRMUc4ODV4NGNWcmhrSUd1VUU9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1PSVNURSBXSVNlS2V5IEdsb2JhbCBSb290IEdCIENBIE89V0lTZUtleSBPVT1PSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkCiMgU3ViamVjdDogQ049T0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQSBPPVdJU2VLZXkgT1U9T0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZAojIExhYmVsOiAiT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQSIKIyBTZXJpYWw6IDE1Nzc2ODU5NTYxNjU4ODQxNDQyMjE1OTI3ODk2Njc1MDc1NzU2OAojIE1ENSBGaW5nZXJwcmludDogYTQ6ZWI6Yjk6NjE6Mjg6MmU6Yjc6MmY6OTg6YjA6MzU6MjY6OTA6OTk6NTE6MWQKIyBTSEExIEZpbmdlcnByaW50OiAwZjpmOTo0MDo3NjoxODpkMzpkNzo2YTo0Yjo5ODpmMDphODozNTo5ZTowYzpmZDoyNzphYzpjYzplZAojIFNIQTI1NiBGaW5nZXJwcmludDogNmI6OWM6MDg6ZTg6NmU6YjA6Zjc6Njc6Y2Y6YWQ6NjU6Y2Q6OTg6YjY6MjE6NDk6ZTU6NDk6NGE6Njc6ZjU6ODQ6NWU6N2I6ZDE6ZWQ6MDE6OWY6Mjc6Yjg6NmI6ZDYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR0VENDQXAyZ0F3SUJBZ0lRZHJFZ1VuVHdoWWRHcy9nakd2YkN3REFOQmdrcWhraUc5dzBCQVFzRkFEQnQKTVFzd0NRWURWUVFHRXdKRFNERVFNQTRHQTFVRUNoTUhWMGxUWlV0bGVURWlNQ0FHQTFVRUN4TVpUMGxUVkVVZwpSbTkxYm1SaGRHbHZiaUJGYm1SdmNuTmxaREVvTUNZR0ExVUVBeE1mVDBsVFZFVWdWMGxUWlV0bGVTQkhiRzlpCllXd2dVbTl2ZENCSFFpQkRRVEFlRncweE5ERXlNREV4TlRBd016SmFGdzB6T1RFeU1ERXhOVEV3TXpGYU1HMHgKQ3pBSkJnTlZCQVlUQWtOSU1SQXdEZ1lEVlFRS0V3ZFhTVk5sUzJWNU1TSXdJQVlEVlFRTEV4bFBTVk5VUlNCRwpiM1Z1WkdGMGFXOXVJRVZ1Wkc5eWMyVmtNU2d3SmdZRFZRUURFeDlQU1ZOVVJTQlhTVk5sUzJWNUlFZHNiMkpoCmJDQlNiMjkwSUVkQ0lFTkJNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQTJCZTMKSEVva0t0YVhzY3JpSHZ0OU9PK1k5Ykk1bUU0bnVCRmRlOUlsbElpQ0ZTWnFHekc3cUZzaElTdllEMDZmV3ZHeApXdVI1MWpJaksrRlR6SmxGWEh0UHJieS9oMG9MUzVkYXFQWkk3SDE3RGMwaEJ0K2VGZjFCaWtpM0lQU2hlaHRYCjFGMVEvN3BuMkNPWkg4Zy80OTcvYjF0M3NXdHV1TWxrOStIS1FVWU9LWEhRdVNQOHlZRmZUdmR2MzcrRXJYTmsKdTdkQ2ptbjIxSFlkZnAybnVGZUtVV2R5MTlTb3VKVlVRSE1EOXVyMDYvNG9RbmMvblNNYnNyWTlnQlFIVEM1UAo5OVVLRmcyOVprTTNmaU5EZWNOQWh2Vk1LZHFPbXEwTnBRU0hpQjZGNCtsVDFadklpd05qZU92Z0dVcHV1eTlyCk0yUllrNjFwdjQ4Yjc0Skl4d0lEQVFBQm8xRXdUekFMQmdOVkhROEVCQU1DQVlZd0R3WURWUjBUQVFIL0JBVXcKQXdFQi96QWRCZ05WSFE0RUZnUVVOUS9JTm1OZTRxUHMrVHRtRmM1UlV1T1JtajB3RUFZSkt3WUJCQUdDTnhVQgpCQU1DQVFBd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFFQk0rNGV5bVlHUWZwM0ZzTEFtelloN0t6S05icmdoCmNWaVhmYTQzRks4KzUvZWE0bjMyY1ppWkJLcERkSGlqNDBsaFBuT01UWlRnK1hIRXRoWU9VM2dmMXFLSEx3STUKZ1NrOHJ4V1lJVEQrS0pBQWpOSGh5L3BleVAzNEVFWTdvbmhDa1JkMFZRcmVVR2ROWnRHbi8vM1p3TFdvbzRyTwpadlVQUTgybksxZDdZMFpxcWk1UzJQVHQ0VzJ0S1pCNFNMcmhJNnFqaWV5MXE1YkF0RXVpSFplZWV2SnVRSEhmCmFQRmxUYzU4QmQ5VFphbWw4TEdYQkhBVlJnT1kxTksvVkxTZ1dIMVNiOXBXSm1MVTJOdUpNVzhjOENMQzAySWMKTmMxTWFSVlVHcENZM3VzZVg4cDN4OHVPUFVOcG5KcFkwQ1E3M3h0QWxuNDFyWUhIVG5HNmlCTT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVNaQUZJUiBST09UIENBMiBPPUtyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4KIyBTdWJqZWN0OiBDTj1TWkFGSVIgUk9PVCBDQTIgTz1LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuCiMgTGFiZWw6ICJTWkFGSVIgUk9PVCBDQTIiCiMgU2VyaWFsOiAzNTcwNDMwMzQ3NjcxODY5MTQyMTcyNzczNDQ1ODczODY3NDMzNzc1NTgyOTYyOTIKIyBNRDUgRmluZ2VycHJpbnQ6IDExOjY0OmMxOjg5OmIwOjI0OmIxOjhjOmIxOjA3OjdlOjg5OjllOjUxOjllOjk5CiMgU0hBMSBGaW5nZXJwcmludDogZTI6NTI6ZmE6OTU6M2Y6ZWQ6ZGI6MjQ6NjA6YmQ6NmU6Mjg6ZjM6OWM6Y2M6Y2Y6NWU6YjM6M2Y6ZGUKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGExOjMzOjlkOjMzOjI4OjFhOjBiOjU2OmU1OjU3OmQzOmQzOjJiOjFjOmU3OmY5OjM2OjdlOmIwOjk0OmJkOjVmOmE3OjJhOjdlOjUwOjA0OmM4OmRlOmQ3OmNhOmZlCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEY2pDQ0FscWdBd0lCQWdJVVBvcGRCK3hWMGpMVnQrTzJYd0hyTGR6azF1UXdEUVlKS29aSWh2Y05BUUVMCkJRQXdVVEVMTUFrR0ExVUVCaE1DVUV3eEtEQW1CZ05WQkFvTUgwdHlZV3B2ZDJFZ1NYcGlZU0JTYjNwc2FXTjYKWlc1cGIzZGhJRk11UVM0eEdEQVdCZ05WQkFNTUQxTmFRVVpKVWlCU1QwOVVJRU5CTWpBZUZ3MHhOVEV3TVRrdwpOelF6TXpCYUZ3MHpOVEV3TVRrd056UXpNekJhTUZFeEN6QUpCZ05WQkFZVEFsQk1NU2d3SmdZRFZRUUtEQjlMCmNtRnFiM2RoSUVsNlltRWdVbTk2YkdsamVtVnVhVzkzWVNCVExrRXVNUmd3RmdZRFZRUUREQTlUV2tGR1NWSWcKVWs5UFZDQkRRVEl3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQzN2RDVRcUV2TgpRTFhPWWVlV3lyU2gyZ3dpc1BxMWUzWUFkNHdMejMyb2hzd21VZVFnUFlVTTFsamo1L1FxR0ozYTBhNG03dXRUCjNQU1ExaE5LREpBOHcvVGEwbzROa2pyY3NiSC9PTjdEdWkxZmdMa0N2VXFkR3crMHc4TEJad1BkM0J1Y1BiT3cKM2dBZXFEUkh1NXJyL2dzVXZUYUUyZzBndi9wYnk2a1dJSzA1WU80dmRiYm5sNXo1UHYxK1RXOU5MKytJRFdyNgozZkU5YmlDbG9CSzBUWEM1enRkeU80bVRwNENFSENkSmNrbTEvenVWbnNITXlBSHM2QTZLQ3BibnM2YUg1ZGI1CkJTc05sMEJ3UExxc2RWcWMxVTJkQWdyU1M1dG1TMFlIRjJXdG4yeUlBTndpaWVEaFpOUm52REY1WVR5N3lrSE4KWEdvQXlEdzRqbGl2QWdNQkFBR2pRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRRApBZ0VHTUIwR0ExVWREZ1FXQkJRdUZxbEtHTFhMelBWdlVQTWpYL2hkNTZ6d3lEQU5CZ2txaGtpRzl3MEJBUXNGCkFBT0NBUUVBdFhQNEE5eFpXeDEyNmFNcWU1QW9zazNBTTArcW1ySFV1T1FuLzZtV21jNUc0RzE4VEtJNHBBWncKOFBSQkVldy9SNDAvY29mNU8vMmtieXRUQU9EL09ibHFCdzdySFJ6Mm9uS1F5NEk5RVlLTDBydWZLcThoNW1PRwpuWGtaNy9lN0REV1F3NHJ0VHcvMXpCTFpwRDY3b1B3Z2xWOVBKaThSSTROT2RRY1B2NXZSdEIzcEVBVCt5bUNQCm9reTRyYy9oa0EvTnJnckhYWHUzVU5MVVlmclZGZHZYbjRkUlZPdWw0K3ZKaGFBbElEZjdqczRNTklUaFBJR3kKZDA1RHBZaGZobWVoUGVhMFhHRzJQdHYrdHlqRm9nZXV0Y3JLalNvUzc1ZnR3akNreVNwNisvTk5JeHVaTXpTZwpMdldwQ3ovVVhlSFBoSi9pR2NKZml0WWdIdU56dHc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049Q2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyIE89VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLiBPVT1DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBTdWJqZWN0OiBDTj1DZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBIDIgTz1Vbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuIE9VPUNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIExhYmVsOiAiQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyIgojIFNlcmlhbDogNDQ5Nzk5MDAwMTcyMDQzODMwOTk0NjM3NjQzNTc1MTI1OTY5NjkKIyBNRDUgRmluZ2VycHJpbnQ6IDZkOjQ2OjllOmQ5OjI1OjZkOjA4OjIzOjViOjVlOjc0OjdkOjFlOjI3OmRiOmYyCiMgU0hBMSBGaW5nZXJwcmludDogZDM6ZGQ6NDg6M2U6MmI6YmY6NGM6MDU6ZTg6YWY6MTA6ZjU6ZmE6NzY6MjY6Y2Y6ZDM6ZGM6MzA6OTIKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGI2Ojc2OmYyOmVkOmRhOmU4Ojc3OjVjOmQzOjZjOmIwOmY2OjNjOmQxOmQ0OjYwOjM5OjYxOmY0OjllOjYyOjY1OmJhOjAxOjNhOjJmOjAzOjA3OmI2OmQwOmI4OjA0Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGMGpDQ0E3cWdBd0lCQWdJUUlkYlFTazhsRDhreU4veXFYaEtONlRBTkJna3Foa2lHOXcwQkFRMEZBRENCCmdERUxNQWtHQTFVRUJoTUNVRXd4SWpBZ0JnTlZCQW9UR1ZWdWFYcGxkRzhnVkdWamFHNXZiRzluYVdWeklGTXUKUVM0eEp6QWxCZ05WQkFzVEhrTmxjblIxYlNCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEVrTUNJRwpBMVVFQXhNYlEyVnlkSFZ0SUZSeWRYTjBaV1FnVG1WMGQyOXlheUJEUVNBeU1DSVlEekl3TVRFeE1EQTJNRGd6Ck9UVTJXaGdQTWpBME5qRXdNRFl3T0RNNU5UWmFNSUdBTVFzd0NRWURWUVFHRXdKUVRERWlNQ0FHQTFVRUNoTVoKVlc1cGVtVjBieUJVWldOb2JtOXNiMmRwWlhNZ1V5NUJMakVuTUNVR0ExVUVDeE1lUTJWeWRIVnRJRU5sY25ScApabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNU1F3SWdZRFZRUURFeHREWlhKMGRXMGdWSEoxYzNSbFpDQk9aWFIzCmIzSnJJRU5CSURJd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUM5K1hqNDV0V0EKREdTZGhodVdaR2MvSWpvZWRRRjk3L3RjWjR6SnpGeHJxWkhtdVVMbElFdWIycHQ3dVpsZDJadUFTOWVFUUNzbgowK2k2TUxzK0NScW5TWlh2SzBBa3dwZkhwKzZiSmUrb0NnQ1hoVnFxbmR3cHllSTFCK3R3VFVyV3diTld1S0ZCCk9KdlIrekYvaitCZjRiRS9ENDRXU1dEWEJvMFkrYW9tRUtzcTA5RFJaNDBiUnI1SE1OVXVjdEhGWTlyblkzbEUKZmt0akpJbUdMalEvS1V4U2l5cW53T0tSS0ltNXdGdjVIZG5uSjYzL21nS1h3Y1pRa3BzQ0xMMnB1VFJaQ3IrRQpTdi9mL3JPZjY5bWU0SmdqN0tacmR4WXEyOHl0T3h5a2g5eEdjMTRaWW1oRlYrU1Fna0s3UXRid1llREJvejFtCm8xMzBHTzZJeVkwWFJTbVpNblVDTWU0cEpzaHJBdWExWWtWL054VmFJMmlKMUQ3ZVRpZXc4RUFNdkUwWHkwMmkKc3g3UUJscmQ5cFBQVjNXWjlmcUdHbWQ0czcrVy9qVGN2ZWRTVnVXejVYVjcxMEdSQmR4ZGFlT1ZEVU81L0lPVwpPWlY3YklCYVR4Tnl4dGQ5S1hwRXVsS2tLdFZCUmdrZy9pS2d0bHN3amJ5SkROWFhjUGlIVXYzYTc2eFJMZ2V6ClR2N1FDZHB3NzVqNlZ1WnQyN1ZYUzl6bExDVVZ5SjR1ZUU3NDJweWVoaXpLVi9NYTVjaVNpeHFDbG5yRHZGQVMKYWRnT1drYUxPdXNtK2lQSnRyQ0J2a0lBcFBqVy9qQXV4OUpHOXVXT2RmM3l6TG5RaDF2TUJoQmd1NE0xdDE1bgoza2ZzbVVqeHBLRVYvcTJNWW80NVZVODVGcm14WTUzL3R3SURBUUFCbzBJd1FEQVBCZ05WSFJNQkFmOEVCVEFECkFRSC9NQjBHQTFVZERnUVdCQlMyb1ZRNUFzT2dQNDZLdlByVStCeW0wVG9PL1RBT0JnTlZIUThCQWY4RUJBTUMKQVFZd0RRWUpLb1pJaHZjTkFRRU5CUUFEZ2dJQkFIR2xEczdrNmI4L09OV0pXc1FDWWZ0TXhSUVhMWXRQVTJzUQpGL3hsaE1jUVNaRGUyOGNtazRnbWIzRFdBbDQ1b1BlUHE1YTFwUk5jZ1JSdERvR0NFUnVLVHNaUHBkMWlIa1RmCkNWbjBXM2NMTittTElNYjRDazR1V0J6ck05RFBobURKMnZ1QUw1NU1ZSVI0UFNGazF2dEJIeGdQNThsMWNiMjkKWE40MGh6NUJzQTcydWRZL0NST1dGQy9lbWgxYXVWYk9OVHF3WDNCTlh1TXA4U01vY2xtMnE4S01aaVljZHl3bQpkaldMS0tkcG9Qazc5U1BkaFJCMHlaQURWcEhucjdwSDFCS1hFU0xqb2ttVWJPZTNsRXU2TGFUYU00dE1wa1QvCldqekdIV1RZdFRIa3BqeDZxRmNMMisxaEdzdnh6bk4zWTZTSGIweFJPTmJrWDhlZnRvRXE1SVZJZVZoZU8vamIKQW9KbndUbmJ3M1JMUFRZZStTbVRpR2hicUVRWklmQ242SUVOTE9pVE5yUTNzc3F3R3laNm1pVWZtcHFBbmtzcQpQL3VqbXY1ek1uSENuc1p5NFlwb0ovSGtEN1RFVEtWaGsvaVhFQWNxTUNXcHVjaHh1TzlvekMxKzllQitENEtvCmI3YTZiSU5EZDgyS2toZWhubHQ0RmoxRjRqTnkzZUZteXBuVHljVW0vUTFvQkVhdXR0bWJqTDRadnJIRzhobmoKWEFMS0xOaHZTZ2ZaeVRYYVFIWHl4S2NaYjU1Q0VKaDE1cFdMWUx6dHhSTFhpczdWbUZ4V2xnUEY3bmNHTmYvUAo1TzQvRTJIdTI5b3RoZkROcnAyeUdBbEZ3NUtoY2hmOFI3YWdDeXp4eE41RGFBaHFYenZ3ZG1QN3pBWXNwc2JpCkRyVzV2aVNQCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1IZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDE1IE89SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkKIyBTdWJqZWN0OiBDTj1IZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDE1IE89SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkKIyBMYWJlbDogIkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUiCiMgU2VyaWFsOiAwCiMgTUQ1IEZpbmdlcnByaW50OiBjYTpmZjplMjpkYjowMzpkOTpjYjo0YjplOTowZjphZDo4NDpmZDo3YjoxODpjZQojIFNIQTEgRmluZ2VycHJpbnQ6IDAxOjBjOjA2Ojk1OmE2Ojk4OjE5OjE0OmZmOmJmOjVmOmM2OmIwOmI2Ojk1OmVhOjI5OmU5OjEyOmE2CiMgU0hBMjU2IEZpbmdlcnByaW50OiBhMDo0MDo5Mjo5YTowMjpjZTo1MzpiNDphYzpmNDpmMjpmZjpjNjo5ODoxYzplNDo0OTo2Zjo3NTo1ZTo2ZDo0NTpmZTowYjoyYTo2OToyYjpjZDo1Mjo1MjozZjozNgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJR0N6Q0NBL09nQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFzRkFEQ0JwakVMTUFrR0ExVUVCaE1DUjFJeApEekFOQmdOVkJBY1RCa0YwYUdWdWN6RkVNRUlHQTFVRUNoTTdTR1ZzYkdWdWFXTWdRV05oWkdWdGFXTWdZVzVrCklGSmxjMlZoY21Ob0lFbHVjM1JwZEhWMGFXOXVjeUJEWlhKMExpQkJkWFJvYjNKcGRIa3hRREErQmdOVkJBTVQKTjBobGJHeGxibWxqSUVGallXUmxiV2xqSUdGdVpDQlNaWE5sWVhKamFDQkpibk4wYVhSMWRHbHZibk1nVW05dgpkRU5CSURJd01UVXdIaGNOTVRVd056QTNNVEF4TVRJeFdoY05OREF3TmpNd01UQXhNVEl4V2pDQnBqRUxNQWtHCkExVUVCaE1DUjFJeER6QU5CZ05WQkFjVEJrRjBhR1Z1Y3pGRU1FSUdBMVVFQ2hNN1NHVnNiR1Z1YVdNZ1FXTmgKWkdWdGFXTWdZVzVrSUZKbGMyVmhjbU5vSUVsdWMzUnBkSFYwYVc5dWN5QkRaWEowTGlCQmRYUm9iM0pwZEhreApRREErQmdOVkJBTVROMGhsYkd4bGJtbGpJRUZqWVdSbGJXbGpJR0Z1WkNCU1pYTmxZWEpqYUNCSmJuTjBhWFIxCmRHbHZibk1nVW05dmRFTkJJREl3TVRVd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUMKQVFEQytLay9HNG44UER3RVhUMlFOckNST25rOFpscnZiVGtCU1JxMHQ4OS9UU05UdDVBQTR4TXFLS1l4OFpFQQo0eWpzcmlGQnpoL2EvWDBTV3dHREQ3bXdYNW5oOGhLRGdFMEdQdCtzcitlaGlHc3hyL0NMMEJnenVOdEZhalQwCkFvQWtLQW9DRlpWZWRpb05tVG9VVy9iTHkxTzhFMDBCaURlVUpSdEN2Q0xZanFPV1hqclpNdHMrNlBBUVplMTAKNFMrbmZLOG5OTHNwZlp1Mnp3bkk1ZE1LL0lobFpYUUszSE1jWE0xQXNSelV0b1NNVEZEUGFJNm9XYTdDSjA2QwpvalhkRlBRZi83SjMxWWN2cW01OUpDZm54c3NtNXVYK1p3ZGoyRVVOM1RwWlpUbFllcEtaY2oyY2hGNklJYmpWCjlDejgyWEJTVDNpNHZUd3JpNVdZOWJQUmFNOGdGSDVNWEYvbmkrWDFOWUVaTjljUkNMZG12dE5Lem9OWEFEckQKZ2ZnWHk1STJYZEdqMkhVYjRZc242bnBJUWYxRkdRYXRKNWxPd1hCSDNiV2ZnVk1TNWJHTVNGMHhReGZqak1aNgpZNVpMS1RCT2hFNWlHVjQ4enBlUXBYOEI2NTNnK0l1SjNTV1lQWksyZnUvWjhWRlJmUzBteUdsWlllQ3NhcmdxCk5oRUVlbEM5TW9TK0w5eHkxZGNkRmtma1IyWWdQL1NXeGErT0FYcWxEM3BrOVEwWWg5bXVpTlg2aE1FNndHa28KTGZJTmFGR3E0NlYzeHFTUURxRTNpekVqUjhFSkNPdHU5M2liMTRMOGhDQ1pTUm0yRWtheCswVlZGcW1qWmF5YwpCdy9xYTl3ZkxnWnk3SWFJRXVRdDIxOEZMK1R3QTlNbU0rZUF3czFDb1JjMEN3SURBUUFCbzBJd1FEQVBCZ05WCkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQkJqQWRCZ05WSFE0RUZnUVVjUlZueU1qSnZYVmQKY3RBNEdHcWQ4M0VrVkFzd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dJQkFIVzdiVlJMcWhCWVJqVHlZdGNXTmwwSQpYdFZzeUllOXRDNUc4akg0Zk9wQ3RaTVdWZHloREJLZzJtRitEMWhZYzJSeXgraEZqdHlwOGlZL3hubU1zVk1JCk00R3dWaE8rNWxGYzJKc0tUMHVjVmxNQzZVLzJEV0RxVFVKVjZId2JJU0hUR3pyTWQvSzRrUEZveC9sYS92b3QKOUwvSjlVVWJ6amdRS2plS2VhTzA0d2xzaFlhVC80bVdKM2lCajJmalJuUlVqdGtOYWVKSzlFMTBBLyt5ZCsyVgpaNWZrc2NXcnYyb2o2TlNVNGtRb1lzUkw0dkRZNGlsckduQitKR0dUZTA4RE1pVU5SU1FybHJSR2FyOUtDL2VhCmo4R3NHc1ZuODI4MDB2cHpZNHp2RnJDb3BFWXErT3NTN0hLMDcvZ3Jmb3hTd0l1RVZQa3ZQdU5WcU54bXNkbmgKWDlpempGazBXYVNyVDJ5N0h4amJkYXZZeTVMTmxEaGhEZ2NHSDB0R0VQRVZ2bzJGWER0S0s0RjVEN1JwbjBsUQpsMDMzRGxaZHdKVnF3amJERzJqSjlTcmNSNXErc3M3RkplajZBN25hK1JadWtZVDFIQ2pJL0NiTTF4eVFWcWRmCmJ6b0V2TTE0aVF1T0R5K2pxaytpR3hJOUZnaEFEL0ZHVE5lcWV3akJDdlZ0Sjk0Q2o4ckR0U3ZLNmV2SUlWTTQKcGN3NzJIYzNNS0pQMlcvUjhrQ3RRWG9YeGRaS05ZbTNRZFY4aG45VlRZTktwWE1nd0RxdmtQR2FKSTdaam5ISwplN2lHMnJLUG1UNGRFdzBTRWU3VXEvRHBGWFlDNU9EZnFpQWVXMkdGWkVDcGtKY05yVlBTV2gySGFnQ1haV0swCnZtOXFwL1VzUXUweXJiWWhucjY4Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1IZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290Q0EgMjAxNSBPPUhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5CiMgU3ViamVjdDogQ049SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBFQ0MgUm9vdENBIDIwMTUgTz1IZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENlcnQuIEF1dGhvcml0eQojIExhYmVsOiAiSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBFQ0MgUm9vdENBIDIwMTUiCiMgU2VyaWFsOiAwCiMgTUQ1IEZpbmdlcnByaW50OiA4MTplNTpiNDoxNzplYjpjMjpmNTplMTo0YjowZDo0MTo3Yjo0OTo5MjpmZTplZgojIFNIQTEgRmluZ2VycHJpbnQ6IDlmOmYxOjcxOjhkOjkyOmQ1OjlhOmYzOjdkOjc0Ojk3OmI0OmJjOjZmOjg0OjY4OjBiOmJhOmI2OjY2CiMgU0hBMjU2IEZpbmdlcnByaW50OiA0NDpiNTo0NTphYTo4YToyNTplNjo1YTo3MzpjYToxNTpkYzoyNzpmYzozNjpkMjo0YzoxYzpiOTo5NTozYTowNjo2NTozOTpiMToxNTo4MjpkYzo0ODo3Yjo0ODozMwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ3d6Q0NBa3FnQXdJQkFnSUJBREFLQmdncWhrak9QUVFEQWpDQnFqRUxNQWtHQTFVRUJoTUNSMUl4RHpBTgpCZ05WQkFjVEJrRjBhR1Z1Y3pGRU1FSUdBMVVFQ2hNN1NHVnNiR1Z1YVdNZ1FXTmhaR1Z0YVdNZ1lXNWtJRkpsCmMyVmhjbU5vSUVsdWMzUnBkSFYwYVc5dWN5QkRaWEowTGlCQmRYUm9iM0pwZEhreFJEQkNCZ05WQkFNVE8waGwKYkd4bGJtbGpJRUZqWVdSbGJXbGpJR0Z1WkNCU1pYTmxZWEpqYUNCSmJuTjBhWFIxZEdsdmJuTWdSVU5ESUZKdgpiM1JEUVNBeU1ERTFNQjRYRFRFMU1EY3dOekV3TXpjeE1sb1hEVFF3TURZek1ERXdNemN4TWxvd2dhb3hDekFKCkJnTlZCQVlUQWtkU01ROHdEUVlEVlFRSEV3WkJkR2hsYm5NeFJEQkNCZ05WQkFvVE8waGxiR3hsYm1saklFRmoKWVdSbGJXbGpJR0Z1WkNCU1pYTmxZWEpqYUNCSmJuTjBhWFIxZEdsdmJuTWdRMlZ5ZEM0Z1FYVjBhRzl5YVhSNQpNVVF3UWdZRFZRUURFenRJWld4c1pXNXBZeUJCWTJGa1pXMXBZeUJoYm1RZ1VtVnpaV0Z5WTJnZ1NXNXpkR2wwCmRYUnBiMjV6SUVWRFF5QlNiMjkwUTBFZ01qQXhOVEIyTUJBR0J5cUdTTTQ5QWdFR0JTdUJCQUFpQTJJQUJKS2cKUWVoTGdvUmM0dmd4RVptR1pFNEpKUytkUVM4S3JqVlBkSld5VVdScmpXdm1QM0NWOEFWRVI2WnlPRkIybFFKYQpqcTRvbnZrdFRwbnZMRWh2VENVcDZORnhXOThkd1hVM3ROZjZlM3BDbkdvS1ZscDhhUXVxZ0Fra2JIN0JScU5DCk1FQXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPQkJZRUZMUWkKQzRLWkpBRU9uTHZrRHYyLys1Y2drNWtxTUFvR0NDcUdTTTQ5QkFNQ0EyY0FNR1FDTUdmT0ZtSTRvcXhpUmFlcApsU1RBR2llY01qdkF3Tlc2cWVmNEJFTlRoZTVTSWQ2ZDlTV0RQcDVZU3kvWFp4TU9JUUl3QmVGMUFkNW83U29mClRVd0pDQTNzUzYxa0Z5am5kYzVGWlhJaEY4c2lRUTZNRTVnNG1sUnRtOHJpZk9vQ1dDS1IKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUNlcnRwbHVzIFJvb3QgQ0EgRzEgTz1DZXJ0cGx1cwojIFN1YmplY3Q6IENOPUNlcnRwbHVzIFJvb3QgQ0EgRzEgTz1DZXJ0cGx1cwojIExhYmVsOiAiQ2VydHBsdXMgUm9vdCBDQSBHMSIKIyBTZXJpYWw6IDE0OTE5MTE1NjU3Nzk4OTgzNTY3MDk3MzExNzY5NjU2MTU1NjQ2Mzc3MTMKIyBNRDUgRmluZ2VycHJpbnQ6IDdmOjA5OjljOmY3OmQ5OmI5OjVjOjY5OjY5OjU2OmQ1OjM3OjNlOjE0OjBkOjQyCiMgU0hBMSBGaW5nZXJwcmludDogMjI6ZmQ6ZDA6Yjc6ZmQ6YTI6NGU6MGQ6YWM6NDk6MmM6YTA6YWM6YTY6N2I6NmE6MWY6ZTM6Zjc6NjYKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDE1OjJhOjQwOjJiOmZjOmRmOjJjOmQ1OjQ4OjA1OjRkOjIyOjc1OmIzOjljOjdmOmNhOjNlOmMwOjk3OjgwOjc4OmIwOmYwOmVhOjc2OmU1OjYxOmE2OmM3OjQzOjNlCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGYXpDQ0ExT2dBd0lCQWdJU0VTQlZnK1F0UGxSV2hTMkRON2NzM0VZUk1BMEdDU3FHU0liM0RRRUJEUVVBCk1ENHhDekFKQmdOVkJBWVRBa1pTTVJFd0R3WURWUVFLREFoRFpYSjBjR3gxY3pFY01Cb0dBMVVFQXd3VFEyVnkKZEhCc2RYTWdVbTl2ZENCRFFTQkhNVEFlRncweE5EQTFNall3TURBd01EQmFGdzB6T0RBeE1UVXdNREF3TURCYQpNRDR4Q3pBSkJnTlZCQVlUQWtaU01SRXdEd1lEVlFRS0RBaERaWEowY0d4MWN6RWNNQm9HQTFVRUF3d1RRMlZ5CmRIQnNkWE1nVW05dmRDQkRRU0JITVRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUIKQU5wUWg3YmF1S2srbldUNlZqT2FWajBXNVFPVnNqUWNtbTFpQmRUWWorZUpaSis2MjJTTFpPWjVLbUhOcjQ5YQppWkZsdVZqOHRBTmZrVDh0RUJYZ2ZzKzgvSDlEWjZpdFhqWWoySml6VGZORG5qbDhLdnpzaU5XSTduQzloUll0CjZrdUpQS054UXY0Yy9kTWNMUkM0aGxUcVE3amJ4b2ZhcUs2QUpjOTZKaDJxa2JCSWI2NjEzcDdZMS9vQS9jYVAKMEZHN1luMmtzWXl5L3lBUnVqVmpCWVpIWUVNemtQWkhvZ05QbGsyZFQ4SHE2cHlpL2pRdTNyZktHM2FrdDYyZgo2YWpVZUQ5NC92STRDVFlkMGhZQ3lPd3FhSy8xanBUdkxSTjZIa0pLSFJVeHJnd0VWL3hoYy9NeFZvWXhnS0RFCkVXNHdkdU9VOEY4RXhLeUhjb21ZeFozTVZ3aWE5QXo4ZlhvRk92cEhnRG0yejRRVGQyOG42ditXWnhjSWJla04KMWlOUU1MQVZkQk0rNVMvL0RzM0VDMHBkOE5nQU0wbG02NkVZZkZrdVBTaTVZWEhMdGFXNnVPcmM0bkJ2Q0dyYwpoMmMwNzk4d2N0M3p5VDhqL3pYaHZpRXBJRENCNUJtbElPa2x5bk14ZENtKzRrTFY4N0ltWnNkby9SbXo1eUNUCm1laGQ0RjZINTBib0pad0tLU1RVelZpR1VrQWtzbnNQbUJJZ0pQYVFiRWZJRGJzWUlDN1ovZnlMOGlucWgzU1YKNEVKUWVJUUVRV0d3OUNFamp5M0xLQ0h5YW16MEdxYkZGTFEzWlUrVi9ZREkrSExsSld2RVlMRjdiWTVLaW5QTwpXZnR3ZW5NR0U5blRkRGNrUVFvUmI1ZmM1K1Irb2IwVjhycUhEejFvaWhZSEFnTUJBQUdqWXpCaE1BNEdBMVVkCkR3RUIvd1FFQXdJQkJqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCU293Y0Nia2FoREZYeGQKQmllMEtsSFlsd3VCc1RBZkJnTlZIU01FR0RBV2dCU293Y0Nia2FoREZYeGRCaWUwS2xIWWx3dUJzVEFOQmdrcQpoa2lHOXcwQkFRMEZBQU9DQWdFQW5GWnZBWDdSdlV6MWlzYndKaC9rNERnWXpETERLVHVkUVNrMFljYlg4QUNoCjY2UnlqNVFYdkJNc2RiUlg3Z3A4Q1hyYzFjcWgwRFFUK0hlcm4rWCsyQjUwaW9VSGozL01lWHJLbHMzTi9VLzcKL1NNTmtQWDBYdFBHWVgyZUVlQUM3Z2tFMlFmZHBvcTNESU1rdTROUWt2NWdkUkUrMkoyd2lucTE0SjJieTVCUwpTN0NUS3RRK0ZqUGxuc1psRlQ1a093US8yd3lQWDF3ZGFSK3Y4K2toalBQdmwvYWF0eG0yaEhTY28xUzFjRTVqCjJGZGRVeUdiUUpKRCt0WjNWVE5QWk5YNzBDeHFqbTBscHUrRjZBTEVVejY1bm9lOHpEVWEzcUhwaW1PSFpSNFIKS3R0amQ1Y1V2cG9VbVJHeXdPNndUL2dVSVRKRFQ1K3Jvc3VvRDZvN0JsWEdFaWxYQ05RMzE0Y25yVWxacDVHcgpSSHBlalhEYmw4NUlVTEZ6ay9id2cyRDV6ZkhoTWYxYmZIRWhZeFFVcXEvRjNwTithTEhzSXFLcWtIV2V0VU55CjZtU2poRXY5REtnbWEzR1g3bFpqWnVoQ1ZQbkhIZC9RajF2ZnlEQnZpUDROeERNY1U2aWovVWdROHVRS1R1RVYKVi94dVpERENWUkhjNnFuTlNsU3NLV05FejBwQW9OWm9XUnN6K2U4Nmk5c2drdHhDaEw4QnE0ZkExU0NDMjhhNQpnNFZDWEE5RE8ycEpOZFdZOUJXLyttR0JEQWtnR05MUUZ3ekxTQUJRNlhhQ2pHVFhPcUFIVmN3ZU1jRHZPclJsCisrTy9RbXVlRDZpOWE1amMyTnZMaTZUZDExbjBidDMrcXNPUjBDNUNCOEFNVFZQTkpMRk1XeDVSOU4vcGt2bz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUNlcnRwbHVzIFJvb3QgQ0EgRzIgTz1DZXJ0cGx1cwojIFN1YmplY3Q6IENOPUNlcnRwbHVzIFJvb3QgQ0EgRzIgTz1DZXJ0cGx1cwojIExhYmVsOiAiQ2VydHBsdXMgUm9vdCBDQSBHMiIKIyBTZXJpYWw6IDE0OTIwODcwOTYxMzE1MzY4NDQyMDk1NjM1MDkyMjg5NTE4NzU4NjE1ODkKIyBNRDUgRmluZ2VycHJpbnQ6IGE3OmVlOmM0Ojc4OjJkOjFiOmVlOjJkOmI5OjI5OmNlOmQ2OmE3Ojk2OjMyOjMxCiMgU0hBMSBGaW5nZXJwcmludDogNGY6NjU6OGU6MWY6ZTk6MDY6ZDg6Mjg6MDI6ZTk6NTQ6NDc6NDE6Yzk6NTQ6MjU6NWQ6Njk6Y2M6MWEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDZjOmMwOjUwOjQxOmU2OjQ0OjVlOjc0OjY5OjZjOjRjOmZiOmM5OmY4OjBmOjU0OjNiOjdlOmFiOmJiOjQ0OmI0OmNlOjZmOjc4OjdjOjZhOjk5OjcxOmM0OjJmOjE3Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDSERDQ0FhS2dBd0lCQWdJU0VTRFprYzZ1bytqRjUvL3BBcS9QYzd4Vk1Bb0dDQ3FHU000OUJBTURNRDR4CkN6QUpCZ05WQkFZVEFrWlNNUkV3RHdZRFZRUUtEQWhEWlhKMGNHeDFjekVjTUJvR0ExVUVBd3dUUTJWeWRIQnMKZFhNZ1VtOXZkQ0JEUVNCSE1qQWVGdzB4TkRBMU1qWXdNREF3TURCYUZ3MHpPREF4TVRVd01EQXdNREJhTUQ0eApDekFKQmdOVkJBWVRBa1pTTVJFd0R3WURWUVFLREFoRFpYSjBjR3gxY3pFY01Cb0dBMVVFQXd3VFEyVnlkSEJzCmRYTWdVbTl2ZENCRFFTQkhNakIyTUJBR0J5cUdTTTQ5QWdFR0JTdUJCQUFpQTJJQUJNMFBXMWFDMy9CRkd0YXQKOTNud0hjbXNsdGFlVHB3ZnRFSVJ5b2EvYmZ1Rm84WGxHVnpYN3FZL2FXZlllT0tteWNUYkxYa3U1NHVOQW04eApJazBHNDJCeVJaME9RbmVlenMvbGY0V2JHT1Q4ekM1eTB4YVRUc3FaWTF5aEJTcHNCcU5qTUdFd0RnWURWUjBQCkFRSC9CQVFEQWdFR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZOcURZd0o1anRwTXhqd2oKRk5pUHd5Q3JLR0JaTUI4R0ExVWRJd1FZTUJhQUZOcURZd0o1anRwTXhqd2pGTmlQd3lDcktHQlpNQW9HQ0NxRwpTTTQ5QkFNREEyZ0FNR1VDTUhEK3NBdlo5NE9YN1BOVkhkVGNzd1lPL2pPWW5ZczVrR3VVSWUyMjExM1dUTmNoCnArZS9JUThyemZjcTNJVUhuUUl4QUlZVUZ1WGNzR1hDd0k0VW43OGtGbWpsdlBsNWFkeXRSU3YzdGpGenpBYWwKVTVPUkdwT3VjR3BudXRlZTVXRWFYdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1PcGVuVHJ1c3QgUm9vdCBDQSBHMSBPPU9wZW5UcnVzdAojIFN1YmplY3Q6IENOPU9wZW5UcnVzdCBSb290IENBIEcxIE89T3BlblRydXN0CiMgTGFiZWw6ICJPcGVuVHJ1c3QgUm9vdCBDQSBHMSIKIyBTZXJpYWw6IDE0OTIwMzY1Nzc4MTE5NDcwMTM3NzA0MDAxMjcwMzQ4MjUxNzg4NDQ3NzUKIyBNRDUgRmluZ2VycHJpbnQ6IDc2OjAwOmNjOjgxOjI5OmNkOjU1OjVlOjg4OjZhOjdhOjJlOmY3OjRkOjM5OmRhCiMgU0hBMSBGaW5nZXJwcmludDogNzk6OTE6ZTg6MzQ6Zjc6ZTI6ZWU6ZGQ6MDg6OTU6MDE6NTI6ZTk6NTU6MmQ6MTQ6ZTk6NTg6ZDU6N2UKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDU2OmM3OjcxOjI4OmQ5OjhjOjE4OmQ5OjFiOjRjOmZkOmZmOmJjOjI1OmVlOjkxOjAzOmQ0Ojc1OjhlOmEyOmFiOmFkOjgyOjZhOjkwOmYzOjQ1OjdkOjQ2OjBlOmI0Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGYnpDQ0ExZWdBd0lCQWdJU0VTQ3prRlU1Zlg4MmJXVENwNTlyWTQ1bk1BMEdDU3FHU0liM0RRRUJDd1VBCk1FQXhDekFKQmdOVkJBWVRBa1pTTVJJd0VBWURWUVFLREFsUGNHVnVWSEoxYzNReEhUQWJCZ05WQkFNTUZFOXcKWlc1VWNuVnpkQ0JTYjI5MElFTkJJRWN4TUI0WERURTBNRFV5TmpBNE5EVTFNRm9YRFRNNE1ERXhOVEF3TURBdwpNRm93UURFTE1Ba0dBMVVFQmhNQ1JsSXhFakFRQmdOVkJBb01DVTl3Wlc1VWNuVnpkREVkTUJzR0ExVUVBd3dVClQzQmxibFJ5ZFhOMElGSnZiM1FnUTBFZ1J6RXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUsKQW9JQ0FRRDRlVWJhbHNVd1hvcHhBeTF3cEx1d3hRamN6ZVkxd0lDa0VTM2Q1b2V1WFQyUjBvZHNON2ZhWXA2Ygp3aVRYai9IYnBxYmZSbTlScG5ITFBoc3haMkwzRVZzMEo5VjVUb3liV0wwaUVBMWNKd3pkTU9XbzAxMGhPSFFYCi91TWZ0azg3YXkzYmZXQWZqSDFNQmNMckFSWVZtQlNPMFpCM0lqL3N3am00ZVRyd1NTVGlsWkhjWVRTU2pGUjAKNzdGOWpBSGlPSDNCWDJwZkpMS09ZaGV0ZVNDdHF4MjM0TFNXU0U5bVF4QUdGaVFENGVDY2pzWkdUNDRhbWVHUAp1WTR6YkduZVdLMmdEcWRrVkJGcFJHWlBUQktuaml4OXhOUmJ4UUEwTU1IWm1mNHl6Z2VFdEU3TkN2ODJUV0x4CnAyTlg1TnRxcDY2L0s3bko1ckluaWVWK21oeE5hTWJCR040eksxRkdTeHlPOXowTStZbzBGTVQ3TXpVajhjengKS3NlbHU3Q2l6djVUYTAxQkcyWW9zcGI2cDY0S1RyazVNMFNjZE1HVEhQamduaVFsUS9HYkk0S3EzeXdnc053MgpUZ096ZkFMVTVuc2Fxb2NUdno2aGRMdWJEdUhBazUvWHBHYkt1eHM3NHpEME0xbUtCM0lEVmVkemFnTXhibStXCkcrT2luNitTeCszMVFyY2xURHNUQk04Y2xxOGNJcVBRcXdXeVRCSWpVdHo5R1Zzbm5CNDdldjFDSTlzamdCUHcKdkZFVlZKU21kejdRZEZHOVVSUUlPVGZMSHpTcE1KMVNoQzVWa0xHNjMxVUFDOWhXTGJGSlNYS0FxV0xYd1BZWQpFUVJWelhSN3oyRndlZlI3TEZ4Y2t2emx1RnFyVEpPVm9TZnVwYjdQY1NOQ3VwdDJMUUlEQVFBQm8yTXdZVEFPCkJnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVbDBZaFZ5RTEKMmpaVngvUHhOM0RsQ1BhVEtiWXdId1lEVlIwakJCZ3dGb0FVbDBZaFZ5RTEyalpWeC9QeE4zRGxDUGFUS2JZdwpEUVlKS29aSWh2Y05BUUVMQlFBRGdnSUJBQjNkQW1CODREV241cGg3NmtUT1owQlA4cE51WnRRNWlTYXMwMDBFClBMdUhJVDgzOUhFbDJrdTZxNWFDZ1pHMjdkbXhwR1dYNG05a1dhU1c3bURLSHlQN1Jici9qeVR3eXFreGYza2YKZ0xNdE1ycGtaMkN2dVZuTjM1cEowNmlDc2ZtWWxJck00THZnQkJ1WllMRkdaZHdJb3JKR25rU0k2cE4rVnhiUwpGWEpmTGt1cjFKMWp1T05JNWY2RUxsZ0tuME1kL3JjWWtvWkRTdzZjTW9Zc1lQWHBTT3FWN1hBcDhkVXYvVFcwClY4L2JoVWladWNKdmJJL05lSldzWkNqOVZyRERiOE8rV1ZMaFg0U1BnUEwwRFRhdGRyT2p0ZUZrZGpwWTNIMVAKWGxaczVWVlpWNlhmOFlwbU1JelVVbUk0ZDdTK0tOZktOc1NiQmZENEZkdmI4ZTgwblIxNFNvaFdaMjVnLzQvSQppK0dPdlVLcE13cFpRaElTS3ZxeG5VT09CWnVaMm1LdFZ6YXpIYllOZVMyV3VPdnlERXNNcFpUR01LY21HUzN0ClRBWlFNUEg5V0QyNVN4ZGZHYlJxaEZTME9FODVvZzJXYU1Nb2xQM3RMUjlLYTBPV0xwQUJFUHM0cG9FTDBMOTEKMDlTNXp2RS9idzRjSGpkeDVSaUhkUmsvVUxsZXBFVTByYkRLNXVVVGRnOHhGS21PTFpUVzFZVk5jeFZQUy9LeQpQdTFzdmYwT25XWnpzRDIwOTcrbzRCR2t4SzUxQ1VwakFFZ2dwc2FkQ3dtS3RPRG16ajdIUGlZNDZTdmVwZ2hKCkF3U1FpdW1QditpMnRDcWpJNDBjSExJNWtxaVBBbHhBT1hYVWMwRUNkOTdONEVPSDF1UzZTc05zRW4vK0t1WWoKMW94eAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049T3BlblRydXN0IFJvb3QgQ0EgRzIgTz1PcGVuVHJ1c3QKIyBTdWJqZWN0OiBDTj1PcGVuVHJ1c3QgUm9vdCBDQSBHMiBPPU9wZW5UcnVzdAojIExhYmVsOiAiT3BlblRydXN0IFJvb3QgQ0EgRzIiCiMgU2VyaWFsOiAxNDkyMDEyNDQ4MDQyNzAyMDk2OTg2ODc1OTg3Njc2OTM1NTczNDE1NDQxCiMgTUQ1IEZpbmdlcnByaW50OiA1NzoyNDpiNjo1OToyNDo2YjphZTpjODpmZToxYzowYzoyMDpmMjpjMDo0ZTplYgojIFNIQTEgRmluZ2VycHJpbnQ6IDc5OjVmOjg4OjYwOmM1OmFiOjdjOjNkOjkyOmU2OmNiOmY0OjhkOmUxOjQ1OmNkOjExOmVmOjYwOjBiCiMgU0hBMjU2IEZpbmdlcnByaW50OiAyNzo5OTo1ODoyOTpmZTo2YTo3NToxNTpjMTpiZjplODo0ODpmOTpjNDo3NjoxZDpiMTo2YzoyMjo1OToyOToyNTo3YjpmNDowZDowODo5NDpmMjo5ZTphODpiYTpmMgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmJ6Q0NBMWVnQXdJQkFnSVNFU0NoYVJ1L3ZibTlVcGFQSStoSXZ5WVJNQTBHQ1NxR1NJYjNEUUVCRFFVQQpNRUF4Q3pBSkJnTlZCQVlUQWtaU01SSXdFQVlEVlFRS0RBbFBjR1Z1VkhKMWMzUXhIVEFiQmdOVkJBTU1GRTl3ClpXNVVjblZ6ZENCU2IyOTBJRU5CSUVjeU1CNFhEVEUwTURVeU5qQXdNREF3TUZvWERUTTRNREV4TlRBd01EQXcKTUZvd1FERUxNQWtHQTFVRUJoTUNSbEl4RWpBUUJnTlZCQW9NQ1U5d1pXNVVjblZ6ZERFZE1Cc0dBMVVFQXd3VQpUM0JsYmxSeWRYTjBJRkp2YjNRZ1EwRWdSekl3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLCkFvSUNBUURNdGxlbE01UVFnVEpUMzJGK0QzWTV6MXpDVTNVZFNYcVdPTjJpYzJyeGI5NWVvbHE1Y1NHK050bWgKL0x6dWJLaDhOQnB4R3VnYTJGOE9SQWJ0cCtEejBtRUw0REtpbHRFNDhNTGFBUmY4NUt4UDZPNkpIblNyVDc4ZQpDYlkyYWxiejRlNldpV1lrQnVUTlFqcEszZUNhc01TQ1JiUCt5YXRjZkQ3SjZ4Y3ZESDF1cnFXUHlLd2xDbS82CjFVV1kwalVKOWdORGxQN1p2eUNWZVlDWWl0bUpOYnRSRzZRM2ZmeVpPNnYvdjZ3TmowT3htWHNXRUg0ZGIwZkUKRlk4RWxnZ0dRZ1Q0aE5ZZHZKR21RcjVKMVdxSVA3d3RVZEdlamVCU3pGZmROVFZZMjdTUEpJamtpOS9jYTFUUwpnU3V5enBKTEhCOUcraDNZa3N0Mlo3VUptUW5sckJjVVZYREdQS0JXQ2dPejNHSVozOGkxTUgvMVBDWjFFYjNYCkc3T0huZ2V2WlhIbG9NOGFwd2tRSFpPSlpsdm9QR0l5dGJVNmJ1bUZBWXVlUTR4bmN5aFpXK3ZqM0N6TXBTWnkKWWhLMDVweURSUFpScE9MQWVpUlh5ZzZsUHpxMU80dmxkdTV3NXBMZUZsd29XNWNaSjVMK2VwSlV6cE01Q2hhSAp2R096OWJHVFhPQnV0OURxK1dJeWlFVDd2eWNvdGpDVlhSSW91WlcrajFNWTVhSVlGdUpXcExJc0VQVWRONmI0CnQvYlFXVnlKOThMVnRaUjAwZFgrRzdidzV0WWVlOUk4eTZqajlSanpJUjl1NzAxb0Juc3RYVzVEaWFiQSthQy8KZ2g3UFUzKzA2eXpiWGZacWZVQWtCWEtKT0FHVHkzSENPVjBHRWZadmVQZzNEVG1FSndJREFRQUJvMk13WVRBTwpCZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVWFqbjZRaUwzCjVva0FUVjU5TTRQTHVHNTNocTh3SHdZRFZSMGpCQmd3Rm9BVWFqbjZRaUwzNW9rQVRWNTlNNFBMdUc1M2hxOHcKRFFZSktvWklodmNOQVFFTkJRQURnZ0lCQUpqTHEwQTg1VE1DbDM4dGg2YVAxRjVLcjdnZTU3dHgrNEJrSmFtegpHajVvWFNjbXA3b3E0ZkJYZ3dwa1R4NGlkQnZwa0Yvd3JNLy9UMmg2T0tRUWJBMnh4NlIzZ0JpMm9paEVkcWMwCm5YR0VMOHBaMGtlSW1VRWl5VENZWVc0OXFLZ0ZiZEVmd0ZGRVZuOG5OUUxkWHBnS1F1c3d2NDJobTFHcU8rcVQKUm1URkFIbmVJV3YyVjZDRzF3Wnk3SEJHUzR0ejNhQWhkVDdjSGNDUDAwOXpISVhaL245aXlKVnZ0dE43akxwVAp3bStiUkV4NTBCMXdzOWVmQXZTeUI3REg1Zml0SXc2bVZza3BFbmRJMlM5Ry9UdncvSFJ3a3FXT09BZ2ZaREMyCnQwdjdOcXdRanFCU00yT2RBelZXeFdtOXhpTmFKNVQycEJMNExUTThvVmFsWDlZWjZlMThDTDEzelNka3pKVGEKVGtaUWgrRDV3Vk9BSHJ1dCswZFNpeHY5b3ZuZURpSzNQVE5aYk5UZTlaVUdNZzFSR1VGY1BrOEc5N2tyZ0NmMgpvNnA2ZkFiaFE4TVRPV0lhTnIzZ0tDNlVBdVFwTG1CVnJrQTlzSFNTWHZBZ1pKWS9YMFZkaUxXSzJnS2dXMFZVCjNqZzlDY0NvU21WR0Z2eXF2MVJPVFZ1K09FTzNLTXFMTTZvYUpib2xYQ2t2VzBwdWpPb3RuQ3IyQlhiZ2Q1ZUEKaU4xbkUyOGRhQ1NMVDdkMGdlWDBZSjk2VmRjK045b1dhejUzcks0WWNKVUllU2tEaXY3Qk83TS9HZytrTzE0ZgpXS0dWeWFzdmMwclFMVzZhV1E5VkdIZ3RQRkdtbDR2bXU3Sndxa3dSM3Y5OEt6ZlVldEYzTkkvbitVTDNQSUVNClMxSUsKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPU9wZW5UcnVzdCBSb290IENBIEczIE89T3BlblRydXN0CiMgU3ViamVjdDogQ049T3BlblRydXN0IFJvb3QgQ0EgRzMgTz1PcGVuVHJ1c3QKIyBMYWJlbDogIk9wZW5UcnVzdCBSb290IENBIEczIgojIFNlcmlhbDogMTQ5MjEwNDkwODI3MTQ4NTY1MzA3MTIxOTk0MTg2NDE3MTE3MDQ1NTYxNQojIE1ENSBGaW5nZXJwcmludDogMjE6Mzc6YjQ6MTc6MTY6OTI6N2I6Njc6NDY6NzA6YTk6OTY6ZDc6YTg6MTM6MjQKIyBTSEExIEZpbmdlcnByaW50OiA2ZToyNjo2NDpmMzo1NjpiZjozNDo1NTpiZjpkMTo5MzozZjo3YzowMTpkZTpkODoxMzpkYTo4YTphNgojIFNIQTI1NiBGaW5nZXJwcmludDogYjc6YzM6NjI6MzE6NzA6NmU6ODE6MDc6OGM6MzY6N2M6Yjg6OTY6MTk6OGY6MWU6MzI6MDg6ZGQ6OTI6Njk6NDk6ZGQ6OGY6NTc6MDk6YTQ6MTA6Zjc6NWI6NjI6OTIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNJVENDQWFhZ0F3SUJBZ0lTRVNEbStFejhKTEMrQlVDczJvTWJOR0EvTUFvR0NDcUdTTTQ5QkFNRE1FQXgKQ3pBSkJnTlZCQVlUQWtaU01SSXdFQVlEVlFRS0RBbFBjR1Z1VkhKMWMzUXhIVEFiQmdOVkJBTU1GRTl3Wlc1VQpjblZ6ZENCU2IyOTBJRU5CSUVjek1CNFhEVEUwTURVeU5qQXdNREF3TUZvWERUTTRNREV4TlRBd01EQXdNRm93ClFERUxNQWtHQTFVRUJoTUNSbEl4RWpBUUJnTlZCQW9NQ1U5d1pXNVVjblZ6ZERFZE1Cc0dBMVVFQXd3VVQzQmwKYmxSeWRYTjBJRkp2YjNRZ1EwRWdSek13ZGpBUUJnY3Foa2pPUFFJQkJnVXJnUVFBSWdOaUFBUks3bGl1VGNwbQozZ1k2b3hIODRCandiaHk2TFRBTWlkblc3cHR6ZzZrakZZd3ZXWXBhM1JUcW5Wa3JRN2NHN0RLMnV1NUJ0YTFkCm9ZWE02aDBVWnFObmZrYmlsUFBudGxhaEZWbWhUemVYdVNJZXZSSHI5TElmWHNNVW11WFpsNW1qWXpCaE1BNEcKQTFVZER3RUIvd1FFQXdJQkJqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCUkhkOE1VaTJJNQpETWx2NFZCTjBCQlkzSldJYlRBZkJnTlZIU01FR0RBV2dCUkhkOE1VaTJJNURNbHY0VkJOMEJCWTNKV0liVEFLCkJnZ3Foa2pPUFFRREF3TnBBREJtQWpFQWo2amNuYm9NQkJmNkZlazlMeWtCbDcrQkZqTkFrMno4K2UyQWNHK3EKajl1RXdvdjFOY29HM0dSdmFCYmhqNUc1QWpFQTJFdWx5OExRQ0d6cEdQdGEzVTFmSkF1d0FDRWw3NCtuQkNaeAo0bnhwNVYyYStFRWZPem1UazUxVjZzMk44ZnZCCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1JU1JHIFJvb3QgWDEgTz1JbnRlcm5ldCBTZWN1cml0eSBSZXNlYXJjaCBHcm91cAojIFN1YmplY3Q6IENOPUlTUkcgUm9vdCBYMSBPPUludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwCiMgTGFiZWw6ICJJU1JHIFJvb3QgWDEiCiMgU2VyaWFsOiAxNzI4ODY5Mjg2Njk3OTA0NzYwNjQ2NzAyNDM1MDQxNjkwNjExMjAKIyBNRDUgRmluZ2VycHJpbnQ6IDBjOmQyOmY5OmUwOmRhOjE3OjczOmU5OmVkOjg2OjRkOmE1OmUzOjcwOmU3OjRlCiMgU0hBMSBGaW5nZXJwcmludDogY2E6YmQ6MmE6Nzk6YTE6MDc6NmE6MzE6ZjI6MWQ6MjU6MzY6MzU6Y2I6MDM6OWQ6NDM6Mjk6YTU6ZTgKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDk2OmJjOmVjOjA2OjI2OjQ5Ojc2OmYzOjc0OjYwOjc3OjlhOmNmOjI4OmM1OmE3OmNmOmU4OmEzOmMwOmFhOmUxOjFhOjhmOmZjOmVlOjA1OmMwOmJkOmRmOjA4OmM2Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGYXpDQ0ExT2dBd0lCQWdJUkFJSVF6N0RTUU9OWlJHUGd1Mk9DaXdBd0RRWUpLb1pJaHZjTkFRRUxCUUF3ClR6RUxNQWtHQTFVRUJoTUNWVk14S1RBbkJnTlZCQW9USUVsdWRHVnlibVYwSUZObFkzVnlhWFI1SUZKbGMyVmgKY21Ob0lFZHliM1Z3TVJVd0V3WURWUVFERXd4SlUxSkhJRkp2YjNRZ1dERXdIaGNOTVRVd05qQTBNVEV3TkRNNApXaGNOTXpVd05qQTBNVEV3TkRNNFdqQlBNUXN3Q1FZRFZRUUdFd0pWVXpFcE1DY0dBMVVFQ2hNZ1NXNTBaWEp1ClpYUWdVMlZqZFhKcGRIa2dVbVZ6WldGeVkyZ2dSM0p2ZFhBeEZUQVRCZ05WQkFNVERFbFRVa2NnVW05dmRDQlkKTVRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBSzNvSkhQMEZEZnptNTRyVnlnYwpoNzdjdDk4NGtJeHVQT1pYb0hqM2RjS2kvdlZxYnZZQVR5amIzbWlHYkVTVHRyRmovUlFTYTc4ZjB1b3hteUYrCjBUTTh1a2oxM1huZnM3ai9FdkVobWt2QmlvWnhhVXBtWm15UGZqeHd2NjBwSWdiejVNRG1nSzdpUzQrM21YNlUKQTUvVFI1ZDhtVWdqVStnNHJrOEtiNE11MFVsWGpJQjB0dG92MERpTmV3TndJUnQxOGpBOCtvK3UzZHBqcStzVwpUOEtPRVV0K3p3dm8vN1YzTHZTeWUwcmdUQklsREhDTkF5bWc0Vk1rN0JQWjdobS9FTE5LakQrSm8yRlIzcXlICkI1VDBZM0hzTHVKdlc1aUI0WWxjTkhsc2R1ODdrR0o1NXR1a21pOG14ZEFRNFE3ZTJSQ09GdnUzOTZqM3grVUMKQjVpUE5naVY1K0kzbGcwMmRaNzdEbkt4SFp1OEEvbEpCZGlCM1FXMEt0WkI2YXdCZHBVS0Q5amYxYjBTSHpVdgpLQmRzMHBqQnFBbGtkMjVITjdyT3JGbGVhSjEvY3RhSnhRWkJLVDVaUHQwbTlTVEpFYWRhbzB4QUgwYWhtYlduCk9sRnVoanVlZlhLbkVnVjRXZTArVVhnVkN3T1BqZEF2QmJJK2Uwb2NTM01GRXZ6RzZ1QlFFM3hEazNTenluVG4Kamg4QkNOQXcxRnR4TnJRSHVzRXdNRnhJdDRJN21LWjlZSXFpb3ltQ3pMcTlnd1Fib29NRFFhSFdCZkVid3JidwpxSHlHTzBhb1NDcUkzSGFhZHI4ZmFxVTlHWS9yT1BOazNzZ3JEUW9vLy9mYjRoVkMxQ0xRSjEzaGVmNFk1M0NJCnJVN20yWXM2eHQwblVXNy92R1QxTTBOUEFnTUJBQUdqUWpCQU1BNEdBMVVkRHdFQi93UUVBd0lCQmpBUEJnTlYKSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCUjV0Rm5tZTdibDVBRnpnQWlJeUJwWTl1bWJiakFOQmdrcQpoa2lHOXcwQkFRc0ZBQU9DQWdFQVZSOVlxYnl5cUZEUURMSFlHbWtnSnlrSXJHRjFYSXB1K0lMbGFTL1Y5bFpMCnViaHpFRm5USVpkKzUweHgrN0xTWUswNXFBdnFGeUZXaGZGUURsbnJ6dUJaNmJySkZlK0duWStFZ1BiazZaR1EKM0JlYllodEY4R2FWMG54dnd1bzc3eC9QeTlhdUovR3BzTWl1L1gxK212b2lCT3YvMlgvcWtTc2lzUmNPai9LSwpORnRZMlB3QnlWUzV1Q2JNaW9nemlVd3RoRHlDMys2V1Z3VzZMTHYzeExmSFRqdUN2akhJSW5Oemt0SENnS1E1Ck9SQXpJNEpNUEorR3NsV1lIYjRwaG93aW01N2lhenRYT29Kd1Rkd0p4NG5MQ2dkTmJPaGRqc252enF2SHU3VXIKVGtYV1N0QW16T1Z5eWdocXBaWGpGYUgzcE8zSkxGK2wrLytzS0FJdXZ0ZDd1K054ZTVBVzB3ZGVSbE44TndkQwpqTlBFbHB6Vm1iVXE0SlVhZ0VpdVREa0h6c3hIcEZLVks3cTQrNjNTTTFOOTVSMU5iZFdoc2NkQ2IrWkFKelZjCm95aTNCNDNualRPUTV5T2YrMUNjZVd4RzFiUVZzNVp1ZnBzTWxqcTRVaTAvMWx2aCt3akNoUDRrcUtPSjJxeHEKNFJncXNhaERZVnZUSDl3N2pYYnlMZWlOZGQ4WE0ydzlVL3Q3eTBGZi85eWkwR0U0NFphNHJGMkxOOWQxMVRQQQptUkd1blVIQmNuV0V2Z0pCUWw5bkpFaVUwWnNudmdjL3ViaFBnWFJSNFhxMzdaMGo0cjdnMVNnRUV6d3hBNTdkCmVteVB4Z2NZeG4vZVI0NC9LSjRFQnMrbFZEUjN2ZXlKbStrWFE5OWIyMS8ramg1WG9zMUFuWDVpSXRyZUdDYz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IE89Rk5NVC1SQ00gT1U9QUMgUkFJWiBGTk1ULVJDTQojIFN1YmplY3Q6IE89Rk5NVC1SQ00gT1U9QUMgUkFJWiBGTk1ULVJDTQojIExhYmVsOiAiQUMgUkFJWiBGTk1ULVJDTSIKIyBTZXJpYWw6IDQ4NTg3NjMwODIwNjQ0ODgwNDcwMTU1NDY4Mjc2MDU1NDc1OQojIE1ENSBGaW5nZXJwcmludDogZTI6MDk6MDQ6YjQ6ZDM6YmQ6ZDE6YTA6MTQ6ZmQ6MWE6ZDI6NDc6YzQ6NTc6MWQKIyBTSEExIEZpbmdlcnByaW50OiBlYzo1MDozNTowNzpiMjoxNTpjNDo5NTo2MjoxOTplMjphODo5YTo1Yjo0Mjo5OToyYzo0YzoyYzoyMAojIFNIQTI1NiBGaW5nZXJwcmludDogZWI6YzU6NTc6MGM6Mjk6MDE6OGM6NGQ6Njc6YjE6YWE6MTI6N2I6YWY6MTI6Zjc6MDM6YjQ6NjE6MWU6YmM6MTc6Yjc6ZGE6YjU6NTc6Mzg6OTQ6MTc6OWI6OTM6ZmEKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZnekNDQTJ1Z0F3SUJBZ0lQWFpPTk1HYzJ5QVlkR3NkVWhHa0hNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1Ec3gKQ3pBSkJnTlZCQVlUQWtWVE1SRXdEd1lEVlFRS0RBaEdUazFVTFZKRFRURVpNQmNHQTFVRUN3d1FRVU1nVWtGSgpXaUJHVGsxVUxWSkRUVEFlRncwd09ERXdNamt4TlRVNU5UWmFGdzB6TURBeE1ERXdNREF3TURCYU1Ec3hDekFKCkJnTlZCQVlUQWtWVE1SRXdEd1lEVlFRS0RBaEdUazFVTFZKRFRURVpNQmNHQTFVRUN3d1FRVU1nVWtGSldpQkcKVGsxVUxWSkRUVENDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFMcHhnSHBNaG01Lwp5Qk50d01aOUhBQ1hqeXdNSTdzUW1rQ3BHcmVIaVBpYlZtcjc1bnVPaTVLT3B5VmRXUkhiTmk2M1VSY2ZxUWdmCkJCY2tXS28zU2hqZjVUblVWLzNYd1N5UkFaSGlJdFFEd0ZqOGQwZnNqejUwUTdxc05JMU5PSFpuanJESWJ6QXoKV0hGY3RQVnJidFFCVUxnVGZteEtvMG5SSUJudXZNQXBHR1duM3Y3djNRcVFJZWNhWjVKQ0VKaGZUekM4UGh4Rgp0QkRYYUVBVXdFRDY1M2NYZXVZTGoyVmJQTm1hVXR1MXZaNUd6ejNya1FVQ3dKYXlka3hORUpZN2t2cWNmdytaCjM3NGpOVVVlQWx6K3RhaWJtU1hhWHZNaXd6bjE1Q291MDhZZnhHeXF4UnhxQVFWS0w5TEZ3YWcwSmwxbXBkSUMKSWZrWXR3YjFUcGx2cUt0TVVlalBVQmpGZDhnNUNTeEpraktacUxzWEYzbXdXc1htbzhSWlpVYzFnMTZwNkRVTAptYnZrelNER20wb0dPYlZvL0NLNjdsV01LMDdxODdIai9MYVptdFZDK25GTkNNK0hIbXB4ZmZuVHRPbWxjWUY3CndrNUhscVgyZG9XaktJL3BnRzZCVTZWdFg3aEkrY0w1TnFZdVNmKzRsc0tNQjdPYmlGajg2eHNjM2kxdzRwZVMKTUtHSjQ3eFZxQ2ZXUysyUXJZdjZZeVZaTGFnMTNjcVhNN3psemNlZDBlenZYZzVLa0FZbVk2MjUyVFV0QjdwMgpaU3lzVjQ5OTlBZVUxNEVDbGwyakIwblZldEJYK1J2blUwWjFxckI1UXN0b2NRanBZTDA1YWM3MHI4TldRTWV0ClVxSUo1RytHUjRvZjZ5Z25YWU1ncndUSmJGYWFpMGIxQWdNQkFBR2pnWU13Z1lBd0R3WURWUjBUQVFIL0JBVXcKQXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPQkJZRUZQZDl4ZjNFNkpvYmQyU245UjJnekwrSApZSnB0TUQ0R0ExVWRJQVEzTURVd013WUVWUjBnQURBck1Da0dDQ3NHQVFVRkJ3SUJGaDFvZEhSd09pOHZkM2QzCkxtTmxjblF1Wm01dGRDNWxjeTlrY0dOekx6QU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUFCNUJLMy9NalR2REQKbkZGbG01d2lvb29NaGZOektXdE4vZ0hpcVF4akFiOEVaNldkbUYvOUFSUDY3SnBpNlliK3RtTFNia3lVKzhCMQpSWHhsRFBpeU44K3NEOCtOYi9rWjk0L3NIdkp3bnZES3VPKzMvM1kzZGx2MmJvanpyMkl5SXBNTk9tcU9GR1lNCkxWTjBWMlVlMWJMZEk0RTdwV1lqSjJjSmorRjNxa1BOWlZFSTdWRlkvdVk1K2N0SGhLUVY4WGE3cE82a084UmYKNzdJemxoRVl0OGxsdmhqaG82VGMraGo1MDd3VG16bDZOTHJUUWZ2Nk1vb3F0eXVHQzJtRE9MN05paTRMY0syTgpKcEx1SHZVQkt3cloxcGViYnVDb0dSdzZJWXNNSGtDdEErZmRabjcxdVNBTkEraVcrWUpGMURuZ29BQmQxNWptCmZaNW5jOE9hS3Zlcmk2RTZGTzgwdkZJT2laaWFCRUNFSFg1RmFaTlh6dXZPK0ZCOFR4eHVCRU9iK2RZN0l4anAKNm83UlRVYU44VHZrYXNxNit5TzNtL3FaQVNsYVdGb3Q0L25VYlE0bXJjRnVOTHd5K0F3RittV2oyenMzZ3lMcAoxdHh5TS8xZDhpQzlkandqMmlqMytSdnJXV1RWM0Y5eWZpRDh6WW0xa0dkTlluby9UcTBkd3puK2V2UW9GdDlCCjlraUFCZGNQVVhtc0VLdlU3QU5tNW1xd3VqR1NRa0JxdmpyVGN1RnFOMVc4ckIyVnQybGg4a09SZE9hZzB3b2sKUnFFSXI5YmFSUm1XMUZNZFc0UjU4TUQzUisrTGo4VUdycDFNWXAzL1JnVDQwOG0yRUNWQWRmNFdxc2xLWUlZdgp1dTh3ZCtSVTRyaUVtVmlBcWhPTFVUcFBTUGFMdHJNPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QW1hem9uIFJvb3QgQ0EgMSBPPUFtYXpvbgojIFN1YmplY3Q6IENOPUFtYXpvbiBSb290IENBIDEgTz1BbWF6b24KIyBMYWJlbDogIkFtYXpvbiBSb290IENBIDEiCiMgU2VyaWFsOiAxNDMyNjY5Nzg5MTY2NTU4NTY4NzgwMzQ3MTIzMTcyMzAwNTQ1MzgzNjk5OTQKIyBNRDUgRmluZ2VycHJpbnQ6IDQzOmM2OmJmOmFlOmVjOmZlOmFkOjJmOjE4OmM2Ojg4OjY4OjMwOmZjOmM4OmU2CiMgU0hBMSBGaW5nZXJwcmludDogOGQ6YTc6Zjk6NjU6ZWM6NWU6ZmM6Mzc6OTE6MGY6MWM6NmU6NTk6ZmQ6YzE6Y2M6NmE6NmU6ZGU6MTYKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDhlOmNkOmU2Ojg4OjRmOjNkOjg3OmIxOjEyOjViOmEzOjFhOmMzOmZjOmIxOjNkOjcwOjE2OmRlOjdmOjU3OmNjOjkwOjRmOmUxOmNiOjk3OmM2OmFlOjk4OjE5OjZlCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEUVRDQ0FpbWdBd0lCQWdJVEJteWZ6NW0vakFvNTR2QjRpa1BtbGpaYnlqQU5CZ2txaGtpRzl3MEJBUXNGCkFEQTVNUXN3Q1FZRFZRUUdFd0pWVXpFUE1BMEdBMVVFQ2hNR1FXMWhlbTl1TVJrd0Z3WURWUVFERXhCQmJXRjYKYjI0Z1VtOXZkQ0JEUVNBeE1CNFhEVEUxTURVeU5qQXdNREF3TUZvWERUTTRNREV4TnpBd01EQXdNRm93T1RFTApNQWtHQTFVRUJoTUNWVk14RHpBTkJnTlZCQW9UQmtGdFlYcHZiakVaTUJjR0ExVUVBeE1RUVcxaGVtOXVJRkp2CmIzUWdRMEVnTVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTEo0Z0hIS2VOWGoKY2E5SGdGQjBmVzdZMTRoMjlKbG85MWdoWVBsMGhBRXZyQUl0aHRPZ1EzcE9zcVRRTnJvQnZvM2JTTWdIRnpaTQo5TzZJSThjKzZ6ZjF0Um40U1dpdzN0ZTVkamdkWVo2ay9vSTJwZVZLVnVSRjRmbjl0QmI2ZE5xY216VTVML3F3CklGQUdiSHJRZ0xLbSthL3NSeG1QVURnSDNLS0hPVmo0dXRXcCtVaG5NSmJ1bEhoZWI0bWpVY0F3aG1haFJXYTYKVk91anc1SDVTTnovMGVnd0xYMHRkSEExMTRnazk1N0VXVzY3YzRjWDhqSkdLTGhEK3JjZHFzcTA4cDhrRGkxTAo5M0ZjWG1uLzZwVUN5emlLcmxBNGI5djdMV0lieGNjZVZPRjM0R2ZJRDV5SEk5WS9RQ0IvSUlERWdFdytPeVFtCmpnU3ViSnJJcWcwQ0F3RUFBYU5DTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUMKQVlZd0hRWURWUjBPQkJZRUZJUVl6SVUwN0x3TWxKUXVDRm1jeDdJUVRnb0lNQTBHQ1NxR1NJYjNEUUVCQ3dVQQpBNElCQVFDWThqZGFRWkNoR3NWMlVTZ2dOaU1PcnVZb3U2cjRsSzVJcERCL0cvd2tqVXUweUtHWDlyYnhlbkRJClU1UE1DQ2pqbUNYUEk2VDUzaUhUZklVSnJVNmFkVHJDQzJxSmVIWkVSeGhsYkkxQmpqdC9tc3YwdGFkUTF3VXMKTitnRFM2M3BZYUFDYnZYeThNV3k3VnUzM1BxVVhIZWVFNlYvVXEyVjh2aVRPOTZMWEZ2S1dsSmJZSzhVOTB2dgpvL3VmUUpWdE1WVDhRdFBIUmg4anJka1BTSENhMlhWNGNkRnlRelIxYmxkWndnSmNKbUFwenlNWkZvNklRNlhVCjVNc0kreU1SUStoREtYSmlvYWxkWGdqVWtLNjQyTTRVd3RCVjhvYjJ4Sk5EZDJaaHdMbm9RZGVYZUdBRGJrcHkKcnFYUmZib1Fub1pzRzRxNVdUUDQ2OFNRdnZHNQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QW1hem9uIFJvb3QgQ0EgMiBPPUFtYXpvbgojIFN1YmplY3Q6IENOPUFtYXpvbiBSb290IENBIDIgTz1BbWF6b24KIyBMYWJlbDogIkFtYXpvbiBSb290IENBIDIiCiMgU2VyaWFsOiAxNDMyNjY5ODI4ODU5NjM1NTE4MTgzNDkxNjA2NTg5MjUwMDY5NzA2NTMyMzkKIyBNRDUgRmluZ2VycHJpbnQ6IGM4OmU1OjhkOmNlOmE4OjQyOmUyOjdhOmMwOjJhOjVjOjdjOjllOjI2OmJmOjY2CiMgU0hBMSBGaW5nZXJwcmludDogNWE6OGM6ZWY6NDU6ZDc6YTY6OTg6NTk6NzY6N2E6OGM6OGI6NDQ6OTY6YjU6Nzg6Y2Y6NDc6NGI6MWEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDFiOmE1OmIyOmFhOjhjOjY1OjQwOjFhOjgyOjk2OjAxOjE4OmY4OjBiOmVjOjRmOjYyOjMwOjRkOjgzOmNlOmM0OjcxOjNhOjE5OmMzOjljOjAxOjFlOmE0OjZkOmI0Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGUVRDQ0F5bWdBd0lCQWdJVEJteWYwcFkxaHA4S0QrV0dlUGhiSnJ1S056QU5CZ2txaGtpRzl3MEJBUXdGCkFEQTVNUXN3Q1FZRFZRUUdFd0pWVXpFUE1BMEdBMVVFQ2hNR1FXMWhlbTl1TVJrd0Z3WURWUVFERXhCQmJXRjYKYjI0Z1VtOXZkQ0JEUVNBeU1CNFhEVEUxTURVeU5qQXdNREF3TUZvWERUUXdNRFV5TmpBd01EQXdNRm93T1RFTApNQWtHQTFVRUJoTUNWVk14RHpBTkJnTlZCQW9UQmtGdFlYcHZiakVaTUJjR0ExVUVBeE1RUVcxaGVtOXVJRkp2CmIzUWdRMEVnTWpDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBSzJXbnkyY1NreEsKZ1hsUm1leUt5MnRnVVJPOFRXMEcvTEFJamQwWkVHckhKZ3cxMk1CdklJVHBsTEdiaFFQRFc5dEs2TWo0a0hiWgpXMC9qVE9nR05rM01tcXc5REpBcmt0UUdHV0NzTjBSNWhZR0NyVm8zNEEzTW5hWk1VbmJxUTUyM0JORlE5bFhnCjFkS21TWVhwTituS2ZxNWNsVTFJbWordUlGcHRpSlhaTkxoU0drT1FzTDlzQmJtMmVMZnEwT1E2UEJKVFl2OUsKOG51K05RV3BFalRqODJSMFlpdzlBRWxhS1A0eVJMdUgzV1VuQW5FNzJrcjNIOXJOOXlGVmtFOFA3SzZDNFo5cgoyVVhUdS9CZmgrMDhMRG1HMmovZTdISlY2M21qcmR2ZGZMQzZITTc4M2s4MWRzOFArSGdmYWpaUlJpZGhXK21lCnovQ2lWWDE4Sllwdkw3VEZ6NFF1Sy8wTlVSQnMrMThidkJ0K3hhNDdtQUV4a3Y4TFYvU2FzcmxYNmF2dkRYYlIKOE83MHpvYW40RzdwdEdtaDMybjJNOFpwTHBjVG5xV0hzRmNRZ1RmSlU3TzdmL2FTMFp6UUdQU1NidHFEVDZaagptVXlsKzE3dklXUjZJRjlzWklVVnl6ZnBZZ3dMS2hiY0FTNHkyajVMOVo0NjloZEFsTytla1FpRytyNWpxRm96CjdNdDBRNVg1YkdsU05zY3BiL3hWQTF3Zis1KzlSK3ZuU1VlVkMwNkpJZ2xKNFBWaEh2Ry9Mb3B5Ym9CWi8xYzYKK1hVeW8wNWY3TzBvWXRsTmMvTE1nUmRnN2MzcjNOdW55c1YrQXIzeVZBaFUvYlF0Q1N3WFZFcVkwVlRoVVdjSQowdTF1Zm04LzBpMkJXU2xteTVBNWxSRWVkQ2YrM2V1dkFnTUJBQUdqUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CCkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdHR01CMEdBMVVkRGdRV0JCU3dEUEJNTVBRRldBSkkvVFBsVXE5TGhPTm0KVWpBTkJna3Foa2lHOXcwQkFRd0ZBQU9DQWdFQXFxaUFqdzU0bytDaTFNM205Wmg2TytvQUE3Q1hEcE84V3FqMgpMSXh5aDZteC9IOXovV054ZUtXSFdjOHc0UTBRc2hOYWJZTDFhdWFBbjZBRkMyamtSMnZIYXQrMi9YY3ljdVVZCitnbjBvSk1zWGRLTWRZVjJaWkFNQTNtM01TTmpyWGlEQ1lab2hNci8rYzhtbXBKNTU4MUx4ZWRocHhmTDg2a1MKazVOcnArZ3ZVNUxFWUZpd3pBSlJHRnVGaldKWlk3YXR0TjZhK3liM0FDZkFYVlUzZEpuSlVIL2pXUzVFNHl3bAo3dXhNTW5lMG54cnBTMTBneGRyOUhJY1d4a1BvMUxzbW1rVndYcWtMTjFQaVJuc24vZUJHOG9tM3pFSzJ5eWdtCmJ0bWx5VHJJUVJOZzkxQ01GYTZ5YlJvVkdsZDQ1cElxMldXUWdqOXNBcSt1RWpvbmxqWUUxeDJpZ0dPcG0vSGwKdXJSOEZMQk95YkVmZEY4NDlsSHFtL29zb2hIVXFTMG5Ha1d4cjdKT2NRM0FXRWJXYVFiTFU4dXovbXRCelVGKwpmVXdQZkhKNWVsbk5Ya29Pckp1cG1ITjVmTFQwekxtNEJ3eXlkRnk0eDIrSW9aQ245S3I1djJjNjlCb1ZZaDYzCm43NDlzU212WjZFUzhsZ1FHVk1ETUJ1NEdvbjJuTDJYQTQ2akNmTWRpeUh4dE4va0hOR2ZaUUlHNmx6V0U3T0UKNzZLbFhJeDNLYWRvd0d1dVFOS290T3JOOEkxTE9Kd1ptaHNvVkxpSmtPL0tkWUUrSHZKa0pNY1lyMDcvUjU0SAo5alZscE5NS1Z2LzFGMlJzNzZnaUpVbVR0dDhBRjlwWWZsM3V4UnV3MGRGZklSREgrZk82QWdvbkI4WHgxc2ZUCjRQc0pZR3c9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1BbWF6b24gUm9vdCBDQSAzIE89QW1hem9uCiMgU3ViamVjdDogQ049QW1hem9uIFJvb3QgQ0EgMyBPPUFtYXpvbgojIExhYmVsOiAiQW1hem9uIFJvb3QgQ0EgMyIKIyBTZXJpYWw6IDE0MzI2Njk4NjY5OTA5MDc2NjI5NDcwMDYzNTM4MTIzMDkzNDc4ODY2NTkzMAojIE1ENSBGaW5nZXJwcmludDogYTA6ZDQ6ZWY6MGI6Zjc6YjU6ZDg6NDk6OTU6MmE6ZWM6ZjU6YzQ6ZmM6ODE6ODcKIyBTSEExIEZpbmdlcnByaW50OiAwZDo0NDpkZDo4YzozYzo4YzoxYToxYTo1ODo3NTo2NDo4MTplOTowZjoyZToyYTpmZjpiMzpkMjo2ZQojIFNIQTI1NiBGaW5nZXJwcmludDogMTg6Y2U6NmM6ZmU6N2I6ZjE6NGU6NjA6YjI6ZTM6NDc6Yjg6ZGY6ZTg6Njg6Y2I6MzE6ZDA6MmU6YmI6M2E6ZGE6Mjc6MTU6Njk6ZjU6MDM6NDM6YjQ6NmQ6YjM6YTQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJ0akNDQVZ1Z0F3SUJBZ0lUQm15ZjFYU1hObVkvT3d1YTJlaWVkZ1B5U2pBS0JnZ3Foa2pPUFFRREFqQTUKTVFzd0NRWURWUVFHRXdKVlV6RVBNQTBHQTFVRUNoTUdRVzFoZW05dU1Sa3dGd1lEVlFRREV4QkJiV0Y2YjI0ZwpVbTl2ZENCRFFTQXpNQjRYRFRFMU1EVXlOakF3TURBd01Gb1hEVFF3TURVeU5qQXdNREF3TUZvd09URUxNQWtHCkExVUVCaE1DVlZNeER6QU5CZ05WQkFvVEJrRnRZWHB2YmpFWk1CY0dBMVVFQXhNUVFXMWhlbTl1SUZKdmIzUWcKUTBFZ016QlpNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDlBd0VIQTBJQUJDbVhwOFpCZjhBTm0rZ0JHMWJHOGxLbAp1aTJ5RXVqU0x0ZjZ5Y1hZcW0wZmM0RTdPNWhyT1h3enBjVk9obzZBRjJoaVJWZDlSRmdkc3pmbFp3anJadDZqClFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdHR01CMEdBMVVkRGdRV0JCU3IKdHR2WEJwNDNyRENHQjVGd3g1ekVHYkY0d0RBS0JnZ3Foa2pPUFFRREFnTkpBREJHQWlFQTRJV1NveGUzamZrcgpCcVdUckJxWWFHRnkrdUdoMFBzY2VHQ21RNW5GdU1RQ0lRQ2NBdS94bEp5emx2bnJ4aXI0dGl6K09wQVVGdGVNCll5UklITjh3ZmRWb093PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUFtYXpvbiBSb290IENBIDQgTz1BbWF6b24KIyBTdWJqZWN0OiBDTj1BbWF6b24gUm9vdCBDQSA0IE89QW1hem9uCiMgTGFiZWw6ICJBbWF6b24gUm9vdCBDQSA0IgojIFNlcmlhbDogMTQzMjY2OTg5NzU4MDgwNzYzOTc0MTA1MjAwNjMwNzYzODc3ODQ5Mjg0ODc4CiMgTUQ1IEZpbmdlcnByaW50OiA4OTpiYzoyNzpkNTplYjoxNzo4ZDowNjo2YTo2OTpkNTpmZDo4OTo0NzpiNDpjZAojIFNIQTEgRmluZ2VycHJpbnQ6IGY2OjEwOjg0OjA3OmQ2OmY4OmJiOjY3Ojk4OjBjOmMyOmUyOjQ0OmMyOmViOmFlOjFjOmVmOjYzOmJlCiMgU0hBMjU2IEZpbmdlcnByaW50OiBlMzo1ZDoyODo0MTo5ZTpkMDoyMDoyNTpjZjphNjo5MDozODpjZDo2MjozOTo2Mjo0NTo4ZDphNTpjNjo5NTpmYjpkZTphMzpjMjoyYjowYjpmYjoyNTo4OTo3MDo5MgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQjhqQ0NBWGlnQXdJQkFnSVRCbXlmMThHN0VFd3BRK1Z4ZTNzc3lCckJEakFLQmdncWhrak9QUVFEQXpBNQpNUXN3Q1FZRFZRUUdFd0pWVXpFUE1BMEdBMVVFQ2hNR1FXMWhlbTl1TVJrd0Z3WURWUVFERXhCQmJXRjZiMjRnClVtOXZkQ0JEUVNBME1CNFhEVEUxTURVeU5qQXdNREF3TUZvWERUUXdNRFV5TmpBd01EQXdNRm93T1RFTE1Ba0cKQTFVRUJoTUNWVk14RHpBTkJnTlZCQW9UQmtGdFlYcHZiakVaTUJjR0ExVUVBeE1RUVcxaGVtOXVJRkp2YjNRZwpRMEVnTkRCMk1CQUdCeXFHU000OUFnRUdCU3VCQkFBaUEySUFCTktyaWpkUG8xTU4vc0dLZTB1b2UwWkxZN0JpCjlpMGIyd2h4SWRJQTZHTzltaWY3OERsdVhlbzlwY21CcXFOYklKaEZYUmJiL2VnUWJlT2M0T085WDRSaTgzQmsKTTZETEpDOXd1b2loS3FCMStJR3VZZ2JFZ2RzNWJpbXdIdm91WEtOQ01FQXdEd1lEVlIwVEFRSC9CQVV3QXdFQgovekFPQmdOVkhROEJBZjhFQkFNQ0FZWXdIUVlEVlIwT0JCWUVGTlBzeHpwbGJzemgybmFhVnZ1Yzg0WnRWK1dCCk1Bb0dDQ3FHU000OUJBTURBMmdBTUdVQ01EcUxJZkc5ZmhHdDBPOVlsaS9XNjUxK2tJMHJ6MlpWd3l6aktLbHcKQ2tjTzhEZFpFdjh0bVpRb1RpcFBOVTB6V2dJeEFPcDFBRTQ3eERxVUVwSEpXRWFkSVJOeXA0aWNpdVJNU3R1VwoxS3lMYTJ0SkVsTXpyZGZrdmlUOHRRcDIxS1c4RUE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049THV4VHJ1c3QgR2xvYmFsIFJvb3QgMiBPPUx1eFRydXN0IFMuQS4KIyBTdWJqZWN0OiBDTj1MdXhUcnVzdCBHbG9iYWwgUm9vdCAyIE89THV4VHJ1c3QgUy5BLgojIExhYmVsOiAiTHV4VHJ1c3QgR2xvYmFsIFJvb3QgMiIKIyBTZXJpYWw6IDU5OTE0MzM4MjI1NzM0MTQ3MTIzOTQxMDU4Mzc2Nzg4MTEwMzA1ODIyNDg5NTIxCiMgTUQ1IEZpbmdlcnByaW50OiBiMjplMTowOTowMDo2MTphZjpmNzpmMTo5MTo2ZjpjNDphZDo4ZDo1ZTozYjo3YwojIFNIQTEgRmluZ2VycHJpbnQ6IDFlOjBlOjU2OjE5OjBhOmQxOjhiOjI1Ojk4OmIyOjA0OjQ0OmZmOjY2OjhhOjA0OjE3Ojk5OjVmOjNmCiMgU0hBMjU2IEZpbmdlcnByaW50OiA1NDo0NTo1Zjo3MToyOTpjMjowYjoxNDo0NzpjNDoxODpmOTo5NzoxNjo4ZjoyNDpjNTo4ZjpjNTowMjozYjpmNTpkYTo1YjplMjplYjo2ZToxZDpkODo5MDoyZTpkNQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRnd6Q0NBNnVnQXdJQkFnSVVDbjZtMzB0RW50cHFKSVdlNXJnVjB4Wi91N0V3RFFZSktvWklodmNOQVFFTApCUUF3UmpFTE1Ba0dBMVVFQmhNQ1RGVXhGakFVQmdOVkJBb01EVXgxZUZSeWRYTjBJRk11UVM0eEh6QWRCZ05WCkJBTU1Ga3gxZUZSeWRYTjBJRWRzYjJKaGJDQlNiMjkwSURJd0hoY05NVFV3TXpBMU1UTXlNVFUzV2hjTk16VXcKTXpBMU1UTXlNVFUzV2pCR01Rc3dDUVlEVlFRR0V3Sk1WVEVXTUJRR0ExVUVDZ3dOVEhWNFZISjFjM1FnVXk1QgpMakVmTUIwR0ExVUVBd3dXVEhWNFZISjFjM1FnUjJ4dlltRnNJRkp2YjNRZ01qQ0NBaUl3RFFZSktvWklodmNOCkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFOZUZsNzhSbU9ud1lvTk1QSWY1VTJvM0MvSVBQSWZPYjl3bUtiM0YKaWJySmd6MzM3c3BieG0xSmM3VEpScU1iTkJNL3dZbEZWL1Rac2ZzMlpVdjdDT0pJY1JISWJqdWVuZCtKWlRlbQpoZlk3UkJpMnhqY3dZa1NTbDJsOVFqQWs1QTBNaVd0ajNzWGgzMDZwRkd4VDRHSE85aGN2SFR5OTVpSk1IWlAxCkVNU2hkdXhxM3NWczM1YTBWa0JDd0dLU01LRXRGWlNnMGlBR0NXNXFiZVhydDc3VThQRVZmSXZtVHJvVHpFc24KWHBrOEYxMlBnWDh6UFUvVFB4dnNYRC93UEV4MWJ2S20xWjNhTFFkakFzWnk2WlM4VEVtVlQ0aFN5TnZvYVlMNAp6RFJiSXZDR3A0bTlTQXB0Wm9GdHlNaGsrd0hoOU9IZTJaN2QyMXZVS3BrbUZSc2VUSklwZ3A3VmtvR1NRWEFaCjk2VGxrMHU4ZDJjeDNSejlNWEFORjVrTStRdzVHU29YdFRCeFZkVVBybGpoUFM4MG04K2Y5bmlGd3BONmNqNW0KajV3V0VXQ1Bub2x2Wjc3Z1IxbzdESnBuaTg5R3hxNDRvL0tudk9iV2hXc3pKSEFpUzhzSW03dkkrQUlwSGI0ZwpERWEvYTRlYnN5cG1RalZHYktxNnJmbVllK2xRVlJReHY3SGFMZTJBcldnaysybXIySEVUTU9abnM0ZEEvWWwrCjhrUFJFZDh2WlM5a3psOFV1YkcvTWIySGVGcFpaWWlxL0ZreVNJYldUTGtwUzVYVGR2TjNKVzFDSERpRFRmMmoKWDV0L0xheDVHdzVDTVpkanBQdUthZFVpRFRTUU1DNm90T0J0dHBTc3ZJdE8xM0Q4eFRpT1pDWGhUVG1RenNtSApoRmh4QWdNQkFBR2pnYWd3Z2FVd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pCQ0JnTlZIU0FFT3pBNU1EY0dCeXVCCkt3RUJBUW93TERBcUJnZ3JCZ0VGQlFjQ0FSWWVhSFIwY0hNNkx5OXlaWEJ2YzJsMGIzSjVMbXgxZUhSeWRYTjAKTG14MU1BNEdBMVVkRHdFQi93UUVBd0lCQmpBZkJnTlZIU01FR0RBV2dCVC9HQ2gyK1VnRkxLR3U4U3NiSzdKVAorRXQ4c3pBZEJnTlZIUTRFRmdRVS94Z29kdmxJQlN5aHJ2RXJHeXV5VS9oTGZMTXdEUVlKS29aSWh2Y05BUUVMCkJRQURnZ0lCQUdvWkZPMXVlY0VzaDlRTmNIN1g5bmpKQ3dST3hMSE9rM0Qrc0ZUQU1zMlpNR1FYdncvbDRqUDkKQnpaQWNnNGF0bXBaMWdEbGFDRGRMbklOSDJwa01TQ0VmVW1tV2pmclJjbUY5ZFRIRjVrSDVwdFY1QXpvcWJUTwpqRnUxRVZ6UGlnNE4xcXgzZ2Y0eW5DU2VjczVVODlCdm9sYlc3TU0zTEdWWXZsY0FHdkkxK3V0N01WM0N3Ukk5CmxvR0lsb25CV1Z4NjVuOXdOT2VENHJIaDRiaFk3OVNWNUdDYzhKYVhjb3pyaEFJdVpZK2t0OUovWjkzSTA1NWMKcXFta29DVVVCcHZzVDM0dEMzOGRkZkV6Mk8zT3VIVnRQbHU1bUIweERWYllRdzh3a2JJRWE5MVd2cFdBVldlKwoyTTJEMlJqdUxnK0dMWktlY0JQczNsSEpRM2dDcFUzSStWL0VrVmhHRm5kYWRLcEF2QWVmTUxteDl4SVgzZVAvCkpFQWRlbXJSVHhnS3FwQWQ2MEFlMzZFZVJKSVFtdktONGRGTFJwN29SVUtYNmtXWjgreG0xUUw2OHFaS0pLcmUKenJuSytUK1RiL21qdXVxbFBwbXQvZjk3bWZWbDd2QlpLR2ZYa0pXa0U0U3BoTUhvenM1MWsyTWF2RHpxMVdRZgpMU29TT2NiRFdqTHRSNUVXRHJ3NHdWRGVqOG9xa0RRYzdrR1VuRjRaTHZoRlNabDBrYkFFYitNRVdyR3JLcXYrCng5Q1d0dHJoU21RR2JtQk52VUpPLzNqYUpNb2J0TmVXT1d5dThRNnFwMzFJaXlCTXoyVFd1SmRHc0U3UktsWTYKb0pPOXI0QWs0QXArNThyVnl1aUZWZHcyS3VHVWFKUEhabkpFRDRBaE1td2x4eU9BZ3dycgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxIE89VHVya2l5ZSBCaWxpbXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLIE9VPUthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBTTQojIFN1YmplY3Q6IENOPVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3VydW0gMSBPPVR1cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmFzdGlybWEgS3VydW11IC0gVFVCSVRBSyBPVT1LYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00KIyBMYWJlbDogIlRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3VydW0gMSIKIyBTZXJpYWw6IDEKIyBNRDUgRmluZ2VycHJpbnQ6IGRjOjAwOjgxOmRjOjY5OjJmOjNlOjJmOmIwOjNiOmY2OjNkOjVhOjkxOjhlOjQ5CiMgU0hBMSBGaW5nZXJwcmludDogMzE6NDM6NjQ6OWI6ZWM6Y2U6Mjc6ZWM6ZWQ6M2E6M2Y6MGI6OGY6MGQ6ZTQ6ZTg6OTE6ZGQ6ZWU6Y2EKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDQ2OmVkOmMzOjY4OjkwOjQ2OmQ1OjNhOjQ1OjNmOmIzOjEwOjRhOmI4OjBkOmNhOmVjOjY1OjhiOjI2OjYwOmVhOjE2OjI5OmRkOjdlOjg2Ojc5OjkwOjY0Ojg3OjE2Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFWXpDQ0EwdWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUXNGQURDQjBqRUxNQWtHQTFVRUJoTUNWRkl4CkdEQVdCZ05WQkFjVEQwZGxZbnBsSUMwZ1MyOWpZV1ZzYVRGQ01FQUdBMVVFQ2hNNVZIVnlhMmw1WlNCQ2FXeHAKYlhObGJDQjJaU0JVWld0dWIyeHZhbWxySUVGeVlYTjBhWEp0WVNCTGRYSjFiWFVnTFNCVVZVSkpWRUZMTVMwdwpLd1lEVlFRTEV5UkxZVzExSUZObGNuUnBabWxyWVhONWIyNGdUV1Z5YTJWNmFTQXRJRXRoYlhVZ1UwMHhOakEwCkJnTlZCQU1UTFZSVlFrbFVRVXNnUzJGdGRTQlRUU0JUVTB3Z1MyOXJJRk5sY25ScFptbHJZWE5wSUMwZ1UzVnkKZFcwZ01UQWVGdzB4TXpFeE1qVXdPREkxTlRWYUZ3MDBNekV3TWpVd09ESTFOVFZhTUlIU01Rc3dDUVlEVlFRRwpFd0pVVWpFWU1CWUdBMVVFQnhNUFIyVmllbVVnTFNCTGIyTmhaV3hwTVVJd1FBWURWUVFLRXpsVWRYSnJhWGxsCklFSnBiR2x0YzJWc0lIWmxJRlJsYTI1dmJHOXFhV3NnUVhKaGMzUnBjbTFoSUV0MWNuVnRkU0F0SUZSVlFrbFUKUVVzeExUQXJCZ05WQkFzVEpFdGhiWFVnVTJWeWRHbG1hV3RoYzNsdmJpQk5aWEpyWlhwcElDMGdTMkZ0ZFNCVApUVEUyTURRR0ExVUVBeE10VkZWQ1NWUkJTeUJMWVcxMUlGTk5JRk5UVENCTGIyc2dVMlZ5ZEdsbWFXdGhjMmtnCkxTQlRkWEoxYlNBeE1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBcjNVd002cTcKYTlPWkxCSTNoTm1OZTVlQTAyN24vNXRRbFQ2UWxWWkMxeGw4Sm9TTmt2b0JIVG9QNG1RNHQ0eTg2SWo1aXlTcgpMcVAxTitSQWpoZ2xlWU4xSHp2L2JLakZ4bGI0dE8yS1JLT3JiRXo4SGREYzcyaTl6K1NxenZCVjk2STAxSU5yCk4zd2N3djYxQSt4WHpyeTB0Y1h0QUE5VE55cE45RThNZy91R3o4ditqRTY5aC9tbml5RlhuSHJmQTJlSkxKMlgKWWFjUXVGV1FmdzR0SnpoMDMrZjkyazRTNDAwVklnTEk0T0Q4RDYySzE4bFVVTXc3RDhvV2dJVFFVVmJEamxaLwppU0l6TCthRkNyMmxxQnMyM3RQY0xHMDd4eE85V1NNczV1V2s5OWdMN2VxUVFFU29sYnVUMWRDQU5MWkdlQTRmCkFKTkc0ZTdwK2V4UEZ3SURBUUFCbzBJd1FEQWRCZ05WSFE0RUZnUVVaVC9IaW9iR1BOMDhWRncxK0RydFVneEgKVjhnd0RnWURWUjBQQVFIL0JBUURBZ0VHTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFTApCUUFEZ2dFQkFDby80ZkV5anE3aG1GeExYczlySG1vSjBpS3BFc2RlVjMxelZtU0FoSHFUNUFtNUVNMmZLaWZoCkFIZStTTWcxcUlHZjVMZ3N5WDhPc05KTE4xM3F1ZFVMWGpTOTlITXB3KzBtRlp4K0NGT0tXSTNRU3lqZndiUGYKSVBQNTQrTTYzOHljbE5oT1Q4TnJGN2YzY3VpdFpqTzFKVk9yNFBoTXFaMzk4ZzI2cnJuWnFzWnIrWk83cnF1NApsendER3JwRHhwYTVSWEk0czZlaGxqMlJlMzdBSVZOTWgrM3lDMVNWVVpQVklxVU5pdkdURGo1VURyRFl5VTdjCjhqRXlWdXBrK2VxMW5SWm1Rbkx6ZjlPeE1VUDhwSTRYOFcwanE1Um0rSzM3RHdodUppMS9Gd2NKc296N1VNQ2YKbG8zUHR2MEFuVm9VbXI4Q1JQWEJ3cDhpWHFJUG9lTT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUdEQ0EgVHJ1c3RBVVRIIFI1IFJPT1QgTz1HVUFORyBET05HIENFUlRJRklDQVRFIEFVVEhPUklUWSBDTy4sTFRELgojIFN1YmplY3Q6IENOPUdEQ0EgVHJ1c3RBVVRIIFI1IFJPT1QgTz1HVUFORyBET05HIENFUlRJRklDQVRFIEFVVEhPUklUWSBDTy4sTFRELgojIExhYmVsOiAiR0RDQSBUcnVzdEFVVEggUjUgUk9PVCIKIyBTZXJpYWw6IDkwMDk4OTk2NTA3NDAxMjAxODYKIyBNRDUgRmluZ2VycHJpbnQ6IDYzOmNjOmQ5OjNkOjM0OjM1OjVjOjZmOjUzOmEzOmUyOjA4OjcwOjQ4OjFmOmI0CiMgU0hBMSBGaW5nZXJwcmludDogMGY6MzY6Mzg6NWI6ODE6MWE6MjU6YzM6OWI6MzE6NGU6ODM6Y2E6ZTk6MzQ6NjY6NzA6Y2M6NzQ6YjQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGJmOmZmOjhmOmQwOjQ0OjMzOjQ4OjdkOjZhOjhhOmE2OjBjOjFhOjI5Ojc2OjdhOjlmOmMyOmJiOmIwOjVlOjQyOjBmOjcxOjNhOjEzOmI5OjkyOjg5OjFkOjM4OjkzCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGaURDQ0EzQ2dBd0lCQWdJSWZRbVgvdkJINm5vd0RRWUpLb1pJaHZjTkFRRUxCUUF3WWpFTE1Ba0dBMVVFCkJoTUNRMDR4TWpBd0JnTlZCQW9NS1VkVlFVNUhJRVJQVGtjZ1EwVlNWRWxHU1VOQlZFVWdRVlZVU0U5U1NWUloKSUVOUExpeE1WRVF1TVI4d0hRWURWUVFEREJaSFJFTkJJRlJ5ZFhOMFFWVlVTQ0JTTlNCU1QwOVVNQjRYRFRFMApNVEV5TmpBMU1UTXhOVm9YRFRRd01USXpNVEUxTlRrMU9Wb3dZakVMTUFrR0ExVUVCaE1DUTA0eE1qQXdCZ05WCkJBb01LVWRWUVU1SElFUlBUa2NnUTBWU1ZFbEdTVU5CVkVVZ1FWVlVTRTlTU1ZSWklFTlBMaXhNVkVRdU1SOHcKSFFZRFZRUUREQlpIUkVOQklGUnlkWE4wUVZWVVNDQlNOU0JTVDA5VU1JSUNJakFOQmdrcWhraUc5dzBCQVFFRgpBQU9DQWc4QU1JSUNDZ0tDQWdFQTJhTVc4TWgwZEhlYjd6TU5Pd1orVmZ5MVlJOTJoaEpDZlZabVBvaUM3WEpqCkRwNkwzVFFzQWxGUnd4bjlXVlNFeWZGcnMweXc2ZWhHWFRqR29xY3VFVmU2Z2hXaW5JOXRzSmxLQ3ZMcmlYQmoKVG5uRXQxdTlvbDJ4OGtFQ0s2MnBPcVBzZVFyc1h6cmovZStBUEswMG14cXJpQ1o3VnFLQ2hoL3JOWW1EZjErdQpLVTQ5dG03c3JzSHdKNXV1NC9Uczc2NS85NFk5Y25ycnBmdFpUcWZybFl3aU9YbmhMUWlQekx5UnVFSDNGTUVqCnFjT3Rta1ZFczdMWExNM0dLZUpRRUs1Y3k0S09GeGcyZlpmbWlKcXdUVFFKOUN5NVdtWXFzQmVibmg1Mm5VcG0KTVVIZlAvdkZCdThidG40YVJqYjNaR003NHprWUkrZG5kUlRWZFZlU043MithaHNtVVBJMkpnYVF4WEFCWkcxMgpadUdSMjI0SHdHR0FMckl1TDR4d3A5RTdQTE9SNUc2MnhEdHc4bXlTbHduTlIzMFl3UE83bmcvV2k2NEh0bG9QCnpnc01SNmZsUHJpOWZjZWJOYUJobHpwQmRSZk1LNVozS3BJaEh0bVZkaUJuYU04TnZkL1dId2xxbXVMTWMzR2sKTDMwU2dMZFRNRVplUzFTWkQyZkpwY2p5SU1HQzdKMFIzOElDK3hvNzBlMGdtdTlsWkpJUURTcmkzbkR4R0dlQwpqR0hldUx6Ukw1ejdEOUFyN1J0MnVlUTVWZmo0b1IyNHFvQUFUSUxuc244SnVMd3dvQzhOOVZLZWp2ZVNzd29BCkhRQlVsd2Jnc1FmWnh3OWNaWDA4YlZsWDVPMmxqZWxBVTU4VlM2Qng5aG9oNDlwd0JpRllGSWVGZDNtcWdua0MKQXdFQUFhTkNNRUF3SFFZRFZSME9CQllFRk9MSlFKOU56dWlhb1h6UERqOWx4U21JYWhsUk1BOEdBMVVkRXdFQgovd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdHR01BMEdDU3FHU0liM0RRRUJDd1VBQTRJQ0FRRFJTVmZnCnA4eG9XTG9CRHlzWnpZMndZVVdzRWUxalVHbjRIMysrRm8vOW5lc0xxakpIZHRKbkpPMjlmRE15bHlySEJZWm0KRFJkOUZCVWIxT3Y5SDVyMlhwZHB0eG9scEFxemtUOWZOcXlMN0Zlb1B1ZUJpaGhYT1lWMEdrTEg2VnNUWDQvNQpDT21TZEkzMVI5S3JPOWI3ZUdaT05uMzU2WkxwQk43OVNXUDhiZnNVY1pObkwwZEt0N24vSGlwemNFWXd2MXJ5CkwzbWw0WTBNMmZteVl6ZU1OMldGY0dwY1d3bHl1YTFqUExIZCtQd3l2emVHNUx1T21DZCt1aDhXNFhBUjhnUGYKSldJeUp5WVlNb1NmL3dBNkU3cWFUZlJQdUJSd0lySEtLNURPS2NGdzlDK2RmL0tRSHRaYTM3ZEcvT2FHK3N2ZwpJSFo2dXFiTDlYemVZcVd4aSs3ZWdtYUtUam93SHorQXk2MG51Z3hlMTlDeFZzcDNjYksxZGFGUXFVQkRGOElvCjJjOVNpMXZJWTlSQ1BxQXpla1l1OXdvZ1JsUithazh4OFlGK1FuUTRaWE1uN3NaOHVJN1hwVHJYbUtHY2pCQlYKMDl0TDdFQ1E4czF1VjlKaURueFhrN0duYmMyZGc3c3E1K1cyTzNGWXJmM1JSYnhha2U1VEZXL1RSUWwxYnJxUQpYUjRFenpmZkhxaG1zWXptSUdydi9FaE9kSmhDcnlsdkxtckgrMzNSWmpFaXpJWUFmbWFEREVMMHZUU1N3eHJxClQ4cCtjazBMY0l5bVNMdW1vUlQyKzFoRW1SU3VxZ3VUYWFBcEpVcWx5eXZkaW1ZSEZuZ1ZWM0ViN1BWSGhQT2UKTVRkNjFYOGtyZVM4L2YzTWJvUG9ES2kzUVd3SDNiMDhocGN2MGc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VHJ1c3RDb3IgUm9vdENlcnQgQ0EtMSBPPVRydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLiBPVT1UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkKIyBTdWJqZWN0OiBDTj1UcnVzdENvciBSb290Q2VydCBDQS0xIE89VHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuIE9VPVRydXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eQojIExhYmVsOiAiVHJ1c3RDb3IgUm9vdENlcnQgQ0EtMSIKIyBTZXJpYWw6IDE1NzUyNDQ0MDk1ODExMDA2NDg5CiMgTUQ1IEZpbmdlcnByaW50OiA2ZTo4NTpmMTpkYzoxYTowMDpkMzoyMjpkNTpiMjpiMjphYzo2YjozNzowNTo0NQojIFNIQTEgRmluZ2VycHJpbnQ6IGZmOmJkOmNkOmU3OjgyOmM4OjQzOjVlOjNjOjZmOjI2Ojg2OjVjOmNhOmE4OjNhOjQ1OjViOmMzOjBhCiMgU0hBMjU2IEZpbmdlcnByaW50OiBkNDowZTo5Yzo4NjpjZDo4ZjplNDo2ODpjMTo3Nzo2OTo1OTpmNDo5ZTphNzo3NDpmYTo1NDo4Njo4NDpiNjpjNDowNjpmMzo5MDo5Mjo2MTpmNDpkYzplMjo1Nzo1YwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRU1EQ0NBeGlnQXdJQkFnSUpBTnFiN0hIekE3QVpNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1JR2tNUXN3Q1FZRApWUVFHRXdKUVFURVBNQTBHQTFVRUNBd0dVR0Z1WVcxaE1SUXdFZ1lEVlFRSERBdFFZVzVoYldFZ1EybDBlVEVrCk1DSUdBMVVFQ2d3YlZISjFjM1JEYjNJZ1UzbHpkR1Z0Y3lCVExpQmtaU0JTTGt3dU1TY3dKUVlEVlFRTERCNVUKY25WemRFTnZjaUJEWlhKMGFXWnBZMkYwWlNCQmRYUm9iM0pwZEhreEh6QWRCZ05WQkFNTUZsUnlkWE4wUTI5eQpJRkp2YjNSRFpYSjBJRU5CTFRFd0hoY05NVFl3TWpBME1USXpNakUyV2hjTk1qa3hNak14TVRjeU16RTJXakNCCnBERUxNQWtHQTFVRUJoTUNVRUV4RHpBTkJnTlZCQWdNQmxCaGJtRnRZVEVVTUJJR0ExVUVCd3dMVUdGdVlXMWgKSUVOcGRIa3hKREFpQmdOVkJBb01HMVJ5ZFhOMFEyOXlJRk41YzNSbGJYTWdVeTRnWkdVZ1VpNU1MakVuTUNVRwpBMVVFQ3d3ZVZISjFjM1JEYjNJZ1EyVnlkR2xtYVdOaGRHVWdRWFYwYUc5eWFYUjVNUjh3SFFZRFZRUUREQlpVCmNuVnpkRU52Y2lCU2IyOTBRMlZ5ZENCRFFTMHhNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUIKQ2dLQ0FRRUF2NDYzbGVMQ0poSnJNeG5IUUZnS3ExbXFqUUNqL0lESFVIdU8xQ0FtdWpJUzJDTlVTU1VRSXBpZApSdExCeVo1T0d5NHNEamp6R2lWb0hLWmFCZVllaTBpL21KWjBQbW5LNmJWNHBRYTgxUUJlQ1FyeUozcFMvQzNWCnNlcTBpV0VrOHhvVDI2blBVdTBNSkxxNW51eCtBSFQ2azYxc0taS3VVYlM3MDFlL3MvT29qWnowSkVzcTFwbWUKOUo3K3dINUNPdWNMbFZQYXQyZ09rRXo3Y0QrUFNpeVU4eWJkWTJtcGxOZ1FUc1ZIQ0pDWkd4ZE51V3h1NzJDVgpFWTRoZ0xXOW9IUFkwTEozeEVYcVdpYjdabloyK0FZZllXMFBWY1dEdHhCV2NnWUhwZk94R2dNRlpBNmRXb3JXCmhuQWJKTjcrS0lvcjBHcXcvSHFpM0xKNURvdGxEd0lEQVFBQm8yTXdZVEFkQmdOVkhRNEVGZ1FVN210SlBIby8KRGVPeENiZUt5S3NabjNNelVPY3dId1lEVlIwakJCZ3dGb0FVN210SlBIby9EZU94Q2JlS3lLc1puM016VU9jdwpEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVlZd0RRWUpLb1pJaHZjTkFRRUxCUUFECmdnRUJBQ1VZMUpHUEUrNlBIaDBSVTlvdFJDa1pvQjVyTVo1TkRwNnRQVnhCYjVVckpLRjVtRG80TnZ1N1pwNUkKLzVDUTd6M1V1SnUwaDNVL0lKdk9jcytoVmNGTlpLSVpCcUVITXd3TEtlWHg2cXVqN0xVS2RKREhmWEx5MTF5ZgprZStSaTdmYzdXYWl6NDVtTzd5Zk9nTGdKOTBXbU1DVjFBcWs1SUdhZFpRMW5KQmZpRGNHclZtVkNyRFJaOU1aCnlvbm5NbG8ySEQ2Q3FGcVR2c2JRWkpHMno5bTJHTS9iZnRKbG82YkVqaGN4d2Z0K2R0dlRoZU5Zc25kNmRqdHMKTDFBYzU5djJaM2tmOVlLVm1nZW5GSytQM0NnaFp3blMxazFhSEJrY2puZGN3NVFrUFRKclMzN1VlSlNEdmpkTgp6bC9ISGs0ODRJa3psUXNQcFRMV1BGcDVMQms9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1UcnVzdENvciBSb290Q2VydCBDQS0yIE89VHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuIE9VPVRydXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eQojIFN1YmplY3Q6IENOPVRydXN0Q29yIFJvb3RDZXJ0IENBLTIgTz1UcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4gT1U9VHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5CiMgTGFiZWw6ICJUcnVzdENvciBSb290Q2VydCBDQS0yIgojIFNlcmlhbDogMjcxMTY5NDUxMDE5OTEwMTY5OAojIE1ENSBGaW5nZXJwcmludDogYTI6ZTE6Zjg6MTg6MGI6YmE6NDU6ZDU6Yzc6NDE6MmE6YmI6Mzc6NTI6NDU6NjQKIyBTSEExIEZpbmdlcnByaW50OiBiODpiZTo2ZDpjYjo1NjpmMTo1NTpiOTo2MzpkNDoxMjpjYTo0ZTowNjozNDpjNzo5NDpiMjoxYzpjMAojIFNIQTI1NiBGaW5nZXJwcmludDogMDc6NTM6ZTk6NDA6Mzc6OGM6MWI6ZDU6ZTM6ODM6NmU6Mzk6NWQ6YWU6YTU6Y2I6ODM6OWU6NTA6NDY6ZjE6YmQ6MGU6YWU6MTk6NTE6Y2Y6MTA6ZmU6Yzc6Yzk6NjUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUdMekNDQkJlZ0F3SUJBZ0lJSmFIZnlqUExXUUl3RFFZSktvWklodmNOQVFFTEJRQXdnYVF4Q3pBSkJnTlYKQkFZVEFsQkJNUTh3RFFZRFZRUUlEQVpRWVc1aGJXRXhGREFTQmdOVkJBY01DMUJoYm1GdFlTQkRhWFI1TVNRdwpJZ1lEVlFRS0RCdFVjblZ6ZEVOdmNpQlRlWE4wWlcxeklGTXVJR1JsSUZJdVRDNHhKekFsQmdOVkJBc01IbFJ5CmRYTjBRMjl5SUVObGNuUnBabWxqWVhSbElFRjFkR2h2Y21sMGVURWZNQjBHQTFVRUF3d1dWSEoxYzNSRGIzSWcKVW05dmRFTmxjblFnUTBFdE1qQWVGdzB4TmpBeU1EUXhNak15TWpOYUZ3MHpOREV5TXpFeE56STJNemxhTUlHawpNUXN3Q1FZRFZRUUdFd0pRUVRFUE1BMEdBMVVFQ0F3R1VHRnVZVzFoTVJRd0VnWURWUVFIREF0UVlXNWhiV0VnClEybDBlVEVrTUNJR0ExVUVDZ3diVkhKMWMzUkRiM0lnVTNsemRHVnRjeUJUTGlCa1pTQlNMa3d1TVNjd0pRWUQKVlFRTERCNVVjblZ6ZEVOdmNpQkRaWEowYVdacFkyRjBaU0JCZFhSb2IzSnBkSGt4SHpBZEJnTlZCQU1NRmxSeQpkWE4wUTI5eUlGSnZiM1JEWlhKMElFTkJMVEl3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLCkFvSUNBUUNuSUc3Q0txSmlKSldRZHNnNGZvRFNxOEdiWlFXVTlNRUtFTlVDck8yZms4ZUh5TEFuSzBJTVBRbysKUVZxZWRkMk55dUNiN0dneXBHbVNhSXdMZ1E1V29ENGEzU3dsRklJdmw5TmtSdlJVcWR3NlZDMHhLNW1DOHRrcQoxKzl4QUxneHBMNTZKQWZEUWlEeWl0U1NCQnRsVmt4czFQdTJZVnBISTdUWWFiUzNPdEIwUEF4MW9ZeE9kcUhwCjJ5cWxPL3JPc1A5K2FpajlKeHpJc2VrcDhWZHVaTFRRd1JWdERyNHVEa2JJWHZSUi91OE9Zem83Y2JyUGIxbksKRE9PYlhVbTRUT0pYc1ppS1FsZWNkdS92dmRGb3FOTDBDYnQzTmI0bGdnakVGaXhFSUZhcFJCRjM3MTIwSGFwZQphejZMTXZZSEwxY0Vrc3IxL3AzQzZlaXpqa3hMQWpIWjVEeElnaWYzR0lKMlNEcHhzUk9oT2RVdXhUVENIV0tGCjN3UCtUZlN2UGQ5Y1c0MzZjT0dsZmlmSGhpNXFqeExHaEY1RFVWQ2NHWnQ0NXZ6MjdVZCtlejFtN3hNVGlGODgKb1dQNytheUhOWi96Z3A2a1B3cWNNV21MbWFTSVNvNXVaazN2RnNRUGVTZ2hZQTJGRm4zWFZEanhrbGI5dFROTQpnOXpYRUo5TC9jYjRRcjI2ZkhNQzRQOTl6VnZoMUt4aGUxZlZTbnRiMUlWWUoxMi8rQ3RncktBbXJoUWhKOFozCm1qT0FQRjVHUC9mRHNhT0dNOGJvWGcyNU5TeXFSc0dGQW5XQW9Pc2sreFdxNUdkL2JuYy85QVNLTDN4NzR4ZGgKOE4wSnFTREl2Z21rMEg1RXc3SXdTamlxcWV3WW1nZUNLOXU0bkJpdDJ1QkdGNnpQWFFJREFRQUJvMk13WVRBZApCZ05WSFE0RUZnUVUyZjRoUUc2VW5yeWJQWng5bUNBWjVZd3dZckl3SHdZRFZSMGpCQmd3Rm9BVTJmNGhRRzZVCm5yeWJQWng5bUNBWjVZd3dZckl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FZWXcKRFFZSktvWklodmNOQVFFTEJRQURnZ0lCQUo1Rm5ndzd0dS9oT3NoODBRQTl6K0xxQnJXeU9yc0dTMmg2MENPWApkS2NzOEFqWWVWclhXb1NLMkJLYUc5bDlYRTF3eGFYNXErV2ppWW5kQWZyczNmbnBrcGZic0VaQzg5TmlxcFgrCk1XY1VhVmlRQ3FvTDdqY2p4MUJSdFBWK251Tjc5K1RNUWpJdFNRekwvMGtNbXg0MC9XNXVsb3A1QTdadjJ3bkwKL1Y5bEZEZmhPUFh6WVJaWTVMVnREUXNFR3o5UUxYK3p4M29hRm9CZytJb2Y2UnNxeHZtNkFScHB2OUpZeDFSWApDSS9oT1dCM1M2eFpoQnFJOGQzTFQzalg1K0V6TGZ6dVFmb2dzTDdMOXppVXdPSFFoUSs3N1N4enErMytrbllhClpIOWJEVE1KQnpON0JqOFJwRnh3UElYQXorT1FxSU4zK3R2bXhZeG9aeEJucFZJdDhNU1pqMysvMFd2aXRVZlcKMmRDRm1VMlVtdzlMamU0QVdrY2RFUU9zUVJpdmg3ZHZERHFQeXMvY0E4R2lDY2psL1lCZXlHQkNBUnNhVTFxNwpONmEzdkxxRTZSNXNHdFJrMnRSRC9wT0xTL0lzZVJZUTFKTUxpSStoMklZVVJwRkhteWdrNzFkU1RseENuS3IzClNld242RUFlczZhSkluS2M5UTB6dEZpak1EdmQxR3BVazc0YVRmT1RsUGY4aEFzL2hDQmNOQU5FeGRxdHZBckIKQXM4ZTVaVFo4NDViMkV6d25leGhGN3NVTWxRTUFpbVRIcEtHOW4vdjU1SUZEbG5kbVFndUx2cWNBRkxUeFdZcAo1S2VYUktRT0tJRVROY1gyYjJUbVFjVFZMOHcwUlNYUFFRQ1dQVW91d3BhWVQwNUtuSmUzMngrU01zai9EMUZ1CjF1d0oKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVRydXN0Q29yIEVDQS0xIE89VHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuIE9VPVRydXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eQojIFN1YmplY3Q6IENOPVRydXN0Q29yIEVDQS0xIE89VHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuIE9VPVRydXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eQojIExhYmVsOiAiVHJ1c3RDb3IgRUNBLTEiCiMgU2VyaWFsOiA5NTQ4MjQyOTQ2OTg4NjI1OTg0CiMgTUQ1IEZpbmdlcnByaW50OiAyNzo5MjoyMzoxZDowYTpmNTo0MDo3YzplOTplNjo2Yjo5ZDpkODpmNTplNzo2YwojIFNIQTEgRmluZ2VycHJpbnQ6IDU4OmQxOmRmOjk1Ojk1OjY3OjZiOjYzOmMwOmYwOjViOjFjOjE3OjRkOjhiOjg0OjBiOmM4Ojc4OmJkCiMgU0hBMjU2IEZpbmdlcnByaW50OiA1YTo4ODo1ZDpiMTo5YzowMTpkOToxMjpjNTo3NTo5Mzo4ODo5Mzo4YzphZjpiYjpkZjowMzoxYTpiMjpkNDo4ZTo5MTplZToxNTo1ODo5Yjo0Mjo5NzoxZDowMzo5YwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUlEQ0NBd2lnQXdJQkFnSUpBSVNDTEY4Y1l0QkFNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1JR2NNUXN3Q1FZRApWUVFHRXdKUVFURVBNQTBHQTFVRUNBd0dVR0Z1WVcxaE1SUXdFZ1lEVlFRSERBdFFZVzVoYldFZ1EybDBlVEVrCk1DSUdBMVVFQ2d3YlZISjFjM1JEYjNJZ1UzbHpkR1Z0Y3lCVExpQmtaU0JTTGt3dU1TY3dKUVlEVlFRTERCNVUKY25WemRFTnZjaUJEWlhKMGFXWnBZMkYwWlNCQmRYUm9iM0pwZEhreEZ6QVZCZ05WQkFNTURsUnlkWE4wUTI5eQpJRVZEUVMweE1CNFhEVEUyTURJd05ERXlNekl6TTFvWERUSTVNVEl6TVRFM01qZ3dOMW93Z1p3eEN6QUpCZ05WCkJBWVRBbEJCTVE4d0RRWURWUVFJREFaUVlXNWhiV0V4RkRBU0JnTlZCQWNNQzFCaGJtRnRZU0JEYVhSNU1TUXcKSWdZRFZRUUtEQnRVY25WemRFTnZjaUJUZVhOMFpXMXpJRk11SUdSbElGSXVUQzR4SnpBbEJnTlZCQXNNSGxSeQpkWE4wUTI5eUlFTmxjblJwWm1sallYUmxJRUYxZEdodmNtbDBlVEVYTUJVR0ExVUVBd3dPVkhKMWMzUkRiM0lnClJVTkJMVEV3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRFBqK0FSdForb2RuYmIKM3c5VTczTmpLWUt0UjhhamErMytYelA0UTFIcEdqT1JNUmVnZE1UVXB3SG1zcEkrYXAzdER2bDBtRURUUHdPQQpCb0pBNkxIaXAxR25IWU1tYTZ2ZStoZVJLOWpHckI2eG5oa0IxWmVtNmcyM3hGVWZKM3pTQ05WMkh5a1ZoMEE1CjNUaEZFWFhRbXFjMDRML055RklkdVVkK0RiaTd4Z3oyYzFjV1duNURrUjlWT3NadFJBU3FuS21jcDB5SkY0T3UKb3dSZVVvQ0xIaElsRVJuWERIMTlNVVJCNnR1dnNCenZnZEFzeFpvaG16M3RRanRRSnZMc3puRmhCbUloVkU1Lwp3WjArZnlDTWdNc3EySmRpeUlNemtYMndvbG9QVitnN3pQSWxzdFI4TCt4TnhxRTZGWHJudGwwMTlmWklTalpGClp0UzZtRmpCQWdNQkFBR2pZekJoTUIwR0ExVWREZ1FXQkJSRW5rajF6RzFJMUtCTGYvNVpKQytEbDVtYWhqQWYKQmdOVkhTTUVHREFXZ0JSRW5rajF6RzFJMUtCTGYvNVpKQytEbDVtYWhqQVBCZ05WSFJNQkFmOEVCVEFEQVFILwpNQTRHQTFVZER3RUIvd1FFQXdJQmhqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUFCVDQxWEJWd204bkhjMkZ2CmNpdlV3by95UTEwQ3pzU1V1WlFSZzJkZDRtZHNkWGEvdXd5cU5zYXRSNU5qM0I1KzF0NHUvdWtaTWpnRGZ4VDIKQUhNc1diRWhCdUg3ckJpVkRLUC9tWmIzS3llYjFTVE1IZDNCT3VDWVJMREU1RDUzc1hPcFpDejJIQUY4UDExRgpoY0NGNXlXUGxkd1g4enlmR202d3l1TWRLdWxNWS9va1lXTFcybjYySEd6MUFoM1VLdDFWa09zcUVVYzhMbDUwCnNvSWlwWDFUSDBYc0o1Rjk1eUlXNk1Cb050akc4VStBUkRMNTRkSFJIYXJlcUt1Y0JLK3RJQTVrbUUybGE4QkkKV0pacFRkd0hqRkdUb3QrZkR6MkxZTFNDamFvSVRtSkY0UGtMMHVEZ1BGdmVYSEVuSmNMbUE0R0xFRlBqeDFXaQp0Si9YNWc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U1NMLmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQSBPPVNTTCBDb3Jwb3JhdGlvbgojIFN1YmplY3Q6IENOPVNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBSU0EgTz1TU0wgQ29ycG9yYXRpb24KIyBMYWJlbDogIlNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBSU0EiCiMgU2VyaWFsOiA4ODc1NjQwMjk2NTU4MzEwMDQxCiMgTUQ1IEZpbmdlcnByaW50OiA4Njo2OToxMjpjMDo3MDpmMTplYzphYzphYzpjMjpkNTpiYzphNTo1YjphMToyOQojIFNIQTEgRmluZ2VycHJpbnQ6IGI3OmFiOjMzOjA4OmQxOmVhOjQ0Ojc3OmJhOjE0OjgwOjEyOjVhOjZmOmJkOmE5OjM2OjQ5OjBjOmJiCiMgU0hBMjU2IEZpbmdlcnByaW50OiA4NTo2Njo2YTo1NjoyZTplMDpiZTo1YzplOToyNTpjMTpkODo4OTowYTo2Zjo3NjphODo3ZTpjMTo2ZDo0ZDo3ZDo1ZjoyOTplYTo3NDoxOTpjZjoyMDoxMjozYjo2OQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRjNUQ0NBOFdnQXdJQkFnSUlleXliMHhhQU1wa3dEUVlKS29aSWh2Y05BUUVMQlFBd2ZERUxNQWtHQTFVRQpCaE1DVlZNeERqQU1CZ05WQkFnTUJWUmxlR0Z6TVJBd0RnWURWUVFIREFkSWIzVnpkRzl1TVJnd0ZnWURWUVFLCkRBOVRVMHdnUTI5eWNHOXlZWFJwYjI0eE1UQXZCZ05WQkFNTUtGTlRUQzVqYjIwZ1VtOXZkQ0JEWlhKMGFXWnAKWTJGMGFXOXVJRUYxZEdodmNtbDBlU0JTVTBFd0hoY05NVFl3TWpFeU1UY3pPVE01V2hjTk5ERXdNakV5TVRjegpPVE01V2pCOE1Rc3dDUVlEVlFRR0V3SlZVekVPTUF3R0ExVUVDQXdGVkdWNFlYTXhFREFPQmdOVkJBY01CMGh2CmRYTjBiMjR4R0RBV0JnTlZCQW9NRDFOVFRDQkRiM0p3YjNKaGRHbHZiakV4TUM4R0ExVUVBd3dvVTFOTUxtTnYKYlNCU2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNUlGSlRRVENDQWlJd0RRWUpLb1pJaHZjTgpBUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBUGtQM2FNcmZjdlFLdjdzWjRXbTV5NGJ1bmZoNC9XdnBPejZTbDJSCnhGZEhheGgzYTNieS9aUGtQUS9DRnA0TFpzTldsSjRYZzRYT1Z1L3lGdjBBWXZVaUNWVG9aUmRPUWJuZ1QwYVgKcWh2SXVHNWlYbW14WDlzcUFuNzhiTXJ6UWRqdDBPajhQMkZJN2JBREZCMFFEa3NaNEx0TzdJWmwvemJ6WG1jQwpDNTJHVldIOWVqanQvdUlaQUxkdm9WQmlkWFE4b1BySUpaSzBibm9peC9nZW9lT3kzWkV4cXlzZEJQK2xTZ1EzCjZZV2tNeXY5NHRaVk5Id1pwRXBveDdLbzA3ZktvWk9JNjhHWHZJejVIZGtpaENSMHh3UTlhcWtwazh6cnVGdmgKL2w4bHFqUll5TUVqVkowYm1CSERPSngrUFlac3BROUFobndDOUZ3Q1R5akxybkdmRHpySU0vNFJKVFhxL0xyRgpZRDNaZkJqVnNxblRkWGdEY2lMS09zTWY3eXpsTHFuNm5peTJVVWI5cndQVzZtQm82b1VXTm11RjZSN0FzOTNFCkpOeUFLb0ZCYlpRK3lPREpnVUVBbmw2L2Y4VUltS0lZTEVKQXMvbHZPQ2RMVG9EMFBZRkg0SWg4Nmh6T3RYVmMKVVM0Y0szOGFjaWpuQUxYUmRNYlg1Sit0QjVPMlV6VTEvRGZrdy9aZEZyNGhjOTZTQ3ZpZ1kycThscEpxUHZpOApaVldiM3ZVTmlTWUUvQ1VhcGlWcHk4SnR5bnppV1YrWHJPdnZMc2k4MXh0WlBDdk04aG5JazJzbll4blAvT2ttCitNcHhtMytUL2pSbmhFNlo2L3l6ZUFremNMcG1wbmJ0RzNQckdxVU54Q0lUSUpSV0NrNHNiRTZ4L2MrY0NicWkKTSsySEFnTUJBQUdqWXpCaE1CMEdBMVVkRGdRV0JCVGRCQWtIb3ZWNmZWSlRFcEtWN2ppQUpRMm1XVEFQQmdOVgpIUk1CQWY4RUJUQURBUUgvTUI4R0ExVWRJd1FZTUJhQUZOMEVDUWVpOVhwOVVsTVNrcFh1T0lBbERhWlpNQTRHCkExVWREd0VCL3dRRUF3SUJoakFOQmdrcWhraUc5dzBCQVFzRkFBT0NBZ0VBSUJnUmxDbjdKcDBjSGg1d1lmR1YKY3BOeEpLMW9rMWlPTXE4YnMzQUQvQ1VyZElXUVBYaHE5TG1McFpjN3RSaVJ1eDZuK1VCYmtmbFZtYThlRWRCYwpIYWRtNDdHVUJ3d3lPYWJxRzdCNTJCMmNjRVRqaXQzRStaVWZpamhEUHdHRnBVZW5QVWF5dk9VaWFQZDduTmdzClBnb2h5QzB6ckwvRmdaa3hkTUYxY2NXK3NmQWpSZlNkYS93Wlk1Mmp2QVRHR0FzbHUxT0pEN09BVU41RjdrUi8KcTVSNFpKalQ5aWpkaDlod1pYVDdEcmtUNjZjUFlha3lsc3pldSsxalRCaTdxVUQzb0ZSdUlJaHhkUmpxZXJRMApjdUFqSjNkY3RwRHFoaVZBcSs4ekQ4dWZncjZpSVB2MnRTMGE1c0tGc1hRUCs4aGxBcVJTQVVmZFNTTEJ2OWpyCmE2eCszdXhqTXhXM0l3aVB4ZytOUVZyZGpzVzVqK1ZGUDNqYnV0SWJRTEgrY1UwLzRJR2l1bDYwN0JYZ2s5MEkKSDM3aFZaa0xJZDZUbmdyNzVxTkp2VFl3L3VkM3NxQjFsN1V0Z1lnWFpTRDMycEFBbjhsU3pETEtOWHoxUFEvWQpLOWYxSm16SkJqU1dGdXB3V1JveWVYa0x0b2gvRDFKSVBiOXMyS0pFTHRGT3QzSlkwNGtUbGY1RXEvalhpeHR1Cm5Md3NvRnZWYWdDdlh6ZmgxZm9RQzVpY2h1Y21qODd3N0c2S1Z3dUE0MDZ5d0tCallaQzZWV2czZEdxMmt0dWYKb1lZaXRtVW5EdXkybjBKZzVHZkN0ZHBCQzhUVGkyRWJ2UG9ma1N2WFJBZGV1aW1zMmNYcDcxTklXdXVBOFNoWQpJYzJ3QmxYN0p6OVRrSENwQkI1WEo3az0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MgTz1TU0wgQ29ycG9yYXRpb24KIyBTdWJqZWN0OiBDTj1TU0wuY29tIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRUNDIE89U1NMIENvcnBvcmF0aW9uCiMgTGFiZWw6ICJTU0wuY29tIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRUNDIgojIFNlcmlhbDogODQ5NTcyMzgxMzI5NzIxNjQyNAojIE1ENSBGaW5nZXJwcmludDogMmU6ZGE6ZTQ6Mzk6N2Y6OWM6OGY6Mzc6ZDE6NzA6OWY6MjY6MTc6NTE6M2E6OGUKIyBTSEExIEZpbmdlcnByaW50OiBjMzoxOTo3YzozOToyNDplNjo1NDphZjoxYjpjNDphYjoyMDo5NTo3YTplMjpjMzowZToxMzowMjo2YQojIFNIQTI1NiBGaW5nZXJwcmludDogMzQ6MTc6YmI6MDY6Y2M6NjA6MDc6ZGE6MWI6OTY6MWM6OTI6MGI6OGE6YjQ6Y2U6M2Y6YWQ6ODI6MGU6NGE6YTM6MGI6OWE6Y2I6YzQ6YTc6NGU6YmQ6Y2U6YmM6NjUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNqVENDQWhTZ0F3SUJBZ0lJZGViZnk4Rm9XNmd3Q2dZSUtvWkl6ajBFQXdJd2ZERUxNQWtHQTFVRUJoTUMKVlZNeERqQU1CZ05WQkFnTUJWUmxlR0Z6TVJBd0RnWURWUVFIREFkSWIzVnpkRzl1TVJnd0ZnWURWUVFLREE5VApVMHdnUTI5eWNHOXlZWFJwYjI0eE1UQXZCZ05WQkFNTUtGTlRUQzVqYjIwZ1VtOXZkQ0JEWlhKMGFXWnBZMkYwCmFXOXVJRUYxZEdodmNtbDBlU0JGUTBNd0hoY05NVFl3TWpFeU1UZ3hOREF6V2hjTk5ERXdNakV5TVRneE5EQXoKV2pCOE1Rc3dDUVlEVlFRR0V3SlZVekVPTUF3R0ExVUVDQXdGVkdWNFlYTXhFREFPQmdOVkJBY01CMGh2ZFhOMApiMjR4R0RBV0JnTlZCQW9NRDFOVFRDQkRiM0p3YjNKaGRHbHZiakV4TUM4R0ExVUVBd3dvVTFOTUxtTnZiU0JTCmIyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNUlFVkRRekIyTUJBR0J5cUdTTTQ5QWdFR0JTdUIKQkFBaUEySUFCRVZ1cVZERXBpTTJubDhvalJmTGxpSmtQOXg2amgzTUNMT2ljU1M2amttNUJCdEhsbGlyTFpYSQo3WjRJTmNnbjY0bU1VMWpyWW9yKzhGc1BhekZTWTBFN2ljM3M3TGFOR2RNMEI5eTd4Z1ovd2tXVjdNdC9xQ1BnCkNlbUIrdk5IMDZOak1HRXdIUVlEVlIwT0JCWUVGSUxSaFhNdzV6VUUwNDRDa3Z2bHBOSEVJZWpOTUE4R0ExVWQKRXdFQi93UUZNQU1CQWY4d0h3WURWUjBqQkJnd0ZvQVVndEdGY3pEbk5RVFRqZ0tTKytXazBjUWg2TTB3RGdZRApWUjBQQVFIL0JBUURBZ0dHTUFvR0NDcUdTTTQ5QkFNQ0EyY0FNR1FDTUcvbjYxa1JwR0RQWWJDV2UrMEYrUzhUCmtkenQ1ZnhRYXhGR1JyTWNJUUJpdTc3RDUrak5CNW41RFF0ZGNqN0VxZ0l3SDd5NkMrSXdKUHQ4YllCVkNwaysKZ0EwejVXYWpzNk83cGRXTGp3a3NwbDErNHZBSENHaHQwbnhwYmwvZjVXcGwKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVNTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBSU0EgUjIgTz1TU0wgQ29ycG9yYXRpb24KIyBTdWJqZWN0OiBDTj1TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyIE89U1NMIENvcnBvcmF0aW9uCiMgTGFiZWw6ICJTU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyIgojIFNlcmlhbDogNjI0ODIyNzQ5NDM1Mjk0MzM1MAojIE1ENSBGaW5nZXJwcmludDogZTE6MWU6MzE6NTg6MWE6YWU6NTQ6NTM6MDI6ZjY6MTc6NmE6MTE6N2I6NGQ6OTUKIyBTSEExIEZpbmdlcnByaW50OiA3NDozYTpmMDo1Mjo5YjpkMDozMjphMDpmNDo0YTo4MzpjZDpkNDpiYTphOTo3Yjo3YzoyZTpjNDo5YQojIFNIQTI1NiBGaW5nZXJwcmludDogMmU6N2I6ZjE6NmM6YzI6MjQ6ODU6YTc6YmI6ZTI6YWE6ODY6OTY6NzU6MDc6NjE6YjA6YWU6Mzk6YmU6M2I6MmY6ZTk6ZDA6Y2M6NmQ6NGU6Zjc6MzQ6OTE6NDI6NWMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUY2ekNDQTlPZ0F3SUJBZ0lJVnJZcHpUUzhlUFl3RFFZSktvWklodmNOQVFFTEJRQXdnWUl4Q3pBSkJnTlYKQkFZVEFsVlRNUTR3REFZRFZRUUlEQVZVWlhoaGN6RVFNQTRHQTFVRUJ3d0hTRzkxYzNSdmJqRVlNQllHQTFVRQpDZ3dQVTFOTUlFTnZjbkJ2Y21GMGFXOXVNVGN3TlFZRFZRUUREQzVUVTB3dVkyOXRJRVZXSUZKdmIzUWdRMlZ5CmRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa2dVbE5CSUZJeU1CNFhEVEUzTURVek1URTRNVFF6TjFvWERUUXkKTURVek1ERTRNVFF6TjFvd2dZSXhDekFKQmdOVkJBWVRBbFZUTVE0d0RBWURWUVFJREFWVVpYaGhjekVRTUE0RwpBMVVFQnd3SFNHOTFjM1J2YmpFWU1CWUdBMVVFQ2d3UFUxTk1JRU52Y25CdmNtRjBhVzl1TVRjd05RWURWUVFECkRDNVRVMHd1WTI5dElFVldJRkp2YjNRZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGtnVWxOQklGSXkKTUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FnOEFNSUlDQ2dLQ0FnRUFqelpsUU9IV1RjRFh0T2xHMm12cQpNMGZOVFBsOWZiNjlMVDN3MjNqaGhxWFp1Z2xYYU8xWFBxRFFDRUdENXloQkpCL2pjaFhRQVJyN1huQWpzc3VmCk9lUFB4VTdHa20wbXhudTdzOW9ublFxRzZZRTNCZjd3Y1hIc3d4enBZNklYRkozdkcyZlRoVlVDQXRaSnljeGEKNGJIM2J6S2Z5ZFE3aUVHb25MM0xxOXR0ZXdrZm9reHlrTm9yQ1B6UFBGVE9adytvejEyV0dRdkU0M0xycmRGOQpIU2Z2a3VzUXYxdnJPNi9QZ04zQjBwWUVXM3ArcEtrOE9IYWtZbzZnT1Y3cWQ4OWRBRm1QWml3K0I2S2pCU1lSCmFaZnFoYmNQbGd0THlFRGhVTG91aXN2M0Q1b2k1MythTnhQTjhrMFRheUhSd013aThxRkc5a1Jwbk1waE5RY0EKYjlaaENCSHF1cmoyNmJOZzVVMjU3SjhVWnNsWFdOdk5oMm40aW9ZU0EwZS9aaE4yckhkOU5DU0ZnODNYcXB5UQpHcDhoTEg5NHQyUzQyT2ltOUhpelZjdUUwakxFZUs2amoySGR6Z2hUcmV5SS9CWGttZzNtbnhwM3preVB1QlFWClBXS2NoamdHQUdZUzVGbDJXbFBBQXBpaUVDdG9SSHVPZWM0elNuYXFXNEVXRzdXSzJOQUFlMTVpdEFuV2htTU8KcGdXVlNib29pNGlUc2pRYzJLUlZicmNjME42WlZUc2o5Q0xnK1NsbUp1d2dVSGZiU2d1UHZ1VUNZSEJCWHRTdQpVRGtpRkNiTHNqdHpkRlZIQjNtQk9hZ3dFMFRsQklxdWxoTWxRZys1VThTYi9NM2tITjQ4K3F2V0Jrb2ZaNmFZCk1CemRMTnZjR0pWWFpzYi9YSXRXOVhjQ0F3RUFBYU5qTUdFd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZkJnTlYKSFNNRUdEQVdnQlQ1WUx2VTQ5VTA5cmoxQm9BbHAzUGJSbW1vbmpBZEJnTlZIUTRFRmdRVStXQzcxT1BWTlBhNAo5UWFBSmFkejIwWnBxSjR3RGdZRFZSMFBBUUgvQkFRREFnR0dNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUNBUUJXCnM0N0xDcDFKanIra3hKRzdaaGNGVVpoMSsrVlFMSHFlOFJUNnE5T0tQditSS1k5amk5aTBxVlFCRGI2VGhpLzUKU20zSFh2VlgrY3BWSEJLK1J3ODJ4ZDlxdDl0MXdrY2xmN254WS9ob0xWVUUwZktOc0tUUHZEeGVIM2pucGFBZwpjTEFFeGJmM2NxZmVJZzI5TXlWR2pHU1NKdU0rTG1PVzJwdU1QZmdZQ2RjRHpIMkdndURLQkFkUlVOZi9rdFVNCjc5cUduNW5YNjdldmFPSTVKcFM2YUxlL2c5UHFlbWM5WW1ldUplVnk2T0xrN0s0Uzlrc3JQSi9wc0VEek9GU3oKL2Jkb3lOckdqMUU4c3Z1UjNCem5tNTNodHcxeWorS2t4S2w0K2VzVXJNWkRCY0psT1NnWUFzT0NzcDBGdm1YdApsbDlsZER6N0NUVXVlNXdUL1JzUFhjZHRnVHBXRDh3NzRhOENMeUtzUnNwR1BLQWNUTlpFdEY0dVhCVm1DZUVtCktmN0dVbUc2c1hQL3d3eWM1V3hxbEQ4VXlrQVdsWVR6V2Ftc1gweGhrMjNSTzh5aWxRd2lwbWRuUkM2NTJkS0sKUWJObUMxcjdmU09sOGhxdy85NmJnNVF1MFQvZmtyZVJyd1U3WmNlZ2JMSE5ZaExEa0J2akpjNDB2RzkzZHJFUQp3L2NGR3NEV3IzUmlTQmQza21tUVlSemVsWUIwVkk4WUhNUHpBOUMvcEVOMWhsTVllZ291Q1J3Mm41SDlnb29pClM5RU9VQ1hkeXdNTUY4bURBQWhPTlUyS2krM3dBcFJtTEVSL3k1VW5saGV0Q1RDc3RuRVhib3NYOWh3SjFDMDcKbUtWeDAxUVQyV0R6OVV0bVQvcng3aUFTamJTc1Y3RkZZNkdzZHFuQyt3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVNTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MgTz1TU0wgQ29ycG9yYXRpb24KIyBTdWJqZWN0OiBDTj1TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRUNDIE89U1NMIENvcnBvcmF0aW9uCiMgTGFiZWw6ICJTU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRUNDIgojIFNlcmlhbDogMzE4MjI0NjUyNjc1NDU1NTI4NQojIE1ENSBGaW5nZXJwcmludDogNTk6NTM6MjI6NjU6ODM6NDI6MDE6NTQ6YzA6Y2U6NDI6Yjk6NWE6N2M6ZjI6OTAKIyBTSEExIEZpbmdlcnByaW50OiA0YzpkZDo1MTphMzpkMTpmNToyMDozMjoxNDpiMDpjNjpjNTozMjoyMzowMzo5MTpjNzo0Njo0Mjo2ZAojIFNIQTI1NiBGaW5nZXJwcmludDogMjI6YTI6YzE6Zjc6YmQ6ZWQ6NzA6NGM6YzE6ZTc6MDE6YjU6ZjQ6MDg6YzM6MTA6ODg6MGY6ZTk6NTY6YjU6ZGU6MmE6NGE6NDQ6Zjk6OWM6ODc6M2E6MjU6YTc6YzgKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNsRENDQWhxZ0F3SUJBZ0lJTENtY1d4YnRCWlV3Q2dZSUtvWkl6ajBFQXdJd2Z6RUxNQWtHQTFVRUJoTUMKVlZNeERqQU1CZ05WQkFnTUJWUmxlR0Z6TVJBd0RnWURWUVFIREFkSWIzVnpkRzl1TVJnd0ZnWURWUVFLREE5VApVMHdnUTI5eWNHOXlZWFJwYjI0eE5EQXlCZ05WQkFNTUsxTlRUQzVqYjIwZ1JWWWdVbTl2ZENCRFpYSjBhV1pwClkyRjBhVzl1SUVGMWRHaHZjbWwwZVNCRlEwTXdIaGNOTVRZd01qRXlNVGd4TlRJeldoY05OREV3TWpFeU1UZ3gKTlRJeldqQi9NUXN3Q1FZRFZRUUdFd0pWVXpFT01Bd0dBMVVFQ0F3RlZHVjRZWE14RURBT0JnTlZCQWNNQjBodgpkWE4wYjI0eEdEQVdCZ05WQkFvTUQxTlRUQ0JEYjNKd2IzSmhkR2x2YmpFME1ESUdBMVVFQXd3clUxTk1MbU52CmJTQkZWaUJTYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1SUVWRFF6QjJNQkFHQnlxR1NNNDkKQWdFR0JTdUJCQUFpQTJJQUJLb1NSNUNZRy92dncwQUhneUJPOFRDQ29nYlI4cEtHWWZMMklXaktBTVRINmtNQQpWSWJjL1IvZkFMaEJZbHpjY0JZeTNoK1oxTXpGQjhnSUgyRVdCMUU5ZlZ3SFUrTTFPSXpmelovWkxnMUt0aGt1ClduQmFCdTIrOEtHd3l0QUpLYU5qTUdFd0hRWURWUjBPQkJZRUZGdktYdVhlMG9HcXphZ3RaRkcyMlhLYmwrWlAKTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SHdZRFZSMGpCQmd3Rm9BVVc4cGU1ZDdTZ2FyTnFDMWtVYmJaY3B1WAo1azh3RGdZRFZSMFBBUUgvQkFRREFnR0dNQW9HQ0NxR1NNNDlCQU1DQTJnQU1HVUNNUUNLNWtDSk4rdnAxUlBaCnl0UnJKUE93UFlkR1dCcnNzZDl2KzFhNmNHdkhPTXpvc1l4UEQvZnhaM1lPZzlBZVVZOENNRDMySXlnbVRNWmcKaDVNbW03STFIcnJXOXp6UkhNNzZKVHltR29FVlcvTVNEMnp1WllySmg2ajVCK0JpbW94Y1NnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpQSwMEFAAAAAAAAAAhAAkTQkdEAwAARAMAACsAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2VydGlmaS9jb3JlLnB5IyEvdXNyL2Jpbi9lbnYgcHl0aG9uCiMgLSotIGNvZGluZzogdXRmLTggLSotCgoiIiIKY2VydGlmaS5weQp+fn5+fn5+fn5+CgpUaGlzIG1vZHVsZSByZXR1cm5zIHRoZSBpbnN0YWxsYXRpb24gbG9jYXRpb24gb2YgY2FjZXJ0LnBlbS4KIiIiCmltcG9ydCBvcwppbXBvcnQgd2FybmluZ3MKCgpjbGFzcyBEZXByZWNhdGVkQnVuZGxlV2FybmluZyhEZXByZWNhdGlvbldhcm5pbmcpOgogICAgIiIiCiAgICBUaGUgd2VhayBzZWN1cml0eSBidW5kbGUgaXMgYmVpbmcgZGVwcmVjYXRlZC4gUGxlYXNlIGJvdGhlciB5b3VyIHNlcnZpY2UKICAgIHByb3ZpZGVyIHRvIGdldCB0aGVtIHRvIHN0b3AgdXNpbmcgY3Jvc3Mtc2lnbmVkIHJvb3RzLgogICAgIiIiCgoKZGVmIHdoZXJlKCk6CiAgICBmID0gb3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKQoKICAgIHJldHVybiBvcy5wYXRoLmpvaW4oZiwgJ2NhY2VydC5wZW0nKQoKCmRlZiBvbGRfd2hlcmUoKToKICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgIlRoZSB3ZWFrIHNlY3VyaXR5IGJ1bmRsZSBoYXMgYmVlbiByZW1vdmVkLiBjZXJ0aWZpLm9sZF93aGVyZSgpIGlzIG5vdyBhbiBhbGlhcyAiCiAgICAgICAgIm9mIGNlcnRpZmkud2hlcmUoKS4gUGxlYXNlIHVwZGF0ZSB5b3VyIGNvZGUgdG8gdXNlIGNlcnRpZmkud2hlcmUoKSBpbnN0ZWFkLiAiCiAgICAgICAgImNlcnRpZmkub2xkX3doZXJlKCkgd2lsbCBiZSByZW1vdmVkIGluIDIwMTguIiwKICAgICAgICBEZXByZWNhdGVkQnVuZGxlV2FybmluZwogICAgKQogICAgcmV0dXJuIHdoZXJlKCkKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICBwcmludCh3aGVyZSgpKQpQSwMEFAAAAAAAAAAhAPDPD1MXBgAAFwYAAC8AAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9fX2luaXRfXy5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKCmZyb20gLmNvbXBhdCBpbXBvcnQgUFkyLCBQWTMKZnJvbSAudW5pdmVyc2FsZGV0ZWN0b3IgaW1wb3J0IFVuaXZlcnNhbERldGVjdG9yCmZyb20gLnZlcnNpb24gaW1wb3J0IF9fdmVyc2lvbl9fLCBWRVJTSU9OCgoKZGVmIGRldGVjdChieXRlX3N0cik6CiAgICAiIiIKICAgIERldGVjdCB0aGUgZW5jb2Rpbmcgb2YgdGhlIGdpdmVuIGJ5dGUgc3RyaW5nLgoKICAgIDpwYXJhbSBieXRlX3N0cjogICAgIFRoZSBieXRlIHNlcXVlbmNlIHRvIGV4YW1pbmUuCiAgICA6dHlwZSBieXRlX3N0cjogICAgICBgYGJ5dGVzYGAgb3IgYGBieXRlYXJyYXlgYAogICAgIiIiCiAgICBpZiBub3QgaXNpbnN0YW5jZShieXRlX3N0ciwgYnl0ZWFycmF5KToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShieXRlX3N0ciwgYnl0ZXMpOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ0V4cGVjdGVkIG9iamVjdCBvZiB0eXBlIGJ5dGVzIG9yIGJ5dGVhcnJheSwgZ290OiAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnezB9Jy5mb3JtYXQodHlwZShieXRlX3N0cikpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGJ5dGVfc3RyID0gYnl0ZWFycmF5KGJ5dGVfc3RyKQogICAgZGV0ZWN0b3IgPSBVbml2ZXJzYWxEZXRlY3RvcigpCiAgICBkZXRlY3Rvci5mZWVkKGJ5dGVfc3RyKQogICAgcmV0dXJuIGRldGVjdG9yLmNsb3NlKCkKUEsDBBQAAAAAAAAAIQA5v4QQFnoAABZ6AAAvAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvYmlnNWZyZXEucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBNb3ppbGxhIENvbW11bmljYXRvciBjbGllbnQgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMgQmlnNSBmcmVxdWVuY3kgdGFibGUKIyBieSBUYWl3YW4ncyBNYW5kYXJpbiBQcm9tb3Rpb24gQ291bmNpbAojIDxodHRwOi8vd3d3LmVkdS50dzo4MS9tYW5kci8+CiMKIyAxMjggIC0tPiAwLjQyMjYxCiMgMjU2ICAtLT4gMC41Nzg1MQojIDUxMiAgLS0+IDAuNzQ4NTEKIyAxMDI0IC0tPiAwLjg5Mzg0CiMgMjA0OCAtLT4gMC45NzU4MwojCiMgSWRlYWwgRGlzdHJpYnV0aW9uIFJhdGlvID0gMC43NDg1MS8oMS0wLjc0ODUxKSA9Mi45OAojIFJhbmRvbSBEaXN0cmlidXRpb24gUmF0aW9uID0gNTEyLyg1NDAxLTUxMik9MC4xMDUKIwojIFR5cGljYWwgRGlzdHJpYnV0aW9uIFJhdGlvIGFib3V0IDI1JSBvZiBJZGVhbCBvbmUsIHN0aWxsIG11Y2ggaGlnaGVyIHRoYW4gUkRSCgpCSUc1X1RZUElDQUxfRElTVFJJQlVUSU9OX1JBVElPID0gMC43NQoKI0NoYXIgdG8gRnJlcU9yZGVyIHRhYmxlCkJJRzVfVEFCTEVfU0laRSA9IDUzNzYKCkJJRzVfQ0hBUl9UT19GUkVRX09SREVSID0gKAogICAxLDE4MDEsMTUwNiwgMjU1LDE0MzEsIDE5OCwgICA5LCAgODIsICAgNiw1MDA4LCAxNzcsIDIwMiwzNjgxLDEyNTYsMjgyMSwgMTEwLCAjICAgMTYKMzgxNCwgIDMzLDMyNzQsIDI2MSwgIDc2LCAgNDQsMjExNCwgIDE2LDI5NDYsMjE4NywxMTc2LCA2NTksMzk3MSwgIDI2LDM0NTEsMjY1MywgIyAgIDMyCjExOTgsMzk3MiwzMzUwLDQyMDIsIDQxMCwyMjE1LCAzMDIsIDU5MCwgMzYxLDE5NjQsICAgOCwgMjA0LCAgNTgsNDUxMCw1MDA5LDE5MzIsICMgICA0OAogIDYzLDUwMTAsNTAxMSwgMzE3LDE2MTQsICA3NSwgMjIyLCAxNTksNDIwMywyNDE3LDE0ODAsNTAxMiwzNTU1LDMwOTEsIDIyNCwyODIyLCAjICAgNjQKMzY4MiwgICAzLCAgMTAsMzk3MywxNDcxLCAgMjksMjc4NywxMTM1LDI4NjYsMTk0MCwgODczLCAxMzAsMzI3NSwxMTIzLCAzMTIsNTAxMywgIyAgIDgwCjQ1MTEsMjA1MiwgNTA3LCAyNTIsIDY4Miw1MDE0LCAxNDIsMTkxNSwgMTI0LCAyMDYsMjk0NywgIDM0LDM1NTYsMzIwNCwgIDY0LCA2MDQsICMgICA5Ngo1MDE1LDI1MDEsMTk3NywxOTc4LCAxNTUsMTk5MSwgNjQ1LCA2NDEsMTYwNiw1MDE2LDM0NTIsIDMzNywgIDcyLCA0MDYsNTAxNywgIDgwLCAjICAxMTIKIDYzMCwgMjM4LDMyMDUsMTUwOSwgMjYzLCA5MzksMTA5MiwyNjU0LCA3NTYsMTQ0MCwxMDk0LDM0NTMsIDQ0OSwgIDY5LDI5ODcsIDU5MSwgIyAgMTI4CiAxNzksMjA5NiwgNDcxLCAxMTUsMjAzNSwxODQ0LCAgNjAsICA1MCwyOTg4LCAxMzQsIDgwNiwxODY5LCA3MzQsMjAzNiwzNDU0LCAxODAsICMgIDE0NAogOTk1LDE2MDcsIDE1NiwgNTM3LDI5MDcsIDY4OCw1MDE4LCAzMTksMTMwNSwgNzc5LDIxNDUsIDUxNCwyMzc5LCAyOTgsNDUxMiwgMzU5LCAjICAxNjAKMjUwMiwgIDkwLDI3MTYsMTMzOCwgNjYzLCAgMTEsIDkwNiwxMDk5LDI1NTMsICAyMCwyNDQxLCAxODIsIDUzMiwxNzE2LDUwMTksIDczMiwgIyAgMTc2CjEzNzYsNDIwNCwxMzExLDE0MjAsMzIwNiwgIDI1LDIzMTcsMTA1NiwgMTEzLCAzOTksIDM4MiwxOTUwLCAyNDIsMzQ1NSwyNDc0LCA1MjksICMgIDE5MgozMjc2LCA0NzUsMTQ0NywzNjgzLDUwMjAsIDExNywgIDIxLCA2NTYsIDgxMCwxMjk3LDIzMDAsMjMzNCwzNTU3LDUwMjEsIDEyNiw0MjA1LCAjICAyMDgKIDcwNiwgNDU2LCAxNTAsIDYxMyw0NTEzLCAgNzEsMTExOCwyMDM3LDQyMDYsIDE0NSwzMDkyLCAgODUsIDgzNSwgNDg2LDIxMTUsMTI0NiwgIyAgMjI0CjE0MjYsIDQyOCwgNzI3LDEyODUsMTAxNSwgODAwLCAxMDYsIDYyMywgMzAzLDEyODEsNTAyMiwyMTI4LDIzNTksIDM0NywzODE1LCAyMjEsICMgIDI0MAozNTU4LDMxMzUsNTAyMywxOTU2LDExNTMsNDIwNywgIDgzLCAyOTYsMTE5OSwzMDkzLCAxOTIsIDYyNCwgIDkzLDUwMjQsIDgyMiwxODk4LCAjICAyNTYKMjgyMywzMTM2LCA3OTUsMjA2NSwgOTkxLDE1NTQsMTU0MiwxNTkyLCAgMjcsICA0MywyODY3LCA4NTksIDEzOSwxNDU2LCA4NjAsNDUxNCwgIyAgMjcyCiA0MzcsIDcxMiwzOTc0LCAxNjQsMjM5NywzMTM3LCA2OTUsIDIxMSwzMDM3LDIwOTcsIDE5NSwzOTc1LDE2MDgsMzU1OSwzNTYwLDM2ODQsICMgIDI4OAozOTc2LCAyMzQsIDgxMSwyOTg5LDIwOTgsMzk3NywyMjMzLDE0NDEsMzU2MSwxNjE1LDIzODAsIDY2OCwyMDc3LDE2MzgsIDMwNSwgMjI4LCAjICAzMDQKMTY2NCw0NTE1LCA0NjcsIDQxNSw1MDI1LCAyNjIsMjA5OSwxNTkzLCAyMzksIDEwOCwgMzAwLCAyMDAsMTAzMywgNTEyLDEyNDcsMjA3OCwgIyAgMzIwCjUwMjYsNTAyNywyMTc2LDMyMDcsMzY4NSwyNjgyLCA1OTMsIDg0NSwxMDYyLDMyNzcsICA4OCwxNzIzLDIwMzgsMzk3OCwxOTUxLCAyMTIsICMgIDMzNgogMjY2LCAxNTIsIDE0OSwgNDY4LDE4OTksNDIwOCw0NTE2LCAgNzcsIDE4Nyw1MDI4LDMwMzgsICAzNywgICA1LDI5OTAsNTAyOSwzOTc5LCAjICAzNTIKNTAzMCw1MDMxLCAgMzksMjUyNCw0NTE3LDI5MDgsMzIwOCwyMDc5LCAgNTUsIDE0OCwgIDc0LDQ1MTgsIDU0NSwgNDgzLDE0NzQsMTAyOSwgIyAgMzY4CjE2NjUsIDIxNywxODcwLDE1MzEsMzEzOCwxMTA0LDI2NTUsNDIwOSwgIDI0LCAxNzIsMzU2MiwgOTAwLDM5ODAsMzU2MywzNTY0LDQ1MTksICMgIDM4NAogIDMyLDE0MDgsMjgyNCwxMzEyLCAzMjksIDQ4NywyMzYwLDIyNTEsMjcxNywgNzg0LDI2ODMsICAgNCwzMDM5LDMzNTEsMTQyNywxNzg5LCAjICA0MDAKIDE4OCwgMTA5LCA0OTksNTAzMiwzNjg2LDE3MTcsMTc5MCwgODg4LDEyMTcsMzA0MCw0NTIwLDUwMzMsMzU2NSw1MDM0LDMzNTIsMTUyMCwgIyAgNDE2CjM2ODcsMzk4MSwgMTk2LDEwMzQsIDc3NSw1MDM1LDUwMzYsIDkyOSwxODE2LCAyNDksIDQzOSwgIDM4LDUwMzcsMTA2Myw1MDM4LCA3OTQsICMgIDQzMgozOTgyLDE0MzUsMjMwMSwgIDQ2LCAxNzgsMzI3OCwyMDY2LDUwMzksMjM4MSw1MDQwLCAyMTQsMTcwOSw0NTIxLCA4MDQsICAzNSwgNzA3LCAjICA0NDgKIDMyNCwzNjg4LDE2MDEsMjU1NCwgMTQwLCA0NTksNDIxMCw1MDQxLDUwNDIsMTM2NSwgODM5LCAyNzIsIDk3OCwyMjYyLDI1ODAsMzQ1NiwgIyAgNDY0CjIxMjksMTM2MywzNjg5LDE0MjMsIDY5NywgMTAwLDMwOTQsICA0OCwgIDcwLDEyMzEsIDQ5NSwzMTM5LDIxOTYsNTA0MywxMjk0LDUwNDQsICMgIDQ4MAoyMDgwLCA0NjIsIDU4NiwxMDQyLDMyNzksIDg1MywgMjU2LCA5ODgsIDE4NSwyMzgyLDM0NTcsMTY5OCwgNDM0LDEwODQsNTA0NSwzNDU4LCAjICA0OTYKIDMxNCwyNjI1LDI3ODgsNDUyMiwyMzM1LDIzMzYsIDU2OSwyMjg1LCA2MzcsMTgxNywyNTI1LCA3NTcsMTE2MiwxODc5LDE2MTYsMzQ1OSwgIyAgNTEyCiAyODcsMTU3NywyMTE2LCA3NjgsNDUyMywxNjcxLDI4NjgsMzU2NiwyNTI2LDEzMjEsMzgxNiwgOTA5LDI0MTgsNTA0Niw0MjExLCA5MzMsICMgIDUyOAozODE3LDQyMTIsMjA1MywyMzYxLDEyMjIsNDUyNCwgNzY1LDI0MTksMTMyMiwgNzg2LDQ1MjUsNTA0NywxOTIwLDE0NjIsMTY3NywyOTA5LCAjICA1NDQKMTY5OSw1MDQ4LDQ1MjYsMTQyNCwyNDQyLDMxNDAsMzY5MCwyNjAwLDMzNTMsMTc3NSwxOTQxLDM0NjAsMzk4Myw0MjEzLCAzMDksMTM2OSwgIyAgNTYwCjExMzAsMjgyNSwgMzY0LDIyMzQsMTY1MywxMjk5LDM5ODQsMzU2NywzOTg1LDM5ODYsMjY1NiwgNTI1LDEwODUsMzA0MSwgOTAyLDIwMDEsICMgIDU3NgoxNDc1LCA5NjQsNDUyNywgNDIxLDE4NDUsMTQxNSwxMDU3LDIyODYsIDk0MCwxMzY0LDMxNDEsIDM3Niw0NTI4LDQ1MjksMTM4MSwgICA3LCAjICA1OTIKMjUyNywgOTgzLDIzODMsIDMzNiwxNzEwLDI2ODQsMTg0NiwgMzIxLDM0NjEsIDU1OSwxMTMxLDMwNDIsMjc1MiwxODA5LDExMzIsMTMxMywgIyAgNjA4CiAyNjUsMTQ4MSwxODU4LDUwNDksIDM1MiwxMjAzLDI4MjYsMzI4MCwgMTY3LDEwODksIDQyMCwyODI3LCA3NzYsIDc5MiwxNzI0LDM1NjgsICMgIDYyNAo0MjE0LDI0NDMsMzI4MSw1MDUwLDQyMTUsNTA1MSwgNDQ2LCAyMjksIDMzMywyNzUzLCA5MDEsMzgxOCwxMjAwLDE1NTcsNDUzMCwyNjU3LCAjICA2NDAKMTkyMSwgMzk1LDI3NTQsMjY4NSwzODE5LDQyMTYsMTgzNiwgMTI1LCA5MTYsMzIwOSwyNjI2LDQ1MzEsNTA1Miw1MDUzLDM4MjAsNTA1NCwgIyAgNjU2CjUwNTUsNTA1Niw0NTMyLDMxNDIsMzY5MSwxMTMzLDI1NTUsMTc1NywzNDYyLDE1MTAsMjMxOCwxNDA5LDM1NjksNTA1NywyMTQ2LCA0MzgsICMgIDY3MgoyNjAxLDI5MTAsMjM4NCwzMzU0LDEwNjgsIDk1OCwzMDQzLCA0NjEsIDMxMSwyODY5LDI2ODYsNDIxNywxOTE2LDMyMTAsNDIxOCwxOTc5LCAjICA2ODgKIDM4MywgNzUwLDI3NTUsMjYyNyw0MjE5LCAyNzQsIDUzOSwgMzg1LDEyNzgsMTQ0Miw1MDU4LDExNTQsMTk2NSwgMzg0LCA1NjEsIDIxMCwgIyAgNzA0CiAgOTgsMTI5NSwyNTU2LDM1NzAsNTA1OSwxNzExLDI0MjAsMTQ4MiwzNDYzLDM5ODcsMjkxMSwxMjU3LCAxMjksNTA2MCwzODIxLCA2NDIsICMgIDcyMAogNTIzLDI3ODksMjc5MCwyNjU4LDUwNjEsIDE0MSwyMjM1LDEzMzMsICA2OCwgMTc2LCA0NDEsIDg3NiwgOTA3LDQyMjAsIDYwMywyNjAyLCAjICA3MzYKIDcxMCwgMTcxLDM0NjQsIDQwNCwgNTQ5LCAgMTgsMzE0MywyMzk4LDE0MTAsMzY5MiwxNjY2LDUwNjIsMzU3MSw0NTMzLDI5MTIsNDUzNCwgIyAgNzUyCjUwNjMsMjk5MSwgMzY4LDUwNjQsIDE0NiwgMzY2LCAgOTksIDg3MSwzNjkzLDE1NDMsIDc0OCwgODA3LDE1ODYsMTE4NSwgIDIyLDIyNjMsICMgIDc2OAogMzc5LDM4MjIsMzIxMSw1MDY1LDMyMTIsIDUwNSwxOTQyLDI2MjgsMTk5MiwxMzgyLDIzMTksNTA2NiwgMzgwLDIzNjIsIDIxOCwgNzAyLCAjICA3ODQKMTgxOCwxMjQ4LDM0NjUsMzA0NCwzNTcyLDMzNTUsMzI4Miw1MDY3LDI5OTIsMzY5NCwgOTMwLDMyODMsMzgyMyw1MDY4LCAgNTksNTA2OSwgIyAgODAwCiA1ODUsIDYwMSw0MjIxLCA0OTcsMzQ2NiwxMTEyLDEzMTQsNDUzNSwxODAyLDUwNzAsMTIyMywxNDcyLDIxNzcsNTA3MSwgNzQ5LDE4MzcsICMgIDgxNgogNjkwLDE5MDAsMzgyNCwxNzczLDM5ODgsMTQ3NiwgNDI5LDEwNDMsMTc5MSwyMjM2LDIxMTcsIDkxNyw0MjIyLCA0NDcsMTA4NiwxNjI5LCAjICA4MzIKNTA3MiwgNTU2LDUwNzMsNTA3NCwyMDIxLDE2NTQsIDg0NCwxMDkwLCAxMDUsIDU1MCwgOTY2LDE3NTgsMjgyOCwxMDA4LDE3ODMsIDY4NiwgIyAgODQ4CjEwOTUsNTA3NSwyMjg3LCA3OTMsMTYwMiw1MDc2LDM1NzMsMjYwMyw0NTM2LDQyMjMsMjk0OCwyMzAyLDQ1MzcsMzgyNSwgOTgwLDI1MDMsICMgIDg2NAogNTQ0LCAzNTMsIDUyNyw0NTM4LCA5MDgsMjY4NywyOTEzLDUwNzcsIDM4MSwyNjI5LDE5NDMsMTM0OCw1MDc4LDEzNDEsMTI1MiwgNTYwLCAjICA4ODAKMzA5NSw1MDc5LDM0NjcsMjg3MCw1MDgwLDIwNTQsIDk3MywgODg2LDIwODEsIDE0Myw0NTM5LDUwODEsNTA4MiwgMTU3LDM5ODksIDQ5NiwgIyAgODk2CjQyMjQsICA1NywgODQwLCA1NDAsMjAzOSw0NTQwLDQ1NDEsMzQ2OCwyMTE4LDE0NDUsIDk3MCwyMjY0LDE3NDgsMTk2NiwyMDgyLDQyMjUsICMgIDkxMgozMTQ0LDEyMzQsMTc3NiwzMjg0LDI4MjksMzY5NSwgNzczLDEyMDYsMjEzMCwxMDY2LDIwNDAsMTMyNiwzOTkwLDE3MzgsMTcyNSw0MjI2LCAjICA5MjgKIDI3OSwzMTQ1LCAgNTEsMTU0NCwyNjA0LCA0MjMsMTU3OCwyMTMxLDIwNjcsIDE3Myw0NTQyLDE4ODAsNTA4Myw1MDg0LDE1ODMsIDI2NCwgIyAgOTQ0CiA2MTAsMzY5Niw0NTQzLDI0NDQsIDI4MCwgMTU0LDUwODUsNTA4Niw1MDg3LDE3MzksIDMzOCwxMjgyLDMwOTYsIDY5MywyODcxLDE0MTEsICMgIDk2MAoxMDc0LDM4MjYsMjQ0NSw1MDg4LDQ1NDQsNTA4OSw1MDkwLDEyNDAsIDk1MiwyMzk5LDUwOTEsMjkxNCwxNTM4LDI2ODgsIDY4NSwxNDgzLCAjICA5NzYKNDIyNywyNDc1LDE0MzYsIDk1Myw0MjI4LDIwNTUsNDU0NSwgNjcxLDI0MDAsICA3OSw0MjI5LDI0NDYsMzI4NSwgNjA4LCA1NjcsMjY4OSwgIyAgOTkyCjM0NjksNDIzMCw0MjMxLDE2OTEsIDM5MywxMjYxLDE3OTIsMjQwMSw1MDkyLDQ1NDYsNTA5Myw1MDk0LDUwOTUsNTA5NiwxMzgzLDE2NzIsICMgMTAwOAozODI3LDMyMTMsMTQ2NCwgNTIyLDExMTksIDY2MSwxMTUwLCAyMTYsIDY3NSw0NTQ3LDM5OTEsMTQzMiwzNTc0LCA2MDksNDU0OCwyNjkwLCAjIDEwMjQKMjQwMiw1MDk3LDUwOTgsNTA5OSw0MjMyLDMwNDUsICAgMCw1MTAwLDI0NzYsIDMxNSwgMjMxLDI0NDcsIDMwMSwzMzU2LDQ1NDksMjM4NSwgIyAxMDQwCjUxMDEsIDIzMyw0MjMzLDM2OTcsMTgxOSw0NTUwLDQ1NTEsNTEwMiwgIDk2LDE3NzcsMTMxNSwyMDgzLDUxMDMsIDI1Nyw1MTA0LDE4MTAsICMgMTA1NgozNjk4LDI3MTgsMTEzOSwxODIwLDQyMzQsMjAyMiwxMTI0LDIxNjQsMjc5MSwxNzc4LDI2NTksNTEwNSwzMDk3LCAzNjMsMTY1NSwzMjE0LCAjIDEwNzIKNTEwNiwyOTkzLDUxMDcsNTEwOCw1MTA5LDM5OTIsMTU2NywzOTkzLCA3MTgsIDEwMywzMjE1LCA4NDksMTQ0MywgMzQxLDMzNTcsMjk0OSwgIyAxMDg4CjE0ODQsNTExMCwxNzEyLCAxMjcsICA2NywgMzM5LDQyMzUsMjQwMywgNjc5LDE0MTIsIDgyMSw1MTExLDUxMTIsIDgzNCwgNzM4LCAzNTEsICMgMTEwNAoyOTk0LDIxNDcsIDg0NiwgMjM1LDE0OTcsMTg4MSwgNDE4LDE5OTMsMzgyOCwyNzE5LCAxODYsMTEwMCwyMTQ4LDI3NTYsMzU3NSwxNTQ1LCAjIDExMjAKMTM1NSwyOTUwLDI4NzIsMTM3NywgNTgzLDM5OTQsNDIzNiwyNTgxLDI5OTUsNTExMywxMjk4LDM2OTksMTA3OCwyNTU3LDM3MDAsMjM2MywgIyAxMTM2CiAgNzgsMzgyOSwzODMwLCAyNjcsMTI4OSwyMTAwLDIwMDIsMTU5NCw0MjM3LCAzNDgsIDM2OSwxMjc0LDIxOTcsMjE3OCwxODM4LDQ1NTIsICMgMTE1MgoxODIxLDI4MzAsMzcwMSwyNzU3LDIyODgsMjAwMyw0NTUzLDI5NTEsMjc1OCwgMTQ0LDMzNTgsIDg4Miw0NTU0LDM5OTUsMjc1OSwzNDcwLCAjIDExNjgKNDU1NSwyOTE1LDUxMTQsNDIzOCwxNzI2LCAzMjAsNTExNSwzOTk2LDMwNDYsIDc4OCwyOTk2LDUxMTYsMjgzMSwxNzc0LDEzMjcsMjg3MywgIyAxMTg0CjM5OTcsMjgzMiw1MTE3LDEzMDYsNDU1NiwyMDA0LDE3MDAsMzgzMSwzNTc2LDIzNjQsMjY2MCwgNzg3LDIwMjMsIDUwNiwgODI0LDM3MDIsICMgMTIwMAogNTM0LCAzMjMsNDU1NywxMDQ0LDMzNTksMjAyNCwxOTAxLCA5NDYsMzQ3MSw1MTE4LDE3NzksMTUwMCwxNjc4LDUxMTksMTg4Miw0NTU4LCAjIDEyMTYKIDE2NSwgMjQzLDQ1NTksMzcwMywyNTI4LCAxMjMsIDY4Myw0MjM5LCA3NjQsNDU2MCwgIDM2LDM5OTgsMTc5MywgNTg5LDI5MTYsIDgxNiwgIyAxMjMyCiA2MjYsMTY2NywzMDQ3LDIyMzcsMTYzOSwxNTU1LDE2MjIsMzgzMiwzOTk5LDUxMjAsNDAwMCwyODc0LDEzNzAsMTIyOCwxOTMzLCA4OTEsICMgMTI0OAoyMDg0LDI5MTcsIDMwNCw0MjQwLDUxMjEsIDI5MiwyOTk3LDI3MjAsMzU3NywgNjkxLDIxMDEsNDI0MSwxMTE1LDQ1NjEsIDExOCwgNjYyLCAjIDEyNjQKNTEyMiwgNjExLDExNTYsIDg1NCwyMzg2LDEzMTYsMjg3NSwgICAyLCAzODYsIDUxNSwyOTE4LDUxMjMsNTEyNCwzMjg2LCA4NjgsMjIzOCwgIyAxMjgwCjE0ODYsIDg1NSwyNjYxLCA3ODUsMjIxNiwzMDQ4LDUxMjUsMTA0MCwzMjE2LDM1NzgsNTEyNiwzMTQ2LCA0NDgsNTEyNywxNTI1LDUxMjgsICMgMTI5NgoyMTY1LDQ1NjIsNTEyOSwzODMzLDUxMzAsNDI0MiwyODMzLDM1NzksMzE0NywgNTAzLCA4MTgsNDAwMSwzMTQ4LDE1NjgsIDgxNCwgNjc2LCAjIDEzMTIKMTQ0NCwgMzA2LDE3NDksNTEzMSwzODM0LDE0MTYsMTAzMCwgMTk3LDE0MjgsIDgwNSwyODM0LDE1MDEsNDU2Myw1MTMyLDUxMzMsNTEzNCwgIyAxMzI4CjE5OTQsNTEzNSw0NTY0LDUxMzYsNTEzNywyMTk4LCAgMTMsMjc5MiwzNzA0LDI5OTgsMzE0OSwxMjI5LDE5MTcsNTEzOCwzODM1LDIxMzIsICMgMTM0NAo1MTM5LDQyNDMsNDU2NSwyNDA0LDM1ODAsNTE0MCwyMjE3LDE1MTEsMTcyNywxMTIwLDUxNDEsNTE0MiwgNjQ2LDM4MzYsMjQ0OCwgMzA3LCAjIDEzNjAKNTE0Myw1MTQ0LDE1OTUsMzIxNyw1MTQ1LDUxNDYsNTE0NywzNzA1LDExMTMsMTM1Niw0MDAyLDE0NjUsMjUyOSwyNTMwLDUxNDgsIDUxOSwgIyAxMzc2CjUxNDksIDEyOCwyMTMzLCAgOTIsMjI4OSwxOTgwLDUxNTAsNDAwMywxNTEyLCAzNDIsMzE1MCwyMTk5LDUxNTEsMjc5MywyMjE4LDE5ODEsICMgMTM5MgozMzYwLDQyNDQsIDI5MCwxNjU2LDEzMTcsIDc4OSwgODI3LDIzNjUsNTE1MiwzODM3LDQ1NjYsIDU2MiwgNTgxLDQwMDQsNTE1MywgNDAxLCAjIDE0MDgKNDU2NywyMjUyLCAgOTQsNDU2OCw1MTU0LDEzOTksMjc5NCw1MTU1LDE0NjMsMjAyNSw0NTY5LDMyMTgsMTk0NCw1MTU2LCA4MjgsMTEwNSwgIyAxNDI0CjQyNDUsMTI2MiwxMzk0LDUxNTcsNDI0NiwgNjA1LDQ1NzAsNTE1OCwxNzg0LDI4NzYsNTE1OSwyODM1LCA4MTksMjEwMiwgNTc4LDIyMDAsICMgMTQ0MAoyOTUyLDUxNjAsMTUwMiwgNDM2LDMyODcsNDI0NywzMjg4LDI4MzYsNDAwNSwyOTE5LDM0NzIsMzQ3Myw1MTYxLDI3MjEsMjMyMCw1MTYyLCAjIDE0NTYKNTE2MywyMzM3LDIwNjgsICAyMyw0NTcxLCAxOTMsIDgyNiwzODM4LDIxMDMsIDY5OSwxNjMwLDQyNDgsMzA5OCwgMzkwLDE3OTQsMTA2NCwgIyAxNDcyCjM1ODEsNTE2NCwxNTc5LDMwOTksMzEwMCwxNDAwLDUxNjUsNDI0OSwxODM5LDE2NDAsMjg3Nyw1MTY2LDQ1NzIsNDU3MywgMTM3LDQyNTAsICMgMTQ4OAogNTk4LDMxMDEsMTk2NywgNzgwLCAxMDQsIDk3NCwyOTUzLDUxNjcsIDI3OCwgODk5LCAyNTMsIDQwMiwgNTcyLCA1MDQsIDQ5MywxMzM5LCAjIDE1MDQKNTE2OCw0MDA2LDEyNzUsNDU3NCwyNTgyLDI1NTgsNTE2OSwzNzA2LDMwNDksMzEwMiwyMjUzLCA1NjUsMTMzNCwyNzIyLCA4NjMsICA0MSwgIyAxNTIwCjUxNzAsNTE3MSw0NTc1LDUxNzIsMTY1NywyMzM4LCAgMTksIDQ2MywyNzYwLDQyNTEsIDYwNiw1MTczLDI5OTksMzI4OSwxMDg3LDIwODUsICMgMTUzNgoxMzIzLDI2NjIsMzAwMCw1MTc0LDE2MzEsMTYyMywxNzUwLDQyNTIsMjY5MSw1MTc1LDI4NzgsIDc5MSwyNzIzLDI2NjMsMjMzOSwgMjMyLCAjIDE1NTIKMjQyMSw1MTc2LDMwMDEsMTQ5OCw1MTc3LDI2NjQsMjYzMCwgNzU1LDEzNjYsMzcwNywzMjkwLDMxNTEsMjAyNiwxNjA5LCAxMTksMTkxOCwgIyAxNTY4CjM0NzQsIDg2MiwxMDI2LDQyNTMsNTE3OCw0MDA3LDM4MzksNDU3Niw0MDA4LDQ1NzcsMjI2NSwxOTUyLDI0NzcsNTE3OSwxMTI1LCA4MTcsICMgMTU4NAo0MjU0LDQyNTUsNDAwOSwxNTEzLDE3NjYsMjA0MSwxNDg3LDQyNTYsMzA1MCwzMjkxLDI4MzcsMzg0MCwzMTUyLDUxODAsNTE4MSwxNTA3LCAjIDE2MDAKNTE4MiwyNjkyLCA3MzMsICA0MCwxNjMyLDExMDYsMjg3OSwgMzQ1LDQyNTcsIDg0MSwyNTMxLCAyMzAsNDU3OCwzMDAyLDE4NDcsMzI5MiwgIyAxNjE2CjM0NzUsNTE4MywxMjYzLCA5ODYsMzQ3Niw1MTg0LCA3MzUsIDg3OSwgMjU0LDExMzcsIDg1NywgNjIyLDEzMDAsMTE4MCwxMzg4LDE1NjIsICMgMTYzMgo0MDEwLDQwMTEsMjk1NCwgOTY3LDI3NjEsMjY2NSwxMzQ5LCA1OTIsMjEzNCwxNjkyLDMzNjEsMzAwMywxOTk1LDQyNTgsMTY3OSw0MDEyLCAjIDE2NDgKMTkwMiwyMTg4LDUxODUsIDczOSwzNzA4LDI3MjQsMTI5NiwxMjkwLDUxODYsNDI1OSwyMjAxLDIyMDIsMTkyMiwxNTYzLDI2MDUsMjU1OSwgIyAxNjY0CjE4NzEsMjc2MiwzMDA0LDUxODcsIDQzNSw1MTg4LCAzNDMsMTEwOCwgNTk2LCAgMTcsMTc1MSw0NTc5LDIyMzksMzQ3NywzNzA5LDUxODksICMgMTY4MAo0NTgwLCAyOTQsMzU4MiwyOTU1LDE2OTMsIDQ3NywgOTc5LCAyODEsMjA0MiwzNTgzLCA2NDMsMjA0MywzNzEwLDI2MzEsMjc5NSwyMjY2LCAjIDE2OTYKMTAzMSwyMzQwLDIxMzUsMjMwMywzNTg0LDQ1ODEsIDM2NywxMjQ5LDI1NjAsNTE5MCwzNTg1LDUxOTEsNDU4MiwxMjgzLDMzNjIsMjAwNSwgIyAxNzEyCiAyNDAsMTc2MiwzMzYzLDQ1ODMsNDU4NCwgODM2LDEwNjksMzE1MywgNDc0LDUxOTIsMjE0OSwyNTMyLCAyNjgsMzU4Niw1MTkzLDMyMTksICMgMTcyOAoxNTIxLDEyODQsNTE5NCwxNjU4LDE1NDYsNDI2MCw1MTk1LDM1ODcsMzU4OCw1MTk2LDQyNjEsMzM2NCwyNjkzLDE2ODUsNDI2MiwgOTYxLCAjIDE3NDQKMTY3MywyNjMyLCAxOTAsMjAwNiwyMjAzLDM4NDEsNDU4NSw0NTg2LDUxOTcsIDU3MCwyNTA0LDM3MTEsMTQ5MCw1MTk4LDQ1ODcsMjYzMywgIyAxNzYwCjMyOTMsMTk1Nyw0NTg4LCA1ODQsMTUxNCwgMzk2LDEwNDUsMTk0NSw1MTk5LDQ1ODksMTk2OCwyNDQ5LDUyMDAsNTIwMSw0NTkwLDQwMTMsICMgMTc3NgogNjE5LDUyMDIsMzE1NCwzMjk0LCAyMTUsMjAwNywyNzk2LDI1NjEsMzIyMCw0NTkxLDMyMjEsNDU5MiwgNzYzLDQyNjMsMzg0Miw0NTkzLCAjIDE3OTIKNTIwMyw1MjA0LDE5NTgsMTc2NywyOTU2LDMzNjUsMzcxMiwxMTc0LCA0NTIsMTQ3Nyw0NTk0LDMzNjYsMzE1NSw1MjA1LDI4MzgsMTI1MywgIyAxODA4CjIzODcsMjE4OSwxMDkxLDIyOTAsNDI2NCwgNDkyLDUyMDYsIDYzOCwxMTY5LDE4MjUsMjEzNiwxNzUyLDQwMTQsIDY0OCwgOTI2LDEwMjEsICMgMTgyNAoxMzI0LDQ1OTUsIDUyMCw0NTk2LCA5OTcsIDg0NywxMDA3LCA4OTIsNDU5NywzODQzLDIyNjcsMTg3MiwzNzEzLDI0MDUsMTc4NSw0NTk4LCAjIDE4NDAKMTk1MywyOTU3LDMxMDMsMzIyMiwxNzI4LDQyNjUsMjA0NCwzNzE0LDQ1OTksMjAwOCwxNzAxLDMxNTYsMTU1MSwgIDMwLDIyNjgsNDI2NiwgIyAxODU2CjUyMDcsMjAyNyw0NjAwLDM1ODksNTIwOCwgNTAxLDUyMDksNDI2NywgNTk0LDM0NzgsMjE2NiwxODIyLDM1OTAsMzQ3OSwzNTkxLDMyMjMsICMgMTg3MgogODI5LDI4MzksNDI2OCw1MjEwLDE2ODAsMzE1NywxMjI1LDQyNjksNTIxMSwzMjk1LDQ2MDEsNDI3MCwzMTU4LDIzNDEsNTIxMiw0NjAyLCAjIDE4ODgKNDI3MSw1MjEzLDQwMTUsNDAxNiw1MjE0LDE4NDgsMjM4OCwyNjA2LDMzNjcsNTIxNSw0NjAzLCAzNzQsNDAxNywgNjUyLDQyNzIsNDI3MywgIyAxOTA0CiAzNzUsMTE0MCwgNzk4LDUyMTYsNTIxNyw1MjE4LDIzNjYsNDYwNCwyMjY5LCA1NDYsMTY1OSwgMTM4LDMwNTEsMjQ1MCw0NjA1LDUyMTksICMgMTkyMAoyMjU0LCA2MTIsMTg0OSwgOTEwLCA3OTYsMzg0NCwxNzQwLDEzNzEsIDgyNSwzODQ1LDM4NDYsNTIyMCwyOTIwLDI1NjIsNTIyMSwgNjkyLCAjIDE5MzYKIDQ0NCwzMDUyLDI2MzQsIDgwMSw0NjA2LDQyNzQsNTIyMiwxNDkxLCAyNDQsMTA1MywzMDUzLDQyNzUsNDI3NiwgMzQwLDUyMjMsNDAxOCwgIyAxOTUyCjEwNDEsMzAwNSwgMjkzLDExNjgsICA4NywxMzU3LDUyMjQsMTUzOSwgOTU5LDUyMjUsMjI0MCwgNzIxLCA2OTQsNDI3NywzODQ3LCAyMTksICMgMTk2OAoxNDc4LCA2NDQsMTQxNywzMzY4LDI2NjYsMTQxMywxNDAxLDEzMzUsMTM4OSw0MDE5LDUyMjYsNTIyNywzMDA2LDIzNjcsMzE1OSwxODI2LCAjIDE5ODQKIDczMCwxNTE1LCAxODQsMjg0MCwgIDY2LDQ2MDcsNTIyOCwxNjYwLDI5NTgsIDI0NiwzMzY5LCAzNzgsMTQ1NywgMjI2LDM0ODAsIDk3NSwgIyAyMDAwCjQwMjAsMjk1OSwxMjY0LDM1OTIsIDY3NCwgNjk2LDUyMjksIDE2Myw1MjMwLDExNDEsMjQyMiwyMTY3LCA3MTMsMzU5MywzMzcwLDQ2MDgsICMgMjAxNgo0MDIxLDUyMzEsNTIzMiwxMTg2LCAgMTUsNTIzMywxMDc5LDEwNzAsNTIzNCwxNTIyLDMyMjQsMzU5NCwgMjc2LDEwNTAsMjcyNSwgNzU4LCAjIDIwMzIKMTEyNiwgNjUzLDI5NjAsMzI5Niw1MjM1LDIzNDIsIDg4OSwzNTk1LDQwMjIsMzEwNCwzMDA3LCA5MDMsMTI1MCw0NjA5LDQwMjMsMzQ4MSwgIyAyMDQ4CjM1OTYsMTM0MiwxNjgxLDE3MTgsIDc2NiwzMjk3LCAyODYsICA4OSwyOTYxLDM3MTUsNTIzNiwxNzEzLDUyMzcsMjYwNywzMzcxLDMwMDgsICMgMjA2NAo1MjM4LDI5NjIsMjIxOSwzMjI1LDI4ODAsNTIzOSw0NjEwLDI1MDUsMjUzMywgMTgxLCAzODcsMTA3NSw0MDI0LCA3MzEsMjE5MCwzMzcyLCAjIDIwODAKNTI0MCwzMjk4LCAzMTAsIDMxMywzNDgyLDIzMDQsIDc3MCw0Mjc4LCAgNTQsMzA1NCwgMTg5LDQ2MTEsMzEwNSwzODQ4LDQwMjUsNTI0MSwgIyAyMDk2CjEyMzAsMTYxNywxODUwLCAzNTUsMzU5Nyw0Mjc5LDQ2MTIsMzM3MywgMTExLDQyODAsMzcxNiwxMzUwLDMxNjAsMzQ4MywzMDU1LDQyODEsICMgMjExMgoyMTUwLDMyOTksMzU5OCw1MjQyLDI3OTcsNDAyNiw0MDI3LDMwMDksIDcyMiwyMDA5LDUyNDMsMTA3MSwgMjQ3LDEyMDcsMjM0MywyNDc4LCAjIDIxMjgKMTM3OCw0NjEzLDIwMTAsIDg2NCwxNDM3LDEyMTQsNDYxNCwgMzczLDM4NDksMTE0MiwyMjIwLCA2NjcsNDYxNSwgNDQyLDI3NjMsMjU2MywgIyAyMTQ0CjM4NTAsNDAyOCwxOTY5LDQyODIsMzMwMCwxODQwLCA4MzcsIDE3MCwxMTA3LCA5MzQsMTMzNiwxODgzLDUyNDQsNTI0NSwyMTE5LDQyODMsICMgMjE2MAoyODQxLCA3NDMsMTU2OSw1MjQ2LDQ2MTYsNDI4NCwgNTgyLDIzODksMTQxOCwzNDg0LDUyNDcsMTgwMyw1MjQ4LCAzNTcsMTM5NSwxNzI5LCAjIDIxNzYKMzcxNywzMzAxLDI0MjMsMTU2NCwyMjQxLDUyNDksMzEwNiwzODUxLDE2MzMsNDYxNywxMTE0LDIwODYsNDI4NSwxNTMyLDUyNTAsIDQ4MiwgIyAyMTkyCjI0NTEsNDYxOCw1MjUxLDUyNTIsMTQ5MiwgODMzLDE0NjYsNTI1MywyNzI2LDM1OTksMTY0MSwyODQyLDUyNTQsMTUyNiwxMjcyLDM3MTgsICMgMjIwOAo0Mjg2LDE2ODYsMTc5NSwgNDE2LDI1NjQsMTkwMywxOTU0LDE4MDQsNTI1NSwzODUyLDI3OTgsMzg1MywxMTU5LDIzMjEsNTI1NiwyODgxLCAjIDIyMjQKNDYxOSwxNjEwLDE1ODQsMzA1NiwyNDI0LDI3NjQsIDQ0MywzMzAyLDExNjMsMzE2MSw1MjU3LDUyNTgsNDAyOSw1MjU5LDQyODcsMjUwNiwgIyAyMjQwCjMwNTcsNDYyMCw0MDMwLDMxNjIsMjEwNCwxNjQ3LDM2MDAsMjAxMSwxODczLDQyODgsNTI2MCw0Mjg5LCA0MzEsMzQ4NSw1MjYxLCAyNTAsICMgMjI1NgogIDk3LCAgODEsNDI5MCw1MjYyLDE2NDgsMTg1MSwxNTU4LCAxNjAsIDg0OCw1MjYzLCA4NjYsIDc0MCwxNjk0LDUyNjQsMjIwNCwyODQzLCAjIDIyNzIKMzIyNiw0MjkxLDQ2MjEsMzcxOSwxNjg3LCA5NTAsMjQ3OSwgNDI2LCA0NjksMzIyNywzNzIwLDM3MjEsNDAzMSw1MjY1LDUyNjYsMTE4OCwgIyAyMjg4CiA0MjQsMTk5NiwgODYxLDM2MDEsNDI5MiwzODU0LDIyMDUsMjY5NCwgMTY4LDEyMzUsMzYwMiw0MjkzLDUyNjcsMjA4NywxNjc0LDQ2MjIsICMgMjMwNAozMzc0LDMzMDMsIDIyMCwyNTY1LDEwMDksNTI2OCwzODU1LCA2NzAsMzAxMCwgMzMyLDEyMDgsIDcxNyw1MjY5LDUyNzAsMzYwMywyNDUyLCAjIDIzMjAKNDAzMiwzMzc1LDUyNzEsIDUxMyw1MjcyLDEyMDksMjg4MiwzMzc2LDMxNjMsNDYyMywxMDgwLDUyNzMsNTI3NCw1Mjc1LDUyNzYsMjUzNCwgIyAyMzM2CjM3MjIsMzYwNCwgODE1LDE1ODcsNDAzMyw0MDM0LDUyNzcsMzYwNSwzNDg2LDM4NTYsMTI1NCw0NjI0LDEzMjgsMzA1OCwxMzkwLDQwMzUsICMgMjM1MgoxNzQxLDQwMzYsMzg1Nyw0MDM3LDUyNzgsIDIzNiwzODU4LDI0NTMsMzMwNCw1Mjc5LDUyODAsMzcyMywzODU5LDEyNzMsMzg2MCw0NjI1LCAjIDIzNjgKNTI4MSwgMzA4LDUyODIsNDYyNiwgMjQ1LDQ2MjcsMTg1MiwyNDgwLDEzMDcsMjU4MywgNDMwLCA3MTUsMjEzNywyNDU0LDUyODMsIDI3MCwgIyAyMzg0CiAxOTksMjg4Myw0MDM4LDUyODQsMzYwNiwyNzI3LDE3NTMsIDc2MSwxNzU0LCA3MjUsMTY2MSwxODQxLDQ2MjgsMzQ4NywzNzI0LDUyODUsICMgMjQwMAo1Mjg2LCA1ODcsICAxNCwzMzA1LCAyMjcsMjYwOCwgMzI2LCA0ODAsMjI3MCwgOTQzLDI3NjUsMzYwNywgMjkxLCA2NTAsMTg4NCw1Mjg3LCAjIDI0MTYKMTcwMiwxMjI2LCAxMDIsMTU0NywgIDYyLDM0ODgsIDkwNCw0NjI5LDM0ODksMTE2NCw0Mjk0LDUyODgsNTI4OSwxMjI0LDE1NDgsMjc2NiwgIyAyNDMyCiAzOTEsIDQ5OCwxNDkzLDUyOTAsMTM4NiwxNDE5LDUyOTEsMjA1NiwxMTc3LDQ2MzAsIDgxMywgODgwLDEwODEsMjM2OCwgNTY2LDExNDUsICMgMjQ0OAo0NjMxLDIyOTEsMTAwMSwxMDM1LDI1NjYsMjYwOSwyMjQyLCAzOTQsMTI4Niw1MjkyLDUyOTMsMjA2OSw1Mjk0LCAgODYsMTQ5NCwxNzMwLCAjIDI0NjQKNDAzOSwgNDkxLDE1ODgsIDc0NSwgODk3LDI5NjMsIDg0MywzMzc3LDQwNDAsMjc2NywyODg0LDMzMDYsMTc2OCwgOTk4LDIyMjEsMjA3MCwgIyAyNDgwCiAzOTcsMTgyNywxMTk1LDE5NzAsMzcyNSwzMDExLDMzNzgsIDI4NCw1Mjk1LDM4NjEsMjUwNywyMTM4LDIxMjAsMTkwNCw1Mjk2LDQwNDEsICMgMjQ5NgoyMTUxLDQwNDIsNDI5NSwxMDM2LDM0OTAsMTkwNSwgMTE0LDI1NjcsNDI5NiwgMjA5LDE1MjcsNTI5Nyw1Mjk4LDI5NjQsMjg0NCwyNjM1LCAjIDI1MTIKMjM5MCwyNzI4LDMxNjQsIDgxMiwyNTY4LDUyOTksMzMwNyw1MzAwLDE1NTksIDczNywxODg1LDM3MjYsMTIxMCwgODg1LCAgMjgsMjY5NSwgIyAyNTI4CjM2MDgsMzg2Miw1MzAxLDQyOTcsMTAwNCwxNzgwLDQ2MzIsNTMwMiwgMzQ2LDE5ODIsMjIyMiwyNjk2LDQ2MzMsMzg2MywxNzQyLCA3OTcsICMgMjU0NAoxNjQyLDQwNDMsMTkzNCwxMDcyLDEzODQsMjE1MiwgODk2LDQwNDQsMzMwOCwzNzI3LDMyMjgsMjg4NSwzNjA5LDUzMDMsMjU2OSwxOTU5LCAjIDI1NjAKNDYzNCwyNDU1LDE3ODYsNTMwNCw1MzA1LDUzMDYsNDA0NSw0Mjk4LDEwMDUsMTMwOCwzNzI4LDQyOTksMjcyOSw0NjM1LDQ2MzYsMTUyOCwgIyAyNTc2CjI2MTAsIDE2MSwxMTc4LDQzMDAsMTk4MywgOTg3LDQ2MzcsMTEwMSw0MzAxLCA2MzEsNDA0NiwxMTU3LDMyMjksMjQyNSwxMzQzLDEyNDEsICMgMjU5MgoxMDE2LDIyNDMsMjU3MCwgMzcyLCA4NzcsMjM0NCwyNTA4LDExNjAsIDU1NSwxOTM1LCA5MTEsNDA0Nyw1MzA3LCA0NjYsMTE3MCwgMTY5LCAjIDI2MDgKMTA1MSwyOTIxLDI2OTcsMzcyOSwyNDgxLDMwMTIsMTE4MiwyMDEyLDI1NzEsMTI1MSwyNjM2LDUzMDgsIDk5MiwyMzQ1LDM0OTEsMTU0MCwgIyAyNjI0CjI3MzAsMTIwMSwyMDcxLDI0MDYsMTk5NywyNDgyLDUzMDksNDYzOCwgNTI4LDE5MjMsMjE5MSwxNTAzLDE4NzQsMTU3MCwyMzY5LDMzNzksICMgMjY0MAozMzA5LDUzMTAsIDU1NywxMDczLDUzMTEsMTgyOCwzNDkyLDIwODgsMjI3MSwzMTY1LDMwNTksMzEwNywgNzY3LDMxMDgsMjc5OSw0NjM5LCAjIDI2NTYKMTAwNiw0MzAyLDQ2NDAsMjM0NiwxMjY3LDIxNzksMzczMCwzMjMwLCA3NzgsNDA0OCwzMjMxLDI3MzEsMTU5NywyNjY3LDUzMTIsNDY0MSwgIyAyNjcyCjUzMTMsMzQ5Myw1MzE0LDUzMTUsNTMxNiwzMzEwLDI2OTgsMTQzMywzMzExLCAxMzEsICA5NSwxNTA0LDQwNDksIDcyMyw0MzAzLDMxNjYsICMgMjY4OAoxODQyLDM2MTAsMjc2OCwyMTkyLDQwNTAsMjAyOCwyMTA1LDM3MzEsNTMxNywzMDEzLDQwNTEsMTIxOCw1MzE4LDMzODAsMzIzMiw0MDUyLCAjIDI3MDQKNDMwNCwyNTg0LCAyNDgsMTYzNCwzODY0LCA5MTIsNTMxOSwyODQ1LDM3MzIsMzA2MCwzODY1LCA2NTQsICA1Myw1MzIwLDMwMTQsNTMyMSwgIyAyNzIwCjE2ODgsNDY0MiwgNzc3LDM0OTQsMTAzMiw0MDUzLDE0MjUsNTMyMiwgMTkxLCA4MjAsMjEyMSwyODQ2LCA5NzEsNDY0MywgOTMxLDMyMzMsICMgMjczNgogMTM1LCA2NjQsIDc4MywzODY2LDE5OTgsIDc3MiwyOTIyLDE5MzYsNDA1NCwzODY3LDQ2NDQsMjkyMywzMjM0LCAyODIsMjczMiwgNjQwLCAjIDI3NTIKMTM3MiwzNDk1LDExMjcsIDkyMiwgMzI1LDMzODEsNTMyMyw1MzI0LCA3MTEsMjA0NSw1MzI1LDUzMjYsNDA1NSwyMjIzLDI4MDAsMTkzNywgIyAyNzY4CjQwNTYsMzM4MiwyMjI0LDIyNTUsMzg2OCwyMzA1LDUzMjcsNDY0NSwzODY5LDEyNTgsMzMxMiw0MDU3LDMyMzUsMjEzOSwyOTY1LDQwNTgsICMgMjc4NAo0MDU5LDUzMjgsMjIyNSwgMjU4LDMyMzYsNDY0NiwgMTAxLDEyMjcsNTMyOSwzMzEzLDE3NTUsNTMzMCwxMzkxLDMzMTQsNTMzMSwyOTI0LCAjIDI4MDAKMjA1NywgODkzLDUzMzIsNTMzMyw1MzM0LDE0MDIsNDMwNSwyMzQ3LDUzMzUsNTMzNiwzMjM3LDM2MTEsNTMzNyw1MzM4LCA4NzgsMTMyNSwgIyAyODE2CjE3ODEsMjgwMSw0NjQ3LCAyNTksMTM4NSwyNTg1LCA3NDQsMTE4MywyMjcyLDQ2NDgsNTMzOSw0MDYwLDI1MDksNTM0MCwgNjg0LDEwMjQsICMgMjgzMgo0MzA2LDUzNDEsIDQ3MiwzNjEyLDM0OTYsMTE2NSwzMzE1LDQwNjEsNDA2MiwgMzIyLDIxNTMsIDg4MSwgNDU1LDE2OTUsMTE1MiwxMzQwLCAjIDI4NDgKIDY2MCwgNTU0LDIxNTQsNDY0OSwxMDU4LDQ2NTAsNDMwNywgODMwLDEwNjUsMzM4Myw0MDYzLDQ2NTEsMTkyNCw1MzQyLDE3MDMsMTkxOSwgIyAyODY0CjUzNDMsIDkzMiwyMjczLCAxMjIsNTM0NCw0NjUyLCA5NDcsIDY3Nyw1MzQ1LDM4NzAsMjYzNywgMjk3LDE5MDYsMTkyNSwyMjc0LDQ2NTMsICMgMjg4MAoyMzIyLDMzMTYsNTM0Niw1MzQ3LDQzMDgsNTM0OCw0MzA5LCAgODQsNDMxMCwgMTEyLCA5ODksNTM0OSwgNTQ3LDEwNTksNDA2NCwgNzAxLCAjIDI4OTYKMzYxMywxMDE5LDUzNTAsNDMxMSw1MzUxLDM0OTcsIDk0MiwgNjM5LCA0NTcsMjMwNiwyNDU2LCA5OTMsMjk2NiwgNDA3LCA4NTEsIDQ5NCwgIyAyOTEyCjQ2NTQsMzM4NCwgOTI3LDUzNTIsMTIzNyw1MzUzLDI0MjYsMzM4NSwgNTczLDQzMTIsIDY4MCwgOTIxLDI5MjUsMTI3OSwxODc1LCAyODUsICMgMjkyOAogNzkwLDE0NDgsMTk4NCwgNzE5LDIxNjgsNTM1NCw1MzU1LDQ2NTUsNDA2NSw0MDY2LDE2NDksNTM1NiwxNTQxLCA1NjMsNTM1NywxMDc3LCAjIDI5NDQKNTM1OCwzMzg2LDMwNjEsMzQ5OCwgNTExLDMwMTUsNDA2Nyw0MDY4LDM3MzMsNDA2OSwxMjY4LDI1NzIsMzM4NywzMjM4LDQ2NTYsNDY1NywgIyAyOTYwCjUzNTksIDUzNSwxMDQ4LDEyNzYsMTE4OSwyOTI2LDIwMjksMzE2NywxNDM4LDEzNzMsMjg0NywyOTY3LDExMzQsMjAxMyw1MzYwLDQzMTMsICMgMjk3NgoxMjM4LDI1ODYsMzEwOSwxMjU5LDUzNjEsIDcwMCw1MzYyLDI5NjgsMzE2OCwzNzM0LDQzMTQsNTM2Myw0MzE1LDExNDYsMTg3NiwxOTA3LCAjIDI5OTIKNDY1OCwyNjExLDQwNzAsIDc4MSwyNDI3LCAxMzIsMTU4OSwgMjAzLCAxNDcsIDI3MywyODAyLDI0MDcsIDg5OCwxNzg3LDIxNTUsNDA3MSwgIyAzMDA4CjQwNzIsNTM2NCwzODcxLDI4MDMsNTM2NSw1MzY2LDQ2NTksNDY2MCw1MzY3LDMyMzksNTM2OCwxNjM1LDM4NzIsIDk2NSw1MzY5LDE4MDUsICMgMzAyNAoyNjk5LDE1MTYsMzYxNCwxMTIxLDEwODIsMTMyOSwzMzE3LDQwNzMsMTQ0OSwzODczLCAgNjUsMTEyOCwyODQ4LDI5MjcsMjc2OSwxNTkwLCAjIDMwNDAKMzg3NCw1MzcwLDUzNzEsICAxMiwyNjY4LCAgNDUsIDk3NiwyNTg3LDMxNjksNDY2MSwgNTE3LDI1MzUsMTAxMywxMDM3LDMyNDAsNTM3MiwgIyAzMDU2CjM4NzUsMjg0OSw1MzczLDM4NzYsNTM3NCwzNDk5LDUzNzUsMjYxMiwgNjE0LDE5OTksMjMyMywzODc3LDMxMTAsMjczMywyNjM4LDUzNzYsICMgMzA3MgoyNTg4LDQzMTYsIDU5OSwxMjY5LDUzNzcsMTgxMSwzNzM1LDUzNzgsMjcwMCwzMTExLCA3NTksMTA2MCwgNDg5LDE4MDYsMzM4OCwzMzE4LCAjIDMwODgKMTM1OCw1Mzc5LDUzODAsMjM5MSwxMzg3LDEyMTUsMjYzOSwyMjU2LCA0OTAsNTM4MSw1MzgyLDQzMTcsMTc1OSwyMzkyLDIzNDgsNTM4MywgIyAzMTA0CjQ2NjIsMzg3OCwxOTA4LDQwNzQsMjY0MCwxODA3LDMyNDEsNDY2MywzNTAwLDMzMTksMjc3MCwyMzQ5LCA4NzQsNTM4NCw1Mzg1LDM1MDEsICMgMzEyMAozNzM2LDE4NTksICA5MSwyOTI4LDM3MzcsMzA2MiwzODc5LDQ2NjQsNTM4NiwzMTcwLDQwNzUsMjY2OSw1Mzg3LDM1MDIsMTIwMiwxNDAzLCAjIDMxMzYKMzg4MCwyOTY5LDI1MzYsMTUxNywyNTEwLDQ2NjUsMzUwMywyNTExLDUzODgsNDY2Niw1Mzg5LDI3MDEsMTg4NiwxNDk1LDE3MzEsNDA3NiwgIyAzMTUyCjIzNzAsNDY2Nyw1MzkwLDIwMzAsNTM5MSw1MzkyLDQwNzcsMjcwMiwxMjE2LCAyMzcsMjU4OSw0MzE4LDIzMjQsNDA3OCwzODgxLDQ2NjgsICMgMzE2OAo0NjY5LDI3MDMsMzYxNSwzNTA0LCA0NDUsNDY3MCw1MzkzLDUzOTQsNTM5NSw1Mzk2LDI3NzEsICA2MSw0MDc5LDM3MzgsMTgyMyw0MDgwLCAjIDMxODQKNTM5NywgNjg3LDIwNDYsIDkzNSwgOTI1LCA0MDUsMjY3MCwgNzAzLDEwOTYsMTg2MCwyNzM0LDQ2NzEsNDA4MSwxODc3LDEzNjcsMjcwNCwgIyAzMjAwCjMzODksIDkxOCwyMTA2LDE3ODIsMjQ4MywgMzM0LDMzMjAsMTYxMSwxMDkzLDQ2NzIsIDU2NCwzMTcxLDM1MDUsMzczOSwzMzkwLCA5NDUsICMgMzIxNgoyNjQxLDIwNTgsNDY3Myw1Mzk4LDE5MjYsIDg3Miw0MzE5LDUzOTksMzUwNiwyNzA1LDMxMTIsIDM0OSw0MzIwLDM3NDAsNDA4Miw0Njc0LCAjIDMyMzIKMzg4Miw0MzIxLDM3NDEsMjE1Niw0MDgzLDQ2NzUsNDY3Niw0MzIyLDQ2NzcsMjQwOCwyMDQ3LCA3ODIsNDA4NCwgNDAwLCAyNTEsNDMyMywgIyAzMjQ4CjE2MjQsNTQwMCw1NDAxLCAyNzcsMzc0MiwgMjk5LDEyNjUsIDQ3NiwxMTkxLDM4ODMsMjEyMiw0MzI0LDQzMjUsMTEwOSwgMjA1LDU0MDIsICMgMzI2NAoyNTkwLDEwMDAsMjE1NywzNjE2LDE4NjEsNTQwMyw1NDA0LDU0MDUsNDY3OCw1NDA2LDQ2NzksMjU3MywgMTA3LDI0ODQsMjE1OCw0MDg1LCAjIDMyODAKMzUwNywzMTcyLDU0MDcsMTUzMywgNTQxLDEzMDEsIDE1OCwgNzUzLDQzMjYsMjg4NiwzNjE3LDU0MDgsMTY5NiwgMzcwLDEwODgsNDMyNywgIyAzMjk2CjQ2ODAsMzYxOCwgNTc5LCAzMjcsIDQ0MCwgMTYyLDIyNDQsIDI2OSwxOTM4LDEzNzQsMzUwOCwgOTY4LDMwNjMsICA1NiwxMzk2LDMxMTMsICMgMzMxMgoyMTA3LDMzMjEsMzM5MSw1NDA5LDE5MjcsMjE1OSw0NjgxLDMwMTYsNTQxMCwzNjE5LDU0MTEsNTQxMiwzNzQzLDQ2ODIsMjQ4NSw1NDEzLCAjIDMzMjgKMjgwNCw1NDE0LDE2NTAsNDY4Myw1NDE1LDI2MTMsNTQxNiw1NDE3LDQwODYsMjY3MSwzMzkyLDExNDksMzM5Myw0MDg3LDM4ODQsNDA4OCwgIyAzMzQ0CjU0MTgsMTA3NiwgIDQ5LDU0MTksIDk1MSwzMjQyLDMzMjIsMzMyMywgNDUwLDI4NTAsIDkyMCw1NDIwLDE4MTIsMjgwNSwyMzcxLDQzMjgsICMgMzM2MAoxOTA5LDExMzgsMjM3MiwzODg1LDM1MDksNTQyMSwzMjQzLDQ2ODQsMTkxMCwxMTQ3LDE1MTgsMjQyOCw0Njg1LDM4ODYsNTQyMiw0Njg2LCAjIDMzNzYKMjM5MywyNjE0LCAyNjAsMTc5NiwzMjQ0LDU0MjMsNTQyNCwzODg3LDMzMjQsIDcwOCw1NDI1LDM2MjAsMTcwNCw1NDI2LDM2MjEsMTM1MSwgIyAzMzkyCjE2MTgsMzM5NCwzMDE3LDE4ODcsIDk0NCw0MzI5LDMzOTUsNDMzMCwzMDY0LDMzOTYsNDMzMSw1NDI3LDM3NDQsIDQyMiwgNDEzLDE3MTQsICMgMzQwOAozMzI1LCA1MDAsMjA1OSwyMzUwLDQzMzIsMjQ4Niw1NDI4LDEzNDQsMTkxMSwgOTU0LDU0MjksMTY2OCw1NDMwLDU0MzEsNDA4OSwyNDA5LCAjIDM0MjQKNDMzMywzNjIyLDM4ODgsNDMzNCw1NDMyLDIzMDcsMTMxOCwyNTEyLDMxMTQsIDEzMywzMTE1LDI4ODcsNDY4NywgNjI5LCAgMzEsMjg1MSwgIyAzNDQwCjI3MDYsMzg4OSw0Njg4LCA4NTAsIDk0OSw0Njg5LDQwOTAsMjk3MCwxNzMyLDIwODksNDMzNSwxNDk2LDE4NTMsNTQzMyw0MDkxLCA2MjAsICMgMzQ1NgozMjQ1LCA5ODEsMTI0MiwzNzQ1LDMzOTcsMTYxOSwzNzQ2LDE2NDMsMzMyNiwyMTQwLDI0NTcsMTk3MSwxNzE5LDM1MTAsMjE2OSw1NDM0LCAjIDM0NzIKMzI0Niw1NDM1LDU0MzYsMzM5OCwxODI5LDU0MzcsMTI3Nyw0NjkwLDE1NjUsMjA0OCw1NDM4LDE2MzYsMzYyMywzMTE2LDU0MzksIDg2OSwgIyAzNDg4CjI4NTIsIDY1NSwzODkwLDM4OTEsMzExNyw0MDkyLDMwMTgsMzg5MiwxMzEwLDM2MjQsNDY5MSw1NDQwLDU0NDEsNTQ0MiwxNzMzLCA1NTgsICMgMzUwNAo0NjkyLDM3NDcsIDMzNSwxNTQ5LDMwNjUsMTc1Niw0MzM2LDM3NDgsMTk0NiwzNTExLDE4MzAsMTI5MSwxMTkyLCA0NzAsMjczNSwyMTA4LCAjIDM1MjAKMjgwNiwgOTEzLDEwNTQsNDA5Myw1NDQzLDEwMjcsNTQ0NCwzMDY2LDQwOTQsNDY5MywgOTgyLDI2NzIsMzM5OSwzMTczLDM1MTIsMzI0NywgIyAzNTM2CjMyNDgsMTk0NywyODA3LDU0NDUsIDU3MSw0Njk0LDU0NDYsMTgzMSw1NDQ3LDM2MjUsMjU5MSwxNTIzLDI0MjksNTQ0OCwyMDkwLCA5ODQsICMgMzU1Mgo0Njk1LDM3NDksMTk2MCw1NDQ5LDM3NTAsIDg1MiwgOTIzLDI4MDgsMzUxMywzNzUxLCA5NjksMTUxOSwgOTk5LDIwNDksMjMyNSwxNzA1LCAjIDM1NjgKNTQ1MCwzMTE4LCA2MTUsMTY2MiwgMTUxLCA1OTcsNDA5NSwyNDEwLDIzMjYsMTA0OSwgMjc1LDQ2OTYsMzc1Miw0MzM3LCA1NjgsMzc1MywgIyAzNTg0CjM2MjYsMjQ4Nyw0MzM4LDM3NTQsNTQ1MSwyNDMwLDIyNzUsIDQwOSwzMjQ5LDU0NTIsMTU2NiwyODg4LDM1MTQsMTAwMiwgNzY5LDI4NTMsICMgMzYwMAogMTk0LDIwOTEsMzE3NCwzNzU1LDIyMjYsMzMyNyw0MzM5LCA2MjgsMTUwNSw1NDUzLDU0NTQsMTc2MywyMTgwLDMwMTksNDA5NiwgNTIxLCAjIDM2MTYKMTE2MSwyNTkyLDE3ODgsMjIwNiwyNDExLDQ2OTcsNDA5NywxNjI1LDQzNDAsNDM0MSwgNDEyLCAgNDIsMzExOSwgNDY0LDU0NTUsMjY0MiwgIyAzNjMyCjQ2OTgsMzQwMCwxNzYwLDE1NzEsMjg4OSwzNTE1LDI1MzcsMTIxOSwyMjA3LDM4OTMsMjY0MywyMTQxLDIzNzMsNDY5OSw0NzAwLDMzMjgsICMgMzY0OAoxNjUxLDM0MDEsMzYyNyw1NDU2LDU0NTcsMzYyOCwyNDg4LDM1MTYsNTQ1OCwzNzU2LDU0NTksNTQ2MCwyMjc2LDIwOTIsIDQ2MCw1NDYxLCAjIDM2NjQKNDcwMSw1NDYyLDMwMjAsIDk2MiwgNTg4LDM2MjksIDI4OSwzMjUwLDI2NDQsMTExNiwgIDUyLDU0NjMsMzA2NywxNzk3LDU0NjQsNTQ2NSwgIyAzNjgwCjU0NjYsMTQ2Nyw1NDY3LDE1OTgsMTE0MywzNzU3LDQzNDIsMTk4NSwxNzM0LDEwNjcsNDcwMiwxMjgwLDM0MDIsIDQ2NSw0NzAzLDE1NzIsICMgMzY5NgogNTEwLDU0NjgsMTkyOCwyMjQ1LDE4MTMsMTY0NCwzNjMwLDU0NjksNDcwNCwzNzU4LDU0NzAsNTQ3MSwyNjczLDE1NzMsMTUzNCw1NDcyLCAjIDM3MTIKNTQ3MywgNTM2LDE4MDgsMTc2MSwzNTE3LDM4OTQsMzE3NSwyNjQ1LDU0NzQsNTQ3NSw1NDc2LDQ3MDUsMzUxOCwyOTI5LDE5MTIsMjgwOSwgIyAzNzI4CjU0NzcsMzMyOSwxMTIyLCAzNzcsMzI1MSw1NDc4LCAzNjAsNTQ3OSw1NDgwLDQzNDMsMTUyOSwgNTUxLDU0ODEsMjA2MCwzNzU5LDE3NjksICMgMzc0NAoyNDMxLDU0ODIsMjkzMCw0MzQ0LDMzMzAsMzEyMCwyMzI3LDIxMDksMjAzMSw0NzA2LDE0MDQsIDEzNiwxNDY4LDE0NzksIDY3MiwxMTcxLCAjIDM3NjAKMzI1MiwyMzA4LCAyNzEsMzE3Niw1NDgzLDI3NzIsNTQ4NCwyMDUwLCA2NzgsMjczNiwgODY1LDE5NDgsNDcwNyw1NDg1LDIwMTQsNDA5OCwgIyAzNzc2CjI5NzEsNTQ4NiwyNzM3LDIyMjcsMTM5NywzMDY4LDM3NjAsNDcwOCw0NzA5LDE3MzUsMjkzMSwzNDAzLDM2MzEsNTQ4NywzODk1LCA1MDksICMgMzc5MgoyODU0LDI0NTgsMjg5MCwzODk2LDU0ODgsNTQ4OSwzMTc3LDMxNzgsNDcxMCw0MzQ1LDI1MzgsNDcxMSwyMzA5LDExNjYsMTAxMCwgNTUyLCAjIDM4MDgKIDY4MSwxODg4LDU0OTAsNTQ5MSwyOTcyLDI5NzMsNDA5OSwxMjg3LDE1OTYsMTg2MiwzMTc5LCAzNTgsIDQ1MywgNzM2LCAxNzUsIDQ3OCwgIyAzODI0CjExMTcsIDkwNSwxMTY3LDEwOTcsNTQ5MiwxODU0LDE1MzAsNTQ5MywxNzA2LDU0OTQsMjE4MSwzNTE5LDIyOTIsMzc2MSwzNTIwLDM2MzIsICMgMzg0MAo0MzQ2LDIwOTMsNDM0Nyw1NDk1LDM0MDQsMTE5MywyNDg5LDQzNDgsMTQ1OCwyMTkzLDIyMDgsMTg2MywxODg5LDE0MjEsMzMzMSwyOTMyLCAjIDM4NTYKMzA2OSwyMTgyLDM1MjEsIDU5NSwyMTIzLDU0OTYsNDEwMCw1NDk3LDU0OTgsNDM0OSwxNzA3LDI2NDYsIDIyMywzNzYyLDEzNTksIDc1MSwgIyAzODcyCjMxMjEsIDE4MywzNTIyLDU0OTksMjgxMCwzMDIxLCA0MTksMjM3NCwgNjMzLCA3MDQsMzg5NywyMzk0LCAyNDEsNTUwMCw1NTAxLDU1MDIsICMgMzg4OAogODM4LDMwMjIsMzc2MywyMjc3LDI3NzMsMjQ1OSwzODk4LDE5MzksMjA1MSw0MTAxLDEzMDksMzEyMiwyMjQ2LDExODEsNTUwMywxMTM2LCAjIDM5MDQKMjIwOSwzODk5LDIzNzUsMTQ0Niw0MzUwLDIzMTAsNDcxMiw1NTA0LDU1MDUsNDM1MSwxMDU1LDI2MTUsIDQ4NCwzNzY0LDU1MDYsNDEwMiwgIyAzOTIwCiA2MjUsNDM1MiwyMjc4LDM0MDUsMTQ5OSw0MzUzLDQxMDMsNTUwNyw0MTA0LDQzNTQsMzI1MywyMjc5LDIyODAsMzUyMyw1NTA4LDU1MDksICMgMzkzNgoyNzc0LCA4MDgsMjYxNiwzNzY1LDM0MDYsNDEwNSw0MzU1LDMxMjMsMjUzOSwgNTI2LDM0MDcsMzkwMCw0MzU2LCA5NTUsNTUxMCwxNjIwLCAjIDM5NTIKNDM1NywyNjQ3LDI0MzIsNTUxMSwxNDI5LDM3NjYsMTY2OSwxODMyLCA5OTQsIDkyOCw1NTEyLDM2MzMsMTI2MCw1NTEzLDU1MTQsNTUxNSwgIyAzOTY4CjE5NDksMjI5MywgNzQxLDI5MzMsMTYyNiw0MzU4LDI3MzgsMjQ2MCwgODY3LDExODQsIDM2MiwzNDA4LDEzOTIsNTUxNiw1NTE3LDQxMDYsICMgMzk4NAo0MzU5LDE3NzAsMTczNiwzMjU0LDI5MzQsNDcxMyw0NzE0LDE5MjksMjcwNywxNDU5LDExNTgsNTUxOCwzMDcwLDM0MDksMjg5MSwxMjkyLCAjIDQwMDAKMTkzMCwyNTEzLDI4NTUsMzc2NywxOTg2LDExODcsMjA3MiwyMDE1LDI2MTcsNDM2MCw1NTE5LDI1NzQsMjUxNCwyMTcwLDM3NjgsMjQ5MCwgIyA0MDE2CjMzMzIsNTUyMCwzNzY5LDQ3MTUsNTUyMSw1NTIyLCA2NjYsMTAwMywzMDIzLDEwMjIsMzYzNCw0MzYxLDU1MjMsNDcxNiwxODE0LDIyNTcsICMgNDAzMgogNTc0LDM5MDEsMTYwMywgMjk1LDE1MzUsIDcwNSwzOTAyLDQzNjIsIDI4MywgODU4LCA0MTcsNTUyNCw1NTI1LDMyNTUsNDcxNyw0NzE4LCAjIDQwNDgKMzA3MSwxMjIwLDE4OTAsMTA0NiwyMjgxLDI0NjEsNDEwNywxMzkzLDE1OTksIDY4OSwyNTc1LCAzODgsNDM2Myw1NTI2LDI0OTEsIDgwMiwgIyA0MDY0CjU1MjcsMjgxMSwzOTAzLDIwNjEsMTQwNSwyMjU4LDU1MjgsNDcxOSwzOTA0LDIxMTAsMTA1MiwxMzQ1LDMyNTYsMTU4NSw1NTI5LCA4MDksICMgNDA4MAo1NTMwLDU1MzEsNTUzMiwgNTc1LDI3MzksMzUyNCwgOTU2LDE1NTIsMTQ2OSwxMTQ0LDIzMjgsNTUzMywyMzI5LDE1NjAsMjQ2MiwzNjM1LCAjIDQwOTYKMzI1Nyw0MTA4LCA2MTYsMjIxMCw0MzY0LDMxODAsMjE4MywyMjk0LDU1MzQsMTgzMyw1NTM1LDM1MjUsNDcyMCw1NTM2LDEzMTksMzc3MCwgIyA0MTEyCjM3NzEsMTIxMSwzNjM2LDEwMjMsMzI1OCwxMjkzLDI4MTIsNTUzNyw1NTM4LDU1MzksMzkwNSwgNjA3LDIzMTEsMzkwNiwgNzYyLDI4OTIsICMgNDEyOAoxNDM5LDQzNjUsMTM2MCw0NzIxLDE0ODUsMzA3Miw1NTQwLDQ3MjIsMTAzOCw0MzY2LDE0NTAsMjA2MiwyNjQ4LDQzNjcsMTM3OSw0NzIzLCAjIDQxNDQKMjU5Myw1NTQxLDU1NDIsNDM2OCwxMzUyLDE0MTQsMjMzMCwyOTM1LDExNzIsNTU0Myw1NTQ0LDM5MDcsMzkwOCw0NzI0LDE3OTgsMTQ1MSwgIyA0MTYwCjU1NDUsNTU0Niw1NTQ3LDU1NDgsMjkzNiw0MTA5LDQxMTAsMjQ5MiwyMzUxLCA0MTEsNDExMSw0MTEyLDM2MzcsMzMzMywzMTI0LDQ3MjUsICMgNDE3NgoxNTYxLDI2NzQsMTQ1Miw0MTEzLDEzNzUsNTU0OSw1NTUwLCAgNDcsMjk3NCwgMzE2LDU1NTEsMTQwNiwxNTkxLDI5MzcsMzE4MSw1NTUyLCAjIDQxOTIKMTAyNSwyMTQyLDMxMjUsMzE4MiwgMzU0LDI3NDAsIDg4NCwyMjI4LDQzNjksMjQxMiwgNTA4LDM3NzIsIDcyNiwzNjM4LCA5OTYsMjQzMywgIyA0MjA4CjM2MzksIDcyOSw1NTUzLCAzOTIsMjE5NCwxNDUzLDQxMTQsNDcyNiwzNzczLDU1NTQsNTU1NSwyNDYzLDM2NDAsMjYxOCwxNjc1LDI4MTMsICMgNDIyNAogOTE5LDIzNTIsMjk3NSwyMzUzLDEyNzAsNDcyNyw0MTE1LCAgNzMsNTU1Niw1NTU3LCA2NDcsNTU1OCwzMjU5LDI4NTYsMjI1OSwxNTUwLCAjIDQyNDAKMTM0NiwzMDI0LDU1NTksMTMzMiwgODgzLDM1MjYsNTU2MCw1NTYxLDU1NjIsNTU2MywzMzM0LDI3NzUsNTU2NCwxMjEyLCA4MzEsMTM0NywgIyA0MjU2CjQzNzAsNDcyOCwyMzMxLDM5MDksMTg2NCwzMDczLCA3MjAsMzkxMCw0NzI5LDQ3MzAsMzkxMSw1NTY1LDQzNzEsNTU2Niw1NTY3LDQ3MzEsICMgNDI3Mgo1NTY4LDU1NjksMTc5OSw0NzMyLDM3NzQsMjYxOSw0NzMzLDM2NDEsMTY0NSwyMzc2LDQ3MzQsNTU3MCwyOTM4LCA2NjksMjIxMSwyNjc1LCAjIDQyODgKMjQzNCw1NTcxLDI4OTMsNTU3Miw1NTczLDEwMjgsMzI2MCw1NTc0LDQzNzIsMjQxMyw1NTc1LDIyNjAsMTM1Myw1NTc2LDU1NzcsNDczNSwgIyA0MzA0CjMxODMsIDUxOCw1NTc4LDQxMTYsNTU3OSw0MzczLDE5NjEsNTU4MCwyMTQzLDQzNzQsNTU4MSw1NTgyLDMwMjUsMjM1NCwyMzU1LDM5MTIsICMgNDMyMAogNTE2LDE4MzQsMTQ1NCw0MTE3LDI3MDgsNDM3NSw0NzM2LDIyMjksMjYyMCwxOTcyLDExMjksMzY0Miw1NTgzLDI3NzYsNTU4NCwyOTc2LCAjIDQzMzYKMTQyMiwgNTc3LDE0NzAsMzAyNiwxNTI0LDM0MTAsNTU4NSw1NTg2LCA0MzIsNDM3NiwzMDc0LDM1MjcsNTU4NywyNTk0LDE0NTUsMjUxNSwgIyA0MzUyCjIyMzAsMTk3MywxMTc1LDU1ODgsMTAyMCwyNzQxLDQxMTgsMzUyOCw0NzM3LDU1ODksMjc0Miw1NTkwLDE3NDMsMTM2MSwzMDc1LDM1MjksICMgNDM2OAoyNjQ5LDQxMTksNDM3Nyw0NzM4LDIyOTUsIDg5NSwgOTI0LDQzNzgsMjE3MSwgMzMxLDIyNDcsMzA3NiwgMTY2LDE2MjcsMzA3NywxMDk4LCAjIDQzODQKNTU5MSwxMjMyLDI4OTQsMjIzMSwzNDExLDQ3MzksIDY1NywgNDAzLDExOTYsMjM3NywgNTQyLDM3NzUsMzQxMiwxNjAwLDQzNzksMzUzMCwgIyA0NDAwCjU1OTIsNDc0MCwyNzc3LDMyNjEsIDU3NiwgNTMwLDEzNjIsNDc0MSw0NzQyLDI1NDAsMjY3NiwzNzc2LDQxMjAsNTU5MywgODQyLDM5MTMsICMgNDQxNgo1NTk0LDI4MTQsMjAzMiwxMDE0LDQxMjEsIDIxMywyNzA5LDM0MTMsIDY2NSwgNjIxLDQzODAsNTU5NSwzNzc3LDI5MzksMjQzNSw1NTk2LCAjIDQ0MzIKMjQzNiwzMzM1LDM2NDMsMzQxNCw0NzQzLDQzODEsMjU0MSw0MzgyLDQ3NDQsMzY0NCwxNjgyLDQzODMsMzUzMSwxMzgwLDU1OTcsIDcyNCwgIyA0NDQ4CjIyODIsIDYwMCwxNjcwLDU1OTgsMTMzNywxMjMzLDQ3NDUsMzEyNiwyMjQ4LDU1OTksMTYyMSw0NzQ2LDU2MDAsIDY1MSw0Mzg0LDU2MDEsICMgNDQ2NAoxNjEyLDQzODUsMjYyMSw1NjAyLDI4NTcsNTYwMywyNzQzLDIzMTIsMzA3OCw1NjA0LCA3MTYsMjQ2NCwzMDc5LCAxNzQsMTI1NSwyNzEwLCAjIDQ0ODAKNDEyMiwzNjQ1LCA1NDgsMTMyMCwxMzk4LCA3MjgsNDEyMywxNTc0LDU2MDUsMTg5MSwxMTk3LDMwODAsNDEyNCw1NjA2LDMwODEsMzA4MiwgIyA0NDk2CjM3NzgsMzY0NiwzNzc5LCA3NDcsNTYwNywgNjM1LDQzODYsNDc0Nyw1NjA4LDU2MDksNTYxMCw0Mzg3LDU2MTEsNTYxMiw0NzQ4LDU2MTMsICMgNDUxMgozNDE1LDQ3NDksMjQzNywgNDUxLDU2MTQsMzc4MCwyNTQyLDIwNzMsNDM4OCwyNzQ0LDQzODksNDEyNSw1NjE1LDE3NjQsNDc1MCw1NjE2LCAjIDQ1MjgKNDM5MCwgMzUwLDQ3NTEsMjI4MywyMzk1LDI0OTMsNTYxNyw0MzkxLDQxMjYsMjI0OSwxNDM0LDQxMjcsIDQ4OCw0NzUyLCA0NTgsNDM5MiwgIyA0NTQ0CjQxMjgsMzc4MSwgNzcxLDEzMzAsMjM5NiwzOTE0LDI1NzYsMzE4NCwyMTYwLDI0MTQsMTU1MywyNjc3LDMxODUsNDM5Myw1NjE4LDI0OTQsICMgNDU2MAoyODk1LDI2MjIsMTcyMCwyNzExLDQzOTQsMzQxNiw0NzUzLDU2MTksMjU0Myw0Mzk1LDU2MjAsMzI2Miw0Mzk2LDI3NzgsNTYyMSwyMDE2LCAjIDQ1NzYKMjc0NSw1NjIyLDExNTUsMTAxNywzNzgyLDM5MTUsNTYyMywzMzM2LDIzMTMsIDIwMSwxODY1LDQzOTcsMTQzMCw1NjI0LDQxMjksNTYyNSwgIyA0NTkyCjU2MjYsNTYyNyw1NjI4LDU2MjksNDM5OCwxNjA0LDU2MzAsIDQxNCwxODY2LCAzNzEsMjU5NSw0NzU0LDQ3NTUsMzUzMiwyMDE3LDMxMjcsICMgNDYwOAo0NzU2LDE3MDgsIDk2MCw0Mzk5LCA4ODcsIDM4OSwyMTcyLDE1MzYsMTY2MywxNzIxLDU2MzEsMjIzMiw0MTMwLDIzNTYsMjk0MCwxNTgwLCAjIDQ2MjQKNTYzMiw1NjMzLDE3NDQsNDc1NywyNTQ0LDQ3NTgsNDc1OSw1NjM0LDQ3NjAsNTYzNSwyMDc0LDU2MzYsNDc2MSwzNjQ3LDM0MTcsMjg5NiwgIyA0NjQwCjQ0MDAsNTYzNyw0NDAxLDI2NTAsMzQxOCwyODE1LCA2NzMsMjcxMiwyNDY1LCA3MDksMzUzMyw0MTMxLDM2NDgsNDQwMiw1NjM4LDExNDgsICMgNDY1NgogNTAyLCA2MzQsNTYzOSw1NjQwLDEyMDQsNDc2MiwzNjQ5LDE1NzUsNDc2MywyNjIzLDM3ODMsNTY0MSwzNzg0LDMxMjgsIDk0OCwzMjYzLCAjIDQ2NzIKIDEyMSwxNzQ1LDM5MTYsMTExMCw1NjQyLDQ0MDMsMzA4MywyNTE2LDMwMjcsNDEzMiwzNzg1LDExNTEsMTc3MSwzOTE3LDE0ODgsNDEzMywgIyA0Njg4CjE5ODcsNTY0MywyNDM4LDM1MzQsNTY0NCw1NjQ1LDIwOTQsNTY0Niw0NDA0LDM5MTgsMTIxMywxNDA3LDI4MTYsIDUzMSwyNzQ2LDI1NDUsICMgNDcwNAozMjY0LDEwMTEsMTUzNyw0NzY0LDI3NzksNDQwNSwzMTI5LDEwNjEsNTY0NywzNzg2LDM3ODcsMTg2NywyODk3LDU2NDgsMjAxOCwgMTIwLCAjIDQ3MjAKNDQwNiw0NDA3LDIwNjMsMzY1MCwzMjY1LDIzMTQsMzkxOSwyNjc4LDM0MTksMTk1NSw0NzY1LDQxMzQsNTY0OSwzNTM1LDEwNDcsMjcxMywgIyA0NzM2CjEyNjYsNTY1MCwxMzY4LDQ3NjYsMjg1OCwgNjQ5LDM0MjAsMzkyMCwyNTQ2LDI3NDcsMTEwMiwyODU5LDI2NzksNTY1MSw1NjUyLDIwMDAsICMgNDc1Mgo1NjUzLDExMTEsMzY1MSwyOTc3LDU2NTQsMjQ5NSwzOTIxLDM2NTIsMjgxNywxODU1LDM0MjEsMzc4OCw1NjU1LDU2NTYsMzQyMiwyNDE1LCAjIDQ3NjgKMjg5OCwzMzM3LDMyNjYsMzY1Myw1NjU3LDI1NzcsNTY1OCwzNjU0LDI4MTgsNDEzNSwxNDYwLCA4NTYsNTY1OSwzNjU1LDU2NjAsMjg5OSwgIyA0Nzg0CjI5NzgsNTY2MSwyOTAwLDM5MjIsNTY2Miw0NDA4LCA2MzIsMjUxNywgODc1LDM5MjMsMTY5NywzOTI0LDIyOTYsNTY2Myw1NjY0LDQ3NjcsICMgNDgwMAozMDI4LDEyMzksIDU4MCw0NzY4LDQ0MDksNTY2NSwgOTE0LCA5MzYsMjA3NSwxMTkwLDQxMzYsMTAzOSwyMTI0LDU2NjYsNTY2Nyw1NjY4LCAjIDQ4MTYKNTY2OSwzNDIzLDE0NzMsNTY3MCwxMzU0LDQ0MTAsMzkyNSw0NzY5LDIxNzMsMzA4NCw0MTM3LCA5MTUsMzMzOCw0NDExLDQ0MTIsMzMzOSwgIyA0ODMyCjE2MDUsMTgzNSw1NjcxLDI3NDgsIDM5OCwzNjU2LDQ0MTMsMzkyNiw0MTM4LCAzMjgsMTkxMywyODYwLDQxMzksMzkyNywxMzMxLDQ0MTQsICMgNDg0OAozMDI5LCA5MzcsNDQxNSw1NjcyLDM2NTcsNDE0MCw0MTQxLDM0MjQsMjE2MSw0NzcwLDM0MjUsIDUyNCwgNzQyLCA1MzgsMzA4NSwxMDEyLCAjIDQ4NjQKNTY3Myw1Njc0LDM5MjgsMjQ2Niw1Njc1LCA2NTgsMTEwMywgMjI1LDM5MjksNTY3Niw1Njc3LDQ3NzEsNTY3OCw0NzcyLDU2NzksMzI2NywgIyA0ODgwCjEyNDMsNTY4MCw0MTQyLCA5NjMsMjI1MCw0NzczLDU2ODEsMjcxNCwzNjU4LDMxODYsNTY4Miw1NjgzLDI1OTYsMjMzMiw1Njg0LDQ3NzQsICMgNDg5Ngo1Njg1LDU2ODYsNTY4NywzNTM2LCA5NTcsMzQyNiwyNTQ3LDIwMzMsMTkzMSwyOTQxLDI0NjcsIDg3MCwyMDE5LDM2NTksMTc0NiwyNzgwLCAjIDQ5MTIKMjc4MSwyNDM5LDI0NjgsNTY4OCwzOTMwLDU2ODksMzc4OSwzMTMwLDM3OTAsMzUzNywzNDI3LDM3OTEsNTY5MCwxMTc5LDMwODYsNTY5MSwgIyA0OTI4CjMxODcsMjM3OCw0NDE2LDM3OTIsMjU0OCwzMTg4LDMxMzEsMjc0OSw0MTQzLDU2OTIsMzQyOCwxNTU2LDI1NDksMjI5NywgOTc3LDI5MDEsICMgNDk0NAoyMDM0LDQxNDQsMTIwNSwzNDI5LDU2OTMsMTc2NSwzNDMwLDMxODksMjEyNSwxMjcxLCA3MTQsMTY4OSw0Nzc1LDM1MzgsNTY5NCwyMzMzLCAjIDQ5NjAKMzkzMSwgNTMzLDQ0MTcsMzY2MCwyMTg0LCA2MTcsNTY5NSwyNDY5LDMzNDAsMzUzOSwyMzE1LDU2OTYsNTY5NywzMTkwLDU2OTgsNTY5OSwgIyA0OTc2CjM5MzIsMTk4OCwgNjE4LCA0MjcsMjY1MSwzNTQwLDM0MzEsNTcwMCw1NzAxLDEyNDQsMTY5MCw1NzAyLDI4MTksNDQxOCw0Nzc2LDU3MDMsICMgNDk5MgozNTQxLDQ3NzcsNTcwNCwyMjg0LDE1NzYsIDQ3MywzNjYxLDQ0MTksMzQzMiwgOTcyLDU3MDUsMzY2Miw1NzA2LDMwODcsNTcwNyw1NzA4LCAjIDUwMDgKNDc3OCw0Nzc5LDU3MDksMzc5Myw0MTQ1LDQxNDYsNTcxMCwgMTUzLDQ3ODAsIDM1Niw1NzExLDE4OTIsMjkwMiw0NDIwLDIxNDQsIDQwOCwgIyA1MDI0CiA4MDMsMjM1Nyw1NzEyLDM5MzMsNTcxMyw0NDIxLDE2NDYsMjU3OCwyNTE4LDQ3ODEsNDc4MiwzOTM0LDU3MTQsMzkzNSw0NDIyLDU3MTUsICMgNTA0MAoyNDE2LDM0MzMsIDc1Miw1NzE2LDU3MTcsMTk2MiwzMzQxLDI5NzksNTcxOCwgNzQ2LDMwMzAsMjQ3MCw0NzgzLDQ0MjMsMzc5NCwgNjk4LCAjIDUwNTYKNDc4NCwxODkzLDQ0MjQsMzY2MywyNTUwLDQ3ODUsMzY2NCwzOTM2LDU3MTksMzE5MSwzNDM0LDU3MjAsMTgyNCwxMzAyLDQxNDcsMjcxNSwgIyA1MDcyCjM5MzcsMTk3NCw0NDI1LDU3MjEsNDQyNiwzMTkyLCA4MjMsMTMwMywxMjg4LDEyMzYsMjg2MSwzNTQyLDQxNDgsMzQzNSwgNzc0LDM5MzgsICMgNTA4OAo1NzIyLDE1ODEsNDc4NiwxMzA0LDI4NjIsMzkzOSw0Nzg3LDU3MjMsMjQ0MCwyMTYyLDEwODMsMzI2OCw0NDI3LDQxNDksNDQyOCwgMzQ0LCAjIDUxMDQKMTE3MywgMjg4LDIzMTYsIDQ1NCwxNjgzLDU3MjQsNTcyNSwxNDYxLDQ3ODgsNDE1MCwyNTk3LDU3MjYsNTcyNyw0Nzg5LCA5ODUsIDg5NCwgIyA1MTIwCjU3MjgsMzQzNiwzMTkzLDU3MjksMTkxNCwyOTQyLDM3OTUsMTk4OSw1NzMwLDIxMTEsMTk3NSw1NzMxLDQxNTEsNTczMiwyNTc5LDExOTQsICMgNTEzNgogNDI1LDU3MzMsNDc5MCwzMTk0LDEyNDUsMzc5Niw0NDI5LDU3MzQsNTczNSwyODYzLDU3MzYsIDYzNiw0NzkxLDE4NTYsMzk0MCwgNzYwLCAjIDUxNTIKMTgwMCw1NzM3LDQ0MzAsMjIxMiwxNTA4LDQ3OTIsNDE1MiwxODk0LDE2ODQsMjI5OCw1NzM4LDU3MzksNDc5Myw0NDMxLDQ0MzIsMjIxMywgIyA1MTY4CiA0NzksNTc0MCw1NzQxLCA4MzIsNTc0Miw0MTUzLDI0OTYsNTc0MywyOTgwLDI0OTcsMzc5NywgOTkwLDMxMzIsIDYyNywxODE1LDI2NTIsICMgNTE4NAo0NDMzLDE1ODIsNDQzNCwyMTI2LDIxMTIsMzU0Myw0Nzk0LDU3NDQsIDc5OSw0NDM1LDMxOTUsNTc0NSw0Nzk1LDIxMTMsMTczNywzMDMxLCAjIDUyMDAKMTAxOCwgNTQzLCA3NTQsNDQzNiwzMzQyLDE2NzYsNDc5Niw0Nzk3LDQxNTQsNDc5OCwxNDg5LDU3NDYsMzU0NCw1NzQ3LDI2MjQsMjkwMywgIyA1MjE2CjQxNTUsNTc0OCw1NzQ5LDI5ODEsNTc1MCw1NzUxLDU3NTIsNTc1MywzMTk2LDQ3OTksNDgwMCwyMTg1LDE3MjIsNTc1NCwzMjY5LDMyNzAsICMgNTIzMgoxODQzLDM2NjUsMTcxNSwgNDgxLCAzNjUsMTk3NiwxODU3LDU3NTUsNTc1NiwxOTYzLDI0OTgsNDgwMSw1NzU3LDIxMjcsMzY2NiwzMjcxLCAjIDUyNDgKIDQzMywxODk1LDIwNjQsMjA3Niw1NzU4LCA2MDIsMjc1MCw1NzU5LDU3NjAsNTc2MSw1NzYyLDU3NjMsMzAzMiwxNjI4LDM0MzcsNTc2NCwgIyA1MjY0CjMxOTcsNDgwMiw0MTU2LDI5MDQsNDgwMywyNTE5LDU3NjUsMjU1MSwyNzgyLDU3NjYsNTc2Nyw1NzY4LDMzNDMsNDgwNCwyOTA1LDU3NjksICMgNTI4MAo0ODA1LDU3NzAsMjg2NCw0ODA2LDQ4MDcsMTIyMSwyOTgyLDQxNTcsMjUyMCw1NzcxLDU3NzIsNTc3MywxODY4LDE5OTAsNTc3NCw1Nzc1LCAjIDUyOTYKNTc3NiwxODk2LDU3NzcsNTc3OCw0ODA4LDE4OTcsNDE1OCwgMzE4LDU3NzksMjA5NSw0MTU5LDQ0MzcsNTc4MCw1NzgxLCA0ODUsNTc4MiwgIyA1MzEyCiA5MzgsMzk0MSwgNTUzLDI2ODAsIDExNiw1NzgzLDM5NDIsMzY2Nyw1Nzg0LDM1NDUsMjY4MSwyNzgzLDM0MzgsMzM0NCwyODIwLDU3ODUsICMgNTMyOAozNjY4LDI5NDMsNDE2MCwxNzQ3LDI5NDQsMjk4Myw1Nzg2LDU3ODcsIDIwNyw1Nzg4LDQ4MDksNTc4OSw0ODEwLDI1MjEsNTc5MCwzMDMzLCAjIDUzNDQKIDg5MCwzNjY5LDM5NDMsNTc5MSwxODc4LDM3OTgsMzQzOSw1NzkyLDIxODYsMjM1OCwzNDQwLDE2NTIsNTc5Myw1Nzk0LDU3OTUsIDk0MSwgIyA1MzYwCjIyOTksIDIwOCwzNTQ2LDQxNjEsMjAyMCwgMzMwLDQ0MzgsMzk0NCwyOTA2LDI0OTksMzc5OSw0NDM5LDQ4MTEsNTc5Niw1Nzk3LDU3OTgsICMgNTM3NgopCgpQSwMEFAAAAAAAAAAhAMvnZ2bdBgAA3QYAADEAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9iaWc1cHJvYmVyLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBDb21tdW5pY2F0b3IgY2xpZW50IGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAxOTk4CiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpmcm9tIC5tYmNoYXJzZXRwcm9iZXIgaW1wb3J0IE11bHRpQnl0ZUNoYXJTZXRQcm9iZXIKZnJvbSAuY29kaW5nc3RhdGVtYWNoaW5lIGltcG9ydCBDb2RpbmdTdGF0ZU1hY2hpbmUKZnJvbSAuY2hhcmRpc3RyaWJ1dGlvbiBpbXBvcnQgQmlnNURpc3RyaWJ1dGlvbkFuYWx5c2lzCmZyb20gLm1iY3NzbSBpbXBvcnQgQklHNV9TTV9NT0RFTAoKCmNsYXNzIEJpZzVQcm9iZXIoTXVsdGlCeXRlQ2hhclNldFByb2Jlcik6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc3VwZXIoQmlnNVByb2Jlciwgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuY29kaW5nX3NtID0gQ29kaW5nU3RhdGVNYWNoaW5lKEJJRzVfU01fTU9ERUwpCiAgICAgICAgc2VsZi5kaXN0cmlidXRpb25fYW5hbHl6ZXIgPSBCaWc1RGlzdHJpYnV0aW9uQW5hbHlzaXMoKQogICAgICAgIHNlbGYucmVzZXQoKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNoYXJzZXRfbmFtZShzZWxmKToKICAgICAgICByZXR1cm4gIkJpZzUiCgogICAgQHByb3BlcnR5CiAgICBkZWYgbGFuZ3VhZ2Uoc2VsZik6CiAgICAgICAgcmV0dXJuICJDaGluZXNlIgpQSwMEFAAAAAAAAAAhAOBZKD3DJAAAwyQAADcAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9jaGFyZGlzdHJpYnV0aW9uLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBDb21tdW5pY2F0b3IgY2xpZW50IGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAxOTk4CiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpmcm9tIC5ldWN0d2ZyZXEgaW1wb3J0IChFVUNUV19DSEFSX1RPX0ZSRVFfT1JERVIsIEVVQ1RXX1RBQkxFX1NJWkUsCiAgICAgICAgICAgICAgICAgICAgICAgIEVVQ1RXX1RZUElDQUxfRElTVFJJQlVUSU9OX1JBVElPKQpmcm9tIC5ldWNrcmZyZXEgaW1wb3J0IChFVUNLUl9DSEFSX1RPX0ZSRVFfT1JERVIsIEVVQ0tSX1RBQkxFX1NJWkUsCiAgICAgICAgICAgICAgICAgICAgICAgIEVVQ0tSX1RZUElDQUxfRElTVFJJQlVUSU9OX1JBVElPKQpmcm9tIC5nYjIzMTJmcmVxIGltcG9ydCAoR0IyMzEyX0NIQVJfVE9fRlJFUV9PUkRFUiwgR0IyMzEyX1RBQkxFX1NJWkUsCiAgICAgICAgICAgICAgICAgICAgICAgICBHQjIzMTJfVFlQSUNBTF9ESVNUUklCVVRJT05fUkFUSU8pCmZyb20gLmJpZzVmcmVxIGltcG9ydCAoQklHNV9DSEFSX1RPX0ZSRVFfT1JERVIsIEJJRzVfVEFCTEVfU0laRSwKICAgICAgICAgICAgICAgICAgICAgICBCSUc1X1RZUElDQUxfRElTVFJJQlVUSU9OX1JBVElPKQpmcm9tIC5qaXNmcmVxIGltcG9ydCAoSklTX0NIQVJfVE9fRlJFUV9PUkRFUiwgSklTX1RBQkxFX1NJWkUsCiAgICAgICAgICAgICAgICAgICAgICBKSVNfVFlQSUNBTF9ESVNUUklCVVRJT05fUkFUSU8pCgoKY2xhc3MgQ2hhckRpc3RyaWJ1dGlvbkFuYWx5c2lzKG9iamVjdCk6CiAgICBFTk9VR0hfREFUQV9USFJFU0hPTEQgPSAxMDI0CiAgICBTVVJFX1lFUyA9IDAuOTkKICAgIFNVUkVfTk8gPSAwLjAxCiAgICBNSU5JTVVNX0RBVEFfVEhSRVNIT0xEID0gMwoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAjIE1hcHBpbmcgdGFibGUgdG8gZ2V0IGZyZXF1ZW5jeSBvcmRlciBmcm9tIGNoYXIgb3JkZXIgKGdldCBmcm9tCiAgICAgICAgIyBHZXRPcmRlcigpKQogICAgICAgIHNlbGYuX2NoYXJfdG9fZnJlcV9vcmRlciA9IE5vbmUKICAgICAgICBzZWxmLl90YWJsZV9zaXplID0gTm9uZSAgIyBTaXplIG9mIGFib3ZlIHRhYmxlCiAgICAgICAgIyBUaGlzIGlzIGEgY29uc3RhbnQgdmFsdWUgd2hpY2ggdmFyaWVzIGZyb20gbGFuZ3VhZ2UgdG8gbGFuZ3VhZ2UsCiAgICAgICAgIyB1c2VkIGluIGNhbGN1bGF0aW5nIGNvbmZpZGVuY2UuICBTZWUKICAgICAgICAjIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvcHJvamVjdHMvaW50bC9Vbml2ZXJzYWxDaGFyc2V0RGV0ZWN0aW9uLmh0bWwKICAgICAgICAjIGZvciBmdXJ0aGVyIGRldGFpbC4KICAgICAgICBzZWxmLnR5cGljYWxfZGlzdHJpYnV0aW9uX3JhdGlvID0gTm9uZQogICAgICAgIHNlbGYuX2RvbmUgPSBOb25lCiAgICAgICAgc2VsZi5fdG90YWxfY2hhcnMgPSBOb25lCiAgICAgICAgc2VsZi5fZnJlcV9jaGFycyA9IE5vbmUKICAgICAgICBzZWxmLnJlc2V0KCkKCiAgICBkZWYgcmVzZXQoc2VsZik6CiAgICAgICAgIiIicmVzZXQgYW5hbHlzZXIsIGNsZWFyIGFueSBzdGF0ZSIiIgogICAgICAgICMgSWYgdGhpcyBmbGFnIGlzIHNldCB0byBUcnVlLCBkZXRlY3Rpb24gaXMgZG9uZSBhbmQgY29uY2x1c2lvbiBoYXMKICAgICAgICAjIGJlZW4gbWFkZQogICAgICAgIHNlbGYuX2RvbmUgPSBGYWxzZQogICAgICAgIHNlbGYuX3RvdGFsX2NoYXJzID0gMCAgIyBUb3RhbCBjaGFyYWN0ZXJzIGVuY291bnRlcmVkCiAgICAgICAgIyBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd2hvc2UgZnJlcXVlbmN5IG9yZGVyIGlzIGxlc3MgdGhhbiA1MTIKICAgICAgICBzZWxmLl9mcmVxX2NoYXJzID0gMAoKICAgIGRlZiBmZWVkKHNlbGYsIGNoYXIsIGNoYXJfbGVuKToKICAgICAgICAiIiJmZWVkIGEgY2hhcmFjdGVyIHdpdGgga25vd24gbGVuZ3RoIiIiCiAgICAgICAgaWYgY2hhcl9sZW4gPT0gMjoKICAgICAgICAgICAgIyB3ZSBvbmx5IGNhcmUgYWJvdXQgMi1ieXRlcyBjaGFyYWN0ZXIgaW4gb3VyIGRpc3RyaWJ1dGlvbiBhbmFseXNpcwogICAgICAgICAgICBvcmRlciA9IHNlbGYuZ2V0X29yZGVyKGNoYXIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgb3JkZXIgPSAtMQogICAgICAgIGlmIG9yZGVyID49IDA6CiAgICAgICAgICAgIHNlbGYuX3RvdGFsX2NoYXJzICs9IDEKICAgICAgICAgICAgIyBvcmRlciBpcyB2YWxpZAogICAgICAgICAgICBpZiBvcmRlciA8IHNlbGYuX3RhYmxlX3NpemU6CiAgICAgICAgICAgICAgICBpZiA1MTIgPiBzZWxmLl9jaGFyX3RvX2ZyZXFfb3JkZXJbb3JkZXJdOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2ZyZXFfY2hhcnMgKz0gMQoKICAgIGRlZiBnZXRfY29uZmlkZW5jZShzZWxmKToKICAgICAgICAiIiJyZXR1cm4gY29uZmlkZW5jZSBiYXNlZCBvbiBleGlzdGluZyBkYXRhIiIiCiAgICAgICAgIyBpZiB3ZSBkaWRuJ3QgcmVjZWl2ZSBhbnkgY2hhcmFjdGVyIGluIG91ciBjb25zaWRlcmF0aW9uIHJhbmdlLAogICAgICAgICMgcmV0dXJuIG5lZ2F0aXZlIGFuc3dlcgogICAgICAgIGlmIHNlbGYuX3RvdGFsX2NoYXJzIDw9IDAgb3Igc2VsZi5fZnJlcV9jaGFycyA8PSBzZWxmLk1JTklNVU1fREFUQV9USFJFU0hPTEQ6CiAgICAgICAgICAgIHJldHVybiBzZWxmLlNVUkVfTk8KCiAgICAgICAgaWYgc2VsZi5fdG90YWxfY2hhcnMgIT0gc2VsZi5fZnJlcV9jaGFyczoKICAgICAgICAgICAgciA9IChzZWxmLl9mcmVxX2NoYXJzIC8gKChzZWxmLl90b3RhbF9jaGFycyAtIHNlbGYuX2ZyZXFfY2hhcnMpCiAgICAgICAgICAgICAgICAgKiBzZWxmLnR5cGljYWxfZGlzdHJpYnV0aW9uX3JhdGlvKSkKICAgICAgICAgICAgaWYgciA8IHNlbGYuU1VSRV9ZRVM6CiAgICAgICAgICAgICAgICByZXR1cm4gcgoKICAgICAgICAjIG5vcm1hbGl6ZSBjb25maWRlbmNlICh3ZSBkb24ndCB3YW50IHRvIGJlIDEwMCUgc3VyZSkKICAgICAgICByZXR1cm4gc2VsZi5TVVJFX1lFUwoKICAgIGRlZiBnb3RfZW5vdWdoX2RhdGEoc2VsZik6CiAgICAgICAgIyBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIHJlY2VpdmUgYWxsIGRhdGEgdG8gZHJhdyBjb25jbHVzaW9uLgogICAgICAgICMgRm9yIGNoYXJzZXQgZGV0ZWN0aW9uLCBjZXJ0YWluIGFtb3VudCBvZiBkYXRhIGlzIGVub3VnaAogICAgICAgIHJldHVybiBzZWxmLl90b3RhbF9jaGFycyA+IHNlbGYuRU5PVUdIX0RBVEFfVEhSRVNIT0xECgogICAgZGVmIGdldF9vcmRlcihzZWxmLCBieXRlX3N0cik6CiAgICAgICAgIyBXZSBkbyBub3QgaGFuZGxlIGNoYXJhY3RlcnMgYmFzZWQgb24gdGhlIG9yaWdpbmFsIGVuY29kaW5nIHN0cmluZywKICAgICAgICAjIGJ1dCBjb252ZXJ0IHRoaXMgZW5jb2Rpbmcgc3RyaW5nIHRvIGEgbnVtYmVyLCBoZXJlIGNhbGxlZCBvcmRlci4KICAgICAgICAjIFRoaXMgYWxsb3dzIG11bHRpcGxlIGVuY29kaW5ncyBvZiBhIGxhbmd1YWdlIHRvIHNoYXJlIG9uZSBmcmVxdWVuY3kKICAgICAgICAjIHRhYmxlLgogICAgICAgIHJldHVybiAtMQoKCmNsYXNzIEVVQ1RXRGlzdHJpYnV0aW9uQW5hbHlzaXMoQ2hhckRpc3RyaWJ1dGlvbkFuYWx5c2lzKToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzdXBlcihFVUNUV0Rpc3RyaWJ1dGlvbkFuYWx5c2lzLCBzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5fY2hhcl90b19mcmVxX29yZGVyID0gRVVDVFdfQ0hBUl9UT19GUkVRX09SREVSCiAgICAgICAgc2VsZi5fdGFibGVfc2l6ZSA9IEVVQ1RXX1RBQkxFX1NJWkUKICAgICAgICBzZWxmLnR5cGljYWxfZGlzdHJpYnV0aW9uX3JhdGlvID0gRVVDVFdfVFlQSUNBTF9ESVNUUklCVVRJT05fUkFUSU8KCiAgICBkZWYgZ2V0X29yZGVyKHNlbGYsIGJ5dGVfc3RyKToKICAgICAgICAjIGZvciBldWMtVFcgZW5jb2RpbmcsIHdlIGFyZSBpbnRlcmVzdGVkCiAgICAgICAgIyAgIGZpcnN0ICBieXRlIHJhbmdlOiAweGM0IC0tIDB4ZmUKICAgICAgICAjICAgc2Vjb25kIGJ5dGUgcmFuZ2U6IDB4YTEgLS0gMHhmZQogICAgICAgICMgbm8gdmFsaWRhdGlvbiBuZWVkZWQgaGVyZS4gU3RhdGUgbWFjaGluZSBoYXMgZG9uZSB0aGF0CiAgICAgICAgZmlyc3RfY2hhciA9IGJ5dGVfc3RyWzBdCiAgICAgICAgaWYgZmlyc3RfY2hhciA+PSAweEM0OgogICAgICAgICAgICByZXR1cm4gOTQgKiAoZmlyc3RfY2hhciAtIDB4QzQpICsgYnl0ZV9zdHJbMV0gLSAweEExCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIC0xCgoKY2xhc3MgRVVDS1JEaXN0cmlidXRpb25BbmFseXNpcyhDaGFyRGlzdHJpYnV0aW9uQW5hbHlzaXMpOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHN1cGVyKEVVQ0tSRGlzdHJpYnV0aW9uQW5hbHlzaXMsIHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLl9jaGFyX3RvX2ZyZXFfb3JkZXIgPSBFVUNLUl9DSEFSX1RPX0ZSRVFfT1JERVIKICAgICAgICBzZWxmLl90YWJsZV9zaXplID0gRVVDS1JfVEFCTEVfU0laRQogICAgICAgIHNlbGYudHlwaWNhbF9kaXN0cmlidXRpb25fcmF0aW8gPSBFVUNLUl9UWVBJQ0FMX0RJU1RSSUJVVElPTl9SQVRJTwoKICAgIGRlZiBnZXRfb3JkZXIoc2VsZiwgYnl0ZV9zdHIpOgogICAgICAgICMgZm9yIGV1Yy1LUiBlbmNvZGluZywgd2UgYXJlIGludGVyZXN0ZWQKICAgICAgICAjICAgZmlyc3QgIGJ5dGUgcmFuZ2U6IDB4YjAgLS0gMHhmZQogICAgICAgICMgICBzZWNvbmQgYnl0ZSByYW5nZTogMHhhMSAtLSAweGZlCiAgICAgICAgIyBubyB2YWxpZGF0aW9uIG5lZWRlZCBoZXJlLiBTdGF0ZSBtYWNoaW5lIGhhcyBkb25lIHRoYXQKICAgICAgICBmaXJzdF9jaGFyID0gYnl0ZV9zdHJbMF0KICAgICAgICBpZiBmaXJzdF9jaGFyID49IDB4QjA6CiAgICAgICAgICAgIHJldHVybiA5NCAqIChmaXJzdF9jaGFyIC0gMHhCMCkgKyBieXRlX3N0clsxXSAtIDB4QTEKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gLTEKCgpjbGFzcyBHQjIzMTJEaXN0cmlidXRpb25BbmFseXNpcyhDaGFyRGlzdHJpYnV0aW9uQW5hbHlzaXMpOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHN1cGVyKEdCMjMxMkRpc3RyaWJ1dGlvbkFuYWx5c2lzLCBzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5fY2hhcl90b19mcmVxX29yZGVyID0gR0IyMzEyX0NIQVJfVE9fRlJFUV9PUkRFUgogICAgICAgIHNlbGYuX3RhYmxlX3NpemUgPSBHQjIzMTJfVEFCTEVfU0laRQogICAgICAgIHNlbGYudHlwaWNhbF9kaXN0cmlidXRpb25fcmF0aW8gPSBHQjIzMTJfVFlQSUNBTF9ESVNUUklCVVRJT05fUkFUSU8KCiAgICBkZWYgZ2V0X29yZGVyKHNlbGYsIGJ5dGVfc3RyKToKICAgICAgICAjIGZvciBHQjIzMTIgZW5jb2RpbmcsIHdlIGFyZSBpbnRlcmVzdGVkCiAgICAgICAgIyAgZmlyc3QgIGJ5dGUgcmFuZ2U6IDB4YjAgLS0gMHhmZQogICAgICAgICMgIHNlY29uZCBieXRlIHJhbmdlOiAweGExIC0tIDB4ZmUKICAgICAgICAjIG5vIHZhbGlkYXRpb24gbmVlZGVkIGhlcmUuIFN0YXRlIG1hY2hpbmUgaGFzIGRvbmUgdGhhdAogICAgICAgIGZpcnN0X2NoYXIsIHNlY29uZF9jaGFyID0gYnl0ZV9zdHJbMF0sIGJ5dGVfc3RyWzFdCiAgICAgICAgaWYgKGZpcnN0X2NoYXIgPj0gMHhCMCkgYW5kIChzZWNvbmRfY2hhciA+PSAweEExKToKICAgICAgICAgICAgcmV0dXJuIDk0ICogKGZpcnN0X2NoYXIgLSAweEIwKSArIHNlY29uZF9jaGFyIC0gMHhBMQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiAtMQoKCmNsYXNzIEJpZzVEaXN0cmlidXRpb25BbmFseXNpcyhDaGFyRGlzdHJpYnV0aW9uQW5hbHlzaXMpOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHN1cGVyKEJpZzVEaXN0cmlidXRpb25BbmFseXNpcywgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuX2NoYXJfdG9fZnJlcV9vcmRlciA9IEJJRzVfQ0hBUl9UT19GUkVRX09SREVSCiAgICAgICAgc2VsZi5fdGFibGVfc2l6ZSA9IEJJRzVfVEFCTEVfU0laRQogICAgICAgIHNlbGYudHlwaWNhbF9kaXN0cmlidXRpb25fcmF0aW8gPSBCSUc1X1RZUElDQUxfRElTVFJJQlVUSU9OX1JBVElPCgogICAgZGVmIGdldF9vcmRlcihzZWxmLCBieXRlX3N0cik6CiAgICAgICAgIyBmb3IgYmlnNSBlbmNvZGluZywgd2UgYXJlIGludGVyZXN0ZWQKICAgICAgICAjICAgZmlyc3QgIGJ5dGUgcmFuZ2U6IDB4YTQgLS0gMHhmZQogICAgICAgICMgICBzZWNvbmQgYnl0ZSByYW5nZTogMHg0MCAtLSAweDdlICwgMHhhMSAtLSAweGZlCiAgICAgICAgIyBubyB2YWxpZGF0aW9uIG5lZWRlZCBoZXJlLiBTdGF0ZSBtYWNoaW5lIGhhcyBkb25lIHRoYXQKICAgICAgICBmaXJzdF9jaGFyLCBzZWNvbmRfY2hhciA9IGJ5dGVfc3RyWzBdLCBieXRlX3N0clsxXQogICAgICAgIGlmIGZpcnN0X2NoYXIgPj0gMHhBNDoKICAgICAgICAgICAgaWYgc2Vjb25kX2NoYXIgPj0gMHhBMToKICAgICAgICAgICAgICAgIHJldHVybiAxNTcgKiAoZmlyc3RfY2hhciAtIDB4QTQpICsgc2Vjb25kX2NoYXIgLSAweEExICsgNjMKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiAxNTcgKiAoZmlyc3RfY2hhciAtIDB4QTQpICsgc2Vjb25kX2NoYXIgLSAweDQwCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIC0xCgoKY2xhc3MgU0pJU0Rpc3RyaWJ1dGlvbkFuYWx5c2lzKENoYXJEaXN0cmlidXRpb25BbmFseXNpcyk6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc3VwZXIoU0pJU0Rpc3RyaWJ1dGlvbkFuYWx5c2lzLCBzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5fY2hhcl90b19mcmVxX29yZGVyID0gSklTX0NIQVJfVE9fRlJFUV9PUkRFUgogICAgICAgIHNlbGYuX3RhYmxlX3NpemUgPSBKSVNfVEFCTEVfU0laRQogICAgICAgIHNlbGYudHlwaWNhbF9kaXN0cmlidXRpb25fcmF0aW8gPSBKSVNfVFlQSUNBTF9ESVNUUklCVVRJT05fUkFUSU8KCiAgICBkZWYgZ2V0X29yZGVyKHNlbGYsIGJ5dGVfc3RyKToKICAgICAgICAjIGZvciBzamlzIGVuY29kaW5nLCB3ZSBhcmUgaW50ZXJlc3RlZAogICAgICAgICMgICBmaXJzdCAgYnl0ZSByYW5nZTogMHg4MSAtLSAweDlmICwgMHhlMCAtLSAweGZlCiAgICAgICAgIyAgIHNlY29uZCBieXRlIHJhbmdlOiAweDQwIC0tIDB4N2UsICAweDgxIC0tIG94ZmUKICAgICAgICAjIG5vIHZhbGlkYXRpb24gbmVlZGVkIGhlcmUuIFN0YXRlIG1hY2hpbmUgaGFzIGRvbmUgdGhhdAogICAgICAgIGZpcnN0X2NoYXIsIHNlY29uZF9jaGFyID0gYnl0ZV9zdHJbMF0sIGJ5dGVfc3RyWzFdCiAgICAgICAgaWYgKGZpcnN0X2NoYXIgPj0gMHg4MSkgYW5kIChmaXJzdF9jaGFyIDw9IDB4OUYpOgogICAgICAgICAgICBvcmRlciA9IDE4OCAqIChmaXJzdF9jaGFyIC0gMHg4MSkKICAgICAgICBlbGlmIChmaXJzdF9jaGFyID49IDB4RTApIGFuZCAoZmlyc3RfY2hhciA8PSAweEVGKToKICAgICAgICAgICAgb3JkZXIgPSAxODggKiAoZmlyc3RfY2hhciAtIDB4RTAgKyAzMSkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gLTEKICAgICAgICBvcmRlciA9IG9yZGVyICsgc2Vjb25kX2NoYXIgLSAweDQwCiAgICAgICAgaWYgc2Vjb25kX2NoYXIgPiAweDdGOgogICAgICAgICAgICBvcmRlciA9IC0xCiAgICAgICAgcmV0dXJuIG9yZGVyCgoKY2xhc3MgRVVDSlBEaXN0cmlidXRpb25BbmFseXNpcyhDaGFyRGlzdHJpYnV0aW9uQW5hbHlzaXMpOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHN1cGVyKEVVQ0pQRGlzdHJpYnV0aW9uQW5hbHlzaXMsIHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLl9jaGFyX3RvX2ZyZXFfb3JkZXIgPSBKSVNfQ0hBUl9UT19GUkVRX09SREVSCiAgICAgICAgc2VsZi5fdGFibGVfc2l6ZSA9IEpJU19UQUJMRV9TSVpFCiAgICAgICAgc2VsZi50eXBpY2FsX2Rpc3RyaWJ1dGlvbl9yYXRpbyA9IEpJU19UWVBJQ0FMX0RJU1RSSUJVVElPTl9SQVRJTwoKICAgIGRlZiBnZXRfb3JkZXIoc2VsZiwgYnl0ZV9zdHIpOgogICAgICAgICMgZm9yIGV1Yy1KUCBlbmNvZGluZywgd2UgYXJlIGludGVyZXN0ZWQKICAgICAgICAjICAgZmlyc3QgIGJ5dGUgcmFuZ2U6IDB4YTAgLS0gMHhmZQogICAgICAgICMgICBzZWNvbmQgYnl0ZSByYW5nZTogMHhhMSAtLSAweGZlCiAgICAgICAgIyBubyB2YWxpZGF0aW9uIG5lZWRlZCBoZXJlLiBTdGF0ZSBtYWNoaW5lIGhhcyBkb25lIHRoYXQKICAgICAgICBjaGFyID0gYnl0ZV9zdHJbMF0KICAgICAgICBpZiBjaGFyID49IDB4QTA6CiAgICAgICAgICAgIHJldHVybiA5NCAqIChjaGFyIC0gMHhBMSkgKyBieXRlX3N0clsxXSAtIDB4YTEKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gLTEKUEsDBBQAAAAAAAAAIQCJWSSIyw4AAMsOAAA5AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvY2hhcnNldGdyb3VwcHJvYmVyLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBDb21tdW5pY2F0b3IgY2xpZW50IGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAxOTk4CiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpmcm9tIC5lbnVtcyBpbXBvcnQgUHJvYmluZ1N0YXRlCmZyb20gLmNoYXJzZXRwcm9iZXIgaW1wb3J0IENoYXJTZXRQcm9iZXIKCgpjbGFzcyBDaGFyU2V0R3JvdXBQcm9iZXIoQ2hhclNldFByb2Jlcik6CiAgICBkZWYgX19pbml0X18oc2VsZiwgbGFuZ19maWx0ZXI9Tm9uZSk6CiAgICAgICAgc3VwZXIoQ2hhclNldEdyb3VwUHJvYmVyLCBzZWxmKS5fX2luaXRfXyhsYW5nX2ZpbHRlcj1sYW5nX2ZpbHRlcikKICAgICAgICBzZWxmLl9hY3RpdmVfbnVtID0gMAogICAgICAgIHNlbGYucHJvYmVycyA9IFtdCiAgICAgICAgc2VsZi5fYmVzdF9ndWVzc19wcm9iZXIgPSBOb25lCgogICAgZGVmIHJlc2V0KHNlbGYpOgogICAgICAgIHN1cGVyKENoYXJTZXRHcm91cFByb2Jlciwgc2VsZikucmVzZXQoKQogICAgICAgIHNlbGYuX2FjdGl2ZV9udW0gPSAwCiAgICAgICAgZm9yIHByb2JlciBpbiBzZWxmLnByb2JlcnM6CiAgICAgICAgICAgIGlmIHByb2JlcjoKICAgICAgICAgICAgICAgIHByb2Jlci5yZXNldCgpCiAgICAgICAgICAgICAgICBwcm9iZXIuYWN0aXZlID0gVHJ1ZQogICAgICAgICAgICAgICAgc2VsZi5fYWN0aXZlX251bSArPSAxCiAgICAgICAgc2VsZi5fYmVzdF9ndWVzc19wcm9iZXIgPSBOb25lCgogICAgQHByb3BlcnR5CiAgICBkZWYgY2hhcnNldF9uYW1lKHNlbGYpOgogICAgICAgIGlmIG5vdCBzZWxmLl9iZXN0X2d1ZXNzX3Byb2JlcjoKICAgICAgICAgICAgc2VsZi5nZXRfY29uZmlkZW5jZSgpCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9iZXN0X2d1ZXNzX3Byb2JlcjoKICAgICAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcmV0dXJuIHNlbGYuX2Jlc3RfZ3Vlc3NfcHJvYmVyLmNoYXJzZXRfbmFtZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGxhbmd1YWdlKHNlbGYpOgogICAgICAgIGlmIG5vdCBzZWxmLl9iZXN0X2d1ZXNzX3Byb2JlcjoKICAgICAgICAgICAgc2VsZi5nZXRfY29uZmlkZW5jZSgpCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9iZXN0X2d1ZXNzX3Byb2JlcjoKICAgICAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcmV0dXJuIHNlbGYuX2Jlc3RfZ3Vlc3NfcHJvYmVyLmxhbmd1YWdlCgogICAgZGVmIGZlZWQoc2VsZiwgYnl0ZV9zdHIpOgogICAgICAgIGZvciBwcm9iZXIgaW4gc2VsZi5wcm9iZXJzOgogICAgICAgICAgICBpZiBub3QgcHJvYmVyOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgbm90IHByb2Jlci5hY3RpdmU6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBzdGF0ZSA9IHByb2Jlci5mZWVkKGJ5dGVfc3RyKQogICAgICAgICAgICBpZiBub3Qgc3RhdGU6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBzdGF0ZSA9PSBQcm9iaW5nU3RhdGUuRk9VTkRfSVQ6CiAgICAgICAgICAgICAgICBzZWxmLl9iZXN0X2d1ZXNzX3Byb2JlciA9IHByb2JlcgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuc3RhdGUKICAgICAgICAgICAgZWxpZiBzdGF0ZSA9PSBQcm9iaW5nU3RhdGUuTk9UX01FOgogICAgICAgICAgICAgICAgcHJvYmVyLmFjdGl2ZSA9IEZhbHNlCiAgICAgICAgICAgICAgICBzZWxmLl9hY3RpdmVfbnVtIC09IDEKICAgICAgICAgICAgICAgIGlmIHNlbGYuX2FjdGl2ZV9udW0gPD0gMDoKICAgICAgICAgICAgICAgICAgICBzZWxmLl9zdGF0ZSA9IFByb2JpbmdTdGF0ZS5OT1RfTUUKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5zdGF0ZQogICAgICAgIHJldHVybiBzZWxmLnN0YXRlCgogICAgZGVmIGdldF9jb25maWRlbmNlKHNlbGYpOgogICAgICAgIHN0YXRlID0gc2VsZi5zdGF0ZQogICAgICAgIGlmIHN0YXRlID09IFByb2JpbmdTdGF0ZS5GT1VORF9JVDoKICAgICAgICAgICAgcmV0dXJuIDAuOTkKICAgICAgICBlbGlmIHN0YXRlID09IFByb2JpbmdTdGF0ZS5OT1RfTUU6CiAgICAgICAgICAgIHJldHVybiAwLjAxCiAgICAgICAgYmVzdF9jb25mID0gMC4wCiAgICAgICAgc2VsZi5fYmVzdF9ndWVzc19wcm9iZXIgPSBOb25lCiAgICAgICAgZm9yIHByb2JlciBpbiBzZWxmLnByb2JlcnM6CiAgICAgICAgICAgIGlmIG5vdCBwcm9iZXI6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBub3QgcHJvYmVyLmFjdGl2ZToKICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKCclcyBub3QgYWN0aXZlJywgcHJvYmVyLmNoYXJzZXRfbmFtZSkKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGNvbmYgPSBwcm9iZXIuZ2V0X2NvbmZpZGVuY2UoKQogICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZygnJXMgJXMgY29uZmlkZW5jZSA9ICVzJywgcHJvYmVyLmNoYXJzZXRfbmFtZSwgcHJvYmVyLmxhbmd1YWdlLCBjb25mKQogICAgICAgICAgICBpZiBiZXN0X2NvbmYgPCBjb25mOgogICAgICAgICAgICAgICAgYmVzdF9jb25mID0gY29uZgogICAgICAgICAgICAgICAgc2VsZi5fYmVzdF9ndWVzc19wcm9iZXIgPSBwcm9iZXIKICAgICAgICBpZiBub3Qgc2VsZi5fYmVzdF9ndWVzc19wcm9iZXI6CiAgICAgICAgICAgIHJldHVybiAwLjAKICAgICAgICByZXR1cm4gYmVzdF9jb25mClBLAwQUAAAAAAAAACEA4JdhWvYTAAD2EwAANAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2NoYXJzZXRwcm9iZXIucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBNb3ppbGxhIFVuaXZlcnNhbCBjaGFyc2V0IGRldGVjdG9yIGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAyMDAxCiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojICAgU2h5IFNoYWxvbSAtIG9yaWdpbmFsIEMgY29kZQojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgppbXBvcnQgbG9nZ2luZwppbXBvcnQgcmUKCmZyb20gLmVudW1zIGltcG9ydCBQcm9iaW5nU3RhdGUKCgpjbGFzcyBDaGFyU2V0UHJvYmVyKG9iamVjdCk6CgogICAgU0hPUlRDVVRfVEhSRVNIT0xEID0gMC45NQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsYW5nX2ZpbHRlcj1Ob25lKToKICAgICAgICBzZWxmLl9zdGF0ZSA9IE5vbmUKICAgICAgICBzZWxmLmxhbmdfZmlsdGVyID0gbGFuZ19maWx0ZXIKICAgICAgICBzZWxmLmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKICAgIGRlZiByZXNldChzZWxmKToKICAgICAgICBzZWxmLl9zdGF0ZSA9IFByb2JpbmdTdGF0ZS5ERVRFQ1RJTkcKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjaGFyc2V0X25hbWUoc2VsZik6CiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBkZWYgZmVlZChzZWxmLCBidWYpOgogICAgICAgIHBhc3MKCiAgICBAcHJvcGVydHkKICAgIGRlZiBzdGF0ZShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fc3RhdGUKCiAgICBkZWYgZ2V0X2NvbmZpZGVuY2Uoc2VsZik6CiAgICAgICAgcmV0dXJuIDAuMAoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBmaWx0ZXJfaGlnaF9ieXRlX29ubHkoYnVmKToKICAgICAgICBidWYgPSByZS5zdWIoYicoW1x4MDAtXHg3Rl0pKycsIGInICcsIGJ1ZikKICAgICAgICByZXR1cm4gYnVmCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIGZpbHRlcl9pbnRlcm5hdGlvbmFsX3dvcmRzKGJ1Zik6CiAgICAgICAgIiIiCiAgICAgICAgV2UgZGVmaW5lIHRocmVlIHR5cGVzIG9mIGJ5dGVzOgogICAgICAgIGFscGhhYmV0OiBlbmdsaXNoIGFscGhhYmV0cyBbYS16QS1aXQogICAgICAgIGludGVybmF0aW9uYWw6IGludGVybmF0aW9uYWwgY2hhcmFjdGVycyBbXHg4MC1ceEZGXQogICAgICAgIG1hcmtlcjogZXZlcnl0aGluZyBlbHNlIFteYS16QS1aXHg4MC1ceEZGXQoKICAgICAgICBUaGUgaW5wdXQgYnVmZmVyIGNhbiBiZSB0aG91Z2h0IHRvIGNvbnRhaW4gYSBzZXJpZXMgb2Ygd29yZHMgZGVsaW1pdGVkCiAgICAgICAgYnkgbWFya2Vycy4gVGhpcyBmdW5jdGlvbiB3b3JrcyB0byBmaWx0ZXIgYWxsIHdvcmRzIHRoYXQgY29udGFpbiBhdAogICAgICAgIGxlYXN0IG9uZSBpbnRlcm5hdGlvbmFsIGNoYXJhY3Rlci4gQWxsIGNvbnRpZ3VvdXMgc2VxdWVuY2VzIG9mIG1hcmtlcnMKICAgICAgICBhcmUgcmVwbGFjZWQgYnkgYSBzaW5nbGUgc3BhY2UgYXNjaWkgY2hhcmFjdGVyLgoKICAgICAgICBUaGlzIGZpbHRlciBhcHBsaWVzIHRvIGFsbCBzY3JpcHRzIHdoaWNoIGRvIG5vdCB1c2UgRW5nbGlzaCBjaGFyYWN0ZXJzLgogICAgICAgICIiIgogICAgICAgIGZpbHRlcmVkID0gYnl0ZWFycmF5KCkKCiAgICAgICAgIyBUaGlzIHJlZ2V4IGV4cHJlc3Npb24gZmlsdGVycyBvdXQgb25seSB3b3JkcyB0aGF0IGhhdmUgYXQtbGVhc3Qgb25lCiAgICAgICAgIyBpbnRlcm5hdGlvbmFsIGNoYXJhY3Rlci4gVGhlIHdvcmQgbWF5IGluY2x1ZGUgb25lIG1hcmtlciBjaGFyYWN0ZXIgYXQKICAgICAgICAjIHRoZSBlbmQuCiAgICAgICAgd29yZHMgPSByZS5maW5kYWxsKGInW2EtekEtWl0qW1x4ODAtXHhGRl0rW2EtekEtWl0qW15hLXpBLVpceDgwLVx4RkZdPycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZikKCiAgICAgICAgZm9yIHdvcmQgaW4gd29yZHM6CiAgICAgICAgICAgIGZpbHRlcmVkLmV4dGVuZCh3b3JkWzotMV0pCgogICAgICAgICAgICAjIElmIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgd29yZCBpcyBhIG1hcmtlciwgcmVwbGFjZSBpdCB3aXRoIGEKICAgICAgICAgICAgIyBzcGFjZSBhcyBtYXJrZXJzIHNob3VsZG4ndCBhZmZlY3Qgb3VyIGFuYWx5c2lzICh0aGV5IGFyZSB1c2VkCiAgICAgICAgICAgICMgc2ltaWxhcmx5IGFjcm9zcyBhbGwgbGFuZ3VhZ2VzIGFuZCBtYXkgdGh1cyBoYXZlIHNpbWlsYXIKICAgICAgICAgICAgIyBmcmVxdWVuY2llcykuCiAgICAgICAgICAgIGxhc3RfY2hhciA9IHdvcmRbLTE6XQogICAgICAgICAgICBpZiBub3QgbGFzdF9jaGFyLmlzYWxwaGEoKSBhbmQgbGFzdF9jaGFyIDwgYidceDgwJzoKICAgICAgICAgICAgICAgIGxhc3RfY2hhciA9IGInICcKICAgICAgICAgICAgZmlsdGVyZWQuZXh0ZW5kKGxhc3RfY2hhcikKCiAgICAgICAgcmV0dXJuIGZpbHRlcmVkCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIGZpbHRlcl93aXRoX2VuZ2xpc2hfbGV0dGVycyhidWYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybnMgYSBjb3B5IG9mIGBgYnVmYGAgdGhhdCByZXRhaW5zIG9ubHkgdGhlIHNlcXVlbmNlcyBvZiBFbmdsaXNoCiAgICAgICAgYWxwaGFiZXQgYW5kIGhpZ2ggYnl0ZSBjaGFyYWN0ZXJzIHRoYXQgYXJlIG5vdCBiZXR3ZWVuIDw+IGNoYXJhY3RlcnMuCiAgICAgICAgQWxzbyByZXRhaW5zIEVuZ2xpc2ggYWxwaGFiZXQgYW5kIGhpZ2ggYnl0ZSBjaGFyYWN0ZXJzIGltbWVkaWF0ZWx5CiAgICAgICAgYmVmb3JlIG9jY3VycmVuY2VzIG9mID4uCgogICAgICAgIFRoaXMgZmlsdGVyIGNhbiBiZSBhcHBsaWVkIHRvIGFsbCBzY3JpcHRzIHdoaWNoIGNvbnRhaW4gYm90aCBFbmdsaXNoCiAgICAgICAgY2hhcmFjdGVycyBhbmQgZXh0ZW5kZWQgQVNDSUkgY2hhcmFjdGVycywgYnV0IGlzIGN1cnJlbnRseSBvbmx5IHVzZWQgYnkKICAgICAgICBgYExhdGluMVByb2JlcmBgLgogICAgICAgICIiIgogICAgICAgIGZpbHRlcmVkID0gYnl0ZWFycmF5KCkKICAgICAgICBpbl90YWcgPSBGYWxzZQogICAgICAgIHByZXYgPSAwCgogICAgICAgIGZvciBjdXJyIGluIHJhbmdlKGxlbihidWYpKToKICAgICAgICAgICAgIyBTbGljZSBoZXJlIHRvIGdldCBieXRlcyBpbnN0ZWFkIG9mIGFuIGludCB3aXRoIFB5dGhvbiAzCiAgICAgICAgICAgIGJ1Zl9jaGFyID0gYnVmW2N1cnI6Y3VyciArIDFdCiAgICAgICAgICAgICMgQ2hlY2sgaWYgd2UncmUgY29taW5nIG91dCBvZiBvciBlbnRlcmluZyBhbiBIVE1MIHRhZwogICAgICAgICAgICBpZiBidWZfY2hhciA9PSBiJz4nOgogICAgICAgICAgICAgICAgaW5fdGFnID0gRmFsc2UKICAgICAgICAgICAgZWxpZiBidWZfY2hhciA9PSBiJzwnOgogICAgICAgICAgICAgICAgaW5fdGFnID0gVHJ1ZQoKICAgICAgICAgICAgIyBJZiBjdXJyZW50IGNoYXJhY3RlciBpcyBub3QgZXh0ZW5kZWQtQVNDSUkgYW5kIG5vdCBhbHBoYWJldGljLi4uCiAgICAgICAgICAgIGlmIGJ1Zl9jaGFyIDwgYidceDgwJyBhbmQgbm90IGJ1Zl9jaGFyLmlzYWxwaGEoKToKICAgICAgICAgICAgICAgICMgLi4uYW5kIHdlJ3JlIG5vdCBpbiBhIHRhZwogICAgICAgICAgICAgICAgaWYgY3VyciA+IHByZXYgYW5kIG5vdCBpbl90YWc6CiAgICAgICAgICAgICAgICAgICAgIyBLZWVwIGV2ZXJ5dGhpbmcgYWZ0ZXIgbGFzdCBub24tZXh0ZW5kZWQtQVNDSUksCiAgICAgICAgICAgICAgICAgICAgIyBub24tYWxwaGFiZXRpYyBjaGFyYWN0ZXIKICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZC5leHRlbmQoYnVmW3ByZXY6Y3Vycl0pCiAgICAgICAgICAgICAgICAgICAgIyBPdXRwdXQgYSBzcGFjZSB0byBkZWxpbWl0IHN0cmV0Y2ggd2Uga2VwdAogICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkLmV4dGVuZChiJyAnKQogICAgICAgICAgICAgICAgcHJldiA9IGN1cnIgKyAxCgogICAgICAgICMgSWYgd2UncmUgbm90IGluIGEgdGFnLi4uCiAgICAgICAgaWYgbm90IGluX3RhZzoKICAgICAgICAgICAgIyBLZWVwIGV2ZXJ5dGhpbmcgYWZ0ZXIgbGFzdCBub24tZXh0ZW5kZWQtQVNDSUksIG5vbi1hbHBoYWJldGljCiAgICAgICAgICAgICMgY2hhcmFjdGVyCiAgICAgICAgICAgIGZpbHRlcmVkLmV4dGVuZChidWZbcHJldjpdKQoKICAgICAgICByZXR1cm4gZmlsdGVyZWQKUEsDBBQAAAAAAAAAIQCTBtcyAQAAAAEAAAAzAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvY2xpL19faW5pdF9fLnB5ClBLAwQUAAAAAAAAACEAX92tubIKAACyCgAANQAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2NsaS9jaGFyZGV0ZWN0LnB5IyEvdXNyL2Jpbi9lbnYgcHl0aG9uCiIiIgpTY3JpcHQgd2hpY2ggdGFrZXMgb25lIG9yIG1vcmUgZmlsZSBwYXRocyBhbmQgcmVwb3J0cyBvbiB0aGVpciBkZXRlY3RlZAplbmNvZGluZ3MKCkV4YW1wbGU6OgoKICAgICUgY2hhcmRldGVjdCBzb21lZmlsZSBzb21lb3RoZXJmaWxlCiAgICBzb21lZmlsZTogd2luZG93cy0xMjUyIHdpdGggY29uZmlkZW5jZSAwLjUKICAgIHNvbWVvdGhlcmZpbGU6IGFzY2lpIHdpdGggY29uZmlkZW5jZSAxLjAKCklmIG5vIHBhdGhzIGFyZSBwcm92aWRlZCwgaXQgdGFrZXMgaXRzIGlucHV0IGZyb20gc3RkaW4uCgoiIiIKCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBwcmludF9mdW5jdGlvbiwgdW5pY29kZV9saXRlcmFscwoKaW1wb3J0IGFyZ3BhcnNlCmltcG9ydCBzeXMKCmZyb20gY2hhcmRldCBpbXBvcnQgX192ZXJzaW9uX18KZnJvbSBjaGFyZGV0LmNvbXBhdCBpbXBvcnQgUFkyCmZyb20gY2hhcmRldC51bml2ZXJzYWxkZXRlY3RvciBpbXBvcnQgVW5pdmVyc2FsRGV0ZWN0b3IKCgpkZWYgZGVzY3JpcHRpb25fb2YobGluZXMsIG5hbWU9J3N0ZGluJyk6CiAgICAiIiIKICAgIFJldHVybiBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBwcm9iYWJsZSBlbmNvZGluZyBvZiBhIGZpbGUgb3IKICAgIGxpc3Qgb2Ygc3RyaW5ncy4KCiAgICA6cGFyYW0gbGluZXM6IFRoZSBsaW5lcyB0byBnZXQgdGhlIGVuY29kaW5nIG9mLgogICAgOnR5cGUgbGluZXM6IEl0ZXJhYmxlIG9mIGJ5dGVzCiAgICA6cGFyYW0gbmFtZTogTmFtZSBvZiBmaWxlIG9yIGNvbGxlY3Rpb24gb2YgbGluZXMKICAgIDp0eXBlIG5hbWU6IHN0cgogICAgIiIiCiAgICB1ID0gVW5pdmVyc2FsRGV0ZWN0b3IoKQogICAgZm9yIGxpbmUgaW4gbGluZXM6CiAgICAgICAgbGluZSA9IGJ5dGVhcnJheShsaW5lKQogICAgICAgIHUuZmVlZChsaW5lKQogICAgICAgICMgc2hvcnRjdXQgb3V0IG9mIHRoZSBsb29wIHRvIHNhdmUgcmVhZGluZyBmdXJ0aGVyIC0gcGFydGljdWxhcmx5IHVzZWZ1bCBpZiB3ZSByZWFkIGEgQk9NLgogICAgICAgIGlmIHUuZG9uZToKICAgICAgICAgICAgYnJlYWsKICAgIHUuY2xvc2UoKQogICAgcmVzdWx0ID0gdS5yZXN1bHQKICAgIGlmIFBZMjoKICAgICAgICBuYW1lID0gbmFtZS5kZWNvZGUoc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpLCAnaWdub3JlJykKICAgIGlmIHJlc3VsdFsnZW5jb2RpbmcnXToKICAgICAgICByZXR1cm4gJ3swfTogezF9IHdpdGggY29uZmlkZW5jZSB7Mn0nLmZvcm1hdChuYW1lLCByZXN1bHRbJ2VuY29kaW5nJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Wydjb25maWRlbmNlJ10pCiAgICBlbHNlOgogICAgICAgIHJldHVybiAnezB9OiBubyByZXN1bHQnLmZvcm1hdChuYW1lKQoKCmRlZiBtYWluKGFyZ3Y9Tm9uZSk6CiAgICAiIiIKICAgIEhhbmRsZXMgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBhbmQgZ2V0cyB0aGluZ3Mgc3RhcnRlZC4KCiAgICA6cGFyYW0gYXJndjogTGlzdCBvZiBhcmd1bWVudHMsIGFzIGlmIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZC1saW5lLgogICAgICAgICAgICAgICAgIElmIE5vbmUsIGBgc3lzLmFyZ3ZbMTpdYGAgaXMgdXNlZCBpbnN0ZWFkLgogICAgOnR5cGUgYXJndjogbGlzdCBvZiBzdHIKICAgICIiIgogICAgIyBHZXQgY29tbWFuZCBsaW5lIGFyZ3VtZW50cwogICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoCiAgICAgICAgZGVzY3JpcHRpb249IlRha2VzIG9uZSBvciBtb3JlIGZpbGUgcGF0aHMgYW5kIHJlcG9ydHMgdGhlaXIgZGV0ZWN0ZWQgXAogICAgICAgICAgICAgICAgICAgICBlbmNvZGluZ3MiKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnaW5wdXQnLAogICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdGaWxlIHdob3NlIGVuY29kaW5nIHdlIHdvdWxkIGxpa2UgdG8gZGV0ZXJtaW5lLiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWZhdWx0OiBzdGRpbiknLAogICAgICAgICAgICAgICAgICAgICAgICB0eXBlPWFyZ3BhcnNlLkZpbGVUeXBlKCdyYicpLCBuYXJncz0nKicsCiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9W3N5cy5zdGRpbiBpZiBQWTIgZWxzZSBzeXMuc3RkaW4uYnVmZmVyXSkKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tdmVyc2lvbicsIGFjdGlvbj0ndmVyc2lvbicsCiAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb249JyUocHJvZylzIHswfScuZm9ybWF0KF9fdmVyc2lvbl9fKSkKICAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncyhhcmd2KQoKICAgIGZvciBmIGluIGFyZ3MuaW5wdXQ6CiAgICAgICAgaWYgZi5pc2F0dHkoKToKICAgICAgICAgICAgcHJpbnQoIllvdSBhcmUgcnVubmluZyBjaGFyZGV0ZWN0IGludGVyYWN0aXZlbHkuIFByZXNzICIgKwogICAgICAgICAgICAgICAgICAiQ1RSTC1EIHR3aWNlIGF0IHRoZSBzdGFydCBvZiBhIGJsYW5rIGxpbmUgdG8gc2lnbmFsIHRoZSAiICsKICAgICAgICAgICAgICAgICAgImVuZCBvZiB5b3VyIGlucHV0LiBJZiB5b3Ugd2FudCBoZWxwLCBydW4gY2hhcmRldGVjdCAiICsKICAgICAgICAgICAgICAgICAgIi0taGVscFxuIiwgZmlsZT1zeXMuc3RkZXJyKQogICAgICAgIHByaW50KGRlc2NyaXB0aW9uX29mKGYsIGYubmFtZSkpCgoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIG1haW4oKQpQSwMEFAAAAAAAAAAhAFz7N0gGDgAABg4AADkAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9jb2RpbmdzdGF0ZW1hY2hpbmUucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBtb3ppbGxhLm9yZyBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMTk5OAojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKaW1wb3J0IGxvZ2dpbmcKCmZyb20gLmVudW1zIGltcG9ydCBNYWNoaW5lU3RhdGUKCgpjbGFzcyBDb2RpbmdTdGF0ZU1hY2hpbmUob2JqZWN0KToKICAgICIiIgogICAgQSBzdGF0ZSBtYWNoaW5lIHRvIHZlcmlmeSBhIGJ5dGUgc2VxdWVuY2UgZm9yIGEgcGFydGljdWxhciBlbmNvZGluZy4gRm9yCiAgICBlYWNoIGJ5dGUgdGhlIGRldGVjdG9yIHJlY2VpdmVzLCBpdCB3aWxsIGZlZWQgdGhhdCBieXRlIHRvIGV2ZXJ5IGFjdGl2ZQogICAgc3RhdGUgbWFjaGluZSBhdmFpbGFibGUsIG9uZSBieXRlIGF0IGEgdGltZS4gVGhlIHN0YXRlIG1hY2hpbmUgY2hhbmdlcyBpdHMKICAgIHN0YXRlIGJhc2VkIG9uIGl0cyBwcmV2aW91cyBzdGF0ZSBhbmQgdGhlIGJ5dGUgaXQgcmVjZWl2ZXMuIFRoZXJlIGFyZSAzCiAgICBzdGF0ZXMgaW4gYSBzdGF0ZSBtYWNoaW5lIHRoYXQgYXJlIG9mIGludGVyZXN0IHRvIGFuIGF1dG8tZGV0ZWN0b3I6CgogICAgU1RBUlQgc3RhdGU6IFRoaXMgaXMgdGhlIHN0YXRlIHRvIHN0YXJ0IHdpdGgsIG9yIGEgbGVnYWwgYnl0ZSBzZXF1ZW5jZQogICAgICAgICAgICAgICAgIChpLmUuIGEgdmFsaWQgY29kZSBwb2ludCkgZm9yIGNoYXJhY3RlciBoYXMgYmVlbiBpZGVudGlmaWVkLgoKICAgIE1FIHN0YXRlOiAgVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgc3RhdGUgbWFjaGluZSBpZGVudGlmaWVkIGEgYnl0ZSBzZXF1ZW5jZQogICAgICAgICAgICAgICB0aGF0IGlzIHNwZWNpZmljIHRvIHRoZSBjaGFyc2V0IGl0IGlzIGRlc2lnbmVkIGZvciBhbmQgdGhhdAogICAgICAgICAgICAgICB0aGVyZSBpcyBubyBvdGhlciBwb3NzaWJsZSBlbmNvZGluZyB3aGljaCBjYW4gY29udGFpbiB0aGlzIGJ5dGUKICAgICAgICAgICAgICAgc2VxdWVuY2UuIFRoaXMgd2lsbCB0byBsZWFkIHRvIGFuIGltbWVkaWF0ZSBwb3NpdGl2ZSBhbnN3ZXIgZm9yCiAgICAgICAgICAgICAgIHRoZSBkZXRlY3Rvci4KCiAgICBFUlJPUiBzdGF0ZTogVGhpcyBpbmRpY2F0ZXMgdGhlIHN0YXRlIG1hY2hpbmUgaWRlbnRpZmllZCBhbiBpbGxlZ2FsIGJ5dGUKICAgICAgICAgICAgICAgICBzZXF1ZW5jZSBmb3IgdGhhdCBlbmNvZGluZy4gVGhpcyB3aWxsIGxlYWQgdG8gYW4gaW1tZWRpYXRlCiAgICAgICAgICAgICAgICAgbmVnYXRpdmUgYW5zd2VyIGZvciB0aGlzIGVuY29kaW5nLiBEZXRlY3RvciB3aWxsIGV4Y2x1ZGUgdGhpcwogICAgICAgICAgICAgICAgIGVuY29kaW5nIGZyb20gY29uc2lkZXJhdGlvbiBmcm9tIGhlcmUgb24uCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzbSk6CiAgICAgICAgc2VsZi5fbW9kZWwgPSBzbQogICAgICAgIHNlbGYuX2N1cnJfYnl0ZV9wb3MgPSAwCiAgICAgICAgc2VsZi5fY3Vycl9jaGFyX2xlbiA9IDAKICAgICAgICBzZWxmLl9jdXJyX3N0YXRlID0gTm9uZQogICAgICAgIHNlbGYubG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCiAgICAgICAgc2VsZi5yZXNldCgpCgogICAgZGVmIHJlc2V0KHNlbGYpOgogICAgICAgIHNlbGYuX2N1cnJfc3RhdGUgPSBNYWNoaW5lU3RhdGUuU1RBUlQKCiAgICBkZWYgbmV4dF9zdGF0ZShzZWxmLCBjKToKICAgICAgICAjIGZvciBlYWNoIGJ5dGUgd2UgZ2V0IGl0cyBjbGFzcwogICAgICAgICMgaWYgaXQgaXMgZmlyc3QgYnl0ZSwgd2UgYWxzbyBnZXQgYnl0ZSBsZW5ndGgKICAgICAgICBieXRlX2NsYXNzID0gc2VsZi5fbW9kZWxbJ2NsYXNzX3RhYmxlJ11bY10KICAgICAgICBpZiBzZWxmLl9jdXJyX3N0YXRlID09IE1hY2hpbmVTdGF0ZS5TVEFSVDoKICAgICAgICAgICAgc2VsZi5fY3Vycl9ieXRlX3BvcyA9IDAKICAgICAgICAgICAgc2VsZi5fY3Vycl9jaGFyX2xlbiA9IHNlbGYuX21vZGVsWydjaGFyX2xlbl90YWJsZSddW2J5dGVfY2xhc3NdCiAgICAgICAgIyBmcm9tIGJ5dGUncyBjbGFzcyBhbmQgc3RhdGVfdGFibGUsIHdlIGdldCBpdHMgbmV4dCBzdGF0ZQogICAgICAgIGN1cnJfc3RhdGUgPSAoc2VsZi5fY3Vycl9zdGF0ZSAqIHNlbGYuX21vZGVsWydjbGFzc19mYWN0b3InXQogICAgICAgICAgICAgICAgICAgICAgKyBieXRlX2NsYXNzKQogICAgICAgIHNlbGYuX2N1cnJfc3RhdGUgPSBzZWxmLl9tb2RlbFsnc3RhdGVfdGFibGUnXVtjdXJyX3N0YXRlXQogICAgICAgIHNlbGYuX2N1cnJfYnl0ZV9wb3MgKz0gMQogICAgICAgIHJldHVybiBzZWxmLl9jdXJyX3N0YXRlCgogICAgZGVmIGdldF9jdXJyZW50X2NoYXJsZW4oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2N1cnJfY2hhcl9sZW4KCiAgICBkZWYgZ2V0X2NvZGluZ19zdGF0ZV9tYWNoaW5lKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9tb2RlbFsnbmFtZSddCgogICAgQHByb3BlcnR5CiAgICBkZWYgbGFuZ3VhZ2Uoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX21vZGVsWydsYW5ndWFnZSddClBLAwQUAAAAAAAAACEAfIblZW4EAABuBAAALQAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2NvbXBhdC5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIENvbnRyaWJ1dG9yKHMpOgojICAgRGFuIEJsYW5jaGFyZAojICAgSWFuIENvcmRhc2NvCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmltcG9ydCBzeXMKCgppZiBzeXMudmVyc2lvbl9pbmZvIDwgKDMsIDApOgogICAgUFkyID0gVHJ1ZQogICAgUFkzID0gRmFsc2UKICAgIGJhc2Vfc3RyID0gKHN0ciwgdW5pY29kZSkKICAgIHRleHRfdHlwZSA9IHVuaWNvZGUKZWxzZToKICAgIFBZMiA9IEZhbHNlCiAgICBQWTMgPSBUcnVlCiAgICBiYXNlX3N0ciA9IChieXRlcywgc3RyKQogICAgdGV4dF90eXBlID0gc3RyClBLAwQUAAAAAAAAACEAvUKaMT8HAAA/BwAAMgAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2NwOTQ5cHJvYmVyLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgbW96aWxsYS5vcmcgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmZyb20gLmNoYXJkaXN0cmlidXRpb24gaW1wb3J0IEVVQ0tSRGlzdHJpYnV0aW9uQW5hbHlzaXMKZnJvbSAuY29kaW5nc3RhdGVtYWNoaW5lIGltcG9ydCBDb2RpbmdTdGF0ZU1hY2hpbmUKZnJvbSAubWJjaGFyc2V0cHJvYmVyIGltcG9ydCBNdWx0aUJ5dGVDaGFyU2V0UHJvYmVyCmZyb20gLm1iY3NzbSBpbXBvcnQgQ1A5NDlfU01fTU9ERUwKCgpjbGFzcyBDUDk0OVByb2JlcihNdWx0aUJ5dGVDaGFyU2V0UHJvYmVyKToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzdXBlcihDUDk0OVByb2Jlciwgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuY29kaW5nX3NtID0gQ29kaW5nU3RhdGVNYWNoaW5lKENQOTQ5X1NNX01PREVMKQogICAgICAgICMgTk9URTogQ1A5NDkgaXMgYSBzdXBlcnNldCBvZiBFVUMtS1IsIHNvIHRoZSBkaXN0cmlidXRpb24gc2hvdWxkIGJlCiAgICAgICAgIyAgICAgICBub3QgZGlmZmVyZW50LgogICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uX2FuYWx5emVyID0gRVVDS1JEaXN0cmlidXRpb25BbmFseXNpcygpCiAgICAgICAgc2VsZi5yZXNldCgpCgogICAgQHByb3BlcnR5CiAgICBkZWYgY2hhcnNldF9uYW1lKHNlbGYpOgogICAgICAgIHJldHVybiAiQ1A5NDkiCgogICAgQHByb3BlcnR5CiAgICBkZWYgbGFuZ3VhZ2Uoc2VsZik6CiAgICAgICAgcmV0dXJuICJLb3JlYW4iClBLAwQUAAAAAAAAACEARASsyX0GAAB9BgAALAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2VudW1zLnB5IiIiCkFsbCBvZiB0aGUgRW51bXMgdGhhdCBhcmUgdXNlZCB0aHJvdWdob3V0IHRoZSBjaGFyZGV0IHBhY2thZ2UuCgo6YXV0aG9yOiBEYW4gQmxhbmNoYXJkIChkYW4uYmxhbmNoYXJkQGdtYWlsLmNvbSkKIiIiCgoKY2xhc3MgSW5wdXRTdGF0ZShvYmplY3QpOgogICAgIiIiCiAgICBUaGlzIGVudW0gcmVwcmVzZW50cyB0aGUgZGlmZmVyZW50IHN0YXRlcyBhIHVuaXZlcnNhbCBkZXRlY3RvciBjYW4gYmUgaW4uCiAgICAiIiIKICAgIFBVUkVfQVNDSUkgPSAwCiAgICBFU0NfQVNDSUkgPSAxCiAgICBISUdIX0JZVEUgPSAyCgoKY2xhc3MgTGFuZ3VhZ2VGaWx0ZXIob2JqZWN0KToKICAgICIiIgogICAgVGhpcyBlbnVtIHJlcHJlc2VudHMgdGhlIGRpZmZlcmVudCBsYW5ndWFnZSBmaWx0ZXJzIHdlIGNhbiBhcHBseSB0byBhCiAgICBgYFVuaXZlcnNhbERldGVjdG9yYGAuCiAgICAiIiIKICAgIENISU5FU0VfU0lNUExJRklFRCA9IDB4MDEKICAgIENISU5FU0VfVFJBRElUSU9OQUwgPSAweDAyCiAgICBKQVBBTkVTRSA9IDB4MDQKICAgIEtPUkVBTiA9IDB4MDgKICAgIE5PTl9DSksgPSAweDEwCiAgICBBTEwgPSAweDFGCiAgICBDSElORVNFID0gQ0hJTkVTRV9TSU1QTElGSUVEIHwgQ0hJTkVTRV9UUkFESVRJT05BTAogICAgQ0pLID0gQ0hJTkVTRSB8IEpBUEFORVNFIHwgS09SRUFOCgoKY2xhc3MgUHJvYmluZ1N0YXRlKG9iamVjdCk6CiAgICAiIiIKICAgIFRoaXMgZW51bSByZXByZXNlbnRzIHRoZSBkaWZmZXJlbnQgc3RhdGVzIGEgcHJvYmVyIGNhbiBiZSBpbi4KICAgICIiIgogICAgREVURUNUSU5HID0gMAogICAgRk9VTkRfSVQgPSAxCiAgICBOT1RfTUUgPSAyCgoKY2xhc3MgTWFjaGluZVN0YXRlKG9iamVjdCk6CiAgICAiIiIKICAgIFRoaXMgZW51bSByZXByZXNlbnRzIHRoZSBkaWZmZXJlbnQgc3RhdGVzIGEgc3RhdGUgbWFjaGluZSBjYW4gYmUgaW4uCiAgICAiIiIKICAgIFNUQVJUID0gMAogICAgRVJST1IgPSAxCiAgICBJVFNfTUUgPSAyCgoKY2xhc3MgU2VxdWVuY2VMaWtlbGlob29kKG9iamVjdCk6CiAgICAiIiIKICAgIFRoaXMgZW51bSByZXByZXNlbnRzIHRoZSBsaWtlbGlob29kIG9mIGEgY2hhcmFjdGVyIGZvbGxvd2luZyB0aGUgcHJldmlvdXMgb25lLgogICAgIiIiCiAgICBORUdBVElWRSA9IDAKICAgIFVOTElLRUxZID0gMQogICAgTElLRUxZID0gMgogICAgUE9TSVRJVkUgPSAzCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZ2V0X251bV9jYXRlZ29yaWVzKGNscyk6CiAgICAgICAgIiIiOnJldHVybnM6IFRoZSBudW1iZXIgb2YgbGlrZWxpaG9vZCBjYXRlZ29yaWVzIGluIHRoZSBlbnVtLiIiIgogICAgICAgIHJldHVybiA0CgoKY2xhc3MgQ2hhcmFjdGVyQ2F0ZWdvcnkob2JqZWN0KToKICAgICIiIgogICAgVGhpcyBlbnVtIHJlcHJlc2VudHMgdGhlIGRpZmZlcmVudCBjYXRlZ29yaWVzIGxhbmd1YWdlIG1vZGVscyBmb3IKICAgIGBgU2luZ2xlQnl0ZUNoYXJzZXRQcm9iZXJgYCBwdXQgY2hhcmFjdGVycyBpbnRvLgoKICAgIEFueXRoaW5nIGxlc3MgdGhhbiBDT05UUk9MIGlzIGNvbnNpZGVyZWQgYSBsZXR0ZXIuCiAgICAiIiIKICAgIFVOREVGSU5FRCA9IDI1NQogICAgTElORV9CUkVBSyA9IDI1NAogICAgU1lNQk9MID0gMjUzCiAgICBESUdJVCA9IDI1MgogICAgQ09OVFJPTCA9IDI1MQpQSwMEFAAAAAAAAAAhAASIBT1uDwAAbg8AADAAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9lc2Nwcm9iZXIucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBtb3ppbGxhLm9yZyBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMTk5OAojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZnJvbSAuY2hhcnNldHByb2JlciBpbXBvcnQgQ2hhclNldFByb2Jlcgpmcm9tIC5jb2RpbmdzdGF0ZW1hY2hpbmUgaW1wb3J0IENvZGluZ1N0YXRlTWFjaGluZQpmcm9tIC5lbnVtcyBpbXBvcnQgTGFuZ3VhZ2VGaWx0ZXIsIFByb2JpbmdTdGF0ZSwgTWFjaGluZVN0YXRlCmZyb20gLmVzY3NtIGltcG9ydCAoSFpfU01fTU9ERUwsIElTTzIwMjJDTl9TTV9NT0RFTCwgSVNPMjAyMkpQX1NNX01PREVMLAogICAgICAgICAgICAgICAgICAgIElTTzIwMjJLUl9TTV9NT0RFTCkKCgpjbGFzcyBFc2NDaGFyU2V0UHJvYmVyKENoYXJTZXRQcm9iZXIpOgogICAgIiIiCiAgICBUaGlzIENoYXJTZXRQcm9iZXIgdXNlcyBhICJjb2RlIHNjaGVtZSIgYXBwcm9hY2ggZm9yIGRldGVjdGluZyBlbmNvZGluZ3MsCiAgICB3aGVyZWJ5IGVhc2lseSByZWNvZ25pemFibGUgZXNjYXBlIG9yIHNoaWZ0IHNlcXVlbmNlcyBhcmUgcmVsaWVkIG9uIHRvCiAgICBpZGVudGlmeSB0aGVzZSBlbmNvZGluZ3MuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbGFuZ19maWx0ZXI9Tm9uZSk6CiAgICAgICAgc3VwZXIoRXNjQ2hhclNldFByb2Jlciwgc2VsZikuX19pbml0X18obGFuZ19maWx0ZXI9bGFuZ19maWx0ZXIpCiAgICAgICAgc2VsZi5jb2Rpbmdfc20gPSBbXQogICAgICAgIGlmIHNlbGYubGFuZ19maWx0ZXIgJiBMYW5ndWFnZUZpbHRlci5DSElORVNFX1NJTVBMSUZJRUQ6CiAgICAgICAgICAgIHNlbGYuY29kaW5nX3NtLmFwcGVuZChDb2RpbmdTdGF0ZU1hY2hpbmUoSFpfU01fTU9ERUwpKQogICAgICAgICAgICBzZWxmLmNvZGluZ19zbS5hcHBlbmQoQ29kaW5nU3RhdGVNYWNoaW5lKElTTzIwMjJDTl9TTV9NT0RFTCkpCiAgICAgICAgaWYgc2VsZi5sYW5nX2ZpbHRlciAmIExhbmd1YWdlRmlsdGVyLkpBUEFORVNFOgogICAgICAgICAgICBzZWxmLmNvZGluZ19zbS5hcHBlbmQoQ29kaW5nU3RhdGVNYWNoaW5lKElTTzIwMjJKUF9TTV9NT0RFTCkpCiAgICAgICAgaWYgc2VsZi5sYW5nX2ZpbHRlciAmIExhbmd1YWdlRmlsdGVyLktPUkVBTjoKICAgICAgICAgICAgc2VsZi5jb2Rpbmdfc20uYXBwZW5kKENvZGluZ1N0YXRlTWFjaGluZShJU08yMDIyS1JfU01fTU9ERUwpKQogICAgICAgIHNlbGYuYWN0aXZlX3NtX2NvdW50ID0gTm9uZQogICAgICAgIHNlbGYuX2RldGVjdGVkX2NoYXJzZXQgPSBOb25lCiAgICAgICAgc2VsZi5fZGV0ZWN0ZWRfbGFuZ3VhZ2UgPSBOb25lCiAgICAgICAgc2VsZi5fc3RhdGUgPSBOb25lCiAgICAgICAgc2VsZi5yZXNldCgpCgogICAgZGVmIHJlc2V0KHNlbGYpOgogICAgICAgIHN1cGVyKEVzY0NoYXJTZXRQcm9iZXIsIHNlbGYpLnJlc2V0KCkKICAgICAgICBmb3IgY29kaW5nX3NtIGluIHNlbGYuY29kaW5nX3NtOgogICAgICAgICAgICBpZiBub3QgY29kaW5nX3NtOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgY29kaW5nX3NtLmFjdGl2ZSA9IFRydWUKICAgICAgICAgICAgY29kaW5nX3NtLnJlc2V0KCkKICAgICAgICBzZWxmLmFjdGl2ZV9zbV9jb3VudCA9IGxlbihzZWxmLmNvZGluZ19zbSkKICAgICAgICBzZWxmLl9kZXRlY3RlZF9jaGFyc2V0ID0gTm9uZQogICAgICAgIHNlbGYuX2RldGVjdGVkX2xhbmd1YWdlID0gTm9uZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNoYXJzZXRfbmFtZShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fZGV0ZWN0ZWRfY2hhcnNldAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGxhbmd1YWdlKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9kZXRlY3RlZF9sYW5ndWFnZQoKICAgIGRlZiBnZXRfY29uZmlkZW5jZShzZWxmKToKICAgICAgICBpZiBzZWxmLl9kZXRlY3RlZF9jaGFyc2V0OgogICAgICAgICAgICByZXR1cm4gMC45OQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiAwLjAwCgogICAgZGVmIGZlZWQoc2VsZiwgYnl0ZV9zdHIpOgogICAgICAgIGZvciBjIGluIGJ5dGVfc3RyOgogICAgICAgICAgICBmb3IgY29kaW5nX3NtIGluIHNlbGYuY29kaW5nX3NtOgogICAgICAgICAgICAgICAgaWYgbm90IGNvZGluZ19zbSBvciBub3QgY29kaW5nX3NtLmFjdGl2ZToKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgY29kaW5nX3N0YXRlID0gY29kaW5nX3NtLm5leHRfc3RhdGUoYykKICAgICAgICAgICAgICAgIGlmIGNvZGluZ19zdGF0ZSA9PSBNYWNoaW5lU3RhdGUuRVJST1I6CiAgICAgICAgICAgICAgICAgICAgY29kaW5nX3NtLmFjdGl2ZSA9IEZhbHNlCiAgICAgICAgICAgICAgICAgICAgc2VsZi5hY3RpdmVfc21fY291bnQgLT0gMQogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuYWN0aXZlX3NtX2NvdW50IDw9IDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3N0YXRlID0gUHJvYmluZ1N0YXRlLk5PVF9NRQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5zdGF0ZQogICAgICAgICAgICAgICAgZWxpZiBjb2Rpbmdfc3RhdGUgPT0gTWFjaGluZVN0YXRlLklUU19NRToKICAgICAgICAgICAgICAgICAgICBzZWxmLl9zdGF0ZSA9IFByb2JpbmdTdGF0ZS5GT1VORF9JVAogICAgICAgICAgICAgICAgICAgIHNlbGYuX2RldGVjdGVkX2NoYXJzZXQgPSBjb2Rpbmdfc20uZ2V0X2NvZGluZ19zdGF0ZV9tYWNoaW5lKCkKICAgICAgICAgICAgICAgICAgICBzZWxmLl9kZXRlY3RlZF9sYW5ndWFnZSA9IGNvZGluZ19zbS5sYW5ndWFnZQogICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnN0YXRlCgogICAgICAgIHJldHVybiBzZWxmLnN0YXRlClBLAwQUAAAAAAAAACEAwQpgog4pAAAOKQAALAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2VzY3NtLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgbW96aWxsYS5vcmcgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmZyb20gLmVudW1zIGltcG9ydCBNYWNoaW5lU3RhdGUKCkhaX0NMUyA9ICgKMSwwLDAsMCwwLDAsMCwwLCAgIyAwMCAtIDA3CjAsMCwwLDAsMCwwLDAsMCwgICMgMDggLSAwZgowLDAsMCwwLDAsMCwwLDAsICAjIDEwIC0gMTcKMCwwLDAsMSwwLDAsMCwwLCAgIyAxOCAtIDFmCjAsMCwwLDAsMCwwLDAsMCwgICMgMjAgLSAyNwowLDAsMCwwLDAsMCwwLDAsICAjIDI4IC0gMmYKMCwwLDAsMCwwLDAsMCwwLCAgIyAzMCAtIDM3CjAsMCwwLDAsMCwwLDAsMCwgICMgMzggLSAzZgowLDAsMCwwLDAsMCwwLDAsICAjIDQwIC0gNDcKMCwwLDAsMCwwLDAsMCwwLCAgIyA0OCAtIDRmCjAsMCwwLDAsMCwwLDAsMCwgICMgNTAgLSA1NwowLDAsMCwwLDAsMCwwLDAsICAjIDU4IC0gNWYKMCwwLDAsMCwwLDAsMCwwLCAgIyA2MCAtIDY3CjAsMCwwLDAsMCwwLDAsMCwgICMgNjggLSA2ZgowLDAsMCwwLDAsMCwwLDAsICAjIDcwIC0gNzcKMCwwLDAsNCwwLDUsMiwwLCAgIyA3OCAtIDdmCjEsMSwxLDEsMSwxLDEsMSwgICMgODAgLSA4NwoxLDEsMSwxLDEsMSwxLDEsICAjIDg4IC0gOGYKMSwxLDEsMSwxLDEsMSwxLCAgIyA5MCAtIDk3CjEsMSwxLDEsMSwxLDEsMSwgICMgOTggLSA5ZgoxLDEsMSwxLDEsMSwxLDEsICAjIGEwIC0gYTcKMSwxLDEsMSwxLDEsMSwxLCAgIyBhOCAtIGFmCjEsMSwxLDEsMSwxLDEsMSwgICMgYjAgLSBiNwoxLDEsMSwxLDEsMSwxLDEsICAjIGI4IC0gYmYKMSwxLDEsMSwxLDEsMSwxLCAgIyBjMCAtIGM3CjEsMSwxLDEsMSwxLDEsMSwgICMgYzggLSBjZgoxLDEsMSwxLDEsMSwxLDEsICAjIGQwIC0gZDcKMSwxLDEsMSwxLDEsMSwxLCAgIyBkOCAtIGRmCjEsMSwxLDEsMSwxLDEsMSwgICMgZTAgLSBlNwoxLDEsMSwxLDEsMSwxLDEsICAjIGU4IC0gZWYKMSwxLDEsMSwxLDEsMSwxLCAgIyBmMCAtIGY3CjEsMSwxLDEsMSwxLDEsMSwgICMgZjggLSBmZgopCgpIWl9TVCA9ICgKTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5FUlJPUiwgICAgIDMsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjIDAwLTA3Ck1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLCMgMDgtMGYKTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCwgICAgIDQsTWFjaGluZVN0YXRlLkVSUk9SLCMgMTAtMTcKICAgICA1LE1hY2hpbmVTdGF0ZS5FUlJPUiwgICAgIDYsTWFjaGluZVN0YXRlLkVSUk9SLCAgICAgNSwgICAgIDUsICAgICA0LE1hY2hpbmVTdGF0ZS5FUlJPUiwjIDE4LTFmCiAgICAgNCxNYWNoaW5lU3RhdGUuRVJST1IsICAgICA0LCAgICAgNCwgICAgIDQsTWFjaGluZVN0YXRlLkVSUk9SLCAgICAgNCxNYWNoaW5lU3RhdGUuRVJST1IsIyAyMC0yNwogICAgIDQsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCwjIDI4LTJmCikKCkhaX0NIQVJfTEVOX1RBQkxFID0gKDAsIDAsIDAsIDAsIDAsIDApCgpIWl9TTV9NT0RFTCA9IHsnY2xhc3NfdGFibGUnOiBIWl9DTFMsCiAgICAgICAgICAgICAgICdjbGFzc19mYWN0b3InOiA2LAogICAgICAgICAgICAgICAnc3RhdGVfdGFibGUnOiBIWl9TVCwKICAgICAgICAgICAgICAgJ2NoYXJfbGVuX3RhYmxlJzogSFpfQ0hBUl9MRU5fVEFCTEUsCiAgICAgICAgICAgICAgICduYW1lJzogIkhaLUdCLTIzMTIiLAogICAgICAgICAgICAgICAnbGFuZ3VhZ2UnOiAnQ2hpbmVzZSd9CgpJU08yMDIyQ05fQ0xTID0gKAoyLDAsMCwwLDAsMCwwLDAsICAjIDAwIC0gMDcKMCwwLDAsMCwwLDAsMCwwLCAgIyAwOCAtIDBmCjAsMCwwLDAsMCwwLDAsMCwgICMgMTAgLSAxNwowLDAsMCwxLDAsMCwwLDAsICAjIDE4IC0gMWYKMCwwLDAsMCwwLDAsMCwwLCAgIyAyMCAtIDI3CjAsMywwLDAsMCwwLDAsMCwgICMgMjggLSAyZgowLDAsMCwwLDAsMCwwLDAsICAjIDMwIC0gMzcKMCwwLDAsMCwwLDAsMCwwLCAgIyAzOCAtIDNmCjAsMCwwLDQsMCwwLDAsMCwgICMgNDAgLSA0NwowLDAsMCwwLDAsMCwwLDAsICAjIDQ4IC0gNGYKMCwwLDAsMCwwLDAsMCwwLCAgIyA1MCAtIDU3CjAsMCwwLDAsMCwwLDAsMCwgICMgNTggLSA1ZgowLDAsMCwwLDAsMCwwLDAsICAjIDYwIC0gNjcKMCwwLDAsMCwwLDAsMCwwLCAgIyA2OCAtIDZmCjAsMCwwLDAsMCwwLDAsMCwgICMgNzAgLSA3NwowLDAsMCwwLDAsMCwwLDAsICAjIDc4IC0gN2YKMiwyLDIsMiwyLDIsMiwyLCAgIyA4MCAtIDg3CjIsMiwyLDIsMiwyLDIsMiwgICMgODggLSA4ZgoyLDIsMiwyLDIsMiwyLDIsICAjIDkwIC0gOTcKMiwyLDIsMiwyLDIsMiwyLCAgIyA5OCAtIDlmCjIsMiwyLDIsMiwyLDIsMiwgICMgYTAgLSBhNwoyLDIsMiwyLDIsMiwyLDIsICAjIGE4IC0gYWYKMiwyLDIsMiwyLDIsMiwyLCAgIyBiMCAtIGI3CjIsMiwyLDIsMiwyLDIsMiwgICMgYjggLSBiZgoyLDIsMiwyLDIsMiwyLDIsICAjIGMwIC0gYzcKMiwyLDIsMiwyLDIsMiwyLCAgIyBjOCAtIGNmCjIsMiwyLDIsMiwyLDIsMiwgICMgZDAgLSBkNwoyLDIsMiwyLDIsMiwyLDIsICAjIGQ4IC0gZGYKMiwyLDIsMiwyLDIsMiwyLCAgIyBlMCAtIGU3CjIsMiwyLDIsMiwyLDIsMiwgICMgZTggLSBlZgoyLDIsMiwyLDIsMiwyLDIsICAjIGYwIC0gZjcKMiwyLDIsMiwyLDIsMiwyLCAgIyBmOCAtIGZmCikKCklTTzIwMjJDTl9TVCA9ICgKTWFjaGluZVN0YXRlLlNUQVJULCAgICAgMyxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCwjIDAwLTA3Ck1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIyAwOC0wZgpNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLCMgMTAtMTcKTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsICAgICA0LE1hY2hpbmVTdGF0ZS5FUlJPUiwjIDE4LTFmCk1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCMgMjAtMjcKICAgICA1LCAgICAgNixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjIDI4LTJmCk1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCMgMzAtMzcKTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsIyAzOC0zZgopCgpJU08yMDIyQ05fQ0hBUl9MRU5fVEFCTEUgPSAoMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCkKCklTTzIwMjJDTl9TTV9NT0RFTCA9IHsnY2xhc3NfdGFibGUnOiBJU08yMDIyQ05fQ0xTLAogICAgICAgICAgICAgICAgICAgICAgJ2NsYXNzX2ZhY3Rvcic6IDksCiAgICAgICAgICAgICAgICAgICAgICAnc3RhdGVfdGFibGUnOiBJU08yMDIyQ05fU1QsCiAgICAgICAgICAgICAgICAgICAgICAnY2hhcl9sZW5fdGFibGUnOiBJU08yMDIyQ05fQ0hBUl9MRU5fVEFCTEUsCiAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICJJU08tMjAyMi1DTiIsCiAgICAgICAgICAgICAgICAgICAgICAnbGFuZ3VhZ2UnOiAnQ2hpbmVzZSd9CgpJU08yMDIySlBfQ0xTID0gKAoyLDAsMCwwLDAsMCwwLDAsICAjIDAwIC0gMDcKMCwwLDAsMCwwLDAsMiwyLCAgIyAwOCAtIDBmCjAsMCwwLDAsMCwwLDAsMCwgICMgMTAgLSAxNwowLDAsMCwxLDAsMCwwLDAsICAjIDE4IC0gMWYKMCwwLDAsMCw3LDAsMCwwLCAgIyAyMCAtIDI3CjMsMCwwLDAsMCwwLDAsMCwgICMgMjggLSAyZgowLDAsMCwwLDAsMCwwLDAsICAjIDMwIC0gMzcKMCwwLDAsMCwwLDAsMCwwLCAgIyAzOCAtIDNmCjYsMCw0LDAsOCwwLDAsMCwgICMgNDAgLSA0NwowLDksNSwwLDAsMCwwLDAsICAjIDQ4IC0gNGYKMCwwLDAsMCwwLDAsMCwwLCAgIyA1MCAtIDU3CjAsMCwwLDAsMCwwLDAsMCwgICMgNTggLSA1ZgowLDAsMCwwLDAsMCwwLDAsICAjIDYwIC0gNjcKMCwwLDAsMCwwLDAsMCwwLCAgIyA2OCAtIDZmCjAsMCwwLDAsMCwwLDAsMCwgICMgNzAgLSA3NwowLDAsMCwwLDAsMCwwLDAsICAjIDc4IC0gN2YKMiwyLDIsMiwyLDIsMiwyLCAgIyA4MCAtIDg3CjIsMiwyLDIsMiwyLDIsMiwgICMgODggLSA4ZgoyLDIsMiwyLDIsMiwyLDIsICAjIDkwIC0gOTcKMiwyLDIsMiwyLDIsMiwyLCAgIyA5OCAtIDlmCjIsMiwyLDIsMiwyLDIsMiwgICMgYTAgLSBhNwoyLDIsMiwyLDIsMiwyLDIsICAjIGE4IC0gYWYKMiwyLDIsMiwyLDIsMiwyLCAgIyBiMCAtIGI3CjIsMiwyLDIsMiwyLDIsMiwgICMgYjggLSBiZgoyLDIsMiwyLDIsMiwyLDIsICAjIGMwIC0gYzcKMiwyLDIsMiwyLDIsMiwyLCAgIyBjOCAtIGNmCjIsMiwyLDIsMiwyLDIsMiwgICMgZDAgLSBkNwoyLDIsMiwyLDIsMiwyLDIsICAjIGQ4IC0gZGYKMiwyLDIsMiwyLDIsMiwyLCAgIyBlMCAtIGU3CjIsMiwyLDIsMiwyLDIsMiwgICMgZTggLSBlZgoyLDIsMiwyLDIsMiwyLDIsICAjIGYwIC0gZjcKMiwyLDIsMiwyLDIsMiwyLCAgIyBmOCAtIGZmCikKCklTTzIwMjJKUF9TVCA9ICgKTWFjaGluZVN0YXRlLlNUQVJULCAgICAgMyxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCwjIDAwLTA3Ck1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIyAwOC0wZgpNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSwjIDEwLTE3Ck1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIyAxOC0xZgpNYWNoaW5lU3RhdGUuRVJST1IsICAgICA1LE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCAgICAgNCxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCMgMjAtMjcKTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsICAgICA2LE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLkVSUk9SLCMgMjgtMmYKTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLCMgMzAtMzcKTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIyAzOC0zZgpNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCwjIDQwLTQ3CikKCklTTzIwMjJKUF9DSEFSX0xFTl9UQUJMRSA9ICgwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwKQoKSVNPMjAyMkpQX1NNX01PREVMID0geydjbGFzc190YWJsZSc6IElTTzIwMjJKUF9DTFMsCiAgICAgICAgICAgICAgICAgICAgICAnY2xhc3NfZmFjdG9yJzogMTAsCiAgICAgICAgICAgICAgICAgICAgICAnc3RhdGVfdGFibGUnOiBJU08yMDIySlBfU1QsCiAgICAgICAgICAgICAgICAgICAgICAnY2hhcl9sZW5fdGFibGUnOiBJU08yMDIySlBfQ0hBUl9MRU5fVEFCTEUsCiAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICJJU08tMjAyMi1KUCIsCiAgICAgICAgICAgICAgICAgICAgICAnbGFuZ3VhZ2UnOiAnSmFwYW5lc2UnfQoKSVNPMjAyMktSX0NMUyA9ICgKMiwwLDAsMCwwLDAsMCwwLCAgIyAwMCAtIDA3CjAsMCwwLDAsMCwwLDAsMCwgICMgMDggLSAwZgowLDAsMCwwLDAsMCwwLDAsICAjIDEwIC0gMTcKMCwwLDAsMSwwLDAsMCwwLCAgIyAxOCAtIDFmCjAsMCwwLDAsMywwLDAsMCwgICMgMjAgLSAyNwowLDQsMCwwLDAsMCwwLDAsICAjIDI4IC0gMmYKMCwwLDAsMCwwLDAsMCwwLCAgIyAzMCAtIDM3CjAsMCwwLDAsMCwwLDAsMCwgICMgMzggLSAzZgowLDAsMCw1LDAsMCwwLDAsICAjIDQwIC0gNDcKMCwwLDAsMCwwLDAsMCwwLCAgIyA0OCAtIDRmCjAsMCwwLDAsMCwwLDAsMCwgICMgNTAgLSA1NwowLDAsMCwwLDAsMCwwLDAsICAjIDU4IC0gNWYKMCwwLDAsMCwwLDAsMCwwLCAgIyA2MCAtIDY3CjAsMCwwLDAsMCwwLDAsMCwgICMgNjggLSA2ZgowLDAsMCwwLDAsMCwwLDAsICAjIDcwIC0gNzcKMCwwLDAsMCwwLDAsMCwwLCAgIyA3OCAtIDdmCjIsMiwyLDIsMiwyLDIsMiwgICMgODAgLSA4NwoyLDIsMiwyLDIsMiwyLDIsICAjIDg4IC0gOGYKMiwyLDIsMiwyLDIsMiwyLCAgIyA5MCAtIDk3CjIsMiwyLDIsMiwyLDIsMiwgICMgOTggLSA5ZgoyLDIsMiwyLDIsMiwyLDIsICAjIGEwIC0gYTcKMiwyLDIsMiwyLDIsMiwyLCAgIyBhOCAtIGFmCjIsMiwyLDIsMiwyLDIsMiwgICMgYjAgLSBiNwoyLDIsMiwyLDIsMiwyLDIsICAjIGI4IC0gYmYKMiwyLDIsMiwyLDIsMiwyLCAgIyBjMCAtIGM3CjIsMiwyLDIsMiwyLDIsMiwgICMgYzggLSBjZgoyLDIsMiwyLDIsMiwyLDIsICAjIGQwIC0gZDcKMiwyLDIsMiwyLDIsMiwyLCAgIyBkOCAtIGRmCjIsMiwyLDIsMiwyLDIsMiwgICMgZTAgLSBlNwoyLDIsMiwyLDIsMiwyLDIsICAjIGU4IC0gZWYKMiwyLDIsMiwyLDIsMiwyLCAgIyBmMCAtIGY3CjIsMiwyLDIsMiwyLDIsMiwgICMgZjggLSBmZgopCgpJU08yMDIyS1JfU1QgPSAoCk1hY2hpbmVTdGF0ZS5TVEFSVCwgICAgIDMsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIyAwMC0wNwpNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSwjIDA4LTBmCk1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwgICAgIDQsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjIDEwLTE3Ck1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwgICAgIDUsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIyAxOC0xZgpNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCwjIDIwLTI3CikKCklTTzIwMjJLUl9DSEFSX0xFTl9UQUJMRSA9ICgwLCAwLCAwLCAwLCAwLCAwKQoKSVNPMjAyMktSX1NNX01PREVMID0geydjbGFzc190YWJsZSc6IElTTzIwMjJLUl9DTFMsCiAgICAgICAgICAgICAgICAgICAgICAnY2xhc3NfZmFjdG9yJzogNiwKICAgICAgICAgICAgICAgICAgICAgICdzdGF0ZV90YWJsZSc6IElTTzIwMjJLUl9TVCwKICAgICAgICAgICAgICAgICAgICAgICdjaGFyX2xlbl90YWJsZSc6IElTTzIwMjJLUl9DSEFSX0xFTl9UQUJMRSwKICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogIklTTy0yMDIyLUtSIiwKICAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZSc6ICdLb3JlYW4nfQoKClBLAwQUAAAAAAAAACEAIDfE0KUOAAClDgAAMgAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2V1Y2pwcHJvYmVyLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgbW96aWxsYS5vcmcgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmZyb20gLmVudW1zIGltcG9ydCBQcm9iaW5nU3RhdGUsIE1hY2hpbmVTdGF0ZQpmcm9tIC5tYmNoYXJzZXRwcm9iZXIgaW1wb3J0IE11bHRpQnl0ZUNoYXJTZXRQcm9iZXIKZnJvbSAuY29kaW5nc3RhdGVtYWNoaW5lIGltcG9ydCBDb2RpbmdTdGF0ZU1hY2hpbmUKZnJvbSAuY2hhcmRpc3RyaWJ1dGlvbiBpbXBvcnQgRVVDSlBEaXN0cmlidXRpb25BbmFseXNpcwpmcm9tIC5qcGNudHggaW1wb3J0IEVVQ0pQQ29udGV4dEFuYWx5c2lzCmZyb20gLm1iY3NzbSBpbXBvcnQgRVVDSlBfU01fTU9ERUwKCgpjbGFzcyBFVUNKUFByb2JlcihNdWx0aUJ5dGVDaGFyU2V0UHJvYmVyKToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzdXBlcihFVUNKUFByb2Jlciwgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuY29kaW5nX3NtID0gQ29kaW5nU3RhdGVNYWNoaW5lKEVVQ0pQX1NNX01PREVMKQogICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uX2FuYWx5emVyID0gRVVDSlBEaXN0cmlidXRpb25BbmFseXNpcygpCiAgICAgICAgc2VsZi5jb250ZXh0X2FuYWx5emVyID0gRVVDSlBDb250ZXh0QW5hbHlzaXMoKQogICAgICAgIHNlbGYucmVzZXQoKQoKICAgIGRlZiByZXNldChzZWxmKToKICAgICAgICBzdXBlcihFVUNKUFByb2Jlciwgc2VsZikucmVzZXQoKQogICAgICAgIHNlbGYuY29udGV4dF9hbmFseXplci5yZXNldCgpCgogICAgQHByb3BlcnR5CiAgICBkZWYgY2hhcnNldF9uYW1lKHNlbGYpOgogICAgICAgIHJldHVybiAiRVVDLUpQIgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGxhbmd1YWdlKHNlbGYpOgogICAgICAgIHJldHVybiAiSmFwYW5lc2UiCgogICAgZGVmIGZlZWQoc2VsZiwgYnl0ZV9zdHIpOgogICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihieXRlX3N0cikpOgogICAgICAgICAgICAjIFBZM0s6IGJ5dGVfc3RyIGlzIGEgYnl0ZSBhcnJheSwgc28gYnl0ZV9zdHJbaV0gaXMgYW4gaW50LCBub3QgYSBieXRlCiAgICAgICAgICAgIGNvZGluZ19zdGF0ZSA9IHNlbGYuY29kaW5nX3NtLm5leHRfc3RhdGUoYnl0ZV9zdHJbaV0pCiAgICAgICAgICAgIGlmIGNvZGluZ19zdGF0ZSA9PSBNYWNoaW5lU3RhdGUuRVJST1I6CiAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZygnJXMgJXMgcHJvYmVyIGhpdCBlcnJvciBhdCBieXRlICVzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2hhcnNldF9uYW1lLCBzZWxmLmxhbmd1YWdlLCBpKQogICAgICAgICAgICAgICAgc2VsZi5fc3RhdGUgPSBQcm9iaW5nU3RhdGUuTk9UX01FCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBlbGlmIGNvZGluZ19zdGF0ZSA9PSBNYWNoaW5lU3RhdGUuSVRTX01FOgogICAgICAgICAgICAgICAgc2VsZi5fc3RhdGUgPSBQcm9iaW5nU3RhdGUuRk9VTkRfSVQKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGVsaWYgY29kaW5nX3N0YXRlID09IE1hY2hpbmVTdGF0ZS5TVEFSVDoKICAgICAgICAgICAgICAgIGNoYXJfbGVuID0gc2VsZi5jb2Rpbmdfc20uZ2V0X2N1cnJlbnRfY2hhcmxlbigpCiAgICAgICAgICAgICAgICBpZiBpID09IDA6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fbGFzdF9jaGFyWzFdID0gYnl0ZV9zdHJbMF0KICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRleHRfYW5hbHl6ZXIuZmVlZChzZWxmLl9sYXN0X2NoYXIsIGNoYXJfbGVuKQogICAgICAgICAgICAgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uX2FuYWx5emVyLmZlZWQoc2VsZi5fbGFzdF9jaGFyLCBjaGFyX2xlbikKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250ZXh0X2FuYWx5emVyLmZlZWQoYnl0ZV9zdHJbaSAtIDE6aSArIDFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX2xlbikKICAgICAgICAgICAgICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbl9hbmFseXplci5mZWVkKGJ5dGVfc3RyW2kgLSAxOmkgKyAxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX2xlbikKCiAgICAgICAgc2VsZi5fbGFzdF9jaGFyWzBdID0gYnl0ZV9zdHJbLTFdCgogICAgICAgIGlmIHNlbGYuc3RhdGUgPT0gUHJvYmluZ1N0YXRlLkRFVEVDVElORzoKICAgICAgICAgICAgaWYgKHNlbGYuY29udGV4dF9hbmFseXplci5nb3RfZW5vdWdoX2RhdGEoKSBhbmQKICAgICAgICAgICAgICAgKHNlbGYuZ2V0X2NvbmZpZGVuY2UoKSA+IHNlbGYuU0hPUlRDVVRfVEhSRVNIT0xEKSk6CiAgICAgICAgICAgICAgICBzZWxmLl9zdGF0ZSA9IFByb2JpbmdTdGF0ZS5GT1VORF9JVAoKICAgICAgICByZXR1cm4gc2VsZi5zdGF0ZQoKICAgIGRlZiBnZXRfY29uZmlkZW5jZShzZWxmKToKICAgICAgICBjb250ZXh0X2NvbmYgPSBzZWxmLmNvbnRleHRfYW5hbHl6ZXIuZ2V0X2NvbmZpZGVuY2UoKQogICAgICAgIGRpc3RyaWJfY29uZiA9IHNlbGYuZGlzdHJpYnV0aW9uX2FuYWx5emVyLmdldF9jb25maWRlbmNlKCkKICAgICAgICByZXR1cm4gbWF4KGNvbnRleHRfY29uZiwgZGlzdHJpYl9jb25mKQpQSwMEFAAAAAAAAAAhAPRBA3nqNAAA6jQAADAAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9ldWNrcmZyZXEucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBNb3ppbGxhIENvbW11bmljYXRvciBjbGllbnQgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMgU2FtcGxpbmcgZnJvbSBhYm91dCAyME0gdGV4dCBtYXRlcmlhbHMgaW5jbHVkZSBsaXRlcmF0dXJlIGFuZCBjb21wdXRlciB0ZWNobm9sb2d5CgojIDEyOCAgLS0+IDAuNzkKIyAyNTYgIC0tPiAwLjkyCiMgNTEyICAtLT4gMC45ODYKIyAxMDI0IC0tPiAwLjk5OTQ0CiMgMjA0OCAtLT4gMC45OTk5OQojCiMgSWRlYSBEaXN0cmlidXRpb24gUmF0aW8gPSAwLjk4NjUzIC8gKDEtMC45ODY1MykgPSA3My4yNAojIFJhbmRvbSBEaXN0cmlidXRpb24gUmF0aW9uID0gNTEyIC8gKDIzNTAtNTEyKSA9IDAuMjc5LgojCiMgVHlwaWNhbCBEaXN0cmlidXRpb24gUmF0aW8KCkVVQ0tSX1RZUElDQUxfRElTVFJJQlVUSU9OX1JBVElPID0gNi4wCgpFVUNLUl9UQUJMRV9TSVpFID0gMjM1MgoKIyBDaGFyIHRvIEZyZXFPcmRlciB0YWJsZSAsCkVVQ0tSX0NIQVJfVE9fRlJFUV9PUkRFUiA9ICgKICAxMywgMTMwLCAxMjAsMTM5NiwgNDgxLDE3MTksMTcyMCwgMzI4LCA2MDksIDIxMiwxNzIxLCA3MDcsIDQwMCwgMjk5LDE3MjIsICA4NywKMTM5NywxNzIzLCAxMDQsIDUzNiwxMTE3LDEyMDMsMTcyNCwxMjY3LCA2ODUsMTI2OCwgNTA4LDE3MjUsMTcyNiwxNzI3LDE3MjgsMTM5OCwKMTM5OSwxNzI5LDE3MzAsMTczMSwgMTQxLCA2MjEsIDMyNiwxMDU3LCAzNjgsMTczMiwgMjY3LCA0ODgsICAyMCwxNzMzLDEyNjksMTczNCwKIDk0NSwxNDAwLDE3MzUsICA0NywgOTA0LDEyNzAsMTczNiwxNzM3LCA3NzMsIDI0OCwxNzM4LCA0MDksIDMxMywgNzg2LCA0MjksMTczOSwKIDExNiwgOTg3LCA4MTMsMTQwMSwgNjgzLCAgNzUsMTIwNCwgMTQ1LDE3NDAsMTc0MSwxNzQyLDE3NDMsICAxNiwgODQ3LCA2NjcsIDYyMiwKIDcwOCwxNzQ0LDE3NDUsMTc0NiwgOTY2LCA3ODcsIDMwNCwgMTI5LDE3NDcsICA2MCwgODIwLCAxMjMsIDY3NiwxNzQ4LDE3NDksMTc1MCwKMTc1MSwgNjE3LDE3NTIsIDYyNiwxNzUzLDE3NTQsMTc1NSwxNzU2LCA2NTMsMTc1NywxNzU4LDE3NTksMTc2MCwxNzYxLDE3NjIsIDg1NiwKIDM0NCwxNzYzLDE3NjQsMTc2NSwxNzY2LCAgODksIDQwMSwgNDE4LCA4MDYsIDkwNSwgODQ4LDE3NjcsMTc2OCwxNzY5LCA5NDYsMTIwNSwKIDcwOSwxNzcwLDExMTgsMTc3MSwgMjQxLDE3NzIsMTc3MywxNzc0LDEyNzEsMTc3NSwgNTY5LDE3NzYsIDk5OSwxNzc3LDE3NzgsMTc3OSwKMTc4MCwgMzM3LCA3NTEsMTA1OCwgIDI4LCA2MjgsIDI1NCwxNzgxLCAxNzcsIDkwNiwgMjcwLCAzNDksIDg5MSwxMDc5LDE3ODIsICAxOSwKMTc4MywgMzc5LDE3ODQsIDMxNSwxNzg1LCA2MjksIDc1NCwxNDAyLCA1NTksMTc4NiwgNjM2LCAyMDMsMTIwNiwxNzg3LCA3MTAsIDU2NywKMTc4OCwgOTM1LCA4MTQsMTc4OSwxNzkwLDEyMDcsIDc2NiwgNTI4LDE3OTEsMTc5MiwxMjA4LDE3OTMsMTc5NCwxNzk1LDE3OTYsMTc5NywKMTQwMywxNzk4LDE3OTksIDUzMywxMDU5LDE0MDQsMTQwNSwxMTU2LDE0MDYsIDkzNiwgODg0LDEwODAsMTgwMCwgMzUxLDE4MDEsMTgwMiwKMTgwMywxODA0LDE4MDUsIDgwMSwxODA2LDE4MDcsMTgwOCwxMTE5LDE4MDksMTE1NywgNzE0LCA0NzQsMTQwNywxODEwLCAyOTgsIDg5OSwKIDg4NSwxODExLDExMjAsIDgwMiwxMTU4LDE4MTIsIDg5MiwxODEzLDE4MTQsMTQwOCwgNjU5LDE4MTUsMTgxNiwxMTIxLDE4MTcsMTgxOCwKMTgxOSwxODIwLDE4MjEsMTgyMiwgMzE5LDE4MjMsIDU5NCwgNTQ1LDE4MjQsIDgxNSwgOTM3LDEyMDksMTgyNSwxODI2LCA1NzMsMTQwOSwKMTAyMiwxODI3LDEyMTAsMTgyOCwxODI5LDE4MzAsMTgzMSwxODMyLDE4MzMsIDU1NiwgNzIyLCA4MDcsMTEyMiwxMDYwLDE4MzQsIDY5NywKMTgzNSwgOTAwLCA1NTcsIDcxNSwxODM2LDE0MTAsIDU0MCwxNDExLCA3NTIsMTE1OSwgMjk0LCA1OTcsMTIxMSwgOTc2LCA4MDMsIDc3MCwKMTQxMiwxODM3LDE4MzgsICAzOSwgNzk0LDE0MTMsIDM1OCwxODM5LCAzNzEsIDkyNSwxODQwLCA0NTMsIDY2MSwgNzg4LCA1MzEsIDcyMywKIDU0NCwxMDIzLDEwODEsIDg2OSwgIDkxLDE4NDEsIDM5MiwgNDMwLCA3OTAsIDYwMiwxNDE0LCA2NzcsMTA4MiwgNDU3LDE0MTUsMTQxNiwKMTg0MiwxODQzLCA0NzUsIDMyNywxMDI0LDE0MTcsIDc5NSwgMTIxLDE4NDQsIDczMywgNDAzLDE0MTgsMTg0NSwxODQ2LDE4NDcsIDMwMCwKIDExOSwgNzExLDEyMTIsIDYyNywxODQ4LDEyNzIsIDIwNywxODQ5LDE4NTAsIDc5NiwxMjEzLCAzODIsMTg1MSwgNTE5LDE4NTIsMTA4MywKIDg5MywxODUzLDE4NTQsMTg1NSwgMzY3LCA4MDksIDQ4NywgNjcxLDE4NTYsIDY2MywxODU3LDE4NTgsIDk1NiwgNDcxLCAzMDYsIDg1NywKMTg1OSwxODYwLDExNjAsMTA4NCwxODYxLDE4NjIsMTg2MywxODY0LDE4NjUsMTA2MSwxODY2LDE4NjcsMTg2OCwxODY5LDE4NzAsMTg3MSwKIDI4MiwgIDk2LCA1NzQsMTg3MiwgNTAyLDEwODUsMTg3MywxMjE0LDE4NzQsIDkwNywxODc1LDE4NzYsIDgyNywgOTc3LDE0MTksMTQyMCwKMTQyMSwgMjY4LDE4NzcsMTQyMiwxODc4LDE4NzksMTg4MCwgMzA4LDE4ODEsICAgMiwgNTM3LDE4ODIsMTg4MywxMjE1LDE4ODQsMTg4NSwKIDEyNywgNzkxLDE4ODYsMTI3MywxNDIzLDE4ODcsICAzNCwgMzM2LCA0MDQsIDY0MywxODg4LCA1NzEsIDY1NCwgODk0LCA4NDAsMTg4OSwKICAgMCwgODg2LDEyNzQsIDEyMiwgNTc1LCAyNjAsIDkwOCwgOTM4LDE4OTAsMTI3NSwgNDEwLCAzMTYsMTg5MSwxODkyLCAxMDAsMTg5MywKMTg5NCwxMTIzLCAgNDgsMTE2MSwxMTI0LDEwMjUsMTg5NSwgNjMzLCA5MDEsMTI3NiwxODk2LDE4OTcsIDExNSwgODE2LDE4OTgsIDMxNywKMTg5OSwgNjk0LDE5MDAsIDkwOSwgNzM0LDE0MjQsIDU3MiwgODY2LDE0MjUsIDY5MSwgIDg1LCA1MjQsMTAxMCwgNTQzLCAzOTQsIDg0MSwKMTkwMSwxOTAyLDE5MDMsMTAyNiwxOTA0LDE5MDUsMTkwNiwxOTA3LDE5MDgsMTkwOSwgIDMwLCA0NTEsIDY1MSwgOTg4LCAzMTAsMTkxMCwKMTkxMSwxNDI2LCA4MTAsMTIxNiwgIDkzLDE5MTIsMTkxMywxMjc3LDEyMTcsMTkxNCwgODU4LCA3NTksICA0NSwgIDU4LCAxODEsIDYxMCwKIDI2OSwxOTE1LDE5MTYsIDEzMSwxMDYyLCA1NTEsIDQ0MywxMDAwLCA4MjEsMTQyNywgOTU3LCA4OTUsMTA4NiwxOTE3LDE5MTgsIDM3NSwKMTkxOSwgMzU5LDE5MjAsIDY4NywxOTIxLCA4MjIsMTkyMiwgMjkzLDE5MjMsMTkyNCwgIDQwLCA2NjIsIDExOCwgNjkyLCAgMjksIDkzOSwKIDg4NywgNjQwLCA0ODIsIDE3NCwxOTI1LCAgNjksMTE2MiwgNzI4LDE0MjgsIDkxMCwxOTI2LDEyNzgsMTIxOCwxMjc5LCAzODYsIDg3MCwKIDIxNywgODU0LDExNjMsIDgyMywxOTI3LDE5MjgsMTkyOSwxOTMwLCA4MzQsMTkzMSwgIDc4LDE5MzIsIDg1OSwxOTMzLDEwNjMsMTkzNCwKMTkzNSwxOTM2LDE5MzcsIDQzOCwxMTY0LCAyMDgsIDU5NSwxOTM4LDE5MzksMTk0MCwxOTQxLDEyMTksMTEyNSwxOTQyLCAyODAsIDg4OCwKMTQyOSwxNDMwLDEyMjAsMTQzMSwxOTQzLDE5NDQsMTk0NSwxOTQ2LDE5NDcsMTI4MCwgMTUwLCA1MTAsMTQzMiwxOTQ4LDE5NDksMTk1MCwKMTk1MSwxOTUyLDE5NTMsMTk1NCwxMDExLDEwODcsMTk1NSwxNDMzLDEwNDMsMTk1NiwgODgxLDE5NTcsIDYxNCwgOTU4LDEwNjQsMTA2NSwKMTIyMSwxOTU4LCA2MzgsMTAwMSwgODYwLCA5NjcsIDg5NiwxNDM0LCA5ODksIDQ5MiwgNTUzLDEyODEsMTE2NSwxOTU5LDEyODIsMTAwMiwKMTI4MywxMjIyLDE5NjAsMTk2MSwxOTYyLDE5NjMsICAzNiwgMzgzLCAyMjgsIDc1MywgMjQ3LCA0NTQsMTk2NCwgODc2LCA2NzgsMTk2NSwKMTk2NiwxMjg0LCAxMjYsIDQ2NCwgNDkwLCA4MzUsIDEzNiwgNjcyLCA1MjksIDk0MCwxMDg4LDE0MzUsIDQ3MywxOTY3LDE5NjgsIDQ2NywKICA1MCwgMzkwLCAyMjcsIDU4NywgMjc5LCAzNzgsIDU5OCwgNzkyLCA5NjgsIDI0MCwgMTUxLCAxNjAsIDg0OSwgODgyLDExMjYsMTI4NSwKIDYzOSwxMDQ0LCAxMzMsIDE0MCwgMjg4LCAzNjAsIDgxMSwgNTYzLDEwMjcsIDU2MSwgMTQyLCA1MjMsMTk2OSwxOTcwLDE5NzEsICAgNywKIDEwMywgMjk2LCA0MzksIDQwNywgNTA2LCA2MzQsIDk5MCwxOTcyLDE5NzMsMTk3NCwxOTc1LCA2NDUsMTk3NiwxOTc3LDE5NzgsMTk3OSwKMTk4MCwxOTgxLCAyMzYsMTk4MiwxNDM2LDE5ODMsMTk4NCwxMDg5LCAxOTIsIDgyOCwgNjE4LCA1MTgsMTE2NiwgMzMzLDExMjcsMTk4NSwKIDgxOCwxMjIzLDE5ODYsMTk4NywxOTg4LDE5ODksMTk5MCwxOTkxLDE5OTIsMTk5MywgMzQyLDExMjgsMTI4NiwgNzQ2LCA4NDIsMTk5NCwKMTk5NSwgNTYwLCAyMjMsMTI4NywgIDk4LCAgIDgsIDE4OSwgNjUwLCA5NzgsMTI4OCwxOTk2LDE0MzcsMTk5NywgIDE3LCAzNDUsIDI1MCwKIDQyMywgMjc3LCAyMzQsIDUxMiwgMjI2LCAgOTcsIDI4OSwgIDQyLCAxNjcsMTk5OCwgMjAxLDE5OTksMjAwMCwgODQzLCA4MzYsIDgyNCwKIDUzMiwgMzM4LCA3ODMsMTA5MCwgMTgyLCA1NzYsIDQzNiwxNDM4LDE0MzksIDUyNywgNTAwLDIwMDEsIDk0NywgODg5LDIwMDIsMjAwMywKMjAwNCwyMDA1LCAyNjIsIDYwMCwgMzE0LCA0NDcsMjAwNiwgNTQ3LDIwMDcsIDY5MywgNzM4LDExMjksMjAwOCwgIDcxLDE0NDAsIDc0NSwKIDYxOSwgNjg4LDIwMDksIDgyOSwyMDEwLDIwMTEsIDE0NywyMDEyLCAgMzMsIDk0OCwyMDEzLDIwMTQsICA3NCwgMjI0LDIwMTUsICA2MSwKIDE5MSwgOTE4LCAzOTksIDYzNywyMDE2LDEwMjgsMTEzMCwgMjU3LCA5MDIsMjAxNywyMDE4LDIwMTksMjAyMCwyMDIxLDIwMjIsMjAyMywKMjAyNCwyMDI1LDIwMjYsIDgzNywyMDI3LDIwMjgsMjAyOSwyMDMwLCAxNzksIDg3NCwgNTkxLCAgNTIsIDcyNCwgMjQ2LDIwMzEsMjAzMiwKMjAzMywyMDM0LDExNjcsIDk2OSwyMDM1LDEyODksIDYzMCwgNjA1LCA5MTEsMTA5MSwxMTY4LDIwMzYsMjAzNywyMDM4LDE0NDEsIDkxMiwKMjAzOSwgNjIzLDIwNDAsMjA0MSwgMjUzLDExNjksMTI5MCwyMDQyLDE0NDIsIDE0NiwgNjIwLCA2MTEsIDU3NywgNDMzLDIwNDMsMTIyNCwKIDcxOSwxMTcwLCA5NTksIDQ0MCwgNDM3LCA1MzQsICA4NCwgMzg4LCA0ODAsMTEzMSwgMTU5LCAyMjAsIDE5OCwgNjc5LDIwNDQsMTAxMiwKIDgxOSwxMDY2LDE0NDMsIDExMywxMjI1LCAxOTQsIDMxOCwxMDAzLDEwMjksMjA0NSwyMDQ2LDIwNDcsMjA0OCwxMDY3LDIwNDksMjA1MCwKMjA1MSwyMDUyLDIwNTMsICA1OSwgOTEzLCAxMTIsMjA1NCwgNjMyLDIwNTUsIDQ1NSwgMTQ0LCA3MzksMTI5MSwyMDU2LCAyNzMsIDY4MSwKIDQ5OSwyMDU3LCA0NDgsMjA1OCwyMDU5LCA3NjAsMjA2MCwyMDYxLCA5NzAsIDM4NCwgMTY5LCAyNDUsMTEzMiwyMDYyLDIwNjMsIDQxNCwKMTQ0NCwyMDY0LDIwNjUsICA0MSwgMjM1LDIwNjYsIDE1NywgMjUyLCA4NzcsIDU2OCwgOTE5LCA3ODksIDU4MCwyMDY3LCA3MjUsMjA2OCwKMjA2OSwxMjkyLDIwNzAsMjA3MSwxNDQ1LDIwNzIsMTQ0NiwyMDczLDIwNzQsICA1NSwgNTg4LCAgNjYsMTQ0NywgMjcxLDEwOTIsMjA3NSwKMTIyNiwyMDc2LCA5NjAsMTAxMywgMzcyLDIwNzcsMjA3OCwyMDc5LDIwODAsMjA4MSwxMjkzLDIwODIsMjA4MywyMDg0LDIwODUsIDg1MCwKMjA4NiwyMDg3LDIwODgsMjA4OSwyMDkwLCAxODYsMjA5MSwxMDY4LCAxODAsMjA5MiwyMDkzLDIwOTQsIDEwOSwxMjI3LCA1MjIsIDYwNiwKMjA5NSwgODY3LDE0NDgsMTA5MywgOTkxLDExNzEsIDkyNiwgMzUzLDExMzMsMjA5NiwgNTgxLDIwOTcsMjA5OCwyMDk5LDEyOTQsMTQ0OSwKMTQ1MCwyMTAwLCA1OTYsMTE3MiwxMDE0LDEyMjgsMjEwMSwxNDUxLDEyOTUsMTE3MywxMjI5LDIxMDIsMjEwMywxMjk2LDExMzQsMTQ1MiwKIDk0OSwxMTM1LDIxMDQsMjEwNSwxMDk0LDE0NTMsMTQ1NCwxNDU1LDIxMDYsMTA5NSwyMTA3LDIxMDgsMjEwOSwyMTEwLDIxMTEsMjExMiwKMjExMywyMTE0LDIxMTUsMjExNiwyMTE3LCA4MDQsMjExOCwyMTE5LDEyMzAsMTIzMSwgODA1LDE0NTYsIDQwNSwxMTM2LDIxMjAsMjEyMSwKMjEyMiwyMTIzLDIxMjQsIDcyMCwgNzAxLDEyOTcsIDk5MiwxNDU3LCA5MjcsMTAwNCwyMTI1LDIxMjYsMjEyNywyMTI4LDIxMjksMjEzMCwKICAyMiwgNDE3LDIxMzEsIDMwMywyMTMyLCAzODUsMjEzMywgOTcxLCA1MjAsIDUxMywyMTM0LDExNzQsICA3MywxMDk2LCAyMzEsIDI3NCwKIDk2MiwxNDU4LCA2NzMsMjEzNSwxNDU5LDIxMzYsIDE1MiwxMTM3LDIxMzcsMjEzOCwyMTM5LDIxNDAsMTAwNSwxMTM4LDE0NjAsMTEzOSwKMjE0MSwyMTQyLDIxNDMsMjE0NCwgIDExLCAzNzQsIDg0NCwyMTQ1LCAxNTQsMTIzMiwgIDQ2LDE0NjEsMjE0NiwgODM4LCA4MzAsIDcyMSwKMTIzMywgMTA2LDIxNDcsICA5MCwgNDI4LCA0NjIsIDU3OCwgNTY2LDExNzUsIDM1MiwyMTQ4LDIxNDksIDUzOCwxMjM0LCAxMjQsMTI5OCwKMjE1MCwxNDYyLCA3NjEsIDU2NSwyMTUxLCA2ODYsMjE1MiwgNjQ5LDIxNTMsICA3MiwgMTczLDIxNTQsIDQ2MCwgNDE1LDIxNTUsMTQ2MywKMjE1NiwxMjM1LCAzMDUsMjE1NywyMTU4LDIxNTksMjE2MCwyMTYxLDIxNjIsIDU3OSwyMTYzLDIxNjQsMjE2NSwyMTY2LDIxNjcsIDc0NywKMjE2OCwyMTY5LDIxNzAsMjE3MSwxNDY0LCA2NjksMjE3MiwyMTczLDIxNzQsMjE3NSwyMTc2LDE0NjUsMjE3NywgIDIzLCA1MzAsIDI4NSwKMjE3OCwgMzM1LCA3MjksMjE3OSwgMzk3LDIxODAsMjE4MSwyMTgyLDEwMzAsMjE4MywyMTg0LCA2OTgsMjE4NSwyMTg2LCAzMjUsMjE4NywKMjE4OCwgMzY5LDIxODksIDc5OSwxMDk3LDEwMTUsIDM0OCwyMTkwLDEwNjksIDY4MCwyMTkxLCA4NTEsMTQ2NiwyMTkyLDIxOTMsICAxMCwKMjE5NCwgNjEzLCA0MjQsMjE5NSwgOTc5LCAxMDgsIDQ0OSwgNTg5LCAgMjcsIDE3MiwgIDgxLDEwMzEsICA4MCwgNzc0LCAyODEsIDM1MCwKMTAzMiwgNTI1LCAzMDEsIDU4MiwxMTc2LDIxOTYsIDY3NCwxMDQ1LDIxOTcsMjE5OCwxNDY3LCA3MzAsIDc2MiwyMTk5LDIyMDAsMjIwMSwKMjIwMiwxNDY4LDIyMDMsIDk5MywyMjA0LDIyMDUsIDI2NiwxMDcwLCA5NjMsMTE0MCwyMjA2LDIyMDcsMjIwOCwgNjY0LDEwOTgsIDk3MiwKMjIwOSwyMjEwLDIyMTEsMTE3NywxNDY5LDE0NzAsIDg3MSwyMjEyLDIyMTMsMjIxNCwyMjE1LDIyMTYsMTQ3MSwyMjE3LDIyMTgsMjIxOSwKMjIyMCwyMjIxLDIyMjIsMjIyMywyMjI0LDIyMjUsMjIyNiwyMjI3LDE0NzIsMTIzNiwyMjI4LDIyMjksMjIzMCwyMjMxLDIyMzIsMjIzMywKMjIzNCwyMjM1LDEyOTksMjIzNiwyMjM3LCAyMDAsMjIzOCwgNDc3LCAzNzMsMjIzOSwyMjQwLCA3MzEsIDgyNSwgNzc3LDIyNDEsMjI0MiwKMjI0MywgNTIxLCA0ODYsIDU0OCwyMjQ0LDIyNDUsMjI0NiwxNDczLDEzMDAsICA1MywgNTQ5LCAxMzcsIDg3NSwgIDc2LCAxNTgsMjI0NywKMTMwMSwxNDc0LCA0NjksIDM5NiwxMDE2LCAyNzgsIDcxMiwyMjQ4LCAzMjEsIDQ0MiwgNTAzLCA3NjcsIDc0NCwgOTQxLDEyMzcsMTE3OCwKMTQ3NSwyMjQ5LCAgODIsIDE3OCwxMTQxLDExNzksIDk3MywyMjUwLDEzMDIsMjI1MSwgMjk3LDIyNTIsMjI1MywgNTcwLDIyNTQsMjI1NSwKMjI1NiwgIDE4LCA0NTAsIDIwNiwyMjU3LCAyOTAsIDI5MiwxMTQyLDIyNTgsIDUxMSwgMTYyLCAgOTksIDM0NiwgMTY0LCA3MzUsMjI1OSwKMTQ3NiwxNDc3LCAgIDQsIDU1NCwgMzQzLCA3OTgsMTA5OSwyMjYwLDExMDAsMjI2MSwgIDQzLCAxNzEsMTMwMywgMTM5LCAyMTUsMjI2MiwKMjI2MywgNzE3LCA3NzUsMjI2NCwxMDMzLCAzMjIsIDIxNiwyMjY1LCA4MzEsMjI2NiwgMTQ5LDIyNjcsMTMwNCwyMjY4LDIyNjksIDcwMiwKMTIzOCwgMTM1LCA4NDUsIDM0NywgMzA5LDIyNzAsIDQ4NCwyMjcxLCA4NzgsIDY1NSwgMjM4LDEwMDYsMTQ3OCwyMjcyLCAgNjcsMjI3MywKIDI5NSwyMjc0LDIyNzUsIDQ2MSwyMjc2LCA0NzgsIDk0MiwgNDEyLDIyNzcsMTAzNCwyMjc4LDIyNzksMjI4MCwgMjY1LDIyODEsIDU0MSwKMjI4MiwyMjgzLDIyODQsMjI4NSwyMjg2LCAgNzAsIDg1MiwxMDcxLDIyODcsMjI4OCwyMjg5LDIyOTAsICAyMSwgIDU2LCA1MDksIDExNywKIDQzMiwyMjkxLDIyOTIsIDMzMSwgOTgwLCA1NTIsMTEwMSwgMTQ4LCAyODQsIDEwNSwgMzkzLDExODAsMTIzOSwgNzU1LDIyOTMsIDE4NywKMjI5NCwxMDQ2LDE0NzksMjI5NSwgMzQwLDIyOTYsICA2MywxMDQ3LCAyMzAsMjI5NywyMjk4LDEzMDUsIDc2MywxMzA2LCAxMDEsIDgwMCwKIDgwOCwgNDk0LDIyOTksMjMwMCwyMzAxLCA5MDMsMjMwMiwgIDM3LDEwNzIsICAxNCwgICA1LDIzMDMsICA3OSwgNjc1LDIzMDQsIDMxMiwKMjMwNSwyMzA2LDIzMDcsMjMwOCwyMzA5LDE0ODAsICAgNiwxMzA3LDIzMTAsMjMxMSwyMzEyLCAgIDEsIDQ3MCwgIDM1LCAgMjQsIDIyOSwKMjMxMywgNjk1LCAyMTAsICA4NiwgNzc4LCAgMTUsIDc4NCwgNTkyLCA3NzksICAzMiwgIDc3LCA4NTUsIDk2NCwyMzE0LCAyNTksMjMxNSwKIDUwMSwgMzgwLDIzMTYsMjMxNywgIDgzLCA5ODEsIDE1MywgNjg5LDEzMDgsMTQ4MSwxNDgyLDE0ODMsMjMxOCwyMzE5LCA3MTYsMTQ4NCwKMjMyMCwyMzIxLDIzMjIsMjMyMywyMzI0LDIzMjUsMTQ4NSwyMzI2LDIzMjcsIDEyOCwgIDU3LCAgNjgsIDI2MSwxMDQ4LCAyMTEsIDE3MCwKMTI0MCwgIDMxLDIzMjgsICA1MSwgNDM1LCA3NDIsMjMyOSwyMzMwLDIzMzEsIDYzNSwyMzMyLCAyNjQsIDQ1NiwyMzMzLDIzMzQsMjMzNSwKIDQyNSwyMzM2LDE0ODYsIDE0MywgNTA3LCAyNjMsIDk0MywyMzM3LCAzNjMsIDkyMCwxNDg3LCAyNTYsMTQ4OCwxMTAyLCAyNDMsIDYwMSwKMTQ4OSwyMzM4LDIzMzksMjM0MCwyMzQxLDIzNDIsMjM0MywyMzQ0LCA4NjEsMjM0NSwyMzQ2LDIzNDcsMjM0OCwyMzQ5LDIzNTAsIDM5NSwKMjM1MSwxNDkwLDE0OTEsICA2MiwgNTM1LCAxNjYsIDIyNSwyMzUyLDIzNTMsIDY2OCwgNDE5LDEyNDEsIDEzOCwgNjA0LCA5MjgsMjM1NCwKMTE4MSwyMzU1LDE0OTIsMTQ5MywyMzU2LDIzNTcsMjM1OCwxMTQzLDIzNTksIDY5NiwyMzYwLCAzODcsIDMwNywxMzA5LCA2ODIsIDQ3NiwKMjM2MSwyMzYyLCAzMzIsICAxMiwgMjIyLCAxNTYsMjM2MywgMjMyLDIzNjQsIDY0MSwgMjc2LCA2NTYsIDUxNywxNDk0LDE0OTUsMTAzNSwKIDQxNiwgNzM2LDE0OTYsMjM2NSwxMDE3LCA1ODYsMjM2NiwyMzY3LDIzNjgsMTQ5NywyMzY5LCAyNDIsMjM3MCwyMzcxLDIzNzIsMTQ5OCwKMjM3MywgOTY1LCA3MTMsMjM3NCwyMzc1LDIzNzYsMjM3NywgNzQwLCA5ODIsMTQ5OSwgOTQ0LDE1MDAsMTAwNywyMzc4LDIzNzksMTMxMCwKMTUwMSwyMzgwLDIzODEsMjM4MiwgNzg1LCAzMjksMjM4MywyMzg0LDE1MDIsMjM4NSwyMzg2LDIzODcsIDkzMiwyMzg4LDE1MDMsMjM4OSwKMjM5MCwyMzkxLDIzOTIsMTI0MiwyMzkzLDIzOTQsMjM5NSwyMzk2LDIzOTcsIDk5NCwgOTUwLDIzOTgsMjM5OSwyNDAwLDI0MDEsMTUwNCwKMTMxMSwyNDAyLDI0MDMsMjQwNCwyNDA1LDEwNDksIDc0OSwyNDA2LDI0MDcsIDg1MywgNzE4LDExNDQsMTMxMiwyNDA4LDExODIsMTUwNSwKMjQwOSwyNDEwLCAyNTUsIDUxNiwgNDc5LCA1NjQsIDU1MCwgMjE0LDE1MDYsMTUwNywxMzEzLCA0MTMsIDIzOSwgNDQ0LCAzMzksMTE0NSwKMTAzNiwxNTA4LDE1MDksMTMxNCwxMDM3LDE1MTAsMTMxNSwyNDExLDE1MTEsMjQxMiwyNDEzLDI0MTQsIDE3NiwgNzAzLCA0OTcsIDYyNCwKIDU5MywgOTIxLCAzMDIsMjQxNSwgMzQxLCAxNjUsMTEwMywxNTEyLDI0MTYsMTUxMywyNDE3LDI0MTgsMjQxOSwgMzc2LDI0MjAsIDcwMCwKMjQyMSwyNDIyLDI0MjMsIDI1OCwgNzY4LDEzMTYsMjQyNCwxMTgzLDI0MjUsIDk5NSwgNjA4LDI0MjYsMjQyNywyNDI4LDI0MjksIDIyMSwKMjQzMCwyNDMxLDI0MzIsMjQzMywyNDM0LDI0MzUsMjQzNiwyNDM3LCAxOTUsIDMyMywgNzI2LCAxODgsIDg5NywgOTgzLDEzMTcsIDM3NywKIDY0NCwxMDUwLCA4NzksMjQzOCwgNDUyLDI0MzksMjQ0MCwyNDQxLDI0NDIsMjQ0MywyNDQ0LCA5MTQsMjQ0NSwyNDQ2LDI0NDcsMjQ0OCwKIDkxNSwgNDg5LDI0NDksMTUxNCwxMTg0LDI0NTAsMjQ1MSwgNTE1LCAgNjQsIDQyNywgNDk1LDI0NTIsIDU4MywyNDUzLCA0ODMsIDQ4NSwKMTAzOCwgNTYyLCAyMTMsMTUxNSwgNzQ4LCA2NjYsMjQ1NCwyNDU1LDI0NTYsMjQ1NywgMzM0LDI0NTgsIDc4MCwgOTk2LDEwMDgsIDcwNSwKMTI0MywyNDU5LDI0NjAsMjQ2MSwyNDYyLDI0NjMsIDExNCwyNDY0LCA0OTMsMTE0NiwgMzY2LCAxNjMsMTUxNiwgOTYxLDExMDQsMjQ2NSwKIDI5MSwyNDY2LDEzMTgsMTEwNSwyNDY3LDE1MTcsIDM2NSwyNDY4LCAzNTUsIDk1MSwxMjQ0LDI0NjksMTMxOSwyNDcwLCA2MzEsMjQ3MSwKMjQ3MiwgMjE4LDEzMjAsIDM2NCwgMzIwLCA3NTYsMTUxOCwxNTE5LDEzMjEsMTUyMCwxMzIyLDI0NzMsMjQ3NCwyNDc1LDI0NzYsIDk5NywKMjQ3NywyNDc4LDI0NzksMjQ4MCwgNjY1LDExODUsMjQ4MSwgOTE2LDE1MjEsMjQ4MiwyNDgzLDI0ODQsIDU4NCwgNjg0LDI0ODUsMjQ4NiwKIDc5NywyNDg3LDEwNTEsMTE4NiwyNDg4LDI0ODksMjQ5MCwxNTIyLDI0OTEsMjQ5MiwgMzcwLDI0OTMsMTAzOSwxMTg3LCAgNjUsMjQ5NCwKIDQzNCwgMjA1LCA0NjMsMTE4OCwyNDk1LCAxMjUsIDgxMiwgMzkxLCA0MDIsIDgyNiwgNjk5LCAyODYsIDM5OCwgMTU1LCA3ODEsIDc3MSwKIDU4NSwyNDk2LCA1OTAsIDUwNSwxMDczLDI0OTcsIDU5OSwgMjQ0LCAyMTksIDkxNywxMDE4LCA5NTIsIDY0NiwxNTIzLDI0OTgsMTMyMywKMjQ5OSwyNTAwLCAgNDksIDk4NCwgMzU0LCA3NDEsMjUwMSwgNjI1LDI1MDIsMTMyNCwyNTAzLDEwMTksIDE5MCwgMzU3LCA3NTcsIDQ5MSwKICA5NSwgNzgyLCA4NjgsMjUwNCwyNTA1LDI1MDYsMjUwNywyNTA4LDI1MDksIDEzNCwxNTI0LDEwNzQsIDQyMiwxNTI1LCA4OTgsMjUxMCwKIDE2MSwyNTExLDI1MTIsMjUxMywyNTE0LCA3NjksMjUxNSwxNTI2LDI1MTYsMjUxNywgNDExLDEzMjUsMjUxOCwgNDcyLDE1MjcsMjUxOSwKMjUyMCwyNTIxLDI1MjIsMjUyMywyNTI0LCA5ODUsMjUyNSwyNTI2LDI1MjcsMjUyOCwyNTI5LDI1MzAsIDc2NCwyNTMxLDEyNDUsMjUzMiwKMjUzMywgIDI1LCAyMDQsIDMxMSwyNTM0LCA0OTYsMjUzNSwxMDUyLDI1MzYsMjUzNywyNTM4LDI1MzksMjU0MCwyNTQxLDI1NDIsIDE5OSwKIDcwNCwgNTA0LCA0NjgsIDc1OCwgNjU3LDE1MjgsIDE5NiwgIDQ0LCA4MzksMTI0NiwgMjcyLCA3NTAsMjU0MywgNzY1LCA4NjIsMjU0NCwKMjU0NSwxMzI2LDI1NDYsIDEzMiwgNjE1LCA5MzMsMjU0NywgNzMyLDI1NDgsMjU0OSwyNTUwLDExODksMTUyOSwyNTUxLCAyODMsMTI0NywKMTA1MywgNjA3LCA5MjksMjU1MiwyNTUzLDI1NTQsIDkzMCwgMTgzLCA4NzIsIDYxNiwxMDQwLDExNDcsMjU1NSwxMTQ4LDEwMjAsIDQ0MSwKIDI0OSwxMDc1LDI1NTYsMjU1NywyNTU4LCA0NjYsIDc0MywyNTU5LDI1NjAsMjU2MSwgIDkyLCA1MTQsIDQyNiwgNDIwLCA1MjYsMjU2MiwKMjU2MywyNTY0LDI1NjUsMjU2NiwyNTY3LDI1NjgsIDE4NSwyNTY5LDI1NzAsMjU3MSwyNTcyLCA3NzYsMTUzMCwgNjU4LDI1NzMsIDM2MiwKMjU3NCwgMzYxLCA5MjIsMTA3NiwgNzkzLDI1NzUsMjU3NiwyNTc3LDI1NzgsMjU3OSwyNTgwLDE1MzEsIDI1MSwyNTgxLDI1ODIsMjU4MywKMjU4NCwxNTMyLCAgNTQsIDYxMiwgMjM3LDEzMjcsMjU4NSwyNTg2LCAyNzUsIDQwOCwgNjQ3LCAxMTEsMjU4NywxNTMzLDExMDYsIDQ2NSwKICAgMywgNDU4LCAgIDksICAzOCwyNTg4LCAxMDcsIDExMCwgODkwLCAyMDksICAyNiwgNzM3LCA0OTgsMjU4OSwxNTM0LDI1OTAsIDQzMSwKIDIwMiwgIDg4LDE1MzUsIDM1NiwgMjg3LDExMDcsIDY2MCwxMTQ5LDI1OTEsIDM4MSwxNTM2LCA5ODYsMTE1MCwgNDQ1LDEyNDgsMTE1MSwKIDk3NCwyNTkyLDI1OTMsIDg0NiwyNTk0LCA0NDYsIDk1MywgMTg0LDEyNDksMTI1MCwgNzI3LDI1OTUsIDkyMywgMTkzLCA4ODMsMjU5NiwKMjU5NywyNTk4LCAxMDIsIDMyNCwgNTM5LCA4MTcsMjU5OSwgNDIxLDEwNDEsMjYwMCwgODMyLDI2MDEsICA5NCwgMTc1LCAxOTcsIDQwNiwKMjYwMiwgNDU5LDI2MDMsMjYwNCwyNjA1LDI2MDYsMjYwNywgMzMwLCA1NTUsMjYwOCwyNjA5LDI2MTAsIDcwNiwxMTA4LCAzODksMjYxMSwKMjYxMiwyNjEzLDI2MTQsIDIzMywyNjE1LCA4MzMsIDU1OCwgOTMxLCA5NTQsMTI1MSwyNjE2LDI2MTcsMTUzNywgNTQ2LDI2MTgsMjYxOSwKMTAwOSwyNjIwLDI2MjEsMjYyMiwxNTM4LCA2OTAsMTMyOCwyNjIzLCA5NTUsMjYyNCwxNTM5LDI2MjUsMjYyNiwgNzcyLDI2MjcsMjYyOCwKMjYyOSwyNjMwLDI2MzEsIDkyNCwgNjQ4LCA4NjMsIDYwMywyNjMyLDI2MzMsIDkzNCwxNTQwLCA4NjQsIDg2NSwyNjM0LCA2NDIsMTA0MiwKIDY3MCwxMTkwLDI2MzUsMjYzNiwyNjM3LDI2MzgsIDE2OCwyNjM5LCA2NTIsIDg3MywgNTQyLDEwNTQsMTU0MSwyNjQwLDI2NDEsMjY0MiwgICMgNTEyLCAyNTYKKQoKUEsDBBQAAAAAAAAAIQAmBZf41AYAANQGAAAyAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvZXVja3Jwcm9iZXIucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBtb3ppbGxhLm9yZyBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMTk5OAojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZnJvbSAubWJjaGFyc2V0cHJvYmVyIGltcG9ydCBNdWx0aUJ5dGVDaGFyU2V0UHJvYmVyCmZyb20gLmNvZGluZ3N0YXRlbWFjaGluZSBpbXBvcnQgQ29kaW5nU3RhdGVNYWNoaW5lCmZyb20gLmNoYXJkaXN0cmlidXRpb24gaW1wb3J0IEVVQ0tSRGlzdHJpYnV0aW9uQW5hbHlzaXMKZnJvbSAubWJjc3NtIGltcG9ydCBFVUNLUl9TTV9NT0RFTAoKCmNsYXNzIEVVQ0tSUHJvYmVyKE11bHRpQnl0ZUNoYXJTZXRQcm9iZXIpOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHN1cGVyKEVVQ0tSUHJvYmVyLCBzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5jb2Rpbmdfc20gPSBDb2RpbmdTdGF0ZU1hY2hpbmUoRVVDS1JfU01fTU9ERUwpCiAgICAgICAgc2VsZi5kaXN0cmlidXRpb25fYW5hbHl6ZXIgPSBFVUNLUkRpc3RyaWJ1dGlvbkFuYWx5c2lzKCkKICAgICAgICBzZWxmLnJlc2V0KCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjaGFyc2V0X25hbWUoc2VsZik6CiAgICAgICAgcmV0dXJuICJFVUMtS1IiCgogICAgQHByb3BlcnR5CiAgICBkZWYgbGFuZ3VhZ2Uoc2VsZik6CiAgICAgICAgcmV0dXJuICJLb3JlYW4iClBLAwQUAAAAAAAAACEAzNtJ1YV7AACFewAAMAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2V1Y3R3ZnJlcS5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIE1vemlsbGEgQ29tbXVuaWNhdG9yIGNsaWVudCBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMTk5OAojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyBFVUNUVyBmcmVxdWVuY3kgdGFibGUKIyBDb252ZXJ0ZWQgZnJvbSBiaWc1IHdvcmsKIyBieSBUYWl3YW4ncyBNYW5kYXJpbiBQcm9tb3Rpb24gQ291bmNpbAojIDxodHRwOiN3d3cuZWR1LnR3OjgxL21hbmRyLz4KCiMgMTI4ICAtLT4gMC40MjI2MQojIDI1NiAgLS0+IDAuNTc4NTEKIyA1MTIgIC0tPiAwLjc0ODUxCiMgMTAyNCAtLT4gMC44OTM4NAojIDIwNDggLS0+IDAuOTc1ODMKIwojIElkZWEgRGlzdHJpYnV0aW9uIFJhdGlvID0gMC43NDg1MS8oMS0wLjc0ODUxKSA9Mi45OAojIFJhbmRvbSBEaXN0cmlidXRpb24gUmF0aW9uID0gNTEyLyg1NDAxLTUxMik9MC4xMDUKIwojIFR5cGljYWwgRGlzdHJpYnV0aW9uIFJhdGlvIGFib3V0IDI1JSBvZiBJZGVhbCBvbmUsIHN0aWxsIG11Y2ggaGlnaGVyIHRoYW4gUkRSCgpFVUNUV19UWVBJQ0FMX0RJU1RSSUJVVElPTl9SQVRJTyA9IDAuNzUKCiMgQ2hhciB0byBGcmVxT3JkZXIgdGFibGUgLApFVUNUV19UQUJMRV9TSVpFID0gNTM3NgoKRVVDVFdfQ0hBUl9UT19GUkVRX09SREVSID0gKAogICAxLDE4MDAsMTUwNiwgMjU1LDE0MzEsIDE5OCwgICA5LCAgODIsICAgNiw3MzEwLCAxNzcsIDIwMiwzNjE1LDEyNTYsMjgwOCwgMTEwLCAgIyAyNzQyCjM3MzUsICAzMywzMjQxLCAyNjEsICA3NiwgIDQ0LDIxMTMsICAxNiwyOTMxLDIxODQsMTE3NiwgNjU5LDM4NjgsICAyNiwzNDA0LDI2NDMsICAjIDI3NTgKMTE5OCwzODY5LDMzMTMsNDA2MCwgNDEwLDIyMTEsIDMwMiwgNTkwLCAzNjEsMTk2MywgICA4LCAyMDQsICA1OCw0Mjk2LDczMTEsMTkzMSwgICMgMjc3NAogIDYzLDczMTIsNzMxMywgMzE3LDE2MTQsICA3NSwgMjIyLCAxNTksNDA2MSwyNDEyLDE0ODAsNzMxNCwzNTAwLDMwNjgsIDIyNCwyODA5LCAgIyAyNzkwCjM2MTYsICAgMywgIDEwLDM4NzAsMTQ3MSwgIDI5LDI3NzQsMTEzNSwyODUyLDE5MzksIDg3MywgMTMwLDMyNDIsMTEyMywgMzEyLDczMTUsICAjIDI4MDYKNDI5NywyMDUxLCA1MDcsIDI1MiwgNjgyLDczMTYsIDE0MiwxOTE0LCAxMjQsIDIwNiwyOTMyLCAgMzQsMzUwMSwzMTczLCAgNjQsIDYwNCwgICMgMjgyMgo3MzE3LDI0OTQsMTk3NiwxOTc3LCAxNTUsMTk5MCwgNjQ1LCA2NDEsMTYwNiw3MzE4LDM0MDUsIDMzNywgIDcyLCA0MDYsNzMxOSwgIDgwLCAgIyAyODM4CiA2MzAsIDIzOCwzMTc0LDE1MDksIDI2MywgOTM5LDEwOTIsMjY0NCwgNzU2LDE0NDAsMTA5NCwzNDA2LCA0NDksICA2OSwyOTY5LCA1OTEsICAjIDI4NTQKIDE3OSwyMDk1LCA0NzEsIDExNSwyMDM0LDE4NDMsICA2MCwgIDUwLDI5NzAsIDEzNCwgODA2LDE4NjgsIDczNCwyMDM1LDM0MDcsIDE4MCwgICMgMjg3MAogOTk1LDE2MDcsIDE1NiwgNTM3LDI4OTMsIDY4OCw3MzIwLCAzMTksMTMwNSwgNzc5LDIxNDQsIDUxNCwyMzc0LCAyOTgsNDI5OCwgMzU5LCAgIyAyODg2CjI0OTUsICA5MCwyNzA3LDEzMzgsIDY2MywgIDExLCA5MDYsMTA5OSwyNTQ1LCAgMjAsMjQzNiwgMTgyLCA1MzIsMTcxNiw3MzIxLCA3MzIsICAjIDI5MDIKMTM3Niw0MDYyLDEzMTEsMTQyMCwzMTc1LCAgMjUsMjMxMiwxMDU2LCAxMTMsIDM5OSwgMzgyLDE5NDksIDI0MiwzNDA4LDI0NjcsIDUyOSwgICMgMjkxOAozMjQzLCA0NzUsMTQ0NywzNjE3LDczMjIsIDExNywgIDIxLCA2NTYsIDgxMCwxMjk3LDIyOTUsMjMyOSwzNTAyLDczMjMsIDEyNiw0MDYzLCAgIyAyOTM0CiA3MDYsIDQ1NiwgMTUwLCA2MTMsNDI5OSwgIDcxLDExMTgsMjAzNiw0MDY0LCAxNDUsMzA2OSwgIDg1LCA4MzUsIDQ4NiwyMTE0LDEyNDYsICAjIDI5NTAKMTQyNiwgNDI4LCA3MjcsMTI4NSwxMDE1LCA4MDAsIDEwNiwgNjIzLCAzMDMsMTI4MSw3MzI0LDIxMjcsMjM1NCwgMzQ3LDM3MzYsIDIyMSwgICMgMjk2NgozNTAzLDMxMTAsNzMyNSwxOTU1LDExNTMsNDA2NSwgIDgzLCAyOTYsMTE5OSwzMDcwLCAxOTIsIDYyNCwgIDkzLDczMjYsIDgyMiwxODk3LCAgIyAyOTgyCjI4MTAsMzExMSwgNzk1LDIwNjQsIDk5MSwxNTU0LDE1NDIsMTU5MiwgIDI3LCAgNDMsMjg1MywgODU5LCAxMzksMTQ1NiwgODYwLDQzMDAsICAjIDI5OTgKIDQzNywgNzEyLDM4NzEsIDE2NCwyMzkyLDMxMTIsIDY5NSwgMjExLDMwMTcsMjA5NiwgMTk1LDM4NzIsMTYwOCwzNTA0LDM1MDUsMzYxOCwgICMgMzAxNAozODczLCAyMzQsIDgxMSwyOTcxLDIwOTcsMzg3NCwyMjI5LDE0NDEsMzUwNiwxNjE1LDIzNzUsIDY2OCwyMDc2LDE2MzgsIDMwNSwgMjI4LCAgIyAzMDMwCjE2NjQsNDMwMSwgNDY3LCA0MTUsNzMyNywgMjYyLDIwOTgsMTU5MywgMjM5LCAxMDgsIDMwMCwgMjAwLDEwMzMsIDUxMiwxMjQ3LDIwNzcsICAjIDMwNDYKNzMyOCw3MzI5LDIxNzMsMzE3NiwzNjE5LDI2NzMsIDU5MywgODQ1LDEwNjIsMzI0NCwgIDg4LDE3MjMsMjAzNywzODc1LDE5NTAsIDIxMiwgICMgMzA2MgogMjY2LCAxNTIsIDE0OSwgNDY4LDE4OTgsNDA2Niw0MzAyLCAgNzcsIDE4Nyw3MzMwLDMwMTgsICAzNywgICA1LDI5NzIsNzMzMSwzODc2LCAgIyAzMDc4CjczMzIsNzMzMywgIDM5LDI1MTcsNDMwMywyODk0LDMxNzcsMjA3OCwgIDU1LCAxNDgsICA3NCw0MzA0LCA1NDUsIDQ4MywxNDc0LDEwMjksICAjIDMwOTQKMTY2NSwgMjE3LDE4NjksMTUzMSwzMTEzLDExMDQsMjY0NSw0MDY3LCAgMjQsIDE3MiwzNTA3LCA5MDAsMzg3NywzNTA4LDM1MDksNDMwNSwgICMgMzExMAogIDMyLDE0MDgsMjgxMSwxMzEyLCAzMjksIDQ4NywyMzU1LDIyNDcsMjcwOCwgNzg0LDI2NzQsICAgNCwzMDE5LDMzMTQsMTQyNywxNzg4LCAgIyAzMTI2CiAxODgsIDEwOSwgNDk5LDczMzQsMzYyMCwxNzE3LDE3ODksIDg4OCwxMjE3LDMwMjAsNDMwNiw3MzM1LDM1MTAsNzMzNiwzMzE1LDE1MjAsICAjIDMxNDIKMzYyMSwzODc4LCAxOTYsMTAzNCwgNzc1LDczMzcsNzMzOCwgOTI5LDE4MTUsIDI0OSwgNDM5LCAgMzgsNzMzOSwxMDYzLDczNDAsIDc5NCwgICMgMzE1OAozODc5LDE0MzUsMjI5NiwgIDQ2LCAxNzgsMzI0NSwyMDY1LDczNDEsMjM3Niw3MzQyLCAyMTQsMTcwOSw0MzA3LCA4MDQsICAzNSwgNzA3LCAgIyAzMTc0CiAzMjQsMzYyMiwxNjAxLDI1NDYsIDE0MCwgNDU5LDQwNjgsNzM0Myw3MzQ0LDEzNjUsIDgzOSwgMjcyLCA5NzgsMjI1NywyNTcyLDM0MDksICAjIDMxOTAKMjEyOCwxMzYzLDM2MjMsMTQyMywgNjk3LCAxMDAsMzA3MSwgIDQ4LCAgNzAsMTIzMSwgNDk1LDMxMTQsMjE5Myw3MzQ1LDEyOTQsNzM0NiwgICMgMzIwNgoyMDc5LCA0NjIsIDU4NiwxMDQyLDMyNDYsIDg1MywgMjU2LCA5ODgsIDE4NSwyMzc3LDM0MTAsMTY5OCwgNDM0LDEwODQsNzM0NywzNDExLCAgIyAzMjIyCiAzMTQsMjYxNSwyNzc1LDQzMDgsMjMzMCwyMzMxLCA1NjksMjI4MCwgNjM3LDE4MTYsMjUxOCwgNzU3LDExNjIsMTg3OCwxNjE2LDM0MTIsICAjIDMyMzgKIDI4NywxNTc3LDIxMTUsIDc2OCw0MzA5LDE2NzEsMjg1NCwzNTExLDI1MTksMTMyMSwzNzM3LCA5MDksMjQxMyw3MzQ4LDQwNjksIDkzMywgICMgMzI1NAozNzM4LDczNDksMjA1MiwyMzU2LDEyMjIsNDMxMCwgNzY1LDI0MTQsMTMyMiwgNzg2LDQzMTEsNzM1MCwxOTE5LDE0NjIsMTY3NywyODk1LCAgIyAzMjcwCjE2OTksNzM1MSw0MzEyLDE0MjQsMjQzNywzMTE1LDM2MjQsMjU5MCwzMzE2LDE3NzQsMTk0MCwzNDEzLDM4ODAsNDA3MCwgMzA5LDEzNjksICAjIDMyODYKMTEzMCwyODEyLCAzNjQsMjIzMCwxNjUzLDEyOTksMzg4MSwzNTEyLDM4ODIsMzg4MywyNjQ2LCA1MjUsMTA4NSwzMDIxLCA5MDIsMjAwMCwgICMgMzMwMgoxNDc1LCA5NjQsNDMxMywgNDIxLDE4NDQsMTQxNSwxMDU3LDIyODEsIDk0MCwxMzY0LDMxMTYsIDM3Niw0MzE0LDQzMTUsMTM4MSwgICA3LCAgIyAzMzE4CjI1MjAsIDk4MywyMzc4LCAzMzYsMTcxMCwyNjc1LDE4NDUsIDMyMSwzNDE0LCA1NTksMTEzMSwzMDIyLDI3NDIsMTgwOCwxMTMyLDEzMTMsICAjIDMzMzQKIDI2NSwxNDgxLDE4NTcsNzM1MiwgMzUyLDEyMDMsMjgxMywzMjQ3LCAxNjcsMTA4OSwgNDIwLDI4MTQsIDc3NiwgNzkyLDE3MjQsMzUxMywgICMgMzM1MAo0MDcxLDI0MzgsMzI0OCw3MzUzLDQwNzIsNzM1NCwgNDQ2LCAyMjksIDMzMywyNzQzLCA5MDEsMzczOSwxMjAwLDE1NTcsNDMxNiwyNjQ3LCAgIyAzMzY2CjE5MjAsIDM5NSwyNzQ0LDI2NzYsMzc0MCw0MDczLDE4MzUsIDEyNSwgOTE2LDMxNzgsMjYxNiw0MzE3LDczNTUsNzM1NiwzNzQxLDczNTcsICAjIDMzODIKNzM1OCw3MzU5LDQzMTgsMzExNywzNjI1LDExMzMsMjU0NywxNzU3LDM0MTUsMTUxMCwyMzEzLDE0MDksMzUxNCw3MzYwLDIxNDUsIDQzOCwgICMgMzM5OAoyNTkxLDI4OTYsMjM3OSwzMzE3LDEwNjgsIDk1OCwzMDIzLCA0NjEsIDMxMSwyODU1LDI2NzcsNDA3NCwxOTE1LDMxNzksNDA3NSwxOTc4LCAgIyAzNDE0CiAzODMsIDc1MCwyNzQ1LDI2MTcsNDA3NiwgMjc0LCA1MzksIDM4NSwxMjc4LDE0NDIsNzM2MSwxMTU0LDE5NjQsIDM4NCwgNTYxLCAyMTAsICAjIDM0MzAKICA5OCwxMjk1LDI1NDgsMzUxNSw3MzYyLDE3MTEsMjQxNSwxNDgyLDM0MTYsMzg4NCwyODk3LDEyNTcsIDEyOSw3MzYzLDM3NDIsIDY0MiwgICMgMzQ0NgogNTIzLDI3NzYsMjc3NywyNjQ4LDczNjQsIDE0MSwyMjMxLDEzMzMsICA2OCwgMTc2LCA0NDEsIDg3NiwgOTA3LDQwNzcsIDYwMywyNTkyLCAgIyAzNDYyCiA3MTAsIDE3MSwzNDE3LCA0MDQsIDU0OSwgIDE4LDMxMTgsMjM5MywxNDEwLDM2MjYsMTY2Niw3MzY1LDM1MTYsNDMxOSwyODk4LDQzMjAsICAjIDM0NzgKNzM2NiwyOTczLCAzNjgsNzM2NywgMTQ2LCAzNjYsICA5OSwgODcxLDM2MjcsMTU0MywgNzQ4LCA4MDcsMTU4NiwxMTg1LCAgMjIsMjI1OCwgICMgMzQ5NAogMzc5LDM3NDMsMzE4MCw3MzY4LDMxODEsIDUwNSwxOTQxLDI2MTgsMTk5MSwxMzgyLDIzMTQsNzM2OSwgMzgwLDIzNTcsIDIxOCwgNzAyLCAgIyAzNTEwCjE4MTcsMTI0OCwzNDE4LDMwMjQsMzUxNywzMzE4LDMyNDksNzM3MCwyOTc0LDM2MjgsIDkzMCwzMjUwLDM3NDQsNzM3MSwgIDU5LDczNzIsICAjIDM1MjYKIDU4NSwgNjAxLDQwNzgsIDQ5NywzNDE5LDExMTIsMTMxNCw0MzIxLDE4MDEsNzM3MywxMjIzLDE0NzIsMjE3NCw3Mzc0LCA3NDksMTgzNiwgICMgMzU0MgogNjkwLDE4OTksMzc0NSwxNzcyLDM4ODUsMTQ3NiwgNDI5LDEwNDMsMTc5MCwyMjMyLDIxMTYsIDkxNyw0MDc5LCA0NDcsMTA4NiwxNjI5LCAgIyAzNTU4CjczNzUsIDU1Niw3Mzc2LDczNzcsMjAyMCwxNjU0LCA4NDQsMTA5MCwgMTA1LCA1NTAsIDk2NiwxNzU4LDI4MTUsMTAwOCwxNzgyLCA2ODYsICAjIDM1NzQKMTA5NSw3Mzc4LDIyODIsIDc5MywxNjAyLDczNzksMzUxOCwyNTkzLDQzMjIsNDA4MCwyOTMzLDIyOTcsNDMyMywzNzQ2LCA5ODAsMjQ5NiwgICMgMzU5MAogNTQ0LCAzNTMsIDUyNyw0MzI0LCA5MDgsMjY3OCwyODk5LDczODAsIDM4MSwyNjE5LDE5NDIsMTM0OCw3MzgxLDEzNDEsMTI1MiwgNTYwLCAgIyAzNjA2CjMwNzIsNzM4MiwzNDIwLDI4NTYsNzM4MywyMDUzLCA5NzMsIDg4NiwyMDgwLCAxNDMsNDMyNSw3Mzg0LDczODUsIDE1NywzODg2LCA0OTYsICAjIDM2MjIKNDA4MSwgIDU3LCA4NDAsIDU0MCwyMDM4LDQzMjYsNDMyNywzNDIxLDIxMTcsMTQ0NSwgOTcwLDIyNTksMTc0OCwxOTY1LDIwODEsNDA4MiwgICMgMzYzOAozMTE5LDEyMzQsMTc3NSwzMjUxLDI4MTYsMzYyOSwgNzczLDEyMDYsMjEyOSwxMDY2LDIwMzksMTMyNiwzODg3LDE3MzgsMTcyNSw0MDgzLCAgIyAzNjU0CiAyNzksMzEyMCwgIDUxLDE1NDQsMjU5NCwgNDIzLDE1NzgsMjEzMCwyMDY2LCAxNzMsNDMyOCwxODc5LDczODYsNzM4NywxNTgzLCAyNjQsICAjIDM2NzAKIDYxMCwzNjMwLDQzMjksMjQzOSwgMjgwLCAxNTQsNzM4OCw3Mzg5LDczOTAsMTczOSwgMzM4LDEyODIsMzA3MywgNjkzLDI4NTcsMTQxMSwgICMgMzY4NgoxMDc0LDM3NDcsMjQ0MCw3MzkxLDQzMzAsNzM5Miw3MzkzLDEyNDAsIDk1MiwyMzk0LDczOTQsMjkwMCwxNTM4LDI2NzksIDY4NSwxNDgzLCAgIyAzNzAyCjQwODQsMjQ2OCwxNDM2LCA5NTMsNDA4NSwyMDU0LDQzMzEsIDY3MSwyMzk1LCAgNzksNDA4NiwyNDQxLDMyNTIsIDYwOCwgNTY3LDI2ODAsICAjIDM3MTgKMzQyMiw0MDg3LDQwODgsMTY5MSwgMzkzLDEyNjEsMTc5MSwyMzk2LDczOTUsNDMzMiw3Mzk2LDczOTcsNzM5OCw3Mzk5LDEzODMsMTY3MiwgICMgMzczNAozNzQ4LDMxODIsMTQ2NCwgNTIyLDExMTksIDY2MSwxMTUwLCAyMTYsIDY3NSw0MzMzLDM4ODgsMTQzMiwzNTE5LCA2MDksNDMzNCwyNjgxLCAgIyAzNzUwCjIzOTcsNzQwMCw3NDAxLDc0MDIsNDA4OSwzMDI1LCAgIDAsNzQwMywyNDY5LCAzMTUsIDIzMSwyNDQyLCAzMDEsMzMxOSw0MzM1LDIzODAsICAjIDM3NjYKNzQwNCwgMjMzLDQwOTAsMzYzMSwxODE4LDQzMzYsNDMzNyw3NDA1LCAgOTYsMTc3NiwxMzE1LDIwODIsNzQwNiwgMjU3LDc0MDcsMTgwOSwgICMgMzc4MgozNjMyLDI3MDksMTEzOSwxODE5LDQwOTEsMjAyMSwxMTI0LDIxNjMsMjc3OCwxNzc3LDI2NDksNzQwOCwzMDc0LCAzNjMsMTY1NSwzMTgzLCAgIyAzNzk4Cjc0MDksMjk3NSw3NDEwLDc0MTEsNzQxMiwzODg5LDE1NjcsMzg5MCwgNzE4LCAxMDMsMzE4NCwgODQ5LDE0NDMsIDM0MSwzMzIwLDI5MzQsICAjIDM4MTQKMTQ4NCw3NDEzLDE3MTIsIDEyNywgIDY3LCAzMzksNDA5MiwyMzk4LCA2NzksMTQxMiwgODIxLDc0MTQsNzQxNSwgODM0LCA3MzgsIDM1MSwgICMgMzgzMAoyOTc2LDIxNDYsIDg0NiwgMjM1LDE0OTcsMTg4MCwgNDE4LDE5OTIsMzc0OSwyNzEwLCAxODYsMTEwMCwyMTQ3LDI3NDYsMzUyMCwxNTQ1LCAgIyAzODQ2CjEzNTUsMjkzNSwyODU4LDEzNzcsIDU4MywzODkxLDQwOTMsMjU3MywyOTc3LDc0MTYsMTI5OCwzNjMzLDEwNzgsMjU0OSwzNjM0LDIzNTgsICAjIDM4NjIKICA3OCwzNzUwLDM3NTEsIDI2NywxMjg5LDIwOTksMjAwMSwxNTk0LDQwOTQsIDM0OCwgMzY5LDEyNzQsMjE5NCwyMTc1LDE4MzcsNDMzOCwgICMgMzg3OAoxODIwLDI4MTcsMzYzNSwyNzQ3LDIyODMsMjAwMiw0MzM5LDI5MzYsMjc0OCwgMTQ0LDMzMjEsIDg4Miw0MzQwLDM4OTIsMjc0OSwzNDIzLCAgIyAzODk0CjQzNDEsMjkwMSw3NDE3LDQwOTUsMTcyNiwgMzIwLDc0MTgsMzg5MywzMDI2LCA3ODgsMjk3OCw3NDE5LDI4MTgsMTc3MywxMzI3LDI4NTksICAjIDM5MTAKMzg5NCwyODE5LDc0MjAsMTMwNiw0MzQyLDIwMDMsMTcwMCwzNzUyLDM1MjEsMjM1OSwyNjUwLCA3ODcsMjAyMiwgNTA2LCA4MjQsMzYzNiwgICMgMzkyNgogNTM0LCAzMjMsNDM0MywxMDQ0LDMzMjIsMjAyMywxOTAwLCA5NDYsMzQyNCw3NDIxLDE3NzgsMTUwMCwxNjc4LDc0MjIsMTg4MSw0MzQ0LCAgIyAzOTQyCiAxNjUsIDI0Myw0MzQ1LDM2MzcsMjUyMSwgMTIzLCA2ODMsNDA5NiwgNzY0LDQzNDYsICAzNiwzODk1LDE3OTIsIDU4OSwyOTAyLCA4MTYsICAjIDM5NTgKIDYyNiwxNjY3LDMwMjcsMjIzMywxNjM5LDE1NTUsMTYyMiwzNzUzLDM4OTYsNzQyMywzODk3LDI4NjAsMTM3MCwxMjI4LDE5MzIsIDg5MSwgICMgMzk3NAoyMDgzLDI5MDMsIDMwNCw0MDk3LDc0MjQsIDI5MiwyOTc5LDI3MTEsMzUyMiwgNjkxLDIxMDAsNDA5OCwxMTE1LDQzNDcsIDExOCwgNjYyLCAgIyAzOTkwCjc0MjUsIDYxMSwxMTU2LCA4NTQsMjM4MSwxMzE2LDI4NjEsICAgMiwgMzg2LCA1MTUsMjkwNCw3NDI2LDc0MjcsMzI1MywgODY4LDIyMzQsICAjIDQwMDYKMTQ4NiwgODU1LDI2NTEsIDc4NSwyMjEyLDMwMjgsNzQyOCwxMDQwLDMxODUsMzUyMyw3NDI5LDMxMjEsIDQ0OCw3NDMwLDE1MjUsNzQzMSwgICMgNDAyMgoyMTY0LDQzNDgsNzQzMiwzNzU0LDc0MzMsNDA5OSwyODIwLDM1MjQsMzEyMiwgNTAzLCA4MTgsMzg5OCwzMTIzLDE1NjgsIDgxNCwgNjc2LCAgIyA0MDM4CjE0NDQsIDMwNiwxNzQ5LDc0MzQsMzc1NSwxNDE2LDEwMzAsIDE5NywxNDI4LCA4MDUsMjgyMSwxNTAxLDQzNDksNzQzNSw3NDM2LDc0MzcsICAjIDQwNTQKMTk5Myw3NDM4LDQzNTAsNzQzOSw3NDQwLDIxOTUsICAxMywyNzc5LDM2MzgsMjk4MCwzMTI0LDEyMjksMTkxNiw3NDQxLDM3NTYsMjEzMSwgICMgNDA3MAo3NDQyLDQxMDAsNDM1MSwyMzk5LDM1MjUsNzQ0MywyMjEzLDE1MTEsMTcyNywxMTIwLDc0NDQsNzQ0NSwgNjQ2LDM3NTcsMjQ0MywgMzA3LCAgIyA0MDg2Cjc0NDYsNzQ0NywxNTk1LDMxODYsNzQ0OCw3NDQ5LDc0NTAsMzYzOSwxMTEzLDEzNTYsMzg5OSwxNDY1LDI1MjIsMjUyMyw3NDUxLCA1MTksICAjIDQxMDIKNzQ1MiwgMTI4LDIxMzIsICA5MiwyMjg0LDE5NzksNzQ1MywzOTAwLDE1MTIsIDM0MiwzMTI1LDIxOTYsNzQ1NCwyNzgwLDIyMTQsMTk4MCwgICMgNDExOAozMzIzLDc0NTUsIDI5MCwxNjU2LDEzMTcsIDc4OSwgODI3LDIzNjAsNzQ1NiwzNzU4LDQzNTIsIDU2MiwgNTgxLDM5MDEsNzQ1NywgNDAxLCAgIyA0MTM0CjQzNTMsMjI0OCwgIDk0LDQzNTQsMTM5OSwyNzgxLDc0NTgsMTQ2MywyMDI0LDQzNTUsMzE4NywxOTQzLDc0NTksIDgyOCwxMTA1LDQxMDEsICAjIDQxNTAKMTI2MiwxMzk0LDc0NjAsNDEwMiwgNjA1LDQzNTYsNzQ2MSwxNzgzLDI4NjIsNzQ2MiwyODIyLCA4MTksMjEwMSwgNTc4LDIxOTcsMjkzNywgICMgNDE2Ngo3NDYzLDE1MDIsIDQzNiwzMjU0LDQxMDMsMzI1NSwyODIzLDM5MDIsMjkwNSwzNDI1LDM0MjYsNzQ2NCwyNzEyLDIzMTUsNzQ2NSw3NDY2LCAgIyA0MTgyCjIzMzIsMjA2NywgIDIzLDQzNTcsIDE5MywgODI2LDM3NTksMjEwMiwgNjk5LDE2MzAsNDEwNCwzMDc1LCAzOTAsMTc5MywxMDY0LDM1MjYsICAjIDQxOTgKNzQ2NywxNTc5LDMwNzYsMzA3NywxNDAwLDc0NjgsNDEwNSwxODM4LDE2NDAsMjg2Myw3NDY5LDQzNTgsNDM1OSwgMTM3LDQxMDYsIDU5OCwgICMgNDIxNAozMDc4LDE5NjYsIDc4MCwgMTA0LCA5NzQsMjkzOCw3NDcwLCAyNzgsIDg5OSwgMjUzLCA0MDIsIDU3MiwgNTA0LCA0OTMsMTMzOSw3NDcxLCAgIyA0MjMwCjM5MDMsMTI3NSw0MzYwLDI1NzQsMjU1MCw3NDcyLDM2NDAsMzAyOSwzMDc5LDIyNDksIDU2NSwxMzM0LDI3MTMsIDg2MywgIDQxLDc0NzMsICAjIDQyNDYKNzQ3NCw0MzYxLDc0NzUsMTY1NywyMzMzLCAgMTksIDQ2MywyNzUwLDQxMDcsIDYwNiw3NDc2LDI5ODEsMzI1NiwxMDg3LDIwODQsMTMyMywgICMgNDI2MgoyNjUyLDI5ODIsNzQ3NywxNjMxLDE2MjMsMTc1MCw0MTA4LDI2ODIsNzQ3OCwyODY0LCA3OTEsMjcxNCwyNjUzLDIzMzQsIDIzMiwyNDE2LCAgIyA0Mjc4Cjc0NzksMjk4MywxNDk4LDc0ODAsMjY1NCwyNjIwLCA3NTUsMTM2NiwzNjQxLDMyNTcsMzEyNiwyMDI1LDE2MDksIDExOSwxOTE3LDM0MjcsICAjIDQyOTQKIDg2MiwxMDI2LDQxMDksNzQ4MSwzOTA0LDM3NjAsNDM2MiwzOTA1LDQzNjMsMjI2MCwxOTUxLDI0NzAsNzQ4MiwxMTI1LCA4MTcsNDExMCwgICMgNDMxMAo0MTExLDM5MDYsMTUxMywxNzY2LDIwNDAsMTQ4Nyw0MTEyLDMwMzAsMzI1OCwyODI0LDM3NjEsMzEyNyw3NDgzLDc0ODQsMTUwNyw3NDg1LCAgIyA0MzI2CjI2ODMsIDczMywgIDQwLDE2MzIsMTEwNiwyODY1LCAzNDUsNDExMywgODQxLDI1MjQsIDIzMCw0MzY0LDI5ODQsMTg0NiwzMjU5LDM0MjgsICAjIDQzNDIKNzQ4NiwxMjYzLCA5ODYsMzQyOSw3NDg3LCA3MzUsIDg3OSwgMjU0LDExMzcsIDg1NywgNjIyLDEzMDAsMTE4MCwxMzg4LDE1NjIsMzkwNywgICMgNDM1OAozOTA4LDI5MzksIDk2NywyNzUxLDI2NTUsMTM0OSwgNTkyLDIxMzMsMTY5MiwzMzI0LDI5ODUsMTk5NCw0MTE0LDE2NzksMzkwOSwxOTAxLCAgIyA0Mzc0CjIxODUsNzQ4OCwgNzM5LDM2NDIsMjcxNSwxMjk2LDEyOTAsNzQ4OSw0MTE1LDIxOTgsMjE5OSwxOTIxLDE1NjMsMjU5NSwyNTUxLDE4NzAsICAjIDQzOTAKMjc1MiwyOTg2LDc0OTAsIDQzNSw3NDkxLCAzNDMsMTEwOCwgNTk2LCAgMTcsMTc1MSw0MzY1LDIyMzUsMzQzMCwzNjQzLDc0OTIsNDM2NiwgICMgNDQwNgogMjk0LDM1MjcsMjk0MCwxNjkzLCA0NzcsIDk3OSwgMjgxLDIwNDEsMzUyOCwgNjQzLDIwNDIsMzY0NCwyNjIxLDI3ODIsMjI2MSwxMDMxLCAgIyA0NDIyCjIzMzUsMjEzNCwyMjk4LDM1MjksNDM2NywgMzY3LDEyNDksMjU1Miw3NDkzLDM1MzAsNzQ5NCw0MzY4LDEyODMsMzMyNSwyMDA0LCAyNDAsICAjIDQ0MzgKMTc2MiwzMzI2LDQzNjksNDM3MCwgODM2LDEwNjksMzEyOCwgNDc0LDc0OTUsMjE0OCwyNTI1LCAyNjgsMzUzMSw3NDk2LDMxODgsMTUyMSwgICMgNDQ1NAoxMjg0LDc0OTcsMTY1OCwxNTQ2LDQxMTYsNzQ5OCwzNTMyLDM1MzMsNzQ5OSw0MTE3LDMzMjcsMjY4NCwxNjg1LDQxMTgsIDk2MSwxNjczLCAgIyA0NDcwCjI2MjIsIDE5MCwyMDA1LDIyMDAsMzc2Miw0MzcxLDQzNzIsNzUwMCwgNTcwLDI0OTcsMzY0NSwxNDkwLDc1MDEsNDM3MywyNjIzLDMyNjAsICAjIDQ0ODYKMTk1Niw0Mzc0LCA1ODQsMTUxNCwgMzk2LDEwNDUsMTk0NCw3NTAyLDQzNzUsMTk2NywyNDQ0LDc1MDMsNzUwNCw0Mzc2LDM5MTAsIDYxOSwgICMgNDUwMgo3NTA1LDMxMjksMzI2MSwgMjE1LDIwMDYsMjc4MywyNTUzLDMxODksNDM3NywzMTkwLDQzNzgsIDc2Myw0MTE5LDM3NjMsNDM3OSw3NTA2LCAgIyA0NTE4Cjc1MDcsMTk1NywxNzY3LDI5NDEsMzMyOCwzNjQ2LDExNzQsIDQ1MiwxNDc3LDQzODAsMzMyOSwzMTMwLDc1MDgsMjgyNSwxMjUzLDIzODIsICAjIDQ1MzQKMjE4NiwxMDkxLDIyODUsNDEyMCwgNDkyLDc1MDksIDYzOCwxMTY5LDE4MjQsMjEzNSwxNzUyLDM5MTEsIDY0OCwgOTI2LDEwMjEsMTMyNCwgICMgNDU1MAo0MzgxLCA1MjAsNDM4MiwgOTk3LCA4NDcsMTAwNywgODkyLDQzODMsMzc2NCwyMjYyLDE4NzEsMzY0Nyw3NTEwLDI0MDAsMTc4NCw0Mzg0LCAgIyA0NTY2CjE5NTIsMjk0MiwzMDgwLDMxOTEsMTcyOCw0MTIxLDIwNDMsMzY0OCw0Mzg1LDIwMDcsMTcwMSwzMTMxLDE1NTEsICAzMCwyMjYzLDQxMjIsICAjIDQ1ODIKNzUxMSwyMDI2LDQzODYsMzUzNCw3NTEyLCA1MDEsNzUxMyw0MTIzLCA1OTQsMzQzMSwyMTY1LDE4MjEsMzUzNSwzNDMyLDM1MzYsMzE5MiwgICMgNDU5OAogODI5LDI4MjYsNDEyNCw3NTE0LDE2ODAsMzEzMiwxMjI1LDQxMjUsNzUxNSwzMjYyLDQzODcsNDEyNiwzMTMzLDIzMzYsNzUxNiw0Mzg4LCAgIyA0NjE0CjQxMjcsNzUxNywzOTEyLDM5MTMsNzUxOCwxODQ3LDIzODMsMjU5NiwzMzMwLDc1MTksNDM4OSwgMzc0LDM5MTQsIDY1Miw0MTI4LDQxMjksICAjIDQ2MzAKIDM3NSwxMTQwLCA3OTgsNzUyMCw3NTIxLDc1MjIsMjM2MSw0MzkwLDIyNjQsIDU0NiwxNjU5LCAxMzgsMzAzMSwyNDQ1LDQzOTEsNzUyMywgICMgNDY0NgoyMjUwLCA2MTIsMTg0OCwgOTEwLCA3OTYsMzc2NSwxNzQwLDEzNzEsIDgyNSwzNzY2LDM3NjcsNzUyNCwyOTA2LDI1NTQsNzUyNSwgNjkyLCAgIyA0NjYyCiA0NDQsMzAzMiwyNjI0LCA4MDEsNDM5Miw0MTMwLDc1MjYsMTQ5MSwgMjQ0LDEwNTMsMzAzMyw0MTMxLDQxMzIsIDM0MCw3NTI3LDM5MTUsICAjIDQ2NzgKMTA0MSwyOTg3LCAyOTMsMTE2OCwgIDg3LDEzNTcsNzUyOCwxNTM5LCA5NTksNzUyOSwyMjM2LCA3MjEsIDY5NCw0MTMzLDM3NjgsIDIxOSwgICMgNDY5NAoxNDc4LCA2NDQsMTQxNywzMzMxLDI2NTYsMTQxMywxNDAxLDEzMzUsMTM4OSwzOTE2LDc1MzAsNzUzMSwyOTg4LDIzNjIsMzEzNCwxODI1LCAgIyA0NzEwCiA3MzAsMTUxNSwgMTg0LDI4MjcsICA2Niw0MzkzLDc1MzIsMTY2MCwyOTQzLCAyNDYsMzMzMiwgMzc4LDE0NTcsIDIyNiwzNDMzLCA5NzUsICAjIDQ3MjYKMzkxNywyOTQ0LDEyNjQsMzUzNywgNjc0LCA2OTYsNzUzMywgMTYzLDc1MzQsMTE0MSwyNDE3LDIxNjYsIDcxMywzNTM4LDMzMzMsNDM5NCwgICMgNDc0MgozOTE4LDc1MzUsNzUzNiwxMTg2LCAgMTUsNzUzNywxMDc5LDEwNzAsNzUzOCwxNTIyLDMxOTMsMzUzOSwgMjc2LDEwNTAsMjcxNiwgNzU4LCAgIyA0NzU4CjExMjYsIDY1MywyOTQ1LDMyNjMsNzUzOSwyMzM3LCA4ODksMzU0MCwzOTE5LDMwODEsMjk4OSwgOTAzLDEyNTAsNDM5NSwzOTIwLDM0MzQsICAjIDQ3NzQKMzU0MSwxMzQyLDE2ODEsMTcxOCwgNzY2LDMyNjQsIDI4NiwgIDg5LDI5NDYsMzY0OSw3NTQwLDE3MTMsNzU0MSwyNTk3LDMzMzQsMjk5MCwgICMgNDc5MAo3NTQyLDI5NDcsMjIxNSwzMTk0LDI4NjYsNzU0Myw0Mzk2LDI0OTgsMjUyNiwgMTgxLCAzODcsMTA3NSwzOTIxLCA3MzEsMjE4NywzMzM1LCAgIyA0ODA2Cjc1NDQsMzI2NSwgMzEwLCAzMTMsMzQzNSwyMjk5LCA3NzAsNDEzNCwgIDU0LDMwMzQsIDE4OSw0Mzk3LDMwODIsMzc2OSwzOTIyLDc1NDUsICAjIDQ4MjIKMTIzMCwxNjE3LDE4NDksIDM1NSwzNTQyLDQxMzUsNDM5OCwzMzM2LCAxMTEsNDEzNiwzNjUwLDEzNTAsMzEzNSwzNDM2LDMwMzUsNDEzNywgICMgNDgzOAoyMTQ5LDMyNjYsMzU0Myw3NTQ2LDI3ODQsMzkyMywzOTI0LDI5OTEsIDcyMiwyMDA4LDc1NDcsMTA3MSwgMjQ3LDEyMDcsMjMzOCwyNDcxLCAgIyA0ODU0CjEzNzgsNDM5OSwyMDA5LCA4NjQsMTQzNywxMjE0LDQ0MDAsIDM3MywzNzcwLDExNDIsMjIxNiwgNjY3LDQ0MDEsIDQ0MiwyNzUzLDI1NTUsICAjIDQ4NzAKMzc3MSwzOTI1LDE5NjgsNDEzOCwzMjY3LDE4MzksIDgzNywgMTcwLDExMDcsIDkzNCwxMzM2LDE4ODIsNzU0OCw3NTQ5LDIxMTgsNDEzOSwgICMgNDg4NgoyODI4LCA3NDMsMTU2OSw3NTUwLDQ0MDIsNDE0MCwgNTgyLDIzODQsMTQxOCwzNDM3LDc1NTEsMTgwMiw3NTUyLCAzNTcsMTM5NSwxNzI5LCAgIyA0OTAyCjM2NTEsMzI2OCwyNDE4LDE1NjQsMjIzNyw3NTUzLDMwODMsMzc3MiwxNjMzLDQ0MDMsMTExNCwyMDg1LDQxNDEsMTUzMiw3NTU0LCA0ODIsICAjIDQ5MTgKMjQ0Niw0NDA0LDc1NTUsNzU1NiwxNDkyLCA4MzMsMTQ2Niw3NTU3LDI3MTcsMzU0NCwxNjQxLDI4MjksNzU1OCwxNTI2LDEyNzIsMzY1MiwgICMgNDkzNAo0MTQyLDE2ODYsMTc5NCwgNDE2LDI1NTYsMTkwMiwxOTUzLDE4MDMsNzU1OSwzNzczLDI3ODUsMzc3NCwxMTU5LDIzMTYsNzU2MCwyODY3LCAgIyA0OTUwCjQ0MDUsMTYxMCwxNTg0LDMwMzYsMjQxOSwyNzU0LCA0NDMsMzI2OSwxMTYzLDMxMzYsNzU2MSw3NTYyLDM5MjYsNzU2Myw0MTQzLDI0OTksICAjIDQ5NjYKMzAzNyw0NDA2LDM5MjcsMzEzNywyMTAzLDE2NDcsMzU0NSwyMDEwLDE4NzIsNDE0NCw3NTY0LDQxNDUsIDQzMSwzNDM4LDc1NjUsIDI1MCwgICMgNDk4MgogIDk3LCAgODEsNDE0Niw3NTY2LDE2NDgsMTg1MCwxNTU4LCAxNjAsIDg0OCw3NTY3LCA4NjYsIDc0MCwxNjk0LDc1NjgsMjIwMSwyODMwLCAgIyA0OTk4CjMxOTUsNDE0Nyw0NDA3LDM2NTMsMTY4NywgOTUwLDI0NzIsIDQyNiwgNDY5LDMxOTYsMzY1NCwzNjU1LDM5MjgsNzU2OSw3NTcwLDExODgsICAjIDUwMTQKIDQyNCwxOTk1LCA4NjEsMzU0Niw0MTQ4LDM3NzUsMjIwMiwyNjg1LCAxNjgsMTIzNSwzNTQ3LDQxNDksNzU3MSwyMDg2LDE2NzQsNDQwOCwgICMgNTAzMAozMzM3LDMyNzAsIDIyMCwyNTU3LDEwMDksNzU3MiwzNzc2LCA2NzAsMjk5MiwgMzMyLDEyMDgsIDcxNyw3NTczLDc1NzQsMzU0OCwyNDQ3LCAgIyA1MDQ2CjM5MjksMzMzOCw3NTc1LCA1MTMsNzU3NiwxMjA5LDI4NjgsMzMzOSwzMTM4LDQ0MDksMTA4MCw3NTc3LDc1NzgsNzU3OSw3NTgwLDI1MjcsICAjIDUwNjIKMzY1NiwzNTQ5LCA4MTUsMTU4NywzOTMwLDM5MzEsNzU4MSwzNTUwLDM0MzksMzc3NywxMjU0LDQ0MTAsMTMyOCwzMDM4LDEzOTAsMzkzMiwgICMgNTA3OAoxNzQxLDM5MzMsMzc3OCwzOTM0LDc1ODIsIDIzNiwzNzc5LDI0NDgsMzI3MSw3NTgzLDc1ODQsMzY1NywzNzgwLDEyNzMsMzc4MSw0NDExLCAgIyA1MDk0Cjc1ODUsIDMwOCw3NTg2LDQ0MTIsIDI0NSw0NDEzLDE4NTEsMjQ3MywxMzA3LDI1NzUsIDQzMCwgNzE1LDIxMzYsMjQ0OSw3NTg3LCAyNzAsICAjIDUxMTAKIDE5OSwyODY5LDM5MzUsNzU4OCwzNTUxLDI3MTgsMTc1MywgNzYxLDE3NTQsIDcyNSwxNjYxLDE4NDAsNDQxNCwzNDQwLDM2NTgsNzU4OSwgICMgNTEyNgo3NTkwLCA1ODcsICAxNCwzMjcyLCAyMjcsMjU5OCwgMzI2LCA0ODAsMjI2NSwgOTQzLDI3NTUsMzU1MiwgMjkxLCA2NTAsMTg4Myw3NTkxLCAgIyA1MTQyCjE3MDIsMTIyNiwgMTAyLDE1NDcsICA2MiwzNDQxLCA5MDQsNDQxNSwzNDQyLDExNjQsNDE1MCw3NTkyLDc1OTMsMTIyNCwxNTQ4LDI3NTYsICAjIDUxNTgKIDM5MSwgNDk4LDE0OTMsNzU5NCwxMzg2LDE0MTksNzU5NSwyMDU1LDExNzcsNDQxNiwgODEzLCA4ODAsMTA4MSwyMzYzLCA1NjYsMTE0NSwgICMgNTE3NAo0NDE3LDIyODYsMTAwMSwxMDM1LDI1NTgsMjU5OSwyMjM4LCAzOTQsMTI4Niw3NTk2LDc1OTcsMjA2OCw3NTk4LCAgODYsMTQ5NCwxNzMwLCAgIyA1MTkwCjM5MzYsIDQ5MSwxNTg4LCA3NDUsIDg5NywyOTQ4LCA4NDMsMzM0MCwzOTM3LDI3NTcsMjg3MCwzMjczLDE3NjgsIDk5OCwyMjE3LDIwNjksICAjIDUyMDYKIDM5NywxODI2LDExOTUsMTk2OSwzNjU5LDI5OTMsMzM0MSwgMjg0LDc1OTksMzc4MiwyNTAwLDIxMzcsMjExOSwxOTAzLDc2MDAsMzkzOCwgICMgNTIyMgoyMTUwLDM5MzksNDE1MSwxMDM2LDM0NDMsMTkwNCwgMTE0LDI1NTksNDE1MiwgMjA5LDE1MjcsNzYwMSw3NjAyLDI5NDksMjgzMSwyNjI1LCAgIyA1MjM4CjIzODUsMjcxOSwzMTM5LCA4MTIsMjU2MCw3NjAzLDMyNzQsNzYwNCwxNTU5LCA3MzcsMTg4NCwzNjYwLDEyMTAsIDg4NSwgIDI4LDI2ODYsICAjIDUyNTQKMzU1MywzNzgzLDc2MDUsNDE1MywxMDA0LDE3NzksNDQxOCw3NjA2LCAzNDYsMTk4MSwyMjE4LDI2ODcsNDQxOSwzNzg0LDE3NDIsIDc5NywgICMgNTI3MAoxNjQyLDM5NDAsMTkzMywxMDcyLDEzODQsMjE1MSwgODk2LDM5NDEsMzI3NSwzNjYxLDMxOTcsMjg3MSwzNTU0LDc2MDcsMjU2MSwxOTU4LCAgIyA1Mjg2CjQ0MjAsMjQ1MCwxNzg1LDc2MDgsNzYwOSw3NjEwLDM5NDIsNDE1NCwxMDA1LDEzMDgsMzY2Miw0MTU1LDI3MjAsNDQyMSw0NDIyLDE1MjgsICAjIDUzMDIKMjYwMCwgMTYxLDExNzgsNDE1NiwxOTgyLCA5ODcsNDQyMywxMTAxLDQxNTcsIDYzMSwzOTQzLDExNTcsMzE5OCwyNDIwLDEzNDMsMTI0MSwgICMgNTMxOAoxMDE2LDIyMzksMjU2MiwgMzcyLCA4NzcsMjMzOSwyNTAxLDExNjAsIDU1NSwxOTM0LCA5MTEsMzk0NCw3NjExLCA0NjYsMTE3MCwgMTY5LCAgIyA1MzM0CjEwNTEsMjkwNywyNjg4LDM2NjMsMjQ3NCwyOTk0LDExODIsMjAxMSwyNTYzLDEyNTEsMjYyNiw3NjEyLCA5OTIsMjM0MCwzNDQ0LDE1NDAsICAjIDUzNTAKMjcyMSwxMjAxLDIwNzAsMjQwMSwxOTk2LDI0NzUsNzYxMyw0NDI0LCA1MjgsMTkyMiwyMTg4LDE1MDMsMTg3MywxNTcwLDIzNjQsMzM0MiwgICMgNTM2NgozMjc2LDc2MTQsIDU1NywxMDczLDc2MTUsMTgyNywzNDQ1LDIwODcsMjI2NiwzMTQwLDMwMzksMzA4NCwgNzY3LDMwODUsMjc4Niw0NDI1LCAgIyA1MzgyCjEwMDYsNDE1OCw0NDI2LDIzNDEsMTI2NywyMTc2LDM2NjQsMzE5OSwgNzc4LDM5NDUsMzIwMCwyNzIyLDE1OTcsMjY1Nyw3NjE2LDQ0MjcsICAjIDUzOTgKNzYxNywzNDQ2LDc2MTgsNzYxOSw3NjIwLDMyNzcsMjY4OSwxNDMzLDMyNzgsIDEzMSwgIDk1LDE1MDQsMzk0NiwgNzIzLDQxNTksMzE0MSwgICMgNTQxNAoxODQxLDM1NTUsMjc1OCwyMTg5LDM5NDcsMjAyNywyMTA0LDM2NjUsNzYyMSwyOTk1LDM5NDgsMTIxOCw3NjIyLDMzNDMsMzIwMSwzOTQ5LCAgIyA1NDMwCjQxNjAsMjU3NiwgMjQ4LDE2MzQsMzc4NSwgOTEyLDc2MjMsMjgzMiwzNjY2LDMwNDAsMzc4NiwgNjU0LCAgNTMsNzYyNCwyOTk2LDc2MjUsICAjIDU0NDYKMTY4OCw0NDI4LCA3NzcsMzQ0NywxMDMyLDM5NTAsMTQyNSw3NjI2LCAxOTEsIDgyMCwyMTIwLDI4MzMsIDk3MSw0NDI5LCA5MzEsMzIwMiwgICMgNTQ2MgogMTM1LCA2NjQsIDc4MywzNzg3LDE5OTcsIDc3MiwyOTA4LDE5MzUsMzk1MSwzNzg4LDQ0MzAsMjkwOSwzMjAzLCAyODIsMjcyMywgNjQwLCAgIyA1NDc4CjEzNzIsMzQ0OCwxMTI3LCA5MjIsIDMyNSwzMzQ0LDc2MjcsNzYyOCwgNzExLDIwNDQsNzYyOSw3NjMwLDM5NTIsMjIxOSwyNzg3LDE5MzYsICAjIDU0OTQKMzk1MywzMzQ1LDIyMjAsMjI1MSwzNzg5LDIzMDAsNzYzMSw0NDMxLDM3OTAsMTI1OCwzMjc5LDM5NTQsMzIwNCwyMTM4LDI5NTAsMzk1NSwgICMgNTUxMAozOTU2LDc2MzIsMjIyMSwgMjU4LDMyMDUsNDQzMiwgMTAxLDEyMjcsNzYzMywzMjgwLDE3NTUsNzYzNCwxMzkxLDMyODEsNzYzNSwyOTEwLCAgIyA1NTI2CjIwNTYsIDg5Myw3NjM2LDc2MzcsNzYzOCwxNDAyLDQxNjEsMjM0Miw3NjM5LDc2NDAsMzIwNiwzNTU2LDc2NDEsNzY0MiwgODc4LDEzMjUsICAjIDU1NDIKMTc4MCwyNzg4LDQ0MzMsIDI1OSwxMzg1LDI1NzcsIDc0NCwxMTgzLDIyNjcsNDQzNCw3NjQzLDM5NTcsMjUwMiw3NjQ0LCA2ODQsMTAyNCwgICMgNTU1OAo0MTYyLDc2NDUsIDQ3MiwzNTU3LDM0NDksMTE2NSwzMjgyLDM5NTgsMzk1OSwgMzIyLDIxNTIsIDg4MSwgNDU1LDE2OTUsMTE1MiwxMzQwLCAgIyA1NTc0CiA2NjAsIDU1NCwyMTUzLDQ0MzUsMTA1OCw0NDM2LDQxNjMsIDgzMCwxMDY1LDMzNDYsMzk2MCw0NDM3LDE5MjMsNzY0NiwxNzAzLDE5MTgsICAjIDU1OTAKNzY0NywgOTMyLDIyNjgsIDEyMiw3NjQ4LDQ0MzgsIDk0NywgNjc3LDc2NDksMzc5MSwyNjI3LCAyOTcsMTkwNSwxOTI0LDIyNjksNDQzOSwgICMgNTYwNgoyMzE3LDMyODMsNzY1MCw3NjUxLDQxNjQsNzY1Miw0MTY1LCAgODQsNDE2NiwgMTEyLCA5ODksNzY1MywgNTQ3LDEwNTksMzk2MSwgNzAxLCAgIyA1NjIyCjM1NTgsMTAxOSw3NjU0LDQxNjcsNzY1NSwzNDUwLCA5NDIsIDYzOSwgNDU3LDIzMDEsMjQ1MSwgOTkzLDI5NTEsIDQwNywgODUxLCA0OTQsICAjIDU2MzgKNDQ0MCwzMzQ3LCA5MjcsNzY1NiwxMjM3LDc2NTcsMjQyMSwzMzQ4LCA1NzMsNDE2OCwgNjgwLCA5MjEsMjkxMSwxMjc5LDE4NzQsIDI4NSwgICMgNTY1NAogNzkwLDE0NDgsMTk4MywgNzE5LDIxNjcsNzY1OCw3NjU5LDQ0NDEsMzk2MiwzOTYzLDE2NDksNzY2MCwxNTQxLCA1NjMsNzY2MSwxMDc3LCAgIyA1NjcwCjc2NjIsMzM0OSwzMDQxLDM0NTEsIDUxMSwyOTk3LDM5NjQsMzk2NSwzNjY3LDM5NjYsMTI2OCwyNTY0LDMzNTAsMzIwNyw0NDQyLDQ0NDMsICAjIDU2ODYKNzY2MywgNTM1LDEwNDgsMTI3NiwxMTg5LDI5MTIsMjAyOCwzMTQyLDE0MzgsMTM3MywyODM0LDI5NTIsMTEzNCwyMDEyLDc2NjQsNDE2OSwgICMgNTcwMgoxMjM4LDI1NzgsMzA4NiwxMjU5LDc2NjUsIDcwMCw3NjY2LDI5NTMsMzE0MywzNjY4LDQxNzAsNzY2Nyw0MTcxLDExNDYsMTg3NSwxOTA2LCAgIyA1NzE4CjQ0NDQsMjYwMSwzOTY3LCA3ODEsMjQyMiwgMTMyLDE1ODksIDIwMywgMTQ3LCAyNzMsMjc4OSwyNDAyLCA4OTgsMTc4NiwyMTU0LDM5NjgsICAjIDU3MzQKMzk2OSw3NjY4LDM3OTIsMjc5MCw3NjY5LDc2NzAsNDQ0NSw0NDQ2LDc2NzEsMzIwOCw3NjcyLDE2MzUsMzc5MywgOTY1LDc2NzMsMTgwNCwgICMgNTc1MAoyNjkwLDE1MTYsMzU1OSwxMTIxLDEwODIsMTMyOSwzMjg0LDM5NzAsMTQ0OSwzNzk0LCAgNjUsMTEyOCwyODM1LDI5MTMsMjc1OSwxNTkwLCAgIyA1NzY2CjM3OTUsNzY3NCw3Njc1LCAgMTIsMjY1OCwgIDQ1LCA5NzYsMjU3OSwzMTQ0LDQ0NDcsIDUxNywyNTI4LDEwMTMsMTAzNywzMjA5LDc2NzYsICAjIDU3ODIKMzc5NiwyODM2LDc2NzcsMzc5Nyw3Njc4LDM0NTIsNzY3OSwyNjAyLCA2MTQsMTk5OCwyMzE4LDM3OTgsMzA4NywyNzI0LDI2MjgsNzY4MCwgICMgNTc5OAoyNTgwLDQxNzIsIDU5OSwxMjY5LDc2ODEsMTgxMCwzNjY5LDc2ODIsMjY5MSwzMDg4LCA3NTksMTA2MCwgNDg5LDE4MDUsMzM1MSwzMjg1LCAgIyA1ODE0CjEzNTgsNzY4Myw3Njg0LDIzODYsMTM4NywxMjE1LDI2MjksMjI1MiwgNDkwLDc2ODUsNzY4Niw0MTczLDE3NTksMjM4NywyMzQzLDc2ODcsICAjIDU4MzAKNDQ0OCwzNzk5LDE5MDcsMzk3MSwyNjMwLDE4MDYsMzIxMCw0NDQ5LDM0NTMsMzI4NiwyNzYwLDIzNDQsIDg3NCw3Njg4LDc2ODksMzQ1NCwgICMgNTg0NgozNjcwLDE4NTgsICA5MSwyOTE0LDM2NzEsMzA0MiwzODAwLDQ0NTAsNzY5MCwzMTQ1LDM5NzIsMjY1OSw3NjkxLDM0NTUsMTIwMiwxNDAzLCAgIyA1ODYyCjM4MDEsMjk1NCwyNTI5LDE1MTcsMjUwMyw0NDUxLDM0NTYsMjUwNCw3NjkyLDQ0NTIsNzY5MywyNjkyLDE4ODUsMTQ5NSwxNzMxLDM5NzMsICAjIDU4NzgKMjM2NSw0NDUzLDc2OTQsMjAyOSw3Njk1LDc2OTYsMzk3NCwyNjkzLDEyMTYsIDIzNywyNTgxLDQxNzQsMjMxOSwzOTc1LDM4MDIsNDQ1NCwgICMgNTg5NAo0NDU1LDI2OTQsMzU2MCwzNDU3LCA0NDUsNDQ1Niw3Njk3LDc2OTgsNzY5OSw3NzAwLDI3NjEsICA2MSwzOTc2LDM2NzIsMTgyMiwzOTc3LCAgIyA1OTEwCjc3MDEsIDY4NywyMDQ1LCA5MzUsIDkyNSwgNDA1LDI2NjAsIDcwMywxMDk2LDE4NTksMjcyNSw0NDU3LDM5NzgsMTg3NiwxMzY3LDI2OTUsICAjIDU5MjYKMzM1MiwgOTE4LDIxMDUsMTc4MSwyNDc2LCAzMzQsMzI4NywxNjExLDEwOTMsNDQ1OCwgNTY0LDMxNDYsMzQ1OCwzNjczLDMzNTMsIDk0NSwgICMgNTk0MgoyNjMxLDIwNTcsNDQ1OSw3NzAyLDE5MjUsIDg3Miw0MTc1LDc3MDMsMzQ1OSwyNjk2LDMwODksIDM0OSw0MTc2LDM2NzQsMzk3OSw0NDYwLCAgIyA1OTU4CjM4MDMsNDE3NywzNjc1LDIxNTUsMzk4MCw0NDYxLDQ0NjIsNDE3OCw0NDYzLDI0MDMsMjA0NiwgNzgyLDM5ODEsIDQwMCwgMjUxLDQxNzksICAjIDU5NzQKMTYyNCw3NzA0LDc3MDUsIDI3NywzNjc2LCAyOTksMTI2NSwgNDc2LDExOTEsMzgwNCwyMTIxLDQxODAsNDE4MSwxMTA5LCAyMDUsNzcwNiwgICMgNTk5MAoyNTgyLDEwMDAsMjE1NiwzNTYxLDE4NjAsNzcwNyw3NzA4LDc3MDksNDQ2NCw3NzEwLDQ0NjUsMjU2NSwgMTA3LDI0NzcsMjE1NywzOTgyLCAgIyA2MDA2CjM0NjAsMzE0Nyw3NzExLDE1MzMsIDU0MSwxMzAxLCAxNTgsIDc1Myw0MTgyLDI4NzIsMzU2Miw3NzEyLDE2OTYsIDM3MCwxMDg4LDQxODMsICAjIDYwMjIKNDQ2NiwzNTYzLCA1NzksIDMyNywgNDQwLCAxNjIsMjI0MCwgMjY5LDE5MzcsMTM3NCwzNDYxLCA5NjgsMzA0MywgIDU2LDEzOTYsMzA5MCwgICMgNjAzOAoyMTA2LDMyODgsMzM1NCw3NzEzLDE5MjYsMjE1OCw0NDY3LDI5OTgsNzcxNCwzNTY0LDc3MTUsNzcxNiwzNjc3LDQ0NjgsMjQ3OCw3NzE3LCAgIyA2MDU0CjI3OTEsNzcxOCwxNjUwLDQ0NjksNzcxOSwyNjAzLDc3MjAsNzcyMSwzOTgzLDI2NjEsMzM1NSwxMTQ5LDMzNTYsMzk4NCwzODA1LDM5ODUsICAjIDYwNzAKNzcyMiwxMDc2LCAgNDksNzcyMywgOTUxLDMyMTEsMzI4OSwzMjkwLCA0NTAsMjgzNywgOTIwLDc3MjQsMTgxMSwyNzkyLDIzNjYsNDE4NCwgICMgNjA4NgoxOTA4LDExMzgsMjM2NywzODA2LDM0NjIsNzcyNSwzMjEyLDQ0NzAsMTkwOSwxMTQ3LDE1MTgsMjQyMyw0NDcxLDM4MDcsNzcyNiw0NDcyLCAgIyA2MTAyCjIzODgsMjYwNCwgMjYwLDE3OTUsMzIxMyw3NzI3LDc3MjgsMzgwOCwzMjkxLCA3MDgsNzcyOSwzNTY1LDE3MDQsNzczMCwzNTY2LDEzNTEsICAjIDYxMTgKMTYxOCwzMzU3LDI5OTksMTg4NiwgOTQ0LDQxODUsMzM1OCw0MTg2LDMwNDQsMzM1OSw0MTg3LDc3MzEsMzY3OCwgNDIyLCA0MTMsMTcxNCwgICMgNjEzNAozMjkyLCA1MDAsMjA1OCwyMzQ1LDQxODgsMjQ3OSw3NzMyLDEzNDQsMTkxMCwgOTU0LDc3MzMsMTY2OCw3NzM0LDc3MzUsMzk4NiwyNDA0LCAgIyA2MTUwCjQxODksMzU2NywzODA5LDQxOTAsNzczNiwyMzAyLDEzMTgsMjUwNSwzMDkxLCAxMzMsMzA5MiwyODczLDQ0NzMsIDYyOSwgIDMxLDI4MzgsICAjIDYxNjYKMjY5NywzODEwLDQ0NzQsIDg1MCwgOTQ5LDQ0NzUsMzk4NywyOTU1LDE3MzIsMjA4OCw0MTkxLDE0OTYsMTg1Miw3NzM3LDM5ODgsIDYyMCwgICMgNjE4MgozMjE0LCA5ODEsMTI0MiwzNjc5LDMzNjAsMTYxOSwzNjgwLDE2NDMsMzI5MywyMTM5LDI0NTIsMTk3MCwxNzE5LDM0NjMsMjE2OCw3NzM4LCAgIyA2MTk4CjMyMTUsNzczOSw3NzQwLDMzNjEsMTgyOCw3NzQxLDEyNzcsNDQ3NiwxNTY1LDIwNDcsNzc0MiwxNjM2LDM1NjgsMzA5Myw3NzQzLCA4NjksICAjIDYyMTQKMjgzOSwgNjU1LDM4MTEsMzgxMiwzMDk0LDM5ODksMzAwMCwzODEzLDEzMTAsMzU2OSw0NDc3LDc3NDQsNzc0NSw3NzQ2LDE3MzMsIDU1OCwgICMgNjIzMAo0NDc4LDM2ODEsIDMzNSwxNTQ5LDMwNDUsMTc1Niw0MTkyLDM2ODIsMTk0NSwzNDY0LDE4MjksMTI5MSwxMTkyLCA0NzAsMjcyNiwyMTA3LCAgIyA2MjQ2CjI3OTMsIDkxMywxMDU0LDM5OTAsNzc0NywxMDI3LDc3NDgsMzA0NiwzOTkxLDQ0NzksIDk4MiwyNjYyLDMzNjIsMzE0OCwzNDY1LDMyMTYsICAjIDYyNjIKMzIxNywxOTQ2LDI3OTQsNzc0OSwgNTcxLDQ0ODAsNzc1MCwxODMwLDc3NTEsMzU3MCwyNTgzLDE1MjMsMjQyNCw3NzUyLDIwODksIDk4NCwgICMgNjI3OAo0NDgxLDM2ODMsMTk1OSw3NzUzLDM2ODQsIDg1MiwgOTIzLDI3OTUsMzQ2NiwzNjg1LCA5NjksMTUxOSwgOTk5LDIwNDgsMjMyMCwxNzA1LCAgIyA2Mjk0Cjc3NTQsMzA5NSwgNjE1LDE2NjIsIDE1MSwgNTk3LDM5OTIsMjQwNSwyMzIxLDEwNDksIDI3NSw0NDgyLDM2ODYsNDE5MywgNTY4LDM2ODcsICAjIDYzMTAKMzU3MSwyNDgwLDQxOTQsMzY4OCw3NzU1LDI0MjUsMjI3MCwgNDA5LDMyMTgsNzc1NiwxNTY2LDI4NzQsMzQ2NywxMDAyLCA3NjksMjg0MCwgICMgNjMyNgogMTk0LDIwOTAsMzE0OSwzNjg5LDIyMjIsMzI5NCw0MTk1LCA2MjgsMTUwNSw3NzU3LDc3NTgsMTc2MywyMTc3LDMwMDEsMzk5MywgNTIxLCAgIyA2MzQyCjExNjEsMjU4NCwxNzg3LDIyMDMsMjQwNiw0NDgzLDM5OTQsMTYyNSw0MTk2LDQxOTcsIDQxMiwgIDQyLDMwOTYsIDQ2NCw3NzU5LDI2MzIsICAjIDYzNTgKNDQ4NCwzMzYzLDE3NjAsMTU3MSwyODc1LDM0NjgsMjUzMCwxMjE5LDIyMDQsMzgxNCwyNjMzLDIxNDAsMjM2OCw0NDg1LDQ0ODYsMzI5NSwgICMgNjM3NAoxNjUxLDMzNjQsMzU3Miw3NzYwLDc3NjEsMzU3MywyNDgxLDM0NjksNzc2MiwzNjkwLDc3NjMsNzc2NCwyMjcxLDIwOTEsIDQ2MCw3NzY1LCAgIyA2MzkwCjQ0ODcsNzc2NiwzMDAyLCA5NjIsIDU4OCwzNTc0LCAyODksMzIxOSwyNjM0LDExMTYsICA1Miw3NzY3LDMwNDcsMTc5Niw3NzY4LDc3NjksICAjIDY0MDYKNzc3MCwxNDY3LDc3NzEsMTU5OCwxMTQzLDM2OTEsNDE5OCwxOTg0LDE3MzQsMTA2Nyw0NDg4LDEyODAsMzM2NSwgNDY1LDQ0ODksMTU3MiwgICMgNjQyMgogNTEwLDc3NzIsMTkyNywyMjQxLDE4MTIsMTY0NCwzNTc1LDc3NzMsNDQ5MCwzNjkyLDc3NzQsNzc3NSwyNjYzLDE1NzMsMTUzNCw3Nzc2LCAgIyA2NDM4Cjc3NzcsNDE5OSwgNTM2LDE4MDcsMTc2MSwzNDcwLDM4MTUsMzE1MCwyNjM1LDc3NzgsNzc3OSw3NzgwLDQ0OTEsMzQ3MSwyOTE1LDE5MTEsICAjIDY0NTQKMjc5Niw3NzgxLDMyOTYsMTEyMiwgMzc3LDMyMjAsNzc4MiwgMzYwLDc3ODMsNzc4NCw0MjAwLDE1MjksIDU1MSw3Nzg1LDIwNTksMzY5MywgICMgNjQ3MAoxNzY5LDI0MjYsNzc4NiwyOTE2LDQyMDEsMzI5NywzMDk3LDIzMjIsMjEwOCwyMDMwLDQ0OTIsMTQwNCwgMTM2LDE0NjgsMTQ3OSwgNjcyLCAgIyA2NDg2CjExNzEsMzIyMSwyMzAzLCAyNzEsMzE1MSw3Nzg3LDI3NjIsNzc4OCwyMDQ5LCA2NzgsMjcyNywgODY1LDE5NDcsNDQ5Myw3Nzg5LDIwMTMsICAjIDY1MDIKMzk5NSwyOTU2LDc3OTAsMjcyOCwyMjIzLDEzOTcsMzA0OCwzNjk0LDQ0OTQsNDQ5NSwxNzM1LDI5MTcsMzM2NiwzNTc2LDc3OTEsMzgxNiwgICMgNjUxOAogNTA5LDI4NDEsMjQ1MywyODc2LDM4MTcsNzc5Miw3NzkzLDMxNTIsMzE1Myw0NDk2LDQyMDIsMjUzMSw0NDk3LDIzMDQsMTE2NiwxMDEwLCAgIyA2NTM0CiA1NTIsIDY4MSwxODg3LDc3OTQsNzc5NSwyOTU3LDI5NTgsMzk5NiwxMjg3LDE1OTYsMTg2MSwzMTU0LCAzNTgsIDQ1MywgNzM2LCAxNzUsICAjIDY1NTAKIDQ3OCwxMTE3LCA5MDUsMTE2NywxMDk3LDc3OTYsMTg1MywxNTMwLDc3OTcsMTcwNiw3Nzk4LDIxNzgsMzQ3MiwyMjg3LDM2OTUsMzQ3MywgICMgNjU2NgozNTc3LDQyMDMsMjA5Miw0MjA0LDc3OTksMzM2NywxMTkzLDI0ODIsNDIwNSwxNDU4LDIxOTAsMjIwNSwxODYyLDE4ODgsMTQyMSwzMjk4LCAgIyA2NTgyCjI5MTgsMzA0OSwyMTc5LDM0NzQsIDU5NSwyMTIyLDc4MDAsMzk5Nyw3ODAxLDc4MDIsNDIwNiwxNzA3LDI2MzYsIDIyMywzNjk2LDEzNTksICAjIDY1OTgKIDc1MSwzMDk4LCAxODMsMzQ3NSw3ODAzLDI3OTcsMzAwMywgNDE5LDIzNjksIDYzMywgNzA0LDM4MTgsMjM4OSwgMjQxLDc4MDQsNzgwNSwgICMgNjYxNAo3ODA2LCA4MzgsMzAwNCwzNjk3LDIyNzIsMjc2MywyNDU0LDM4MTksMTkzOCwyMDUwLDM5OTgsMTMwOSwzMDk5LDIyNDIsMTE4MSw3ODA3LCAgIyA2NjMwCjExMzYsMjIwNiwzODIwLDIzNzAsMTQ0Niw0MjA3LDIzMDUsNDQ5OCw3ODA4LDc4MDksNDIwOCwxMDU1LDI2MDUsIDQ4NCwzNjk4LDc4MTAsICAjIDY2NDYKMzk5OSwgNjI1LDQyMDksMjI3MywzMzY4LDE0OTksNDIxMCw0MDAwLDc4MTEsNDAwMSw0MjExLDMyMjIsMjI3NCwyMjc1LDM0NzYsNzgxMiwgICMgNjY2Mgo3ODEzLDI3NjQsIDgwOCwyNjA2LDM2OTksMzM2OSw0MDAyLDQyMTIsMzEwMCwyNTMyLCA1MjYsMzM3MCwzODIxLDQyMTMsIDk1NSw3ODE0LCAgIyA2Njc4CjE2MjAsNDIxNCwyNjM3LDI0MjcsNzgxNSwxNDI5LDM3MDAsMTY2OSwxODMxLCA5OTQsIDkyOCw3ODE2LDM1NzgsMTI2MCw3ODE3LDc4MTgsICAjIDY2OTQKNzgxOSwxOTQ4LDIyODgsIDc0MSwyOTE5LDE2MjYsNDIxNSwyNzI5LDI0NTUsIDg2NywxMTg0LCAzNjIsMzM3MSwxMzkyLDc4MjAsNzgyMSwgICMgNjcxMAo0MDAzLDQyMTYsMTc3MCwxNzM2LDMyMjMsMjkyMCw0NDk5LDQ1MDAsMTkyOCwyNjk4LDE0NTksMTE1OCw3ODIyLDMwNTAsMzM3MiwyODc3LCAgIyA2NzI2CjEyOTIsMTkyOSwyNTA2LDI4NDIsMzcwMSwxOTg1LDExODcsMjA3MSwyMDE0LDI2MDcsNDIxNyw3ODIzLDI1NjYsMjUwNywyMTY5LDM3MDIsICAjIDY3NDIKMjQ4MywzMjk5LDc4MjQsMzcwMyw0NTAxLDc4MjUsNzgyNiwgNjY2LDEwMDMsMzAwNSwxMDIyLDM1NzksNDIxOCw3ODI3LDQ1MDIsMTgxMywgICMgNjc1OAoyMjUzLCA1NzQsMzgyMiwxNjAzLCAyOTUsMTUzNSwgNzA1LDM4MjMsNDIxOSwgMjgzLCA4NTgsIDQxNyw3ODI4LDc4MjksMzIyNCw0NTAzLCAgIyA2Nzc0CjQ1MDQsMzA1MSwxMjIwLDE4ODksMTA0NiwyMjc2LDI0NTYsNDAwNCwxMzkzLDE1OTksIDY4OSwyNTY3LCAzODgsNDIyMCw3ODMwLDI0ODQsICAjIDY3OTAKIDgwMiw3ODMxLDI3OTgsMzgyNCwyMDYwLDE0MDUsMjI1NCw3ODMyLDQ1MDUsMzgyNSwyMTA5LDEwNTIsMTM0NSwzMjI1LDE1ODUsNzgzMywgICMgNjgwNgogODA5LDc4MzQsNzgzNSw3ODM2LCA1NzUsMjczMCwzNDc3LCA5NTYsMTU1MiwxNDY5LDExNDQsMjMyMyw3ODM3LDIzMjQsMTU2MCwyNDU3LCAgIyA2ODIyCjM1ODAsMzIyNiw0MDA1LCA2MTYsMjIwNywzMTU1LDIxODAsMjI4OSw3ODM4LDE4MzIsNzgzOSwzNDc4LDQ1MDYsNzg0MCwxMzE5LDM3MDQsICAjIDY4MzgKMzcwNSwxMjExLDM1ODEsMTAyMywzMjI3LDEyOTMsMjc5OSw3ODQxLDc4NDIsNzg0MywzODI2LCA2MDcsMjMwNiwzODI3LCA3NjIsMjg3OCwgICMgNjg1NAoxNDM5LDQyMjEsMTM2MCw3ODQ0LDE0ODUsMzA1Miw3ODQ1LDQ1MDcsMTAzOCw0MjIyLDE0NTAsMjA2MSwyNjM4LDQyMjMsMTM3OSw0NTA4LCAgIyA2ODcwCjI1ODUsNzg0Niw3ODQ3LDQyMjQsMTM1MiwxNDE0LDIzMjUsMjkyMSwxMTcyLDc4NDgsNzg0OSwzODI4LDM4MjksNzg1MCwxNzk3LDE0NTEsICAjIDY4ODYKNzg1MSw3ODUyLDc4NTMsNzg1NCwyOTIyLDQwMDYsNDAwNywyNDg1LDIzNDYsIDQxMSw0MDA4LDQwMDksMzU4MiwzMzAwLDMxMDEsNDUwOSwgICMgNjkwMgoxNTYxLDI2NjQsMTQ1Miw0MDEwLDEzNzUsNzg1NSw3ODU2LCAgNDcsMjk1OSwgMzE2LDc4NTcsMTQwNiwxNTkxLDI5MjMsMzE1Niw3ODU4LCAgIyA2OTE4CjEwMjUsMjE0MSwzMTAyLDMxNTcsIDM1NCwyNzMxLCA4ODQsMjIyNCw0MjI1LDI0MDcsIDUwOCwzNzA2LCA3MjYsMzU4MywgOTk2LDI0MjgsICAjIDY5MzQKMzU4NCwgNzI5LDc4NTksIDM5MiwyMTkxLDE0NTMsNDAxMSw0NTEwLDM3MDcsNzg2MCw3ODYxLDI0NTgsMzU4NSwyNjA4LDE2NzUsMjgwMCwgICMgNjk1MAogOTE5LDIzNDcsMjk2MCwyMzQ4LDEyNzAsNDUxMSw0MDEyLCAgNzMsNzg2Miw3ODYzLCA2NDcsNzg2NCwzMjI4LDI4NDMsMjI1NSwxNTUwLCAgIyA2OTY2CjEzNDYsMzAwNiw3ODY1LDEzMzIsIDg4MywzNDc5LDc4NjYsNzg2Nyw3ODY4LDc4NjksMzMwMSwyNzY1LDc4NzAsMTIxMiwgODMxLDEzNDcsICAjIDY5ODIKNDIyNiw0NTEyLDIzMjYsMzgzMCwxODYzLDMwNTMsIDcyMCwzODMxLDQ1MTMsNDUxNCwzODMyLDc4NzEsNDIyNyw3ODcyLDc4NzMsNDUxNSwgICMgNjk5OAo3ODc0LDc4NzUsMTc5OCw0NTE2LDM3MDgsMjYwOSw0NTE3LDM1ODYsMTY0NSwyMzcxLDc4NzYsNzg3NywyOTI0LCA2NjksMjIwOCwyNjY1LCAgIyA3MDE0CjI0MjksNzg3OCwyODc5LDc4NzksNzg4MCwxMDI4LDMyMjksNzg4MSw0MjI4LDI0MDgsNzg4MiwyMjU2LDEzNTMsNzg4Myw3ODg0LDQ1MTgsICAjIDcwMzAKMzE1OCwgNTE4LDc4ODUsNDAxMyw3ODg2LDQyMjksMTk2MCw3ODg3LDIxNDIsNDIzMCw3ODg4LDc4ODksMzAwNywyMzQ5LDIzNTAsMzgzMywgICMgNzA0NgogNTE2LDE4MzMsMTQ1NCw0MDE0LDI2OTksNDIzMSw0NTE5LDIyMjUsMjYxMCwxOTcxLDExMjksMzU4Nyw3ODkwLDI3NjYsNzg5MSwyOTYxLCAgIyA3MDYyCjE0MjIsIDU3NywxNDcwLDMwMDgsMTUyNCwzMzczLDc4OTIsNzg5MywgNDMyLDQyMzIsMzA1NCwzNDgwLDc4OTQsMjU4NiwxNDU1LDI1MDgsICAjIDcwNzgKMjIyNiwxOTcyLDExNzUsNzg5NSwxMDIwLDI3MzIsNDAxNSwzNDgxLDQ1MjAsNzg5NiwyNzMzLDc4OTcsMTc0MywxMzYxLDMwNTUsMzQ4MiwgICMgNzA5NAoyNjM5LDQwMTYsNDIzMyw0NTIxLDIyOTAsIDg5NSwgOTI0LDQyMzQsMjE3MCwgMzMxLDIyNDMsMzA1NiwgMTY2LDE2MjcsMzA1NywxMDk4LCAgIyA3MTEwCjc4OTgsMTIzMiwyODgwLDIyMjcsMzM3NCw0NTIyLCA2NTcsIDQwMywxMTk2LDIzNzIsIDU0MiwzNzA5LDMzNzUsMTYwMCw0MjM1LDM0ODMsICAjIDcxMjYKNzg5OSw0NTIzLDI3NjcsMzIzMCwgNTc2LCA1MzAsMTM2Miw3OTAwLDQ1MjQsMjUzMywyNjY2LDM3MTAsNDAxNyw3OTAxLCA4NDIsMzgzNCwgICMgNzE0Mgo3OTAyLDI4MDEsMjAzMSwxMDE0LDQwMTgsIDIxMywyNzAwLDMzNzYsIDY2NSwgNjIxLDQyMzYsNzkwMywzNzExLDI5MjUsMjQzMCw3OTA0LCAgIyA3MTU4CjI0MzEsMzMwMiwzNTg4LDMzNzcsNzkwNSw0MjM3LDI1MzQsNDIzOCw0NTI1LDM1ODksMTY4Miw0MjM5LDM0ODQsMTM4MCw3OTA2LCA3MjQsICAjIDcxNzQKMjI3NywgNjAwLDE2NzAsNzkwNywxMzM3LDEyMzMsNDUyNiwzMTAzLDIyNDQsNzkwOCwxNjIxLDQ1MjcsNzkwOSwgNjUxLDQyNDAsNzkxMCwgICMgNzE5MAoxNjEyLDQyNDEsMjYxMSw3OTExLDI4NDQsNzkxMiwyNzM0LDIzMDcsMzA1OCw3OTEzLCA3MTYsMjQ1OSwzMDU5LCAxNzQsMTI1NSwyNzAxLCAgIyA3MjA2CjQwMTksMzU5MCwgNTQ4LDEzMjAsMTM5OCwgNzI4LDQwMjAsMTU3NCw3OTE0LDE4OTAsMTE5NywzMDYwLDQwMjEsNzkxNSwzMDYxLDMwNjIsICAjIDcyMjIKMzcxMiwzNTkxLDM3MTMsIDc0Nyw3OTE2LCA2MzUsNDI0Miw0NTI4LDc5MTcsNzkxOCw3OTE5LDQyNDMsNzkyMCw3OTIxLDQ1MjksNzkyMiwgICMgNzIzOAozMzc4LDQ1MzAsMjQzMiwgNDUxLDc5MjMsMzcxNCwyNTM1LDIwNzIsNDI0NCwyNzM1LDQyNDUsNDAyMiw3OTI0LDE3NjQsNDUzMSw3OTI1LCAgIyA3MjU0CjQyNDYsIDM1MCw3OTI2LDIyNzgsMjM5MCwyNDg2LDc5MjcsNDI0Nyw0MDIzLDIyNDUsMTQzNCw0MDI0LCA0ODgsNDUzMiwgNDU4LDQyNDgsICAjIDcyNzAKNDAyNSwzNzE1LCA3NzEsMTMzMCwyMzkxLDM4MzUsMjU2OCwzMTU5LDIxNTksMjQwOSwxNTUzLDI2NjcsMzE2MCw0MjQ5LDc5MjgsMjQ4NywgICMgNzI4NgoyODgxLDI2MTIsMTcyMCwyNzAyLDQyNTAsMzM3OSw0NTMzLDc5MjksMjUzNiw0MjUxLDc5MzAsMzIzMSw0MjUyLDI3NjgsNzkzMSwyMDE1LCAgIyA3MzAyCjI3MzYsNzkzMiwxMTU1LDEwMTcsMzcxNiwzODM2LDc5MzMsMzMwMywyMzA4LCAyMDEsMTg2NCw0MjUzLDE0MzAsNzkzNCw0MDI2LDc5MzUsICAjIDczMTgKNzkzNiw3OTM3LDc5MzgsNzkzOSw0MjU0LDE2MDQsNzk0MCwgNDE0LDE4NjUsIDM3MSwyNTg3LDQ1MzQsNDUzNSwzNDg1LDIwMTYsMzEwNCwgICMgNzMzNAo0NTM2LDE3MDgsIDk2MCw0MjU1LCA4ODcsIDM4OSwyMTcxLDE1MzYsMTY2MywxNzIxLDc5NDEsMjIyOCw0MDI3LDIzNTEsMjkyNiwxNTgwLCAgIyA3MzUwCjc5NDIsNzk0Myw3OTQ0LDE3NDQsNzk0NSwyNTM3LDQ1MzcsNDUzOCw3OTQ2LDQ1MzksNzk0NywyMDczLDc5NDgsNzk0OSwzNTkyLDMzODAsICAjIDczNjYKMjg4Miw0MjU2LDc5NTAsNDI1NywyNjQwLDMzODEsMjgwMiwgNjczLDI3MDMsMjQ2MCwgNzA5LDM0ODYsNDAyOCwzNTkzLDQyNTgsNzk1MSwgICMgNzM4MgoxMTQ4LCA1MDIsIDYzNCw3OTUyLDc5NTMsMTIwNCw0NTQwLDM1OTQsMTU3NSw0NTQxLDI2MTMsMzcxNyw3OTU0LDM3MTgsMzEwNSwgOTQ4LCAgIyA3Mzk4CjMyMzIsIDEyMSwxNzQ1LDM4MzcsMTExMCw3OTU1LDQyNTksMzA2MywyNTA5LDMwMDksNDAyOSwzNzE5LDExNTEsMTc3MSwzODM4LDE0ODgsICAjIDc0MTQKNDAzMCwxOTg2LDc5NTYsMjQzMywzNDg3LDc5NTcsNzk1OCwyMDkzLDc5NTksNDI2MCwzODM5LDEyMTMsMTQwNywyODAzLCA1MzEsMjczNywgICMgNzQzMAoyNTM4LDMyMzMsMTAxMSwxNTM3LDc5NjAsMjc2OSw0MjYxLDMxMDYsMTA2MSw3OTYxLDM3MjAsMzcyMSwxODY2LDI4ODMsNzk2MiwyMDE3LCAgIyA3NDQ2CiAxMjAsNDI2Miw0MjYzLDIwNjIsMzU5NSwzMjM0LDIzMDksMzg0MCwyNjY4LDMzODIsMTk1NCw0NTQyLDc5NjMsNzk2NCwzNDg4LDEwNDcsICAjIDc0NjIKMjcwNCwxMjY2LDc5NjUsMTM2OCw0NTQzLDI4NDUsIDY0OSwzMzgzLDM4NDEsMjUzOSwyNzM4LDExMDIsMjg0NiwyNjY5LDc5NjYsNzk2NywgICMgNzQ3OAoxOTk5LDc5NjgsMTExMSwzNTk2LDI5NjIsNzk2OSwyNDg4LDM4NDIsMzU5NywyODA0LDE4NTQsMzM4NCwzNzIyLDc5NzAsNzk3MSwzMzg1LCAgIyA3NDk0CjI0MTAsMjg4NCwzMzA0LDMyMzUsMzU5OCw3OTcyLDI1NjksNzk3MywzNTk5LDI4MDUsNDAzMSwxNDYwLCA4NTYsNzk3NCwzNjAwLDc5NzUsICAjIDc1MTAKMjg4NSwyOTYzLDc5NzYsMjg4NiwzODQzLDc5NzcsNDI2NCwgNjMyLDI1MTAsIDg3NSwzODQ0LDE2OTcsMzg0NSwyMjkxLDc5NzgsNzk3OSwgICMgNzUyNgo0NTQ0LDMwMTAsMTIzOSwgNTgwLDQ1NDUsNDI2NSw3OTgwLCA5MTQsIDkzNiwyMDc0LDExOTAsNDAzMiwxMDM5LDIxMjMsNzk4MSw3OTgyLCAgIyA3NTQyCjc5ODMsMzM4NiwxNDczLDc5ODQsMTM1NCw0MjY2LDM4NDYsNzk4NSwyMTcyLDMwNjQsNDAzMywgOTE1LDMzMDUsNDI2Nyw0MjY4LDMzMDYsICAjIDc1NTgKMTYwNSwxODM0LDc5ODYsMjczOSwgMzk4LDM2MDEsNDI2OSwzODQ3LDQwMzQsIDMyOCwxOTEyLDI4NDcsNDAzNSwzODQ4LDEzMzEsNDI3MCwgICMgNzU3NAozMDExLCA5MzcsNDI3MSw3OTg3LDM2MDIsNDAzNiw0MDM3LDMzODcsMjE2MCw0NTQ2LDMzODgsIDUyNCwgNzQyLCA1MzgsMzA2NSwxMDEyLCAgIyA3NTkwCjc5ODgsNzk4OSwzODQ5LDI0NjEsNzk5MCwgNjU4LDExMDMsIDIyNSwzODUwLDc5OTEsNzk5Miw0NTQ3LDc5OTMsNDU0OCw3OTk0LDMyMzYsICAjIDc2MDYKMTI0Myw3OTk1LDQwMzgsIDk2MywyMjQ2LDQ1NDksNzk5NiwyNzA1LDM2MDMsMzE2MSw3OTk3LDc5OTgsMjU4OCwyMzI3LDc5OTksNDU1MCwgICMgNzYyMgo4MDAwLDgwMDEsODAwMiwzNDg5LDMzMDcsIDk1NywzMzg5LDI1NDAsMjAzMiwxOTMwLDI5MjcsMjQ2MiwgODcwLDIwMTgsMzYwNCwxNzQ2LCAgIyA3NjM4CjI3NzAsMjc3MSwyNDM0LDI0NjMsODAwMywzODUxLDgwMDQsMzcyMywzMTA3LDM3MjQsMzQ5MCwzMzkwLDM3MjUsODAwNSwxMTc5LDMwNjYsICAjIDc2NTQKODAwNiwzMTYyLDIzNzMsNDI3MiwzNzI2LDI1NDEsMzE2MywzMTA4LDI3NDAsNDAzOSw4MDA3LDMzOTEsMTU1NiwyNTQyLDIyOTIsIDk3NywgICMgNzY3MAoyODg3LDIwMzMsNDA0MCwxMjA1LDMzOTIsODAwOCwxNzY1LDMzOTMsMzE2NCwyMTI0LDEyNzEsMTY4OSwgNzE0LDQ1NTEsMzQ5MSw4MDA5LCAgIyA3Njg2CjIzMjgsMzg1MiwgNTMzLDQyNzMsMzYwNSwyMTgxLCA2MTcsODAxMCwyNDY0LDMzMDgsMzQ5MiwyMzEwLDgwMTEsODAxMiwzMTY1LDgwMTMsICAjIDc3MDIKODAxNCwzODUzLDE5ODcsIDYxOCwgNDI3LDI2NDEsMzQ5MywzMzk0LDgwMTUsODAxNiwxMjQ0LDE2OTAsODAxNywyODA2LDQyNzQsNDU1MiwgICMgNzcxOAo4MDE4LDM0OTQsODAxOSw4MDIwLDIyNzksMTU3NiwgNDczLDM2MDYsNDI3NSwzMzk1LCA5NzIsODAyMSwzNjA3LDgwMjIsMzA2Nyw4MDIzLCAgIyA3NzM0CjgwMjQsNDU1Myw0NTU0LDgwMjUsMzcyNyw0MDQxLDQwNDIsODAyNiwgMTUzLDQ1NTUsIDM1Niw4MDI3LDE4OTEsMjg4OCw0Mjc2LDIxNDMsICAjIDc3NTAKIDQwOCwgODAzLDIzNTIsODAyOCwzODU0LDgwMjksNDI3NywxNjQ2LDI1NzAsMjUxMSw0NTU2LDQ1NTcsMzg1NSw4MDMwLDM4NTYsNDI3OCwgICMgNzc2Ngo4MDMxLDI0MTEsMzM5NiwgNzUyLDgwMzIsODAzMywxOTYxLDI5NjQsODAzNCwgNzQ2LDMwMTIsMjQ2NSw4MDM1LDQyNzksMzcyOCwgNjk4LCAgIyA3NzgyCjQ1NTgsMTg5Miw0MjgwLDM2MDgsMjU0Myw0NTU5LDM2MDksMzg1Nyw4MDM2LDMxNjYsMzM5Nyw4MDM3LDE4MjMsMTMwMiw0MDQzLDI3MDYsICAjIDc3OTgKMzg1OCwxOTczLDQyODEsODAzOCw0MjgyLDMxNjcsIDgyMywxMzAzLDEyODgsMTIzNiwyODQ4LDM0OTUsNDA0NCwzMzk4LCA3NzQsMzg1OSwgICMgNzgxNAo4MDM5LDE1ODEsNDU2MCwxMzA0LDI4NDksMzg2MCw0NTYxLDgwNDAsMjQzNSwyMTYxLDEwODMsMzIzNyw0MjgzLDQwNDUsNDI4NCwgMzQ0LCAgIyA3ODMwCjExNzMsIDI4OCwyMzExLCA0NTQsMTY4Myw4MDQxLDgwNDIsMTQ2MSw0NTYyLDQwNDYsMjU4OSw4MDQzLDgwNDQsNDU2MywgOTg1LCA4OTQsICAjIDc4NDYKODA0NSwzMzk5LDMxNjgsODA0NiwxOTEzLDI5MjgsMzcyOSwxOTg4LDgwNDcsMjExMCwxOTc0LDgwNDgsNDA0Nyw4MDQ5LDI1NzEsMTE5NCwgICMgNzg2MgogNDI1LDgwNTAsNDU2NCwzMTY5LDEyNDUsMzczMCw0Mjg1LDgwNTEsODA1MiwyODUwLDgwNTMsIDYzNiw0NTY1LDE4NTUsMzg2MSwgNzYwLCAgIyA3ODc4CjE3OTksODA1NCw0Mjg2LDIyMDksMTUwOCw0NTY2LDQwNDgsMTg5MywxNjg0LDIyOTMsODA1NSw4MDU2LDgwNTcsNDI4Nyw0Mjg4LDIyMTAsICAjIDc4OTQKIDQ3OSw4MDU4LDgwNTksIDgzMiw4MDYwLDQwNDksMjQ4OSw4MDYxLDI5NjUsMjQ5MCwzNzMxLCA5OTAsMzEwOSwgNjI3LDE4MTQsMjY0MiwgICMgNzkxMAo0Mjg5LDE1ODIsNDI5MCwyMTI1LDIxMTEsMzQ5Niw0NTY3LDgwNjIsIDc5OSw0MjkxLDMxNzAsODA2Myw0NTY4LDIxMTIsMTczNywzMDEzLCAgIyA3OTI2CjEwMTgsIDU0MywgNzU0LDQyOTIsMzMwOSwxNjc2LDQ1NjksNDU3MCw0MDUwLDgwNjQsMTQ4OSw4MDY1LDM0OTcsODA2NiwyNjE0LDI4ODksICAjIDc5NDIKNDA1MSw4MDY3LDgwNjgsMjk2Niw4MDY5LDgwNzAsODA3MSw4MDcyLDMxNzEsNDU3MSw0NTcyLDIxODIsMTcyMiw4MDczLDMyMzgsMzIzOSwgICMgNzk1OAoxODQyLDM2MTAsMTcxNSwgNDgxLCAzNjUsMTk3NSwxODU2LDgwNzQsODA3NSwxOTYyLDI0OTEsNDU3Myw4MDc2LDIxMjYsMzYxMSwzMjQwLCAgIyA3OTc0CiA0MzMsMTg5NCwyMDYzLDIwNzUsODA3NywgNjAyLDI3NDEsODA3OCw4MDc5LDgwODAsODA4MSw4MDgyLDMwMTQsMTYyOCwzNDAwLDgwODMsICAjIDc5OTAKMzE3Miw0NTc0LDQwNTIsMjg5MCw0NTc1LDI1MTIsODA4NCwyNTQ0LDI3NzIsODA4NSw4MDg2LDgwODcsMzMxMCw0NTc2LDI4OTEsODA4OCwgICMgODAwNgo0NTc3LDgwODksMjg1MSw0NTc4LDQ1NzksMTIyMSwyOTY3LDQwNTMsMjUxMyw4MDkwLDgwOTEsODA5MiwxODY3LDE5ODksODA5Myw4MDk0LCAgIyA4MDIyCjgwOTUsMTg5NSw4MDk2LDgwOTcsNDU4MCwxODk2LDQwNTQsIDMxOCw4MDk4LDIwOTQsNDA1NSw0MjkzLDgwOTksODEwMCwgNDg1LDgxMDEsICAjIDgwMzgKIDkzOCwzODYyLCA1NTMsMjY3MCwgMTE2LDgxMDIsMzg2MywzNjEyLDgxMDMsMzQ5OCwyNjcxLDI3NzMsMzQwMSwzMzExLDI4MDcsODEwNCwgICMgODA1NAozNjEzLDI5MjksNDA1NiwxNzQ3LDI5MzAsMjk2OCw4MTA1LDgxMDYsIDIwNyw4MTA3LDgxMDgsMjY3Miw0NTgxLDI1MTQsODEwOSwzMDE1LCAgIyA4MDcwCiA4OTAsMzYxNCwzODY0LDgxMTAsMTg3NywzNzMyLDM0MDIsODExMSwyMTgzLDIzNTMsMzQwMywxNjUyLDgxMTIsODExMyw4MTE0LCA5NDEsICAjIDgwODYKMjI5NCwgMjA4LDM0OTksNDA1NywyMDE5LCAzMzAsNDI5NCwzODY1LDI4OTIsMjQ5MiwzNzMzLDQyOTUsODExNSw4MTE2LDgxMTcsODExOCwgICMgODEwMgopCgpQSwMEFAAAAAAAAAAhAKBBjRjTBgAA0wYAADIAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9ldWN0d3Byb2Jlci5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIG1vemlsbGEub3JnIGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAxOTk4CiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpmcm9tIC5tYmNoYXJzZXRwcm9iZXIgaW1wb3J0IE11bHRpQnl0ZUNoYXJTZXRQcm9iZXIKZnJvbSAuY29kaW5nc3RhdGVtYWNoaW5lIGltcG9ydCBDb2RpbmdTdGF0ZU1hY2hpbmUKZnJvbSAuY2hhcmRpc3RyaWJ1dGlvbiBpbXBvcnQgRVVDVFdEaXN0cmlidXRpb25BbmFseXNpcwpmcm9tIC5tYmNzc20gaW1wb3J0IEVVQ1RXX1NNX01PREVMCgpjbGFzcyBFVUNUV1Byb2JlcihNdWx0aUJ5dGVDaGFyU2V0UHJvYmVyKToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzdXBlcihFVUNUV1Byb2Jlciwgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuY29kaW5nX3NtID0gQ29kaW5nU3RhdGVNYWNoaW5lKEVVQ1RXX1NNX01PREVMKQogICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uX2FuYWx5emVyID0gRVVDVFdEaXN0cmlidXRpb25BbmFseXNpcygpCiAgICAgICAgc2VsZi5yZXNldCgpCgogICAgQHByb3BlcnR5CiAgICBkZWYgY2hhcnNldF9uYW1lKHNlbGYpOgogICAgICAgIHJldHVybiAiRVVDLVRXIgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGxhbmd1YWdlKHNlbGYpOgogICAgICAgIHJldHVybiAiVGFpd2FuIgpQSwMEFAAAAAAAAAAhABlF0tfrUAAA61AAADEAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9nYjIzMTJmcmVxLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBDb21tdW5pY2F0b3IgY2xpZW50IGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAxOTk4CiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIEdCMjMxMiBtb3N0IGZyZXF1ZW50bHkgdXNlZCBjaGFyYWN0ZXIgdGFibGUKIwojIENoYXIgdG8gRnJlcU9yZGVyIHRhYmxlICwgZnJvbSBoejY3NjMKCiMgNTEyICAtLT4gMC43OSAgLS0gMC43OQojIDEwMjQgLS0+IDAuOTIgIC0tIDAuMTMKIyAyMDQ4IC0tPiAwLjk4ICAtLSAwLjA2CiMgNjc2OCAtLT4gMS4wMCAgLS0gMC4wMgojCiMgSWRlYWwgRGlzdHJpYnV0aW9uIFJhdGlvID0gMC43OTEzNS8oMS0wLjc5MTM1KSA9IDMuNzkKIyBSYW5kb20gRGlzdHJpYnV0aW9uIFJhdGlvbiA9IDUxMiAvICgzNzU1IC0gNTEyKSA9IDAuMTU3CiMKIyBUeXBpY2FsIERpc3RyaWJ1dGlvbiBSYXRpbyBhYm91dCAyNSUgb2YgSWRlYWwgb25lLCBzdGlsbCBtdWNoIGhpZ2hlciB0aGF0IFJEUgoKR0IyMzEyX1RZUElDQUxfRElTVFJJQlVUSU9OX1JBVElPID0gMC45CgpHQjIzMTJfVEFCTEVfU0laRSA9IDM3NjAKCkdCMjMxMl9DSEFSX1RPX0ZSRVFfT1JERVIgPSAoCjE2NzEsIDc0OSwxNDQzLDIzNjQsMzkyNCwzODA3LDIzMzAsMzkyMSwxNzA0LDM0NjMsMjY5MSwxNTExLDE1MTUsIDU3MiwzMTkxLDIyMDUsCjIzNjEsIDIyNCwyNTU4LCA0NzksMTcxMSwgOTYzLDMxNjIsIDQ0MCw0MDYwLDE5MDUsMjk2NiwyOTQ3LDM1ODAsMjY0NywzOTYxLDM4NDIsCjIyMDQsIDg2OSw0MjA3LCA5NzAsMjY3OCw1NjI2LDI5NDQsMjk1NiwxNDc5LDQwNDgsIDUxNCwzNTk1LCA1ODgsMTM0NiwyODIwLDM0MDksCiAyNDksNDA4OCwxNzQ2LDE4NzMsMjA0NywxNzc0LCA1ODEsMTgxMywgMzU4LDExNzQsMzU5MCwxMDE0LDE1NjEsNDg0NCwyMjQ1LCA2NzAsCjE2MzYsMzExMiwgODg5LDEyODYsIDk1MywgNTU2LDIzMjcsMzA2MCwxMjkwLDMxNDEsIDYxMywgMTg1LDM0NzcsMTM2NywgODUwLDM4MjAsCjE3MTUsMjQyOCwyNjQyLDIzMDMsMjczMiwzMDQxLDI1NjIsMjY0OCwzNTY2LDM5NDYsMTM0OSwgMzg4LDMwOTgsMjA5MSwxMzYwLDM1ODUsCiAxNTIsMTY4NywxNTM5LCA3MzgsMTU1OSwgIDU5LDEyMzIsMjkyNSwyMjY3LDEzODgsMTI0OSwxNzQxLDE2NzksMjk2MCwgMTUxLDE1NjYsCjExMjUsMTM1Miw0MjcxLCA5MjQsNDI5NiwgMzg1LDMxNjYsNDQ1OSwgMzEwLDEyNDUsMjg1MCwgIDcwLDMyODUsMjcyOSwzNTM0LDM1NzUsCjIzOTgsMzI5OCwzNDY2LDE5NjAsMjI2NSwgMjE3LDM2NDcsIDg2NCwxOTA5LDIwODQsNDQwMSwyNzczLDEwMTAsMzI2OSw1MTUyLCA4NTMsCjMwNTEsMzEyMSwxMjQ0LDQyNTEsMTg5NSwgMzY0LDE0OTksMTU0MCwyMzEzLDExODAsMzY1NSwyMjY4LCA1NjIsIDcxNSwyNDE3LDMwNjEsCiA1NDQsIDMzNiwzNzY4LDIzODAsMTc1Miw0MDc1LCA5NTAsIDI4MCwyNDI1LDQzODIsIDE4MywyNzU5LDMyNzIsIDMzMyw0Mjk3LDIxNTUsCjE2ODgsMjM1NiwxNDQ0LDEwMzksNDU0MCwgNzM2LDExNzcsMzM0OSwyNDQzLDIzNjgsMjE0NCwyMjI1LCA1NjUsIDE5NiwxNDgyLDM0MDYsCiA5MjcsMTMzNSw0MTQ3LCA2OTIsIDg3OCwxMzExLDE2NTMsMzkxMSwzNjIyLDEzNzgsNDIwMCwxODQwLDI5NjksMzE0OSwyMTI2LDE4MTYsCjI1MzQsMTU0NiwyMzkzLDI3NjAsIDczNywyNDk0LCAgMTMsIDQ0NywgMjQ1LDI3NDcsICAzOCwyNzY1LDIxMjksMjU4OSwxMDc5LCA2MDYsCiAzNjAsIDQ3MSwzNzU1LDI4OTAsIDQwNCwgODQ4LCA2OTksMTc4NSwxMjM2LCAzNzAsMjIyMSwxMDIzLDM3NDYsMjA3NCwyMDI2LDIwMjMsCjIzODgsMTU4MSwyMTE5LCA4MTIsMTE0MSwzMDkxLDI1MzYsMTUxOSwgODA0LDIwNTMsIDQwNiwxNTk2LDEwOTAsIDc4NCwgNTQ4LDQ0MTQsCjE4MDYsMjI2NCwyOTM2LDExMDAsIDM0Myw0MTE0LDUwOTYsIDYyMiwzMzU4LCA3NDMsMzY2OCwxNTEwLDE2MjYsNTAyMCwzNTY3LDI1MTMsCjMxOTUsNDExNSw1NjI3LDI0ODksMjk5MSwgIDI0LDIwNjUsMjY5NywxMDg3LDI3MTksICA0OCwxNjM0LCAzMTUsICA2OCwgOTg1LDIwNTIsCiAxOTgsMjIzOSwxMzQ3LDExMDcsMTQzOSwgNTk3LDIzNjYsMjE3MiwgODcxLDMzMDcsIDkxOSwyNDg3LDI3OTAsMTg2NywgMjM2LDI1NzAsCjE0MTMsMzc5NCwgOTA2LDMzNjUsMzM4MSwxNzAxLDE5ODIsMTgxOCwxNTI0LDI5MjQsMTIwNSwgNjE2LDI1ODYsMjA3MiwyMDA0LCA1NzUsCiAyNTMsMzA5OSwgIDMyLDEzNjUsMTE4MiwgMTk3LDE3MTQsMjQ1NCwxMjAxLCA1NTQsMzM4OCwzMjI0LDI3NDgsIDc1NiwyNTg3LCAyNTAsCjI1NjcsMTUwNywxNTE3LDM1MjksMTkyMiwyNzYxLDIzMzcsMzQxNiwxOTYxLDE2NzcsMjQ1MiwyMjM4LDMxNTMsIDYxNSwgOTExLDE1MDYsCjE0NzQsMjQ5NSwxMjY1LDE5MDYsMjc0OSwzNzU2LDMyODAsMjE2MSwgODk4LDI3MTQsMTc1OSwzNDUwLDIyNDMsMjQ0NCwgNTYzLCAgMjYsCjMyODYsMjI2NiwzNzY5LDMzNDQsMjcwNywzNjc3LCA2MTEsMTQwMiwgNTMxLDEwMjgsMjg3MSw0NTQ4LDEzNzUsIDI2MSwyOTQ4LCA4MzUsCjExOTAsNDEzNCwgMzUzLCA4NDAsMjY4NCwxOTAwLDMwODIsMTQzNSwyMTA5LDEyMDcsMTY3NCwgMzI5LDE4NzIsMjc4MSw0MDU1LDI2ODYsCjIxMDQsIDYwOCwzMzE4LDI0MjMsMjk1NywyNzY4LDExMDgsMzczOSwzNTEyLDMyNzEsMzk4NSwyMjAzLDE3NzEsMzUyMCwxNDE4LDIwNTQsCjE2ODEsMTE1MywgMjI1LDE2MjcsMjkyOSwgMTYyLDIwNTAsMjUxMSwzNjg3LDE5NTQsIDEyNCwxODU5LDI0MzEsMTY4NCwzMDMyLDI4OTQsCiA1ODUsNDgwNSwzOTY5LDI4NjksMjcwNCwyMDg4LDIwMzIsMjA5NSwzNjU2LDI2MzUsNDM2MiwyMjA5LCAyNTYsIDUxOCwyMDQyLDIxMDUsCjM3NzcsMzY1NywgNjQzLDIyOTgsMTE0OCwxNzc5LCAxOTAsIDk4OSwzNTQ0LCA0MTQsICAxMSwyMTM1LDIwNjMsMjk3OSwxNDcxLCA0MDMsCjM2NzgsIDEyNiwgNzcwLDE1NjMsIDY3MSwyNDk5LDMyMTYsMjg3NywgNjAwLDExNzksIDMwNywyODA1LDQ5MzcsMTI2OCwxMjk3LDI2OTQsCiAyNTIsNDAzMiwxNDQ4LDE0OTQsMTMzMSwxMzk0LCAxMjcsMjI1NiwgMjIyLDE2NDcsMTAzNSwxNDgxLDMwNTYsMTkxNSwxMDQ4LCA4NzMsCjM2NTEsIDIxMCwgIDMzLDE2MDgsMjUxNiwgMjAwLDE1MjAsIDQxNSwgMTAyLCAgIDAsMzM4OSwxMjg3LCA4MTcsICA5MSwzMjk5LDI5NDAsCiA4MzYsMTgxNCwgNTQ5LDIxOTcsMTM5NiwxNjY5LDI5ODcsMzU4MiwyMjk3LDI4NDgsNDUyOCwxMDcwLCA2ODcsICAyMCwxODE5LCAxMjEsCjE1NTIsMTM2NCwxNDYxLDE5NjgsMjYxNywzNTQwLDI4MjQsMjA4MywgMTc3LCA5NDgsNDkzOCwyMjkxLCAxMTAsNDU0OSwyMDY2LCA2NDgsCjMzNTksMTc1NSwyMTEwLDIxMTQsNDY0Miw0ODQ1LDE2OTMsMzkzNywzMzA4LDEyNTcsMTg2OSwyMTIzLCAyMDgsMTgwNCwzMTU5LDI5OTIsCjI1MzEsMjU0OSwzMzYxLDI0MTgsMTM1MCwyMzQ3LDI4MDAsMjU2OCwxMjkxLDIwMzYsMjY4MCwgIDcyLCA4NDIsMTk5MCwgMjEyLDEyMzMsCjExNTQsMTU4NiwgIDc1LDIwMjcsMzQxMCw0OTAwLDE4MjMsMTMzNywyNzEwLDI2NzYsIDcyOCwyODEwLDE1MjIsMzAyNiw0OTk1LCAxNTcsCiA3NTUsMTA1MCw0MDIyLCA3MTAsIDc4NSwxOTM2LDIxOTQsMjA4NSwxNDA2LDI3NzcsMjQwMCwgMTUwLDEyNTAsNDA0OSwxMjA2LCA4MDcsCjE5MTAsIDUzNCwgNTI5LDMzMDksMTcyMSwxNjYwLCAyNzQsICAzOSwyODI3LCA2NjEsMjY3MCwxNTc4LCA5MjUsMzI0OCwzODE1LDEwOTQsCjQyNzgsNDkwMSw0MjUyLCAgNDEsMTE1MCwzNzQ3LDI1NzIsMjIyNyw0NTAxLDM2NTgsNDkwMiwzODEzLDMzNTcsMzYxNywyODg0LDIyNTgsCiA4ODcsIDUzOCw0MTg3LDMxOTksMTI5NCwyNDM5LDMwNDIsMjMyOSwyMzQzLDI0OTcsMTI1NSwgMTA3LCA1NDMsMTUyNywgNTIxLDM0NzgsCjM1NjgsIDE5NCw1MDYyLCAgMTUsIDk2MSwzODcwLDEyNDEsMTE5MiwyNjY0LCAgNjYsNTIxNSwzMjYwLDIxMTEsMTI5NSwxMTI3LDIxNTIsCjM4MDUsNDEzNSwgOTAxLDExNjQsMTk3NiwgMzk4LDEyNzgsIDUzMCwxNDYwLCA3NDgsIDkwNCwxMDU0LDE5NjYsMTQyNiwgIDUzLDI5MDksCiA1MDksIDUyMywyMjc5LDE1MzQsIDUzNiwxMDE5LCAyMzksMTY4NSwgNDYwLDIzNTMsIDY3MywxMDY1LDI0MDEsMzYwMCw0Mjk4LDIyNzIsCjEyNzIsMjM2MywgMjg0LDE3NTMsMzY3OSw0MDY0LDE2OTUsICA4MSwgODE1LDI2NzcsMjc1NywyNzMxLDEzODYsIDg1OSwgNTAwLDQyMjEsCjIxOTAsMjU2NiwgNzU3LDEwMDYsMjUxOSwyMDY4LDExNjYsMTQ1NSwgMzM3LDI2NTQsMzIwMywxODYzLDE2ODIsMTkxNCwzMDI1LDEyNTIsCjE0MDksMTM2NiwgODQ3LCA3MTQsMjgzNCwyMDM4LDMyMDksIDk2NCwyOTcwLDE5MDEsIDg4NSwyNTUzLDEwNzgsMTc1NiwzMDQ5LCAzMDEsCjE1NzIsMzMyNiwgNjg4LDIxMzAsMTk5NiwyNDI5LDE4MDUsMTY0OCwyOTMwLDM0MjEsMjc1MCwzNjUyLDMwODgsIDI2MiwxMTU4LDEyNTQsCiAzODksMTY0MSwxODEyLCA1MjYsMTcxOSwgOTIzLDIwNzMsMTA3MywxOTAyLCA0NjgsIDQ4OSw0NjI1LDExNDAsIDg1NywyMzc1LDMwNzAsCjMzMTksMjg2MywgMzgwLCAxMTYsMTMyOCwyNjkzLDExNjEsMjI0NCwgMjczLDEyMTIsMTg4NCwyNzY5LDMwMTEsMTc3NSwxMTQyLCA0NjEsCjMwNjYsMTIwMCwyMTQ3LDIyMTIsIDc5MCwgNzAyLDI2OTUsNDIyMiwxNjAxLDEwNTgsIDQzNCwyMzM4LDUxNTMsMzY0MCwgIDY3LDIzNjAsCjQwOTksMjUwMiwgNjE4LDM0NzIsMTMyOSwgNDE2LDExMzIsIDgzMCwyNzgyLDE4MDcsMjY1MywzMjExLDM1MTAsMTY2MiwgMTkyLDIxMjQsCiAyOTYsMzk3OSwxNzM5LDE2MTEsMzY4NCwgIDIzLCAxMTgsIDMyNCwgNDQ2LDEyMzksMTIyNSwgMjkzLDI1MjAsMzgxNCwzNzk1LDI1MzUsCjMxMTYsICAxNywxMDc0LCA0NjcsMjY5MiwyMjAxLCAzODcsMjkyMiwgIDQ1LDEzMjYsMzA1NSwxNjQ1LDM2NTksMjgxNywgOTU4LCAyNDMsCjE5MDMsMjMyMCwxMzM5LDI4MjUsMTc4NCwzMjg5LCAzNTYsIDU3NiwgODY1LDIzMTUsMjM4MSwzMzc3LDM5MTYsMTA4OCwzMTIyLDE3MTMsCjE2NTUsIDkzNSwgNjI4LDQ2ODksMTAzNCwxMzI3LCA0NDEsIDgwMCwgNzIwLCA4OTQsMTk3OSwyMTgzLDE1MjgsNTI4OSwyNzAyLDEwNzEsCjQwNDYsMzU3MiwyMzk5LDE1NzEsMzI4MSwgIDc5LCA3NjEsMTEwMywgMzI3LCAxMzQsIDc1OCwxODk5LDEzNzEsMTYxNSwgODc5LCA0NDIsCiAyMTUsMjYwNSwyNTc5LCAxNzMsMjA0OCwyNDg1LDEwNTcsMjk3NSwzMzE3LDEwOTcsMjI1MywzODAxLDQyNjMsMTQwMywxNjUwLDI5NDYsCiA4MTQsNDk2OCwzNDg3LDE1NDgsMjY0NCwxNTY3LDEyODUsICAgMiwgMjk1LDI2MzYsICA5NywgOTQ2LDM1NzYsIDgzMiwgMTQxLDQyNTcsCjMyNzMsIDc2MCwzODIxLDM1MjEsMzE1NiwyNjA3LCA5NDksMTAyNCwxNzMzLDE1MTYsMTgwMywxOTIwLDIxMjUsMjI4MywyNjY1LDMxODAsCjE1MDEsMjA2NCwzNTYwLDIxNzEsMTU5MiwgODAzLDM1MTgsMTQxNiwgNzMyLDM4OTcsNDI1OCwxMzYzLDEzNjIsMjQ1OCwgMTE5LDE0MjcsCiA2MDIsMTUyNSwyNjA4LDE2MDUsMTYzOSwzMTc1LCA2OTQsMzA2NCwgIDEwLCA0NjUsICA3NiwyMDAwLDQ4NDYsNDIwOCwgNDQ0LDM3ODEsCjE2MTksMzM1MywyMjA2LDEyNzMsMzc5NiwgNzQwLDI0ODMsIDMyMCwxNzIzLDIzNzcsMzY2MCwyNjE5LDEzNTksMTEzNywxNzYyLDE3MjQsCjIzNDUsMjg0MiwxODUwLDE4NjIsIDkxMiwgODIxLDE4NjYsIDYxMiwyNjI1LDE3MzUsMjU3MywzMzY5LDEwOTMsIDg0NCwgIDg5LCA5MzcsCiA5MzAsMTQyNCwzNTY0LDI0MTMsMjk3MiwxMDA0LDMwNDYsMzAxOSwyMDExLCA3MTEsMzE3MSwxNDUyLDQxNzgsIDQyOCwgODAxLDE5NDMsCiA0MzIsIDQ0NSwyODExLCAyMDYsNDEzNiwxNDcyLCA3MzAsIDM0OSwgIDczLCAzOTcsMjgwMiwyNTQ3LCA5OTgsMTYzNywxMTY3LCA3ODksCiAzOTYsMzIxNywgMTU0LDEyMTgsIDcxNiwxMTIwLDE3ODAsMjgxOSw0ODI2LDE5MzEsMzMzNCwzNzYyLDIxMzksMTIxNSwyNjI3LCA1NTIsCjM2NjQsMzYyOCwzMjMyLDE0MDUsMjM4MywzMTExLDEzNTYsMjY1MiwzNTc3LDMzMjAsMzEwMSwxNzAzLCA2NDAsMTA0NSwxMzcwLDEyNDYsCjQ5OTYsIDM3MSwxNTc1LDI0MzYsMTYyMSwyMjEwLCA5ODQsNDAzMywxNzM0LDI2MzgsICAxNiw0NTI5LCA2NjMsMjc1NSwzMjU1LDE0NTEsCjM5MTcsMjI1NywxMjUzLDE5NTUsMjIzNCwxMjYzLDI5NTEsIDIxNCwxMjI5LCA2MTcsIDQ4NSwgMzU5LDE4MzEsMTk2OSwgNDczLDIzMTAsCiA3NTAsMjA1OCwgMTY1LCAgODAsMjg2NCwyNDE5LCAzNjEsNDM0NCwyNDE2LDI0NzksMTEzNCwgNzk2LDM3MjYsMTI2NiwyOTQzLCA4NjAsCjI3MTUsIDkzOCwgMzkwLDI3MzQsMTMxMywxMzg0LCAyNDgsIDIwMiwgODc3LDEwNjQsMjg1NCwgNTIyLDM5MDcsIDI3OSwxNjAyLCAyOTcsCjIzNTcsIDM5NSwzNzQwLCAxMzcsMjA3NSwgOTQ0LDQwODksMjU4NCwxMjY3LDM4MDIsICA2MiwxNTMzLDIyODUsIDE3OCwgMTc2LCA3ODAsCjI0NDAsIDIwMSwzNzA3LCA1OTAsIDQ3OCwxNTYwLDQzNTQsMjExNywxMDc1LCAgMzAsICA3NCw0NjQzLDQwMDQsMTYzNSwxNDQxLDI3NDUsCiA3NzYsMjU5NiwgMjM4LDEwNzcsMTY5MiwxOTEyLDI4NDQsIDYwNSwgNDk5LDE3NDIsMzk0NywgMjQxLDMwNTMsIDk4MCwxNzQ5LCA5MzYsCjI2NDAsNDUxMSwyNTgyLCA1MTUsMTU0MywyMTYyLDUzMjIsMjg5MiwyOTkzLCA4OTAsMjE0OCwxOTI0LCA2NjUsMTgyNywzNTgxLDEwMzIsCiA5NjgsMzE2MywgMzM5LDEwNDQsMTg5NiwgMjcwLCA1ODMsMTc5MSwxNzIwLDQzNjcsMTE5NCwzNDg4LDM2NjksICA0MywyNTIzLDE2NTcsCiAxNjMsMjE2NywgMjkwLDEyMDksMTYyMiwzMzc4LCA1NTAsIDYzNCwyNTA4LDI1MTAsIDY5NSwyNjM0LDIzODQsMjUxMiwxNDc2LDE0MTQsCiAyMjAsMTQ2OSwyMzQxLDIxMzgsMjg1MiwzMTgzLDI5MDAsNDkzOSwyODY1LDM1MDIsMTIxMSwzNjgwLCA4NTQsMzIyNywxMjk5LDI5NzYsCjMxNzIsIDE4NiwyOTk4LDE0NTksIDQ0MywxMDY3LDMyNTEsMTQ5NSwgMzIxLDE5MzIsMzA1NCwgOTA5LCA3NTMsMTQxMCwxODI4LCA0MzYsCjI0NDEsMTExOSwxNTg3LDMxNjQsMjE4NiwxMjU4LCAyMjcsIDIzMSwxNDI1LDE4OTAsMzIwMCwzOTQyLCAyNDcsIDk1OSwgNzI1LDUyNTQsCjI3NDEsIDU3NywyMTU4LDIwNzksIDkyOSwgMTIwLCAxNzQsIDgzOCwyODEzLCA1OTEsMTExNSwgNDE3LDIwMjQsICA0MCwzMjQwLDE1MzYsCjEwMzcsIDI5MSw0MTUxLDIzNTQsIDYzMiwxMjk4LDI0MDYsMjUwMCwzNTM1LDE4MjUsMTg0NiwzNDUxLCAyMDUsMTE3MSwgMzQ1LDQyMzgsCiAgMTgsMTE2MywgODExLCA2ODUsMjIwOCwxMjE3LCA0MjUsMTMxMiwxNTA4LDExNzUsNDMwOCwyNTUyLDEwMzMsIDU4NywxMzgxLDMwNTksCjI5ODQsMzQ4MiwgMzQwLDEzMTYsNDAyMywzOTcyLCA3OTIsMzE3NiwgNTE5LCA3NzcsNDY5MCwgOTE4LCA5MzMsNDEzMCwyOTgxLDM3NDEsCiAgOTAsMzM2MCwyOTExLDIyMDAsNTE4NCw0NTUwLCA2MDksMzA3OSwyMDMwLCAyNzIsMzM3OSwyNzM2LCAzNjMsMzg4MSwxMTMwLDE0NDcsCiAyODYsIDc3OSwgMzU3LDExNjksMzM1MCwzMTM3LDE2MzAsMTIyMCwyNjg3LDIzOTEsIDc0NywxMjc3LDM2ODgsMjYxOCwyNjgyLDI2MDEsCjExNTYsMzE5Niw1MjkwLDQwMzQsMzEwMiwxNjg5LDM1OTYsMzEyOCwgODc0LCAyMTksMjc4MywgNzk4LCA1MDgsMTg0MywyNDYxLCAyNjksCjE2NTgsMTc3NiwxMzkyLDE5MTMsMjk4MywzMjg3LDI4NjYsMjE1OSwyMzcyLCA4MjksNDA3NiwgIDQ2LDQyNTMsMjg3MywxODg5LDE4OTQsCiA5MTUsMTgzNCwxNjMxLDIxODEsMjMxOCwgMjk4LCA2NjQsMjgxOCwzNTU1LDI3MzUsIDk1NCwzMjI4LDMxMTcsIDUyNywzNTExLDIxNzMsCiA2ODEsMjcxMiwzMDMzLDIyNDcsMjM0NiwzNDY3LDE2NTIsIDE1NSwyMTY0LDMzODIsIDExMywxOTk0LCA0NTAsIDg5OSwgNDk0LCA5OTQsCjEyMzcsMjk1OCwxODc1LDIzMzYsMTkyNiwzNzI3LCA1NDUsMTU3NywxNTUwLCA2MzMsMzQ3MywgMjA0LDEzMDUsMzA3MiwyNDEwLDE5NTYsCjI0NzEsIDcwNywyMTM0LCA4NDEsMjE5NSwyMTk2LDI2NjMsMzg0MywxMDI2LDQ5NDAsIDk5MCwzMjUyLDQ5OTcsIDM2OCwxMDkyLCA0MzcsCjMyMTIsMzI1OCwxOTMzLDE4MjksIDY3NSwyOTc3LDI4OTMsIDQxMiwgOTQzLDM3MjMsNDY0NCwzMjk0LDMyODMsMjIzMCwyMzczLDUxNTQsCjIzODksMjI0MSwyNjYxLDIzMjMsMTQwNCwyNTI0LCA1OTMsIDc4NywgNjc3LDMwMDgsMTI3NSwyMDU5LCA0MzgsMjcwOSwyNjA5LDIyNDAsCjIyNjksMjI0NiwxNDQ2LCAgMzYsMTU2OCwxMzczLDM4OTIsMTU3NCwyMzAxLDE0NTYsMzk2MiwgNjkzLDIyNzYsNTIxNiwyMDM1LDExNDMsCjI3MjAsMTkxOSwxNzk3LDE4MTEsMjc2Myw0MTM3LDI1OTcsMTgzMCwxNjk5LDE0ODgsMTE5OCwyMDkwLCA0MjQsMTY5NCwgMzEyLDM2MzQsCjMzOTAsNDE3OSwzMzM1LDIyNTIsMTIxNCwgNTYxLDEwNTksMzI0MywyMjk1LDI1NjEsIDk3NSw1MTU1LDIzMjEsMjc1MSwzNzcyLCA0NzIsCjE1MzcsMzI4MiwzMzk4LDEwNDcsMjA3NywyMzQ4LDI4NzgsMTMyMywzMzQwLDMwNzYsIDY5MCwyOTA2LCAgNTEsIDM2OSwgMTcwLDM1NDEsCjEwNjAsMjE4NywyNjg4LDM2NzAsMjU0MSwxMDgzLDE2ODMsIDkyOCwzOTE4LCA0NTksIDEwOSw0NDI3LCA1OTksMzc0NCw0Mjg2LCAxNDMsCjIxMDEsMjczMCwyNDkwLCAgODIsMTU4OCwzMDM2LDIxMjEsIDI4MSwxODYwLCA0NzcsNDAzNSwxMjM4LDI4MTIsMzAyMCwyNzE2LDMzMTIsCjE1MzAsMjE4OCwyMDU1LDEzMTcsIDg0MywgNjM2LDE4MDgsMTE3MywzNDk1LCA2NDksIDE4MSwxMDAyLCAxNDcsMzY0MSwxMTU5LDI0MTQsCjM3NTAsMjI4OSwyNzk1LCA4MTMsMzEyMywyNjEwLDExMzYsNDM2OCwgICA1LDMzOTEsNDU0MSwyMTc0LCA0MjAsIDQyOSwxNzI4LCA3NTQsCjEyMjgsMjExNSwyMjE5LCAzNDcsMjIyMywyNzMzLCA3MzUsMTUxOCwzMDAzLDIzNTUsMzEzNCwxNzY0LDM5NDgsMzMyOSwxODg4LDI0MjQsCjEwMDEsMTIzNCwxOTcyLDMzMjEsMzM2MywxNjcyLDEwMjEsMTQ1MCwxNTg0LCAyMjYsIDc2NSwgNjU1LDI1MjYsMzQwNCwzMjQ0LDIzMDIsCjM2NjUsIDczMSwgNTk0LDIxODQsIDMxOSwxNTc2LCA2MjEsIDY1OCwyNjU2LDQyOTksMjA5OSwzODY0LDEyNzksMjA3MSwyNTk4LDI3MzksCiA3OTUsMzA4NiwzNjk5LDM5MDgsMTcwNywyMzUyLDI0MDIsMTM4MiwzMTM2LDI0NzUsMTQ2NSw0ODQ3LDM0OTYsMzg2NSwxMDg1LDMwMDQsCjI1OTEsMTA4NCwgMjEzLDIyODcsMTk2MywzNTY1LDIyNTAsIDgyMiwgNzkzLDQ1NzQsMzE4NywxNzcyLDE3ODksMzA1MCwgNTk1LDE0ODQsCjE5NTksMjc3MCwxMDgwLDI2NTAsIDQ1NiwgNDIyLDI5OTYsIDk0MCwzMzIyLDQzMjgsNDM0NSwzMDkyLDI3NDIsIDk2NSwyNzg0LCA3MzksCjQxMjQsIDk1MiwxMzU4LDI0OTgsMjk0OSwyNTY1LCAzMzIsMjY5OCwyMzc4LCA2NjAsMjI2MCwyNDczLDQxOTQsMzg1NiwyOTE5LCA1MzUsCjEyNjAsMjY1MSwxMjA4LDE0MjgsMTMwMCwxOTQ5LDEzMDMsMjk0MiwgNDMzLDI0NTUsMjQ1MCwxMjUxLDE5NDYsIDYxNCwxMjY5LCA2NDEsCjEzMDYsMTgxMCwyNzM3LDMwNzgsMjkxMiwgNTY0LDIzNjUsMTQxOSwxNDE1LDE0OTcsNDQ2MCwyMzY3LDIxODUsMTM3OSwzMDA1LDEzMDcsCjMyMTgsMjE3NSwxODk3LDMwNjMsIDY4MiwxMTU3LDQwNDAsNDAwNSwxNzEyLDExNjAsMTk0MSwxMzk5LCAzOTQsIDQwMiwyOTUyLDE1NzMsCjExNTEsMjk4NiwyNDA0LCA4NjIsIDI5OSwyMDMzLDE0ODksMzAwNiwgMzQ2LCAxNzEsMjg4NiwzNDAxLDE3MjYsMjkzMiwgMTY4LDI1MzMsCiAgNDcsMjUwNywxMDMwLDM3MzUsMTE0NSwzMzcwLDEzOTUsMTMxOCwxNTc5LDM2MDksNDU2MCwyODU3LDQxMTYsMTQ1NywyNTI5LDE5NjUsCiA1MDQsMTAzNiwyNjkwLDI5ODgsMjQwNSwgNzQ1LDU4NzEsIDg0OSwyMzk3LDIwNTYsMzA4MSwgODYzLDIzNTksMzg1NywyMDk2LCAgOTksCjEzOTcsMTc2OSwyMzAwLDQ0MjgsMTY0MywzNDU1LDE5NzgsMTc1NywzNzE4LDE0NDAsICAzNSw0ODc5LDM3NDIsMTI5Niw0MjI4LDIyODAsCiAxNjAsNTA2MywxNTk5LDIwMTMsIDE2NiwgNTIwLDM0NzksMTY0NiwzMzQ1LDMwMTIsIDQ5MCwxOTM3LDE1NDUsMTI2NCwyMTgyLDI1MDUsCjEwOTYsMTE4OCwxMzY5LDE0MzYsMjQyMSwxNjY3LDI3OTIsMjQ2MCwxMjcwLDIxMjIsIDcyNywzMTY3LDIxNDMsIDgwNiwxNzA2LDEwMTIsCjE4MDAsMzAzNywgOTYwLDIyMTgsMTg4MiwgODA1LCAxMzksMjQ1NiwxMTM5LDE1MjEsIDg1MSwxMDUyLDMwOTMsMzA4OSwgMzQyLDIwMzksCiA3NDQsNTA5NywxNDY4LDE1MDIsMTU4NSwyMDg3LCAyMjMsIDkzOSwgMzI2LDIxNDAsMjU3NywgODkyLDI0ODEsMTYyMyw0MDc3LCA5ODIsCjM3MDgsIDEzNSwyMTMxLCAgODcsMjUwMywzMTE0LDIzMjYsMTEwNiwgODc2LDE2MTYsIDU0NywyOTk3LDI4MzEsMjA5MywzNDQxLDQ1MzAsCjQzMTQsICAgOSwzMjU2LDQyMjksNDE0OCwgNjU5LDE0NjIsMTk4NiwxNzEwLDIwNDYsMjkxMywyMjMxLDQwOTAsNDg4MCw1MjU1LDMzOTIsCjMyNzQsMTM2OCwzNjg5LDQ2NDUsMTQ3NywgNzA1LDMzODQsMzYzNSwxMDY4LDE1MjksMjk0MSwxNDU4LDM3ODIsMTUwOSwgMTAwLDE2NTYsCjI1NDgsIDcxOCwyMzM5LCA0MDgsMTU5MCwyNzgwLDM1NDgsMTgzOCw0MTE3LDM3MTksMTM0NSwzNTMwLCA3MTcsMzQ0MiwyNzc4LDMyMjAsCjI4OTgsMTg5Miw0NTkwLDM2MTQsMzM3MSwyMDQzLDE5OTgsMTIyNCwzNDgzLCA4OTEsIDYzNSwgNTg0LDI1NTksMzM1NSwgNzMzLDE3NjYsCjE3MjksMTE3MiwzNzg5LDE4OTEsMjMwNywgNzgxLDI5ODIsMjI3MSwxOTU3LDE1ODAsNTc3MywyNjMzLDIwMDUsNDE5NSwzMDk3LDE1MzUsCjMyMTMsMTE4OSwxOTM0LDU2OTMsMzI2MiwgNTg2LDMxMTgsMTMyNCwxNTk4LCA1MTcsMTU2NCwyMjE3LDE4NjgsMTg5Myw0NDQ1LDM3MjgsCjI3MDMsMzEzOSwxNTI2LDE3ODcsMTk5MiwzODgyLDI4NzUsMTU0OSwxMTk5LDEwNTYsMjIyNCwxOTA0LDI3MTEsNTA5OCw0Mjg3LCAzMzgsCjE5OTMsMzEyOSwzNDg5LDI2ODksMTgwOSwyODE1LDE5OTcsIDk1NywxODU1LDM4OTgsMjU1MCwzMjc1LDMwNTcsMTEwNSwxMzE5LCA2MjcsCjE1MDUsMTkxMSwxODgzLDM1MjYsIDY5OCwzNjI5LDM0NTYsMTgzMywxNDMxLCA3NDYsICA3NywxMjYxLDIwMTcsMjI5NiwxOTc3LDE4ODUsCiAxMjUsMTMzNCwxNjAwLCA1MjUsMTc5OCwxMTA5LDIyMjIsMTQ3MCwxOTQ1LCA1NTksMjIzNiwxMTg2LDM0NDMsMjQ3NiwxOTI5LDE0MTEsCjI0MTEsMzEzNSwxNzc3LDMzNzIsMjYyMSwxODQxLDE2MTMsMzIyOSwgNjY4LDE0MzAsMTgzOSwyNjQzLDI5MTYsIDE5NSwxOTg5LDI2NzEsCjIzNTgsMTM4NywgNjI5LDMyMDUsMjI5Myw1MjU2LDQ0MzksIDEyMywxMzEwLCA4ODgsMTg3OSw0MzAwLDMwMjEsMzYwNSwxMDAzLDExNjIsCjMxOTIsMjkxMCwyMDEwLCAxNDAsMjM5NSwyODU5LCAgNTUsMTA4MiwyMDEyLDI5MDEsIDY2MiwgNDE5LDIwODEsMTQzOCwgNjgwLDI3NzQsCjQ2NTQsMzkxMiwxNjIwLDE3MzEsMTYyNSw1MDM1LDQwNjUsMjMyOCwgNTEyLDEzNDQsIDgwMiw1NDQzLDIxNjMsMjMxMSwyNTM3LCA1MjQsCjMzOTksICA5OCwxMTU1LDIxMDMsMTkxOCwyNjA2LDM5MjUsMjgxNiwxMzkzLDI0NjUsMTUwNCwzNzczLDIxNzcsMzk2MywxNDc4LDQzNDYsCiAxODAsMTExMyw0NjU1LDM0NjEsMjAyOCwxNjk4LCA4MzMsMjY5NiwxMjM1LDEzMjIsMTU5NCw0NDA4LDM2MjMsMzAxMywzMjI1LDIwNDAsCjMwMjIsIDU0MSwyODgxLCA2MDcsMzYzMiwyMDI5LDE2NjUsMTIxOSwgNjM5LDEzODUsMTY4NiwxMDk5LDI4MDMsMzIzMSwxOTM4LDMxODgsCjI4NTgsIDQyNywgNjc2LDI3NzIsMTE2OCwyMDI1LCA0NTQsMzI1MywyNDg2LDM1NTYsIDIzMCwxOTUwLCA1ODAsIDc5MSwxOTkxLDEyODAsCjEwODYsMTk3NCwyMDM0LCA2MzAsIDI1NywzMzM4LDI3ODgsNDkwMywxMDE3LCAgODYsNDc5MCwgOTY2LDI3ODksMTk5NSwxNjk2LDExMzEsCiAyNTksMzA5NSw0MTg4LDEzMDgsIDE3OSwxNDYzLDUyNTcsIDI4OSw0MTA3LDEyNDgsICA0MiwzNDEzLDE3MjUsMjI4OCwgODk2LDE5NDcsCiA3NzQsNDQ3NCw0MjU0LCA2MDQsMzQzMCw0MjY0LCAzOTIsMjUxNCwyNTg4LCA0NTIsIDIzNywxNDA4LDMwMTgsIDk4OCw0NTMxLDE5NzAsCjMwMzQsMzMxMCwgNTQwLDIzNzAsMTU2MiwxMjg4LDI5OTAsIDUwMiw0NzY1LDExNDcsICAgNCwxODUzLDI3MDgsIDIwNywgMjk0LDI4MTQsCjQwNzgsMjkwMiwyNTA5LCA2ODQsICAzNCwzMTA1LDM1MzIsMjU1MSwgNjQ0LCA3MDksMjgwMSwyMzQ0LCA1NzMsMTcyNywzNTczLDM1NTcsCjIwMjEsMTA4MSwzMTAwLDQzMTUsMjEwMCwzNjgxLCAxOTksMjI2MywxODM3LDIzODUsIDE0NiwzNDg0LDExOTUsMjc3NiwzOTQ5LCA5OTcsCjE5MzksMzk3MywxMDA4LDEwOTEsMTIwMiwxOTYyLDE4NDcsMTE0OSw0MjA5LDU0NDQsMTA3NiwgNDkzLCAxMTcsNTQwMCwyNTIxLCA5NzIsCjE0OTAsMjkzNCwxNzk2LDQ1NDIsMjM3NCwxNTEyLDI5MzMsMjY1NywgNDEzLDI4ODgsMTEzNSwyNzYyLDIzMTQsMjE1NiwxMzU1LDIzNjksCiA3NjYsMjAwNywyNTI3LDIxNzAsMzEyNCwyNDkxLDI1OTMsMjYzMiw0NzU3LDI0MzcsIDIzNCwzMTI1LDM1OTEsMTg5OCwxNzUwLDEzNzYsCjE5NDIsMzQ2OCwzMTM4LCA1NzAsMjEyNywyMTQ1LDMyNzYsNDEzMSwgOTYyLCAxMzIsMTQ0NSw0MTk2LCAgMTksIDk0MSwzNjI0LDM0ODAsCjMzNjYsMTk3MywxMzc0LDQ0NjEsMzQzMSwyNjI5LCAyODMsMjQxNSwyMjc1LCA4MDgsMjg4NywzNjIwLDIxMTIsMjU2MywxMzUzLDM2MTAsCiA5NTUsMTA4OSwzMTAzLDEwNTMsICA5NiwgIDg4LDQwOTcsIDgyMywzODA4LDE1ODMsIDM5OSwgMjkyLDQwOTEsMzMxMywgNDIxLDExMjgsCiA2NDIsNDAwNiwgOTAzLDI1MzksMTg3NywyMDgyLCA1OTYsICAyOSw0MDY2LDE3OTAsIDcyMiwyMTU3LCAxMzAsIDk5NSwxNTY5LCA3NjksCjE0ODUsIDQ2NCwgNTEzLDIyMTMsIDI4OCwxOTIzLDExMDEsMjQ1Myw0MzE2LCAxMzMsIDQ4NiwyNDQ1LCAgNTAsIDYyNSwgNDg3LDIyMDcsCiAgNTcsIDQyMywgNDgxLDI5NjIsIDE1OSwzNzI5LDE1NTgsIDQ5MSwgMzAzLCA0ODIsIDUwMSwgMjQwLDI4MzcsIDExMiwzNjQ4LDIzOTIsCjE3ODMsIDM2MiwgICA4LDM0MzMsMzQyMiwgNjEwLDI3OTMsMzI3NywxMzkwLDEyODQsMTY1NCwgIDIxLDM4MjMsIDczNCwgMzY3LCA2MjMsCiAxOTMsIDI4NywgMzc0LDEwMDksMTQ4MywgODE2LCA0NzYsIDMxMywyMjU1LDIzNDAsMTI2MiwyMTUwLDI4OTksMTE0NiwyNTgxLCA3ODIsCjIxMTYsMTY1OSwyMDE4LDE4ODAsIDI1NSwzNTg2LDMzMTQsMTExMCwyODY3LDIxMzcsMjU2NCwgOTg2LDI3NjcsNTE4NSwyMDA2LCA2NTAsCiAxNTgsIDkyNiwgNzYyLCA4ODEsMzE1NywyNzE3LDIzNjIsMzU4NywgMzA2LDM2OTAsMzI0NSwxNTQyLDMwNzcsMjQyNywxNjkxLDI0NzgsCjIxMTgsMjk4NSwzNDkwLDI0MzgsIDUzOSwyMzA1LCA5ODMsIDEyOSwxNzU0LCAzNTUsNDIwMSwyMzg2LCA4MjcsMjkyMywgMTA0LDE3NzMsCjI4MzgsMjc3MSwgNDExLDI5MDUsMzkxOSwgMzc2LCA3NjcsIDEyMiwxMTE0LCA4MjgsMjQyMiwxODE3LDM1MDYsIDI2NiwzNDYwLDEwMDcsCjE2MDksNDk5OCwgOTQ1LDI2MTIsNDQyOSwyMjc0LCA3MjYsMTI0NywxOTY0LDI5MTQsMjE5OSwyMDcwLDQwMDIsNDEwOCwgNjU3LDMzMjMsCjE0MjIsIDU3OSwgNDU1LDI3NjQsNDczNywxMjIyLDI4OTUsMTY3MCwgODI0LDEyMjMsMTQ4NywyNTI1LCA1NTgsIDg2MSwzMDgwLCA1OTgsCjI2NTksMjUxNSwxOTY3LCA3NTIsMjU4MywyMzc2LDIyMTQsNDE4MCwgOTc3LCA3MDQsMjQ2NCw0OTk5LDI2MjIsNDEwOSwxMjEwLDI5NjEsCiA4MTksMTU0MSwgMTQyLDIyODQsICA0NCwgNDE4LCA0NTcsMTEyNiwzNzMwLDQzNDcsNDYyNiwxNjQ0LDE4NzYsMzY3MSwxODY0LCAzMDIsCjEwNjMsNTY5NCwgNjI0LCA3MjMsMTk4NCwzNzQ1LDEzMTQsMTY3NiwyNDg4LDE2MTAsMTQ0OSwzNTU4LDM1NjksMjE2NiwyMDk4LCA0MDksCjEwMTEsMjMyNSwzNzA0LDIzMDYsIDgxOCwxNzMyLDEzODMsMTgyNCwxODQ0LDM3NTcsIDk5OSwyNzA1LDM0OTcsMTIxNiwxNDIzLDI2ODMsCjI0MjYsMjk1NCwyNTAxLDI3MjYsMjIyOSwxNDc1LDI1NTQsNTA2NCwxOTcxLDE3OTQsMTY2NiwyMDE0LDEzNDMsIDc4MywgNzI0LCAxOTEsCjI0MzQsMTM1NCwyMjIwLDUwNjUsMTc2MywyNzUyLDI0NzIsNDE1MiwgMTMxLCAxNzUsMjg4NSwzNDM0LCAgOTIsMTQ2Niw0OTIwLDI2MTYsCjM4NzEsMzg3MiwzODY2LCAxMjgsMTU1MSwxNjMyLCA2NjksMTg1NCwzNjgyLDQ2OTEsNDEyNSwxMjMwLCAxODgsMjk3MywzMjkwLDEzMDIsCjEyMTMsIDU2MCwzMjY2LCA5MTcsIDc2MywzOTA5LDMyNDksMTc2MCwgODY4LDE5NTgsIDc2NCwxNzgyLDIwOTcsIDE0NSwyMjc3LDM3NzQsCjQ0NjIsICA2NCwxNDkxLDMwNjIsIDk3MSwyMTMyLDM2MDYsMjQ0MiwgMjIxLDEyMjYsMTYxNywgMjE4LCAzMjMsMTE4NSwzMjA3LDMxNDcsCiA1NzEsIDYxOSwxNDczLDEwMDUsMTc0NCwyMjgxLCA0NDksMTg4NywyMzk2LDM2ODUsIDI3NSwgMzc1LDM4MTYsMTc0MywzODQ0LDM3MzEsCiA4NDUsMTk4MywyMzUwLDQyMTAsMTM3NywgNzczLCA5NjcsMzQ5OSwzMDUyLDM3NDMsMjcyNSw0MDA3LDE2OTcsMTAyMiwzOTQzLDE0NjQsCjMyNjQsMjg1NSwyNzIyLDE5NTIsMTAyOSwyODM5LDI0NjcsICA4NCw0MzgzLDIyMTUsIDgyMCwxMzkxLDIwMTUsMjQ0OCwzNjcyLCAzNzcsCjE5NDgsMjE2OCwgNzk3LDI1NDUsMzUzNiwyNTc4LDI2NDUsICA5NCwyODc0LDE2NzgsIDQwNSwxMjU5LDMwNzEsIDc3MSwgNTQ2LDEzMTUsCiA0NzAsMTI0MywzMDgzLCA4OTUsMjQ2OCwgOTgxLCA5NjksMjAzNywgODQ2LDQxODEsIDY1MywxMjc2LDI5MjgsICAxNCwyNTk0LCA1NTcsCjMwMDcsMjQ3NCwgMTU2LCA5MDIsMTMzOCwxNzQwLDI1NzQsIDUzNywyNTE4LCA5NzMsMjI4MiwyMjE2LDI0MzMsMTkyOCwgMTM4LDI5MDMsCjEyOTMsMjYzMSwxNjEyLCA2NDYsMzQ1NywgODM5LDI5MzUsIDExMSwgNDk2LDIxOTEsMjg0NywgNTg5LDMxODYsIDE0OSwzOTk0LDIwNjAsCjQwMzEsMjY0MSw0MDY3LDMxNDUsMTg3MCwgIDM3LDM1OTcsMjEzNiwxMDI1LDIwNTEsMzAwOSwzMzgzLDM1NDksMTEyMSwxMDE2LDMyNjEsCjEzMDEsIDI1MSwyNDQ2LDI1OTksMjE1MywgODcyLDMyNDYsIDYzNywgMzM0LDM3MDUsIDgzMSwgODg0LCA5MjEsMzA2NSwzMTQwLDQwOTIsCjIxOTgsMTk0NCwgMjQ2LDI5NjQsIDEwOCwyMDQ1LDExNTIsMTkyMSwyMzA4LDEwMzEsIDIwMywzMTczLDQxNzAsMTkwNywzODkwLCA4MTAsCjE0MDEsMjAwMywxNjkwLCA1MDYsIDY0NywxMjQyLDI4MjgsMTc2MSwxNjQ5LDMyMDgsMjI0OSwxNTg5LDM3MDksMjkzMSw1MTU2LDE3MDgsCiA0OTgsIDY2NiwyNjEzLCA4MzQsMzgxNywxMjMxLCAxODQsMjg1MSwxMTI0LCA4ODMsMzE5NywyMjYxLDM3MTAsMTc2NSwxNTUzLDI2NTgsCjExNzgsMjYzOSwyMzUxLCAgOTMsMTE5MywgOTQyLDI1MzgsMjE0MSw0NDAyLCAyMzUsMTgyMSwgODcwLDE1OTEsMjE5MiwxNzA5LDE4NzEsCjMzNDEsMTYxOCw0MTI2LDI1OTUsMjMzNCwgNjAzLCA2NTEsICA2OSwgNzAxLCAyNjgsMjY2MiwzNDExLDI1NTUsMTM4MCwxNjA2LCA1MDMsCiA0NDgsIDI1NCwyMzcxLDI2NDYsIDU3NCwxMTg3LDIzMDksMTc3MCwgMzIyLDIyMzUsMTI5MiwxODAxLCAzMDUsIDU2NiwxMTMzLCAyMjksCjIwNjcsMjA1NywgNzA2LCAxNjcsIDQ4MywyMDAyLDI2NzIsMzI5NSwxODIwLDM1NjEsMzA2NywgMzE2LCAzNzgsMjc0NiwzNDUyLDExMTIsCiAxMzYsMTk4MSwgNTA3LDE2NTEsMjkxNywxMTE3LCAyODUsNDU5MSwgMTgyLDI1ODAsMzUyMiwxMzA0LCAzMzUsMzMwMywxODM1LDI1MDQsCjE3OTUsMTc5MiwyMjQ4LCA2NzQsMTAxOCwyMTA2LDI0NDksMTg1NywyMjkyLDI4NDUsIDk3NiwzMDQ3LDE3ODEsMjYwMCwyNzI3LDEzODksCjEyODEsICA1MiwzMTUyLCAxNTMsIDI2NSwzOTUwLCA2NzIsMzQ4NSwzOTUxLDQ0NjMsIDQzMCwxMTgzLCAzNjUsIDI3OCwyMTY5LCAgMjcsCjE0MDcsMTMzNiwyMzA0LCAyMDksMTM0MCwxNzMwLDIyMDIsMTg1MiwyNDAzLDI4ODMsIDk3OSwxNzM3LDEwNjIsIDYzMSwyODI5LDI1NDIsCjM4NzYsMjU5MiwgODI1LDIwODYsMjIyNiwzMDQ4LDM2MjUsIDM1MiwxNDE3LDM3MjQsIDU0MiwgOTkxLCA0MzEsMTM1MSwzOTM4LDE4NjEsCjIyOTQsIDgyNiwxMzYxLDI5MjcsMzE0MiwzNTAzLDE3MzgsIDQ2MywyNDYyLDI3MjMsIDU4MiwxOTE2LDE1OTUsMjgwOCwgNDAwLDM4NDUsCjM4OTEsMjg2OCwzNjIxLDIyNTQsICA1OCwyNDkyLDExMjMsIDkxMCwyMTYwLDI2MTQsMTM3MiwxNjAzLDExOTYsMTA3MiwzMzg1LDE3MDAsCjMyNjcsMTk4MCwgNjk2LCA0ODAsMjQzMCwgOTIwLCA3OTksMTU3MCwyOTIwLDE5NTEsMjA0MSw0MDQ3LDI1NDAsMTMyMSw0MjIzLDI0NjksCjM1NjIsMjIyOCwxMjcxLDI2MDIsIDQwMSwyODMzLDMzNTEsMjU3NSw1MTU3LCA5MDcsMjMxMiwxMjU2LCA0MTAsIDI2MywzNTA3LDE1ODIsCiA5OTYsIDY3OCwxODQ5LDIzMTYsMTQ4MCwgOTA4LDM1NDUsMjIzNywgNzAzLDIzMjIsIDY2NywxODI2LDI4NDksMTUzMSwyNjA0LDI5OTksCjI0MDcsMzE0NiwyMTUxLDI2MzAsMTc4NiwzNzExLCA0NjksMzU0MiwgNDk3LDM4OTksMjQwOSwgODU4LCA4MzcsNDQ0NiwzMzkzLDEyNzQsCiA3ODYsIDYyMCwxODQ1LDIwMDEsMzMxMSwgNDg0LCAzMDgsMzM2NywxMjA0LDE4MTUsMzY5MSwyMzMyLDE1MzIsMjU1NywxODQyLDIwMjAsCjI3MjQsMTkyNywyMzMzLDQ0NDAsIDU2NywgIDIyLDE2NzMsMjcyOCw0NDc1LDE5ODcsMTg1OCwxMTQ0LDE1OTcsIDEwMSwxODMyLDM2MDEsCiAgMTIsIDk3NCwzNzgzLDQzOTEsIDk1MSwxNDEyLCAgIDEsMzcyMCwgNDUzLDQ2MDgsNDA0MSwgNTI4LDEwNDEsMTAyNywzMjMwLDI2MjgsCjExMjksIDg3NSwxMDUxLDMyOTEsMTIwMywyMjYyLDEwNjksMjg2MCwyNzk5LDIxNDksMjYxNSwzMjc4LCAxNDQsMTc1OCwzMDQwLCAgMzEsCiA0NzUsMTY4MCwgMzY2LDI2ODUsMzE4NCwgMzExLDE2NDIsNDAwOCwyNDY2LDUwMzYsMTU5MywxNDkzLDI4MDksIDIxNiwxNDIwLDE2NjgsCiAyMzMsIDMwNCwyMTI4LDMyODQsIDIzMiwxNDI5LDE3NjgsMTA0MCwyMDA4LDM0MDcsMjc0MCwyOTY3LDI1NDMsIDI0MiwyMTMzLCA3NzgsCjE1NjUsMjAyMiwyNjIwLCA1MDUsMjE4OSwyNzU2LDEwOTgsMjI3MywgMzcyLDE2MTQsIDcwOCwgNTUzLDI4NDYsMjA5NCwyMjc4LCAxNjksCjM2MjYsMjgzNSw0MTYxLCAyMjgsMjY3NCwzMTY1LCA4MDksMTQ1NCwxMzA5LCA0NjYsMTcwNSwxMDk1LCA5MDAsMzQyMywgODgwLDI2NjcsCjM3NTEsNTI1OCwyMzE3LDMxMDksMjU3MSw0MzE3LDI3NjYsMTUwMywxMzQyLCA4NjYsNDQ0NywxMTE4LCAgNjMsMjA3NiwgMzE0LDE4ODEsCjEzNDgsMTA2MSwgMTcyLCA5NzgsMzUxNSwxNzQ3LCA1MzIsIDUxMSwzOTcwLCAgIDYsIDYwMSwgOTA1LDI2OTksMzMwMCwxNzUxLCAyNzYsCjE0NjcsMzcyNSwyNjY4LCAgNjUsNDIzOSwyNTQ0LDI3NzksMjU1NiwxNjA0LCA1NzgsMjQ1MSwxODAyLCA5OTIsMjMzMSwyNjI0LDEzMjAsCjM0NDYsIDcxMywxNTEzLDEwMTMsIDEwMywyNzg2LDI0NDcsMTY2MSwgODg2LDE3MDIsIDkxNiwgNjU0LDM1NzQsMjAzMSwxNTU2LCA3NTEsCjIxNzgsMjgyMSwyMTc5LDE0OTgsMTUzOCwyMTc2LCAyNzEsIDkxNCwyMjUxLDIwODAsMTMyNSwgNjM4LDE5NTMsMjkzNywzODc3LDI0MzIsCjI3NTQsICA5NSwzMjY1LDE3MTYsIDI2MCwxMjI3LDQwODMsIDc3NSwgMTA2LDEzNTcsMzI1NCwgNDI2LDE2MDcsIDU1NSwyNDgwLCA3NzIsCjE5ODUsIDI0NCwyNTQ2LCA0NzQsIDQ5NSwxMDQ2LDI2MTEsMTg1MSwyMDYxLCAgNzEsMjA4OSwxNjc1LDI1OTAsIDc0MiwzNzU4LDI4NDMsCjMyMjIsMTQzMywgMjY3LDIxODAsMjU3NiwyODI2LDIyMzMsMjA5MiwzOTEzLDI0MzUsIDk1NiwxNzQ1LDMwNzUsIDg1NiwyMTEzLDExMTYsCiA0NTEsICAgMywxOTg4LDI4OTYsMTM5OCwgOTkzLDI0NjMsMTg3OCwyMDQ5LDEzNDEsMjcxOCwyNzIxLDI4NzAsMjEwOCwgNzEyLDI5MDQsCjQzNjMsMjc1MywyMzI0LCAyNzcsMjg3MiwyMzQ5LDI2NDksIDM4NCwgOTg3LCA0MzUsIDY5MSwzMDAwLCA5MjIsIDE2NCwzOTM5LCA2NTIsCjE1MDAsMTE4NCw0MTUzLDI0ODIsMzM3MywyMTY1LDQ4NDgsMjMzNSwzNzc1LDM1MDgsMzE1NCwyODA2LDI4MzAsMTU1NCwyMTAyLDE2NjQsCjI1MzAsMTQzNCwyNDA4LCA4OTMsMTU0NywyNjIzLDM0NDcsMjgzMiwyMjQyLDI1MzIsMzE2OSwyODU2LDMyMjMsMjA3OCwgIDQ5LDM3NzAsCjM0NjksIDQ2MiwgMzE4LCA2NTYsMjI1OSwzMjUwLDMwNjksIDY3OSwxNjI5LDI3NTgsIDM0NCwxMTM4LDExMDQsMzEyMCwxODM2LDEyODMsCjMxMTUsMjE1NCwxNDM3LDQ0NDgsIDkzNCwgNzU5LDE5OTksIDc5NCwyODYyLDEwMzgsIDUzMywyNTYwLDE3MjIsMjM0MiwgODU1LDI2MjYsCjExOTcsMTY2Myw0NDc2LDMxMjcsICA4NSw0MjQwLDI1MjgsICAyNSwxMTExLDExODEsMzY3MywgNDA3LDM0NzAsNDU2MSwyNjc5LDI3MTMsCiA3NjgsMTkyNSwyODQxLDM5ODYsMTU0NCwxMTY1LCA5MzIsIDM3MywxMjQwLDIxNDYsMTkzMCwyNjczLCA3MjEsNDc2NiwgMzU0LDQzMzMsCiAzOTEsMjk2MywgMTg3LCAgNjEsMzM2NCwxNDQyLDExMDIsIDMzMCwxOTQwLDE3NjcsIDM0MSwzODA5LDQxMTgsIDM5MywyNDk2LDIwNjIsCjIyMTEsIDEwNSwgMzMxLCAzMDAsIDQzOSwgOTEzLDEzMzIsIDYyNiwgMzc5LDMzMDQsMTU1NywgMzI4LCA2ODksMzk1MiwgMzA5LDE1NTUsCiA5MzEsIDMxNywyNTE3LDMwMjcsIDMyNSwgNTY5LCA2ODYsMjEwNywzMDg0LCAgNjAsMTA0MiwxMzMzLDI3OTQsIDI2NCwzMTc3LDQwMTQsCjE2MjgsIDI1OCwzNzEyLCAgIDcsNDQ2NCwxMTc2LDEwNDMsMTc3OCwgNjgzLCAxMTQsMTk3NSwgIDc4LDE0OTIsIDM4MywxODg2LCA1MTAsCiAzODYsIDY0NSw1MjkxLDI4OTEsMjA2OSwzMzA1LDQxMzgsMzg2NywyOTM5LDI2MDMsMjQ5MywxOTM1LDEwNjYsMTg0OCwzNTg4LDEwMTUsCjEyODIsMTI4OSw0NjA5LCA2OTcsMTQ1MywzMDQ0LDI2NjYsMzYxMSwxODU2LDI0MTIsICA1NCwgNzE5LDEzMzAsIDU2OCwzNzc4LDI0NTksCjE3NDgsIDc4OCwgNDkyLCA1NTEsMTE5MSwxMDAwLCA0ODgsMzM5NCwzNzYzLCAyODIsMTc5OSwgMzQ4LDIwMTYsMTUyMywzMTU1LDIzOTAsCjEwNDksIDM4MiwyMDE5LDE3ODgsMTE3MCwgNzI5LDI5NjgsMzUyMywgODk3LDM5MjYsMjc4NSwyOTM4LDMyOTIsIDM1MCwyMzE5LDMyMzgsCjE3MTgsMTcxNywyNjU1LDM0NTMsMzE0Myw0NDY1LCAxNjEsMjg4OSwyOTgwLDIwMDksMTQyMSwgIDU2LDE5MDgsMTY0MCwyMzg3LDIyMzIsCjE5MTcsMTg3NCwyNDc3LDQ5MjEsIDE0OCwgIDgzLDM0MzgsIDU5Miw0MjQ1LDI4ODIsMTgyMiwxMDU1LCA3NDEsIDExNSwxNDk2LDE2MjQsCiAzODEsMTYzOCw0NTkyLDEwMjAsIDUxNiwzMjE0LCA0NTgsIDk0Nyw0NTc1LDE0MzIsIDIxMSwxNTE0LDI5MjYsMTg2NSwyMTQyLCAxODksCiA4NTIsMTIyMSwxNDAwLDE0ODYsIDg4MiwyMjk5LDQwMzYsIDM1MSwgIDI4LDExMjIsIDcwMCw2NDc5LDY0ODAsNjQ4MSw2NDgyLDY0ODMsICAjbGFzdCA1MTIKKQoKUEsDBBQAAAAAAAAAIQB+q/6P2gYAANoGAAAzAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvZ2IyMzEycHJvYmVyLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgbW96aWxsYS5vcmcgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmZyb20gLm1iY2hhcnNldHByb2JlciBpbXBvcnQgTXVsdGlCeXRlQ2hhclNldFByb2Jlcgpmcm9tIC5jb2RpbmdzdGF0ZW1hY2hpbmUgaW1wb3J0IENvZGluZ1N0YXRlTWFjaGluZQpmcm9tIC5jaGFyZGlzdHJpYnV0aW9uIGltcG9ydCBHQjIzMTJEaXN0cmlidXRpb25BbmFseXNpcwpmcm9tIC5tYmNzc20gaW1wb3J0IEdCMjMxMl9TTV9NT0RFTAoKY2xhc3MgR0IyMzEyUHJvYmVyKE11bHRpQnl0ZUNoYXJTZXRQcm9iZXIpOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHN1cGVyKEdCMjMxMlByb2Jlciwgc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuY29kaW5nX3NtID0gQ29kaW5nU3RhdGVNYWNoaW5lKEdCMjMxMl9TTV9NT0RFTCkKICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbl9hbmFseXplciA9IEdCMjMxMkRpc3RyaWJ1dGlvbkFuYWx5c2lzKCkKICAgICAgICBzZWxmLnJlc2V0KCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjaGFyc2V0X25hbWUoc2VsZik6CiAgICAgICAgcmV0dXJuICJHQjIzMTIiCgogICAgQHByb3BlcnR5CiAgICBkZWYgbGFuZ3VhZ2Uoc2VsZik6CiAgICAgICAgcmV0dXJuICJDaGluZXNlIgpQSwMEFAAAAAAAAAAhAA0p07IONgAADjYAADMAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9oZWJyZXdwcm9iZXIucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBNb3ppbGxhIFVuaXZlcnNhbCBjaGFyc2V0IGRldGVjdG9yIGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyAgICAgICAgICBTaHkgU2hhbG9tCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAwNQojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZnJvbSAuY2hhcnNldHByb2JlciBpbXBvcnQgQ2hhclNldFByb2Jlcgpmcm9tIC5lbnVtcyBpbXBvcnQgUHJvYmluZ1N0YXRlCgojIFRoaXMgcHJvYmVyIGRvZXNuJ3QgYWN0dWFsbHkgcmVjb2duaXplIGEgbGFuZ3VhZ2Ugb3IgYSBjaGFyc2V0LgojIEl0IGlzIGEgaGVscGVyIHByb2JlciBmb3IgdGhlIHVzZSBvZiB0aGUgSGVicmV3IG1vZGVsIHByb2JlcnMKCiMjIyBHZW5lcmFsIGlkZWFzIG9mIHRoZSBIZWJyZXcgY2hhcnNldCByZWNvZ25pdGlvbiAjIyMKIwojIEZvdXIgbWFpbiBjaGFyc2V0cyBleGlzdCBpbiBIZWJyZXc6CiMgIklTTy04ODU5LTgiIC0gVmlzdWFsIEhlYnJldwojICJ3aW5kb3dzLTEyNTUiIC0gTG9naWNhbCBIZWJyZXcKIyAiSVNPLTg4NTktOC1JIiAtIExvZ2ljYWwgSGVicmV3CiMgIngtbWFjLWhlYnJldyIgLSA/PyBMb2dpY2FsIEhlYnJldyA/PwojCiMgQm90aCAiSVNPIiBjaGFyc2V0cyB1c2UgYSBjb21wbGV0ZWx5IGlkZW50aWNhbCBzZXQgb2YgY29kZSBwb2ludHMsIHdoZXJlYXMKIyAid2luZG93cy0xMjU1IiBhbmQgIngtbWFjLWhlYnJldyIgYXJlIHR3byBkaWZmZXJlbnQgcHJvcGVyIHN1cGVyc2V0cyBvZgojIHRoZXNlIGNvZGUgcG9pbnRzLiB3aW5kb3dzLTEyNTUgZGVmaW5lcyBhZGRpdGlvbmFsIGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlCiMgMHg4MC0weDlGIGFzIHNvbWUgbWlzYyBwdW5jdHVhdGlvbiBtYXJrcyBhcyB3ZWxsIGFzIHNvbWUgSGVicmV3LXNwZWNpZmljCiMgZGlhY3JpdGljcyBhbmQgYWRkaXRpb25hbCAnWWlkZGlzaCcgbGlnYXR1cmUgbGV0dGVycyBpbiB0aGUgcmFuZ2UgMHhjMC0weGQ2LgojIHgtbWFjLWhlYnJldyBkZWZpbmVzIHNpbWlsYXIgYWRkaXRpb25hbCBjb2RlIHBvaW50cyBidXQgd2l0aCBhIGRpZmZlcmVudAojIG1hcHBpbmcuCiMKIyBBcyBmYXIgYXMgYW4gYXZlcmFnZSBIZWJyZXcgdGV4dCB3aXRoIG5vIGRpYWNyaXRpY3MgaXMgY29uY2VybmVkLCBhbGwgZm91cgojIGNoYXJzZXRzIGFyZSBpZGVudGljYWwgd2l0aCByZXNwZWN0IHRvIGNvZGUgcG9pbnRzLiBNZWFuaW5nIHRoYXQgZm9yIHRoZQojIG1haW4gSGVicmV3IGFscGhhYmV0LCBhbGwgZm91ciBtYXAgdGhlIHNhbWUgdmFsdWVzIHRvIGFsbCAyNyBIZWJyZXcgbGV0dGVycwojIChpbmNsdWRpbmcgZmluYWwgbGV0dGVycykuCiMKIyBUaGUgZG9taW5hbnQgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZXNlIGNoYXJzZXRzIGlzIHRoZWlyIGRpcmVjdGlvbmFsaXR5LgojICJWaXN1YWwiIGRpcmVjdGlvbmFsaXR5IG1lYW5zIHRoYXQgdGhlIHRleHQgaXMgb3JkZXJlZCBhcyBpZiB0aGUgcmVuZGVyZXIgaXMKIyBub3QgYXdhcmUgb2YgYSBCSURJIHJlbmRlcmluZyBhbGdvcml0aG0uIFRoZSByZW5kZXJlciBzZWVzIHRoZSB0ZXh0IGFuZAojIGRyYXdzIGl0IGZyb20gbGVmdCB0byByaWdodC4gVGhlIHRleHQgaXRzZWxmIHdoZW4gb3JkZXJlZCBuYXR1cmFsbHkgaXMgcmVhZAojIGJhY2t3YXJkcy4gQSBidWZmZXIgb2YgVmlzdWFsIEhlYnJldyBnZW5lcmFsbHkgbG9va3MgbGlrZSBzbzoKIyAiW2xhc3Qgd29yZCBvZiBmaXJzdCBsaW5lIHNwZWxsZWQgYmFja3dhcmRzXSBbd2hvbGUgbGluZSBvcmRlcmVkIGJhY2t3YXJkcwojIGFuZCBzcGVsbGVkIGJhY2t3YXJkc10gW2ZpcnN0IHdvcmQgb2YgZmlyc3QgbGluZSBzcGVsbGVkIGJhY2t3YXJkc10KIyBbZW5kIG9mIGxpbmVdIFtsYXN0IHdvcmQgb2Ygc2Vjb25kIGxpbmVdIC4uLiBldGMnICIKIyBhZGRpbmcgcHVuY3R1YXRpb24gbWFya3MsIG51bWJlcnMgYW5kIEVuZ2xpc2ggdGV4dCB0byB2aXN1YWwgdGV4dCBpcwojIG5hdHVyYWxseSBhbHNvICJ2aXN1YWwiIGFuZCBmcm9tIGxlZnQgdG8gcmlnaHQuCiMKIyAiTG9naWNhbCIgZGlyZWN0aW9uYWxpdHkgbWVhbnMgdGhlIHRleHQgaXMgb3JkZXJlZCAibmF0dXJhbGx5IiBhY2NvcmRpbmcgdG8KIyB0aGUgb3JkZXIgaXQgaXMgcmVhZC4gSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSByZW5kZXJlciB0byBkaXNwbGF5CiMgdGhlIHRleHQgZnJvbSByaWdodCB0byBsZWZ0LiBBIEJJREkgYWxnb3JpdGhtIGlzIHVzZWQgdG8gcGxhY2UgZ2VuZXJhbAojIHB1bmN0dWF0aW9uIG1hcmtzLCBudW1iZXJzIGFuZCBFbmdsaXNoIHRleHQgaW4gdGhlIHRleHQuCiMKIyBUZXh0cyBpbiB4LW1hYy1oZWJyZXcgYXJlIGFsbW9zdCBpbXBvc3NpYmxlIHRvIGZpbmQgb24gdGhlIEludGVybmV0LiBGcm9tCiMgd2hhdCBsaXR0bGUgZXZpZGVuY2UgSSBjb3VsZCBmaW5kLCBpdCBzZWVtcyB0aGF0IGl0cyBnZW5lcmFsIGRpcmVjdGlvbmFsaXR5CiMgaXMgTG9naWNhbC4KIwojIFRvIHN1bSB1cCBhbGwgb2YgdGhlIGFib3ZlLCB0aGUgSGVicmV3IHByb2JpbmcgbWVjaGFuaXNtIGtub3dzIGFib3V0IHR3bwojIGNoYXJzZXRzOgojIFZpc3VhbCBIZWJyZXcgLSAiSVNPLTg4NTktOCIgLSBiYWNrd2FyZHMgdGV4dCAtIFdvcmRzIGFuZCBzZW50ZW5jZXMgYXJlCiMgICAgYmFja3dhcmRzIHdoaWxlIGxpbmUgb3JkZXIgaXMgbmF0dXJhbC4gRm9yIGNoYXJzZXQgcmVjb2duaXRpb24gcHVycG9zZXMKIyAgICB0aGUgbGluZSBvcmRlciBpcyB1bmltcG9ydGFudCAoSW4gZmFjdCwgZm9yIHRoaXMgaW1wbGVtZW50YXRpb24sIGV2ZW4KIyAgICB3b3JkIG9yZGVyIGlzIHVuaW1wb3J0YW50KS4KIyBMb2dpY2FsIEhlYnJldyAtICJ3aW5kb3dzLTEyNTUiIC0gbm9ybWFsLCBuYXR1cmFsbHkgb3JkZXJlZCB0ZXh0LgojCiMgIklTTy04ODU5LTgtSSIgaXMgYSBzdWJzZXQgb2Ygd2luZG93cy0xMjU1IGFuZCBkb2Vzbid0IG5lZWQgdG8gYmUKIyAgICBzcGVjaWZpY2FsbHkgaWRlbnRpZmllZC4KIyAieC1tYWMtaGVicmV3IiBpcyBhbHNvIGlkZW50aWZpZWQgYXMgd2luZG93cy0xMjU1LiBBIHRleHQgaW4geC1tYWMtaGVicmV3CiMgICAgdGhhdCBjb250YWluIHNwZWNpYWwgcHVuY3R1YXRpb24gbWFya3Mgb3IgZGlhY3JpdGljcyBpcyBkaXNwbGF5ZWQgd2l0aAojICAgIHNvbWUgdW5jb252ZXJ0ZWQgY2hhcmFjdGVycyBzaG93aW5nIGFzIHF1ZXN0aW9uIG1hcmtzLiBUaGlzIHByb2JsZW0gbWlnaHQKIyAgICBiZSBjb3JyZWN0ZWQgdXNpbmcgYW5vdGhlciBtb2RlbCBwcm9iZXIgZm9yIHgtbWFjLWhlYnJldy4gRHVlIHRvIHRoZSBmYWN0CiMgICAgdGhhdCB4LW1hYy1oZWJyZXcgdGV4dHMgYXJlIHNvIHJhcmUsIHdyaXRpbmcgYW5vdGhlciBtb2RlbCBwcm9iZXIgaXNuJ3QKIyAgICB3b3J0aCB0aGUgZWZmb3J0IGFuZCBwZXJmb3JtYW5jZSBoaXQuCiMKIyMjIyBUaGUgUHJvYmVyICMjIyMKIwojIFRoZSBwcm9iZXIgaXMgZGl2aWRlZCBiZXR3ZWVuIHR3byBTQkNoYXJTZXRQcm9iZXJzIGFuZCBhIEhlYnJld1Byb2JlciwKIyBhbGwgb2Ygd2hpY2ggYXJlIG1hbmFnZWQsIGNyZWF0ZWQsIGZlZCBkYXRhLCBpbnF1aXJlZCBhbmQgZGVsZXRlZCBieSB0aGUKIyBTQkNTR3JvdXBQcm9iZXIuIFRoZSB0d28gU0JDaGFyU2V0UHJvYmVycyBpZGVudGlmeSB0aGF0IHRoZSB0ZXh0IGlzIGluCiMgZmFjdCBzb21lIGtpbmQgb2YgSGVicmV3LCBMb2dpY2FsIG9yIFZpc3VhbC4gVGhlIGZpbmFsIGRlY2lzaW9uIGFib3V0IHdoaWNoCiMgb25lIGlzIGl0IGlzIG1hZGUgYnkgdGhlIEhlYnJld1Byb2JlciBieSBjb21iaW5pbmcgZmluYWwtbGV0dGVyIHNjb3JlcwojIHdpdGggdGhlIHNjb3JlcyBvZiB0aGUgdHdvIFNCQ2hhclNldFByb2JlcnMgdG8gcHJvZHVjZSBhIGZpbmFsIGFuc3dlci4KIwojIFRoZSBTQkNTR3JvdXBQcm9iZXIgaXMgcmVzcG9uc2libGUgZm9yIHN0cmlwcGluZyB0aGUgb3JpZ2luYWwgdGV4dCBvZiBIVE1MCiMgdGFncywgRW5nbGlzaCBjaGFyYWN0ZXJzLCBudW1iZXJzLCBsb3ctQVNDSUkgcHVuY3R1YXRpb24gY2hhcmFjdGVycywgc3BhY2VzCiMgYW5kIG5ldyBsaW5lcy4gSXQgcmVkdWNlcyBhbnkgc2VxdWVuY2Ugb2Ygc3VjaCBjaGFyYWN0ZXJzIHRvIGEgc2luZ2xlIHNwYWNlLgojIFRoZSBidWZmZXIgZmVkIHRvIGVhY2ggcHJvYmVyIGluIHRoZSBTQkNTIGdyb3VwIHByb2JlciBpcyBwdXJlIHRleHQgaW4KIyBoaWdoLUFTQ0lJLgojIFRoZSB0d28gU0JDaGFyU2V0UHJvYmVycyAobW9kZWwgcHJvYmVycykgc2hhcmUgdGhlIHNhbWUgbGFuZ3VhZ2UgbW9kZWw6CiMgV2luMTI1NU1vZGVsLgojIFRoZSBmaXJzdCBTQkNoYXJTZXRQcm9iZXIgdXNlcyB0aGUgbW9kZWwgbm9ybWFsbHkgYXMgYW55IG90aGVyCiMgU0JDaGFyU2V0UHJvYmVyIGRvZXMsIHRvIHJlY29nbml6ZSB3aW5kb3dzLTEyNTUsIHVwb24gd2hpY2ggdGhpcyBtb2RlbCB3YXMKIyBidWlsdC4gVGhlIHNlY29uZCBTQkNoYXJTZXRQcm9iZXIgaXMgdG9sZCB0byBtYWtlIHRoZSBwYWlyLW9mLWxldHRlcgojIGxvb2t1cCBpbiB0aGUgbGFuZ3VhZ2UgbW9kZWwgYmFja3dhcmRzLiBUaGlzIGluIHByYWN0aWNlIGV4YWN0bHkgc2ltdWxhdGVzCiMgYSB2aXN1YWwgSGVicmV3IG1vZGVsIHVzaW5nIHRoZSB3aW5kb3dzLTEyNTUgbG9naWNhbCBIZWJyZXcgbW9kZWwuCiMKIyBUaGUgSGVicmV3UHJvYmVyIGlzIG5vdCB1c2luZyBhbnkgbGFuZ3VhZ2UgbW9kZWwuIEFsbCBpdCBkb2VzIGlzIGxvb2sgZm9yCiMgZmluYWwtbGV0dGVyIGV2aWRlbmNlIHN1Z2dlc3RpbmcgdGhlIHRleHQgaXMgZWl0aGVyIGxvZ2ljYWwgSGVicmV3IG9yIHZpc3VhbAojIEhlYnJldy4gRGlzam9pbnRlZCBmcm9tIHRoZSBtb2RlbCBwcm9iZXJzLCB0aGUgcmVzdWx0cyBvZiB0aGUgSGVicmV3UHJvYmVyCiMgYWxvbmUgYXJlIG1lYW5pbmdsZXNzLiBIZWJyZXdQcm9iZXIgYWx3YXlzIHJldHVybnMgMC4wMCBhcyBjb25maWRlbmNlCiMgc2luY2UgaXQgbmV2ZXIgaWRlbnRpZmllcyBhIGNoYXJzZXQgYnkgaXRzZWxmLiBJbnN0ZWFkLCB0aGUgcG9pbnRlciB0byB0aGUKIyBIZWJyZXdQcm9iZXIgaXMgcGFzc2VkIHRvIHRoZSBtb2RlbCBwcm9iZXJzIGFzIGEgaGVscGVyICJOYW1lIFByb2JlciIuCiMgV2hlbiB0aGUgR3JvdXAgcHJvYmVyIHJlY2VpdmVzIGEgcG9zaXRpdmUgaWRlbnRpZmljYXRpb24gZnJvbSBhbnkgcHJvYmVyLAojIGl0IGFza3MgZm9yIHRoZSBuYW1lIG9mIHRoZSBjaGFyc2V0IGlkZW50aWZpZWQuIElmIHRoZSBwcm9iZXIgcXVlcmllZCBpcyBhCiMgSGVicmV3IG1vZGVsIHByb2JlciwgdGhlIG1vZGVsIHByb2JlciBmb3J3YXJkcyB0aGUgY2FsbCB0byB0aGUKIyBIZWJyZXdQcm9iZXIgdG8gbWFrZSB0aGUgZmluYWwgZGVjaXNpb24uIEluIHRoZSBIZWJyZXdQcm9iZXIsIHRoZQojIGRlY2lzaW9uIGlzIG1hZGUgYWNjb3JkaW5nIHRvIHRoZSBmaW5hbC1sZXR0ZXJzIHNjb3JlcyBtYWludGFpbmVkIGFuZCBCb3RoCiMgbW9kZWwgcHJvYmVycyBzY29yZXMuIFRoZSBhbnN3ZXIgaXMgcmV0dXJuZWQgaW4gdGhlIGZvcm0gb2YgdGhlIG5hbWUgb2YgdGhlCiMgY2hhcnNldCBpZGVudGlmaWVkLCBlaXRoZXIgIndpbmRvd3MtMTI1NSIgb3IgIklTTy04ODU5LTgiLgoKY2xhc3MgSGVicmV3UHJvYmVyKENoYXJTZXRQcm9iZXIpOgogICAgIyB3aW5kb3dzLTEyNTUgLyBJU08tODg1OS04IGNvZGUgcG9pbnRzIG9mIGludGVyZXN0CiAgICBGSU5BTF9LQUYgPSAweGVhCiAgICBOT1JNQUxfS0FGID0gMHhlYgogICAgRklOQUxfTUVNID0gMHhlZAogICAgTk9STUFMX01FTSA9IDB4ZWUKICAgIEZJTkFMX05VTiA9IDB4ZWYKICAgIE5PUk1BTF9OVU4gPSAweGYwCiAgICBGSU5BTF9QRSA9IDB4ZjMKICAgIE5PUk1BTF9QRSA9IDB4ZjQKICAgIEZJTkFMX1RTQURJID0gMHhmNQogICAgTk9STUFMX1RTQURJID0gMHhmNgoKICAgICMgTWluaW11bSBWaXN1YWwgdnMgTG9naWNhbCBmaW5hbCBsZXR0ZXIgc2NvcmUgZGlmZmVyZW5jZS4KICAgICMgSWYgdGhlIGRpZmZlcmVuY2UgaXMgYmVsb3cgdGhpcywgZG9uJ3QgcmVseSBzb2xlbHkgb24gdGhlIGZpbmFsIGxldHRlciBzY29yZQogICAgIyBkaXN0YW5jZS4KICAgIE1JTl9GSU5BTF9DSEFSX0RJU1RBTkNFID0gNQoKICAgICMgTWluaW11bSBWaXN1YWwgdnMgTG9naWNhbCBtb2RlbCBzY29yZSBkaWZmZXJlbmNlLgogICAgIyBJZiB0aGUgZGlmZmVyZW5jZSBpcyBiZWxvdyB0aGlzLCBkb24ndCByZWx5IGF0IGFsbCBvbiB0aGUgbW9kZWwgc2NvcmUKICAgICMgZGlzdGFuY2UuCiAgICBNSU5fTU9ERUxfRElTVEFOQ0UgPSAwLjAxCgogICAgVklTVUFMX0hFQlJFV19OQU1FID0gIklTTy04ODU5LTgiCiAgICBMT0dJQ0FMX0hFQlJFV19OQU1FID0gIndpbmRvd3MtMTI1NSIKCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc3VwZXIoSGVicmV3UHJvYmVyLCBzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5fZmluYWxfY2hhcl9sb2dpY2FsX3Njb3JlID0gTm9uZQogICAgICAgIHNlbGYuX2ZpbmFsX2NoYXJfdmlzdWFsX3Njb3JlID0gTm9uZQogICAgICAgIHNlbGYuX3ByZXYgPSBOb25lCiAgICAgICAgc2VsZi5fYmVmb3JlX3ByZXYgPSBOb25lCiAgICAgICAgc2VsZi5fbG9naWNhbF9wcm9iZXIgPSBOb25lCiAgICAgICAgc2VsZi5fdmlzdWFsX3Byb2JlciA9IE5vbmUKICAgICAgICBzZWxmLnJlc2V0KCkKCiAgICBkZWYgcmVzZXQoc2VsZik6CiAgICAgICAgc2VsZi5fZmluYWxfY2hhcl9sb2dpY2FsX3Njb3JlID0gMAogICAgICAgIHNlbGYuX2ZpbmFsX2NoYXJfdmlzdWFsX3Njb3JlID0gMAogICAgICAgICMgVGhlIHR3byBsYXN0IGNoYXJhY3RlcnMgc2VlbiBpbiB0aGUgcHJldmlvdXMgYnVmZmVyLAogICAgICAgICMgbVByZXYgYW5kIG1CZWZvcmVQcmV2IGFyZSBpbml0aWFsaXplZCB0byBzcGFjZSBpbiBvcmRlciB0byBzaW11bGF0ZQogICAgICAgICMgYSB3b3JkIGRlbGltaXRlciBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkYXRhCiAgICAgICAgc2VsZi5fcHJldiA9ICcgJwogICAgICAgIHNlbGYuX2JlZm9yZV9wcmV2ID0gJyAnCiAgICAgICAgIyBUaGVzZSBwcm9iZXJzIGFyZSBvd25lZCBieSB0aGUgZ3JvdXAgcHJvYmVyLgoKICAgIGRlZiBzZXRfbW9kZWxfcHJvYmVycyhzZWxmLCBsb2dpY2FsUHJvYmVyLCB2aXN1YWxQcm9iZXIpOgogICAgICAgIHNlbGYuX2xvZ2ljYWxfcHJvYmVyID0gbG9naWNhbFByb2JlcgogICAgICAgIHNlbGYuX3Zpc3VhbF9wcm9iZXIgPSB2aXN1YWxQcm9iZXIKCiAgICBkZWYgaXNfZmluYWwoc2VsZiwgYyk6CiAgICAgICAgcmV0dXJuIGMgaW4gW3NlbGYuRklOQUxfS0FGLCBzZWxmLkZJTkFMX01FTSwgc2VsZi5GSU5BTF9OVU4sCiAgICAgICAgICAgICAgICAgICAgIHNlbGYuRklOQUxfUEUsIHNlbGYuRklOQUxfVFNBREldCgogICAgZGVmIGlzX25vbl9maW5hbChzZWxmLCBjKToKICAgICAgICAjIFRoZSBub3JtYWwgVHNhZGkgaXMgbm90IGEgZ29vZCBOb24tRmluYWwgbGV0dGVyIGR1ZSB0byB3b3JkcyBsaWtlCiAgICAgICAgIyAnbGVjaG90ZXQnICh0byBjaGF0KSBjb250YWluaW5nIGFuIGFwb3N0cm9waGUgYWZ0ZXIgdGhlIHRzYWRpLiBUaGlzCiAgICAgICAgIyBhcG9zdHJvcGhlIGlzIGNvbnZlcnRlZCB0byBhIHNwYWNlIGluIEZpbHRlcldpdGhvdXRFbmdsaXNoTGV0dGVycwogICAgICAgICMgY2F1c2luZyB0aGUgTm9uLUZpbmFsIHRzYWRpIHRvIGFwcGVhciBhdCBhbiBlbmQgb2YgYSB3b3JkIGV2ZW4KICAgICAgICAjIHRob3VnaCB0aGlzIGlzIG5vdCB0aGUgY2FzZSBpbiB0aGUgb3JpZ2luYWwgdGV4dC4KICAgICAgICAjIFRoZSBsZXR0ZXJzIFBlIGFuZCBLYWYgcmFyZWx5IGRpc3BsYXkgYSByZWxhdGVkIGJlaGF2aW9yIG9mIG5vdCBiZWluZwogICAgICAgICMgYSBnb29kIE5vbi1GaW5hbCBsZXR0ZXIuIFdvcmRzIGxpa2UgJ1BvcCcsICdXaW5hbXAnIGFuZCAnTXViYXJhaycKICAgICAgICAjIGZvciBleGFtcGxlIGxlZ2FsbHkgZW5kIHdpdGggYSBOb24tRmluYWwgUGUgb3IgS2FmLiBIb3dldmVyLCB0aGUKICAgICAgICAjIGJlbmVmaXQgb2YgdGhlc2UgbGV0dGVycyBhcyBOb24tRmluYWwgbGV0dGVycyBvdXR3ZWlnaHMgdGhlIGRhbWFnZQogICAgICAgICMgc2luY2UgdGhlc2Ugd29yZHMgYXJlIHF1aXRlIHJhcmUuCiAgICAgICAgcmV0dXJuIGMgaW4gW3NlbGYuTk9STUFMX0tBRiwgc2VsZi5OT1JNQUxfTUVNLAogICAgICAgICAgICAgICAgICAgICBzZWxmLk5PUk1BTF9OVU4sIHNlbGYuTk9STUFMX1BFXQoKICAgIGRlZiBmZWVkKHNlbGYsIGJ5dGVfc3RyKToKICAgICAgICAjIEZpbmFsIGxldHRlciBhbmFseXNpcyBmb3IgbG9naWNhbC12aXN1YWwgZGVjaXNpb24uCiAgICAgICAgIyBMb29rIGZvciBldmlkZW5jZSB0aGF0IHRoZSByZWNlaXZlZCBidWZmZXIgaXMgZWl0aGVyIGxvZ2ljYWwgSGVicmV3CiAgICAgICAgIyBvciB2aXN1YWwgSGVicmV3LgogICAgICAgICMgVGhlIGZvbGxvd2luZyBjYXNlcyBhcmUgY2hlY2tlZDoKICAgICAgICAjIDEpIEEgd29yZCBsb25nZXIgdGhhbiAxIGxldHRlciwgZW5kaW5nIHdpdGggYSBmaW5hbCBsZXR0ZXIuIFRoaXMgaXMKICAgICAgICAjICAgIGFuIGluZGljYXRpb24gdGhhdCB0aGUgdGV4dCBpcyBsYWlkIG91dCAibmF0dXJhbGx5IiBzaW5jZSB0aGUKICAgICAgICAjICAgIGZpbmFsIGxldHRlciByZWFsbHkgYXBwZWFycyBhdCB0aGUgZW5kLiArMSBmb3IgbG9naWNhbCBzY29yZS4KICAgICAgICAjIDIpIEEgd29yZCBsb25nZXIgdGhhbiAxIGxldHRlciwgZW5kaW5nIHdpdGggYSBOb24tRmluYWwgbGV0dGVyLiBJbgogICAgICAgICMgICAgbm9ybWFsIEhlYnJldywgd29yZHMgZW5kaW5nIHdpdGggS2FmLCBNZW0sIE51biwgUGUgb3IgVHNhZGksCiAgICAgICAgIyAgICBzaG91bGQgbm90IGVuZCB3aXRoIHRoZSBOb24tRmluYWwgZm9ybSBvZiB0aGF0IGxldHRlci4gRXhjZXB0aW9ucwogICAgICAgICMgICAgdG8gdGhpcyBydWxlIGFyZSBtZW50aW9uZWQgYWJvdmUgaW4gaXNOb25GaW5hbCgpLiBUaGlzIGlzIGFuCiAgICAgICAgIyAgICBpbmRpY2F0aW9uIHRoYXQgdGhlIHRleHQgaXMgbGFpZCBvdXQgYmFja3dhcmRzLiArMSBmb3IgdmlzdWFsCiAgICAgICAgIyAgICBzY29yZQogICAgICAgICMgMykgQSB3b3JkIGxvbmdlciB0aGFuIDEgbGV0dGVyLCBzdGFydGluZyB3aXRoIGEgZmluYWwgbGV0dGVyLiBGaW5hbAogICAgICAgICMgICAgbGV0dGVycyBzaG91bGQgbm90IGFwcGVhciBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgd29yZC4gVGhpcyBpcyBhbgogICAgICAgICMgICAgaW5kaWNhdGlvbiB0aGF0IHRoZSB0ZXh0IGlzIGxhaWQgb3V0IGJhY2t3YXJkcy4gKzEgZm9yIHZpc3VhbAogICAgICAgICMgICAgc2NvcmUuCiAgICAgICAgIwogICAgICAgICMgVGhlIHZpc3VhbCBzY29yZSBhbmQgbG9naWNhbCBzY29yZSBhcmUgYWNjdW11bGF0ZWQgdGhyb3VnaG91dCB0aGUKICAgICAgICAjIHRleHQgYW5kIGFyZSBmaW5hbGx5IGNoZWNrZWQgYWdhaW5zdCBlYWNoIG90aGVyIGluIEdldENoYXJTZXROYW1lKCkuCiAgICAgICAgIyBObyBjaGVja2luZyBmb3IgZmluYWwgbGV0dGVycyBpbiB0aGUgbWlkZGxlIG9mIHdvcmRzIGlzIGRvbmUgc2luY2UKICAgICAgICAjIHRoYXQgY2FzZSBpcyBub3QgYW4gaW5kaWNhdGlvbiBmb3IgZWl0aGVyIExvZ2ljYWwgb3IgVmlzdWFsIHRleHQuCiAgICAgICAgIwogICAgICAgICMgV2UgYXV0b21hdGljYWxseSBmaWx0ZXIgb3V0IGFsbCA3LWJpdCBjaGFyYWN0ZXJzIChyZXBsYWNlIHRoZW0gd2l0aAogICAgICAgICMgc3BhY2VzKSBzbyB0aGUgd29yZCBib3VuZGFyeSBkZXRlY3Rpb24gd29ya3MgcHJvcGVybHkuIFtNQVBdCgogICAgICAgIGlmIHNlbGYuc3RhdGUgPT0gUHJvYmluZ1N0YXRlLk5PVF9NRToKICAgICAgICAgICAgIyBCb3RoIG1vZGVsIHByb2JlcnMgc2F5IGl0J3Mgbm90IHRoZW0uIE5vIHJlYXNvbiB0byBjb250aW51ZS4KICAgICAgICAgICAgcmV0dXJuIFByb2JpbmdTdGF0ZS5OT1RfTUUKCiAgICAgICAgYnl0ZV9zdHIgPSBzZWxmLmZpbHRlcl9oaWdoX2J5dGVfb25seShieXRlX3N0cikKCiAgICAgICAgZm9yIGN1ciBpbiBieXRlX3N0cjoKICAgICAgICAgICAgaWYgY3VyID09ICcgJzoKICAgICAgICAgICAgICAgICMgV2Ugc3RhbmQgb24gYSBzcGFjZSAtIGEgd29yZCBqdXN0IGVuZGVkCiAgICAgICAgICAgICAgICBpZiBzZWxmLl9iZWZvcmVfcHJldiAhPSAnICc6CiAgICAgICAgICAgICAgICAgICAgIyBuZXh0LXRvLWxhc3QgY2hhciB3YXMgbm90IGEgc3BhY2Ugc28gc2VsZi5fcHJldiBpcyBub3QgYQogICAgICAgICAgICAgICAgICAgICMgMSBsZXR0ZXIgd29yZAogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuaXNfZmluYWwoc2VsZi5fcHJldik6CiAgICAgICAgICAgICAgICAgICAgICAgICMgY2FzZSAoMSkgWy0yOm5vdCBzcGFjZV1bLTE6ZmluYWwgbGV0dGVyXVtjdXI6c3BhY2VdCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2ZpbmFsX2NoYXJfbG9naWNhbF9zY29yZSArPSAxCiAgICAgICAgICAgICAgICAgICAgZWxpZiBzZWxmLmlzX25vbl9maW5hbChzZWxmLl9wcmV2KToKICAgICAgICAgICAgICAgICAgICAgICAgIyBjYXNlICgyKSBbLTI6bm90IHNwYWNlXVstMTpOb24tRmluYWwgbGV0dGVyXVsKICAgICAgICAgICAgICAgICAgICAgICAgIyAgY3VyOnNwYWNlXQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9maW5hbF9jaGFyX3Zpc3VhbF9zY29yZSArPSAxCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIE5vdCBzdGFuZGluZyBvbiBhIHNwYWNlCiAgICAgICAgICAgICAgICBpZiAoKHNlbGYuX2JlZm9yZV9wcmV2ID09ICcgJykgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLmlzX2ZpbmFsKHNlbGYuX3ByZXYpKSBhbmQgKGN1ciAhPSAnICcpKToKICAgICAgICAgICAgICAgICAgICAjIGNhc2UgKDMpIFstMjpzcGFjZV1bLTE6ZmluYWwgbGV0dGVyXVtjdXI6bm90IHNwYWNlXQogICAgICAgICAgICAgICAgICAgIHNlbGYuX2ZpbmFsX2NoYXJfdmlzdWFsX3Njb3JlICs9IDEKICAgICAgICAgICAgc2VsZi5fYmVmb3JlX3ByZXYgPSBzZWxmLl9wcmV2CiAgICAgICAgICAgIHNlbGYuX3ByZXYgPSBjdXIKCiAgICAgICAgIyBGb3JldmVyIGRldGVjdGluZywgdGlsbCB0aGUgZW5kIG9yIHVudGlsIGJvdGggbW9kZWwgcHJvYmVycyByZXR1cm4KICAgICAgICAjIFByb2JpbmdTdGF0ZS5OT1RfTUUgKGhhbmRsZWQgYWJvdmUpCiAgICAgICAgcmV0dXJuIFByb2JpbmdTdGF0ZS5ERVRFQ1RJTkcKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjaGFyc2V0X25hbWUoc2VsZik6CiAgICAgICAgIyBNYWtlIHRoZSBkZWNpc2lvbjogaXMgaXQgTG9naWNhbCBvciBWaXN1YWw/CiAgICAgICAgIyBJZiB0aGUgZmluYWwgbGV0dGVyIHNjb3JlIGRpc3RhbmNlIGlzIGRvbWluYW50IGVub3VnaCwgcmVseSBvbiBpdC4KICAgICAgICBmaW5hbHN1YiA9IHNlbGYuX2ZpbmFsX2NoYXJfbG9naWNhbF9zY29yZSAtIHNlbGYuX2ZpbmFsX2NoYXJfdmlzdWFsX3Njb3JlCiAgICAgICAgaWYgZmluYWxzdWIgPj0gc2VsZi5NSU5fRklOQUxfQ0hBUl9ESVNUQU5DRToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuTE9HSUNBTF9IRUJSRVdfTkFNRQogICAgICAgIGlmIGZpbmFsc3ViIDw9IC1zZWxmLk1JTl9GSU5BTF9DSEFSX0RJU1RBTkNFOgogICAgICAgICAgICByZXR1cm4gc2VsZi5WSVNVQUxfSEVCUkVXX05BTUUKCiAgICAgICAgIyBJdCdzIG5vdCBkb21pbmFudCBlbm91Z2gsIHRyeSB0byByZWx5IG9uIHRoZSBtb2RlbCBzY29yZXMgaW5zdGVhZC4KICAgICAgICBtb2RlbHN1YiA9IChzZWxmLl9sb2dpY2FsX3Byb2Jlci5nZXRfY29uZmlkZW5jZSgpCiAgICAgICAgICAgICAgICAgICAgLSBzZWxmLl92aXN1YWxfcHJvYmVyLmdldF9jb25maWRlbmNlKCkpCiAgICAgICAgaWYgbW9kZWxzdWIgPiBzZWxmLk1JTl9NT0RFTF9ESVNUQU5DRToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuTE9HSUNBTF9IRUJSRVdfTkFNRQogICAgICAgIGlmIG1vZGVsc3ViIDwgLXNlbGYuTUlOX01PREVMX0RJU1RBTkNFOgogICAgICAgICAgICByZXR1cm4gc2VsZi5WSVNVQUxfSEVCUkVXX05BTUUKCiAgICAgICAgIyBTdGlsbCBubyBnb29kLCBiYWNrIHRvIGZpbmFsIGxldHRlciBkaXN0YW5jZSwgbWF5YmUgaXQnbGwgc2F2ZSB0aGUKICAgICAgICAjIGRheS4KICAgICAgICBpZiBmaW5hbHN1YiA8IDAuMDoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuVklTVUFMX0hFQlJFV19OQU1FCgogICAgICAgICMgKGZpbmFsc3ViID4gMCAtIExvZ2ljYWwpIG9yIChkb24ndCBrbm93IHdoYXQgdG8gZG8pIGRlZmF1bHQgdG8KICAgICAgICAjIExvZ2ljYWwuCiAgICAgICAgcmV0dXJuIHNlbGYuTE9HSUNBTF9IRUJSRVdfTkFNRQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGxhbmd1YWdlKHNlbGYpOgogICAgICAgIHJldHVybiAnSGVicmV3JwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHN0YXRlKHNlbGYpOgogICAgICAgICMgUmVtYWluIGFjdGl2ZSBhcyBsb25nIGFzIGFueSBvZiB0aGUgbW9kZWwgcHJvYmVycyBhcmUgYWN0aXZlLgogICAgICAgIGlmIChzZWxmLl9sb2dpY2FsX3Byb2Jlci5zdGF0ZSA9PSBQcm9iaW5nU3RhdGUuTk9UX01FKSBhbmQgXAogICAgICAgICAgIChzZWxmLl92aXN1YWxfcHJvYmVyLnN0YXRlID09IFByb2JpbmdTdGF0ZS5OT1RfTUUpOgogICAgICAgICAgICByZXR1cm4gUHJvYmluZ1N0YXRlLk5PVF9NRQogICAgICAgIHJldHVybiBQcm9iaW5nU3RhdGUuREVURUNUSU5HClBLAwQUAAAAAAAAACEAwho5YbFkAACxZAAALgAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2ppc2ZyZXEucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBNb3ppbGxhIENvbW11bmljYXRvciBjbGllbnQgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMgU2FtcGxpbmcgZnJvbSBhYm91dCAyME0gdGV4dCBtYXRlcmlhbHMgaW5jbHVkZSBsaXRlcmF0dXJlIGFuZCBjb21wdXRlciB0ZWNobm9sb2d5CiMKIyBKYXBhbmVzZSBmcmVxdWVuY3kgdGFibGUsIGFwcGxpZWQgdG8gYm90aCBTLUpJUyBhbmQgRVVDLUpQCiMgVGhleSBhcmUgc29ydGVkIGluIG9yZGVyLgoKIyAxMjggIC0tPiAwLjc3MDk0CiMgMjU2ICAtLT4gMC44NTcxMAojIDUxMiAgLS0+IDAuOTI2MzUKIyAxMDI0IC0tPiAwLjk3MTMwCiMgMjA0OCAtLT4gMC45OTQzMQojCiMgSWRlYWwgRGlzdHJpYnV0aW9uIFJhdGlvID0gMC45MjYzNSAvICgxLTAuOTI2MzUpID0gMTIuNTgKIyBSYW5kb20gRGlzdHJpYnV0aW9uIFJhdGlvbiA9IDUxMiAvICgyOTY1KzYyKzgzKzg2LTUxMikgPSAwLjE5MQojCiMgVHlwaWNhbCBEaXN0cmlidXRpb24gUmF0aW8sIDI1JSBvZiBJRFIKCkpJU19UWVBJQ0FMX0RJU1RSSUJVVElPTl9SQVRJTyA9IDMuMAoKIyBDaGFyIHRvIEZyZXFPcmRlciB0YWJsZSAsCkpJU19UQUJMRV9TSVpFID0gNDM2OAoKSklTX0NIQVJfVE9fRlJFUV9PUkRFUiA9ICgKICA0MCwgICAxLCAgIDYsIDE4MiwgMTUyLCAxODAsIDI5NSwyMTI3LCAyODUsIDM4MSwzMjk1LDQzMDQsMzA2OCw0NjA2LDMxNjUsMzUxMCwgIyAgIDE2CjM1MTEsMTgyMiwyNzg1LDQ2MDcsMTE5MywyMjI2LDUwNzAsNDYwOCwgMTcxLDI5OTYsMTI0NywgIDE4LCAxNzksNTA3MSwgODU2LDE2NjEsICMgICAzMgoxMjYyLDUwNzIsIDYxOSwgMTI3LDM0MzEsMzUxMiwzMjMwLDE4OTksMTcwMCwgMjMyLCAyMjgsMTI5NCwxMjk4LCAyODQsIDI4MywyMDQxLCAjICAgNDgKMjA0MiwxMDYxLDEwNjIsICA0OCwgIDQ5LCAgNDQsICA0NSwgNDMzLCA0MzQsMTA0MCwxMDQxLCA5OTYsIDc4NywyOTk3LDEyNTUsNDMwNSwgIyAgIDY0CjIxMDgsNDYwOSwxNjg0LDE2NDgsNTA3Myw1MDc0LDUwNzUsNTA3Niw1MDc3LDUwNzgsMzY4Nyw1MDc5LDQ2MTAsNTA4MCwzOTI3LDM5MjgsICMgICA4MAo1MDgxLDMyOTYsMzQzMiwgMjkwLDIyODUsMTQ3MSwyMTg3LDUwODIsMjU4MCwyODI1LDEzMDMsMjE0MCwxNzM5LDE0NDUsMjY5MSwzMzc1LCAjICAgOTYKMTY5MSwzMjk3LDQzMDYsNDMwNyw0NjExLCA0NTIsMzM3NiwxMTgyLDI3MTMsMzY4OCwzMDY5LDQzMDgsNTA4Myw1MDg0LDUwODUsNTA4NiwgIyAgMTEyCjUwODcsNTA4OCw1MDg5LDUwOTAsNTA5MSw1MDkyLDUwOTMsNTA5NCw1MDk1LDUwOTYsNTA5Nyw1MDk4LDUwOTksNTEwMCw1MTAxLDUxMDIsICMgIDEyOAo1MTAzLDUxMDQsNTEwNSw1MTA2LDUxMDcsNTEwOCw1MTA5LDUxMTAsNTExMSw1MTEyLDQwOTcsNTExMyw1MTE0LDUxMTUsNTExNiw1MTE3LCAjICAxNDQKNTExOCw1MTE5LDUxMjAsNTEyMSw1MTIyLDUxMjMsNTEyNCw1MTI1LDUxMjYsNTEyNyw1MTI4LDUxMjksNTEzMCw1MTMxLDUxMzIsNTEzMywgIyAgMTYwCjUxMzQsNTEzNSw1MTM2LDUxMzcsNTEzOCw1MTM5LDUxNDAsNTE0MSw1MTQyLDUxNDMsNTE0NCw1MTQ1LDUxNDYsNTE0Nyw1MTQ4LDUxNDksICMgIDE3Ngo1MTUwLDUxNTEsNTE1Miw0NjEyLDUxNTMsNTE1NCw1MTU1LDUxNTYsNTE1Nyw1MTU4LDUxNTksNTE2MCw1MTYxLDUxNjIsNTE2Myw1MTY0LCAjICAxOTIKNTE2NSw1MTY2LDUxNjcsNTE2OCw1MTY5LDUxNzAsNTE3MSw1MTcyLDUxNzMsNTE3NCw1MTc1LDE0NzIsIDU5OCwgNjE4LCA4MjAsMTIwNSwgIyAgMjA4CjEzMDksMTQxMiwxODU4LDEzMDcsMTY5Miw1MTc2LDUxNzcsNTE3OCw1MTc5LDUxODAsNTE4MSw1MTgyLDExNDIsMTQ1MiwxMjM0LDExNzIsICMgIDIyNAoxODc1LDIwNDMsMjE0OSwxNzkzLDEzODIsMjk3MywgOTI1LDI0MDQsMTA2NywxMjQxLCA5NjAsMTM3NywyOTM1LDE0OTEsIDkxOSwxMjE3LCAjICAyNDAKMTg2NSwyMDMwLDE0MDYsMTQ5OSwyNzQ5LDQwOTgsNTE4Myw1MTg0LDUxODUsNTE4Niw1MTg3LDUxODgsMjU2MSw0MDk5LDMxMTcsMTgwNCwgIyAgMjU2CjIwNDksMzY4OSw0MzA5LDM1MTMsMTY2Myw1MTg5LDMxNjYsMzExOCwzMjk4LDE1ODcsMTU2MSwzNDMzLDUxOTAsMzExOSwxNjI1LDI5OTgsICMgIDI3MgozMjk5LDQ2MTMsMTc2NiwzNjkwLDI3ODYsNDYxNCw1MTkxLDUxOTIsNTE5Myw1MTk0LDIxNjEsICAyNiwzMzc3LCAgIDIsMzkyOSwgIDIwLCAjICAyODgKMzY5MSwgIDQ3LDQxMDAsICA1MCwgIDE3LCAgMTYsICAzNSwgMjY4LCAgMjcsIDI0MywgIDQyLCAxNTUsICAyNCwgMTU0LCAgMjksIDE4NCwgIyAgMzA0CiAgIDQsICA5MSwgIDE0LCAgOTIsICA1MywgMzk2LCAgMzMsIDI4OSwgICA5LCAgMzcsICA2NCwgNjIwLCAgMjEsICAzOSwgMzIxLCAgIDUsICMgIDMyMAogIDEyLCAgMTEsICA1MiwgIDEzLCAgIDMsIDIwOCwgMTM4LCAgIDAsICAgNywgIDYwLCA1MjYsIDE0MSwgMTUxLDEwNjksIDE4MSwgMjc1LCAjICAzMzYKMTU5MSwgIDgzLCAxMzIsMTQ3NSwgMTI2LCAzMzEsIDgyOSwgIDE1LCAgNjksIDE2MCwgIDU5LCAgMjIsIDE1NywgIDU1LDEwNzksIDMxMiwgIyAgMzUyCiAxMDksICAzOCwgIDIzLCAgMjUsICAxMCwgIDE5LCAgNzksNTE5NSwgIDYxLCAzODIsMTEyNCwgICA4LCAgMzAsNTE5Niw1MTk3LDUxOTgsICMgIDM2OAo1MTk5LDUyMDAsNTIwMSw1MjAyLDUyMDMsNTIwNCw1MjA1LDUyMDYsICA4OSwgIDYyLCAgNzQsICAzNCwyNDE2LCAxMTIsIDEzOSwgMTk2LCAjICAzODQKIDI3MSwgMTQ5LCAgODQsIDYwNywgMTMxLCA3NjUsICA0NiwgIDg4LCAxNTMsIDY4MywgIDc2LCA4NzQsIDEwMSwgMjU4LCAgNTcsICA4MCwgIyAgNDAwCiAgMzIsIDM2NCwgMTIxLDE1MDgsIDE2OSwxNTQ3LCAgNjgsIDIzNSwgMTQ1LDI5OTksICA0MSwgMzYwLDMwMjcsICA3MCwgIDYzLCAgMzEsICMgIDQxNgogIDQzLCAyNTksIDI2MiwxMzgzLCAgOTksIDUzMywgMTk0LCAgNjYsICA5MywgODQ2LCAyMTcsIDE5MiwgIDU2LCAxMDYsICA1OCwgNTY1LCAjICA0MzIKIDI4MCwgMjcyLCAzMTEsIDI1NiwgMTQ2LCAgODIsIDMwOCwgIDcxLCAxMDAsIDEyOCwgMjE0LCA2NTUsIDExMCwgMjYxLCAxMDQsMTE0MCwgIyAgNDQ4CiAgNTQsICA1MSwgIDM2LCAgODcsICA2NywzMDcwLCAxODUsMjYxOCwyOTM2LDIwMjAsICAyOCwxMDY2LDIzOTAsMjA1OSw1MjA3LDUyMDgsICMgIDQ2NAo1MjA5LDUyMTAsNTIxMSw1MjEyLDUyMTMsNTIxNCw1MjE1LDUyMTYsNDYxNSw1MjE3LDUyMTgsNTIxOSw1MjIwLDUyMjEsNTIyMiw1MjIzLCAjICA0ODAKNTIyNCw1MjI1LDUyMjYsNTIyNyw1MjI4LDUyMjksNTIzMCw1MjMxLDUyMzIsNTIzMyw1MjM0LDUyMzUsNTIzNiwzNTE0LDUyMzcsNTIzOCwgIyAgNDk2CjUyMzksNTI0MCw1MjQxLDUyNDIsNTI0Myw1MjQ0LDIyOTcsMjAzMSw0NjE2LDQzMTAsMzY5Miw1MjQ1LDMwNzEsNTI0NiwzNTk4LDUyNDcsICMgIDUxMgo0NjE3LDMyMzEsMzUxNSw1MjQ4LDQxMDEsNDMxMSw0NjE4LDM4MDgsNDMxMiw0MTAyLDUyNDksNDEwMyw0MTA0LDM1OTksNTI1MCw1MjUxLCAjICA1MjgKNTI1Miw1MjUzLDUyNTQsNTI1NSw1MjU2LDUyNTcsNTI1OCw1MjU5LDUyNjAsNTI2MSw1MjYyLDUyNjMsNTI2NCw1MjY1LDUyNjYsNTI2NywgIyAgNTQ0CjUyNjgsNTI2OSw1MjcwLDUyNzEsNTI3Miw1MjczLDUyNzQsNTI3NSw1Mjc2LDUyNzcsNTI3OCw1Mjc5LDUyODAsNTI4MSw1MjgyLDUyODMsICMgIDU2MAo1Mjg0LDUyODUsNTI4Niw1Mjg3LDUyODgsNTI4OSw1MjkwLDUyOTEsNTI5Miw1MjkzLDUyOTQsNTI5NSw1Mjk2LDUyOTcsNTI5OCw1Mjk5LCAjICA1NzYKNTMwMCw1MzAxLDUzMDIsNTMwMyw1MzA0LDUzMDUsNTMwNiw1MzA3LDUzMDgsNTMwOSw1MzEwLDUzMTEsNTMxMiw1MzEzLDUzMTQsNTMxNSwgIyAgNTkyCjUzMTYsNTMxNyw1MzE4LDUzMTksNTMyMCw1MzIxLDUzMjIsNTMyMyw1MzI0LDUzMjUsNTMyNiw1MzI3LDUzMjgsNTMyOSw1MzMwLDUzMzEsICMgIDYwOAo1MzMyLDUzMzMsNTMzNCw1MzM1LDUzMzYsNTMzNyw1MzM4LDUzMzksNTM0MCw1MzQxLDUzNDIsNTM0Myw1MzQ0LDUzNDUsNTM0Niw1MzQ3LCAjICA2MjQKNTM0OCw1MzQ5LDUzNTAsNTM1MSw1MzUyLDUzNTMsNTM1NCw1MzU1LDUzNTYsNTM1Nyw1MzU4LDUzNTksNTM2MCw1MzYxLDUzNjIsNTM2MywgIyAgNjQwCjUzNjQsNTM2NSw1MzY2LDUzNjcsNTM2OCw1MzY5LDUzNzAsNTM3MSw1MzcyLDUzNzMsNTM3NCw1Mzc1LDUzNzYsNTM3Nyw1Mzc4LDUzNzksICMgIDY1Ngo1MzgwLDUzODEsIDM2MywgNjQyLDI3ODcsMjg3OCwyNzg4LDI3ODksMjMxNiwzMjMyLDIzMTcsMzQzNCwyMDExLCAxNjUsMTk0MiwzOTMwLCAjICA2NzIKMzkzMSwzOTMyLDM5MzMsNTM4Miw0NjE5LDUzODMsNDYyMCw1Mzg0LDUzODUsNTM4Niw1Mzg3LDUzODgsNTM4OSw1MzkwLDUzOTEsNTM5MiwgIyAgNjg4CjUzOTMsNTM5NCw1Mzk1LDUzOTYsNTM5Nyw1Mzk4LDUzOTksNTQwMCw1NDAxLDU0MDIsNTQwMyw1NDA0LDU0MDUsNTQwNiw1NDA3LDU0MDgsICMgIDcwNAo1NDA5LDU0MTAsNTQxMSw1NDEyLDU0MTMsNTQxNCw1NDE1LDU0MTYsNTQxNyw1NDE4LDU0MTksNTQyMCw1NDIxLDU0MjIsNTQyMyw1NDI0LCAjICA3MjAKNTQyNSw1NDI2LDU0MjcsNTQyOCw1NDI5LDU0MzAsNTQzMSw1NDMyLDU0MzMsNTQzNCw1NDM1LDU0MzYsNTQzNyw1NDM4LDU0MzksNTQ0MCwgIyAgNzM2CjU0NDEsNTQ0Miw1NDQzLDU0NDQsNTQ0NSw1NDQ2LDU0NDcsNTQ0OCw1NDQ5LDU0NTAsNTQ1MSw1NDUyLDU0NTMsNTQ1NCw1NDU1LDU0NTYsICMgIDc1Mgo1NDU3LDU0NTgsNTQ1OSw1NDYwLDU0NjEsNTQ2Miw1NDYzLDU0NjQsNTQ2NSw1NDY2LDU0NjcsNTQ2OCw1NDY5LDU0NzAsNTQ3MSw1NDcyLCAjICA3NjgKNTQ3Myw1NDc0LDU0NzUsNTQ3Niw1NDc3LDU0NzgsNTQ3OSw1NDgwLDU0ODEsNTQ4Miw1NDgzLDU0ODQsNTQ4NSw1NDg2LDU0ODcsNTQ4OCwgIyAgNzg0CjU0ODksNTQ5MCw1NDkxLDU0OTIsNTQ5Myw1NDk0LDU0OTUsNTQ5Niw1NDk3LDU0OTgsNTQ5OSw1NTAwLDU1MDEsNTUwMiw1NTAzLDU1MDQsICMgIDgwMAo1NTA1LDU1MDYsNTUwNyw1NTA4LDU1MDksNTUxMCw1NTExLDU1MTIsNTUxMyw1NTE0LDU1MTUsNTUxNiw1NTE3LDU1MTgsNTUxOSw1NTIwLCAjICA4MTYKNTUyMSw1NTIyLDU1MjMsNTUyNCw1NTI1LDU1MjYsNTUyNyw1NTI4LDU1MjksNTUzMCw1NTMxLDU1MzIsNTUzMyw1NTM0LDU1MzUsNTUzNiwgIyAgODMyCjU1MzcsNTUzOCw1NTM5LDU1NDAsNTU0MSw1NTQyLDU1NDMsNTU0NCw1NTQ1LDU1NDYsNTU0Nyw1NTQ4LDU1NDksNTU1MCw1NTUxLDU1NTIsICMgIDg0OAo1NTUzLDU1NTQsNTU1NSw1NTU2LDU1NTcsNTU1OCw1NTU5LDU1NjAsNTU2MSw1NTYyLDU1NjMsNTU2NCw1NTY1LDU1NjYsNTU2Nyw1NTY4LCAjICA4NjQKNTU2OSw1NTcwLDU1NzEsNTU3Miw1NTczLDU1NzQsNTU3NSw1NTc2LDU1NzcsNTU3OCw1NTc5LDU1ODAsNTU4MSw1NTgyLDU1ODMsNTU4NCwgIyAgODgwCjU1ODUsNTU4Niw1NTg3LDU1ODgsNTU4OSw1NTkwLDU1OTEsNTU5Miw1NTkzLDU1OTQsNTU5NSw1NTk2LDU1OTcsNTU5OCw1NTk5LDU2MDAsICMgIDg5Ngo1NjAxLDU2MDIsNTYwMyw1NjA0LDU2MDUsNTYwNiw1NjA3LDU2MDgsNTYwOSw1NjEwLDU2MTEsNTYxMiw1NjEzLDU2MTQsNTYxNSw1NjE2LCAjICA5MTIKNTYxNyw1NjE4LDU2MTksNTYyMCw1NjIxLDU2MjIsNTYyMyw1NjI0LDU2MjUsNTYyNiw1NjI3LDU2MjgsNTYyOSw1NjMwLDU2MzEsNTYzMiwgIyAgOTI4CjU2MzMsNTYzNCw1NjM1LDU2MzYsNTYzNyw1NjM4LDU2MzksNTY0MCw1NjQxLDU2NDIsNTY0Myw1NjQ0LDU2NDUsNTY0Niw1NjQ3LDU2NDgsICMgIDk0NAo1NjQ5LDU2NTAsNTY1MSw1NjUyLDU2NTMsNTY1NCw1NjU1LDU2NTYsNTY1Nyw1NjU4LDU2NTksNTY2MCw1NjYxLDU2NjIsNTY2Myw1NjY0LCAjICA5NjAKNTY2NSw1NjY2LDU2NjcsNTY2OCw1NjY5LDU2NzAsNTY3MSw1NjcyLDU2NzMsNTY3NCw1Njc1LDU2NzYsNTY3Nyw1Njc4LDU2NzksNTY4MCwgIyAgOTc2CjU2ODEsNTY4Miw1NjgzLDU2ODQsNTY4NSw1Njg2LDU2ODcsNTY4OCw1Njg5LDU2OTAsNTY5MSw1NjkyLDU2OTMsNTY5NCw1Njk1LDU2OTYsICMgIDk5Mgo1Njk3LDU2OTgsNTY5OSw1NzAwLDU3MDEsNTcwMiw1NzAzLDU3MDQsNTcwNSw1NzA2LDU3MDcsNTcwOCw1NzA5LDU3MTAsNTcxMSw1NzEyLCAjIDEwMDgKNTcxMyw1NzE0LDU3MTUsNTcxNiw1NzE3LDU3MTgsNTcxOSw1NzIwLDU3MjEsNTcyMiw1NzIzLDU3MjQsNTcyNSw1NzI2LDU3MjcsNTcyOCwgIyAxMDI0CjU3MjksNTczMCw1NzMxLDU3MzIsNTczMyw1NzM0LDU3MzUsNTczNiw1NzM3LDU3MzgsNTczOSw1NzQwLDU3NDEsNTc0Miw1NzQzLDU3NDQsICMgMTA0MAo1NzQ1LDU3NDYsNTc0Nyw1NzQ4LDU3NDksNTc1MCw1NzUxLDU3NTIsNTc1Myw1NzU0LDU3NTUsNTc1Niw1NzU3LDU3NTgsNTc1OSw1NzYwLCAjIDEwNTYKNTc2MSw1NzYyLDU3NjMsNTc2NCw1NzY1LDU3NjYsNTc2Nyw1NzY4LDU3NjksNTc3MCw1NzcxLDU3NzIsNTc3Myw1Nzc0LDU3NzUsNTc3NiwgIyAxMDcyCjU3NzcsNTc3OCw1Nzc5LDU3ODAsNTc4MSw1NzgyLDU3ODMsNTc4NCw1Nzg1LDU3ODYsNTc4Nyw1Nzg4LDU3ODksNTc5MCw1NzkxLDU3OTIsICMgMTA4OAo1NzkzLDU3OTQsNTc5NSw1Nzk2LDU3OTcsNTc5OCw1Nzk5LDU4MDAsNTgwMSw1ODAyLDU4MDMsNTgwNCw1ODA1LDU4MDYsNTgwNyw1ODA4LCAjIDExMDQKNTgwOSw1ODEwLDU4MTEsNTgxMiw1ODEzLDU4MTQsNTgxNSw1ODE2LDU4MTcsNTgxOCw1ODE5LDU4MjAsNTgyMSw1ODIyLDU4MjMsNTgyNCwgIyAxMTIwCjU4MjUsNTgyNiw1ODI3LDU4MjgsNTgyOSw1ODMwLDU4MzEsNTgzMiw1ODMzLDU4MzQsNTgzNSw1ODM2LDU4MzcsNTgzOCw1ODM5LDU4NDAsICMgMTEzNgo1ODQxLDU4NDIsNTg0Myw1ODQ0LDU4NDUsNTg0Niw1ODQ3LDU4NDgsNTg0OSw1ODUwLDU4NTEsNTg1Miw1ODUzLDU4NTQsNTg1NSw1ODU2LCAjIDExNTIKNTg1Nyw1ODU4LDU4NTksNTg2MCw1ODYxLDU4NjIsNTg2Myw1ODY0LDU4NjUsNTg2Niw1ODY3LDU4NjgsNTg2OSw1ODcwLDU4NzEsNTg3MiwgIyAxMTY4CjU4NzMsNTg3NCw1ODc1LDU4NzYsNTg3Nyw1ODc4LDU4NzksNTg4MCw1ODgxLDU4ODIsNTg4Myw1ODg0LDU4ODUsNTg4Niw1ODg3LDU4ODgsICMgMTE4NAo1ODg5LDU4OTAsNTg5MSw1ODkyLDU4OTMsNTg5NCw1ODk1LDU4OTYsNTg5Nyw1ODk4LDU4OTksNTkwMCw1OTAxLDU5MDIsNTkwMyw1OTA0LCAjIDEyMDAKNTkwNSw1OTA2LDU5MDcsNTkwOCw1OTA5LDU5MTAsNTkxMSw1OTEyLDU5MTMsNTkxNCw1OTE1LDU5MTYsNTkxNyw1OTE4LDU5MTksNTkyMCwgIyAxMjE2CjU5MjEsNTkyMiw1OTIzLDU5MjQsNTkyNSw1OTI2LDU5MjcsNTkyOCw1OTI5LDU5MzAsNTkzMSw1OTMyLDU5MzMsNTkzNCw1OTM1LDU5MzYsICMgMTIzMgo1OTM3LDU5MzgsNTkzOSw1OTQwLDU5NDEsNTk0Miw1OTQzLDU5NDQsNTk0NSw1OTQ2LDU5NDcsNTk0OCw1OTQ5LDU5NTAsNTk1MSw1OTUyLCAjIDEyNDgKNTk1Myw1OTU0LDU5NTUsNTk1Niw1OTU3LDU5NTgsNTk1OSw1OTYwLDU5NjEsNTk2Miw1OTYzLDU5NjQsNTk2NSw1OTY2LDU5NjcsNTk2OCwgIyAxMjY0CjU5NjksNTk3MCw1OTcxLDU5NzIsNTk3Myw1OTc0LDU5NzUsNTk3Niw1OTc3LDU5NzgsNTk3OSw1OTgwLDU5ODEsNTk4Miw1OTgzLDU5ODQsICMgMTI4MAo1OTg1LDU5ODYsNTk4Nyw1OTg4LDU5ODksNTk5MCw1OTkxLDU5OTIsNTk5Myw1OTk0LDU5OTUsNTk5Niw1OTk3LDU5OTgsNTk5OSw2MDAwLCAjIDEyOTYKNjAwMSw2MDAyLDYwMDMsNjAwNCw2MDA1LDYwMDYsNjAwNyw2MDA4LDYwMDksNjAxMCw2MDExLDYwMTIsNjAxMyw2MDE0LDYwMTUsNjAxNiwgIyAxMzEyCjYwMTcsNjAxOCw2MDE5LDYwMjAsNjAyMSw2MDIyLDYwMjMsNjAyNCw2MDI1LDYwMjYsNjAyNyw2MDI4LDYwMjksNjAzMCw2MDMxLDYwMzIsICMgMTMyOAo2MDMzLDYwMzQsNjAzNSw2MDM2LDYwMzcsNjAzOCw2MDM5LDYwNDAsNjA0MSw2MDQyLDYwNDMsNjA0NCw2MDQ1LDYwNDYsNjA0Nyw2MDQ4LCAjIDEzNDQKNjA0OSw2MDUwLDYwNTEsNjA1Miw2MDUzLDYwNTQsNjA1NSw2MDU2LDYwNTcsNjA1OCw2MDU5LDYwNjAsNjA2MSw2MDYyLDYwNjMsNjA2NCwgIyAxMzYwCjYwNjUsNjA2Niw2MDY3LDYwNjgsNjA2OSw2MDcwLDYwNzEsNjA3Miw2MDczLDYwNzQsNjA3NSw2MDc2LDYwNzcsNjA3OCw2MDc5LDYwODAsICMgMTM3Ngo2MDgxLDYwODIsNjA4Myw2MDg0LDYwODUsNjA4Niw2MDg3LDYwODgsNjA4OSw2MDkwLDYwOTEsNjA5Miw2MDkzLDYwOTQsNjA5NSw2MDk2LCAjIDEzOTIKNjA5Nyw2MDk4LDYwOTksNjEwMCw2MTAxLDYxMDIsNjEwMyw2MTA0LDYxMDUsNjEwNiw2MTA3LDYxMDgsNjEwOSw2MTEwLDYxMTEsNjExMiwgIyAxNDA4CjYxMTMsNjExNCwyMDQ0LDIwNjAsNDYyMSwgOTk3LDEyMzUsIDQ3MywxMTg2LDQ2MjIsIDkyMCwzMzc4LDYxMTUsNjExNiwgMzc5LDExMDgsICMgMTQyNAo0MzEzLDI2NTcsMjczNSwzOTM0LDYxMTcsMzgwOSwgNjM2LDMyMzMsIDU3MywxMDI2LDM2OTMsMzQzNSwyOTc0LDMzMDAsMjI5OCw0MTA1LCAjIDE0NDAKIDg1NCwyOTM3LDI0NjMsIDM5MywyNTgxLDI0MTcsIDUzOSwgNzUyLDEyODAsMjc1MCwyNDgwLCAxNDAsMTE2MSwgNDQwLCA3MDgsMTU2OSwgIyAxNDU2CiA2NjUsMjQ5NywxNzQ2LDEyOTEsMTUyMywzMDAwLCAxNjQsMTYwMywgODQ3LDEzMzEsIDUzNywxOTk3LCA0ODYsIDUwOCwxNjkzLDI0MTgsICMgMTQ3MgoxOTcwLDIyMjcsIDg3OCwxMjIwLCAyOTksMTAzMCwgOTY5LCA2NTIsMjc1MSwgNjI0LDExMzcsMzMwMSwyNjE5LCAgNjUsMzMwMiwyMDQ1LCAjIDE0ODgKMTc2MSwxODU5LDMxMjAsMTkzMCwzNjk0LDM1MTYsIDY2MywxNzY3LCA4NTIsIDgzNSwzNjk1LCAyNjksIDc2NywyODI2LDIzMzksMTMwNSwgIyAxNTA0CiA4OTYsMTE1MCwgNzcwLDE2MTYsNjExOCwgNTA2LDE1MDIsMjA3NSwxMDEyLDI1MTksIDc3NSwyNTIwLDI5NzUsMjM0MCwyOTM4LDQzMTQsICMgMTUyMAozMDI4LDIwODYsMTIyNCwxOTQzLDIyODYsNjExOSwzMDcyLDQzMTUsMjI0MCwxMjczLDE5ODcsMzkzNSwxNTU3LCAxNzUsIDU5NywgOTg1LCAjIDE1MzYKMzUxNywyNDE5LDI1MjEsMTQxNiwzMDI5LCA1ODUsIDkzOCwxOTMxLDEwMDcsMTA1MiwxOTMyLDE2ODUsNjEyMCwzMzc5LDQzMTYsNDYyMywgIyAxNTUyCiA4MDQsIDU5OSwzMTIxLDEzMzMsMjEyOCwyNTM5LDExNTksMTU1NCwyMDMyLDM4MTAsIDY4NywyMDMzLDI5MDQsIDk1MiwgNjc1LDE0NjcsICMgMTU2OAozNDM2LDYxMjEsMjI0MSwxMDk2LDE3ODYsMjQ0MCwxNTQzLDE5MjQsIDk4MCwxODEzLDIyMjgsIDc4MSwyNjkyLDE4NzksIDcyOCwxOTE4LCAjIDE1ODQKMzY5Niw0NjI0LCA1NDgsMTk1MCw0NjI1LDE4MDksMTA4OCwxMzU2LDMzMDMsMjUyMiwxOTQ0LCA1MDIsIDk3MiwgMzczLCA1MTMsMjgyNywgIyAxNjAwCiA1ODYsMjM3NywyMzkxLDEwMDMsMTk3NiwxNjMxLDYxMjIsMjQ2NCwxMDg0LCA2NDgsMTc3Niw0NjI2LDIxNDEsIDMyNCwgOTYyLDIwMTIsICMgMTYxNgoyMTc3LDIwNzYsMTM4NCwgNzQyLDIxNzgsMTQ0OCwxMTczLDE4MTAsIDIyMiwgMTAyLCAzMDEsIDQ0NSwgMTI1LDI0MjAsIDY2MiwyNDk4LCAjIDE2MzIKIDI3NywgMjAwLDE0NzYsMTE2NSwxMDY4LCAyMjQsMjU2MiwxMzc4LDE0NDYsIDQ1MCwxODgwLCA2NTksIDc5MSwgNTgyLDQ2MjcsMjkzOSwgIyAxNjQ4CjM5MzYsMTUxNiwxMjc0LCA1NTUsMjA5OSwzNjk3LDEwMjAsMTM4OSwxNTI2LDMzODAsMTc2MiwxNzIzLDE3ODcsMjIyOSwgNDEyLDIxMTQsICMgMTY2NAoxOTAwLDIzOTIsMzUxOCwgNTEyLDI1OTcsIDQyNywxOTI1LDIzNDEsMzEyMiwxNjUzLDE2ODYsMjQ2NSwyNDk5LCA2OTcsIDMzMCwgMjczLCAjIDE2ODAKIDM4MCwyMTYyLCA5NTEsIDgzMiwgNzgwLCA5OTEsMTMwMSwzMDczLCA5NjUsMjI3MCwzNTE5LCA2NjgsMjUyMywyNjM2LDEyODYsIDUzNSwgIyAxNjk2CjE0MDcsIDUxOCwgNjcxLCA5NTcsMjY1OCwyMzc4LCAyNjcsIDYxMSwyMTk3LDMwMzAsNjEyMywgMjQ4LDIyOTksIDk2NywxNzk5LDIzNTYsICMgMTcxMgogODUwLDE0MTgsMzQzNywxODc2LDEyNTYsMTQ4MCwyODI4LDE3MTgsNjEyNCw2MTI1LDE3NTUsMTY2NCwyNDA1LDYxMjYsNDYyOCwyODc5LCAjIDE3MjgKMjgyOSwgNDk5LDIxNzksIDY3Niw0NjI5LCA1NTcsMjMyOSwyMjE0LDIwOTAsIDMyNSwzMjM0LCA0NjQsIDgxMSwzMDAxLCA5OTIsMjM0MiwgIyAxNzQ0CjI0ODEsMTIzMiwxNDY5LCAzMDMsMjI0MiwgNDY2LDEwNzAsMjE2MywgNjAzLDE3NzcsMjA5MSw0NjMwLDI3NTIsNDYzMSwyNzE0LCAzMjIsICMgMTc2MAoyNjU5LDE5NjQsMTc2OCwgNDgxLDIxODgsMTQ2MywyMzMwLDI4NTcsMzYwMCwyMDkyLDMwMzEsMjQyMSw0NjMyLDIzMTgsMjA3MCwxODQ5LCAjIDE3NzYKMjU5OCw0NjMzLDEzMDIsMjI1NCwxNjY4LDE3MDEsMjQyMiwzODExLDI5MDUsMzAzMiwzMTIzLDIwNDYsNDEwNiwxNzYzLDE2OTQsNDYzNCwgIyAxNzkyCjE2MDQsIDk0MywxNzI0LDE0NTQsIDkxNywgODY4LDIyMTUsMTE2OSwyOTQwLCA1NTIsMTE0NSwxODAwLDEyMjgsMTgyMywxOTU1LCAzMTYsICMgMTgwOAoxMDgwLDI1MTAsIDM2MSwxODA3LDI4MzAsNDEwNywyNjYwLDMzODEsMTM0NiwxNDIzLDExMzQsNDEwOCw2MTI3LCA1NDEsMTI2MywxMjI5LCAjIDE4MjQKMTE0OCwyNTQwLCA1NDUsIDQ2NSwxODMzLDI4ODAsMzQzOCwxOTAxLDMwNzQsMjQ4MiwgODE2LDM5MzcsIDcxMywxNzg4LDI1MDAsIDEyMiwgIyAxODQwCjE1NzUsIDE5NSwxNDUxLDI1MDEsMTExMSw2MTI4LCA4NTksIDM3NCwxMjI1LDIyNDMsMjQ4Myw0MzE3LCAzOTAsMTAzMywzNDM5LDMwNzUsICMgMTg1NgoyNTI0LDE2ODcsIDI2NiwgNzkzLDE0NDAsMjU5OSwgOTQ2LCA3NzksIDgwMiwgNTA3LCA4OTcsMTA4MSwgNTI4LDIxODksMTI5MiwgNzExLCAjIDE4NzIKMTg2NiwxNzI1LDExNjcsMTY0MCwgNzUzLCAzOTgsMjY2MSwxMDUzLCAyNDYsIDM0OCw0MzE4LCAxMzcsMTAyNCwzNDQwLDE2MDAsMjA3NywgIyAxODg4CjIxMjksIDgyNSw0MzE5LCA2OTgsIDIzOCwgNTIxLCAxODcsMjMwMCwxMTU3LDI0MjMsMTY0MSwxNjA1LDE0NjQsMTYxMCwxMDk3LDI1NDEsICMgMTkwNAoxMjYwLDE0MzYsIDc1OSwyMjU1LDE4MTQsMjE1MCwgNzA1LDMyMzUsIDQwOSwyNTYzLDMzMDQsIDU2MSwzMDMzLDIwMDUsMjU2NCwgNzI2LCAjIDE5MjAKMTk1NiwyMzQzLDM2OTgsNDEwOSwgOTQ5LDM4MTIsMzgxMywzNTIwLDE2NjksIDY1MywxMzc5LDI1MjUsIDg4MSwyMTk4LCA2MzIsMjI1NiwgIyAxOTM2CjEwMjcsIDc3OCwxMDc0LCA3MzMsMTk1NywgNTE0LDE0ODEsMjQ2NiwgNTU0LDIxODAsIDcwMiwzOTM4LDE2MDYsMTAxNywxMzk4LDYxMjksICMgMTk1MgoxMzgwLDM1MjEsIDkyMSwgOTkzLDEzMTMsIDU5NCwgNDQ5LDE0ODksMTYxNywxMTY2LCA3NjgsMTQyNiwxMzYwLCA0OTUsMTc5NCwzNjAxLCAjIDE5NjgKMTE3NywzNjAyLDExNzAsNDMyMCwyMzQ0LCA0NzYsIDQyNSwzMTY3LDQ2MzUsMzE2OCwxNDI0LCA0MDEsMjY2MiwxMTcxLDMzODIsMTk5OCwgIyAxOTg0CjEwODksNDExMCwgNDc3LDMxNjksIDQ3NCw2MTMwLDE5MDksIDU5NiwyODMxLDE4NDIsIDQ5NCwgNjkzLDEwNTEsMTAyOCwxMjA3LDMwNzYsICMgMjAwMAogNjA2LDIxMTUsIDcyNywyNzkwLDE0NzMsMTExNSwgNzQzLDM1MjIsIDYzMCwgODA1LDE1MzIsNDMyMSwyMDIxLCAzNjYsMTA1NywgODM4LCAjIDIwMTYKIDY4NCwxMTE0LDIxNDIsNDMyMiwyMDUwLDE0OTIsMTg5MiwxODA4LDIyNzEsMzgxNCwyNDI0LDE5NzEsMTQ0NywxMzczLDMzMDUsMTA5MCwgIyAyMDMyCjE1MzYsMzkzOSwzNTIzLDMzMDYsMTQ1NSwyMTk5LCAzMzYsIDM2OSwyMzMxLDEwMzUsIDU4NCwyMzkzLCA5MDIsIDcxOCwyNjAwLDYxMzEsICMgMjA0OAoyNzUzLCA0NjMsMjE1MSwxMTQ5LDE2MTEsMjQ2NywgNzE1LDEzMDgsMzEyNCwxMjY4LCAzNDMsMTQxMywzMjM2LDE1MTcsMTM0NywyNjYzLCAjIDIwNjQKMjA5MywzOTQwLDIwMjIsMTEzMSwxNTUzLDIxMDAsMjk0MSwxNDI3LDM0NDEsMjk0MiwxMzIzLDI0ODQsNjEzMiwxOTgwLCA4NzIsMjM2OCwgIyAyMDgwCjI0NDEsMjk0MywgMzIwLDIzNjksMjExNiwxMDgyLCA2NzksMTkzMywzOTQxLDI3OTEsMzgxNSwgNjI1LDExNDMsMjAyMywgNDIyLDIyMDAsICMgMjA5NgozODE2LDYxMzMsIDczMCwxNjk1LCAzNTYsMjI1NywxNjI2LDIzMDEsMjg1OCwyNjM3LDE2MjcsMTc3OCwgOTM3LCA4ODMsMjkwNiwyNjkzLCAjIDIxMTIKMzAwMiwxNzY5LDEwODYsIDQwMCwxMDYzLDEzMjUsMzMwNywyNzkyLDQxMTEsMzA3NywgNDU2LDIzNDUsMTA0NiwgNzQ3LDYxMzQsMTUyNCwgIyAyMTI4CiA4ODQsMTA5NCwzMzgzLDE0NzQsMjE2NCwxMDU5LCA5NzQsMTY4OCwyMTgxLDIyNTgsMTA0NywgMzQ1LDE2NjUsMTE4NywgMzU4LCA4NzUsICMgMjE0NAozMTcwLCAzMDUsIDY2MCwzNTI0LDIxOTAsMTMzNCwxMTM1LDMxNzEsMTU0MCwxNjQ5LDI1NDIsMTUyNywgOTI3LCA5NjgsMjc5MywgODg1LCAjIDIxNjAKMTk3MiwxODUwLCA0ODIsIDUwMCwyNjM4LDEyMTgsMTEwOSwxMDg1LDI1NDMsMTY1NCwyMDM0LCA4NzYsICA3OCwyMjg3LDE0ODIsMTI3NywgIyAyMTc2CiA4NjEsMTY3NSwxMDgzLDE3NzksIDcyNCwyNzU0LCA0NTQsIDM5NywxMTMyLDE2MTIsMjMzMiwgODkzLCA2NzIsMTIzNywgMjU3LDIyNTksICMgMjE5MgoyMzcwLCAxMzUsMzM4NCwgMzM3LDIyNDQsIDU0NywgMzUyLCAzNDAsIDcwOSwyNDg1LDE0MDAsIDc4OCwxMTM4LDI1MTEsIDU0MCwgNzcyLCAjIDIyMDgKMTY4MiwyMjYwLDIyNzIsMjU0NCwyMDEzLDE4NDMsMTkwMiw0NjM2LDE5OTksMTU2MiwyMjg4LDQ2MzcsMjIwMSwxNDAzLDE1MzMsIDQwNywgIyAyMjI0CiA1NzYsMzMwOCwxMjU0LDIwNzEsIDk3OCwzMzg1LCAxNzAsIDEzNiwxMjAxLDMxMjUsMjY2NCwzMTcyLDIzOTQsIDIxMywgOTEyLCA4NzMsICMgMjI0MAozNjAzLDE3MTMsMjIwMiwgNjk5LDM2MDQsMzY5OSwgODEzLDM0NDIsIDQ5MywgNTMxLDEwNTQsIDQ2OCwyOTA3LDE0ODMsIDMwNCwgMjgxLCAjIDIyNTYKNDExMiwxNzI2LDEyNTIsMjA5NCwgMzM5LDIzMTksMjEzMCwyNjM5LCA3NTYsMTU2MywyOTQ0LCA3NDgsIDU3MSwyOTc2LDE1ODgsMjQyNSwgIyAyMjcyCjI3MTUsMTg1MSwxNDYwLDI0MjYsMTUyOCwxMzkyLDE5NzMsMzIzNywgMjg4LDMzMDksIDY4NSwzMzg2LCAyOTYsIDg5MiwyNzE2LDIyMTYsICMgMjI4OAoxNTcwLDIyNDUsIDcyMiwxNzQ3LDIyMTcsIDkwNSwzMjM4LDExMDMsNjEzNSwxODkzLDE0NDEsMTk2NSwgMjUxLDE4MDUsMjM3MSwzNzAwLCAjIDIzMDQKMjYwMSwxOTE5LDEwNzgsICA3NSwyMTgyLDE1MDksMTU5MiwxMjcwLDI2NDAsNDYzOCwyMTUyLDYxMzYsMzMxMCwzODE3LCA1MjQsIDcwNiwgIyAyMzIwCjEwNzUsIDI5MiwzODE4LDE3NTYsMjYwMiwgMzE3LCAgOTgsMzE3MywzNjA1LDM1MjUsMTg0NCwyMjE4LDM4MTksMjUwMiwgODE0LCA1NjcsICMgMjMzNgogMzg1LDI5MDgsMTUzNCw2MTM3LCA1MzQsMTY0MiwzMjM5LCA3OTcsNjEzOCwxNjcwLDE1MjksIDk1Myw0MzIzLCAxODgsMTA3MSwgNTM4LCAjIDIzNTIKIDE3OCwgNzI5LDMyNDAsMjEwOSwxMjI2LDEzNzQsMjAwMCwyMzU3LDI5NzcsIDczMSwyNDY4LDExMTYsMjAxNCwyMDUxLDYxMzksMTI2MSwgIyAyMzY4CjE1OTMsIDgwMywyODU5LDI3MzYsMzQ0MywgNTU2LCA2ODIsIDgyMywxNTQxLDYxNDAsMTM2OSwyMjg5LDE3MDYsMjc5NCwgODQ1LCA0NjIsICMgMjM4NAoyNjAzLDI2NjUsMTM2MSwgMzg3LCAxNjIsMjM1OCwxNzQwLCA3MzksMTc3MCwxNzIwLDEzMDQsMTQwMSwzMjQxLDEwNDksIDYyNywxNTcxLCAjIDI0MDAKMjQyNywzNTI2LDE4NzcsMzk0MiwxODUyLDE1MDAsIDQzMSwxOTEwLDE1MDMsIDY3NywgMjk3LDI3OTUsIDI4NiwxNDMzLDEwMzgsMTE5OCwgIyAyNDE2CjIyOTAsMTEzMywxNTk2LDQxMTMsNDYzOSwyNDY5LDE1MTAsMTQ4NCwzOTQzLDYxNDEsMjQ0MiwgMTA4LCA3MTIsNDY0MCwyMzcyLCA4NjYsICMgMjQzMgozNzAxLDI3NTUsMzI0MiwxMzQ4LCA4MzQsMTk0NSwxNDA4LDM1MjcsMjM5NSwzMjQzLDE4MTEsIDgyNCwgOTk0LDExNzksMjExMCwxNTQ4LCAjIDI0NDgKMTQ1MywgNzkwLDMwMDMsIDY5MCw0MzI0LDQzMjUsMjgzMiwyOTA5LDM4MjAsMTg2MCwzODIxLCAyMjUsMTc0OCwgMzEwLCAzNDYsMTc4MCwgIyAyNDY0CjI0NzAsIDgyMSwxOTkzLDI3MTcsMjc5NiwgODI4LCA4NzcsMzUyOCwyODYwLDI0NzEsMTcwMiwyMTY1LDI5MTAsMjQ4NiwxNzg5LCA0NTMsICMgMjQ4MAogMzU5LDIyOTEsMTY3NiwgIDczLDExNjQsMTQ2MSwxMTI3LDMzMTEsIDQyMSwgNjA0LCAzMTQsMTAzNywgNTg5LCAxMTYsMjQ4NywgNzM3LCAjIDI0OTYKIDgzNywxMTgwLCAxMTEsIDI0NCwgNzM1LDYxNDIsMjI2MSwxODYxLDEzNjIsIDk4NiwgNTIzLCA0MTgsIDU4MSwyNjY2LDM4MjIsIDEwMywgIyAyNTEyCiA4NTUsIDUwMywxNDE0LDE4NjcsMjQ4OCwxMDkxLCA2NTcsMTU5NywgOTc5LCA2MDUsMTMxNiw0NjQxLDEwMjEsMjQ0MywyMDc4LDIwMDEsICMgMjUyOAoxMjA5LCAgOTYsIDU4NywyMTY2LDEwMzIsIDI2MCwxMDcyLDIxNTMsIDE3MywgIDk0LCAyMjYsMzI0NCwgODE5LDIwMDYsNDY0Miw0MTE0LCAjIDI1NDQKMjIwMywgMjMxLDE3NDQsIDc4MiwgIDk3LDI2NjcsIDc4NiwzMzg3LCA4ODcsIDM5MSwgNDQyLDIyMTksNDMyNiwxNDI1LDYxNDMsMjY5NCwgIyAyNTYwCiA2MzMsMTU0NCwxMjAyLCA0ODMsMjAxNSwgNTkyLDIwNTIsMTk1OCwyNDcyLDE2NTUsIDQxOSwgMTI5LDQzMjcsMzQ0NCwzMzEyLDE3MTQsICMgMjU3NgoxMjU3LDMwNzgsNDMyOCwxNTE4LDEwOTgsIDg2NSwxMzEwLDEwMTksMTg4NSwxNTEyLDE3MzQsIDQ2OSwyNDQ0LCAxNDgsIDc3MywgNDM2LCAjIDI1OTIKMTgxNSwxODY4LDExMjgsMTA1NSw0MzI5LDEyNDUsMjc1NiwzNDQ1LDIxNTQsMTkzNCwxMDM5LDQ2NDMsIDU3OSwxMjM4LCA5MzIsMjMyMCwgIyAyNjA4CiAzNTMsIDIwNSwgODAxLCAxMTUsMjQyOCwgOTQ0LDIzMjEsMTg4MSwgMzk5LDI1NjUsMTIxMSwgNjc4LCA3NjYsMzk0NCwgMzM1LDIxMDEsICMgMjYyNAoxNDU5LDE3ODEsMTQwMiwzOTQ1LDI3MzcsMjEzMSwxMDEwLCA4NDQsIDk4MSwxMzI2LDEwMTMsIDU1MCwxODE2LDE1NDUsMjYyMCwxMzM1LCAjIDI2NDAKMTAwOCwgMzcxLDI4ODEsIDkzNiwxNDE5LDE2MTMsMzUyOSwxNDU2LDEzOTUsMjI3MywxODM0LDI2MDQsMTMxNywyNzM4LDI1MDMsIDQxNiwgIyAyNjU2CjE2NDMsNDMzMCwgODA2LDExMjYsIDIyOSwgNTkxLDM5NDYsMTMxNCwxOTgxLDE1NzYsMTgzNywxNjY2LCAzNDcsMTc5MCwgOTc3LDMzMTMsICMgMjY3MgogNzY0LDI4NjEsMTg1MywgNjg4LDI0MjksMTkyMCwxNDYyLCAgNzcsIDU5NSwgNDE1LDIwMDIsMzAzNCwgNzk4LDExOTIsNDExNSw2MTQ0LCAjIDI2ODgKMjk3OCw0MzMxLDMwMzUsMjY5NSwyNTgyLDIwNzIsMjU2NiwgNDMwLDI0MzAsMTcyNywgODQyLDEzOTYsMzk0NywzNzAyLCA2MTMsIDM3NywgIyAyNzA0CiAyNzgsIDIzNiwxNDE3LDMzODgsMzMxNCwzMTc0LCA3NTcsMTg2OSwgMTA3LDM1MzAsNjE0NSwxMTk0LCA2MjMsMjI2MiwgMjA3LDEyNTMsICMgMjcyMAoyMTY3LDM0NDYsMzk0OCwgNDkyLDExMTcsMTkzNSwgNTM2LDE4MzgsMjc1NywxMjQ2LDQzMzIsIDY5NiwyMDk1LDI0MDYsMTM5MywxNTcyLCAjIDI3MzYKMzE3NSwxNzgyLCA1ODMsIDE5MCwgMjUzLDEzOTAsMjIzMCwgODMwLDMxMjYsMzM4OSwgOTM0LDMyNDUsMTcwMywxNzQ5LDI5NzksMTg3MCwgIyAyNzUyCjI1NDUsMTY1NiwyMjA0LCA4NjksMjM0Niw0MTE2LDMxNzYsMTgxNywgNDk2LDE3NjQsNDY0NCwgOTQyLDE1MDQsIDQwNCwxOTAzLDExMjIsICMgMjc2OAoxNTgwLDM2MDYsMjk0NSwxMDIyLCA1MTUsIDM3MiwxNzM1LCA5NTUsMjQzMSwzMDM2LDYxNDYsMjc5NywxMTEwLDIzMDIsMjc5OCwgNjE3LCAjIDI3ODQKNjE0NywgNDQxLCA3NjIsMTc3MSwzNDQ3LDM2MDcsMzYwOCwxOTA0LCA4NDAsMzAzNywgIDg2LCA5MzksMTM4NSwgNTcyLDEzNzAsMjQ0NSwgIyAyODAwCjEzMzYsIDExNCwzNzAzLCA4OTgsIDI5NCwgMjAzLDMzMTUsIDcwMywxNTgzLDIyNzQsIDQyOSwgOTYxLDQzMzMsMTg1NCwxOTUxLDMzOTAsICMgMjgxNgoyMzczLDM3MDQsNDMzNCwxMzE4LDEzODEsIDk2NiwxOTExLDIzMjIsMTAwNiwxMTU1LCAzMDksIDk4OSwgNDU4LDI3MTgsMTc5NSwxMzcyLCAjIDI4MzIKMTIwMywgMjUyLDE2ODksMTM2MywzMTc3LCA1MTcsMTkzNiwgMTY4LDE0OTAsIDU2MiwgMTkzLDM4MjMsMTA0Miw0MTE3LDE4MzUsIDU1MSwgIyAyODQ4CiA0NzAsNDY0NSwgMzk1LCA0ODksMzQ0OCwxODcxLDE0NjUsMjU4MywyNjQxLCA0MTcsMTQ5MywgMjc5LDEyOTUsIDUxMSwxMjM2LDExMTksICMgMjg2NAogIDcyLDEyMzEsMTk4MiwxODEyLDMwMDQsIDg3MSwxNTY0LCA5ODQsMzQ0OSwxNjY3LDI2OTYsMjA5Niw0NjQ2LDIzNDcsMjgzMywxNjczLCAjIDI4ODAKMzYwOSwgNjk1LDMyNDYsMjY2OCwgODA3LDExODMsNDY0NywgODkwLCAzODgsMjMzMywxODAxLDE0NTcsMjkxMSwxNzY1LDE0NzcsMTAzMSwgIyAyODk2CjMzMTYsMzMxNywxMjc4LDMzOTEsMjc5OSwyMjkyLDI1MjYsIDE2MywzNDUwLDQzMzUsMjY2OSwxNDA0LDE4MDIsNjE0OCwyMzIzLDI0MDcsICMgMjkxMgoxNTg0LDE3MjgsMTQ5NCwxODI0LDEyNjksIDI5OCwgOTA5LDMzMTgsMTAzNCwxNjMyLCAzNzUsIDc3NiwxNjgzLDIwNjEsIDI5MSwgMjEwLCAjIDI5MjgKMTEyMywgODA5LDEyNDksMTAwMiwyNjQyLDMwMzgsIDIwNiwxMDExLDIxMzIsIDE0NCwgOTc1LCA4ODIsMTU2NSwgMzQyLCA2NjcsIDc1NCwgIyAyOTQ0CjE0NDIsMjE0MywxMjk5LDIzMDMsMjA2MiwgNDQ3LCA2MjYsMjIwNSwxMjIxLDI3MzksMjkxMiwxMTQ0LDEyMTQsMjIwNiwyNTg0LCA3NjAsICMgMjk2MAoxNzE1LCA2MTQsIDk1MCwxMjgxLDI2NzAsMjYyMSwgODEwLCA1NzcsMTI4NywyNTQ2LDQ2NDgsIDI0MiwyMTY4LCAyNTAsMjY0MywgNjkxLCAjIDI5NzYKIDEyMywyNjQ0LCA2NDcsIDMxMywxMDI5LCA2ODksMTM1NywyOTQ2LDE2NTAsIDIxNiwgNzcxLDEzMzksMTMwNiwgODA4LDIwNjMsIDU0OSwgIyAyOTkyCiA5MTMsMTM3MSwyOTEzLDI5MTQsNjE0OSwxNDY2LDEwOTIsMTE3NCwxMTk2LDEzMTEsMjYwNSwyMzk2LDE3ODMsMTc5NiwzMDc5LCA0MDYsICMgMzAwOAoyNjcxLDIxMTcsMzk0OSw0NjQ5LCA0ODcsMTgyNSwyMjIwLDYxNTAsMjkxNSwgNDQ4LDIzNDgsMTA3Myw2MTUxLDIzOTcsMTcwNywgMTMwLCAjIDMwMjQKIDkwMCwxNTk4LCAzMjksIDE3NiwxOTU5LDI1MjcsMTYyMCw2MTUyLDIyNzUsNDMzNiwzMzE5LDE5ODMsMjE5MSwzNzA1LDM2MTAsMjE1NSwgIyAzMDQwCjM3MDYsMTkxMiwxNTEzLDE2MTQsNjE1MywxOTg4LCA2NDYsIDM5MiwyMzA0LDE1ODksMzMyMCwzMDM5LDE4MjYsMTIzOSwxMzUyLDEzNDAsICMgMzA1NgoyOTE2LCA1MDUsMjU2NywxNzA5LDE0MzcsMjQwOCwyNTQ3LCA5MDYsNjE1NCwyNjcyLCAzODQsMTQ1OCwxNTk0LDExMDAsMTMyOSwgNzEwLCAjIDMwNzIKIDQyMywzNTMxLDIwNjQsMjIzMSwyNjIyLDE5ODksMjY3MywxMDg3LDE4ODIsIDMzMywgODQxLDMwMDUsMTI5NiwyODgyLDIzNzksIDU4MCwgIyAzMDg4CjE5MzcsMTgyNywxMjkzLDI1ODUsIDYwMSwgNTc0LCAyNDksMTc3Miw0MTE4LDIwNzksMTEyMCwgNjQ1LCA5MDEsMTE3NiwxNjkwLCA3OTUsICMgMzEwNAoyMjA3LCA0NzgsMTQzNCwgNTE2LDExOTAsMTUzMCwgNzYxLDIwODAsIDkzMCwxMjY0LCAzNTUsIDQzNSwxNTUyLCA2NDQsMTc5MSwgOTg3LCAjIDMxMjAKIDIyMCwxMzY0LDExNjMsMTEyMSwxNTM4LCAzMDYsMjE2OSwxMzI3LDEyMjIsIDU0NiwyNjQ1LCAyMTgsIDI0MSwgNjEwLDE3MDQsMzMyMSwgIyAzMTM2CjE5ODQsMTgzOSwxOTY2LDI1MjgsIDQ1MSw2MTU1LDI1ODYsMzcwNywyNTY4LCA5MDcsMzE3OCwgMjU0LDI5NDcsIDE4NiwxODQ1LDQ2NTAsICMgMzE1MgogNzQ1LCA0MzIsMTc1NywgNDI4LDE2MzMsIDg4OCwyMjQ2LDIyMjEsMjQ4OSwzNjExLDIxMTgsMTI1OCwxMjY1LCA5NTYsMzEyNywxNzg0LCAjIDMxNjgKNDMzNywyNDkwLCAzMTksIDUxMCwgMTE5LCA0NTcsMzYxMiwgMjc0LDIwMzUsMjAwNyw0NjUxLDE0MDksMzEyOCwgOTcwLDI3NTgsIDU5MCwgIyAzMTg0CjI4MDAsIDY2MSwyMjQ3LDQ2NTIsMjAwOCwzOTUwLDE0MjAsMTU0OSwzMDgwLDMzMjIsMzk1MSwxNjUxLDEzNzUsMjExMSwgNDg1LDI0OTEsICMgMzIwMAoxNDI5LDExNTYsNjE1NiwyNTQ4LDIxODMsMTQ5NSwgODMxLDE4NDAsMjUyOSwyNDQ2LCA1MDEsMTY1NywgMzA3LDE4OTQsMzI0NywxMzQxLCAjIDMyMTYKIDY2NiwgODk5LDIxNTYsMTUzOSwyNTQ5LDE1NTksIDg4NiwgMzQ5LDIyMDgsMzA4MSwyMzA1LDE3MzYsMzgyNCwyMTcwLDI3NTksMTAxNCwgIyAzMjMyCjE5MTMsMTM4NiwgNTQyLDEzOTcsMjk0OCwgNDkwLCAzNjgsIDcxNiwgMzYyLCAxNTksIDI4MiwyNTY5LDExMjksMTY1OCwxMjg4LDE3NTAsICMgMzI0OAoyNjc0LCAyNzYsIDY0OSwyMDE2LCA3NTEsMTQ5NiwgNjU4LDE4MTgsMTI4NCwxODYyLDIyMDksMjA4NywyNTEyLDM0NTEsIDYyMiwyODM0LCAjIDMyNjQKIDM3NiwgMTE3LDEwNjAsMjA1MywxMjA4LDE3MjEsMTEwMSwxNDQzLCAyNDcsMTI1MCwzMTc5LDE3OTIsMzk1MiwyNzYwLDIzOTgsMzk1MywgIyAzMjgwCjYxNTcsMjE0NCwzNzA4LCA0NDYsMjQzMiwxMTUxLDI1NzAsMzQ1MiwyNDQ3LDI3NjEsMjgzNSwxMjEwLDI0NDgsMzA4MiwgNDI0LDIyMjIsICMgMzI5NgoxMjUxLDI0NDksMjExOSwyODM2LCA1MDQsMTU4MSw0MzM4LCA2MDIsIDgxNywgODU3LDM4MjUsMjM0OSwyMzA2LCAzNTcsMzgyNiwxNDcwLCAjIDMzMTIKMTg4MywyODgzLCAyNTUsIDk1OCwgOTI5LDI5MTcsMzI0OCwgMzAyLDQ2NTMsMTA1MCwxMjcxLDE3NTEsMjMwNywxOTUyLDE0MzAsMjY5NywgIyAzMzI4CjI3MTksMjM1OSwgMzU0LDMxODAsIDc3NywgMTU4LDIwMzYsNDMzOSwxNjU5LDQzNDAsNDY1NCwyMzA4LDI5NDksMjI0OCwxMTQ2LDIyMzIsICMgMzM0NAozNTMyLDI3MjAsMTY5NiwyNjIzLDM4MjcsNjE1OCwzMTI5LDE1NTAsMjY5OCwxNDg1LDEyOTcsMTQyOCwgNjM3LCA5MzEsMjcyMSwyMTQ1LCAjIDMzNjAKIDkxNCwyNTUwLDI1ODcsICA4MSwyNDUwLCA2MTIsIDgyNywyNjQ2LDEyNDIsNDY1NSwxMTE4LDI4ODQsIDQ3MiwxODU1LDMxODEsMzUzMywgIyAzMzc2CjM1MzQsIDU2OSwxMzUzLDI2OTksMTI0NCwxNzU4LDI1ODgsNDExOSwyMDA5LDI3NjIsMjE3MSwzNzA5LDEzMTIsMTUzMSw2MTU5LDExNTIsICMgMzM5MgoxOTM4LCAxMzQsMTgzMCwgNDcxLDM3MTAsMjI3NiwxMTEyLDE1MzUsMzMyMywzNDUzLDM1MzUsIDk4MiwxMzM3LDI5NTAsIDQ4OCwgODI2LCAjIDM0MDgKIDY3NCwxMDU4LDE2MjgsNDEyMCwyMDE3LCA1MjIsMjM5OSwgMjExLCA1NjgsMTM2NywzNDU0LCAzNTAsIDI5MywxODcyLDExMzksMzI0OSwgIyAzNDI0CjEzOTksMTk0NiwzMDA2LDEzMDAsMjM2MCwzMzI0LCA1ODgsIDczNiw2MTYwLDI2MDYsIDc0NCwgNjY5LDM1MzYsMzgyOCw2MTYxLDEzNTgsICMgMzQ0MAogMTk5LCA3MjMsIDg0OCwgOTMzLCA4NTEsMTkzOSwxNTA1LDE1MTQsMTMzOCwxNjE4LDE4MzEsNDY1NiwxNjM0LDM2MTMsIDQ0MywyNzQwLCAjIDM0NTYKMzgyOSwgNzE3LDE5NDcsIDQ5MSwxOTE0LDYxNjIsMjU1MSwxNTQyLDQxMjEsMTAyNSw2MTYzLDEwOTksMTIyMywgMTk4LDMwNDAsMjcyMiwgIyAzNDcyCiAzNzAsIDQxMCwxOTA1LDI1ODksIDk5OCwxMjQ4LDMxODIsMjM4MCwgNTE5LDE0NDksNDEyMiwxNzEwLCA5NDcsIDkyOCwxMTUzLDQzNDEsICMgMzQ4OAoyMjc3LCAzNDQsMjYyNCwxNTExLCA2MTUsIDEwNSwgMTYxLDEyMTIsMTA3NiwxOTYwLDMxMzAsMjA1NCwxOTI2LDExNzUsMTkwNiwyNDczLCAjIDM1MDQKIDQxNCwxODczLDI4MDEsNjE2NCwyMzA5LCAzMTUsMTMxOSwzMzI1LCAzMTgsMjAxOCwyMTQ2LDIxNTcsIDk2MywgNjMxLCAyMjMsNDM0MiwgIyAzNTIwCjQzNDMsMjY3NSwgNDc5LDM3MTEsMTE5NywyNjI1LDM3MTIsMjY3NiwyMzYxLDYxNjUsNDM0NCw0MTIzLDYxNjYsMjQ1MSwzMTgzLDE4ODYsICMgMzUzNgoyMTg0LDE2NzQsMTMzMCwxNzExLDE2MzUsMTUwNiwgNzk5LCAyMTksMzI1MCwzMDgzLDM5NTQsMTY3NywzNzEzLDMzMjYsMjA4MSwzNjE0LCAjIDM1NTIKMTY1MiwyMDczLDQ2NTcsMTE0NywzMDQxLDE3NTIsIDY0MywxOTYxLCAxNDcsMTk3NCwzOTU1LDYxNjcsMTcxNiwyMDM3LCA5MTgsMzAwNywgIyAzNTY4CjE5OTQsIDEyMCwxNTM3LCAxMTgsIDYwOSwzMTg0LDQzNDUsIDc0MCwzNDU1LDEyMTksIDMzMiwxNjE1LDM4MzAsNjE2OCwxNjIxLDI5ODAsICMgMzU4NAoxNTgyLCA3ODMsIDIxMiwgNTUzLDIzNTAsMzcxNCwxMzQ5LDI0MzMsMjA4Miw0MTI0LCA4ODksNjE2OSwyMzEwLDEyNzUsMTQxMCwgOTczLCAjIDM2MDAKIDE2NiwxMzIwLDM0NTYsMTc5NywxMjE1LDMxODUsMjg4NSwxODQ2LDI1OTAsMjc2Myw0NjU4LCA2MjksIDgyMiwzMDA4LCA3NjMsIDk0MCwgIyAzNjE2CjE5OTAsMjg2MiwgNDM5LDI0MDksMTU2NiwxMjQwLDE2MjIsIDkyNiwxMjgyLDE5MDcsMjc2NCwgNjU0LDIyMTAsMTYwNywgMzI3LDExMzAsICMgMzYzMgozOTU2LDE2NzgsMTYyMyw2MTcwLDI0MzQsMjE5MiwgNjg2LCA2MDgsMzgzMSwzNzE1LCA5MDMsMzk1NywzMDQyLDYxNzEsMjc0MSwxNTIyLCAjIDM2NDgKMTkxNSwxMTA1LDE1NTUsMjU1MiwxMzU5LCAzMjMsMzI1MSw0MzQ2LDM0NTcsIDczOCwxMzU0LDI1NTMsMjMxMSwyMzM0LDE4MjgsMjAwMywgIyAzNjY0CjM4MzIsMTc1MywyMzUxLDEyMjcsNjE3MiwxODg3LDQxMjUsMTQ3OCw2MTczLDI0MTAsMTg3NCwxNzEyLDE4NDcsIDUyMCwxMjA0LDI2MDcsICMgMzY4MAogMjY0LDQ2NTksIDgzNiwyNjc3LDIxMDIsIDYwMCw0NjYwLDM4MzMsMjI3OCwzMDg0LDYxNzQsNDM0NywzNjE1LDEzNDIsIDY0MCwgNTMyLCAjIDM2OTYKIDU0MywyNjA4LDE4ODgsMjQwMCwyNTkxLDEwMDksNDM0OCwxNDk3LCAzNDEsMTczNywzNjE2LDI3MjMsMTM5NCwgNTI5LDMyNTIsMTMyMSwgIyAzNzEyCiA5ODMsNDY2MSwxNTE1LDIxMjAsIDk3MSwyNTkyLCA5MjQsIDI4NywxNjYyLDMxODYsNDM0OSwyNzAwLDQzNTAsMTUxOSwgOTA4LDE5NDgsICMgMzcyOAoyNDUyLCAxNTYsIDc5NiwxNjI5LDE0ODYsMjIyMywyMDU1LCA2OTQsNDEyNiwxMjU5LDEwMzYsMzM5MiwxMjEzLDIyNDksMjc0MiwxODg5LCAjIDM3NDQKMTIzMCwzOTU4LDEwMTUsIDkxMCwgNDA4LCA1NTksMzYxNyw0NjYyLCA3NDYsIDcyNSwgOTM1LDQ2NjMsMzk1OSwzMDA5LDEyODksIDU2MywgIyAzNzYwCiA4NjcsNDY2NCwzOTYwLDE1NjcsMjk4MSwyMDM4LDI2MjYsIDk4OCwyMjYzLDIzODEsNDM1MSwgMTQzLDIzNzQsIDcwNCwxODk1LDYxNzUsICMgMzc3NgoxMTg4LDM3MTYsMjA4OCwgNjczLDMwODUsMjM2Miw0MzUyLCA0ODQsMTYwOCwxOTIxLDI3NjUsMjkxOCwgMjE1LCA5MDQsMzYxOCwzNTM3LCAjIDM3OTIKIDg5NCwgNTA5LCA5NzYsMzA0MywyNzAxLDM5NjEsNDM1MywyODM3LDI5ODIsIDQ5OCw2MTc2LDYxNzcsMTEwMiwzNTM4LDEzMzIsMzM5MywgIyAzODA4CjE0ODcsMTYzNiwxNjM3LCAyMzMsIDI0NSwzOTYyLCAzODMsIDY1MCwgOTk1LDMwNDQsIDQ2MCwxNTIwLDEyMDYsMjM1MiwgNzQ5LDMzMjcsICMgMzgyNAogNTMwLCA3MDAsIDM4OSwxNDM4LDE1NjAsMTc3MywzOTYzLDIyNjQsIDcxOSwyOTUxLDI3MjQsMzgzNCwgODcwLDE4MzIsMTY0NCwxMDAwLCAjIDM4NDAKIDgzOSwyNDc0LDM3MTcsIDE5NywxNjMwLDMzOTQsIDM2NSwyODg2LDM5NjQsMTI4NSwyMTMzLCA3MzQsIDkyMiwgODE4LDExMDYsIDczMiwgIyAzODU2CiA0ODAsMjA4MywxNzc0LDM0NTgsIDkyMywyMjc5LDEzNTAsIDIyMSwzMDg2LCAgODUsMjIzMywyMjM0LDM4MzUsMTU4NSwzMDEwLDIxNDcsICMgMzg3MgoxMzg3LDE3MDUsMjM4MiwxNjE5LDI0NzUsIDEzMywgMjM5LDI4MDIsMTk5MSwxMDE2LDIwODQsMjM4MywgNDExLDI4MzgsMTExMywgNjUxLCAjIDM4ODgKMTk4NSwxMTYwLDMzMjgsIDk5MCwxODYzLDMwODcsMTA0OCwxMjc2LDI2NDcsIDI2NSwyNjI3LDE1OTksMzI1MywyMDU2LCAxNTAsIDYzOCwgIyAzOTA0CjIwMTksIDY1NiwgODUzLCAzMjYsMTQ3OSwgNjgwLDE0MzksNDM1NCwxMDAxLDE3NTksIDQxMywzNDU5LDMzOTUsMjQ5MiwxNDMxLCA0NTksICMgMzkyMAo0MzU1LDExMjUsMzMyOSwyMjY1LDE5NTMsMTQ1MCwyMDY1LDI4NjMsIDg0OSwgMzUxLDI2NzgsMzEzMSwzMjU0LDMyNTUsMTEwNCwxNTc3LCAjIDM5MzYKIDIyNywxMzUxLDE2NDUsMjQ1MywyMTkzLDE0MjEsMjg4NywgODEyLDIxMjEsIDYzNCwgIDk1LDI0MzUsIDIwMSwyMzEyLDQ2NjUsMTY0NiwgIyAzOTUyCjE2NzEsMjc0MywxNjAxLDI1NTQsMjcwMiwyNjQ4LDIyODAsMTMxNSwxMzY2LDIwODksMzEzMiwxNTczLDM3MTgsMzk2NSwxNzI5LDExODksICMgMzk2OAogMzI4LDI2NzksMTA3NywxOTQwLDExMzYsIDU1OCwxMjgzLCA5NjQsMTE5NSwgNjIxLDIwNzQsMTE5OSwxNzQzLDM0NjAsMzYxOSwxODk2LCAjIDM5ODQKMTkxNiwxODkwLDM4MzYsMjk1MiwxMTU0LDIxMTIsMTA2NCwgODYyLCAzNzgsMzAxMSwyMDY2LDIxMTMsMjgwMywxNTY4LDI4MzksNjE3OCwgIyA0MDAwCjMwODgsMjkxOSwxOTQxLDE2NjAsMjAwNCwxOTkyLDIxOTQsIDE0MiwgNzA3LDE1OTAsMTcwOCwxNjI0LDE5MjIsMTAyMywxODM2LDEyMzMsICMgNDAxNgoxMDA0LDIzMTMsIDc4OSwgNzQxLDM2MjAsNjE3OSwxNjA5LDI0MTEsMTIwMCw0MTI3LDM3MTksMzcyMCw0NjY2LDIwNTcsMzcyMSwgNTkzLCAjIDQwMzIKMjg0MCwgMzY3LDI5MjAsMTg3OCw2MTgwLDM0NjEsMTUyMSwgNjI4LDExNjgsIDY5MiwyMjExLDI2NDksIDMwMCwgNzIwLDIwNjcsMjU3MSwgIyA0MDQ4CjI5NTMsMzM5NiwgOTU5LDI1MDQsMzk2NiwzNTM5LDM0NjIsMTk3NywgNzAxLDYxODEsIDk1NCwxMDQzLCA4MDAsIDY4MSwgMTgzLDM3MjIsICMgNDA2NAoxODAzLDE3MzAsMzU0MCw0MTI4LDIxMDMsIDgxNSwyMzE0LCAxNzQsIDQ2NywgMjMwLDI0NTQsMTA5MywyMTM0LCA3NTUsMzU0MSwzMzk3LCAjIDQwODAKMTE0MSwxMTYyLDYxODIsMTczOCwyMDM5LCAyNzAsMzI1NiwyNTEzLDEwMDUsMTY0NywyMTg1LDM4MzcsIDg1OCwxNjc5LDE4OTcsMTcxOSwgIyA0MDk2CjI5NTQsMjMyNCwxODA2LCA0MDIsIDY3MCwgMTY3LDQxMjksMTQ5OCwyMTU4LDIxMDQsIDc1MCw2MTgzLCA5MTUsIDE4OSwxNjgwLDE1NTEsICMgNDExMgogNDU1LDQzNTYsMTUwMSwyNDU1LCA0MDUsMTA5NSwyOTU1LCAzMzgsMTU4NiwxMjY2LDE4MTksIDU3MCwgNjQxLDEzMjQsIDIzNywxNTU2LCAjIDQxMjgKMjY1MCwxMzg4LDM3MjMsNjE4NCwxMzY4LDIzODQsMTM0MywxOTc4LDMwODksMjQzNiwgODc5LDM3MjQsIDc5MiwxMTkxLCA3NTgsMzAxMiwgIyA0MTQ0CjE0MTEsMjEzNSwxMzIyLDQzNTcsIDI0MCw0NjY3LDE4NDgsMzcyNSwxNTc0LDYxODUsIDQyMCwzMDQ1LDE1NDYsMTM5MSwgNzE0LDQzNTgsICMgNDE2MAoxOTY3LCA5NDEsMTg2NCwgODYzLCA2NjQsIDQyNiwgNTYwLDE3MzEsMjY4MCwxNzg1LDI4NjQsMTk0OSwyMzYzLCA0MDMsMzMzMCwxNDE1LCAjIDQxNzYKMTI3OSwyMTM2LDE2OTcsMjMzNSwgMjA0LCA3MjEsMjA5NywzODM4LCAgOTAsNjE4NiwyMDg1LDI1MDUsIDE5MSwzOTY3LCAxMjQsMjE0OCwgIyA0MTkyCjEzNzYsMTc5OCwxMTc4LDExMDcsMTg5OCwxNDA1LCA4NjAsNDM1OSwxMjQzLDEyNzIsMjM3NSwyOTgzLDE1NTgsMjQ1NiwxNjM4LCAxMTMsICMgNDIwOAozNjIxLCA1NzgsMTkyMywyNjA5LCA4ODAsIDM4Niw0MTMwLCA3ODQsMjE4NiwyMjY2LDE0MjIsMjk1NiwyMTcyLDE3MjIsIDQ5NywgMjYzLCAjIDQyMjQKMjUxNCwxMjY3LDI0MTIsMjYxMCwgMTc3LDI3MDMsMzU0MiwgNzc0LDE5MjcsMTM0NCwgNjE2LDE0MzIsMTU5NSwxMDE4LCAxNzIsNDM2MCwgIyA0MjQwCjIzMjUsIDkxMSw0MzYxLCA0MzgsMTQ2OCwzNjIyLCA3OTQsMzk2OCwyMDI0LDIxNzMsMTY4MSwxODI5LDI5NTcsIDk0NSwgODk1LDMwOTAsICMgNDI1NgogNTc1LDIyMTIsMjQ3NiwgNDc1LDI0MDEsMjY4MSwgNzg1LDI3NDQsMTc0NSwyMjkzLDI1NTUsMTk3NSwzMTMzLDI4NjUsIDM5NCw0NjY4LCAjIDQyNzIKMzgzOSwgNjM1LDQxMzEsIDYzOSwgMjAyLDE1MDcsMjE5NSwyNzY2LDEzNDUsMTQzNSwyNTcyLDM3MjYsMTkwOCwxMTg0LDExODEsMjQ1NywgIyA0Mjg4CjM3MjcsMzEzNCw0MzYyLCA4NDMsMjYxMSwgNDM3LCA5MTYsNDY2OSwgMjM0LCA3NjksMTg4NCwzMDQ2LDMwNDcsMzYyMywgODMzLDYxODcsICMgNDMwNAoxNjM5LDIyNTAsMjQwMiwxMzU1LDExODUsMjAxMCwyMDQ3LCA5OTksIDUyNSwxNzMyLDEyOTAsMTQ4OCwyNjEyLCA5NDgsMTU3OCwzNzI4LCAjIDQzMjAKMjQxMywyNDc3LDEyMTYsMjcyNSwyMTU5LCAzMzQsMzg0MCwxMzI4LDM2MjQsMjkyMSwxNTI1LDQxMzIsIDU2NCwxMDU2LCA4OTEsNDM2MywgIyA0MzM2CjE0NDQsMTY5OCwyMzg1LDIyNTEsMzcyOSwxMzY1LDIyODEsMjIzNSwxNzE3LDYxODgsIDg2NCwzODQxLDI1MTUsIDQ0NCwgNTI3LDI3NjcsICMgNDM1MgoyOTIyLDM2MjUsIDU0NCwgNDYxLDYxODksIDU2NiwgMjA5LDI0MzcsMzM5OCwyMDk4LDEwNjUsMjA2OCwzMzMxLDM2MjYsMzI1NywyMTM3LCAjIDQzNjggICNsYXN0IDUxMgopCgoKUEsDBBQAAAAAAAAAIQAGeSVqu0wAALtMAAAtAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvanBjbnR4LnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBDb21tdW5pY2F0b3IgY2xpZW50IGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAxOTk4CiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgoKIyBUaGlzIGlzIGhpcmFnYW5hIDItY2hhciBzZXF1ZW5jZSB0YWJsZSwgdGhlIG51bWJlciBpbiBlYWNoIGNlbGwgcmVwcmVzZW50cyBpdHMgZnJlcXVlbmN5IGNhdGVnb3J5CmpwMkNoYXJDb250ZXh0ID0gKAooMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwxKSwKKDIsNCwwLDQsMCwzLDAsNCwwLDMsNCw0LDQsMiw0LDMsMyw0LDMsMiwzLDMsNCwyLDMsMywzLDIsNCwxLDQsMywzLDEsNSw0LDMsNCwzLDQsMyw1LDMsMCwzLDUsNCwyLDAsMywxLDAsMywzLDAsMywzLDAsMSwxLDAsNCwzLDAsMywzLDAsNCwwLDIsMCwzLDUsNSw1LDUsNCwwLDQsMSwwLDMsNCksCigwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIpLAooMCw0LDAsNSwwLDUsMCw0LDAsNCw1LDQsNCwzLDUsMyw1LDEsNSwzLDQsMyw0LDQsMyw0LDMsMyw0LDMsNSw0LDQsMyw1LDUsMyw1LDUsNSwzLDUsNSwzLDQsNSw1LDMsMSwzLDIsMCwzLDQsMCw0LDIsMCw0LDIsMSw1LDMsMiwzLDUsMCw0LDAsMiwwLDUsNCw0LDUsNCw1LDAsNCwwLDAsNCw0KSwKKDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCksCigwLDMsMCw0LDAsMywwLDMsMCw0LDUsNCwzLDMsMywzLDQsMyw1LDQsNCwzLDUsNCw0LDMsNCwzLDQsNCw0LDQsNSwzLDQsNCwzLDQsNSw1LDQsNSw1LDEsNCw1LDQsMywwLDMsMywxLDMsMywwLDQsNCwwLDMsMywxLDUsMywzLDMsNSwwLDQsMCwzLDAsNCw0LDMsNCwzLDMsMCw0LDEsMSwzLDQpLAooMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwKSwKKDAsNCwwLDMsMCwzLDAsNCwwLDMsNCw0LDMsMiwyLDEsMiwxLDMsMSwzLDMsMywzLDMsNCwzLDEsMywzLDUsMywzLDAsNCwzLDAsNSw0LDMsMyw1LDQsNCwzLDQsNCw1LDAsMSwyLDAsMSwyLDAsMiwyLDAsMSwwLDAsNSwyLDIsMSw0LDAsMywwLDEsMCw0LDQsMyw1LDQsMywwLDIsMSwwLDQsMyksCigwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDApLAooMCwzLDAsNSwwLDQsMCwyLDEsNCw0LDIsNCwxLDQsMiw0LDIsNCwzLDMsMyw0LDMsMywzLDMsMSw0LDIsMywzLDMsMSw0LDQsMSwxLDEsNCwzLDMsMiwwLDIsNCwzLDIsMCwzLDMsMCwzLDEsMSwwLDAsMCwzLDMsMCw0LDIsMiwzLDQsMCw0LDAsMywwLDQsNCw1LDMsNCw0LDAsMywwLDAsMSw0KSwKKDEsNCwwLDQsMCw0LDAsNCwwLDMsNSw0LDQsMyw0LDMsNSw0LDMsMyw0LDMsNSw0LDQsNCw0LDMsNCwyLDQsMywzLDEsNSw0LDMsMiw0LDUsNCw1LDUsNCw0LDUsNCw0LDAsMywyLDIsMywzLDAsNCwzLDEsMywyLDEsNCwzLDMsNCw1LDAsMywwLDIsMCw0LDUsNSw0LDUsNCwwLDQsMCwwLDUsNCksCigwLDUsMCw1LDAsNCwwLDMsMCw0LDQsMyw0LDMsMywzLDQsMCw0LDQsNCwzLDQsMyw0LDMsMywxLDQsMiw0LDMsNCwwLDUsNCwxLDQsNSw0LDQsNSwzLDIsNCwzLDQsMywyLDQsMSwzLDMsMywyLDMsMiwwLDQsMywzLDQsMywzLDMsNCwwLDQsMCwzLDAsNCw1LDQsNCw0LDMsMCw0LDEsMCwxLDMpLAooMCwzLDEsNCwwLDMsMCwyLDAsMyw0LDQsMywxLDQsMiwzLDMsNCwzLDQsMyw0LDMsNCw0LDMsMiwzLDEsNSw0LDQsMSw0LDQsMyw1LDQsNCwzLDUsNSw0LDMsNCw0LDMsMSwyLDMsMSwyLDIsMCwzLDIsMCwzLDEsMCw1LDMsMywzLDQsMywzLDMsMyw0LDQsNCw0LDUsNCwyLDAsMywzLDIsNCwzKSwKKDAsMiwwLDMsMCwxLDAsMSwwLDAsMywyLDAsMCwyLDAsMSwwLDIsMSwzLDMsMywxLDIsMywxLDAsMSwwLDQsMiwxLDEsMywzLDAsNCwzLDMsMSw0LDMsMywwLDMsMywyLDAsMCwwLDAsMSwwLDAsMiwwLDAsMCwwLDAsNCwxLDAsMiwzLDIsMiwyLDEsMywzLDMsNCw0LDMsMiwwLDMsMSwwLDMsMyksCigwLDQsMCw0LDAsMywwLDMsMCw0LDQsNCwzLDMsMywzLDMsMyw0LDMsNCwyLDQsMyw0LDMsMywyLDQsMyw0LDUsNCwxLDQsNSwzLDUsNCw1LDMsNSw0LDAsMyw1LDUsMywxLDMsMywyLDIsMywwLDMsNCwxLDMsMywyLDQsMywzLDMsNCwwLDQsMCwzLDAsNCw1LDQsNCw1LDMsMCw0LDEsMCwzLDQpLAooMCwyLDAsMywwLDMsMCwwLDAsMiwyLDIsMSwwLDEsMCwwLDAsMywwLDMsMCwzLDAsMSwzLDEsMCwzLDEsMywzLDMsMSwzLDMsMywwLDEsMywxLDMsNCwwLDAsMywxLDEsMCwzLDIsMCwwLDAsMCwxLDMsMCwxLDAsMCwzLDMsMiwwLDMsMCwwLDAsMCwwLDMsNCwzLDQsMywzLDAsMywwLDAsMiwzKSwKKDIsMywwLDMsMCwyLDAsMSwwLDMsMyw0LDMsMSwzLDEsMSwxLDMsMSw0LDMsNCwzLDMsMywwLDAsMywxLDUsNCwzLDEsNCwzLDIsNSw1LDQsNCw0LDQsMywzLDQsNCw0LDAsMiwxLDEsMywyLDAsMSwyLDAsMCwxLDAsNCwxLDMsMywzLDAsMywwLDEsMCw0LDQsNCw1LDUsMywwLDIsMCwwLDQsNCksCigwLDIsMCwxLDAsMywxLDMsMCwyLDMsMywzLDAsMywxLDAsMCwzLDAsMywyLDMsMSwzLDIsMSwxLDAsMCw0LDIsMSwwLDIsMywxLDQsMywyLDAsNCw0LDMsMSwzLDEsMywwLDEsMCwwLDEsMCwwLDAsMSwwLDAsMCwwLDQsMSwxLDEsMiwwLDMsMCwwLDAsMyw0LDIsNCwzLDIsMCwxLDAsMCwzLDMpLAooMCwxLDAsNCwwLDUsMCw0LDAsMiw0LDQsMiwzLDMsMiwzLDMsNSwzLDMsMyw0LDMsNCwyLDMsMCw0LDMsMywzLDQsMSw0LDMsMiwxLDUsNSwzLDQsNSwxLDMsNSw0LDIsMCwzLDMsMCwxLDMsMCw0LDIsMCwxLDMsMSw0LDMsMywzLDMsMCwzLDAsMSwwLDMsNCw0LDQsNSw1LDAsMywwLDEsNCw1KSwKKDAsMiwwLDMsMCwzLDAsMCwwLDIsMywxLDMsMCw0LDAsMSwxLDMsMCwzLDQsMywyLDMsMSwwLDMsMywyLDMsMSwzLDAsMiwzLDAsMiwxLDQsMSwyLDIsMCwwLDMsMywwLDAsMiwwLDAsMCwxLDAsMCwwLDAsMiwyLDAsMywyLDEsMywzLDAsMiwwLDIsMCwwLDMsMywxLDIsNCwwLDMsMCwyLDIsMyksCigyLDQsMCw1LDAsNCwwLDQsMCwyLDQsNCw0LDMsNCwzLDMsMywxLDIsNCwzLDQsMyw0LDQsNSwwLDMsMywzLDMsMiwwLDQsMywxLDQsMyw0LDEsNCw0LDMsMyw0LDQsMywxLDIsMywwLDQsMiwwLDQsMSwwLDMsMywwLDQsMywzLDMsNCwwLDQsMCwyLDAsMyw1LDMsNCw1LDIsMCwzLDAsMCw0LDUpLAooMCwzLDAsNCwwLDEsMCwxLDAsMSwzLDIsMiwxLDMsMCwzLDAsMiwwLDIsMCwzLDAsMiwwLDAsMCwxLDAsMSwxLDAsMCwzLDEsMCwwLDAsNCwwLDMsMSwwLDIsMSwzLDAsMCwwLDAsMCwwLDMsMCwwLDAsMCwwLDAsMCw0LDIsMiwzLDEsMCwzLDAsMCwwLDEsNCw0LDQsMywwLDAsNCwwLDAsMSw0KSwKKDEsNCwxLDUsMCwzLDAsMywwLDQsNSw0LDQsMyw1LDMsMyw0LDQsMyw0LDEsMywzLDMsMywyLDEsNCwxLDUsNCwzLDEsNCw0LDMsNSw0LDQsMyw1LDQsMywzLDQsNCw0LDAsMywzLDEsMiwzLDAsMywxLDAsMywzLDAsNSw0LDQsNCw0LDQsNCwzLDMsNSw0LDQsMywzLDUsNCwwLDMsMiwwLDQsNCksCigwLDIsMCwzLDAsMSwwLDAsMCwxLDMsMywzLDIsNCwxLDMsMCwzLDEsMywwLDIsMiwxLDEsMCwwLDIsMCw0LDMsMSwwLDQsMywwLDQsNCw0LDEsNCwzLDEsMSwzLDMsMSwwLDIsMCwwLDEsMywwLDAsMCwwLDIsMCwwLDQsMywyLDQsMyw1LDQsMywzLDMsNCwzLDMsNCwzLDMsMCwyLDEsMCwzLDMpLAooMCwyLDAsNCwwLDMsMCwyLDAsMiw1LDUsMyw0LDQsNCw0LDEsNCwzLDMsMCw0LDMsNCwzLDEsMywzLDIsNCwzLDAsMyw0LDMsMCwzLDQsNCwyLDQsNCwwLDQsNSwzLDMsMiwyLDEsMSwxLDIsMCwxLDUsMCwzLDMsMiw0LDMsMywzLDQsMCwzLDAsMiwwLDQsNCwzLDUsNSwwLDAsMywwLDIsMywzKSwKKDAsMywwLDQsMCwzLDAsMSwwLDMsNCwzLDMsMSwzLDMsMywwLDMsMSwzLDAsNCwzLDMsMSwxLDAsMywwLDMsMywwLDAsNCw0LDAsMSw1LDQsMywzLDUsMCwzLDMsNCwzLDAsMiwwLDEsMSwxLDAsMSwzLDAsMSwyLDEsMywzLDIsMywzLDAsMywwLDEsMCwxLDMsMyw0LDQsMSwwLDEsMiwyLDEsMyksCigwLDEsMCw0LDAsNCwwLDMsMCwxLDMsMywzLDIsMywxLDEsMCwzLDAsMywzLDQsMywyLDQsMiwwLDEsMCw0LDMsMiwwLDQsMywwLDUsMywzLDIsNCw0LDQsMywzLDMsNCwwLDEsMywwLDAsMSwwLDAsMSwwLDAsMCwwLDQsMiwzLDMsMywwLDMsMCwwLDAsNCw0LDQsNSwzLDIsMCwzLDMsMCwzLDUpLAooMCwyLDAsMywwLDAsMCwzLDAsMSwzLDAsMiwwLDAsMCwxLDAsMywxLDEsMywzLDAsMCwzLDAsMCwzLDAsMiwzLDEsMCwzLDEsMCwzLDMsMiwwLDQsMiwyLDAsMiwwLDAsMCw0LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDEsMiwwLDEsMCwxLDAsMCwwLDEsMywxLDIsMCwwLDAsMSwwLDAsMSw0KSwKKDAsMywwLDMsMCw1LDAsMSwwLDIsNCwzLDEsMywzLDIsMSwxLDUsMiwxLDAsNSwxLDIsMCwwLDAsMywzLDIsMiwzLDIsNCwzLDAsMCwzLDMsMSwzLDMsMCwyLDUsMyw0LDAsMywzLDAsMSwyLDAsMiwyLDAsMywyLDAsMiwyLDMsMywzLDAsMiwwLDEsMCwzLDQsNCwyLDUsNCwwLDMsMCwwLDMsNSksCigwLDMsMCwzLDAsMywwLDEsMCwzLDMsMywzLDAsMywwLDIsMCwyLDEsMSwwLDIsMCwxLDAsMCwwLDIsMSwwLDAsMSwwLDMsMiwwLDAsMywzLDEsMiwzLDEsMCwzLDMsMCwwLDEsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDIsMywxLDIsMywwLDMsMCwxLDAsMywyLDEsMCw0LDMsMCwxLDEsMCwzLDMpLAooMCw0LDAsNSwwLDMsMCwzLDAsNCw1LDUsNCwzLDUsMyw0LDMsNSwzLDMsMiw1LDMsNCw0LDQsMyw0LDMsNCw1LDUsMyw0LDQsMyw0LDQsNSw0LDQsNCwzLDQsNSw1LDQsMiwzLDQsMiwzLDQsMCwzLDMsMSw0LDMsMiw0LDMsMyw1LDUsMCwzLDAsMywwLDUsNSw1LDUsNCw0LDAsNCwwLDEsNCw0KSwKKDAsNCwwLDQsMCwzLDAsMywwLDMsNSw0LDQsMiwzLDIsNSwxLDMsMiw1LDEsNCwyLDMsMiwzLDMsNCwzLDMsMywzLDIsNSw0LDEsMywzLDUsMyw0LDQsMCw0LDQsMywxLDEsMywxLDAsMiwzLDAsMiwzLDAsMywwLDAsNCwzLDEsMyw0LDAsMywwLDIsMCw0LDQsNCwzLDQsNSwwLDQsMCwwLDMsNCksCigwLDMsMCwzLDAsMywxLDIsMCwzLDQsNCwzLDMsMywwLDIsMiw0LDMsMywxLDMsMywzLDEsMSwwLDMsMSw0LDMsMiwzLDQsNCwyLDQsNCw0LDMsNCw0LDMsMiw0LDQsMywxLDMsMywxLDMsMywwLDQsMSwwLDIsMiwxLDQsMywyLDMsMyw1LDQsMywzLDUsNCw0LDMsMywwLDQsMCwzLDIsMiw0LDQpLAooMCwyLDAsMSwwLDAsMCwwLDAsMSwyLDEsMywwLDAsMCwwLDAsMiwwLDEsMiwxLDAsMCwxLDAsMCwwLDAsMywwLDAsMSwwLDEsMSwzLDEsMCwwLDAsMSwxLDAsMSwxLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwxLDEsMiwyLDAsMyw0LDAsMCwwLDEsMSwwLDAsMSwwLDAsMCwwLDAsMSwxKSwKKDAsMSwwLDAsMCwxLDAsMCwwLDAsNCwwLDQsMSw0LDAsMywwLDQsMCwzLDAsNCwwLDMsMCwzLDAsNCwxLDUsMSw0LDAsMCwzLDAsNSwwLDUsMiwwLDEsMCwwLDAsMiwxLDQsMCwxLDMsMCwwLDMsMCwwLDMsMSwxLDQsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCksCigxLDQsMCw1LDAsMywwLDIsMCwzLDUsNCw0LDMsNCwzLDUsMyw0LDMsMywwLDQsMywzLDMsMywzLDMsMiw0LDQsMywxLDMsNCw0LDUsNCw0LDMsNCw0LDEsMyw1LDQsMywzLDMsMSwyLDIsMywzLDEsMywxLDMsMywzLDUsMywzLDQsNSwwLDMsMCwzLDAsMyw0LDMsNCw0LDMsMCwzLDAsMiw0LDMpLAooMCwxLDAsNCwwLDAsMCwwLDAsMSw0LDAsNCwxLDQsMiw0LDAsMywwLDEsMCwxLDAsMCwwLDAsMCwyLDAsMywxLDEsMSwwLDMsMCwwLDAsMSwyLDEsMCwwLDEsMSwxLDEsMCwxLDAsMCwwLDEsMCwwLDMsMCwwLDAsMCwzLDIsMCwyLDIsMCwxLDAsMCwwLDIsMywyLDMsMywwLDAsMCwwLDIsMSwwKSwKKDAsNSwxLDUsMCwzLDAsMywwLDUsNCw0LDUsMSw1LDMsMywwLDQsMyw0LDMsNSwzLDQsMywzLDIsNCwzLDQsMywzLDAsMywzLDEsNCw0LDMsNCw0LDQsMyw0LDUsNSwzLDIsMywxLDEsMywzLDEsMywxLDEsMywzLDIsNCw1LDMsMyw1LDAsNCwwLDMsMCw0LDQsMyw1LDMsMywwLDMsNCwwLDQsMyksCigwLDUsMCw1LDAsMywwLDIsMCw0LDQsMyw1LDIsNCwzLDMsMyw0LDQsNCwzLDUsMyw1LDMsMywxLDQsMCw0LDMsMywwLDMsMywwLDQsNCw0LDQsNSw0LDMsMyw1LDUsMywyLDMsMSwyLDMsMiwwLDEsMCwwLDMsMiwyLDQsNCwzLDEsNSwwLDQsMCwzLDAsNCwzLDEsMywyLDEsMCwzLDMsMCwzLDMpLAooMCw0LDAsNSwwLDUsMCw0LDAsNCw1LDUsNSwzLDQsMywzLDIsNSw0LDQsMyw1LDMsNSwzLDQsMCw0LDMsNCw0LDMsMiw0LDQsMyw0LDUsNCw0LDUsNSwwLDMsNSw1LDQsMSwzLDMsMiwzLDMsMSwzLDEsMCw0LDMsMSw0LDQsMyw0LDUsMCw0LDAsMiwwLDQsMyw0LDQsMywzLDAsNCwwLDAsNSw1KSwKKDAsNCwwLDQsMCw1LDAsMSwxLDMsMyw0LDQsMyw0LDEsMywwLDUsMSwzLDAsMywxLDMsMSwxLDAsMywwLDMsMyw0LDAsNCwzLDAsNCw0LDQsMyw0LDQsMCwzLDUsNCwxLDAsMywwLDAsMiwzLDAsMywxLDAsMywxLDAsMywyLDEsMyw1LDAsMywwLDEsMCwzLDIsMywzLDQsNCwwLDIsMiwwLDQsNCksCigyLDQsMCw1LDAsNCwwLDMsMCw0LDUsNSw0LDMsNSwzLDUsMyw1LDMsNSwyLDUsMyw0LDMsMyw0LDMsNCw1LDMsMiwxLDUsNCwzLDIsMyw0LDUsMyw0LDEsMiw1LDQsMywwLDMsMywwLDMsMiwwLDIsMywwLDQsMSwwLDMsNCwzLDMsNSwwLDMsMCwxLDAsNCw1LDUsNSw0LDMsMCw0LDIsMCwzLDUpLAooMCw1LDAsNCwwLDQsMCwyLDAsNSw0LDMsNCwzLDQsMywzLDMsNCwzLDQsMiw1LDMsNSwzLDQsMSw0LDMsNCw0LDQsMCwzLDUsMCw0LDQsNCw0LDUsMywxLDMsNCw1LDMsMywzLDMsMywzLDMsMCwyLDIsMCwzLDMsMiw0LDMsMywzLDUsMyw0LDEsMywzLDUsMywyLDAsMCwwLDAsNCwzLDEsMywzKSwKKDAsMSwwLDMsMCwzLDAsMSwwLDEsMywzLDMsMiwzLDMsMywwLDMsMCwwLDAsMywxLDMsMCwwLDAsMiwyLDIsMywwLDAsMywyLDAsMSwyLDQsMSwzLDMsMCwwLDMsMywzLDAsMSwwLDAsMiwxLDAsMCwzLDAsMywxLDAsMywwLDAsMSwzLDAsMiwwLDEsMCwzLDMsMSwzLDMsMCwwLDEsMSwwLDMsMyksCigwLDIsMCwzLDAsMiwxLDQsMCwyLDIsMywxLDEsMywxLDEsMCwyLDAsMywxLDIsMywxLDMsMCwwLDEsMCw0LDMsMiwzLDMsMywxLDQsMiwzLDMsMywzLDEsMCwzLDEsNCwwLDEsMSwwLDEsMiwwLDEsMSwwLDEsMSwwLDMsMSwzLDIsMiwwLDEsMCwwLDAsMiwzLDMsMywxLDAsMCwwLDAsMCwyLDMpLAooMCw1LDAsNCwwLDUsMCwyLDAsNCw1LDUsMywzLDQsMywzLDEsNSw0LDQsMiw0LDQsNCwzLDQsMiw0LDMsNSw1LDQsMywzLDQsMywzLDUsNSw0LDUsNSwxLDMsNCw1LDMsMSw0LDMsMSwzLDMsMCwzLDMsMSw0LDMsMSw0LDUsMywzLDUsMCw0LDAsMywwLDUsMywzLDEsNCwzLDAsNCwwLDEsNSwzKSwKKDAsNSwwLDUsMCw0LDAsMiwwLDQsNCwzLDQsMywzLDMsMywzLDUsNCw0LDQsNCw0LDQsNSwzLDMsNSwyLDQsNCw0LDMsNCw0LDMsMyw0LDQsNSw1LDMsMyw0LDMsNCwzLDMsNCwzLDMsMywzLDEsMiwyLDEsNCwzLDMsNSw0LDQsMyw0LDAsNCwwLDMsMCw0LDQsNCw0LDQsMSwwLDQsMiwwLDIsNCksCigwLDQsMCw0LDAsMywwLDEsMCwzLDUsMiwzLDAsMywwLDIsMSw0LDIsMywzLDQsMSw0LDMsMywyLDQsMSwzLDMsMywwLDMsMywwLDAsMywzLDMsNSwzLDMsMywzLDMsMiwwLDIsMCwwLDIsMCwwLDIsMCwwLDEsMCwwLDMsMSwyLDIsMywwLDMsMCwyLDAsNCw0LDMsMyw0LDEsMCwzLDAsMCwyLDQpLAooMCwwLDAsNCwwLDAsMCwwLDAsMCwxLDAsMSwwLDIsMCwwLDAsMCwwLDEsMCwyLDAsMSwwLDAsMCwwLDAsMywxLDMsMCwzLDIsMCwwLDAsMSwwLDMsMiwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMyw0LDAsMiwwLDAsMCwwLDAsMCwyKSwKKDAsMiwxLDMsMCwyLDAsMiwwLDMsMywzLDMsMSwzLDEsMywzLDMsMywzLDMsNCwyLDIsMSwyLDEsNCwwLDQsMywxLDMsMywzLDIsNCwzLDUsNCwzLDMsMywzLDMsMywzLDAsMSwzLDAsMiwwLDAsMSwwLDAsMSwwLDAsNCwyLDAsMiwzLDAsMywzLDAsMywzLDQsMiwzLDEsNCwwLDEsMiwwLDIsMyksCigwLDMsMCwzLDAsMSwwLDMsMCwyLDMsMywzLDAsMywxLDIsMCwzLDMsMiwzLDMsMiwzLDIsMywxLDMsMCw0LDMsMiwwLDMsMywxLDQsMywzLDIsMyw0LDMsMSwzLDMsMSwxLDAsMSwxLDAsMSwwLDEsMCwxLDAsMCwwLDQsMSwxLDAsMywwLDMsMSwwLDIsMywzLDMsMywzLDEsMCwwLDIsMCwzLDMpLAooMCwwLDAsMCwwLDAsMCwwLDAsMCwzLDAsMiwwLDMsMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDAsMCwwLDAsMywwLDMsMCwzLDEsMCwxLDAsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDMsMCwyLDAsMiwzLDAsMCwwLDAsMCwwLDAsMCwzKSwKKDAsMiwwLDMsMSwzLDAsMywwLDIsMywzLDMsMSwzLDEsMywxLDMsMSwzLDMsMywxLDMsMCwyLDMsMSwxLDQsMywzLDIsMywzLDEsMiwyLDQsMSwzLDMsMCwxLDQsMiwzLDAsMSwzLDAsMywwLDAsMSwzLDAsMiwwLDAsMywzLDIsMSwzLDAsMywwLDIsMCwzLDQsNCw0LDMsMSwwLDMsMCwwLDMsMyksCigwLDIsMCwxLDAsMiwwLDAsMCwxLDMsMiwyLDEsMywwLDEsMSwzLDAsMywyLDMsMSwyLDAsMiwwLDEsMSwzLDMsMywwLDMsMywxLDEsMiwzLDIsMywzLDEsMiwzLDIsMCwwLDEsMCwwLDAsMCwwLDAsMywwLDEsMCwwLDIsMSwyLDEsMywwLDMsMCwwLDAsMyw0LDQsNCwzLDIsMCwyLDAsMCwyLDQpLAooMCwwLDAsMSwwLDEsMCwwLDAsMCwxLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwyLDIsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMSwzLDEsMCwwLDAsMCwwLDAsMCwzKSwKKDAsMywwLDMsMCwyLDAsMywwLDMsMywzLDIsMywyLDIsMiwwLDMsMSwzLDMsMywyLDMsMywwLDAsMywwLDMsMiwyLDAsMiwzLDEsNCwzLDQsMywzLDIsMywxLDUsNCw0LDAsMywxLDIsMSwzLDAsMywxLDEsMiwwLDIsMywxLDMsMSwzLDAsMywwLDEsMCwzLDMsNCw0LDIsMSwwLDIsMSwwLDIsNCksCigwLDEsMCwzLDAsMSwwLDIsMCwxLDQsMiw1LDEsNCwwLDIsMCwyLDEsMywxLDQsMCwyLDEsMCwwLDIsMSw0LDEsMSwwLDMsMywwLDUsMSwzLDIsMywzLDEsMCwzLDIsMywwLDEsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDQsMCwxLDAsMywwLDIsMCwxLDAsMywzLDMsNCwzLDMsMCwwLDAsMCwyLDMpLAooMCwwLDAsMSwwLDAsMCwwLDAsMCwyLDAsMSwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMywwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwxLDAsMCwxLDAsMCwwLDAsMCwzKSwKKDAsMSwwLDMsMCw0LDAsMywwLDIsNCwzLDEsMCwzLDIsMiwxLDMsMSwyLDIsMywxLDEsMSwyLDEsMywwLDEsMiwwLDEsMywyLDEsMywwLDUsNSwxLDAsMCwxLDMsMiwxLDAsMywwLDAsMSwwLDAsMCwwLDAsMyw0LDAsMSwxLDEsMywyLDAsMiwwLDEsMCwyLDMsMywxLDIsMywwLDEsMCwxLDAsNCksCigwLDAsMCwxLDAsMywwLDMsMCwyLDIsMSwwLDAsNCwwLDMsMCwzLDEsMywwLDMsMCwzLDAsMSwwLDMsMCwzLDEsMywwLDMsMywwLDAsMSwyLDEsMSwxLDAsMSwyLDAsMCwwLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDIsMiwxLDIsMCwwLDIsMCwwLDAsMCwyLDMsMywzLDMsMCwwLDAsMCwxLDQpLAooMCwwLDAsMywwLDMsMCwwLDAsMCwzLDEsMSwwLDMsMCwxLDAsMiwwLDEsMCwwLDAsMCwwLDAsMCwxLDAsMywwLDIsMCwyLDMsMCwwLDIsMiwzLDEsMiwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwzLDAsMCwyLDAsMCwwLDAsMiwzKSwKKDIsNCwwLDUsMCw1LDAsNCwwLDMsNCwzLDMsMyw0LDMsMywzLDQsMyw0LDQsNSw0LDUsNSw1LDIsMywwLDUsNSw0LDEsNSw0LDMsMSw1LDQsMyw0LDQsMywzLDQsMywzLDAsMywyLDAsMiwzLDAsMywwLDAsMywzLDAsNSwzLDIsMywzLDAsMywwLDMsMCwzLDQsNSw0LDUsMywwLDQsMywwLDMsNCksCigwLDMsMCwzLDAsMywwLDMsMCwzLDMsNCwzLDIsMywyLDMsMCw0LDMsMywzLDMsMywzLDMsMywwLDMsMiw0LDMsMywxLDMsNCwzLDQsNCw0LDMsNCw0LDMsMiw0LDQsMSwwLDIsMCwwLDEsMSwwLDIsMCwwLDMsMSwwLDUsMywyLDEsMywwLDMsMCwxLDIsNCwzLDIsNCwzLDMsMCwzLDIsMCw0LDQpLAooMCwzLDAsMywwLDEsMCwwLDAsMSw0LDMsMywyLDMsMSwzLDEsNCwyLDMsMiw0LDIsMyw0LDMsMCwyLDIsMywzLDMsMCwzLDMsMywwLDMsNCwxLDMsMywwLDMsNCwzLDMsMCwxLDEsMCwxLDAsMCwwLDQsMCwzLDAsMCwzLDEsMiwxLDMsMCw0LDAsMSwwLDQsMywzLDQsMywzLDAsMiwwLDAsMywzKSwKKDAsMywwLDQsMCwxLDAsMywwLDMsNCwzLDMsMCwzLDMsMywxLDMsMSwzLDMsNCwzLDMsMywwLDAsMywxLDUsMywzLDEsMywzLDIsNSw0LDMsMyw0LDUsMywyLDUsMyw0LDAsMSwwLDAsMCwwLDAsMiwwLDAsMSwxLDAsNCwyLDIsMSwzLDAsMywwLDIsMCw0LDQsMyw1LDMsMiwwLDEsMSwwLDMsNCksCigwLDUsMCw0LDAsNSwwLDIsMCw0LDQsMywzLDIsMywzLDMsMSw0LDMsNCwxLDUsMyw0LDMsNCwwLDQsMiw0LDMsNCwxLDUsNCwwLDQsNCw0LDQsNSw0LDEsMyw1LDQsMiwxLDQsMSwxLDMsMiwwLDMsMSwwLDMsMiwxLDQsMywzLDMsNCwwLDQsMCwzLDAsNCw0LDQsMywzLDMsMCw0LDIsMCwzLDQpLAooMSw0LDAsNCwwLDMsMCwxLDAsMywzLDMsMSwxLDMsMywyLDIsMywzLDEsMCwzLDIsMiwxLDIsMCwzLDEsMiwxLDIsMCwzLDIsMCwyLDIsMywzLDQsMywwLDMsMywxLDIsMCwxLDEsMywxLDIsMCwwLDMsMCwxLDEsMCwzLDIsMiwzLDMsMCwzLDAsMCwwLDIsMywzLDQsMywzLDAsMSwwLDAsMSw0KSwKKDAsNCwwLDQsMCw0LDAsMCwwLDMsNCw0LDMsMSw0LDIsMywyLDMsMywzLDEsNCwzLDQsMCwzLDAsNCwyLDMsMywyLDIsNSw0LDIsMSwzLDQsMyw0LDMsMSwzLDMsNCwyLDAsMiwxLDAsMywzLDAsMCwyLDAsMywxLDAsNCw0LDMsNCwzLDAsNCwwLDEsMCwyLDQsNCw0LDQsNCwwLDMsMiwwLDMsMyksCigwLDAsMCwxLDAsNCwwLDAsMCwwLDAsMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMSwwLDMsMiwwLDAsMSwwLDAsMCwxLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDIpLAooMCwyLDAsMywwLDQsMCw0LDAsMSwzLDMsMywwLDQsMCwyLDEsMiwxLDEsMSwyLDAsMywxLDEsMCwxLDAsMywxLDAsMCwzLDMsMiwwLDEsMSwwLDAsMCwwLDAsMSwwLDIsMCwyLDIsMCwzLDEsMCwwLDEsMCwxLDEsMCwxLDIsMCwzLDAsMCwwLDAsMSwwLDAsMywzLDQsMywxLDAsMSwwLDMsMCwyKSwKKDAsMCwwLDMsMCw1LDAsMCwwLDAsMSwwLDIsMCwzLDEsMCwxLDMsMCwwLDAsMiwwLDAsMCwxLDAsMCwwLDEsMSwwLDAsNCwwLDAsMCwyLDMsMCwxLDQsMSwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMiwwLDAsMywwLDAsMCwwLDAsMyksCigwLDIsMCw1LDAsNSwwLDEsMCwyLDQsMywzLDIsNSwxLDMsMiwzLDMsMywwLDQsMSwyLDAsMywwLDQsMCwyLDIsMSwxLDUsMywwLDAsMSw0LDIsMywyLDAsMywzLDMsMiwwLDIsNCwxLDEsMiwwLDEsMSwwLDMsMSwwLDEsMywxLDIsMywwLDIsMCwwLDAsMSwzLDUsNCw0LDQsMCwzLDAsMCwxLDMpLAooMCw0LDAsNSwwLDQsMCw0LDAsNCw1LDQsMywzLDQsMywzLDMsNCwzLDQsNCw1LDMsNCw1LDQsMiw0LDIsMyw0LDMsMSw0LDQsMSwzLDUsNCw0LDUsNSw0LDQsNSw1LDUsMiwzLDMsMSw0LDMsMSwzLDMsMCwzLDMsMSw0LDMsNCw0LDQsMCwzLDAsNCwwLDMsMyw0LDQsNSwwLDAsNCwzLDAsNCw1KSwKKDAsNCwwLDQsMCwzLDAsMywwLDMsNCw0LDQsMywzLDIsNCwzLDQsMyw0LDMsNSwzLDQsMywyLDEsNCwyLDQsNCwzLDEsMyw0LDIsNCw1LDUsMyw0LDUsNCwxLDUsNCwzLDAsMywyLDIsMywyLDEsMywxLDAsMywzLDMsNSwzLDMsMyw1LDQsNCwyLDMsMyw0LDMsMywzLDIsMSwwLDMsMiwxLDQsMyksCigwLDQsMCw1LDAsNCwwLDMsMCwzLDUsNSwzLDIsNCwzLDQsMCw1LDQsNCwxLDQsNCw0LDMsMywzLDQsMyw1LDUsMiwzLDMsNCwxLDIsNSw1LDMsNSw1LDIsMyw1LDUsNCwwLDMsMiwwLDMsMywxLDEsNSwxLDQsMSwwLDQsMywyLDMsNSwwLDQsMCwzLDAsNSw0LDMsNCwzLDAsMCw0LDEsMCw0LDQpLAooMSwzLDAsNCwwLDIsMCwyLDAsMiw1LDUsMywzLDMsMywzLDAsNCwyLDMsNCw0LDQsMyw0LDAsMCwzLDQsNSw0LDMsMywzLDMsMiw1LDUsNCw1LDUsNSw0LDMsNSw1LDUsMSwzLDEsMCwxLDAsMCwzLDIsMCw0LDIsMCw1LDIsMywyLDQsMSwzLDAsMywwLDQsNSw0LDUsNCwzLDAsNCwyLDAsNSw0KSwKKDAsMywwLDQsMCw1LDAsMywwLDMsNCw0LDMsMiwzLDIsMywzLDMsMywzLDIsNCwzLDMsMiwyLDAsMywzLDMsMywzLDEsMywzLDMsMCw0LDQsMyw0LDQsMSwxLDQsNCwyLDAsMywxLDAsMSwxLDAsNCwxLDAsMiwzLDEsMywzLDEsMyw0LDAsMywwLDEsMCwzLDEsMywwLDAsMSwwLDIsMCwwLDQsNCksCigwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDApLAooMCwzLDAsMywwLDIsMCwzLDAsMSw1LDQsMywzLDMsMSw0LDIsMSwyLDMsNCw0LDIsNCw0LDUsMCwzLDEsNCwzLDQsMCw0LDMsMywzLDIsMywyLDUsMyw0LDMsMiwyLDMsMCwwLDMsMCwyLDEsMCwxLDIsMCwwLDAsMCwyLDEsMSwzLDEsMCwyLDAsNCwwLDMsNCw0LDQsNSwyLDAsMiwwLDAsMSwzKSwKKDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwxLDEsMSwwLDAsMSwxLDAsMCwwLDQsMiwxLDEsMCwxLDAsMywyLDAsMCwzLDEsMSwxLDIsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMywwLDEsMCwwLDAsMiwwLDAsMCwxLDQsMCw0LDIsMSwwLDAsMCwwLDAsMSksCigwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMSwwLDEsMCwwLDAsMCwzLDEsMCwwLDAsMiwwLDIsMSwwLDAsMSwyLDEsMCwxLDEsMCwwLDMsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMywxLDAsMCwwLDAsMCwxLDAsMCwyLDEsMCwwLDAsMCwwLDAsMCwwLDIpLAooMCw0LDAsNCwwLDQsMCwzLDAsNCw0LDMsNCwyLDQsMywyLDAsNCw0LDQsMyw1LDMsNSwzLDMsMiw0LDIsNCwzLDQsMywxLDQsMCwyLDMsNCw0LDQsMywzLDMsNCw0LDQsMyw0LDEsMyw0LDMsMiwxLDIsMSwzLDMsMyw0LDQsMywzLDUsMCw0LDAsMywwLDQsMywzLDMsMiwxLDAsMywwLDAsMywzKSwKKDAsNCwwLDMsMCwzLDAsMywwLDMsNSw1LDMsMywzLDMsNCwzLDQsMywzLDMsNCw0LDQsMywzLDMsMyw0LDMsNSwzLDMsMSwzLDIsNCw1LDUsNSw1LDQsMyw0LDUsNSwzLDIsMiwzLDMsMywzLDIsMywzLDEsMiwzLDIsNCwzLDMsMyw0LDAsNCwwLDIsMCw0LDMsMiwyLDEsMiwwLDMsMCwwLDQsMSksCikKCmNsYXNzIEphcGFuZXNlQ29udGV4dEFuYWx5c2lzKG9iamVjdCk6CiAgICBOVU1fT0ZfQ0FURUdPUlkgPSA2CiAgICBET05UX0tOT1cgPSAtMQogICAgRU5PVUdIX1JFTF9USFJFU0hPTEQgPSAxMDAKICAgIE1BWF9SRUxfVEhSRVNIT0xEID0gMTAwMAogICAgTUlOSU1VTV9EQVRBX1RIUkVTSE9MRCA9IDQKCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc2VsZi5fdG90YWxfcmVsID0gTm9uZQogICAgICAgIHNlbGYuX3JlbF9zYW1wbGUgPSBOb25lCiAgICAgICAgc2VsZi5fbmVlZF90b19za2lwX2NoYXJfbnVtID0gTm9uZQogICAgICAgIHNlbGYuX2xhc3RfY2hhcl9vcmRlciA9IE5vbmUKICAgICAgICBzZWxmLl9kb25lID0gTm9uZQogICAgICAgIHNlbGYucmVzZXQoKQoKICAgIGRlZiByZXNldChzZWxmKToKICAgICAgICBzZWxmLl90b3RhbF9yZWwgPSAwICAjIHRvdGFsIHNlcXVlbmNlIHJlY2VpdmVkCiAgICAgICAgIyBjYXRlZ29yeSBjb3VudGVycywgZWFjaCBpbnRlZ2VyIGNvdW50cyBzZXF1ZW5jZSBpbiBpdHMgY2F0ZWdvcnkKICAgICAgICBzZWxmLl9yZWxfc2FtcGxlID0gWzBdICogc2VsZi5OVU1fT0ZfQ0FURUdPUlkKICAgICAgICAjIGlmIGxhc3QgYnl0ZSBpbiBjdXJyZW50IGJ1ZmZlciBpcyBub3QgdGhlIGxhc3QgYnl0ZSBvZiBhIGNoYXJhY3RlciwKICAgICAgICAjIHdlIG5lZWQgdG8ga25vdyBob3cgbWFueSBieXRlcyB0byBza2lwIGluIG5leHQgYnVmZmVyCiAgICAgICAgc2VsZi5fbmVlZF90b19za2lwX2NoYXJfbnVtID0gMAogICAgICAgIHNlbGYuX2xhc3RfY2hhcl9vcmRlciA9IC0xICAjIFRoZSBvcmRlciBvZiBwcmV2aW91cyBjaGFyCiAgICAgICAgIyBJZiB0aGlzIGZsYWcgaXMgc2V0IHRvIFRydWUsIGRldGVjdGlvbiBpcyBkb25lIGFuZCBjb25jbHVzaW9uIGhhcwogICAgICAgICMgYmVlbiBtYWRlCiAgICAgICAgc2VsZi5fZG9uZSA9IEZhbHNlCgogICAgZGVmIGZlZWQoc2VsZiwgYnl0ZV9zdHIsIG51bV9ieXRlcyk6CiAgICAgICAgaWYgc2VsZi5fZG9uZToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICMgVGhlIGJ1ZmZlciB3ZSBnb3QgaXMgYnl0ZSBvcmllbnRlZCwgYW5kIGEgY2hhcmFjdGVyIG1heSBzcGFuIGluIG1vcmUgdGhhbiBvbmUKICAgICAgICAjIGJ1ZmZlcnMuIEluIGNhc2UgdGhlIGxhc3Qgb25lIG9yIHR3byBieXRlIGluIGxhc3QgYnVmZmVyIGlzIG5vdAogICAgICAgICMgY29tcGxldGUsIHdlIHJlY29yZCBob3cgbWFueSBieXRlIG5lZWRlZCB0byBjb21wbGV0ZSB0aGF0IGNoYXJhY3RlcgogICAgICAgICMgYW5kIHNraXAgdGhlc2UgYnl0ZXMgaGVyZS4gIFdlIGNhbiBjaG9vc2UgdG8gcmVjb3JkIHRob3NlIGJ5dGVzIGFzCiAgICAgICAgIyB3ZWxsIGFuZCBhbmFseXNlIHRoZSBjaGFyYWN0ZXIgb25jZSBpdCBpcyBjb21wbGV0ZSwgYnV0IHNpbmNlIGEKICAgICAgICAjIGNoYXJhY3RlciB3aWxsIG5vdCBtYWtlIG11Y2ggZGlmZmVyZW5jZSwgYnkgc2ltcGx5IHNraXBwaW5nCiAgICAgICAgIyB0aGlzIGNoYXJhY3RlciB3aWxsIHNpbXBseSBvdXIgbG9naWMgYW5kIGltcHJvdmUgcGVyZm9ybWFuY2UuCiAgICAgICAgaSA9IHNlbGYuX25lZWRfdG9fc2tpcF9jaGFyX251bQogICAgICAgIHdoaWxlIGkgPCBudW1fYnl0ZXM6CiAgICAgICAgICAgIG9yZGVyLCBjaGFyX2xlbiA9IHNlbGYuZ2V0X29yZGVyKGJ5dGVfc3RyW2k6aSArIDJdKQogICAgICAgICAgICBpICs9IGNoYXJfbGVuCiAgICAgICAgICAgIGlmIGkgPiBudW1fYnl0ZXM6CiAgICAgICAgICAgICAgICBzZWxmLl9uZWVkX3RvX3NraXBfY2hhcl9udW0gPSBpIC0gbnVtX2J5dGVzCiAgICAgICAgICAgICAgICBzZWxmLl9sYXN0X2NoYXJfb3JkZXIgPSAtMQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaWYgKG9yZGVyICE9IC0xKSBhbmQgKHNlbGYuX2xhc3RfY2hhcl9vcmRlciAhPSAtMSk6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fdG90YWxfcmVsICs9IDEKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLl90b3RhbF9yZWwgPiBzZWxmLk1BWF9SRUxfVEhSRVNIT0xEOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9kb25lID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgIHNlbGYuX3JlbF9zYW1wbGVbanAyQ2hhckNvbnRleHRbc2VsZi5fbGFzdF9jaGFyX29yZGVyXVtvcmRlcl1dICs9IDEKICAgICAgICAgICAgICAgIHNlbGYuX2xhc3RfY2hhcl9vcmRlciA9IG9yZGVyCgogICAgZGVmIGdvdF9lbm91Z2hfZGF0YShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fdG90YWxfcmVsID4gc2VsZi5FTk9VR0hfUkVMX1RIUkVTSE9MRAoKICAgIGRlZiBnZXRfY29uZmlkZW5jZShzZWxmKToKICAgICAgICAjIFRoaXMgaXMganVzdCBvbmUgd2F5IHRvIGNhbGN1bGF0ZSBjb25maWRlbmNlLiBJdCB3b3JrcyB3ZWxsIGZvciBtZS4KICAgICAgICBpZiBzZWxmLl90b3RhbF9yZWwgPiBzZWxmLk1JTklNVU1fREFUQV9USFJFU0hPTEQ6CiAgICAgICAgICAgIHJldHVybiAoc2VsZi5fdG90YWxfcmVsIC0gc2VsZi5fcmVsX3NhbXBsZVswXSkgLyBzZWxmLl90b3RhbF9yZWwKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc2VsZi5ET05UX0tOT1cKCiAgICBkZWYgZ2V0X29yZGVyKHNlbGYsIGJ5dGVfc3RyKToKICAgICAgICByZXR1cm4gLTEsIDEKCmNsYXNzIFNKSVNDb250ZXh0QW5hbHlzaXMoSmFwYW5lc2VDb250ZXh0QW5hbHlzaXMpOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHN1cGVyKFNKSVNDb250ZXh0QW5hbHlzaXMsIHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLl9jaGFyc2V0X25hbWUgPSAiU0hJRlRfSklTIgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNoYXJzZXRfbmFtZShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fY2hhcnNldF9uYW1lCgogICAgZGVmIGdldF9vcmRlcihzZWxmLCBieXRlX3N0cik6CiAgICAgICAgaWYgbm90IGJ5dGVfc3RyOgogICAgICAgICAgICByZXR1cm4gLTEsIDEKICAgICAgICAjIGZpbmQgb3V0IGN1cnJlbnQgY2hhcidzIGJ5dGUgbGVuZ3RoCiAgICAgICAgZmlyc3RfY2hhciA9IGJ5dGVfc3RyWzBdCiAgICAgICAgaWYgKDB4ODEgPD0gZmlyc3RfY2hhciA8PSAweDlGKSBvciAoMHhFMCA8PSBmaXJzdF9jaGFyIDw9IDB4RkMpOgogICAgICAgICAgICBjaGFyX2xlbiA9IDIKICAgICAgICAgICAgaWYgKGZpcnN0X2NoYXIgPT0gMHg4Nykgb3IgKDB4RkEgPD0gZmlyc3RfY2hhciA8PSAweEZDKToKICAgICAgICAgICAgICAgIHNlbGYuX2NoYXJzZXRfbmFtZSA9ICJDUDkzMiIKICAgICAgICBlbHNlOgogICAgICAgICAgICBjaGFyX2xlbiA9IDEKCiAgICAgICAgIyByZXR1cm4gaXRzIG9yZGVyIGlmIGl0IGlzIGhpcmFnYW5hCiAgICAgICAgaWYgbGVuKGJ5dGVfc3RyKSA+IDE6CiAgICAgICAgICAgIHNlY29uZF9jaGFyID0gYnl0ZV9zdHJbMV0KICAgICAgICAgICAgaWYgKGZpcnN0X2NoYXIgPT0gMjAyKSBhbmQgKDB4OUYgPD0gc2Vjb25kX2NoYXIgPD0gMHhGMSk6CiAgICAgICAgICAgICAgICByZXR1cm4gc2Vjb25kX2NoYXIgLSAweDlGLCBjaGFyX2xlbgoKICAgICAgICByZXR1cm4gLTEsIGNoYXJfbGVuCgpjbGFzcyBFVUNKUENvbnRleHRBbmFseXNpcyhKYXBhbmVzZUNvbnRleHRBbmFseXNpcyk6CiAgICBkZWYgZ2V0X29yZGVyKHNlbGYsIGJ5dGVfc3RyKToKICAgICAgICBpZiBub3QgYnl0ZV9zdHI6CiAgICAgICAgICAgIHJldHVybiAtMSwgMQogICAgICAgICMgZmluZCBvdXQgY3VycmVudCBjaGFyJ3MgYnl0ZSBsZW5ndGgKICAgICAgICBmaXJzdF9jaGFyID0gYnl0ZV9zdHJbMF0KICAgICAgICBpZiAoZmlyc3RfY2hhciA9PSAweDhFKSBvciAoMHhBMSA8PSBmaXJzdF9jaGFyIDw9IDB4RkUpOgogICAgICAgICAgICBjaGFyX2xlbiA9IDIKICAgICAgICBlbGlmIGZpcnN0X2NoYXIgPT0gMHg4RjoKICAgICAgICAgICAgY2hhcl9sZW4gPSAzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgY2hhcl9sZW4gPSAxCgogICAgICAgICMgcmV0dXJuIGl0cyBvcmRlciBpZiBpdCBpcyBoaXJhZ2FuYQogICAgICAgIGlmIGxlbihieXRlX3N0cikgPiAxOgogICAgICAgICAgICBzZWNvbmRfY2hhciA9IGJ5dGVfc3RyWzFdCiAgICAgICAgICAgIGlmIChmaXJzdF9jaGFyID09IDB4QTQpIGFuZCAoMHhBMSA8PSBzZWNvbmRfY2hhciA8PSAweEYzKToKICAgICAgICAgICAgICAgIHJldHVybiBzZWNvbmRfY2hhciAtIDB4QTEsIGNoYXJfbGVuCgogICAgICAgIHJldHVybiAtMSwgY2hhcl9sZW4KCgpQSwMEFAAAAAAAAAAhAPBoyconMgAAJzIAADkAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9sYW5nYnVsZ2FyaWFubW9kZWwucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBNb3ppbGxhIENvbW11bmljYXRvciBjbGllbnQgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMgMjU1OiBDb250cm9sIGNoYXJhY3RlcnMgdGhhdCB1c3VhbGx5IGRvZXMgbm90IGV4aXN0IGluIGFueSB0ZXh0CiMgMjU0OiBDYXJyaWFnZS9SZXR1cm4KIyAyNTM6IHN5bWJvbCAocHVuY3R1YXRpb24pIHRoYXQgZG9lcyBub3QgYmVsb25nIHRvIHdvcmQKIyAyNTI6IDAgLSA5CgojIENoYXJhY3RlciBNYXBwaW5nIFRhYmxlOgojIHRoaXMgdGFibGUgaXMgbW9kaWZpZWQgYmFzZSBvbiB3aW4xMjUxQnVsZ2FyaWFuQ2hhclRvT3JkZXJNYXAsIHNvCiMgb25seSBudW1iZXIgPDY0IGlzIHN1cmUgdmFsaWQKCkxhdGluNV9CdWxnYXJpYW5DaGFyVG9PcmRlck1hcCA9ICgKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NCwyNTUsMjU1LDI1NCwyNTUsMjU1LCAgIyAwMAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsICAjIDEwCjI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgMjAKMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyAzMAoyNTMsIDc3LCA5MCwgOTksMTAwLCA3MiwxMDksMTA3LDEwMSwgNzksMTg1LCA4MSwxMDIsIDc2LCA5NCwgODIsICAjIDQwCjExMCwxODYsMTA4LCA5MSwgNzQsMTE5LCA4NCwgOTYsMTExLDE4NywxMTUsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgNTAKMjUzLCA2NSwgNjksIDcwLCA2NiwgNjMsIDY4LDExMiwxMDMsIDkyLDE5NCwxMDQsIDk1LCA4NiwgODcsIDcxLCAgIyA2MAoxMTYsMTk1LCA4NSwgOTMsIDk3LDExMywxOTYsMTk3LDE5OCwxOTksMjAwLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDcwCjE5NCwxOTUsMTk2LDE5NywxOTgsMTk5LDIwMCwyMDEsMjAyLDIwMywyMDQsMjA1LDIwNiwyMDcsMjA4LDIwOSwgICMgODAKMjEwLDIxMSwyMTIsMjEzLDIxNCwyMTUsMjE2LDIxNywyMTgsMjE5LDIyMCwyMjEsMjIyLDIyMywyMjQsMjI1LCAgIyA5MAogODEsMjI2LDIyNywyMjgsMjI5LDIzMCwxMDUsMjMxLDIzMiwyMzMsMjM0LDIzNSwyMzYsIDQ1LDIzNywyMzgsICAjIGEwCiAzMSwgMzIsIDM1LCA0MywgMzcsIDQ0LCA1NSwgNDcsIDQwLCA1OSwgMzMsIDQ2LCAzOCwgMzYsIDQxLCAzMCwgICMgYjAKIDM5LCAyOCwgMzQsIDUxLCA0OCwgNDksIDUzLCA1MCwgNTQsIDU3LCA2MSwyMzksIDY3LDI0MCwgNjAsIDU2LCAgIyBjMAogIDEsIDE4LCAgOSwgMjAsIDExLCAgMywgMjMsIDE1LCAgMiwgMjYsIDEyLCAxMCwgMTQsICA2LCAgNCwgMTMsICAjIGQwCiAgNywgIDgsICA1LCAxOSwgMjksIDI1LCAyMiwgMjEsIDI3LCAyNCwgMTcsIDc1LCA1MiwyNDEsIDQyLCAxNiwgICMgZTAKIDYyLDI0MiwyNDMsMjQ0LCA1OCwyNDUsIDk4LDI0NiwyNDcsMjQ4LDI0OSwyNTAsMjUxLCA5MSwyNTIsMjUzLCAgIyBmMAopCgp3aW4xMjUxQnVsZ2FyaWFuQ2hhclRvT3JkZXJNYXAgPSAoCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTQsMjU1LDI1NSwyNTQsMjU1LDI1NSwgICMgMDAKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LCAgIyAxMAoyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDIwCjI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgMzAKMjUzLCA3NywgOTAsIDk5LDEwMCwgNzIsMTA5LDEwNywxMDEsIDc5LDE4NSwgODEsMTAyLCA3NiwgOTQsIDgyLCAgIyA0MAoxMTAsMTg2LDEwOCwgOTEsIDc0LDExOSwgODQsIDk2LDExMSwxODcsMTE1LDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDUwCjI1MywgNjUsIDY5LCA3MCwgNjYsIDYzLCA2OCwxMTIsMTAzLCA5MiwxOTQsMTA0LCA5NSwgODYsIDg3LCA3MSwgICMgNjAKMTE2LDE5NSwgODUsIDkzLCA5NywxMTMsMTk2LDE5NywxOTgsMTk5LDIwMCwyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyA3MAoyMDYsMjA3LDIwOCwyMDksMjEwLDIxMSwyMTIsMjEzLDEyMCwyMTQsMjE1LDIxNiwyMTcsMjE4LDIxOSwyMjAsICAjIDgwCjIyMSwgNzgsIDY0LCA4MywxMjEsIDk4LDExNywxMDUsMjIyLDIyMywyMjQsMjI1LDIyNiwyMjcsMjI4LDIyOSwgICMgOTAKIDg4LDIzMCwyMzEsMjMyLDIzMywxMjIsIDg5LDEwNiwyMzQsMjM1LDIzNiwyMzcsMjM4LCA0NSwyMzksMjQwLCAgIyBhMAogNzMsIDgwLDExOCwxMTQsMjQxLDI0MiwyNDMsMjQ0LDI0NSwgNjIsIDU4LDI0NiwyNDcsMjQ4LDI0OSwyNTAsICAjIGIwCiAzMSwgMzIsIDM1LCA0MywgMzcsIDQ0LCA1NSwgNDcsIDQwLCA1OSwgMzMsIDQ2LCAzOCwgMzYsIDQxLCAzMCwgICMgYzAKIDM5LCAyOCwgMzQsIDUxLCA0OCwgNDksIDUzLCA1MCwgNTQsIDU3LCA2MSwyNTEsIDY3LDI1MiwgNjAsIDU2LCAgIyBkMAogIDEsIDE4LCAgOSwgMjAsIDExLCAgMywgMjMsIDE1LCAgMiwgMjYsIDEyLCAxMCwgMTQsICA2LCAgNCwgMTMsICAjIGUwCiAgNywgIDgsICA1LCAxOSwgMjksIDI1LCAyMiwgMjEsIDI3LCAyNCwgMTcsIDc1LCA1MiwyNTMsIDQyLCAxNiwgICMgZjAKKQoKIyBNb2RlbCBUYWJsZToKIyB0b3RhbCBzZXF1ZW5jZXM6IDEwMCUKIyBmaXJzdCA1MTIgc2VxdWVuY2VzOiA5Ni45MzkyJQojIGZpcnN0IDEwMjQgc2VxdWVuY2VzOjMuMDYxOCUKIyByZXN0ICBzZXF1ZW5jZXM6ICAgICAwLjI5OTIlCiMgbmVnYXRpdmUgc2VxdWVuY2VzOiAgMC4wMDIwJQpCdWxnYXJpYW5MYW5nTW9kZWwgPSAoCjAsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywyLDMsMywzLDMsMywzLDMsMywyLDMsMywzLDMsMywKMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDAsMywzLDMsMiwyLDMsMiwyLDEsMiwyLAozLDEsMywzLDIsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMCwzLDMsMywzLDMsMywzLDMsMywzLDAsMywwLDEsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDIsMywyLDMsMywzLDMsMywzLDMsMywwLDMsMSwwLAowLDEsMCwwLDAsMCwwLDAsMCwwLDEsMSwwLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjMsMiwyLDIsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywxLDMsMiwzLDMsMywzLDMsMywzLDMsMCwzLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDIsMywzLDIsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMSwzLDIsMywzLDMsMywzLDMsMywzLDAsMywwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywzLDMsMywzLDMsMywzLDIsMywyLDIsMSwzLDMsMywzLDIsMiwyLDEsMSwyLDAsMSwwLDEsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjMsMywzLDMsMywzLDMsMiwzLDIsMiwzLDMsMSwxLDIsMywzLDIsMywzLDMsMywyLDEsMiwwLDIsMCwzLDAsMCwKMCwwLDAsMCwwLDAsMCwxLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAozLDMsMywzLDMsMywzLDEsMywzLDMsMywzLDIsMywyLDMsMywzLDMsMywyLDMsMywxLDMsMCwzLDAsMiwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMywzLDMsMywzLDMsMywzLDEsMywzLDIsMywzLDMsMSwzLDMsMiwzLDIsMiwyLDAsMCwyLDAsMiwwLDIsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjMsMywzLDMsMywzLDMsMywzLDAsMywzLDMsMiwyLDMsMywzLDEsMiwyLDMsMiwxLDEsMiwwLDIsMCwwLDAsMCwKMSwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwxLDAsMCwxLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAozLDMsMywzLDMsMywzLDIsMywzLDEsMiwzLDIsMiwyLDMsMywzLDMsMywyLDIsMywxLDIsMCwyLDEsMiwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMywwLDAsMSwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMywzLDMsMywzLDEsMywzLDMsMywzLDIsMywzLDMsMiwzLDMsMiwzLDIsMiwyLDMsMSwyLDAsMSwwLDEsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjMsMywzLDMsMywzLDMsMywzLDMsMywxLDEsMSwyLDIsMSwzLDEsMywyLDIsMywwLDAsMSwwLDEsMCwxLDAsMCwKMCwwLDAsMSwwLDAsMCwwLDEsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAozLDMsMywzLDMsMiwyLDMsMiwyLDMsMSwyLDEsMSwxLDIsMywxLDMsMSwyLDIsMCwxLDEsMSwxLDAsMSwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMywzLDMsMywzLDEsMywyLDIsMywzLDEsMiwzLDEsMSwzLDMsMywzLDEsMiwyLDEsMSwxLDAsMiwwLDIsMCwxLAowLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDEsMiwyLDMsMywzLDIsMiwxLDEsMiwwLDIsMCwxLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAozLDAsMSwyLDEsMywzLDIsMywzLDMsMywzLDIsMywyLDEsMCwzLDEsMiwxLDIsMSwyLDMsMiwxLDAsMSwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMSwxLDEsMiwzLDMsMywzLDMsMywzLDMsMywzLDMsMywwLDAsMywxLDMsMywyLDMsMywyLDIsMiwwLDEsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMywzLDMsMywwLDMsMywzLDMsMywyLDEsMSwyLDEsMywzLDAsMywxLDEsMSwxLDMsMiwwLDEsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAozLDMsMiwyLDIsMywzLDMsMywzLDMsMywzLDMsMywzLDEsMSwzLDEsMywzLDIsMywyLDIsMiwzLDAsMiwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywzLDIsMywzLDIsMiwzLDIsMSwxLDEsMSwxLDMsMSwzLDEsMSwwLDAsMCwxLDAsMCwwLDEsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMywyLDMsMiwwLDMsMiwwLDMsMCwyLDAsMCwyLDEsMywxLDAsMCwxLDAsMCwwLDEsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAozLDMsMywzLDIsMSwxLDEsMSwyLDEsMSwyLDEsMSwxLDIsMiwxLDIsMSwxLDEsMCwxLDEsMCwxLDAsMSwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMywzLDMsMywyLDEsMywxLDEsMiwxLDMsMiwxLDEsMCwxLDIsMywyLDEsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMywzLDMsMywyLDIsMSwwLDEsMCwwLDEsMCwwLDAsMiwxLDAsMywwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAozLDMsMywyLDMsMiwzLDMsMSwzLDIsMSwxLDEsMiwxLDEsMiwxLDMsMCwxLDAsMCwwLDEsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywxLDEsMiwyLDMsMywyLDMsMiwyLDIsMywxLDIsMiwxLDEsMiwxLDEsMiwyLDAsMSwxLDAsMSwwLDIsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMiwxLDMsMSwwLDIsMiwxLDMsMiwxLDAsMCwyLDAsMiwwLDEsMCwwLDAsMCwwLDAsMCwxLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAozLDMsMywzLDMsMywxLDIsMCwyLDMsMSwyLDMsMiwwLDEsMywxLDIsMSwxLDEsMCwwLDEsMCwwLDIsMiwyLDMsCjIsMiwyLDIsMSwyLDEsMSwyLDIsMSwxLDIsMCwxLDEsMSwwLDAsMSwxLDAsMCwxLDEsMCwwLDAsMSwxLDAsMSwKMywzLDMsMywzLDIsMSwyLDIsMSwyLDAsMiwwLDEsMCwxLDIsMSwyLDEsMSwwLDAsMCwxLDAsMSwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjMsMywyLDMsMywxLDEsMywxLDAsMywyLDEsMCwwLDAsMSwyLDAsMiwwLDEsMCwwLDAsMSwwLDEsMiwxLDIsMiwKMSwxLDEsMSwxLDEsMSwyLDIsMiwxLDEsMSwxLDEsMSwxLDAsMSwyLDEsMSwxLDAsMCwwLDAsMCwxLDEsMCwwLAozLDEsMCwxLDAsMiwzLDIsMiwyLDMsMiwyLDIsMiwyLDEsMCwyLDEsMiwxLDEsMSwwLDEsMiwxLDIsMiwyLDEsCjEsMSwyLDIsMiwyLDEsMiwxLDEsMCwxLDIsMSwyLDIsMiwxLDEsMSwwLDEsMSwxLDEsMiwwLDEsMCwwLDAsMCwKMiwzLDIsMywzLDAsMCwyLDEsMCwyLDEsMCwwLDAsMCwyLDMsMCwyLDAsMCwwLDAsMCwxLDAsMCwyLDAsMSwyLAoyLDEsMiwxLDIsMiwxLDEsMSwyLDEsMSwxLDAsMSwyLDIsMSwxLDEsMSwxLDAsMSwxLDEsMCwwLDEsMiwwLDAsCjMsMywyLDIsMywwLDIsMywxLDEsMiwwLDAsMCwxLDAsMCwyLDAsMiwwLDAsMCwxLDAsMSwwLDEsMiwwLDIsMiwKMSwxLDEsMSwyLDEsMCwxLDIsMiwyLDEsMSwxLDEsMSwxLDEsMCwxLDEsMSwwLDAsMCwwLDAsMCwxLDEsMCwwLAoyLDMsMiwzLDMsMCwwLDMsMCwxLDEsMCwxLDAsMCwwLDIsMiwxLDIsMCwwLDAsMCwwLDAsMCwwLDIsMCwxLDIsCjIsMiwxLDEsMSwxLDEsMiwyLDIsMSwwLDIsMCwxLDAsMSwwLDAsMSwwLDEsMCwwLDEsMCwwLDAsMCwxLDAsMCwKMywzLDMsMywyLDIsMiwyLDIsMCwyLDEsMSwxLDEsMiwxLDIsMSwxLDAsMiwwLDEsMCwxLDAsMCwyLDAsMSwyLAoxLDEsMSwxLDEsMSwxLDIsMiwxLDEsMCwyLDAsMSwwLDIsMCwwLDEsMSwxLDAsMCwyLDAsMCwwLDEsMSwwLDAsCjIsMywzLDMsMywxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMSwxLDAsMCwwLDAsMCwwLDEsMiwwLDEsMiwKMiwyLDIsMSwxLDIsMSwxLDIsMiwyLDEsMiwwLDEsMSwxLDEsMSwxLDAsMSwxLDEsMSwwLDAsMSwxLDEsMCwwLAoyLDMsMywzLDMsMCwyLDIsMCwyLDEsMCwwLDAsMSwxLDEsMiwwLDIsMCwwLDAsMywwLDAsMCwwLDIsMCwyLDIsCjEsMSwxLDIsMSwyLDEsMSwyLDIsMiwxLDIsMCwxLDEsMSwwLDEsMSwxLDEsMCwyLDEsMCwwLDAsMSwxLDAsMCwKMiwzLDMsMywzLDAsMiwxLDAsMCwyLDAsMCwwLDAsMCwxLDIsMCwyLDAsMCwwLDAsMCwwLDAsMCwyLDAsMSwyLAoxLDEsMSwyLDEsMSwxLDEsMiwyLDIsMCwxLDAsMSwxLDEsMCwwLDEsMSwxLDAsMCwxLDAsMCwwLDAsMSwwLDAsCjMsMywyLDIsMywwLDEsMCwxLDAsMCwwLDAsMCwwLDAsMSwxLDAsMywwLDAsMCwwLDAsMCwwLDAsMSwwLDIsMiwKMSwxLDEsMSwxLDIsMSwxLDIsMiwxLDIsMiwxLDAsMSwxLDEsMSwxLDAsMSwwLDAsMSwwLDAsMCwxLDEsMCwwLAozLDEsMCwxLDAsMiwyLDIsMiwzLDIsMSwxLDEsMiwzLDAsMCwxLDAsMiwxLDEsMCwxLDEsMSwxLDIsMSwxLDEsCjEsMiwyLDEsMiwxLDIsMiwxLDEsMCwxLDIsMSwyLDIsMSwxLDEsMCwwLDEsMSwxLDIsMSwwLDEsMCwwLDAsMCwKMiwxLDAsMSwwLDMsMSwyLDIsMiwyLDEsMiwyLDEsMSwxLDAsMiwxLDIsMiwxLDEsMiwxLDEsMCwyLDEsMSwxLAoxLDIsMiwyLDIsMiwyLDIsMSwyLDAsMSwxLDAsMiwxLDEsMSwxLDEsMCwwLDEsMSwxLDEsMCwxLDAsMCwwLDAsCjIsMSwxLDEsMSwyLDIsMiwyLDEsMiwyLDIsMSwyLDIsMSwxLDIsMSwyLDMsMiwyLDEsMSwxLDEsMCwxLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDIsMiwzLDIsMCwxLDIsMCwxLDIsMSwxLDAsMSwwLDEsMiwxLDIsMCwwLDAsMSwxLDAsMCwwLDEsMCwwLDIsCjEsMSwwLDAsMSwxLDAsMSwxLDEsMSwwLDIsMCwxLDEsMSwwLDAsMSwxLDAsMCwwLDAsMSwwLDAsMCwxLDAsMCwKMiwwLDAsMCwwLDEsMiwyLDIsMiwyLDIsMiwxLDIsMSwxLDEsMSwxLDEsMSwwLDEsMSwxLDEsMSwyLDEsMSwxLAoxLDIsMiwyLDIsMSwxLDIsMSwyLDEsMSwxLDAsMiwxLDIsMSwxLDEsMCwyLDEsMSwxLDEsMCwxLDAsMCwwLDAsCjMsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDEsMCwKMSwxLDAsMSwwLDEsMSwxLDEsMSwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDIsMiwzLDIsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDEsMSwwLDIsMCwwLDAsMCwwLDAsMCwwLDEsMCwxLDIsCjEsMSwxLDEsMSwxLDAsMCwyLDIsMiwyLDIsMCwxLDEsMCwxLDEsMSwxLDEsMCwwLDEsMCwwLDAsMSwxLDAsMSwKMiwzLDEsMiwxLDAsMSwxLDAsMiwyLDIsMCwwLDEsMCwwLDEsMSwxLDEsMCwwLDAsMCwwLDAsMCwxLDAsMSwyLAoxLDEsMSwxLDIsMSwxLDEsMSwxLDEsMSwxLDAsMSwxLDAsMSwwLDEsMCwxLDAsMCwxLDAsMCwwLDAsMSwwLDAsCjIsMiwyLDIsMiwwLDAsMiwwLDAsMiwwLDAsMCwwLDAsMCwxLDAsMSwwLDAsMCwwLDAsMCwwLDAsMiwwLDIsMiwKMSwxLDEsMSwxLDAsMCwxLDIsMSwxLDAsMSwwLDEsMCwwLDAsMCwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoxLDIsMiwyLDIsMCwwLDIsMCwxLDEsMCwwLDAsMSwwLDAsMiwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDEsCjAsMCwwLDEsMSwxLDEsMSwxLDEsMSwxLDEsMCwxLDAsMCwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMSwyLDIsMywyLDAsMCwxLDAsMCwxLDAsMCwwLDAsMCwwLDEsMCwyLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwyLAoxLDEsMCwwLDEsMCwwLDAsMSwxLDAsMCwxLDAsMSwxLDAsMCwwLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMSwyLDIsMiwxLDIsMSwyLDIsMSwxLDIsMSwxLDEsMCwxLDEsMSwxLDIsMCwxLDAsMSwxLDEsMSwwLDEsMSwKMSwxLDIsMSwxLDEsMSwxLDEsMCwwLDEsMiwxLDEsMSwxLDEsMSwwLDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwLAoxLDAsMCwxLDMsMSwxLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMiwyLDIsMiwxLDAsMCwxLDAsMiwwLDAsMCwwLDAsMSwxLDEsMCwxLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwxLAowLDIsMCwxLDAsMCwxLDEsMiwwLDEsMCwxLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjEsMiwyLDIsMiwwLDEsMSwwLDIsMSwwLDEsMSwxLDAsMCwxLDAsMiwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMCwxLDAsMCwxLDAsMCwwLDEsMSwwLDAsMSwwLDAsMSwwLDAsMCwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDIsMiwyLDIsMCwwLDEsMCwwLDAsMSwwLDEsMCwwLDAsMSwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjAsMSwwLDEsMSwxLDAsMCwxLDEsMSwwLDEsMCwwLDAsMCwwLDAsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMiwwLDEsMCwwLDEsMiwxLDEsMSwxLDEsMSwyLDIsMSwwLDAsMSwwLDEsMCwwLDAsMCwxLDEsMSwxLDAsMCwwLAoxLDEsMiwxLDEsMSwxLDAsMCwwLDEsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMiwxLDIsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMSwxLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMCwwLDAsMCwwLDAsMCwwLDEsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMSwwLDAsMSwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLAowLDEsMSwwLDEsMSwxLDAsMCwxLDAsMCwxLDAsMSwwLDAsMCwxLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsCjEsMCwxLDAsMCwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMCwwLDEsMCwyLDAsMCwyLDAsMSwwLDAsMSwwLDAsMSwKMSwxLDAsMCwxLDEsMCwxLDAsMCwwLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwxLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwxLDAsCjEsMSwxLDEsMSwxLDEsMiwwLDAsMCwwLDAsMCwyLDEsMCwxLDEsMCwwLDEsMSwxLDAsMSwwLDAsMCwwLDAsMCwKMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjEsMCwwLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwwLDEsMCwxLDEsMCwxLDEsMSwxLDEsMCwxLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAopCgpMYXRpbjVCdWxnYXJpYW5Nb2RlbCA9IHsKICAnY2hhcl90b19vcmRlcl9tYXAnOiBMYXRpbjVfQnVsZ2FyaWFuQ2hhclRvT3JkZXJNYXAsCiAgJ3ByZWNlZGVuY2VfbWF0cml4JzogQnVsZ2FyaWFuTGFuZ01vZGVsLAogICd0eXBpY2FsX3Bvc2l0aXZlX3JhdGlvJzogMC45NjkzOTIsCiAgJ2tlZXBfZW5nbGlzaF9sZXR0ZXInOiBGYWxzZSwKICAnY2hhcnNldF9uYW1lJzogIklTTy04ODU5LTUiLAogICdsYW5ndWFnZSc6ICdCdWxnYWlyYW4nLAp9CgpXaW4xMjUxQnVsZ2FyaWFuTW9kZWwgPSB7CiAgJ2NoYXJfdG9fb3JkZXJfbWFwJzogd2luMTI1MUJ1bGdhcmlhbkNoYXJUb09yZGVyTWFwLAogICdwcmVjZWRlbmNlX21hdHJpeCc6IEJ1bGdhcmlhbkxhbmdNb2RlbCwKICAndHlwaWNhbF9wb3NpdGl2ZV9yYXRpbyc6IDAuOTY5MzkyLAogICdrZWVwX2VuZ2xpc2hfbGV0dGVyJzogRmFsc2UsCiAgJ2NoYXJzZXRfbmFtZSc6ICJ3aW5kb3dzLTEyNTEiLAogICdsYW5ndWFnZSc6ICdCdWxnYXJpYW4nLAp9ClBLAwQUAAAAAAAAACEAyPFWmxxGAAAcRgAAOAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2xhbmdjeXJpbGxpY21vZGVsLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBDb21tdW5pY2F0b3IgY2xpZW50IGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAxOTk4CiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIEtPSTgtUiBsYW5ndWFnZSBtb2RlbAojIENoYXJhY3RlciBNYXBwaW5nIFRhYmxlOgpLT0k4Ul9jaGFyX3RvX29yZGVyX21hcCA9ICgKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NCwyNTUsMjU1LDI1NCwyNTUsMjU1LCAgIyAwMAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsICAjIDEwCjI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgMjAKMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyAzMAoyNTMsMTQyLDE0MywxNDQsMTQ1LDE0NiwxNDcsMTQ4LDE0OSwxNTAsMTUxLDE1MiwgNzQsMTUzLCA3NSwxNTQsICAjIDQwCjE1NSwxNTYsMTU3LDE1OCwxNTksMTYwLDE2MSwxNjIsMTYzLDE2NCwxNjUsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgNTAKMjUzLCA3MSwxNzIsIDY2LDE3MywgNjUsMTc0LCA3NiwxNzUsIDY0LDE3NiwxNzcsIDc3LCA3MiwxNzgsIDY5LCAgIyA2MAogNjcsMTc5LCA3OCwgNzMsMTgwLDE4MSwgNzksMTgyLDE4MywxODQsMTg1LDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDcwCjE5MSwxOTIsMTkzLDE5NCwxOTUsMTk2LDE5NywxOTgsMTk5LDIwMCwyMDEsMjAyLDIwMywyMDQsMjA1LDIwNiwgICMgODAKMjA3LDIwOCwyMDksMjEwLDIxMSwyMTIsMjEzLDIxNCwyMTUsMjE2LDIxNywyMTgsMjE5LDIyMCwyMjEsMjIyLCAgIyA5MAoyMjMsMjI0LDIyNSwgNjgsMjI2LDIyNywyMjgsMjI5LDIzMCwyMzEsMjMyLDIzMywyMzQsMjM1LDIzNiwyMzcsICAjIGEwCjIzOCwyMzksMjQwLDI0MSwyNDIsMjQzLDI0NCwyNDUsMjQ2LDI0NywyNDgsMjQ5LDI1MCwyNTEsMjUyLDI1MywgICMgYjAKIDI3LCAgMywgMjEsIDI4LCAxMywgIDIsIDM5LCAxOSwgMjYsICA0LCAyMywgMTEsICA4LCAxMiwgIDUsICAxLCAgIyBjMAogMTUsIDE2LCAgOSwgIDcsICA2LCAxNCwgMjQsIDEwLCAxNywgMTgsIDIwLCAyNSwgMzAsIDI5LCAyMiwgNTQsICAjIGQwCiA1OSwgMzcsIDQ0LCA1OCwgNDEsIDQ4LCA1MywgNDYsIDU1LCA0MiwgNjAsIDM2LCA0OSwgMzgsIDMxLCAzNCwgICMgZTAKIDM1LCA0MywgNDUsIDMyLCA0MCwgNTIsIDU2LCAzMywgNjEsIDYyLCA1MSwgNTcsIDQ3LCA2MywgNTAsIDcwLCAgIyBmMAopCgp3aW4xMjUxX2NoYXJfdG9fb3JkZXJfbWFwID0gKAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU0LDI1NSwyNTUsMjU0LDI1NSwyNTUsICAjIDAwCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwgICMgMTAKMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyAyMAoyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDMwCjI1MywxNDIsMTQzLDE0NCwxNDUsMTQ2LDE0NywxNDgsMTQ5LDE1MCwxNTEsMTUyLCA3NCwxNTMsIDc1LDE1NCwgICMgNDAKMTU1LDE1NiwxNTcsMTU4LDE1OSwxNjAsMTYxLDE2MiwxNjMsMTY0LDE2NSwyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyA1MAoyNTMsIDcxLDE3MiwgNjYsMTczLCA2NSwxNzQsIDc2LDE3NSwgNjQsMTc2LDE3NywgNzcsIDcyLDE3OCwgNjksICAjIDYwCiA2NywxNzksIDc4LCA3MywxODAsMTgxLCA3OSwxODIsMTgzLDE4NCwxODUsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgNzAKMTkxLDE5MiwxOTMsMTk0LDE5NSwxOTYsMTk3LDE5OCwxOTksMjAwLDIwMSwyMDIsMjAzLDIwNCwyMDUsMjA2LAoyMDcsMjA4LDIwOSwyMTAsMjExLDIxMiwyMTMsMjE0LDIxNSwyMTYsMjE3LDIxOCwyMTksMjIwLDIyMSwyMjIsCjIyMywyMjQsMjI1LDIyNiwyMjcsMjI4LDIyOSwyMzAsMjMxLDIzMiwyMzMsMjM0LDIzNSwyMzYsMjM3LDIzOCwKMjM5LDI0MCwyNDEsMjQyLDI0MywyNDQsMjQ1LDI0NiwgNjgsMjQ3LDI0OCwyNDksMjUwLDI1MSwyNTIsMjUzLAogMzcsIDQ0LCAzMywgNDYsIDQxLCA0OCwgNTYsIDUxLCA0MiwgNjAsIDM2LCA0OSwgMzgsIDMxLCAzNCwgMzUsCiA0NSwgMzIsIDQwLCA1MiwgNTMsIDU1LCA1OCwgNTAsIDU3LCA2MywgNzAsIDYyLCA2MSwgNDcsIDU5LCA0MywKICAzLCAyMSwgMTAsIDE5LCAxMywgIDIsIDI0LCAyMCwgIDQsIDIzLCAxMSwgIDgsIDEyLCAgNSwgIDEsIDE1LAogIDksICA3LCAgNiwgMTQsIDM5LCAyNiwgMjgsIDIyLCAyNSwgMjksIDU0LCAxOCwgMTcsIDMwLCAyNywgMTYsCikKCmxhdGluNV9jaGFyX3RvX29yZGVyX21hcCA9ICgKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NCwyNTUsMjU1LDI1NCwyNTUsMjU1LCAgIyAwMAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsICAjIDEwCjI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgMjAKMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyAzMAoyNTMsMTQyLDE0MywxNDQsMTQ1LDE0NiwxNDcsMTQ4LDE0OSwxNTAsMTUxLDE1MiwgNzQsMTUzLCA3NSwxNTQsICAjIDQwCjE1NSwxNTYsMTU3LDE1OCwxNTksMTYwLDE2MSwxNjIsMTYzLDE2NCwxNjUsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgNTAKMjUzLCA3MSwxNzIsIDY2LDE3MywgNjUsMTc0LCA3NiwxNzUsIDY0LDE3NiwxNzcsIDc3LCA3MiwxNzgsIDY5LCAgIyA2MAogNjcsMTc5LCA3OCwgNzMsMTgwLDE4MSwgNzksMTgyLDE4MywxODQsMTg1LDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDcwCjE5MSwxOTIsMTkzLDE5NCwxOTUsMTk2LDE5NywxOTgsMTk5LDIwMCwyMDEsMjAyLDIwMywyMDQsMjA1LDIwNiwKMjA3LDIwOCwyMDksMjEwLDIxMSwyMTIsMjEzLDIxNCwyMTUsMjE2LDIxNywyMTgsMjE5LDIyMCwyMjEsMjIyLAoyMjMsMjI0LDIyNSwyMjYsMjI3LDIyOCwyMjksMjMwLDIzMSwyMzIsMjMzLDIzNCwyMzUsMjM2LDIzNywyMzgsCiAzNywgNDQsIDMzLCA0NiwgNDEsIDQ4LCA1NiwgNTEsIDQyLCA2MCwgMzYsIDQ5LCAzOCwgMzEsIDM0LCAzNSwKIDQ1LCAzMiwgNDAsIDUyLCA1MywgNTUsIDU4LCA1MCwgNTcsIDYzLCA3MCwgNjIsIDYxLCA0NywgNTksIDQzLAogIDMsIDIxLCAxMCwgMTksIDEzLCAgMiwgMjQsIDIwLCAgNCwgMjMsIDExLCAgOCwgMTIsICA1LCAgMSwgMTUsCiAgOSwgIDcsICA2LCAxNCwgMzksIDI2LCAyOCwgMjIsIDI1LCAyOSwgNTQsIDE4LCAxNywgMzAsIDI3LCAxNiwKMjM5LCA2OCwyNDAsMjQxLDI0MiwyNDMsMjQ0LDI0NSwyNDYsMjQ3LDI0OCwyNDksMjUwLDI1MSwyNTIsMjU1LAopCgptYWNDeXJpbGxpY19jaGFyX3RvX29yZGVyX21hcCA9ICgKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NCwyNTUsMjU1LDI1NCwyNTUsMjU1LCAgIyAwMAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsICAjIDEwCjI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgMjAKMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyAzMAoyNTMsMTQyLDE0MywxNDQsMTQ1LDE0NiwxNDcsMTQ4LDE0OSwxNTAsMTUxLDE1MiwgNzQsMTUzLCA3NSwxNTQsICAjIDQwCjE1NSwxNTYsMTU3LDE1OCwxNTksMTYwLDE2MSwxNjIsMTYzLDE2NCwxNjUsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgNTAKMjUzLCA3MSwxNzIsIDY2LDE3MywgNjUsMTc0LCA3NiwxNzUsIDY0LDE3NiwxNzcsIDc3LCA3MiwxNzgsIDY5LCAgIyA2MAogNjcsMTc5LCA3OCwgNzMsMTgwLDE4MSwgNzksMTgyLDE4MywxODQsMTg1LDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDcwCiAzNywgNDQsIDMzLCA0NiwgNDEsIDQ4LCA1NiwgNTEsIDQyLCA2MCwgMzYsIDQ5LCAzOCwgMzEsIDM0LCAzNSwKIDQ1LCAzMiwgNDAsIDUyLCA1MywgNTUsIDU4LCA1MCwgNTcsIDYzLCA3MCwgNjIsIDYxLCA0NywgNTksIDQzLAoxOTEsMTkyLDE5MywxOTQsMTk1LDE5NiwxOTcsMTk4LDE5OSwyMDAsMjAxLDIwMiwyMDMsMjA0LDIwNSwyMDYsCjIwNywyMDgsMjA5LDIxMCwyMTEsMjEyLDIxMywyMTQsMjE1LDIxNiwyMTcsMjE4LDIxOSwyMjAsMjIxLDIyMiwKMjIzLDIyNCwyMjUsMjI2LDIyNywyMjgsMjI5LDIzMCwyMzEsMjMyLDIzMywyMzQsMjM1LDIzNiwyMzcsMjM4LAoyMzksMjQwLDI0MSwyNDIsMjQzLDI0NCwyNDUsMjQ2LDI0NywyNDgsMjQ5LDI1MCwyNTEsMjUyLCA2OCwgMTYsCiAgMywgMjEsIDEwLCAxOSwgMTMsICAyLCAyNCwgMjAsICA0LCAyMywgMTEsICA4LCAxMiwgIDUsICAxLCAxNSwKICA5LCAgNywgIDYsIDE0LCAzOSwgMjYsIDI4LCAyMiwgMjUsIDI5LCA1NCwgMTgsIDE3LCAzMCwgMjcsMjU1LAopCgpJQk04NTVfY2hhcl90b19vcmRlcl9tYXAgPSAoCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTQsMjU1LDI1NSwyNTQsMjU1LDI1NSwgICMgMDAKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LCAgIyAxMAoyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDIwCjI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgMzAKMjUzLDE0MiwxNDMsMTQ0LDE0NSwxNDYsMTQ3LDE0OCwxNDksMTUwLDE1MSwxNTIsIDc0LDE1MywgNzUsMTU0LCAgIyA0MAoxNTUsMTU2LDE1NywxNTgsMTU5LDE2MCwxNjEsMTYyLDE2MywxNjQsMTY1LDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDUwCjI1MywgNzEsMTcyLCA2NiwxNzMsIDY1LDE3NCwgNzYsMTc1LCA2NCwxNzYsMTc3LCA3NywgNzIsMTc4LCA2OSwgICMgNjAKIDY3LDE3OSwgNzgsIDczLDE4MCwxODEsIDc5LDE4MiwxODMsMTg0LDE4NSwyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyA3MAoxOTEsMTkyLDE5MywxOTQsIDY4LDE5NSwxOTYsMTk3LDE5OCwxOTksMjAwLDIwMSwyMDIsMjAzLDIwNCwyMDUsCjIwNiwyMDcsMjA4LDIwOSwyMTAsMjExLDIxMiwyMTMsMjE0LDIxNSwyMTYsMjE3LCAyNywgNTksIDU0LCA3MCwKICAzLCAzNywgMjEsIDQ0LCAyOCwgNTgsIDEzLCA0MSwgIDIsIDQ4LCAzOSwgNTMsIDE5LCA0NiwyMTgsMjE5LAoyMjAsMjIxLDIyMiwyMjMsMjI0LCAyNiwgNTUsICA0LCA0MiwyMjUsMjI2LDIyNywyMjgsIDIzLCA2MCwyMjksCjIzMCwyMzEsMjMyLDIzMywyMzQsMjM1LCAxMSwgMzYsMjM2LDIzNywyMzgsMjM5LDI0MCwyNDEsMjQyLDI0MywKICA4LCA0OSwgMTIsIDM4LCAgNSwgMzEsICAxLCAzNCwgMTUsMjQ0LDI0NSwyNDYsMjQ3LCAzNSwgMTYsMjQ4LAogNDMsICA5LCA0NSwgIDcsIDMyLCAgNiwgNDAsIDE0LCA1MiwgMjQsIDU2LCAxMCwgMzMsIDE3LCA2MSwyNDksCjI1MCwgMTgsIDYyLCAyMCwgNTEsIDI1LCA1NywgMzAsIDQ3LCAyOSwgNjMsIDIyLCA1MCwyNTEsMjUyLDI1NSwKKQoKSUJNODY2X2NoYXJfdG9fb3JkZXJfbWFwID0gKAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU0LDI1NSwyNTUsMjU0LDI1NSwyNTUsICAjIDAwCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwgICMgMTAKMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyAyMAoyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDMwCjI1MywxNDIsMTQzLDE0NCwxNDUsMTQ2LDE0NywxNDgsMTQ5LDE1MCwxNTEsMTUyLCA3NCwxNTMsIDc1LDE1NCwgICMgNDAKMTU1LDE1NiwxNTcsMTU4LDE1OSwxNjAsMTYxLDE2MiwxNjMsMTY0LDE2NSwyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyA1MAoyNTMsIDcxLDE3MiwgNjYsMTczLCA2NSwxNzQsIDc2LDE3NSwgNjQsMTc2LDE3NywgNzcsIDcyLDE3OCwgNjksICAjIDYwCiA2NywxNzksIDc4LCA3MywxODAsMTgxLCA3OSwxODIsMTgzLDE4NCwxODUsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgNzAKIDM3LCA0NCwgMzMsIDQ2LCA0MSwgNDgsIDU2LCA1MSwgNDIsIDYwLCAzNiwgNDksIDM4LCAzMSwgMzQsIDM1LAogNDUsIDMyLCA0MCwgNTIsIDUzLCA1NSwgNTgsIDUwLCA1NywgNjMsIDcwLCA2MiwgNjEsIDQ3LCA1OSwgNDMsCiAgMywgMjEsIDEwLCAxOSwgMTMsICAyLCAyNCwgMjAsICA0LCAyMywgMTEsICA4LCAxMiwgIDUsICAxLCAxNSwKMTkxLDE5MiwxOTMsMTk0LDE5NSwxOTYsMTk3LDE5OCwxOTksMjAwLDIwMSwyMDIsMjAzLDIwNCwyMDUsMjA2LAoyMDcsMjA4LDIwOSwyMTAsMjExLDIxMiwyMTMsMjE0LDIxNSwyMTYsMjE3LDIxOCwyMTksMjIwLDIyMSwyMjIsCjIyMywyMjQsMjI1LDIyNiwyMjcsMjI4LDIyOSwyMzAsMjMxLDIzMiwyMzMsMjM0LDIzNSwyMzYsMjM3LDIzOCwKICA5LCAgNywgIDYsIDE0LCAzOSwgMjYsIDI4LCAyMiwgMjUsIDI5LCA1NCwgMTgsIDE3LCAzMCwgMjcsIDE2LAoyMzksIDY4LDI0MCwyNDEsMjQyLDI0MywyNDQsMjQ1LDI0NiwyNDcsMjQ4LDI0OSwyNTAsMjUxLDI1MiwyNTUsCikKCiMgTW9kZWwgVGFibGU6CiMgdG90YWwgc2VxdWVuY2VzOiAxMDAlCiMgZmlyc3QgNTEyIHNlcXVlbmNlczogOTcuNjYwMSUKIyBmaXJzdCAxMDI0IHNlcXVlbmNlczogMi4zMzg5JQojIHJlc3QgIHNlcXVlbmNlczogICAgICAwLjEyMzclCiMgbmVnYXRpdmUgc2VxdWVuY2VzOiAgIDAuMDAwOSUKUnVzc2lhbkxhbmdNb2RlbCA9ICgKMCwzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDEsMSwzLDMsMywzLDEsMywzLDMsMiwzLDIsMywzLAozLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDAsMywyLDIsMiwyLDIsMCwwLDIsCjMsMywzLDIsMywzLDMsMywzLDMsMywzLDMsMywyLDMsMywwLDAsMywzLDMsMywzLDMsMywzLDMsMiwzLDIsMCwKMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywyLDIsMywzLDMsMywzLDMsMywzLDMsMiwzLDMsMCwwLDMsMywzLDMsMywzLDMsMywyLDMsMywxLDAsCjAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywyLDMsMiwzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDAsMCwzLDMsMywzLDMsMywzLDMsMywzLDMsMiwxLAowLDAsMCwwLDAsMCwwLDIsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywyLDMsMywwLDAsMywzLDMsMywzLDMsMywzLDMsMywzLDIsMSwKMCwwLDAsMCwwLDEsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDMsMywzLDMsMiwyLDIsMywxLDMsMywxLDMsMywzLDMsMiwyLDMsMCwyLDIsMiwzLDMsMiwxLDAsCjAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywzLDMsMiwzLDMsMywzLDMsMiwyLDMsMiwzLDMsMywyLDEsMiwyLDAsMSwyLDIsMiwyLDIsMiwwLAowLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMiwyLDIsMywwLDIsMiwzLDMsMiwxLDIsMCwKMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDMsMywyLDMsMywxLDIsMywyLDIsMywyLDMsMywzLDMsMiwyLDMsMCwzLDIsMiwzLDEsMSwxLDAsCjAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywzLDMsMywzLDIsMiwzLDMsMywzLDMsMiwzLDMsMywzLDIsMiwyLDAsMywzLDMsMiwyLDIsMiwwLAowLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMywzLDMsMywzLDMsMiwzLDIsMywzLDMsMywzLDMsMiwzLDIsMiwwLDEsMywyLDEsMiwyLDEsMCwKMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDMsMywzLDMsMywzLDMsMiwxLDEsMywwLDEsMSwxLDEsMiwxLDEsMCwyLDIsMiwxLDIsMCwxLDAsCjAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywzLDMsMiwzLDMsMiwyLDIsMiwxLDMsMiwzLDIsMywyLDEsMiwyLDAsMSwxLDIsMSwyLDEsMiwwLAowLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMywzLDMsMywzLDMsMywzLDIsMiwzLDIsMywzLDMsMiwyLDIsMiwwLDIsMiwyLDIsMywxLDEsMCwKMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLAozLDIsMywyLDIsMywzLDMsMywzLDMsMywzLDMsMSwzLDIsMCwwLDMsMywzLDMsMiwzLDMsMywzLDIsMywyLDAsCjAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMiwzLDMsMywzLDMsMiwyLDMsMywwLDIsMSwwLDMsMiwzLDIsMywwLDAsMSwyLDAsMCwxLDAsMSwyLDEsMSwwLAowLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMCwzLDAsMiwzLDMsMywzLDIsMywzLDMsMywxLDIsMiwwLDAsMiwzLDIsMiwyLDMsMiwzLDIsMiwzLDAsMCwKMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDIsMywwLDIsMywyLDMsMCwxLDIsMywzLDIsMCwyLDMsMCwwLDIsMywyLDIsMCwxLDMsMSwzLDIsMiwxLDAsCjAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywxLDMsMCwyLDMsMywzLDMsMywzLDMsMywyLDEsMywyLDAsMCwyLDIsMywzLDMsMiwzLDMsMCwyLDIsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMywzLDIsMiwzLDMsMiwyLDIsMywzLDAsMCwxLDEsMSwxLDEsMiwwLDAsMSwxLDEsMSwwLDEsMCwKMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDMsMywyLDIsMywzLDMsMywzLDMsMywwLDMsMiwzLDMsMiwzLDIsMCwyLDEsMCwxLDEsMCwxLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywzLDMsMiwzLDMsMywyLDIsMiwyLDMsMSwzLDIsMywxLDEsMiwxLDAsMiwyLDIsMiwxLDMsMSwwLAowLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMiwzLDMsMywzLDMsMSwyLDIsMSwzLDEsMCwzLDAsMCwzLDAsMCwwLDEsMSwwLDEsMiwxLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDIsMiwxLDEsMywzLDMsMiwyLDEsMiwyLDMsMSwxLDIsMCwwLDIsMiwxLDMsMCwwLDIsMSwxLDIsMSwxLDAsCjAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywyLDMsMywzLDMsMSwyLDIsMiwxLDIsMSwzLDMsMSwxLDIsMSwyLDEsMiwyLDAsMiwwLDAsMSwxLDAsMSwwLAowLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMywzLDMsMywzLDIsMSwzLDIsMiwzLDIsMCwzLDIsMCwzLDAsMSwwLDEsMSwwLDAsMSwxLDEsMSwwLDEsMCwKMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMiwzLDMsMywyLDIsMiwzLDMsMSwyLDEsMiwxLDAsMSwwLDEsMSwwLDEsMCwwLDIsMSwxLDEsMCwxLDAsCjAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwKMywxLDEsMiwxLDIsMywzLDIsMiwxLDIsMiwzLDAsMiwxLDAsMCwyLDIsMywyLDEsMiwyLDIsMiwyLDMsMSwwLAowLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMywxLDEsMCwxLDEsMiwyLDEsMSwzLDAsMCwxLDMsMSwxLDEsMCwwLDAsMSwwLDEsMSwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDEsMywzLDMsMiwwLDAsMCwyLDEsMCwxLDAsMiwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMiwwLDEsMCwwLDIsMywyLDIsMiwxLDIsMiwyLDEsMiwxLDAsMCwxLDEsMSwwLDIsMCwxLDEsMSwwLDAsMSwxLAoxLDAsMCwwLDAsMCwxLDIsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMywzLDMsMywwLDAsMCwwLDEsMCwwLDAsMCwzLDAsMSwyLDEsMCwwLDAsMCwwLDAsMCwxLDEsMCwwLDEsMSwKMSwwLDEsMCwxLDIsMCwwLDEsMSwyLDEsMCwxLDEsMSwxLDAsMSwxLDEsMSwwLDEsMCwwLDEsMCwwLDEsMSwwLAoyLDIsMywyLDIsMiwzLDEsMiwyLDIsMiwyLDIsMiwyLDEsMSwxLDEsMSwxLDEsMCwxLDAsMSwxLDEsMCwyLDEsCjEsMSwxLDEsMSwxLDEsMSwyLDEsMSwxLDEsMSwxLDEsMSwxLDEsMCwxLDAsMSwxLDAsMSwxLDEsMCwxLDEsMCwKMywzLDMsMiwyLDIsMiwzLDIsMiwxLDEsMiwyLDIsMiwxLDEsMywxLDIsMSwyLDAsMCwxLDEsMCwxLDAsMiwxLAoxLDEsMSwxLDEsMiwxLDAsMSwxLDEsMSwwLDEsMCwwLDEsMSwwLDAsMSwwLDEsMCwwLDEsMCwwLDAsMSwxLDAsCjIsMCwwLDEsMCwzLDIsMiwyLDIsMSwyLDEsMiwxLDIsMCwwLDAsMiwxLDIsMiwxLDEsMiwyLDAsMSwxLDAsMiwKMSwxLDEsMSwxLDAsMSwxLDEsMiwxLDEsMSwyLDEsMCwxLDIsMSwxLDEsMSwwLDEsMSwxLDAsMCwxLDAsMCwxLAoxLDMsMiwyLDIsMSwxLDEsMiwzLDAsMCwwLDAsMiwwLDIsMiwxLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwxLDEsCjEsMCwxLDEsMCwxLDAsMSwxLDAsMSwxLDAsMiwwLDAsMSwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwxLDEsMCwKMiwzLDIsMywyLDEsMiwyLDIsMiwxLDAsMCwwLDIsMCwwLDEsMSwwLDAsMCwwLDAsMCwwLDEsMSwwLDAsMiwxLAoxLDEsMiwxLDAsMiwwLDAsMSwwLDEsMCwwLDEsMCwwLDEsMSwwLDEsMSwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsCjMsMCwwLDEsMCwyLDIsMiwzLDIsMiwyLDIsMiwyLDIsMCwwLDAsMiwxLDIsMSwxLDEsMiwyLDAsMCwwLDEsMiwKMSwxLDEsMSwxLDAsMSwyLDEsMSwxLDEsMSwxLDEsMCwxLDEsMSwxLDEsMSwwLDEsMSwxLDEsMSwxLDAsMCwxLAoyLDMsMiwzLDMsMiwwLDEsMSwxLDAsMCwxLDAsMiwwLDEsMSwzLDEsMCwwLDAsMCwwLDAsMCwxLDAsMCwyLDEsCjEsMSwxLDEsMSwxLDEsMCwxLDAsMSwxLDEsMSwwLDEsMSwxLDAsMCwxLDEsMCwxLDAsMCwwLDAsMCwwLDEsMCwKMiwzLDMsMywzLDEsMiwyLDIsMiwwLDEsMSwwLDIsMSwxLDEsMiwxLDAsMSwxLDAsMCwxLDAsMSwwLDAsMiwwLAowLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMywzLDMsMiwwLDAsMSwxLDIsMiwxLDAsMCwyLDAsMSwxLDMsMCwwLDEsMCwwLDAsMCwwLDEsMCwxLDIsMSwKMSwxLDIsMCwxLDEsMSwwLDEsMCwxLDEsMCwxLDAsMSwxLDEsMSwwLDEsMCwwLDAsMCwwLDAsMSwwLDEsMSwwLAoxLDMsMiwzLDIsMSwwLDAsMiwyLDIsMCwxLDAsMiwwLDEsMSwxLDAsMSwwLDAsMCwzLDAsMSwxLDAsMCwyLDEsCjEsMSwxLDAsMSwxLDAsMCwwLDAsMSwxLDAsMSwwLDAsMiwxLDEsMCwxLDAsMCwwLDEsMCwxLDAsMCwxLDEsMCwKMywxLDIsMSwxLDIsMiwyLDIsMiwyLDEsMiwyLDEsMSwwLDAsMCwyLDIsMiwwLDAsMCwxLDIsMSwwLDEsMCwxLAoyLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwwLDIsMSwxLDEsMCwxLDAsMSwxLDAsMSwxLDEsMCwwLDEsCjMsMCwwLDAsMCwyLDAsMSwxLDEsMSwxLDEsMSwwLDEsMCwwLDAsMSwxLDEsMCwxLDAsMSwxLDAsMCwxLDAsMSwKMSwxLDAsMCwxLDAsMCwwLDEsMCwxLDEsMCwwLDEsMCwxLDAsMSwwLDAsMCwwLDEsMCwwLDAsMSwwLDAsMCwxLAoxLDMsMywyLDIsMCwwLDAsMiwyLDAsMCwwLDEsMiwwLDEsMSwyLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwyLDEsCjAsMSwxLDAsMCwxLDEsMCwwLDAsMSwxLDAsMSwxLDAsMSwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwKMiwzLDIsMywyLDAsMCwwLDAsMSwxLDAsMCwwLDIsMCwyLDAsMiwwLDAsMCwwLDAsMSwwLDAsMSwwLDAsMSwxLAoxLDEsMiwwLDEsMiwxLDAsMSwxLDIsMSwxLDEsMSwxLDIsMSwxLDAsMSwwLDAsMSwxLDEsMSwxLDAsMSwxLDAsCjEsMywyLDIsMiwxLDAsMCwyLDIsMSwwLDEsMiwyLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDEsMSwKMCwwLDEsMSwwLDEsMSwwLDAsMSwxLDAsMSwxLDAsMCwxLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoxLDAsMCwxLDAsMiwzLDEsMiwyLDIsMiwyLDIsMSwxLDAsMCwwLDEsMCwxLDAsMiwxLDEsMSwwLDAsMCwwLDEsCjEsMSwwLDEsMSwwLDEsMSwxLDEsMCwwLDAsMSwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwKMiwwLDIsMCwwLDEsMCwzLDIsMSwyLDEsMiwyLDAsMSwwLDAsMCwyLDEsMCwwLDIsMSwxLDEsMSwwLDIsMCwyLAoyLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDIsMSwwLDEsMSwxLDEsMCwwLDAsMSwxLDEsMSwwLDEsMCwwLDEsCjEsMiwyLDIsMiwxLDAsMCwxLDAsMCwwLDAsMCwyLDAsMSwxLDEsMSwwLDAsMCwwLDEsMCwxLDIsMCwwLDIsMCwKMSwwLDEsMSwxLDIsMSwwLDEsMCwxLDEsMCwwLDEsMCwxLDEsMSwwLDEsMCwwLDAsMSwwLDAsMSwwLDEsMSwwLAoyLDEsMiwyLDIsMCwzLDAsMSwxLDAsMCwwLDAsMiwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjAsMCwwLDEsMSwxLDAsMCwxLDAsMSwwLDAsMCwwLDAsMSwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwKMSwyLDIsMywyLDIsMCwwLDEsMSwyLDAsMSwyLDEsMCwxLDAsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwxLAowLDEsMSwwLDAsMSwxLDAsMCwxLDEsMCwwLDEsMSwwLDEsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMSwxLDAsCjIsMiwxLDEsMiwxLDIsMiwyLDIsMiwxLDIsMiwwLDEsMCwwLDAsMSwyLDIsMiwxLDIsMSwxLDEsMSwxLDIsMSwKMSwxLDEsMSwxLDEsMSwxLDEsMSwwLDAsMSwxLDEsMCwxLDEsMSwwLDAsMCwwLDEsMSwxLDAsMSwxLDAsMCwxLAoxLDIsMiwyLDIsMCwxLDAsMiwyLDAsMCwwLDAsMiwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsCjAsMCwxLDAsMCwxLDAsMCwwLDAsMSwwLDEsMSwwLDAsMSwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjEsMiwyLDIsMiwwLDAsMCwyLDIsMiwwLDEsMCwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMSwKMCwxLDEsMCwwLDEsMSwwLDAsMCwxLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoxLDIsMiwyLDIsMCwwLDAsMCwxLDAsMCwxLDEsMiwwLDAsMCwwLDEsMCwxLDAsMCwxLDAsMCwyLDAsMCwwLDEsCjAsMCwxLDAsMCwxLDAsMCwwLDEsMSwwLDAsMCwwLDAsMSwwLDAsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMSwyLDIsMiwxLDEsMiwwLDIsMSwxLDEsMSwwLDIsMiwwLDAsMCwwLDAsMCwwLDAsMCwxLDEsMCwwLDAsMSwxLAowLDAsMSwwLDEsMSwwLDAsMCwwLDEsMCwwLDAsMCwwLDEsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjEsMCwyLDEsMiwwLDAsMCwwLDAsMSwwLDAsMCwxLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwKMCwwLDEsMCwxLDEsMCwwLDAsMCwxLDAsMCwwLDAsMCwxLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLAoxLDAsMCwwLDAsMiwwLDEsMiwxLDAsMSwxLDEsMCwxLDAsMCwwLDEsMCwxLDAsMCwxLDAsMSwwLDAsMCwwLDEsCjAsMCwwLDAsMCwxLDAsMCwxLDEsMCwwLDEsMSwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMiwyLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAoxLDAsMCwwLDEsMCwwLDAsMSwxLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMSwwLDAsMSwwLDAsMCwwLDAsCjIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwKMSwxLDEsMCwxLDAsMSwwLDAsMSwxLDEsMSwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwxLDAsMSwwLDAsMCwwLAoxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjEsMSwwLDEsMSwwLDEsMCwxLDAsMCwwLDAsMSwxLDAsMSwxLDAsMCwwLDAsMCwxLDAsMSwxLDAsMSwwLDAsMCwKMCwxLDEsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsCikKCktvaThyTW9kZWwgPSB7CiAgJ2NoYXJfdG9fb3JkZXJfbWFwJzogS09JOFJfY2hhcl90b19vcmRlcl9tYXAsCiAgJ3ByZWNlZGVuY2VfbWF0cml4JzogUnVzc2lhbkxhbmdNb2RlbCwKICAndHlwaWNhbF9wb3NpdGl2ZV9yYXRpbyc6IDAuOTc2NjAxLAogICdrZWVwX2VuZ2xpc2hfbGV0dGVyJzogRmFsc2UsCiAgJ2NoYXJzZXRfbmFtZSc6ICJLT0k4LVIiLAogICdsYW5ndWFnZSc6ICdSdXNzaWFuJywKfQoKV2luMTI1MUN5cmlsbGljTW9kZWwgPSB7CiAgJ2NoYXJfdG9fb3JkZXJfbWFwJzogd2luMTI1MV9jaGFyX3RvX29yZGVyX21hcCwKICAncHJlY2VkZW5jZV9tYXRyaXgnOiBSdXNzaWFuTGFuZ01vZGVsLAogICd0eXBpY2FsX3Bvc2l0aXZlX3JhdGlvJzogMC45NzY2MDEsCiAgJ2tlZXBfZW5nbGlzaF9sZXR0ZXInOiBGYWxzZSwKICAnY2hhcnNldF9uYW1lJzogIndpbmRvd3MtMTI1MSIsCiAgJ2xhbmd1YWdlJzogJ1J1c3NpYW4nLAp9CgpMYXRpbjVDeXJpbGxpY01vZGVsID0gewogICdjaGFyX3RvX29yZGVyX21hcCc6IGxhdGluNV9jaGFyX3RvX29yZGVyX21hcCwKICAncHJlY2VkZW5jZV9tYXRyaXgnOiBSdXNzaWFuTGFuZ01vZGVsLAogICd0eXBpY2FsX3Bvc2l0aXZlX3JhdGlvJzogMC45NzY2MDEsCiAgJ2tlZXBfZW5nbGlzaF9sZXR0ZXInOiBGYWxzZSwKICAnY2hhcnNldF9uYW1lJzogIklTTy04ODU5LTUiLAogICdsYW5ndWFnZSc6ICdSdXNzaWFuJywKfQoKTWFjQ3lyaWxsaWNNb2RlbCA9IHsKICAnY2hhcl90b19vcmRlcl9tYXAnOiBtYWNDeXJpbGxpY19jaGFyX3RvX29yZGVyX21hcCwKICAncHJlY2VkZW5jZV9tYXRyaXgnOiBSdXNzaWFuTGFuZ01vZGVsLAogICd0eXBpY2FsX3Bvc2l0aXZlX3JhdGlvJzogMC45NzY2MDEsCiAgJ2tlZXBfZW5nbGlzaF9sZXR0ZXInOiBGYWxzZSwKICAnY2hhcnNldF9uYW1lJzogIk1hY0N5cmlsbGljIiwKICAnbGFuZ3VhZ2UnOiAnUnVzc2lhbicsCn0KCklibTg2Nk1vZGVsID0gewogICdjaGFyX3RvX29yZGVyX21hcCc6IElCTTg2Nl9jaGFyX3RvX29yZGVyX21hcCwKICAncHJlY2VkZW5jZV9tYXRyaXgnOiBSdXNzaWFuTGFuZ01vZGVsLAogICd0eXBpY2FsX3Bvc2l0aXZlX3JhdGlvJzogMC45NzY2MDEsCiAgJ2tlZXBfZW5nbGlzaF9sZXR0ZXInOiBGYWxzZSwKICAnY2hhcnNldF9uYW1lJzogIklCTTg2NiIsCiAgJ2xhbmd1YWdlJzogJ1J1c3NpYW4nLAp9CgpJYm04NTVNb2RlbCA9IHsKICAnY2hhcl90b19vcmRlcl9tYXAnOiBJQk04NTVfY2hhcl90b19vcmRlcl9tYXAsCiAgJ3ByZWNlZGVuY2VfbWF0cml4JzogUnVzc2lhbkxhbmdNb2RlbCwKICAndHlwaWNhbF9wb3NpdGl2ZV9yYXRpbyc6IDAuOTc2NjAxLAogICdrZWVwX2VuZ2xpc2hfbGV0dGVyJzogRmFsc2UsCiAgJ2NoYXJzZXRfbmFtZSc6ICJJQk04NTUiLAogICdsYW5ndWFnZSc6ICdSdXNzaWFuJywKfQpQSwMEFAAAAAAAAAAhAP67rymQMQAAkDEAADUAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9sYW5nZ3JlZWttb2RlbC5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIE1vemlsbGEgQ29tbXVuaWNhdG9yIGNsaWVudCBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMTk5OAojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyAyNTU6IENvbnRyb2wgY2hhcmFjdGVycyB0aGF0IHVzdWFsbHkgZG9lcyBub3QgZXhpc3QgaW4gYW55IHRleHQKIyAyNTQ6IENhcnJpYWdlL1JldHVybgojIDI1Mzogc3ltYm9sIChwdW5jdHVhdGlvbikgdGhhdCBkb2VzIG5vdCBiZWxvbmcgdG8gd29yZAojIDI1MjogMCAtIDkKCiMgQ2hhcmFjdGVyIE1hcHBpbmcgVGFibGU6CkxhdGluN19jaGFyX3RvX29yZGVyX21hcCA9ICgKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NCwyNTUsMjU1LDI1NCwyNTUsMjU1LCAgIyAwMAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsICAjIDEwCjI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgMjAKMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyAzMAoyNTMsIDgyLDEwMCwxMDQsIDk0LCA5OCwxMDEsMTE2LDEwMiwxMTEsMTg3LDExNywgOTIsIDg4LDExMywgODUsICAjIDQwCiA3OSwxMTgsMTA1LCA4MywgNjcsMTE0LDExOSwgOTUsIDk5LDEwOSwxODgsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgNTAKMjUzLCA3MiwgNzAsIDgwLCA4MSwgNjAsIDk2LCA5MywgODksIDY4LDEyMCwgOTcsIDc3LCA4NiwgNjksIDU1LCAgIyA2MAogNzgsMTE1LCA2NSwgNjYsIDU4LCA3NiwxMDYsMTAzLCA4NywxMDcsMTEyLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDcwCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwgICMgODAKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LCAgIyA5MAoyNTMsMjMzLCA5MCwyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsIDc0LDI1MywyNTMsICAjIGEwCjI1MywyNTMsMjUzLDI1MywyNDcsMjQ4LCA2MSwgMzYsIDQ2LCA3MSwgNzMsMjUzLCA1NCwyNTMsMTA4LDEyMywgICMgYjAKMTEwLCAzMSwgNTEsIDQzLCA0MSwgMzQsIDkxLCA0MCwgNTIsIDQ3LCA0NCwgNTMsIDM4LCA0OSwgNTksIDM5LCAgIyBjMAogMzUsIDQ4LDI1MCwgMzcsIDMzLCA0NSwgNTYsIDUwLCA4NCwgNTcsMTIwLDEyMSwgMTcsIDE4LCAyMiwgMTUsICAjIGQwCjEyNCwgIDEsIDI5LCAyMCwgMjEsICAzLCAzMiwgMTMsIDI1LCAgNSwgMTEsIDE2LCAxMCwgIDYsIDMwLCAgNCwgICMgZTAKICA5LCAgOCwgMTQsICA3LCAgMiwgMTIsIDI4LCAyMywgNDIsIDI0LCA2NCwgNzUsIDE5LCAyNiwgMjcsMjUzLCAgIyBmMAopCgp3aW4xMjUzX2NoYXJfdG9fb3JkZXJfbWFwID0gKAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU0LDI1NSwyNTUsMjU0LDI1NSwyNTUsICAjIDAwCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwgICMgMTAKMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyAyMAoyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDMwCjI1MywgODIsMTAwLDEwNCwgOTQsIDk4LDEwMSwxMTYsMTAyLDExMSwxODcsMTE3LCA5MiwgODgsMTEzLCA4NSwgICMgNDAKIDc5LDExOCwxMDUsIDgzLCA2NywxMTQsMTE5LCA5NSwgOTksMTA5LDE4OCwyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyA1MAoyNTMsIDcyLCA3MCwgODAsIDgxLCA2MCwgOTYsIDkzLCA4OSwgNjgsMTIwLCA5NywgNzcsIDg2LCA2OSwgNTUsICAjIDYwCiA3OCwxMTUsIDY1LCA2NiwgNTgsIDc2LDEwNiwxMDMsIDg3LDEwNywxMTIsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgNzAKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LCAgIyA4MAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsICAjIDkwCjI1MywyMzMsIDYxLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywgNzQsMjUzLDI1MywgICMgYTAKMjUzLDI1MywyNTMsMjUzLDI0NywyNTMsMjUzLCAzNiwgNDYsIDcxLCA3MywyNTMsIDU0LDI1MywxMDgsMTIzLCAgIyBiMAoxMTAsIDMxLCA1MSwgNDMsIDQxLCAzNCwgOTEsIDQwLCA1MiwgNDcsIDQ0LCA1MywgMzgsIDQ5LCA1OSwgMzksICAjIGMwCiAzNSwgNDgsMjUwLCAzNywgMzMsIDQ1LCA1NiwgNTAsIDg0LCA1NywxMjAsMTIxLCAxNywgMTgsIDIyLCAxNSwgICMgZDAKMTI0LCAgMSwgMjksIDIwLCAyMSwgIDMsIDMyLCAxMywgMjUsICA1LCAxMSwgMTYsIDEwLCAgNiwgMzAsICA0LCAgIyBlMAogIDksICA4LCAxNCwgIDcsICAyLCAxMiwgMjgsIDIzLCA0MiwgMjQsIDY0LCA3NSwgMTksIDI2LCAyNywyNTMsICAjIGYwCikKCiMgTW9kZWwgVGFibGU6CiMgdG90YWwgc2VxdWVuY2VzOiAxMDAlCiMgZmlyc3QgNTEyIHNlcXVlbmNlczogOTguMjg1MSUKIyBmaXJzdCAxMDI0IHNlcXVlbmNlczoxLjcwMDElCiMgcmVzdCAgc2VxdWVuY2VzOiAgICAgMC4wMzU5JQojIG5lZ2F0aXZlIHNlcXVlbmNlczogIDAuMDE0OCUKR3JlZWtMYW5nTW9kZWwgPSAoCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMywyLDIsMywzLDMsMywzLDMsMywzLDEsMywzLDMsMCwyLDIsMywzLDAsMywwLDMsMiwwLDMsMywzLDAsCjMsMCwwLDAsMiwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwzLDMsMywzLDMsMCwzLDMsMCwzLDIsMywzLDAsMywyLDMsMywzLDAsMCwzLDAsMywwLDMsMywyLDAsMCwwLAoyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsCjAsMiwzLDIsMiwzLDMsMywzLDMsMywzLDMsMCwzLDMsMywzLDAsMiwzLDMsMCwzLDMsMywzLDIsMywzLDMsMCwKMiwwLDAsMCwyLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDIsMywzLDIsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMCwyLDEsMywzLDMsMywyLDMsMywyLDMsMywyLDAsCjAsMCwwLDAsMiwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwzLDMsMywzLDAsMywzLDMsMywzLDMsMCwzLDMsMCwzLDMsMywzLDMsMywzLDMsMywzLDAsMywyLDMsMywwLAoyLDAsMSwwLDIsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsCjAsMywzLDMsMywzLDIsMywwLDAsMCwwLDMsMywwLDMsMSwzLDMsMywwLDMsMywwLDMsMywzLDMsMCwwLDAsMCwKMiwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDMsMywzLDMsMywwLDMsMCwzLDMsMywzLDMsMCwzLDIsMiwyLDMsMCwyLDMsMywzLDMsMywyLDMsMywwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwzLDMsMywzLDMsMywyLDIsMiwzLDMsMywzLDAsMywxLDMsMywzLDMsMiwzLDMsMywzLDMsMywzLDIsMiwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMywzLDMsMywzLDIsMCwzLDAsMCwwLDMsMywyLDMsMywzLDMsMywwLDAsMywyLDMsMCwyLDMsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDMsMCwzLDMsMywzLDAsMCwzLDMsMCwyLDMsMCwzLDAsMywzLDMsMCwwLDMsMCwzLDAsMiwyLDMsMywwLDAsCjAsMCwxLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwzLDMsMywzLDMsMiwwLDMsMiwzLDMsMywzLDAsMywzLDMsMywzLDAsMywzLDIsMywyLDMsMywyLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMywzLDIsMywyLDMsMywzLDMsMywzLDAsMiwzLDIsMywyLDIsMiwzLDIsMywzLDIsMywwLDIsMiwyLDMsMCwKMiwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMywwLDAsMCwzLDMsMywyLDMsMywwLDAsMywwLDMsMCwwLDAsMywyLDAsMywwLDMsMCwwLDIsMCwyLDAsCjAsMCwwLDAsMiwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMywzLDMsMywwLDMsMywzLDMsMywzLDAsMywzLDAsMywwLDAsMCwzLDMsMCwzLDMsMywwLDAsMSwyLDMsMCwKMywwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDMsMywzLDMsMywyLDAsMCwzLDIsMiwzLDMsMCwzLDMsMywzLDMsMiwxLDMsMCwzLDIsMywzLDIsMSwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDMsMywwLDIsMywzLDMsMywzLDMsMCwwLDMsMCwzLDAsMCwwLDMsMywwLDMsMiwzLDAsMCwzLDMsMywwLAozLDAsMCwwLDIsMCwwLDAsMCwwLDMsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMywzLDMsMywwLDMsMywzLDMsMywzLDAsMCwzLDAsMywwLDAsMCwzLDIsMCwzLDIsMywwLDAsMywyLDMsMCwKMiwwLDAsMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMywxLDIsMiwzLDMsMywzLDMsMywwLDIsMywwLDMsMCwwLDAsMywzLDAsMywwLDIsMCwwLDIsMywxLDAsCjIsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwzLDAsMywzLDMsMywwLDMsMCwzLDMsMiwzLDAsMywzLDMsMywzLDMsMCwzLDMsMywwLDIsMywwLDAsMywwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMywwLDMsMywzLDAsMCwzLDAsMCwwLDMsMywwLDMsMCwyLDMsMywwLDAsMywwLDMsMCwzLDMsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMywwLDAsMCwzLDMsMywzLDMsMywwLDAsMywwLDIsMCwwLDAsMywzLDAsMywwLDMsMCwwLDIsMCwyLDAsCjAsMCwwLDAsMSwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwzLDMsMywzLDMsMywwLDMsMCwyLDAsMywyLDAsMywyLDMsMiwzLDAsMCwzLDIsMywyLDMsMywwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwzLDAsMCwyLDMsMywzLDMsMywwLDAsMCwzLDAsMiwxLDAsMCwzLDIsMiwyLDAsMywwLDAsMiwyLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDMsMCwzLDMsMywyLDAsMywwLDMsMCwzLDMsMCwyLDEsMiwzLDMsMCwwLDMsMCwzLDAsMywzLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwyLDMsMywzLDAsMywzLDMsMywzLDMsMCwyLDMsMCwzLDAsMCwwLDIsMSwwLDIsMiwzLDAsMCwyLDIsMiwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwzLDAsMCwyLDMsMywzLDIsMywwLDAsMSwzLDAsMiwwLDAsMCwwLDMsMCwxLDAsMiwwLDAsMSwxLDEsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDMsMywzLDMsMywxLDAsMywwLDAsMCwzLDIsMCwzLDIsMywzLDMsMCwwLDMsMCwzLDIsMiwyLDEsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwzLDAsMywzLDMsMCwwLDMsMCwwLDAsMCwyLDAsMiwzLDMsMiwyLDIsMiwzLDAsMiwwLDIsMiwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMywzLDMsMywyLDAsMCwwLDAsMCwwLDIsMywwLDIsMCwyLDMsMiwwLDAsMywwLDMsMCwzLDEsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwzLDIsMywzLDIsMiwzLDAsMiwwLDMsMCwwLDAsMiwwLDAsMCwwLDEsMiwwLDIsMCwyLDAsCjAsMiwwLDIsMCwyLDIsMCwwLDEsMCwyLDIsMiwwLDIsMiwyLDAsMiwyLDIsMCwwLDIsMCwwLDEsMCwwLDAsMCwKMCwyLDAsMywzLDIsMCwwLDAsMCwwLDAsMSwzLDAsMiwwLDIsMiwyLDAsMCwyLDAsMywwLDAsMiwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMywwLDIsMywyLDAsMiwyLDAsMiwwLDIsMiwwLDIsMCwyLDIsMiwwLDAsMCwwLDAsMCwyLDMsMCwwLDAsMiwKMCwxLDIsMCwwLDAsMCwyLDIsMCwwLDAsMiwxLDAsMiwyLDAsMCwwLDAsMCwwLDEsMCwyLDAsMCwwLDAsMCwwLAowLDAsMiwxLDAsMiwzLDIsMiwzLDIsMywyLDAsMCwzLDMsMywwLDAsMywyLDAsMCwwLDEsMSwwLDIsMCwyLDIsCjAsMiwwLDIsMCwyLDIsMCwwLDIsMCwyLDIsMiwwLDIsMiwyLDIsMCwwLDIsMCwwLDAsMiwwLDEsMCwwLDAsMCwKMCwzLDAsMywzLDIsMiwwLDMsMCwwLDAsMiwyLDAsMiwyLDIsMSwyLDAsMCwxLDIsMiwwLDAsMywwLDAsMCwyLAowLDEsMiwwLDAsMCwxLDIsMCwwLDAsMCwwLDAsMCwyLDIsMCwxLDAsMCwyLDAsMCwwLDIsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDIsMywzLDIsMiwwLDAsMCwyLDAsMiwzLDMsMCwyLDAsMCwwLDAsMCwwLDIsMiwyLDAsMiwyLDAsMiwwLDIsCjAsMiwyLDAsMCwyLDIsMiwyLDEsMCwwLDIsMiwwLDIsMCwwLDIsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwKMCwyLDAsMywyLDMsMCwwLDAsMywwLDAsMiwyLDAsMiwwLDIsMiwyLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwyLAowLDAsMiwyLDAsMCwyLDIsMiwwLDAsMCwwLDAsMCwyLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwyLDAsMCwzLDIsMCwyLDIsMiwyLDIsMCwwLDAsMiwwLDAsMCwwLDIsMCwxLDAsMCwyLDAsMSwwLDAsMCwKMCwyLDIsMiwwLDIsMiwwLDEsMiwwLDIsMiwyLDAsMiwyLDIsMiwxLDIsMiwwLDAsMiwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsCjAsMiwwLDIsMCwyLDIsMCwwLDAsMCwxLDIsMSwwLDAsMiwyLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMywyLDMsMCwwLDIsMCwwLDAsMiwyLDAsMiwwLDAsMCwxLDAsMCwyLDAsMiwwLDIsMiwwLDAsMCwwLAowLDAsMiwwLDAsMCwwLDIsMiwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsCjAsMiwyLDMsMiwyLDAsMCwwLDAsMCwwLDEsMywwLDIsMCwyLDIsMCwwLDAsMSwwLDIsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDIsMCwyLDAsMywyLDAsMiwwLDAsMCwwLDAsMCwyLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjAsMCwyLDAsMCwwLDAsMSwxLDAsMCwyLDEsMiwwLDIsMiwwLDEsMCwwLDEsMCwwLDAsMiwwLDAsMCwwLDAsMCwKMCwzLDAsMiwyLDIsMCwwLDIsMCwwLDAsMiwwLDAsMCwyLDMsMCwyLDAsMCwwLDAsMCwwLDIsMiwwLDAsMCwyLAowLDEsMiwwLDAsMCwxLDIsMiwxLDAsMCwwLDIsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDMsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwyLDEsMiwwLDIsMiwwLDIsMCwwLDIsMCwwLDAsMCwxLDIsMSwwLDIsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMiwwLDAsMCwzLDEsMiwyLDAsMiwwLDAsMCwwLDIsMCwwLDAsMiwwLDAsMywwLDAsMCwwLDIsMiwyLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwyLDEsMCwyLDAsMSwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMSwwLDAsMCwwLDAsMCwyLAowLDIsMiwwLDAsMiwyLDIsMiwyLDAsMSwyLDAsMCwwLDIsMiwwLDEsMCwyLDAsMCwyLDIsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDMsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDIsMCwyLDAsMCwwLDAsMiwKMCwxLDIsMCwwLDAsMCwyLDIsMSwwLDEsMCwxLDAsMiwyLDIsMSwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLAowLDIsMCwxLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwyLDIsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDIsCjAsMiwyLDAsMCwwLDAsMiwyLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMiwwLDAsMCwKMCwyLDIsMiwyLDAsMCwwLDMsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwxLAowLDAsMiwwLDAsMCwwLDEsMiwwLDAsMCwwLDAsMCwyLDIsMSwxLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsCjAsMiwwLDIsMiwyLDAsMCwyLDAsMCwwLDAsMCwwLDAsMiwyLDIsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMiwKMCwwLDEsMCwwLDAsMCwyLDEsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDMsMCwyLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDIsCjAsMCwyLDAsMCwwLDAsMiwyLDAsMCwwLDAsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwyLDAsMiwyLDEsMCwwLDAsMCwwLDAsMiwwLDAsMiwwLDIsMiwyLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwyLAowLDAsMiwwLDAsMiwwLDIsMiwwLDAsMCwwLDIsMCwyLDAsMCwwLDAsMCwyLDAsMCwwLDIsMCwwLDAsMCwwLDAsCjAsMCwzLDAsMCwwLDIsMiwwLDIsMiwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwyLDAsMCwwLDAsMCwKMCwyLDIsMiwyLDIsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMSwwLDAsMCwxLAowLDAsMCwwLDAsMCwwLDIsMSwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMiwyLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwKMCwyLDAsMCwwLDIsMCwwLDAsMCwwLDEsMCwwLDAsMCwyLDIsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwxLDAsMiwwLDAsMCwKMCwyLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMSwwLDAsMCwwLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDIsMCwyLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMiwxLDAsMCwwLDAsMCwwLDIsMCwwLDAsMSwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAopCgpMYXRpbjdHcmVla01vZGVsID0gewogICdjaGFyX3RvX29yZGVyX21hcCc6IExhdGluN19jaGFyX3RvX29yZGVyX21hcCwKICAncHJlY2VkZW5jZV9tYXRyaXgnOiBHcmVla0xhbmdNb2RlbCwKICAndHlwaWNhbF9wb3NpdGl2ZV9yYXRpbyc6IDAuOTgyODUxLAogICdrZWVwX2VuZ2xpc2hfbGV0dGVyJzogRmFsc2UsCiAgJ2NoYXJzZXRfbmFtZSc6ICJJU08tODg1OS03IiwKICAnbGFuZ3VhZ2UnOiAnR3JlZWsnLAp9CgpXaW4xMjUzR3JlZWtNb2RlbCA9IHsKICAnY2hhcl90b19vcmRlcl9tYXAnOiB3aW4xMjUzX2NoYXJfdG9fb3JkZXJfbWFwLAogICdwcmVjZWRlbmNlX21hdHJpeCc6IEdyZWVrTGFuZ01vZGVsLAogICd0eXBpY2FsX3Bvc2l0aXZlX3JhdGlvJzogMC45ODI4NTEsCiAgJ2tlZXBfZW5nbGlzaF9sZXR0ZXInOiBGYWxzZSwKICAnY2hhcnNldF9uYW1lJzogIndpbmRvd3MtMTI1MyIsCiAgJ2xhbmd1YWdlJzogJ0dyZWVrJywKfQpQSwMEFAAAAAAAAAAhAI9mrRhRLAAAUSwAADYAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9sYW5naGVicmV3bW9kZWwucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBNb3ppbGxhIFVuaXZlcnNhbCBjaGFyc2V0IGRldGVjdG9yIGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyAgICAgICAgICBTaW1vbiBNb250YWd1CiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAwNQojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIyAgIFNoeSBTaGFsb20gLSBvcmlnaW5hbCBDIGNvZGUKIyAgIFNob3NoYW5uYWggRm9yYmVzIC0gb3JpZ2luYWwgQyBjb2RlICg/KQojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIDI1NTogQ29udHJvbCBjaGFyYWN0ZXJzIHRoYXQgdXN1YWxseSBkb2VzIG5vdCBleGlzdCBpbiBhbnkgdGV4dAojIDI1NDogQ2FycmlhZ2UvUmV0dXJuCiMgMjUzOiBzeW1ib2wgKHB1bmN0dWF0aW9uKSB0aGF0IGRvZXMgbm90IGJlbG9uZyB0byB3b3JkCiMgMjUyOiAwIC0gOQoKIyBXaW5kb3dzLTEyNTUgbGFuZ3VhZ2UgbW9kZWwKIyBDaGFyYWN0ZXIgTWFwcGluZyBUYWJsZToKV0lOMTI1NV9DSEFSX1RPX09SREVSX01BUCA9ICgKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NCwyNTUsMjU1LDI1NCwyNTUsMjU1LCAgIyAwMAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsICAjIDEwCjI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgMjAKMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyAzMAoyNTMsIDY5LCA5MSwgNzksIDgwLCA5MiwgODksIDk3LCA5MCwgNjgsMTExLDExMiwgODIsIDczLCA5NSwgODUsICAjIDQwCiA3OCwxMjEsIDg2LCA3MSwgNjcsMTAyLDEwNywgODQsMTE0LDEwMywxMTUsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgNTAKMjUzLCA1MCwgNzQsIDYwLCA2MSwgNDIsIDc2LCA3MCwgNjQsIDUzLDEwNSwgOTMsIDU2LCA2NSwgNTQsIDQ5LCAgIyA2MAogNjYsMTEwLCA1MSwgNDMsIDQ0LCA2MywgODEsIDc3LCA5OCwgNzUsMTA4LDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDcwCjEyNCwyMDIsMjAzLDIwNCwyMDUsIDQwLCA1OCwyMDYsMjA3LDIwOCwyMDksMjEwLDIxMSwyMTIsMjEzLDIxNCwKMjE1LCA4MywgNTIsIDQ3LCA0NiwgNzIsIDMyLCA5NCwyMTYsMTEzLDIxNywxMDksMjE4LDIxOSwyMjAsMjIxLAogMzQsMTE2LDIyMiwxMTgsMTAwLDIyMywyMjQsMTE3LDExOSwxMDQsMTI1LDIyNSwyMjYsIDg3LCA5OSwyMjcsCjEwNiwxMjIsMTIzLDIyOCwgNTUsMjI5LDIzMCwxMDEsMjMxLDIzMiwxMjAsMjMzLCA0OCwgMzksIDU3LDIzNCwKIDMwLCA1OSwgNDEsIDg4LCAzMywgMzcsIDM2LCAzMSwgMjksIDM1LDIzNSwgNjIsIDI4LDIzNiwxMjYsMjM3LAoyMzgsIDM4LCA0NSwyMzksMjQwLDI0MSwyNDIsMjQzLDEyNywyNDQsMjQ1LDI0NiwyNDcsMjQ4LDI0OSwyNTAsCiAgOSwgIDgsIDIwLCAxNiwgIDMsICAyLCAyNCwgMTQsIDIyLCAgMSwgMjUsIDE1LCAgNCwgMTEsICA2LCAyMywKIDEyLCAxOSwgMTMsIDI2LCAxOCwgMjcsIDIxLCAxNywgIDcsIDEwLCAgNSwyNTEsMjUyLDEyOCwgOTYsMjUzLAopCgojIE1vZGVsIFRhYmxlOgojIHRvdGFsIHNlcXVlbmNlczogMTAwJQojIGZpcnN0IDUxMiBzZXF1ZW5jZXM6IDk4LjQwMDQlCiMgZmlyc3QgMTAyNCBzZXF1ZW5jZXM6IDEuNTk4MSUKIyByZXN0ICBzZXF1ZW5jZXM6ICAgICAgMC4wODclCiMgbmVnYXRpdmUgc2VxdWVuY2VzOiAgIDAuMDAxNSUKSEVCUkVXX0xBTkdfTU9ERUwgPSAoCjAsMywzLDMsMywzLDMsMywzLDMsMywyLDMsMywzLDMsMywzLDMsMywzLDMsMywyLDMsMiwxLDIsMCwxLDAsMCwKMywwLDMsMSwwLDAsMSwzLDIsMCwxLDEsMiwwLDIsMiwyLDEsMSwxLDEsMiwxLDEsMSwyLDAsMCwyLDIsMCwxLAozLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDIsMiwyLDIsCjEsMiwxLDIsMSwyLDAsMCwyLDAsMCwwLDAsMCwxLDAsMSwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDEsMCwKMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDIsMiwyLAoxLDIsMSwzLDEsMSwwLDAsMiwwLDAsMCwxLDAsMSwwLDEsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMSwwLDEsMiwyLDEsMywKMSwyLDEsMSwyLDIsMCwwLDIsMiwwLDAsMCwwLDEsMCwxLDAsMCwwLDEsMCwwLDAsMCwwLDAsMSwwLDEsMSwwLAozLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMiwzLDMsMiwyLDIsMiwzLDIsCjEsMiwxLDIsMiwyLDAsMCwxLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDEsMCwKMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywyLDMsMywyLDMsMiwyLDMsMiwyLDIsMSwyLDIsMiwyLAoxLDIsMSwxLDIsMiwwLDEsMiwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsCjMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMiwwLDIsMiwyLDIsMiwKMCwyLDAsMiwyLDIsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMSwwLAozLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMiwzLDAsMiwyLDIsCjAsMiwxLDIsMiwyLDAsMCwyLDEsMCwwLDAsMCwxLDAsMSwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDEsMCwKMywzLDMsMywzLDMsMywzLDMsMywzLDIsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywyLDEsMiwzLDIsMiwyLAoxLDIsMSwyLDIsMiwwLDAsMSwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMSwxLDAsCjMsMywzLDMsMywzLDMsMywzLDIsMywzLDMsMiwzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDEsMCwyLDAsMiwKMCwyLDEsMiwyLDIsMCwwLDEsMiwwLDAsMCwwLDEsMCwxLDAsMCwwLDAsMCwwLDEsMCwwLDAsMiwwLDAsMSwwLAozLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDIsMywyLDMsMiwyLDMsMiwxLDIsMSwxLDEsCjAsMSwxLDEsMSwxLDMsMCwxLDAsMCwwLDAsMiwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwKMywxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwwLDEsMSwwLDEsMSwwLDAsMSwwLDAsMSwwLDAsMCwwLAowLDAsMSwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMiwyLDIsMiwyLDIsMiwKMCwyLDAsMSwyLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLAozLDMsMywzLDMsMywzLDMsMywyLDMsMywzLDIsMSwyLDMsMywyLDMsMywzLDMsMiwzLDIsMSwyLDAsMiwxLDIsCjAsMiwwLDIsMiwyLDAsMCwxLDIsMCwwLDAsMCwxLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDEsMCwKMywzLDMsMywzLDMsMywzLDMsMiwzLDMsMywxLDIsMiwzLDMsMiwzLDIsMywyLDIsMywxLDIsMiwwLDIsMiwyLAowLDIsMSwyLDIsMiwwLDAsMSwyLDAsMCwwLDAsMSwwLDAsMCwwLDAsMSwwLDAsMSwwLDAsMCwxLDAsMCwxLDAsCjMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMiwzLDMsMywyLDMsMywyLDIsMiwzLDMsMywzLDEsMywyLDIsMiwKMCwyLDAsMSwyLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLAozLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMiwyLDMsMywzLDIsMywyLDIsMiwxLDIsMiwwLDIsMiwyLDIsCjAsMiwwLDIsMiwyLDAsMCwxLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwKMywzLDMsMywzLDMsMywzLDMsMywzLDIsMywzLDMsMSwzLDIsMywzLDIsMywzLDIsMiwxLDIsMiwyLDIsMiwyLAowLDIsMSwyLDEsMiwwLDAsMSwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMSwwLDAsMSwwLDAsMCwwLDAsMCwxLDAsCjMsMywzLDMsMywzLDIsMywyLDMsMywyLDMsMywzLDMsMiwzLDIsMywzLDMsMywzLDIsMiwyLDIsMiwyLDIsMSwKMCwyLDAsMSwyLDEsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMSwwLAozLDMsMywzLDMsMywzLDMsMywyLDEsMiwzLDMsMywzLDMsMywzLDIsMywyLDMsMiwxLDIsMywwLDIsMSwyLDIsCjAsMiwxLDEsMiwxLDAsMCwxLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDIsMCwKMywzLDMsMywzLDMsMywzLDMsMiwzLDMsMywzLDIsMSwzLDEsMiwyLDIsMSwyLDMsMywxLDIsMSwyLDIsMiwyLAowLDEsMSwxLDEsMSwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMSwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMywzLDMsMywzLDMsMCwyLDMsMywzLDEsMywzLDMsMSwyLDIsMiwyLDEsMSwyLDIsMiwyLDIsMiwKMCwyLDAsMSwxLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMSwwLAozLDMsMywzLDMsMywyLDMsMywzLDIsMiwzLDMsMywyLDEsMiwzLDIsMywyLDIsMiwyLDEsMiwxLDEsMSwyLDIsCjAsMiwxLDEsMSwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwKMywxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMCwxLDAsMCwwLDEsMCwwLDAsMCwwLAoxLDAsMSwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMSwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMywyLDMsMywyLDMsMSwyLDIsMiwyLDMsMiwzLDEsMSwyLDIsMSwyLDIsMSwxLDAsMiwyLDIsMiwKMCwxLDAsMSwyLDIsMCwwLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMSwwLAozLDAsMCwxLDEsMCwxLDAsMCwxLDEsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMiwyLDAsCjAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywwLDEsMCwxLDAsMSwxLDAsMSwxLDAsMCwwLDEsMSwwLDEsMSwxLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMCwwLDAsMSwxLDAsMSwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLAozLDIsMiwxLDIsMiwyLDIsMiwyLDIsMSwyLDIsMSwyLDIsMSwxLDEsMSwxLDEsMSwxLDIsMSwxLDAsMywzLDMsCjAsMywwLDIsMiwyLDIsMCwwLDEsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwKMiwyLDIsMywyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwxLDIsMiwxLDIsMiwyLDEsMSwxLDIsMCwxLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMiwyLDIsMiwyLDIsMiwyLDIsMiwxLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwwLDIsMiwwLDAsMCwwLDAsMCwKMCwwLDAsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDMsMSwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDEsMiwxLDAsMiwxLDAsCjAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywxLDEsMSwxLDEsMSwxLDEsMSwxLDAsMCwxLDEsMSwxLDAsMSwxLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMywxLDEsMiwyLDIsMiwyLDEsMiwyLDIsMSwxLDIsMiwyLDIsMiwyLDIsMSwyLDIsMSwwLDEsMSwxLDEsMCwKMCwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDIsMSwxLDEsMSwyLDEsMSwyLDEsMCwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMCwxLDAsMCwwLDAsMCwwLDAsCjAsMCwyLDAsMCwwLDAsMCwwLDAsMCwxLDEsMCwwLDAsMCwxLDEsMCwwLDEsMSwwLDAsMCwwLDAsMCwxLDAsMCwKMiwxLDEsMiwyLDIsMiwyLDIsMiwyLDIsMiwyLDEsMiwyLDIsMiwyLDEsMiwxLDIsMSwxLDEsMSwwLDAsMCwwLAowLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjEsMiwxLDIsMiwyLDIsMiwyLDIsMiwyLDIsMSwyLDEsMiwxLDEsMiwxLDEsMSwyLDEsMiwxLDIsMCwxLDAsMSwKMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDMsMSwyLDIsMiwxLDIsMiwyLDIsMiwyLDIsMiwxLDIsMSwxLDEsMSwxLDEsMiwxLDIsMSwxLDAsMSwwLDEsCjAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMiwxLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMiwyLAowLDIsMCwxLDIsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsCjMsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwxLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDEsMSwxLDEsMSwxLDEsMCwxLDEsMCwxLDAsMCwxLDAsMCwxLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwyLDAsMSwxLDEsMCwxLDAsMCwwLDEsMSwwLDEsMSwwLDAsMCwwLDAsMSwxLDAsMCwKMCwxLDEsMSwyLDEsMiwyLDIsMCwyLDAsMiwwLDEsMSwyLDEsMSwxLDEsMiwxLDAsMSwxLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMSwwLDEsMCwwLDAsMCwwLDEsMCwxLDIsMiwwLDEsMCwwLDEsMSwyLDIsMSwyLDAsMiwwLDAsMCwxLDIsMCwxLAoyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwyLDAsMiwxLDIsMCwyLDAsMCwxLDEsMSwxLDEsMSwwLDEsMCwwLDAsMSwwLDAsMSwKMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMSwwLDAsMCwwLDAsMSwwLDIsMSwxLDAsMSwwLDAsMSwxLDEsMiwyLDAsMCwxLDAsMCwwLDEsMCwwLDEsCjEsMSwyLDEsMCwxLDEsMSwwLDEsMCwxLDEsMSwxLDAsMCwwLDEsMCwxLDAsMCwwLDAsMCwwLDAsMCwyLDIsMSwKMCwyLDAsMSwyLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDEsMCwwLDEsMCwxLDEsMSwxLDAsMCwwLDAsMCwxLDAsMCwwLDAsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMSwxLDEsMSwxLDEsMSwxLDEsMiwxLDAsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDAsMSwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDEsMSwxLDAsMCwwLDAsMSwxLDEsMCwxLDEsMCwxLDAsMCwwLDEsMSwwLDEsCjIsMCwxLDAsMSwwLDEsMCwwLDEsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwxLDAsMSwxLDEsMCwxLDAsMCwxLDEsMiwxLDEsMiwwLDEsMCwwLDAsMSwxLDAsMSwKMSwwLDAsMSwwLDAsMSwwLDAsMCwxLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMSwwLDEsMSwyLDAsMSwwLDAsMCwwLDIsMSwxLDIsMCwyLDAsMCwwLDEsMSwwLDEsCjEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDEsMCwyLDEsMSwwLDEsMCwwLDIsMiwxLDIsMSwxLDAsMSwwLDAsMCwxLDEsMCwxLAoyLDAsMSwwLDAsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMSwyLDIsMCwwLDAsMCwwLDEsMSwwLDEsMCwwLDEsMCwwLDAsMCwxLDAsMSwKMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDEsMiwyLDAsMCwwLDAsMiwxLDEsMSwwLDIsMSwxLDAsMCwwLDIsMSwwLDEsCjEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDEsMCwxLDEsMiwwLDEsMCwwLDEsMSwwLDIsMSwxLDAsMSwwLDAsMCwxLDEsMCwxLAoyLDIsMSwxLDEsMCwxLDEsMCwxLDEsMCwxLDAsMCwwLDAsMCwwLDEsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMSwwLDIsMSwxLDAsMSwwLDAsMSwxLDAsMSwyLDEsMCwyLDAsMCwwLDEsMSwwLDEsCjIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwKMCwxLDAsMCwyLDAsMiwxLDEsMCwxLDAsMSwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMSwwLDAsMCwwLDAsMSwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjEsMCwwLDEsMCwwLDEsMCwwLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDEsMCwxLDEsMiwwLDEsMCwwLDEsMSwxLDAsMSwwLDAsMSwwLDAsMCwxLDAsMCwxLAoxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjEsMCwwLDAsMCwwLDAsMCwxLDAsMSwxLDAsMCwxLDAsMCwyLDEsMSwxLDEsMSwwLDEsMCwwLDAsMCwxLDAsMSwKMCwxLDEsMSwyLDEsMSwxLDEsMCwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwwLDEsMSwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDIsMSwwLDAsMCwwLDAsMSwxLDEsMSwxLDAsMSwwLDAsMCwxLDEsMCwwLAopCgpXaW4xMjU1SGVicmV3TW9kZWwgPSB7CiAgJ2NoYXJfdG9fb3JkZXJfbWFwJzogV0lOMTI1NV9DSEFSX1RPX09SREVSX01BUCwKICAncHJlY2VkZW5jZV9tYXRyaXgnOiBIRUJSRVdfTEFOR19NT0RFTCwKICAndHlwaWNhbF9wb3NpdGl2ZV9yYXRpbyc6IDAuOTg0MDA0LAogICdrZWVwX2VuZ2xpc2hfbGV0dGVyJzogRmFsc2UsCiAgJ2NoYXJzZXRfbmFtZSc6ICJ3aW5kb3dzLTEyNTUiLAogICdsYW5ndWFnZSc6ICdIZWJyZXcnLAp9ClBLAwQUAAAAAAAAACEAw8FVgDAxAAAwMQAAOQAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2xhbmdodW5nYXJpYW5tb2RlbC5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIE1vemlsbGEgQ29tbXVuaWNhdG9yIGNsaWVudCBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMTk5OAojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyAyNTU6IENvbnRyb2wgY2hhcmFjdGVycyB0aGF0IHVzdWFsbHkgZG9lcyBub3QgZXhpc3QgaW4gYW55IHRleHQKIyAyNTQ6IENhcnJpYWdlL1JldHVybgojIDI1Mzogc3ltYm9sIChwdW5jdHVhdGlvbikgdGhhdCBkb2VzIG5vdCBiZWxvbmcgdG8gd29yZAojIDI1MjogMCAtIDkKCiMgQ2hhcmFjdGVyIE1hcHBpbmcgVGFibGU6CkxhdGluMl9IdW5nYXJpYW5DaGFyVG9PcmRlck1hcCA9ICgKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NCwyNTUsMjU1LDI1NCwyNTUsMjU1LCAgIyAwMAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsICAjIDEwCjI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgMjAKMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyAzMAoyNTMsIDI4LCA0MCwgNTQsIDQ1LCAzMiwgNTAsIDQ5LCAzOCwgMzksIDUzLCAzNiwgNDEsIDM0LCAzNSwgNDcsCiA0NiwgNzEsIDQzLCAzMywgMzcsIDU3LCA0OCwgNjQsIDY4LCA1NSwgNTIsMjUzLDI1MywyNTMsMjUzLDI1MywKMjUzLCAgMiwgMTgsIDI2LCAxNywgIDEsIDI3LCAxMiwgMjAsICA5LCAyMiwgIDcsICA2LCAxMywgIDQsICA4LAogMjMsIDY3LCAxMCwgIDUsICAzLCAyMSwgMTksIDY1LCA2MiwgMTYsIDExLDI1MywyNTMsMjUzLDI1MywyNTMsCjE1OSwxNjAsMTYxLDE2MiwxNjMsMTY0LDE2NSwxNjYsMTY3LDE2OCwxNjksMTcwLDE3MSwxNzIsMTczLDE3NCwKMTc1LDE3NiwxNzcsMTc4LDE3OSwxODAsMTgxLDE4MiwxODMsMTg0LDE4NSwxODYsMTg3LDE4OCwxODksMTkwLAoxOTEsMTkyLDE5MywxOTQsMTk1LDE5NiwxOTcsIDc1LDE5OCwxOTksMjAwLDIwMSwyMDIsMjAzLDIwNCwyMDUsCiA3OSwyMDYsMjA3LDIwOCwyMDksMjEwLDIxMSwyMTIsMjEzLDIxNCwyMTUsMjE2LDIxNywyMTgsMjE5LDIyMCwKMjIxLCA1MSwgODEsMjIyLCA3OCwyMjMsMjI0LDIyNSwyMjYsIDQ0LDIyNywyMjgsMjI5LCA2MSwyMzAsMjMxLAoyMzIsMjMzLDIzNCwgNTgsMjM1LCA2NiwgNTksMjM2LDIzNywyMzgsIDYwLCA2OSwgNjMsMjM5LDI0MCwyNDEsCiA4MiwgMTQsIDc0LDI0MiwgNzAsIDgwLDI0MywgNzIsMjQ0LCAxNSwgODMsIDc3LCA4NCwgMzAsIDc2LCA4NSwKMjQ1LDI0NiwyNDcsIDI1LCA3MywgNDIsIDI0LDI0OCwyNDksMjUwLCAzMSwgNTYsIDI5LDI1MSwyNTIsMjUzLAopCgp3aW4xMjUwSHVuZ2FyaWFuQ2hhclRvT3JkZXJNYXAgPSAoCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTQsMjU1LDI1NSwyNTQsMjU1LDI1NSwgICMgMDAKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LCAgIyAxMAoyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDIwCjI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgMzAKMjUzLCAyOCwgNDAsIDU0LCA0NSwgMzIsIDUwLCA0OSwgMzgsIDM5LCA1MywgMzYsIDQxLCAzNCwgMzUsIDQ3LAogNDYsIDcyLCA0MywgMzMsIDM3LCA1NywgNDgsIDY0LCA2OCwgNTUsIDUyLDI1MywyNTMsMjUzLDI1MywyNTMsCjI1MywgIDIsIDE4LCAyNiwgMTcsICAxLCAyNywgMTIsIDIwLCAgOSwgMjIsICA3LCAgNiwgMTMsICA0LCAgOCwKIDIzLCA2NywgMTAsICA1LCAgMywgMjEsIDE5LCA2NSwgNjIsIDE2LCAxMSwyNTMsMjUzLDI1MywyNTMsMjUzLAoxNjEsMTYyLDE2MywxNjQsMTY1LDE2NiwxNjcsMTY4LDE2OSwxNzAsMTcxLDE3MiwxNzMsMTc0LDE3NSwxNzYsCjE3NywxNzgsMTc5LDE4MCwgNzgsMTgxLCA2OSwxODIsMTgzLDE4NCwxODUsMTg2LDE4NywxODgsMTg5LDE5MCwKMTkxLDE5MiwxOTMsMTk0LDE5NSwxOTYsMTk3LCA3NiwxOTgsMTk5LDIwMCwyMDEsMjAyLDIwMywyMDQsMjA1LAogODEsMjA2LDIwNywyMDgsMjA5LDIxMCwyMTEsMjEyLDIxMywyMTQsMjE1LDIxNiwyMTcsMjE4LDIxOSwyMjAsCjIyMSwgNTEsIDgzLDIyMiwgODAsMjIzLDIyNCwyMjUsMjI2LCA0NCwyMjcsMjI4LDIyOSwgNjEsMjMwLDIzMSwKMjMyLDIzMywyMzQsIDU4LDIzNSwgNjYsIDU5LDIzNiwyMzcsMjM4LCA2MCwgNzAsIDYzLDIzOSwyNDAsMjQxLAogODQsIDE0LCA3NSwyNDIsIDcxLCA4MiwyNDMsIDczLDI0NCwgMTUsIDg1LCA3OSwgODYsIDMwLCA3NywgODcsCjI0NSwyNDYsMjQ3LCAyNSwgNzQsIDQyLCAyNCwyNDgsMjQ5LDI1MCwgMzEsIDU2LCAyOSwyNTEsMjUyLDI1MywKKQoKIyBNb2RlbCBUYWJsZToKIyB0b3RhbCBzZXF1ZW5jZXM6IDEwMCUKIyBmaXJzdCA1MTIgc2VxdWVuY2VzOiA5NC43MzY4JQojIGZpcnN0IDEwMjQgc2VxdWVuY2VzOjUuMjYyMyUKIyByZXN0ICBzZXF1ZW5jZXM6ICAgICAwLjg4OTQlCiMgbmVnYXRpdmUgc2VxdWVuY2VzOiAgMC4wMDA5JQpIdW5nYXJpYW5MYW5nTW9kZWwgPSAoCjAsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMSwzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywKMywzLDMsMywzLDMsMywzLDMsMywyLDMsMywzLDMsMywzLDMsMywyLDIsMywzLDEsMSwyLDIsMiwyLDIsMSwyLAozLDIsMiwzLDMsMywzLDMsMiwzLDMsMywzLDMsMywxLDIsMywzLDMsMywyLDMsMywxLDEsMywzLDAsMSwxLDEsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwKMywyLDEsMywzLDMsMywzLDIsMywzLDMsMywzLDEsMSwyLDMsMywzLDMsMywzLDMsMSwxLDMsMiwwLDEsMSwxLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsCjMsMywzLDMsMywzLDMsMywzLDMsMywxLDEsMiwzLDMsMywxLDMsMywzLDMsMywxLDMsMywyLDIsMCwzLDIsMywKMCwwLDAsMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDMsMywyLDMsMywzLDIsMywzLDIsMywzLDMsMywzLDIsMywzLDIsMiwzLDIsMywyLDAsMywyLDIsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDEsMCwKMywzLDMsMywzLDMsMiwzLDMsMywzLDMsMiwzLDMsMywxLDIsMywyLDIsMywxLDIsMywzLDIsMiwwLDMsMywzLAowLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMywzLDMsMywzLDMsMiwyLDMsMywzLDMsMywzLDIsMywzLDMsMywyLDMsMywzLDMsMCwyLDMsMiwKMCwwLDAsMSwxLDAsMCwwLDAsMCwzLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDMsMywzLDMsMywzLDMsMSwxLDEsMywzLDIsMSwzLDIsMiwzLDIsMSwzLDIsMiwxLDAsMywzLDEsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwKMywyLDIsMywzLDMsMywzLDEsMiwzLDMsMywzLDEsMiwxLDMsMywzLDMsMiwyLDMsMSwxLDMsMiwwLDEsMSwxLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsCjMsMywzLDMsMywzLDMsMywyLDIsMywzLDMsMywzLDIsMSwzLDMsMywzLDMsMiwyLDEsMywzLDMsMCwxLDEsMiwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMSwwLAozLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDIsMywzLDMsMiwzLDMsMiwzLDMsMywyLDAsMywyLDMsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDEsMCwKMywzLDMsMywzLDMsMiwzLDMsMywyLDMsMiwzLDMsMywxLDMsMiwyLDIsMywxLDEsMywzLDEsMSwwLDMsMywyLAowLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMywzLDMsMiwzLDMsMywyLDMsMiwzLDMsMywyLDMsMywzLDMsMywxLDIsMywyLDIsMCwyLDIsMiwKMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLAozLDMsMywyLDIsMiwzLDEsMywzLDIsMiwxLDMsMywzLDEsMSwzLDEsMiwzLDIsMywyLDIsMiwxLDAsMiwyLDIsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwKMywxLDEsMywzLDMsMywzLDEsMiwzLDMsMywzLDEsMiwxLDMsMywzLDIsMiwzLDIsMSwwLDMsMiwwLDEsMSwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMSwxLDMsMywzLDMsMywxLDIsMywzLDMsMywxLDEsMCwzLDMsMywzLDAsMiwzLDAsMCwyLDEsMCwxLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDMsMywyLDIsMywzLDIsMiwyLDIsMywzLDAsMSwyLDMsMiwzLDIsMiwzLDIsMSwyLDAsMiwyLDIsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywzLDMsMSwyLDMsMywzLDIsMSwyLDMsMywyLDIsMiwzLDIsMywzLDEsMywzLDEsMSwwLDIsMywyLAowLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsCjMsMywzLDEsMiwyLDIsMiwzLDMsMywxLDEsMSwzLDMsMSwxLDMsMSwxLDMsMiwxLDIsMywxLDEsMCwyLDIsMiwKMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLAozLDMsMywyLDEsMiwxLDEsMywzLDEsMSwxLDEsMywzLDEsMSwyLDIsMSwyLDEsMSwyLDIsMSwxLDAsMiwyLDEsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwKMywzLDMsMSwxLDIsMSwxLDMsMywxLDAsMSwxLDMsMywyLDAsMSwxLDIsMywxLDAsMiwyLDEsMCwwLDEsMywyLAowLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsCjMsMiwxLDMsMywzLDMsMywxLDIsMywyLDMsMywyLDEsMSwzLDIsMywyLDEsMiwyLDAsMSwyLDEsMCwwLDEsMSwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLAozLDMsMywzLDIsMiwyLDIsMywxLDIsMiwxLDEsMywzLDAsMywyLDEsMiwzLDIsMSwzLDMsMSwxLDAsMiwxLDMsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwKMywzLDMsMiwyLDIsMywyLDMsMywzLDIsMSwxLDMsMywxLDEsMSwyLDIsMywyLDMsMiwyLDIsMSwwLDIsMiwxLAowLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsCjEsMCwwLDMsMywzLDMsMywwLDAsMywzLDIsMywwLDAsMCwyLDMsMywxLDAsMSwyLDAsMCwxLDEsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDEsMiwzLDMsMywzLDMsMSwyLDMsMywyLDIsMSwxLDAsMywzLDIsMiwxLDIsMiwxLDAsMiwyLDAsMSwxLDEsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDIsMiwxLDMsMSwyLDMsMywyLDIsMSwxLDIsMiwxLDEsMSwxLDMsMiwxLDEsMSwxLDIsMSwwLDEsMiwxLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMywzLDEsMSwxLDEsMSwzLDMsMywwLDEsMSwzLDMsMSwxLDEsMSwxLDIsMiwwLDMsMSwxLDIsMCwyLDEsMSwKMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLAozLDEsMCwxLDIsMSwyLDIsMCwxLDIsMywxLDIsMCwwLDAsMiwxLDEsMSwxLDEsMiwwLDAsMSwxLDAsMCwwLDAsCjEsMiwxLDIsMiwyLDEsMiwxLDIsMCwyLDAsMiwyLDEsMSwyLDEsMSwyLDEsMSwxLDAsMSwwLDAsMCwxLDEsMCwKMSwxLDEsMiwzLDIsMywzLDAsMSwyLDIsMywxLDAsMSwwLDIsMSwyLDIsMCwxLDEsMCwwLDEsMSwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjEsMCwwLDMsMywyLDIsMSwwLDAsMywyLDMsMiwwLDAsMCwxLDEsMywwLDAsMSwxLDAsMCwyLDEsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDEsMSwyLDIsMywzLDEsMCwxLDMsMiwzLDEsMSwxLDAsMSwxLDEsMSwxLDMsMSwwLDAsMiwyLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywxLDEsMSwyLDIsMiwxLDAsMSwyLDMsMywyLDAsMCwwLDIsMSwxLDEsMiwxLDEsMSwwLDEsMSwxLDAsMCwwLAoxLDIsMiwyLDIsMiwxLDEsMSwyLDAsMiwxLDEsMSwxLDEsMiwxLDEsMSwxLDEsMSwwLDEsMSwxLDAsMCwxLDEsCjMsMiwyLDEsMCwwLDEsMSwyLDIsMCwzLDAsMSwyLDEsMSwwLDAsMSwxLDEsMCwxLDEsMSwxLDAsMiwxLDEsMSwKMiwyLDEsMSwxLDIsMSwyLDEsMSwxLDEsMSwxLDEsMiwxLDEsMSwyLDMsMSwxLDEsMSwxLDEsMSwxLDEsMCwxLAoyLDMsMywwLDEsMCwwLDAsMywzLDEsMCwwLDEsMiwyLDEsMCwwLDAsMCwyLDAsMCwxLDEsMSwwLDIsMSwxLDEsCjIsMSwxLDEsMSwxLDEsMiwxLDEsMCwxLDEsMCwxLDEsMSwwLDEsMiwxLDEsMCwxLDEsMSwxLDEsMSwxLDAsMSwKMiwzLDMsMCwxLDAsMCwwLDIsMiwwLDAsMCwwLDEsMiwyLDAsMCwwLDAsMSwwLDAsMSwxLDAsMCwyLDAsMSwwLAoyLDEsMSwxLDEsMiwxLDEsMSwxLDEsMSwxLDIsMSwxLDEsMSwxLDEsMSwxLDEsMiwwLDEsMSwxLDEsMSwwLDEsCjMsMiwyLDAsMSwwLDEsMCwyLDMsMiwwLDAsMSwyLDIsMSwwLDAsMSwxLDEsMCwwLDIsMSwwLDEsMiwyLDEsMSwKMiwxLDEsMSwxLDEsMSwyLDEsMSwxLDEsMSwxLDAsMiwxLDAsMSwxLDAsMSwxLDEsMCwxLDEsMiwxLDEsMCwxLAoyLDIsMiwwLDAsMSwwLDAsMiwyLDEsMSwwLDAsMiwxLDEsMCwwLDAsMSwyLDAsMCwyLDEsMCwwLDIsMSwxLDEsCjIsMSwxLDEsMSwyLDEsMiwxLDEsMSwyLDIsMSwxLDIsMSwxLDEsMiwxLDEsMSwxLDEsMSwxLDEsMSwxLDAsMSwKMSwyLDMsMCwwLDAsMSwwLDMsMiwxLDAsMCwxLDIsMSwxLDAsMCwwLDAsMiwxLDAsMSwxLDAsMCwyLDEsMiwxLAoxLDEsMCwwLDAsMSwwLDEsMSwxLDEsMSwyLDAsMCwxLDAsMCwwLDIsMCwwLDEsMSwxLDEsMSwxLDEsMSwwLDEsCjMsMCwwLDIsMSwyLDIsMSwwLDAsMiwxLDIsMiwwLDAsMCwyLDEsMSwxLDAsMSwxLDAsMCwxLDEsMiwwLDAsMCwKMSwyLDEsMiwyLDEsMSwyLDEsMiwwLDEsMSwxLDEsMSwxLDEsMSwxLDIsMSwxLDAsMCwxLDEsMSwxLDAsMCwxLAoxLDMsMiwwLDAsMCwxLDAsMiwyLDIsMCwwLDAsMiwyLDEsMCwwLDAsMCwzLDEsMSwxLDEsMCwwLDIsMSwxLDEsCjIsMSwwLDEsMSwxLDAsMSwxLDEsMSwxLDEsMSwwLDIsMSwwLDAsMSwwLDEsMSwwLDEsMSwxLDEsMSwxLDAsMSwKMiwzLDIsMCwwLDAsMSwwLDIsMiwwLDAsMCwwLDIsMSwxLDAsMCwwLDAsMiwxLDAsMSwxLDAsMCwyLDEsMSwwLAoyLDEsMSwxLDEsMiwxLDIsMSwyLDAsMSwxLDEsMCwyLDEsMSwxLDIsMSwxLDEsMSwwLDEsMSwxLDEsMSwwLDEsCjMsMSwxLDIsMiwyLDMsMiwxLDEsMiwyLDEsMSwwLDEsMCwyLDIsMSwxLDEsMSwxLDAsMCwxLDEsMCwxLDEsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDIsMiwwLDAsMCwwLDAsMiwyLDAsMCwwLDAsMiwyLDEsMCwwLDAsMSwxLDAsMCwxLDIsMCwwLDIsMSwxLDEsCjIsMiwxLDEsMSwyLDEsMiwxLDEsMCwxLDEsMSwxLDIsMSwxLDEsMiwxLDEsMSwxLDAsMSwyLDEsMSwxLDAsMSwKMSwwLDAsMSwyLDMsMiwxLDAsMCwyLDAsMSwxLDAsMCwwLDEsMSwxLDEsMCwxLDEsMCwwLDEsMCwwLDAsMCwwLAoxLDIsMSwyLDEsMiwxLDEsMSwyLDAsMiwxLDEsMSwwLDEsMiwwLDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMywyLDAsMCwwLDAsMCwxLDEsMiwxLDAsMCwxLDEsMSwwLDAsMCwwLDIsMCwwLDEsMSwwLDAsMiwxLDEsMSwKMiwxLDEsMSwxLDEsMSwyLDEsMCwxLDEsMSwxLDAsMiwxLDEsMSwxLDEsMSwwLDEsMCwxLDEsMSwxLDEsMCwxLAoxLDIsMiwwLDEsMSwxLDAsMiwyLDIsMCwwLDAsMywyLDEsMCwwLDAsMSwxLDAsMCwxLDEsMCwxLDEsMSwwLDAsCjEsMSwwLDEsMSwxLDEsMSwxLDEsMSwyLDEsMSwxLDEsMSwxLDEsMiwxLDEsMSwwLDAsMSwxLDEsMCwxLDAsMSwKMiwxLDAsMiwxLDEsMiwyLDEsMSwyLDEsMSwxLDAsMCwwLDEsMSwwLDEsMSwxLDEsMCwwLDEsMSwxLDAsMCwwLAoxLDIsMiwyLDIsMiwxLDEsMSwyLDAsMiwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwwLDEsMSwwLDAsMCwxLDAsCjEsMiwzLDAsMCwwLDEsMCwyLDIsMCwwLDAsMCwyLDIsMCwwLDAsMCwwLDEsMCwwLDEsMCwwLDAsMiwwLDEsMCwKMiwxLDEsMSwxLDEsMCwyLDAsMCwwLDEsMiwxLDEsMSwxLDAsMSwyLDAsMSwwLDEsMCwxLDEsMSwwLDEsMCwxLAoyLDIsMiwwLDAsMCwxLDAsMiwxLDIsMCwwLDAsMSwxLDIsMCwwLDAsMCwxLDAsMCwxLDEsMCwwLDIsMSwwLDEsCjIsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwxLDEsMSwyLDAsMSwxLDEsMSwxLDAsMSwKMSwyLDIsMCwwLDAsMSwwLDIsMiwyLDAsMCwwLDEsMSwwLDAsMCwwLDAsMSwxLDAsMiwwLDAsMSwxLDEsMCwxLAoxLDAsMSwxLDEsMSwxLDEsMCwxLDEsMSwxLDAsMCwxLDAsMCwxLDEsMCwxLDAsMSwxLDEsMSwxLDAsMCwwLDEsCjEsMCwwLDEsMCwxLDIsMSwwLDAsMSwxLDEsMiwwLDAsMCwxLDEsMCwxLDAsMSwxLDAsMCwxLDAsMCwwLDAsMCwKMCwyLDEsMiwxLDEsMSwxLDEsMiwwLDIsMCwxLDEsMCwxLDIsMSwwLDEsMSwxLDAsMCwwLDAsMCwwLDEsMCwwLAoyLDEsMSwwLDEsMiwwLDAsMSwxLDEsMCwwLDAsMSwxLDAsMCwwLDAsMCwxLDAsMCwxLDAsMCwwLDIsMSwwLDEsCjIsMiwxLDEsMSwxLDEsMiwxLDEsMCwxLDEsMSwxLDIsMSwxLDEsMiwxLDEsMCwxLDAsMSwxLDEsMSwxLDAsMSwKMSwyLDIsMCwwLDAsMCwwLDEsMSwwLDAsMCwwLDIsMSwwLDAsMCwwLDAsMiwwLDAsMiwyLDAsMCwyLDAsMCwxLAoyLDEsMSwxLDEsMSwxLDEsMCwxLDEsMCwxLDEsMCwxLDAsMCwwLDEsMSwxLDEsMCwwLDEsMSwxLDEsMCwwLDEsCjEsMSwyLDAsMCwzLDEsMCwyLDEsMSwxLDAsMCwxLDEsMSwwLDAsMCwxLDEsMCwwLDAsMSwwLDAsMSwwLDEsMCwKMSwyLDEsMCwxLDEsMSwyLDEsMSwwLDEsMSwxLDEsMSwwLDAsMCwxLDEsMSwxLDEsMCwxLDAsMCwwLDEsMCwwLAoyLDEsMSwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMSwwLDEsMCwwLDAsMSwwLDAsMCwwLDIsMCwwLDAsCjIsMSwxLDEsMSwxLDEsMSwxLDEsMCwxLDEsMSwxLDEsMSwxLDEsMSwyLDEsMSwwLDAsMSwxLDEsMSwxLDAsMSwKMiwxLDEsMSwyLDEsMSwxLDAsMSwxLDIsMSwwLDAsMCwwLDEsMSwxLDEsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjEsMSwwLDEsMSwxLDEsMSwwLDAsMSwxLDIsMSwwLDAsMCwxLDEsMCwwLDAsMSwxLDAsMCwxLDAsMSwwLDAsMCwKMSwyLDEsMSwxLDEsMSwxLDEsMSwwLDEsMCwxLDEsMSwxLDEsMSwwLDEsMSwxLDAsMCwwLDAsMCwwLDEsMCwwLAoyLDAsMCwwLDEsMSwxLDEsMCwwLDEsMSwwLDAsMCwwLDAsMSwxLDEsMiwwLDAsMSwwLDAsMSwwLDEsMCwwLDAsCjAsMSwxLDEsMSwxLDEsMSwxLDIsMCwxLDEsMSwxLDAsMSwxLDEsMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwKMSwwLDAsMSwxLDEsMSwxLDAsMCwyLDEsMCwxLDAsMCwwLDEsMCwxLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLAowLDEsMSwxLDEsMSwxLDAsMSwxLDAsMSwwLDEsMSwwLDEsMSwwLDAsMSwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsCjEsMCwwLDEsMSwxLDAsMCwwLDAsMSwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwKMCwxLDEsMSwxLDEsMCwwLDEsMSwwLDEsMCwxLDAsMCwxLDEsMSwwLDEsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwxLDAsMCwwLDAsMCwwLDEsMSwyLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMSwxLDEsMCwxLDAsMCwxLDEsMCwxLDAsMSwxLDAsMSwxLDEsMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwKMiwxLDEsMSwxLDEsMSwxLDEsMSwxLDAsMCwxLDEsMSwwLDAsMSwwLDAsMSwwLDEsMCwxLDEsMSwwLDAsMSwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjEsMCwwLDEsMSwxLDEsMCwwLDAsMSwxLDEsMCwwLDAsMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwxLDEsMSwxLDEsMSwwLDEsMSwwLDEsMCwxLDAsMCwxLDEsMCwwLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLAopCgpMYXRpbjJIdW5nYXJpYW5Nb2RlbCA9IHsKICAnY2hhcl90b19vcmRlcl9tYXAnOiBMYXRpbjJfSHVuZ2FyaWFuQ2hhclRvT3JkZXJNYXAsCiAgJ3ByZWNlZGVuY2VfbWF0cml4JzogSHVuZ2FyaWFuTGFuZ01vZGVsLAogICd0eXBpY2FsX3Bvc2l0aXZlX3JhdGlvJzogMC45NDczNjgsCiAgJ2tlZXBfZW5nbGlzaF9sZXR0ZXInOiBUcnVlLAogICdjaGFyc2V0X25hbWUnOiAiSVNPLTg4NTktMiIsCiAgJ2xhbmd1YWdlJzogJ0h1bmdhcmlhbicsCn0KCldpbjEyNTBIdW5nYXJpYW5Nb2RlbCA9IHsKICAnY2hhcl90b19vcmRlcl9tYXAnOiB3aW4xMjUwSHVuZ2FyaWFuQ2hhclRvT3JkZXJNYXAsCiAgJ3ByZWNlZGVuY2VfbWF0cml4JzogSHVuZ2FyaWFuTGFuZ01vZGVsLAogICd0eXBpY2FsX3Bvc2l0aXZlX3JhdGlvJzogMC45NDczNjgsCiAgJ2tlZXBfZW5nbGlzaF9sZXR0ZXInOiBUcnVlLAogICdjaGFyc2V0X25hbWUnOiAid2luZG93cy0xMjUwIiwKICAnbGFuZ3VhZ2UnOiAnSHVuZ2FyaWFuJywKfQpQSwMEFAAAAAAAAAAhACIP0j8aLAAAGiwAADQAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9sYW5ndGhhaW1vZGVsLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBDb21tdW5pY2F0b3IgY2xpZW50IGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAxOTk4CiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIDI1NTogQ29udHJvbCBjaGFyYWN0ZXJzIHRoYXQgdXN1YWxseSBkb2VzIG5vdCBleGlzdCBpbiBhbnkgdGV4dAojIDI1NDogQ2FycmlhZ2UvUmV0dXJuCiMgMjUzOiBzeW1ib2wgKHB1bmN0dWF0aW9uKSB0aGF0IGRvZXMgbm90IGJlbG9uZyB0byB3b3JkCiMgMjUyOiAwIC0gOQoKIyBUaGUgZm9sbG93aW5nIHJlc3VsdCBmb3IgdGhhaSB3YXMgY29sbGVjdGVkIGZyb20gYSBsaW1pdGVkIHNhbXBsZSAoMU0pLgoKIyBDaGFyYWN0ZXIgTWFwcGluZyBUYWJsZToKVElTNjIwQ2hhclRvT3JkZXJNYXAgPSAoCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTQsMjU1LDI1NSwyNTQsMjU1LDI1NSwgICMgMDAKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LCAgIyAxMAoyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDIwCjI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTIsMjUyLDI1MiwyNTMsMjUzLDI1MywyNTMsMjUzLDI1MywgICMgMzAKMjUzLDE4MiwxMDYsMTA3LDEwMCwxODMsMTg0LDE4NSwxMDEsIDk0LDE4NiwxODcsMTA4LDEwOSwxMTAsMTExLCAgIyA0MAoxODgsMTg5LDE5MCwgODksIDk1LDExMiwxMTMsMTkxLDE5MiwxOTMsMTk0LDI1MywyNTMsMjUzLDI1MywyNTMsICAjIDUwCjI1MywgNjQsIDcyLCA3MywxMTQsIDc0LDExNSwxMTYsMTAyLCA4MSwyMDEsMTE3LCA5MCwxMDMsIDc4LCA4MiwgICMgNjAKIDk2LDIwMiwgOTEsIDc5LCA4NCwxMDQsMTA1LCA5NywgOTgsIDkyLDIwMywyNTMsMjUzLDI1MywyNTMsMjUzLCAgIyA3MAoyMDksMjEwLDIxMSwyMTIsMjEzLCA4OCwyMTQsMjE1LDIxNiwyMTcsMjE4LDIxOSwyMjAsMTE4LDIyMSwyMjIsCjIyMywyMjQsIDk5LCA4NSwgODMsMjI1LDIyNiwyMjcsMjI4LDIyOSwyMzAsMjMxLDIzMiwyMzMsMjM0LDIzNSwKMjM2LCAgNSwgMzAsMjM3LCAyNCwyMzgsIDc1LCAgOCwgMjYsIDUyLCAzNCwgNTEsMTE5LCA0NywgNTgsIDU3LAogNDksIDUzLCA1NSwgNDMsIDIwLCAxOSwgNDQsIDE0LCA0OCwgIDMsIDE3LCAyNSwgMzksIDYyLCAzMSwgNTQsCiA0NSwgIDksIDE2LCAgMiwgNjEsIDE1LDIzOSwgMTIsIDQyLCA0NiwgMTgsIDIxLCA3NiwgIDQsIDY2LCA2MywKIDIyLCAxMCwgIDEsIDM2LCAyMywgMTMsIDQwLCAyNywgMzIsIDM1LCA4NiwyNDAsMjQxLDI0MiwyNDMsMjQ0LAogMTEsIDI4LCA0MSwgMjksIDMzLDI0NSwgNTAsIDM3LCAgNiwgIDcsIDY3LCA3NywgMzgsIDkzLDI0NiwyNDcsCiA2OCwgNTYsIDU5LCA2NSwgNjksIDYwLCA3MCwgODAsIDcxLCA4NywyNDgsMjQ5LDI1MCwyNTEsMjUyLDI1MywKKQoKIyBNb2RlbCBUYWJsZToKIyB0b3RhbCBzZXF1ZW5jZXM6IDEwMCUKIyBmaXJzdCA1MTIgc2VxdWVuY2VzOiA5Mi42Mzg2JQojIGZpcnN0IDEwMjQgc2VxdWVuY2VzOjcuMzE3NyUKIyByZXN0ICBzZXF1ZW5jZXM6ICAgICAxLjAyMzAlCiMgbmVnYXRpdmUgc2VxdWVuY2VzOiAgMC4wNDM2JQpUaGFpTGFuZ01vZGVsID0gKAowLDEsMywzLDMsMywwLDAsMywzLDAsMywzLDAsMywzLDMsMywzLDMsMywzLDAsMCwzLDMsMywwLDMsMywzLDMsCjAsMywzLDAsMCwwLDEsMywwLDMsMywyLDMsMywwLDEsMiwzLDMsMywzLDAsMiwwLDIsMCwwLDMsMiwxLDIsMiwKMywwLDMsMywyLDMsMCwwLDMsMywwLDMsMywwLDMsMywzLDMsMywzLDMsMywzLDAsMywyLDMsMCwyLDIsMiwzLAowLDIsMywwLDAsMCwwLDEsMCwxLDIsMywxLDEsMywyLDIsMCwxLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwxLDEsCjMsMywzLDIsMywzLDMsMywzLDMsMywzLDMsMywzLDIsMiwyLDIsMiwyLDIsMywzLDIsMywyLDMsMywyLDIsMiwKMywxLDIsMywwLDMsMywyLDIsMSwyLDMsMywxLDIsMCwxLDMsMCwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMSwxLAozLDMsMiwyLDMsMywzLDMsMSwyLDMsMywzLDMsMywyLDIsMiwyLDMsMywyLDIsMywzLDIsMiwzLDIsMywyLDIsCjMsMywxLDIsMywxLDIsMiwzLDMsMSwwLDIsMSwwLDAsMywxLDIsMSwwLDAsMSwwLDAsMCwwLDAsMCwxLDAsMSwKMywzLDMsMywzLDMsMiwyLDMsMywzLDMsMiwzLDIsMiwzLDMsMiwyLDMsMiwyLDIsMiwxLDEsMywxLDIsMSwxLAozLDIsMSwwLDIsMSwwLDEsMCwxLDEsMCwxLDEsMCwwLDEsMCwxLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDIsMywyLDMsMywyLDIsMywyLDMsMywyLDMsMSwxLDIsMywyLDIsMiwzLDIsMiwyLDIsMiwxLDIsMSwKMiwyLDEsMSwzLDMsMiwxLDAsMSwyLDIsMCwxLDMsMCwwLDAsMSwxLDAsMCwwLDAsMCwyLDMsMCwwLDIsMSwxLAozLDMsMiwzLDMsMiwwLDAsMywzLDAsMywzLDAsMiwyLDMsMSwyLDIsMSwxLDEsMCwyLDIsMiwwLDIsMiwxLDEsCjAsMiwxLDAsMiwwLDAsMiwwLDEsMCwwLDEsMCwwLDAsMSwxLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwKMywzLDIsMywzLDIsMCwwLDMsMywwLDIsMywwLDIsMSwyLDIsMiwyLDEsMiwwLDAsMiwyLDIsMCwyLDIsMSwxLAowLDIsMSwwLDIsMCwwLDIsMCwxLDEsMCwxLDAsMCwwLDAsMCwwLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywyLDMsMiwzLDIsMCwyLDIsMSwzLDIsMSwzLDIsMSwyLDMsMiwyLDMsMCwyLDMsMiwyLDEsMiwyLDIsMiwKMSwyLDIsMCwwLDAsMCwyLDAsMSwyLDAsMSwxLDEsMCwxLDAsMywxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLAozLDMsMiwzLDMsMiwzLDIsMiwyLDMsMiwyLDMsMiwyLDEsMiwzLDIsMiwzLDEsMywyLDIsMiwzLDIsMiwyLDMsCjMsMiwxLDMsMCwxLDEsMSwwLDIsMSwxLDEsMSwxLDAsMSwwLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwKMSwwLDAsMywwLDMsMywzLDMsMywwLDAsMywwLDIsMiwzLDMsMywzLDMsMCwwLDAsMSwxLDMsMCwwLDAsMCwyLAowLDAsMSwwLDAsMCwwLDAsMCwwLDIsMywwLDAsMCwzLDAsMiwwLDAsMCwwLDAsMywwLDAsMCwwLDAsMCwwLDAsCjIsMCwzLDMsMywzLDAsMCwyLDMsMCwwLDMsMCwzLDMsMiwzLDMsMywzLDMsMCwwLDMsMywzLDAsMCwwLDMsMywKMCwwLDMsMCwwLDAsMCwyLDAsMCwyLDEsMSwzLDAsMCwxLDAsMCwyLDMsMCwxLDAsMCwwLDAsMCwwLDAsMSwwLAozLDMsMywzLDIsMywzLDMsMywzLDMsMywxLDIsMSwzLDMsMiwyLDEsMiwyLDIsMywxLDEsMiwwLDIsMSwyLDEsCjIsMiwxLDAsMCwwLDEsMSwwLDEsMCwxLDEsMCwwLDAsMCwwLDEsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwKMywwLDIsMSwyLDMsMywzLDAsMiwwLDIsMiwwLDIsMSwzLDIsMiwxLDIsMSwwLDAsMiwyLDEsMCwyLDEsMiwyLAowLDEsMSwwLDAsMCwwLDEsMCwxLDEsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMiwxLDMsMywxLDEsMywwLDIsMywxLDEsMywyLDEsMSwyLDAsMiwyLDMsMiwxLDEsMSwxLDEsMiwKMywwLDAsMSwzLDEsMiwxLDIsMCwzLDAsMCwwLDEsMCwzLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLAozLDMsMSwxLDMsMiwzLDMsMywxLDMsMiwxLDMsMiwxLDMsMiwyLDIsMiwxLDMsMywxLDIsMSwzLDEsMiwzLDAsCjIsMSwxLDMsMiwyLDIsMSwyLDEsMCwwLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwKMywzLDIsMywyLDMsMywyLDMsMiwzLDIsMywzLDIsMSwwLDMsMiwyLDIsMSwyLDIsMiwxLDIsMiwxLDIsMSwxLAoyLDIsMiwzLDAsMSwzLDEsMSwxLDEsMCwxLDEsMCwyLDEsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMiwzLDIsMiwxLDEsMywyLDMsMiwzLDIsMCwzLDIsMiwxLDIsMCwyLDIsMiwxLDIsMiwyLDIsMSwKMywyLDEsMiwyLDEsMCwyLDAsMSwwLDAsMSwxLDAsMCwwLDAsMCwxLDEsMCwxLDAsMCwwLDAsMCwwLDAsMCwxLAozLDMsMywzLDMsMiwzLDEsMiwzLDMsMiwyLDMsMCwxLDEsMiwwLDMsMywyLDIsMywwLDEsMSwzLDAsMCwwLDAsCjMsMSwwLDMsMywwLDIsMCwyLDEsMCwwLDMsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMiwzLDIsMywzLDAsMSwzLDEsMSwyLDEsMiwxLDEsMywxLDEsMCwyLDMsMSwxLDEsMSwxLDEsMSwxLAozLDEsMSwyLDIsMiwyLDEsMSwxLDAsMCwyLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjMsMiwyLDEsMSwyLDEsMywzLDIsMywyLDIsMywyLDIsMywxLDIsMiwxLDIsMCwzLDIsMSwyLDIsMiwyLDIsMSwKMywyLDEsMiwyLDIsMSwxLDEsMSwwLDAsMSwxLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywzLDMsMywzLDMsMSwzLDMsMCwyLDEsMCwzLDIsMCwwLDMsMSwwLDEsMSwwLDEsMCwwLDAsMCwwLDEsCjEsMCwwLDEsMCwzLDIsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywwLDIsMiwyLDMsMCwwLDEsMywwLDMsMiwwLDMsMiwyLDMsMywzLDMsMywxLDAsMiwyLDIsMCwyLDIsMSwyLAowLDIsMywwLDAsMCwwLDEsMCwxLDAsMCwxLDEsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsCjMsMCwyLDMsMSwzLDMsMiwzLDMsMCwzLDMsMCwzLDIsMiwzLDIsMywzLDMsMCwwLDIsMiwzLDAsMSwxLDEsMywKMCwwLDMsMCwwLDAsMiwyLDAsMSwzLDAsMSwyLDIsMiwzLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwxLAozLDIsMywzLDIsMCwzLDMsMiwyLDMsMSwzLDIsMSwzLDIsMCwxLDIsMiwwLDIsMywyLDEsMCwzLDAsMCwwLDAsCjMsMCwwLDIsMywxLDMsMCwwLDMsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywxLDMsMiwyLDIsMSwyLDAsMSwzLDEsMSwzLDEsMywwLDAsMiwxLDEsMSwxLDIsMSwxLDEsMCwyLDEsMCwxLAoxLDIsMCwwLDAsMywxLDEsMCwwLDAsMCwxLDAsMSwwLDAsMSwwLDEsMCwwLDAsMCwwLDMsMSwwLDAsMCwxLDAsCjMsMywzLDMsMiwyLDIsMiwyLDEsMywxLDEsMSwyLDAsMSwxLDIsMSwyLDEsMywyLDAsMCwzLDEsMSwxLDEsMSwKMywxLDAsMiwzLDAsMCwwLDMsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwyLDMsMCwzLDMsMCwyLDAsMCwwLDAsMCwwLDAsMywwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDIsMywxLDMsMCwwLDEsMiwwLDAsMiwwLDMsMywyLDMsMywzLDIsMywwLDAsMiwyLDIsMCwwLDAsMiwyLAowLDAsMSwwLDAsMCwwLDMsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDMsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwyLDMsMSwzLDMsMCwwLDEsMCwzLDAsMCwwLDAsMCwKMCwwLDMsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMSwyLDMsMSwyLDMsMSwwLDMsMCwyLDIsMSwwLDIsMSwxLDIsMCwxLDAsMCwxLDEsMSwxLDAsMSwwLDAsCjEsMCwwLDAsMCwxLDEsMCwzLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMywyLDEsMCwxLDEsMSwzLDEsMiwyLDIsMiwyLDIsMSwxLDEsMSwwLDMsMSwwLDEsMywxLDEsMSwxLAoxLDEsMCwyLDAsMSwzLDEsMSwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDEsCjMsMCwyLDIsMSwzLDMsMiwzLDMsMCwxLDEsMCwyLDIsMSwyLDEsMywzLDEsMCwwLDMsMiwwLDAsMCwwLDIsMSwKMCwxLDAsMCwwLDAsMSwyLDAsMSwxLDMsMSwxLDIsMiwxLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLAowLDAsMywwLDAsMSwwLDAsMCwzLDAsMCwzLDAsMywxLDAsMSwxLDEsMywyLDAsMCwwLDMsMCwwLDAsMCwyLDAsCjAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDEsMywyLDEsMywzLDEsMiwyLDAsMSwyLDEsMCwxLDIsMCwwLDAsMCwwLDMsMCwwLDAsMywwLDAsMCwwLAozLDAsMCwxLDEsMSwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMCwxLDIsMCwzLDMsMywyLDIsMCwxLDEsMCwxLDMsMCwwLDAsMiwyLDAsMCwwLDAsMywxLDAsMSwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDEsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDAsMiwzLDEsMiwwLDAsMiwxLDAsMywxLDAsMSwyLDAsMSwxLDEsMSwzLDAsMCwzLDEsMSwwLDIsMiwxLDEsCjAsMiwwLDAsMCwwLDAsMSwwLDEsMCwwLDEsMSwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywwLDAsMywxLDIsMCwwLDIsMiwwLDEsMiwwLDEsMCwxLDMsMSwyLDEsMCwwLDAsMiwwLDMsMCwwLDAsMSwwLAowLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMCwxLDEsMiwyLDAsMCwwLDIsMCwyLDEsMCwxLDEsMCwxLDEsMSwyLDEsMCwwLDEsMSwxLDAsMiwxLDEsMSwKMCwxLDEsMCwwLDAsMCwwLDAsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDEsMCwxLAowLDAsMCwyLDAsMSwzLDEsMSwxLDEsMCwwLDAsMCwzLDIsMCwxLDAsMCwwLDEsMiwwLDAsMCwxLDAsMCwwLDAsCjAsMCwwLDMsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDMsMywzLDMsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjEsMCwyLDMsMiwyLDAsMCwwLDEsMCwwLDAsMCwyLDMsMiwxLDIsMiwzLDAsMCwwLDIsMywxLDAsMCwwLDEsMSwKMCwwLDEsMCwwLDAsMCwwLDAsMCwxLDAsMCwxLDAsMCwwLDAsMCwxLDEsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMiwyLDAsMSwwLDAsMCwwLDIsMCwyLDAsMSwwLDAsMCwxLDEsMCwwLDAsMiwxLDAsMSwwLDEsMSwwLDAsCjAsMSwwLDIsMCwwLDEsMCwzLDAsMSwwLDAsMCwyLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDEsMCwwLDEsMCwwLDAsMCwwLDEsMSwyLDAsMCwwLDAsMSwwLDAsMSwzLDEsMCwwLDAsMCwxLDEsMCwwLAowLDEsMCwwLDAsMCwzLDAsMCwwLDAsMCwwLDMsMCwwLDAsMCwwLDAsMCwzLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywxLDEsMSwxLDIsMywwLDAsMiwxLDEsMSwxLDEsMCwyLDEsMSwwLDAsMCwyLDEsMCwxLDIsMSwxLDAsMSwKMiwxLDAsMywwLDAsMCwwLDMsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoxLDMsMSwwLDAsMCwwLDAsMCwwLDMsMCwwLDAsMywwLDAsMCwwLDAsMCwwLDAsMSwxLDAsMCwwLDAsMCwwLDEsCjAsMCwwLDIsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDIsMCwwLDAsMCwwLDAsMSwyLDEsMCwxLDEsMCwyLDAsMCwxLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwyLDAsMCwwLDEsMywwLDEsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDEsMiwwLDAsMCwwLDAsCjMsMywwLDAsMSwxLDIsMCwwLDEsMiwxLDAsMSwxLDEsMCwxLDEsMCwwLDIsMSwxLDAsMSwwLDAsMSwxLDEsMCwKMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMywwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDIsMiwxLDAsMCwwLDAsMSwwLDAsMCwwLDMsMCwwLDAsMCwwLDAsMCwwLDAsMywwLDAsMCwwLDAsMCwwLDAsCjIsMCwwLDAsMCwwLDMsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMiwzLDAsMCwxLDEsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwxLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoxLDEsMCwxLDIsMCwxLDIsMCwwLDEsMSwwLDIsMCwxLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwyLDAsMCwwLDAsCjEsMCwwLDEsMCwxLDEsMCwzLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwxLDAsMCwwLDAsMCwwLDAsMSwxLDAsMSwxLDAsMiwxLDMsMCwwLDAsMCwxLDEsMCwwLDAsMCwwLDAsMCwzLAoxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDAsMSwwLDEsMCwwLDIsMCwwLDIsMCwwLDEsMSwyLDAsMCwxLDEsMCwwLDAsMSwwLDAsMCwxLDEsMCwwLDAsCjEsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwKMSwwLDAsMywwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwxLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMSwxLDAsMCwwLAoyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMywwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMiwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMSwwLDEsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMSwzLDAsMCwwLAoyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDEsMCwwLDAsMCwKMSwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDIsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwxLDEsMCwwLDIsMSwwLDAsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKKQoKVElTNjIwVGhhaU1vZGVsID0gewogICdjaGFyX3RvX29yZGVyX21hcCc6IFRJUzYyMENoYXJUb09yZGVyTWFwLAogICdwcmVjZWRlbmNlX21hdHJpeCc6IFRoYWlMYW5nTW9kZWwsCiAgJ3R5cGljYWxfcG9zaXRpdmVfcmF0aW8nOiAwLjkyNjM4NiwKICAna2VlcF9lbmdsaXNoX2xldHRlcic6IEZhbHNlLAogICdjaGFyc2V0X25hbWUnOiAiVElTLTYyMCIsCiAgJ2xhbmd1YWdlJzogJ1RoYWknLAp9ClBLAwQUAAAAAAAAACEAtTLDZF4rAABeKwAANwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2xhbmd0dXJraXNobW9kZWwucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBNb3ppbGxhIENvbW11bmljYXRvciBjbGllbnQgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMgICDDlnpnw7xyIEJhc2vEsW4gLSBUdXJraXNoIExhbmd1YWdlIE1vZGVsCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMgMjU1OiBDb250cm9sIGNoYXJhY3RlcnMgdGhhdCB1c3VhbGx5IGRvZXMgbm90IGV4aXN0IGluIGFueSB0ZXh0CiMgMjU0OiBDYXJyaWFnZS9SZXR1cm4KIyAyNTM6IHN5bWJvbCAocHVuY3R1YXRpb24pIHRoYXQgZG9lcyBub3QgYmVsb25nIHRvIHdvcmQKIyAyNTI6IDAgLSA5CgojIENoYXJhY3RlciBNYXBwaW5nIFRhYmxlOgpMYXRpbjVfVHVya2lzaENoYXJUb09yZGVyTWFwID0gKAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCjI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwKMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LAoyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTUsCjI1NSwgMjMsIDM3LCA0NywgMzksIDI5LCA1MiwgMzYsIDQ1LCA1MywgNjAsIDE2LCA0OSwgMjAsIDQ2LCA0MiwKIDQ4LCA2OSwgNDQsIDM1LCAzMSwgNTEsIDM4LCA2MiwgNjUsIDQzLCA1NiwyNTUsMjU1LDI1NSwyNTUsMjU1LAoyNTUsICAxLCAyMSwgMjgsIDEyLCAgMiwgMTgsIDI3LCAyNSwgIDMsIDI0LCAxMCwgIDUsIDEzLCAgNCwgMTUsCiAyNiwgNjQsICA3LCAgOCwgIDksIDE0LCAzMiwgNTcsIDU4LCAxMSwgMjIsMjU1LDI1NSwyNTUsMjU1LDI1NSwKMTgwLDE3OSwxNzgsMTc3LDE3NiwxNzUsMTc0LDE3MywxNzIsMTcxLDE3MCwxNjksMTY4LDE2NywxNjYsMTY1LAoxNjQsMTYzLDE2MiwxNjEsMTYwLDE1OSwxMDEsMTU4LDE1NywxNTYsMTU1LDE1NCwxNTMsMTUyLDE1MSwxMDYsCjE1MCwxNDksMTQ4LDE0NywxNDYsMTQ1LDE0NCwxMDAsMTQzLDE0MiwxNDEsMTQwLDEzOSwxMzgsMTM3LDEzNiwKIDk0LCA4MCwgOTMsMTM1LDEwNSwxMzQsMTMzLCA2MywxMzIsMTMxLDEzMCwxMjksMTI4LDEyNywxMjYsMTI1LAoxMjQsMTA0LCA3MywgOTksIDc5LCA4NSwxMjMsIDU0LDEyMiwgOTgsIDkyLDEyMSwxMjAsIDkxLDEwMywxMTksCiA2OCwxMTgsMTE3LCA5NywxMTYsMTE1LCA1MCwgOTAsMTE0LDExMywxMTIsMTExLCA1NSwgNDEsIDQwLCA4NiwKIDg5LCA3MCwgNTksIDc4LCA3MSwgODIsIDg4LCAzMywgNzcsIDY2LCA4NCwgODMsMTEwLCA3NSwgNjEsIDk2LAogMzAsIDY3LDEwOSwgNzQsIDg3LDEwMiwgMzQsIDk1LCA4MSwxMDgsIDc2LCA3MiwgMTcsICA2LCAxOSwxMDcsCikKClR1cmtpc2hMYW5nTW9kZWwgPSAoCjMsMiwzLDMsMywxLDMsMywzLDMsMywzLDMsMywyLDEsMSwzLDMsMSwzLDMsMCwzLDMsMywzLDMsMCwzLDEsMywKMywyLDEsMCwwLDEsMSwwLDAsMCwxLDAsMCwxLDEsMSwxLDAsMCwwLDAsMCwwLDAsMiwyLDAsMCwxLDAsMCwxLAozLDIsMiwzLDMsMCwzLDMsMywzLDMsMywzLDIsMywxLDAsMywzLDEsMywzLDAsMywzLDMsMywzLDAsMywwLDMsCjMsMSwxLDAsMSwwLDEsMCwwLDAsMCwwLDAsMSwxLDEsMSwwLDAsMCwwLDAsMCwwLDIsMiwwLDAsMCwxLDAsMSwKMywzLDIsMywzLDAsMywzLDMsMywzLDMsMywyLDMsMSwxLDMsMywwLDMsMywxLDIsMywzLDMsMywwLDMsMCwzLAozLDEsMSwwLDAsMCwxLDAsMCwwLDAsMSwxLDAsMSwyLDEsMCwwLDAsMSwwLDAsMCwwLDIsMCwwLDAsMCwwLDEsCjMsMywzLDMsMywzLDIsMywzLDMsMywzLDMsMywzLDEsMywzLDIsMCwzLDIsMSwyLDIsMSwzLDMsMCwwLDAsMiwKMiwyLDAsMSwwLDAsMSwwLDAsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwxLDEsMCwxLDAsMCwxLAozLDMsMywyLDMsMywxLDIsMywzLDMsMywzLDMsMywxLDMsMiwxLDAsMywyLDAsMSwyLDMsMywyLDEsMCwwLDIsCjIsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMiwwLDAsMCwKMSwwLDEsMywzLDEsMywzLDMsMywzLDMsMywxLDIsMCwwLDIsMywwLDIsMywwLDAsMiwyLDIsMywwLDMsMCwxLAoyLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDAsMywzLDMsMCwzLDIsMCwyLDMsMiwzLDMsMSwwLDAsMiwKMywyLDAsMCwxLDAsMCwwLDAsMCwwLDIsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMSwxLDEsMCwyLDAsMCwxLAozLDMsMywyLDMsMywyLDMsMywzLDMsMiwzLDMsMywwLDMsMywwLDAsMiwxLDAsMCwyLDMsMiwyLDAsMCwwLDIsCjIsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwxLDAsMCwwLDEsMCwxLDAsMiwwLDAsMSwKMywzLDMsMiwzLDMsMywzLDMsMywzLDIsMywzLDMsMCwzLDIsMCwxLDMsMiwxLDEsMywyLDMsMiwxLDAsMCwyLAoyLDIsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMSwwLDAsMCwwLDAsCjMsMywzLDIsMywzLDMsMywzLDMsMywyLDMsMywzLDAsMywyLDIsMCwyLDMsMCwwLDIsMiwyLDIsMCwwLDAsMiwKMywzLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDIsMCwxLDAsMCwwLAozLDMsMywzLDMsMywzLDIsMiwyLDIsMywyLDMsMywwLDMsMywxLDEsMiwyLDAsMCwyLDIsMywyLDAsMCwxLDMsCjAsMywxLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwxLDAsMCwwLDAsMSwKMywzLDMsMiwzLDMsMywyLDEsMiwyLDMsMiwzLDMsMCwzLDIsMCwwLDEsMSwwLDEsMSwyLDEsMiwwLDAsMCwxLAowLDMsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMSwwLDEsMCwwLDAsCjMsMywzLDIsMywzLDIsMywyLDIsMiwzLDMsMywzLDEsMywxLDEsMCwzLDIsMSwxLDMsMywyLDMsMSwwLDAsMSwKMSwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwyLDAsMCwxLAozLDIsMiwzLDMsMCwzLDMsMywzLDMsMywzLDIsMiwxLDAsMywzLDEsMywzLDAsMSwzLDMsMiwzLDAsMywwLDMsCjIsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwKMiwyLDIsMywzLDAsMywzLDMsMywzLDMsMywzLDMsMCwwLDMsMiwwLDMsMywwLDMsMiwzLDMsMywwLDMsMSwzLAoyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDEsMiwwLDEsMCwwLDAsMCwwLDAsMCwyLDIsMCwwLDEsMCwwLDEsCjMsMywzLDEsMiwzLDMsMSwwLDAsMSwwLDAsMywzLDIsMywwLDAsMiwwLDAsMiwwLDIsMCwwLDAsMiwwLDIsMCwKMCwzLDEsMCwxLDAsMCwwLDIsMiwxLDAsMSwxLDIsMSwyLDIsMiwwLDIsMSwxLDAsMCwwLDIsMCwwLDAsMCwwLAoxLDIsMSwzLDMsMCwzLDMsMywzLDMsMiwzLDAsMCwwLDAsMiwzLDAsMiwzLDEsMCwyLDMsMSwzLDAsMywwLDIsCjMsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMSwzLDMsMiwyLDMsMiwyLDAsMSwyLDMsMCwxLDIsMSwwLDEsMCwwLDAsMSwwLDIsMiwwLDAsMCwxLAoxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwxLDEsMCwwLDEsMCwwLDAsCjMsMywzLDEsMywzLDEsMSwzLDMsMSwxLDMsMywxLDAsMiwxLDIsMCwyLDEsMCwwLDEsMSwyLDEsMCwwLDAsMiwKMiwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywxLDAsMiwxLDMsMCwwLDIsMCwwLDMsMywwLDMsMCwwLDEsMCwxLDIsMCwwLDEsMSwyLDIsMCwxLDAsCjAsMSwyLDEsMSwwLDEsMCwxLDEsMSwxLDEsMCwxLDEsMSwyLDIsMSwyLDAsMSwwLDAsMCwwLDAsMCwxLDAsMCwKMywzLDMsMiwzLDIsMywzLDAsMiwyLDIsMywzLDMsMCwzLDAsMCwwLDIsMiwwLDEsMiwxLDEsMSwwLDAsMCwxLAowLDMsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsCjMsMywzLDMsMywzLDIsMSwyLDIsMywzLDMsMywyLDAsMiwwLDAsMCwyLDIsMCwwLDIsMSwzLDMsMCwwLDEsMSwKMSwxLDAsMCwxLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwxLDAsMCwwLAoxLDEsMiwzLDMsMCwzLDMsMywzLDMsMywyLDIsMCwyLDAsMiwzLDIsMywyLDIsMiwyLDIsMiwyLDEsMywyLDMsCjIsMCwyLDEsMiwyLDIsMiwxLDEsMiwyLDEsMiwyLDEsMiwwLDAsMiwxLDEsMCwyLDEsMCwwLDEsMCwwLDAsMSwKMiwzLDMsMSwxLDEsMCwxLDEsMSwyLDMsMiwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMSwwLDAsMCwwLAowLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDIsMiwyLDMsMiwzLDIsMiwxLDMsMywzLDAsMiwxLDIsMCwyLDEsMCwwLDEsMSwxLDEsMSwwLDAsMSwKMiwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMSwwLDIsMCwxLDAsMCwwLAozLDMsMywyLDMsMywzLDMsMywyLDMsMSwyLDMsMywxLDIsMCwwLDAsMCwwLDAsMCwzLDIsMSwxLDAsMCwwLDAsCjIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwKMywzLDMsMiwyLDMsMywyLDEsMSwxLDEsMSwzLDMsMCwzLDEsMCwwLDEsMSwwLDAsMywxLDIsMSwwLDAsMCwwLAowLDMsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsCjMsMywzLDIsMiwzLDIsMiwyLDMsMiwxLDEsMywzLDAsMywwLDAsMCwwLDEsMCwwLDMsMSwxLDIsMCwwLDAsMSwKMSwwLDAsMSwwLDAsMiwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLAoxLDEsMSwzLDMsMCwzLDMsMywzLDMsMiwyLDIsMSwyLDAsMiwxLDIsMiwxLDEsMCwxLDIsMiwyLDIsMiwyLDIsCjAsMCwyLDEsMiwxLDIsMSwwLDEsMSwzLDEsMiwxLDEsMiwwLDAsMiwwLDEsMCwxLDAsMSwwLDAsMCwxLDAsMSwKMywzLDMsMSwzLDMsMywwLDEsMSwwLDIsMiwzLDEsMCwzLDAsMCwwLDEsMCwwLDAsMSwwLDAsMSwwLDEsMCwwLAoxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywyLDAsMCwyLDIsMSwwLDAsMSwwLDAsMywzLDEsMywwLDAsMSwxLDAsMiwwLDMsMCwwLDAsMiwwLDEsMSwKMCwxLDIsMCwxLDIsMiwwLDIsMiwyLDIsMSwwLDIsMSwxLDAsMiwwLDIsMSwyLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywxLDMsMiwzLDIsMCwyLDIsMiwxLDMsMiwwLDIsMSwyLDAsMSwyLDAsMCwxLDAsMiwyLDAsMCwwLDIsCjEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwxLDAsMSwwLDAsMCwKMywzLDMsMCwzLDMsMSwxLDIsMywxLDAsMywyLDMsMCwzLDAsMCwwLDEsMCwwLDAsMSwwLDEsMCwwLDAsMCwwLAoxLDIsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDMsMywwLDMsMywyLDMsMywyLDIsMCwwLDAsMCwxLDIsMCwxLDMsMCwwLDAsMywxLDEsMCwzLDAsMiwKMiwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywxLDIsMiwxLDAsMywxLDEsMSwxLDMsMywyLDMsMCwwLDEsMCwxLDIsMCwyLDIsMCwyLDIsMCwyLDEsCjAsMiwyLDEsMSwxLDEsMCwyLDEsMSwwLDEsMSwxLDEsMiwxLDIsMSwyLDAsMSwwLDEsMCwwLDAsMCwwLDAsMCwKMywzLDMsMCwxLDEsMywwLDAsMSwxLDAsMCwyLDIsMCwzLDAsMCwxLDEsMCwxLDAsMCwwLDAsMCwyLDAsMCwwLAowLDMsMSwwLDEsMCwxLDAsMiwwLDAsMSwwLDEsMCwxLDEsMSwyLDEsMSwwLDIsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDAsMiwwLDIsMCwxLDEsMSwwLDAsMywzLDAsMiwwLDAsMSwwLDAsMiwxLDEsMCwxLDAsMSwwLDEsMCwKMCwyLDAsMSwyLDAsMiwwLDIsMSwxLDAsMSwwLDIsMSwxLDAsMiwxLDEsMCwxLDAsMCwwLDEsMSwwLDAsMCwwLAozLDIsMywwLDEsMCwwLDAsMCwwLDAsMCwwLDEsMiwwLDEsMCwwLDEsMCwwLDEsMCwwLDAsMCwwLDIsMCwwLDAsCjAsMCwxLDEsMCwwLDEsMCwxLDAsMCwxLDAsMCwwLDIsMSwwLDEsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMywzLDMsMCwwLDIsMywwLDAsMSwwLDEsMCwyLDMsMiwzLDAsMCwxLDMsMCwyLDEsMCwwLDAsMCwyLDAsMSwwLAowLDIsMSwwLDAsMSwxLDAsMiwxLDAsMCwxLDAsMCwxLDEsMCwxLDEsMiwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsCjMsMiwyLDAsMCwxLDEsMCwwLDAsMCwwLDAsMywxLDEsMSwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMiwwLDEsMCwKMCwxLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDEsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwzLDMsMCwyLDMsMiwyLDEsMiwyLDEsMSwyLDAsMSwzLDIsMiwyLDAsMCwyLDIsMCwwLDAsMSwyLDEsCjMsMCwyLDEsMSwwLDEsMSwxLDAsMSwyLDIsMiwxLDEsMiwwLDAsMCwwLDEsMCwxLDEsMCwwLDAsMCwwLDAsMCwKMCwxLDEsMiwzLDAsMywzLDMsMiwyLDIsMiwxLDAsMSwwLDEsMCwxLDIsMiwwLDAsMiwyLDEsMywxLDEsMiwxLAowLDAsMSwxLDIsMCwxLDEsMCwwLDEsMiwwLDIsMSwxLDIsMCwwLDEsMCwwLDAsMSwwLDEsMCwxLDAsMCwwLDAsCjMsMywyLDAsMCwzLDEsMCwwLDAsMCwwLDAsMywyLDEsMiwwLDAsMSwwLDAsMiwwLDAsMCwwLDAsMiwwLDEsMCwKMCwyLDEsMSwwLDAsMSwwLDEsMiwwLDAsMSwxLDAsMCwyLDEsMSwxLDEsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMiwwLDAsMSwwLDAsMCwwLDEsMCwwLDMsMywyLDIsMCwwLDEsMCwwLDIsMCwxLDAsMCwwLDIsMCwxLDAsCjAsMCwxLDEsMCwwLDIsMCwyLDEsMCwwLDEsMSwyLDEsMiwwLDIsMSwyLDEsMSwxLDAsMCwxLDEsMCwwLDAsMCwKMywzLDIsMCwwLDIsMiwwLDAsMCwxLDEsMCwyLDIsMSwzLDEsMCwxLDAsMSwyLDAsMCwwLDAsMCwxLDAsMSwwLAowLDEsMSwwLDAsMCwwLDAsMSwwLDAsMSwwLDAsMCwxLDEsMCwxLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDIsMCwwLDAsMSwwLDAsMSwwLDAsMiwzLDEsMiwwLDAsMSwwLDAsMiwwLDAsMCwxLDAsMiwwLDIsMCwKMCwxLDEsMiwyLDEsMiwwLDIsMSwxLDAsMCwxLDEsMCwxLDEsMSwxLDIsMSwxLDAsMCwwLDAsMCwwLDAsMCwwLAozLDMsMywwLDIsMSwyLDEsMCwwLDEsMSwwLDMsMywxLDIsMCwwLDEsMCwwLDIsMCwyLDAsMSwxLDIsMCwwLDAsCjAsMCwxLDEsMSwxLDIsMCwxLDEsMCwxLDEsMSwxLDAsMCwwLDEsMSwxLDAsMSwwLDAsMCwxLDAsMCwwLDAsMCwKMywzLDMsMCwyLDIsMywyLDAsMCwxLDAsMCwyLDMsMSwwLDAsMCwwLDAsMCwyLDAsMiwwLDAsMCwyLDAsMCwwLAowLDEsMSwwLDAsMCwxLDAsMCwxLDAsMSwxLDAsMSwwLDEsMSwxLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMiwzLDAsMCwwLDAsMCwwLDAsMSwwLDAsMiwyLDIsMiwwLDAsMSwwLDAsMiwwLDAsMCwwLDAsMiwwLDEsMCwKMCwwLDIsMSwxLDAsMSwwLDIsMSwxLDAsMCwxLDEsMiwxLDAsMiwwLDIsMCwxLDAsMCwwLDIsMCwwLDAsMCwwLAowLDAsMCwyLDIsMCwyLDEsMSwxLDEsMiwyLDAsMCwxLDAsMSwwLDAsMSwzLDAsMCwwLDAsMSwwLDAsMiwxLDAsCjAsMCwxLDAsMSwwLDAsMCwwLDAsMiwxLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsMCwKMiwwLDAsMiwzLDAsMiwzLDEsMiwyLDAsMiwwLDAsMiwwLDIsMSwxLDEsMiwxLDAsMCwxLDIsMSwxLDIsMSwwLAoxLDAsMiwwLDEsMCwxLDEsMCwwLDIsMiwxLDIsMSwxLDIsMCwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjMsMywzLDAsMiwxLDIsMCwwLDAsMSwwLDAsMywyLDAsMSwwLDAsMSwwLDAsMiwwLDAsMCwxLDIsMSwwLDEsMCwKMCwwLDAsMCwxLDAsMSwwLDAsMSwwLDAsMCwwLDEsMCwxLDAsMSwxLDEsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwyLDIsMCwyLDIsMSwxLDAsMSwxLDEsMSwxLDAsMCwxLDIsMSwxLDEsMCwxLDAsMCwwLDEsMSwxLDEsCjAsMCwyLDEsMCwxLDEsMSwwLDEsMSwyLDEsMiwxLDEsMiwwLDEsMSwyLDEsMCwyLDAsMCwwLDAsMCwwLDAsMCwKMywyLDIsMCwwLDIsMCwwLDAsMCwwLDAsMCwyLDIsMCwyLDAsMCwxLDAsMCwyLDAsMCwwLDAsMCwyLDAsMCwwLAowLDIsMSwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMSwwLDEsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDMsMiwwLDIsMiwwLDEsMSwwLDEsMCwwLDEsMCwwLDAsMSwwLDEsMCwwLDAsMCwwLDEsMCwwLDAsMCwKMiwwLDEsMCwxLDAsMSwxLDAsMCwxLDIsMCwxLDAsMSwxLDAsMCwxLDAsMSwwLDIsMCwwLDAsMCwwLDAsMCwwLAoyLDIsMiwwLDEsMSwwLDAsMCwxLDAsMCwwLDEsMiwwLDEsMCwwLDEsMCwwLDEsMCwwLDAsMCwxLDIsMCwxLDAsCjAsMCwxLDAsMCwwLDEsMCwwLDEsMCwwLDAsMCwwLDAsMSwwLDEsMCwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMiwyLDIsMiwxLDAsMSwxLDEsMCwwLDAsMCwxLDIsMCwwLDEsMCwwLDAsMSwwLDAsMSwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwwLDAsCjEsMSwyLDAsMSwwLDAsMCwxLDAsMSwwLDAsMCwxLDAsMCwxLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwyLDAsMCwwLDAsMCwxLAowLDAsMSwyLDIsMCwyLDEsMiwxLDEsMiwyLDAsMCwwLDAsMSwwLDAsMSwxLDAsMCwyLDAsMCwwLDAsMSwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMSwwLDAsMCwKMiwyLDIsMCwwLDAsMSwwLDAsMCwwLDAsMCwyLDIsMSwxLDAsMCwwLDAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDEsMCwwLDAsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDEsMSwwLDAsMCwxLDAsMCwwLDEsMCwwLDAsMCwwLDAsMCwxLDEsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAoyLDIsMiwwLDEsMCwxLDAsMCwwLDAsMCwwLDEsMSwwLDAsMCwwLDAsMCwwLDEsMCwxLDAsMCwwLDAsMCwwLDAsCjAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAowLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCjAsMCwxLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwyLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwKMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAopCgpMYXRpbjVUdXJraXNoTW9kZWwgPSB7CiAgJ2NoYXJfdG9fb3JkZXJfbWFwJzogTGF0aW41X1R1cmtpc2hDaGFyVG9PcmRlck1hcCwKICAncHJlY2VkZW5jZV9tYXRyaXgnOiBUdXJraXNoTGFuZ01vZGVsLAogICd0eXBpY2FsX3Bvc2l0aXZlX3JhdGlvJzogMC45NzAyOTAsCiAgJ2tlZXBfZW5nbGlzaF9sZXR0ZXInOiBUcnVlLAogICdjaGFyc2V0X25hbWUnOiAiSVNPLTg4NTktOSIsCiAgJ2xhbmd1YWdlJzogJ1R1cmtpc2gnLAp9ClBLAwQUAAAAAAAAACEA5OzwpPoUAAD6FAAAMwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2xhdGluMXByb2Jlci5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIE1vemlsbGEgVW5pdmVyc2FsIGNoYXJzZXQgZGV0ZWN0b3IgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMDEKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMgICBTaHkgU2hhbG9tIC0gb3JpZ2luYWwgQyBjb2RlCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmZyb20gLmNoYXJzZXRwcm9iZXIgaW1wb3J0IENoYXJTZXRQcm9iZXIKZnJvbSAuZW51bXMgaW1wb3J0IFByb2JpbmdTdGF0ZQoKRlJFUV9DQVRfTlVNID0gNAoKVURGID0gMCAgIyB1bmRlZmluZWQKT1RIID0gMSAgIyBvdGhlcgpBU0MgPSAyICAjIGFzY2lpIGNhcGl0YWwgbGV0dGVyCkFTUyA9IDMgICMgYXNjaWkgc21hbGwgbGV0dGVyCkFDViA9IDQgICMgYWNjZW50IGNhcGl0YWwgdm93ZWwKQUNPID0gNSAgIyBhY2NlbnQgY2FwaXRhbCBvdGhlcgpBU1YgPSA2ICAjIGFjY2VudCBzbWFsbCB2b3dlbApBU08gPSA3ICAjIGFjY2VudCBzbWFsbCBvdGhlcgpDTEFTU19OVU0gPSA4ICAjIHRvdGFsIGNsYXNzZXMKCkxhdGluMV9DaGFyVG9DbGFzcyA9ICgKICAgIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCAgICMgMDAgLSAwNwogICAgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsICAgIyAwOCAtIDBGCiAgICBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgICAjIDEwIC0gMTcKICAgIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCAgICMgMTggLSAxRgogICAgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsICAgIyAyMCAtIDI3CiAgICBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgICAjIDI4IC0gMkYKICAgIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCAgICMgMzAgLSAzNwogICAgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsICAgIyAzOCAtIDNGCiAgICBPVEgsIEFTQywgQVNDLCBBU0MsIEFTQywgQVNDLCBBU0MsIEFTQywgICAjIDQwIC0gNDcKICAgIEFTQywgQVNDLCBBU0MsIEFTQywgQVNDLCBBU0MsIEFTQywgQVNDLCAgICMgNDggLSA0RgogICAgQVNDLCBBU0MsIEFTQywgQVNDLCBBU0MsIEFTQywgQVNDLCBBU0MsICAgIyA1MCAtIDU3CiAgICBBU0MsIEFTQywgQVNDLCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgICAjIDU4IC0gNUYKICAgIE9USCwgQVNTLCBBU1MsIEFTUywgQVNTLCBBU1MsIEFTUywgQVNTLCAgICMgNjAgLSA2NwogICAgQVNTLCBBU1MsIEFTUywgQVNTLCBBU1MsIEFTUywgQVNTLCBBU1MsICAgIyA2OCAtIDZGCiAgICBBU1MsIEFTUywgQVNTLCBBU1MsIEFTUywgQVNTLCBBU1MsIEFTUywgICAjIDcwIC0gNzcKICAgIEFTUywgQVNTLCBBU1MsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCAgICMgNzggLSA3RgogICAgT1RILCBVREYsIE9USCwgQVNPLCBPVEgsIE9USCwgT1RILCBPVEgsICAgIyA4MCAtIDg3CiAgICBPVEgsIE9USCwgQUNPLCBPVEgsIEFDTywgVURGLCBBQ08sIFVERiwgICAjIDg4IC0gOEYKICAgIFVERiwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCAgICMgOTAgLSA5NwogICAgT1RILCBPVEgsIEFTTywgT1RILCBBU08sIFVERiwgQVNPLCBBQ08sICAgIyA5OCAtIDlGCiAgICBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgICAjIEEwIC0gQTcKICAgIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCAgICMgQTggLSBBRgogICAgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsICAgIyBCMCAtIEI3CiAgICBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgT1RILCBPVEgsIE9USCwgICAjIEI4IC0gQkYKICAgIEFDViwgQUNWLCBBQ1YsIEFDViwgQUNWLCBBQ1YsIEFDTywgQUNPLCAgICMgQzAgLSBDNwogICAgQUNWLCBBQ1YsIEFDViwgQUNWLCBBQ1YsIEFDViwgQUNWLCBBQ1YsICAgIyBDOCAtIENGCiAgICBBQ08sIEFDTywgQUNWLCBBQ1YsIEFDViwgQUNWLCBBQ1YsIE9USCwgICAjIEQwIC0gRDcKICAgIEFDViwgQUNWLCBBQ1YsIEFDViwgQUNWLCBBQ08sIEFDTywgQUNPLCAgICMgRDggLSBERgogICAgQVNWLCBBU1YsIEFTViwgQVNWLCBBU1YsIEFTViwgQVNPLCBBU08sICAgIyBFMCAtIEU3CiAgICBBU1YsIEFTViwgQVNWLCBBU1YsIEFTViwgQVNWLCBBU1YsIEFTViwgICAjIEU4IC0gRUYKICAgIEFTTywgQVNPLCBBU1YsIEFTViwgQVNWLCBBU1YsIEFTViwgT1RILCAgICMgRjAgLSBGNwogICAgQVNWLCBBU1YsIEFTViwgQVNWLCBBU1YsIEFTTywgQVNPLCBBU08sICAgIyBGOCAtIEZGCikKCiMgMCA6IGlsbGVnYWwKIyAxIDogdmVyeSB1bmxpa2VseQojIDIgOiBub3JtYWwKIyAzIDogdmVyeSBsaWtlbHkKTGF0aW4xQ2xhc3NNb2RlbCA9ICgKIyBVREYgT1RIIEFTQyBBU1MgQUNWIEFDTyBBU1YgQVNPCiAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgICMgVURGCiAgICAwLCAgMywgIDMsICAzLCAgMywgIDMsICAzLCAgMywgICMgT1RICiAgICAwLCAgMywgIDMsICAzLCAgMywgIDMsICAzLCAgMywgICMgQVNDCiAgICAwLCAgMywgIDMsICAzLCAgMSwgIDEsICAzLCAgMywgICMgQVNTCiAgICAwLCAgMywgIDMsICAzLCAgMSwgIDIsICAxLCAgMiwgICMgQUNWCiAgICAwLCAgMywgIDMsICAzLCAgMywgIDMsICAzLCAgMywgICMgQUNPCiAgICAwLCAgMywgIDEsICAzLCAgMSwgIDEsICAxLCAgMywgICMgQVNWCiAgICAwLCAgMywgIDEsICAzLCAgMSwgIDEsICAzLCAgMywgICMgQVNPCikKCgpjbGFzcyBMYXRpbjFQcm9iZXIoQ2hhclNldFByb2Jlcik6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc3VwZXIoTGF0aW4xUHJvYmVyLCBzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5fbGFzdF9jaGFyX2NsYXNzID0gTm9uZQogICAgICAgIHNlbGYuX2ZyZXFfY291bnRlciA9IE5vbmUKICAgICAgICBzZWxmLnJlc2V0KCkKCiAgICBkZWYgcmVzZXQoc2VsZik6CiAgICAgICAgc2VsZi5fbGFzdF9jaGFyX2NsYXNzID0gT1RICiAgICAgICAgc2VsZi5fZnJlcV9jb3VudGVyID0gWzBdICogRlJFUV9DQVRfTlVNCiAgICAgICAgQ2hhclNldFByb2Jlci5yZXNldChzZWxmKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNoYXJzZXRfbmFtZShzZWxmKToKICAgICAgICByZXR1cm4gIklTTy04ODU5LTEiCgogICAgQHByb3BlcnR5CiAgICBkZWYgbGFuZ3VhZ2Uoc2VsZik6CiAgICAgICAgcmV0dXJuICIiCgogICAgZGVmIGZlZWQoc2VsZiwgYnl0ZV9zdHIpOgogICAgICAgIGJ5dGVfc3RyID0gc2VsZi5maWx0ZXJfd2l0aF9lbmdsaXNoX2xldHRlcnMoYnl0ZV9zdHIpCiAgICAgICAgZm9yIGMgaW4gYnl0ZV9zdHI6CiAgICAgICAgICAgIGNoYXJfY2xhc3MgPSBMYXRpbjFfQ2hhclRvQ2xhc3NbY10KICAgICAgICAgICAgZnJlcSA9IExhdGluMUNsYXNzTW9kZWxbKHNlbGYuX2xhc3RfY2hhcl9jbGFzcyAqIENMQVNTX05VTSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjaGFyX2NsYXNzXQogICAgICAgICAgICBpZiBmcmVxID09IDA6CiAgICAgICAgICAgICAgICBzZWxmLl9zdGF0ZSA9IFByb2JpbmdTdGF0ZS5OT1RfTUUKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIHNlbGYuX2ZyZXFfY291bnRlcltmcmVxXSArPSAxCiAgICAgICAgICAgIHNlbGYuX2xhc3RfY2hhcl9jbGFzcyA9IGNoYXJfY2xhc3MKCiAgICAgICAgcmV0dXJuIHNlbGYuc3RhdGUKCiAgICBkZWYgZ2V0X2NvbmZpZGVuY2Uoc2VsZik6CiAgICAgICAgaWYgc2VsZi5zdGF0ZSA9PSBQcm9iaW5nU3RhdGUuTk9UX01FOgogICAgICAgICAgICByZXR1cm4gMC4wMQoKICAgICAgICB0b3RhbCA9IHN1bShzZWxmLl9mcmVxX2NvdW50ZXIpCiAgICAgICAgaWYgdG90YWwgPCAwLjAxOgogICAgICAgICAgICBjb25maWRlbmNlID0gMC4wCiAgICAgICAgZWxzZToKICAgICAgICAgICAgY29uZmlkZW5jZSA9ICgoc2VsZi5fZnJlcV9jb3VudGVyWzNdIC0gc2VsZi5fZnJlcV9jb3VudGVyWzFdICogMjAuMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAvIHRvdGFsKQogICAgICAgIGlmIGNvbmZpZGVuY2UgPCAwLjA6CiAgICAgICAgICAgIGNvbmZpZGVuY2UgPSAwLjAKICAgICAgICAjIGxvd2VyIHRoZSBjb25maWRlbmNlIG9mIGxhdGluMSBzbyB0aGF0IG90aGVyIG1vcmUgYWNjdXJhdGUKICAgICAgICAjIGRldGVjdG9yIGNhbiB0YWtlIHByaW9yaXR5LgogICAgICAgIGNvbmZpZGVuY2UgPSBjb25maWRlbmNlICogMC43MwogICAgICAgIHJldHVybiBjb25maWRlbmNlClBLAwQUAAAAAAAAACEANnUYTVUNAABVDQAANgAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L21iY2hhcnNldHByb2Jlci5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIE1vemlsbGEgVW5pdmVyc2FsIGNoYXJzZXQgZGV0ZWN0b3IgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMDEKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMgICBTaHkgU2hhbG9tIC0gb3JpZ2luYWwgQyBjb2RlCiMgICBQcm9vZnBvaW50LCBJbmMuCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmZyb20gLmNoYXJzZXRwcm9iZXIgaW1wb3J0IENoYXJTZXRQcm9iZXIKZnJvbSAuZW51bXMgaW1wb3J0IFByb2JpbmdTdGF0ZSwgTWFjaGluZVN0YXRlCgoKY2xhc3MgTXVsdGlCeXRlQ2hhclNldFByb2JlcihDaGFyU2V0UHJvYmVyKToKICAgICIiIgogICAgTXVsdGlCeXRlQ2hhclNldFByb2JlcgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGxhbmdfZmlsdGVyPU5vbmUpOgogICAgICAgIHN1cGVyKE11bHRpQnl0ZUNoYXJTZXRQcm9iZXIsIHNlbGYpLl9faW5pdF9fKGxhbmdfZmlsdGVyPWxhbmdfZmlsdGVyKQogICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uX2FuYWx5emVyID0gTm9uZQogICAgICAgIHNlbGYuY29kaW5nX3NtID0gTm9uZQogICAgICAgIHNlbGYuX2xhc3RfY2hhciA9IFswLCAwXQoKICAgIGRlZiByZXNldChzZWxmKToKICAgICAgICBzdXBlcihNdWx0aUJ5dGVDaGFyU2V0UHJvYmVyLCBzZWxmKS5yZXNldCgpCiAgICAgICAgaWYgc2VsZi5jb2Rpbmdfc206CiAgICAgICAgICAgIHNlbGYuY29kaW5nX3NtLnJlc2V0KCkKICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbl9hbmFseXplcjoKICAgICAgICAgICAgc2VsZi5kaXN0cmlidXRpb25fYW5hbHl6ZXIucmVzZXQoKQogICAgICAgIHNlbGYuX2xhc3RfY2hhciA9IFswLCAwXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNoYXJzZXRfbmFtZShzZWxmKToKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCgogICAgQHByb3BlcnR5CiAgICBkZWYgbGFuZ3VhZ2Uoc2VsZik6CiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgoKICAgIGRlZiBmZWVkKHNlbGYsIGJ5dGVfc3RyKToKICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oYnl0ZV9zdHIpKToKICAgICAgICAgICAgY29kaW5nX3N0YXRlID0gc2VsZi5jb2Rpbmdfc20ubmV4dF9zdGF0ZShieXRlX3N0cltpXSkKICAgICAgICAgICAgaWYgY29kaW5nX3N0YXRlID09IE1hY2hpbmVTdGF0ZS5FUlJPUjoKICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKCclcyAlcyBwcm9iZXIgaGl0IGVycm9yIGF0IGJ5dGUgJXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jaGFyc2V0X25hbWUsIHNlbGYubGFuZ3VhZ2UsIGkpCiAgICAgICAgICAgICAgICBzZWxmLl9zdGF0ZSA9IFByb2JpbmdTdGF0ZS5OT1RfTUUKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGVsaWYgY29kaW5nX3N0YXRlID09IE1hY2hpbmVTdGF0ZS5JVFNfTUU6CiAgICAgICAgICAgICAgICBzZWxmLl9zdGF0ZSA9IFByb2JpbmdTdGF0ZS5GT1VORF9JVAogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZWxpZiBjb2Rpbmdfc3RhdGUgPT0gTWFjaGluZVN0YXRlLlNUQVJUOgogICAgICAgICAgICAgICAgY2hhcl9sZW4gPSBzZWxmLmNvZGluZ19zbS5nZXRfY3VycmVudF9jaGFybGVuKCkKICAgICAgICAgICAgICAgIGlmIGkgPT0gMDoKICAgICAgICAgICAgICAgICAgICBzZWxmLl9sYXN0X2NoYXJbMV0gPSBieXRlX3N0clswXQogICAgICAgICAgICAgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uX2FuYWx5emVyLmZlZWQoc2VsZi5fbGFzdF9jaGFyLCBjaGFyX2xlbikKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5kaXN0cmlidXRpb25fYW5hbHl6ZXIuZmVlZChieXRlX3N0cltpIC0gMTppICsgMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX2xlbikKCiAgICAgICAgc2VsZi5fbGFzdF9jaGFyWzBdID0gYnl0ZV9zdHJbLTFdCgogICAgICAgIGlmIHNlbGYuc3RhdGUgPT0gUHJvYmluZ1N0YXRlLkRFVEVDVElORzoKICAgICAgICAgICAgaWYgKHNlbGYuZGlzdHJpYnV0aW9uX2FuYWx5emVyLmdvdF9lbm91Z2hfZGF0YSgpIGFuZAogICAgICAgICAgICAgICAgICAgIChzZWxmLmdldF9jb25maWRlbmNlKCkgPiBzZWxmLlNIT1JUQ1VUX1RIUkVTSE9MRCkpOgogICAgICAgICAgICAgICAgc2VsZi5fc3RhdGUgPSBQcm9iaW5nU3RhdGUuRk9VTkRfSVQKCiAgICAgICAgcmV0dXJuIHNlbGYuc3RhdGUKCiAgICBkZWYgZ2V0X2NvbmZpZGVuY2Uoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuZGlzdHJpYnV0aW9uX2FuYWx5emVyLmdldF9jb25maWRlbmNlKCkKUEsDBBQAAAAAAAAAIQCt0xGo3AcAANwHAAA2AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvbWJjc2dyb3VwcHJvYmVyLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBVbml2ZXJzYWwgY2hhcnNldCBkZXRlY3RvciBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAwMQojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIyAgIFNoeSBTaGFsb20gLSBvcmlnaW5hbCBDIGNvZGUKIyAgIFByb29mcG9pbnQsIEluYy4KIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZnJvbSAuY2hhcnNldGdyb3VwcHJvYmVyIGltcG9ydCBDaGFyU2V0R3JvdXBQcm9iZXIKZnJvbSAudXRmOHByb2JlciBpbXBvcnQgVVRGOFByb2Jlcgpmcm9tIC5zamlzcHJvYmVyIGltcG9ydCBTSklTUHJvYmVyCmZyb20gLmV1Y2pwcHJvYmVyIGltcG9ydCBFVUNKUFByb2Jlcgpmcm9tIC5nYjIzMTJwcm9iZXIgaW1wb3J0IEdCMjMxMlByb2Jlcgpmcm9tIC5ldWNrcnByb2JlciBpbXBvcnQgRVVDS1JQcm9iZXIKZnJvbSAuY3A5NDlwcm9iZXIgaW1wb3J0IENQOTQ5UHJvYmVyCmZyb20gLmJpZzVwcm9iZXIgaW1wb3J0IEJpZzVQcm9iZXIKZnJvbSAuZXVjdHdwcm9iZXIgaW1wb3J0IEVVQ1RXUHJvYmVyCgoKY2xhc3MgTUJDU0dyb3VwUHJvYmVyKENoYXJTZXRHcm91cFByb2Jlcik6CiAgICBkZWYgX19pbml0X18oc2VsZiwgbGFuZ19maWx0ZXI9Tm9uZSk6CiAgICAgICAgc3VwZXIoTUJDU0dyb3VwUHJvYmVyLCBzZWxmKS5fX2luaXRfXyhsYW5nX2ZpbHRlcj1sYW5nX2ZpbHRlcikKICAgICAgICBzZWxmLnByb2JlcnMgPSBbCiAgICAgICAgICAgIFVURjhQcm9iZXIoKSwKICAgICAgICAgICAgU0pJU1Byb2JlcigpLAogICAgICAgICAgICBFVUNKUFByb2JlcigpLAogICAgICAgICAgICBHQjIzMTJQcm9iZXIoKSwKICAgICAgICAgICAgRVVDS1JQcm9iZXIoKSwKICAgICAgICAgICAgQ1A5NDlQcm9iZXIoKSwKICAgICAgICAgICAgQmlnNVByb2JlcigpLAogICAgICAgICAgICBFVUNUV1Byb2JlcigpCiAgICAgICAgXQogICAgICAgIHNlbGYucmVzZXQoKQpQSwMEFAAAAAAAAAAhAGn24Q+JYwAAiWMAAC0AAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9tYmNzc20ucHkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQkVHSU4gTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBUaGUgT3JpZ2luYWwgQ29kZSBpcyBtb3ppbGxhLm9yZyBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMTk5OAojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZnJvbSAuZW51bXMgaW1wb3J0IE1hY2hpbmVTdGF0ZQoKIyBCSUc1CgpCSUc1X0NMUyA9ICgKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgMDAgLSAwNyAgICAjYWxsb3cgMHgwMCBhcyBsZWdhbCB2YWx1ZQogICAgMSwxLDEsMSwxLDEsMCwwLCAgIyAwOCAtIDBmCiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDEwIC0gMTcKICAgIDEsMSwxLDAsMSwxLDEsMSwgICMgMTggLSAxZgogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyAyMCAtIDI3CiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDI4IC0gMmYKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgMzAgLSAzNwogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyAzOCAtIDNmCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDQwIC0gNDcKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgNDggLSA0ZgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyA1MCAtIDU3CiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDU4IC0gNWYKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgNjAgLSA2NwogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyA2OCAtIDZmCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDcwIC0gNzcKICAgIDIsMiwyLDIsMiwyLDIsMSwgICMgNzggLSA3ZgogICAgNCw0LDQsNCw0LDQsNCw0LCAgIyA4MCAtIDg3CiAgICA0LDQsNCw0LDQsNCw0LDQsICAjIDg4IC0gOGYKICAgIDQsNCw0LDQsNCw0LDQsNCwgICMgOTAgLSA5NwogICAgNCw0LDQsNCw0LDQsNCw0LCAgIyA5OCAtIDlmCiAgICA0LDMsMywzLDMsMywzLDMsICAjIGEwIC0gYTcKICAgIDMsMywzLDMsMywzLDMsMywgICMgYTggLSBhZgogICAgMywzLDMsMywzLDMsMywzLCAgIyBiMCAtIGI3CiAgICAzLDMsMywzLDMsMywzLDMsICAjIGI4IC0gYmYKICAgIDMsMywzLDMsMywzLDMsMywgICMgYzAgLSBjNwogICAgMywzLDMsMywzLDMsMywzLCAgIyBjOCAtIGNmCiAgICAzLDMsMywzLDMsMywzLDMsICAjIGQwIC0gZDcKICAgIDMsMywzLDMsMywzLDMsMywgICMgZDggLSBkZgogICAgMywzLDMsMywzLDMsMywzLCAgIyBlMCAtIGU3CiAgICAzLDMsMywzLDMsMywzLDMsICAjIGU4IC0gZWYKICAgIDMsMywzLDMsMywzLDMsMywgICMgZjAgLSBmNwogICAgMywzLDMsMywzLDMsMywwICAjIGY4IC0gZmYKKQoKQklHNV9TVCA9ICgKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULCAgICAgMyxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIzAwLTA3CiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuRVJST1IsIzA4LTBmCiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJUIzEwLTE3CikKCkJJRzVfQ0hBUl9MRU5fVEFCTEUgPSAoMCwgMSwgMSwgMiwgMCkKCkJJRzVfU01fTU9ERUwgPSB7J2NsYXNzX3RhYmxlJzogQklHNV9DTFMsCiAgICAgICAgICAgICAgICAgJ2NsYXNzX2ZhY3Rvcic6IDUsCiAgICAgICAgICAgICAgICAgJ3N0YXRlX3RhYmxlJzogQklHNV9TVCwKICAgICAgICAgICAgICAgICAnY2hhcl9sZW5fdGFibGUnOiBCSUc1X0NIQVJfTEVOX1RBQkxFLAogICAgICAgICAgICAgICAgICduYW1lJzogJ0JpZzUnfQoKIyBDUDk0OQoKQ1A5NDlfQ0xTICA9ICgKICAgIDEsMSwxLDEsMSwxLDEsMSwgMSwxLDEsMSwxLDEsMCwwLCAgIyAwMCAtIDBmCiAgICAxLDEsMSwxLDEsMSwxLDEsIDEsMSwxLDAsMSwxLDEsMSwgICMgMTAgLSAxZgogICAgMSwxLDEsMSwxLDEsMSwxLCAxLDEsMSwxLDEsMSwxLDEsICAjIDIwIC0gMmYKICAgIDEsMSwxLDEsMSwxLDEsMSwgMSwxLDEsMSwxLDEsMSwxLCAgIyAzMCAtIDNmCiAgICAxLDQsNCw0LDQsNCw0LDQsIDQsNCw0LDQsNCw0LDQsNCwgICMgNDAgLSA0ZgogICAgNCw0LDUsNSw1LDUsNSw1LCA1LDUsNSwxLDEsMSwxLDEsICAjIDUwIC0gNWYKICAgIDEsNSw1LDUsNSw1LDUsNSwgNSw1LDUsNSw1LDUsNSw1LCAgIyA2MCAtIDZmCiAgICA1LDUsNSw1LDUsNSw1LDUsIDUsNSw1LDEsMSwxLDEsMSwgICMgNzAgLSA3ZgogICAgMCw2LDYsNiw2LDYsNiw2LCA2LDYsNiw2LDYsNiw2LDYsICAjIDgwIC0gOGYKICAgIDYsNiw2LDYsNiw2LDYsNiwgNiw2LDYsNiw2LDYsNiw2LCAgIyA5MCAtIDlmCiAgICA2LDcsNyw3LDcsNyw3LDcsIDcsNyw3LDcsNyw4LDgsOCwgICMgYTAgLSBhZgogICAgNyw3LDcsNyw3LDcsNyw3LCA3LDcsNyw3LDcsNyw3LDcsICAjIGIwIC0gYmYKICAgIDcsNyw3LDcsNyw3LDksMiwgMiwzLDIsMiwyLDIsMiwyLCAgIyBjMCAtIGNmCiAgICAyLDIsMiwyLDIsMiwyLDIsIDIsMiwyLDIsMiwyLDIsMiwgICMgZDAgLSBkZgogICAgMiwyLDIsMiwyLDIsMiwyLCAyLDIsMiwyLDIsMiwyLDIsICAjIGUwIC0gZWYKICAgIDIsMiwyLDIsMiwyLDIsMiwgMiwyLDIsMiwyLDIsMiwwLCAgIyBmMCAtIGZmCikKCkNQOTQ5X1NUID0gKAojY2xzPSAgICAwICAgICAgMSAgICAgIDIgICAgICAzICAgICAgNCAgICAgIDUgICAgICA2ICAgICAgNyAgICAgIDggICAgICA5ICAjIHByZXZpb3VzIHN0YXRlID0KICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsICAgICAzLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULCAgICAgNCwgICAgIDUsTWFjaGluZVN0YXRlLkVSUk9SLCAgICAgNiwgIyBNYWNoaW5lU3RhdGUuU1RBUlQKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwgIyBNYWNoaW5lU3RhdGUuRVJST1IKICAgIE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsICMgTWFjaGluZVN0YXRlLklUU19NRQogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULCAjIDMKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCwgIyA0CiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsICMgNQogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULCAjIDYKKQoKQ1A5NDlfQ0hBUl9MRU5fVEFCTEUgPSAoMCwgMSwgMiwgMCwgMSwgMSwgMiwgMiwgMCwgMikKCkNQOTQ5X1NNX01PREVMID0geydjbGFzc190YWJsZSc6IENQOTQ5X0NMUywKICAgICAgICAgICAgICAgICAgJ2NsYXNzX2ZhY3Rvcic6IDEwLAogICAgICAgICAgICAgICAgICAnc3RhdGVfdGFibGUnOiBDUDk0OV9TVCwKICAgICAgICAgICAgICAgICAgJ2NoYXJfbGVuX3RhYmxlJzogQ1A5NDlfQ0hBUl9MRU5fVEFCTEUsCiAgICAgICAgICAgICAgICAgICduYW1lJzogJ0NQOTQ5J30KCiMgRVVDLUpQCgpFVUNKUF9DTFMgPSAoCiAgICA0LDQsNCw0LDQsNCw0LDQsICAjIDAwIC0gMDcKICAgIDQsNCw0LDQsNCw0LDUsNSwgICMgMDggLSAwZgogICAgNCw0LDQsNCw0LDQsNCw0LCAgIyAxMCAtIDE3CiAgICA0LDQsNCw1LDQsNCw0LDQsICAjIDE4IC0gMWYKICAgIDQsNCw0LDQsNCw0LDQsNCwgICMgMjAgLSAyNwogICAgNCw0LDQsNCw0LDQsNCw0LCAgIyAyOCAtIDJmCiAgICA0LDQsNCw0LDQsNCw0LDQsICAjIDMwIC0gMzcKICAgIDQsNCw0LDQsNCw0LDQsNCwgICMgMzggLSAzZgogICAgNCw0LDQsNCw0LDQsNCw0LCAgIyA0MCAtIDQ3CiAgICA0LDQsNCw0LDQsNCw0LDQsICAjIDQ4IC0gNGYKICAgIDQsNCw0LDQsNCw0LDQsNCwgICMgNTAgLSA1NwogICAgNCw0LDQsNCw0LDQsNCw0LCAgIyA1OCAtIDVmCiAgICA0LDQsNCw0LDQsNCw0LDQsICAjIDYwIC0gNjcKICAgIDQsNCw0LDQsNCw0LDQsNCwgICMgNjggLSA2ZgogICAgNCw0LDQsNCw0LDQsNCw0LCAgIyA3MCAtIDc3CiAgICA0LDQsNCw0LDQsNCw0LDQsICAjIDc4IC0gN2YKICAgIDUsNSw1LDUsNSw1LDUsNSwgICMgODAgLSA4NwogICAgNSw1LDUsNSw1LDUsMSwzLCAgIyA4OCAtIDhmCiAgICA1LDUsNSw1LDUsNSw1LDUsICAjIDkwIC0gOTcKICAgIDUsNSw1LDUsNSw1LDUsNSwgICMgOTggLSA5ZgogICAgNSwyLDIsMiwyLDIsMiwyLCAgIyBhMCAtIGE3CiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIGE4IC0gYWYKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgYjAgLSBiNwogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyBiOCAtIGJmCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIGMwIC0gYzcKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgYzggLSBjZgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyBkMCAtIGQ3CiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIGQ4IC0gZGYKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgZTAgLSBlNwogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyBlOCAtIGVmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIGYwIC0gZjcKICAgIDAsMCwwLDAsMCwwLDAsNSAgIyBmOCAtIGZmCikKCkVVQ0pQX1NUID0gKAogICAgICAgICAgMywgICAgIDQsICAgICAzLCAgICAgNSxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIzAwLTA3CiAgICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsIzA4LTBmCiAgICAgTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCMxMC0xNwogICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCAgICAgMyxNYWNoaW5lU3RhdGUuRVJST1IsIzE4LTFmCiAgICAgICAgICAzLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCMyMC0yNwopCgpFVUNKUF9DSEFSX0xFTl9UQUJMRSA9ICgyLCAyLCAyLCAzLCAxLCAwKQoKRVVDSlBfU01fTU9ERUwgPSB7J2NsYXNzX3RhYmxlJzogRVVDSlBfQ0xTLAogICAgICAgICAgICAgICAgICAnY2xhc3NfZmFjdG9yJzogNiwKICAgICAgICAgICAgICAgICAgJ3N0YXRlX3RhYmxlJzogRVVDSlBfU1QsCiAgICAgICAgICAgICAgICAgICdjaGFyX2xlbl90YWJsZSc6IEVVQ0pQX0NIQVJfTEVOX1RBQkxFLAogICAgICAgICAgICAgICAgICAnbmFtZSc6ICdFVUMtSlAnfQoKIyBFVUMtS1IKCkVVQ0tSX0NMUyAgPSAoCiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDAwIC0gMDcKICAgIDEsMSwxLDEsMSwxLDAsMCwgICMgMDggLSAwZgogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyAxMCAtIDE3CiAgICAxLDEsMSwwLDEsMSwxLDEsICAjIDE4IC0gMWYKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgMjAgLSAyNwogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyAyOCAtIDJmCiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDMwIC0gMzcKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgMzggLSAzZgogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyA0MCAtIDQ3CiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDQ4IC0gNGYKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgNTAgLSA1NwogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyA1OCAtIDVmCiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDYwIC0gNjcKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgNjggLSA2ZgogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyA3MCAtIDc3CiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDc4IC0gN2YKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgODAgLSA4NwogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA4OCAtIDhmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDkwIC0gOTcKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgOTggLSA5ZgogICAgMCwyLDIsMiwyLDIsMiwyLCAgIyBhMCAtIGE3CiAgICAyLDIsMiwyLDIsMywzLDMsICAjIGE4IC0gYWYKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgYjAgLSBiNwogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyBiOCAtIGJmCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIGMwIC0gYzcKICAgIDIsMywyLDIsMiwyLDIsMiwgICMgYzggLSBjZgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyBkMCAtIGQ3CiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIGQ4IC0gZGYKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgZTAgLSBlNwogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyBlOCAtIGVmCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIGYwIC0gZjcKICAgIDIsMiwyLDIsMiwyLDIsMCAgICMgZjggLSBmZgopCgpFVUNLUl9TVCA9ICgKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsICAgICAzLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIzAwLTA3CiAgICBNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCAjMDgtMGYKKQoKRVVDS1JfQ0hBUl9MRU5fVEFCTEUgPSAoMCwgMSwgMiwgMCkKCkVVQ0tSX1NNX01PREVMID0geydjbGFzc190YWJsZSc6IEVVQ0tSX0NMUywKICAgICAgICAgICAgICAgICdjbGFzc19mYWN0b3InOiA0LAogICAgICAgICAgICAgICAgJ3N0YXRlX3RhYmxlJzogRVVDS1JfU1QsCiAgICAgICAgICAgICAgICAnY2hhcl9sZW5fdGFibGUnOiBFVUNLUl9DSEFSX0xFTl9UQUJMRSwKICAgICAgICAgICAgICAgICduYW1lJzogJ0VVQy1LUid9CgojIEVVQy1UVwoKRVVDVFdfQ0xTID0gKAogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyAwMCAtIDA3CiAgICAyLDIsMiwyLDIsMiwwLDAsICAjIDA4IC0gMGYKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgMTAgLSAxNwogICAgMiwyLDIsMCwyLDIsMiwyLCAgIyAxOCAtIDFmCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDIwIC0gMjcKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgMjggLSAyZgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyAzMCAtIDM3CiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDM4IC0gM2YKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgNDAgLSA0NwogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyA0OCAtIDRmCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDUwIC0gNTcKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgNTggLSA1ZgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyA2MCAtIDY3CiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDY4IC0gNmYKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgNzAgLSA3NwogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyA3OCAtIDdmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDgwIC0gODcKICAgIDAsMCwwLDAsMCwwLDYsMCwgICMgODggLSA4ZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA5MCAtIDk3CiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDk4IC0gOWYKICAgIDAsMyw0LDQsNCw0LDQsNCwgICMgYTAgLSBhNwogICAgNSw1LDEsMSwxLDEsMSwxLCAgIyBhOCAtIGFmCiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIGIwIC0gYjcKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgYjggLSBiZgogICAgMSwxLDMsMSwzLDMsMywzLCAgIyBjMCAtIGM3CiAgICAzLDMsMywzLDMsMywzLDMsICAjIGM4IC0gY2YKICAgIDMsMywzLDMsMywzLDMsMywgICMgZDAgLSBkNwogICAgMywzLDMsMywzLDMsMywzLCAgIyBkOCAtIGRmCiAgICAzLDMsMywzLDMsMywzLDMsICAjIGUwIC0gZTcKICAgIDMsMywzLDMsMywzLDMsMywgICMgZTggLSBlZgogICAgMywzLDMsMywzLDMsMywzLCAgIyBmMCAtIGY3CiAgICAzLDMsMywzLDMsMywzLDAgICAjIGY4IC0gZmYKKQoKRVVDVFdfU1QgPSAoCiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCwgICAgIDMsICAgICAzLCAgICAgMywgICAgIDQsTWFjaGluZVN0YXRlLkVSUk9SLCMwMC0wNwogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLCMwOC0wZgogICAgTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLkVSUk9SLCMxMC0xNwogICAgTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjMTgtMWYKICAgICAgICAgNSxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsIzIwLTI3CiAgICBNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJUICMyOC0yZgopCgpFVUNUV19DSEFSX0xFTl9UQUJMRSA9ICgwLCAwLCAxLCAyLCAyLCAyLCAzKQoKRVVDVFdfU01fTU9ERUwgPSB7J2NsYXNzX3RhYmxlJzogRVVDVFdfQ0xTLAogICAgICAgICAgICAgICAgJ2NsYXNzX2ZhY3Rvcic6IDcsCiAgICAgICAgICAgICAgICAnc3RhdGVfdGFibGUnOiBFVUNUV19TVCwKICAgICAgICAgICAgICAgICdjaGFyX2xlbl90YWJsZSc6IEVVQ1RXX0NIQVJfTEVOX1RBQkxFLAogICAgICAgICAgICAgICAgJ25hbWUnOiAneC1ldWMtdHcnfQoKIyBHQjIzMTIKCkdCMjMxMl9DTFMgPSAoCiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDAwIC0gMDcKICAgIDEsMSwxLDEsMSwxLDAsMCwgICMgMDggLSAwZgogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyAxMCAtIDE3CiAgICAxLDEsMSwwLDEsMSwxLDEsICAjIDE4IC0gMWYKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgMjAgLSAyNwogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyAyOCAtIDJmCiAgICAzLDMsMywzLDMsMywzLDMsICAjIDMwIC0gMzcKICAgIDMsMywxLDEsMSwxLDEsMSwgICMgMzggLSAzZgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyA0MCAtIDQ3CiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDQ4IC0gNGYKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgNTAgLSA1NwogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyA1OCAtIDVmCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDYwIC0gNjcKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgNjggLSA2ZgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyA3MCAtIDc3CiAgICAyLDIsMiwyLDIsMiwyLDQsICAjIDc4IC0gN2YKICAgIDUsNiw2LDYsNiw2LDYsNiwgICMgODAgLSA4NwogICAgNiw2LDYsNiw2LDYsNiw2LCAgIyA4OCAtIDhmCiAgICA2LDYsNiw2LDYsNiw2LDYsICAjIDkwIC0gOTcKICAgIDYsNiw2LDYsNiw2LDYsNiwgICMgOTggLSA5ZgogICAgNiw2LDYsNiw2LDYsNiw2LCAgIyBhMCAtIGE3CiAgICA2LDYsNiw2LDYsNiw2LDYsICAjIGE4IC0gYWYKICAgIDYsNiw2LDYsNiw2LDYsNiwgICMgYjAgLSBiNwogICAgNiw2LDYsNiw2LDYsNiw2LCAgIyBiOCAtIGJmCiAgICA2LDYsNiw2LDYsNiw2LDYsICAjIGMwIC0gYzcKICAgIDYsNiw2LDYsNiw2LDYsNiwgICMgYzggLSBjZgogICAgNiw2LDYsNiw2LDYsNiw2LCAgIyBkMCAtIGQ3CiAgICA2LDYsNiw2LDYsNiw2LDYsICAjIGQ4IC0gZGYKICAgIDYsNiw2LDYsNiw2LDYsNiwgICMgZTAgLSBlNwogICAgNiw2LDYsNiw2LDYsNiw2LCAgIyBlOCAtIGVmCiAgICA2LDYsNiw2LDYsNiw2LDYsICAjIGYwIC0gZjcKICAgIDYsNiw2LDYsNiw2LDYsMCAgICMgZjggLSBmZgopCgpHQjIzMTJfU1QgPSAoCiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCwgICAgIDMsTWFjaGluZVN0YXRlLkVSUk9SLCMwMC0wNwogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLCMwOC0wZgogICAgTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULCMxMC0xNwogICAgICAgICA0LE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjMTgtMWYKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsICAgICA1LE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLkVSUk9SLCMyMC0yNwogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCAjMjgtMmYKKQoKIyBUbyBiZSBhY2N1cmF0ZSwgdGhlIGxlbmd0aCBvZiBjbGFzcyA2IGNhbiBiZSBlaXRoZXIgMiBvciA0LgojIEJ1dCBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGRpc2NyaW1pbmF0ZSBiZXR3ZWVuIHRoZSB0d28gc2luY2UKIyBpdCBpcyB1c2VkIGZvciBmcmVxdWVuY3kgYW5hbHlzaXMgb25seSwgYW5kIHdlIGFyZSB2YWxpZGF0aW5nCiMgZWFjaCBjb2RlIHJhbmdlIHRoZXJlIGFzIHdlbGwuIFNvIGl0IGlzIHNhZmUgdG8gc2V0IGl0IHRvIGJlCiMgMiBoZXJlLgpHQjIzMTJfQ0hBUl9MRU5fVEFCTEUgPSAoMCwgMSwgMSwgMSwgMSwgMSwgMikKCkdCMjMxMl9TTV9NT0RFTCA9IHsnY2xhc3NfdGFibGUnOiBHQjIzMTJfQ0xTLAogICAgICAgICAgICAgICAgICAgJ2NsYXNzX2ZhY3Rvcic6IDcsCiAgICAgICAgICAgICAgICAgICAnc3RhdGVfdGFibGUnOiBHQjIzMTJfU1QsCiAgICAgICAgICAgICAgICAgICAnY2hhcl9sZW5fdGFibGUnOiBHQjIzMTJfQ0hBUl9MRU5fVEFCTEUsCiAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdHQjIzMTInfQoKIyBTaGlmdF9KSVMKClNKSVNfQ0xTID0gKAogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyAwMCAtIDA3CiAgICAxLDEsMSwxLDEsMSwwLDAsICAjIDA4IC0gMGYKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgMTAgLSAxNwogICAgMSwxLDEsMCwxLDEsMSwxLCAgIyAxOCAtIDFmCiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDIwIC0gMjcKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgMjggLSAyZgogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyAzMCAtIDM3CiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDM4IC0gM2YKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgNDAgLSA0NwogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyA0OCAtIDRmCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDUwIC0gNTcKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgNTggLSA1ZgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyA2MCAtIDY3CiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIDY4IC0gNmYKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgNzAgLSA3NwogICAgMiwyLDIsMiwyLDIsMiwxLCAgIyA3OCAtIDdmCiAgICAzLDMsMywzLDMsMiwyLDMsICAjIDgwIC0gODcKICAgIDMsMywzLDMsMywzLDMsMywgICMgODggLSA4ZgogICAgMywzLDMsMywzLDMsMywzLCAgIyA5MCAtIDk3CiAgICAzLDMsMywzLDMsMywzLDMsICAjIDk4IC0gOWYKICAgICMweGEwIGlzIGlsbGVnYWwgaW4gc2ppcyBlbmNvZGluZywgYnV0IHNvbWUgcGFnZXMgZG9lcwogICAgI2NvbnRhaW4gc3VjaCBieXRlLiBXZSBuZWVkIHRvIGJlIG1vcmUgZXJyb3IgZm9yZ2l2ZW4uCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIGEwIC0gYTcKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgYTggLSBhZgogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyBiMCAtIGI3CiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIGI4IC0gYmYKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgYzAgLSBjNwogICAgMiwyLDIsMiwyLDIsMiwyLCAgIyBjOCAtIGNmCiAgICAyLDIsMiwyLDIsMiwyLDIsICAjIGQwIC0gZDcKICAgIDIsMiwyLDIsMiwyLDIsMiwgICMgZDggLSBkZgogICAgMywzLDMsMywzLDMsMywzLCAgIyBlMCAtIGU3CiAgICAzLDMsMywzLDMsNCw0LDQsICAjIGU4IC0gZWYKICAgIDMsMywzLDMsMywzLDMsMywgICMgZjAgLSBmNwogICAgMywzLDMsMywzLDAsMCwwKSAgIyBmOCAtIGZmCgoKU0pJU19TVCA9ICgKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULCAgICAgMyxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIzAwLTA3CiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSwjMDgtMGYKICAgIE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCAjMTAtMTcKKQoKU0pJU19DSEFSX0xFTl9UQUJMRSA9ICgwLCAxLCAxLCAyLCAwLCAwKQoKU0pJU19TTV9NT0RFTCA9IHsnY2xhc3NfdGFibGUnOiBTSklTX0NMUywKICAgICAgICAgICAgICAgJ2NsYXNzX2ZhY3Rvcic6IDYsCiAgICAgICAgICAgICAgICdzdGF0ZV90YWJsZSc6IFNKSVNfU1QsCiAgICAgICAgICAgICAgICdjaGFyX2xlbl90YWJsZSc6IFNKSVNfQ0hBUl9MRU5fVEFCTEUsCiAgICAgICAgICAgICAgICduYW1lJzogJ1NoaWZ0X0pJUyd9CgojIFVDUzItQkUKClVDUzJCRV9DTFMgPSAoCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDAwIC0gMDcKICAgIDAsMCwxLDAsMCwyLDAsMCwgICMgMDggLSAwZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyAxMCAtIDE3CiAgICAwLDAsMCwzLDAsMCwwLDAsICAjIDE4IC0gMWYKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgMjAgLSAyNwogICAgMCwzLDMsMywzLDMsMCwwLCAgIyAyOCAtIDJmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDMwIC0gMzcKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgMzggLSAzZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA0MCAtIDQ3CiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDQ4IC0gNGYKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgNTAgLSA1NwogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA1OCAtIDVmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDYwIC0gNjcKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgNjggLSA2ZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA3MCAtIDc3CiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDc4IC0gN2YKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgODAgLSA4NwogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA4OCAtIDhmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDkwIC0gOTcKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgOTggLSA5ZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyBhMCAtIGE3CiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIGE4IC0gYWYKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgYjAgLSBiNwogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyBiOCAtIGJmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIGMwIC0gYzcKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgYzggLSBjZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyBkMCAtIGQ3CiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIGQ4IC0gZGYKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgZTAgLSBlNwogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyBlOCAtIGVmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIGYwIC0gZjcKICAgIDAsMCwwLDAsMCwwLDQsNSAgICMgZjggLSBmZgopCgpVQ1MyQkVfU1QgID0gKAogICAgICAgICAgNSwgICAgIDcsICAgICA3LE1hY2hpbmVTdGF0ZS5FUlJPUiwgICAgIDQsICAgICAzLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIzAwLTA3CiAgICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsIzA4LTBmCiAgICAgTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLCAgICAgNiwgICAgIDYsICAgICA2LCAgICAgNixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCMxMC0xNwogICAgICAgICAgNiwgICAgIDYsICAgICA2LCAgICAgNiwgICAgIDYsTWFjaGluZVN0YXRlLklUU19NRSwgICAgIDYsICAgICA2LCMxOC0xZgogICAgICAgICAgNiwgICAgIDYsICAgICA2LCAgICAgNiwgICAgIDUsICAgICA3LCAgICAgNyxNYWNoaW5lU3RhdGUuRVJST1IsIzIwLTI3CiAgICAgICAgICA1LCAgICAgOCwgICAgIDYsICAgICA2LE1hY2hpbmVTdGF0ZS5FUlJPUiwgICAgIDYsICAgICA2LCAgICAgNiwjMjgtMmYKICAgICAgICAgIDYsICAgICA2LCAgICAgNiwgICAgIDYsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJUICMzMC0zNwopCgpVQ1MyQkVfQ0hBUl9MRU5fVEFCTEUgPSAoMiwgMiwgMiwgMCwgMiwgMikKClVDUzJCRV9TTV9NT0RFTCA9IHsnY2xhc3NfdGFibGUnOiBVQ1MyQkVfQ0xTLAogICAgICAgICAgICAgICAgICAgJ2NsYXNzX2ZhY3Rvcic6IDYsCiAgICAgICAgICAgICAgICAgICAnc3RhdGVfdGFibGUnOiBVQ1MyQkVfU1QsCiAgICAgICAgICAgICAgICAgICAnY2hhcl9sZW5fdGFibGUnOiBVQ1MyQkVfQ0hBUl9MRU5fVEFCTEUsCiAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdVVEYtMTZCRSd9CgojIFVDUzItTEUKClVDUzJMRV9DTFMgPSAoCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDAwIC0gMDcKICAgIDAsMCwxLDAsMCwyLDAsMCwgICMgMDggLSAwZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyAxMCAtIDE3CiAgICAwLDAsMCwzLDAsMCwwLDAsICAjIDE4IC0gMWYKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgMjAgLSAyNwogICAgMCwzLDMsMywzLDMsMCwwLCAgIyAyOCAtIDJmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDMwIC0gMzcKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgMzggLSAzZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA0MCAtIDQ3CiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDQ4IC0gNGYKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgNTAgLSA1NwogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA1OCAtIDVmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDYwIC0gNjcKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgNjggLSA2ZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA3MCAtIDc3CiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDc4IC0gN2YKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgODAgLSA4NwogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyA4OCAtIDhmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIDkwIC0gOTcKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgOTggLSA5ZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyBhMCAtIGE3CiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIGE4IC0gYWYKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgYjAgLSBiNwogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyBiOCAtIGJmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIGMwIC0gYzcKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgYzggLSBjZgogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyBkMCAtIGQ3CiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIGQ4IC0gZGYKICAgIDAsMCwwLDAsMCwwLDAsMCwgICMgZTAgLSBlNwogICAgMCwwLDAsMCwwLDAsMCwwLCAgIyBlOCAtIGVmCiAgICAwLDAsMCwwLDAsMCwwLDAsICAjIGYwIC0gZjcKICAgIDAsMCwwLDAsMCwwLDQsNSAgICMgZjggLSBmZgopCgpVQ1MyTEVfU1QgPSAoCiAgICAgICAgICA2LCAgICAgNiwgICAgIDcsICAgICA2LCAgICAgNCwgICAgIDMsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjMDAtMDcKICAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSwjMDgtMGYKICAgICBNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsICAgICA1LCAgICAgNSwgICAgIDUsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLkVSUk9SLCMxMC0xNwogICAgICAgICAgNSwgICAgIDUsICAgICA1LE1hY2hpbmVTdGF0ZS5FUlJPUiwgICAgIDUsTWFjaGluZVN0YXRlLkVSUk9SLCAgICAgNiwgICAgIDYsIzE4LTFmCiAgICAgICAgICA3LCAgICAgNiwgICAgIDgsICAgICA4LCAgICAgNSwgICAgIDUsICAgICA1LE1hY2hpbmVTdGF0ZS5FUlJPUiwjMjAtMjcKICAgICAgICAgIDUsICAgICA1LCAgICAgNSxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwgICAgIDUsICAgICA1LCMyOC0yZgogICAgICAgICAgNSwgICAgIDUsICAgICA1LE1hY2hpbmVTdGF0ZS5FUlJPUiwgICAgIDUsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQgIzMwLTM3CikKClVDUzJMRV9DSEFSX0xFTl9UQUJMRSA9ICgyLCAyLCAyLCAyLCAyLCAyKQoKVUNTMkxFX1NNX01PREVMID0geydjbGFzc190YWJsZSc6IFVDUzJMRV9DTFMsCiAgICAgICAgICAgICAgICAgJ2NsYXNzX2ZhY3Rvcic6IDYsCiAgICAgICAgICAgICAgICAgJ3N0YXRlX3RhYmxlJzogVUNTMkxFX1NULAogICAgICAgICAgICAgICAgICdjaGFyX2xlbl90YWJsZSc6IFVDUzJMRV9DSEFSX0xFTl9UQUJMRSwKICAgICAgICAgICAgICAgICAnbmFtZSc6ICdVVEYtMTZMRSd9CgojIFVURi04CgpVVEY4X0NMUyA9ICgKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgMDAgLSAwNyAgI2FsbG93IDB4MDAgYXMgYSBsZWdhbCB2YWx1ZQogICAgMSwxLDEsMSwxLDEsMCwwLCAgIyAwOCAtIDBmCiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDEwIC0gMTcKICAgIDEsMSwxLDAsMSwxLDEsMSwgICMgMTggLSAxZgogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyAyMCAtIDI3CiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDI4IC0gMmYKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgMzAgLSAzNwogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyAzOCAtIDNmCiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDQwIC0gNDcKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgNDggLSA0ZgogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyA1MCAtIDU3CiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDU4IC0gNWYKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgNjAgLSA2NwogICAgMSwxLDEsMSwxLDEsMSwxLCAgIyA2OCAtIDZmCiAgICAxLDEsMSwxLDEsMSwxLDEsICAjIDcwIC0gNzcKICAgIDEsMSwxLDEsMSwxLDEsMSwgICMgNzggLSA3ZgogICAgMiwyLDIsMiwzLDMsMywzLCAgIyA4MCAtIDg3CiAgICA0LDQsNCw0LDQsNCw0LDQsICAjIDg4IC0gOGYKICAgIDQsNCw0LDQsNCw0LDQsNCwgICMgOTAgLSA5NwogICAgNCw0LDQsNCw0LDQsNCw0LCAgIyA5OCAtIDlmCiAgICA1LDUsNSw1LDUsNSw1LDUsICAjIGEwIC0gYTcKICAgIDUsNSw1LDUsNSw1LDUsNSwgICMgYTggLSBhZgogICAgNSw1LDUsNSw1LDUsNSw1LCAgIyBiMCAtIGI3CiAgICA1LDUsNSw1LDUsNSw1LDUsICAjIGI4IC0gYmYKICAgIDAsMCw2LDYsNiw2LDYsNiwgICMgYzAgLSBjNwogICAgNiw2LDYsNiw2LDYsNiw2LCAgIyBjOCAtIGNmCiAgICA2LDYsNiw2LDYsNiw2LDYsICAjIGQwIC0gZDcKICAgIDYsNiw2LDYsNiw2LDYsNiwgICMgZDggLSBkZgogICAgNyw4LDgsOCw4LDgsOCw4LCAgIyBlMCAtIGU3CiAgICA4LDgsOCw4LDgsOSw4LDgsICAjIGU4IC0gZWYKICAgIDEwLDExLDExLDExLDExLDExLDExLDExLCAgIyBmMCAtIGY3CiAgICAxMiwxMywxMywxMywxNCwxNSwwLDAgICAgIyBmOCAtIGZmCikKClVURjhfU1QgPSAoCiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwgICAgIDEyLCAgIDEwLCMwMC0wNwogICAgICAgICA5LCAgICAgMTEsICAgICA4LCAgICAgNywgICAgIDYsICAgICA1LCAgICAgNCwgICAgMywjMDgtMGYKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIzEwLTE3CiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCMxOC0xZgogICAgTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLCMyMC0yNwogICAgTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLE1hY2hpbmVTdGF0ZS5JVFNfTUUsTWFjaGluZVN0YXRlLklUU19NRSxNYWNoaW5lU3RhdGUuSVRTX01FLCMyOC0yZgogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwgICAgIDUsICAgICA1LCAgICAgNSwgICAgIDUsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjMzAtMzcKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIzM4LTNmCiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwgICAgIDUsICAgICA1LCAgICAgNSxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCM0MC00NwogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjNDgtNGYKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsICAgICA3LCAgICAgNywgICAgIDcsICAgICA3LE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIzUwLTU3CiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCM1OC01ZgogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCAgICAgNywgICAgIDcsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjNjAtNjcKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIzY4LTZmCiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCAgICAgOSwgICAgIDksICAgICA5LCAgICAgOSxNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCM3MC03NwogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjNzgtN2YKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsICAgICA5LE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIzgwLTg3CiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCM4OC04ZgogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwgICAgMTIsICAgIDEyLCAgICAxMiwgICAgMTIsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjOTAtOTcKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsIzk4LTlmCiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCAgICAxMixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCNhMC1hNwogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjYTgtYWYKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsICAgIDEyLCAgICAxMiwgICAgMTIsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsI2IwLWI3CiAgICBNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLCNiOC1iZgogICAgTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLlNUQVJULE1hY2hpbmVTdGF0ZS5TVEFSVCxNYWNoaW5lU3RhdGUuU1RBUlQsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUiwjYzAtYzcKICAgIE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IsTWFjaGluZVN0YXRlLkVSUk9SLE1hY2hpbmVTdGF0ZS5FUlJPUixNYWNoaW5lU3RhdGUuRVJST1IgI2M4LWNmCikKClVURjhfQ0hBUl9MRU5fVEFCTEUgPSAoMCwgMSwgMCwgMCwgMCwgMCwgMiwgMywgMywgMywgNCwgNCwgNSwgNSwgNiwgNikKClVURjhfU01fTU9ERUwgPSB7J2NsYXNzX3RhYmxlJzogVVRGOF9DTFMsCiAgICAgICAgICAgICAgICAgJ2NsYXNzX2ZhY3Rvcic6IDE2LAogICAgICAgICAgICAgICAgICdzdGF0ZV90YWJsZSc6IFVURjhfU1QsCiAgICAgICAgICAgICAgICAgJ2NoYXJfbGVuX3RhYmxlJzogVVRGOF9DSEFSX0xFTl9UQUJMRSwKICAgICAgICAgICAgICAgICAnbmFtZSc6ICdVVEYtOCd9ClBLAwQUAAAAAAAAACEAHnXvHhkWAAAZFgAANgAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L3NiY2hhcnNldHByb2Jlci5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIE1vemlsbGEgVW5pdmVyc2FsIGNoYXJzZXQgZGV0ZWN0b3IgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDIwMDEKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMgICBTaHkgU2hhbG9tIC0gb3JpZ2luYWwgQyBjb2RlCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmZyb20gLmNoYXJzZXRwcm9iZXIgaW1wb3J0IENoYXJTZXRQcm9iZXIKZnJvbSAuZW51bXMgaW1wb3J0IENoYXJhY3RlckNhdGVnb3J5LCBQcm9iaW5nU3RhdGUsIFNlcXVlbmNlTGlrZWxpaG9vZAoKCmNsYXNzIFNpbmdsZUJ5dGVDaGFyU2V0UHJvYmVyKENoYXJTZXRQcm9iZXIpOgogICAgU0FNUExFX1NJWkUgPSA2NAogICAgU0JfRU5PVUdIX1JFTF9USFJFU0hPTEQgPSAxMDI0ICAjICAwLjI1ICogU0FNUExFX1NJWkVeMgogICAgUE9TSVRJVkVfU0hPUlRDVVRfVEhSRVNIT0xEID0gMC45NQogICAgTkVHQVRJVkVfU0hPUlRDVVRfVEhSRVNIT0xEID0gMC4wNQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtb2RlbCwgcmV2ZXJzZWQ9RmFsc2UsIG5hbWVfcHJvYmVyPU5vbmUpOgogICAgICAgIHN1cGVyKFNpbmdsZUJ5dGVDaGFyU2V0UHJvYmVyLCBzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5fbW9kZWwgPSBtb2RlbAogICAgICAgICMgVFJVRSBpZiB3ZSBuZWVkIHRvIHJldmVyc2UgZXZlcnkgcGFpciBpbiB0aGUgbW9kZWwgbG9va3VwCiAgICAgICAgc2VsZi5fcmV2ZXJzZWQgPSByZXZlcnNlZAogICAgICAgICMgT3B0aW9uYWwgYXV4aWxpYXJ5IHByb2JlciBmb3IgbmFtZSBkZWNpc2lvbgogICAgICAgIHNlbGYuX25hbWVfcHJvYmVyID0gbmFtZV9wcm9iZXIKICAgICAgICBzZWxmLl9sYXN0X29yZGVyID0gTm9uZQogICAgICAgIHNlbGYuX3NlcV9jb3VudGVycyA9IE5vbmUKICAgICAgICBzZWxmLl90b3RhbF9zZXFzID0gTm9uZQogICAgICAgIHNlbGYuX3RvdGFsX2NoYXIgPSBOb25lCiAgICAgICAgc2VsZi5fZnJlcV9jaGFyID0gTm9uZQogICAgICAgIHNlbGYucmVzZXQoKQoKICAgIGRlZiByZXNldChzZWxmKToKICAgICAgICBzdXBlcihTaW5nbGVCeXRlQ2hhclNldFByb2Jlciwgc2VsZikucmVzZXQoKQogICAgICAgICMgY2hhciBvcmRlciBvZiBsYXN0IGNoYXJhY3RlcgogICAgICAgIHNlbGYuX2xhc3Rfb3JkZXIgPSAyNTUKICAgICAgICBzZWxmLl9zZXFfY291bnRlcnMgPSBbMF0gKiBTZXF1ZW5jZUxpa2VsaWhvb2QuZ2V0X251bV9jYXRlZ29yaWVzKCkKICAgICAgICBzZWxmLl90b3RhbF9zZXFzID0gMAogICAgICAgIHNlbGYuX3RvdGFsX2NoYXIgPSAwCiAgICAgICAgIyBjaGFyYWN0ZXJzIHRoYXQgZmFsbCBpbiBvdXIgc2FtcGxpbmcgcmFuZ2UKICAgICAgICBzZWxmLl9mcmVxX2NoYXIgPSAwCgogICAgQHByb3BlcnR5CiAgICBkZWYgY2hhcnNldF9uYW1lKHNlbGYpOgogICAgICAgIGlmIHNlbGYuX25hbWVfcHJvYmVyOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fbmFtZV9wcm9iZXIuY2hhcnNldF9uYW1lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX21vZGVsWydjaGFyc2V0X25hbWUnXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGxhbmd1YWdlKHNlbGYpOgogICAgICAgIGlmIHNlbGYuX25hbWVfcHJvYmVyOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fbmFtZV9wcm9iZXIubGFuZ3VhZ2UKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fbW9kZWwuZ2V0KCdsYW5ndWFnZScpCgogICAgZGVmIGZlZWQoc2VsZiwgYnl0ZV9zdHIpOgogICAgICAgIGlmIG5vdCBzZWxmLl9tb2RlbFsna2VlcF9lbmdsaXNoX2xldHRlciddOgogICAgICAgICAgICBieXRlX3N0ciA9IHNlbGYuZmlsdGVyX2ludGVybmF0aW9uYWxfd29yZHMoYnl0ZV9zdHIpCiAgICAgICAgaWYgbm90IGJ5dGVfc3RyOgogICAgICAgICAgICByZXR1cm4gc2VsZi5zdGF0ZQogICAgICAgIGNoYXJfdG9fb3JkZXJfbWFwID0gc2VsZi5fbW9kZWxbJ2NoYXJfdG9fb3JkZXJfbWFwJ10KICAgICAgICBmb3IgaSwgYyBpbiBlbnVtZXJhdGUoYnl0ZV9zdHIpOgogICAgICAgICAgICAjIFhYWDogT3JkZXIgaXMgaW4gcmFuZ2UgMS02NCwgc28gb25lIHdvdWxkIHRoaW5rIHdlIHdhbnQgMC02MyBoZXJlLAogICAgICAgICAgICAjICAgICAgYnV0IHRoYXQgbGVhZHMgdG8gMjcgbW9yZSB0ZXN0IGZhaWx1cmVzIHRoYW4gYmVmb3JlLgogICAgICAgICAgICBvcmRlciA9IGNoYXJfdG9fb3JkZXJfbWFwW2NdCiAgICAgICAgICAgICMgWFhYOiBUaGlzIHdhcyBTWU1CT0xfQ0FUX09SREVSIGJlZm9yZSwgd2l0aCBhIHZhbHVlIG9mIDI1MCwgYnV0CiAgICAgICAgICAgICMgICAgICBDaGFyYWN0ZXJDYXRlZ29yeS5TWU1CT0wgaXMgYWN0dWFsbHkgMjUzLCBzbyB3ZSB1c2UgQ09OVFJPTAogICAgICAgICAgICAjICAgICAgdG8gbWFrZSBpdCBjbG9zZXIgdG8gdGhlIG9yaWdpbmFsIGludGVudC4gVGhlIG9ubHkgZGlmZmVyZW5jZQogICAgICAgICAgICAjICAgICAgaXMgd2hldGhlciBvciBub3Qgd2UgY291bnQgZGlnaXRzIGFuZCBjb250cm9sIGNoYXJhY3RlcnMgZm9yCiAgICAgICAgICAgICMgICAgICBfdG90YWxfY2hhciBwdXJwb3Nlcy4KICAgICAgICAgICAgaWYgb3JkZXIgPCBDaGFyYWN0ZXJDYXRlZ29yeS5DT05UUk9MOgogICAgICAgICAgICAgICAgc2VsZi5fdG90YWxfY2hhciArPSAxCiAgICAgICAgICAgIGlmIG9yZGVyIDwgc2VsZi5TQU1QTEVfU0laRToKICAgICAgICAgICAgICAgIHNlbGYuX2ZyZXFfY2hhciArPSAxCiAgICAgICAgICAgICAgICBpZiBzZWxmLl9sYXN0X29yZGVyIDwgc2VsZi5TQU1QTEVfU0laRToKICAgICAgICAgICAgICAgICAgICBzZWxmLl90b3RhbF9zZXFzICs9IDEKICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5fcmV2ZXJzZWQ6CiAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAoc2VsZi5fbGFzdF9vcmRlciAqIHNlbGYuU0FNUExFX1NJWkUpICsgb3JkZXIKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwgPSBzZWxmLl9tb2RlbFsncHJlY2VkZW5jZV9tYXRyaXgnXVtpXQogICAgICAgICAgICAgICAgICAgIGVsc2U6ICAjIHJldmVyc2UgdGhlIG9yZGVyIG9mIHRoZSBsZXR0ZXJzIGluIHRoZSBsb29rdXAKICAgICAgICAgICAgICAgICAgICAgICAgaSA9IChvcmRlciAqIHNlbGYuU0FNUExFX1NJWkUpICsgc2VsZi5fbGFzdF9vcmRlcgogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbCA9IHNlbGYuX21vZGVsWydwcmVjZWRlbmNlX21hdHJpeCddW2ldCiAgICAgICAgICAgICAgICAgICAgc2VsZi5fc2VxX2NvdW50ZXJzW21vZGVsXSArPSAxCiAgICAgICAgICAgIHNlbGYuX2xhc3Rfb3JkZXIgPSBvcmRlcgoKICAgICAgICBjaGFyc2V0X25hbWUgPSBzZWxmLl9tb2RlbFsnY2hhcnNldF9uYW1lJ10KICAgICAgICBpZiBzZWxmLnN0YXRlID09IFByb2JpbmdTdGF0ZS5ERVRFQ1RJTkc6CiAgICAgICAgICAgIGlmIHNlbGYuX3RvdGFsX3NlcXMgPiBzZWxmLlNCX0VOT1VHSF9SRUxfVEhSRVNIT0xEOgogICAgICAgICAgICAgICAgY29uZmlkZW5jZSA9IHNlbGYuZ2V0X2NvbmZpZGVuY2UoKQogICAgICAgICAgICAgICAgaWYgY29uZmlkZW5jZSA+IHNlbGYuUE9TSVRJVkVfU0hPUlRDVVRfVEhSRVNIT0xEOgogICAgICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKCclcyBjb25maWRlbmNlID0gJXMsIHdlIGhhdmUgYSB3aW5uZXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzZXRfbmFtZSwgY29uZmlkZW5jZSkKICAgICAgICAgICAgICAgICAgICBzZWxmLl9zdGF0ZSA9IFByb2JpbmdTdGF0ZS5GT1VORF9JVAogICAgICAgICAgICAgICAgZWxpZiBjb25maWRlbmNlIDwgc2VsZi5ORUdBVElWRV9TSE9SVENVVF9USFJFU0hPTEQ6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoJyVzIGNvbmZpZGVuY2UgPSAlcywgYmVsb3cgbmVnYXRpdmUgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzaG9ydGN1dCB0aHJlc2hob2xkICVzJywgY2hhcnNldF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZGVuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ORUdBVElWRV9TSE9SVENVVF9USFJFU0hPTEQpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5fc3RhdGUgPSBQcm9iaW5nU3RhdGUuTk9UX01FCgogICAgICAgIHJldHVybiBzZWxmLnN0YXRlCgogICAgZGVmIGdldF9jb25maWRlbmNlKHNlbGYpOgogICAgICAgIHIgPSAwLjAxCiAgICAgICAgaWYgc2VsZi5fdG90YWxfc2VxcyA+IDA6CiAgICAgICAgICAgIHIgPSAoKDEuMCAqIHNlbGYuX3NlcV9jb3VudGVyc1tTZXF1ZW5jZUxpa2VsaWhvb2QuUE9TSVRJVkVdKSAvCiAgICAgICAgICAgICAgICAgc2VsZi5fdG90YWxfc2VxcyAvIHNlbGYuX21vZGVsWyd0eXBpY2FsX3Bvc2l0aXZlX3JhdGlvJ10pCiAgICAgICAgICAgIHIgPSByICogc2VsZi5fZnJlcV9jaGFyIC8gc2VsZi5fdG90YWxfY2hhcgogICAgICAgICAgICBpZiByID49IDEuMDoKICAgICAgICAgICAgICAgIHIgPSAwLjk5CiAgICAgICAgcmV0dXJuIHIKUEsDBBQAAAAAAAAAIQCK/k+g2g0AANoNAAA2AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvc2Jjc2dyb3VwcHJvYmVyLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBVbml2ZXJzYWwgY2hhcnNldCBkZXRlY3RvciBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAwMQojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIyAgIFNoeSBTaGFsb20gLSBvcmlnaW5hbCBDIGNvZGUKIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZnJvbSAuY2hhcnNldGdyb3VwcHJvYmVyIGltcG9ydCBDaGFyU2V0R3JvdXBQcm9iZXIKZnJvbSAuc2JjaGFyc2V0cHJvYmVyIGltcG9ydCBTaW5nbGVCeXRlQ2hhclNldFByb2Jlcgpmcm9tIC5sYW5nY3lyaWxsaWNtb2RlbCBpbXBvcnQgKFdpbjEyNTFDeXJpbGxpY01vZGVsLCBLb2k4ck1vZGVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhdGluNUN5cmlsbGljTW9kZWwsIE1hY0N5cmlsbGljTW9kZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWJtODY2TW9kZWwsIElibTg1NU1vZGVsKQpmcm9tIC5sYW5nZ3JlZWttb2RlbCBpbXBvcnQgTGF0aW43R3JlZWtNb2RlbCwgV2luMTI1M0dyZWVrTW9kZWwKZnJvbSAubGFuZ2J1bGdhcmlhbm1vZGVsIGltcG9ydCBMYXRpbjVCdWxnYXJpYW5Nb2RlbCwgV2luMTI1MUJ1bGdhcmlhbk1vZGVsCiMgZnJvbSAubGFuZ2h1bmdhcmlhbm1vZGVsIGltcG9ydCBMYXRpbjJIdW5nYXJpYW5Nb2RlbCwgV2luMTI1MEh1bmdhcmlhbk1vZGVsCmZyb20gLmxhbmd0aGFpbW9kZWwgaW1wb3J0IFRJUzYyMFRoYWlNb2RlbApmcm9tIC5sYW5naGVicmV3bW9kZWwgaW1wb3J0IFdpbjEyNTVIZWJyZXdNb2RlbApmcm9tIC5oZWJyZXdwcm9iZXIgaW1wb3J0IEhlYnJld1Byb2Jlcgpmcm9tIC5sYW5ndHVya2lzaG1vZGVsIGltcG9ydCBMYXRpbjVUdXJraXNoTW9kZWwKCgpjbGFzcyBTQkNTR3JvdXBQcm9iZXIoQ2hhclNldEdyb3VwUHJvYmVyKToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzdXBlcihTQkNTR3JvdXBQcm9iZXIsIHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLnByb2JlcnMgPSBbCiAgICAgICAgICAgIFNpbmdsZUJ5dGVDaGFyU2V0UHJvYmVyKFdpbjEyNTFDeXJpbGxpY01vZGVsKSwKICAgICAgICAgICAgU2luZ2xlQnl0ZUNoYXJTZXRQcm9iZXIoS29pOHJNb2RlbCksCiAgICAgICAgICAgIFNpbmdsZUJ5dGVDaGFyU2V0UHJvYmVyKExhdGluNUN5cmlsbGljTW9kZWwpLAogICAgICAgICAgICBTaW5nbGVCeXRlQ2hhclNldFByb2JlcihNYWNDeXJpbGxpY01vZGVsKSwKICAgICAgICAgICAgU2luZ2xlQnl0ZUNoYXJTZXRQcm9iZXIoSWJtODY2TW9kZWwpLAogICAgICAgICAgICBTaW5nbGVCeXRlQ2hhclNldFByb2JlcihJYm04NTVNb2RlbCksCiAgICAgICAgICAgIFNpbmdsZUJ5dGVDaGFyU2V0UHJvYmVyKExhdGluN0dyZWVrTW9kZWwpLAogICAgICAgICAgICBTaW5nbGVCeXRlQ2hhclNldFByb2JlcihXaW4xMjUzR3JlZWtNb2RlbCksCiAgICAgICAgICAgIFNpbmdsZUJ5dGVDaGFyU2V0UHJvYmVyKExhdGluNUJ1bGdhcmlhbk1vZGVsKSwKICAgICAgICAgICAgU2luZ2xlQnl0ZUNoYXJTZXRQcm9iZXIoV2luMTI1MUJ1bGdhcmlhbk1vZGVsKSwKICAgICAgICAgICAgIyBUT0RPOiBSZXN0b3JlIEh1bmdhcmlhbiBlbmNvZGluZ3MgKGlzby04ODU5LTIgYW5kIHdpbmRvd3MtMTI1MCkKICAgICAgICAgICAgIyAgICAgICBhZnRlciB3ZSByZXRyYWluIG1vZGVsLgogICAgICAgICAgICAjIFNpbmdsZUJ5dGVDaGFyU2V0UHJvYmVyKExhdGluMkh1bmdhcmlhbk1vZGVsKSwKICAgICAgICAgICAgIyBTaW5nbGVCeXRlQ2hhclNldFByb2JlcihXaW4xMjUwSHVuZ2FyaWFuTW9kZWwpLAogICAgICAgICAgICBTaW5nbGVCeXRlQ2hhclNldFByb2JlcihUSVM2MjBUaGFpTW9kZWwpLAogICAgICAgICAgICBTaW5nbGVCeXRlQ2hhclNldFByb2JlcihMYXRpbjVUdXJraXNoTW9kZWwpLAogICAgICAgIF0KICAgICAgICBoZWJyZXdfcHJvYmVyID0gSGVicmV3UHJvYmVyKCkKICAgICAgICBsb2dpY2FsX2hlYnJld19wcm9iZXIgPSBTaW5nbGVCeXRlQ2hhclNldFByb2JlcihXaW4xMjU1SGVicmV3TW9kZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFsc2UsIGhlYnJld19wcm9iZXIpCiAgICAgICAgdmlzdWFsX2hlYnJld19wcm9iZXIgPSBTaW5nbGVCeXRlQ2hhclNldFByb2JlcihXaW4xMjU1SGVicmV3TW9kZWwsIFRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWJyZXdfcHJvYmVyKQogICAgICAgIGhlYnJld19wcm9iZXIuc2V0X21vZGVsX3Byb2JlcnMobG9naWNhbF9oZWJyZXdfcHJvYmVyLCB2aXN1YWxfaGVicmV3X3Byb2JlcikKICAgICAgICBzZWxmLnByb2JlcnMuZXh0ZW5kKFtoZWJyZXdfcHJvYmVyLCBsb2dpY2FsX2hlYnJld19wcm9iZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzdWFsX2hlYnJld19wcm9iZXJdKQoKICAgICAgICBzZWxmLnJlc2V0KCkKUEsDBBQAAAAAAAAAIQDWkWcyvg4AAL4OAAAxAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvc2ppc3Byb2Jlci5weSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCRUdJTiBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIFRoZSBPcmlnaW5hbCBDb2RlIGlzIG1vemlsbGEub3JnIGNvZGUuCiMKIyBUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMKIyBOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbi4KIyBQb3J0aW9ucyBjcmVhdGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhcmUgQ29weXJpZ2h0IChDKSAxOTk4CiMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgQ29udHJpYnV0b3Iocyk6CiMgICBNYXJrIFBpbGdyaW0gLSBwb3J0IHRvIFB5dGhvbgojCiMgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgojIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKIyB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKIyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKIyAwMjExMC0xMzAxICBVU0EKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBFTkQgTElDRU5TRSBCTE9DSyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpmcm9tIC5tYmNoYXJzZXRwcm9iZXIgaW1wb3J0IE11bHRpQnl0ZUNoYXJTZXRQcm9iZXIKZnJvbSAuY29kaW5nc3RhdGVtYWNoaW5lIGltcG9ydCBDb2RpbmdTdGF0ZU1hY2hpbmUKZnJvbSAuY2hhcmRpc3RyaWJ1dGlvbiBpbXBvcnQgU0pJU0Rpc3RyaWJ1dGlvbkFuYWx5c2lzCmZyb20gLmpwY250eCBpbXBvcnQgU0pJU0NvbnRleHRBbmFseXNpcwpmcm9tIC5tYmNzc20gaW1wb3J0IFNKSVNfU01fTU9ERUwKZnJvbSAuZW51bXMgaW1wb3J0IFByb2JpbmdTdGF0ZSwgTWFjaGluZVN0YXRlCgoKY2xhc3MgU0pJU1Byb2JlcihNdWx0aUJ5dGVDaGFyU2V0UHJvYmVyKToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzdXBlcihTSklTUHJvYmVyLCBzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5jb2Rpbmdfc20gPSBDb2RpbmdTdGF0ZU1hY2hpbmUoU0pJU19TTV9NT0RFTCkKICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbl9hbmFseXplciA9IFNKSVNEaXN0cmlidXRpb25BbmFseXNpcygpCiAgICAgICAgc2VsZi5jb250ZXh0X2FuYWx5emVyID0gU0pJU0NvbnRleHRBbmFseXNpcygpCiAgICAgICAgc2VsZi5yZXNldCgpCgogICAgZGVmIHJlc2V0KHNlbGYpOgogICAgICAgIHN1cGVyKFNKSVNQcm9iZXIsIHNlbGYpLnJlc2V0KCkKICAgICAgICBzZWxmLmNvbnRleHRfYW5hbHl6ZXIucmVzZXQoKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNoYXJzZXRfbmFtZShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5jb250ZXh0X2FuYWx5emVyLmNoYXJzZXRfbmFtZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGxhbmd1YWdlKHNlbGYpOgogICAgICAgIHJldHVybiAiSmFwYW5lc2UiCgogICAgZGVmIGZlZWQoc2VsZiwgYnl0ZV9zdHIpOgogICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihieXRlX3N0cikpOgogICAgICAgICAgICBjb2Rpbmdfc3RhdGUgPSBzZWxmLmNvZGluZ19zbS5uZXh0X3N0YXRlKGJ5dGVfc3RyW2ldKQogICAgICAgICAgICBpZiBjb2Rpbmdfc3RhdGUgPT0gTWFjaGluZVN0YXRlLkVSUk9SOgogICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoJyVzICVzIHByb2JlciBoaXQgZXJyb3IgYXQgYnl0ZSAlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNoYXJzZXRfbmFtZSwgc2VsZi5sYW5ndWFnZSwgaSkKICAgICAgICAgICAgICAgIHNlbGYuX3N0YXRlID0gUHJvYmluZ1N0YXRlLk5PVF9NRQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZWxpZiBjb2Rpbmdfc3RhdGUgPT0gTWFjaGluZVN0YXRlLklUU19NRToKICAgICAgICAgICAgICAgIHNlbGYuX3N0YXRlID0gUHJvYmluZ1N0YXRlLkZPVU5EX0lUCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBlbGlmIGNvZGluZ19zdGF0ZSA9PSBNYWNoaW5lU3RhdGUuU1RBUlQ6CiAgICAgICAgICAgICAgICBjaGFyX2xlbiA9IHNlbGYuY29kaW5nX3NtLmdldF9jdXJyZW50X2NoYXJsZW4oKQogICAgICAgICAgICAgICAgaWYgaSA9PSAwOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2xhc3RfY2hhclsxXSA9IGJ5dGVfc3RyWzBdCiAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250ZXh0X2FuYWx5emVyLmZlZWQoc2VsZi5fbGFzdF9jaGFyWzIgLSBjaGFyX2xlbjpdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfbGVuKQogICAgICAgICAgICAgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uX2FuYWx5emVyLmZlZWQoc2VsZi5fbGFzdF9jaGFyLCBjaGFyX2xlbikKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250ZXh0X2FuYWx5emVyLmZlZWQoYnl0ZV9zdHJbaSArIDEgLSBjaGFyX2xlbjppICsgMwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gY2hhcl9sZW5dLCBjaGFyX2xlbikKICAgICAgICAgICAgICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbl9hbmFseXplci5mZWVkKGJ5dGVfc3RyW2kgLSAxOmkgKyAxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfbGVuKQoKICAgICAgICBzZWxmLl9sYXN0X2NoYXJbMF0gPSBieXRlX3N0clstMV0KCiAgICAgICAgaWYgc2VsZi5zdGF0ZSA9PSBQcm9iaW5nU3RhdGUuREVURUNUSU5HOgogICAgICAgICAgICBpZiAoc2VsZi5jb250ZXh0X2FuYWx5emVyLmdvdF9lbm91Z2hfZGF0YSgpIGFuZAogICAgICAgICAgICAgICAoc2VsZi5nZXRfY29uZmlkZW5jZSgpID4gc2VsZi5TSE9SVENVVF9USFJFU0hPTEQpKToKICAgICAgICAgICAgICAgIHNlbGYuX3N0YXRlID0gUHJvYmluZ1N0YXRlLkZPVU5EX0lUCgogICAgICAgIHJldHVybiBzZWxmLnN0YXRlCgogICAgZGVmIGdldF9jb25maWRlbmNlKHNlbGYpOgogICAgICAgIGNvbnRleHRfY29uZiA9IHNlbGYuY29udGV4dF9hbmFseXplci5nZXRfY29uZmlkZW5jZSgpCiAgICAgICAgZGlzdHJpYl9jb25mID0gc2VsZi5kaXN0cmlidXRpb25fYW5hbHl6ZXIuZ2V0X2NvbmZpZGVuY2UoKQogICAgICAgIHJldHVybiBtYXgoY29udGV4dF9jb25mLCBkaXN0cmliX2NvbmYpClBLAwQUAAAAAAAAACEAdYBHPcUwAADFMAAAOAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L3VuaXZlcnNhbGRldGVjdG9yLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgTW96aWxsYSBVbml2ZXJzYWwgY2hhcnNldCBkZXRlY3RvciBjb2RlLgojCiMgVGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGlzCiMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uCiMgUG9ydGlvbnMgY3JlYXRlZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYXJlIENvcHlyaWdodCAoQykgMjAwMQojIHRoZSBJbml0aWFsIERldmVsb3Blci4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIwojIENvbnRyaWJ1dG9yKHMpOgojICAgTWFyayBQaWxncmltIC0gcG9ydCB0byBQeXRob24KIyAgIFNoeSBTaGFsb20gLSBvcmlnaW5hbCBDIGNvZGUKIwojIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKIyBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiMgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKIyBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCiMgMDIxMTAtMTMwMSAgVVNBCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRU5EIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoiIiIKTW9kdWxlIGNvbnRhaW5pbmcgdGhlIFVuaXZlcnNhbERldGVjdG9yIGRldGVjdG9yIGNsYXNzLCB3aGljaCBpcyB0aGUgcHJpbWFyeQpjbGFzcyBhIHVzZXIgb2YgYGBjaGFyZGV0YGAgc2hvdWxkIHVzZS4KCjphdXRob3I6IE1hcmsgUGlsZ3JpbSAoaW5pdGlhbCBwb3J0IHRvIFB5dGhvbikKOmF1dGhvcjogU2h5IFNoYWxvbSAob3JpZ2luYWwgQyBjb2RlKQo6YXV0aG9yOiBEYW4gQmxhbmNoYXJkIChtYWpvciByZWZhY3RvcmluZyBmb3IgMy4wKQo6YXV0aG9yOiBJYW4gQ29yZGFzY28KIiIiCgoKaW1wb3J0IGNvZGVjcwppbXBvcnQgbG9nZ2luZwppbXBvcnQgcmUKCmZyb20gLmNoYXJzZXRncm91cHByb2JlciBpbXBvcnQgQ2hhclNldEdyb3VwUHJvYmVyCmZyb20gLmVudW1zIGltcG9ydCBJbnB1dFN0YXRlLCBMYW5ndWFnZUZpbHRlciwgUHJvYmluZ1N0YXRlCmZyb20gLmVzY3Byb2JlciBpbXBvcnQgRXNjQ2hhclNldFByb2Jlcgpmcm9tIC5sYXRpbjFwcm9iZXIgaW1wb3J0IExhdGluMVByb2Jlcgpmcm9tIC5tYmNzZ3JvdXBwcm9iZXIgaW1wb3J0IE1CQ1NHcm91cFByb2Jlcgpmcm9tIC5zYmNzZ3JvdXBwcm9iZXIgaW1wb3J0IFNCQ1NHcm91cFByb2JlcgoKCmNsYXNzIFVuaXZlcnNhbERldGVjdG9yKG9iamVjdCk6CiAgICAiIiIKICAgIFRoZSBgYFVuaXZlcnNhbERldGVjdG9yYGAgY2xhc3MgdW5kZXJsaWVzIHRoZSBgYGNoYXJkZXQuZGV0ZWN0YGAgZnVuY3Rpb24KICAgIGFuZCBjb29yZGluYXRlcyBhbGwgb2YgdGhlIGRpZmZlcmVudCBjaGFyc2V0IHByb2JlcnMuCgogICAgVG8gZ2V0IGEgYGBkaWN0YGAgY29udGFpbmluZyBhbiBlbmNvZGluZyBhbmQgaXRzIGNvbmZpZGVuY2UsIHlvdSBjYW4gc2ltcGx5CiAgICBydW46CgogICAgLi4gY29kZTo6CgogICAgICAgICAgICB1ID0gVW5pdmVyc2FsRGV0ZWN0b3IoKQogICAgICAgICAgICB1LmZlZWQoc29tZV9ieXRlcykKICAgICAgICAgICAgdS5jbG9zZSgpCiAgICAgICAgICAgIGRldGVjdGVkID0gdS5yZXN1bHQKCiAgICAiIiIKCiAgICBNSU5JTVVNX1RIUkVTSE9MRCA9IDAuMjAKICAgIEhJR0hfQllURV9ERVRFQ1RPUiA9IHJlLmNvbXBpbGUoYidbXHg4MC1ceEZGXScpCiAgICBFU0NfREVURUNUT1IgPSByZS5jb21waWxlKGInKFwwMzN8fnspJykKICAgIFdJTl9CWVRFX0RFVEVDVE9SID0gcmUuY29tcGlsZShiJ1tceDgwLVx4OUZdJykKICAgIElTT19XSU5fTUFQID0geydpc28tODg1OS0xJzogJ1dpbmRvd3MtMTI1MicsCiAgICAgICAgICAgICAgICAgICAnaXNvLTg4NTktMic6ICdXaW5kb3dzLTEyNTAnLAogICAgICAgICAgICAgICAgICAgJ2lzby04ODU5LTUnOiAnV2luZG93cy0xMjUxJywKICAgICAgICAgICAgICAgICAgICdpc28tODg1OS02JzogJ1dpbmRvd3MtMTI1NicsCiAgICAgICAgICAgICAgICAgICAnaXNvLTg4NTktNyc6ICdXaW5kb3dzLTEyNTMnLAogICAgICAgICAgICAgICAgICAgJ2lzby04ODU5LTgnOiAnV2luZG93cy0xMjU1JywKICAgICAgICAgICAgICAgICAgICdpc28tODg1OS05JzogJ1dpbmRvd3MtMTI1NCcsCiAgICAgICAgICAgICAgICAgICAnaXNvLTg4NTktMTMnOiAnV2luZG93cy0xMjU3J30KCiAgICBkZWYgX19pbml0X18oc2VsZiwgbGFuZ19maWx0ZXI9TGFuZ3VhZ2VGaWx0ZXIuQUxMKToKICAgICAgICBzZWxmLl9lc2NfY2hhcnNldF9wcm9iZXIgPSBOb25lCiAgICAgICAgc2VsZi5fY2hhcnNldF9wcm9iZXJzID0gW10KICAgICAgICBzZWxmLnJlc3VsdCA9IE5vbmUKICAgICAgICBzZWxmLmRvbmUgPSBOb25lCiAgICAgICAgc2VsZi5fZ290X2RhdGEgPSBOb25lCiAgICAgICAgc2VsZi5faW5wdXRfc3RhdGUgPSBOb25lCiAgICAgICAgc2VsZi5fbGFzdF9jaGFyID0gTm9uZQogICAgICAgIHNlbGYubGFuZ19maWx0ZXIgPSBsYW5nX2ZpbHRlcgogICAgICAgIHNlbGYubG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCiAgICAgICAgc2VsZi5faGFzX3dpbl9ieXRlcyA9IE5vbmUKICAgICAgICBzZWxmLnJlc2V0KCkKCiAgICBkZWYgcmVzZXQoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmVzZXQgdGhlIFVuaXZlcnNhbERldGVjdG9yIGFuZCBhbGwgb2YgaXRzIHByb2JlcnMgYmFjayB0byB0aGVpcgogICAgICAgIGluaXRpYWwgc3RhdGVzLiAgVGhpcyBpcyBjYWxsZWQgYnkgYGBfX2luaXRfX2BgLCBzbyB5b3Ugb25seSBuZWVkIHRvCiAgICAgICAgY2FsbCB0aGlzIGRpcmVjdGx5IGluIGJldHdlZW4gYW5hbHlzZXMgb2YgZGlmZmVyZW50IGRvY3VtZW50cy4KICAgICAgICAiIiIKICAgICAgICBzZWxmLnJlc3VsdCA9IHsnZW5jb2RpbmcnOiBOb25lLCAnY29uZmlkZW5jZSc6IDAuMCwgJ2xhbmd1YWdlJzogTm9uZX0KICAgICAgICBzZWxmLmRvbmUgPSBGYWxzZQogICAgICAgIHNlbGYuX2dvdF9kYXRhID0gRmFsc2UKICAgICAgICBzZWxmLl9oYXNfd2luX2J5dGVzID0gRmFsc2UKICAgICAgICBzZWxmLl9pbnB1dF9zdGF0ZSA9IElucHV0U3RhdGUuUFVSRV9BU0NJSQogICAgICAgIHNlbGYuX2xhc3RfY2hhciA9IGInJwogICAgICAgIGlmIHNlbGYuX2VzY19jaGFyc2V0X3Byb2JlcjoKICAgICAgICAgICAgc2VsZi5fZXNjX2NoYXJzZXRfcHJvYmVyLnJlc2V0KCkKICAgICAgICBmb3IgcHJvYmVyIGluIHNlbGYuX2NoYXJzZXRfcHJvYmVyczoKICAgICAgICAgICAgcHJvYmVyLnJlc2V0KCkKCiAgICBkZWYgZmVlZChzZWxmLCBieXRlX3N0cik6CiAgICAgICAgIiIiCiAgICAgICAgVGFrZXMgYSBjaHVuayBvZiBhIGRvY3VtZW50IGFuZCBmZWVkcyBpdCB0aHJvdWdoIGFsbCBvZiB0aGUgcmVsZXZhbnQKICAgICAgICBjaGFyc2V0IHByb2JlcnMuCgogICAgICAgIEFmdGVyIGNhbGxpbmcgYGBmZWVkYGAsIHlvdSBjYW4gY2hlY2sgdGhlIHZhbHVlIG9mIHRoZSBgYGRvbmVgYAogICAgICAgIGF0dHJpYnV0ZSB0byBzZWUgaWYgeW91IG5lZWQgdG8gY29udGludWUgZmVlZGluZyB0aGUKICAgICAgICBgYFVuaXZlcnNhbERldGVjdG9yYGAgbW9yZSBkYXRhLCBvciBpZiBpdCBoYXMgbWFkZSBhIHByZWRpY3Rpb24KICAgICAgICAoaW4gdGhlIGBgcmVzdWx0YGAgYXR0cmlidXRlKS4KCiAgICAgICAgLi4gbm90ZTo6CiAgICAgICAgICAgWW91IHNob3VsZCBhbHdheXMgY2FsbCBgYGNsb3NlYGAgd2hlbiB5b3UncmUgZG9uZSBmZWVkaW5nIGluIHlvdXIKICAgICAgICAgICBkb2N1bWVudCBpZiBgYGRvbmVgYCBpcyBub3QgYWxyZWFkeSBgYFRydWVgYC4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLmRvbmU6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBpZiBub3QgbGVuKGJ5dGVfc3RyKToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGJ5dGVfc3RyLCBieXRlYXJyYXkpOgogICAgICAgICAgICBieXRlX3N0ciA9IGJ5dGVhcnJheShieXRlX3N0cikKCiAgICAgICAgIyBGaXJzdCBjaGVjayBmb3Iga25vd24gQk9Ncywgc2luY2UgdGhlc2UgYXJlIGd1YXJhbnRlZWQgdG8gYmUgY29ycmVjdAogICAgICAgIGlmIG5vdCBzZWxmLl9nb3RfZGF0YToKICAgICAgICAgICAgIyBJZiB0aGUgZGF0YSBzdGFydHMgd2l0aCBCT00sIHdlIGtub3cgaXQgaXMgVVRGCiAgICAgICAgICAgIGlmIGJ5dGVfc3RyLnN0YXJ0c3dpdGgoY29kZWNzLkJPTV9VVEY4KToKICAgICAgICAgICAgICAgICMgRUYgQkIgQkYgIFVURi04IHdpdGggQk9NCiAgICAgICAgICAgICAgICBzZWxmLnJlc3VsdCA9IHsnZW5jb2RpbmcnOiAiVVRGLTgtU0lHIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb25maWRlbmNlJzogMS4wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xhbmd1YWdlJzogJyd9CiAgICAgICAgICAgIGVsaWYgYnl0ZV9zdHIuc3RhcnRzd2l0aCgoY29kZWNzLkJPTV9VVEYzMl9MRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuQk9NX1VURjMyX0JFKSk6CiAgICAgICAgICAgICAgICAjIEZGIEZFIDAwIDAwICBVVEYtMzIsIGxpdHRsZS1lbmRpYW4gQk9NCiAgICAgICAgICAgICAgICAjIDAwIDAwIEZFIEZGICBVVEYtMzIsIGJpZy1lbmRpYW4gQk9NCiAgICAgICAgICAgICAgICBzZWxmLnJlc3VsdCA9IHsnZW5jb2RpbmcnOiAiVVRGLTMyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb25maWRlbmNlJzogMS4wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xhbmd1YWdlJzogJyd9CiAgICAgICAgICAgIGVsaWYgYnl0ZV9zdHIuc3RhcnRzd2l0aChiJ1x4RkVceEZGXHgwMFx4MDAnKToKICAgICAgICAgICAgICAgICMgRkUgRkYgMDAgMDAgIFVDUy00LCB1bnVzdWFsIG9jdGV0IG9yZGVyIEJPTSAoMzQxMikKICAgICAgICAgICAgICAgIHNlbGYucmVzdWx0ID0geydlbmNvZGluZyc6ICJYLUlTTy0xMDY0Ni1VQ1MtNC0zNDEyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb25maWRlbmNlJzogMS4wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xhbmd1YWdlJzogJyd9CiAgICAgICAgICAgIGVsaWYgYnl0ZV9zdHIuc3RhcnRzd2l0aChiJ1x4MDBceDAwXHhGRlx4RkUnKToKICAgICAgICAgICAgICAgICMgMDAgMDAgRkYgRkUgIFVDUy00LCB1bnVzdWFsIG9jdGV0IG9yZGVyIEJPTSAoMjE0MykKICAgICAgICAgICAgICAgIHNlbGYucmVzdWx0ID0geydlbmNvZGluZyc6ICJYLUlTTy0xMDY0Ni1VQ1MtNC0yMTQzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb25maWRlbmNlJzogMS4wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xhbmd1YWdlJzogJyd9CiAgICAgICAgICAgIGVsaWYgYnl0ZV9zdHIuc3RhcnRzd2l0aCgoY29kZWNzLkJPTV9MRSwgY29kZWNzLkJPTV9CRSkpOgogICAgICAgICAgICAgICAgIyBGRiBGRSAgVVRGLTE2LCBsaXR0bGUgZW5kaWFuIEJPTQogICAgICAgICAgICAgICAgIyBGRSBGRiAgVVRGLTE2LCBiaWcgZW5kaWFuIEJPTQogICAgICAgICAgICAgICAgc2VsZi5yZXN1bHQgPSB7J2VuY29kaW5nJzogIlVURi0xNiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29uZmlkZW5jZSc6IDEuMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZSc6ICcnfQoKICAgICAgICAgICAgc2VsZi5fZ290X2RhdGEgPSBUcnVlCiAgICAgICAgICAgIGlmIHNlbGYucmVzdWx0WydlbmNvZGluZyddIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgc2VsZi5kb25lID0gVHJ1ZQogICAgICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICMgSWYgbm9uZSBvZiB0aG9zZSBtYXRjaGVkIGFuZCB3ZSd2ZSBvbmx5IHNlZSBBU0NJSSBzbyBmYXIsIGNoZWNrCiAgICAgICAgIyBmb3IgaGlnaCBieXRlcyBhbmQgZXNjYXBlIHNlcXVlbmNlcwogICAgICAgIGlmIHNlbGYuX2lucHV0X3N0YXRlID09IElucHV0U3RhdGUuUFVSRV9BU0NJSToKICAgICAgICAgICAgaWYgc2VsZi5ISUdIX0JZVEVfREVURUNUT1Iuc2VhcmNoKGJ5dGVfc3RyKToKICAgICAgICAgICAgICAgIHNlbGYuX2lucHV0X3N0YXRlID0gSW5wdXRTdGF0ZS5ISUdIX0JZVEUKICAgICAgICAgICAgZWxpZiBzZWxmLl9pbnB1dF9zdGF0ZSA9PSBJbnB1dFN0YXRlLlBVUkVfQVNDSUkgYW5kIFwKICAgICAgICAgICAgICAgICAgICBzZWxmLkVTQ19ERVRFQ1RPUi5zZWFyY2goc2VsZi5fbGFzdF9jaGFyICsgYnl0ZV9zdHIpOgogICAgICAgICAgICAgICAgc2VsZi5faW5wdXRfc3RhdGUgPSBJbnB1dFN0YXRlLkVTQ19BU0NJSQoKICAgICAgICBzZWxmLl9sYXN0X2NoYXIgPSBieXRlX3N0clstMTpdCgogICAgICAgICMgSWYgd2UndmUgc2VlbiBlc2NhcGUgc2VxdWVuY2VzLCB1c2UgdGhlIEVzY0NoYXJTZXRQcm9iZXIsIHdoaWNoCiAgICAgICAgIyB1c2VzIGEgc2ltcGxlIHN0YXRlIG1hY2hpbmUgdG8gY2hlY2sgZm9yIGtub3duIGVzY2FwZSBzZXF1ZW5jZXMgaW4KICAgICAgICAjIEhaIGFuZCBJU08tMjAyMiBlbmNvZGluZ3MsIHNpbmNlIHRob3NlIGFyZSB0aGUgb25seSBlbmNvZGluZ3MgdGhhdAogICAgICAgICMgdXNlIHN1Y2ggc2VxdWVuY2VzLgogICAgICAgIGlmIHNlbGYuX2lucHV0X3N0YXRlID09IElucHV0U3RhdGUuRVNDX0FTQ0lJOgogICAgICAgICAgICBpZiBub3Qgc2VsZi5fZXNjX2NoYXJzZXRfcHJvYmVyOgogICAgICAgICAgICAgICAgc2VsZi5fZXNjX2NoYXJzZXRfcHJvYmVyID0gRXNjQ2hhclNldFByb2JlcihzZWxmLmxhbmdfZmlsdGVyKQogICAgICAgICAgICBpZiBzZWxmLl9lc2NfY2hhcnNldF9wcm9iZXIuZmVlZChieXRlX3N0cikgPT0gUHJvYmluZ1N0YXRlLkZPVU5EX0lUOgogICAgICAgICAgICAgICAgc2VsZi5yZXN1bHQgPSB7J2VuY29kaW5nJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2VzY19jaGFyc2V0X3Byb2Jlci5jaGFyc2V0X25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29uZmlkZW5jZSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9lc2NfY2hhcnNldF9wcm9iZXIuZ2V0X2NvbmZpZGVuY2UoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9lc2NfY2hhcnNldF9wcm9iZXIubGFuZ3VhZ2V9CiAgICAgICAgICAgICAgICBzZWxmLmRvbmUgPSBUcnVlCiAgICAgICAgIyBJZiB3ZSd2ZSBzZWVuIGhpZ2ggYnl0ZXMgKGkuZS4sIHRob3NlIHdpdGggdmFsdWVzIGdyZWF0ZXIgdGhhbiAxMjcpLAogICAgICAgICMgd2UgbmVlZCB0byBkbyBtb3JlIGNvbXBsaWNhdGVkIGNoZWNrcyB1c2luZyBhbGwgb3VyIG11bHRpLWJ5dGUgYW5kCiAgICAgICAgIyBzaW5nbGUtYnl0ZSBwcm9iZXJzIHRoYXQgYXJlIGxlZnQuICBUaGUgc2luZ2xlLWJ5dGUgcHJvYmVycwogICAgICAgICMgdXNlIGNoYXJhY3RlciBiaWdyYW0gZGlzdHJpYnV0aW9ucyB0byBkZXRlcm1pbmUgdGhlIGVuY29kaW5nLCB3aGVyZWFzCiAgICAgICAgIyB0aGUgbXVsdGktYnl0ZSBwcm9iZXJzIHVzZSBhIGNvbWJpbmF0aW9uIG9mIGNoYXJhY3RlciB1bmlncmFtIGFuZAogICAgICAgICMgYmlncmFtIGRpc3RyaWJ1dGlvbnMuCiAgICAgICAgZWxpZiBzZWxmLl9pbnB1dF9zdGF0ZSA9PSBJbnB1dFN0YXRlLkhJR0hfQllURToKICAgICAgICAgICAgaWYgbm90IHNlbGYuX2NoYXJzZXRfcHJvYmVyczoKICAgICAgICAgICAgICAgIHNlbGYuX2NoYXJzZXRfcHJvYmVycyA9IFtNQkNTR3JvdXBQcm9iZXIoc2VsZi5sYW5nX2ZpbHRlcildCiAgICAgICAgICAgICAgICAjIElmIHdlJ3JlIGNoZWNraW5nIG5vbi1DSksgZW5jb2RpbmdzLCB1c2Ugc2luZ2xlLWJ5dGUgcHJvYmVyCiAgICAgICAgICAgICAgICBpZiBzZWxmLmxhbmdfZmlsdGVyICYgTGFuZ3VhZ2VGaWx0ZXIuTk9OX0NKSzoKICAgICAgICAgICAgICAgICAgICBzZWxmLl9jaGFyc2V0X3Byb2JlcnMuYXBwZW5kKFNCQ1NHcm91cFByb2JlcigpKQogICAgICAgICAgICAgICAgc2VsZi5fY2hhcnNldF9wcm9iZXJzLmFwcGVuZChMYXRpbjFQcm9iZXIoKSkKICAgICAgICAgICAgZm9yIHByb2JlciBpbiBzZWxmLl9jaGFyc2V0X3Byb2JlcnM6CiAgICAgICAgICAgICAgICBpZiBwcm9iZXIuZmVlZChieXRlX3N0cikgPT0gUHJvYmluZ1N0YXRlLkZPVU5EX0lUOgogICAgICAgICAgICAgICAgICAgIHNlbGYucmVzdWx0ID0geydlbmNvZGluZyc6IHByb2Jlci5jaGFyc2V0X25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbmZpZGVuY2UnOiBwcm9iZXIuZ2V0X2NvbmZpZGVuY2UoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGFuZ3VhZ2UnOiBwcm9iZXIubGFuZ3VhZ2V9CiAgICAgICAgICAgICAgICAgICAgc2VsZi5kb25lID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGlmIHNlbGYuV0lOX0JZVEVfREVURUNUT1Iuc2VhcmNoKGJ5dGVfc3RyKToKICAgICAgICAgICAgICAgIHNlbGYuX2hhc193aW5fYnl0ZXMgPSBUcnVlCgogICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFN0b3AgYW5hbHl6aW5nIHRoZSBjdXJyZW50IGRvY3VtZW50IGFuZCBjb21lIHVwIHdpdGggYSBmaW5hbAogICAgICAgIHByZWRpY3Rpb24uCgogICAgICAgIDpyZXR1cm5zOiAgVGhlIGBgcmVzdWx0YGAgYXR0cmlidXRlLCBhIGBgZGljdGBgIHdpdGggdGhlIGtleXMKICAgICAgICAgICAgICAgICAgIGBlbmNvZGluZ2AsIGBjb25maWRlbmNlYCwgYW5kIGBsYW5ndWFnZWAuCiAgICAgICAgIiIiCiAgICAgICAgIyBEb24ndCBib3RoZXIgd2l0aCBjaGVja3MgaWYgd2UncmUgYWxyZWFkeSBkb25lCiAgICAgICAgaWYgc2VsZi5kb25lOgogICAgICAgICAgICByZXR1cm4gc2VsZi5yZXN1bHQKICAgICAgICBzZWxmLmRvbmUgPSBUcnVlCgogICAgICAgIGlmIG5vdCBzZWxmLl9nb3RfZGF0YToKICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoJ25vIGRhdGEgcmVjZWl2ZWQhJykKCiAgICAgICAgIyBEZWZhdWx0IHRvIEFTQ0lJIGlmIGl0IGlzIGFsbCB3ZSd2ZSBzZWVuIHNvIGZhcgogICAgICAgIGVsaWYgc2VsZi5faW5wdXRfc3RhdGUgPT0gSW5wdXRTdGF0ZS5QVVJFX0FTQ0lJOgogICAgICAgICAgICBzZWxmLnJlc3VsdCA9IHsnZW5jb2RpbmcnOiAnYXNjaWknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAnY29uZmlkZW5jZSc6IDEuMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xhbmd1YWdlJzogJyd9CgogICAgICAgICMgSWYgd2UgaGF2ZSBzZWVuIG5vbi1BU0NJSSwgcmV0dXJuIHRoZSBiZXN0IHRoYXQgbWV0IE1JTklNVU1fVEhSRVNIT0xECiAgICAgICAgZWxpZiBzZWxmLl9pbnB1dF9zdGF0ZSA9PSBJbnB1dFN0YXRlLkhJR0hfQllURToKICAgICAgICAgICAgcHJvYmVyX2NvbmZpZGVuY2UgPSBOb25lCiAgICAgICAgICAgIG1heF9wcm9iZXJfY29uZmlkZW5jZSA9IDAuMAogICAgICAgICAgICBtYXhfcHJvYmVyID0gTm9uZQogICAgICAgICAgICBmb3IgcHJvYmVyIGluIHNlbGYuX2NoYXJzZXRfcHJvYmVyczoKICAgICAgICAgICAgICAgIGlmIG5vdCBwcm9iZXI6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIHByb2Jlcl9jb25maWRlbmNlID0gcHJvYmVyLmdldF9jb25maWRlbmNlKCkKICAgICAgICAgICAgICAgIGlmIHByb2Jlcl9jb25maWRlbmNlID4gbWF4X3Byb2Jlcl9jb25maWRlbmNlOgogICAgICAgICAgICAgICAgICAgIG1heF9wcm9iZXJfY29uZmlkZW5jZSA9IHByb2Jlcl9jb25maWRlbmNlCiAgICAgICAgICAgICAgICAgICAgbWF4X3Byb2JlciA9IHByb2JlcgogICAgICAgICAgICBpZiBtYXhfcHJvYmVyIGFuZCAobWF4X3Byb2Jlcl9jb25maWRlbmNlID4gc2VsZi5NSU5JTVVNX1RIUkVTSE9MRCk6CiAgICAgICAgICAgICAgICBjaGFyc2V0X25hbWUgPSBtYXhfcHJvYmVyLmNoYXJzZXRfbmFtZQogICAgICAgICAgICAgICAgbG93ZXJfY2hhcnNldF9uYW1lID0gbWF4X3Byb2Jlci5jaGFyc2V0X25hbWUubG93ZXIoKQogICAgICAgICAgICAgICAgY29uZmlkZW5jZSA9IG1heF9wcm9iZXIuZ2V0X2NvbmZpZGVuY2UoKQogICAgICAgICAgICAgICAgIyBVc2UgV2luZG93cyBlbmNvZGluZyBuYW1lIGluc3RlYWQgb2YgSVNPLTg4NTkgaWYgd2Ugc2F3IGFueQogICAgICAgICAgICAgICAgIyBleHRyYSBXaW5kb3dzLXNwZWNpZmljIGJ5dGVzCiAgICAgICAgICAgICAgICBpZiBsb3dlcl9jaGFyc2V0X25hbWUuc3RhcnRzd2l0aCgnaXNvLTg4NTknKToKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLl9oYXNfd2luX2J5dGVzOgogICAgICAgICAgICAgICAgICAgICAgICBjaGFyc2V0X25hbWUgPSBzZWxmLklTT19XSU5fTUFQLmdldChsb3dlcl9jaGFyc2V0X25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzZXRfbmFtZSkKICAgICAgICAgICAgICAgIHNlbGYucmVzdWx0ID0geydlbmNvZGluZyc6IGNoYXJzZXRfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb25maWRlbmNlJzogY29uZmlkZW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYW5ndWFnZSc6IG1heF9wcm9iZXIubGFuZ3VhZ2V9CgogICAgICAgICMgTG9nIGFsbCBwcm9iZXIgY29uZmlkZW5jZXMgaWYgbm9uZSBtZXQgTUlOSU1VTV9USFJFU0hPTEQKICAgICAgICBpZiBzZWxmLmxvZ2dlci5nZXRFZmZlY3RpdmVMZXZlbCgpID09IGxvZ2dpbmcuREVCVUc6CiAgICAgICAgICAgIGlmIHNlbGYucmVzdWx0WydlbmNvZGluZyddIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1Zygnbm8gcHJvYmVycyBoaXQgbWluaW11bSB0aHJlc2hvbGQnKQogICAgICAgICAgICAgICAgZm9yIGdyb3VwX3Byb2JlciBpbiBzZWxmLl9jaGFyc2V0X3Byb2JlcnM6CiAgICAgICAgICAgICAgICAgICAgaWYgbm90IGdyb3VwX3Byb2JlcjoKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGdyb3VwX3Byb2JlciwgQ2hhclNldEdyb3VwUHJvYmVyKToKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHByb2JlciBpbiBncm91cF9wcm9iZXIucHJvYmVyczoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKCclcyAlcyBjb25maWRlbmNlID0gJXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYmVyLmNoYXJzZXRfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Jlci5sYW5ndWFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Jlci5nZXRfY29uZmlkZW5jZSgpKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKCclcyAlcyBjb25maWRlbmNlID0gJXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9iZXIuY2hhcnNldF9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9iZXIubGFuZ3VhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Jlci5nZXRfY29uZmlkZW5jZSgpKQogICAgICAgIHJldHVybiBzZWxmLnJlc3VsdApQSwMEFAAAAAAAAAAhAPW/vD3OCgAAzgoAADEAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC91dGY4cHJvYmVyLnB5IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEJFR0lOIExJQ0VOU0UgQkxPQ0sgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgVGhlIE9yaWdpbmFsIENvZGUgaXMgbW96aWxsYS5vcmcgY29kZS4KIwojIFRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcwojIE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLgojIFBvcnRpb25zIGNyZWF0ZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGFyZSBDb3B5cmlnaHQgKEMpIDE5OTgKIyB0aGUgSW5pdGlhbCBEZXZlbG9wZXIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBDb250cmlidXRvcihzKToKIyAgIE1hcmsgUGlsZ3JpbSAtIHBvcnQgdG8gUHl0aG9uCiMKIyBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwojIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgojIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQojIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQojIDAyMTEwLTEzMDEgIFVTQQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVORCBMSUNFTlNFIEJMT0NLICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmZyb20gLmNoYXJzZXRwcm9iZXIgaW1wb3J0IENoYXJTZXRQcm9iZXIKZnJvbSAuZW51bXMgaW1wb3J0IFByb2JpbmdTdGF0ZSwgTWFjaGluZVN0YXRlCmZyb20gLmNvZGluZ3N0YXRlbWFjaGluZSBpbXBvcnQgQ29kaW5nU3RhdGVNYWNoaW5lCmZyb20gLm1iY3NzbSBpbXBvcnQgVVRGOF9TTV9NT0RFTAoKCgpjbGFzcyBVVEY4UHJvYmVyKENoYXJTZXRQcm9iZXIpOgogICAgT05FX0NIQVJfUFJPQiA9IDAuNQoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzdXBlcihVVEY4UHJvYmVyLCBzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5jb2Rpbmdfc20gPSBDb2RpbmdTdGF0ZU1hY2hpbmUoVVRGOF9TTV9NT0RFTCkKICAgICAgICBzZWxmLl9udW1fbWJfY2hhcnMgPSBOb25lCiAgICAgICAgc2VsZi5yZXNldCgpCgogICAgZGVmIHJlc2V0KHNlbGYpOgogICAgICAgIHN1cGVyKFVURjhQcm9iZXIsIHNlbGYpLnJlc2V0KCkKICAgICAgICBzZWxmLmNvZGluZ19zbS5yZXNldCgpCiAgICAgICAgc2VsZi5fbnVtX21iX2NoYXJzID0gMAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNoYXJzZXRfbmFtZShzZWxmKToKICAgICAgICByZXR1cm4gInV0Zi04IgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGxhbmd1YWdlKHNlbGYpOgogICAgICAgIHJldHVybiAiIgoKICAgIGRlZiBmZWVkKHNlbGYsIGJ5dGVfc3RyKToKICAgICAgICBmb3IgYyBpbiBieXRlX3N0cjoKICAgICAgICAgICAgY29kaW5nX3N0YXRlID0gc2VsZi5jb2Rpbmdfc20ubmV4dF9zdGF0ZShjKQogICAgICAgICAgICBpZiBjb2Rpbmdfc3RhdGUgPT0gTWFjaGluZVN0YXRlLkVSUk9SOgogICAgICAgICAgICAgICAgc2VsZi5fc3RhdGUgPSBQcm9iaW5nU3RhdGUuTk9UX01FCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBlbGlmIGNvZGluZ19zdGF0ZSA9PSBNYWNoaW5lU3RhdGUuSVRTX01FOgogICAgICAgICAgICAgICAgc2VsZi5fc3RhdGUgPSBQcm9iaW5nU3RhdGUuRk9VTkRfSVQKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGVsaWYgY29kaW5nX3N0YXRlID09IE1hY2hpbmVTdGF0ZS5TVEFSVDoKICAgICAgICAgICAgICAgIGlmIHNlbGYuY29kaW5nX3NtLmdldF9jdXJyZW50X2NoYXJsZW4oKSA+PSAyOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX251bV9tYl9jaGFycyArPSAxCgogICAgICAgIGlmIHNlbGYuc3RhdGUgPT0gUHJvYmluZ1N0YXRlLkRFVEVDVElORzoKICAgICAgICAgICAgaWYgc2VsZi5nZXRfY29uZmlkZW5jZSgpID4gc2VsZi5TSE9SVENVVF9USFJFU0hPTEQ6CiAgICAgICAgICAgICAgICBzZWxmLl9zdGF0ZSA9IFByb2JpbmdTdGF0ZS5GT1VORF9JVAoKICAgICAgICByZXR1cm4gc2VsZi5zdGF0ZQoKICAgIGRlZiBnZXRfY29uZmlkZW5jZShzZWxmKToKICAgICAgICB1bmxpa2UgPSAwLjk5CiAgICAgICAgaWYgc2VsZi5fbnVtX21iX2NoYXJzIDwgNjoKICAgICAgICAgICAgdW5saWtlICo9IHNlbGYuT05FX0NIQVJfUFJPQiAqKiBzZWxmLl9udW1fbWJfY2hhcnMKICAgICAgICAgICAgcmV0dXJuIDEuMCAtIHVubGlrZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiB1bmxpa2UKUEsDBBQAAAAAAAAAIQBHx5DX8gAAAPIAAAAuAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvdmVyc2lvbi5weSIiIgpUaGlzIG1vZHVsZSBleGlzdHMgb25seSB0byBzaW1wbGlmeSByZXRyaWV2aW5nIHRoZSB2ZXJzaW9uIG51bWJlciBvZiBjaGFyZGV0CmZyb20gd2l0aGluIHNldHVwLnB5IGFuZCBmcm9tIGNoYXJkZXQgc3VicGFja2FnZXMuCgo6YXV0aG9yOiBEYW4gQmxhbmNoYXJkIChkYW4uYmxhbmNoYXJkQGdtYWlsLmNvbSkKIiIiCgpfX3ZlcnNpb25fXyA9ICIzLjAuNCIKVkVSU0lPTiA9IF9fdmVyc2lvbl9fLnNwbGl0KCcuJykKUEsDBBQAAAAAAAAAIQBY1Gk58AAAAPAAAAAwAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NvbG9yYW1hL19faW5pdF9fLnB5IyBDb3B5cmlnaHQgSm9uYXRoYW4gSGFydGxleSAyMDEzLiBCU0QgMy1DbGF1c2UgbGljZW5zZSwgc2VlIExJQ0VOU0UgZmlsZS4KZnJvbSAuaW5pdGlhbGlzZSBpbXBvcnQgaW5pdCwgZGVpbml0LCByZWluaXQsIGNvbG9yYW1hX3RleHQKZnJvbSAuYW5zaSBpbXBvcnQgRm9yZSwgQmFjaywgU3R5bGUsIEN1cnNvcgpmcm9tIC5hbnNpdG93aW4zMiBpbXBvcnQgQW5zaVRvV2luMzIKCl9fdmVyc2lvbl9fID0gJzAuMy43JwoKUEsDBBQAAAAAAAAAIQA+Fadf3AkAANwJAAAsAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NvbG9yYW1hL2Fuc2kucHkjIENvcHlyaWdodCBKb25hdGhhbiBIYXJ0bGV5IDIwMTMuIEJTRCAzLUNsYXVzZSBsaWNlbnNlLCBzZWUgTElDRU5TRSBmaWxlLgonJycKVGhpcyBtb2R1bGUgZ2VuZXJhdGVzIEFOU0kgY2hhcmFjdGVyIGNvZGVzIHRvIHByaW50aW5nIGNvbG9ycyB0byB0ZXJtaW5hbHMuClNlZTogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9BTlNJX2VzY2FwZV9jb2RlCicnJwoKQ1NJID0gJ1wwMzNbJwpPU0MgPSAnXDAzM10nCkJFTCA9ICdcMDA3JwoKCmRlZiBjb2RlX3RvX2NoYXJzKGNvZGUpOgogICAgcmV0dXJuIENTSSArIHN0cihjb2RlKSArICdtJwoKZGVmIHNldF90aXRsZSh0aXRsZSk6CiAgICByZXR1cm4gT1NDICsgJzI7JyArIHRpdGxlICsgQkVMCgpkZWYgY2xlYXJfc2NyZWVuKG1vZGU9Mik6CiAgICByZXR1cm4gQ1NJICsgc3RyKG1vZGUpICsgJ0onCgpkZWYgY2xlYXJfbGluZShtb2RlPTIpOgogICAgcmV0dXJuIENTSSArIHN0cihtb2RlKSArICdLJwoKCmNsYXNzIEFuc2lDb2RlcyhvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgICMgdGhlIHN1YmNsYXNzZXMgZGVjbGFyZSBjbGFzcyBhdHRyaWJ1dGVzIHdoaWNoIGFyZSBudW1iZXJzLgogICAgICAgICMgVXBvbiBpbnN0YW50aWF0aW9uIHdlIGRlZmluZSBpbnN0YW5jZSBhdHRyaWJ1dGVzLCB3aGljaCBhcmUgdGhlIHNhbWUKICAgICAgICAjIGFzIHRoZSBjbGFzcyBhdHRyaWJ1dGVzIGJ1dCB3cmFwcGVkIHdpdGggdGhlIEFOU0kgZXNjYXBlIHNlcXVlbmNlCiAgICAgICAgZm9yIG5hbWUgaW4gZGlyKHNlbGYpOgogICAgICAgICAgICBpZiBub3QgbmFtZS5zdGFydHN3aXRoKCdfJyk6CiAgICAgICAgICAgICAgICB2YWx1ZSA9IGdldGF0dHIoc2VsZiwgbmFtZSkKICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgbmFtZSwgY29kZV90b19jaGFycyh2YWx1ZSkpCgoKY2xhc3MgQW5zaUN1cnNvcihvYmplY3QpOgogICAgZGVmIFVQKHNlbGYsIG49MSk6CiAgICAgICAgcmV0dXJuIENTSSArIHN0cihuKSArICdBJwogICAgZGVmIERPV04oc2VsZiwgbj0xKToKICAgICAgICByZXR1cm4gQ1NJICsgc3RyKG4pICsgJ0InCiAgICBkZWYgRk9SV0FSRChzZWxmLCBuPTEpOgogICAgICAgIHJldHVybiBDU0kgKyBzdHIobikgKyAnQycKICAgIGRlZiBCQUNLKHNlbGYsIG49MSk6CiAgICAgICAgcmV0dXJuIENTSSArIHN0cihuKSArICdEJwogICAgZGVmIFBPUyhzZWxmLCB4PTEsIHk9MSk6CiAgICAgICAgcmV0dXJuIENTSSArIHN0cih5KSArICc7JyArIHN0cih4KSArICdIJwoKCmNsYXNzIEFuc2lGb3JlKEFuc2lDb2Rlcyk6CiAgICBCTEFDSyAgICAgICAgICAgPSAzMAogICAgUkVEICAgICAgICAgICAgID0gMzEKICAgIEdSRUVOICAgICAgICAgICA9IDMyCiAgICBZRUxMT1cgICAgICAgICAgPSAzMwogICAgQkxVRSAgICAgICAgICAgID0gMzQKICAgIE1BR0VOVEEgICAgICAgICA9IDM1CiAgICBDWUFOICAgICAgICAgICAgPSAzNgogICAgV0hJVEUgICAgICAgICAgID0gMzcKICAgIFJFU0VUICAgICAgICAgICA9IDM5CgogICAgIyBUaGVzZSBhcmUgZmFpcmx5IHdlbGwgc3VwcG9ydGVkLCBidXQgbm90IHBhcnQgb2YgdGhlIHN0YW5kYXJkLgogICAgTElHSFRCTEFDS19FWCAgID0gOTAKICAgIExJR0hUUkVEX0VYICAgICA9IDkxCiAgICBMSUdIVEdSRUVOX0VYICAgPSA5MgogICAgTElHSFRZRUxMT1dfRVggID0gOTMKICAgIExJR0hUQkxVRV9FWCAgICA9IDk0CiAgICBMSUdIVE1BR0VOVEFfRVggPSA5NQogICAgTElHSFRDWUFOX0VYICAgID0gOTYKICAgIExJR0hUV0hJVEVfRVggICA9IDk3CgoKY2xhc3MgQW5zaUJhY2soQW5zaUNvZGVzKToKICAgIEJMQUNLICAgICAgICAgICA9IDQwCiAgICBSRUQgICAgICAgICAgICAgPSA0MQogICAgR1JFRU4gICAgICAgICAgID0gNDIKICAgIFlFTExPVyAgICAgICAgICA9IDQzCiAgICBCTFVFICAgICAgICAgICAgPSA0NAogICAgTUFHRU5UQSAgICAgICAgID0gNDUKICAgIENZQU4gICAgICAgICAgICA9IDQ2CiAgICBXSElURSAgICAgICAgICAgPSA0NwogICAgUkVTRVQgICAgICAgICAgID0gNDkKCiAgICAjIFRoZXNlIGFyZSBmYWlybHkgd2VsbCBzdXBwb3J0ZWQsIGJ1dCBub3QgcGFydCBvZiB0aGUgc3RhbmRhcmQuCiAgICBMSUdIVEJMQUNLX0VYICAgPSAxMDAKICAgIExJR0hUUkVEX0VYICAgICA9IDEwMQogICAgTElHSFRHUkVFTl9FWCAgID0gMTAyCiAgICBMSUdIVFlFTExPV19FWCAgPSAxMDMKICAgIExJR0hUQkxVRV9FWCAgICA9IDEwNAogICAgTElHSFRNQUdFTlRBX0VYID0gMTA1CiAgICBMSUdIVENZQU5fRVggICAgPSAxMDYKICAgIExJR0hUV0hJVEVfRVggICA9IDEwNwoKCmNsYXNzIEFuc2lTdHlsZShBbnNpQ29kZXMpOgogICAgQlJJR0hUICAgID0gMQogICAgRElNICAgICAgID0gMgogICAgTk9STUFMICAgID0gMjIKICAgIFJFU0VUX0FMTCA9IDAKCkZvcmUgICA9IEFuc2lGb3JlKCkKQmFjayAgID0gQW5zaUJhY2soKQpTdHlsZSAgPSBBbnNpU3R5bGUoKQpDdXJzb3IgPSBBbnNpQ3Vyc29yKCkKUEsDBBQAAAAAAAAAIQDHY8DZxCUAAMQlAAAzAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NvbG9yYW1hL2Fuc2l0b3dpbjMyLnB5IyBDb3B5cmlnaHQgSm9uYXRoYW4gSGFydGxleSAyMDEzLiBCU0QgMy1DbGF1c2UgbGljZW5zZSwgc2VlIExJQ0VOU0UgZmlsZS4KaW1wb3J0IHJlCmltcG9ydCBzeXMKaW1wb3J0IG9zCgpmcm9tIC5hbnNpIGltcG9ydCBBbnNpRm9yZSwgQW5zaUJhY2ssIEFuc2lTdHlsZSwgU3R5bGUKZnJvbSAud2ludGVybSBpbXBvcnQgV2luVGVybSwgV2luQ29sb3IsIFdpblN0eWxlCmZyb20gLndpbjMyIGltcG9ydCB3aW5kbGwsIHdpbmFwaV90ZXN0CgoKd2ludGVybSA9IE5vbmUKaWYgd2luZGxsIGlzIG5vdCBOb25lOgogICAgd2ludGVybSA9IFdpblRlcm0oKQoKCmRlZiBpc19zdHJlYW1fY2xvc2VkKHN0cmVhbSk6CiAgICByZXR1cm4gbm90IGhhc2F0dHIoc3RyZWFtLCAnY2xvc2VkJykgb3Igc3RyZWFtLmNsb3NlZAoKCmRlZiBpc19hX3R0eShzdHJlYW0pOgogICAgcmV0dXJuIGhhc2F0dHIoc3RyZWFtLCAnaXNhdHR5JykgYW5kIHN0cmVhbS5pc2F0dHkoKQoKCmNsYXNzIFN0cmVhbVdyYXBwZXIob2JqZWN0KToKICAgICcnJwogICAgV3JhcHMgYSBzdHJlYW0gKHN1Y2ggYXMgc3Rkb3V0KSwgYWN0aW5nIGFzIGEgdHJhbnNwYXJlbnQgcHJveHkgZm9yIGFsbAogICAgYXR0cmlidXRlIGFjY2VzcyBhcGFydCBmcm9tIG1ldGhvZCAnd3JpdGUoKScsIHdoaWNoIGlzIGRlbGVnYXRlZCB0byBvdXIKICAgIENvbnZlcnRlciBpbnN0YW5jZS4KICAgICcnJwogICAgZGVmIF9faW5pdF9fKHNlbGYsIHdyYXBwZWQsIGNvbnZlcnRlcik6CiAgICAgICAgIyBkb3VibGUtdW5kZXJzY29yZSBldmVyeXRoaW5nIHRvIHByZXZlbnQgY2xhc2hlcyB3aXRoIG5hbWVzIG9mCiAgICAgICAgIyBhdHRyaWJ1dGVzIG9uIHRoZSB3cmFwcGVkIHN0cmVhbSBvYmplY3QuCiAgICAgICAgc2VsZi5fX3dyYXBwZWQgPSB3cmFwcGVkCiAgICAgICAgc2VsZi5fX2NvbnZlcnRvciA9IGNvbnZlcnRlcgoKICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLl9fd3JhcHBlZCwgbmFtZSkKCiAgICBkZWYgd3JpdGUoc2VsZiwgdGV4dCk6CiAgICAgICAgc2VsZi5fX2NvbnZlcnRvci53cml0ZSh0ZXh0KQoKCmNsYXNzIEFuc2lUb1dpbjMyKG9iamVjdCk6CiAgICAnJycKICAgIEltcGxlbWVudHMgYSAnd3JpdGUoKScgbWV0aG9kIHdoaWNoLCBvbiBXaW5kb3dzLCB3aWxsIHN0cmlwIEFOU0kgY2hhcmFjdGVyCiAgICBzZXF1ZW5jZXMgZnJvbSB0aGUgdGV4dCwgYW5kIGlmIG91dHB1dHRpbmcgdG8gYSB0dHksIHdpbGwgY29udmVydCB0aGVtIGludG8KICAgIHdpbjMyIGZ1bmN0aW9uIGNhbGxzLgogICAgJycnCiAgICBBTlNJX0NTSV9SRSA9IHJlLmNvbXBpbGUoJ1wwMDE/XDAzM1xbKCg/OlxkfDspKikoW2EtekEtWl0pXDAwMj8nKSAgICAgIyBDb250cm9sIFNlcXVlbmNlIEludHJvZHVjZXIKICAgIEFOU0lfT1NDX1JFID0gcmUuY29tcGlsZSgnXDAwMT9cMDMzXF0oKD86Lnw7KSo/KShceDA3KVwwMDI/JykgICAgICAgICAjIE9wZXJhdGluZyBTeXN0ZW0gQ29tbWFuZAoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3cmFwcGVkLCBjb252ZXJ0PU5vbmUsIHN0cmlwPU5vbmUsIGF1dG9yZXNldD1GYWxzZSk6CiAgICAgICAgIyBUaGUgd3JhcHBlZCBzdHJlYW0gKG5vcm1hbGx5IHN5cy5zdGRvdXQgb3Igc3lzLnN0ZGVycikKICAgICAgICBzZWxmLndyYXBwZWQgPSB3cmFwcGVkCgogICAgICAgICMgc2hvdWxkIHdlIHJlc2V0IGNvbG9ycyB0byBkZWZhdWx0cyBhZnRlciBldmVyeSAud3JpdGUoKQogICAgICAgIHNlbGYuYXV0b3Jlc2V0ID0gYXV0b3Jlc2V0CgogICAgICAgICMgY3JlYXRlIHRoZSBwcm94eSB3cmFwcGluZyBvdXIgb3V0cHV0IHN0cmVhbQogICAgICAgIHNlbGYuc3RyZWFtID0gU3RyZWFtV3JhcHBlcih3cmFwcGVkLCBzZWxmKQoKICAgICAgICBvbl93aW5kb3dzID0gb3MubmFtZSA9PSAnbnQnCiAgICAgICAgIyBXZSB0ZXN0IGlmIHRoZSBXaW5BUEkgd29ya3MsIGJlY2F1c2UgZXZlbiBpZiB3ZSBhcmUgb24gV2luZG93cwogICAgICAgICMgd2UgbWF5IGJlIHVzaW5nIGEgdGVybWluYWwgdGhhdCBkb2Vzbid0IHN1cHBvcnQgdGhlIFdpbkFQSQogICAgICAgICMgKGUuZy4gQ3lnd2luIFRlcm1pbmFsKS4gSW4gdGhpcyBjYXNlIGl0J3MgdXAgdG8gdGhlIHRlcm1pbmFsCiAgICAgICAgIyB0byBzdXBwb3J0IHRoZSBBTlNJIGNvZGVzLgogICAgICAgIGNvbnZlcnNpb25fc3VwcG9ydGVkID0gb25fd2luZG93cyBhbmQgd2luYXBpX3Rlc3QoKQoKICAgICAgICAjIHNob3VsZCB3ZSBzdHJpcCBBTlNJIHNlcXVlbmNlcyBmcm9tIG91ciBvdXRwdXQ/CiAgICAgICAgaWYgc3RyaXAgaXMgTm9uZToKICAgICAgICAgICAgc3RyaXAgPSBjb252ZXJzaW9uX3N1cHBvcnRlZCBvciAobm90IGlzX3N0cmVhbV9jbG9zZWQod3JhcHBlZCkgYW5kIG5vdCBpc19hX3R0eSh3cmFwcGVkKSkKICAgICAgICBzZWxmLnN0cmlwID0gc3RyaXAKCiAgICAgICAgIyBzaG91bGQgd2Ugc2hvdWxkIGNvbnZlcnQgQU5TSSBzZXF1ZW5jZXMgaW50byB3aW4zMiBjYWxscz8KICAgICAgICBpZiBjb252ZXJ0IGlzIE5vbmU6CiAgICAgICAgICAgIGNvbnZlcnQgPSBjb252ZXJzaW9uX3N1cHBvcnRlZCBhbmQgbm90IGlzX3N0cmVhbV9jbG9zZWQod3JhcHBlZCkgYW5kIGlzX2FfdHR5KHdyYXBwZWQpCiAgICAgICAgc2VsZi5jb252ZXJ0ID0gY29udmVydAoKICAgICAgICAjIGRpY3Qgb2YgYW5zaSBjb2RlcyB0byB3aW4zMiBmdW5jdGlvbnMgYW5kIHBhcmFtZXRlcnMKICAgICAgICBzZWxmLndpbjMyX2NhbGxzID0gc2VsZi5nZXRfd2luMzJfY2FsbHMoKQoKICAgICAgICAjIGFyZSB3ZSB3cmFwcGluZyBzdGRlcnI/CiAgICAgICAgc2VsZi5vbl9zdGRlcnIgPSBzZWxmLndyYXBwZWQgaXMgc3lzLnN0ZGVycgoKICAgIGRlZiBzaG91bGRfd3JhcChzZWxmKToKICAgICAgICAnJycKICAgICAgICBUcnVlIGlmIHRoaXMgY2xhc3MgaXMgYWN0dWFsbHkgbmVlZGVkLiBJZiBmYWxzZSwgdGhlbiB0aGUgb3V0cHV0CiAgICAgICAgc3RyZWFtIHdpbGwgbm90IGJlIGFmZmVjdGVkLCBub3Igd2lsbCB3aW4zMiBjYWxscyBiZSBpc3N1ZWQsIHNvCiAgICAgICAgd3JhcHBpbmcgc3Rkb3V0IGlzIG5vdCBhY3R1YWxseSByZXF1aXJlZC4gVGhpcyB3aWxsIGdlbmVyYWxseSBiZQogICAgICAgIEZhbHNlIG9uIG5vbi1XaW5kb3dzIHBsYXRmb3JtcywgdW5sZXNzIG9wdGlvbmFsIGZ1bmN0aW9uYWxpdHkgbGlrZQogICAgICAgIGF1dG9yZXNldCBoYXMgYmVlbiByZXF1ZXN0ZWQgdXNpbmcga3dhcmdzIHRvIGluaXQoKQogICAgICAgICcnJwogICAgICAgIHJldHVybiBzZWxmLmNvbnZlcnQgb3Igc2VsZi5zdHJpcCBvciBzZWxmLmF1dG9yZXNldAoKICAgIGRlZiBnZXRfd2luMzJfY2FsbHMoc2VsZik6CiAgICAgICAgaWYgc2VsZi5jb252ZXJ0IGFuZCB3aW50ZXJtOgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgQW5zaVN0eWxlLlJFU0VUX0FMTDogKHdpbnRlcm0ucmVzZXRfYWxsLCApLAogICAgICAgICAgICAgICAgQW5zaVN0eWxlLkJSSUdIVDogKHdpbnRlcm0uc3R5bGUsIFdpblN0eWxlLkJSSUdIVCksCiAgICAgICAgICAgICAgICBBbnNpU3R5bGUuRElNOiAod2ludGVybS5zdHlsZSwgV2luU3R5bGUuTk9STUFMKSwKICAgICAgICAgICAgICAgIEFuc2lTdHlsZS5OT1JNQUw6ICh3aW50ZXJtLnN0eWxlLCBXaW5TdHlsZS5OT1JNQUwpLAogICAgICAgICAgICAgICAgQW5zaUZvcmUuQkxBQ0s6ICh3aW50ZXJtLmZvcmUsIFdpbkNvbG9yLkJMQUNLKSwKICAgICAgICAgICAgICAgIEFuc2lGb3JlLlJFRDogKHdpbnRlcm0uZm9yZSwgV2luQ29sb3IuUkVEKSwKICAgICAgICAgICAgICAgIEFuc2lGb3JlLkdSRUVOOiAod2ludGVybS5mb3JlLCBXaW5Db2xvci5HUkVFTiksCiAgICAgICAgICAgICAgICBBbnNpRm9yZS5ZRUxMT1c6ICh3aW50ZXJtLmZvcmUsIFdpbkNvbG9yLllFTExPVyksCiAgICAgICAgICAgICAgICBBbnNpRm9yZS5CTFVFOiAod2ludGVybS5mb3JlLCBXaW5Db2xvci5CTFVFKSwKICAgICAgICAgICAgICAgIEFuc2lGb3JlLk1BR0VOVEE6ICh3aW50ZXJtLmZvcmUsIFdpbkNvbG9yLk1BR0VOVEEpLAogICAgICAgICAgICAgICAgQW5zaUZvcmUuQ1lBTjogKHdpbnRlcm0uZm9yZSwgV2luQ29sb3IuQ1lBTiksCiAgICAgICAgICAgICAgICBBbnNpRm9yZS5XSElURTogKHdpbnRlcm0uZm9yZSwgV2luQ29sb3IuR1JFWSksCiAgICAgICAgICAgICAgICBBbnNpRm9yZS5SRVNFVDogKHdpbnRlcm0uZm9yZSwgKSwKICAgICAgICAgICAgICAgIEFuc2lGb3JlLkxJR0hUQkxBQ0tfRVg6ICh3aW50ZXJtLmZvcmUsIFdpbkNvbG9yLkJMQUNLLCBUcnVlKSwKICAgICAgICAgICAgICAgIEFuc2lGb3JlLkxJR0hUUkVEX0VYOiAod2ludGVybS5mb3JlLCBXaW5Db2xvci5SRUQsIFRydWUpLAogICAgICAgICAgICAgICAgQW5zaUZvcmUuTElHSFRHUkVFTl9FWDogKHdpbnRlcm0uZm9yZSwgV2luQ29sb3IuR1JFRU4sIFRydWUpLAogICAgICAgICAgICAgICAgQW5zaUZvcmUuTElHSFRZRUxMT1dfRVg6ICh3aW50ZXJtLmZvcmUsIFdpbkNvbG9yLllFTExPVywgVHJ1ZSksCiAgICAgICAgICAgICAgICBBbnNpRm9yZS5MSUdIVEJMVUVfRVg6ICh3aW50ZXJtLmZvcmUsIFdpbkNvbG9yLkJMVUUsIFRydWUpLAogICAgICAgICAgICAgICAgQW5zaUZvcmUuTElHSFRNQUdFTlRBX0VYOiAod2ludGVybS5mb3JlLCBXaW5Db2xvci5NQUdFTlRBLCBUcnVlKSwKICAgICAgICAgICAgICAgIEFuc2lGb3JlLkxJR0hUQ1lBTl9FWDogKHdpbnRlcm0uZm9yZSwgV2luQ29sb3IuQ1lBTiwgVHJ1ZSksCiAgICAgICAgICAgICAgICBBbnNpRm9yZS5MSUdIVFdISVRFX0VYOiAod2ludGVybS5mb3JlLCBXaW5Db2xvci5HUkVZLCBUcnVlKSwKICAgICAgICAgICAgICAgIEFuc2lCYWNrLkJMQUNLOiAod2ludGVybS5iYWNrLCBXaW5Db2xvci5CTEFDSyksCiAgICAgICAgICAgICAgICBBbnNpQmFjay5SRUQ6ICh3aW50ZXJtLmJhY2ssIFdpbkNvbG9yLlJFRCksCiAgICAgICAgICAgICAgICBBbnNpQmFjay5HUkVFTjogKHdpbnRlcm0uYmFjaywgV2luQ29sb3IuR1JFRU4pLAogICAgICAgICAgICAgICAgQW5zaUJhY2suWUVMTE9XOiAod2ludGVybS5iYWNrLCBXaW5Db2xvci5ZRUxMT1cpLAogICAgICAgICAgICAgICAgQW5zaUJhY2suQkxVRTogKHdpbnRlcm0uYmFjaywgV2luQ29sb3IuQkxVRSksCiAgICAgICAgICAgICAgICBBbnNpQmFjay5NQUdFTlRBOiAod2ludGVybS5iYWNrLCBXaW5Db2xvci5NQUdFTlRBKSwKICAgICAgICAgICAgICAgIEFuc2lCYWNrLkNZQU46ICh3aW50ZXJtLmJhY2ssIFdpbkNvbG9yLkNZQU4pLAogICAgICAgICAgICAgICAgQW5zaUJhY2suV0hJVEU6ICh3aW50ZXJtLmJhY2ssIFdpbkNvbG9yLkdSRVkpLAogICAgICAgICAgICAgICAgQW5zaUJhY2suUkVTRVQ6ICh3aW50ZXJtLmJhY2ssICksCiAgICAgICAgICAgICAgICBBbnNpQmFjay5MSUdIVEJMQUNLX0VYOiAod2ludGVybS5iYWNrLCBXaW5Db2xvci5CTEFDSywgVHJ1ZSksCiAgICAgICAgICAgICAgICBBbnNpQmFjay5MSUdIVFJFRF9FWDogKHdpbnRlcm0uYmFjaywgV2luQ29sb3IuUkVELCBUcnVlKSwKICAgICAgICAgICAgICAgIEFuc2lCYWNrLkxJR0hUR1JFRU5fRVg6ICh3aW50ZXJtLmJhY2ssIFdpbkNvbG9yLkdSRUVOLCBUcnVlKSwKICAgICAgICAgICAgICAgIEFuc2lCYWNrLkxJR0hUWUVMTE9XX0VYOiAod2ludGVybS5iYWNrLCBXaW5Db2xvci5ZRUxMT1csIFRydWUpLAogICAgICAgICAgICAgICAgQW5zaUJhY2suTElHSFRCTFVFX0VYOiAod2ludGVybS5iYWNrLCBXaW5Db2xvci5CTFVFLCBUcnVlKSwKICAgICAgICAgICAgICAgIEFuc2lCYWNrLkxJR0hUTUFHRU5UQV9FWDogKHdpbnRlcm0uYmFjaywgV2luQ29sb3IuTUFHRU5UQSwgVHJ1ZSksCiAgICAgICAgICAgICAgICBBbnNpQmFjay5MSUdIVENZQU5fRVg6ICh3aW50ZXJtLmJhY2ssIFdpbkNvbG9yLkNZQU4sIFRydWUpLAogICAgICAgICAgICAgICAgQW5zaUJhY2suTElHSFRXSElURV9FWDogKHdpbnRlcm0uYmFjaywgV2luQ29sb3IuR1JFWSwgVHJ1ZSksCiAgICAgICAgICAgIH0KICAgICAgICByZXR1cm4gZGljdCgpCgogICAgZGVmIHdyaXRlKHNlbGYsIHRleHQpOgogICAgICAgIGlmIHNlbGYuc3RyaXAgb3Igc2VsZi5jb252ZXJ0OgogICAgICAgICAgICBzZWxmLndyaXRlX2FuZF9jb252ZXJ0KHRleHQpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi53cmFwcGVkLndyaXRlKHRleHQpCiAgICAgICAgICAgIHNlbGYud3JhcHBlZC5mbHVzaCgpCiAgICAgICAgaWYgc2VsZi5hdXRvcmVzZXQ6CiAgICAgICAgICAgIHNlbGYucmVzZXRfYWxsKCkKCgogICAgZGVmIHJlc2V0X2FsbChzZWxmKToKICAgICAgICBpZiBzZWxmLmNvbnZlcnQ6CiAgICAgICAgICAgIHNlbGYuY2FsbF93aW4zMignbScsICgwLCkpCiAgICAgICAgZWxpZiBub3Qgc2VsZi5zdHJpcCBhbmQgbm90IGlzX3N0cmVhbV9jbG9zZWQoc2VsZi53cmFwcGVkKToKICAgICAgICAgICAgc2VsZi53cmFwcGVkLndyaXRlKFN0eWxlLlJFU0VUX0FMTCkKCgogICAgZGVmIHdyaXRlX2FuZF9jb252ZXJ0KHNlbGYsIHRleHQpOgogICAgICAgICcnJwogICAgICAgIFdyaXRlIHRoZSBnaXZlbiB0ZXh0IHRvIG91ciB3cmFwcGVkIHN0cmVhbSwgc3RyaXBwaW5nIGFueSBBTlNJCiAgICAgICAgc2VxdWVuY2VzIGZyb20gdGhlIHRleHQsIGFuZCBvcHRpb25hbGx5IGNvbnZlcnRpbmcgdGhlbSBpbnRvIHdpbjMyCiAgICAgICAgY2FsbHMuCiAgICAgICAgJycnCiAgICAgICAgY3Vyc29yID0gMAogICAgICAgIHRleHQgPSBzZWxmLmNvbnZlcnRfb3NjKHRleHQpCiAgICAgICAgZm9yIG1hdGNoIGluIHNlbGYuQU5TSV9DU0lfUkUuZmluZGl0ZXIodGV4dCk6CiAgICAgICAgICAgIHN0YXJ0LCBlbmQgPSBtYXRjaC5zcGFuKCkKICAgICAgICAgICAgc2VsZi53cml0ZV9wbGFpbl90ZXh0KHRleHQsIGN1cnNvciwgc3RhcnQpCiAgICAgICAgICAgIHNlbGYuY29udmVydF9hbnNpKCptYXRjaC5ncm91cHMoKSkKICAgICAgICAgICAgY3Vyc29yID0gZW5kCiAgICAgICAgc2VsZi53cml0ZV9wbGFpbl90ZXh0KHRleHQsIGN1cnNvciwgbGVuKHRleHQpKQoKCiAgICBkZWYgd3JpdGVfcGxhaW5fdGV4dChzZWxmLCB0ZXh0LCBzdGFydCwgZW5kKToKICAgICAgICBpZiBzdGFydCA8IGVuZDoKICAgICAgICAgICAgc2VsZi53cmFwcGVkLndyaXRlKHRleHRbc3RhcnQ6ZW5kXSkKICAgICAgICAgICAgc2VsZi53cmFwcGVkLmZsdXNoKCkKCgogICAgZGVmIGNvbnZlcnRfYW5zaShzZWxmLCBwYXJhbXN0cmluZywgY29tbWFuZCk6CiAgICAgICAgaWYgc2VsZi5jb252ZXJ0OgogICAgICAgICAgICBwYXJhbXMgPSBzZWxmLmV4dHJhY3RfcGFyYW1zKGNvbW1hbmQsIHBhcmFtc3RyaW5nKQogICAgICAgICAgICBzZWxmLmNhbGxfd2luMzIoY29tbWFuZCwgcGFyYW1zKQoKCiAgICBkZWYgZXh0cmFjdF9wYXJhbXMoc2VsZiwgY29tbWFuZCwgcGFyYW1zdHJpbmcpOgogICAgICAgIGlmIGNvbW1hbmQgaW4gJ0hmJzoKICAgICAgICAgICAgcGFyYW1zID0gdHVwbGUoaW50KHApIGlmIGxlbihwKSAhPSAwIGVsc2UgMSBmb3IgcCBpbiBwYXJhbXN0cmluZy5zcGxpdCgnOycpKQogICAgICAgICAgICB3aGlsZSBsZW4ocGFyYW1zKSA8IDI6CiAgICAgICAgICAgICAgICAjIGRlZmF1bHRzOgogICAgICAgICAgICAgICAgcGFyYW1zID0gcGFyYW1zICsgKDEsKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHBhcmFtcyA9IHR1cGxlKGludChwKSBmb3IgcCBpbiBwYXJhbXN0cmluZy5zcGxpdCgnOycpIGlmIGxlbihwKSAhPSAwKQogICAgICAgICAgICBpZiBsZW4ocGFyYW1zKSA9PSAwOgogICAgICAgICAgICAgICAgIyBkZWZhdWx0czoKICAgICAgICAgICAgICAgIGlmIGNvbW1hbmQgaW4gJ0pLbSc6CiAgICAgICAgICAgICAgICAgICAgcGFyYW1zID0gKDAsKQogICAgICAgICAgICAgICAgZWxpZiBjb21tYW5kIGluICdBQkNEJzoKICAgICAgICAgICAgICAgICAgICBwYXJhbXMgPSAoMSwpCgogICAgICAgIHJldHVybiBwYXJhbXMKCgogICAgZGVmIGNhbGxfd2luMzIoc2VsZiwgY29tbWFuZCwgcGFyYW1zKToKICAgICAgICBpZiBjb21tYW5kID09ICdtJzoKICAgICAgICAgICAgZm9yIHBhcmFtIGluIHBhcmFtczoKICAgICAgICAgICAgICAgIGlmIHBhcmFtIGluIHNlbGYud2luMzJfY2FsbHM6CiAgICAgICAgICAgICAgICAgICAgZnVuY19hcmdzID0gc2VsZi53aW4zMl9jYWxsc1twYXJhbV0KICAgICAgICAgICAgICAgICAgICBmdW5jID0gZnVuY19hcmdzWzBdCiAgICAgICAgICAgICAgICAgICAgYXJncyA9IGZ1bmNfYXJnc1sxOl0KICAgICAgICAgICAgICAgICAgICBrd2FyZ3MgPSBkaWN0KG9uX3N0ZGVycj1zZWxmLm9uX3N0ZGVycikKICAgICAgICAgICAgICAgICAgICBmdW5jKCphcmdzLCAqKmt3YXJncykKICAgICAgICBlbGlmIGNvbW1hbmQgaW4gJ0onOgogICAgICAgICAgICB3aW50ZXJtLmVyYXNlX3NjcmVlbihwYXJhbXNbMF0sIG9uX3N0ZGVycj1zZWxmLm9uX3N0ZGVycikKICAgICAgICBlbGlmIGNvbW1hbmQgaW4gJ0snOgogICAgICAgICAgICB3aW50ZXJtLmVyYXNlX2xpbmUocGFyYW1zWzBdLCBvbl9zdGRlcnI9c2VsZi5vbl9zdGRlcnIpCiAgICAgICAgZWxpZiBjb21tYW5kIGluICdIZic6ICAgICAjIGN1cnNvciBwb3NpdGlvbiAtIGFic29sdXRlCiAgICAgICAgICAgIHdpbnRlcm0uc2V0X2N1cnNvcl9wb3NpdGlvbihwYXJhbXMsIG9uX3N0ZGVycj1zZWxmLm9uX3N0ZGVycikKICAgICAgICBlbGlmIGNvbW1hbmQgaW4gJ0FCQ0QnOiAgICMgY3Vyc29yIHBvc2l0aW9uIC0gcmVsYXRpdmUKICAgICAgICAgICAgbiA9IHBhcmFtc1swXQogICAgICAgICAgICAjIEEgLSB1cCwgQiAtIGRvd24sIEMgLSBmb3J3YXJkLCBEIC0gYmFjawogICAgICAgICAgICB4LCB5ID0geydBJzogKDAsIC1uKSwgJ0InOiAoMCwgbiksICdDJzogKG4sIDApLCAnRCc6ICgtbiwgMCl9W2NvbW1hbmRdCiAgICAgICAgICAgIHdpbnRlcm0uY3Vyc29yX2FkanVzdCh4LCB5LCBvbl9zdGRlcnI9c2VsZi5vbl9zdGRlcnIpCgoKICAgIGRlZiBjb252ZXJ0X29zYyhzZWxmLCB0ZXh0KToKICAgICAgICBmb3IgbWF0Y2ggaW4gc2VsZi5BTlNJX09TQ19SRS5maW5kaXRlcih0ZXh0KToKICAgICAgICAgICAgc3RhcnQsIGVuZCA9IG1hdGNoLnNwYW4oKQogICAgICAgICAgICB0ZXh0ID0gdGV4dFs6c3RhcnRdICsgdGV4dFtlbmQ6XQogICAgICAgICAgICBwYXJhbXN0cmluZywgY29tbWFuZCA9IG1hdGNoLmdyb3VwcygpCiAgICAgICAgICAgIGlmIGNvbW1hbmQgaW4gJ1x4MDcnOiAgICAgICAjIFx4MDcgPSBCRUwKICAgICAgICAgICAgICAgIHBhcmFtcyA9IHBhcmFtc3RyaW5nLnNwbGl0KCI7IikKICAgICAgICAgICAgICAgICMgMCAtIGNoYW5nZSB0aXRsZSBhbmQgaWNvbiAod2Ugd2lsbCBvbmx5IGNoYW5nZSB0aXRsZSkKICAgICAgICAgICAgICAgICMgMSAtIGNoYW5nZSBpY29uICh3ZSBkb24ndCBzdXBwb3J0IHRoaXMpCiAgICAgICAgICAgICAgICAjIDIgLSBjaGFuZ2UgdGl0bGUKICAgICAgICAgICAgICAgIGlmIHBhcmFtc1swXSBpbiAnMDInOgogICAgICAgICAgICAgICAgICAgIHdpbnRlcm0uc2V0X3RpdGxlKHBhcmFtc1sxXSkKICAgICAgICByZXR1cm4gdGV4dApQSwMEFAAAAAAAAAAhAH3W2C99BwAAfQcAADIAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY29sb3JhbWEvaW5pdGlhbGlzZS5weSMgQ29weXJpZ2h0IEpvbmF0aGFuIEhhcnRsZXkgMjAxMy4gQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsIHNlZSBMSUNFTlNFIGZpbGUuCmltcG9ydCBhdGV4aXQKaW1wb3J0IGNvbnRleHRsaWIKaW1wb3J0IHN5cwoKZnJvbSAuYW5zaXRvd2luMzIgaW1wb3J0IEFuc2lUb1dpbjMyCgoKb3JpZ19zdGRvdXQgPSBOb25lCm9yaWdfc3RkZXJyID0gTm9uZQoKd3JhcHBlZF9zdGRvdXQgPSBOb25lCndyYXBwZWRfc3RkZXJyID0gTm9uZQoKYXRleGl0X2RvbmUgPSBGYWxzZQoKCmRlZiByZXNldF9hbGwoKToKICAgIGlmIEFuc2lUb1dpbjMyIGlzIG5vdCBOb25lOiAgICAjIElzc3VlICM3NDogb2JqZWN0cyBtaWdodCBiZWNvbWUgTm9uZSBhdCBleGl0CiAgICAgICAgQW5zaVRvV2luMzIob3JpZ19zdGRvdXQpLnJlc2V0X2FsbCgpCgoKZGVmIGluaXQoYXV0b3Jlc2V0PUZhbHNlLCBjb252ZXJ0PU5vbmUsIHN0cmlwPU5vbmUsIHdyYXA9VHJ1ZSk6CgogICAgaWYgbm90IHdyYXAgYW5kIGFueShbYXV0b3Jlc2V0LCBjb252ZXJ0LCBzdHJpcF0pOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ3dyYXA9RmFsc2UgY29uZmxpY3RzIHdpdGggYW55IG90aGVyIGFyZz1UcnVlJykKCiAgICBnbG9iYWwgd3JhcHBlZF9zdGRvdXQsIHdyYXBwZWRfc3RkZXJyCiAgICBnbG9iYWwgb3JpZ19zdGRvdXQsIG9yaWdfc3RkZXJyCgogICAgb3JpZ19zdGRvdXQgPSBzeXMuc3Rkb3V0CiAgICBvcmlnX3N0ZGVyciA9IHN5cy5zdGRlcnIKCiAgICBpZiBzeXMuc3Rkb3V0IGlzIE5vbmU6CiAgICAgICAgd3JhcHBlZF9zdGRvdXQgPSBOb25lCiAgICBlbHNlOgogICAgICAgIHN5cy5zdGRvdXQgPSB3cmFwcGVkX3N0ZG91dCA9IFwKICAgICAgICAgICAgd3JhcF9zdHJlYW0ob3JpZ19zdGRvdXQsIGNvbnZlcnQsIHN0cmlwLCBhdXRvcmVzZXQsIHdyYXApCiAgICBpZiBzeXMuc3RkZXJyIGlzIE5vbmU6CiAgICAgICAgd3JhcHBlZF9zdGRlcnIgPSBOb25lCiAgICBlbHNlOgogICAgICAgIHN5cy5zdGRlcnIgPSB3cmFwcGVkX3N0ZGVyciA9IFwKICAgICAgICAgICAgd3JhcF9zdHJlYW0ob3JpZ19zdGRlcnIsIGNvbnZlcnQsIHN0cmlwLCBhdXRvcmVzZXQsIHdyYXApCgogICAgZ2xvYmFsIGF0ZXhpdF9kb25lCiAgICBpZiBub3QgYXRleGl0X2RvbmU6CiAgICAgICAgYXRleGl0LnJlZ2lzdGVyKHJlc2V0X2FsbCkKICAgICAgICBhdGV4aXRfZG9uZSA9IFRydWUKCgpkZWYgZGVpbml0KCk6CiAgICBpZiBvcmlnX3N0ZG91dCBpcyBub3QgTm9uZToKICAgICAgICBzeXMuc3Rkb3V0ID0gb3JpZ19zdGRvdXQKICAgIGlmIG9yaWdfc3RkZXJyIGlzIG5vdCBOb25lOgogICAgICAgIHN5cy5zdGRlcnIgPSBvcmlnX3N0ZGVycgoKCkBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCmRlZiBjb2xvcmFtYV90ZXh0KCphcmdzLCAqKmt3YXJncyk6CiAgICBpbml0KCphcmdzLCAqKmt3YXJncykKICAgIHRyeToKICAgICAgICB5aWVsZAogICAgZmluYWxseToKICAgICAgICBkZWluaXQoKQoKCmRlZiByZWluaXQoKToKICAgIGlmIHdyYXBwZWRfc3Rkb3V0IGlzIG5vdCBOb25lOgogICAgICAgIHN5cy5zdGRvdXQgPSB3cmFwcGVkX3N0ZG91dAogICAgaWYgd3JhcHBlZF9zdGRlcnIgaXMgbm90IE5vbmU6CiAgICAgICAgc3lzLnN0ZGVyciA9IHdyYXBwZWRfc3RkZXJyCgoKZGVmIHdyYXBfc3RyZWFtKHN0cmVhbSwgY29udmVydCwgc3RyaXAsIGF1dG9yZXNldCwgd3JhcCk6CiAgICBpZiB3cmFwOgogICAgICAgIHdyYXBwZXIgPSBBbnNpVG9XaW4zMihzdHJlYW0sCiAgICAgICAgICAgIGNvbnZlcnQ9Y29udmVydCwgc3RyaXA9c3RyaXAsIGF1dG9yZXNldD1hdXRvcmVzZXQpCiAgICAgICAgaWYgd3JhcHBlci5zaG91bGRfd3JhcCgpOgogICAgICAgICAgICBzdHJlYW0gPSB3cmFwcGVyLnN0cmVhbQogICAgcmV0dXJuIHN0cmVhbQoKClBLAwQUAAAAAAAAACEADW2iPfUUAAD1FAAALQAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jb2xvcmFtYS93aW4zMi5weSMgQ29weXJpZ2h0IEpvbmF0aGFuIEhhcnRsZXkgMjAxMy4gQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsIHNlZSBMSUNFTlNFIGZpbGUuCgojIGZyb20gd2luYmFzZS5oClNURE9VVCA9IC0xMQpTVERFUlIgPSAtMTIKCnRyeToKICAgIGltcG9ydCBjdHlwZXMKICAgIGZyb20gY3R5cGVzIGltcG9ydCBMaWJyYXJ5TG9hZGVyCiAgICB3aW5kbGwgPSBMaWJyYXJ5TG9hZGVyKGN0eXBlcy5XaW5ETEwpCiAgICBmcm9tIGN0eXBlcyBpbXBvcnQgd2ludHlwZXMKZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgSW1wb3J0RXJyb3IpOgogICAgd2luZGxsID0gTm9uZQogICAgU2V0Q29uc29sZVRleHRBdHRyaWJ1dGUgPSBsYW1iZGEgKl86IE5vbmUKICAgIHdpbmFwaV90ZXN0ID0gbGFtYmRhICpfOiBOb25lCmVsc2U6CiAgICBmcm9tIGN0eXBlcyBpbXBvcnQgYnlyZWYsIFN0cnVjdHVyZSwgY19jaGFyLCBQT0lOVEVSCgogICAgQ09PUkQgPSB3aW50eXBlcy5fQ09PUkQKCiAgICBjbGFzcyBDT05TT0xFX1NDUkVFTl9CVUZGRVJfSU5GTyhTdHJ1Y3R1cmUpOgogICAgICAgICIiInN0cnVjdCBpbiB3aW5jb24uaC4iIiIKICAgICAgICBfZmllbGRzXyA9IFsKICAgICAgICAgICAgKCJkd1NpemUiLCBDT09SRCksCiAgICAgICAgICAgICgiZHdDdXJzb3JQb3NpdGlvbiIsIENPT1JEKSwKICAgICAgICAgICAgKCJ3QXR0cmlidXRlcyIsIHdpbnR5cGVzLldPUkQpLAogICAgICAgICAgICAoInNyV2luZG93Iiwgd2ludHlwZXMuU01BTExfUkVDVCksCiAgICAgICAgICAgICgiZHdNYXhpbXVtV2luZG93U2l6ZSIsIENPT1JEKSwKICAgICAgICBdCiAgICAgICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgICAgIHJldHVybiAnKCVkLCVkLCVkLCVkLCVkLCVkLCVkLCVkLCVkLCVkLCVkKScgJSAoCiAgICAgICAgICAgICAgICBzZWxmLmR3U2l6ZS5ZLCBzZWxmLmR3U2l6ZS5YCiAgICAgICAgICAgICAgICAsIHNlbGYuZHdDdXJzb3JQb3NpdGlvbi5ZLCBzZWxmLmR3Q3Vyc29yUG9zaXRpb24uWAogICAgICAgICAgICAgICAgLCBzZWxmLndBdHRyaWJ1dGVzCiAgICAgICAgICAgICAgICAsIHNlbGYuc3JXaW5kb3cuVG9wLCBzZWxmLnNyV2luZG93LkxlZnQsIHNlbGYuc3JXaW5kb3cuQm90dG9tLCBzZWxmLnNyV2luZG93LlJpZ2h0CiAgICAgICAgICAgICAgICAsIHNlbGYuZHdNYXhpbXVtV2luZG93U2l6ZS5ZLCBzZWxmLmR3TWF4aW11bVdpbmRvd1NpemUuWAogICAgICAgICAgICApCgogICAgX0dldFN0ZEhhbmRsZSA9IHdpbmRsbC5rZXJuZWwzMi5HZXRTdGRIYW5kbGUKICAgIF9HZXRTdGRIYW5kbGUuYXJndHlwZXMgPSBbCiAgICAgICAgd2ludHlwZXMuRFdPUkQsCiAgICBdCiAgICBfR2V0U3RkSGFuZGxlLnJlc3R5cGUgPSB3aW50eXBlcy5IQU5ETEUKCiAgICBfR2V0Q29uc29sZVNjcmVlbkJ1ZmZlckluZm8gPSB3aW5kbGwua2VybmVsMzIuR2V0Q29uc29sZVNjcmVlbkJ1ZmZlckluZm8KICAgIF9HZXRDb25zb2xlU2NyZWVuQnVmZmVySW5mby5hcmd0eXBlcyA9IFsKICAgICAgICB3aW50eXBlcy5IQU5ETEUsCiAgICAgICAgUE9JTlRFUihDT05TT0xFX1NDUkVFTl9CVUZGRVJfSU5GTyksCiAgICBdCiAgICBfR2V0Q29uc29sZVNjcmVlbkJ1ZmZlckluZm8ucmVzdHlwZSA9IHdpbnR5cGVzLkJPT0wKCiAgICBfU2V0Q29uc29sZVRleHRBdHRyaWJ1dGUgPSB3aW5kbGwua2VybmVsMzIuU2V0Q29uc29sZVRleHRBdHRyaWJ1dGUKICAgIF9TZXRDb25zb2xlVGV4dEF0dHJpYnV0ZS5hcmd0eXBlcyA9IFsKICAgICAgICB3aW50eXBlcy5IQU5ETEUsCiAgICAgICAgd2ludHlwZXMuV09SRCwKICAgIF0KICAgIF9TZXRDb25zb2xlVGV4dEF0dHJpYnV0ZS5yZXN0eXBlID0gd2ludHlwZXMuQk9PTAoKICAgIF9TZXRDb25zb2xlQ3Vyc29yUG9zaXRpb24gPSB3aW5kbGwua2VybmVsMzIuU2V0Q29uc29sZUN1cnNvclBvc2l0aW9uCiAgICBfU2V0Q29uc29sZUN1cnNvclBvc2l0aW9uLmFyZ3R5cGVzID0gWwogICAgICAgIHdpbnR5cGVzLkhBTkRMRSwKICAgICAgICBDT09SRCwKICAgIF0KICAgIF9TZXRDb25zb2xlQ3Vyc29yUG9zaXRpb24ucmVzdHlwZSA9IHdpbnR5cGVzLkJPT0wKCiAgICBfRmlsbENvbnNvbGVPdXRwdXRDaGFyYWN0ZXJBID0gd2luZGxsLmtlcm5lbDMyLkZpbGxDb25zb2xlT3V0cHV0Q2hhcmFjdGVyQQogICAgX0ZpbGxDb25zb2xlT3V0cHV0Q2hhcmFjdGVyQS5hcmd0eXBlcyA9IFsKICAgICAgICB3aW50eXBlcy5IQU5ETEUsCiAgICAgICAgY19jaGFyLAogICAgICAgIHdpbnR5cGVzLkRXT1JELAogICAgICAgIENPT1JELAogICAgICAgIFBPSU5URVIod2ludHlwZXMuRFdPUkQpLAogICAgXQogICAgX0ZpbGxDb25zb2xlT3V0cHV0Q2hhcmFjdGVyQS5yZXN0eXBlID0gd2ludHlwZXMuQk9PTAoKICAgIF9GaWxsQ29uc29sZU91dHB1dEF0dHJpYnV0ZSA9IHdpbmRsbC5rZXJuZWwzMi5GaWxsQ29uc29sZU91dHB1dEF0dHJpYnV0ZQogICAgX0ZpbGxDb25zb2xlT3V0cHV0QXR0cmlidXRlLmFyZ3R5cGVzID0gWwogICAgICAgIHdpbnR5cGVzLkhBTkRMRSwKICAgICAgICB3aW50eXBlcy5XT1JELAogICAgICAgIHdpbnR5cGVzLkRXT1JELAogICAgICAgIENPT1JELAogICAgICAgIFBPSU5URVIod2ludHlwZXMuRFdPUkQpLAogICAgXQogICAgX0ZpbGxDb25zb2xlT3V0cHV0QXR0cmlidXRlLnJlc3R5cGUgPSB3aW50eXBlcy5CT09MCgogICAgX1NldENvbnNvbGVUaXRsZVcgPSB3aW5kbGwua2VybmVsMzIuU2V0Q29uc29sZVRpdGxlQQogICAgX1NldENvbnNvbGVUaXRsZVcuYXJndHlwZXMgPSBbCiAgICAgICAgd2ludHlwZXMuTFBDU1RSCiAgICBdCiAgICBfU2V0Q29uc29sZVRpdGxlVy5yZXN0eXBlID0gd2ludHlwZXMuQk9PTAoKICAgIGhhbmRsZXMgPSB7CiAgICAgICAgU1RET1VUOiBfR2V0U3RkSGFuZGxlKFNURE9VVCksCiAgICAgICAgU1RERVJSOiBfR2V0U3RkSGFuZGxlKFNUREVSUiksCiAgICB9CgogICAgZGVmIHdpbmFwaV90ZXN0KCk6CiAgICAgICAgaGFuZGxlID0gaGFuZGxlc1tTVERPVVRdCiAgICAgICAgY3NiaSA9IENPTlNPTEVfU0NSRUVOX0JVRkZFUl9JTkZPKCkKICAgICAgICBzdWNjZXNzID0gX0dldENvbnNvbGVTY3JlZW5CdWZmZXJJbmZvKAogICAgICAgICAgICBoYW5kbGUsIGJ5cmVmKGNzYmkpKQogICAgICAgIHJldHVybiBib29sKHN1Y2Nlc3MpCgogICAgZGVmIEdldENvbnNvbGVTY3JlZW5CdWZmZXJJbmZvKHN0cmVhbV9pZD1TVERPVVQpOgogICAgICAgIGhhbmRsZSA9IGhhbmRsZXNbc3RyZWFtX2lkXQogICAgICAgIGNzYmkgPSBDT05TT0xFX1NDUkVFTl9CVUZGRVJfSU5GTygpCiAgICAgICAgc3VjY2VzcyA9IF9HZXRDb25zb2xlU2NyZWVuQnVmZmVySW5mbygKICAgICAgICAgICAgaGFuZGxlLCBieXJlZihjc2JpKSkKICAgICAgICByZXR1cm4gY3NiaQoKICAgIGRlZiBTZXRDb25zb2xlVGV4dEF0dHJpYnV0ZShzdHJlYW1faWQsIGF0dHJzKToKICAgICAgICBoYW5kbGUgPSBoYW5kbGVzW3N0cmVhbV9pZF0KICAgICAgICByZXR1cm4gX1NldENvbnNvbGVUZXh0QXR0cmlidXRlKGhhbmRsZSwgYXR0cnMpCgogICAgZGVmIFNldENvbnNvbGVDdXJzb3JQb3NpdGlvbihzdHJlYW1faWQsIHBvc2l0aW9uLCBhZGp1c3Q9VHJ1ZSk6CiAgICAgICAgcG9zaXRpb24gPSBDT09SRCgqcG9zaXRpb24pCiAgICAgICAgIyBJZiB0aGUgcG9zaXRpb24gaXMgb3V0IG9mIHJhbmdlLCBkbyBub3RoaW5nLgogICAgICAgIGlmIHBvc2l0aW9uLlkgPD0gMCBvciBwb3NpdGlvbi5YIDw9IDA6CiAgICAgICAgICAgIHJldHVybgogICAgICAgICMgQWRqdXN0IGZvciBXaW5kb3dzJyBTZXRDb25zb2xlQ3Vyc29yUG9zaXRpb246CiAgICAgICAgIyAgICAxLiBiZWluZyAwLWJhc2VkLCB3aGlsZSBBTlNJIGlzIDEtYmFzZWQuCiAgICAgICAgIyAgICAyLiBleHBlY3RpbmcgKHgseSksIHdoaWxlIEFOU0kgdXNlcyAoeSx4KS4KICAgICAgICBhZGp1c3RlZF9wb3NpdGlvbiA9IENPT1JEKHBvc2l0aW9uLlkgLSAxLCBwb3NpdGlvbi5YIC0gMSkKICAgICAgICBpZiBhZGp1c3Q6CiAgICAgICAgICAgICMgQWRqdXN0IGZvciB2aWV3cG9ydCdzIHNjcm9sbCBwb3NpdGlvbgogICAgICAgICAgICBzciA9IEdldENvbnNvbGVTY3JlZW5CdWZmZXJJbmZvKFNURE9VVCkuc3JXaW5kb3cKICAgICAgICAgICAgYWRqdXN0ZWRfcG9zaXRpb24uWSArPSBzci5Ub3AKICAgICAgICAgICAgYWRqdXN0ZWRfcG9zaXRpb24uWCArPSBzci5MZWZ0CiAgICAgICAgIyBSZXN1bWUgbm9ybWFsIHByb2Nlc3NpbmcKICAgICAgICBoYW5kbGUgPSBoYW5kbGVzW3N0cmVhbV9pZF0KICAgICAgICByZXR1cm4gX1NldENvbnNvbGVDdXJzb3JQb3NpdGlvbihoYW5kbGUsIGFkanVzdGVkX3Bvc2l0aW9uKQoKICAgIGRlZiBGaWxsQ29uc29sZU91dHB1dENoYXJhY3RlcihzdHJlYW1faWQsIGNoYXIsIGxlbmd0aCwgc3RhcnQpOgogICAgICAgIGhhbmRsZSA9IGhhbmRsZXNbc3RyZWFtX2lkXQogICAgICAgIGNoYXIgPSBjX2NoYXIoY2hhci5lbmNvZGUoKSkKICAgICAgICBsZW5ndGggPSB3aW50eXBlcy5EV09SRChsZW5ndGgpCiAgICAgICAgbnVtX3dyaXR0ZW4gPSB3aW50eXBlcy5EV09SRCgwKQogICAgICAgICMgTm90ZSB0aGF0IHRoaXMgaXMgaGFyZC1jb2RlZCBmb3IgQU5TSSAodnMgd2lkZSkgYnl0ZXMuCiAgICAgICAgc3VjY2VzcyA9IF9GaWxsQ29uc29sZU91dHB1dENoYXJhY3RlckEoCiAgICAgICAgICAgIGhhbmRsZSwgY2hhciwgbGVuZ3RoLCBzdGFydCwgYnlyZWYobnVtX3dyaXR0ZW4pKQogICAgICAgIHJldHVybiBudW1fd3JpdHRlbi52YWx1ZQoKICAgIGRlZiBGaWxsQ29uc29sZU91dHB1dEF0dHJpYnV0ZShzdHJlYW1faWQsIGF0dHIsIGxlbmd0aCwgc3RhcnQpOgogICAgICAgICcnJyBGaWxsQ29uc29sZU91dHB1dEF0dHJpYnV0ZSggaENvbnNvbGUsIGNzYmkud0F0dHJpYnV0ZXMsIGR3Q29uU2l6ZSwgY29vcmRTY3JlZW4sICZjQ2hhcnNXcml0dGVuICknJycKICAgICAgICBoYW5kbGUgPSBoYW5kbGVzW3N0cmVhbV9pZF0KICAgICAgICBhdHRyaWJ1dGUgPSB3aW50eXBlcy5XT1JEKGF0dHIpCiAgICAgICAgbGVuZ3RoID0gd2ludHlwZXMuRFdPUkQobGVuZ3RoKQogICAgICAgIG51bV93cml0dGVuID0gd2ludHlwZXMuRFdPUkQoMCkKICAgICAgICAjIE5vdGUgdGhhdCB0aGlzIGlzIGhhcmQtY29kZWQgZm9yIEFOU0kgKHZzIHdpZGUpIGJ5dGVzLgogICAgICAgIHJldHVybiBfRmlsbENvbnNvbGVPdXRwdXRBdHRyaWJ1dGUoCiAgICAgICAgICAgIGhhbmRsZSwgYXR0cmlidXRlLCBsZW5ndGgsIHN0YXJ0LCBieXJlZihudW1fd3JpdHRlbikpCgogICAgZGVmIFNldENvbnNvbGVUaXRsZSh0aXRsZSk6CiAgICAgICAgcmV0dXJuIF9TZXRDb25zb2xlVGl0bGVXKHRpdGxlKQpQSwMEFAAAAAAAAAAhAHd7ZyGSGAAAkhgAAC8AAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY29sb3JhbWEvd2ludGVybS5weSMgQ29weXJpZ2h0IEpvbmF0aGFuIEhhcnRsZXkgMjAxMy4gQlNEIDMtQ2xhdXNlIGxpY2Vuc2UsIHNlZSBMSUNFTlNFIGZpbGUuCmZyb20gLiBpbXBvcnQgd2luMzIKCgojIGZyb20gd2luY29uLmgKY2xhc3MgV2luQ29sb3Iob2JqZWN0KToKICAgIEJMQUNLICAgPSAwCiAgICBCTFVFICAgID0gMQogICAgR1JFRU4gICA9IDIKICAgIENZQU4gICAgPSAzCiAgICBSRUQgICAgID0gNAogICAgTUFHRU5UQSA9IDUKICAgIFlFTExPVyAgPSA2CiAgICBHUkVZICAgID0gNwoKIyBmcm9tIHdpbmNvbi5oCmNsYXNzIFdpblN0eWxlKG9iamVjdCk6CiAgICBOT1JNQUwgICAgICAgICAgICAgID0gMHgwMCAjIGRpbSB0ZXh0LCBkaW0gYmFja2dyb3VuZAogICAgQlJJR0hUICAgICAgICAgICAgICA9IDB4MDggIyBicmlnaHQgdGV4dCwgZGltIGJhY2tncm91bmQKICAgIEJSSUdIVF9CQUNLR1JPVU5EICAgPSAweDgwICMgZGltIHRleHQsIGJyaWdodCBiYWNrZ3JvdW5kCgpjbGFzcyBXaW5UZXJtKG9iamVjdCk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYuX2RlZmF1bHQgPSB3aW4zMi5HZXRDb25zb2xlU2NyZWVuQnVmZmVySW5mbyh3aW4zMi5TVERPVVQpLndBdHRyaWJ1dGVzCiAgICAgICAgc2VsZi5zZXRfYXR0cnMoc2VsZi5fZGVmYXVsdCkKICAgICAgICBzZWxmLl9kZWZhdWx0X2ZvcmUgPSBzZWxmLl9mb3JlCiAgICAgICAgc2VsZi5fZGVmYXVsdF9iYWNrID0gc2VsZi5fYmFjawogICAgICAgIHNlbGYuX2RlZmF1bHRfc3R5bGUgPSBzZWxmLl9zdHlsZQogICAgICAgICMgSW4gb3JkZXIgdG8gZW11bGF0ZSBMSUdIVF9FWCBpbiB3aW5kb3dzLCB3ZSBib3Jyb3cgdGhlIEJSSUdIVCBzdHlsZS4KICAgICAgICAjIFNvIHRoYXQgTElHSFRfRVggY29sb3JzIGFuZCBCUklHSFQgc3R5bGUgZG8gbm90IGNsb2JiZXIgZWFjaCBvdGhlciwKICAgICAgICAjIHdlIHRyYWNrIHRoZW0gc2VwYXJhdGVseSwgc2luY2UgTElHSFRfRVggaXMgb3ZlcndyaXR0ZW4gYnkgRm9yZS9CYWNrCiAgICAgICAgIyBhbmQgQlJJR0hUIGlzIG92ZXJ3cml0dGVuIGJ5IFN0eWxlIGNvZGVzLgogICAgICAgIHNlbGYuX2xpZ2h0ID0gMAoKICAgIGRlZiBnZXRfYXR0cnMoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2ZvcmUgKyBzZWxmLl9iYWNrICogMTYgKyAoc2VsZi5fc3R5bGUgfCBzZWxmLl9saWdodCkKCiAgICBkZWYgc2V0X2F0dHJzKHNlbGYsIHZhbHVlKToKICAgICAgICBzZWxmLl9mb3JlID0gdmFsdWUgJiA3CiAgICAgICAgc2VsZi5fYmFjayA9ICh2YWx1ZSA+PiA0KSAmIDcKICAgICAgICBzZWxmLl9zdHlsZSA9IHZhbHVlICYgKFdpblN0eWxlLkJSSUdIVCB8IFdpblN0eWxlLkJSSUdIVF9CQUNLR1JPVU5EKQoKICAgIGRlZiByZXNldF9hbGwoc2VsZiwgb25fc3RkZXJyPU5vbmUpOgogICAgICAgIHNlbGYuc2V0X2F0dHJzKHNlbGYuX2RlZmF1bHQpCiAgICAgICAgc2VsZi5zZXRfY29uc29sZShhdHRycz1zZWxmLl9kZWZhdWx0KQoKICAgIGRlZiBmb3JlKHNlbGYsIGZvcmU9Tm9uZSwgbGlnaHQ9RmFsc2UsIG9uX3N0ZGVycj1GYWxzZSk6CiAgICAgICAgaWYgZm9yZSBpcyBOb25lOgogICAgICAgICAgICBmb3JlID0gc2VsZi5fZGVmYXVsdF9mb3JlCiAgICAgICAgc2VsZi5fZm9yZSA9IGZvcmUKICAgICAgICAjIEVtdWxhdGUgTElHSFRfRVggd2l0aCBCUklHSFQgU3R5bGUKICAgICAgICBpZiBsaWdodDoKICAgICAgICAgICAgc2VsZi5fbGlnaHQgfD0gV2luU3R5bGUuQlJJR0hUCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5fbGlnaHQgJj0gfldpblN0eWxlLkJSSUdIVAogICAgICAgIHNlbGYuc2V0X2NvbnNvbGUob25fc3RkZXJyPW9uX3N0ZGVycikKCiAgICBkZWYgYmFjayhzZWxmLCBiYWNrPU5vbmUsIGxpZ2h0PUZhbHNlLCBvbl9zdGRlcnI9RmFsc2UpOgogICAgICAgIGlmIGJhY2sgaXMgTm9uZToKICAgICAgICAgICAgYmFjayA9IHNlbGYuX2RlZmF1bHRfYmFjawogICAgICAgIHNlbGYuX2JhY2sgPSBiYWNrCiAgICAgICAgIyBFbXVsYXRlIExJR0hUX0VYIHdpdGggQlJJR0hUX0JBQ0tHUk9VTkQgU3R5bGUKICAgICAgICBpZiBsaWdodDoKICAgICAgICAgICAgc2VsZi5fbGlnaHQgfD0gV2luU3R5bGUuQlJJR0hUX0JBQ0tHUk9VTkQKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLl9saWdodCAmPSB+V2luU3R5bGUuQlJJR0hUX0JBQ0tHUk9VTkQKICAgICAgICBzZWxmLnNldF9jb25zb2xlKG9uX3N0ZGVycj1vbl9zdGRlcnIpCgogICAgZGVmIHN0eWxlKHNlbGYsIHN0eWxlPU5vbmUsIG9uX3N0ZGVycj1GYWxzZSk6CiAgICAgICAgaWYgc3R5bGUgaXMgTm9uZToKICAgICAgICAgICAgc3R5bGUgPSBzZWxmLl9kZWZhdWx0X3N0eWxlCiAgICAgICAgc2VsZi5fc3R5bGUgPSBzdHlsZQogICAgICAgIHNlbGYuc2V0X2NvbnNvbGUob25fc3RkZXJyPW9uX3N0ZGVycikKCiAgICBkZWYgc2V0X2NvbnNvbGUoc2VsZiwgYXR0cnM9Tm9uZSwgb25fc3RkZXJyPUZhbHNlKToKICAgICAgICBpZiBhdHRycyBpcyBOb25lOgogICAgICAgICAgICBhdHRycyA9IHNlbGYuZ2V0X2F0dHJzKCkKICAgICAgICBoYW5kbGUgPSB3aW4zMi5TVERPVVQKICAgICAgICBpZiBvbl9zdGRlcnI6CiAgICAgICAgICAgIGhhbmRsZSA9IHdpbjMyLlNUREVSUgogICAgICAgIHdpbjMyLlNldENvbnNvbGVUZXh0QXR0cmlidXRlKGhhbmRsZSwgYXR0cnMpCgogICAgZGVmIGdldF9wb3NpdGlvbihzZWxmLCBoYW5kbGUpOgogICAgICAgIHBvc2l0aW9uID0gd2luMzIuR2V0Q29uc29sZVNjcmVlbkJ1ZmZlckluZm8oaGFuZGxlKS5kd0N1cnNvclBvc2l0aW9uCiAgICAgICAgIyBCZWNhdXNlIFdpbmRvd3MgY29vcmRpbmF0ZXMgYXJlIDAtYmFzZWQsCiAgICAgICAgIyBhbmQgd2luMzIuU2V0Q29uc29sZUN1cnNvclBvc2l0aW9uIGV4cGVjdHMgMS1iYXNlZC4KICAgICAgICBwb3NpdGlvbi5YICs9IDEKICAgICAgICBwb3NpdGlvbi5ZICs9IDEKICAgICAgICByZXR1cm4gcG9zaXRpb24KCiAgICBkZWYgc2V0X2N1cnNvcl9wb3NpdGlvbihzZWxmLCBwb3NpdGlvbj1Ob25lLCBvbl9zdGRlcnI9RmFsc2UpOgogICAgICAgIGlmIHBvc2l0aW9uIGlzIE5vbmU6CiAgICAgICAgICAgICMgSSdtIG5vdCBjdXJyZW50bHkgdHJhY2tpbmcgdGhlIHBvc2l0aW9uLCBzbyB0aGVyZSBpcyBubyBkZWZhdWx0LgogICAgICAgICAgICAjIHBvc2l0aW9uID0gc2VsZi5nZXRfcG9zaXRpb24oKQogICAgICAgICAgICByZXR1cm4KICAgICAgICBoYW5kbGUgPSB3aW4zMi5TVERPVVQKICAgICAgICBpZiBvbl9zdGRlcnI6CiAgICAgICAgICAgIGhhbmRsZSA9IHdpbjMyLlNUREVSUgogICAgICAgIHdpbjMyLlNldENvbnNvbGVDdXJzb3JQb3NpdGlvbihoYW5kbGUsIHBvc2l0aW9uKQoKICAgIGRlZiBjdXJzb3JfYWRqdXN0KHNlbGYsIHgsIHksIG9uX3N0ZGVycj1GYWxzZSk6CiAgICAgICAgaGFuZGxlID0gd2luMzIuU1RET1VUCiAgICAgICAgaWYgb25fc3RkZXJyOgogICAgICAgICAgICBoYW5kbGUgPSB3aW4zMi5TVERFUlIKICAgICAgICBwb3NpdGlvbiA9IHNlbGYuZ2V0X3Bvc2l0aW9uKGhhbmRsZSkKICAgICAgICBhZGp1c3RlZF9wb3NpdGlvbiA9IChwb3NpdGlvbi5ZICsgeSwgcG9zaXRpb24uWCArIHgpCiAgICAgICAgd2luMzIuU2V0Q29uc29sZUN1cnNvclBvc2l0aW9uKGhhbmRsZSwgYWRqdXN0ZWRfcG9zaXRpb24sIGFkanVzdD1GYWxzZSkKCiAgICBkZWYgZXJhc2Vfc2NyZWVuKHNlbGYsIG1vZGU9MCwgb25fc3RkZXJyPUZhbHNlKToKICAgICAgICAjIDAgc2hvdWxkIGNsZWFyIGZyb20gdGhlIGN1cnNvciB0byB0aGUgZW5kIG9mIHRoZSBzY3JlZW4uCiAgICAgICAgIyAxIHNob3VsZCBjbGVhciBmcm9tIHRoZSBjdXJzb3IgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgc2NyZWVuLgogICAgICAgICMgMiBzaG91bGQgY2xlYXIgdGhlIGVudGlyZSBzY3JlZW4sIGFuZCBtb3ZlIGN1cnNvciB0byAoMSwxKQogICAgICAgIGhhbmRsZSA9IHdpbjMyLlNURE9VVAogICAgICAgIGlmIG9uX3N0ZGVycjoKICAgICAgICAgICAgaGFuZGxlID0gd2luMzIuU1RERVJSCiAgICAgICAgY3NiaSA9IHdpbjMyLkdldENvbnNvbGVTY3JlZW5CdWZmZXJJbmZvKGhhbmRsZSkKICAgICAgICAjIGdldCB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlciBjZWxscyBpbiB0aGUgY3VycmVudCBidWZmZXIKICAgICAgICBjZWxsc19pbl9zY3JlZW4gPSBjc2JpLmR3U2l6ZS5YICogY3NiaS5kd1NpemUuWQogICAgICAgICMgZ2V0IG51bWJlciBvZiBjaGFyYWN0ZXIgY2VsbHMgYmVmb3JlIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uCiAgICAgICAgY2VsbHNfYmVmb3JlX2N1cnNvciA9IGNzYmkuZHdTaXplLlggKiBjc2JpLmR3Q3Vyc29yUG9zaXRpb24uWSArIGNzYmkuZHdDdXJzb3JQb3NpdGlvbi5YCiAgICAgICAgaWYgbW9kZSA9PSAwOgogICAgICAgICAgICBmcm9tX2Nvb3JkID0gY3NiaS5kd0N1cnNvclBvc2l0aW9uCiAgICAgICAgICAgIGNlbGxzX3RvX2VyYXNlID0gY2VsbHNfaW5fc2NyZWVuIC0gY2VsbHNfYmVmb3JlX2N1cnNvcgogICAgICAgIGlmIG1vZGUgPT0gMToKICAgICAgICAgICAgZnJvbV9jb29yZCA9IHdpbjMyLkNPT1JEKDAsIDApCiAgICAgICAgICAgIGNlbGxzX3RvX2VyYXNlID0gY2VsbHNfYmVmb3JlX2N1cnNvcgogICAgICAgIGVsaWYgbW9kZSA9PSAyOgogICAgICAgICAgICBmcm9tX2Nvb3JkID0gd2luMzIuQ09PUkQoMCwgMCkKICAgICAgICAgICAgY2VsbHNfdG9fZXJhc2UgPSBjZWxsc19pbl9zY3JlZW4KICAgICAgICAjIGZpbGwgdGhlIGVudGlyZSBzY3JlZW4gd2l0aCBibGFua3MKICAgICAgICB3aW4zMi5GaWxsQ29uc29sZU91dHB1dENoYXJhY3RlcihoYW5kbGUsICcgJywgY2VsbHNfdG9fZXJhc2UsIGZyb21fY29vcmQpCiAgICAgICAgIyBub3cgc2V0IHRoZSBidWZmZXIncyBhdHRyaWJ1dGVzIGFjY29yZGluZ2x5CiAgICAgICAgd2luMzIuRmlsbENvbnNvbGVPdXRwdXRBdHRyaWJ1dGUoaGFuZGxlLCBzZWxmLmdldF9hdHRycygpLCBjZWxsc190b19lcmFzZSwgZnJvbV9jb29yZCkKICAgICAgICBpZiBtb2RlID09IDI6CiAgICAgICAgICAgICMgcHV0IHRoZSBjdXJzb3Igd2hlcmUgbmVlZGVkCiAgICAgICAgICAgIHdpbjMyLlNldENvbnNvbGVDdXJzb3JQb3NpdGlvbihoYW5kbGUsICgxLCAxKSkKCiAgICBkZWYgZXJhc2VfbGluZShzZWxmLCBtb2RlPTAsIG9uX3N0ZGVycj1GYWxzZSk6CiAgICAgICAgIyAwIHNob3VsZCBjbGVhciBmcm9tIHRoZSBjdXJzb3IgdG8gdGhlIGVuZCBvZiB0aGUgbGluZS4KICAgICAgICAjIDEgc2hvdWxkIGNsZWFyIGZyb20gdGhlIGN1cnNvciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lLgogICAgICAgICMgMiBzaG91bGQgY2xlYXIgdGhlIGVudGlyZSBsaW5lLgogICAgICAgIGhhbmRsZSA9IHdpbjMyLlNURE9VVAogICAgICAgIGlmIG9uX3N0ZGVycjoKICAgICAgICAgICAgaGFuZGxlID0gd2luMzIuU1RERVJSCiAgICAgICAgY3NiaSA9IHdpbjMyLkdldENvbnNvbGVTY3JlZW5CdWZmZXJJbmZvKGhhbmRsZSkKICAgICAgICBpZiBtb2RlID09IDA6CiAgICAgICAgICAgIGZyb21fY29vcmQgPSBjc2JpLmR3Q3Vyc29yUG9zaXRpb24KICAgICAgICAgICAgY2VsbHNfdG9fZXJhc2UgPSBjc2JpLmR3U2l6ZS5YIC0gY3NiaS5kd0N1cnNvclBvc2l0aW9uLlgKICAgICAgICBpZiBtb2RlID09IDE6CiAgICAgICAgICAgIGZyb21fY29vcmQgPSB3aW4zMi5DT09SRCgwLCBjc2JpLmR3Q3Vyc29yUG9zaXRpb24uWSkKICAgICAgICAgICAgY2VsbHNfdG9fZXJhc2UgPSBjc2JpLmR3Q3Vyc29yUG9zaXRpb24uWAogICAgICAgIGVsaWYgbW9kZSA9PSAyOgogICAgICAgICAgICBmcm9tX2Nvb3JkID0gd2luMzIuQ09PUkQoMCwgY3NiaS5kd0N1cnNvclBvc2l0aW9uLlkpCiAgICAgICAgICAgIGNlbGxzX3RvX2VyYXNlID0gY3NiaS5kd1NpemUuWAogICAgICAgICMgZmlsbCB0aGUgZW50aXJlIHNjcmVlbiB3aXRoIGJsYW5rcwogICAgICAgIHdpbjMyLkZpbGxDb25zb2xlT3V0cHV0Q2hhcmFjdGVyKGhhbmRsZSwgJyAnLCBjZWxsc190b19lcmFzZSwgZnJvbV9jb29yZCkKICAgICAgICAjIG5vdyBzZXQgdGhlIGJ1ZmZlcidzIGF0dHJpYnV0ZXMgYWNjb3JkaW5nbHkKICAgICAgICB3aW4zMi5GaWxsQ29uc29sZU91dHB1dEF0dHJpYnV0ZShoYW5kbGUsIHNlbGYuZ2V0X2F0dHJzKCksIGNlbGxzX3RvX2VyYXNlLCBmcm9tX2Nvb3JkKQoKICAgIGRlZiBzZXRfdGl0bGUoc2VsZiwgdGl0bGUpOgogICAgICAgIHdpbjMyLlNldENvbnNvbGVUaXRsZSh0aXRsZSkKUEsDBBQAAAAAAAAAIQAmnFGXRQIAAEUCAAAvAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvX19pbml0X18ucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQojCiMgQ29weXJpZ2h0IChDKSAyMDEyLTIwMTYgVmluYXkgU2FqaXAuCiMgTGljZW5zZWQgdG8gdGhlIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uIHVuZGVyIGEgY29udHJpYnV0b3IgYWdyZWVtZW50LgojIFNlZSBMSUNFTlNFLnR4dCBhbmQgQ09OVFJJQlVUT1JTLnR4dC4KIwppbXBvcnQgbG9nZ2luZwoKX192ZXJzaW9uX18gPSAnMC4yLjQnCgpjbGFzcyBEaXN0bGliRXhjZXB0aW9uKEV4Y2VwdGlvbik6CiAgICBwYXNzCgp0cnk6CiAgICBmcm9tIGxvZ2dpbmcgaW1wb3J0IE51bGxIYW5kbGVyCmV4Y2VwdCBJbXBvcnRFcnJvcjogIyBwcmFnbWE6IG5vIGNvdmVyCiAgICBjbGFzcyBOdWxsSGFuZGxlcihsb2dnaW5nLkhhbmRsZXIpOgogICAgICAgIGRlZiBoYW5kbGUoc2VsZiwgcmVjb3JkKTogcGFzcwogICAgICAgIGRlZiBlbWl0KHNlbGYsIHJlY29yZCk6IHBhc3MKICAgICAgICBkZWYgY3JlYXRlTG9jayhzZWxmKTogc2VsZi5sb2NrID0gTm9uZQoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCmxvZ2dlci5hZGRIYW5kbGVyKE51bGxIYW5kbGVyKCkpClBLAwQUAAAAAAAAACEAI+9n/BIBAAASAQAAOQAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL19iYWNrcG9ydC9fX2luaXRfXy5weSIiIk1vZHVsZXMgY29waWVkIGZyb20gUHl0aG9uIDMgc3RhbmRhcmQgbGlicmFyaWVzLCBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuCgpJbmRpdmlkdWFsIGNsYXNzZXMgYW5kIGZ1bmN0aW9ucyBhcmUgZm91bmQgaW4gZDIuX2JhY2twb3J0Lm1pc2MuICBJbnRlbmRlZAp1c2FnZSBpcyB0byBhbHdheXMgaW1wb3J0IHRoaW5ncyBtaXNzaW5nIGZyb20gMy4xIGZyb20gdGhhdCBtb2R1bGU6IHRoZQpidWlsdC1pbi9zdGRsaWIgb2JqZWN0cyB3aWxsIGJlIHVzZWQgaWYgZm91bmQuCiIiIgpQSwMEFAAAAAAAAAAhAK+KL2XLAwAAywMAADUAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi9fYmFja3BvcnQvbWlzYy5weSMgLSotIGNvZGluZzogdXRmLTggLSotCiMKIyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgojIFNlZSBMSUNFTlNFLnR4dCBhbmQgQ09OVFJJQlVUT1JTLnR4dC4KIwoiIiJCYWNrcG9ydHMgZm9yIGluZGl2aWR1YWwgY2xhc3NlcyBhbmQgZnVuY3Rpb25zLiIiIgoKaW1wb3J0IG9zCmltcG9ydCBzeXMKCl9fYWxsX18gPSBbJ2NhY2hlX2Zyb21fc291cmNlJywgJ2NhbGxhYmxlJywgJ2ZzZW5jb2RlJ10KCgp0cnk6CiAgICBmcm9tIGltcCBpbXBvcnQgY2FjaGVfZnJvbV9zb3VyY2UKZXhjZXB0IEltcG9ydEVycm9yOgogICAgZGVmIGNhY2hlX2Zyb21fc291cmNlKHB5X2ZpbGUsIGRlYnVnPV9fZGVidWdfXyk6CiAgICAgICAgZXh0ID0gZGVidWcgYW5kICdjJyBvciAnbycKICAgICAgICByZXR1cm4gcHlfZmlsZSArIGV4dAoKCnRyeToKICAgIGNhbGxhYmxlID0gY2FsbGFibGUKZXhjZXB0IE5hbWVFcnJvcjoKICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IENhbGxhYmxlCgogICAgZGVmIGNhbGxhYmxlKG9iaik6CiAgICAgICAgcmV0dXJuIGlzaW5zdGFuY2Uob2JqLCBDYWxsYWJsZSkKCgp0cnk6CiAgICBmc2VuY29kZSA9IG9zLmZzZW5jb2RlCmV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgIGRlZiBmc2VuY29kZShmaWxlbmFtZSk6CiAgICAgICAgaWYgaXNpbnN0YW5jZShmaWxlbmFtZSwgYnl0ZXMpOgogICAgICAgICAgICByZXR1cm4gZmlsZW5hbWUKICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZmlsZW5hbWUsIHN0cik6CiAgICAgICAgICAgIHJldHVybiBmaWxlbmFtZS5lbmNvZGUoc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiZXhwZWN0IGJ5dGVzIG9yIHN0ciwgbm90ICVzIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKGZpbGVuYW1lKS5fX25hbWVfXykKUEsDBBQAAAAAAAAAIQDiYj3QL2QAAC9kAAA3AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvX2JhY2twb3J0L3NodXRpbC5weSMgLSotIGNvZGluZzogdXRmLTggLSotCiMKIyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgojIFNlZSBMSUNFTlNFLnR4dCBhbmQgQ09OVFJJQlVUT1JTLnR4dC4KIwoiIiJVdGlsaXR5IGZ1bmN0aW9ucyBmb3IgY29weWluZyBhbmQgYXJjaGl2aW5nIGZpbGVzIGFuZCBkaXJlY3RvcnkgdHJlZXMuCgpYWFggVGhlIGZ1bmN0aW9ucyBoZXJlIGRvbid0IGNvcHkgdGhlIHJlc291cmNlIGZvcmsgb3Igb3RoZXIgbWV0YWRhdGEgb24gTWFjLgoKIiIiCgppbXBvcnQgb3MKaW1wb3J0IHN5cwppbXBvcnQgc3RhdApmcm9tIG9zLnBhdGggaW1wb3J0IGFic3BhdGgKaW1wb3J0IGZubWF0Y2gKaW1wb3J0IGNvbGxlY3Rpb25zCmltcG9ydCBlcnJubwpmcm9tIC4gaW1wb3J0IHRhcmZpbGUKCnRyeToKICAgIGltcG9ydCBiejIKICAgIF9CWjJfU1VQUE9SVEVEID0gVHJ1ZQpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBfQloyX1NVUFBPUlRFRCA9IEZhbHNlCgp0cnk6CiAgICBmcm9tIHB3ZCBpbXBvcnQgZ2V0cHduYW0KZXhjZXB0IEltcG9ydEVycm9yOgogICAgZ2V0cHduYW0gPSBOb25lCgp0cnk6CiAgICBmcm9tIGdycCBpbXBvcnQgZ2V0Z3JuYW0KZXhjZXB0IEltcG9ydEVycm9yOgogICAgZ2V0Z3JuYW0gPSBOb25lCgpfX2FsbF9fID0gWyJjb3B5ZmlsZW9iaiIsICJjb3B5ZmlsZSIsICJjb3B5bW9kZSIsICJjb3B5c3RhdCIsICJjb3B5IiwgImNvcHkyIiwKICAgICAgICAgICAiY29weXRyZWUiLCAibW92ZSIsICJybXRyZWUiLCAiRXJyb3IiLCAiU3BlY2lhbEZpbGVFcnJvciIsCiAgICAgICAgICAgIkV4ZWNFcnJvciIsICJtYWtlX2FyY2hpdmUiLCAiZ2V0X2FyY2hpdmVfZm9ybWF0cyIsCiAgICAgICAgICAgInJlZ2lzdGVyX2FyY2hpdmVfZm9ybWF0IiwgInVucmVnaXN0ZXJfYXJjaGl2ZV9mb3JtYXQiLAogICAgICAgICAgICJnZXRfdW5wYWNrX2Zvcm1hdHMiLCAicmVnaXN0ZXJfdW5wYWNrX2Zvcm1hdCIsCiAgICAgICAgICAgInVucmVnaXN0ZXJfdW5wYWNrX2Zvcm1hdCIsICJ1bnBhY2tfYXJjaGl2ZSIsICJpZ25vcmVfcGF0dGVybnMiXQoKY2xhc3MgRXJyb3IoRW52aXJvbm1lbnRFcnJvcik6CiAgICBwYXNzCgpjbGFzcyBTcGVjaWFsRmlsZUVycm9yKEVudmlyb25tZW50RXJyb3IpOgogICAgIiIiUmFpc2VkIHdoZW4gdHJ5aW5nIHRvIGRvIGEga2luZCBvZiBvcGVyYXRpb24gKGUuZy4gY29weWluZykgd2hpY2ggaXMKICAgIG5vdCBzdXBwb3J0ZWQgb24gYSBzcGVjaWFsIGZpbGUgKGUuZy4gYSBuYW1lZCBwaXBlKSIiIgoKY2xhc3MgRXhlY0Vycm9yKEVudmlyb25tZW50RXJyb3IpOgogICAgIiIiUmFpc2VkIHdoZW4gYSBjb21tYW5kIGNvdWxkIG5vdCBiZSBleGVjdXRlZCIiIgoKY2xhc3MgUmVhZEVycm9yKEVudmlyb25tZW50RXJyb3IpOgogICAgIiIiUmFpc2VkIHdoZW4gYW4gYXJjaGl2ZSBjYW5ub3QgYmUgcmVhZCIiIgoKY2xhc3MgUmVnaXN0cnlFcnJvcihFeGNlcHRpb24pOgogICAgIiIiUmFpc2VkIHdoZW4gYSByZWdpc3RyeSBvcGVyYXRpb24gd2l0aCB0aGUgYXJjaGl2aW5nCiAgICBhbmQgdW5wYWNraW5nIHJlZ2lzdHJpZXMgZmFpbHMiIiIKCgp0cnk6CiAgICBXaW5kb3dzRXJyb3IKZXhjZXB0IE5hbWVFcnJvcjoKICAgIFdpbmRvd3NFcnJvciA9IE5vbmUKCmRlZiBjb3B5ZmlsZW9iaihmc3JjLCBmZHN0LCBsZW5ndGg9MTYqMTAyNCk6CiAgICAiIiJjb3B5IGRhdGEgZnJvbSBmaWxlLWxpa2Ugb2JqZWN0IGZzcmMgdG8gZmlsZS1saWtlIG9iamVjdCBmZHN0IiIiCiAgICB3aGlsZSAxOgogICAgICAgIGJ1ZiA9IGZzcmMucmVhZChsZW5ndGgpCiAgICAgICAgaWYgbm90IGJ1ZjoKICAgICAgICAgICAgYnJlYWsKICAgICAgICBmZHN0LndyaXRlKGJ1ZikKCmRlZiBfc2FtZWZpbGUoc3JjLCBkc3QpOgogICAgIyBNYWNpbnRvc2gsIFVuaXguCiAgICBpZiBoYXNhdHRyKG9zLnBhdGgsICdzYW1lZmlsZScpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIG9zLnBhdGguc2FtZWZpbGUoc3JjLCBkc3QpCiAgICAgICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICMgQWxsIG90aGVyIHBsYXRmb3JtczogY2hlY2sgZm9yIHNhbWUgcGF0aG5hbWUuCiAgICByZXR1cm4gKG9zLnBhdGgubm9ybWNhc2Uob3MucGF0aC5hYnNwYXRoKHNyYykpID09CiAgICAgICAgICAgIG9zLnBhdGgubm9ybWNhc2Uob3MucGF0aC5hYnNwYXRoKGRzdCkpKQoKZGVmIGNvcHlmaWxlKHNyYywgZHN0KToKICAgICIiIkNvcHkgZGF0YSBmcm9tIHNyYyB0byBkc3QiIiIKICAgIGlmIF9zYW1lZmlsZShzcmMsIGRzdCk6CiAgICAgICAgcmFpc2UgRXJyb3IoImAlc2AgYW5kIGAlc2AgYXJlIHRoZSBzYW1lIGZpbGUiICUgKHNyYywgZHN0KSkKCiAgICBmb3IgZm4gaW4gW3NyYywgZHN0XToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHN0ID0gb3Muc3RhdChmbikKICAgICAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICAgICAgIyBGaWxlIG1vc3QgbGlrZWx5IGRvZXMgbm90IGV4aXN0CiAgICAgICAgICAgIHBhc3MKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIFhYWCBXaGF0IGFib3V0IG90aGVyIHNwZWNpYWwgZmlsZXM/IChzb2NrZXRzLCBkZXZpY2VzLi4uKQogICAgICAgICAgICBpZiBzdGF0LlNfSVNGSUZPKHN0LnN0X21vZGUpOgogICAgICAgICAgICAgICAgcmFpc2UgU3BlY2lhbEZpbGVFcnJvcigiYCVzYCBpcyBhIG5hbWVkIHBpcGUiICUgZm4pCgogICAgd2l0aCBvcGVuKHNyYywgJ3JiJykgYXMgZnNyYzoKICAgICAgICB3aXRoIG9wZW4oZHN0LCAnd2InKSBhcyBmZHN0OgogICAgICAgICAgICBjb3B5ZmlsZW9iaihmc3JjLCBmZHN0KQoKZGVmIGNvcHltb2RlKHNyYywgZHN0KToKICAgICIiIkNvcHkgbW9kZSBiaXRzIGZyb20gc3JjIHRvIGRzdCIiIgogICAgaWYgaGFzYXR0cihvcywgJ2NobW9kJyk6CiAgICAgICAgc3QgPSBvcy5zdGF0KHNyYykKICAgICAgICBtb2RlID0gc3RhdC5TX0lNT0RFKHN0LnN0X21vZGUpCiAgICAgICAgb3MuY2htb2QoZHN0LCBtb2RlKQoKZGVmIGNvcHlzdGF0KHNyYywgZHN0KToKICAgICIiIkNvcHkgYWxsIHN0YXQgaW5mbyAobW9kZSBiaXRzLCBhdGltZSwgbXRpbWUsIGZsYWdzKSBmcm9tIHNyYyB0byBkc3QiIiIKICAgIHN0ID0gb3Muc3RhdChzcmMpCiAgICBtb2RlID0gc3RhdC5TX0lNT0RFKHN0LnN0X21vZGUpCiAgICBpZiBoYXNhdHRyKG9zLCAndXRpbWUnKToKICAgICAgICBvcy51dGltZShkc3QsIChzdC5zdF9hdGltZSwgc3Quc3RfbXRpbWUpKQogICAgaWYgaGFzYXR0cihvcywgJ2NobW9kJyk6CiAgICAgICAgb3MuY2htb2QoZHN0LCBtb2RlKQogICAgaWYgaGFzYXR0cihvcywgJ2NoZmxhZ3MnKSBhbmQgaGFzYXR0cihzdCwgJ3N0X2ZsYWdzJyk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBvcy5jaGZsYWdzKGRzdCwgc3Quc3RfZmxhZ3MpCiAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgd2h5OgogICAgICAgICAgICBpZiAobm90IGhhc2F0dHIoZXJybm8sICdFT1BOT1RTVVBQJykgb3IKICAgICAgICAgICAgICAgIHdoeS5lcnJubyAhPSBlcnJuby5FT1BOT1RTVVBQKToKICAgICAgICAgICAgICAgIHJhaXNlCgpkZWYgY29weShzcmMsIGRzdCk6CiAgICAiIiJDb3B5IGRhdGEgYW5kIG1vZGUgYml0cyAoImNwIHNyYyBkc3QiKS4KCiAgICBUaGUgZGVzdGluYXRpb24gbWF5IGJlIGEgZGlyZWN0b3J5LgoKICAgICIiIgogICAgaWYgb3MucGF0aC5pc2Rpcihkc3QpOgogICAgICAgIGRzdCA9IG9zLnBhdGguam9pbihkc3QsIG9zLnBhdGguYmFzZW5hbWUoc3JjKSkKICAgIGNvcHlmaWxlKHNyYywgZHN0KQogICAgY29weW1vZGUoc3JjLCBkc3QpCgpkZWYgY29weTIoc3JjLCBkc3QpOgogICAgIiIiQ29weSBkYXRhIGFuZCBhbGwgc3RhdCBpbmZvICgiY3AgLXAgc3JjIGRzdCIpLgoKICAgIFRoZSBkZXN0aW5hdGlvbiBtYXkgYmUgYSBkaXJlY3RvcnkuCgogICAgIiIiCiAgICBpZiBvcy5wYXRoLmlzZGlyKGRzdCk6CiAgICAgICAgZHN0ID0gb3MucGF0aC5qb2luKGRzdCwgb3MucGF0aC5iYXNlbmFtZShzcmMpKQogICAgY29weWZpbGUoc3JjLCBkc3QpCiAgICBjb3B5c3RhdChzcmMsIGRzdCkKCmRlZiBpZ25vcmVfcGF0dGVybnMoKnBhdHRlcm5zKToKICAgICIiIkZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgYXMgY29weXRyZWUoKSBpZ25vcmUgcGFyYW1ldGVyLgoKICAgIFBhdHRlcm5zIGlzIGEgc2VxdWVuY2Ugb2YgZ2xvYi1zdHlsZSBwYXR0ZXJucwogICAgdGhhdCBhcmUgdXNlZCB0byBleGNsdWRlIGZpbGVzIiIiCiAgICBkZWYgX2lnbm9yZV9wYXR0ZXJucyhwYXRoLCBuYW1lcyk6CiAgICAgICAgaWdub3JlZF9uYW1lcyA9IFtdCiAgICAgICAgZm9yIHBhdHRlcm4gaW4gcGF0dGVybnM6CiAgICAgICAgICAgIGlnbm9yZWRfbmFtZXMuZXh0ZW5kKGZubWF0Y2guZmlsdGVyKG5hbWVzLCBwYXR0ZXJuKSkKICAgICAgICByZXR1cm4gc2V0KGlnbm9yZWRfbmFtZXMpCiAgICByZXR1cm4gX2lnbm9yZV9wYXR0ZXJucwoKZGVmIGNvcHl0cmVlKHNyYywgZHN0LCBzeW1saW5rcz1GYWxzZSwgaWdub3JlPU5vbmUsIGNvcHlfZnVuY3Rpb249Y29weTIsCiAgICAgICAgICAgICBpZ25vcmVfZGFuZ2xpbmdfc3ltbGlua3M9RmFsc2UpOgogICAgIiIiUmVjdXJzaXZlbHkgY29weSBhIGRpcmVjdG9yeSB0cmVlLgoKICAgIFRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgbXVzdCBub3QgYWxyZWFkeSBleGlzdC4KICAgIElmIGV4Y2VwdGlvbihzKSBvY2N1ciwgYW4gRXJyb3IgaXMgcmFpc2VkIHdpdGggYSBsaXN0IG9mIHJlYXNvbnMuCgogICAgSWYgdGhlIG9wdGlvbmFsIHN5bWxpbmtzIGZsYWcgaXMgdHJ1ZSwgc3ltYm9saWMgbGlua3MgaW4gdGhlCiAgICBzb3VyY2UgdHJlZSByZXN1bHQgaW4gc3ltYm9saWMgbGlua3MgaW4gdGhlIGRlc3RpbmF0aW9uIHRyZWU7IGlmCiAgICBpdCBpcyBmYWxzZSwgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlcyBwb2ludGVkIHRvIGJ5IHN5bWJvbGljCiAgICBsaW5rcyBhcmUgY29waWVkLiBJZiB0aGUgZmlsZSBwb2ludGVkIGJ5IHRoZSBzeW1saW5rIGRvZXNuJ3QKICAgIGV4aXN0LCBhbiBleGNlcHRpb24gd2lsbCBiZSBhZGRlZCBpbiB0aGUgbGlzdCBvZiBlcnJvcnMgcmFpc2VkIGluCiAgICBhbiBFcnJvciBleGNlcHRpb24gYXQgdGhlIGVuZCBvZiB0aGUgY29weSBwcm9jZXNzLgoKICAgIFlvdSBjYW4gc2V0IHRoZSBvcHRpb25hbCBpZ25vcmVfZGFuZ2xpbmdfc3ltbGlua3MgZmxhZyB0byB0cnVlIGlmIHlvdQogICAgd2FudCB0byBzaWxlbmNlIHRoaXMgZXhjZXB0aW9uLiBOb3RpY2UgdGhhdCB0aGlzIGhhcyBubyBlZmZlY3Qgb24KICAgIHBsYXRmb3JtcyB0aGF0IGRvbid0IHN1cHBvcnQgb3Muc3ltbGluay4KCiAgICBUaGUgb3B0aW9uYWwgaWdub3JlIGFyZ3VtZW50IGlzIGEgY2FsbGFibGUuIElmIGdpdmVuLCBpdAogICAgaXMgY2FsbGVkIHdpdGggdGhlIGBzcmNgIHBhcmFtZXRlciwgd2hpY2ggaXMgdGhlIGRpcmVjdG9yeQogICAgYmVpbmcgdmlzaXRlZCBieSBjb3B5dHJlZSgpLCBhbmQgYG5hbWVzYCB3aGljaCBpcyB0aGUgbGlzdCBvZgogICAgYHNyY2AgY29udGVudHMsIGFzIHJldHVybmVkIGJ5IG9zLmxpc3RkaXIoKToKCiAgICAgICAgY2FsbGFibGUoc3JjLCBuYW1lcykgLT4gaWdub3JlZF9uYW1lcwoKICAgIFNpbmNlIGNvcHl0cmVlKCkgaXMgY2FsbGVkIHJlY3Vyc2l2ZWx5LCB0aGUgY2FsbGFibGUgd2lsbCBiZQogICAgY2FsbGVkIG9uY2UgZm9yIGVhY2ggZGlyZWN0b3J5IHRoYXQgaXMgY29waWVkLiBJdCByZXR1cm5zIGEKICAgIGxpc3Qgb2YgbmFtZXMgcmVsYXRpdmUgdG8gdGhlIGBzcmNgIGRpcmVjdG9yeSB0aGF0IHNob3VsZAogICAgbm90IGJlIGNvcGllZC4KCiAgICBUaGUgb3B0aW9uYWwgY29weV9mdW5jdGlvbiBhcmd1bWVudCBpcyBhIGNhbGxhYmxlIHRoYXQgd2lsbCBiZSB1c2VkCiAgICB0byBjb3B5IGVhY2ggZmlsZS4gSXQgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgc291cmNlIHBhdGggYW5kIHRoZQogICAgZGVzdGluYXRpb24gcGF0aCBhcyBhcmd1bWVudHMuIEJ5IGRlZmF1bHQsIGNvcHkyKCkgaXMgdXNlZCwgYnV0IGFueQogICAgZnVuY3Rpb24gdGhhdCBzdXBwb3J0cyB0aGUgc2FtZSBzaWduYXR1cmUgKGxpa2UgY29weSgpKSBjYW4gYmUgdXNlZC4KCiAgICAiIiIKICAgIG5hbWVzID0gb3MubGlzdGRpcihzcmMpCiAgICBpZiBpZ25vcmUgaXMgbm90IE5vbmU6CiAgICAgICAgaWdub3JlZF9uYW1lcyA9IGlnbm9yZShzcmMsIG5hbWVzKQogICAgZWxzZToKICAgICAgICBpZ25vcmVkX25hbWVzID0gc2V0KCkKCiAgICBvcy5tYWtlZGlycyhkc3QpCiAgICBlcnJvcnMgPSBbXQogICAgZm9yIG5hbWUgaW4gbmFtZXM6CiAgICAgICAgaWYgbmFtZSBpbiBpZ25vcmVkX25hbWVzOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIHNyY25hbWUgPSBvcy5wYXRoLmpvaW4oc3JjLCBuYW1lKQogICAgICAgIGRzdG5hbWUgPSBvcy5wYXRoLmpvaW4oZHN0LCBuYW1lKQogICAgICAgIHRyeToKICAgICAgICAgICAgaWYgb3MucGF0aC5pc2xpbmsoc3JjbmFtZSk6CiAgICAgICAgICAgICAgICBsaW5rdG8gPSBvcy5yZWFkbGluayhzcmNuYW1lKQogICAgICAgICAgICAgICAgaWYgc3ltbGlua3M6CiAgICAgICAgICAgICAgICAgICAgb3Muc3ltbGluayhsaW5rdG8sIGRzdG5hbWUpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICMgaWdub3JlIGRhbmdsaW5nIHN5bWxpbmsgaWYgdGhlIGZsYWcgaXMgb24KICAgICAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMobGlua3RvKSBhbmQgaWdub3JlX2RhbmdsaW5nX3N5bWxpbmtzOgogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgICMgb3RoZXJ3aXNlIGxldCB0aGUgY29weSBvY2N1cnMuIGNvcHkyIHdpbGwgcmFpc2UgYW4gZXJyb3IKICAgICAgICAgICAgICAgICAgICBjb3B5X2Z1bmN0aW9uKHNyY25hbWUsIGRzdG5hbWUpCiAgICAgICAgICAgIGVsaWYgb3MucGF0aC5pc2RpcihzcmNuYW1lKToKICAgICAgICAgICAgICAgIGNvcHl0cmVlKHNyY25hbWUsIGRzdG5hbWUsIHN5bWxpbmtzLCBpZ25vcmUsIGNvcHlfZnVuY3Rpb24pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIFdpbGwgcmFpc2UgYSBTcGVjaWFsRmlsZUVycm9yIGZvciB1bnN1cHBvcnRlZCBmaWxlIHR5cGVzCiAgICAgICAgICAgICAgICBjb3B5X2Z1bmN0aW9uKHNyY25hbWUsIGRzdG5hbWUpCiAgICAgICAgIyBjYXRjaCB0aGUgRXJyb3IgZnJvbSB0aGUgcmVjdXJzaXZlIGNvcHl0cmVlIHNvIHRoYXQgd2UgY2FuCiAgICAgICAgIyBjb250aW51ZSB3aXRoIG90aGVyIGZpbGVzCiAgICAgICAgZXhjZXB0IEVycm9yIGFzIGVycjoKICAgICAgICAgICAgZXJyb3JzLmV4dGVuZChlcnIuYXJnc1swXSkKICAgICAgICBleGNlcHQgRW52aXJvbm1lbnRFcnJvciBhcyB3aHk6CiAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoKHNyY25hbWUsIGRzdG5hbWUsIHN0cih3aHkpKSkKICAgIHRyeToKICAgICAgICBjb3B5c3RhdChzcmMsIGRzdCkKICAgIGV4Y2VwdCBPU0Vycm9yIGFzIHdoeToKICAgICAgICBpZiBXaW5kb3dzRXJyb3IgaXMgbm90IE5vbmUgYW5kIGlzaW5zdGFuY2Uod2h5LCBXaW5kb3dzRXJyb3IpOgogICAgICAgICAgICAjIENvcHlpbmcgZmlsZSBhY2Nlc3MgdGltZXMgbWF5IGZhaWwgb24gV2luZG93cwogICAgICAgICAgICBwYXNzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZXJyb3JzLmV4dGVuZCgoc3JjLCBkc3QsIHN0cih3aHkpKSkKICAgIGlmIGVycm9yczoKICAgICAgICByYWlzZSBFcnJvcihlcnJvcnMpCgpkZWYgcm10cmVlKHBhdGgsIGlnbm9yZV9lcnJvcnM9RmFsc2UsIG9uZXJyb3I9Tm9uZSk6CiAgICAiIiJSZWN1cnNpdmVseSBkZWxldGUgYSBkaXJlY3RvcnkgdHJlZS4KCiAgICBJZiBpZ25vcmVfZXJyb3JzIGlzIHNldCwgZXJyb3JzIGFyZSBpZ25vcmVkOyBvdGhlcndpc2UsIGlmIG9uZXJyb3IKICAgIGlzIHNldCwgaXQgaXMgY2FsbGVkIHRvIGhhbmRsZSB0aGUgZXJyb3Igd2l0aCBhcmd1bWVudHMgKGZ1bmMsCiAgICBwYXRoLCBleGNfaW5mbykgd2hlcmUgZnVuYyBpcyBvcy5saXN0ZGlyLCBvcy5yZW1vdmUsIG9yIG9zLnJtZGlyOwogICAgcGF0aCBpcyB0aGUgYXJndW1lbnQgdG8gdGhhdCBmdW5jdGlvbiB0aGF0IGNhdXNlZCBpdCB0byBmYWlsOyBhbmQKICAgIGV4Y19pbmZvIGlzIGEgdHVwbGUgcmV0dXJuZWQgYnkgc3lzLmV4Y19pbmZvKCkuICBJZiBpZ25vcmVfZXJyb3JzCiAgICBpcyBmYWxzZSBhbmQgb25lcnJvciBpcyBOb25lLCBhbiBleGNlcHRpb24gaXMgcmFpc2VkLgoKICAgICIiIgogICAgaWYgaWdub3JlX2Vycm9yczoKICAgICAgICBkZWYgb25lcnJvcigqYXJncyk6CiAgICAgICAgICAgIHBhc3MKICAgIGVsaWYgb25lcnJvciBpcyBOb25lOgogICAgICAgIGRlZiBvbmVycm9yKCphcmdzKToKICAgICAgICAgICAgcmFpc2UKICAgIHRyeToKICAgICAgICBpZiBvcy5wYXRoLmlzbGluayhwYXRoKToKICAgICAgICAgICAgIyBzeW1saW5rcyB0byBkaXJlY3RvcmllcyBhcmUgZm9yYmlkZGVuLCBzZWUgYnVnICMxNjY5CiAgICAgICAgICAgIHJhaXNlIE9TRXJyb3IoIkNhbm5vdCBjYWxsIHJtdHJlZSBvbiBhIHN5bWJvbGljIGxpbmsiKQogICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgb25lcnJvcihvcy5wYXRoLmlzbGluaywgcGF0aCwgc3lzLmV4Y19pbmZvKCkpCiAgICAgICAgIyBjYW4ndCBjb250aW51ZSBldmVuIGlmIG9uZXJyb3IgaG9vayByZXR1cm5zCiAgICAgICAgcmV0dXJuCiAgICBuYW1lcyA9IFtdCiAgICB0cnk6CiAgICAgICAgbmFtZXMgPSBvcy5saXN0ZGlyKHBhdGgpCiAgICBleGNlcHQgb3MuZXJyb3I6CiAgICAgICAgb25lcnJvcihvcy5saXN0ZGlyLCBwYXRoLCBzeXMuZXhjX2luZm8oKSkKICAgIGZvciBuYW1lIGluIG5hbWVzOgogICAgICAgIGZ1bGxuYW1lID0gb3MucGF0aC5qb2luKHBhdGgsIG5hbWUpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBtb2RlID0gb3MubHN0YXQoZnVsbG5hbWUpLnN0X21vZGUKICAgICAgICBleGNlcHQgb3MuZXJyb3I6CiAgICAgICAgICAgIG1vZGUgPSAwCiAgICAgICAgaWYgc3RhdC5TX0lTRElSKG1vZGUpOgogICAgICAgICAgICBybXRyZWUoZnVsbG5hbWUsIGlnbm9yZV9lcnJvcnMsIG9uZXJyb3IpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgb3MucmVtb3ZlKGZ1bGxuYW1lKQogICAgICAgICAgICBleGNlcHQgb3MuZXJyb3I6CiAgICAgICAgICAgICAgICBvbmVycm9yKG9zLnJlbW92ZSwgZnVsbG5hbWUsIHN5cy5leGNfaW5mbygpKQogICAgdHJ5OgogICAgICAgIG9zLnJtZGlyKHBhdGgpCiAgICBleGNlcHQgb3MuZXJyb3I6CiAgICAgICAgb25lcnJvcihvcy5ybWRpciwgcGF0aCwgc3lzLmV4Y19pbmZvKCkpCgoKZGVmIF9iYXNlbmFtZShwYXRoKToKICAgICMgQSBiYXNlbmFtZSgpIHZhcmlhbnQgd2hpY2ggZmlyc3Qgc3RyaXBzIHRoZSB0cmFpbGluZyBzbGFzaCwgaWYgcHJlc2VudC4KICAgICMgVGh1cyB3ZSBhbHdheXMgZ2V0IHRoZSBsYXN0IGNvbXBvbmVudCBvZiB0aGUgcGF0aCwgZXZlbiBmb3IgZGlyZWN0b3JpZXMuCiAgICByZXR1cm4gb3MucGF0aC5iYXNlbmFtZShwYXRoLnJzdHJpcChvcy5wYXRoLnNlcCkpCgpkZWYgbW92ZShzcmMsIGRzdCk6CiAgICAiIiJSZWN1cnNpdmVseSBtb3ZlIGEgZmlsZSBvciBkaXJlY3RvcnkgdG8gYW5vdGhlciBsb2NhdGlvbi4gVGhpcyBpcwogICAgc2ltaWxhciB0byB0aGUgVW5peCAibXYiIGNvbW1hbmQuCgogICAgSWYgdGhlIGRlc3RpbmF0aW9uIGlzIGEgZGlyZWN0b3J5IG9yIGEgc3ltbGluayB0byBhIGRpcmVjdG9yeSwgdGhlIHNvdXJjZQogICAgaXMgbW92ZWQgaW5zaWRlIHRoZSBkaXJlY3RvcnkuIFRoZSBkZXN0aW5hdGlvbiBwYXRoIG11c3Qgbm90IGFscmVhZHkKICAgIGV4aXN0LgoKICAgIElmIHRoZSBkZXN0aW5hdGlvbiBhbHJlYWR5IGV4aXN0cyBidXQgaXMgbm90IGEgZGlyZWN0b3J5LCBpdCBtYXkgYmUKICAgIG92ZXJ3cml0dGVuIGRlcGVuZGluZyBvbiBvcy5yZW5hbWUoKSBzZW1hbnRpY3MuCgogICAgSWYgdGhlIGRlc3RpbmF0aW9uIGlzIG9uIG91ciBjdXJyZW50IGZpbGVzeXN0ZW0sIHRoZW4gcmVuYW1lKCkgaXMgdXNlZC4KICAgIE90aGVyd2lzZSwgc3JjIGlzIGNvcGllZCB0byB0aGUgZGVzdGluYXRpb24gYW5kIHRoZW4gcmVtb3ZlZC4KICAgIEEgbG90IG1vcmUgY291bGQgYmUgZG9uZSBoZXJlLi4uICBBIGxvb2sgYXQgYSBtdi5jIHNob3dzIGEgbG90IG9mCiAgICB0aGUgaXNzdWVzIHRoaXMgaW1wbGVtZW50YXRpb24gZ2xvc3NlcyBvdmVyLgoKICAgICIiIgogICAgcmVhbF9kc3QgPSBkc3QKICAgIGlmIG9zLnBhdGguaXNkaXIoZHN0KToKICAgICAgICBpZiBfc2FtZWZpbGUoc3JjLCBkc3QpOgogICAgICAgICAgICAjIFdlIG1pZ2h0IGJlIG9uIGEgY2FzZSBpbnNlbnNpdGl2ZSBmaWxlc3lzdGVtLAogICAgICAgICAgICAjIHBlcmZvcm0gdGhlIHJlbmFtZSBhbnl3YXkuCiAgICAgICAgICAgIG9zLnJlbmFtZShzcmMsIGRzdCkKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHJlYWxfZHN0ID0gb3MucGF0aC5qb2luKGRzdCwgX2Jhc2VuYW1lKHNyYykpCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocmVhbF9kc3QpOgogICAgICAgICAgICByYWlzZSBFcnJvcigiRGVzdGluYXRpb24gcGF0aCAnJXMnIGFscmVhZHkgZXhpc3RzIiAlIHJlYWxfZHN0KQogICAgdHJ5OgogICAgICAgIG9zLnJlbmFtZShzcmMsIHJlYWxfZHN0KQogICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgaWYgb3MucGF0aC5pc2RpcihzcmMpOgogICAgICAgICAgICBpZiBfZGVzdGluc3JjKHNyYywgZHN0KToKICAgICAgICAgICAgICAgIHJhaXNlIEVycm9yKCJDYW5ub3QgbW92ZSBhIGRpcmVjdG9yeSAnJXMnIGludG8gaXRzZWxmICclcycuIiAlIChzcmMsIGRzdCkpCiAgICAgICAgICAgIGNvcHl0cmVlKHNyYywgcmVhbF9kc3QsIHN5bWxpbmtzPVRydWUpCiAgICAgICAgICAgIHJtdHJlZShzcmMpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgY29weTIoc3JjLCByZWFsX2RzdCkKICAgICAgICAgICAgb3MudW5saW5rKHNyYykKCmRlZiBfZGVzdGluc3JjKHNyYywgZHN0KToKICAgIHNyYyA9IGFic3BhdGgoc3JjKQogICAgZHN0ID0gYWJzcGF0aChkc3QpCiAgICBpZiBub3Qgc3JjLmVuZHN3aXRoKG9zLnBhdGguc2VwKToKICAgICAgICBzcmMgKz0gb3MucGF0aC5zZXAKICAgIGlmIG5vdCBkc3QuZW5kc3dpdGgob3MucGF0aC5zZXApOgogICAgICAgIGRzdCArPSBvcy5wYXRoLnNlcAogICAgcmV0dXJuIGRzdC5zdGFydHN3aXRoKHNyYykKCmRlZiBfZ2V0X2dpZChuYW1lKToKICAgICIiIlJldHVybnMgYSBnaWQsIGdpdmVuIGEgZ3JvdXAgbmFtZS4iIiIKICAgIGlmIGdldGdybmFtIGlzIE5vbmUgb3IgbmFtZSBpcyBOb25lOgogICAgICAgIHJldHVybiBOb25lCiAgICB0cnk6CiAgICAgICAgcmVzdWx0ID0gZ2V0Z3JuYW0obmFtZSkKICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICByZXN1bHQgPSBOb25lCiAgICBpZiByZXN1bHQgaXMgbm90IE5vbmU6CiAgICAgICAgcmV0dXJuIHJlc3VsdFsyXQogICAgcmV0dXJuIE5vbmUKCmRlZiBfZ2V0X3VpZChuYW1lKToKICAgICIiIlJldHVybnMgYW4gdWlkLCBnaXZlbiBhIHVzZXIgbmFtZS4iIiIKICAgIGlmIGdldHB3bmFtIGlzIE5vbmUgb3IgbmFtZSBpcyBOb25lOgogICAgICAgIHJldHVybiBOb25lCiAgICB0cnk6CiAgICAgICAgcmVzdWx0ID0gZ2V0cHduYW0obmFtZSkKICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICByZXN1bHQgPSBOb25lCiAgICBpZiByZXN1bHQgaXMgbm90IE5vbmU6CiAgICAgICAgcmV0dXJuIHJlc3VsdFsyXQogICAgcmV0dXJuIE5vbmUKCmRlZiBfbWFrZV90YXJiYWxsKGJhc2VfbmFtZSwgYmFzZV9kaXIsIGNvbXByZXNzPSJnemlwIiwgdmVyYm9zZT0wLCBkcnlfcnVuPTAsCiAgICAgICAgICAgICAgICAgIG93bmVyPU5vbmUsIGdyb3VwPU5vbmUsIGxvZ2dlcj1Ob25lKToKICAgICIiIkNyZWF0ZSBhIChwb3NzaWJseSBjb21wcmVzc2VkKSB0YXIgZmlsZSBmcm9tIGFsbCB0aGUgZmlsZXMgdW5kZXIKICAgICdiYXNlX2RpcicuCgogICAgJ2NvbXByZXNzJyBtdXN0IGJlICJnemlwIiAodGhlIGRlZmF1bHQpLCAiYnppcDIiLCBvciBOb25lLgoKICAgICdvd25lcicgYW5kICdncm91cCcgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIGFuIG93bmVyIGFuZCBhIGdyb3VwIGZvciB0aGUKICAgIGFyY2hpdmUgdGhhdCBpcyBiZWluZyBidWlsdC4gSWYgbm90IHByb3ZpZGVkLCB0aGUgY3VycmVudCBvd25lciBhbmQgZ3JvdXAKICAgIHdpbGwgYmUgdXNlZC4KCiAgICBUaGUgb3V0cHV0IHRhciBmaWxlIHdpbGwgYmUgbmFtZWQgJ2Jhc2VfbmFtZScgKyAgIi50YXIiLCBwb3NzaWJseSBwbHVzCiAgICB0aGUgYXBwcm9wcmlhdGUgY29tcHJlc3Npb24gZXh0ZW5zaW9uICgiLmd6Iiwgb3IgIi5iejIiKS4KCiAgICBSZXR1cm5zIHRoZSBvdXRwdXQgZmlsZW5hbWUuCiAgICAiIiIKICAgIHRhcl9jb21wcmVzc2lvbiA9IHsnZ3ppcCc6ICdneicsIE5vbmU6ICcnfQogICAgY29tcHJlc3NfZXh0ID0geydnemlwJzogJy5neid9CgogICAgaWYgX0JaMl9TVVBQT1JURUQ6CiAgICAgICAgdGFyX2NvbXByZXNzaW9uWydiemlwMiddID0gJ2J6MicKICAgICAgICBjb21wcmVzc19leHRbJ2J6aXAyJ10gPSAnLmJ6MicKCiAgICAjIGZsYWdzIGZvciBjb21wcmVzc2lvbiBwcm9ncmFtLCBlYWNoIGVsZW1lbnQgb2YgbGlzdCB3aWxsIGJlIGFuIGFyZ3VtZW50CiAgICBpZiBjb21wcmVzcyBpcyBub3QgTm9uZSBhbmQgY29tcHJlc3Mgbm90IGluIGNvbXByZXNzX2V4dDoKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJiYWQgdmFsdWUgZm9yICdjb21wcmVzcycsIG9yIGNvbXByZXNzaW9uIGZvcm1hdCBub3QgIgogICAgICAgICAgICAgICAgICAgICAgICAgInN1cHBvcnRlZCA6IHswfSIuZm9ybWF0KGNvbXByZXNzKSkKCiAgICBhcmNoaXZlX25hbWUgPSBiYXNlX25hbWUgKyAnLnRhcicgKyBjb21wcmVzc19leHQuZ2V0KGNvbXByZXNzLCAnJykKICAgIGFyY2hpdmVfZGlyID0gb3MucGF0aC5kaXJuYW1lKGFyY2hpdmVfbmFtZSkKCiAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoYXJjaGl2ZV9kaXIpOgogICAgICAgIGlmIGxvZ2dlciBpcyBub3QgTm9uZToKICAgICAgICAgICAgbG9nZ2VyLmluZm8oImNyZWF0aW5nICVzIiwgYXJjaGl2ZV9kaXIpCiAgICAgICAgaWYgbm90IGRyeV9ydW46CiAgICAgICAgICAgIG9zLm1ha2VkaXJzKGFyY2hpdmVfZGlyKQoKICAgICMgY3JlYXRpbmcgdGhlIHRhcmJhbGwKICAgIGlmIGxvZ2dlciBpcyBub3QgTm9uZToKICAgICAgICBsb2dnZXIuaW5mbygnQ3JlYXRpbmcgdGFyIGFyY2hpdmUnKQoKICAgIHVpZCA9IF9nZXRfdWlkKG93bmVyKQogICAgZ2lkID0gX2dldF9naWQoZ3JvdXApCgogICAgZGVmIF9zZXRfdWlkX2dpZCh0YXJpbmZvKToKICAgICAgICBpZiBnaWQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHRhcmluZm8uZ2lkID0gZ2lkCiAgICAgICAgICAgIHRhcmluZm8uZ25hbWUgPSBncm91cAogICAgICAgIGlmIHVpZCBpcyBub3QgTm9uZToKICAgICAgICAgICAgdGFyaW5mby51aWQgPSB1aWQKICAgICAgICAgICAgdGFyaW5mby51bmFtZSA9IG93bmVyCiAgICAgICAgcmV0dXJuIHRhcmluZm8KCiAgICBpZiBub3QgZHJ5X3J1bjoKICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4oYXJjaGl2ZV9uYW1lLCAnd3wlcycgJSB0YXJfY29tcHJlc3Npb25bY29tcHJlc3NdKQogICAgICAgIHRyeToKICAgICAgICAgICAgdGFyLmFkZChiYXNlX2RpciwgZmlsdGVyPV9zZXRfdWlkX2dpZCkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICB0YXIuY2xvc2UoKQoKICAgIHJldHVybiBhcmNoaXZlX25hbWUKCmRlZiBfY2FsbF9leHRlcm5hbF96aXAoYmFzZV9kaXIsIHppcF9maWxlbmFtZSwgdmVyYm9zZT1GYWxzZSwgZHJ5X3J1bj1GYWxzZSk6CiAgICAjIFhYWCBzZWUgaWYgd2Ugd2FudCB0byBrZWVwIGFuIGV4dGVybmFsIGNhbGwgaGVyZQogICAgaWYgdmVyYm9zZToKICAgICAgICB6aXBvcHRpb25zID0gIi1yIgogICAgZWxzZToKICAgICAgICB6aXBvcHRpb25zID0gIi1ycSIKICAgIGZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzRXhlY0Vycm9yCiAgICBmcm9tIGRpc3R1dGlscy5zcGF3biBpbXBvcnQgc3Bhd24KICAgIHRyeToKICAgICAgICBzcGF3bihbInppcCIsIHppcG9wdGlvbnMsIHppcF9maWxlbmFtZSwgYmFzZV9kaXJdLCBkcnlfcnVuPWRyeV9ydW4pCiAgICBleGNlcHQgRGlzdHV0aWxzRXhlY0Vycm9yOgogICAgICAgICMgWFhYIHJlYWxseSBzaG91bGQgZGlzdGluZ3Vpc2ggYmV0d2VlbiAiY291bGRuJ3QgZmluZAogICAgICAgICMgZXh0ZXJuYWwgJ3ppcCcgY29tbWFuZCIgYW5kICJ6aXAgZmFpbGVkIi4KICAgICAgICByYWlzZSBFeGVjRXJyb3IoInVuYWJsZSB0byBjcmVhdGUgemlwIGZpbGUgJyVzJzogIgogICAgICAgICAgICAiY291bGQgbmVpdGhlciBpbXBvcnQgdGhlICd6aXBmaWxlJyBtb2R1bGUgbm9yICIKICAgICAgICAgICAgImZpbmQgYSBzdGFuZGFsb25lIHppcCB1dGlsaXR5IikgJSB6aXBfZmlsZW5hbWUKCmRlZiBfbWFrZV96aXBmaWxlKGJhc2VfbmFtZSwgYmFzZV9kaXIsIHZlcmJvc2U9MCwgZHJ5X3J1bj0wLCBsb2dnZXI9Tm9uZSk6CiAgICAiIiJDcmVhdGUgYSB6aXAgZmlsZSBmcm9tIGFsbCB0aGUgZmlsZXMgdW5kZXIgJ2Jhc2VfZGlyJy4KCiAgICBUaGUgb3V0cHV0IHppcCBmaWxlIHdpbGwgYmUgbmFtZWQgJ2Jhc2VfbmFtZScgKyAiLnppcCIuICBVc2VzIGVpdGhlciB0aGUKICAgICJ6aXBmaWxlIiBQeXRob24gbW9kdWxlIChpZiBhdmFpbGFibGUpIG9yIHRoZSBJbmZvWklQICJ6aXAiIHV0aWxpdHkKICAgIChpZiBpbnN0YWxsZWQgYW5kIGZvdW5kIG9uIHRoZSBkZWZhdWx0IHNlYXJjaCBwYXRoKS4gIElmIG5laXRoZXIgdG9vbCBpcwogICAgYXZhaWxhYmxlLCByYWlzZXMgRXhlY0Vycm9yLiAgUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgb3V0cHV0IHppcAogICAgZmlsZS4KICAgICIiIgogICAgemlwX2ZpbGVuYW1lID0gYmFzZV9uYW1lICsgIi56aXAiCiAgICBhcmNoaXZlX2RpciA9IG9zLnBhdGguZGlybmFtZShiYXNlX25hbWUpCgogICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGFyY2hpdmVfZGlyKToKICAgICAgICBpZiBsb2dnZXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJjcmVhdGluZyAlcyIsIGFyY2hpdmVfZGlyKQogICAgICAgIGlmIG5vdCBkcnlfcnVuOgogICAgICAgICAgICBvcy5tYWtlZGlycyhhcmNoaXZlX2RpcikKCiAgICAjIElmIHppcGZpbGUgbW9kdWxlIGlzIG5vdCBhdmFpbGFibGUsIHRyeSBzcGF3bmluZyBhbiBleHRlcm5hbCAnemlwJwogICAgIyBjb21tYW5kLgogICAgdHJ5OgogICAgICAgIGltcG9ydCB6aXBmaWxlCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgemlwZmlsZSA9IE5vbmUKCiAgICBpZiB6aXBmaWxlIGlzIE5vbmU6CiAgICAgICAgX2NhbGxfZXh0ZXJuYWxfemlwKGJhc2VfZGlyLCB6aXBfZmlsZW5hbWUsIHZlcmJvc2UsIGRyeV9ydW4pCiAgICBlbHNlOgogICAgICAgIGlmIGxvZ2dlciBpcyBub3QgTm9uZToKICAgICAgICAgICAgbG9nZ2VyLmluZm8oImNyZWF0aW5nICclcycgYW5kIGFkZGluZyAnJXMnIHRvIGl0IiwKICAgICAgICAgICAgICAgICAgICAgICAgemlwX2ZpbGVuYW1lLCBiYXNlX2RpcikKCiAgICAgICAgaWYgbm90IGRyeV9ydW46CiAgICAgICAgICAgIHppcCA9IHppcGZpbGUuWmlwRmlsZSh6aXBfZmlsZW5hbWUsICJ3IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uPXppcGZpbGUuWklQX0RFRkxBVEVEKQoKICAgICAgICAgICAgZm9yIGRpcnBhdGgsIGRpcm5hbWVzLCBmaWxlbmFtZXMgaW4gb3Mud2FsayhiYXNlX2Rpcik6CiAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiBmaWxlbmFtZXM6CiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5qb2luKGRpcnBhdGgsIG5hbWUpKQogICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKHBhdGgpOgogICAgICAgICAgICAgICAgICAgICAgICB6aXAud3JpdGUocGF0aCwgcGF0aCkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbG9nZ2VyIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oImFkZGluZyAnJXMnIiwgcGF0aCkKICAgICAgICAgICAgemlwLmNsb3NlKCkKCiAgICByZXR1cm4gemlwX2ZpbGVuYW1lCgpfQVJDSElWRV9GT1JNQVRTID0gewogICAgJ2d6dGFyJzogKF9tYWtlX3RhcmJhbGwsIFsoJ2NvbXByZXNzJywgJ2d6aXAnKV0sICJnemlwJ2VkIHRhci1maWxlIiksCiAgICAnYnp0YXInOiAoX21ha2VfdGFyYmFsbCwgWygnY29tcHJlc3MnLCAnYnppcDInKV0sICJiemlwMidlZCB0YXItZmlsZSIpLAogICAgJ3Rhcic6ICAgKF9tYWtlX3RhcmJhbGwsIFsoJ2NvbXByZXNzJywgTm9uZSldLCAidW5jb21wcmVzc2VkIHRhciBmaWxlIiksCiAgICAnemlwJzogICAoX21ha2VfemlwZmlsZSwgW10sICJaSVAgZmlsZSIpLAogICAgfQoKaWYgX0JaMl9TVVBQT1JURUQ6CiAgICBfQVJDSElWRV9GT1JNQVRTWydienRhciddID0gKF9tYWtlX3RhcmJhbGwsIFsoJ2NvbXByZXNzJywgJ2J6aXAyJyldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiemlwMidlZCB0YXItZmlsZSIpCgpkZWYgZ2V0X2FyY2hpdmVfZm9ybWF0cygpOgogICAgIiIiUmV0dXJucyBhIGxpc3Qgb2Ygc3VwcG9ydGVkIGZvcm1hdHMgZm9yIGFyY2hpdmluZyBhbmQgdW5hcmNoaXZpbmcuCgogICAgRWFjaCBlbGVtZW50IG9mIHRoZSByZXR1cm5lZCBzZXF1ZW5jZSBpcyBhIHR1cGxlIChuYW1lLCBkZXNjcmlwdGlvbikKICAgICIiIgogICAgZm9ybWF0cyA9IFsobmFtZSwgcmVnaXN0cnlbMl0pIGZvciBuYW1lLCByZWdpc3RyeSBpbgogICAgICAgICAgICAgICBfQVJDSElWRV9GT1JNQVRTLml0ZW1zKCldCiAgICBmb3JtYXRzLnNvcnQoKQogICAgcmV0dXJuIGZvcm1hdHMKCmRlZiByZWdpc3Rlcl9hcmNoaXZlX2Zvcm1hdChuYW1lLCBmdW5jdGlvbiwgZXh0cmFfYXJncz1Ob25lLCBkZXNjcmlwdGlvbj0nJyk6CiAgICAiIiJSZWdpc3RlcnMgYW4gYXJjaGl2ZSBmb3JtYXQuCgogICAgbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgZm9ybWF0LiBmdW5jdGlvbiBpcyB0aGUgY2FsbGFibGUgdGhhdCB3aWxsIGJlCiAgICB1c2VkIHRvIGNyZWF0ZSBhcmNoaXZlcy4gSWYgcHJvdmlkZWQsIGV4dHJhX2FyZ3MgaXMgYSBzZXF1ZW5jZSBvZgogICAgKG5hbWUsIHZhbHVlKSB0dXBsZXMgdGhhdCB3aWxsIGJlIHBhc3NlZCBhcyBhcmd1bWVudHMgdG8gdGhlIGNhbGxhYmxlLgogICAgZGVzY3JpcHRpb24gY2FuIGJlIHByb3ZpZGVkIHRvIGRlc2NyaWJlIHRoZSBmb3JtYXQsIGFuZCB3aWxsIGJlIHJldHVybmVkCiAgICBieSB0aGUgZ2V0X2FyY2hpdmVfZm9ybWF0cygpIGZ1bmN0aW9uLgogICAgIiIiCiAgICBpZiBleHRyYV9hcmdzIGlzIE5vbmU6CiAgICAgICAgZXh0cmFfYXJncyA9IFtdCiAgICBpZiBub3QgaXNpbnN0YW5jZShmdW5jdGlvbiwgY29sbGVjdGlvbnMuQ2FsbGFibGUpOgogICAgICAgIHJhaXNlIFR5cGVFcnJvcignVGhlICVzIG9iamVjdCBpcyBub3QgY2FsbGFibGUnICUgZnVuY3Rpb24pCiAgICBpZiBub3QgaXNpbnN0YW5jZShleHRyYV9hcmdzLCAodHVwbGUsIGxpc3QpKToKICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ2V4dHJhX2FyZ3MgbmVlZHMgdG8gYmUgYSBzZXF1ZW5jZScpCiAgICBmb3IgZWxlbWVudCBpbiBleHRyYV9hcmdzOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGVsZW1lbnQsICh0dXBsZSwgbGlzdCkpIG9yIGxlbihlbGVtZW50KSAhPTI6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignZXh0cmFfYXJncyBlbGVtZW50cyBhcmUgOiAoYXJnX25hbWUsIHZhbHVlKScpCgogICAgX0FSQ0hJVkVfRk9STUFUU1tuYW1lXSA9IChmdW5jdGlvbiwgZXh0cmFfYXJncywgZGVzY3JpcHRpb24pCgpkZWYgdW5yZWdpc3Rlcl9hcmNoaXZlX2Zvcm1hdChuYW1lKToKICAgIGRlbCBfQVJDSElWRV9GT1JNQVRTW25hbWVdCgpkZWYgbWFrZV9hcmNoaXZlKGJhc2VfbmFtZSwgZm9ybWF0LCByb290X2Rpcj1Ob25lLCBiYXNlX2Rpcj1Ob25lLCB2ZXJib3NlPTAsCiAgICAgICAgICAgICAgICAgZHJ5X3J1bj0wLCBvd25lcj1Ob25lLCBncm91cD1Ob25lLCBsb2dnZXI9Tm9uZSk6CiAgICAiIiJDcmVhdGUgYW4gYXJjaGl2ZSBmaWxlIChlZy4gemlwIG9yIHRhcikuCgogICAgJ2Jhc2VfbmFtZScgaXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gY3JlYXRlLCBtaW51cyBhbnkgZm9ybWF0LXNwZWNpZmljCiAgICBleHRlbnNpb247ICdmb3JtYXQnIGlzIHRoZSBhcmNoaXZlIGZvcm1hdDogb25lIG9mICJ6aXAiLCAidGFyIiwgImJ6dGFyIgogICAgb3IgImd6dGFyIi4KCiAgICAncm9vdF9kaXInIGlzIGEgZGlyZWN0b3J5IHRoYXQgd2lsbCBiZSB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhlCiAgICBhcmNoaXZlOyBpZS4gd2UgdHlwaWNhbGx5IGNoZGlyIGludG8gJ3Jvb3RfZGlyJyBiZWZvcmUgY3JlYXRpbmcgdGhlCiAgICBhcmNoaXZlLiAgJ2Jhc2VfZGlyJyBpcyB0aGUgZGlyZWN0b3J5IHdoZXJlIHdlIHN0YXJ0IGFyY2hpdmluZyBmcm9tOwogICAgaWUuICdiYXNlX2Rpcicgd2lsbCBiZSB0aGUgY29tbW9uIHByZWZpeCBvZiBhbGwgZmlsZXMgYW5kCiAgICBkaXJlY3RvcmllcyBpbiB0aGUgYXJjaGl2ZS4gICdyb290X2RpcicgYW5kICdiYXNlX2RpcicgYm90aCBkZWZhdWx0CiAgICB0byB0aGUgY3VycmVudCBkaXJlY3RvcnkuICBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBhcmNoaXZlIGZpbGUuCgogICAgJ293bmVyJyBhbmQgJ2dyb3VwJyBhcmUgdXNlZCB3aGVuIGNyZWF0aW5nIGEgdGFyIGFyY2hpdmUuIEJ5IGRlZmF1bHQsCiAgICB1c2VzIHRoZSBjdXJyZW50IG93bmVyIGFuZCBncm91cC4KICAgICIiIgogICAgc2F2ZV9jd2QgPSBvcy5nZXRjd2QoKQogICAgaWYgcm9vdF9kaXIgaXMgbm90IE5vbmU6CiAgICAgICAgaWYgbG9nZ2VyIGlzIG5vdCBOb25lOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoImNoYW5naW5nIGludG8gJyVzJyIsIHJvb3RfZGlyKQogICAgICAgIGJhc2VfbmFtZSA9IG9zLnBhdGguYWJzcGF0aChiYXNlX25hbWUpCiAgICAgICAgaWYgbm90IGRyeV9ydW46CiAgICAgICAgICAgIG9zLmNoZGlyKHJvb3RfZGlyKQoKICAgIGlmIGJhc2VfZGlyIGlzIE5vbmU6CiAgICAgICAgYmFzZV9kaXIgPSBvcy5jdXJkaXIKCiAgICBrd2FyZ3MgPSB7J2RyeV9ydW4nOiBkcnlfcnVuLCAnbG9nZ2VyJzogbG9nZ2VyfQoKICAgIHRyeToKICAgICAgICBmb3JtYXRfaW5mbyA9IF9BUkNISVZFX0ZPUk1BVFNbZm9ybWF0XQogICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInVua25vd24gYXJjaGl2ZSBmb3JtYXQgJyVzJyIgJSBmb3JtYXQpCgogICAgZnVuYyA9IGZvcm1hdF9pbmZvWzBdCiAgICBmb3IgYXJnLCB2YWwgaW4gZm9ybWF0X2luZm9bMV06CiAgICAgICAga3dhcmdzW2FyZ10gPSB2YWwKCiAgICBpZiBmb3JtYXQgIT0gJ3ppcCc6CiAgICAgICAga3dhcmdzWydvd25lciddID0gb3duZXIKICAgICAgICBrd2FyZ3NbJ2dyb3VwJ10gPSBncm91cAoKICAgIHRyeToKICAgICAgICBmaWxlbmFtZSA9IGZ1bmMoYmFzZV9uYW1lLCBiYXNlX2RpciwgKiprd2FyZ3MpCiAgICBmaW5hbGx5OgogICAgICAgIGlmIHJvb3RfZGlyIGlzIG5vdCBOb25lOgogICAgICAgICAgICBpZiBsb2dnZXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoImNoYW5naW5nIGJhY2sgdG8gJyVzJyIsIHNhdmVfY3dkKQogICAgICAgICAgICBvcy5jaGRpcihzYXZlX2N3ZCkKCiAgICByZXR1cm4gZmlsZW5hbWUKCgpkZWYgZ2V0X3VucGFja19mb3JtYXRzKCk6CiAgICAiIiJSZXR1cm5zIGEgbGlzdCBvZiBzdXBwb3J0ZWQgZm9ybWF0cyBmb3IgdW5wYWNraW5nLgoKICAgIEVhY2ggZWxlbWVudCBvZiB0aGUgcmV0dXJuZWQgc2VxdWVuY2UgaXMgYSB0dXBsZQogICAgKG5hbWUsIGV4dGVuc2lvbnMsIGRlc2NyaXB0aW9uKQogICAgIiIiCiAgICBmb3JtYXRzID0gWyhuYW1lLCBpbmZvWzBdLCBpbmZvWzNdKSBmb3IgbmFtZSwgaW5mbyBpbgogICAgICAgICAgICAgICBfVU5QQUNLX0ZPUk1BVFMuaXRlbXMoKV0KICAgIGZvcm1hdHMuc29ydCgpCiAgICByZXR1cm4gZm9ybWF0cwoKZGVmIF9jaGVja191bnBhY2tfb3B0aW9ucyhleHRlbnNpb25zLCBmdW5jdGlvbiwgZXh0cmFfYXJncyk6CiAgICAiIiJDaGVja3Mgd2hhdCBnZXRzIHJlZ2lzdGVyZWQgYXMgYW4gdW5wYWNrZXIuIiIiCiAgICAjIGZpcnN0IG1ha2Ugc3VyZSBubyBvdGhlciB1bnBhY2tlciBpcyByZWdpc3RlcmVkIGZvciB0aGlzIGV4dGVuc2lvbgogICAgZXhpc3RpbmdfZXh0ZW5zaW9ucyA9IHt9CiAgICBmb3IgbmFtZSwgaW5mbyBpbiBfVU5QQUNLX0ZPUk1BVFMuaXRlbXMoKToKICAgICAgICBmb3IgZXh0IGluIGluZm9bMF06CiAgICAgICAgICAgIGV4aXN0aW5nX2V4dGVuc2lvbnNbZXh0XSA9IG5hbWUKCiAgICBmb3IgZXh0ZW5zaW9uIGluIGV4dGVuc2lvbnM6CiAgICAgICAgaWYgZXh0ZW5zaW9uIGluIGV4aXN0aW5nX2V4dGVuc2lvbnM6CiAgICAgICAgICAgIG1zZyA9ICclcyBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgZm9yICIlcyInCiAgICAgICAgICAgIHJhaXNlIFJlZ2lzdHJ5RXJyb3IobXNnICUgKGV4dGVuc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdfZXh0ZW5zaW9uc1tleHRlbnNpb25dKSkKCiAgICBpZiBub3QgaXNpbnN0YW5jZShmdW5jdGlvbiwgY29sbGVjdGlvbnMuQ2FsbGFibGUpOgogICAgICAgIHJhaXNlIFR5cGVFcnJvcignVGhlIHJlZ2lzdGVyZWQgZnVuY3Rpb24gbXVzdCBiZSBhIGNhbGxhYmxlJykKCgpkZWYgcmVnaXN0ZXJfdW5wYWNrX2Zvcm1hdChuYW1lLCBleHRlbnNpb25zLCBmdW5jdGlvbiwgZXh0cmFfYXJncz1Ob25lLAogICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0nJyk6CiAgICAiIiJSZWdpc3RlcnMgYW4gdW5wYWNrIGZvcm1hdC4KCiAgICBgbmFtZWAgaXMgdGhlIG5hbWUgb2YgdGhlIGZvcm1hdC4gYGV4dGVuc2lvbnNgIGlzIGEgbGlzdCBvZiBleHRlbnNpb25zCiAgICBjb3JyZXNwb25kaW5nIHRvIHRoZSBmb3JtYXQuCgogICAgYGZ1bmN0aW9uYCBpcyB0aGUgY2FsbGFibGUgdGhhdCB3aWxsIGJlCiAgICB1c2VkIHRvIHVucGFjayBhcmNoaXZlcy4gVGhlIGNhbGxhYmxlIHdpbGwgcmVjZWl2ZSBhcmNoaXZlcyB0byB1bnBhY2suCiAgICBJZiBpdCdzIHVuYWJsZSB0byBoYW5kbGUgYW4gYXJjaGl2ZSwgaXQgbmVlZHMgdG8gcmFpc2UgYSBSZWFkRXJyb3IKICAgIGV4Y2VwdGlvbi4KCiAgICBJZiBwcm92aWRlZCwgYGV4dHJhX2FyZ3NgIGlzIGEgc2VxdWVuY2Ugb2YKICAgIChuYW1lLCB2YWx1ZSkgdHVwbGVzIHRoYXQgd2lsbCBiZSBwYXNzZWQgYXMgYXJndW1lbnRzIHRvIHRoZSBjYWxsYWJsZS4KICAgIGRlc2NyaXB0aW9uIGNhbiBiZSBwcm92aWRlZCB0byBkZXNjcmliZSB0aGUgZm9ybWF0LCBhbmQgd2lsbCBiZSByZXR1cm5lZAogICAgYnkgdGhlIGdldF91bnBhY2tfZm9ybWF0cygpIGZ1bmN0aW9uLgogICAgIiIiCiAgICBpZiBleHRyYV9hcmdzIGlzIE5vbmU6CiAgICAgICAgZXh0cmFfYXJncyA9IFtdCiAgICBfY2hlY2tfdW5wYWNrX29wdGlvbnMoZXh0ZW5zaW9ucywgZnVuY3Rpb24sIGV4dHJhX2FyZ3MpCiAgICBfVU5QQUNLX0ZPUk1BVFNbbmFtZV0gPSBleHRlbnNpb25zLCBmdW5jdGlvbiwgZXh0cmFfYXJncywgZGVzY3JpcHRpb24KCmRlZiB1bnJlZ2lzdGVyX3VucGFja19mb3JtYXQobmFtZSk6CiAgICAiIiJSZW1vdmVzIHRoZSBwYWNrIGZvcm1hdCBmcm9tIHRoZSByZWdpc3RyeS4iIiIKICAgIGRlbCBfVU5QQUNLX0ZPUk1BVFNbbmFtZV0KCmRlZiBfZW5zdXJlX2RpcmVjdG9yeShwYXRoKToKICAgICIiIkVuc3VyZSB0aGF0IHRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mIGBwYXRoYCBleGlzdHMiIiIKICAgIGRpcm5hbWUgPSBvcy5wYXRoLmRpcm5hbWUocGF0aCkKICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGRpcm5hbWUpOgogICAgICAgIG9zLm1ha2VkaXJzKGRpcm5hbWUpCgpkZWYgX3VucGFja196aXBmaWxlKGZpbGVuYW1lLCBleHRyYWN0X2Rpcik6CiAgICAiIiJVbnBhY2sgemlwIGBmaWxlbmFtZWAgdG8gYGV4dHJhY3RfZGlyYAogICAgIiIiCiAgICB0cnk6CiAgICAgICAgaW1wb3J0IHppcGZpbGUKICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICByYWlzZSBSZWFkRXJyb3IoJ3psaWIgbm90IHN1cHBvcnRlZCwgY2Fubm90IHVucGFjayB0aGlzIGFyY2hpdmUuJykKCiAgICBpZiBub3QgemlwZmlsZS5pc196aXBmaWxlKGZpbGVuYW1lKToKICAgICAgICByYWlzZSBSZWFkRXJyb3IoIiVzIGlzIG5vdCBhIHppcCBmaWxlIiAlIGZpbGVuYW1lKQoKICAgIHppcCA9IHppcGZpbGUuWmlwRmlsZShmaWxlbmFtZSkKICAgIHRyeToKICAgICAgICBmb3IgaW5mbyBpbiB6aXAuaW5mb2xpc3QoKToKICAgICAgICAgICAgbmFtZSA9IGluZm8uZmlsZW5hbWUKCiAgICAgICAgICAgICMgZG9uJ3QgZXh0cmFjdCBhYnNvbHV0ZSBwYXRocyBvciBvbmVzIHdpdGggLi4gaW4gdGhlbQogICAgICAgICAgICBpZiBuYW1lLnN0YXJ0c3dpdGgoJy8nKSBvciAnLi4nIGluIG5hbWU6CiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgdGFyZ2V0ID0gb3MucGF0aC5qb2luKGV4dHJhY3RfZGlyLCAqbmFtZS5zcGxpdCgnLycpKQogICAgICAgICAgICBpZiBub3QgdGFyZ2V0OgogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIF9lbnN1cmVfZGlyZWN0b3J5KHRhcmdldCkKICAgICAgICAgICAgaWYgbm90IG5hbWUuZW5kc3dpdGgoJy8nKToKICAgICAgICAgICAgICAgICMgZmlsZQogICAgICAgICAgICAgICAgZGF0YSA9IHppcC5yZWFkKGluZm8uZmlsZW5hbWUpCiAgICAgICAgICAgICAgICBmID0gb3Blbih0YXJnZXQsICd3YicpCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgZi53cml0ZShkYXRhKQogICAgICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgICAgICBmLmNsb3NlKCkKICAgICAgICAgICAgICAgICAgICBkZWwgZGF0YQogICAgZmluYWxseToKICAgICAgICB6aXAuY2xvc2UoKQoKZGVmIF91bnBhY2tfdGFyZmlsZShmaWxlbmFtZSwgZXh0cmFjdF9kaXIpOgogICAgIiIiVW5wYWNrIHRhci90YXIuZ3ovdGFyLmJ6MiBgZmlsZW5hbWVgIHRvIGBleHRyYWN0X2RpcmAKICAgICIiIgogICAgdHJ5OgogICAgICAgIHRhcm9iaiA9IHRhcmZpbGUub3BlbihmaWxlbmFtZSkKICAgIGV4Y2VwdCB0YXJmaWxlLlRhckVycm9yOgogICAgICAgIHJhaXNlIFJlYWRFcnJvcigKICAgICAgICAgICAgIiVzIGlzIG5vdCBhIGNvbXByZXNzZWQgb3IgdW5jb21wcmVzc2VkIHRhciBmaWxlIiAlIGZpbGVuYW1lKQogICAgdHJ5OgogICAgICAgIHRhcm9iai5leHRyYWN0YWxsKGV4dHJhY3RfZGlyKQogICAgZmluYWxseToKICAgICAgICB0YXJvYmouY2xvc2UoKQoKX1VOUEFDS19GT1JNQVRTID0gewogICAgJ2d6dGFyJzogKFsnLnRhci5neicsICcudGd6J10sIF91bnBhY2tfdGFyZmlsZSwgW10sICJnemlwJ2VkIHRhci1maWxlIiksCiAgICAndGFyJzogICAoWycudGFyJ10sIF91bnBhY2tfdGFyZmlsZSwgW10sICJ1bmNvbXByZXNzZWQgdGFyIGZpbGUiKSwKICAgICd6aXAnOiAgIChbJy56aXAnXSwgX3VucGFja196aXBmaWxlLCBbXSwgIlpJUCBmaWxlIikKICAgIH0KCmlmIF9CWjJfU1VQUE9SVEVEOgogICAgX1VOUEFDS19GT1JNQVRTWydienRhciddID0gKFsnLmJ6MiddLCBfdW5wYWNrX3RhcmZpbGUsIFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiemlwMidlZCB0YXItZmlsZSIpCgpkZWYgX2ZpbmRfdW5wYWNrX2Zvcm1hdChmaWxlbmFtZSk6CiAgICBmb3IgbmFtZSwgaW5mbyBpbiBfVU5QQUNLX0ZPUk1BVFMuaXRlbXMoKToKICAgICAgICBmb3IgZXh0ZW5zaW9uIGluIGluZm9bMF06CiAgICAgICAgICAgIGlmIGZpbGVuYW1lLmVuZHN3aXRoKGV4dGVuc2lvbik6CiAgICAgICAgICAgICAgICByZXR1cm4gbmFtZQogICAgcmV0dXJuIE5vbmUKCmRlZiB1bnBhY2tfYXJjaGl2ZShmaWxlbmFtZSwgZXh0cmFjdF9kaXI9Tm9uZSwgZm9ybWF0PU5vbmUpOgogICAgIiIiVW5wYWNrIGFuIGFyY2hpdmUuCgogICAgYGZpbGVuYW1lYCBpcyB0aGUgbmFtZSBvZiB0aGUgYXJjaGl2ZS4KCiAgICBgZXh0cmFjdF9kaXJgIGlzIHRoZSBuYW1lIG9mIHRoZSB0YXJnZXQgZGlyZWN0b3J5LCB3aGVyZSB0aGUgYXJjaGl2ZQogICAgaXMgdW5wYWNrZWQuIElmIG5vdCBwcm92aWRlZCwgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgaXMgdXNlZC4KCiAgICBgZm9ybWF0YCBpcyB0aGUgYXJjaGl2ZSBmb3JtYXQ6IG9uZSBvZiAiemlwIiwgInRhciIsIG9yICJnenRhciIuIE9yIGFueQogICAgb3RoZXIgcmVnaXN0ZXJlZCBmb3JtYXQuIElmIG5vdCBwcm92aWRlZCwgdW5wYWNrX2FyY2hpdmUgd2lsbCB1c2UgdGhlCiAgICBmaWxlbmFtZSBleHRlbnNpb24gYW5kIHNlZSBpZiBhbiB1bnBhY2tlciB3YXMgcmVnaXN0ZXJlZCBmb3IgdGhhdAogICAgZXh0ZW5zaW9uLgoKICAgIEluIGNhc2Ugbm9uZSBpcyBmb3VuZCwgYSBWYWx1ZUVycm9yIGlzIHJhaXNlZC4KICAgICIiIgogICAgaWYgZXh0cmFjdF9kaXIgaXMgTm9uZToKICAgICAgICBleHRyYWN0X2RpciA9IG9zLmdldGN3ZCgpCgogICAgaWYgZm9ybWF0IGlzIG5vdCBOb25lOgogICAgICAgIHRyeToKICAgICAgICAgICAgZm9ybWF0X2luZm8gPSBfVU5QQUNLX0ZPUk1BVFNbZm9ybWF0XQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiVW5rbm93biB1bnBhY2sgZm9ybWF0ICd7MH0nIi5mb3JtYXQoZm9ybWF0KSkKCiAgICAgICAgZnVuYyA9IGZvcm1hdF9pbmZvWzFdCiAgICAgICAgZnVuYyhmaWxlbmFtZSwgZXh0cmFjdF9kaXIsICoqZGljdChmb3JtYXRfaW5mb1syXSkpCiAgICBlbHNlOgogICAgICAgICMgd2UgbmVlZCB0byBsb29rIGF0IHRoZSByZWdpc3RlcmVkIHVucGFja2VycyBzdXBwb3J0ZWQgZXh0ZW5zaW9ucwogICAgICAgIGZvcm1hdCA9IF9maW5kX3VucGFja19mb3JtYXQoZmlsZW5hbWUpCiAgICAgICAgaWYgZm9ybWF0IGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIFJlYWRFcnJvcigiVW5rbm93biBhcmNoaXZlIGZvcm1hdCAnezB9JyIuZm9ybWF0KGZpbGVuYW1lKSkKCiAgICAgICAgZnVuYyA9IF9VTlBBQ0tfRk9STUFUU1tmb3JtYXRdWzFdCiAgICAgICAga3dhcmdzID0gZGljdChfVU5QQUNLX0ZPUk1BVFNbZm9ybWF0XVsyXSkKICAgICAgICBmdW5jKGZpbGVuYW1lLCBleHRyYWN0X2RpciwgKiprd2FyZ3MpClBLAwQUAAAAAAAAACEAbxYArTkKAAA5CgAAOwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL19iYWNrcG9ydC9zeXNjb25maWcuY2ZnW3Bvc2l4X3ByZWZpeF0KIyBDb25maWd1cmF0aW9uIGRpcmVjdG9yaWVzLiAgU29tZSBvZiB0aGVzZSBjb21lIHN0cmFpZ2h0IG91dCBvZiB0aGUKIyBjb25maWd1cmUgc2NyaXB0LiAgVGhleSBhcmUgZm9yIGltcGxlbWVudGluZyB0aGUgb3RoZXIgdmFyaWFibGVzLCBub3QgdG8KIyBiZSB1c2VkIGRpcmVjdGx5IGluIFtyZXNvdXJjZV9sb2NhdGlvbnNdLgpjb25mZGlyID0gL2V0YwpkYXRhZGlyID0gL3Vzci9zaGFyZQpsaWJkaXIgPSAvdXNyL2xpYgpzdGF0ZWRpciA9IC92YXIKIyBVc2VyIHJlc291cmNlIGRpcmVjdG9yeQpsb2NhbCA9IH4vLmxvY2FsL3tkaXN0cmlidXRpb24ubmFtZX0KCnN0ZGxpYiA9IHtiYXNlfS9saWIvcHl0aG9ue3B5X3ZlcnNpb25fc2hvcnR9CnBsYXRzdGRsaWIgPSB7cGxhdGJhc2V9L2xpYi9weXRob257cHlfdmVyc2lvbl9zaG9ydH0KcHVyZWxpYiA9IHtiYXNlfS9saWIvcHl0aG9ue3B5X3ZlcnNpb25fc2hvcnR9L3NpdGUtcGFja2FnZXMKcGxhdGxpYiA9IHtwbGF0YmFzZX0vbGliL3B5dGhvbntweV92ZXJzaW9uX3Nob3J0fS9zaXRlLXBhY2thZ2VzCmluY2x1ZGUgPSB7YmFzZX0vaW5jbHVkZS9weXRob257cHlfdmVyc2lvbl9zaG9ydH17YWJpZmxhZ3N9CnBsYXRpbmNsdWRlID0ge3BsYXRiYXNlfS9pbmNsdWRlL3B5dGhvbntweV92ZXJzaW9uX3Nob3J0fXthYmlmbGFnc30KZGF0YSA9IHtiYXNlfQoKW3Bvc2l4X2hvbWVdCnN0ZGxpYiA9IHtiYXNlfS9saWIvcHl0aG9uCnBsYXRzdGRsaWIgPSB7YmFzZX0vbGliL3B5dGhvbgpwdXJlbGliID0ge2Jhc2V9L2xpYi9weXRob24KcGxhdGxpYiA9IHtiYXNlfS9saWIvcHl0aG9uCmluY2x1ZGUgPSB7YmFzZX0vaW5jbHVkZS9weXRob24KcGxhdGluY2x1ZGUgPSB7YmFzZX0vaW5jbHVkZS9weXRob24Kc2NyaXB0cyA9IHtiYXNlfS9iaW4KZGF0YSA9IHtiYXNlfQoKW250XQpzdGRsaWIgPSB7YmFzZX0vTGliCnBsYXRzdGRsaWIgPSB7YmFzZX0vTGliCnB1cmVsaWIgPSB7YmFzZX0vTGliL3NpdGUtcGFja2FnZXMKcGxhdGxpYiA9IHtiYXNlfS9MaWIvc2l0ZS1wYWNrYWdlcwppbmNsdWRlID0ge2Jhc2V9L0luY2x1ZGUKcGxhdGluY2x1ZGUgPSB7YmFzZX0vSW5jbHVkZQpzY3JpcHRzID0ge2Jhc2V9L1NjcmlwdHMKZGF0YSA9IHtiYXNlfQoKW29zMl0Kc3RkbGliID0ge2Jhc2V9L0xpYgpwbGF0c3RkbGliID0ge2Jhc2V9L0xpYgpwdXJlbGliID0ge2Jhc2V9L0xpYi9zaXRlLXBhY2thZ2VzCnBsYXRsaWIgPSB7YmFzZX0vTGliL3NpdGUtcGFja2FnZXMKaW5jbHVkZSA9IHtiYXNlfS9JbmNsdWRlCnBsYXRpbmNsdWRlID0ge2Jhc2V9L0luY2x1ZGUKc2NyaXB0cyA9IHtiYXNlfS9TY3JpcHRzCmRhdGEgPSB7YmFzZX0KCltvczJfaG9tZV0Kc3RkbGliID0ge3VzZXJiYXNlfS9saWIvcHl0aG9ue3B5X3ZlcnNpb25fc2hvcnR9CnBsYXRzdGRsaWIgPSB7dXNlcmJhc2V9L2xpYi9weXRob257cHlfdmVyc2lvbl9zaG9ydH0KcHVyZWxpYiA9IHt1c2VyYmFzZX0vbGliL3B5dGhvbntweV92ZXJzaW9uX3Nob3J0fS9zaXRlLXBhY2thZ2VzCnBsYXRsaWIgPSB7dXNlcmJhc2V9L2xpYi9weXRob257cHlfdmVyc2lvbl9zaG9ydH0vc2l0ZS1wYWNrYWdlcwppbmNsdWRlID0ge3VzZXJiYXNlfS9pbmNsdWRlL3B5dGhvbntweV92ZXJzaW9uX3Nob3J0fQpzY3JpcHRzID0ge3VzZXJiYXNlfS9iaW4KZGF0YSA9IHt1c2VyYmFzZX0KCltudF91c2VyXQpzdGRsaWIgPSB7dXNlcmJhc2V9L1B5dGhvbntweV92ZXJzaW9uX25vZG90fQpwbGF0c3RkbGliID0ge3VzZXJiYXNlfS9QeXRob257cHlfdmVyc2lvbl9ub2RvdH0KcHVyZWxpYiA9IHt1c2VyYmFzZX0vUHl0aG9ue3B5X3ZlcnNpb25fbm9kb3R9L3NpdGUtcGFja2FnZXMKcGxhdGxpYiA9IHt1c2VyYmFzZX0vUHl0aG9ue3B5X3ZlcnNpb25fbm9kb3R9L3NpdGUtcGFja2FnZXMKaW5jbHVkZSA9IHt1c2VyYmFzZX0vUHl0aG9ue3B5X3ZlcnNpb25fbm9kb3R9L0luY2x1ZGUKc2NyaXB0cyA9IHt1c2VyYmFzZX0vU2NyaXB0cwpkYXRhID0ge3VzZXJiYXNlfQoKW3Bvc2l4X3VzZXJdCnN0ZGxpYiA9IHt1c2VyYmFzZX0vbGliL3B5dGhvbntweV92ZXJzaW9uX3Nob3J0fQpwbGF0c3RkbGliID0ge3VzZXJiYXNlfS9saWIvcHl0aG9ue3B5X3ZlcnNpb25fc2hvcnR9CnB1cmVsaWIgPSB7dXNlcmJhc2V9L2xpYi9weXRob257cHlfdmVyc2lvbl9zaG9ydH0vc2l0ZS1wYWNrYWdlcwpwbGF0bGliID0ge3VzZXJiYXNlfS9saWIvcHl0aG9ue3B5X3ZlcnNpb25fc2hvcnR9L3NpdGUtcGFja2FnZXMKaW5jbHVkZSA9IHt1c2VyYmFzZX0vaW5jbHVkZS9weXRob257cHlfdmVyc2lvbl9zaG9ydH0Kc2NyaXB0cyA9IHt1c2VyYmFzZX0vYmluCmRhdGEgPSB7dXNlcmJhc2V9Cgpbb3N4X2ZyYW1ld29ya191c2VyXQpzdGRsaWIgPSB7dXNlcmJhc2V9L2xpYi9weXRob24KcGxhdHN0ZGxpYiA9IHt1c2VyYmFzZX0vbGliL3B5dGhvbgpwdXJlbGliID0ge3VzZXJiYXNlfS9saWIvcHl0aG9uL3NpdGUtcGFja2FnZXMKcGxhdGxpYiA9IHt1c2VyYmFzZX0vbGliL3B5dGhvbi9zaXRlLXBhY2thZ2VzCmluY2x1ZGUgPSB7dXNlcmJhc2V9L2luY2x1ZGUKc2NyaXB0cyA9IHt1c2VyYmFzZX0vYmluCmRhdGEgPSB7dXNlcmJhc2V9ClBLAwQUAAAAAAAAACEANg9S1ktpAABLaQAAOgAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL19iYWNrcG9ydC9zeXNjb25maWcucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQojCiMgQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbi4KIyBTZWUgTElDRU5TRS50eHQgYW5kIENPTlRSSUJVVE9SUy50eHQuCiMKIiIiQWNjZXNzIHRvIFB5dGhvbidzIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uIiIiCgppbXBvcnQgY29kZWNzCmltcG9ydCBvcwppbXBvcnQgcmUKaW1wb3J0IHN5cwpmcm9tIG9zLnBhdGggaW1wb3J0IHBhcmRpciwgcmVhbHBhdGgKdHJ5OgogICAgaW1wb3J0IGNvbmZpZ3BhcnNlcgpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBpbXBvcnQgQ29uZmlnUGFyc2VyIGFzIGNvbmZpZ3BhcnNlcgoKCl9fYWxsX18gPSBbCiAgICAnZ2V0X2NvbmZpZ19oX2ZpbGVuYW1lJywKICAgICdnZXRfY29uZmlnX3ZhcicsCiAgICAnZ2V0X2NvbmZpZ192YXJzJywKICAgICdnZXRfbWFrZWZpbGVfZmlsZW5hbWUnLAogICAgJ2dldF9wYXRoJywKICAgICdnZXRfcGF0aF9uYW1lcycsCiAgICAnZ2V0X3BhdGhzJywKICAgICdnZXRfcGxhdGZvcm0nLAogICAgJ2dldF9weXRob25fdmVyc2lvbicsCiAgICAnZ2V0X3NjaGVtZV9uYW1lcycsCiAgICAncGFyc2VfY29uZmlnX2gnLApdCgoKZGVmIF9zYWZlX3JlYWxwYXRoKHBhdGgpOgogICAgdHJ5OgogICAgICAgIHJldHVybiByZWFscGF0aChwYXRoKQogICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgcmV0dXJuIHBhdGgKCgppZiBzeXMuZXhlY3V0YWJsZToKICAgIF9QUk9KRUNUX0JBU0UgPSBvcy5wYXRoLmRpcm5hbWUoX3NhZmVfcmVhbHBhdGgoc3lzLmV4ZWN1dGFibGUpKQplbHNlOgogICAgIyBzeXMuZXhlY3V0YWJsZSBjYW4gYmUgZW1wdHkgaWYgYXJndlswXSBoYXMgYmVlbiBjaGFuZ2VkIGFuZCBQeXRob24gaXMKICAgICMgdW5hYmxlIHRvIHJldHJpZXZlIHRoZSByZWFsIHByb2dyYW0gbmFtZQogICAgX1BST0pFQ1RfQkFTRSA9IF9zYWZlX3JlYWxwYXRoKG9zLmdldGN3ZCgpKQoKaWYgb3MubmFtZSA9PSAibnQiIGFuZCAicGNidWlsZCIgaW4gX1BST0pFQ1RfQkFTRVstODpdLmxvd2VyKCk6CiAgICBfUFJPSkVDVF9CQVNFID0gX3NhZmVfcmVhbHBhdGgob3MucGF0aC5qb2luKF9QUk9KRUNUX0JBU0UsIHBhcmRpcikpCiMgUEMvVlM3LjEKaWYgb3MubmFtZSA9PSAibnQiIGFuZCAiXFxwY1xcdiIgaW4gX1BST0pFQ1RfQkFTRVstMTA6XS5sb3dlcigpOgogICAgX1BST0pFQ1RfQkFTRSA9IF9zYWZlX3JlYWxwYXRoKG9zLnBhdGguam9pbihfUFJPSkVDVF9CQVNFLCBwYXJkaXIsIHBhcmRpcikpCiMgUEMvQU1ENjQKaWYgb3MubmFtZSA9PSAibnQiIGFuZCAiXFxwY2J1aWxkXFxhbWQ2NCIgaW4gX1BST0pFQ1RfQkFTRVstMTQ6XS5sb3dlcigpOgogICAgX1BST0pFQ1RfQkFTRSA9IF9zYWZlX3JlYWxwYXRoKG9zLnBhdGguam9pbihfUFJPSkVDVF9CQVNFLCBwYXJkaXIsIHBhcmRpcikpCgoKZGVmIGlzX3B5dGhvbl9idWlsZCgpOgogICAgZm9yIGZuIGluICgiU2V0dXAuZGlzdCIsICJTZXR1cC5sb2NhbCIpOgogICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKG9zLnBhdGguam9pbihfUFJPSkVDVF9CQVNFLCAiTW9kdWxlcyIsIGZuKSk6CiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICByZXR1cm4gRmFsc2UKCl9QWVRIT05fQlVJTEQgPSBpc19weXRob25fYnVpbGQoKQoKX2NmZ19yZWFkID0gRmFsc2UKCmRlZiBfZW5zdXJlX2NmZ19yZWFkKCk6CiAgICBnbG9iYWwgX2NmZ19yZWFkCiAgICBpZiBub3QgX2NmZ19yZWFkOgogICAgICAgIGZyb20gLi5yZXNvdXJjZXMgaW1wb3J0IGZpbmRlcgogICAgICAgIGJhY2twb3J0X3BhY2thZ2UgPSBfX25hbWVfXy5yc3BsaXQoJy4nLCAxKVswXQogICAgICAgIF9maW5kZXIgPSBmaW5kZXIoYmFja3BvcnRfcGFja2FnZSkKICAgICAgICBfY2ZnZmlsZSA9IF9maW5kZXIuZmluZCgnc3lzY29uZmlnLmNmZycpCiAgICAgICAgYXNzZXJ0IF9jZmdmaWxlLCAnc3lzY29uZmlnLmNmZyBleGlzdHMnCiAgICAgICAgd2l0aCBfY2ZnZmlsZS5hc19zdHJlYW0oKSBhcyBzOgogICAgICAgICAgICBfU0NIRU1FUy5yZWFkZnAocykKICAgICAgICBpZiBfUFlUSE9OX0JVSUxEOgogICAgICAgICAgICBmb3Igc2NoZW1lIGluICgncG9zaXhfcHJlZml4JywgJ3Bvc2l4X2hvbWUnKToKICAgICAgICAgICAgICAgIF9TQ0hFTUVTLnNldChzY2hlbWUsICdpbmNsdWRlJywgJ3tzcmNkaXJ9L0luY2x1ZGUnKQogICAgICAgICAgICAgICAgX1NDSEVNRVMuc2V0KHNjaGVtZSwgJ3BsYXRpbmNsdWRlJywgJ3twcm9qZWN0YmFzZX0vLicpCgogICAgICAgIF9jZmdfcmVhZCA9IFRydWUKCgpfU0NIRU1FUyA9IGNvbmZpZ3BhcnNlci5SYXdDb25maWdQYXJzZXIoKQpfVkFSX1JFUEwgPSByZS5jb21waWxlKHInXHsoW157XSo/KVx9JykKCmRlZiBfZXhwYW5kX2dsb2JhbHMoY29uZmlnKToKICAgIF9lbnN1cmVfY2ZnX3JlYWQoKQogICAgaWYgY29uZmlnLmhhc19zZWN0aW9uKCdnbG9iYWxzJyk6CiAgICAgICAgZ2xvYmFscyA9IGNvbmZpZy5pdGVtcygnZ2xvYmFscycpCiAgICBlbHNlOgogICAgICAgIGdsb2JhbHMgPSB0dXBsZSgpCgogICAgc2VjdGlvbnMgPSBjb25maWcuc2VjdGlvbnMoKQogICAgZm9yIHNlY3Rpb24gaW4gc2VjdGlvbnM6CiAgICAgICAgaWYgc2VjdGlvbiA9PSAnZ2xvYmFscyc6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgZm9yIG9wdGlvbiwgdmFsdWUgaW4gZ2xvYmFsczoKICAgICAgICAgICAgaWYgY29uZmlnLmhhc19vcHRpb24oc2VjdGlvbiwgb3B0aW9uKToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGNvbmZpZy5zZXQoc2VjdGlvbiwgb3B0aW9uLCB2YWx1ZSkKICAgIGNvbmZpZy5yZW1vdmVfc2VjdGlvbignZ2xvYmFscycpCgogICAgIyBub3cgZXhwYW5kaW5nIGxvY2FsIHZhcmlhYmxlcyBkZWZpbmVkIGluIHRoZSBjZmcgZmlsZQogICAgIwogICAgZm9yIHNlY3Rpb24gaW4gY29uZmlnLnNlY3Rpb25zKCk6CiAgICAgICAgdmFyaWFibGVzID0gZGljdChjb25maWcuaXRlbXMoc2VjdGlvbikpCgogICAgICAgIGRlZiBfcmVwbGFjZXIobWF0Y2hvYmopOgogICAgICAgICAgICBuYW1lID0gbWF0Y2hvYmouZ3JvdXAoMSkKICAgICAgICAgICAgaWYgbmFtZSBpbiB2YXJpYWJsZXM6CiAgICAgICAgICAgICAgICByZXR1cm4gdmFyaWFibGVzW25hbWVdCiAgICAgICAgICAgIHJldHVybiBtYXRjaG9iai5ncm91cCgwKQoKICAgICAgICBmb3Igb3B0aW9uLCB2YWx1ZSBpbiBjb25maWcuaXRlbXMoc2VjdGlvbik6CiAgICAgICAgICAgIGNvbmZpZy5zZXQoc2VjdGlvbiwgb3B0aW9uLCBfVkFSX1JFUEwuc3ViKF9yZXBsYWNlciwgdmFsdWUpKQoKI19leHBhbmRfZ2xvYmFscyhfU0NIRU1FUykKCiAjIEZJWE1FIGRvbid0IHJlbHkgb24gc3lzLnZlcnNpb24gaGVyZSwgaXRzIGZvcm1hdCBpcyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwKICMgb2YgQ1B5dGhvbiwgdXNlIHN5cy52ZXJzaW9uX2luZm8gb3Igc3lzLmhleHZlcnNpb24KX1BZX1ZFUlNJT04gPSBzeXMudmVyc2lvbi5zcGxpdCgpWzBdCl9QWV9WRVJTSU9OX1NIT1JUID0gc3lzLnZlcnNpb25bOjNdCl9QWV9WRVJTSU9OX1NIT1JUX05PX0RPVCA9IF9QWV9WRVJTSU9OWzBdICsgX1BZX1ZFUlNJT05bMl0KX1BSRUZJWCA9IG9zLnBhdGgubm9ybXBhdGgoc3lzLnByZWZpeCkKX0VYRUNfUFJFRklYID0gb3MucGF0aC5ub3JtcGF0aChzeXMuZXhlY19wcmVmaXgpCl9DT05GSUdfVkFSUyA9IE5vbmUKX1VTRVJfQkFTRSA9IE5vbmUKCgpkZWYgX3N1YnN0X3ZhcnMocGF0aCwgbG9jYWxfdmFycyk6CiAgICAiIiJJbiB0aGUgc3RyaW5nIGBwYXRoYCwgcmVwbGFjZSB0b2tlbnMgbGlrZSB7c29tZS50aGluZ30gd2l0aCB0aGUKICAgIGNvcnJlc3BvbmRpbmcgdmFsdWUgZnJvbSB0aGUgbWFwIGBsb2NhbF92YXJzYC4KCiAgICBJZiB0aGVyZSBpcyBubyBjb3JyZXNwb25kaW5nIHZhbHVlLCBsZWF2ZSB0aGUgdG9rZW4gdW5jaGFuZ2VkLgogICAgIiIiCiAgICBkZWYgX3JlcGxhY2VyKG1hdGNob2JqKToKICAgICAgICBuYW1lID0gbWF0Y2hvYmouZ3JvdXAoMSkKICAgICAgICBpZiBuYW1lIGluIGxvY2FsX3ZhcnM6CiAgICAgICAgICAgIHJldHVybiBsb2NhbF92YXJzW25hbWVdCiAgICAgICAgZWxpZiBuYW1lIGluIG9zLmVudmlyb246CiAgICAgICAgICAgIHJldHVybiBvcy5lbnZpcm9uW25hbWVdCiAgICAgICAgcmV0dXJuIG1hdGNob2JqLmdyb3VwKDApCiAgICByZXR1cm4gX1ZBUl9SRVBMLnN1YihfcmVwbGFjZXIsIHBhdGgpCgoKZGVmIF9leHRlbmRfZGljdCh0YXJnZXRfZGljdCwgb3RoZXJfZGljdCk6CiAgICB0YXJnZXRfa2V5cyA9IHRhcmdldF9kaWN0LmtleXMoKQogICAgZm9yIGtleSwgdmFsdWUgaW4gb3RoZXJfZGljdC5pdGVtcygpOgogICAgICAgIGlmIGtleSBpbiB0YXJnZXRfa2V5czoKICAgICAgICAgICAgY29udGludWUKICAgICAgICB0YXJnZXRfZGljdFtrZXldID0gdmFsdWUKCgpkZWYgX2V4cGFuZF92YXJzKHNjaGVtZSwgdmFycyk6CiAgICByZXMgPSB7fQogICAgaWYgdmFycyBpcyBOb25lOgogICAgICAgIHZhcnMgPSB7fQogICAgX2V4dGVuZF9kaWN0KHZhcnMsIGdldF9jb25maWdfdmFycygpKQoKICAgIGZvciBrZXksIHZhbHVlIGluIF9TQ0hFTUVTLml0ZW1zKHNjaGVtZSk6CiAgICAgICAgaWYgb3MubmFtZSBpbiAoJ3Bvc2l4JywgJ250Jyk6CiAgICAgICAgICAgIHZhbHVlID0gb3MucGF0aC5leHBhbmR1c2VyKHZhbHVlKQogICAgICAgIHJlc1trZXldID0gb3MucGF0aC5ub3JtcGF0aChfc3Vic3RfdmFycyh2YWx1ZSwgdmFycykpCiAgICByZXR1cm4gcmVzCgoKZGVmIGZvcm1hdF92YWx1ZSh2YWx1ZSwgdmFycyk6CiAgICBkZWYgX3JlcGxhY2VyKG1hdGNob2JqKToKICAgICAgICBuYW1lID0gbWF0Y2hvYmouZ3JvdXAoMSkKICAgICAgICBpZiBuYW1lIGluIHZhcnM6CiAgICAgICAgICAgIHJldHVybiB2YXJzW25hbWVdCiAgICAgICAgcmV0dXJuIG1hdGNob2JqLmdyb3VwKDApCiAgICByZXR1cm4gX1ZBUl9SRVBMLnN1YihfcmVwbGFjZXIsIHZhbHVlKQoKCmRlZiBfZ2V0X2RlZmF1bHRfc2NoZW1lKCk6CiAgICBpZiBvcy5uYW1lID09ICdwb3NpeCc6CiAgICAgICAgIyB0aGUgZGVmYXVsdCBzY2hlbWUgZm9yIHBvc2l4IGlzIHBvc2l4X3ByZWZpeAogICAgICAgIHJldHVybiAncG9zaXhfcHJlZml4JwogICAgcmV0dXJuIG9zLm5hbWUKCgpkZWYgX2dldHVzZXJiYXNlKCk6CiAgICBlbnZfYmFzZSA9IG9zLmVudmlyb24uZ2V0KCJQWVRIT05VU0VSQkFTRSIsIE5vbmUpCgogICAgZGVmIGpvaW51c2VyKCphcmdzKToKICAgICAgICByZXR1cm4gb3MucGF0aC5leHBhbmR1c2VyKG9zLnBhdGguam9pbigqYXJncykpCgogICAgIyB3aGF0IGFib3V0ICdvczJlbXgnLCAncmlzY29zJyA/CiAgICBpZiBvcy5uYW1lID09ICJudCI6CiAgICAgICAgYmFzZSA9IG9zLmVudmlyb24uZ2V0KCJBUFBEQVRBIikgb3IgIn4iCiAgICAgICAgaWYgZW52X2Jhc2U6CiAgICAgICAgICAgIHJldHVybiBlbnZfYmFzZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBqb2ludXNlcihiYXNlLCAiUHl0aG9uIikKCiAgICBpZiBzeXMucGxhdGZvcm0gPT0gImRhcndpbiI6CiAgICAgICAgZnJhbWV3b3JrID0gZ2V0X2NvbmZpZ192YXIoIlBZVEhPTkZSQU1FV09SSyIpCiAgICAgICAgaWYgZnJhbWV3b3JrOgogICAgICAgICAgICBpZiBlbnZfYmFzZToKICAgICAgICAgICAgICAgIHJldHVybiBlbnZfYmFzZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIGpvaW51c2VyKCJ+IiwgIkxpYnJhcnkiLCBmcmFtZXdvcmssICIlZC4lZCIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy52ZXJzaW9uX2luZm9bOjJdKQoKICAgIGlmIGVudl9iYXNlOgogICAgICAgIHJldHVybiBlbnZfYmFzZQogICAgZWxzZToKICAgICAgICByZXR1cm4gam9pbnVzZXIoIn4iLCAiLmxvY2FsIikKCgpkZWYgX3BhcnNlX21ha2VmaWxlKGZpbGVuYW1lLCB2YXJzPU5vbmUpOgogICAgIiIiUGFyc2UgYSBNYWtlZmlsZS1zdHlsZSBmaWxlLgoKICAgIEEgZGljdGlvbmFyeSBjb250YWluaW5nIG5hbWUvdmFsdWUgcGFpcnMgaXMgcmV0dXJuZWQuICBJZiBhbgogICAgb3B0aW9uYWwgZGljdGlvbmFyeSBpcyBwYXNzZWQgaW4gYXMgdGhlIHNlY29uZCBhcmd1bWVudCwgaXQgaXMKICAgIHVzZWQgaW5zdGVhZCBvZiBhIG5ldyBkaWN0aW9uYXJ5LgogICAgIiIiCiAgICAjIFJlZ2V4ZXMgbmVlZGVkIGZvciBwYXJzaW5nIE1ha2VmaWxlIChhbmQgc2ltaWxhciBzeW50YXhlcywKICAgICMgbGlrZSBvbGQtc3R5bGUgU2V0dXAgZmlsZXMpLgogICAgX3ZhcmlhYmxlX3J4ID0gcmUuY29tcGlsZSgiKFthLXpBLVpdW2EtekEtWjAtOV9dKylccyo9XHMqKC4qKSIpCiAgICBfZmluZHZhcjFfcnggPSByZS5jb21waWxlKHIiXCRcKChbQS1aYS16XVtBLVphLXowLTlfXSopXCkiKQogICAgX2ZpbmR2YXIyX3J4ID0gcmUuY29tcGlsZShyIlwkeyhbQS1aYS16XVtBLVphLXowLTlfXSopfSIpCgogICAgaWYgdmFycyBpcyBOb25lOgogICAgICAgIHZhcnMgPSB7fQogICAgZG9uZSA9IHt9CiAgICBub3Rkb25lID0ge30KCiAgICB3aXRoIGNvZGVjcy5vcGVuKGZpbGVuYW1lLCBlbmNvZGluZz0ndXRmLTgnLCBlcnJvcnM9InN1cnJvZ2F0ZWVzY2FwZSIpIGFzIGY6CiAgICAgICAgbGluZXMgPSBmLnJlYWRsaW5lcygpCgogICAgZm9yIGxpbmUgaW4gbGluZXM6CiAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCcjJykgb3IgbGluZS5zdHJpcCgpID09ICcnOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIG0gPSBfdmFyaWFibGVfcngubWF0Y2gobGluZSkKICAgICAgICBpZiBtOgogICAgICAgICAgICBuLCB2ID0gbS5ncm91cCgxLCAyKQogICAgICAgICAgICB2ID0gdi5zdHJpcCgpCiAgICAgICAgICAgICMgYCQkJyBpcyBhIGxpdGVyYWwgYCQnIGluIG1ha2UKICAgICAgICAgICAgdG1wdiA9IHYucmVwbGFjZSgnJCQnLCAnJykKCiAgICAgICAgICAgIGlmICIkIiBpbiB0bXB2OgogICAgICAgICAgICAgICAgbm90ZG9uZVtuXSA9IHYKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICB2ID0gaW50KHYpCiAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgICAgICAjIGluc2VydCBsaXRlcmFsIGAkJwogICAgICAgICAgICAgICAgICAgIGRvbmVbbl0gPSB2LnJlcGxhY2UoJyQkJywgJyQnKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBkb25lW25dID0gdgoKICAgICMgZG8gdmFyaWFibGUgaW50ZXJwb2xhdGlvbiBoZXJlCiAgICB2YXJpYWJsZXMgPSBsaXN0KG5vdGRvbmUua2V5cygpKQoKICAgICMgVmFyaWFibGVzIHdpdGggYSAnUFlfJyBwcmVmaXggaW4gdGhlIG1ha2VmaWxlLiBUaGVzZSBuZWVkIHRvCiAgICAjIGJlIG1hZGUgYXZhaWxhYmxlIHdpdGhvdXQgdGhhdCBwcmVmaXggdGhyb3VnaCBzeXNjb25maWcuCiAgICAjIFNwZWNpYWwgY2FyZSBpcyBuZWVkZWQgdG8gZW5zdXJlIHRoYXQgdmFyaWFibGUgZXhwYW5zaW9uIHdvcmtzLCBldmVuCiAgICAjIGlmIHRoZSBleHBhbnNpb24gdXNlcyB0aGUgbmFtZSB3aXRob3V0IGEgcHJlZml4LgogICAgcmVuYW1lZF92YXJpYWJsZXMgPSAoJ0NGTEFHUycsICdMREZMQUdTJywgJ0NQUEZMQUdTJykKCiAgICB3aGlsZSBsZW4odmFyaWFibGVzKSA+IDA6CiAgICAgICAgZm9yIG5hbWUgaW4gdHVwbGUodmFyaWFibGVzKToKICAgICAgICAgICAgdmFsdWUgPSBub3Rkb25lW25hbWVdCiAgICAgICAgICAgIG0gPSBfZmluZHZhcjFfcnguc2VhcmNoKHZhbHVlKSBvciBfZmluZHZhcjJfcnguc2VhcmNoKHZhbHVlKQogICAgICAgICAgICBpZiBtIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgbiA9IG0uZ3JvdXAoMSkKICAgICAgICAgICAgICAgIGZvdW5kID0gVHJ1ZQogICAgICAgICAgICAgICAgaWYgbiBpbiBkb25lOgogICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBzdHIoZG9uZVtuXSkKICAgICAgICAgICAgICAgIGVsaWYgbiBpbiBub3Rkb25lOgogICAgICAgICAgICAgICAgICAgICMgZ2V0IGl0IG9uIGEgc3Vic2VxdWVudCByb3VuZAogICAgICAgICAgICAgICAgICAgIGZvdW5kID0gRmFsc2UKICAgICAgICAgICAgICAgIGVsaWYgbiBpbiBvcy5lbnZpcm9uOgogICAgICAgICAgICAgICAgICAgICMgZG8gaXQgbGlrZSBtYWtlOiBmYWxsIGJhY2sgdG8gZW52aXJvbm1lbnQKICAgICAgICAgICAgICAgICAgICBpdGVtID0gb3MuZW52aXJvbltuXQoKICAgICAgICAgICAgICAgIGVsaWYgbiBpbiByZW5hbWVkX3ZhcmlhYmxlczoKICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS5zdGFydHN3aXRoKCdQWV8nKSBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZVszOl0gaW4gcmVuYW1lZF92YXJpYWJsZXMpOgogICAgICAgICAgICAgICAgICAgICAgICBpdGVtID0gIiIKCiAgICAgICAgICAgICAgICAgICAgZWxpZiAnUFlfJyArIG4gaW4gbm90ZG9uZToKICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBGYWxzZQoKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBpdGVtID0gc3RyKGRvbmVbJ1BZXycgKyBuXSkKCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGRvbmVbbl0gPSBpdGVtID0gIiIKCiAgICAgICAgICAgICAgICBpZiBmb3VuZDoKICAgICAgICAgICAgICAgICAgICBhZnRlciA9IHZhbHVlW20uZW5kKCk6XQogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWVbOm0uc3RhcnQoKV0gKyBpdGVtICsgYWZ0ZXIKICAgICAgICAgICAgICAgICAgICBpZiAiJCIgaW4gYWZ0ZXI6CiAgICAgICAgICAgICAgICAgICAgICAgIG5vdGRvbmVbbmFtZV0gPSB2YWx1ZQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gaW50KHZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmVbbmFtZV0gPSB2YWx1ZS5zdHJpcCgpCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lW25hbWVdID0gdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVzLnJlbW92ZShuYW1lKQoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUuc3RhcnRzd2l0aCgnUFlfJykgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lWzM6XSBpbiByZW5hbWVkX3ZhcmlhYmxlcyk6CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWVbMzpdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBuYW1lIG5vdCBpbiBkb25lOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmVbbmFtZV0gPSB2YWx1ZQoKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgYm9ndXMgdmFyaWFibGUgcmVmZXJlbmNlIChlLmcuICJwcmVmaXg9JC9vcHQvcHl0aG9uIik7CiAgICAgICAgICAgICAgICAjIGp1c3QgZHJvcCBpdCBzaW5jZSB3ZSBjYW4ndCBkZWFsCiAgICAgICAgICAgICAgICBkb25lW25hbWVdID0gdmFsdWUKICAgICAgICAgICAgICAgIHZhcmlhYmxlcy5yZW1vdmUobmFtZSkKCiAgICAjIHN0cmlwIHNwdXJpb3VzIHNwYWNlcwogICAgZm9yIGssIHYgaW4gZG9uZS5pdGVtcygpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uodiwgc3RyKToKICAgICAgICAgICAgZG9uZVtrXSA9IHYuc3RyaXAoKQoKICAgICMgc2F2ZSB0aGUgcmVzdWx0cyBpbiB0aGUgZ2xvYmFsIGRpY3Rpb25hcnkKICAgIHZhcnMudXBkYXRlKGRvbmUpCiAgICByZXR1cm4gdmFycwoKCmRlZiBnZXRfbWFrZWZpbGVfZmlsZW5hbWUoKToKICAgICIiIlJldHVybiB0aGUgcGF0aCBvZiB0aGUgTWFrZWZpbGUuIiIiCiAgICBpZiBfUFlUSE9OX0JVSUxEOgogICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oX1BST0pFQ1RfQkFTRSwgIk1ha2VmaWxlIikKICAgIGlmIGhhc2F0dHIoc3lzLCAnYWJpZmxhZ3MnKToKICAgICAgICBjb25maWdfZGlyX25hbWUgPSAnY29uZmlnLSVzJXMnICUgKF9QWV9WRVJTSU9OX1NIT1JULCBzeXMuYWJpZmxhZ3MpCiAgICBlbHNlOgogICAgICAgIGNvbmZpZ19kaXJfbmFtZSA9ICdjb25maWcnCiAgICByZXR1cm4gb3MucGF0aC5qb2luKGdldF9wYXRoKCdzdGRsaWInKSwgY29uZmlnX2Rpcl9uYW1lLCAnTWFrZWZpbGUnKQoKCmRlZiBfaW5pdF9wb3NpeCh2YXJzKToKICAgICIiIkluaXRpYWxpemUgdGhlIG1vZHVsZSBhcyBhcHByb3ByaWF0ZSBmb3IgUE9TSVggc3lzdGVtcy4iIiIKICAgICMgbG9hZCB0aGUgaW5zdGFsbGVkIE1ha2VmaWxlOgogICAgbWFrZWZpbGUgPSBnZXRfbWFrZWZpbGVfZmlsZW5hbWUoKQogICAgdHJ5OgogICAgICAgIF9wYXJzZV9tYWtlZmlsZShtYWtlZmlsZSwgdmFycykKICAgIGV4Y2VwdCBJT0Vycm9yIGFzIGU6CiAgICAgICAgbXNnID0gImludmFsaWQgUHl0aG9uIGluc3RhbGxhdGlvbjogdW5hYmxlIHRvIG9wZW4gJXMiICUgbWFrZWZpbGUKICAgICAgICBpZiBoYXNhdHRyKGUsICJzdHJlcnJvciIpOgogICAgICAgICAgICBtc2cgPSBtc2cgKyAiICglcykiICUgZS5zdHJlcnJvcgogICAgICAgIHJhaXNlIElPRXJyb3IobXNnKQogICAgIyBsb2FkIHRoZSBpbnN0YWxsZWQgcHljb25maWcuaDoKICAgIGNvbmZpZ19oID0gZ2V0X2NvbmZpZ19oX2ZpbGVuYW1lKCkKICAgIHRyeToKICAgICAgICB3aXRoIG9wZW4oY29uZmlnX2gpIGFzIGY6CiAgICAgICAgICAgIHBhcnNlX2NvbmZpZ19oKGYsIHZhcnMpCiAgICBleGNlcHQgSU9FcnJvciBhcyBlOgogICAgICAgIG1zZyA9ICJpbnZhbGlkIFB5dGhvbiBpbnN0YWxsYXRpb246IHVuYWJsZSB0byBvcGVuICVzIiAlIGNvbmZpZ19oCiAgICAgICAgaWYgaGFzYXR0cihlLCAic3RyZXJyb3IiKToKICAgICAgICAgICAgbXNnID0gbXNnICsgIiAoJXMpIiAlIGUuc3RyZXJyb3IKICAgICAgICByYWlzZSBJT0Vycm9yKG1zZykKICAgICMgT24gQUlYLCB0aGVyZSBhcmUgd3JvbmcgcGF0aHMgdG8gdGhlIGxpbmtlciBzY3JpcHRzIGluIHRoZSBNYWtlZmlsZQogICAgIyAtLSB0aGVzZSBwYXRocyBhcmUgcmVsYXRpdmUgdG8gdGhlIFB5dGhvbiBzb3VyY2UsIGJ1dCB3aGVuIGluc3RhbGxlZAogICAgIyB0aGUgc2NyaXB0cyBhcmUgaW4gYW5vdGhlciBkaXJlY3RvcnkuCiAgICBpZiBfUFlUSE9OX0JVSUxEOgogICAgICAgIHZhcnNbJ0xEU0hBUkVEJ10gPSB2YXJzWydCTERTSEFSRUQnXQoKCmRlZiBfaW5pdF9ub25fcG9zaXgodmFycyk6CiAgICAiIiJJbml0aWFsaXplIHRoZSBtb2R1bGUgYXMgYXBwcm9wcmlhdGUgZm9yIE5UIiIiCiAgICAjIHNldCBiYXNpYyBpbnN0YWxsIGRpcmVjdG9yaWVzCiAgICB2YXJzWydMSUJERVNUJ10gPSBnZXRfcGF0aCgnc3RkbGliJykKICAgIHZhcnNbJ0JJTkxJQkRFU1QnXSA9IGdldF9wYXRoKCdwbGF0c3RkbGliJykKICAgIHZhcnNbJ0lOQ0xVREVQWSddID0gZ2V0X3BhdGgoJ2luY2x1ZGUnKQogICAgdmFyc1snU08nXSA9ICcucHlkJwogICAgdmFyc1snRVhFJ10gPSAnLmV4ZScKICAgIHZhcnNbJ1ZFUlNJT04nXSA9IF9QWV9WRVJTSU9OX1NIT1JUX05PX0RPVAogICAgdmFyc1snQklORElSJ10gPSBvcy5wYXRoLmRpcm5hbWUoX3NhZmVfcmVhbHBhdGgoc3lzLmV4ZWN1dGFibGUpKQoKIwojIHB1YmxpYyBBUElzCiMKCgpkZWYgcGFyc2VfY29uZmlnX2goZnAsIHZhcnM9Tm9uZSk6CiAgICAiIiJQYXJzZSBhIGNvbmZpZy5oLXN0eWxlIGZpbGUuCgogICAgQSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgbmFtZS92YWx1ZSBwYWlycyBpcyByZXR1cm5lZC4gIElmIGFuCiAgICBvcHRpb25hbCBkaWN0aW9uYXJ5IGlzIHBhc3NlZCBpbiBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50LCBpdCBpcwogICAgdXNlZCBpbnN0ZWFkIG9mIGEgbmV3IGRpY3Rpb25hcnkuCiAgICAiIiIKICAgIGlmIHZhcnMgaXMgTm9uZToKICAgICAgICB2YXJzID0ge30KICAgIGRlZmluZV9yeCA9IHJlLmNvbXBpbGUoIiNkZWZpbmUgKFtBLVpdW0EtWmEtejAtOV9dKykgKC4qKVxuIikKICAgIHVuZGVmX3J4ID0gcmUuY29tcGlsZSgiL1sqXSAjdW5kZWYgKFtBLVpdW0EtWmEtejAtOV9dKykgWypdL1xuIikKCiAgICB3aGlsZSBUcnVlOgogICAgICAgIGxpbmUgPSBmcC5yZWFkbGluZSgpCiAgICAgICAgaWYgbm90IGxpbmU6CiAgICAgICAgICAgIGJyZWFrCiAgICAgICAgbSA9IGRlZmluZV9yeC5tYXRjaChsaW5lKQogICAgICAgIGlmIG06CiAgICAgICAgICAgIG4sIHYgPSBtLmdyb3VwKDEsIDIpCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHYgPSBpbnQodikKICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgIHZhcnNbbl0gPSB2CiAgICAgICAgZWxzZToKICAgICAgICAgICAgbSA9IHVuZGVmX3J4Lm1hdGNoKGxpbmUpCiAgICAgICAgICAgIGlmIG06CiAgICAgICAgICAgICAgICB2YXJzW20uZ3JvdXAoMSldID0gMAogICAgcmV0dXJuIHZhcnMKCgpkZWYgZ2V0X2NvbmZpZ19oX2ZpbGVuYW1lKCk6CiAgICAiIiJSZXR1cm4gdGhlIHBhdGggb2YgcHljb25maWcuaC4iIiIKICAgIGlmIF9QWVRIT05fQlVJTEQ6CiAgICAgICAgaWYgb3MubmFtZSA9PSAibnQiOgogICAgICAgICAgICBpbmNfZGlyID0gb3MucGF0aC5qb2luKF9QUk9KRUNUX0JBU0UsICJQQyIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaW5jX2RpciA9IF9QUk9KRUNUX0JBU0UKICAgIGVsc2U6CiAgICAgICAgaW5jX2RpciA9IGdldF9wYXRoKCdwbGF0aW5jbHVkZScpCiAgICByZXR1cm4gb3MucGF0aC5qb2luKGluY19kaXIsICdweWNvbmZpZy5oJykKCgpkZWYgZ2V0X3NjaGVtZV9uYW1lcygpOgogICAgIiIiUmV0dXJuIGEgdHVwbGUgY29udGFpbmluZyB0aGUgc2NoZW1lcyBuYW1lcy4iIiIKICAgIHJldHVybiB0dXBsZShzb3J0ZWQoX1NDSEVNRVMuc2VjdGlvbnMoKSkpCgoKZGVmIGdldF9wYXRoX25hbWVzKCk6CiAgICAiIiJSZXR1cm4gYSB0dXBsZSBjb250YWluaW5nIHRoZSBwYXRocyBuYW1lcy4iIiIKICAgICMgeHh4IHNlZSBpZiB3ZSB3YW50IGEgc3RhdGljIGxpc3QKICAgIHJldHVybiBfU0NIRU1FUy5vcHRpb25zKCdwb3NpeF9wcmVmaXgnKQoKCmRlZiBnZXRfcGF0aHMoc2NoZW1lPV9nZXRfZGVmYXVsdF9zY2hlbWUoKSwgdmFycz1Ob25lLCBleHBhbmQ9VHJ1ZSk6CiAgICAiIiJSZXR1cm4gYSBtYXBwaW5nIGNvbnRhaW5pbmcgYW4gaW5zdGFsbCBzY2hlbWUuCgogICAgYGBzY2hlbWVgYCBpcyB0aGUgaW5zdGFsbCBzY2hlbWUgbmFtZS4gSWYgbm90IHByb3ZpZGVkLCBpdCB3aWxsCiAgICByZXR1cm4gdGhlIGRlZmF1bHQgc2NoZW1lIGZvciB0aGUgY3VycmVudCBwbGF0Zm9ybS4KICAgICIiIgogICAgX2Vuc3VyZV9jZmdfcmVhZCgpCiAgICBpZiBleHBhbmQ6CiAgICAgICAgcmV0dXJuIF9leHBhbmRfdmFycyhzY2hlbWUsIHZhcnMpCiAgICBlbHNlOgogICAgICAgIHJldHVybiBkaWN0KF9TQ0hFTUVTLml0ZW1zKHNjaGVtZSkpCgoKZGVmIGdldF9wYXRoKG5hbWUsIHNjaGVtZT1fZ2V0X2RlZmF1bHRfc2NoZW1lKCksIHZhcnM9Tm9uZSwgZXhwYW5kPVRydWUpOgogICAgIiIiUmV0dXJuIGEgcGF0aCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzY2hlbWUuCgogICAgYGBzY2hlbWVgYCBpcyB0aGUgaW5zdGFsbCBzY2hlbWUgbmFtZS4KICAgICIiIgogICAgcmV0dXJuIGdldF9wYXRocyhzY2hlbWUsIHZhcnMsIGV4cGFuZClbbmFtZV0KCgpkZWYgZ2V0X2NvbmZpZ192YXJzKCphcmdzKToKICAgICIiIldpdGggbm8gYXJndW1lbnRzLCByZXR1cm4gYSBkaWN0aW9uYXJ5IG9mIGFsbCBjb25maWd1cmF0aW9uCiAgICB2YXJpYWJsZXMgcmVsZXZhbnQgZm9yIHRoZSBjdXJyZW50IHBsYXRmb3JtLgoKICAgIE9uIFVuaXgsIHRoaXMgbWVhbnMgZXZlcnkgdmFyaWFibGUgZGVmaW5lZCBpbiBQeXRob24ncyBpbnN0YWxsZWQgTWFrZWZpbGU7CiAgICBPbiBXaW5kb3dzIGFuZCBNYWMgT1MgaXQncyBhIG11Y2ggc21hbGxlciBzZXQuCgogICAgV2l0aCBhcmd1bWVudHMsIHJldHVybiBhIGxpc3Qgb2YgdmFsdWVzIHRoYXQgcmVzdWx0IGZyb20gbG9va2luZyB1cAogICAgZWFjaCBhcmd1bWVudCBpbiB0aGUgY29uZmlndXJhdGlvbiB2YXJpYWJsZSBkaWN0aW9uYXJ5LgogICAgIiIiCiAgICBnbG9iYWwgX0NPTkZJR19WQVJTCiAgICBpZiBfQ09ORklHX1ZBUlMgaXMgTm9uZToKICAgICAgICBfQ09ORklHX1ZBUlMgPSB7fQogICAgICAgICMgTm9ybWFsaXplZCB2ZXJzaW9ucyBvZiBwcmVmaXggYW5kIGV4ZWNfcHJlZml4IGFyZSBoYW5keSB0byBoYXZlOwogICAgICAgICMgaW4gZmFjdCwgdGhlc2UgYXJlIHRoZSBzdGFuZGFyZCB2ZXJzaW9ucyB1c2VkIG1vc3QgcGxhY2VzIGluIHRoZQogICAgICAgICMgZGlzdHV0aWxzMiBtb2R1bGUuCiAgICAgICAgX0NPTkZJR19WQVJTWydwcmVmaXgnXSA9IF9QUkVGSVgKICAgICAgICBfQ09ORklHX1ZBUlNbJ2V4ZWNfcHJlZml4J10gPSBfRVhFQ19QUkVGSVgKICAgICAgICBfQ09ORklHX1ZBUlNbJ3B5X3ZlcnNpb24nXSA9IF9QWV9WRVJTSU9OCiAgICAgICAgX0NPTkZJR19WQVJTWydweV92ZXJzaW9uX3Nob3J0J10gPSBfUFlfVkVSU0lPTl9TSE9SVAogICAgICAgIF9DT05GSUdfVkFSU1sncHlfdmVyc2lvbl9ub2RvdCddID0gX1BZX1ZFUlNJT05bMF0gKyBfUFlfVkVSU0lPTlsyXQogICAgICAgIF9DT05GSUdfVkFSU1snYmFzZSddID0gX1BSRUZJWAogICAgICAgIF9DT05GSUdfVkFSU1sncGxhdGJhc2UnXSA9IF9FWEVDX1BSRUZJWAogICAgICAgIF9DT05GSUdfVkFSU1sncHJvamVjdGJhc2UnXSA9IF9QUk9KRUNUX0JBU0UKICAgICAgICB0cnk6CiAgICAgICAgICAgIF9DT05GSUdfVkFSU1snYWJpZmxhZ3MnXSA9IHN5cy5hYmlmbGFncwogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgIyBzeXMuYWJpZmxhZ3MgbWF5IG5vdCBiZSBkZWZpbmVkIG9uIGFsbCBwbGF0Zm9ybXMuCiAgICAgICAgICAgIF9DT05GSUdfVkFSU1snYWJpZmxhZ3MnXSA9ICcnCgogICAgICAgIGlmIG9zLm5hbWUgaW4gKCdudCcsICdvczInKToKICAgICAgICAgICAgX2luaXRfbm9uX3Bvc2l4KF9DT05GSUdfVkFSUykKICAgICAgICBpZiBvcy5uYW1lID09ICdwb3NpeCc6CiAgICAgICAgICAgIF9pbml0X3Bvc2l4KF9DT05GSUdfVkFSUykKICAgICAgICAjIFNldHRpbmcgJ3VzZXJiYXNlJyBpcyBkb25lIGJlbG93IHRoZSBjYWxsIHRvIHRoZQogICAgICAgICMgaW5pdCBmdW5jdGlvbiB0byBlbmFibGUgdXNpbmcgJ2dldF9jb25maWdfdmFyJyBpbgogICAgICAgICMgdGhlIGluaXQtZnVuY3Rpb24uCiAgICAgICAgaWYgc3lzLnZlcnNpb24gPj0gJzIuNic6CiAgICAgICAgICAgIF9DT05GSUdfVkFSU1sndXNlcmJhc2UnXSA9IF9nZXR1c2VyYmFzZSgpCgogICAgICAgIGlmICdzcmNkaXInIG5vdCBpbiBfQ09ORklHX1ZBUlM6CiAgICAgICAgICAgIF9DT05GSUdfVkFSU1snc3JjZGlyJ10gPSBfUFJPSkVDVF9CQVNFCiAgICAgICAgZWxzZToKICAgICAgICAgICAgX0NPTkZJR19WQVJTWydzcmNkaXInXSA9IF9zYWZlX3JlYWxwYXRoKF9DT05GSUdfVkFSU1snc3JjZGlyJ10pCgogICAgICAgICMgQ29udmVydCBzcmNkaXIgaW50byBhbiBhYnNvbHV0ZSBwYXRoIGlmIGl0IGFwcGVhcnMgbmVjZXNzYXJ5LgogICAgICAgICMgTm9ybWFsbHkgaXQgaXMgcmVsYXRpdmUgdG8gdGhlIGJ1aWxkIGRpcmVjdG9yeS4gIEhvd2V2ZXIsIGR1cmluZwogICAgICAgICMgdGVzdGluZywgZm9yIGV4YW1wbGUsIHdlIG1pZ2h0IGJlIHJ1bm5pbmcgYSBub24taW5zdGFsbGVkIHB5dGhvbgogICAgICAgICMgZnJvbSBhIGRpZmZlcmVudCBkaXJlY3RvcnkuCiAgICAgICAgaWYgX1BZVEhPTl9CVUlMRCBhbmQgb3MubmFtZSA9PSAicG9zaXgiOgogICAgICAgICAgICBiYXNlID0gX1BST0pFQ1RfQkFTRQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBjd2QgPSBvcy5nZXRjd2QoKQogICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICAgICAgICAgIGN3ZCA9IE5vbmUKICAgICAgICAgICAgaWYgKG5vdCBvcy5wYXRoLmlzYWJzKF9DT05GSUdfVkFSU1snc3JjZGlyJ10pIGFuZAogICAgICAgICAgICAgICAgYmFzZSAhPSBjd2QpOgogICAgICAgICAgICAgICAgIyBzcmNkaXIgaXMgcmVsYXRpdmUgYW5kIHdlIGFyZSBub3QgaW4gdGhlIHNhbWUgZGlyZWN0b3J5CiAgICAgICAgICAgICAgICAjIGFzIHRoZSBleGVjdXRhYmxlLiBBc3N1bWUgZXhlY3V0YWJsZSBpcyBpbiB0aGUgYnVpbGQKICAgICAgICAgICAgICAgICMgZGlyZWN0b3J5IGFuZCBtYWtlIHNyY2RpciBhYnNvbHV0ZS4KICAgICAgICAgICAgICAgIHNyY2RpciA9IG9zLnBhdGguam9pbihiYXNlLCBfQ09ORklHX1ZBUlNbJ3NyY2RpciddKQogICAgICAgICAgICAgICAgX0NPTkZJR19WQVJTWydzcmNkaXInXSA9IG9zLnBhdGgubm9ybXBhdGgoc3JjZGlyKQoKICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6CiAgICAgICAgICAgIGtlcm5lbF92ZXJzaW9uID0gb3MudW5hbWUoKVsyXSAgIyBLZXJuZWwgdmVyc2lvbiAoOC40LjMpCiAgICAgICAgICAgIG1ham9yX3ZlcnNpb24gPSBpbnQoa2VybmVsX3ZlcnNpb24uc3BsaXQoJy4nKVswXSkKCiAgICAgICAgICAgIGlmIG1ham9yX3ZlcnNpb24gPCA4OgogICAgICAgICAgICAgICAgIyBPbiBtYWNPUyBiZWZvcmUgMTAuNCwgY2hlY2sgaWYgLWFyY2ggYW5kIC1pc3lzcm9vdAogICAgICAgICAgICAgICAgIyBhcmUgaW4gQ0ZMQUdTIG9yIExERkxBR1MgYW5kIHJlbW92ZSB0aGVtIGlmIHRoZXkgYXJlLgogICAgICAgICAgICAgICAgIyBUaGlzIGlzIG5lZWRlZCB3aGVuIGJ1aWxkaW5nIGV4dGVuc2lvbnMgb24gYSAxMC4zIHN5c3RlbQogICAgICAgICAgICAgICAgIyB1c2luZyBhIHVuaXZlcnNhbCBidWlsZCBvZiBweXRob24uCiAgICAgICAgICAgICAgICBmb3Iga2V5IGluICgnTERGTEFHUycsICdCQVNFQ0ZMQUdTJywKICAgICAgICAgICAgICAgICAgICAgICAgIyBhIG51bWJlciBvZiBkZXJpdmVkIHZhcmlhYmxlcy4gVGhlc2UgbmVlZCB0byBiZQogICAgICAgICAgICAgICAgICAgICAgICAjIHBhdGNoZWQgdXAgYXMgd2VsbC4KICAgICAgICAgICAgICAgICAgICAgICAgJ0NGTEFHUycsICdQWV9DRkxBR1MnLCAnQkxEU0hBUkVEJyk6CiAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSBfQ09ORklHX1ZBUlNba2V5XQogICAgICAgICAgICAgICAgICAgIGZsYWdzID0gcmUuc3ViKCctYXJjaFxzK1x3K1xzJywgJyAnLCBmbGFncykKICAgICAgICAgICAgICAgICAgICBmbGFncyA9IHJlLnN1YignLWlzeXNyb290IFteIFx0XSonLCAnICcsIGZsYWdzKQogICAgICAgICAgICAgICAgICAgIF9DT05GSUdfVkFSU1trZXldID0gZmxhZ3MKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgQWxsb3cgdGhlIHVzZXIgdG8gb3ZlcnJpZGUgdGhlIGFyY2hpdGVjdHVyZSBmbGFncyB1c2luZwogICAgICAgICAgICAgICAgIyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZS4KICAgICAgICAgICAgICAgICMgTk9URTogVGhpcyBuYW1lIHdhcyBpbnRyb2R1Y2VkIGJ5IEFwcGxlIGluIE9TWCAxMC41IGFuZAogICAgICAgICAgICAgICAgIyBpcyB1c2VkIGJ5IHNldmVyYWwgc2NyaXB0aW5nIGxhbmd1YWdlcyBkaXN0cmlidXRlZCB3aXRoCiAgICAgICAgICAgICAgICAjIHRoYXQgT1MgcmVsZWFzZS4KICAgICAgICAgICAgICAgIGlmICdBUkNIRkxBR1MnIGluIG9zLmVudmlyb246CiAgICAgICAgICAgICAgICAgICAgYXJjaCA9IG9zLmVudmlyb25bJ0FSQ0hGTEFHUyddCiAgICAgICAgICAgICAgICAgICAgZm9yIGtleSBpbiAoJ0xERkxBR1MnLCAnQkFTRUNGTEFHUycsCiAgICAgICAgICAgICAgICAgICAgICAgICMgYSBudW1iZXIgb2YgZGVyaXZlZCB2YXJpYWJsZXMuIFRoZXNlIG5lZWQgdG8gYmUKICAgICAgICAgICAgICAgICAgICAgICAgIyBwYXRjaGVkIHVwIGFzIHdlbGwuCiAgICAgICAgICAgICAgICAgICAgICAgICdDRkxBR1MnLCAnUFlfQ0ZMQUdTJywgJ0JMRFNIQVJFRCcpOgoKICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSBfQ09ORklHX1ZBUlNba2V5XQogICAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9IHJlLnN1YignLWFyY2hccytcdytccycsICcgJywgZmxhZ3MpCiAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gZmxhZ3MgKyAnICcgKyBhcmNoCiAgICAgICAgICAgICAgICAgICAgICAgIF9DT05GSUdfVkFSU1trZXldID0gZmxhZ3MKCiAgICAgICAgICAgICAgICAjIElmIHdlJ3JlIG9uIE9TWCAxMC41IG9yIGxhdGVyIGFuZCB0aGUgdXNlciB0cmllcyB0bwogICAgICAgICAgICAgICAgIyBjb21waWxlcyBhbiBleHRlbnNpb24gdXNpbmcgYW4gU0RLIHRoYXQgaXMgbm90IHByZXNlbnQKICAgICAgICAgICAgICAgICMgb24gdGhlIGN1cnJlbnQgbWFjaGluZSBpdCBpcyBiZXR0ZXIgdG8gbm90IHVzZSBhbiBTREsKICAgICAgICAgICAgICAgICMgdGhhbiB0byBmYWlsLgogICAgICAgICAgICAgICAgIwogICAgICAgICAgICAgICAgIyBUaGUgbWFqb3IgdXNlY2FzZSBmb3IgdGhpcyBpcyB1c2VycyB1c2luZyBhIFB5dGhvbi5vcmcKICAgICAgICAgICAgICAgICMgYmluYXJ5IGluc3RhbGxlciAgb24gT1NYIDEwLjY6IHRoYXQgaW5zdGFsbGVyIHVzZXMKICAgICAgICAgICAgICAgICMgdGhlIDEwLjR1IFNESywgYnV0IHRoYXQgU0RLIGlzIG5vdCBpbnN0YWxsZWQgYnkgZGVmYXVsdAogICAgICAgICAgICAgICAgIyB3aGVuIHlvdSBpbnN0YWxsIFhjb2RlLgogICAgICAgICAgICAgICAgIwogICAgICAgICAgICAgICAgQ0ZMQUdTID0gX0NPTkZJR19WQVJTLmdldCgnQ0ZMQUdTJywgJycpCiAgICAgICAgICAgICAgICBtID0gcmUuc2VhcmNoKCctaXN5c3Jvb3RccysoXFMrKScsIENGTEFHUykKICAgICAgICAgICAgICAgIGlmIG0gaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgc2RrID0gbS5ncm91cCgxKQogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZGspOgogICAgICAgICAgICAgICAgICAgICAgICBmb3Iga2V5IGluICgnTERGTEFHUycsICdCQVNFQ0ZMQUdTJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGEgbnVtYmVyIG9mIGRlcml2ZWQgdmFyaWFibGVzLiBUaGVzZSBuZWVkIHRvIGJlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwYXRjaGVkIHVwIGFzIHdlbGwuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ0ZMQUdTJywgJ1BZX0NGTEFHUycsICdCTERTSEFSRUQnKToKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9IF9DT05GSUdfVkFSU1trZXldCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9IHJlLnN1YignLWlzeXNyb290XHMrXFMrKFxzfCQpJywgJyAnLCBmbGFncykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DT05GSUdfVkFSU1trZXldID0gZmxhZ3MKCiAgICBpZiBhcmdzOgogICAgICAgIHZhbHMgPSBbXQogICAgICAgIGZvciBuYW1lIGluIGFyZ3M6CiAgICAgICAgICAgIHZhbHMuYXBwZW5kKF9DT05GSUdfVkFSUy5nZXQobmFtZSkpCiAgICAgICAgcmV0dXJuIHZhbHMKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIF9DT05GSUdfVkFSUwoKCmRlZiBnZXRfY29uZmlnX3ZhcihuYW1lKToKICAgICIiIlJldHVybiB0aGUgdmFsdWUgb2YgYSBzaW5nbGUgdmFyaWFibGUgdXNpbmcgdGhlIGRpY3Rpb25hcnkgcmV0dXJuZWQgYnkKICAgICdnZXRfY29uZmlnX3ZhcnMoKScuCgogICAgRXF1aXZhbGVudCB0byBnZXRfY29uZmlnX3ZhcnMoKS5nZXQobmFtZSkKICAgICIiIgogICAgcmV0dXJuIGdldF9jb25maWdfdmFycygpLmdldChuYW1lKQoKCmRlZiBnZXRfcGxhdGZvcm0oKToKICAgICIiIlJldHVybiBhIHN0cmluZyB0aGF0IGlkZW50aWZpZXMgdGhlIGN1cnJlbnQgcGxhdGZvcm0uCgogICAgVGhpcyBpcyB1c2VkIG1haW5seSB0byBkaXN0aW5ndWlzaCBwbGF0Zm9ybS1zcGVjaWZpYyBidWlsZCBkaXJlY3RvcmllcyBhbmQKICAgIHBsYXRmb3JtLXNwZWNpZmljIGJ1aWx0IGRpc3RyaWJ1dGlvbnMuICBUeXBpY2FsbHkgaW5jbHVkZXMgdGhlIE9TIG5hbWUKICAgIGFuZCB2ZXJzaW9uIGFuZCB0aGUgYXJjaGl0ZWN0dXJlIChhcyBzdXBwbGllZCBieSAnb3MudW5hbWUoKScpLAogICAgYWx0aG91Z2ggdGhlIGV4YWN0IGluZm9ybWF0aW9uIGluY2x1ZGVkIGRlcGVuZHMgb24gdGhlIE9TOyBlZy4gZm9yIElSSVgKICAgIHRoZSBhcmNoaXRlY3R1cmUgaXNuJ3QgcGFydGljdWxhcmx5IGltcG9ydGFudCAoSVJJWCBvbmx5IHJ1bnMgb24gU0dJCiAgICBoYXJkd2FyZSksIGJ1dCBmb3IgTGludXggdGhlIGtlcm5lbCB2ZXJzaW9uIGlzbid0IHBhcnRpY3VsYXJseQogICAgaW1wb3J0YW50LgoKICAgIEV4YW1wbGVzIG9mIHJldHVybmVkIHZhbHVlczoKICAgICAgIGxpbnV4LWk1ODYKICAgICAgIGxpbnV4LWFscGhhICg/KQogICAgICAgc29sYXJpcy0yLjYtc3VuNHUKICAgICAgIGlyaXgtNS4zCiAgICAgICBpcml4NjQtNi4yCgogICAgV2luZG93cyB3aWxsIHJldHVybiBvbmUgb2Y6CiAgICAgICB3aW4tYW1kNjQgKDY0Yml0IFdpbmRvd3Mgb24gQU1ENjQgKGFrYSB4ODZfNjQsIEludGVsNjQsIEVNNjRULCBldGMpCiAgICAgICB3aW4taWE2NCAoNjRiaXQgV2luZG93cyBvbiBJdGFuaXVtKQogICAgICAgd2luMzIgKGFsbCBvdGhlcnMgLSBzcGVjaWZpY2FsbHksIHN5cy5wbGF0Zm9ybSBpcyByZXR1cm5lZCkKCiAgICBGb3Igb3RoZXIgbm9uLVBPU0lYIHBsYXRmb3JtcywgY3VycmVudGx5IGp1c3QgcmV0dXJucyAnc3lzLnBsYXRmb3JtJy4KICAgICIiIgogICAgaWYgb3MubmFtZSA9PSAnbnQnOgogICAgICAgICMgc25pZmYgc3lzLnZlcnNpb24gZm9yIGFyY2hpdGVjdHVyZS4KICAgICAgICBwcmVmaXggPSAiIGJpdCAoIgogICAgICAgIGkgPSBzeXMudmVyc2lvbi5maW5kKHByZWZpeCkKICAgICAgICBpZiBpID09IC0xOgogICAgICAgICAgICByZXR1cm4gc3lzLnBsYXRmb3JtCiAgICAgICAgaiA9IHN5cy52ZXJzaW9uLmZpbmQoIikiLCBpKQogICAgICAgIGxvb2sgPSBzeXMudmVyc2lvbltpK2xlbihwcmVmaXgpOmpdLmxvd2VyKCkKICAgICAgICBpZiBsb29rID09ICdhbWQ2NCc6CiAgICAgICAgICAgIHJldHVybiAnd2luLWFtZDY0JwogICAgICAgIGlmIGxvb2sgPT0gJ2l0YW5pdW0nOgogICAgICAgICAgICByZXR1cm4gJ3dpbi1pYTY0JwogICAgICAgIHJldHVybiBzeXMucGxhdGZvcm0KCiAgICBpZiBvcy5uYW1lICE9ICJwb3NpeCIgb3Igbm90IGhhc2F0dHIob3MsICd1bmFtZScpOgogICAgICAgICMgWFhYIHdoYXQgYWJvdXQgdGhlIGFyY2hpdGVjdHVyZT8gTlQgaXMgSW50ZWwgb3IgQWxwaGEsCiAgICAgICAgIyBNYWMgT1MgaXMgTTY4ayBvciBQUEMsIGV0Yy4KICAgICAgICByZXR1cm4gc3lzLnBsYXRmb3JtCgogICAgIyBUcnkgdG8gZGlzdGluZ3Vpc2ggdmFyaW91cyBmbGF2b3VycyBvZiBVbml4CiAgICBvc25hbWUsIGhvc3QsIHJlbGVhc2UsIHZlcnNpb24sIG1hY2hpbmUgPSBvcy51bmFtZSgpCgogICAgIyBDb252ZXJ0IHRoZSBPUyBuYW1lIHRvIGxvd2VyY2FzZSwgcmVtb3ZlICcvJyBjaGFyYWN0ZXJzCiAgICAjICh0byBhY2NvbW1vZGF0ZSBCU0QvT1MpLCBhbmQgdHJhbnNsYXRlIHNwYWNlcyAoZm9yICJQb3dlciBNYWNpbnRvc2giKQogICAgb3NuYW1lID0gb3NuYW1lLmxvd2VyKCkucmVwbGFjZSgnLycsICcnKQogICAgbWFjaGluZSA9IG1hY2hpbmUucmVwbGFjZSgnICcsICdfJykKICAgIG1hY2hpbmUgPSBtYWNoaW5lLnJlcGxhY2UoJy8nLCAnLScpCgogICAgaWYgb3NuYW1lWzo1XSA9PSAibGludXgiOgogICAgICAgICMgQXQgbGVhc3Qgb24gTGludXgvSW50ZWwsICdtYWNoaW5lJyBpcyB0aGUgcHJvY2Vzc29yIC0tCiAgICAgICAgIyBpMzg2LCBldGMuCiAgICAgICAgIyBYWFggd2hhdCBhYm91dCBBbHBoYSwgU1BBUkMsIGV0Yz8KICAgICAgICByZXR1cm4gICIlcy0lcyIgJSAob3NuYW1lLCBtYWNoaW5lKQogICAgZWxpZiBvc25hbWVbOjVdID09ICJzdW5vcyI6CiAgICAgICAgaWYgcmVsZWFzZVswXSA+PSAiNSI6ICAgICAgICAgICAjIFN1bk9TIDUgPT0gU29sYXJpcyAyCiAgICAgICAgICAgIG9zbmFtZSA9ICJzb2xhcmlzIgogICAgICAgICAgICByZWxlYXNlID0gIiVkLiVzIiAlIChpbnQocmVsZWFzZVswXSkgLSAzLCByZWxlYXNlWzI6XSkKICAgICAgICAjIGZhbGwgdGhyb3VnaCB0byBzdGFuZGFyZCBvc25hbWUtcmVsZWFzZS1tYWNoaW5lIHJlcHJlc2VudGF0aW9uCiAgICBlbGlmIG9zbmFtZVs6NF0gPT0gImlyaXgiOiAgICAgICAgICAgICAgIyBjb3VsZCBiZSAiaXJpeDY0IiEKICAgICAgICByZXR1cm4gIiVzLSVzIiAlIChvc25hbWUsIHJlbGVhc2UpCiAgICBlbGlmIG9zbmFtZVs6M10gPT0gImFpeCI6CiAgICAgICAgcmV0dXJuICIlcy0lcy4lcyIgJSAob3NuYW1lLCB2ZXJzaW9uLCByZWxlYXNlKQogICAgZWxpZiBvc25hbWVbOjZdID09ICJjeWd3aW4iOgogICAgICAgIG9zbmFtZSA9ICJjeWd3aW4iCiAgICAgICAgcmVsX3JlID0gcmUuY29tcGlsZShyJ1tcZC5dKycpCiAgICAgICAgbSA9IHJlbF9yZS5tYXRjaChyZWxlYXNlKQogICAgICAgIGlmIG06CiAgICAgICAgICAgIHJlbGVhc2UgPSBtLmdyb3VwKCkKICAgIGVsaWYgb3NuYW1lWzo2XSA9PSAiZGFyd2luIjoKICAgICAgICAjCiAgICAgICAgIyBGb3Igb3VyIHB1cnBvc2VzLCB3ZSdsbCBhc3N1bWUgdGhhdCB0aGUgc3lzdGVtIHZlcnNpb24gZnJvbQogICAgICAgICMgZGlzdHV0aWxzJyBwZXJzcGVjdGl2ZSBpcyB3aGF0IE1BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVCBpcyBzZXQKICAgICAgICAjIHRvLiBUaGlzIG1ha2VzIHRoZSBjb21wYXRpYmlsaXR5IHN0b3J5IGEgYml0IG1vcmUgc2FuZSBiZWNhdXNlIHRoZQogICAgICAgICMgbWFjaGluZSBpcyBnb2luZyB0byBjb21waWxlIGFuZCBsaW5rIGFzIGlmIGl0IHdlcmUKICAgICAgICAjIE1BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVC4KICAgICAgICBjZmd2YXJzID0gZ2V0X2NvbmZpZ192YXJzKCkKICAgICAgICBtYWN2ZXIgPSBjZmd2YXJzLmdldCgnTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUJykKCiAgICAgICAgaWYgVHJ1ZToKICAgICAgICAgICAgIyBBbHdheXMgY2FsY3VsYXRlIHRoZSByZWxlYXNlIG9mIHRoZSBydW5uaW5nIG1hY2hpbmUsCiAgICAgICAgICAgICMgbmVlZGVkIHRvIGRldGVybWluZSBpZiB3ZSBjYW4gYnVpbGQgZmF0IGJpbmFyaWVzIG9yIG5vdC4KCiAgICAgICAgICAgIG1hY3JlbGVhc2UgPSBtYWN2ZXIKICAgICAgICAgICAgIyBHZXQgdGhlIHN5c3RlbSB2ZXJzaW9uLiBSZWFkaW5nIHRoaXMgcGxpc3QgaXMgYSBkb2N1bWVudGVkCiAgICAgICAgICAgICMgd2F5IHRvIGdldCB0aGUgc3lzdGVtIHZlcnNpb24gKHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IKICAgICAgICAgICAgIyB0aGUgR2VzdGFsdCBNYW5hZ2VyKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBmID0gb3BlbignL1N5c3RlbS9MaWJyYXJ5L0NvcmVTZXJ2aWNlcy9TeXN0ZW1WZXJzaW9uLnBsaXN0JykKICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6CiAgICAgICAgICAgICAgICAjIFdlJ3JlIG9uIGEgcGxhaW4gZGFyd2luIGJveCwgZmFsbCBiYWNrIHRvIHRoZSBkZWZhdWx0CiAgICAgICAgICAgICAgICAjIGJlaGF2aW91ci4KICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBtID0gcmUuc2VhcmNoKHInPGtleT5Qcm9kdWN0VXNlclZpc2libGVWZXJzaW9uPC9rZXk+XHMqJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcic8c3RyaW5nPiguKj8pPC9zdHJpbmc+JywgZi5yZWFkKCkpCiAgICAgICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgICAgIGYuY2xvc2UoKQogICAgICAgICAgICAgICAgaWYgbSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICBtYWNyZWxlYXNlID0gJy4nLmpvaW4obS5ncm91cCgxKS5zcGxpdCgnLicpWzoyXSkKICAgICAgICAgICAgICAgICMgZWxzZTogZmFsbCBiYWNrIHRvIHRoZSBkZWZhdWx0IGJlaGF2aW91cgoKICAgICAgICBpZiBub3QgbWFjdmVyOgogICAgICAgICAgICBtYWN2ZXIgPSBtYWNyZWxlYXNlCgogICAgICAgIGlmIG1hY3ZlcjoKICAgICAgICAgICAgcmVsZWFzZSA9IG1hY3ZlcgogICAgICAgICAgICBvc25hbWUgPSAibWFjb3N4IgoKICAgICAgICAgICAgaWYgKChtYWNyZWxlYXNlICsgJy4nKSA+PSAnMTAuNC4nIGFuZAogICAgICAgICAgICAgICAgJy1hcmNoJyBpbiBnZXRfY29uZmlnX3ZhcnMoKS5nZXQoJ0NGTEFHUycsICcnKS5zdHJpcCgpKToKICAgICAgICAgICAgICAgICMgVGhlIHVuaXZlcnNhbCBidWlsZCB3aWxsIGJ1aWxkIGZhdCBiaW5hcmllcywgYnV0IG5vdCBvbgogICAgICAgICAgICAgICAgIyBzeXN0ZW1zIGJlZm9yZSAxMC40CiAgICAgICAgICAgICAgICAjCiAgICAgICAgICAgICAgICAjIFRyeSB0byBkZXRlY3QgNC13YXkgdW5pdmVyc2FsIGJ1aWxkcywgdGhvc2UgaGF2ZSBtYWNoaW5lLXR5cGUKICAgICAgICAgICAgICAgICMgJ3VuaXZlcnNhbCcgaW5zdGVhZCBvZiAnZmF0Jy4KCiAgICAgICAgICAgICAgICBtYWNoaW5lID0gJ2ZhdCcKICAgICAgICAgICAgICAgIGNmbGFncyA9IGdldF9jb25maWdfdmFycygpLmdldCgnQ0ZMQUdTJykKCiAgICAgICAgICAgICAgICBhcmNocyA9IHJlLmZpbmRhbGwoJy1hcmNoXHMrKFxTKyknLCBjZmxhZ3MpCiAgICAgICAgICAgICAgICBhcmNocyA9IHR1cGxlKHNvcnRlZChzZXQoYXJjaHMpKSkKCiAgICAgICAgICAgICAgICBpZiBsZW4oYXJjaHMpID09IDE6CiAgICAgICAgICAgICAgICAgICAgbWFjaGluZSA9IGFyY2hzWzBdCiAgICAgICAgICAgICAgICBlbGlmIGFyY2hzID09ICgnaTM4NicsICdwcGMnKToKICAgICAgICAgICAgICAgICAgICBtYWNoaW5lID0gJ2ZhdCcKICAgICAgICAgICAgICAgIGVsaWYgYXJjaHMgPT0gKCdpMzg2JywgJ3g4Nl82NCcpOgogICAgICAgICAgICAgICAgICAgIG1hY2hpbmUgPSAnaW50ZWwnCiAgICAgICAgICAgICAgICBlbGlmIGFyY2hzID09ICgnaTM4NicsICdwcGMnLCAneDg2XzY0Jyk6CiAgICAgICAgICAgICAgICAgICAgbWFjaGluZSA9ICdmYXQzJwogICAgICAgICAgICAgICAgZWxpZiBhcmNocyA9PSAoJ3BwYzY0JywgJ3g4Nl82NCcpOgogICAgICAgICAgICAgICAgICAgIG1hY2hpbmUgPSAnZmF0NjQnCiAgICAgICAgICAgICAgICBlbGlmIGFyY2hzID09ICgnaTM4NicsICdwcGMnLCAncHBjNjQnLCAneDg2XzY0Jyk6CiAgICAgICAgICAgICAgICAgICAgbWFjaGluZSA9ICd1bml2ZXJzYWwnCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIkRvbid0IGtub3cgbWFjaGluZSB2YWx1ZSBmb3IgYXJjaHM9JXIiICUgKGFyY2hzLCkpCgogICAgICAgICAgICBlbGlmIG1hY2hpbmUgPT0gJ2kzODYnOgogICAgICAgICAgICAgICAgIyBPbiBPU1ggdGhlIG1hY2hpbmUgdHlwZSByZXR1cm5lZCBieSB1bmFtZSBpcyBhbHdheXMgdGhlCiAgICAgICAgICAgICAgICAjIDMyLWJpdCB2YXJpYW50LCBldmVuIGlmIHRoZSBleGVjdXRhYmxlIGFyY2hpdGVjdHVyZSBpcwogICAgICAgICAgICAgICAgIyB0aGUgNjQtYml0IHZhcmlhbnQKICAgICAgICAgICAgICAgIGlmIHN5cy5tYXhzaXplID49IDIqKjMyOgogICAgICAgICAgICAgICAgICAgIG1hY2hpbmUgPSAneDg2XzY0JwoKICAgICAgICAgICAgZWxpZiBtYWNoaW5lIGluICgnUG93ZXJQQycsICdQb3dlcl9NYWNpbnRvc2gnKToKICAgICAgICAgICAgICAgICMgUGljayBhIHNhbmUgbmFtZSBmb3IgdGhlIFBQQyBhcmNoaXRlY3R1cmUuCiAgICAgICAgICAgICAgICAjIFNlZSAnaTM4NicgY2FzZQogICAgICAgICAgICAgICAgaWYgc3lzLm1heHNpemUgPj0gMioqMzI6CiAgICAgICAgICAgICAgICAgICAgbWFjaGluZSA9ICdwcGM2NCcKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbWFjaGluZSA9ICdwcGMnCgogICAgcmV0dXJuICIlcy0lcy0lcyIgJSAob3NuYW1lLCByZWxlYXNlLCBtYWNoaW5lKQoKCmRlZiBnZXRfcHl0aG9uX3ZlcnNpb24oKToKICAgIHJldHVybiBfUFlfVkVSU0lPTl9TSE9SVAoKCmRlZiBfcHJpbnRfZGljdCh0aXRsZSwgZGF0YSk6CiAgICBmb3IgaW5kZXgsIChrZXksIHZhbHVlKSBpbiBlbnVtZXJhdGUoc29ydGVkKGRhdGEuaXRlbXMoKSkpOgogICAgICAgIGlmIGluZGV4ID09IDA6CiAgICAgICAgICAgIHByaW50KCclczogJyAlICh0aXRsZSkpCiAgICAgICAgcHJpbnQoJ1x0JXMgPSAiJXMiJyAlIChrZXksIHZhbHVlKSkKCgpkZWYgX21haW4oKToKICAgICIiIkRpc3BsYXkgYWxsIGluZm9ybWF0aW9uIHN5c2NvbmZpZyBkZXRhaW5zLiIiIgogICAgcHJpbnQoJ1BsYXRmb3JtOiAiJXMiJyAlIGdldF9wbGF0Zm9ybSgpKQogICAgcHJpbnQoJ1B5dGhvbiB2ZXJzaW9uOiAiJXMiJyAlIGdldF9weXRob25fdmVyc2lvbigpKQogICAgcHJpbnQoJ0N1cnJlbnQgaW5zdGFsbGF0aW9uIHNjaGVtZTogIiVzIicgJSBfZ2V0X2RlZmF1bHRfc2NoZW1lKCkpCiAgICBwcmludCgpCiAgICBfcHJpbnRfZGljdCgnUGF0aHMnLCBnZXRfcGF0aHMoKSkKICAgIHByaW50KCkKICAgIF9wcmludF9kaWN0KCdWYXJpYWJsZXMnLCBnZXRfY29uZmlnX3ZhcnMoKSkKCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgX21haW4oKQpQSwMEFAAAAAAAAAAhAERCH0PUaQEA1GkBADgAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi9fYmFja3BvcnQvdGFyZmlsZS5weSMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgdGFyZmlsZS5weQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIENvcHlyaWdodCAoQykgMjAwMiBMYXJzIEd1c3RhZWJlbCA8bGFyc0BndXN0YWViZWwuZGU+CiMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KIwojIFBlcm1pc3Npb24gIGlzICBoZXJlYnkgZ3JhbnRlZCwgIGZyZWUgIG9mIGNoYXJnZSwgIHRvICBhbnkgcGVyc29uCiMgb2J0YWluaW5nIGEgIGNvcHkgb2YgIHRoaXMgc29mdHdhcmUgIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KIyBmaWxlcyAgKHRoZSAgIlNvZnR3YXJlIiksICB0byAgIGRlYWwgIGluICB0aGUgIFNvZnR3YXJlICAgd2l0aG91dAojIHJlc3RyaWN0aW9uLCAgaW5jbHVkaW5nICB3aXRob3V0IGxpbWl0YXRpb24gIHRoZSAgcmlnaHRzIHRvICB1c2UsCiMgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKIyBjb3BpZXMgIG9mICB0aGUgIFNvZnR3YXJlLCAgYW5kIHRvICBwZXJtaXQgIHBlcnNvbnMgIHRvICB3aG9tIHRoZQojIFNvZnR3YXJlICBpcyAgZnVybmlzaGVkICB0byAgZG8gIHNvLCAgc3ViamVjdCAgdG8gIHRoZSAgZm9sbG93aW5nCiMgY29uZGl0aW9uczoKIwojIFRoZSBhYm92ZSBjb3B5cmlnaHQgIG5vdGljZSBhbmQgdGhpcyAgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgIGJlCiMgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCiMKIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTICBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZICBLSU5ELAojIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HICBCVVQgTk9UIExJTUlURUQgVE8gIFRIRSBXQVJSQU5USUVTCiMgT0YgIE1FUkNIQU5UQUJJTElUWSwgIEZJVE5FU1MgICBGT1IgIEEgIFBBUlRJQ1VMQVIgICBQVVJQT1NFICBBTkQKIyBOT05JTkZSSU5HRU1FTlQuICBJTiAgTk8gIEVWRU5UIFNIQUxMICBUSEUgIEFVVEhPUlMgIE9SIENPUFlSSUdIVAojIEhPTERFUlMgIEJFIExJQUJMRSAgRk9SIEFOWSAgQ0xBSU0sIERBTUFHRVMgIE9SIE9USEVSICBMSUFCSUxJVFksCiMgV0hFVEhFUiAgSU4gQU4gIEFDVElPTiBPRiAgQ09OVFJBQ1QsIFRPUlQgIE9SIE9USEVSV0lTRSwgIEFSSVNJTkcKIyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCiMgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgojCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KCiIiIlJlYWQgZnJvbSBhbmQgd3JpdGUgdG8gdGFyIGZvcm1hdCBhcmNoaXZlcy4KIiIiCgpfX3ZlcnNpb25fXyA9ICIkUmV2aXNpb24kIgoKdmVyc2lvbiAgICAgPSAiMC45LjAiCl9fYXV0aG9yX18gID0gIkxhcnMgR3VzdFx1MDBlNGJlbCAobGFyc0BndXN0YWViZWwuZGUpIgpfX2RhdGVfXyAgICA9ICIkRGF0ZTogMjAxMS0wMi0yNSAxNzo0MjowMSArMDIwMCAoRnJpLCAyNSBGZWIgMjAxMSkgJCIKX19jdnNpZF9fICAgPSAiJElkOiB0YXJmaWxlLnB5IDg4NTg2IDIwMTEtMDItMjUgMTU6NDI6MDFaIG1hcmMtYW5kcmUubGVtYnVyZyAkIgpfX2NyZWRpdHNfXyA9ICJHdXN0YXZvIE5pZW1leWVyLCBOaWVscyBHdXN0XHUwMGU0YmVsLCBSaWNoYXJkIFRvd25zZW5kLiIKCiMtLS0tLS0tLS0KIyBJbXBvcnRzCiMtLS0tLS0tLS0KaW1wb3J0IHN5cwppbXBvcnQgb3MKaW1wb3J0IHN0YXQKaW1wb3J0IGVycm5vCmltcG9ydCB0aW1lCmltcG9ydCBzdHJ1Y3QKaW1wb3J0IGNvcHkKaW1wb3J0IHJlCgp0cnk6CiAgICBpbXBvcnQgZ3JwLCBwd2QKZXhjZXB0IEltcG9ydEVycm9yOgogICAgZ3JwID0gcHdkID0gTm9uZQoKIyBvcy5zeW1saW5rIG9uIFdpbmRvd3MgcHJpb3IgdG8gNi4wIHJhaXNlcyBOb3RJbXBsZW1lbnRlZEVycm9yCnN5bWxpbmtfZXhjZXB0aW9uID0gKEF0dHJpYnV0ZUVycm9yLCBOb3RJbXBsZW1lbnRlZEVycm9yKQp0cnk6CiAgICAjIFdpbmRvd3NFcnJvciAoMTMxNCkgd2lsbCBiZSByYWlzZWQgaWYgdGhlIGNhbGxlciBkb2VzIG5vdCBob2xkIHRoZQogICAgIyBTZUNyZWF0ZVN5bWJvbGljTGlua1ByaXZpbGVnZSBwcml2aWxlZ2UKICAgIHN5bWxpbmtfZXhjZXB0aW9uICs9IChXaW5kb3dzRXJyb3IsKQpleGNlcHQgTmFtZUVycm9yOgogICAgcGFzcwoKIyBmcm9tIHRhcmZpbGUgaW1wb3J0ICoKX19hbGxfXyA9IFsiVGFyRmlsZSIsICJUYXJJbmZvIiwgImlzX3RhcmZpbGUiLCAiVGFyRXJyb3IiXQoKaWYgc3lzLnZlcnNpb25faW5mb1swXSA8IDM6CiAgICBpbXBvcnQgX19idWlsdGluX18gYXMgYnVpbHRpbnMKZWxzZToKICAgIGltcG9ydCBidWlsdGlucwoKX29wZW4gPSBidWlsdGlucy5vcGVuICAgIyBTaW5jZSAnb3BlbicgaXMgVGFyRmlsZS5vcGVuCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgdGFyIGNvbnN0YW50cwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCk5VTCA9IGIiXDAiICAgICAgICAgICAgICAgICAgICAgIyB0aGUgbnVsbCBjaGFyYWN0ZXIKQkxPQ0tTSVpFID0gNTEyICAgICAgICAgICAgICAgICAjIGxlbmd0aCBvZiBwcm9jZXNzaW5nIGJsb2NrcwpSRUNPUkRTSVpFID0gQkxPQ0tTSVpFICogMjAgICAgICMgbGVuZ3RoIG9mIHJlY29yZHMKR05VX01BR0lDID0gYiJ1c3RhciAgXDAiICAgICAgICAjIG1hZ2ljIGdudSB0YXIgc3RyaW5nClBPU0lYX01BR0lDID0gYiJ1c3Rhclx4MDAwMCIgICAgIyBtYWdpYyBwb3NpeCB0YXIgc3RyaW5nCgpMRU5HVEhfTkFNRSA9IDEwMCAgICAgICAgICAgICAgICMgbWF4aW11bSBsZW5ndGggb2YgYSBmaWxlbmFtZQpMRU5HVEhfTElOSyA9IDEwMCAgICAgICAgICAgICAgICMgbWF4aW11bSBsZW5ndGggb2YgYSBsaW5rbmFtZQpMRU5HVEhfUFJFRklYID0gMTU1ICAgICAgICAgICAgICMgbWF4aW11bSBsZW5ndGggb2YgdGhlIHByZWZpeCBmaWVsZAoKUkVHVFlQRSA9IGIiMCIgICAgICAgICAgICAgICAgICAjIHJlZ3VsYXIgZmlsZQpBUkVHVFlQRSA9IGIiXDAiICAgICAgICAgICAgICAgICMgcmVndWxhciBmaWxlCkxOS1RZUEUgPSBiIjEiICAgICAgICAgICAgICAgICAgIyBsaW5rIChpbnNpZGUgdGFyZmlsZSkKU1lNVFlQRSA9IGIiMiIgICAgICAgICAgICAgICAgICAjIHN5bWJvbGljIGxpbmsKQ0hSVFlQRSA9IGIiMyIgICAgICAgICAgICAgICAgICAjIGNoYXJhY3RlciBzcGVjaWFsIGRldmljZQpCTEtUWVBFID0gYiI0IiAgICAgICAgICAgICAgICAgICMgYmxvY2sgc3BlY2lhbCBkZXZpY2UKRElSVFlQRSA9IGIiNSIgICAgICAgICAgICAgICAgICAjIGRpcmVjdG9yeQpGSUZPVFlQRSA9IGIiNiIgICAgICAgICAgICAgICAgICMgZmlmbyBzcGVjaWFsIGRldmljZQpDT05UVFlQRSA9IGIiNyIgICAgICAgICAgICAgICAgICMgY29udGlndW91cyBmaWxlCgpHTlVUWVBFX0xPTkdOQU1FID0gYiJMIiAgICAgICAgICMgR05VIHRhciBsb25nbmFtZQpHTlVUWVBFX0xPTkdMSU5LID0gYiJLIiAgICAgICAgICMgR05VIHRhciBsb25nbGluawpHTlVUWVBFX1NQQVJTRSA9IGIiUyIgICAgICAgICAgICMgR05VIHRhciBzcGFyc2UgZmlsZQoKWEhEVFlQRSA9IGIieCIgICAgICAgICAgICAgICAgICAjIFBPU0lYLjEtMjAwMSBleHRlbmRlZCBoZWFkZXIKWEdMVFlQRSA9IGIiZyIgICAgICAgICAgICAgICAgICAjIFBPU0lYLjEtMjAwMSBnbG9iYWwgaGVhZGVyClNPTEFSSVNfWEhEVFlQRSA9IGIiWCIgICAgICAgICAgIyBTb2xhcmlzIGV4dGVuZGVkIGhlYWRlcgoKVVNUQVJfRk9STUFUID0gMCAgICAgICAgICAgICAgICAjIFBPU0lYLjEtMTk4OCAodXN0YXIpIGZvcm1hdApHTlVfRk9STUFUID0gMSAgICAgICAgICAgICAgICAgICMgR05VIHRhciBmb3JtYXQKUEFYX0ZPUk1BVCA9IDIgICAgICAgICAgICAgICAgICAjIFBPU0lYLjEtMjAwMSAocGF4KSBmb3JtYXQKREVGQVVMVF9GT1JNQVQgPSBHTlVfRk9STUFUCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgdGFyZmlsZSBjb25zdGFudHMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIEZpbGUgdHlwZXMgdGhhdCB0YXJmaWxlIHN1cHBvcnRzOgpTVVBQT1JURURfVFlQRVMgPSAoUkVHVFlQRSwgQVJFR1RZUEUsIExOS1RZUEUsCiAgICAgICAgICAgICAgICAgICBTWU1UWVBFLCBESVJUWVBFLCBGSUZPVFlQRSwKICAgICAgICAgICAgICAgICAgIENPTlRUWVBFLCBDSFJUWVBFLCBCTEtUWVBFLAogICAgICAgICAgICAgICAgICAgR05VVFlQRV9MT05HTkFNRSwgR05VVFlQRV9MT05HTElOSywKICAgICAgICAgICAgICAgICAgIEdOVVRZUEVfU1BBUlNFKQoKIyBGaWxlIHR5cGVzIHRoYXQgd2lsbCBiZSB0cmVhdGVkIGFzIGEgcmVndWxhciBmaWxlLgpSRUdVTEFSX1RZUEVTID0gKFJFR1RZUEUsIEFSRUdUWVBFLAogICAgICAgICAgICAgICAgIENPTlRUWVBFLCBHTlVUWVBFX1NQQVJTRSkKCiMgRmlsZSB0eXBlcyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSBHTlUgdGFyIGZvcm1hdC4KR05VX1RZUEVTID0gKEdOVVRZUEVfTE9OR05BTUUsIEdOVVRZUEVfTE9OR0xJTkssCiAgICAgICAgICAgICBHTlVUWVBFX1NQQVJTRSkKCiMgRmllbGRzIGZyb20gYSBwYXggaGVhZGVyIHRoYXQgb3ZlcnJpZGUgYSBUYXJJbmZvIGF0dHJpYnV0ZS4KUEFYX0ZJRUxEUyA9ICgicGF0aCIsICJsaW5rcGF0aCIsICJzaXplIiwgIm10aW1lIiwKICAgICAgICAgICAgICAidWlkIiwgImdpZCIsICJ1bmFtZSIsICJnbmFtZSIpCgojIEZpZWxkcyBmcm9tIGEgcGF4IGhlYWRlciB0aGF0IGFyZSBhZmZlY3RlZCBieSBoZHJjaGFyc2V0LgpQQVhfTkFNRV9GSUVMRFMgPSBzZXQoKCJwYXRoIiwgImxpbmtwYXRoIiwgInVuYW1lIiwgImduYW1lIikpCgojIEZpZWxkcyBpbiBhIHBheCBoZWFkZXIgdGhhdCBhcmUgbnVtYmVycywgYWxsIG90aGVyIGZpZWxkcwojIGFyZSB0cmVhdGVkIGFzIHN0cmluZ3MuClBBWF9OVU1CRVJfRklFTERTID0gewogICAgImF0aW1lIjogZmxvYXQsCiAgICAiY3RpbWUiOiBmbG9hdCwKICAgICJtdGltZSI6IGZsb2F0LAogICAgInVpZCI6IGludCwKICAgICJnaWQiOiBpbnQsCiAgICAic2l6ZSI6IGludAp9CgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQml0cyB1c2VkIGluIHRoZSBtb2RlIGZpZWxkLCB2YWx1ZXMgaW4gb2N0YWwuCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KU19JRkxOSyA9IDBvMTIwMDAwICAgICAgICAjIHN5bWJvbGljIGxpbmsKU19JRlJFRyA9IDBvMTAwMDAwICAgICAgICAjIHJlZ3VsYXIgZmlsZQpTX0lGQkxLID0gMG8wNjAwMDAgICAgICAgICMgYmxvY2sgZGV2aWNlClNfSUZESVIgPSAwbzA0MDAwMCAgICAgICAgIyBkaXJlY3RvcnkKU19JRkNIUiA9IDBvMDIwMDAwICAgICAgICAjIGNoYXJhY3RlciBkZXZpY2UKU19JRklGTyA9IDBvMDEwMDAwICAgICAgICAjIGZpZm8KClRTVUlEICAgPSAwbzQwMDAgICAgICAgICAgIyBzZXQgVUlEIG9uIGV4ZWN1dGlvbgpUU0dJRCAgID0gMG8yMDAwICAgICAgICAgICMgc2V0IEdJRCBvbiBleGVjdXRpb24KVFNWVFggICA9IDBvMTAwMCAgICAgICAgICAjIHJlc2VydmVkCgpUVVJFQUQgID0gMG80MDAgICAgICAgICAgICMgcmVhZCBieSBvd25lcgpUVVdSSVRFID0gMG8yMDAgICAgICAgICAgICMgd3JpdGUgYnkgb3duZXIKVFVFWEVDICA9IDBvMTAwICAgICAgICAgICAjIGV4ZWN1dGUvc2VhcmNoIGJ5IG93bmVyClRHUkVBRCAgPSAwbzA0MCAgICAgICAgICAgIyByZWFkIGJ5IGdyb3VwClRHV1JJVEUgPSAwbzAyMCAgICAgICAgICAgIyB3cml0ZSBieSBncm91cApUR0VYRUMgID0gMG8wMTAgICAgICAgICAgICMgZXhlY3V0ZS9zZWFyY2ggYnkgZ3JvdXAKVE9SRUFEICA9IDBvMDA0ICAgICAgICAgICAjIHJlYWQgYnkgb3RoZXIKVE9XUklURSA9IDBvMDAyICAgICAgICAgICAjIHdyaXRlIGJ5IG90aGVyClRPRVhFQyAgPSAwbzAwMSAgICAgICAgICAgIyBleGVjdXRlL3NlYXJjaCBieSBvdGhlcgoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIGluaXRpYWxpemF0aW9uCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaWYgb3MubmFtZSBpbiAoIm50IiwgImNlIik6CiAgICBFTkNPRElORyA9ICJ1dGYtOCIKZWxzZToKICAgIEVOQ09ESU5HID0gc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgU29tZSB1c2VmdWwgZnVuY3Rpb25zCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmRlZiBzdG4ocywgbGVuZ3RoLCBlbmNvZGluZywgZXJyb3JzKToKICAgICIiIkNvbnZlcnQgYSBzdHJpbmcgdG8gYSBudWxsLXRlcm1pbmF0ZWQgYnl0ZXMgb2JqZWN0LgogICAgIiIiCiAgICBzID0gcy5lbmNvZGUoZW5jb2RpbmcsIGVycm9ycykKICAgIHJldHVybiBzWzpsZW5ndGhdICsgKGxlbmd0aCAtIGxlbihzKSkgKiBOVUwKCmRlZiBudHMocywgZW5jb2RpbmcsIGVycm9ycyk6CiAgICAiIiJDb252ZXJ0IGEgbnVsbC10ZXJtaW5hdGVkIGJ5dGVzIG9iamVjdCB0byBhIHN0cmluZy4KICAgICIiIgogICAgcCA9IHMuZmluZChiIlwwIikKICAgIGlmIHAgIT0gLTE6CiAgICAgICAgcyA9IHNbOnBdCiAgICByZXR1cm4gcy5kZWNvZGUoZW5jb2RpbmcsIGVycm9ycykKCmRlZiBudGkocyk6CiAgICAiIiJDb252ZXJ0IGEgbnVtYmVyIGZpZWxkIHRvIGEgcHl0aG9uIG51bWJlci4KICAgICIiIgogICAgIyBUaGVyZSBhcmUgdHdvIHBvc3NpYmxlIGVuY29kaW5ncyBmb3IgYSBudW1iZXIgZmllbGQsIHNlZQogICAgIyBpdG4oKSBiZWxvdy4KICAgIGlmIHNbMF0gIT0gY2hyKDBvMjAwKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIG4gPSBpbnQobnRzKHMsICJhc2NpaSIsICJzdHJpY3QiKSBvciAiMCIsIDgpCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIHJhaXNlIEludmFsaWRIZWFkZXJFcnJvcigiaW52YWxpZCBoZWFkZXIiKQogICAgZWxzZToKICAgICAgICBuID0gMAogICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzKSAtIDEpOgogICAgICAgICAgICBuIDw8PSA4CiAgICAgICAgICAgIG4gKz0gb3JkKHNbaSArIDFdKQogICAgcmV0dXJuIG4KCmRlZiBpdG4obiwgZGlnaXRzPTgsIGZvcm1hdD1ERUZBVUxUX0ZPUk1BVCk6CiAgICAiIiJDb252ZXJ0IGEgcHl0aG9uIG51bWJlciB0byBhIG51bWJlciBmaWVsZC4KICAgICIiIgogICAgIyBQT1NJWCAxMDAzLjEtMTk4OCByZXF1aXJlcyBudW1iZXJzIHRvIGJlIGVuY29kZWQgYXMgYSBzdHJpbmcgb2YKICAgICMgb2N0YWwgZGlnaXRzIGZvbGxvd2VkIGJ5IGEgbnVsbC1ieXRlLCB0aGlzIGFsbG93cyB2YWx1ZXMgdXAgdG8KICAgICMgKDgqKihkaWdpdHMtMSkpLTEuIEdOVSB0YXIgYWxsb3dzIHN0b3JpbmcgbnVtYmVycyBncmVhdGVyIHRoYW4KICAgICMgdGhhdCBpZiBuZWNlc3NhcnkuIEEgbGVhZGluZyAwbzIwMCBieXRlIGluZGljYXRlcyB0aGlzIHBhcnRpY3VsYXIKICAgICMgZW5jb2RpbmcsIHRoZSBmb2xsb3dpbmcgZGlnaXRzLTEgYnl0ZXMgYXJlIGEgYmlnLWVuZGlhbgogICAgIyByZXByZXNlbnRhdGlvbi4gVGhpcyBhbGxvd3MgdmFsdWVzIHVwIHRvICgyNTYqKihkaWdpdHMtMSkpLTEuCiAgICBpZiAwIDw9IG4gPCA4ICoqIChkaWdpdHMgLSAxKToKICAgICAgICBzID0gKCIlMCpvIiAlIChkaWdpdHMgLSAxLCBuKSkuZW5jb2RlKCJhc2NpaSIpICsgTlVMCiAgICBlbHNlOgogICAgICAgIGlmIGZvcm1hdCAhPSBHTlVfRk9STUFUIG9yIG4gPj0gMjU2ICoqIChkaWdpdHMgLSAxKToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigib3ZlcmZsb3cgaW4gbnVtYmVyIGZpZWxkIikKCiAgICAgICAgaWYgbiA8IDA6CiAgICAgICAgICAgICMgWFhYIFdlIG1pbWljIEdOVSB0YXIncyBiZWhhdmlvdXIgd2l0aCBuZWdhdGl2ZSBudW1iZXJzLAogICAgICAgICAgICAjIHRoaXMgY291bGQgcmFpc2UgT3ZlcmZsb3dFcnJvci4KICAgICAgICAgICAgbiA9IHN0cnVjdC51bnBhY2soIkwiLCBzdHJ1Y3QucGFjaygibCIsIG4pKVswXQoKICAgICAgICBzID0gYnl0ZWFycmF5KCkKICAgICAgICBmb3IgaSBpbiByYW5nZShkaWdpdHMgLSAxKToKICAgICAgICAgICAgcy5pbnNlcnQoMCwgbiAmIDBvMzc3KQogICAgICAgICAgICBuID4+PSA4CiAgICAgICAgcy5pbnNlcnQoMCwgMG8yMDApCiAgICByZXR1cm4gcwoKZGVmIGNhbGNfY2hrc3VtcyhidWYpOgogICAgIiIiQ2FsY3VsYXRlIHRoZSBjaGVja3N1bSBmb3IgYSBtZW1iZXIncyBoZWFkZXIgYnkgc3VtbWluZyB1cCBhbGwKICAgICAgIGNoYXJhY3RlcnMgZXhjZXB0IGZvciB0aGUgY2hrc3VtIGZpZWxkIHdoaWNoIGlzIHRyZWF0ZWQgYXMgaWYKICAgICAgIGl0IHdhcyBmaWxsZWQgd2l0aCBzcGFjZXMuIEFjY29yZGluZyB0byB0aGUgR05VIHRhciBzb3VyY2VzLAogICAgICAgc29tZSB0YXJzIChTdW4gYW5kIE5lWFQpIGNhbGN1bGF0ZSBjaGtzdW0gd2l0aCBzaWduZWQgY2hhciwKICAgICAgIHdoaWNoIHdpbGwgYmUgZGlmZmVyZW50IGlmIHRoZXJlIGFyZSBjaGFycyBpbiB0aGUgYnVmZmVyIHdpdGgKICAgICAgIHRoZSBoaWdoIGJpdCBzZXQuIFNvIHdlIGNhbGN1bGF0ZSB0d28gY2hlY2tzdW1zLCB1bnNpZ25lZCBhbmQKICAgICAgIHNpZ25lZC4KICAgICIiIgogICAgdW5zaWduZWRfY2hrc3VtID0gMjU2ICsgc3VtKHN0cnVjdC51bnBhY2soIjE0OEIiLCBidWZbOjE0OF0pICsgc3RydWN0LnVucGFjaygiMzU2QiIsIGJ1ZlsxNTY6NTEyXSkpCiAgICBzaWduZWRfY2hrc3VtID0gMjU2ICsgc3VtKHN0cnVjdC51bnBhY2soIjE0OGIiLCBidWZbOjE0OF0pICsgc3RydWN0LnVucGFjaygiMzU2YiIsIGJ1ZlsxNTY6NTEyXSkpCiAgICByZXR1cm4gdW5zaWduZWRfY2hrc3VtLCBzaWduZWRfY2hrc3VtCgpkZWYgY29weWZpbGVvYmooc3JjLCBkc3QsIGxlbmd0aD1Ob25lKToKICAgICIiIkNvcHkgbGVuZ3RoIGJ5dGVzIGZyb20gZmlsZW9iaiBzcmMgdG8gZmlsZW9iaiBkc3QuCiAgICAgICBJZiBsZW5ndGggaXMgTm9uZSwgY29weSB0aGUgZW50aXJlIGNvbnRlbnQuCiAgICAiIiIKICAgIGlmIGxlbmd0aCA9PSAwOgogICAgICAgIHJldHVybgogICAgaWYgbGVuZ3RoIGlzIE5vbmU6CiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgYnVmID0gc3JjLnJlYWQoMTYqMTAyNCkKICAgICAgICAgICAgaWYgbm90IGJ1ZjoKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGRzdC53cml0ZShidWYpCiAgICAgICAgcmV0dXJuCgogICAgQlVGU0laRSA9IDE2ICogMTAyNAogICAgYmxvY2tzLCByZW1haW5kZXIgPSBkaXZtb2QobGVuZ3RoLCBCVUZTSVpFKQogICAgZm9yIGIgaW4gcmFuZ2UoYmxvY2tzKToKICAgICAgICBidWYgPSBzcmMucmVhZChCVUZTSVpFKQogICAgICAgIGlmIGxlbihidWYpIDwgQlVGU0laRToKICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigiZW5kIG9mIGZpbGUgcmVhY2hlZCIpCiAgICAgICAgZHN0LndyaXRlKGJ1ZikKCiAgICBpZiByZW1haW5kZXIgIT0gMDoKICAgICAgICBidWYgPSBzcmMucmVhZChyZW1haW5kZXIpCiAgICAgICAgaWYgbGVuKGJ1ZikgPCByZW1haW5kZXI6CiAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoImVuZCBvZiBmaWxlIHJlYWNoZWQiKQogICAgICAgIGRzdC53cml0ZShidWYpCiAgICByZXR1cm4KCmZpbGVtb2RlX3RhYmxlID0gKAogICAgKChTX0lGTE5LLCAgICAgICJsIiksCiAgICAgKFNfSUZSRUcsICAgICAgIi0iKSwKICAgICAoU19JRkJMSywgICAgICAiYiIpLAogICAgIChTX0lGRElSLCAgICAgICJkIiksCiAgICAgKFNfSUZDSFIsICAgICAgImMiKSwKICAgICAoU19JRklGTywgICAgICAicCIpKSwKCiAgICAoKFRVUkVBRCwgICAgICAgInIiKSwpLAogICAgKChUVVdSSVRFLCAgICAgICJ3IiksKSwKICAgICgoVFVFWEVDfFRTVUlELCAicyIpLAogICAgIChUU1VJRCwgICAgICAgICJTIiksCiAgICAgKFRVRVhFQywgICAgICAgIngiKSksCgogICAgKChUR1JFQUQsICAgICAgICJyIiksKSwKICAgICgoVEdXUklURSwgICAgICAidyIpLCksCiAgICAoKFRHRVhFQ3xUU0dJRCwgInMiKSwKICAgICAoVFNHSUQsICAgICAgICAiUyIpLAogICAgIChUR0VYRUMsICAgICAgICJ4IikpLAoKICAgICgoVE9SRUFELCAgICAgICAiciIpLCksCiAgICAoKFRPV1JJVEUsICAgICAgInciKSwpLAogICAgKChUT0VYRUN8VFNWVFgsICJ0IiksCiAgICAgKFRTVlRYLCAgICAgICAgIlQiKSwKICAgICAoVE9FWEVDLCAgICAgICAieCIpKQopCgpkZWYgZmlsZW1vZGUobW9kZSk6CiAgICAiIiJDb252ZXJ0IGEgZmlsZSdzIG1vZGUgdG8gYSBzdHJpbmcgb2YgdGhlIGZvcm0KICAgICAgIC1yd3hyd3hyd3guCiAgICAgICBVc2VkIGJ5IFRhckZpbGUubGlzdCgpCiAgICAiIiIKICAgIHBlcm0gPSBbXQogICAgZm9yIHRhYmxlIGluIGZpbGVtb2RlX3RhYmxlOgogICAgICAgIGZvciBiaXQsIGNoYXIgaW4gdGFibGU6CiAgICAgICAgICAgIGlmIG1vZGUgJiBiaXQgPT0gYml0OgogICAgICAgICAgICAgICAgcGVybS5hcHBlbmQoY2hhcikKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcGVybS5hcHBlbmQoIi0iKQogICAgcmV0dXJuICIiLmpvaW4ocGVybSkKCmNsYXNzIFRhckVycm9yKEV4Y2VwdGlvbik6CiAgICAiIiJCYXNlIGV4Y2VwdGlvbi4iIiIKICAgIHBhc3MKY2xhc3MgRXh0cmFjdEVycm9yKFRhckVycm9yKToKICAgICIiIkdlbmVyYWwgZXhjZXB0aW9uIGZvciBleHRyYWN0IGVycm9ycy4iIiIKICAgIHBhc3MKY2xhc3MgUmVhZEVycm9yKFRhckVycm9yKToKICAgICIiIkV4Y2VwdGlvbiBmb3IgdW5yZWFkYWJsZSB0YXIgYXJjaGl2ZXMuIiIiCiAgICBwYXNzCmNsYXNzIENvbXByZXNzaW9uRXJyb3IoVGFyRXJyb3IpOgogICAgIiIiRXhjZXB0aW9uIGZvciB1bmF2YWlsYWJsZSBjb21wcmVzc2lvbiBtZXRob2RzLiIiIgogICAgcGFzcwpjbGFzcyBTdHJlYW1FcnJvcihUYXJFcnJvcik6CiAgICAiIiJFeGNlcHRpb24gZm9yIHVuc3VwcG9ydGVkIG9wZXJhdGlvbnMgb24gc3RyZWFtLWxpa2UgVGFyRmlsZXMuIiIiCiAgICBwYXNzCmNsYXNzIEhlYWRlckVycm9yKFRhckVycm9yKToKICAgICIiIkJhc2UgZXhjZXB0aW9uIGZvciBoZWFkZXIgZXJyb3JzLiIiIgogICAgcGFzcwpjbGFzcyBFbXB0eUhlYWRlckVycm9yKEhlYWRlckVycm9yKToKICAgICIiIkV4Y2VwdGlvbiBmb3IgZW1wdHkgaGVhZGVycy4iIiIKICAgIHBhc3MKY2xhc3MgVHJ1bmNhdGVkSGVhZGVyRXJyb3IoSGVhZGVyRXJyb3IpOgogICAgIiIiRXhjZXB0aW9uIGZvciB0cnVuY2F0ZWQgaGVhZGVycy4iIiIKICAgIHBhc3MKY2xhc3MgRU9GSGVhZGVyRXJyb3IoSGVhZGVyRXJyb3IpOgogICAgIiIiRXhjZXB0aW9uIGZvciBlbmQgb2YgZmlsZSBoZWFkZXJzLiIiIgogICAgcGFzcwpjbGFzcyBJbnZhbGlkSGVhZGVyRXJyb3IoSGVhZGVyRXJyb3IpOgogICAgIiIiRXhjZXB0aW9uIGZvciBpbnZhbGlkIGhlYWRlcnMuIiIiCiAgICBwYXNzCmNsYXNzIFN1YnNlcXVlbnRIZWFkZXJFcnJvcihIZWFkZXJFcnJvcik6CiAgICAiIiJFeGNlcHRpb24gZm9yIG1pc3NpbmcgYW5kIGludmFsaWQgZXh0ZW5kZWQgaGVhZGVycy4iIiIKICAgIHBhc3MKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBpbnRlcm5hbCBzdHJlYW0gaW50ZXJmYWNlCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KY2xhc3MgX0xvd0xldmVsRmlsZShvYmplY3QpOgogICAgIiIiTG93LWxldmVsIGZpbGUgb2JqZWN0LiBTdXBwb3J0cyByZWFkaW5nIGFuZCB3cml0aW5nLgogICAgICAgSXQgaXMgdXNlZCBpbnN0ZWFkIG9mIGEgcmVndWxhciBmaWxlIG9iamVjdCBmb3Igc3RyZWFtaW5nCiAgICAgICBhY2Nlc3MuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgbW9kZSk6CiAgICAgICAgbW9kZSA9IHsKICAgICAgICAgICAgInIiOiBvcy5PX1JET05MWSwKICAgICAgICAgICAgInciOiBvcy5PX1dST05MWSB8IG9zLk9fQ1JFQVQgfCBvcy5PX1RSVU5DLAogICAgICAgIH1bbW9kZV0KICAgICAgICBpZiBoYXNhdHRyKG9zLCAiT19CSU5BUlkiKToKICAgICAgICAgICAgbW9kZSB8PSBvcy5PX0JJTkFSWQogICAgICAgIHNlbGYuZmQgPSBvcy5vcGVuKG5hbWUsIG1vZGUsIDBvNjY2KQoKICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICBvcy5jbG9zZShzZWxmLmZkKQoKICAgIGRlZiByZWFkKHNlbGYsIHNpemUpOgogICAgICAgIHJldHVybiBvcy5yZWFkKHNlbGYuZmQsIHNpemUpCgogICAgZGVmIHdyaXRlKHNlbGYsIHMpOgogICAgICAgIG9zLndyaXRlKHNlbGYuZmQsIHMpCgpjbGFzcyBfU3RyZWFtKG9iamVjdCk6CiAgICAiIiJDbGFzcyB0aGF0IHNlcnZlcyBhcyBhbiBhZGFwdGVyIGJldHdlZW4gVGFyRmlsZSBhbmQKICAgICAgIGEgc3RyZWFtLWxpa2Ugb2JqZWN0LiAgVGhlIHN0cmVhbS1saWtlIG9iamVjdCBvbmx5CiAgICAgICBuZWVkcyB0byBoYXZlIGEgcmVhZCgpIG9yIHdyaXRlKCkgbWV0aG9kIGFuZCBpcyBhY2Nlc3NlZAogICAgICAgYmxvY2t3aXNlLiAgVXNlIG9mIGd6aXAgb3IgYnppcDIgY29tcHJlc3Npb24gaXMgcG9zc2libGUuCiAgICAgICBBIHN0cmVhbS1saWtlIG9iamVjdCBjb3VsZCBiZSBmb3IgZXhhbXBsZTogc3lzLnN0ZGluLAogICAgICAgc3lzLnN0ZG91dCwgYSBzb2NrZXQsIGEgdGFwZSBkZXZpY2UgZXRjLgoKICAgICAgIF9TdHJlYW0gaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbmx5IGludGVybmFsbHkuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgbW9kZSwgY29tcHR5cGUsIGZpbGVvYmosIGJ1ZnNpemUpOgogICAgICAgICIiIkNvbnN0cnVjdCBhIF9TdHJlYW0gb2JqZWN0LgogICAgICAgICIiIgogICAgICAgIHNlbGYuX2V4dGZpbGVvYmogPSBUcnVlCiAgICAgICAgaWYgZmlsZW9iaiBpcyBOb25lOgogICAgICAgICAgICBmaWxlb2JqID0gX0xvd0xldmVsRmlsZShuYW1lLCBtb2RlKQogICAgICAgICAgICBzZWxmLl9leHRmaWxlb2JqID0gRmFsc2UKCiAgICAgICAgaWYgY29tcHR5cGUgPT0gJyonOgogICAgICAgICAgICAjIEVuYWJsZSB0cmFuc3BhcmVudCBjb21wcmVzc2lvbiBkZXRlY3Rpb24gZm9yIHRoZQogICAgICAgICAgICAjIHN0cmVhbSBpbnRlcmZhY2UKICAgICAgICAgICAgZmlsZW9iaiA9IF9TdHJlYW1Qcm94eShmaWxlb2JqKQogICAgICAgICAgICBjb21wdHlwZSA9IGZpbGVvYmouZ2V0Y29tcHR5cGUoKQoKICAgICAgICBzZWxmLm5hbWUgICAgID0gbmFtZSBvciAiIgogICAgICAgIHNlbGYubW9kZSAgICAgPSBtb2RlCiAgICAgICAgc2VsZi5jb21wdHlwZSA9IGNvbXB0eXBlCiAgICAgICAgc2VsZi5maWxlb2JqICA9IGZpbGVvYmoKICAgICAgICBzZWxmLmJ1ZnNpemUgID0gYnVmc2l6ZQogICAgICAgIHNlbGYuYnVmICAgICAgPSBiIiIKICAgICAgICBzZWxmLnBvcyAgICAgID0gMAogICAgICAgIHNlbGYuY2xvc2VkICAgPSBGYWxzZQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGlmIGNvbXB0eXBlID09ICJneiI6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgaW1wb3J0IHpsaWIKICAgICAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgICAgICAgICAgICByYWlzZSBDb21wcmVzc2lvbkVycm9yKCJ6bGliIG1vZHVsZSBpcyBub3QgYXZhaWxhYmxlIikKICAgICAgICAgICAgICAgIHNlbGYuemxpYiA9IHpsaWIKICAgICAgICAgICAgICAgIHNlbGYuY3JjID0gemxpYi5jcmMzMihiIiIpCiAgICAgICAgICAgICAgICBpZiBtb2RlID09ICJyIjoKICAgICAgICAgICAgICAgICAgICBzZWxmLl9pbml0X3JlYWRfZ3ooKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBzZWxmLl9pbml0X3dyaXRlX2d6KCkKCiAgICAgICAgICAgIGlmIGNvbXB0eXBlID09ICJiejIiOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGltcG9ydCBiejIKICAgICAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgICAgICAgICAgICByYWlzZSBDb21wcmVzc2lvbkVycm9yKCJiejIgbW9kdWxlIGlzIG5vdCBhdmFpbGFibGUiKQogICAgICAgICAgICAgICAgaWYgbW9kZSA9PSAiciI6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5kYnVmID0gYiIiCiAgICAgICAgICAgICAgICAgICAgc2VsZi5jbXAgPSBiejIuQloyRGVjb21wcmVzc29yKCkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5jbXAgPSBiejIuQloyQ29tcHJlc3NvcigpCiAgICAgICAgZXhjZXB0OgogICAgICAgICAgICBpZiBub3Qgc2VsZi5fZXh0ZmlsZW9iajoKICAgICAgICAgICAgICAgIHNlbGYuZmlsZW9iai5jbG9zZSgpCiAgICAgICAgICAgIHNlbGYuY2xvc2VkID0gVHJ1ZQogICAgICAgICAgICByYWlzZQoKICAgIGRlZiBfX2RlbF9fKHNlbGYpOgogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwgImNsb3NlZCIpIGFuZCBub3Qgc2VsZi5jbG9zZWQ6CiAgICAgICAgICAgIHNlbGYuY2xvc2UoKQoKICAgIGRlZiBfaW5pdF93cml0ZV9neihzZWxmKToKICAgICAgICAiIiJJbml0aWFsaXplIGZvciB3cml0aW5nIHdpdGggZ3ppcCBjb21wcmVzc2lvbi4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmNtcCA9IHNlbGYuemxpYi5jb21wcmVzc29iaig5LCBzZWxmLnpsaWIuREVGTEFURUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXNlbGYuemxpYi5NQVhfV0JJVFMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi56bGliLkRFRl9NRU1fTEVWRUwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCkKICAgICAgICB0aW1lc3RhbXAgPSBzdHJ1Y3QucGFjaygiPEwiLCBpbnQodGltZS50aW1lKCkpKQogICAgICAgIHNlbGYuX193cml0ZShiIlwwMzdcMjEzXDAxMFwwMTAiICsgdGltZXN0YW1wICsgYiJcMDAyXDM3NyIpCiAgICAgICAgaWYgc2VsZi5uYW1lLmVuZHN3aXRoKCIuZ3oiKToKICAgICAgICAgICAgc2VsZi5uYW1lID0gc2VsZi5uYW1lWzotM10KICAgICAgICAjIFJGQzE5NTIgc2F5cyB3ZSBtdXN0IHVzZSBJU08tODg1OS0xIGZvciB0aGUgRk5BTUUgZmllbGQuCiAgICAgICAgc2VsZi5fX3dyaXRlKHNlbGYubmFtZS5lbmNvZGUoImlzby04ODU5LTEiLCAicmVwbGFjZSIpICsgTlVMKQoKICAgIGRlZiB3cml0ZShzZWxmLCBzKToKICAgICAgICAiIiJXcml0ZSBzdHJpbmcgcyB0byB0aGUgc3RyZWFtLgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuY29tcHR5cGUgPT0gImd6IjoKICAgICAgICAgICAgc2VsZi5jcmMgPSBzZWxmLnpsaWIuY3JjMzIocywgc2VsZi5jcmMpCiAgICAgICAgc2VsZi5wb3MgKz0gbGVuKHMpCiAgICAgICAgaWYgc2VsZi5jb21wdHlwZSAhPSAidGFyIjoKICAgICAgICAgICAgcyA9IHNlbGYuY21wLmNvbXByZXNzKHMpCiAgICAgICAgc2VsZi5fX3dyaXRlKHMpCgogICAgZGVmIF9fd3JpdGUoc2VsZiwgcyk6CiAgICAgICAgIiIiV3JpdGUgc3RyaW5nIHMgdG8gdGhlIHN0cmVhbSBpZiBhIHdob2xlIG5ldyBibG9jawogICAgICAgICAgIGlzIHJlYWR5IHRvIGJlIHdyaXR0ZW4uCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5idWYgKz0gcwogICAgICAgIHdoaWxlIGxlbihzZWxmLmJ1ZikgPiBzZWxmLmJ1ZnNpemU6CiAgICAgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShzZWxmLmJ1Zls6c2VsZi5idWZzaXplXSkKICAgICAgICAgICAgc2VsZi5idWYgPSBzZWxmLmJ1ZltzZWxmLmJ1ZnNpemU6XQoKICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICAiIiJDbG9zZSB0aGUgX1N0cmVhbSBvYmplY3QuIE5vIG9wZXJhdGlvbiBzaG91bGQgYmUKICAgICAgICAgICBkb25lIG9uIGl0IGFmdGVyd2FyZHMuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBpZiBzZWxmLm1vZGUgPT0gInciIGFuZCBzZWxmLmNvbXB0eXBlICE9ICJ0YXIiOgogICAgICAgICAgICBzZWxmLmJ1ZiArPSBzZWxmLmNtcC5mbHVzaCgpCgogICAgICAgIGlmIHNlbGYubW9kZSA9PSAidyIgYW5kIHNlbGYuYnVmOgogICAgICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUoc2VsZi5idWYpCiAgICAgICAgICAgIHNlbGYuYnVmID0gYiIiCiAgICAgICAgICAgIGlmIHNlbGYuY29tcHR5cGUgPT0gImd6IjoKICAgICAgICAgICAgICAgICMgVGhlIG5hdGl2ZSB6bGliIGNyYyBpcyBhbiB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlciwgYnV0CiAgICAgICAgICAgICAgICAjIHRoZSBQeXRob24gd3JhcHBlciBpbXBsaWNpdGx5IGNhc3RzIHRoYXQgdG8gYSBzaWduZWQgQwogICAgICAgICAgICAgICAgIyBsb25nLiAgU28sIG9uIGEgMzItYml0IGJveCBzZWxmLmNyYyBtYXkgImxvb2sgbmVnYXRpdmUiLAogICAgICAgICAgICAgICAgIyB3aGlsZSB0aGUgc2FtZSBjcmMgb24gYSA2NC1iaXQgYm94IG1heSAibG9vayBwb3NpdGl2ZSIuCiAgICAgICAgICAgICAgICAjIFRvIGF2b2lkIGlya3NvbWUgd2FybmluZ3MgZnJvbSB0aGUgYHN0cnVjdGAgbW9kdWxlLCBmb3JjZQogICAgICAgICAgICAgICAgIyBpdCB0byBsb29rIHBvc2l0aXZlIG9uIGFsbCBib3hlcy4KICAgICAgICAgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShzdHJ1Y3QucGFjaygiPEwiLCBzZWxmLmNyYyAmIDB4ZmZmZmZmZmYpKQogICAgICAgICAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKHN0cnVjdC5wYWNrKCI8TCIsIHNlbGYucG9zICYgMHhmZmZmRkZGRikpCgogICAgICAgIGlmIG5vdCBzZWxmLl9leHRmaWxlb2JqOgogICAgICAgICAgICBzZWxmLmZpbGVvYmouY2xvc2UoKQoKICAgICAgICBzZWxmLmNsb3NlZCA9IFRydWUKCiAgICBkZWYgX2luaXRfcmVhZF9neihzZWxmKToKICAgICAgICAiIiJJbml0aWFsaXplIGZvciByZWFkaW5nIGEgZ3ppcCBjb21wcmVzc2VkIGZpbGVvYmouCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5jbXAgPSBzZWxmLnpsaWIuZGVjb21wcmVzc29iaigtc2VsZi56bGliLk1BWF9XQklUUykKICAgICAgICBzZWxmLmRidWYgPSBiIiIKCiAgICAgICAgIyB0YWtlbiBmcm9tIGd6aXAuR3ppcEZpbGUgd2l0aCBzb21lIGFsdGVyYXRpb25zCiAgICAgICAgaWYgc2VsZi5fX3JlYWQoMikgIT0gYiJcMDM3XDIxMyI6CiAgICAgICAgICAgIHJhaXNlIFJlYWRFcnJvcigibm90IGEgZ3ppcCBmaWxlIikKICAgICAgICBpZiBzZWxmLl9fcmVhZCgxKSAhPSBiIlwwMTAiOgogICAgICAgICAgICByYWlzZSBDb21wcmVzc2lvbkVycm9yKCJ1bnN1cHBvcnRlZCBjb21wcmVzc2lvbiBtZXRob2QiKQoKICAgICAgICBmbGFnID0gb3JkKHNlbGYuX19yZWFkKDEpKQogICAgICAgIHNlbGYuX19yZWFkKDYpCgogICAgICAgIGlmIGZsYWcgJiA0OgogICAgICAgICAgICB4bGVuID0gb3JkKHNlbGYuX19yZWFkKDEpKSArIDI1NiAqIG9yZChzZWxmLl9fcmVhZCgxKSkKICAgICAgICAgICAgc2VsZi5yZWFkKHhsZW4pCiAgICAgICAgaWYgZmxhZyAmIDg6CiAgICAgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICAgICBzID0gc2VsZi5fX3JlYWQoMSkKICAgICAgICAgICAgICAgIGlmIG5vdCBzIG9yIHMgPT0gTlVMOgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgaWYgZmxhZyAmIDE2OgogICAgICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAgICAgcyA9IHNlbGYuX19yZWFkKDEpCiAgICAgICAgICAgICAgICBpZiBub3QgcyBvciBzID09IE5VTDoKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGlmIGZsYWcgJiAyOgogICAgICAgICAgICBzZWxmLl9fcmVhZCgyKQoKICAgIGRlZiB0ZWxsKHNlbGYpOgogICAgICAgICIiIlJldHVybiB0aGUgc3RyZWFtJ3MgZmlsZSBwb2ludGVyIHBvc2l0aW9uLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLnBvcwoKICAgIGRlZiBzZWVrKHNlbGYsIHBvcz0wKToKICAgICAgICAiIiJTZXQgdGhlIHN0cmVhbSdzIGZpbGUgcG9pbnRlciB0byBwb3MuIE5lZ2F0aXZlIHNlZWtpbmcKICAgICAgICAgICBpcyBmb3JiaWRkZW4uCiAgICAgICAgIiIiCiAgICAgICAgaWYgcG9zIC0gc2VsZi5wb3MgPj0gMDoKICAgICAgICAgICAgYmxvY2tzLCByZW1haW5kZXIgPSBkaXZtb2QocG9zIC0gc2VsZi5wb3MsIHNlbGYuYnVmc2l6ZSkKICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoYmxvY2tzKToKICAgICAgICAgICAgICAgIHNlbGYucmVhZChzZWxmLmJ1ZnNpemUpCiAgICAgICAgICAgIHNlbGYucmVhZChyZW1haW5kZXIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgU3RyZWFtRXJyb3IoInNlZWtpbmcgYmFja3dhcmRzIGlzIG5vdCBhbGxvd2VkIikKICAgICAgICByZXR1cm4gc2VsZi5wb3MKCiAgICBkZWYgcmVhZChzZWxmLCBzaXplPU5vbmUpOgogICAgICAgICIiIlJldHVybiB0aGUgbmV4dCBzaXplIG51bWJlciBvZiBieXRlcyBmcm9tIHRoZSBzdHJlYW0uCiAgICAgICAgICAgSWYgc2l6ZSBpcyBub3QgZGVmaW5lZCwgcmV0dXJuIGFsbCBieXRlcyBvZiB0aGUgc3RyZWFtCiAgICAgICAgICAgdXAgdG8gRU9GLgogICAgICAgICIiIgogICAgICAgIGlmIHNpemUgaXMgTm9uZToKICAgICAgICAgICAgdCA9IFtdCiAgICAgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICAgICBidWYgPSBzZWxmLl9yZWFkKHNlbGYuYnVmc2l6ZSkKICAgICAgICAgICAgICAgIGlmIG5vdCBidWY6CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIHQuYXBwZW5kKGJ1ZikKICAgICAgICAgICAgYnVmID0gIiIuam9pbih0KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGJ1ZiA9IHNlbGYuX3JlYWQoc2l6ZSkKICAgICAgICBzZWxmLnBvcyArPSBsZW4oYnVmKQogICAgICAgIHJldHVybiBidWYKCiAgICBkZWYgX3JlYWQoc2VsZiwgc2l6ZSk6CiAgICAgICAgIiIiUmV0dXJuIHNpemUgYnl0ZXMgZnJvbSB0aGUgc3RyZWFtLgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuY29tcHR5cGUgPT0gInRhciI6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9fcmVhZChzaXplKQoKICAgICAgICBjID0gbGVuKHNlbGYuZGJ1ZikKICAgICAgICB3aGlsZSBjIDwgc2l6ZToKICAgICAgICAgICAgYnVmID0gc2VsZi5fX3JlYWQoc2VsZi5idWZzaXplKQogICAgICAgICAgICBpZiBub3QgYnVmOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgYnVmID0gc2VsZi5jbXAuZGVjb21wcmVzcyhidWYpCiAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgogICAgICAgICAgICAgICAgcmFpc2UgUmVhZEVycm9yKCJpbnZhbGlkIGNvbXByZXNzZWQgZGF0YSIpCiAgICAgICAgICAgIHNlbGYuZGJ1ZiArPSBidWYKICAgICAgICAgICAgYyArPSBsZW4oYnVmKQogICAgICAgIGJ1ZiA9IHNlbGYuZGJ1Zls6c2l6ZV0KICAgICAgICBzZWxmLmRidWYgPSBzZWxmLmRidWZbc2l6ZTpdCiAgICAgICAgcmV0dXJuIGJ1ZgoKICAgIGRlZiBfX3JlYWQoc2VsZiwgc2l6ZSk6CiAgICAgICAgIiIiUmV0dXJuIHNpemUgYnl0ZXMgZnJvbSBzdHJlYW0uIElmIGludGVybmFsIGJ1ZmZlciBpcyBlbXB0eSwKICAgICAgICAgICByZWFkIGFub3RoZXIgYmxvY2sgZnJvbSB0aGUgc3RyZWFtLgogICAgICAgICIiIgogICAgICAgIGMgPSBsZW4oc2VsZi5idWYpCiAgICAgICAgd2hpbGUgYyA8IHNpemU6CiAgICAgICAgICAgIGJ1ZiA9IHNlbGYuZmlsZW9iai5yZWFkKHNlbGYuYnVmc2l6ZSkKICAgICAgICAgICAgaWYgbm90IGJ1ZjoKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIHNlbGYuYnVmICs9IGJ1ZgogICAgICAgICAgICBjICs9IGxlbihidWYpCiAgICAgICAgYnVmID0gc2VsZi5idWZbOnNpemVdCiAgICAgICAgc2VsZi5idWYgPSBzZWxmLmJ1ZltzaXplOl0KICAgICAgICByZXR1cm4gYnVmCiMgY2xhc3MgX1N0cmVhbQoKY2xhc3MgX1N0cmVhbVByb3h5KG9iamVjdCk6CiAgICAiIiJTbWFsbCBwcm94eSBjbGFzcyB0aGF0IGVuYWJsZXMgdHJhbnNwYXJlbnQgY29tcHJlc3Npb24KICAgICAgIGRldGVjdGlvbiBmb3IgdGhlIFN0cmVhbSBpbnRlcmZhY2UgKG1vZGUgJ3J8KicpLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVvYmopOgogICAgICAgIHNlbGYuZmlsZW9iaiA9IGZpbGVvYmoKICAgICAgICBzZWxmLmJ1ZiA9IHNlbGYuZmlsZW9iai5yZWFkKEJMT0NLU0laRSkKCiAgICBkZWYgcmVhZChzZWxmLCBzaXplKToKICAgICAgICBzZWxmLnJlYWQgPSBzZWxmLmZpbGVvYmoucmVhZAogICAgICAgIHJldHVybiBzZWxmLmJ1ZgoKICAgIGRlZiBnZXRjb21wdHlwZShzZWxmKToKICAgICAgICBpZiBzZWxmLmJ1Zi5zdGFydHN3aXRoKGIiXDAzN1wyMTNcMDEwIik6CiAgICAgICAgICAgIHJldHVybiAiZ3oiCiAgICAgICAgaWYgc2VsZi5idWYuc3RhcnRzd2l0aChiIkJaaDkxIik6CiAgICAgICAgICAgIHJldHVybiAiYnoyIgogICAgICAgIHJldHVybiAidGFyIgoKICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICBzZWxmLmZpbGVvYmouY2xvc2UoKQojIGNsYXNzIFN0cmVhbVByb3h5CgpjbGFzcyBfQloyUHJveHkob2JqZWN0KToKICAgICIiIlNtYWxsIHByb3h5IGNsYXNzIHRoYXQgZW5hYmxlcyBleHRlcm5hbCBmaWxlIG9iamVjdAogICAgICAgc3VwcG9ydCBmb3IgInI6YnoyIiBhbmQgInc6YnoyIiBtb2Rlcy4gVGhpcyBpcyBhY3R1YWxseQogICAgICAgYSB3b3JrYXJvdW5kIGZvciBhIGxpbWl0YXRpb24gaW4gYnoyIG1vZHVsZSdzIEJaMkZpbGUKICAgICAgIGNsYXNzIHdoaWNoICh1bmxpa2UgZ3ppcC5HemlwRmlsZSkgaGFzIG5vIHN1cHBvcnQgZm9yCiAgICAgICBhIGZpbGUgb2JqZWN0IGFyZ3VtZW50LgogICAgIiIiCgogICAgYmxvY2tzaXplID0gMTYgKiAxMDI0CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVvYmosIG1vZGUpOgogICAgICAgIHNlbGYuZmlsZW9iaiA9IGZpbGVvYmoKICAgICAgICBzZWxmLm1vZGUgPSBtb2RlCiAgICAgICAgc2VsZi5uYW1lID0gZ2V0YXR0cihzZWxmLmZpbGVvYmosICJuYW1lIiwgTm9uZSkKICAgICAgICBzZWxmLmluaXQoKQoKICAgIGRlZiBpbml0KHNlbGYpOgogICAgICAgIGltcG9ydCBiejIKICAgICAgICBzZWxmLnBvcyA9IDAKICAgICAgICBpZiBzZWxmLm1vZGUgPT0gInIiOgogICAgICAgICAgICBzZWxmLmJ6Mm9iaiA9IGJ6Mi5CWjJEZWNvbXByZXNzb3IoKQogICAgICAgICAgICBzZWxmLmZpbGVvYmouc2VlaygwKQogICAgICAgICAgICBzZWxmLmJ1ZiA9IGIiIgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuYnoyb2JqID0gYnoyLkJaMkNvbXByZXNzb3IoKQoKICAgIGRlZiByZWFkKHNlbGYsIHNpemUpOgogICAgICAgIHggPSBsZW4oc2VsZi5idWYpCiAgICAgICAgd2hpbGUgeCA8IHNpemU6CiAgICAgICAgICAgIHJhdyA9IHNlbGYuZmlsZW9iai5yZWFkKHNlbGYuYmxvY2tzaXplKQogICAgICAgICAgICBpZiBub3QgcmF3OgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZGF0YSA9IHNlbGYuYnoyb2JqLmRlY29tcHJlc3MocmF3KQogICAgICAgICAgICBzZWxmLmJ1ZiArPSBkYXRhCiAgICAgICAgICAgIHggKz0gbGVuKGRhdGEpCgogICAgICAgIGJ1ZiA9IHNlbGYuYnVmWzpzaXplXQogICAgICAgIHNlbGYuYnVmID0gc2VsZi5idWZbc2l6ZTpdCiAgICAgICAgc2VsZi5wb3MgKz0gbGVuKGJ1ZikKICAgICAgICByZXR1cm4gYnVmCgogICAgZGVmIHNlZWsoc2VsZiwgcG9zKToKICAgICAgICBpZiBwb3MgPCBzZWxmLnBvczoKICAgICAgICAgICAgc2VsZi5pbml0KCkKICAgICAgICBzZWxmLnJlYWQocG9zIC0gc2VsZi5wb3MpCgogICAgZGVmIHRlbGwoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYucG9zCgogICAgZGVmIHdyaXRlKHNlbGYsIGRhdGEpOgogICAgICAgIHNlbGYucG9zICs9IGxlbihkYXRhKQogICAgICAgIHJhdyA9IHNlbGYuYnoyb2JqLmNvbXByZXNzKGRhdGEpCiAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKHJhdykKCiAgICBkZWYgY2xvc2Uoc2VsZik6CiAgICAgICAgaWYgc2VsZi5tb2RlID09ICJ3IjoKICAgICAgICAgICAgcmF3ID0gc2VsZi5iejJvYmouZmx1c2goKQogICAgICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUocmF3KQojIGNsYXNzIF9CWjJQcm94eQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIEV4dHJhY3Rpb24gZmlsZSBvYmplY3QKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpjbGFzcyBfRmlsZUluRmlsZShvYmplY3QpOgogICAgIiIiQSB0aGluIHdyYXBwZXIgYXJvdW5kIGFuIGV4aXN0aW5nIGZpbGUgb2JqZWN0IHRoYXQKICAgICAgIHByb3ZpZGVzIGEgcGFydCBvZiBpdHMgZGF0YSBhcyBhbiBpbmRpdmlkdWFsIGZpbGUKICAgICAgIG9iamVjdC4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlb2JqLCBvZmZzZXQsIHNpemUsIGJsb2NraW5mbz1Ob25lKToKICAgICAgICBzZWxmLmZpbGVvYmogPSBmaWxlb2JqCiAgICAgICAgc2VsZi5vZmZzZXQgPSBvZmZzZXQKICAgICAgICBzZWxmLnNpemUgPSBzaXplCiAgICAgICAgc2VsZi5wb3NpdGlvbiA9IDAKCiAgICAgICAgaWYgYmxvY2tpbmZvIGlzIE5vbmU6CiAgICAgICAgICAgIGJsb2NraW5mbyA9IFsoMCwgc2l6ZSldCgogICAgICAgICMgQ29uc3RydWN0IGEgbWFwIHdpdGggZGF0YSBhbmQgemVybyBibG9ja3MuCiAgICAgICAgc2VsZi5tYXBfaW5kZXggPSAwCiAgICAgICAgc2VsZi5tYXAgPSBbXQogICAgICAgIGxhc3Rwb3MgPSAwCiAgICAgICAgcmVhbHBvcyA9IHNlbGYub2Zmc2V0CiAgICAgICAgZm9yIG9mZnNldCwgc2l6ZSBpbiBibG9ja2luZm86CiAgICAgICAgICAgIGlmIG9mZnNldCA+IGxhc3Rwb3M6CiAgICAgICAgICAgICAgICBzZWxmLm1hcC5hcHBlbmQoKEZhbHNlLCBsYXN0cG9zLCBvZmZzZXQsIE5vbmUpKQogICAgICAgICAgICBzZWxmLm1hcC5hcHBlbmQoKFRydWUsIG9mZnNldCwgb2Zmc2V0ICsgc2l6ZSwgcmVhbHBvcykpCiAgICAgICAgICAgIHJlYWxwb3MgKz0gc2l6ZQogICAgICAgICAgICBsYXN0cG9zID0gb2Zmc2V0ICsgc2l6ZQogICAgICAgIGlmIGxhc3Rwb3MgPCBzZWxmLnNpemU6CiAgICAgICAgICAgIHNlbGYubWFwLmFwcGVuZCgoRmFsc2UsIGxhc3Rwb3MsIHNlbGYuc2l6ZSwgTm9uZSkpCgogICAgZGVmIHNlZWthYmxlKHNlbGYpOgogICAgICAgIGlmIG5vdCBoYXNhdHRyKHNlbGYuZmlsZW9iaiwgInNlZWthYmxlIik6CiAgICAgICAgICAgICMgWFhYIGd6aXAuR3ppcEZpbGUgYW5kIGJ6Mi5CWjJGaWxlCiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgcmV0dXJuIHNlbGYuZmlsZW9iai5zZWVrYWJsZSgpCgogICAgZGVmIHRlbGwoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIHRoZSBjdXJyZW50IGZpbGUgcG9zaXRpb24uCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYucG9zaXRpb24KCiAgICBkZWYgc2VlayhzZWxmLCBwb3NpdGlvbik6CiAgICAgICAgIiIiU2VlayB0byBhIHBvc2l0aW9uIGluIHRoZSBmaWxlLgogICAgICAgICIiIgogICAgICAgIHNlbGYucG9zaXRpb24gPSBwb3NpdGlvbgoKICAgIGRlZiByZWFkKHNlbGYsIHNpemU9Tm9uZSk6CiAgICAgICAgIiIiUmVhZCBkYXRhIGZyb20gdGhlIGZpbGUuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2l6ZSBpcyBOb25lOgogICAgICAgICAgICBzaXplID0gc2VsZi5zaXplIC0gc2VsZi5wb3NpdGlvbgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNpemUgPSBtaW4oc2l6ZSwgc2VsZi5zaXplIC0gc2VsZi5wb3NpdGlvbikKCiAgICAgICAgYnVmID0gYiIiCiAgICAgICAgd2hpbGUgc2l6ZSA+IDA6CiAgICAgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICAgICBkYXRhLCBzdGFydCwgc3RvcCwgb2Zmc2V0ID0gc2VsZi5tYXBbc2VsZi5tYXBfaW5kZXhdCiAgICAgICAgICAgICAgICBpZiBzdGFydCA8PSBzZWxmLnBvc2l0aW9uIDwgc3RvcDoKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBzZWxmLm1hcF9pbmRleCArPSAxCiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5tYXBfaW5kZXggPT0gbGVuKHNlbGYubWFwKToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tYXBfaW5kZXggPSAwCiAgICAgICAgICAgIGxlbmd0aCA9IG1pbihzaXplLCBzdG9wIC0gc2VsZi5wb3NpdGlvbikKICAgICAgICAgICAgaWYgZGF0YToKICAgICAgICAgICAgICAgIHNlbGYuZmlsZW9iai5zZWVrKG9mZnNldCArIChzZWxmLnBvc2l0aW9uIC0gc3RhcnQpKQogICAgICAgICAgICAgICAgYnVmICs9IHNlbGYuZmlsZW9iai5yZWFkKGxlbmd0aCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGJ1ZiArPSBOVUwgKiBsZW5ndGgKICAgICAgICAgICAgc2l6ZSAtPSBsZW5ndGgKICAgICAgICAgICAgc2VsZi5wb3NpdGlvbiArPSBsZW5ndGgKICAgICAgICByZXR1cm4gYnVmCiNjbGFzcyBfRmlsZUluRmlsZQoKCmNsYXNzIEV4RmlsZU9iamVjdChvYmplY3QpOgogICAgIiIiRmlsZS1saWtlIG9iamVjdCBmb3IgcmVhZGluZyBhbiBhcmNoaXZlIG1lbWJlci4KICAgICAgIElzIHJldHVybmVkIGJ5IFRhckZpbGUuZXh0cmFjdGZpbGUoKS4KICAgICIiIgogICAgYmxvY2tzaXplID0gMTAyNAoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0YXJmaWxlLCB0YXJpbmZvKToKICAgICAgICBzZWxmLmZpbGVvYmogPSBfRmlsZUluRmlsZSh0YXJmaWxlLmZpbGVvYmosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyaW5mby5vZmZzZXRfZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJpbmZvLnNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyaW5mby5zcGFyc2UpCiAgICAgICAgc2VsZi5uYW1lID0gdGFyaW5mby5uYW1lCiAgICAgICAgc2VsZi5tb2RlID0gInIiCiAgICAgICAgc2VsZi5jbG9zZWQgPSBGYWxzZQogICAgICAgIHNlbGYuc2l6ZSA9IHRhcmluZm8uc2l6ZQoKICAgICAgICBzZWxmLnBvc2l0aW9uID0gMAogICAgICAgIHNlbGYuYnVmZmVyID0gYiIiCgogICAgZGVmIHJlYWRhYmxlKHNlbGYpOgogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHdyaXRhYmxlKHNlbGYpOgogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBzZWVrYWJsZShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5maWxlb2JqLnNlZWthYmxlKCkKCiAgICBkZWYgcmVhZChzZWxmLCBzaXplPU5vbmUpOgogICAgICAgICIiIlJlYWQgYXQgbW9zdCBzaXplIGJ5dGVzIGZyb20gdGhlIGZpbGUuIElmIHNpemUgaXMgbm90CiAgICAgICAgICAgcHJlc2VudCBvciBOb25lLCByZWFkIGFsbCBkYXRhIHVudGlsIEVPRiBpcyByZWFjaGVkLgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuY2xvc2VkOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlIikKCiAgICAgICAgYnVmID0gYiIiCiAgICAgICAgaWYgc2VsZi5idWZmZXI6CiAgICAgICAgICAgIGlmIHNpemUgaXMgTm9uZToKICAgICAgICAgICAgICAgIGJ1ZiA9IHNlbGYuYnVmZmVyCiAgICAgICAgICAgICAgICBzZWxmLmJ1ZmZlciA9IGIiIgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYnVmID0gc2VsZi5idWZmZXJbOnNpemVdCiAgICAgICAgICAgICAgICBzZWxmLmJ1ZmZlciA9IHNlbGYuYnVmZmVyW3NpemU6XQoKICAgICAgICBpZiBzaXplIGlzIE5vbmU6CiAgICAgICAgICAgIGJ1ZiArPSBzZWxmLmZpbGVvYmoucmVhZCgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYnVmICs9IHNlbGYuZmlsZW9iai5yZWFkKHNpemUgLSBsZW4oYnVmKSkKCiAgICAgICAgc2VsZi5wb3NpdGlvbiArPSBsZW4oYnVmKQogICAgICAgIHJldHVybiBidWYKCiAgICAjIFhYWCBUZXh0SU9XcmFwcGVyIHVzZXMgdGhlIHJlYWQxKCkgbWV0aG9kLgogICAgcmVhZDEgPSByZWFkCgogICAgZGVmIHJlYWRsaW5lKHNlbGYsIHNpemU9LTEpOgogICAgICAgICIiIlJlYWQgb25lIGVudGlyZSBsaW5lIGZyb20gdGhlIGZpbGUuIElmIHNpemUgaXMgcHJlc2VudAogICAgICAgICAgIGFuZCBub24tbmVnYXRpdmUsIHJldHVybiBhIHN0cmluZyB3aXRoIGF0IG1vc3QgdGhhdAogICAgICAgICAgIHNpemUsIHdoaWNoIG1heSBiZSBhbiBpbmNvbXBsZXRlIGxpbmUuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiKQoKICAgICAgICBwb3MgPSBzZWxmLmJ1ZmZlci5maW5kKGIiXG4iKSArIDEKICAgICAgICBpZiBwb3MgPT0gMDoKICAgICAgICAgICAgIyBubyBuZXdsaW5lIGZvdW5kLgogICAgICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAgICAgYnVmID0gc2VsZi5maWxlb2JqLnJlYWQoc2VsZi5ibG9ja3NpemUpCiAgICAgICAgICAgICAgICBzZWxmLmJ1ZmZlciArPSBidWYKICAgICAgICAgICAgICAgIGlmIG5vdCBidWYgb3IgYiJcbiIgaW4gYnVmOgogICAgICAgICAgICAgICAgICAgIHBvcyA9IHNlbGYuYnVmZmVyLmZpbmQoYiJcbiIpICsgMQogICAgICAgICAgICAgICAgICAgIGlmIHBvcyA9PSAwOgogICAgICAgICAgICAgICAgICAgICAgICAjIG5vIG5ld2xpbmUgZm91bmQuCiAgICAgICAgICAgICAgICAgICAgICAgIHBvcyA9IGxlbihzZWxmLmJ1ZmZlcikKICAgICAgICAgICAgICAgICAgICBicmVhawoKICAgICAgICBpZiBzaXplICE9IC0xOgogICAgICAgICAgICBwb3MgPSBtaW4oc2l6ZSwgcG9zKQoKICAgICAgICBidWYgPSBzZWxmLmJ1ZmZlcls6cG9zXQogICAgICAgIHNlbGYuYnVmZmVyID0gc2VsZi5idWZmZXJbcG9zOl0KICAgICAgICBzZWxmLnBvc2l0aW9uICs9IGxlbihidWYpCiAgICAgICAgcmV0dXJuIGJ1ZgoKICAgIGRlZiByZWFkbGluZXMoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCB3aXRoIGFsbCByZW1haW5pbmcgbGluZXMuCiAgICAgICAgIiIiCiAgICAgICAgcmVzdWx0ID0gW10KICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICBsaW5lID0gc2VsZi5yZWFkbGluZSgpCiAgICAgICAgICAgIGlmIG5vdCBsaW5lOiBicmVhawogICAgICAgICAgICByZXN1bHQuYXBwZW5kKGxpbmUpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiB0ZWxsKHNlbGYpOgogICAgICAgICIiIlJldHVybiB0aGUgY3VycmVudCBmaWxlIHBvc2l0aW9uLgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuY2xvc2VkOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlIikKCiAgICAgICAgcmV0dXJuIHNlbGYucG9zaXRpb24KCiAgICBkZWYgc2VlayhzZWxmLCBwb3MsIHdoZW5jZT1vcy5TRUVLX1NFVCk6CiAgICAgICAgIiIiU2VlayB0byBhIHBvc2l0aW9uIGluIHRoZSBmaWxlLgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuY2xvc2VkOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlIikKCiAgICAgICAgaWYgd2hlbmNlID09IG9zLlNFRUtfU0VUOgogICAgICAgICAgICBzZWxmLnBvc2l0aW9uID0gbWluKG1heChwb3MsIDApLCBzZWxmLnNpemUpCiAgICAgICAgZWxpZiB3aGVuY2UgPT0gb3MuU0VFS19DVVI6CiAgICAgICAgICAgIGlmIHBvcyA8IDA6CiAgICAgICAgICAgICAgICBzZWxmLnBvc2l0aW9uID0gbWF4KHNlbGYucG9zaXRpb24gKyBwb3MsIDApCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLnBvc2l0aW9uID0gbWluKHNlbGYucG9zaXRpb24gKyBwb3MsIHNlbGYuc2l6ZSkKICAgICAgICBlbGlmIHdoZW5jZSA9PSBvcy5TRUVLX0VORDoKICAgICAgICAgICAgc2VsZi5wb3NpdGlvbiA9IG1heChtaW4oc2VsZi5zaXplICsgcG9zLCBzZWxmLnNpemUpLCAwKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkludmFsaWQgYXJndW1lbnQiKQoKICAgICAgICBzZWxmLmJ1ZmZlciA9IGIiIgogICAgICAgIHNlbGYuZmlsZW9iai5zZWVrKHNlbGYucG9zaXRpb24pCgogICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgICIiIkNsb3NlIHRoZSBmaWxlIG9iamVjdC4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmNsb3NlZCA9IFRydWUKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgIiIiR2V0IGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGZpbGUncyBsaW5lcy4KICAgICAgICAiIiIKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICBsaW5lID0gc2VsZi5yZWFkbGluZSgpCiAgICAgICAgICAgIGlmIG5vdCBsaW5lOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgeWllbGQgbGluZQojY2xhc3MgRXhGaWxlT2JqZWN0CgojLS0tLS0tLS0tLS0tLS0tLS0tCiMgRXhwb3J0ZWQgQ2xhc3NlcwojLS0tLS0tLS0tLS0tLS0tLS0tCmNsYXNzIFRhckluZm8ob2JqZWN0KToKICAgICIiIkluZm9ybWF0aW9uYWwgY2xhc3Mgd2hpY2ggaG9sZHMgdGhlIGRldGFpbHMgYWJvdXQgYW4KICAgICAgIGFyY2hpdmUgbWVtYmVyIGdpdmVuIGJ5IGEgdGFyIGhlYWRlciBibG9jay4KICAgICAgIFRhckluZm8gb2JqZWN0cyBhcmUgcmV0dXJuZWQgYnkgVGFyRmlsZS5nZXRtZW1iZXIoKSwKICAgICAgIFRhckZpbGUuZ2V0bWVtYmVycygpIGFuZCBUYXJGaWxlLmdldHRhcmluZm8oKSBhbmQgYXJlCiAgICAgICB1c3VhbGx5IGNyZWF0ZWQgaW50ZXJuYWxseS4KICAgICIiIgoKICAgIF9fc2xvdHNfXyA9ICgibmFtZSIsICJtb2RlIiwgInVpZCIsICJnaWQiLCAic2l6ZSIsICJtdGltZSIsCiAgICAgICAgICAgICAgICAgImNoa3N1bSIsICJ0eXBlIiwgImxpbmtuYW1lIiwgInVuYW1lIiwgImduYW1lIiwKICAgICAgICAgICAgICAgICAiZGV2bWFqb3IiLCAiZGV2bWlub3IiLAogICAgICAgICAgICAgICAgICJvZmZzZXQiLCAib2Zmc2V0X2RhdGEiLCAicGF4X2hlYWRlcnMiLCAic3BhcnNlIiwKICAgICAgICAgICAgICAgICAidGFyZmlsZSIsICJfc3BhcnNlX3N0cnVjdHMiLCAiX2xpbmtfdGFyZ2V0IikKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZT0iIik6CiAgICAgICAgIiIiQ29uc3RydWN0IGEgVGFySW5mbyBvYmplY3QuIG5hbWUgaXMgdGhlIG9wdGlvbmFsIG5hbWUKICAgICAgICAgICBvZiB0aGUgbWVtYmVyLgogICAgICAgICIiIgogICAgICAgIHNlbGYubmFtZSA9IG5hbWUgICAgICAgICMgbWVtYmVyIG5hbWUKICAgICAgICBzZWxmLm1vZGUgPSAwbzY0NCAgICAgICAjIGZpbGUgcGVybWlzc2lvbnMKICAgICAgICBzZWxmLnVpZCA9IDAgICAgICAgICAgICAjIHVzZXIgaWQKICAgICAgICBzZWxmLmdpZCA9IDAgICAgICAgICAgICAjIGdyb3VwIGlkCiAgICAgICAgc2VsZi5zaXplID0gMCAgICAgICAgICAgIyBmaWxlIHNpemUKICAgICAgICBzZWxmLm10aW1lID0gMCAgICAgICAgICAjIG1vZGlmaWNhdGlvbiB0aW1lCiAgICAgICAgc2VsZi5jaGtzdW0gPSAwICAgICAgICAgIyBoZWFkZXIgY2hlY2tzdW0KICAgICAgICBzZWxmLnR5cGUgPSBSRUdUWVBFICAgICAjIG1lbWJlciB0eXBlCiAgICAgICAgc2VsZi5saW5rbmFtZSA9ICIiICAgICAgIyBsaW5rIG5hbWUKICAgICAgICBzZWxmLnVuYW1lID0gIiIgICAgICAgICAjIHVzZXIgbmFtZQogICAgICAgIHNlbGYuZ25hbWUgPSAiIiAgICAgICAgICMgZ3JvdXAgbmFtZQogICAgICAgIHNlbGYuZGV2bWFqb3IgPSAwICAgICAgICMgZGV2aWNlIG1ham9yIG51bWJlcgogICAgICAgIHNlbGYuZGV2bWlub3IgPSAwICAgICAgICMgZGV2aWNlIG1pbm9yIG51bWJlcgoKICAgICAgICBzZWxmLm9mZnNldCA9IDAgICAgICAgICAjIHRoZSB0YXIgaGVhZGVyIHN0YXJ0cyBoZXJlCiAgICAgICAgc2VsZi5vZmZzZXRfZGF0YSA9IDAgICAgIyB0aGUgZmlsZSdzIGRhdGEgc3RhcnRzIGhlcmUKCiAgICAgICAgc2VsZi5zcGFyc2UgPSBOb25lICAgICAgIyBzcGFyc2UgbWVtYmVyIGluZm9ybWF0aW9uCiAgICAgICAgc2VsZi5wYXhfaGVhZGVycyA9IHt9ICAgIyBwYXggaGVhZGVyIGluZm9ybWF0aW9uCgogICAgIyBJbiBwYXggaGVhZGVycyB0aGUgIm5hbWUiIGFuZCAibGlua25hbWUiIGZpZWxkIGFyZSBjYWxsZWQKICAgICMgInBhdGgiIGFuZCAibGlua3BhdGgiLgogICAgZGVmIF9nZXRwYXRoKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLm5hbWUKICAgIGRlZiBfc2V0cGF0aChzZWxmLCBuYW1lKToKICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCiAgICBwYXRoID0gcHJvcGVydHkoX2dldHBhdGgsIF9zZXRwYXRoKQoKICAgIGRlZiBfZ2V0bGlua3BhdGgoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYubGlua25hbWUKICAgIGRlZiBfc2V0bGlua3BhdGgoc2VsZiwgbGlua25hbWUpOgogICAgICAgIHNlbGYubGlua25hbWUgPSBsaW5rbmFtZQogICAgbGlua3BhdGggPSBwcm9wZXJ0eShfZ2V0bGlua3BhdGgsIF9zZXRsaW5rcGF0aCkKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICI8JXMgJXIgYXQgJSN4PiIgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sc2VsZi5uYW1lLGlkKHNlbGYpKQoKICAgIGRlZiBnZXRfaW5mbyhzZWxmKToKICAgICAgICAiIiJSZXR1cm4gdGhlIFRhckluZm8ncyBhdHRyaWJ1dGVzIGFzIGEgZGljdGlvbmFyeS4KICAgICAgICAiIiIKICAgICAgICBpbmZvID0gewogICAgICAgICAgICAibmFtZSI6ICAgICBzZWxmLm5hbWUsCiAgICAgICAgICAgICJtb2RlIjogICAgIHNlbGYubW9kZSAmIDBvNzc3NywKICAgICAgICAgICAgInVpZCI6ICAgICAgc2VsZi51aWQsCiAgICAgICAgICAgICJnaWQiOiAgICAgIHNlbGYuZ2lkLAogICAgICAgICAgICAic2l6ZSI6ICAgICBzZWxmLnNpemUsCiAgICAgICAgICAgICJtdGltZSI6ICAgIHNlbGYubXRpbWUsCiAgICAgICAgICAgICJjaGtzdW0iOiAgIHNlbGYuY2hrc3VtLAogICAgICAgICAgICAidHlwZSI6ICAgICBzZWxmLnR5cGUsCiAgICAgICAgICAgICJsaW5rbmFtZSI6IHNlbGYubGlua25hbWUsCiAgICAgICAgICAgICJ1bmFtZSI6ICAgIHNlbGYudW5hbWUsCiAgICAgICAgICAgICJnbmFtZSI6ICAgIHNlbGYuZ25hbWUsCiAgICAgICAgICAgICJkZXZtYWpvciI6IHNlbGYuZGV2bWFqb3IsCiAgICAgICAgICAgICJkZXZtaW5vciI6IHNlbGYuZGV2bWlub3IKICAgICAgICB9CgogICAgICAgIGlmIGluZm9bInR5cGUiXSA9PSBESVJUWVBFIGFuZCBub3QgaW5mb1sibmFtZSJdLmVuZHN3aXRoKCIvIik6CiAgICAgICAgICAgIGluZm9bIm5hbWUiXSArPSAiLyIKCiAgICAgICAgcmV0dXJuIGluZm8KCiAgICBkZWYgdG9idWYoc2VsZiwgZm9ybWF0PURFRkFVTFRfRk9STUFULCBlbmNvZGluZz1FTkNPRElORywgZXJyb3JzPSJzdXJyb2dhdGVlc2NhcGUiKToKICAgICAgICAiIiJSZXR1cm4gYSB0YXIgaGVhZGVyIGFzIGEgc3RyaW5nIG9mIDUxMiBieXRlIGJsb2Nrcy4KICAgICAgICAiIiIKICAgICAgICBpbmZvID0gc2VsZi5nZXRfaW5mbygpCgogICAgICAgIGlmIGZvcm1hdCA9PSBVU1RBUl9GT1JNQVQ6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmNyZWF0ZV91c3Rhcl9oZWFkZXIoaW5mbywgZW5jb2RpbmcsIGVycm9ycykKICAgICAgICBlbGlmIGZvcm1hdCA9PSBHTlVfRk9STUFUOgogICAgICAgICAgICByZXR1cm4gc2VsZi5jcmVhdGVfZ251X2hlYWRlcihpbmZvLCBlbmNvZGluZywgZXJyb3JzKQogICAgICAgIGVsaWYgZm9ybWF0ID09IFBBWF9GT1JNQVQ6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmNyZWF0ZV9wYXhfaGVhZGVyKGluZm8sIGVuY29kaW5nKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImludmFsaWQgZm9ybWF0IikKCiAgICBkZWYgY3JlYXRlX3VzdGFyX2hlYWRlcihzZWxmLCBpbmZvLCBlbmNvZGluZywgZXJyb3JzKToKICAgICAgICAiIiJSZXR1cm4gdGhlIG9iamVjdCBhcyBhIHVzdGFyIGhlYWRlciBibG9jay4KICAgICAgICAiIiIKICAgICAgICBpbmZvWyJtYWdpYyJdID0gUE9TSVhfTUFHSUMKCiAgICAgICAgaWYgbGVuKGluZm9bImxpbmtuYW1lIl0pID4gTEVOR1RIX0xJTks6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImxpbmtuYW1lIGlzIHRvbyBsb25nIikKCiAgICAgICAgaWYgbGVuKGluZm9bIm5hbWUiXSkgPiBMRU5HVEhfTkFNRToKICAgICAgICAgICAgaW5mb1sicHJlZml4Il0sIGluZm9bIm5hbWUiXSA9IHNlbGYuX3Bvc2l4X3NwbGl0X25hbWUoaW5mb1sibmFtZSJdKQoKICAgICAgICByZXR1cm4gc2VsZi5fY3JlYXRlX2hlYWRlcihpbmZvLCBVU1RBUl9GT1JNQVQsIGVuY29kaW5nLCBlcnJvcnMpCgogICAgZGVmIGNyZWF0ZV9nbnVfaGVhZGVyKHNlbGYsIGluZm8sIGVuY29kaW5nLCBlcnJvcnMpOgogICAgICAgICIiIlJldHVybiB0aGUgb2JqZWN0IGFzIGEgR05VIGhlYWRlciBibG9jayBzZXF1ZW5jZS4KICAgICAgICAiIiIKICAgICAgICBpbmZvWyJtYWdpYyJdID0gR05VX01BR0lDCgogICAgICAgIGJ1ZiA9IGIiIgogICAgICAgIGlmIGxlbihpbmZvWyJsaW5rbmFtZSJdKSA+IExFTkdUSF9MSU5LOgogICAgICAgICAgICBidWYgKz0gc2VsZi5fY3JlYXRlX2dudV9sb25nX2hlYWRlcihpbmZvWyJsaW5rbmFtZSJdLCBHTlVUWVBFX0xPTkdMSU5LLCBlbmNvZGluZywgZXJyb3JzKQoKICAgICAgICBpZiBsZW4oaW5mb1sibmFtZSJdKSA+IExFTkdUSF9OQU1FOgogICAgICAgICAgICBidWYgKz0gc2VsZi5fY3JlYXRlX2dudV9sb25nX2hlYWRlcihpbmZvWyJuYW1lIl0sIEdOVVRZUEVfTE9OR05BTUUsIGVuY29kaW5nLCBlcnJvcnMpCgogICAgICAgIHJldHVybiBidWYgKyBzZWxmLl9jcmVhdGVfaGVhZGVyKGluZm8sIEdOVV9GT1JNQVQsIGVuY29kaW5nLCBlcnJvcnMpCgogICAgZGVmIGNyZWF0ZV9wYXhfaGVhZGVyKHNlbGYsIGluZm8sIGVuY29kaW5nKToKICAgICAgICAiIiJSZXR1cm4gdGhlIG9iamVjdCBhcyBhIHVzdGFyIGhlYWRlciBibG9jay4gSWYgaXQgY2Fubm90IGJlCiAgICAgICAgICAgcmVwcmVzZW50ZWQgdGhpcyB3YXksIHByZXBlbmQgYSBwYXggZXh0ZW5kZWQgaGVhZGVyIHNlcXVlbmNlCiAgICAgICAgICAgd2l0aCBzdXBwbGVtZW50IGluZm9ybWF0aW9uLgogICAgICAgICIiIgogICAgICAgIGluZm9bIm1hZ2ljIl0gPSBQT1NJWF9NQUdJQwogICAgICAgIHBheF9oZWFkZXJzID0gc2VsZi5wYXhfaGVhZGVycy5jb3B5KCkKCiAgICAgICAgIyBUZXN0IHN0cmluZyBmaWVsZHMgZm9yIHZhbHVlcyB0aGF0IGV4Y2VlZCB0aGUgZmllbGQgbGVuZ3RoIG9yIGNhbm5vdAogICAgICAgICMgYmUgcmVwcmVzZW50ZWQgaW4gQVNDSUkgZW5jb2RpbmcuCiAgICAgICAgZm9yIG5hbWUsIGhuYW1lLCBsZW5ndGggaW4gKAogICAgICAgICAgICAgICAgKCJuYW1lIiwgInBhdGgiLCBMRU5HVEhfTkFNRSksICgibGlua25hbWUiLCAibGlua3BhdGgiLCBMRU5HVEhfTElOSyksCiAgICAgICAgICAgICAgICAoInVuYW1lIiwgInVuYW1lIiwgMzIpLCAoImduYW1lIiwgImduYW1lIiwgMzIpKToKCiAgICAgICAgICAgIGlmIGhuYW1lIGluIHBheF9oZWFkZXJzOgogICAgICAgICAgICAgICAgIyBUaGUgcGF4IGhlYWRlciBoYXMgcHJpb3JpdHkuCiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgIyBUcnkgdG8gZW5jb2RlIHRoZSBzdHJpbmcgYXMgQVNDSUkuCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGluZm9bbmFtZV0uZW5jb2RlKCJhc2NpaSIsICJzdHJpY3QiKQogICAgICAgICAgICBleGNlcHQgVW5pY29kZUVuY29kZUVycm9yOgogICAgICAgICAgICAgICAgcGF4X2hlYWRlcnNbaG5hbWVdID0gaW5mb1tuYW1lXQogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIGlmIGxlbihpbmZvW25hbWVdKSA+IGxlbmd0aDoKICAgICAgICAgICAgICAgIHBheF9oZWFkZXJzW2huYW1lXSA9IGluZm9bbmFtZV0KCiAgICAgICAgIyBUZXN0IG51bWJlciBmaWVsZHMgZm9yIHZhbHVlcyB0aGF0IGV4Y2VlZCB0aGUgZmllbGQgbGltaXQgb3IgdmFsdWVzCiAgICAgICAgIyB0aGF0IGxpa2UgdG8gYmUgc3RvcmVkIGFzIGZsb2F0LgogICAgICAgIGZvciBuYW1lLCBkaWdpdHMgaW4gKCgidWlkIiwgOCksICgiZ2lkIiwgOCksICgic2l6ZSIsIDEyKSwgKCJtdGltZSIsIDEyKSk6CiAgICAgICAgICAgIGlmIG5hbWUgaW4gcGF4X2hlYWRlcnM6CiAgICAgICAgICAgICAgICAjIFRoZSBwYXggaGVhZGVyIGhhcyBwcmlvcml0eS4gQXZvaWQgb3ZlcmZsb3cuCiAgICAgICAgICAgICAgICBpbmZvW25hbWVdID0gMAogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIHZhbCA9IGluZm9bbmFtZV0KICAgICAgICAgICAgaWYgbm90IDAgPD0gdmFsIDwgOCAqKiAoZGlnaXRzIC0gMSkgb3IgaXNpbnN0YW5jZSh2YWwsIGZsb2F0KToKICAgICAgICAgICAgICAgIHBheF9oZWFkZXJzW25hbWVdID0gc3RyKHZhbCkKICAgICAgICAgICAgICAgIGluZm9bbmFtZV0gPSAwCgogICAgICAgICMgQ3JlYXRlIGEgcGF4IGV4dGVuZGVkIGhlYWRlciBpZiBuZWNlc3NhcnkuCiAgICAgICAgaWYgcGF4X2hlYWRlcnM6CiAgICAgICAgICAgIGJ1ZiA9IHNlbGYuX2NyZWF0ZV9wYXhfZ2VuZXJpY19oZWFkZXIocGF4X2hlYWRlcnMsIFhIRFRZUEUsIGVuY29kaW5nKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGJ1ZiA9IGIiIgoKICAgICAgICByZXR1cm4gYnVmICsgc2VsZi5fY3JlYXRlX2hlYWRlcihpbmZvLCBVU1RBUl9GT1JNQVQsICJhc2NpaSIsICJyZXBsYWNlIikKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBjcmVhdGVfcGF4X2dsb2JhbF9oZWFkZXIoY2xzLCBwYXhfaGVhZGVycyk6CiAgICAgICAgIiIiUmV0dXJuIHRoZSBvYmplY3QgYXMgYSBwYXggZ2xvYmFsIGhlYWRlciBibG9jayBzZXF1ZW5jZS4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gY2xzLl9jcmVhdGVfcGF4X2dlbmVyaWNfaGVhZGVyKHBheF9oZWFkZXJzLCBYR0xUWVBFLCAidXRmOCIpCgogICAgZGVmIF9wb3NpeF9zcGxpdF9uYW1lKHNlbGYsIG5hbWUpOgogICAgICAgICIiIlNwbGl0IGEgbmFtZSBsb25nZXIgdGhhbiAxMDAgY2hhcnMgaW50byBhIHByZWZpeAogICAgICAgICAgIGFuZCBhIG5hbWUgcGFydC4KICAgICAgICAiIiIKICAgICAgICBwcmVmaXggPSBuYW1lWzpMRU5HVEhfUFJFRklYICsgMV0KICAgICAgICB3aGlsZSBwcmVmaXggYW5kIHByZWZpeFstMV0gIT0gIi8iOgogICAgICAgICAgICBwcmVmaXggPSBwcmVmaXhbOi0xXQoKICAgICAgICBuYW1lID0gbmFtZVtsZW4ocHJlZml4KTpdCiAgICAgICAgcHJlZml4ID0gcHJlZml4WzotMV0KCiAgICAgICAgaWYgbm90IHByZWZpeCBvciBsZW4obmFtZSkgPiBMRU5HVEhfTkFNRToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibmFtZSBpcyB0b28gbG9uZyIpCiAgICAgICAgcmV0dXJuIHByZWZpeCwgbmFtZQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfY3JlYXRlX2hlYWRlcihpbmZvLCBmb3JtYXQsIGVuY29kaW5nLCBlcnJvcnMpOgogICAgICAgICIiIlJldHVybiBhIGhlYWRlciBibG9jay4gaW5mbyBpcyBhIGRpY3Rpb25hcnkgd2l0aCBmaWxlCiAgICAgICAgICAgaW5mb3JtYXRpb24sIGZvcm1hdCBtdXN0IGJlIG9uZSBvZiB0aGUgKl9GT1JNQVQgY29uc3RhbnRzLgogICAgICAgICIiIgogICAgICAgIHBhcnRzID0gWwogICAgICAgICAgICBzdG4oaW5mby5nZXQoIm5hbWUiLCAiIiksIDEwMCwgZW5jb2RpbmcsIGVycm9ycyksCiAgICAgICAgICAgIGl0bihpbmZvLmdldCgibW9kZSIsIDApICYgMG83Nzc3LCA4LCBmb3JtYXQpLAogICAgICAgICAgICBpdG4oaW5mby5nZXQoInVpZCIsIDApLCA4LCBmb3JtYXQpLAogICAgICAgICAgICBpdG4oaW5mby5nZXQoImdpZCIsIDApLCA4LCBmb3JtYXQpLAogICAgICAgICAgICBpdG4oaW5mby5nZXQoInNpemUiLCAwKSwgMTIsIGZvcm1hdCksCiAgICAgICAgICAgIGl0bihpbmZvLmdldCgibXRpbWUiLCAwKSwgMTIsIGZvcm1hdCksCiAgICAgICAgICAgIGIiICAgICAgICAiLCAjIGNoZWNrc3VtIGZpZWxkCiAgICAgICAgICAgIGluZm8uZ2V0KCJ0eXBlIiwgUkVHVFlQRSksCiAgICAgICAgICAgIHN0bihpbmZvLmdldCgibGlua25hbWUiLCAiIiksIDEwMCwgZW5jb2RpbmcsIGVycm9ycyksCiAgICAgICAgICAgIGluZm8uZ2V0KCJtYWdpYyIsIFBPU0lYX01BR0lDKSwKICAgICAgICAgICAgc3RuKGluZm8uZ2V0KCJ1bmFtZSIsICIiKSwgMzIsIGVuY29kaW5nLCBlcnJvcnMpLAogICAgICAgICAgICBzdG4oaW5mby5nZXQoImduYW1lIiwgIiIpLCAzMiwgZW5jb2RpbmcsIGVycm9ycyksCiAgICAgICAgICAgIGl0bihpbmZvLmdldCgiZGV2bWFqb3IiLCAwKSwgOCwgZm9ybWF0KSwKICAgICAgICAgICAgaXRuKGluZm8uZ2V0KCJkZXZtaW5vciIsIDApLCA4LCBmb3JtYXQpLAogICAgICAgICAgICBzdG4oaW5mby5nZXQoInByZWZpeCIsICIiKSwgMTU1LCBlbmNvZGluZywgZXJyb3JzKQogICAgICAgIF0KCiAgICAgICAgYnVmID0gc3RydWN0LnBhY2soIiVkcyIgJSBCTE9DS1NJWkUsIGIiIi5qb2luKHBhcnRzKSkKICAgICAgICBjaGtzdW0gPSBjYWxjX2Noa3N1bXMoYnVmWy1CTE9DS1NJWkU6XSlbMF0KICAgICAgICBidWYgPSBidWZbOi0zNjRdICsgKCIlMDZvXDAiICUgY2hrc3VtKS5lbmNvZGUoImFzY2lpIikgKyBidWZbLTM1NzpdCiAgICAgICAgcmV0dXJuIGJ1ZgoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfY3JlYXRlX3BheWxvYWQocGF5bG9hZCk6CiAgICAgICAgIiIiUmV0dXJuIHRoZSBzdHJpbmcgcGF5bG9hZCBmaWxsZWQgd2l0aCB6ZXJvIGJ5dGVzCiAgICAgICAgICAgdXAgdG8gdGhlIG5leHQgNTEyIGJ5dGUgYm9yZGVyLgogICAgICAgICIiIgogICAgICAgIGJsb2NrcywgcmVtYWluZGVyID0gZGl2bW9kKGxlbihwYXlsb2FkKSwgQkxPQ0tTSVpFKQogICAgICAgIGlmIHJlbWFpbmRlciA+IDA6CiAgICAgICAgICAgIHBheWxvYWQgKz0gKEJMT0NLU0laRSAtIHJlbWFpbmRlcikgKiBOVUwKICAgICAgICByZXR1cm4gcGF5bG9hZAoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9jcmVhdGVfZ251X2xvbmdfaGVhZGVyKGNscywgbmFtZSwgdHlwZSwgZW5jb2RpbmcsIGVycm9ycyk6CiAgICAgICAgIiIiUmV0dXJuIGEgR05VVFlQRV9MT05HTkFNRSBvciBHTlVUWVBFX0xPTkdMSU5LIHNlcXVlbmNlCiAgICAgICAgICAgZm9yIG5hbWUuCiAgICAgICAgIiIiCiAgICAgICAgbmFtZSA9IG5hbWUuZW5jb2RlKGVuY29kaW5nLCBlcnJvcnMpICsgTlVMCgogICAgICAgIGluZm8gPSB7fQogICAgICAgIGluZm9bIm5hbWUiXSA9ICIuLy4vQExvbmdMaW5rIgogICAgICAgIGluZm9bInR5cGUiXSA9IHR5cGUKICAgICAgICBpbmZvWyJzaXplIl0gPSBsZW4obmFtZSkKICAgICAgICBpbmZvWyJtYWdpYyJdID0gR05VX01BR0lDCgogICAgICAgICMgY3JlYXRlIGV4dGVuZGVkIGhlYWRlciArIG5hbWUgYmxvY2tzLgogICAgICAgIHJldHVybiBjbHMuX2NyZWF0ZV9oZWFkZXIoaW5mbywgVVNUQVJfRk9STUFULCBlbmNvZGluZywgZXJyb3JzKSArIFwKICAgICAgICAgICAgICAgIGNscy5fY3JlYXRlX3BheWxvYWQobmFtZSkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfY3JlYXRlX3BheF9nZW5lcmljX2hlYWRlcihjbHMsIHBheF9oZWFkZXJzLCB0eXBlLCBlbmNvZGluZyk6CiAgICAgICAgIiIiUmV0dXJuIGEgUE9TSVguMS0yMDA4IGV4dGVuZGVkIG9yIGdsb2JhbCBoZWFkZXIgc2VxdWVuY2UKICAgICAgICAgICB0aGF0IGNvbnRhaW5zIGEgbGlzdCBvZiBrZXl3b3JkLCB2YWx1ZSBwYWlycy4gVGhlIHZhbHVlcwogICAgICAgICAgIG11c3QgYmUgc3RyaW5ncy4KICAgICAgICAiIiIKICAgICAgICAjIENoZWNrIGlmIG9uZSBvZiB0aGUgZmllbGRzIGNvbnRhaW5zIHN1cnJvZ2F0ZSBjaGFyYWN0ZXJzIGFuZCB0aGVyZWJ5CiAgICAgICAgIyBmb3JjZXMgaGRyY2hhcnNldD1CSU5BUlksIHNlZSBfcHJvY19wYXgoKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICAgICAgICBiaW5hcnkgPSBGYWxzZQogICAgICAgIGZvciBrZXl3b3JkLCB2YWx1ZSBpbiBwYXhfaGVhZGVycy5pdGVtcygpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICB2YWx1ZS5lbmNvZGUoInV0ZjgiLCAic3RyaWN0IikKICAgICAgICAgICAgZXhjZXB0IFVuaWNvZGVFbmNvZGVFcnJvcjoKICAgICAgICAgICAgICAgIGJpbmFyeSA9IFRydWUKICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgIHJlY29yZHMgPSBiIiIKICAgICAgICBpZiBiaW5hcnk6CiAgICAgICAgICAgICMgUHV0IHRoZSBoZHJjaGFyc2V0IGZpZWxkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGhlYWRlci4KICAgICAgICAgICAgcmVjb3JkcyArPSBiIjIxIGhkcmNoYXJzZXQ9QklOQVJZXG4iCgogICAgICAgIGZvciBrZXl3b3JkLCB2YWx1ZSBpbiBwYXhfaGVhZGVycy5pdGVtcygpOgogICAgICAgICAgICBrZXl3b3JkID0ga2V5d29yZC5lbmNvZGUoInV0ZjgiKQogICAgICAgICAgICBpZiBiaW5hcnk6CiAgICAgICAgICAgICAgICAjIFRyeSB0byByZXN0b3JlIHRoZSBvcmlnaW5hbCBieXRlIHJlcHJlc2VudGF0aW9uIG9mIGB2YWx1ZScuCiAgICAgICAgICAgICAgICAjIE5lZWRsZXNzIHRvIHNheSwgdGhhdCB0aGUgZW5jb2RpbmcgbXVzdCBtYXRjaCB0aGUgc3RyaW5nLgogICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5lbmNvZGUoZW5jb2RpbmcsICJzdXJyb2dhdGVlc2NhcGUiKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5lbmNvZGUoInV0ZjgiKQoKICAgICAgICAgICAgbCA9IGxlbihrZXl3b3JkKSArIGxlbih2YWx1ZSkgKyAzICAgIyAnICcgKyAnPScgKyAnXG4nCiAgICAgICAgICAgIG4gPSBwID0gMAogICAgICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAgICAgbiA9IGwgKyBsZW4oc3RyKHApKQogICAgICAgICAgICAgICAgaWYgbiA9PSBwOgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBwID0gbgogICAgICAgICAgICByZWNvcmRzICs9IGJ5dGVzKHN0cihwKSwgImFzY2lpIikgKyBiIiAiICsga2V5d29yZCArIGIiPSIgKyB2YWx1ZSArIGIiXG4iCgogICAgICAgICMgV2UgdXNlIGEgaGFyZGNvZGVkICIuLy4vQFBheEhlYWRlciIgbmFtZSBsaWtlIHN0YXIgZG9lcwogICAgICAgICMgaW5zdGVhZCBvZiB0aGUgb25lIHRoYXQgUE9TSVggcmVjb21tZW5kcy4KICAgICAgICBpbmZvID0ge30KICAgICAgICBpbmZvWyJuYW1lIl0gPSAiLi8uL0BQYXhIZWFkZXIiCiAgICAgICAgaW5mb1sidHlwZSJdID0gdHlwZQogICAgICAgIGluZm9bInNpemUiXSA9IGxlbihyZWNvcmRzKQogICAgICAgIGluZm9bIm1hZ2ljIl0gPSBQT1NJWF9NQUdJQwoKICAgICAgICAjIENyZWF0ZSBwYXggaGVhZGVyICsgcmVjb3JkIGJsb2Nrcy4KICAgICAgICByZXR1cm4gY2xzLl9jcmVhdGVfaGVhZGVyKGluZm8sIFVTVEFSX0ZPUk1BVCwgImFzY2lpIiwgInJlcGxhY2UiKSArIFwKICAgICAgICAgICAgICAgIGNscy5fY3JlYXRlX3BheWxvYWQocmVjb3JkcykKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBmcm9tYnVmKGNscywgYnVmLCBlbmNvZGluZywgZXJyb3JzKToKICAgICAgICAiIiJDb25zdHJ1Y3QgYSBUYXJJbmZvIG9iamVjdCBmcm9tIGEgNTEyIGJ5dGUgYnl0ZXMgb2JqZWN0LgogICAgICAgICIiIgogICAgICAgIGlmIGxlbihidWYpID09IDA6CiAgICAgICAgICAgIHJhaXNlIEVtcHR5SGVhZGVyRXJyb3IoImVtcHR5IGhlYWRlciIpCiAgICAgICAgaWYgbGVuKGJ1ZikgIT0gQkxPQ0tTSVpFOgogICAgICAgICAgICByYWlzZSBUcnVuY2F0ZWRIZWFkZXJFcnJvcigidHJ1bmNhdGVkIGhlYWRlciIpCiAgICAgICAgaWYgYnVmLmNvdW50KE5VTCkgPT0gQkxPQ0tTSVpFOgogICAgICAgICAgICByYWlzZSBFT0ZIZWFkZXJFcnJvcigiZW5kIG9mIGZpbGUgaGVhZGVyIikKCiAgICAgICAgY2hrc3VtID0gbnRpKGJ1ZlsxNDg6MTU2XSkKICAgICAgICBpZiBjaGtzdW0gbm90IGluIGNhbGNfY2hrc3VtcyhidWYpOgogICAgICAgICAgICByYWlzZSBJbnZhbGlkSGVhZGVyRXJyb3IoImJhZCBjaGVja3N1bSIpCgogICAgICAgIG9iaiA9IGNscygpCiAgICAgICAgb2JqLm5hbWUgPSBudHMoYnVmWzA6MTAwXSwgZW5jb2RpbmcsIGVycm9ycykKICAgICAgICBvYmoubW9kZSA9IG50aShidWZbMTAwOjEwOF0pCiAgICAgICAgb2JqLnVpZCA9IG50aShidWZbMTA4OjExNl0pCiAgICAgICAgb2JqLmdpZCA9IG50aShidWZbMTE2OjEyNF0pCiAgICAgICAgb2JqLnNpemUgPSBudGkoYnVmWzEyNDoxMzZdKQogICAgICAgIG9iai5tdGltZSA9IG50aShidWZbMTM2OjE0OF0pCiAgICAgICAgb2JqLmNoa3N1bSA9IGNoa3N1bQogICAgICAgIG9iai50eXBlID0gYnVmWzE1NjoxNTddCiAgICAgICAgb2JqLmxpbmtuYW1lID0gbnRzKGJ1ZlsxNTc6MjU3XSwgZW5jb2RpbmcsIGVycm9ycykKICAgICAgICBvYmoudW5hbWUgPSBudHMoYnVmWzI2NToyOTddLCBlbmNvZGluZywgZXJyb3JzKQogICAgICAgIG9iai5nbmFtZSA9IG50cyhidWZbMjk3OjMyOV0sIGVuY29kaW5nLCBlcnJvcnMpCiAgICAgICAgb2JqLmRldm1ham9yID0gbnRpKGJ1ZlszMjk6MzM3XSkKICAgICAgICBvYmouZGV2bWlub3IgPSBudGkoYnVmWzMzNzozNDVdKQogICAgICAgIHByZWZpeCA9IG50cyhidWZbMzQ1OjUwMF0sIGVuY29kaW5nLCBlcnJvcnMpCgogICAgICAgICMgT2xkIFY3IHRhciBmb3JtYXQgcmVwcmVzZW50cyBhIGRpcmVjdG9yeSBhcyBhIHJlZ3VsYXIKICAgICAgICAjIGZpbGUgd2l0aCBhIHRyYWlsaW5nIHNsYXNoLgogICAgICAgIGlmIG9iai50eXBlID09IEFSRUdUWVBFIGFuZCBvYmoubmFtZS5lbmRzd2l0aCgiLyIpOgogICAgICAgICAgICBvYmoudHlwZSA9IERJUlRZUEUKCiAgICAgICAgIyBUaGUgb2xkIEdOVSBzcGFyc2UgZm9ybWF0IG9jY3VwaWVzIHNvbWUgb2YgdGhlIHVudXNlZAogICAgICAgICMgc3BhY2UgaW4gdGhlIGJ1ZmZlciBmb3IgdXAgdG8gNCBzcGFyc2Ugc3RydWN0dXJlcy4KICAgICAgICAjIFNhdmUgdGhlIHRoZW0gZm9yIGxhdGVyIHByb2Nlc3NpbmcgaW4gX3Byb2Nfc3BhcnNlKCkuCiAgICAgICAgaWYgb2JqLnR5cGUgPT0gR05VVFlQRV9TUEFSU0U6CiAgICAgICAgICAgIHBvcyA9IDM4NgogICAgICAgICAgICBzdHJ1Y3RzID0gW10KICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNCk6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gbnRpKGJ1Zltwb3M6cG9zICsgMTJdKQogICAgICAgICAgICAgICAgICAgIG51bWJ5dGVzID0gbnRpKGJ1Zltwb3MgKyAxMjpwb3MgKyAyNF0pCiAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgc3RydWN0cy5hcHBlbmQoKG9mZnNldCwgbnVtYnl0ZXMpKQogICAgICAgICAgICAgICAgcG9zICs9IDI0CiAgICAgICAgICAgIGlzZXh0ZW5kZWQgPSBib29sKGJ1Zls0ODJdKQogICAgICAgICAgICBvcmlnc2l6ZSA9IG50aShidWZbNDgzOjQ5NV0pCiAgICAgICAgICAgIG9iai5fc3BhcnNlX3N0cnVjdHMgPSAoc3RydWN0cywgaXNleHRlbmRlZCwgb3JpZ3NpemUpCgogICAgICAgICMgUmVtb3ZlIHJlZHVuZGFudCBzbGFzaGVzIGZyb20gZGlyZWN0b3JpZXMuCiAgICAgICAgaWYgb2JqLmlzZGlyKCk6CiAgICAgICAgICAgIG9iai5uYW1lID0gb2JqLm5hbWUucnN0cmlwKCIvIikKCiAgICAgICAgIyBSZWNvbnN0cnVjdCBhIHVzdGFyIGxvbmduYW1lLgogICAgICAgIGlmIHByZWZpeCBhbmQgb2JqLnR5cGUgbm90IGluIEdOVV9UWVBFUzoKICAgICAgICAgICAgb2JqLm5hbWUgPSBwcmVmaXggKyAiLyIgKyBvYmoubmFtZQogICAgICAgIHJldHVybiBvYmoKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBmcm9tdGFyZmlsZShjbHMsIHRhcmZpbGUpOgogICAgICAgICIiIlJldHVybiB0aGUgbmV4dCBUYXJJbmZvIG9iamVjdCBmcm9tIFRhckZpbGUgb2JqZWN0CiAgICAgICAgICAgdGFyZmlsZS4KICAgICAgICAiIiIKICAgICAgICBidWYgPSB0YXJmaWxlLmZpbGVvYmoucmVhZChCTE9DS1NJWkUpCiAgICAgICAgb2JqID0gY2xzLmZyb21idWYoYnVmLCB0YXJmaWxlLmVuY29kaW5nLCB0YXJmaWxlLmVycm9ycykKICAgICAgICBvYmoub2Zmc2V0ID0gdGFyZmlsZS5maWxlb2JqLnRlbGwoKSAtIEJMT0NLU0laRQogICAgICAgIHJldHVybiBvYmouX3Byb2NfbWVtYmVyKHRhcmZpbGUpCgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIFRoZSBmb2xsb3dpbmcgYXJlIG1ldGhvZHMgdGhhdCBhcmUgY2FsbGVkIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBhCiAgICAjIG1lbWJlci4gVGhlIGVudHJ5IHBvaW50IGlzIF9wcm9jX21lbWJlcigpIHdoaWNoIGNhbiBiZSBvdmVycmlkZGVuIGluIGEKICAgICMgc3ViY2xhc3MgdG8gYWRkIGN1c3RvbSBfcHJvY18qKCkgbWV0aG9kcy4gQSBfcHJvY18qKCkgbWV0aG9kIE1VU1QKICAgICMgaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcKICAgICMgb3BlcmF0aW9uczoKICAgICMgMS4gU2V0IHNlbGYub2Zmc2V0X2RhdGEgdG8gdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBkYXRhIGJsb2NrcyBiZWdpbiwKICAgICMgICAgaWYgdGhlcmUgaXMgZGF0YSB0aGF0IGZvbGxvd3MuCiAgICAjIDIuIFNldCB0YXJmaWxlLm9mZnNldCB0byB0aGUgcG9zaXRpb24gd2hlcmUgdGhlIG5leHQgbWVtYmVyJ3MgaGVhZGVyIHdpbGwKICAgICMgICAgYmVnaW4uCiAgICAjIDMuIFJldHVybiBzZWxmIG9yIGFub3RoZXIgdmFsaWQgVGFySW5mbyBvYmplY3QuCiAgICBkZWYgX3Byb2NfbWVtYmVyKHNlbGYsIHRhcmZpbGUpOgogICAgICAgICIiIkNob29zZSB0aGUgcmlnaHQgcHJvY2Vzc2luZyBtZXRob2QgZGVwZW5kaW5nIG9uCiAgICAgICAgICAgdGhlIHR5cGUgYW5kIGNhbGwgaXQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi50eXBlIGluIChHTlVUWVBFX0xPTkdOQU1FLCBHTlVUWVBFX0xPTkdMSU5LKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3Byb2NfZ251bG9uZyh0YXJmaWxlKQogICAgICAgIGVsaWYgc2VsZi50eXBlID09IEdOVVRZUEVfU1BBUlNFOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fcHJvY19zcGFyc2UodGFyZmlsZSkKICAgICAgICBlbGlmIHNlbGYudHlwZSBpbiAoWEhEVFlQRSwgWEdMVFlQRSwgU09MQVJJU19YSERUWVBFKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3Byb2NfcGF4KHRhcmZpbGUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3Byb2NfYnVpbHRpbih0YXJmaWxlKQoKICAgIGRlZiBfcHJvY19idWlsdGluKHNlbGYsIHRhcmZpbGUpOgogICAgICAgICIiIlByb2Nlc3MgYSBidWlsdGluIHR5cGUgb3IgYW4gdW5rbm93biB0eXBlIHdoaWNoCiAgICAgICAgICAgd2lsbCBiZSB0cmVhdGVkIGFzIGEgcmVndWxhciBmaWxlLgogICAgICAgICIiIgogICAgICAgIHNlbGYub2Zmc2V0X2RhdGEgPSB0YXJmaWxlLmZpbGVvYmoudGVsbCgpCiAgICAgICAgb2Zmc2V0ID0gc2VsZi5vZmZzZXRfZGF0YQogICAgICAgIGlmIHNlbGYuaXNyZWcoKSBvciBzZWxmLnR5cGUgbm90IGluIFNVUFBPUlRFRF9UWVBFUzoKICAgICAgICAgICAgIyBTa2lwIHRoZSBmb2xsb3dpbmcgZGF0YSBibG9ja3MuCiAgICAgICAgICAgIG9mZnNldCArPSBzZWxmLl9ibG9jayhzZWxmLnNpemUpCiAgICAgICAgdGFyZmlsZS5vZmZzZXQgPSBvZmZzZXQKCiAgICAgICAgIyBQYXRjaCB0aGUgVGFySW5mbyBvYmplY3Qgd2l0aCBzYXZlZCBnbG9iYWwKICAgICAgICAjIGhlYWRlciBpbmZvcm1hdGlvbi4KICAgICAgICBzZWxmLl9hcHBseV9wYXhfaW5mbyh0YXJmaWxlLnBheF9oZWFkZXJzLCB0YXJmaWxlLmVuY29kaW5nLCB0YXJmaWxlLmVycm9ycykKCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgX3Byb2NfZ251bG9uZyhzZWxmLCB0YXJmaWxlKToKICAgICAgICAiIiJQcm9jZXNzIHRoZSBibG9ja3MgdGhhdCBob2xkIGEgR05VIGxvbmduYW1lCiAgICAgICAgICAgb3IgbG9uZ2xpbmsgbWVtYmVyLgogICAgICAgICIiIgogICAgICAgIGJ1ZiA9IHRhcmZpbGUuZmlsZW9iai5yZWFkKHNlbGYuX2Jsb2NrKHNlbGYuc2l6ZSkpCgogICAgICAgICMgRmV0Y2ggdGhlIG5leHQgaGVhZGVyIGFuZCBwcm9jZXNzIGl0LgogICAgICAgIHRyeToKICAgICAgICAgICAgbmV4dCA9IHNlbGYuZnJvbXRhcmZpbGUodGFyZmlsZSkKICAgICAgICBleGNlcHQgSGVhZGVyRXJyb3I6CiAgICAgICAgICAgIHJhaXNlIFN1YnNlcXVlbnRIZWFkZXJFcnJvcigibWlzc2luZyBvciBiYWQgc3Vic2VxdWVudCBoZWFkZXIiKQoKICAgICAgICAjIFBhdGNoIHRoZSBUYXJJbmZvIG9iamVjdCBmcm9tIHRoZSBuZXh0IGhlYWRlciB3aXRoCiAgICAgICAgIyB0aGUgbG9uZ25hbWUgaW5mb3JtYXRpb24uCiAgICAgICAgbmV4dC5vZmZzZXQgPSBzZWxmLm9mZnNldAogICAgICAgIGlmIHNlbGYudHlwZSA9PSBHTlVUWVBFX0xPTkdOQU1FOgogICAgICAgICAgICBuZXh0Lm5hbWUgPSBudHMoYnVmLCB0YXJmaWxlLmVuY29kaW5nLCB0YXJmaWxlLmVycm9ycykKICAgICAgICBlbGlmIHNlbGYudHlwZSA9PSBHTlVUWVBFX0xPTkdMSU5LOgogICAgICAgICAgICBuZXh0LmxpbmtuYW1lID0gbnRzKGJ1ZiwgdGFyZmlsZS5lbmNvZGluZywgdGFyZmlsZS5lcnJvcnMpCgogICAgICAgIHJldHVybiBuZXh0CgogICAgZGVmIF9wcm9jX3NwYXJzZShzZWxmLCB0YXJmaWxlKToKICAgICAgICAiIiJQcm9jZXNzIGEgR05VIHNwYXJzZSBoZWFkZXIgcGx1cyBleHRyYSBoZWFkZXJzLgogICAgICAgICIiIgogICAgICAgICMgV2UgYWxyZWFkeSBjb2xsZWN0ZWQgc29tZSBzcGFyc2Ugc3RydWN0dXJlcyBpbiBmcm9tYnVmKCkuCiAgICAgICAgc3RydWN0cywgaXNleHRlbmRlZCwgb3JpZ3NpemUgPSBzZWxmLl9zcGFyc2Vfc3RydWN0cwogICAgICAgIGRlbCBzZWxmLl9zcGFyc2Vfc3RydWN0cwoKICAgICAgICAjIENvbGxlY3Qgc3BhcnNlIHN0cnVjdHVyZXMgZnJvbSBleHRlbmRlZCBoZWFkZXIgYmxvY2tzLgogICAgICAgIHdoaWxlIGlzZXh0ZW5kZWQ6CiAgICAgICAgICAgIGJ1ZiA9IHRhcmZpbGUuZmlsZW9iai5yZWFkKEJMT0NLU0laRSkKICAgICAgICAgICAgcG9zID0gMAogICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgyMSk6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gbnRpKGJ1Zltwb3M6cG9zICsgMTJdKQogICAgICAgICAgICAgICAgICAgIG51bWJ5dGVzID0gbnRpKGJ1Zltwb3MgKyAxMjpwb3MgKyAyNF0pCiAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgaWYgb2Zmc2V0IGFuZCBudW1ieXRlczoKICAgICAgICAgICAgICAgICAgICBzdHJ1Y3RzLmFwcGVuZCgob2Zmc2V0LCBudW1ieXRlcykpCiAgICAgICAgICAgICAgICBwb3MgKz0gMjQKICAgICAgICAgICAgaXNleHRlbmRlZCA9IGJvb2woYnVmWzUwNF0pCiAgICAgICAgc2VsZi5zcGFyc2UgPSBzdHJ1Y3RzCgogICAgICAgIHNlbGYub2Zmc2V0X2RhdGEgPSB0YXJmaWxlLmZpbGVvYmoudGVsbCgpCiAgICAgICAgdGFyZmlsZS5vZmZzZXQgPSBzZWxmLm9mZnNldF9kYXRhICsgc2VsZi5fYmxvY2soc2VsZi5zaXplKQogICAgICAgIHNlbGYuc2l6ZSA9IG9yaWdzaXplCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgX3Byb2NfcGF4KHNlbGYsIHRhcmZpbGUpOgogICAgICAgICIiIlByb2Nlc3MgYW4gZXh0ZW5kZWQgb3IgZ2xvYmFsIGhlYWRlciBhcyBkZXNjcmliZWQgaW4KICAgICAgICAgICBQT1NJWC4xLTIwMDguCiAgICAgICAgIiIiCiAgICAgICAgIyBSZWFkIHRoZSBoZWFkZXIgaW5mb3JtYXRpb24uCiAgICAgICAgYnVmID0gdGFyZmlsZS5maWxlb2JqLnJlYWQoc2VsZi5fYmxvY2soc2VsZi5zaXplKSkKCiAgICAgICAgIyBBIHBheCBoZWFkZXIgc3RvcmVzIHN1cHBsZW1lbnRhbCBpbmZvcm1hdGlvbiBmb3IgZWl0aGVyCiAgICAgICAgIyB0aGUgZm9sbG93aW5nIGZpbGUgKGV4dGVuZGVkKSBvciBhbGwgZm9sbG93aW5nIGZpbGVzCiAgICAgICAgIyAoZ2xvYmFsKS4KICAgICAgICBpZiBzZWxmLnR5cGUgPT0gWEdMVFlQRToKICAgICAgICAgICAgcGF4X2hlYWRlcnMgPSB0YXJmaWxlLnBheF9oZWFkZXJzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcGF4X2hlYWRlcnMgPSB0YXJmaWxlLnBheF9oZWFkZXJzLmNvcHkoKQoKICAgICAgICAjIENoZWNrIGlmIHRoZSBwYXggaGVhZGVyIGNvbnRhaW5zIGEgaGRyY2hhcnNldCBmaWVsZC4gVGhpcyB0ZWxscyB1cwogICAgICAgICMgdGhlIGVuY29kaW5nIG9mIHRoZSBwYXRoLCBsaW5rcGF0aCwgdW5hbWUgYW5kIGduYW1lIGZpZWxkcy4gTm9ybWFsbHksCiAgICAgICAgIyB0aGVzZSBmaWVsZHMgYXJlIFVURi04IGVuY29kZWQgYnV0IHNpbmNlIFBPU0lYLjEtMjAwOCB0YXIKICAgICAgICAjIGltcGxlbWVudGF0aW9ucyBhcmUgYWxsb3dlZCB0byBzdG9yZSB0aGVtIGFzIHJhdyBiaW5hcnkgc3RyaW5ncyBpZgogICAgICAgICMgdGhlIHRyYW5zbGF0aW9uIHRvIFVURi04IGZhaWxzLgogICAgICAgIG1hdGNoID0gcmUuc2VhcmNoKGJyIlxkKyBoZHJjaGFyc2V0PShbXlxuXSspXG4iLCBidWYpCiAgICAgICAgaWYgbWF0Y2ggaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHBheF9oZWFkZXJzWyJoZHJjaGFyc2V0Il0gPSBtYXRjaC5ncm91cCgxKS5kZWNvZGUoInV0ZjgiKQoKICAgICAgICAjIEZvciB0aGUgdGltZSBiZWluZywgd2UgZG9uJ3QgY2FyZSBhYm91dCBhbnl0aGluZyBvdGhlciB0aGFuICJCSU5BUlkiLgogICAgICAgICMgVGhlIG9ubHkgb3RoZXIgdmFsdWUgdGhhdCBpcyBjdXJyZW50bHkgYWxsb3dlZCBieSB0aGUgc3RhbmRhcmQgaXMKICAgICAgICAjICJJU08tSVIgMTA2NDYgMjAwMCBVVEYtOCIgaW4gb3RoZXIgd29yZHMgVVRGLTguCiAgICAgICAgaGRyY2hhcnNldCA9IHBheF9oZWFkZXJzLmdldCgiaGRyY2hhcnNldCIpCiAgICAgICAgaWYgaGRyY2hhcnNldCA9PSAiQklOQVJZIjoKICAgICAgICAgICAgZW5jb2RpbmcgPSB0YXJmaWxlLmVuY29kaW5nCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZW5jb2RpbmcgPSAidXRmOCIKCiAgICAgICAgIyBQYXJzZSBwYXggaGVhZGVyIGluZm9ybWF0aW9uLiBBIHJlY29yZCBsb29rcyBsaWtlIHRoYXQ6CiAgICAgICAgIyAiJWQgJXM9JXNcbiIgJSAobGVuZ3RoLCBrZXl3b3JkLCB2YWx1ZSkuIGxlbmd0aCBpcyB0aGUgc2l6ZQogICAgICAgICMgb2YgdGhlIGNvbXBsZXRlIHJlY29yZCBpbmNsdWRpbmcgdGhlIGxlbmd0aCBmaWVsZCBpdHNlbGYgYW5kCiAgICAgICAgIyB0aGUgbmV3bGluZS4ga2V5d29yZCBhbmQgdmFsdWUgYXJlIGJvdGggVVRGLTggZW5jb2RlZCBzdHJpbmdzLgogICAgICAgIHJlZ2V4ID0gcmUuY29tcGlsZShiciIoXGQrKSAoW149XSspPSIpCiAgICAgICAgcG9zID0gMAogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIG1hdGNoID0gcmVnZXgubWF0Y2goYnVmLCBwb3MpCiAgICAgICAgICAgIGlmIG5vdCBtYXRjaDoKICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgICAgICBsZW5ndGgsIGtleXdvcmQgPSBtYXRjaC5ncm91cHMoKQogICAgICAgICAgICBsZW5ndGggPSBpbnQobGVuZ3RoKQogICAgICAgICAgICB2YWx1ZSA9IGJ1ZlttYXRjaC5lbmQoMikgKyAxOm1hdGNoLnN0YXJ0KDEpICsgbGVuZ3RoIC0gMV0KCiAgICAgICAgICAgICMgTm9ybWFsbHksIHdlIGNvdWxkIGp1c3QgdXNlICJ1dGY4IiBhcyB0aGUgZW5jb2RpbmcgYW5kICJzdHJpY3QiCiAgICAgICAgICAgICMgYXMgdGhlIGVycm9yIGhhbmRsZXIsIGJ1dCB3ZSBiZXR0ZXIgbm90IHRha2UgdGhlIHJpc2suIEZvcgogICAgICAgICAgICAjIGV4YW1wbGUsIEdOVSB0YXIgPD0gMS4yMyBpcyBrbm93biB0byBzdG9yZSBmaWxlbmFtZXMgaXQgY2Fubm90CiAgICAgICAgICAgICMgdHJhbnNsYXRlIHRvIFVURi04IGFzIHJhdyBzdHJpbmdzICh1bmZvcnR1bmF0ZWx5IHdpdGhvdXQgYQogICAgICAgICAgICAjIGhkcmNoYXJzZXQ9QklOQVJZIGhlYWRlcikuCiAgICAgICAgICAgICMgV2UgZmlyc3QgdHJ5IHRoZSBzdHJpY3Qgc3RhbmRhcmQgZW5jb2RpbmcsIGFuZCBpZiB0aGF0IGZhaWxzIHdlCiAgICAgICAgICAgICMgZmFsbCBiYWNrIG9uIHRoZSB1c2VyJ3MgZW5jb2RpbmcgYW5kIGVycm9yIGhhbmRsZXIuCiAgICAgICAgICAgIGtleXdvcmQgPSBzZWxmLl9kZWNvZGVfcGF4X2ZpZWxkKGtleXdvcmQsICJ1dGY4IiwgInV0ZjgiLAogICAgICAgICAgICAgICAgICAgIHRhcmZpbGUuZXJyb3JzKQogICAgICAgICAgICBpZiBrZXl3b3JkIGluIFBBWF9OQU1FX0ZJRUxEUzoKICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZi5fZGVjb2RlX3BheF9maWVsZCh2YWx1ZSwgZW5jb2RpbmcsIHRhcmZpbGUuZW5jb2RpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmZpbGUuZXJyb3JzKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxmLl9kZWNvZGVfcGF4X2ZpZWxkKHZhbHVlLCAidXRmOCIsICJ1dGY4IiwKICAgICAgICAgICAgICAgICAgICAgICAgdGFyZmlsZS5lcnJvcnMpCgogICAgICAgICAgICBwYXhfaGVhZGVyc1trZXl3b3JkXSA9IHZhbHVlCiAgICAgICAgICAgIHBvcyArPSBsZW5ndGgKCiAgICAgICAgIyBGZXRjaCB0aGUgbmV4dCBoZWFkZXIuCiAgICAgICAgdHJ5OgogICAgICAgICAgICBuZXh0ID0gc2VsZi5mcm9tdGFyZmlsZSh0YXJmaWxlKQogICAgICAgIGV4Y2VwdCBIZWFkZXJFcnJvcjoKICAgICAgICAgICAgcmFpc2UgU3Vic2VxdWVudEhlYWRlckVycm9yKCJtaXNzaW5nIG9yIGJhZCBzdWJzZXF1ZW50IGhlYWRlciIpCgogICAgICAgICMgUHJvY2VzcyBHTlUgc3BhcnNlIGluZm9ybWF0aW9uLgogICAgICAgIGlmICJHTlUuc3BhcnNlLm1hcCIgaW4gcGF4X2hlYWRlcnM6CiAgICAgICAgICAgICMgR05VIGV4dGVuZGVkIHNwYXJzZSBmb3JtYXQgdmVyc2lvbiAwLjEuCiAgICAgICAgICAgIHNlbGYuX3Byb2NfZ251c3BhcnNlXzAxKG5leHQsIHBheF9oZWFkZXJzKQoKICAgICAgICBlbGlmICJHTlUuc3BhcnNlLnNpemUiIGluIHBheF9oZWFkZXJzOgogICAgICAgICAgICAjIEdOVSBleHRlbmRlZCBzcGFyc2UgZm9ybWF0IHZlcnNpb24gMC4wLgogICAgICAgICAgICBzZWxmLl9wcm9jX2dudXNwYXJzZV8wMChuZXh0LCBwYXhfaGVhZGVycywgYnVmKQoKICAgICAgICBlbGlmIHBheF9oZWFkZXJzLmdldCgiR05VLnNwYXJzZS5tYWpvciIpID09ICIxIiBhbmQgcGF4X2hlYWRlcnMuZ2V0KCJHTlUuc3BhcnNlLm1pbm9yIikgPT0gIjAiOgogICAgICAgICAgICAjIEdOVSBleHRlbmRlZCBzcGFyc2UgZm9ybWF0IHZlcnNpb24gMS4wLgogICAgICAgICAgICBzZWxmLl9wcm9jX2dudXNwYXJzZV8xMChuZXh0LCBwYXhfaGVhZGVycywgdGFyZmlsZSkKCiAgICAgICAgaWYgc2VsZi50eXBlIGluIChYSERUWVBFLCBTT0xBUklTX1hIRFRZUEUpOgogICAgICAgICAgICAjIFBhdGNoIHRoZSBUYXJJbmZvIG9iamVjdCB3aXRoIHRoZSBleHRlbmRlZCBoZWFkZXIgaW5mby4KICAgICAgICAgICAgbmV4dC5fYXBwbHlfcGF4X2luZm8ocGF4X2hlYWRlcnMsIHRhcmZpbGUuZW5jb2RpbmcsIHRhcmZpbGUuZXJyb3JzKQogICAgICAgICAgICBuZXh0Lm9mZnNldCA9IHNlbGYub2Zmc2V0CgogICAgICAgICAgICBpZiAic2l6ZSIgaW4gcGF4X2hlYWRlcnM6CiAgICAgICAgICAgICAgICAjIElmIHRoZSBleHRlbmRlZCBoZWFkZXIgcmVwbGFjZXMgdGhlIHNpemUgZmllbGQsCiAgICAgICAgICAgICAgICAjIHdlIG5lZWQgdG8gcmVjYWxjdWxhdGUgdGhlIG9mZnNldCB3aGVyZSB0aGUgbmV4dAogICAgICAgICAgICAgICAgIyBoZWFkZXIgc3RhcnRzLgogICAgICAgICAgICAgICAgb2Zmc2V0ID0gbmV4dC5vZmZzZXRfZGF0YQogICAgICAgICAgICAgICAgaWYgbmV4dC5pc3JlZygpIG9yIG5leHQudHlwZSBub3QgaW4gU1VQUE9SVEVEX1RZUEVTOgogICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBuZXh0Ll9ibG9jayhuZXh0LnNpemUpCiAgICAgICAgICAgICAgICB0YXJmaWxlLm9mZnNldCA9IG9mZnNldAoKICAgICAgICByZXR1cm4gbmV4dAoKICAgIGRlZiBfcHJvY19nbnVzcGFyc2VfMDAoc2VsZiwgbmV4dCwgcGF4X2hlYWRlcnMsIGJ1Zik6CiAgICAgICAgIiIiUHJvY2VzcyBhIEdOVSB0YXIgZXh0ZW5kZWQgc3BhcnNlIGhlYWRlciwgdmVyc2lvbiAwLjAuCiAgICAgICAgIiIiCiAgICAgICAgb2Zmc2V0cyA9IFtdCiAgICAgICAgZm9yIG1hdGNoIGluIHJlLmZpbmRpdGVyKGJyIlxkKyBHTlUuc3BhcnNlLm9mZnNldD0oXGQrKVxuIiwgYnVmKToKICAgICAgICAgICAgb2Zmc2V0cy5hcHBlbmQoaW50KG1hdGNoLmdyb3VwKDEpKSkKICAgICAgICBudW1ieXRlcyA9IFtdCiAgICAgICAgZm9yIG1hdGNoIGluIHJlLmZpbmRpdGVyKGJyIlxkKyBHTlUuc3BhcnNlLm51bWJ5dGVzPShcZCspXG4iLCBidWYpOgogICAgICAgICAgICBudW1ieXRlcy5hcHBlbmQoaW50KG1hdGNoLmdyb3VwKDEpKSkKICAgICAgICBuZXh0LnNwYXJzZSA9IGxpc3QoemlwKG9mZnNldHMsIG51bWJ5dGVzKSkKCiAgICBkZWYgX3Byb2NfZ251c3BhcnNlXzAxKHNlbGYsIG5leHQsIHBheF9oZWFkZXJzKToKICAgICAgICAiIiJQcm9jZXNzIGEgR05VIHRhciBleHRlbmRlZCBzcGFyc2UgaGVhZGVyLCB2ZXJzaW9uIDAuMS4KICAgICAgICAiIiIKICAgICAgICBzcGFyc2UgPSBbaW50KHgpIGZvciB4IGluIHBheF9oZWFkZXJzWyJHTlUuc3BhcnNlLm1hcCJdLnNwbGl0KCIsIildCiAgICAgICAgbmV4dC5zcGFyc2UgPSBsaXN0KHppcChzcGFyc2VbOjoyXSwgc3BhcnNlWzE6OjJdKSkKCiAgICBkZWYgX3Byb2NfZ251c3BhcnNlXzEwKHNlbGYsIG5leHQsIHBheF9oZWFkZXJzLCB0YXJmaWxlKToKICAgICAgICAiIiJQcm9jZXNzIGEgR05VIHRhciBleHRlbmRlZCBzcGFyc2UgaGVhZGVyLCB2ZXJzaW9uIDEuMC4KICAgICAgICAiIiIKICAgICAgICBmaWVsZHMgPSBOb25lCiAgICAgICAgc3BhcnNlID0gW10KICAgICAgICBidWYgPSB0YXJmaWxlLmZpbGVvYmoucmVhZChCTE9DS1NJWkUpCiAgICAgICAgZmllbGRzLCBidWYgPSBidWYuc3BsaXQoYiJcbiIsIDEpCiAgICAgICAgZmllbGRzID0gaW50KGZpZWxkcykKICAgICAgICB3aGlsZSBsZW4oc3BhcnNlKSA8IGZpZWxkcyAqIDI6CiAgICAgICAgICAgIGlmIGIiXG4iIG5vdCBpbiBidWY6CiAgICAgICAgICAgICAgICBidWYgKz0gdGFyZmlsZS5maWxlb2JqLnJlYWQoQkxPQ0tTSVpFKQogICAgICAgICAgICBudW1iZXIsIGJ1ZiA9IGJ1Zi5zcGxpdChiIlxuIiwgMSkKICAgICAgICAgICAgc3BhcnNlLmFwcGVuZChpbnQobnVtYmVyKSkKICAgICAgICBuZXh0Lm9mZnNldF9kYXRhID0gdGFyZmlsZS5maWxlb2JqLnRlbGwoKQogICAgICAgIG5leHQuc3BhcnNlID0gbGlzdCh6aXAoc3BhcnNlWzo6Ml0sIHNwYXJzZVsxOjoyXSkpCgogICAgZGVmIF9hcHBseV9wYXhfaW5mbyhzZWxmLCBwYXhfaGVhZGVycywgZW5jb2RpbmcsIGVycm9ycyk6CiAgICAgICAgIiIiUmVwbGFjZSBmaWVsZHMgd2l0aCBzdXBwbGVtZW50YWwgaW5mb3JtYXRpb24gZnJvbSBhIHByZXZpb3VzCiAgICAgICAgICAgcGF4IGV4dGVuZGVkIG9yIGdsb2JhbCBoZWFkZXIuCiAgICAgICAgIiIiCiAgICAgICAgZm9yIGtleXdvcmQsIHZhbHVlIGluIHBheF9oZWFkZXJzLml0ZW1zKCk6CiAgICAgICAgICAgIGlmIGtleXdvcmQgPT0gIkdOVS5zcGFyc2UubmFtZSI6CiAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsICJwYXRoIiwgdmFsdWUpCiAgICAgICAgICAgIGVsaWYga2V5d29yZCA9PSAiR05VLnNwYXJzZS5zaXplIjoKICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgInNpemUiLCBpbnQodmFsdWUpKQogICAgICAgICAgICBlbGlmIGtleXdvcmQgPT0gIkdOVS5zcGFyc2UucmVhbHNpemUiOgogICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLCAic2l6ZSIsIGludCh2YWx1ZSkpCiAgICAgICAgICAgIGVsaWYga2V5d29yZCBpbiBQQVhfRklFTERTOgogICAgICAgICAgICAgICAgaWYga2V5d29yZCBpbiBQQVhfTlVNQkVSX0ZJRUxEUzoKICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gUEFYX05VTUJFUl9GSUVMRFNba2V5d29yZF0odmFsdWUpCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gMAogICAgICAgICAgICAgICAgaWYga2V5d29yZCA9PSAicGF0aCI6CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yc3RyaXAoIi8iKQogICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBrZXl3b3JkLCB2YWx1ZSkKCiAgICAgICAgc2VsZi5wYXhfaGVhZGVycyA9IHBheF9oZWFkZXJzLmNvcHkoKQoKICAgIGRlZiBfZGVjb2RlX3BheF9maWVsZChzZWxmLCB2YWx1ZSwgZW5jb2RpbmcsIGZhbGxiYWNrX2VuY29kaW5nLCBmYWxsYmFja19lcnJvcnMpOgogICAgICAgICIiIkRlY29kZSBhIHNpbmdsZSBmaWVsZCBmcm9tIGEgcGF4IHJlY29yZC4KICAgICAgICAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5kZWNvZGUoZW5jb2RpbmcsICJzdHJpY3QiKQogICAgICAgIGV4Y2VwdCBVbmljb2RlRGVjb2RlRXJyb3I6CiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5kZWNvZGUoZmFsbGJhY2tfZW5jb2RpbmcsIGZhbGxiYWNrX2Vycm9ycykKCiAgICBkZWYgX2Jsb2NrKHNlbGYsIGNvdW50KToKICAgICAgICAiIiJSb3VuZCB1cCBhIGJ5dGUgY291bnQgYnkgQkxPQ0tTSVpFIGFuZCByZXR1cm4gaXQsCiAgICAgICAgICAgZS5nLiBfYmxvY2soODM0KSA9PiAxMDI0LgogICAgICAgICIiIgogICAgICAgIGJsb2NrcywgcmVtYWluZGVyID0gZGl2bW9kKGNvdW50LCBCTE9DS1NJWkUpCiAgICAgICAgaWYgcmVtYWluZGVyOgogICAgICAgICAgICBibG9ja3MgKz0gMQogICAgICAgIHJldHVybiBibG9ja3MgKiBCTE9DS1NJWkUKCiAgICBkZWYgaXNyZWcoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYudHlwZSBpbiBSRUdVTEFSX1RZUEVTCiAgICBkZWYgaXNmaWxlKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmlzcmVnKCkKICAgIGRlZiBpc2RpcihzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi50eXBlID09IERJUlRZUEUKICAgIGRlZiBpc3N5bShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi50eXBlID09IFNZTVRZUEUKICAgIGRlZiBpc2xuayhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi50eXBlID09IExOS1RZUEUKICAgIGRlZiBpc2NocihzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi50eXBlID09IENIUlRZUEUKICAgIGRlZiBpc2JsayhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi50eXBlID09IEJMS1RZUEUKICAgIGRlZiBpc2ZpZm8oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYudHlwZSA9PSBGSUZPVFlQRQogICAgZGVmIGlzc3BhcnNlKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnNwYXJzZSBpcyBub3QgTm9uZQogICAgZGVmIGlzZGV2KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnR5cGUgaW4gKENIUlRZUEUsIEJMS1RZUEUsIEZJRk9UWVBFKQojIGNsYXNzIFRhckluZm8KCmNsYXNzIFRhckZpbGUob2JqZWN0KToKICAgICIiIlRoZSBUYXJGaWxlIENsYXNzIHByb3ZpZGVzIGFuIGludGVyZmFjZSB0byB0YXIgYXJjaGl2ZXMuCiAgICAiIiIKCiAgICBkZWJ1ZyA9IDAgICAgICAgICAgICAgICAgICAgIyBNYXkgYmUgc2V0IGZyb20gMCAobm8gbXNncykgdG8gMyAoYWxsIG1zZ3MpCgogICAgZGVyZWZlcmVuY2UgPSBGYWxzZSAgICAgICAgICMgSWYgdHJ1ZSwgYWRkIGNvbnRlbnQgb2YgbGlua2VkIGZpbGUgdG8gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0YXIgZmlsZSwgZWxzZSB0aGUgbGluay4KCiAgICBpZ25vcmVfemVyb3MgPSBGYWxzZSAgICAgICAgIyBJZiB0cnVlLCBza2lwcyBlbXB0eSBvciBpbnZhbGlkIGJsb2NrcyBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGNvbnRpbnVlcyBwcm9jZXNzaW5nLgoKICAgIGVycm9ybGV2ZWwgPSAxICAgICAgICAgICAgICAjIElmIDAsIGZhdGFsIGVycm9ycyBvbmx5IGFwcGVhciBpbiBkZWJ1ZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbWVzc2FnZXMgKGlmIGRlYnVnID49IDApLiBJZiA+IDAsIGVycm9ycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYXJlIHBhc3NlZCB0byB0aGUgY2FsbGVyIGFzIGV4Y2VwdGlvbnMuCgogICAgZm9ybWF0ID0gREVGQVVMVF9GT1JNQVQgICAgICMgVGhlIGZvcm1hdCB0byB1c2Ugd2hlbiBjcmVhdGluZyBhbiBhcmNoaXZlLgoKICAgIGVuY29kaW5nID0gRU5DT0RJTkcgICAgICAgICAjIEVuY29kaW5nIGZvciA4LWJpdCBjaGFyYWN0ZXIgc3RyaW5ncy4KCiAgICBlcnJvcnMgPSBOb25lICAgICAgICAgICAgICAgIyBFcnJvciBoYW5kbGVyIGZvciB1bmljb2RlIGNvbnZlcnNpb24uCgogICAgdGFyaW5mbyA9IFRhckluZm8gICAgICAgICAgICMgVGhlIGRlZmF1bHQgVGFySW5mbyBjbGFzcyB0byB1c2UuCgogICAgZmlsZW9iamVjdCA9IEV4RmlsZU9iamVjdCAgICMgVGhlIGRlZmF1bHQgRXhGaWxlT2JqZWN0IGNsYXNzIHRvIHVzZS4KCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZT1Ob25lLCBtb2RlPSJyIiwgZmlsZW9iaj1Ob25lLCBmb3JtYXQ9Tm9uZSwKICAgICAgICAgICAgdGFyaW5mbz1Ob25lLCBkZXJlZmVyZW5jZT1Ob25lLCBpZ25vcmVfemVyb3M9Tm9uZSwgZW5jb2Rpbmc9Tm9uZSwKICAgICAgICAgICAgZXJyb3JzPSJzdXJyb2dhdGVlc2NhcGUiLCBwYXhfaGVhZGVycz1Ob25lLCBkZWJ1Zz1Ob25lLCBlcnJvcmxldmVsPU5vbmUpOgogICAgICAgICIiIk9wZW4gYW4gKHVuY29tcHJlc3NlZCkgdGFyIGFyY2hpdmUgYG5hbWUnLiBgbW9kZScgaXMgZWl0aGVyICdyJyB0bwogICAgICAgICAgIHJlYWQgZnJvbSBhbiBleGlzdGluZyBhcmNoaXZlLCAnYScgdG8gYXBwZW5kIGRhdGEgdG8gYW4gZXhpc3RpbmcKICAgICAgICAgICBmaWxlIG9yICd3JyB0byBjcmVhdGUgYSBuZXcgZmlsZSBvdmVyd3JpdGluZyBhbiBleGlzdGluZyBvbmUuIGBtb2RlJwogICAgICAgICAgIGRlZmF1bHRzIHRvICdyJy4KICAgICAgICAgICBJZiBgZmlsZW9iaicgaXMgZ2l2ZW4sIGl0IGlzIHVzZWQgZm9yIHJlYWRpbmcgb3Igd3JpdGluZyBkYXRhLiBJZiBpdAogICAgICAgICAgIGNhbiBiZSBkZXRlcm1pbmVkLCBgbW9kZScgaXMgb3ZlcnJpZGRlbiBieSBgZmlsZW9iaidzIG1vZGUuCiAgICAgICAgICAgYGZpbGVvYmonIGlzIG5vdCBjbG9zZWQsIHdoZW4gVGFyRmlsZSBpcyBjbG9zZWQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgbGVuKG1vZGUpID4gMSBvciBtb2RlIG5vdCBpbiAicmF3IjoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibW9kZSBtdXN0IGJlICdyJywgJ2EnIG9yICd3JyIpCiAgICAgICAgc2VsZi5tb2RlID0gbW9kZQogICAgICAgIHNlbGYuX21vZGUgPSB7InIiOiAicmIiLCAiYSI6ICJyK2IiLCAidyI6ICJ3YiJ9W21vZGVdCgogICAgICAgIGlmIG5vdCBmaWxlb2JqOgogICAgICAgICAgICBpZiBzZWxmLm1vZGUgPT0gImEiIGFuZCBub3Qgb3MucGF0aC5leGlzdHMobmFtZSk6CiAgICAgICAgICAgICAgICAjIENyZWF0ZSBub25leGlzdGVudCBmaWxlcyBpbiBhcHBlbmQgbW9kZS4KICAgICAgICAgICAgICAgIHNlbGYubW9kZSA9ICJ3IgogICAgICAgICAgICAgICAgc2VsZi5fbW9kZSA9ICJ3YiIKICAgICAgICAgICAgZmlsZW9iaiA9IGJsdG5fb3BlbihuYW1lLCBzZWxmLl9tb2RlKQogICAgICAgICAgICBzZWxmLl9leHRmaWxlb2JqID0gRmFsc2UKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBuYW1lIGlzIE5vbmUgYW5kIGhhc2F0dHIoZmlsZW9iaiwgIm5hbWUiKToKICAgICAgICAgICAgICAgIG5hbWUgPSBmaWxlb2JqLm5hbWUKICAgICAgICAgICAgaWYgaGFzYXR0cihmaWxlb2JqLCAibW9kZSIpOgogICAgICAgICAgICAgICAgc2VsZi5fbW9kZSA9IGZpbGVvYmoubW9kZQogICAgICAgICAgICBzZWxmLl9leHRmaWxlb2JqID0gVHJ1ZQogICAgICAgIHNlbGYubmFtZSA9IG9zLnBhdGguYWJzcGF0aChuYW1lKSBpZiBuYW1lIGVsc2UgTm9uZQogICAgICAgIHNlbGYuZmlsZW9iaiA9IGZpbGVvYmoKCiAgICAgICAgIyBJbml0IGF0dHJpYnV0ZXMuCiAgICAgICAgaWYgZm9ybWF0IGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLmZvcm1hdCA9IGZvcm1hdAogICAgICAgIGlmIHRhcmluZm8gaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYudGFyaW5mbyA9IHRhcmluZm8KICAgICAgICBpZiBkZXJlZmVyZW5jZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5kZXJlZmVyZW5jZSA9IGRlcmVmZXJlbmNlCiAgICAgICAgaWYgaWdub3JlX3plcm9zIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLmlnbm9yZV96ZXJvcyA9IGlnbm9yZV96ZXJvcwogICAgICAgIGlmIGVuY29kaW5nIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLmVuY29kaW5nID0gZW5jb2RpbmcKICAgICAgICBzZWxmLmVycm9ycyA9IGVycm9ycwoKICAgICAgICBpZiBwYXhfaGVhZGVycyBpcyBub3QgTm9uZSBhbmQgc2VsZi5mb3JtYXQgPT0gUEFYX0ZPUk1BVDoKICAgICAgICAgICAgc2VsZi5wYXhfaGVhZGVycyA9IHBheF9oZWFkZXJzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5wYXhfaGVhZGVycyA9IHt9CgogICAgICAgIGlmIGRlYnVnIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLmRlYnVnID0gZGVidWcKICAgICAgICBpZiBlcnJvcmxldmVsIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLmVycm9ybGV2ZWwgPSBlcnJvcmxldmVsCgogICAgICAgICMgSW5pdCBkYXRhc3RydWN0dXJlcy4KICAgICAgICBzZWxmLmNsb3NlZCA9IEZhbHNlCiAgICAgICAgc2VsZi5tZW1iZXJzID0gW10gICAgICAgIyBsaXN0IG9mIG1lbWJlcnMgYXMgVGFySW5mbyBvYmplY3RzCiAgICAgICAgc2VsZi5fbG9hZGVkID0gRmFsc2UgICAgIyBmbGFnIGlmIGFsbCBtZW1iZXJzIGhhdmUgYmVlbiByZWFkCiAgICAgICAgc2VsZi5vZmZzZXQgPSBzZWxmLmZpbGVvYmoudGVsbCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBhcmNoaXZlIGZpbGUKICAgICAgICBzZWxmLmlub2RlcyA9IHt9ICAgICAgICAjIGRpY3Rpb25hcnkgY2FjaGluZyB0aGUgaW5vZGVzIG9mCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhcmNoaXZlIG1lbWJlcnMgYWxyZWFkeSBhZGRlZAoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGlmIHNlbGYubW9kZSA9PSAiciI6CiAgICAgICAgICAgICAgICBzZWxmLmZpcnN0bWVtYmVyID0gTm9uZQogICAgICAgICAgICAgICAgc2VsZi5maXJzdG1lbWJlciA9IHNlbGYubmV4dCgpCgogICAgICAgICAgICBpZiBzZWxmLm1vZGUgPT0gImEiOgogICAgICAgICAgICAgICAgIyBNb3ZlIHRvIHRoZSBlbmQgb2YgdGhlIGFyY2hpdmUsCiAgICAgICAgICAgICAgICAjIGJlZm9yZSB0aGUgZmlyc3QgZW1wdHkgYmxvY2suCiAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZW9iai5zZWVrKHNlbGYub2Zmc2V0KQogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyaW5mby5mcm9tdGFyZmlsZShzZWxmKQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm1lbWJlcnMuYXBwZW5kKHRhcmluZm8pCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEVPRkhlYWRlckVycm9yOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGVvYmouc2VlayhzZWxmLm9mZnNldCkKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICAgICBleGNlcHQgSGVhZGVyRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgUmVhZEVycm9yKHN0cihlKSkKCiAgICAgICAgICAgIGlmIHNlbGYubW9kZSBpbiAiYXciOgogICAgICAgICAgICAgICAgc2VsZi5fbG9hZGVkID0gVHJ1ZQoKICAgICAgICAgICAgICAgIGlmIHNlbGYucGF4X2hlYWRlcnM6CiAgICAgICAgICAgICAgICAgICAgYnVmID0gc2VsZi50YXJpbmZvLmNyZWF0ZV9wYXhfZ2xvYmFsX2hlYWRlcihzZWxmLnBheF9oZWFkZXJzLmNvcHkoKSkKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUoYnVmKQogICAgICAgICAgICAgICAgICAgIHNlbGYub2Zmc2V0ICs9IGxlbihidWYpCiAgICAgICAgZXhjZXB0OgogICAgICAgICAgICBpZiBub3Qgc2VsZi5fZXh0ZmlsZW9iajoKICAgICAgICAgICAgICAgIHNlbGYuZmlsZW9iai5jbG9zZSgpCiAgICAgICAgICAgIHNlbGYuY2xvc2VkID0gVHJ1ZQogICAgICAgICAgICByYWlzZQoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBCZWxvdyBhcmUgdGhlIGNsYXNzbWV0aG9kcyB3aGljaCBhY3QgYXMgYWx0ZXJuYXRlIGNvbnN0cnVjdG9ycyB0byB0aGUKICAgICMgVGFyRmlsZSBjbGFzcy4gVGhlIG9wZW4oKSBtZXRob2QgaXMgdGhlIG9ubHkgb25lIHRoYXQgaXMgbmVlZGVkIGZvcgogICAgIyBwdWJsaWMgdXNlOyBpdCBpcyB0aGUgInN1cGVyIi1jb25zdHJ1Y3RvciBhbmQgaXMgYWJsZSB0byBzZWxlY3QgYW4KICAgICMgYWRlcXVhdGUgInN1YiItY29uc3RydWN0b3IgZm9yIGEgcGFydGljdWxhciBjb21wcmVzc2lvbiB1c2luZyB0aGUgbWFwcGluZwogICAgIyBmcm9tIE9QRU5fTUVUSC4KICAgICMKICAgICMgVGhpcyBjb25jZXB0IGFsbG93cyBvbmUgdG8gc3ViY2xhc3MgVGFyRmlsZSB3aXRob3V0IGxvc2luZyB0aGUgY29tZm9ydCBvZgogICAgIyB0aGUgc3VwZXItY29uc3RydWN0b3IuIEEgc3ViLWNvbnN0cnVjdG9yIGlzIHJlZ2lzdGVyZWQgYW5kIG1hZGUgYXZhaWxhYmxlCiAgICAjIGJ5IGFkZGluZyBpdCB0byB0aGUgbWFwcGluZyBpbiBPUEVOX01FVEguCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgb3BlbihjbHMsIG5hbWU9Tm9uZSwgbW9kZT0iciIsIGZpbGVvYmo9Tm9uZSwgYnVmc2l6ZT1SRUNPUkRTSVpFLCAqKmt3YXJncyk6CiAgICAgICAgIiIiT3BlbiBhIHRhciBhcmNoaXZlIGZvciByZWFkaW5nLCB3cml0aW5nIG9yIGFwcGVuZGluZy4gUmV0dXJuCiAgICAgICAgICAgYW4gYXBwcm9wcmlhdGUgVGFyRmlsZSBjbGFzcy4KCiAgICAgICAgICAgbW9kZToKICAgICAgICAgICAncicgb3IgJ3I6Kicgb3BlbiBmb3IgcmVhZGluZyB3aXRoIHRyYW5zcGFyZW50IGNvbXByZXNzaW9uCiAgICAgICAgICAgJ3I6JyAgICAgICAgIG9wZW4gZm9yIHJlYWRpbmcgZXhjbHVzaXZlbHkgdW5jb21wcmVzc2VkCiAgICAgICAgICAgJ3I6Z3onICAgICAgIG9wZW4gZm9yIHJlYWRpbmcgd2l0aCBnemlwIGNvbXByZXNzaW9uCiAgICAgICAgICAgJ3I6YnoyJyAgICAgIG9wZW4gZm9yIHJlYWRpbmcgd2l0aCBiemlwMiBjb21wcmVzc2lvbgogICAgICAgICAgICdhJyBvciAnYTonICBvcGVuIGZvciBhcHBlbmRpbmcsIGNyZWF0aW5nIHRoZSBmaWxlIGlmIG5lY2Vzc2FyeQogICAgICAgICAgICd3JyBvciAndzonICBvcGVuIGZvciB3cml0aW5nIHdpdGhvdXQgY29tcHJlc3Npb24KICAgICAgICAgICAndzpneicgICAgICAgb3BlbiBmb3Igd3JpdGluZyB3aXRoIGd6aXAgY29tcHJlc3Npb24KICAgICAgICAgICAndzpiejInICAgICAgb3BlbiBmb3Igd3JpdGluZyB3aXRoIGJ6aXAyIGNvbXByZXNzaW9uCgogICAgICAgICAgICdyfConICAgICAgICBvcGVuIGEgc3RyZWFtIG9mIHRhciBibG9ja3Mgd2l0aCB0cmFuc3BhcmVudCBjb21wcmVzc2lvbgogICAgICAgICAgICdyfCcgICAgICAgICBvcGVuIGFuIHVuY29tcHJlc3NlZCBzdHJlYW0gb2YgdGFyIGJsb2NrcyBmb3IgcmVhZGluZwogICAgICAgICAgICdyfGd6JyAgICAgICBvcGVuIGEgZ3ppcCBjb21wcmVzc2VkIHN0cmVhbSBvZiB0YXIgYmxvY2tzCiAgICAgICAgICAgJ3J8YnoyJyAgICAgIG9wZW4gYSBiemlwMiBjb21wcmVzc2VkIHN0cmVhbSBvZiB0YXIgYmxvY2tzCiAgICAgICAgICAgJ3d8JyAgICAgICAgIG9wZW4gYW4gdW5jb21wcmVzc2VkIHN0cmVhbSBmb3Igd3JpdGluZwogICAgICAgICAgICd3fGd6JyAgICAgICBvcGVuIGEgZ3ppcCBjb21wcmVzc2VkIHN0cmVhbSBmb3Igd3JpdGluZwogICAgICAgICAgICd3fGJ6MicgICAgICBvcGVuIGEgYnppcDIgY29tcHJlc3NlZCBzdHJlYW0gZm9yIHdyaXRpbmcKICAgICAgICAiIiIKCiAgICAgICAgaWYgbm90IG5hbWUgYW5kIG5vdCBmaWxlb2JqOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJub3RoaW5nIHRvIG9wZW4iKQoKICAgICAgICBpZiBtb2RlIGluICgiciIsICJyOioiKToKICAgICAgICAgICAgIyBGaW5kIG91dCB3aGljaCAqb3BlbigpIGlzIGFwcHJvcHJpYXRlIGZvciBvcGVuaW5nIHRoZSBmaWxlLgogICAgICAgICAgICBmb3IgY29tcHR5cGUgaW4gY2xzLk9QRU5fTUVUSDoKICAgICAgICAgICAgICAgIGZ1bmMgPSBnZXRhdHRyKGNscywgY2xzLk9QRU5fTUVUSFtjb21wdHlwZV0pCiAgICAgICAgICAgICAgICBpZiBmaWxlb2JqIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgIHNhdmVkX3BvcyA9IGZpbGVvYmoudGVsbCgpCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmMobmFtZSwgInIiLCBmaWxlb2JqLCAqKmt3YXJncykKICAgICAgICAgICAgICAgIGV4Y2VwdCAoUmVhZEVycm9yLCBDb21wcmVzc2lvbkVycm9yKSBhcyBlOgogICAgICAgICAgICAgICAgICAgIGlmIGZpbGVvYmogaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVvYmouc2VlayhzYXZlZF9wb3MpCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgcmFpc2UgUmVhZEVycm9yKCJmaWxlIGNvdWxkIG5vdCBiZSBvcGVuZWQgc3VjY2Vzc2Z1bGx5IikKCiAgICAgICAgZWxpZiAiOiIgaW4gbW9kZToKICAgICAgICAgICAgZmlsZW1vZGUsIGNvbXB0eXBlID0gbW9kZS5zcGxpdCgiOiIsIDEpCiAgICAgICAgICAgIGZpbGVtb2RlID0gZmlsZW1vZGUgb3IgInIiCiAgICAgICAgICAgIGNvbXB0eXBlID0gY29tcHR5cGUgb3IgInRhciIKCiAgICAgICAgICAgICMgU2VsZWN0IHRoZSAqb3BlbigpIGZ1bmN0aW9uIGFjY29yZGluZyB0bwogICAgICAgICAgICAjIGdpdmVuIGNvbXByZXNzaW9uLgogICAgICAgICAgICBpZiBjb21wdHlwZSBpbiBjbHMuT1BFTl9NRVRIOgogICAgICAgICAgICAgICAgZnVuYyA9IGdldGF0dHIoY2xzLCBjbHMuT1BFTl9NRVRIW2NvbXB0eXBlXSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJhaXNlIENvbXByZXNzaW9uRXJyb3IoInVua25vd24gY29tcHJlc3Npb24gdHlwZSAlciIgJSBjb21wdHlwZSkKICAgICAgICAgICAgcmV0dXJuIGZ1bmMobmFtZSwgZmlsZW1vZGUsIGZpbGVvYmosICoqa3dhcmdzKQoKICAgICAgICBlbGlmICJ8IiBpbiBtb2RlOgogICAgICAgICAgICBmaWxlbW9kZSwgY29tcHR5cGUgPSBtb2RlLnNwbGl0KCJ8IiwgMSkKICAgICAgICAgICAgZmlsZW1vZGUgPSBmaWxlbW9kZSBvciAiciIKICAgICAgICAgICAgY29tcHR5cGUgPSBjb21wdHlwZSBvciAidGFyIgoKICAgICAgICAgICAgaWYgZmlsZW1vZGUgbm90IGluICJydyI6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJtb2RlIG11c3QgYmUgJ3InIG9yICd3JyIpCgogICAgICAgICAgICBzdHJlYW0gPSBfU3RyZWFtKG5hbWUsIGZpbGVtb2RlLCBjb21wdHlwZSwgZmlsZW9iaiwgYnVmc2l6ZSkKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgdCA9IGNscyhuYW1lLCBmaWxlbW9kZSwgc3RyZWFtLCAqKmt3YXJncykKICAgICAgICAgICAgZXhjZXB0OgogICAgICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCkKICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgIHQuX2V4dGZpbGVvYmogPSBGYWxzZQogICAgICAgICAgICByZXR1cm4gdAoKICAgICAgICBlbGlmIG1vZGUgaW4gImF3IjoKICAgICAgICAgICAgcmV0dXJuIGNscy50YXJvcGVuKG5hbWUsIG1vZGUsIGZpbGVvYmosICoqa3dhcmdzKQoKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ1bmRpc2Nlcm5pYmxlIG1vZGUiKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIHRhcm9wZW4oY2xzLCBuYW1lLCBtb2RlPSJyIiwgZmlsZW9iaj1Ob25lLCAqKmt3YXJncyk6CiAgICAgICAgIiIiT3BlbiB1bmNvbXByZXNzZWQgdGFyIGFyY2hpdmUgbmFtZSBmb3IgcmVhZGluZyBvciB3cml0aW5nLgogICAgICAgICIiIgogICAgICAgIGlmIGxlbihtb2RlKSA+IDEgb3IgbW9kZSBub3QgaW4gInJhdyI6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm1vZGUgbXVzdCBiZSAncicsICdhJyBvciAndyciKQogICAgICAgIHJldHVybiBjbHMobmFtZSwgbW9kZSwgZmlsZW9iaiwgKiprd2FyZ3MpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZ3pvcGVuKGNscywgbmFtZSwgbW9kZT0iciIsIGZpbGVvYmo9Tm9uZSwgY29tcHJlc3NsZXZlbD05LCAqKmt3YXJncyk6CiAgICAgICAgIiIiT3BlbiBnemlwIGNvbXByZXNzZWQgdGFyIGFyY2hpdmUgbmFtZSBmb3IgcmVhZGluZyBvciB3cml0aW5nLgogICAgICAgICAgIEFwcGVuZGluZyBpcyBub3QgYWxsb3dlZC4KICAgICAgICAiIiIKICAgICAgICBpZiBsZW4obW9kZSkgPiAxIG9yIG1vZGUgbm90IGluICJydyI6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm1vZGUgbXVzdCBiZSAncicgb3IgJ3cnIikKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBpbXBvcnQgZ3ppcAogICAgICAgICAgICBnemlwLkd6aXBGaWxlCiAgICAgICAgZXhjZXB0IChJbXBvcnRFcnJvciwgQXR0cmlidXRlRXJyb3IpOgogICAgICAgICAgICByYWlzZSBDb21wcmVzc2lvbkVycm9yKCJnemlwIG1vZHVsZSBpcyBub3QgYXZhaWxhYmxlIikKCiAgICAgICAgZXh0ZmlsZW9iaiA9IGZpbGVvYmogaXMgbm90IE5vbmUKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZpbGVvYmogPSBnemlwLkd6aXBGaWxlKG5hbWUsIG1vZGUgKyAiYiIsIGNvbXByZXNzbGV2ZWwsIGZpbGVvYmopCiAgICAgICAgICAgIHQgPSBjbHMudGFyb3BlbihuYW1lLCBtb2RlLCBmaWxlb2JqLCAqKmt3YXJncykKICAgICAgICBleGNlcHQgSU9FcnJvcjoKICAgICAgICAgICAgaWYgbm90IGV4dGZpbGVvYmogYW5kIGZpbGVvYmogaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBmaWxlb2JqLmNsb3NlKCkKICAgICAgICAgICAgaWYgZmlsZW9iaiBpcyBOb25lOgogICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgcmFpc2UgUmVhZEVycm9yKCJub3QgYSBnemlwIGZpbGUiKQogICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgaWYgbm90IGV4dGZpbGVvYmogYW5kIGZpbGVvYmogaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBmaWxlb2JqLmNsb3NlKCkKICAgICAgICAgICAgcmFpc2UKICAgICAgICB0Ll9leHRmaWxlb2JqID0gZXh0ZmlsZW9iagogICAgICAgIHJldHVybiB0CgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgYnoyb3BlbihjbHMsIG5hbWUsIG1vZGU9InIiLCBmaWxlb2JqPU5vbmUsIGNvbXByZXNzbGV2ZWw9OSwgKiprd2FyZ3MpOgogICAgICAgICIiIk9wZW4gYnppcDIgY29tcHJlc3NlZCB0YXIgYXJjaGl2ZSBuYW1lIGZvciByZWFkaW5nIG9yIHdyaXRpbmcuCiAgICAgICAgICAgQXBwZW5kaW5nIGlzIG5vdCBhbGxvd2VkLgogICAgICAgICIiIgogICAgICAgIGlmIGxlbihtb2RlKSA+IDEgb3IgbW9kZSBub3QgaW4gInJ3IjoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibW9kZSBtdXN0IGJlICdyJyBvciAndycuIikKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBpbXBvcnQgYnoyCiAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICByYWlzZSBDb21wcmVzc2lvbkVycm9yKCJiejIgbW9kdWxlIGlzIG5vdCBhdmFpbGFibGUiKQoKICAgICAgICBpZiBmaWxlb2JqIGlzIG5vdCBOb25lOgogICAgICAgICAgICBmaWxlb2JqID0gX0JaMlByb3h5KGZpbGVvYmosIG1vZGUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZmlsZW9iaiA9IGJ6Mi5CWjJGaWxlKG5hbWUsIG1vZGUsIGNvbXByZXNzbGV2ZWw9Y29tcHJlc3NsZXZlbCkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICB0ID0gY2xzLnRhcm9wZW4obmFtZSwgbW9kZSwgZmlsZW9iaiwgKiprd2FyZ3MpCiAgICAgICAgZXhjZXB0IChJT0Vycm9yLCBFT0ZFcnJvcik6CiAgICAgICAgICAgIGZpbGVvYmouY2xvc2UoKQogICAgICAgICAgICByYWlzZSBSZWFkRXJyb3IoIm5vdCBhIGJ6aXAyIGZpbGUiKQogICAgICAgIHQuX2V4dGZpbGVvYmogPSBGYWxzZQogICAgICAgIHJldHVybiB0CgogICAgIyBBbGwgKm9wZW4oKSBtZXRob2RzIGFyZSByZWdpc3RlcmVkIGhlcmUuCiAgICBPUEVOX01FVEggPSB7CiAgICAgICAgInRhciI6ICJ0YXJvcGVuIiwgICAjIHVuY29tcHJlc3NlZCB0YXIKICAgICAgICAiZ3oiOiAgImd6b3BlbiIsICAgICMgZ3ppcCBjb21wcmVzc2VkIHRhcgogICAgICAgICJiejIiOiAiYnoyb3BlbiIgICAgIyBiemlwMiBjb21wcmVzc2VkIHRhcgogICAgfQoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBUaGUgcHVibGljIG1ldGhvZHMgd2hpY2ggVGFyRmlsZSBwcm92aWRlczoKCiAgICBkZWYgY2xvc2Uoc2VsZik6CiAgICAgICAgIiIiQ2xvc2UgdGhlIFRhckZpbGUuIEluIHdyaXRlLW1vZGUsIHR3byBmaW5pc2hpbmcgemVybyBibG9ja3MgYXJlCiAgICAgICAgICAgYXBwZW5kZWQgdG8gdGhlIGFyY2hpdmUuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBpZiBzZWxmLm1vZGUgaW4gImF3IjoKICAgICAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKE5VTCAqIChCTE9DS1NJWkUgKiAyKSkKICAgICAgICAgICAgc2VsZi5vZmZzZXQgKz0gKEJMT0NLU0laRSAqIDIpCiAgICAgICAgICAgICMgZmlsbCB1cCB0aGUgZW5kIHdpdGggemVyby1ibG9ja3MKICAgICAgICAgICAgIyAobGlrZSBvcHRpb24gLWIyMCBmb3IgdGFyIGRvZXMpCiAgICAgICAgICAgIGJsb2NrcywgcmVtYWluZGVyID0gZGl2bW9kKHNlbGYub2Zmc2V0LCBSRUNPUkRTSVpFKQogICAgICAgICAgICBpZiByZW1haW5kZXIgPiAwOgogICAgICAgICAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKE5VTCAqIChSRUNPUkRTSVpFIC0gcmVtYWluZGVyKSkKCiAgICAgICAgaWYgbm90IHNlbGYuX2V4dGZpbGVvYmo6CiAgICAgICAgICAgIHNlbGYuZmlsZW9iai5jbG9zZSgpCiAgICAgICAgc2VsZi5jbG9zZWQgPSBUcnVlCgogICAgZGVmIGdldG1lbWJlcihzZWxmLCBuYW1lKToKICAgICAgICAiIiJSZXR1cm4gYSBUYXJJbmZvIG9iamVjdCBmb3IgbWVtYmVyIGBuYW1lJy4gSWYgYG5hbWUnIGNhbiBub3QgYmUKICAgICAgICAgICBmb3VuZCBpbiB0aGUgYXJjaGl2ZSwgS2V5RXJyb3IgaXMgcmFpc2VkLiBJZiBhIG1lbWJlciBvY2N1cnMgbW9yZQogICAgICAgICAgIHRoYW4gb25jZSBpbiB0aGUgYXJjaGl2ZSwgaXRzIGxhc3Qgb2NjdXJyZW5jZSBpcyBhc3N1bWVkIHRvIGJlIHRoZQogICAgICAgICAgIG1vc3QgdXAtdG8tZGF0ZSB2ZXJzaW9uLgogICAgICAgICIiIgogICAgICAgIHRhcmluZm8gPSBzZWxmLl9nZXRtZW1iZXIobmFtZSkKICAgICAgICBpZiB0YXJpbmZvIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCJmaWxlbmFtZSAlciBub3QgZm91bmQiICUgbmFtZSkKICAgICAgICByZXR1cm4gdGFyaW5mbwoKICAgIGRlZiBnZXRtZW1iZXJzKHNlbGYpOgogICAgICAgICIiIlJldHVybiB0aGUgbWVtYmVycyBvZiB0aGUgYXJjaGl2ZSBhcyBhIGxpc3Qgb2YgVGFySW5mbyBvYmplY3RzLiBUaGUKICAgICAgICAgICBsaXN0IGhhcyB0aGUgc2FtZSBvcmRlciBhcyB0aGUgbWVtYmVycyBpbiB0aGUgYXJjaGl2ZS4KICAgICAgICAiIiIKICAgICAgICBzZWxmLl9jaGVjaygpCiAgICAgICAgaWYgbm90IHNlbGYuX2xvYWRlZDogICAgIyBpZiB3ZSB3YW50IHRvIG9idGFpbiBhIGxpc3Qgb2YKICAgICAgICAgICAgc2VsZi5fbG9hZCgpICAgICAgICAjIGFsbCBtZW1iZXJzLCB3ZSBmaXJzdCBoYXZlIHRvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzY2FuIHRoZSB3aG9sZSBhcmNoaXZlLgogICAgICAgIHJldHVybiBzZWxmLm1lbWJlcnMKCiAgICBkZWYgZ2V0bmFtZXMoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIHRoZSBtZW1iZXJzIG9mIHRoZSBhcmNoaXZlIGFzIGEgbGlzdCBvZiB0aGVpciBuYW1lcy4gSXQgaGFzCiAgICAgICAgICAgdGhlIHNhbWUgb3JkZXIgYXMgdGhlIGxpc3QgcmV0dXJuZWQgYnkgZ2V0bWVtYmVycygpLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBbdGFyaW5mby5uYW1lIGZvciB0YXJpbmZvIGluIHNlbGYuZ2V0bWVtYmVycygpXQoKICAgIGRlZiBnZXR0YXJpbmZvKHNlbGYsIG5hbWU9Tm9uZSwgYXJjbmFtZT1Ob25lLCBmaWxlb2JqPU5vbmUpOgogICAgICAgICIiIkNyZWF0ZSBhIFRhckluZm8gb2JqZWN0IGZvciBlaXRoZXIgdGhlIGZpbGUgYG5hbWUnIG9yIHRoZSBmaWxlCiAgICAgICAgICAgb2JqZWN0IGBmaWxlb2JqJyAodXNpbmcgb3MuZnN0YXQgb24gaXRzIGZpbGUgZGVzY3JpcHRvcikuIFlvdSBjYW4KICAgICAgICAgICBtb2RpZnkgc29tZSBvZiB0aGUgVGFySW5mbydzIGF0dHJpYnV0ZXMgYmVmb3JlIHlvdSBhZGQgaXQgdXNpbmcKICAgICAgICAgICBhZGRmaWxlKCkuIElmIGdpdmVuLCBgYXJjbmFtZScgc3BlY2lmaWVzIGFuIGFsdGVybmF0aXZlIG5hbWUgZm9yIHRoZQogICAgICAgICAgIGZpbGUgaW4gdGhlIGFyY2hpdmUuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5fY2hlY2soImF3IikKCiAgICAgICAgIyBXaGVuIGZpbGVvYmogaXMgZ2l2ZW4sIHJlcGxhY2UgbmFtZSBieQogICAgICAgICMgZmlsZW9iaidzIHJlYWwgbmFtZS4KICAgICAgICBpZiBmaWxlb2JqIGlzIG5vdCBOb25lOgogICAgICAgICAgICBuYW1lID0gZmlsZW9iai5uYW1lCgogICAgICAgICMgQnVpbGRpbmcgdGhlIG5hbWUgb2YgdGhlIG1lbWJlciBpbiB0aGUgYXJjaGl2ZS4KICAgICAgICAjIEJhY2t3YXJkIHNsYXNoZXMgYXJlIGNvbnZlcnRlZCB0byBmb3J3YXJkIHNsYXNoZXMsCiAgICAgICAgIyBBYnNvbHV0ZSBwYXRocyBhcmUgdHVybmVkIHRvIHJlbGF0aXZlIHBhdGhzLgogICAgICAgIGlmIGFyY25hbWUgaXMgTm9uZToKICAgICAgICAgICAgYXJjbmFtZSA9IG5hbWUKICAgICAgICBkcnYsIGFyY25hbWUgPSBvcy5wYXRoLnNwbGl0ZHJpdmUoYXJjbmFtZSkKICAgICAgICBhcmNuYW1lID0gYXJjbmFtZS5yZXBsYWNlKG9zLnNlcCwgIi8iKQogICAgICAgIGFyY25hbWUgPSBhcmNuYW1lLmxzdHJpcCgiLyIpCgogICAgICAgICMgTm93LCBmaWxsIHRoZSBUYXJJbmZvIG9iamVjdCB3aXRoCiAgICAgICAgIyBpbmZvcm1hdGlvbiBzcGVjaWZpYyBmb3IgdGhlIGZpbGUuCiAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyaW5mbygpCiAgICAgICAgdGFyaW5mby50YXJmaWxlID0gc2VsZgoKICAgICAgICAjIFVzZSBvcy5zdGF0IG9yIG9zLmxzdGF0LCBkZXBlbmRpbmcgb24gcGxhdGZvcm0KICAgICAgICAjIGFuZCBpZiBzeW1saW5rcyBzaGFsbCBiZSByZXNvbHZlZC4KICAgICAgICBpZiBmaWxlb2JqIGlzIE5vbmU6CiAgICAgICAgICAgIGlmIGhhc2F0dHIob3MsICJsc3RhdCIpIGFuZCBub3Qgc2VsZi5kZXJlZmVyZW5jZToKICAgICAgICAgICAgICAgIHN0YXRyZXMgPSBvcy5sc3RhdChuYW1lKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc3RhdHJlcyA9IG9zLnN0YXQobmFtZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzdGF0cmVzID0gb3MuZnN0YXQoZmlsZW9iai5maWxlbm8oKSkKICAgICAgICBsaW5rbmFtZSA9ICIiCgogICAgICAgIHN0bWQgPSBzdGF0cmVzLnN0X21vZGUKICAgICAgICBpZiBzdGF0LlNfSVNSRUcoc3RtZCk6CiAgICAgICAgICAgIGlub2RlID0gKHN0YXRyZXMuc3RfaW5vLCBzdGF0cmVzLnN0X2RldikKICAgICAgICAgICAgaWYgbm90IHNlbGYuZGVyZWZlcmVuY2UgYW5kIHN0YXRyZXMuc3RfbmxpbmsgPiAxIGFuZCBcCiAgICAgICAgICAgICAgICAgICAgaW5vZGUgaW4gc2VsZi5pbm9kZXMgYW5kIGFyY25hbWUgIT0gc2VsZi5pbm9kZXNbaW5vZGVdOgogICAgICAgICAgICAgICAgIyBJcyBpdCBhIGhhcmRsaW5rIHRvIGFuIGFscmVhZHkKICAgICAgICAgICAgICAgICMgYXJjaGl2ZWQgZmlsZT8KICAgICAgICAgICAgICAgIHR5cGUgPSBMTktUWVBFCiAgICAgICAgICAgICAgICBsaW5rbmFtZSA9IHNlbGYuaW5vZGVzW2lub2RlXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBUaGUgaW5vZGUgaXMgYWRkZWQgb25seSBpZiBpdHMgdmFsaWQuCiAgICAgICAgICAgICAgICAjIEZvciB3aW4zMiBpdCBpcyBhbHdheXMgMC4KICAgICAgICAgICAgICAgIHR5cGUgPSBSRUdUWVBFCiAgICAgICAgICAgICAgICBpZiBpbm9kZVswXToKICAgICAgICAgICAgICAgICAgICBzZWxmLmlub2Rlc1tpbm9kZV0gPSBhcmNuYW1lCiAgICAgICAgZWxpZiBzdGF0LlNfSVNESVIoc3RtZCk6CiAgICAgICAgICAgIHR5cGUgPSBESVJUWVBFCiAgICAgICAgZWxpZiBzdGF0LlNfSVNGSUZPKHN0bWQpOgogICAgICAgICAgICB0eXBlID0gRklGT1RZUEUKICAgICAgICBlbGlmIHN0YXQuU19JU0xOSyhzdG1kKToKICAgICAgICAgICAgdHlwZSA9IFNZTVRZUEUKICAgICAgICAgICAgbGlua25hbWUgPSBvcy5yZWFkbGluayhuYW1lKQogICAgICAgIGVsaWYgc3RhdC5TX0lTQ0hSKHN0bWQpOgogICAgICAgICAgICB0eXBlID0gQ0hSVFlQRQogICAgICAgIGVsaWYgc3RhdC5TX0lTQkxLKHN0bWQpOgogICAgICAgICAgICB0eXBlID0gQkxLVFlQRQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgICMgRmlsbCB0aGUgVGFySW5mbyBvYmplY3Qgd2l0aCBhbGwKICAgICAgICAjIGluZm9ybWF0aW9uIHdlIGNhbiBnZXQuCiAgICAgICAgdGFyaW5mby5uYW1lID0gYXJjbmFtZQogICAgICAgIHRhcmluZm8ubW9kZSA9IHN0bWQKICAgICAgICB0YXJpbmZvLnVpZCA9IHN0YXRyZXMuc3RfdWlkCiAgICAgICAgdGFyaW5mby5naWQgPSBzdGF0cmVzLnN0X2dpZAogICAgICAgIGlmIHR5cGUgPT0gUkVHVFlQRToKICAgICAgICAgICAgdGFyaW5mby5zaXplID0gc3RhdHJlcy5zdF9zaXplCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdGFyaW5mby5zaXplID0gMAogICAgICAgIHRhcmluZm8ubXRpbWUgPSBzdGF0cmVzLnN0X210aW1lCiAgICAgICAgdGFyaW5mby50eXBlID0gdHlwZQogICAgICAgIHRhcmluZm8ubGlua25hbWUgPSBsaW5rbmFtZQogICAgICAgIGlmIHB3ZDoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgdGFyaW5mby51bmFtZSA9IHB3ZC5nZXRwd3VpZCh0YXJpbmZvLnVpZClbMF0KICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgIGlmIGdycDoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgdGFyaW5mby5nbmFtZSA9IGdycC5nZXRncmdpZCh0YXJpbmZvLmdpZClbMF0KICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgICAgcGFzcwoKICAgICAgICBpZiB0eXBlIGluIChDSFJUWVBFLCBCTEtUWVBFKToKICAgICAgICAgICAgaWYgaGFzYXR0cihvcywgIm1ham9yIikgYW5kIGhhc2F0dHIob3MsICJtaW5vciIpOgogICAgICAgICAgICAgICAgdGFyaW5mby5kZXZtYWpvciA9IG9zLm1ham9yKHN0YXRyZXMuc3RfcmRldikKICAgICAgICAgICAgICAgIHRhcmluZm8uZGV2bWlub3IgPSBvcy5taW5vcihzdGF0cmVzLnN0X3JkZXYpCiAgICAgICAgcmV0dXJuIHRhcmluZm8KCiAgICBkZWYgbGlzdChzZWxmLCB2ZXJib3NlPVRydWUpOgogICAgICAgICIiIlByaW50IGEgdGFibGUgb2YgY29udGVudHMgdG8gc3lzLnN0ZG91dC4gSWYgYHZlcmJvc2UnIGlzIEZhbHNlLCBvbmx5CiAgICAgICAgICAgdGhlIG5hbWVzIG9mIHRoZSBtZW1iZXJzIGFyZSBwcmludGVkLiBJZiBpdCBpcyBUcnVlLCBhbiBgbHMgLWwnLWxpa2UKICAgICAgICAgICBvdXRwdXQgaXMgcHJvZHVjZWQuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5fY2hlY2soKQoKICAgICAgICBmb3IgdGFyaW5mbyBpbiBzZWxmOgogICAgICAgICAgICBpZiB2ZXJib3NlOgogICAgICAgICAgICAgICAgcHJpbnQoZmlsZW1vZGUodGFyaW5mby5tb2RlKSwgZW5kPScgJykKICAgICAgICAgICAgICAgIHByaW50KCIlcy8lcyIgJSAodGFyaW5mby51bmFtZSBvciB0YXJpbmZvLnVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyaW5mby5nbmFtZSBvciB0YXJpbmZvLmdpZCksIGVuZD0nICcpCiAgICAgICAgICAgICAgICBpZiB0YXJpbmZvLmlzY2hyKCkgb3IgdGFyaW5mby5pc2JsaygpOgogICAgICAgICAgICAgICAgICAgIHByaW50KCIlMTBzIiAlICgiJWQsJWQiIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAodGFyaW5mby5kZXZtYWpvciwgdGFyaW5mby5kZXZtaW5vcikpLCBlbmQ9JyAnKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBwcmludCgiJTEwZCIgJSB0YXJpbmZvLnNpemUsIGVuZD0nICcpCiAgICAgICAgICAgICAgICBwcmludCgiJWQtJTAyZC0lMDJkICUwMmQ6JTAyZDolMDJkIiBcCiAgICAgICAgICAgICAgICAgICAgICAlIHRpbWUubG9jYWx0aW1lKHRhcmluZm8ubXRpbWUpWzo2XSwgZW5kPScgJykKCiAgICAgICAgICAgIHByaW50KHRhcmluZm8ubmFtZSArICgiLyIgaWYgdGFyaW5mby5pc2RpcigpIGVsc2UgIiIpLCBlbmQ9JyAnKQoKICAgICAgICAgICAgaWYgdmVyYm9zZToKICAgICAgICAgICAgICAgIGlmIHRhcmluZm8uaXNzeW0oKToKICAgICAgICAgICAgICAgICAgICBwcmludCgiLT4iLCB0YXJpbmZvLmxpbmtuYW1lLCBlbmQ9JyAnKQogICAgICAgICAgICAgICAgaWYgdGFyaW5mby5pc2xuaygpOgogICAgICAgICAgICAgICAgICAgIHByaW50KCJsaW5rIHRvIiwgdGFyaW5mby5saW5rbmFtZSwgZW5kPScgJykKICAgICAgICAgICAgcHJpbnQoKQoKICAgIGRlZiBhZGQoc2VsZiwgbmFtZSwgYXJjbmFtZT1Ob25lLCByZWN1cnNpdmU9VHJ1ZSwgZXhjbHVkZT1Ob25lLCBmaWx0ZXI9Tm9uZSk6CiAgICAgICAgIiIiQWRkIHRoZSBmaWxlIGBuYW1lJyB0byB0aGUgYXJjaGl2ZS4gYG5hbWUnIG1heSBiZSBhbnkgdHlwZSBvZiBmaWxlCiAgICAgICAgICAgKGRpcmVjdG9yeSwgZmlmbywgc3ltYm9saWMgbGluaywgZXRjLikuIElmIGdpdmVuLCBgYXJjbmFtZScKICAgICAgICAgICBzcGVjaWZpZXMgYW4gYWx0ZXJuYXRpdmUgbmFtZSBmb3IgdGhlIGZpbGUgaW4gdGhlIGFyY2hpdmUuCiAgICAgICAgICAgRGlyZWN0b3JpZXMgYXJlIGFkZGVkIHJlY3Vyc2l2ZWx5IGJ5IGRlZmF1bHQuIFRoaXMgY2FuIGJlIGF2b2lkZWQgYnkKICAgICAgICAgICBzZXR0aW5nIGByZWN1cnNpdmUnIHRvIEZhbHNlLiBgZXhjbHVkZScgaXMgYSBmdW5jdGlvbiB0aGF0IHNob3VsZAogICAgICAgICAgIHJldHVybiBUcnVlIGZvciBlYWNoIGZpbGVuYW1lIHRvIGJlIGV4Y2x1ZGVkLiBgZmlsdGVyJyBpcyBhIGZ1bmN0aW9uCiAgICAgICAgICAgdGhhdCBleHBlY3RzIGEgVGFySW5mbyBvYmplY3QgYXJndW1lbnQgYW5kIHJldHVybnMgdGhlIGNoYW5nZWQKICAgICAgICAgICBUYXJJbmZvIG9iamVjdCwgaWYgaXQgcmV0dXJucyBOb25lIHRoZSBUYXJJbmZvIG9iamVjdCB3aWxsIGJlCiAgICAgICAgICAgZXhjbHVkZWQgZnJvbSB0aGUgYXJjaGl2ZS4KICAgICAgICAiIiIKICAgICAgICBzZWxmLl9jaGVjaygiYXciKQoKICAgICAgICBpZiBhcmNuYW1lIGlzIE5vbmU6CiAgICAgICAgICAgIGFyY25hbWUgPSBuYW1lCgogICAgICAgICMgRXhjbHVkZSBwYXRobmFtZXMuCiAgICAgICAgaWYgZXhjbHVkZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgaW1wb3J0IHdhcm5pbmdzCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oInVzZSB0aGUgZmlsdGVyIGFyZ3VtZW50IGluc3RlYWQiLAogICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgMikKICAgICAgICAgICAgaWYgZXhjbHVkZShuYW1lKToKICAgICAgICAgICAgICAgIHNlbGYuX2RiZygyLCAidGFyZmlsZTogRXhjbHVkZWQgJXIiICUgbmFtZSkKICAgICAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIFNraXAgaWYgc29tZWJvZHkgdHJpZXMgdG8gYXJjaGl2ZSB0aGUgYXJjaGl2ZS4uLgogICAgICAgIGlmIHNlbGYubmFtZSBpcyBub3QgTm9uZSBhbmQgb3MucGF0aC5hYnNwYXRoKG5hbWUpID09IHNlbGYubmFtZToKICAgICAgICAgICAgc2VsZi5fZGJnKDIsICJ0YXJmaWxlOiBTa2lwcGVkICVyIiAlIG5hbWUpCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBzZWxmLl9kYmcoMSwgbmFtZSkKCiAgICAgICAgIyBDcmVhdGUgYSBUYXJJbmZvIG9iamVjdCBmcm9tIHRoZSBmaWxlLgogICAgICAgIHRhcmluZm8gPSBzZWxmLmdldHRhcmluZm8obmFtZSwgYXJjbmFtZSkKCiAgICAgICAgaWYgdGFyaW5mbyBpcyBOb25lOgogICAgICAgICAgICBzZWxmLl9kYmcoMSwgInRhcmZpbGU6IFVuc3VwcG9ydGVkIHR5cGUgJXIiICUgbmFtZSkKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICMgQ2hhbmdlIG9yIGV4Y2x1ZGUgdGhlIFRhckluZm8gb2JqZWN0LgogICAgICAgIGlmIGZpbHRlciBpcyBub3QgTm9uZToKICAgICAgICAgICAgdGFyaW5mbyA9IGZpbHRlcih0YXJpbmZvKQogICAgICAgICAgICBpZiB0YXJpbmZvIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBzZWxmLl9kYmcoMiwgInRhcmZpbGU6IEV4Y2x1ZGVkICVyIiAlIG5hbWUpCiAgICAgICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyBBcHBlbmQgdGhlIHRhciBoZWFkZXIgYW5kIGRhdGEgdG8gdGhlIGFyY2hpdmUuCiAgICAgICAgaWYgdGFyaW5mby5pc3JlZygpOgogICAgICAgICAgICBmID0gYmx0bl9vcGVuKG5hbWUsICJyYiIpCiAgICAgICAgICAgIHNlbGYuYWRkZmlsZSh0YXJpbmZvLCBmKQogICAgICAgICAgICBmLmNsb3NlKCkKCiAgICAgICAgZWxpZiB0YXJpbmZvLmlzZGlyKCk6CiAgICAgICAgICAgIHNlbGYuYWRkZmlsZSh0YXJpbmZvKQogICAgICAgICAgICBpZiByZWN1cnNpdmU6CiAgICAgICAgICAgICAgICBmb3IgZiBpbiBvcy5saXN0ZGlyKG5hbWUpOgogICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkKG9zLnBhdGguam9pbihuYW1lLCBmKSwgb3MucGF0aC5qb2luKGFyY25hbWUsIGYpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzaXZlLCBleGNsdWRlLCBmaWx0ZXI9ZmlsdGVyKQoKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmFkZGZpbGUodGFyaW5mbykKCiAgICBkZWYgYWRkZmlsZShzZWxmLCB0YXJpbmZvLCBmaWxlb2JqPU5vbmUpOgogICAgICAgICIiIkFkZCB0aGUgVGFySW5mbyBvYmplY3QgYHRhcmluZm8nIHRvIHRoZSBhcmNoaXZlLiBJZiBgZmlsZW9iaicgaXMKICAgICAgICAgICBnaXZlbiwgdGFyaW5mby5zaXplIGJ5dGVzIGFyZSByZWFkIGZyb20gaXQgYW5kIGFkZGVkIHRvIHRoZSBhcmNoaXZlLgogICAgICAgICAgIFlvdSBjYW4gY3JlYXRlIFRhckluZm8gb2JqZWN0cyB1c2luZyBnZXR0YXJpbmZvKCkuCiAgICAgICAgICAgT24gV2luZG93cyBwbGF0Zm9ybXMsIGBmaWxlb2JqJyBzaG91bGQgYWx3YXlzIGJlIG9wZW5lZCB3aXRoIG1vZGUKICAgICAgICAgICAncmInIHRvIGF2b2lkIGlycml0YXRpb24gYWJvdXQgdGhlIGZpbGUgc2l6ZS4KICAgICAgICAiIiIKICAgICAgICBzZWxmLl9jaGVjaygiYXciKQoKICAgICAgICB0YXJpbmZvID0gY29weS5jb3B5KHRhcmluZm8pCgogICAgICAgIGJ1ZiA9IHRhcmluZm8udG9idWYoc2VsZi5mb3JtYXQsIHNlbGYuZW5jb2RpbmcsIHNlbGYuZXJyb3JzKQogICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShidWYpCiAgICAgICAgc2VsZi5vZmZzZXQgKz0gbGVuKGJ1ZikKCiAgICAgICAgIyBJZiB0aGVyZSdzIGRhdGEgdG8gZm9sbG93LCBhcHBlbmQgaXQuCiAgICAgICAgaWYgZmlsZW9iaiBpcyBub3QgTm9uZToKICAgICAgICAgICAgY29weWZpbGVvYmooZmlsZW9iaiwgc2VsZi5maWxlb2JqLCB0YXJpbmZvLnNpemUpCiAgICAgICAgICAgIGJsb2NrcywgcmVtYWluZGVyID0gZGl2bW9kKHRhcmluZm8uc2l6ZSwgQkxPQ0tTSVpFKQogICAgICAgICAgICBpZiByZW1haW5kZXIgPiAwOgogICAgICAgICAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKE5VTCAqIChCTE9DS1NJWkUgLSByZW1haW5kZXIpKQogICAgICAgICAgICAgICAgYmxvY2tzICs9IDEKICAgICAgICAgICAgc2VsZi5vZmZzZXQgKz0gYmxvY2tzICogQkxPQ0tTSVpFCgogICAgICAgIHNlbGYubWVtYmVycy5hcHBlbmQodGFyaW5mbykKCiAgICBkZWYgZXh0cmFjdGFsbChzZWxmLCBwYXRoPSIuIiwgbWVtYmVycz1Ob25lKToKICAgICAgICAiIiJFeHRyYWN0IGFsbCBtZW1iZXJzIGZyb20gdGhlIGFyY2hpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZwogICAgICAgICAgIGRpcmVjdG9yeSBhbmQgc2V0IG93bmVyLCBtb2RpZmljYXRpb24gdGltZSBhbmQgcGVybWlzc2lvbnMgb24KICAgICAgICAgICBkaXJlY3RvcmllcyBhZnRlcndhcmRzLiBgcGF0aCcgc3BlY2lmaWVzIGEgZGlmZmVyZW50IGRpcmVjdG9yeQogICAgICAgICAgIHRvIGV4dHJhY3QgdG8uIGBtZW1iZXJzJyBpcyBvcHRpb25hbCBhbmQgbXVzdCBiZSBhIHN1YnNldCBvZiB0aGUKICAgICAgICAgICBsaXN0IHJldHVybmVkIGJ5IGdldG1lbWJlcnMoKS4KICAgICAgICAiIiIKICAgICAgICBkaXJlY3RvcmllcyA9IFtdCgogICAgICAgIGlmIG1lbWJlcnMgaXMgTm9uZToKICAgICAgICAgICAgbWVtYmVycyA9IHNlbGYKCiAgICAgICAgZm9yIHRhcmluZm8gaW4gbWVtYmVyczoKICAgICAgICAgICAgaWYgdGFyaW5mby5pc2RpcigpOgogICAgICAgICAgICAgICAgIyBFeHRyYWN0IGRpcmVjdG9yaWVzIHdpdGggYSBzYWZlIG1vZGUuCiAgICAgICAgICAgICAgICBkaXJlY3Rvcmllcy5hcHBlbmQodGFyaW5mbykKICAgICAgICAgICAgICAgIHRhcmluZm8gPSBjb3B5LmNvcHkodGFyaW5mbykKICAgICAgICAgICAgICAgIHRhcmluZm8ubW9kZSA9IDBvNzAwCiAgICAgICAgICAgICMgRG8gbm90IHNldF9hdHRycyBkaXJlY3RvcmllcywgYXMgd2Ugd2lsbCBkbyB0aGF0IGZ1cnRoZXIgZG93bgogICAgICAgICAgICBzZWxmLmV4dHJhY3QodGFyaW5mbywgcGF0aCwgc2V0X2F0dHJzPW5vdCB0YXJpbmZvLmlzZGlyKCkpCgogICAgICAgICMgUmV2ZXJzZSBzb3J0IGRpcmVjdG9yaWVzLgogICAgICAgIGRpcmVjdG9yaWVzLnNvcnQoa2V5PWxhbWJkYSBhOiBhLm5hbWUpCiAgICAgICAgZGlyZWN0b3JpZXMucmV2ZXJzZSgpCgogICAgICAgICMgU2V0IGNvcnJlY3Qgb3duZXIsIG10aW1lIGFuZCBmaWxlbW9kZSBvbiBkaXJlY3Rvcmllcy4KICAgICAgICBmb3IgdGFyaW5mbyBpbiBkaXJlY3RvcmllczoKICAgICAgICAgICAgZGlycGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCB0YXJpbmZvLm5hbWUpCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHNlbGYuY2hvd24odGFyaW5mbywgZGlycGF0aCkKICAgICAgICAgICAgICAgIHNlbGYudXRpbWUodGFyaW5mbywgZGlycGF0aCkKICAgICAgICAgICAgICAgIHNlbGYuY2htb2QodGFyaW5mbywgZGlycGF0aCkKICAgICAgICAgICAgZXhjZXB0IEV4dHJhY3RFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgaWYgc2VsZi5lcnJvcmxldmVsID4gMToKICAgICAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBzZWxmLl9kYmcoMSwgInRhcmZpbGU6ICVzIiAlIGUpCgogICAgZGVmIGV4dHJhY3Qoc2VsZiwgbWVtYmVyLCBwYXRoPSIiLCBzZXRfYXR0cnM9VHJ1ZSk6CiAgICAgICAgIiIiRXh0cmFjdCBhIG1lbWJlciBmcm9tIHRoZSBhcmNoaXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LAogICAgICAgICAgIHVzaW5nIGl0cyBmdWxsIG5hbWUuIEl0cyBmaWxlIGluZm9ybWF0aW9uIGlzIGV4dHJhY3RlZCBhcyBhY2N1cmF0ZWx5CiAgICAgICAgICAgYXMgcG9zc2libGUuIGBtZW1iZXInIG1heSBiZSBhIGZpbGVuYW1lIG9yIGEgVGFySW5mbyBvYmplY3QuIFlvdSBjYW4KICAgICAgICAgICBzcGVjaWZ5IGEgZGlmZmVyZW50IGRpcmVjdG9yeSB1c2luZyBgcGF0aCcuIEZpbGUgYXR0cmlidXRlcyAob3duZXIsCiAgICAgICAgICAgbXRpbWUsIG1vZGUpIGFyZSBzZXQgdW5sZXNzIGBzZXRfYXR0cnMnIGlzIEZhbHNlLgogICAgICAgICIiIgogICAgICAgIHNlbGYuX2NoZWNrKCJyIikKCiAgICAgICAgaWYgaXNpbnN0YW5jZShtZW1iZXIsIHN0cik6CiAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLmdldG1lbWJlcihtZW1iZXIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdGFyaW5mbyA9IG1lbWJlcgoKICAgICAgICAjIFByZXBhcmUgdGhlIGxpbmsgdGFyZ2V0IGZvciBtYWtlbGluaygpLgogICAgICAgIGlmIHRhcmluZm8uaXNsbmsoKToKICAgICAgICAgICAgdGFyaW5mby5fbGlua190YXJnZXQgPSBvcy5wYXRoLmpvaW4ocGF0aCwgdGFyaW5mby5saW5rbmFtZSkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLl9leHRyYWN0X21lbWJlcih0YXJpbmZvLCBvcy5wYXRoLmpvaW4ocGF0aCwgdGFyaW5mby5uYW1lKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X2F0dHJzPXNldF9hdHRycykKICAgICAgICBleGNlcHQgRW52aXJvbm1lbnRFcnJvciBhcyBlOgogICAgICAgICAgICBpZiBzZWxmLmVycm9ybGV2ZWwgPiAwOgogICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlmIGUuZmlsZW5hbWUgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICBzZWxmLl9kYmcoMSwgInRhcmZpbGU6ICVzIiAlIGUuc3RyZXJyb3IpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2RiZygxLCAidGFyZmlsZTogJXMgJXIiICUgKGUuc3RyZXJyb3IsIGUuZmlsZW5hbWUpKQogICAgICAgIGV4Y2VwdCBFeHRyYWN0RXJyb3IgYXMgZToKICAgICAgICAgICAgaWYgc2VsZi5lcnJvcmxldmVsID4gMToKICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9kYmcoMSwgInRhcmZpbGU6ICVzIiAlIGUpCgogICAgZGVmIGV4dHJhY3RmaWxlKHNlbGYsIG1lbWJlcik6CiAgICAgICAgIiIiRXh0cmFjdCBhIG1lbWJlciBmcm9tIHRoZSBhcmNoaXZlIGFzIGEgZmlsZSBvYmplY3QuIGBtZW1iZXInIG1heSBiZQogICAgICAgICAgIGEgZmlsZW5hbWUgb3IgYSBUYXJJbmZvIG9iamVjdC4gSWYgYG1lbWJlcicgaXMgYSByZWd1bGFyIGZpbGUsIGEKICAgICAgICAgICBmaWxlLWxpa2Ugb2JqZWN0IGlzIHJldHVybmVkLiBJZiBgbWVtYmVyJyBpcyBhIGxpbmssIGEgZmlsZS1saWtlCiAgICAgICAgICAgb2JqZWN0IGlzIGNvbnN0cnVjdGVkIGZyb20gdGhlIGxpbmsncyB0YXJnZXQuIElmIGBtZW1iZXInIGlzIG5vbmUgb2YKICAgICAgICAgICB0aGUgYWJvdmUsIE5vbmUgaXMgcmV0dXJuZWQuCiAgICAgICAgICAgVGhlIGZpbGUtbGlrZSBvYmplY3QgaXMgcmVhZC1vbmx5IGFuZCBwcm92aWRlcyB0aGUgZm9sbG93aW5nCiAgICAgICAgICAgbWV0aG9kczogcmVhZCgpLCByZWFkbGluZSgpLCByZWFkbGluZXMoKSwgc2VlaygpIGFuZCB0ZWxsKCkKICAgICAgICAiIiIKICAgICAgICBzZWxmLl9jaGVjaygiciIpCgogICAgICAgIGlmIGlzaW5zdGFuY2UobWVtYmVyLCBzdHIpOgogICAgICAgICAgICB0YXJpbmZvID0gc2VsZi5nZXRtZW1iZXIobWVtYmVyKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHRhcmluZm8gPSBtZW1iZXIKCiAgICAgICAgaWYgdGFyaW5mby5pc3JlZygpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5maWxlb2JqZWN0KHNlbGYsIHRhcmluZm8pCgogICAgICAgIGVsaWYgdGFyaW5mby50eXBlIG5vdCBpbiBTVVBQT1JURURfVFlQRVM6CiAgICAgICAgICAgICMgSWYgYSBtZW1iZXIncyB0eXBlIGlzIHVua25vd24sIGl0IGlzIHRyZWF0ZWQgYXMgYQogICAgICAgICAgICAjIHJlZ3VsYXIgZmlsZS4KICAgICAgICAgICAgcmV0dXJuIHNlbGYuZmlsZW9iamVjdChzZWxmLCB0YXJpbmZvKQoKICAgICAgICBlbGlmIHRhcmluZm8uaXNsbmsoKSBvciB0YXJpbmZvLmlzc3ltKCk6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5maWxlb2JqLCBfU3RyZWFtKToKICAgICAgICAgICAgICAgICMgQSBzbWFsbCBidXQgdWdseSB3b3JrYXJvdW5kIGZvciB0aGUgY2FzZSB0aGF0IHNvbWVvbmUgdHJpZXMKICAgICAgICAgICAgICAgICMgdG8gZXh0cmFjdCBhIChzeW0pbGluayBhcyBhIGZpbGUtb2JqZWN0IGZyb20gYSBub24tc2Vla2FibGUKICAgICAgICAgICAgICAgICMgc3RyZWFtIG9mIHRhciBibG9ja3MuCiAgICAgICAgICAgICAgICByYWlzZSBTdHJlYW1FcnJvcigiY2Fubm90IGV4dHJhY3QgKHN5bSlsaW5rIGFzIGZpbGUgb2JqZWN0IikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgQSAoc3ltKWxpbmsncyBmaWxlIG9iamVjdCBpcyBpdHMgdGFyZ2V0J3MgZmlsZSBvYmplY3QuCiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5leHRyYWN0ZmlsZShzZWxmLl9maW5kX2xpbmtfdGFyZ2V0KHRhcmluZm8pKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgSWYgdGhlcmUncyBubyBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVtYmVyIChkaXJlY3RvcnksIGNocmRldiwKICAgICAgICAgICAgIyBibGtkZXYsIGV0Yy4pLCByZXR1cm4gTm9uZSBpbnN0ZWFkIG9mIGEgZmlsZSBvYmplY3QuCiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgZGVmIF9leHRyYWN0X21lbWJlcihzZWxmLCB0YXJpbmZvLCB0YXJnZXRwYXRoLCBzZXRfYXR0cnM9VHJ1ZSk6CiAgICAgICAgIiIiRXh0cmFjdCB0aGUgVGFySW5mbyBvYmplY3QgdGFyaW5mbyB0byBhIHBoeXNpY2FsCiAgICAgICAgICAgZmlsZSBjYWxsZWQgdGFyZ2V0cGF0aC4KICAgICAgICAiIiIKICAgICAgICAjIEZldGNoIHRoZSBUYXJJbmZvIG9iamVjdCBmb3IgdGhlIGdpdmVuIG5hbWUKICAgICAgICAjIGFuZCBidWlsZCB0aGUgZGVzdGluYXRpb24gcGF0aG5hbWUsIHJlcGxhY2luZwogICAgICAgICMgZm9yd2FyZCBzbGFzaGVzIHRvIHBsYXRmb3JtIHNwZWNpZmljIHNlcGFyYXRvcnMuCiAgICAgICAgdGFyZ2V0cGF0aCA9IHRhcmdldHBhdGgucnN0cmlwKCIvIikKICAgICAgICB0YXJnZXRwYXRoID0gdGFyZ2V0cGF0aC5yZXBsYWNlKCIvIiwgb3Muc2VwKQoKICAgICAgICAjIENyZWF0ZSBhbGwgdXBwZXIgZGlyZWN0b3JpZXMuCiAgICAgICAgdXBwZXJkaXJzID0gb3MucGF0aC5kaXJuYW1lKHRhcmdldHBhdGgpCiAgICAgICAgaWYgdXBwZXJkaXJzIGFuZCBub3Qgb3MucGF0aC5leGlzdHModXBwZXJkaXJzKToKICAgICAgICAgICAgIyBDcmVhdGUgZGlyZWN0b3JpZXMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIGFyY2hpdmUgd2l0aAogICAgICAgICAgICAjIGRlZmF1bHQgcGVybWlzc2lvbnMuCiAgICAgICAgICAgIG9zLm1ha2VkaXJzKHVwcGVyZGlycykKCiAgICAgICAgaWYgdGFyaW5mby5pc2xuaygpIG9yIHRhcmluZm8uaXNzeW0oKToKICAgICAgICAgICAgc2VsZi5fZGJnKDEsICIlcyAtPiAlcyIgJSAodGFyaW5mby5uYW1lLCB0YXJpbmZvLmxpbmtuYW1lKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLl9kYmcoMSwgdGFyaW5mby5uYW1lKQoKICAgICAgICBpZiB0YXJpbmZvLmlzcmVnKCk6CiAgICAgICAgICAgIHNlbGYubWFrZWZpbGUodGFyaW5mbywgdGFyZ2V0cGF0aCkKICAgICAgICBlbGlmIHRhcmluZm8uaXNkaXIoKToKICAgICAgICAgICAgc2VsZi5tYWtlZGlyKHRhcmluZm8sIHRhcmdldHBhdGgpCiAgICAgICAgZWxpZiB0YXJpbmZvLmlzZmlmbygpOgogICAgICAgICAgICBzZWxmLm1ha2VmaWZvKHRhcmluZm8sIHRhcmdldHBhdGgpCiAgICAgICAgZWxpZiB0YXJpbmZvLmlzY2hyKCkgb3IgdGFyaW5mby5pc2JsaygpOgogICAgICAgICAgICBzZWxmLm1ha2VkZXYodGFyaW5mbywgdGFyZ2V0cGF0aCkKICAgICAgICBlbGlmIHRhcmluZm8uaXNsbmsoKSBvciB0YXJpbmZvLmlzc3ltKCk6CiAgICAgICAgICAgIHNlbGYubWFrZWxpbmsodGFyaW5mbywgdGFyZ2V0cGF0aCkKICAgICAgICBlbGlmIHRhcmluZm8udHlwZSBub3QgaW4gU1VQUE9SVEVEX1RZUEVTOgogICAgICAgICAgICBzZWxmLm1ha2V1bmtub3duKHRhcmluZm8sIHRhcmdldHBhdGgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5tYWtlZmlsZSh0YXJpbmZvLCB0YXJnZXRwYXRoKQoKICAgICAgICBpZiBzZXRfYXR0cnM6CiAgICAgICAgICAgIHNlbGYuY2hvd24odGFyaW5mbywgdGFyZ2V0cGF0aCkKICAgICAgICAgICAgaWYgbm90IHRhcmluZm8uaXNzeW0oKToKICAgICAgICAgICAgICAgIHNlbGYuY2htb2QodGFyaW5mbywgdGFyZ2V0cGF0aCkKICAgICAgICAgICAgICAgIHNlbGYudXRpbWUodGFyaW5mbywgdGFyZ2V0cGF0aCkKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgQmVsb3cgYXJlIHRoZSBkaWZmZXJlbnQgZmlsZSBtZXRob2RzLiBUaGV5IGFyZSBjYWxsZWQgdmlhCiAgICAjIF9leHRyYWN0X21lbWJlcigpIHdoZW4gZXh0cmFjdCgpIGlzIGNhbGxlZC4gVGhleSBjYW4gYmUgcmVwbGFjZWQgaW4gYQogICAgIyBzdWJjbGFzcyB0byBpbXBsZW1lbnQgb3RoZXIgZnVuY3Rpb25hbGl0eS4KCiAgICBkZWYgbWFrZWRpcihzZWxmLCB0YXJpbmZvLCB0YXJnZXRwYXRoKToKICAgICAgICAiIiJNYWtlIGEgZGlyZWN0b3J5IGNhbGxlZCB0YXJnZXRwYXRoLgogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgIyBVc2UgYSBzYWZlIG1vZGUgZm9yIHRoZSBkaXJlY3RvcnksIHRoZSByZWFsIG1vZGUgaXMgc2V0CiAgICAgICAgICAgICMgbGF0ZXIgaW4gX2V4dHJhY3RfbWVtYmVyKCkuCiAgICAgICAgICAgIG9zLm1rZGlyKHRhcmdldHBhdGgsIDBvNzAwKQogICAgICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yIGFzIGU6CiAgICAgICAgICAgIGlmIGUuZXJybm8gIT0gZXJybm8uRUVYSVNUOgogICAgICAgICAgICAgICAgcmFpc2UKCiAgICBkZWYgbWFrZWZpbGUoc2VsZiwgdGFyaW5mbywgdGFyZ2V0cGF0aCk6CiAgICAgICAgIiIiTWFrZSBhIGZpbGUgY2FsbGVkIHRhcmdldHBhdGguCiAgICAgICAgIiIiCiAgICAgICAgc291cmNlID0gc2VsZi5maWxlb2JqCiAgICAgICAgc291cmNlLnNlZWsodGFyaW5mby5vZmZzZXRfZGF0YSkKICAgICAgICB0YXJnZXQgPSBibHRuX29wZW4odGFyZ2V0cGF0aCwgIndiIikKICAgICAgICBpZiB0YXJpbmZvLnNwYXJzZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgZm9yIG9mZnNldCwgc2l6ZSBpbiB0YXJpbmZvLnNwYXJzZToKICAgICAgICAgICAgICAgIHRhcmdldC5zZWVrKG9mZnNldCkKICAgICAgICAgICAgICAgIGNvcHlmaWxlb2JqKHNvdXJjZSwgdGFyZ2V0LCBzaXplKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGNvcHlmaWxlb2JqKHNvdXJjZSwgdGFyZ2V0LCB0YXJpbmZvLnNpemUpCiAgICAgICAgdGFyZ2V0LnNlZWsodGFyaW5mby5zaXplKQogICAgICAgIHRhcmdldC50cnVuY2F0ZSgpCiAgICAgICAgdGFyZ2V0LmNsb3NlKCkKCiAgICBkZWYgbWFrZXVua25vd24oc2VsZiwgdGFyaW5mbywgdGFyZ2V0cGF0aCk6CiAgICAgICAgIiIiTWFrZSBhIGZpbGUgZnJvbSBhIFRhckluZm8gb2JqZWN0IHdpdGggYW4gdW5rbm93biB0eXBlCiAgICAgICAgICAgYXQgdGFyZ2V0cGF0aC4KICAgICAgICAiIiIKICAgICAgICBzZWxmLm1ha2VmaWxlKHRhcmluZm8sIHRhcmdldHBhdGgpCiAgICAgICAgc2VsZi5fZGJnKDEsICJ0YXJmaWxlOiBVbmtub3duIGZpbGUgdHlwZSAlciwgIiBcCiAgICAgICAgICAgICAgICAgICAgICJleHRyYWN0ZWQgYXMgcmVndWxhciBmaWxlLiIgJSB0YXJpbmZvLnR5cGUpCgogICAgZGVmIG1ha2VmaWZvKHNlbGYsIHRhcmluZm8sIHRhcmdldHBhdGgpOgogICAgICAgICIiIk1ha2UgYSBmaWZvIGNhbGxlZCB0YXJnZXRwYXRoLgogICAgICAgICIiIgogICAgICAgIGlmIGhhc2F0dHIob3MsICJta2ZpZm8iKToKICAgICAgICAgICAgb3MubWtmaWZvKHRhcmdldHBhdGgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgRXh0cmFjdEVycm9yKCJmaWZvIG5vdCBzdXBwb3J0ZWQgYnkgc3lzdGVtIikKCiAgICBkZWYgbWFrZWRldihzZWxmLCB0YXJpbmZvLCB0YXJnZXRwYXRoKToKICAgICAgICAiIiJNYWtlIGEgY2hhcmFjdGVyIG9yIGJsb2NrIGRldmljZSBjYWxsZWQgdGFyZ2V0cGF0aC4KICAgICAgICAiIiIKICAgICAgICBpZiBub3QgaGFzYXR0cihvcywgIm1rbm9kIikgb3Igbm90IGhhc2F0dHIob3MsICJtYWtlZGV2Iik6CiAgICAgICAgICAgIHJhaXNlIEV4dHJhY3RFcnJvcigic3BlY2lhbCBkZXZpY2VzIG5vdCBzdXBwb3J0ZWQgYnkgc3lzdGVtIikKCiAgICAgICAgbW9kZSA9IHRhcmluZm8ubW9kZQogICAgICAgIGlmIHRhcmluZm8uaXNibGsoKToKICAgICAgICAgICAgbW9kZSB8PSBzdGF0LlNfSUZCTEsKICAgICAgICBlbHNlOgogICAgICAgICAgICBtb2RlIHw9IHN0YXQuU19JRkNIUgoKICAgICAgICBvcy5ta25vZCh0YXJnZXRwYXRoLCBtb2RlLAogICAgICAgICAgICAgICAgIG9zLm1ha2VkZXYodGFyaW5mby5kZXZtYWpvciwgdGFyaW5mby5kZXZtaW5vcikpCgogICAgZGVmIG1ha2VsaW5rKHNlbGYsIHRhcmluZm8sIHRhcmdldHBhdGgpOgogICAgICAgICIiIk1ha2UgYSAoc3ltYm9saWMpIGxpbmsgY2FsbGVkIHRhcmdldHBhdGguIElmIGl0IGNhbm5vdCBiZSBjcmVhdGVkCiAgICAgICAgICAocGxhdGZvcm0gbGltaXRhdGlvbiksIHdlIHRyeSB0byBtYWtlIGEgY29weSBvZiB0aGUgcmVmZXJlbmNlZCBmaWxlCiAgICAgICAgICBpbnN0ZWFkIG9mIGEgbGluay4KICAgICAgICAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgICMgRm9yIHN5c3RlbXMgdGhhdCBzdXBwb3J0IHN5bWJvbGljIGFuZCBoYXJkIGxpbmtzLgogICAgICAgICAgICBpZiB0YXJpbmZvLmlzc3ltKCk6CiAgICAgICAgICAgICAgICBvcy5zeW1saW5rKHRhcmluZm8ubGlua25hbWUsIHRhcmdldHBhdGgpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIFNlZSBleHRyYWN0KCkuCiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyh0YXJpbmZvLl9saW5rX3RhcmdldCk6CiAgICAgICAgICAgICAgICAgICAgb3MubGluayh0YXJpbmZvLl9saW5rX3RhcmdldCwgdGFyZ2V0cGF0aCkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZXh0cmFjdF9tZW1iZXIoc2VsZi5fZmluZF9saW5rX3RhcmdldCh0YXJpbmZvKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRwYXRoKQogICAgICAgIGV4Y2VwdCBzeW1saW5rX2V4Y2VwdGlvbjoKICAgICAgICAgICAgaWYgdGFyaW5mby5pc3N5bSgpOgogICAgICAgICAgICAgICAgbGlua3BhdGggPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKHRhcmluZm8ubmFtZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJpbmZvLmxpbmtuYW1lKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbGlua3BhdGggPSB0YXJpbmZvLmxpbmtuYW1lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgc2VsZi5fZXh0cmFjdF9tZW1iZXIoc2VsZi5fZmluZF9saW5rX3RhcmdldCh0YXJpbmZvKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldHBhdGgpCiAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgICAgIHJhaXNlIEV4dHJhY3RFcnJvcigidW5hYmxlIHRvIHJlc29sdmUgbGluayBpbnNpZGUgYXJjaGl2ZSIpCgogICAgZGVmIGNob3duKHNlbGYsIHRhcmluZm8sIHRhcmdldHBhdGgpOgogICAgICAgICIiIlNldCBvd25lciBvZiB0YXJnZXRwYXRoIGFjY29yZGluZyB0byB0YXJpbmZvLgogICAgICAgICIiIgogICAgICAgIGlmIHB3ZCBhbmQgaGFzYXR0cihvcywgImdldGV1aWQiKSBhbmQgb3MuZ2V0ZXVpZCgpID09IDA6CiAgICAgICAgICAgICMgV2UgaGF2ZSB0byBiZSByb290IHRvIGRvIHNvLgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBnID0gZ3JwLmdldGdybmFtKHRhcmluZm8uZ25hbWUpWzJdCiAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgICAgIGcgPSB0YXJpbmZvLmdpZAogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICB1ID0gcHdkLmdldHB3bmFtKHRhcmluZm8udW5hbWUpWzJdCiAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgICAgIHUgPSB0YXJpbmZvLnVpZAogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBpZiB0YXJpbmZvLmlzc3ltKCkgYW5kIGhhc2F0dHIob3MsICJsY2hvd24iKToKICAgICAgICAgICAgICAgICAgICBvcy5sY2hvd24odGFyZ2V0cGF0aCwgdSwgZykKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtICE9ICJvczJlbXgiOgogICAgICAgICAgICAgICAgICAgICAgICBvcy5jaG93bih0YXJnZXRwYXRoLCB1LCBnKQogICAgICAgICAgICBleGNlcHQgRW52aXJvbm1lbnRFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgcmFpc2UgRXh0cmFjdEVycm9yKCJjb3VsZCBub3QgY2hhbmdlIG93bmVyIikKCiAgICBkZWYgY2htb2Qoc2VsZiwgdGFyaW5mbywgdGFyZ2V0cGF0aCk6CiAgICAgICAgIiIiU2V0IGZpbGUgcGVybWlzc2lvbnMgb2YgdGFyZ2V0cGF0aCBhY2NvcmRpbmcgdG8gdGFyaW5mby4KICAgICAgICAiIiIKICAgICAgICBpZiBoYXNhdHRyKG9zLCAnY2htb2QnKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgb3MuY2htb2QodGFyZ2V0cGF0aCwgdGFyaW5mby5tb2RlKQogICAgICAgICAgICBleGNlcHQgRW52aXJvbm1lbnRFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgcmFpc2UgRXh0cmFjdEVycm9yKCJjb3VsZCBub3QgY2hhbmdlIG1vZGUiKQoKICAgIGRlZiB1dGltZShzZWxmLCB0YXJpbmZvLCB0YXJnZXRwYXRoKToKICAgICAgICAiIiJTZXQgbW9kaWZpY2F0aW9uIHRpbWUgb2YgdGFyZ2V0cGF0aCBhY2NvcmRpbmcgdG8gdGFyaW5mby4KICAgICAgICAiIiIKICAgICAgICBpZiBub3QgaGFzYXR0cihvcywgJ3V0aW1lJyk6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHRyeToKICAgICAgICAgICAgb3MudXRpbWUodGFyZ2V0cGF0aCwgKHRhcmluZm8ubXRpbWUsIHRhcmluZm8ubXRpbWUpKQogICAgICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yIGFzIGU6CiAgICAgICAgICAgIHJhaXNlIEV4dHJhY3RFcnJvcigiY291bGQgbm90IGNoYW5nZSBtb2RpZmljYXRpb24gdGltZSIpCgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBkZWYgbmV4dChzZWxmKToKICAgICAgICAiIiJSZXR1cm4gdGhlIG5leHQgbWVtYmVyIG9mIHRoZSBhcmNoaXZlIGFzIGEgVGFySW5mbyBvYmplY3QsIHdoZW4KICAgICAgICAgICBUYXJGaWxlIGlzIG9wZW5lZCBmb3IgcmVhZGluZy4gUmV0dXJuIE5vbmUgaWYgdGhlcmUgaXMgbm8gbW9yZQogICAgICAgICAgIGF2YWlsYWJsZS4KICAgICAgICAiIiIKICAgICAgICBzZWxmLl9jaGVjaygicmEiKQogICAgICAgIGlmIHNlbGYuZmlyc3RtZW1iZXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIG0gPSBzZWxmLmZpcnN0bWVtYmVyCiAgICAgICAgICAgIHNlbGYuZmlyc3RtZW1iZXIgPSBOb25lCiAgICAgICAgICAgIHJldHVybiBtCgogICAgICAgICMgUmVhZCB0aGUgbmV4dCBibG9jay4KICAgICAgICBzZWxmLmZpbGVvYmouc2VlayhzZWxmLm9mZnNldCkKICAgICAgICB0YXJpbmZvID0gTm9uZQogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhcmluZm8uZnJvbXRhcmZpbGUoc2VsZikKICAgICAgICAgICAgZXhjZXB0IEVPRkhlYWRlckVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICBpZiBzZWxmLmlnbm9yZV96ZXJvczoKICAgICAgICAgICAgICAgICAgICBzZWxmLl9kYmcoMiwgIjB4JVg6ICVzIiAlIChzZWxmLm9mZnNldCwgZSkpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5vZmZzZXQgKz0gQkxPQ0tTSVpFCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgZXhjZXB0IEludmFsaWRIZWFkZXJFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgaWYgc2VsZi5pZ25vcmVfemVyb3M6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZGJnKDIsICIweCVYOiAlcyIgJSAoc2VsZi5vZmZzZXQsIGUpKQogICAgICAgICAgICAgICAgICAgIHNlbGYub2Zmc2V0ICs9IEJMT0NLU0laRQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBlbGlmIHNlbGYub2Zmc2V0ID09IDA6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgUmVhZEVycm9yKHN0cihlKSkKICAgICAgICAgICAgZXhjZXB0IEVtcHR5SGVhZGVyRXJyb3I6CiAgICAgICAgICAgICAgICBpZiBzZWxmLm9mZnNldCA9PSAwOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFJlYWRFcnJvcigiZW1wdHkgZmlsZSIpCiAgICAgICAgICAgIGV4Y2VwdCBUcnVuY2F0ZWRIZWFkZXJFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgaWYgc2VsZi5vZmZzZXQgPT0gMDoKICAgICAgICAgICAgICAgICAgICByYWlzZSBSZWFkRXJyb3Ioc3RyKGUpKQogICAgICAgICAgICBleGNlcHQgU3Vic2VxdWVudEhlYWRlckVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICByYWlzZSBSZWFkRXJyb3Ioc3RyKGUpKQogICAgICAgICAgICBicmVhawoKICAgICAgICBpZiB0YXJpbmZvIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLm1lbWJlcnMuYXBwZW5kKHRhcmluZm8pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5fbG9hZGVkID0gVHJ1ZQoKICAgICAgICByZXR1cm4gdGFyaW5mbwoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBMaXR0bGUgaGVscGVyIG1ldGhvZHM6CgogICAgZGVmIF9nZXRtZW1iZXIoc2VsZiwgbmFtZSwgdGFyaW5mbz1Ob25lLCBub3JtYWxpemU9RmFsc2UpOgogICAgICAgICIiIkZpbmQgYW4gYXJjaGl2ZSBtZW1iZXIgYnkgbmFtZSBmcm9tIGJvdHRvbSB0byB0b3AuCiAgICAgICAgICAgSWYgdGFyaW5mbyBpcyBnaXZlbiwgaXQgaXMgdXNlZCBhcyB0aGUgc3RhcnRpbmcgcG9pbnQuCiAgICAgICAgIiIiCiAgICAgICAgIyBFbnN1cmUgdGhhdCBhbGwgbWVtYmVycyBoYXZlIGJlZW4gbG9hZGVkLgogICAgICAgIG1lbWJlcnMgPSBzZWxmLmdldG1lbWJlcnMoKQoKICAgICAgICAjIExpbWl0IHRoZSBtZW1iZXIgc2VhcmNoIGxpc3QgdXAgdG8gdGFyaW5mby4KICAgICAgICBpZiB0YXJpbmZvIGlzIG5vdCBOb25lOgogICAgICAgICAgICBtZW1iZXJzID0gbWVtYmVyc1s6bWVtYmVycy5pbmRleCh0YXJpbmZvKV0KCiAgICAgICAgaWYgbm9ybWFsaXplOgogICAgICAgICAgICBuYW1lID0gb3MucGF0aC5ub3JtcGF0aChuYW1lKQoKICAgICAgICBmb3IgbWVtYmVyIGluIHJldmVyc2VkKG1lbWJlcnMpOgogICAgICAgICAgICBpZiBub3JtYWxpemU6CiAgICAgICAgICAgICAgICBtZW1iZXJfbmFtZSA9IG9zLnBhdGgubm9ybXBhdGgobWVtYmVyLm5hbWUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBtZW1iZXJfbmFtZSA9IG1lbWJlci5uYW1lCgogICAgICAgICAgICBpZiBuYW1lID09IG1lbWJlcl9uYW1lOgogICAgICAgICAgICAgICAgcmV0dXJuIG1lbWJlcgoKICAgIGRlZiBfbG9hZChzZWxmKToKICAgICAgICAiIiJSZWFkIHRocm91Z2ggdGhlIGVudGlyZSBhcmNoaXZlIGZpbGUgYW5kIGxvb2sgZm9yIHJlYWRhYmxlCiAgICAgICAgICAgbWVtYmVycy4KICAgICAgICAiIiIKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICB0YXJpbmZvID0gc2VsZi5uZXh0KCkKICAgICAgICAgICAgaWYgdGFyaW5mbyBpcyBOb25lOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBzZWxmLl9sb2FkZWQgPSBUcnVlCgogICAgZGVmIF9jaGVjayhzZWxmLCBtb2RlPU5vbmUpOgogICAgICAgICIiIkNoZWNrIGlmIFRhckZpbGUgaXMgc3RpbGwgb3BlbiwgYW5kIGlmIHRoZSBvcGVyYXRpb24ncyBtb2RlCiAgICAgICAgICAgY29ycmVzcG9uZHMgdG8gVGFyRmlsZSdzIG1vZGUuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CiAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoIiVzIGlzIGNsb3NlZCIgJSBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXykKICAgICAgICBpZiBtb2RlIGlzIG5vdCBOb25lIGFuZCBzZWxmLm1vZGUgbm90IGluIG1vZGU6CiAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoImJhZCBvcGVyYXRpb24gZm9yIG1vZGUgJXIiICUgc2VsZi5tb2RlKQoKICAgIGRlZiBfZmluZF9saW5rX3RhcmdldChzZWxmLCB0YXJpbmZvKToKICAgICAgICAiIiJGaW5kIHRoZSB0YXJnZXQgbWVtYmVyIG9mIGEgc3ltbGluayBvciBoYXJkbGluayBtZW1iZXIgaW4gdGhlCiAgICAgICAgICAgYXJjaGl2ZS4KICAgICAgICAiIiIKICAgICAgICBpZiB0YXJpbmZvLmlzc3ltKCk6CiAgICAgICAgICAgICMgQWx3YXlzIHNlYXJjaCB0aGUgZW50aXJlIGFyY2hpdmUuCiAgICAgICAgICAgIGxpbmtuYW1lID0gb3MucGF0aC5kaXJuYW1lKHRhcmluZm8ubmFtZSkgKyAiLyIgKyB0YXJpbmZvLmxpbmtuYW1lCiAgICAgICAgICAgIGxpbWl0ID0gTm9uZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgU2VhcmNoIHRoZSBhcmNoaXZlIGJlZm9yZSB0aGUgbGluaywgYmVjYXVzZSBhIGhhcmQgbGluayBpcwogICAgICAgICAgICAjIGp1c3QgYSByZWZlcmVuY2UgdG8gYW4gYWxyZWFkeSBhcmNoaXZlZCBmaWxlLgogICAgICAgICAgICBsaW5rbmFtZSA9IHRhcmluZm8ubGlua25hbWUKICAgICAgICAgICAgbGltaXQgPSB0YXJpbmZvCgogICAgICAgIG1lbWJlciA9IHNlbGYuX2dldG1lbWJlcihsaW5rbmFtZSwgdGFyaW5mbz1saW1pdCwgbm9ybWFsaXplPVRydWUpCiAgICAgICAgaWYgbWVtYmVyIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCJsaW5rbmFtZSAlciBub3QgZm91bmQiICUgbGlua25hbWUpCiAgICAgICAgcmV0dXJuIG1lbWJlcgoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICAiIiJQcm92aWRlIGFuIGl0ZXJhdG9yIG9iamVjdC4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLl9sb2FkZWQ6CiAgICAgICAgICAgIHJldHVybiBpdGVyKHNlbGYubWVtYmVycykKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gVGFySXRlcihzZWxmKQoKICAgIGRlZiBfZGJnKHNlbGYsIGxldmVsLCBtc2cpOgogICAgICAgICIiIldyaXRlIGRlYnVnZ2luZyBvdXRwdXQgdG8gc3lzLnN0ZGVyci4KICAgICAgICAiIiIKICAgICAgICBpZiBsZXZlbCA8PSBzZWxmLmRlYnVnOgogICAgICAgICAgICBwcmludChtc2csIGZpbGU9c3lzLnN0ZGVycikKCiAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgogICAgICAgIHNlbGYuX2NoZWNrKCkKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBfX2V4aXRfXyhzZWxmLCB0eXBlLCB2YWx1ZSwgdHJhY2ViYWNrKToKICAgICAgICBpZiB0eXBlIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuY2xvc2UoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgQW4gZXhjZXB0aW9uIG9jY3VycmVkLiBXZSBtdXN0IG5vdCBjYWxsIGNsb3NlKCkgYmVjYXVzZQogICAgICAgICAgICAjIGl0IHdvdWxkIHRyeSB0byB3cml0ZSBlbmQtb2YtYXJjaGl2ZSBibG9ja3MgYW5kIHBhZGRpbmcuCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9leHRmaWxlb2JqOgogICAgICAgICAgICAgICAgc2VsZi5maWxlb2JqLmNsb3NlKCkKICAgICAgICAgICAgc2VsZi5jbG9zZWQgPSBUcnVlCiMgY2xhc3MgVGFyRmlsZQoKY2xhc3MgVGFySXRlcihvYmplY3QpOgogICAgIiIiSXRlcmF0b3IgQ2xhc3MuCgogICAgICAgZm9yIHRhcmluZm8gaW4gVGFyRmlsZSguLi4pOgogICAgICAgICAgIHN1aXRlLi4uCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgdGFyZmlsZSk6CiAgICAgICAgIiIiQ29uc3RydWN0IGEgVGFySXRlciBvYmplY3QuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi50YXJmaWxlID0gdGFyZmlsZQogICAgICAgIHNlbGYuaW5kZXggPSAwCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIGl0ZXJhdG9yIG9iamVjdC4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBfX25leHRfXyhzZWxmKToKICAgICAgICAiIiJSZXR1cm4gdGhlIG5leHQgaXRlbSB1c2luZyBUYXJGaWxlJ3MgbmV4dCgpIG1ldGhvZC4KICAgICAgICAgICBXaGVuIGFsbCBtZW1iZXJzIGhhdmUgYmVlbiByZWFkLCBzZXQgVGFyRmlsZSBhcyBfbG9hZGVkLgogICAgICAgICIiIgogICAgICAgICMgRml4IGZvciBTRiAjMTEwMDQyOTogVW5kZXIgcmFyZSBjaXJjdW1zdGFuY2VzIGl0IGNhbgogICAgICAgICMgaGFwcGVuIHRoYXQgZ2V0bWVtYmVycygpIGlzIGNhbGxlZCBkdXJpbmcgaXRlcmF0aW9uLAogICAgICAgICMgd2hpY2ggd2lsbCBjYXVzZSBUYXJJdGVyIHRvIHN0b3AgcHJlbWF0dXJlbHkuCiAgICAgICAgaWYgbm90IHNlbGYudGFyZmlsZS5fbG9hZGVkOgogICAgICAgICAgICB0YXJpbmZvID0gc2VsZi50YXJmaWxlLm5leHQoKQogICAgICAgICAgICBpZiBub3QgdGFyaW5mbzoKICAgICAgICAgICAgICAgIHNlbGYudGFyZmlsZS5fbG9hZGVkID0gVHJ1ZQogICAgICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhcmZpbGUubWVtYmVyc1tzZWxmLmluZGV4XQogICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KICAgICAgICBzZWxmLmluZGV4ICs9IDEKICAgICAgICByZXR1cm4gdGFyaW5mbwoKICAgIG5leHQgPSBfX25leHRfXyAjIGZvciBQeXRob24gMi54CgojLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBleHBvcnRlZCBmdW5jdGlvbnMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tCmRlZiBpc190YXJmaWxlKG5hbWUpOgogICAgIiIiUmV0dXJuIFRydWUgaWYgbmFtZSBwb2ludHMgdG8gYSB0YXIgYXJjaGl2ZSB0aGF0IHdlCiAgICAgICBhcmUgYWJsZSB0byBoYW5kbGUsIGVsc2UgcmV0dXJuIEZhbHNlLgogICAgIiIiCiAgICB0cnk6CiAgICAgICAgdCA9IG9wZW4obmFtZSkKICAgICAgICB0LmNsb3NlKCkKICAgICAgICByZXR1cm4gVHJ1ZQogICAgZXhjZXB0IFRhckVycm9yOgogICAgICAgIHJldHVybiBGYWxzZQoKYmx0bl9vcGVuID0gb3BlbgpvcGVuID0gVGFyRmlsZS5vcGVuClBLAwQUAAAAAAAAACEAXwlzYGGfAABhnwAALQAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL2NvbXBhdC5weSMgLSotIGNvZGluZzogdXRmLTggLSotCiMKIyBDb3B5cmlnaHQgKEMpIDIwMTMtMjAxNiBWaW5heSBTYWppcC4KIyBMaWNlbnNlZCB0byB0aGUgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24gdW5kZXIgYSBjb250cmlidXRvciBhZ3JlZW1lbnQuCiMgU2VlIExJQ0VOU0UudHh0IGFuZCBDT05UUklCVVRPUlMudHh0LgojCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgb3MKaW1wb3J0IHJlCmltcG9ydCBzeXMKCnRyeToKICAgIGltcG9ydCBzc2wKZXhjZXB0IEltcG9ydEVycm9yOgogICAgc3NsID0gTm9uZQoKaWYgc3lzLnZlcnNpb25faW5mb1swXSA8IDM6ICAjIHByYWdtYTogbm8gY292ZXIKICAgIGZyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCiAgICBzdHJpbmdfdHlwZXMgPSBiYXNlc3RyaW5nLAogICAgdGV4dF90eXBlID0gdW5pY29kZQogICAgZnJvbSB0eXBlcyBpbXBvcnQgRmlsZVR5cGUgYXMgZmlsZV90eXBlCiAgICBpbXBvcnQgX19idWlsdGluX18gYXMgYnVpbHRpbnMKICAgIGltcG9ydCBDb25maWdQYXJzZXIgYXMgY29uZmlncGFyc2VyCiAgICBmcm9tIC5fYmFja3BvcnQgaW1wb3J0IHNodXRpbAogICAgZnJvbSB1cmxwYXJzZSBpbXBvcnQgdXJscGFyc2UsIHVybHVucGFyc2UsIHVybGpvaW4sIHVybHNwbGl0LCB1cmx1bnNwbGl0CiAgICBmcm9tIHVybGxpYiBpbXBvcnQgKHVybHJldHJpZXZlLCBxdW90ZSBhcyBfcXVvdGUsIHVucXVvdGUsIHVybDJwYXRobmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgcGF0aG5hbWUydXJsLCBDb250ZW50VG9vU2hvcnRFcnJvciwgc3BsaXR0eXBlKQoKICAgIGRlZiBxdW90ZShzKToKICAgICAgICBpZiBpc2luc3RhbmNlKHMsIHVuaWNvZGUpOgogICAgICAgICAgICBzID0gcy5lbmNvZGUoJ3V0Zi04JykKICAgICAgICByZXR1cm4gX3F1b3RlKHMpCgogICAgaW1wb3J0IHVybGxpYjIKICAgIGZyb20gdXJsbGliMiBpbXBvcnQgKFJlcXVlc3QsIHVybG9wZW4sIFVSTEVycm9yLCBIVFRQRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICBIVFRQQmFzaWNBdXRoSGFuZGxlciwgSFRUUFBhc3N3b3JkTWdyLAogICAgICAgICAgICAgICAgICAgICAgICAgSFRUUEhhbmRsZXIsIEhUVFBSZWRpcmVjdEhhbmRsZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZF9vcGVuZXIpCiAgICBpZiBzc2w6CiAgICAgICAgZnJvbSB1cmxsaWIyIGltcG9ydCBIVFRQU0hhbmRsZXIKICAgIGltcG9ydCBodHRwbGliCiAgICBpbXBvcnQgeG1scnBjbGliCiAgICBpbXBvcnQgUXVldWUgYXMgcXVldWUKICAgIGZyb20gSFRNTFBhcnNlciBpbXBvcnQgSFRNTFBhcnNlcgogICAgaW1wb3J0IGh0bWxlbnRpdHlkZWZzCiAgICByYXdfaW5wdXQgPSByYXdfaW5wdXQKICAgIGZyb20gaXRlcnRvb2xzIGltcG9ydCBpZmlsdGVyIGFzIGZpbHRlcgogICAgZnJvbSBpdGVydG9vbHMgaW1wb3J0IGlmaWx0ZXJmYWxzZSBhcyBmaWx0ZXJmYWxzZQoKICAgIF91c2VycHJvZyA9IE5vbmUKICAgIGRlZiBzcGxpdHVzZXIoaG9zdCk6CiAgICAgICAgIiIic3BsaXR1c2VyKCd1c2VyWzpwYXNzd2RdQGhvc3RbOnBvcnRdJykgLS0+ICd1c2VyWzpwYXNzd2RdJywgJ2hvc3RbOnBvcnRdJy4iIiIKICAgICAgICBnbG9iYWwgX3VzZXJwcm9nCiAgICAgICAgaWYgX3VzZXJwcm9nIGlzIE5vbmU6CiAgICAgICAgICAgIGltcG9ydCByZQogICAgICAgICAgICBfdXNlcnByb2cgPSByZS5jb21waWxlKCdeKC4qKUAoLiopJCcpCgogICAgICAgIG1hdGNoID0gX3VzZXJwcm9nLm1hdGNoKGhvc3QpCiAgICAgICAgaWYgbWF0Y2g6IHJldHVybiBtYXRjaC5ncm91cCgxLCAyKQogICAgICAgIHJldHVybiBOb25lLCBob3N0CgplbHNlOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICBmcm9tIGlvIGltcG9ydCBTdHJpbmdJTwogICAgc3RyaW5nX3R5cGVzID0gc3RyLAogICAgdGV4dF90eXBlID0gc3RyCiAgICBmcm9tIGlvIGltcG9ydCBUZXh0SU9XcmFwcGVyIGFzIGZpbGVfdHlwZQogICAgaW1wb3J0IGJ1aWx0aW5zCiAgICBpbXBvcnQgY29uZmlncGFyc2VyCiAgICBpbXBvcnQgc2h1dGlsCiAgICBmcm9tIHVybGxpYi5wYXJzZSBpbXBvcnQgKHVybHBhcnNlLCB1cmx1bnBhcnNlLCB1cmxqb2luLCBzcGxpdHVzZXIsIHF1b3RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnF1b3RlLCB1cmxzcGxpdCwgdXJsdW5zcGxpdCwgc3BsaXR0eXBlKQogICAgZnJvbSB1cmxsaWIucmVxdWVzdCBpbXBvcnQgKHVybG9wZW4sIHVybHJldHJpZXZlLCBSZXF1ZXN0LCB1cmwycGF0aG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aG5hbWUydXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUVFBCYXNpY0F1dGhIYW5kbGVyLCBIVFRQUGFzc3dvcmRNZ3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFRUUEhhbmRsZXIsIEhUVFBSZWRpcmVjdEhhbmRsZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRfb3BlbmVyKQogICAgaWYgc3NsOgogICAgICAgIGZyb20gdXJsbGliLnJlcXVlc3QgaW1wb3J0IEhUVFBTSGFuZGxlcgogICAgZnJvbSB1cmxsaWIuZXJyb3IgaW1wb3J0IEhUVFBFcnJvciwgVVJMRXJyb3IsIENvbnRlbnRUb29TaG9ydEVycm9yCiAgICBpbXBvcnQgaHR0cC5jbGllbnQgYXMgaHR0cGxpYgogICAgaW1wb3J0IHVybGxpYi5yZXF1ZXN0IGFzIHVybGxpYjIKICAgIGltcG9ydCB4bWxycGMuY2xpZW50IGFzIHhtbHJwY2xpYgogICAgaW1wb3J0IHF1ZXVlCiAgICBmcm9tIGh0bWwucGFyc2VyIGltcG9ydCBIVE1MUGFyc2VyCiAgICBpbXBvcnQgaHRtbC5lbnRpdGllcyBhcyBodG1sZW50aXR5ZGVmcwogICAgcmF3X2lucHV0ID0gaW5wdXQKICAgIGZyb20gaXRlcnRvb2xzIGltcG9ydCBmaWx0ZXJmYWxzZQogICAgZmlsdGVyID0gZmlsdGVyCgp0cnk6CiAgICBmcm9tIHNzbCBpbXBvcnQgbWF0Y2hfaG9zdG5hbWUsIENlcnRpZmljYXRlRXJyb3IKZXhjZXB0IEltcG9ydEVycm9yOiAjIHByYWdtYTogbm8gY292ZXIKICAgIGNsYXNzIENlcnRpZmljYXRlRXJyb3IoVmFsdWVFcnJvcik6CiAgICAgICAgcGFzcwoKCiAgICBkZWYgX2Ruc25hbWVfbWF0Y2goZG4sIGhvc3RuYW1lLCBtYXhfd2lsZGNhcmRzPTEpOgogICAgICAgICIiIk1hdGNoaW5nIGFjY29yZGluZyB0byBSRkMgNjEyNSwgc2VjdGlvbiA2LjQuMwoKICAgICAgICBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2MTI1I3NlY3Rpb24tNi40LjMKICAgICAgICAiIiIKICAgICAgICBwYXRzID0gW10KICAgICAgICBpZiBub3QgZG46CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICBwYXJ0cyA9IGRuLnNwbGl0KCcuJykKICAgICAgICBsZWZ0bW9zdCwgcmVtYWluZGVyID0gcGFydHNbMF0sIHBhcnRzWzE6XQoKICAgICAgICB3aWxkY2FyZHMgPSBsZWZ0bW9zdC5jb3VudCgnKicpCiAgICAgICAgaWYgd2lsZGNhcmRzID4gbWF4X3dpbGRjYXJkczoKICAgICAgICAgICAgIyBJc3N1ZSAjMTc5ODA6IGF2b2lkIGRlbmlhbHMgb2Ygc2VydmljZSBieSByZWZ1c2luZyBtb3JlCiAgICAgICAgICAgICMgdGhhbiBvbmUgd2lsZGNhcmQgcGVyIGZyYWdtZW50LiAgQSBzdXJ2ZXkgb2YgZXN0YWJsaXNoZWQKICAgICAgICAgICAgIyBwb2xpY3kgYW1vbmcgU1NMIGltcGxlbWVudGF0aW9ucyBzaG93ZWQgaXQgdG8gYmUgYQogICAgICAgICAgICAjIHJlYXNvbmFibGUgY2hvaWNlLgogICAgICAgICAgICByYWlzZSBDZXJ0aWZpY2F0ZUVycm9yKAogICAgICAgICAgICAgICAgInRvbyBtYW55IHdpbGRjYXJkcyBpbiBjZXJ0aWZpY2F0ZSBETlMgbmFtZTogIiArIHJlcHIoZG4pKQoKICAgICAgICAjIHNwZWVkIHVwIGNvbW1vbiBjYXNlIHcvbyB3aWxkY2FyZHMKICAgICAgICBpZiBub3Qgd2lsZGNhcmRzOgogICAgICAgICAgICByZXR1cm4gZG4ubG93ZXIoKSA9PSBob3N0bmFtZS5sb3dlcigpCgogICAgICAgICMgUkZDIDYxMjUsIHNlY3Rpb24gNi40LjMsIHN1Yml0ZW0gMS4KICAgICAgICAjIFRoZSBjbGllbnQgU0hPVUxEIE5PVCBhdHRlbXB0IHRvIG1hdGNoIGEgcHJlc2VudGVkIGlkZW50aWZpZXIgaW4gd2hpY2gKICAgICAgICAjIHRoZSB3aWxkY2FyZCBjaGFyYWN0ZXIgY29tcHJpc2VzIGEgbGFiZWwgb3RoZXIgdGhhbiB0aGUgbGVmdC1tb3N0IGxhYmVsLgogICAgICAgIGlmIGxlZnRtb3N0ID09ICcqJzoKICAgICAgICAgICAgIyBXaGVuICcqJyBpcyBhIGZyYWdtZW50IGJ5IGl0c2VsZiwgaXQgbWF0Y2hlcyBhIG5vbi1lbXB0eSBkb3RsZXNzCiAgICAgICAgICAgICMgZnJhZ21lbnQuCiAgICAgICAgICAgIHBhdHMuYXBwZW5kKCdbXi5dKycpCiAgICAgICAgZWxpZiBsZWZ0bW9zdC5zdGFydHN3aXRoKCd4bi0tJykgb3IgaG9zdG5hbWUuc3RhcnRzd2l0aCgneG4tLScpOgogICAgICAgICAgICAjIFJGQyA2MTI1LCBzZWN0aW9uIDYuNC4zLCBzdWJpdGVtIDMuCiAgICAgICAgICAgICMgVGhlIGNsaWVudCBTSE9VTEQgTk9UIGF0dGVtcHQgdG8gbWF0Y2ggYSBwcmVzZW50ZWQgaWRlbnRpZmllcgogICAgICAgICAgICAjIHdoZXJlIHRoZSB3aWxkY2FyZCBjaGFyYWN0ZXIgaXMgZW1iZWRkZWQgd2l0aGluIGFuIEEtbGFiZWwgb3IKICAgICAgICAgICAgIyBVLWxhYmVsIG9mIGFuIGludGVybmF0aW9uYWxpemVkIGRvbWFpbiBuYW1lLgogICAgICAgICAgICBwYXRzLmFwcGVuZChyZS5lc2NhcGUobGVmdG1vc3QpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgT3RoZXJ3aXNlLCAnKicgbWF0Y2hlcyBhbnkgZG90bGVzcyBzdHJpbmcsIGUuZy4gd3d3KgogICAgICAgICAgICBwYXRzLmFwcGVuZChyZS5lc2NhcGUobGVmdG1vc3QpLnJlcGxhY2UocidcKicsICdbXi5dKicpKQoKICAgICAgICAjIGFkZCB0aGUgcmVtYWluaW5nIGZyYWdtZW50cywgaWdub3JlIGFueSB3aWxkY2FyZHMKICAgICAgICBmb3IgZnJhZyBpbiByZW1haW5kZXI6CiAgICAgICAgICAgIHBhdHMuYXBwZW5kKHJlLmVzY2FwZShmcmFnKSkKCiAgICAgICAgcGF0ID0gcmUuY29tcGlsZShyJ1xBJyArIHInXC4nLmpvaW4ocGF0cykgKyByJ1xaJywgcmUuSUdOT1JFQ0FTRSkKICAgICAgICByZXR1cm4gcGF0Lm1hdGNoKGhvc3RuYW1lKQoKCiAgICBkZWYgbWF0Y2hfaG9zdG5hbWUoY2VydCwgaG9zdG5hbWUpOgogICAgICAgICIiIlZlcmlmeSB0aGF0ICpjZXJ0KiAoaW4gZGVjb2RlZCBmb3JtYXQgYXMgcmV0dXJuZWQgYnkKICAgICAgICBTU0xTb2NrZXQuZ2V0cGVlcmNlcnQoKSkgbWF0Y2hlcyB0aGUgKmhvc3RuYW1lKi4gIFJGQyAyODE4IGFuZCBSRkMgNjEyNQogICAgICAgIHJ1bGVzIGFyZSBmb2xsb3dlZCwgYnV0IElQIGFkZHJlc3NlcyBhcmUgbm90IGFjY2VwdGVkIGZvciAqaG9zdG5hbWUqLgoKICAgICAgICBDZXJ0aWZpY2F0ZUVycm9yIGlzIHJhaXNlZCBvbiBmYWlsdXJlLiBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24KICAgICAgICByZXR1cm5zIG5vdGhpbmcuCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IGNlcnQ6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImVtcHR5IG9yIG5vIGNlcnRpZmljYXRlLCBtYXRjaF9ob3N0bmFtZSBuZWVkcyBhICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU1NMIHNvY2tldCBvciBTU0wgY29udGV4dCB3aXRoIGVpdGhlciAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNFUlRfT1BUSU9OQUwgb3IgQ0VSVF9SRVFVSVJFRCIpCiAgICAgICAgZG5zbmFtZXMgPSBbXQogICAgICAgIHNhbiA9IGNlcnQuZ2V0KCdzdWJqZWN0QWx0TmFtZScsICgpKQogICAgICAgIGZvciBrZXksIHZhbHVlIGluIHNhbjoKICAgICAgICAgICAgaWYga2V5ID09ICdETlMnOgogICAgICAgICAgICAgICAgaWYgX2Ruc25hbWVfbWF0Y2godmFsdWUsIGhvc3RuYW1lKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICAgIGRuc25hbWVzLmFwcGVuZCh2YWx1ZSkKICAgICAgICBpZiBub3QgZG5zbmFtZXM6CiAgICAgICAgICAgICMgVGhlIHN1YmplY3QgaXMgb25seSBjaGVja2VkIHdoZW4gdGhlcmUgaXMgbm8gZE5TTmFtZSBlbnRyeQogICAgICAgICAgICAjIGluIHN1YmplY3RBbHROYW1lCiAgICAgICAgICAgIGZvciBzdWIgaW4gY2VydC5nZXQoJ3N1YmplY3QnLCAoKSk6CiAgICAgICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzdWI6CiAgICAgICAgICAgICAgICAgICAgIyBYWFggYWNjb3JkaW5nIHRvIFJGQyAyODE4LCB0aGUgbW9zdCBzcGVjaWZpYyBDb21tb24gTmFtZQogICAgICAgICAgICAgICAgICAgICMgbXVzdCBiZSB1c2VkLgogICAgICAgICAgICAgICAgICAgIGlmIGtleSA9PSAnY29tbW9uTmFtZSc6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIF9kbnNuYW1lX21hdGNoKHZhbHVlLCBob3N0bmFtZSk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICAgICAgICAgICAgZG5zbmFtZXMuYXBwZW5kKHZhbHVlKQogICAgICAgIGlmIGxlbihkbnNuYW1lcykgPiAxOgogICAgICAgICAgICByYWlzZSBDZXJ0aWZpY2F0ZUVycm9yKCJob3N0bmFtZSAlciAiCiAgICAgICAgICAgICAgICAiZG9lc24ndCBtYXRjaCBlaXRoZXIgb2YgJXMiCiAgICAgICAgICAgICAgICAlIChob3N0bmFtZSwgJywgJy5qb2luKG1hcChyZXByLCBkbnNuYW1lcykpKSkKICAgICAgICBlbGlmIGxlbihkbnNuYW1lcykgPT0gMToKICAgICAgICAgICAgcmFpc2UgQ2VydGlmaWNhdGVFcnJvcigiaG9zdG5hbWUgJXIgIgogICAgICAgICAgICAgICAgImRvZXNuJ3QgbWF0Y2ggJXIiCiAgICAgICAgICAgICAgICAlIChob3N0bmFtZSwgZG5zbmFtZXNbMF0pKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIENlcnRpZmljYXRlRXJyb3IoIm5vIGFwcHJvcHJpYXRlIGNvbW1vbk5hbWUgb3IgIgogICAgICAgICAgICAgICAgInN1YmplY3RBbHROYW1lIGZpZWxkcyB3ZXJlIGZvdW5kIikKCgp0cnk6CiAgICBmcm9tIHR5cGVzIGltcG9ydCBTaW1wbGVOYW1lc3BhY2UgYXMgQ29udGFpbmVyCmV4Y2VwdCBJbXBvcnRFcnJvcjogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgY2xhc3MgQ29udGFpbmVyKG9iamVjdCk6CiAgICAgICAgIiIiCiAgICAgICAgQSBnZW5lcmljIGNvbnRhaW5lciBmb3Igd2hlbiBtdWx0aXBsZSB2YWx1ZXMgbmVlZCB0byBiZSByZXR1cm5lZAogICAgICAgICIiIgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqKmt3YXJncyk6CiAgICAgICAgICAgIHNlbGYuX19kaWN0X18udXBkYXRlKGt3YXJncykKCgp0cnk6CiAgICBmcm9tIHNodXRpbCBpbXBvcnQgd2hpY2gKZXhjZXB0IEltcG9ydEVycm9yOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAjIEltcGxlbWVudGF0aW9uIGZyb20gUHl0aG9uIDMuMwogICAgZGVmIHdoaWNoKGNtZCwgbW9kZT1vcy5GX09LIHwgb3MuWF9PSywgcGF0aD1Ob25lKToKICAgICAgICAiIiJHaXZlbiBhIGNvbW1hbmQsIG1vZGUsIGFuZCBhIFBBVEggc3RyaW5nLCByZXR1cm4gdGhlIHBhdGggd2hpY2gKICAgICAgICBjb25mb3JtcyB0byB0aGUgZ2l2ZW4gbW9kZSBvbiB0aGUgUEFUSCwgb3IgTm9uZSBpZiB0aGVyZSBpcyBubyBzdWNoCiAgICAgICAgZmlsZS4KCiAgICAgICAgYG1vZGVgIGRlZmF1bHRzIHRvIG9zLkZfT0sgfCBvcy5YX09LLiBgcGF0aGAgZGVmYXVsdHMgdG8gdGhlIHJlc3VsdAogICAgICAgIG9mIG9zLmVudmlyb24uZ2V0KCJQQVRIIiksIG9yIGNhbiBiZSBvdmVycmlkZGVuIHdpdGggYSBjdXN0b20gc2VhcmNoCiAgICAgICAgcGF0aC4KCiAgICAgICAgIiIiCiAgICAgICAgIyBDaGVjayB0aGF0IGEgZ2l2ZW4gZmlsZSBjYW4gYmUgYWNjZXNzZWQgd2l0aCB0aGUgY29ycmVjdCBtb2RlLgogICAgICAgICMgQWRkaXRpb25hbGx5IGNoZWNrIHRoYXQgYGZpbGVgIGlzIG5vdCBhIGRpcmVjdG9yeSwgYXMgb24gV2luZG93cwogICAgICAgICMgZGlyZWN0b3JpZXMgcGFzcyB0aGUgb3MuYWNjZXNzIGNoZWNrLgogICAgICAgIGRlZiBfYWNjZXNzX2NoZWNrKGZuLCBtb2RlKToKICAgICAgICAgICAgcmV0dXJuIChvcy5wYXRoLmV4aXN0cyhmbikgYW5kIG9zLmFjY2VzcyhmbiwgbW9kZSkKICAgICAgICAgICAgICAgICAgICBhbmQgbm90IG9zLnBhdGguaXNkaXIoZm4pKQoKICAgICAgICAjIElmIHdlJ3JlIGdpdmVuIGEgcGF0aCB3aXRoIGEgZGlyZWN0b3J5IHBhcnQsIGxvb2sgaXQgdXAgZGlyZWN0bHkgcmF0aGVyCiAgICAgICAgIyB0aGFuIHJlZmVycmluZyB0byBQQVRIIGRpcmVjdG9yaWVzLiBUaGlzIGluY2x1ZGVzIGNoZWNraW5nIHJlbGF0aXZlIHRvIHRoZQogICAgICAgICMgY3VycmVudCBkaXJlY3RvcnksIGUuZy4gLi9zY3JpcHQKICAgICAgICBpZiBvcy5wYXRoLmRpcm5hbWUoY21kKToKICAgICAgICAgICAgaWYgX2FjY2Vzc19jaGVjayhjbWQsIG1vZGUpOgogICAgICAgICAgICAgICAgcmV0dXJuIGNtZAogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICBpZiBwYXRoIGlzIE5vbmU6CiAgICAgICAgICAgIHBhdGggPSBvcy5lbnZpcm9uLmdldCgiUEFUSCIsIG9zLmRlZnBhdGgpCiAgICAgICAgaWYgbm90IHBhdGg6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcGF0aCA9IHBhdGguc3BsaXQob3MucGF0aHNlcCkKCiAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICJ3aW4zMiI6CiAgICAgICAgICAgICMgVGhlIGN1cnJlbnQgZGlyZWN0b3J5IHRha2VzIHByZWNlZGVuY2Ugb24gV2luZG93cy4KICAgICAgICAgICAgaWYgbm90IG9zLmN1cmRpciBpbiBwYXRoOgogICAgICAgICAgICAgICAgcGF0aC5pbnNlcnQoMCwgb3MuY3VyZGlyKQoKICAgICAgICAgICAgIyBQQVRIRVhUIGlzIG5lY2Vzc2FyeSB0byBjaGVjayBvbiBXaW5kb3dzLgogICAgICAgICAgICBwYXRoZXh0ID0gb3MuZW52aXJvbi5nZXQoIlBBVEhFWFQiLCAiIikuc3BsaXQob3MucGF0aHNlcCkKICAgICAgICAgICAgIyBTZWUgaWYgdGhlIGdpdmVuIGZpbGUgbWF0Y2hlcyBhbnkgb2YgdGhlIGV4cGVjdGVkIHBhdGggZXh0ZW5zaW9ucy4KICAgICAgICAgICAgIyBUaGlzIHdpbGwgYWxsb3cgdXMgdG8gc2hvcnQgY2lyY3VpdCB3aGVuIGdpdmVuICJweXRob24uZXhlIi4KICAgICAgICAgICAgIyBJZiBpdCBkb2VzIG1hdGNoLCBvbmx5IHRlc3QgdGhhdCBvbmUsIG90aGVyd2lzZSB3ZSBoYXZlIHRvIHRyeQogICAgICAgICAgICAjIG90aGVycy4KICAgICAgICAgICAgaWYgYW55KGNtZC5sb3dlcigpLmVuZHN3aXRoKGV4dC5sb3dlcigpKSBmb3IgZXh0IGluIHBhdGhleHQpOgogICAgICAgICAgICAgICAgZmlsZXMgPSBbY21kXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZmlsZXMgPSBbY21kICsgZXh0IGZvciBleHQgaW4gcGF0aGV4dF0KICAgICAgICBlbHNlOgogICAgICAgICAgICAjIE9uIG90aGVyIHBsYXRmb3JtcyB5b3UgZG9uJ3QgaGF2ZSB0aGluZ3MgbGlrZSBQQVRIRVhUIHRvIHRlbGwgeW91CiAgICAgICAgICAgICMgd2hhdCBmaWxlIHN1ZmZpeGVzIGFyZSBleGVjdXRhYmxlLCBzbyBqdXN0IHBhc3Mgb24gY21kIGFzLWlzLgogICAgICAgICAgICBmaWxlcyA9IFtjbWRdCgogICAgICAgIHNlZW4gPSBzZXQoKQogICAgICAgIGZvciBkaXIgaW4gcGF0aDoKICAgICAgICAgICAgbm9ybWRpciA9IG9zLnBhdGgubm9ybWNhc2UoZGlyKQogICAgICAgICAgICBpZiBub3Qgbm9ybWRpciBpbiBzZWVuOgogICAgICAgICAgICAgICAgc2Vlbi5hZGQobm9ybWRpcikKICAgICAgICAgICAgICAgIGZvciB0aGVmaWxlIGluIGZpbGVzOgogICAgICAgICAgICAgICAgICAgIG5hbWUgPSBvcy5wYXRoLmpvaW4oZGlyLCB0aGVmaWxlKQogICAgICAgICAgICAgICAgICAgIGlmIF9hY2Nlc3NfY2hlY2sobmFtZSwgbW9kZSk6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuYW1lCiAgICAgICAgcmV0dXJuIE5vbmUKCgojIFppcEZpbGUgaXMgYSBjb250ZXh0IG1hbmFnZXIgaW4gMi43LCBidXQgbm90IGluIDIuNgoKZnJvbSB6aXBmaWxlIGltcG9ydCBaaXBGaWxlIGFzIEJhc2VaaXBGaWxlCgppZiBoYXNhdHRyKEJhc2VaaXBGaWxlLCAnX19lbnRlcl9fJyk6ICAjIHByYWdtYTogbm8gY292ZXIKICAgIFppcEZpbGUgPSBCYXNlWmlwRmlsZQplbHNlOgogICAgZnJvbSB6aXBmaWxlIGltcG9ydCBaaXBFeHRGaWxlIGFzIEJhc2VaaXBFeHRGaWxlCgogICAgY2xhc3MgWmlwRXh0RmlsZShCYXNlWmlwRXh0RmlsZSk6CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGJhc2UpOgogICAgICAgICAgICBzZWxmLl9fZGljdF9fLnVwZGF0ZShiYXNlLl9fZGljdF9fKQoKICAgICAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gc2VsZgoKICAgICAgICBkZWYgX19leGl0X18oc2VsZiwgKmV4Y19pbmZvKToKICAgICAgICAgICAgc2VsZi5jbG9zZSgpCiAgICAgICAgICAgICMgcmV0dXJuIE5vbmUsIHNvIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnJlZCwgaXQgd2lsbCBwcm9wYWdhdGUKCiAgICBjbGFzcyBaaXBGaWxlKEJhc2VaaXBGaWxlKToKICAgICAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gc2VsZgoKICAgICAgICBkZWYgX19leGl0X18oc2VsZiwgKmV4Y19pbmZvKToKICAgICAgICAgICAgc2VsZi5jbG9zZSgpCiAgICAgICAgICAgICMgcmV0dXJuIE5vbmUsIHNvIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnJlZCwgaXQgd2lsbCBwcm9wYWdhdGUKCiAgICAgICAgZGVmIG9wZW4oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAgICAgYmFzZSA9IEJhc2VaaXBGaWxlLm9wZW4oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKQogICAgICAgICAgICByZXR1cm4gWmlwRXh0RmlsZShiYXNlKQoKdHJ5OgogICAgZnJvbSBwbGF0Zm9ybSBpbXBvcnQgcHl0aG9uX2ltcGxlbWVudGF0aW9uCmV4Y2VwdCBJbXBvcnRFcnJvcjogIyBwcmFnbWE6IG5vIGNvdmVyCiAgICBkZWYgcHl0aG9uX2ltcGxlbWVudGF0aW9uKCk6CiAgICAgICAgIiIiUmV0dXJuIGEgc3RyaW5nIGlkZW50aWZ5aW5nIHRoZSBQeXRob24gaW1wbGVtZW50YXRpb24uIiIiCiAgICAgICAgaWYgJ1B5UHknIGluIHN5cy52ZXJzaW9uOgogICAgICAgICAgICByZXR1cm4gJ1B5UHknCiAgICAgICAgaWYgb3MubmFtZSA9PSAnamF2YSc6CiAgICAgICAgICAgIHJldHVybiAnSnl0aG9uJwogICAgICAgIGlmIHN5cy52ZXJzaW9uLnN0YXJ0c3dpdGgoJ0lyb25QeXRob24nKToKICAgICAgICAgICAgcmV0dXJuICdJcm9uUHl0aG9uJwogICAgICAgIHJldHVybiAnQ1B5dGhvbicKCnRyeToKICAgIGltcG9ydCBzeXNjb25maWcKZXhjZXB0IEltcG9ydEVycm9yOiAjIHByYWdtYTogbm8gY292ZXIKICAgIGZyb20gLl9iYWNrcG9ydCBpbXBvcnQgc3lzY29uZmlnCgp0cnk6CiAgICBjYWxsYWJsZSA9IGNhbGxhYmxlCmV4Y2VwdCBOYW1lRXJyb3I6ICAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBDYWxsYWJsZQoKICAgIGRlZiBjYWxsYWJsZShvYmopOgogICAgICAgIHJldHVybiBpc2luc3RhbmNlKG9iaiwgQ2FsbGFibGUpCgoKdHJ5OgogICAgZnNlbmNvZGUgPSBvcy5mc2VuY29kZQogICAgZnNkZWNvZGUgPSBvcy5mc2RlY29kZQpleGNlcHQgQXR0cmlidXRlRXJyb3I6ICAjIHByYWdtYTogbm8gY292ZXIKICAgIF9mc2VuY29kaW5nID0gc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpCiAgICBpZiBfZnNlbmNvZGluZyA9PSAnbWJjcyc6CiAgICAgICAgX2ZzZXJyb3JzID0gJ3N0cmljdCcKICAgIGVsc2U6CiAgICAgICAgX2ZzZXJyb3JzID0gJ3N1cnJvZ2F0ZWVzY2FwZScKCiAgICBkZWYgZnNlbmNvZGUoZmlsZW5hbWUpOgogICAgICAgIGlmIGlzaW5zdGFuY2UoZmlsZW5hbWUsIGJ5dGVzKToKICAgICAgICAgICAgcmV0dXJuIGZpbGVuYW1lCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKGZpbGVuYW1lLCB0ZXh0X3R5cGUpOgogICAgICAgICAgICByZXR1cm4gZmlsZW5hbWUuZW5jb2RlKF9mc2VuY29kaW5nLCBfZnNlcnJvcnMpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJleHBlY3QgYnl0ZXMgb3Igc3RyLCBub3QgJXMiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUoZmlsZW5hbWUpLl9fbmFtZV9fKQoKICAgIGRlZiBmc2RlY29kZShmaWxlbmFtZSk6CiAgICAgICAgaWYgaXNpbnN0YW5jZShmaWxlbmFtZSwgdGV4dF90eXBlKToKICAgICAgICAgICAgcmV0dXJuIGZpbGVuYW1lCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKGZpbGVuYW1lLCBieXRlcyk6CiAgICAgICAgICAgIHJldHVybiBmaWxlbmFtZS5kZWNvZGUoX2ZzZW5jb2RpbmcsIF9mc2Vycm9ycykKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImV4cGVjdCBieXRlcyBvciBzdHIsIG5vdCAlcyIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZShmaWxlbmFtZSkuX19uYW1lX18pCgp0cnk6CiAgICBmcm9tIHRva2VuaXplIGltcG9ydCBkZXRlY3RfZW5jb2RpbmcKZXhjZXB0IEltcG9ydEVycm9yOiAjIHByYWdtYTogbm8gY292ZXIKICAgIGZyb20gY29kZWNzIGltcG9ydCBCT01fVVRGOCwgbG9va3VwCiAgICBpbXBvcnQgcmUKCiAgICBjb29raWVfcmUgPSByZS5jb21waWxlKCJjb2RpbmdbOj1dXHMqKFstXHcuXSspIikKCiAgICBkZWYgX2dldF9ub3JtYWxfbmFtZShvcmlnX2VuYyk6CiAgICAgICAgIiIiSW1pdGF0ZXMgZ2V0X25vcm1hbF9uYW1lIGluIHRva2VuaXplci5jLiIiIgogICAgICAgICMgT25seSBjYXJlIGFib3V0IHRoZSBmaXJzdCAxMiBjaGFyYWN0ZXJzLgogICAgICAgIGVuYyA9IG9yaWdfZW5jWzoxMl0ubG93ZXIoKS5yZXBsYWNlKCJfIiwgIi0iKQogICAgICAgIGlmIGVuYyA9PSAidXRmLTgiIG9yIGVuYy5zdGFydHN3aXRoKCJ1dGYtOC0iKToKICAgICAgICAgICAgcmV0dXJuICJ1dGYtOCIKICAgICAgICBpZiBlbmMgaW4gKCJsYXRpbi0xIiwgImlzby04ODU5LTEiLCAiaXNvLWxhdGluLTEiKSBvciBcCiAgICAgICAgICAgZW5jLnN0YXJ0c3dpdGgoKCJsYXRpbi0xLSIsICJpc28tODg1OS0xLSIsICJpc28tbGF0aW4tMS0iKSk6CiAgICAgICAgICAgIHJldHVybiAiaXNvLTg4NTktMSIKICAgICAgICByZXR1cm4gb3JpZ19lbmMKCiAgICBkZWYgZGV0ZWN0X2VuY29kaW5nKHJlYWRsaW5lKToKICAgICAgICAiIiIKICAgICAgICBUaGUgZGV0ZWN0X2VuY29kaW5nKCkgZnVuY3Rpb24gaXMgdXNlZCB0byBkZXRlY3QgdGhlIGVuY29kaW5nIHRoYXQgc2hvdWxkCiAgICAgICAgYmUgdXNlZCB0byBkZWNvZGUgYSBQeXRob24gc291cmNlIGZpbGUuICBJdCByZXF1aXJlcyBvbmUgYXJndW1lbnQsIHJlYWRsaW5lLAogICAgICAgIGluIHRoZSBzYW1lIHdheSBhcyB0aGUgdG9rZW5pemUoKSBnZW5lcmF0b3IuCgogICAgICAgIEl0IHdpbGwgY2FsbCByZWFkbGluZSBhIG1heGltdW0gb2YgdHdpY2UsIGFuZCByZXR1cm4gdGhlIGVuY29kaW5nIHVzZWQKICAgICAgICAoYXMgYSBzdHJpbmcpIGFuZCBhIGxpc3Qgb2YgYW55IGxpbmVzIChsZWZ0IGFzIGJ5dGVzKSBpdCBoYXMgcmVhZCBpbi4KCiAgICAgICAgSXQgZGV0ZWN0cyB0aGUgZW5jb2RpbmcgZnJvbSB0aGUgcHJlc2VuY2Ugb2YgYSB1dGYtOCBib20gb3IgYW4gZW5jb2RpbmcKICAgICAgICBjb29raWUgYXMgc3BlY2lmaWVkIGluIHBlcC0wMjYzLiAgSWYgYm90aCBhIGJvbSBhbmQgYSBjb29raWUgYXJlIHByZXNlbnQsCiAgICAgICAgYnV0IGRpc2FncmVlLCBhIFN5bnRheEVycm9yIHdpbGwgYmUgcmFpc2VkLiAgSWYgdGhlIGVuY29kaW5nIGNvb2tpZSBpcyBhbgogICAgICAgIGludmFsaWQgY2hhcnNldCwgcmFpc2UgYSBTeW50YXhFcnJvci4gIE5vdGUgdGhhdCBpZiBhIHV0Zi04IGJvbSBpcyBmb3VuZCwKICAgICAgICAndXRmLTgtc2lnJyBpcyByZXR1cm5lZC4KCiAgICAgICAgSWYgbm8gZW5jb2RpbmcgaXMgc3BlY2lmaWVkLCB0aGVuIHRoZSBkZWZhdWx0IG9mICd1dGYtOCcgd2lsbCBiZSByZXR1cm5lZC4KICAgICAgICAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZpbGVuYW1lID0gcmVhZGxpbmUuX19zZWxmX18ubmFtZQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgZmlsZW5hbWUgPSBOb25lCiAgICAgICAgYm9tX2ZvdW5kID0gRmFsc2UKICAgICAgICBlbmNvZGluZyA9IE5vbmUKICAgICAgICBkZWZhdWx0ID0gJ3V0Zi04JwogICAgICAgIGRlZiByZWFkX29yX3N0b3AoKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRsaW5lKCkKICAgICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CiAgICAgICAgICAgICAgICByZXR1cm4gYicnCgogICAgICAgIGRlZiBmaW5kX2Nvb2tpZShsaW5lKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIyBEZWNvZGUgYXMgVVRGLTguIEVpdGhlciB0aGUgbGluZSBpcyBhbiBlbmNvZGluZyBkZWNsYXJhdGlvbiwKICAgICAgICAgICAgICAgICMgaW4gd2hpY2ggY2FzZSBpdCBzaG91bGQgYmUgcHVyZSBBU0NJSSwgb3IgaXQgbXVzdCBiZSBVVEYtOAogICAgICAgICAgICAgICAgIyBwZXIgZGVmYXVsdCBlbmNvZGluZy4KICAgICAgICAgICAgICAgIGxpbmVfc3RyaW5nID0gbGluZS5kZWNvZGUoJ3V0Zi04JykKICAgICAgICAgICAgZXhjZXB0IFVuaWNvZGVEZWNvZGVFcnJvcjoKICAgICAgICAgICAgICAgIG1zZyA9ICJpbnZhbGlkIG9yIG1pc3NpbmcgZW5jb2RpbmcgZGVjbGFyYXRpb24iCiAgICAgICAgICAgICAgICBpZiBmaWxlbmFtZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICBtc2cgPSAne30gZm9yIHshcn0nLmZvcm1hdChtc2csIGZpbGVuYW1lKQogICAgICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IobXNnKQoKICAgICAgICAgICAgbWF0Y2hlcyA9IGNvb2tpZV9yZS5maW5kYWxsKGxpbmVfc3RyaW5nKQogICAgICAgICAgICBpZiBub3QgbWF0Y2hlczoKICAgICAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgICAgIGVuY29kaW5nID0gX2dldF9ub3JtYWxfbmFtZShtYXRjaGVzWzBdKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBjb2RlYyA9IGxvb2t1cChlbmNvZGluZykKICAgICAgICAgICAgZXhjZXB0IExvb2t1cEVycm9yOgogICAgICAgICAgICAgICAgIyBUaGlzIGJlaGF2aW91ciBtaW1pY3MgdGhlIFB5dGhvbiBpbnRlcnByZXRlcgogICAgICAgICAgICAgICAgaWYgZmlsZW5hbWUgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICBtc2cgPSAidW5rbm93biBlbmNvZGluZzogIiArIGVuY29kaW5nCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG1zZyA9ICJ1bmtub3duIGVuY29kaW5nIGZvciB7IXJ9OiB7fSIuZm9ybWF0KGZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcpCiAgICAgICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvcihtc2cpCgogICAgICAgICAgICBpZiBib21fZm91bmQ6CiAgICAgICAgICAgICAgICBpZiBjb2RlYy5uYW1lICE9ICd1dGYtOCc6CiAgICAgICAgICAgICAgICAgICAgIyBUaGlzIGJlaGF2aW91ciBtaW1pY3MgdGhlIFB5dGhvbiBpbnRlcnByZXRlcgogICAgICAgICAgICAgICAgICAgIGlmIGZpbGVuYW1lIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9ICdlbmNvZGluZyBwcm9ibGVtOiB1dGYtOCcKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSAnZW5jb2RpbmcgcHJvYmxlbSBmb3IgeyFyfTogdXRmLTgnLmZvcm1hdChmaWxlbmFtZSkKICAgICAgICAgICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvcihtc2cpCiAgICAgICAgICAgICAgICBlbmNvZGluZyArPSAnLXNpZycKICAgICAgICAgICAgcmV0dXJuIGVuY29kaW5nCgogICAgICAgIGZpcnN0ID0gcmVhZF9vcl9zdG9wKCkKICAgICAgICBpZiBmaXJzdC5zdGFydHN3aXRoKEJPTV9VVEY4KToKICAgICAgICAgICAgYm9tX2ZvdW5kID0gVHJ1ZQogICAgICAgICAgICBmaXJzdCA9IGZpcnN0WzM6XQogICAgICAgICAgICBkZWZhdWx0ID0gJ3V0Zi04LXNpZycKICAgICAgICBpZiBub3QgZmlyc3Q6CiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0LCBbXQoKICAgICAgICBlbmNvZGluZyA9IGZpbmRfY29va2llKGZpcnN0KQogICAgICAgIGlmIGVuY29kaW5nOgogICAgICAgICAgICByZXR1cm4gZW5jb2RpbmcsIFtmaXJzdF0KCiAgICAgICAgc2Vjb25kID0gcmVhZF9vcl9zdG9wKCkKICAgICAgICBpZiBub3Qgc2Vjb25kOgogICAgICAgICAgICByZXR1cm4gZGVmYXVsdCwgW2ZpcnN0XQoKICAgICAgICBlbmNvZGluZyA9IGZpbmRfY29va2llKHNlY29uZCkKICAgICAgICBpZiBlbmNvZGluZzoKICAgICAgICAgICAgcmV0dXJuIGVuY29kaW5nLCBbZmlyc3QsIHNlY29uZF0KCiAgICAgICAgcmV0dXJuIGRlZmF1bHQsIFtmaXJzdCwgc2Vjb25kXQoKIyBGb3IgY29udmVydGluZyAmIDwtPiAmYW1wOyBldGMuCnRyeToKICAgIGZyb20gaHRtbCBpbXBvcnQgZXNjYXBlCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGZyb20gY2dpIGltcG9ydCBlc2NhcGUKaWYgc3lzLnZlcnNpb25faW5mb1s6Ml0gPCAoMywgNCk6CiAgICB1bmVzY2FwZSA9IEhUTUxQYXJzZXIoKS51bmVzY2FwZQplbHNlOgogICAgZnJvbSBodG1sIGltcG9ydCB1bmVzY2FwZQoKdHJ5OgogICAgZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgQ2hhaW5NYXAKZXhjZXB0IEltcG9ydEVycm9yOiAjIHByYWdtYTogbm8gY292ZXIKICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IE11dGFibGVNYXBwaW5nCgogICAgdHJ5OgogICAgICAgIGZyb20gcmVwcmxpYiBpbXBvcnQgcmVjdXJzaXZlX3JlcHIgYXMgX3JlY3Vyc2l2ZV9yZXByCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgZGVmIF9yZWN1cnNpdmVfcmVwcihmaWxsdmFsdWU9Jy4uLicpOgogICAgICAgICAgICAnJycKICAgICAgICAgICAgRGVjb3JhdG9yIHRvIG1ha2UgYSByZXByIGZ1bmN0aW9uIHJldHVybiBmaWxsdmFsdWUgZm9yIGEgcmVjdXJzaXZlCiAgICAgICAgICAgIGNhbGwKICAgICAgICAgICAgJycnCgogICAgICAgICAgICBkZWYgZGVjb3JhdGluZ19mdW5jdGlvbih1c2VyX2Z1bmN0aW9uKToKICAgICAgICAgICAgICAgIHJlcHJfcnVubmluZyA9IHNldCgpCgogICAgICAgICAgICAgICAgZGVmIHdyYXBwZXIoc2VsZik6CiAgICAgICAgICAgICAgICAgICAga2V5ID0gaWQoc2VsZiksIGdldF9pZGVudCgpCiAgICAgICAgICAgICAgICAgICAgaWYga2V5IGluIHJlcHJfcnVubmluZzoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbGx2YWx1ZQogICAgICAgICAgICAgICAgICAgIHJlcHJfcnVubmluZy5hZGQoa2V5KQogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdXNlcl9mdW5jdGlvbihzZWxmKQogICAgICAgICAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcHJfcnVubmluZy5kaXNjYXJkKGtleSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgICAgICAgICAgICAgIyBDYW4ndCB1c2UgZnVuY3Rvb2xzLndyYXBzKCkgaGVyZSBiZWNhdXNlIG9mIGJvb3RzdHJhcCBpc3N1ZXMKICAgICAgICAgICAgICAgIHdyYXBwZXIuX19tb2R1bGVfXyA9IGdldGF0dHIodXNlcl9mdW5jdGlvbiwgJ19fbW9kdWxlX18nKQogICAgICAgICAgICAgICAgd3JhcHBlci5fX2RvY19fID0gZ2V0YXR0cih1c2VyX2Z1bmN0aW9uLCAnX19kb2NfXycpCiAgICAgICAgICAgICAgICB3cmFwcGVyLl9fbmFtZV9fID0gZ2V0YXR0cih1c2VyX2Z1bmN0aW9uLCAnX19uYW1lX18nKQogICAgICAgICAgICAgICAgd3JhcHBlci5fX2Fubm90YXRpb25zX18gPSBnZXRhdHRyKHVzZXJfZnVuY3Rpb24sICdfX2Fubm90YXRpb25zX18nLCB7fSkKICAgICAgICAgICAgICAgIHJldHVybiB3cmFwcGVyCgogICAgICAgICAgICByZXR1cm4gZGVjb3JhdGluZ19mdW5jdGlvbgoKICAgIGNsYXNzIENoYWluTWFwKE11dGFibGVNYXBwaW5nKToKICAgICAgICAnJycgQSBDaGFpbk1hcCBncm91cHMgbXVsdGlwbGUgZGljdHMgKG9yIG90aGVyIG1hcHBpbmdzKSB0b2dldGhlcgogICAgICAgIHRvIGNyZWF0ZSBhIHNpbmdsZSwgdXBkYXRlYWJsZSB2aWV3LgoKICAgICAgICBUaGUgdW5kZXJseWluZyBtYXBwaW5ncyBhcmUgc3RvcmVkIGluIGEgbGlzdC4gIFRoYXQgbGlzdCBpcyBwdWJsaWMgYW5kIGNhbgogICAgICAgIGFjY2Vzc2VkIG9yIHVwZGF0ZWQgdXNpbmcgdGhlICptYXBzKiBhdHRyaWJ1dGUuICBUaGVyZSBpcyBubyBvdGhlciBzdGF0ZS4KCiAgICAgICAgTG9va3VwcyBzZWFyY2ggdGhlIHVuZGVybHlpbmcgbWFwcGluZ3Mgc3VjY2Vzc2l2ZWx5IHVudGlsIGEga2V5IGlzIGZvdW5kLgogICAgICAgIEluIGNvbnRyYXN0LCB3cml0ZXMsIHVwZGF0ZXMsIGFuZCBkZWxldGlvbnMgb25seSBvcGVyYXRlIG9uIHRoZSBmaXJzdAogICAgICAgIG1hcHBpbmcuCgogICAgICAgICcnJwoKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgKm1hcHMpOgogICAgICAgICAgICAnJydJbml0aWFsaXplIGEgQ2hhaW5NYXAgYnkgc2V0dGluZyAqbWFwcyogdG8gdGhlIGdpdmVuIG1hcHBpbmdzLgogICAgICAgICAgICBJZiBubyBtYXBwaW5ncyBhcmUgcHJvdmlkZWQsIGEgc2luZ2xlIGVtcHR5IGRpY3Rpb25hcnkgaXMgdXNlZC4KCiAgICAgICAgICAgICcnJwogICAgICAgICAgICBzZWxmLm1hcHMgPSBsaXN0KG1hcHMpIG9yIFt7fV0gICAgICAgICAgIyBhbHdheXMgYXQgbGVhc3Qgb25lIG1hcAoKICAgICAgICBkZWYgX19taXNzaW5nX18oc2VsZiwga2V5KToKICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3Ioa2V5KQoKICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKICAgICAgICAgICAgZm9yIG1hcHBpbmcgaW4gc2VsZi5tYXBzOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXBwaW5nW2tleV0gICAgICAgICAgICAgIyBjYW4ndCB1c2UgJ2tleSBpbiBtYXBwaW5nJyB3aXRoIGRlZmF1bHRkaWN0CiAgICAgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICByZXR1cm4gc2VsZi5fX21pc3NpbmdfXyhrZXkpICAgICAgICAgICAgIyBzdXBwb3J0IHN1YmNsYXNzZXMgdGhhdCBkZWZpbmUgX19taXNzaW5nX18KCiAgICAgICAgZGVmIGdldChzZWxmLCBrZXksIGRlZmF1bHQ9Tm9uZSk6CiAgICAgICAgICAgIHJldHVybiBzZWxmW2tleV0gaWYga2V5IGluIHNlbGYgZWxzZSBkZWZhdWx0CgogICAgICAgIGRlZiBfX2xlbl9fKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gbGVuKHNldCgpLnVuaW9uKCpzZWxmLm1hcHMpKSAgICAgIyByZXVzZXMgc3RvcmVkIGhhc2ggdmFsdWVzIGlmIHBvc3NpYmxlCgogICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICAgICAgcmV0dXJuIGl0ZXIoc2V0KCkudW5pb24oKnNlbGYubWFwcykpCgogICAgICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwga2V5KToKICAgICAgICAgICAgcmV0dXJuIGFueShrZXkgaW4gbSBmb3IgbSBpbiBzZWxmLm1hcHMpCgogICAgICAgIGRlZiBfX2Jvb2xfXyhzZWxmKToKICAgICAgICAgICAgcmV0dXJuIGFueShzZWxmLm1hcHMpCgogICAgICAgIEBfcmVjdXJzaXZlX3JlcHIoKQogICAgICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICAgICAgcmV0dXJuICd7MC5fX2NsYXNzX18uX19uYW1lX199KHsxfSknLmZvcm1hdCgKICAgICAgICAgICAgICAgIHNlbGYsICcsICcuam9pbihtYXAocmVwciwgc2VsZi5tYXBzKSkpCgogICAgICAgIEBjbGFzc21ldGhvZAogICAgICAgIGRlZiBmcm9ta2V5cyhjbHMsIGl0ZXJhYmxlLCAqYXJncyk6CiAgICAgICAgICAgICdDcmVhdGUgYSBDaGFpbk1hcCB3aXRoIGEgc2luZ2xlIGRpY3QgY3JlYXRlZCBmcm9tIHRoZSBpdGVyYWJsZS4nCiAgICAgICAgICAgIHJldHVybiBjbHMoZGljdC5mcm9ta2V5cyhpdGVyYWJsZSwgKmFyZ3MpKQoKICAgICAgICBkZWYgY29weShzZWxmKToKICAgICAgICAgICAgJ05ldyBDaGFpbk1hcCBvciBzdWJjbGFzcyB3aXRoIGEgbmV3IGNvcHkgb2YgbWFwc1swXSBhbmQgcmVmcyB0byBtYXBzWzE6XScKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYubWFwc1swXS5jb3B5KCksICpzZWxmLm1hcHNbMTpdKQoKICAgICAgICBfX2NvcHlfXyA9IGNvcHkKCiAgICAgICAgZGVmIG5ld19jaGlsZChzZWxmKTogICAgICAgICAgICAgICAgICAgICAgICAjIGxpa2UgRGphbmdvJ3MgQ29udGV4dC5wdXNoKCkKICAgICAgICAgICAgJ05ldyBDaGFpbk1hcCB3aXRoIGEgbmV3IGRpY3QgZm9sbG93ZWQgYnkgYWxsIHByZXZpb3VzIG1hcHMuJwogICAgICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oe30sICpzZWxmLm1hcHMpCgogICAgICAgIEBwcm9wZXJ0eQogICAgICAgIGRlZiBwYXJlbnRzKHNlbGYpOiAgICAgICAgICAgICAgICAgICAgICAgICAgIyBsaWtlIERqYW5nbydzIENvbnRleHQucG9wKCkKICAgICAgICAgICAgJ05ldyBDaGFpbk1hcCBmcm9tIG1hcHNbMTpdLicKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKCpzZWxmLm1hcHNbMTpdKQoKICAgICAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSk6CiAgICAgICAgICAgIHNlbGYubWFwc1swXVtrZXldID0gdmFsdWUKCiAgICAgICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGtleSk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGRlbCBzZWxmLm1hcHNbMF1ba2V5XQogICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICAgICByYWlzZSBLZXlFcnJvcignS2V5IG5vdCBmb3VuZCBpbiB0aGUgZmlyc3QgbWFwcGluZzogeyFyfScuZm9ybWF0KGtleSkpCgogICAgICAgIGRlZiBwb3BpdGVtKHNlbGYpOgogICAgICAgICAgICAnUmVtb3ZlIGFuZCByZXR1cm4gYW4gaXRlbSBwYWlyIGZyb20gbWFwc1swXS4gUmFpc2UgS2V5RXJyb3IgaXMgbWFwc1swXSBpcyBlbXB0eS4nCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLm1hcHNbMF0ucG9waXRlbSgpCiAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCdObyBrZXlzIGZvdW5kIGluIHRoZSBmaXJzdCBtYXBwaW5nLicpCgogICAgICAgIGRlZiBwb3Aoc2VsZiwga2V5LCAqYXJncyk6CiAgICAgICAgICAgICdSZW1vdmUgKmtleSogZnJvbSBtYXBzWzBdIGFuZCByZXR1cm4gaXRzIHZhbHVlLiBSYWlzZSBLZXlFcnJvciBpZiAqa2V5KiBub3QgaW4gbWFwc1swXS4nCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLm1hcHNbMF0ucG9wKGtleSwgKmFyZ3MpCiAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCdLZXkgbm90IGZvdW5kIGluIHRoZSBmaXJzdCBtYXBwaW5nOiB7IXJ9Jy5mb3JtYXQoa2V5KSkKCiAgICAgICAgZGVmIGNsZWFyKHNlbGYpOgogICAgICAgICAgICAnQ2xlYXIgbWFwc1swXSwgbGVhdmluZyBtYXBzWzE6XSBpbnRhY3QuJwogICAgICAgICAgICBzZWxmLm1hcHNbMF0uY2xlYXIoKQoKdHJ5OgogICAgZnJvbSBpbXAgaW1wb3J0IGNhY2hlX2Zyb21fc291cmNlCmV4Y2VwdCBJbXBvcnRFcnJvcjogIyBwcmFnbWE6IG5vIGNvdmVyCiAgICBkZWYgY2FjaGVfZnJvbV9zb3VyY2UocGF0aCwgZGVidWdfb3ZlcnJpZGU9Tm9uZSk6CiAgICAgICAgYXNzZXJ0IHBhdGguZW5kc3dpdGgoJy5weScpCiAgICAgICAgaWYgZGVidWdfb3ZlcnJpZGUgaXMgTm9uZToKICAgICAgICAgICAgZGVidWdfb3ZlcnJpZGUgPSBfX2RlYnVnX18KICAgICAgICBpZiBkZWJ1Z19vdmVycmlkZToKICAgICAgICAgICAgc3VmZml4ID0gJ2MnCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc3VmZml4ID0gJ28nCiAgICAgICAgcmV0dXJuIHBhdGggKyBzdWZmaXgKCnRyeToKICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IE9yZGVyZWREaWN0CmV4Y2VwdCBJbXBvcnRFcnJvcjogIyBwcmFnbWE6IG5vIGNvdmVyCiMjIHt7eyBodHRwOi8vY29kZS5hY3RpdmVzdGF0ZS5jb20vcmVjaXBlcy81NzY2OTMvIChyOSkKIyBCYWNrcG9ydCBvZiBPcmRlcmVkRGljdCgpIGNsYXNzIHRoYXQgcnVucyBvbiBQeXRob24gMi40LCAyLjUsIDIuNiwgMi43IGFuZCBweXB5LgojIFBhc3NlcyBQeXRob24yLjcncyB0ZXN0IHN1aXRlIGFuZCBpbmNvcnBvcmF0ZXMgYWxsIHRoZSBsYXRlc3QgdXBkYXRlcy4KICAgIHRyeToKICAgICAgICBmcm9tIHRocmVhZCBpbXBvcnQgZ2V0X2lkZW50IGFzIF9nZXRfaWRlbnQKICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICBmcm9tIGR1bW15X3RocmVhZCBpbXBvcnQgZ2V0X2lkZW50IGFzIF9nZXRfaWRlbnQKCiAgICB0cnk6CiAgICAgICAgZnJvbSBfYWJjb2xsIGltcG9ydCBLZXlzVmlldywgVmFsdWVzVmlldywgSXRlbXNWaWV3CiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgcGFzcwoKCiAgICBjbGFzcyBPcmRlcmVkRGljdChkaWN0KToKICAgICAgICAnRGljdGlvbmFyeSB0aGF0IHJlbWVtYmVycyBpbnNlcnRpb24gb3JkZXInCiAgICAgICAgIyBBbiBpbmhlcml0ZWQgZGljdCBtYXBzIGtleXMgdG8gdmFsdWVzLgogICAgICAgICMgVGhlIGluaGVyaXRlZCBkaWN0IHByb3ZpZGVzIF9fZ2V0aXRlbV9fLCBfX2xlbl9fLCBfX2NvbnRhaW5zX18sIGFuZCBnZXQuCiAgICAgICAgIyBUaGUgcmVtYWluaW5nIG1ldGhvZHMgYXJlIG9yZGVyLWF3YXJlLgogICAgICAgICMgQmlnLU8gcnVubmluZyB0aW1lcyBmb3IgYWxsIG1ldGhvZHMgYXJlIHRoZSBzYW1lIGFzIGZvciByZWd1bGFyIGRpY3Rpb25hcmllcy4KCiAgICAgICAgIyBUaGUgaW50ZXJuYWwgc2VsZi5fX21hcCBkaWN0aW9uYXJ5IG1hcHMga2V5cyB0byBsaW5rcyBpbiBhIGRvdWJseSBsaW5rZWQgbGlzdC4KICAgICAgICAjIFRoZSBjaXJjdWxhciBkb3VibHkgbGlua2VkIGxpc3Qgc3RhcnRzIGFuZCBlbmRzIHdpdGggYSBzZW50aW5lbCBlbGVtZW50LgogICAgICAgICMgVGhlIHNlbnRpbmVsIGVsZW1lbnQgbmV2ZXIgZ2V0cyBkZWxldGVkICh0aGlzIHNpbXBsaWZpZXMgdGhlIGFsZ29yaXRobSkuCiAgICAgICAgIyBFYWNoIGxpbmsgaXMgc3RvcmVkIGFzIGEgbGlzdCBvZiBsZW5ndGggdGhyZWU6ICBbUFJFViwgTkVYVCwgS0VZXS4KCiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3ZHMpOgogICAgICAgICAgICAnJydJbml0aWFsaXplIGFuIG9yZGVyZWQgZGljdGlvbmFyeS4gIFNpZ25hdHVyZSBpcyB0aGUgc2FtZSBhcyBmb3IKICAgICAgICAgICAgcmVndWxhciBkaWN0aW9uYXJpZXMsIGJ1dCBrZXl3b3JkIGFyZ3VtZW50cyBhcmUgbm90IHJlY29tbWVuZGVkCiAgICAgICAgICAgIGJlY2F1c2UgdGhlaXIgaW5zZXJ0aW9uIG9yZGVyIGlzIGFyYml0cmFyeS4KCiAgICAgICAgICAgICcnJwogICAgICAgICAgICBpZiBsZW4oYXJncykgPiAxOgogICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdleHBlY3RlZCBhdCBtb3N0IDEgYXJndW1lbnRzLCBnb3QgJWQnICUgbGVuKGFyZ3MpKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzZWxmLl9fcm9vdAogICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgICAgICBzZWxmLl9fcm9vdCA9IHJvb3QgPSBbXSAgICAgICAgICAgICAgICAgICAgICMgc2VudGluZWwgbm9kZQogICAgICAgICAgICAgICAgcm9vdFs6XSA9IFtyb290LCByb290LCBOb25lXQogICAgICAgICAgICAgICAgc2VsZi5fX21hcCA9IHt9CiAgICAgICAgICAgIHNlbGYuX191cGRhdGUoKmFyZ3MsICoqa3dkcykKCiAgICAgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUsIGRpY3Rfc2V0aXRlbT1kaWN0Ll9fc2V0aXRlbV9fKToKICAgICAgICAgICAgJ29kLl9fc2V0aXRlbV9fKGksIHkpIDw9PT4gb2RbaV09eScKICAgICAgICAgICAgIyBTZXR0aW5nIGEgbmV3IGl0ZW0gY3JlYXRlcyBhIG5ldyBsaW5rIHdoaWNoIGdvZXMgYXQgdGhlIGVuZCBvZiB0aGUgbGlua2VkCiAgICAgICAgICAgICMgbGlzdCwgYW5kIHRoZSBpbmhlcml0ZWQgZGljdGlvbmFyeSBpcyB1cGRhdGVkIHdpdGggdGhlIG5ldyBrZXkvdmFsdWUgcGFpci4KICAgICAgICAgICAgaWYga2V5IG5vdCBpbiBzZWxmOgogICAgICAgICAgICAgICAgcm9vdCA9IHNlbGYuX19yb290CiAgICAgICAgICAgICAgICBsYXN0ID0gcm9vdFswXQogICAgICAgICAgICAgICAgbGFzdFsxXSA9IHJvb3RbMF0gPSBzZWxmLl9fbWFwW2tleV0gPSBbbGFzdCwgcm9vdCwga2V5XQogICAgICAgICAgICBkaWN0X3NldGl0ZW0oc2VsZiwga2V5LCB2YWx1ZSkKCiAgICAgICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGtleSwgZGljdF9kZWxpdGVtPWRpY3QuX19kZWxpdGVtX18pOgogICAgICAgICAgICAnb2QuX19kZWxpdGVtX18oeSkgPD09PiBkZWwgb2RbeV0nCiAgICAgICAgICAgICMgRGVsZXRpbmcgYW4gZXhpc3RpbmcgaXRlbSB1c2VzIHNlbGYuX19tYXAgdG8gZmluZCB0aGUgbGluayB3aGljaCBpcwogICAgICAgICAgICAjIHRoZW4gcmVtb3ZlZCBieSB1cGRhdGluZyB0aGUgbGlua3MgaW4gdGhlIHByZWRlY2Vzc29yIGFuZCBzdWNjZXNzb3Igbm9kZXMuCiAgICAgICAgICAgIGRpY3RfZGVsaXRlbShzZWxmLCBrZXkpCiAgICAgICAgICAgIGxpbmtfcHJldiwgbGlua19uZXh0LCBrZXkgPSBzZWxmLl9fbWFwLnBvcChrZXkpCiAgICAgICAgICAgIGxpbmtfcHJldlsxXSA9IGxpbmtfbmV4dAogICAgICAgICAgICBsaW5rX25leHRbMF0gPSBsaW5rX3ByZXYKCiAgICAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgICAgICAnb2QuX19pdGVyX18oKSA8PT0+IGl0ZXIob2QpJwogICAgICAgICAgICByb290ID0gc2VsZi5fX3Jvb3QKICAgICAgICAgICAgY3VyciA9IHJvb3RbMV0KICAgICAgICAgICAgd2hpbGUgY3VyciBpcyBub3Qgcm9vdDoKICAgICAgICAgICAgICAgIHlpZWxkIGN1cnJbMl0KICAgICAgICAgICAgICAgIGN1cnIgPSBjdXJyWzFdCgogICAgICAgIGRlZiBfX3JldmVyc2VkX18oc2VsZik6CiAgICAgICAgICAgICdvZC5fX3JldmVyc2VkX18oKSA8PT0+IHJldmVyc2VkKG9kKScKICAgICAgICAgICAgcm9vdCA9IHNlbGYuX19yb290CiAgICAgICAgICAgIGN1cnIgPSByb290WzBdCiAgICAgICAgICAgIHdoaWxlIGN1cnIgaXMgbm90IHJvb3Q6CiAgICAgICAgICAgICAgICB5aWVsZCBjdXJyWzJdCiAgICAgICAgICAgICAgICBjdXJyID0gY3VyclswXQoKICAgICAgICBkZWYgY2xlYXIoc2VsZik6CiAgICAgICAgICAgICdvZC5jbGVhcigpIC0+IE5vbmUuICBSZW1vdmUgYWxsIGl0ZW1zIGZyb20gb2QuJwogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBmb3Igbm9kZSBpbiBzZWxmLl9fbWFwLml0ZXJ2YWx1ZXMoKToKICAgICAgICAgICAgICAgICAgICBkZWwgbm9kZVs6XQogICAgICAgICAgICAgICAgcm9vdCA9IHNlbGYuX19yb290CiAgICAgICAgICAgICAgICByb290WzpdID0gW3Jvb3QsIHJvb3QsIE5vbmVdCiAgICAgICAgICAgICAgICBzZWxmLl9fbWFwLmNsZWFyKCkKICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICBkaWN0LmNsZWFyKHNlbGYpCgogICAgICAgIGRlZiBwb3BpdGVtKHNlbGYsIGxhc3Q9VHJ1ZSk6CiAgICAgICAgICAgICcnJ29kLnBvcGl0ZW0oKSAtPiAoaywgdiksIHJldHVybiBhbmQgcmVtb3ZlIGEgKGtleSwgdmFsdWUpIHBhaXIuCiAgICAgICAgICAgIFBhaXJzIGFyZSByZXR1cm5lZCBpbiBMSUZPIG9yZGVyIGlmIGxhc3QgaXMgdHJ1ZSBvciBGSUZPIG9yZGVyIGlmIGZhbHNlLgoKICAgICAgICAgICAgJycnCiAgICAgICAgICAgIGlmIG5vdCBzZWxmOgogICAgICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoJ2RpY3Rpb25hcnkgaXMgZW1wdHknKQogICAgICAgICAgICByb290ID0gc2VsZi5fX3Jvb3QKICAgICAgICAgICAgaWYgbGFzdDoKICAgICAgICAgICAgICAgIGxpbmsgPSByb290WzBdCiAgICAgICAgICAgICAgICBsaW5rX3ByZXYgPSBsaW5rWzBdCiAgICAgICAgICAgICAgICBsaW5rX3ByZXZbMV0gPSByb290CiAgICAgICAgICAgICAgICByb290WzBdID0gbGlua19wcmV2CiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBsaW5rID0gcm9vdFsxXQogICAgICAgICAgICAgICAgbGlua19uZXh0ID0gbGlua1sxXQogICAgICAgICAgICAgICAgcm9vdFsxXSA9IGxpbmtfbmV4dAogICAgICAgICAgICAgICAgbGlua19uZXh0WzBdID0gcm9vdAogICAgICAgICAgICBrZXkgPSBsaW5rWzJdCiAgICAgICAgICAgIGRlbCBzZWxmLl9fbWFwW2tleV0KICAgICAgICAgICAgdmFsdWUgPSBkaWN0LnBvcChzZWxmLCBrZXkpCiAgICAgICAgICAgIHJldHVybiBrZXksIHZhbHVlCgogICAgICAgICMgLS0gdGhlIGZvbGxvd2luZyBtZXRob2RzIGRvIG5vdCBkZXBlbmQgb24gdGhlIGludGVybmFsIHN0cnVjdHVyZSAtLQoKICAgICAgICBkZWYga2V5cyhzZWxmKToKICAgICAgICAgICAgJ29kLmtleXMoKSAtPiBsaXN0IG9mIGtleXMgaW4gb2QnCiAgICAgICAgICAgIHJldHVybiBsaXN0KHNlbGYpCgogICAgICAgIGRlZiB2YWx1ZXMoc2VsZik6CiAgICAgICAgICAgICdvZC52YWx1ZXMoKSAtPiBsaXN0IG9mIHZhbHVlcyBpbiBvZCcKICAgICAgICAgICAgcmV0dXJuIFtzZWxmW2tleV0gZm9yIGtleSBpbiBzZWxmXQoKICAgICAgICBkZWYgaXRlbXMoc2VsZik6CiAgICAgICAgICAgICdvZC5pdGVtcygpIC0+IGxpc3Qgb2YgKGtleSwgdmFsdWUpIHBhaXJzIGluIG9kJwogICAgICAgICAgICByZXR1cm4gWyhrZXksIHNlbGZba2V5XSkgZm9yIGtleSBpbiBzZWxmXQoKICAgICAgICBkZWYgaXRlcmtleXMoc2VsZik6CiAgICAgICAgICAgICdvZC5pdGVya2V5cygpIC0+IGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGtleXMgaW4gb2QnCiAgICAgICAgICAgIHJldHVybiBpdGVyKHNlbGYpCgogICAgICAgIGRlZiBpdGVydmFsdWVzKHNlbGYpOgogICAgICAgICAgICAnb2QuaXRlcnZhbHVlcyAtPiBhbiBpdGVyYXRvciBvdmVyIHRoZSB2YWx1ZXMgaW4gb2QnCiAgICAgICAgICAgIGZvciBrIGluIHNlbGY6CiAgICAgICAgICAgICAgICB5aWVsZCBzZWxmW2tdCgogICAgICAgIGRlZiBpdGVyaXRlbXMoc2VsZik6CiAgICAgICAgICAgICdvZC5pdGVyaXRlbXMgLT4gYW4gaXRlcmF0b3Igb3ZlciB0aGUgKGtleSwgdmFsdWUpIGl0ZW1zIGluIG9kJwogICAgICAgICAgICBmb3IgayBpbiBzZWxmOgogICAgICAgICAgICAgICAgeWllbGQgKGssIHNlbGZba10pCgogICAgICAgIGRlZiB1cGRhdGUoKmFyZ3MsICoqa3dkcyk6CiAgICAgICAgICAgICcnJ29kLnVwZGF0ZShFLCAqKkYpIC0+IE5vbmUuICBVcGRhdGUgb2QgZnJvbSBkaWN0L2l0ZXJhYmxlIEUgYW5kIEYuCgogICAgICAgICAgICBJZiBFIGlzIGEgZGljdCBpbnN0YW5jZSwgZG9lczogICAgICAgICAgIGZvciBrIGluIEU6IG9kW2tdID0gRVtrXQogICAgICAgICAgICBJZiBFIGhhcyBhIC5rZXlzKCkgbWV0aG9kLCBkb2VzOiAgICAgICAgIGZvciBrIGluIEUua2V5cygpOiBvZFtrXSA9IEVba10KICAgICAgICAgICAgT3IgaWYgRSBpcyBhbiBpdGVyYWJsZSBvZiBpdGVtcywgZG9lczogICBmb3IgaywgdiBpbiBFOiBvZFtrXSA9IHYKICAgICAgICAgICAgSW4gZWl0aGVyIGNhc2UsIHRoaXMgaXMgZm9sbG93ZWQgYnk6ICAgICBmb3IgaywgdiBpbiBGLml0ZW1zKCk6IG9kW2tdID0gdgoKICAgICAgICAgICAgJycnCiAgICAgICAgICAgIGlmIGxlbihhcmdzKSA+IDI6CiAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ3VwZGF0ZSgpIHRha2VzIGF0IG1vc3QgMiBwb3NpdGlvbmFsICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXJndW1lbnRzICglZCBnaXZlbiknICUgKGxlbihhcmdzKSwpKQogICAgICAgICAgICBlbGlmIG5vdCBhcmdzOgogICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCd1cGRhdGUoKSB0YWtlcyBhdCBsZWFzdCAxIGFyZ3VtZW50ICgwIGdpdmVuKScpCiAgICAgICAgICAgIHNlbGYgPSBhcmdzWzBdCiAgICAgICAgICAgICMgTWFrZSBwcm9ncmVzc2l2ZWx5IHdlYWtlciBhc3N1bXB0aW9ucyBhYm91dCAib3RoZXIiCiAgICAgICAgICAgIG90aGVyID0gKCkKICAgICAgICAgICAgaWYgbGVuKGFyZ3MpID09IDI6CiAgICAgICAgICAgICAgICBvdGhlciA9IGFyZ3NbMV0KICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgZGljdCk6CiAgICAgICAgICAgICAgICBmb3Iga2V5IGluIG90aGVyOgogICAgICAgICAgICAgICAgICAgIHNlbGZba2V5XSA9IG90aGVyW2tleV0KICAgICAgICAgICAgZWxpZiBoYXNhdHRyKG90aGVyLCAna2V5cycpOgogICAgICAgICAgICAgICAgZm9yIGtleSBpbiBvdGhlci5rZXlzKCk6CiAgICAgICAgICAgICAgICAgICAgc2VsZltrZXldID0gb3RoZXJba2V5XQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gb3RoZXI6CiAgICAgICAgICAgICAgICAgICAgc2VsZltrZXldID0gdmFsdWUKICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4ga3dkcy5pdGVtcygpOgogICAgICAgICAgICAgICAgc2VsZltrZXldID0gdmFsdWUKCiAgICAgICAgX191cGRhdGUgPSB1cGRhdGUgICMgbGV0IHN1YmNsYXNzZXMgb3ZlcnJpZGUgdXBkYXRlIHdpdGhvdXQgYnJlYWtpbmcgX19pbml0X18KCiAgICAgICAgX19tYXJrZXIgPSBvYmplY3QoKQoKICAgICAgICBkZWYgcG9wKHNlbGYsIGtleSwgZGVmYXVsdD1fX21hcmtlcik6CiAgICAgICAgICAgICcnJ29kLnBvcChrWyxkXSkgLT4gdiwgcmVtb3ZlIHNwZWNpZmllZCBrZXkgYW5kIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZS4KICAgICAgICAgICAgSWYga2V5IGlzIG5vdCBmb3VuZCwgZCBpcyByZXR1cm5lZCBpZiBnaXZlbiwgb3RoZXJ3aXNlIEtleUVycm9yIGlzIHJhaXNlZC4KCiAgICAgICAgICAgICcnJwogICAgICAgICAgICBpZiBrZXkgaW4gc2VsZjoKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGZba2V5XQogICAgICAgICAgICAgICAgZGVsIHNlbGZba2V5XQogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAogICAgICAgICAgICBpZiBkZWZhdWx0IGlzIHNlbGYuX19tYXJrZXI6CiAgICAgICAgICAgICAgICByYWlzZSBLZXlFcnJvcihrZXkpCiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0CgogICAgICAgIGRlZiBzZXRkZWZhdWx0KHNlbGYsIGtleSwgZGVmYXVsdD1Ob25lKToKICAgICAgICAgICAgJ29kLnNldGRlZmF1bHQoa1ssZF0pIC0+IG9kLmdldChrLGQpLCBhbHNvIHNldCBvZFtrXT1kIGlmIGsgbm90IGluIG9kJwogICAgICAgICAgICBpZiBrZXkgaW4gc2VsZjoKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmW2tleV0KICAgICAgICAgICAgc2VsZltrZXldID0gZGVmYXVsdAogICAgICAgICAgICByZXR1cm4gZGVmYXVsdAoKICAgICAgICBkZWYgX19yZXByX18oc2VsZiwgX3JlcHJfcnVubmluZz1Ob25lKToKICAgICAgICAgICAgJ29kLl9fcmVwcl9fKCkgPD09PiByZXByKG9kKScKICAgICAgICAgICAgaWYgbm90IF9yZXByX3J1bm5pbmc6IF9yZXByX3J1bm5pbmcgPSB7fQogICAgICAgICAgICBjYWxsX2tleSA9IGlkKHNlbGYpLCBfZ2V0X2lkZW50KCkKICAgICAgICAgICAgaWYgY2FsbF9rZXkgaW4gX3JlcHJfcnVubmluZzoKICAgICAgICAgICAgICAgIHJldHVybiAnLi4uJwogICAgICAgICAgICBfcmVwcl9ydW5uaW5nW2NhbGxfa2V5XSA9IDEKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGY6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICclcygpJyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywpCiAgICAgICAgICAgICAgICByZXR1cm4gJyVzKCVyKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYuaXRlbXMoKSkKICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgIGRlbCBfcmVwcl9ydW5uaW5nW2NhbGxfa2V5XQoKICAgICAgICBkZWYgX19yZWR1Y2VfXyhzZWxmKToKICAgICAgICAgICAgJ1JldHVybiBzdGF0ZSBpbmZvcm1hdGlvbiBmb3IgcGlja2xpbmcnCiAgICAgICAgICAgIGl0ZW1zID0gW1trLCBzZWxmW2tdXSBmb3IgayBpbiBzZWxmXQogICAgICAgICAgICBpbnN0X2RpY3QgPSB2YXJzKHNlbGYpLmNvcHkoKQogICAgICAgICAgICBmb3IgayBpbiB2YXJzKE9yZGVyZWREaWN0KCkpOgogICAgICAgICAgICAgICAgaW5zdF9kaWN0LnBvcChrLCBOb25lKQogICAgICAgICAgICBpZiBpbnN0X2RpY3Q6CiAgICAgICAgICAgICAgICByZXR1cm4gKHNlbGYuX19jbGFzc19fLCAoaXRlbXMsKSwgaW5zdF9kaWN0KQogICAgICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18sIChpdGVtcywpCgogICAgICAgIGRlZiBjb3B5KHNlbGYpOgogICAgICAgICAgICAnb2QuY29weSgpIC0+IGEgc2hhbGxvdyBjb3B5IG9mIG9kJwogICAgICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZikKCiAgICAgICAgQGNsYXNzbWV0aG9kCiAgICAgICAgZGVmIGZyb21rZXlzKGNscywgaXRlcmFibGUsIHZhbHVlPU5vbmUpOgogICAgICAgICAgICAnJydPRC5mcm9ta2V5cyhTWywgdl0pIC0+IE5ldyBvcmRlcmVkIGRpY3Rpb25hcnkgd2l0aCBrZXlzIGZyb20gUwogICAgICAgICAgICBhbmQgdmFsdWVzIGVxdWFsIHRvIHYgKHdoaWNoIGRlZmF1bHRzIHRvIE5vbmUpLgoKICAgICAgICAgICAgJycnCiAgICAgICAgICAgIGQgPSBjbHMoKQogICAgICAgICAgICBmb3Iga2V5IGluIGl0ZXJhYmxlOgogICAgICAgICAgICAgICAgZFtrZXldID0gdmFsdWUKICAgICAgICAgICAgcmV0dXJuIGQKCiAgICAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgICAgICcnJ29kLl9fZXFfXyh5KSA8PT0+IG9kPT15LiAgQ29tcGFyaXNvbiB0byBhbm90aGVyIE9EIGlzIG9yZGVyLXNlbnNpdGl2ZQogICAgICAgICAgICB3aGlsZSBjb21wYXJpc29uIHRvIGEgcmVndWxhciBtYXBwaW5nIGlzIG9yZGVyLWluc2Vuc2l0aXZlLgoKICAgICAgICAgICAgJycnCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIE9yZGVyZWREaWN0KToKICAgICAgICAgICAgICAgIHJldHVybiBsZW4oc2VsZik9PWxlbihvdGhlcikgYW5kIHNlbGYuaXRlbXMoKSA9PSBvdGhlci5pdGVtcygpCiAgICAgICAgICAgIHJldHVybiBkaWN0Ll9fZXFfXyhzZWxmLCBvdGhlcikKCiAgICAgICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgICAgIHJldHVybiBub3Qgc2VsZiA9PSBvdGhlcgoKICAgICAgICAjIC0tIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgb25seSB1c2VkIGluIFB5dGhvbiAyLjcgLS0KCiAgICAgICAgZGVmIHZpZXdrZXlzKHNlbGYpOgogICAgICAgICAgICAib2Qudmlld2tleXMoKSAtPiBhIHNldC1saWtlIG9iamVjdCBwcm92aWRpbmcgYSB2aWV3IG9uIG9kJ3Mga2V5cyIKICAgICAgICAgICAgcmV0dXJuIEtleXNWaWV3KHNlbGYpCgogICAgICAgIGRlZiB2aWV3dmFsdWVzKHNlbGYpOgogICAgICAgICAgICAib2Qudmlld3ZhbHVlcygpIC0+IGFuIG9iamVjdCBwcm92aWRpbmcgYSB2aWV3IG9uIG9kJ3MgdmFsdWVzIgogICAgICAgICAgICByZXR1cm4gVmFsdWVzVmlldyhzZWxmKQoKICAgICAgICBkZWYgdmlld2l0ZW1zKHNlbGYpOgogICAgICAgICAgICAib2Qudmlld2l0ZW1zKCkgLT4gYSBzZXQtbGlrZSBvYmplY3QgcHJvdmlkaW5nIGEgdmlldyBvbiBvZCdzIGl0ZW1zIgogICAgICAgICAgICByZXR1cm4gSXRlbXNWaWV3KHNlbGYpCgp0cnk6CiAgICBmcm9tIGxvZ2dpbmcuY29uZmlnIGltcG9ydCBCYXNlQ29uZmlndXJhdG9yLCB2YWxpZF9pZGVudApleGNlcHQgSW1wb3J0RXJyb3I6ICMgcHJhZ21hOiBubyBjb3ZlcgogICAgSURFTlRJRklFUiA9IHJlLmNvbXBpbGUoJ15bYS16X11bYS16MC05X10qJCcsIHJlLkkpCgoKICAgIGRlZiB2YWxpZF9pZGVudChzKToKICAgICAgICBtID0gSURFTlRJRklFUi5tYXRjaChzKQogICAgICAgIGlmIG5vdCBtOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdOb3QgYSB2YWxpZCBQeXRob24gaWRlbnRpZmllcjogJXInICUgcykKICAgICAgICByZXR1cm4gVHJ1ZQoKCiAgICAjIFRoZSBDb252ZXJ0aW5nWFhYIGNsYXNzZXMgYXJlIHdyYXBwZXJzIGFyb3VuZCBzdGFuZGFyZCBQeXRob24gY29udGFpbmVycywKICAgICMgYW5kIHRoZXkgc2VydmUgdG8gY29udmVydCBhbnkgc3VpdGFibGUgdmFsdWVzIGluIHRoZSBjb250YWluZXIuIFRoZQogICAgIyBjb252ZXJzaW9uIGNvbnZlcnRzIGJhc2UgZGljdHMsIGxpc3RzIGFuZCB0dXBsZXMgdG8gdGhlaXIgd3JhcHBlZAogICAgIyBlcXVpdmFsZW50cywgd2hlcmVhcyBzdHJpbmdzIHdoaWNoIG1hdGNoIGEgY29udmVyc2lvbiBmb3JtYXQgYXJlIGNvbnZlcnRlZAogICAgIyBhcHByb3ByaWF0ZWx5LgogICAgIwogICAgIyBFYWNoIHdyYXBwZXIgc2hvdWxkIGhhdmUgYSBjb25maWd1cmF0b3IgYXR0cmlidXRlIGhvbGRpbmcgdGhlIGFjdHVhbAogICAgIyBjb25maWd1cmF0b3IgdG8gdXNlIGZvciBjb252ZXJzaW9uLgoKICAgIGNsYXNzIENvbnZlcnRpbmdEaWN0KGRpY3QpOgogICAgICAgICIiIkEgY29udmVydGluZyBkaWN0aW9uYXJ5IHdyYXBwZXIuIiIiCgogICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgogICAgICAgICAgICB2YWx1ZSA9IGRpY3QuX19nZXRpdGVtX18oc2VsZiwga2V5KQogICAgICAgICAgICByZXN1bHQgPSBzZWxmLmNvbmZpZ3VyYXRvci5jb252ZXJ0KHZhbHVlKQogICAgICAgICAgICAjSWYgdGhlIGNvbnZlcnRlZCB2YWx1ZSBpcyBkaWZmZXJlbnQsIHNhdmUgZm9yIG5leHQgdGltZQogICAgICAgICAgICBpZiB2YWx1ZSBpcyBub3QgcmVzdWx0OgogICAgICAgICAgICAgICAgc2VsZltrZXldID0gcmVzdWx0CiAgICAgICAgICAgICAgICBpZiB0eXBlKHJlc3VsdCkgaW4gKENvbnZlcnRpbmdEaWN0LCBDb252ZXJ0aW5nTGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVydGluZ1R1cGxlKToKICAgICAgICAgICAgICAgICAgICByZXN1bHQucGFyZW50ID0gc2VsZgogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBrZXkKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgICAgICBkZWYgZ2V0KHNlbGYsIGtleSwgZGVmYXVsdD1Ob25lKToKICAgICAgICAgICAgdmFsdWUgPSBkaWN0LmdldChzZWxmLCBrZXksIGRlZmF1bHQpCiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuY29uZmlndXJhdG9yLmNvbnZlcnQodmFsdWUpCiAgICAgICAgICAgICNJZiB0aGUgY29udmVydGVkIHZhbHVlIGlzIGRpZmZlcmVudCwgc2F2ZSBmb3IgbmV4dCB0aW1lCiAgICAgICAgICAgIGlmIHZhbHVlIGlzIG5vdCByZXN1bHQ6CiAgICAgICAgICAgICAgICBzZWxmW2tleV0gPSByZXN1bHQKICAgICAgICAgICAgICAgIGlmIHR5cGUocmVzdWx0KSBpbiAoQ29udmVydGluZ0RpY3QsIENvbnZlcnRpbmdMaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJ0aW5nVHVwbGUpOgogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wYXJlbnQgPSBzZWxmCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IGtleQogICAgICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIHBvcChzZWxmLCBrZXksIGRlZmF1bHQ9Tm9uZSk6CiAgICAgICAgdmFsdWUgPSBkaWN0LnBvcChzZWxmLCBrZXksIGRlZmF1bHQpCiAgICAgICAgcmVzdWx0ID0gc2VsZi5jb25maWd1cmF0b3IuY29udmVydCh2YWx1ZSkKICAgICAgICBpZiB2YWx1ZSBpcyBub3QgcmVzdWx0OgogICAgICAgICAgICBpZiB0eXBlKHJlc3VsdCkgaW4gKENvbnZlcnRpbmdEaWN0LCBDb252ZXJ0aW5nTGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJ0aW5nVHVwbGUpOgogICAgICAgICAgICAgICAgcmVzdWx0LnBhcmVudCA9IHNlbGYKICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBrZXkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgY2xhc3MgQ29udmVydGluZ0xpc3QobGlzdCk6CiAgICAgICAgIiIiQSBjb252ZXJ0aW5nIGxpc3Qgd3JhcHBlci4iIiIKICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKICAgICAgICAgICAgdmFsdWUgPSBsaXN0Ll9fZ2V0aXRlbV9fKHNlbGYsIGtleSkKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5jb25maWd1cmF0b3IuY29udmVydCh2YWx1ZSkKICAgICAgICAgICAgI0lmIHRoZSBjb252ZXJ0ZWQgdmFsdWUgaXMgZGlmZmVyZW50LCBzYXZlIGZvciBuZXh0IHRpbWUKICAgICAgICAgICAgaWYgdmFsdWUgaXMgbm90IHJlc3VsdDoKICAgICAgICAgICAgICAgIHNlbGZba2V5XSA9IHJlc3VsdAogICAgICAgICAgICAgICAgaWYgdHlwZShyZXN1bHQpIGluIChDb252ZXJ0aW5nRGljdCwgQ29udmVydGluZ0xpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnRpbmdUdXBsZSk6CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnBhcmVudCA9IHNlbGYKICAgICAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0ga2V5CiAgICAgICAgICAgIHJldHVybiByZXN1bHQKCiAgICAgICAgZGVmIHBvcChzZWxmLCBpZHg9LTEpOgogICAgICAgICAgICB2YWx1ZSA9IGxpc3QucG9wKHNlbGYsIGlkeCkKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5jb25maWd1cmF0b3IuY29udmVydCh2YWx1ZSkKICAgICAgICAgICAgaWYgdmFsdWUgaXMgbm90IHJlc3VsdDoKICAgICAgICAgICAgICAgIGlmIHR5cGUocmVzdWx0KSBpbiAoQ29udmVydGluZ0RpY3QsIENvbnZlcnRpbmdMaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJ0aW5nVHVwbGUpOgogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wYXJlbnQgPSBzZWxmCiAgICAgICAgICAgIHJldHVybiByZXN1bHQKCiAgICBjbGFzcyBDb252ZXJ0aW5nVHVwbGUodHVwbGUpOgogICAgICAgICIiIkEgY29udmVydGluZyB0dXBsZSB3cmFwcGVyLiIiIgogICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgogICAgICAgICAgICB2YWx1ZSA9IHR1cGxlLl9fZ2V0aXRlbV9fKHNlbGYsIGtleSkKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5jb25maWd1cmF0b3IuY29udmVydCh2YWx1ZSkKICAgICAgICAgICAgaWYgdmFsdWUgaXMgbm90IHJlc3VsdDoKICAgICAgICAgICAgICAgIGlmIHR5cGUocmVzdWx0KSBpbiAoQ29udmVydGluZ0RpY3QsIENvbnZlcnRpbmdMaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJ0aW5nVHVwbGUpOgogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wYXJlbnQgPSBzZWxmCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IGtleQogICAgICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgY2xhc3MgQmFzZUNvbmZpZ3VyYXRvcihvYmplY3QpOgogICAgICAgICIiIgogICAgICAgIFRoZSBjb25maWd1cmF0b3IgYmFzZSBjbGFzcyB3aGljaCBkZWZpbmVzIHNvbWUgdXNlZnVsIGRlZmF1bHRzLgogICAgICAgICIiIgoKICAgICAgICBDT05WRVJUX1BBVFRFUk4gPSByZS5jb21waWxlKHInXig/UDxwcmVmaXg+W2Etel0rKTovLyg/UDxzdWZmaXg+LiopJCcpCgogICAgICAgIFdPUkRfUEFUVEVSTiA9IHJlLmNvbXBpbGUocideXHMqKFx3KylccyonKQogICAgICAgIERPVF9QQVRURVJOID0gcmUuY29tcGlsZShyJ15cLlxzKihcdyspXHMqJykKICAgICAgICBJTkRFWF9QQVRURVJOID0gcmUuY29tcGlsZShyJ15cW1xzKihcdyspXHMqXF1ccyonKQogICAgICAgIERJR0lUX1BBVFRFUk4gPSByZS5jb21waWxlKHInXlxkKyQnKQoKICAgICAgICB2YWx1ZV9jb252ZXJ0ZXJzID0gewogICAgICAgICAgICAnZXh0JyA6ICdleHRfY29udmVydCcsCiAgICAgICAgICAgICdjZmcnIDogJ2NmZ19jb252ZXJ0JywKICAgICAgICB9CgogICAgICAgICMgV2UgbWlnaHQgd2FudCB0byB1c2UgYSBkaWZmZXJlbnQgb25lLCBlLmcuIGltcG9ydGxpYgogICAgICAgIGltcG9ydGVyID0gc3RhdGljbWV0aG9kKF9faW1wb3J0X18pCgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25maWcpOgogICAgICAgICAgICBzZWxmLmNvbmZpZyA9IENvbnZlcnRpbmdEaWN0KGNvbmZpZykKICAgICAgICAgICAgc2VsZi5jb25maWcuY29uZmlndXJhdG9yID0gc2VsZgoKICAgICAgICBkZWYgcmVzb2x2ZShzZWxmLCBzKToKICAgICAgICAgICAgIiIiCiAgICAgICAgICAgIFJlc29sdmUgc3RyaW5ncyB0byBvYmplY3RzIHVzaW5nIHN0YW5kYXJkIGltcG9ydCBhbmQgYXR0cmlidXRlCiAgICAgICAgICAgIHN5bnRheC4KICAgICAgICAgICAgIiIiCiAgICAgICAgICAgIG5hbWUgPSBzLnNwbGl0KCcuJykKICAgICAgICAgICAgdXNlZCA9IG5hbWUucG9wKDApCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGZvdW5kID0gc2VsZi5pbXBvcnRlcih1c2VkKQogICAgICAgICAgICAgICAgZm9yIGZyYWcgaW4gbmFtZToKICAgICAgICAgICAgICAgICAgICB1c2VkICs9ICcuJyArIGZyYWcKICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gZ2V0YXR0cihmb3VuZCwgZnJhZykKICAgICAgICAgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaW1wb3J0ZXIodXNlZCkKICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBnZXRhdHRyKGZvdW5kLCBmcmFnKQogICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kCiAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgICAgICAgIGUsIHRiID0gc3lzLmV4Y19pbmZvKClbMTpdCiAgICAgICAgICAgICAgICB2ID0gVmFsdWVFcnJvcignQ2Fubm90IHJlc29sdmUgJXI6ICVzJyAlIChzLCBlKSkKICAgICAgICAgICAgICAgIHYuX19jYXVzZV9fLCB2Ll9fdHJhY2ViYWNrX18gPSBlLCB0YgogICAgICAgICAgICAgICAgcmFpc2UgdgoKICAgICAgICBkZWYgZXh0X2NvbnZlcnQoc2VsZiwgdmFsdWUpOgogICAgICAgICAgICAiIiJEZWZhdWx0IGNvbnZlcnRlciBmb3IgdGhlIGV4dDovLyBwcm90b2NvbC4iIiIKICAgICAgICAgICAgcmV0dXJuIHNlbGYucmVzb2x2ZSh2YWx1ZSkKCiAgICAgICAgZGVmIGNmZ19jb252ZXJ0KHNlbGYsIHZhbHVlKToKICAgICAgICAgICAgIiIiRGVmYXVsdCBjb252ZXJ0ZXIgZm9yIHRoZSBjZmc6Ly8gcHJvdG9jb2wuIiIiCiAgICAgICAgICAgIHJlc3QgPSB2YWx1ZQogICAgICAgICAgICBtID0gc2VsZi5XT1JEX1BBVFRFUk4ubWF0Y2gocmVzdCkKICAgICAgICAgICAgaWYgbSBpcyBOb25lOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiVW5hYmxlIHRvIGNvbnZlcnQgJXIiICUgdmFsdWUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXN0ID0gcmVzdFttLmVuZCgpOl0KICAgICAgICAgICAgICAgIGQgPSBzZWxmLmNvbmZpZ1ttLmdyb3VwcygpWzBdXQogICAgICAgICAgICAgICAgI3ByaW50IGQsIHJlc3QKICAgICAgICAgICAgICAgIHdoaWxlIHJlc3Q6CiAgICAgICAgICAgICAgICAgICAgbSA9IHNlbGYuRE9UX1BBVFRFUk4ubWF0Y2gocmVzdCkKICAgICAgICAgICAgICAgICAgICBpZiBtOgogICAgICAgICAgICAgICAgICAgICAgICBkID0gZFttLmdyb3VwcygpWzBdXQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIG0gPSBzZWxmLklOREVYX1BBVFRFUk4ubWF0Y2gocmVzdCkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkeCA9IG0uZ3JvdXBzKClbMF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLkRJR0lUX1BBVFRFUk4ubWF0Y2goaWR4KToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gZFtpZHhdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IGludChpZHgpICMgdHJ5IGFzIG51bWJlciBmaXJzdCAobW9zdCBsaWtlbHkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBkW25dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9IGRbaWR4XQogICAgICAgICAgICAgICAgICAgIGlmIG06CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3QgPSByZXN0W20uZW5kKCk6XQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1VuYWJsZSB0byBjb252ZXJ0ICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXIgYXQgJXInICUgKHZhbHVlLCByZXN0KSkKICAgICAgICAgICAgI3Jlc3Qgc2hvdWxkIGJlIGVtcHR5CiAgICAgICAgICAgIHJldHVybiBkCgogICAgICAgIGRlZiBjb252ZXJ0KHNlbGYsIHZhbHVlKToKICAgICAgICAgICAgIiIiCiAgICAgICAgICAgIENvbnZlcnQgdmFsdWVzIHRvIGFuIGFwcHJvcHJpYXRlIHR5cGUuIGRpY3RzLCBsaXN0cyBhbmQgdHVwbGVzIGFyZQogICAgICAgICAgICByZXBsYWNlZCBieSB0aGVpciBjb252ZXJ0aW5nIGFsdGVybmF0aXZlcy4gU3RyaW5ncyBhcmUgY2hlY2tlZCB0bwogICAgICAgICAgICBzZWUgaWYgdGhleSBoYXZlIGEgY29udmVyc2lvbiBmb3JtYXQgYW5kIGFyZSBjb252ZXJ0ZWQgaWYgdGhleSBkby4KICAgICAgICAgICAgIiIiCiAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLCBDb252ZXJ0aW5nRGljdCkgYW5kIGlzaW5zdGFuY2UodmFsdWUsIGRpY3QpOgogICAgICAgICAgICAgICAgdmFsdWUgPSBDb252ZXJ0aW5nRGljdCh2YWx1ZSkKICAgICAgICAgICAgICAgIHZhbHVlLmNvbmZpZ3VyYXRvciA9IHNlbGYKICAgICAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZSwgQ29udmVydGluZ0xpc3QpIGFuZCBpc2luc3RhbmNlKHZhbHVlLCBsaXN0KToKICAgICAgICAgICAgICAgIHZhbHVlID0gQ29udmVydGluZ0xpc3QodmFsdWUpCiAgICAgICAgICAgICAgICB2YWx1ZS5jb25maWd1cmF0b3IgPSBzZWxmCiAgICAgICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsIENvbnZlcnRpbmdUdXBsZSkgYW5kXAogICAgICAgICAgICAgICAgICAgICBpc2luc3RhbmNlKHZhbHVlLCB0dXBsZSk6CiAgICAgICAgICAgICAgICB2YWx1ZSA9IENvbnZlcnRpbmdUdXBsZSh2YWx1ZSkKICAgICAgICAgICAgICAgIHZhbHVlLmNvbmZpZ3VyYXRvciA9IHNlbGYKICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKHZhbHVlLCBzdHJpbmdfdHlwZXMpOgogICAgICAgICAgICAgICAgbSA9IHNlbGYuQ09OVkVSVF9QQVRURVJOLm1hdGNoKHZhbHVlKQogICAgICAgICAgICAgICAgaWYgbToKICAgICAgICAgICAgICAgICAgICBkID0gbS5ncm91cGRpY3QoKQogICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGRbJ3ByZWZpeCddCiAgICAgICAgICAgICAgICAgICAgY29udmVydGVyID0gc2VsZi52YWx1ZV9jb252ZXJ0ZXJzLmdldChwcmVmaXgsIE5vbmUpCiAgICAgICAgICAgICAgICAgICAgaWYgY29udmVydGVyOgogICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXggPSBkWydzdWZmaXgnXQogICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZXIgPSBnZXRhdHRyKHNlbGYsIGNvbnZlcnRlcikKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBjb252ZXJ0ZXIoc3VmZml4KQogICAgICAgICAgICByZXR1cm4gdmFsdWUKCiAgICAgICAgZGVmIGNvbmZpZ3VyZV9jdXN0b20oc2VsZiwgY29uZmlnKToKICAgICAgICAgICAgIiIiQ29uZmlndXJlIGFuIG9iamVjdCB3aXRoIGEgdXNlci1zdXBwbGllZCBmYWN0b3J5LiIiIgogICAgICAgICAgICBjID0gY29uZmlnLnBvcCgnKCknKQogICAgICAgICAgICBpZiBub3QgY2FsbGFibGUoYyk6CiAgICAgICAgICAgICAgICBjID0gc2VsZi5yZXNvbHZlKGMpCiAgICAgICAgICAgIHByb3BzID0gY29uZmlnLnBvcCgnLicsIE5vbmUpCiAgICAgICAgICAgICMgQ2hlY2sgZm9yIHZhbGlkIGlkZW50aWZpZXJzCiAgICAgICAgICAgIGt3YXJncyA9IGRpY3QoWyhrLCBjb25maWdba10pIGZvciBrIGluIGNvbmZpZyBpZiB2YWxpZF9pZGVudChrKV0pCiAgICAgICAgICAgIHJlc3VsdCA9IGMoKiprd2FyZ3MpCiAgICAgICAgICAgIGlmIHByb3BzOgogICAgICAgICAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIHByb3BzLml0ZW1zKCk6CiAgICAgICAgICAgICAgICAgICAgc2V0YXR0cihyZXN1bHQsIG5hbWUsIHZhbHVlKQogICAgICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgICAgIGRlZiBhc190dXBsZShzZWxmLCB2YWx1ZSk6CiAgICAgICAgICAgICIiIlV0aWxpdHkgZnVuY3Rpb24gd2hpY2ggY29udmVydHMgbGlzdHMgdG8gdHVwbGVzLiIiIgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBsaXN0KToKICAgICAgICAgICAgICAgIHZhbHVlID0gdHVwbGUodmFsdWUpCiAgICAgICAgICAgIHJldHVybiB2YWx1ZQpQSwMEFAAAAAAAAAAhADoKw7wIwgAACMIAAC8AAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi9kYXRhYmFzZS5weSMgLSotIGNvZGluZzogdXRmLTggLSotCiMKIyBDb3B5cmlnaHQgKEMpIDIwMTItMjAxNiBUaGUgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24uCiMgU2VlIExJQ0VOU0UudHh0IGFuZCBDT05UUklCVVRPUlMudHh0LgojCiIiIlBFUCAzNzYgaW1wbGVtZW50YXRpb24uIiIiCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHVuaWNvZGVfbGl0ZXJhbHMKCmltcG9ydCBiYXNlNjQKaW1wb3J0IGNvZGVjcwppbXBvcnQgY29udGV4dGxpYgppbXBvcnQgaGFzaGxpYgppbXBvcnQgbG9nZ2luZwppbXBvcnQgb3MKaW1wb3J0IHBvc2l4cGF0aAppbXBvcnQgc3lzCmltcG9ydCB6aXBpbXBvcnQKCmZyb20gLiBpbXBvcnQgRGlzdGxpYkV4Y2VwdGlvbiwgcmVzb3VyY2VzCmZyb20gLmNvbXBhdCBpbXBvcnQgU3RyaW5nSU8KZnJvbSAudmVyc2lvbiBpbXBvcnQgZ2V0X3NjaGVtZSwgVW5zdXBwb3J0ZWRWZXJzaW9uRXJyb3IKZnJvbSAubWV0YWRhdGEgaW1wb3J0IE1ldGFkYXRhLCBNRVRBREFUQV9GSUxFTkFNRSwgV0hFRUxfTUVUQURBVEFfRklMRU5BTUUKZnJvbSAudXRpbCBpbXBvcnQgKHBhcnNlX3JlcXVpcmVtZW50LCBjYWNoZWRfcHJvcGVydHksIHBhcnNlX25hbWVfYW5kX3ZlcnNpb24sCiAgICAgICAgICAgICAgICAgICByZWFkX2V4cG9ydHMsIHdyaXRlX2V4cG9ydHMsIENTVlJlYWRlciwgQ1NWV3JpdGVyKQoKCl9fYWxsX18gPSBbJ0Rpc3RyaWJ1dGlvbicsICdCYXNlSW5zdGFsbGVkRGlzdHJpYnV0aW9uJywKICAgICAgICAgICAnSW5zdGFsbGVkRGlzdHJpYnV0aW9uJywgJ0VnZ0luZm9EaXN0cmlidXRpb24nLAogICAgICAgICAgICdEaXN0cmlidXRpb25QYXRoJ10KCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCkVYUE9SVFNfRklMRU5BTUUgPSAncHlkaXN0LWV4cG9ydHMuanNvbicKQ09NTUFORFNfRklMRU5BTUUgPSAncHlkaXN0LWNvbW1hbmRzLmpzb24nCgpESVNUX0ZJTEVTID0gKCdJTlNUQUxMRVInLCBNRVRBREFUQV9GSUxFTkFNRSwgJ1JFQ09SRCcsICdSRVFVRVNURUQnLAogICAgICAgICAgICAgICdSRVNPVVJDRVMnLCBFWFBPUlRTX0ZJTEVOQU1FLCAnU0hBUkVEJykKCkRJU1RJTkZPX0VYVCA9ICcuZGlzdC1pbmZvJwoKCmNsYXNzIF9DYWNoZShvYmplY3QpOgogICAgIiIiCiAgICBBIHNpbXBsZSBjYWNoZSBtYXBwaW5nIG5hbWVzIGFuZCAuZGlzdC1pbmZvIHBhdGhzIHRvIGRpc3RyaWJ1dGlvbnMKICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEluaXRpYWxpc2UgYW4gaW5zdGFuY2UuIFRoZXJlIGlzIG5vcm1hbGx5IG9uZSBmb3IgZWFjaCBEaXN0cmlidXRpb25QYXRoLgogICAgICAgICIiIgogICAgICAgIHNlbGYubmFtZSA9IHt9CiAgICAgICAgc2VsZi5wYXRoID0ge30KICAgICAgICBzZWxmLmdlbmVyYXRlZCA9IEZhbHNlCgogICAgZGVmIGNsZWFyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIENsZWFyIHRoZSBjYWNoZSwgc2V0dGluZyBpdCB0byBpdHMgaW5pdGlhbCBzdGF0ZS4KICAgICAgICAiIiIKICAgICAgICBzZWxmLm5hbWUuY2xlYXIoKQogICAgICAgIHNlbGYucGF0aC5jbGVhcigpCiAgICAgICAgc2VsZi5nZW5lcmF0ZWQgPSBGYWxzZQoKICAgIGRlZiBhZGQoc2VsZiwgZGlzdCk6CiAgICAgICAgIiIiCiAgICAgICAgQWRkIGEgZGlzdHJpYnV0aW9uIHRvIHRoZSBjYWNoZS4KICAgICAgICA6cGFyYW0gZGlzdDogVGhlIGRpc3RyaWJ1dGlvbiB0byBhZGQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgZGlzdC5wYXRoIG5vdCBpbiBzZWxmLnBhdGg6CiAgICAgICAgICAgIHNlbGYucGF0aFtkaXN0LnBhdGhdID0gZGlzdAogICAgICAgICAgICBzZWxmLm5hbWUuc2V0ZGVmYXVsdChkaXN0LmtleSwgW10pLmFwcGVuZChkaXN0KQoKCmNsYXNzIERpc3RyaWJ1dGlvblBhdGgob2JqZWN0KToKICAgICIiIgogICAgUmVwcmVzZW50cyBhIHNldCBvZiBkaXN0cmlidXRpb25zIGluc3RhbGxlZCBvbiBhIHBhdGggKHR5cGljYWxseSBzeXMucGF0aCkuCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoPU5vbmUsIGluY2x1ZGVfZWdnPUZhbHNlKToKICAgICAgICAiIiIKICAgICAgICBDcmVhdGUgYW4gaW5zdGFuY2UgZnJvbSBhIHBhdGgsIG9wdGlvbmFsbHkgaW5jbHVkaW5nIGxlZ2FjeSAoZGlzdHV0aWxzLwogICAgICAgIHNldHVwdG9vbHMvZGlzdHJpYnV0ZSkgZGlzdHJpYnV0aW9ucy4KICAgICAgICA6cGFyYW0gcGF0aDogVGhlIHBhdGggdG8gdXNlLCBhcyBhIGxpc3Qgb2YgZGlyZWN0b3JpZXMuIElmIG5vdCBzcGVjaWZpZWQsCiAgICAgICAgICAgICAgICAgICAgIHN5cy5wYXRoIGlzIHVzZWQuCiAgICAgICAgOnBhcmFtIGluY2x1ZGVfZWdnOiBJZiBUcnVlLCB0aGlzIGluc3RhbmNlIHdpbGwgbG9vayBmb3IgYW5kIHJldHVybiBsZWdhY3kKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGlvbnMgYXMgd2VsbCBhcyB0aG9zZSBiYXNlZCBvbiBQRVAgMzc2LgogICAgICAgICIiIgogICAgICAgIGlmIHBhdGggaXMgTm9uZToKICAgICAgICAgICAgcGF0aCA9IHN5cy5wYXRoCiAgICAgICAgc2VsZi5wYXRoID0gcGF0aAogICAgICAgIHNlbGYuX2luY2x1ZGVfZGlzdCA9IFRydWUKICAgICAgICBzZWxmLl9pbmNsdWRlX2VnZyA9IGluY2x1ZGVfZWdnCgogICAgICAgIHNlbGYuX2NhY2hlID0gX0NhY2hlKCkKICAgICAgICBzZWxmLl9jYWNoZV9lZ2cgPSBfQ2FjaGUoKQogICAgICAgIHNlbGYuX2NhY2hlX2VuYWJsZWQgPSBUcnVlCiAgICAgICAgc2VsZi5fc2NoZW1lID0gZ2V0X3NjaGVtZSgnZGVmYXVsdCcpCgogICAgZGVmIF9nZXRfY2FjaGVfZW5hYmxlZChzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fY2FjaGVfZW5hYmxlZAoKICAgIGRlZiBfc2V0X2NhY2hlX2VuYWJsZWQoc2VsZiwgdmFsdWUpOgogICAgICAgIHNlbGYuX2NhY2hlX2VuYWJsZWQgPSB2YWx1ZQoKICAgIGNhY2hlX2VuYWJsZWQgPSBwcm9wZXJ0eShfZ2V0X2NhY2hlX2VuYWJsZWQsIF9zZXRfY2FjaGVfZW5hYmxlZCkKCiAgICBkZWYgY2xlYXJfY2FjaGUoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgQ2xlYXJzIHRoZSBpbnRlcm5hbCBjYWNoZS4KICAgICAgICAiIiIKICAgICAgICBzZWxmLl9jYWNoZS5jbGVhcigpCiAgICAgICAgc2VsZi5fY2FjaGVfZWdnLmNsZWFyKCkKCgogICAgZGVmIF95aWVsZF9kaXN0cmlidXRpb25zKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFlpZWxkIC5kaXN0LWluZm8gYW5kL29yIC5lZ2coLWluZm8pIGRpc3RyaWJ1dGlvbnMuCiAgICAgICAgIiIiCiAgICAgICAgIyBXZSBuZWVkIHRvIGNoZWNrIGlmIHdlJ3ZlIHNlZW4gc29tZSByZXNvdXJjZXMgYWxyZWFkeSwgYmVjYXVzZSBvbgogICAgICAgICMgc29tZSBMaW51eCBzeXN0ZW1zIChlLmcuIHNvbWUgRGViaWFuL1VidW50dSB2YXJpYW50cykgdGhlcmUgYXJlCiAgICAgICAgIyBzeW1saW5rcyB3aGljaCBhbGlhcyBvdGhlciBmaWxlcyBpbiB0aGUgZW52aXJvbm1lbnQuCiAgICAgICAgc2VlbiA9IHNldCgpCiAgICAgICAgZm9yIHBhdGggaW4gc2VsZi5wYXRoOgogICAgICAgICAgICBmaW5kZXIgPSByZXNvdXJjZXMuZmluZGVyX2Zvcl9wYXRoKHBhdGgpCiAgICAgICAgICAgIGlmIGZpbmRlciBpcyBOb25lOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgciA9IGZpbmRlci5maW5kKCcnKQogICAgICAgICAgICBpZiBub3QgciBvciBub3Qgci5pc19jb250YWluZXI6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICByc2V0ID0gc29ydGVkKHIucmVzb3VyY2VzKQogICAgICAgICAgICBmb3IgZW50cnkgaW4gcnNldDoKICAgICAgICAgICAgICAgIHIgPSBmaW5kZXIuZmluZChlbnRyeSkKICAgICAgICAgICAgICAgIGlmIG5vdCByIG9yIHIucGF0aCBpbiBzZWVuOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBpZiBzZWxmLl9pbmNsdWRlX2Rpc3QgYW5kIGVudHJ5LmVuZHN3aXRoKERJU1RJTkZPX0VYVCk6CiAgICAgICAgICAgICAgICAgICAgcG9zc2libGVfZmlsZW5hbWVzID0gW01FVEFEQVRBX0ZJTEVOQU1FLCBXSEVFTF9NRVRBREFUQV9GSUxFTkFNRV0KICAgICAgICAgICAgICAgICAgICBmb3IgbWV0YWRhdGFfZmlsZW5hbWUgaW4gcG9zc2libGVfZmlsZW5hbWVzOgogICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YV9wYXRoID0gcG9zaXhwYXRoLmpvaW4oZW50cnksIG1ldGFkYXRhX2ZpbGVuYW1lKQogICAgICAgICAgICAgICAgICAgICAgICBweWRpc3QgPSBmaW5kZXIuZmluZChtZXRhZGF0YV9wYXRoKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBweWRpc3Q6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICAgICAgICAgIHdpdGggY29udGV4dGxpYi5jbG9zaW5nKHB5ZGlzdC5hc19zdHJlYW0oKSkgYXMgc3RyZWFtOgogICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IE1ldGFkYXRhKGZpbGVvYmo9c3RyZWFtLCBzY2hlbWU9J2xlZ2FjeScpCiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdGb3VuZCAlcycsIHIucGF0aCkKICAgICAgICAgICAgICAgICAgICBzZWVuLmFkZChyLnBhdGgpCiAgICAgICAgICAgICAgICAgICAgeWllbGQgbmV3X2Rpc3RfY2xhc3Moci5wYXRoLCBtZXRhZGF0YT1tZXRhZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnY9c2VsZikKICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5faW5jbHVkZV9lZ2cgYW5kIGVudHJ5LmVuZHN3aXRoKCgnLmVnZy1pbmZvJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuZWdnJykpOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnRm91bmQgJXMnLCByLnBhdGgpCiAgICAgICAgICAgICAgICAgICAgc2Vlbi5hZGQoci5wYXRoKQogICAgICAgICAgICAgICAgICAgIHlpZWxkIG9sZF9kaXN0X2NsYXNzKHIucGF0aCwgc2VsZikKCiAgICBkZWYgX2dlbmVyYXRlX2NhY2hlKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFNjYW4gdGhlIHBhdGggZm9yIGRpc3RyaWJ1dGlvbnMgYW5kIHBvcHVsYXRlIHRoZSBjYWNoZSB3aXRoCiAgICAgICAgdGhvc2UgdGhhdCBhcmUgZm91bmQuCiAgICAgICAgIiIiCiAgICAgICAgZ2VuX2Rpc3QgPSBub3Qgc2VsZi5fY2FjaGUuZ2VuZXJhdGVkCiAgICAgICAgZ2VuX2VnZyA9IHNlbGYuX2luY2x1ZGVfZWdnIGFuZCBub3Qgc2VsZi5fY2FjaGVfZWdnLmdlbmVyYXRlZAogICAgICAgIGlmIGdlbl9kaXN0IG9yIGdlbl9lZ2c6CiAgICAgICAgICAgIGZvciBkaXN0IGluIHNlbGYuX3lpZWxkX2Rpc3RyaWJ1dGlvbnMoKToKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZGlzdCwgSW5zdGFsbGVkRGlzdHJpYnV0aW9uKToKICAgICAgICAgICAgICAgICAgICBzZWxmLl9jYWNoZS5hZGQoZGlzdCkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fY2FjaGVfZWdnLmFkZChkaXN0KQoKICAgICAgICAgICAgaWYgZ2VuX2Rpc3Q6CiAgICAgICAgICAgICAgICBzZWxmLl9jYWNoZS5nZW5lcmF0ZWQgPSBUcnVlCiAgICAgICAgICAgIGlmIGdlbl9lZ2c6CiAgICAgICAgICAgICAgICBzZWxmLl9jYWNoZV9lZ2cuZ2VuZXJhdGVkID0gVHJ1ZQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGRpc3RpbmZvX2Rpcm5hbWUoY2xzLCBuYW1lLCB2ZXJzaW9uKToKICAgICAgICAiIiIKICAgICAgICBUaGUgKm5hbWUqIGFuZCAqdmVyc2lvbiogcGFyYW1ldGVycyBhcmUgY29udmVydGVkIGludG8gdGhlaXIKICAgICAgICBmaWxlbmFtZS1lc2NhcGVkIGZvcm0sIGkuZS4gYW55IGBgJy0nYGAgY2hhcmFjdGVycyBhcmUgcmVwbGFjZWQKICAgICAgICB3aXRoIGBgJ18nYGAgb3RoZXIgdGhhbiB0aGUgb25lIGluIGBgJ2Rpc3QtaW5mbydgYCBhbmQgdGhlIG9uZQogICAgICAgIHNlcGFyYXRpbmcgdGhlIG5hbWUgZnJvbSB0aGUgdmVyc2lvbiBudW1iZXIuCgogICAgICAgIDpwYXJhbWV0ZXIgbmFtZTogaXMgY29udmVydGVkIHRvIGEgc3RhbmRhcmQgZGlzdHJpYnV0aW9uIG5hbWUgYnkgcmVwbGFjaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICBhbnkgcnVucyBvZiBub24tIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIHdpdGggYSBzaW5nbGUKICAgICAgICAgICAgICAgICAgICAgICAgIGBgJy0nYGAuCiAgICAgICAgOnR5cGUgbmFtZTogc3RyaW5nCiAgICAgICAgOnBhcmFtZXRlciB2ZXJzaW9uOiBpcyBjb252ZXJ0ZWQgdG8gYSBzdGFuZGFyZCB2ZXJzaW9uIHN0cmluZy4gU3BhY2VzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWNvbWUgZG90cywgYW5kIGFsbCBvdGhlciBub24tYWxwaGFudW1lcmljIGNoYXJhY3RlcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChleGNlcHQgZG90cykgYmVjb21lIGRhc2hlcywgd2l0aCBydW5zIG9mIG11bHRpcGxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXNoZXMgY29uZGVuc2VkIHRvIGEgc2luZ2xlIGRhc2guCiAgICAgICAgOnR5cGUgdmVyc2lvbjogc3RyaW5nCiAgICAgICAgOnJldHVybnM6IGRpcmVjdG9yeSBuYW1lCiAgICAgICAgOnJ0eXBlOiBzdHJpbmciIiIKICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKCctJywgJ18nKQogICAgICAgIHJldHVybiAnLScuam9pbihbbmFtZSwgdmVyc2lvbl0pICsgRElTVElORk9fRVhUCgogICAgZGVmIGdldF9kaXN0cmlidXRpb25zKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFByb3ZpZGVzIGFuIGl0ZXJhdG9yIHRoYXQgbG9va3MgZm9yIGRpc3RyaWJ1dGlvbnMgYW5kIHJldHVybnMKICAgICAgICA6Y2xhc3M6YEluc3RhbGxlZERpc3RyaWJ1dGlvbmAgb3IKICAgICAgICA6Y2xhc3M6YEVnZ0luZm9EaXN0cmlidXRpb25gIGluc3RhbmNlcyBmb3IgZWFjaCBvbmUgb2YgdGhlbS4KCiAgICAgICAgOnJ0eXBlOiBpdGVyYXRvciBvZiA6Y2xhc3M6YEluc3RhbGxlZERpc3RyaWJ1dGlvbmAgYW5kCiAgICAgICAgICAgICAgICA6Y2xhc3M6YEVnZ0luZm9EaXN0cmlidXRpb25gIGluc3RhbmNlcwogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBzZWxmLl9jYWNoZV9lbmFibGVkOgogICAgICAgICAgICBmb3IgZGlzdCBpbiBzZWxmLl95aWVsZF9kaXN0cmlidXRpb25zKCk6CiAgICAgICAgICAgICAgICB5aWVsZCBkaXN0CiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5fZ2VuZXJhdGVfY2FjaGUoKQoKICAgICAgICAgICAgZm9yIGRpc3QgaW4gc2VsZi5fY2FjaGUucGF0aC52YWx1ZXMoKToKICAgICAgICAgICAgICAgIHlpZWxkIGRpc3QKCiAgICAgICAgICAgIGlmIHNlbGYuX2luY2x1ZGVfZWdnOgogICAgICAgICAgICAgICAgZm9yIGRpc3QgaW4gc2VsZi5fY2FjaGVfZWdnLnBhdGgudmFsdWVzKCk6CiAgICAgICAgICAgICAgICAgICAgeWllbGQgZGlzdAoKICAgIGRlZiBnZXRfZGlzdHJpYnV0aW9uKHNlbGYsIG5hbWUpOgogICAgICAgICIiIgogICAgICAgIExvb2tzIGZvciBhIG5hbWVkIGRpc3RyaWJ1dGlvbiBvbiB0aGUgcGF0aC4KCiAgICAgICAgVGhpcyBmdW5jdGlvbiBvbmx5IHJldHVybnMgdGhlIGZpcnN0IHJlc3VsdCBmb3VuZCwgYXMgbm8gbW9yZSB0aGFuIG9uZQogICAgICAgIHZhbHVlIGlzIGV4cGVjdGVkLiBJZiBub3RoaW5nIGlzIGZvdW5kLCBgYE5vbmVgYCBpcyByZXR1cm5lZC4KCiAgICAgICAgOnJ0eXBlOiA6Y2xhc3M6YEluc3RhbGxlZERpc3RyaWJ1dGlvbmAsIDpjbGFzczpgRWdnSW5mb0Rpc3RyaWJ1dGlvbmAKICAgICAgICAgICAgICAgIG9yIGBgTm9uZWBgCiAgICAgICAgIiIiCiAgICAgICAgcmVzdWx0ID0gTm9uZQogICAgICAgIG5hbWUgPSBuYW1lLmxvd2VyKCkKICAgICAgICBpZiBub3Qgc2VsZi5fY2FjaGVfZW5hYmxlZDoKICAgICAgICAgICAgZm9yIGRpc3QgaW4gc2VsZi5feWllbGRfZGlzdHJpYnV0aW9ucygpOgogICAgICAgICAgICAgICAgaWYgZGlzdC5rZXkgPT0gbmFtZToKICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBkaXN0CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLl9nZW5lcmF0ZV9jYWNoZSgpCgogICAgICAgICAgICBpZiBuYW1lIGluIHNlbGYuX2NhY2hlLm5hbWU6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBzZWxmLl9jYWNoZS5uYW1lW25hbWVdWzBdCiAgICAgICAgICAgIGVsaWYgc2VsZi5faW5jbHVkZV9lZ2cgYW5kIG5hbWUgaW4gc2VsZi5fY2FjaGVfZWdnLm5hbWU6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBzZWxmLl9jYWNoZV9lZ2cubmFtZVtuYW1lXVswXQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgcHJvdmlkZXNfZGlzdHJpYnV0aW9uKHNlbGYsIG5hbWUsIHZlcnNpb249Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgSXRlcmF0ZXMgb3ZlciBhbGwgZGlzdHJpYnV0aW9ucyB0byBmaW5kIHdoaWNoIGRpc3RyaWJ1dGlvbnMgcHJvdmlkZSAqbmFtZSouCiAgICAgICAgSWYgYSAqdmVyc2lvbiogaXMgcHJvdmlkZWQsIGl0IHdpbGwgYmUgdXNlZCB0byBmaWx0ZXIgdGhlIHJlc3VsdHMuCgogICAgICAgIFRoaXMgZnVuY3Rpb24gb25seSByZXR1cm5zIHRoZSBmaXJzdCByZXN1bHQgZm91bmQsIHNpbmNlIG5vIG1vcmUgdGhhbgogICAgICAgIG9uZSB2YWx1ZXMgYXJlIGV4cGVjdGVkLiBJZiB0aGUgZGlyZWN0b3J5IGlzIG5vdCBmb3VuZCwgcmV0dXJucyBgYE5vbmVgYC4KCiAgICAgICAgOnBhcmFtZXRlciB2ZXJzaW9uOiBhIHZlcnNpb24gc3BlY2lmaWVyIHRoYXQgaW5kaWNhdGVzIHRoZSB2ZXJzaW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZCwgY29uZm9ybWluZyB0byB0aGUgZm9ybWF0IGluIGBgUEVQLTM0NWBgCgogICAgICAgIDp0eXBlIG5hbWU6IHN0cmluZwogICAgICAgIDp0eXBlIHZlcnNpb246IHN0cmluZwogICAgICAgICIiIgogICAgICAgIG1hdGNoZXIgPSBOb25lCiAgICAgICAgaWYgbm90IHZlcnNpb24gaXMgTm9uZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgbWF0Y2hlciA9IHNlbGYuX3NjaGVtZS5tYXRjaGVyKCclcyAoJXMpJyAlIChuYW1lLCB2ZXJzaW9uKSkKICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdpbnZhbGlkIG5hbWUgb3IgdmVyc2lvbjogJXIsICVyJyAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5hbWUsIHZlcnNpb24pKQoKICAgICAgICBmb3IgZGlzdCBpbiBzZWxmLmdldF9kaXN0cmlidXRpb25zKCk6CiAgICAgICAgICAgIHByb3ZpZGVkID0gZGlzdC5wcm92aWRlcwoKICAgICAgICAgICAgZm9yIHAgaW4gcHJvdmlkZWQ6CiAgICAgICAgICAgICAgICBwX25hbWUsIHBfdmVyID0gcGFyc2VfbmFtZV9hbmRfdmVyc2lvbihwKQogICAgICAgICAgICAgICAgaWYgbWF0Y2hlciBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgIGlmIHBfbmFtZSA9PSBuYW1lOgogICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBkaXN0CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGlmIHBfbmFtZSA9PSBuYW1lIGFuZCBtYXRjaGVyLm1hdGNoKHBfdmVyKToKICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgZGlzdAogICAgICAgICAgICAgICAgICAgICAgICBicmVhawoKICAgIGRlZiBnZXRfZmlsZV9wYXRoKHNlbGYsIG5hbWUsIHJlbGF0aXZlX3BhdGgpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiB0aGUgcGF0aCB0byBhIHJlc291cmNlIGZpbGUuCiAgICAgICAgIiIiCiAgICAgICAgZGlzdCA9IHNlbGYuZ2V0X2Rpc3RyaWJ1dGlvbihuYW1lKQogICAgICAgIGlmIGRpc3QgaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgTG9va3VwRXJyb3IoJ25vIGRpc3RyaWJ1dGlvbiBuYW1lZCAlciBmb3VuZCcgJSBuYW1lKQogICAgICAgIHJldHVybiBkaXN0LmdldF9yZXNvdXJjZV9wYXRoKHJlbGF0aXZlX3BhdGgpCgogICAgZGVmIGdldF9leHBvcnRlZF9lbnRyaWVzKHNlbGYsIGNhdGVnb3J5LCBuYW1lPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBhbGwgb2YgdGhlIGV4cG9ydGVkIGVudHJpZXMgaW4gYSBwYXJ0aWN1bGFyIGNhdGVnb3J5LgoKICAgICAgICA6cGFyYW0gY2F0ZWdvcnk6IFRoZSBjYXRlZ29yeSB0byBzZWFyY2ggZm9yIGVudHJpZXMuCiAgICAgICAgOnBhcmFtIG5hbWU6IElmIHNwZWNpZmllZCwgb25seSBlbnRyaWVzIHdpdGggdGhhdCBuYW1lIGFyZSByZXR1cm5lZC4KICAgICAgICAiIiIKICAgICAgICBmb3IgZGlzdCBpbiBzZWxmLmdldF9kaXN0cmlidXRpb25zKCk6CiAgICAgICAgICAgIHIgPSBkaXN0LmV4cG9ydHMKICAgICAgICAgICAgaWYgY2F0ZWdvcnkgaW4gcjoKICAgICAgICAgICAgICAgIGQgPSByW2NhdGVnb3J5XQogICAgICAgICAgICAgICAgaWYgbmFtZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICBpZiBuYW1lIGluIGQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGRbbmFtZV0KICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgZm9yIHYgaW4gZC52YWx1ZXMoKToKICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgdgoKCmNsYXNzIERpc3RyaWJ1dGlvbihvYmplY3QpOgogICAgIiIiCiAgICBBIGJhc2UgY2xhc3MgZm9yIGRpc3RyaWJ1dGlvbnMsIHdoZXRoZXIgaW5zdGFsbGVkIG9yIGZyb20gaW5kZXhlcy4KICAgIEVpdGhlciB3YXksIGl0IG11c3QgaGF2ZSBzb21lIG1ldGFkYXRhLCBzbyB0aGF0J3MgYWxsIHRoYXQncyBuZWVkZWQKICAgIGZvciBjb25zdHJ1Y3Rpb24uCiAgICAiIiIKCiAgICBidWlsZF90aW1lX2RlcGVuZGVuY3kgPSBGYWxzZQogICAgIiIiCiAgICBTZXQgdG8gVHJ1ZSBpZiBpdCdzIGtub3duIHRvIGJlIG9ubHkgYSBidWlsZC10aW1lIGRlcGVuZGVuY3kgKGkuZS4KICAgIG5vdCBuZWVkZWQgYWZ0ZXIgaW5zdGFsbGF0aW9uKS4KICAgICIiIgoKICAgIHJlcXVlc3RlZCA9IEZhbHNlCiAgICAiIiJBIGJvb2xlYW4gdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgYGBSRVFVRVNURURgYCBtZXRhZGF0YSBmaWxlIGlzCiAgICBwcmVzZW50IChpbiBvdGhlciB3b3Jkcywgd2hldGhlciB0aGUgcGFja2FnZSB3YXMgaW5zdGFsbGVkIGJ5IHVzZXIKICAgIHJlcXVlc3Qgb3IgaXQgd2FzIGluc3RhbGxlZCBhcyBhIGRlcGVuZGVuY3kpLiIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXRhZGF0YSk6CiAgICAgICAgIiIiCiAgICAgICAgSW5pdGlhbGlzZSBhbiBpbnN0YW5jZS4KICAgICAgICA6cGFyYW0gbWV0YWRhdGE6IFRoZSBpbnN0YW5jZSBvZiA6Y2xhc3M6YE1ldGFkYXRhYCBkZXNjcmliaW5nIHRoaXMKICAgICAgICBkaXN0cmlidXRpb24uCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5tZXRhZGF0YSA9IG1ldGFkYXRhCiAgICAgICAgc2VsZi5uYW1lID0gbWV0YWRhdGEubmFtZQogICAgICAgIHNlbGYua2V5ID0gc2VsZi5uYW1lLmxvd2VyKCkgICAgIyBmb3IgY2FzZS1pbnNlbnNpdGl2ZSBjb21wYXJpc29ucwogICAgICAgIHNlbGYudmVyc2lvbiA9IG1ldGFkYXRhLnZlcnNpb24KICAgICAgICBzZWxmLmxvY2F0b3IgPSBOb25lCiAgICAgICAgc2VsZi5kaWdlc3QgPSBOb25lCiAgICAgICAgc2VsZi5leHRyYXMgPSBOb25lICAgICAgIyBhZGRpdGlvbmFsIGZlYXR1cmVzIHJlcXVlc3RlZAogICAgICAgIHNlbGYuY29udGV4dCA9IE5vbmUgICAgICMgZW52aXJvbm1lbnQgbWFya2VyIG92ZXJyaWRlcwogICAgICAgIHNlbGYuZG93bmxvYWRfdXJscyA9IHNldCgpCiAgICAgICAgc2VsZi5kaWdlc3RzID0ge30KCiAgICBAcHJvcGVydHkKICAgIGRlZiBzb3VyY2VfdXJsKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRoZSBzb3VyY2UgYXJjaGl2ZSBkb3dubG9hZCBVUkwgZm9yIHRoaXMgZGlzdHJpYnV0aW9uLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLm1ldGFkYXRhLnNvdXJjZV91cmwKCiAgICBkb3dubG9hZF91cmwgPSBzb3VyY2VfdXJsICAgIyBCYWNrd2FyZCBjb21wYXRpYmlsaXR5CgogICAgQHByb3BlcnR5CiAgICBkZWYgbmFtZV9hbmRfdmVyc2lvbihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBBIHV0aWxpdHkgcHJvcGVydHkgd2hpY2ggZGlzcGxheXMgdGhlIG5hbWUgYW5kIHZlcnNpb24gaW4gcGFyZW50aGVzZXMuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuICclcyAoJXMpJyAlIChzZWxmLm5hbWUsIHNlbGYudmVyc2lvbikKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwcm92aWRlcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBBIHNldCBvZiBkaXN0cmlidXRpb24gbmFtZXMgYW5kIHZlcnNpb25zIHByb3ZpZGVkIGJ5IHRoaXMgZGlzdHJpYnV0aW9uLgogICAgICAgIDpyZXR1cm46IEEgc2V0IG9mICJuYW1lICh2ZXJzaW9uKSIgc3RyaW5ncy4KICAgICAgICAiIiIKICAgICAgICBwbGlzdCA9IHNlbGYubWV0YWRhdGEucHJvdmlkZXMKICAgICAgICBzID0gJyVzICglcyknICUgKHNlbGYubmFtZSwgc2VsZi52ZXJzaW9uKQogICAgICAgIGlmIHMgbm90IGluIHBsaXN0OgogICAgICAgICAgICBwbGlzdC5hcHBlbmQocykKICAgICAgICByZXR1cm4gcGxpc3QKCiAgICBkZWYgX2dldF9yZXF1aXJlbWVudHMoc2VsZiwgcmVxX2F0dHIpOgogICAgICAgIG1kID0gc2VsZi5tZXRhZGF0YQogICAgICAgIGxvZ2dlci5kZWJ1ZygnR2V0dGluZyByZXF1aXJlbWVudHMgZnJvbSBtZXRhZGF0YSAlcicsIG1kLnRvZGljdCgpKQogICAgICAgIHJlcXRzID0gZ2V0YXR0cihtZCwgcmVxX2F0dHIpCiAgICAgICAgcmV0dXJuIHNldChtZC5nZXRfcmVxdWlyZW1lbnRzKHJlcXRzLCBleHRyYXM9c2VsZi5leHRyYXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudj1zZWxmLmNvbnRleHQpKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHJ1bl9yZXF1aXJlcyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fZ2V0X3JlcXVpcmVtZW50cygncnVuX3JlcXVpcmVzJykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBtZXRhX3JlcXVpcmVzKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9nZXRfcmVxdWlyZW1lbnRzKCdtZXRhX3JlcXVpcmVzJykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBidWlsZF9yZXF1aXJlcyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fZ2V0X3JlcXVpcmVtZW50cygnYnVpbGRfcmVxdWlyZXMnKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHRlc3RfcmVxdWlyZXMoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2dldF9yZXF1aXJlbWVudHMoJ3Rlc3RfcmVxdWlyZXMnKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGRldl9yZXF1aXJlcyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fZ2V0X3JlcXVpcmVtZW50cygnZGV2X3JlcXVpcmVzJykKCiAgICBkZWYgbWF0Y2hlc19yZXF1aXJlbWVudChzZWxmLCByZXEpOgogICAgICAgICIiIgogICAgICAgIFNheSBpZiB0aGlzIGluc3RhbmNlIG1hdGNoZXMgKGZ1bGZpbGxzKSBhIHJlcXVpcmVtZW50LgogICAgICAgIDpwYXJhbSByZXE6IFRoZSByZXF1aXJlbWVudCB0byBtYXRjaC4KICAgICAgICA6cnR5cGUgcmVxOiBzdHIKICAgICAgICA6cmV0dXJuOiBUcnVlIGlmIGl0IG1hdGNoZXMsIGVsc2UgRmFsc2UuCiAgICAgICAgIiIiCiAgICAgICAgIyBSZXF1aXJlbWVudCBtYXkgY29udGFpbiBleHRyYXMgLSBwYXJzZSB0byBsb3NlIHRob3NlCiAgICAgICAgIyBmcm9tIHdoYXQncyBwYXNzZWQgdG8gdGhlIG1hdGNoZXIKICAgICAgICByID0gcGFyc2VfcmVxdWlyZW1lbnQocmVxKQogICAgICAgIHNjaGVtZSA9IGdldF9zY2hlbWUoc2VsZi5tZXRhZGF0YS5zY2hlbWUpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBtYXRjaGVyID0gc2NoZW1lLm1hdGNoZXIoci5yZXF1aXJlbWVudCkKICAgICAgICBleGNlcHQgVW5zdXBwb3J0ZWRWZXJzaW9uRXJyb3I6CiAgICAgICAgICAgICMgWFhYIGNvbXBhdC1tb2RlIGlmIGNhbm5vdCByZWFkIHRoZSB2ZXJzaW9uCiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdjb3VsZCBub3QgcmVhZCB2ZXJzaW9uICVyIC0gdXNpbmcgbmFtZSBvbmx5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxKQogICAgICAgICAgICBuYW1lID0gcmVxLnNwbGl0KClbMF0KICAgICAgICAgICAgbWF0Y2hlciA9IHNjaGVtZS5tYXRjaGVyKG5hbWUpCgogICAgICAgIG5hbWUgPSBtYXRjaGVyLmtleSAgICMgY2FzZS1pbnNlbnNpdGl2ZQoKICAgICAgICByZXN1bHQgPSBGYWxzZQogICAgICAgIGZvciBwIGluIHNlbGYucHJvdmlkZXM6CiAgICAgICAgICAgIHBfbmFtZSwgcF92ZXIgPSBwYXJzZV9uYW1lX2FuZF92ZXJzaW9uKHApCiAgICAgICAgICAgIGlmIHBfbmFtZSAhPSBuYW1lOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmVzdWx0ID0gbWF0Y2hlci5tYXRjaChwX3ZlcikKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGV4Y2VwdCBVbnN1cHBvcnRlZFZlcnNpb25FcnJvcjoKICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBpbnN0YW5jZSwKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnNvdXJjZV91cmw6CiAgICAgICAgICAgIHN1ZmZpeCA9ICcgWyVzXScgJSBzZWxmLnNvdXJjZV91cmwKICAgICAgICBlbHNlOgogICAgICAgICAgICBzdWZmaXggPSAnJwogICAgICAgIHJldHVybiAnPERpc3RyaWJ1dGlvbiAlcyAoJXMpJXM+JyAlIChzZWxmLm5hbWUsIHNlbGYudmVyc2lvbiwgc3VmZml4KQoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgICIiIgogICAgICAgIFNlZSBpZiB0aGlzIGRpc3RyaWJ1dGlvbiBpcyB0aGUgc2FtZSBhcyBhbm90aGVyLgogICAgICAgIDpwYXJhbSBvdGhlcjogVGhlIGRpc3RyaWJ1dGlvbiB0byBjb21wYXJlIHdpdGguIFRvIGJlIGVxdWFsIHRvIG9uZQogICAgICAgICAgICAgICAgICAgICAgYW5vdGhlci4gZGlzdHJpYnV0aW9ucyBtdXN0IGhhdmUgdGhlIHNhbWUgdHlwZSwgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gYW5kIHNvdXJjZV91cmwuCiAgICAgICAgOnJldHVybjogVHJ1ZSBpZiBpdCBpcyB0aGUgc2FtZSwgZWxzZSBGYWxzZS4KICAgICAgICAiIiIKICAgICAgICBpZiB0eXBlKG90aGVyKSBpcyBub3QgdHlwZShzZWxmKToKICAgICAgICAgICAgcmVzdWx0ID0gRmFsc2UKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXN1bHQgPSAoc2VsZi5uYW1lID09IG90aGVyLm5hbWUgYW5kCiAgICAgICAgICAgICAgICAgICAgICBzZWxmLnZlcnNpb24gPT0gb3RoZXIudmVyc2lvbiBhbmQKICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc291cmNlX3VybCA9PSBvdGhlci5zb3VyY2VfdXJsKQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgQ29tcHV0ZSBoYXNoIGluIGEgd2F5IHdoaWNoIG1hdGNoZXMgdGhlIGVxdWFsaXR5IHRlc3QuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGhhc2goc2VsZi5uYW1lKSArIGhhc2goc2VsZi52ZXJzaW9uKSArIGhhc2goc2VsZi5zb3VyY2VfdXJsKQoKCmNsYXNzIEJhc2VJbnN0YWxsZWREaXN0cmlidXRpb24oRGlzdHJpYnV0aW9uKToKICAgICIiIgogICAgVGhpcyBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgaW5zdGFsbGVkIGRpc3RyaWJ1dGlvbnMgKHdoZXRoZXIgUEVQIDM3NiBvcgogICAgbGVnYWN5KS4KICAgICIiIgoKICAgIGhhc2hlciA9IE5vbmUKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbWV0YWRhdGEsIHBhdGgsIGVudj1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBJbml0aWFsaXNlIGFuIGluc3RhbmNlLgogICAgICAgIDpwYXJhbSBtZXRhZGF0YTogQW4gaW5zdGFuY2Ugb2YgOmNsYXNzOmBNZXRhZGF0YWAgd2hpY2ggZGVzY3JpYmVzIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9uLiBUaGlzIHdpbGwgbm9ybWFsbHkgaGF2ZSBiZWVuIGluaXRpYWxpc2VkCiAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGEgbWV0YWRhdGEgZmlsZSBpbiB0aGUgYGBwYXRoYGAuCiAgICAgICAgOnBhcmFtIHBhdGg6ICAgICBUaGUgcGF0aCBvZiB0aGUgYGAuZGlzdC1pbmZvYGAgb3IgYGAuZWdnLWluZm9gYAogICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3J5IGZvciB0aGUgZGlzdHJpYnV0aW9uLgogICAgICAgIDpwYXJhbSBlbnY6ICAgICAgVGhpcyBpcyBub3JtYWxseSB0aGUgOmNsYXNzOmBEaXN0cmlidXRpb25QYXRoYAogICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2Ugd2hlcmUgdGhpcyBkaXN0cmlidXRpb24gd2FzIGZvdW5kLgogICAgICAgICIiIgogICAgICAgIHN1cGVyKEJhc2VJbnN0YWxsZWREaXN0cmlidXRpb24sIHNlbGYpLl9faW5pdF9fKG1ldGFkYXRhKQogICAgICAgIHNlbGYucGF0aCA9IHBhdGgKICAgICAgICBzZWxmLmRpc3RfcGF0aCA9IGVudgoKICAgIGRlZiBnZXRfaGFzaChzZWxmLCBkYXRhLCBoYXNoZXI9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgR2V0IHRoZSBoYXNoIG9mIHNvbWUgZGF0YSwgdXNpbmcgYSBwYXJ0aWN1bGFyIGhhc2ggYWxnb3JpdGhtLCBpZgogICAgICAgIHNwZWNpZmllZC4KCiAgICAgICAgOnBhcmFtIGRhdGE6IFRoZSBkYXRhIHRvIGJlIGhhc2hlZC4KICAgICAgICA6dHlwZSBkYXRhOiBieXRlcwogICAgICAgIDpwYXJhbSBoYXNoZXI6IFRoZSBuYW1lIG9mIGEgaGFzaCBpbXBsZW1lbnRhdGlvbiwgc3VwcG9ydGVkIGJ5IGhhc2hsaWIsCiAgICAgICAgICAgICAgICAgICAgICAgb3IgYGBOb25lYGAuIEV4YW1wbGVzIG9mIHZhbGlkIHZhbHVlcyBhcmUgYGAnc2hhMSdgYCwKICAgICAgICAgICAgICAgICAgICAgICBgYCdzaGEyMjQnYGAsIGBgJ3NoYTM4NCdgYCwgJ2Bgc2hhMjU2J2BgLCBgYCdtZDUnYGAgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgYGAnc2hhNTEyJ2BgLiBJZiBubyBoYXNoZXIgaXMgc3BlY2lmaWVkLCB0aGUgYGBoYXNoZXJgYAogICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSBvZiB0aGUgOmNsYXNzOmBJbnN0YWxsZWREaXN0cmlidXRpb25gIGluc3RhbmNlCiAgICAgICAgICAgICAgICAgICAgICAgaXMgdXNlZC4gSWYgdGhlIGhhc2hlciBpcyBkZXRlcm1pbmVkIHRvIGJlIGBgTm9uZWBgLCBNRDUKICAgICAgICAgICAgICAgICAgICAgICBpcyB1c2VkIGFzIHRoZSBoYXNoaW5nIGFsZ29yaXRobS4KICAgICAgICA6cmV0dXJuczogVGhlIGhhc2ggb2YgdGhlIGRhdGEuIElmIGEgaGFzaGVyIHdhcyBleHBsaWNpdGx5IHNwZWNpZmllZCwKICAgICAgICAgICAgICAgICAgdGhlIHJldHVybmVkIGhhc2ggd2lsbCBiZSBwcmVmaXhlZCB3aXRoIHRoZSBzcGVjaWZpZWQgaGFzaGVyCiAgICAgICAgICAgICAgICAgIGZvbGxvd2VkIGJ5ICc9Jy4KICAgICAgICA6cnR5cGU6IHN0cgogICAgICAgICIiIgogICAgICAgIGlmIGhhc2hlciBpcyBOb25lOgogICAgICAgICAgICBoYXNoZXIgPSBzZWxmLmhhc2hlcgogICAgICAgIGlmIGhhc2hlciBpcyBOb25lOgogICAgICAgICAgICBoYXNoZXIgPSBoYXNobGliLm1kNQogICAgICAgICAgICBwcmVmaXggPSAnJwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGhhc2hlciA9IGdldGF0dHIoaGFzaGxpYiwgaGFzaGVyKQogICAgICAgICAgICBwcmVmaXggPSAnJXM9JyAlIHNlbGYuaGFzaGVyCiAgICAgICAgZGlnZXN0ID0gaGFzaGVyKGRhdGEpLmRpZ2VzdCgpCiAgICAgICAgZGlnZXN0ID0gYmFzZTY0LnVybHNhZmVfYjY0ZW5jb2RlKGRpZ2VzdCkucnN0cmlwKGInPScpLmRlY29kZSgnYXNjaWknKQogICAgICAgIHJldHVybiAnJXMlcycgJSAocHJlZml4LCBkaWdlc3QpCgoKY2xhc3MgSW5zdGFsbGVkRGlzdHJpYnV0aW9uKEJhc2VJbnN0YWxsZWREaXN0cmlidXRpb24pOgogICAgIiIiCiAgICBDcmVhdGVkIHdpdGggdGhlICpwYXRoKiBvZiB0aGUgYGAuZGlzdC1pbmZvYGAgZGlyZWN0b3J5IHByb3ZpZGVkIHRvIHRoZQogICAgY29uc3RydWN0b3IuIEl0IHJlYWRzIHRoZSBtZXRhZGF0YSBjb250YWluZWQgaW4gYGBweWRpc3QuanNvbmBgIHdoZW4gaXQgaXMKICAgIGluc3RhbnRpYXRlZC4sIG9yIHVzZXMgYSBwYXNzZWQgaW4gTWV0YWRhdGEgaW5zdGFuY2UgKHVzZWZ1bCBmb3Igd2hlbgogICAgZHJ5LXJ1biBtb2RlIGlzIGJlaW5nIHVzZWQpLgogICAgIiIiCgogICAgaGFzaGVyID0gJ3NoYTI1NicKCiAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCwgbWV0YWRhdGE9Tm9uZSwgZW52PU5vbmUpOgogICAgICAgIHNlbGYuZmluZGVyID0gZmluZGVyID0gcmVzb3VyY2VzLmZpbmRlcl9mb3JfcGF0aChwYXRoKQogICAgICAgIGlmIGZpbmRlciBpcyBOb25lOgogICAgICAgICAgICBpbXBvcnQgcGRiOyBwZGIuc2V0X3RyYWNlICgpCiAgICAgICAgaWYgZW52IGFuZCBlbnYuX2NhY2hlX2VuYWJsZWQgYW5kIHBhdGggaW4gZW52Ll9jYWNoZS5wYXRoOgogICAgICAgICAgICBtZXRhZGF0YSA9IGVudi5fY2FjaGUucGF0aFtwYXRoXS5tZXRhZGF0YQogICAgICAgIGVsaWYgbWV0YWRhdGEgaXMgTm9uZToKICAgICAgICAgICAgciA9IGZpbmRlci5maW5kKE1FVEFEQVRBX0ZJTEVOQU1FKQogICAgICAgICAgICAjIFRlbXBvcmFyeSAtIGZvciBXaGVlbCAwLjIzIHN1cHBvcnQKICAgICAgICAgICAgaWYgciBpcyBOb25lOgogICAgICAgICAgICAgICAgciA9IGZpbmRlci5maW5kKFdIRUVMX01FVEFEQVRBX0ZJTEVOQU1FKQogICAgICAgICAgICAjIFRlbXBvcmFyeSAtIGZvciBsZWdhY3kgc3VwcG9ydAogICAgICAgICAgICBpZiByIGlzIE5vbmU6CiAgICAgICAgICAgICAgICByID0gZmluZGVyLmZpbmQoJ01FVEFEQVRBJykKICAgICAgICAgICAgaWYgciBpcyBOb25lOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignbm8gJXMgZm91bmQgaW4gJXMnICUgKE1FVEFEQVRBX0ZJTEVOQU1FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgpKQogICAgICAgICAgICB3aXRoIGNvbnRleHRsaWIuY2xvc2luZyhyLmFzX3N0cmVhbSgpKSBhcyBzdHJlYW06CiAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IE1ldGFkYXRhKGZpbGVvYmo9c3RyZWFtLCBzY2hlbWU9J2xlZ2FjeScpCgogICAgICAgIHN1cGVyKEluc3RhbGxlZERpc3RyaWJ1dGlvbiwgc2VsZikuX19pbml0X18obWV0YWRhdGEsIHBhdGgsIGVudikKCiAgICAgICAgaWYgZW52IGFuZCBlbnYuX2NhY2hlX2VuYWJsZWQ6CiAgICAgICAgICAgIGVudi5fY2FjaGUuYWRkKHNlbGYpCgogICAgICAgIHRyeToKICAgICAgICAgICAgciA9IGZpbmRlci5maW5kKCdSRVFVRVNURUQnKQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgaW1wb3J0IHBkYjsgcGRiLnNldF90cmFjZSAoKQogICAgICAgIHNlbGYucmVxdWVzdGVkID0gciBpcyBub3QgTm9uZQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gJzxJbnN0YWxsZWREaXN0cmlidXRpb24gJXIgJXMgYXQgJXI+JyAlICgKICAgICAgICAgICAgc2VsZi5uYW1lLCBzZWxmLnZlcnNpb24sIHNlbGYucGF0aCkKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIiVzICVzIiAlIChzZWxmLm5hbWUsIHNlbGYudmVyc2lvbikKCiAgICBkZWYgX2dldF9yZWNvcmRzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEdldCB0aGUgbGlzdCBvZiBpbnN0YWxsZWQgZmlsZXMgZm9yIHRoZSBkaXN0cmlidXRpb24KICAgICAgICA6cmV0dXJuOiBBIGxpc3Qgb2YgdHVwbGVzIG9mIHBhdGgsIGhhc2ggYW5kIHNpemUuIE5vdGUgdGhhdCBoYXNoIGFuZAogICAgICAgICAgICAgICAgIHNpemUgbWlnaHQgYmUgYGBOb25lYGAgZm9yIHNvbWUgZW50cmllcy4gVGhlIHBhdGggaXMgZXhhY3RseQogICAgICAgICAgICAgICAgIGFzIHN0b3JlZCBpbiB0aGUgZmlsZSAod2hpY2ggaXMgYXMgaW4gUEVQIDM3NikuCiAgICAgICAgIiIiCiAgICAgICAgcmVzdWx0cyA9IFtdCiAgICAgICAgciA9IHNlbGYuZ2V0X2Rpc3RpbmZvX3Jlc291cmNlKCdSRUNPUkQnKQogICAgICAgIHdpdGggY29udGV4dGxpYi5jbG9zaW5nKHIuYXNfc3RyZWFtKCkpIGFzIHN0cmVhbToKICAgICAgICAgICAgd2l0aCBDU1ZSZWFkZXIoc3RyZWFtPXN0cmVhbSkgYXMgcmVjb3JkX3JlYWRlcjoKICAgICAgICAgICAgICAgICMgQmFzZSBsb2NhdGlvbiBpcyBwYXJlbnQgZGlyIG9mIC5kaXN0LWluZm8gZGlyCiAgICAgICAgICAgICAgICAjYmFzZV9sb2NhdGlvbiA9IG9zLnBhdGguZGlybmFtZShzZWxmLnBhdGgpCiAgICAgICAgICAgICAgICAjYmFzZV9sb2NhdGlvbiA9IG9zLnBhdGguYWJzcGF0aChiYXNlX2xvY2F0aW9uKQogICAgICAgICAgICAgICAgZm9yIHJvdyBpbiByZWNvcmRfcmVhZGVyOgogICAgICAgICAgICAgICAgICAgIG1pc3NpbmcgPSBbTm9uZSBmb3IgaSBpbiByYW5nZShsZW4ocm93KSwgMyldCiAgICAgICAgICAgICAgICAgICAgcGF0aCwgY2hlY2tzdW0sIHNpemUgPSByb3cgKyBtaXNzaW5nCiAgICAgICAgICAgICAgICAgICAgI2lmIG5vdCBvcy5wYXRoLmlzYWJzKHBhdGgpOgogICAgICAgICAgICAgICAgICAgICMgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgnLycsIG9zLnNlcCkKICAgICAgICAgICAgICAgICAgICAjICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oYmFzZV9sb2NhdGlvbiwgcGF0aCkKICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgocGF0aCwgY2hlY2tzdW0sIHNpemUpKQogICAgICAgIHJldHVybiByZXN1bHRzCgogICAgQGNhY2hlZF9wcm9wZXJ0eQogICAgZGVmIGV4cG9ydHMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIHRoZSBpbmZvcm1hdGlvbiBleHBvcnRlZCBieSB0aGlzIGRpc3RyaWJ1dGlvbi4KICAgICAgICA6cmV0dXJuOiBBIGRpY3Rpb25hcnkgb2YgZXhwb3J0cywgbWFwcGluZyBhbiBleHBvcnQgY2F0ZWdvcnkgdG8gYSBkaWN0CiAgICAgICAgICAgICAgICAgb2YgOmNsYXNzOmBFeHBvcnRFbnRyeWAgaW5zdGFuY2VzIGRlc2NyaWJpbmcgdGhlIGluZGl2aWR1YWwKICAgICAgICAgICAgICAgICBleHBvcnQgZW50cmllcywgYW5kIGtleWVkIGJ5IG5hbWUuCiAgICAgICAgIiIiCiAgICAgICAgcmVzdWx0ID0ge30KICAgICAgICByID0gc2VsZi5nZXRfZGlzdGluZm9fcmVzb3VyY2UoRVhQT1JUU19GSUxFTkFNRSkKICAgICAgICBpZiByOgogICAgICAgICAgICByZXN1bHQgPSBzZWxmLnJlYWRfZXhwb3J0cygpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiByZWFkX2V4cG9ydHMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmVhZCBleHBvcnRzIGRhdGEgZnJvbSBhIGZpbGUgaW4gLmluaSBmb3JtYXQuCgogICAgICAgIDpyZXR1cm46IEEgZGljdGlvbmFyeSBvZiBleHBvcnRzLCBtYXBwaW5nIGFuIGV4cG9ydCBjYXRlZ29yeSB0byBhIGxpc3QKICAgICAgICAgICAgICAgICBvZiA6Y2xhc3M6YEV4cG9ydEVudHJ5YCBpbnN0YW5jZXMgZGVzY3JpYmluZyB0aGUgaW5kaXZpZHVhbAogICAgICAgICAgICAgICAgIGV4cG9ydCBlbnRyaWVzLgogICAgICAgICIiIgogICAgICAgIHJlc3VsdCA9IHt9CiAgICAgICAgciA9IHNlbGYuZ2V0X2Rpc3RpbmZvX3Jlc291cmNlKEVYUE9SVFNfRklMRU5BTUUpCiAgICAgICAgaWYgcjoKICAgICAgICAgICAgd2l0aCBjb250ZXh0bGliLmNsb3Npbmcoci5hc19zdHJlYW0oKSkgYXMgc3RyZWFtOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVhZF9leHBvcnRzKHN0cmVhbSkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIHdyaXRlX2V4cG9ydHMoc2VsZiwgZXhwb3J0cyk6CiAgICAgICAgIiIiCiAgICAgICAgV3JpdGUgYSBkaWN0aW9uYXJ5IG9mIGV4cG9ydHMgdG8gYSBmaWxlIGluIC5pbmkgZm9ybWF0LgogICAgICAgIDpwYXJhbSBleHBvcnRzOiBBIGRpY3Rpb25hcnkgb2YgZXhwb3J0cywgbWFwcGluZyBhbiBleHBvcnQgY2F0ZWdvcnkgdG8KICAgICAgICAgICAgICAgICAgICAgICAgYSBsaXN0IG9mIDpjbGFzczpgRXhwb3J0RW50cnlgIGluc3RhbmNlcyBkZXNjcmliaW5nIHRoZQogICAgICAgICAgICAgICAgICAgICAgICBpbmRpdmlkdWFsIGV4cG9ydCBlbnRyaWVzLgogICAgICAgICIiIgogICAgICAgIHJmID0gc2VsZi5nZXRfZGlzdGluZm9fZmlsZShFWFBPUlRTX0ZJTEVOQU1FKQogICAgICAgIHdpdGggb3BlbihyZiwgJ3cnKSBhcyBmOgogICAgICAgICAgICB3cml0ZV9leHBvcnRzKGV4cG9ydHMsIGYpCgogICAgZGVmIGdldF9yZXNvdXJjZV9wYXRoKHNlbGYsIHJlbGF0aXZlX3BhdGgpOgogICAgICAgICIiIgogICAgICAgIE5PVEU6IFRoaXMgQVBJIG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS4KCiAgICAgICAgUmV0dXJuIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIGEgcmVzb3VyY2UgZmlsZSB3aXRoIHRoZSBnaXZlbiByZWxhdGl2ZQogICAgICAgIHBhdGguCgogICAgICAgIDpwYXJhbSByZWxhdGl2ZV9wYXRoOiBUaGUgcGF0aCwgcmVsYXRpdmUgdG8gLmRpc3QtaW5mbywgb2YgdGhlIHJlc291cmNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIGludGVyZXN0LgogICAgICAgIDpyZXR1cm46IFRoZSBhYnNvbHV0ZSBwYXRoIHdoZXJlIHRoZSByZXNvdXJjZSBpcyB0byBiZSBmb3VuZC4KICAgICAgICAiIiIKICAgICAgICByID0gc2VsZi5nZXRfZGlzdGluZm9fcmVzb3VyY2UoJ1JFU09VUkNFUycpCiAgICAgICAgd2l0aCBjb250ZXh0bGliLmNsb3Npbmcoci5hc19zdHJlYW0oKSkgYXMgc3RyZWFtOgogICAgICAgICAgICB3aXRoIENTVlJlYWRlcihzdHJlYW09c3RyZWFtKSBhcyByZXNvdXJjZXNfcmVhZGVyOgogICAgICAgICAgICAgICAgZm9yIHJlbGF0aXZlLCBkZXN0aW5hdGlvbiBpbiByZXNvdXJjZXNfcmVhZGVyOgogICAgICAgICAgICAgICAgICAgIGlmIHJlbGF0aXZlID09IHJlbGF0aXZlX3BhdGg6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXN0aW5hdGlvbgogICAgICAgIHJhaXNlIEtleUVycm9yKCdubyByZXNvdXJjZSBmaWxlIHdpdGggcmVsYXRpdmUgcGF0aCAlciAnCiAgICAgICAgICAgICAgICAgICAgICAgJ2lzIGluc3RhbGxlZCcgJSByZWxhdGl2ZV9wYXRoKQoKICAgIGRlZiBsaXN0X2luc3RhbGxlZF9maWxlcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBJdGVyYXRlcyBvdmVyIHRoZSBgYFJFQ09SRGBgIGVudHJpZXMgYW5kIHJldHVybnMgYSB0dXBsZQogICAgICAgIGBgKHBhdGgsIGhhc2gsIHNpemUpYGAgZm9yIGVhY2ggbGluZS4KCiAgICAgICAgOnJldHVybnM6IGl0ZXJhdG9yIG9mIChwYXRoLCBoYXNoLCBzaXplKQogICAgICAgICIiIgogICAgICAgIGZvciByZXN1bHQgaW4gc2VsZi5fZ2V0X3JlY29yZHMoKToKICAgICAgICAgICAgeWllbGQgcmVzdWx0CgogICAgZGVmIHdyaXRlX2luc3RhbGxlZF9maWxlcyhzZWxmLCBwYXRocywgcHJlZml4LCBkcnlfcnVuPUZhbHNlKToKICAgICAgICAiIiIKICAgICAgICBXcml0ZXMgdGhlIGBgUkVDT1JEYGAgZmlsZSwgdXNpbmcgdGhlIGBgcGF0aHNgYCBpdGVyYWJsZSBwYXNzZWQgaW4uIEFueQogICAgICAgIGV4aXN0aW5nIGBgUkVDT1JEYGAgZmlsZSBpcyBzaWxlbnRseSBvdmVyd3JpdHRlbi4KCiAgICAgICAgcHJlZml4IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZW4gdG8gd3JpdGUgYWJzb2x1dGUgcGF0aHMuCiAgICAgICAgIiIiCiAgICAgICAgcHJlZml4ID0gb3MucGF0aC5qb2luKHByZWZpeCwgJycpCiAgICAgICAgYmFzZSA9IG9zLnBhdGguZGlybmFtZShzZWxmLnBhdGgpCiAgICAgICAgYmFzZV91bmRlcl9wcmVmaXggPSBiYXNlLnN0YXJ0c3dpdGgocHJlZml4KQogICAgICAgIGJhc2UgPSBvcy5wYXRoLmpvaW4oYmFzZSwgJycpCiAgICAgICAgcmVjb3JkX3BhdGggPSBzZWxmLmdldF9kaXN0aW5mb19maWxlKCdSRUNPUkQnKQogICAgICAgIGxvZ2dlci5pbmZvKCdjcmVhdGluZyAlcycsIHJlY29yZF9wYXRoKQogICAgICAgIGlmIGRyeV9ydW46CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgd2l0aCBDU1ZXcml0ZXIocmVjb3JkX3BhdGgpIGFzIHdyaXRlcjoKICAgICAgICAgICAgZm9yIHBhdGggaW4gcGF0aHM6CiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKHBhdGgpIG9yIHBhdGguZW5kc3dpdGgoKCcucHljJywgJy5weW8nKSk6CiAgICAgICAgICAgICAgICAgICAgIyBkbyBub3QgcHV0IHNpemUgYW5kIGhhc2gsIGFzIGluIFBFUC0zNzYKICAgICAgICAgICAgICAgICAgICBoYXNoX3ZhbHVlID0gc2l6ZSA9ICcnCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHNpemUgPSAnJWQnICUgb3MucGF0aC5nZXRzaXplKHBhdGgpCiAgICAgICAgICAgICAgICAgICAgd2l0aCBvcGVuKHBhdGgsICdyYicpIGFzIGZwOgogICAgICAgICAgICAgICAgICAgICAgICBoYXNoX3ZhbHVlID0gc2VsZi5nZXRfaGFzaChmcC5yZWFkKCkpCiAgICAgICAgICAgICAgICBpZiBwYXRoLnN0YXJ0c3dpdGgoYmFzZSkgb3IgKGJhc2VfdW5kZXJfcHJlZml4IGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLnN0YXJ0c3dpdGgocHJlZml4KSk6CiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGgucmVscGF0aChwYXRoLCBiYXNlKQogICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlcm93KChwYXRoLCBoYXNoX3ZhbHVlLCBzaXplKSkKCiAgICAgICAgICAgICMgYWRkIHRoZSBSRUNPUkQgZmlsZSBpdHNlbGYKICAgICAgICAgICAgaWYgcmVjb3JkX3BhdGguc3RhcnRzd2l0aChiYXNlKToKICAgICAgICAgICAgICAgIHJlY29yZF9wYXRoID0gb3MucGF0aC5yZWxwYXRoKHJlY29yZF9wYXRoLCBiYXNlKQogICAgICAgICAgICB3cml0ZXIud3JpdGVyb3coKHJlY29yZF9wYXRoLCAnJywgJycpKQogICAgICAgIHJldHVybiByZWNvcmRfcGF0aAoKICAgIGRlZiBjaGVja19pbnN0YWxsZWRfZmlsZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgQ2hlY2tzIHRoYXQgdGhlIGhhc2hlcyBhbmQgc2l6ZXMgb2YgdGhlIGZpbGVzIGluIGBgUkVDT1JEYGAgYXJlCiAgICAgICAgbWF0Y2hlZCBieSB0aGUgZmlsZXMgdGhlbXNlbHZlcy4gUmV0dXJucyBhIChwb3NzaWJseSBlbXB0eSkgbGlzdCBvZgogICAgICAgIG1pc21hdGNoZXMuIEVhY2ggZW50cnkgaW4gdGhlIG1pc21hdGNoIGxpc3Qgd2lsbCBiZSBhIHR1cGxlIGNvbnNpc3RpbmcKICAgICAgICBvZiB0aGUgcGF0aCwgJ2V4aXN0cycsICdzaXplJyBvciAnaGFzaCcgYWNjb3JkaW5nIHRvIHdoYXQgZGlkbid0IG1hdGNoCiAgICAgICAgKGV4aXN0ZW5jZSBpcyBjaGVja2VkIGZpcnN0LCB0aGVuIHNpemUsIHRoZW4gaGFzaCksIHRoZSBleHBlY3RlZAogICAgICAgIHZhbHVlIGFuZCB0aGUgYWN0dWFsIHZhbHVlLgogICAgICAgICIiIgogICAgICAgIG1pc21hdGNoZXMgPSBbXQogICAgICAgIGJhc2UgPSBvcy5wYXRoLmRpcm5hbWUoc2VsZi5wYXRoKQogICAgICAgIHJlY29yZF9wYXRoID0gc2VsZi5nZXRfZGlzdGluZm9fZmlsZSgnUkVDT1JEJykKICAgICAgICBmb3IgcGF0aCwgaGFzaF92YWx1ZSwgc2l6ZSBpbiBzZWxmLmxpc3RfaW5zdGFsbGVkX2ZpbGVzKCk6CiAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzYWJzKHBhdGgpOgogICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihiYXNlLCBwYXRoKQogICAgICAgICAgICBpZiBwYXRoID09IHJlY29yZF9wYXRoOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHBhdGgpOgogICAgICAgICAgICAgICAgbWlzbWF0Y2hlcy5hcHBlbmQoKHBhdGgsICdleGlzdHMnLCBUcnVlLCBGYWxzZSkpCiAgICAgICAgICAgIGVsaWYgb3MucGF0aC5pc2ZpbGUocGF0aCk6CiAgICAgICAgICAgICAgICBhY3R1YWxfc2l6ZSA9IHN0cihvcy5wYXRoLmdldHNpemUocGF0aCkpCiAgICAgICAgICAgICAgICBpZiBzaXplIGFuZCBhY3R1YWxfc2l6ZSAhPSBzaXplOgogICAgICAgICAgICAgICAgICAgIG1pc21hdGNoZXMuYXBwZW5kKChwYXRoLCAnc2l6ZScsIHNpemUsIGFjdHVhbF9zaXplKSkKICAgICAgICAgICAgICAgIGVsaWYgaGFzaF92YWx1ZToKICAgICAgICAgICAgICAgICAgICBpZiAnPScgaW4gaGFzaF92YWx1ZToKICAgICAgICAgICAgICAgICAgICAgICAgaGFzaGVyID0gaGFzaF92YWx1ZS5zcGxpdCgnPScsIDEpWzBdCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgaGFzaGVyID0gTm9uZQoKICAgICAgICAgICAgICAgICAgICB3aXRoIG9wZW4ocGF0aCwgJ3JiJykgYXMgZjoKICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsX2hhc2ggPSBzZWxmLmdldF9oYXNoKGYucmVhZCgpLCBoYXNoZXIpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGFjdHVhbF9oYXNoICE9IGhhc2hfdmFsdWU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNtYXRjaGVzLmFwcGVuZCgocGF0aCwgJ2hhc2gnLCBoYXNoX3ZhbHVlLCBhY3R1YWxfaGFzaCkpCiAgICAgICAgcmV0dXJuIG1pc21hdGNoZXMKCiAgICBAY2FjaGVkX3Byb3BlcnR5CiAgICBkZWYgc2hhcmVkX2xvY2F0aW9ucyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBBIGRpY3Rpb25hcnkgb2Ygc2hhcmVkIGxvY2F0aW9ucyB3aG9zZSBrZXlzIGFyZSBpbiB0aGUgc2V0ICdwcmVmaXgnLAogICAgICAgICdwdXJlbGliJywgJ3BsYXRsaWInLCAnc2NyaXB0cycsICdoZWFkZXJzJywgJ2RhdGEnIGFuZCAnbmFtZXNwYWNlJy4KICAgICAgICBUaGUgY29ycmVzcG9uZGluZyB2YWx1ZSBpcyB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGF0IGNhdGVnb3J5IGZvcgogICAgICAgIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgdGFrZXMgaW50byBhY2NvdW50IGFueSBwYXRocyBzZWxlY3RlZCBieSB0aGUKICAgICAgICB1c2VyIGF0IGluc3RhbGxhdGlvbiB0aW1lIChlLmcuIHZpYSBjb21tYW5kLWxpbmUgYXJndW1lbnRzKS4gSW4gdGhlCiAgICAgICAgY2FzZSBvZiB0aGUgJ25hbWVzcGFjZScga2V5LCB0aGlzIHdvdWxkIGJlIGEgbGlzdCBvZiBhYnNvbHV0ZSBwYXRocwogICAgICAgIGZvciB0aGUgcm9vdHMgb2YgbmFtZXNwYWNlIHBhY2thZ2VzIGluIHRoaXMgZGlzdHJpYnV0aW9uLgoKICAgICAgICBUaGUgZmlyc3QgdGltZSB0aGlzIHByb3BlcnR5IGlzIGFjY2Vzc2VkLCB0aGUgcmVsZXZhbnQgaW5mb3JtYXRpb24gaXMKICAgICAgICByZWFkIGZyb20gdGhlIFNIQVJFRCBmaWxlIGluIHRoZSAuZGlzdC1pbmZvIGRpcmVjdG9yeS4KICAgICAgICAiIiIKICAgICAgICByZXN1bHQgPSB7fQogICAgICAgIHNoYXJlZF9wYXRoID0gb3MucGF0aC5qb2luKHNlbGYucGF0aCwgJ1NIQVJFRCcpCiAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoc2hhcmVkX3BhdGgpOgogICAgICAgICAgICB3aXRoIGNvZGVjcy5vcGVuKHNoYXJlZF9wYXRoLCAncicsIGVuY29kaW5nPSd1dGYtOCcpIGFzIGY6CiAgICAgICAgICAgICAgICBsaW5lcyA9IGYucmVhZCgpLnNwbGl0bGluZXMoKQogICAgICAgICAgICBmb3IgbGluZSBpbiBsaW5lczoKICAgICAgICAgICAgICAgIGtleSwgdmFsdWUgPSBsaW5lLnNwbGl0KCc9JywgMSkKICAgICAgICAgICAgICAgIGlmIGtleSA9PSAnbmFtZXNwYWNlJzoKICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2V0ZGVmYXVsdChrZXksIFtdKS5hcHBlbmQodmFsdWUpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldID0gdmFsdWUKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIHdyaXRlX3NoYXJlZF9sb2NhdGlvbnMoc2VsZiwgcGF0aHMsIGRyeV9ydW49RmFsc2UpOgogICAgICAgICIiIgogICAgICAgIFdyaXRlIHNoYXJlZCBsb2NhdGlvbiBpbmZvcm1hdGlvbiB0byB0aGUgU0hBUkVEIGZpbGUgaW4gLmRpc3QtaW5mby4KICAgICAgICA6cGFyYW0gcGF0aHM6IEEgZGljdGlvbmFyeSBhcyBkZXNjcmliZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gZm9yCiAgICAgICAgOm1ldGg6YHNoYXJlZF9sb2NhdGlvbnNgLgogICAgICAgIDpwYXJhbSBkcnlfcnVuOiBJZiBUcnVlLCB0aGUgYWN0aW9uIGlzIGxvZ2dlZCBidXQgbm8gZmlsZSBpcyBhY3R1YWxseQogICAgICAgICAgICAgICAgICAgICAgICB3cml0dGVuLgogICAgICAgIDpyZXR1cm46IFRoZSBwYXRoIG9mIHRoZSBmaWxlIHdyaXR0ZW4gdG8uCiAgICAgICAgIiIiCiAgICAgICAgc2hhcmVkX3BhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5wYXRoLCAnU0hBUkVEJykKICAgICAgICBsb2dnZXIuaW5mbygnY3JlYXRpbmcgJXMnLCBzaGFyZWRfcGF0aCkKICAgICAgICBpZiBkcnlfcnVuOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIGxpbmVzID0gW10KICAgICAgICBmb3Iga2V5IGluICgncHJlZml4JywgJ2xpYicsICdoZWFkZXJzJywgJ3NjcmlwdHMnLCAnZGF0YScpOgogICAgICAgICAgICBwYXRoID0gcGF0aHNba2V5XQogICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKHBhdGhzW2tleV0pOgogICAgICAgICAgICAgICAgbGluZXMuYXBwZW5kKCclcz0lcycgJSAoa2V5LCAgcGF0aCkpCiAgICAgICAgZm9yIG5zIGluIHBhdGhzLmdldCgnbmFtZXNwYWNlJywgKCkpOgogICAgICAgICAgICBsaW5lcy5hcHBlbmQoJ25hbWVzcGFjZT0lcycgJSBucykKCiAgICAgICAgd2l0aCBjb2RlY3Mub3BlbihzaGFyZWRfcGF0aCwgJ3cnLCBlbmNvZGluZz0ndXRmLTgnKSBhcyBmOgogICAgICAgICAgICBmLndyaXRlKCdcbicuam9pbihsaW5lcykpCiAgICAgICAgcmV0dXJuIHNoYXJlZF9wYXRoCgogICAgZGVmIGdldF9kaXN0aW5mb19yZXNvdXJjZShzZWxmLCBwYXRoKToKICAgICAgICBpZiBwYXRoIG5vdCBpbiBESVNUX0ZJTEVTOgogICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdpbnZhbGlkIHBhdGggZm9yIGEgZGlzdC1pbmZvIGZpbGU6ICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXIgYXQgJXInICUgKHBhdGgsIHNlbGYucGF0aCkpCiAgICAgICAgZmluZGVyID0gcmVzb3VyY2VzLmZpbmRlcl9mb3JfcGF0aChzZWxmLnBhdGgpCiAgICAgICAgaWYgZmluZGVyIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ1VuYWJsZSB0byBnZXQgYSBmaW5kZXIgZm9yICVzJyAlIHNlbGYucGF0aCkKICAgICAgICByZXR1cm4gZmluZGVyLmZpbmQocGF0aCkKCiAgICBkZWYgZ2V0X2Rpc3RpbmZvX2ZpbGUoc2VsZiwgcGF0aCk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJucyBhIHBhdGggbG9jYXRlZCB1bmRlciB0aGUgYGAuZGlzdC1pbmZvYGAgZGlyZWN0b3J5LiBSZXR1cm5zIGEKICAgICAgICBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwYXRoLgoKICAgICAgICA6cGFyYW1ldGVyIHBhdGg6IGEgYGAnLydgYC1zZXBhcmF0ZWQgcGF0aCByZWxhdGl2ZSB0byB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgIGBgLmRpc3QtaW5mb2BgIGRpcmVjdG9yeSBvciBhbiBhYnNvbHV0ZSBwYXRoOwogICAgICAgICAgICAgICAgICAgICAgICAgSWYgKnBhdGgqIGlzIGFuIGFic29sdXRlIHBhdGggYW5kIGRvZXNuJ3Qgc3RhcnQKICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGhlIGBgLmRpc3QtaW5mb2BgIGRpcmVjdG9yeSBwYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgYSA6Y2xhc3M6YERpc3RsaWJFeGNlcHRpb25gIGlzIHJhaXNlZAogICAgICAgIDp0eXBlIHBhdGg6IHN0cgogICAgICAgIDpydHlwZTogc3RyCiAgICAgICAgIiIiCiAgICAgICAgIyBDaGVjayBpZiBpdCBpcyBhbiBhYnNvbHV0ZSBwYXRoICAjIFhYWCB1c2UgcmVscGF0aCwgYWRkIHRlc3RzCiAgICAgICAgaWYgcGF0aC5maW5kKG9zLnNlcCkgPj0gMDoKICAgICAgICAgICAgIyBpdCdzIGFuIGFic29sdXRlIHBhdGg/CiAgICAgICAgICAgIGRpc3RpbmZvX2Rpcm5hbWUsIHBhdGggPSBwYXRoLnNwbGl0KG9zLnNlcClbLTI6XQogICAgICAgICAgICBpZiBkaXN0aW5mb19kaXJuYW1lICE9IHNlbGYucGF0aC5zcGxpdChvcy5zZXApWy0xXToKICAgICAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgICAgJ2Rpc3QtaW5mbyBmaWxlICVyIGRvZXMgbm90IGJlbG9uZyB0byB0aGUgJXIgJXMgJwogICAgICAgICAgICAgICAgICAgICdkaXN0cmlidXRpb24nICUgKHBhdGgsIHNlbGYubmFtZSwgc2VsZi52ZXJzaW9uKSkKCiAgICAgICAgIyBUaGUgZmlsZSBtdXN0IGJlIHJlbGF0aXZlCiAgICAgICAgaWYgcGF0aCBub3QgaW4gRElTVF9GSUxFUzoKICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbignaW52YWxpZCBwYXRoIGZvciBhIGRpc3QtaW5mbyBmaWxlOiAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVyIGF0ICVyJyAlIChwYXRoLCBzZWxmLnBhdGgpKQoKICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKHNlbGYucGF0aCwgcGF0aCkKCiAgICBkZWYgbGlzdF9kaXN0aW5mb19maWxlcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBJdGVyYXRlcyBvdmVyIHRoZSBgYFJFQ09SRGBgIGVudHJpZXMgYW5kIHJldHVybnMgcGF0aHMgZm9yIGVhY2ggbGluZSBpZgogICAgICAgIHRoZSBwYXRoIGlzIHBvaW50aW5nIHRvIGEgZmlsZSBsb2NhdGVkIGluIHRoZSBgYC5kaXN0LWluZm9gYCBkaXJlY3RvcnkKICAgICAgICBvciBvbmUgb2YgaXRzIHN1YmRpcmVjdG9yaWVzLgoKICAgICAgICA6cmV0dXJuczogaXRlcmF0b3Igb2YgcGF0aHMKICAgICAgICAiIiIKICAgICAgICBiYXNlID0gb3MucGF0aC5kaXJuYW1lKHNlbGYucGF0aCkKICAgICAgICBmb3IgcGF0aCwgY2hlY2tzdW0sIHNpemUgaW4gc2VsZi5fZ2V0X3JlY29yZHMoKToKICAgICAgICAgICAgIyBYWFggYWRkIHNlcGFyYXRvciBvciB1c2UgcmVhbCByZWxwYXRoIGFsZ28KICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguaXNhYnMocGF0aCk6CiAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKGJhc2UsIHBhdGgpCiAgICAgICAgICAgIGlmIHBhdGguc3RhcnRzd2l0aChzZWxmLnBhdGgpOgogICAgICAgICAgICAgICAgeWllbGQgcGF0aAoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiAoaXNpbnN0YW5jZShvdGhlciwgSW5zdGFsbGVkRGlzdHJpYnV0aW9uKSBhbmQKICAgICAgICAgICAgICAgIHNlbGYucGF0aCA9PSBvdGhlci5wYXRoKQoKICAgICMgU2VlIGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvcmVmZXJlbmNlL2RhdGFtb2RlbCNvYmplY3QuX19oYXNoX18KICAgIF9faGFzaF9fID0gb2JqZWN0Ll9faGFzaF9fCgoKY2xhc3MgRWdnSW5mb0Rpc3RyaWJ1dGlvbihCYXNlSW5zdGFsbGVkRGlzdHJpYnV0aW9uKToKICAgICIiIkNyZWF0ZWQgd2l0aCB0aGUgKnBhdGgqIG9mIHRoZSBgYC5lZ2ctaW5mb2BgIGRpcmVjdG9yeSBvciBmaWxlIHByb3ZpZGVkCiAgICB0byB0aGUgY29uc3RydWN0b3IuIEl0IHJlYWRzIHRoZSBtZXRhZGF0YSBjb250YWluZWQgaW4gdGhlIGZpbGUgaXRzZWxmLCBvcgogICAgaWYgdGhlIGdpdmVuIHBhdGggaGFwcGVucyB0byBiZSBhIGRpcmVjdG9yeSwgdGhlIG1ldGFkYXRhIGlzIHJlYWQgZnJvbSB0aGUKICAgIGZpbGUgYGBQS0ctSU5GT2BgIHVuZGVyIHRoYXQgZGlyZWN0b3J5LiIiIgoKICAgIHJlcXVlc3RlZCA9IFRydWUgICAgIyBhcyB3ZSBoYXZlIG5vIHdheSBvZiBrbm93aW5nLCBhc3N1bWUgaXQgd2FzCiAgICBzaGFyZWRfbG9jYXRpb25zID0ge30KCiAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCwgZW52PU5vbmUpOgogICAgICAgIGRlZiBzZXRfbmFtZV9hbmRfdmVyc2lvbihzLCBuLCB2KToKICAgICAgICAgICAgcy5uYW1lID0gbgogICAgICAgICAgICBzLmtleSA9IG4ubG93ZXIoKSAgICMgZm9yIGNhc2UtaW5zZW5zaXRpdmUgY29tcGFyaXNvbnMKICAgICAgICAgICAgcy52ZXJzaW9uID0gdgoKICAgICAgICBzZWxmLnBhdGggPSBwYXRoCiAgICAgICAgc2VsZi5kaXN0X3BhdGggPSBlbnYKICAgICAgICBpZiBlbnYgYW5kIGVudi5fY2FjaGVfZW5hYmxlZCBhbmQgcGF0aCBpbiBlbnYuX2NhY2hlX2VnZy5wYXRoOgogICAgICAgICAgICBtZXRhZGF0YSA9IGVudi5fY2FjaGVfZWdnLnBhdGhbcGF0aF0ubWV0YWRhdGEKICAgICAgICAgICAgc2V0X25hbWVfYW5kX3ZlcnNpb24oc2VsZiwgbWV0YWRhdGEubmFtZSwgbWV0YWRhdGEudmVyc2lvbikKICAgICAgICBlbHNlOgogICAgICAgICAgICBtZXRhZGF0YSA9IHNlbGYuX2dldF9tZXRhZGF0YShwYXRoKQoKICAgICAgICAgICAgIyBOZWVkIHRvIGJlIHNldCBiZWZvcmUgY2FjaGluZwogICAgICAgICAgICBzZXRfbmFtZV9hbmRfdmVyc2lvbihzZWxmLCBtZXRhZGF0YS5uYW1lLCBtZXRhZGF0YS52ZXJzaW9uKQoKICAgICAgICAgICAgaWYgZW52IGFuZCBlbnYuX2NhY2hlX2VuYWJsZWQ6CiAgICAgICAgICAgICAgICBlbnYuX2NhY2hlX2VnZy5hZGQoc2VsZikKICAgICAgICBzdXBlcihFZ2dJbmZvRGlzdHJpYnV0aW9uLCBzZWxmKS5fX2luaXRfXyhtZXRhZGF0YSwgcGF0aCwgZW52KQoKICAgIGRlZiBfZ2V0X21ldGFkYXRhKHNlbGYsIHBhdGgpOgogICAgICAgIHJlcXVpcmVzID0gTm9uZQoKICAgICAgICBkZWYgcGFyc2VfcmVxdWlyZXNfZGF0YShkYXRhKToKICAgICAgICAgICAgIiIiQ3JlYXRlIGEgbGlzdCBvZiBkZXBlbmRlbmNpZXMgZnJvbSBhIHJlcXVpcmVzLnR4dCBmaWxlLgoKICAgICAgICAgICAgKmRhdGEqOiB0aGUgY29udGVudHMgb2YgYSBzZXR1cHRvb2xzLXByb2R1Y2VkIHJlcXVpcmVzLnR4dCBmaWxlLgogICAgICAgICAgICAiIiIKICAgICAgICAgICAgcmVxcyA9IFtdCiAgICAgICAgICAgIGxpbmVzID0gZGF0YS5zcGxpdGxpbmVzKCkKICAgICAgICAgICAgZm9yIGxpbmUgaW4gbGluZXM6CiAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5zdHJpcCgpCiAgICAgICAgICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoJ1snKToKICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygnVW5leHBlY3RlZCBsaW5lOiBxdWl0dGluZyByZXF1aXJlbWVudCBzY2FuOiAlcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSkKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgciA9IHBhcnNlX3JlcXVpcmVtZW50KGxpbmUpCiAgICAgICAgICAgICAgICBpZiBub3QgcjoKICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygnTm90IHJlY29nbmlzZWQgYXMgYSByZXF1aXJlbWVudDogJXInLCBsaW5lKQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBpZiByLmV4dHJhczoKICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygnZXh0cmEgcmVxdWlyZW1lbnRzIGluIHJlcXVpcmVzLnR4dCBhcmUgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdub3Qgc3VwcG9ydGVkJykKICAgICAgICAgICAgICAgIGlmIG5vdCByLmNvbnN0cmFpbnRzOgogICAgICAgICAgICAgICAgICAgIHJlcXMuYXBwZW5kKHIubmFtZSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgY29ucyA9ICcsICcuam9pbignJXMlcycgJSBjIGZvciBjIGluIHIuY29uc3RyYWludHMpCiAgICAgICAgICAgICAgICAgICAgcmVxcy5hcHBlbmQoJyVzICglcyknICUgKHIubmFtZSwgY29ucykpCiAgICAgICAgICAgIHJldHVybiByZXFzCgogICAgICAgIGRlZiBwYXJzZV9yZXF1aXJlc19wYXRoKHJlcV9wYXRoKToKICAgICAgICAgICAgIiIiQ3JlYXRlIGEgbGlzdCBvZiBkZXBlbmRlbmNpZXMgZnJvbSBhIHJlcXVpcmVzLnR4dCBmaWxlLgoKICAgICAgICAgICAgKnJlcV9wYXRoKjogdGhlIHBhdGggdG8gYSBzZXR1cHRvb2xzLXByb2R1Y2VkIHJlcXVpcmVzLnR4dCBmaWxlLgogICAgICAgICAgICAiIiIKCiAgICAgICAgICAgIHJlcXMgPSBbXQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICB3aXRoIGNvZGVjcy5vcGVuKHJlcV9wYXRoLCAncicsICd1dGYtOCcpIGFzIGZwOgogICAgICAgICAgICAgICAgICAgIHJlcXMgPSBwYXJzZV9yZXF1aXJlc19kYXRhKGZwLnJlYWQoKSkKICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6CiAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgIHJldHVybiByZXFzCgogICAgICAgIGlmIHBhdGguZW5kc3dpdGgoJy5lZ2cnKToKICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihwYXRoKToKICAgICAgICAgICAgICAgIG1ldGFfcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCAnRUdHLUlORk8nLCAnUEtHLUlORk8nKQogICAgICAgICAgICAgICAgbWV0YWRhdGEgPSBNZXRhZGF0YShwYXRoPW1ldGFfcGF0aCwgc2NoZW1lPSdsZWdhY3knKQogICAgICAgICAgICAgICAgcmVxX3BhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgJ0VHRy1JTkZPJywgJ3JlcXVpcmVzLnR4dCcpCiAgICAgICAgICAgICAgICByZXF1aXJlcyA9IHBhcnNlX3JlcXVpcmVzX3BhdGgocmVxX3BhdGgpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIEZJWE1FIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB6aXBmaWxlIGlzIG5vdCBhdmFpbGFibGUKICAgICAgICAgICAgICAgIHppcGYgPSB6aXBpbXBvcnQuemlwaW1wb3J0ZXIocGF0aCkKICAgICAgICAgICAgICAgIGZpbGVvYmogPSBTdHJpbmdJTygKICAgICAgICAgICAgICAgICAgICB6aXBmLmdldF9kYXRhKCdFR0ctSU5GTy9QS0ctSU5GTycpLmRlY29kZSgndXRmOCcpKQogICAgICAgICAgICAgICAgbWV0YWRhdGEgPSBNZXRhZGF0YShmaWxlb2JqPWZpbGVvYmosIHNjaGVtZT0nbGVnYWN5JykKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBkYXRhID0gemlwZi5nZXRfZGF0YSgnRUdHLUlORk8vcmVxdWlyZXMudHh0JykKICAgICAgICAgICAgICAgICAgICByZXF1aXJlcyA9IHBhcnNlX3JlcXVpcmVzX2RhdGEoZGF0YS5kZWNvZGUoJ3V0Zi04JykpCiAgICAgICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKICAgICAgICAgICAgICAgICAgICByZXF1aXJlcyA9IE5vbmUKICAgICAgICBlbGlmIHBhdGguZW5kc3dpdGgoJy5lZ2ctaW5mbycpOgogICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKHBhdGgpOgogICAgICAgICAgICAgICAgcmVxX3BhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgJ3JlcXVpcmVzLnR4dCcpCiAgICAgICAgICAgICAgICByZXF1aXJlcyA9IHBhcnNlX3JlcXVpcmVzX3BhdGgocmVxX3BhdGgpCiAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsICdQS0ctSU5GTycpCiAgICAgICAgICAgIG1ldGFkYXRhID0gTWV0YWRhdGEocGF0aD1wYXRoLCBzY2hlbWU9J2xlZ2FjeScpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbigncGF0aCBtdXN0IGVuZCB3aXRoIC5lZ2ctaW5mbyBvciAuZWdnLCAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2dvdCAlcicgJSBwYXRoKQoKICAgICAgICBpZiByZXF1aXJlczoKICAgICAgICAgICAgbWV0YWRhdGEuYWRkX3JlcXVpcmVtZW50cyhyZXF1aXJlcykKICAgICAgICByZXR1cm4gbWV0YWRhdGEKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICc8RWdnSW5mb0Rpc3RyaWJ1dGlvbiAlciAlcyBhdCAlcj4nICUgKAogICAgICAgICAgICBzZWxmLm5hbWUsIHNlbGYudmVyc2lvbiwgc2VsZi5wYXRoKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiJXMgJXMiICUgKHNlbGYubmFtZSwgc2VsZi52ZXJzaW9uKQoKICAgIGRlZiBjaGVja19pbnN0YWxsZWRfZmlsZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgQ2hlY2tzIHRoYXQgdGhlIGhhc2hlcyBhbmQgc2l6ZXMgb2YgdGhlIGZpbGVzIGluIGBgUkVDT1JEYGAgYXJlCiAgICAgICAgbWF0Y2hlZCBieSB0aGUgZmlsZXMgdGhlbXNlbHZlcy4gUmV0dXJucyBhIChwb3NzaWJseSBlbXB0eSkgbGlzdCBvZgogICAgICAgIG1pc21hdGNoZXMuIEVhY2ggZW50cnkgaW4gdGhlIG1pc21hdGNoIGxpc3Qgd2lsbCBiZSBhIHR1cGxlIGNvbnNpc3RpbmcKICAgICAgICBvZiB0aGUgcGF0aCwgJ2V4aXN0cycsICdzaXplJyBvciAnaGFzaCcgYWNjb3JkaW5nIHRvIHdoYXQgZGlkbid0IG1hdGNoCiAgICAgICAgKGV4aXN0ZW5jZSBpcyBjaGVja2VkIGZpcnN0LCB0aGVuIHNpemUsIHRoZW4gaGFzaCksIHRoZSBleHBlY3RlZAogICAgICAgIHZhbHVlIGFuZCB0aGUgYWN0dWFsIHZhbHVlLgogICAgICAgICIiIgogICAgICAgIG1pc21hdGNoZXMgPSBbXQogICAgICAgIHJlY29yZF9wYXRoID0gb3MucGF0aC5qb2luKHNlbGYucGF0aCwgJ2luc3RhbGxlZC1maWxlcy50eHQnKQogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHJlY29yZF9wYXRoKToKICAgICAgICAgICAgZm9yIHBhdGgsIF8sIF8gaW4gc2VsZi5saXN0X2luc3RhbGxlZF9maWxlcygpOgogICAgICAgICAgICAgICAgaWYgcGF0aCA9PSByZWNvcmRfcGF0aDoKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHBhdGgpOgogICAgICAgICAgICAgICAgICAgIG1pc21hdGNoZXMuYXBwZW5kKChwYXRoLCAnZXhpc3RzJywgVHJ1ZSwgRmFsc2UpKQogICAgICAgIHJldHVybiBtaXNtYXRjaGVzCgogICAgZGVmIGxpc3RfaW5zdGFsbGVkX2ZpbGVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEl0ZXJhdGVzIG92ZXIgdGhlIGBgaW5zdGFsbGVkLWZpbGVzLnR4dGBgIGVudHJpZXMgYW5kIHJldHVybnMgYSB0dXBsZQogICAgICAgIGBgKHBhdGgsIGhhc2gsIHNpemUpYGAgZm9yIGVhY2ggbGluZS4KCiAgICAgICAgOnJldHVybnM6IGEgbGlzdCBvZiAocGF0aCwgaGFzaCwgc2l6ZSkKICAgICAgICAiIiIKCiAgICAgICAgZGVmIF9tZDUocGF0aCk6CiAgICAgICAgICAgIGYgPSBvcGVuKHBhdGgsICdyYicpCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBmLnJlYWQoKQogICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgICAgIHJldHVybiBoYXNobGliLm1kNShjb250ZW50KS5oZXhkaWdlc3QoKQoKICAgICAgICBkZWYgX3NpemUocGF0aCk6CiAgICAgICAgICAgIHJldHVybiBvcy5zdGF0KHBhdGgpLnN0X3NpemUKCiAgICAgICAgcmVjb3JkX3BhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5wYXRoLCAnaW5zdGFsbGVkLWZpbGVzLnR4dCcpCiAgICAgICAgcmVzdWx0ID0gW10KICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhyZWNvcmRfcGF0aCk6CiAgICAgICAgICAgIHdpdGggY29kZWNzLm9wZW4ocmVjb3JkX3BhdGgsICdyJywgZW5jb2Rpbmc9J3V0Zi04JykgYXMgZjoKICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIGY6CiAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQogICAgICAgICAgICAgICAgICAgIHAgPSBvcy5wYXRoLm5vcm1wYXRoKG9zLnBhdGguam9pbihzZWxmLnBhdGgsIGxpbmUpKQogICAgICAgICAgICAgICAgICAgICMgIi4vIiBpcyBwcmVzZW50IGFzIGEgbWFya2VyIGJldHdlZW4gaW5zdGFsbGVkIGZpbGVzCiAgICAgICAgICAgICAgICAgICAgIyBhbmQgaW5zdGFsbGF0aW9uIG1ldGFkYXRhIGZpbGVzCiAgICAgICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHApOgogICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygnTm9uLWV4aXN0ZW50IGZpbGU6ICVzJywgcCkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgcC5lbmRzd2l0aCgoJy5weWMnLCAnLnB5bycpKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgICAgICNvdGhlcndpc2UgZmFsbCB0aHJvdWdoIGFuZCBmYWlsCiAgICAgICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIocCk6CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoKHAsIF9tZDUocCksIF9zaXplKHApKSkKICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgocmVjb3JkX3BhdGgsIE5vbmUsIE5vbmUpKQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgbGlzdF9kaXN0aW5mb19maWxlcyhzZWxmLCBhYnNvbHV0ZT1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgSXRlcmF0ZXMgb3ZlciB0aGUgYGBpbnN0YWxsZWQtZmlsZXMudHh0YGAgZW50cmllcyBhbmQgcmV0dXJucyBwYXRocyBmb3IKICAgICAgICBlYWNoIGxpbmUgaWYgdGhlIHBhdGggaXMgcG9pbnRpbmcgdG8gYSBmaWxlIGxvY2F0ZWQgaW4gdGhlCiAgICAgICAgYGAuZWdnLWluZm9gYCBkaXJlY3Rvcnkgb3Igb25lIG9mIGl0cyBzdWJkaXJlY3Rvcmllcy4KCiAgICAgICAgOnBhcmFtZXRlciBhYnNvbHV0ZTogSWYgKmFic29sdXRlKiBpcyBgYFRydWVgYCwgZWFjaCByZXR1cm5lZCBwYXRoIGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtZWQgaW50byBhIGxvY2FsIGFic29sdXRlIHBhdGguIE90aGVyd2lzZSB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICByYXcgdmFsdWUgZnJvbSBgYGluc3RhbGxlZC1maWxlcy50eHRgYCBpcyByZXR1cm5lZC4KICAgICAgICA6dHlwZSBhYnNvbHV0ZTogYm9vbGVhbgogICAgICAgIDpyZXR1cm5zOiBpdGVyYXRvciBvZiBwYXRocwogICAgICAgICIiIgogICAgICAgIHJlY29yZF9wYXRoID0gb3MucGF0aC5qb2luKHNlbGYucGF0aCwgJ2luc3RhbGxlZC1maWxlcy50eHQnKQogICAgICAgIHNraXAgPSBUcnVlCiAgICAgICAgd2l0aCBjb2RlY3Mub3BlbihyZWNvcmRfcGF0aCwgJ3InLCBlbmNvZGluZz0ndXRmLTgnKSBhcyBmOgogICAgICAgICAgICBmb3IgbGluZSBpbiBmOgogICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQogICAgICAgICAgICAgICAgaWYgbGluZSA9PSAnLi8nOgogICAgICAgICAgICAgICAgICAgIHNraXAgPSBGYWxzZQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBpZiBub3Qgc2tpcDoKICAgICAgICAgICAgICAgICAgICBwID0gb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLmpvaW4oc2VsZi5wYXRoLCBsaW5lKSkKICAgICAgICAgICAgICAgICAgICBpZiBwLnN0YXJ0c3dpdGgoc2VsZi5wYXRoKToKICAgICAgICAgICAgICAgICAgICAgICAgaWYgYWJzb2x1dGU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBwCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBsaW5lCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIChpc2luc3RhbmNlKG90aGVyLCBFZ2dJbmZvRGlzdHJpYnV0aW9uKSBhbmQKICAgICAgICAgICAgICAgIHNlbGYucGF0aCA9PSBvdGhlci5wYXRoKQoKICAgICMgU2VlIGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvcmVmZXJlbmNlL2RhdGFtb2RlbCNvYmplY3QuX19oYXNoX18KICAgIF9faGFzaF9fID0gb2JqZWN0Ll9faGFzaF9fCgpuZXdfZGlzdF9jbGFzcyA9IEluc3RhbGxlZERpc3RyaWJ1dGlvbgpvbGRfZGlzdF9jbGFzcyA9IEVnZ0luZm9EaXN0cmlidXRpb24KCgpjbGFzcyBEZXBlbmRlbmN5R3JhcGgob2JqZWN0KToKICAgICIiIgogICAgUmVwcmVzZW50cyBhIGRlcGVuZGVuY3kgZ3JhcGggYmV0d2VlbiBkaXN0cmlidXRpb25zLgoKICAgIFRoZSBkZXBlbmRlbmN5IHJlbGF0aW9uc2hpcHMgYXJlIHN0b3JlZCBpbiBhbiBgYGFkamFjZW5jeV9saXN0YGAgdGhhdCBtYXBzCiAgICBkaXN0cmlidXRpb25zIHRvIGEgbGlzdCBvZiBgYChvdGhlciwgbGFiZWwpYGAgdHVwbGVzIHdoZXJlICBgYG90aGVyYGAKICAgIGlzIGEgZGlzdHJpYnV0aW9uIGFuZCB0aGUgZWRnZSBpcyBsYWJlbGVkIHdpdGggYGBsYWJlbGBgIChpLmUuIHRoZSB2ZXJzaW9uCiAgICBzcGVjaWZpZXIsIGlmIHN1Y2ggd2FzIHByb3ZpZGVkKS4gQWxzbywgZm9yIG1vcmUgZWZmaWNpZW50IHRyYXZlcnNhbCwgZm9yCiAgICBldmVyeSBkaXN0cmlidXRpb24gYGB4YGAsIGEgbGlzdCBvZiBwcmVkZWNlc3NvcnMgaXMga2VwdCBpbgogICAgYGByZXZlcnNlX2xpc3RbeF1gYC4gQW4gZWRnZSBmcm9tIGRpc3RyaWJ1dGlvbiBgYGFgYCB0bwogICAgZGlzdHJpYnV0aW9uIGBgYmBgIG1lYW5zIHRoYXQgYGBhYGAgZGVwZW5kcyBvbiBgYGJgYC4gSWYgYW55IG1pc3NpbmcKICAgIGRlcGVuZGVuY2llcyBhcmUgZm91bmQsIHRoZXkgYXJlIHN0b3JlZCBpbiBgYG1pc3NpbmdgYCwgd2hpY2ggaXMgYQogICAgZGljdGlvbmFyeSB0aGF0IG1hcHMgZGlzdHJpYnV0aW9ucyB0byBhIGxpc3Qgb2YgcmVxdWlyZW1lbnRzIHRoYXQgd2VyZSBub3QKICAgIHByb3ZpZGVkIGJ5IGFueSBvdGhlciBkaXN0cmlidXRpb25zLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYuYWRqYWNlbmN5X2xpc3QgPSB7fQogICAgICAgIHNlbGYucmV2ZXJzZV9saXN0ID0ge30KICAgICAgICBzZWxmLm1pc3NpbmcgPSB7fQoKICAgIGRlZiBhZGRfZGlzdHJpYnV0aW9uKHNlbGYsIGRpc3RyaWJ1dGlvbik6CiAgICAgICAgIiIiQWRkIHRoZSAqZGlzdHJpYnV0aW9uKiB0byB0aGUgZ3JhcGguCgogICAgICAgIDp0eXBlIGRpc3RyaWJ1dGlvbjogOmNsYXNzOmBkaXN0dXRpbHMyLmRhdGFiYXNlLkluc3RhbGxlZERpc3RyaWJ1dGlvbmAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIDpjbGFzczpgZGlzdHV0aWxzMi5kYXRhYmFzZS5FZ2dJbmZvRGlzdHJpYnV0aW9uYAogICAgICAgICIiIgogICAgICAgIHNlbGYuYWRqYWNlbmN5X2xpc3RbZGlzdHJpYnV0aW9uXSA9IFtdCiAgICAgICAgc2VsZi5yZXZlcnNlX2xpc3RbZGlzdHJpYnV0aW9uXSA9IFtdCiAgICAgICAgI3NlbGYubWlzc2luZ1tkaXN0cmlidXRpb25dID0gW10KCiAgICBkZWYgYWRkX2VkZ2Uoc2VsZiwgeCwgeSwgbGFiZWw9Tm9uZSk6CiAgICAgICAgIiIiQWRkIGFuIGVkZ2UgZnJvbSBkaXN0cmlidXRpb24gKngqIHRvIGRpc3RyaWJ1dGlvbiAqeSogd2l0aCB0aGUgZ2l2ZW4KICAgICAgICAqbGFiZWwqLgoKICAgICAgICA6dHlwZSB4OiA6Y2xhc3M6YGRpc3R1dGlsczIuZGF0YWJhc2UuSW5zdGFsbGVkRGlzdHJpYnV0aW9uYCBvcgogICAgICAgICAgICAgICAgIDpjbGFzczpgZGlzdHV0aWxzMi5kYXRhYmFzZS5FZ2dJbmZvRGlzdHJpYnV0aW9uYAogICAgICAgIDp0eXBlIHk6IDpjbGFzczpgZGlzdHV0aWxzMi5kYXRhYmFzZS5JbnN0YWxsZWREaXN0cmlidXRpb25gIG9yCiAgICAgICAgICAgICAgICAgOmNsYXNzOmBkaXN0dXRpbHMyLmRhdGFiYXNlLkVnZ0luZm9EaXN0cmlidXRpb25gCiAgICAgICAgOnR5cGUgbGFiZWw6IGBgc3RyYGAgb3IgYGBOb25lYGAKICAgICAgICAiIiIKICAgICAgICBzZWxmLmFkamFjZW5jeV9saXN0W3hdLmFwcGVuZCgoeSwgbGFiZWwpKQogICAgICAgICMgbXVsdGlwbGUgZWRnZXMgYXJlIGFsbG93ZWQsIHNvIGJlIGNhcmVmdWwKICAgICAgICBpZiB4IG5vdCBpbiBzZWxmLnJldmVyc2VfbGlzdFt5XToKICAgICAgICAgICAgc2VsZi5yZXZlcnNlX2xpc3RbeV0uYXBwZW5kKHgpCgogICAgZGVmIGFkZF9taXNzaW5nKHNlbGYsIGRpc3RyaWJ1dGlvbiwgcmVxdWlyZW1lbnQpOgogICAgICAgICIiIgogICAgICAgIEFkZCBhIG1pc3NpbmcgKnJlcXVpcmVtZW50KiBmb3IgdGhlIGdpdmVuICpkaXN0cmlidXRpb24qLgoKICAgICAgICA6dHlwZSBkaXN0cmlidXRpb246IDpjbGFzczpgZGlzdHV0aWxzMi5kYXRhYmFzZS5JbnN0YWxsZWREaXN0cmlidXRpb25gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciA6Y2xhc3M6YGRpc3R1dGlsczIuZGF0YWJhc2UuRWdnSW5mb0Rpc3RyaWJ1dGlvbmAKICAgICAgICA6dHlwZSByZXF1aXJlbWVudDogYGBzdHJgYAogICAgICAgICIiIgogICAgICAgIGxvZ2dlci5kZWJ1ZygnJXMgbWlzc2luZyAlcicsIGRpc3RyaWJ1dGlvbiwgcmVxdWlyZW1lbnQpCiAgICAgICAgc2VsZi5taXNzaW5nLnNldGRlZmF1bHQoZGlzdHJpYnV0aW9uLCBbXSkuYXBwZW5kKHJlcXVpcmVtZW50KQoKICAgIGRlZiBfcmVwcl9kaXN0KHNlbGYsIGRpc3QpOgogICAgICAgIHJldHVybiAnJXMgJXMnICUgKGRpc3QubmFtZSwgZGlzdC52ZXJzaW9uKQoKICAgIGRlZiByZXByX25vZGUoc2VsZiwgZGlzdCwgbGV2ZWw9MSk6CiAgICAgICAgIiIiUHJpbnRzIG9ubHkgYSBzdWJncmFwaCIiIgogICAgICAgIG91dHB1dCA9IFtzZWxmLl9yZXByX2Rpc3QoZGlzdCldCiAgICAgICAgZm9yIG90aGVyLCBsYWJlbCBpbiBzZWxmLmFkamFjZW5jeV9saXN0W2Rpc3RdOgogICAgICAgICAgICBkaXN0ID0gc2VsZi5fcmVwcl9kaXN0KG90aGVyKQogICAgICAgICAgICBpZiBsYWJlbCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIGRpc3QgPSAnJXMgWyVzXScgJSAoZGlzdCwgbGFiZWwpCiAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoJyAgICAnICogbGV2ZWwgKyBzdHIoZGlzdCkpCiAgICAgICAgICAgIHN1Ym91dHB1dCA9IHNlbGYucmVwcl9ub2RlKG90aGVyLCBsZXZlbCArIDEpCiAgICAgICAgICAgIHN1YnMgPSBzdWJvdXRwdXQuc3BsaXQoJ1xuJykKICAgICAgICAgICAgb3V0cHV0LmV4dGVuZChzdWJzWzE6XSkKICAgICAgICByZXR1cm4gJ1xuJy5qb2luKG91dHB1dCkKCiAgICBkZWYgdG9fZG90KHNlbGYsIGYsIHNraXBfZGlzY29ubmVjdGVkPVRydWUpOgogICAgICAgICIiIldyaXRlcyBhIERPVCBvdXRwdXQgZm9yIHRoZSBncmFwaCB0byB0aGUgcHJvdmlkZWQgZmlsZSAqZiouCgogICAgICAgIElmICpza2lwX2Rpc2Nvbm5lY3RlZCogaXMgc2V0IHRvIGBgVHJ1ZWBgLCB0aGVuIGFsbCBkaXN0cmlidXRpb25zCiAgICAgICAgdGhhdCBhcmUgbm90IGRlcGVuZGVudCBvbiBhbnkgb3RoZXIgZGlzdHJpYnV0aW9uIGFyZSBza2lwcGVkLgoKICAgICAgICA6dHlwZSBmOiBoYXMgdG8gc3VwcG9ydCBgYGZpbGVgYC1saWtlIG9wZXJhdGlvbnMKICAgICAgICA6dHlwZSBza2lwX2Rpc2Nvbm5lY3RlZDogYGBib29sYGAKICAgICAgICAiIiIKICAgICAgICBkaXNjb25uZWN0ZWQgPSBbXQoKICAgICAgICBmLndyaXRlKCJkaWdyYXBoIGRlcGVuZGVuY2llcyB7XG4iKQogICAgICAgIGZvciBkaXN0LCBhZGpzIGluIHNlbGYuYWRqYWNlbmN5X2xpc3QuaXRlbXMoKToKICAgICAgICAgICAgaWYgbGVuKGFkanMpID09IDAgYW5kIG5vdCBza2lwX2Rpc2Nvbm5lY3RlZDoKICAgICAgICAgICAgICAgIGRpc2Nvbm5lY3RlZC5hcHBlbmQoZGlzdCkKICAgICAgICAgICAgZm9yIG90aGVyLCBsYWJlbCBpbiBhZGpzOgogICAgICAgICAgICAgICAgaWYgbm90IGxhYmVsIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgZi53cml0ZSgnIiVzIiAtPiAiJXMiIFtsYWJlbD0iJXMiXVxuJyAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGlzdC5uYW1lLCBvdGhlci5uYW1lLCBsYWJlbCkpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGYud3JpdGUoJyIlcyIgLT4gIiVzIlxuJyAlIChkaXN0Lm5hbWUsIG90aGVyLm5hbWUpKQogICAgICAgIGlmIG5vdCBza2lwX2Rpc2Nvbm5lY3RlZCBhbmQgbGVuKGRpc2Nvbm5lY3RlZCkgPiAwOgogICAgICAgICAgICBmLndyaXRlKCdzdWJncmFwaCBkaXNjb25uZWN0ZWQge1xuJykKICAgICAgICAgICAgZi53cml0ZSgnbGFiZWwgPSAiRGlzY29ubmVjdGVkIlxuJykKICAgICAgICAgICAgZi53cml0ZSgnYmdjb2xvciA9IHJlZFxuJykKCiAgICAgICAgICAgIGZvciBkaXN0IGluIGRpc2Nvbm5lY3RlZDoKICAgICAgICAgICAgICAgIGYud3JpdGUoJyIlcyInICUgZGlzdC5uYW1lKQogICAgICAgICAgICAgICAgZi53cml0ZSgnXG4nKQogICAgICAgICAgICBmLndyaXRlKCd9XG4nKQogICAgICAgIGYud3JpdGUoJ31cbicpCgogICAgZGVmIHRvcG9sb2dpY2FsX3NvcnQoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUGVyZm9ybSBhIHRvcG9sb2dpY2FsIHNvcnQgb2YgdGhlIGdyYXBoLgogICAgICAgIDpyZXR1cm46IEEgdHVwbGUsIHRoZSBmaXJzdCBlbGVtZW50IG9mIHdoaWNoIGlzIGEgdG9wb2xvZ2ljYWxseSBzb3J0ZWQKICAgICAgICAgICAgICAgICBsaXN0IG9mIGRpc3RyaWJ1dGlvbnMsIGFuZCB0aGUgc2Vjb25kIGVsZW1lbnQgb2Ygd2hpY2ggaXMgYQogICAgICAgICAgICAgICAgIGxpc3Qgb2YgZGlzdHJpYnV0aW9ucyB0aGF0IGNhbm5vdCBiZSBzb3J0ZWQgYmVjYXVzZSB0aGV5IGhhdmUKICAgICAgICAgICAgICAgICBjaXJjdWxhciBkZXBlbmRlbmNpZXMgYW5kIHNvIGZvcm0gYSBjeWNsZS4KICAgICAgICAiIiIKICAgICAgICByZXN1bHQgPSBbXQogICAgICAgICMgTWFrZSBhIHNoYWxsb3cgY29weSBvZiB0aGUgYWRqYWNlbmN5IGxpc3QKICAgICAgICBhbGlzdCA9IHt9CiAgICAgICAgZm9yIGssIHYgaW4gc2VsZi5hZGphY2VuY3lfbGlzdC5pdGVtcygpOgogICAgICAgICAgICBhbGlzdFtrXSA9IHZbOl0KICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAjIFNlZSB3aGF0IHdlIGNhbiByZW1vdmUgaW4gdGhpcyBydW4KICAgICAgICAgICAgdG9fcmVtb3ZlID0gW10KICAgICAgICAgICAgZm9yIGssIHYgaW4gbGlzdChhbGlzdC5pdGVtcygpKVs6XToKICAgICAgICAgICAgICAgIGlmIG5vdCB2OgogICAgICAgICAgICAgICAgICAgIHRvX3JlbW92ZS5hcHBlbmQoaykKICAgICAgICAgICAgICAgICAgICBkZWwgYWxpc3Rba10KICAgICAgICAgICAgaWYgbm90IHRvX3JlbW92ZToKICAgICAgICAgICAgICAgICMgV2hhdCdzIGxlZnQgaW4gYWxpc3QgKGlmIGFueXRoaW5nKSBpcyBhIGN5Y2xlLgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgIyBSZW1vdmUgZnJvbSB0aGUgYWRqYWNlbmN5IGxpc3Qgb2Ygb3RoZXJzCiAgICAgICAgICAgIGZvciBrLCB2IGluIGFsaXN0Lml0ZW1zKCk6CiAgICAgICAgICAgICAgICBhbGlzdFtrXSA9IFsoZCwgcikgZm9yIGQsIHIgaW4gdiBpZiBkIG5vdCBpbiB0b19yZW1vdmVdCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnTW92aW5nIHRvIHJlc3VsdDogJXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgWyclcyAoJXMpJyAlIChkLm5hbWUsIGQudmVyc2lvbikgZm9yIGQgaW4gdG9fcmVtb3ZlXSkKICAgICAgICAgICAgcmVzdWx0LmV4dGVuZCh0b19yZW1vdmUpCiAgICAgICAgcmV0dXJuIHJlc3VsdCwgbGlzdChhbGlzdC5rZXlzKCkpCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgICIiIlJlcHJlc2VudGF0aW9uIG9mIHRoZSBncmFwaCIiIgogICAgICAgIG91dHB1dCA9IFtdCiAgICAgICAgZm9yIGRpc3QsIGFkanMgaW4gc2VsZi5hZGphY2VuY3lfbGlzdC5pdGVtcygpOgogICAgICAgICAgICBvdXRwdXQuYXBwZW5kKHNlbGYucmVwcl9ub2RlKGRpc3QpKQogICAgICAgIHJldHVybiAnXG4nLmpvaW4ob3V0cHV0KQoKCmRlZiBtYWtlX2dyYXBoKGRpc3RzLCBzY2hlbWU9J2RlZmF1bHQnKToKICAgICIiIk1ha2VzIGEgZGVwZW5kZW5jeSBncmFwaCBmcm9tIHRoZSBnaXZlbiBkaXN0cmlidXRpb25zLgoKICAgIDpwYXJhbWV0ZXIgZGlzdHM6IGEgbGlzdCBvZiBkaXN0cmlidXRpb25zCiAgICA6dHlwZSBkaXN0czogbGlzdCBvZiA6Y2xhc3M6YGRpc3R1dGlsczIuZGF0YWJhc2UuSW5zdGFsbGVkRGlzdHJpYnV0aW9uYCBhbmQKICAgICAgICAgICAgICAgICA6Y2xhc3M6YGRpc3R1dGlsczIuZGF0YWJhc2UuRWdnSW5mb0Rpc3RyaWJ1dGlvbmAgaW5zdGFuY2VzCiAgICA6cnR5cGU6IGEgOmNsYXNzOmBEZXBlbmRlbmN5R3JhcGhgIGluc3RhbmNlCiAgICAiIiIKICAgIHNjaGVtZSA9IGdldF9zY2hlbWUoc2NoZW1lKQogICAgZ3JhcGggPSBEZXBlbmRlbmN5R3JhcGgoKQogICAgcHJvdmlkZWQgPSB7fSAgIyBtYXBzIG5hbWVzIHRvIGxpc3RzIG9mICh2ZXJzaW9uLCBkaXN0KSB0dXBsZXMKCiAgICAjIGZpcnN0LCBidWlsZCB0aGUgZ3JhcGggYW5kIGZpbmQgb3V0IHdoYXQncyBwcm92aWRlZAogICAgZm9yIGRpc3QgaW4gZGlzdHM6CiAgICAgICAgZ3JhcGguYWRkX2Rpc3RyaWJ1dGlvbihkaXN0KQoKICAgICAgICBmb3IgcCBpbiBkaXN0LnByb3ZpZGVzOgogICAgICAgICAgICBuYW1lLCB2ZXJzaW9uID0gcGFyc2VfbmFtZV9hbmRfdmVyc2lvbihwKQogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0FkZCB0byBwcm92aWRlZDogJXMsICVzLCAlcycsIG5hbWUsIHZlcnNpb24sIGRpc3QpCiAgICAgICAgICAgIHByb3ZpZGVkLnNldGRlZmF1bHQobmFtZSwgW10pLmFwcGVuZCgodmVyc2lvbiwgZGlzdCkpCgogICAgIyBub3cgbWFrZSB0aGUgZWRnZXMKICAgIGZvciBkaXN0IGluIGRpc3RzOgogICAgICAgIHJlcXVpcmVzID0gKGRpc3QucnVuX3JlcXVpcmVzIHwgZGlzdC5tZXRhX3JlcXVpcmVzIHwKICAgICAgICAgICAgICAgICAgICBkaXN0LmJ1aWxkX3JlcXVpcmVzIHwgZGlzdC5kZXZfcmVxdWlyZXMpCiAgICAgICAgZm9yIHJlcSBpbiByZXF1aXJlczoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgbWF0Y2hlciA9IHNjaGVtZS5tYXRjaGVyKHJlcSkKICAgICAgICAgICAgZXhjZXB0IFVuc3VwcG9ydGVkVmVyc2lvbkVycm9yOgogICAgICAgICAgICAgICAgIyBYWFggY29tcGF0LW1vZGUgaWYgY2Fubm90IHJlYWQgdGhlIHZlcnNpb24KICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdjb3VsZCBub3QgcmVhZCB2ZXJzaW9uICVyIC0gdXNpbmcgbmFtZSBvbmx5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcSkKICAgICAgICAgICAgICAgIG5hbWUgPSByZXEuc3BsaXQoKVswXQogICAgICAgICAgICAgICAgbWF0Y2hlciA9IHNjaGVtZS5tYXRjaGVyKG5hbWUpCgogICAgICAgICAgICBuYW1lID0gbWF0Y2hlci5rZXkgICAjIGNhc2UtaW5zZW5zaXRpdmUKCiAgICAgICAgICAgIG1hdGNoZWQgPSBGYWxzZQogICAgICAgICAgICBpZiBuYW1lIGluIHByb3ZpZGVkOgogICAgICAgICAgICAgICAgZm9yIHZlcnNpb24sIHByb3ZpZGVyIGluIHByb3ZpZGVkW25hbWVdOgogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSBtYXRjaGVyLm1hdGNoKHZlcnNpb24pCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFVuc3VwcG9ydGVkVmVyc2lvbkVycm9yOgogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IEZhbHNlCgogICAgICAgICAgICAgICAgICAgIGlmIG1hdGNoOgogICAgICAgICAgICAgICAgICAgICAgICBncmFwaC5hZGRfZWRnZShkaXN0LCBwcm92aWRlciwgcmVxKQogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVkID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBpZiBub3QgbWF0Y2hlZDoKICAgICAgICAgICAgICAgIGdyYXBoLmFkZF9taXNzaW5nKGRpc3QsIHJlcSkKICAgIHJldHVybiBncmFwaAoKCmRlZiBnZXRfZGVwZW5kZW50X2Rpc3RzKGRpc3RzLCBkaXN0KToKICAgICIiIlJlY3Vyc2l2ZWx5IGdlbmVyYXRlIGEgbGlzdCBvZiBkaXN0cmlidXRpb25zIGZyb20gKmRpc3RzKiB0aGF0IGFyZQogICAgZGVwZW5kZW50IG9uICpkaXN0Ki4KCiAgICA6cGFyYW0gZGlzdHM6IGEgbGlzdCBvZiBkaXN0cmlidXRpb25zCiAgICA6cGFyYW0gZGlzdDogYSBkaXN0cmlidXRpb24sIG1lbWJlciBvZiAqZGlzdHMqIGZvciB3aGljaCB3ZSBhcmUgaW50ZXJlc3RlZAogICAgIiIiCiAgICBpZiBkaXN0IG5vdCBpbiBkaXN0czoKICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdnaXZlbiBkaXN0cmlidXRpb24gJXIgaXMgbm90IGEgbWVtYmVyICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvZiB0aGUgbGlzdCcgJSBkaXN0Lm5hbWUpCiAgICBncmFwaCA9IG1ha2VfZ3JhcGgoZGlzdHMpCgogICAgZGVwID0gW2Rpc3RdICAjIGRlcGVuZGVudCBkaXN0cmlidXRpb25zCiAgICB0b2RvID0gZ3JhcGgucmV2ZXJzZV9saXN0W2Rpc3RdICAjIGxpc3Qgb2Ygbm9kZXMgd2Ugc2hvdWxkIGluc3BlY3QKCiAgICB3aGlsZSB0b2RvOgogICAgICAgIGQgPSB0b2RvLnBvcCgpCiAgICAgICAgZGVwLmFwcGVuZChkKQogICAgICAgIGZvciBzdWNjIGluIGdyYXBoLnJldmVyc2VfbGlzdFtkXToKICAgICAgICAgICAgaWYgc3VjYyBub3QgaW4gZGVwOgogICAgICAgICAgICAgICAgdG9kby5hcHBlbmQoc3VjYykKCiAgICBkZXAucG9wKDApICAjIHJlbW92ZSBkaXN0IGZyb20gZGVwLCB3YXMgdGhlcmUgdG8gcHJldmVudCBpbmZpbml0ZSBsb29wcwogICAgcmV0dXJuIGRlcAoKCmRlZiBnZXRfcmVxdWlyZWRfZGlzdHMoZGlzdHMsIGRpc3QpOgogICAgIiIiUmVjdXJzaXZlbHkgZ2VuZXJhdGUgYSBsaXN0IG9mIGRpc3RyaWJ1dGlvbnMgZnJvbSAqZGlzdHMqIHRoYXQgYXJlCiAgICByZXF1aXJlZCBieSAqZGlzdCouCgogICAgOnBhcmFtIGRpc3RzOiBhIGxpc3Qgb2YgZGlzdHJpYnV0aW9ucwogICAgOnBhcmFtIGRpc3Q6IGEgZGlzdHJpYnV0aW9uLCBtZW1iZXIgb2YgKmRpc3RzKiBmb3Igd2hpY2ggd2UgYXJlIGludGVyZXN0ZWQKICAgICIiIgogICAgaWYgZGlzdCBub3QgaW4gZGlzdHM6CiAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbignZ2l2ZW4gZGlzdHJpYnV0aW9uICVyIGlzIG5vdCBhIG1lbWJlciAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb2YgdGhlIGxpc3QnICUgZGlzdC5uYW1lKQogICAgZ3JhcGggPSBtYWtlX2dyYXBoKGRpc3RzKQoKICAgIHJlcSA9IFtdICAjIHJlcXVpcmVkIGRpc3RyaWJ1dGlvbnMKICAgIHRvZG8gPSBncmFwaC5hZGphY2VuY3lfbGlzdFtkaXN0XSAgIyBsaXN0IG9mIG5vZGVzIHdlIHNob3VsZCBpbnNwZWN0CgogICAgd2hpbGUgdG9kbzoKICAgICAgICBkID0gdG9kby5wb3AoKVswXQogICAgICAgIHJlcS5hcHBlbmQoZCkKICAgICAgICBmb3IgcHJlZCBpbiBncmFwaC5hZGphY2VuY3lfbGlzdFtkXToKICAgICAgICAgICAgaWYgcHJlZCBub3QgaW4gcmVxOgogICAgICAgICAgICAgICAgdG9kby5hcHBlbmQocHJlZCkKCiAgICByZXR1cm4gcmVxCgoKZGVmIG1ha2VfZGlzdChuYW1lLCB2ZXJzaW9uLCAqKmt3YXJncyk6CiAgICAiIiIKICAgIEEgY29udmVuaWVuY2UgbWV0aG9kIGZvciBtYWtpbmcgYSBkaXN0IGdpdmVuIGp1c3QgYSBuYW1lIGFuZCB2ZXJzaW9uLgogICAgIiIiCiAgICBzdW1tYXJ5ID0ga3dhcmdzLnBvcCgnc3VtbWFyeScsICdQbGFjZWhvbGRlciBmb3Igc3VtbWFyeScpCiAgICBtZCA9IE1ldGFkYXRhKCoqa3dhcmdzKQogICAgbWQubmFtZSA9IG5hbWUKICAgIG1kLnZlcnNpb24gPSB2ZXJzaW9uCiAgICBtZC5zdW1tYXJ5ID0gc3VtbWFyeSBvciAnUGxhY2Vob2xkZXIgZm9yIHN1bW1hcnknCiAgICByZXR1cm4gRGlzdHJpYnV0aW9uKG1kKQpQSwMEFAAAAAAAAAAhAIM44i1dUgAAXVIAACwAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi9pbmRleC5weSMgLSotIGNvZGluZzogdXRmLTggLSotCiMKIyBDb3B5cmlnaHQgKEMpIDIwMTMgVmluYXkgU2FqaXAuCiMgTGljZW5zZWQgdG8gdGhlIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uIHVuZGVyIGEgY29udHJpYnV0b3IgYWdyZWVtZW50LgojIFNlZSBMSUNFTlNFLnR4dCBhbmQgQ09OVFJJQlVUT1JTLnR4dC4KIwppbXBvcnQgaGFzaGxpYgppbXBvcnQgbG9nZ2luZwppbXBvcnQgb3MKaW1wb3J0IHNodXRpbAppbXBvcnQgc3VicHJvY2VzcwppbXBvcnQgdGVtcGZpbGUKdHJ5OgogICAgZnJvbSB0aHJlYWRpbmcgaW1wb3J0IFRocmVhZApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBmcm9tIGR1bW15X3RocmVhZGluZyBpbXBvcnQgVGhyZWFkCgpmcm9tIC4gaW1wb3J0IERpc3RsaWJFeGNlcHRpb24KZnJvbSAuY29tcGF0IGltcG9ydCAoSFRUUEJhc2ljQXV0aEhhbmRsZXIsIFJlcXVlc3QsIEhUVFBQYXNzd29yZE1nciwKICAgICAgICAgICAgICAgICAgICAgdXJscGFyc2UsIGJ1aWxkX29wZW5lciwgc3RyaW5nX3R5cGVzKQpmcm9tIC51dGlsIGltcG9ydCBjYWNoZWRfcHJvcGVydHksIHppcF9kaXIsIFNlcnZlclByb3h5Cgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCkRFRkFVTFRfSU5ERVggPSAnaHR0cHM6Ly9weXBpLnB5dGhvbi5vcmcvcHlwaScKREVGQVVMVF9SRUFMTSA9ICdweXBpJwoKY2xhc3MgUGFja2FnZUluZGV4KG9iamVjdCk6CiAgICAiIiIKICAgIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHBhY2thZ2UgaW5kZXggY29tcGF0aWJsZSB3aXRoIFB5UEksIHRoZSBQeXRob24KICAgIFBhY2thZ2UgSW5kZXguCiAgICAiIiIKCiAgICBib3VuZGFyeSA9IGInLS0tLS0tLS0tLVRoSXNfSXNfdEhlX2Rpc3RsaWJfaW5kZXhfYm91TmRhUllfJCcKCiAgICBkZWYgX19pbml0X18oc2VsZiwgdXJsPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIEluaXRpYWxpc2UgYW4gaW5zdGFuY2UuCgogICAgICAgIDpwYXJhbSB1cmw6IFRoZSBVUkwgb2YgdGhlIGluZGV4LiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgVVJMIGZvciBQeVBJIGlzCiAgICAgICAgICAgICAgICAgICAgdXNlZC4KICAgICAgICAiIiIKICAgICAgICBzZWxmLnVybCA9IHVybCBvciBERUZBVUxUX0lOREVYCiAgICAgICAgc2VsZi5yZWFkX2NvbmZpZ3VyYXRpb24oKQogICAgICAgIHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBwYXJhbXMsIHF1ZXJ5LCBmcmFnID0gdXJscGFyc2Uoc2VsZi51cmwpCiAgICAgICAgaWYgcGFyYW1zIG9yIHF1ZXJ5IG9yIGZyYWcgb3Igc2NoZW1lIG5vdCBpbiAoJ2h0dHAnLCAnaHR0cHMnKToKICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbignaW52YWxpZCByZXBvc2l0b3J5OiAlcycgJSBzZWxmLnVybCkKICAgICAgICBzZWxmLnBhc3N3b3JkX2hhbmRsZXIgPSBOb25lCiAgICAgICAgc2VsZi5zc2xfdmVyaWZpZXIgPSBOb25lCiAgICAgICAgc2VsZi5ncGcgPSBOb25lCiAgICAgICAgc2VsZi5ncGdfaG9tZSA9IE5vbmUKICAgICAgICBzZWxmLnJwY19wcm94eSA9IE5vbmUKICAgICAgICB3aXRoIG9wZW4ob3MuZGV2bnVsbCwgJ3cnKSBhcyBzaW5rOgogICAgICAgICAgICAjIFVzZSBncGcgYnkgZGVmYXVsdCByYXRoZXIgdGhhbiBncGcyLCBhcyBncGcyIGluc2lzdHMgb24KICAgICAgICAgICAgIyBwcm9tcHRpbmcgZm9yIHBhc3N3b3JkcwogICAgICAgICAgICBmb3IgcyBpbiAoJ2dwZycsICdncGcyJyk6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgcmMgPSBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoW3MsICctLXZlcnNpb24nXSwgc3Rkb3V0PXNpbmssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXNpbmspCiAgICAgICAgICAgICAgICAgICAgaWYgcmMgPT0gMDoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ncGcgPSBzCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICAgICAgICAgICAgICBwYXNzCgogICAgZGVmIF9nZXRfcHlwaXJjX2NvbW1hbmQoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgR2V0IHRoZSBkaXN0dXRpbHMgY29tbWFuZCBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBQeVBJIGNvbmZpZ3VyYXRpb25zLgogICAgICAgIDpyZXR1cm46IHRoZSBjb21tYW5kLgogICAgICAgICIiIgogICAgICAgIGZyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IERpc3RyaWJ1dGlvbgogICAgICAgIGZyb20gZGlzdHV0aWxzLmNvbmZpZyBpbXBvcnQgUHlQSVJDQ29tbWFuZAogICAgICAgIGQgPSBEaXN0cmlidXRpb24oKQogICAgICAgIHJldHVybiBQeVBJUkNDb21tYW5kKGQpCgogICAgZGVmIHJlYWRfY29uZmlndXJhdGlvbihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZWFkIHRoZSBQeVBJIGFjY2VzcyBjb25maWd1cmF0aW9uIGFzIHN1cHBvcnRlZCBieSBkaXN0dXRpbHMsIGdldHRpbmcKICAgICAgICBQeVBJIHRvIGRvIHRoZSBhY3R1YWwgd29yay4gVGhpcyBwb3B1bGF0ZXMgYGB1c2VybmFtZWBgLCBgYHBhc3N3b3JkYGAsCiAgICAgICAgYGByZWFsbWBgIGFuZCBgYHVybGBgIGF0dHJpYnV0ZXMgZnJvbSB0aGUgY29uZmlndXJhdGlvbi4KICAgICAgICAiIiIKICAgICAgICAjIGdldCBkaXN0dXRpbHMgdG8gZG8gdGhlIHdvcmsKICAgICAgICBjID0gc2VsZi5fZ2V0X3B5cGlyY19jb21tYW5kKCkKICAgICAgICBjLnJlcG9zaXRvcnkgPSBzZWxmLnVybAogICAgICAgIGNmZyA9IGMuX3JlYWRfcHlwaXJjKCkKICAgICAgICBzZWxmLnVzZXJuYW1lID0gY2ZnLmdldCgndXNlcm5hbWUnKQogICAgICAgIHNlbGYucGFzc3dvcmQgPSBjZmcuZ2V0KCdwYXNzd29yZCcpCiAgICAgICAgc2VsZi5yZWFsbSA9IGNmZy5nZXQoJ3JlYWxtJywgJ3B5cGknKQogICAgICAgIHNlbGYudXJsID0gY2ZnLmdldCgncmVwb3NpdG9yeScsIHNlbGYudXJsKQoKICAgIGRlZiBzYXZlX2NvbmZpZ3VyYXRpb24oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgU2F2ZSB0aGUgUHlQSSBhY2Nlc3MgY29uZmlndXJhdGlvbi4gWW91IG11c3QgaGF2ZSBzZXQgYGB1c2VybmFtZWBgIGFuZAogICAgICAgIGBgcGFzc3dvcmRgYCBhdHRyaWJ1dGVzIGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kLgoKICAgICAgICBBZ2FpbiwgZGlzdHV0aWxzIGlzIHVzZWQgdG8gZG8gdGhlIGFjdHVhbCB3b3JrLgogICAgICAgICIiIgogICAgICAgIHNlbGYuY2hlY2tfY3JlZGVudGlhbHMoKQogICAgICAgICMgZ2V0IGRpc3R1dGlscyB0byBkbyB0aGUgd29yawogICAgICAgIGMgPSBzZWxmLl9nZXRfcHlwaXJjX2NvbW1hbmQoKQogICAgICAgIGMuX3N0b3JlX3B5cGlyYyhzZWxmLnVzZXJuYW1lLCBzZWxmLnBhc3N3b3JkKQoKICAgIGRlZiBjaGVja19jcmVkZW50aWFscyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBDaGVjayB0aGF0IGBgdXNlcm5hbWVgYCBhbmQgYGBwYXNzd29yZGBgIGhhdmUgYmVlbiBzZXQsIGFuZCByYWlzZSBhbgogICAgICAgIGV4Y2VwdGlvbiBpZiBub3QuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi51c2VybmFtZSBpcyBOb25lIG9yIHNlbGYucGFzc3dvcmQgaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbigndXNlcm5hbWUgYW5kIHBhc3N3b3JkIG11c3QgYmUgc2V0JykKICAgICAgICBwbSA9IEhUVFBQYXNzd29yZE1ncigpCiAgICAgICAgXywgbmV0bG9jLCBfLCBfLCBfLCBfID0gdXJscGFyc2Uoc2VsZi51cmwpCiAgICAgICAgcG0uYWRkX3Bhc3N3b3JkKHNlbGYucmVhbG0sIG5ldGxvYywgc2VsZi51c2VybmFtZSwgc2VsZi5wYXNzd29yZCkKICAgICAgICBzZWxmLnBhc3N3b3JkX2hhbmRsZXIgPSBIVFRQQmFzaWNBdXRoSGFuZGxlcihwbSkKCiAgICBkZWYgcmVnaXN0ZXIoc2VsZiwgbWV0YWRhdGEpOgogICAgICAgICIiIgogICAgICAgIFJlZ2lzdGVyIGEgZGlzdHJpYnV0aW9uIG9uIFB5UEksIHVzaW5nIHRoZSBwcm92aWRlZCBtZXRhZGF0YS4KCiAgICAgICAgOnBhcmFtIG1ldGFkYXRhOiBBIDpjbGFzczpgTWV0YWRhdGFgIGluc3RhbmNlIGRlZmluaW5nIGF0IGxlYXN0IGEgbmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHZlcnNpb24gbnVtYmVyIGZvciB0aGUgZGlzdHJpYnV0aW9uIHRvIGJlCiAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlcmVkLgogICAgICAgIDpyZXR1cm46IFRoZSBIVFRQIHJlc3BvbnNlIHJlY2VpdmVkIGZyb20gUHlQSSB1cG9uIHN1Ym1pc3Npb24gb2YgdGhlCiAgICAgICAgICAgICAgICByZXF1ZXN0LgogICAgICAgICIiIgogICAgICAgIHNlbGYuY2hlY2tfY3JlZGVudGlhbHMoKQogICAgICAgIG1ldGFkYXRhLnZhbGlkYXRlKCkKICAgICAgICBkID0gbWV0YWRhdGEudG9kaWN0KCkKICAgICAgICBkWyc6YWN0aW9uJ10gPSAndmVyaWZ5JwogICAgICAgIHJlcXVlc3QgPSBzZWxmLmVuY29kZV9yZXF1ZXN0KGQuaXRlbXMoKSwgW10pCiAgICAgICAgcmVzcG9uc2UgPSBzZWxmLnNlbmRfcmVxdWVzdChyZXF1ZXN0KQogICAgICAgIGRbJzphY3Rpb24nXSA9ICdzdWJtaXQnCiAgICAgICAgcmVxdWVzdCA9IHNlbGYuZW5jb2RlX3JlcXVlc3QoZC5pdGVtcygpLCBbXSkKICAgICAgICByZXR1cm4gc2VsZi5zZW5kX3JlcXVlc3QocmVxdWVzdCkKCiAgICBkZWYgX3JlYWRlcihzZWxmLCBuYW1lLCBzdHJlYW0sIG91dGJ1Zik6CiAgICAgICAgIiIiCiAgICAgICAgVGhyZWFkIHJ1bm5lciBmb3IgcmVhZGluZyBsaW5lcyBvZiBmcm9tIGEgc3VicHJvY2VzcyBpbnRvIGEgYnVmZmVyLgoKICAgICAgICA6cGFyYW0gbmFtZTogVGhlIGxvZ2ljYWwgbmFtZSBvZiB0aGUgc3RyZWFtICh1c2VkIGZvciBsb2dnaW5nIG9ubHkpLgogICAgICAgIDpwYXJhbSBzdHJlYW06IFRoZSBzdHJlYW0gdG8gcmVhZCBmcm9tLiBUaGlzIHdpbGwgdHlwaWNhbGx5IGEgcGlwZQogICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RlZCB0byB0aGUgb3V0cHV0IHN0cmVhbSBvZiBhIHN1YnByb2Nlc3MuCiAgICAgICAgOnBhcmFtIG91dGJ1ZjogVGhlIGxpc3QgdG8gYXBwZW5kIHRoZSByZWFkIGxpbmVzIHRvLgogICAgICAgICIiIgogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIHMgPSBzdHJlYW0ucmVhZGxpbmUoKQogICAgICAgICAgICBpZiBub3QgczoKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIHMgPSBzLmRlY29kZSgndXRmLTgnKS5yc3RyaXAoKQogICAgICAgICAgICBvdXRidWYuYXBwZW5kKHMpCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnJXM6ICVzJyAlIChuYW1lLCBzKSkKICAgICAgICBzdHJlYW0uY2xvc2UoKQoKICAgIGRlZiBnZXRfc2lnbl9jb21tYW5kKHNlbGYsIGZpbGVuYW1lLCBzaWduZXIsIHNpZ25fcGFzc3dvcmQsCiAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzdG9yZT1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gYSBzdWl0YWJsZSBjb21tYW5kIGZvciBzaWduaW5nIGEgZmlsZS4KCiAgICAgICAgOnBhcmFtIGZpbGVuYW1lOiBUaGUgcGF0aG5hbWUgdG8gdGhlIGZpbGUgdG8gYmUgc2lnbmVkLgogICAgICAgIDpwYXJhbSBzaWduZXI6IFRoZSBpZGVudGlmaWVyIG9mIHRoZSBzaWduZXIgb2YgdGhlIGZpbGUuCiAgICAgICAgOnBhcmFtIHNpZ25fcGFzc3dvcmQ6IFRoZSBwYXNzcGhyYXNlIGZvciB0aGUgc2lnbmVyJ3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBrZXkgdXNlZCBmb3Igc2lnbmluZy4KICAgICAgICA6cGFyYW0ga2V5c3RvcmU6IFRoZSBwYXRoIHRvIGEgZGlyZWN0b3J5IHdoaWNoIGNvbnRhaW5zIHRoZSBrZXlzCiAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGluIHZlcmlmaWNhdGlvbi4gSWYgbm90IHNwZWNpZmllZCwgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSdzIGBgZ3BnX2hvbWVgYCBhdHRyaWJ1dGUgaXMgdXNlZCBpbnN0ZWFkLgogICAgICAgIDpyZXR1cm46IFRoZSBzaWduaW5nIGNvbW1hbmQgYXMgYSBsaXN0IHN1aXRhYmxlIHRvIGJlCiAgICAgICAgICAgICAgICAgcGFzc2VkIHRvIDpjbGFzczpgc3VicHJvY2Vzcy5Qb3BlbmAuCiAgICAgICAgIiIiCiAgICAgICAgY21kID0gW3NlbGYuZ3BnLCAnLS1zdGF0dXMtZmQnLCAnMicsICctLW5vLXR0eSddCiAgICAgICAgaWYga2V5c3RvcmUgaXMgTm9uZToKICAgICAgICAgICAga2V5c3RvcmUgPSBzZWxmLmdwZ19ob21lCiAgICAgICAgaWYga2V5c3RvcmU6CiAgICAgICAgICAgIGNtZC5leHRlbmQoWyctLWhvbWVkaXInLCBrZXlzdG9yZV0pCiAgICAgICAgaWYgc2lnbl9wYXNzd29yZCBpcyBub3QgTm9uZToKICAgICAgICAgICAgY21kLmV4dGVuZChbJy0tYmF0Y2gnLCAnLS1wYXNzcGhyYXNlLWZkJywgJzAnXSkKICAgICAgICB0ZCA9IHRlbXBmaWxlLm1rZHRlbXAoKQogICAgICAgIHNmID0gb3MucGF0aC5qb2luKHRkLCBvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKSArICcuYXNjJykKICAgICAgICBjbWQuZXh0ZW5kKFsnLS1kZXRhY2gtc2lnbicsICctLWFybW9yJywgJy0tbG9jYWwtdXNlcicsCiAgICAgICAgICAgICAgICAgICAgc2lnbmVyLCAnLS1vdXRwdXQnLCBzZiwgZmlsZW5hbWVdKQogICAgICAgIGxvZ2dlci5kZWJ1ZygnaW52b2tpbmc6ICVzJywgJyAnLmpvaW4oY21kKSkKICAgICAgICByZXR1cm4gY21kLCBzZgoKICAgIGRlZiBydW5fY29tbWFuZChzZWxmLCBjbWQsIGlucHV0X2RhdGE9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgUnVuIGEgY29tbWFuZCBpbiBhIGNoaWxkIHByb2Nlc3MgLCBwYXNzaW5nIGl0IGFueSBpbnB1dCBkYXRhIHNwZWNpZmllZC4KCiAgICAgICAgOnBhcmFtIGNtZDogVGhlIGNvbW1hbmQgdG8gcnVuLgogICAgICAgIDpwYXJhbSBpbnB1dF9kYXRhOiBJZiBzcGVjaWZpZWQsIHRoaXMgbXVzdCBiZSBhIGJ5dGUgc3RyaW5nIGNvbnRhaW5pbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSB0byBiZSBzZW50IHRvIHRoZSBjaGlsZCBwcm9jZXNzLgogICAgICAgIDpyZXR1cm46IEEgdHVwbGUgY29uc2lzdGluZyBvZiB0aGUgc3VicHJvY2VzcycgZXhpdCBjb2RlLCBhIGxpc3Qgb2YKICAgICAgICAgICAgICAgICBsaW5lcyByZWFkIGZyb20gdGhlIHN1YnByb2Nlc3MnIGBgc3Rkb3V0YGAsIGFuZCBhIGxpc3Qgb2YKICAgICAgICAgICAgICAgICBsaW5lcyByZWFkIGZyb20gdGhlIHN1YnByb2Nlc3MnIGBgc3RkZXJyYGAuCiAgICAgICAgIiIiCiAgICAgICAga3dhcmdzID0gewogICAgICAgICAgICAnc3Rkb3V0Jzogc3VicHJvY2Vzcy5QSVBFLAogICAgICAgICAgICAnc3RkZXJyJzogc3VicHJvY2Vzcy5QSVBFLAogICAgICAgIH0KICAgICAgICBpZiBpbnB1dF9kYXRhIGlzIG5vdCBOb25lOgogICAgICAgICAgICBrd2FyZ3NbJ3N0ZGluJ10gPSBzdWJwcm9jZXNzLlBJUEUKICAgICAgICBzdGRvdXQgPSBbXQogICAgICAgIHN0ZGVyciA9IFtdCiAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oY21kLCAqKmt3YXJncykKICAgICAgICAjIFdlIGRvbid0IHVzZSBjb21tdW5pY2F0ZSgpIGhlcmUgYmVjYXVzZSB3ZSBtYXkgbmVlZCB0bwogICAgICAgICMgZ2V0IGNsZXZlciB3aXRoIGludGVyYWN0aW5nIHdpdGggdGhlIGNvbW1hbmQKICAgICAgICB0MSA9IFRocmVhZCh0YXJnZXQ9c2VsZi5fcmVhZGVyLCBhcmdzPSgnc3Rkb3V0JywgcC5zdGRvdXQsIHN0ZG91dCkpCiAgICAgICAgdDEuc3RhcnQoKQogICAgICAgIHQyID0gVGhyZWFkKHRhcmdldD1zZWxmLl9yZWFkZXIsIGFyZ3M9KCdzdGRlcnInLCBwLnN0ZGVyciwgc3RkZXJyKSkKICAgICAgICB0Mi5zdGFydCgpCiAgICAgICAgaWYgaW5wdXRfZGF0YSBpcyBub3QgTm9uZToKICAgICAgICAgICAgcC5zdGRpbi53cml0ZShpbnB1dF9kYXRhKQogICAgICAgICAgICBwLnN0ZGluLmNsb3NlKCkKCiAgICAgICAgcC53YWl0KCkKICAgICAgICB0MS5qb2luKCkKICAgICAgICB0Mi5qb2luKCkKICAgICAgICByZXR1cm4gcC5yZXR1cm5jb2RlLCBzdGRvdXQsIHN0ZGVycgoKICAgIGRlZiBzaWduX2ZpbGUoc2VsZiwgZmlsZW5hbWUsIHNpZ25lciwgc2lnbl9wYXNzd29yZCwga2V5c3RvcmU9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgU2lnbiBhIGZpbGUuCgogICAgICAgIDpwYXJhbSBmaWxlbmFtZTogVGhlIHBhdGhuYW1lIHRvIHRoZSBmaWxlIHRvIGJlIHNpZ25lZC4KICAgICAgICA6cGFyYW0gc2lnbmVyOiBUaGUgaWRlbnRpZmllciBvZiB0aGUgc2lnbmVyIG9mIHRoZSBmaWxlLgogICAgICAgIDpwYXJhbSBzaWduX3Bhc3N3b3JkOiBUaGUgcGFzc3BocmFzZSBmb3IgdGhlIHNpZ25lcidzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXZhdGUga2V5IHVzZWQgZm9yIHNpZ25pbmcuCiAgICAgICAgOnBhcmFtIGtleXN0b3JlOiBUaGUgcGF0aCB0byBhIGRpcmVjdG9yeSB3aGljaCBjb250YWlucyB0aGUga2V5cwogICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBpbiBzaWduaW5nLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgaW5zdGFuY2UncwogICAgICAgICAgICAgICAgICAgICAgICAgYGBncGdfaG9tZWBgIGF0dHJpYnV0ZSBpcyB1c2VkIGluc3RlYWQuCiAgICAgICAgOnJldHVybjogVGhlIGFic29sdXRlIHBhdGhuYW1lIG9mIHRoZSBmaWxlIHdoZXJlIHRoZSBzaWduYXR1cmUgaXMKICAgICAgICAgICAgICAgICBzdG9yZWQuCiAgICAgICAgIiIiCiAgICAgICAgY21kLCBzaWdfZmlsZSA9IHNlbGYuZ2V0X3NpZ25fY29tbWFuZChmaWxlbmFtZSwgc2lnbmVyLCBzaWduX3Bhc3N3b3JkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5c3RvcmUpCiAgICAgICAgcmMsIHN0ZG91dCwgc3RkZXJyID0gc2VsZi5ydW5fY29tbWFuZChjbWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduX3Bhc3N3b3JkLmVuY29kZSgndXRmLTgnKSkKICAgICAgICBpZiByYyAhPSAwOgogICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdzaWduIGNvbW1hbmQgZmFpbGVkIHdpdGggZXJyb3IgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb2RlICVzJyAlIHJjKQogICAgICAgIHJldHVybiBzaWdfZmlsZQoKICAgIGRlZiB1cGxvYWRfZmlsZShzZWxmLCBtZXRhZGF0YSwgZmlsZW5hbWUsIHNpZ25lcj1Ob25lLCBzaWduX3Bhc3N3b3JkPU5vbmUsCiAgICAgICAgICAgICAgICAgICAgZmlsZXR5cGU9J3NkaXN0JywgcHl2ZXJzaW9uPSdzb3VyY2UnLCBrZXlzdG9yZT1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBVcGxvYWQgYSByZWxlYXNlIGZpbGUgdG8gdGhlIGluZGV4LgoKICAgICAgICA6cGFyYW0gbWV0YWRhdGE6IEEgOmNsYXNzOmBNZXRhZGF0YWAgaW5zdGFuY2UgZGVmaW5pbmcgYXQgbGVhc3QgYSBuYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdmVyc2lvbiBudW1iZXIgZm9yIHRoZSBmaWxlIHRvIGJlIHVwbG9hZGVkLgogICAgICAgIDpwYXJhbSBmaWxlbmFtZTogVGhlIHBhdGhuYW1lIG9mIHRoZSBmaWxlIHRvIGJlIHVwbG9hZGVkLgogICAgICAgIDpwYXJhbSBzaWduZXI6IFRoZSBpZGVudGlmaWVyIG9mIHRoZSBzaWduZXIgb2YgdGhlIGZpbGUuCiAgICAgICAgOnBhcmFtIHNpZ25fcGFzc3dvcmQ6IFRoZSBwYXNzcGhyYXNlIGZvciB0aGUgc2lnbmVyJ3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBrZXkgdXNlZCBmb3Igc2lnbmluZy4KICAgICAgICA6cGFyYW0gZmlsZXR5cGU6IFRoZSB0eXBlIG9mIHRoZSBmaWxlIGJlaW5nIHVwbG9hZGVkLiBUaGlzIGlzIHRoZQogICAgICAgICAgICAgICAgICAgICAgICBkaXN0dXRpbHMgY29tbWFuZCB3aGljaCBwcm9kdWNlZCB0aGF0IGZpbGUsIGUuZy4KICAgICAgICAgICAgICAgICAgICAgICAgYGBzZGlzdGBgIG9yIGBgYmRpc3Rfd2hlZWxgYC4KICAgICAgICA6cGFyYW0gcHl2ZXJzaW9uOiBUaGUgdmVyc2lvbiBvZiBQeXRob24gd2hpY2ggdGhlIHJlbGVhc2UgcmVsYXRlcwogICAgICAgICAgICAgICAgICAgICAgICAgIHRvLiBGb3IgY29kZSBjb21wYXRpYmxlIHdpdGggYW55IFB5dGhvbiwgdGhpcyB3b3VsZAogICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGBgc291cmNlYGAsIG90aGVyd2lzZSBpdCB3b3VsZCBiZSBlLmcuIGBgMy4yYGAuCiAgICAgICAgOnBhcmFtIGtleXN0b3JlOiBUaGUgcGF0aCB0byBhIGRpcmVjdG9yeSB3aGljaCBjb250YWlucyB0aGUga2V5cwogICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBpbiBzaWduaW5nLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgaW5zdGFuY2UncwogICAgICAgICAgICAgICAgICAgICAgICAgYGBncGdfaG9tZWBgIGF0dHJpYnV0ZSBpcyB1c2VkIGluc3RlYWQuCiAgICAgICAgOnJldHVybjogVGhlIEhUVFAgcmVzcG9uc2UgcmVjZWl2ZWQgZnJvbSBQeVBJIHVwb24gc3VibWlzc2lvbiBvZiB0aGUKICAgICAgICAgICAgICAgIHJlcXVlc3QuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5jaGVja19jcmVkZW50aWFscygpCiAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lKToKICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbignbm90IGZvdW5kOiAlcycgJSBmaWxlbmFtZSkKICAgICAgICBtZXRhZGF0YS52YWxpZGF0ZSgpCiAgICAgICAgZCA9IG1ldGFkYXRhLnRvZGljdCgpCiAgICAgICAgc2lnX2ZpbGUgPSBOb25lCiAgICAgICAgaWYgc2lnbmVyOgogICAgICAgICAgICBpZiBub3Qgc2VsZi5ncGc6CiAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygnbm8gc2lnbmluZyBwcm9ncmFtIGF2YWlsYWJsZSAtIG5vdCBzaWduZWQnKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2lnX2ZpbGUgPSBzZWxmLnNpZ25fZmlsZShmaWxlbmFtZSwgc2lnbmVyLCBzaWduX3Bhc3N3b3JkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzdG9yZSkKICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICdyYicpIGFzIGY6CiAgICAgICAgICAgIGZpbGVfZGF0YSA9IGYucmVhZCgpCiAgICAgICAgbWQ1X2RpZ2VzdCA9IGhhc2hsaWIubWQ1KGZpbGVfZGF0YSkuaGV4ZGlnZXN0KCkKICAgICAgICBzaGEyNTZfZGlnZXN0ID0gaGFzaGxpYi5zaGEyNTYoZmlsZV9kYXRhKS5oZXhkaWdlc3QoKQogICAgICAgIGQudXBkYXRlKHsKICAgICAgICAgICAgJzphY3Rpb24nOiAnZmlsZV91cGxvYWQnLAogICAgICAgICAgICAncHJvdG9jb2xfdmVyc2lvbic6ICcxJywKICAgICAgICAgICAgJ2ZpbGV0eXBlJzogZmlsZXR5cGUsCiAgICAgICAgICAgICdweXZlcnNpb24nOiBweXZlcnNpb24sCiAgICAgICAgICAgICdtZDVfZGlnZXN0JzogbWQ1X2RpZ2VzdCwKICAgICAgICAgICAgJ3NoYTI1Nl9kaWdlc3QnOiBzaGEyNTZfZGlnZXN0LAogICAgICAgIH0pCiAgICAgICAgZmlsZXMgPSBbKCdjb250ZW50Jywgb3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSksIGZpbGVfZGF0YSldCiAgICAgICAgaWYgc2lnX2ZpbGU6CiAgICAgICAgICAgIHdpdGggb3BlbihzaWdfZmlsZSwgJ3JiJykgYXMgZjoKICAgICAgICAgICAgICAgIHNpZ19kYXRhID0gZi5yZWFkKCkKICAgICAgICAgICAgZmlsZXMuYXBwZW5kKCgnZ3BnX3NpZ25hdHVyZScsIG9zLnBhdGguYmFzZW5hbWUoc2lnX2ZpbGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgc2lnX2RhdGEpKQogICAgICAgICAgICBzaHV0aWwucm10cmVlKG9zLnBhdGguZGlybmFtZShzaWdfZmlsZSkpCiAgICAgICAgcmVxdWVzdCA9IHNlbGYuZW5jb2RlX3JlcXVlc3QoZC5pdGVtcygpLCBmaWxlcykKICAgICAgICByZXR1cm4gc2VsZi5zZW5kX3JlcXVlc3QocmVxdWVzdCkKCiAgICBkZWYgdXBsb2FkX2RvY3VtZW50YXRpb24oc2VsZiwgbWV0YWRhdGEsIGRvY19kaXIpOgogICAgICAgICIiIgogICAgICAgIFVwbG9hZCBkb2N1bWVudGF0aW9uIHRvIHRoZSBpbmRleC4KCiAgICAgICAgOnBhcmFtIG1ldGFkYXRhOiBBIDpjbGFzczpgTWV0YWRhdGFgIGluc3RhbmNlIGRlZmluaW5nIGF0IGxlYXN0IGEgbmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHZlcnNpb24gbnVtYmVyIGZvciB0aGUgZG9jdW1lbnRhdGlvbiB0byBiZQogICAgICAgICAgICAgICAgICAgICAgICAgdXBsb2FkZWQuCiAgICAgICAgOnBhcmFtIGRvY19kaXI6IFRoZSBwYXRobmFtZSBvZiB0aGUgZGlyZWN0b3J5IHdoaWNoIGNvbnRhaW5zIHRoZQogICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudGF0aW9uLiBUaGlzIHNob3VsZCBiZSB0aGUgZGlyZWN0b3J5IHRoYXQKICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnMgdGhlIGBgaW5kZXguaHRtbGBgIGZvciB0aGUgZG9jdW1lbnRhdGlvbi4KICAgICAgICA6cmV0dXJuOiBUaGUgSFRUUCByZXNwb25zZSByZWNlaXZlZCBmcm9tIFB5UEkgdXBvbiBzdWJtaXNzaW9uIG9mIHRoZQogICAgICAgICAgICAgICAgcmVxdWVzdC4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmNoZWNrX2NyZWRlbnRpYWxzKCkKICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2Rpcihkb2NfZGlyKToKICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbignbm90IGEgZGlyZWN0b3J5OiAlcicgJSBkb2NfZGlyKQogICAgICAgIGZuID0gb3MucGF0aC5qb2luKGRvY19kaXIsICdpbmRleC5odG1sJykKICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZm4pOgogICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdub3QgZm91bmQ6ICVyJyAlIGZuKQogICAgICAgIG1ldGFkYXRhLnZhbGlkYXRlKCkKICAgICAgICBuYW1lLCB2ZXJzaW9uID0gbWV0YWRhdGEubmFtZSwgbWV0YWRhdGEudmVyc2lvbgogICAgICAgIHppcF9kYXRhID0gemlwX2Rpcihkb2NfZGlyKS5nZXR2YWx1ZSgpCiAgICAgICAgZmllbGRzID0gWygnOmFjdGlvbicsICdkb2NfdXBsb2FkJyksCiAgICAgICAgICAgICAgICAgICgnbmFtZScsIG5hbWUpLCAoJ3ZlcnNpb24nLCB2ZXJzaW9uKV0KICAgICAgICBmaWxlcyA9IFsoJ2NvbnRlbnQnLCBuYW1lLCB6aXBfZGF0YSldCiAgICAgICAgcmVxdWVzdCA9IHNlbGYuZW5jb2RlX3JlcXVlc3QoZmllbGRzLCBmaWxlcykKICAgICAgICByZXR1cm4gc2VsZi5zZW5kX3JlcXVlc3QocmVxdWVzdCkKCiAgICBkZWYgZ2V0X3ZlcmlmeV9jb21tYW5kKHNlbGYsIHNpZ25hdHVyZV9maWxlbmFtZSwgZGF0YV9maWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5c3RvcmU9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGEgc3VpdGFibGUgY29tbWFuZCBmb3IgdmVyaWZ5aW5nIGEgZmlsZS4KCiAgICAgICAgOnBhcmFtIHNpZ25hdHVyZV9maWxlbmFtZTogVGhlIHBhdGhuYW1lIHRvIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlLgogICAgICAgIDpwYXJhbSBkYXRhX2ZpbGVuYW1lOiBUaGUgcGF0aG5hbWUgdG8gdGhlIGZpbGUgY29udGFpbmluZyB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVkIGRhdGEuCiAgICAgICAgOnBhcmFtIGtleXN0b3JlOiBUaGUgcGF0aCB0byBhIGRpcmVjdG9yeSB3aGljaCBjb250YWlucyB0aGUga2V5cwogICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBpbiB2ZXJpZmljYXRpb24uIElmIG5vdCBzcGVjaWZpZWQsIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UncyBgYGdwZ19ob21lYGAgYXR0cmlidXRlIGlzIHVzZWQgaW5zdGVhZC4KICAgICAgICA6cmV0dXJuOiBUaGUgdmVyaWZ5aW5nIGNvbW1hbmQgYXMgYSBsaXN0IHN1aXRhYmxlIHRvIGJlCiAgICAgICAgICAgICAgICAgcGFzc2VkIHRvIDpjbGFzczpgc3VicHJvY2Vzcy5Qb3BlbmAuCiAgICAgICAgIiIiCiAgICAgICAgY21kID0gW3NlbGYuZ3BnLCAnLS1zdGF0dXMtZmQnLCAnMicsICctLW5vLXR0eSddCiAgICAgICAgaWYga2V5c3RvcmUgaXMgTm9uZToKICAgICAgICAgICAga2V5c3RvcmUgPSBzZWxmLmdwZ19ob21lCiAgICAgICAgaWYga2V5c3RvcmU6CiAgICAgICAgICAgIGNtZC5leHRlbmQoWyctLWhvbWVkaXInLCBrZXlzdG9yZV0pCiAgICAgICAgY21kLmV4dGVuZChbJy0tdmVyaWZ5Jywgc2lnbmF0dXJlX2ZpbGVuYW1lLCBkYXRhX2ZpbGVuYW1lXSkKICAgICAgICBsb2dnZXIuZGVidWcoJ2ludm9raW5nOiAlcycsICcgJy5qb2luKGNtZCkpCiAgICAgICAgcmV0dXJuIGNtZAoKICAgIGRlZiB2ZXJpZnlfc2lnbmF0dXJlKHNlbGYsIHNpZ25hdHVyZV9maWxlbmFtZSwgZGF0YV9maWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGtleXN0b3JlPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIFZlcmlmeSBhIHNpZ25hdHVyZSBmb3IgYSBmaWxlLgoKICAgICAgICA6cGFyYW0gc2lnbmF0dXJlX2ZpbGVuYW1lOiBUaGUgcGF0aG5hbWUgdG8gdGhlIGZpbGUgY29udGFpbmluZyB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmUuCiAgICAgICAgOnBhcmFtIGRhdGFfZmlsZW5hbWU6IFRoZSBwYXRobmFtZSB0byB0aGUgZmlsZSBjb250YWluaW5nIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduZWQgZGF0YS4KICAgICAgICA6cGFyYW0ga2V5c3RvcmU6IFRoZSBwYXRoIHRvIGEgZGlyZWN0b3J5IHdoaWNoIGNvbnRhaW5zIHRoZSBrZXlzCiAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGluIHZlcmlmaWNhdGlvbi4gSWYgbm90IHNwZWNpZmllZCwgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSdzIGBgZ3BnX2hvbWVgYCBhdHRyaWJ1dGUgaXMgdXNlZCBpbnN0ZWFkLgogICAgICAgIDpyZXR1cm46IFRydWUgaWYgdGhlIHNpZ25hdHVyZSB3YXMgdmVyaWZpZWQsIGVsc2UgRmFsc2UuCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IHNlbGYuZ3BnOgogICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCd2ZXJpZmljYXRpb24gdW5hdmFpbGFibGUgYmVjYXVzZSBncGcgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1bmF2YWlsYWJsZScpCiAgICAgICAgY21kID0gc2VsZi5nZXRfdmVyaWZ5X2NvbW1hbmQoc2lnbmF0dXJlX2ZpbGVuYW1lLCBkYXRhX2ZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXN0b3JlKQogICAgICAgIHJjLCBzdGRvdXQsIHN0ZGVyciA9IHNlbGYucnVuX2NvbW1hbmQoY21kKQogICAgICAgIGlmIHJjIG5vdCBpbiAoMCwgMSk6CiAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ3ZlcmlmeSBjb21tYW5kIGZhaWxlZCB3aXRoIGVycm9yICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29kZSAlcycgJSByYykKICAgICAgICByZXR1cm4gcmMgPT0gMAoKICAgIGRlZiBkb3dubG9hZF9maWxlKHNlbGYsIHVybCwgZGVzdGZpbGUsIGRpZ2VzdD1Ob25lLCByZXBvcnRob29rPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgZm9yIGRvd25sb2FkaW5nIGEgZmlsZSBmcm9tIGFuIFVSTC4KICAgICAgICBOb3JtYWxseSwgdGhpcyB3aWxsIGJlIGEgZmlsZSBmcm9tIHRoZSBpbmRleCwgdGhvdWdoIGN1cnJlbnRseQogICAgICAgIG5vIGNoZWNrIGlzIG1hZGUgZm9yIHRoaXMgKGkuZS4gYSBmaWxlIGNhbiBiZSBkb3dubG9hZGVkIGZyb20KICAgICAgICBhbnl3aGVyZSkuCgogICAgICAgIFRoZSBtZXRob2QgaXMganVzdCBsaWtlIHRoZSA6ZnVuYzpgdXJscmV0cmlldmVgIGZ1bmN0aW9uIGluIHRoZQogICAgICAgIHN0YW5kYXJkIGxpYnJhcnksIGV4Y2VwdCB0aGF0IGl0IGFsbG93cyBkaWdlc3QgY29tcHV0YXRpb24gdG8gYmUKICAgICAgICBkb25lIGR1cmluZyBkb3dubG9hZCBhbmQgY2hlY2tpbmcgdGhhdCB0aGUgZG93bmxvYWRlZCBkYXRhCiAgICAgICAgbWF0Y2hlZCBhbnkgZXhwZWN0ZWQgdmFsdWUuCgogICAgICAgIDpwYXJhbSB1cmw6IFRoZSBVUkwgb2YgdGhlIGZpbGUgdG8gYmUgZG93bmxvYWRlZCAoYXNzdW1lZCB0byBiZQogICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZSB2aWEgYW4gSFRUUCBHRVQgcmVxdWVzdCkuCiAgICAgICAgOnBhcmFtIGRlc3RmaWxlOiBUaGUgcGF0aG5hbWUgd2hlcmUgdGhlIGRvd25sb2FkZWQgZmlsZSBpcyB0byBiZQogICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWQuCiAgICAgICAgOnBhcmFtIGRpZ2VzdDogSWYgc3BlY2lmaWVkLCB0aGlzIG11c3QgYmUgYSAoaGFzaGVyLCB2YWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICB0dXBsZSwgd2hlcmUgaGFzaGVyIGlzIHRoZSBhbGdvcml0aG0gdXNlZCAoZS5nLgogICAgICAgICAgICAgICAgICAgICAgIGBgJ21kNSdgYCkgYW5kIGBgdmFsdWVgYCBpcyB0aGUgZXhwZWN0ZWQgdmFsdWUuCiAgICAgICAgOnBhcmFtIHJlcG9ydGhvb2s6IFRoZSBzYW1lIGFzIGZvciA6ZnVuYzpgdXJscmV0cmlldmVgIGluIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZCBsaWJyYXJ5LgogICAgICAgICIiIgogICAgICAgIGlmIGRpZ2VzdCBpcyBOb25lOgogICAgICAgICAgICBkaWdlc3RlciA9IE5vbmUKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdObyBkaWdlc3Qgc3BlY2lmaWVkJykKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGRpZ2VzdCwgKGxpc3QsIHR1cGxlKSk6CiAgICAgICAgICAgICAgICBoYXNoZXIsIGRpZ2VzdCA9IGRpZ2VzdAogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaGFzaGVyID0gJ21kNScKICAgICAgICAgICAgZGlnZXN0ZXIgPSBnZXRhdHRyKGhhc2hsaWIsIGhhc2hlcikoKQogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0RpZ2VzdCBzcGVjaWZpZWQ6ICVzJyAlIGRpZ2VzdCkKICAgICAgICAjIFRoZSBmb2xsb3dpbmcgY29kZSBpcyBlcXVpdmFsZW50IHRvIHVybHJldHJpZXZlLgogICAgICAgICMgV2UgbmVlZCB0byBkbyBpdCB0aGlzIHdheSBzbyB0aGF0IHdlIGNhbiBjb21wdXRlIHRoZQogICAgICAgICMgZGlnZXN0IG9mIHRoZSBmaWxlIGFzIHdlIGdvLgogICAgICAgIHdpdGggb3BlbihkZXN0ZmlsZSwgJ3diJykgYXMgZGZwOgogICAgICAgICAgICAjIGFkZGluZm91cmwgaXMgbm90IGEgY29udGV4dCBtYW5hZ2VyIG9uIDIueAogICAgICAgICAgICAjIHNvIHdlIGhhdmUgdG8gdXNlIHRyeS9maW5hbGx5CiAgICAgICAgICAgIHNmcCA9IHNlbGYuc2VuZF9yZXF1ZXN0KFJlcXVlc3QodXJsKSkKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaGVhZGVycyA9IHNmcC5pbmZvKCkKICAgICAgICAgICAgICAgIGJsb2Nrc2l6ZSA9IDgxOTIKICAgICAgICAgICAgICAgIHNpemUgPSAtMQogICAgICAgICAgICAgICAgcmVhZCA9IDAKICAgICAgICAgICAgICAgIGJsb2NrbnVtID0gMAogICAgICAgICAgICAgICAgaWYgImNvbnRlbnQtbGVuZ3RoIiBpbiBoZWFkZXJzOgogICAgICAgICAgICAgICAgICAgIHNpemUgPSBpbnQoaGVhZGVyc1siQ29udGVudC1MZW5ndGgiXSkKICAgICAgICAgICAgICAgIGlmIHJlcG9ydGhvb2s6CiAgICAgICAgICAgICAgICAgICAgcmVwb3J0aG9vayhibG9ja251bSwgYmxvY2tzaXplLCBzaXplKQogICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgICAgICAgICBibG9jayA9IHNmcC5yZWFkKGJsb2Nrc2l6ZSkKICAgICAgICAgICAgICAgICAgICBpZiBub3QgYmxvY2s6CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICAgICAgcmVhZCArPSBsZW4oYmxvY2spCiAgICAgICAgICAgICAgICAgICAgZGZwLndyaXRlKGJsb2NrKQogICAgICAgICAgICAgICAgICAgIGlmIGRpZ2VzdGVyOgogICAgICAgICAgICAgICAgICAgICAgICBkaWdlc3Rlci51cGRhdGUoYmxvY2spCiAgICAgICAgICAgICAgICAgICAgYmxvY2tudW0gKz0gMQogICAgICAgICAgICAgICAgICAgIGlmIHJlcG9ydGhvb2s6CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydGhvb2soYmxvY2tudW0sIGJsb2Nrc2l6ZSwgc2l6ZSkKICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgIHNmcC5jbG9zZSgpCgogICAgICAgICMgY2hlY2sgdGhhdCB3ZSBnb3QgdGhlIHdob2xlIGZpbGUsIGlmIHdlIGNhbgogICAgICAgIGlmIHNpemUgPj0gMCBhbmQgcmVhZCA8IHNpemU6CiAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAncmV0cmlldmFsIGluY29tcGxldGU6IGdvdCBvbmx5ICVkIG91dCBvZiAlZCBieXRlcycKICAgICAgICAgICAgICAgICUgKHJlYWQsIHNpemUpKQogICAgICAgICMgaWYgd2UgaGF2ZSBhIGRpZ2VzdCwgaXQgbXVzdCBtYXRjaC4KICAgICAgICBpZiBkaWdlc3RlcjoKICAgICAgICAgICAgYWN0dWFsID0gZGlnZXN0ZXIuaGV4ZGlnZXN0KCkKICAgICAgICAgICAgaWYgZGlnZXN0ICE9IGFjdHVhbDoKICAgICAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJyVzIGRpZ2VzdCBtaXNtYXRjaCBmb3IgJXM6IGV4cGVjdGVkICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVzLCBnb3QgJXMnICUgKGhhc2hlciwgZGVzdGZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWdlc3QsIGFjdHVhbCkpCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnRGlnZXN0IHZlcmlmaWVkOiAlcycsIGRpZ2VzdCkKCiAgICBkZWYgc2VuZF9yZXF1ZXN0KHNlbGYsIHJlcSk6CiAgICAgICAgIiIiCiAgICAgICAgU2VuZCBhIHN0YW5kYXJkIGxpYnJhcnkgOmNsYXNzOmBSZXF1ZXN0YCB0byBQeVBJIGFuZCByZXR1cm4gaXRzCiAgICAgICAgcmVzcG9uc2UuCgogICAgICAgIDpwYXJhbSByZXE6IFRoZSByZXF1ZXN0IHRvIHNlbmQuCiAgICAgICAgOnJldHVybjogVGhlIEhUVFAgcmVzcG9uc2UgZnJvbSBQeVBJIChhIHN0YW5kYXJkIGxpYnJhcnkgSFRUUFJlc3BvbnNlKS4KICAgICAgICAiIiIKICAgICAgICBoYW5kbGVycyA9IFtdCiAgICAgICAgaWYgc2VsZi5wYXNzd29yZF9oYW5kbGVyOgogICAgICAgICAgICBoYW5kbGVycy5hcHBlbmQoc2VsZi5wYXNzd29yZF9oYW5kbGVyKQogICAgICAgIGlmIHNlbGYuc3NsX3ZlcmlmaWVyOgogICAgICAgICAgICBoYW5kbGVycy5hcHBlbmQoc2VsZi5zc2xfdmVyaWZpZXIpCiAgICAgICAgb3BlbmVyID0gYnVpbGRfb3BlbmVyKCpoYW5kbGVycykKICAgICAgICByZXR1cm4gb3BlbmVyLm9wZW4ocmVxKQoKICAgIGRlZiBlbmNvZGVfcmVxdWVzdChzZWxmLCBmaWVsZHMsIGZpbGVzKToKICAgICAgICAiIiIKICAgICAgICBFbmNvZGUgZmllbGRzIGFuZCBmaWxlcyBmb3IgcG9zdGluZyB0byBhbiBIVFRQIHNlcnZlci4KCiAgICAgICAgOnBhcmFtIGZpZWxkczogVGhlIGZpZWxkcyB0byBzZW5kIGFzIGEgbGlzdCBvZiAoZmllbGRuYW1lLCB2YWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICB0dXBsZXMuCiAgICAgICAgOnBhcmFtIGZpbGVzOiBUaGUgZmlsZXMgdG8gc2VuZCBhcyBhIGxpc3Qgb2YgKGZpZWxkbmFtZSwgZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgICBmaWxlX2J5dGVzKSB0dXBsZS4KICAgICAgICAiIiIKICAgICAgICAjIEFkYXB0ZWQgZnJvbSBwYWNrYWdpbmcsIHdoaWNoIGluIHR1cm4gd2FzIGFkYXB0ZWQgZnJvbQogICAgICAgICMgaHR0cDovL2NvZGUuYWN0aXZlc3RhdGUuY29tL3JlY2lwZXMvMTQ2MzA2CgogICAgICAgIHBhcnRzID0gW10KICAgICAgICBib3VuZGFyeSA9IHNlbGYuYm91bmRhcnkKICAgICAgICBmb3IgaywgdmFsdWVzIGluIGZpZWxkczoKICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmFsdWVzLCAobGlzdCwgdHVwbGUpKToKICAgICAgICAgICAgICAgIHZhbHVlcyA9IFt2YWx1ZXNdCgogICAgICAgICAgICBmb3IgdiBpbiB2YWx1ZXM6CiAgICAgICAgICAgICAgICBwYXJ0cy5leHRlbmQoKAogICAgICAgICAgICAgICAgICAgIGInLS0nICsgYm91bmRhcnksCiAgICAgICAgICAgICAgICAgICAgKCdDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9IiVzIicgJQogICAgICAgICAgICAgICAgICAgICBrKS5lbmNvZGUoJ3V0Zi04JyksCiAgICAgICAgICAgICAgICAgICAgYicnLAogICAgICAgICAgICAgICAgICAgIHYuZW5jb2RlKCd1dGYtOCcpKSkKICAgICAgICBmb3Iga2V5LCBmaWxlbmFtZSwgdmFsdWUgaW4gZmlsZXM6CiAgICAgICAgICAgIHBhcnRzLmV4dGVuZCgoCiAgICAgICAgICAgICAgICBiJy0tJyArIGJvdW5kYXJ5LAogICAgICAgICAgICAgICAgKCdDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9IiVzIjsgZmlsZW5hbWU9IiVzIicgJQogICAgICAgICAgICAgICAgIChrZXksIGZpbGVuYW1lKSkuZW5jb2RlKCd1dGYtOCcpLAogICAgICAgICAgICAgICAgYicnLAogICAgICAgICAgICAgICAgdmFsdWUpKQoKICAgICAgICBwYXJ0cy5leHRlbmQoKGInLS0nICsgYm91bmRhcnkgKyBiJy0tJywgYicnKSkKCiAgICAgICAgYm9keSA9IGInXHJcbicuam9pbihwYXJ0cykKICAgICAgICBjdCA9IGInbXVsdGlwYXJ0L2Zvcm0tZGF0YTsgYm91bmRhcnk9JyArIGJvdW5kYXJ5CiAgICAgICAgaGVhZGVycyA9IHsKICAgICAgICAgICAgJ0NvbnRlbnQtdHlwZSc6IGN0LAogICAgICAgICAgICAnQ29udGVudC1sZW5ndGgnOiBzdHIobGVuKGJvZHkpKQogICAgICAgIH0KICAgICAgICByZXR1cm4gUmVxdWVzdChzZWxmLnVybCwgYm9keSwgaGVhZGVycykKCiAgICBkZWYgc2VhcmNoKHNlbGYsIHRlcm1zLCBvcGVyYXRvcj1Ob25lKToKICAgICAgICBpZiBpc2luc3RhbmNlKHRlcm1zLCBzdHJpbmdfdHlwZXMpOgogICAgICAgICAgICB0ZXJtcyA9IHsnbmFtZSc6IHRlcm1zfQogICAgICAgIGlmIHNlbGYucnBjX3Byb3h5IGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYucnBjX3Byb3h5ID0gU2VydmVyUHJveHkoc2VsZi51cmwsIHRpbWVvdXQ9My4wKQogICAgICAgIHJldHVybiBzZWxmLnJwY19wcm94eS5zZWFyY2godGVybXMsIG9wZXJhdG9yIG9yICdhbmQnKQpQSwMEFAAAAAAAAAAhANHFeK9FxwAARccAAC8AAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi9sb2NhdG9ycy5weSMgLSotIGNvZGluZzogdXRmLTggLSotCiMKIyBDb3B5cmlnaHQgKEMpIDIwMTItMjAxNSBWaW5heSBTYWppcC4KIyBMaWNlbnNlZCB0byB0aGUgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24gdW5kZXIgYSBjb250cmlidXRvciBhZ3JlZW1lbnQuCiMgU2VlIExJQ0VOU0UudHh0IGFuZCBDT05UUklCVVRPUlMudHh0LgojCgppbXBvcnQgZ3ppcApmcm9tIGlvIGltcG9ydCBCeXRlc0lPCmltcG9ydCBqc29uCmltcG9ydCBsb2dnaW5nCmltcG9ydCBvcwppbXBvcnQgcG9zaXhwYXRoCmltcG9ydCByZQp0cnk6CiAgICBpbXBvcnQgdGhyZWFkaW5nCmV4Y2VwdCBJbXBvcnRFcnJvcjogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgaW1wb3J0IGR1bW15X3RocmVhZGluZyBhcyB0aHJlYWRpbmcKaW1wb3J0IHpsaWIKCmZyb20gLiBpbXBvcnQgRGlzdGxpYkV4Y2VwdGlvbgpmcm9tIC5jb21wYXQgaW1wb3J0ICh1cmxqb2luLCB1cmxwYXJzZSwgdXJsdW5wYXJzZSwgdXJsMnBhdGhuYW1lLCBwYXRobmFtZTJ1cmwsCiAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLCBxdW90ZSwgdW5lc2NhcGUsIHN0cmluZ190eXBlcywgYnVpbGRfb3BlbmVyLAogICAgICAgICAgICAgICAgICAgICBIVFRQUmVkaXJlY3RIYW5kbGVyIGFzIEJhc2VSZWRpcmVjdEhhbmRsZXIsIHRleHRfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdCwgSFRUUEVycm9yLCBVUkxFcnJvcikKZnJvbSAuZGF0YWJhc2UgaW1wb3J0IERpc3RyaWJ1dGlvbiwgRGlzdHJpYnV0aW9uUGF0aCwgbWFrZV9kaXN0CmZyb20gLm1ldGFkYXRhIGltcG9ydCBNZXRhZGF0YQpmcm9tIC51dGlsIGltcG9ydCAoY2FjaGVkX3Byb3BlcnR5LCBwYXJzZV9jcmVkZW50aWFscywgZW5zdXJlX3NsYXNoLAogICAgICAgICAgICAgICAgICAgc3BsaXRfZmlsZW5hbWUsIGdldF9wcm9qZWN0X2RhdGEsIHBhcnNlX3JlcXVpcmVtZW50LAogICAgICAgICAgICAgICAgICAgcGFyc2VfbmFtZV9hbmRfdmVyc2lvbiwgU2VydmVyUHJveHksIG5vcm1hbGl6ZV9uYW1lKQpmcm9tIC52ZXJzaW9uIGltcG9ydCBnZXRfc2NoZW1lLCBVbnN1cHBvcnRlZFZlcnNpb25FcnJvcgpmcm9tIC53aGVlbCBpbXBvcnQgV2hlZWwsIGlzX2NvbXBhdGlibGUKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKSEFTSEVSX0hBU0ggPSByZS5jb21waWxlKCdeKFx3Kyk9KFthLWYwLTldKyknKQpDSEFSU0VUID0gcmUuY29tcGlsZShyJztccypjaGFyc2V0XHMqPVxzKiguKilccyokJywgcmUuSSkKSFRNTF9DT05URU5UX1RZUEUgPSByZS5jb21waWxlKCd0ZXh0L2h0bWx8YXBwbGljYXRpb24veChodCk/bWwnKQpERUZBVUxUX0lOREVYID0gJ2h0dHBzOi8vcHlwaS5weXRob24ub3JnL3B5cGknCgpkZWYgZ2V0X2FsbF9kaXN0cmlidXRpb25fbmFtZXModXJsPU5vbmUpOgogICAgIiIiCiAgICBSZXR1cm4gYWxsIGRpc3RyaWJ1dGlvbiBuYW1lcyBrbm93biBieSBhbiBpbmRleC4KICAgIDpwYXJhbSB1cmw6IFRoZSBVUkwgb2YgdGhlIGluZGV4LgogICAgOnJldHVybjogQSBsaXN0IG9mIGFsbCBrbm93biBkaXN0cmlidXRpb24gbmFtZXMuCiAgICAiIiIKICAgIGlmIHVybCBpcyBOb25lOgogICAgICAgIHVybCA9IERFRkFVTFRfSU5ERVgKICAgIGNsaWVudCA9IFNlcnZlclByb3h5KHVybCwgdGltZW91dD0zLjApCiAgICByZXR1cm4gY2xpZW50Lmxpc3RfcGFja2FnZXMoKQoKY2xhc3MgUmVkaXJlY3RIYW5kbGVyKEJhc2VSZWRpcmVjdEhhbmRsZXIpOgogICAgIiIiCiAgICBBIGNsYXNzIHRvIHdvcmsgYXJvdW5kIGEgYnVnIGluIHNvbWUgUHl0aG9uIDMuMi54IHJlbGVhc2VzLgogICAgIiIiCiAgICAjIFRoZXJlJ3MgYSBidWcgaW4gdGhlIGJhc2UgdmVyc2lvbiBmb3Igc29tZSAzLjIueAogICAgIyAoZS5nLiAzLjIuMiBvbiBVYnVudHUgT25laXJpYykuIElmIGEgTG9jYXRpb24gaGVhZGVyCiAgICAjIHJldHVybnMgZS5nLiAvYWJjLCBpdCBiYWlscyBiZWNhdXNlIGl0IHNheXMgdGhlIHNjaGVtZSAnJwogICAgIyBpcyBib2d1cywgd2hlbiBhY3R1YWxseSBpdCBzaG91bGQgdXNlIHRoZSByZXF1ZXN0J3MKICAgICMgVVJMIGZvciB0aGUgc2NoZW1lLiBTZWUgUHl0aG9uIGlzc3VlICMxMzY5Ni4KICAgIGRlZiBodHRwX2Vycm9yXzMwMihzZWxmLCByZXEsIGZwLCBjb2RlLCBtc2csIGhlYWRlcnMpOgogICAgICAgICMgU29tZSBzZXJ2ZXJzIChpbmNvcnJlY3RseSkgcmV0dXJuIG11bHRpcGxlIExvY2F0aW9uIGhlYWRlcnMKICAgICAgICAjIChzbyBwcm9iYWJseSBzYW1lIGdvZXMgZm9yIFVSSSkuICBVc2UgZmlyc3QgaGVhZGVyLgogICAgICAgIG5ld3VybCA9IE5vbmUKICAgICAgICBmb3Iga2V5IGluICgnbG9jYXRpb24nLCAndXJpJyk6CiAgICAgICAgICAgIGlmIGtleSBpbiBoZWFkZXJzOgogICAgICAgICAgICAgICAgbmV3dXJsID0gaGVhZGVyc1trZXldCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGlmIG5ld3VybCBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4KICAgICAgICB1cmxwYXJ0cyA9IHVybHBhcnNlKG5ld3VybCkKICAgICAgICBpZiB1cmxwYXJ0cy5zY2hlbWUgPT0gJyc6CiAgICAgICAgICAgIG5ld3VybCA9IHVybGpvaW4ocmVxLmdldF9mdWxsX3VybCgpLCBuZXd1cmwpCiAgICAgICAgICAgIGlmIGhhc2F0dHIoaGVhZGVycywgJ3JlcGxhY2VfaGVhZGVyJyk6CiAgICAgICAgICAgICAgICBoZWFkZXJzLnJlcGxhY2VfaGVhZGVyKGtleSwgbmV3dXJsKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaGVhZGVyc1trZXldID0gbmV3dXJsCiAgICAgICAgcmV0dXJuIEJhc2VSZWRpcmVjdEhhbmRsZXIuaHR0cF9lcnJvcl8zMDIoc2VsZiwgcmVxLCBmcCwgY29kZSwgbXNnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnMpCgogICAgaHR0cF9lcnJvcl8zMDEgPSBodHRwX2Vycm9yXzMwMyA9IGh0dHBfZXJyb3JfMzA3ID0gaHR0cF9lcnJvcl8zMDIKCmNsYXNzIExvY2F0b3Iob2JqZWN0KToKICAgICIiIgogICAgQSBiYXNlIGNsYXNzIGZvciBsb2NhdG9ycyAtIHRoaW5ncyB0aGF0IGxvY2F0ZSBkaXN0cmlidXRpb25zLgogICAgIiIiCiAgICBzb3VyY2VfZXh0ZW5zaW9ucyA9ICgnLnRhci5neicsICcudGFyLmJ6MicsICcudGFyJywgJy56aXAnLCAnLnRneicsICcudGJ6JykKICAgIGJpbmFyeV9leHRlbnNpb25zID0gKCcuZWdnJywgJy5leGUnLCAnLndobCcpCiAgICBleGNsdWRlZF9leHRlbnNpb25zID0gKCcucGRmJywpCgogICAgIyBBIGxpc3Qgb2YgdGFncyBpbmRpY2F0aW5nIHdoaWNoIHdoZWVscyB5b3Ugd2FudCB0byBtYXRjaC4gVGhlIGRlZmF1bHQKICAgICMgdmFsdWUgb2YgTm9uZSBtYXRjaGVzIGFnYWluc3QgdGhlIHRhZ3MgY29tcGF0aWJsZSB3aXRoIHRoZSBydW5uaW5nCiAgICAjIFB5dGhvbi4gSWYgeW91IHdhbnQgdG8gbWF0Y2ggb3RoZXIgdmFsdWVzLCBzZXQgd2hlZWxfdGFncyBvbiBhIGxvY2F0b3IKICAgICMgaW5zdGFuY2UgdG8gYSBsaXN0IG9mIHR1cGxlcyAocHl2ZXIsIGFiaSwgYXJjaCkgd2hpY2ggeW91IHdhbnQgdG8gbWF0Y2guCiAgICB3aGVlbF90YWdzID0gTm9uZQoKICAgIGRvd25sb2FkYWJsZV9leHRlbnNpb25zID0gc291cmNlX2V4dGVuc2lvbnMgKyAoJy53aGwnLCkKCiAgICBkZWYgX19pbml0X18oc2VsZiwgc2NoZW1lPSdkZWZhdWx0Jyk6CiAgICAgICAgIiIiCiAgICAgICAgSW5pdGlhbGlzZSBhbiBpbnN0YW5jZS4KICAgICAgICA6cGFyYW0gc2NoZW1lOiBCZWNhdXNlIGxvY2F0b3JzIGxvb2sgZm9yIG1vc3QgcmVjZW50IHZlcnNpb25zLCB0aGV5CiAgICAgICAgICAgICAgICAgICAgICAgbmVlZCB0byBrbm93IHRoZSB2ZXJzaW9uIHNjaGVtZSB0byB1c2UuIFRoaXMgc3BlY2lmaWVzCiAgICAgICAgICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgUEVQLXJlY29tbWVuZGVkIHNjaGVtZSAtIHVzZSBgYCdsZWdhY3knYGAKICAgICAgICAgICAgICAgICAgICAgICBpZiB5b3UgbmVlZCB0byBzdXBwb3J0IGV4aXN0aW5nIGRpc3RyaWJ1dGlvbnMgb24gUHlQSS4KICAgICAgICAiIiIKICAgICAgICBzZWxmLl9jYWNoZSA9IHt9CiAgICAgICAgc2VsZi5zY2hlbWUgPSBzY2hlbWUKICAgICAgICAjIEJlY2F1c2Ugb2YgYnVncyBpbiBzb21lIG9mIHRoZSBoYW5kbGVycyBvbiBzb21lIG9mIHRoZSBwbGF0Zm9ybXMsCiAgICAgICAgIyB3ZSB1c2Ugb3VyIG93biBvcGVuZXIgcmF0aGVyIHRoYW4ganVzdCB1c2luZyB1cmxvcGVuLgogICAgICAgIHNlbGYub3BlbmVyID0gYnVpbGRfb3BlbmVyKFJlZGlyZWN0SGFuZGxlcigpKQogICAgICAgICMgSWYgZ2V0X3Byb2plY3QoKSBpcyBjYWxsZWQgZnJvbSBsb2NhdGUoKSwgdGhlIG1hdGNoZXIgaW5zdGFuY2UKICAgICAgICAjIGlzIHNldCBmcm9tIHRoZSByZXF1aXJlbWVudCBwYXNzZWQgdG8gbG9jYXRlKCkuIFNlZSBpc3N1ZSAjMTggZm9yCiAgICAgICAgIyB3aHkgdGhpcyBjYW4gYmUgdXNlZnVsIHRvIGtub3cuCiAgICAgICAgc2VsZi5tYXRjaGVyID0gTm9uZQogICAgICAgIHNlbGYuZXJyb3JzID0gcXVldWUuUXVldWUoKQoKICAgIGRlZiBnZXRfZXJyb3JzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBhbnkgZXJyb3JzIHdoaWNoIGhhdmUgb2NjdXJyZWQuCiAgICAgICAgIiIiCiAgICAgICAgcmVzdWx0ID0gW10KICAgICAgICB3aGlsZSBub3Qgc2VsZi5lcnJvcnMuZW1wdHkoKTogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBlID0gc2VsZi5lcnJvcnMuZ2V0KEZhbHNlKQogICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChlKQogICAgICAgICAgICBleGNlcHQgc2VsZi5lcnJvcnMuRW1wdHk6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBzZWxmLmVycm9ycy50YXNrX2RvbmUoKQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgY2xlYXJfZXJyb3JzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIENsZWFyIGFueSBlcnJvcnMgd2hpY2ggbWF5IGhhdmUgYmVlbiBsb2dnZWQuCiAgICAgICAgIiIiCiAgICAgICAgIyBKdXN0IGdldCB0aGUgZXJyb3JzIGFuZCB0aHJvdyB0aGVtIGF3YXkKICAgICAgICBzZWxmLmdldF9lcnJvcnMoKQoKICAgIGRlZiBjbGVhcl9jYWNoZShzZWxmKToKICAgICAgICBzZWxmLl9jYWNoZS5jbGVhcigpCgogICAgZGVmIF9nZXRfc2NoZW1lKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9zY2hlbWUKCiAgICBkZWYgX3NldF9zY2hlbWUoc2VsZiwgdmFsdWUpOgogICAgICAgIHNlbGYuX3NjaGVtZSA9IHZhbHVlCgogICAgc2NoZW1lID0gcHJvcGVydHkoX2dldF9zY2hlbWUsIF9zZXRfc2NoZW1lKQoKICAgIGRlZiBfZ2V0X3Byb2plY3Qoc2VsZiwgbmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgRm9yIGEgZ2l2ZW4gcHJvamVjdCwgZ2V0IGEgZGljdGlvbmFyeSBtYXBwaW5nIGF2YWlsYWJsZSB2ZXJzaW9ucyB0byBEaXN0cmlidXRpb24KICAgICAgICBpbnN0YW5jZXMuCgogICAgICAgIFRoaXMgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHN1YmNsYXNzZXMuCgogICAgICAgIElmIGNhbGxlZCBmcm9tIGEgbG9jYXRlKCkgcmVxdWVzdCwgc2VsZi5tYXRjaGVyIHdpbGwgYmUgc2V0IHRvIGEKICAgICAgICBtYXRjaGVyIGZvciB0aGUgcmVxdWlyZW1lbnQgdG8gc2F0aXNmeSwgb3RoZXJ3aXNlIGl0IHdpbGwgYmUgTm9uZS4KICAgICAgICAiIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCdQbGVhc2UgaW1wbGVtZW50IGluIHRoZSBzdWJjbGFzcycpCgogICAgZGVmIGdldF9kaXN0cmlidXRpb25fbmFtZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGFsbCB0aGUgZGlzdHJpYnV0aW9uIG5hbWVzIGtub3duIHRvIHRoaXMgbG9jYXRvci4KICAgICAgICAiIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCdQbGVhc2UgaW1wbGVtZW50IGluIHRoZSBzdWJjbGFzcycpCgogICAgZGVmIGdldF9wcm9qZWN0KHNlbGYsIG5hbWUpOgogICAgICAgICIiIgogICAgICAgIEZvciBhIGdpdmVuIHByb2plY3QsIGdldCBhIGRpY3Rpb25hcnkgbWFwcGluZyBhdmFpbGFibGUgdmVyc2lvbnMgdG8gRGlzdHJpYnV0aW9uCiAgICAgICAgaW5zdGFuY2VzLgoKICAgICAgICBUaGlzIGNhbGxzIF9nZXRfcHJvamVjdCB0byBkbyBhbGwgdGhlIHdvcmssIGFuZCBqdXN0IGltcGxlbWVudHMgYSBjYWNoaW5nIGxheWVyIG9uIHRvcC4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLl9jYWNoZSBpcyBOb25lOgogICAgICAgICAgICByZXN1bHQgPSBzZWxmLl9nZXRfcHJvamVjdChuYW1lKQogICAgICAgIGVsaWYgbmFtZSBpbiBzZWxmLl9jYWNoZToKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5fY2FjaGVbbmFtZV0KICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmNsZWFyX2Vycm9ycygpCiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuX2dldF9wcm9qZWN0KG5hbWUpCiAgICAgICAgICAgIHNlbGYuX2NhY2hlW25hbWVdID0gcmVzdWx0CiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBzY29yZV91cmwoc2VsZiwgdXJsKToKICAgICAgICAiIiIKICAgICAgICBHaXZlIGFuIHVybCBhIHNjb3JlIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGNob29zZSBwcmVmZXJyZWQgVVJMcwogICAgICAgIGZvciBhIGdpdmVuIHByb2plY3QgcmVsZWFzZS4KICAgICAgICAiIiIKICAgICAgICB0ID0gdXJscGFyc2UodXJsKQogICAgICAgIGJhc2VuYW1lID0gcG9zaXhwYXRoLmJhc2VuYW1lKHQucGF0aCkKICAgICAgICBjb21wYXRpYmxlID0gVHJ1ZQogICAgICAgIGlzX3doZWVsID0gYmFzZW5hbWUuZW5kc3dpdGgoJy53aGwnKQogICAgICAgIGlmIGlzX3doZWVsOgogICAgICAgICAgICBjb21wYXRpYmxlID0gaXNfY29tcGF0aWJsZShXaGVlbChiYXNlbmFtZSksIHNlbGYud2hlZWxfdGFncykKICAgICAgICByZXR1cm4gKHQuc2NoZW1lICE9ICdodHRwcycsICdweXBpLnB5dGhvbi5vcmcnIGluIHQubmV0bG9jLAogICAgICAgICAgICAgICAgaXNfd2hlZWwsIGNvbXBhdGlibGUsIGJhc2VuYW1lKQoKICAgIGRlZiBwcmVmZXJfdXJsKHNlbGYsIHVybDEsIHVybDIpOgogICAgICAgICIiIgogICAgICAgIENob29zZSBvbmUgb2YgdHdvIFVSTHMgd2hlcmUgYm90aCBhcmUgY2FuZGlkYXRlcyBmb3IgZGlzdHJpYnV0aW9uCiAgICAgICAgYXJjaGl2ZXMgZm9yIHRoZSBzYW1lIHZlcnNpb24gb2YgYSBkaXN0cmlidXRpb24gKGZvciBleGFtcGxlLAogICAgICAgIC50YXIuZ3ogdnMuIHppcCkuCgogICAgICAgIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGZhdm91cnMgaHR0cHM6Ly8gVVJMcyBvdmVyIGh0dHA6Ly8sIGFyY2hpdmVzCiAgICAgICAgZnJvbSBQeVBJIG92ZXIgdGhvc2UgZnJvbSBvdGhlciBsb2NhdGlvbnMsIHdoZWVsIGNvbXBhdGliaWxpdHkgKGlmIGEKICAgICAgICB3aGVlbCkgYW5kIHRoZW4gdGhlIGFyY2hpdmUgbmFtZS4KICAgICAgICAiIiIKICAgICAgICByZXN1bHQgPSB1cmwyCiAgICAgICAgaWYgdXJsMToKICAgICAgICAgICAgczEgPSBzZWxmLnNjb3JlX3VybCh1cmwxKQogICAgICAgICAgICBzMiA9IHNlbGYuc2NvcmVfdXJsKHVybDIpCiAgICAgICAgICAgIGlmIHMxID4gczI6CiAgICAgICAgICAgICAgICByZXN1bHQgPSB1cmwxCiAgICAgICAgICAgIGlmIHJlc3VsdCAhPSB1cmwyOgogICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdOb3QgcmVwbGFjaW5nICVyIHdpdGggJXInLCB1cmwxLCB1cmwyKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdSZXBsYWNpbmcgJXIgd2l0aCAlcicsIHVybDEsIHVybDIpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBzcGxpdF9maWxlbmFtZShzZWxmLCBmaWxlbmFtZSwgcHJvamVjdF9uYW1lKToKICAgICAgICAiIiIKICAgICAgICBBdHRlbXB0IHRvIHNwbGl0IGEgZmlsZW5hbWUgaW4gcHJvamVjdCBuYW1lLCB2ZXJzaW9uIGFuZCBQeXRob24gdmVyc2lvbi4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc3BsaXRfZmlsZW5hbWUoZmlsZW5hbWUsIHByb2plY3RfbmFtZSkKCiAgICBkZWYgY29udmVydF91cmxfdG9fZG93bmxvYWRfaW5mbyhzZWxmLCB1cmwsIHByb2plY3RfbmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgU2VlIGlmIGEgVVJMIGlzIGEgY2FuZGlkYXRlIGZvciBhIGRvd25sb2FkIFVSTCBmb3IgYSBwcm9qZWN0ICh0aGUgVVJMCiAgICAgICAgaGFzIHR5cGljYWxseSBiZWVuIHNjcmFwZWQgZnJvbSBhbiBIVE1MIHBhZ2UpLgoKICAgICAgICBJZiBpdCBpcywgYSBkaWN0aW9uYXJ5IGlzIHJldHVybmVkIHdpdGgga2V5cyAibmFtZSIsICJ2ZXJzaW9uIiwKICAgICAgICAiZmlsZW5hbWUiIGFuZCAidXJsIjsgb3RoZXJ3aXNlLCBOb25lIGlzIHJldHVybmVkLgogICAgICAgICIiIgogICAgICAgIGRlZiBzYW1lX3Byb2plY3QobmFtZTEsIG5hbWUyKToKICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZV9uYW1lKG5hbWUxKSA9PSBub3JtYWxpemVfbmFtZShuYW1lMikKCiAgICAgICAgcmVzdWx0ID0gTm9uZQogICAgICAgIHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBwYXJhbXMsIHF1ZXJ5LCBmcmFnID0gdXJscGFyc2UodXJsKQogICAgICAgIGlmIGZyYWcubG93ZXIoKS5zdGFydHN3aXRoKCdlZ2c9Jyk6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnJXM6IHZlcnNpb24gaGludCBpbiBmcmFnbWVudDogJXInLAogICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdF9uYW1lLCBmcmFnKQogICAgICAgIG0gPSBIQVNIRVJfSEFTSC5tYXRjaChmcmFnKQogICAgICAgIGlmIG06CiAgICAgICAgICAgIGFsZ28sIGRpZ2VzdCA9IG0uZ3JvdXBzKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBhbGdvLCBkaWdlc3QgPSBOb25lLCBOb25lCiAgICAgICAgb3JpZ3BhdGggPSBwYXRoCiAgICAgICAgaWYgcGF0aCBhbmQgcGF0aFstMV0gPT0gJy8nOgogICAgICAgICAgICBwYXRoID0gcGF0aFs6LTFdCiAgICAgICAgaWYgcGF0aC5lbmRzd2l0aCgnLndobCcpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICB3aGVlbCA9IFdoZWVsKHBhdGgpCiAgICAgICAgICAgICAgICBpZiBpc19jb21wYXRpYmxlKHdoZWVsLCBzZWxmLndoZWVsX3RhZ3MpOgogICAgICAgICAgICAgICAgICAgIGlmIHByb2plY3RfbmFtZSBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgPSBzYW1lX3Byb2plY3Qod2hlZWwubmFtZSwgcHJvamVjdF9uYW1lKQogICAgICAgICAgICAgICAgICAgIGlmIGluY2x1ZGU6CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogd2hlZWwubmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2ZXJzaW9uJzogd2hlZWwudmVyc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmaWxlbmFtZSc6IHdoZWVsLmZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VybCc6IHVybHVucGFyc2UoKHNjaGVtZSwgbmV0bG9jLCBvcmlncGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMsIHF1ZXJ5LCAnJykpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3B5dGhvbi12ZXJzaW9uJzogJywgJy5qb2luKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnLicuam9pbihsaXN0KHZbMjpdKSkgZm9yIHYgaW4gd2hlZWwucHl2ZXJdKSwKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdpbnZhbGlkIHBhdGggZm9yIHdoZWVsOiAlcycsIHBhdGgpCiAgICAgICAgZWxpZiBwYXRoLmVuZHN3aXRoKHNlbGYuZG93bmxvYWRhYmxlX2V4dGVuc2lvbnMpOgogICAgICAgICAgICBwYXRoID0gZmlsZW5hbWUgPSBwb3NpeHBhdGguYmFzZW5hbWUocGF0aCkKICAgICAgICAgICAgZm9yIGV4dCBpbiBzZWxmLmRvd25sb2FkYWJsZV9leHRlbnNpb25zOgogICAgICAgICAgICAgICAgaWYgcGF0aC5lbmRzd2l0aChleHQpOgogICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoWzotbGVuKGV4dCldCiAgICAgICAgICAgICAgICAgICAgdCA9IHNlbGYuc3BsaXRfZmlsZW5hbWUocGF0aCwgcHJvamVjdF9uYW1lKQogICAgICAgICAgICAgICAgICAgIGlmIG5vdCB0OgogICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ05vIG1hdGNoIGZvciBwcm9qZWN0L3ZlcnNpb246ICVzJywgcGF0aCkKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCB2ZXJzaW9uLCBweXZlciA9IHQKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IHByb2plY3RfbmFtZSBvciBzYW1lX3Byb2plY3QocHJvamVjdF9uYW1lLCBuYW1lKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6IG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZlcnNpb24nOiB2ZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmaWxlbmFtZSc6IGZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1cmwnOiB1cmx1bnBhcnNlKChzY2hlbWUsIG5ldGxvYywgb3JpZ3BhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcywgcXVlcnksICcnKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIydwYWNrYWdldHlwZSc6ICdzZGlzdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBweXZlcjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbJ3B5dGhvbi12ZXJzaW9uJ10gPSBweXZlcgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgaWYgcmVzdWx0IGFuZCBhbGdvOgogICAgICAgICAgICByZXN1bHRbJyVzX2RpZ2VzdCcgJSBhbGdvXSA9IGRpZ2VzdAogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgX2dldF9kaWdlc3Qoc2VsZiwgaW5mbyk6CiAgICAgICAgIiIiCiAgICAgICAgR2V0IGEgZGlnZXN0IGZyb20gYSBkaWN0aW9uYXJ5IGJ5IGxvb2tpbmcgYXQga2V5cyBvZiB0aGUgZm9ybQogICAgICAgICdhbGdvX2RpZ2VzdCcuCgogICAgICAgIFJldHVybnMgYSAyLXR1cGxlIChhbGdvLCBkaWdlc3QpIGlmIGZvdW5kLCBlbHNlIE5vbmUuIEN1cnJlbnRseQogICAgICAgIGxvb2tzIG9ubHkgZm9yIFNIQTI1NiwgdGhlbiBNRDUuCiAgICAgICAgIiIiCiAgICAgICAgcmVzdWx0ID0gTm9uZQogICAgICAgIGZvciBhbGdvIGluICgnc2hhMjU2JywgJ21kNScpOgogICAgICAgICAgICBrZXkgPSAnJXNfZGlnZXN0JyAlIGFsZ28KICAgICAgICAgICAgaWYga2V5IGluIGluZm86CiAgICAgICAgICAgICAgICByZXN1bHQgPSAoYWxnbywgaW5mb1trZXldKQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIF91cGRhdGVfdmVyc2lvbl9kYXRhKHNlbGYsIHJlc3VsdCwgaW5mbyk6CiAgICAgICAgIiIiCiAgICAgICAgVXBkYXRlIGEgcmVzdWx0IGRpY3Rpb25hcnkgKHRoZSBmaW5hbCByZXN1bHQgZnJvbSBfZ2V0X3Byb2plY3QpIHdpdGggYQogICAgICAgIGRpY3Rpb25hcnkgZm9yIGEgc3BlY2lmaWMgdmVyc2lvbiwgd2hpY2ggdHlwaWNhbGx5IGhvbGRzIGluZm9ybWF0aW9uCiAgICAgICAgZ2xlYW5lZCBmcm9tIGEgZmlsZW5hbWUgb3IgVVJMIGZvciBhbiBhcmNoaXZlIGZvciB0aGUgZGlzdHJpYnV0aW9uLgogICAgICAgICIiIgogICAgICAgIG5hbWUgPSBpbmZvLnBvcCgnbmFtZScpCiAgICAgICAgdmVyc2lvbiA9IGluZm8ucG9wKCd2ZXJzaW9uJykKICAgICAgICBpZiB2ZXJzaW9uIGluIHJlc3VsdDoKICAgICAgICAgICAgZGlzdCA9IHJlc3VsdFt2ZXJzaW9uXQogICAgICAgICAgICBtZCA9IGRpc3QubWV0YWRhdGEKICAgICAgICBlbHNlOgogICAgICAgICAgICBkaXN0ID0gbWFrZV9kaXN0KG5hbWUsIHZlcnNpb24sIHNjaGVtZT1zZWxmLnNjaGVtZSkKICAgICAgICAgICAgbWQgPSBkaXN0Lm1ldGFkYXRhCiAgICAgICAgZGlzdC5kaWdlc3QgPSBkaWdlc3QgPSBzZWxmLl9nZXRfZGlnZXN0KGluZm8pCiAgICAgICAgdXJsID0gaW5mb1sndXJsJ10KICAgICAgICByZXN1bHRbJ2RpZ2VzdHMnXVt1cmxdID0gZGlnZXN0CiAgICAgICAgaWYgbWQuc291cmNlX3VybCAhPSBpbmZvWyd1cmwnXToKICAgICAgICAgICAgbWQuc291cmNlX3VybCA9IHNlbGYucHJlZmVyX3VybChtZC5zb3VyY2VfdXJsLCB1cmwpCiAgICAgICAgICAgIHJlc3VsdFsndXJscyddLnNldGRlZmF1bHQodmVyc2lvbiwgc2V0KCkpLmFkZCh1cmwpCiAgICAgICAgZGlzdC5sb2NhdG9yID0gc2VsZgogICAgICAgIHJlc3VsdFt2ZXJzaW9uXSA9IGRpc3QKCiAgICBkZWYgbG9jYXRlKHNlbGYsIHJlcXVpcmVtZW50LCBwcmVyZWxlYXNlcz1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgRmluZCB0aGUgbW9zdCByZWNlbnQgZGlzdHJpYnV0aW9uIHdoaWNoIG1hdGNoZXMgdGhlIGdpdmVuCiAgICAgICAgcmVxdWlyZW1lbnQuCgogICAgICAgIDpwYXJhbSByZXF1aXJlbWVudDogQSByZXF1aXJlbWVudCBvZiB0aGUgZm9ybSAnZm9vICgxLjApJyBvciBwZXJoYXBzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9vICg+PSAxLjAsIDwgMi4wLCAhPSAxLjMpJwogICAgICAgIDpwYXJhbSBwcmVyZWxlYXNlczogSWYgYGBUcnVlYGAsIGFsbG93IHByZS1yZWxlYXNlIHZlcnNpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBsb2NhdGVkLiBPdGhlcndpc2UsIHByZS1yZWxlYXNlIHZlcnNpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgbm90IHJldHVybmVkLgogICAgICAgIDpyZXR1cm46IEEgOmNsYXNzOmBEaXN0cmlidXRpb25gIGluc3RhbmNlLCBvciBgYE5vbmVgYCBpZiBubyBzdWNoCiAgICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9uIGNvdWxkIGJlIGxvY2F0ZWQuCiAgICAgICAgIiIiCiAgICAgICAgcmVzdWx0ID0gTm9uZQogICAgICAgIHIgPSBwYXJzZV9yZXF1aXJlbWVudChyZXF1aXJlbWVudCkKICAgICAgICBpZiByIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ05vdCBhIHZhbGlkIHJlcXVpcmVtZW50OiAlcicgJSByZXF1aXJlbWVudCkKICAgICAgICBzY2hlbWUgPSBnZXRfc2NoZW1lKHNlbGYuc2NoZW1lKQogICAgICAgIHNlbGYubWF0Y2hlciA9IG1hdGNoZXIgPSBzY2hlbWUubWF0Y2hlcihyLnJlcXVpcmVtZW50KQogICAgICAgIGxvZ2dlci5kZWJ1ZygnbWF0Y2hlcjogJXMgKCVzKScsIG1hdGNoZXIsIHR5cGUobWF0Y2hlcikuX19uYW1lX18pCiAgICAgICAgdmVyc2lvbnMgPSBzZWxmLmdldF9wcm9qZWN0KHIubmFtZSkKICAgICAgICBpZiBsZW4odmVyc2lvbnMpID4gMjogICAjIHVybHMgYW5kIGRpZ2VzdHMga2V5cyBhcmUgcHJlc2VudAogICAgICAgICAgICAjIHNvbWV0aW1lcywgdmVyc2lvbnMgYXJlIGludmFsaWQKICAgICAgICAgICAgc2xpc3QgPSBbXQogICAgICAgICAgICB2Y2xzID0gbWF0Y2hlci52ZXJzaW9uX2NsYXNzCiAgICAgICAgICAgIGZvciBrIGluIHZlcnNpb25zOgogICAgICAgICAgICAgICAgaWYgayBpbiAoJ3VybHMnLCAnZGlnZXN0cycpOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgaWYgbm90IG1hdGNoZXIubWF0Y2goayk6CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnJXMgZGlkIG5vdCBtYXRjaCAlcicsIG1hdGNoZXIsIGspCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgaWYgcHJlcmVsZWFzZXMgb3Igbm90IHZjbHMoaykuaXNfcHJlcmVsZWFzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsaXN0LmFwcGVuZChrKQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdza2lwcGluZyBwcmUtcmVsZWFzZSAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZlcnNpb24gJXMgb2YgJXMnLCBrLCBtYXRjaGVyLm5hbWUpCiAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ2Vycm9yIG1hdGNoaW5nICVzIHdpdGggJXInLCBtYXRjaGVyLCBrKQogICAgICAgICAgICAgICAgICAgIHBhc3MgIyBzbGlzdC5hcHBlbmQoaykKICAgICAgICAgICAgaWYgbGVuKHNsaXN0KSA+IDE6CiAgICAgICAgICAgICAgICBzbGlzdCA9IHNvcnRlZChzbGlzdCwga2V5PXNjaGVtZS5rZXkpCiAgICAgICAgICAgIGlmIHNsaXN0OgogICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdzb3J0ZWQgbGlzdDogJXMnLCBzbGlzdCkKICAgICAgICAgICAgICAgIHZlcnNpb24gPSBzbGlzdFstMV0KICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZlcnNpb25zW3ZlcnNpb25dCiAgICAgICAgaWYgcmVzdWx0OgogICAgICAgICAgICBpZiByLmV4dHJhczoKICAgICAgICAgICAgICAgIHJlc3VsdC5leHRyYXMgPSByLmV4dHJhcwogICAgICAgICAgICByZXN1bHQuZG93bmxvYWRfdXJscyA9IHZlcnNpb25zLmdldCgndXJscycsIHt9KS5nZXQodmVyc2lvbiwgc2V0KCkpCiAgICAgICAgICAgIGQgPSB7fQogICAgICAgICAgICBzZCA9IHZlcnNpb25zLmdldCgnZGlnZXN0cycsIHt9KQogICAgICAgICAgICBmb3IgdXJsIGluIHJlc3VsdC5kb3dubG9hZF91cmxzOgogICAgICAgICAgICAgICAgaWYgdXJsIGluIHNkOgogICAgICAgICAgICAgICAgICAgIGRbdXJsXSA9IHNkW3VybF0KICAgICAgICAgICAgcmVzdWx0LmRpZ2VzdHMgPSBkCiAgICAgICAgc2VsZi5tYXRjaGVyID0gTm9uZQogICAgICAgIHJldHVybiByZXN1bHQKCgpjbGFzcyBQeVBJUlBDTG9jYXRvcihMb2NhdG9yKToKICAgICIiIgogICAgVGhpcyBsb2NhdG9yIHVzZXMgWE1MLVJQQyB0byBsb2NhdGUgZGlzdHJpYnV0aW9ucy4gSXQgdGhlcmVmb3JlCiAgICBjYW5ub3QgYmUgdXNlZCB3aXRoIHNpbXBsZSBtaXJyb3JzICh0aGF0IG9ubHkgbWlycm9yIGZpbGUgY29udGVudCkuCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB1cmwsICoqa3dhcmdzKToKICAgICAgICAiIiIKICAgICAgICBJbml0aWFsaXNlIGFuIGluc3RhbmNlLgoKICAgICAgICA6cGFyYW0gdXJsOiBUaGUgVVJMIHRvIHVzZSBmb3IgWE1MLVJQQy4KICAgICAgICA6cGFyYW0ga3dhcmdzOiBQYXNzZWQgdG8gdGhlIHN1cGVyY2xhc3MgY29uc3RydWN0b3IuCiAgICAgICAgIiIiCiAgICAgICAgc3VwZXIoUHlQSVJQQ0xvY2F0b3IsIHNlbGYpLl9faW5pdF9fKCoqa3dhcmdzKQogICAgICAgIHNlbGYuYmFzZV91cmwgPSB1cmwKICAgICAgICBzZWxmLmNsaWVudCA9IFNlcnZlclByb3h5KHVybCwgdGltZW91dD0zLjApCgogICAgZGVmIGdldF9kaXN0cmlidXRpb25fbmFtZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGFsbCB0aGUgZGlzdHJpYnV0aW9uIG5hbWVzIGtub3duIHRvIHRoaXMgbG9jYXRvci4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2V0KHNlbGYuY2xpZW50Lmxpc3RfcGFja2FnZXMoKSkKCiAgICBkZWYgX2dldF9wcm9qZWN0KHNlbGYsIG5hbWUpOgogICAgICAgIHJlc3VsdCA9IHsndXJscyc6IHt9LCAnZGlnZXN0cyc6IHt9fQogICAgICAgIHZlcnNpb25zID0gc2VsZi5jbGllbnQucGFja2FnZV9yZWxlYXNlcyhuYW1lLCBUcnVlKQogICAgICAgIGZvciB2IGluIHZlcnNpb25zOgogICAgICAgICAgICB1cmxzID0gc2VsZi5jbGllbnQucmVsZWFzZV91cmxzKG5hbWUsIHYpCiAgICAgICAgICAgIGRhdGEgPSBzZWxmLmNsaWVudC5yZWxlYXNlX2RhdGEobmFtZSwgdikKICAgICAgICAgICAgbWV0YWRhdGEgPSBNZXRhZGF0YShzY2hlbWU9c2VsZi5zY2hlbWUpCiAgICAgICAgICAgIG1ldGFkYXRhLm5hbWUgPSBkYXRhWyduYW1lJ10KICAgICAgICAgICAgbWV0YWRhdGEudmVyc2lvbiA9IGRhdGFbJ3ZlcnNpb24nXQogICAgICAgICAgICBtZXRhZGF0YS5saWNlbnNlID0gZGF0YS5nZXQoJ2xpY2Vuc2UnKQogICAgICAgICAgICBtZXRhZGF0YS5rZXl3b3JkcyA9IGRhdGEuZ2V0KCdrZXl3b3JkcycsIFtdKQogICAgICAgICAgICBtZXRhZGF0YS5zdW1tYXJ5ID0gZGF0YS5nZXQoJ3N1bW1hcnknKQogICAgICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uKG1ldGFkYXRhKQogICAgICAgICAgICBpZiB1cmxzOgogICAgICAgICAgICAgICAgaW5mbyA9IHVybHNbMF0KICAgICAgICAgICAgICAgIG1ldGFkYXRhLnNvdXJjZV91cmwgPSBpbmZvWyd1cmwnXQogICAgICAgICAgICAgICAgZGlzdC5kaWdlc3QgPSBzZWxmLl9nZXRfZGlnZXN0KGluZm8pCiAgICAgICAgICAgICAgICBkaXN0LmxvY2F0b3IgPSBzZWxmCiAgICAgICAgICAgICAgICByZXN1bHRbdl0gPSBkaXN0CiAgICAgICAgICAgICAgICBmb3IgaW5mbyBpbiB1cmxzOgogICAgICAgICAgICAgICAgICAgIHVybCA9IGluZm9bJ3VybCddCiAgICAgICAgICAgICAgICAgICAgZGlnZXN0ID0gc2VsZi5fZ2V0X2RpZ2VzdChpbmZvKQogICAgICAgICAgICAgICAgICAgIHJlc3VsdFsndXJscyddLnNldGRlZmF1bHQodiwgc2V0KCkpLmFkZCh1cmwpCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0WydkaWdlc3RzJ11bdXJsXSA9IGRpZ2VzdAogICAgICAgIHJldHVybiByZXN1bHQKCmNsYXNzIFB5UElKU09OTG9jYXRvcihMb2NhdG9yKToKICAgICIiIgogICAgVGhpcyBsb2NhdG9yIHVzZXMgUHlQSSdzIEpTT04gaW50ZXJmYWNlLiBJdCdzIHZlcnkgbGltaXRlZCBpbiBmdW5jdGlvbmFsaXR5CiAgICBhbmQgcHJvYmFibHkgbm90IHdvcnRoIHVzaW5nLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgdXJsLCAqKmt3YXJncyk6CiAgICAgICAgc3VwZXIoUHlQSUpTT05Mb2NhdG9yLCBzZWxmKS5fX2luaXRfXygqKmt3YXJncykKICAgICAgICBzZWxmLmJhc2VfdXJsID0gZW5zdXJlX3NsYXNoKHVybCkKCiAgICBkZWYgZ2V0X2Rpc3RyaWJ1dGlvbl9uYW1lcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gYWxsIHRoZSBkaXN0cmlidXRpb24gbmFtZXMga25vd24gdG8gdGhpcyBsb2NhdG9yLgogICAgICAgICIiIgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoJ05vdCBhdmFpbGFibGUgZnJvbSB0aGlzIGxvY2F0b3InKQoKICAgIGRlZiBfZ2V0X3Byb2plY3Qoc2VsZiwgbmFtZSk6CiAgICAgICAgcmVzdWx0ID0geyd1cmxzJzoge30sICdkaWdlc3RzJzoge319CiAgICAgICAgdXJsID0gdXJsam9pbihzZWxmLmJhc2VfdXJsLCAnJXMvanNvbicgJSBxdW90ZShuYW1lKSkKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJlc3AgPSBzZWxmLm9wZW5lci5vcGVuKHVybCkKICAgICAgICAgICAgZGF0YSA9IHJlc3AucmVhZCgpLmRlY29kZSgpICMgZm9yIG5vdwogICAgICAgICAgICBkID0ganNvbi5sb2FkcyhkYXRhKQogICAgICAgICAgICBtZCA9IE1ldGFkYXRhKHNjaGVtZT1zZWxmLnNjaGVtZSkKICAgICAgICAgICAgZGF0YSA9IGRbJ2luZm8nXQogICAgICAgICAgICBtZC5uYW1lID0gZGF0YVsnbmFtZSddCiAgICAgICAgICAgIG1kLnZlcnNpb24gPSBkYXRhWyd2ZXJzaW9uJ10KICAgICAgICAgICAgbWQubGljZW5zZSA9IGRhdGEuZ2V0KCdsaWNlbnNlJykKICAgICAgICAgICAgbWQua2V5d29yZHMgPSBkYXRhLmdldCgna2V5d29yZHMnLCBbXSkKICAgICAgICAgICAgbWQuc3VtbWFyeSA9IGRhdGEuZ2V0KCdzdW1tYXJ5JykKICAgICAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbihtZCkKICAgICAgICAgICAgZGlzdC5sb2NhdG9yID0gc2VsZgogICAgICAgICAgICB1cmxzID0gZFsndXJscyddCiAgICAgICAgICAgIHJlc3VsdFttZC52ZXJzaW9uXSA9IGRpc3QKICAgICAgICAgICAgZm9yIGluZm8gaW4gZFsndXJscyddOgogICAgICAgICAgICAgICAgdXJsID0gaW5mb1sndXJsJ10KICAgICAgICAgICAgICAgIGRpc3QuZG93bmxvYWRfdXJscy5hZGQodXJsKQogICAgICAgICAgICAgICAgZGlzdC5kaWdlc3RzW3VybF0gPSBzZWxmLl9nZXRfZGlnZXN0KGluZm8pCiAgICAgICAgICAgICAgICByZXN1bHRbJ3VybHMnXS5zZXRkZWZhdWx0KG1kLnZlcnNpb24sIHNldCgpKS5hZGQodXJsKQogICAgICAgICAgICAgICAgcmVzdWx0WydkaWdlc3RzJ11bdXJsXSA9IHNlbGYuX2dldF9kaWdlc3QoaW5mbykKICAgICAgICAgICAgIyBOb3cgZ2V0IG90aGVyIHJlbGVhc2VzCiAgICAgICAgICAgIGZvciB2ZXJzaW9uLCBpbmZvcyBpbiBkWydyZWxlYXNlcyddLml0ZW1zKCk6CiAgICAgICAgICAgICAgICBpZiB2ZXJzaW9uID09IG1kLnZlcnNpb246CiAgICAgICAgICAgICAgICAgICAgY29udGludWUgICAgIyBhbHJlYWR5IGRvbmUKICAgICAgICAgICAgICAgIG9tZCA9IE1ldGFkYXRhKHNjaGVtZT1zZWxmLnNjaGVtZSkKICAgICAgICAgICAgICAgIG9tZC5uYW1lID0gbWQubmFtZQogICAgICAgICAgICAgICAgb21kLnZlcnNpb24gPSB2ZXJzaW9uCiAgICAgICAgICAgICAgICBvZGlzdCA9IERpc3RyaWJ1dGlvbihvbWQpCiAgICAgICAgICAgICAgICBvZGlzdC5sb2NhdG9yID0gc2VsZgogICAgICAgICAgICAgICAgcmVzdWx0W3ZlcnNpb25dID0gb2Rpc3QKICAgICAgICAgICAgICAgIGZvciBpbmZvIGluIGluZm9zOgogICAgICAgICAgICAgICAgICAgIHVybCA9IGluZm9bJ3VybCddCiAgICAgICAgICAgICAgICAgICAgb2Rpc3QuZG93bmxvYWRfdXJscy5hZGQodXJsKQogICAgICAgICAgICAgICAgICAgIG9kaXN0LmRpZ2VzdHNbdXJsXSA9IHNlbGYuX2dldF9kaWdlc3QoaW5mbykKICAgICAgICAgICAgICAgICAgICByZXN1bHRbJ3VybHMnXS5zZXRkZWZhdWx0KHZlcnNpb24sIHNldCgpKS5hZGQodXJsKQogICAgICAgICAgICAgICAgICAgIHJlc3VsdFsnZGlnZXN0cyddW3VybF0gPSBzZWxmLl9nZXRfZGlnZXN0KGluZm8pCiMgICAgICAgICAgICBmb3IgaW5mbyBpbiB1cmxzOgojICAgICAgICAgICAgICAgIG1kLnNvdXJjZV91cmwgPSBpbmZvWyd1cmwnXQojICAgICAgICAgICAgICAgIGRpc3QuZGlnZXN0ID0gc2VsZi5fZ2V0X2RpZ2VzdChpbmZvKQojICAgICAgICAgICAgICAgIGRpc3QubG9jYXRvciA9IHNlbGYKIyAgICAgICAgICAgICAgICBmb3IgaW5mbyBpbiB1cmxzOgojICAgICAgICAgICAgICAgICAgICB1cmwgPSBpbmZvWyd1cmwnXQojICAgICAgICAgICAgICAgICAgICByZXN1bHRbJ3VybHMnXS5zZXRkZWZhdWx0KG1kLnZlcnNpb24sIHNldCgpKS5hZGQodXJsKQojICAgICAgICAgICAgICAgICAgICByZXN1bHRbJ2RpZ2VzdHMnXVt1cmxdID0gc2VsZi5fZ2V0X2RpZ2VzdChpbmZvKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgc2VsZi5lcnJvcnMucHV0KHRleHRfdHlwZShlKSkKICAgICAgICAgICAgbG9nZ2VyLmV4Y2VwdGlvbignSlNPTiBmZXRjaCBmYWlsZWQ6ICVzJywgZSkKICAgICAgICByZXR1cm4gcmVzdWx0CgoKY2xhc3MgUGFnZShvYmplY3QpOgogICAgIiIiCiAgICBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBzY3JhcGVkIEhUTUwgcGFnZS4KICAgICIiIgogICAgIyBUaGUgZm9sbG93aW5nIHNsaWdodGx5IGhhaXJ5LWxvb2tpbmcgcmVnZXgganVzdCBsb29rcyBmb3IgdGhlIGNvbnRlbnRzIG9mCiAgICAjIGFuIGFuY2hvciBsaW5rLCB3aGljaCBoYXMgYW4gYXR0cmlidXRlICJocmVmIiBlaXRoZXIgaW1tZWRpYXRlbHkgcHJlY2VkZWQKICAgICMgb3IgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSAicmVsIiBhdHRyaWJ1dGUuIFRoZSBhdHRyaWJ1dGUgdmFsdWVzIGNhbiBiZQogICAgIyBkZWNsYXJlZCB3aXRoIGRvdWJsZSBxdW90ZXMsIHNpbmdsZSBxdW90ZXMgb3Igbm8gcXVvdGVzIC0gd2hpY2ggbGVhZHMgdG8KICAgICMgdGhlIGxlbmd0aCBvZiB0aGUgZXhwcmVzc2lvbi4KICAgIF9ocmVmID0gcmUuY29tcGlsZSgiIiIKKHJlbFxzKj1ccyooPzoiKD9QPHJlbDE+W14iXSopInwnKD9QPHJlbDI+W14nXSopJ3woP1A8cmVsMz5bXj5cc1xuXSopKVxzKyk/CmhyZWZccyo9XHMqKD86Iig/UDx1cmwxPlteIl0qKSJ8Jyg/UDx1cmwyPlteJ10qKSd8KD9QPHVybDM+W14+XHNcbl0qKSkKKFxzK3JlbFxzKj1ccyooPzoiKD9QPHJlbDQ+W14iXSopInwnKD9QPHJlbDU+W14nXSopJ3woP1A8cmVsNj5bXj5cc1xuXSopKSk/CiIiIiwgcmUuSSB8IHJlLlMgfCByZS5YKQogICAgX2Jhc2UgPSByZS5jb21waWxlKHIiIiI8YmFzZVxzK2hyZWZccyo9XHMqWyciXT8oW14nIj5dKykiIiIsIHJlLkkgfCByZS5TKQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYXRhLCB1cmwpOgogICAgICAgICIiIgogICAgICAgIEluaXRpYWxpc2UgYW4gaW5zdGFuY2Ugd2l0aCB0aGUgVW5pY29kZSBwYWdlIGNvbnRlbnRzIGFuZCB0aGUgVVJMIHRoZXkKICAgICAgICBjYW1lIGZyb20uCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5kYXRhID0gZGF0YQogICAgICAgIHNlbGYuYmFzZV91cmwgPSBzZWxmLnVybCA9IHVybAogICAgICAgIG0gPSBzZWxmLl9iYXNlLnNlYXJjaChzZWxmLmRhdGEpCiAgICAgICAgaWYgbToKICAgICAgICAgICAgc2VsZi5iYXNlX3VybCA9IG0uZ3JvdXAoMSkKCiAgICBfY2xlYW5fcmUgPSByZS5jb21waWxlKHInW15hLXowLTkkJissLzo7PT9ALiMlX1xcfC1dJywgcmUuSSkKCiAgICBAY2FjaGVkX3Byb3BlcnR5CiAgICBkZWYgbGlua3Moc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIHRoZSBVUkxzIG9mIGFsbCB0aGUgbGlua3Mgb24gYSBwYWdlIHRvZ2V0aGVyIHdpdGggaW5mb3JtYXRpb24KICAgICAgICBhYm91dCB0aGVpciAicmVsIiBhdHRyaWJ1dGUsIGZvciBkZXRlcm1pbmluZyB3aGljaCBvbmVzIHRvIHRyZWF0IGFzCiAgICAgICAgZG93bmxvYWRzIGFuZCB3aGljaCBvbmVzIHRvIHF1ZXVlIGZvciBmdXJ0aGVyIHNjcmFwaW5nLgogICAgICAgICIiIgogICAgICAgIGRlZiBjbGVhbih1cmwpOgogICAgICAgICAgICAiVGlkeSB1cCBhbiBVUkwuIgogICAgICAgICAgICBzY2hlbWUsIG5ldGxvYywgcGF0aCwgcGFyYW1zLCBxdWVyeSwgZnJhZyA9IHVybHBhcnNlKHVybCkKICAgICAgICAgICAgcmV0dXJuIHVybHVucGFyc2UoKHNjaGVtZSwgbmV0bG9jLCBxdW90ZShwYXRoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcywgcXVlcnksIGZyYWcpKQoKICAgICAgICByZXN1bHQgPSBzZXQoKQogICAgICAgIGZvciBtYXRjaCBpbiBzZWxmLl9ocmVmLmZpbmRpdGVyKHNlbGYuZGF0YSk6CiAgICAgICAgICAgIGQgPSBtYXRjaC5ncm91cGRpY3QoJycpCiAgICAgICAgICAgIHJlbCA9IChkWydyZWwxJ10gb3IgZFsncmVsMiddIG9yIGRbJ3JlbDMnXSBvcgogICAgICAgICAgICAgICAgICAgZFsncmVsNCddIG9yIGRbJ3JlbDUnXSBvciBkWydyZWw2J10pCiAgICAgICAgICAgIHVybCA9IGRbJ3VybDEnXSBvciBkWyd1cmwyJ10gb3IgZFsndXJsMyddCiAgICAgICAgICAgIHVybCA9IHVybGpvaW4oc2VsZi5iYXNlX3VybCwgdXJsKQogICAgICAgICAgICB1cmwgPSB1bmVzY2FwZSh1cmwpCiAgICAgICAgICAgIHVybCA9IHNlbGYuX2NsZWFuX3JlLnN1YihsYW1iZGEgbTogJyUlJTJ4JyAlIG9yZChtLmdyb3VwKDApKSwgdXJsKQogICAgICAgICAgICByZXN1bHQuYWRkKCh1cmwsIHJlbCkpCiAgICAgICAgIyBXZSBzb3J0IHRoZSByZXN1bHQsIGhvcGluZyB0byBicmluZyB0aGUgbW9zdCByZWNlbnQgdmVyc2lvbnMKICAgICAgICAjIHRvIHRoZSBmcm9udAogICAgICAgIHJlc3VsdCA9IHNvcnRlZChyZXN1bHQsIGtleT1sYW1iZGEgdDogdFswXSwgcmV2ZXJzZT1UcnVlKQogICAgICAgIHJldHVybiByZXN1bHQKCgpjbGFzcyBTaW1wbGVTY3JhcGluZ0xvY2F0b3IoTG9jYXRvcik6CiAgICAiIiIKICAgIEEgbG9jYXRvciB3aGljaCBzY3JhcGVzIEhUTUwgcGFnZXMgdG8gbG9jYXRlIGRvd25sb2FkcyBmb3IgYSBkaXN0cmlidXRpb24uCiAgICBUaGlzIHJ1bnMgbXVsdGlwbGUgdGhyZWFkcyB0byBkbyB0aGUgSS9POyBwZXJmb3JtYW5jZSBpcyBhdCBsZWFzdCBhcyBnb29kCiAgICBhcyBwaXAncyBQYWNrYWdlRmluZGVyLCB3aGljaCB3b3JrcyBpbiBhbiBhbmFsb2dvdXMgZmFzaGlvbi4KICAgICIiIgoKICAgICMgVGhlc2UgYXJlIHVzZWQgdG8gZGVhbCB3aXRoIHZhcmlvdXMgQ29udGVudC1FbmNvZGluZyBzY2hlbWVzLgogICAgZGVjb2RlcnMgPSB7CiAgICAgICAgJ2RlZmxhdGUnOiB6bGliLmRlY29tcHJlc3MsCiAgICAgICAgJ2d6aXAnOiBsYW1iZGEgYjogZ3ppcC5HemlwRmlsZShmaWxlb2JqPUJ5dGVzSU8oZCkpLnJlYWQoKSwKICAgICAgICAnbm9uZSc6IGxhbWJkYSBiOiBiLAogICAgfQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB1cmwsIHRpbWVvdXQ9Tm9uZSwgbnVtX3dvcmtlcnM9MTAsICoqa3dhcmdzKToKICAgICAgICAiIiIKICAgICAgICBJbml0aWFsaXNlIGFuIGluc3RhbmNlLgogICAgICAgIDpwYXJhbSB1cmw6IFRoZSByb290IFVSTCB0byB1c2UgZm9yIHNjcmFwaW5nLgogICAgICAgIDpwYXJhbSB0aW1lb3V0OiBUaGUgdGltZW91dCwgaW4gc2Vjb25kcywgdG8gYmUgYXBwbGllZCB0byByZXF1ZXN0cy4KICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBkZWZhdWx0cyB0byBgYE5vbmVgYCAobm8gdGltZW91dCBzcGVjaWZpZWQpLgogICAgICAgIDpwYXJhbSBudW1fd29ya2VyczogVGhlIG51bWJlciBvZiB3b3JrZXIgdGhyZWFkcyB5b3Ugd2FudCB0byBkbyBJL08sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGRlZmF1bHRzIHRvIDEwLgogICAgICAgIDpwYXJhbSBrd2FyZ3M6IFBhc3NlZCB0byB0aGUgc3VwZXJjbGFzcy4KICAgICAgICAiIiIKICAgICAgICBzdXBlcihTaW1wbGVTY3JhcGluZ0xvY2F0b3IsIHNlbGYpLl9faW5pdF9fKCoqa3dhcmdzKQogICAgICAgIHNlbGYuYmFzZV91cmwgPSBlbnN1cmVfc2xhc2godXJsKQogICAgICAgIHNlbGYudGltZW91dCA9IHRpbWVvdXQKICAgICAgICBzZWxmLl9wYWdlX2NhY2hlID0ge30KICAgICAgICBzZWxmLl9zZWVuID0gc2V0KCkKICAgICAgICBzZWxmLl90b19mZXRjaCA9IHF1ZXVlLlF1ZXVlKCkKICAgICAgICBzZWxmLl9iYWRfaG9zdHMgPSBzZXQoKQogICAgICAgIHNlbGYuc2tpcF9leHRlcm5hbHMgPSBGYWxzZQogICAgICAgIHNlbGYubnVtX3dvcmtlcnMgPSBudW1fd29ya2VycwogICAgICAgIHNlbGYuX2xvY2sgPSB0aHJlYWRpbmcuUkxvY2soKQogICAgICAgICMgU2VlIGlzc3VlICM0NTogd2UgbmVlZCB0byBiZSByZXNpbGllbnQgd2hlbiB0aGUgbG9jYXRvciBpcyB1c2VkCiAgICAgICAgIyBpbiBhIHRocmVhZCwgZS5nLiB3aXRoIGNvbmN1cnJlbnQuZnV0dXJlcy4gV2UgY2FuJ3QgdXNlIHNlbGYuX2xvY2sKICAgICAgICAjIGFzIGl0IGlzIGZvciBjb29yZGluYXRpbmcgb3VyIGludGVybmFsIHRocmVhZHMgLSB0aGUgb25lcyBjcmVhdGVkCiAgICAgICAgIyBpbiBfcHJlcGFyZV90aHJlYWRzLgogICAgICAgIHNlbGYuX2dwbG9jayA9IHRocmVhZGluZy5STG9jaygpCgogICAgZGVmIF9wcmVwYXJlX3RocmVhZHMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGhyZWFkcyBhcmUgY3JlYXRlZCBvbmx5IHdoZW4gZ2V0X3Byb2plY3QgaXMgY2FsbGVkLCBhbmQgdGVybWluYXRlCiAgICAgICAgYmVmb3JlIGl0IHJldHVybnMuIFRoZXkgYXJlIHRoZXJlIHByaW1hcmlseSB0byBwYXJhbGxlbGlzZSBJL08gKGkuZS4KICAgICAgICBmZXRjaGluZyB3ZWIgcGFnZXMpLgogICAgICAgICIiIgogICAgICAgIHNlbGYuX3RocmVhZHMgPSBbXQogICAgICAgIGZvciBpIGluIHJhbmdlKHNlbGYubnVtX3dvcmtlcnMpOgogICAgICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9c2VsZi5fZmV0Y2gpCiAgICAgICAgICAgIHQuc2V0RGFlbW9uKFRydWUpCiAgICAgICAgICAgIHQuc3RhcnQoKQogICAgICAgICAgICBzZWxmLl90aHJlYWRzLmFwcGVuZCh0KQoKICAgIGRlZiBfd2FpdF90aHJlYWRzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlbGwgYWxsIHRoZSB0aHJlYWRzIHRvIHRlcm1pbmF0ZSAoYnkgc2VuZGluZyBhIHNlbnRpbmVsIHZhbHVlKSBhbmQKICAgICAgICB3YWl0IGZvciB0aGVtIHRvIGRvIHNvLgogICAgICAgICIiIgogICAgICAgICMgTm90ZSB0aGF0IHlvdSBuZWVkIHR3byBsb29wcywgc2luY2UgeW91IGNhbid0IHNheSB3aGljaAogICAgICAgICMgdGhyZWFkIHdpbGwgZ2V0IGVhY2ggc2VudGluZWwKICAgICAgICBmb3IgdCBpbiBzZWxmLl90aHJlYWRzOgogICAgICAgICAgICBzZWxmLl90b19mZXRjaC5wdXQoTm9uZSkgICAgIyBzZW50aW5lbAogICAgICAgIGZvciB0IGluIHNlbGYuX3RocmVhZHM6CiAgICAgICAgICAgIHQuam9pbigpCiAgICAgICAgc2VsZi5fdGhyZWFkcyA9IFtdCgogICAgZGVmIF9nZXRfcHJvamVjdChzZWxmLCBuYW1lKToKICAgICAgICByZXN1bHQgPSB7J3VybHMnOiB7fSwgJ2RpZ2VzdHMnOiB7fX0KICAgICAgICB3aXRoIHNlbGYuX2dwbG9jazoKICAgICAgICAgICAgc2VsZi5yZXN1bHQgPSByZXN1bHQKICAgICAgICAgICAgc2VsZi5wcm9qZWN0X25hbWUgPSBuYW1lCiAgICAgICAgICAgIHVybCA9IHVybGpvaW4oc2VsZi5iYXNlX3VybCwgJyVzLycgJSBxdW90ZShuYW1lKSkKICAgICAgICAgICAgc2VsZi5fc2Vlbi5jbGVhcigpCiAgICAgICAgICAgIHNlbGYuX3BhZ2VfY2FjaGUuY2xlYXIoKQogICAgICAgICAgICBzZWxmLl9wcmVwYXJlX3RocmVhZHMoKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1F1ZXVlaW5nICVzJywgdXJsKQogICAgICAgICAgICAgICAgc2VsZi5fdG9fZmV0Y2gucHV0KHVybCkKICAgICAgICAgICAgICAgIHNlbGYuX3RvX2ZldGNoLmpvaW4oKQogICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgc2VsZi5fd2FpdF90aHJlYWRzKCkKICAgICAgICAgICAgZGVsIHNlbGYucmVzdWx0CiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIHBsYXRmb3JtX2RlcGVuZGVudCA9IHJlLmNvbXBpbGUocidcYihsaW51eC0oaVxkODZ8eDg2XzY0fGFybVx3Kyl8JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByJ3dpbigzMnwtYW1kNjQpfG1hY29zeC0/XGQrKVxiJywgcmUuSSkKCiAgICBkZWYgX2lzX3BsYXRmb3JtX2RlcGVuZGVudChzZWxmLCB1cmwpOgogICAgICAgICIiIgogICAgICAgIERvZXMgYW4gVVJMIHJlZmVyIHRvIGEgcGxhdGZvcm0tc3BlY2lmaWMgZG93bmxvYWQ/CiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYucGxhdGZvcm1fZGVwZW5kZW50LnNlYXJjaCh1cmwpCgogICAgZGVmIF9wcm9jZXNzX2Rvd25sb2FkKHNlbGYsIHVybCk6CiAgICAgICAgIiIiCiAgICAgICAgU2VlIGlmIGFuIFVSTCBpcyBhIHN1aXRhYmxlIGRvd25sb2FkIGZvciBhIHByb2plY3QuCgogICAgICAgIElmIGl0IGlzLCByZWdpc3RlciBpbmZvcm1hdGlvbiBpbiB0aGUgcmVzdWx0IGRpY3Rpb25hcnkgKGZvcgogICAgICAgIF9nZXRfcHJvamVjdCkgYWJvdXQgdGhlIHNwZWNpZmljIHZlcnNpb24gaXQncyBmb3IuCgogICAgICAgIE5vdGUgdGhhdCB0aGUgcmV0dXJuIHZhbHVlIGlzbid0IGFjdHVhbGx5IHVzZWQgb3RoZXIgdGhhbiBhcyBhIGJvb2xlYW4KICAgICAgICB2YWx1ZS4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLl9pc19wbGF0Zm9ybV9kZXBlbmRlbnQodXJsKToKICAgICAgICAgICAgaW5mbyA9IE5vbmUKICAgICAgICBlbHNlOgogICAgICAgICAgICBpbmZvID0gc2VsZi5jb252ZXJ0X3VybF90b19kb3dubG9hZF9pbmZvKHVybCwgc2VsZi5wcm9qZWN0X25hbWUpCiAgICAgICAgbG9nZ2VyLmRlYnVnKCdwcm9jZXNzX2Rvd25sb2FkOiAlcyAtPiAlcycsIHVybCwgaW5mbykKICAgICAgICBpZiBpbmZvOgogICAgICAgICAgICB3aXRoIHNlbGYuX2xvY2s6ICAgICMgbmVlZGVkIGJlY2F1c2Ugc2VsZi5yZXN1bHQgaXMgc2hhcmVkCiAgICAgICAgICAgICAgICBzZWxmLl91cGRhdGVfdmVyc2lvbl9kYXRhKHNlbGYucmVzdWx0LCBpbmZvKQogICAgICAgIHJldHVybiBpbmZvCgogICAgZGVmIF9zaG91bGRfcXVldWUoc2VsZiwgbGluaywgcmVmZXJyZXIsIHJlbCk6CiAgICAgICAgIiIiCiAgICAgICAgRGV0ZXJtaW5lIHdoZXRoZXIgYSBsaW5rIFVSTCBmcm9tIGEgcmVmZXJyaW5nIHBhZ2UgYW5kIHdpdGggYQogICAgICAgIHBhcnRpY3VsYXIgInJlbCIgYXR0cmlidXRlIHNob3VsZCBiZSBxdWV1ZWQgZm9yIHNjcmFwaW5nLgogICAgICAgICIiIgogICAgICAgIHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBfLCBfLCBfID0gdXJscGFyc2UobGluaykKICAgICAgICBpZiBwYXRoLmVuZHN3aXRoKHNlbGYuc291cmNlX2V4dGVuc2lvbnMgKyBzZWxmLmJpbmFyeV9leHRlbnNpb25zICsKICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXhjbHVkZWRfZXh0ZW5zaW9ucyk6CiAgICAgICAgICAgIHJlc3VsdCA9IEZhbHNlCiAgICAgICAgZWxpZiBzZWxmLnNraXBfZXh0ZXJuYWxzIGFuZCBub3QgbGluay5zdGFydHN3aXRoKHNlbGYuYmFzZV91cmwpOgogICAgICAgICAgICByZXN1bHQgPSBGYWxzZQogICAgICAgIGVsaWYgbm90IHJlZmVycmVyLnN0YXJ0c3dpdGgoc2VsZi5iYXNlX3VybCk6CiAgICAgICAgICAgIHJlc3VsdCA9IEZhbHNlCiAgICAgICAgZWxpZiByZWwgbm90IGluICgnaG9tZXBhZ2UnLCAnZG93bmxvYWQnKToKICAgICAgICAgICAgcmVzdWx0ID0gRmFsc2UKICAgICAgICBlbGlmIHNjaGVtZSBub3QgaW4gKCdodHRwJywgJ2h0dHBzJywgJ2Z0cCcpOgogICAgICAgICAgICByZXN1bHQgPSBGYWxzZQogICAgICAgIGVsaWYgc2VsZi5faXNfcGxhdGZvcm1fZGVwZW5kZW50KGxpbmspOgogICAgICAgICAgICByZXN1bHQgPSBGYWxzZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGhvc3QgPSBuZXRsb2Muc3BsaXQoJzonLCAxKVswXQogICAgICAgICAgICBpZiBob3N0Lmxvd2VyKCkgPT0gJ2xvY2FsaG9zdCc6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBGYWxzZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gVHJ1ZQogICAgICAgIGxvZ2dlci5kZWJ1Zygnc2hvdWxkX3F1ZXVlOiAlcyAoJXMpIGZyb20gJXMgLT4gJXMnLCBsaW5rLCByZWwsCiAgICAgICAgICAgICAgICAgICAgIHJlZmVycmVyLCByZXN1bHQpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBfZmV0Y2goc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgR2V0IGEgVVJMIHRvIGZldGNoIGZyb20gdGhlIHdvcmsgcXVldWUsIGdldCB0aGUgSFRNTCBwYWdlLCBleGFtaW5lIGl0cwogICAgICAgIGxpbmtzIGZvciBkb3dubG9hZCBjYW5kaWRhdGVzIGFuZCBjYW5kaWRhdGVzIGZvciBmdXJ0aGVyIHNjcmFwaW5nLgoKICAgICAgICBUaGlzIGlzIGEgaGFuZHkgbWV0aG9kIHRvIHJ1biBpbiBhIHRocmVhZC4KICAgICAgICAiIiIKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICB1cmwgPSBzZWxmLl90b19mZXRjaC5nZXQoKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBpZiB1cmw6CiAgICAgICAgICAgICAgICAgICAgcGFnZSA9IHNlbGYuZ2V0X3BhZ2UodXJsKQogICAgICAgICAgICAgICAgICAgIGlmIHBhZ2UgaXMgTm9uZTogICAgIyBlLmcuIGFmdGVyIGFuIGVycm9yCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgZm9yIGxpbmssIHJlbCBpbiBwYWdlLmxpbmtzOgogICAgICAgICAgICAgICAgICAgICAgICBpZiBsaW5rIG5vdCBpbiBzZWxmLl9zZWVuOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fc2Vlbi5hZGQobGluaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub3Qgc2VsZi5fcHJvY2Vzc19kb3dubG9hZChsaW5rKSBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9zaG91bGRfcXVldWUobGluaywgdXJsLCByZWwpKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1F1ZXVlaW5nICVzIGZyb20gJXMnLCBsaW5rLCB1cmwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdG9fZmV0Y2gucHV0KGxpbmspCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZTogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgICAgICAgICAgc2VsZi5lcnJvcnMucHV0KHRleHRfdHlwZShlKSkKICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgICMgYWx3YXlzIGRvIHRoaXMsIHRvIGF2b2lkIGhhbmdzIDotKQogICAgICAgICAgICAgICAgc2VsZi5fdG9fZmV0Y2gudGFza19kb25lKCkKICAgICAgICAgICAgaWYgbm90IHVybDoKICAgICAgICAgICAgICAgICNsb2dnZXIuZGVidWcoJ1NlbnRpbmVsIHNlZW4sIHF1aXR0aW5nLicpCiAgICAgICAgICAgICAgICBicmVhawoKICAgIGRlZiBnZXRfcGFnZShzZWxmLCB1cmwpOgogICAgICAgICIiIgogICAgICAgIEdldCB0aGUgSFRNTCBmb3IgYW4gVVJMLCBwb3NzaWJseSBmcm9tIGFuIGluLW1lbW9yeSBjYWNoZS4KCiAgICAgICAgWFhYIFRPRE8gTm90ZTogdGhpcyBjYWNoZSBpcyBuZXZlciBhY3R1YWxseSBjbGVhcmVkLiBJdCdzIGFzc3VtZWQgdGhhdAogICAgICAgIHRoZSBkYXRhIHdvbid0IGdldCBzdGFsZSBvdmVyIHRoZSBsaWZldGltZSBvZiBhIGxvY2F0b3IgaW5zdGFuY2UgKG5vdAogICAgICAgIG5lY2Vzc2FyaWx5IHRydWUgZm9yIHRoZSBkZWZhdWx0X2xvY2F0b3IpLgogICAgICAgICIiIgogICAgICAgICMgaHR0cDovL3BlYWsudGVsZWNvbW11bml0eS5jb20vRGV2Q2VudGVyL0Vhc3lJbnN0YWxsI3BhY2thZ2UtaW5kZXgtYXBpCiAgICAgICAgc2NoZW1lLCBuZXRsb2MsIHBhdGgsIF8sIF8sIF8gPSB1cmxwYXJzZSh1cmwpCiAgICAgICAgaWYgc2NoZW1lID09ICdmaWxlJyBhbmQgb3MucGF0aC5pc2Rpcih1cmwycGF0aG5hbWUocGF0aCkpOgogICAgICAgICAgICB1cmwgPSB1cmxqb2luKGVuc3VyZV9zbGFzaCh1cmwpLCAnaW5kZXguaHRtbCcpCgogICAgICAgIGlmIHVybCBpbiBzZWxmLl9wYWdlX2NhY2hlOgogICAgICAgICAgICByZXN1bHQgPSBzZWxmLl9wYWdlX2NhY2hlW3VybF0KICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdSZXR1cm5pbmcgJXMgZnJvbSBjYWNoZTogJXMnLCB1cmwsIHJlc3VsdCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBob3N0ID0gbmV0bG9jLnNwbGl0KCc6JywgMSlbMF0KICAgICAgICAgICAgcmVzdWx0ID0gTm9uZQogICAgICAgICAgICBpZiBob3N0IGluIHNlbGYuX2JhZF9ob3N0czoKICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnU2tpcHBpbmcgJXMgZHVlIHRvIGJhZCBob3N0ICVzJywgdXJsLCBob3N0KQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmVxID0gUmVxdWVzdCh1cmwsIGhlYWRlcnM9eydBY2NlcHQtZW5jb2RpbmcnOiAnaWRlbnRpdHknfSkKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0ZldGNoaW5nICVzJywgdXJsKQogICAgICAgICAgICAgICAgICAgIHJlc3AgPSBzZWxmLm9wZW5lci5vcGVuKHJlcSwgdGltZW91dD1zZWxmLnRpbWVvdXQpCiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdGZXRjaGVkICVzJywgdXJsKQogICAgICAgICAgICAgICAgICAgIGhlYWRlcnMgPSByZXNwLmluZm8oKQogICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfdHlwZSA9IGhlYWRlcnMuZ2V0KCdDb250ZW50LVR5cGUnLCAnJykKICAgICAgICAgICAgICAgICAgICBpZiBIVE1MX0NPTlRFTlRfVFlQRS5tYXRjaChjb250ZW50X3R5cGUpOgogICAgICAgICAgICAgICAgICAgICAgICBmaW5hbF91cmwgPSByZXNwLmdldHVybCgpCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSByZXNwLnJlYWQoKQogICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZyA9IGhlYWRlcnMuZ2V0KCdDb250ZW50LUVuY29kaW5nJykKICAgICAgICAgICAgICAgICAgICAgICAgaWYgZW5jb2Rpbmc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyID0gc2VsZi5kZWNvZGVyc1tlbmNvZGluZ10gICAjIGZhaWwgaWYgbm90IGZvdW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGVjb2RlcihkYXRhKQogICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZyA9ICd1dGYtOCcKICAgICAgICAgICAgICAgICAgICAgICAgbSA9IENIQVJTRVQuc2VhcmNoKGNvbnRlbnRfdHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nID0gbS5ncm91cCgxKQogICAgICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5kZWNvZGUoZW5jb2RpbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBVbmljb2RlRXJyb3I6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLmRlY29kZSgnbGF0aW4tMScpICAgICMgZmFsbGJhY2sKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gUGFnZShkYXRhLCBmaW5hbF91cmwpCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3BhZ2VfY2FjaGVbZmluYWxfdXJsXSA9IHJlc3VsdAogICAgICAgICAgICAgICAgZXhjZXB0IEhUVFBFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgICAgIGlmIGUuY29kZSAhPSA0MDQ6CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oJ0ZldGNoIGZhaWxlZDogJXM6ICVzJywgdXJsLCBlKQogICAgICAgICAgICAgICAgZXhjZXB0IFVSTEVycm9yIGFzIGU6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKCdGZXRjaCBmYWlsZWQ6ICVzOiAlcycsIHVybCwgZSkKICAgICAgICAgICAgICAgICAgICB3aXRoIHNlbGYuX2xvY2s6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2JhZF9ob3N0cy5hZGQoaG9zdCkKICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZTogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oJ0ZldGNoIGZhaWxlZDogJXM6ICVzJywgdXJsLCBlKQogICAgICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgICAgICBzZWxmLl9wYWdlX2NhY2hlW3VybF0gPSByZXN1bHQgICAjIGV2ZW4gaWYgTm9uZSAoZmFpbHVyZSkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgX2Rpc3RuYW1lX3JlID0gcmUuY29tcGlsZSgnPGEgaHJlZj1bXj5dKj4oW148XSspPCcpCgogICAgZGVmIGdldF9kaXN0cmlidXRpb25fbmFtZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGFsbCB0aGUgZGlzdHJpYnV0aW9uIG5hbWVzIGtub3duIHRvIHRoaXMgbG9jYXRvci4KICAgICAgICAiIiIKICAgICAgICByZXN1bHQgPSBzZXQoKQogICAgICAgIHBhZ2UgPSBzZWxmLmdldF9wYWdlKHNlbGYuYmFzZV91cmwpCiAgICAgICAgaWYgbm90IHBhZ2U6CiAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ1VuYWJsZSB0byBnZXQgJXMnICUgc2VsZi5iYXNlX3VybCkKICAgICAgICBmb3IgbWF0Y2ggaW4gc2VsZi5fZGlzdG5hbWVfcmUuZmluZGl0ZXIocGFnZS5kYXRhKToKICAgICAgICAgICAgcmVzdWx0LmFkZChtYXRjaC5ncm91cCgxKSkKICAgICAgICByZXR1cm4gcmVzdWx0CgpjbGFzcyBEaXJlY3RvcnlMb2NhdG9yKExvY2F0b3IpOgogICAgIiIiCiAgICBUaGlzIGNsYXNzIGxvY2F0ZXMgZGlzdHJpYnV0aW9ucyBpbiBhIGRpcmVjdG9yeSB0cmVlLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGgsICoqa3dhcmdzKToKICAgICAgICAiIiIKICAgICAgICBJbml0aWFsaXNlIGFuIGluc3RhbmNlLgogICAgICAgIDpwYXJhbSBwYXRoOiBUaGUgcm9vdCBvZiB0aGUgZGlyZWN0b3J5IHRyZWUgdG8gc2VhcmNoLgogICAgICAgIDpwYXJhbSBrd2FyZ3M6IFBhc3NlZCB0byB0aGUgc3VwZXJjbGFzcyBjb25zdHJ1Y3RvciwKICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgZm9yOgogICAgICAgICAgICAgICAgICAgICAgICogcmVjdXJzaXZlIC0gaWYgVHJ1ZSAodGhlIGRlZmF1bHQpLCBzdWJkaXJlY3RvcmllcyBhcmUKICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2VkIGludG8uIElmIEZhbHNlLCBvbmx5IHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5CiAgICAgICAgICAgICAgICAgICAgICAgICBpcyBzZWFyY2hlZCwKICAgICAgICAiIiIKICAgICAgICBzZWxmLnJlY3Vyc2l2ZSA9IGt3YXJncy5wb3AoJ3JlY3Vyc2l2ZScsIFRydWUpCiAgICAgICAgc3VwZXIoRGlyZWN0b3J5TG9jYXRvciwgc2VsZikuX19pbml0X18oKiprd2FyZ3MpCiAgICAgICAgcGF0aCA9IG9zLnBhdGguYWJzcGF0aChwYXRoKQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKHBhdGgpOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ05vdCBhIGRpcmVjdG9yeTogJXInICUgcGF0aCkKICAgICAgICBzZWxmLmJhc2VfZGlyID0gcGF0aAoKICAgIGRlZiBzaG91bGRfaW5jbHVkZShzZWxmLCBmaWxlbmFtZSwgcGFyZW50KToKICAgICAgICAiIiIKICAgICAgICBTaG91bGQgYSBmaWxlbmFtZSBiZSBjb25zaWRlcmVkIGFzIGEgY2FuZGlkYXRlIGZvciBhIGRpc3RyaWJ1dGlvbgogICAgICAgIGFyY2hpdmU/IEFzIHdlbGwgYXMgdGhlIGZpbGVuYW1lLCB0aGUgZGlyZWN0b3J5IHdoaWNoIGNvbnRhaW5zIGl0CiAgICAgICAgaXMgcHJvdmlkZWQsIHRob3VnaCBub3QgdXNlZCBieSB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbi4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gZmlsZW5hbWUuZW5kc3dpdGgoc2VsZi5kb3dubG9hZGFibGVfZXh0ZW5zaW9ucykKCiAgICBkZWYgX2dldF9wcm9qZWN0KHNlbGYsIG5hbWUpOgogICAgICAgIHJlc3VsdCA9IHsndXJscyc6IHt9LCAnZGlnZXN0cyc6IHt9fQogICAgICAgIGZvciByb290LCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKHNlbGYuYmFzZV9kaXIpOgogICAgICAgICAgICBmb3IgZm4gaW4gZmlsZXM6CiAgICAgICAgICAgICAgICBpZiBzZWxmLnNob3VsZF9pbmNsdWRlKGZuLCByb290KToKICAgICAgICAgICAgICAgICAgICBmbiA9IG9zLnBhdGguam9pbihyb290LCBmbikKICAgICAgICAgICAgICAgICAgICB1cmwgPSB1cmx1bnBhcnNlKCgnZmlsZScsICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhuYW1lMnVybChvcy5wYXRoLmFic3BhdGgoZm4pKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJywgJycsICcnKSkKICAgICAgICAgICAgICAgICAgICBpbmZvID0gc2VsZi5jb252ZXJ0X3VybF90b19kb3dubG9hZF9pbmZvKHVybCwgbmFtZSkKICAgICAgICAgICAgICAgICAgICBpZiBpbmZvOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl91cGRhdGVfdmVyc2lvbl9kYXRhKHJlc3VsdCwgaW5mbykKICAgICAgICAgICAgaWYgbm90IHNlbGYucmVjdXJzaXZlOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIGdldF9kaXN0cmlidXRpb25fbmFtZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGFsbCB0aGUgZGlzdHJpYnV0aW9uIG5hbWVzIGtub3duIHRvIHRoaXMgbG9jYXRvci4KICAgICAgICAiIiIKICAgICAgICByZXN1bHQgPSBzZXQoKQogICAgICAgIGZvciByb290LCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKHNlbGYuYmFzZV9kaXIpOgogICAgICAgICAgICBmb3IgZm4gaW4gZmlsZXM6CiAgICAgICAgICAgICAgICBpZiBzZWxmLnNob3VsZF9pbmNsdWRlKGZuLCByb290KToKICAgICAgICAgICAgICAgICAgICBmbiA9IG9zLnBhdGguam9pbihyb290LCBmbikKICAgICAgICAgICAgICAgICAgICB1cmwgPSB1cmx1bnBhcnNlKCgnZmlsZScsICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhuYW1lMnVybChvcy5wYXRoLmFic3BhdGgoZm4pKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJywgJycsICcnKSkKICAgICAgICAgICAgICAgICAgICBpbmZvID0gc2VsZi5jb252ZXJ0X3VybF90b19kb3dubG9hZF9pbmZvKHVybCwgTm9uZSkKICAgICAgICAgICAgICAgICAgICBpZiBpbmZvOgogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKGluZm9bJ25hbWUnXSkKICAgICAgICAgICAgaWYgbm90IHNlbGYucmVjdXJzaXZlOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICByZXR1cm4gcmVzdWx0CgpjbGFzcyBKU09OTG9jYXRvcihMb2NhdG9yKToKICAgICIiIgogICAgVGhpcyBsb2NhdG9yIHVzZXMgc3BlY2lhbCBleHRlbmRlZCBtZXRhZGF0YSAobm90IGF2YWlsYWJsZSBvbiBQeVBJKSBhbmQgaXMKICAgIHRoZSBiYXNpcyBvZiBwZXJmb3JtYW50IGRlcGVuZGVuY3kgcmVzb2x1dGlvbiBpbiBkaXN0bGliLiBPdGhlciBsb2NhdG9ycwogICAgcmVxdWlyZSBhcmNoaXZlIGRvd25sb2FkcyBiZWZvcmUgZGVwZW5kZW5jaWVzIGNhbiBiZSBkZXRlcm1pbmVkISBBcyB5b3UKICAgIG1pZ2h0IGltYWdpbmUsIHRoYXQgY2FuIGJlIHNsb3cuCiAgICAiIiIKICAgIGRlZiBnZXRfZGlzdHJpYnV0aW9uX25hbWVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBhbGwgdGhlIGRpc3RyaWJ1dGlvbiBuYW1lcyBrbm93biB0byB0aGlzIGxvY2F0b3IuCiAgICAgICAgIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcignTm90IGF2YWlsYWJsZSBmcm9tIHRoaXMgbG9jYXRvcicpCgogICAgZGVmIF9nZXRfcHJvamVjdChzZWxmLCBuYW1lKToKICAgICAgICByZXN1bHQgPSB7J3VybHMnOiB7fSwgJ2RpZ2VzdHMnOiB7fX0KICAgICAgICBkYXRhID0gZ2V0X3Byb2plY3RfZGF0YShuYW1lKQogICAgICAgIGlmIGRhdGE6CiAgICAgICAgICAgIGZvciBpbmZvIGluIGRhdGEuZ2V0KCdmaWxlcycsIFtdKToKICAgICAgICAgICAgICAgIGlmIGluZm9bJ3B0eXBlJ10gIT0gJ3NkaXN0JyBvciBpbmZvWydweXZlcnNpb24nXSAhPSAnc291cmNlJzoKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgIyBXZSBkb24ndCBzdG9yZSBzdW1tYXJ5IGluIHByb2plY3QgbWV0YWRhdGEgYXMgaXQgbWFrZXMKICAgICAgICAgICAgICAgICMgdGhlIGRhdGEgYmlnZ2VyIGZvciBubyBiZW5lZml0IGR1cmluZyBkZXBlbmRlbmN5CiAgICAgICAgICAgICAgICAjIHJlc29sdXRpb24KICAgICAgICAgICAgICAgIGRpc3QgPSBtYWtlX2Rpc3QoZGF0YVsnbmFtZSddLCBpbmZvWyd2ZXJzaW9uJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnk9ZGF0YS5nZXQoJ3N1bW1hcnknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQbGFjZWhvbGRlciBmb3Igc3VtbWFyeScpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWU9c2VsZi5zY2hlbWUpCiAgICAgICAgICAgICAgICBtZCA9IGRpc3QubWV0YWRhdGEKICAgICAgICAgICAgICAgIG1kLnNvdXJjZV91cmwgPSBpbmZvWyd1cmwnXQogICAgICAgICAgICAgICAgIyBUT0RPIFNIQTI1NiBkaWdlc3QKICAgICAgICAgICAgICAgIGlmICdkaWdlc3QnIGluIGluZm8gYW5kIGluZm9bJ2RpZ2VzdCddOgogICAgICAgICAgICAgICAgICAgIGRpc3QuZGlnZXN0ID0gKCdtZDUnLCBpbmZvWydkaWdlc3QnXSkKICAgICAgICAgICAgICAgIG1kLmRlcGVuZGVuY2llcyA9IGluZm8uZ2V0KCdyZXF1aXJlbWVudHMnLCB7fSkKICAgICAgICAgICAgICAgIGRpc3QuZXhwb3J0cyA9IGluZm8uZ2V0KCdleHBvcnRzJywge30pCiAgICAgICAgICAgICAgICByZXN1bHRbZGlzdC52ZXJzaW9uXSA9IGRpc3QKICAgICAgICAgICAgICAgIHJlc3VsdFsndXJscyddLnNldGRlZmF1bHQoZGlzdC52ZXJzaW9uLCBzZXQoKSkuYWRkKGluZm9bJ3VybCddKQogICAgICAgIHJldHVybiByZXN1bHQKCmNsYXNzIERpc3RQYXRoTG9jYXRvcihMb2NhdG9yKToKICAgICIiIgogICAgVGhpcyBsb2NhdG9yIGZpbmRzIGluc3RhbGxlZCBkaXN0cmlidXRpb25zIGluIGEgcGF0aC4gSXQgY2FuIGJlIHVzZWZ1bCBmb3IKICAgIGFkZGluZyB0byBhbiA6Y2xhc3M6YEFnZ3JlZ2F0aW5nTG9jYXRvcmAuCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkaXN0cGF0aCwgKiprd2FyZ3MpOgogICAgICAgICIiIgogICAgICAgIEluaXRpYWxpc2UgYW4gaW5zdGFuY2UuCgogICAgICAgIDpwYXJhbSBkaXN0cGF0aDogQSA6Y2xhc3M6YERpc3RyaWJ1dGlvblBhdGhgIGluc3RhbmNlIHRvIHNlYXJjaC4KICAgICAgICAiIiIKICAgICAgICBzdXBlcihEaXN0UGF0aExvY2F0b3IsIHNlbGYpLl9faW5pdF9fKCoqa3dhcmdzKQogICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGRpc3RwYXRoLCBEaXN0cmlidXRpb25QYXRoKQogICAgICAgIHNlbGYuZGlzdHBhdGggPSBkaXN0cGF0aAoKICAgIGRlZiBfZ2V0X3Byb2plY3Qoc2VsZiwgbmFtZSk6CiAgICAgICAgZGlzdCA9IHNlbGYuZGlzdHBhdGguZ2V0X2Rpc3RyaWJ1dGlvbihuYW1lKQogICAgICAgIGlmIGRpc3QgaXMgTm9uZToKICAgICAgICAgICAgcmVzdWx0ID0geyd1cmxzJzoge30sICdkaWdlc3RzJzoge319CiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVzdWx0ID0gewogICAgICAgICAgICAgICAgZGlzdC52ZXJzaW9uOiBkaXN0LAogICAgICAgICAgICAgICAgJ3VybHMnOiB7ZGlzdC52ZXJzaW9uOiBzZXQoW2Rpc3Quc291cmNlX3VybF0pfSwKICAgICAgICAgICAgICAgICdkaWdlc3RzJzoge2Rpc3QudmVyc2lvbjogc2V0KFtOb25lXSl9CiAgICAgICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0CgoKY2xhc3MgQWdncmVnYXRpbmdMb2NhdG9yKExvY2F0b3IpOgogICAgIiIiCiAgICBUaGlzIGNsYXNzIGFsbG93cyB5b3UgdG8gY2hhaW4gYW5kL29yIG1lcmdlIGEgbGlzdCBvZiBsb2NhdG9ycy4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsICpsb2NhdG9ycywgKiprd2FyZ3MpOgogICAgICAgICIiIgogICAgICAgIEluaXRpYWxpc2UgYW4gaW5zdGFuY2UuCgogICAgICAgIDpwYXJhbSBsb2NhdG9yczogVGhlIGxpc3Qgb2YgbG9jYXRvcnMgdG8gc2VhcmNoLgogICAgICAgIDpwYXJhbSBrd2FyZ3M6IFBhc3NlZCB0byB0aGUgc3VwZXJjbGFzcyBjb25zdHJ1Y3RvciwKICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgZm9yOgogICAgICAgICAgICAgICAgICAgICAgICogbWVyZ2UgLSBpZiBGYWxzZSAodGhlIGRlZmF1bHQpLCB0aGUgZmlyc3Qgc3VjY2Vzc2Z1bAogICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoIGZyb20gYW55IG9mIHRoZSBsb2NhdG9ycyBpcyByZXR1cm5lZC4gSWYgVHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSByZXN1bHRzIGZyb20gYWxsIGxvY2F0b3JzIGFyZSBtZXJnZWQgKHRoaXMgY2FuIGJlCiAgICAgICAgICAgICAgICAgICAgICAgICBzbG93KS4KICAgICAgICAiIiIKICAgICAgICBzZWxmLm1lcmdlID0ga3dhcmdzLnBvcCgnbWVyZ2UnLCBGYWxzZSkKICAgICAgICBzZWxmLmxvY2F0b3JzID0gbG9jYXRvcnMKICAgICAgICBzdXBlcihBZ2dyZWdhdGluZ0xvY2F0b3IsIHNlbGYpLl9faW5pdF9fKCoqa3dhcmdzKQoKICAgIGRlZiBjbGVhcl9jYWNoZShzZWxmKToKICAgICAgICBzdXBlcihBZ2dyZWdhdGluZ0xvY2F0b3IsIHNlbGYpLmNsZWFyX2NhY2hlKCkKICAgICAgICBmb3IgbG9jYXRvciBpbiBzZWxmLmxvY2F0b3JzOgogICAgICAgICAgICBsb2NhdG9yLmNsZWFyX2NhY2hlKCkKCiAgICBkZWYgX3NldF9zY2hlbWUoc2VsZiwgdmFsdWUpOgogICAgICAgIHNlbGYuX3NjaGVtZSA9IHZhbHVlCiAgICAgICAgZm9yIGxvY2F0b3IgaW4gc2VsZi5sb2NhdG9yczoKICAgICAgICAgICAgbG9jYXRvci5zY2hlbWUgPSB2YWx1ZQoKICAgIHNjaGVtZSA9IHByb3BlcnR5KExvY2F0b3Iuc2NoZW1lLmZnZXQsIF9zZXRfc2NoZW1lKQoKICAgIGRlZiBfZ2V0X3Byb2plY3Qoc2VsZiwgbmFtZSk6CiAgICAgICAgcmVzdWx0ID0ge30KICAgICAgICBmb3IgbG9jYXRvciBpbiBzZWxmLmxvY2F0b3JzOgogICAgICAgICAgICBkID0gbG9jYXRvci5nZXRfcHJvamVjdChuYW1lKQogICAgICAgICAgICBpZiBkOgogICAgICAgICAgICAgICAgaWYgc2VsZi5tZXJnZToKICAgICAgICAgICAgICAgICAgICBmaWxlcyA9IHJlc3VsdC5nZXQoJ3VybHMnLCB7fSkKICAgICAgICAgICAgICAgICAgICBkaWdlc3RzID0gcmVzdWx0LmdldCgnZGlnZXN0cycsIHt9KQogICAgICAgICAgICAgICAgICAgICMgbmV4dCBsaW5lIGNvdWxkIG92ZXJ3cml0ZSByZXN1bHRbJ3VybHMnXSwgcmVzdWx0WydkaWdlc3RzJ10KICAgICAgICAgICAgICAgICAgICByZXN1bHQudXBkYXRlKGQpCiAgICAgICAgICAgICAgICAgICAgZGYgPSByZXN1bHQuZ2V0KCd1cmxzJykKICAgICAgICAgICAgICAgICAgICBpZiBmaWxlcyBhbmQgZGY6CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBrLCB2IGluIGZpbGVzLml0ZW1zKCk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBrIGluIGRmOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmW2tdIHw9IHYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZba10gPSB2CiAgICAgICAgICAgICAgICAgICAgZGQgPSByZXN1bHQuZ2V0KCdkaWdlc3RzJykKICAgICAgICAgICAgICAgICAgICBpZiBkaWdlc3RzIGFuZCBkZDoKICAgICAgICAgICAgICAgICAgICAgICAgZGQudXBkYXRlKGRpZ2VzdHMpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICMgU2VlIGlzc3VlICMxOC4gSWYgYW55IGRpc3RzIGFyZSBmb3VuZCBhbmQgd2UncmUgbG9va2luZwogICAgICAgICAgICAgICAgICAgICMgZm9yIHNwZWNpZmljIGNvbnN0cmFpbnRzLCB3ZSBvbmx5IHJldHVybiBzb21ldGhpbmcgaWYKICAgICAgICAgICAgICAgICAgICAjIGEgbWF0Y2ggaXMgZm91bmQuIEZvciBleGFtcGxlLCBpZiBhIERpcmVjdG9yeUxvY2F0b3IKICAgICAgICAgICAgICAgICAgICAjIHJldHVybnMganVzdCBmb28gKDEuMCkgd2hpbGUgd2UncmUgbG9va2luZyBmb3IKICAgICAgICAgICAgICAgICAgICAjIGZvbyAoPj0gMi4wKSwgd2UnbGwgcHJldGVuZCB0aGVyZSB3YXMgbm90aGluZyB0aGVyZSBzbwogICAgICAgICAgICAgICAgICAgICMgdGhhdCBzdWJzZXF1ZW50IGxvY2F0b3JzIGNhbiBiZSBxdWVyaWVkLiBPdGhlcndpc2Ugd2UKICAgICAgICAgICAgICAgICAgICAjIHdvdWxkIGp1c3QgcmV0dXJuIGZvbyAoMS4wKSB3aGljaCB3b3VsZCB0aGVuIGxlYWQgdG8gYQogICAgICAgICAgICAgICAgICAgICMgZmFpbHVyZSB0byBmaW5kIGZvbyAoPj0gMi4wKSwgYmVjYXVzZSBvdGhlciBsb2NhdG9ycwogICAgICAgICAgICAgICAgICAgICMgd2VyZW4ndCBzZWFyY2hlZC4gTm90ZSB0aGF0IHRoaXMgb25seSBtYXR0ZXJzIHdoZW4KICAgICAgICAgICAgICAgICAgICAjIG1lcmdlPUZhbHNlLgogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYubWF0Y2hlciBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IFRydWUKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IEZhbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBrIGluIGQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLm1hdGNoZXIubWF0Y2goayk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICAgICBpZiBmb3VuZDoKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZAogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgZ2V0X2Rpc3RyaWJ1dGlvbl9uYW1lcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gYWxsIHRoZSBkaXN0cmlidXRpb24gbmFtZXMga25vd24gdG8gdGhpcyBsb2NhdG9yLgogICAgICAgICIiIgogICAgICAgIHJlc3VsdCA9IHNldCgpCiAgICAgICAgZm9yIGxvY2F0b3IgaW4gc2VsZi5sb2NhdG9yczoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmVzdWx0IHw9IGxvY2F0b3IuZ2V0X2Rpc3RyaWJ1dGlvbl9uYW1lcygpCiAgICAgICAgICAgIGV4Y2VwdCBOb3RJbXBsZW1lbnRlZEVycm9yOgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgIHJldHVybiByZXN1bHQKCgojIFdlIHVzZSBhIGxlZ2FjeSBzY2hlbWUgc2ltcGx5IGJlY2F1c2UgbW9zdCBvZiB0aGUgZGlzdHMgb24gUHlQSSB1c2UgbGVnYWN5CiMgdmVyc2lvbnMgd2hpY2ggZG9uJ3QgY29uZm9ybSB0byBQRVAgNDI2IC8gUEVQIDQ0MC4KZGVmYXVsdF9sb2NhdG9yID0gQWdncmVnYXRpbmdMb2NhdG9yKAogICAgICAgICAgICAgICAgICAgIEpTT05Mb2NhdG9yKCksCiAgICAgICAgICAgICAgICAgICAgU2ltcGxlU2NyYXBpbmdMb2NhdG9yKCdodHRwczovL3B5cGkucHl0aG9uLm9yZy9zaW1wbGUvJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dD0zLjApLAogICAgICAgICAgICAgICAgICAgIHNjaGVtZT0nbGVnYWN5JykKCmxvY2F0ZSA9IGRlZmF1bHRfbG9jYXRvci5sb2NhdGUKCk5BTUVfVkVSU0lPTl9SRSA9IHJlLmNvbXBpbGUocicoP1A8bmFtZT5bXHctXSspXHMqJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHInXChccyooPT1ccyopPyg/UDx2ZXI+W14pXSspXCkkJykKCmNsYXNzIERlcGVuZGVuY3lGaW5kZXIob2JqZWN0KToKICAgICIiIgogICAgTG9jYXRlIGRlcGVuZGVuY2llcyBmb3IgZGlzdHJpYnV0aW9ucy4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsb2NhdG9yPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIEluaXRpYWxpc2UgYW4gaW5zdGFuY2UsIHVzaW5nIHRoZSBzcGVjaWZpZWQgbG9jYXRvcgogICAgICAgIHRvIGxvY2F0ZSBkaXN0cmlidXRpb25zLgogICAgICAgICIiIgogICAgICAgIHNlbGYubG9jYXRvciA9IGxvY2F0b3Igb3IgZGVmYXVsdF9sb2NhdG9yCiAgICAgICAgc2VsZi5zY2hlbWUgPSBnZXRfc2NoZW1lKHNlbGYubG9jYXRvci5zY2hlbWUpCgogICAgZGVmIGFkZF9kaXN0cmlidXRpb24oc2VsZiwgZGlzdCk6CiAgICAgICAgIiIiCiAgICAgICAgQWRkIGEgZGlzdHJpYnV0aW9uIHRvIHRoZSBmaW5kZXIuIFRoaXMgd2lsbCB1cGRhdGUgaW50ZXJuYWwgaW5mb3JtYXRpb24KICAgICAgICBhYm91dCB3aG8gcHJvdmlkZXMgd2hhdC4KICAgICAgICA6cGFyYW0gZGlzdDogVGhlIGRpc3RyaWJ1dGlvbiB0byBhZGQuCiAgICAgICAgIiIiCiAgICAgICAgbG9nZ2VyLmRlYnVnKCdhZGRpbmcgZGlzdHJpYnV0aW9uICVzJywgZGlzdCkKICAgICAgICBuYW1lID0gZGlzdC5rZXkKICAgICAgICBzZWxmLmRpc3RzX2J5X25hbWVbbmFtZV0gPSBkaXN0CiAgICAgICAgc2VsZi5kaXN0c1sobmFtZSwgZGlzdC52ZXJzaW9uKV0gPSBkaXN0CiAgICAgICAgZm9yIHAgaW4gZGlzdC5wcm92aWRlczoKICAgICAgICAgICAgbmFtZSwgdmVyc2lvbiA9IHBhcnNlX25hbWVfYW5kX3ZlcnNpb24ocCkKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdBZGQgdG8gcHJvdmlkZWQ6ICVzLCAlcywgJXMnLCBuYW1lLCB2ZXJzaW9uLCBkaXN0KQogICAgICAgICAgICBzZWxmLnByb3ZpZGVkLnNldGRlZmF1bHQobmFtZSwgc2V0KCkpLmFkZCgodmVyc2lvbiwgZGlzdCkpCgogICAgZGVmIHJlbW92ZV9kaXN0cmlidXRpb24oc2VsZiwgZGlzdCk6CiAgICAgICAgIiIiCiAgICAgICAgUmVtb3ZlIGEgZGlzdHJpYnV0aW9uIGZyb20gdGhlIGZpbmRlci4gVGhpcyB3aWxsIHVwZGF0ZSBpbnRlcm5hbAogICAgICAgIGluZm9ybWF0aW9uIGFib3V0IHdobyBwcm92aWRlcyB3aGF0LgogICAgICAgIDpwYXJhbSBkaXN0OiBUaGUgZGlzdHJpYnV0aW9uIHRvIHJlbW92ZS4KICAgICAgICAiIiIKICAgICAgICBsb2dnZXIuZGVidWcoJ3JlbW92aW5nIGRpc3RyaWJ1dGlvbiAlcycsIGRpc3QpCiAgICAgICAgbmFtZSA9IGRpc3Qua2V5CiAgICAgICAgZGVsIHNlbGYuZGlzdHNfYnlfbmFtZVtuYW1lXQogICAgICAgIGRlbCBzZWxmLmRpc3RzWyhuYW1lLCBkaXN0LnZlcnNpb24pXQogICAgICAgIGZvciBwIGluIGRpc3QucHJvdmlkZXM6CiAgICAgICAgICAgIG5hbWUsIHZlcnNpb24gPSBwYXJzZV9uYW1lX2FuZF92ZXJzaW9uKHApCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnUmVtb3ZlIGZyb20gcHJvdmlkZWQ6ICVzLCAlcywgJXMnLCBuYW1lLCB2ZXJzaW9uLCBkaXN0KQogICAgICAgICAgICBzID0gc2VsZi5wcm92aWRlZFtuYW1lXQogICAgICAgICAgICBzLnJlbW92ZSgodmVyc2lvbiwgZGlzdCkpCiAgICAgICAgICAgIGlmIG5vdCBzOgogICAgICAgICAgICAgICAgZGVsIHNlbGYucHJvdmlkZWRbbmFtZV0KCiAgICBkZWYgZ2V0X21hdGNoZXIoc2VsZiwgcmVxdCk6CiAgICAgICAgIiIiCiAgICAgICAgR2V0IGEgdmVyc2lvbiBtYXRjaGVyIGZvciBhIHJlcXVpcmVtZW50LgogICAgICAgIDpwYXJhbSByZXF0OiBUaGUgcmVxdWlyZW1lbnQKICAgICAgICA6dHlwZSByZXF0OiBzdHIKICAgICAgICA6cmV0dXJuOiBBIHZlcnNpb24gbWF0Y2hlciAoYW4gaW5zdGFuY2Ugb2YKICAgICAgICAgICAgICAgICA6Y2xhc3M6YGRpc3RsaWIudmVyc2lvbi5NYXRjaGVyYCkuCiAgICAgICAgIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICBtYXRjaGVyID0gc2VsZi5zY2hlbWUubWF0Y2hlcihyZXF0KQogICAgICAgIGV4Y2VwdCBVbnN1cHBvcnRlZFZlcnNpb25FcnJvcjogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgICAgICAjIFhYWCBjb21wYXQtbW9kZSBpZiBjYW5ub3QgcmVhZCB0aGUgdmVyc2lvbgogICAgICAgICAgICBuYW1lID0gcmVxdC5zcGxpdCgpWzBdCiAgICAgICAgICAgIG1hdGNoZXIgPSBzZWxmLnNjaGVtZS5tYXRjaGVyKG5hbWUpCiAgICAgICAgcmV0dXJuIG1hdGNoZXIKCiAgICBkZWYgZmluZF9wcm92aWRlcnMoc2VsZiwgcmVxdCk6CiAgICAgICAgIiIiCiAgICAgICAgRmluZCB0aGUgZGlzdHJpYnV0aW9ucyB3aGljaCBjYW4gZnVsZmlsbCBhIHJlcXVpcmVtZW50LgoKICAgICAgICA6cGFyYW0gcmVxdDogVGhlIHJlcXVpcmVtZW50LgogICAgICAgICA6dHlwZSByZXF0OiBzdHIKICAgICAgICA6cmV0dXJuOiBBIHNldCBvZiBkaXN0cmlidXRpb24gd2hpY2ggY2FuIGZ1bGZpbGwgdGhlIHJlcXVpcmVtZW50LgogICAgICAgICIiIgogICAgICAgIG1hdGNoZXIgPSBzZWxmLmdldF9tYXRjaGVyKHJlcXQpCiAgICAgICAgbmFtZSA9IG1hdGNoZXIua2V5ICAgIyBjYXNlLWluc2Vuc2l0aXZlCiAgICAgICAgcmVzdWx0ID0gc2V0KCkKICAgICAgICBwcm92aWRlZCA9IHNlbGYucHJvdmlkZWQKICAgICAgICBpZiBuYW1lIGluIHByb3ZpZGVkOgogICAgICAgICAgICBmb3IgdmVyc2lvbiwgcHJvdmlkZXIgaW4gcHJvdmlkZWRbbmFtZV06CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSBtYXRjaGVyLm1hdGNoKHZlcnNpb24pCiAgICAgICAgICAgICAgICBleGNlcHQgVW5zdXBwb3J0ZWRWZXJzaW9uRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSBGYWxzZQoKICAgICAgICAgICAgICAgIGlmIG1hdGNoOgogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQocHJvdmlkZXIpCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIHRyeV90b19yZXBsYWNlKHNlbGYsIHByb3ZpZGVyLCBvdGhlciwgcHJvYmxlbXMpOgogICAgICAgICIiIgogICAgICAgIEF0dGVtcHQgdG8gcmVwbGFjZSBvbmUgcHJvdmlkZXIgd2l0aCBhbm90aGVyLiBUaGlzIGlzIHR5cGljYWxseSB1c2VkCiAgICAgICAgd2hlbiByZXNvbHZpbmcgZGVwZW5kZW5jaWVzIGZyb20gbXVsdGlwbGUgc291cmNlcywgZS5nLiBBIHJlcXVpcmVzCiAgICAgICAgKEIgPj0gMS4wKSB3aGlsZSBDIHJlcXVpcmVzIChCID49IDEuMSkuCgogICAgICAgIEZvciBzdWNjZXNzZnVsIHJlcGxhY2VtZW50LCBgYHByb3ZpZGVyYGAgbXVzdCBtZWV0IGFsbCB0aGUgcmVxdWlyZW1lbnRzCiAgICAgICAgd2hpY2ggYGBvdGhlcmBgIGZ1bGZpbGxzLgoKICAgICAgICA6cGFyYW0gcHJvdmlkZXI6IFRoZSBwcm92aWRlciB3ZSBhcmUgdHJ5aW5nIHRvIHJlcGxhY2Ugd2l0aC4KICAgICAgICA6cGFyYW0gb3RoZXI6IFRoZSBwcm92aWRlciB3ZSdyZSB0cnlpbmcgdG8gcmVwbGFjZS4KICAgICAgICA6cGFyYW0gcHJvYmxlbXM6IElmIEZhbHNlIGlzIHJldHVybmVkLCB0aGlzIHdpbGwgY29udGFpbiB3aGF0CiAgICAgICAgICAgICAgICAgICAgICAgICBwcm9ibGVtcyBwcmV2ZW50ZWQgcmVwbGFjZW1lbnQuIFRoaXMgaXMgY3VycmVudGx5CiAgICAgICAgICAgICAgICAgICAgICAgICBhIHR1cGxlIG9mIHRoZSBsaXRlcmFsIHN0cmluZyAnY2FudHJlcGxhY2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgYGBwcm92aWRlcmBgLCBgYG90aGVyYGAgIGFuZCB0aGUgc2V0IG9mIHJlcXVpcmVtZW50cwogICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBgYHByb3ZpZGVyYGAgY291bGRuJ3QgZnVsZmlsbC4KICAgICAgICA6cmV0dXJuOiBUcnVlIGlmIHdlIGNhbiByZXBsYWNlIGBgb3RoZXJgYCB3aXRoIGBgcHJvdmlkZXJgYCwgZWxzZQogICAgICAgICAgICAgICAgIEZhbHNlLgogICAgICAgICIiIgogICAgICAgIHJsaXN0ID0gc2VsZi5yZXF0c1tvdGhlcl0KICAgICAgICB1bm1hdGNoZWQgPSBzZXQoKQogICAgICAgIGZvciBzIGluIHJsaXN0OgogICAgICAgICAgICBtYXRjaGVyID0gc2VsZi5nZXRfbWF0Y2hlcihzKQogICAgICAgICAgICBpZiBub3QgbWF0Y2hlci5tYXRjaChwcm92aWRlci52ZXJzaW9uKToKICAgICAgICAgICAgICAgIHVubWF0Y2hlZC5hZGQocykKICAgICAgICBpZiB1bm1hdGNoZWQ6CiAgICAgICAgICAgICMgY2FuJ3QgcmVwbGFjZSBvdGhlciB3aXRoIHByb3ZpZGVyCiAgICAgICAgICAgIHByb2JsZW1zLmFkZCgoJ2NhbnRyZXBsYWNlJywgcHJvdmlkZXIsIG90aGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldCh1bm1hdGNoZWQpKSkKICAgICAgICAgICAgcmVzdWx0ID0gRmFsc2UKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIGNhbiByZXBsYWNlIG90aGVyIHdpdGggcHJvdmlkZXIKICAgICAgICAgICAgc2VsZi5yZW1vdmVfZGlzdHJpYnV0aW9uKG90aGVyKQogICAgICAgICAgICBkZWwgc2VsZi5yZXF0c1tvdGhlcl0KICAgICAgICAgICAgZm9yIHMgaW4gcmxpc3Q6CiAgICAgICAgICAgICAgICBzZWxmLnJlcXRzLnNldGRlZmF1bHQocHJvdmlkZXIsIHNldCgpKS5hZGQocykKICAgICAgICAgICAgc2VsZi5hZGRfZGlzdHJpYnV0aW9uKHByb3ZpZGVyKQogICAgICAgICAgICByZXN1bHQgPSBUcnVlCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBmaW5kKHNlbGYsIHJlcXVpcmVtZW50LCBtZXRhX2V4dHJhcz1Ob25lLCBwcmVyZWxlYXNlcz1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgRmluZCBhIGRpc3RyaWJ1dGlvbiBhbmQgYWxsIGRpc3RyaWJ1dGlvbnMgaXQgZGVwZW5kcyBvbi4KCiAgICAgICAgOnBhcmFtIHJlcXVpcmVtZW50OiBUaGUgcmVxdWlyZW1lbnQgc3BlY2lmeWluZyB0aGUgZGlzdHJpYnV0aW9uIHRvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5kLCBvciBhIERpc3RyaWJ1dGlvbiBpbnN0YW5jZS4KICAgICAgICA6cGFyYW0gbWV0YV9leHRyYXM6IEEgbGlzdCBvZiBtZXRhIGV4dHJhcyBzdWNoIGFzIDp0ZXN0OiwgOmJ1aWxkOiBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvIG9uLgogICAgICAgIDpwYXJhbSBwcmVyZWxlYXNlczogSWYgYGBUcnVlYGAsIGFsbG93IHByZS1yZWxlYXNlIHZlcnNpb25zIHRvIGJlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5lZCAtIG90aGVyd2lzZSwgZG9uJ3QgcmV0dXJuIHByZXJlbGVhc2VzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmxlc3MgdGhleSdyZSBhbGwgdGhhdCdzIGF2YWlsYWJsZS4KCiAgICAgICAgUmV0dXJuIGEgc2V0IG9mIDpjbGFzczpgRGlzdHJpYnV0aW9uYCBpbnN0YW5jZXMgYW5kIGEgc2V0IG9mCiAgICAgICAgcHJvYmxlbXMuCgogICAgICAgIFRoZSBkaXN0cmlidXRpb25zIHJldHVybmVkIHNob3VsZCBiZSBzdWNoIHRoYXQgdGhleSBoYXZlIHRoZQogICAgICAgIDphdHRyOmByZXF1aXJlZGAgYXR0cmlidXRlIHNldCB0byBgYFRydWVgYCBpZiB0aGV5IHdlcmUKICAgICAgICBmcm9tIHRoZSBgYHJlcXVpcmVtZW50YGAgcGFzc2VkIHRvIGBgZmluZCgpYGAsIGFuZCB0aGV5IGhhdmUgdGhlCiAgICAgICAgOmF0dHI6YGJ1aWxkX3RpbWVfZGVwZW5kZW5jeWAgYXR0cmlidXRlIHNldCB0byBgYFRydWVgYCB1bmxlc3MgdGhleQogICAgICAgIGFyZSBwb3N0LWluc3RhbGxhdGlvbiBkZXBlbmRlbmNpZXMgb2YgdGhlIGBgcmVxdWlyZW1lbnRgYC4KCiAgICAgICAgVGhlIHByb2JsZW1zIHNob3VsZCBiZSBhIHR1cGxlIGNvbnNpc3Rpbmcgb2YgdGhlIHN0cmluZwogICAgICAgIGBgJ3Vuc2F0aXNmaWVkJ2BgIGFuZCB0aGUgcmVxdWlyZW1lbnQgd2hpY2ggY291bGRuJ3QgYmUgc2F0aXNmaWVkCiAgICAgICAgYnkgYW55IGRpc3RyaWJ1dGlvbiBrbm93biB0byB0aGUgbG9jYXRvci4KICAgICAgICAiIiIKCiAgICAgICAgc2VsZi5wcm92aWRlZCA9IHt9CiAgICAgICAgc2VsZi5kaXN0cyA9IHt9CiAgICAgICAgc2VsZi5kaXN0c19ieV9uYW1lID0ge30KICAgICAgICBzZWxmLnJlcXRzID0ge30KCiAgICAgICAgbWV0YV9leHRyYXMgPSBzZXQobWV0YV9leHRyYXMgb3IgW10pCiAgICAgICAgaWYgJzoqOicgaW4gbWV0YV9leHRyYXM6CiAgICAgICAgICAgIG1ldGFfZXh0cmFzLnJlbW92ZSgnOio6JykKICAgICAgICAgICAgIyA6bWV0YTogYW5kIDpydW46IGFyZSBpbXBsaWNpdGx5IGluY2x1ZGVkCiAgICAgICAgICAgIG1ldGFfZXh0cmFzIHw9IHNldChbJzp0ZXN0OicsICc6YnVpbGQ6JywgJzpkZXY6J10pCgogICAgICAgIGlmIGlzaW5zdGFuY2UocmVxdWlyZW1lbnQsIERpc3RyaWJ1dGlvbik6CiAgICAgICAgICAgIGRpc3QgPSBvZGlzdCA9IHJlcXVpcmVtZW50CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygncGFzc2VkICVzIGFzIHJlcXVpcmVtZW50Jywgb2Rpc3QpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZGlzdCA9IG9kaXN0ID0gc2VsZi5sb2NhdG9yLmxvY2F0ZShyZXF1aXJlbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVyZWxlYXNlcz1wcmVyZWxlYXNlcykKICAgICAgICAgICAgaWYgZGlzdCBpcyBOb25lOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbignVW5hYmxlIHRvIGxvY2F0ZSAlcicgJSByZXF1aXJlbWVudCkKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdsb2NhdGVkICVzJywgb2Rpc3QpCiAgICAgICAgZGlzdC5yZXF1ZXN0ZWQgPSBUcnVlCiAgICAgICAgcHJvYmxlbXMgPSBzZXQoKQogICAgICAgIHRvZG8gPSBzZXQoW2Rpc3RdKQogICAgICAgIGluc3RhbGxfZGlzdHMgPSBzZXQoW29kaXN0XSkKICAgICAgICB3aGlsZSB0b2RvOgogICAgICAgICAgICBkaXN0ID0gdG9kby5wb3AoKQogICAgICAgICAgICBuYW1lID0gZGlzdC5rZXkgICAgICMgY2FzZS1pbnNlbnNpdGl2ZQogICAgICAgICAgICBpZiBuYW1lIG5vdCBpbiBzZWxmLmRpc3RzX2J5X25hbWU6CiAgICAgICAgICAgICAgICBzZWxmLmFkZF9kaXN0cmlidXRpb24oZGlzdCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICNpbXBvcnQgcGRiOyBwZGIuc2V0X3RyYWNlKCkKICAgICAgICAgICAgICAgIG90aGVyID0gc2VsZi5kaXN0c19ieV9uYW1lW25hbWVdCiAgICAgICAgICAgICAgICBpZiBvdGhlciAhPSBkaXN0OgogICAgICAgICAgICAgICAgICAgIHNlbGYudHJ5X3RvX3JlcGxhY2UoZGlzdCwgb3RoZXIsIHByb2JsZW1zKQoKICAgICAgICAgICAgaXJlcXRzID0gZGlzdC5ydW5fcmVxdWlyZXMgfCBkaXN0Lm1ldGFfcmVxdWlyZXMKICAgICAgICAgICAgc3JlcXRzID0gZGlzdC5idWlsZF9yZXF1aXJlcwogICAgICAgICAgICBlcmVxdHMgPSBzZXQoKQogICAgICAgICAgICBpZiBkaXN0IGluIGluc3RhbGxfZGlzdHM6CiAgICAgICAgICAgICAgICBmb3Iga2V5IGluICgndGVzdCcsICdidWlsZCcsICdkZXYnKToKICAgICAgICAgICAgICAgICAgICBlID0gJzolczonICUga2V5CiAgICAgICAgICAgICAgICAgICAgaWYgZSBpbiBtZXRhX2V4dHJhczoKICAgICAgICAgICAgICAgICAgICAgICAgZXJlcXRzIHw9IGdldGF0dHIoZGlzdCwgJyVzX3JlcXVpcmVzJyAlIGtleSkKICAgICAgICAgICAgYWxsX3JlcXRzID0gaXJlcXRzIHwgc3JlcXRzIHwgZXJlcXRzCiAgICAgICAgICAgIGZvciByIGluIGFsbF9yZXF0czoKICAgICAgICAgICAgICAgIHByb3ZpZGVycyA9IHNlbGYuZmluZF9wcm92aWRlcnMocikKICAgICAgICAgICAgICAgIGlmIG5vdCBwcm92aWRlcnM6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdObyBwcm92aWRlcnMgZm91bmQgZm9yICVyJywgcikKICAgICAgICAgICAgICAgICAgICBwcm92aWRlciA9IHNlbGYubG9jYXRvci5sb2NhdGUociwgcHJlcmVsZWFzZXM9cHJlcmVsZWFzZXMpCiAgICAgICAgICAgICAgICAgICAgIyBJZiBubyBwcm92aWRlciBpcyBmb3VuZCBhbmQgd2UgZGlkbid0IGNvbnNpZGVyCiAgICAgICAgICAgICAgICAgICAgIyBwcmVyZWxlYXNlcywgY29uc2lkZXIgdGhlbSBub3cuCiAgICAgICAgICAgICAgICAgICAgaWYgcHJvdmlkZXIgaXMgTm9uZSBhbmQgbm90IHByZXJlbGVhc2VzOgogICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlciA9IHNlbGYubG9jYXRvci5sb2NhdGUociwgcHJlcmVsZWFzZXM9VHJ1ZSkKICAgICAgICAgICAgICAgICAgICBpZiBwcm92aWRlciBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0Nhbm5vdCBzYXRpc2Z5ICVyJywgcikKICAgICAgICAgICAgICAgICAgICAgICAgcHJvYmxlbXMuYWRkKCgndW5zYXRpc2ZpZWQnLCByKSkKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBuLCB2ID0gcHJvdmlkZXIua2V5LCBwcm92aWRlci52ZXJzaW9uCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuLCB2KSBub3QgaW4gc2VsZi5kaXN0czoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZG8uYWRkKHByb3ZpZGVyKQogICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlcnMuYWRkKHByb3ZpZGVyKQogICAgICAgICAgICAgICAgICAgICAgICBpZiByIGluIGlyZXF0cyBhbmQgZGlzdCBpbiBpbnN0YWxsX2Rpc3RzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFsbF9kaXN0cy5hZGQocHJvdmlkZXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0FkZGluZyAlcyB0byBpbnN0YWxsX2Rpc3RzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlci5uYW1lX2FuZF92ZXJzaW9uKQogICAgICAgICAgICAgICAgZm9yIHAgaW4gcHJvdmlkZXJzOgogICAgICAgICAgICAgICAgICAgIG5hbWUgPSBwLmtleQogICAgICAgICAgICAgICAgICAgIGlmIG5hbWUgbm90IGluIHNlbGYuZGlzdHNfYnlfbmFtZToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXF0cy5zZXRkZWZhdWx0KHAsIHNldCgpKS5hZGQocikKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBvdGhlciA9IHNlbGYuZGlzdHNfYnlfbmFtZVtuYW1lXQogICAgICAgICAgICAgICAgICAgICAgICBpZiBvdGhlciAhPSBwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzZWUgaWYgb3RoZXIgY2FuIGJlIHJlcGxhY2VkIGJ5IHAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJ5X3RvX3JlcGxhY2UocCwgb3RoZXIsIHByb2JsZW1zKQoKICAgICAgICBkaXN0cyA9IHNldChzZWxmLmRpc3RzLnZhbHVlcygpKQogICAgICAgIGZvciBkaXN0IGluIGRpc3RzOgogICAgICAgICAgICBkaXN0LmJ1aWxkX3RpbWVfZGVwZW5kZW5jeSA9IGRpc3Qgbm90IGluIGluc3RhbGxfZGlzdHMKICAgICAgICAgICAgaWYgZGlzdC5idWlsZF90aW1lX2RlcGVuZGVuY3k6CiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJyVzIGlzIGEgYnVpbGQtdGltZSBkZXBlbmRlbmN5IG9ubHkuJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0Lm5hbWVfYW5kX3ZlcnNpb24pCiAgICAgICAgbG9nZ2VyLmRlYnVnKCdmaW5kIGRvbmUgZm9yICVzJywgb2Rpc3QpCiAgICAgICAgcmV0dXJuIGRpc3RzLCBwcm9ibGVtcwpQSwMEFAAAAAAAAAAhAIaXtZvaOQAA2jkAAC8AAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi9tYW5pZmVzdC5weSMgLSotIGNvZGluZzogdXRmLTggLSotCiMKIyBDb3B5cmlnaHQgKEMpIDIwMTItMjAxMyBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbi4KIyBTZWUgTElDRU5TRS50eHQgYW5kIENPTlRSSUJVVE9SUy50eHQuCiMKIiIiCkNsYXNzIHJlcHJlc2VudGluZyB0aGUgbGlzdCBvZiBmaWxlcyBpbiBhIGRpc3RyaWJ1dGlvbi4KCkVxdWl2YWxlbnQgdG8gZGlzdHV0aWxzLmZpbGVsaXN0LCBidXQgZml4ZXMgc29tZSBwcm9ibGVtcy4KIiIiCmltcG9ydCBmbm1hdGNoCmltcG9ydCBsb2dnaW5nCmltcG9ydCBvcwppbXBvcnQgcmUKaW1wb3J0IHN5cwoKZnJvbSAuIGltcG9ydCBEaXN0bGliRXhjZXB0aW9uCmZyb20gLmNvbXBhdCBpbXBvcnQgZnNkZWNvZGUKZnJvbSAudXRpbCBpbXBvcnQgY29udmVydF9wYXRoCgoKX19hbGxfXyA9IFsnTWFuaWZlc3QnXQoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgojIGEgXCBmb2xsb3dlZCBieSBzb21lIHNwYWNlcyArIEVPTApfQ09MTEFQU0VfUEFUVEVSTiA9IHJlLmNvbXBpbGUoJ1xcXHcqXG4nLCByZS5NKQpfQ09NTUVOVEVEX0xJTkUgPSByZS5jb21waWxlKCcjLio/KD89XG4pfFxuKD89JCknLCByZS5NIHwgcmUuUykKCiMKIyBEdWUgdG8gdGhlIGRpZmZlcmVudCByZXN1bHRzIHJldHVybmVkIGJ5IGZubWF0Y2gudHJhbnNsYXRlLCB3ZSBuZWVkCiMgdG8gZG8gc2xpZ2h0bHkgZGlmZmVyZW50IHByb2Nlc3NpbmcgZm9yIFB5dGhvbiAyLjcgYW5kIDMuMiAuLi4gdGhpcyBuZWVkZWQKIyB0byBiZSBicm91Z2h0IGluIGZvciBQeXRob24gMy42IG9ud2FyZHMuCiMKX1BZVEhPTl9WRVJTSU9OID0gc3lzLnZlcnNpb25faW5mb1s6Ml0KCmNsYXNzIE1hbmlmZXN0KG9iamVjdCk6CiAgICAiIiJBIGxpc3Qgb2YgZmlsZXMgYnVpbHQgYnkgb24gZXhwbG9yaW5nIHRoZSBmaWxlc3lzdGVtIGFuZCBmaWx0ZXJlZCBieQogICAgYXBwbHlpbmcgdmFyaW91cyBwYXR0ZXJucyB0byB3aGF0IHdlIGZpbmQgdGhlcmUuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgYmFzZT1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBJbml0aWFsaXNlIGFuIGluc3RhbmNlLgoKICAgICAgICA6cGFyYW0gYmFzZTogVGhlIGJhc2UgZGlyZWN0b3J5IHRvIGV4cGxvcmUgdW5kZXIuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5iYXNlID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGgubm9ybXBhdGgoYmFzZSBvciBvcy5nZXRjd2QoKSkpCiAgICAgICAgc2VsZi5wcmVmaXggPSBzZWxmLmJhc2UgKyBvcy5zZXAKICAgICAgICBzZWxmLmFsbGZpbGVzID0gTm9uZQogICAgICAgIHNlbGYuZmlsZXMgPSBzZXQoKQoKICAgICMKICAgICMgUHVibGljIEFQSQogICAgIwoKICAgIGRlZiBmaW5kYWxsKHNlbGYpOgogICAgICAgICIiIkZpbmQgYWxsIGZpbGVzIHVuZGVyIHRoZSBiYXNlIGFuZCBzZXQgYGBhbGxmaWxlc2BgIHRvIHRoZSBhYnNvbHV0ZQogICAgICAgIHBhdGhuYW1lcyBvZiBmaWxlcyBmb3VuZC4KICAgICAgICAiIiIKICAgICAgICBmcm9tIHN0YXQgaW1wb3J0IFNfSVNSRUcsIFNfSVNESVIsIFNfSVNMTksKCiAgICAgICAgc2VsZi5hbGxmaWxlcyA9IGFsbGZpbGVzID0gW10KICAgICAgICByb290ID0gc2VsZi5iYXNlCiAgICAgICAgc3RhY2sgPSBbcm9vdF0KICAgICAgICBwb3AgPSBzdGFjay5wb3AKICAgICAgICBwdXNoID0gc3RhY2suYXBwZW5kCgogICAgICAgIHdoaWxlIHN0YWNrOgogICAgICAgICAgICByb290ID0gcG9wKCkKICAgICAgICAgICAgbmFtZXMgPSBvcy5saXN0ZGlyKHJvb3QpCgogICAgICAgICAgICBmb3IgbmFtZSBpbiBuYW1lczoKICAgICAgICAgICAgICAgIGZ1bGxuYW1lID0gb3MucGF0aC5qb2luKHJvb3QsIG5hbWUpCgogICAgICAgICAgICAgICAgIyBBdm9pZCBleGNlc3Mgc3RhdCBjYWxscyAtLSBqdXN0IG9uZSB3aWxsIGRvLCB0aGFuayB5b3UhCiAgICAgICAgICAgICAgICBzdGF0ID0gb3Muc3RhdChmdWxsbmFtZSkKICAgICAgICAgICAgICAgIG1vZGUgPSBzdGF0LnN0X21vZGUKICAgICAgICAgICAgICAgIGlmIFNfSVNSRUcobW9kZSk6CiAgICAgICAgICAgICAgICAgICAgYWxsZmlsZXMuYXBwZW5kKGZzZGVjb2RlKGZ1bGxuYW1lKSkKICAgICAgICAgICAgICAgIGVsaWYgU19JU0RJUihtb2RlKSBhbmQgbm90IFNfSVNMTksobW9kZSk6CiAgICAgICAgICAgICAgICAgICAgcHVzaChmdWxsbmFtZSkKCiAgICBkZWYgYWRkKHNlbGYsIGl0ZW0pOgogICAgICAgICIiIgogICAgICAgIEFkZCBhIGZpbGUgdG8gdGhlIG1hbmlmZXN0LgoKICAgICAgICA6cGFyYW0gaXRlbTogVGhlIHBhdGhuYW1lIHRvIGFkZC4gVGhpcyBjYW4gYmUgcmVsYXRpdmUgdG8gdGhlIGJhc2UuCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IGl0ZW0uc3RhcnRzd2l0aChzZWxmLnByZWZpeCk6CiAgICAgICAgICAgIGl0ZW0gPSBvcy5wYXRoLmpvaW4oc2VsZi5iYXNlLCBpdGVtKQogICAgICAgIHNlbGYuZmlsZXMuYWRkKG9zLnBhdGgubm9ybXBhdGgoaXRlbSkpCgogICAgZGVmIGFkZF9tYW55KHNlbGYsIGl0ZW1zKToKICAgICAgICAiIiIKICAgICAgICBBZGQgYSBsaXN0IG9mIGZpbGVzIHRvIHRoZSBtYW5pZmVzdC4KCiAgICAgICAgOnBhcmFtIGl0ZW1zOiBUaGUgcGF0aG5hbWVzIHRvIGFkZC4gVGhlc2UgY2FuIGJlIHJlbGF0aXZlIHRvIHRoZSBiYXNlLgogICAgICAgICIiIgogICAgICAgIGZvciBpdGVtIGluIGl0ZW1zOgogICAgICAgICAgICBzZWxmLmFkZChpdGVtKQoKICAgIGRlZiBzb3J0ZWQoc2VsZiwgd2FudGRpcnM9RmFsc2UpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBzb3J0ZWQgZmlsZXMgaW4gZGlyZWN0b3J5IG9yZGVyCiAgICAgICAgIiIiCgogICAgICAgIGRlZiBhZGRfZGlyKGRpcnMsIGQpOgogICAgICAgICAgICBkaXJzLmFkZChkKQogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ2FkZF9kaXIgYWRkZWQgJXMnLCBkKQogICAgICAgICAgICBpZiBkICE9IHNlbGYuYmFzZToKICAgICAgICAgICAgICAgIHBhcmVudCwgXyA9IG9zLnBhdGguc3BsaXQoZCkKICAgICAgICAgICAgICAgIGFzc2VydCBwYXJlbnQgbm90IGluICgnJywgJy8nKQogICAgICAgICAgICAgICAgYWRkX2RpcihkaXJzLCBwYXJlbnQpCgogICAgICAgIHJlc3VsdCA9IHNldChzZWxmLmZpbGVzKSAgICAjIG1ha2UgYSBjb3B5IQogICAgICAgIGlmIHdhbnRkaXJzOgogICAgICAgICAgICBkaXJzID0gc2V0KCkKICAgICAgICAgICAgZm9yIGYgaW4gcmVzdWx0OgogICAgICAgICAgICAgICAgYWRkX2RpcihkaXJzLCBvcy5wYXRoLmRpcm5hbWUoZikpCiAgICAgICAgICAgIHJlc3VsdCB8PSBkaXJzCiAgICAgICAgcmV0dXJuIFtvcy5wYXRoLmpvaW4oKnBhdGhfdHVwbGUpIGZvciBwYXRoX3R1cGxlIGluCiAgICAgICAgICAgICAgICBzb3J0ZWQob3MucGF0aC5zcGxpdChwYXRoKSBmb3IgcGF0aCBpbiByZXN1bHQpXQoKICAgIGRlZiBjbGVhcihzZWxmKToKICAgICAgICAiIiJDbGVhciBhbGwgY29sbGVjdGVkIGZpbGVzLiIiIgogICAgICAgIHNlbGYuZmlsZXMgPSBzZXQoKQogICAgICAgIHNlbGYuYWxsZmlsZXMgPSBbXQoKICAgIGRlZiBwcm9jZXNzX2RpcmVjdGl2ZShzZWxmLCBkaXJlY3RpdmUpOgogICAgICAgICIiIgogICAgICAgIFByb2Nlc3MgYSBkaXJlY3RpdmUgd2hpY2ggZWl0aGVyIGFkZHMgc29tZSBmaWxlcyBmcm9tIGBgYWxsZmlsZXNgYCB0bwogICAgICAgIGBgZmlsZXNgYCwgb3IgcmVtb3ZlcyBzb21lIGZpbGVzIGZyb20gYGBmaWxlc2BgLgoKICAgICAgICA6cGFyYW0gZGlyZWN0aXZlOiBUaGUgZGlyZWN0aXZlIHRvIHByb2Nlc3MuIFRoaXMgc2hvdWxkIGJlIGluIGEgZm9ybWF0CiAgICAgICAgICAgICAgICAgICAgIGNvbXBhdGlibGUgd2l0aCBkaXN0dXRpbHMgYGBNQU5JRkVTVC5pbmBgIGZpbGVzOgoKICAgICAgICAgICAgICAgICAgICAgaHR0cDovL2RvY3MucHl0aG9uLm9yZy9kaXN0dXRpbHMvc291cmNlZGlzdC5odG1sI2NvbW1hbmRzCiAgICAgICAgIiIiCiAgICAgICAgIyBQYXJzZSB0aGUgbGluZTogc3BsaXQgaXQgdXAsIG1ha2Ugc3VyZSB0aGUgcmlnaHQgbnVtYmVyIG9mIHdvcmRzCiAgICAgICAgIyBpcyB0aGVyZSwgYW5kIHJldHVybiB0aGUgcmVsZXZhbnQgd29yZHMuICAnYWN0aW9uJyBpcyBhbHdheXMKICAgICAgICAjIGRlZmluZWQ6IGl0J3MgdGhlIGZpcnN0IHdvcmQgb2YgdGhlIGxpbmUuICBXaGljaCBvZiB0aGUgb3RoZXIKICAgICAgICAjIHRocmVlIGFyZSBkZWZpbmVkIGRlcGVuZHMgb24gdGhlIGFjdGlvbjsgaXQnbGwgYmUgZWl0aGVyCiAgICAgICAgIyBwYXR0ZXJucywgKGRpciBhbmQgcGF0dGVybnMpLCBvciAoZGlycGF0dGVybikuCiAgICAgICAgYWN0aW9uLCBwYXR0ZXJucywgdGhlZGlyLCBkaXJwYXR0ZXJuID0gc2VsZi5fcGFyc2VfZGlyZWN0aXZlKGRpcmVjdGl2ZSkKCiAgICAgICAgIyBPSywgbm93IHdlIGtub3cgdGhhdCB0aGUgYWN0aW9uIGlzIHZhbGlkIGFuZCB3ZSBoYXZlIHRoZQogICAgICAgICMgcmlnaHQgbnVtYmVyIG9mIHdvcmRzIG9uIHRoZSBsaW5lIGZvciB0aGF0IGFjdGlvbiAtLSBzbyB3ZQogICAgICAgICMgY2FuIHByb2NlZWQgd2l0aCBtaW5pbWFsIGVycm9yLWNoZWNraW5nLgogICAgICAgIGlmIGFjdGlvbiA9PSAnaW5jbHVkZSc6CiAgICAgICAgICAgIGZvciBwYXR0ZXJuIGluIHBhdHRlcm5zOgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuX2luY2x1ZGVfcGF0dGVybihwYXR0ZXJuLCBhbmNob3I9VHJ1ZSk6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ25vIGZpbGVzIGZvdW5kIG1hdGNoaW5nICVyJywgcGF0dGVybikKCiAgICAgICAgZWxpZiBhY3Rpb24gPT0gJ2V4Y2x1ZGUnOgogICAgICAgICAgICBmb3IgcGF0dGVybiBpbiBwYXR0ZXJuczoKICAgICAgICAgICAgICAgIGZvdW5kID0gc2VsZi5fZXhjbHVkZV9wYXR0ZXJuKHBhdHRlcm4sIGFuY2hvcj1UcnVlKQogICAgICAgICAgICAgICAgI2lmIG5vdCBmb3VuZDoKICAgICAgICAgICAgICAgICMgICAgbG9nZ2VyLndhcm5pbmcoJ25vIHByZXZpb3VzbHktaW5jbHVkZWQgZmlsZXMgJwogICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAnZm91bmQgbWF0Y2hpbmcgJXInLCBwYXR0ZXJuKQoKICAgICAgICBlbGlmIGFjdGlvbiA9PSAnZ2xvYmFsLWluY2x1ZGUnOgogICAgICAgICAgICBmb3IgcGF0dGVybiBpbiBwYXR0ZXJuczoKICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9pbmNsdWRlX3BhdHRlcm4ocGF0dGVybiwgYW5jaG9yPUZhbHNlKToKICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygnbm8gZmlsZXMgZm91bmQgbWF0Y2hpbmcgJXIgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhbnl3aGVyZSBpbiBkaXN0cmlidXRpb24nLCBwYXR0ZXJuKQoKICAgICAgICBlbGlmIGFjdGlvbiA9PSAnZ2xvYmFsLWV4Y2x1ZGUnOgogICAgICAgICAgICBmb3IgcGF0dGVybiBpbiBwYXR0ZXJuczoKICAgICAgICAgICAgICAgIGZvdW5kID0gc2VsZi5fZXhjbHVkZV9wYXR0ZXJuKHBhdHRlcm4sIGFuY2hvcj1GYWxzZSkKICAgICAgICAgICAgICAgICNpZiBub3QgZm91bmQ6CiAgICAgICAgICAgICAgICAjICAgIGxvZ2dlci53YXJuaW5nKCdubyBwcmV2aW91c2x5LWluY2x1ZGVkIGZpbGVzICcKICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgJ21hdGNoaW5nICVyIGZvdW5kIGFueXdoZXJlIGluICcKICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgJ2Rpc3RyaWJ1dGlvbicsIHBhdHRlcm4pCgogICAgICAgIGVsaWYgYWN0aW9uID09ICdyZWN1cnNpdmUtaW5jbHVkZSc6CiAgICAgICAgICAgIGZvciBwYXR0ZXJuIGluIHBhdHRlcm5zOgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuX2luY2x1ZGVfcGF0dGVybihwYXR0ZXJuLCBwcmVmaXg9dGhlZGlyKToKICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygnbm8gZmlsZXMgZm91bmQgbWF0Y2hpbmcgJXIgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1bmRlciBkaXJlY3RvcnkgJXInLCBwYXR0ZXJuLCB0aGVkaXIpCgogICAgICAgIGVsaWYgYWN0aW9uID09ICdyZWN1cnNpdmUtZXhjbHVkZSc6CiAgICAgICAgICAgIGZvciBwYXR0ZXJuIGluIHBhdHRlcm5zOgogICAgICAgICAgICAgICAgZm91bmQgPSBzZWxmLl9leGNsdWRlX3BhdHRlcm4ocGF0dGVybiwgcHJlZml4PXRoZWRpcikKICAgICAgICAgICAgICAgICNpZiBub3QgZm91bmQ6CiAgICAgICAgICAgICAgICAjICAgIGxvZ2dlci53YXJuaW5nKCdubyBwcmV2aW91c2x5LWluY2x1ZGVkIGZpbGVzICcKICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgJ21hdGNoaW5nICVyIGZvdW5kIHVuZGVyIGRpcmVjdG9yeSAlcicsCiAgICAgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAgIHBhdHRlcm4sIHRoZWRpcikKCiAgICAgICAgZWxpZiBhY3Rpb24gPT0gJ2dyYWZ0JzoKICAgICAgICAgICAgaWYgbm90IHNlbGYuX2luY2x1ZGVfcGF0dGVybihOb25lLCBwcmVmaXg9ZGlycGF0dGVybik6CiAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygnbm8gZGlyZWN0b3JpZXMgZm91bmQgbWF0Y2hpbmcgJXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlycGF0dGVybikKCiAgICAgICAgZWxpZiBhY3Rpb24gPT0gJ3BydW5lJzoKICAgICAgICAgICAgaWYgbm90IHNlbGYuX2V4Y2x1ZGVfcGF0dGVybihOb25lLCBwcmVmaXg9ZGlycGF0dGVybik6CiAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygnbm8gcHJldmlvdXNseS1pbmNsdWRlZCBkaXJlY3RvcmllcyBmb3VuZCAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWF0Y2hpbmcgJXInLCBkaXJwYXR0ZXJuKQogICAgICAgIGVsc2U6ICAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgICAgICMgVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLCBhcyBpdCBzaG91bGQgYmUgY2F1Z2h0IGluCiAgICAgICAgICAgICMgX3BhcnNlX3RlbXBsYXRlX2xpbmUKICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICdpbnZhbGlkIGFjdGlvbiAlcicgJSBhY3Rpb24pCgogICAgIwogICAgIyBQcml2YXRlIEFQSQogICAgIwoKICAgIGRlZiBfcGFyc2VfZGlyZWN0aXZlKHNlbGYsIGRpcmVjdGl2ZSk6CiAgICAgICAgIiIiCiAgICAgICAgVmFsaWRhdGUgYSBkaXJlY3RpdmUuCiAgICAgICAgOnBhcmFtIGRpcmVjdGl2ZTogVGhlIGRpcmVjdGl2ZSB0byB2YWxpZGF0ZS4KICAgICAgICA6cmV0dXJuOiBBIHR1cGxlIG9mIGFjdGlvbiwgcGF0dGVybnMsIHRoZWRpciwgZGlyX3BhdHRlcm5zCiAgICAgICAgIiIiCiAgICAgICAgd29yZHMgPSBkaXJlY3RpdmUuc3BsaXQoKQogICAgICAgIGlmIGxlbih3b3JkcykgPT0gMSBhbmQgd29yZHNbMF0gbm90IGluICgnaW5jbHVkZScsICdleGNsdWRlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2dsb2JhbC1pbmNsdWRlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2dsb2JhbC1leGNsdWRlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlY3Vyc2l2ZS1pbmNsdWRlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlY3Vyc2l2ZS1leGNsdWRlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2dyYWZ0JywgJ3BydW5lJyk6CiAgICAgICAgICAgICMgbm8gYWN0aW9uIGdpdmVuLCBsZXQncyB1c2UgdGhlIGRlZmF1bHQgJ2luY2x1ZGUnCiAgICAgICAgICAgIHdvcmRzLmluc2VydCgwLCAnaW5jbHVkZScpCgogICAgICAgIGFjdGlvbiA9IHdvcmRzWzBdCiAgICAgICAgcGF0dGVybnMgPSB0aGVkaXIgPSBkaXJfcGF0dGVybiA9IE5vbmUKCiAgICAgICAgaWYgYWN0aW9uIGluICgnaW5jbHVkZScsICdleGNsdWRlJywKICAgICAgICAgICAgICAgICAgICAgICdnbG9iYWwtaW5jbHVkZScsICdnbG9iYWwtZXhjbHVkZScpOgogICAgICAgICAgICBpZiBsZW4od29yZHMpIDwgMjoKICAgICAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oCiAgICAgICAgICAgICAgICAgICAgJyVyIGV4cGVjdHMgPHBhdHRlcm4xPiA8cGF0dGVybjI+IC4uLicgJSBhY3Rpb24pCgogICAgICAgICAgICBwYXR0ZXJucyA9IFtjb252ZXJ0X3BhdGgod29yZCkgZm9yIHdvcmQgaW4gd29yZHNbMTpdXQoKICAgICAgICBlbGlmIGFjdGlvbiBpbiAoJ3JlY3Vyc2l2ZS1pbmNsdWRlJywgJ3JlY3Vyc2l2ZS1leGNsdWRlJyk6CiAgICAgICAgICAgIGlmIGxlbih3b3JkcykgPCAzOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgICAnJXIgZXhwZWN0cyA8ZGlyPiA8cGF0dGVybjE+IDxwYXR0ZXJuMj4gLi4uJyAlIGFjdGlvbikKCiAgICAgICAgICAgIHRoZWRpciA9IGNvbnZlcnRfcGF0aCh3b3Jkc1sxXSkKICAgICAgICAgICAgcGF0dGVybnMgPSBbY29udmVydF9wYXRoKHdvcmQpIGZvciB3b3JkIGluIHdvcmRzWzI6XV0KCiAgICAgICAgZWxpZiBhY3Rpb24gaW4gKCdncmFmdCcsICdwcnVuZScpOgogICAgICAgICAgICBpZiBsZW4od29yZHMpICE9IDI6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICAgICclciBleHBlY3RzIGEgc2luZ2xlIDxkaXJfcGF0dGVybj4nICUgYWN0aW9uKQoKICAgICAgICAgICAgZGlyX3BhdHRlcm4gPSBjb252ZXJ0X3BhdGgod29yZHNbMV0pCgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ3Vua25vd24gYWN0aW9uICVyJyAlIGFjdGlvbikKCiAgICAgICAgcmV0dXJuIGFjdGlvbiwgcGF0dGVybnMsIHRoZWRpciwgZGlyX3BhdHRlcm4KCiAgICBkZWYgX2luY2x1ZGVfcGF0dGVybihzZWxmLCBwYXR0ZXJuLCBhbmNob3I9VHJ1ZSwgcHJlZml4PU5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICBpc19yZWdleD1GYWxzZSk6CiAgICAgICAgIiIiU2VsZWN0IHN0cmluZ3MgKHByZXN1bWFibHkgZmlsZW5hbWVzKSBmcm9tICdzZWxmLmZpbGVzJyB0aGF0CiAgICAgICAgbWF0Y2ggJ3BhdHRlcm4nLCBhIFVuaXgtc3R5bGUgd2lsZGNhcmQgKGdsb2IpIHBhdHRlcm4uCgogICAgICAgIFBhdHRlcm5zIGFyZSBub3QgcXVpdGUgdGhlIHNhbWUgYXMgaW1wbGVtZW50ZWQgYnkgdGhlICdmbm1hdGNoJwogICAgICAgIG1vZHVsZTogJyonIGFuZCAnPycgIG1hdGNoIG5vbi1zcGVjaWFsIGNoYXJhY3RlcnMsIHdoZXJlICJzcGVjaWFsIgogICAgICAgIGlzIHBsYXRmb3JtLWRlcGVuZGVudDogc2xhc2ggb24gVW5peDsgY29sb24sIHNsYXNoLCBhbmQgYmFja3NsYXNoIG9uCiAgICAgICAgRE9TL1dpbmRvd3M7IGFuZCBjb2xvbiBvbiBNYWMgT1MuCgogICAgICAgIElmICdhbmNob3InIGlzIHRydWUgKHRoZSBkZWZhdWx0KSwgdGhlbiB0aGUgcGF0dGVybiBtYXRjaCBpcyBtb3JlCiAgICAgICAgc3RyaW5nZW50OiAiKi5weSIgd2lsbCBtYXRjaCAiZm9vLnB5IiBidXQgbm90ICJmb28vYmFyLnB5Ii4gIElmCiAgICAgICAgJ2FuY2hvcicgaXMgZmFsc2UsIGJvdGggb2YgdGhlc2Ugd2lsbCBtYXRjaC4KCiAgICAgICAgSWYgJ3ByZWZpeCcgaXMgc3VwcGxpZWQsIHRoZW4gb25seSBmaWxlbmFtZXMgc3RhcnRpbmcgd2l0aCAncHJlZml4JwogICAgICAgIChpdHNlbGYgYSBwYXR0ZXJuKSBhbmQgZW5kaW5nIHdpdGggJ3BhdHRlcm4nLCB3aXRoIGFueXRoaW5nIGluIGJldHdlZW4KICAgICAgICB0aGVtLCB3aWxsIG1hdGNoLiAgJ2FuY2hvcicgaXMgaWdub3JlZCBpbiB0aGlzIGNhc2UuCgogICAgICAgIElmICdpc19yZWdleCcgaXMgdHJ1ZSwgJ2FuY2hvcicgYW5kICdwcmVmaXgnIGFyZSBpZ25vcmVkLCBhbmQKICAgICAgICAncGF0dGVybicgaXMgYXNzdW1lZCB0byBiZSBlaXRoZXIgYSBzdHJpbmcgY29udGFpbmluZyBhIHJlZ2V4IG9yIGEKICAgICAgICByZWdleCBvYmplY3QgLS0gbm8gdHJhbnNsYXRpb24gaXMgZG9uZSwgdGhlIHJlZ2V4IGlzIGp1c3QgY29tcGlsZWQKICAgICAgICBhbmQgdXNlZCBhcy1pcy4KCiAgICAgICAgU2VsZWN0ZWQgc3RyaW5ncyB3aWxsIGJlIGFkZGVkIHRvIHNlbGYuZmlsZXMuCgogICAgICAgIFJldHVybiBUcnVlIGlmIGZpbGVzIGFyZSBmb3VuZC4KICAgICAgICAiIiIKICAgICAgICAjIFhYWCBkb2NzdHJpbmcgbHlpbmcgYWJvdXQgd2hhdCB0aGUgc3BlY2lhbCBjaGFycyBhcmU/CiAgICAgICAgZm91bmQgPSBGYWxzZQogICAgICAgIHBhdHRlcm5fcmUgPSBzZWxmLl90cmFuc2xhdGVfcGF0dGVybihwYXR0ZXJuLCBhbmNob3IsIHByZWZpeCwgaXNfcmVnZXgpCgogICAgICAgICMgZGVsYXllZCBsb2FkaW5nIG9mIGFsbGZpbGVzIGxpc3QKICAgICAgICBpZiBzZWxmLmFsbGZpbGVzIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuZmluZGFsbCgpCgogICAgICAgIGZvciBuYW1lIGluIHNlbGYuYWxsZmlsZXM6CiAgICAgICAgICAgIGlmIHBhdHRlcm5fcmUuc2VhcmNoKG5hbWUpOgogICAgICAgICAgICAgICAgc2VsZi5maWxlcy5hZGQobmFtZSkKICAgICAgICAgICAgICAgIGZvdW5kID0gVHJ1ZQogICAgICAgIHJldHVybiBmb3VuZAoKICAgIGRlZiBfZXhjbHVkZV9wYXR0ZXJuKHNlbGYsIHBhdHRlcm4sIGFuY2hvcj1UcnVlLCBwcmVmaXg9Tm9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3JlZ2V4PUZhbHNlKToKICAgICAgICAiIiJSZW1vdmUgc3RyaW5ncyAocHJlc3VtYWJseSBmaWxlbmFtZXMpIGZyb20gJ2ZpbGVzJyB0aGF0IG1hdGNoCiAgICAgICAgJ3BhdHRlcm4nLgoKICAgICAgICBPdGhlciBwYXJhbWV0ZXJzIGFyZSB0aGUgc2FtZSBhcyBmb3IgJ2luY2x1ZGVfcGF0dGVybigpJywgYWJvdmUuCiAgICAgICAgVGhlIGxpc3QgJ3NlbGYuZmlsZXMnIGlzIG1vZGlmaWVkIGluIHBsYWNlLiBSZXR1cm4gVHJ1ZSBpZiBmaWxlcyBhcmUKICAgICAgICBmb3VuZC4KCiAgICAgICAgVGhpcyBBUEkgaXMgcHVibGljIHRvIGFsbG93IGUuZy4gZXhjbHVzaW9uIG9mIFNDTSBzdWJkaXJzLCBlLmcuIHdoZW4KICAgICAgICBwYWNrYWdpbmcgc291cmNlIGRpc3RyaWJ1dGlvbnMKICAgICAgICAiIiIKICAgICAgICBmb3VuZCA9IEZhbHNlCiAgICAgICAgcGF0dGVybl9yZSA9IHNlbGYuX3RyYW5zbGF0ZV9wYXR0ZXJuKHBhdHRlcm4sIGFuY2hvciwgcHJlZml4LCBpc19yZWdleCkKICAgICAgICBmb3IgZiBpbiBsaXN0KHNlbGYuZmlsZXMpOgogICAgICAgICAgICBpZiBwYXR0ZXJuX3JlLnNlYXJjaChmKToKICAgICAgICAgICAgICAgIHNlbGYuZmlsZXMucmVtb3ZlKGYpCiAgICAgICAgICAgICAgICBmb3VuZCA9IFRydWUKICAgICAgICByZXR1cm4gZm91bmQKCiAgICBkZWYgX3RyYW5zbGF0ZV9wYXR0ZXJuKHNlbGYsIHBhdHRlcm4sIGFuY2hvcj1UcnVlLCBwcmVmaXg9Tm9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfcmVnZXg9RmFsc2UpOgogICAgICAgICIiIlRyYW5zbGF0ZSBhIHNoZWxsLWxpa2Ugd2lsZGNhcmQgcGF0dGVybiB0byBhIGNvbXBpbGVkIHJlZ3VsYXIKICAgICAgICBleHByZXNzaW9uLgoKICAgICAgICBSZXR1cm4gdGhlIGNvbXBpbGVkIHJlZ2V4LiAgSWYgJ2lzX3JlZ2V4JyB0cnVlLAogICAgICAgIHRoZW4gJ3BhdHRlcm4nIGlzIGRpcmVjdGx5IGNvbXBpbGVkIHRvIGEgcmVnZXggKGlmIGl0J3MgYSBzdHJpbmcpCiAgICAgICAgb3IganVzdCByZXR1cm5lZCBhcy1pcyAoYXNzdW1lcyBpdCdzIGEgcmVnZXggb2JqZWN0KS4KICAgICAgICAiIiIKICAgICAgICBpZiBpc19yZWdleDoKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShwYXR0ZXJuLCBzdHIpOgogICAgICAgICAgICAgICAgcmV0dXJuIHJlLmNvbXBpbGUocGF0dGVybikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiBwYXR0ZXJuCgogICAgICAgIGlmIF9QWVRIT05fVkVSU0lPTiA+ICgzLCAyKToKICAgICAgICAgICAgIyBkaXRjaCBzdGFydCBhbmQgZW5kIGNoYXJhY3RlcnMKICAgICAgICAgICAgc3RhcnQsIF8sIGVuZCA9IHNlbGYuX2dsb2JfdG9fcmUoJ18nKS5wYXJ0aXRpb24oJ18nKQoKICAgICAgICBpZiBwYXR0ZXJuOgogICAgICAgICAgICBwYXR0ZXJuX3JlID0gc2VsZi5fZ2xvYl90b19yZShwYXR0ZXJuKQogICAgICAgICAgICBpZiBfUFlUSE9OX1ZFUlNJT04gPiAoMywgMik6CiAgICAgICAgICAgICAgICBhc3NlcnQgcGF0dGVybl9yZS5zdGFydHN3aXRoKHN0YXJ0KSBhbmQgcGF0dGVybl9yZS5lbmRzd2l0aChlbmQpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcGF0dGVybl9yZSA9ICcnCgogICAgICAgIGJhc2UgPSByZS5lc2NhcGUob3MucGF0aC5qb2luKHNlbGYuYmFzZSwgJycpKQogICAgICAgIGlmIHByZWZpeCBpcyBub3QgTm9uZToKICAgICAgICAgICAgIyBkaXRjaCBlbmQgb2YgcGF0dGVybiBjaGFyYWN0ZXIKICAgICAgICAgICAgaWYgX1BZVEhPTl9WRVJTSU9OIDw9ICgzLCAyKToKICAgICAgICAgICAgICAgIGVtcHR5X3BhdHRlcm4gPSBzZWxmLl9nbG9iX3RvX3JlKCcnKQogICAgICAgICAgICAgICAgcHJlZml4X3JlID0gc2VsZi5fZ2xvYl90b19yZShwcmVmaXgpWzotbGVuKGVtcHR5X3BhdHRlcm4pXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcHJlZml4X3JlID0gc2VsZi5fZ2xvYl90b19yZShwcmVmaXgpCiAgICAgICAgICAgICAgICBhc3NlcnQgcHJlZml4X3JlLnN0YXJ0c3dpdGgoc3RhcnQpIGFuZCBwcmVmaXhfcmUuZW5kc3dpdGgoZW5kKQogICAgICAgICAgICAgICAgcHJlZml4X3JlID0gcHJlZml4X3JlW2xlbihzdGFydCk6IGxlbihwcmVmaXhfcmUpIC0gbGVuKGVuZCldCiAgICAgICAgICAgIHNlcCA9IG9zLnNlcAogICAgICAgICAgICBpZiBvcy5zZXAgPT0gJ1xcJzoKICAgICAgICAgICAgICAgIHNlcCA9IHInXFwnCiAgICAgICAgICAgIGlmIF9QWVRIT05fVkVSU0lPTiA8PSAoMywgMik6CiAgICAgICAgICAgICAgICBwYXR0ZXJuX3JlID0gJ14nICsgYmFzZSArIHNlcC5qb2luKChwcmVmaXhfcmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLionICsgcGF0dGVybl9yZSkpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwYXR0ZXJuX3JlID0gcGF0dGVybl9yZVtsZW4oc3RhcnQpOiBsZW4ocGF0dGVybl9yZSkgLSBsZW4oZW5kKV0KICAgICAgICAgICAgICAgIHBhdHRlcm5fcmUgPSByJyVzJXMlcyVzLiolcyVzJyAlIChzdGFydCwgYmFzZSwgcHJlZml4X3JlLCBzZXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybl9yZSwgZW5kKQogICAgICAgIGVsc2U6ICAjIG5vIHByZWZpeCAtLSByZXNwZWN0IGFuY2hvciBmbGFnCiAgICAgICAgICAgIGlmIGFuY2hvcjoKICAgICAgICAgICAgICAgIGlmIF9QWVRIT05fVkVSU0lPTiA8PSAoMywgMik6CiAgICAgICAgICAgICAgICAgICAgcGF0dGVybl9yZSA9ICdeJyArIGJhc2UgKyBwYXR0ZXJuX3JlCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHBhdHRlcm5fcmUgPSByJyVzJXMlcycgJSAoc3RhcnQsIGJhc2UsIHBhdHRlcm5fcmVbbGVuKHN0YXJ0KTpdKQoKICAgICAgICByZXR1cm4gcmUuY29tcGlsZShwYXR0ZXJuX3JlKQoKICAgIGRlZiBfZ2xvYl90b19yZShzZWxmLCBwYXR0ZXJuKToKICAgICAgICAiIiJUcmFuc2xhdGUgYSBzaGVsbC1saWtlIGdsb2IgcGF0dGVybiB0byBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4KCiAgICAgICAgUmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHJlZ2V4LiAgRGlmZmVycyBmcm9tCiAgICAgICAgJ2ZubWF0Y2gudHJhbnNsYXRlKCknIGluIHRoYXQgJyonIGRvZXMgbm90IG1hdGNoICJzcGVjaWFsIGNoYXJhY3RlcnMiCiAgICAgICAgKHdoaWNoIGFyZSBwbGF0Zm9ybS1zcGVjaWZpYykuCiAgICAgICAgIiIiCiAgICAgICAgcGF0dGVybl9yZSA9IGZubWF0Y2gudHJhbnNsYXRlKHBhdHRlcm4pCgogICAgICAgICMgJz8nIGFuZCAnKicgaW4gdGhlIGdsb2IgcGF0dGVybiBiZWNvbWUgJy4nIGFuZCAnLionIGluIHRoZSBSRSwgd2hpY2gKICAgICAgICAjIElNSE8gaXMgd3JvbmcgLS0gJz8nIGFuZCAnKicgYXJlbid0IHN1cHBvc2VkIHRvIG1hdGNoIHNsYXNoIGluIFVuaXgsCiAgICAgICAgIyBhbmQgYnkgZXh0ZW5zaW9uIHRoZXkgc2hvdWxkbid0IG1hdGNoIHN1Y2ggInNwZWNpYWwgY2hhcmFjdGVycyIgdW5kZXIKICAgICAgICAjIGFueSBPUy4gIFNvIGNoYW5nZSBhbGwgbm9uLWVzY2FwZWQgZG90cyBpbiB0aGUgUkUgdG8gbWF0Y2ggYW55CiAgICAgICAgIyBjaGFyYWN0ZXIgZXhjZXB0IHRoZSBzcGVjaWFsIGNoYXJhY3RlcnMgKGN1cnJlbnRseToganVzdCBvcy5zZXApLgogICAgICAgIHNlcCA9IG9zLnNlcAogICAgICAgIGlmIG9zLnNlcCA9PSAnXFwnOgogICAgICAgICAgICAjIHdlJ3JlIHVzaW5nIGEgcmVnZXggdG8gbWFuaXB1bGF0ZSBhIHJlZ2V4LCBzbyB3ZSBuZWVkCiAgICAgICAgICAgICMgdG8gZXNjYXBlIHRoZSBiYWNrc2xhc2ggdHdpY2UKICAgICAgICAgICAgc2VwID0gcidcXFxcJwogICAgICAgIGVzY2FwZWQgPSByJ1wxW14lc10nICUgc2VwCiAgICAgICAgcGF0dGVybl9yZSA9IHJlLnN1YihyJygoPzwhXFwpKFxcXFwpKilcLicsIGVzY2FwZWQsIHBhdHRlcm5fcmUpCiAgICAgICAgcmV0dXJuIHBhdHRlcm5fcmUKUEsDBBQAAAAAAAAAIQA9Ea4CihgAAIoYAAAuAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvbWFya2Vycy5weSMgLSotIGNvZGluZzogdXRmLTggLSotCiMKIyBDb3B5cmlnaHQgKEMpIDIwMTItMjAxMyBWaW5heSBTYWppcC4KIyBMaWNlbnNlZCB0byB0aGUgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24gdW5kZXIgYSBjb250cmlidXRvciBhZ3JlZW1lbnQuCiMgU2VlIExJQ0VOU0UudHh0IGFuZCBDT05UUklCVVRPUlMudHh0LgojCiIiIlBhcnNlciBmb3IgdGhlIGVudmlyb25tZW50IG1hcmtlcnMgbWljcm8tbGFuZ3VhZ2UgZGVmaW5lZCBpbiBQRVAgMzQ1LiIiIgoKaW1wb3J0IGFzdAppbXBvcnQgb3MKaW1wb3J0IHN5cwppbXBvcnQgcGxhdGZvcm0KCmZyb20gLmNvbXBhdCBpbXBvcnQgcHl0aG9uX2ltcGxlbWVudGF0aW9uLCBzdHJpbmdfdHlwZXMKZnJvbSAudXRpbCBpbXBvcnQgaW5fdmVudgoKX19hbGxfXyA9IFsnaW50ZXJwcmV0J10KCgpjbGFzcyBFdmFsdWF0b3Iob2JqZWN0KToKICAgICIiIgogICAgQSBsaW1pdGVkIGV2YWx1YXRvciBmb3IgUHl0aG9uIGV4cHJlc3Npb25zLgogICAgIiIiCgogICAgb3BlcmF0b3JzID0gewogICAgICAgICdlcSc6IGxhbWJkYSB4LCB5OiB4ID09IHksCiAgICAgICAgJ2d0JzogbGFtYmRhIHgsIHk6IHggPiB5LAogICAgICAgICdndGUnOiBsYW1iZGEgeCwgeTogeCA+PSB5LAogICAgICAgICdpbic6IGxhbWJkYSB4LCB5OiB4IGluIHksCiAgICAgICAgJ2x0JzogbGFtYmRhIHgsIHk6IHggPCB5LAogICAgICAgICdsdGUnOiBsYW1iZGEgeCwgeTogeCA8PSB5LAogICAgICAgICdub3QnOiBsYW1iZGEgeDogbm90IHgsCiAgICAgICAgJ25vdGVxJzogbGFtYmRhIHgsIHk6IHggIT0geSwKICAgICAgICAnbm90aW4nOiBsYW1iZGEgeCwgeTogeCBub3QgaW4geSwKICAgIH0KCiAgICBhbGxvd2VkX3ZhbHVlcyA9IHsKICAgICAgICAnc3lzX3BsYXRmb3JtJzogc3lzLnBsYXRmb3JtLAogICAgICAgICdweXRob25fdmVyc2lvbic6ICclcy4lcycgJSBzeXMudmVyc2lvbl9pbmZvWzoyXSwKICAgICAgICAjIHBhcnNpbmcgc3lzLnBsYXRmb3JtIGlzIG5vdCByZWxpYWJsZSwgYnV0IHRoZXJlIGlzIG5vIG90aGVyCiAgICAgICAgIyB3YXkgdG8gZ2V0IGUuZy4gMi43LjIrLCBhbmQgdGhlIFBFUCBpcyBkZWZpbmVkIHdpdGggc3lzLnZlcnNpb24KICAgICAgICAncHl0aG9uX2Z1bGxfdmVyc2lvbic6IHN5cy52ZXJzaW9uLnNwbGl0KCcgJywgMSlbMF0sCiAgICAgICAgJ29zX25hbWUnOiBvcy5uYW1lLAogICAgICAgICdwbGF0Zm9ybV9pbl92ZW52Jzogc3RyKGluX3ZlbnYoKSksCiAgICAgICAgJ3BsYXRmb3JtX3JlbGVhc2UnOiBwbGF0Zm9ybS5yZWxlYXNlKCksCiAgICAgICAgJ3BsYXRmb3JtX3ZlcnNpb24nOiBwbGF0Zm9ybS52ZXJzaW9uKCksCiAgICAgICAgJ3BsYXRmb3JtX21hY2hpbmUnOiBwbGF0Zm9ybS5tYWNoaW5lKCksCiAgICAgICAgJ3BsYXRmb3JtX3B5dGhvbl9pbXBsZW1lbnRhdGlvbic6IHB5dGhvbl9pbXBsZW1lbnRhdGlvbigpLAogICAgfQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb250ZXh0PU5vbmUpOgogICAgICAgICIiIgogICAgICAgIEluaXRpYWxpc2UgYW4gaW5zdGFuY2UuCgogICAgICAgIDpwYXJhbSBjb250ZXh0OiBJZiBzcGVjaWZpZWQsIG5hbWVzIGFyZSBsb29rZWQgdXAgaW4gdGhpcyBtYXBwaW5nLgogICAgICAgICIiIgogICAgICAgIHNlbGYuY29udGV4dCA9IGNvbnRleHQgb3Ige30KICAgICAgICBzZWxmLnNvdXJjZSA9IE5vbmUKCiAgICBkZWYgZ2V0X2ZyYWdtZW50KHNlbGYsIG9mZnNldCk6CiAgICAgICAgIiIiCiAgICAgICAgR2V0IHRoZSBwYXJ0IG9mIHRoZSBzb3VyY2Ugd2hpY2ggaXMgY2F1c2luZyBhIHByb2JsZW0uCiAgICAgICAgIiIiCiAgICAgICAgZnJhZ21lbnRfbGVuID0gMTAKICAgICAgICBzID0gJyVyJyAlIChzZWxmLnNvdXJjZVtvZmZzZXQ6b2Zmc2V0ICsgZnJhZ21lbnRfbGVuXSkKICAgICAgICBpZiBvZmZzZXQgKyBmcmFnbWVudF9sZW4gPCBsZW4oc2VsZi5zb3VyY2UpOgogICAgICAgICAgICBzICs9ICcuLi4nCiAgICAgICAgcmV0dXJuIHMKCiAgICBkZWYgZ2V0X2hhbmRsZXIoc2VsZiwgbm9kZV90eXBlKToKICAgICAgICAiIiIKICAgICAgICBHZXQgYSBoYW5kbGVyIGZvciB0aGUgc3BlY2lmaWVkIEFTVCBub2RlIHR5cGUuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZiwgJ2RvXyVzJyAlIG5vZGVfdHlwZSwgTm9uZSkKCiAgICBkZWYgZXZhbHVhdGUoc2VsZiwgbm9kZSwgZmlsZW5hbWU9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgRXZhbHVhdGUgYSBzb3VyY2Ugc3RyaW5nIG9yIG5vZGUsIHVzaW5nIGBgZmlsZW5hbWVgYCB3aGVuCiAgICAgICAgZGlzcGxheWluZyBlcnJvcnMuCiAgICAgICAgIiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLCBzdHJpbmdfdHlwZXMpOgogICAgICAgICAgICBzZWxmLnNvdXJjZSA9IG5vZGUKICAgICAgICAgICAga3dhcmdzID0geydtb2RlJzogJ2V2YWwnfQogICAgICAgICAgICBpZiBmaWxlbmFtZToKICAgICAgICAgICAgICAgIGt3YXJnc1snZmlsZW5hbWUnXSA9IGZpbGVuYW1lCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIG5vZGUgPSBhc3QucGFyc2Uobm9kZSwgKiprd2FyZ3MpCiAgICAgICAgICAgIGV4Y2VwdCBTeW50YXhFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgcyA9IHNlbGYuZ2V0X2ZyYWdtZW50KGUub2Zmc2V0KQogICAgICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IoJ3N5bnRheCBlcnJvciAlcycgJSBzKQogICAgICAgIG5vZGVfdHlwZSA9IG5vZGUuX19jbGFzc19fLl9fbmFtZV9fLmxvd2VyKCkKICAgICAgICBoYW5kbGVyID0gc2VsZi5nZXRfaGFuZGxlcihub2RlX3R5cGUpCiAgICAgICAgaWYgaGFuZGxlciBpcyBOb25lOgogICAgICAgICAgICBpZiBzZWxmLnNvdXJjZSBpcyBOb25lOgogICAgICAgICAgICAgICAgcyA9ICcoc291cmNlIG5vdCBhdmFpbGFibGUpJwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcyA9IHNlbGYuZ2V0X2ZyYWdtZW50KG5vZGUuY29sX29mZnNldCkKICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IoImRvbid0IGtub3cgaG93IHRvIGV2YWx1YXRlICVyICVzIiAlICgKICAgICAgICAgICAgICAgIG5vZGVfdHlwZSwgcykpCiAgICAgICAgcmV0dXJuIGhhbmRsZXIobm9kZSkKCiAgICBkZWYgZ2V0X2F0dHJfa2V5KHNlbGYsIG5vZGUpOgogICAgICAgIGFzc2VydCBpc2luc3RhbmNlKG5vZGUsIGFzdC5BdHRyaWJ1dGUpLCAnYXR0cmlidXRlIG5vZGUgZXhwZWN0ZWQnCiAgICAgICAgcmV0dXJuICclcy4lcycgJSAobm9kZS52YWx1ZS5pZCwgbm9kZS5hdHRyKQoKICAgIGRlZiBkb19hdHRyaWJ1dGUoc2VsZiwgbm9kZSk6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uobm9kZS52YWx1ZSwgYXN0Lk5hbWUpOgogICAgICAgICAgICB2YWxpZCA9IEZhbHNlCiAgICAgICAgZWxzZToKICAgICAgICAgICAga2V5ID0gc2VsZi5nZXRfYXR0cl9rZXkobm9kZSkKICAgICAgICAgICAgdmFsaWQgPSBrZXkgaW4gc2VsZi5jb250ZXh0IG9yIGtleSBpbiBzZWxmLmFsbG93ZWRfdmFsdWVzCiAgICAgICAgaWYgbm90IHZhbGlkOgogICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvcignaW52YWxpZCBleHByZXNzaW9uOiAlcycgJSBrZXkpCiAgICAgICAgaWYga2V5IGluIHNlbGYuY29udGV4dDoKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5jb250ZXh0W2tleV0KICAgICAgICBlbHNlOgogICAgICAgICAgICByZXN1bHQgPSBzZWxmLmFsbG93ZWRfdmFsdWVzW2tleV0KICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIGRvX2Jvb2xvcChzZWxmLCBub2RlKToKICAgICAgICByZXN1bHQgPSBzZWxmLmV2YWx1YXRlKG5vZGUudmFsdWVzWzBdKQogICAgICAgIGlzX29yID0gbm9kZS5vcC5fX2NsYXNzX18gaXMgYXN0Lk9yCiAgICAgICAgaXNfYW5kID0gbm9kZS5vcC5fX2NsYXNzX18gaXMgYXN0LkFuZAogICAgICAgIGFzc2VydCBpc19vciBvciBpc19hbmQKICAgICAgICBpZiAoaXNfYW5kIGFuZCByZXN1bHQpIG9yIChpc19vciBhbmQgbm90IHJlc3VsdCk6CiAgICAgICAgICAgIGZvciBuIGluIG5vZGUudmFsdWVzWzE6XToKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuZXZhbHVhdGUobikKICAgICAgICAgICAgICAgIGlmIChpc19vciBhbmQgcmVzdWx0KSBvciAoaXNfYW5kIGFuZCBub3QgcmVzdWx0KToKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgZG9fY29tcGFyZShzZWxmLCBub2RlKToKICAgICAgICBkZWYgc2FuaXR5X2NoZWNrKGxoc25vZGUsIHJoc25vZGUpOgogICAgICAgICAgICB2YWxpZCA9IFRydWUKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShsaHNub2RlLCBhc3QuU3RyKSBhbmQgaXNpbnN0YW5jZShyaHNub2RlLCBhc3QuU3RyKToKICAgICAgICAgICAgICAgIHZhbGlkID0gRmFsc2UKICAgICAgICAgICAgI2VsaWYgKGlzaW5zdGFuY2UobGhzbm9kZSwgYXN0LkF0dHJpYnV0ZSkKICAgICAgICAgICAgIyAgICAgIGFuZCBpc2luc3RhbmNlKHJoc25vZGUsIGFzdC5BdHRyaWJ1dGUpKToKICAgICAgICAgICAgIyAgICBrbGhzID0gc2VsZi5nZXRfYXR0cl9rZXkobGhzbm9kZSkKICAgICAgICAgICAgIyAgICBrcmhzID0gc2VsZi5nZXRfYXR0cl9rZXkocmhzbm9kZSkKICAgICAgICAgICAgIyAgICB2YWxpZCA9IGtsaHMgIT0ga3JocwogICAgICAgICAgICBpZiBub3QgdmFsaWQ6CiAgICAgICAgICAgICAgICBzID0gc2VsZi5nZXRfZnJhZ21lbnQobm9kZS5jb2xfb2Zmc2V0KQogICAgICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IoJ0ludmFsaWQgY29tcGFyaXNvbjogJXMnICUgcykKCiAgICAgICAgbGhzbm9kZSA9IG5vZGUubGVmdAogICAgICAgIGxocyA9IHNlbGYuZXZhbHVhdGUobGhzbm9kZSkKICAgICAgICByZXN1bHQgPSBUcnVlCiAgICAgICAgZm9yIG9wLCByaHNub2RlIGluIHppcChub2RlLm9wcywgbm9kZS5jb21wYXJhdG9ycyk6CiAgICAgICAgICAgIHNhbml0eV9jaGVjayhsaHNub2RlLCByaHNub2RlKQogICAgICAgICAgICBvcCA9IG9wLl9fY2xhc3NfXy5fX25hbWVfXy5sb3dlcigpCiAgICAgICAgICAgIGlmIG9wIG5vdCBpbiBzZWxmLm9wZXJhdG9yczoKICAgICAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yKCd1bnN1cHBvcnRlZCBvcGVyYXRpb246ICVyJyAlIG9wKQogICAgICAgICAgICByaHMgPSBzZWxmLmV2YWx1YXRlKHJoc25vZGUpCiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYub3BlcmF0b3JzW29wXShsaHMsIHJocykKICAgICAgICAgICAgaWYgbm90IHJlc3VsdDoKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGxocyA9IHJocwogICAgICAgICAgICBsaHNub2RlID0gcmhzbm9kZQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgZG9fZXhwcmVzc2lvbihzZWxmLCBub2RlKToKICAgICAgICByZXR1cm4gc2VsZi5ldmFsdWF0ZShub2RlLmJvZHkpCgogICAgZGVmIGRvX25hbWUoc2VsZiwgbm9kZSk6CiAgICAgICAgdmFsaWQgPSBGYWxzZQogICAgICAgIGlmIG5vZGUuaWQgaW4gc2VsZi5jb250ZXh0OgogICAgICAgICAgICB2YWxpZCA9IFRydWUKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5jb250ZXh0W25vZGUuaWRdCiAgICAgICAgZWxpZiBub2RlLmlkIGluIHNlbGYuYWxsb3dlZF92YWx1ZXM6CiAgICAgICAgICAgIHZhbGlkID0gVHJ1ZQogICAgICAgICAgICByZXN1bHQgPSBzZWxmLmFsbG93ZWRfdmFsdWVzW25vZGUuaWRdCiAgICAgICAgaWYgbm90IHZhbGlkOgogICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvcignaW52YWxpZCBleHByZXNzaW9uOiAlcycgJSBub2RlLmlkKQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgZG9fc3RyKHNlbGYsIG5vZGUpOgogICAgICAgIHJldHVybiBub2RlLnMKCgpkZWYgaW50ZXJwcmV0KG1hcmtlciwgZXhlY3V0aW9uX2NvbnRleHQ9Tm9uZSk6CiAgICAiIiIKICAgIEludGVycHJldCBhIG1hcmtlciBhbmQgcmV0dXJuIGEgcmVzdWx0IGRlcGVuZGluZyBvbiBlbnZpcm9ubWVudC4KCiAgICA6cGFyYW0gbWFya2VyOiBUaGUgbWFya2VyIHRvIGludGVycHJldC4KICAgIDp0eXBlIG1hcmtlcjogc3RyCiAgICA6cGFyYW0gZXhlY3V0aW9uX2NvbnRleHQ6IFRoZSBjb250ZXh0IHVzZWQgZm9yIG5hbWUgbG9va3VwLgogICAgOnR5cGUgZXhlY3V0aW9uX2NvbnRleHQ6IG1hcHBpbmcKICAgICIiIgogICAgcmV0dXJuIEV2YWx1YXRvcihleGVjdXRpb25fY29udGV4dCkuZXZhbHVhdGUobWFya2VyLnN0cmlwKCkpClBLAwQUAAAAAAAAACEADaZs8bGXAACxlwAALwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL21ldGFkYXRhLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KIwojIENvcHlyaWdodCAoQykgMjAxMiBUaGUgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24uCiMgU2VlIExJQ0VOU0UudHh0IGFuZCBDT05UUklCVVRPUlMudHh0LgojCiIiIkltcGxlbWVudGF0aW9uIG9mIHRoZSBNZXRhZGF0YSBmb3IgUHl0aG9uIHBhY2thZ2VzIFBFUHMuCgpTdXBwb3J0cyBhbGwgbWV0YWRhdGEgZm9ybWF0cyAoMS4wLCAxLjEsIDEuMiwgYW5kIDIuMCBleHBlcmltZW50YWwpLgoiIiIKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB1bmljb2RlX2xpdGVyYWxzCgppbXBvcnQgY29kZWNzCmZyb20gZW1haWwgaW1wb3J0IG1lc3NhZ2VfZnJvbV9maWxlCmltcG9ydCBqc29uCmltcG9ydCBsb2dnaW5nCmltcG9ydCByZQoKCmZyb20gLiBpbXBvcnQgRGlzdGxpYkV4Y2VwdGlvbiwgX192ZXJzaW9uX18KZnJvbSAuY29tcGF0IGltcG9ydCBTdHJpbmdJTywgc3RyaW5nX3R5cGVzLCB0ZXh0X3R5cGUKZnJvbSAubWFya2VycyBpbXBvcnQgaW50ZXJwcmV0CmZyb20gLnV0aWwgaW1wb3J0IGV4dHJhY3RfYnlfa2V5LCBnZXRfZXh0cmFzCmZyb20gLnZlcnNpb24gaW1wb3J0IGdldF9zY2hlbWUsIFBFUDQ0MF9WRVJTSU9OX1JFCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgpjbGFzcyBNZXRhZGF0YU1pc3NpbmdFcnJvcihEaXN0bGliRXhjZXB0aW9uKToKICAgICIiIkEgcmVxdWlyZWQgbWV0YWRhdGEgaXMgbWlzc2luZyIiIgoKCmNsYXNzIE1ldGFkYXRhQ29uZmxpY3RFcnJvcihEaXN0bGliRXhjZXB0aW9uKToKICAgICIiIkF0dGVtcHQgdG8gcmVhZCBvciB3cml0ZSBtZXRhZGF0YSBmaWVsZHMgdGhhdCBhcmUgY29uZmxpY3R1YWwuIiIiCgoKY2xhc3MgTWV0YWRhdGFVbnJlY29nbml6ZWRWZXJzaW9uRXJyb3IoRGlzdGxpYkV4Y2VwdGlvbik6CiAgICAiIiJVbmtub3duIG1ldGFkYXRhIHZlcnNpb24gbnVtYmVyLiIiIgoKCmNsYXNzIE1ldGFkYXRhSW52YWxpZEVycm9yKERpc3RsaWJFeGNlcHRpb24pOgogICAgIiIiQSBtZXRhZGF0YSB2YWx1ZSBpcyBpbnZhbGlkIiIiCgojIHB1YmxpYyBBUEkgb2YgdGhpcyBtb2R1bGUKX19hbGxfXyA9IFsnTWV0YWRhdGEnLCAnUEtHX0lORk9fRU5DT0RJTkcnLCAnUEtHX0lORk9fUFJFRkVSUkVEX1ZFUlNJT04nXQoKIyBFbmNvZGluZyB1c2VkIGZvciB0aGUgUEtHLUlORk8gZmlsZXMKUEtHX0lORk9fRU5DT0RJTkcgPSAndXRmLTgnCgojIHByZWZlcnJlZCB2ZXJzaW9uLiBIb3BlZnVsbHkgd2lsbCBiZSBjaGFuZ2VkCiMgdG8gMS4yIG9uY2UgUEVQIDM0NSBpcyBzdXBwb3J0ZWQgZXZlcnl3aGVyZQpQS0dfSU5GT19QUkVGRVJSRURfVkVSU0lPTiA9ICcxLjEnCgpfTElORV9QUkVGSVhfMV8yID0gcmUuY29tcGlsZSgnXG4gICAgICAgXHwnKQpfTElORV9QUkVGSVhfUFJFXzFfMiA9IHJlLmNvbXBpbGUoJ1xuICAgICAgICAnKQpfMjQxX0ZJRUxEUyA9ICgnTWV0YWRhdGEtVmVyc2lvbicsICdOYW1lJywgJ1ZlcnNpb24nLCAnUGxhdGZvcm0nLAogICAgICAgICAgICAgICAnU3VtbWFyeScsICdEZXNjcmlwdGlvbicsCiAgICAgICAgICAgICAgICdLZXl3b3JkcycsICdIb21lLXBhZ2UnLCAnQXV0aG9yJywgJ0F1dGhvci1lbWFpbCcsCiAgICAgICAgICAgICAgICdMaWNlbnNlJykKCl8zMTRfRklFTERTID0gKCdNZXRhZGF0YS1WZXJzaW9uJywgJ05hbWUnLCAnVmVyc2lvbicsICdQbGF0Zm9ybScsCiAgICAgICAgICAgICAgICdTdXBwb3J0ZWQtUGxhdGZvcm0nLCAnU3VtbWFyeScsICdEZXNjcmlwdGlvbicsCiAgICAgICAgICAgICAgICdLZXl3b3JkcycsICdIb21lLXBhZ2UnLCAnQXV0aG9yJywgJ0F1dGhvci1lbWFpbCcsCiAgICAgICAgICAgICAgICdMaWNlbnNlJywgJ0NsYXNzaWZpZXInLCAnRG93bmxvYWQtVVJMJywgJ09ic29sZXRlcycsCiAgICAgICAgICAgICAgICdQcm92aWRlcycsICdSZXF1aXJlcycpCgpfMzE0X01BUktFUlMgPSAoJ09ic29sZXRlcycsICdQcm92aWRlcycsICdSZXF1aXJlcycsICdDbGFzc2lmaWVyJywKICAgICAgICAgICAgICAgICdEb3dubG9hZC1VUkwnKQoKXzM0NV9GSUVMRFMgPSAoJ01ldGFkYXRhLVZlcnNpb24nLCAnTmFtZScsICdWZXJzaW9uJywgJ1BsYXRmb3JtJywKICAgICAgICAgICAgICAgJ1N1cHBvcnRlZC1QbGF0Zm9ybScsICdTdW1tYXJ5JywgJ0Rlc2NyaXB0aW9uJywKICAgICAgICAgICAgICAgJ0tleXdvcmRzJywgJ0hvbWUtcGFnZScsICdBdXRob3InLCAnQXV0aG9yLWVtYWlsJywKICAgICAgICAgICAgICAgJ01haW50YWluZXInLCAnTWFpbnRhaW5lci1lbWFpbCcsICdMaWNlbnNlJywKICAgICAgICAgICAgICAgJ0NsYXNzaWZpZXInLCAnRG93bmxvYWQtVVJMJywgJ09ic29sZXRlcy1EaXN0JywKICAgICAgICAgICAgICAgJ1Byb2plY3QtVVJMJywgJ1Byb3ZpZGVzLURpc3QnLCAnUmVxdWlyZXMtRGlzdCcsCiAgICAgICAgICAgICAgICdSZXF1aXJlcy1QeXRob24nLCAnUmVxdWlyZXMtRXh0ZXJuYWwnKQoKXzM0NV9NQVJLRVJTID0gKCdQcm92aWRlcy1EaXN0JywgJ1JlcXVpcmVzLURpc3QnLCAnUmVxdWlyZXMtUHl0aG9uJywKICAgICAgICAgICAgICAgICdPYnNvbGV0ZXMtRGlzdCcsICdSZXF1aXJlcy1FeHRlcm5hbCcsICdNYWludGFpbmVyJywKICAgICAgICAgICAgICAgICdNYWludGFpbmVyLWVtYWlsJywgJ1Byb2plY3QtVVJMJykKCl80MjZfRklFTERTID0gKCdNZXRhZGF0YS1WZXJzaW9uJywgJ05hbWUnLCAnVmVyc2lvbicsICdQbGF0Zm9ybScsCiAgICAgICAgICAgICAgICdTdXBwb3J0ZWQtUGxhdGZvcm0nLCAnU3VtbWFyeScsICdEZXNjcmlwdGlvbicsCiAgICAgICAgICAgICAgICdLZXl3b3JkcycsICdIb21lLXBhZ2UnLCAnQXV0aG9yJywgJ0F1dGhvci1lbWFpbCcsCiAgICAgICAgICAgICAgICdNYWludGFpbmVyJywgJ01haW50YWluZXItZW1haWwnLCAnTGljZW5zZScsCiAgICAgICAgICAgICAgICdDbGFzc2lmaWVyJywgJ0Rvd25sb2FkLVVSTCcsICdPYnNvbGV0ZXMtRGlzdCcsCiAgICAgICAgICAgICAgICdQcm9qZWN0LVVSTCcsICdQcm92aWRlcy1EaXN0JywgJ1JlcXVpcmVzLURpc3QnLAogICAgICAgICAgICAgICAnUmVxdWlyZXMtUHl0aG9uJywgJ1JlcXVpcmVzLUV4dGVybmFsJywgJ1ByaXZhdGUtVmVyc2lvbicsCiAgICAgICAgICAgICAgICdPYnNvbGV0ZWQtQnknLCAnU2V0dXAtUmVxdWlyZXMtRGlzdCcsICdFeHRlbnNpb24nLAogICAgICAgICAgICAgICAnUHJvdmlkZXMtRXh0cmEnKQoKXzQyNl9NQVJLRVJTID0gKCdQcml2YXRlLVZlcnNpb24nLCAnUHJvdmlkZXMtRXh0cmEnLCAnT2Jzb2xldGVkLUJ5JywKICAgICAgICAgICAgICAgICdTZXR1cC1SZXF1aXJlcy1EaXN0JywgJ0V4dGVuc2lvbicpCgpfQUxMX0ZJRUxEUyA9IHNldCgpCl9BTExfRklFTERTLnVwZGF0ZShfMjQxX0ZJRUxEUykKX0FMTF9GSUVMRFMudXBkYXRlKF8zMTRfRklFTERTKQpfQUxMX0ZJRUxEUy51cGRhdGUoXzM0NV9GSUVMRFMpCl9BTExfRklFTERTLnVwZGF0ZShfNDI2X0ZJRUxEUykKCkVYVFJBX1JFID0gcmUuY29tcGlsZShyJycnZXh0cmFccyo9PVxzKigiKFteIl0rKSJ8JyhbXiddKyknKScnJykKCgpkZWYgX3ZlcnNpb24yZmllbGRsaXN0KHZlcnNpb24pOgogICAgaWYgdmVyc2lvbiA9PSAnMS4wJzoKICAgICAgICByZXR1cm4gXzI0MV9GSUVMRFMKICAgIGVsaWYgdmVyc2lvbiA9PSAnMS4xJzoKICAgICAgICByZXR1cm4gXzMxNF9GSUVMRFMKICAgIGVsaWYgdmVyc2lvbiA9PSAnMS4yJzoKICAgICAgICByZXR1cm4gXzM0NV9GSUVMRFMKICAgIGVsaWYgdmVyc2lvbiA9PSAnMi4wJzoKICAgICAgICByZXR1cm4gXzQyNl9GSUVMRFMKICAgIHJhaXNlIE1ldGFkYXRhVW5yZWNvZ25pemVkVmVyc2lvbkVycm9yKHZlcnNpb24pCgoKZGVmIF9iZXN0X3ZlcnNpb24oZmllbGRzKToKICAgICIiIkRldGVjdCB0aGUgYmVzdCB2ZXJzaW9uIGRlcGVuZGluZyBvbiB0aGUgZmllbGRzIHVzZWQuIiIiCiAgICBkZWYgX2hhc19tYXJrZXIoa2V5cywgbWFya2Vycyk6CiAgICAgICAgZm9yIG1hcmtlciBpbiBtYXJrZXJzOgogICAgICAgICAgICBpZiBtYXJrZXIgaW4ga2V5czoKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAga2V5cyA9IFtdCiAgICBmb3Iga2V5LCB2YWx1ZSBpbiBmaWVsZHMuaXRlbXMoKToKICAgICAgICBpZiB2YWx1ZSBpbiAoW10sICdVTktOT1dOJywgTm9uZSk6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAga2V5cy5hcHBlbmQoa2V5KQoKICAgIHBvc3NpYmxlX3ZlcnNpb25zID0gWycxLjAnLCAnMS4xJywgJzEuMicsICcyLjAnXQoKICAgICMgZmlyc3QgbGV0J3MgdHJ5IHRvIHNlZSBpZiBhIGZpZWxkIGlzIG5vdCBwYXJ0IG9mIG9uZSBvZiB0aGUgdmVyc2lvbgogICAgZm9yIGtleSBpbiBrZXlzOgogICAgICAgIGlmIGtleSBub3QgaW4gXzI0MV9GSUVMRFMgYW5kICcxLjAnIGluIHBvc3NpYmxlX3ZlcnNpb25zOgogICAgICAgICAgICBwb3NzaWJsZV92ZXJzaW9ucy5yZW1vdmUoJzEuMCcpCiAgICAgICAgaWYga2V5IG5vdCBpbiBfMzE0X0ZJRUxEUyBhbmQgJzEuMScgaW4gcG9zc2libGVfdmVyc2lvbnM6CiAgICAgICAgICAgIHBvc3NpYmxlX3ZlcnNpb25zLnJlbW92ZSgnMS4xJykKICAgICAgICBpZiBrZXkgbm90IGluIF8zNDVfRklFTERTIGFuZCAnMS4yJyBpbiBwb3NzaWJsZV92ZXJzaW9uczoKICAgICAgICAgICAgcG9zc2libGVfdmVyc2lvbnMucmVtb3ZlKCcxLjInKQogICAgICAgIGlmIGtleSBub3QgaW4gXzQyNl9GSUVMRFMgYW5kICcyLjAnIGluIHBvc3NpYmxlX3ZlcnNpb25zOgogICAgICAgICAgICBwb3NzaWJsZV92ZXJzaW9ucy5yZW1vdmUoJzIuMCcpCgogICAgIyBwb3NzaWJsZV92ZXJzaW9uIGNvbnRhaW5zIHF1YWxpZmllZCB2ZXJzaW9ucwogICAgaWYgbGVuKHBvc3NpYmxlX3ZlcnNpb25zKSA9PSAxOgogICAgICAgIHJldHVybiBwb3NzaWJsZV92ZXJzaW9uc1swXSAgICMgZm91bmQgIQogICAgZWxpZiBsZW4ocG9zc2libGVfdmVyc2lvbnMpID09IDA6CiAgICAgICAgcmFpc2UgTWV0YWRhdGFDb25mbGljdEVycm9yKCdVbmtub3duIG1ldGFkYXRhIHNldCcpCgogICAgIyBsZXQncyBzZWUgaWYgb25lIHVuaXF1ZSBtYXJrZXIgaXMgZm91bmQKICAgIGlzXzFfMSA9ICcxLjEnIGluIHBvc3NpYmxlX3ZlcnNpb25zIGFuZCBfaGFzX21hcmtlcihrZXlzLCBfMzE0X01BUktFUlMpCiAgICBpc18xXzIgPSAnMS4yJyBpbiBwb3NzaWJsZV92ZXJzaW9ucyBhbmQgX2hhc19tYXJrZXIoa2V5cywgXzM0NV9NQVJLRVJTKQogICAgaXNfMl8wID0gJzIuMCcgaW4gcG9zc2libGVfdmVyc2lvbnMgYW5kIF9oYXNfbWFya2VyKGtleXMsIF80MjZfTUFSS0VSUykKICAgIGlmIGludChpc18xXzEpICsgaW50KGlzXzFfMikgKyBpbnQoaXNfMl8wKSA+IDE6CiAgICAgICAgcmFpc2UgTWV0YWRhdGFDb25mbGljdEVycm9yKCdZb3UgdXNlZCBpbmNvbXBhdGlibGUgMS4xLzEuMi8yLjAgZmllbGRzJykKCiAgICAjIHdlIGhhdmUgdGhlIGNob2ljZSwgMS4wLCBvciAxLjIsIG9yIDIuMAogICAgIyAgIC0gMS4wIGhhcyBhIGJyb2tlbiBTdW1tYXJ5IGZpZWxkIGJ1dCB3b3JrcyB3aXRoIGFsbCB0b29scwogICAgIyAgIC0gMS4xIGlzIHRvIGF2b2lkCiAgICAjICAgLSAxLjIgZml4ZXMgU3VtbWFyeSBidXQgaGFzIGxpdHRsZSBhZG9wdGlvbgogICAgIyAgIC0gMi4wIGFkZHMgbW9yZSBmZWF0dXJlcyBhbmQgaXMgdmVyeSBuZXcKICAgIGlmIG5vdCBpc18xXzEgYW5kIG5vdCBpc18xXzIgYW5kIG5vdCBpc18yXzA6CiAgICAgICAgIyB3ZSBjb3VsZG4ndCBmaW5kIGFueSBzcGVjaWZpYyBtYXJrZXIKICAgICAgICBpZiBQS0dfSU5GT19QUkVGRVJSRURfVkVSU0lPTiBpbiBwb3NzaWJsZV92ZXJzaW9uczoKICAgICAgICAgICAgcmV0dXJuIFBLR19JTkZPX1BSRUZFUlJFRF9WRVJTSU9OCiAgICBpZiBpc18xXzE6CiAgICAgICAgcmV0dXJuICcxLjEnCiAgICBpZiBpc18xXzI6CiAgICAgICAgcmV0dXJuICcxLjInCgogICAgcmV0dXJuICcyLjAnCgpfQVRUUjJGSUVMRCA9IHsKICAgICdtZXRhZGF0YV92ZXJzaW9uJzogJ01ldGFkYXRhLVZlcnNpb24nLAogICAgJ25hbWUnOiAnTmFtZScsCiAgICAndmVyc2lvbic6ICdWZXJzaW9uJywKICAgICdwbGF0Zm9ybSc6ICdQbGF0Zm9ybScsCiAgICAnc3VwcG9ydGVkX3BsYXRmb3JtJzogJ1N1cHBvcnRlZC1QbGF0Zm9ybScsCiAgICAnc3VtbWFyeSc6ICdTdW1tYXJ5JywKICAgICdkZXNjcmlwdGlvbic6ICdEZXNjcmlwdGlvbicsCiAgICAna2V5d29yZHMnOiAnS2V5d29yZHMnLAogICAgJ2hvbWVfcGFnZSc6ICdIb21lLXBhZ2UnLAogICAgJ2F1dGhvcic6ICdBdXRob3InLAogICAgJ2F1dGhvcl9lbWFpbCc6ICdBdXRob3ItZW1haWwnLAogICAgJ21haW50YWluZXInOiAnTWFpbnRhaW5lcicsCiAgICAnbWFpbnRhaW5lcl9lbWFpbCc6ICdNYWludGFpbmVyLWVtYWlsJywKICAgICdsaWNlbnNlJzogJ0xpY2Vuc2UnLAogICAgJ2NsYXNzaWZpZXInOiAnQ2xhc3NpZmllcicsCiAgICAnZG93bmxvYWRfdXJsJzogJ0Rvd25sb2FkLVVSTCcsCiAgICAnb2Jzb2xldGVzX2Rpc3QnOiAnT2Jzb2xldGVzLURpc3QnLAogICAgJ3Byb3ZpZGVzX2Rpc3QnOiAnUHJvdmlkZXMtRGlzdCcsCiAgICAncmVxdWlyZXNfZGlzdCc6ICdSZXF1aXJlcy1EaXN0JywKICAgICdzZXR1cF9yZXF1aXJlc19kaXN0JzogJ1NldHVwLVJlcXVpcmVzLURpc3QnLAogICAgJ3JlcXVpcmVzX3B5dGhvbic6ICdSZXF1aXJlcy1QeXRob24nLAogICAgJ3JlcXVpcmVzX2V4dGVybmFsJzogJ1JlcXVpcmVzLUV4dGVybmFsJywKICAgICdyZXF1aXJlcyc6ICdSZXF1aXJlcycsCiAgICAncHJvdmlkZXMnOiAnUHJvdmlkZXMnLAogICAgJ29ic29sZXRlcyc6ICdPYnNvbGV0ZXMnLAogICAgJ3Byb2plY3RfdXJsJzogJ1Byb2plY3QtVVJMJywKICAgICdwcml2YXRlX3ZlcnNpb24nOiAnUHJpdmF0ZS1WZXJzaW9uJywKICAgICdvYnNvbGV0ZWRfYnknOiAnT2Jzb2xldGVkLUJ5JywKICAgICdleHRlbnNpb24nOiAnRXh0ZW5zaW9uJywKICAgICdwcm92aWRlc19leHRyYSc6ICdQcm92aWRlcy1FeHRyYScsCn0KCl9QUkVESUNBVEVfRklFTERTID0gKCdSZXF1aXJlcy1EaXN0JywgJ09ic29sZXRlcy1EaXN0JywgJ1Byb3ZpZGVzLURpc3QnKQpfVkVSU0lPTlNfRklFTERTID0gKCdSZXF1aXJlcy1QeXRob24nLCkKX1ZFUlNJT05fRklFTERTID0gKCdWZXJzaW9uJywpCl9MSVNURklFTERTID0gKCdQbGF0Zm9ybScsICdDbGFzc2lmaWVyJywgJ09ic29sZXRlcycsCiAgICAgICAgICAgICAgICdSZXF1aXJlcycsICdQcm92aWRlcycsICdPYnNvbGV0ZXMtRGlzdCcsCiAgICAgICAgICAgICAgICdQcm92aWRlcy1EaXN0JywgJ1JlcXVpcmVzLURpc3QnLCAnUmVxdWlyZXMtRXh0ZXJuYWwnLAogICAgICAgICAgICAgICAnUHJvamVjdC1VUkwnLCAnU3VwcG9ydGVkLVBsYXRmb3JtJywgJ1NldHVwLVJlcXVpcmVzLURpc3QnLAogICAgICAgICAgICAgICAnUHJvdmlkZXMtRXh0cmEnLCAnRXh0ZW5zaW9uJykKX0xJU1RUVVBMRUZJRUxEUyA9ICgnUHJvamVjdC1VUkwnLCkKCl9FTEVNRU5UU0ZJRUxEID0gKCdLZXl3b3JkcycsKQoKX1VOSUNPREVGSUVMRFMgPSAoJ0F1dGhvcicsICdNYWludGFpbmVyJywgJ1N1bW1hcnknLCAnRGVzY3JpcHRpb24nKQoKX01JU1NJTkcgPSBvYmplY3QoKQoKX0ZJTEVTQUZFID0gcmUuY29tcGlsZSgnW15BLVphLXowLTkuXSsnKQoKCmRlZiBfZ2V0X25hbWVfYW5kX3ZlcnNpb24obmFtZSwgdmVyc2lvbiwgZm9yX2ZpbGVuYW1lPUZhbHNlKToKICAgICIiIlJldHVybiB0aGUgZGlzdHJpYnV0aW9uIG5hbWUgd2l0aCB2ZXJzaW9uLgoKICAgIElmIGZvcl9maWxlbmFtZSBpcyB0cnVlLCByZXR1cm4gYSBmaWxlbmFtZS1lc2NhcGVkIGZvcm0uIiIiCiAgICBpZiBmb3JfZmlsZW5hbWU6CiAgICAgICAgIyBGb3IgYm90aCBuYW1lIGFuZCB2ZXJzaW9uIGFueSBydW5zIG9mIG5vbi1hbHBoYW51bWVyaWMgb3IgJy4nCiAgICAgICAgIyBjaGFyYWN0ZXJzIGFyZSByZXBsYWNlZCB3aXRoIGEgc2luZ2xlICctJy4gIEFkZGl0aW9uYWxseSBhbnkKICAgICAgICAjIHNwYWNlcyBpbiB0aGUgdmVyc2lvbiBzdHJpbmcgYmVjb21lICcuJwogICAgICAgIG5hbWUgPSBfRklMRVNBRkUuc3ViKCctJywgbmFtZSkKICAgICAgICB2ZXJzaW9uID0gX0ZJTEVTQUZFLnN1YignLScsIHZlcnNpb24ucmVwbGFjZSgnICcsICcuJykpCiAgICByZXR1cm4gJyVzLSVzJyAlIChuYW1lLCB2ZXJzaW9uKQoKCmNsYXNzIExlZ2FjeU1ldGFkYXRhKG9iamVjdCk6CiAgICAiIiJUaGUgbGVnYWN5IG1ldGFkYXRhIG9mIGEgcmVsZWFzZS4KCiAgICBTdXBwb3J0cyB2ZXJzaW9ucyAxLjAsIDEuMSBhbmQgMS4yIChhdXRvLWRldGVjdGVkKS4gWW91IGNhbgogICAgaW5zdGFudGlhdGUgdGhlIGNsYXNzIHdpdGggb25lIG9mIHRoZXNlIGFyZ3VtZW50cyAob3Igbm9uZSk6CiAgICAtICpwYXRoKiwgdGhlIHBhdGggdG8gYSBtZXRhZGF0YSBmaWxlCiAgICAtICpmaWxlb2JqKiBnaXZlIGEgZmlsZS1saWtlIG9iamVjdCB3aXRoIG1ldGFkYXRhIGFzIGNvbnRlbnQKICAgIC0gKm1hcHBpbmcqIGlzIGEgZGljdC1saWtlIG9iamVjdAogICAgLSAqc2NoZW1lKiBpcyBhIHZlcnNpb24gc2NoZW1lIG5hbWUKICAgICIiIgogICAgIyBUT0RPIGRvY3VtZW50IHRoZSBtYXBwaW5nIEFQSSBhbmQgVU5LTk9XTiBkZWZhdWx0IGtleQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoPU5vbmUsIGZpbGVvYmo9Tm9uZSwgbWFwcGluZz1Ob25lLAogICAgICAgICAgICAgICAgIHNjaGVtZT0nZGVmYXVsdCcpOgogICAgICAgIGlmIFtwYXRoLCBmaWxlb2JqLCBtYXBwaW5nXS5jb3VudChOb25lKSA8IDI6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigncGF0aCwgZmlsZW9iaiBhbmQgbWFwcGluZyBhcmUgZXhjbHVzaXZlJykKICAgICAgICBzZWxmLl9maWVsZHMgPSB7fQogICAgICAgIHNlbGYucmVxdWlyZXNfZmlsZXMgPSBbXQogICAgICAgIHNlbGYuX2RlcGVuZGVuY2llcyA9IE5vbmUKICAgICAgICBzZWxmLnNjaGVtZSA9IHNjaGVtZQogICAgICAgIGlmIHBhdGggaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYucmVhZChwYXRoKQogICAgICAgIGVsaWYgZmlsZW9iaiBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5yZWFkX2ZpbGUoZmlsZW9iaikKICAgICAgICBlbGlmIG1hcHBpbmcgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYudXBkYXRlKG1hcHBpbmcpCiAgICAgICAgICAgIHNlbGYuc2V0X21ldGFkYXRhX3ZlcnNpb24oKQoKICAgIGRlZiBzZXRfbWV0YWRhdGFfdmVyc2lvbihzZWxmKToKICAgICAgICBzZWxmLl9maWVsZHNbJ01ldGFkYXRhLVZlcnNpb24nXSA9IF9iZXN0X3ZlcnNpb24oc2VsZi5fZmllbGRzKQoKICAgIGRlZiBfd3JpdGVfZmllbGQoc2VsZiwgZmlsZW9iaiwgbmFtZSwgdmFsdWUpOgogICAgICAgIGZpbGVvYmoud3JpdGUoJyVzOiAlc1xuJyAlIChuYW1lLCB2YWx1ZSkpCgogICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIG5hbWUpOgogICAgICAgIHJldHVybiBzZWxmLmdldChuYW1lKQoKICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBuYW1lLCB2YWx1ZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuc2V0KG5hbWUsIHZhbHVlKQoKICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBuYW1lKToKICAgICAgICBmaWVsZF9uYW1lID0gc2VsZi5fY29udmVydF9uYW1lKG5hbWUpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBkZWwgc2VsZi5fZmllbGRzW2ZpZWxkX25hbWVdCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICByYWlzZSBLZXlFcnJvcihuYW1lKQoKICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgbmFtZSk6CiAgICAgICAgcmV0dXJuIChuYW1lIGluIHNlbGYuX2ZpZWxkcyBvcgogICAgICAgICAgICAgICAgc2VsZi5fY29udmVydF9uYW1lKG5hbWUpIGluIHNlbGYuX2ZpZWxkcykKCiAgICBkZWYgX2NvbnZlcnRfbmFtZShzZWxmLCBuYW1lKToKICAgICAgICBpZiBuYW1lIGluIF9BTExfRklFTERTOgogICAgICAgICAgICByZXR1cm4gbmFtZQogICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoJy0nLCAnXycpLmxvd2VyKCkKICAgICAgICByZXR1cm4gX0FUVFIyRklFTEQuZ2V0KG5hbWUsIG5hbWUpCgogICAgZGVmIF9kZWZhdWx0X3ZhbHVlKHNlbGYsIG5hbWUpOgogICAgICAgIGlmIG5hbWUgaW4gX0xJU1RGSUVMRFMgb3IgbmFtZSBpbiBfRUxFTUVOVFNGSUVMRDoKICAgICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgcmV0dXJuICdVTktOT1dOJwoKICAgIGRlZiBfcmVtb3ZlX2xpbmVfcHJlZml4KHNlbGYsIHZhbHVlKToKICAgICAgICBpZiBzZWxmLm1ldGFkYXRhX3ZlcnNpb24gaW4gKCcxLjAnLCAnMS4xJyk6CiAgICAgICAgICAgIHJldHVybiBfTElORV9QUkVGSVhfUFJFXzFfMi5zdWIoJ1xuJywgdmFsdWUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIF9MSU5FX1BSRUZJWF8xXzIuc3ViKCdcbicsIHZhbHVlKQoKICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKICAgICAgICBpZiBuYW1lIGluIF9BVFRSMkZJRUxEOgogICAgICAgICAgICByZXR1cm4gc2VsZltuYW1lXQogICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKG5hbWUpCgogICAgIwogICAgIyBQdWJsaWMgQVBJCiAgICAjCgojICAgIGRlcGVuZGVuY2llcyA9IHByb3BlcnR5KF9nZXRfZGVwZW5kZW5jaWVzLCBfc2V0X2RlcGVuZGVuY2llcykKCiAgICBkZWYgZ2V0X2Z1bGxuYW1lKHNlbGYsIGZpbGVzYWZlPUZhbHNlKToKICAgICAgICAiIiJSZXR1cm4gdGhlIGRpc3RyaWJ1dGlvbiBuYW1lIHdpdGggdmVyc2lvbi4KCiAgICAgICAgSWYgZmlsZXNhZmUgaXMgdHJ1ZSwgcmV0dXJuIGEgZmlsZW5hbWUtZXNjYXBlZCBmb3JtLiIiIgogICAgICAgIHJldHVybiBfZ2V0X25hbWVfYW5kX3ZlcnNpb24oc2VsZlsnTmFtZSddLCBzZWxmWydWZXJzaW9uJ10sIGZpbGVzYWZlKQoKICAgIGRlZiBpc19maWVsZChzZWxmLCBuYW1lKToKICAgICAgICAiIiJyZXR1cm4gVHJ1ZSBpZiBuYW1lIGlzIGEgdmFsaWQgbWV0YWRhdGEga2V5IiIiCiAgICAgICAgbmFtZSA9IHNlbGYuX2NvbnZlcnRfbmFtZShuYW1lKQogICAgICAgIHJldHVybiBuYW1lIGluIF9BTExfRklFTERTCgogICAgZGVmIGlzX211bHRpX2ZpZWxkKHNlbGYsIG5hbWUpOgogICAgICAgIG5hbWUgPSBzZWxmLl9jb252ZXJ0X25hbWUobmFtZSkKICAgICAgICByZXR1cm4gbmFtZSBpbiBfTElTVEZJRUxEUwoKICAgIGRlZiByZWFkKHNlbGYsIGZpbGVwYXRoKToKICAgICAgICAiIiJSZWFkIHRoZSBtZXRhZGF0YSB2YWx1ZXMgZnJvbSBhIGZpbGUgcGF0aC4iIiIKICAgICAgICBmcCA9IGNvZGVjcy5vcGVuKGZpbGVwYXRoLCAncicsIGVuY29kaW5nPSd1dGYtOCcpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLnJlYWRfZmlsZShmcCkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBmcC5jbG9zZSgpCgogICAgZGVmIHJlYWRfZmlsZShzZWxmLCBmaWxlb2IpOgogICAgICAgICIiIlJlYWQgdGhlIG1ldGFkYXRhIHZhbHVlcyBmcm9tIGEgZmlsZSBvYmplY3QuIiIiCiAgICAgICAgbXNnID0gbWVzc2FnZV9mcm9tX2ZpbGUoZmlsZW9iKQogICAgICAgIHNlbGYuX2ZpZWxkc1snTWV0YWRhdGEtVmVyc2lvbiddID0gbXNnWydtZXRhZGF0YS12ZXJzaW9uJ10KCiAgICAgICAgIyBXaGVuIHJlYWRpbmcsIGdldCBhbGwgdGhlIGZpZWxkcyB3ZSBjYW4KICAgICAgICBmb3IgZmllbGQgaW4gX0FMTF9GSUVMRFM6CiAgICAgICAgICAgIGlmIGZpZWxkIG5vdCBpbiBtc2c6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBmaWVsZCBpbiBfTElTVEZJRUxEUzoKICAgICAgICAgICAgICAgICMgd2UgY2FuIGhhdmUgbXVsdGlwbGUgbGluZXMKICAgICAgICAgICAgICAgIHZhbHVlcyA9IG1zZy5nZXRfYWxsKGZpZWxkKQogICAgICAgICAgICAgICAgaWYgZmllbGQgaW4gX0xJU1RUVVBMRUZJRUxEUyBhbmQgdmFsdWVzIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IFt0dXBsZSh2YWx1ZS5zcGxpdCgnLCcpKSBmb3IgdmFsdWUgaW4gdmFsdWVzXQogICAgICAgICAgICAgICAgc2VsZi5zZXQoZmllbGQsIHZhbHVlcykKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgc2luZ2xlIGxpbmUKICAgICAgICAgICAgICAgIHZhbHVlID0gbXNnW2ZpZWxkXQogICAgICAgICAgICAgICAgaWYgdmFsdWUgaXMgbm90IE5vbmUgYW5kIHZhbHVlICE9ICdVTktOT1dOJzoKICAgICAgICAgICAgICAgICAgICBzZWxmLnNldChmaWVsZCwgdmFsdWUpCiAgICAgICAgc2VsZi5zZXRfbWV0YWRhdGFfdmVyc2lvbigpCgogICAgZGVmIHdyaXRlKHNlbGYsIGZpbGVwYXRoLCBza2lwX3Vua25vd249RmFsc2UpOgogICAgICAgICIiIldyaXRlIHRoZSBtZXRhZGF0YSBmaWVsZHMgdG8gZmlsZXBhdGguIiIiCiAgICAgICAgZnAgPSBjb2RlY3Mub3BlbihmaWxlcGF0aCwgJ3cnLCBlbmNvZGluZz0ndXRmLTgnKQogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi53cml0ZV9maWxlKGZwLCBza2lwX3Vua25vd24pCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgZnAuY2xvc2UoKQoKICAgIGRlZiB3cml0ZV9maWxlKHNlbGYsIGZpbGVvYmplY3QsIHNraXBfdW5rbm93bj1GYWxzZSk6CiAgICAgICAgIiIiV3JpdGUgdGhlIFBLRy1JTkZPIGZvcm1hdCBkYXRhIHRvIGEgZmlsZSBvYmplY3QuIiIiCiAgICAgICAgc2VsZi5zZXRfbWV0YWRhdGFfdmVyc2lvbigpCgogICAgICAgIGZvciBmaWVsZCBpbiBfdmVyc2lvbjJmaWVsZGxpc3Qoc2VsZlsnTWV0YWRhdGEtVmVyc2lvbiddKToKICAgICAgICAgICAgdmFsdWVzID0gc2VsZi5nZXQoZmllbGQpCiAgICAgICAgICAgIGlmIHNraXBfdW5rbm93biBhbmQgdmFsdWVzIGluICgnVU5LTk9XTicsIFtdLCBbJ1VOS05PV04nXSk6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBmaWVsZCBpbiBfRUxFTUVOVFNGSUVMRDoKICAgICAgICAgICAgICAgIHNlbGYuX3dyaXRlX2ZpZWxkKGZpbGVvYmplY3QsIGZpZWxkLCAnLCcuam9pbih2YWx1ZXMpKQogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgZmllbGQgbm90IGluIF9MSVNURklFTERTOgogICAgICAgICAgICAgICAgaWYgZmllbGQgPT0gJ0Rlc2NyaXB0aW9uJzoKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLm1ldGFkYXRhX3ZlcnNpb24gaW4gKCcxLjAnLCAnMS4xJyk6CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IHZhbHVlcy5yZXBsYWNlKCdcbicsICdcbiAgICAgICAgJykKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSB2YWx1ZXMucmVwbGFjZSgnXG4nLCAnXG4gICAgICAgfCcpCiAgICAgICAgICAgICAgICB2YWx1ZXMgPSBbdmFsdWVzXQoKICAgICAgICAgICAgaWYgZmllbGQgaW4gX0xJU1RUVVBMRUZJRUxEUzoKICAgICAgICAgICAgICAgIHZhbHVlcyA9IFsnLCcuam9pbih2YWx1ZSkgZm9yIHZhbHVlIGluIHZhbHVlc10KCiAgICAgICAgICAgIGZvciB2YWx1ZSBpbiB2YWx1ZXM6CiAgICAgICAgICAgICAgICBzZWxmLl93cml0ZV9maWVsZChmaWxlb2JqZWN0LCBmaWVsZCwgdmFsdWUpCgogICAgZGVmIHVwZGF0ZShzZWxmLCBvdGhlcj1Ob25lLCAqKmt3YXJncyk6CiAgICAgICAgIiIiU2V0IG1ldGFkYXRhIHZhbHVlcyBmcm9tIHRoZSBnaXZlbiBpdGVyYWJsZSBgb3RoZXJgIGFuZCBrd2FyZ3MuCgogICAgICAgIEJlaGF2aW9yIGlzIGxpa2UgYGRpY3QudXBkYXRlYDogSWYgYG90aGVyYCBoYXMgYSBgYGtleXNgYCBtZXRob2QsCiAgICAgICAgdGhleSBhcmUgbG9vcGVkIG92ZXIgYW5kIGBgc2VsZltrZXldYGAgaXMgYXNzaWduZWQgYGBvdGhlcltrZXldYGAuCiAgICAgICAgRWxzZSwgYGBvdGhlcmBgIGlzIGFuIGl0ZXJhYmxlIG9mIGBgKGtleSwgdmFsdWUpYGAgaXRlcmFibGVzLgoKICAgICAgICBLZXlzIHRoYXQgZG9uJ3QgbWF0Y2ggYSBtZXRhZGF0YSBmaWVsZCBvciB0aGF0IGhhdmUgYW4gZW1wdHkgdmFsdWUgYXJlCiAgICAgICAgZHJvcHBlZC4KICAgICAgICAiIiIKICAgICAgICBkZWYgX3NldChrZXksIHZhbHVlKToKICAgICAgICAgICAgaWYga2V5IGluIF9BVFRSMkZJRUxEIGFuZCB2YWx1ZToKICAgICAgICAgICAgICAgIHNlbGYuc2V0KHNlbGYuX2NvbnZlcnRfbmFtZShrZXkpLCB2YWx1ZSkKCiAgICAgICAgaWYgbm90IG90aGVyOgogICAgICAgICAgICAjIG90aGVyIGlzIE5vbmUgb3IgZW1wdHkgY29udGFpbmVyCiAgICAgICAgICAgIHBhc3MKICAgICAgICBlbGlmIGhhc2F0dHIob3RoZXIsICdrZXlzJyk6CiAgICAgICAgICAgIGZvciBrIGluIG90aGVyLmtleXMoKToKICAgICAgICAgICAgICAgIF9zZXQoaywgb3RoZXJba10pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZm9yIGssIHYgaW4gb3RoZXI6CiAgICAgICAgICAgICAgICBfc2V0KGssIHYpCgogICAgICAgIGlmIGt3YXJnczoKICAgICAgICAgICAgZm9yIGssIHYgaW4ga3dhcmdzLml0ZW1zKCk6CiAgICAgICAgICAgICAgICBfc2V0KGssIHYpCgogICAgZGVmIHNldChzZWxmLCBuYW1lLCB2YWx1ZSk6CiAgICAgICAgIiIiQ29udHJvbCB0aGVuIHNldCBhIG1ldGFkYXRhIGZpZWxkLiIiIgogICAgICAgIG5hbWUgPSBzZWxmLl9jb252ZXJ0X25hbWUobmFtZSkKCiAgICAgICAgaWYgKChuYW1lIGluIF9FTEVNRU5UU0ZJRUxEIG9yIG5hbWUgPT0gJ1BsYXRmb3JtJykgYW5kCiAgICAgICAgICAgIG5vdCBpc2luc3RhbmNlKHZhbHVlLCAobGlzdCwgdHVwbGUpKSk6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgICAgICB2YWx1ZSA9IFt2LnN0cmlwKCkgZm9yIHYgaW4gdmFsdWUuc3BsaXQoJywnKV0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHZhbHVlID0gW10KICAgICAgICBlbGlmIChuYW1lIGluIF9MSVNURklFTERTIGFuZAogICAgICAgICAgICAgIG5vdCBpc2luc3RhbmNlKHZhbHVlLCAobGlzdCwgdHVwbGUpKSk6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgICAgICB2YWx1ZSA9IFt2YWx1ZV0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHZhbHVlID0gW10KCiAgICAgICAgaWYgbG9nZ2VyLmlzRW5hYmxlZEZvcihsb2dnaW5nLldBUk5JTkcpOgogICAgICAgICAgICBwcm9qZWN0X25hbWUgPSBzZWxmWydOYW1lJ10KCiAgICAgICAgICAgIHNjaGVtZSA9IGdldF9zY2hlbWUoc2VsZi5zY2hlbWUpCiAgICAgICAgICAgIGlmIG5hbWUgaW4gX1BSRURJQ0FURV9GSUVMRFMgYW5kIHZhbHVlIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgZm9yIHYgaW4gdmFsdWU6CiAgICAgICAgICAgICAgICAgICAgIyBjaGVjayB0aGF0IHRoZSB2YWx1ZXMgYXJlIHZhbGlkCiAgICAgICAgICAgICAgICAgICAgaWYgbm90IHNjaGVtZS5pc192YWxpZF9tYXRjaGVyKHYuc3BsaXQoJzsnKVswXSk6CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIiclcyc6ICclcycgaXMgbm90IHZhbGlkIChmaWVsZCAnJXMnKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0X25hbWUsIHYsIG5hbWUpCiAgICAgICAgICAgICMgRklYTUUgdGhpcyByZWplY3RzIFVOS05PV04sIGlzIHRoYXQgcmlnaHQ/CiAgICAgICAgICAgIGVsaWYgbmFtZSBpbiBfVkVSU0lPTlNfRklFTERTIGFuZCB2YWx1ZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIGlmIG5vdCBzY2hlbWUuaXNfdmFsaWRfY29uc3RyYWludF9saXN0KHZhbHVlKToKICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygiJyVzJzogJyVzJyBpcyBub3QgYSB2YWxpZCB2ZXJzaW9uIChmaWVsZCAnJXMnKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdF9uYW1lLCB2YWx1ZSwgbmFtZSkKICAgICAgICAgICAgZWxpZiBuYW1lIGluIF9WRVJTSU9OX0ZJRUxEUyBhbmQgdmFsdWUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBpZiBub3Qgc2NoZW1lLmlzX3ZhbGlkX3ZlcnNpb24odmFsdWUpOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCInJXMnOiAnJXMnIGlzIG5vdCBhIHZhbGlkIHZlcnNpb24gKGZpZWxkICclcycpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0X25hbWUsIHZhbHVlLCBuYW1lKQoKICAgICAgICBpZiBuYW1lIGluIF9VTklDT0RFRklFTERTOgogICAgICAgICAgICBpZiBuYW1lID09ICdEZXNjcmlwdGlvbic6CiAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuX3JlbW92ZV9saW5lX3ByZWZpeCh2YWx1ZSkKCiAgICAgICAgc2VsZi5fZmllbGRzW25hbWVdID0gdmFsdWUKCiAgICBkZWYgZ2V0KHNlbGYsIG5hbWUsIGRlZmF1bHQ9X01JU1NJTkcpOgogICAgICAgICIiIkdldCBhIG1ldGFkYXRhIGZpZWxkLiIiIgogICAgICAgIG5hbWUgPSBzZWxmLl9jb252ZXJ0X25hbWUobmFtZSkKICAgICAgICBpZiBuYW1lIG5vdCBpbiBzZWxmLl9maWVsZHM6CiAgICAgICAgICAgIGlmIGRlZmF1bHQgaXMgX01JU1NJTkc6CiAgICAgICAgICAgICAgICBkZWZhdWx0ID0gc2VsZi5fZGVmYXVsdF92YWx1ZShuYW1lKQogICAgICAgICAgICByZXR1cm4gZGVmYXVsdAogICAgICAgIGlmIG5hbWUgaW4gX1VOSUNPREVGSUVMRFM6CiAgICAgICAgICAgIHZhbHVlID0gc2VsZi5fZmllbGRzW25hbWVdCiAgICAgICAgICAgIHJldHVybiB2YWx1ZQogICAgICAgIGVsaWYgbmFtZSBpbiBfTElTVEZJRUxEUzoKICAgICAgICAgICAgdmFsdWUgPSBzZWxmLl9maWVsZHNbbmFtZV0KICAgICAgICAgICAgaWYgdmFsdWUgaXMgTm9uZToKICAgICAgICAgICAgICAgIHJldHVybiBbXQogICAgICAgICAgICByZXMgPSBbXQogICAgICAgICAgICBmb3IgdmFsIGluIHZhbHVlOgogICAgICAgICAgICAgICAgaWYgbmFtZSBub3QgaW4gX0xJU1RUVVBMRUZJRUxEUzoKICAgICAgICAgICAgICAgICAgICByZXMuYXBwZW5kKHZhbCkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIyBUaGF0J3MgZm9yIFByb2plY3QtVVJMCiAgICAgICAgICAgICAgICAgICAgcmVzLmFwcGVuZCgodmFsWzBdLCB2YWxbMV0pKQogICAgICAgICAgICByZXR1cm4gcmVzCgogICAgICAgIGVsaWYgbmFtZSBpbiBfRUxFTUVOVFNGSUVMRDoKICAgICAgICAgICAgdmFsdWUgPSBzZWxmLl9maWVsZHNbbmFtZV0KICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5zcGxpdCgnLCcpCiAgICAgICAgcmV0dXJuIHNlbGYuX2ZpZWxkc1tuYW1lXQoKICAgIGRlZiBjaGVjayhzZWxmLCBzdHJpY3Q9RmFsc2UpOgogICAgICAgICIiIkNoZWNrIGlmIHRoZSBtZXRhZGF0YSBpcyBjb21wbGlhbnQuIElmIHN0cmljdCBpcyBUcnVlIHRoZW4gcmFpc2UgaWYKICAgICAgICBubyBOYW1lIG9yIFZlcnNpb24gYXJlIHByb3ZpZGVkIiIiCiAgICAgICAgc2VsZi5zZXRfbWV0YWRhdGFfdmVyc2lvbigpCgogICAgICAgICMgWFhYIHNob3VsZCBjaGVjayB0aGUgdmVyc2lvbnMgKGlmIHRoZSBmaWxlIHdhcyBsb2FkZWQpCiAgICAgICAgbWlzc2luZywgd2FybmluZ3MgPSBbXSwgW10KCiAgICAgICAgZm9yIGF0dHIgaW4gKCdOYW1lJywgJ1ZlcnNpb24nKTogICMgcmVxdWlyZWQgYnkgUEVQIDM0NQogICAgICAgICAgICBpZiBhdHRyIG5vdCBpbiBzZWxmOgogICAgICAgICAgICAgICAgbWlzc2luZy5hcHBlbmQoYXR0cikKCiAgICAgICAgaWYgc3RyaWN0IGFuZCBtaXNzaW5nICE9IFtdOgogICAgICAgICAgICBtc2cgPSAnbWlzc2luZyByZXF1aXJlZCBtZXRhZGF0YTogJXMnICUgJywgJy5qb2luKG1pc3NpbmcpCiAgICAgICAgICAgIHJhaXNlIE1ldGFkYXRhTWlzc2luZ0Vycm9yKG1zZykKCiAgICAgICAgZm9yIGF0dHIgaW4gKCdIb21lLXBhZ2UnLCAnQXV0aG9yJyk6CiAgICAgICAgICAgIGlmIGF0dHIgbm90IGluIHNlbGY6CiAgICAgICAgICAgICAgICBtaXNzaW5nLmFwcGVuZChhdHRyKQoKICAgICAgICAjIGNoZWNraW5nIG1ldGFkYXRhIDEuMiAoWFhYIG5lZWRzIHRvIGNoZWNrIDEuMSwgMS4wKQogICAgICAgIGlmIHNlbGZbJ01ldGFkYXRhLVZlcnNpb24nXSAhPSAnMS4yJzoKICAgICAgICAgICAgcmV0dXJuIG1pc3NpbmcsIHdhcm5pbmdzCgogICAgICAgIHNjaGVtZSA9IGdldF9zY2hlbWUoc2VsZi5zY2hlbWUpCgogICAgICAgIGRlZiBhcmVfdmFsaWRfY29uc3RyYWludHModmFsdWUpOgogICAgICAgICAgICBmb3IgdiBpbiB2YWx1ZToKICAgICAgICAgICAgICAgIGlmIG5vdCBzY2hlbWUuaXNfdmFsaWRfbWF0Y2hlcih2LnNwbGl0KCc7JylbMF0pOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICBmb3IgZmllbGRzLCBjb250cm9sbGVyIGluICgoX1BSRURJQ0FURV9GSUVMRFMsIGFyZV92YWxpZF9jb25zdHJhaW50cyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9WRVJTSU9OU19GSUVMRFMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtZS5pc192YWxpZF9jb25zdHJhaW50X2xpc3QpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfVkVSU0lPTl9GSUVMRFMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVtZS5pc192YWxpZF92ZXJzaW9uKSk6CiAgICAgICAgICAgIGZvciBmaWVsZCBpbiBmaWVsZHM6CiAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZ2V0KGZpZWxkLCBOb25lKQogICAgICAgICAgICAgICAgaWYgdmFsdWUgaXMgbm90IE5vbmUgYW5kIG5vdCBjb250cm9sbGVyKHZhbHVlKToKICAgICAgICAgICAgICAgICAgICB3YXJuaW5ncy5hcHBlbmQoIldyb25nIHZhbHVlIGZvciAnJXMnOiAlcyIgJSAoZmllbGQsIHZhbHVlKSkKCiAgICAgICAgcmV0dXJuIG1pc3NpbmcsIHdhcm5pbmdzCgogICAgZGVmIHRvZGljdChzZWxmLCBza2lwX21pc3Npbmc9RmFsc2UpOgogICAgICAgICIiIlJldHVybiBmaWVsZHMgYXMgYSBkaWN0LgoKICAgICAgICBGaWVsZCBuYW1lcyB3aWxsIGJlIGNvbnZlcnRlZCB0byB1c2UgdGhlIHVuZGVyc2NvcmUtbG93ZXJjYXNlIHN0eWxlCiAgICAgICAgaW5zdGVhZCBvZiBoeXBoZW4tbWl4ZWQgY2FzZSAoaS5lLiBob21lX3BhZ2UgaW5zdGVhZCBvZiBIb21lLXBhZ2UpLgogICAgICAgICIiIgogICAgICAgIHNlbGYuc2V0X21ldGFkYXRhX3ZlcnNpb24oKQoKICAgICAgICBtYXBwaW5nXzFfMCA9ICgKICAgICAgICAgICAgKCdtZXRhZGF0YV92ZXJzaW9uJywgJ01ldGFkYXRhLVZlcnNpb24nKSwKICAgICAgICAgICAgKCduYW1lJywgJ05hbWUnKSwKICAgICAgICAgICAgKCd2ZXJzaW9uJywgJ1ZlcnNpb24nKSwKICAgICAgICAgICAgKCdzdW1tYXJ5JywgJ1N1bW1hcnknKSwKICAgICAgICAgICAgKCdob21lX3BhZ2UnLCAnSG9tZS1wYWdlJyksCiAgICAgICAgICAgICgnYXV0aG9yJywgJ0F1dGhvcicpLAogICAgICAgICAgICAoJ2F1dGhvcl9lbWFpbCcsICdBdXRob3ItZW1haWwnKSwKICAgICAgICAgICAgKCdsaWNlbnNlJywgJ0xpY2Vuc2UnKSwKICAgICAgICAgICAgKCdkZXNjcmlwdGlvbicsICdEZXNjcmlwdGlvbicpLAogICAgICAgICAgICAoJ2tleXdvcmRzJywgJ0tleXdvcmRzJyksCiAgICAgICAgICAgICgncGxhdGZvcm0nLCAnUGxhdGZvcm0nKSwKICAgICAgICAgICAgKCdjbGFzc2lmaWVycycsICdDbGFzc2lmaWVyJyksCiAgICAgICAgICAgICgnZG93bmxvYWRfdXJsJywgJ0Rvd25sb2FkLVVSTCcpLAogICAgICAgICkKCiAgICAgICAgZGF0YSA9IHt9CiAgICAgICAgZm9yIGtleSwgZmllbGRfbmFtZSBpbiBtYXBwaW5nXzFfMDoKICAgICAgICAgICAgaWYgbm90IHNraXBfbWlzc2luZyBvciBmaWVsZF9uYW1lIGluIHNlbGYuX2ZpZWxkczoKICAgICAgICAgICAgICAgIGRhdGFba2V5XSA9IHNlbGZbZmllbGRfbmFtZV0KCiAgICAgICAgaWYgc2VsZlsnTWV0YWRhdGEtVmVyc2lvbiddID09ICcxLjInOgogICAgICAgICAgICBtYXBwaW5nXzFfMiA9ICgKICAgICAgICAgICAgICAgICgncmVxdWlyZXNfZGlzdCcsICdSZXF1aXJlcy1EaXN0JyksCiAgICAgICAgICAgICAgICAoJ3JlcXVpcmVzX3B5dGhvbicsICdSZXF1aXJlcy1QeXRob24nKSwKICAgICAgICAgICAgICAgICgncmVxdWlyZXNfZXh0ZXJuYWwnLCAnUmVxdWlyZXMtRXh0ZXJuYWwnKSwKICAgICAgICAgICAgICAgICgncHJvdmlkZXNfZGlzdCcsICdQcm92aWRlcy1EaXN0JyksCiAgICAgICAgICAgICAgICAoJ29ic29sZXRlc19kaXN0JywgJ09ic29sZXRlcy1EaXN0JyksCiAgICAgICAgICAgICAgICAoJ3Byb2plY3RfdXJsJywgJ1Byb2plY3QtVVJMJyksCiAgICAgICAgICAgICAgICAoJ21haW50YWluZXInLCAnTWFpbnRhaW5lcicpLAogICAgICAgICAgICAgICAgKCdtYWludGFpbmVyX2VtYWlsJywgJ01haW50YWluZXItZW1haWwnKSwKICAgICAgICAgICAgKQogICAgICAgICAgICBmb3Iga2V5LCBmaWVsZF9uYW1lIGluIG1hcHBpbmdfMV8yOgogICAgICAgICAgICAgICAgaWYgbm90IHNraXBfbWlzc2luZyBvciBmaWVsZF9uYW1lIGluIHNlbGYuX2ZpZWxkczoKICAgICAgICAgICAgICAgICAgICBpZiBrZXkgIT0gJ3Byb2plY3RfdXJsJzoKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtrZXldID0gc2VsZltmaWVsZF9uYW1lXQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFba2V5XSA9IFsnLCcuam9pbih1KSBmb3IgdSBpbiBzZWxmW2ZpZWxkX25hbWVdXQoKICAgICAgICBlbGlmIHNlbGZbJ01ldGFkYXRhLVZlcnNpb24nXSA9PSAnMS4xJzoKICAgICAgICAgICAgbWFwcGluZ18xXzEgPSAoCiAgICAgICAgICAgICAgICAoJ3Byb3ZpZGVzJywgJ1Byb3ZpZGVzJyksCiAgICAgICAgICAgICAgICAoJ3JlcXVpcmVzJywgJ1JlcXVpcmVzJyksCiAgICAgICAgICAgICAgICAoJ29ic29sZXRlcycsICdPYnNvbGV0ZXMnKSwKICAgICAgICAgICAgKQogICAgICAgICAgICBmb3Iga2V5LCBmaWVsZF9uYW1lIGluIG1hcHBpbmdfMV8xOgogICAgICAgICAgICAgICAgaWYgbm90IHNraXBfbWlzc2luZyBvciBmaWVsZF9uYW1lIGluIHNlbGYuX2ZpZWxkczoKICAgICAgICAgICAgICAgICAgICBkYXRhW2tleV0gPSBzZWxmW2ZpZWxkX25hbWVdCgogICAgICAgIHJldHVybiBkYXRhCgogICAgZGVmIGFkZF9yZXF1aXJlbWVudHMoc2VsZiwgcmVxdWlyZW1lbnRzKToKICAgICAgICBpZiBzZWxmWydNZXRhZGF0YS1WZXJzaW9uJ10gPT0gJzEuMSc6CiAgICAgICAgICAgICMgd2UgY2FuJ3QgaGF2ZSAxLjEgbWV0YWRhdGEgKmFuZCogU2V0dXB0b29scyByZXF1aXJlcwogICAgICAgICAgICBmb3IgZmllbGQgaW4gKCdPYnNvbGV0ZXMnLCAnUmVxdWlyZXMnLCAnUHJvdmlkZXMnKToKICAgICAgICAgICAgICAgIGlmIGZpZWxkIGluIHNlbGY6CiAgICAgICAgICAgICAgICAgICAgZGVsIHNlbGZbZmllbGRdCiAgICAgICAgc2VsZlsnUmVxdWlyZXMtRGlzdCddICs9IHJlcXVpcmVtZW50cwoKICAgICMgTWFwcGluZyBBUEkKICAgICMgVE9ETyBjb3VsZCBhZGQgaXRlciogdmFyaWFudHMKCiAgICBkZWYga2V5cyhzZWxmKToKICAgICAgICByZXR1cm4gbGlzdChfdmVyc2lvbjJmaWVsZGxpc3Qoc2VsZlsnTWV0YWRhdGEtVmVyc2lvbiddKSkKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgZm9yIGtleSBpbiBzZWxmLmtleXMoKToKICAgICAgICAgICAgeWllbGQga2V5CgogICAgZGVmIHZhbHVlcyhzZWxmKToKICAgICAgICByZXR1cm4gW3NlbGZba2V5XSBmb3Iga2V5IGluIHNlbGYua2V5cygpXQoKICAgIGRlZiBpdGVtcyhzZWxmKToKICAgICAgICByZXR1cm4gWyhrZXksIHNlbGZba2V5XSkgZm9yIGtleSBpbiBzZWxmLmtleXMoKV0KCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICc8JXMgJXMgJXM+JyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc2VsZi5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi52ZXJzaW9uKQoKCk1FVEFEQVRBX0ZJTEVOQU1FID0gJ3B5ZGlzdC5qc29uJwpXSEVFTF9NRVRBREFUQV9GSUxFTkFNRSA9ICdtZXRhZGF0YS5qc29uJwoKCmNsYXNzIE1ldGFkYXRhKG9iamVjdCk6CiAgICAiIiIKICAgIFRoZSBtZXRhZGF0YSBvZiBhIHJlbGVhc2UuIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyAyLjAgKEpTT04pCiAgICBtZXRhZGF0YSB3aGVyZSBwb3NzaWJsZS4gSWYgbm90IHBvc3NpYmxlLCBpdCB3cmFwcyBhIExlZ2FjeU1ldGFkYXRhCiAgICBpbnN0YW5jZSB3aGljaCBoYW5kbGVzIHRoZSBrZXktdmFsdWUgbWV0YWRhdGEgZm9ybWF0LgogICAgIiIiCgogICAgTUVUQURBVEFfVkVSU0lPTl9NQVRDSEVSID0gcmUuY29tcGlsZSgnXlxkKyhcLlxkKykqJCcpCgogICAgTkFNRV9NQVRDSEVSID0gcmUuY29tcGlsZSgnXlswLTlBLVpdKFswLTlBLVpfLi1dKlswLTlBLVpdKT8kJywgcmUuSSkKCiAgICBWRVJTSU9OX01BVENIRVIgPSBQRVA0NDBfVkVSU0lPTl9SRQoKICAgIFNVTU1BUllfTUFUQ0hFUiA9IHJlLmNvbXBpbGUoJy57MSwyMDQ3fScpCgogICAgTUVUQURBVEFfVkVSU0lPTiA9ICcyLjAnCgogICAgR0VORVJBVE9SID0gJ2Rpc3RsaWIgKCVzKScgJSBfX3ZlcnNpb25fXwoKICAgIE1BTkRBVE9SWV9LRVlTID0gewogICAgICAgICduYW1lJzogKCksCiAgICAgICAgJ3ZlcnNpb24nOiAoKSwKICAgICAgICAnc3VtbWFyeSc6ICgnbGVnYWN5JywpLAogICAgfQoKICAgIElOREVYX0tFWVMgPSAoJ25hbWUgdmVyc2lvbiBsaWNlbnNlIHN1bW1hcnkgZGVzY3JpcHRpb24gYXV0aG9yICcKICAgICAgICAgICAgICAgICAgJ2F1dGhvcl9lbWFpbCBrZXl3b3JkcyBwbGF0Zm9ybSBob21lX3BhZ2UgY2xhc3NpZmllcnMgJwogICAgICAgICAgICAgICAgICAnZG93bmxvYWRfdXJsJykKCiAgICBERVBFTkRFTkNZX0tFWVMgPSAoJ2V4dHJhcyBydW5fcmVxdWlyZXMgdGVzdF9yZXF1aXJlcyBidWlsZF9yZXF1aXJlcyAnCiAgICAgICAgICAgICAgICAgICAgICAgJ2Rldl9yZXF1aXJlcyBwcm92aWRlcyBtZXRhX3JlcXVpcmVzIG9ic29sZXRlZF9ieSAnCiAgICAgICAgICAgICAgICAgICAgICAgJ3N1cHBvcnRzX2Vudmlyb25tZW50cycpCgogICAgU1lOVEFYX1ZBTElEQVRPUlMgPSB7CiAgICAgICAgJ21ldGFkYXRhX3ZlcnNpb24nOiAoTUVUQURBVEFfVkVSU0lPTl9NQVRDSEVSLCAoKSksCiAgICAgICAgJ25hbWUnOiAoTkFNRV9NQVRDSEVSLCAoJ2xlZ2FjeScsKSksCiAgICAgICAgJ3ZlcnNpb24nOiAoVkVSU0lPTl9NQVRDSEVSLCAoJ2xlZ2FjeScsKSksCiAgICAgICAgJ3N1bW1hcnknOiAoU1VNTUFSWV9NQVRDSEVSLCAoJ2xlZ2FjeScsKSksCiAgICB9CgogICAgX19zbG90c19fID0gKCdfbGVnYWN5JywgJ19kYXRhJywgJ3NjaGVtZScpCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGg9Tm9uZSwgZmlsZW9iaj1Ob25lLCBtYXBwaW5nPU5vbmUsCiAgICAgICAgICAgICAgICAgc2NoZW1lPSdkZWZhdWx0Jyk6CiAgICAgICAgaWYgW3BhdGgsIGZpbGVvYmosIG1hcHBpbmddLmNvdW50KE5vbmUpIDwgMjoKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdwYXRoLCBmaWxlb2JqIGFuZCBtYXBwaW5nIGFyZSBleGNsdXNpdmUnKQogICAgICAgIHNlbGYuX2xlZ2FjeSA9IE5vbmUKICAgICAgICBzZWxmLl9kYXRhID0gTm9uZQogICAgICAgIHNlbGYuc2NoZW1lID0gc2NoZW1lCiAgICAgICAgI2ltcG9ydCBwZGI7IHBkYi5zZXRfdHJhY2UoKQogICAgICAgIGlmIG1hcHBpbmcgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHNlbGYuX3ZhbGlkYXRlX21hcHBpbmcobWFwcGluZywgc2NoZW1lKQogICAgICAgICAgICAgICAgc2VsZi5fZGF0YSA9IG1hcHBpbmcKICAgICAgICAgICAgZXhjZXB0IE1ldGFkYXRhVW5yZWNvZ25pemVkVmVyc2lvbkVycm9yOgogICAgICAgICAgICAgICAgc2VsZi5fbGVnYWN5ID0gTGVnYWN5TWV0YWRhdGEobWFwcGluZz1tYXBwaW5nLCBzY2hlbWU9c2NoZW1lKQogICAgICAgICAgICAgICAgc2VsZi52YWxpZGF0ZSgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZGF0YSA9IE5vbmUKICAgICAgICAgICAgaWYgcGF0aDoKICAgICAgICAgICAgICAgIHdpdGggb3BlbihwYXRoLCAncmInKSBhcyBmOgogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBmLnJlYWQoKQogICAgICAgICAgICBlbGlmIGZpbGVvYmo6CiAgICAgICAgICAgICAgICBkYXRhID0gZmlsZW9iai5yZWFkKCkKICAgICAgICAgICAgaWYgZGF0YSBpcyBOb25lOgogICAgICAgICAgICAgICAgIyBJbml0aWFsaXNlZCB3aXRoIG5vIGFyZ3MgLSB0byBiZSBhZGRlZAogICAgICAgICAgICAgICAgc2VsZi5fZGF0YSA9IHsKICAgICAgICAgICAgICAgICAgICAnbWV0YWRhdGFfdmVyc2lvbic6IHNlbGYuTUVUQURBVEFfVkVSU0lPTiwKICAgICAgICAgICAgICAgICAgICAnZ2VuZXJhdG9yJzogc2VsZi5HRU5FUkFUT1IsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShkYXRhLCB0ZXh0X3R5cGUpOgogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLmRlY29kZSgndXRmLTgnKQogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2RhdGEgPSBqc29uLmxvYWRzKGRhdGEpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5fdmFsaWRhdGVfbWFwcGluZyhzZWxmLl9kYXRhLCBzY2hlbWUpCiAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgICAgICAjIE5vdGU6IE1ldGFkYXRhVW5yZWNvZ25pemVkVmVyc2lvbkVycm9yIGRvZXMgbm90CiAgICAgICAgICAgICAgICAgICAgIyBpbmhlcml0IGZyb20gVmFsdWVFcnJvciAoaXQncyBhIERpc3RsaWJFeGNlcHRpb24sCiAgICAgICAgICAgICAgICAgICAgIyB3aGljaCBzaG91bGQgbm90IGluaGVyaXQgZnJvbSBWYWx1ZUVycm9yKS4KICAgICAgICAgICAgICAgICAgICAjIFRoZSBWYWx1ZUVycm9yIGNvbWVzIGZyb20gdGhlIGpzb24ubG9hZCAtIGlmIHRoYXQKICAgICAgICAgICAgICAgICAgICAjIHN1Y2NlZWRzIGFuZCB3ZSBnZXQgYSB2YWxpZGF0aW9uIGVycm9yLCB3ZSB3YW50CiAgICAgICAgICAgICAgICAgICAgIyB0aGF0IHRvIHByb3BhZ2F0ZQogICAgICAgICAgICAgICAgICAgIHNlbGYuX2xlZ2FjeSA9IExlZ2FjeU1ldGFkYXRhKGZpbGVvYmo9U3RyaW5nSU8oZGF0YSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1lPXNjaGVtZSkKICAgICAgICAgICAgICAgICAgICBzZWxmLnZhbGlkYXRlKCkKCiAgICBjb21tb25fa2V5cyA9IHNldCgoJ25hbWUnLCAndmVyc2lvbicsICdsaWNlbnNlJywgJ2tleXdvcmRzJywgJ3N1bW1hcnknKSkKCiAgICBub25lX2xpc3QgPSAoTm9uZSwgbGlzdCkKICAgIG5vbmVfZGljdCA9IChOb25lLCBkaWN0KQoKICAgIG1hcHBlZF9rZXlzID0gewogICAgICAgICdydW5fcmVxdWlyZXMnOiAoJ1JlcXVpcmVzLURpc3QnLCBsaXN0KSwKICAgICAgICAnYnVpbGRfcmVxdWlyZXMnOiAoJ1NldHVwLVJlcXVpcmVzLURpc3QnLCBsaXN0KSwKICAgICAgICAnZGV2X3JlcXVpcmVzJzogbm9uZV9saXN0LAogICAgICAgICd0ZXN0X3JlcXVpcmVzJzogbm9uZV9saXN0LAogICAgICAgICdtZXRhX3JlcXVpcmVzJzogbm9uZV9saXN0LAogICAgICAgICdleHRyYXMnOiAoJ1Byb3ZpZGVzLUV4dHJhJywgbGlzdCksCiAgICAgICAgJ21vZHVsZXMnOiBub25lX2xpc3QsCiAgICAgICAgJ25hbWVzcGFjZXMnOiBub25lX2xpc3QsCiAgICAgICAgJ2V4cG9ydHMnOiBub25lX2RpY3QsCiAgICAgICAgJ2NvbW1hbmRzJzogbm9uZV9kaWN0LAogICAgICAgICdjbGFzc2lmaWVycyc6ICgnQ2xhc3NpZmllcicsIGxpc3QpLAogICAgICAgICdzb3VyY2VfdXJsJzogKCdEb3dubG9hZC1VUkwnLCBOb25lKSwKICAgICAgICAnbWV0YWRhdGFfdmVyc2lvbic6ICgnTWV0YWRhdGEtVmVyc2lvbicsIE5vbmUpLAogICAgfQoKICAgIGRlbCBub25lX2xpc3QsIG5vbmVfZGljdAoKICAgIGRlZiBfX2dldGF0dHJpYnV0ZV9fKHNlbGYsIGtleSk6CiAgICAgICAgY29tbW9uID0gb2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oc2VsZiwgJ2NvbW1vbl9rZXlzJykKICAgICAgICBtYXBwZWQgPSBvYmplY3QuX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCAnbWFwcGVkX2tleXMnKQogICAgICAgIGlmIGtleSBpbiBtYXBwZWQ6CiAgICAgICAgICAgIGxrLCBtYWtlciA9IG1hcHBlZFtrZXldCiAgICAgICAgICAgIGlmIHNlbGYuX2xlZ2FjeToKICAgICAgICAgICAgICAgIGlmIGxrIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gTm9uZSBpZiBtYWtlciBpcyBOb25lIGVsc2UgbWFrZXIoKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBzZWxmLl9sZWdhY3kuZ2V0KGxrKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgdmFsdWUgPSBOb25lIGlmIG1ha2VyIGlzIE5vbmUgZWxzZSBtYWtlcigpCiAgICAgICAgICAgICAgICBpZiBrZXkgbm90IGluICgnY29tbWFuZHMnLCAnZXhwb3J0cycsICdtb2R1bGVzJywgJ25hbWVzcGFjZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NsYXNzaWZpZXJzJyk6CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5fZGF0YS5nZXQoa2V5LCB2YWx1ZSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIyBzcGVjaWFsIGNhc2VzIGZvciBQRVAgNDU5CiAgICAgICAgICAgICAgICAgICAgc2VudGluZWwgPSBvYmplY3QoKQogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbnRpbmVsCiAgICAgICAgICAgICAgICAgICAgZCA9IHNlbGYuX2RhdGEuZ2V0KCdleHRlbnNpb25zJykKICAgICAgICAgICAgICAgICAgICBpZiBkOgogICAgICAgICAgICAgICAgICAgICAgICBpZiBrZXkgPT0gJ2NvbW1hbmRzJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGQuZ2V0KCdweXRob24uY29tbWFuZHMnLCB2YWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiBrZXkgPT0gJ2NsYXNzaWZpZXJzJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBkLmdldCgncHl0aG9uLmRldGFpbHMnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBkLmdldChrZXksIHZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9IGQuZ2V0KCdweXRob24uZXhwb3J0cycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgZDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gc2VsZi5fZGF0YS5nZXQoJ3B5dGhvbi5leHBvcnRzJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZC5nZXQoa2V5LCB2YWx1ZSkKICAgICAgICAgICAgICAgICAgICBpZiByZXN1bHQgaXMgc2VudGluZWw6CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlCiAgICAgICAgZWxpZiBrZXkgbm90IGluIGNvbW1vbjoKICAgICAgICAgICAgcmVzdWx0ID0gb2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oc2VsZiwga2V5KQogICAgICAgIGVsaWYgc2VsZi5fbGVnYWN5OgogICAgICAgICAgICByZXN1bHQgPSBzZWxmLl9sZWdhY3kuZ2V0KGtleSkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXN1bHQgPSBzZWxmLl9kYXRhLmdldChrZXkpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBfdmFsaWRhdGVfdmFsdWUoc2VsZiwga2V5LCB2YWx1ZSwgc2NoZW1lPU5vbmUpOgogICAgICAgIGlmIGtleSBpbiBzZWxmLlNZTlRBWF9WQUxJREFUT1JTOgogICAgICAgICAgICBwYXR0ZXJuLCBleGNsdXNpb25zID0gc2VsZi5TWU5UQVhfVkFMSURBVE9SU1trZXldCiAgICAgICAgICAgIGlmIChzY2hlbWUgb3Igc2VsZi5zY2hlbWUpIG5vdCBpbiBleGNsdXNpb25zOgogICAgICAgICAgICAgICAgbSA9IHBhdHRlcm4ubWF0Y2godmFsdWUpCiAgICAgICAgICAgICAgICBpZiBub3QgbToKICAgICAgICAgICAgICAgICAgICByYWlzZSBNZXRhZGF0YUludmFsaWRFcnJvcigiJyVzJyBpcyBhbiBpbnZhbGlkIHZhbHVlIGZvciAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSAnJXMnIHByb3BlcnR5IiAlICh2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkpKQoKICAgIGRlZiBfX3NldGF0dHJfXyhzZWxmLCBrZXksIHZhbHVlKToKICAgICAgICBzZWxmLl92YWxpZGF0ZV92YWx1ZShrZXksIHZhbHVlKQogICAgICAgIGNvbW1vbiA9IG9iamVjdC5fX2dldGF0dHJpYnV0ZV9fKHNlbGYsICdjb21tb25fa2V5cycpCiAgICAgICAgbWFwcGVkID0gb2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oc2VsZiwgJ21hcHBlZF9rZXlzJykKICAgICAgICBpZiBrZXkgaW4gbWFwcGVkOgogICAgICAgICAgICBsaywgXyA9IG1hcHBlZFtrZXldCiAgICAgICAgICAgIGlmIHNlbGYuX2xlZ2FjeToKICAgICAgICAgICAgICAgIGlmIGxrIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgogICAgICAgICAgICAgICAgc2VsZi5fbGVnYWN5W2xrXSA9IHZhbHVlCiAgICAgICAgICAgIGVsaWYga2V5IG5vdCBpbiAoJ2NvbW1hbmRzJywgJ2V4cG9ydHMnLCAnbW9kdWxlcycsICduYW1lc3BhY2VzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2xhc3NpZmllcnMnKToKICAgICAgICAgICAgICAgIHNlbGYuX2RhdGFba2V5XSA9IHZhbHVlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIHNwZWNpYWwgY2FzZXMgZm9yIFBFUCA0NTkKICAgICAgICAgICAgICAgIGQgPSBzZWxmLl9kYXRhLnNldGRlZmF1bHQoJ2V4dGVuc2lvbnMnLCB7fSkKICAgICAgICAgICAgICAgIGlmIGtleSA9PSAnY29tbWFuZHMnOgogICAgICAgICAgICAgICAgICAgIGRbJ3B5dGhvbi5jb21tYW5kcyddID0gdmFsdWUKICAgICAgICAgICAgICAgIGVsaWYga2V5ID09ICdjbGFzc2lmaWVycyc6CiAgICAgICAgICAgICAgICAgICAgZCA9IGQuc2V0ZGVmYXVsdCgncHl0aG9uLmRldGFpbHMnLCB7fSkKICAgICAgICAgICAgICAgICAgICBkW2tleV0gPSB2YWx1ZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBkID0gZC5zZXRkZWZhdWx0KCdweXRob24uZXhwb3J0cycsIHt9KQogICAgICAgICAgICAgICAgICAgIGRba2V5XSA9IHZhbHVlCiAgICAgICAgZWxpZiBrZXkgbm90IGluIGNvbW1vbjoKICAgICAgICAgICAgb2JqZWN0Ll9fc2V0YXR0cl9fKHNlbGYsIGtleSwgdmFsdWUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYga2V5ID09ICdrZXl3b3Jkcyc6CiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBzdHJpbmdfdHlwZXMpOgogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc3RyaXAoKQogICAgICAgICAgICAgICAgICAgIGlmIHZhbHVlOgogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnNwbGl0KCkKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IFtdCiAgICAgICAgICAgIGlmIHNlbGYuX2xlZ2FjeToKICAgICAgICAgICAgICAgIHNlbGYuX2xlZ2FjeVtrZXldID0gdmFsdWUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuX2RhdGFba2V5XSA9IHZhbHVlCgogICAgQHByb3BlcnR5CiAgICBkZWYgbmFtZV9hbmRfdmVyc2lvbihzZWxmKToKICAgICAgICByZXR1cm4gX2dldF9uYW1lX2FuZF92ZXJzaW9uKHNlbGYubmFtZSwgc2VsZi52ZXJzaW9uLCBUcnVlKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHByb3ZpZGVzKHNlbGYpOgogICAgICAgIGlmIHNlbGYuX2xlZ2FjeToKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5fbGVnYWN5WydQcm92aWRlcy1EaXN0J10KICAgICAgICBlbHNlOgogICAgICAgICAgICByZXN1bHQgPSBzZWxmLl9kYXRhLnNldGRlZmF1bHQoJ3Byb3ZpZGVzJywgW10pCiAgICAgICAgcyA9ICclcyAoJXMpJyAlIChzZWxmLm5hbWUsIHNlbGYudmVyc2lvbikKICAgICAgICBpZiBzIG5vdCBpbiByZXN1bHQ6CiAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQocykKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgQHByb3ZpZGVzLnNldHRlcgogICAgZGVmIHByb3ZpZGVzKHNlbGYsIHZhbHVlKToKICAgICAgICBpZiBzZWxmLl9sZWdhY3k6CiAgICAgICAgICAgIHNlbGYuX2xlZ2FjeVsnUHJvdmlkZXMtRGlzdCddID0gdmFsdWUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLl9kYXRhWydwcm92aWRlcyddID0gdmFsdWUKCiAgICBkZWYgZ2V0X3JlcXVpcmVtZW50cyhzZWxmLCByZXF0cywgZXh0cmFzPU5vbmUsIGVudj1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBCYXNlIG1ldGhvZCB0byBnZXQgZGVwZW5kZW5jaWVzLCBnaXZlbiBhIHNldCBvZiBleHRyYXMKICAgICAgICB0byBzYXRpc2Z5IGFuZCBhbiBvcHRpb25hbCBlbnZpcm9ubWVudCBjb250ZXh0LgogICAgICAgIDpwYXJhbSByZXF0czogQSBsaXN0IG9mIHNvbWV0aW1lcy13YW50ZWQgZGVwZW5kZW5jaWVzLAogICAgICAgICAgICAgICAgICAgICAgcGVyaGFwcyBkZXBlbmRlbnQgb24gZXh0cmFzIGFuZCBlbnZpcm9ubWVudC4KICAgICAgICA6cGFyYW0gZXh0cmFzOiBBIGxpc3Qgb2Ygb3B0aW9uYWwgY29tcG9uZW50cyBiZWluZyByZXF1ZXN0ZWQuCiAgICAgICAgOnBhcmFtIGVudjogQW4gb3B0aW9uYWwgZW52aXJvbm1lbnQgZm9yIG1hcmtlciBldmFsdWF0aW9uLgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuX2xlZ2FjeToKICAgICAgICAgICAgcmVzdWx0ID0gcmVxdHMKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXN1bHQgPSBbXQogICAgICAgICAgICBleHRyYXMgPSBnZXRfZXh0cmFzKGV4dHJhcyBvciBbXSwgc2VsZi5leHRyYXMpCiAgICAgICAgICAgIGZvciBkIGluIHJlcXRzOgogICAgICAgICAgICAgICAgaWYgJ2V4dHJhJyBub3QgaW4gZCBhbmQgJ2Vudmlyb25tZW50JyBub3QgaW4gZDoKICAgICAgICAgICAgICAgICAgICAjIHVuY29uZGl0aW9uYWwKICAgICAgICAgICAgICAgICAgICBpbmNsdWRlID0gVHJ1ZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBpZiAnZXh0cmEnIG5vdCBpbiBkOgogICAgICAgICAgICAgICAgICAgICAgICAjIE5vdCBleHRyYS1kZXBlbmRlbnQgLSBvbmx5IGVudmlyb25tZW50LWRlcGVuZGVudAogICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgPSBkLmdldCgnZXh0cmEnKSBpbiBleHRyYXMKICAgICAgICAgICAgICAgICAgICBpZiBpbmNsdWRlOgogICAgICAgICAgICAgICAgICAgICAgICAjIE5vdCBleGNsdWRlZCBiZWNhdXNlIG9mIGV4dHJhcywgY2hlY2sgZW52aXJvbm1lbnQKICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VyID0gZC5nZXQoJ2Vudmlyb25tZW50JykKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbWFya2VyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZSA9IGludGVycHJldChtYXJrZXIsIGVudikKICAgICAgICAgICAgICAgIGlmIGluY2x1ZGU6CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmV4dGVuZChkWydyZXF1aXJlcyddKQogICAgICAgICAgICBmb3Iga2V5IGluICgnYnVpbGQnLCAnZGV2JywgJ3Rlc3QnKToKICAgICAgICAgICAgICAgIGUgPSAnOiVzOicgJSBrZXkKICAgICAgICAgICAgICAgIGlmIGUgaW4gZXh0cmFzOgogICAgICAgICAgICAgICAgICAgIGV4dHJhcy5yZW1vdmUoZSkKICAgICAgICAgICAgICAgICAgICAjIEEgcmVjdXJzaXZlIGNhbGwsIGJ1dCBpdCBzaG91bGQgdGVybWluYXRlIHNpbmNlICd0ZXN0JwogICAgICAgICAgICAgICAgICAgICMgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBleHRyYXMKICAgICAgICAgICAgICAgICAgICByZXF0cyA9IHNlbGYuX2RhdGEuZ2V0KCclc19yZXF1aXJlcycgJSBrZXksIFtdKQogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5leHRlbmQoc2VsZi5nZXRfcmVxdWlyZW1lbnRzKHJlcXRzLCBleHRyYXM9ZXh0cmFzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudj1lbnYpKQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBAcHJvcGVydHkKICAgIGRlZiBkaWN0aW9uYXJ5KHNlbGYpOgogICAgICAgIGlmIHNlbGYuX2xlZ2FjeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2Zyb21fbGVnYWN5KCkKICAgICAgICByZXR1cm4gc2VsZi5fZGF0YQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGRlcGVuZGVuY2llcyhzZWxmKToKICAgICAgICBpZiBzZWxmLl9sZWdhY3k6CiAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gZXh0cmFjdF9ieV9rZXkoc2VsZi5fZGF0YSwgc2VsZi5ERVBFTkRFTkNZX0tFWVMpCgogICAgQGRlcGVuZGVuY2llcy5zZXR0ZXIKICAgIGRlZiBkZXBlbmRlbmNpZXMoc2VsZiwgdmFsdWUpOgogICAgICAgIGlmIHNlbGYuX2xlZ2FjeToKICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuX2RhdGEudXBkYXRlKHZhbHVlKQoKICAgIGRlZiBfdmFsaWRhdGVfbWFwcGluZyhzZWxmLCBtYXBwaW5nLCBzY2hlbWUpOgogICAgICAgIGlmIG1hcHBpbmcuZ2V0KCdtZXRhZGF0YV92ZXJzaW9uJykgIT0gc2VsZi5NRVRBREFUQV9WRVJTSU9OOgogICAgICAgICAgICByYWlzZSBNZXRhZGF0YVVucmVjb2duaXplZFZlcnNpb25FcnJvcigpCiAgICAgICAgbWlzc2luZyA9IFtdCiAgICAgICAgZm9yIGtleSwgZXhjbHVzaW9ucyBpbiBzZWxmLk1BTkRBVE9SWV9LRVlTLml0ZW1zKCk6CiAgICAgICAgICAgIGlmIGtleSBub3QgaW4gbWFwcGluZzoKICAgICAgICAgICAgICAgIGlmIHNjaGVtZSBub3QgaW4gZXhjbHVzaW9uczoKICAgICAgICAgICAgICAgICAgICBtaXNzaW5nLmFwcGVuZChrZXkpCiAgICAgICAgaWYgbWlzc2luZzoKICAgICAgICAgICAgbXNnID0gJ01pc3NpbmcgbWV0YWRhdGEgaXRlbXM6ICVzJyAlICcsICcuam9pbihtaXNzaW5nKQogICAgICAgICAgICByYWlzZSBNZXRhZGF0YU1pc3NpbmdFcnJvcihtc2cpCiAgICAgICAgZm9yIGssIHYgaW4gbWFwcGluZy5pdGVtcygpOgogICAgICAgICAgICBzZWxmLl92YWxpZGF0ZV92YWx1ZShrLCB2LCBzY2hlbWUpCgogICAgZGVmIHZhbGlkYXRlKHNlbGYpOgogICAgICAgIGlmIHNlbGYuX2xlZ2FjeToKICAgICAgICAgICAgbWlzc2luZywgd2FybmluZ3MgPSBzZWxmLl9sZWdhY3kuY2hlY2soVHJ1ZSkKICAgICAgICAgICAgaWYgbWlzc2luZyBvciB3YXJuaW5nczoKICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdNZXRhZGF0YTogbWlzc2luZzogJXMsIHdhcm5pbmdzOiAlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzaW5nLCB3YXJuaW5ncykKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLl92YWxpZGF0ZV9tYXBwaW5nKHNlbGYuX2RhdGEsIHNlbGYuc2NoZW1lKQoKICAgIGRlZiB0b2RpY3Qoc2VsZik6CiAgICAgICAgaWYgc2VsZi5fbGVnYWN5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5fbGVnYWN5LnRvZGljdChUcnVlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJlc3VsdCA9IGV4dHJhY3RfYnlfa2V5KHNlbGYuX2RhdGEsIHNlbGYuSU5ERVhfS0VZUykKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBfZnJvbV9sZWdhY3koc2VsZik6CiAgICAgICAgYXNzZXJ0IHNlbGYuX2xlZ2FjeSBhbmQgbm90IHNlbGYuX2RhdGEKICAgICAgICByZXN1bHQgPSB7CiAgICAgICAgICAgICdtZXRhZGF0YV92ZXJzaW9uJzogc2VsZi5NRVRBREFUQV9WRVJTSU9OLAogICAgICAgICAgICAnZ2VuZXJhdG9yJzogc2VsZi5HRU5FUkFUT1IsCiAgICAgICAgfQogICAgICAgIGxtZCA9IHNlbGYuX2xlZ2FjeS50b2RpY3QoVHJ1ZSkgICAgICMgc2tpcCBtaXNzaW5nIG9uZXMKICAgICAgICBmb3IgayBpbiAoJ25hbWUnLCAndmVyc2lvbicsICdsaWNlbnNlJywgJ3N1bW1hcnknLCAnZGVzY3JpcHRpb24nLAogICAgICAgICAgICAgICAgICAnY2xhc3NpZmllcicpOgogICAgICAgICAgICBpZiBrIGluIGxtZDoKICAgICAgICAgICAgICAgIGlmIGsgPT0gJ2NsYXNzaWZpZXInOgogICAgICAgICAgICAgICAgICAgIG5rID0gJ2NsYXNzaWZpZXJzJwogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBuayA9IGsKICAgICAgICAgICAgICAgIHJlc3VsdFtua10gPSBsbWRba10KICAgICAgICBrdyA9IGxtZC5nZXQoJ0tleXdvcmRzJywgW10pCiAgICAgICAgaWYga3cgPT0gWycnXToKICAgICAgICAgICAga3cgPSBbXQogICAgICAgIHJlc3VsdFsna2V5d29yZHMnXSA9IGt3CiAgICAgICAga2V5cyA9ICgoJ3JlcXVpcmVzX2Rpc3QnLCAncnVuX3JlcXVpcmVzJyksCiAgICAgICAgICAgICAgICAoJ3NldHVwX3JlcXVpcmVzX2Rpc3QnLCAnYnVpbGRfcmVxdWlyZXMnKSkKICAgICAgICBmb3Igb2ssIG5rIGluIGtleXM6CiAgICAgICAgICAgIGlmIG9rIGluIGxtZCBhbmQgbG1kW29rXToKICAgICAgICAgICAgICAgIHJlc3VsdFtua10gPSBbeydyZXF1aXJlcyc6IGxtZFtva119XQogICAgICAgIHJlc3VsdFsncHJvdmlkZXMnXSA9IHNlbGYucHJvdmlkZXMKICAgICAgICBhdXRob3IgPSB7fQogICAgICAgIG1haW50YWluZXIgPSB7fQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBMRUdBQ1lfTUFQUElORyA9IHsKICAgICAgICAnbmFtZSc6ICdOYW1lJywKICAgICAgICAndmVyc2lvbic6ICdWZXJzaW9uJywKICAgICAgICAnbGljZW5zZSc6ICdMaWNlbnNlJywKICAgICAgICAnc3VtbWFyeSc6ICdTdW1tYXJ5JywKICAgICAgICAnZGVzY3JpcHRpb24nOiAnRGVzY3JpcHRpb24nLAogICAgICAgICdjbGFzc2lmaWVycyc6ICdDbGFzc2lmaWVyJywKICAgIH0KCiAgICBkZWYgX3RvX2xlZ2FjeShzZWxmKToKICAgICAgICBkZWYgcHJvY2Vzc19lbnRyaWVzKGVudHJpZXMpOgogICAgICAgICAgICByZXF0cyA9IHNldCgpCiAgICAgICAgICAgIGZvciBlIGluIGVudHJpZXM6CiAgICAgICAgICAgICAgICBleHRyYSA9IGUuZ2V0KCdleHRyYScpCiAgICAgICAgICAgICAgICBlbnYgPSBlLmdldCgnZW52aXJvbm1lbnQnKQogICAgICAgICAgICAgICAgcmxpc3QgPSBlWydyZXF1aXJlcyddCiAgICAgICAgICAgICAgICBmb3IgciBpbiBybGlzdDoKICAgICAgICAgICAgICAgICAgICBpZiBub3QgZW52IGFuZCBub3QgZXh0cmE6CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXRzLmFkZChyKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlciA9ICcnCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGV4dHJhOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VyID0gJ2V4dHJhID09ICIlcyInICUgZXh0cmEKICAgICAgICAgICAgICAgICAgICAgICAgaWYgZW52OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbWFya2VyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlciA9ICcoJXMpIGFuZCAlcycgJSAoZW52LCBtYXJrZXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlciA9IGVudgogICAgICAgICAgICAgICAgICAgICAgICByZXF0cy5hZGQoJzsnLmpvaW4oKHIsIG1hcmtlcikpKQogICAgICAgICAgICByZXR1cm4gcmVxdHMKCiAgICAgICAgYXNzZXJ0IHNlbGYuX2RhdGEgYW5kIG5vdCBzZWxmLl9sZWdhY3kKICAgICAgICByZXN1bHQgPSBMZWdhY3lNZXRhZGF0YSgpCiAgICAgICAgbm1kID0gc2VsZi5fZGF0YQogICAgICAgIGZvciBuaywgb2sgaW4gc2VsZi5MRUdBQ1lfTUFQUElORy5pdGVtcygpOgogICAgICAgICAgICBpZiBuayBpbiBubWQ6CiAgICAgICAgICAgICAgICByZXN1bHRbb2tdID0gbm1kW25rXQogICAgICAgIHIxID0gcHJvY2Vzc19lbnRyaWVzKHNlbGYucnVuX3JlcXVpcmVzICsgc2VsZi5tZXRhX3JlcXVpcmVzKQogICAgICAgIHIyID0gcHJvY2Vzc19lbnRyaWVzKHNlbGYuYnVpbGRfcmVxdWlyZXMgKyBzZWxmLmRldl9yZXF1aXJlcykKICAgICAgICBpZiBzZWxmLmV4dHJhczoKICAgICAgICAgICAgcmVzdWx0WydQcm92aWRlcy1FeHRyYSddID0gc29ydGVkKHNlbGYuZXh0cmFzKQogICAgICAgIHJlc3VsdFsnUmVxdWlyZXMtRGlzdCddID0gc29ydGVkKHIxKQogICAgICAgIHJlc3VsdFsnU2V0dXAtUmVxdWlyZXMtRGlzdCddID0gc29ydGVkKHIyKQogICAgICAgICMgVE9ETzogb3RoZXIgZmllbGRzIHN1Y2ggYXMgY29udGFjdHMKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIHdyaXRlKHNlbGYsIHBhdGg9Tm9uZSwgZmlsZW9iaj1Ob25lLCBsZWdhY3k9RmFsc2UsIHNraXBfdW5rbm93bj1UcnVlKToKICAgICAgICBpZiBbcGF0aCwgZmlsZW9ial0uY291bnQoTm9uZSkgIT0gMToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignRXhhY3RseSBvbmUgb2YgcGF0aCBhbmQgZmlsZW9iaiBpcyBuZWVkZWQnKQogICAgICAgIHNlbGYudmFsaWRhdGUoKQogICAgICAgIGlmIGxlZ2FjeToKICAgICAgICAgICAgaWYgc2VsZi5fbGVnYWN5OgogICAgICAgICAgICAgICAgbGVnYWN5X21kID0gc2VsZi5fbGVnYWN5CiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBsZWdhY3lfbWQgPSBzZWxmLl90b19sZWdhY3koKQogICAgICAgICAgICBpZiBwYXRoOgogICAgICAgICAgICAgICAgbGVnYWN5X21kLndyaXRlKHBhdGgsIHNraXBfdW5rbm93bj1za2lwX3Vua25vd24pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBsZWdhY3lfbWQud3JpdGVfZmlsZShmaWxlb2JqLCBza2lwX3Vua25vd249c2tpcF91bmtub3duKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIHNlbGYuX2xlZ2FjeToKICAgICAgICAgICAgICAgIGQgPSBzZWxmLl9mcm9tX2xlZ2FjeSgpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBkID0gc2VsZi5fZGF0YQogICAgICAgICAgICBpZiBmaWxlb2JqOgogICAgICAgICAgICAgICAganNvbi5kdW1wKGQsIGZpbGVvYmosIGVuc3VyZV9hc2NpaT1UcnVlLCBpbmRlbnQ9MiwKICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0X2tleXM9VHJ1ZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHdpdGggY29kZWNzLm9wZW4ocGF0aCwgJ3cnLCAndXRmLTgnKSBhcyBmOgogICAgICAgICAgICAgICAgICAgIGpzb24uZHVtcChkLCBmLCBlbnN1cmVfYXNjaWk9VHJ1ZSwgaW5kZW50PTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRfa2V5cz1UcnVlKQoKICAgIGRlZiBhZGRfcmVxdWlyZW1lbnRzKHNlbGYsIHJlcXVpcmVtZW50cyk6CiAgICAgICAgaWYgc2VsZi5fbGVnYWN5OgogICAgICAgICAgICBzZWxmLl9sZWdhY3kuYWRkX3JlcXVpcmVtZW50cyhyZXF1aXJlbWVudHMpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcnVuX3JlcXVpcmVzID0gc2VsZi5fZGF0YS5zZXRkZWZhdWx0KCdydW5fcmVxdWlyZXMnLCBbXSkKICAgICAgICAgICAgYWx3YXlzID0gTm9uZQogICAgICAgICAgICBmb3IgZW50cnkgaW4gcnVuX3JlcXVpcmVzOgogICAgICAgICAgICAgICAgaWYgJ2Vudmlyb25tZW50JyBub3QgaW4gZW50cnkgYW5kICdleHRyYScgbm90IGluIGVudHJ5OgogICAgICAgICAgICAgICAgICAgIGFsd2F5cyA9IGVudHJ5CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgaWYgYWx3YXlzIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBhbHdheXMgPSB7ICdyZXF1aXJlcyc6IHJlcXVpcmVtZW50cyB9CiAgICAgICAgICAgICAgICBydW5fcmVxdWlyZXMuaW5zZXJ0KDAsIGFsd2F5cykKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJzZXQgPSBzZXQoYWx3YXlzWydyZXF1aXJlcyddKSB8IHNldChyZXF1aXJlbWVudHMpCiAgICAgICAgICAgICAgICBhbHdheXNbJ3JlcXVpcmVzJ10gPSBzb3J0ZWQocnNldCkKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgbmFtZSA9IHNlbGYubmFtZSBvciAnKG5vIG5hbWUpJwogICAgICAgIHZlcnNpb24gPSBzZWxmLnZlcnNpb24gb3IgJ25vIHZlcnNpb24nCiAgICAgICAgcmV0dXJuICc8JXMgJXMgJXMgKCVzKT4nICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm1ldGFkYXRhX3ZlcnNpb24sIG5hbWUsIHZlcnNpb24pClBLAwQUAAAAAAAAACEAyLdFmA4qAAAOKgAAMAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL3Jlc291cmNlcy5weSMgLSotIGNvZGluZzogdXRmLTggLSotCiMKIyBDb3B5cmlnaHQgKEMpIDIwMTMtMjAxNiBWaW5heSBTYWppcC4KIyBMaWNlbnNlZCB0byB0aGUgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24gdW5kZXIgYSBjb250cmlidXRvciBhZ3JlZW1lbnQuCiMgU2VlIExJQ0VOU0UudHh0IGFuZCBDT05UUklCVVRPUlMudHh0LgojCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgdW5pY29kZV9saXRlcmFscwoKaW1wb3J0IGJpc2VjdAppbXBvcnQgaW8KaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG9zCmltcG9ydCBwa2d1dGlsCmltcG9ydCBzaHV0aWwKaW1wb3J0IHN5cwppbXBvcnQgdHlwZXMKaW1wb3J0IHppcGltcG9ydAoKZnJvbSAuIGltcG9ydCBEaXN0bGliRXhjZXB0aW9uCmZyb20gLnV0aWwgaW1wb3J0IGNhY2hlZF9wcm9wZXJ0eSwgZ2V0X2NhY2hlX2Jhc2UsIHBhdGhfdG9fY2FjaGVfZGlyLCBDYWNoZQoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKY2FjaGUgPSBOb25lICAgICMgY3JlYXRlZCB3aGVuIG5lZWRlZAoKCmNsYXNzIFJlc291cmNlQ2FjaGUoQ2FjaGUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGJhc2U9Tm9uZSk6CiAgICAgICAgaWYgYmFzZSBpcyBOb25lOgogICAgICAgICAgICAjIFVzZSBuYXRpdmUgc3RyaW5nIHRvIGF2b2lkIGlzc3VlcyBvbiAyLng6IHNlZSBQeXRob24gIzIwMTQwLgogICAgICAgICAgICBiYXNlID0gb3MucGF0aC5qb2luKGdldF9jYWNoZV9iYXNlKCksIHN0cigncmVzb3VyY2UtY2FjaGUnKSkKICAgICAgICBzdXBlcihSZXNvdXJjZUNhY2hlLCBzZWxmKS5fX2luaXRfXyhiYXNlKQoKICAgIGRlZiBpc19zdGFsZShzZWxmLCByZXNvdXJjZSwgcGF0aCk6CiAgICAgICAgIiIiCiAgICAgICAgSXMgdGhlIGNhY2hlIHN0YWxlIGZvciB0aGUgZ2l2ZW4gcmVzb3VyY2U/CgogICAgICAgIDpwYXJhbSByZXNvdXJjZTogVGhlIDpjbGFzczpgUmVzb3VyY2VgIGJlaW5nIGNhY2hlZC4KICAgICAgICA6cGFyYW0gcGF0aDogVGhlIHBhdGggb2YgdGhlIHJlc291cmNlIGluIHRoZSBjYWNoZS4KICAgICAgICA6cmV0dXJuOiBUcnVlIGlmIHRoZSBjYWNoZSBpcyBzdGFsZS4KICAgICAgICAiIiIKICAgICAgICAjIENhY2hlIGludmFsaWRhdGlvbiBpcyBhIGhhcmQgcHJvYmxlbSA6LSkKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBnZXQoc2VsZiwgcmVzb3VyY2UpOgogICAgICAgICIiIgogICAgICAgIEdldCBhIHJlc291cmNlIGludG8gdGhlIGNhY2hlLAoKICAgICAgICA6cGFyYW0gcmVzb3VyY2U6IEEgOmNsYXNzOmBSZXNvdXJjZWAgaW5zdGFuY2UuCiAgICAgICAgOnJldHVybjogVGhlIHBhdGhuYW1lIG9mIHRoZSByZXNvdXJjZSBpbiB0aGUgY2FjaGUuCiAgICAgICAgIiIiCiAgICAgICAgcHJlZml4LCBwYXRoID0gcmVzb3VyY2UuZmluZGVyLmdldF9jYWNoZV9pbmZvKHJlc291cmNlKQogICAgICAgIGlmIHByZWZpeCBpcyBOb25lOgogICAgICAgICAgICByZXN1bHQgPSBwYXRoCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVzdWx0ID0gb3MucGF0aC5qb2luKHNlbGYuYmFzZSwgc2VsZi5wcmVmaXhfdG9fZGlyKHByZWZpeCksIHBhdGgpCiAgICAgICAgICAgIGRpcm5hbWUgPSBvcy5wYXRoLmRpcm5hbWUocmVzdWx0KQogICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihkaXJuYW1lKToKICAgICAgICAgICAgICAgIG9zLm1ha2VkaXJzKGRpcm5hbWUpCiAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhyZXN1bHQpOgogICAgICAgICAgICAgICAgc3RhbGUgPSBUcnVlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzdGFsZSA9IHNlbGYuaXNfc3RhbGUocmVzb3VyY2UsIHBhdGgpCiAgICAgICAgICAgIGlmIHN0YWxlOgogICAgICAgICAgICAgICAgIyB3cml0ZSB0aGUgYnl0ZXMgb2YgdGhlIHJlc291cmNlIHRvIHRoZSBjYWNoZSBsb2NhdGlvbgogICAgICAgICAgICAgICAgd2l0aCBvcGVuKHJlc3VsdCwgJ3diJykgYXMgZjoKICAgICAgICAgICAgICAgICAgICBmLndyaXRlKHJlc291cmNlLmJ5dGVzKQogICAgICAgIHJldHVybiByZXN1bHQKCgpjbGFzcyBSZXNvdXJjZUJhc2Uob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaW5kZXIsIG5hbWUpOgogICAgICAgIHNlbGYuZmluZGVyID0gZmluZGVyCiAgICAgICAgc2VsZi5uYW1lID0gbmFtZQoKCmNsYXNzIFJlc291cmNlKFJlc291cmNlQmFzZSk6CiAgICAiIiIKICAgIEEgY2xhc3MgcmVwcmVzZW50aW5nIGFuIGluLXBhY2thZ2UgcmVzb3VyY2UsIHN1Y2ggYXMgYSBkYXRhIGZpbGUuIFRoaXMgaXMKICAgIG5vdCBub3JtYWxseSBpbnN0YW50aWF0ZWQgYnkgdXNlciBjb2RlLCBidXQgcmF0aGVyIGJ5IGEKICAgIDpjbGFzczpgUmVzb3VyY2VGaW5kZXJgIHdoaWNoIG1hbmFnZXMgdGhlIHJlc291cmNlLgogICAgIiIiCiAgICBpc19jb250YWluZXIgPSBGYWxzZSAgICAgICAgIyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eQoKICAgIGRlZiBhc19zdHJlYW0oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgR2V0IHRoZSByZXNvdXJjZSBhcyBhIHN0cmVhbS4KCiAgICAgICAgVGhpcyBpcyBub3QgYSBwcm9wZXJ0eSB0byBtYWtlIGl0IG9idmlvdXMgdGhhdCBpdCByZXR1cm5zIGEgbmV3IHN0cmVhbQogICAgICAgIGVhY2ggdGltZS4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5maW5kZXIuZ2V0X3N0cmVhbShzZWxmKQoKICAgIEBjYWNoZWRfcHJvcGVydHkKICAgIGRlZiBmaWxlX3BhdGgoc2VsZik6CiAgICAgICAgZ2xvYmFsIGNhY2hlCiAgICAgICAgaWYgY2FjaGUgaXMgTm9uZToKICAgICAgICAgICAgY2FjaGUgPSBSZXNvdXJjZUNhY2hlKCkKICAgICAgICByZXR1cm4gY2FjaGUuZ2V0KHNlbGYpCgogICAgQGNhY2hlZF9wcm9wZXJ0eQogICAgZGVmIGJ5dGVzKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmZpbmRlci5nZXRfYnl0ZXMoc2VsZikKCiAgICBAY2FjaGVkX3Byb3BlcnR5CiAgICBkZWYgc2l6ZShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5maW5kZXIuZ2V0X3NpemUoc2VsZikKCgpjbGFzcyBSZXNvdXJjZUNvbnRhaW5lcihSZXNvdXJjZUJhc2UpOgogICAgaXNfY29udGFpbmVyID0gVHJ1ZSAgICAgIyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eQoKICAgIEBjYWNoZWRfcHJvcGVydHkKICAgIGRlZiByZXNvdXJjZXMoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuZmluZGVyLmdldF9yZXNvdXJjZXMoc2VsZikKCgpjbGFzcyBSZXNvdXJjZUZpbmRlcihvYmplY3QpOgogICAgIiIiCiAgICBSZXNvdXJjZSBmaW5kZXIgZm9yIGZpbGUgc3lzdGVtIHJlc291cmNlcy4KICAgICIiIgoKICAgIGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdqYXZhJyk6CiAgICAgICAgc2tpcHBlZF9leHRlbnNpb25zID0gKCcucHljJywgJy5weW8nLCAnLmNsYXNzJykKICAgIGVsc2U6CiAgICAgICAgc2tpcHBlZF9leHRlbnNpb25zID0gKCcucHljJywgJy5weW8nKQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtb2R1bGUpOgogICAgICAgIHNlbGYubW9kdWxlID0gbW9kdWxlCiAgICAgICAgc2VsZi5sb2FkZXIgPSBnZXRhdHRyKG1vZHVsZSwgJ19fbG9hZGVyX18nLCBOb25lKQogICAgICAgIHNlbGYuYmFzZSA9IG9zLnBhdGguZGlybmFtZShnZXRhdHRyKG1vZHVsZSwgJ19fZmlsZV9fJywgJycpKQoKICAgIGRlZiBfYWRqdXN0X3BhdGgoc2VsZiwgcGF0aCk6CiAgICAgICAgcmV0dXJuIG9zLnBhdGgucmVhbHBhdGgocGF0aCkKCiAgICBkZWYgX21ha2VfcGF0aChzZWxmLCByZXNvdXJjZV9uYW1lKToKICAgICAgICAjIElzc3VlICM1MDogbmVlZCB0byBwcmVzZXJ2ZSB0eXBlIG9mIHBhdGggb24gUHl0aG9uIDIueAogICAgICAgICMgbGlrZSBvcy5wYXRoLl9nZXRfc2VwCiAgICAgICAgaWYgaXNpbnN0YW5jZShyZXNvdXJjZV9uYW1lLCBieXRlcyk6ICAgICMgc2hvdWxkIG9ubHkgaGFwcGVuIG9uIDIueAogICAgICAgICAgICBzZXAgPSBiJy8nCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VwID0gJy8nCiAgICAgICAgcGFydHMgPSByZXNvdXJjZV9uYW1lLnNwbGl0KHNlcCkKICAgICAgICBwYXJ0cy5pbnNlcnQoMCwgc2VsZi5iYXNlKQogICAgICAgIHJlc3VsdCA9IG9zLnBhdGguam9pbigqcGFydHMpCiAgICAgICAgcmV0dXJuIHNlbGYuX2FkanVzdF9wYXRoKHJlc3VsdCkKCiAgICBkZWYgX2ZpbmQoc2VsZiwgcGF0aCk6CiAgICAgICAgcmV0dXJuIG9zLnBhdGguZXhpc3RzKHBhdGgpCgogICAgZGVmIGdldF9jYWNoZV9pbmZvKHNlbGYsIHJlc291cmNlKToKICAgICAgICByZXR1cm4gTm9uZSwgcmVzb3VyY2UucGF0aAoKICAgIGRlZiBmaW5kKHNlbGYsIHJlc291cmNlX25hbWUpOgogICAgICAgIHBhdGggPSBzZWxmLl9tYWtlX3BhdGgocmVzb3VyY2VfbmFtZSkKICAgICAgICBpZiBub3Qgc2VsZi5fZmluZChwYXRoKToKICAgICAgICAgICAgcmVzdWx0ID0gTm9uZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIHNlbGYuX2lzX2RpcmVjdG9yeShwYXRoKToKICAgICAgICAgICAgICAgIHJlc3VsdCA9IFJlc291cmNlQ29udGFpbmVyKHNlbGYsIHJlc291cmNlX25hbWUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBSZXNvdXJjZShzZWxmLCByZXNvdXJjZV9uYW1lKQogICAgICAgICAgICByZXN1bHQucGF0aCA9IHBhdGgKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIGdldF9zdHJlYW0oc2VsZiwgcmVzb3VyY2UpOgogICAgICAgIHJldHVybiBvcGVuKHJlc291cmNlLnBhdGgsICdyYicpCgogICAgZGVmIGdldF9ieXRlcyhzZWxmLCByZXNvdXJjZSk6CiAgICAgICAgd2l0aCBvcGVuKHJlc291cmNlLnBhdGgsICdyYicpIGFzIGY6CiAgICAgICAgICAgIHJldHVybiBmLnJlYWQoKQoKICAgIGRlZiBnZXRfc2l6ZShzZWxmLCByZXNvdXJjZSk6CiAgICAgICAgcmV0dXJuIG9zLnBhdGguZ2V0c2l6ZShyZXNvdXJjZS5wYXRoKQoKICAgIGRlZiBnZXRfcmVzb3VyY2VzKHNlbGYsIHJlc291cmNlKToKICAgICAgICBkZWYgYWxsb3dlZChmKToKICAgICAgICAgICAgcmV0dXJuIChmICE9ICdfX3B5Y2FjaGVfXycgYW5kIG5vdAogICAgICAgICAgICAgICAgICAgIGYuZW5kc3dpdGgoc2VsZi5za2lwcGVkX2V4dGVuc2lvbnMpKQogICAgICAgIHJldHVybiBzZXQoW2YgZm9yIGYgaW4gb3MubGlzdGRpcihyZXNvdXJjZS5wYXRoKSBpZiBhbGxvd2VkKGYpXSkKCiAgICBkZWYgaXNfY29udGFpbmVyKHNlbGYsIHJlc291cmNlKToKICAgICAgICByZXR1cm4gc2VsZi5faXNfZGlyZWN0b3J5KHJlc291cmNlLnBhdGgpCgogICAgX2lzX2RpcmVjdG9yeSA9IHN0YXRpY21ldGhvZChvcy5wYXRoLmlzZGlyKQoKICAgIGRlZiBpdGVyYXRvcihzZWxmLCByZXNvdXJjZV9uYW1lKToKICAgICAgICByZXNvdXJjZSA9IHNlbGYuZmluZChyZXNvdXJjZV9uYW1lKQogICAgICAgIGlmIHJlc291cmNlIGlzIG5vdCBOb25lOgogICAgICAgICAgICB0b2RvID0gW3Jlc291cmNlXQogICAgICAgICAgICB3aGlsZSB0b2RvOgogICAgICAgICAgICAgICAgcmVzb3VyY2UgPSB0b2RvLnBvcCgwKQogICAgICAgICAgICAgICAgeWllbGQgcmVzb3VyY2UKICAgICAgICAgICAgICAgIGlmIHJlc291cmNlLmlzX2NvbnRhaW5lcjoKICAgICAgICAgICAgICAgICAgICBybmFtZSA9IHJlc291cmNlLm5hbWUKICAgICAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiByZXNvdXJjZS5yZXNvdXJjZXM6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBybmFtZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19uYW1lID0gbmFtZQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X25hbWUgPSAnLycuam9pbihbcm5hbWUsIG5hbWVdKQogICAgICAgICAgICAgICAgICAgICAgICBjaGlsZCA9IHNlbGYuZmluZChuZXdfbmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgY2hpbGQuaXNfY29udGFpbmVyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9kby5hcHBlbmQoY2hpbGQpCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBjaGlsZAoKCmNsYXNzIFppcFJlc291cmNlRmluZGVyKFJlc291cmNlRmluZGVyKToKICAgICIiIgogICAgUmVzb3VyY2UgZmluZGVyIGZvciByZXNvdXJjZXMgaW4gLnppcCBmaWxlcy4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1vZHVsZSk6CiAgICAgICAgc3VwZXIoWmlwUmVzb3VyY2VGaW5kZXIsIHNlbGYpLl9faW5pdF9fKG1vZHVsZSkKICAgICAgICBhcmNoaXZlID0gc2VsZi5sb2FkZXIuYXJjaGl2ZQogICAgICAgIHNlbGYucHJlZml4X2xlbiA9IDEgKyBsZW4oYXJjaGl2ZSkKICAgICAgICAjIFB5UHkgZG9lc24ndCBoYXZlIGEgX2ZpbGVzIGF0dHIgb24gemlwaW1wb3J0ZXIsIGFuZCB5b3UgY2FuJ3Qgc2V0IG9uZQogICAgICAgIGlmIGhhc2F0dHIoc2VsZi5sb2FkZXIsICdfZmlsZXMnKToKICAgICAgICAgICAgc2VsZi5fZmlsZXMgPSBzZWxmLmxvYWRlci5fZmlsZXMKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLl9maWxlcyA9IHppcGltcG9ydC5femlwX2RpcmVjdG9yeV9jYWNoZVthcmNoaXZlXQogICAgICAgIHNlbGYuaW5kZXggPSBzb3J0ZWQoc2VsZi5fZmlsZXMpCgogICAgZGVmIF9hZGp1c3RfcGF0aChzZWxmLCBwYXRoKToKICAgICAgICByZXR1cm4gcGF0aAoKICAgIGRlZiBfZmluZChzZWxmLCBwYXRoKToKICAgICAgICBwYXRoID0gcGF0aFtzZWxmLnByZWZpeF9sZW46XQogICAgICAgIGlmIHBhdGggaW4gc2VsZi5fZmlsZXM6CiAgICAgICAgICAgIHJlc3VsdCA9IFRydWUKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBwYXRoIGFuZCBwYXRoWy0xXSAhPSBvcy5zZXA6CiAgICAgICAgICAgICAgICBwYXRoID0gcGF0aCArIG9zLnNlcAogICAgICAgICAgICBpID0gYmlzZWN0LmJpc2VjdChzZWxmLmluZGV4LCBwYXRoKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBzZWxmLmluZGV4W2ldLnN0YXJ0c3dpdGgocGF0aCkKICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBGYWxzZQogICAgICAgIGlmIG5vdCByZXN1bHQ6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnX2ZpbmQgZmFpbGVkOiAlciAlcicsIHBhdGgsIHNlbGYubG9hZGVyLnByZWZpeCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ19maW5kIHdvcmtlZDogJXIgJXInLCBwYXRoLCBzZWxmLmxvYWRlci5wcmVmaXgpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBnZXRfY2FjaGVfaW5mbyhzZWxmLCByZXNvdXJjZSk6CiAgICAgICAgcHJlZml4ID0gc2VsZi5sb2FkZXIuYXJjaGl2ZQogICAgICAgIHBhdGggPSByZXNvdXJjZS5wYXRoWzEgKyBsZW4ocHJlZml4KTpdCiAgICAgICAgcmV0dXJuIHByZWZpeCwgcGF0aAoKICAgIGRlZiBnZXRfYnl0ZXMoc2VsZiwgcmVzb3VyY2UpOgogICAgICAgIHJldHVybiBzZWxmLmxvYWRlci5nZXRfZGF0YShyZXNvdXJjZS5wYXRoKQoKICAgIGRlZiBnZXRfc3RyZWFtKHNlbGYsIHJlc291cmNlKToKICAgICAgICByZXR1cm4gaW8uQnl0ZXNJTyhzZWxmLmdldF9ieXRlcyhyZXNvdXJjZSkpCgogICAgZGVmIGdldF9zaXplKHNlbGYsIHJlc291cmNlKToKICAgICAgICBwYXRoID0gcmVzb3VyY2UucGF0aFtzZWxmLnByZWZpeF9sZW46XQogICAgICAgIHJldHVybiBzZWxmLl9maWxlc1twYXRoXVszXQoKICAgIGRlZiBnZXRfcmVzb3VyY2VzKHNlbGYsIHJlc291cmNlKToKICAgICAgICBwYXRoID0gcmVzb3VyY2UucGF0aFtzZWxmLnByZWZpeF9sZW46XQogICAgICAgIGlmIHBhdGggYW5kIHBhdGhbLTFdICE9IG9zLnNlcDoKICAgICAgICAgICAgcGF0aCArPSBvcy5zZXAKICAgICAgICBwbGVuID0gbGVuKHBhdGgpCiAgICAgICAgcmVzdWx0ID0gc2V0KCkKICAgICAgICBpID0gYmlzZWN0LmJpc2VjdChzZWxmLmluZGV4LCBwYXRoKQogICAgICAgIHdoaWxlIGkgPCBsZW4oc2VsZi5pbmRleCk6CiAgICAgICAgICAgIGlmIG5vdCBzZWxmLmluZGV4W2ldLnN0YXJ0c3dpdGgocGF0aCk6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBzID0gc2VsZi5pbmRleFtpXVtwbGVuOl0KICAgICAgICAgICAgcmVzdWx0LmFkZChzLnNwbGl0KG9zLnNlcCwgMSlbMF0pICAgIyBvbmx5IGltbWVkaWF0ZSBjaGlsZHJlbgogICAgICAgICAgICBpICs9IDEKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIF9pc19kaXJlY3Rvcnkoc2VsZiwgcGF0aCk6CiAgICAgICAgcGF0aCA9IHBhdGhbc2VsZi5wcmVmaXhfbGVuOl0KICAgICAgICBpZiBwYXRoIGFuZCBwYXRoWy0xXSAhPSBvcy5zZXA6CiAgICAgICAgICAgIHBhdGggKz0gb3Muc2VwCiAgICAgICAgaSA9IGJpc2VjdC5iaXNlY3Qoc2VsZi5pbmRleCwgcGF0aCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuaW5kZXhbaV0uc3RhcnRzd2l0aChwYXRoKQogICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgogICAgICAgICAgICByZXN1bHQgPSBGYWxzZQogICAgICAgIHJldHVybiByZXN1bHQKCl9maW5kZXJfcmVnaXN0cnkgPSB7CiAgICB0eXBlKE5vbmUpOiBSZXNvdXJjZUZpbmRlciwKICAgIHppcGltcG9ydC56aXBpbXBvcnRlcjogWmlwUmVzb3VyY2VGaW5kZXIKfQoKdHJ5OgogICAgIyBJbiBQeXRob24gMy42LCBfZnJvemVuX2ltcG9ydGxpYiAtPiBfZnJvemVuX2ltcG9ydGxpYl9leHRlcm5hbAogICAgdHJ5OgogICAgICAgIGltcG9ydCBfZnJvemVuX2ltcG9ydGxpYl9leHRlcm5hbCBhcyBfZmkKICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICBpbXBvcnQgX2Zyb3plbl9pbXBvcnRsaWIgYXMgX2ZpCiAgICBfZmluZGVyX3JlZ2lzdHJ5W19maS5Tb3VyY2VGaWxlTG9hZGVyXSA9IFJlc291cmNlRmluZGVyCiAgICBfZmluZGVyX3JlZ2lzdHJ5W19maS5GaWxlRmluZGVyXSA9IFJlc291cmNlRmluZGVyCiAgICBkZWwgX2ZpCmV4Y2VwdCAoSW1wb3J0RXJyb3IsIEF0dHJpYnV0ZUVycm9yKToKICAgIHBhc3MKCgpkZWYgcmVnaXN0ZXJfZmluZGVyKGxvYWRlciwgZmluZGVyX21ha2VyKToKICAgIF9maW5kZXJfcmVnaXN0cnlbdHlwZShsb2FkZXIpXSA9IGZpbmRlcl9tYWtlcgoKX2ZpbmRlcl9jYWNoZSA9IHt9CgoKZGVmIGZpbmRlcihwYWNrYWdlKToKICAgICIiIgogICAgUmV0dXJuIGEgcmVzb3VyY2UgZmluZGVyIGZvciBhIHBhY2thZ2UuCiAgICA6cGFyYW0gcGFja2FnZTogVGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UuCiAgICA6cmV0dXJuOiBBIDpjbGFzczpgUmVzb3VyY2VGaW5kZXJgIGluc3RhbmNlIGZvciB0aGUgcGFja2FnZS4KICAgICIiIgogICAgaWYgcGFja2FnZSBpbiBfZmluZGVyX2NhY2hlOgogICAgICAgIHJlc3VsdCA9IF9maW5kZXJfY2FjaGVbcGFja2FnZV0KICAgIGVsc2U6CiAgICAgICAgaWYgcGFja2FnZSBub3QgaW4gc3lzLm1vZHVsZXM6CiAgICAgICAgICAgIF9faW1wb3J0X18ocGFja2FnZSkKICAgICAgICBtb2R1bGUgPSBzeXMubW9kdWxlc1twYWNrYWdlXQogICAgICAgIHBhdGggPSBnZXRhdHRyKG1vZHVsZSwgJ19fcGF0aF9fJywgTm9uZSkKICAgICAgICBpZiBwYXRoIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ1lvdSBjYW5ub3QgZ2V0IGEgZmluZGVyIGZvciBhIG1vZHVsZSwgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvbmx5IGZvciBhIHBhY2thZ2UnKQogICAgICAgIGxvYWRlciA9IGdldGF0dHIobW9kdWxlLCAnX19sb2FkZXJfXycsIE5vbmUpCiAgICAgICAgZmluZGVyX21ha2VyID0gX2ZpbmRlcl9yZWdpc3RyeS5nZXQodHlwZShsb2FkZXIpKQogICAgICAgIGlmIGZpbmRlcl9tYWtlciBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdVbmFibGUgdG8gbG9jYXRlIGZpbmRlciBmb3IgJXInICUgcGFja2FnZSkKICAgICAgICByZXN1bHQgPSBmaW5kZXJfbWFrZXIobW9kdWxlKQogICAgICAgIF9maW5kZXJfY2FjaGVbcGFja2FnZV0gPSByZXN1bHQKICAgIHJldHVybiByZXN1bHQKCgpfZHVtbXlfbW9kdWxlID0gdHlwZXMuTW9kdWxlVHlwZShzdHIoJ19fZHVtbXlfXycpKQoKCmRlZiBmaW5kZXJfZm9yX3BhdGgocGF0aCk6CiAgICAiIiIKICAgIFJldHVybiBhIHJlc291cmNlIGZpbmRlciBmb3IgYSBwYXRoLCB3aGljaCBzaG91bGQgcmVwcmVzZW50IGEgY29udGFpbmVyLgoKICAgIDpwYXJhbSBwYXRoOiBUaGUgcGF0aC4KICAgIDpyZXR1cm46IEEgOmNsYXNzOmBSZXNvdXJjZUZpbmRlcmAgaW5zdGFuY2UgZm9yIHRoZSBwYXRoLgogICAgIiIiCiAgICByZXN1bHQgPSBOb25lCiAgICAjIGNhbGxzIGFueSBwYXRoIGhvb2tzLCBnZXRzIGltcG9ydGVyIGludG8gY2FjaGUKICAgIHBrZ3V0aWwuZ2V0X2ltcG9ydGVyKHBhdGgpCiAgICBsb2FkZXIgPSBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZS5nZXQocGF0aCkKICAgIGZpbmRlciA9IF9maW5kZXJfcmVnaXN0cnkuZ2V0KHR5cGUobG9hZGVyKSkKICAgIGlmIGZpbmRlcjoKICAgICAgICBtb2R1bGUgPSBfZHVtbXlfbW9kdWxlCiAgICAgICAgbW9kdWxlLl9fZmlsZV9fID0gb3MucGF0aC5qb2luKHBhdGgsICcnKQogICAgICAgIG1vZHVsZS5fX2xvYWRlcl9fID0gbG9hZGVyCiAgICAgICAgcmVzdWx0ID0gZmluZGVyKG1vZHVsZSkKICAgIHJldHVybiByZXN1bHQKUEsDBBQAAAAAAAAAIQC6/+vbeDsAAHg7AAAuAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvc2NyaXB0cy5weSMgLSotIGNvZGluZzogdXRmLTggLSotCiMKIyBDb3B5cmlnaHQgKEMpIDIwMTMtMjAxNSBWaW5heSBTYWppcC4KIyBMaWNlbnNlZCB0byB0aGUgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24gdW5kZXIgYSBjb250cmlidXRvciBhZ3JlZW1lbnQuCiMgU2VlIExJQ0VOU0UudHh0IGFuZCBDT05UUklCVVRPUlMudHh0LgojCmZyb20gaW8gaW1wb3J0IEJ5dGVzSU8KaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG9zCmltcG9ydCByZQppbXBvcnQgc3RydWN0CmltcG9ydCBzeXMKCmZyb20gLmNvbXBhdCBpbXBvcnQgc3lzY29uZmlnLCBkZXRlY3RfZW5jb2RpbmcsIFppcEZpbGUKZnJvbSAucmVzb3VyY2VzIGltcG9ydCBmaW5kZXIKZnJvbSAudXRpbCBpbXBvcnQgKEZpbGVPcGVyYXRvciwgZ2V0X2V4cG9ydF9lbnRyeSwgY29udmVydF9wYXRoLAogICAgICAgICAgICAgICAgICAgZ2V0X2V4ZWN1dGFibGUsIGluX3ZlbnYpCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCl9ERUZBVUxUX01BTklGRVNUID0gJycnCjw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KPGFzc2VtYmx5IHhtbG5zPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOmFzbS52MSIgbWFuaWZlc3RWZXJzaW9uPSIxLjAiPgogPGFzc2VtYmx5SWRlbnRpdHkgdmVyc2lvbj0iMS4wLjAuMCIKIHByb2Nlc3NvckFyY2hpdGVjdHVyZT0iWDg2IgogbmFtZT0iJXMiCiB0eXBlPSJ3aW4zMiIvPgoKIDwhLS0gSWRlbnRpZnkgdGhlIGFwcGxpY2F0aW9uIHNlY3VyaXR5IHJlcXVpcmVtZW50cy4gLS0+CiA8dHJ1c3RJbmZvIHhtbG5zPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOmFzbS52MyI+CiA8c2VjdXJpdHk+CiA8cmVxdWVzdGVkUHJpdmlsZWdlcz4KIDxyZXF1ZXN0ZWRFeGVjdXRpb25MZXZlbCBsZXZlbD0iYXNJbnZva2VyIiB1aUFjY2Vzcz0iZmFsc2UiLz4KIDwvcmVxdWVzdGVkUHJpdmlsZWdlcz4KIDwvc2VjdXJpdHk+CiA8L3RydXN0SW5mbz4KPC9hc3NlbWJseT4nJycuc3RyaXAoKQoKIyBjaGVjayBpZiBQeXRob24gaXMgY2FsbGVkIG9uIHRoZSBmaXJzdCBsaW5lIHdpdGggdGhpcyBleHByZXNzaW9uCkZJUlNUX0xJTkVfUkUgPSByZS5jb21waWxlKGInXiMhLipweXRob253P1swLTkuXSooWyBcdF0uKik/JCcpClNDUklQVF9URU1QTEFURSA9ICcnJyMgLSotIGNvZGluZzogdXRmLTggLSotCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICBpbXBvcnQgc3lzLCByZQoKICAgIGRlZiBfcmVzb2x2ZShtb2R1bGUsIGZ1bmMpOgogICAgICAgIF9faW1wb3J0X18obW9kdWxlKQogICAgICAgIG1vZCA9IHN5cy5tb2R1bGVzW21vZHVsZV0KICAgICAgICBwYXJ0cyA9IGZ1bmMuc3BsaXQoJy4nKQogICAgICAgIHJlc3VsdCA9IGdldGF0dHIobW9kLCBwYXJ0cy5wb3AoMCkpCiAgICAgICAgZm9yIHAgaW4gcGFydHM6CiAgICAgICAgICAgIHJlc3VsdCA9IGdldGF0dHIocmVzdWx0LCBwKQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICB0cnk6CiAgICAgICAgc3lzLmFyZ3ZbMF0gPSByZS5zdWIocicoLXNjcmlwdFwucHl3P3xcLmV4ZSk/JCcsICcnLCBzeXMuYXJndlswXSkKCiAgICAgICAgZnVuYyA9IF9yZXNvbHZlKCclKG1vZHVsZSlzJywgJyUoZnVuYylzJykKICAgICAgICByYyA9IGZ1bmMoKSAjIE5vbmUgaW50ZXJwcmV0ZWQgYXMgMAogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOiAgIyBvbmx5IHN1cHBvcnRpbmcgUHl0aG9uID49IDIuNgogICAgICAgIHN5cy5zdGRlcnIud3JpdGUoJyUlc1xcbicgJSUgZSkKICAgICAgICByYyA9IDEKICAgIHN5cy5leGl0KHJjKQonJycKCgpkZWYgX2VucXVvdGVfZXhlY3V0YWJsZShleGVjdXRhYmxlKToKICAgIGlmICcgJyBpbiBleGVjdXRhYmxlOgogICAgICAgICMgbWFrZSBzdXJlIHdlIHF1b3RlIG9ubHkgdGhlIGV4ZWN1dGFibGUgaW4gY2FzZSBvZiBlbnYKICAgICAgICAjIGZvciBleGFtcGxlIC91c3IvYmluL2VudiAiL2RpciB3aXRoIHNwYWNlcy9iaW4vanl0aG9uIgogICAgICAgICMgaW5zdGVhZCBvZiAiL3Vzci9iaW4vZW52IC9kaXIgd2l0aCBzcGFjZXMvYmluL2p5dGhvbiIKICAgICAgICAjIG90aGVyd2lzZSB3aG9sZQogICAgICAgIGlmIGV4ZWN1dGFibGUuc3RhcnRzd2l0aCgnL3Vzci9iaW4vZW52ICcpOgogICAgICAgICAgICBlbnYsIF9leGVjdXRhYmxlID0gZXhlY3V0YWJsZS5zcGxpdCgnICcsIDEpCiAgICAgICAgICAgIGlmICcgJyBpbiBfZXhlY3V0YWJsZSBhbmQgbm90IF9leGVjdXRhYmxlLnN0YXJ0c3dpdGgoJyInKToKICAgICAgICAgICAgICAgIGV4ZWN1dGFibGUgPSAnJXMgIiVzIicgJSAoZW52LCBfZXhlY3V0YWJsZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBub3QgZXhlY3V0YWJsZS5zdGFydHN3aXRoKCciJyk6CiAgICAgICAgICAgICAgICBleGVjdXRhYmxlID0gJyIlcyInICUgZXhlY3V0YWJsZQogICAgcmV0dXJuIGV4ZWN1dGFibGUKCgpjbGFzcyBTY3JpcHRNYWtlcihvYmplY3QpOgogICAgIiIiCiAgICBBIGNsYXNzIHRvIGNvcHkgb3IgY3JlYXRlIHNjcmlwdHMgZnJvbSBzb3VyY2Ugc2NyaXB0cyBvciBjYWxsYWJsZQogICAgc3BlY2lmaWNhdGlvbnMuCiAgICAiIiIKICAgIHNjcmlwdF90ZW1wbGF0ZSA9IFNDUklQVF9URU1QTEFURQoKICAgIGV4ZWN1dGFibGUgPSBOb25lICAjIGZvciBzaGViYW5ncwoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzb3VyY2VfZGlyLCB0YXJnZXRfZGlyLCBhZGRfbGF1bmNoZXJzPVRydWUsCiAgICAgICAgICAgICAgICAgZHJ5X3J1bj1GYWxzZSwgZmlsZW9wPU5vbmUpOgogICAgICAgIHNlbGYuc291cmNlX2RpciA9IHNvdXJjZV9kaXIKICAgICAgICBzZWxmLnRhcmdldF9kaXIgPSB0YXJnZXRfZGlyCiAgICAgICAgc2VsZi5hZGRfbGF1bmNoZXJzID0gYWRkX2xhdW5jaGVycwogICAgICAgIHNlbGYuZm9yY2UgPSBGYWxzZQogICAgICAgIHNlbGYuY2xvYmJlciA9IEZhbHNlCiAgICAgICAgIyBJdCBvbmx5IG1ha2VzIHNlbnNlIHRvIHNldCBtb2RlIGJpdHMgb24gUE9TSVguCiAgICAgICAgc2VsZi5zZXRfbW9kZSA9IChvcy5uYW1lID09ICdwb3NpeCcpIG9yIChvcy5uYW1lID09ICdqYXZhJyBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLl9uYW1lID09ICdwb3NpeCcpCiAgICAgICAgc2VsZi52YXJpYW50cyA9IHNldCgoJycsICdYLlknKSkKICAgICAgICBzZWxmLl9maWxlb3AgPSBmaWxlb3Agb3IgRmlsZU9wZXJhdG9yKGRyeV9ydW4pCgogICAgICAgIHNlbGYuX2lzX250ID0gb3MubmFtZSA9PSAnbnQnIG9yICgKICAgICAgICAgICAgb3MubmFtZSA9PSAnamF2YScgYW5kIG9zLl9uYW1lID09ICdudCcpCgogICAgZGVmIF9nZXRfYWx0ZXJuYXRlX2V4ZWN1dGFibGUoc2VsZiwgZXhlY3V0YWJsZSwgb3B0aW9ucyk6CiAgICAgICAgaWYgb3B0aW9ucy5nZXQoJ2d1aScsIEZhbHNlKSBhbmQgc2VsZi5faXNfbnQ6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAgICAgZG4sIGZuID0gb3MucGF0aC5zcGxpdChleGVjdXRhYmxlKQogICAgICAgICAgICBmbiA9IGZuLnJlcGxhY2UoJ3B5dGhvbicsICdweXRob253JykKICAgICAgICAgICAgZXhlY3V0YWJsZSA9IG9zLnBhdGguam9pbihkbiwgZm4pCiAgICAgICAgcmV0dXJuIGV4ZWN1dGFibGUKCiAgICBpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnamF2YScpOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgZGVmIF9pc19zaGVsbChzZWxmLCBleGVjdXRhYmxlKToKICAgICAgICAgICAgIiIiCiAgICAgICAgICAgIERldGVybWluZSBpZiB0aGUgc3BlY2lmaWVkIGV4ZWN1dGFibGUgaXMgYSBzY3JpcHQKICAgICAgICAgICAgKGNvbnRhaW5zIGEgIyEgbGluZSkKICAgICAgICAgICAgIiIiCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHdpdGggb3BlbihleGVjdXRhYmxlKSBhcyBmcDoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnAucmVhZCgyKSA9PSAnIyEnCiAgICAgICAgICAgIGV4Y2VwdCAoT1NFcnJvciwgSU9FcnJvcik6CiAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygnRmFpbGVkIHRvIG9wZW4gJXMnLCBleGVjdXRhYmxlKQogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIGRlZiBfZml4X2p5dGhvbl9leGVjdXRhYmxlKHNlbGYsIGV4ZWN1dGFibGUpOgogICAgICAgICAgICBpZiBzZWxmLl9pc19zaGVsbChleGVjdXRhYmxlKToKICAgICAgICAgICAgICAgICMgV29ya2Fyb3VuZCBmb3IgSnl0aG9uIGlzIG5vdCBuZWVkZWQgb24gTGludXggc3lzdGVtcy4KICAgICAgICAgICAgICAgIGltcG9ydCBqYXZhCgogICAgICAgICAgICAgICAgaWYgamF2YS5sYW5nLlN5c3RlbS5nZXRQcm9wZXJ0eSgnb3MubmFtZScpID09ICdMaW51eCc6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4ZWN1dGFibGUKICAgICAgICAgICAgZWxpZiBleGVjdXRhYmxlLmxvd2VyKCkuZW5kc3dpdGgoJ2p5dGhvbi5leGUnKToKICAgICAgICAgICAgICAgICMgVXNlIHdyYXBwZXIgZXhlIGZvciBKeXRob24gb24gV2luZG93cwogICAgICAgICAgICAgICAgcmV0dXJuIGV4ZWN1dGFibGUKICAgICAgICAgICAgcmV0dXJuICcvdXNyL2Jpbi9lbnYgJXMnICUgZXhlY3V0YWJsZQoKICAgIGRlZiBfZ2V0X3NoZWJhbmcoc2VsZiwgZW5jb2RpbmcsIHBvc3RfaW50ZXJwPWInJywgb3B0aW9ucz1Ob25lKToKICAgICAgICBlbnF1b3RlID0gVHJ1ZQogICAgICAgIGlmIHNlbGYuZXhlY3V0YWJsZToKICAgICAgICAgICAgZXhlY3V0YWJsZSA9IHNlbGYuZXhlY3V0YWJsZQogICAgICAgICAgICBlbnF1b3RlID0gRmFsc2UgICAgICMgYXNzdW1lIHRoaXMgd2lsbCBiZSB0YWtlbiBjYXJlIG9mCiAgICAgICAgZWxpZiBub3Qgc3lzY29uZmlnLmlzX3B5dGhvbl9idWlsZCgpOgogICAgICAgICAgICBleGVjdXRhYmxlID0gZ2V0X2V4ZWN1dGFibGUoKQogICAgICAgIGVsaWYgaW5fdmVudigpOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgICAgIGV4ZWN1dGFibGUgPSBvcy5wYXRoLmpvaW4oc3lzY29uZmlnLmdldF9wYXRoKCdzY3JpcHRzJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHl0aG9uJXMnICUgc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdFWEUnKSkKICAgICAgICBlbHNlOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgICAgIGV4ZWN1dGFibGUgPSBvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgICAgICBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ0JJTkRJUicpLAogICAgICAgICAgICAgICAncHl0aG9uJXMlcycgJSAoc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdWRVJTSU9OJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ0VYRScpKSkKICAgICAgICBpZiBvcHRpb25zOgogICAgICAgICAgICBleGVjdXRhYmxlID0gc2VsZi5fZ2V0X2FsdGVybmF0ZV9leGVjdXRhYmxlKGV4ZWN1dGFibGUsIG9wdGlvbnMpCgogICAgICAgIGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdqYXZhJyk6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAgICAgZXhlY3V0YWJsZSA9IHNlbGYuX2ZpeF9qeXRob25fZXhlY3V0YWJsZShleGVjdXRhYmxlKQogICAgICAgICMgTm9ybWFsaXNlIGNhc2UgZm9yIFdpbmRvd3MKICAgICAgICBleGVjdXRhYmxlID0gb3MucGF0aC5ub3JtY2FzZShleGVjdXRhYmxlKQogICAgICAgICMgSWYgdGhlIHVzZXIgZGlkbid0IHNwZWNpZnkgYW4gZXhlY3V0YWJsZSwgaXQgbWF5IGJlIG5lY2Vzc2FyeSB0bwogICAgICAgICMgY2F0ZXIgZm9yIGV4ZWN1dGFibGUgcGF0aHMgd2l0aCBzcGFjZXMgKG5vdCB1bmNvbW1vbiBvbiBXaW5kb3dzKQogICAgICAgIGlmIGVucXVvdGU6CiAgICAgICAgICAgIGV4ZWN1dGFibGUgPSBfZW5xdW90ZV9leGVjdXRhYmxlKGV4ZWN1dGFibGUpCiAgICAgICAgIyBJc3N1ZSAjNTE6IGRvbid0IHVzZSBmc2VuY29kZSwgc2luY2Ugd2UgbGF0ZXIgdHJ5IHRvCiAgICAgICAgIyBjaGVjayB0aGF0IHRoZSBzaGViYW5nIGlzIGRlY29kYWJsZSB1c2luZyB1dGYtOC4KICAgICAgICBleGVjdXRhYmxlID0gZXhlY3V0YWJsZS5lbmNvZGUoJ3V0Zi04JykKICAgICAgICAjIGluIGNhc2Ugb2YgSXJvblB5dGhvbiwgcGxheSBzYWZlIGFuZCBlbmFibGUgZnJhbWVzIHN1cHBvcnQKICAgICAgICBpZiAoc3lzLnBsYXRmb3JtID09ICdjbGknIGFuZCAnLVg6RnJhbWVzJyBub3QgaW4gcG9zdF9pbnRlcnAKICAgICAgICAgICAgYW5kICctWDpGdWxsRnJhbWVzJyBub3QgaW4gcG9zdF9pbnRlcnApOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgICAgIHBvc3RfaW50ZXJwICs9IGInIC1YOkZyYW1lcycKICAgICAgICBzaGViYW5nID0gYicjIScgKyBleGVjdXRhYmxlICsgcG9zdF9pbnRlcnAgKyBiJ1xuJwogICAgICAgICMgUHl0aG9uIHBhcnNlciBzdGFydHMgdG8gcmVhZCBhIHNjcmlwdCB1c2luZyBVVEYtOCB1bnRpbAogICAgICAgICMgaXQgZ2V0cyBhICNjb2Rpbmc6eHh4IGNvb2tpZS4gVGhlIHNoZWJhbmcgaGFzIHRvIGJlIHRoZQogICAgICAgICMgZmlyc3QgbGluZSBvZiBhIGZpbGUsIHRoZSAjY29kaW5nOnh4eCBjb29raWUgY2Fubm90IGJlCiAgICAgICAgIyB3cml0dGVuIGJlZm9yZS4gU28gdGhlIHNoZWJhbmcgaGFzIHRvIGJlIGRlY29kYWJsZSBmcm9tCiAgICAgICAgIyBVVEYtOC4KICAgICAgICB0cnk6CiAgICAgICAgICAgIHNoZWJhbmcuZGVjb2RlKCd1dGYtOCcpCiAgICAgICAgZXhjZXB0IFVuaWNvZGVEZWNvZGVFcnJvcjogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICAgICAgICAgJ1RoZSBzaGViYW5nICglcikgaXMgbm90IGRlY29kYWJsZSBmcm9tIHV0Zi04JyAlIHNoZWJhbmcpCiAgICAgICAgIyBJZiB0aGUgc2NyaXB0IGlzIGVuY29kZWQgdG8gYSBjdXN0b20gZW5jb2RpbmcgKHVzZSBhCiAgICAgICAgIyAjY29kaW5nOnh4eCBjb29raWUpLCB0aGUgc2hlYmFuZyBoYXMgdG8gYmUgZGVjb2RhYmxlIGZyb20KICAgICAgICAjIHRoZSBzY3JpcHQgZW5jb2RpbmcgdG9vLgogICAgICAgIGlmIGVuY29kaW5nICE9ICd1dGYtOCc6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHNoZWJhbmcuZGVjb2RlKGVuY29kaW5nKQogICAgICAgICAgICBleGNlcHQgVW5pY29kZURlY29kZUVycm9yOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICAgICAgICAgICAgICdUaGUgc2hlYmFuZyAoJXIpIGlzIG5vdCBkZWNvZGFibGUgJwogICAgICAgICAgICAgICAgICAgICdmcm9tIHRoZSBzY3JpcHQgZW5jb2RpbmcgKCVyKScgJSAoc2hlYmFuZywgZW5jb2RpbmcpKQogICAgICAgIHJldHVybiBzaGViYW5nCgogICAgZGVmIF9nZXRfc2NyaXB0X3RleHQoc2VsZiwgZW50cnkpOgogICAgICAgIHJldHVybiBzZWxmLnNjcmlwdF90ZW1wbGF0ZSAlIGRpY3QobW9kdWxlPWVudHJ5LnByZWZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmM9ZW50cnkuc3VmZml4KQoKICAgIG1hbmlmZXN0ID0gX0RFRkFVTFRfTUFOSUZFU1QKCiAgICBkZWYgZ2V0X21hbmlmZXN0KHNlbGYsIGV4ZW5hbWUpOgogICAgICAgIGJhc2UgPSBvcy5wYXRoLmJhc2VuYW1lKGV4ZW5hbWUpCiAgICAgICAgcmV0dXJuIHNlbGYubWFuaWZlc3QgJSBiYXNlCgogICAgZGVmIF93cml0ZV9zY3JpcHQoc2VsZiwgbmFtZXMsIHNoZWJhbmcsIHNjcmlwdF9ieXRlcywgZmlsZW5hbWVzLCBleHQpOgogICAgICAgIHVzZV9sYXVuY2hlciA9IHNlbGYuYWRkX2xhdW5jaGVycyBhbmQgc2VsZi5faXNfbnQKICAgICAgICBsaW5lc2VwID0gb3MubGluZXNlcC5lbmNvZGUoJ3V0Zi04JykKICAgICAgICBpZiBub3QgdXNlX2xhdW5jaGVyOgogICAgICAgICAgICBzY3JpcHRfYnl0ZXMgPSBzaGViYW5nICsgbGluZXNlcCArIHNjcmlwdF9ieXRlcwogICAgICAgIGVsc2U6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAgICAgaWYgZXh0ID09ICdweSc6CiAgICAgICAgICAgICAgICBsYXVuY2hlciA9IHNlbGYuX2dldF9sYXVuY2hlcigndCcpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBsYXVuY2hlciA9IHNlbGYuX2dldF9sYXVuY2hlcigndycpCiAgICAgICAgICAgIHN0cmVhbSA9IEJ5dGVzSU8oKQogICAgICAgICAgICB3aXRoIFppcEZpbGUoc3RyZWFtLCAndycpIGFzIHpmOgogICAgICAgICAgICAgICAgemYud3JpdGVzdHIoJ19fbWFpbl9fLnB5Jywgc2NyaXB0X2J5dGVzKQogICAgICAgICAgICB6aXBfZGF0YSA9IHN0cmVhbS5nZXR2YWx1ZSgpCiAgICAgICAgICAgIHNjcmlwdF9ieXRlcyA9IGxhdW5jaGVyICsgc2hlYmFuZyArIGxpbmVzZXAgKyB6aXBfZGF0YQogICAgICAgIGZvciBuYW1lIGluIG5hbWVzOgogICAgICAgICAgICBvdXRuYW1lID0gb3MucGF0aC5qb2luKHNlbGYudGFyZ2V0X2RpciwgbmFtZSkKICAgICAgICAgICAgaWYgdXNlX2xhdW5jaGVyOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgICAgICAgICBuLCBlID0gb3MucGF0aC5zcGxpdGV4dChvdXRuYW1lKQogICAgICAgICAgICAgICAgaWYgZS5zdGFydHN3aXRoKCcucHknKToKICAgICAgICAgICAgICAgICAgICBvdXRuYW1lID0gbgogICAgICAgICAgICAgICAgb3V0bmFtZSA9ICclcy5leGUnICUgb3V0bmFtZQogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGVvcC53cml0ZV9iaW5hcnlfZmlsZShvdXRuYW1lLCBzY3JpcHRfYnl0ZXMpCiAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgICAgICMgRmFpbGVkIHdyaXRpbmcgYW4gZXhlY3V0YWJsZSAtIGl0IG1pZ2h0IGJlIGluIHVzZS4KICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygnRmFpbGVkIHRvIHdyaXRlIGV4ZWN1dGFibGUgLSB0cnlpbmcgdG8gJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2UgLmRlbGV0ZW1lIGxvZ2ljJykKICAgICAgICAgICAgICAgICAgICBkZm5hbWUgPSAnJXMuZGVsZXRlbWUnICUgb3V0bmFtZQogICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGRmbmFtZSk6CiAgICAgICAgICAgICAgICAgICAgICAgIG9zLnJlbW92ZShkZm5hbWUpICAgICAgICMgTm90IGFsbG93ZWQgdG8gZmFpbCBoZXJlCiAgICAgICAgICAgICAgICAgICAgb3MucmVuYW1lKG91dG5hbWUsIGRmbmFtZSkgICMgbm9yIGhlcmUKICAgICAgICAgICAgICAgICAgICBzZWxmLl9maWxlb3Aud3JpdGVfYmluYXJ5X2ZpbGUob3V0bmFtZSwgc2NyaXB0X2J5dGVzKQogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnQWJsZSB0byByZXBsYWNlIGV4ZWN1dGFibGUgdXNpbmcgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLmRlbGV0ZW1lIGxvZ2ljJykKICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgIG9zLnJlbW92ZShkZm5hbWUpCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgICAgICAgICAgcGFzcyAgICAjIHN0aWxsIGluIHVzZSAtIGlnbm9yZSBlcnJvcgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaWYgc2VsZi5faXNfbnQgYW5kIG5vdCBvdXRuYW1lLmVuZHN3aXRoKCcuJyArIGV4dCk6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAgICAgICAgICAgICBvdXRuYW1lID0gJyVzLiVzJyAlIChvdXRuYW1lLCBleHQpCiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhvdXRuYW1lKSBhbmQgbm90IHNlbGYuY2xvYmJlcjoKICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygnU2tpcHBpbmcgZXhpc3RpbmcgZmlsZSAlcycsIG91dG5hbWUpCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGVvcC53cml0ZV9iaW5hcnlfZmlsZShvdXRuYW1lLCBzY3JpcHRfYnl0ZXMpCiAgICAgICAgICAgICAgICBpZiBzZWxmLnNldF9tb2RlOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGVvcC5zZXRfZXhlY3V0YWJsZV9tb2RlKFtvdXRuYW1lXSkKICAgICAgICAgICAgZmlsZW5hbWVzLmFwcGVuZChvdXRuYW1lKQoKICAgIGRlZiBfbWFrZV9zY3JpcHQoc2VsZiwgZW50cnksIGZpbGVuYW1lcywgb3B0aW9ucz1Ob25lKToKICAgICAgICBwb3N0X2ludGVycCA9IGInJwogICAgICAgIGlmIG9wdGlvbnM6CiAgICAgICAgICAgIGFyZ3MgPSBvcHRpb25zLmdldCgnaW50ZXJwcmV0ZXJfYXJncycsIFtdKQogICAgICAgICAgICBpZiBhcmdzOgogICAgICAgICAgICAgICAgYXJncyA9ICcgJXMnICUgJyAnLmpvaW4oYXJncykKICAgICAgICAgICAgICAgIHBvc3RfaW50ZXJwID0gYXJncy5lbmNvZGUoJ3V0Zi04JykKICAgICAgICBzaGViYW5nID0gc2VsZi5fZ2V0X3NoZWJhbmcoJ3V0Zi04JywgcG9zdF9pbnRlcnAsIG9wdGlvbnM9b3B0aW9ucykKICAgICAgICBzY3JpcHQgPSBzZWxmLl9nZXRfc2NyaXB0X3RleHQoZW50cnkpLmVuY29kZSgndXRmLTgnKQogICAgICAgIG5hbWUgPSBlbnRyeS5uYW1lCiAgICAgICAgc2NyaXB0bmFtZXMgPSBzZXQoKQogICAgICAgIGlmICcnIGluIHNlbGYudmFyaWFudHM6CiAgICAgICAgICAgIHNjcmlwdG5hbWVzLmFkZChuYW1lKQogICAgICAgIGlmICdYJyBpbiBzZWxmLnZhcmlhbnRzOgogICAgICAgICAgICBzY3JpcHRuYW1lcy5hZGQoJyVzJXMnICUgKG5hbWUsIHN5cy52ZXJzaW9uWzBdKSkKICAgICAgICBpZiAnWC5ZJyBpbiBzZWxmLnZhcmlhbnRzOgogICAgICAgICAgICBzY3JpcHRuYW1lcy5hZGQoJyVzLSVzJyAlIChuYW1lLCBzeXMudmVyc2lvbls6M10pKQogICAgICAgIGlmIG9wdGlvbnMgYW5kIG9wdGlvbnMuZ2V0KCdndWknLCBGYWxzZSk6CiAgICAgICAgICAgIGV4dCA9ICdweXcnCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZXh0ID0gJ3B5JwogICAgICAgIHNlbGYuX3dyaXRlX3NjcmlwdChzY3JpcHRuYW1lcywgc2hlYmFuZywgc2NyaXB0LCBmaWxlbmFtZXMsIGV4dCkKCiAgICBkZWYgX2NvcHlfc2NyaXB0KHNlbGYsIHNjcmlwdCwgZmlsZW5hbWVzKToKICAgICAgICBhZGp1c3QgPSBGYWxzZQogICAgICAgIHNjcmlwdCA9IG9zLnBhdGguam9pbihzZWxmLnNvdXJjZV9kaXIsIGNvbnZlcnRfcGF0aChzY3JpcHQpKQogICAgICAgIG91dG5hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi50YXJnZXRfZGlyLCBvcy5wYXRoLmJhc2VuYW1lKHNjcmlwdCkpCiAgICAgICAgaWYgbm90IHNlbGYuZm9yY2UgYW5kIG5vdCBzZWxmLl9maWxlb3AubmV3ZXIoc2NyaXB0LCBvdXRuYW1lKToKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdub3QgY29weWluZyAlcyAodXAtdG8tZGF0ZSknLCBzY3JpcHQpCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIEFsd2F5cyBvcGVuIHRoZSBmaWxlLCBidXQgaWdub3JlIGZhaWx1cmVzIGluIGRyeS1ydW4gbW9kZSAtLQogICAgICAgICMgdGhhdCB3YXksIHdlJ2xsIGdldCBhY2N1cmF0ZSBmZWVkYmFjayBpZiB3ZSBjYW4gcmVhZCB0aGUKICAgICAgICAjIHNjcmlwdC4KICAgICAgICB0cnk6CiAgICAgICAgICAgIGYgPSBvcGVuKHNjcmlwdCwgJ3JiJykKICAgICAgICBleGNlcHQgSU9FcnJvcjogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgZiA9IE5vbmUKICAgICAgICBlbHNlOgogICAgICAgICAgICBmaXJzdF9saW5lID0gZi5yZWFkbGluZSgpCiAgICAgICAgICAgIGlmIG5vdCBmaXJzdF9saW5lOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygnJXM6ICVzIGlzIGFuIGVtcHR5IGZpbGUgKHNraXBwaW5nKScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdldF9jb21tYW5kX25hbWUoKSwgIHNjcmlwdCkKICAgICAgICAgICAgICAgIHJldHVybgoKICAgICAgICAgICAgbWF0Y2ggPSBGSVJTVF9MSU5FX1JFLm1hdGNoKGZpcnN0X2xpbmUucmVwbGFjZShiJ1xyXG4nLCBiJ1xuJykpCiAgICAgICAgICAgIGlmIG1hdGNoOgogICAgICAgICAgICAgICAgYWRqdXN0ID0gVHJ1ZQogICAgICAgICAgICAgICAgcG9zdF9pbnRlcnAgPSBtYXRjaC5ncm91cCgxKSBvciBiJycKCiAgICAgICAgaWYgbm90IGFkanVzdDoKICAgICAgICAgICAgaWYgZjoKICAgICAgICAgICAgICAgIGYuY2xvc2UoKQogICAgICAgICAgICBzZWxmLl9maWxlb3AuY29weV9maWxlKHNjcmlwdCwgb3V0bmFtZSkKICAgICAgICAgICAgaWYgc2VsZi5zZXRfbW9kZToKICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGVvcC5zZXRfZXhlY3V0YWJsZV9tb2RlKFtvdXRuYW1lXSkKICAgICAgICAgICAgZmlsZW5hbWVzLmFwcGVuZChvdXRuYW1lKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdjb3B5aW5nIGFuZCBhZGp1c3RpbmcgJXMgLT4gJXMnLCBzY3JpcHQsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudGFyZ2V0X2RpcikKICAgICAgICAgICAgaWYgbm90IHNlbGYuX2ZpbGVvcC5kcnlfcnVuOgogICAgICAgICAgICAgICAgZW5jb2RpbmcsIGxpbmVzID0gZGV0ZWN0X2VuY29kaW5nKGYucmVhZGxpbmUpCiAgICAgICAgICAgICAgICBmLnNlZWsoMCkKICAgICAgICAgICAgICAgIHNoZWJhbmcgPSBzZWxmLl9nZXRfc2hlYmFuZyhlbmNvZGluZywgcG9zdF9pbnRlcnApCiAgICAgICAgICAgICAgICBpZiBiJ3B5dGhvbncnIGluIGZpcnN0X2xpbmU6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAgICAgICAgICAgICBleHQgPSAncHl3JwogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBleHQgPSAncHknCiAgICAgICAgICAgICAgICBuID0gb3MucGF0aC5iYXNlbmFtZShvdXRuYW1lKQogICAgICAgICAgICAgICAgc2VsZi5fd3JpdGVfc2NyaXB0KFtuXSwgc2hlYmFuZywgZi5yZWFkKCksIGZpbGVuYW1lcywgZXh0KQogICAgICAgICAgICBpZiBmOgogICAgICAgICAgICAgICAgZi5jbG9zZSgpCgogICAgQHByb3BlcnR5CiAgICBkZWYgZHJ5X3J1bihzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fZmlsZW9wLmRyeV9ydW4KCiAgICBAZHJ5X3J1bi5zZXR0ZXIKICAgIGRlZiBkcnlfcnVuKHNlbGYsIHZhbHVlKToKICAgICAgICBzZWxmLl9maWxlb3AuZHJ5X3J1biA9IHZhbHVlCgogICAgaWYgb3MubmFtZSA9PSAnbnQnIG9yIChvcy5uYW1lID09ICdqYXZhJyBhbmQgb3MuX25hbWUgPT0gJ250Jyk6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAjIEV4ZWN1dGFibGUgbGF1bmNoZXIgc3VwcG9ydC4KICAgICAgICAjIExhdW5jaGVycyBhcmUgZnJvbSBodHRwczovL2JpdGJ1Y2tldC5vcmcvdmluYXkuc2FqaXAvc2ltcGxlX2xhdW5jaGVyLwoKICAgICAgICBkZWYgX2dldF9sYXVuY2hlcihzZWxmLCBraW5kKToKICAgICAgICAgICAgaWYgc3RydWN0LmNhbGNzaXplKCdQJykgPT0gODogICAjIDY0LWJpdAogICAgICAgICAgICAgICAgYml0cyA9ICc2NCcKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGJpdHMgPSAnMzInCiAgICAgICAgICAgIG5hbWUgPSAnJXMlcy5leGUnICUgKGtpbmQsIGJpdHMpCiAgICAgICAgICAgICMgSXNzdWUgMzE6IGRvbid0IGhhcmRjb2RlIGFuIGFic29sdXRlIHBhY2thZ2UgbmFtZSwgYnV0CiAgICAgICAgICAgICMgZGV0ZXJtaW5lIGl0IHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHBhY2thZ2UKICAgICAgICAgICAgZGlzdGxpYl9wYWNrYWdlID0gX19uYW1lX18ucnNwbGl0KCcuJywgMSlbMF0KICAgICAgICAgICAgcmVzdWx0ID0gZmluZGVyKGRpc3RsaWJfcGFja2FnZSkuZmluZChuYW1lKS5ieXRlcwogICAgICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgIyBQdWJsaWMgQVBJIGZvbGxvd3MKCiAgICBkZWYgbWFrZShzZWxmLCBzcGVjaWZpY2F0aW9uLCBvcHRpb25zPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIE1ha2UgYSBzY3JpcHQuCgogICAgICAgIDpwYXJhbSBzcGVjaWZpY2F0aW9uOiBUaGUgc3BlY2lmaWNhdGlvbiwgd2hpY2ggaXMgZWl0aGVyIGEgdmFsaWQgZXhwb3J0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5IHNwZWNpZmljYXRpb24gKHRvIG1ha2UgYSBzY3JpcHQgZnJvbSBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxhYmxlKSBvciBhIGZpbGVuYW1lICh0byBtYWtlIGEgc2NyaXB0IGJ5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlpbmcgZnJvbSBhIHNvdXJjZSBsb2NhdGlvbikuCiAgICAgICAgOnBhcmFtIG9wdGlvbnM6IEEgZGljdGlvbmFyeSBvZiBvcHRpb25zIGNvbnRyb2xsaW5nIHNjcmlwdCBnZW5lcmF0aW9uLgogICAgICAgIDpyZXR1cm46IEEgbGlzdCBvZiBhbGwgYWJzb2x1dGUgcGF0aG5hbWVzIHdyaXR0ZW4gdG8uCiAgICAgICAgIiIiCiAgICAgICAgZmlsZW5hbWVzID0gW10KICAgICAgICBlbnRyeSA9IGdldF9leHBvcnRfZW50cnkoc3BlY2lmaWNhdGlvbikKICAgICAgICBpZiBlbnRyeSBpcyBOb25lOgogICAgICAgICAgICBzZWxmLl9jb3B5X3NjcmlwdChzcGVjaWZpY2F0aW9uLCBmaWxlbmFtZXMpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5fbWFrZV9zY3JpcHQoZW50cnksIGZpbGVuYW1lcywgb3B0aW9ucz1vcHRpb25zKQogICAgICAgIHJldHVybiBmaWxlbmFtZXMKCiAgICBkZWYgbWFrZV9tdWx0aXBsZShzZWxmLCBzcGVjaWZpY2F0aW9ucywgb3B0aW9ucz1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBUYWtlIGEgbGlzdCBvZiBzcGVjaWZpY2F0aW9ucyBhbmQgbWFrZSBzY3JpcHRzIGZyb20gdGhlbSwKICAgICAgICA6cGFyYW0gc3BlY2lmaWNhdGlvbnM6IEEgbGlzdCBvZiBzcGVjaWZpY2F0aW9ucy4KICAgICAgICA6cmV0dXJuOiBBIGxpc3Qgb2YgYWxsIGFic29sdXRlIHBhdGhuYW1lcyB3cml0dGVuIHRvLAogICAgICAgICIiIgogICAgICAgIGZpbGVuYW1lcyA9IFtdCiAgICAgICAgZm9yIHNwZWNpZmljYXRpb24gaW4g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D77CD76A8NtAAIPgD+sCM8APvoTBENxAAGoHwfgEWYmFjP3//zvBD4cgCgAA/ySFtVhAAION6P3///+JtYj9//+Jtbz9//+Jtcj9//+Jtcz9//+JtfD9//+JtcT9///p6QkAAA++woPoIHRKg+gDdDaD6Ah0JUhIdBWD6AMPhcoJAACDjfD9//8I6b4JAACDjfD9//8E6bIJAACDjfD9//8B6aYJAACBjfD9//+AAAAA6ZcJAACDjfD9//8C6YsJAACA+ip1LIPHBIm95P3//4t//Im9yP3//zv+D41sCQAAg43w/f//BPedyP3//+laCQAAi4XI/f//a8AKD77KjUQI0ImFyP3//+k/CQAAibXo/f//6TQJAACA+ip1JoPHBIm95P3//4t//Im96P3//zv+D40VCQAAg43o/f///+kJCQAAi4Xo/f//a8AKD77KjUQI0ImF6P3//+nuCAAAgPpJdFWA+mh0RID6bHQYgPp3D4XWCAAAgY3w/f//AAgAAOnHCAAAgDtsdRZDgY3w/f//ABAAAImdwP3//+msCAAAg43w/f//EOmgCAAAg43w/f//IOmUCAAAigM8NnUegHsBNHUYg8MCgY3w/f//AIAAAImdwP3//+lwCAAAPDN1HoB7ATJ1GIPDAoGl8P3///9///+JncD9///pTggAADxkD4RGCAAAPGkPhD4IAAA8bw+ENggAADx1D4QuCAAAPHgPhCYIAAA8WA+EHggAAIm1jP3//yG1xP3//42FpP3//1APtsJQ6CZPAABZhcCKhe/9//9ZdCKLjdD9//+Ntdz9///oGPz//4oDQ4mdwP3//4TAD4Sw/P//i43Q/f//jbXc/f//6Pb7///pvgcAAA++woP4ZA+PtgEAAA+EWAIAAIP4Uw+PugAAAHRMg+hBdBBISHQkSEh0CEhID4WrBQAAgMIgx4WI/f//AQAAAIiV7/3//+lWAgAA94Xw/f//MAgAAA+FngAAAIGN8P3//wAIAADpjwAAAPeF8P3//zAIAAB1CoGN8P3//wAIAACLjej9//+D+f91Bbn///9/g8cE94Xw/f//EAgAAIm95P3//4t//Im94P3//w+E/gQAAIX/dQuhZAZBAImF4P3//4uF4P3//8eFxP3//wEAAADpzAQAAIPoWA+EIgMAAEhIdH8rwQ+EtgEAAEhID4XrBAAAi73k/f//g8cE94Xw/f//EAgAAIm95P3//3QwD7dH/FBoAAIAAI2F9P3//1CNhdj9//9Q6E1kAACDxBCFwHQfx4W8/f//AQAAAOsTikf8iIX0/f//x4XY/f//AQAAAI2F9P3//4mF4P3//+l8BAAAiweDxwSJveT9//+FwHQ7i0gEhcl0NPeF8P3//wAIAAAPvwCJjeD9//90FJkrwtH4x4XE/f//AQAAAOk3BAAAIbXE/f//6SwEAAChYAZBAImF4P3//1DoSyQAAFnpFQQAAIP4cA+PPQIAAA+EJQIAAIP4ZQ+MAwQAAIP4Zw+OtwAAAIP4aXR8g/hudC6D+G8PhecDAAD2hfD9//+Ai73k/f//x4XY/f//CAAAAHRsgY3w/f//AAIAAOtgg4Xk/f//BIuF5P3//4tw/OhsSwAAhcAPhGL6///2hfD9//8gdAxmi4Xc/f//ZokG6wiLhdz9//+JBseFvP3//wEAAADpPgUAAIu95P3//4ON8P3//0DHhdj9//8KAAAAi43w/f//98EAgAAAD4TgAQAAiweLVwSDxwjpDAIAAIu95P3//4ON8P3//0CNnfT9//+4AAIAAImd4P3//4mFoP3//zm16P3//30Mx4Xo/f//BgAAAOtqdRGA+md1Y8eF6P3//wEAAADrVzmF6P3//34GiYXo/f//gb3o/f//owAAAH49i7Xo/f//gcZdAQAAVui95P//ipXv/f//WYmFuP3//4XAdBCJheD9//+JtaD9//+L2OsKx4Xo/f//owAAAIsHizV80EAAg8cIiYWA/f//i0f8iYWE/f//jYWk/f//UP+1iP3//w++wv+16P3//4m95P3//1D/taD9//+NhYD9//9TUP81qAZBAP/W/9CLvfD9//+DxByB54AAAAB0HYO96P3//wB1FI2FpP3//1BT/zW0BkEA/9b/0FlZgL3v/f//Z3UYhf91FI2FpP3//1BT/zWwBkEA/9b/0FlZgDstdRGBjfD9//8AAQAAQ4md4P3//1Ppwf3//8eF6P3//wgAAACJjbT9///rKoPocw+Ebvz//0hID4RY/v//g+gDD4W7AQAAi73k/f//x4W0/f//JwAAAPaF8P3//4DHhdj9//8QAAAAD4Qy/v//ioW0/f//BFHGhdT9//8wiIXV/f//x4XM/f//AgAAAOkO/v//98EAEAAAD4UU/v//g8cE9sEgdBiJveT9///2wUB0Bg+/R/zrBA+3R/yZ6xOLR/z2wUB0A5nrAjPSib3k/f//9sFAdBqF0n8WfASFwHMQ99gT1vfagY3w/f//AAEAAPeF8P3//wCQAACL+ovYdQIz/zm16P3//30Mx4Xo/f//AQAAAOsag6Xw/f//97gAAgAAOYXo/f//fgaJhej9//+LwwvHdQYhtcz9//+NdfOLhej9////jej9//+FwH8Gi8MLx3Qti4XY/f//mVJQV1Po90kAAIPBMImdoP3//4vYi/qD+Tl+BgONtP3//4gOTuu9jUXzK8ZG94Xw/f//AAIAAImF2P3//4m14P3//3RihcB0B4vOgDkwdFf/jeD9//+LjeD9///GATBA6z9JZjkwdAeDwAKFyXXzK4Xg/f//0fjrKIX/dQuhYAZBAImF4P3//4uF4P3//+sHSYA4AHQFQIXJdfUrheD9//+Jhdj9//+Dvbz9//8AD4W4AQAAi43w/f//9sFAdDX3wQABAAB0CcaF1P3//y3rGvbBAXQJxoXU/f//K+sM9sECdBHGhdT9//8gx4XM/f//AQAAAIuFyP3//yuF2P3//yuFzP3//4mFoP3///bBDHUli/jrHYuN0P3//4213P3//7AgT+iS9f//g73c/f///3QEhf9/3/+1zP3//4u9lP3//4ud0P3//42F1P3//1CNhdz9///oxCwAAPaF8P3//whZWXQu9oXw/f//BHUli72g/f//6xmNtdz9//+Ly7AwT+g19f//g73c/f///3QEhf9/44O9xP3//wCLhdj9//90dYXAfnGLteD9//+JhZj9//8Ptwb/jZj9//9QagaNRfRQjYWQ/f//UIPGAuhwXgAAg8QQhcB1NjmFkP3//3Qu/7WQ/f//i72U/f//i53Q/f//jUX0UI2F3P3//+gdLAAAg72Y/f//AFlZdabrI4ON3P3////rGou9lP3//1D/teD9//+Nhdz9///o7ysAAFlZg73c/f//AHwy9oXw/f//BHQpi72g/f//6x2LjdD9//+Ntdz9//+wIE/oXPT//4O93P3///90BIX/f9+Dvbj9//8AdBP/tbj9///oxMD//4OluP3//wBZi53A/f//igOIhe/9//+EwHQTi42M/f//i73k/f//itDpcvX//4C9sP3//wB0CouFrP3//4NgcP2Lhdz9//+L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hUjl//9Qi4Uk5f//iwD/NAf/FZDQQACFwA+EQwIAAIuFKOX//wGFOOX//zvGD4w7AgAAi8MrhTTl//87RRAPgmz////pJQIAAIC9P+X//wIPhc0AAACLnTTl//85TRAPhkgCAACDpUDl//8Ai8srjTTl//9qAo2FSOX//147TRBzQw+3EwPeA86JnSDl//+D+gp1GgG1MOX//2oNW2aJGIudIOX//wPGAbVA5f//AbVA5f//ZokQA8aBvUDl///+EwAAcriL8I2FSOX//yvwagCNhSjl//9QVo2FSOX//1CLhSTl//+LAP80B/8VkNBAAIXAD4RpAQAAi4Uo5f//AYU45f//O8YPjGEBAACLwyuFNOX//ztFEA+CR////+lLAQAAi4U05f//iYUs5f//OU0QD4Z1AQAAi40s5f//g6VA5f//ACuNNOX//2oCjYVI+f//XjtNEHM7i5Us5f//D7cSAbUs5f//A86D+gp1DmoNW2aJGAPGAbVA5f//AbVA5f//ZokQA8aBvUDl//+oBgAAcsAz9lZWaFUNAACNjfDr//9RjY1I+f//K8GZK8LR+FCLwVBWaOn9AAD/FbjQQACL2DveD4SXAAAAagCNhSjl//9Qi8MrxlCNhDXw6///UIuFJOX//4sA/zQH/xWQ0EAAhcB0DAO1KOX//zvef8vrDP8VONBAAImFROX//zvef1yLhSzl//8rhTTl//+JhTjl//87RRAPggv////rP1GNjSjl//9R/3UQ/7U05f///zQ4/xWQ0EAAhcB0FYuFKOX//4OlROX//wCJhTjl///rDP8VONBAAImFROX//4O9OOX//wB1bIO9ROX//wB0LWoFXjm1ROX//3UU6Oaq///HAAkAAADo7qr//4kw6z//tUTl///o8qr//1nrMYuFJOX//4sA9kQHBEB0D4uFNOX//4A4GnUEM8DrJOimqv//xwAcAAAA6K6q//+DIACDyP/rDIuFOOX//yuFMOX//1uLTfxfM81e6JqV///Jw2oQaKjxQADoxKr//4tdCIP7/nUb6HKq//+DIADoV6r//8cACQAAAIPI/+mUAAAAhdt4CDsddB1BAHIa6Euq//+DIADoMKr//8cACQAAAOjTqf//69KLw8H4BY08hYAdQQCL84PmH8HmBosHD75EMASD4AF0xlPocCsAAFmDZfwAiwf2RDAEAXQU/3UQ/3UMU+hu+P//g8QMiUXk6xfo1qn//8cACQAAAOjeqf//gyAAg03k/8dF/P7////oDAAAAItF5OhNqv//w4tdCFPouCsAAFnDahBoyPFAAOjwqf//i10Ig/v+dRPoi6n//8cACQAAAIPI/+mhAAAAhdt4CDsddB1BAHIS6Gyp///HAAkAAADoD6n//+vai8PB+AWNPIWAHUEAi/OD5h/B5gaLBw++RAYEg+ABdM5T6KwqAABZg2X8AIsH9kQGBAF0MVPoLyoAAFlQ/xUE0UAAhcB1C/8VONBAAIlF5OsEg2XkAIN95AB0GegSqf//i03kiQjo9aj//8cACQAAAINN5P/HRfz+////6AwAAACLReTodKn//8OLXQhT6N8qAABZw4v/VYvsUfZDDEBWi/CLB4lF/HQNg3sIAHUHi0UMAQbrPoMnAIN9DAB+MItFCIoA/00Mi8voZMj///9FCIM+/3UOgz8qdQ+Ly7A/6E7I//+DfQwAf9WDPwB1BYtF/IkHXsnDi/9Vi+yB7IACAAChhAJBADPFiUX8U4tdDFaLdQgzwFeLfRT/dRCNjaz9//+JtdD9//+JveT9//+Jhaj9//+JhfD9//+Jhcj9//+Jhej9//+Jhcz9//+JhaT9//+JhcT9///oprv//+j9p///iYWc/f//hfZ1K+jup///xwAWAAAA6JGn//+Avbj9//8AdAqLhbT9//+DYHD9g8j/6WELAAD2RgxAdV5W6JzF//9ZugAEQQCD+P90G4P4/nQWi8iD4R+L8MH+BcHhBgMMtYAdQQDrAovK9kEkf3Wbg/j/dBmD+P50FIvIg+AfwfkFweAGAwSNgB1BAOsCi8L2QCSAD4Vx////M/Y73g+EZ////4oTibXc/f//ibXY/f//ibW8/f//ibWg/f//iJXv/f//hNIPhLIKAABDiZ3A/f//ObXc/f//D4yJCgAAjULgPFh3Dw++wg+2gMDlQACD4A/rAjPAi428/f//a8AJD7aECODlQABqCMHoBF6Jhbz9//87xg+E7/7//2oHWTvBD4cgCgAA/ySFc5BAADPAg43o/f///4mFjP3//4mFpP3//4mFyP3//4mFzP3//4mF8P3//4mFxP3//+nnCQAAD77Cg+ggdEiD6AN0NCvGdCRISHQUg+gDD4XJCQAACbXw/f//6b4JAACDjfD9//8E6bIJAACDjfD9//8B6aYJAACBjfD9//+AAAAA6ZcJAACDjfD9//8C6YsJAACA+ip1LIPHBIm95P3//4t//Im9yP3//4X/D4lsCQAAg43w/f//BPedyP3//+laCQAAi4XI/f//a8AKD77KjUQI0ImFyP3//+k/CQAAg6Xo/f//AOkzCQAAgPoqdSaDxwSJveT9//+Lf/yJvej9//+F/w+JFAkAAION6P3////pCAkAAIuF6P3//2vACg++yo1ECNCJhej9///p7QgAAID6SXRVgPpodESA+mx0GID6dw+F1QgAAIGN8P3//wAIAADpxggAAIA7bHUWQ4GN8P3//wAQAACJncD9///pqwgAAION8P3//xDpnwgAAION8P3//yDpkwgAAIoDPDZ1HoB7ATR1GIPDAoGN8P3//wCAAACJncD9///pbwgAADwzdR6AewEydRiDwwKBpfD9////f///iZ3A/f//6U0IAAA8ZA+ERQgAADxpD4Q9CAAAPG8PhDUIAAA8dQ+ELQgAADx4D4QlCAAAPFgPhB0IAACDpbz9//8Ag6XE/f//AI2FrP3//1APtsJQ6HkXAABZhcCKhe/9//9ZdCKLjdD9//+Ntdz9///oa8T//4oDQ4mdwP3//4TAD4SV/P//i43Q/f//jbXc/f//6EnE///puwcAAA++woP4ZA+PtwEAAA+EVQIAAIP4Uw+PugAAAHRMg+hBdBBISHQkSEh0CEhID4WoBQAAgMIgx4WM/f//AQAAAIiV7/3//+lTAgAA94Xw/f//MAgAAA+FngAAAIGN8P3//wAIAADpjwAAAPeF8P3//zAIAAB1CoGN8P3//wAIAACLjej9//+D+f91Bbn///9/g8cE94Xw/f//EAgAAIm95P3//4t//Im94P3//w+E+wQAAIX/dQuhZAZBAImF4P3//4uF4P3//8eFxP3//wEAAADpyQQAAIPoWA+EHAMAAEhIdH8rwQ+EswEAAEhID4XoBAAAi73k/f//g8cE94Xw/f//EAgAAIm95P3//3QwD7dH/FBoAAIAAI2F9P3//1CNhdj9//9Q6KAsAACDxBCFwHQfx4Wk/f//AQAAAOsTikf8iIX0/f//x4XY/f//AQAAAI2F9P3//4mF4P3//+l5BAAAiweDxwSJveT9//+FwHQ8i0gEhcl0NfeF8P3//wAIAAAPvwCJjeD9//90FJkrwtH4x4XE/f//AQAAAOk0BAAAg6XE/f//AOkoBAAAoWAGQQCJheD9//9Q6J3s//9Z6REEAACD+HAPjzYCAAAPhCICAACD+GUPjP8DAACD+GcPjrMAAACD+Gl0eIP4bnQqg/hvD4XjAwAA9oXw/f//gIu95P3//4m12P3//3RsgY3w/f//AAIAAOtgg4Xk/f//BIuF5P3//4tw/OjCEwAAhcAPhEr6///2hfD9//8gdAxmi4Xc/f//ZokG6wiLhdz9//+JBseFpP3//wEAAADpPgUAAIu95P3//4ON8P3//0DHhdj9//8KAAAAi43w/f//98EAgAAAD4TdAQAAA/6LR/iLV/zpCQIAAIu95P3//4ON8P3//0CDvej9//8AjZ30/f//uAACAACJneD9//+JhZj9//99DMeF6P3//wYAAADranURgPpndWPHhej9//8BAAAA61c5hej9//9+BomF6P3//4G96P3//6MAAAB+PYu16P3//4HGXQEAAFboEq3//4qV7/3//1mJhaD9//+FwHQQiYXg/f//ibWY/f//i9jrCseF6P3//6MAAACLB4s1fNBAAIPHCImFgP3//4tH/ImFhP3//42FrP3//1D/tYz9//8PvsL/tej9//+JveT9//9Q/7WY/f//jYWA/f//U1D/NagGQQD/1v/Qi73w/f//g8QcgeeAAAAAdB2Dvej9//8AdRSNhaz9//9QU/81tAZBAP/W/9BZWYC97/3//2d1GIX/dRSNhaz9//9QU/81sAZBAP/W/9BZWYA7LXURgY3w/f//AAEAAEOJneD9//9T6cT9//+Jtej9//+Jjaj9///rKoPocw+EdPz//0hID4Rb/v//g+gDD4W+AQAAi73k/f//x4Wo/f//JwAAAPaF8P3//4DHhdj9//8QAAAAD4Q1/v//ioWo/f//BFHGhdT9//8wiIXV/f//x4XM/f//AgAAAOkR/v//98EAEAAAD4UX/v//g8cE9sEgdBiJveT9///2wUB0Bg+/R/zrBA+3R/yZ6xOLR/z2wUB0A5nrAjPSib3k/f//9sFAdBuF0n8XfASFwHMR99iD0gD32oGN8P3//wABAAD3hfD9//8AkAAAi/qL2HUCM/+Dvej9//8AfQzHhej9//8BAAAA6xqDpfD9///3uAACAAA5hej9//9+BomF6P3//4vDC8d1BiGFzP3//41184uF6P3///+N6P3//4XAfwaLwwvHdC2Lhdj9//+ZUlBXU+hOEgAAg8EwiZ2Y/f//i9iL+oP5OX4GA42o/f//iA5O672NRfMrxkb3hfD9//8AAgAAiYXY/f//ibXg/f//dGOFwHQHi86AOTB0WP+N4P3//4uN4P3//8YBMEDrQElmgzgAdAeDwAKFyXXyK4Xg/f//0fjrKIX/dQuhYAZBAImF4P3//4uF4P3//+sHSYA4AHQFQIXJdfUrheD9//+Jhdj9//+DvaT9//8AD4W4AQAAi43w/f//9sFAdDX3wQABAAB0CcaF1P3//y3rGvbBAXQJxoXU/f//K+sM9sECdBHGhdT9//8gx4XM/f//AQAAAIuFyP3//yuF2P3//yuFzP3//4mFmP3///bBDHUli/jrHYuN0P3//4213P3//7AgT+jovf//g73c/f///3QEhf9/3/+1zP3//4u9nP3//4ud0P3//42F1P3//1CNhdz9///oGvX///aF8P3//whZWXQu9oXw/f//BHUli72Y/f//6xmNtdz9//+Ly7AwT+iLvf//g73c/f///3QEhf9/44O9xP3//wCLhdj9//90dYXAfnGLteD9//+JhZD9//8Ptwb/jZD9//9QagaNRfRQjYWI/f//UIPGAujGJgAAg8QQhcB1NjmFiP3//3Qu/7WI/f//i72c/f//i53Q/f//jUX0UI2F3P3//+hz9P//g72Q/f//AFlZdabrI4ON3P3////rGou9nP3//1D/teD9//+Nhdz9///oRfT//1lZg73c/f//AHwy9oXw/f//BHQpi72Y/f//6x2LjdD9//+Ntdz9//+wIE/osrz//4O93P3///90BIX/f9+DvaD9//8AdBP/taD9///oGon//4OloP3//wBZi53A/f//igOIhe/9//+EwHQPi73k/f//M/aK0Olk9f//g728/f//AHQNg728/f//Bw+FjfT//4C9uP3//wB0CouFtP3//4NgcP2Lhdz9//+LTfxfXjPNW+h6h///ycONSQD7h0AA+IVAACqGQACGhkAA0oZAAN6GQAAkh0AAVohAAIv/VYvsUVGLRQxWi3UIiUX4i0UQV1aJRfzoIR0AAIPP/1k7x3UR6Aqc///HAAkAAACLx4vX60r/dRSNTfxR/3X4UP8VrNBAAIlF+DvHdRP/FTjQ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/wEAAADrGoOl+Pv///e4AAIAADmF9Pv//34GiYX0+///i8MLx3UGIYXc+///jbX7/f//i4X0+////430+///hcB/BovDC8d0LYuF4Pv//5lSUFdT6AX2//+DwTCJnYz7//+L2Iv6g/k5fgYDjaz7//+IDk7rvY2F+/3//yvGRveF+Pv//wACAACJhez7//+JtfD7//90XoXAdAeLxoA4MHRT/43w+///i4Xw+////4Xs+///xgAw6zyF23ULoWQGQQCJhfD7//+LhfD7///HhdD7//8BAAAA6wlPZoM4AHQGA8GF/3XzK4Xw+///0fiJhez7//+DvbD7//8AD4WoAQAAi4X4+///qEB0K6kAAQAAdARqLesOqAF0BGor6waoAnQUaiBZZomNzPv//8eF3Pv//wEAAACLvdj7//8rvez7//8rvdz7//+JveD7//+oDHUk6x6LhdT7//9qII216Pv//0/oivX//4O96Pv///9ZdASF/3/e/7Xc+///i72c+///i53U+///jYXM+///UI2F6Pv//+iH9f//9oX4+///CFlZdC/2hfj7//8EdSaLveD7///rGmowjbXo+///i8NP6Cz1//+Dvej7////WXQEhf9/4oO90Pv//wB1a4ud7Pv//4XbfmGLvfD7//+NhbT7//9Qi4W0+////7CsAAAAjYWk+///V1BL6Mry//+DxBCJhYz7//+FwH4k/7Wk+///i4XU+///jbXo+///6MD0//8DvYz7//9Zhdt/sOsug43o+////+sl/7Xs+///i72c+////7Xw+///i53U+///jYXo+///6Lb0//9ZWYO96Pv//wB8M/aF+Pv//wR0Kou94Pv//+sei4XU+///aiCNtej7//9P6Ff0//+Dvej7////WXQEhf9/3oO9qPv//wB0E/+1qPv//+jjbP//g6Wo+///AFmLvaD7//+LneT7//8Ptwcz9omF4Pv//2Y7xnQHi9DpcfX//zm1xPv//3QNg73E+///Bw+FAfX//4C9wPv//wB0CouFvPv//4NgcP2Lhej7//+LTfxfXjPNW+hCa///ycONSQBCpEAAQqJAAHSiQADPokAAG6NAACejQABto0AAZKRAAIv/VYvsi0UIVleFwHhZOwV0HUEAc1GLyMH5BYvwg+YfjTyNgB1BAIsPweYGgzwO/3U1gz2AAkEAAVOL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YXD9ycOL/1WL7FaLdQiF9g+EYwMAAP92BOhrWv///3YI6GNa////dgzoW1r///92EOhTWv///3YU6Eta////dhjoQ1r///826Dxa////diDoNFr///92JOgsWv///3Yo6CRa////dizoHFr///92MOgUWv///3Y06Axa////dhzoBFr///92OOj8Wf///3Y86PRZ//+DxED/dkDo6Vn///92ROjhWf///3ZI6NlZ////dkzo0Vn///92UOjJWf///3ZU6MFZ////dljouVn///92XOixWf///3Zg6KlZ////dmTooVn///92aOiZWf///3Zs6JFZ////dnDoiVn///92dOiBWf///3Z46HlZ////dnzocVn//4PEQP+2gAAAAOhjWf///7aEAAAA6FhZ////togAAADoTVn///+2jAAAAOhCWf///7aQAAAA6DdZ////tpQAAADoLFn///+2mAAAAOghWf///7acAAAA6BZZ////tqAAAADoC1n///+2pAAAAOgAWf///7aoAAAA6PVY////trwAAADo6lj///+2wAAAAOjfWP///7bEAAAA6NRY////tsgAAADoyVj///+2zAAAAOi+WP//g8RA/7bQAAAA6LBY////trgAAADopVj///+22AAAAOiaWP///7bcAAAA6I9Y////tuAAAADohFj///+25AAAAOh5WP///7boAAAA6G5Y////tuwAAADoY1j///+21AAAAOhYWP///7bwAAAA6E1Y////tvQAAADoQlj///+2+AAAAOg3WP///7b8AAAA6CxY////tgABAADoIVj///+2BAEAAOgWWP///7YIAQAA6AtY//+DxED/tgwBAADo/Vf///+2EAEAAOjyV////7YUAQAA6OdX////thgBAADo3Ff///+2HAEAAOjRV////7YgAQAA6MZX////tiQBAADou1f///+2KAEAAOiwV////7YsAQAA6KVX////tjABAADomlf///+2NAEAAOiPV////7Y4AQAA6IRX////tjwBAADoeVf///+2QAEAAOhuV////7ZEAQAA6GNX////tkgBAADoWFf//4PEQP+2TAEAAOhKV////7ZQAQAA6D9X////tlQBAADoNFf///+2WAEAAOgpV////7ZcAQAA6B5X////tmABAADoE1f//4PEGF5dw4v/VYvsVot1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dABvACAAdQBzAGUAIABNAFMASQBMACAAYwBvAGQAZQAgAGYAcgBvAG0AIAB0AGgAaQBzACAAYQBzAHMAZQBtAGIAbAB5ACAAZAB1AHIAaQBuAGcAIABuAGEAdABpAHYAZQAgAGMAbwBkAGUAIABpAG4AaQB0AGkAYQBsAGkAegBhAHQAaQBvAG4ACgBUAGgAaQBzACAAaQBuAGQAaQBjAGEAdABlAHMAIABhACAAYgB1AGcAIABpAG4AIAB5AG8AdQByACAAYQBwAHAAbABpAGMAYQB0AGkAbwBuAC4AIABJAHQAIABpAHMAIABtAG8AcwB0ACAAbABpAGsAZQBsAHkAIAB0AGgAZQAgAHIAZQBzAHUAbAB0ACAAbwBmACAAYwBhAGwAbABpAG4AZwAgAGEAbgAgAE0AUwBJAEwALQBjAG8AbQBwAGkAbABlAGQAIAAoAC8AYwBsAHIAKQAgAGYAdQBuAGMAdABpAG8AbgAgAGYAcgBvAG0AIABhACAAbgBhAHQAaQB2AGUAIABjAG8AbgBzAHQAcgB1AGMAdABvAHIAIABvAHIAIABmAHIAbwBtACAARABsAGwATQBhAGkAbgAuAA0ACgAAAAAAUgA2ADAAMwAyAA0ACgAtACAAbgBvAHQAIABlAG4AbwB1AGcAaAAgAHMAcABhAGMAZQAgAGYAbwByACAAbABvAGMAYQBsAGUAIABpAG4AZgBvAHIAbQBhAHQAaQBvAG4ADQAKAAAAAABSADYAMAAzADEADQAKAC0AIABBAHQAdABlAG0AcAB0ACAAdABvACAAaQBuAGkAdABpAGEAbABpAHoAZQAgAHQAaABlACAAQwBSAFQAIABtAG8AcgBlACAAdABoAGEAbgAgAG8AbgBjAGUALgAKAFQAaABpAHMAIABpAG4AZABpAGMAYQB0AGUAcwAgAGEAIABiAHUAZwAgAGkAbgAgAHkAbwB1AHIAIABhAHAAcABsAGkAYwBhAHQAaQBvAG4ALgANAAoAAAAAAFIANgAwADMAMAANAAoALQAgAEMAUgBUACAAbgBvAHQAIABpAG4AaQB0AGkAYQBsAGkAegBlAGQADQAKAAAAAABSADYAMAAyADgADQAKAC0AIAB1AG4AYQBiAGwAZQAgAHQAbwAgAGkAbgBpAHQAaQBhAGwAaQB6AGUAIABoAGUAYQBwAA0ACgAAAAAAAAAAAFIANgAwADIANwANAAoALQAgAG4AbwB0ACAAZQBuAG8AdQBnAGgAIABzAHAAYQBjAGUAIABmAG8AcgAgAGwAbwB3AGkAbwAgAGkAbgBpAHQAaQBhAGwAaQB6AGEAdABpAG8AbgANAAoAAAAAAAAAAABSADYAMAAyADYADQAKAC0AIABuAG8AdAAgAGUAbgBvAHUAZwBoACAAcwBwAGEAYwBlACAAZgBvAHIAIABzAHQAZABpAG8AIABpAG4AaQB0AGkAYQBsAGkAegBhAHQAaQBvAG4ADQAKAAAAAAAAAAAAUgA2ADAAMgA1AA0ACgAtACAAcAB1AHIAZQAgAHYAaQByAHQAdQBhAGwAIABmAHUAbgBjAHQAaQBvAG4AIABjAGEAbABsAA0ACgAAAAAAAABSADYAMAAyADQADQAKAC0AIABuAG8AdAAgAGUAbgBvAHUAZwBoACAAcwBwAGEAYwBlACAAZgBvAHIAIABfAG8AbgBlAHgAaQB0AC8AYQB0AGUAeABpAHQAIAB0AGEAYgBsAGUADQAKAAAAAAAAAAAAUgA2ADAAMQA5AA0ACgAtACAAdQBuAGEAYgBsAGUAIAB0AG8AIABvAHAAZQBuACAAYwBvAG4AcwBvAGwAZQAgAGQAZQB2AGkAYwBlAA0ACgAAAAAAAAAAAFIANgAwADEAOAANAAoALQAgAHUAbgBlAHgAcABlAGMAdABlAGQAIABoAGUAYQBwACAAZQByAHIAbwByAA0ACgAAAAAAAAAAAFIANgAwADEANwANAAoALQAgAHUAbgBlAHgAcABlAGMAdABlAGQAIABtAHUAbAB0AGkAdABoAHIAZQBhAGQAIABsAG8AYwBrACAAZQByAHIAbwByAA0ACgAAAAAAAAAAAFIANgAwADEANgANAAoALQAgAG4AbwB0ACAAZQBuAG8AdQBnAGgAIABzAHAAYQBjAGUAIABmAG8AcgAgAHQAaAByAGUAYQBkACAAZABhAHQAYQANAAoAAABSADYAMAAxADAADQAKAC0AIABhAGIAbwByAHQAKAApACAAaABhAHMAIABiAGUAZQBuACAAYwBhAGwAbABlAGQADQAKAAAAAABSADYAMAAwADkADQAKAC0AIABuAG8AdAAgAGUAbgBvAHUAZwBoACAAcwBwAGEAYwBlACAAZgBvAHIAIABlAG4AdgBpAHIAbwBuAG0AZQBuAHQADQAKAAAAUgA2ADAAMAA4AA0ACgAtACAAbgBvAHQAIABlAG4AbwB1AGcAaAAgAHMAcABhAGMAZQAgAGYAbwByACAAYQByAGcAdQBtAGUAbgB0AHMADQAKAAAAAAAAAFIANgAwADAAMgANAAoALQAgAGYAbABvAGEAdABpAG4AZwAgAHAAbwBpAG4AdAAgAHMAdQBwAHAAbwByAHQAIABuAG8AdAAgAGwAbwBhAGQAZQBkAA0ACgAAAAAAAAAAAAIAAAAo2kAACAAAANDZQAAJAAAAeNlAAAoAAAAw2UAAEAAAANjYQAARAAAAeNhAABIAAAAw2EAAEwAAANjXQAAYAAAAaNdAABkAAAAY10AAGgAAAKjWQAAbAAAAONZAABwAAADo1UAAHgAAAKjVQAAfAAAA4NRAACAAAAB41EAAIQAAAIjSQAB4AAAAZNJAAHkAAABI0kAAegAAACzSQAD8AAAAJNJAAP8AAAAE0kAATQBpAGMAcgBvAHMAbwBmAHQAIABWAGkAcwB1AGEAbAAgAEMAKwArACAAUgB1AG4AdABpAG0AZQAgAEwAaQBiAHIAYQByAHkAAAAAAAoACgAAAAAALgAuAC4AAAA8AHAAcgBvAGcAcgBhAG0AIABuAGEAbQBlACAAdQBuAGsAbgBvAHcAbgA+AAAAAABSAHUAbgB0AGkAbQBlACAARQByAHIAbwByACEACgAKAFAAcgBvAGcAcgBhAG0AOgAgAAAAKABuAHUAbABsACkAAAAAAChudWxsKQAABgAABgABAAAQAAMGAAYCEARFRUUFBQUFBTUwAFAAAAAAKCA4UFgHCAA3MDBXUAcAACAgCAAAAAAIYGhgYGBgAAB4cHh4eHgIBwgAAAcACAgIAAAIAAgABwgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAIAAgACAAIAAgACAAIAAgACgAKAAoACgAKAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABIABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAIQAhACEAIQAhACEAIQAhACEAIQAEAAQABAAEAAQABAAEACBAIEAgQCBAIEAgQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAEAAQABAAEAAQABAAggCCAIIAggCCAIIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABAAEAAQABAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgACAAIAAgACAAIAAgACAAIABoACgAKAAoACgAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAASAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACEAIQAhACEAIQAhACEAIQAhACEABAAEAAQABAAEAAQABAAgQGBAYEBgQGBAYEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBARAAEAAQABAAEAAQAIIBggGCAYIBggGCAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgEQABAAEAAQACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAEgAEAAQABAA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IHRvIGNyZWF0ZSBwcm9jZXNzIHVzaW5nICclcycARmFpbGVkIHRvIGdldCBleGl0IGNvZGUgb2YgcHJvY2VzcwAALgBlAHgAZQAAAAAARXhwZWN0ZWQgdG8gZmluZCBhIGNvbW1hbmQgZW5kaW5nIGluICcuZXhlJyBpbiBzaGViYW5nIGxpbmUuAAAAAAAAAABFeHBlY3RlZCB0ZXJtaW5hdGluZyBkb3VibGUtcXVvdGUgZm9yIGV4ZWN1dGFibGUgaW4gc2hlYmFuZyBsaW5lLgAAAAAAAABUZXJtaW5hdGluZyBxdW90ZSB3aXRob3V0IHN0YXJ0aW5nIHF1b3RlIGZvciBleGVjdXRhYmxlIGluIHNoZWJhbmcgbGluZS4AAAAARmFpbGVkIHRvIGZpbmQgc2hlYmFuZwAARXhwZWN0ZWQgdG8gZmluZCB0ZXJtaW5hdG9yIGluIHNoZWJhbmcgbGluZQBFeHBlY3RlZCB0byBkZWNvZGUgc2hlYmFuZyBsaW5lIHVzaW5nIFVURi04AEV4cGVjdGVkIHRvIGZpbmQgJyMnIGF0IHN0YXJ0IG9mIHNoZWJhbmcgbGluZQAAAEV4cGVjdGVkIHRvIGZpbmQgJyEnIGZvbGxvd2luZyAnIycgaW4gc2hlYmFuZyBsaW5lAABFeHBlY3RlZCB0byBmaW5kIGV4ZWN1dGFibGUgaW4gc2hlYmFuZyBsaW5lAEV4cGVjdGVkIHRvIGZpbmQgYXJndW1lbnRzIChldmVuIGlmIGVtcHR5KSBpbiBzaGViYW5nIGxpbmUAAEV4cGVjdGVkIHRvIGJlIGFibGUgdG8gYWxsb2NhdGUgY29tbWFuZCBsaW5lIG1lbW9yeQAiACUAcwAiACAAJQBzACAAIgAlAHMAIgAgACUAcwAAAAAAAABIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEAkEAsO5AAAMAAABSU0RTxbYA0tcG3E2SSuYarna4pgIAAABDOlxVc2Vyc1xWaW5heVxQcm9qZWN0c1xzaW1wbGVfbGF1bmNoZXJcUmVsZWFzZVxDTElTaW1wbGVMYXVuY2hlci5wZGIAAAAAAAAAAAAAAIAtAACgLwAAwHEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAqxhAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAAD+HkAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAACcgQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAdSJAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAAB7I0AAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAFskQAAAAAAA/v///wAAAADM////AAAAAP7///+yJUAAxiVAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAADgKkAAAAAAAP7///8AAAAAwP///wAAAAD+////AAAAAHAzQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAA6TlAAAAAAAD+////AAAAAMz///8AAAAA/v///wAAAABzO0AAAAAAAAAAAAA/O0AA/v///wAAAADU////AAAAAP7///8AAAAA9jxAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAACdSkAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAABNaQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAAc1tAAAAAAAD+////AAAAANj///8AAAAA/v///wAAAAB8YkAA/v///wAAAACLYkAA/v///wAAAADY////AAAAAP7///8AAAAAPmRAAP7///8AAAAASmRAAP7///8AAAAAzP///wAAAAD+////AAAAADpuQAAAAAAA/v///wAAAADY////AAAAAP7///9rcUAAfnFAAAAAAAD+////AAAAANj///8AAAAA/v////dyQAD7ckAAAAAAAP7///8AAAAAwP///wAAAAD+////AAAAAOR0QAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAYXZAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAAAZg0AAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAPKDQAAAAAAA/v///wAAAADM////AAAAAP7///8AAAAA+JFAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAABclUAAAAAAAP7///8AAAAAzP///wAAAAD+////AAAAAC6ZQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAspxAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAADMrkAAAAAAAP7///8AAAAAyP///wAAAAD+////AAAAAJGwQAAAAAAAAAAAAM2vQADs8gAAAAAAAAAAAACk9QAAANAAACT0AAAAAAAAAAAAAL71AAA40QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAs9AAAOvQAAEz0AABm9AAAePQAAIz0AACi9AAAvvQAANr0AADw9AAABvUAACL1AAA49QAATPUAAFz1AABs9QAAhPUAAJb1AADK9QAA1vUAAOL1AAD69QAAEvYAACT2AAA29gAATPYAAGD2AAB89gAAmvYAAK72AADW9gAA5vYAAPb2AAAC9wAAEPcAACL3AAA29wAAQvcAAFT3AABi9wAAdPcAAIz3AACU9wAAoPcAALL3AADI9wAA4vcAAPj3AAAS+AAAHvgAACz4AAA6+AAARPgAAFz4AABs+AAAgvgAAJr4AAC0+AAAxPgAANr4AAD0+AAAAvkAABL5AAAg+QAAMPkAAEL5AABW+QAAYvkAAGz5AAB4+QAAivkAAJr5AAC2+QAAxvkAANj5AADk+QAA9PkAAAAAAACy9QAAAAAAABkBRXhpdFByb2Nlc3MAhwFHZXRDb21tYW5kTGluZVcAcQRTZXRJbmZvcm1hdGlvbkpvYk9iamVjdACoAENyZWF0ZVByb2Nlc3NXAADAAUdldEN1cnJlbnRQcm9jZXNzAPkEV2FpdEZvclNpbmdsZU9iamVjdABnAUdlbmVyYXRlQ29uc29sZUN0cmxFdmVudAAAFgBBc3NpZ25Qcm9jZXNzVG9Kb2JPYmplY3QAAN8BR2V0RXhpdENvZGVQcm9jZXNzAAAUAkdldE1vZHVsZUZpbGVOYW1lVwAApQNRdWVyeUluZm9ybWF0aW9uSm9iT2JqZWN0AGcDTXVsdGlCeXRlVG9XaWRlQ2hhcgCVAENyZWF0ZUpvYk9iamVjdEEAAGQCR2V0U3RkSGFuZGxlAAACAkdldExhc3RFcnJvcgAALQRTZXRDb25zb2xlQ3RybEhhbmRsZXIA6ABEdXBsaWNhdGVIYW5kbGUAUgBDbG9zZUhhbmRsZQBLRVJORUwzMi5kbGwAAEUBU3RyU3RySVcAAFNITFdBUEkuZGxsAM8CSGVhcEZyZWUAAMsCSGVhcEFsbG9jAO4ARW50ZXJDcml0aWNhbFNlY3Rpb24AADkDTGVhdmVDcml0aWNhbFNlY3Rpb24AAGkCR2V0U3RyaW5nVHlwZVcAAIYBR2V0Q29tbWFuZExpbmVBANMCSGVhcFNldEluZm9ybWF0aW9uAADABFRlcm1pbmF0ZVByb2Nlc3MAANMEVW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyAAClBFNldFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcgAAA0lzRGVidWdnZXJQcmVzZW50AOMCSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbkFuZFNwaW5Db3VudADqAEVuY29kZVBvaW50ZXIAygBEZWNvZGVQb2ludGVyABgEUnRsVW53aW5kAM0CSGVhcENyZWF0ZQAARQJHZXRQcm9jQWRkcmVzcwAAGAJHZXRNb2R1bGVIYW5kbGVXAAAlBVdyaXRlRmlsZQBvBFNldEhhbmRsZUNvdW50AADzAUdldEZpbGVUeXBlAGMCR2V0U3RhcnR1cEluZm9XANEARGVsZXRlQ3JpdGljYWxTZWN0aW9uALIEU2xlZXAAwANSZWFkRmlsZQAAZgRTZXRGaWxlUG9pbnRlcgAAEwJHZXRNb2R1bGVGaWxlTmFtZUEAAGEBRnJlZUVudmlyb25tZW50U3RyaW5nc1cAEQVXaWRlQ2hhclRvTXVsdGlCeXRlANoBR2V0RW52aXJvbm1lbnRTdHJpbmdzVwAAxQRUbHNBbGxvYwAAxwRUbHNHZXRWYWx1ZQDIBFRsc1NldFZhbHVlAMYEVGxzRnJlZQDvAkludGVybG9ja2VkSW5jcmVtZW50AABzBFNldExhc3RFcnJvcgAAxQFHZXRDdXJyZW50VGhyZWFkSWQAAOsCSW50ZXJsb2NrZWREZWNyZW1lbnQAAKcDUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIAkwJHZXRUaWNrQ291bnQAAMEBR2V0Q3VycmVudFByb2Nlc3NJZAB5AkdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lAI8AQ3JlYXRlRmlsZVcAPwNMb2FkTGlicmFyeVcAANICSGVhcFJlQWxsb2MAmgFHZXRDb25zb2xlQ1AAAKwBR2V0Q29uc29sZU1vZGUAAFcBRmx1c2hGaWxlQnVmZmVycwAA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AAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAgICAgICAgICAgICAgICAwMDAwMDAwMAAAAAAAAAAAjcQAD420AAcN1AAHLfQAD//////////wAAAAAAAAAAIAWTGQAAAAAAAAAAAAAAAMu6QADLukAAy7pAAMu6QADLukAAy7pAAMu6QADLukAAy7pAAMu6QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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//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/19fX/3Nzc/+bm5v/r6+v/3t7e/9ra2v//////vIE4/8+mdf/8+vf/x6N2/6p5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AAoAAAACAAAAAP///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/9XV1f/SUlJ/yQkJP8mJib/cXFx/93d3f/g4OD/6+vr/+Pj4//29vb/9fX1/+zs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//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+DQo8L2Fzc2VtYmx5PlBBUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFEABAAAMwAAAAKMEEwWjB6MI0wtDC+MNYwqjEKMiMyTTJiMm4yhzKUMqoyxzLeMvUyGDMdMz8zVDNxM44znTOrM8cz0DPmM+0z9zMDNBI0FzQpNDc0PDR7NJ00vDQWNSQ1SzV8NYU1jDWhNb010zUKNi42PjaDNrY2ATcXN6o3zTfqN/o3dzg1OTs5TTmvOd455DnzOTI6ODpSOmE6bjp6Ooo6kTqgOqw6uTrdOu86/ToSOxw7Qjt1O4Q7jTuxO+A7fT4oP5w/oz/FP8w/ACAAAMgAAABXMG8wCTF9MR0yDDP1M200kjSfNKw0uDTENMo03DTkNO80NjU7NUU1fzWENYs1kTUGNgw2EjYYNh42JDYrNjI2OTZANkc2TjZVNl02ZTZtNnk2gjaHNo02lzagNqs2tza8Nsw20TbXNt028zb6Ngk3xjj4OBc5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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AG8AcgBlAGUALgBkAGwAbAAAAHIAdQBuAHQAaQBtAGUAIABlAHIAcgBvAHIAIAAAAAAADQAKAAAAAABUAEwATwBTAFMAIABlAHIAcgBvAHIADQAKAAAAAAAAAFMASQBOAEcAIABlAHIAcgBvAHIADQAKAAAAAAAAAAAARABPAE0AQQBJAE4AIABlAHIAcgBvAHIADQAKAAAAAABSADYAMAAzADMADQAKAC0AIABBAHQAdABlAG0AcAB0ACAAdABvACAAdQBzAGUAIABNAFMASQBMACAAYwBvAGQAZQAgAGYAcgBvAG0AIAB0AGgAaQBzACAAYQBzAHMAZQBtAGIAbAB5ACAAZAB1AHIAaQBuAGcAIABuAGEAdABpAHYAZQAgAGMAbwBkAGUAIABpAG4AaQB0AGkAYQBsAGkAegBhAHQAaQBvAG4ACgBUAGgAaQBzACAAaQBuAGQAaQBjAGEAdABlAHMAIABhACAAYgB1AGcAIABpAG4AIAB5AG8AdQByACAAYQBwAHAAbABpAGMAYQB0AGkAbwBuAC4AIABJAHQAIABpAHMAIABtAG8AcwB0ACAAbABpAGsAZQBsAHkAIAB0AGgAZQAgAHIAZQBzAHUAbAB0ACAAbwBmACAAYwBhAGwAbABpAG4AZwAgAGEAbgAgAE0AUwBJAEwALQBjAG8AbQBwAGkAbABlAGQAIAAoAC8AYwBsAHIAKQAgAGYAdQBuAGMAdABpAG8AbgAgAGYAcgBvAG0AIABhACAAbgBhAHQAaQB2AGUAIABjAG8AbgBzAHQAcgB1AGMAdABvAHIAIABvAHIAIABmAHIAbwBtACAARABsAGwATQBhAGkAbgAuAA0ACgAAAAAAUgA2ADAAMwAyAA0ACgAtACAAbgBvAHQAIABlAG4AbwB1AGcAaAAgAHMAcABhAGMAZQAgAGYAbwByACAAbABvAGMAYQBsAGUAIABpAG4AZgBvAHIAbQBhAHQAaQBvAG4ADQAKAAAAAAAAAAAAAAAAAFIANgAwADMAMQANAAoALQAgAEEAdAB0AGUAbQBwAHQAIAB0AG8AIABpAG4AaQB0AGkAYQBsAGkAegBlACAAdABoAGUAIABDAFIAVAAgAG0AbwByAGUAIAB0AGgAYQBuACAAbwBuAGMAZQAuAAoAVABoAGkAcwAgAGkAbgBkAGkAYwBhAHQAZQBzACAAYQAgAGIAdQBnACAAaQBuACAAeQBvAHUAcgAgAGEAcABwAGwAaQBjAGEAdABpAG8AbgAuAA0ACgAAAAAAUgA2ADAAMwAwAA0ACgAtACAAQwBSAFQAIABuAG8AdAAgAGkAbgBpAHQAaQBhAGwAaQB6AGUAZAANAAoAAAAAAAAAAAAAAAAAUgA2ADAAMgA4AA0ACgAtACAAdQBuAGEAYgBsAGUAIAB0AG8AIABpAG4AaQB0AGkAYQBsAGkAegBlACAAaABlAGEAcAANAAoAAAAAAAAAAABSADYAMAAyADcADQAKAC0AIABuAG8AdAAgAGUAbgBvAHUAZwBoACAAcwBwAGEAYwBlACAAZgBvAHIAIABsAG8AdwBpAG8AIABpAG4AaQB0AGkAYQBsAGkAegBhAHQAaQBvAG4ADQAKAAAAAAAAAAAAUgA2ADAAMgA2AA0ACgAtACAAbgBvAHQAIABlAG4AbwB1AGcAaAAgAHMAcABhAGMAZQAgAGYAbwByACAAcwB0AGQAaQBvACAAaQBuAGkAdABpAGEAbABpAHoAYQB0AGkAbwBuAA0ACgAAAAAAAAAAAFIANgAwADIANQANAAoALQAgAHAAdQByAGUAIAB2AGkAcgB0AHUAYQBsACAAZgB1AG4AYwB0AGkAbwBuACAAYwBhAGwAbAANAAoAAAAAAAAAUgA2ADAAMgA0AA0ACgAtACAAbgBvAHQAIABlAG4AbwB1AGcAaAAgAHMAcABhAGMAZQAgAGYAbwByACAAXwBvAG4AZQB4AGkAdAAvAGEAdABlAHgAaQB0ACAAdABhAGIAbABlAA0ACgAAAAAAAAAAAFIANgAwADEAOQANAAoALQAgAHUAbgBhAGIAbABlACAAdABvACAAbwBwAGUAbgAgAGMAbwBuAHMAbwBsAGUAIABkAGUAdgBpAGMAZQANAAoAAAAAAAAAAAAAAAAAAAAAAFIANgAwADEAOAANAAoALQAgAHUAbgBlAHgAcABlAGMAdABlAGQAIABoAGUAYQBwACAAZQByAHIAbwByAA0ACgAAAAAAAAAAAAAAAAAAAAAAUgA2ADAAMQA3AA0ACgAtACAAdQBuAGUAeABwAGUAYwB0AGUAZAAgAG0AdQBsAHQAaQB0AGgAcgBlAGEAZAAgAGwAbwBjAGsAIABlAHIAcgBvAHIADQAKAAAAAAAA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eQAAAAAAAFRodXJzZGF5AAAAAAAAAABXZWRuZXNkYXkAAAAAAAAAVHVlc2RheQBNb25kYXkAAFN1bmRheQAAU2F0AEZyaQBUaHUAV2VkAFR1ZQBNb24AU3VuAAAAAAABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/AEMATwBOAE8AVQBUACQAAABGYXRhbCBlcnJvciBpbiBsYXVuY2hlcjogJXMKAAAAAHIAYgAAAAAARmFpbGVkIHRvIG9wZW4gZXhlY3V0YWJsZQAAAAAAAABVbmFibGUgdG8gZmluZCBhbiBhcHBlbmRlZCBhcmNoaXZlLgAAAAAAVW5hYmxlIHRvIHJlYWQgZnJvbSBmaWxlAAAAACMhAAAAAAAAAAAAAEpvYiBpbmZvcm1hdGlvbiBxdWVyeWluZyBmYWlsZWQASm9iIGluZm9ybWF0aW9uIHNldHRpbmcgZmFpbGVkAABzdGRpbiBkdXBsaWNhdGlvbiBmYWlsZWQAAAAAAAAAAHN0ZG91dCBkdXBsaWNhdGlvbiBmYWlsZWQAAAAAAAAAc3RkZXJyIGR1cGxpY2F0aW9uIGZhaWxlZAAAAAAAAABVbmFibGUgdG8gY3JlYXRlIHByb2Nlc3MgdXNpbmcgJyVzJwAAAAAARmFpbGVkIHRvIGdldCBleGl0IGNvZGUgb2YgcHJvY2VzcwAAAAAAAC4AZQB4AGUAAAAAAAAAAABFeHBlY3RlZCB0byBmaW5kIGEgY29tbWFuZCBlbmRpbmcgaW4gJy5leGUnIGluIHNoZWJhbmcgbGluZS4AAAAAAAAAAAAAAABFeHBlY3RlZCB0ZXJtaW5hdGluZyBkb3VibGUtcXVvdGUgZm9yIGV4ZWN1dGFibGUgaW4gc2hlYmFuZyBsaW5lLgAAAAAAAAAAAAAAAAAAAFRlcm1pbmF0aW5nIHF1b3RlIHdpdGhvdXQgc3RhcnRpbmcgcXVvdGUgZm9yIGV4ZWN1dGFibGUgaW4gc2hlYmFuZyBsaW5lLgAAAAAAAAAARmFpbGVkIHRvIGZpbmQgc2hlYmFuZwAARXhwZWN0ZWQgdG8gZmluZCB0ZXJtaW5hdG9yIGluIHNoZWJhbmcgbGluZQAAAAAARXhwZWN0ZWQgdG8gZGVjb2RlIHNoZWJhbmcgbGluZSB1c2luZyBVVEYtOAAAAAAARXhwZWN0ZWQgdG8gZmluZCAnIycgYXQgc3RhcnQgb2Ygc2hlYmFuZyBsaW5lAAAARXhwZWN0ZWQgdG8gZmluZCAnIScgZm9sbG93aW5nICcjJyBpbiBzaGViYW5nIGxpbmUAAAAAAABFeHBlY3RlZCB0byBmaW5kIGV4ZWN1dGFibGUgaW4gc2hlYmFuZyBsaW5lAAAAAABFeHBlY3RlZCB0byBmaW5kIGFyZ3VtZW50cyAoZXZlbiBpZiBlbXB0eSkgaW4gc2hlYmFuZyBsaW5lAAAAAAAARXhwZWN0ZWQgdG8gYmUgYWJsZSB0byBhbGxvY2F0ZSBjb21tYW5kIGxpbmUgbWVtb3J5AAAAAAAiACUAcwAiACAAJQBzACAAIgAlAHMAIgAgACUAcwAAAFJTRFPcof8pb1ARR7nAi6dOTIUnAgAAAEM6XFVzZXJzXFZpbmF5XFByb2plY3RzXHNpbXBsZV9sYXVuY2hlclx4NjRcUmVsZWFzZVxDTElTaW1wbGVMYXVuY2hlci5wZGIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQYCAAYyAlAREwgAE2QMABM0CwATUg/QDcALcLgpAAACAAAAwhkAAOUZAACg2QAAAAAAAOoZAAD+GQAAoNkAAAAAAAABBgIABjICMAELAQALYgAAARQKABQ0DwAUMhDwDuAM0ArACHAHYAZQAQYCAAZSAlARGQoAGcQLABl0CgAZZAkAGTQIABlSFdC4KQAAAQAAAMAgAADZIAAAutkAAAAAAAARHAUAHEIYwBZwFWAUMAAAuCkAAAEAAACAIQAAPiIAAKDZAAAAAAAAAR0MAB10CwAdZAoAHVQJAB00CAAdMhngF9AVwBEPBAAPNAcADzILcLgpAAABAAAArSQAALckAADU2QAAAAAAAAEUCAAUZAgAFFQHABQ0BgAUMhBwERQGABRkCAAUNAcAFDIQcLgpAAABAAAA0SUAAOAlAADU2QAAAAAAABEPBAAPNAcADzILcLgpAAABAAAAvyYAAMkmAADU2QAAAAAAAAkKBAAKNAkAClIGcLgpAAABAAAAlCcAADMoAADu2QAAMygAAAEMAgAMAREAASAMACBkEQAgVBAAIDQOACByHPAa4BjQFsAUcAEcDAAcZA8AHFQOABw0DAAcUhjwFuAU0BLAEHARDwYAD2QJAA80CAAPUgtwuCkAAAEAAACyLgAA0i8AAAzaAAAAAAAAGS4JAB1kxAAdNMMAHQG+AA7ADHALUAAAhH0AAOAFAAABFAgAFGQKABRUCQAUNAgAFFIQcAEEAQAEYgAAAQcCAAcBmwABAAAAAQAAAAEAAAABDwQADzQGAA8yC3ARHAoAHGQPABw0DgAcchjwFuAU0BLAEHC4KQAAAQAAAEc2AABVNwAAJ9oAAAAAAAAZLQsAG2RRABtUUAAbNE8AGwFKABTQEsAQcAAAhH0AAEACAAABHAsAHHQYABxUFwAcNBYAHAESABXgE9ARwAAAARkKABl0CQAZZAgAGVQHABk0BgAZMhXAEQ8GAA9kCQAPNAgAD1ILcLgpAAABAAAAjj8AAAJAAAAM2gAAAAAAABEZCgAZdAwAGWQLABk0CgAZUhXwE9ARwLgpAAACAAAASkEAAI5BAABL2gAAAAAAABFBAACnQQAAe9oAAAAAAAABFQgAFXQIABVkBwAVNAYAFTIRwBEVCAAVdAgAFWQHABU0BgAVMhHQuCkAAAEAAACHQwAAxUMAAJbaAAAAAAAAARkKABl0CwAZZAoAGVQJABk0CAAZUhXAARcIABdkCQAXVAgAFzQHABcyE3AAAAAAAQAAAAEbCgAbdBAAG2QPABs0DgAbkhTQEsAQUAEYCgAYZAwAGFQLABg0CgAYUhTQEsAQcAEcCQAcohXwE+AR0A/ADXAMYAswClAAABEbCgAbZAwAGzQLABsyF/AV4BPQEcAPcLgpAAABAAAATFUAAH5VAAC02gAAAAAAAAEQBgAQdAcAEDQGABAyDMABCQIACTIFMAEYCAAYZAgAGFQHABg0BgAYMhRwERUIABU0CwAVMhHgD9ANwAtwCmC4KQAAAQAAAB1kAABPZAAAtNoAAAAAAAAREQYAETQKABEyDcALcApguCkAAAEAAACvZQAA02UAAK/bAAAAAAAAAQ8GAA9kCwAPNAoAD1ILcAEKBAAKNAYACjIGcBEKBAAKNAYACjIGcLgpAAACAAAAVm4AAGBuAADN2gAAAAAAAHVuAACcbgAA7doAAAAAAAAREwQAEzQHABMyD3C4KQAAAgAAAPxvAAApcAAAzdoAAAAAAAA7cAAAcnAAAO3aAAAAAAAAAQoEAAo0CAAKMgZwCQQBAARCAAC4KQAAAQAAAFdyAACKcgAAENsAAIpyAAABJAoAJDQZACTyGvAY4BbQFMAScBFgEFARCgQACjQKAApyBnC4KQAAAQAAAJ16AADAegAAMtsAAAAAAAABGQoAGXQNABlkDAAZVAsAGTQKABlyFcAJBAEABEIAALgpAAABAAAAuX0AAL19AAABAAAAvX0AABEXCgAXZA4AFzQNABdSE/AR4A/QDcALcLgpAAABAAAAUX8AAN9/AAB72wAAAAAAABEZCgAZdAoAGWQJABk0CAAZMhXgE9ARwLgpAAABAAAAwoAAAIiBAACZ2wAAAAAAAAEAAAAZHggAD5IL4AnQB8AFcARgA1ACMIR9AABIAAAAGTYLACU0cQMlAWYDEPAO4AzQCsAIcAdgBlAAAIR9AAAgGwAAERUIABU0CwAVMhHgD9ANwAtwCmC4KQAAAQAAAImPAAC7jwAAtNoAAAAAAAAREQYAETQKABEyDcALcApguCkAAAEAAABbkAAAn5AAAK/bAAAAAAAAGTALAB80ZAAfAVoAEPAO4AzQCsAIcAdgBlAAAIR9AADIAgAAERUIABU0CwAVMhHgD9ANwAtwCmC4KQAAAQAAAPGcAAAlnQAAtNoAAAAAAAAZLwkAHnS1AB5ktAAeNLMAHgGwABBQAACEfQAAcAUAABEKBAAKNAcACjIGcLgpAAABAAAAzqAAACWhAADI2wAAAAAAAAEGAgAGcgIwGR8IABA0EAAQcgzQCsAIcAdgBlCEfQAAOAAAABEZCgAZxAsAGXQKABlkCQAZNAgAGVIV0LgpAAABAAAANKUAAOClAADI2wAAAAAAABEGAgAGMgIwuCkAAAEAAACfqQAAtakAAOPbAAAAAAAAGSEIABJUDwASNA4AEnIOwAxwC2CEfQAAMAAAAAEbCgAbxA8AG3QOABtkDQAbNAwAG5IUUAEYCgAYZAoAGFQJABg0CAAYMhTQEsAQcBkwCwAfNKYAHwGcABDwDuAM0ArACHAHYAZQAACEfQAA0AQAAAEPBgAPVAcADzQGAA8yC3ARGQoAGcQJABl0CAAZZAcAGTQGABkyFeC4KQAAAQAAAJ68AAC/vAAA/tsAAAAAAAARGQoAGXQOABlkDQAZNAwAGXIV4BPQEcC4KQAAAgAAAL29AADkvQAAGdwAAAAAAABkvQAABb8AADncAAAAAAAAAQAAAAEVBgAVNBAAFbIOcA1gDFABDwYAD2QLAA80CgAPcgtwAR0MAB10CwAdZAoAHVQJAB00CAAdMhnwF9AVwAEFAgAFNAEAARIEABI0DQASkgtQAQkBAAliAAAAAAAAAQQBAAQSAAAZLQ1FH3QSABtkEQAXNBAAE0MOkgrwCOAG0ATAAlAAAIR9AABIAAAAAQ8GAA9kEQAPNBAAD9ILcBktDTUfdBAAG2QPABc0DgATMw5yCvAI4AbQBMACUAAAhH0AADAAAAABDwYAD2QPAA80DgAPsgtwAQ4CAA4yCjABCgIACjIGMAESCAASVAoAEjQIABIyDsAMcAtgAQ8GAA9kCQAPNAgAD1ILcAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAEEAQAEggAAAQ8GAA9kBwAPNAYADzILcBksAgAaAYkAhH0AADAEAAAZJQcAF3Q0ABc0MwAXATAAC1AAAIR9AABwAQAAAR8MAB90EQAfZBAAHzQPAB9yGPAW4BTQEsAQUBkyDQAgdHUAIGR0ACBUcwAgNHIAIAFuABngF9AVwAAAhH0AAGADAAABBAEABEIAAHgMAQAAAAAAAAAAAHgQAQAA4AAA8A4BAAAAAAAAAAAAkhABAHjiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAQAAAAAADg8BAAAAAAAgDwEAAAAAADoPAQAAAAAATA8BAAAAAABgDwEAAAAAAHYPAQAAAAAAkg8BAAAAAACuDwEAAAAAAMQPAQAAAAAA2g8BAAAAAAD2DwEAAAAAAAwQAQAAAAAAIBABAAAAAAAwEAEAAAAAAEAQAQAAAAAAWBABAAAAAABqEAEAAAAAAJ4QAQAAAAAAqhABAAAAAAC2EAEAAAAAAM4QAQAAAAAA5hABAAAAAAD4EAEAAAAAAAoRAQAAAAAAHhEBAAAAAAA6EQEAAAAAAFgRAQAAAAAAbBEBAAAAAACAEQEAAAAAAJoRAQAAAAAArhEBAAAAAAC8EQEAAAAAAOQRAQAAAAAA9BEBAAAAAAAEEgEAAAAAABoSAQAAAAAAKBIBAAAAAAA2EgEAAAAAAEgSAQAAAAAAXBIBAAAAAABoEgEAAAAAAHoSAQAAAAAAiBIBAAAAAACaEgEAAAAAALISAQAAAAAAuhIBAAAAAADGEgEAAAAAANgSAQAAAAAA7hIBAAAAAAAIEwEAAAAAAB4TAQAAAAAAOBMBAAAAAABGEwEAAAAAAFQTAQAAAAAAXhMBAAAAAABuEwEAAAAAAIQTAQAAAAAAkBMBAAAAAACqEwEAAAAAALoTAQAAAAAA0BMBAAAAAADqEwEAAAAAAPgTAQAAAAAACBQBAAAAAAAWFAEAAAAAACYUAQAAAAAAOBQBAAAAAABMFAEAAAAAAFgUAQAAAAAAYhQBAAAAAABuFAEAAAAAAIAUAQAAAAAAkBQBAAAAAACgFAEAAAAAALIUAQAAAAAAvhQBAAAAAADOFAEAAAAAAAAAAAAAAAAAhhABAAAAAAAAAAAAAAAAAB8BRXhpdFByb2Nlc3MAjQFHZXRDb21tYW5kTGluZVcAfgRTZXRJbmZvcm1hdGlvbkpvYk9iamVjdACoAENyZWF0ZVByb2Nlc3NXAADGAUdldEN1cnJlbnRQcm9jZXNzAAgFV2FpdEZvclNpbmdsZU9iamVjdABtAUdlbmVyYXRlQ29uc29sZUN0cmxFdmVudAAAFgBBc3NpZ25Qcm9jZXNzVG9Kb2JPYmplY3QAAOYBR2V0RXhpdENvZGVQcm9jZXNzAAAaAkdldE1vZHVsZUZpbGVOYW1lVwAApwNRdWVyeUluZm9ybWF0aW9uSm9iT2JqZWN0AGkDTXVsdGlCeXRlVG9XaWRlQ2hhcgCVAENyZWF0ZUpvYk9iamVjdEEAAGsCR2V0U3RkSGFuZGxlAAAIAkdldExhc3RFcnJvcgAAOwRTZXRDb25zb2xlQ3RybEhhbmRsZXIA7ABEdXBsaWNhdGVIYW5kbGUAUgBDbG9zZUhhbmRsZQBLRVJORUwzMi5kbGwAAEUBU3RyU3RySVcAAFNITFdBUEkuZGxsANcCSGVhcEZyZWUAANMCSGVhcEFsbG9jAPIARW50ZXJDcml0aWNhbFNlY3Rpb24AADsDTGVhdmVDcml0aWNhbFNlY3Rpb24AAHACR2V0U3RyaW5nVHlwZVcAAIwBR2V0Q29tbWFuZExpbmVBAM4EVGVybWluYXRlUHJvY2VzcwAA4gRVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIAALMEU2V0VW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyAAIDSXNEZWJ1Z2dlclByZXNlbnQAJgRSdGxWaXJ0dWFsVW53aW5kAAAfBFJ0bExvb2t1cEZ1bmN0aW9uRW50cnkAABgEUnRsQ2FwdHVyZUNvbnRleHQAJQRSdGxVbndpbmRFeADrAkluaXRpYWxpemVDcml0aWNhbFNlY3Rpb25BbmRTcGluQ291bnQA7gBFbmNvZGVQb2ludGVyAMsARGVjb2RlUG9pbnRlcgDbAkhlYXBTZXRJbmZvcm1hdGlvbgAAqgJHZXRWZXJzaW9uAADVAkhlYXBDcmVhdGUAAEwCR2V0UHJvY0FkZHJlc3MAAB4CR2V0TW9kdWxlSGFuZGxlVwAANAVXcml0ZUZpbGUAfARTZXRIYW5kbGVDb3VudAAA+gFHZXRGaWxlVHlwZQBqAkdldFN0YXJ0dXBJbmZvVwDSAERlbGV0ZUNyaXRpY2FsU2VjdGlvbgDABFNsZWVwAMMDUmVhZEZpbGUAAHQEU2V0RmlsZVBvaW50ZXIAABkCR2V0TW9kdWxlRmlsZU5hbWVBAABnAUZyZWVFbnZpcm9ubWVudFN0cmluZ3NXACAFV2lkZUNoYXJUb011bHRpQnl0ZQDhAUdldEVudmlyb25tZW50U3RyaW5nc1cAAFoBRmxzR2V0VmFsdWUAWwFGbHNTZXRWYWx1ZQBZAUZsc0ZyZWUAgARTZXRMYXN0RXJyb3IAAMsBR2V0Q3VycmVudFRocmVhZElkAABYAUZsc0FsbG9jAACpA1F1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyAJoCR2V0VGlja0NvdW50AADHAUdldEN1cnJlbnRQcm9jZXNzSWQAgAJHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZQCPAENyZWF0ZUZpbGVXAEEDTG9hZExpYnJhcnlXAADaAkhlYXBSZUFsbG9jAKABR2V0Q29uc29sZUNQAACyAUdldENvbnNvbGVNb2RlAABdAUZsdXNoRmlsZUJ1ZmZlcnMAAHgBR2V0Q1BJbmZvAG4BR2V0QUNQAAA+AkdldE9FTUNQAAAMA0lzVmFsaWRDb2RlUGFnZQCUBFNldFN0ZEhhbmRsZQAAYQRTZXRFbmRPZkZpbGUAAFECR2V0UHJvY2Vzc0hlYXAAANwCSGVhcFNpemUAADMFV3JpdGVDb25zb2xlVwAvA0xDTWFwU3RyaW5nVwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACASAFAAQAAAAAAAAAAAAAAgEgBQAEAAAABAQAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAADKi3y2ZKwAAzV0g0mbU//8AAAAAAAAAAAEAAAAWAAAAAgAAAAIAAAADAAAAAgAAAAQAAAAYAAAABQAAAA0AAAAGAAAACQAAAAcAAAAMAAAACAAAAAwAAAAJAAAADAAAAAoAAAAHAAAACwAAAAgAAAAMAAAAFgAAAA0AAAAWAAAADwAAAAIAAAAQAAAADQAAABEAAAASAAAAEgAAAAIAAAAhAAAADQAAADUAAAACAAAAQQAAAA0AAABDAAAAAgAAAFAAAAARAAAAUgAAAA0AAABTAAAADQAAAFcAAAAWAAAAWQAAAAsAAABsAAAADQAAAG0AAAAgAAAAcAAAABwAAAByAAAACQAAAAYAAAAWAAAAgAAAAAoAAACBAAAACgAAAIIAAAAJAAAAgwAAABYAAACEAAAADQAAAJEAAAApAAAAngAAAA0AAAChAAAAAgAAAKQAAAALAAAApwAAAA0AAAC3AAAAEQAAAM4AAAACAAAA1wAAAAsAAAAYBwAADAAAAAwAAAAIAAAA//////////+ACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAgICAgICAgICAgICAgICAwMDAwMDAwMAAAAAAAAAAJjuAEABAAAAiO4AQAEAAAAA8ABAAQAAAALyAEABAAAA/////wAAAAAAAAAAAAAAACzJAEABAAAALMkAQAEAAAAsyQBAAQAAACzJAEABAAAALMkAQAEAAAAs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RAAAhAYBADBEAAAWRQAAfAUBABhFAABgRgAASAUBAGBGAAB+RgAA8AMBAIBGAAANSAAAYAUBABBIAACxSAAACAIBANBIAAC6SQAAeAUBALxJAADWSgAAfAUBANhKAAAlTAAAlAUBAChMAAB6TQAAtAsBAHxNAACfVAAArAUBAKBUAAC7VQAAxAUBALxVAADiVQAANAwBAORVAABrVgAAtAsBAGxWAAA9VwAA9AUBAEBXAAB3VwAABAYBAHhXAADJVwAADAYBAMxXAABhWAAAzAkBAGRYAAAQYwAAkAgBABBjAACmYwAAtAsBAKhjAACHZAAAIAYBAIhkAABEZQAAhAYBAERlAAAHZgAATAYBAAhmAAA/ZgAACAIBAEBmAACBZgAANAwBAIRmAACcZgAANAwBAJxmAABsaAAA0AIBAGxoAACcaQAA3AMBAJxpAABrawAAkAIBAGxrAABibAAAdAYBAGRsAABYbQAAYAcBAFhtAACQbQAAhAYBAJBtAADIbQAAhAYBANRtAAD5bQAANAwBAPxtAACxbgAAkAYBALRuAAA4bwAAhAYBADhvAABcbwAACAIBAFxvAACPcAAAxAYBAJBwAAARcQAACAIBABRxAADHcQAA+AYBAFByAACRcgAABAcBAJRyAAA8egAAJAcBADx6AAAOewAAPAcBABB7AABCewAA8AMBAER7AABafAAAYAcBAFx8AAD0fAAANAwBACB9AACDfQAACAIBAIR9AAChfQAANAwBAKR9AADHfQAAeAcBAMh9AADlfQAANAwBABh+AABKgAAAmAcBAFyAAACfgAAACAIBAKCAAACqgQAAyAcBAKyBAADDgQAANAwBAMSBAAD6gQAAhAYBABCCAAC4ggAA+AcBALiCAADAhAAA/AcBAMCEAABFhQAACAIBAEiFAAAXhgAACAIBADSGAACfhgAACAIBAKCGAADghgAANAwBAOCGAACzhwAAtAsBALSHAAAUjwAAGAgBABSPAADzjwAAPAgBAPSPAADLkAAAaAgBAMyQAAASkQAACAIBABSRAADjmwAAkAgBAOSbAAB5nAAAhAYBAHycAABfnQAAtAgBAGCdAACznQAACAIBALSdAAATngAANAwBABSeAACgngAA0AIBAKCeAACQoAAA4AgBAJCgAABKoQAAAAkBAEyhAADcoQAAJAkBANyhAABRpAAALAkBAFSkAAAypgAASAkBADSmAABcpgAANAwBAIynAAAFqQAAtAsBAAipAABfqQAACAIBAGCpAADVqQAAeAkBANipAADXqwAAmAkBAPCrAABlrQAAtAkBAHCtAAC1rQAAJAkBALitAAD/rQAAJAkBAACuAAA3rgAACAIBADiuAACJrgAADAYBAIyuAAAmrwAAzAkBACivAACCugAA5AkBAIS6AAAxuwAA0AIBADS7AADeuwAACAoBAOC7AABUvAAANAwBAFS8AAD5vAAAGAoBACS9AAAsvwAASAoBAEC/AAB0wgAAiAoBAHTCAAA4xAAAjAoBADjEAABMxAAA8AMBAEzEAACtxAAACAIBALDEAAArxQAAnAoBAEDFAADYxgAArAoBANjGAACmxwAAyAoBAKjHAADXxwAANAwBANjHAACtyAAA0AoBALDIAADwyAAANAwBAPDIAAApyQAANAwBADjJAACRyQAA3AoBALDJAAD+yQAA6AoBAADKAADKzAAA8AoBAMzMAABizQAAGAsBAGTNAADCzgAAKAsBAMTOAABCzwAAUAsBAETPAAAy0wAAYAsBADTTAACg0wAAaAsBAKDTAACq1AAAYAsBAKzUAAA71gAAcAsBADzWAACZ1gAAhAsBALDWAABg1wAAmAsBAHDXAAA32AAAoAsBAFDYAAAF2QAAqAsBAAjZAABD2QAArAsBAETZAABm2QAANAwBAKDZAAC62QAAxAEBALrZAADU2QAAMAIBANTZAADu2QAAxAEBAO7ZAAAM2gAAxAEBAAzaAAAn2gAAxAEBACfaAABL2gAAxAEBAEvaAABz2gAAxAEBAHvaAACW2gAAxAEBAJbaAAC02gAAxAEBALTaAADN2gAAxAEBAM3aAADo2gAAxAEBAO3aAAAI2wAAxAEBABDbAAAy2wAAxAEBADLbAAB72wAAMAIBAHvbAACZ2wAAxAEBAJnbAACv2wAAxAEBAK/bAADI2wAAxAEBAMjbAADj2wAAxAEBAOPbAAD+2wAAxAEBAP7bAAAZ3AAAxAEBABncAAA03AAAxAEBADncAABU3AAAxAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAwADAAAAKAAAgA4AAABwAACAGAAAAIgAAIAAAAAAAAAAAAQAAAAAAAcAAQAAAKAAAIACAAAAuAAAgAMAAADQAACABAAAAOgAAIAFAAAAAAEAgAYAAAAYAQCABwAAADABAIAAAAAAAAAAAAQAAAAAAAEAZQAAAEgBAIAAAAAAAAAAAAQAAAAAAAEAAQAAAGABAIAAAAAAAAAAAAQAAAAAAAEAAAAAAHgBAAAAAAAAAAAAAAQAAAAAAAEAAAAAAIgBAAAAAAAAAAAAAAQAAAAAAAEAAAAAAJgBAAAAAAAAAAAAAAQAAAAAAAEAAAAAAKgBAAAAAAAAAAAAAAQAAAAAAAEAAAAAALgBAAAAAAAAAAAAAAQAAAAAAAEAAAAAAMgBAAAAAAAAAAAAAAQAAAAAAAEAAAAAANgBAAAAAAAAAAAAAAQAAAAAAAEAAAAAAOgBAAAAAAAAAAAAAAQAAAAAAAEACQQAAPgBAAAIcgEA6AIAAOQEAAAAAAAA8HQBACgBAADkBAAAAAAAABh2AQCoCAAA5AQAAAAAAADAfgEAaAUAAOQEAAAAAAAAKIQBAKglAADkBAAAAAAAANCpAQCoEAAA5AQAAAAAAAB4ugEAaAQAAOQEAAAAAAAA4L4BAGgAAADkBAAAAAAAAEi/AQBaAQAA5AQAAAAAAAAoAAAAIAAAAEAAAAABAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4uLgBHR0cAV1dXAGlpaQB1dXUAgAAAAACAgACAgIAAmJiYAKenpwC5ubkAwMDAANfX1wD+/v4A////AAAAAIAAgAAAAP////AAAAAADACPzIAMAA/Hd3fPAAAADADP/+/8gAz8d3d8fPAAAADv/8z8z//M93d3z8fwAAAI/M//7/////d3d3d38AAACOjPzMzM///3d3f/////AAj////v//xm93d3d3d3fPAI7M//zP/GZvd3d3d3d3fPCPjP/+//Zmb8d3d3d3d3fwj////Mz2Zmz8d3d3d3d38I/M//7/9mZmz////8d3d/COjPzPzPZmZmZmZmz8d3fwj////v/2ZmZmZmZmz3d38I/M/MzM/GZmZmZmZm93fPCPjP3+///GZmZmZmZvd88Aj//4vPzP/////8Zmb//wAI/M/53/////ZmZmZm8AAACOiC/IrM/Mz2z8ZmZvAAAAj+UlxJ3////GxmZmzwAAAFvMkUKZzMz//GZmbPAAAACNitgRPv////////+AAAAAj9hTIRTMzPzM//jPAAAAAI/KmaMTjv///////wAAAACPjNz6QirMz4AAAACAAAAAj////sQTz/+P//+AwAAAAI/M/MzqNUzPj8z4DAAAAACPjP///9Vb/4/PgMAAAAAAj//8zMzOmc+P+AwAAAAAAI/M//////7Oj4DAAAAAAACPjPzMzMzMzYgMAAAAAAAAj/////////+AwAAAAAAAAIiIiIiIiIiIjAAAAAAAAA/B/Af+ADgD+AAAAfgAAAH4AAAB+AAAADgAAAAYAAAACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAABgAAAA4AAAB+AAAAfgAAAH4AAAD+AAAA/gAAAP4AAAD+AAAA/gAAAP4AAAH+AAAD/gAAB/4AAA/+AAAf/gAAP/4AAH/8oAAAAEAAAACAAAAABAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQ0NABNTU0AU1NTAHp6egCAAAAAAICAAICAgACQkJAAqqqqALS0tADAwMAA1tbWAOXl5QD+/v4A////AHAAAAsAsAAAcLC3B///8AB7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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ+Pj4/8HBwZElJSU1x8fHjvDw8P/Hx8f/7+/v/+/v7//u7u7/7u7u/+7u7v/e3t7/7e3t/+3t7f/t7e3/7Ozs/+zs7P/s7Oz/0NDQ/97e3v/g4OD/7+/v//r6+v////////////////9W5P//UuH//07d//9J2v//Rdf//7Dt//////////////////////////////////////////////////H///+aAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ+fn5//Hx8f/x8fH/8fHx//Hx8f/w8PD/8PDw//Dw8P/v7+//7+/v/+/v7//u7u7/7u7u/+7u7v/t7e3/7e3t/+3t7f/s7Oz/7Ozs/+zs7P/7+/v/0bmd/6V8Sv+acT//lm9A//////9a5v//VeP//1Hg//9N3f//Sdn//0TW//9A0///PM///zfM//8zyf//L8T//yvB//8mvv//Irr//y28//+O3P///v//zAAAAAAAAAAAAAAAAAAAAAAAAAAZ+fn5/8nJyYw0NDQi1tbWhPHx8f/IyMj/8fHx//Dw8P/w8PD/8PDw/+np6f/X19f/7+/v/+7u7v/u7u7/7u7u/+7u7v/t7e3/0tLS/+vr6//fzLT/p3c8/6N1Pf+ecz7/mnE///////9d6f//Web//1Xj//9Q3///TNz//0jZ//9D1f//P9L//zvP//83y///Msj//y7E//8qwP//Jb3//yG6//8fuP//quX//////4EAAAAAAAAAAAAAAAAAAAAZ+fn5/yIiIjQAAAAXODg4JvLy8v/y8vL/8fHx//Hx8f/x8fH/8PDw/+fn5//Nzc3/7+/v/+/v7//T09P/zc3N/+7u7v/u7u7/0tLS//z8/P/Al2T/q3k8/6Z3Pf+idT3/nXM+//////9h7P//XOn//1jl//9U4v//UN///0vb//9H2P//Q9X//z7R//86zv//Nsv//zHH//8tw///KcD//yW8//8guf//T8j//////84AAAAAAAAAAAAAAAAAAAAZ+fn5/8PDw5ElJSU1ysrKjvPz8//Kysr/8vLy//Ly8v/y8vL/8fHx//Dw8P/f39//8PDw//Dw8P/w8PD/7+/v/+/v7//v7+//0tLS//7+/v+1gUH/rns7/6p5PP+ldz3/oXQ+//////9z7///YOv//1zo//9X5f//U+H//0/e//9K2///Rtf//0LU//8+0f//Oc3//zXK//8xx///LML//yi///8kvP//KLv///////cAAAAAAAAAAAAAAAAAAAAZ+vr6//X19f/09PT/9PT0//T09P/z8/P/8/Pz//Pz8//y8vL/8vLy//Ly8v/x8fH/8fHx//Hx8f/w8PD/8PDw//Dw8P/w8PD/7+/v//////+3fzn/snw6/656O/+peDz/pXY9//Xw6v/X+v//c+///1/r//9b5///V+T//1Lh//9O3f//Str//0XX//9B0///PdD//zjN//80yf//MMX//yzC//8nv///I7v///////8AAAAAAAAAAAAAAAAAAAAZ+vr6/8zMzIw1NTUi2dnZhPT09P/Ly8v/9PT0/+fn5//z8/P/5ubm//Pz8//y8vL/5+fn/9zc3P/k5OT/5OTk/+bm5v/j4+P/1NTU//////+6gDn/tn45/7F8Ov+tejv/qHg8/7yZb//07+n/////////////////////////////////////////////////6fr//23b//84zP//M8n//y/F//8rwf//J77///////8AAAAAAAAAAAAAAAAAAAAZ+/v7/yIiIjQAAAAXOjo6JvX19f/19fX/9fX1/9fX1//z8/P/1NTU//Ly8v/z8/P/5ubm/9HR0f/Pz8//zMzM/9DQ0P/Ozs7/1dXV//////++gjj/uYA5/7V+Ov+wfDv/rHo7/6d3PP+jdT3/nnM+/5pxP/+Vb0D/kW1B/4xrQv+IaUP/g2dD/39kRP+LdVr/3tfQ/+n6//87z///N8z//zPI//8uxP//KsH///////8AAAAAAAAAAAAAAAAAAAAZ+/v7/8fHx5ElJSU1zMzMjvX19f/MzMz/9fX1/9XV1f/y8vL/ysrK/+bm5v/09PT/5+fn/+Dg4P/l5eX/5OTk/+Tk5P/q6ur/1NTU//7+/v/DiD7/vYI4/7iAOf+0fTr/sHs7/6t5PP+ndzz/onU9/55zPv+ZcT//lW9A/5BtQf+MakL/h2hD/4NmRP9+ZEX/i3Va//////8/0v//Os7//zbL//8yyP//NcX///////cAAAAAAAAAAAAAAAAAAAAZ/Pz8//j4+P/39/f/9/f3/6ioqP+rq6v/9vb2//b29v/29vb/9fX1//X19f/19fX/9PT0//T09P/09PT/8/Pz//Pz8//z8/P/8vLy//39/f/QnmH/wYM3/7yBOP+4fzn/s306/697O/+qeTz/pnc9/6F1Pv+dcj7/mHA//5RuQP+PbEH/i2pC/4ZoQ/+CZkT/fWRF//////9C1P//PtH//zrO//81yv//XtP//////84AAAAAAAAAAAAAAAAAAAAZ/Pz8/8/Pz4w1NTUi3NzchPj4+P+Ghob/rKys//f39//29vb/9vb2//b29v/19fX/9fX1//X19f/09PT/9PT0//T09P/09PT/8/Pz//j4+P/o0bP/woQ3/8CDN/+7gTj/t385/7J9Ov+uezv/qXg8/6V2Pf+gdD7/nHI//5dwQP+TbkD/jmxB/4pqQv+FZ0P/gWVE//////9G1///QdT//z3Q//85zf//s+v//////4EAAAAAAAAAAAAAAAAAAAAZ/Pz8/yIiIjQAAAAXOzs7Jvj4+P/19fX/iIiI/6ysrP/39/f/9/f3//b29v/29vb/9vb2//b29v/19fX/9fX1//X19f/09PT/9PT0//T09P/9/fz/4cGa/8WMQ/+/gzj/u4A5/7Z+Of+yfDr/rXo7/6h4PP+kdj3/oHQ+/5tyP/+XcED/km1B/45rQf+JaUL/hWdD//////9J2v//Rdb//0zW//+d5////v//ywAAAAAAAAAAAAAAAAAAAAAAAAAZ/f39/8nJyZFRUVFKbm5uyvf39//Ozs7/zMzM/35+fv+srKz/+Pj4//f39//39/f/9/f3//b29v/29vb/9vb2//X19f/19fX/9fX1//T09P/19fX/+/v7//7+/v///////////////////////////////////////////9fErv+acT//lm9A/5FtQf+Na0L/iGlD//////////////////////H///+aAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ/f39//Pz8/9ISEj/IiIi/6mpqf/6+vr/7Ozs/4mJif92dnb/rKys//j4+P/4+Pj/9/f3//f39//39/f/9vb2//b29v/29vb/9vb2//X19f/19fX/9fX1//T09P/09PT/9PT0//////+5gDn/tH46/7B7O/+reTz/p3c8/6J1Pf+ecz7/mXE//5VvQP+QbUH/jGtC//////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ/v7+/5CQkME6Ojr/Jycn/19fX/+lpaX/+fn5/3Nzc/90dHT/jIyM/6ioqP/d3d3/5eXl/+np6f/4+Pj/9/f3//f39//39/f/9vb2//X19f/c3Nz/5ubm/+vr6//e3t7/2tra//////+8gTj/z6Z1//z69//Ho3b/qnk8/6Z3Pf+idT3/nXM+/5lwP/+UbkD/kGxB//////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvLy8Dzg4OFQAAAAZ/v7+/y0tLTZmZmZuZGRk6yUlJf8iIiL/oqKi/09PT/9TU1P/jY2N/5aWlv+UlJT/2tra/8LCwv/29vb/+Pj4/9HR0f/X19f/9/f3//f39//Y2Nj/3Nzc/9TU1P/Ozs7/y8vL//7+/v/Ei0T/0qd1//z69v/KpHb/rns7/6p5PP+ldj3/oXQ+/5xyP/+YcD//mnhN//////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADw8PIlNTU2B/f39/8zMzJEmJiY1tbW1rDs7O/88PDz/eHh4/1FRUf87Ozv/S0tL//Dw8P/FxcX/9PT0//b29v/39/f/+fn5//j4+P/4+Pj/+Pj4//f39//a2tr/7Ozs/+jo6P/u7u7/5ubm//v7+//hwZr/v4M4/7uBOP+2fjn/snw6/616O/+peDz/pHY9/6B0Pv+bcj//zLef//z8/JsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5OTmUmZmZ/9bW1v/39/f//f39/8nJyf+AgID/VlZW/yMjI/8pKSn/NDQ0/+7u7v/7+/v/+vr6//r6+v/6+vr/+vr6//n5+f/5+fn/+fn5//j4+P/4+Pj/+Pj4//f39//39/f/9fX1//f39//9/f3/6NGz/82dYv+8hUD/tX45/7F8Ov+sejv/q31D/7eTZ//by7b/9vX1042NjRwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZmJiY/4SEhPORkZH/goKC9VpaWv9sbGz/Ozs7/yEhIf8iIiL/KSkp/19fX//W1tb/+Pj4//v7+//7+/v/+vr6//r6+v/6+vr/4uLi/+rq6v/r6+v/5+fn/93d3f/h4eH/v7+//+vr6//j4+P/9PT0//f39///////////////////////////+fn5+d7u7u7/JiYmMgAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ/////zo6OqBwcHDfe3t7/l9fX/9XV1f/V1dX/zo6Ov8hISH/IiIi/yoqKv93d3f/7u7u//z8/P/X19f/0NDQ//v7+//6+vr/3d3d/+rq6v/Ozs7/1tbW/83Nzf/W1tb/2NjY/9HR0f/U1NT/9/f3//f39//39/f/9vb2//Ly8v8iIiI0AAAAFzg4OCbb29v/AAAALAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ/v7+/8zMzJE5OTmhgYGB1JaWlv9KSkr/fHx8/2xsbP86Ojr/IiIi/0JCQv9YWFj/fHx8//j4+P/8/Pz//Pz8//z8/P/7+/v/4ODg/+/v7//t7e3/8fHx/+bm5v/39/f/5ubm//X19f/q6ur/+Pj4//j4+P/39/f/ysrK/+/v7/+8vLySJCQkNrS0tI/S0tL/AAAALAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ/v7+//39/f/9/f3/mJiY/7m5uf/+/v7//Pz8/7i4uP91dXX/S0tL/0NDQ/9AQED/Li4u/3d3d//8/Pz//f39//z8/P/8/Pz//Pz8//v7+//7+/v/+/v7//r6+v/6+vr/+vr6//n5+f/4+Pj/+fn5//j4+P/09PT/8PDw/+vr6//l5eX/3d3d/9PT0//IyMj/AAAAKgAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ/v7+/9LS0ow2NjYi4ODghJmZmf+9vb3//v7+/+/v7/+6urr/hISE/0tLS/9hYWH/TExM/1dXV/+kpKT//f39//Hx8f/t7e3//f39//v7+//i4uL/7Ozs//Hx8f/k5OT/2NjY/8/Pz/+/v7//4+Pj/+Hh4f/v7+//wsLC/+Xl5f6kpKSEGBgYQJaWlqLExMToAAAAJAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ/f39/yIiIjQAAAAXOzs7Jvz8/P/9/f3//f39/9/f3//i4uL/tLS0/25ubv9mZmb/ISEh/yQkJP85OTn/ysrK/97e3v/6+vr//f39//39/f/e3t7/4uLi/9ra2v/T09P/y8vL/7Kysv+urq7/qKio/6+vr//Kysr/yMjI/729veg0NDRddHR0fMTExMLIyMiHAAAAFwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ/Pz8/8nJyZEmJiY10NDQjvz8/P/R0dH//Pz8/97e3v/4+Pj/7u7u/7y8vP92dnb/bW1t/1ZWVv97e3v/T09P/+fn5//19fX//v7+//39/f/g4OD/8vLy/+3t7f/09PT/5OTk/8nJyf/+/v7////////////+/v7/+Pj4//Hx8f/h4eH/6enp/9ra2qUAAAAcAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ/Pz8//r6+v/6+vr/+vr6//v7+//7+/v/+/v7//z8/P/8/Pz//Pz8//39/f/R0dH/YWFh/0NDQ/+Hh4f/cHBw/6Kiov/////////////////+/v7//v7+//7+/v/9/f3/9vb2/83Nzf//////4+Pj/9XV1f/V1dX/8fHx/8nJyf+fn5//s7OzoAICAhwAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ/Pz8/8/Pz4w1NTUi3t7ehPr6+v/Q0ND/+/v7//v7+//7+/v//Pz8//z8/P/8/Pz/5+fn/3x8fP9NTU3/hoaG/2ZmZv/o6Oj//v7+//////////////////7+/v/9/f3/9fX1/8vLy//+/v7/wMDA/8LCwv+urq7/6enp/6SkpP+YmJiYAAAAHAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ/Pz8/yIiIjQAAAAXOzs7Jvn5+f/6+vr/+vr6//r6+v/6+vr/+/v7//v7+//7+/v//Pz8//v7+//Dw8P/XFxc/5eXl/+ysrL//v7+//7+/v/+/v7//v7+//7+/v/7+/v/8vLy/8jIyP/+/v7/1NTU/66urv/CwsL/6urq/6ysrJ0AAAAcAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ+/v7/8fHx5ElJSU1zs7Ojvj4+P/Ozs7/+fn5/9ra2v/p6en/z8/P/+vr6//W1tb/+/v7//v7+//8/Pz/9fX1/7a2tv+ampr/+Pj4//39/f/9/f3//f39//r6+v/29vb/7u7u/8XFxf/6+vr/8fHx/+np6f/q6ur/3d3dpwMDAxwAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ+/v7//f39//39/f/9/f3//j4+P/4+Pj/+Pj4//n5+f/5+fn/+fn5//r6+v/6+vr/+vr6//r6+v/7+/v/+/v7//v7+//7+/v/oKCg//f39//8/Pz/+fn5//X19f/x8fH/6Ojo/7+/v//29vb/6enp/+rq6v/c3NymAgICHAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ+vr6/83NzYw1NTUi29vbhPf39//Ozs7/9/f3//j4+P/4+Pj/+Pj4//n5+f/5+fn/+fn5/+7u7v/t7e3/5+fn/+fn5//r6+v/7u7u/5qamv/i4uL/4+Pj/8/Pz//g4OD/xMTE/7u7u//x8fH/6urq/9vb26UAAAAcAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ+vr6/yIiIjQAAAAXOjo6Jvb29v/29vb/9/f3//f39//39/f/+Pj4//j4+P/4+Pj/+fn5/9zc3P/X19f/+Pj4/9nZ2f/Z2dn/1tbW/9nZ2f/Gxsb/3t7e/87Ozv/AwMD/rq6u/7u7u//y8vL/2trapAAAABwAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ+fn5/8PDw5ElJSU1y8vLjvX19f/MzMz/9vb2/9jY2P/m5ub/zc3N/+jo6P/T09P/7+/v/+Li4v/z8/P/5+fn/+3t7f/w8PD/5+fn/+vr6//t7e3/5OTk/9HR0f/Q0ND/tbW1/9vb2//c3NykAAAAHAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ+/v7//n5+f/5+fn/+fn5//r6+v/6+vr/+vr6//r6+v/6+vr/+vr6//v7+//7+/v/+/v7//v7+//7+/v//Pz8//v7+//6+vr/+Pj4//X19f/y8vL/7+/v/+np6f/j4+P+5eXl6NfX14cAAAAaAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAFgAAABYAAAAWAAAAEgAAAAoAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/gP///793d/wAB//+P3d34AAAP/A/d3fgAAAAAD93d+AAAAAAP3d34AAAAAA/d3fgAAAAAD93d+AAAAAAP3d34AAAAAA/d3fgAAAAAD93d+AAAAAAP3d34AAAAAA/d3fgAAAAAD93d+AAAAAAA3d34AAAAAABd3fgAAAAAAB3d+AAAAAAAHd34AAAAAAAd3fgAAAAAAB3d+AAAAAAAHd34AAAAAAAd3fgAAAAAAB3d+AAAAAAAHd34AAAAAAAd3fgAAAAAAF3d+AAAAAAA3d34AAAAAA/d3fgAAAAAD93d4AAAAAAP3d3wAAAAAA/d3fgAAAAAD93d+AAAAAAP3d34AAAAAA/d3fgAAAAAD93d+AAAAAAP3d34AAAAAA/d3fgAAAAAD93d+AAAAAAf3d34AAAAAD/d3fgAAAAAf93d+AAAAAD/3d34AAAAAf/d3fgAAAAD/93d+AAAAAf/3d34AAAAD//d3fgAAAAf/93d+AAAAD//3d34AAAAf//d3coAAAAIAAAAEAAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAcAAAAHAAAABQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///+B////yf////b////////////////////2////yP///4EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAGCEhITBcXFxKZWVlUTY2NkQ1NTVBAAAAMAAAACQAAAAVAAAACgAAAAIAAAAA////gd34//924v//SNb//zzP//82y///MMX//zLD//9czv//1vL//////4EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAHAUFBTeBgYFx6enp+Obm5v/h4eH11tbW6dvb2+zc3NzatLS0onZ2dmomJiZEAAAAMQAAACL+/v7vZ+T//0zc//9G1///QNP//zvO//81yv//1PP//8/x//8/xP//////7gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB3AwMCj5ubm+Ojo6P/n5+f/5eXl/+bm5v/m5ub/5OTk/+Tk5P/e3t7/4uLi/uLi4vPY2NjT0NDQuv////9W5P//UeD//0vb//9F1///P9L//znN///V9P//0PL//yi/////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/Pz8/+CgoJhlJSUVujo6P/CwsL/ysrK/8/Pz//Nzc3/3Nzc/9HR0f/Jycn/xcXF/8rKyv/Jycn//////1vo//9V4///UN///0ra//9E1v//PtH//zjN//8yyP//LcP///////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf9PT0/3V1dW57e3tq6urq/87Ozv/S0tL/3Nzc/9XV1f/n5+f/3t7e/+Li4v/9/f3/////////////////YOv//1rn//9U4v//T97//7Tw////////////////////////////////////////////7////4EAAAAAAAAAAAAAAB/09PT/7Ozs/+vr6//r6+v/6urq/+rq6v/p6en/6enp/+jo6P/w8PD/7eXa/6eDVv+Vb0D/jmxB//////9i7f//X+r//1nm//9T4v//Td3//0fY//9C1P//PM///zbL//8wxf//K8H//yW8//88wf//1fL//////4EAAAAAAAAAH/X19f+EhIRhl5eXVuzs7P/s7Oz/6+vr/+bm5v/Dw8P/6urq//r6+v+7mW3/oHQ+/5pxP/+TbkD//////2Lt//9i7f//Xur//1jl//9S4f//TNz//0bY//9B0///O8///zXK//8vxf//KcD//yS8//9Zy///////yAAAAAAAAAAf9vb2/3d3d259fX1q7e3t/+3t7f/s7Oz/6+vr/9bW1v/r6+v//v7+/65+Q/+ldj3/nnM+/5hwP///////Yu3//2Lt//9h7P//Xen//1fk//9R4P//S9v//0XX//9A0v//Os7//zTJ//8uxP//KL///yu9///////2AAAAAAAAAB/39/f/8PDw/+/v7//v7+//7u7u/+7u7v/t7e3/7e3t/+zs7P//////sHs7/6l4PP+jdj3/nXM+//Tv6v+B8f//Yu3//2Lt//9h7P//W+j//1bj//9Q3///Str//0TW//8/0f//Oc3//zPI//8tw///J77///////8AAAAAAAAAH/f39/+GhoZhmZmZVvDw8P/v7+//7+/v/+3t7f/Jycn/7e3t//////+1fjr/rns7/6h4PP+idT3/tpdw//Tv6f//////////////////////////////////////6vr//3Lf//890f//N8z//zLI//8swv///////wAAAAAAAAAf+Pj4/3l5eW5/f39q8fHx//Hx8f/w8PD/7+/v/93d3f/u7u7//////7mAOf+zfTr/rXo7/6d3PP+hdT7/m3I//5VvQP+PbEH/iWlC/4NmRP99ZEX/fGNF/3xjRf+Wgmn/6vr//0LU//880P//Nsv//zHH////////AAAAAAAAAB/4+Pj/8/Pz//Pz8//y8vL/8vLy//Hx8f/x8fH/8PDw//Dw8P/+/v7/wYc//7h/Of+yfTr/rHo7/6Z3Pf+gdD7/mnE//5RuQP+Oa0H/iGlD/4JmRP99Y0X/fGNF/31kRv//////R9j//0HT//87z///Pcz///////YAAAAAAAAAH/n5+f+JiYlhnJycVvT09P/h4eH/4+Pj/+7u7v/y8vL/3d3d//Ly8v/So2n/vYI4/7d/Of+xfDr/q3k8/6V2Pf+fcz7/mXE//5NuQP+Na0L/h2hD/4BlRP98Y0X/fGNF//////9M3P//Rtf//0DT//9t2///////yAAAAAAAAAAf+vr6/3p6em6BgYFq9fX1/9zc3P/g4OD/2tra//Pz8//e3t7/8fHx//To2f/Kk1D/vIE4/7Z+Of+wezv/qnk8/6R2Pf+ecz7/mHA//5JtQf+LakL/hWdD/39lRP98Y0X//////1Df//9K2///XNv//9z3//////+BAAAAAAAAAB/7+/v/9/f3//b29v/X19f/9vb2//X19f/19fX/9PT0//T09P/z8/P/+fn5//7+/v//////////////////////////////////////08Kv/5BtQf+KakL/hGdD/35kRf/////////////////////v////gQAAAAAAAAAAAAAAH/v7+/+Li4thnp6eVqmpqf+1tbX/19fX//Ly8v/IyMj/1NTU/9vb2//09PT/3t7e/+rq6v/y8vL//////7R9Ov+uejv/qHg8/6J1Pf+bcj//lW9A/49sQf+JaUL/g2ZE//////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/Pz8/3x8fG6Hh4dt9/f3/4+Pj//Dw8P/6Ojo/+Tk5P/n5+f/7u7u//X19f/w8PD/8vLy//T09P//////uYA5/+7i1P/t4tb/p3c9/6B0Pv+acT//lG5A/45sQf+IaUP//////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/9/f3/pKSk/0pKSv/5+fn/xsbG/39/f//W1tb/+Pj4//f39//39/f/9vb2//b29v/19fX/9fX1//7+/v/FkVD/8OTU/+/j1v+reTz/pXY9/590Pv+ZcT//k25A/5t+Wf/////uAAAAAAAAAAAAAAAAAAAAAAAAAADW1tYCAAAAH/39/f9WVlbhPz8//3d3d/+rq6v/aWlp/4qKiv/AwMD/+fn5/+/v7//d3d3/9/f3//Dw8P/X19f/5OTk//Po2v/OoWv/uYNB/7B8O/+qeTz/pHY9/6J5Rv+ylXD/6+Tc/////4EAAAAAAAAAAAAAAAAAAAAAAAAAAD4+PjNAQEB5/v7+/35+fm9iYmLHMDAw/2tra/9AQED/jo6O/7a2tv/6+vr/+Pj4//T09P/4+Pj/8vLy/+Li4v/e3t7/9vb2//39/f///////////////////////v7+//Ly8tL7+/uBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC0tLVWcnJz/0NDQ/9XV1f+AgID/PDw8/yYmJv9bW1v/7+/v//v7+//6+vr/+vr6//r6+v/5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/v7//////2Ht//9a5///t/L///////////////////////X///+2ubm5/93d3f/29vb/8PDw//r6+v/QvKT/kW9F//////9j7f//Yez//1jl//9N3f//QtT//zfM//8ww///meD//729vf/Ozs7/5OTk//Ly8v/+/v7/qX5J/5lxP//z7+r/m/T//2Pt//9g6///VuP//0vb//9A0v//Ncr//zjF///AwMD/xsbG/+3t7f/19fX//////616O/+idT3/s5Vx//Pv6v/////////////////r+///duL//z7R//8zyP//s7Oz/62trf+kpKT/7+/v//////+7hkX/q3k8/6B0Pv+UbkD/iWlC/35kRf99ZEb/rJyJ/+v7//9H2P//SNL//6+vr/9ZWVn/dXV1/7Gxsf/29vb/4MSh/7aAPf+peDz/nnM+/5JtQf+HaEP/fWRF/31lR///////U9///6js//+bm5v/f39//zQ0NP98fHz/3Nzc//39/f/+/v7/////////////////0MGw/4VnQ/99Y0X///////////X///+1vb29/6Ghof+oqKj/TU1N/5aWlv/+/v7//f39//////+xfj7/6uDT/5lxP/+Oa0H/hWlH//////QAAAAAAAAAAMHBwf/Pz8//5eXl/7m5uf9SUlL/wMDA//j4+P/6+vr/3sKi/7KCR/+jdT3/nXhL/8q6p/////+1AAAAAAAAAAC+vr7/3t7e//f39//5+fn/u7u7/5ycnP/t7e3/4eHh//7+/v/9/f3///////7+/v/s7Oz/AAAAAAAAAAAAAAAAu7u7/87Ozv/k5OT/9vb2//j4+P/39/f/39/f//r6+v/8/Pz/yMjI//n5+f/MzMz/v7+/fwAAAAAAAAAAAAAAALe3t/+5ubn/u7u7/729vf+/v7//wcHB/8PDw//FxcX/yMjI/8nJyf/Hx8f/xMTEfwAAAAAAAAAAAAAAAAAAAAB+B6xBEAesQQADrEEAA6xBAACsQQAArEEAAKxBAACsQQAArEEAAKxBAACsQQADrEEAA6xBAAesQQAHrEEAD6xBAAABAAcAICAQAAEABADoAgAAAQAQEBAAAQAEACgBAAACACAgAAABAAgAqAgAAAMAEBAAAAEACABoBQAABAAwMAAAAQAgAKglAAAFACAgAAABACAAqBAAAAYAEBAAAAEAIABoBAAABwA8YXNzZW1ibHkgeG1sbnM9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206YXNtLnYxIiBtYW5pZmVzdFZlcnNpb249IjEuMCI+DQogIDx0cnVzdEluZm8geG1sbnM9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206YXNtLnYzIj4NCiAgICA8c2VjdXJpdHk+DQogICAgICA8cmVxdWVzdGVkUHJpdmlsZWdlcz4NCiAgICAgICAgPHJlcXVlc3RlZEV4ZWN1dGlvbkxldmVsIGxldmVsPSJhc0ludm9rZXIiIHVpQWNjZXNzPSJmYWxzZSI+PC9yZXF1ZXN0ZWRFeGVjdXRpb25MZXZlbD4NCiAgICAgIDwvcmVxdWVzdGVkUHJpdmlsZWdlcz4NCiAgICA8L3NlY3VyaXR5Pg0KICA8L3RydXN0SW5mbz4NCjwvYXNzZW1ibHk+UEFQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQUQA4AAARAAAAKCiqKKworii0KLYoiCjKKNorHisiKyYrKisuKzIrNis6Kz4rAitGK0orTitSK1YrWiteK2IrZitqK24rQAgAQCAAAAAAKAQoPCo+KgAqQipIKkoqTCpOKlAqUipUKlYqWCpaKmgrbCuuK7Arsiu0K7YruCu6K7wrviuAK8IrxCvGK8gryivMK84r0CvSK9Qr1ivYK9or3CveK+Ar4ivkK+Yr6CvqK+wr7ivwK/Ir9Cv2K/gr+iv8K/4rwAAADABAKAAAAAAoBigIKAooDCgOKBAoEigUKBYoGCgaKBwoHiggKCIoJCgmKCgoKigsKC4oMCgyKDQoNig4KDooPCg+KAAoQihEKEYoSChKKEwoTihQKFIoVChWKFgoWih2KH4oRiiOKJYopiisKK4osCiyKLQouCi+KIAowijEKMYoyCjKKMwozijQKNIo1ijYKNoo3CjeKOAo4ijkKMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUEsDBBQAAAAAAAAAIQA32AEl/84AAP/OAAArAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvdXRpbC5weSMKIyBDb3B5cmlnaHQgKEMpIDIwMTItMjAxNiBUaGUgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24uCiMgU2VlIExJQ0VOU0UudHh0IGFuZCBDT05UUklCVVRPUlMudHh0LgojCmltcG9ydCBjb2RlY3MKZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUKaW1wb3J0IGNvbnRleHRsaWIKaW1wb3J0IGNzdgpmcm9tIGdsb2IgaW1wb3J0IGlnbG9iIGFzIHN0ZF9pZ2xvYgppbXBvcnQgaW8KaW1wb3J0IGpzb24KaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG9zCmltcG9ydCBweV9jb21waWxlCmltcG9ydCByZQppbXBvcnQgc2h1dGlsCmltcG9ydCBzb2NrZXQKdHJ5OgogICAgaW1wb3J0IHNzbApleGNlcHQgSW1wb3J0RXJyb3I6ICAjIHByYWdtYTogbm8gY292ZXIKICAgIHNzbCA9IE5vbmUKaW1wb3J0IHN1YnByb2Nlc3MKaW1wb3J0IHN5cwppbXBvcnQgdGFyZmlsZQppbXBvcnQgdGVtcGZpbGUKaW1wb3J0IHRleHR3cmFwCgp0cnk6CiAgICBpbXBvcnQgdGhyZWFkaW5nCmV4Y2VwdCBJbXBvcnRFcnJvcjogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgaW1wb3J0IGR1bW15X3RocmVhZGluZyBhcyB0aHJlYWRpbmcKaW1wb3J0IHRpbWUKCmZyb20gLiBpbXBvcnQgRGlzdGxpYkV4Y2VwdGlvbgpmcm9tIC5jb21wYXQgaW1wb3J0IChzdHJpbmdfdHlwZXMsIHRleHRfdHlwZSwgc2h1dGlsLCByYXdfaW5wdXQsIFN0cmluZ0lPLAogICAgICAgICAgICAgICAgICAgICBjYWNoZV9mcm9tX3NvdXJjZSwgdXJsb3BlbiwgdXJsam9pbiwgaHR0cGxpYiwgeG1scnBjbGliLAogICAgICAgICAgICAgICAgICAgICBzcGxpdHR5cGUsIEhUVFBIYW5kbGVyLCBCYXNlQ29uZmlndXJhdG9yLCB2YWxpZF9pZGVudCwKICAgICAgICAgICAgICAgICAgICAgQ29udGFpbmVyLCBjb25maWdwYXJzZXIsIFVSTEVycm9yLCBaaXBGaWxlLCBmc2RlY29kZSwKICAgICAgICAgICAgICAgICAgICAgdW5xdW90ZSkKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKIwojIFJlcXVpcmVtZW50IHBhcnNpbmcgY29kZSBmb3IgbmFtZSArIG9wdGlvbmFsIGNvbnN0cmFpbnRzICsgb3B0aW9uYWwgZXh0cmFzCiMKIyBlLmcuICdmb28gPj0gMS4yLCA8IDIuMCBbYmFyLCBiYXpdJwojCiMgVGhlIHJlZ2V4IGNhbiBzZWVtIGEgYml0IGhhaXJ5LCBzbyB3ZSBidWlsZCBpdCB1cCBvdXQgb2Ygc21hbGxlciBwaWVjZXMKIyB3aGljaCBhcmUgbWFuYWdlYWJsZS4KIwoKQ09NTUEgPSByJ1xzKixccyonCkNPTU1BX1JFID0gcmUuY29tcGlsZShDT01NQSkKCklERU5UID0gcicoXHd8Wy4tXSkrJwpFWFRSQV9JREVOVCA9IHInKFwqfDooXCp8XHcrKTp8JyArIElERU5UICsgJyknClZFUlNQRUMgPSBJREVOVCArIHInXCo/JwoKUkVMT1AgPSAnKFs8Pj0hfl09KXxbPD5dJwoKIwojIFRoZSBmaXJzdCByZWxvcCBpcyBvcHRpb25hbCAtIGlmIGFic2VudCwgd2lsbCBiZSB0YWtlbiBhcyAnfj0nCiMKQkFSRV9DT05TVFJBSU5UUyA9ICgnKCcgKyBSRUxPUCArIHInKT9ccyooJyArIFZFUlNQRUMgKyAnKSgnICsgQ09NTUEgKyAnKCcgKwogICAgICAgICAgICAgICAgICAgIFJFTE9QICsgcicpXHMqKCcgKyBWRVJTUEVDICsgJykpKicpCgpESVJFQ1RfUkVGID0gJyhmcm9tXHMrKD9QPGRpcmVmPi4qKSknCgojCiMgRWl0aGVyIHRoZSBiYXJlIGNvbnN0cmFpbnRzIG9yIHRoZSBiYXJlIGNvbnN0cmFpbnRzIGluIHBhcmVudGhlc2VzCiMKQ09OU1RSQUlOVFMgPSAocidcKFxzKig/UDxjMT4nICsgQkFSRV9DT05TVFJBSU5UUyArICd8JyArIERJUkVDVF9SRUYgKwogICAgICAgICAgICAgICByJylccypcKXwoP1A8YzI+JyArIEJBUkVfQ09OU1RSQUlOVFMgKyAnXHMqKScpCgpFWFRSQV9MSVNUID0gRVhUUkFfSURFTlQgKyAnKCcgKyBDT01NQSArIEVYVFJBX0lERU5UICsgJykqJwpFWFRSQVMgPSByJ1xbXHMqKD9QPGV4PicgKyBFWFRSQV9MSVNUICsgcicpP1xzKlxdJwpSRVFVSVJFTUVOVCA9ICgnKD9QPGRuPicgICsgSURFTlQgKyByJylccyooJyArIEVYVFJBUyArIHInXHMqKT8oXHMqJyArCiAgICAgICAgICAgICAgIENPTlNUUkFJTlRTICsgJyk/JCcpClJFUVVJUkVNRU5UX1JFID0gcmUuY29tcGlsZShSRVFVSVJFTUVOVCkKCiMKIyBVc2VkIHRvIHNjYW4gdGhyb3VnaCB0aGUgY29uc3RyYWludHMKIwpSRUxPUF9JREVOVCA9ICcoP1A8b3A+JyArIFJFTE9QICsgcicpXHMqKD9QPHZuPicgKyBWRVJTUEVDICsgJyknClJFTE9QX0lERU5UX1JFID0gcmUuY29tcGlsZShSRUxPUF9JREVOVCkKCmRlZiBwYXJzZV9yZXF1aXJlbWVudChzKToKCiAgICBkZWYgZ2V0X2NvbnN0cmFpbnQobSk6CiAgICAgICAgZCA9IG0uZ3JvdXBkaWN0KCkKICAgICAgICByZXR1cm4gZFsnb3AnXSwgZFsndm4nXQoKICAgIHJlc3VsdCA9IE5vbmUKICAgIG0gPSBSRVFVSVJFTUVOVF9SRS5tYXRjaChzKQogICAgaWYgbToKICAgICAgICBkID0gbS5ncm91cGRpY3QoKQogICAgICAgIG5hbWUgPSBkWydkbiddCiAgICAgICAgY29ucyA9IGRbJ2MxJ10gb3IgZFsnYzInXQogICAgICAgIGlmIG5vdCBkWydkaXJlZiddOgogICAgICAgICAgICB1cmwgPSBOb25lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBkaXJlY3QgcmVmZXJlbmNlCiAgICAgICAgICAgIGNvbnMgPSBOb25lCiAgICAgICAgICAgIHVybCA9IGRbJ2RpcmVmJ10uc3RyaXAoKQogICAgICAgIGlmIG5vdCBjb25zOgogICAgICAgICAgICBjb25zID0gTm9uZQogICAgICAgICAgICBjb25zdHIgPSAnJwogICAgICAgICAgICBycyA9IGRbJ2RuJ10KICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBjb25zWzBdIG5vdCBpbiAnPD4hPSc6CiAgICAgICAgICAgICAgICBjb25zID0gJ349JyArIGNvbnMKICAgICAgICAgICAgaXRlcmF0b3IgPSBSRUxPUF9JREVOVF9SRS5maW5kaXRlcihjb25zKQogICAgICAgICAgICBjb25zID0gW2dldF9jb25zdHJhaW50KG0pIGZvciBtIGluIGl0ZXJhdG9yXQogICAgICAgICAgICBycyA9ICclcyAoJXMpJyAlIChuYW1lLCAnLCAnLmpvaW4oWyclcyAlcycgJSBjb24gZm9yIGNvbiBpbiBjb25zXSkpCiAgICAgICAgaWYgbm90IGRbJ2V4J106CiAgICAgICAgICAgIGV4dHJhcyA9IE5vbmUKICAgICAgICBlbHNlOgogICAgICAgICAgICBleHRyYXMgPSBDT01NQV9SRS5zcGxpdChkWydleCddKQogICAgICAgIHJlc3VsdCA9IENvbnRhaW5lcihuYW1lPW5hbWUsIGNvbnN0cmFpbnRzPWNvbnMsIGV4dHJhcz1leHRyYXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50PXJzLCBzb3VyY2U9cywgdXJsPXVybCkKICAgIHJldHVybiByZXN1bHQKCgpkZWYgZ2V0X3Jlc291cmNlc19kZXN0cyhyZXNvdXJjZXNfcm9vdCwgcnVsZXMpOgogICAgIiIiRmluZCBkZXN0aW5hdGlvbnMgZm9yIHJlc291cmNlcyBmaWxlcyIiIgoKICAgIGRlZiBnZXRfcmVsX3BhdGgoYmFzZSwgcGF0aCk6CiAgICAgICAgIyBub3JtYWxpemVzIGFuZCByZXR1cm5zIGEgbHN0cmlwcGVkLS8tc2VwYXJhdGVkIHBhdGgKICAgICAgICBiYXNlID0gYmFzZS5yZXBsYWNlKG9zLnBhdGguc2VwLCAnLycpCiAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZShvcy5wYXRoLnNlcCwgJy8nKQogICAgICAgIGFzc2VydCBwYXRoLnN0YXJ0c3dpdGgoYmFzZSkKICAgICAgICByZXR1cm4gcGF0aFtsZW4oYmFzZSk6XS5sc3RyaXAoJy8nKQoKCiAgICBkZXN0aW5hdGlvbnMgPSB7fQogICAgZm9yIGJhc2UsIHN1ZmZpeCwgZGVzdCBpbiBydWxlczoKICAgICAgICBwcmVmaXggPSBvcy5wYXRoLmpvaW4ocmVzb3VyY2VzX3Jvb3QsIGJhc2UpCiAgICAgICAgZm9yIGFic19iYXNlIGluIGlnbG9iKHByZWZpeCk6CiAgICAgICAgICAgIGFic19nbG9iID0gb3MucGF0aC5qb2luKGFic19iYXNlLCBzdWZmaXgpCiAgICAgICAgICAgIGZvciBhYnNfcGF0aCBpbiBpZ2xvYihhYnNfZ2xvYik6CiAgICAgICAgICAgICAgICByZXNvdXJjZV9maWxlID0gZ2V0X3JlbF9wYXRoKHJlc291cmNlc19yb290LCBhYnNfcGF0aCkKICAgICAgICAgICAgICAgIGlmIGRlc3QgaXMgTm9uZTogICMgcmVtb3ZlIHRoZSBlbnRyeSBpZiBpdCB3YXMgaGVyZQogICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9ucy5wb3AocmVzb3VyY2VfZmlsZSwgTm9uZSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcmVsX3BhdGggPSBnZXRfcmVsX3BhdGgoYWJzX2Jhc2UsIGFic19wYXRoKQogICAgICAgICAgICAgICAgICAgIHJlbF9kZXN0ID0gZGVzdC5yZXBsYWNlKG9zLnBhdGguc2VwLCAnLycpLnJzdHJpcCgnLycpCiAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25zW3Jlc291cmNlX2ZpbGVdID0gcmVsX2Rlc3QgKyAnLycgKyByZWxfcGF0aAogICAgcmV0dXJuIGRlc3RpbmF0aW9ucwoKCmRlZiBpbl92ZW52KCk6CiAgICBpZiBoYXNhdHRyKHN5cywgJ3JlYWxfcHJlZml4Jyk6CiAgICAgICAgIyB2aXJ0dWFsZW52IHZlbnZzCiAgICAgICAgcmVzdWx0ID0gVHJ1ZQogICAgZWxzZToKICAgICAgICAjIFBFUCA0MDUgdmVudnMKICAgICAgICByZXN1bHQgPSBzeXMucHJlZml4ICE9IGdldGF0dHIoc3lzLCAnYmFzZV9wcmVmaXgnLCBzeXMucHJlZml4KQogICAgcmV0dXJuIHJlc3VsdAoKCmRlZiBnZXRfZXhlY3V0YWJsZSgpOgojIFRoZSBfX1BZVkVOVl9MQVVOQ0hFUl9fIGRhbmNlIGlzIGFwcGFyZW50bHkgbm8gbG9uZ2VyIG5lZWRlZCwgYXMKIyBjaGFuZ2VzIHRvIHRoZSBzdHViIGxhdW5jaGVyIG1lYW4gdGhhdCBzeXMuZXhlY3V0YWJsZSBhbHdheXMgcG9pbnRzCiMgdG8gdGhlIHN0dWIgb24gbWFjT1MKIyAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2RhcndpbicgYW5kICgnX19QWVZFTlZfTEFVTkNIRVJfXycKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBvcy5lbnZpcm9uKToKIyAgICAgICAgcmVzdWx0ID0gIG9zLmVudmlyb25bJ19fUFlWRU5WX0xBVU5DSEVSX18nXQojICAgIGVsc2U6CiMgICAgICAgIHJlc3VsdCA9IHN5cy5leGVjdXRhYmxlCiMgICAgcmV0dXJuIHJlc3VsdAogICAgcmVzdWx0ID0gb3MucGF0aC5ub3JtY2FzZShzeXMuZXhlY3V0YWJsZSkKICAgIGlmIG5vdCBpc2luc3RhbmNlKHJlc3VsdCwgdGV4dF90eXBlKToKICAgICAgICByZXN1bHQgPSBmc2RlY29kZShyZXN1bHQpCiAgICByZXR1cm4gcmVzdWx0CgoKZGVmIHByb2NlZWQocHJvbXB0LCBhbGxvd2VkX2NoYXJzLCBlcnJvcl9wcm9tcHQ9Tm9uZSwgZGVmYXVsdD1Ob25lKToKICAgIHAgPSBwcm9tcHQKICAgIHdoaWxlIFRydWU6CiAgICAgICAgcyA9IHJhd19pbnB1dChwKQogICAgICAgIHAgPSBwcm9tcHQKICAgICAgICBpZiBub3QgcyBhbmQgZGVmYXVsdDoKICAgICAgICAgICAgcyA9IGRlZmF1bHQKICAgICAgICBpZiBzOgogICAgICAgICAgICBjID0gc1swXS5sb3dlcigpCiAgICAgICAgICAgIGlmIGMgaW4gYWxsb3dlZF9jaGFyczoKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGlmIGVycm9yX3Byb21wdDoKICAgICAgICAgICAgICAgIHAgPSAnJWM6ICVzXG4lcycgJSAoYywgZXJyb3JfcHJvbXB0LCBwcm9tcHQpCiAgICByZXR1cm4gYwoKCmRlZiBleHRyYWN0X2J5X2tleShkLCBrZXlzKToKICAgIGlmIGlzaW5zdGFuY2Uoa2V5cywgc3RyaW5nX3R5cGVzKToKICAgICAgICBrZXlzID0ga2V5cy5zcGxpdCgpCiAgICByZXN1bHQgPSB7fQogICAgZm9yIGtleSBpbiBrZXlzOgogICAgICAgIGlmIGtleSBpbiBkOgogICAgICAgICAgICByZXN1bHRba2V5XSA9IGRba2V5XQogICAgcmV0dXJuIHJlc3VsdAoKZGVmIHJlYWRfZXhwb3J0cyhzdHJlYW0pOgogICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA+PSAzOgogICAgICAgICMgbmVlZHMgdG8gYmUgYSB0ZXh0IHN0cmVhbQogICAgICAgIHN0cmVhbSA9IGNvZGVjcy5nZXRyZWFkZXIoJ3V0Zi04Jykoc3RyZWFtKQogICAgIyBUcnkgdG8gbG9hZCBhcyBKU09OLCBmYWxsaW5nIGJhY2sgb24gbGVnYWN5IGZvcm1hdAogICAgZGF0YSA9IHN0cmVhbS5yZWFkKCkKICAgIHN0cmVhbSA9IFN0cmluZ0lPKGRhdGEpCiAgICB0cnk6CiAgICAgICAgamRhdGEgPSBqc29uLmxvYWQoc3RyZWFtKQogICAgICAgIHJlc3VsdCA9IGpkYXRhWydleHRlbnNpb25zJ11bJ3B5dGhvbi5leHBvcnRzJ11bJ2V4cG9ydHMnXQogICAgICAgIGZvciBncm91cCwgZW50cmllcyBpbiByZXN1bHQuaXRlbXMoKToKICAgICAgICAgICAgZm9yIGssIHYgaW4gZW50cmllcy5pdGVtcygpOgogICAgICAgICAgICAgICAgcyA9ICclcyA9ICVzJyAlIChrLCB2KQogICAgICAgICAgICAgICAgZW50cnkgPSBnZXRfZXhwb3J0X2VudHJ5KHMpCiAgICAgICAgICAgICAgICBhc3NlcnQgZW50cnkgaXMgbm90IE5vbmUKICAgICAgICAgICAgICAgIGVudHJpZXNba10gPSBlbnRyeQogICAgICAgIHJldHVybiByZXN1bHQKICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgc3RyZWFtLnNlZWsoMCwgMCkKCiAgICBkZWYgcmVhZF9zdHJlYW0oY3AsIHN0cmVhbSk6CiAgICAgICAgaWYgaGFzYXR0cihjcCwgJ3JlYWRfZmlsZScpOgogICAgICAgICAgICBjcC5yZWFkX2ZpbGUoc3RyZWFtKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGNwLnJlYWRmcChzdHJlYW0pCgogICAgY3AgPSBjb25maWdwYXJzZXIuQ29uZmlnUGFyc2VyKCkKICAgIHRyeToKICAgICAgICByZWFkX3N0cmVhbShjcCwgc3RyZWFtKQogICAgZXhjZXB0IGNvbmZpZ3BhcnNlci5NaXNzaW5nU2VjdGlvbkhlYWRlckVycm9yOgogICAgICAgIHN0cmVhbS5jbG9zZSgpCiAgICAgICAgZGF0YSA9IHRleHR3cmFwLmRlZGVudChkYXRhKQogICAgICAgIHN0cmVhbSA9IFN0cmluZ0lPKGRhdGEpCiAgICAgICAgcmVhZF9zdHJlYW0oY3AsIHN0cmVhbSkKCiAgICByZXN1bHQgPSB7fQogICAgZm9yIGtleSBpbiBjcC5zZWN0aW9ucygpOgogICAgICAgIHJlc3VsdFtrZXldID0gZW50cmllcyA9IHt9CiAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIGNwLml0ZW1zKGtleSk6CiAgICAgICAgICAgIHMgPSAnJXMgPSAlcycgJSAobmFtZSwgdmFsdWUpCiAgICAgICAgICAgIGVudHJ5ID0gZ2V0X2V4cG9ydF9lbnRyeShzKQogICAgICAgICAgICBhc3NlcnQgZW50cnkgaXMgbm90IE5vbmUKICAgICAgICAgICAgI2VudHJ5LmRpc3QgPSBzZWxmCiAgICAgICAgICAgIGVudHJpZXNbbmFtZV0gPSBlbnRyeQogICAgcmV0dXJuIHJlc3VsdAoKCmRlZiB3cml0ZV9leHBvcnRzKGV4cG9ydHMsIHN0cmVhbSk6CiAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdID49IDM6CiAgICAgICAgIyBuZWVkcyB0byBiZSBhIHRleHQgc3RyZWFtCiAgICAgICAgc3RyZWFtID0gY29kZWNzLmdldHdyaXRlcigndXRmLTgnKShzdHJlYW0pCiAgICBjcCA9IGNvbmZpZ3BhcnNlci5Db25maWdQYXJzZXIoKQogICAgZm9yIGssIHYgaW4gZXhwb3J0cy5pdGVtcygpOgogICAgICAgICMgVE9ETyBjaGVjayBrLCB2IGZvciB2YWxpZCB2YWx1ZXMKICAgICAgICBjcC5hZGRfc2VjdGlvbihrKQogICAgICAgIGZvciBlbnRyeSBpbiB2LnZhbHVlcygpOgogICAgICAgICAgICBpZiBlbnRyeS5zdWZmaXggaXMgTm9uZToKICAgICAgICAgICAgICAgIHMgPSBlbnRyeS5wcmVmaXgKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHMgPSAnJXM6JXMnICUgKGVudHJ5LnByZWZpeCwgZW50cnkuc3VmZml4KQogICAgICAgICAgICBpZiBlbnRyeS5mbGFnczoKICAgICAgICAgICAgICAgIHMgPSAnJXMgWyVzXScgJSAocywgJywgJy5qb2luKGVudHJ5LmZsYWdzKSkKICAgICAgICAgICAgY3Auc2V0KGssIGVudHJ5Lm5hbWUsIHMpCiAgICBjcC53cml0ZShzdHJlYW0pCgoKQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKZGVmIHRlbXBkaXIoKToKICAgIHRkID0gdGVtcGZpbGUubWtkdGVtcCgpCiAgICB0cnk6CiAgICAgICAgeWllbGQgdGQKICAgIGZpbmFsbHk6CiAgICAgICAgc2h1dGlsLnJtdHJlZSh0ZCkKCkBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCmRlZiBjaGRpcihkKToKICAgIGN3ZCA9IG9zLmdldGN3ZCgpCiAgICB0cnk6CiAgICAgICAgb3MuY2hkaXIoZCkKICAgICAgICB5aWVsZAogICAgZmluYWxseToKICAgICAgICBvcy5jaGRpcihjd2QpCgoKQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKZGVmIHNvY2tldF90aW1lb3V0KHNlY29uZHM9MTUpOgogICAgY3RvID0gc29ja2V0LmdldGRlZmF1bHR0aW1lb3V0KCkKICAgIHRyeToKICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoc2Vjb25kcykKICAgICAgICB5aWVsZAogICAgZmluYWxseToKICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoY3RvKQoKCmNsYXNzIGNhY2hlZF9wcm9wZXJ0eShvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGZ1bmMpOgogICAgICAgIHNlbGYuZnVuYyA9IGZ1bmMKICAgICAgICAjZm9yIGF0dHIgaW4gKCdfX25hbWVfXycsICdfX21vZHVsZV9fJywgJ19fZG9jX18nKToKICAgICAgICAjICAgIHNldGF0dHIoc2VsZiwgYXR0ciwgZ2V0YXR0cihmdW5jLCBhdHRyLCBOb25lKSkKCiAgICBkZWYgX19nZXRfXyhzZWxmLCBvYmosIGNscz1Ob25lKToKICAgICAgICBpZiBvYmogaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYKICAgICAgICB2YWx1ZSA9IHNlbGYuZnVuYyhvYmopCiAgICAgICAgb2JqZWN0Ll9fc2V0YXR0cl9fKG9iaiwgc2VsZi5mdW5jLl9fbmFtZV9fLCB2YWx1ZSkKICAgICAgICAjb2JqLl9fZGljdF9fW3NlbGYuZnVuYy5fX25hbWVfX10gPSB2YWx1ZSA9IHNlbGYuZnVuYyhvYmopCiAgICAgICAgcmV0dXJuIHZhbHVlCgpkZWYgY29udmVydF9wYXRoKHBhdGhuYW1lKToKICAgICIiIlJldHVybiAncGF0aG5hbWUnIGFzIGEgbmFtZSB0aGF0IHdpbGwgd29yayBvbiB0aGUgbmF0aXZlIGZpbGVzeXN0ZW0uCgogICAgVGhlIHBhdGggaXMgc3BsaXQgb24gJy8nIGFuZCBwdXQgYmFjayB0b2dldGhlciBhZ2FpbiB1c2luZyB0aGUgY3VycmVudAogICAgZGlyZWN0b3J5IHNlcGFyYXRvci4gIE5lZWRlZCBiZWNhdXNlIGZpbGVuYW1lcyBpbiB0aGUgc2V0dXAgc2NyaXB0IGFyZQogICAgYWx3YXlzIHN1cHBsaWVkIGluIFVuaXggc3R5bGUsIGFuZCBoYXZlIHRvIGJlIGNvbnZlcnRlZCB0byB0aGUgbG9jYWwKICAgIGNvbnZlbnRpb24gYmVmb3JlIHdlIGNhbiBhY3R1YWxseSB1c2UgdGhlbSBpbiB0aGUgZmlsZXN5c3RlbS4gIFJhaXNlcwogICAgVmFsdWVFcnJvciBvbiBub24tVW5peC1pc2ggc3lzdGVtcyBpZiAncGF0aG5hbWUnIGVpdGhlciBzdGFydHMgb3IKICAgIGVuZHMgd2l0aCBhIHNsYXNoLgogICAgIiIiCiAgICBpZiBvcy5zZXAgPT0gJy8nOgogICAgICAgIHJldHVybiBwYXRobmFtZQogICAgaWYgbm90IHBhdGhuYW1lOgogICAgICAgIHJldHVybiBwYXRobmFtZQogICAgaWYgcGF0aG5hbWVbMF0gPT0gJy8nOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInBhdGggJyVzJyBjYW5ub3QgYmUgYWJzb2x1dGUiICUgcGF0aG5hbWUpCiAgICBpZiBwYXRobmFtZVstMV0gPT0gJy8nOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInBhdGggJyVzJyBjYW5ub3QgZW5kIHdpdGggJy8nIiAlIHBhdGhuYW1lKQoKICAgIHBhdGhzID0gcGF0aG5hbWUuc3BsaXQoJy8nKQogICAgd2hpbGUgb3MuY3VyZGlyIGluIHBhdGhzOgogICAgICAgIHBhdGhzLnJlbW92ZShvcy5jdXJkaXIpCiAgICBpZiBub3QgcGF0aHM6CiAgICAgICAgcmV0dXJuIG9zLmN1cmRpcgogICAgcmV0dXJuIG9zLnBhdGguam9pbigqcGF0aHMpCgoKY2xhc3MgRmlsZU9wZXJhdG9yKG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgZHJ5X3J1bj1GYWxzZSk6CiAgICAgICAgc2VsZi5kcnlfcnVuID0gZHJ5X3J1bgogICAgICAgIHNlbGYuZW5zdXJlZCA9IHNldCgpCiAgICAgICAgc2VsZi5faW5pdF9yZWNvcmQoKQoKICAgIGRlZiBfaW5pdF9yZWNvcmQoc2VsZik6CiAgICAgICAgc2VsZi5yZWNvcmQgPSBGYWxzZQogICAgICAgIHNlbGYuZmlsZXNfd3JpdHRlbiA9IHNldCgpCiAgICAgICAgc2VsZi5kaXJzX2NyZWF0ZWQgPSBzZXQoKQoKICAgIGRlZiByZWNvcmRfYXNfd3JpdHRlbihzZWxmLCBwYXRoKToKICAgICAgICBpZiBzZWxmLnJlY29yZDoKICAgICAgICAgICAgc2VsZi5maWxlc193cml0dGVuLmFkZChwYXRoKQoKICAgIGRlZiBuZXdlcihzZWxmLCBzb3VyY2UsIHRhcmdldCk6CiAgICAgICAgIiIiVGVsbCBpZiB0aGUgdGFyZ2V0IGlzIG5ld2VyIHRoYW4gdGhlIHNvdXJjZS4KCiAgICAgICAgUmV0dXJucyB0cnVlIGlmICdzb3VyY2UnIGV4aXN0cyBhbmQgaXMgbW9yZSByZWNlbnRseSBtb2RpZmllZCB0aGFuCiAgICAgICAgJ3RhcmdldCcsIG9yIGlmICdzb3VyY2UnIGV4aXN0cyBhbmQgJ3RhcmdldCcgZG9lc24ndC4KCiAgICAgICAgUmV0dXJucyBmYWxzZSBpZiBib3RoIGV4aXN0IGFuZCAndGFyZ2V0JyBpcyB0aGUgc2FtZSBhZ2Ugb3IgeW91bmdlcgogICAgICAgIHRoYW4gJ3NvdXJjZScuIFJhaXNlIFBhY2thZ2luZ0ZpbGVFcnJvciBpZiAnc291cmNlJyBkb2VzIG5vdCBleGlzdC4KCiAgICAgICAgTm90ZSB0aGF0IHRoaXMgdGVzdCBpcyBub3QgdmVyeSBhY2N1cmF0ZTogZmlsZXMgY3JlYXRlZCBpbiB0aGUgc2FtZQogICAgICAgIHNlY29uZCB3aWxsIGhhdmUgdGhlIHNhbWUgImFnZSIuCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNvdXJjZSk6CiAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oImZpbGUgJyVyJyBkb2VzIG5vdCBleGlzdCIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguYWJzcGF0aChzb3VyY2UpKQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyh0YXJnZXQpOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICByZXR1cm4gb3Muc3RhdChzb3VyY2UpLnN0X210aW1lID4gb3Muc3RhdCh0YXJnZXQpLnN0X210aW1lCgogICAgZGVmIGNvcHlfZmlsZShzZWxmLCBpbmZpbGUsIG91dGZpbGUsIGNoZWNrPVRydWUpOgogICAgICAgICIiIkNvcHkgYSBmaWxlIHJlc3BlY3RpbmcgZHJ5LXJ1biBhbmQgZm9yY2UgZmxhZ3MuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5lbnN1cmVfZGlyKG9zLnBhdGguZGlybmFtZShvdXRmaWxlKSkKICAgICAgICBsb2dnZXIuaW5mbygnQ29weWluZyAlcyB0byAlcycsIGluZmlsZSwgb3V0ZmlsZSkKICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICBtc2cgPSBOb25lCiAgICAgICAgICAgIGlmIGNoZWNrOgogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2xpbmsob3V0ZmlsZSk6CiAgICAgICAgICAgICAgICAgICAgbXNnID0gJyVzIGlzIGEgc3ltbGluaycgJSBvdXRmaWxlCiAgICAgICAgICAgICAgICBlbGlmIG9zLnBhdGguZXhpc3RzKG91dGZpbGUpIGFuZCBub3Qgb3MucGF0aC5pc2ZpbGUob3V0ZmlsZSk6CiAgICAgICAgICAgICAgICAgICAgbXNnID0gJyVzIGlzIGEgbm9uLXJlZ3VsYXIgZmlsZScgJSBvdXRmaWxlCiAgICAgICAgICAgIGlmIG1zZzoKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IobXNnICsgJyB3aGljaCB3b3VsZCBiZSBvdmVyd3JpdHRlbicpCiAgICAgICAgICAgIHNodXRpbC5jb3B5ZmlsZShpbmZpbGUsIG91dGZpbGUpCiAgICAgICAgc2VsZi5yZWNvcmRfYXNfd3JpdHRlbihvdXRmaWxlKQoKICAgIGRlZiBjb3B5X3N0cmVhbShzZWxmLCBpbnN0cmVhbSwgb3V0ZmlsZSwgZW5jb2Rpbmc9Tm9uZSk6CiAgICAgICAgYXNzZXJ0IG5vdCBvcy5wYXRoLmlzZGlyKG91dGZpbGUpCiAgICAgICAgc2VsZi5lbnN1cmVfZGlyKG9zLnBhdGguZGlybmFtZShvdXRmaWxlKSkKICAgICAgICBsb2dnZXIuaW5mbygnQ29weWluZyBzdHJlYW0gJXMgdG8gJXMnLCBpbnN0cmVhbSwgb3V0ZmlsZSkKICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICBpZiBlbmNvZGluZyBpcyBOb25lOgogICAgICAgICAgICAgICAgb3V0c3RyZWFtID0gb3BlbihvdXRmaWxlLCAnd2InKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgb3V0c3RyZWFtID0gY29kZWNzLm9wZW4ob3V0ZmlsZSwgJ3cnLCBlbmNvZGluZz1lbmNvZGluZykKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgc2h1dGlsLmNvcHlmaWxlb2JqKGluc3RyZWFtLCBvdXRzdHJlYW0pCiAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICBvdXRzdHJlYW0uY2xvc2UoKQogICAgICAgIHNlbGYucmVjb3JkX2FzX3dyaXR0ZW4ob3V0ZmlsZSkKCiAgICBkZWYgd3JpdGVfYmluYXJ5X2ZpbGUoc2VsZiwgcGF0aCwgZGF0YSk6CiAgICAgICAgc2VsZi5lbnN1cmVfZGlyKG9zLnBhdGguZGlybmFtZShwYXRoKSkKICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICB3aXRoIG9wZW4ocGF0aCwgJ3diJykgYXMgZjoKICAgICAgICAgICAgICAgIGYud3JpdGUoZGF0YSkKICAgICAgICBzZWxmLnJlY29yZF9hc193cml0dGVuKHBhdGgpCgogICAgZGVmIHdyaXRlX3RleHRfZmlsZShzZWxmLCBwYXRoLCBkYXRhLCBlbmNvZGluZyk6CiAgICAgICAgc2VsZi5lbnN1cmVfZGlyKG9zLnBhdGguZGlybmFtZShwYXRoKSkKICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICB3aXRoIG9wZW4ocGF0aCwgJ3diJykgYXMgZjoKICAgICAgICAgICAgICAgIGYud3JpdGUoZGF0YS5lbmNvZGUoZW5jb2RpbmcpKQogICAgICAgIHNlbGYucmVjb3JkX2FzX3dyaXR0ZW4ocGF0aCkKCiAgICBkZWYgc2V0X21vZGUoc2VsZiwgYml0cywgbWFzaywgZmlsZXMpOgogICAgICAgIGlmIG9zLm5hbWUgPT0gJ3Bvc2l4JyBvciAob3MubmFtZSA9PSAnamF2YScgYW5kIG9zLl9uYW1lID09ICdwb3NpeCcpOgogICAgICAgICAgICAjIFNldCB0aGUgZXhlY3V0YWJsZSBiaXRzIChvd25lciwgZ3JvdXAsIGFuZCB3b3JsZCkgb24KICAgICAgICAgICAgIyBhbGwgdGhlIGZpbGVzIHNwZWNpZmllZC4KICAgICAgICAgICAgZm9yIGYgaW4gZmlsZXM6CiAgICAgICAgICAgICAgICBpZiBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oImNoYW5naW5nIG1vZGUgb2YgJXMiLCBmKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBtb2RlID0gKG9zLnN0YXQoZikuc3RfbW9kZSB8IGJpdHMpICYgbWFzawogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJjaGFuZ2luZyBtb2RlIG9mICVzIHRvICVvIiwgZiwgbW9kZSkKICAgICAgICAgICAgICAgICAgICBvcy5jaG1vZChmLCBtb2RlKQoKICAgIHNldF9leGVjdXRhYmxlX21vZGUgPSBsYW1iZGEgcywgZjogcy5zZXRfbW9kZSgwbzU1NSwgMG83Nzc3LCBmKQoKICAgIGRlZiBlbnN1cmVfZGlyKHNlbGYsIHBhdGgpOgogICAgICAgIHBhdGggPSBvcy5wYXRoLmFic3BhdGgocGF0aCkKICAgICAgICBpZiBwYXRoIG5vdCBpbiBzZWxmLmVuc3VyZWQgYW5kIG5vdCBvcy5wYXRoLmV4aXN0cyhwYXRoKToKICAgICAgICAgICAgc2VsZi5lbnN1cmVkLmFkZChwYXRoKQogICAgICAgICAgICBkLCBmID0gb3MucGF0aC5zcGxpdChwYXRoKQogICAgICAgICAgICBzZWxmLmVuc3VyZV9kaXIoZCkKICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ0NyZWF0aW5nICVzJyAlIHBhdGgpCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgICAgICBvcy5ta2RpcihwYXRoKQogICAgICAgICAgICBpZiBzZWxmLnJlY29yZDoKICAgICAgICAgICAgICAgIHNlbGYuZGlyc19jcmVhdGVkLmFkZChwYXRoKQoKICAgIGRlZiBieXRlX2NvbXBpbGUoc2VsZiwgcGF0aCwgb3B0aW1pemU9RmFsc2UsIGZvcmNlPUZhbHNlLCBwcmVmaXg9Tm9uZSk6CiAgICAgICAgZHBhdGggPSBjYWNoZV9mcm9tX3NvdXJjZShwYXRoLCBub3Qgb3B0aW1pemUpCiAgICAgICAgbG9nZ2VyLmluZm8oJ0J5dGUtY29tcGlsaW5nICVzIHRvICVzJywgcGF0aCwgZHBhdGgpCiAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgaWYgZm9yY2Ugb3Igc2VsZi5uZXdlcihwYXRoLCBkcGF0aCk6CiAgICAgICAgICAgICAgICBpZiBub3QgcHJlZml4OgogICAgICAgICAgICAgICAgICAgIGRpYWdwYXRoID0gTm9uZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBhc3NlcnQgcGF0aC5zdGFydHN3aXRoKHByZWZpeCkKICAgICAgICAgICAgICAgICAgICBkaWFncGF0aCA9IHBhdGhbbGVuKHByZWZpeCk6XQogICAgICAgICAgICBweV9jb21waWxlLmNvbXBpbGUocGF0aCwgZHBhdGgsIGRpYWdwYXRoLCBUcnVlKSAgICAgIyByYWlzZSBlcnJvcgogICAgICAgIHNlbGYucmVjb3JkX2FzX3dyaXR0ZW4oZHBhdGgpCiAgICAgICAgcmV0dXJuIGRwYXRoCgogICAgZGVmIGVuc3VyZV9yZW1vdmVkKHNlbGYsIHBhdGgpOgogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHBhdGgpOgogICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKHBhdGgpIGFuZCBub3Qgb3MucGF0aC5pc2xpbmsocGF0aCk6CiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1JlbW92aW5nIGRpcmVjdG9yeSB0cmVlIGF0ICVzJywgcGF0aCkKICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShwYXRoKQogICAgICAgICAgICAgICAgaWYgc2VsZi5yZWNvcmQ6CiAgICAgICAgICAgICAgICAgICAgaWYgcGF0aCBpbiBzZWxmLmRpcnNfY3JlYXRlZDoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kaXJzX2NyZWF0ZWQucmVtb3ZlKHBhdGgpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzbGluayhwYXRoKToKICAgICAgICAgICAgICAgICAgICBzID0gJ2xpbmsnCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHMgPSAnZmlsZScKICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnUmVtb3ZpbmcgJXMgJXMnLCBzLCBwYXRoKQogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgICAgICAgICBvcy5yZW1vdmUocGF0aCkKICAgICAgICAgICAgICAgIGlmIHNlbGYucmVjb3JkOgogICAgICAgICAgICAgICAgICAgIGlmIHBhdGggaW4gc2VsZi5maWxlc193cml0dGVuOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGVzX3dyaXR0ZW4ucmVtb3ZlKHBhdGgpCgogICAgZGVmIGlzX3dyaXRhYmxlKHNlbGYsIHBhdGgpOgogICAgICAgIHJlc3VsdCA9IEZhbHNlCiAgICAgICAgd2hpbGUgbm90IHJlc3VsdDoKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocGF0aCk6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBvcy5hY2Nlc3MocGF0aCwgb3MuV19PSykKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIHBhcmVudCA9IG9zLnBhdGguZGlybmFtZShwYXRoKQogICAgICAgICAgICBpZiBwYXJlbnQgPT0gcGF0aDoKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIHBhdGggPSBwYXJlbnQKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIGNvbW1pdChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBDb21taXQgcmVjb3JkZWQgY2hhbmdlcywgdHVybiBvZmYgcmVjb3JkaW5nLCByZXR1cm4KICAgICAgICBjaGFuZ2VzLgogICAgICAgICIiIgogICAgICAgIGFzc2VydCBzZWxmLnJlY29yZAogICAgICAgIHJlc3VsdCA9IHNlbGYuZmlsZXNfd3JpdHRlbiwgc2VsZi5kaXJzX2NyZWF0ZWQKICAgICAgICBzZWxmLl9pbml0X3JlY29yZCgpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiByb2xsYmFjayhzZWxmKToKICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICBmb3IgZiBpbiBsaXN0KHNlbGYuZmlsZXNfd3JpdHRlbik6CiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhmKToKICAgICAgICAgICAgICAgICAgICBvcy5yZW1vdmUoZikKICAgICAgICAgICAgIyBkaXJzIHNob3VsZCBhbGwgYmUgZW1wdHkgbm93LCBleGNlcHQgcGVyaGFwcyBmb3IKICAgICAgICAgICAgIyBfX3B5Y2FjaGVfXyBzdWJkaXJzCiAgICAgICAgICAgICMgcmV2ZXJzZSBzbyB0aGF0IHN1YmRpcnMgYXBwZWFyIGJlZm9yZSB0aGVpciBwYXJlbnRzCiAgICAgICAgICAgIGRpcnMgPSBzb3J0ZWQoc2VsZi5kaXJzX2NyZWF0ZWQsIHJldmVyc2U9VHJ1ZSkKICAgICAgICAgICAgZm9yIGQgaW4gZGlyczoKICAgICAgICAgICAgICAgIGZsaXN0ID0gb3MubGlzdGRpcihkKQogICAgICAgICAgICAgICAgaWYgZmxpc3Q6CiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGZsaXN0ID09IFsnX19weWNhY2hlX18nXQogICAgICAgICAgICAgICAgICAgIHNkID0gb3MucGF0aC5qb2luKGQsIGZsaXN0WzBdKQogICAgICAgICAgICAgICAgICAgIG9zLnJtZGlyKHNkKQogICAgICAgICAgICAgICAgb3Mucm1kaXIoZCkgICAgICMgc2hvdWxkIGZhaWwgaWYgbm9uLWVtcHR5CiAgICAgICAgc2VsZi5faW5pdF9yZWNvcmQoKQoKZGVmIHJlc29sdmUobW9kdWxlX25hbWUsIGRvdHRlZF9wYXRoKToKICAgIGlmIG1vZHVsZV9uYW1lIGluIHN5cy5tb2R1bGVzOgogICAgICAgIG1vZCA9IHN5cy5tb2R1bGVzW21vZHVsZV9uYW1lXQogICAgZWxzZToKICAgICAgICBtb2QgPSBfX2ltcG9ydF9fKG1vZHVsZV9uYW1lKQogICAgaWYgZG90dGVkX3BhdGggaXMgTm9uZToKICAgICAgICByZXN1bHQgPSBtb2QKICAgIGVsc2U6CiAgICAgICAgcGFydHMgPSBkb3R0ZWRfcGF0aC5zcGxpdCgnLicpCiAgICAgICAgcmVzdWx0ID0gZ2V0YXR0cihtb2QsIHBhcnRzLnBvcCgwKSkKICAgICAgICBmb3IgcCBpbiBwYXJ0czoKICAgICAgICAgICAgcmVzdWx0ID0gZ2V0YXR0cihyZXN1bHQsIHApCiAgICByZXR1cm4gcmVzdWx0CgoKY2xhc3MgRXhwb3J0RW50cnkob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBwcmVmaXgsIHN1ZmZpeCwgZmxhZ3MpOgogICAgICAgIHNlbGYubmFtZSA9IG5hbWUKICAgICAgICBzZWxmLnByZWZpeCA9IHByZWZpeAogICAgICAgIHNlbGYuc3VmZml4ID0gc3VmZml4CiAgICAgICAgc2VsZi5mbGFncyA9IGZsYWdzCgogICAgQGNhY2hlZF9wcm9wZXJ0eQogICAgZGVmIHZhbHVlKHNlbGYpOgogICAgICAgIHJldHVybiByZXNvbHZlKHNlbGYucHJlZml4LCBzZWxmLnN1ZmZpeCkKCiAgICBkZWYgX19yZXByX18oc2VsZik6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICByZXR1cm4gJzxFeHBvcnRFbnRyeSAlcyA9ICVzOiVzICVzPicgJSAoc2VsZi5uYW1lLCBzZWxmLnByZWZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdWZmaXgsIHNlbGYuZmxhZ3MpCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIEV4cG9ydEVudHJ5KToKICAgICAgICAgICAgcmVzdWx0ID0gRmFsc2UKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXN1bHQgPSAoc2VsZi5uYW1lID09IG90aGVyLm5hbWUgYW5kCiAgICAgICAgICAgICAgICAgICAgICBzZWxmLnByZWZpeCA9PSBvdGhlci5wcmVmaXggYW5kCiAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN1ZmZpeCA9PSBvdGhlci5zdWZmaXggYW5kCiAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZsYWdzID09IG90aGVyLmZsYWdzKQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBfX2hhc2hfXyA9IG9iamVjdC5fX2hhc2hfXwoKCkVOVFJZX1JFID0gcmUuY29tcGlsZShyJycnKD9QPG5hbWU+KFx3fFstLitdKSspCiAgICAgICAgICAgICAgICAgICAgICBccyo9XHMqKD9QPGNhbGxhYmxlPihcdyspKFs6XC5dXHcrKSopCiAgICAgICAgICAgICAgICAgICAgICBccyooXFtccyooP1A8ZmxhZ3M+XHcrKD1cdyspPygsXHMqXHcrKD1cdyspPykqKVxzKlxdKT8KICAgICAgICAgICAgICAgICAgICAgICcnJywgcmUuVkVSQk9TRSkKCmRlZiBnZXRfZXhwb3J0X2VudHJ5KHNwZWNpZmljYXRpb24pOgogICAgbSA9IEVOVFJZX1JFLnNlYXJjaChzcGVjaWZpY2F0aW9uKQogICAgaWYgbm90IG06CiAgICAgICAgcmVzdWx0ID0gTm9uZQogICAgICAgIGlmICdbJyBpbiBzcGVjaWZpY2F0aW9uIG9yICddJyBpbiBzcGVjaWZpY2F0aW9uOgogICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCJJbnZhbGlkIHNwZWNpZmljYXRpb24gIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInJXMnIiAlIHNwZWNpZmljYXRpb24pCiAgICBlbHNlOgogICAgICAgIGQgPSBtLmdyb3VwZGljdCgpCiAgICAgICAgbmFtZSA9IGRbJ25hbWUnXQogICAgICAgIHBhdGggPSBkWydjYWxsYWJsZSddCiAgICAgICAgY29sb25zID0gcGF0aC5jb3VudCgnOicpCiAgICAgICAgaWYgY29sb25zID09IDA6CiAgICAgICAgICAgIHByZWZpeCwgc3VmZml4ID0gcGF0aCwgTm9uZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIGNvbG9ucyAhPSAxOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbigiSW52YWxpZCBzcGVjaWZpY2F0aW9uICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiclcyciICUgc3BlY2lmaWNhdGlvbikKICAgICAgICAgICAgcHJlZml4LCBzdWZmaXggPSBwYXRoLnNwbGl0KCc6JykKICAgICAgICBmbGFncyA9IGRbJ2ZsYWdzJ10KICAgICAgICBpZiBmbGFncyBpcyBOb25lOgogICAgICAgICAgICBpZiAnWycgaW4gc3BlY2lmaWNhdGlvbiBvciAnXScgaW4gc3BlY2lmaWNhdGlvbjoKICAgICAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oIkludmFsaWQgc3BlY2lmaWNhdGlvbiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInJXMnIiAlIHNwZWNpZmljYXRpb24pCiAgICAgICAgICAgIGZsYWdzID0gW10KICAgICAgICBlbHNlOgogICAgICAgICAgICBmbGFncyA9IFtmLnN0cmlwKCkgZm9yIGYgaW4gZmxhZ3Muc3BsaXQoJywnKV0KICAgICAgICByZXN1bHQgPSBFeHBvcnRFbnRyeShuYW1lLCBwcmVmaXgsIHN1ZmZpeCwgZmxhZ3MpCiAgICByZXR1cm4gcmVzdWx0CgoKZGVmIGdldF9jYWNoZV9iYXNlKHN1ZmZpeD1Ob25lKToKICAgICIiIgogICAgUmV0dXJuIHRoZSBkZWZhdWx0IGJhc2UgbG9jYXRpb24gZm9yIGRpc3RsaWIgY2FjaGVzLiBJZiB0aGUgZGlyZWN0b3J5IGRvZXMKICAgIG5vdCBleGlzdCwgaXQgaXMgY3JlYXRlZC4gVXNlIHRoZSBzdWZmaXggcHJvdmlkZWQgZm9yIHRoZSBiYXNlIGRpcmVjdG9yeSwKICAgIGFuZCBkZWZhdWx0IHRvICcuZGlzdGxpYicgaWYgaXQgaXNuJ3QgcHJvdmlkZWQuCgogICAgT24gV2luZG93cywgaWYgTE9DQUxBUFBEQVRBIGlzIGRlZmluZWQgaW4gdGhlIGVudmlyb25tZW50LCB0aGVuIGl0IGlzCiAgICBhc3N1bWVkIHRvIGJlIGEgZGlyZWN0b3J5LCBhbmQgd2lsbCBiZSB0aGUgcGFyZW50IGRpcmVjdG9yeSBvZiB0aGUgcmVzdWx0LgogICAgT24gUE9TSVgsIGFuZCBvbiBXaW5kb3dzIGlmIExPQ0FMQVBQREFUQSBpcyBub3QgZGVmaW5lZCwgdGhlIHVzZXIncyBob21lCiAgICBkaXJlY3RvcnkgLSB1c2luZyBvcy5leHBhbmR1c2VyKCd+JykgLSB3aWxsIGJlIHRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mCiAgICB0aGUgcmVzdWx0LgoKICAgIFRoZSByZXN1bHQgaXMganVzdCB0aGUgZGlyZWN0b3J5ICcuZGlzdGxpYicgaW4gdGhlIHBhcmVudCBkaXJlY3RvcnkgYXMKICAgIGRldGVybWluZWQgYWJvdmUsIG9yIHdpdGggdGhlIG5hbWUgc3BlY2lmaWVkIHdpdGggYGBzdWZmaXhgYC4KICAgICIiIgogICAgaWYgc3VmZml4IGlzIE5vbmU6CiAgICAgICAgc3VmZml4ID0gJy5kaXN0bGliJwogICAgaWYgb3MubmFtZSA9PSAnbnQnIGFuZCAnTE9DQUxBUFBEQVRBJyBpbiBvcy5lbnZpcm9uOgogICAgICAgIHJlc3VsdCA9IG9zLnBhdGguZXhwYW5kdmFycygnJGxvY2FsYXBwZGF0YScpCiAgICBlbHNlOgogICAgICAgICMgQXNzdW1lIHBvc2l4LCBvciBvbGQgV2luZG93cwogICAgICAgIHJlc3VsdCA9IG9zLnBhdGguZXhwYW5kdXNlcignficpCiAgICAjIHdlIHVzZSAnaXNkaXInIGluc3RlYWQgb2YgJ2V4aXN0cycsIGJlY2F1c2Ugd2Ugd2FudCB0bwogICAgIyBmYWlsIGlmIHRoZXJlJ3MgYSBmaWxlIHdpdGggdGhhdCBuYW1lCiAgICBpZiBvcy5wYXRoLmlzZGlyKHJlc3VsdCk6CiAgICAgICAgdXNhYmxlID0gb3MuYWNjZXNzKHJlc3VsdCwgb3MuV19PSykKICAgICAgICBpZiBub3QgdXNhYmxlOgogICAgICAgICAgICBsb2dnZXIud2FybmluZygnRGlyZWN0b3J5IGV4aXN0cyBidXQgaXMgbm90IHdyaXRhYmxlOiAlcycsIHJlc3VsdCkKICAgIGVsc2U6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBvcy5tYWtlZGlycyhyZXN1bHQpCiAgICAgICAgICAgIHVzYWJsZSA9IFRydWUKICAgICAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ1VuYWJsZSB0byBjcmVhdGUgJXMnLCByZXN1bHQsIGV4Y19pbmZvPVRydWUpCiAgICAgICAgICAgIHVzYWJsZSA9IEZhbHNlCiAgICBpZiBub3QgdXNhYmxlOgogICAgICAgIHJlc3VsdCA9IHRlbXBmaWxlLm1rZHRlbXAoKQogICAgICAgIGxvZ2dlci53YXJuaW5nKCdEZWZhdWx0IGxvY2F0aW9uIHVudXNhYmxlLCB1c2luZyAlcycsIHJlc3VsdCkKICAgIHJldHVybiBvcy5wYXRoLmpvaW4ocmVzdWx0LCBzdWZmaXgpCgoKZGVmIHBhdGhfdG9fY2FjaGVfZGlyKHBhdGgpOgogICAgIiIiCiAgICBDb252ZXJ0IGFuIGFic29sdXRlIHBhdGggdG8gYSBkaXJlY3RvcnkgbmFtZSBmb3IgdXNlIGluIGEgY2FjaGUuCgogICAgVGhlIGFsZ29yaXRobSB1c2VkIGlzOgoKICAgICMuIE9uIFdpbmRvd3MsIGFueSBgYCc6J2BgIGluIHRoZSBkcml2ZSBpcyByZXBsYWNlZCB3aXRoIGBgJy0tLSdgYC4KICAgICMuIEFueSBvY2N1cnJlbmNlIG9mIGBgb3Muc2VwYGAgaXMgcmVwbGFjZWQgd2l0aCBgYCctLSdgYC4KICAgICMuIGBgJy5jYWNoZSdgYCBpcyBhcHBlbmRlZC4KICAgICIiIgogICAgZCwgcCA9IG9zLnBhdGguc3BsaXRkcml2ZShvcy5wYXRoLmFic3BhdGgocGF0aCkpCiAgICBpZiBkOgogICAgICAgIGQgPSBkLnJlcGxhY2UoJzonLCAnLS0tJykKICAgIHAgPSBwLnJlcGxhY2Uob3Muc2VwLCAnLS0nKQogICAgcmV0dXJuIGQgKyBwICsgJy5jYWNoZScKCgpkZWYgZW5zdXJlX3NsYXNoKHMpOgogICAgaWYgbm90IHMuZW5kc3dpdGgoJy8nKToKICAgICAgICByZXR1cm4gcyArICcvJwogICAgcmV0dXJuIHMKCgpkZWYgcGFyc2VfY3JlZGVudGlhbHMobmV0bG9jKToKICAgIHVzZXJuYW1lID0gcGFzc3dvcmQgPSBOb25lCiAgICBpZiAnQCcgaW4gbmV0bG9jOgogICAgICAgIHByZWZpeCwgbmV0bG9jID0gbmV0bG9jLnNwbGl0KCdAJywgMSkKICAgICAgICBpZiAnOicgbm90IGluIHByZWZpeDoKICAgICAgICAgICAgdXNlcm5hbWUgPSBwcmVmaXgKICAgICAgICBlbHNlOgogICAgICAgICAgICB1c2VybmFtZSwgcGFzc3dvcmQgPSBwcmVmaXguc3BsaXQoJzonLCAxKQogICAgcmV0dXJuIHVzZXJuYW1lLCBwYXNzd29yZCwgbmV0bG9jCgoKZGVmIGdldF9wcm9jZXNzX3VtYXNrKCk6CiAgICByZXN1bHQgPSBvcy51bWFzaygwbzIyKQogICAgb3MudW1hc2socmVzdWx0KQogICAgcmV0dXJuIHJlc3VsdAoKZGVmIGlzX3N0cmluZ19zZXF1ZW5jZShzZXEpOgogICAgcmVzdWx0ID0gVHJ1ZQogICAgaSA9IE5vbmUKICAgIGZvciBpLCBzIGluIGVudW1lcmF0ZShzZXEpOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHMsIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgIHJlc3VsdCA9IEZhbHNlCiAgICAgICAgICAgIGJyZWFrCiAgICBhc3NlcnQgaSBpcyBub3QgTm9uZQogICAgcmV0dXJuIHJlc3VsdAoKUFJPSkVDVF9OQU1FX0FORF9WRVJTSU9OID0gcmUuY29tcGlsZSgnKFthLXowLTlfXSsoWy4tXVthLXpfXVthLXowLTlfXSopKiktJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcoW2EtejAtOV8uKy1dKyknLCByZS5JKQpQWVRIT05fVkVSU0lPTiA9IHJlLmNvbXBpbGUocictcHkoXGRcLj9cZD8pJykKCgpkZWYgc3BsaXRfZmlsZW5hbWUoZmlsZW5hbWUsIHByb2plY3RfbmFtZT1Ob25lKToKICAgICIiIgogICAgRXh0cmFjdCBuYW1lLCB2ZXJzaW9uLCBweXRob24gdmVyc2lvbiBmcm9tIGEgZmlsZW5hbWUgKG5vIGV4dGVuc2lvbikKCiAgICBSZXR1cm4gbmFtZSwgdmVyc2lvbiwgcHl2ZXIgb3IgTm9uZQogICAgIiIiCiAgICByZXN1bHQgPSBOb25lCiAgICBweXZlciA9IE5vbmUKICAgIGZpbGVuYW1lID0gdW5xdW90ZShmaWxlbmFtZSkucmVwbGFjZSgnICcsICctJykKICAgIG0gPSBQWVRIT05fVkVSU0lPTi5zZWFyY2goZmlsZW5hbWUpCiAgICBpZiBtOgogICAgICAgIHB5dmVyID0gbS5ncm91cCgxKQogICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWVbOm0uc3RhcnQoKV0KICAgIGlmIHByb2plY3RfbmFtZSBhbmQgbGVuKGZpbGVuYW1lKSA+IGxlbihwcm9qZWN0X25hbWUpICsgMToKICAgICAgICBtID0gcmUubWF0Y2gocmUuZXNjYXBlKHByb2plY3RfbmFtZSkgKyByJ1xiJywgZmlsZW5hbWUpCiAgICAgICAgaWYgbToKICAgICAgICAgICAgbiA9IG0uZW5kKCkKICAgICAgICAgICAgcmVzdWx0ID0gZmlsZW5hbWVbOm5dLCBmaWxlbmFtZVtuICsgMTpdLCBweXZlcgogICAgaWYgcmVzdWx0IGlzIE5vbmU6CiAgICAgICAgbSA9IFBST0pFQ1RfTkFNRV9BTkRfVkVSU0lPTi5tYXRjaChmaWxlbmFtZSkKICAgICAgICBpZiBtOgogICAgICAgICAgICByZXN1bHQgPSBtLmdyb3VwKDEpLCBtLmdyb3VwKDMpLCBweXZlcgogICAgcmV0dXJuIHJlc3VsdAoKIyBBbGxvdyBzcGFjZXMgaW4gbmFtZSBiZWNhdXNlIG9mIGxlZ2FjeSBkaXN0cyBsaWtlICJUd2lzdGVkIENvcmUiCk5BTUVfVkVSU0lPTl9SRSA9IHJlLmNvbXBpbGUocicoP1A8bmFtZT5bXHcgLi1dKylccyonCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcidcKFxzKig/UDx2ZXI+W15ccyldKylcKSQnKQoKZGVmIHBhcnNlX25hbWVfYW5kX3ZlcnNpb24ocCk6CiAgICAiIiIKICAgIEEgdXRpbGl0eSBtZXRob2QgdXNlZCB0byBnZXQgbmFtZSBhbmQgdmVyc2lvbiBmcm9tIGEgc3RyaW5nLgoKICAgIEZyb20gZS5nLiBhIFByb3ZpZGVzLURpc3QgdmFsdWUuCgogICAgOnBhcmFtIHA6IEEgdmFsdWUgaW4gYSBmb3JtICdmb28gKDEuMCknCiAgICA6cmV0dXJuOiBUaGUgbmFtZSBhbmQgdmVyc2lvbiBhcyBhIHR1cGxlLgogICAgIiIiCiAgICBtID0gTkFNRV9WRVJTSU9OX1JFLm1hdGNoKHApCiAgICBpZiBub3QgbToKICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdJbGwtZm9ybWVkIG5hbWUvdmVyc2lvbiBzdHJpbmc6IFwnJXNcJycgJSBwKQogICAgZCA9IG0uZ3JvdXBkaWN0KCkKICAgIHJldHVybiBkWyduYW1lJ10uc3RyaXAoKS5sb3dlcigpLCBkWyd2ZXInXQoKZGVmIGdldF9leHRyYXMocmVxdWVzdGVkLCBhdmFpbGFibGUpOgogICAgcmVzdWx0ID0gc2V0KCkKICAgIHJlcXVlc3RlZCA9IHNldChyZXF1ZXN0ZWQgb3IgW10pCiAgICBhdmFpbGFibGUgPSBzZXQoYXZhaWxhYmxlIG9yIFtdKQogICAgaWYgJyonIGluIHJlcXVlc3RlZDoKICAgICAgICByZXF1ZXN0ZWQucmVtb3ZlKCcqJykKICAgICAgICByZXN1bHQgfD0gYXZhaWxhYmxlCiAgICBmb3IgciBpbiByZXF1ZXN0ZWQ6CiAgICAgICAgaWYgciA9PSAnLSc6CiAgICAgICAgICAgIHJlc3VsdC5hZGQocikKICAgICAgICBlbGlmIHIuc3RhcnRzd2l0aCgnLScpOgogICAgICAgICAgICB1bndhbnRlZCA9IHJbMTpdCiAgICAgICAgICAgIGlmIHVud2FudGVkIG5vdCBpbiBhdmFpbGFibGU6CiAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygndW5kZWNsYXJlZCBleHRyYTogJXMnICUgdW53YW50ZWQpCiAgICAgICAgICAgIGlmIHVud2FudGVkIGluIHJlc3VsdDoKICAgICAgICAgICAgICAgIHJlc3VsdC5yZW1vdmUodW53YW50ZWQpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgciBub3QgaW4gYXZhaWxhYmxlOgogICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ3VuZGVjbGFyZWQgZXh0cmE6ICVzJyAlIHIpCiAgICAgICAgICAgIHJlc3VsdC5hZGQocikKICAgIHJldHVybiByZXN1bHQKIwojIEV4dGVuZGVkIG1ldGFkYXRhIGZ1bmN0aW9uYWxpdHkKIwoKZGVmIF9nZXRfZXh0ZXJuYWxfZGF0YSh1cmwpOgogICAgcmVzdWx0ID0ge30KICAgIHRyeToKICAgICAgICAjIHVybG9wZW4gbWlnaHQgZmFpbCBpZiBpdCBydW5zIGludG8gcmVkaXJlY3Rpb25zLAogICAgICAgICMgYmVjYXVzZSBvZiBQeXRob24gaXNzdWUgIzEzNjk2LiBGaXhlZCBpbiBsb2NhdG9ycwogICAgICAgICMgdXNpbmcgYSBjdXN0b20gcmVkaXJlY3QgaGFuZGxlci4KICAgICAgICByZXNwID0gdXJsb3Blbih1cmwpCiAgICAgICAgaGVhZGVycyA9IHJlc3AuaW5mbygpCiAgICAgICAgY3QgPSBoZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJykKICAgICAgICBpZiBub3QgY3Quc3RhcnRzd2l0aCgnYXBwbGljYXRpb24vanNvbicpOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1VuZXhwZWN0ZWQgcmVzcG9uc2UgZm9yIEpTT04gcmVxdWVzdDogJXMnLCBjdCkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZWFkZXIgPSBjb2RlY3MuZ2V0cmVhZGVyKCd1dGYtOCcpKHJlc3ApCiAgICAgICAgICAgICNkYXRhID0gcmVhZGVyLnJlYWQoKS5kZWNvZGUoJ3V0Zi04JykKICAgICAgICAgICAgI3Jlc3VsdCA9IGpzb24ubG9hZHMoZGF0YSkKICAgICAgICAgICAgcmVzdWx0ID0ganNvbi5sb2FkKHJlYWRlcikKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKCdGYWlsZWQgdG8gZ2V0IGV4dGVybmFsIGRhdGEgZm9yICVzOiAlcycsIHVybCwgZSkKICAgIHJldHVybiByZXN1bHQKCl9leHRlcm5hbF9kYXRhX2Jhc2VfdXJsID0gJ2h0dHBzOi8vd3d3LnJlZC1kb3ZlLmNvbS9weXBpL3Byb2plY3RzLycKCmRlZiBnZXRfcHJvamVjdF9kYXRhKG5hbWUpOgogICAgdXJsID0gJyVzLyVzL3Byb2plY3QuanNvbicgJSAobmFtZVswXS51cHBlcigpLCBuYW1lKQogICAgdXJsID0gdXJsam9pbihfZXh0ZXJuYWxfZGF0YV9iYXNlX3VybCwgdXJsKQogICAgcmVzdWx0ID0gX2dldF9leHRlcm5hbF9kYXRhKHVybCkKICAgIHJldHVybiByZXN1bHQKCmRlZiBnZXRfcGFja2FnZV9kYXRhKG5hbWUsIHZlcnNpb24pOgogICAgdXJsID0gJyVzLyVzL3BhY2thZ2UtJXMuanNvbicgJSAobmFtZVswXS51cHBlcigpLCBuYW1lLCB2ZXJzaW9uKQogICAgdXJsID0gdXJsam9pbihfZXh0ZXJuYWxfZGF0YV9iYXNlX3VybCwgdXJsKQogICAgcmV0dXJuIF9nZXRfZXh0ZXJuYWxfZGF0YSh1cmwpCgoKY2xhc3MgQ2FjaGUob2JqZWN0KToKICAgICIiIgogICAgQSBjbGFzcyBpbXBsZW1lbnRpbmcgYSBjYWNoZSBmb3IgcmVzb3VyY2VzIHRoYXQgbmVlZCB0byBsaXZlIGluIHRoZSBmaWxlIHN5c3RlbQogICAgZS5nLiBzaGFyZWQgbGlicmFyaWVzLiBUaGlzIGNsYXNzIHdhcyBtb3ZlZCBmcm9tIHJlc291cmNlcyB0byBoZXJlIGJlY2F1c2UgaXQKICAgIGNvdWxkIGJlIHVzZWQgYnkgb3RoZXIgbW9kdWxlcywgZS5nLiB0aGUgd2hlZWwgbW9kdWxlLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGJhc2UpOgogICAgICAgICIiIgogICAgICAgIEluaXRpYWxpc2UgYW4gaW5zdGFuY2UuCgogICAgICAgIDpwYXJhbSBiYXNlOiBUaGUgYmFzZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGNhY2hlIHNob3VsZCBiZSBsb2NhdGVkLgogICAgICAgICIiIgogICAgICAgICMgd2UgdXNlICdpc2RpcicgaW5zdGVhZCBvZiAnZXhpc3RzJywgYmVjYXVzZSB3ZSB3YW50IHRvCiAgICAgICAgIyBmYWlsIGlmIHRoZXJlJ3MgYSBmaWxlIHdpdGggdGhhdCBuYW1lCiAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIoYmFzZSk6ICAjIHByYWdtYTogbm8gY292ZXIKICAgICAgICAgICAgb3MubWFrZWRpcnMoYmFzZSkKICAgICAgICBpZiAob3Muc3RhdChiYXNlKS5zdF9tb2RlICYgMG83NykgIT0gMDoKICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ0RpcmVjdG9yeSBcJyVzXCcgaXMgbm90IHByaXZhdGUnLCBiYXNlKQogICAgICAgIHNlbGYuYmFzZSA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLm5vcm1wYXRoKGJhc2UpKQoKICAgIGRlZiBwcmVmaXhfdG9fZGlyKHNlbGYsIHByZWZpeCk6CiAgICAgICAgIiIiCiAgICAgICAgQ29udmVydHMgYSByZXNvdXJjZSBwcmVmaXggdG8gYSBkaXJlY3RvcnkgbmFtZSBpbiB0aGUgY2FjaGUuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHBhdGhfdG9fY2FjaGVfZGlyKHByZWZpeCkKCiAgICBkZWYgY2xlYXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgQ2xlYXIgdGhlIGNhY2hlLgogICAgICAgICIiIgogICAgICAgIG5vdF9yZW1vdmVkID0gW10KICAgICAgICBmb3IgZm4gaW4gb3MubGlzdGRpcihzZWxmLmJhc2UpOgogICAgICAgICAgICBmbiA9IG9zLnBhdGguam9pbihzZWxmLmJhc2UsIGZuKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzbGluayhmbikgb3Igb3MucGF0aC5pc2ZpbGUoZm4pOgogICAgICAgICAgICAgICAgICAgIG9zLnJlbW92ZShmbikKICAgICAgICAgICAgICAgIGVsaWYgb3MucGF0aC5pc2Rpcihmbik6CiAgICAgICAgICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShmbikKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgIG5vdF9yZW1vdmVkLmFwcGVuZChmbikKICAgICAgICByZXR1cm4gbm90X3JlbW92ZWQKCgpjbGFzcyBFdmVudE1peGluKG9iamVjdCk6CiAgICAiIiIKICAgIEEgdmVyeSBzaW1wbGUgcHVibGlzaC9zdWJzY3JpYmUgc3lzdGVtLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc2VsZi5fc3Vic2NyaWJlcnMgPSB7fQoKICAgIGRlZiBhZGQoc2VsZiwgZXZlbnQsIHN1YnNjcmliZXIsIGFwcGVuZD1UcnVlKToKICAgICAgICAiIiIKICAgICAgICBBZGQgYSBzdWJzY3JpYmVyIGZvciBhbiBldmVudC4KCiAgICAgICAgOnBhcmFtIGV2ZW50OiBUaGUgbmFtZSBvZiBhbiBldmVudC4KICAgICAgICA6cGFyYW0gc3Vic2NyaWJlcjogVGhlIHN1YnNjcmliZXIgdG8gYmUgYWRkZWQgKGFuZCBjYWxsZWQgd2hlbiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQgaXMgcHVibGlzaGVkKS4KICAgICAgICA6cGFyYW0gYXBwZW5kOiBXaGV0aGVyIHRvIGFwcGVuZCBvciBwcmVwZW5kIHRoZSBzdWJzY3JpYmVyIHRvIGFuCiAgICAgICAgICAgICAgICAgICAgICAgZXhpc3Rpbmcgc3Vic2NyaWJlciBsaXN0IGZvciB0aGUgZXZlbnQuCiAgICAgICAgIiIiCiAgICAgICAgc3VicyA9IHNlbGYuX3N1YnNjcmliZXJzCiAgICAgICAgaWYgZXZlbnQgbm90IGluIHN1YnM6CiAgICAgICAgICAgIHN1YnNbZXZlbnRdID0gZGVxdWUoW3N1YnNjcmliZXJdKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNxID0gc3Vic1tldmVudF0KICAgICAgICAgICAgaWYgYXBwZW5kOgogICAgICAgICAgICAgICAgc3EuYXBwZW5kKHN1YnNjcmliZXIpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzcS5hcHBlbmRsZWZ0KHN1YnNjcmliZXIpCgogICAgZGVmIHJlbW92ZShzZWxmLCBldmVudCwgc3Vic2NyaWJlcik6CiAgICAgICAgIiIiCiAgICAgICAgUmVtb3ZlIGEgc3Vic2NyaWJlciBmb3IgYW4gZXZlbnQuCgogICAgICAgIDpwYXJhbSBldmVudDogVGhlIG5hbWUgb2YgYW4gZXZlbnQuCiAgICAgICAgOnBhcmFtIHN1YnNjcmliZXI6IFRoZSBzdWJzY3JpYmVyIHRvIGJlIHJlbW92ZWQuCiAgICAgICAgIiIiCiAgICAgICAgc3VicyA9IHNlbGYuX3N1YnNjcmliZXJzCiAgICAgICAgaWYgZXZlbnQgbm90IGluIHN1YnM6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ05vIHN1YnNjcmliZXJzOiAlcicgJSBldmVudCkKICAgICAgICBzdWJzW2V2ZW50XS5yZW1vdmUoc3Vic2NyaWJlcikKCiAgICBkZWYgZ2V0X3N1YnNjcmliZXJzKHNlbGYsIGV2ZW50KToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gYW4gaXRlcmF0b3IgZm9yIHRoZSBzdWJzY3JpYmVycyBmb3IgYW4gZXZlbnQuCiAgICAgICAgOnBhcmFtIGV2ZW50OiBUaGUgZXZlbnQgdG8gcmV0dXJuIHN1YnNjcmliZXJzIGZvci4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gaXRlcihzZWxmLl9zdWJzY3JpYmVycy5nZXQoZXZlbnQsICgpKSkKCiAgICBkZWYgcHVibGlzaChzZWxmLCBldmVudCwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAiIiIKICAgICAgICBQdWJsaXNoIGEgZXZlbnQgYW5kIHJldHVybiBhIGxpc3Qgb2YgdmFsdWVzIHJldHVybmVkIGJ5IGl0cwogICAgICAgIHN1YnNjcmliZXJzLgoKICAgICAgICA6cGFyYW0gZXZlbnQ6IFRoZSBldmVudCB0byBwdWJsaXNoLgogICAgICAgIDpwYXJhbSBhcmdzOiBUaGUgcG9zaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgZXZlbnQncwogICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVycy4KICAgICAgICA6cGFyYW0ga3dhcmdzOiBUaGUga2V5d29yZCBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgZXZlbnQncwogICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXJzLgogICAgICAgICIiIgogICAgICAgIHJlc3VsdCA9IFtdCiAgICAgICAgZm9yIHN1YnNjcmliZXIgaW4gc2VsZi5nZXRfc3Vic2NyaWJlcnMoZXZlbnQpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICB2YWx1ZSA9IHN1YnNjcmliZXIoZXZlbnQsICphcmdzLCAqKmt3YXJncykKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgIGxvZ2dlci5leGNlcHRpb24oJ0V4Y2VwdGlvbiBkdXJpbmcgZXZlbnQgcHVibGljYXRpb24nKQogICAgICAgICAgICAgICAgdmFsdWUgPSBOb25lCiAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQodmFsdWUpCiAgICAgICAgbG9nZ2VyLmRlYnVnKCdwdWJsaXNoICVzOiBhcmdzID0gJXMsIGt3YXJncyA9ICVzLCByZXN1bHQgPSAlcycsCiAgICAgICAgICAgICAgICAgICAgIGV2ZW50LCBhcmdzLCBrd2FyZ3MsIHJlc3VsdCkKICAgICAgICByZXR1cm4gcmVzdWx0CgojCiMgU2ltcGxlIHNlcXVlbmNpbmcKIwpjbGFzcyBTZXF1ZW5jZXIob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLl9wcmVkcyA9IHt9CiAgICAgICAgc2VsZi5fc3VjY3MgPSB7fQogICAgICAgIHNlbGYuX25vZGVzID0gc2V0KCkgICAgICMgbm9kZXMgd2l0aCBubyBwcmVkcy9zdWNjcwoKICAgIGRlZiBhZGRfbm9kZShzZWxmLCBub2RlKToKICAgICAgICBzZWxmLl9ub2Rlcy5hZGQobm9kZSkKCiAgICBkZWYgcmVtb3ZlX25vZGUoc2VsZiwgbm9kZSwgZWRnZXM9RmFsc2UpOgogICAgICAgIGlmIG5vZGUgaW4gc2VsZi5fbm9kZXM6CiAgICAgICAgICAgIHNlbGYuX25vZGVzLnJlbW92ZShub2RlKQogICAgICAgIGlmIGVkZ2VzOgogICAgICAgICAgICBmb3IgcCBpbiBzZXQoc2VsZi5fcHJlZHMuZ2V0KG5vZGUsICgpKSk6CiAgICAgICAgICAgICAgICBzZWxmLnJlbW92ZShwLCBub2RlKQogICAgICAgICAgICBmb3IgcyBpbiBzZXQoc2VsZi5fc3VjY3MuZ2V0KG5vZGUsICgpKSk6CiAgICAgICAgICAgICAgICBzZWxmLnJlbW92ZShub2RlLCBzKQogICAgICAgICAgICAjIFJlbW92ZSBlbXB0aWVzCiAgICAgICAgICAgIGZvciBrLCB2IGluIGxpc3Qoc2VsZi5fcHJlZHMuaXRlbXMoKSk6CiAgICAgICAgICAgICAgICBpZiBub3QgdjoKICAgICAgICAgICAgICAgICAgICBkZWwgc2VsZi5fcHJlZHNba10KICAgICAgICAgICAgZm9yIGssIHYgaW4gbGlzdChzZWxmLl9zdWNjcy5pdGVtcygpKToKICAgICAgICAgICAgICAgIGlmIG5vdCB2OgogICAgICAgICAgICAgICAgICAgIGRlbCBzZWxmLl9zdWNjc1trXQoKICAgIGRlZiBhZGQoc2VsZiwgcHJlZCwgc3VjYyk6CiAgICAgICAgYXNzZXJ0IHByZWQgIT0gc3VjYwogICAgICAgIHNlbGYuX3ByZWRzLnNldGRlZmF1bHQoc3VjYywgc2V0KCkpLmFkZChwcmVkKQogICAgICAgIHNlbGYuX3N1Y2NzLnNldGRlZmF1bHQocHJlZCwgc2V0KCkpLmFkZChzdWNjKQoKICAgIGRlZiByZW1vdmUoc2VsZiwgcHJlZCwgc3VjYyk6CiAgICAgICAgYXNzZXJ0IHByZWQgIT0gc3VjYwogICAgICAgIHRyeToKICAgICAgICAgICAgcHJlZHMgPSBzZWxmLl9wcmVkc1tzdWNjXQogICAgICAgICAgICBzdWNjcyA9IHNlbGYuX3N1Y2NzW3ByZWRdCiAgICAgICAgZXhjZXB0IEtleUVycm9yOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJyVyIG5vdCBhIHN1Y2Nlc3NvciBvZiBhbnl0aGluZycgJSBzdWNjKQogICAgICAgIHRyeToKICAgICAgICAgICAgcHJlZHMucmVtb3ZlKHByZWQpCiAgICAgICAgICAgIHN1Y2NzLnJlbW92ZShzdWNjKQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCclciBub3QgYSBzdWNjZXNzb3Igb2YgJXInICUgKHN1Y2MsIHByZWQpKQoKICAgIGRlZiBpc19zdGVwKHNlbGYsIHN0ZXApOgogICAgICAgIHJldHVybiAoc3RlcCBpbiBzZWxmLl9wcmVkcyBvciBzdGVwIGluIHNlbGYuX3N1Y2NzIG9yCiAgICAgICAgICAgICAgICBzdGVwIGluIHNlbGYuX25vZGVzKQoKICAgIGRlZiBnZXRfc3RlcHMoc2VsZiwgZmluYWwpOgogICAgICAgIGlmIG5vdCBzZWxmLmlzX3N0ZXAoZmluYWwpOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmtub3duOiAlcicgJSBmaW5hbCkKICAgICAgICByZXN1bHQgPSBbXQogICAgICAgIHRvZG8gPSBbXQogICAgICAgIHNlZW4gPSBzZXQoKQogICAgICAgIHRvZG8uYXBwZW5kKGZpbmFsKQogICAgICAgIHdoaWxlIHRvZG86CiAgICAgICAgICAgIHN0ZXAgPSB0b2RvLnBvcCgwKQogICAgICAgICAgICBpZiBzdGVwIGluIHNlZW46CiAgICAgICAgICAgICAgICAjIGlmIGEgc3RlcCB3YXMgYWxyZWFkeSBzZWVuLAogICAgICAgICAgICAgICAgIyBtb3ZlIGl0IHRvIHRoZSBlbmQgKHNvIGl0IHdpbGwgYXBwZWFyIGVhcmxpZXIKICAgICAgICAgICAgICAgICMgd2hlbiByZXZlcnNlZCBvbiByZXR1cm4pIC4uLiBidXQgbm90IGZvciB0aGUKICAgICAgICAgICAgICAgICMgZmluYWwgc3RlcCwgYXMgdGhhdCB3b3VsZCBiZSBjb25mdXNpbmcgZm9yCiAgICAgICAgICAgICAgICAjIHVzZXJzCiAgICAgICAgICAgICAgICBpZiBzdGVwICE9IGZpbmFsOgogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5yZW1vdmUoc3RlcCkKICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHN0ZXApCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWVuLmFkZChzdGVwKQogICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChzdGVwKQogICAgICAgICAgICAgICAgcHJlZHMgPSBzZWxmLl9wcmVkcy5nZXQoc3RlcCwgKCkpCiAgICAgICAgICAgICAgICB0b2RvLmV4dGVuZChwcmVkcykKICAgICAgICByZXR1cm4gcmV2ZXJzZWQocmVzdWx0KQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHN0cm9uZ19jb25uZWN0aW9ucyhzZWxmKToKICAgICAgICAjaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9UYXJqYW4lMjdzX3N0cm9uZ2x5X2Nvbm5lY3RlZF9jb21wb25lbnRzX2FsZ29yaXRobQogICAgICAgIGluZGV4X2NvdW50ZXIgPSBbMF0KICAgICAgICBzdGFjayA9IFtdCiAgICAgICAgbG93bGlua3MgPSB7fQogICAgICAgIGluZGV4ID0ge30KICAgICAgICByZXN1bHQgPSBbXQoKICAgICAgICBncmFwaCA9IHNlbGYuX3N1Y2NzCgogICAgICAgIGRlZiBzdHJvbmdjb25uZWN0KG5vZGUpOgogICAgICAgICAgICAjIHNldCB0aGUgZGVwdGggaW5kZXggZm9yIHRoaXMgbm9kZSB0byB0aGUgc21hbGxlc3QgdW51c2VkIGluZGV4CiAgICAgICAgICAgIGluZGV4W25vZGVdID0gaW5kZXhfY291bnRlclswXQogICAgICAgICAgICBsb3dsaW5rc1tub2RlXSA9IGluZGV4X2NvdW50ZXJbMF0KICAgICAgICAgICAgaW5kZXhfY291bnRlclswXSArPSAxCiAgICAgICAgICAgIHN0YWNrLmFwcGVuZChub2RlKQoKICAgICAgICAgICAgIyBDb25zaWRlciBzdWNjZXNzb3JzCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHN1Y2Nlc3NvcnMgPSBncmFwaFtub2RlXQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgc3VjY2Vzc29ycyA9IFtdCiAgICAgICAgICAgIGZvciBzdWNjZXNzb3IgaW4gc3VjY2Vzc29yczoKICAgICAgICAgICAgICAgIGlmIHN1Y2Nlc3NvciBub3QgaW4gbG93bGlua3M6CiAgICAgICAgICAgICAgICAgICAgIyBTdWNjZXNzb3IgaGFzIG5vdCB5ZXQgYmVlbiB2aXNpdGVkCiAgICAgICAgICAgICAgICAgICAgc3Ryb25nY29ubmVjdChzdWNjZXNzb3IpCiAgICAgICAgICAgICAgICAgICAgbG93bGlua3Nbbm9kZV0gPSBtaW4obG93bGlua3Nbbm9kZV0sbG93bGlua3Nbc3VjY2Vzc29yXSkKICAgICAgICAgICAgICAgIGVsaWYgc3VjY2Vzc29yIGluIHN0YWNrOgogICAgICAgICAgICAgICAgICAgICMgdGhlIHN1Y2Nlc3NvciBpcyBpbiB0aGUgc3RhY2sgYW5kIGhlbmNlIGluIHRoZSBjdXJyZW50CiAgICAgICAgICAgICAgICAgICAgIyBzdHJvbmdseSBjb25uZWN0ZWQgY29tcG9uZW50IChTQ0MpCiAgICAgICAgICAgICAgICAgICAgbG93bGlua3Nbbm9kZV0gPSBtaW4obG93bGlua3Nbbm9kZV0saW5kZXhbc3VjY2Vzc29yXSkKCiAgICAgICAgICAgICMgSWYgYG5vZGVgIGlzIGEgcm9vdCBub2RlLCBwb3AgdGhlIHN0YWNrIGFuZCBnZW5lcmF0ZSBhbiBTQ0MKICAgICAgICAgICAgaWYgbG93bGlua3Nbbm9kZV0gPT0gaW5kZXhbbm9kZV06CiAgICAgICAgICAgICAgICBjb25uZWN0ZWRfY29tcG9uZW50ID0gW10KCiAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NvciA9IHN0YWNrLnBvcCgpCiAgICAgICAgICAgICAgICAgICAgY29ubmVjdGVkX2NvbXBvbmVudC5hcHBlbmQoc3VjY2Vzc29yKQogICAgICAgICAgICAgICAgICAgIGlmIHN1Y2Nlc3NvciA9PSBub2RlOiBicmVhawogICAgICAgICAgICAgICAgY29tcG9uZW50ID0gdHVwbGUoY29ubmVjdGVkX2NvbXBvbmVudCkKICAgICAgICAgICAgICAgICMgc3RvcmluZyB0aGUgcmVzdWx0CiAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGNvbXBvbmVudCkKCiAgICAgICAgZm9yIG5vZGUgaW4gZ3JhcGg6CiAgICAgICAgICAgIGlmIG5vZGUgbm90IGluIGxvd2xpbmtzOgogICAgICAgICAgICAgICAgc3Ryb25nY29ubmVjdChub2RlKQoKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgQHByb3BlcnR5CiAgICBkZWYgZG90KHNlbGYpOgogICAgICAgIHJlc3VsdCA9IFsnZGlncmFwaCBHIHsnXQogICAgICAgIGZvciBzdWNjIGluIHNlbGYuX3ByZWRzOgogICAgICAgICAgICBwcmVkcyA9IHNlbGYuX3ByZWRzW3N1Y2NdCiAgICAgICAgICAgIGZvciBwcmVkIGluIHByZWRzOgogICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgnICAlcyAtPiAlczsnICUgKHByZWQsIHN1Y2MpKQogICAgICAgIGZvciBub2RlIGluIHNlbGYuX25vZGVzOgogICAgICAgICAgICByZXN1bHQuYXBwZW5kKCcgICVzOycgJSBub2RlKQogICAgICAgIHJlc3VsdC5hcHBlbmQoJ30nKQogICAgICAgIHJldHVybiAnXG4nLmpvaW4ocmVzdWx0KQoKIwojIFVuYXJjaGl2aW5nIGZ1bmN0aW9uYWxpdHkgZm9yIHppcCwgdGFyLCB0Z3osIHRieiwgd2hsCiMKCkFSQ0hJVkVfRVhURU5TSU9OUyA9ICgnLnRhci5neicsICcudGFyLmJ6MicsICcudGFyJywgJy56aXAnLAogICAgICAgICAgICAgICAgICAgICAgJy50Z3onLCAnLnRieicsICcud2hsJykKCmRlZiB1bmFyY2hpdmUoYXJjaGl2ZV9maWxlbmFtZSwgZGVzdF9kaXIsIGZvcm1hdD1Ob25lLCBjaGVjaz1UcnVlKToKCiAgICBkZWYgY2hlY2tfcGF0aChwYXRoKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShwYXRoLCB0ZXh0X3R5cGUpOgogICAgICAgICAgICBwYXRoID0gcGF0aC5kZWNvZGUoJ3V0Zi04JykKICAgICAgICBwID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguam9pbihkZXN0X2RpciwgcGF0aCkpCiAgICAgICAgaWYgbm90IHAuc3RhcnRzd2l0aChkZXN0X2Rpcikgb3IgcFtwbGVuXSAhPSBvcy5zZXA6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ3BhdGggb3V0c2lkZSBkZXN0aW5hdGlvbjogJXInICUgcCkKCiAgICBkZXN0X2RpciA9IG9zLnBhdGguYWJzcGF0aChkZXN0X2RpcikKICAgIHBsZW4gPSBsZW4oZGVzdF9kaXIpCiAgICBhcmNoaXZlID0gTm9uZQogICAgaWYgZm9ybWF0IGlzIE5vbmU6CiAgICAgICAgaWYgYXJjaGl2ZV9maWxlbmFtZS5lbmRzd2l0aCgoJy56aXAnLCAnLndobCcpKToKICAgICAgICAgICAgZm9ybWF0ID0gJ3ppcCcKICAgICAgICBlbGlmIGFyY2hpdmVfZmlsZW5hbWUuZW5kc3dpdGgoKCcudGFyLmd6JywgJy50Z3onKSk6CiAgICAgICAgICAgIGZvcm1hdCA9ICd0Z3onCiAgICAgICAgICAgIG1vZGUgPSAncjpneicKICAgICAgICBlbGlmIGFyY2hpdmVfZmlsZW5hbWUuZW5kc3dpdGgoKCcudGFyLmJ6MicsICcudGJ6JykpOgogICAgICAgICAgICBmb3JtYXQgPSAndGJ6JwogICAgICAgICAgICBtb2RlID0gJ3I6YnoyJwogICAgICAgIGVsaWYgYXJjaGl2ZV9maWxlbmFtZS5lbmRzd2l0aCgnLnRhcicpOgogICAgICAgICAgICBmb3JtYXQgPSAndGFyJwogICAgICAgICAgICBtb2RlID0gJ3InCiAgICAgICAgZWxzZTogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmtub3duIGZvcm1hdCBmb3IgJXInICUgYXJjaGl2ZV9maWxlbmFtZSkKICAgIHRyeToKICAgICAgICBpZiBmb3JtYXQgPT0gJ3ppcCc6CiAgICAgICAgICAgIGFyY2hpdmUgPSBaaXBGaWxlKGFyY2hpdmVfZmlsZW5hbWUsICdyJykKICAgICAgICAgICAgaWYgY2hlY2s6CiAgICAgICAgICAgICAgICBuYW1lcyA9IGFyY2hpdmUubmFtZWxpc3QoKQogICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4gbmFtZXM6CiAgICAgICAgICAgICAgICAgICAgY2hlY2tfcGF0aChuYW1lKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGFyY2hpdmUgPSB0YXJmaWxlLm9wZW4oYXJjaGl2ZV9maWxlbmFtZSwgbW9kZSkKICAgICAgICAgICAgaWYgY2hlY2s6CiAgICAgICAgICAgICAgICBuYW1lcyA9IGFyY2hpdmUuZ2V0bmFtZXMoKQogICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4gbmFtZXM6CiAgICAgICAgICAgICAgICAgICAgY2hlY2tfcGF0aChuYW1lKQogICAgICAgIGlmIGZvcm1hdCAhPSAnemlwJyBhbmQgc3lzLnZlcnNpb25faW5mb1swXSA8IDM6CiAgICAgICAgICAgICMgU2VlIFB5dGhvbiBpc3N1ZSAxNzE1My4gSWYgdGhlIGRlc3QgcGF0aCBjb250YWlucyBVbmljb2RlLAogICAgICAgICAgICAjIHRhcmZpbGUgZXh0cmFjdGlvbiBmYWlscyBvbiBQeXRob24gMi54IGlmIGEgbWVtYmVyIHBhdGggbmFtZQogICAgICAgICAgICAjIGNvbnRhaW5zIG5vbi1BU0NJSSBjaGFyYWN0ZXJzIC0gaXQgbGVhZHMgdG8gYW4gaW1wbGljaXQKICAgICAgICAgICAgIyBieXRlcyAtPiB1bmljb2RlIGNvbnZlcnNpb24gdXNpbmcgQVNDSUkgdG8gZGVjb2RlLgogICAgICAgICAgICBmb3IgdGFyaW5mbyBpbiBhcmNoaXZlLmdldG1lbWJlcnMoKToKICAgICAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHRhcmluZm8ubmFtZSwgdGV4dF90eXBlKToKICAgICAgICAgICAgICAgICAgICB0YXJpbmZvLm5hbWUgPSB0YXJpbmZvLm5hbWUuZGVjb2RlKCd1dGYtOCcpCiAgICAgICAgYXJjaGl2ZS5leHRyYWN0YWxsKGRlc3RfZGlyKQoKICAgIGZpbmFsbHk6CiAgICAgICAgaWYgYXJjaGl2ZToKICAgICAgICAgICAgYXJjaGl2ZS5jbG9zZSgpCgoKZGVmIHppcF9kaXIoZGlyZWN0b3J5KToKICAgICIiInppcCBhIGRpcmVjdG9yeSB0cmVlIGludG8gYSBCeXRlc0lPIG9iamVjdCIiIgogICAgcmVzdWx0ID0gaW8uQnl0ZXNJTygpCiAgICBkbGVuID0gbGVuKGRpcmVjdG9yeSkKICAgIHdpdGggWmlwRmlsZShyZXN1bHQsICJ3IikgYXMgemY6CiAgICAgICAgZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsoZGlyZWN0b3J5KToKICAgICAgICAgICAgZm9yIG5hbWUgaW4gZmlsZXM6CiAgICAgICAgICAgICAgICBmdWxsID0gb3MucGF0aC5qb2luKHJvb3QsIG5hbWUpCiAgICAgICAgICAgICAgICByZWwgPSByb290W2RsZW46XQogICAgICAgICAgICAgICAgZGVzdCA9IG9zLnBhdGguam9pbihyZWwsIG5hbWUpCiAgICAgICAgICAgICAgICB6Zi53cml0ZShmdWxsLCBkZXN0KQogICAgcmV0dXJuIHJlc3VsdAoKIwojIFNpbXBsZSBwcm9ncmVzcyBiYXIKIwoKVU5JVFMgPSAoJycsICdLJywgJ00nLCAnRycsJ1QnLCdQJykKCgpjbGFzcyBQcm9ncmVzcyhvYmplY3QpOgogICAgdW5rbm93biA9ICdVTktOT1dOJwoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtaW52YWw9MCwgbWF4dmFsPTEwMCk6CiAgICAgICAgYXNzZXJ0IG1heHZhbCBpcyBOb25lIG9yIG1heHZhbCA+PSBtaW52YWwKICAgICAgICBzZWxmLm1pbiA9IHNlbGYuY3VyID0gbWludmFsCiAgICAgICAgc2VsZi5tYXggPSBtYXh2YWwKICAgICAgICBzZWxmLnN0YXJ0ZWQgPSBOb25lCiAgICAgICAgc2VsZi5lbGFwc2VkID0gMAogICAgICAgIHNlbGYuZG9uZSA9IEZhbHNlCgogICAgZGVmIHVwZGF0ZShzZWxmLCBjdXJ2YWwpOgogICAgICAgIGFzc2VydCBzZWxmLm1pbiA8PSBjdXJ2YWwKICAgICAgICBhc3NlcnQgc2VsZi5tYXggaXMgTm9uZSBvciBjdXJ2YWwgPD0gc2VsZi5tYXgKICAgICAgICBzZWxmLmN1ciA9IGN1cnZhbAogICAgICAgIG5vdyA9IHRpbWUudGltZSgpCiAgICAgICAgaWYgc2VsZi5zdGFydGVkIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuc3RhcnRlZCA9IG5vdwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuZWxhcHNlZCA9IG5vdyAtIHNlbGYuc3RhcnRlZAoKICAgIGRlZiBpbmNyZW1lbnQoc2VsZiwgaW5jcik6CiAgICAgICAgYXNzZXJ0IGluY3IgPj0gMAogICAgICAgIHNlbGYudXBkYXRlKHNlbGYuY3VyICsgaW5jcikKCiAgICBkZWYgc3RhcnQoc2VsZik6CiAgICAgICAgc2VsZi51cGRhdGUoc2VsZi5taW4pCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgc3RvcChzZWxmKToKICAgICAgICBpZiBzZWxmLm1heCBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi51cGRhdGUoc2VsZi5tYXgpCiAgICAgICAgc2VsZi5kb25lID0gVHJ1ZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIG1heGltdW0oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYudW5rbm93biBpZiBzZWxmLm1heCBpcyBOb25lIGVsc2Ugc2VsZi5tYXgKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwZXJjZW50YWdlKHNlbGYpOgogICAgICAgIGlmIHNlbGYuZG9uZToKICAgICAgICAgICAgcmVzdWx0ID0gJzEwMCAlJwogICAgICAgIGVsaWYgc2VsZi5tYXggaXMgTm9uZToKICAgICAgICAgICAgcmVzdWx0ID0gJyA/PyAlJwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHYgPSAxMDAuMCAqIChzZWxmLmN1ciAtIHNlbGYubWluKSAvIChzZWxmLm1heCAtIHNlbGYubWluKQogICAgICAgICAgICByZXN1bHQgPSAnJTNkICUlJyAlIHYKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIGZvcm1hdF9kdXJhdGlvbihzZWxmLCBkdXJhdGlvbik6CiAgICAgICAgaWYgKGR1cmF0aW9uIDw9IDApIGFuZCBzZWxmLm1heCBpcyBOb25lIG9yIHNlbGYuY3VyID09IHNlbGYubWluOgogICAgICAgICAgICByZXN1bHQgPSAnPz86Pz86Pz8nCiAgICAgICAgI2VsaWYgZHVyYXRpb24gPCAxOgogICAgICAgICMgICAgcmVzdWx0ID0gJy0tOi0tOi0tJwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJlc3VsdCA9IHRpbWUuc3RyZnRpbWUoJyVIOiVNOiVTJywgdGltZS5nbXRpbWUoZHVyYXRpb24pKQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBAcHJvcGVydHkKICAgIGRlZiBFVEEoc2VsZik6CiAgICAgICAgaWYgc2VsZi5kb25lOgogICAgICAgICAgICBwcmVmaXggPSAnRG9uZScKICAgICAgICAgICAgdCA9IHNlbGYuZWxhcHNlZAogICAgICAgICAgICAjaW1wb3J0IHBkYjsgcGRiLnNldF90cmFjZSgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcHJlZml4ID0gJ0VUQSAnCiAgICAgICAgICAgIGlmIHNlbGYubWF4IGlzIE5vbmU6CiAgICAgICAgICAgICAgICB0ID0gLTEKICAgICAgICAgICAgZWxpZiBzZWxmLmVsYXBzZWQgPT0gMCBvciAoc2VsZi5jdXIgPT0gc2VsZi5taW4pOgogICAgICAgICAgICAgICAgdCA9IDAKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICNpbXBvcnQgcGRiOyBwZGIuc2V0X3RyYWNlKCkKICAgICAgICAgICAgICAgIHQgPSBmbG9hdChzZWxmLm1heCAtIHNlbGYubWluKQogICAgICAgICAgICAgICAgdCAvPSBzZWxmLmN1ciAtIHNlbGYubWluCiAgICAgICAgICAgICAgICB0ID0gKHQgLSAxKSAqIHNlbGYuZWxhcHNlZAogICAgICAgIHJldHVybiAnJXM6ICVzJyAlIChwcmVmaXgsIHNlbGYuZm9ybWF0X2R1cmF0aW9uKHQpKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHNwZWVkKHNlbGYpOgogICAgICAgIGlmIHNlbGYuZWxhcHNlZCA9PSAwOgogICAgICAgICAgICByZXN1bHQgPSAwLjAKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXN1bHQgPSAoc2VsZi5jdXIgLSBzZWxmLm1pbikgLyBzZWxmLmVsYXBzZWQKICAgICAgICBmb3IgdW5pdCBpbiBVTklUUzoKICAgICAgICAgICAgaWYgcmVzdWx0IDwgMTAwMDoKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIHJlc3VsdCAvPSAxMDAwLjAKICAgICAgICByZXR1cm4gJyVkICVzQi9zJyAlIChyZXN1bHQsIHVuaXQpCgojCiMgR2xvYiBmdW5jdGlvbmFsaXR5CiMKClJJQ0hfR0xPQiA9IHJlLmNvbXBpbGUocidceyhbXn1dKilcfScpCl9DSEVDS19SRUNVUlNJVkVfR0xPQiA9IHJlLmNvbXBpbGUocidbXi9cXCx7XVwqXCp8XCpcKlteL1xcLH1dJykKX0NIRUNLX01JU01BVENIX1NFVCA9IHJlLmNvbXBpbGUocideW157XSpcfXxce1tefV0qJCcpCgoKZGVmIGlnbG9iKHBhdGhfZ2xvYik6CiAgICAiIiJFeHRlbmRlZCBnbG9iYmluZyBmdW5jdGlvbiB0aGF0IHN1cHBvcnRzICoqIGFuZCB7b3B0MSxvcHQyLG9wdDN9LiIiIgogICAgaWYgX0NIRUNLX1JFQ1VSU0lWRV9HTE9CLnNlYXJjaChwYXRoX2dsb2IpOgogICAgICAgIG1zZyA9ICIiImludmFsaWQgZ2xvYiAlcjogcmVjdXJzaXZlIGdsb2IgIioqIiBtdXN0IGJlIHVzZWQgYWxvbmUiIiIKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKG1zZyAlIHBhdGhfZ2xvYikKICAgIGlmIF9DSEVDS19NSVNNQVRDSF9TRVQuc2VhcmNoKHBhdGhfZ2xvYik6CiAgICAgICAgbXNnID0gIiIiaW52YWxpZCBnbG9iICVyOiBtaXNtYXRjaGluZyBzZXQgbWFya2VyICd7JyBvciAnfSciIiIKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKG1zZyAlIHBhdGhfZ2xvYikKICAgIHJldHVybiBfaWdsb2IocGF0aF9nbG9iKQoKCmRlZiBfaWdsb2IocGF0aF9nbG9iKToKICAgIHJpY2hfcGF0aF9nbG9iID0gUklDSF9HTE9CLnNwbGl0KHBhdGhfZ2xvYiwgMSkKICAgIGlmIGxlbihyaWNoX3BhdGhfZ2xvYikgPiAxOgogICAgICAgIGFzc2VydCBsZW4ocmljaF9wYXRoX2dsb2IpID09IDMsIHJpY2hfcGF0aF9nbG9iCiAgICAgICAgcHJlZml4LCBzZXQsIHN1ZmZpeCA9IHJpY2hfcGF0aF9nbG9iCiAgICAgICAgZm9yIGl0ZW0gaW4gc2V0LnNwbGl0KCcsJyk6CiAgICAgICAgICAgIGZvciBwYXRoIGluIF9pZ2xvYignJy5qb2luKChwcmVmaXgsIGl0ZW0sIHN1ZmZpeCkpKToKICAgICAgICAgICAgICAgIHlpZWxkIHBhdGgKICAgIGVsc2U6CiAgICAgICAgaWYgJyoqJyBub3QgaW4gcGF0aF9nbG9iOgogICAgICAgICAgICBmb3IgaXRlbSBpbiBzdGRfaWdsb2IocGF0aF9nbG9iKToKICAgICAgICAgICAgICAgIHlpZWxkIGl0ZW0KICAgICAgICBlbHNlOgogICAgICAgICAgICBwcmVmaXgsIHJhZGljYWwgPSBwYXRoX2dsb2Iuc3BsaXQoJyoqJywgMSkKICAgICAgICAgICAgaWYgcHJlZml4ID09ICcnOgogICAgICAgICAgICAgICAgcHJlZml4ID0gJy4nCiAgICAgICAgICAgIGlmIHJhZGljYWwgPT0gJyc6CiAgICAgICAgICAgICAgICByYWRpY2FsID0gJyonCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIHdlIHN1cHBvcnQgYm90aAogICAgICAgICAgICAgICAgcmFkaWNhbCA9IHJhZGljYWwubHN0cmlwKCcvJykKICAgICAgICAgICAgICAgIHJhZGljYWwgPSByYWRpY2FsLmxzdHJpcCgnXFwnKQogICAgICAgICAgICBmb3IgcGF0aCwgZGlyLCBmaWxlcyBpbiBvcy53YWxrKHByZWZpeCk6CiAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5ub3JtcGF0aChwYXRoKQogICAgICAgICAgICAgICAgZm9yIGZuIGluIF9pZ2xvYihvcy5wYXRoLmpvaW4ocGF0aCwgcmFkaWNhbCkpOgogICAgICAgICAgICAgICAgICAgIHlpZWxkIGZuCgppZiBzc2w6CiAgICBmcm9tIC5jb21wYXQgaW1wb3J0IChIVFRQU0hhbmRsZXIgYXMgQmFzZUhUVFBTSGFuZGxlciwgbWF0Y2hfaG9zdG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICBDZXJ0aWZpY2F0ZUVycm9yKQoKCiMKIyBIVFRQU0Nvbm5lY3Rpb24gd2hpY2ggdmVyaWZpZXMgY2VydGlmaWNhdGVzL21hdGNoZXMgZG9tYWlucwojCgogICAgY2xhc3MgSFRUUFNDb25uZWN0aW9uKGh0dHBsaWIuSFRUUFNDb25uZWN0aW9uKToKICAgICAgICBjYV9jZXJ0cyA9IE5vbmUgIyBzZXQgdGhpcyB0byB0aGUgcGF0aCB0byB0aGUgY2VydHMgZmlsZSAoLnBlbSkKICAgICAgICBjaGVja19kb21haW4gPSBUcnVlICMgb25seSB1c2VkIGlmIGNhX2NlcnRzIGlzIG5vdCBOb25lCgogICAgICAgICMgbm9pbnNwZWN0aW9uIFB5UHJvcGVydHlBY2Nlc3MKICAgICAgICBkZWYgY29ubmVjdChzZWxmKToKICAgICAgICAgICAgc29jayA9IHNvY2tldC5jcmVhdGVfY29ubmVjdGlvbigoc2VsZi5ob3N0LCBzZWxmLnBvcnQpLCBzZWxmLnRpbWVvdXQpCiAgICAgICAgICAgIGlmIGdldGF0dHIoc2VsZiwgJ190dW5uZWxfaG9zdCcsIEZhbHNlKToKICAgICAgICAgICAgICAgIHNlbGYuc29jayA9IHNvY2sKICAgICAgICAgICAgICAgIHNlbGYuX3R1bm5lbCgpCgogICAgICAgICAgICBpZiBub3QgaGFzYXR0cihzc2wsICdTU0xDb250ZXh0Jyk6CiAgICAgICAgICAgICAgICAjIEZvciAyLngKICAgICAgICAgICAgICAgIGlmIHNlbGYuY2FfY2VydHM6CiAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzID0gc3NsLkNFUlRfUkVRVUlSRUQKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzID0gc3NsLkNFUlRfTk9ORQogICAgICAgICAgICAgICAgc2VsZi5zb2NrID0gc3NsLndyYXBfc29ja2V0KHNvY2ssIHNlbGYua2V5X2ZpbGUsIHNlbGYuY2VydF9maWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1jZXJ0X3JlcXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NsX3ZlcnNpb249c3NsLlBST1RPQ09MX1NTTHYyMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYV9jZXJ0cz1zZWxmLmNhX2NlcnRzKQogICAgICAgICAgICBlbHNlOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgICAgICAgICBjb250ZXh0ID0gc3NsLlNTTENvbnRleHQoc3NsLlBST1RPQ09MX1NTTHYyMykKICAgICAgICAgICAgICAgIGNvbnRleHQub3B0aW9ucyB8PSBzc2wuT1BfTk9fU1NMdjIKICAgICAgICAgICAgICAgIGlmIHNlbGYuY2VydF9maWxlOgogICAgICAgICAgICAgICAgICAgIGNvbnRleHQubG9hZF9jZXJ0X2NoYWluKHNlbGYuY2VydF9maWxlLCBzZWxmLmtleV9maWxlKQogICAgICAgICAgICAgICAga3dhcmdzID0ge30KICAgICAgICAgICAgICAgIGlmIHNlbGYuY2FfY2VydHM6CiAgICAgICAgICAgICAgICAgICAgY29udGV4dC52ZXJpZnlfbW9kZSA9IHNzbC5DRVJUX1JFUVVJUkVECiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoY2FmaWxlPXNlbGYuY2FfY2VydHMpCiAgICAgICAgICAgICAgICAgICAgaWYgZ2V0YXR0cihzc2wsICdIQVNfU05JJywgRmFsc2UpOgogICAgICAgICAgICAgICAgICAgICAgICBrd2FyZ3NbJ3NlcnZlcl9ob3N0bmFtZSddID0gc2VsZi5ob3N0CiAgICAgICAgICAgICAgICBzZWxmLnNvY2sgPSBjb250ZXh0LndyYXBfc29ja2V0KHNvY2ssICoqa3dhcmdzKQogICAgICAgICAgICBpZiBzZWxmLmNhX2NlcnRzIGFuZCBzZWxmLmNoZWNrX2RvbWFpbjoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBtYXRjaF9ob3N0bmFtZShzZWxmLnNvY2suZ2V0cGVlcmNlcnQoKSwgc2VsZi5ob3N0KQogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnSG9zdCB2ZXJpZmllZDogJXMnLCBzZWxmLmhvc3QpCiAgICAgICAgICAgICAgICBleGNlcHQgQ2VydGlmaWNhdGVFcnJvcjogICMgcHJhZ21hOiBubyBjb3ZlcgogICAgICAgICAgICAgICAgICAgIHNlbGYuc29jay5zaHV0ZG93bihzb2NrZXQuU0hVVF9SRFdSKQogICAgICAgICAgICAgICAgICAgIHNlbGYuc29jay5jbG9zZSgpCiAgICAgICAgICAgICAgICAgICAgcmFpc2UKCiAgICBjbGFzcyBIVFRQU0hhbmRsZXIoQmFzZUhUVFBTSGFuZGxlcik6CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNhX2NlcnRzLCBjaGVja19kb21haW49VHJ1ZSk6CiAgICAgICAgICAgIEJhc2VIVFRQU0hhbmRsZXIuX19pbml0X18oc2VsZikKICAgICAgICAgICAgc2VsZi5jYV9jZXJ0cyA9IGNhX2NlcnRzCiAgICAgICAgICAgIHNlbGYuY2hlY2tfZG9tYWluID0gY2hlY2tfZG9tYWluCgogICAgICAgIGRlZiBfY29ubl9tYWtlcihzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICAgICAiIiIKICAgICAgICAgICAgVGhpcyBpcyBjYWxsZWQgdG8gY3JlYXRlIGEgY29ubmVjdGlvbiBpbnN0YW5jZS4gTm9ybWFsbHkgeW91J2QKICAgICAgICAgICAgcGFzcyBhIGNvbm5lY3Rpb24gY2xhc3MgdG8gZG9fb3BlbiwgYnV0IGl0IGRvZXNuJ3QgYWN0dWFsbHkgY2hlY2sgZm9yCiAgICAgICAgICAgIGEgY2xhc3MsIGFuZCBqdXN0IGV4cGVjdHMgYSBjYWxsYWJsZS4gQXMgbG9uZyBhcyB3ZSBiZWhhdmUganVzdCBhcyBhCiAgICAgICAgICAgIGNvbnN0cnVjdG9yIHdvdWxkIGhhdmUsIHdlIHNob3VsZCBiZSBPSy4gSWYgaXQgZXZlciBjaGFuZ2VzIHNvIHRoYXQKICAgICAgICAgICAgd2UgKm11c3QqIHBhc3MgYSBjbGFzcywgd2UnbGwgY3JlYXRlIGFuIFVuc2FmZUhUVFBTQ29ubmVjdGlvbiBjbGFzcwogICAgICAgICAgICB3aGljaCBqdXN0IHNldHMgY2hlY2tfZG9tYWluIHRvIEZhbHNlIGluIHRoZSBjbGFzcyBkZWZpbml0aW9uLCBhbmQKICAgICAgICAgICAgY2hvb3NlIHdoaWNoIG9uZSB0byBwYXNzIHRvIGRvX29wZW4uCiAgICAgICAgICAgICIiIgogICAgICAgICAgICByZXN1bHQgPSBIVFRQU0Nvbm5lY3Rpb24oKmFyZ3MsICoqa3dhcmdzKQogICAgICAgICAgICBpZiBzZWxmLmNhX2NlcnRzOgogICAgICAgICAgICAgICAgcmVzdWx0LmNhX2NlcnRzID0gc2VsZi5jYV9jZXJ0cwogICAgICAgICAgICAgICAgcmVzdWx0LmNoZWNrX2RvbWFpbiA9IHNlbGYuY2hlY2tfZG9tYWluCiAgICAgICAgICAgIHJldHVybiByZXN1bHQKCiAgICAgICAgZGVmIGh0dHBzX29wZW4oc2VsZiwgcmVxKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZG9fb3BlbihzZWxmLl9jb25uX21ha2VyLCByZXEpCiAgICAgICAgICAgIGV4Y2VwdCBVUkxFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgaWYgJ2NlcnRpZmljYXRlIHZlcmlmeSBmYWlsZWQnIGluIHN0cihlLnJlYXNvbik6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgQ2VydGlmaWNhdGVFcnJvcignVW5hYmxlIHRvIHZlcmlmeSBzZXJ2ZXIgY2VydGlmaWNhdGUgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvciAlcycgJSByZXEuaG9zdCkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UKCiAgICAjCiAgICAjIFRvIHByZXZlbnQgYWdhaW5zdCBtaXhpbmcgSFRUUCB0cmFmZmljIHdpdGggSFRUUFMgKGV4YW1wbGVzOiBBIE1hbi1Jbi1UaGUtCiAgICAjIE1pZGRsZSBwcm94eSB1c2luZyBIVFRQIGxpc3RlbnMgb24gcG9ydCA0NDMsIG9yIGFuIGluZGV4IG1pc3Rha2VubHkgc2VydmVzCiAgICAjIEhUTUwgY29udGFpbmluZyBhIGh0dHA6Ly94eXogbGluayB3aGVuIGl0IHNob3VsZCBiZSBodHRwczovL3h5eiksCiAgICAjIHlvdSBjYW4gdXNlIHRoZSBmb2xsb3dpbmcgaGFuZGxlciBjbGFzcywgd2hpY2ggZG9lcyBub3QgYWxsb3cgSFRUUCB0cmFmZmljLgogICAgIwogICAgIyBJdCB3b3JrcyBieSBpbmhlcml0aW5nIGZyb20gSFRUUEhhbmRsZXIgLSBzbyBidWlsZF9vcGVuZXIgd29uJ3QgYWRkIGEKICAgICMgaGFuZGxlciBmb3IgSFRUUCBpdHNlbGYuCiAgICAjCiAgICBjbGFzcyBIVFRQU09ubHlIYW5kbGVyKEhUVFBTSGFuZGxlciwgSFRUUEhhbmRsZXIpOgogICAgICAgIGRlZiBodHRwX29wZW4oc2VsZiwgcmVxKToKICAgICAgICAgICAgcmFpc2UgVVJMRXJyb3IoJ1VuZXhwZWN0ZWQgSFRUUCByZXF1ZXN0IG9uIHdoYXQgc2hvdWxkIGJlIGEgc2VjdXJlICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Nvbm5lY3Rpb246ICVzJyAlIHJlcSkKCiMKIyBYTUwtUlBDIHdpdGggdGltZW91dHMKIwoKX3Zlcl9pbmZvID0gc3lzLnZlcnNpb25faW5mb1s6Ml0KCmlmIF92ZXJfaW5mbyA9PSAoMiwgNik6CiAgICBjbGFzcyBIVFRQKGh0dHBsaWIuSFRUUCk6CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9JycsIHBvcnQ9Tm9uZSwgKiprd2FyZ3MpOgogICAgICAgICAgICBpZiBwb3J0ID09IDA6ICAgIyAwIG1lYW5zIHVzZSBwb3J0IDAsIG5vdCB0aGUgZGVmYXVsdCBwb3J0CiAgICAgICAgICAgICAgICBwb3J0ID0gTm9uZQogICAgICAgICAgICBzZWxmLl9zZXR1cChzZWxmLl9jb25uZWN0aW9uX2NsYXNzKGhvc3QsIHBvcnQsICoqa3dhcmdzKSkKCgogICAgaWYgc3NsOgogICAgICAgIGNsYXNzIEhUVFBTKGh0dHBsaWIuSFRUUFMpOgogICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgaG9zdD0nJywgcG9ydD1Ob25lLCAqKmt3YXJncyk6CiAgICAgICAgICAgICAgICBpZiBwb3J0ID09IDA6ICAgIyAwIG1lYW5zIHVzZSBwb3J0IDAsIG5vdCB0aGUgZGVmYXVsdCBwb3J0CiAgICAgICAgICAgICAgICAgICAgcG9ydCA9IE5vbmUKICAgICAgICAgICAgICAgIHNlbGYuX3NldHVwKHNlbGYuX2Nvbm5lY3Rpb25fY2xhc3MoaG9zdCwgcG9ydCwgKiprd2FyZ3MpKQoKCmNsYXNzIFRyYW5zcG9ydCh4bWxycGNsaWIuVHJhbnNwb3J0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0aW1lb3V0LCB1c2VfZGF0ZXRpbWU9MCk6CiAgICAgICAgc2VsZi50aW1lb3V0ID0gdGltZW91dAogICAgICAgIHhtbHJwY2xpYi5UcmFuc3BvcnQuX19pbml0X18oc2VsZiwgdXNlX2RhdGV0aW1lKQoKICAgIGRlZiBtYWtlX2Nvbm5lY3Rpb24oc2VsZiwgaG9zdCk6CiAgICAgICAgaCwgZWgsIHg1MDkgPSBzZWxmLmdldF9ob3N0X2luZm8oaG9zdCkKICAgICAgICBpZiBfdmVyX2luZm8gPT0gKDIsIDYpOgogICAgICAgICAgICByZXN1bHQgPSBIVFRQKGgsIHRpbWVvdXQ9c2VsZi50aW1lb3V0KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9jb25uZWN0aW9uIG9yIGhvc3QgIT0gc2VsZi5fY29ubmVjdGlvblswXToKICAgICAgICAgICAgICAgIHNlbGYuX2V4dHJhX2hlYWRlcnMgPSBlaAogICAgICAgICAgICAgICAgc2VsZi5fY29ubmVjdGlvbiA9IGhvc3QsIGh0dHBsaWIuSFRUUENvbm5lY3Rpb24oaCkKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5fY29ubmVjdGlvblsxXQogICAgICAgIHJldHVybiByZXN1bHQKCmlmIHNzbDoKICAgIGNsYXNzIFNhZmVUcmFuc3BvcnQoeG1scnBjbGliLlNhZmVUcmFuc3BvcnQpOgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0aW1lb3V0LCB1c2VfZGF0ZXRpbWU9MCk6CiAgICAgICAgICAgIHNlbGYudGltZW91dCA9IHRpbWVvdXQKICAgICAgICAgICAgeG1scnBjbGliLlNhZmVUcmFuc3BvcnQuX19pbml0X18oc2VsZiwgdXNlX2RhdGV0aW1lKQoKICAgICAgICBkZWYgbWFrZV9jb25uZWN0aW9uKHNlbGYsIGhvc3QpOgogICAgICAgICAgICBoLCBlaCwga3dhcmdzID0gc2VsZi5nZXRfaG9zdF9pbmZvKGhvc3QpCiAgICAgICAgICAgIGlmIG5vdCBrd2FyZ3M6CiAgICAgICAgICAgICAgICBrd2FyZ3MgPSB7fQogICAgICAgICAgICBrd2FyZ3NbJ3RpbWVvdXQnXSA9IHNlbGYudGltZW91dAogICAgICAgICAgICBpZiBfdmVyX2luZm8gPT0gKDIsIDYpOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gSFRUUFMoaG9zdCwgTm9uZSwgKiprd2FyZ3MpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5fY29ubmVjdGlvbiBvciBob3N0ICE9IHNlbGYuX2Nvbm5lY3Rpb25bMF06CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZXh0cmFfaGVhZGVycyA9IGVoCiAgICAgICAgICAgICAgICAgICAgc2VsZi5fY29ubmVjdGlvbiA9IGhvc3QsIGh0dHBsaWIuSFRUUFNDb25uZWN0aW9uKGgsIE5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqa3dhcmdzKQogICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5fY29ubmVjdGlvblsxXQogICAgICAgICAgICByZXR1cm4gcmVzdWx0CgoKY2xhc3MgU2VydmVyUHJveHkoeG1scnBjbGliLlNlcnZlclByb3h5KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB1cmksICoqa3dhcmdzKToKICAgICAgICBzZWxmLnRpbWVvdXQgPSB0aW1lb3V0ID0ga3dhcmdzLnBvcCgndGltZW91dCcsIE5vbmUpCiAgICAgICAgIyBUaGUgYWJvdmUgY2xhc3NlcyBvbmx5IGNvbWUgaW50byBwbGF5IGlmIGEgdGltZW91dAogICAgICAgICMgaXMgc3BlY2lmaWVkCiAgICAgICAgaWYgdGltZW91dCBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2NoZW1lLCBfID0gc3BsaXR0eXBlKHVyaSkKICAgICAgICAgICAgdXNlX2RhdGV0aW1lID0ga3dhcmdzLmdldCgndXNlX2RhdGV0aW1lJywgMCkKICAgICAgICAgICAgaWYgc2NoZW1lID09ICdodHRwcyc6CiAgICAgICAgICAgICAgICB0Y2xzID0gU2FmZVRyYW5zcG9ydAogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgdGNscyA9IFRyYW5zcG9ydAogICAgICAgICAgICBrd2FyZ3NbJ3RyYW5zcG9ydCddID0gdCA9IHRjbHModGltZW91dCwgdXNlX2RhdGV0aW1lPXVzZV9kYXRldGltZSkKICAgICAgICAgICAgc2VsZi50cmFuc3BvcnQgPSB0CiAgICAgICAgeG1scnBjbGliLlNlcnZlclByb3h5Ll9faW5pdF9fKHNlbGYsIHVyaSwgKiprd2FyZ3MpCgojCiMgQ1NWIGZ1bmN0aW9uYWxpdHkuIFRoaXMgaXMgcHJvdmlkZWQgYmVjYXVzZSBvbiAyLngsIHRoZSBjc3YgbW9kdWxlIGNhbid0CiMgaGFuZGxlIFVuaWNvZGUuIEhvd2V2ZXIsIHdlIG5lZWQgdG8gZGVhbCB3aXRoIFVuaWNvZGUgaW4gZS5nLiBSRUNPUkQgZmlsZXMuCiMKCmRlZiBfY3N2X29wZW4oZm4sIG1vZGUsICoqa3dhcmdzKToKICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzOgogICAgICAgIG1vZGUgKz0gJ2InCiAgICBlbHNlOgogICAgICAgIGt3YXJnc1snbmV3bGluZSddID0gJycKICAgIHJldHVybiBvcGVuKGZuLCBtb2RlLCAqKmt3YXJncykKCgpjbGFzcyBDU1ZCYXNlKG9iamVjdCk6CiAgICBkZWZhdWx0cyA9IHsKICAgICAgICAnZGVsaW1pdGVyJzogc3RyKCcsJyksICAgICAgIyBUaGUgc3RycyBhcmUgdXNlZCBiZWNhdXNlIHdlIG5lZWQgbmF0aXZlCiAgICAgICAgJ3F1b3RlY2hhcic6IHN0cignIicpLCAgICAgICMgc3RyIGluIHRoZSBjc3YgQVBJICgyLnggd29uJ3QgdGFrZQogICAgICAgICdsaW5ldGVybWluYXRvcic6IHN0cignXG4nKSAjIFVuaWNvZGUpCiAgICB9CgogICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqZXhjX2luZm8pOgogICAgICAgIHNlbGYuc3RyZWFtLmNsb3NlKCkKCgpjbGFzcyBDU1ZSZWFkZXIoQ1NWQmFzZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgKiprd2FyZ3MpOgogICAgICAgIGlmICdzdHJlYW0nIGluIGt3YXJnczoKICAgICAgICAgICAgc3RyZWFtID0ga3dhcmdzWydzdHJlYW0nXQogICAgICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdID49IDM6CiAgICAgICAgICAgICAgICAjIG5lZWRzIHRvIGJlIGEgdGV4dCBzdHJlYW0KICAgICAgICAgICAgICAgIHN0cmVhbSA9IGNvZGVjcy5nZXRyZWFkZXIoJ3V0Zi04Jykoc3RyZWFtKQogICAgICAgICAgICBzZWxmLnN0cmVhbSA9IHN0cmVhbQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuc3RyZWFtID0gX2Nzdl9vcGVuKGt3YXJnc1sncGF0aCddLCAncicpCiAgICAgICAgc2VsZi5yZWFkZXIgPSBjc3YucmVhZGVyKHNlbGYuc3RyZWFtLCAqKnNlbGYuZGVmYXVsdHMpCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIG5leHQoc2VsZik6CiAgICAgICAgcmVzdWx0ID0gbmV4dChzZWxmLnJlYWRlcikKICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMzoKICAgICAgICAgICAgZm9yIGksIGl0ZW0gaW4gZW51bWVyYXRlKHJlc3VsdCk6CiAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShpdGVtLCB0ZXh0X3R5cGUpOgogICAgICAgICAgICAgICAgICAgIHJlc3VsdFtpXSA9IGl0ZW0uZGVjb2RlKCd1dGYtOCcpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIF9fbmV4dF9fID0gbmV4dAoKY2xhc3MgQ1NWV3JpdGVyKENTVkJhc2UpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGZuLCAqKmt3YXJncyk6CiAgICAgICAgc2VsZi5zdHJlYW0gPSBfY3N2X29wZW4oZm4sICd3JykKICAgICAgICBzZWxmLndyaXRlciA9IGNzdi53cml0ZXIoc2VsZi5zdHJlYW0sICoqc2VsZi5kZWZhdWx0cykKCiAgICBkZWYgd3JpdGVyb3coc2VsZiwgcm93KToKICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMzoKICAgICAgICAgICAgciA9IFtdCiAgICAgICAgICAgIGZvciBpdGVtIGluIHJvdzoKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoaXRlbSwgdGV4dF90eXBlKToKICAgICAgICAgICAgICAgICAgICBpdGVtID0gaXRlbS5lbmNvZGUoJ3V0Zi04JykKICAgICAgICAgICAgICAgIHIuYXBwZW5kKGl0ZW0pCiAgICAgICAgICAgIHJvdyA9IHIKICAgICAgICBzZWxmLndyaXRlci53cml0ZXJvdyhyb3cpCgojCiMgICBDb25maWd1cmF0b3IgZnVuY3Rpb25hbGl0eQojCgpjbGFzcyBDb25maWd1cmF0b3IoQmFzZUNvbmZpZ3VyYXRvcik6CgogICAgdmFsdWVfY29udmVydGVycyA9IGRpY3QoQmFzZUNvbmZpZ3VyYXRvci52YWx1ZV9jb252ZXJ0ZXJzKQogICAgdmFsdWVfY29udmVydGVyc1snaW5jJ10gPSAnaW5jX2NvbnZlcnQnCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbmZpZywgYmFzZT1Ob25lKToKICAgICAgICBzdXBlcihDb25maWd1cmF0b3IsIHNlbGYpLl9faW5pdF9fKGNvbmZpZykKICAgICAgICBzZWxmLmJhc2UgPSBiYXNlIG9yIG9zLmdldGN3ZCgpCgogICAgZGVmIGNvbmZpZ3VyZV9jdXN0b20oc2VsZiwgY29uZmlnKToKICAgICAgICBkZWYgY29udmVydChvKToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShvLCAobGlzdCwgdHVwbGUpKToKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHR5cGUobykoW2NvbnZlcnQoaSkgZm9yIGkgaW4gb10pCiAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShvLCBkaWN0KToKICAgICAgICAgICAgICAgIGlmICcoKScgaW4gbzoKICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBzZWxmLmNvbmZpZ3VyZV9jdXN0b20obykKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0ge30KICAgICAgICAgICAgICAgICAgICBmb3IgayBpbiBvOgogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRba10gPSBjb252ZXJ0KG9ba10pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBzZWxmLmNvbnZlcnQobykKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgICAgICBjID0gY29uZmlnLnBvcCgnKCknKQogICAgICAgIGlmIG5vdCBjYWxsYWJsZShjKToKICAgICAgICAgICAgYyA9IHNlbGYucmVzb2x2ZShjKQogICAgICAgIHByb3BzID0gY29uZmlnLnBvcCgnLicsIE5vbmUpCiAgICAgICAgIyBDaGVjayBmb3IgdmFsaWQgaWRlbnRpZmllcnMKICAgICAgICBhcmdzID0gY29uZmlnLnBvcCgnW10nLCAoKSkKICAgICAgICBpZiBhcmdzOgogICAgICAgICAgICBhcmdzID0gdHVwbGUoW2NvbnZlcnQobykgZm9yIG8gaW4gYXJnc10pCiAgICAgICAgaXRlbXMgPSBbKGssIGNvbnZlcnQoY29uZmlnW2tdKSkgZm9yIGsgaW4gY29uZmlnIGlmIHZhbGlkX2lkZW50KGspXQogICAgICAgIGt3YXJncyA9IGRpY3QoaXRlbXMpCiAgICAgICAgcmVzdWx0ID0gYygqYXJncywgKiprd2FyZ3MpCiAgICAgICAgaWYgcHJvcHM6CiAgICAgICAgICAgIGZvciBuLCB2IGluIHByb3BzLml0ZW1zKCk6CiAgICAgICAgICAgICAgICBzZXRhdHRyKHJlc3VsdCwgbiwgY29udmVydCh2KSkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CiAgICAgICAgcmVzdWx0ID0gc2VsZi5jb25maWdba2V5XQogICAgICAgIGlmIGlzaW5zdGFuY2UocmVzdWx0LCBkaWN0KSBhbmQgJygpJyBpbiByZXN1bHQ6CiAgICAgICAgICAgIHNlbGYuY29uZmlnW2tleV0gPSByZXN1bHQgPSBzZWxmLmNvbmZpZ3VyZV9jdXN0b20ocmVzdWx0KQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgaW5jX2NvbnZlcnQoc2VsZiwgdmFsdWUpOgogICAgICAgICIiIkRlZmF1bHQgY29udmVydGVyIGZvciB0aGUgaW5jOi8vIHByb3RvY29sLiIiIgogICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzYWJzKHZhbHVlKToKICAgICAgICAgICAgdmFsdWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5iYXNlLCB2YWx1ZSkKICAgICAgICB3aXRoIGNvZGVjcy5vcGVuKHZhbHVlLCAncicsIGVuY29kaW5nPSd1dGYtOCcpIGFzIGY6CiAgICAgICAgICAgIHJlc3VsdCA9IGpzb24ubG9hZChmKQogICAgICAgIHJldHVybiByZXN1bHQKCiMKIyBNaXhpbiBmb3IgcnVubmluZyBzdWJwcm9jZXNzZXMgYW5kIGNhcHR1cmluZyB0aGVpciBvdXRwdXQKIwoKY2xhc3MgU3VicHJvY2Vzc01peGluKG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgdmVyYm9zZT1GYWxzZSwgcHJvZ3Jlc3M9Tm9uZSk6CiAgICAgICAgc2VsZi52ZXJib3NlID0gdmVyYm9zZQogICAgICAgIHNlbGYucHJvZ3Jlc3MgPSBwcm9ncmVzcwoKICAgIGRlZiByZWFkZXIoc2VsZiwgc3RyZWFtLCBjb250ZXh0KToKICAgICAgICAiIiIKICAgICAgICBSZWFkIGxpbmVzIGZyb20gYSBzdWJwcm9jZXNzJyBvdXRwdXQgc3RyZWFtIGFuZCBlaXRoZXIgcGFzcyB0byBhIHByb2dyZXNzCiAgICAgICAgY2FsbGFibGUgKGlmIHNwZWNpZmllZCkgb3Igd3JpdGUgcHJvZ3Jlc3MgaW5mb3JtYXRpb24gdG8gc3lzLnN0ZGVyci4KICAgICAgICAiIiIKICAgICAgICBwcm9ncmVzcyA9IHNlbGYucHJvZ3Jlc3MKICAgICAgICB2ZXJib3NlID0gc2VsZi52ZXJib3NlCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgcyA9IHN0cmVhbS5yZWFkbGluZSgpCiAgICAgICAgICAgIGlmIG5vdCBzOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgaWYgcHJvZ3Jlc3MgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBwcm9ncmVzcyhzLCBjb250ZXh0KQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaWYgbm90IHZlcmJvc2U6CiAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgnLicpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUocy5kZWNvZGUoJ3V0Zi04JykpCiAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLmZsdXNoKCkKICAgICAgICBzdHJlYW0uY2xvc2UoKQoKICAgIGRlZiBydW5fY29tbWFuZChzZWxmLCBjbWQsICoqa3dhcmdzKToKICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbihjbWQsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSwgKiprd2FyZ3MpCiAgICAgICAgdDEgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1zZWxmLnJlYWRlciwgYXJncz0ocC5zdGRvdXQsICdzdGRvdXQnKSkKICAgICAgICB0MS5zdGFydCgpCiAgICAgICAgdDIgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1zZWxmLnJlYWRlciwgYXJncz0ocC5zdGRlcnIsICdzdGRlcnInKSkKICAgICAgICB0Mi5zdGFydCgpCiAgICAgICAgcC53YWl0KCkKICAgICAgICB0MS5qb2luKCkKICAgICAgICB0Mi5qb2luKCkKICAgICAgICBpZiBzZWxmLnByb2dyZXNzIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLnByb2dyZXNzKCdkb25lLicsICdtYWluJykKICAgICAgICBlbGlmIHNlbGYudmVyYm9zZToKICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgnZG9uZS5cbicpCiAgICAgICAgcmV0dXJuIHAKCgpkZWYgbm9ybWFsaXplX25hbWUobmFtZSk6CiAgICAiIiJOb3JtYWxpemUgYSBweXRob24gcGFja2FnZSBuYW1lIGEgbGEgUEVQIDUwMyIiIgogICAgIyBodHRwczovL3d3dy5weXRob24ub3JnL2Rldi9wZXBzL3BlcC0wNTAzLyNub3JtYWxpemVkLW5hbWVzCiAgICByZXR1cm4gcmUuc3ViKCdbLV8uXSsnLCAnLScsIG5hbWUpLmxvd2VyKCkKUEsDBBQAAAAAAAAAIQCg/QVWn1wAAJ9cAAAuAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvdmVyc2lvbi5weSMgLSotIGNvZGluZzogdXRmLTggLSotCiMKIyBDb3B5cmlnaHQgKEMpIDIwMTItMjAxNiBUaGUgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24uCiMgU2VlIExJQ0VOU0UudHh0IGFuZCBDT05UUklCVVRPUlMudHh0LgojCiIiIgpJbXBsZW1lbnRhdGlvbiBvZiBhIGZsZXhpYmxlIHZlcnNpb25pbmcgc2NoZW1lIHByb3ZpZGluZyBzdXBwb3J0IGZvciBQRVAtNDQwLApzZXR1cHRvb2xzLWNvbXBhdGlibGUgYW5kIHNlbWFudGljIHZlcnNpb25pbmcuCiIiIgoKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IHJlCgpmcm9tIC5jb21wYXQgaW1wb3J0IHN0cmluZ190eXBlcwoKX19hbGxfXyA9IFsnTm9ybWFsaXplZFZlcnNpb24nLCAnTm9ybWFsaXplZE1hdGNoZXInLAogICAgICAgICAgICdMZWdhY3lWZXJzaW9uJywgJ0xlZ2FjeU1hdGNoZXInLAogICAgICAgICAgICdTZW1hbnRpY1ZlcnNpb24nLCAnU2VtYW50aWNNYXRjaGVyJywKICAgICAgICAgICAnVW5zdXBwb3J0ZWRWZXJzaW9uRXJyb3InLCAnZ2V0X3NjaGVtZSddCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgpjbGFzcyBVbnN1cHBvcnRlZFZlcnNpb25FcnJvcihWYWx1ZUVycm9yKToKICAgICIiIlRoaXMgaXMgYW4gdW5zdXBwb3J0ZWQgdmVyc2lvbi4iIiIKICAgIHBhc3MKCgpjbGFzcyBWZXJzaW9uKG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgcyk6CiAgICAgICAgc2VsZi5fc3RyaW5nID0gcyA9IHMuc3RyaXAoKQogICAgICAgIHNlbGYuX3BhcnRzID0gcGFydHMgPSBzZWxmLnBhcnNlKHMpCiAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UocGFydHMsIHR1cGxlKQogICAgICAgIGFzc2VydCBsZW4ocGFydHMpID4gMAoKICAgIGRlZiBwYXJzZShzZWxmLCBzKToKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCdwbGVhc2UgaW1wbGVtZW50IGluIGEgc3ViY2xhc3MnKQoKICAgIGRlZiBfY2hlY2tfY29tcGF0aWJsZShzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgdHlwZShzZWxmKSAhPSB0eXBlKG90aGVyKToKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdjYW5ub3QgY29tcGFyZSAlciBhbmQgJXInICUgKHNlbGYsIG90aGVyKSkKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICBzZWxmLl9jaGVja19jb21wYXRpYmxlKG90aGVyKQogICAgICAgIHJldHVybiBzZWxmLl9wYXJ0cyA9PSBvdGhlci5fcGFydHMKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gbm90IHNlbGYuX19lcV9fKG90aGVyKQoKICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHNlbGYuX2NoZWNrX2NvbXBhdGlibGUob3RoZXIpCiAgICAgICAgcmV0dXJuIHNlbGYuX3BhcnRzIDwgb3RoZXIuX3BhcnRzCgogICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIG5vdCAoc2VsZi5fX2x0X18ob3RoZXIpIG9yIHNlbGYuX19lcV9fKG90aGVyKSkKCiAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5fX2x0X18ob3RoZXIpIG9yIHNlbGYuX19lcV9fKG90aGVyKQoKICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLl9fZ3RfXyhvdGhlcikgb3Igc2VsZi5fX2VxX18ob3RoZXIpCgogICAgIyBTZWUgaHR0cDovL2RvY3MucHl0aG9uLm9yZy9yZWZlcmVuY2UvZGF0YW1vZGVsI29iamVjdC5fX2hhc2hfXwogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBoYXNoKHNlbGYuX3BhcnRzKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIiVzKCclcycpIiAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc2VsZi5fc3RyaW5nKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9zdHJpbmcKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19wcmVyZWxlYXNlKHNlbGYpOgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoJ1BsZWFzZSBpbXBsZW1lbnQgaW4gc3ViY2xhc3Nlcy4nKQoKCmNsYXNzIE1hdGNoZXIob2JqZWN0KToKICAgIHZlcnNpb25fY2xhc3MgPSBOb25lCgogICAgZGlzdF9yZSA9IHJlLmNvbXBpbGUociJeKFx3W1xzXHcnLi1dKikoXCgoLiopXCkpPyIpCiAgICBjb21wX3JlID0gcmUuY29tcGlsZShyJ14oPD18Pj18PHw+fCE9fD17MiwzfXx+PSk/XHMqKFteXHMsXSspJCcpCiAgICBudW1fcmUgPSByZS5jb21waWxlKHInXlxkKyhcLlxkKykqJCcpCgogICAgIyB2YWx1ZSBpcyBlaXRoZXIgYSBjYWxsYWJsZSBvciB0aGUgbmFtZSBvZiBhIG1ldGhvZAogICAgX29wZXJhdG9ycyA9IHsKICAgICAgICAnPCc6IGxhbWJkYSB2LCBjLCBwOiB2IDwgYywKICAgICAgICAnPic6IGxhbWJkYSB2LCBjLCBwOiB2ID4gYywKICAgICAgICAnPD0nOiBsYW1iZGEgdiwgYywgcDogdiA9PSBjIG9yIHYgPCBjLAogICAgICAgICc+PSc6IGxhbWJkYSB2LCBjLCBwOiB2ID09IGMgb3IgdiA+IGMsCiAgICAgICAgJz09JzogbGFtYmRhIHYsIGMsIHA6IHYgPT0gYywKICAgICAgICAnPT09JzogbGFtYmRhIHYsIGMsIHA6IHYgPT0gYywKICAgICAgICAjIGJ5IGRlZmF1bHQsIGNvbXBhdGlibGUgPT4gPj0uCiAgICAgICAgJ349JzogbGFtYmRhIHYsIGMsIHA6IHYgPT0gYyBvciB2ID4gYywKICAgICAgICAnIT0nOiBsYW1iZGEgdiwgYywgcDogdiAhPSBjLAogICAgfQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzKToKICAgICAgICBpZiBzZWxmLnZlcnNpb25fY2xhc3MgaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignUGxlYXNlIHNwZWNpZnkgYSB2ZXJzaW9uIGNsYXNzJykKICAgICAgICBzZWxmLl9zdHJpbmcgPSBzID0gcy5zdHJpcCgpCiAgICAgICAgbSA9IHNlbGYuZGlzdF9yZS5tYXRjaChzKQogICAgICAgIGlmIG5vdCBtOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdOb3QgdmFsaWQ6ICVyJyAlIHMpCiAgICAgICAgZ3JvdXBzID0gbS5ncm91cHMoJycpCiAgICAgICAgc2VsZi5uYW1lID0gZ3JvdXBzWzBdLnN0cmlwKCkKICAgICAgICBzZWxmLmtleSA9IHNlbGYubmFtZS5sb3dlcigpICAgICMgZm9yIGNhc2UtaW5zZW5zaXRpdmUgY29tcGFyaXNvbnMKICAgICAgICBjbGlzdCA9IFtdCiAgICAgICAgaWYgZ3JvdXBzWzJdOgogICAgICAgICAgICBjb25zdHJhaW50cyA9IFtjLnN0cmlwKCkgZm9yIGMgaW4gZ3JvdXBzWzJdLnNwbGl0KCcsJyldCiAgICAgICAgICAgIGZvciBjIGluIGNvbnN0cmFpbnRzOgogICAgICAgICAgICAgICAgbSA9IHNlbGYuY29tcF9yZS5tYXRjaChjKQogICAgICAgICAgICAgICAgaWYgbm90IG06CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignSW52YWxpZCAlciBpbiAlcicgJSAoYywgcykpCiAgICAgICAgICAgICAgICBncm91cHMgPSBtLmdyb3VwcygpCiAgICAgICAgICAgICAgICBvcCA9IGdyb3Vwc1swXSBvciAnfj0nCiAgICAgICAgICAgICAgICBzID0gZ3JvdXBzWzFdCiAgICAgICAgICAgICAgICBpZiBzLmVuZHN3aXRoKCcuKicpOgogICAgICAgICAgICAgICAgICAgIGlmIG9wIG5vdCBpbiAoJz09JywgJyE9Jyk6CiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1wnLipcJyBub3QgYWxsb3dlZCBmb3IgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclciBjb25zdHJhaW50cycgJSBvcCkKICAgICAgICAgICAgICAgICAgICAjIENvdWxkIGJlIGEgcGFydGlhbCB2ZXJzaW9uIChlLmcuIGZvciAnMi4qJykgd2hpY2gKICAgICAgICAgICAgICAgICAgICAjIHdvbid0IHBhcnNlIGFzIGEgdmVyc2lvbiwgc28ga2VlcCBpdCBhcyBhIHN0cmluZwogICAgICAgICAgICAgICAgICAgIHZuLCBwcmVmaXggPSBzWzotMl0sIFRydWUKICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5udW1fcmUubWF0Y2godm4pOgogICAgICAgICAgICAgICAgICAgICAgICAjIEp1c3QgdG8gY2hlY2sgdGhhdCB2biBpcyBhIHZhbGlkIHZlcnNpb24KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi52ZXJzaW9uX2NsYXNzKHZuKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAjIFNob3VsZCBwYXJzZSBhcyBhIHZlcnNpb24sIHNvIHdlIGNhbiBjcmVhdGUgYW4KICAgICAgICAgICAgICAgICAgICAjIGluc3RhbmNlIGZvciB0aGUgY29tcGFyaXNvbgogICAgICAgICAgICAgICAgICAgIHZuLCBwcmVmaXggPSBzZWxmLnZlcnNpb25fY2xhc3MocyksIEZhbHNlCiAgICAgICAgICAgICAgICBjbGlzdC5hcHBlbmQoKG9wLCB2biwgcHJlZml4KSkKICAgICAgICBzZWxmLl9wYXJ0cyA9IHR1cGxlKGNsaXN0KQoKICAgIGRlZiBtYXRjaChzZWxmLCB2ZXJzaW9uKToKICAgICAgICAiIiIKICAgICAgICBDaGVjayBpZiB0aGUgcHJvdmlkZWQgdmVyc2lvbiBtYXRjaGVzIHRoZSBjb25zdHJhaW50cy4KCiAgICAgICAgOnBhcmFtIHZlcnNpb246IFRoZSB2ZXJzaW9uIHRvIG1hdGNoIGFnYWluc3QgdGhpcyBpbnN0YW5jZS4KICAgICAgICA6dHlwZSB2ZXJzaW9uOiBTdHJpbmcgb3IgOmNsYXNzOmBWZXJzaW9uYCBpbnN0YW5jZS4KICAgICAgICAiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKHZlcnNpb24sIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgIHZlcnNpb24gPSBzZWxmLnZlcnNpb25fY2xhc3ModmVyc2lvbikKICAgICAgICBmb3Igb3BlcmF0b3IsIGNvbnN0cmFpbnQsIHByZWZpeCBpbiBzZWxmLl9wYXJ0czoKICAgICAgICAgICAgZiA9IHNlbGYuX29wZXJhdG9ycy5nZXQob3BlcmF0b3IpCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZiwgc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgICAgIGYgPSBnZXRhdHRyKHNlbGYsIGYpCiAgICAgICAgICAgIGlmIG5vdCBmOgogICAgICAgICAgICAgICAgbXNnID0gKCclciBub3QgaW1wbGVtZW50ZWQgJwogICAgICAgICAgICAgICAgICAgICAgICdmb3IgJXMnICUgKG9wZXJhdG9yLCBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXykpCiAgICAgICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKG1zZykKICAgICAgICAgICAgaWYgbm90IGYodmVyc2lvbiwgY29uc3RyYWludCwgcHJlZml4KToKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIHJldHVybiBUcnVlCgogICAgQHByb3BlcnR5CiAgICBkZWYgZXhhY3RfdmVyc2lvbihzZWxmKToKICAgICAgICByZXN1bHQgPSBOb25lCiAgICAgICAgaWYgbGVuKHNlbGYuX3BhcnRzKSA9PSAxIGFuZCBzZWxmLl9wYXJ0c1swXVswXSBpbiAoJz09JywgJz09PScpOgogICAgICAgICAgICByZXN1bHQgPSBzZWxmLl9wYXJ0c1swXVsxXQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgX2NoZWNrX2NvbXBhdGlibGUoc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIHR5cGUoc2VsZikgIT0gdHlwZShvdGhlcikgb3Igc2VsZi5uYW1lICE9IG90aGVyLm5hbWU6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignY2Fubm90IGNvbXBhcmUgJXMgYW5kICVzJyAlIChzZWxmLCBvdGhlcikpCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgc2VsZi5fY2hlY2tfY29tcGF0aWJsZShvdGhlcikKICAgICAgICByZXR1cm4gc2VsZi5rZXkgPT0gb3RoZXIua2V5IGFuZCBzZWxmLl9wYXJ0cyA9PSBvdGhlci5fcGFydHMKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gbm90IHNlbGYuX19lcV9fKG90aGVyKQoKICAgICMgU2VlIGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvcmVmZXJlbmNlL2RhdGFtb2RlbCNvYmplY3QuX19oYXNoX18KICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gaGFzaChzZWxmLmtleSkgKyBoYXNoKHNlbGYuX3BhcnRzKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIiVzKCVyKSIgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYuX3N0cmluZykKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fc3RyaW5nCgoKUEVQNDQwX1ZFUlNJT05fUkUgPSByZS5jb21waWxlKHInXnY/KFxkKyEpPyhcZCsoXC5cZCspKikoKGF8YnxjfHJjKShcZCspKT8nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByJyhcLihwb3N0KShcZCspKT8oXC4oZGV2KShcZCspKT8nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByJyhcKyhbYS16QS1aXGRdKyhcLlthLXpBLVpcZF0rKT8pKT8kJykKCgpkZWYgX3BlcF80NDBfa2V5KHMpOgogICAgcyA9IHMuc3RyaXAoKQogICAgbSA9IFBFUDQ0MF9WRVJTSU9OX1JFLm1hdGNoKHMpCiAgICBpZiBub3QgbToKICAgICAgICByYWlzZSBVbnN1cHBvcnRlZFZlcnNpb25FcnJvcignTm90IGEgdmFsaWQgdmVyc2lvbjogJXMnICUgcykKICAgIGdyb3VwcyA9IG0uZ3JvdXBzKCkKICAgIG51bXMgPSB0dXBsZShpbnQodikgZm9yIHYgaW4gZ3JvdXBzWzFdLnNwbGl0KCcuJykpCiAgICB3aGlsZSBsZW4obnVtcykgPiAxIGFuZCBudW1zWy0xXSA9PSAwOgogICAgICAgIG51bXMgPSBudW1zWzotMV0KCiAgICBpZiBub3QgZ3JvdXBzWzBdOgogICAgICAgIGVwb2NoID0gMAogICAgZWxzZToKICAgICAgICBlcG9jaCA9IGludChncm91cHNbMF0pCiAgICBwcmUgPSBncm91cHNbNDo2XQogICAgcG9zdCA9IGdyb3Vwc1s3OjldCiAgICBkZXYgPSBncm91cHNbMTA6MTJdCiAgICBsb2NhbCA9IGdyb3Vwc1sxM10KICAgIGlmIHByZSA9PSAoTm9uZSwgTm9uZSk6CiAgICAgICAgcHJlID0gKCkKICAgIGVsc2U6CiAgICAgICAgcHJlID0gcHJlWzBdLCBpbnQocHJlWzFdKQogICAgaWYgcG9zdCA9PSAoTm9uZSwgTm9uZSk6CiAgICAgICAgcG9zdCA9ICgpCiAgICBlbHNlOgogICAgICAgIHBvc3QgPSBwb3N0WzBdLCBpbnQocG9zdFsxXSkKICAgIGlmIGRldiA9PSAoTm9uZSwgTm9uZSk6CiAgICAgICAgZGV2ID0gKCkKICAgIGVsc2U6CiAgICAgICAgZGV2ID0gZGV2WzBdLCBpbnQoZGV2WzFdKQogICAgaWYgbG9jYWwgaXMgTm9uZToKICAgICAgICBsb2NhbCA9ICgpCiAgICBlbHNlOgogICAgICAgIHBhcnRzID0gW10KICAgICAgICBmb3IgcGFydCBpbiBsb2NhbC5zcGxpdCgnLicpOgogICAgICAgICAgICAjIHRvIGVuc3VyZSB0aGF0IG51bWVyaWMgY29tcGFyZXMgYXMgPiBsZXhpY29ncmFwaGljLCBhdm9pZAogICAgICAgICAgICAjIGNvbXBhcmluZyB0aGVtIGRpcmVjdGx5LCBidXQgZW5jb2RlIGEgdHVwbGUgd2hpY2ggZW5zdXJlcwogICAgICAgICAgICAjIGNvcnJlY3Qgc29ydGluZwogICAgICAgICAgICBpZiBwYXJ0LmlzZGlnaXQoKToKICAgICAgICAgICAgICAgIHBhcnQgPSAoMSwgaW50KHBhcnQpKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcGFydCA9ICgwLCBwYXJ0KQogICAgICAgICAgICBwYXJ0cy5hcHBlbmQocGFydCkKICAgICAgICBsb2NhbCA9IHR1cGxlKHBhcnRzKQogICAgaWYgbm90IHByZToKICAgICAgICAjIGVpdGhlciBiZWZvcmUgcHJlLXJlbGVhc2UsIG9yIGZpbmFsIHJlbGVhc2UgYW5kIGFmdGVyCiAgICAgICAgaWYgbm90IHBvc3QgYW5kIGRldjoKICAgICAgICAgICAgIyBiZWZvcmUgcHJlLXJlbGVhc2UKICAgICAgICAgICAgcHJlID0gKCdhJywgLTEpICAgICAjIHRvIHNvcnQgYmVmb3JlIGEwCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcHJlID0gKCd6JywpICAgICAgICAjIHRvIHNvcnQgYWZ0ZXIgYWxsIHByZS1yZWxlYXNlcwogICAgIyBub3cgbG9vayBhdCB0aGUgc3RhdGUgb2YgcG9zdCBhbmQgZGV2LgogICAgaWYgbm90IHBvc3Q6CiAgICAgICAgcG9zdCA9ICgnXycsKSAgICMgc29ydCBiZWZvcmUgJ2EnCiAgICBpZiBub3QgZGV2OgogICAgICAgIGRldiA9ICgnZmluYWwnLCkKCiAgICAjcHJpbnQoJyVzIC0+ICVzJyAlIChzLCBtLmdyb3VwcygpKSkKICAgIHJldHVybiBlcG9jaCwgbnVtcywgcHJlLCBwb3N0LCBkZXYsIGxvY2FsCgoKX25vcm1hbGl6ZWRfa2V5ID0gX3BlcF80NDBfa2V5CgoKY2xhc3MgTm9ybWFsaXplZFZlcnNpb24oVmVyc2lvbik6CiAgICAiIiJBIHJhdGlvbmFsIHZlcnNpb24uCgogICAgR29vZDoKICAgICAgICAxLjIgICAgICAgICAjIGVxdWl2YWxlbnQgdG8gIjEuMi4wIgogICAgICAgIDEuMi4wCiAgICAgICAgMS4yYTEKICAgICAgICAxLjIuM2EyCiAgICAgICAgMS4yLjNiMQogICAgICAgIDEuMi4zYzEKICAgICAgICAxLjIuMy40CiAgICAgICAgVE9ETzogZmlsbCB0aGlzIG91dAoKICAgIEJhZDoKICAgICAgICAxICAgICAgICAgICAjIG1pbmltdW0gdHdvIG51bWJlcnMKICAgICAgICAxLjJhICAgICAgICAjIHJlbGVhc2UgbGV2ZWwgbXVzdCBoYXZlIGEgcmVsZWFzZSBzZXJpYWwKICAgICAgICAxLjIuM2IKICAgICIiIgogICAgZGVmIHBhcnNlKHNlbGYsIHMpOgogICAgICAgIHJlc3VsdCA9IF9ub3JtYWxpemVkX2tleShzKQogICAgICAgICMgX25vcm1hbGl6ZWRfa2V5IGxvc2VzIHRyYWlsaW5nIHplcm9lcyBpbiB0aGUgcmVsZWFzZQogICAgICAgICMgY2xhdXNlLCBzaW5jZSB0aGF0J3MgbmVlZGVkIHRvIGVuc3VyZSB0aGF0IFguWSA9PSBYLlkuMCA9PSBYLlkuMC4wCiAgICAgICAgIyBIb3dldmVyLCBQRVAgNDQwIHByZWZpeCBtYXRjaGluZyBuZWVkcyBpdDogZm9yIGV4YW1wbGUsCiAgICAgICAgIyAofj0gMS40LjUuMCkgbWF0Y2hlcyBkaWZmZXJlbnRseSB0byAofj0gMS40LjUuMC4wKS4KICAgICAgICBtID0gUEVQNDQwX1ZFUlNJT05fUkUubWF0Y2gocykgICAgICAjIG11c3Qgc3VjY2VlZAogICAgICAgIGdyb3VwcyA9IG0uZ3JvdXBzKCkKICAgICAgICBzZWxmLl9yZWxlYXNlX2NsYXVzZSA9IHR1cGxlKGludCh2KSBmb3IgdiBpbiBncm91cHNbMV0uc3BsaXQoJy4nKSkKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgUFJFUkVMX1RBR1MgPSBzZXQoWydhJywgJ2InLCAnYycsICdyYycsICdkZXYnXSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19wcmVyZWxlYXNlKHNlbGYpOgogICAgICAgIHJldHVybiBhbnkodFswXSBpbiBzZWxmLlBSRVJFTF9UQUdTIGZvciB0IGluIHNlbGYuX3BhcnRzIGlmIHQpCgoKZGVmIF9tYXRjaF9wcmVmaXgoeCwgeSk6CiAgICB4ID0gc3RyKHgpCiAgICB5ID0gc3RyKHkpCiAgICBpZiB4ID09IHk6CiAgICAgICAgcmV0dXJuIFRydWUKICAgIGlmIG5vdCB4LnN0YXJ0c3dpdGgoeSk6CiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICBuID0gbGVuKHkpCiAgICByZXR1cm4geFtuXSA9PSAnLicKCgpjbGFzcyBOb3JtYWxpemVkTWF0Y2hlcihNYXRjaGVyKToKICAgIHZlcnNpb25fY2xhc3MgPSBOb3JtYWxpemVkVmVyc2lvbgoKICAgICMgdmFsdWUgaXMgZWl0aGVyIGEgY2FsbGFibGUgb3IgdGhlIG5hbWUgb2YgYSBtZXRob2QKICAgIF9vcGVyYXRvcnMgPSB7CiAgICAgICAgJ349JzogJ19tYXRjaF9jb21wYXRpYmxlJywKICAgICAgICAnPCc6ICdfbWF0Y2hfbHQnLAogICAgICAgICc+JzogJ19tYXRjaF9ndCcsCiAgICAgICAgJzw9JzogJ19tYXRjaF9sZScsCiAgICAgICAgJz49JzogJ19tYXRjaF9nZScsCiAgICAgICAgJz09JzogJ19tYXRjaF9lcScsCiAgICAgICAgJz09PSc6ICdfbWF0Y2hfYXJiaXRyYXJ5JywKICAgICAgICAnIT0nOiAnX21hdGNoX25lJywKICAgIH0KCiAgICBkZWYgX2FkanVzdF9sb2NhbChzZWxmLCB2ZXJzaW9uLCBjb25zdHJhaW50LCBwcmVmaXgpOgogICAgICAgIGlmIHByZWZpeDoKICAgICAgICAgICAgc3RyaXBfbG9jYWwgPSAnKycgbm90IGluIGNvbnN0cmFpbnQgYW5kIHZlcnNpb24uX3BhcnRzWy0xXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgYm90aCBjb25zdHJhaW50IGFuZCB2ZXJzaW9uIGFyZQogICAgICAgICAgICAjIE5vcm1hbGl6ZWRWZXJzaW9uIGluc3RhbmNlcy4KICAgICAgICAgICAgIyBJZiBjb25zdHJhaW50IGRvZXMgbm90IGhhdmUgYSBsb2NhbCBjb21wb25lbnQsCiAgICAgICAgICAgICMgZW5zdXJlIHRoZSB2ZXJzaW9uIGRvZXNuJ3QsIGVpdGhlci4KICAgICAgICAgICAgc3RyaXBfbG9jYWwgPSBub3QgY29uc3RyYWludC5fcGFydHNbLTFdIGFuZCB2ZXJzaW9uLl9wYXJ0c1stMV0KICAgICAgICBpZiBzdHJpcF9sb2NhbDoKICAgICAgICAgICAgcyA9IHZlcnNpb24uX3N0cmluZy5zcGxpdCgnKycsIDEpWzBdCiAgICAgICAgICAgIHZlcnNpb24gPSBzZWxmLnZlcnNpb25fY2xhc3MocykKICAgICAgICByZXR1cm4gdmVyc2lvbiwgY29uc3RyYWludAoKICAgIGRlZiBfbWF0Y2hfbHQoc2VsZiwgdmVyc2lvbiwgY29uc3RyYWludCwgcHJlZml4KToKICAgICAgICB2ZXJzaW9uLCBjb25zdHJhaW50ID0gc2VsZi5fYWRqdXN0X2xvY2FsKHZlcnNpb24sIGNvbnN0cmFpbnQsIHByZWZpeCkKICAgICAgICBpZiB2ZXJzaW9uID49IGNvbnN0cmFpbnQ6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIHJlbGVhc2VfY2xhdXNlID0gY29uc3RyYWludC5fcmVsZWFzZV9jbGF1c2UKICAgICAgICBwZnggPSAnLicuam9pbihbc3RyKGkpIGZvciBpIGluIHJlbGVhc2VfY2xhdXNlXSkKICAgICAgICByZXR1cm4gbm90IF9tYXRjaF9wcmVmaXgodmVyc2lvbiwgcGZ4KQoKICAgIGRlZiBfbWF0Y2hfZ3Qoc2VsZiwgdmVyc2lvbiwgY29uc3RyYWludCwgcHJlZml4KToKICAgICAgICB2ZXJzaW9uLCBjb25zdHJhaW50ID0gc2VsZi5fYWRqdXN0X2xvY2FsKHZlcnNpb24sIGNvbnN0cmFpbnQsIHByZWZpeCkKICAgICAgICBpZiB2ZXJzaW9uIDw9IGNvbnN0cmFpbnQ6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIHJlbGVhc2VfY2xhdXNlID0gY29uc3RyYWludC5fcmVsZWFzZV9jbGF1c2UKICAgICAgICBwZnggPSAnLicuam9pbihbc3RyKGkpIGZvciBpIGluIHJlbGVhc2VfY2xhdXNlXSkKICAgICAgICByZXR1cm4gbm90IF9tYXRjaF9wcmVmaXgodmVyc2lvbiwgcGZ4KQoKICAgIGRlZiBfbWF0Y2hfbGUoc2VsZiwgdmVyc2lvbiwgY29uc3RyYWludCwgcHJlZml4KToKICAgICAgICB2ZXJzaW9uLCBjb25zdHJhaW50ID0gc2VsZi5fYWRqdXN0X2xvY2FsKHZlcnNpb24sIGNvbnN0cmFpbnQsIHByZWZpeCkKICAgICAgICByZXR1cm4gdmVyc2lvbiA8PSBjb25zdHJhaW50CgogICAgZGVmIF9tYXRjaF9nZShzZWxmLCB2ZXJzaW9uLCBjb25zdHJhaW50LCBwcmVmaXgpOgogICAgICAgIHZlcnNpb24sIGNvbnN0cmFpbnQgPSBzZWxmLl9hZGp1c3RfbG9jYWwodmVyc2lvbiwgY29uc3RyYWludCwgcHJlZml4KQogICAgICAgIHJldHVybiB2ZXJzaW9uID49IGNvbnN0cmFpbnQKCiAgICBkZWYgX21hdGNoX2VxKHNlbGYsIHZlcnNpb24sIGNvbnN0cmFpbnQsIHByZWZpeCk6CiAgICAgICAgdmVyc2lvbiwgY29uc3RyYWludCA9IHNlbGYuX2FkanVzdF9sb2NhbCh2ZXJzaW9uLCBjb25zdHJhaW50LCBwcmVmaXgpCiAgICAgICAgaWYgbm90IHByZWZpeDoKICAgICAgICAgICAgcmVzdWx0ID0gKHZlcnNpb24gPT0gY29uc3RyYWludCkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXN1bHQgPSBfbWF0Y2hfcHJlZml4KHZlcnNpb24sIGNvbnN0cmFpbnQpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBfbWF0Y2hfYXJiaXRyYXJ5KHNlbGYsIHZlcnNpb24sIGNvbnN0cmFpbnQsIHByZWZpeCk6CiAgICAgICAgcmV0dXJuIHN0cih2ZXJzaW9uKSA9PSBzdHIoY29uc3RyYWludCkKCiAgICBkZWYgX21hdGNoX25lKHNlbGYsIHZlcnNpb24sIGNvbnN0cmFpbnQsIHByZWZpeCk6CiAgICAgICAgdmVyc2lvbiwgY29uc3RyYWludCA9IHNlbGYuX2FkanVzdF9sb2NhbCh2ZXJzaW9uLCBjb25zdHJhaW50LCBwcmVmaXgpCiAgICAgICAgaWYgbm90IHByZWZpeDoKICAgICAgICAgICAgcmVzdWx0ID0gKHZlcnNpb24gIT0gY29uc3RyYWludCkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXN1bHQgPSBub3QgX21hdGNoX3ByZWZpeCh2ZXJzaW9uLCBjb25zdHJhaW50KQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgX21hdGNoX2NvbXBhdGlibGUoc2VsZiwgdmVyc2lvbiwgY29uc3RyYWludCwgcHJlZml4KToKICAgICAgICB2ZXJzaW9uLCBjb25zdHJhaW50ID0gc2VsZi5fYWRqdXN0X2xvY2FsKHZlcnNpb24sIGNvbnN0cmFpbnQsIHByZWZpeCkKICAgICAgICBpZiB2ZXJzaW9uID09IGNvbnN0cmFpbnQ6CiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgaWYgdmVyc2lvbiA8IGNvbnN0cmFpbnQ6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQojICAgICAgICBpZiBub3QgcHJlZml4OgojICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICByZWxlYXNlX2NsYXVzZSA9IGNvbnN0cmFpbnQuX3JlbGVhc2VfY2xhdXNlCiAgICAgICAgaWYgbGVuKHJlbGVhc2VfY2xhdXNlKSA+IDE6CiAgICAgICAgICAgIHJlbGVhc2VfY2xhdXNlID0gcmVsZWFzZV9jbGF1c2VbOi0xXQogICAgICAgIHBmeCA9ICcuJy5qb2luKFtzdHIoaSkgZm9yIGkgaW4gcmVsZWFzZV9jbGF1c2VdKQogICAgICAgIHJldHVybiBfbWF0Y2hfcHJlZml4KHZlcnNpb24sIHBmeCkKCl9SRVBMQUNFTUVOVFMgPSAoCiAgICAocmUuY29tcGlsZSgnWy4rLV0kJyksICcnKSwgICAgICAgICAgICAgICAgICAgICAjIHJlbW92ZSB0cmFpbGluZyBwdW5jdHMKICAgIChyZS5jb21waWxlKHInXlsuXShcZCknKSwgcicwLlwxJyksICAgICAgICAgICAgICMgLk4gLT4gMC5OIGF0IHN0YXJ0CiAgICAocmUuY29tcGlsZSgnXlsuLV0nKSwgJycpLCAgICAgICAgICAgICAgICAgICAgICAjIHJlbW92ZSBsZWFkaW5nIHB1bmN0cwogICAgKHJlLmNvbXBpbGUocideXCgoLiopXCkkJyksIHInXDEnKSwgICAgICAgICAgICAgIyByZW1vdmUgcGFyZW50aGVzZXMKICAgIChyZS5jb21waWxlKHInXnYoZXJzaW9uKT9ccyooXGQrKScpLCByJ1wyJyksICAgICMgcmVtb3ZlIGxlYWRpbmcgdihlcnNpb24pCiAgICAocmUuY29tcGlsZShyJ15yKGV2KT9ccyooXGQrKScpLCByJ1wyJyksICAgICAgICAjIHJlbW92ZSBsZWFkaW5nIHYoZXJzaW9uKQogICAgKHJlLmNvbXBpbGUoJ1suXXsyLH0nKSwgJy4nKSwgICAgICAgICAgICAgICAgICAgIyBtdWx0aXBsZSBydW5zIG9mICcuJwogICAgKHJlLmNvbXBpbGUocidcYihhbGZhfGFwaGEpXGInKSwgJ2FscGhhJyksICAgICAgIyBtaXNzcGVsdCBhbHBoYQogICAgKHJlLmNvbXBpbGUocidcYihwcmUtYWxwaGF8cHJlYWxwaGEpXGInKSwKICAgICAgICAgICAgICAgICdwcmUuYWxwaGEnKSwgICAgICAgICAgICAgICAgICAgICAgICMgc3RhbmRhcmRpc2UKICAgIChyZS5jb21waWxlKHInXChiZXRhXCkkJyksICdiZXRhJyksICAgICAgICAgICAgICMgcmVtb3ZlIHBhcmVudGhlc2VzCikKCl9TVUZGSVhfUkVQTEFDRU1FTlRTID0gKAogICAgKHJlLmNvbXBpbGUoJ15bOn4uXystXSsnKSwgJycpLCAgICAgICAgICAgICAgICAgICAjIHJlbW92ZSBsZWFkaW5nIHB1bmN0cwogICAgKHJlLmNvbXBpbGUoJ1ssKiIpKFtcXV0nKSwgJycpLCAgICAgICAgICAgICAgICAgICAjIHJlbW92ZSB1bndhbnRlZCBjaGFycwogICAgKHJlLmNvbXBpbGUoJ1t+OitfIC1dJyksICcuJyksICAgICAgICAgICAgICAgICAgICAjIHJlcGxhY2UgaWxsZWdhbCBjaGFycwogICAgKHJlLmNvbXBpbGUoJ1suXXsyLH0nKSwgJy4nKSwgICAgICAgICAgICAgICAgICAgIyBtdWx0aXBsZSBydW5zIG9mICcuJwogICAgKHJlLmNvbXBpbGUocidcLiQnKSwgJycpLCAgICAgICAgICAgICAgICAgICAgICAgIyB0cmFpbGluZyAnLicKKQoKX05VTUVSSUNfUFJFRklYID0gcmUuY29tcGlsZShyJyhcZCsoXC5cZCspKiknKQoKCmRlZiBfc3VnZ2VzdF9zZW1hbnRpY192ZXJzaW9uKHMpOgogICAgIiIiCiAgICBUcnkgdG8gc3VnZ2VzdCBhIHNlbWFudGljIGZvcm0gZm9yIGEgdmVyc2lvbiBmb3Igd2hpY2gKICAgIF9zdWdnZXN0X25vcm1hbGl6ZWRfdmVyc2lvbiBjb3VsZG4ndCBjb21lIHVwIHdpdGggYW55dGhpbmcuCiAgICAiIiIKICAgIHJlc3VsdCA9IHMuc3RyaXAoKS5sb3dlcigpCiAgICBmb3IgcGF0LCByZXBsIGluIF9SRVBMQUNFTUVOVFM6CiAgICAgICAgcmVzdWx0ID0gcGF0LnN1YihyZXBsLCByZXN1bHQpCiAgICBpZiBub3QgcmVzdWx0OgogICAgICAgIHJlc3VsdCA9ICcwLjAuMCcKCiAgICAjIE5vdyBsb29rIGZvciBudW1lcmljIHByZWZpeCwgYW5kIHNlcGFyYXRlIGl0IG91dCBmcm9tCiAgICAjIHRoZSByZXN0LgogICAgI2ltcG9ydCBwZGI7IHBkYi5zZXRfdHJhY2UoKQogICAgbSA9IF9OVU1FUklDX1BSRUZJWC5tYXRjaChyZXN1bHQpCiAgICBpZiBub3QgbToKICAgICAgICBwcmVmaXggPSAnMC4wLjAnCiAgICAgICAgc3VmZml4ID0gcmVzdWx0CiAgICBlbHNlOgogICAgICAgIHByZWZpeCA9IG0uZ3JvdXBzKClbMF0uc3BsaXQoJy4nKQogICAgICAgIHByZWZpeCA9IFtpbnQoaSkgZm9yIGkgaW4gcHJlZml4XQogICAgICAgIHdoaWxlIGxlbihwcmVmaXgpIDwgMzoKICAgICAgICAgICAgcHJlZml4LmFwcGVuZCgwKQogICAgICAgIGlmIGxlbihwcmVmaXgpID09IDM6CiAgICAgICAgICAgIHN1ZmZpeCA9IHJlc3VsdFttLmVuZCgpOl0KICAgICAgICBlbHNlOgogICAgICAgICAgICBzdWZmaXggPSAnLicuam9pbihbc3RyKGkpIGZvciBpIGluIHByZWZpeFszOl1dKSArIHJlc3VsdFttLmVuZCgpOl0KICAgICAgICAgICAgcHJlZml4ID0gcHJlZml4WzozXQogICAgICAgIHByZWZpeCA9ICcuJy5qb2luKFtzdHIoaSkgZm9yIGkgaW4gcHJlZml4XSkKICAgICAgICBzdWZmaXggPSBzdWZmaXguc3RyaXAoKQogICAgaWYgc3VmZml4OgogICAgICAgICNpbXBvcnQgcGRiOyBwZGIuc2V0X3RyYWNlKCkKICAgICAgICAjIG1hc3NhZ2UgdGhlIHN1ZmZpeC4KICAgICAgICBmb3IgcGF0LCByZXBsIGluIF9TVUZGSVhfUkVQTEFDRU1FTlRTOgogICAgICAgICAgICBzdWZmaXggPSBwYXQuc3ViKHJlcGwsIHN1ZmZpeCkKCiAgICBpZiBub3Qgc3VmZml4OgogICAgICAgIHJlc3VsdCA9IHByZWZpeAogICAgZWxzZToKICAgICAgICBzZXAgPSAnLScgaWYgJ2RldicgaW4gc3VmZml4IGVsc2UgJysnCiAgICAgICAgcmVzdWx0ID0gcHJlZml4ICsgc2VwICsgc3VmZml4CiAgICBpZiBub3QgaXNfc2VtdmVyKHJlc3VsdCk6CiAgICAgICAgcmVzdWx0ID0gTm9uZQogICAgcmV0dXJuIHJlc3VsdAoKCmRlZiBfc3VnZ2VzdF9ub3JtYWxpemVkX3ZlcnNpb24ocyk6CiAgICAiIiJTdWdnZXN0IGEgbm9ybWFsaXplZCB2ZXJzaW9uIGNsb3NlIHRvIHRoZSBnaXZlbiB2ZXJzaW9uIHN0cmluZy4KCiAgICBJZiB5b3UgaGF2ZSBhIHZlcnNpb24gc3RyaW5nIHRoYXQgaXNuJ3QgcmF0aW9uYWwgKGkuZS4gTm9ybWFsaXplZFZlcnNpb24KICAgIGRvZXNuJ3QgbGlrZSBpdCkgdGhlbiB5b3UgbWlnaHQgYmUgYWJsZSB0byBnZXQgYW4gZXF1aXZhbGVudCAob3IgY2xvc2UpCiAgICByYXRpb25hbCB2ZXJzaW9uIGZyb20gdGhpcyBmdW5jdGlvbi4KCiAgICBUaGlzIGRvZXMgYSBudW1iZXIgb2Ygc2ltcGxlIG5vcm1hbGl6YXRpb25zIHRvIHRoZSBnaXZlbiBzdHJpbmcsIGJhc2VkCiAgICBvbiBvYnNlcnZhdGlvbiBvZiB2ZXJzaW9ucyBjdXJyZW50bHkgaW4gdXNlIG9uIFB5UEkuIEdpdmVuIGEgZHVtcCBvZgogICAgdGhvc2UgdmVyc2lvbiBkdXJpbmcgUHlDb24gMjAwOSwgNDI4NyBvZiB0aGVtOgogICAgLSAyMzEyICg1My45MyUpIG1hdGNoIE5vcm1hbGl6ZWRWZXJzaW9uIHdpdGhvdXQgY2hhbmdlCiAgICAgIHdpdGggdGhlIGF1dG9tYXRpYyBzdWdnZXN0aW9uCiAgICAtIDM0NzQgKDgxLjA0JSkgbWF0Y2ggd2hlbiB1c2luZyB0aGlzIHN1Z2dlc3Rpb24gbWV0aG9kCgogICAgQHBhcmFtIHMge3N0cn0gQW4gaXJyYXRpb25hbCB2ZXJzaW9uIHN0cmluZy4KICAgIEByZXR1cm5zIEEgcmF0aW9uYWwgdmVyc2lvbiBzdHJpbmcsIG9yIE5vbmUsIGlmIGNvdWxkbid0IGRldGVybWluZSBvbmUuCiAgICAiIiIKICAgIHRyeToKICAgICAgICBfbm9ybWFsaXplZF9rZXkocykKICAgICAgICByZXR1cm4gcyAgICMgYWxyZWFkeSByYXRpb25hbAogICAgZXhjZXB0IFVuc3VwcG9ydGVkVmVyc2lvbkVycm9yOgogICAgICAgIHBhc3MKCiAgICBycyA9IHMubG93ZXIoKQoKICAgICMgcGFydCBvZiB0aGlzIGNvdWxkIHVzZSBtYWtldHJhbnMKICAgIGZvciBvcmlnLCByZXBsIGluICgoJy1hbHBoYScsICdhJyksICgnLWJldGEnLCAnYicpLCAoJ2FscGhhJywgJ2EnKSwKICAgICAgICAgICAgICAgICAgICAgICAoJ2JldGEnLCAnYicpLCAoJ3JjJywgJ2MnKSwgKCctZmluYWwnLCAnJyksCiAgICAgICAgICAgICAgICAgICAgICAgKCctcHJlJywgJ2MnKSwKICAgICAgICAgICAgICAgICAgICAgICAoJy1yZWxlYXNlJywgJycpLCAoJy5yZWxlYXNlJywgJycpLCAoJy1zdGFibGUnLCAnJyksCiAgICAgICAgICAgICAgICAgICAgICAgKCcrJywgJy4nKSwgKCdfJywgJy4nKSwgKCcgJywgJycpLCAoJy5maW5hbCcsICcnKSwKICAgICAgICAgICAgICAgICAgICAgICAoJ2ZpbmFsJywgJycpKToKICAgICAgICBycyA9IHJzLnJlcGxhY2Uob3JpZywgcmVwbCkKCiAgICAjIGlmIHNvbWV0aGluZyBlbmRzIHdpdGggZGV2IG9yIHByZSwgd2UgYWRkIGEgMAogICAgcnMgPSByZS5zdWIociJwcmUkIiwgciJwcmUwIiwgcnMpCiAgICBycyA9IHJlLnN1YihyImRldiQiLCByImRldjAiLCBycykKCiAgICAjIGlmIHdlIGhhdmUgc29tZXRoaW5nIGxpa2UgImItMiIgb3IgImEuMiIgYXQgdGhlIGVuZCBvZiB0aGUKICAgICMgdmVyc2lvbiwgdGhhdCBpcyBwcm9iYWJseSBiZXRhLCBhbHBoYSwgZXRjCiAgICAjIGxldCdzIHJlbW92ZSB0aGUgZGFzaCBvciBkb3QKICAgIHJzID0gcmUuc3ViKHIiKFthYmNdfHJjKVtcLVwuXShcZCspJCIsIHIiXDFcMiIsIHJzKQoKICAgICMgMS4wLWRldi1yMzcxIC0+IDEuMC5kZXYzNzEKICAgICMgMC4xLWRldi1yNzkgLT4gMC4xLmRldjc5CiAgICBycyA9IHJlLnN1YihyIltcLVwuXShkZXYpW1wtXC5dP3I/KFxkKykkIiwgciIuXDFcMiIsIHJzKQoKICAgICMgQ2xlYW46IDIuMC5hLjMsIDIuMC5iMSwgMC45LjB+YzEKICAgIHJzID0gcmUuc3ViKHIiWy5+XT8oW2FiY10pXC4/IiwgciJcMSIsIHJzKQoKICAgICMgQ2xlYW46IHYwLjMsIHYxLjAKICAgIGlmIHJzLnN0YXJ0c3dpdGgoJ3YnKToKICAgICAgICBycyA9IHJzWzE6XQoKICAgICMgQ2xlYW4gbGVhZGluZyAnMCdzIG9uIG51bWJlcnMuCiAgICAjVE9ETzogdW5pbnRlbmRlZCBzaWRlLWVmZmVjdCBvbiwgZS5nLiwgIjIwMDMuMDUuMDkiCiAgICAjIFB5UEkgc3RhdHM6IDc3ICh+MiUpIGJldHRlcgogICAgcnMgPSByZS5zdWIociJcYjArKFxkKykoPyFcZCkiLCByIlwxIiwgcnMpCgogICAgIyBDbGVhbiBhL2IvYyB3aXRoIG5vIHZlcnNpb24uIEUuZy4gIjEuMGEiIC0+ICIxLjBhMCIuIFNldHVwdG9vbHMgaW5mZXJzCiAgICAjIHplcm8uCiAgICAjIFB5UEkgc3RhdHM6IDI0NSAoNy41NiUpIGJldHRlcgogICAgcnMgPSByZS5zdWIociIoXGQrW2FiY10pJCIsIHIiXGc8MT4wIiwgcnMpCgogICAgIyB0aGUgJ2Rldi1yTk5OJyB0YWcgaXMgYSBkZXYgdGFnCiAgICBycyA9IHJlLnN1YihyIlwuPyhkZXYtcnxkZXZcLnIpXC4/KFxkKykkIiwgciIuZGV2XDIiLCBycykKCiAgICAjIGNsZWFuIHRoZSAtIHdoZW4gdXNlZCBhcyBhIHByZSBkZWxpbWl0ZXIKICAgIHJzID0gcmUuc3ViKHIiLShhfGJ8YykoXGQrKSQiLCByIlwxXDIiLCBycykKCiAgICAjIGEgdGVybWluYWwgImRldiIgb3IgImRldmVsIiBjYW4gYmUgY2hhbmdlZCBpbnRvICIuZGV2MCIKICAgIHJzID0gcmUuc3ViKHIiW1wuXC1dKGRldnxkZXZlbCkkIiwgciIuZGV2MCIsIHJzKQoKICAgICMgYSB0ZXJtaW5hbCAiZGV2IiBjYW4gYmUgY2hhbmdlZCBpbnRvICIuZGV2MCIKICAgIHJzID0gcmUuc3ViKHIiKD8hW1wuXC1dKWRldiQiLCByIi5kZXYwIiwgcnMpCgogICAgIyBhIHRlcm1pbmFsICJmaW5hbCIgb3IgInN0YWJsZSIgY2FuIGJlIHJlbW92ZWQKICAgIHJzID0gcmUuc3ViKHIiKGZpbmFsfHN0YWJsZSkkIiwgIiIsIHJzKQoKICAgICMgVGhlICdyJyBhbmQgdGhlICctJyB0YWdzIGFyZSBwb3N0IHJlbGVhc2UgdGFncwogICAgIyAgIDAuNGExLnIxMCAgICAgICAtPiAgMC40YTEucG9zdDEwCiAgICAjICAgMC45LjMzLTE3MjIyICAgIC0+ICAwLjkuMzMucG9zdDE3MjIyCiAgICAjICAgMC45LjMzLXIxNzIyMiAgIC0+ICAwLjkuMzMucG9zdDE3MjIyCiAgICBycyA9IHJlLnN1YihyIlwuPyhyfC18LXIpXC4/KFxkKykkIiwgciIucG9zdFwyIiwgcnMpCgogICAgIyBDbGVhbiAncicgaW5zdGVhZCBvZiAnZGV2JyB1c2FnZToKICAgICMgICAwLjkuMzMrcjE3MjIyICAgLT4gIDAuOS4zMy5kZXYxNzIyMgogICAgIyAgIDEuMGRldjEyMyAgICAgICAtPiAgMS4wLmRldjEyMwogICAgIyAgIDEuMC5naXQxMjMgICAgICAtPiAgMS4wLmRldjEyMwogICAgIyAgIDEuMC5ienIxMjMgICAgICAtPiAgMS4wLmRldjEyMwogICAgIyAgIDAuMWEwZGV2LjEyMyAgICAtPiAgMC4xYTAuZGV2MTIzCiAgICAjIFB5UEkgc3RhdHM6ICB+MTUwICh+NCUpIGJldHRlcgogICAgcnMgPSByZS5zdWIociJcLj8oZGV2fGdpdHxienIpXC4/KFxkKykkIiwgciIuZGV2XDIiLCBycykKCiAgICAjIENsZWFuICcucHJlJyAobm9ybWFsaXplZCBmcm9tICctcHJlJyBhYm92ZSkgaW5zdGVhZCBvZiAnYycgdXNhZ2U6CiAgICAjICAgMC4yLnByZTEgICAgICAgIC0+ICAwLjJjMQogICAgIyAgIDAuMi1jMSAgICAgICAgIC0+ICAwLjJjMQogICAgIyAgIDEuMHByZXZpZXcxMjMgICAtPiAgMS4wYzEyMwogICAgIyBQeVBJIHN0YXRzOiB+MjEgKDAuNjIlKSBiZXR0ZXIKICAgIHJzID0gcmUuc3ViKHIiXC4/KHByZXxwcmV2aWV3fC1jKShcZCspJCIsIHIiY1xnPDI+IiwgcnMpCgogICAgIyBUY2wvVGsgdXNlcyAicHgiIGZvciB0aGVpciBwb3N0IHJlbGVhc2UgbWFya2VycwogICAgcnMgPSByZS5zdWIociJwKFxkKykkIiwgciIucG9zdFwxIiwgcnMpCgogICAgdHJ5OgogICAgICAgIF9ub3JtYWxpemVkX2tleShycykKICAgIGV4Y2VwdCBVbnN1cHBvcnRlZFZlcnNpb25FcnJvcjoKICAgICAgICBycyA9IE5vbmUKICAgIHJldHVybiBycwoKIwojICAgTGVnYWN5IHZlcnNpb24gcHJvY2Vzc2luZyAoZGlzdHJpYnV0ZS1jb21wYXRpYmxlKQojCgpfVkVSU0lPTl9QQVJUID0gcmUuY29tcGlsZShyJyhbYS16XSt8XGQrfFtcLi1dKScsIHJlLkkpCl9WRVJTSU9OX1JFUExBQ0UgPSB7CiAgICAncHJlJzogJ2MnLAogICAgJ3ByZXZpZXcnOiAnYycsCiAgICAnLSc6ICdmaW5hbC0nLAogICAgJ3JjJzogJ2MnLAogICAgJ2Rldic6ICdAJywKICAgICcnOiBOb25lLAogICAgJy4nOiBOb25lLAp9CgoKZGVmIF9sZWdhY3lfa2V5KHMpOgogICAgZGVmIGdldF9wYXJ0cyhzKToKICAgICAgICByZXN1bHQgPSBbXQogICAgICAgIGZvciBwIGluIF9WRVJTSU9OX1BBUlQuc3BsaXQocy5sb3dlcigpKToKICAgICAgICAgICAgcCA9IF9WRVJTSU9OX1JFUExBQ0UuZ2V0KHAsIHApCiAgICAgICAgICAgIGlmIHA6CiAgICAgICAgICAgICAgICBpZiAnMCcgPD0gcFs6MV0gPD0gJzknOgogICAgICAgICAgICAgICAgICAgIHAgPSBwLnpmaWxsKDgpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHAgPSAnKicgKyBwCiAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHApCiAgICAgICAgcmVzdWx0LmFwcGVuZCgnKmZpbmFsJykKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgcmVzdWx0ID0gW10KICAgIGZvciBwIGluIGdldF9wYXJ0cyhzKToKICAgICAgICBpZiBwLnN0YXJ0c3dpdGgoJyonKToKICAgICAgICAgICAgaWYgcCA8ICcqZmluYWwnOgogICAgICAgICAgICAgICAgd2hpbGUgcmVzdWx0IGFuZCByZXN1bHRbLTFdID09ICcqZmluYWwtJzoKICAgICAgICAgICAgICAgICAgICByZXN1bHQucG9wKCkKICAgICAgICAgICAgd2hpbGUgcmVzdWx0IGFuZCByZXN1bHRbLTFdID09ICcwMDAwMDAwMCc6CiAgICAgICAgICAgICAgICByZXN1bHQucG9wKCkKICAgICAgICByZXN1bHQuYXBwZW5kKHApCiAgICByZXR1cm4gdHVwbGUocmVzdWx0KQoKCmNsYXNzIExlZ2FjeVZlcnNpb24oVmVyc2lvbik6CiAgICBkZWYgcGFyc2Uoc2VsZiwgcyk6CiAgICAgICAgcmV0dXJuIF9sZWdhY3lfa2V5KHMpCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfcHJlcmVsZWFzZShzZWxmKToKICAgICAgICByZXN1bHQgPSBGYWxzZQogICAgICAgIGZvciB4IGluIHNlbGYuX3BhcnRzOgogICAgICAgICAgICBpZiAoaXNpbnN0YW5jZSh4LCBzdHJpbmdfdHlwZXMpIGFuZCB4LnN0YXJ0c3dpdGgoJyonKSBhbmQKICAgICAgICAgICAgICAgIHggPCAnKmZpbmFsJyk6CiAgICAgICAgICAgICAgICByZXN1bHQgPSBUcnVlCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIHJldHVybiByZXN1bHQKCgpjbGFzcyBMZWdhY3lNYXRjaGVyKE1hdGNoZXIpOgogICAgdmVyc2lvbl9jbGFzcyA9IExlZ2FjeVZlcnNpb24KCiAgICBfb3BlcmF0b3JzID0gZGljdChNYXRjaGVyLl9vcGVyYXRvcnMpCiAgICBfb3BlcmF0b3JzWyd+PSddID0gJ19tYXRjaF9jb21wYXRpYmxlJwoKICAgIG51bWVyaWNfcmUgPSByZS5jb21waWxlKCdeKFxkKyhcLlxkKykqKScpCgogICAgZGVmIF9tYXRjaF9jb21wYXRpYmxlKHNlbGYsIHZlcnNpb24sIGNvbnN0cmFpbnQsIHByZWZpeCk6CiAgICAgICAgaWYgdmVyc2lvbiA8IGNvbnN0cmFpbnQ6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIG0gPSBzZWxmLm51bWVyaWNfcmUubWF0Y2goc3RyKGNvbnN0cmFpbnQpKQogICAgICAgIGlmIG5vdCBtOgogICAgICAgICAgICBsb2dnZXIud2FybmluZygnQ2Fubm90IGNvbXB1dGUgY29tcGF0aWJsZSBtYXRjaCBmb3IgdmVyc2lvbiAlcyAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICcgYW5kIGNvbnN0cmFpbnQgJXMnLCB2ZXJzaW9uLCBjb25zdHJhaW50KQogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIHMgPSBtLmdyb3VwcygpWzBdCiAgICAgICAgaWYgJy4nIGluIHM6CiAgICAgICAgICAgIHMgPSBzLnJzcGxpdCgnLicsIDEpWzBdCiAgICAgICAgcmV0dXJuIF9tYXRjaF9wcmVmaXgodmVyc2lvbiwgcykKCiMKIyAgIFNlbWFudGljIHZlcnNpb25pbmcKIwoKX1NFTVZFUl9SRSA9IHJlLmNvbXBpbGUocideKFxkKylcLihcZCspXC4oXGQrKScKICAgICAgICAgICAgICAgICAgICAgICAgcicoLVthLXowLTldKyhcLlthLXowLTktXSspKik/JwogICAgICAgICAgICAgICAgICAgICAgICByJyhcK1thLXowLTldKyhcLlthLXowLTktXSspKik/JCcsIHJlLkkpCgoKZGVmIGlzX3NlbXZlcihzKToKICAgIHJldHVybiBfU0VNVkVSX1JFLm1hdGNoKHMpCgoKZGVmIF9zZW1hbnRpY19rZXkocyk6CiAgICBkZWYgbWFrZV90dXBsZShzLCBhYnNlbnQpOgogICAgICAgIGlmIHMgaXMgTm9uZToKICAgICAgICAgICAgcmVzdWx0ID0gKGFic2VudCwpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcGFydHMgPSBzWzE6XS5zcGxpdCgnLicpCiAgICAgICAgICAgICMgV2UgY2FuJ3QgY29tcGFyZSBpbnRzIGFuZCBzdHJpbmdzIG9uIFB5dGhvbiAzLCBzbyBmdWRnZSBpdAogICAgICAgICAgICAjIGJ5IHplcm8tZmlsbGluZyBudW1lcmljIHZhbHVlcyBzbyBzaW11bGF0ZSBhIG51bWVyaWMgY29tcGFyaXNvbgogICAgICAgICAgICByZXN1bHQgPSB0dXBsZShbcC56ZmlsbCg4KSBpZiBwLmlzZGlnaXQoKSBlbHNlIHAgZm9yIHAgaW4gcGFydHNdKQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBtID0gaXNfc2VtdmVyKHMpCiAgICBpZiBub3QgbToKICAgICAgICByYWlzZSBVbnN1cHBvcnRlZFZlcnNpb25FcnJvcihzKQogICAgZ3JvdXBzID0gbS5ncm91cHMoKQogICAgbWFqb3IsIG1pbm9yLCBwYXRjaCA9IFtpbnQoaSkgZm9yIGkgaW4gZ3JvdXBzWzozXV0KICAgICMgY2hvb3NlIHRoZSAnfCcgYW5kICcqJyBzbyB0aGF0IHZlcnNpb25zIHNvcnQgY29ycmVjdGx5CiAgICBwcmUsIGJ1aWxkID0gbWFrZV90dXBsZShncm91cHNbM10sICd8JyksIG1ha2VfdHVwbGUoZ3JvdXBzWzVdLCAnKicpCiAgICByZXR1cm4gKG1ham9yLCBtaW5vciwgcGF0Y2gpLCBwcmUsIGJ1aWxkCgoKY2xhc3MgU2VtYW50aWNWZXJzaW9uKFZlcnNpb24pOgogICAgZGVmIHBhcnNlKHNlbGYsIHMpOgogICAgICAgIHJldHVybiBfc2VtYW50aWNfa2V5KHMpCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfcHJlcmVsZWFzZShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fcGFydHNbMV1bMF0gIT0gJ3wnCgoKY2xhc3MgU2VtYW50aWNNYXRjaGVyKE1hdGNoZXIpOgogICAgdmVyc2lvbl9jbGFzcyA9IFNlbWFudGljVmVyc2lvbgoKCmNsYXNzIFZlcnNpb25TY2hlbWUob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBrZXksIG1hdGNoZXIsIHN1Z2dlc3Rlcj1Ob25lKToKICAgICAgICBzZWxmLmtleSA9IGtleQogICAgICAgIHNlbGYubWF0Y2hlciA9IG1hdGNoZXIKICAgICAgICBzZWxmLnN1Z2dlc3RlciA9IHN1Z2dlc3RlcgoKICAgIGRlZiBpc192YWxpZF92ZXJzaW9uKHNlbGYsIHMpOgogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5tYXRjaGVyLnZlcnNpb25fY2xhc3MocykKICAgICAgICAgICAgcmVzdWx0ID0gVHJ1ZQogICAgICAgIGV4Y2VwdCBVbnN1cHBvcnRlZFZlcnNpb25FcnJvcjoKICAgICAgICAgICAgcmVzdWx0ID0gRmFsc2UKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIGlzX3ZhbGlkX21hdGNoZXIoc2VsZiwgcyk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLm1hdGNoZXIocykKICAgICAgICAgICAgcmVzdWx0ID0gVHJ1ZQogICAgICAgIGV4Y2VwdCBVbnN1cHBvcnRlZFZlcnNpb25FcnJvcjoKICAgICAgICAgICAgcmVzdWx0ID0gRmFsc2UKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIGlzX3ZhbGlkX2NvbnN0cmFpbnRfbGlzdChzZWxmLCBzKToKICAgICAgICAiIiIKICAgICAgICBVc2VkIGZvciBwcm9jZXNzaW5nIHNvbWUgbWV0YWRhdGEgZmllbGRzCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuaXNfdmFsaWRfbWF0Y2hlcignZHVtbXlfbmFtZSAoJXMpJyAlIHMpCgogICAgZGVmIHN1Z2dlc3Qoc2VsZiwgcyk6CiAgICAgICAgaWYgc2VsZi5zdWdnZXN0ZXIgaXMgTm9uZToKICAgICAgICAgICAgcmVzdWx0ID0gTm9uZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuc3VnZ2VzdGVyKHMpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKX1NDSEVNRVMgPSB7CiAgICAnbm9ybWFsaXplZCc6IFZlcnNpb25TY2hlbWUoX25vcm1hbGl6ZWRfa2V5LCBOb3JtYWxpemVkTWF0Y2hlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc3VnZ2VzdF9ub3JtYWxpemVkX3ZlcnNpb24pLAogICAgJ2xlZ2FjeSc6IFZlcnNpb25TY2hlbWUoX2xlZ2FjeV9rZXksIExlZ2FjeU1hdGNoZXIsIGxhbWJkYSBzZWxmLCBzOiBzKSwKICAgICdzZW1hbnRpYyc6IFZlcnNpb25TY2hlbWUoX3NlbWFudGljX2tleSwgU2VtYW50aWNNYXRjaGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc3VnZ2VzdF9zZW1hbnRpY192ZXJzaW9uKSwKfQoKX1NDSEVNRVNbJ2RlZmF1bHQnXSA9IF9TQ0hFTUVTWydub3JtYWxpemVkJ10KCgpkZWYgZ2V0X3NjaGVtZShuYW1lKToKICAgIGlmIG5hbWUgbm90IGluIF9TQ0hFTUVTOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ3Vua25vd24gc2NoZW1lIG5hbWU6ICVyJyAlIG5hbWUpCiAgICByZXR1cm4gX1NDSEVNRVNbbmFtZV0KUEsDBBQAAAAAAAAAIQDYfQCJAE4BAABOAQArAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvdzMyLmV4ZU1akAADAAAABAAAAP//AAC4AAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOgAAAAOH7oOALQJzSG4AUzNIVRoaXMgcHJvZ3JhbSBjYW5ub3QgYmUgcnVuIGluIERPUyBtb2RlLg0NCiQAAAAAAAAAtwtsrvNqAv3zagL982oC/WAkmv3yagL96Pep/e1qAv3o95z9/GoC/ej3qP2cagL9+hKR/fZqAv3zagP9qmoC/ej3rP3yagL96PeY/fJqAv3o95/98moC/VJpY2jzagL9AAAAAAAAAABQRQAATAEFAOHnUlcAAAAAAAAAAOAAAgELAQoAAKwAAACeAAAAAAAAcyYAAAAQAAAAwAAAAABAAAAQAAAAAgAABQABAAAAAAAFAAEAAAAAAACQAQAABAAAc+YBAAIAQIEAABAAABAAAAAAEAAAEAAAAAAAABAAAAAAAAAAAAAAAKziAAA8AAAAACABAKRQAAAAAAAAAAAAAAAAAAAAAAAAAIABAKAIAACQwQAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACjeAABAAAAAAAAAAAAAAAAAwAAASAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC50ZXh0AAAAOqsAAAAQAAAArAAAAAQAAAAAAAAAAAAAAAAAACAAAGAucmRhdGEAACYqAAAAwAAAACwAAACwAAAAAAAAAAAAAAAAAABAAABALmRhdGEAAADkLgAAAPAAAAAQAAAA3AAAAAAAAAAAAAAAAAAAQAAAwC5yc3JjAAAApFAAAAAgAQAAUgAAAOwAAAAAAAAAAAAAAAAAAEAAAEAucmVsb2MAAAYOAAAAgAEAABAAAAA+AQAAAAAAAAAAAAAAAABAAABCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVi+xWaDDaQAD/FUTAQACL8KF0DUEAhcB1GYX2dDZoPNpAAFb/FUDAQACjdA1BAIXAdBpouAsAAGoAaBAAAQBoUNpAAP91CGoA/9DrCVb/FQzAQAAzwF5dw1WL7IHsBAQAAKEE8EAAM8WJRfyDfQgAdTSNRRBQ/3UMjYX8+///aP8DAABoAAQAAFDoITIAAI2F/Pv//1DoZf///4PEGGoB/xUAwEAAi038M83ogQcAAMnDVYvsi00IVzP/jUb8UA++BdD+QABQUeijDAAAg8QMhcB0G7nQ/kAAiwk7CHUCi/iNSAGLRQgrwY1EMPzrz4vHX13DVYvsg+wsV2ho2kAAjUX8M/9oaAtBAFCJffyJffDo6AcAADPJO8cPlMFocNpAAFHoMf///2oCV/91/OhNEgAA/3X86FYRAACZiUXoBfz+//+DxCSJVeyJRfg7x30DiX34U1ZX/3X4/3X86B4SAAD/dfy7BAEAAFNqAf91COgWDwAA/3UIi/DoM////4PEIDvHdB2L8GoFWY191POli30IK8cDRfiZi/CJVezpgQAAAL4AABAEVugjCwAAiUX0i0XoBQAA8PtZiUX4O8d9A4l9+Ff/dfj/dfzosBEAAP91/FZqAf919OitDgAA/3X0i/Doyv7//4vwM8A79w+VwGiM2kAAiXXsUOha/v//i0XsK0X0agUDRfhZ/3X0mY191POli/CJVezoOQoAAIt9CIPELCt15Ct14CvzeQIz9moAVv91/OhFEQAA/3X8U2oBV+hEDgAAi/AzwDvGG8D32Giw2kAAUOj9/f//g8QkjUQ+/15b6w5mixC5zNpAAGY7EXQHSDvHc+7rA4lF8P91/OjjEQAAi0XwWV/Jw1WL7FaL8P8VFMBAAIMmAGoCagFqAFZQ/3UIUP8VTMBAAIvwhfZ1DP8VPMBAAIP4BnUBRovGXl3DVYvsg30IAHUSoXANQQCFwHQJagBQ/xUcwEAAM8BAXcNVi+yD5PiB7NwAAAChBPBAADPEiYQk2AAAAItFCFNWVzP/V1eJRCQc/xU0wEAAi9iNRCQQUGpwjUQkeFBqCVP/FSzAQACFwHQMg3wkEHB1BTPAQOsCM8Bo1NpAAFDoEv3//4GMJIgAAAAAMAAAWVlqcI1EJHRQaglT/xUIwEAAaPTaQABQ6Or8//9qRF5WjUQkNFdQ6JI7AACDxBSJdCQoizU4wEAAavb/1lCNRCRk6PT+///HBCQU20AAUOiz/P//WVlq9f/WUI1EJGjo1/7//8cEJDDbQABQ6Jb8//9ZWWr0/9ZQjUQkbOi6/v//xwQkTNtAAFDoefz//1lZagFoxRJAAMdEJFwAAQAA/xVIwEAAjUQkGFCNRCQsUFdXV2oBV1f/dCQ0V/8VEMBAAP90JBRoaNtAAFDoN/z//4tEJCyDxAz/dCQYo3ANQQBT/xUgwEAA/3QkHP8VUMBAAGr//3QkHP8VGMBAAI1EJBBQ/3QkHP8VJMBAAGiM20AAUOjw+///WVn/dCQQ/xUAwEAAzFWL7FFTVleLPUDBQAC7sNtAAFP/dQjrJY1GCIlF/A+3AGaFwHQfg/gidBpqCFDo/wsAAFlZhcB1DFP/dfz/14vwhfZ10zPAhfYPlcBovNtAAFDojPv//4t9CFlZg8YIZoM/ImoCW3UfM8Bmgz4iaADcQAAPlMBQ6Gf7//8zwFlmiQYD81kD+zPAZoM+ImhI3EAAD5XAUOhI+///D7cGWVlmhcB0JWoIUOiFCwAAWVmFwHQXM8BmiQbrDmoIUOhwCwAAWVmFwHQKA/MPtwZmhcB16ItFDIkwi8dfXlvJw1WL7IHsJAMAAKEE8EAAM8WJRfxTVlf/FQTAQABmgzgidARqIOsFaiKDwARZUVDovgMAAFlZhcB1DMeF4Pz//9DaQADrJI1wAusRaghQ6AILAABZWYXAdAuDxgIPtwZmhcB154m14Pz//7sEAQAAU75oC0EAVmoA/xUowEAAZoM9aAtBACJ0CIm16Pz//+sNx4Xo/P//agtBAIPoAouV6Pz//zPJZokMQo2F8Pz//1DGBdD+QABQ6OX6//+L+DPAhf8PlcDHBCSU3EAAUOg0+v//WY2HBAEAADP2WYvPO/hzFYoRgPoNdAyA+gp0B0E7yHLv6wKL8TPAhfYPlcBorNxAAFDo/fn//1lZU42F9P3//1DGBgAr91ZXagho6f0AAP8VMMBAAIvwM8Az2zvzD5XAaNjcQABQ6Mn5//8zwGaJhHX0/f//WVmNtfT9//9mOZ30/f//dBkPtwZqCFDo8gkAAFlZhcB0CIPGAmY5HnXnM8Bmgz4jaATdQAAPlMBQ6IH5//9ZWWoCX+sOaghQ6MEJAABZWYXAdAoD9w+3BmY7w3XoM8Bmgz4haDTdQAAPlMBQ6E75//9ZWesOaghQ6JEJAABZWYXAdAoD9w+3BmY7w3XojYXs/P//UFaJnez8///oPP3//4mF5Pz//zPAOZ3k/P//aGjdQAAPlcBQ6AP5//8zwDmd7Pz//2iU3UAAD5XAUOjt+P//i4Xk/P//g8QYjUgCZosQA8dmO9N19ivB0fiL8IuF7Pz//41IAmaLEAPHZjvTdfYrwdH4iYXc/P//i4Xo/P//jUgCZosQA8dmO9N19ivB0fiLyIuF4Pz//41QAmaLGAPHZoXbdfYrwtH4A8gDjdz8//9XjXQxCFboqQQAAIv4M8CF/w+VwGjQ3UAAUOhd+P///7Xg/P///7Xo/P///7Xs/P///7Xk/P//aATeQABWVlfo/AUAAIPEMFfou/r//8zoJP3//8w7DQTwQAB1AvPD6T0OAABqDGjw3kAA6AQXAAAz/4l95DPAi10IO98PlcA7x3UU6JwWAADHABYAAADoPxYAADPA63szwIt1DDv3D5XAO8d03jPAZjk+D5XAO8d00uhfEwAAiUUIO8d1DehiFgAAxwAYAAAA68mJffxmOTt1IOhNFgAAxwAWAAAAav6NRfBQaATwQADodxgAAIPEDOuhUP91EFZT6F8QAACDxBCJReTHRfz+////6AkAAACLReToohYAAMP/dQjo0Q8AAFnDi/9Vi+xWi3UIhfZ1E+jwFQAAahZeiTDolBUAAIvG6yRogAAAAP91EP91DOgS////g8QMiQaFwHQEM8DrB+jAFQAAiwBeXcOL/1WL7ItFCGaLVQzrCGY7ynQSg8ACD7cIZoXJdfBmORB0AjPAXcOL/1WL7Gi8wUAA/xVUwEAAhcB0FWiswUAAUP8VQMBAAIXAdAX/dQj/0F3Di/9Vi+z/dQjoyP///1n/dQj/FQDAQADMagjoVhoAAFnDagjodBkAAFnDi/9W6BodAACL8Fbo2xwAAFboTRMAAFbowBwAAFboqxwAAFbooBoAAFboiRoAAIPEGF7Di/9Vi+xWi3UIM8DrD4XAdRCLDoXJdAL/0YPGBDt1DHLsXl3Di/9Vi+yDPdweQQAAdBlo3B5BAOhgIwAAWYXAdAr/dQj/FdweQQBZ6JkiAABoaMFAAGhQwUAA6KH///9ZWYXAdVRWV2i3PEAA6BUiAAC4SMFAAL5MwUAAWYv4O8ZzD4sHhcB0Av/Qg8cEO/5y8YM94B5BAABfXnQbaOAeQQDo9iIAAFmFwHQMagBqAmoA/xXgHkEAM8Bdw2ogaBDfQADolRQAAGoI6EoZAABZg2X8ADPAQDkFEP9AAA+E2AAAAKMM/0AAikUQogj/QACDfQwAD4WgAAAA/zXUHkEAizVYwEAA/9aL2Ild0IXbdGj/NdAeQQD/1ov4iX3UiV3ciX3Yg+8EiX3UO/tyS+i9GwAAOQd07Tv7cj7/N//Wi9joqhsAAIkH/9P/NdQeQQD/1ovY/zXQHkEA/9Y5Xdx1BTlF2HQOiV3ciV3QiUXYi/iJfdSLXdDrq8dF5GzBQACBfeR4wUAAcxGLReSLAIXAdAL/0INF5ATr5sdF4HzBQACBfeCAwUAAcxGLReCLAIXAdAL/0INF4ATr5sdF/P7////oIAAAAIN9EAB1KccFEP9AAAEAAABqCOhiFwAAWf91COi9/f//g30QAHQIagjoTBcAAFnD6KcTAADDi/9Vi+xqAGoA/3UI6K/+//+DxAxdw4v/VYvsagBqAf91COiZ/v//g8QMXcNqAWoAagDoif7//4PEDMNqAWoBagDoev7//4PEDMOL/1WL7OjeIwAA/3UI6CciAABZaP8AAADor////8yL/1WL7IN9CAB0Lf91CGoA/zUACkEA/xVcwEAAhcB1GFbogxIAAIvw/xU8wEAAUOgzEgAAWYkGXl3Di/9Vi+xRg2X8AFaNRfxQ/3UM/3UI6M0jAACL8IPEDIX2dRg5Rfx0E+hCEgAAhcB0Cug5EgAAi038iQiLxl7Jw4v/VYvsU4tdCIP74HdvVleDPQAKQQAAdRjoMiMAAGoe6HwhAABo/wAAAOiX/P//WVmF23QEi8PrAzPAQFBqAP81AApBAP8VYMBAAIv4hf91JmoMXjkFBApBAHQNU+iIGQAAWYXAdanrB+jBEQAAiTDouhEAAIkwi8dfXusUU+hnGQAAWeimEQAAxwAMAAAAM8BbXcPMzMzMzMzMzMzMzItEJAxThcB0UotUJAgz24pcJAz3wgMAAAB0FooKg8IBMst0coPoAXQy98IDAAAAdeqD6ARyEleL+8HjCAPfi/vB4xAD3+sbX4PABHQOigqDwgEyy3RAg+gBdfJbw4PoBHLliwozy7///v5+A/mD8f8zz4PCBIHhAAEBgXTgi0r8Mst0IzLrdBnB6RAyy3QMMut0AuvIX41C/1vDjUL+X1vDjUL9X1vDjUL8X1vDi/9Vi+yNRRhQagD/dRT/dRD/dQz/dQjoeCcAAIPEGF3Di/9Vi+yD7BCLTQhTi10MVleLfRCJTfiJXfyF/3Qag30UAHQUhcl1F+iVEAAAxwAWAAAA6DgQAAAzwF9eW8nDi3UYhfZ0DIPI/zPS9/c5RRR2IYP7/3QMU2oAUehyMAAAg8QMhfZ0wYPI/zPS9/c5RRR3tQ+vfRT3RgwMAQAAiX3wi990CItGGIlF9OsHx0X0ABAAAIX/D4TaAAAA90YMDAEAAHREi0YEhcB0PQ+I8gAAAIv7O9hyAov4O338D4e7AAAAV/82/3X8/3X46IcvAAApfgQBPgF9+Cvfg8QQKX38i33w6YUAAAA7XfRyXIN99AB0H7n///9/M9I72XYJi8H3dfSLwesHi8P3dfSLwyvC6wu4////fzvYdwKLwztF/HdbUP91+FboBS8AAFlQ6AguAACDxAyFwHR7g/j/dGQBRfgr2ClF/OskVugTJwAAWYP4/3RSg338AHQii034/0X4iAGLRhhL/038iUX0hdsPhSb///+LRRTpvP7//4N9DP90EP91DGoA/3UI6EEvAACDxAzoKQ8AAMcAIgAAAOmP/v//g04MIIvHK8Mz0vd1EOmE/v//g04MEOvszMzMagxoMN9AAOhHDwAAM/aJdeQ5dRB0Lzl1FHQqOXUYdS2DfQz/dA//dQxW/3UI6OEuAACDxAzoyQ4AAMcAFgAAAOhsDgAAM8DoTA8AAMP/dRjoCAgAAFmJdfz/dRj/dRT/dRD/dQz/dQjo1P3//4PEFIlF5MdF/P7////oBQAAAItF5OvD/3UY6EQIAABZw4v/VYvs/3UU/3UQ/3UMav//dQjoWv///4PEFF3Di/9Vi+xRuP//AABmOUUIdQQzwMnDuAABAABmOUUIcxAPt0UIiw1U9kAAD7cEQesdjUX8UGoBjUUIUGoB/xVkwEAAhcB1AyFF/A+3RfwPt00MI8HJw4v/VYvsg+wMU1eLfQgz2zv7dRjo6w0AAMcAFgAAAOiODQAAg8j/6WUBAABWV+hBLQAAi/BZiXX4OV8EfQOJXwRqAVNW6P4wAACDxAyJRfw7ww+M+wAAAItXDPfCCAEAAHUIK0cE6SUBAACLB4tPCIvYK9mJXfT2wgN0PIvWwfoFixSVoA1BAIPmH8HmBvZEMgSAdBaL0TvQcxCL8IA6CnUBQ0I71nL1iV30g338AHUbi8Pp2AAAAITSeO/oQw0AAMcAFgAAAOmHAAAA9kcMAQ+EtAAAAItXBIXSdQghVfTppQAAAItd+It1+CvBA8LB+wWD5h+NHJ2gDUEAiUUIiwPB5gb2RDAEgHR5agJqAP91+OgxMAAAg8QMO0X8dSCLRwiLTQgDyOsJgDgKdQP/RQhAO8Fy8/dHDAAgAADrQGoA/3X8/3X46PwvAACDxAyFwHkFg8j/6zi4AAIAADlFCHcQi08M9sEIdAj3wQAEAAB0A4tHGIlFCIsD9kQwBAR0A/9FCItFCClF/ItF9ANF/F5fW8nDagxoUN9AAOizDAAAM8A5RQgPlcCFwHUV6FIMAADHABYAAADo9QsAAIPI/+so/3UI6JQFAABZg2X8AP91COgq/v//WYlF5MdF/P7////oCQAAAItF5OiqDAAAw/91COjZBQAAWcOL/1WL7FaLdQiLRgyog3UQ6PULAADHABYAAACDyP/rZ4Pg74N9EAGJRgx1Dlbo1f3//wFFDINlEABZVujiLwAAi0YMWYTAeQiD4PyJRgzrFqgBdBKoCHQOqQAEAAB1B8dGGAACAAD/dRD/dQxW6AgrAABZUOjVLgAAM8mDxAyD+P8PlcGNQf9eXcNqDGhw30AA6MQLAAAzwDlFCA+VwIXAdRXoYwsAAMcAFgAAAOgGCwAAg8j/6z+LdRCF9nQKg/4BdAWD/gJ12v91COiUBAAAWYNl/ABW/3UM/3UI6B////+DxAyJReTHRfz+////6AkAAACLReTopAsAAMP/dQjo0wQAAFnDi/9Vi+xWi3UIV4PP/4X2dRTo7goAAMcAFgAAAOiRCgAAC8frRPZGDIN0OFbo6y4AAFaL+OjWMQAAVug1KgAAUOgGMQAAg8QQhcB5BYPP/+sSi0YchcB0C1Do/ff//4NmHABZg2YMAIvHX15dw2oMaJDfQADo2woAAINN5P8zwIt1CIX2D5XAhcB1Feh0CgAAxwAWAAAA6BcKAACDyP/rDfZGDEB0DYNmDACLReTo5woAAMNW6KUDAABZg2X8AFboPP///1mJReTHRfz+////6AUAAADr1It1CFbo8gMAAFnDi/9Vi+yDPRz/QAABdQXoMRsAAP91COh6GQAAaP8AAADolfT//1lZXcNqWGiw30AA6D4KAACNRZhQ/xVwwEAAM/Y5NcgeQQB1C1ZWagFW/xVswEAAuE1aAABmOQUAAEAAdAWJdeTrNqE8AEAAgbgAAEAAUEUAAHXquQsBAABmOYgYAEAAddyDuHQAQAAOdtMzyTmw6ABAAA+VwYlN5OjbGgAAhcB1CGoc6FP///9Z6EwUAACFwHUIahDoQv///1no8BYAAIl1/OjhKQAAhcB5CGob6IX2//9Z/xVowEAAo8QeQQDooTUAAKMU/0AA6Nw0AACFwHkIagjoX/b//1noVTIAAIXAeQhqCehO9v//WWoB6CX0//9ZO8Z0B1DoO/b//1no0jEAAPZFxAF0Bg+3TcjrA2oKWVFQVmgAAEAA6Avy//+JReA5deR1BlDowfX//+jo9f//6y6LReyLCIsJiU3cUFHoRjAAAFlZw4tl6ItF3IlF4IN95AB1BlDop/X//+jH9f//x0X8/v///4tF4OgjCQAAw+iFNQAA6Yn+//+L/1WL7IHsKAMAAKMoAEEAiQ0kAEEAiRUgAEEAiR0cAEEAiTUYAEEAiT0UAEEAZowVQABBAGaMDTQAQQBmjB0QAEEAZowFDABBAGaMJQgAQQBmjC0EAEEAnI8FOABBAItFAKMsAEEAi0UEozAAQQCNRQijPABBAIuF4Pz//8cFeP9AAAEAAQChMABBAKMs/0AAxwUg/0AACQQAwMcFJP9AAAEAAAChBPBAAImF2Pz//6EI8EAAiYXc/P///xWAwEAAo3D/QABqAehONQAAWWoA/xV8wEAAaNTBQAD/FXjAQACDPXD/QAAAdQhqAegqNQAAWWgJBADA/xUUwEAAUP8VdMBAAMnDuBDwQADDocAeQQBWahRehcB1B7gAAgAA6wY7xn0Hi8ajwB5BAGoEUOg1NQAAWVmjpA5BAIXAdR5qBFaJNcAeQQDoHDUAAFlZo6QOQQCFwHUFahpYXsMz0rkQ8EAA6wWhpA5BAIkMAoPBIIPCBIH5kPJAAHzqav5eM9K5IPBAAFeLwsH4BYsEhaANQQCL+oPnH8HnBosEB4P4/3QIO8Z0BIXAdQKJMYPBIEKB+YDwQAB8zl8zwF7D6GMsAACAPQj/QAAAdAXoMjUAAP81pA5BAOj/8///WcOL/1WL7FaLdQi4EPBAADvwciKB/nDyQAB3GovOK8jB+QWDwRBR6IgLAACBTgwAgAAAWesKg8YgVv8VhMBAAF5dw4v/VYvsi0UIg/gUfRaDwBBQ6FsLAACLRQyBSAwAgAAAWV3Di0UMg8AgUP8VhMBAAF3Di/9Vi+yLRQi5EPBAADvBch89cPJAAHcYgWAM/3///yvBwfgFg8AQUOg5CgAAWV3Dg8AgUP8ViMBAAF3Di/9Vi+yLTQiLRQyD+RR9E4FgDP9///+DwRBR6AoKAABZXcODwCBQ/xWIwEAAXcOL/1WL7IPsEKEUC0EAM9JTVot1DIlF/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+dPhqA1Zo3MFAAOiwPAAAg8QMhcAPhYgAAACDxgbrA4PGAmY5PnT4ZoM+PXV1g8YCZjk+dPhqBWjkwUAAVujfOwAAg8QMhcB1C4PGCoHLAAAEAOtBagho8MFAAFbowDsAAIPEDIXAdQuDxhCBywAAAgDrImoHaATCQABW6KE7AACDxAyFwHUbg8YOgcsAAAEA6wODxgJmgz4gdPcz/2Y5PnQS6GEDAADHABYAAADoBAMAAOscaIABAAD/dRCNRQxT/3UIUOhTOgAAg8QUhcB0BDPA6yCLRRT/BUQCQQCLTfyJSAyLTQyJeASJOIl4CIl4HIlIEF9eW8nDahBo0N9AAOhTAwAAM9sz/4l95GoB6AEIAABZiV38M/aJdeA7NcAeQQAPjcoAAAChpA5BAI0EsDkYdFuLAItADKiDdUipAIAAAHVBjUb9g/gQdxKNRhBQ6P0GAABZhcAPhJQAAAChpA5BAP80sFboN/z//1lZoaQOQQCLBLD2QAyDdAxQVuiO/P//WVlG65GL+Il95OtjajjoEjAAAFmLDaQOQQCJBLE7w3ROaKAPAAChpA5BAIsEsIPAIFD/FYzAQACFwKGkDkEAdRP/NLDok+///1mhpA5BAIkcsOsbiwSwg8AgUP8VhMBAAKGkDkEAizywiX3kiV8MO/t0FoFnDACAAACJXwSJXwiJH4lfHINPEP/HRfz+////6AsAAACLx+h+AgAAw4t95GoB6BEGAABZw4v/VYvsi0UIo0gCQQBdw4v/VYvsgewoAwAAoQTwQAAzxYlF/FOLXQhXg/v/dAdT6EAvAABZg6Xg/P//AGpMjYXk/P//agBQ6KAhAACNheD8//+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///8VgMBAAGoAi/j/FXzAQACNhdj8//9Q/xV4wEAAhcB1EIX/dQyD+/90B1PoSy4AAFmLTfxfM81b6Nfp///Jw4v/VmoBvhcEAMBWagLoxf7//4PEDFb/FRTAQABQ/xV0wEAAXsOL/1WL7P81SAJBAP8VWMBAAIXAdANd/+D/dRj/dRT/dRD/dQz/dQjor////8wzwFBQUFBQ6Mf///+DxBTDi/9Vi+yLRQgzyTsEzZDyQAB0E0GD+S1y8Y1I7YP5EXcOag1YXcOLBM2U8kAAXcMFRP///2oOWTvIG8AjwYPACF3D6BUJAACFwHUGuPjzQADDg8AIw+gCCQAAhcB1Brj880AAw4PADMOL/1WL7Fbo4v///4tNCFGJCOiC////WYvw6Lz///+JMF5dw8zMzMzMzMxosC9AAGT/NQAAAACLRCQQiWwkEI1sJBAr4FNWV6EE8EAAMUX8M8VQiWXo/3X4i0X8x0X8/v///4lF+I1F8GSjAAAAAMOLTfBkiQ0AAAAAWV9fXluL5V1Rw8zMzMzMzMyL/1WL7IPsGFOLXQxWi3MIMzUE8EAAV4sGxkX/AMdF9AEAAACNexCD+P50DYtOBAPPMww46Ejo//+LTgyLRggDzzMMOOg46P//i0UI9kAEZg+FGQEAAItNEI1V6IlT/ItbDIlF6IlN7IP7/nRfjUkAjQRbi0yGFI1EhhCJRfCLAIlF+IXJdBSL1+j0AQAAxkX/AYXAeEB/R4tF+IvYg/j+dc6Aff8AdCSLBoP4/nQNi04EA88zDDjoxef//4tODItWCAPPMww66LXn//+LRfRfXluL5V3Dx0X0AAAAAOvJi00IgTljc23gdSmDPaAOQQAAdCBooA5BAOjjDAAAg8QEhcB0D4tVCGoBUv8VoA5BAIPECItNDItVCOiUAQAAi0UMOVgMdBJoBPBAAFeL04vI6JYBAACLRQyLTfiJSAyLBoP4/nQNi04EA88zDDjoL+f//4tODItWCAPPMww66B/n//+LRfCLSAiL1+gqAQAAuv7///85UwwPhE////9oBPBAAFeLy+hBAQAA6Rn////MU1ZXi1QkEItEJBSLTCQYVVJQUVFo0DFAAGT/NQAAAAChBPBAADPEiUQkCGSJJQAAAACLRCQwi1gIi0wkLDMZi3AMg/7+dDuLVCQ0g/r+dAQ78nYujTR2jVyzEIsLiUgMg3sEAHXMaAEBAACLQwjoUjcAALkBAAAAi0MI6GQ3AADrsGSPBQAAAACDxBhfXlvDi0wkBPdBBAYAAAC4AQAAAHQzi0QkCItICDPI6EHm//9Vi2gY/3AM/3AQ/3AU6D7///+DxAxdi0QkCItUJBCJArgDAAAAw1WLTCQIiyn/cRz/cRj/cSjoFf///4PEDF3CBABVVldTi+ozwDPbM9Iz9jP//9FbX15dw4vqi/GLwWoB6K82AAAzwDPbM8kz0jP//+ZVi+xTVldqAFJodjJAAFHovogAAF9eW13DVYtsJAhSUf90JBTotf7//4PEDF3CCACL/1ZXM/a/UAJBAIM89QT0QAABdR2NBPUA9EAAiThooA8AAP8wg8cY/xWMwEAAhcB0DEaD/iR80zPAQF9ew4Mk9QD0QAAAM8Dr8Yv/U4sdmMBAAFa+APRAAFeLPoX/dBODfgQBdA1X/9NX6Fbp//+DJgBZg8YIgf4g9UAAfNy+APRAAF+LBoXAdAmDfgQBdQNQ/9ODxgiB/iD1QAB85l5bw4v/VYvsi0UI/zTFAPRAAP8ViMBAAF3Dagxo8N9AAOj6+///M/9HiX3kM9s5HQAKQQB1GOi2DAAAah7oAAsAAGj/AAAA6Bvm//9ZWYt1CI009QD0QAA5HnQEi8frbWoY6AkpAABZi/g7+3UP6F37///HAAwAAAAzwOtQagroWAAAAFmJXfw5HnUraKAPAABX/xWMwEAAhcB1F1fohej//1noKPv//8cADAAAAIld5OsLiT7rB1foauj//1nHRfz+////6AkAAACLReTok/v//8NqCugp////WcOL/1WL7ItFCFaNNMUA9EAAgz4AdRNQ6CP///9ZhcB1CGoR6Abo//9Z/zb/FYTAQABeXcNqCGgQ4EAA6AX7///oQwQAAItAeIXAdBaDZfwA/9DrBzPAQMOLZejHRfz+////6LU0AADoHvv//8NoPzRAAP8VkMBAAKOgA0EAw4v/VYvsi0UIo6QDQQCjqANBAKOsA0EAo7ADQQBdw4v/VYvsi0UIiw301EAAVjlQBHQPi/Fr9gwDdQiDwAw7xnLsa8kMA00IXjvBcwU5UAR0AjPAXcP/NawDQQD/FVjAQADDaiBoMOBAAOhZ+v//M/+JfeSJfdiLXQiD+wt/S3QVi8NqAlkrwXQiK8F0CCvBdFkrwXVD6PcCAACL+Il92IX/dRSDyP/pVAEAAL6kA0EAoaQDQQDrVf93XIvT6F3///9ZjXAIiwbrUYvDg+gPdDKD6AZ0IUh0Euia+f//xwAWAAAA6D35///rub6sA0EAoawDQQDrFr6oA0EAoagDQQDrCr6wA0EAobADQQDHReQBAAAAUP8VWMBAAIlF4DPAg33gAQ+E1gAAADlF4HUHagPoR+b//zlF5HQHUOhD/v//WTPAiUX8g/sIdAqD+wt0BYP7BHUbi09giU3UiUdgg/sIdT6LT2SJTdDHR2SMAAAAg/sIdSyLDejUQACJTdyLDezUQAADDejUQAA5Tdx9GYtN3GvJDItXXIlEEQj/Rdzr3ei0AAAAiQbHRfz+////6BUAAACD+wh1H/93ZFP/VeBZ6xmLXQiLfdiDfeQAdAhqAOjU/P//WcNT/1XgWYP7CHQKg/sLdAWD+wR1EYtF1IlHYIP7CHUGi0XQiUdkM8DoCPn//8OL/1WL7ItFCKO4A0EAXcOL/1WL7ItFCKO8A0EAXcOL/1WL7ItFCKPAA0EAXcOL/1WL7P81wANBAP8VWMBAAIXAdA//dQj/0FmFwHQFM8BAXcMzwF3DagD/FZDAQADD/xWgwEAAwgQAi/9W/zUk9UAA/xWkwEAAi/CF9nUb/zXIA0EA/xVYwEAAi/BW/zUk9UAA/xWowEAAi8Zew6Eg9UAAg/j/dBZQ/zXQA0EA/xVYwEAA/9CDDSD1QAD/oST1QACD+P90DlD/FazAQACDDST1QAD/6Xb7//9qCGhQ4EAA6N73//9oFMJAAP8VVMBAAIt1CMdGXFjUQACDZggAM/9HiX4UiX5wxobIAAAAQ8aGSwEAAEPHRmgQ+UAAag3oXPz//1mDZfwA/3Zo/xWwwEAAx0X8/v///+g+AAAAagzoO/z//1mJffyLRQyJRmyFwHUIoQj5QACJRmz/dmzo8jQAAFnHRfz+////6BUAAADolPf//8Mz/0eLdQhqDegk+///WcNqDOgb+///WcOL/1ZX/xU8wEAA/zUg9UAAi/joxP7////Qi/CF9nVOaBQCAABqAeigJAAAi/BZWYX2dDpW/zUg9UAA/zXMA0EA/xVYwEAA/9CFwHQYagBW6Pj+//9ZWf8VuMBAAINOBP+JBusJVujT4///WTP2V/8VtMBAAF+Lxl7Di/9W6H////+L8IX2dQhqEOiR4///WYvGXsNqCGh44EAA6Jf2//+LdQiF9g+E+AAAAItGJIXAdAdQ6Ibj//9Zi0YshcB0B1DoeOP//1mLRjSFwHQHUOhq4///WYtGPIXAdAdQ6Fzj//9Zi0ZAhcB0B1DoTuP//1mLRkSFwHQHUOhA4///WYtGSIXAdAdQ6DLj//9Zi0ZcPVjUQAB0B1DoIeP//1lqDejO+v//WYNl/ACLfmiF/3QaV/8VvMBAAIXAdQ+B/xD5QAB0B1fo9OL//1nHRfz+////6FcAAABqDOiV+v//WcdF/AEAAACLfmyF/3QjV+jkMwAAWTs9CPlAAHQUgf8w+EAAdAyDPwB1B1foYTQAAFnHRfz+////6B4AAABW6Jzi//9Z6NT1///CBACLdQhqDehl+f//WcOLdQhqDOhZ+f//WcOL/1doFMJAAP8VVMBAAIv4hf91Ceg0/f//M8Bfw1aLNUDAQABoUMJAAFf/1mhEwkAAV6PEA0EA/9ZoOMJAAFejyANBAP/WaDDCQABXo8wDQQD/1oM9xANBAACLNajAQACj0ANBAHQWgz3IA0EAAHQNgz3MA0EAAHQEhcB1JKGkwEAAo8gDQQChrMBAAMcFxANBAOw2QACJNcwDQQCj0ANBAP8VoMBAAKMk9UAAg/j/D4TBAAAA/zXIA0EAUP/WhcAPhLAAAADoGt////81xANBAIs1kMBAAP/W/zXIA0EAo8QDQQD/1v81zANBAKPIA0EA/9b/NdADQQCjzANBAP/Wo9ADQQDorPf//4XAdGOLPVjAQABorThAAP81xANBAP/X/9CjIPVAAIP4/3REaBQCAABqAejQIQAAi/BZWYX2dDBW/zUg9UAA/zXMA0EA/9f/0IXAdBtqAFboLPz//1lZ/xW4wEAAg04E/4kGM8BA6wfo1/v//zPAXl/Di/9Vi+xRU1aLNVjAQABX/zXUHkEA/9b/NdAeQQCL2Ild/P/Wi/A78w+CgQAAAIv+K/uNRwSD+ARydVPoZzsAAIvYjUcEWTvYc0i4AAgAADvYcwKLwwPDO8NyD1D/dfzodiEAAFlZhcB1Fo1DEDvDcj5Q/3X86GAhAABZWYXAdC/B/wJQjTS4/xWQwEAAo9QeQQD/dQiLPZDAQAD/14kGg8YEVv/Xo9AeQQCLRQjrAjPAX15bycOL/1ZqBGog6MwgAABZWYvwVv8VkMBAAKPUHkEAo9AeQQCF9nUFahhYXsODJgAzwF7DagxooOBAAOgG8///6GDd//+DZfwA/3UI6Pz+//9ZiUXkx0X8/v///+gJAAAAi0Xk6CLz///D6D/d///Di/9Vi+z/dQjot/////fYG8D32FlIXcOL/1a44N5AAL7g3kAAV4v4O8ZzD4sHhcB0Av/Qg8cEO/5y8V9ew4v/Vrjo3kAAvujeQABXi/g7xnMPiweFwHQC/9CDxwQ7/nLxX17Di/9WVzP//7co9UAA/xWQwEAAiYco9UAAg8cEg/8ocuZfXsOL/1WL7ItNCLhNWgAAZjkBdAQzwF3Di0E8A8GBOFBFAAB17zPSuQsBAABmOUgYD5TCi8Jdw8zMzMzMzMzMzMzMi/9Vi+yLRQiLSDwDyA+3QRRTVg+3cQYz0leNRAgYhfZ0G4t9DItIDDv5cgmLWAgD2Tv7cgpCg8AoO9Zy6DPAX15bXcPMzMzMzMzMzMzMzMyL/1WL7Gr+aMDgQABosC9AAGShAAAAAFCD7AhTVlehBPBAADFF+DPFUI1F8GSjAAAAAIll6MdF/AAAAABoAABAAOgq////g8QEhcB0VItFCC0AAEAAUGgAAEAA6FD///+DxAiFwHQ6i0Akwegf99CD4AHHRfz+////i03wZIkNAAAAAFlfXluL5V3Di0Xsiwgz0oE5BQAAwA+UwovCw4tl6MdF/P7///8zwItN8GSJDQAAAABZX15bi+Vdw4v/VYvsM8CLTQg7DMXgykAAdApAg/gWcu4zwF3DiwTF5MpAAF3Di/9Vi+yB7PwBAAChBPBAADPFiUX8U1aLdQhXVui5////i/gz21mJvQT+//87+w+EbAEAAGoD6Eo8AABZg/gBD4QHAQAAagPoOTwAAFmFwHUNgz0A8EAAAQ+E7gAAAIH+/AAAAA+ENgEAAGgczEAAaBQDAAC/2ANBAFfoozsAAIPEDIXAD4W4AAAAaAQBAAC+CgRBAFZTZqMSBkEA/xUowEAAu/sCAACFwHUfaOzLQABTVuhrOwAAg8QMhcB0DDPAUFBQUFDoIO///1boNzsAAEBZg/g8dipW6Co7AACNBEWUA0EAi8grzmoD0flo5MtAACvZU1DoQDoAAIPEFIXAdb1o3MtAAL4UAwAAVlfoszkAAIPEDIXAdaX/tQT+//9WV+ifOQAAg8QMhcB1kWgQIAEAaJDLQABX6Bw4AACDxAzrXlNTU1NT6Xn///9q9P8VOMBAAIvwO/N0RoP+/3RBM8CKDEeIjAUI/v//ZjkcR3QIQD30AQAAcuhTjYUE/v//UI2FCP7//1CIXfvoPjcAAFlQjYUI/v//UFb/FcDAQACLTfxfXjPNW+gS2P//ycNqA+jPOgAAWYP4AXQVagPowjoAAFmFwHUfgz0A8EAAAXUWaPwAAADoJf7//2j/AAAA6Bv+//9ZWcNqAGgAEAAAagD/FcTAQAAzyYXAD5XBowAKQQCLwcOL/1WL7ItNCIXJdBtq4DPSWPfxO0UMcw/oa+7//8cADAAAADPAXcMPr00MVovxhfZ1AUYzwIP+4HcTVmoI/zUACkEA/xVgwEAAhcB1MoM9BApBAAB0HFbo5/X//1mFwHXSi0UQhcB0BscADAAAADPA6w2LTRCFyXQGxwEMAAAAXl3Di/9Vi+yD7CBTVzPbagczwFmNfeSJXeDzqzldFHUY6OPt///HABYAAADohu3//4PI/+mQAAAAi30QVot1DDv7dBk783UV6Lzt///HABYAAADoX+3//4PI/+truP///3+JReQ7+HcDiX3k/3UcjUXg/3UYx0XsQgAAAP91FIl16FCJdeD/VQiDxBCJRRQ783Q1O8N8Iv9N5HgHi0XgiBjrEY1F4FBT6CwBAABZWYP4/3QFi0UU6w8zwDld5IhcPv8PncCD6AJeX1vJw4v/VYvsg30UAHUV6Czt///HABYAAADoz+z//4PI/13DU4tdEFaLdQhXhdt1EIX2dRA5dQx1EjPA6aoAAACF9nQHi30Mhf91EOjv7P//xwAWAAAA6YcAAADo3+z///91HP91GP91FDv7diqLOENTVmjLe0AA6L3+//+DxBiD+P51R+i27P//gzgidVnorOz//4k461CLGFdWaMt7QADolP7//4PEGMZEPv8Ag/j+dRmDfRD/dRfoguz//4M4InUl6Hjs//+JGOschcB5G8YGAIP4/nUQ6GPs///HACIAAADoBuz//4PI/19eW13Di/9Vi+z/dRhqAP91FP91EP91DP91COj5/v//g8QYXcOL/1WL7FFWi3UMVuiQCwAAiUUMi0YMWaiCdRfoEOz//8cACQAAAINODCCDyP/pLwEAAKhAdA3o9ev//8cAIgAAAOvjUzPbqAF0FoleBKgQD4SHAAAAi04Ig+D+iQ6JRgyLRgyD4O+DyAKJRgyJXgSJXfypDAEAAHUs6DXk//+DwCA78HQM6Cnk//+DwEA78HUN/3UM6B9OAABZhcB1B1boy00AAFn3RgwIAQAAVw+EgAAAAItGCIs+jUgBiQ6LThgr+EmJTgQ7+34dV1D/dQzox0wAAIPEDIlF/OtNg8ggiUYMg8j/63mLTQyD+f90G4P5/nQWi8GD4B+L0cH6BcHgBgMElaANQQDrBbhY9kAA9kAEIHQUagJTU1HolUQAACPCg8QQg/j/dCWLRgiKTQiICOsWM/9HV41FCFD/dQzoWEwAAIPEDIlF/Dl9/HQJg04MIIPI/+sIi0UIJf8AAABfW17Jw4v/VYvsi0UIVovxxkYMAIXAdWPoR/T//4lGCItIbIkOi0hoiU4Eiw47DQj5QAB0EosNOP5AAIVIcHUH6C0rAACJBotGBDsFOP1AAHQWi0YIiw04/kAAhUhwdQjoqS0AAIlGBItGCPZAcAJ1FINIcALGRgwB6wqLCIkOi0AEiUYEi8ZeXcIEAIv/VYvsg+wgU1cz22oHM8BZjX3kiV3g86s5XRR1GOgi6v//xwAWAAAA6MXp//+DyP/pvAAAAIt9EFaLdQw7+3QcO/N1GOj76f//xwAWAAAA6J7p//+DyP/plAAAAMdF7EIAAACJdeiJdeCB/////z92CcdF5P///3/rBo0EP4lF5P91HI1F4P91GP91FFD/VQiDxBCJRRQ783RWO8N8Qv9N5HgKi0XgiBj/ReDrEY1F4FBT6F39//9ZWYP4/3Qi/03keAeLReCIGOsRjUXgUFPoQP3//1lZg/j/dAWLRRTrEDPAOV3kZolEfv4PncCD6AJeX1vJw4v/VYvsg30UAHUV6D/p///HABYAAADo4uj//4PI/13DU4tdEFaLdQhXhdt1EIX2dRA5dQx1EjPA6a4AAACF9nQHi30Mhf91EOgC6f//xwAWAAAA6YsAAADo8uj///91HP91GP91FDv7diqLOENTVmgrlkAA6JH+//+DxBiD+P51SejJ6P//gzgidV3ov+j//4k461SLGFdWaCuWQADoaP7//zPJg8QYZolMfv6D+P51GYN9EP91F+iT6P//gzgidSfoiej//4kY6x6FwHkdM8lmiQ6D+P51EOhy6P//xwAiAAAA6BXo//+DyP9fXltdw4v/VYvsVot1CIX2dRXoTej//8cAFgAAAOjw5///6foAAACLRgyogw+E7wAAAKhAD4XnAAAAqAJ0C4PIIIlGDOnYAAAAg8gBiUYMqQwBAAB1CVboR0oAAFnrBYtGCIkG/3YY/3YIVuhkBwAAWVDoZwYAAIPEDIlGBIXAD4SLAAAAg/j/D4SCAAAA9kYMgnVRVug6BwAAWYP4/3QwVuguBwAAWYP4/nQkV1boIQcAAMH4BVaNPIWgDUEA6BEHAACD4B9ZweAGAwdZX+sFuFj2QACKQAQkgjyCdQeBTgwAIAAAgX4YAAIAAHUVi0YMqAh0DqkABAAAdQfHRhgAEAAAiw7/TgQPtgFBiQ7rFPfYG8CD4BCDwBAJRgyDZgQAg8j/Xl3Di/9Vi+yD7ByLVRBWi3UIav5YiUXsiVXkO/B1G+gv5///gyAA6BTn///HAAkAAACDyP/pfQUAAFMz2zvzfAg7NYANQQByH+gF5///iRjo6+b//8cACQAAAOiO5v//g8j/6U4FAACLxsH4BVeD5h+NPIWgDUEAiwfB5gaKTDAE9sEBdRToyOb//4kY6K7m///HAAkAAADraIH6////f3dOiV30O9MPhAYFAAD2wQIPhf0EAAA5XQx0NYpEMCQCwND4iEX+D77ASGoEWXQZSHUOi8L30KgBdBaD4v6JVRCLXQyJXfDreovC99CoAXUZ6F7m//+JGOhE5v//xwAWAAAA6Ofl///rNovC0eiJTRA7wXIDiUUQ/3UQ6METAACL2FmJXfCF23Ue6BLm///HAAwAAADoGub//8cACAAAAIPI/+luBAAAagFqAGoA/3UI6Oo+AACLD4lEDiiDxBCJVA4siw8DzvZBBEiLw3R6ikkFgPkKdHKDfRAAdGz/TRCAff4AiAuLD41DAcdF9AEAAADGRA4FCnRQiw+KTA4lgPkKdEWDfRAAdD+ICIsPQP9NEIB9/gHHRfQCAAAAxkQOJQp1JYsPikwOJoD5CnQag30QAHQUiAiLD0D/TRDHRfQDAAAAxkQOJgpqAI1N6FH/dRBQiwf/NAb/FcjAQACFwA+EeAMAAItN6IXJD4htAwAAO00QD4dkAwAAiwcBTfSNRAYE9gCAD4TkAQAAgH3+Ag+EFAIAAIXJdAqAOwp1BYAIBOsDgCD7i13wi0X0A8OJXRCJRfQ72A+D0QAAAItNEIoBPBoPhK8AAAA8DXQMiANDQYlNEOmRAAAAi0X0SDvIcxiNQQGAOAp1C4PBAolNEMYDCut1iUUQ623/RRBqAI1F6FBqAY1F/1CLB/80Bv8VyMBAAIXAdQr/FTzAQACFwHVFg33oAHQ/iwf2RAYESHQUgH3/CnS5xgMNiweKTf+ITAYF6yU7XfB1BoB9/wp0oGoBav9q//91COhCPQAAg8QQgH3/CnQExgMNQ4tF9DlFEA+CRv///+sViweNRAYE9gBAdQWACALrBYoBiANDi8MrRfCAff4BiUX0D4XQAAAAhcAPhMgAAABLiguEyXgGQ+mGAAAAM8BAD7bJ6w+D+AR/Eztd8HIOSw+2C0CAuVD1QAAAdOiKEw+2yg++iVD1QACFyXUN6Lfj///HACoAAADrekE7yHUEA9jrQIsP9kQxBEh0JUOIVDEFg/gCfAmKE4sPiFQOJUOD+AN1CYoTiw+IVA4mQyvY6xL32JlqAVJQ/3UI6Gg8AACDxBCLReQrXfDR6FD/dQxT/3XwagBo6f0AAP8VMMBAAIlF9IXAdTT/FTzAQABQ6Fzj//9Zg03s/4tF8DtFDHQHUOh60P//WYtF7IP4/g+FiwEAAItF9OmDAQAAi0X0ixczyTvDD5XBA8CJRfSJTBYw68aFyXQLZoM7CnUFgAgE6wOAIPuLXfCLRfQDw4ldEIlF9DvYD4MBAQAAi0UQD7cIg/kaD4TZAAAAg/kNdBFmiQuDwwKDwAKJRRDptQAAAItN9IPB/jvBcx6NSAJmgzkKdQ2DwASJRRBqCumOAAAAiU0Q6YQAAACDRRACagCNRehQagKNRfhQiwf/NAb/FcjAQACFwHUK/xU8wEAAhcB1W4N96AB0VYsH9kQGBEh0KGaDffgKdLJqDVhmiQOLB4pN+IhMBgWLB4pN+YhMBiWLB8ZEBiYK6yo7XfB1B2aDffgKdIVqAWr/av7/dQjoBzsAAIPEEGaDffgKdAlqDVhmiQODwwKLRfQ5RRAPghr////rGYsPjXQOBPYGQHUFgA4C6wlmiwBmiQODwwIrXfCJXfTpkv7///8VPMBAAGoFXjvGdRfoseH//8cACQAAAOi54f//iTDpav7//4P4bQ+FWv7//4Nl7ADpXP7//zPAX1teycNqEGjg4EAA6Mrh//+LXQiD+/51G+iA4f//gyAA6GXh///HAAkAAACDyP/ptgAAAIXbeAg7HYANQQByGuhZ4f//gyAA6D7h///HAAkAAADo4eD//+vSi8PB+AWNPIWgDUEAi/OD5h/B5gaLBw++RDAEg+ABdMa4////fztFEBvAQHUV6BLh//+DIADo9+D//8cAFgAAAOu3U+hEVQAAWYNl/ACLB/ZEMAQBdBT/dRD/dQxT6JL5//+DxAyJReTrF+jC4P//xwAJAAAA6Mrg//+DIACDTeT/x0X8/v///+gMAAAAi0Xk6DHh///Di10IU+iMVQAAWcOL/1WL7ItFCIXAdRXof+D//8cAFgAAAOgi4P//g8j/XcOLQBBdw4v/VYvsVot1FIX2dQQzwOthg30IAHUT6E7g//9qFl6JMOjy3///i8brSIN9EAB0Fjl1DHIRVv91EP91COiJGgAAg8QM68f/dQxqAP91COgnAAAAg8QMg30QAHS7OXUMcw7oBOD//2oiWYkIi/HrsmoWWF5dw8zMzMzMi1QkDItMJASF0nRpM8CKRCQIhMB1FoH6gAAAAHIOgz14DUEAAHQF6X5WAABXi/mD+gRyMffZg+EDdAwr0YgHg8cBg+kBdfaLyMHgCAPBi8jB4BADwYvKg+IDwekCdAbzq4XSdAqIB4PHAYPqAXX2i0QkCF/Di0QkBMOL/1WL7IPsTFaNRbRQ/xVwwEAAakBqIF5W6D0NAABZWTPJO8F1CIPI/+kPAgAAjZAACAAAo6ANQQCJNYANQQA7wnM2g8AFg0j7/2bHQP8AColIA2bHQB8ACsZAIQqJSDOISC+LNaANQQCDwECNUPuBxgAIAAA71nLNU1dmOU3mD4QOAQAAi0XoO8EPhAMBAACLGIPABIlF/APDvgAIAACJRfg73nwCi945HYANQQB9a7+kDUEAakBqIOidDAAAWVmFwHRRgwWADUEAII2IAAgAAIkHO8FzMYPABYNI+/+DYAMAgGAfgINgMwBmx0D/AApmx0AgCgrGQC8Aiw+DwEADzo1Q+zvRctKDxwQ5HYANQQB8ousGix2ADUEAM/+F235yi0X4iwCD+P90XIP4/nRXi038ign2wQF0TfbBCHULUP8V0MBAAIXAdD2L94PmH4vHwfgFweYGAzSFoA1BAItF+IsAiQaLRfyKAIhGBGigDwAAjUYMUP8VjMBAAIXAD4S8AAAA/0YIg0X4BEf/Rfw7+3yOM9uL88HmBgM1oA1BAIsGg/j/dAuD+P50BoBOBIDrccZGBIGF23UFavZY6wqNQ//32BvAg8D1UP8VOMBAAIv4g///dEKF/3Q+V/8V0MBAAIXAdDMl/wAAAIk+g/gCdQaATgRA6wmD+AN1BIBOBAhooA8AAI1GDFD/FYzAQACFwHQs/0YI6wqATgRAxwb+////Q4P7Aw+MaP////81gA1BAP8VzMBAADPAX1teycODyP/r9ov/VYvsVot1CFboFFEAAFmD+P91EOgX3f//xwAJAAAAg8j/601X/3UQagD/dQxQ/xXUwEAAi/iD//91CP8VPMBAAOsCM8CFwHQMUOgH3f//WYPI/+sbi8bB+AWLBIWgDUEAg+YfweYGjUQwBIAg/YvHX15dw2oQaADhQADoAN3//4tdCIP7/nUb6Lbc//+DIADom9z//8cACQAAAIPI/+mUAAAAhdt4CDsdgA1BAHIa6I/c//+DIADodNz//8cACQAAAOgX3P//69KLw8H4BY08haANQQCL84PmH8HmBosHD75EMASD4AF0xlPonFAAAFmDZfwAiwf2RDAEAXQU/3UQ/3UMU+j2/v//g8QMiUXk6xfoGtz//8cACQAAAOgi3P//gyAAg03k/8dF/P7////oDAAAAItF5OiJ3P//w4tdCFPo5FAAAFnDi/9Vi+xTVot1CItGDIvIgOEDM9uA+QJ1QKkIAQAAdDmLRghXiz4r+IX/fixXUFboJPv//1lQ6Bg9AACDxAw7x3UPi0YMhMB5D4Pg/YlGDOsHg04MIIPL/1+LRgiDZgQAiQZei8NbXcOL/1WL7FaLdQiF9nUJVug1AAAAWesvVuh8////WYXAdAWDyP/rH/dGDABAAAB0FFbou/r//1DoyVIAAFn32FkbwOsCM8BeXcNqFGgg4UAA6Hzb//8z/4l95Il93GoB6Cng//9ZiX38M/aJdeA7NcAeQQAPjYMAAAChpA5BAI0EsDk4dF6LAPZADIN0VlBW6IjU//9ZWTPSQolV/KGkDkEAiwSwi0gM9sGDdC85VQh1EVDoSv///1mD+P90Hv9F5OsZOX0IdRT2wQJ0D1DoL////1mD+P91AwlF3Il9/OgIAAAARuuEM/+LdeChpA5BAP80sFbokdT//1lZw8dF/P7////oEgAAAIN9CAGLReR0A4tF3Oj92v//w2oB6JPe//9Zw2oB6B////9Zw4v/VYvsVot1CFdW6DdOAABZg/j/dFChoA1BAIP+AXUJ9oCEAAAAAXULg/4CdRz2QEQBdBZqAugMTgAAagGL+OgDTgAAWVk7x3QcVuj3TQAAWVD/FVDAQACFwHUK/xU8wEAAi/jrAjP/VuhTTQAAi8bB+AWLBIWgDUEAg+YfweYGWcZEMAQAhf90DFfo69n//1mDyP/rAjPAX15dw2oQaEjhQADo/dn//4tdCIP7/nUb6LPZ//+DIADomNn//8cACQAAAIPI/+mEAAAAhdt4CDsdgA1BAHIa6IzZ//+DIADocdn//8cACQAAAOgU2f//69KLw8H4BY08haANQQCL84PmH8HmBosHD75EMASD4AF0xlPomU0AAFmDZfwAiwf2RDAEAXQMU+jV/v//WYlF5OsP6B/Z///HAAkAAACDTeT/x0X8/v///+gMAAAAi0Xk6JbZ///Di10IU+jxTQAAWcOL/1WL7FaLdQiLRgyog3QeqAh0Gv92COgwxv//gWYM9/v//zPAWYkGiUYIiUYEXl3Di/9Vi+yLRQiLAIE4Y3Nt4HUqg3gQA3Uki0AUPSAFkxl0FT0hBZMZdA49IgWTGXQHPQBAmQF1BejH3f//M8BdwgQAaDxWQAD/FXzAQAAzwMOL/1WL7Fbog+H//4vwhfYPhDIBAACLTlyLVQiLwVc5EHQNg8AMjbmQAAAAO8dy74HBkAAAADvBcwQ5EHQCM8CFwHQHi1AIhdJ1BzPA6fUAAACD+gV1DINgCAAzwEDp5AAAAIP6AQ+E2AAAAItNDFOLXmCJTmCLSASD+QgPhbYAAABqJFmLflyDZDkIAIPBDIH5kAAAAHztiwCLfmQ9jgAAwHUJx0ZkgwAAAOt+PZAAAMB1CcdGZIEAAADrbj2RAADAdQnHRmSEAAAA6149kwAAwHUJx0ZkhQAAAOtOPY0AAMB1CcdGZIIAAADrPj2PAADAdQnHRmSGAAAA6y49kgAAwHUJx0ZkigAAAOsePbUCAMB1CcdGZI0AAADrDj20AgDAdQfHRmSOAAAA/3Zkagj/0lmJfmTrB4NgCABR/9JZiV5gW4PI/19eXcOL/1ZXM/85PdgeQQB1Bej3HgAAizXEHkEAhfZ1Bb741EAAigY8IHcIhMB0LoX/dCQ8InUJM8mF/w+UwYv5D7bAUOiUTwAAWYXAdAFGRuvTPCB3B0aKBoTAdfVfi8Zew4M92B5BAAB1BeidHgAAVos1FP9AAFcz/4X2dRiDyP/pkQAAADw9dAFHVujcHgAAWY10BgGKBoTAdepqBEdX6G0EAACL+FlZiT3w/kAAhf90y4s1FP9AAFPrM1boqx4AAIA+PVmNWAF0ImoBU+g/BAAAWVmJB4XAdD9WU1DoEk8AAIPEDIXAdUeDxwQD84A+AHXI/zUU/0AA6IXD//+DJRT/QAAAgycAxwXMHkEAAQAAADPAWVtfXsP/NfD+QADoX8P//4Ml8P5AAACDyP/r5DPAUFBQUFDoTNX//8yL/1WL7FGLTRBTM8BWiQeL8otVDMcBAQAAADlFCHQJi10Ig0UIBIkTiUX8gD4idRAzwDlF/LMiD5TARolF/Os8/weF0nQIigaIAkKJVQyKHg+2w1BG6EVOAABZhcB0E/8Hg30MAHQKi00Migb/RQyIAUaLVQyLTRCE23Qyg338AHWpgPsgdAWA+wl1n4XSdATGQv8Ag2X8AIA+AA+E6QAAAIoGPCB0BDwJdQZG6/NO6+OAPgAPhNAAAACDfQgAdAmLRQiDRQgEiRD/ATPbQzPJ6wJGQYA+XHT5gD4idSb2wQF1H4N9/AB0DI1GAYA4InUEi/DrDTPAM9s5RfwPlMCJRfzR6YXJdBJJhdJ0BMYCXEL/B4XJdfGJVQyKBoTAdFWDffwAdQg8IHRLPAl0R4XbdD0PvsBQhdJ0I+hgTQAAWYXAdA2KBotNDP9FDIgBRv8Hi00Migb/RQyIAesN6D1NAABZhcB0A0b/B/8Hi1UMRulW////hdJ0B8YCAEKJVQz/B4tNEOkO////i0UIXluFwHQDgyAA/wHJw4v/VYvsg+wMUzPbVlc5HdgeQQB1BegbHAAAaAQBAAC+CApBAFZTiB0MC0EA/xXYwEAAocQeQQCJNQD/QAA7w3QHiUX8OBh1A4l1/ItV/I1F+FBTU4199OgK/v//i0X4g8QMPf///z9zSotN9IP5/3NCi/jB5wKNBA87wXI2UOhyAQAAi/BZO/N0KYtV/I1F+FAD/ldWjX306Mn9//+LRfiDxAxIo+T+QACJNej+QAAzwOsDg8j/X15bycOL/1WL7IPsDFNW/xXkwEAAi9gz9jvedQQzwOt3ZjkzdBCDwAJmOTB1+IPAAmY5MHXwV4s94MBAAFZWVivDVtH4QFBTVlaJRfT/14lF+DvGdDhQ6OMAAABZiUX8O8Z0KlZW/3X4UP919FNWVv/XhcB1DP91/Oh4wP//WYl1/FP/FdzAQACLRfzrCVP/FdzAQAAzwF9eW8nDi/9Vi+yD7BChBPBAAINl+ACDZfwAU1e/TuZAu7sAAP//O8d0DYXDdAn30KMI8EAA62VWjUX4UP8V9MBAAIt1/DN1+P8V8MBAADPw/xW4wEAAM/D/FezAQAAz8I1F8FD/FejAQACLRfQzRfAz8Dv3dQe+T+ZAu+sQhfN1DIvGDRFHAADB4BAL8Ik1BPBAAPfWiTUI8EAAXl9bycODJXwNQQAAw4v/VYvsVlcz9v91COggwP//i/hZhf91JzkFEAtBAHYfVv8V+MBAAI2G6AMAADsFEAtBAHYDg8j/i/CD+P91yovHX15dw4v/VYvsVlcz9moA/3UM/3UI6H3j//+L+IPEDIX/dSc5BRALQQB2H1b/FfjAQACNhugDAAA7BRALQQB2A4PI/4vwg/j/dcOLx19eXcOL/1WL7FZXM/b/dQz/dQjo4koAAIv4WVmF/3UsOUUMdCc5BRALQQB2H1b/FfjAQACNhugDAAA7BRALQQB2A4PI/4vwg/j/dcGLx19eXcNqEGho4UAA6MXR//8z24ld5GoB6HXW//9ZiV38agNfiX3gOz3AHkEAfVSL96GkDkEAORywdEWLBLD2QAyDdA9Q6KXG//9Zg/j/dAP/ReSD/xR8KKGkDkEAiwSwg8AgUP8VmMBAAKGkDkEA/zSw6Ga+//9ZoaQOQQCJHLBH66HHRfz+////6AkAAACLReTohNH//8NqAega1f//WcOL/1WL7IPsNFMz2/ZFEIBWi/CJXdyIXf6JXfjHRcwMAAAAiV3QdAmJXdTGRf8Q6wrHRdQBAAAAiF3/jUXcUOjnTAAAWYXAD4XeBgAAuACAAACFRRB1EvdFEABABwB1BTlF3HQEgE3/gItFEIPgAyvDuQAAAMC6AAAAgHRDSHQoSHQg6HHQ//+JGIMO/+hU0P//ahZeiTDo+M///4vG6d4AAACJTfTrG/ZFEAh0CfdFEAAABwB17MdF9AAAAEDrA4lV9ItFFGoQWSvBdDcrwXQqK8F0HSvBdBCD6EB1pTlV9A+UwIlF7Osex0XsAwAAAOsVx0XsAgAAAOsMx0XsAQAAAOsDiV3si0UQugAHAAAjwrkABAAAV78AAQAAO8F/M3QoO8N0JDvHdBc9AAIAAHRUPQADAAB1LcdF6AIAAADrVMdF6AQAAADrS8dF6AMAAADrQj0ABQAAdDQ9AAYAAHQkO8J0KeiPz///iRiDDv/ocs///2oWXokw6BbP//+Lxl9eW8nDx0XoBQAAAOsHx0XoAQAAAItFEMdF8IAAAACFx3QWiw3g/kAA99EjTRiEyXgHx0XwAQAAAKhAdBKBTfAAAAAEgU30AAABAINN7ASpABAAAHQDCX3wqCB0CYFN8AAAAAjrC6gQdAeBTfAAAAAQ6BFEAACDy/+JBjvDdSHo9c7//4MgAIke6NjO///HABgAAADozc7//4sA6WD///+LRQiLPfzAQABqAP918McAAQAAAP916I1FzFD/dez/dfT/dQz/14lF4DvDdXCLTfS4AAAAwCPIO8h1K/ZFEAF0JYFl9P///39qAP918I1FzP916FD/dez/dfT/dQz/14lF4DvDdTeLNovGwfgFiwSFoA1BAIPmH8HmBo1EMASAIP7/FTzAQABQ6F/O//9Z6DPO//+LAIlF+OlmBAAA/3Xg/xXQwEAAhcB1RIs2i8bB+AWLBIWgDUEAg+YfweYGjUQwBIAg/v8VPMBAAIvwVugZzv//Wf914P8VUMBAAIX2da3o4M3//8cADQAAAOugg/gCdQaATf9A6wmD+AN1BIBN/wj/deD/NuilQAAAiwaL0IPgH8H6BYsUlaANQQBZweAGWYpN/4DJAYhMAgSLBovQg+AfwfoFixSVoA1BAMHgBo1EAiSAIICITf2AZf1IiE3/dX/2wYAPhKgCAAD2RRACdHBqAlP/Nugp8P//i/iDxAw7+3UZ6F/N//+BOIMAAAB0UP826Ojy///p//7//4Nl2ABqAY1F2FD/Nujq5f//g8QMhcB1GmaDfdgadROLx5lSUP826OFGAACDxAw7w3TCagBqAP826Mrv//+DxAw7w3Sw9kX/gA+EKAIAAL8AQAcAuQBAAACFfRB1D4tF3CPHdQUJTRDrAwlFEItFECPHO8F0RD0AAAEAdCk9AEABAHQiPQAAAgB0KT0AQAIAdCI9AAAEAHQHPQBABAB1HsZF/gHrGItNELgBAwAAI8g7yHUKxkX+AusExkX+APdFEAAABwAPhKwBAAAz//ZF/0CJfeQPhZ0BAACLRfS5AAAAwCPBPQAAAEAPhLAAAAA9AAAAgHRxO8EPhXkBAACLReg7xw+GbgEAAIP4AnYOg/gEdiuD+AUPhVsBAAAPvkX+M/9ID4QeAQAASA+FRwEAAMdF5P/+AABqAukSAQAAagJXV/826O8kAACDxBALwnTMV1dX/zbo3iQAACPCg8QQO8MPhI7+//9qA41F5FD/NuiI5P//g8QMO8MPhHb+//+D+AJ0aoP4Aw+FrAAAAIF95O+7vwB1WMZF/gHp2AAAAItF6DvHD4bNAAAAg/gCD4Zp////g/gED4dX////agJXV/826HEkAACDxBALwg+ESv///1dXV/826FwkAACDxBAjwjvDD4WOAAAA6Qf+//+LReQl//8AAD3+/wAAdRr/Nujg8P//Wegvy///ahZeiTCJdfjpXwEAAD3//gAAdRtXagL/Nujg7f//g8QMO8MPhML9///GRf4C6z5XV/826Mbt//+DxAzrmsdF5O+7vwBqA1uLwyvHUI1EPeRQ/zboQiwAAIPEDIP4/w+Eh/3//wP4O99/3YPL/4sGi8jB+QWLDI2gDUEAg+AfweAGjUQBJIoIMk3+gOF/MAiLBovIwfkFiwyNoA1BAIPgH8HgBo1EASSLTRCKEMHpEMDhB4DifwrKgH39AIgIdSH2RRAIdBuLBovIg+AfwfkFiwyNoA1BAMHgBo1EAQSACCCLTfS4AAAAwCPIO8h1fvZFEAF0eP914P8VUMBAAGoA/3XwjUXMagNQ/3Xsi0X0Jf///39Q/3UM/xX8wEAAO8N1NP8VPMBAAFDoKMr//4sGi8iD4B/B+QWLDI2gDUEAweAGjUQBBIAg/v826Ew9AABZ6aH7//+LNovOwfkFiwyNoA1BAIPmH8HmBokEDotF+OlV+v//U1NTU1PoDcn//8xqFGiI4UAA6PTJ//8z/4l95DPAi3UYO/cPlcA7x3UT6IzJ//9qFl6JMOgwyf//i8brWYMO/zPAOX0ID5XAO8d03jl9HHQPi0UUJX/+///32BvAQHTKiX38/3UU/3UQ/3UM/3UIjUXkUIvG6Fz4//+DxBSJReDHRfz+////6BUAAACLReA7x3QDgw7/6LXJ///DM/+LdRg5feR0KDl94HQbiwaLyMH5BYPgH8HgBosMjaANQQCNRAEEgCD+/zbo6D0AAFnDi/9Vi+xqAf91CP91GP91FP91EP91DOgh////g8QYXcOL/1WL7IPsEDPAU1c5RRAPhMwAAACLXQiF23Ua6KvI///HABYAAADoTsj//7j///9/6asAAACLfQyF/3TfVv91FI1N8Oi33f//i0Xwg3gUAHVBK98PtwQ7g/hBcg2D+Fp3CIPAIA+38OsCi/APtweD+EFyC4P4WncGg8AgD7fAg8cC/00QdERmhfZ0P2Y78HTD6ziNRfBQD7cDUOieRAAAD7fwjUXwUA+3B1DojkQAAIPEEIPDAoPHAv9NEA+3wHQKZoX2dAVmO/B0yA+3yA+3xivBgH38AF50B4tN+INhcP1fW8nDi/9Vi+yDPUwLQQAAVnV5M8A5RRAPhIEAAACLdQiF9nUX6MHH///HABYAAADoZMf//7j///9/62OLTQyFyXTiK/EPtwQOg/hBcg2D+Fp3CIPAIA+30OsCi9APtwGD+EFyC4P4WncGg8AgD7fAg8EC/00QdApmhdJ0BWY70HTDD7fID7fCK8HrE2oA/3UQ/3UM/3UI6IP+//+DxBBeXcOL/1WL7IN9EAB1BDPAXcOLVQyLTQj/TRB0FQ+3AWaFwHQNZjsCdQiDwQKDwgLr5g+3AQ+3CivBXcNVi+xTVldVagBqAGgIaEAA/3UI6CxTAABdX15bi+Vdw4tMJAT3QQQGAAAAuAEAAAB0MotEJBSLSPwzyOgBsP//VYtoEItQKFKLUCRS6BQAAACDxAhdi0QkCItUJBCJArgDAAAAw1NWV4tEJBBVUGr+aBBoQABk/zUAAAAAoQTwQAAzxFCNRCQEZKMAAAAAi0QkKItYCItwDIP+/3Q6g3wkLP90Bjt0JCx2LY00dosMs4lMJAyJSAyDfLMEAHUXaAEBAACLRLMI6EkAAACLRLMI6F8AAADrt4tMJARkiQ0AAAAAg8QYX15bwzPAZIsNAAAAAIF5BBBoQAB1EItRDItSDDlRCHUFuAEAAADDU1G7oPZAAOsLU1G7oPZAAItMJAyJSwiJQwSJawxVUVBYWV1ZW8IEAP/Qw+iyy///hcB0CGoW6LTL//9Z9gWw9kAAAnQRagFoFQAAQGoD6OTD//+DxAxqA+issv//zMzMzMzMzFWL7FdWi3UMi00Qi30Ii8GL0QPGO/52CDv4D4KgAQAAgfmAAAAAchyDPXgNQQAAdBNXVoPnD4PmDzv+Xl91BeluQgAA98cDAAAAdRTB6QKD4gOD+QhyKfOl/ySV0GpAAIvHugMAAACD6QRyDIPgAwPI/ySF5GlAAP8kjeBqQACQ/ySNZGpAAJD0aUAAIGpAAERqQAAj0YoGiAeKRgGIRwGKRgLB6QKIRwKDxgODxwOD+QhyzPOl/ySV0GpAAI1JACPRigaIB4pGAcHpAohHAYPGAoPHAoP5CHKm86X/JJXQakAAkCPRigaIB4PGAcHpAoPHAYP5CHKI86X/JJXQakAAjUkAx2pAALRqQACsakAApGpAAJxqQACUakAAjGpAAIRqQACLRI7kiUSP5ItEjuiJRI/oi0SO7IlEj+yLRI7wiUSP8ItEjvSJRI/0i0SO+IlEj/iLRI78iUSP/I0EjQAAAAAD8AP4/ySV0GpAAIv/4GpAAOhqQAD0akAACGtAAItFCF5fycOQigaIB4tFCF5fycOQigaIB4pGAYhHAYtFCF5fycONSQCKBogHikYBiEcBikYCiEcCi0UIXl/Jw5CNdDH8jXw5/PfHAwAAAHUkwekCg+IDg/kIcg3986X8/ySVbGxAAIv/99n/JI0cbEAAjUkAi8e6AwAAAIP5BHIMg+ADK8j/JIVwa0AA/ySNbGxAAJCAa0AApGtAAMxrQACKRgMj0YhHA4PuAcHpAoPvAYP5CHKy/fOl/P8klWxsQACNSQCKRgMj0YhHA4pGAsHpAohHAoPuAoPvAoP5CHKI/fOl/P8klWxsQACQikYDI9GIRwOKRgKIRwKKRgHB6QKIRwGD7gOD7wOD+QgPglb////986X8/ySVbGxAAI1JACBsQAAobEAAMGxAADhsQABAbEAASGxAAFBsQABjbEAAi0SOHIlEjxyLRI4YiUSPGItEjhSJRI8Ui0SOEIlEjxCLRI4MiUSPDItEjgiJRI8Ii0SOBIlEjwSNBI0AAAAAA/AD+P8klWxsQACL/3xsQACEbEAAlGxAAKhsQACLRQheX8nDkIpGA4hHA4tFCF5fycONSQCKRgOIRwOKRgKIRwKLRQheX8nDkIpGA4hHA4pGAohHAopGAYhHAYtFCF5fycOL/1WL7ItFCIXAdBKD6AiBON3dAAB1B1Doea///1ldw4v/VYvsU1aLNbDAQABXi30IV//Wi4ewAAAAhcB0A1D/1ouHuAAAAIXAdANQ/9aLh7QAAACFwHQDUP/Wi4fAAAAAhcB0A1D/1o1fUMdFCAYAAACBe/jA9kAAdAmLA4XAdANQ/9aDe/wAdAqLQwSFwHQDUP/Wg8MQ/00IddaLh9QAAAAFtAAAAFD/1l9eW13Di/9Vi+xXi30Ihf8PhIMAAABTVos1vMBAAFf/1ouHsAAAAIXAdANQ/9aLh7gAAACFwHQDUP/Wi4e0AAAAhcB0A1D/1ouHwAAAAIXAdANQ/9aNX1DHRQgGAAAAgXv4wPZAAHQJiwOFwHQDUP/Wg3v8AHQKi0MEhcB0A1D/1oPDEP9NCHXWi4fUAAAABbQAAABQ/9ZeW4vHX13Di/9Vi+xTVot1CIuGvAAAADPbVzvDdG89WP5AAHRoi4awAAAAO8N0XjkYdVqLhrgAAAA7w3QXORh1E1DoDq7///+2vAAAAOjYQgAAWVmLhrQAAAA7w3QXORh1E1Do7a3///+2vAAAAOhOQgAAWVn/trAAAADo1a3///+2vAAAAOjKrf//WVmLhsAAAAA7w3REORh1QIuGxAAAAC3+AAAAUOiprf//i4bMAAAAv4AAAAArx1Dolq3//4uG0AAAACvHUOiIrf///7bAAAAA6H2t//+DxBCLhtQAAAA9yPZAAHQbOZi0AAAAdRNQ6FQ+AAD/ttQAAADoVK3//1lZjX5Qx0UIBgAAAIF/+MD2QAB0EYsHO8N0CzkYdQdQ6C+t//9ZOV/8dBKLRwQ7w3QLORh1B1DoGK3//1mDxxD/TQh1x1boCa3//1lfXltdw4v/VYvsV4t9DIX/dDuLRQiFwHQ0VoswO/d0KFeJOOhq/f//WYX2dBtW6O79//+DPgBZdQ+B/jD4QAB0B1boc/7//1mLx17rAjPAX13DagxoqOFAAOijv///6OHI//+L8KE4/kAAhUZwdCKDfmwAdBzoysj//4twbIX2dQhqIOhirP//WYvG6La////DagzoJcT//1mDZfwA/zUI+UAAg8ZsVuhZ////WVmJReTHRfz+////6AIAAADrvmoM6B7D//9Zi3Xkwy2kAwAAdCKD6AR0F4PoDXQMSHQDM8DDuAQEAADDuBIEAADDuAQIAADDuBEEAADDi/9WV4vwaAEBAAAz/41GHFdQ6LDe//8zwA+3yIvBiX4EiX4IiX4MweEQC8GNfhCrq6u5EPlAAIPEDI1GHCvOvwEBAACKFAGIEEBPdfeNhh0BAAC+AAEAAIoUCIgQQE51919ew4v/VYvsgewcBQAAoQTwQAAzxYlF/FNXjYXo+v//UP92BP8VAMFAAL8AAQAAhcAPhPwAAAAzwIiEBfz+//9AO8dy9IqF7vr//8aF/P7//yCEwHQwjZ3v+v//D7bID7YDO8h3FivBQFCNlA38/v//aiBS6O3d//+DxAyKQwGDwwKEwHXWagD/dgyNhfz6////dgRQV42F/P7//1BqAWoA6O5DAAAz21P/dgSNhfz9//9XUFeNhfz+//9QV/92DFPooUIAAIPERFP/dgSNhfz8//9XUFeNhfz+//9QaAACAAD/dgxT6HxCAACDxCQzwA+3jEX8+v//9sEBdA6ATAYdEIqMBfz9///rEfbBAnQVgEwGHSCKjAX8/P//iIwGHQEAAOsHiJwGHQEAAEA7x3K/61KNhh0BAADHheT6//+f////M8kpheT6//+LleT6//+NhA4dAQAAA9CNWiCD+xl3CoBMDh0QjVEg6w2D+hl3DIBMDh0gjVHgiBDrA8YAAEE7z3LGi038XzPNW+j2pf//ycNqDGjI4UAA6Ae9///oRcb//4v4oTj+QACFR3B0HYN/bAB0F4t3aIX2dQhqIOjLqf//WYvG6B+9///Dag3ojsH//1mDZfwAi3doiXXkOzU4/UAAdDaF9nQaVv8VvMBAAIXAdQ+B/hD5QAB0B1boqan//1mhOP1AAIlHaIs1OP1AAIl15Fb/FbDAQADHRfz+////6AUAAADrjot15GoN6FTA//9Zw4v/VYvsg+wQUzPbU41N8Og/0f//iR0YC0EAg/7+dR7HBRgLQQABAAAA/xUIwUAAOF38dEWLTfiDYXD96zyD/v11EscFGAtBAAEAAAD/FQTBQADr24P+/HUSi0Xwi0AExwUYC0EAAQAAAOvEOF38dAeLRfiDYHD9i8ZbycOL/1WL7IPsIKEE8EAAM8WJRfxTi10MVot1CFfoZP///4v4M/aJfQg7/nUOi8Pouvz//zPA6aEBAACJdeQzwDm4QP1AAA+EkQAAAP9F5IPAMD3wAAAAcueB/+j9AAAPhHQBAACB/+n9AAAPhGgBAAAPt8dQ/xUMwUAAhcAPhFYBAACNRehQV/8VAMFAAIXAD4Q3AQAAaAEBAACNQxxWUOgQ2///M9JCg8QMiXsEiXMMOVXoD4b8AAAAgH3uAA+E0wAAAI1174oOhMkPhMYAAAAPtkb/D7bJ6akAAABoAQEAAI1DHFZQ6Mna//+LTeSDxAxryTCJdeCNsVD9QACJdeTrK4pGAYTAdCkPtj4PtsDrEotF4IqAPP1AAAhEOx0PtkYBRzv4duqLfQiDxgKAPgB10It15P9F4IPGCIN94ASJdeRy6YvHiXsEx0MIAQAAAOhp+///agaJQwyNQxCNiUT9QABaZosxZokwg8ECg8ACSnXxi/Po1/v//+m0/v//gEwDHQRAO8F29oPGAoB+/wAPhTD///+NQx65/gAAAIAICEBJdfmLQwToEfv//4lDDIlTCOsDiXMIM8APt8iLwcHhEAvBjXsQq6ur66c5NRgLQQAPhVT+//+DyP+LTfxfXjPNW+jtov//ycNqFGjo4UAA6P65//+DTeD/6DjD//+L+Il93OjY/P//i19oi3UI6HH9//+JRQg7QwQPhFcBAABoIAIAAOga5///WYvYhdsPhEYBAAC5iAAAAIt3aIv786WDIwBT/3UI6LT9//9ZWYlF4IXAD4X8AAAAi3Xc/3Zo/xW8wEAAhcB1EYtGaD0Q+UAAdAdQ6IGm//9ZiV5oU4s9sMBAAP/X9kZwAg+F6gAAAPYFOP5AAAEPhd0AAABqDegLvv//WYNl/ACLQwSjKAtBAItDCKMsC0EAi0MMozALQQAzwIlF5IP4BX0QZotMQxBmiQxFHAtBAEDr6DPAiUXkPQEBAAB9DYpMGByIiDD7QABA6+kzwIlF5D0AAQAAfRCKjBgdAQAAiIg4/EAAQOvm/zU4/UAA/xW8wEAAhcB1E6E4/UAAPRD5QAB0B1DoyKX//1mJHTj9QABT/9fHRfz+////6AIAAADrMGoN6IW8//9Zw+slg/j/dSCB+xD5QAB0B1PokqX//1noNbj//8cAFgAAAOsEg2XgAItF4Oi2uP//w4M92B5BAAB1Emr96Fb+//9ZxwXYHkEAAQAAADPAw4v/VYvsg30IAHUV6PK3///HABYAAADolbf//4PI/13D/3UIagD/NQAKQQD/FRDBQABdw2oC6AGl//9Zw8zMzMzMzItMJAT3wQMAAAB0JIoBg8EBhMB0TvfBAwAAAHXvBQAAAACNpCQAAAAAjaQkAAAAAIsBuv/+/n4D0IPw/zPCg8EEqQABAYF06ItB/ITAdDKE5HQkqQAA/wB0E6kAAAD/dALrzY1B/4tMJAQrwcONQf6LTCQEK8HDjUH9i0wkBCvBw41B/ItMJAQrwcOL/1WL7IPsJKEE8EAAM8WJRfyLRQhTiUXgi0UMVleJReTo8r7//4Nl7ACDPTQLQQAAiUXodX1osNhAAP8VnMBAAIvYhdsPhBABAACLPUDAQABopNhAAFP/14XAD4T6AAAAizWQwEAAUP/WaJTYQABTozQLQQD/11D/1miA2EAAU6M4C0EA/9dQ/9ZoZNhAAFOjPAtBAP/XUP/Wo0QLQQCFwHQQaEzYQABT/9dQ/9ajQAtBAKFAC0EAi03oizVYwEAAO8F0RzkNRAtBAHQ/UP/W/zVEC0EAi/j/1ovYhf90LIXbdCj/14XAdBmNTdxRagyNTfBRagFQ/9OFwHQG9kX4AXUJgU0QAAAgAOszoTgLQQA7Reh0KVD/1oXAdCL/0IlF7IXAdBmhPAtBADtF6HQPUP/WhcB0CP917P/QiUXs/zU0C0EA/9aFwHQQ/3UQ/3Xk/3Xg/3Xs/9DrAjPAi038X14zzVvo/J7//8nDi/9Vi+xWi3UIV4X2dAeLfQyF/3UV6K+1//9qFl6JMOhTtf//i8ZfXl3Di00Qhcl1BzPAZokG692L1maDOgB0BoPCAk919IX/dOcr0Q+3AWaJBAqDwQJmhcB0A0917jPAhf91wmaJBuhdtf//aiJZiQiL8euqi/9Vi+yLVQhTi10UVleF23UQhdJ1EDlVDHUSM8BfXltdw4XSdAeLfQyF/3UT6CK1//9qFl6JMOjGtP//i8br3YXbdQczwGaJAuvQi00Qhcl1BzPAZokC69SLwoP7/3UYi/Ir8Q+3AWaJBA6DwQJmhcB0J0917usii/Er8g+3DAZmiQiDwAJmhcl0Bk90A0t164XbdQUzyWaJCIX/D4V5////M8CD+/91EItNDGpQZolESv5Y6WT///9miQLok7T//2oiWYkIi/Hpav///4v/VYvsi0UIZosIg8ACZoXJdfUrRQjR+Ehdw4v/VYvsVot1CFeF9nQHi30Mhf91FehStP//ahZeiTDo9rP//4vGX15dw4tFEIXAdQVmiQbr34vWK9APtwhmiQwCg8ACZoXJdANPde4zwIX/ddRmiQboErT//2oiWYkIi/HrvIv/VYvsi00Ihcl4HoP5An4Mg/kDdRShHP9AAF3DoRz/QACJDRz/QABdw+jas///xwAWAAAA6H2z//+DyP9dw/ZBDEB0BoN5CAB0JP9JBHgLixGIAv8BD7bA6wwPvsBRUOh0x///WVmD+P91AwkGw/8Gw4v/VYvsUfZDDEBWi/CLB4lF/HQNg3sIAHUHi0UMAQbrPoMnAIN9DAB+MItFCIoA/00Mi8volP////9FCIM+/3UOgz8qdQ+Ly7A/6H7///+DfQwAf9WDPwB1BYtF/IkHXsnDi/9Vi+yB7IACAAChBPBAADPFiUX8U4tdDFaLdQgzwFeLfRT/dRCNjaz9//+JtdD9//+JveT9//+Jhaj9//+JhfD9//+Jhcj9//+Jhej9//+Jhcz9//+JhaT9//+JhcT9///oAsj//+jJsv//iYWc/f//hfZ1K+i6sv//xwAWAAAA6F2y//+Avbj9//8AdAqLhbT9//+DYHD9g8j/6WELAAD2RgxAdV5W6PjR//9Zulj2QACD+P90G4P4/nQWi8iD4R+L8MH+BcHhBgMMtaANQQDrAovK9kEkf3Wbg/j/dBmD+P50FIvIg+AfwfkFweAGAwSNoA1BAOsCi8L2QCSAD4Vx////M/Y73g+EZ////4oTibXc/f//ibXY/f//ibW8/f//ibWg/f//iJXv/f//hNIPhLIKAABDiZ3A/f//ObXc/f//D4yJCgAAjULgPFh3Dw++wg+2gCDZQACD4A/rAjPAi428/f//a8AJD7aECEDZQABqCMHoBF6Jhbz9//87xg+E7/7//2oHWTvBD4cgCgAA/ySF34dAADPAg43o/f///4mFjP3//4mFpP3//4mFyP3//4mFzP3//4mF8P3//4mFxP3//+nnCQAAD77Cg+ggdEiD6AN0NCvGdCRISHQUg+gDD4XJCQAACbXw/f//6b4JAACDjfD9//8E6bIJAACDjfD9//8B6aYJAACBjfD9//+AAAAA6ZcJAACDjfD9//8C6YsJAACA+ip1LIPHBIm95P3//4t//Im9yP3//4X/D4lsCQAAg43w/f//BPedyP3//+laCQAAi4XI/f//a8AKD77KjUQI0ImFyP3//+k/CQAAg6Xo/f//AOkzCQAAgPoqdSaDxwSJveT9//+Lf/yJvej9//+F/w+JFAkAAION6P3////pCAkAAIuF6P3//2vACg++yo1ECNCJhej9///p7QgAAID6SXRVgPpodESA+mx0GID6dw+F1QgAAIGN8P3//wAIAADpxggAAIA7bHUWQ4GN8P3//wAQAACJncD9///pqwgAAION8P3//xDpnwgAAION8P3//yDpkwgAAIoDPDZ1HoB7ATR1GIPDAoGN8P3//wCAAACJncD9///pbwgAADwzdR6AewEydRiDwwKBpfD9////f///iZ3A/f//6U0IAAA8ZA+ERQgAADxpD4Q9CAAAPG8PhDUIAAA8dQ+ELQgAADx4D4QlCAAAPFgPhB0IAACDpbz9//8Ag6XE/f//AI2FrP3//1APtsJQ6C0VAABZhcCKhe/9//9ZdCKLjdD9//+Ntdz9///om/v//4oDQ4mdwP3//4TAD4SV/P//i43Q/f//jbXc/f//6Hn7///puwcAAA++woP4ZA+PtwEAAA+EVQIAAIP4Uw+PugAAAHRMg+hBdBBISHQkSEh0CEhID4WoBQAAgMIgx4WM/f//AQAAAIiV7/3//+lTAgAA94Xw/f//MAgAAA+FngAAAIGN8P3//wAIAADpjwAAAPeF8P3//zAIAAB1CoGN8P3//wAIAACLjej9//+D+f91Bbn///9/g8cE94Xw/f//EAgAAIm95P3//4t//Im94P3//w+E+wQAAIX/dQuhNP5AAImF4P3//4uF4P3//8eFxP3//wEAAADpyQQAAIPoWA+EHAMAAEhIdH8rwQ+EswEAAEhID4XoBAAAi73k/f//g8cE94Xw/f//EAgAAIm95P3//3QwD7dH/FBoAAIAAI2F9P3//1CNhdj9//9Q6Oc1AACDxBCFwHQfx4Wk/f//AQAAAOsTikf8iIX0/f//x4XY/f//AQAAAI2F9P3//4mF4P3//+l5BAAAiweDxwSJveT9//+FwHQ8i0gEhcl0NfeF8P3//wAIAAAPvwCJjeD9//90FJkrwtH4x4XE/f//AQAAAOk0BAAAg6XE/f//AOkoBAAAoTD+QACJheD9//9Q6MH1//9Z6REEAACD+HAPjzYCAAAPhCICAACD+GUPjP8DAACD+GcPjrMAAACD+Gl0eIP4bnQqg/hvD4XjAwAA9oXw/f//gIu95P3//4m12P3//3RsgY3w/f//AAIAAOtgg4Xk/f//BIuF5P3//4tw/Oh2EQAAhcAPhEr6///2hfD9//8gdAxmi4Xc/f//ZokG6wiLhdz9//+JBseFpP3//wEAAADpPgUAAIu95P3//4ON8P3//0DHhdj9//8KAAAAi43w/f//98EAgAAAD4TdAQAAA/6LR/iLV/zpCQIAAIu95P3//4ON8P3//0CDvej9//8AjZ30/f//uAACAACJneD9//+JhZj9//99DMeF6P3//wYAAADranURgPpndWPHhej9//8BAAAA61c5hej9//9+BomF6P3//4G96P3//6MAAAB+PYu16P3//4HGXQEAAFboz9n//4qV7/3//1mJhaD9//+FwHQQiYXg/f//ibWY/f//i9jrCseF6P3//6MAAACLB4s1WMBAAIPHCImFgP3//4tH/ImFhP3//42FrP3//1D/tYz9//8PvsL/tej9//+JveT9//9Q/7WY/f//jYWA/f//U1D/NUD1QAD/1v/Qi73w/f//g8QcgeeAAAAAdB2Dvej9//8AdRSNhaz9//9QU/81TPVAAP/W/9BZWYC97/3//2d1GIX/dRSNhaz9//9QU/81SPVAAP/W/9BZWYA7LXURgY3w/f//AAEAAEOJneD9//9T6cT9//+Jtej9//+Jjaj9///rKoPocw+EdPz//0hID4Rb/v//g+gDD4W+AQAAi73k/f//x4Wo/f//JwAAAPaF8P3//4DHhdj9//8QAAAAD4Q1/v//ioWo/f//BFHGhdT9//8wiIXV/f//x4XM/f//AgAAAOkR/v//98EAEAAAD4UX/v//g8cE9sEgdBiJveT9///2wUB0Bg+/R/zrBA+3R/yZ6xOLR/z2wUB0A5nrAjPSib3k/f//9sFAdBuF0n8XfASFwHMR99iD0gD32oGN8P3//wABAAD3hfD9//8AkAAAi/qL2HUCM/+Dvej9//8AfQzHhej9//8BAAAA6xqDpfD9///3uAACAAA5hej9//9+BomF6P3//4vDC8d1BiGFzP3//41184uF6P3///+N6P3//4XAfwaLwwvHdC2Lhdj9//+ZUlBXU+gCEAAAg8EwiZ2Y/f//i9iL+oP5OX4GA42o/f//iA5O672NRfMrxkb3hfD9//8AAgAAiYXY/f//ibXg/f//dGOFwHQHi86AOTB0WP+N4P3//4uN4P3//8YBMEDrQElmgzgAdAeDwAKFyXXyK4Xg/f//0fjrKIX/dQuhMP5AAImF4P3//4uF4P3//+sHSYA4AHQFQIXJdfUrheD9//+Jhdj9//+DvaT9//8AD4W4AQAAi43w/f//9sFAdDX3wQABAAB0CcaF1P3//y3rGvbBAXQJxoXU/f//K+sM9sECdBHGhdT9//8gx4XM/f//AQAAAIuFyP3//yuF2P3//yuFzP3//4mFmP3///bBDHUli/jrHYuN0P3//4213P3//7AgT+gY9f//g73c/f///3QEhf9/3/+1zP3//4u9nP3//4ud0P3//42F1P3//1CNhdz9///oGvX///aF8P3//whZWXQu9oXw/f//BHUli72Y/f//6xmNtdz9//+Ly7AwT+i79P//g73c/f///3QEhf9/44O9xP3//wCLhdj9//90dYXAfnGLteD9//+JhZD9//8Ptwb/jZD9//9QagaNRfRQjYWI/f//UIPGAugNMAAAg8QQhcB1NjmFiP3//3Qu/7WI/f//i72c/f//i53Q/f//jUX0UI2F3P3//+hz9P//g72Q/f//AFlZdabrI4ON3P3////rGou9nP3//1D/teD9//+Nhdz9///oRfT//1lZg73c/f//AHwy9oXw/f//BHQpi72Y/f//6x2LjdD9//+Ntdz9//+wIE/o4vP//4O93P3///90BIX/f9+DvaD9//8AdBP/taD9///o4pT//4OloP3//wBZi53A/f//igOIhe/9//+EwHQPi73k/f//M/aK0Olk9f//g728/f//AHQNg728/f//Bw+FjfT//4C9uP3//wB0CouFtP3//4NgcP2Lhdz9//+LTfxfXjPNW+hXkP//ycONSQBnf0AAZH1AAJZ9QADyfUAAPn5AAEp+QACQfkAAwn9AAIv/VYvsUVGLRQxWi3UIiUX4i0UQV1aJRfzo1RoAAIPP/1k7x3UR6Nam///HAAkAAACLx4vX60r/dRSNTfxR/3X4UP8V1MBAAIlF+DvHdRP/FTzAQACFwHQJUOjIpv//WevPi8bB+AWLBIWgDUEAg+YfweYGjUQwBIAg/YtF+ItV/F9eycNqFGgI4kAA6MCm//+Dy/+JXdyJXeCLRQiD+P51HOhtpv//gyAA6FKm///HAAkAAACLw4vT6aEAAACFwHgIOwWADUEAchroRab//4MgAOgqpv//xwAJAAAA6M2l///r0YvIwfkFjTyNoA1BAIvwg+YfweYGiw8PvkwxBIPhAXTGUOhSGgAAWYNl/ACLB/ZEMAQBdBz/dRT/dRD/dQz/dQjo1/7//4PEEIlF3IlV4OsZ6Mil///HAAkAAADo0KX//4MgAIld3Ild4MdF/P7////oDAAAAItF3ItV4Ogypv//w/91COiOGgAAWcOL/1WL7LjkGgAA6MMtAAChBPBAADPFiUX8i0UMVot1CFcz/4mFNOX//4m9OOX//4m9MOX//zl9EHUHM8DprgYAADvHdR/oW6X//4k46EGl///HABYAAADo5KT//4PI/+mLBgAAi8bB+AWL/lONHIWgDUEAiwOD5x/B5waKTDgkAsnQ+YmdJOX//4iNP+X//4D5AnQFgPkBdSeLTRD30fbBAXUd6P2k//+DIADo4qT//8cAFgAAAOiFpP//6R0GAAD2RDgEIHQPagJqAGoAVui+/f//g8QQVug+BwAAWYXAD4SZAgAAiwP2RAcEgA+EjAIAAOgurv//i0BsM8k5SBSNhSDl//8PlMFQiwP/NAeL8f8VGMFAADPJO8EPhGACAAA78XQMOI0/5f//D4RQAgAA/xUUwUAAi5005f//iYUg5f//M8CJhSzl//85RRAPhiMFAACJhUDl//+KhT/l//+EwA+FZwEAAIoLi7Uk5f//M8CA+QoPlMCJhRzl//+LBgPHg3g4AHQVilA0iFX0iE31g2A4AGoCjUX0UOtLD77BUOjQCQAAWYXAdDqLjTTl//8rywNNEDPAQDvID4alAQAAagKNhUTl//9TUOhUCQAAg8QMg/j/D4SSBAAAQ/+FQOX//+sbagFTjYVE5f//UOgwCQAAg8QMg/j/D4RuBAAAM8BQUGoFjU30UWoBjY1E5f//UVD/tSDl//9D/4VA5f///xXgwEAAi/CF9g+EPQQAAGoAjYUs5f//UFaNRfRQi4Uk5f//iwD/NAf/FcDAQACFwA+ECgQAAIuFQOX//4uNMOX//wPBiYU45f//ObUs5f//D4z2AwAAg70c5f//AA+EzQAAAGoAjYUs5f//UGoBjUX0UIuFJOX//4sAxkX0Df80B/8VwMBAAIXAD4SxAwAAg70s5f//AQ+MsAMAAP+FMOX///+FOOX//+mDAAAAPAF0BDwCdSEPtzMzyYP+Cg+UwYPDAoOFQOX//wKJtUTl//+JjRzl//88AXQEPAJ1Uv+1ROX//+h4KgAAWWY7hUTl//8PhUkDAACDhTjl//8Cg70c5f//AHQpag1YUImFROX//+hLKgAAWWY7hUTl//8PhRwDAAD/hTjl////hTDl//+LRRA5hUDl//8Pgvn9///pCAMAAIsOihP/hTjl//+IVA80iw6JRA846e8CAAAzyYsD9kQ4BIAPhKECAACAvT/l//8AiY1E5f//D4WoAAAAi5005f//OU0QD4b9AgAAi8sz9iuNNOX//42FSOX//ztNEHMmihNDQYmdIOX//4D6CnUL/4Uw5f//xgANQEaIEEBGgf7/EwAActWL8I2FSOX//yvwagCNhSjl//9QVo2FSOX//1CLhSTl//+LAP80B/8VwMBAAIXAD4RDAgAAi4Uo5f//AYU45f//O8YPjDsCAACLwyuFNOX//ztFEA+CbP///+klAgAAgL0/5f//Ag+FzQAAAIudNOX//zlNEA+GSAIAAIOlQOX//wCLyyuNNOX//2oCjYVI5f//XjtNEHNDD7cTA94DzomdIOX//4P6CnUaAbUw5f//ag1bZokYi50g5f//A8YBtUDl//8BtUDl//9miRADxoG9QOX///4TAAByuIvwjYVI5f//K/BqAI2FKOX//1BWjYVI5f//UIuFJOX//4sA/zQH/xXAwEAAhcAPhGkBAACLhSjl//8BhTjl//87xg+MYQEAAIvDK4U05f//O0UQD4JH////6UsBAACLhTTl//+JhSzl//85TRAPhnUBAACLjSzl//+DpUDl//8AK4005f//agKNhUj5//9eO00QczuLlSzl//8PtxIBtSzl//8DzoP6CnUOag1bZokYA8YBtUDl//8BtUDl//9miRADxoG9QOX//6gGAABywDP2VlZoVQ0AAI2N8Ov//1GNjUj5//8rwZkrwtH4UIvBUFZo6f0AAP8V4MBAAIvYO94PhJcAAABqAI2FKOX//1CLwyvGUI2ENfDr//9Qi4Uk5f//iwD/NAf/FcDAQACFwHQMA7Uo5f//O95/y+sM/xU8wEAAiYVE5f//O95/XIuFLOX//yuFNOX//4mFOOX//ztFEA+CC////+s/UY2NKOX//1H/dRD/tTTl////NDj/FcDAQACFwHQVi4Uo5f//g6VE5f//AImFOOX//+sM/xU8wEAAiYVE5f//g7045f//AHVsg71E5f//AHQtagVeObVE5f//dRToA5///8cACQAAAOgLn///iTDrP/+1ROX//+gPn///Wesxi4Uk5f//iwD2RAcEQHQPi4U05f//gDgadQQz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AgAAK8EPhJUAAACD6AcPhPT+//8rwQ+FugQAAA+3A4PDBDP2RvaF+Pv//yCJtdD7//+JneT7//+JhaT7//90QoiFyPv//42FtPv//1CLhbT7///Ghcn7//8A/7CsAAAAjYXI+///UI2F/Pv//1DoR/j//4PEEIXAeQ+JtbD7///rB2aJhfz7//+Nhfz7//+JhfD7//+Jtez7///pNgQAAIsDg8MEiZ3k+///hcB0OotIBIXJdDP3hfj7//8ACAAAD78AiY3w+///dBKZK8LHhdD7//8BAAAA6fEDAACDpdD7//8A6ecDAAChMP5AAImF8Pv//1Dohdv//1np0AMAAIP4cA+P5QEAAA+EzQEAAIP4ZQ+MvgMAAIP4Zw+O5/3//4P4aXRug/hudCSD+G8PhaIDAAD2hfj7//+AibXg+///dGKBjfj7//8AAgAA61aDwwSJneT7//+LW/zoRPf//4XAD4R4+v//9oX4+///IHQMZouF6Pv//2aJA+sIi4Xo+///iQPHhbD7//8BAAAA6fcEAACDjfj7//9Ax4Xg+///CgAAAPeF+Pv//wCAAAAPhJkBAAAD3otD+ItT/OnVAQAAdRJmg/pndVfHhfT7//8BAAAA60s7yH4IiYX0+///i8iB+aMAAAB+N42xXQEAAFbo6b///4uV4Pv//1mJhaj7//+FwHQQiYXw+///ibXs+///i/jrCseF9Pv//6MAAACLA4s1WMBAAIPDCImFkPv//4tD/ImFlPv//42FtPv//1D/tZj7//8PvsL/tfT7//+JneT7//9Q/7Xs+///jYWQ+///V1D/NUD1QAD/1v/Qi534+///g8QcgeOAAAAAdB2DvfT7//8AdRSNhbT7//9QV/81TPVAAP/W/9BZWWaDveD7//9ndRiF23UUjYW0+///UFf/NUj1QAD/1v/QWVmAPy11EYGN+Pv//wABAABHib3w+///V+kZ/v//ibX0+///x4Ws+///BwAAAOskg+hzD4R7/P//K8EPhJz+//+D6AMPhc4BAADHhaz7//8nAAAA9oX4+///gMeF4Pv//xAAAAAPhHz+//9qMFhmiYXM+///i4Ws+///g8BRZomFzvv//4mN3Pv//+lX/v//94X4+///ABAAAA+FV/7//4PDBPaF+Pv//yB0HPaF+Pv//0CJneT7//90Bg+/Q/zrBA+3Q/yZ6xf2hfj7//9Ai0P8dAOZ6wIz0omd5Pv///aF+Pv//0B0G4XSfxd8BIXAcxH32IPSAPfagY34+///AAEAAPeF+Pv//wCQAACL+ovYdQIz/4O99Pv//wB9DMeF9Pv//wEAAADrGoOl+Pv///e4AAIAADmF9Pv//34GiYX0+///i8MLx3UGIYXc+///jbX7/f//i4X0+////430+///hcB/BovDC8d0LYuF4Pv//5lSUFdT6AX2//+DwTCJnYz7//+L2Iv6g/k5fgYDjaz7//+IDk7rvY2F+/3//yvGRveF+Pv//wACAACJhez7//+JtfD7//90XoXAdAeLxoA4MHRT/43w+///i4Xw+////4Xs+///xgAw6zyF23ULoTT+QACJhfD7//+LhfD7///HhdD7//8BAAAA6wlPZoM4AHQGA8GF/3XzK4Xw+///0fiJhez7//+DvbD7//8AD4WoAQAAi4X4+///qEB0K6kAAQAAdARqLesOqAF0BGor6waoAnQUaiBZZomNzPv//8eF3Pv//wEAAACLvdj7//8rvez7//8rvdz7//+JveD7//+oDHUk6x6LhdT7//9qII216Pv//0/oivX//4O96Pv///9ZdASF/3/e/7Xc+///i72c+///i53U+///jYXM+///UI2F6Pv//+iH9f//9oX4+///CFlZdC/2hfj7//8EdSaLveD7///rGmowjbXo+///i8NP6Cz1//+Dvej7////WXQEhf9/4oO90Pv//wB1a4ud7Pv//4XbfmGLvfD7//+NhbT7//9Qi4W0+////7CsAAAAjYWk+///V1BL6Mry//+DxBCJhYz7//+FwH4k/7Wk+///i4XU+///jbXo+///6MD0//8DvYz7//9Zhdt/sOsug43o+////+sl/7Xs+///i72c+////7Xw+///i53U+///jYXo+///6Lb0//9ZWYO96Pv//wB8M/aF+Pv//wR0Kou94Pv//+sei4XU+///aiCNtej7//9P6Ff0//+Dvej7////WXQEhf9/3oO9qPv//wB0E/+1qPv//+j3ev//g6Wo+///AFmLvaD7//+LneT7//8Ptwcz9omF4Pv//2Y7xnQHi9DpcfX//zm1xPv//3QNg73E+///Bw+FAfX//4C9wPv//wB0CouFvPv//4NgcP2Lhej7//+LTfxfXjPNW+hrdv//ycON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f18wZg9vZkBmD29uUGYPb3ZgZg9vfnBmD39nQGYPf29QZg9/d2BmD39/cI22gAAAAI2/gAAAAEp1o4XJdEmL0cHqBIXSdBeNmwAAAABmD28GZg9/B412EI1/EEp174PhD3Qki8HB6QJ0DYsWiReNdgSNfwRJdfOLyIPhA3QJigaIB0ZHSXX3WF5fXcO6EAAAACvQK8pRi8KLyIPhA3QJihaIF0ZHSXX3wegCdA2LFokXjXYEjX8ESHXzWekL////zMzMzMzMzMzMzMxRjUwkCCvIg+EPA8EbyQvBWekKCgAAUY1MJAgryIPhBwPBG8kLwVnp9AkAAIv/VYvsVot1CIX2D4RjAwAA/3YE6PJu////dgjo6m7///92DOjibv///3YQ6Npu////dhTo0m7///92GOjKbv///zbow27///92IOi7bv///3Yk6LNu////dijoq27///92LOijbv///3Yw6Jtu////djTok27///92HOiLbv///3Y46INu////djzoe27//4PEQP92QOhwbv///3ZE6Ghu////dkjoYG7///92TOhYbv///3ZQ6FBu////dlToSG7///92WOhAbv///3Zc6Dhu////dmDoMG7///92ZOgobv///3Zo6CBu////dmzoGG7///92cOgQbv///3Z06Ahu////dnjoAG7///92fOj4bf//g8RA/7aAAAAA6Opt////toQAAADo323///+2iAAAAOjUbf///7aMAAAA6Mlt////tpAAAADovm3///+2lAAAAOizbf///7aYAAAA6Kht////tpwAAADonW3///+2oAAAAOiSbf///7akAAAA6Idt////tqgAAADofG3///+2vAAAAOhxbf///7bAAAAA6GZt////tsQAAADoW23///+2yAAAAOhQbf///7bMAAAA6EVt//+DxED/ttAAAADoN23///+2uAAAAOgsbf///7bYAAAA6CFt////ttwAAADoFm3///+24AAAAOgLbf///7bkAAAA6ABt////tugAAADo9Wz///+27AAAAOjqbP///7bUAAAA6N9s////tvAAAADo1Gz///+29AAAAOjJbP///7b4AAAA6L5s////tvwAAADos2z///+2AAEAAOiobP///7YEAQAA6J1s////tggBAADokmz//4PEQP+2DAEAAOiEbP///7YQAQAA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AC0AOAAAAFUAVABGAC0AMQA2AEwARQAAAAAAVQBOAEkAQwBPAEQARQAAAEsARQBSAE4ARQBMADMAMgAuAEQATABMAAAAAABGbHNGcmVlAEZsc1NldFZhbHVlAEZsc0dldFZhbHVlAEZsc0FsbG9jAAAAAHIAdQBuAHQAaQBtAGUAIABlAHIAcgBvAHIAIAAAAAAADQAKAAAAAABUAEwATwBTAFMAIABlAHIAcgBvAHIADQAKAAAAUwBJAE4ARwAgAGUAcgByAG8AcgANAAoAAAAAAEQATwBNAEEASQBOACAAZQByAHIAbwByAA0ACgAAAAAAAAAAAFIANgAwADMAMwANAAoALQAgAEEAdAB0AGUAbQBwAHQAIAB0AG8AIAB1AHMAZQAgAE0AUwBJAEwAIABjAG8AZABlACAAZgByAG8AbQAgAHQAaABpAHMAIABhAHMAcwBlAG0AYgBsAHkAIABkAHUAcgBpAG4AZwAgAG4AYQB0AGkAdgBlACAAYwBvAGQAZQAgAGkAbgBpAHQAaQBhAGwAaQB6AGEAdABpAG8AbgAKAFQAaABpAHMAIABpAG4AZABpAGMAYQB0AGUAcwAgAGEAIABiAHUAZwAgAGkAbgAgAHkAbwB1AHIAIABhAHAAcABsAGkAYwBhAHQAaQBvAG4ALgAgAEkAdAAgAGkAcwAgAG0AbwBzAHQAIABsAGkAawBlAGwAeQAgAHQAaABlACAAcgBlAHMAdQBsAHQAIABvAGYAIABjAGEAbABsAGkAbgBnACAAYQBuACAATQBTAEkATAAtAGMAbwBtAHAAaQBsAGUAZAAgACgALwBjAGwAcgApACAAZgB1AG4AYwB0AGkAbwBuACAAZgByAG8AbQAgAGEAIABuAGEAdABpAHYAZQAgAGMAbwBuAHMAdAByAHUAYwB0AG8AcgAgAG8AcgAgAGYAcgBvAG0AIABEAGwAbABNAGEAaQBuAC4ADQAKAAAAAABSADYAMAAzADIADQAKAC0AIABuAG8AdAAgAGUAbgBvAHUAZwBoACAAcwBwAGEAYwBlACAAZgBvAHIAIABsAG8AYwBhAGwAZQAgAGkAbgBmAG8AcgBtAGEAdABpAG8AbgANAAoAAAAAAFIANgAwADMAMQANAAoALQAgAEEAdAB0AGUAbQBwAHQAIAB0AG8AIABpAG4AaQB0AGkAYQBsAGkAegBlACAAdABoAGUAIABDAFIAVAAgAG0AbwByAGUAIAB0AGgAYQBuACAAbwBuAGMAZQAuAAoAVABoAGkAcwAgAGkAbgBkAGkAYwBhAHQAZQBzACAAYQAgAGIAdQBnACAAaQBuACAAeQBvAHUAcgAgAGEAcABwAGwAaQBjAGEAdABpAG8AbgAuAA0ACgAAAAAAUgA2ADAAMwAwAA0ACgAtACAAQwBSAFQAIABuAG8AdAAgAGkAbgBpAHQAaQBhAGwAaQB6AGUAZAANAAoAAAAAAFIANgAwADIAOAANAAoALQAgAHUAbgBhAGIAbABlACAAdABvACAAaQBuAGkAdABpAGEAbABpAHoAZQAgAGgAZQBhAHAADQAKAAAAAAAAAAAAUgA2ADAAMgA3AA0ACgAtACAAbgBvAHQAIABlAG4AbwB1AGcAaAAgAHMAcABhAGMAZQAgAGYAbwByACAAbABvAHcAaQBvACAAaQBuAGkAdABpAGEAbABpAHoAYQB0AGkAbwBuAA0ACgAAAAAAAAAAAFIANgAwADIANgANAAoALQAgAG4AbwB0ACAAZQBuAG8AdQBnAGgAIABzAHAAYQBjAGUAIABmAG8AcgAgAHMAdABkAGkAbwAgAGkAbgBpAHQAaQBhAGwAaQB6AGEAdABpAG8AbgANAAoAAAAAAAAAAABSADYAMAAyADUADQAKAC0AIABwAHUAcgBlACAAdgBpAHIAdAB1AGEAbAAgAGYAdQBuAGMAdABpAG8AbgAgAGMAYQBsAGwADQAKAAAAAAAAAFIANgAwADIANAANAAoALQAgAG4AbwB0ACAAZQBuAG8AdQBnAGgAIABzAHAAYQBjAGUAIABmAG8AcgAgAF8AbwBuAGUAeABpAHQALwBhAHQAZQB4AGkAdAAgAHQAYQBiAGwAZQANAAoAAAAAAAAAAABSADYAMAAxADkADQAKAC0AIAB1AG4AYQBiAGwAZQAgAHQAbwAgAG8AcABlAG4AIABjAG8AbgBzAG8AbABlACAAZABlAHYAaQBjAGUADQAKAAAAAAAAAAAAUgA2ADAAMQA4AA0ACgAtACAAdQBuAGUAeABwAGUAYwB0AGUAZAAgAGgAZQBhAHAAIABlAHIAcgBvAHIADQAKAAAAAAAAAAAAUgA2ADAAMQA3AA0ACgAtACAAdQBuAGUAeABwAGUAYwB0AGUAZAAgAG0AdQBsAHQAaQB0AGgAcgBlAGEAZAAgAGwAbwBjAGsAIABlAHIAcgBvAHIADQAKAAAAAAAAAAAAUgA2ADAAMQA2AA0ACgAtACAAbgBvAHQAIABlAG4AbwB1AGcAaAAgAHMAcABhAGMAZQAgAGYAbwByACAAdABoAHIAZQBhAGQAIABkAGEAdABhAA0ACgAAAFIANgAwADEAMAANAAoALQAgAGEAYgBvAHIAdAAoACkAIABoAGEAcwAgAGIAZQBlAG4AIABjAGEAbABsAGUAZAANAAoAAAAAAFIANgAwADAAOQANAAoALQAgAG4AbwB0ACAAZQBuAG8AdQBnAGgAIABzAHAAYQBjAGUAIABmAG8AcgAgAGUAbgB2AGkAcgBvAG4AbQBlAG4AdAANAAoAAABSADYAMAAwADgADQAKAC0AIABuAG8AdAAgAGUAbgBvAHUAZwBoACAAcwBwAGEAYwBlACAAZgBvAHIAIABhAHIAZwB1AG0AZQBuAHQAcwANAAoAAAAAAAAAUgA2ADAAMAAyAA0ACgAtACAAZgBsAG8AYQB0AGkAbgBnACAAcABvAGkAbgB0ACAAcwB1AHAAcABvAHIAdAAgAG4AbwB0ACAAbABvAGEAZABlAGQADQAKAAAAAAAAAAAAAgAAAIDKQAAIAAAAKMpAAAkAAADQyUAACgAAAIjJQAAQAAAAMMlAABEAAADQyEAAEgAAAIjIQAATAAAAMMhAABgAAADAx0AAGQAAAHDHQAAaAAAAAMdAABsAAACQxkAAHAAAAEDGQAAeAAAAAMZAAB8AAAA4xUAAIAAAANDEQAAhAAAA4MJAAHgAAAC8wkAAeQAAAKDCQAB6AAAAhMJAAPwAAAB8wkAA/wAAAFzCQABNAGkAYwByAG8AcwBvAGYAdAAgAFYAaQBzAHUAYQBsACAAQwArACsAIABSAHUAbgB0AGkAbQBlACAATABpAGIAcgBhAHIAeQAAAAAACgAKAAAAAAAuAC4ALgAAADwAcAByAG8AZwByAGEAbQAgAG4AYQBtAGUAIAB1AG4AawBuAG8AdwBuAD4AAAAAAFIAdQBuAHQAaQBtAGUAIABFAHIAcgBvAHIAIQAKAAoAUAByAG8AZwByAGEAbQA6ACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgACAAIAAgACAAIAAgACAAKAAoACgAKAAoACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAEgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAhACEAIQAhACEAIQAhACEAIQAhAAQABAAEAAQABAAEAAQAIEAgQCBAIEAgQCBAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAQABAAEAAQABAAEACCAIIAggCCAIIAggACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAEAAQABAAEAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAIAAgACAAIAAgACAAIAAgAGgAKAAoACgAKAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABIABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAIQAhACEAIQAhACEAIQAhACEAIQAEAAQABAAEAAQABAAEACBAYEBgQGBAYEBgQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB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YWJsZQAAAFVuYWJsZSB0byBmaW5kIGFuIGFwcGVuZGVkIGFyY2hpdmUuAFVuYWJsZSB0byByZWFkIGZyb20gZmlsZQAAAAAjIQAAAAAAAEpvYiBpbmZvcm1hdGlvbiBxdWVyeWluZyBmYWlsZWQASm9iIGluZm9ybWF0aW9uIHNldHRpbmcgZmFpbGVkAABzdGRpbiBkdXBsaWNhdGlvbiBmYWlsZWQAAAAAc3Rkb3V0IGR1cGxpY2F0aW9uIGZhaWxlZAAAAHN0ZGVyciBkdXBsaWNhdGlvbiBmYWlsZWQAAABVbmFibGUgdG8gY3JlYXRlIHByb2Nlc3MgdXNpbmcgJyVzJwBGYWlsZWQgdG8gZ2V0IGV4aXQgY29kZSBvZiBwcm9jZXNzAAAuAGUAeABlAAAAAABFeHBlY3RlZCB0byBmaW5kIGEgY29tbWFuZCBlbmRpbmcgaW4gJy5leGUnIGluIHNoZWJhbmcgbGluZS4AAAAAAAAAAEV4cGVjdGVkIHRlcm1pbmF0aW5nIGRvdWJsZS1xdW90ZSBmb3IgZXhlY3V0YWJsZSBpbiBzaGViYW5nIGxpbmUuAAAAAAAAAFRlcm1pbmF0aW5nIHF1b3RlIHdpdGhvdXQgc3RhcnRpbmcgcXVvdGUgZm9yIGV4ZWN1dGFibGUgaW4gc2hlYmFuZyBsaW5lLgAAAABGYWlsZWQgdG8gZmluZCBzaGViYW5nAABFeHBlY3RlZCB0byBmaW5kIHRlcm1pbmF0b3IgaW4gc2hlYmFuZyBsaW5lAEV4cGVjdGVkIHRvIGRlY29kZSBzaGViYW5nIGxpbmUgdXNpbmcgVVRGLTgARXhwZWN0ZWQgdG8gZmluZCAnIycgYXQgc3RhcnQgb2Ygc2hlYmFuZyBsaW5lAAAARXhwZWN0ZWQgdG8gZmluZCAnIScgZm9sbG93aW5nICcjJyBpbiBzaGViYW5nIGxpbmUAAEV4cGVjdGVkIHRvIGZpbmQgZXhlY3V0YWJsZSBpbiBzaGViYW5nIGxpbmUARXhwZWN0ZWQgdG8gZmluZCBhcmd1bWVudHMgKGV2ZW4gaWYgZW1wdHkpIGluIHNoZWJhbmcgbGluZQAARXhwZWN0ZWQgdG8gYmUgYWJsZSB0byBhbGxvY2F0ZSBjb21tYW5kIGxpbmUgbWVtb3J5ACIAJQBzACIAIAAlAHMAIAAiACUAcwAiACAAJQBzAAAAAAAAAEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATwQADQ3kAAAwAAAFJTRFOnLbdKQEXaTJM0o3oXpeHiAgAAAEM6XFVzZXJzXFZpbmF5XFByb2plY3RzXHNpbXBsZV9sYXVuY2hlclxSZWxlYXNlXEdVSVNpbXBsZUxhdW5jaGVyLnBkYgAAALAvAADQMQAAEGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAA9BhAAAAAAAD+////AAAAAMD///8AAAAA/v///wAAAADaG0AAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAIEgQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAA7CJAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAADyI0AAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAANIkQAAAAAAA/v///wAAAACI////AAAAAP7///81JkAASSZAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAAAYLUAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAAM0QAAAAAAA/v///wAAAADY////AAAAAP7///9fNEAAYzRAAAAAAAD+////AAAAAMD///8AAAAA/v///wAAAABMNkAAAAAAAP7///8AAAAA2P///wAAAAD+////AAAAAAI4QAD+////AAAAABE4QAD+////AAAAANj///8AAAAA/v///wAAAADEOUAA/v///wAAAADQOUAA/v///wAAAADU////AAAAAP7///8AAAAAdDxAAAAAAAD+////AAAAANj///8AAAAA/v///xs+QAAuPkAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAGVOQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAADVNAAAAAAAD+////AAAAAMz///8AAAAA/v///wAAAACZVEAAAAAAAAAAAABlVEAA/v///wAAAADQ////AAAAAP7///8AAAAAAFZAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAAASXkAAAAAAAP7///8AAAAAzP///wAAAAD+////AAAAAOFlQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAADnBAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAADVckAAAAAAAP7///8AAAAAzP///wAAAAD+////AAAAAKd2QAAAAAAA/v///wAAAADM////AAAAAP7///8AAAAAZIlAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAAA0kUAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAOyjQAAAAAAA/v///wAAAADI////AAAAAP7///8AAAAAsaVAAAAAAAAAAAAA7aRAAP7///8AAAAA0P///wAAAAD+////AAAAAFKnQADo4gAAAAAAAAAAAADY5QAAAMAAACjkAAAAAAAAAAAAAPLlAABAwQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAw5AAAPuQAAFDkAABq5AAAeOQAAIrkAACe5AAAtOQAANDkAADs5AAAAuUAABjlAAA05QAASuUAAF7lAABu5QAAfuUAAJDlAACg5QAAuOUAAMrlAAD+5QAAEuYAACLmAAAu5gAAOuYAAEzmAABe5gAAdOYAAIbmAACa5gAAtuYAANTmAADo5gAAAOcAABjnAABA5wAAUOcAAFznAAB05wAAhOcAAJDnAACe5wAArOcAALbnAADO5wAA3ucAAPTnAAAM6AAAGOgAACboAAAy6AAAROgAAFLoAABk6AAAeugAAJToAACq6AAAxOgAAN7oAADu6AAABOkAAB7pAAAm6QAANOkAAEDpAABK6QAAVukAAGjpAAB06QAAhOkAAJbpAACm6QAAwukAANbpAADk6QAA9OkAAAbqAAAW6gAAAAAAAOblAAAAAAAAGQFFeGl0UHJvY2VzcwCHAUdldENvbW1hbmRMaW5lVwBxBFNldEluZm9ybWF0aW9uSm9iT2JqZWN0AGIBRnJlZUxpYnJhcnkAqABDcmVhdGVQcm9jZXNzVwAAwAFHZXRDdXJyZW50UHJvY2VzcwD5BFdhaXRGb3JTaW5nbGVPYmplY3QAZwFHZW5lcmF0ZUNvbnNvbGVDdHJsRXZlbnQAABYAQXNzaWduUHJvY2Vzc1RvSm9iT2JqZWN0AADfAUdldEV4aXRDb2RlUHJvY2VzcwAAFAJHZXRNb2R1bGVGaWxlTmFtZVcAAKUDUXVlcnlJbmZvcm1hdGlvbkpvYk9iamVjdABnA011bHRpQnl0ZVRvV2lkZUNoYXIAlQBDcmVhdGVKb2JPYmplY3RBAABkAkdldFN0ZEhhbmRsZQAAAgJHZXRMYXN0RXJyb3IAAEUCR2V0UHJvY0FkZHJlc3MAADwDTG9hZExpYnJhcnlBAAAtBFNldENvbnNvbGVDdHJsSGFuZGxlcgDoAER1cGxpY2F0ZUhhbmRsZQBSAENsb3NlSGFuZGxlAEtFUk5FTDMyLmRsbAAARQFTdHJTdHJJVwAAU0hMV0FQSS5kbGwAGAJHZXRNb2R1bGVIYW5kbGVXAADKAERlY29kZVBvaW50ZXIAzwJIZWFwRnJlZQAAywJIZWFwQWxsb2MAaQJHZXRTdHJpbmdUeXBlVwAAhgFHZXRDb21tYW5kTGluZUEA0wJIZWFwU2V0SW5mb3JtYXRpb24AAGMCR2V0U3RhcnR1cEluZm9XAMAEVGVybWluYXRlUHJvY2VzcwAA0wRVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIAAKUEU2V0VW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyAAADSXNEZWJ1Z2dlclByZXNlbnQA7gBFbnRlckNyaXRpY2FsU2VjdGlvbgAAOQNMZWF2ZUNyaXRpY2FsU2VjdGlvbgAA4wJJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uQW5kU3BpbkNvdW50AOoARW5jb2RlUG9pbnRlcgAYBFJ0bFVud2luZADRAERlbGV0ZUNyaXRpY2FsU2VjdGlvbgA/A0xvYWRMaWJyYXJ5VwAAxQRUbHNBbGxvYwAAxwRUbHNHZXRWYWx1ZQDIBFRsc1NldFZhbHVlAMYEVGxzRnJlZQDvAkludGVybG9ja2VkSW5jcmVtZW50AABzBFNldExhc3RFcnJvcgAAxQFHZXRDdXJyZW50VGhyZWFkSWQAAOsCSW50ZXJsb2NrZWREZWNyZW1lbnQAACUFV3JpdGVGaWxlAM0CSGVhcENyZWF0ZQAAwANSZWFkRmlsZQAAbwRTZXRIYW5kbGVDb3VudAAA8wFHZXRGaWxlVHlwZQBmBFNldEZpbGVQb2ludGVyAAATAkdldE1vZHVsZUZpbGVOYW1lQQAAYQFGcmVlRW52aXJvbm1lbnRTdHJpbmdzVwARBVdpZGVDaGFyVG9NdWx0aUJ5dGUA2gFHZXRFbnZpcm9ubWVudFN0cmluZ3NXAACnA1F1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyAJMCR2V0VGlja0NvdW50AADBAUdldEN1cnJlbnRQcm9jZXNzSWQAeQJHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZQCyBFNsZWVwAI8AQ3JlYXRlRmlsZVcAcgFHZXRDUEluZm8AaAFHZXRBQ1AAADcCR2V0T0VNQ1AAAAoDSXNWYWxpZENvZGVQYWdlANQCSGVhcFNpemUAAJoBR2V0Q29uc29sZUNQAACsAUdldENvbnNvbGVNb2RlAACHBFNldFN0ZEhhbmRsZQAABANJc1Byb2Nlc3NvckZlYXR1cmVQcmVzZW50AFcBRmx1c2hGaWxlQnVmZmVycwAA0gJIZWFwUmVBbGxvYwBTBFNldEVuZE9mRmlsZQAASgJHZXRQcm9jZXNzSGVhcAAALQNMQ01hcFN0cmluZ1cAACQFV3JpdGVDb25zb2xlVwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAATuZAu7EZv0QAAAAAwA5BAAAAAADADkEAAQEAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAWAAAAAgAAAAIAAAADAAAAAgAAAAQAAAAYAAAABQAAAA0AAAAGAAAACQAAAAcAAAAMAAAACAAAAAwAAAAJAAAADAAAAAoAAAAHAAAACwAAAAgAAAAMAAAAFgAAAA0AAAAWAAAADwAAAAIAAAAQAAAADQAAABEAAAASAAAAEgAAAAIAAAAhAAAADQAAADUAAAACAAAAQQAAAA0AAABDAAAAAgAAAFAAAAARAAAAUgAAAA0AAABTAAAADQAAAFcAAAAWAAAAWQAAAAsAAABsAAAADQAAAG0AAAAgAAAAcAAAABwAAAByAAAACQAAAAYAAAAWAAAAgAAAAAoAAACBAAAACgAAAIIAAAAJ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3v//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+n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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABwAAAAcAAAAFAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///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+4EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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6f//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+DQogIDwvdHJ1c3RJbmZvPg0KPC9hc3NlbWJseT5QQVBBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRERJTkdQQURESU5HWFhQQURESU5HUEFERElOR1hYUEFERElOR1BBRERJTkdYWFBBRAAQAADgAAAABTALMBIwHzAmMCswQDBQMGMwojDCMNUw/DAGMR4x8jFSMmsylTKqMrYyzzLcMvIyDzMmMz0zYDNlM4cznDO5M9Yz5TPzMw80GDQuNDU0PzRLNFo0XzRxNH80hDTDNOU0BDVeNWw1kzXENc011DXpNQU2GzZSNnY2hjbLNv42STdf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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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ADgB6zBCgEwBCIBKiwTLQoBkADiCQoBMADgC6xhCgGQBCH/rEEKATAEIgEqLDMtCgGQBOIBFhdt1B7gAgAAA6w9B99obwCUAwAAABQBAAABIi1wkCMPMzEiD7ChIhcl1F+jmev//xwAWAAAA6HN6//+4FgAAAOsKiwVaiQAAiQEzwEiDxCjDzEiJXCQQZolMJAhVSIvsSIPsULj//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//9Ii4uIAAAASDsN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MwANAAoALQAgAEEAdAB0AGUAbQBwAHQAIAB0AG8AIAB1AHMAZQAgAE0AUwBJAEwAIABjAG8AZABlACAAZgByAG8AbQAgAHQAaABpAHMAIABhAHMAcwBlAG0AYgBsAHkAIABkAHUAcgBpAG4AZwAgAG4AYQB0AGkAdgBlACAAYwBvAGQAZQAgAGkAbgBpAHQAaQBhAGwAaQB6AGEAdABpAG8AbgAKAFQAaABpAHMAIABpAG4AZABpAGMAYQB0AGUAcwAgAGEAIABiAHUAZwAgAGkAbgAgAHkAbwB1AHIAIABhAHAAcABsAGkAYwBhAHQAaQBvAG4ALgAgAEkAdAAgAGkAcwAgAG0AbwBzAHQAIABsAGkAawBlAGwAeQAgAHQAaABlACAAcgBlAHMAdQBsAHQAIABvAGYAIABjAGEAbABsAGkAbgBnACAAYQBuACAATQBTAEkATAAtAGMAbwBtAHAAaQBsAGUAZAAgACgALwBjAGwAcgApACAAZgB1AG4AYwB0AGkAbwBuACAAZgByAG8AbQAgAGEAIABuAGEAdABpAHYAZQAgAGMAbwBuAHMAdAByAHUAYwB0AG8AcgAgAG8AcgAgAGYAcgBvAG0AIABEAGwAbABNAGEAaQBuAC4ADQAKAAAAAABSADYAMAAzADIADQAKAC0AIABuAG8AdAAgAGUAbgBvAHUAZwBoACAAcwBwAGEAYwBlACAAZgBvAHIAIABsAG8AYwBhAGwAZQAgAGkAbgBmAG8AcgBtAGEAdABpAG8AbgANAAoAAAAAAAAAAAAAAAAAUgA2ADAAMwAxAA0ACgAtACAAQQB0AHQAZQBtAHAAdAAgAHQAbwAgAGkAbgBpAHQAaQBhAGwAaQB6AGUAIAB0AGgAZQAgAEMAUgBUACAAbQBvAHIAZQAgAHQAaABhAG4AIABvAG4AYwBlAC4ACgBUAGgAaQBzACAAaQBuAGQAaQBjAGEAdABlAHMAIABhACAAYgB1AGcAIABpAG4AIAB5AG8AdQByACAAYQBwAHAAbABpAGMAYQB0AGkAbwBuAC4ADQAKAAAAAABSADYAMAAzADAADQAKAC0AIABDAFIAVAAgAG4AbwB0ACAAaQBuAGkAdABpAGEAbABpAHoAZQBkAA0ACgAAAAAAAAAAAAAAAABSADYAMAAyADgADQAKAC0AIAB1AG4AYQBiAGwAZQAgAHQAbwAgAGkAbgBpAHQAaQBhAGwAaQB6AGUAIABoAGUAYQBwAA0ACgAAAAAAAAAAAFIANgAwADIANwANAAoALQAgAG4AbwB0ACAAZQBuAG8AdQBnAGgAIABzAHAAYQBjAGUAIABmAG8AcgAgAGwAbwB3AGkAbwAgAGkAbgBpAHQAaQBhAGwAaQB6AGEAdABpAG8AbgANAAoAAAAAAAAAAABSADYAMAAyADYADQAKAC0AIABuAG8AdAAgAGUAbgBvAHUAZwBoACAAcwBwAGEAYwBlACAAZgBvAHIAIABzAHQAZABpAG8AIABpAG4AaQB0AGkAYQBsAGkAegBhAHQAaQBvAG4ADQAKAAAAAAAAAAAAUgA2ADAAMgA1AA0ACgAtACAAcAB1AHIAZQAgAHYAaQByAHQAdQBhAGwAIABmAHUAbgBjAHQAaQBvAG4AIABjAGEAbABsAA0ACgAAAAAAAABSADYAMAAyADQADQAKAC0AIABuAG8AdAAgAGUAbgBvAHUAZwBoACAAcwBwAGEAYwBlACAAZgBvAHIAIABfAG8AbgBlAHgAaQB0AC8AYQB0AGUAeABpAHQAIAB0AGEAYgBsAGUADQAKAAAAAAAAAAAAUgA2ADAAMQA5AA0ACgAtACAAdQBuAGEAYgBsAGUAIAB0AG8AIABvAHAAZQBuACAAYwBvAG4AcwBvAGwAZQAgAGQAZQB2AGkAYwBlAA0ACgAAAAAAAAAAAAAAAAAAAAAAUgA2ADAAMQA4AA0ACgAtACAAdQBuAGUAeABwAGUAYwB0AGUAZAAgAGgAZQBhAHAAIABlAHIAcgBvAHIADQAKAAAAAAAAAAAAAAAAAAAAAABSADYAMAAxADcADQAKAC0AIAB1AG4AZQB4AHAAZQBjAHQAZQBkACAAbQB1AGwAdABpAHQAaAByAGUAYQBkACAAbABvAGMAawAgAGUAcgByAG8AcgANAAoAAAAAAAAAAABSADYAMAAxADYADQAKAC0AIABuAG8AdAAgAGUAbgBvAHUAZwBoACAAcwBwAGEAYwBlACAAZgBvAHIAIAB0AGgAcgBlAGEAZAAgAGQAYQB0AGEADQAKAAAAAAAAAAAAAABSADYAMAAxADAADQAKAC0AIABhAGIAbwByAHQAKAApACAAaABhAHMAIABiAGUAZQBuACAAYwBhAGwAbABlAGQADQAKAAAAAAAAAAAAAAAAAFIANgAwADAAOQANAAoALQAgAG4AbwB0ACAAZQBuAG8AdQBnAGgAIABzAHAAYQBjAGUAIABmAG8AcgAgAGUAbgB2AGkAcgBvAG4AbQBlAG4AdAANAAoAAAAAAAAAAAAAAFIANgAwADAAOAANAAoALQAgAG4AbwB0ACAAZQBuAG8AdQBnAGgAIABzAHAAYQBjAGUAIABmAG8AcgAgAGEAcgBnAHUAbQBlAG4AdABzAA0ACgAAAAAAAAAAAAAAAAAAAFIANgAwADAAMgANAAoALQAgAGYAbABvAGEAdABpAG4AZwAgAHAAbwBpAG4AdAAgAHMAdQBwAHAAbwByAHQAIABuAG8AdAAgAGwAbwBhAGQAZQBkAA0ACgAAAAAAAAAAAAIAAAAAAAAAEOwAQAEAAAAIAAAAAAAAALDrAEABAAAACQAAAAAAAABQ6wBAAQAAAAoAAAAAAAAAAOsAQAEAAAAQAAAAAAAAAKDqAEABAAAAEQAAAAAAAABA6gBAAQAAABIAAAAAAAAA8OkAQAEAAAATAAAAAAAAAJDpAEABAAAAGAAAAAAAAAAg6QBAAQAAABkAAAAAAAAA0OgAQAEAAAAaAAAAAAAAAGDoAEABAAAAGwAAAAAAAADw5wBAAQAAABwAAAAAAAAAoOcAQAEAAAAeAAAAAAAAAFjnAEABAAAAHwAAAAAAAACQ5gBAAQAAACAAAAAAAAAAIOYAQAEAAAAhAAAAAAAAADDkAEABAAAAeAAAAAAAAAAQ5ABAAQAAAHkAAAAAAAAA8OMAQAEAAAB6AAAAAAAAANDjAEABAAAA/AAAAAAAAADI4wBAAQAAAP8AAAAAAAAAqOMAQAEAAABNAGkAYwByAG8AcwBvAGYAdAAgAFYAaQBzAHUAYQBsACAAQwArACsAIABSAHUAbgB0AGkAbQBlACAATABpAGIAcgBhAHIAeQAAAAAACgAKAAAAAAAAAAAALgAuAC4AAAA8AHAAcgBvAGcAcgBhAG0AIABuAGEAbQBlACAAdQBuAGsAbgBvAHcAbgA+AAAAAABSAHUAbgB0AGkAbQBlACAARQByAHIAbwByACEACgAKAFAAcgBvAGcAcgBhAG0AOgAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAIAAgACAAIAAgACAAIAAgACgAKAAoACgAKAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABIABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAIQAhACEAIQAhACEAIQAhACEAIQAEAAQABAAEAAQABAAEACBAIEAgQCBAIEAgQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAEAAQABAAEAAQABAAggCCAIIAggCCAIIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABAAEAAQABAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgACAAIAAgACAAIAAgACAAIABoACgAKAAoACgAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAASAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACEAIQAhACEAIQAhACEAIQAhACEABAAEAAQABAAEAAQABAAgQGBAYEBgQGBAYEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB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NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/AEMATwBOAE8AVQBUACQAAAB1c2VyMzIuZGxsAAAAAAAATWVzc2FnZUJveFRpbWVvdXRBAAAAAAAARmF0YWwgRXJyb3IgaW4gTGF1bmNoZXIAcgBiAAAAAABGYWlsZWQgdG8gb3BlbiBleGVjdXRhYmxlAAAAAAAAAFVuYWJsZSB0byBmaW5kIGFuIGFwcGVuZGVkIGFyY2hpdmUuAAAAAABVbmFibGUgdG8gcmVhZCBmcm9tIGZpbGUAAAAAIyEAAAAAAAAAAAAASm9iIGluZm9ybWF0aW9uIHF1ZXJ5aW5nIGZhaWxlZABKb2IgaW5mb3JtYXRpb24gc2V0dGluZyBmYWlsZWQAAHN0ZGluIGR1cGxpY2F0aW9uIGZhaWxlZAAAAAAAAAAAc3Rkb3V0IGR1cGxpY2F0aW9uIGZhaWxlZAAAAAAAAABzdGRlcnIgZHVwbGljYXRpb24gZmFpbGVkAAAAAAAAAFVuYWJsZSB0byBjcmVhdGUgcHJvY2VzcyB1c2luZyAnJXMnAAAAAABGYWlsZWQgdG8gZ2V0IGV4aXQgY29kZSBvZiBwcm9jZXNzAAAAAAAALgBlAHgAZQAAAAAAAAAAAEV4cGVjdGVkIHRvIGZpbmQgYSBjb21tYW5kIGVuZGluZyBpbiAnLmV4ZScgaW4gc2hlYmFuZyBsaW5lLgAAAAAAAAAAAAAAAEV4cGVjdGVkIHRlcm1pbmF0aW5nIGRvdWJsZS1xdW90ZSBmb3IgZXhlY3V0YWJsZSBpbiBzaGViYW5nIGxpbmUuAAAAAAAAAAAAAAAAAAAAVGVybWluYXRpbmcgcXVvdGUgd2l0aG91dCBzdGFydGluZyBxdW90ZSBmb3IgZXhlY3V0YWJsZSBpbiBzaGViYW5nIGxpbmUuAAAAAAAAAABGYWlsZWQgdG8gZmluZCBzaGViYW5nAABFeHBlY3RlZCB0byBmaW5kIHRlcm1pbmF0b3IgaW4gc2hlYmFuZyBsaW5lAAAAAABFeHBlY3RlZCB0byBkZWNvZGUgc2hlYmFuZyBsaW5lIHVzaW5nIFVURi04AAAAAABFeHBlY3RlZCB0byBmaW5k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1hMBAAAAAADwEwEAAAAAAAAUAQAAAAAAFhQBAAAAAAAwFAEAAAAAADgUAQAAAAAARhQBAAAAAABSFAEAAAAAAFwUAQAAAAAAaBQBAAAAAAB6FAEAAAAAAIYUAQAAAAAAlhQBAAAAAACoFAEAAAAAALgUAQAAAAAAzBQBAAAAAADaFAEAAAAAAOoUAQAAAAAA/BQBAAAAAAAMFQEAAAAAAAAAAAAAAAAA1hABAAAAAAAAAAAAAAAAAB8BRXhpdFByb2Nlc3MAjQFHZXRDb21tYW5kTGluZVcAfgRTZXRJbmZvcm1hdGlvbkpvYk9iamVjdABoAUZyZWVMaWJyYXJ5AKgAQ3JlYXRlUHJvY2Vzc1cAAMYBR2V0Q3VycmVudFByb2Nlc3MACAVXYWl0Rm9yU2luZ2xlT2JqZWN0AG0BR2VuZXJhdGVDb25zb2xlQ3RybEV2ZW50AAAWAEFzc2lnblByb2Nlc3NUb0pvYk9iamVjdAAA5gFHZXRFeGl0Q29kZVByb2Nlc3MAABoCR2V0TW9kdWxlRmlsZU5hbWVXAACnA1F1ZXJ5SW5mb3JtYXRpb25Kb2JPYmplY3QAaQNNdWx0aUJ5dGVUb1dpZGVDaGFyAJUAQ3JlYXRlSm9iT2JqZWN0QQAAawJHZXRTdGRIYW5kbGUAAAgCR2V0TGFzdEVycm9yAABMAkdldFByb2NBZGRyZXNzAAA+A0xvYWRMaWJyYXJ5QQAAOwRTZXRDb25zb2xlQ3RybEhhbmRsZXIA7ABEdXBsaWNhdGVIYW5kbGUAUgBDbG9zZUhhbmRsZQBLRVJORUwzMi5kbGwAAEUBU3RyU3RySVcAAFNITFdBUEkuZGxsAB4CR2V0TW9kdWxlSGFuZGxlVwAAywBEZWNvZGVQb2ludGVyANcCSGVhcEZyZWUAANMCSGVhcEFsbG9jAHACR2V0U3RyaW5nVHlwZVcAAIwBR2V0Q29tbWFuZExpbmVBAGoCR2V0U3RhcnR1cEluZm9XAM4EVGVybWluYXRlUHJvY2VzcwAA4gRVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIAALMEU2V0VW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyAAIDSXNEZWJ1Z2dlclByZXNlbnQAJgRSdGxWaXJ0dWFsVW53aW5kAAAfBFJ0bExvb2t1cEZ1bmN0aW9uRW50cnkAABgEUnRsQ2FwdHVyZUNvbnRleHQAJQRSdGxVbndpbmRFeADyAEVudGVyQ3JpdGljYWxTZWN0aW9uAAA7A0xlYXZlQ3JpdGljYWxTZWN0aW9uAADrAkluaXRpYWxpemVDcml0aWNhbFNlY3Rpb25BbmRTcGluQ291bnQA7gBFbmNvZGVQb2ludGVyANIARGVsZXRlQ3JpdGljYWxTZWN0aW9uAEEDTG9hZExpYnJhcnlXAABaAUZsc0dldFZhbHVlAFsBRmxzU2V0VmFsdWUAWQFGbHNGcmVlAIAEU2V0TGFzdEVycm9yAADLAUdldEN1cnJlbnRUaHJlYWRJZAAAWAFGbHNBbGxvYwAANAVXcml0ZUZpbGUA2wJIZWFwU2V0SW5mb3JtYXRpb24AAKoCR2V0VmVyc2lvbgAA1QJIZWFwQ3JlYXRlAADDA1JlYWRGaWxlAAB8BFNldEhhbmRsZUNvdW50AAD6AUdldEZpbGVUeXBlAHQEU2V0RmlsZVBvaW50ZXIAABkCR2V0TW9kdWxlRmlsZU5hbWVBAABnAUZyZWVFbnZpcm9ubWVudFN0cmluZ3NXACAFV2lkZUNoYXJUb011bHRpQnl0ZQDhAUdldEVudmlyb25tZW50U3RyaW5nc1cAAKkDUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIAmgJHZXRUaWNrQ291bnQAAMcBR2V0Q3VycmVudFByb2Nlc3NJZACAAkdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lAMAEU2xlZXAAjwBDcmVhdGVGaWxlVwB4AUdldENQSW5mbwBuAUdldEFDUAAAPgJHZXRPRU1DUAAADANJc1ZhbGlkQ29kZVBhZ2UA3AJIZWFwU2l6ZQAAoAFHZXRDb25zb2xlQ1AAALIBR2V0Q29uc29sZU1vZGUAAJQEU2V0U3RkSGFuZGxlAABdAUZsdXNoRmlsZUJ1ZmZlcnMAANoCSGVhcFJlQWxsb2MAYQRTZXRFbmRPZkZpbGUAAFECR2V0UHJvY2Vzc0hlYXAAAC8DTENNYXBTdHJpbmdXAAAzBVdyaXRlQ29uc29sZVcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAyot8tmSsAAM1dINJm1P//AAAAAAAAAABASAFAAQAAAAAAAAAAAAAAQEgBQAEAAAABAQAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAFgAAAAIAAAACAAAAAwAAAAIAAAAEAAAAGAAAAAUAAAANAAAABgAAAAkAAAAHAAAADAAAAAgAAAAMAAAACQAAAAwAAAAKAAAABwAAAAsAAAAIAAAADAAAABYAAAANAAAAFgAAAA8AAAACAAAAEAAAAA0AAAARAAAAEgAAABIAAAACAAAAIQAAAA0AAAA1AAAAAgAAAEEAAAANAAAAQwAAAAIAAABQAAAAEQAAAFIAAAANAAAAUwAAAA0AAABXAAAAFgAAAFkAAAALAAAAbAAAAA0AAABtAAAAIAAAAHAAAAAcAAAAcgAAAAkAAAAGAAAAFgAAAIAAAAAKAAAAgQAAAAoAAACCAAAACQAAAIMAAAAWAAAAhAAAAA0AAACRAAAAKQAAAJ4AAAANAAAAoQAAAAIAAACkAAAACwAAAKcAAAANAAAAtwAAABEAAADOAAAAAgAAANcAAAALAAAAGAcAAAwAAAAMAAAACAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8AAAAAAAAAAAAAAAC0hABAAQAAALSEAEABAAAAtIQAQAEAAAC0hABAAQAAALSEAEABAAAAtIQAQAEAAAC0hABAAQAAALSEAEABAAAAtIQAQAEAAAC0hABAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgICAgICAgICAgICAgICAgMDAwMDAwMDAAAAAAAAAACg7wBAAQAAAKLxAEABAAAA//////////+ACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAQwAAAAAAAAAAAAAAAAAAADD7AEABAAAALPsAQAEAAAAo+wBAAQAAACT7AEABAAAAIPsAQAEAAAAc+wBAAQAAABj7AEABAAAAEPsAQAEAAAAI+wBAAQAAAAD7AEABAAAA8PoAQAEAAADg+gBAAQAAANT6AEABAAAAyPoAQAEAAADE+gBAAQAAAMD6AEABAAAAvPoAQAEAAAC4+gBA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/////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/////////////////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AD93d+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//////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/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qqqqDgAAAAClpaUEo6OjSaCgoL6tra3/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/UoKnLmAAAy5gAACwAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi93aGVlbC5weSMgLSotIGNvZGluZzogdXRmLTggLSotCiMKIyBDb3B5cmlnaHQgKEMpIDIwMTMtMjAxNiBWaW5heSBTYWppcC4KIyBMaWNlbnNlZCB0byB0aGUgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24gdW5kZXIgYSBjb250cmlidXRvciBhZ3JlZW1lbnQuCiMgU2VlIExJQ0VOU0UudHh0IGFuZCBDT05UUklCVVRPUlMudHh0LgojCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgdW5pY29kZV9saXRlcmFscwoKaW1wb3J0IGJhc2U2NAppbXBvcnQgY29kZWNzCmltcG9ydCBkYXRldGltZQppbXBvcnQgZGlzdHV0aWxzLnV0aWwKZnJvbSBlbWFpbCBpbXBvcnQgbWVzc2FnZV9mcm9tX2ZpbGUKaW1wb3J0IGhhc2hsaWIKaW1wb3J0IGltcAppbXBvcnQganNvbgppbXBvcnQgbG9nZ2luZwppbXBvcnQgb3MKaW1wb3J0IHBvc2l4cGF0aAppbXBvcnQgcmUKaW1wb3J0IHNodXRpbAppbXBvcnQgc3lzCmltcG9ydCB0ZW1wZmlsZQppbXBvcnQgemlwZmlsZQoKZnJvbSAuIGltcG9ydCBfX3ZlcnNpb25fXywgRGlzdGxpYkV4Y2VwdGlvbgpmcm9tIC5jb21wYXQgaW1wb3J0IHN5c2NvbmZpZywgWmlwRmlsZSwgZnNkZWNvZGUsIHRleHRfdHlwZSwgZmlsdGVyCmZyb20gLmRhdGFiYXNlIGltcG9ydCBJbnN0YWxsZWREaXN0cmlidXRpb24KZnJvbSAubWV0YWRhdGEgaW1wb3J0IE1ldGFkYXRhLCBNRVRBREFUQV9GSUxFTkFNRQpmcm9tIC51dGlsIGltcG9ydCAoRmlsZU9wZXJhdG9yLCBjb252ZXJ0X3BhdGgsIENTVlJlYWRlciwgQ1NWV3JpdGVyLCBDYWNoZSwKICAgICAgICAgICAgICAgICAgIGNhY2hlZF9wcm9wZXJ0eSwgZ2V0X2NhY2hlX2Jhc2UsIHJlYWRfZXhwb3J0cywgdGVtcGRpcikKZnJvbSAudmVyc2lvbiBpbXBvcnQgTm9ybWFsaXplZFZlcnNpb24sIFVuc3VwcG9ydGVkVmVyc2lvbkVycm9yCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCmNhY2hlID0gTm9uZSAgICAjIGNyZWF0ZWQgd2hlbiBuZWVkZWQKCmlmIGhhc2F0dHIoc3lzLCAncHlweV92ZXJzaW9uX2luZm8nKToKICAgIElNUF9QUkVGSVggPSAncHAnCmVsaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2phdmEnKToKICAgIElNUF9QUkVGSVggPSAnanknCmVsaWYgc3lzLnBsYXRmb3JtID09ICdjbGknOgogICAgSU1QX1BSRUZJWCA9ICdpcCcKZWxzZToKICAgIElNUF9QUkVGSVggPSAnY3AnCgpWRVJfU1VGRklYID0gc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdweV92ZXJzaW9uX25vZG90JykKaWYgbm90IFZFUl9TVUZGSVg6ICAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICBWRVJfU1VGRklYID0gJyVzJXMnICUgc3lzLnZlcnNpb25faW5mb1s6Ml0KUFlWRVIgPSAncHknICsgVkVSX1NVRkZJWApJTVBWRVIgPSBJTVBfUFJFRklYICsgVkVSX1NVRkZJWAoKQVJDSCA9IGRpc3R1dGlscy51dGlsLmdldF9wbGF0Zm9ybSgpLnJlcGxhY2UoJy0nLCAnXycpLnJlcGxhY2UoJy4nLCAnXycpCgpBQkkgPSBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ1NPQUJJJykKaWYgQUJJIGFuZCBBQkkuc3RhcnRzd2l0aCgnY3B5dGhvbi0nKToKICAgIEFCSSA9IEFCSS5yZXBsYWNlKCdjcHl0aG9uLScsICdjcCcpCmVsc2U6CiAgICBkZWYgX2Rlcml2ZV9hYmkoKToKICAgICAgICBwYXJ0cyA9IFsnY3AnLCBWRVJfU1VGRklYXQogICAgICAgIGlmIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignUHlfREVCVUcnKToKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCdkJykKICAgICAgICBpZiBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ1dJVEhfUFlNQUxMT0MnKToKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCdtJykKICAgICAgICBpZiBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ1B5X1VOSUNPREVfU0laRScpID09IDQ6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgndScpCiAgICAgICAgcmV0dXJuICcnLmpvaW4ocGFydHMpCiAgICBBQkkgPSBfZGVyaXZlX2FiaSgpCiAgICBkZWwgX2Rlcml2ZV9hYmkKCkZJTEVOQU1FX1JFID0gcmUuY29tcGlsZShyJycnCig/UDxubT5bXi1dKykKLSg/UDx2bj5cZCtbXi1dKikKKC0oP1A8Ym4+XGQrW14tXSopKT8KLSg/UDxweT5cdytcZCsoXC5cdytcZCspKikKLSg/UDxiaT5cdyspCi0oP1A8YXI+XHcrKFwuXHcrKSopClwud2hsJAonJycsIHJlLklHTk9SRUNBU0UgfCByZS5WRVJCT1NFKQoKTkFNRV9WRVJTSU9OX1JFID0gcmUuY29tcGlsZShyJycnCig/UDxubT5bXi1dKykKLSg/UDx2bj5cZCtbXi1dKikKKC0oP1A8Ym4+XGQrW14tXSopKT8kCicnJywgcmUuSUdOT1JFQ0FTRSB8IHJlLlZFUkJPU0UpCgpTSEVCQU5HX1JFID0gcmUuY29tcGlsZShicidccyojIVteXHJcbl0qJykKU0hFQkFOR19ERVRBSUxfUkUgPSByZS5jb21waWxlKGJyJ14oXHMqIyEoIlteIl0rInxcUyspKVxzKyguKikkJykKU0hFQkFOR19QWVRIT04gPSBiJyMhcHl0aG9uJwpTSEVCQU5HX1BZVEhPTlcgPSBiJyMhcHl0aG9udycKCmlmIG9zLnNlcCA9PSAnLyc6CiAgICB0b19wb3NpeCA9IGxhbWJkYSBvOiBvCmVsc2U6CiAgICB0b19wb3NpeCA9IGxhbWJkYSBvOiBvLnJlcGxhY2Uob3Muc2VwLCAnLycpCgoKY2xhc3MgTW91bnRlcihvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYuaW1wdXJlX3doZWVscyA9IHt9CiAgICAgICAgc2VsZi5saWJzID0ge30KCiAgICBkZWYgYWRkKHNlbGYsIHBhdGhuYW1lLCBleHRlbnNpb25zKToKICAgICAgICBzZWxmLmltcHVyZV93aGVlbHNbcGF0aG5hbWVdID0gZXh0ZW5zaW9ucwogICAgICAgIHNlbGYubGlicy51cGRhdGUoZXh0ZW5zaW9ucykKCiAgICBkZWYgcmVtb3ZlKHNlbGYsIHBhdGhuYW1lKToKICAgICAgICBleHRlbnNpb25zID0gc2VsZi5pbXB1cmVfd2hlZWxzLnBvcChwYXRobmFtZSkKICAgICAgICBmb3IgaywgdiBpbiBleHRlbnNpb25zOgogICAgICAgICAgICBpZiBrIGluIHNlbGYubGliczoKICAgICAgICAgICAgICAgIGRlbCBzZWxmLmxpYnNba10KCiAgICBkZWYgZmluZF9tb2R1bGUoc2VsZiwgZnVsbG5hbWUsIHBhdGg9Tm9uZSk6CiAgICAgICAgaWYgZnVsbG5hbWUgaW4gc2VsZi5saWJzOgogICAgICAgICAgICByZXN1bHQgPSBzZWxmCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVzdWx0ID0gTm9uZQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgbG9hZF9tb2R1bGUoc2VsZiwgZnVsbG5hbWUpOgogICAgICAgIGlmIGZ1bGxuYW1lIGluIHN5cy5tb2R1bGVzOgogICAgICAgICAgICByZXN1bHQgPSBzeXMubW9kdWxlc1tmdWxsbmFtZV0KICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBmdWxsbmFtZSBub3QgaW4gc2VsZi5saWJzOgogICAgICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoJ3VuYWJsZSB0byBmaW5kIGV4dGVuc2lvbiBmb3IgJXMnICUgZnVsbG5hbWUpCiAgICAgICAgICAgIHJlc3VsdCA9IGltcC5sb2FkX2R5bmFtaWMoZnVsbG5hbWUsIHNlbGYubGlic1tmdWxsbmFtZV0pCiAgICAgICAgICAgIHJlc3VsdC5fX2xvYWRlcl9fID0gc2VsZgogICAgICAgICAgICBwYXJ0cyA9IGZ1bGxuYW1lLnJzcGxpdCgnLicsIDEpCiAgICAgICAgICAgIGlmIGxlbihwYXJ0cykgPiAxOgogICAgICAgICAgICAgICAgcmVzdWx0Ll9fcGFja2FnZV9fID0gcGFydHNbMF0KICAgICAgICByZXR1cm4gcmVzdWx0CgpfaG9vayA9IE1vdW50ZXIoKQoKCmNsYXNzIFdoZWVsKG9iamVjdCk6CiAgICAiIiIKICAgIENsYXNzIHRvIGJ1aWxkIGFuZCBpbnN0YWxsIGZyb20gV2hlZWwgZmlsZXMgKFBFUCA0MjcpLgogICAgIiIiCgogICAgd2hlZWxfdmVyc2lvbiA9ICgxLCAxKQogICAgaGFzaF9raW5kID0gJ3NoYTI1NicKCiAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW5hbWU9Tm9uZSwgc2lnbj1GYWxzZSwgdmVyaWZ5PUZhbHNlKToKICAgICAgICAiIiIKICAgICAgICBJbml0aWFsaXNlIGFuIGluc3RhbmNlIHVzaW5nIGEgKHZhbGlkKSBmaWxlbmFtZS4KICAgICAgICAiIiIKICAgICAgICBzZWxmLnNpZ24gPSBzaWduCiAgICAgICAgc2VsZi5zaG91bGRfdmVyaWZ5ID0gdmVyaWZ5CiAgICAgICAgc2VsZi5idWlsZHZlciA9ICcnCiAgICAgICAgc2VsZi5weXZlciA9IFtQWVZFUl0KICAgICAgICBzZWxmLmFiaSA9IFsnbm9uZSddCiAgICAgICAgc2VsZi5hcmNoID0gWydhbnknXQogICAgICAgIHNlbGYuZGlybmFtZSA9IG9zLmdldGN3ZCgpCiAgICAgICAgaWYgZmlsZW5hbWUgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5uYW1lID0gJ2R1bW15JwogICAgICAgICAgICBzZWxmLnZlcnNpb24gPSAnMC4xJwogICAgICAgICAgICBzZWxmLl9maWxlbmFtZSA9IHNlbGYuZmlsZW5hbWUKICAgICAgICBlbHNlOgogICAgICAgICAgICBtID0gTkFNRV9WRVJTSU9OX1JFLm1hdGNoKGZpbGVuYW1lKQogICAgICAgICAgICBpZiBtOgogICAgICAgICAgICAgICAgaW5mbyA9IG0uZ3JvdXBkaWN0KCcnKQogICAgICAgICAgICAgICAgc2VsZi5uYW1lID0gaW5mb1snbm0nXQogICAgICAgICAgICAgICAgIyBSZWluc3RhdGUgdGhlIGxvY2FsIHZlcnNpb24gc2VwYXJhdG9yCiAgICAgICAgICAgICAgICBzZWxmLnZlcnNpb24gPSBpbmZvWyd2biddLnJlcGxhY2UoJ18nLCAnLScpCiAgICAgICAgICAgICAgICBzZWxmLmJ1aWxkdmVyID0gaW5mb1snYm4nXQogICAgICAgICAgICAgICAgc2VsZi5fZmlsZW5hbWUgPSBzZWxmLmZpbGVuYW1lCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBkaXJuYW1lLCBmaWxlbmFtZSA9IG9zLnBhdGguc3BsaXQoZmlsZW5hbWUpCiAgICAgICAgICAgICAgICBtID0gRklMRU5BTUVfUkUubWF0Y2goZmlsZW5hbWUpCiAgICAgICAgICAgICAgICBpZiBub3QgbToKICAgICAgICAgICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdJbnZhbGlkIG5hbWUgb3IgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZpbGVuYW1lOiAlcicgJSBmaWxlbmFtZSkKICAgICAgICAgICAgICAgIGlmIGRpcm5hbWU6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5kaXJuYW1lID0gb3MucGF0aC5hYnNwYXRoKGRpcm5hbWUpCiAgICAgICAgICAgICAgICBzZWxmLl9maWxlbmFtZSA9IGZpbGVuYW1lCiAgICAgICAgICAgICAgICBpbmZvID0gbS5ncm91cGRpY3QoJycpCiAgICAgICAgICAgICAgICBzZWxmLm5hbWUgPSBpbmZvWydubSddCiAgICAgICAgICAgICAgICBzZWxmLnZlcnNpb24gPSBpbmZvWyd2biddCiAgICAgICAgICAgICAgICBzZWxmLmJ1aWxkdmVyID0gaW5mb1snYm4nXQogICAgICAgICAgICAgICAgc2VsZi5weXZlciA9IGluZm9bJ3B5J10uc3BsaXQoJy4nKQogICAgICAgICAgICAgICAgc2VsZi5hYmkgPSBpbmZvWydiaSddLnNwbGl0KCcuJykKICAgICAgICAgICAgICAgIHNlbGYuYXJjaCA9IGluZm9bJ2FyJ10uc3BsaXQoJy4nKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGZpbGVuYW1lKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEJ1aWxkIGFuZCByZXR1cm4gYSBmaWxlbmFtZSBmcm9tIHRoZSB2YXJpb3VzIGNvbXBvbmVudHMuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5idWlsZHZlcjoKICAgICAgICAgICAgYnVpbGR2ZXIgPSAnLScgKyBzZWxmLmJ1aWxkdmVyCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYnVpbGR2ZXIgPSAnJwogICAgICAgIHB5dmVyID0gJy4nLmpvaW4oc2VsZi5weXZlcikKICAgICAgICBhYmkgPSAnLicuam9pbihzZWxmLmFiaSkKICAgICAgICBhcmNoID0gJy4nLmpvaW4oc2VsZi5hcmNoKQogICAgICAgICMgcmVwbGFjZSAtIHdpdGggXyBhcyBhIGxvY2FsIHZlcnNpb24gc2VwYXJhdG9yCiAgICAgICAgdmVyc2lvbiA9IHNlbGYudmVyc2lvbi5yZXBsYWNlKCctJywgJ18nKQogICAgICAgIHJldHVybiAnJXMtJXMlcy0lcy0lcy0lcy53aGwnICUgKHNlbGYubmFtZSwgdmVyc2lvbiwgYnVpbGR2ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHl2ZXIsIGFiaSwgYXJjaCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBleGlzdHMoc2VsZik6CiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLmRpcm5hbWUsIHNlbGYuZmlsZW5hbWUpCiAgICAgICAgcmV0dXJuIG9zLnBhdGguaXNmaWxlKHBhdGgpCgogICAgQHByb3BlcnR5CiAgICBkZWYgdGFncyhzZWxmKToKICAgICAgICBmb3IgcHl2ZXIgaW4gc2VsZi5weXZlcjoKICAgICAgICAgICAgZm9yIGFiaSBpbiBzZWxmLmFiaToKICAgICAgICAgICAgICAgIGZvciBhcmNoIGluIHNlbGYuYXJjaDoKICAgICAgICAgICAgICAgICAgICB5aWVsZCBweXZlciwgYWJpLCBhcmNoCgogICAgQGNhY2hlZF9wcm9wZXJ0eQogICAgZGVmIG1ldGFkYXRhKHNlbGYpOgogICAgICAgIHBhdGhuYW1lID0gb3MucGF0aC5qb2luKHNlbGYuZGlybmFtZSwgc2VsZi5maWxlbmFtZSkKICAgICAgICBuYW1lX3ZlciA9ICclcy0lcycgJSAoc2VsZi5uYW1lLCBzZWxmLnZlcnNpb24pCiAgICAgICAgaW5mb19kaXIgPSAnJXMuZGlzdC1pbmZvJyAlIG5hbWVfdmVyCiAgICAgICAgd3JhcHBlciA9IGNvZGVjcy5nZXRyZWFkZXIoJ3V0Zi04JykKICAgICAgICB3aXRoIFppcEZpbGUocGF0aG5hbWUsICdyJykgYXMgemY6CiAgICAgICAgICAgIHdoZWVsX21ldGFkYXRhID0gc2VsZi5nZXRfd2hlZWxfbWV0YWRhdGEoemYpCiAgICAgICAgICAgIHd2ID0gd2hlZWxfbWV0YWRhdGFbJ1doZWVsLVZlcnNpb24nXS5zcGxpdCgnLicsIDEpCiAgICAgICAgICAgIGZpbGVfdmVyc2lvbiA9IHR1cGxlKFtpbnQoaSkgZm9yIGkgaW4gd3ZdKQogICAgICAgICAgICBpZiBmaWxlX3ZlcnNpb24gPCAoMSwgMSk6CiAgICAgICAgICAgICAgICBmbiA9ICdNRVRBREFUQScKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGZuID0gTUVUQURBVEFfRklMRU5BTUUKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgbWV0YWRhdGFfZmlsZW5hbWUgPSBwb3NpeHBhdGguam9pbihpbmZvX2RpciwgZm4pCiAgICAgICAgICAgICAgICB3aXRoIHpmLm9wZW4obWV0YWRhdGFfZmlsZW5hbWUpIGFzIGJmOgogICAgICAgICAgICAgICAgICAgIHdmID0gd3JhcHBlcihiZikKICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBNZXRhZGF0YShmaWxlb2JqPXdmKQogICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdJbnZhbGlkIHdoZWVsLCBiZWNhdXNlICVzIGlzICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21pc3NpbmcnICUgZm4pCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBnZXRfd2hlZWxfbWV0YWRhdGEoc2VsZiwgemYpOgogICAgICAgIG5hbWVfdmVyID0gJyVzLSVzJyAlIChzZWxmLm5hbWUsIHNlbGYudmVyc2lvbikKICAgICAgICBpbmZvX2RpciA9ICclcy5kaXN0LWluZm8nICUgbmFtZV92ZXIKICAgICAgICBtZXRhZGF0YV9maWxlbmFtZSA9IHBvc2l4cGF0aC5qb2luKGluZm9fZGlyLCAnV0hFRUwnKQogICAgICAgIHdpdGggemYub3BlbihtZXRhZGF0YV9maWxlbmFtZSkgYXMgYmY6CiAgICAgICAgICAgIHdmID0gY29kZWNzLmdldHJlYWRlcigndXRmLTgnKShiZikKICAgICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2VfZnJvbV9maWxlKHdmKQogICAgICAgIHJldHVybiBkaWN0KG1lc3NhZ2UpCgogICAgQGNhY2hlZF9wcm9wZXJ0eQogICAgZGVmIGluZm8oc2VsZik6CiAgICAgICAgcGF0aG5hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5kaXJuYW1lLCBzZWxmLmZpbGVuYW1lKQogICAgICAgIHdpdGggWmlwRmlsZShwYXRobmFtZSwgJ3InKSBhcyB6ZjoKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5nZXRfd2hlZWxfbWV0YWRhdGEoemYpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBwcm9jZXNzX3NoZWJhbmcoc2VsZiwgZGF0YSk6CiAgICAgICAgbSA9IFNIRUJBTkdfUkUubWF0Y2goZGF0YSkKICAgICAgICBpZiBtOgogICAgICAgICAgICBlbmQgPSBtLmVuZCgpCiAgICAgICAgICAgIHNoZWJhbmcsIGRhdGFfYWZ0ZXJfc2hlYmFuZyA9IGRhdGFbOmVuZF0sIGRhdGFbZW5kOl0KICAgICAgICAgICAgIyBQcmVzZXJ2ZSBhbnkgYXJndW1lbnRzIGFmdGVyIHRoZSBpbnRlcnByZXRlcgogICAgICAgICAgICBpZiBiJ3B5dGhvbncnIGluIHNoZWJhbmcubG93ZXIoKToKICAgICAgICAgICAgICAgIHNoZWJhbmdfcHl0aG9uID0gU0hFQkFOR19QWVRIT05XCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzaGViYW5nX3B5dGhvbiA9IFNIRUJBTkdfUFlUSE9OCiAgICAgICAgICAgIG0gPSBTSEVCQU5HX0RFVEFJTF9SRS5tYXRjaChzaGViYW5nKQogICAgICAgICAgICBpZiBtOgogICAgICAgICAgICAgICAgYXJncyA9IGInICcgKyBtLmdyb3VwcygpWy0xXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYXJncyA9IGInJwogICAgICAgICAgICBzaGViYW5nID0gc2hlYmFuZ19weXRob24gKyBhcmdzCiAgICAgICAgICAgIGRhdGEgPSBzaGViYW5nICsgZGF0YV9hZnRlcl9zaGViYW5nCiAgICAgICAgZWxzZToKICAgICAgICAgICAgY3IgPSBkYXRhLmZpbmQoYidccicpCiAgICAgICAgICAgIGxmID0gZGF0YS5maW5kKGInXG4nKQogICAgICAgICAgICBpZiBjciA8IDAgb3IgY3IgPiBsZjoKICAgICAgICAgICAgICAgIHRlcm0gPSBiJ1xuJwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaWYgZGF0YVtjcjpjciArIDJdID09IGInXHJcbic6CiAgICAgICAgICAgICAgICAgICAgdGVybSA9IGInXHJcbicKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgdGVybSA9IGInXHInCiAgICAgICAgICAgIGRhdGEgPSBTSEVCQU5HX1BZVEhPTiArIHRlcm0gKyBkYXRhCiAgICAgICAgcmV0dXJuIGRhdGEKCiAgICBkZWYgZ2V0X2hhc2goc2VsZiwgZGF0YSwgaGFzaF9raW5kPU5vbmUpOgogICAgICAgIGlmIGhhc2hfa2luZCBpcyBOb25lOgogICAgICAgICAgICBoYXNoX2tpbmQgPSBzZWxmLmhhc2hfa2luZAogICAgICAgIHRyeToKICAgICAgICAgICAgaGFzaGVyID0gZ2V0YXR0cihoYXNobGliLCBoYXNoX2tpbmQpCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdVbnN1cHBvcnRlZCBoYXNoIGFsZ29yaXRobTogJXInICUgaGFzaF9raW5kKQogICAgICAgIHJlc3VsdCA9IGhhc2hlcihkYXRhKS5kaWdlc3QoKQogICAgICAgIHJlc3VsdCA9IGJhc2U2NC51cmxzYWZlX2I2NGVuY29kZShyZXN1bHQpLnJzdHJpcChiJz0nKS5kZWNvZGUoJ2FzY2lpJykKICAgICAgICByZXR1cm4gaGFzaF9raW5kLCByZXN1bHQKCiAgICBkZWYgd3JpdGVfcmVjb3JkKHNlbGYsIHJlY29yZHMsIHJlY29yZF9wYXRoLCBiYXNlKToKICAgICAgICByZWNvcmRzID0gbGlzdChyZWNvcmRzKSAjIG1ha2UgYSBjb3B5IGZvciBzb3J0aW5nCiAgICAgICAgcCA9IHRvX3Bvc2l4KG9zLnBhdGgucmVscGF0aChyZWNvcmRfcGF0aCwgYmFzZSkpCiAgICAgICAgcmVjb3Jkcy5hcHBlbmQoKHAsICcnLCAnJykpCiAgICAgICAgcmVjb3Jkcy5zb3J0KCkKICAgICAgICB3aXRoIENTVldyaXRlcihyZWNvcmRfcGF0aCkgYXMgd3JpdGVyOgogICAgICAgICAgICBmb3Igcm93IGluIHJlY29yZHM6CiAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVyb3cocm93KQoKICAgIGRlZiB3cml0ZV9yZWNvcmRzKHNlbGYsIGluZm8sIGxpYmRpciwgYXJjaGl2ZV9wYXRocyk6CiAgICAgICAgcmVjb3JkcyA9IFtdCiAgICAgICAgZGlzdGluZm8sIGluZm9fZGlyID0gaW5mbwogICAgICAgIGhhc2hlciA9IGdldGF0dHIoaGFzaGxpYiwgc2VsZi5oYXNoX2tpbmQpCiAgICAgICAgZm9yIGFwLCBwIGluIGFyY2hpdmVfcGF0aHM6CiAgICAgICAgICAgIHdpdGggb3BlbihwLCAncmInKSBhcyBmOgogICAgICAgICAgICAgICAgZGF0YSA9IGYucmVhZCgpCiAgICAgICAgICAgIGRpZ2VzdCA9ICclcz0lcycgJSBzZWxmLmdldF9oYXNoKGRhdGEpCiAgICAgICAgICAgIHNpemUgPSBvcy5wYXRoLmdldHNpemUocCkKICAgICAgICAgICAgcmVjb3Jkcy5hcHBlbmQoKGFwLCBkaWdlc3QsIHNpemUpKQoKICAgICAgICBwID0gb3MucGF0aC5qb2luKGRpc3RpbmZvLCAnUkVDT1JEJykKICAgICAgICBzZWxmLndyaXRlX3JlY29yZChyZWNvcmRzLCBwLCBsaWJkaXIpCiAgICAgICAgYXAgPSB0b19wb3NpeChvcy5wYXRoLmpvaW4oaW5mb19kaXIsICdSRUNPUkQnKSkKICAgICAgICBhcmNoaXZlX3BhdGhzLmFwcGVuZCgoYXAsIHApKQoKICAgIGRlZiBidWlsZF96aXAoc2VsZiwgcGF0aG5hbWUsIGFyY2hpdmVfcGF0aHMpOgogICAgICAgIHdpdGggWmlwRmlsZShwYXRobmFtZSwgJ3cnLCB6aXBmaWxlLlpJUF9ERUZMQVRFRCkgYXMgemY6CiAgICAgICAgICAgIGZvciBhcCwgcCBpbiBhcmNoaXZlX3BhdGhzOgogICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdXcm90ZSAlcyB0byAlcyBpbiB3aGVlbCcsIHAsIGFwKQogICAgICAgICAgICAgICAgemYud3JpdGUocCwgYXApCgogICAgZGVmIGJ1aWxkKHNlbGYsIHBhdGhzLCB0YWdzPU5vbmUsIHdoZWVsX3ZlcnNpb249Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgQnVpbGQgYSB3aGVlbCBmcm9tIGZpbGVzIGluIHNwZWNpZmllZCBwYXRocywgYW5kIHVzZSBhbnkgc3BlY2lmaWVkIHRhZ3MKICAgICAgICB3aGVuIGRldGVybWluaW5nIHRoZSBuYW1lIG9mIHRoZSB3aGVlbC4KICAgICAgICAiIiIKICAgICAgICBpZiB0YWdzIGlzIE5vbmU6CiAgICAgICAgICAgIHRhZ3MgPSB7fQoKICAgICAgICBsaWJrZXkgPSBsaXN0KGZpbHRlcihsYW1iZGEgbzogbyBpbiBwYXRocywgKCdwdXJlbGliJywgJ3BsYXRsaWInKSkpWzBdCiAgICAgICAgaWYgbGlia2V5ID09ICdwbGF0bGliJzoKICAgICAgICAgICAgaXNfcHVyZSA9ICdmYWxzZScKICAgICAgICAgICAgZGVmYXVsdF9weXZlciA9IFtJTVBWRVJdCiAgICAgICAgICAgIGRlZmF1bHRfYWJpID0gW0FCSV0KICAgICAgICAgICAgZGVmYXVsdF9hcmNoID0gW0FSQ0hdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaXNfcHVyZSA9ICd0cnVlJwogICAgICAgICAgICBkZWZhdWx0X3B5dmVyID0gW1BZVkVSXQogICAgICAgICAgICBkZWZhdWx0X2FiaSA9IFsnbm9uZSddCiAgICAgICAgICAgIGRlZmF1bHRfYXJjaCA9IFsnYW55J10KCiAgICAgICAgc2VsZi5weXZlciA9IHRhZ3MuZ2V0KCdweXZlcicsIGRlZmF1bHRfcHl2ZXIpCiAgICAgICAgc2VsZi5hYmkgPSB0YWdzLmdldCgnYWJpJywgZGVmYXVsdF9hYmkpCiAgICAgICAgc2VsZi5hcmNoID0gdGFncy5nZXQoJ2FyY2gnLCBkZWZhdWx0X2FyY2gpCgogICAgICAgIGxpYmRpciA9IHBhdGhzW2xpYmtleV0KCiAgICAgICAgbmFtZV92ZXIgPSAnJXMtJXMnICUgKHNlbGYubmFtZSwgc2VsZi52ZXJzaW9uKQogICAgICAgIGRhdGFfZGlyID0gJyVzLmRhdGEnICUgbmFtZV92ZXIKICAgICAgICBpbmZvX2RpciA9ICclcy5kaXN0LWluZm8nICUgbmFtZV92ZXIKCiAgICAgICAgYXJjaGl2ZV9wYXRocyA9IFtdCgogICAgICAgICMgRmlyc3QsIHN0dWZmIHdoaWNoIGlzIG5vdCBpbiBzaXRlLXBhY2thZ2VzCiAgICAgICAgZm9yIGtleSBpbiAoJ2RhdGEnLCAnaGVhZGVycycsICdzY3JpcHRzJyk6CiAgICAgICAgICAgIGlmIGtleSBub3QgaW4gcGF0aHM6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBwYXRoID0gcGF0aHNba2V5XQogICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKHBhdGgpOgogICAgICAgICAgICAgICAgZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsocGF0aCk6CiAgICAgICAgICAgICAgICAgICAgZm9yIGZuIGluIGZpbGVzOgogICAgICAgICAgICAgICAgICAgICAgICBwID0gZnNkZWNvZGUob3MucGF0aC5qb2luKHJvb3QsIGZuKSkKICAgICAgICAgICAgICAgICAgICAgICAgcnAgPSBvcy5wYXRoLnJlbHBhdGgocCwgcGF0aCkKICAgICAgICAgICAgICAgICAgICAgICAgYXAgPSB0b19wb3NpeChvcy5wYXRoLmpvaW4oZGF0YV9kaXIsIGtleSwgcnApKQogICAgICAgICAgICAgICAgICAgICAgICBhcmNoaXZlX3BhdGhzLmFwcGVuZCgoYXAsIHApKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBrZXkgPT0gJ3NjcmlwdHMnIGFuZCBub3QgcC5lbmRzd2l0aCgnLmV4ZScpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBvcGVuKHAsICdyYicpIGFzIGY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGYucmVhZCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gc2VsZi5wcm9jZXNzX3NoZWJhbmcoZGF0YSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggb3BlbihwLCAnd2InKSBhcyBmOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYud3JpdGUoZGF0YSkKCiAgICAgICAgIyBOb3csIHN0dWZmIHdoaWNoIGlzIGluIHNpdGUtcGFja2FnZXMsIG90aGVyIHRoYW4gdGhlCiAgICAgICAgIyBkaXN0aW5mbyBzdHVmZi4KICAgICAgICBwYXRoID0gbGliZGlyCiAgICAgICAgZGlzdGluZm8gPSBOb25lCiAgICAgICAgZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsocGF0aCk6CiAgICAgICAgICAgIGlmIHJvb3QgPT0gcGF0aDoKICAgICAgICAgICAgICAgICMgQXQgdGhlIHRvcCBsZXZlbCBvbmx5LCBzYXZlIGRpc3RpbmZvIGZvciBsYXRlcgogICAgICAgICAgICAgICAgIyBhbmQgc2tpcCBpdCBmb3Igbm93CiAgICAgICAgICAgICAgICBmb3IgaSwgZG4gaW4gZW51bWVyYXRlKGRpcnMpOgogICAgICAgICAgICAgICAgICAgIGRuID0gZnNkZWNvZGUoZG4pCiAgICAgICAgICAgICAgICAgICAgaWYgZG4uZW5kc3dpdGgoJy5kaXN0LWluZm8nKToKICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGluZm8gPSBvcy5wYXRoLmpvaW4ocm9vdCwgZG4pCiAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBkaXJzW2ldCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBhc3NlcnQgZGlzdGluZm8sICcuZGlzdC1pbmZvIGRpcmVjdG9yeSBleHBlY3RlZCwgbm90IGZvdW5kJwoKICAgICAgICAgICAgZm9yIGZuIGluIGZpbGVzOgogICAgICAgICAgICAgICAgIyBjb21tZW50IG91dCBuZXh0IHN1aXRlIHRvIGxlYXZlIC5weWMgZmlsZXMgaW4KICAgICAgICAgICAgICAgIGlmIGZzZGVjb2RlKGZuKS5lbmRzd2l0aCgoJy5weWMnLCAnLnB5bycpKToKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgcCA9IG9zLnBhdGguam9pbihyb290LCBmbikKICAgICAgICAgICAgICAgIHJwID0gdG9fcG9zaXgob3MucGF0aC5yZWxwYXRoKHAsIHBhdGgpKQogICAgICAgICAgICAgICAgYXJjaGl2ZV9wYXRocy5hcHBlbmQoKHJwLCBwKSkKCiAgICAgICAgIyBOb3cgZGlzdGluZm8uIEFzc3VtZWQgdG8gYmUgZmxhdCwgaS5lLiBvcy5saXN0ZGlyIGlzIGVub3VnaC4KICAgICAgICBmaWxlcyA9IG9zLmxpc3RkaXIoZGlzdGluZm8pCiAgICAgICAgZm9yIGZuIGluIGZpbGVzOgogICAgICAgICAgICBpZiBmbiBub3QgaW4gKCdSRUNPUkQnLCAnSU5TVEFMTEVSJywgJ1NIQVJFRCcsICdXSEVFTCcpOgogICAgICAgICAgICAgICAgcCA9IGZzZGVjb2RlKG9zLnBhdGguam9pbihkaXN0aW5mbywgZm4pKQogICAgICAgICAgICAgICAgYXAgPSB0b19wb3NpeChvcy5wYXRoLmpvaW4oaW5mb19kaXIsIGZuKSkKICAgICAgICAgICAgICAgIGFyY2hpdmVfcGF0aHMuYXBwZW5kKChhcCwgcCkpCgogICAgICAgIHdoZWVsX21ldGFkYXRhID0gWwogICAgICAgICAgICAnV2hlZWwtVmVyc2lvbjogJWQuJWQnICUgKHdoZWVsX3ZlcnNpb24gb3Igc2VsZi53aGVlbF92ZXJzaW9uKSwKICAgICAgICAgICAgJ0dlbmVyYXRvcjogZGlzdGxpYiAlcycgJSBfX3ZlcnNpb25fXywKICAgICAgICAgICAgJ1Jvb3QtSXMtUHVyZWxpYjogJXMnICUgaXNfcHVyZSwKICAgICAgICBdCiAgICAgICAgZm9yIHB5dmVyLCBhYmksIGFyY2ggaW4gc2VsZi50YWdzOgogICAgICAgICAgICB3aGVlbF9tZXRhZGF0YS5hcHBlbmQoJ1RhZzogJXMtJXMtJXMnICUgKHB5dmVyLCBhYmksIGFyY2gpKQogICAgICAgIHAgPSBvcy5wYXRoLmpvaW4oZGlzdGluZm8sICdXSEVFTCcpCiAgICAgICAgd2l0aCBvcGVuKHAsICd3JykgYXMgZjoKICAgICAgICAgICAgZi53cml0ZSgnXG4nLmpvaW4od2hlZWxfbWV0YWRhdGEpKQogICAgICAgIGFwID0gdG9fcG9zaXgob3MucGF0aC5qb2luKGluZm9fZGlyLCAnV0hFRUwnKSkKICAgICAgICBhcmNoaXZlX3BhdGhzLmFwcGVuZCgoYXAsIHApKQoKICAgICAgICAjIE5vdywgYXQgbGFzdCwgUkVDT1JELgogICAgICAgICMgUGF0aHMgaW4gaGVyZSBhcmUgYXJjaGl2ZSBwYXRocyAtIG5vdGhpbmcgZWxzZSBtYWtlcyBzZW5zZS4KICAgICAgICBzZWxmLndyaXRlX3JlY29yZHMoKGRpc3RpbmZvLCBpbmZvX2RpciksIGxpYmRpciwgYXJjaGl2ZV9wYXRocykKICAgICAgICAjIE5vdywgcmVhZHkgdG8gYnVpbGQgdGhlIHppcCBmaWxlCiAgICAgICAgcGF0aG5hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5kaXJuYW1lLCBzZWxmLmZpbGVuYW1lKQogICAgICAgIHNlbGYuYnVpbGRfemlwKHBhdGhuYW1lLCBhcmNoaXZlX3BhdGhzKQogICAgICAgIHJldHVybiBwYXRobmFtZQoKICAgIGRlZiBpbnN0YWxsKHNlbGYsIHBhdGhzLCBtYWtlciwgKiprd2FyZ3MpOgogICAgICAgICIiIgogICAgICAgIEluc3RhbGwgYSB3aGVlbCB0byB0aGUgc3BlY2lmaWVkIHBhdGhzLiBJZiBrd2FyZyBgYHdhcm5lcmBgIGlzCiAgICAgICAgc3BlY2lmaWVkLCBpdCBzaG91bGQgYmUgYSBjYWxsYWJsZSwgd2hpY2ggd2lsbCBiZSBjYWxsZWQgd2l0aCB0d28KICAgICAgICB0dXBsZXMgaW5kaWNhdGluZyB0aGUgd2hlZWwgdmVyc2lvbiBvZiB0aGlzIHNvZnR3YXJlIGFuZCB0aGUgd2hlZWwKICAgICAgICB2ZXJzaW9uIGluIHRoZSBmaWxlLCBpZiB0aGVyZSBpcyBhIGRpc2NyZXBhbmN5IGluIHRoZSB2ZXJzaW9ucy4KICAgICAgICBUaGlzIGNhbiBiZSB1c2VkIHRvIGlzc3VlIGFueSB3YXJuaW5ncyB0byByYWlzZSBhbnkgZXhjZXB0aW9ucy4KICAgICAgICBJZiBrd2FyZyBgYGxpYl9vbmx5YGAgaXMgVHJ1ZSwgb25seSB0aGUgcHVyZWxpYi9wbGF0bGliIGZpbGVzIGFyZQogICAgICAgIGluc3RhbGxlZCwgYW5kIHRoZSBoZWFkZXJzLCBzY3JpcHRzLCBkYXRhIGFuZCBkaXN0LWluZm8gbWV0YWRhdGEgYXJlCiAgICAgICAgbm90IHdyaXR0ZW4uCgogICAgICAgIFRoZSByZXR1cm4gdmFsdWUgaXMgYSA6Y2xhc3M6YEluc3RhbGxlZERpc3RyaWJ1dGlvbmAgaW5zdGFuY2UgdW5sZXNzCiAgICAgICAgYGBvcHRpb25zLmxpYl9vbmx5YGAgaXMgVHJ1ZSwgaW4gd2hpY2ggY2FzZSB0aGUgcmV0dXJuIHZhbHVlIGlzIGBgTm9uZWBgLgogICAgICAgICIiIgoKICAgICAgICBkcnlfcnVuID0gbWFrZXIuZHJ5X3J1bgogICAgICAgIHdhcm5lciA9IGt3YXJncy5nZXQoJ3dhcm5lcicpCiAgICAgICAgbGliX29ubHkgPSBrd2FyZ3MuZ2V0KCdsaWJfb25seScsIEZhbHNlKQoKICAgICAgICBwYXRobmFtZSA9IG9zLnBhdGguam9pbihzZWxmLmRpcm5hbWUsIHNlbGYuZmlsZW5hbWUpCiAgICAgICAgbmFtZV92ZXIgPSAnJXMtJXMnICUgKHNlbGYubmFtZSwgc2VsZi52ZXJzaW9uKQogICAgICAgIGRhdGFfZGlyID0gJyVzLmRhdGEnICUgbmFtZV92ZXIKICAgICAgICBpbmZvX2RpciA9ICclcy5kaXN0LWluZm8nICUgbmFtZV92ZXIKCiAgICAgICAgbWV0YWRhdGFfbmFtZSA9IHBvc2l4cGF0aC5qb2luKGluZm9fZGlyLCBNRVRBREFUQV9GSUxFTkFNRSkKICAgICAgICB3aGVlbF9tZXRhZGF0YV9uYW1lID0gcG9zaXhwYXRoLmpvaW4oaW5mb19kaXIsICdXSEVFTCcpCiAgICAgICAgcmVjb3JkX25hbWUgPSBwb3NpeHBhdGguam9pbihpbmZvX2RpciwgJ1JFQ09SRCcpCgogICAgICAgIHdyYXBwZXIgPSBjb2RlY3MuZ2V0cmVhZGVyKCd1dGYtOCcpCgogICAgICAgIHdpdGggWmlwRmlsZShwYXRobmFtZSwgJ3InKSBhcyB6ZjoKICAgICAgICAgICAgd2l0aCB6Zi5vcGVuKHdoZWVsX21ldGFkYXRhX25hbWUpIGFzIGJ3ZjoKICAgICAgICAgICAgICAgIHdmID0gd3JhcHBlcihid2YpCiAgICAgICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZV9mcm9tX2ZpbGUod2YpCiAgICAgICAgICAgIHd2ID0gbWVzc2FnZVsnV2hlZWwtVmVyc2lvbiddLnNwbGl0KCcuJywgMSkKICAgICAgICAgICAgZmlsZV92ZXJzaW9uID0gdHVwbGUoW2ludChpKSBmb3IgaSBpbiB3dl0pCiAgICAgICAgICAgIGlmIChmaWxlX3ZlcnNpb24gIT0gc2VsZi53aGVlbF92ZXJzaW9uKSBhbmQgd2FybmVyOgogICAgICAgICAgICAgICAgd2FybmVyKHNlbGYud2hlZWxfdmVyc2lvbiwgZmlsZV92ZXJzaW9uKQoKICAgICAgICAgICAgaWYgbWVzc2FnZVsnUm9vdC1Jcy1QdXJlbGliJ10gPT0gJ3RydWUnOgogICAgICAgICAgICAgICAgbGliZGlyID0gcGF0aHNbJ3B1cmVsaWInXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbGliZGlyID0gcGF0aHNbJ3BsYXRsaWInXQoKICAgICAgICAgICAgcmVjb3JkcyA9IHt9CiAgICAgICAgICAgIHdpdGggemYub3BlbihyZWNvcmRfbmFtZSkgYXMgYmY6CiAgICAgICAgICAgICAgICB3aXRoIENTVlJlYWRlcihzdHJlYW09YmYpIGFzIHJlYWRlcjoKICAgICAgICAgICAgICAgICAgICBmb3Igcm93IGluIHJlYWRlcjoKICAgICAgICAgICAgICAgICAgICAgICAgcCA9IHJvd1swXQogICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRzW3BdID0gcm93CgogICAgICAgICAgICBkYXRhX3BmeCA9IHBvc2l4cGF0aC5qb2luKGRhdGFfZGlyLCAnJykKICAgICAgICAgICAgaW5mb19wZnggPSBwb3NpeHBhdGguam9pbihpbmZvX2RpciwgJycpCiAgICAgICAgICAgIHNjcmlwdF9wZnggPSBwb3NpeHBhdGguam9pbihkYXRhX2RpciwgJ3NjcmlwdHMnLCAnJykKCiAgICAgICAgICAgICMgbWFrZSBhIG5ldyBpbnN0YW5jZSByYXRoZXIgdGhhbiBhIGNvcHkgb2YgbWFrZXIncywKICAgICAgICAgICAgIyBhcyB3ZSBtdXRhdGUgaXQKICAgICAgICAgICAgZmlsZW9wID0gRmlsZU9wZXJhdG9yKGRyeV9ydW49ZHJ5X3J1bikKICAgICAgICAgICAgZmlsZW9wLnJlY29yZCA9IFRydWUgICAgIyBzbyB3ZSBjYW4gcm9sbGJhY2sgaWYgbmVlZGVkCgogICAgICAgICAgICBiYyA9IG5vdCBzeXMuZG9udF93cml0ZV9ieXRlY29kZSAgICAjIERvdWJsZSBuZWdhdGl2ZXMuIExvdmVseSEKCiAgICAgICAgICAgIG91dGZpbGVzID0gW10gICAjIGZvciBSRUNPUkQgd3JpdGluZwoKICAgICAgICAgICAgIyBmb3Igc2NyaXB0IGNvcHlpbmcvc2hlYmFuZyBwcm9jZXNzaW5nCiAgICAgICAgICAgIHdvcmtkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKICAgICAgICAgICAgIyBzZXQgdGFyZ2V0IGRpciBsYXRlcgogICAgICAgICAgICAjIHdlIGRlZmF1bHQgYWRkX2xhdW5jaGVycyB0byBGYWxzZSwgYXMgdGhlCiAgICAgICAgICAgICMgUHl0aG9uIExhdW5jaGVyIHNob3VsZCBiZSB1c2VkIGluc3RlYWQKICAgICAgICAgICAgbWFrZXIuc291cmNlX2RpciA9IHdvcmtkaXIKICAgICAgICAgICAgbWFrZXIudGFyZ2V0X2RpciA9IE5vbmUKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZm9yIHppbmZvIGluIHpmLmluZm9saXN0KCk6CiAgICAgICAgICAgICAgICAgICAgYXJjbmFtZSA9IHppbmZvLmZpbGVuYW1lCiAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShhcmNuYW1lLCB0ZXh0X3R5cGUpOgogICAgICAgICAgICAgICAgICAgICAgICB1X2FyY25hbWUgPSBhcmNuYW1lCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgdV9hcmNuYW1lID0gYXJjbmFtZS5kZWNvZGUoJ3V0Zi04JykKICAgICAgICAgICAgICAgICAgICAjIFRoZSBzaWduYXR1cmUgZmlsZSB3b24ndCBiZSBpbiBSRUNPUkQsCiAgICAgICAgICAgICAgICAgICAgIyBhbmQgd2UgIGRvbid0IGN1cnJlbnRseSBkb24ndCBkbyBhbnl0aGluZyB3aXRoIGl0CiAgICAgICAgICAgICAgICAgICAgaWYgdV9hcmNuYW1lLmVuZHN3aXRoKCcvUkVDT1JELmp3cycpOgogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgIHJvdyA9IHJlY29yZHNbdV9hcmNuYW1lXQogICAgICAgICAgICAgICAgICAgIGlmIHJvd1syXSBhbmQgc3RyKHppbmZvLmZpbGVfc2l6ZSkgIT0gcm93WzJdOgogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdzaXplIG1pc21hdGNoIGZvciAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVzJyAlIHVfYXJjbmFtZSkKICAgICAgICAgICAgICAgICAgICBpZiByb3dbMV06CiAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQsIHZhbHVlID0gcm93WzFdLnNwbGl0KCc9JywgMSkKICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB6Zi5vcGVuKGFyY25hbWUpIGFzIGJmOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGJmLnJlYWQoKQogICAgICAgICAgICAgICAgICAgICAgICBfLCBkaWdlc3QgPSBzZWxmLmdldF9oYXNoKGRhdGEsIGtpbmQpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGRpZ2VzdCAhPSB2YWx1ZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ2RpZ2VzdCBtaXNtYXRjaCBmb3IgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXMnICUgYXJjbmFtZSkKCiAgICAgICAgICAgICAgICAgICAgaWYgbGliX29ubHkgYW5kIHVfYXJjbmFtZS5zdGFydHN3aXRoKChpbmZvX3BmeCwgZGF0YV9wZngpKToKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdsaWJfb25seTogc2tpcHBpbmcgJXMnLCB1X2FyY25hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgaXNfc2NyaXB0ID0gKHVfYXJjbmFtZS5zdGFydHN3aXRoKHNjcmlwdF9wZngpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBub3QgdV9hcmNuYW1lLmVuZHN3aXRoKCcuZXhlJykpCgogICAgICAgICAgICAgICAgICAgIGlmIHVfYXJjbmFtZS5zdGFydHN3aXRoKGRhdGFfcGZ4KToKICAgICAgICAgICAgICAgICAgICAgICAgXywgd2hlcmUsIHJwID0gdV9hcmNuYW1lLnNwbGl0KCcvJywgMikKICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZmlsZSA9IG9zLnBhdGguam9pbihwYXRoc1t3aGVyZV0sIGNvbnZlcnRfcGF0aChycCkpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgIyBtZWFudCBmb3Igc2l0ZS1wYWNrYWdlcy4KICAgICAgICAgICAgICAgICAgICAgICAgaWYgdV9hcmNuYW1lIGluICh3aGVlbF9tZXRhZGF0YV9uYW1lLCByZWNvcmRfbmFtZSk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgICAgICBvdXRmaWxlID0gb3MucGF0aC5qb2luKGxpYmRpciwgY29udmVydF9wYXRoKHVfYXJjbmFtZSkpCiAgICAgICAgICAgICAgICAgICAgaWYgbm90IGlzX3NjcmlwdDoKICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB6Zi5vcGVuKGFyY25hbWUpIGFzIGJmOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW9wLmNvcHlfc3RyZWFtKGJmLCBvdXRmaWxlKQogICAgICAgICAgICAgICAgICAgICAgICBvdXRmaWxlcy5hcHBlbmQob3V0ZmlsZSkKICAgICAgICAgICAgICAgICAgICAgICAgIyBEb3VibGUgY2hlY2sgdGhlIGRpZ2VzdCBvZiB0aGUgd3JpdHRlbiBmaWxlCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBkcnlfcnVuIGFuZCByb3dbMV06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIG9wZW4ob3V0ZmlsZSwgJ3JiJykgYXMgYmY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGJmLnJlYWQoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8sIG5ld2RpZ2VzdCA9IHNlbGYuZ2V0X2hhc2goZGF0YSwga2luZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBuZXdkaWdlc3QgIT0gZGlnZXN0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdkaWdlc3QgbWlzbWF0Y2ggJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvbiB3cml0ZSBmb3IgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclcycgJSBvdXRmaWxlKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBiYyBhbmQgb3V0ZmlsZS5lbmRzd2l0aCgnLnB5Jyk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHljID0gZmlsZW9wLmJ5dGVfY29tcGlsZShvdXRmaWxlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGZpbGVzLmFwcGVuZChweWMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgRG9uJ3QgZ2l2ZSB1cCBpZiBieXRlLWNvbXBpbGF0aW9uIGZhaWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYnV0IGxvZyBpdCBhbmQgcGVyaGFwcyB3YXJuIHRoZSB1c2VyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ0J5dGUtY29tcGlsYXRpb24gZmFpbGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNfaW5mbz1UcnVlKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGZuID0gb3MucGF0aC5iYXNlbmFtZShjb252ZXJ0X3BhdGgoYXJjbmFtZSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtuYW1lID0gb3MucGF0aC5qb2luKHdvcmtkaXIsIGZuKQogICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHpmLm9wZW4oYXJjbmFtZSkgYXMgYmY6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlb3AuY29weV9zdHJlYW0oYmYsIHdvcmtuYW1lKQoKICAgICAgICAgICAgICAgICAgICAgICAgZG4sIGZuID0gb3MucGF0aC5zcGxpdChvdXRmaWxlKQogICAgICAgICAgICAgICAgICAgICAgICBtYWtlci50YXJnZXRfZGlyID0gZG4KICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVzID0gbWFrZXIubWFrZShmbikKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW9wLnNldF9leGVjdXRhYmxlX21vZGUoZmlsZW5hbWVzKQogICAgICAgICAgICAgICAgICAgICAgICBvdXRmaWxlcy5leHRlbmQoZmlsZW5hbWVzKQoKICAgICAgICAgICAgICAgIGlmIGxpYl9vbmx5OgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnbGliX29ubHk6IHJldHVybmluZyBOb25lJykKICAgICAgICAgICAgICAgICAgICBkaXN0ID0gTm9uZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAjIEdlbmVyYXRlIHNjcmlwdHMKCiAgICAgICAgICAgICAgICAgICAgIyBUcnkgdG8gZ2V0IHB5ZGlzdC5qc29uIHNvIHdlIGNhbiBzZWUgaWYgdGhlcmUgYXJlCiAgICAgICAgICAgICAgICAgICAgIyBhbnkgY29tbWFuZHMgdG8gZ2VuZXJhdGUuIElmIHRoaXMgZmFpbHMgKGUuZy4gYmVjYXVzZQogICAgICAgICAgICAgICAgICAgICMgb2YgYSBsZWdhY3kgd2hlZWwpLCBsb2cgYSB3YXJuaW5nIGJ1dCBkb24ndCBnaXZlIHVwLgogICAgICAgICAgICAgICAgICAgIGNvbW1hbmRzID0gTm9uZQogICAgICAgICAgICAgICAgICAgIGZpbGVfdmVyc2lvbiA9IHNlbGYuaW5mb1snV2hlZWwtVmVyc2lvbiddCiAgICAgICAgICAgICAgICAgICAgaWYgZmlsZV92ZXJzaW9uID09ICcxLjAnOgogICAgICAgICAgICAgICAgICAgICAgICAjIFVzZSBsZWdhY3kgaW5mbwogICAgICAgICAgICAgICAgICAgICAgICBlcCA9IHBvc2l4cGF0aC5qb2luKGluZm9fZGlyLCAnZW50cnlfcG9pbnRzLnR4dCcpCiAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggemYub3BlbihlcCkgYXMgYndmOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwZGF0YSA9IHJlYWRfZXhwb3J0cyhid2YpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kcyA9IHt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Iga2V5IGluICgnY29uc29sZScsICdndWknKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrID0gJyVzX3NjcmlwdHMnICUga2V5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgayBpbiBlcGRhdGE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRzWyd3cmFwXyVzJyAlIGtleV0gPSBkID0ge30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHYgaW4gZXBkYXRhW2tdLnZhbHVlcygpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9ICclczolcycgJSAodi5wcmVmaXgsIHYuc3VmZml4KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdi5mbGFnczoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzICs9ICcgJXMnICUgdi5mbGFncwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZFt2Lm5hbWVdID0gcwogICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ1VuYWJsZSB0byByZWFkIGxlZ2FjeSBzY3JpcHQgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21ldGFkYXRhLCBzbyBjYW5ub3QgZ2VuZXJhdGUgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NjcmlwdHMnKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggemYub3BlbihtZXRhZGF0YV9uYW1lKSBhcyBid2Y6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2YgPSB3cmFwcGVyKGJ3ZikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kcyA9IGpzb24ubG9hZCh3ZikuZ2V0KCdleHRlbnNpb25zJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBjb21tYW5kczoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZHMgPSBjb21tYW5kcy5nZXQoJ3B5dGhvbi5jb21tYW5kcycpCiAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygnVW5hYmxlIHRvIHJlYWQgSlNPTiBtZXRhZGF0YSwgc28gJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Nhbm5vdCBnZW5lcmF0ZSBzY3JpcHRzJykKICAgICAgICAgICAgICAgICAgICBpZiBjb21tYW5kczoKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZV9zY3JpcHRzID0gY29tbWFuZHMuZ2V0KCd3cmFwX2NvbnNvbGUnLCB7fSkKICAgICAgICAgICAgICAgICAgICAgICAgZ3VpX3NjcmlwdHMgPSBjb21tYW5kcy5nZXQoJ3dyYXBfZ3VpJywge30pCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGNvbnNvbGVfc2NyaXB0cyBvciBndWlfc2NyaXB0czoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdF9kaXIgPSBwYXRocy5nZXQoJ3NjcmlwdHMnLCAnJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKHNjcmlwdF9kaXIpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1ZhbGlkIHNjcmlwdCBwYXRoIG5vdCAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3BlY2lmaWVkJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VyLnRhcmdldF9kaXIgPSBzY3JpcHRfZGlyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaywgdiBpbiBjb25zb2xlX3NjcmlwdHMuaXRlbXMoKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQgPSAnJXMgPSAlcycgJSAoaywgdikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZXMgPSBtYWtlci5tYWtlKHNjcmlwdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlb3Auc2V0X2V4ZWN1dGFibGVfbW9kZShmaWxlbmFtZXMpCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZ3VpX3NjcmlwdHM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IHsnZ3VpJzogVHJ1ZSB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGssIHYgaW4gZ3VpX3NjcmlwdHMuaXRlbXMoKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0ID0gJyVzID0gJXMnICUgKGssIHYpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lcyA9IG1ha2VyLm1ha2Uoc2NyaXB0LCBvcHRpb25zKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlb3Auc2V0X2V4ZWN1dGFibGVfbW9kZShmaWxlbmFtZXMpCgogICAgICAgICAgICAgICAgICAgIHAgPSBvcy5wYXRoLmpvaW4obGliZGlyLCBpbmZvX2RpcikKICAgICAgICAgICAgICAgICAgICBkaXN0ID0gSW5zdGFsbGVkRGlzdHJpYnV0aW9uKHApCgogICAgICAgICAgICAgICAgICAgICMgV3JpdGUgU0hBUkVECiAgICAgICAgICAgICAgICAgICAgcGF0aHMgPSBkaWN0KHBhdGhzKSAgICAgIyBkb24ndCBjaGFuZ2UgcGFzc2VkIGluIGRpY3QKICAgICAgICAgICAgICAgICAgICBkZWwgcGF0aHNbJ3B1cmVsaWInXQogICAgICAgICAgICAgICAgICAgIGRlbCBwYXRoc1sncGxhdGxpYiddCiAgICAgICAgICAgICAgICAgICAgcGF0aHNbJ2xpYiddID0gbGliZGlyCiAgICAgICAgICAgICAgICAgICAgcCA9IGRpc3Qud3JpdGVfc2hhcmVkX2xvY2F0aW9ucyhwYXRocywgZHJ5X3J1bikKICAgICAgICAgICAgICAgICAgICBpZiBwOgogICAgICAgICAgICAgICAgICAgICAgICBvdXRmaWxlcy5hcHBlbmQocCkKCiAgICAgICAgICAgICAgICAgICAgIyBXcml0ZSBSRUNPUkQKICAgICAgICAgICAgICAgICAgICBkaXN0LndyaXRlX2luc3RhbGxlZF9maWxlcyhvdXRmaWxlcywgcGF0aHNbJ3ByZWZpeCddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyeV9ydW4pCiAgICAgICAgICAgICAgICByZXR1cm4gZGlzdAogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgICAgICAgICBsb2dnZXIuZXhjZXB0aW9uKCdpbnN0YWxsYXRpb24gZmFpbGVkLicpCiAgICAgICAgICAgICAgICBmaWxlb3Aucm9sbGJhY2soKQogICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgIHNodXRpbC5ybXRyZWUod29ya2RpcikKCiAgICBkZWYgX2dldF9keWxpYl9jYWNoZShzZWxmKToKICAgICAgICBnbG9iYWwgY2FjaGUKICAgICAgICBpZiBjYWNoZSBpcyBOb25lOgogICAgICAgICAgICAjIFVzZSBuYXRpdmUgc3RyaW5nIHRvIGF2b2lkIGlzc3VlcyBvbiAyLng6IHNlZSBQeXRob24gIzIwMTQwLgogICAgICAgICAgICBiYXNlID0gb3MucGF0aC5qb2luKGdldF9jYWNoZV9iYXNlKCksIHN0cignZHlsaWItY2FjaGUnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMudmVyc2lvbls6M10pCiAgICAgICAgICAgIGNhY2hlID0gQ2FjaGUoYmFzZSkKICAgICAgICByZXR1cm4gY2FjaGUKCiAgICBkZWYgX2dldF9leHRlbnNpb25zKHNlbGYpOgogICAgICAgIHBhdGhuYW1lID0gb3MucGF0aC5qb2luKHNlbGYuZGlybmFtZSwgc2VsZi5maWxlbmFtZSkKICAgICAgICBuYW1lX3ZlciA9ICclcy0lcycgJSAoc2VsZi5uYW1lLCBzZWxmLnZlcnNpb24pCiAgICAgICAgaW5mb19kaXIgPSAnJXMuZGlzdC1pbmZvJyAlIG5hbWVfdmVyCiAgICAgICAgYXJjbmFtZSA9IHBvc2l4cGF0aC5qb2luKGluZm9fZGlyLCAnRVhURU5TSU9OUycpCiAgICAgICAgd3JhcHBlciA9IGNvZGVjcy5nZXRyZWFkZXIoJ3V0Zi04JykKICAgICAgICByZXN1bHQgPSBbXQogICAgICAgIHdpdGggWmlwRmlsZShwYXRobmFtZSwgJ3InKSBhcyB6ZjoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgd2l0aCB6Zi5vcGVuKGFyY25hbWUpIGFzIGJmOgogICAgICAgICAgICAgICAgICAgIHdmID0gd3JhcHBlcihiZikKICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zID0ganNvbi5sb2FkKHdmKQogICAgICAgICAgICAgICAgICAgIGNhY2hlID0gc2VsZi5fZ2V0X2R5bGliX2NhY2hlKCkKICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBjYWNoZS5wcmVmaXhfdG9fZGlyKHBhdGhuYW1lKQogICAgICAgICAgICAgICAgICAgIGNhY2hlX2Jhc2UgPSBvcy5wYXRoLmpvaW4oY2FjaGUuYmFzZSwgcHJlZml4KQogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGNhY2hlX2Jhc2UpOgogICAgICAgICAgICAgICAgICAgICAgICBvcy5tYWtlZGlycyhjYWNoZV9iYXNlKQogICAgICAgICAgICAgICAgICAgIGZvciBuYW1lLCByZWxwYXRoIGluIGV4dGVuc2lvbnMuaXRlbXMoKToKICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCA9IG9zLnBhdGguam9pbihjYWNoZV9iYXNlLCBjb252ZXJ0X3BhdGgocmVscGF0aCkpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhkZXN0KToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3QgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX3RpbWUgPSBvcy5zdGF0KGRlc3QpLnN0X210aW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX3RpbWUgPSBkYXRldGltZS5kYXRldGltZS5mcm9tdGltZXN0YW1wKGZpbGVfdGltZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSB6Zi5nZXRpbmZvKHJlbHBhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVlbF90aW1lID0gZGF0ZXRpbWUuZGF0ZXRpbWUoKmluZm8uZGF0ZV90aW1lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdCA9IHdoZWVsX3RpbWUgPiBmaWxlX3RpbWUKICAgICAgICAgICAgICAgICAgICAgICAgaWYgZXh0cmFjdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpmLmV4dHJhY3QocmVscGF0aCwgY2FjaGVfYmFzZSkKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgobmFtZSwgZGVzdCkpCiAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIGlzX2NvbXBhdGlibGUoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgRGV0ZXJtaW5lIGlmIGEgd2hlZWwgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBydW5uaW5nIHN5c3RlbS4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gaXNfY29tcGF0aWJsZShzZWxmKQoKICAgIGRlZiBpc19tb3VudGFibGUoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgRGV0ZXJtaW5lIGlmIGEgd2hlZWwgaXMgYXNzZXJ0ZWQgYXMgbW91bnRhYmxlIGJ5IGl0cyBtZXRhZGF0YS4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gVHJ1ZSAjIGZvciBub3cgLSBtZXRhZGF0YSBkZXRhaWxzIFRCRAoKICAgIGRlZiBtb3VudChzZWxmLCBhcHBlbmQ9RmFsc2UpOgogICAgICAgIHBhdGhuYW1lID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguam9pbihzZWxmLmRpcm5hbWUsIHNlbGYuZmlsZW5hbWUpKQogICAgICAgIGlmIG5vdCBzZWxmLmlzX2NvbXBhdGlibGUoKToKICAgICAgICAgICAgbXNnID0gJ1doZWVsICVzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhpcyBQeXRob24uJyAlIHBhdGhuYW1lCiAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24obXNnKQogICAgICAgIGlmIG5vdCBzZWxmLmlzX21vdW50YWJsZSgpOgogICAgICAgICAgICBtc2cgPSAnV2hlZWwgJXMgaXMgbWFya2VkIGFzIG5vdCBtb3VudGFibGUuJyAlIHBhdGhuYW1lCiAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24obXNnKQogICAgICAgIGlmIHBhdGhuYW1lIGluIHN5cy5wYXRoOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoJyVzIGFscmVhZHkgaW4gcGF0aCcsIHBhdGhuYW1lKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIGFwcGVuZDoKICAgICAgICAgICAgICAgIHN5cy5wYXRoLmFwcGVuZChwYXRobmFtZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBwYXRobmFtZSkKICAgICAgICAgICAgZXh0ZW5zaW9ucyA9IHNlbGYuX2dldF9leHRlbnNpb25zKCkKICAgICAgICAgICAgaWYgZXh0ZW5zaW9uczoKICAgICAgICAgICAgICAgIGlmIF9ob29rIG5vdCBpbiBzeXMubWV0YV9wYXRoOgogICAgICAgICAgICAgICAgICAgIHN5cy5tZXRhX3BhdGguYXBwZW5kKF9ob29rKQogICAgICAgICAgICAgICAgX2hvb2suYWRkKHBhdGhuYW1lLCBleHRlbnNpb25zKQoKICAgIGRlZiB1bm1vdW50KHNlbGYpOgogICAgICAgIHBhdGhuYW1lID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguam9pbihzZWxmLmRpcm5hbWUsIHNlbGYuZmlsZW5hbWUpKQogICAgICAgIGlmIHBhdGhuYW1lIG5vdCBpbiBzeXMucGF0aDoKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCclcyBub3QgaW4gcGF0aCcsIHBhdGhuYW1lKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHN5cy5wYXRoLnJlbW92ZShwYXRobmFtZSkKICAgICAgICAgICAgaWYgcGF0aG5hbWUgaW4gX2hvb2suaW1wdXJlX3doZWVsczoKICAgICAgICAgICAgICAgIF9ob29rLnJlbW92ZShwYXRobmFtZSkKICAgICAgICAgICAgaWYgbm90IF9ob29rLmltcHVyZV93aGVlbHM6CiAgICAgICAgICAgICAgICBpZiBfaG9vayBpbiBzeXMubWV0YV9wYXRoOgogICAgICAgICAgICAgICAgICAgIHN5cy5tZXRhX3BhdGgucmVtb3ZlKF9ob29rKQoKICAgIGRlZiB2ZXJpZnkoc2VsZik6CiAgICAgICAgcGF0aG5hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5kaXJuYW1lLCBzZWxmLmZpbGVuYW1lKQogICAgICAgIG5hbWVfdmVyID0gJyVzLSVzJyAlIChzZWxmLm5hbWUsIHNlbGYudmVyc2lvbikKICAgICAgICBkYXRhX2RpciA9ICclcy5kYXRhJyAlIG5hbWVfdmVyCiAgICAgICAgaW5mb19kaXIgPSAnJXMuZGlzdC1pbmZvJyAlIG5hbWVfdmVyCgogICAgICAgIG1ldGFkYXRhX25hbWUgPSBwb3NpeHBhdGguam9pbihpbmZvX2RpciwgTUVUQURBVEFfRklMRU5BTUUpCiAgICAgICAgd2hlZWxfbWV0YWRhdGFfbmFtZSA9IHBvc2l4cGF0aC5qb2luKGluZm9fZGlyLCAnV0hFRUwnKQogICAgICAgIHJlY29yZF9uYW1lID0gcG9zaXhwYXRoLmpvaW4oaW5mb19kaXIsICdSRUNPUkQnKQoKICAgICAgICB3cmFwcGVyID0gY29kZWNzLmdldHJlYWRlcigndXRmLTgnKQoKICAgICAgICB3aXRoIFppcEZpbGUocGF0aG5hbWUsICdyJykgYXMgemY6CiAgICAgICAgICAgIHdpdGggemYub3Blbih3aGVlbF9tZXRhZGF0YV9uYW1lKSBhcyBid2Y6CiAgICAgICAgICAgICAgICB3ZiA9IHdyYXBwZXIoYndmKQogICAgICAgICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2VfZnJvbV9maWxlKHdmKQogICAgICAgICAgICB3diA9IG1lc3NhZ2VbJ1doZWVsLVZlcnNpb24nXS5zcGxpdCgnLicsIDEpCiAgICAgICAgICAgIGZpbGVfdmVyc2lvbiA9IHR1cGxlKFtpbnQoaSkgZm9yIGkgaW4gd3ZdKQogICAgICAgICAgICAjIFRPRE8gdmVyc2lvbiB2ZXJpZmljYXRpb24KCiAgICAgICAgICAgIHJlY29yZHMgPSB7fQogICAgICAgICAgICB3aXRoIHpmLm9wZW4ocmVjb3JkX25hbWUpIGFzIGJmOgogICAgICAgICAgICAgICAgd2l0aCBDU1ZSZWFkZXIoc3RyZWFtPWJmKSBhcyByZWFkZXI6CiAgICAgICAgICAgICAgICAgICAgZm9yIHJvdyBpbiByZWFkZXI6CiAgICAgICAgICAgICAgICAgICAgICAgIHAgPSByb3dbMF0KICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3Jkc1twXSA9IHJvdwoKICAgICAgICAgICAgZm9yIHppbmZvIGluIHpmLmluZm9saXN0KCk6CiAgICAgICAgICAgICAgICBhcmNuYW1lID0gemluZm8uZmlsZW5hbWUKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYXJjbmFtZSwgdGV4dF90eXBlKToKICAgICAgICAgICAgICAgICAgICB1X2FyY25hbWUgPSBhcmNuYW1lCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHVfYXJjbmFtZSA9IGFyY25hbWUuZGVjb2RlKCd1dGYtOCcpCiAgICAgICAgICAgICAgICBpZiAnLi4nIGluIHVfYXJjbmFtZToKICAgICAgICAgICAgICAgICAgICByYWlzZSBEaXN0bGliRXhjZXB0aW9uKCdpbnZhbGlkIGVudHJ5IGluICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3aGVlbDogJXInICUgdV9hcmNuYW1lKQoKICAgICAgICAgICAgICAgICMgVGhlIHNpZ25hdHVyZSBmaWxlIHdvbid0IGJlIGluIFJFQ09SRCwKICAgICAgICAgICAgICAgICMgYW5kIHdlICBkb24ndCBjdXJyZW50bHkgZG9uJ3QgZG8gYW55dGhpbmcgd2l0aCBpdAogICAgICAgICAgICAgICAgaWYgdV9hcmNuYW1lLmVuZHN3aXRoKCcvUkVDT1JELmp3cycpOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICByb3cgPSByZWNvcmRzW3VfYXJjbmFtZV0KICAgICAgICAgICAgICAgIGlmIHJvd1syXSBhbmQgc3RyKHppbmZvLmZpbGVfc2l6ZSkgIT0gcm93WzJdOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ3NpemUgbWlzbWF0Y2ggZm9yICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclcycgJSB1X2FyY25hbWUpCiAgICAgICAgICAgICAgICBpZiByb3dbMV06CiAgICAgICAgICAgICAgICAgICAga2luZCwgdmFsdWUgPSByb3dbMV0uc3BsaXQoJz0nLCAxKQogICAgICAgICAgICAgICAgICAgIHdpdGggemYub3BlbihhcmNuYW1lKSBhcyBiZjoKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGJmLnJlYWQoKQogICAgICAgICAgICAgICAgICAgIF8sIGRpZ2VzdCA9IHNlbGYuZ2V0X2hhc2goZGF0YSwga2luZCkKICAgICAgICAgICAgICAgICAgICBpZiBkaWdlc3QgIT0gdmFsdWU6CiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ2RpZ2VzdCBtaXNtYXRjaCBmb3IgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclcycgJSBhcmNuYW1lKQoKICAgIGRlZiB1cGRhdGUoc2VsZiwgbW9kaWZpZXIsIGRlc3RfZGlyPU5vbmUsICoqa3dhcmdzKToKICAgICAgICAiIiIKICAgICAgICBVcGRhdGUgdGhlIGNvbnRlbnRzIG9mIGEgd2hlZWwgaW4gYSBnZW5lcmljIHdheS4gVGhlIG1vZGlmaWVyIHNob3VsZAogICAgICAgIGJlIGEgY2FsbGFibGUgd2hpY2ggZXhwZWN0cyBhIGRpY3Rpb25hcnkgYXJndW1lbnQ6IGl0cyBrZXlzIGFyZQogICAgICAgIGFyY2hpdmUtZW50cnkgcGF0aHMsIGFuZCBpdHMgdmFsdWVzIGFyZSBhYnNvbHV0ZSBmaWxlc3lzdGVtIHBhdGhzCiAgICAgICAgd2hlcmUgdGhlIGNvbnRlbnRzIHRoZSBjb3JyZXNwb25kaW5nIGFyY2hpdmUgZW50cmllcyBjYW4gYmUgZm91bmQuIFRoZQogICAgICAgIG1vZGlmaWVyIGlzIGZyZWUgdG8gY2hhbmdlIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsZXMgcG9pbnRlZCB0bywgYWRkCiAgICAgICAgbmV3IGVudHJpZXMgYW5kIHJlbW92ZSBlbnRyaWVzLCBiZWZvcmUgcmV0dXJuaW5nLiBUaGlzIG1ldGhvZCB3aWxsCiAgICAgICAgZXh0cmFjdCB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIHRoZSB3aGVlbCB0byBhIHRlbXBvcmFyeSBsb2NhdGlvbiwgY2FsbAogICAgICAgIHRoZSBtb2RpZmllciwgYW5kIHRoZW4gdXNlIHRoZSBwYXNzZWQgKGFuZCBwb3NzaWJseSB1cGRhdGVkKQogICAgICAgIGRpY3Rpb25hcnkgdG8gd3JpdGUgYSBuZXcgd2hlZWwuIElmIGBgZGVzdF9kaXJgYCBpcyBzcGVjaWZpZWQsIHRoZSBuZXcKICAgICAgICB3aGVlbCBpcyB3cml0dGVuIHRoZXJlIC0tIG90aGVyd2lzZSwgdGhlIG9yaWdpbmFsIHdoZWVsIGlzIG92ZXJ3cml0dGVuLgoKICAgICAgICBUaGUgbW9kaWZpZXIgc2hvdWxkIHJldHVybiBUcnVlIGlmIGl0IHVwZGF0ZWQgdGhlIHdoZWVsLCBlbHNlIEZhbHNlLgogICAgICAgIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHNhbWUgdmFsdWUgdGhlIG1vZGlmaWVyIHJldHVybnMuCiAgICAgICAgIiIiCgogICAgICAgIGRlZiBnZXRfdmVyc2lvbihwYXRoX21hcCwgaW5mb19kaXIpOgogICAgICAgICAgICB2ZXJzaW9uID0gcGF0aCA9IE5vbmUKICAgICAgICAgICAga2V5ID0gJyVzLyVzJyAlIChpbmZvX2RpciwgTUVUQURBVEFfRklMRU5BTUUpCiAgICAgICAgICAgIGlmIGtleSBub3QgaW4gcGF0aF9tYXA6CiAgICAgICAgICAgICAgICBrZXkgPSAnJXMvUEtHLUlORk8nICUgaW5mb19kaXIKICAgICAgICAgICAgaWYga2V5IGluIHBhdGhfbWFwOgogICAgICAgICAgICAgICAgcGF0aCA9IHBhdGhfbWFwW2tleV0KICAgICAgICAgICAgICAgIHZlcnNpb24gPSBNZXRhZGF0YShwYXRoPXBhdGgpLnZlcnNpb24KICAgICAgICAgICAgcmV0dXJuIHZlcnNpb24sIHBhdGgKCiAgICAgICAgZGVmIHVwZGF0ZV92ZXJzaW9uKHZlcnNpb24sIHBhdGgpOgogICAgICAgICAgICB1cGRhdGVkID0gTm9uZQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICB2ID0gTm9ybWFsaXplZFZlcnNpb24odmVyc2lvbikKICAgICAgICAgICAgICAgIGkgPSB2ZXJzaW9uLmZpbmQoJy0nKQogICAgICAgICAgICAgICAgaWYgaSA8IDA6CiAgICAgICAgICAgICAgICAgICAgdXBkYXRlZCA9ICclcysxJyAlIHZlcnNpb24KICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcGFydHMgPSBbaW50KHMpIGZvciBzIGluIHZlcnNpb25baSArIDE6XS5zcGxpdCgnLicpXQogICAgICAgICAgICAgICAgICAgIHBhcnRzWy0xXSArPSAxCiAgICAgICAgICAgICAgICAgICAgdXBkYXRlZCA9ICclcyslcycgJSAodmVyc2lvbls6aV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy4nLmpvaW4oc3RyKGkpIGZvciBpIGluIHBhcnRzKSkKICAgICAgICAgICAgZXhjZXB0IFVuc3VwcG9ydGVkVmVyc2lvbkVycm9yOgogICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdDYW5ub3QgdXBkYXRlIG5vbi1jb21wbGlhbnQgKFBFUC00NDApICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmVyc2lvbiAlcicsIHZlcnNpb24pCiAgICAgICAgICAgIGlmIHVwZGF0ZWQ6CiAgICAgICAgICAgICAgICBtZCA9IE1ldGFkYXRhKHBhdGg9cGF0aCkKICAgICAgICAgICAgICAgIG1kLnZlcnNpb24gPSB1cGRhdGVkCiAgICAgICAgICAgICAgICBsZWdhY3kgPSBub3QgcGF0aC5lbmRzd2l0aChNRVRBREFUQV9GSUxFTkFNRSkKICAgICAgICAgICAgICAgIG1kLndyaXRlKHBhdGg9cGF0aCwgbGVnYWN5PWxlZ2FjeSkKICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnVmVyc2lvbiB1cGRhdGVkIGZyb20gJXIgdG8gJXInLCB2ZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWQpCgogICAgICAgIHBhdGhuYW1lID0gb3MucGF0aC5qb2luKHNlbGYuZGlybmFtZSwgc2VsZi5maWxlbmFtZSkKICAgICAgICBuYW1lX3ZlciA9ICclcy0lcycgJSAoc2VsZi5uYW1lLCBzZWxmLnZlcnNpb24pCiAgICAgICAgaW5mb19kaXIgPSAnJXMuZGlzdC1pbmZvJyAlIG5hbWVfdmVyCiAgICAgICAgcmVjb3JkX25hbWUgPSBwb3NpeHBhdGguam9pbihpbmZvX2RpciwgJ1JFQ09SRCcpCiAgICAgICAgd2l0aCB0ZW1wZGlyKCkgYXMgd29ya2RpcjoKICAgICAgICAgICAgd2l0aCBaaXBGaWxlKHBhdGhuYW1lLCAncicpIGFzIHpmOgogICAgICAgICAgICAgICAgcGF0aF9tYXAgPSB7fQogICAgICAgICAgICAgICAgZm9yIHppbmZvIGluIHpmLmluZm9saXN0KCk6CiAgICAgICAgICAgICAgICAgICAgYXJjbmFtZSA9IHppbmZvLmZpbGVuYW1lCiAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShhcmNuYW1lLCB0ZXh0X3R5cGUpOgogICAgICAgICAgICAgICAgICAgICAgICB1X2FyY25hbWUgPSBhcmNuYW1lCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgdV9hcmNuYW1lID0gYXJjbmFtZS5kZWNvZGUoJ3V0Zi04JykKICAgICAgICAgICAgICAgICAgICBpZiB1X2FyY25hbWUgPT0gcmVjb3JkX25hbWU6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgaWYgJy4uJyBpbiB1X2FyY25hbWU6CiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIERpc3RsaWJFeGNlcHRpb24oJ2ludmFsaWQgZW50cnkgaW4gJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3aGVlbDogJXInICUgdV9hcmNuYW1lKQogICAgICAgICAgICAgICAgICAgIHpmLmV4dHJhY3QoemluZm8sIHdvcmtkaXIpCiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbih3b3JrZGlyLCBjb252ZXJ0X3BhdGgodV9hcmNuYW1lKSkKICAgICAgICAgICAgICAgICAgICBwYXRoX21hcFt1X2FyY25hbWVdID0gcGF0aAoKICAgICAgICAgICAgIyBSZW1lbWJlciB0aGUgdmVyc2lvbi4KICAgICAgICAgICAgb3JpZ2luYWxfdmVyc2lvbiwgXyA9IGdldF92ZXJzaW9uKHBhdGhfbWFwLCBpbmZvX2RpcikKICAgICAgICAgICAgIyBGaWxlcyBleHRyYWN0ZWQuIENhbGwgdGhlIG1vZGlmaWVyLgogICAgICAgICAgICBtb2RpZmllZCA9IG1vZGlmaWVyKHBhdGhfbWFwLCAqKmt3YXJncykKICAgICAgICAgICAgaWYgbW9kaWZpZWQ6CiAgICAgICAgICAgICAgICAjIFNvbWV0aGluZyBjaGFuZ2VkIC0gbmVlZCB0byBidWlsZCBhIG5ldyB3aGVlbC4KICAgICAgICAgICAgICAgIGN1cnJlbnRfdmVyc2lvbiwgcGF0aCA9IGdldF92ZXJzaW9uKHBhdGhfbWFwLCBpbmZvX2RpcikKICAgICAgICAgICAgICAgIGlmIGN1cnJlbnRfdmVyc2lvbiBhbmQgKGN1cnJlbnRfdmVyc2lvbiA9PSBvcmlnaW5hbF92ZXJzaW9uKToKICAgICAgICAgICAgICAgICAgICAjIEFkZCBvciB1cGRhdGUgbG9jYWwgdmVyc2lvbiB0byBzaWduaWZ5IGNoYW5nZXMuCiAgICAgICAgICAgICAgICAgICAgdXBkYXRlX3ZlcnNpb24oY3VycmVudF92ZXJzaW9uLCBwYXRoKQogICAgICAgICAgICAgICAgIyBEZWNpZGUgd2hlcmUgdGhlIG5ldyB3aGVlbCBnb2VzLgogICAgICAgICAgICAgICAgaWYgZGVzdF9kaXIgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICBmZCwgbmV3cGF0aCA9IHRlbXBmaWxlLm1rc3RlbXAoc3VmZml4PScud2hsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4PSd3aGVlbC11cGRhdGUtJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyPXdvcmtkaXIpCiAgICAgICAgICAgICAgICAgICAgb3MuY2xvc2UoZmQpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGRlc3RfZGlyKToKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgRGlzdGxpYkV4Y2VwdGlvbignTm90IGEgZGlyZWN0b3J5OiAlcicgJSBkZXN0X2RpcikKICAgICAgICAgICAgICAgICAgICBuZXdwYXRoID0gb3MucGF0aC5qb2luKGRlc3RfZGlyLCBzZWxmLmZpbGVuYW1lKQogICAgICAgICAgICAgICAgYXJjaGl2ZV9wYXRocyA9IGxpc3QocGF0aF9tYXAuaXRlbXMoKSkKICAgICAgICAgICAgICAgIGRpc3RpbmZvID0gb3MucGF0aC5qb2luKHdvcmtkaXIsIGluZm9fZGlyKQogICAgICAgICAgICAgICAgaW5mbyA9IGRpc3RpbmZvLCBpbmZvX2RpcgogICAgICAgICAgICAgICAgc2VsZi53cml0ZV9yZWNvcmRzKGluZm8sIHdvcmtkaXIsIGFyY2hpdmVfcGF0aHMpCiAgICAgICAgICAgICAgICBzZWxmLmJ1aWxkX3ppcChuZXdwYXRoLCBhcmNoaXZlX3BhdGhzKQogICAgICAgICAgICAgICAgaWYgZGVzdF9kaXIgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICBzaHV0aWwuY29weWZpbGUobmV3cGF0aCwgcGF0aG5hbWUpCiAgICAgICAgcmV0dXJuIG1vZGlmaWVkCgpkZWYgY29tcGF0aWJsZV90YWdzKCk6CiAgICAiIiIKICAgIFJldHVybiAocHl2ZXIsIGFiaSwgYXJjaCkgdHVwbGVzIGNvbXBhdGlibGUgd2l0aCB0aGlzIFB5dGhvbi4KICAgICIiIgogICAgdmVyc2lvbnMgPSBbVkVSX1NVRkZJWF0KICAgIG1ham9yID0gVkVSX1NVRkZJWFswXQogICAgZm9yIG1pbm9yIGluIHJhbmdlKHN5cy52ZXJzaW9uX2luZm9bMV0gLSAxLCAtIDEsIC0xKToKICAgICAgICB2ZXJzaW9ucy5hcHBlbmQoJycuam9pbihbbWFqb3IsIHN0cihtaW5vcildKSkKCiAgICBhYmlzID0gW10KICAgIGZvciBzdWZmaXgsIF8sIF8gaW4gaW1wLmdldF9zdWZmaXhlcygpOgogICAgICAgIGlmIHN1ZmZpeC5zdGFydHN3aXRoKCcuYWJpJyk6CiAgICAgICAgICAgIGFiaXMuYXBwZW5kKHN1ZmZpeC5zcGxpdCgnLicsIDIpWzFdKQogICAgYWJpcy5zb3J0KCkKICAgIGlmIEFCSSAhPSAnbm9uZSc6CiAgICAgICAgYWJpcy5pbnNlcnQoMCwgQUJJKQogICAgYWJpcy5hcHBlbmQoJ25vbmUnKQogICAgcmVzdWx0ID0gW10KCiAgICBhcmNoZXMgPSBbQVJDSF0KICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKICAgICAgICBtID0gcmUubWF0Y2goJyhcdyspXyhcZCspXyhcZCspXyhcdyspJCcsIEFSQ0gpCiAgICAgICAgaWYgbToKICAgICAgICAgICAgbmFtZSwgbWFqb3IsIG1pbm9yLCBhcmNoID0gbS5ncm91cHMoKQogICAgICAgICAgICBtaW5vciA9IGludChtaW5vcikKICAgICAgICAgICAgbWF0Y2hlcyA9IFthcmNoXQogICAgICAgICAgICBpZiBhcmNoIGluICgnaTM4NicsICdwcGMnKToKICAgICAgICAgICAgICAgIG1hdGNoZXMuYXBwZW5kKCdmYXQnKQogICAgICAgICAgICBpZiBhcmNoIGluICgnaTM4NicsICdwcGMnLCAneDg2XzY0Jyk6CiAgICAgICAgICAgICAgICBtYXRjaGVzLmFwcGVuZCgnZmF0MycpCiAgICAgICAgICAgIGlmIGFyY2ggaW4gKCdwcGM2NCcsICd4ODZfNjQnKToKICAgICAgICAgICAgICAgIG1hdGNoZXMuYXBwZW5kKCdmYXQ2NCcpCiAgICAgICAgICAgIGlmIGFyY2ggaW4gKCdpMzg2JywgJ3g4Nl82NCcpOgogICAgICAgICAgICAgICAgbWF0Y2hlcy5hcHBlbmQoJ2ludGVsJykKICAgICAgICAgICAgaWYgYXJjaCBpbiAoJ2kzODYnLCAneDg2XzY0JywgJ2ludGVsJywgJ3BwYycsICdwcGM2NCcpOgogICAgICAgICAgICAgICAgbWF0Y2hlcy5hcHBlbmQoJ3VuaXZlcnNhbCcpCiAgICAgICAgICAgIHdoaWxlIG1pbm9yID49IDA6CiAgICAgICAgICAgICAgICBmb3IgbWF0Y2ggaW4gbWF0Y2hlczoKICAgICAgICAgICAgICAgICAgICBzID0gJyVzXyVzXyVzXyVzJyAlIChuYW1lLCBtYWpvciwgbWlub3IsIG1hdGNoKQogICAgICAgICAgICAgICAgICAgIGlmIHMgIT0gQVJDSDogICAjIGFscmVhZHkgdGhlcmUKICAgICAgICAgICAgICAgICAgICAgICAgYXJjaGVzLmFwcGVuZChzKQogICAgICAgICAgICAgICAgbWlub3IgLT0gMQoKICAgICMgTW9zdCBzcGVjaWZpYyAtIG91ciBQeXRob24gdmVyc2lvbiwgQUJJIGFuZCBhcmNoCiAgICBmb3IgYWJpIGluIGFiaXM6CiAgICAgICAgZm9yIGFyY2ggaW4gYXJjaGVzOgogICAgICAgICAgICByZXN1bHQuYXBwZW5kKCgnJy5qb2luKChJTVBfUFJFRklYLCB2ZXJzaW9uc1swXSkpLCBhYmksIGFyY2gpKQoKICAgICMgd2hlcmUgbm8gQUJJIC8gYXJjaCBkZXBlbmRlbmN5LCBidXQgSU1QX1BSRUZJWCBkZXBlbmRlbmN5CiAgICBmb3IgaSwgdmVyc2lvbiBpbiBlbnVtZXJhdGUodmVyc2lvbnMpOgogICAgICAgIHJlc3VsdC5hcHBlbmQoKCcnLmpvaW4oKElNUF9QUkVGSVgsIHZlcnNpb24pKSwgJ25vbmUnLCAnYW55JykpCiAgICAgICAgaWYgaSA9PSAwOgogICAgICAgICAgICByZXN1bHQuYXBwZW5kKCgnJy5qb2luKChJTVBfUFJFRklYLCB2ZXJzaW9uWzBdKSksICdub25lJywgJ2FueScpKQoKICAgICMgbm8gSU1QX1BSRUZJWCwgQUJJIG9yIGFyY2ggZGVwZW5kZW5jeQogICAgZm9yIGksIHZlcnNpb24gaW4gZW51bWVyYXRlKHZlcnNpb25zKToKICAgICAgICByZXN1bHQuYXBwZW5kKCgnJy5qb2luKCgncHknLCB2ZXJzaW9uKSksICdub25lJywgJ2FueScpKQogICAgICAgIGlmIGkgPT0gMDoKICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgoJycuam9pbigoJ3B5JywgdmVyc2lvblswXSkpLCAnbm9uZScsICdhbnknKSkKICAgIHJldHVybiBzZXQocmVzdWx0KQoKCkNPTVBBVElCTEVfVEFHUyA9IGNvbXBhdGlibGVfdGFncygpCgpkZWwgY29tcGF0aWJsZV90YWdzCgoKZGVmIGlzX2NvbXBhdGlibGUod2hlZWwsIHRhZ3M9Tm9uZSk6CiAgICBpZiBub3QgaXNpbnN0YW5jZSh3aGVlbCwgV2hlZWwpOgogICAgICAgIHdoZWVsID0gV2hlZWwod2hlZWwpICAgICMgYXNzdW1lIGl0J3MgYSBmaWxlbmFtZQogICAgcmVzdWx0ID0gRmFsc2UKICAgIGlmIHRhZ3MgaXMgTm9uZToKICAgICAgICB0YWdzID0gQ09NUEFUSUJMRV9UQUdTCiAgICBmb3IgdmVyLCBhYmksIGFyY2ggaW4gdGFnczoKICAgICAgICBpZiB2ZXIgaW4gd2hlZWwucHl2ZXIgYW5kIGFiaSBpbiB3aGVlbC5hYmkgYW5kIGFyY2ggaW4gd2hlZWwuYXJjaDoKICAgICAgICAgICAgcmVzdWx0ID0gVHJ1ZQogICAgICAgICAgICBicmVhawogICAgcmV0dXJuIHJlc3VsdApQSwMEFAAAAAAAAAAhAJHBwK7NlQAAzZUAACUAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdHJvLnB5IyBDb3B5cmlnaHQgMjAxNSwyMDE2IE5pciBDb2hlbgojCiMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgojIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAojCiMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiMKIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgoiIiIKVGhlIGBgZGlzdHJvYGAgcGFja2FnZSAoYGBkaXN0cm9gYCBzdGFuZHMgZm9yIExpbnV4IERpc3RyaWJ1dGlvbikgcHJvdmlkZXMKaW5mb3JtYXRpb24gYWJvdXQgdGhlIExpbnV4IGRpc3RyaWJ1dGlvbiBpdCBydW5zIG9uLCBzdWNoIGFzIGEgcmVsaWFibGUKbWFjaGluZS1yZWFkYWJsZSBkaXN0cm8gSUQsIG9yIHZlcnNpb24gaW5mb3JtYXRpb24uCgpJdCBpcyBhIHJlbmV3ZWQgYWx0ZXJuYXRpdmUgaW1wbGVtZW50YXRpb24gZm9yIFB5dGhvbidzIG9yaWdpbmFsCjpweTpmdW5jOmBwbGF0Zm9ybS5saW51eF9kaXN0cmlidXRpb25gIGZ1bmN0aW9uLCBidXQgaXQgcHJvdmlkZXMgbXVjaCBtb3JlCmZ1bmN0aW9uYWxpdHkuIEFuIGFsdGVybmF0aXZlIGltcGxlbWVudGF0aW9uIGJlY2FtZSBuZWNlc3NhcnkgYmVjYXVzZSBQeXRob24KMy41IGRlcHJlY2F0ZWQgdGhpcyBmdW5jdGlvbiwgYW5kIFB5dGhvbiAzLjcgaXMgZXhwZWN0ZWQgdG8gcmVtb3ZlIGl0CmFsdG9nZXRoZXIuIEl0cyBwcmVkZWNlc3NvciBmdW5jdGlvbiA6cHk6ZnVuYzpgcGxhdGZvcm0uZGlzdGAgd2FzIGFscmVhZHkKZGVwcmVjYXRlZCBzaW5jZSBQeXRob24gMi42IGFuZCBpcyBhbHNvIGV4cGVjdGVkIHRvIGJlIHJlbW92ZWQgaW4gUHl0aG9uIDMuNy4KU3RpbGwsIHRoZXJlIGFyZSBtYW55IGNhc2VzIGluIHdoaWNoIGFjY2VzcyB0byBMaW51eCBkaXN0cmlidXRpb24gaW5mb3JtYXRpb24KaXMgbmVlZGVkLiBTZWUgYFB5dGhvbiBpc3N1ZSAxMzIyIDxodHRwczovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTEzMjI+YF8gZm9yCm1vcmUgaW5mb3JtYXRpb24uCiIiIgoKaW1wb3J0IG9zCmltcG9ydCByZQppbXBvcnQgc3lzCmltcG9ydCBqc29uCmltcG9ydCBzaGxleAppbXBvcnQgbG9nZ2luZwppbXBvcnQgc3VicHJvY2VzcwoKCmlmIG5vdCBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnbGludXgnKToKICAgIHJhaXNlIEltcG9ydEVycm9yKCdVbnN1cHBvcnRlZCBwbGF0Zm9ybTogezB9Jy5mb3JtYXQoc3lzLnBsYXRmb3JtKSkKCl9VTklYQ09ORkRJUiA9ICcvZXRjJwpfT1NfUkVMRUFTRV9CQVNFTkFNRSA9ICdvcy1yZWxlYXNlJwoKIzogVHJhbnNsYXRpb24gdGFibGUgZm9yIG5vcm1hbGl6aW5nIHRoZSAiSUQiIGF0dHJpYnV0ZSBkZWZpbmVkIGluIG9zLXJlbGVhc2UKIzogZmlsZXMsIGZvciB1c2UgYnkgdGhlIDpmdW5jOmBkaXN0cm8uaWRgIG1ldGhvZC4KIzoKIzogKiBLZXk6IFZhbHVlIGFzIGRlZmluZWQgaW4gdGhlIG9zLXJlbGVhc2UgZmlsZSwgdHJhbnNsYXRlZCB0byBsb3dlciBjYXNlLAojOiAgIHdpdGggYmxhbmtzIHRyYW5zbGF0ZWQgdG8gdW5kZXJzY29yZXMuCiM6CiM6ICogVmFsdWU6IE5vcm1hbGl6ZWQgdmFsdWUuCk5PUk1BTElaRURfT1NfSUQgPSB7fQoKIzogVHJhbnNsYXRpb24gdGFibGUgZm9yIG5vcm1hbGl6aW5nIHRoZSAiRGlzdHJpYnV0b3IgSUQiIGF0dHJpYnV0ZSByZXR1cm5lZCBieQojOiB0aGUgbHNiX3JlbGVhc2UgY29tbWFuZCwgZm9yIHVzZSBieSB0aGUgOmZ1bmM6YGRpc3Ryby5pZGAgbWV0aG9kLgojOgojOiAqIEtleTogVmFsdWUgYXMgcmV0dXJuZWQgYnkgdGhlIGxzYl9yZWxlYXNlIGNvbW1hbmQsIHRyYW5zbGF0ZWQgdG8gbG93ZXIKIzogICBjYXNlLCB3aXRoIGJsYW5rcyB0cmFuc2xhdGVkIHRvIHVuZGVyc2NvcmVzLgojOgojOiAqIFZhbHVlOiBOb3JtYWxpemVkIHZhbHVlLgpOT1JNQUxJWkVEX0xTQl9JRCA9IHsKICAgICdlbnRlcnByaXNlZW50ZXJwcmlzZSc6ICdvcmFjbGUnLCAgIyBPcmFjbGUgRW50ZXJwcmlzZSBMaW51eAogICAgJ3JlZGhhdGVudGVycHJpc2V3b3Jrc3RhdGlvbic6ICdyaGVsJywgICMgUkhFTCA2LjcKfQoKIzogVHJhbnNsYXRpb24gdGFibGUgZm9yIG5vcm1hbGl6aW5nIHRoZSBkaXN0cm8gSUQgZGVyaXZlZCBmcm9tIHRoZSBmaWxlIG5hbWUKIzogb2YgZGlzdHJvIHJlbGVhc2UgZmlsZXMsIGZvciB1c2UgYnkgdGhlIDpmdW5jOmBkaXN0cm8uaWRgIG1ldGhvZC4KIzoKIzogKiBLZXk6IFZhbHVlIGFzIGRlcml2ZWQgZnJvbSB0aGUgZmlsZSBuYW1lIG9mIGEgZGlzdHJvIHJlbGVhc2UgZmlsZSwKIzogICB0cmFuc2xhdGVkIHRvIGxvd2VyIGNhc2UsIHdpdGggYmxhbmtzIHRyYW5zbGF0ZWQgdG8gdW5kZXJzY29yZXMuCiM6CiM6ICogVmFsdWU6IE5vcm1hbGl6ZWQgdmFsdWUuCk5PUk1BTElaRURfRElTVFJPX0lEID0gewogICAgJ3JlZGhhdCc6ICdyaGVsJywgICMgUkhFTCA2LngsIDcueAp9CgojIFBhdHRlcm4gZm9yIGNvbnRlbnQgb2YgZGlzdHJvIHJlbGVhc2UgZmlsZSAocmV2ZXJzZWQpCl9ESVNUUk9fUkVMRUFTRV9DT05URU5UX1JFVkVSU0VEX1BBVFRFUk4gPSByZS5jb21waWxlKAogICAgcicoPzpbXildKlwpKC4qKVwoKT8gKig/OlNUTCApPyhbXGQuK1wtYS16XSpcZCkgKig/OmVzYWVsZXIgKik/KC4rKScpCgojIFBhdHRlcm4gZm9yIGJhc2UgZmlsZSBuYW1lIG9mIGRpc3RybyByZWxlYXNlIGZpbGUKX0RJU1RST19SRUxFQVNFX0JBU0VOQU1FX1BBVFRFUk4gPSByZS5jb21waWxlKAogICAgcicoXHcrKVstX10ocmVsZWFzZXx2ZXJzaW9uKSQnKQoKIyBCYXNlIGZpbGUgbmFtZXMgdG8gYmUgaWdub3JlZCB3aGVuIHNlYXJjaGluZyBmb3IgZGlzdHJvIHJlbGVhc2UgZmlsZQpfRElTVFJPX1JFTEVBU0VfSUdOT1JFX0JBU0VOQU1FUyA9ICgKICAgICdkZWJpYW5fdmVyc2lvbicsCiAgICAnbHNiLXJlbGVhc2UnLAogICAgJ29lbS1yZWxlYXNlJywKICAgIF9PU19SRUxFQVNFX0JBU0VOQU1FLAogICAgJ3N5c3RlbS1yZWxlYXNlJwopCgoKZGVmIGxpbnV4X2Rpc3RyaWJ1dGlvbihmdWxsX2Rpc3RyaWJ1dGlvbl9uYW1lPVRydWUpOgogICAgIiIiCiAgICBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgTGludXggZGlzdHJpYnV0aW9uIGFzIGEgdHVwbGUKICAgIGBgKGlkX25hbWUsIHZlcnNpb24sIGNvZGVuYW1lKWBgIHdpdGggaXRlbXMgYXMgZm9sbG93czoKCiAgICAqIGBgaWRfbmFtZWBgOiAgSWYgKmZ1bGxfZGlzdHJpYnV0aW9uX25hbWUqIGlzIGZhbHNlLCB0aGUgcmVzdWx0IG9mCiAgICAgIDpmdW5jOmBkaXN0cm8uaWRgLiBPdGhlcndpc2UsIHRoZSByZXN1bHQgb2YgOmZ1bmM6YGRpc3Ryby5uYW1lYC4KCiAgICAqIGBgdmVyc2lvbmBgOiAgVGhlIHJlc3VsdCBvZiA6ZnVuYzpgZGlzdHJvLnZlcnNpb25gLgoKICAgICogYGBjb2RlbmFtZWBgOiAgVGhlIHJlc3VsdCBvZiA6ZnVuYzpgZGlzdHJvLmNvZGVuYW1lYC4KCiAgICBUaGUgaW50ZXJmYWNlIG9mIHRoaXMgZnVuY3Rpb24gaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBvcmlnaW5hbAogICAgOnB5OmZ1bmM6YHBsYXRmb3JtLmxpbnV4X2Rpc3RyaWJ1dGlvbmAgZnVuY3Rpb24sIHN1cHBvcnRpbmcgYSBzdWJzZXQgb2YKICAgIGl0cyBwYXJhbWV0ZXJzLgoKICAgIFRoZSBkYXRhIGl0IHJldHVybnMgbWF5IG5vdCBleGFjdGx5IGJlIHRoZSBzYW1lLCBiZWNhdXNlIGl0IHVzZXMgbW9yZSBkYXRhCiAgICBzb3VyY2VzIHRoYW4gdGhlIG9yaWdpbmFsIGZ1bmN0aW9uLCBhbmQgdGhhdCBtYXkgbGVhZCB0byBkaWZmZXJlbnQgZGF0YSBpZgogICAgdGhlIExpbnV4IGRpc3RyaWJ1dGlvbiBpcyBub3QgY29uc2lzdGVudCBhY3Jvc3MgbXVsdGlwbGUgZGF0YSBzb3VyY2VzIGl0CiAgICBwcm92aWRlcyAodGhlcmUgYXJlIGluZGVlZCBzdWNoIGRpc3RyaWJ1dGlvbnMgLi4uKS4KCiAgICBBbm90aGVyIHJlYXNvbiBmb3IgZGlmZmVyZW5jZXMgaXMgdGhlIGZhY3QgdGhhdCB0aGUgOmZ1bmM6YGRpc3Ryby5pZGAKICAgIG1ldGhvZCBub3JtYWxpemVzIHRoZSBkaXN0cm8gSUQgc3RyaW5nIHRvIGEgcmVsaWFibGUgbWFjaGluZS1yZWFkYWJsZSB2YWx1ZQogICAgZm9yIGEgbnVtYmVyIG9mIHBvcHVsYXIgTGludXggZGlzdHJpYnV0aW9ucy4KICAgICIiIgogICAgcmV0dXJuIF9kaXN0cm8ubGludXhfZGlzdHJpYnV0aW9uKGZ1bGxfZGlzdHJpYnV0aW9uX25hbWUpCgoKZGVmIGlkKCk6CiAgICAiIiIKICAgIFJldHVybiB0aGUgZGlzdHJvIElEIG9mIHRoZSBjdXJyZW50IExpbnV4IGRpc3RyaWJ1dGlvbiwgYXMgYQogICAgbWFjaGluZS1yZWFkYWJsZSBzdHJpbmcuCgogICAgRm9yIGEgbnVtYmVyIG9mIExpbnV4IGRpc3RyaWJ1dGlvbnMsIHRoZSByZXR1cm5lZCBkaXN0cm8gSUQgdmFsdWUgaXMKICAgICpyZWxpYWJsZSosIGluIHRoZSBzZW5zZSB0aGF0IGl0IGlzIGRvY3VtZW50ZWQgYW5kIHRoYXQgaXQgZG9lcyBub3QgY2hhbmdlCiAgICBhY3Jvc3MgcmVsZWFzZXMgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KCiAgICBUaGlzIHBhY2thZ2UgbWFpbnRhaW5zIHRoZSBmb2xsb3dpbmcgcmVsaWFibGUgZGlzdHJvIElEIHZhbHVlczoKCiAgICA9PT09PT09PT09PT09PSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIERpc3RybyBJRCAgICAgICBEaXN0cmlidXRpb24KICAgID09PT09PT09PT09PT09ICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgInVidW50dSIgICAgICAgIFVidW50dQogICAgImRlYmlhbiIgICAgICAgIERlYmlhbgogICAgInJoZWwiICAgICAgICAgIFJlZEhhdCBFbnRlcnByaXNlIExpbnV4CiAgICAiY2VudG9zIiAgICAgICAgQ2VudE9TCiAgICAiZmVkb3JhIiAgICAgICAgRmVkb3JhCiAgICAic2xlcyIgICAgICAgICAgU1VTRSBMaW51eCBFbnRlcnByaXNlIFNlcnZlcgogICAgIm9wZW5zdXNlIiAgICAgIG9wZW5TVVNFCiAgICAiYW1hem9uIiAgICAgICAgQW1hem9uIExpbnV4CiAgICAiYXJjaCIgICAgICAgICAgQXJjaCBMaW51eAogICAgImNsb3VkbGludXgiICAgIENsb3VkTGludXggT1MKICAgICJleGhlcmJvIiAgICAgICBFeGhlcmJvIExpbnV4CiAgICAiZ2VudG9vIiAgICAgICAgR2VuVG9vIExpbnV4CiAgICAiaWJtX3Bvd2Vya3ZtIiAgSUJNIFBvd2VyS1ZNCiAgICAia3ZtaWJtIiAgICAgICAgS1ZNIGZvciBJQk0geiBTeXN0ZW1zCiAgICAibGludXhtaW50IiAgICAgTGludXggTWludAogICAgIm1hZ2VpYSIgICAgICAgIE1hZ2VpYQogICAgIm1hbmRyaXZhIiAgICAgIE1hbmRyaXZhIExpbnV4CiAgICAicGFyYWxsZWxzIiAgICAgUGFyYWxsZWxzCiAgICAicGlkb3JhIiAgICAgICAgUGlkb3JhCiAgICAicmFzcGJpYW4iICAgICAgUmFzcGJpYW4KICAgICJvcmFjbGUiICAgICAgICBPcmFjbGUgTGludXggKGFuZCBPcmFjbGUgRW50ZXJwcmlzZSBMaW51eCkKICAgICJzY2llbnRpZmljIiAgICBTY2llbnRpZmljIExpbnV4CiAgICAic2xhY2t3YXJlIiAgICAgU2xhY2t3YXJlCiAgICAieGVuc2VydmVyIiAgICAgWGVuU2VydmVyCiAgICA9PT09PT09PT09PT09PSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBJZiB5b3UgaGF2ZSBhIG5lZWQgdG8gZ2V0IGRpc3Ryb3MgZm9yIHJlbGlhYmxlIElEcyBhZGRlZCBpbnRvIHRoaXMgc2V0LAogICAgb3IgaWYgeW91IGZpbmQgdGhhdCB0aGUgOmZ1bmM6YGRpc3Ryby5pZGAgZnVuY3Rpb24gcmV0dXJucyBhIGRpZmZlcmVudAogICAgZGlzdHJvIElEIGZvciBvbmUgb2YgdGhlIGxpc3RlZCBkaXN0cm9zLCBwbGVhc2UgY3JlYXRlIGFuIGlzc3VlIGluIHRoZQogICAgYGRpc3RybyBpc3N1ZSB0cmFja2VyYF8uCgogICAgKipMb29rdXAgaGllcmFyY2h5IGFuZCB0cmFuc2Zvcm1hdGlvbnM6KioKCiAgICBGaXJzdCwgdGhlIElEIGlzIG9idGFpbmVkIGZyb20gdGhlIGZvbGxvd2luZyBzb3VyY2VzLCBpbiB0aGUgc3BlY2lmaWVkCiAgICBvcmRlci4gVGhlIGZpcnN0IGF2YWlsYWJsZSBhbmQgbm9uLWVtcHR5IHZhbHVlIGlzIHVzZWQ6CgogICAgKiB0aGUgdmFsdWUgb2YgdGhlICJJRCIgYXR0cmlidXRlIG9mIHRoZSBvcy1yZWxlYXNlIGZpbGUsCgogICAgKiB0aGUgdmFsdWUgb2YgdGhlICJEaXN0cmlidXRvciBJRCIgYXR0cmlidXRlIHJldHVybmVkIGJ5IHRoZSBsc2JfcmVsZWFzZQogICAgICBjb21tYW5kLAoKICAgICogdGhlIGZpcnN0IHBhcnQgb2YgdGhlIGZpbGUgbmFtZSBvZiB0aGUgZGlzdHJvIHJlbGVhc2UgZmlsZSwKCiAgICBUaGUgc28gZGV0ZXJtaW5lZCBJRCB2YWx1ZSB0aGVuIHBhc3NlcyB0aGUgZm9sbG93aW5nIHRyYW5zZm9ybWF0aW9ucywKICAgIGJlZm9yZSBpdCBpcyByZXR1cm5lZCBieSB0aGlzIG1ldGhvZDoKCiAgICAqIGl0IGlzIHRyYW5zbGF0ZWQgdG8gbG93ZXIgY2FzZSwKCiAgICAqIGJsYW5rcyAod2hpY2ggc2hvdWxkIG5vdCBiZSB0aGVyZSBhbnl3YXkpIGFyZSB0cmFuc2xhdGVkIHRvIHVuZGVyc2NvcmVzLAoKICAgICogYSBub3JtYWxpemF0aW9uIG9mIHRoZSBJRCBpcyBwZXJmb3JtZWQsIGJhc2VkIHVwb24KICAgICAgYG5vcm1hbGl6YXRpb24gdGFibGVzYF8uIFRoZSBwdXJwb3NlIG9mIHRoaXMgbm9ybWFsaXphdGlvbiBpcyB0byBlbnN1cmUKICAgICAgdGhhdCB0aGUgSUQgaXMgYXMgcmVsaWFibGUgYXMgcG9zc2libGUsIGV2ZW4gYWNyb3NzIGluY29tcGF0aWJsZSBjaGFuZ2VzCiAgICAgIGluIHRoZSBMaW51eCBkaXN0cmlidXRpb25zLiBBIGNvbW1vbiByZWFzb24gZm9yIGFuIGluY29tcGF0aWJsZSBjaGFuZ2UgaXMKICAgICAgdGhlIGFkZGl0aW9uIG9mIGFuIG9zLXJlbGVhc2UgZmlsZSwgb3IgdGhlIGFkZGl0aW9uIG9mIHRoZSBsc2JfcmVsZWFzZQogICAgICBjb21tYW5kLCB3aXRoIElEIHZhbHVlcyB0aGF0IGRpZmZlciBmcm9tIHdoYXQgd2FzIHByZXZpb3VzbHkgZGV0ZXJtaW5lZAogICAgICBmcm9tIHRoZSBkaXN0cm8gcmVsZWFzZSBmaWxlIG5hbWUuCiAgICAiIiIKICAgIHJldHVybiBfZGlzdHJvLmlkKCkKCgpkZWYgbmFtZShwcmV0dHk9RmFsc2UpOgogICAgIiIiCiAgICBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgTGludXggZGlzdHJpYnV0aW9uLCBhcyBhIGh1bWFuLXJlYWRhYmxlCiAgICBzdHJpbmcuCgogICAgSWYgKnByZXR0eSogaXMgZmFsc2UsIHRoZSBuYW1lIGlzIHJldHVybmVkIHdpdGhvdXQgdmVyc2lvbiBvciBjb2RlbmFtZS4KICAgIChlLmcuICJDZW50T1MgTGludXgiKQoKICAgIElmICpwcmV0dHkqIGlzIHRydWUsIHRoZSB2ZXJzaW9uIGFuZCBjb2RlbmFtZSBhcmUgYXBwZW5kZWQuCiAgICAoZS5nLiAiQ2VudE9TIExpbnV4IDcuMS4xNTAzIChDb3JlKSIpCgogICAgKipMb29rdXAgaGllcmFyY2h5OioqCgogICAgVGhlIG5hbWUgaXMgb2J0YWluZWQgZnJvbSB0aGUgZm9sbG93aW5nIHNvdXJjZXMsIGluIHRoZSBzcGVjaWZpZWQgb3JkZXIuCiAgICBUaGUgZmlyc3QgYXZhaWxhYmxlIGFuZCBub24tZW1wdHkgdmFsdWUgaXMgdXNlZDoKCiAgICAqIElmICpwcmV0dHkqIGlzIGZhbHNlOgoKICAgICAgLSB0aGUgdmFsdWUgb2YgdGhlICJOQU1FIiBhdHRyaWJ1dGUgb2YgdGhlIG9zLXJlbGVhc2UgZmlsZSwKCiAgICAgIC0gdGhlIHZhbHVlIG9mIHRoZSAiRGlzdHJpYnV0b3IgSUQiIGF0dHJpYnV0ZSByZXR1cm5lZCBieSB0aGUgbHNiX3JlbGVhc2UKICAgICAgICBjb21tYW5kLAoKICAgICAgLSB0aGUgdmFsdWUgb2YgdGhlICI8bmFtZT4iIGZpZWxkIG9mIHRoZSBkaXN0cm8gcmVsZWFzZSBmaWxlLgoKICAgICogSWYgKnByZXR0eSogaXMgdHJ1ZToKCiAgICAgIC0gdGhlIHZhbHVlIG9mIHRoZSAiUFJFVFRZX05BTUUiIGF0dHJpYnV0ZSBvZiB0aGUgb3MtcmVsZWFzZSBmaWxlLAoKICAgICAgLSB0aGUgdmFsdWUgb2YgdGhlICJEZXNjcmlwdGlvbiIgYXR0cmlidXRlIHJldHVybmVkIGJ5IHRoZSBsc2JfcmVsZWFzZQogICAgICAgIGNvbW1hbmQsCgogICAgICAtIHRoZSB2YWx1ZSBvZiB0aGUgIjxuYW1lPiIgZmllbGQgb2YgdGhlIGRpc3RybyByZWxlYXNlIGZpbGUsIGFwcGVuZGVkCiAgICAgICAgd2l0aCB0aGUgdmFsdWUgb2YgdGhlIHByZXR0eSB2ZXJzaW9uICgiPHZlcnNpb25faWQ+IiBhbmQgIjxjb2RlbmFtZT4iCiAgICAgICAgZmllbGRzKSBvZiB0aGUgZGlzdHJvIHJlbGVhc2UgZmlsZSwgaWYgYXZhaWxhYmxlLgogICAgIiIiCiAgICByZXR1cm4gX2Rpc3Ryby5uYW1lKHByZXR0eSkKCgpkZWYgdmVyc2lvbihwcmV0dHk9RmFsc2UsIGJlc3Q9RmFsc2UpOgogICAgIiIiCiAgICBSZXR1cm4gdGhlIHZlcnNpb24gb2YgdGhlIGN1cnJlbnQgTGludXggZGlzdHJpYnV0aW9uLCBhcyBhIGh1bWFuLXJlYWRhYmxlCiAgICBzdHJpbmcuCgogICAgSWYgKnByZXR0eSogaXMgZmFsc2UsIHRoZSB2ZXJzaW9uIGlzIHJldHVybmVkIHdpdGhvdXQgY29kZW5hbWUgKGUuZy4KICAgICI3LjAiKS4KCiAgICBJZiAqcHJldHR5KiBpcyB0cnVlLCB0aGUgY29kZW5hbWUgaW4gcGFyZW50aGVzaXMgaXMgYXBwZW5kZWQsIGlmIHRoZQogICAgY29kZW5hbWUgaXMgbm9uLWVtcHR5IChlLmcuICI3LjAgKE1haXBvKSIpLgoKICAgIFNvbWUgZGlzdHJpYnV0aW9ucyBwcm92aWRlIHZlcnNpb24gbnVtYmVycyB3aXRoIGRpZmZlcmVudCBwcmVjaXNpb25zIGluCiAgICB0aGUgZGlmZmVyZW50IHNvdXJjZXMgb2YgZGlzdHJpYnV0aW9uIGluZm9ybWF0aW9uLiBFeGFtaW5pbmcgdGhlIGRpZmZlcmVudAogICAgc291cmNlcyBpbiBhIGZpeGVkIHByaW9yaXR5IG9yZGVyIGRvZXMgbm90IGFsd2F5cyB5aWVsZCB0aGUgbW9zdCBwcmVjaXNlCiAgICB2ZXJzaW9uIChlLmcuIGZvciBEZWJpYW4gOC4yLCBvciBDZW50T1MgNy4xKS4KCiAgICBUaGUgKmJlc3QqIHBhcmFtZXRlciBjYW4gYmUgdXNlZCB0byBjb250cm9sIHRoZSBhcHByb2FjaCBmb3IgdGhlIHJldHVybmVkCiAgICB2ZXJzaW9uOgoKICAgIElmICpiZXN0KiBpcyBmYWxzZSwgdGhlIGZpcnN0IG5vbi1lbXB0eSB2ZXJzaW9uIG51bWJlciBpbiBwcmlvcml0eSBvcmRlciBvZgogICAgdGhlIGV4YW1pbmVkIHNvdXJjZXMgaXMgcmV0dXJuZWQuCgogICAgSWYgKmJlc3QqIGlzIHRydWUsIHRoZSBtb3N0IHByZWNpc2UgdmVyc2lvbiBudW1iZXIgb3V0IG9mIGFsbCBleGFtaW5lZAogICAgc291cmNlcyBpcyByZXR1cm5lZC4KCiAgICAqKkxvb2t1cCBoaWVyYXJjaHk6KioKCiAgICBJbiBhbGwgY2FzZXMsIHRoZSB2ZXJzaW9uIG51bWJlciBpcyBvYnRhaW5lZCBmcm9tIHRoZSBmb2xsb3dpbmcgc291cmNlcy4KICAgIElmICpiZXN0KiBpcyBmYWxzZSwgdGhpcyBvcmRlciByZXByZXNlbnRzIHRoZSBwcmlvcml0eSBvcmRlcjoKCiAgICAqIHRoZSB2YWx1ZSBvZiB0aGUgIlZFUlNJT05fSUQiIGF0dHJpYnV0ZSBvZiB0aGUgb3MtcmVsZWFzZSBmaWxlLAogICAgKiB0aGUgdmFsdWUgb2YgdGhlICJSZWxlYXNlIiBhdHRyaWJ1dGUgcmV0dXJuZWQgYnkgdGhlIGxzYl9yZWxlYXNlCiAgICAgIGNvbW1hbmQsCiAgICAqIHRoZSB2ZXJzaW9uIG51bWJlciBwYXJzZWQgZnJvbSB0aGUgIjx2ZXJzaW9uX2lkPiIgZmllbGQgb2YgdGhlIGZpcnN0IGxpbmUKICAgICAgb2YgdGhlIGRpc3RybyByZWxlYXNlIGZpbGUsCiAgICAqIHRoZSB2ZXJzaW9uIG51bWJlciBwYXJzZWQgZnJvbSB0aGUgIlBSRVRUWV9OQU1FIiBhdHRyaWJ1dGUgb2YgdGhlCiAgICAgIG9zLXJlbGVhc2UgZmlsZSwgaWYgaXQgZm9sbG93cyB0aGUgZm9ybWF0IG9mIHRoZSBkaXN0cm8gcmVsZWFzZSBmaWxlcy4KICAgICogdGhlIHZlcnNpb24gbnVtYmVyIHBhcnNlZCBmcm9tIHRoZSAiRGVzY3JpcHRpb24iIGF0dHJpYnV0ZSByZXR1cm5lZCBieQogICAgICB0aGUgbHNiX3JlbGVhc2UgY29tbWFuZCwgaWYgaXQgZm9sbG93cyB0aGUgZm9ybWF0IG9mIHRoZSBkaXN0cm8gcmVsZWFzZQogICAgICBmaWxlcy4KICAgICIiIgogICAgcmV0dXJuIF9kaXN0cm8udmVyc2lvbihwcmV0dHksIGJlc3QpCgoKZGVmIHZlcnNpb25fcGFydHMoYmVzdD1GYWxzZSk6CiAgICAiIiIKICAgIFJldHVybiB0aGUgdmVyc2lvbiBvZiB0aGUgY3VycmVudCBMaW51eCBkaXN0cmlidXRpb24gYXMgYSB0dXBsZQogICAgYGAobWFqb3IsIG1pbm9yLCBidWlsZF9udW1iZXIpYGAgd2l0aCBpdGVtcyBhcyBmb2xsb3dzOgoKICAgICogYGBtYWpvcmBgOiAgVGhlIHJlc3VsdCBvZiA6ZnVuYzpgZGlzdHJvLm1ham9yX3ZlcnNpb25gLgoKICAgICogYGBtaW5vcmBgOiAgVGhlIHJlc3VsdCBvZiA6ZnVuYzpgZGlzdHJvLm1pbm9yX3ZlcnNpb25gLgoKICAgICogYGBidWlsZF9udW1iZXJgYDogIFRoZSByZXN1bHQgb2YgOmZ1bmM6YGRpc3Ryby5idWlsZF9udW1iZXJgLgoKICAgIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSAqYmVzdCogcGFyYW1ldGVyLCBzZWUgdGhlIDpmdW5jOmBkaXN0cm8udmVyc2lvbmAKICAgIG1ldGhvZC4KICAgICIiIgogICAgcmV0dXJuIF9kaXN0cm8udmVyc2lvbl9wYXJ0cyhiZXN0KQoKCmRlZiBtYWpvcl92ZXJzaW9uKGJlc3Q9RmFsc2UpOgogICAgIiIiCiAgICBSZXR1cm4gdGhlIG1ham9yIHZlcnNpb24gb2YgdGhlIGN1cnJlbnQgTGludXggZGlzdHJpYnV0aW9uLCBhcyBhIHN0cmluZywKICAgIGlmIHByb3ZpZGVkLgogICAgT3RoZXJ3aXNlLCB0aGUgZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLiBUaGUgbWFqb3IgdmVyc2lvbiBpcyB0aGUgZmlyc3QKICAgIHBhcnQgb2YgdGhlIGRvdC1zZXBhcmF0ZWQgdmVyc2lvbiBzdHJpbmcuCgogICAgRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlICpiZXN0KiBwYXJhbWV0ZXIsIHNlZSB0aGUgOmZ1bmM6YGRpc3Ryby52ZXJzaW9uYAogICAgbWV0aG9kLgogICAgIiIiCiAgICByZXR1cm4gX2Rpc3Ryby5tYWpvcl92ZXJzaW9uKGJlc3QpCgoKZGVmIG1pbm9yX3ZlcnNpb24oYmVzdD1GYWxzZSk6CiAgICAiIiIKICAgIFJldHVybiB0aGUgbWlub3IgdmVyc2lvbiBvZiB0aGUgY3VycmVudCBMaW51eCBkaXN0cmlidXRpb24sIGFzIGEgc3RyaW5nLAogICAgaWYgcHJvdmlkZWQuCiAgICBPdGhlcndpc2UsIHRoZSBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQuIFRoZSBtaW5vciB2ZXJzaW9uIGlzIHRoZSBzZWNvbmQKICAgIHBhcnQgb2YgdGhlIGRvdC1zZXBhcmF0ZWQgdmVyc2lvbiBzdHJpbmcuCgogICAgRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlICpiZXN0KiBwYXJhbWV0ZXIsIHNlZSB0aGUgOmZ1bmM6YGRpc3Ryby52ZXJzaW9uYAogICAgbWV0aG9kLgogICAgIiIiCiAgICByZXR1cm4gX2Rpc3Ryby5taW5vcl92ZXJzaW9uKGJlc3QpCgoKZGVmIGJ1aWxkX251bWJlcihiZXN0PUZhbHNlKToKICAgICIiIgogICAgUmV0dXJuIHRoZSBidWlsZCBudW1iZXIgb2YgdGhlIGN1cnJlbnQgTGludXggZGlzdHJpYnV0aW9uLCBhcyBhIHN0cmluZywKICAgIGlmIHByb3ZpZGVkLgogICAgT3RoZXJ3aXNlLCB0aGUgZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLiBUaGUgYnVpbGQgbnVtYmVyIGlzIHRoZSB0aGlyZCBwYXJ0CiAgICBvZiB0aGUgZG90LXNlcGFyYXRlZCB2ZXJzaW9uIHN0cmluZy4KCiAgICBGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgKmJlc3QqIHBhcmFtZXRlciwgc2VlIHRoZSA6ZnVuYzpgZGlzdHJvLnZlcnNpb25gCiAgICBtZXRob2QuCiAgICAiIiIKICAgIHJldHVybiBfZGlzdHJvLmJ1aWxkX251bWJlcihiZXN0KQoKCmRlZiBsaWtlKCk6CiAgICAiIiIKICAgIFJldHVybiBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGRpc3RybyBJRHMgb2YgZGlzdHJpYnV0aW9ucyB0aGF0IGFyZQogICAgY2xvc2VseSByZWxhdGVkIHRvIHRoZSBjdXJyZW50IExpbnV4IGRpc3RyaWJ1dGlvbiBpbiByZWdhcmRzIHRvIHBhY2thZ2luZwogICAgYW5kIHByb2dyYW1taW5nIGludGVyZmFjZXMsIGZvciBleGFtcGxlIGRpc3RyaWJ1dGlvbnMgdGhlIGN1cnJlbnQKICAgIGRpc3RyaWJ1dGlvbiBpcyBhIGRlcml2YXRpdmUgZnJvbS4KCiAgICAqKkxvb2t1cCBoaWVyYXJjaHk6KioKCiAgICBUaGlzIGluZm9ybWF0aW9uIGl0ZW0gaXMgb25seSBwcm92aWRlZCBieSB0aGUgb3MtcmVsZWFzZSBmaWxlLgogICAgRm9yIGRldGFpbHMsIHNlZSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlICJJRF9MSUtFIiBhdHRyaWJ1dGUgaW4gdGhlCiAgICBgb3MtcmVsZWFzZSBtYW4gcGFnZQogICAgPGh0dHA6Ly93d3cuZnJlZWRlc2t0b3Aub3JnL3NvZnR3YXJlL3N5c3RlbWQvbWFuL29zLXJlbGVhc2UuaHRtbD5gXy4KICAgICIiIgogICAgcmV0dXJuIF9kaXN0cm8ubGlrZSgpCgoKZGVmIGNvZGVuYW1lKCk6CiAgICAiIiIKICAgIFJldHVybiB0aGUgY29kZW5hbWUgZm9yIHRoZSByZWxlYXNlIG9mIHRoZSBjdXJyZW50IExpbnV4IGRpc3RyaWJ1dGlvbiwKICAgIGFzIGEgc3RyaW5nLgoKICAgIElmIHRoZSBkaXN0cmlidXRpb24gZG9lcyBub3QgaGF2ZSBhIGNvZGVuYW1lLCBhbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQuCgogICAgTm90ZSB0aGF0IHRoZSByZXR1cm5lZCBjb2RlbmFtZSBpcyBub3QgYWx3YXlzIHJlYWxseSBhIGNvZGVuYW1lLiBGb3IKICAgIGV4YW1wbGUsIG9wZW5TVVNFIHJldHVybnMgIng4Nl82NCIuIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaGFuZGxlIHN1Y2gKICAgIGNhc2VzIGluIGFueSBzcGVjaWFsIHdheSBhbmQganVzdCByZXR1cm5zIHRoZSBzdHJpbmcgaXQgZmluZHMsIGlmIGFueS4KCiAgICAqKkxvb2t1cCBoaWVyYXJjaHk6KioKCiAgICAqIHRoZSBjb2RlbmFtZSB3aXRoaW4gdGhlICJWRVJTSU9OIiBhdHRyaWJ1dGUgb2YgdGhlIG9zLXJlbGVhc2UgZmlsZSwgaWYKICAgICAgcHJvdmlkZWQsCgogICAgKiB0aGUgdmFsdWUgb2YgdGhlICJDb2RlbmFtZSIgYXR0cmlidXRlIHJldHVybmVkIGJ5IHRoZSBsc2JfcmVsZWFzZQogICAgICBjb21tYW5kLAoKICAgICogdGhlIHZhbHVlIG9mIHRoZSAiPGNvZGVuYW1lPiIgZmllbGQgb2YgdGhlIGRpc3RybyByZWxlYXNlIGZpbGUuCiAgICAiIiIKICAgIHJldHVybiBfZGlzdHJvLmNvZGVuYW1lKCkKCgpkZWYgaW5mbyhwcmV0dHk9RmFsc2UsIGJlc3Q9RmFsc2UpOgogICAgIiIiCiAgICBSZXR1cm4gY2VydGFpbiBtYWNoaW5lLXJlYWRhYmxlIGluZm9ybWF0aW9uIGl0ZW1zIGFib3V0IHRoZSBjdXJyZW50IExpbnV4CiAgICBkaXN0cmlidXRpb24gaW4gYSBkaWN0aW9uYXJ5LCBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6CgogICAgLi4gc291cmNlY29kZTo6IHB5dGhvbgoKICAgICAgICB7CiAgICAgICAgICAgICdpZCc6ICdyaGVsJywKICAgICAgICAgICAgJ3ZlcnNpb24nOiAnNy4wJywKICAgICAgICAgICAgJ3ZlcnNpb25fcGFydHMnOiB7CiAgICAgICAgICAgICAgICAnbWFqb3InOiAnNycsCiAgICAgICAgICAgICAgICAnbWlub3InOiAnMCcsCiAgICAgICAgICAgICAgICAnYnVpbGRfbnVtYmVyJzogJycKICAgICAgICAgICAgfSwKICAgICAgICAgICAgJ2xpa2UnOiAnZmVkb3JhJywKICAgICAgICAgICAgJ2NvZGVuYW1lJzogJ01haXBvJwogICAgICAgIH0KCiAgICBUaGUgZGljdGlvbmFyeSBzdHJ1Y3R1cmUgYW5kIGtleXMgYXJlIGFsd2F5cyB0aGUgc2FtZSwgcmVnYXJkbGVzcyBvZiB3aGljaAogICAgaW5mb3JtYXRpb24gaXRlbXMgYXJlIGF2YWlsYWJsZSBpbiB0aGUgdW5kZXJseWluZyBkYXRhIHNvdXJjZXMuIFRoZSB2YWx1ZXMKICAgIGZvciB0aGUgdmFyaW91cyBrZXlzIGFyZSBhcyBmb2xsb3dzOgoKICAgICogYGBpZGBgOiAgVGhlIHJlc3VsdCBvZiA6ZnVuYzpgZGlzdHJvLmlkYC4KCiAgICAqIGBgdmVyc2lvbmBgOiAgVGhlIHJlc3VsdCBvZiA6ZnVuYzpgZGlzdHJvLnZlcnNpb25gLgoKICAgICogYGB2ZXJzaW9uX3BhcnRzIC0+IG1ham9yYGA6ICBUaGUgcmVzdWx0IG9mIDpmdW5jOmBkaXN0cm8ubWFqb3JfdmVyc2lvbmAuCgogICAgKiBgYHZlcnNpb25fcGFydHMgLT4gbWlub3JgYDogIFRoZSByZXN1bHQgb2YgOmZ1bmM6YGRpc3Ryby5taW5vcl92ZXJzaW9uYC4KCiAgICAqIGBgdmVyc2lvbl9wYXJ0cyAtPiBidWlsZF9udW1iZXJgYDogIFRoZSByZXN1bHQgb2YKICAgICAgOmZ1bmM6YGRpc3Ryby5idWlsZF9udW1iZXJgLgoKICAgICogYGBsaWtlYGA6ICBUaGUgcmVzdWx0IG9mIDpmdW5jOmBkaXN0cm8ubGlrZWAuCgogICAgKiBgYGNvZGVuYW1lYGA6ICBUaGUgcmVzdWx0IG9mIDpmdW5jOmBkaXN0cm8uY29kZW5hbWVgLgoKICAgIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSAqcHJldHR5KiBhbmQgKmJlc3QqIHBhcmFtZXRlcnMsIHNlZSB0aGUKICAgIDpmdW5jOmBkaXN0cm8udmVyc2lvbmAgbWV0aG9kLgogICAgIiIiCiAgICByZXR1cm4gX2Rpc3Ryby5pbmZvKHByZXR0eSwgYmVzdCkKCgpkZWYgb3NfcmVsZWFzZV9pbmZvKCk6CiAgICAiIiIKICAgIFJldHVybiBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBrZXktdmFsdWUgcGFpcnMgZm9yIHRoZSBpbmZvcm1hdGlvbiBpdGVtcwogICAgZnJvbSB0aGUgb3MtcmVsZWFzZSBmaWxlIGRhdGEgc291cmNlIG9mIHRoZSBjdXJyZW50IExpbnV4IGRpc3RyaWJ1dGlvbi4KCiAgICBTZWUgYG9zLXJlbGVhc2UgZmlsZWBfIGZvciBkZXRhaWxzIGFib3V0IHRoZXNlIGluZm9ybWF0aW9uIGl0ZW1zLgogICAgIiIiCiAgICByZXR1cm4gX2Rpc3Ryby5vc19yZWxlYXNlX2luZm8oKQoKCmRlZiBsc2JfcmVsZWFzZV9pbmZvKCk6CiAgICAiIiIKICAgIFJldHVybiBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBrZXktdmFsdWUgcGFpcnMgZm9yIHRoZSBpbmZvcm1hdGlvbiBpdGVtcwogICAgZnJvbSB0aGUgbHNiX3JlbGVhc2UgY29tbWFuZCBkYXRhIHNvdXJjZSBvZiB0aGUgY3VycmVudCBMaW51eCBkaXN0cmlidXRpb24uCgogICAgU2VlIGBsc2JfcmVsZWFzZSBjb21tYW5kIG91dHB1dGBfIGZvciBkZXRhaWxzIGFib3V0IHRoZXNlIGluZm9ybWF0aW9uCiAgICBpdGVtcy4KICAgICIiIgogICAgcmV0dXJuIF9kaXN0cm8ubHNiX3JlbGVhc2VfaW5mbygpCgoKZGVmIGRpc3Ryb19yZWxlYXNlX2luZm8oKToKICAgICIiIgogICAgUmV0dXJuIGEgZGljdGlvbmFyeSBjb250YWluaW5nIGtleS12YWx1ZSBwYWlycyBmb3IgdGhlIGluZm9ybWF0aW9uIGl0ZW1zCiAgICBmcm9tIHRoZSBkaXN0cm8gcmVsZWFzZSBmaWxlIGRhdGEgc291cmNlIG9mIHRoZSBjdXJyZW50IExpbnV4IGRpc3RyaWJ1dGlvbi4KCiAgICBTZWUgYGRpc3RybyByZWxlYXNlIGZpbGVgXyBmb3IgZGV0YWlscyBhYm91dCB0aGVzZSBpbmZvcm1hdGlvbiBpdGVtcy4KICAgICIiIgogICAgcmV0dXJuIF9kaXN0cm8uZGlzdHJvX3JlbGVhc2VfaW5mbygpCgoKZGVmIG9zX3JlbGVhc2VfYXR0cihhdHRyaWJ1dGUpOgogICAgIiIiCiAgICBSZXR1cm4gYSBzaW5nbGUgbmFtZWQgaW5mb3JtYXRpb24gaXRlbSBmcm9tIHRoZSBvcy1yZWxlYXNlIGZpbGUgZGF0YSBzb3VyY2UKICAgIG9mIHRoZSBjdXJyZW50IExpbnV4IGRpc3RyaWJ1dGlvbi4KCiAgICBQYXJhbWV0ZXJzOgoKICAgICogYGBhdHRyaWJ1dGVgYCAoc3RyaW5nKTogS2V5IG9mIHRoZSBpbmZvcm1hdGlvbiBpdGVtLgoKICAgIFJldHVybnM6CgogICAgKiAoc3RyaW5nKTogVmFsdWUgb2YgdGhlIGluZm9ybWF0aW9uIGl0ZW0sIGlmIHRoZSBpdGVtIGV4aXN0cy4KICAgICAgVGhlIGVtcHR5IHN0cmluZywgaWYgdGhlIGl0ZW0gZG9lcyBub3QgZXhpc3QuCgogICAgU2VlIGBvcy1yZWxlYXNlIGZpbGVgXyBmb3IgZGV0YWlscyBhYm91dCB0aGVzZSBpbmZvcm1hdGlvbiBpdGVtcy4KICAgICIiIgogICAgcmV0dXJuIF9kaXN0cm8ub3NfcmVsZWFzZV9hdHRyKGF0dHJpYnV0ZSkKCgpkZWYgbHNiX3JlbGVhc2VfYXR0cihhdHRyaWJ1dGUpOgogICAgIiIiCiAgICBSZXR1cm4gYSBzaW5nbGUgbmFtZWQgaW5mb3JtYXRpb24gaXRlbSBmcm9tIHRoZSBsc2JfcmVsZWFzZSBjb21tYW5kIG91dHB1dAogICAgZGF0YSBzb3VyY2Ugb2YgdGhlIGN1cnJlbnQgTGludXggZGlzdHJpYnV0aW9uLgoKICAgIFBhcmFtZXRlcnM6CgogICAgKiBgYGF0dHJpYnV0ZWBgIChzdHJpbmcpOiBLZXkgb2YgdGhlIGluZm9ybWF0aW9uIGl0ZW0uCgogICAgUmV0dXJuczoKCiAgICAqIChzdHJpbmcpOiBWYWx1ZSBvZiB0aGUgaW5mb3JtYXRpb24gaXRlbSwgaWYgdGhlIGl0ZW0gZXhpc3RzLgogICAgICBUaGUgZW1wdHkgc3RyaW5nLCBpZiB0aGUgaXRlbSBkb2VzIG5vdCBleGlzdC4KCiAgICBTZWUgYGxzYl9yZWxlYXNlIGNvbW1hbmQgb3V0cHV0YF8gZm9yIGRldGFpbHMgYWJvdXQgdGhlc2UgaW5mb3JtYXRpb24KICAgIGl0ZW1zLgogICAgIiIiCiAgICByZXR1cm4gX2Rpc3Ryby5sc2JfcmVsZWFzZV9hdHRyKGF0dHJpYnV0ZSkKCgpkZWYgZGlzdHJvX3JlbGVhc2VfYXR0cihhdHRyaWJ1dGUpOgogICAgIiIiCiAgICBSZXR1cm4gYSBzaW5nbGUgbmFtZWQgaW5mb3JtYXRpb24gaXRlbSBmcm9tIHRoZSBkaXN0cm8gcmVsZWFzZSBmaWxlCiAgICBkYXRhIHNvdXJjZSBvZiB0aGUgY3VycmVudCBMaW51eCBkaXN0cmlidXRpb24uCgogICAgUGFyYW1ldGVyczoKCiAgICAqIGBgYXR0cmlidXRlYGAgKHN0cmluZyk6IEtleSBvZiB0aGUgaW5mb3JtYXRpb24gaXRlbS4KCiAgICBSZXR1cm5zOgoKICAgICogKHN0cmluZyk6IFZhbHVlIG9mIHRoZSBpbmZvcm1hdGlvbiBpdGVtLCBpZiB0aGUgaXRlbSBleGlzdHMuCiAgICAgIFRoZSBlbXB0eSBzdHJpbmcsIGlmIHRoZSBpdGVtIGRvZXMgbm90IGV4aXN0LgoKICAgIFNlZSBgZGlzdHJvIHJlbGVhc2UgZmlsZWBfIGZvciBkZXRhaWxzIGFib3V0IHRoZXNlIGluZm9ybWF0aW9uIGl0ZW1zLgogICAgIiIiCiAgICByZXR1cm4gX2Rpc3Ryby5kaXN0cm9fcmVsZWFzZV9hdHRyKGF0dHJpYnV0ZSkKCgpjbGFzcyBMaW51eERpc3RyaWJ1dGlvbihvYmplY3QpOgogICAgIiIiCiAgICBQcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCBhIExpbnV4IGRpc3RyaWJ1dGlvbi4KCiAgICBUaGlzIHBhY2thZ2UgY3JlYXRlcyBhIHByaXZhdGUgbW9kdWxlLWdsb2JhbCBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGgKICAgIGRlZmF1bHQgaW5pdGlhbGl6YXRpb24gYXJndW1lbnRzLCB0aGF0IGlzIHVzZWQgYnkgdGhlCiAgICBgY29uc29saWRhdGVkIGFjY2Vzc29yIGZ1bmN0aW9uc2BfIGFuZCBgc2luZ2xlIHNvdXJjZSBhY2Nlc3NvciBmdW5jdGlvbnNgXy4KICAgIEJ5IHVzaW5nIGRlZmF1bHQgaW5pdGlhbGl6YXRpb24gYXJndW1lbnRzLCB0aGF0IG1vZHVsZS1nbG9iYWwgaW5zdGFuY2UKICAgIHJldHVybnMgZGF0YSBhYm91dCB0aGUgY3VycmVudCBMaW51eCBkaXN0cmlidXRpb24gKGkuZS4gdGhlIGRpc3RybyB0aGlzCiAgICBwYWNrYWdlIHJ1bnMgb24pLgoKICAgIE5vcm1hbGx5LCBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGNyZWF0ZSBhZGRpdGlvbmFsIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzLgogICAgSG93ZXZlciwgaW4gc2l0dWF0aW9ucyB3aGVyZSBjb250cm9sIGlzIG5lZWRlZCBvdmVyIHRoZSBleGFjdCBkYXRhIHNvdXJjZXMKICAgIHRoYXQgYXJlIHVzZWQsIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGNhbiBiZSBjcmVhdGVkIHdpdGggYSBzcGVjaWZpYwogICAgZGlzdHJvIHJlbGVhc2UgZmlsZSwgb3IgYSBzcGVjaWZpYyBvcy1yZWxlYXNlIGZpbGUsIG9yIHdpdGhvdXQgaW52b2tpbmcgdGhlCiAgICBsc2JfcmVsZWFzZSBjb21tYW5kLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsCiAgICAgICAgICAgICAgICAgaW5jbHVkZV9sc2I9VHJ1ZSwKICAgICAgICAgICAgICAgICBvc19yZWxlYXNlX2ZpbGU9JycsCiAgICAgICAgICAgICAgICAgZGlzdHJvX3JlbGVhc2VfZmlsZT0nJyk6CiAgICAgICAgIiIiCiAgICAgICAgVGhlIGluaXRpYWxpemF0aW9uIG1ldGhvZCBvZiB0aGlzIGNsYXNzIGdhdGhlcnMgaW5mb3JtYXRpb24gZnJvbSB0aGUKICAgICAgICBhdmFpbGFibGUgZGF0YSBzb3VyY2VzLCBhbmQgc3RvcmVzIHRoYXQgaW4gcHJpdmF0ZSBpbnN0YW5jZSBhdHRyaWJ1dGVzLgogICAgICAgIFN1YnNlcXVlbnQgYWNjZXNzIHRvIHRoZSBpbmZvcm1hdGlvbiBpdGVtcyB1c2VzIHRoZXNlIHByaXZhdGUgaW5zdGFuY2UKICAgICAgICBhdHRyaWJ1dGVzLCBzbyB0aGF0IHRoZSBkYXRhIHNvdXJjZXMgYXJlIHJlYWQgb25seSBvbmNlLgoKICAgICAgICBQYXJhbWV0ZXJzOgoKICAgICAgICAqIGBgaW5jbHVkZV9sc2JgYCAoYm9vbCk6IENvbnRyb2xzIHdoZXRoZXIgdGhlCiAgICAgICAgICBgbHNiX3JlbGVhc2UgY29tbWFuZCBvdXRwdXRgXyBpcyBpbmNsdWRlZCBhcyBhIGRhdGEgc291cmNlLgoKICAgICAgICAgIElmIHRoZSBsc2JfcmVsZWFzZSBjb21tYW5kIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIHByb2dyYW0gZXhlY3V0aW9uCiAgICAgICAgICBwYXRoLCB0aGUgZGF0YSBzb3VyY2UgZm9yIHRoZSBsc2JfcmVsZWFzZSBjb21tYW5kIHdpbGwgYmUgZW1wdHkuCgogICAgICAgICogYGBvc19yZWxlYXNlX2ZpbGVgYCAoc3RyaW5nKTogVGhlIHBhdGggbmFtZSBvZiB0aGUKICAgICAgICAgIGBvcy1yZWxlYXNlIGZpbGVgXyB0aGF0IGlzIHRvIGJlIHVzZWQgYXMgYSBkYXRhIHNvdXJjZS4KCiAgICAgICAgICBBbiBlbXB0eSBzdHJpbmcgKHRoZSBkZWZhdWx0KSB3aWxsIGNhdXNlIHRoZSBkZWZhdWx0IHBhdGggbmFtZSB0bwogICAgICAgICAgYmUgdXNlZCAoc2VlIGBvcy1yZWxlYXNlIGZpbGVgXyBmb3IgZGV0YWlscykuCgogICAgICAgICAgSWYgdGhlIHNwZWNpZmllZCBvciBkZWZhdWx0ZWQgb3MtcmVsZWFzZSBmaWxlIGRvZXMgbm90IGV4aXN0LCB0aGUKICAgICAgICAgIGRhdGEgc291cmNlIGZvciB0aGUgb3MtcmVsZWFzZSBmaWxlIHdpbGwgYmUgZW1wdHkuCgogICAgICAgICogYGBkaXN0cm9fcmVsZWFzZV9maWxlYGAgKHN0cmluZyk6IFRoZSBwYXRoIG5hbWUgb2YgdGhlCiAgICAgICAgICBgZGlzdHJvIHJlbGVhc2UgZmlsZWBfIHRoYXQgaXMgdG8gYmUgdXNlZCBhcyBhIGRhdGEgc291cmNlLgoKICAgICAgICAgIEFuIGVtcHR5IHN0cmluZyAodGhlIGRlZmF1bHQpIHdpbGwgY2F1c2UgYSBkZWZhdWx0IHNlYXJjaCBhbGdvcml0aG0KICAgICAgICAgIHRvIGJlIHVzZWQgKHNlZSBgZGlzdHJvIHJlbGVhc2UgZmlsZWBfIGZvciBkZXRhaWxzKS4KCiAgICAgICAgICBJZiB0aGUgc3BlY2lmaWVkIGRpc3RybyByZWxlYXNlIGZpbGUgZG9lcyBub3QgZXhpc3QsIG9yIGlmIG5vIGRlZmF1bHQKICAgICAgICAgIGRpc3RybyByZWxlYXNlIGZpbGUgY2FuIGJlIGZvdW5kLCB0aGUgZGF0YSBzb3VyY2UgZm9yIHRoZSBkaXN0cm8KICAgICAgICAgIHJlbGVhc2UgZmlsZSB3aWxsIGJlIGVtcHR5LgoKICAgICAgICBQdWJsaWMgaW5zdGFuY2UgYXR0cmlidXRlczoKCiAgICAgICAgKiBgYG9zX3JlbGVhc2VfZmlsZWBgIChzdHJpbmcpOiBUaGUgcGF0aCBuYW1lIG9mIHRoZQogICAgICAgICAgYG9zLXJlbGVhc2UgZmlsZWBfIHRoYXQgaXMgYWN0dWFsbHkgdXNlZCBhcyBhIGRhdGEgc291cmNlLiBUaGUKICAgICAgICAgIGVtcHR5IHN0cmluZyBpZiBubyBkaXN0cm8gcmVsZWFzZSBmaWxlIGlzIHVzZWQgYXMgYSBkYXRhIHNvdXJjZS4KCiAgICAgICAgKiBgYGRpc3Ryb19yZWxlYXNlX2ZpbGVgYCAoc3RyaW5nKTogVGhlIHBhdGggbmFtZSBvZiB0aGUKICAgICAgICAgIGBkaXN0cm8gcmVsZWFzZSBmaWxlYF8gdGhhdCBpcyBhY3R1YWxseSB1c2VkIGFzIGEgZGF0YSBzb3VyY2UuIFRoZQogICAgICAgICAgZW1wdHkgc3RyaW5nIGlmIG5vIGRpc3RybyByZWxlYXNlIGZpbGUgaXMgdXNlZCBhcyBhIGRhdGEgc291cmNlLgoKICAgICAgICBSYWlzZXM6CgogICAgICAgICogOnB5OmV4YzpgSU9FcnJvcmA6IFNvbWUgSS9PIGlzc3VlIHdpdGggYW4gb3MtcmVsZWFzZSBmaWxlIG9yIGRpc3RybwogICAgICAgICAgcmVsZWFzZSBmaWxlLgoKICAgICAgICAqIDpweTpleGM6YHN1YnByb2Nlc3MuQ2FsbGVkUHJvY2Vzc0Vycm9yYDogVGhlIGxzYl9yZWxlYXNlIGNvbW1hbmQgaGFkCiAgICAgICAgICBzb21lIGlzc3VlIChvdGhlciB0aGFuIG5vdCBiZWluZyBhdmFpbGFibGUgaW4gdGhlIHByb2dyYW0gZXhlY3V0aW9uCiAgICAgICAgICBwYXRoKS4KCiAgICAgICAgKiA6cHk6ZXhjOmBVbmljb2RlRXJyb3JgOiBBIGRhdGEgc291cmNlIGhhcyB1bmV4cGVjdGVkIGNoYXJhY3RlcnMgb3IKICAgICAgICAgIHVzZXMgYW4gdW5leHBlY3RlZCBlbmNvZGluZy4KICAgICAgICAiIiIKICAgICAgICBzZWxmLm9zX3JlbGVhc2VfZmlsZSA9IG9zX3JlbGVhc2VfZmlsZSBvciBcCiAgICAgICAgICAgIG9zLnBhdGguam9pbihfVU5JWENPTkZESVIsIF9PU19SRUxFQVNFX0JBU0VOQU1FKQogICAgICAgIHNlbGYuZGlzdHJvX3JlbGVhc2VfZmlsZSA9IGRpc3Ryb19yZWxlYXNlX2ZpbGUgb3IgJycgICMgdXBkYXRlZCBsYXRlcgogICAgICAgIHNlbGYuX29zX3JlbGVhc2VfaW5mbyA9IHNlbGYuX2dldF9vc19yZWxlYXNlX2luZm8oKQogICAgICAgIHNlbGYuX2xzYl9yZWxlYXNlX2luZm8gPSBzZWxmLl9nZXRfbHNiX3JlbGVhc2VfaW5mbygpIFwKICAgICAgICAgICAgaWYgaW5jbHVkZV9sc2IgZWxzZSB7fQogICAgICAgIHNlbGYuX2Rpc3Ryb19yZWxlYXNlX2luZm8gPSBzZWxmLl9nZXRfZGlzdHJvX3JlbGVhc2VfaW5mbygpCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgICIiIlJldHVybiByZXByIG9mIGFsbCBpbmZvCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIFwKICAgICAgICAgICAgIkxpbnV4RGlzdHJpYnV0aW9uKCIgXAogICAgICAgICAgICAib3NfcmVsZWFzZV9maWxlPXswIXJ9LCAiIFwKICAgICAgICAgICAgImRpc3Ryb19yZWxlYXNlX2ZpbGU9ezEhcn0sICIgXAogICAgICAgICAgICAiX29zX3JlbGVhc2VfaW5mbz17MiFyfSwgIiBcCiAgICAgICAgICAgICJfbHNiX3JlbGVhc2VfaW5mbz17MyFyfSwgIiBcCiAgICAgICAgICAgICJfZGlzdHJvX3JlbGVhc2VfaW5mbz17NCFyfSkiLmZvcm1hdCgKICAgICAgICAgICAgICAgIHNlbGYub3NfcmVsZWFzZV9maWxlLAogICAgICAgICAgICAgICAgc2VsZi5kaXN0cm9fcmVsZWFzZV9maWxlLAogICAgICAgICAgICAgICAgc2VsZi5fb3NfcmVsZWFzZV9pbmZvLAogICAgICAgICAgICAgICAgc2VsZi5fbHNiX3JlbGVhc2VfaW5mbywKICAgICAgICAgICAgICAgIHNlbGYuX2Rpc3Ryb19yZWxlYXNlX2luZm8pCgogICAgZGVmIGxpbnV4X2Rpc3RyaWJ1dGlvbihzZWxmLCBmdWxsX2Rpc3RyaWJ1dGlvbl9uYW1lPVRydWUpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgTGludXggZGlzdHJpYnV0aW9uIHRoYXQgaXMgY29tcGF0aWJsZQogICAgICAgIHdpdGggUHl0aG9uJ3MgOmZ1bmM6YHBsYXRmb3JtLmxpbnV4X2Rpc3RyaWJ1dGlvbmAsIHN1cHBvcnRpbmcgYSBzdWJzZXQKICAgICAgICBvZiBpdHMgcGFyYW1ldGVycy4KCiAgICAgICAgRm9yIGRldGFpbHMsIHNlZSA6ZnVuYzpgZGlzdHJvLmxpbnV4X2Rpc3RyaWJ1dGlvbmAuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgc2VsZi5uYW1lKCkgaWYgZnVsbF9kaXN0cmlidXRpb25fbmFtZSBlbHNlIHNlbGYuaWQoKSwKICAgICAgICAgICAgc2VsZi52ZXJzaW9uKCksCiAgICAgICAgICAgIHNlbGYuY29kZW5hbWUoKQogICAgICAgICkKCiAgICBkZWYgaWQoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIHRoZSBkaXN0cm8gSUQgb2YgdGhlIExpbnV4IGRpc3RyaWJ1dGlvbiwgYXMgYSBzdHJpbmcuCgogICAgICAgIEZvciBkZXRhaWxzLCBzZWUgOmZ1bmM6YGRpc3Ryby5pZGAuCiAgICAgICAgIiIiCiAgICAgICAgZGVmIG5vcm1hbGl6ZShkaXN0cm9faWQsIHRhYmxlKToKICAgICAgICAgICAgZGlzdHJvX2lkID0gZGlzdHJvX2lkLmxvd2VyKCkucmVwbGFjZSgnICcsICdfJykKICAgICAgICAgICAgcmV0dXJuIHRhYmxlLmdldChkaXN0cm9faWQsIGRpc3Ryb19pZCkKCiAgICAgICAgZGlzdHJvX2lkID0gc2VsZi5vc19yZWxlYXNlX2F0dHIoJ2lkJykKICAgICAgICBpZiBkaXN0cm9faWQ6CiAgICAgICAgICAgIHJldHVybiBub3JtYWxpemUoZGlzdHJvX2lkLCBOT1JNQUxJWkVEX09TX0lEKQoKICAgICAgICBkaXN0cm9faWQgPSBzZWxmLmxzYl9yZWxlYXNlX2F0dHIoJ2Rpc3RyaWJ1dG9yX2lkJykKICAgICAgICBpZiBkaXN0cm9faWQ6CiAgICAgICAgICAgIHJldHVybiBub3JtYWxpemUoZGlzdHJvX2lkLCBOT1JNQUxJWkVEX0xTQl9JRCkKCiAgICAgICAgZGlzdHJvX2lkID0gc2VsZi5kaXN0cm9fcmVsZWFzZV9hdHRyKCdpZCcpCiAgICAgICAgaWYgZGlzdHJvX2lkOgogICAgICAgICAgICByZXR1cm4gbm9ybWFsaXplKGRpc3Ryb19pZCwgTk9STUFMSVpFRF9ESVNUUk9fSUQpCgogICAgICAgIHJldHVybiAnJwoKICAgIGRlZiBuYW1lKHNlbGYsIHByZXR0eT1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBMaW51eCBkaXN0cmlidXRpb24sIGFzIGEgc3RyaW5nLgoKICAgICAgICBGb3IgZGV0YWlscywgc2VlIDpmdW5jOmBkaXN0cm8ubmFtZWAuCiAgICAgICAgIiIiCiAgICAgICAgbmFtZSA9IHNlbGYub3NfcmVsZWFzZV9hdHRyKCduYW1lJykgXAogICAgICAgICAgICBvciBzZWxmLmxzYl9yZWxlYXNlX2F0dHIoJ2Rpc3RyaWJ1dG9yX2lkJykgXAogICAgICAgICAgICBvciBzZWxmLmRpc3Ryb19yZWxlYXNlX2F0dHIoJ25hbWUnKQogICAgICAgIGlmIHByZXR0eToKICAgICAgICAgICAgbmFtZSA9IHNlbGYub3NfcmVsZWFzZV9hdHRyKCdwcmV0dHlfbmFtZScpIFwKICAgICAgICAgICAgICAgIG9yIHNlbGYubHNiX3JlbGVhc2VfYXR0cignZGVzY3JpcHRpb24nKQogICAgICAgICAgICBpZiBub3QgbmFtZToKICAgICAgICAgICAgICAgIG5hbWUgPSBzZWxmLmRpc3Ryb19yZWxlYXNlX2F0dHIoJ25hbWUnKQogICAgICAgICAgICAgICAgdmVyc2lvbiA9IHNlbGYudmVyc2lvbihwcmV0dHk9VHJ1ZSkKICAgICAgICAgICAgICAgIGlmIHZlcnNpb246CiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUgKyAnICcgKyB2ZXJzaW9uCiAgICAgICAgcmV0dXJuIG5hbWUgb3IgJycKCiAgICBkZWYgdmVyc2lvbihzZWxmLCBwcmV0dHk9RmFsc2UsIGJlc3Q9RmFsc2UpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiB0aGUgdmVyc2lvbiBvZiB0aGUgTGludXggZGlzdHJpYnV0aW9uLCBhcyBhIHN0cmluZy4KCiAgICAgICAgRm9yIGRldGFpbHMsIHNlZSA6ZnVuYzpgZGlzdHJvLnZlcnNpb25gLgogICAgICAgICIiIgogICAgICAgIHZlcnNpb25zID0gWwogICAgICAgICAgICBzZWxmLm9zX3JlbGVhc2VfYXR0cigndmVyc2lvbl9pZCcpLAogICAgICAgICAgICBzZWxmLmxzYl9yZWxlYXNlX2F0dHIoJ3JlbGVhc2UnKSwKICAgICAgICAgICAgc2VsZi5kaXN0cm9fcmVsZWFzZV9hdHRyKCd2ZXJzaW9uX2lkJyksCiAgICAgICAgICAgIHNlbGYuX3BhcnNlX2Rpc3Ryb19yZWxlYXNlX2NvbnRlbnQoCiAgICAgICAgICAgICAgICBzZWxmLm9zX3JlbGVhc2VfYXR0cigncHJldHR5X25hbWUnKSkuZ2V0KCd2ZXJzaW9uX2lkJywgJycpLAogICAgICAgICAgICBzZWxmLl9wYXJzZV9kaXN0cm9fcmVsZWFzZV9jb250ZW50KAogICAgICAgICAgICAgICAgc2VsZi5sc2JfcmVsZWFzZV9hdHRyKCdkZXNjcmlwdGlvbicpKS5nZXQoJ3ZlcnNpb25faWQnLCAnJykKICAgICAgICBdCiAgICAgICAgdmVyc2lvbiA9ICcnCiAgICAgICAgaWYgYmVzdDoKICAgICAgICAgICAgIyBUaGlzIGFsZ29yaXRobSB1c2VzIHRoZSBsYXN0IHZlcnNpb24gaW4gcHJpb3JpdHkgb3JkZXIgdGhhdCBoYXMKICAgICAgICAgICAgIyB0aGUgYmVzdCBwcmVjaXNpb24uIElmIHRoZSB2ZXJzaW9ucyBhcmUgbm90IGluIGNvbmZsaWN0LCB0aGF0CiAgICAgICAgICAgICMgZG9lcyBub3QgbWF0dGVyOyBvdGhlcndpc2UsIHVzaW5nIHRoZSBsYXN0IG9uZSBpbnN0ZWFkIG9mIHRoZQogICAgICAgICAgICAjIGZpcnN0IG9uZSBtaWdodCBiZSBjb25zaWRlcmVkIGEgc3VycHJpc2UuCiAgICAgICAgICAgIGZvciB2IGluIHZlcnNpb25zOgogICAgICAgICAgICAgICAgaWYgdi5jb3VudCgiLiIpID4gdmVyc2lvbi5jb3VudCgiLiIpIG9yIHZlcnNpb24gPT0gJyc6CiAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiA9IHYKICAgICAgICBlbHNlOgogICAgICAgICAgICBmb3IgdiBpbiB2ZXJzaW9uczoKICAgICAgICAgICAgICAgIGlmIHYgIT0gJyc6CiAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiA9IHYKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGlmIHByZXR0eSBhbmQgdmVyc2lvbiBhbmQgc2VsZi5jb2RlbmFtZSgpOgogICAgICAgICAgICB2ZXJzaW9uID0gdSd7MH0gKHsxfSknLmZvcm1hdCh2ZXJzaW9uLCBzZWxmLmNvZGVuYW1lKCkpCiAgICAgICAgcmV0dXJuIHZlcnNpb24KCiAgICBkZWYgdmVyc2lvbl9wYXJ0cyhzZWxmLCBiZXN0PUZhbHNlKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gdGhlIHZlcnNpb24gb2YgdGhlIExpbnV4IGRpc3RyaWJ1dGlvbiwgYXMgYSB0dXBsZSBvZiB2ZXJzaW9uCiAgICAgICAgbnVtYmVycy4KCiAgICAgICAgRm9yIGRldGFpbHMsIHNlZSA6ZnVuYzpgZGlzdHJvLnZlcnNpb25fcGFydHNgLgogICAgICAgICIiIgogICAgICAgIHZlcnNpb25fc3RyID0gc2VsZi52ZXJzaW9uKGJlc3Q9YmVzdCkKICAgICAgICBpZiB2ZXJzaW9uX3N0cjoKICAgICAgICAgICAgdmVyc2lvbl9yZWdleCA9IHJlLmNvbXBpbGUocicoXGQrKVwuPyhcZCspP1wuPyhcZCspPycpCiAgICAgICAgICAgIG1hdGNoZXMgPSB2ZXJzaW9uX3JlZ2V4Lm1hdGNoKHZlcnNpb25fc3RyKQogICAgICAgICAgICBpZiBtYXRjaGVzOgogICAgICAgICAgICAgICAgbWFqb3IsIG1pbm9yLCBidWlsZF9udW1iZXIgPSBtYXRjaGVzLmdyb3VwcygpCiAgICAgICAgICAgICAgICByZXR1cm4gbWFqb3IsIG1pbm9yIG9yICcnLCBidWlsZF9udW1iZXIgb3IgJycKICAgICAgICByZXR1cm4gJycsICcnLCAnJwoKICAgIGRlZiBtYWpvcl92ZXJzaW9uKHNlbGYsIGJlc3Q9RmFsc2UpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiB0aGUgbWFqb3IgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGN1cnJlbnQgZGlzdHJpYnV0aW9uLgoKICAgICAgICBGb3IgZGV0YWlscywgc2VlIDpmdW5jOmBkaXN0cm8ubWFqb3JfdmVyc2lvbmAuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYudmVyc2lvbl9wYXJ0cyhiZXN0KVswXQoKICAgIGRlZiBtaW5vcl92ZXJzaW9uKHNlbGYsIGJlc3Q9RmFsc2UpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiB0aGUgbWlub3IgdmVyc2lvbiBudW1iZXIgb2YgdGhlIExpbnV4IGRpc3RyaWJ1dGlvbi4KCiAgICAgICAgRm9yIGRldGFpbHMsIHNlZSA6ZnVuYzpgZGlzdHJvLm1pbm9yX3ZlcnNpb25gLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLnZlcnNpb25fcGFydHMoYmVzdClbMV0KCiAgICBkZWYgYnVpbGRfbnVtYmVyKHNlbGYsIGJlc3Q9RmFsc2UpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiB0aGUgYnVpbGQgbnVtYmVyIG9mIHRoZSBMaW51eCBkaXN0cmlidXRpb24uCgogICAgICAgIEZvciBkZXRhaWxzLCBzZWUgOmZ1bmM6YGRpc3Ryby5idWlsZF9udW1iZXJgLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLnZlcnNpb25fcGFydHMoYmVzdClbMl0KCiAgICBkZWYgbGlrZShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gdGhlIElEcyBvZiBkaXN0cmlidXRpb25zIHRoYXQgYXJlIGxpa2UgdGhlIExpbnV4IGRpc3RyaWJ1dGlvbi4KCiAgICAgICAgRm9yIGRldGFpbHMsIHNlZSA6ZnVuYzpgZGlzdHJvLmxpa2VgLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLm9zX3JlbGVhc2VfYXR0cignaWRfbGlrZScpIG9yICcnCgogICAgZGVmIGNvZGVuYW1lKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiB0aGUgY29kZW5hbWUgb2YgdGhlIExpbnV4IGRpc3RyaWJ1dGlvbi4KCiAgICAgICAgRm9yIGRldGFpbHMsIHNlZSA6ZnVuYzpgZGlzdHJvLmNvZGVuYW1lYC4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5vc19yZWxlYXNlX2F0dHIoJ2NvZGVuYW1lJykgXAogICAgICAgICAgICBvciBzZWxmLmxzYl9yZWxlYXNlX2F0dHIoJ2NvZGVuYW1lJykgXAogICAgICAgICAgICBvciBzZWxmLmRpc3Ryb19yZWxlYXNlX2F0dHIoJ2NvZGVuYW1lJykgXAogICAgICAgICAgICBvciAnJwoKICAgIGRlZiBpbmZvKHNlbGYsIHByZXR0eT1GYWxzZSwgYmVzdD1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGNlcnRhaW4gbWFjaGluZS1yZWFkYWJsZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgTGludXgKICAgICAgICBkaXN0cmlidXRpb24uCgogICAgICAgIEZvciBkZXRhaWxzLCBzZWUgOmZ1bmM6YGRpc3Ryby5pbmZvYC4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gZGljdCgKICAgICAgICAgICAgaWQ9c2VsZi5pZCgpLAogICAgICAgICAgICB2ZXJzaW9uPXNlbGYudmVyc2lvbihwcmV0dHksIGJlc3QpLAogICAgICAgICAgICB2ZXJzaW9uX3BhcnRzPWRpY3QoCiAgICAgICAgICAgICAgICBtYWpvcj1zZWxmLm1ham9yX3ZlcnNpb24oYmVzdCksCiAgICAgICAgICAgICAgICBtaW5vcj1zZWxmLm1pbm9yX3ZlcnNpb24oYmVzdCksCiAgICAgICAgICAgICAgICBidWlsZF9udW1iZXI9c2VsZi5idWlsZF9udW1iZXIoYmVzdCkKICAgICAgICAgICAgKSwKICAgICAgICAgICAgbGlrZT1zZWxmLmxpa2UoKSwKICAgICAgICAgICAgY29kZW5hbWU9c2VsZi5jb2RlbmFtZSgpLAogICAgICAgICkKCiAgICBkZWYgb3NfcmVsZWFzZV9pbmZvKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBrZXktdmFsdWUgcGFpcnMgZm9yIHRoZSBpbmZvcm1hdGlvbgogICAgICAgIGl0ZW1zIGZyb20gdGhlIG9zLXJlbGVhc2UgZmlsZSBkYXRhIHNvdXJjZSBvZiB0aGUgTGludXggZGlzdHJpYnV0aW9uLgoKICAgICAgICBGb3IgZGV0YWlscywgc2VlIDpmdW5jOmBkaXN0cm8ub3NfcmVsZWFzZV9pbmZvYC4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5fb3NfcmVsZWFzZV9pbmZvCgogICAgZGVmIGxzYl9yZWxlYXNlX2luZm8oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGEgZGljdGlvbmFyeSBjb250YWluaW5nIGtleS12YWx1ZSBwYWlycyBmb3IgdGhlIGluZm9ybWF0aW9uCiAgICAgICAgaXRlbXMgZnJvbSB0aGUgbHNiX3JlbGVhc2UgY29tbWFuZCBkYXRhIHNvdXJjZSBvZiB0aGUgTGludXgKICAgICAgICBkaXN0cmlidXRpb24uCgogICAgICAgIEZvciBkZXRhaWxzLCBzZWUgOmZ1bmM6YGRpc3Ryby5sc2JfcmVsZWFzZV9pbmZvYC4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5fbHNiX3JlbGVhc2VfaW5mbwoKICAgIGRlZiBkaXN0cm9fcmVsZWFzZV9pbmZvKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBrZXktdmFsdWUgcGFpcnMgZm9yIHRoZSBpbmZvcm1hdGlvbgogICAgICAgIGl0ZW1zIGZyb20gdGhlIGRpc3RybyByZWxlYXNlIGZpbGUgZGF0YSBzb3VyY2Ugb2YgdGhlIExpbnV4CiAgICAgICAgZGlzdHJpYnV0aW9uLgoKICAgICAgICBGb3IgZGV0YWlscywgc2VlIDpmdW5jOmBkaXN0cm8uZGlzdHJvX3JlbGVhc2VfaW5mb2AuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuX2Rpc3Ryb19yZWxlYXNlX2luZm8KCiAgICBkZWYgb3NfcmVsZWFzZV9hdHRyKHNlbGYsIGF0dHJpYnV0ZSk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGEgc2luZ2xlIG5hbWVkIGluZm9ybWF0aW9uIGl0ZW0gZnJvbSB0aGUgb3MtcmVsZWFzZSBmaWxlIGRhdGEKICAgICAgICBzb3VyY2Ugb2YgdGhlIExpbnV4IGRpc3RyaWJ1dGlvbi4KCiAgICAgICAgRm9yIGRldGFpbHMsIHNlZSA6ZnVuYzpgZGlzdHJvLm9zX3JlbGVhc2VfYXR0cmAuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuX29zX3JlbGVhc2VfaW5mby5nZXQoYXR0cmlidXRlLCAnJykKCiAgICBkZWYgbHNiX3JlbGVhc2VfYXR0cihzZWxmLCBhdHRyaWJ1dGUpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBhIHNpbmdsZSBuYW1lZCBpbmZvcm1hdGlvbiBpdGVtIGZyb20gdGhlIGxzYl9yZWxlYXNlIGNvbW1hbmQKICAgICAgICBvdXRwdXQgZGF0YSBzb3VyY2Ugb2YgdGhlIExpbnV4IGRpc3RyaWJ1dGlvbi4KCiAgICAgICAgRm9yIGRldGFpbHMsIHNlZSA6ZnVuYzpgZGlzdHJvLmxzYl9yZWxlYXNlX2F0dHJgLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLl9sc2JfcmVsZWFzZV9pbmZvLmdldChhdHRyaWJ1dGUsICcnKQoKICAgIGRlZiBkaXN0cm9fcmVsZWFzZV9hdHRyKHNlbGYsIGF0dHJpYnV0ZSk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGEgc2luZ2xlIG5hbWVkIGluZm9ybWF0aW9uIGl0ZW0gZnJvbSB0aGUgZGlzdHJvIHJlbGVhc2UgZmlsZQogICAgICAgIGRhdGEgc291cmNlIG9mIHRoZSBMaW51eCBkaXN0cmlidXRpb24uCgogICAgICAgIEZvciBkZXRhaWxzLCBzZWUgOmZ1bmM6YGRpc3Ryby5kaXN0cm9fcmVsZWFzZV9hdHRyYC4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5fZGlzdHJvX3JlbGVhc2VfaW5mby5nZXQoYXR0cmlidXRlLCAnJykKCiAgICBkZWYgX2dldF9vc19yZWxlYXNlX2luZm8oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgR2V0IHRoZSBpbmZvcm1hdGlvbiBpdGVtcyBmcm9tIHRoZSBzcGVjaWZpZWQgb3MtcmVsZWFzZSBmaWxlLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBIGRpY3Rpb25hcnkgY29udGFpbmluZyBhbGwgaW5mb3JtYXRpb24gaXRlbXMuCiAgICAgICAgIiIiCiAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoc2VsZi5vc19yZWxlYXNlX2ZpbGUpOgogICAgICAgICAgICB3aXRoIG9wZW4oc2VsZi5vc19yZWxlYXNlX2ZpbGUpIGFzIHJlbGVhc2VfZmlsZToKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9wYXJzZV9vc19yZWxlYXNlX2NvbnRlbnQocmVsZWFzZV9maWxlKQogICAgICAgIHJldHVybiB7fQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfcGFyc2Vfb3NfcmVsZWFzZV9jb250ZW50KGxpbmVzKToKICAgICAgICAiIiIKICAgICAgICBQYXJzZSB0aGUgbGluZXMgb2YgYW4gb3MtcmVsZWFzZSBmaWxlLgoKICAgICAgICBQYXJhbWV0ZXJzOgoKICAgICAgICAqIGxpbmVzOiBJdGVyYWJsZSB0aHJvdWdoIHRoZSBsaW5lcyBpbiB0aGUgb3MtcmVsZWFzZSBmaWxlLgogICAgICAgICAgICAgICAgIEVhY2ggbGluZSBtdXN0IGJlIGEgdW5pY29kZSBzdHJpbmcgb3IgYSBVVEYtOCBlbmNvZGVkIGJ5dGUKICAgICAgICAgICAgICAgICBzdHJpbmcuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEEgZGljdGlvbmFyeSBjb250YWluaW5nIGFsbCBpbmZvcm1hdGlvbiBpdGVtcy4KICAgICAgICAiIiIKICAgICAgICBwcm9wcyA9IHt9CiAgICAgICAgbGV4ZXIgPSBzaGxleC5zaGxleChsaW5lcywgcG9zaXg9VHJ1ZSkKICAgICAgICBsZXhlci53aGl0ZXNwYWNlX3NwbGl0ID0gVHJ1ZQoKICAgICAgICAjIFRoZSBzaGxleCBtb2R1bGUgZGVmaW5lcyBpdHMgYHdvcmRjaGFyc2AgdmFyaWFibGUgdXNpbmcgbGl0ZXJhbHMsCiAgICAgICAgIyBtYWtpbmcgaXQgZGVwZW5kZW50IG9uIHRoZSBlbmNvZGluZyBvZiB0aGUgUHl0aG9uIHNvdXJjZSBmaWxlLgogICAgICAgICMgSW4gUHl0aG9uIDIuNiBhbmQgMi43LCB0aGUgc2hsZXggc291cmNlIGZpbGUgaXMgZW5jb2RlZCBpbgogICAgICAgICMgJ2lzby04ODU5LTEnLCBhbmQgdGhlIGB3b3JkY2hhcnNgIHZhcmlhYmxlIGlzIGRlZmluZWQgYXMgYSBieXRlCiAgICAgICAgIyBzdHJpbmcuIFRoaXMgY2F1c2VzIGEgVW5pY29kZURlY29kZUVycm9yIHRvIGJlIHJhaXNlZCB3aGVuIHRoZQogICAgICAgICMgcGFyc2VkIGNvbnRlbnQgaXMgYSB1bmljb2RlIG9iamVjdC4gVGhlIGZvbGxvd2luZyBmaXggcmVzb2x2ZXMgdGhhdAogICAgICAgICMgKC4uLiBidXQgaXQgc2hvdWxkIGJlIGZpeGVkIGluIHNobGV4Li4uKToKICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdID09IDIgYW5kIGlzaW5zdGFuY2UobGV4ZXIud29yZGNoYXJzLCBieXRlcyk6CiAgICAgICAgICAgIGxleGVyLndvcmRjaGFycyA9IGxleGVyLndvcmRjaGFycy5kZWNvZGUoJ2lzby04ODU5LTEnKQoKICAgICAgICB0b2tlbnMgPSBsaXN0KGxleGVyKQogICAgICAgIGZvciB0b2tlbiBpbiB0b2tlbnM6CiAgICAgICAgICAgICMgQXQgdGhpcyBwb2ludCwgYWxsIHNoZWxsLWxpa2UgcGFyc2luZyBoYXMgYmVlbiBkb25lIChpLmUuCiAgICAgICAgICAgICMgY29tbWVudHMgcHJvY2Vzc2VkLCBxdW90ZXMgYW5kIGJhY2tzbGFzaCBlc2NhcGUgc2VxdWVuY2VzCiAgICAgICAgICAgICMgcHJvY2Vzc2VkLCBtdWx0aS1saW5lIHZhbHVlcyBhc3NlbWJsZWQsIHRyYWlsaW5nIG5ld2xpbmVzCiAgICAgICAgICAgICMgc3RyaXBwZWQsIGV0Yy4pLCBzbyB0aGUgdG9rZW5zIGFyZSBub3cgZWl0aGVyOgogICAgICAgICAgICAjICogdmFyaWFibGUgYXNzaWdubWVudHM6IHZhcj12YWx1ZQogICAgICAgICAgICAjICogY29tbWFuZHMgb3IgdGhlaXIgYXJndW1lbnRzIChub3QgYWxsb3dlZCBpbiBvcy1yZWxlYXNlKQogICAgICAgICAgICBpZiAnPScgaW4gdG9rZW46CiAgICAgICAgICAgICAgICBrLCB2ID0gdG9rZW4uc3BsaXQoJz0nLCAxKQogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2LCBieXRlcyk6CiAgICAgICAgICAgICAgICAgICAgdiA9IHYuZGVjb2RlKCd1dGYtOCcpCiAgICAgICAgICAgICAgICBwcm9wc1trLmxvd2VyKCldID0gdgogICAgICAgICAgICAgICAgaWYgayA9PSAnVkVSU0lPTic6CiAgICAgICAgICAgICAgICAgICAgIyB0aGlzIGhhbmRsZXMgY2FzZXMgaW4gd2hpY2ggdGhlIGNvZGVuYW1lIGlzIGluCiAgICAgICAgICAgICAgICAgICAgIyB0aGUgYChDT0RFTkFNRSlgIChyaGVsLCBjZW50b3MsIGZlZG9yYSkgZm9ybWF0CiAgICAgICAgICAgICAgICAgICAgIyBvciBpbiB0aGUgYCwgQ09ERU5BTUVgIGZvcm1hdCAoVWJ1bnR1KS4KICAgICAgICAgICAgICAgICAgICBjb2RlbmFtZSA9IHJlLnNlYXJjaChyJyhcKFxEK1wpKXwsKFxzKyk/XEQrJywgdikKICAgICAgICAgICAgICAgICAgICBpZiBjb2RlbmFtZToKICAgICAgICAgICAgICAgICAgICAgICAgY29kZW5hbWUgPSBjb2RlbmFtZS5ncm91cCgpCiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVuYW1lID0gY29kZW5hbWUuc3RyaXAoJygpJykKICAgICAgICAgICAgICAgICAgICAgICAgY29kZW5hbWUgPSBjb2RlbmFtZS5zdHJpcCgnLCcpCiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVuYW1lID0gY29kZW5hbWUuc3RyaXAoKQogICAgICAgICAgICAgICAgICAgICAgICAjIGNvZGVuYW1lIGFwcGVhcnMgd2l0aGluIHBhcmFudGhlc2UuCiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzWydjb2RlbmFtZSddID0gY29kZW5hbWUKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBwcm9wc1snY29kZW5hbWUnXSA9ICcnCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIElnbm9yZSBhbnkgdG9rZW5zIHRoYXQgYXJlIG5vdCB2YXJpYWJsZSBhc3NpZ25tZW50cwogICAgICAgICAgICAgICAgcGFzcwogICAgICAgIHJldHVybiBwcm9wcwoKICAgIGRlZiBfZ2V0X2xzYl9yZWxlYXNlX2luZm8oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgR2V0IHRoZSBpbmZvcm1hdGlvbiBpdGVtcyBmcm9tIHRoZSBsc2JfcmVsZWFzZSBjb21tYW5kIG91dHB1dC4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgYWxsIGluZm9ybWF0aW9uIGl0ZW1zLgogICAgICAgICIiIgogICAgICAgIGNtZCA9ICdsc2JfcmVsZWFzZSAtYScKICAgICAgICBwcm9jZXNzID0gc3VicHJvY2Vzcy5Qb3BlbigKICAgICAgICAgICAgY21kLAogICAgICAgICAgICBzaGVsbD1UcnVlLAogICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAogICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKQogICAgICAgIHN0ZG91dCwgc3RkZXJyID0gcHJvY2Vzcy5jb21tdW5pY2F0ZSgpCiAgICAgICAgc3Rkb3V0LCBzdGRlcnIgPSBzdGRvdXQuZGVjb2RlKCd1dGYtOCcpLCBzdGRlcnIuZGVjb2RlKCd1dGYtOCcpCiAgICAgICAgY29kZSA9IHByb2Nlc3MucmV0dXJuY29kZQogICAgICAgIGlmIGNvZGUgPT0gMDoKICAgICAgICAgICAgY29udGVudCA9IHN0ZG91dC5zcGxpdGxpbmVzKCkKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3BhcnNlX2xzYl9yZWxlYXNlX2NvbnRlbnQoY29udGVudCkKICAgICAgICBlbGlmIGNvZGUgPT0gMTI3OiAgIyBDb21tYW5kIG5vdCBmb3VuZAogICAgICAgICAgICByZXR1cm4ge30KICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzoyXSA+PSAoMywgNSk6CiAgICAgICAgICAgICAgICByYWlzZSBzdWJwcm9jZXNzLkNhbGxlZFByb2Nlc3NFcnJvcihjb2RlLCBjbWQsIHN0ZG91dCwgc3RkZXJyKQogICAgICAgICAgICBlbGlmIHN5cy52ZXJzaW9uX2luZm9bOjJdID49ICgyLCA3KToKICAgICAgICAgICAgICAgIHJhaXNlIHN1YnByb2Nlc3MuQ2FsbGVkUHJvY2Vzc0Vycm9yKGNvZGUsIGNtZCwgc3Rkb3V0KQogICAgICAgICAgICBlbGlmIHN5cy52ZXJzaW9uX2luZm9bOjJdID09ICgyLCA2KToKICAgICAgICAgICAgICAgIHJhaXNlIHN1YnByb2Nlc3MuQ2FsbGVkUHJvY2Vzc0Vycm9yKGNvZGUsIGNtZCkKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX3BhcnNlX2xzYl9yZWxlYXNlX2NvbnRlbnQobGluZXMpOgogICAgICAgICIiIgogICAgICAgIFBhcnNlIHRoZSBvdXRwdXQgb2YgdGhlIGxzYl9yZWxlYXNlIGNvbW1hbmQuCgogICAgICAgIFBhcmFtZXRlcnM6CgogICAgICAgICogbGluZXM6IEl0ZXJhYmxlIHRocm91Z2ggdGhlIGxpbmVzIG9mIHRoZSBsc2JfcmVsZWFzZSBvdXRwdXQuCiAgICAgICAgICAgICAgICAgRWFjaCBsaW5lIG11c3QgYmUgYSB1bmljb2RlIHN0cmluZyBvciBhIFVURi04IGVuY29kZWQgYnl0ZQogICAgICAgICAgICAgICAgIHN0cmluZy4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgYWxsIGluZm9ybWF0aW9uIGl0ZW1zLgogICAgICAgICIiIgogICAgICAgIHByb3BzID0ge30KICAgICAgICBmb3IgbGluZSBpbiBsaW5lczoKICAgICAgICAgICAgbGluZSA9IGxpbmUuZGVjb2RlKCd1dGYtOCcpIGlmIGlzaW5zdGFuY2UobGluZSwgYnl0ZXMpIGVsc2UgbGluZQogICAgICAgICAgICBrdiA9IGxpbmUuc3RyaXAoJ1xuJykuc3BsaXQoJzonLCAxKQogICAgICAgICAgICBpZiBsZW4oa3YpICE9IDI6CiAgICAgICAgICAgICAgICAjIElnbm9yZSBsaW5lcyB3aXRob3V0IGNvbG9uLgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaywgdiA9IGt2CiAgICAgICAgICAgIHByb3BzLnVwZGF0ZSh7ay5yZXBsYWNlKCcgJywgJ18nKS5sb3dlcigpOiB2LnN0cmlwKCl9KQogICAgICAgIHJldHVybiBwcm9wcwoKICAgIGRlZiBfZ2V0X2Rpc3Ryb19yZWxlYXNlX2luZm8oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgR2V0IHRoZSBpbmZvcm1hdGlvbiBpdGVtcyBmcm9tIHRoZSBzcGVjaWZpZWQgZGlzdHJvIHJlbGVhc2UgZmlsZS4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgYWxsIGluZm9ybWF0aW9uIGl0ZW1zLgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuZGlzdHJvX3JlbGVhc2VfZmlsZToKICAgICAgICAgICAgIyBJZiBpdCB3YXMgc3BlY2lmaWVkLCB3ZSB1c2UgaXQgYW5kIHBhcnNlIHdoYXQgd2UgY2FuLCBldmVuIGlmCiAgICAgICAgICAgICMgaXRzIGZpbGUgbmFtZSBvciBjb250ZW50IGRvZXMgbm90IG1hdGNoIHRoZSBleHBlY3RlZCBwYXR0ZXJuLgogICAgICAgICAgICBkaXN0cm9faW5mbyA9IHNlbGYuX3BhcnNlX2Rpc3Ryb19yZWxlYXNlX2ZpbGUoCiAgICAgICAgICAgICAgICBzZWxmLmRpc3Ryb19yZWxlYXNlX2ZpbGUpCiAgICAgICAgICAgIGJhc2VuYW1lID0gb3MucGF0aC5iYXNlbmFtZShzZWxmLmRpc3Ryb19yZWxlYXNlX2ZpbGUpCiAgICAgICAgICAgICMgVGhlIGZpbGUgbmFtZSBwYXR0ZXJuIGZvciB1c2VyLXNwZWNpZmllZCBkaXN0cm8gcmVsZWFzZSBmaWxlcwogICAgICAgICAgICAjIGlzIHNvbWV3aGF0IG1vcmUgdG9sZXJhbnQgKGNvbXBhcmVkIHRvIHdoZW4gc2VhcmNoaW5nIGZvciB0aGUKICAgICAgICAgICAgIyBmaWxlKSwgYmVjYXVzZSB3ZSB3YW50IHRvIHVzZSB3aGF0IHdhcyBzcGVjaWZpZWQgYXMgYmVzdCBhcwogICAgICAgICAgICAjIHBvc3NpYmxlLgogICAgICAgICAgICBtYXRjaCA9IF9ESVNUUk9fUkVMRUFTRV9CQVNFTkFNRV9QQVRURVJOLm1hdGNoKGJhc2VuYW1lKQogICAgICAgICAgICBpZiBtYXRjaDoKICAgICAgICAgICAgICAgIGRpc3Ryb19pbmZvWydpZCddID0gbWF0Y2guZ3JvdXAoMSkKICAgICAgICAgICAgcmV0dXJuIGRpc3Ryb19pbmZvCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYmFzZW5hbWVzID0gb3MubGlzdGRpcihfVU5JWENPTkZESVIpCiAgICAgICAgICAgICMgV2Ugc29ydCBmb3IgcmVwZWF0YWJpbGl0eSBpbiBjYXNlcyB3aGVyZSB0aGVyZSBhcmUgbXVsdGlwbGUKICAgICAgICAgICAgIyBkaXN0cm8gc3BlY2lmaWMgZmlsZXM7IGUuZy4gQ2VudE9TLCBPcmFjbGUsIEVudGVycHJpc2UgYWxsCiAgICAgICAgICAgICMgY29udGFpbmluZyBgcmVkaGF0LXJlbGVhc2VgIG9uIHRvcCBvZiB0aGVpciBvd24uCiAgICAgICAgICAgIGJhc2VuYW1lcy5zb3J0KCkKICAgICAgICAgICAgZm9yIGJhc2VuYW1lIGluIGJhc2VuYW1lczoKICAgICAgICAgICAgICAgIGlmIGJhc2VuYW1lIGluIF9ESVNUUk9fUkVMRUFTRV9JR05PUkVfQkFTRU5BTUVTOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBtYXRjaCA9IF9ESVNUUk9fUkVMRUFTRV9CQVNFTkFNRV9QQVRURVJOLm1hdGNoKGJhc2VuYW1lKQogICAgICAgICAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgICAgICAgICAgZmlsZXBhdGggPSBvcy5wYXRoLmpvaW4oX1VOSVhDT05GRElSLCBiYXNlbmFtZSkKICAgICAgICAgICAgICAgICAgICBkaXN0cm9faW5mbyA9IHNlbGYuX3BhcnNlX2Rpc3Ryb19yZWxlYXNlX2ZpbGUoZmlsZXBhdGgpCiAgICAgICAgICAgICAgICAgICAgaWYgJ25hbWUnIGluIGRpc3Ryb19pbmZvOgogICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBuYW1lIGlzIGFsd2F5cyBwcmVzZW50IGlmIHRoZSBwYXR0ZXJuIG1hdGNoZXMKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kaXN0cm9fcmVsZWFzZV9maWxlID0gZmlsZXBhdGgKICAgICAgICAgICAgICAgICAgICAgICAgZGlzdHJvX2luZm9bJ2lkJ10gPSBtYXRjaC5ncm91cCgxKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGlzdHJvX2luZm8KICAgICAgICAgICAgcmV0dXJuIHt9CgogICAgZGVmIF9wYXJzZV9kaXN0cm9fcmVsZWFzZV9maWxlKHNlbGYsIGZpbGVwYXRoKToKICAgICAgICAiIiIKICAgICAgICBQYXJzZSBhIGRpc3RybyByZWxlYXNlIGZpbGUuCgogICAgICAgIFBhcmFtZXRlcnM6CgogICAgICAgICogZmlsZXBhdGg6IFBhdGggbmFtZSBvZiB0aGUgZGlzdHJvIHJlbGVhc2UgZmlsZS4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgYWxsIGluZm9ybWF0aW9uIGl0ZW1zLgogICAgICAgICIiIgogICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGZpbGVwYXRoKToKICAgICAgICAgICAgd2l0aCBvcGVuKGZpbGVwYXRoKSBhcyBmcDoKICAgICAgICAgICAgICAgICMgT25seSBwYXJzZSB0aGUgZmlyc3QgbGluZS4gRm9yIGluc3RhbmNlLCBvbiBTTEVTIHRoZXJlCiAgICAgICAgICAgICAgICAjIGFyZSBtdWx0aXBsZSBsaW5lcy4gV2UgZG9uJ3Qgd2FudCB0aGVtLi4uCiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fcGFyc2VfZGlzdHJvX3JlbGVhc2VfY29udGVudChmcC5yZWFkbGluZSgpKQogICAgICAgIHJldHVybiB7fQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfcGFyc2VfZGlzdHJvX3JlbGVhc2VfY29udGVudChsaW5lKToKICAgICAgICAiIiIKICAgICAgICBQYXJzZSBhIGxpbmUgZnJvbSBhIGRpc3RybyByZWxlYXNlIGZpbGUuCgogICAgICAgIFBhcmFtZXRlcnM6CiAgICAgICAgKiBsaW5lOiBMaW5lIGZyb20gdGhlIGRpc3RybyByZWxlYXNlIGZpbGUuIE11c3QgYmUgYSB1bmljb2RlIHN0cmluZwogICAgICAgICAgICAgICAgb3IgYSBVVEYtOCBlbmNvZGVkIGJ5dGUgc3RyaW5nLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBIGRpY3Rpb25hcnkgY29udGFpbmluZyBhbGwgaW5mb3JtYXRpb24gaXRlbXMuCiAgICAgICAgIiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZShsaW5lLCBieXRlcyk6CiAgICAgICAgICAgIGxpbmUgPSBsaW5lLmRlY29kZSgndXRmLTgnKQogICAgICAgIG1hdGNoZXMgPSBfRElTVFJPX1JFTEVBU0VfQ09OVEVOVF9SRVZFUlNFRF9QQVRURVJOLm1hdGNoKAogICAgICAgICAgICBsaW5lLnN0cmlwKClbOjotMV0pCiAgICAgICAgZGlzdHJvX2luZm8gPSB7fQogICAgICAgIGlmIG1hdGNoZXM6CiAgICAgICAgICAgICMgcmVnZXhwIGVuc3VyZXMgbm9uLU5vbmUKICAgICAgICAgICAgZGlzdHJvX2luZm9bJ25hbWUnXSA9IG1hdGNoZXMuZ3JvdXAoMylbOjotMV0KICAgICAgICAgICAgaWYgbWF0Y2hlcy5ncm91cCgyKToKICAgICAgICAgICAgICAgIGRpc3Ryb19pbmZvWyd2ZXJzaW9uX2lkJ10gPSBtYXRjaGVzLmdyb3VwKDIpWzo6LTFdCiAgICAgICAgICAgIGlmIG1hdGNoZXMuZ3JvdXAoMSk6CiAgICAgICAgICAgICAgICBkaXN0cm9faW5mb1snY29kZW5hbWUnXSA9IG1hdGNoZXMuZ3JvdXAoMSlbOjotMV0KICAgICAgICBlbGlmIGxpbmU6CiAgICAgICAgICAgIGRpc3Ryb19pbmZvWyduYW1lJ10gPSBsaW5lLnN0cmlwKCkKICAgICAgICByZXR1cm4gZGlzdHJvX2luZm8KCgpfZGlzdHJvID0gTGludXhEaXN0cmlidXRpb24oKQoKCmRlZiBtYWluKCk6CiAgICBpbXBvcnQgYXJncGFyc2UKCiAgICBsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKICAgIGxvZ2dlci5zZXRMZXZlbChsb2dnaW5nLkRFQlVHKQogICAgbG9nZ2VyLmFkZEhhbmRsZXIobG9nZ2luZy5TdHJlYW1IYW5kbGVyKHN5cy5zdGRvdXQpKQoKICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKGRlc2NyaXB0aW9uPSJMaW51eCBkaXN0cm8gaW5mbyB0b29sIikKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoCiAgICAgICAgJy0tanNvbicsCiAgICAgICAgJy1qJywKICAgICAgICBoZWxwPSJPdXRwdXQgaW4gbWFjaGluZSByZWFkYWJsZSBmb3JtYXQiLAogICAgICAgIGFjdGlvbj0ic3RvcmVfdHJ1ZSIpCiAgICBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQoKICAgIGlmIGFyZ3MuanNvbjoKICAgICAgICBsb2dnZXIuaW5mbyhqc29uLmR1bXBzKGluZm8oKSwgaW5kZW50PTQsIHNvcnRfa2V5cz1UcnVlKSkKICAgIGVsc2U6CiAgICAgICAgbG9nZ2VyLmluZm8oJ05hbWU6ICVzJywgbmFtZShwcmV0dHk9VHJ1ZSkpCiAgICAgICAgZGlzdHJpYnV0aW9uX3ZlcnNpb24gPSB2ZXJzaW9uKHByZXR0eT1UcnVlKQogICAgICAgIGlmIGRpc3RyaWJ1dGlvbl92ZXJzaW9uOgogICAgICAgICAgICBsb2dnZXIuaW5mbygnVmVyc2lvbjogJXMnLCBkaXN0cmlidXRpb25fdmVyc2lvbikKICAgICAgICBkaXN0cmlidXRpb25fY29kZW5hbWUgPSBjb2RlbmFtZSgpCiAgICAgICAgaWYgZGlzdHJpYnV0aW9uX2NvZGVuYW1lOgogICAgICAgICAgICBsb2dnZXIuaW5mbygnQ29kZW5hbWU6ICVzJywgZGlzdHJpYnV0aW9uX2NvZGVuYW1lKQoKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICBtYWluKCkKUEsDBBQAAAAAAAAAIQCim5mcDAMAAAwDAAAwAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL19faW5pdF9fLnB5IiIiCkhUTUwgcGFyc2luZyBsaWJyYXJ5IGJhc2VkIG9uIHRoZSBXSEFUV0cgIkhUTUw1IgpzcGVjaWZpY2F0aW9uLiBUaGUgcGFyc2VyIGlzIGRlc2lnbmVkIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBleGlzdGluZwpIVE1MIGZvdW5kIGluIHRoZSB3aWxkIGFuZCBpbXBsZW1lbnRzIHdlbGwtZGVmaW5lZCBlcnJvciByZWNvdmVyeSB0aGF0CmlzIGxhcmdlbHkgY29tcGF0aWJsZSB3aXRoIG1vZGVybiBkZXNrdG9wIHdlYiBicm93c2Vycy4KCkV4YW1wbGUgdXNhZ2U6CgppbXBvcnQgaHRtbDVsaWIKZiA9IG9wZW4oIm15X2RvY3VtZW50Lmh0bWwiKQp0cmVlID0gaHRtbDVsaWIucGFyc2UoZikKIiIiCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKCmZyb20gLmh0bWw1cGFyc2VyIGltcG9ydCBIVE1MUGFyc2VyLCBwYXJzZSwgcGFyc2VGcmFnbWVudApmcm9tIC50cmVlYnVpbGRlcnMgaW1wb3J0IGdldFRyZWVCdWlsZGVyCmZyb20gLnRyZWV3YWxrZXJzIGltcG9ydCBnZXRUcmVlV2Fsa2VyCmZyb20gLnNlcmlhbGl6ZXIgaW1wb3J0IHNlcmlhbGl6ZQoKX19hbGxfXyA9IFsiSFRNTFBhcnNlciIsICJwYXJzZSIsICJwYXJzZUZyYWdtZW50IiwgImdldFRyZWVCdWlsZGVyIiwKICAgICAgICAgICAiZ2V0VHJlZVdhbGtlciIsICJzZXJpYWxpemUiXQoKIyB0aGlzIGhhcyB0byBiZSBhdCB0aGUgdG9wIGxldmVsLCBzZWUgaG93IHNldHVwLnB5IHBhcnNlcyB0aGlzCl9fdmVyc2lvbl9fID0gIjEuMGIxMCIKUEsDBBQAAAAAAAAAIQDVeA7iQUEAAEFBAAAxAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL19paGF0ZXhtbC5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwoKaW1wb3J0IHJlCmltcG9ydCB3YXJuaW5ncwoKZnJvbSAuY29uc3RhbnRzIGltcG9ydCBEYXRhTG9zc1dhcm5pbmcKCmJhc2VDaGFyID0gIiIiClsjeDAwNDEtI3gwMDVBXSB8IFsjeDAwNjEtI3gwMDdBXSB8IFsjeDAwQzAtI3gwMEQ2XSB8IFsjeDAwRDgtI3gwMEY2XSB8ClsjeDAwRjgtI3gwMEZGXSB8IFsjeDAxMDAtI3gwMTMxXSB8IFsjeDAxMzQtI3gwMTNFXSB8IFsjeDAxNDEtI3gwMTQ4XSB8ClsjeDAxNEEtI3gwMTdFXSB8IFsjeDAxODAtI3gwMUMzXSB8IFsjeDAxQ0QtI3gwMUYwXSB8IFsjeDAxRjQtI3gwMUY1XSB8ClsjeDAxRkEtI3gwMjE3XSB8IFsjeDAyNTAtI3gwMkE4XSB8IFsjeDAyQkItI3gwMkMxXSB8ICN4MDM4NiB8ClsjeDAzODgtI3gwMzhBXSB8ICN4MDM4QyB8IFsjeDAzOEUtI3gwM0ExXSB8IFsjeDAzQTMtI3gwM0NFXSB8ClsjeDAzRDAtI3gwM0Q2XSB8ICN4MDNEQSB8ICN4MDNEQyB8ICN4MDNERSB8ICN4MDNFMCB8IFsjeDAzRTItI3gwM0YzXSB8ClsjeDA0MDEtI3gwNDBDXSB8IFsjeDA0MEUtI3gwNDRGXSB8IFsjeDA0NTEtI3gwNDVDXSB8IFsjeDA0NUUtI3gwNDgxXSB8ClsjeDA0OTAtI3gwNEM0XSB8IFsjeDA0QzctI3gwNEM4XSB8IFsjeDA0Q0ItI3gwNENDXSB8IFsjeDA0RDAtI3gwNEVCXSB8ClsjeDA0RUUtI3gwNEY1XSB8IFsjeDA0RjgtI3gwNEY5XSB8IFsjeDA1MzEtI3gwNTU2XSB8ICN4MDU1OSB8ClsjeDA1NjEtI3gwNTg2XSB8IFsjeDA1RDAtI3gwNUVBXSB8IFsjeDA1RjAtI3gwNUYyXSB8IFsjeDA2MjEtI3gwNjNBXSB8ClsjeDA2NDEtI3gwNjRBXSB8IFsjeDA2NzEtI3gwNkI3XSB8IFsjeDA2QkEtI3gwNkJFXSB8IFsjeDA2QzAtI3gwNkNFXSB8ClsjeDA2RDAtI3gwNkQzXSB8ICN4MDZENSB8IFsjeDA2RTUtI3gwNkU2XSB8IFsjeDA5MDUtI3gwOTM5XSB8ICN4MDkzRCB8ClsjeDA5NTgtI3gwOTYxXSB8IFsjeDA5ODUtI3gwOThDXSB8IFsjeDA5OEYtI3gwOTkwXSB8IFsjeDA5OTMtI3gwOUE4XSB8ClsjeDA5QUEtI3gwOUIwXSB8ICN4MDlCMiB8IFsjeDA5QjYtI3gwOUI5XSB8IFsjeDA5REMtI3gwOUREXSB8ClsjeDA5REYtI3gwOUUxXSB8IFsjeDA5RjAtI3gwOUYxXSB8IFsjeDBBMDUtI3gwQTBBXSB8IFsjeDBBMEYtI3gwQTEwXSB8ClsjeDBBMTMtI3gwQTI4XSB8IFsjeDBBMkEtI3gwQTMwXSB8IFsjeDBBMzItI3gwQTMzXSB8IFsjeDBBMzUtI3gwQTM2XSB8ClsjeDBBMzgtI3gwQTM5XSB8IFsjeDBBNTktI3gwQTVDXSB8ICN4MEE1RSB8IFsjeDBBNzItI3gwQTc0XSB8ClsjeDBBODUtI3gwQThCXSB8ICN4MEE4RCB8IFsjeDBBOEYtI3gwQTkxXSB8IFsjeDBBOTMtI3gwQUE4XSB8ClsjeDBBQUEtI3gwQUIwXSB8IFsjeDBBQjItI3gwQUIzXSB8IFsjeDBBQjUtI3gwQUI5XSB8ICN4MEFCRCB8ICN4MEFFMCB8ClsjeDBCMDUtI3gwQjBDXSB8IFsjeDBCMEYtI3gwQjEwXSB8IFsjeDBCMTMtI3gwQjI4XSB8IFsjeDBCMkEtI3gwQjMwXSB8ClsjeDBCMzItI3gwQjMzXSB8IFsjeDBCMzYtI3gwQjM5XSB8ICN4MEIzRCB8IFsjeDBCNUMtI3gwQjVEXSB8ClsjeDBCNUYtI3gwQjYxXSB8IFsjeDBCODUtI3gwQjhBXSB8IFsjeDBCOEUtI3gwQjkwXSB8IFsjeDBCOTItI3gwQjk1XSB8ClsjeDBCOTktI3gwQjlBXSB8ICN4MEI5QyB8IFsjeDBCOUUtI3gwQjlGXSB8IFsjeDBCQTMtI3gwQkE0XSB8ClsjeDBCQTgtI3gwQkFBXSB8IFsjeDBCQUUtI3gwQkI1XSB8IFsjeDBCQjctI3gwQkI5XSB8IFsjeDBDMDUtI3gwQzBDXSB8ClsjeDBDMEUtI3gwQzEwXSB8IFsjeDBDMTItI3gwQzI4XSB8IFsjeDBDMkEtI3gwQzMzXSB8IFsjeDBDMzUtI3gwQzM5XSB8ClsjeDBDNjAtI3gwQzYxXSB8IFsjeDBDODUtI3gwQzhDXSB8IFsjeDBDOEUtI3gwQzkwXSB8IFsjeDBDOTItI3gwQ0E4XSB8ClsjeDBDQUEtI3gwQ0IzXSB8IFsjeDBDQjUtI3gwQ0I5XSB8ICN4MENERSB8IFsjeDBDRTAtI3gwQ0UxXSB8ClsjeDBEMDUtI3gwRDBDXSB8IFsjeDBEMEUtI3gwRDEwXSB8IFsjeDBEMTItI3gwRDI4XSB8IFsjeDBEMkEtI3gwRDM5XSB8ClsjeDBENjAtI3gwRDYxXSB8IFsjeDBFMDEtI3gwRTJFXSB8ICN4MEUzMCB8IFsjeDBFMzItI3gwRTMzXSB8ClsjeDBFNDAtI3gwRTQ1XSB8IFsjeDBFODEtI3gwRTgyXSB8ICN4MEU4NCB8IFsjeDBFODctI3gwRTg4XSB8ICN4MEU4QSB8CiN4MEU4RCB8IFsjeDBFOTQtI3gwRTk3XSB8IFsjeDBFOTktI3gwRTlGXSB8IFsjeDBFQTEtI3gwRUEzXSB8ICN4MEVBNSB8CiN4MEVBNyB8IFsjeDBFQUEtI3gwRUFCXSB8IFsjeDBFQUQtI3gwRUFFXSB8ICN4MEVCMCB8IFsjeDBFQjItI3gwRUIzXSB8CiN4MEVCRCB8IFsjeDBFQzAtI3gwRUM0XSB8IFsjeDBGNDAtI3gwRjQ3XSB8IFsjeDBGNDktI3gwRjY5XSB8ClsjeDEwQTAtI3gxMEM1XSB8IFsjeDEwRDAtI3gxMEY2XSB8ICN4MTEwMCB8IFsjeDExMDItI3gxMTAzXSB8ClsjeDExMDUtI3gxMTA3XSB8ICN4MTEwOSB8IFsjeDExMEItI3gxMTBDXSB8IFsjeDExMEUtI3gxMTEyXSB8ICN4MTEzQyB8CiN4MTEzRSB8ICN4MTE0MCB8ICN4MTE0QyB8ICN4MTE0RSB8ICN4MTE1MCB8IFsjeDExNTQtI3gxMTU1XSB8ICN4MTE1OSB8ClsjeDExNUYtI3gxMTYxXSB8ICN4MTE2MyB8ICN4MTE2NSB8ICN4MTE2NyB8ICN4MTE2OSB8IFsjeDExNkQtI3gxMTZFXSB8ClsjeDExNzItI3gxMTczXSB8ICN4MTE3NSB8ICN4MTE5RSB8ICN4MTFBOCB8ICN4MTFBQiB8IFsjeDExQUUtI3gxMUFGXSB8ClsjeDExQjctI3gxMUI4XSB8ICN4MTFCQSB8IFsjeDExQkMtI3gxMUMyXSB8ICN4MTFFQiB8ICN4MTFGMCB8ICN4MTFGOSB8ClsjeDFFMDAtI3gxRTlCXSB8IFsjeDFFQTAtI3gxRUY5XSB8IFsjeDFGMDAtI3gxRjE1XSB8IFsjeDFGMTgtI3gxRjFEXSB8ClsjeDFGMjAtI3gxRjQ1XSB8IFsjeDFGNDgtI3gxRjREXSB8IFsjeDFGNTAtI3gxRjU3XSB8ICN4MUY1OSB8ICN4MUY1QiB8CiN4MUY1RCB8IFsjeDFGNUYtI3gxRjdEXSB8IFsjeDFGODAtI3gxRkI0XSB8IFsjeDFGQjYtI3gxRkJDXSB8ICN4MUZCRSB8ClsjeDFGQzItI3gxRkM0XSB8IFsjeDFGQzYtI3gxRkNDXSB8IFsjeDFGRDAtI3gxRkQzXSB8IFsjeDFGRDYtI3gxRkRCXSB8ClsjeDFGRTAtI3gxRkVDXSB8IFsjeDFGRjItI3gxRkY0XSB8IFsjeDFGRjYtI3gxRkZDXSB8ICN4MjEyNiB8ClsjeDIxMkEtI3gyMTJCXSB8ICN4MjEyRSB8IFsjeDIxODAtI3gyMTgyXSB8IFsjeDMwNDEtI3gzMDk0XSB8ClsjeDMwQTEtI3gzMEZBXSB8IFsjeDMxMDUtI3gzMTJDXSB8IFsjeEFDMDAtI3hEN0EzXSIiIgoKaWRlb2dyYXBoaWMgPSAiIiJbI3g0RTAwLSN4OUZBNV0gfCAjeDMwMDcgfCBbI3gzMDIxLSN4MzAyOV0iIiIKCmNvbWJpbmluZ0NoYXJhY3RlciA9ICIiIgpbI3gwMzAwLSN4MDM0NV0gfCBbI3gwMzYwLSN4MDM2MV0gfCBbI3gwNDgzLSN4MDQ4Nl0gfCBbI3gwNTkxLSN4MDVBMV0gfApbI3gwNUEzLSN4MDVCOV0gfCBbI3gwNUJCLSN4MDVCRF0gfCAjeDA1QkYgfCBbI3gwNUMxLSN4MDVDMl0gfCAjeDA1QzQgfApbI3gwNjRCLSN4MDY1Ml0gfCAjeDA2NzAgfCBbI3gwNkQ2LSN4MDZEQ10gfCBbI3gwNkRELSN4MDZERl0gfApbI3gwNkUwLSN4MDZFNF0gfCBbI3gwNkU3LSN4MDZFOF0gfCBbI3gwNkVBLSN4MDZFRF0gfCBbI3gwOTAxLSN4MDkwM10gfAojeDA5M0MgfCBbI3gwOTNFLSN4MDk0Q10gfCAjeDA5NEQgfCBbI3gwOTUxLSN4MDk1NF0gfCBbI3gwOTYyLSN4MDk2M10gfApbI3gwOTgxLSN4MDk4M10gfCAjeDA5QkMgfCAjeDA5QkUgfCAjeDA5QkYgfCBbI3gwOUMwLSN4MDlDNF0gfApbI3gwOUM3LSN4MDlDOF0gfCBbI3gwOUNCLSN4MDlDRF0gfCAjeDA5RDcgfCBbI3gwOUUyLSN4MDlFM10gfCAjeDBBMDIgfAojeDBBM0MgfCAjeDBBM0UgfCAjeDBBM0YgfCBbI3gwQTQwLSN4MEE0Ml0gfCBbI3gwQTQ3LSN4MEE0OF0gfApbI3gwQTRCLSN4MEE0RF0gfCBbI3gwQTcwLSN4MEE3MV0gfCBbI3gwQTgxLSN4MEE4M10gfCAjeDBBQkMgfApbI3gwQUJFLSN4MEFDNV0gfCBbI3gwQUM3LSN4MEFDOV0gfCBbI3gwQUNCLSN4MEFDRF0gfCBbI3gwQjAxLSN4MEIwM10gfAojeDBCM0MgfCBbI3gwQjNFLSN4MEI0M10gfCBbI3gwQjQ3LSN4MEI0OF0gfCBbI3gwQjRCLSN4MEI0RF0gfApbI3gwQjU2LSN4MEI1N10gfCBbI3gwQjgyLSN4MEI4M10gfCBbI3gwQkJFLSN4MEJDMl0gfCBbI3gwQkM2LSN4MEJDOF0gfApbI3gwQkNBLSN4MEJDRF0gfCAjeDBCRDcgfCBbI3gwQzAxLSN4MEMwM10gfCBbI3gwQzNFLSN4MEM0NF0gfApbI3gwQzQ2LSN4MEM0OF0gfCBbI3gwQzRBLSN4MEM0RF0gfCBbI3gwQzU1LSN4MEM1Nl0gfCBbI3gwQzgyLSN4MEM4M10gfApbI3gwQ0JFLSN4MENDNF0gfCBbI3gwQ0M2LSN4MENDOF0gfCBbI3gwQ0NBLSN4MENDRF0gfCBbI3gwQ0Q1LSN4MENENl0gfApbI3gwRDAyLSN4MEQwM10gfCBbI3gwRDNFLSN4MEQ0M10gfCBbI3gwRDQ2LSN4MEQ0OF0gfCBbI3gwRDRBLSN4MEQ0RF0gfAojeDBENTcgfCAjeDBFMzEgfCBbI3gwRTM0LSN4MEUzQV0gfCBbI3gwRTQ3LSN4MEU0RV0gfCAjeDBFQjEgfApbI3gwRUI0LSN4MEVCOV0gfCBbI3gwRUJCLSN4MEVCQ10gfCBbI3gwRUM4LSN4MEVDRF0gfCBbI3gwRjE4LSN4MEYxOV0gfAojeDBGMzUgfCAjeDBGMzcgfCAjeDBGMzkgfCAjeDBGM0UgfCAjeDBGM0YgfCBbI3gwRjcxLSN4MEY4NF0gfApbI3gwRjg2LSN4MEY4Ql0gfCBbI3gwRjkwLSN4MEY5NV0gfCAjeDBGOTcgfCBbI3gwRjk5LSN4MEZBRF0gfApbI3gwRkIxLSN4MEZCN10gfCAjeDBGQjkgfCBbI3gyMEQwLSN4MjBEQ10gfCAjeDIwRTEgfCBbI3gzMDJBLSN4MzAyRl0gfAojeDMwOTkgfCAjeDMwOUEiIiIKCmRpZ2l0ID0gIiIiClsjeDAwMzAtI3gwMDM5XSB8IFsjeDA2NjAtI3gwNjY5XSB8IFsjeDA2RjAtI3gwNkY5XSB8IFsjeDA5NjYtI3gwOTZGXSB8ClsjeDA5RTYtI3gwOUVGXSB8IFsjeDBBNjYtI3gwQTZGXSB8IFsjeDBBRTYtI3gwQUVGXSB8IFsjeDBCNjYtI3gwQjZGXSB8ClsjeDBCRTctI3gwQkVGXSB8IFsjeDBDNjYtI3gwQzZGXSB8IFsjeDBDRTYtI3gwQ0VGXSB8IFsjeDBENjYtI3gwRDZGXSB8ClsjeDBFNTAtI3gwRTU5XSB8IFsjeDBFRDAtI3gwRUQ5XSB8IFsjeDBGMjAtI3gwRjI5XSIiIgoKZXh0ZW5kZXIgPSAiIiIKI3gwMEI3IHwgI3gwMkQwIHwgI3gwMkQxIHwgI3gwMzg3IHwgI3gwNjQwIHwgI3gwRTQ2IHwgI3gwRUM2IHwgI3gzMDA1IHwKI1sjeDMwMzEtI3gzMDM1XSB8IFsjeDMwOUQtI3gzMDlFXSB8IFsjeDMwRkMtI3gzMEZFXSIiIgoKbGV0dGVyID0gIiB8ICIuam9pbihbYmFzZUNoYXIsIGlkZW9ncmFwaGljXSkKCiMgV2l0aG91dCB0aGUKbmFtZSA9ICIgfCAiLmpvaW4oW2xldHRlciwgZGlnaXQsICIuIiwgIi0iLCAiXyIsIGNvbWJpbmluZ0NoYXJhY3RlciwKICAgICAgICAgICAgICAgICAgIGV4dGVuZGVyXSkKbmFtZUZpcnN0ID0gIiB8ICIuam9pbihbbGV0dGVyLCAiXyJdKQoKcmVDaGFyID0gcmUuY29tcGlsZShyIiN4KFtcZHxBLUZdezQsNH0pIikKcmVDaGFyUmFuZ2UgPSByZS5jb21waWxlKHIiXFsjeChbXGR8QS1GXXs0LDR9KS0jeChbXGR8QS1GXXs0LDR9KVxdIikKCgpkZWYgY2hhclN0cmluZ1RvTGlzdChjaGFycyk6CiAgICBjaGFyUmFuZ2VzID0gW2l0ZW0uc3RyaXAoKSBmb3IgaXRlbSBpbiBjaGFycy5zcGxpdCgiIHwgIildCiAgICBydiA9IFtdCiAgICBmb3IgaXRlbSBpbiBjaGFyUmFuZ2VzOgogICAgICAgIGZvdW5kTWF0Y2ggPSBGYWxzZQogICAgICAgIGZvciByZWdleHAgaW4gKHJlQ2hhciwgcmVDaGFyUmFuZ2UpOgogICAgICAgICAgICBtYXRjaCA9IHJlZ2V4cC5tYXRjaChpdGVtKQogICAgICAgICAgICBpZiBtYXRjaCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHJ2LmFwcGVuZChbaGV4VG9JbnQoaXRlbSkgZm9yIGl0ZW0gaW4gbWF0Y2guZ3JvdXBzKCldKQogICAgICAgICAgICAgICAgaWYgbGVuKHJ2Wy0xXSkgPT0gMToKICAgICAgICAgICAgICAgICAgICBydlstMV0gPSBydlstMV0gKiAyCiAgICAgICAgICAgICAgICBmb3VuZE1hdGNoID0gVHJ1ZQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBpZiBub3QgZm91bmRNYXRjaDoKICAgICAgICAgICAgYXNzZXJ0IGxlbihpdGVtKSA9PSAxCgogICAgICAgICAgICBydi5hcHBlbmQoW29yZChpdGVtKV0gKiAyKQogICAgcnYgPSBub3JtYWxpc2VDaGFyTGlzdChydikKICAgIHJldHVybiBydgoKCmRlZiBub3JtYWxpc2VDaGFyTGlzdChjaGFyTGlzdCk6CiAgICBjaGFyTGlzdCA9IHNvcnRlZChjaGFyTGlzdCkKICAgIGZvciBpdGVtIGluIGNoYXJMaXN0OgogICAgICAgIGFzc2VydCBpdGVtWzFdID49IGl0ZW1bMF0KICAgIHJ2ID0gW10KICAgIGkgPSAwCiAgICB3aGlsZSBpIDwgbGVuKGNoYXJMaXN0KToKICAgICAgICBqID0gMQogICAgICAgIHJ2LmFwcGVuZChjaGFyTGlzdFtpXSkKICAgICAgICB3aGlsZSBpICsgaiA8IGxlbihjaGFyTGlzdCkgYW5kIGNoYXJMaXN0W2kgKyBqXVswXSA8PSBydlstMV1bMV0gKyAxOgogICAgICAgICAgICBydlstMV1bMV0gPSBjaGFyTGlzdFtpICsgal1bMV0KICAgICAgICAgICAgaiArPSAxCiAgICAgICAgaSArPSBqCiAgICByZXR1cm4gcnYKCiMgV2UgZG9uJ3QgcmVhbGx5IHN1cHBvcnQgY2hhcmFjdGVycyBhYm92ZSB0aGUgQk1QIDooCm1heF91bmljb2RlID0gaW50KCJGRkZGIiwgMTYpCgoKZGVmIG1pc3NpbmdSYW5nZXMoY2hhckxpc3QpOgogICAgcnYgPSBbXQogICAgaWYgY2hhckxpc3RbMF0gIT0gMDoKICAgICAgICBydi5hcHBlbmQoWzAsIGNoYXJMaXN0WzBdWzBdIC0gMV0pCiAgICBmb3IgaSwgaXRlbSBpbiBlbnVtZXJhdGUoY2hhckxpc3RbOi0xXSk6CiAgICAgICAgcnYuYXBwZW5kKFtpdGVtWzFdICsgMSwgY2hhckxpc3RbaSArIDFdWzBdIC0gMV0pCiAgICBpZiBjaGFyTGlzdFstMV1bMV0gIT0gbWF4X3VuaWNvZGU6CiAgICAgICAgcnYuYXBwZW5kKFtjaGFyTGlzdFstMV1bMV0gKyAxLCBtYXhfdW5pY29kZV0pCiAgICByZXR1cm4gcnYKCgpkZWYgbGlzdFRvUmVnZXhwU3RyKGNoYXJMaXN0KToKICAgIHJ2ID0gW10KICAgIGZvciBpdGVtIGluIGNoYXJMaXN0OgogICAgICAgIGlmIGl0ZW1bMF0gPT0gaXRlbVsxXToKICAgICAgICAgICAgcnYuYXBwZW5kKGVzY2FwZVJlZ2V4cChjaHIoaXRlbVswXSkpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJ2LmFwcGVuZChlc2NhcGVSZWdleHAoY2hyKGl0ZW1bMF0pKSArICItIiArCiAgICAgICAgICAgICAgICAgICAgICBlc2NhcGVSZWdleHAoY2hyKGl0ZW1bMV0pKSkKICAgIHJldHVybiAiWyVzXSIgJSAiIi5qb2luKHJ2KQoKCmRlZiBoZXhUb0ludChoZXhfc3RyKToKICAgIHJldHVybiBpbnQoaGV4X3N0ciwgMTYpCgoKZGVmIGVzY2FwZVJlZ2V4cChzdHJpbmcpOgogICAgc3BlY2lhbENoYXJhY3RlcnMgPSAoIi4iLCAiXiIsICIkIiwgIioiLCAiKyIsICI/IiwgInsiLCAifSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiWyIsICJdIiwgInwiLCAiKCIsICIpIiwgIi0iKQogICAgZm9yIGNoYXIgaW4gc3BlY2lhbENoYXJhY3RlcnM6CiAgICAgICAgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UoY2hhciwgIlxcIiArIGNoYXIpCgogICAgcmV0dXJuIHN0cmluZwoKIyBvdXRwdXQgZnJvbSB0aGUgYWJvdmUKbm9uWG1sTmFtZUJNUFJlZ2V4cCA9IHJlLmNvbXBpbGUoJ1tceDAwLSwvOi1AXFxbLVxcXmBcXHstXHhiNlx4YjgtXHhiZlx4ZDdceGY3XHUwMTMyLVx1MDEzM1x1MDEzZi1cdTAxNDBcdTAxNDlcdTAxN2ZcdTAxYzQtXHUwMWNjXHUwMWYxLVx1MDFmM1x1MDFmNi1cdTAxZjlcdTAyMTgtXHUwMjRmXHUwMmE5LVx1MDJiYVx1MDJjMi1cdTAyY2ZcdTAyZDItXHUwMmZmXHUwMzQ2LVx1MDM1Zlx1MDM2Mi1cdTAzODVcdTAzOGJcdTAzOGRcdTAzYTJcdTAzY2ZcdTAzZDctXHUwM2Q5XHUwM2RiXHUwM2RkXHUwM2RmXHUwM2UxXHUwM2Y0LVx1MDQwMFx1MDQwZFx1MDQ1MFx1MDQ1ZFx1MDQ4Mlx1MDQ4Ny1cdTA0OGZcdTA0YzUtXHUwNGM2XHUwNGM5LVx1MDRjYVx1MDRjZC1cdTA0Y2ZcdTA0ZWMtXHUwNGVkXHUwNGY2LVx1MDRmN1x1MDRmYS1cdTA1MzBcdTA1NTctXHUwNTU4XHUwNTVhLVx1MDU2MFx1MDU4Ny1cdTA1OTBcdTA1YTJcdTA1YmFcdTA1YmVcdTA1YzBcdTA1YzNcdTA1YzUtXHUwNWNmXHUwNWViLVx1MDVlZlx1MDVmMy1cdTA2MjBcdTA2M2ItXHUwNjNmXHUwNjUzLVx1MDY1Zlx1MDY2YS1cdTA2NmZcdTA2YjgtXHUwNmI5XHUwNmJmXHUwNmNmXHUwNmQ0XHUwNmU5XHUwNmVlLVx1MDZlZlx1MDZmYS1cdTA5MDBcdTA5MDRcdTA5M2EtXHUwOTNiXHUwOTRlLVx1MDk1MFx1MDk1NS1cdTA5NTdcdTA5NjQtXHUwOTY1XHUwOTcwLVx1MDk4MFx1MDk4NFx1MDk4ZC1cdTA5OGVcdTA5OTEtXHUwOTkyXHUwOWE5XHUwOWIxXHUwOWIzLVx1MDliNVx1MDliYS1cdTA5YmJcdTA5YmRcdTA5YzUtXHUwOWM2XHUwOWM5LVx1MDljYVx1MDljZS1cdTA5ZDZcdTA5ZDgtXHUwOWRiXHUwOWRlXHUwOWU0LVx1MDllNVx1MDlmMi1cdTBhMDFcdTBhMDMtXHUwYTA0XHUwYTBiLVx1MGEwZVx1MGExMS1cdTBhMTJcdTBhMjlcdTBhMzFcdTBhMzRcdTBhMzdcdTBhM2EtXHUwYTNiXHUwYTNkXHUwYTQzLVx1MGE0Nlx1MGE0OS1cdTBhNGFcdTBhNGUtXHUwYTU4XHUwYTVkXHUwYTVmLVx1MGE2NVx1MGE3NS1cdTBhODBcdTBhODRcdTBhOGNcdTBhOGVcdTBhOTJcdTBhYTlcdTBhYjFcdTBhYjRcdTBhYmEtXHUwYWJiXHUwYWM2XHUwYWNhXHUwYWNlLVx1MGFkZlx1MGFlMS1cdTBhZTVcdTBhZjAtXHUwYjAwXHUwYjA0XHUwYjBkLVx1MGIwZVx1MGIxMS1cdTBiMTJcdTBiMjlcdTBiMzFcdTBiMzQtXHUwYjM1XHUwYjNhLVx1MGIzYlx1MGI0NC1cdTBiNDZcdTBiNDktXHUwYjRhXHUwYjRlLVx1MGI1NVx1MGI1OC1cdTBiNWJcdTBiNWVcdTBiNjItXHUwYjY1XHUwYjcwLVx1MGI4MVx1MGI4NFx1MGI4Yi1cdTBiOGRcdTBiOTFcdTBiOTYtXHUwYjk4XHUwYjliXHUwYjlkXHUwYmEwLVx1MGJhMlx1MGJhNS1cdTBiYTdcdTBiYWItXHUwYmFkXHUwYmI2XHUwYmJhLVx1MGJiZFx1MGJjMy1cdTBiYzVcdTBiYzlcdTBiY2UtXHUwYmQ2XHUwYmQ4LVx1MGJlNlx1MGJmMC1cdTBjMDBcdTBjMDRcdTBjMGRcdTBjMTFcdTBjMjlcdTBjMzRcdTBjM2EtXHUwYzNkXHUwYzQ1XHUwYzQ5XHUwYzRlLVx1MGM1NFx1MGM1Ny1cdTBjNWZcdTBjNjItXHUwYzY1XHUwYzcwLVx1MGM4MVx1MGM4NFx1MGM4ZFx1MGM5MVx1MGNhOVx1MGNiNFx1MGNiYS1cdTBjYmRcdTBjYzVcdTBjYzlcdTBjY2UtXHUwY2Q0XHUwY2Q3LVx1MGNkZFx1MGNkZlx1MGNlMi1cdTBjZTVcdTBjZjAtXHUwZDAxXHUwZDA0XHUwZDBkXHUwZDExXHUwZDI5XHUwZDNhLVx1MGQzZFx1MGQ0NC1cdTBkNDVcdTBkNDlcdTBkNGUtXHUwZDU2XHUwZDU4LVx1MGQ1Zlx1MGQ2Mi1cdTBkNjVcdTBkNzAtXHUwZTAwXHUwZTJmXHUwZTNiLVx1MGUzZlx1MGU0Zlx1MGU1YS1cdTBlODBcdTBlODNcdTBlODUtXHUwZTg2XHUwZTg5XHUwZThiLVx1MGU4Y1x1MGU4ZS1cdTBlOTNcdTBlOThcdTBlYTBcdTBlYTRcdTBlYTZcdTBlYTgtXHUwZWE5XHUwZWFjXHUwZWFmXHUwZWJhXHUwZWJlLVx1MGViZlx1MGVjNVx1MGVjN1x1MGVjZS1cdTBlY2ZcdTBlZGEtXHUwZjE3XHUwZjFhLVx1MGYxZlx1MGYyYS1cdTBmMzRcdTBmMzZcdTBmMzhcdTBmM2EtXHUwZjNkXHUwZjQ4XHUwZjZhLVx1MGY3MFx1MGY4NVx1MGY4Yy1cdTBmOGZcdTBmOTZcdTBmOThcdTBmYWUtXHUwZmIwXHUwZmI4XHUwZmJhLVx1MTA5Zlx1MTBjNi1cdTEwY2ZcdTEwZjctXHUxMGZmXHUxMTAxXHUxMTA0XHUxMTA4XHUxMTBhXHUxMTBkXHUxMTEzLVx1MTEzYlx1MTEzZFx1MTEzZlx1MTE0MS1cdTExNGJcdTExNGRcdTExNGZcdTExNTEtXHUxMTUzXHUxMTU2LVx1MTE1OFx1MTE1YS1cdTExNWVcdTExNjJcdTExNjRcdTExNjZcdTExNjhcdTExNmEtXHUxMTZjXHUxMTZmLVx1MTE3MVx1MTE3NFx1MTE3Ni1cdTExOWRcdTExOWYtXHUxMWE3XHUxMWE5LVx1MTFhYVx1MTFhYy1cdTExYWRcdTExYjAtXHUxMWI2XHUxMWI5XHUxMWJiXHUxMWMzLVx1MTFlYVx1MTFlYy1cdTExZWZcdTExZjEtXHUxMWY4XHUxMWZhLVx1MWRmZlx1MWU5Yy1cdTFlOWZcdTFlZmEtXHUxZWZmXHUxZjE2LVx1MWYxN1x1MWYxZS1cdTFmMWZcdTFmNDYtXHUxZjQ3XHUxZjRlLVx1MWY0Zlx1MWY1OFx1MWY1YVx1MWY1Y1x1MWY1ZVx1MWY3ZS1cdTFmN2ZcdTFmYjVcdTFmYmRcdTFmYmYtXHUxZmMxXHUxZmM1XHUxZmNkLVx1MWZjZlx1MWZkNC1cdTFmZDVcdTFmZGMtXHUxZmRmXHUxZmVkLVx1MWZmMVx1MWZmNVx1MWZmZC1cdTIwY2ZcdTIwZGQtXHUyMGUwXHUyMGUyLVx1MjEyNVx1MjEyNy1cdTIxMjlcdTIxMmMtXHUyMTJkXHUyMTJmLVx1MjE3Zlx1MjE4My1cdTMwMDRcdTMwMDZcdTMwMDgtXHUzMDIwXHUzMDMwXHUzMDM2LVx1MzA0MFx1MzA5NS1cdTMwOThcdTMwOWItXHUzMDljXHUzMDlmLVx1MzBhMFx1MzBmYlx1MzBmZi1cdTMxMDRcdTMxMmQtXHU0ZGZmXHU5ZmE2LVx1YWJmZlx1ZDdhNC1cdWZmZmZdJykgICMgbm9xYQoKbm9uWG1sTmFtZUZpcnN0Qk1QUmVnZXhwID0gcmUuY29tcGlsZSgnW1x4MDAtQFxcWy1cXF5gXFx7LVx4YmZceGQ3XHhmN1x1MDEzMi1cdTAxMzNcdTAxM2YtXHUwMTQwXHUwMTQ5XHUwMTdmXHUwMWM0LVx1MDFjY1x1MDFmMS1cdTAxZjNcdTAxZjYtXHUwMWY5XHUwMjE4LVx1MDI0Zlx1MDJhOS1cdTAyYmFcdTAyYzItXHUwMzg1XHUwMzg3XHUwMzhiXHUwMzhkXHUwM2EyXHUwM2NmXHUwM2Q3LVx1MDNkOVx1MDNkYlx1MDNkZFx1MDNkZlx1MDNlMVx1MDNmNC1cdTA0MDBcdTA0MGRcdTA0NTBcdTA0NWRcdTA0ODItXHUwNDhmXHUwNGM1LVx1MDRjNlx1MDRjOS1cdTA0Y2FcdTA0Y2QtXHUwNGNmXHUwNGVjLVx1MDRlZFx1MDRmNi1cdTA0ZjdcdTA0ZmEtXHUwNTMwXHUwNTU3LVx1MDU1OFx1MDU1YS1cdTA1NjBcdTA1ODctXHUwNWNmXHUwNWViLVx1MDVlZlx1MDVmMy1cdTA2MjBcdTA2M2ItXHUwNjQwXHUwNjRiLVx1MDY3MFx1MDZiOC1cdTA2YjlcdTA2YmZcdTA2Y2ZcdTA2ZDRcdTA2ZDYtXHUwNmU0XHUwNmU3LVx1MDkwNFx1MDkzYS1cdTA5M2NcdTA5M2UtXHUwOTU3XHUwOTYyLVx1MDk4NFx1MDk4ZC1cdTA5OGVcdTA5OTEtXHUwOTkyXHUwOWE5XHUwOWIxXHUwOWIzLVx1MDliNVx1MDliYS1cdTA5ZGJcdTA5ZGVcdTA5ZTItXHUwOWVmXHUwOWYyLVx1MGEwNFx1MGEwYi1cdTBhMGVcdTBhMTEtXHUwYTEyXHUwYTI5XHUwYTMxXHUwYTM0XHUwYTM3XHUwYTNhLVx1MGE1OFx1MGE1ZFx1MGE1Zi1cdTBhNzFcdTBhNzUtXHUwYTg0XHUwYThjXHUwYThlXHUwYTkyXHUwYWE5XHUwYWIxXHUwYWI0XHUwYWJhLVx1MGFiY1x1MGFiZS1cdTBhZGZcdTBhZTEtXHUwYjA0XHUwYjBkLVx1MGIwZVx1MGIxMS1cdTBiMTJcdTBiMjlcdTBiMzFcdTBiMzQtXHUwYjM1XHUwYjNhLVx1MGIzY1x1MGIzZS1cdTBiNWJcdTBiNWVcdTBiNjItXHUwYjg0XHUwYjhiLVx1MGI4ZFx1MGI5MVx1MGI5Ni1cdTBiOThcdTBiOWJcdTBiOWRcdTBiYTAtXHUwYmEyXHUwYmE1LVx1MGJhN1x1MGJhYi1cdTBiYWRcdTBiYjZcdTBiYmEtXHUwYzA0XHUwYzBkXHUwYzExXHUwYzI5XHUwYzM0XHUwYzNhLVx1MGM1Zlx1MGM2Mi1cdTBjODRcdTBjOGRcdTBjOTFcdTBjYTlcdTBjYjRcdTBjYmEtXHUwY2RkXHUwY2RmXHUwY2UyLVx1MGQwNFx1MGQwZFx1MGQxMVx1MGQyOVx1MGQzYS1cdTBkNWZcdTBkNjItXHUwZTAwXHUwZTJmXHUwZTMxXHUwZTM0LVx1MGUzZlx1MGU0Ni1cdTBlODBcdTBlODNcdTBlODUtXHUwZTg2XHUwZTg5XHUwZThiLVx1MGU4Y1x1MGU4ZS1cdTBlOTNcdTBlOThcdTBlYTBcdTBlYTRcdTBlYTZcdTBlYTgtXHUwZWE5XHUwZWFjXHUwZWFmXHUwZWIxXHUwZWI0LVx1MGViY1x1MGViZS1cdTBlYmZcdTBlYzUtXHUwZjNmXHUwZjQ4XHUwZjZhLVx1MTA5Zlx1MTBjNi1cdTEwY2ZcdTEwZjctXHUxMGZmXHUxMTAxXHUxMTA0XHUxMTA4XHUxMTBhXHUxMTBkXHUxMTEzLVx1MTEzYlx1MTEzZFx1MTEzZlx1MTE0MS1cdTExNGJcdTExNGRcdTExNGZcdTExNTEtXHUxMTUzXHUxMTU2LVx1MTE1OFx1MTE1YS1cdTExNWVcdTExNjJcdTExNjRcdTExNjZcdTExNjhcdTExNmEtXHUxMTZjXHUxMTZmLVx1MTE3MVx1MTE3NFx1MTE3Ni1cdTExOWRcdTExOWYtXHUxMWE3XHUxMWE5LVx1MTFhYVx1MTFhYy1cdTExYWRcdTExYjAtXHUxMWI2XHUxMWI5XHUxMWJiXHUxMWMzLVx1MTFlYVx1MTFlYy1cdTExZWZcdTExZjEtXHUxMWY4XHUxMWZhLVx1MWRmZlx1MWU5Yy1cdTFlOWZcdTFlZmEtXHUxZWZmXHUxZjE2LVx1MWYxN1x1MWYxZS1cdTFmMWZcdTFmNDYtXHUxZjQ3XHUxZjRlLVx1MWY0Zlx1MWY1OFx1MWY1YVx1MWY1Y1x1MWY1ZVx1MWY3ZS1cdTFmN2ZcdTFmYjVcdTFmYmRcdTFmYmYtXHUxZmMxXHUxZmM1XHUxZmNkLVx1MWZjZlx1MWZkNC1cdTFmZDVcdTFmZGMtXHUxZmRmXHUxZmVkLVx1MWZmMVx1MWZmNVx1MWZmZC1cdTIxMjVcdTIxMjctXHUyMTI5XHUyMTJjLVx1MjEyZFx1MjEyZi1cdTIxN2ZcdTIxODMtXHUzMDA2XHUzMDA4LVx1MzAyMFx1MzAyYS1cdTMwNDBcdTMwOTUtXHUzMGEwXHUzMGZiLVx1MzEwNFx1MzEyZC1cdTRkZmZcdTlmYTYtXHVhYmZmXHVkN2E0LVx1ZmZmZl0nKSAgIyBub3FhCgojIFNpbXBsZXIgdGhpbmdzCm5vblB1YmlkQ2hhclJlZ2V4cCA9IHJlLmNvbXBpbGUoIlteXHgyMFx4MERceDBBYS16QS1aMC05XC1cJygpKywuLzo9PzshKiNAJF8lXSIpCgoKY2xhc3MgSW5mb3NldEZpbHRlcihvYmplY3QpOgogICAgcmVwbGFjZW1lbnRSZWdleHAgPSByZS5jb21waWxlKHIiVVtcZEEtRl17NSw1fSIpCgogICAgZGVmIF9faW5pdF9fKHNlbGYsCiAgICAgICAgICAgICAgICAgZHJvcFhtbG5zTG9jYWxOYW1lPUZhbHNlLAogICAgICAgICAgICAgICAgIGRyb3BYbWxuc0F0dHJOcz1GYWxzZSwKICAgICAgICAgICAgICAgICBwcmV2ZW50RG91YmxlRGFzaENvbW1lbnRzPUZhbHNlLAogICAgICAgICAgICAgICAgIHByZXZlbnREYXNoQXRDb21tZW50RW5kPUZhbHNlLAogICAgICAgICAgICAgICAgIHJlcGxhY2VGb3JtRmVlZENoYXJhY3RlcnM9VHJ1ZSwKICAgICAgICAgICAgICAgICBwcmV2ZW50U2luZ2xlUXVvdGVQdWJpZD1GYWxzZSk6CgogICAgICAgIHNlbGYuZHJvcFhtbG5zTG9jYWxOYW1lID0gZHJvcFhtbG5zTG9jYWxOYW1lCiAgICAgICAgc2VsZi5kcm9wWG1sbnNBdHRyTnMgPSBkcm9wWG1sbnNBdHRyTnMKCiAgICAgICAgc2VsZi5wcmV2ZW50RG91YmxlRGFzaENvbW1lbnRzID0gcHJldmVudERvdWJsZURhc2hDb21tZW50cwogICAgICAgIHNlbGYucHJldmVudERhc2hBdENvbW1lbnRFbmQgPSBwcmV2ZW50RGFzaEF0Q29tbWVudEVuZAoKICAgICAgICBzZWxmLnJlcGxhY2VGb3JtRmVlZENoYXJhY3RlcnMgPSByZXBsYWNlRm9ybUZlZWRDaGFyYWN0ZXJzCgogICAgICAgIHNlbGYucHJldmVudFNpbmdsZVF1b3RlUHViaWQgPSBwcmV2ZW50U2luZ2xlUXVvdGVQdWJpZAoKICAgICAgICBzZWxmLnJlcGxhY2VDYWNoZSA9IHt9CgogICAgZGVmIGNvZXJjZUF0dHJpYnV0ZShzZWxmLCBuYW1lLCBuYW1lc3BhY2U9Tm9uZSk6CiAgICAgICAgaWYgc2VsZi5kcm9wWG1sbnNMb2NhbE5hbWUgYW5kIG5hbWUuc3RhcnRzd2l0aCgieG1sbnM6Iik6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkF0dHJpYnV0ZXMgY2Fubm90IGJlZ2luIHdpdGggeG1sbnMiLCBEYXRhTG9zc1dhcm5pbmcpCiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgZWxpZiAoc2VsZi5kcm9wWG1sbnNBdHRyTnMgYW5kCiAgICAgICAgICAgICAgbmFtZXNwYWNlID09ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyIpOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJBdHRyaWJ1dGVzIGNhbm5vdCBiZSBpbiB0aGUgeG1sIG5hbWVzcGFjZSIsIERhdGFMb3NzV2FybmluZykKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc2VsZi50b1htbE5hbWUobmFtZSkKCiAgICBkZWYgY29lcmNlRWxlbWVudChzZWxmLCBuYW1lKToKICAgICAgICByZXR1cm4gc2VsZi50b1htbE5hbWUobmFtZSkKCiAgICBkZWYgY29lcmNlQ29tbWVudChzZWxmLCBkYXRhKToKICAgICAgICBpZiBzZWxmLnByZXZlbnREb3VibGVEYXNoQ29tbWVudHM6CiAgICAgICAgICAgIHdoaWxlICItLSIgaW4gZGF0YToKICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNvbW1lbnRzIGNhbm5vdCBjb250YWluIGFkamFjZW50IGRhc2hlcyIsIERhdGFMb3NzV2FybmluZykKICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLnJlcGxhY2UoIi0tIiwgIi0gLSIpCiAgICAgICAgICAgIGlmIGRhdGEuZW5kc3dpdGgoIi0iKToKICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNvbW1lbnRzIGNhbm5vdCBlbmQgaW4gYSBkYXNoIiwgRGF0YUxvc3NXYXJuaW5nKQogICAgICAgICAgICAgICAgZGF0YSArPSAiICIKICAgICAgICByZXR1cm4gZGF0YQoKICAgIGRlZiBjb2VyY2VDaGFyYWN0ZXJzKHNlbGYsIGRhdGEpOgogICAgICAgIGlmIHNlbGYucmVwbGFjZUZvcm1GZWVkQ2hhcmFjdGVyczoKICAgICAgICAgICAgZm9yIF8gaW4gcmFuZ2UoZGF0YS5jb3VudCgiXHgwQyIpKToKICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIlRleHQgY2Fubm90IGNvbnRhaW4gVSswMDBDIiwgRGF0YUxvc3NXYXJuaW5nKQogICAgICAgICAgICBkYXRhID0gZGF0YS5yZXBsYWNlKCJceDBDIiwgIiAiKQogICAgICAgICMgT3RoZXIgbm9uLXhtbCBjaGFyYWN0ZXJzCiAgICAgICAgcmV0dXJuIGRhdGEKCiAgICBkZWYgY29lcmNlUHViaWQoc2VsZiwgZGF0YSk6CiAgICAgICAgZGF0YU91dHB1dCA9IGRhdGEKICAgICAgICBmb3IgY2hhciBpbiBub25QdWJpZENoYXJSZWdleHAuZmluZGFsbChkYXRhKToKICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ29lcmNpbmcgbm9uLVhNTCBwdWJpZCIsIERhdGFMb3NzV2FybmluZykKICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSBzZWxmLmdldFJlcGxhY2VtZW50Q2hhcmFjdGVyKGNoYXIpCiAgICAgICAgICAgIGRhdGFPdXRwdXQgPSBkYXRhT3V0cHV0LnJlcGxhY2UoY2hhciwgcmVwbGFjZW1lbnQpCiAgICAgICAgaWYgc2VsZi5wcmV2ZW50U2luZ2xlUXVvdGVQdWJpZCBhbmQgZGF0YU91dHB1dC5maW5kKCInIikgPj0gMDoKICAgICAgICAgICAgd2FybmluZ3Mud2FybigiUHViaWQgY2Fubm90IGNvbnRhaW4gc2luZ2xlIHF1b3RlIiwgRGF0YUxvc3NXYXJuaW5nKQogICAgICAgICAgICBkYXRhT3V0cHV0ID0gZGF0YU91dHB1dC5yZXBsYWNlKCInIiwgc2VsZi5nZXRSZXBsYWNlbWVudENoYXJhY3RlcigiJyIpKQogICAgICAgIHJldHVybiBkYXRhT3V0cHV0CgogICAgZGVmIHRvWG1sTmFtZShzZWxmLCBuYW1lKToKICAgICAgICBuYW1lRmlyc3QgPSBuYW1lWzBdCiAgICAgICAgbmFtZVJlc3QgPSBuYW1lWzE6XQogICAgICAgIG0gPSBub25YbWxOYW1lRmlyc3RCTVBSZWdleHAubWF0Y2gobmFtZUZpcnN0KQogICAgICAgIGlmIG06CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNvZXJjaW5nIG5vbi1YTUwgbmFtZSIsIERhdGFMb3NzV2FybmluZykKICAgICAgICAgICAgbmFtZUZpcnN0T3V0cHV0ID0gc2VsZi5nZXRSZXBsYWNlbWVudENoYXJhY3RlcihuYW1lRmlyc3QpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbmFtZUZpcnN0T3V0cHV0ID0gbmFtZUZpcnN0CgogICAgICAgIG5hbWVSZXN0T3V0cHV0ID0gbmFtZVJlc3QKICAgICAgICByZXBsYWNlQ2hhcnMgPSBzZXQobm9uWG1sTmFtZUJNUFJlZ2V4cC5maW5kYWxsKG5hbWVSZXN0KSkKICAgICAgICBmb3IgY2hhciBpbiByZXBsYWNlQ2hhcnM6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNvZXJjaW5nIG5vbi1YTUwgbmFtZSIsIERhdGFMb3NzV2FybmluZykKICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSBzZWxmLmdldFJlcGxhY2VtZW50Q2hhcmFjdGVyKGNoYXIpCiAgICAgICAgICAgIG5hbWVSZXN0T3V0cHV0ID0gbmFtZVJlc3RPdXRwdXQucmVwbGFjZShjaGFyLCByZXBsYWNlbWVudCkKICAgICAgICByZXR1cm4gbmFtZUZpcnN0T3V0cHV0ICsgbmFtZVJlc3RPdXRwdXQKCiAgICBkZWYgZ2V0UmVwbGFjZW1lbnRDaGFyYWN0ZXIoc2VsZiwgY2hhcik6CiAgICAgICAgaWYgY2hhciBpbiBzZWxmLnJlcGxhY2VDYWNoZToKICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSBzZWxmLnJlcGxhY2VDYWNoZVtjaGFyXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gc2VsZi5lc2NhcGVDaGFyKGNoYXIpCiAgICAgICAgcmV0dXJuIHJlcGxhY2VtZW50CgogICAgZGVmIGZyb21YbWxOYW1lKHNlbGYsIG5hbWUpOgogICAgICAgIGZvciBpdGVtIGluIHNldChzZWxmLnJlcGxhY2VtZW50UmVnZXhwLmZpbmRhbGwobmFtZSkpOgogICAgICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKGl0ZW0sIHNlbGYudW5lc2NhcGVDaGFyKGl0ZW0pKQogICAgICAgIHJldHVybiBuYW1lCgogICAgZGVmIGVzY2FwZUNoYXIoc2VsZiwgY2hhcik6CiAgICAgICAgcmVwbGFjZW1lbnQgPSAiVSUwNVgiICUgb3JkKGNoYXIpCiAgICAgICAgc2VsZi5yZXBsYWNlQ2FjaGVbY2hhcl0gPSByZXBsYWNlbWVudAogICAgICAgIHJldHVybiByZXBsYWNlbWVudAoKICAgIGRlZiB1bmVzY2FwZUNoYXIoc2VsZiwgY2hhcmNvZGUpOgogICAgICAgIHJldHVybiBjaHIoaW50KGNoYXJjb2RlWzE6XSwgMTYpKQpQSwMEFAAAAAAAAAAhAB4MbTUUfwAAFH8AADQAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvX2lucHV0c3RyZWFtLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCgpmcm9tIHBpcC5fdmVuZG9yLnNpeCBpbXBvcnQgdGV4dF90eXBlLCBiaW5hcnlfdHlwZQpmcm9tIHBpcC5fdmVuZG9yLnNpeC5tb3ZlcyBpbXBvcnQgaHR0cF9jbGllbnQsIHVybGxpYgoKaW1wb3J0IGNvZGVjcwppbXBvcnQgcmUKCmZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IHdlYmVuY29kaW5ncwoKZnJvbSAuY29uc3RhbnRzIGltcG9ydCBFT0YsIHNwYWNlQ2hhcmFjdGVycywgYXNjaWlMZXR0ZXJzLCBhc2NpaVVwcGVyY2FzZQpmcm9tIC5jb25zdGFudHMgaW1wb3J0IFJlcGFyc2VFeGNlcHRpb24KZnJvbSAuIGltcG9ydCBfdXRpbHMKCmZyb20gaW8gaW1wb3J0IFN0cmluZ0lPCgp0cnk6CiAgICBmcm9tIGlvIGltcG9ydCBCeXRlc0lPCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIEJ5dGVzSU8gPSBTdHJpbmdJTwoKIyBOb24tdW5pY29kZSB2ZXJzaW9ucyBvZiBjb25zdGFudHMgZm9yIHVzZSBpbiB0aGUgcHJlLXBhcnNlcgpzcGFjZUNoYXJhY3RlcnNCeXRlcyA9IGZyb3plbnNldChbaXRlbS5lbmNvZGUoImFzY2lpIikgZm9yIGl0ZW0gaW4gc3BhY2VDaGFyYWN0ZXJzXSkKYXNjaWlMZXR0ZXJzQnl0ZXMgPSBmcm96ZW5zZXQoW2l0ZW0uZW5jb2RlKCJhc2NpaSIpIGZvciBpdGVtIGluIGFzY2lpTGV0dGVyc10pCmFzY2lpVXBwZXJjYXNlQnl0ZXMgPSBmcm96ZW5zZXQoW2l0ZW0uZW5jb2RlKCJhc2NpaSIpIGZvciBpdGVtIGluIGFzY2lpVXBwZXJjYXNlXSkKc3BhY2VzQW5nbGVCcmFja2V0cyA9IHNwYWNlQ2hhcmFjdGVyc0J5dGVzIHwgZnJvemVuc2V0KFtiIj4iLCBiIjwiXSkKCgppbnZhbGlkX3VuaWNvZGVfbm9fc3Vycm9nYXRlID0gIltcdTAwMDEtXHUwMDA4XHUwMDBCXHUwMDBFLVx1MDAxRlx1MDA3Ri1cdTAwOUZcdUZERDAtXHVGREVGXHVGRkZFXHVGRkZGXFUwMDAxRkZGRVxVMDAwMUZGRkZcVTAwMDJGRkZFXFUwMDAyRkZGRlxVMDAwM0ZGRkVcVTAwMDNGRkZGXFUwMDA0RkZGRVxVMDAwNEZGRkZcVTAwMDVGRkZFXFUwMDA1RkZGRlxVMDAwNkZGRkVcVTAwMDZGRkZGXFUwMDA3RkZGRVxVMDAwN0ZGRkZcVTAwMDhGRkZFXFUwMDA4RkZGRlxVMDAwOUZGRkVcVTAwMDlGRkZGXFUwMDBBRkZGRVxVMDAwQUZGRkZcVTAwMEJGRkZFXFUwMDBCRkZGRlxVMDAwQ0ZGRkVcVTAwMENGRkZGXFUwMDBERkZGRVxVMDAwREZGRkZcVTAwMEVGRkZFXFUwMDBFRkZGRlxVMDAwRkZGRkVcVTAwMEZGRkZGXFUwMDEwRkZGRVxVMDAxMEZGRkZdIiAgIyBub3FhCgppZiBfdXRpbHMuc3VwcG9ydHNfbG9uZV9zdXJyb2dhdGVzOgogICAgIyBVc2Ugb25lIGV4dHJhIHN0ZXAgb2YgaW5kaXJlY3Rpb24gYW5kIGNyZWF0ZSBzdXJyb2dhdGVzIHdpdGgKICAgICMgZXZhbC4gTm90IHVzaW5nIHRoaXMgaW5kaXJlY3Rpb24gd291bGQgaW50cm9kdWNlIGFuIGlsbGVnYWwKICAgICMgdW5pY29kZSBsaXRlcmFsIG9uIHBsYXRmb3JtcyBub3Qgc3VwcG9ydGluZyBzdWNoIGxvbmUKICAgICMgc3Vycm9nYXRlcy4KICAgIGFzc2VydCBpbnZhbGlkX3VuaWNvZGVfbm9fc3Vycm9nYXRlWy0xXSA9PSAiXSIgYW5kIGludmFsaWRfdW5pY29kZV9ub19zdXJyb2dhdGUuY291bnQoIl0iKSA9PSAxCiAgICBpbnZhbGlkX3VuaWNvZGVfcmUgPSByZS5jb21waWxlKGludmFsaWRfdW5pY29kZV9ub19zdXJyb2dhdGVbOi0xXSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2YWwoJyJcXHVEODAwLVxcdURGRkYiJykgKyAgIyBweWxpbnQ6ZGlzYWJsZT1ldmFsLXVzZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl0iKQplbHNlOgogICAgaW52YWxpZF91bmljb2RlX3JlID0gcmUuY29tcGlsZShpbnZhbGlkX3VuaWNvZGVfbm9fc3Vycm9nYXRlKQoKbm9uX2JtcF9pbnZhbGlkX2NvZGVwb2ludHMgPSBzZXQoWzB4MUZGRkUsIDB4MUZGRkYsIDB4MkZGRkUsIDB4MkZGRkYsIDB4M0ZGRkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNGRkZGLCAweDRGRkZFLCAweDRGRkZGLCAweDVGRkZFLCAweDVGRkZGLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2RkZGRSwgMHg2RkZGRiwgMHg3RkZGRSwgMHg3RkZGRiwgMHg4RkZGRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OEZGRkYsIDB4OUZGRkUsIDB4OUZGRkYsIDB4QUZGRkUsIDB4QUZGRkYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEJGRkZFLCAweEJGRkZGLCAweENGRkZFLCAweENGRkZGLCAweERGRkZFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERkZGRiwgMHhFRkZGRSwgMHhFRkZGRiwgMHhGRkZGRSwgMHhGRkZGRiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTBGRkZFLCAweDEwRkZGRl0pCgphc2NpaV9wdW5jdHVhdGlvbl9yZSA9IHJlLmNvbXBpbGUoIltcdTAwMDktXHUwMDBEXHUwMDIwLVx1MDAyRlx1MDAzQS1cdTAwNDBcdTAwNUItXHUwMDYwXHUwMDdCLVx1MDA3RV0iKQoKIyBDYWNoZSBmb3IgY2hhcnNVbnRpbCgpCmNoYXJzVW50aWxSZWdFeCA9IHt9CgoKY2xhc3MgQnVmZmVyZWRTdHJlYW0ob2JqZWN0KToKICAgICIiIkJ1ZmZlcmluZyBmb3Igc3RyZWFtcyB0aGF0IGRvIG5vdCBoYXZlIGJ1ZmZlcmluZyBvZiB0aGVpciBvd24KCiAgICBUaGUgYnVmZmVyIGlzIGltcGxlbWVudGVkIGFzIGEgbGlzdCBvZiBjaHVua3Mgb24gdGhlIGFzc3VtcHRpb24gdGhhdAogICAgam9pbmluZyBtYW55IHN0cmluZ3Mgd2lsbCBiZSBzbG93IHNpbmNlIGl0IGlzIE8obioqMikKICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0pOgogICAgICAgIHNlbGYuc3RyZWFtID0gc3RyZWFtCiAgICAgICAgc2VsZi5idWZmZXIgPSBbXQogICAgICAgIHNlbGYucG9zaXRpb24gPSBbLTEsIDBdICAjIGNodW5rIG51bWJlciwgb2Zmc2V0CgogICAgZGVmIHRlbGwoc2VsZik6CiAgICAgICAgcG9zID0gMAogICAgICAgIGZvciBjaHVuayBpbiBzZWxmLmJ1ZmZlcls6c2VsZi5wb3NpdGlvblswXV06CiAgICAgICAgICAgIHBvcyArPSBsZW4oY2h1bmspCiAgICAgICAgcG9zICs9IHNlbGYucG9zaXRpb25bMV0KICAgICAgICByZXR1cm4gcG9zCgogICAgZGVmIHNlZWsoc2VsZiwgcG9zKToKICAgICAgICBhc3NlcnQgcG9zIDw9IHNlbGYuX2J1ZmZlcmVkQnl0ZXMoKQogICAgICAgIG9mZnNldCA9IHBvcwogICAgICAgIGkgPSAwCiAgICAgICAgd2hpbGUgbGVuKHNlbGYuYnVmZmVyW2ldKSA8IG9mZnNldDoKICAgICAgICAgICAgb2Zmc2V0IC09IGxlbihzZWxmLmJ1ZmZlcltpXSkKICAgICAgICAgICAgaSArPSAxCiAgICAgICAgc2VsZi5wb3NpdGlvbiA9IFtpLCBvZmZzZXRdCgogICAgZGVmIHJlYWQoc2VsZiwgYnl0ZXMpOgogICAgICAgIGlmIG5vdCBzZWxmLmJ1ZmZlcjoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3JlYWRTdHJlYW0oYnl0ZXMpCiAgICAgICAgZWxpZiAoc2VsZi5wb3NpdGlvblswXSA9PSBsZW4oc2VsZi5idWZmZXIpIGFuZAogICAgICAgICAgICAgIHNlbGYucG9zaXRpb25bMV0gPT0gbGVuKHNlbGYuYnVmZmVyWy0xXSkpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fcmVhZFN0cmVhbShieXRlcykKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fcmVhZEZyb21CdWZmZXIoYnl0ZXMpCgogICAgZGVmIF9idWZmZXJlZEJ5dGVzKHNlbGYpOgogICAgICAgIHJldHVybiBzdW0oW2xlbihpdGVtKSBmb3IgaXRlbSBpbiBzZWxmLmJ1ZmZlcl0pCgogICAgZGVmIF9yZWFkU3RyZWFtKHNlbGYsIGJ5dGVzKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0ucmVhZChieXRlcykKICAgICAgICBzZWxmLmJ1ZmZlci5hcHBlbmQoZGF0YSkKICAgICAgICBzZWxmLnBvc2l0aW9uWzBdICs9IDEKICAgICAgICBzZWxmLnBvc2l0aW9uWzFdID0gbGVuKGRhdGEpCiAgICAgICAgcmV0dXJuIGRhdGEKCiAgICBkZWYgX3JlYWRGcm9tQnVmZmVyKHNlbGYsIGJ5dGVzKToKICAgICAgICByZW1haW5pbmdCeXRlcyA9IGJ5dGVzCiAgICAgICAgcnYgPSBbXQogICAgICAgIGJ1ZmZlckluZGV4ID0gc2VsZi5wb3NpdGlvblswXQogICAgICAgIGJ1ZmZlck9mZnNldCA9IHNlbGYucG9zaXRpb25bMV0KICAgICAgICB3aGlsZSBidWZmZXJJbmRleCA8IGxlbihzZWxmLmJ1ZmZlcikgYW5kIHJlbWFpbmluZ0J5dGVzICE9IDA6CiAgICAgICAgICAgIGFzc2VydCByZW1haW5pbmdCeXRlcyA+IDAKICAgICAgICAgICAgYnVmZmVyZWREYXRhID0gc2VsZi5idWZmZXJbYnVmZmVySW5kZXhdCgogICAgICAgICAgICBpZiByZW1haW5pbmdCeXRlcyA8PSBsZW4oYnVmZmVyZWREYXRhKSAtIGJ1ZmZlck9mZnNldDoKICAgICAgICAgICAgICAgIGJ5dGVzVG9SZWFkID0gcmVtYWluaW5nQnl0ZXMKICAgICAgICAgICAgICAgIHNlbGYucG9zaXRpb24gPSBbYnVmZmVySW5kZXgsIGJ1ZmZlck9mZnNldCArIGJ5dGVzVG9SZWFkXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYnl0ZXNUb1JlYWQgPSBsZW4oYnVmZmVyZWREYXRhKSAtIGJ1ZmZlck9mZnNldAogICAgICAgICAgICAgICAgc2VsZi5wb3NpdGlvbiA9IFtidWZmZXJJbmRleCwgbGVuKGJ1ZmZlcmVkRGF0YSldCiAgICAgICAgICAgICAgICBidWZmZXJJbmRleCArPSAxCiAgICAgICAgICAgIHJ2LmFwcGVuZChidWZmZXJlZERhdGFbYnVmZmVyT2Zmc2V0OmJ1ZmZlck9mZnNldCArIGJ5dGVzVG9SZWFkXSkKICAgICAgICAgICAgcmVtYWluaW5nQnl0ZXMgLT0gYnl0ZXNUb1JlYWQKCiAgICAgICAgICAgIGJ1ZmZlck9mZnNldCA9IDAKCiAgICAgICAgaWYgcmVtYWluaW5nQnl0ZXM6CiAgICAgICAgICAgIHJ2LmFwcGVuZChzZWxmLl9yZWFkU3RyZWFtKHJlbWFpbmluZ0J5dGVzKSkKCiAgICAgICAgcmV0dXJuIGIiIi5qb2luKHJ2KQoKCmRlZiBIVE1MSW5wdXRTdHJlYW0oc291cmNlLCAqKmt3YXJncyk6CiAgICAjIFdvcmsgYXJvdW5kIFB5dGhvbiBidWcgIzIwMDA3OiByZWFkKDApIGNsb3NlcyB0aGUgY29ubmVjdGlvbi4KICAgICMgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTIwMDA3CiAgICBpZiAoaXNpbnN0YW5jZShzb3VyY2UsIGh0dHBfY2xpZW50LkhUVFBSZXNwb25zZSkgb3IKICAgICAgICAjIEFsc28gY2hlY2sgZm9yIGFkZGluZm91cmwgd3JhcHBpbmcgSFRUUFJlc3BvbnNlCiAgICAgICAgKGlzaW5zdGFuY2Uoc291cmNlLCB1cmxsaWIucmVzcG9uc2UuYWRkYmFzZSkgYW5kCiAgICAgICAgIGlzaW5zdGFuY2Uoc291cmNlLmZwLCBodHRwX2NsaWVudC5IVFRQUmVzcG9uc2UpKSk6CiAgICAgICAgaXNVbmljb2RlID0gRmFsc2UKICAgIGVsaWYgaGFzYXR0cihzb3VyY2UsICJyZWFkIik6CiAgICAgICAgaXNVbmljb2RlID0gaXNpbnN0YW5jZShzb3VyY2UucmVhZCgwKSwgdGV4dF90eXBlKQogICAgZWxzZToKICAgICAgICBpc1VuaWNvZGUgPSBpc2luc3RhbmNlKHNvdXJjZSwgdGV4dF90eXBlKQoKICAgIGlmIGlzVW5pY29kZToKICAgICAgICBlbmNvZGluZ3MgPSBbeCBmb3IgeCBpbiBrd2FyZ3MgaWYgeC5lbmRzd2l0aCgiX2VuY29kaW5nIildCiAgICAgICAgaWYgZW5jb2RpbmdzOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIkNhbm5vdCBzZXQgYW4gZW5jb2Rpbmcgd2l0aCBhIHVuaWNvZGUgaW5wdXQsIHNldCAlciIgJSBlbmNvZGluZ3MpCgogICAgICAgIHJldHVybiBIVE1MVW5pY29kZUlucHV0U3RyZWFtKHNvdXJjZSwgKiprd2FyZ3MpCiAgICBlbHNlOgogICAgICAgIHJldHVybiBIVE1MQmluYXJ5SW5wdXRTdHJlYW0oc291cmNlLCAqKmt3YXJncykKCgpjbGFzcyBIVE1MVW5pY29kZUlucHV0U3RyZWFtKG9iamVjdCk6CiAgICAiIiJQcm92aWRlcyBhIHVuaWNvZGUgc3RyZWFtIG9mIGNoYXJhY3RlcnMgdG8gdGhlIEhUTUxUb2tlbml6ZXIuCgogICAgVGhpcyBjbGFzcyB0YWtlcyBjYXJlIG9mIGNoYXJhY3RlciBlbmNvZGluZyBhbmQgcmVtb3Zpbmcgb3IgcmVwbGFjaW5nCiAgICBpbmNvcnJlY3QgYnl0ZS1zZXF1ZW5jZXMgYW5kIGFsc28gcHJvdmlkZXMgY29sdW1uIGFuZCBsaW5lIHRyYWNraW5nLgoKICAgICIiIgoKICAgIF9kZWZhdWx0Q2h1bmtTaXplID0gMTAyNDAKCiAgICBkZWYgX19pbml0X18oc2VsZiwgc291cmNlKToKICAgICAgICAiIiJJbml0aWFsaXNlcyB0aGUgSFRNTElucHV0U3RyZWFtLgoKICAgICAgICBIVE1MSW5wdXRTdHJlYW0oc291cmNlLCBbZW5jb2RpbmddKSAtPiBOb3JtYWxpemVkIHN0cmVhbSBmcm9tIHNvdXJjZQogICAgICAgIGZvciB1c2UgYnkgaHRtbDVsaWIuCgogICAgICAgIHNvdXJjZSBjYW4gYmUgZWl0aGVyIGEgZmlsZS1vYmplY3QsIGxvY2FsIGZpbGVuYW1lIG9yIGEgc3RyaW5nLgoKICAgICAgICBUaGUgb3B0aW9uYWwgZW5jb2RpbmcgcGFyYW1ldGVyIG11c3QgYmUgYSBzdHJpbmcgdGhhdCBpbmRpY2F0ZXMKICAgICAgICB0aGUgZW5jb2RpbmcuICBJZiBzcGVjaWZpZWQsIHRoYXQgZW5jb2Rpbmcgd2lsbCBiZSB1c2VkLAogICAgICAgIHJlZ2FyZGxlc3Mgb2YgYW55IEJPTSBvciBsYXRlciBkZWNsYXJhdGlvbiAoc3VjaCBhcyBpbiBhIG1ldGEKICAgICAgICBlbGVtZW50KQoKICAgICAgICAiIiIKCiAgICAgICAgaWYgbm90IF91dGlscy5zdXBwb3J0c19sb25lX3N1cnJvZ2F0ZXM6CiAgICAgICAgICAgICMgU3VjaCBwbGF0Zm9ybXMgd2lsbCBoYXZlIGFscmVhZHkgY2hlY2tlZCBmb3Igc3VjaAogICAgICAgICAgICAjIHN1cnJvZ2F0ZSBlcnJvcnMsIHNvIG5vIG5lZWQgdG8gZG8gdGhpcyBjaGVja2luZy4KICAgICAgICAgICAgc2VsZi5yZXBvcnRDaGFyYWN0ZXJFcnJvcnMgPSBOb25lCiAgICAgICAgZWxpZiBsZW4oIlxVMDAxMEZGRkYiKSA9PSAxOgogICAgICAgICAgICBzZWxmLnJlcG9ydENoYXJhY3RlckVycm9ycyA9IHNlbGYuY2hhcmFjdGVyRXJyb3JzVUNTNAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYucmVwb3J0Q2hhcmFjdGVyRXJyb3JzID0gc2VsZi5jaGFyYWN0ZXJFcnJvcnNVQ1MyCgogICAgICAgICMgTGlzdCBvZiB3aGVyZSBuZXcgbGluZXMgb2NjdXIKICAgICAgICBzZWxmLm5ld0xpbmVzID0gWzBdCgogICAgICAgIHNlbGYuY2hhckVuY29kaW5nID0gKGxvb2t1cEVuY29kaW5nKCJ1dGYtOCIpLCAiY2VydGFpbiIpCiAgICAgICAgc2VsZi5kYXRhU3RyZWFtID0gc2VsZi5vcGVuU3RyZWFtKHNvdXJjZSkKCiAgICAgICAgc2VsZi5yZXNldCgpCgogICAgZGVmIHJlc2V0KHNlbGYpOgogICAgICAgIHNlbGYuY2h1bmsgPSAiIgogICAgICAgIHNlbGYuY2h1bmtTaXplID0gMAogICAgICAgIHNlbGYuY2h1bmtPZmZzZXQgPSAwCiAgICAgICAgc2VsZi5lcnJvcnMgPSBbXQoKICAgICAgICAjIG51bWJlciBvZiAoY29tcGxldGUpIGxpbmVzIGluIHByZXZpb3VzIGNodW5rcwogICAgICAgIHNlbGYucHJldk51bUxpbmVzID0gMAogICAgICAgICMgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIGxhc3QgbGluZSBvZiB0aGUgcHJldmlvdXMgY2h1bmsKICAgICAgICBzZWxmLnByZXZOdW1Db2xzID0gMAoKICAgICAgICAjIERlYWwgd2l0aCBDUiBMRiBhbmQgc3Vycm9nYXRlcyBzcGxpdCBvdmVyIGNodW5rIGJvdW5kYXJpZXMKICAgICAgICBzZWxmLl9idWZmZXJlZENoYXJhY3RlciA9IE5vbmUKCiAgICBkZWYgb3BlblN0cmVhbShzZWxmLCBzb3VyY2UpOgogICAgICAgICIiIlByb2R1Y2VzIGEgZmlsZSBvYmplY3QgZnJvbSBzb3VyY2UuCgogICAgICAgIHNvdXJjZSBjYW4gYmUgZWl0aGVyIGEgZmlsZSBvYmplY3QsIGxvY2FsIGZpbGVuYW1lIG9yIGEgc3RyaW5nLgoKICAgICAgICAiIiIKICAgICAgICAjIEFscmVhZHkgYSBmaWxlIG9iamVjdAogICAgICAgIGlmIGhhc2F0dHIoc291cmNlLCAncmVhZCcpOgogICAgICAgICAgICBzdHJlYW0gPSBzb3VyY2UKICAgICAgICBlbHNlOgogICAgICAgICAgICBzdHJlYW0gPSBTdHJpbmdJTyhzb3VyY2UpCgogICAgICAgIHJldHVybiBzdHJlYW0KCiAgICBkZWYgX3Bvc2l0aW9uKHNlbGYsIG9mZnNldCk6CiAgICAgICAgY2h1bmsgPSBzZWxmLmNodW5rCiAgICAgICAgbkxpbmVzID0gY2h1bmsuY291bnQoJ1xuJywgMCwgb2Zmc2V0KQogICAgICAgIHBvc2l0aW9uTGluZSA9IHNlbGYucHJldk51bUxpbmVzICsgbkxpbmVzCiAgICAgICAgbGFzdExpbmVQb3MgPSBjaHVuay5yZmluZCgnXG4nLCAwLCBvZmZzZXQpCiAgICAgICAgaWYgbGFzdExpbmVQb3MgPT0gLTE6CiAgICAgICAgICAgIHBvc2l0aW9uQ29sdW1uID0gc2VsZi5wcmV2TnVtQ29scyArIG9mZnNldAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHBvc2l0aW9uQ29sdW1uID0gb2Zmc2V0IC0gKGxhc3RMaW5lUG9zICsgMSkKICAgICAgICByZXR1cm4gKHBvc2l0aW9uTGluZSwgcG9zaXRpb25Db2x1bW4pCgogICAgZGVmIHBvc2l0aW9uKHNlbGYpOgogICAgICAgICIiIlJldHVybnMgKGxpbmUsIGNvbCkgb2YgdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIHN0cmVhbS4iIiIKICAgICAgICBsaW5lLCBjb2wgPSBzZWxmLl9wb3NpdGlvbihzZWxmLmNodW5rT2Zmc2V0KQogICAgICAgIHJldHVybiAobGluZSArIDEsIGNvbCkKCiAgICBkZWYgY2hhcihzZWxmKToKICAgICAgICAiIiIgUmVhZCBvbmUgY2hhcmFjdGVyIGZyb20gdGhlIHN0cmVhbSBvciBxdWV1ZSBpZiBhdmFpbGFibGUuIFJldHVybgogICAgICAgICAgICBFT0Ygd2hlbiBFT0YgaXMgcmVhY2hlZC4KICAgICAgICAiIiIKICAgICAgICAjIFJlYWQgYSBuZXcgY2h1bmsgZnJvbSB0aGUgaW5wdXQgc3RyZWFtIGlmIG5lY2Vzc2FyeQogICAgICAgIGlmIHNlbGYuY2h1bmtPZmZzZXQgPj0gc2VsZi5jaHVua1NpemU6CiAgICAgICAgICAgIGlmIG5vdCBzZWxmLnJlYWRDaHVuaygpOgogICAgICAgICAgICAgICAgcmV0dXJuIEVPRgoKICAgICAgICBjaHVua09mZnNldCA9IHNlbGYuY2h1bmtPZmZzZXQKICAgICAgICBjaGFyID0gc2VsZi5jaHVua1tjaHVua09mZnNldF0KICAgICAgICBzZWxmLmNodW5rT2Zmc2V0ID0gY2h1bmtPZmZzZXQgKyAxCgogICAgICAgIHJldHVybiBjaGFyCgogICAgZGVmIHJlYWRDaHVuayhzZWxmLCBjaHVua1NpemU9Tm9uZSk6CiAgICAgICAgaWYgY2h1bmtTaXplIGlzIE5vbmU6CiAgICAgICAgICAgIGNodW5rU2l6ZSA9IHNlbGYuX2RlZmF1bHRDaHVua1NpemUKCiAgICAgICAgc2VsZi5wcmV2TnVtTGluZXMsIHNlbGYucHJldk51bUNvbHMgPSBzZWxmLl9wb3NpdGlvbihzZWxmLmNodW5rU2l6ZSkKCiAgICAgICAgc2VsZi5jaHVuayA9ICIiCiAgICAgICAgc2VsZi5jaHVua1NpemUgPSAwCiAgICAgICAgc2VsZi5jaHVua09mZnNldCA9IDAKCiAgICAgICAgZGF0YSA9IHNlbGYuZGF0YVN0cmVhbS5yZWFkKGNodW5rU2l6ZSkKCiAgICAgICAgIyBEZWFsIHdpdGggQ1IgTEYgYW5kIHN1cnJvZ2F0ZXMgYnJva2VuIGFjcm9zcyBjaHVua3MKICAgICAgICBpZiBzZWxmLl9idWZmZXJlZENoYXJhY3RlcjoKICAgICAgICAgICAgZGF0YSA9IHNlbGYuX2J1ZmZlcmVkQ2hhcmFjdGVyICsgZGF0YQogICAgICAgICAgICBzZWxmLl9idWZmZXJlZENoYXJhY3RlciA9IE5vbmUKICAgICAgICBlbGlmIG5vdCBkYXRhOgogICAgICAgICAgICAjIFdlIGhhdmUgbm8gbW9yZSBkYXRhLCBieWUtYnllIHN0cmVhbQogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgaWYgbGVuKGRhdGEpID4gMToKICAgICAgICAgICAgbGFzdHYgPSBvcmQoZGF0YVstMV0pCiAgICAgICAgICAgIGlmIGxhc3R2ID09IDB4MEQgb3IgMHhEODAwIDw9IGxhc3R2IDw9IDB4REJGRjoKICAgICAgICAgICAgICAgIHNlbGYuX2J1ZmZlcmVkQ2hhcmFjdGVyID0gZGF0YVstMV0KICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhWzotMV0KCiAgICAgICAgaWYgc2VsZi5yZXBvcnRDaGFyYWN0ZXJFcnJvcnM6CiAgICAgICAgICAgIHNlbGYucmVwb3J0Q2hhcmFjdGVyRXJyb3JzKGRhdGEpCgogICAgICAgICMgUmVwbGFjZSBpbnZhbGlkIGNoYXJhY3RlcnMKICAgICAgICBkYXRhID0gZGF0YS5yZXBsYWNlKCJcclxuIiwgIlxuIikKICAgICAgICBkYXRhID0gZGF0YS5yZXBsYWNlKCJcciIsICJcbiIpCgogICAgICAgIHNlbGYuY2h1bmsgPSBkYXRhCiAgICAgICAgc2VsZi5jaHVua1NpemUgPSBsZW4oZGF0YSkKCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgY2hhcmFjdGVyRXJyb3JzVUNTNChzZWxmLCBkYXRhKToKICAgICAgICBmb3IgXyBpbiByYW5nZShsZW4oaW52YWxpZF91bmljb2RlX3JlLmZpbmRhbGwoZGF0YSkpKToKICAgICAgICAgICAgc2VsZi5lcnJvcnMuYXBwZW5kKCJpbnZhbGlkLWNvZGVwb2ludCIpCgogICAgZGVmIGNoYXJhY3RlckVycm9yc1VDUzIoc2VsZiwgZGF0YSk6CiAgICAgICAgIyBTb21lb25lIHBpY2tlZCB0aGUgd3JvbmcgY29tcGlsZSBvcHRpb24KICAgICAgICAjIFlvdSBsb3NlCiAgICAgICAgc2tpcCA9IEZhbHNlCiAgICAgICAgZm9yIG1hdGNoIGluIGludmFsaWRfdW5pY29kZV9yZS5maW5kaXRlcihkYXRhKToKICAgICAgICAgICAgaWYgc2tpcDoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGNvZGVwb2ludCA9IG9yZChtYXRjaC5ncm91cCgpKQogICAgICAgICAgICBwb3MgPSBtYXRjaC5zdGFydCgpCiAgICAgICAgICAgICMgUHJldHR5IHN1cmUgdGhlcmUgc2hvdWxkIGJlIGVuZGlhbm5lc3MgaXNzdWVzIGhlcmUKICAgICAgICAgICAgaWYgX3V0aWxzLmlzU3Vycm9nYXRlUGFpcihkYXRhW3Bvczpwb3MgKyAyXSk6CiAgICAgICAgICAgICAgICAjIFdlIGhhdmUgYSBzdXJyb2dhdGUgcGFpciEKICAgICAgICAgICAgICAgIGNoYXJfdmFsID0gX3V0aWxzLnN1cnJvZ2F0ZVBhaXJUb0NvZGVwb2ludChkYXRhW3Bvczpwb3MgKyAyXSkKICAgICAgICAgICAgICAgIGlmIGNoYXJfdmFsIGluIG5vbl9ibXBfaW52YWxpZF9jb2RlcG9pbnRzOgogICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3JzLmFwcGVuZCgiaW52YWxpZC1jb2RlcG9pbnQiKQogICAgICAgICAgICAgICAgc2tpcCA9IFRydWUKICAgICAgICAgICAgZWxpZiAoY29kZXBvaW50ID49IDB4RDgwMCBhbmQgY29kZXBvaW50IDw9IDB4REZGRiBhbmQKICAgICAgICAgICAgICAgICAgcG9zID09IGxlbihkYXRhKSAtIDEpOgogICAgICAgICAgICAgICAgc2VsZi5lcnJvcnMuYXBwZW5kKCJpbnZhbGlkLWNvZGVwb2ludCIpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBza2lwID0gRmFsc2UKICAgICAgICAgICAgICAgIHNlbGYuZXJyb3JzLmFwcGVuZCgiaW52YWxpZC1jb2RlcG9pbnQiKQoKICAgIGRlZiBjaGFyc1VudGlsKHNlbGYsIGNoYXJhY3RlcnMsIG9wcG9zaXRlPUZhbHNlKToKICAgICAgICAiIiIgUmV0dXJucyBhIHN0cmluZyBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIHN0cmVhbSB1cCB0byBidXQgbm90CiAgICAgICAgaW5jbHVkaW5nIGFueSBjaGFyYWN0ZXIgaW4gJ2NoYXJhY3RlcnMnIG9yIEVPRi4gJ2NoYXJhY3RlcnMnIG11c3QgYmUKICAgICAgICBhIGNvbnRhaW5lciB0aGF0IHN1cHBvcnRzIHRoZSAnaW4nIG1ldGhvZCBhbmQgaXRlcmF0aW9uIG92ZXIgaXRzCiAgICAgICAgY2hhcmFjdGVycy4KICAgICAgICAiIiIKCiAgICAgICAgIyBVc2UgYSBjYWNoZSBvZiByZWdleHBzIHRvIGZpbmQgdGhlIHJlcXVpcmVkIGNoYXJhY3RlcnMKICAgICAgICB0cnk6CiAgICAgICAgICAgIGNoYXJzID0gY2hhcnNVbnRpbFJlZ0V4WyhjaGFyYWN0ZXJzLCBvcHBvc2l0ZSldCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICBpZiBfX2RlYnVnX186CiAgICAgICAgICAgICAgICBmb3IgYyBpbiBjaGFyYWN0ZXJzOgogICAgICAgICAgICAgICAgICAgIGFzc2VydChvcmQoYykgPCAxMjgpCiAgICAgICAgICAgIHJlZ2V4ID0gIiIuam9pbihbIlxceCUwMngiICUgb3JkKGMpIGZvciBjIGluIGNoYXJhY3RlcnNdKQogICAgICAgICAgICBpZiBub3Qgb3Bwb3NpdGU6CiAgICAgICAgICAgICAgICByZWdleCA9ICJeJXMiICUgcmVnZXgKICAgICAgICAgICAgY2hhcnMgPSBjaGFyc1VudGlsUmVnRXhbKGNoYXJhY3RlcnMsIG9wcG9zaXRlKV0gPSByZS5jb21waWxlKCJbJXNdKyIgJSByZWdleCkKCiAgICAgICAgcnYgPSBbXQoKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAjIEZpbmQgdGhlIGxvbmdlc3QgbWF0Y2hpbmcgcHJlZml4CiAgICAgICAgICAgIG0gPSBjaGFycy5tYXRjaChzZWxmLmNodW5rLCBzZWxmLmNodW5rT2Zmc2V0KQogICAgICAgICAgICBpZiBtIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAjIElmIG5vdGhpbmcgbWF0Y2hlZCwgYW5kIGl0IHdhc24ndCBiZWNhdXNlIHdlIHJhbiBvdXQgb2YgY2h1bmssCiAgICAgICAgICAgICAgICAjIHRoZW4gc3RvcAogICAgICAgICAgICAgICAgaWYgc2VsZi5jaHVua09mZnNldCAhPSBzZWxmLmNodW5rU2l6ZToKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZW5kID0gbS5lbmQoKQogICAgICAgICAgICAgICAgIyBJZiBub3QgdGhlIHdob2xlIGNodW5rIG1hdGNoZWQsIHJldHVybiBldmVyeXRoaW5nCiAgICAgICAgICAgICAgICAjIHVwIHRvIHRoZSBwYXJ0IHRoYXQgZGlkbid0IG1hdGNoCiAgICAgICAgICAgICAgICBpZiBlbmQgIT0gc2VsZi5jaHVua1NpemU6CiAgICAgICAgICAgICAgICAgICAgcnYuYXBwZW5kKHNlbGYuY2h1bmtbc2VsZi5jaHVua09mZnNldDplbmRdKQogICAgICAgICAgICAgICAgICAgIHNlbGYuY2h1bmtPZmZzZXQgPSBlbmQKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAjIElmIHRoZSB3aG9sZSByZW1haW5kZXIgb2YgdGhlIGNodW5rIG1hdGNoZWQsCiAgICAgICAgICAgICMgdXNlIGl0IGFsbCBhbmQgcmVhZCB0aGUgbmV4dCBjaHVuawogICAgICAgICAgICBydi5hcHBlbmQoc2VsZi5jaHVua1tzZWxmLmNodW5rT2Zmc2V0Ol0pCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLnJlYWRDaHVuaygpOgogICAgICAgICAgICAgICAgIyBSZWFjaGVkIEVPRgogICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgciA9ICIiLmpvaW4ocnYpCiAgICAgICAgcmV0dXJuIHIKCiAgICBkZWYgdW5nZXQoc2VsZiwgY2hhcik6CiAgICAgICAgIyBPbmx5IG9uZSBjaGFyYWN0ZXIgaXMgYWxsb3dlZCB0byBiZSB1bmdvdHRlbiBhdCBvbmNlIC0gaXQgbXVzdAogICAgICAgICMgYmUgY29uc3VtZWQgYWdhaW4gYmVmb3JlIGFueSBmdXJ0aGVyIGNhbGwgdG8gdW5nZXQKICAgICAgICBpZiBjaGFyIGlzIG5vdCBOb25lOgogICAgICAgICAgICBpZiBzZWxmLmNodW5rT2Zmc2V0ID09IDA6CiAgICAgICAgICAgICAgICAjIHVuZ2V0IGlzIGNhbGxlZCBxdWl0ZSByYXJlbHksIHNvIGl0J3MgYSBnb29kIGlkZWEgdG8gZG8KICAgICAgICAgICAgICAgICMgbW9yZSB3b3JrIGhlcmUgaWYgaXQgc2F2ZXMgYSBiaXQgb2Ygd29yayBpbiB0aGUgZnJlcXVlbnRseQogICAgICAgICAgICAgICAgIyBjYWxsZWQgY2hhciBhbmQgY2hhcnNVbnRpbC4KICAgICAgICAgICAgICAgICMgU28sIGp1c3QgcHJlcGVuZCB0aGUgdW5nb3R0ZW4gY2hhcmFjdGVyIG9udG8gdGhlIGN1cnJlbnQKICAgICAgICAgICAgICAgICMgY2h1bms6CiAgICAgICAgICAgICAgICBzZWxmLmNodW5rID0gY2hhciArIHNlbGYuY2h1bmsKICAgICAgICAgICAgICAgIHNlbGYuY2h1bmtTaXplICs9IDEKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuY2h1bmtPZmZzZXQgLT0gMQogICAgICAgICAgICAgICAgYXNzZXJ0IHNlbGYuY2h1bmtbc2VsZi5jaHVua09mZnNldF0gPT0gY2hhcgoKCmNsYXNzIEhUTUxCaW5hcnlJbnB1dFN0cmVhbShIVE1MVW5pY29kZUlucHV0U3RyZWFtKToKICAgICIiIlByb3ZpZGVzIGEgdW5pY29kZSBzdHJlYW0gb2YgY2hhcmFjdGVycyB0byB0aGUgSFRNTFRva2VuaXplci4KCiAgICBUaGlzIGNsYXNzIHRha2VzIGNhcmUgb2YgY2hhcmFjdGVyIGVuY29kaW5nIGFuZCByZW1vdmluZyBvciByZXBsYWNpbmcKICAgIGluY29ycmVjdCBieXRlLXNlcXVlbmNlcyBhbmQgYWxzbyBwcm92aWRlcyBjb2x1bW4gYW5kIGxpbmUgdHJhY2tpbmcuCgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHNvdXJjZSwgb3ZlcnJpZGVfZW5jb2Rpbmc9Tm9uZSwgdHJhbnNwb3J0X2VuY29kaW5nPU5vbmUsCiAgICAgICAgICAgICAgICAgc2FtZV9vcmlnaW5fcGFyZW50X2VuY29kaW5nPU5vbmUsIGxpa2VseV9lbmNvZGluZz1Ob25lLAogICAgICAgICAgICAgICAgIGRlZmF1bHRfZW5jb2Rpbmc9IndpbmRvd3MtMTI1MiIsIHVzZUNoYXJkZXQ9VHJ1ZSk6CiAgICAgICAgIiIiSW5pdGlhbGlzZXMgdGhlIEhUTUxJbnB1dFN0cmVhbS4KCiAgICAgICAgSFRNTElucHV0U3RyZWFtKHNvdXJjZSwgW2VuY29kaW5nXSkgLT4gTm9ybWFsaXplZCBzdHJlYW0gZnJvbSBzb3VyY2UKICAgICAgICBmb3IgdXNlIGJ5IGh0bWw1bGliLgoKICAgICAgICBzb3VyY2UgY2FuIGJlIGVpdGhlciBhIGZpbGUtb2JqZWN0LCBsb2NhbCBmaWxlbmFtZSBvciBhIHN0cmluZy4KCiAgICAgICAgVGhlIG9wdGlvbmFsIGVuY29kaW5nIHBhcmFtZXRlciBtdXN0IGJlIGEgc3RyaW5nIHRoYXQgaW5kaWNhdGVzCiAgICAgICAgdGhlIGVuY29kaW5nLiAgSWYgc3BlY2lmaWVkLCB0aGF0IGVuY29kaW5nIHdpbGwgYmUgdXNlZCwKICAgICAgICByZWdhcmRsZXNzIG9mIGFueSBCT00gb3IgbGF0ZXIgZGVjbGFyYXRpb24gKHN1Y2ggYXMgaW4gYSBtZXRhCiAgICAgICAgZWxlbWVudCkKCiAgICAgICAgIiIiCiAgICAgICAgIyBSYXcgU3RyZWFtIC0gZm9yIHVuaWNvZGUgb2JqZWN0cyB0aGlzIHdpbGwgZW5jb2RlIHRvIHV0Zi04IGFuZCBzZXQKICAgICAgICAjICAgICAgICAgICAgICBzZWxmLmNoYXJFbmNvZGluZyBhcyBhcHByb3ByaWF0ZQogICAgICAgIHNlbGYucmF3U3RyZWFtID0gc2VsZi5vcGVuU3RyZWFtKHNvdXJjZSkKCiAgICAgICAgSFRNTFVuaWNvZGVJbnB1dFN0cmVhbS5fX2luaXRfXyhzZWxmLCBzZWxmLnJhd1N0cmVhbSkKCiAgICAgICAgIyBFbmNvZGluZyBJbmZvcm1hdGlvbgogICAgICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIHVzZSB3aGVuIGxvb2tpbmcgZm9yIGEgbWV0YSBlbGVtZW50IHdpdGgKICAgICAgICAjIGVuY29kaW5nIGluZm9ybWF0aW9uCiAgICAgICAgc2VsZi5udW1CeXRlc01ldGEgPSAxMDI0CiAgICAgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gdXNlIHdoZW4gdXNpbmcgZGV0ZWN0aW5nIGVuY29kaW5nIHVzaW5nIGNoYXJkZXQKICAgICAgICBzZWxmLm51bUJ5dGVzQ2hhcmRldCA9IDEwMAogICAgICAgICMgVGhpbmdzIGZyb20gYXJncwogICAgICAgIHNlbGYub3ZlcnJpZGVfZW5jb2RpbmcgPSBvdmVycmlkZV9lbmNvZGluZwogICAgICAgIHNlbGYudHJhbnNwb3J0X2VuY29kaW5nID0gdHJhbnNwb3J0X2VuY29kaW5nCiAgICAgICAgc2VsZi5zYW1lX29yaWdpbl9wYXJlbnRfZW5jb2RpbmcgPSBzYW1lX29yaWdpbl9wYXJlbnRfZW5jb2RpbmcKICAgICAgICBzZWxmLmxpa2VseV9lbmNvZGluZyA9IGxpa2VseV9lbmNvZGluZwogICAgICAgIHNlbGYuZGVmYXVsdF9lbmNvZGluZyA9IGRlZmF1bHRfZW5jb2RpbmcKCiAgICAgICAgIyBEZXRlcm1pbmUgZW5jb2RpbmcKICAgICAgICBzZWxmLmNoYXJFbmNvZGluZyA9IHNlbGYuZGV0ZXJtaW5lRW5jb2RpbmcodXNlQ2hhcmRldCkKICAgICAgICBhc3NlcnQgc2VsZi5jaGFyRW5jb2RpbmdbMF0gaXMgbm90IE5vbmUKCiAgICAgICAgIyBDYWxsIHN1cGVyY2xhc3MKICAgICAgICBzZWxmLnJlc2V0KCkKCiAgICBkZWYgcmVzZXQoc2VsZik6CiAgICAgICAgc2VsZi5kYXRhU3RyZWFtID0gc2VsZi5jaGFyRW5jb2RpbmdbMF0uY29kZWNfaW5mby5zdHJlYW1yZWFkZXIoc2VsZi5yYXdTdHJlYW0sICdyZXBsYWNlJykKICAgICAgICBIVE1MVW5pY29kZUlucHV0U3RyZWFtLnJlc2V0KHNlbGYpCgogICAgZGVmIG9wZW5TdHJlYW0oc2VsZiwgc291cmNlKToKICAgICAgICAiIiJQcm9kdWNlcyBhIGZpbGUgb2JqZWN0IGZyb20gc291cmNlLgoKICAgICAgICBzb3VyY2UgY2FuIGJlIGVpdGhlciBhIGZpbGUgb2JqZWN0LCBsb2NhbCBmaWxlbmFtZSBvciBhIHN0cmluZy4KCiAgICAgICAgIiIiCiAgICAgICAgIyBBbHJlYWR5IGEgZmlsZSBvYmplY3QKICAgICAgICBpZiBoYXNhdHRyKHNvdXJjZSwgJ3JlYWQnKToKICAgICAgICAgICAgc3RyZWFtID0gc291cmNlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc3RyZWFtID0gQnl0ZXNJTyhzb3VyY2UpCgogICAgICAgIHRyeToKICAgICAgICAgICAgc3RyZWFtLnNlZWsoc3RyZWFtLnRlbGwoKSkKICAgICAgICBleGNlcHQ6ICAjIHB5bGludDpkaXNhYmxlPWJhcmUtZXhjZXB0CiAgICAgICAgICAgIHN0cmVhbSA9IEJ1ZmZlcmVkU3RyZWFtKHN0cmVhbSkKCiAgICAgICAgcmV0dXJuIHN0cmVhbQoKICAgIGRlZiBkZXRlcm1pbmVFbmNvZGluZyhzZWxmLCBjaGFyZGV0PVRydWUpOgogICAgICAgICMgQk9NcyB0YWtlIHByZWNlZGVuY2Ugb3ZlciBldmVyeXRoaW5nCiAgICAgICAgIyBUaGlzIHdpbGwgYWxzbyByZWFkIHBhc3QgdGhlIEJPTSBpZiBwcmVzZW50CiAgICAgICAgY2hhckVuY29kaW5nID0gc2VsZi5kZXRlY3RCT00oKSwgImNlcnRhaW4iCiAgICAgICAgaWYgY2hhckVuY29kaW5nWzBdIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gY2hhckVuY29kaW5nCgogICAgICAgICMgSWYgd2UndmUgYmVlbiBvdmVycmlkZW4sIHdlJ3ZlIGJlZW4gb3ZlcnJpZGVuCiAgICAgICAgY2hhckVuY29kaW5nID0gbG9va3VwRW5jb2Rpbmcoc2VsZi5vdmVycmlkZV9lbmNvZGluZyksICJjZXJ0YWluIgogICAgICAgIGlmIGNoYXJFbmNvZGluZ1swXSBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIGNoYXJFbmNvZGluZwoKICAgICAgICAjIE5vdyBjaGVjayB0aGUgdHJhbnNwb3J0IGxheWVyCiAgICAgICAgY2hhckVuY29kaW5nID0gbG9va3VwRW5jb2Rpbmcoc2VsZi50cmFuc3BvcnRfZW5jb2RpbmcpLCAiY2VydGFpbiIKICAgICAgICBpZiBjaGFyRW5jb2RpbmdbMF0gaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBjaGFyRW5jb2RpbmcKCiAgICAgICAgIyBMb29rIGZvciBtZXRhIGVsZW1lbnRzIHdpdGggZW5jb2RpbmcgaW5mb3JtYXRpb24KICAgICAgICBjaGFyRW5jb2RpbmcgPSBzZWxmLmRldGVjdEVuY29kaW5nTWV0YSgpLCAidGVudGF0aXZlIgogICAgICAgIGlmIGNoYXJFbmNvZGluZ1swXSBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIGNoYXJFbmNvZGluZwoKICAgICAgICAjIFBhcmVudCBkb2N1bWVudCBlbmNvZGluZwogICAgICAgIGNoYXJFbmNvZGluZyA9IGxvb2t1cEVuY29kaW5nKHNlbGYuc2FtZV9vcmlnaW5fcGFyZW50X2VuY29kaW5nKSwgInRlbnRhdGl2ZSIKICAgICAgICBpZiBjaGFyRW5jb2RpbmdbMF0gaXMgbm90IE5vbmUgYW5kIG5vdCBjaGFyRW5jb2RpbmdbMF0ubmFtZS5zdGFydHN3aXRoKCJ1dGYtMTYiKToKICAgICAgICAgICAgcmV0dXJuIGNoYXJFbmNvZGluZwoKICAgICAgICAjICJsaWtlbHkiIGVuY29kaW5nCiAgICAgICAgY2hhckVuY29kaW5nID0gbG9va3VwRW5jb2Rpbmcoc2VsZi5saWtlbHlfZW5jb2RpbmcpLCAidGVudGF0aXZlIgogICAgICAgIGlmIGNoYXJFbmNvZGluZ1swXSBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIGNoYXJFbmNvZGluZwoKICAgICAgICAjIEd1ZXNzIHdpdGggY2hhcmRldCwgaWYgYXZhaWxhYmxlCiAgICAgICAgaWYgY2hhcmRldDoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZnJvbSBjaGFyZGV0LnVuaXZlcnNhbGRldGVjdG9yIGltcG9ydCBVbml2ZXJzYWxEZXRlY3RvcgogICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBidWZmZXJzID0gW10KICAgICAgICAgICAgICAgIGRldGVjdG9yID0gVW5pdmVyc2FsRGV0ZWN0b3IoKQogICAgICAgICAgICAgICAgd2hpbGUgbm90IGRldGVjdG9yLmRvbmU6CiAgICAgICAgICAgICAgICAgICAgYnVmZmVyID0gc2VsZi5yYXdTdHJlYW0ucmVhZChzZWxmLm51bUJ5dGVzQ2hhcmRldCkKICAgICAgICAgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShidWZmZXIsIGJ5dGVzKQogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBidWZmZXI6CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICAgICAgYnVmZmVycy5hcHBlbmQoYnVmZmVyKQogICAgICAgICAgICAgICAgICAgIGRldGVjdG9yLmZlZWQoYnVmZmVyKQogICAgICAgICAgICAgICAgZGV0ZWN0b3IuY2xvc2UoKQogICAgICAgICAgICAgICAgZW5jb2RpbmcgPSBsb29rdXBFbmNvZGluZyhkZXRlY3Rvci5yZXN1bHRbJ2VuY29kaW5nJ10pCiAgICAgICAgICAgICAgICBzZWxmLnJhd1N0cmVhbS5zZWVrKDApCiAgICAgICAgICAgICAgICBpZiBlbmNvZGluZyBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW5jb2RpbmcsICJ0ZW50YXRpdmUiCgogICAgICAgICMgVHJ5IHRoZSBkZWZhdWx0IGVuY29kaW5nCiAgICAgICAgY2hhckVuY29kaW5nID0gbG9va3VwRW5jb2Rpbmcoc2VsZi5kZWZhdWx0X2VuY29kaW5nKSwgInRlbnRhdGl2ZSIKICAgICAgICBpZiBjaGFyRW5jb2RpbmdbMF0gaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBjaGFyRW5jb2RpbmcKCiAgICAgICAgIyBGYWxsYmFjayB0byBodG1sNWxpYidzIGRlZmF1bHQgaWYgZXZlbiB0aGF0IGhhc24ndCB3b3JrZWQKICAgICAgICByZXR1cm4gbG9va3VwRW5jb2RpbmcoIndpbmRvd3MtMTI1MiIpLCAidGVudGF0aXZlIgoKICAgIGRlZiBjaGFuZ2VFbmNvZGluZyhzZWxmLCBuZXdFbmNvZGluZyk6CiAgICAgICAgYXNzZXJ0IHNlbGYuY2hhckVuY29kaW5nWzFdICE9ICJjZXJ0YWluIgogICAgICAgIG5ld0VuY29kaW5nID0gbG9va3VwRW5jb2RpbmcobmV3RW5jb2RpbmcpCiAgICAgICAgaWYgbmV3RW5jb2RpbmcgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgaWYgbmV3RW5jb2RpbmcubmFtZSBpbiAoInV0Zi0xNmJlIiwgInV0Zi0xNmxlIik6CiAgICAgICAgICAgIG5ld0VuY29kaW5nID0gbG9va3VwRW5jb2RpbmcoInV0Zi04IikKICAgICAgICAgICAgYXNzZXJ0IG5ld0VuY29kaW5nIGlzIG5vdCBOb25lCiAgICAgICAgZWxpZiBuZXdFbmNvZGluZyA9PSBzZWxmLmNoYXJFbmNvZGluZ1swXToKICAgICAgICAgICAgc2VsZi5jaGFyRW5jb2RpbmcgPSAoc2VsZi5jaGFyRW5jb2RpbmdbMF0sICJjZXJ0YWluIikKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnJhd1N0cmVhbS5zZWVrKDApCiAgICAgICAgICAgIHNlbGYuY2hhckVuY29kaW5nID0gKG5ld0VuY29kaW5nLCAiY2VydGFpbiIpCiAgICAgICAgICAgIHNlbGYucmVzZXQoKQogICAgICAgICAgICByYWlzZSBSZXBhcnNlRXhjZXB0aW9uKCJFbmNvZGluZyBjaGFuZ2VkIGZyb20gJXMgdG8gJXMiICUgKHNlbGYuY2hhckVuY29kaW5nWzBdLCBuZXdFbmNvZGluZykpCgogICAgZGVmIGRldGVjdEJPTShzZWxmKToKICAgICAgICAiIiJBdHRlbXB0cyB0byBkZXRlY3QgYXQgQk9NIGF0IHRoZSBzdGFydCBvZiB0aGUgc3RyZWFtLiBJZgogICAgICAgIGFuIGVuY29kaW5nIGNhbiBiZSBkZXRlcm1pbmVkIGZyb20gdGhlIEJPTSByZXR1cm4gdGhlIG5hbWUgb2YgdGhlCiAgICAgICAgZW5jb2Rpbmcgb3RoZXJ3aXNlIHJldHVybiBOb25lIiIiCiAgICAgICAgYm9tRGljdCA9IHsKICAgICAgICAgICAgY29kZWNzLkJPTV9VVEY4OiAndXRmLTgnLAogICAgICAgICAgICBjb2RlY3MuQk9NX1VURjE2X0xFOiAndXRmLTE2bGUnLCBjb2RlY3MuQk9NX1VURjE2X0JFOiAndXRmLTE2YmUnLAogICAgICAgICAgICBjb2RlY3MuQk9NX1VURjMyX0xFOiAndXRmLTMybGUnLCBjb2RlY3MuQk9NX1VURjMyX0JFOiAndXRmLTMyYmUnCiAgICAgICAgfQoKICAgICAgICAjIEdvIHRvIGJlZ2lubmluZyBvZiBmaWxlIGFuZCByZWFkIGluIDQgYnl0ZXMKICAgICAgICBzdHJpbmcgPSBzZWxmLnJhd1N0cmVhbS5yZWFkKDQpCiAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2Uoc3RyaW5nLCBieXRlcykKCiAgICAgICAgIyBUcnkgZGV0ZWN0aW5nIHRoZSBCT00gdXNpbmcgYnl0ZXMgZnJvbSB0aGUgc3RyaW5nCiAgICAgICAgZW5jb2RpbmcgPSBib21EaWN0LmdldChzdHJpbmdbOjNdKSAgICAgICAgICMgVVRGLTgKICAgICAgICBzZWVrID0gMwogICAgICAgIGlmIG5vdCBlbmNvZGluZzoKICAgICAgICAgICAgIyBOZWVkIHRvIGRldGVjdCBVVEYtMzIgYmVmb3JlIFVURi0xNgogICAgICAgICAgICBlbmNvZGluZyA9IGJvbURpY3QuZ2V0KHN0cmluZykgICAgICAgICAjIFVURi0zMgogICAgICAgICAgICBzZWVrID0gNAogICAgICAgICAgICBpZiBub3QgZW5jb2Rpbmc6CiAgICAgICAgICAgICAgICBlbmNvZGluZyA9IGJvbURpY3QuZ2V0KHN0cmluZ1s6Ml0pICAjIFVURi0xNgogICAgICAgICAgICAgICAgc2VlayA9IDIKCiAgICAgICAgIyBTZXQgdGhlIHJlYWQgcG9zaXRpb24gcGFzdCB0aGUgQk9NIGlmIG9uZSB3YXMgZm91bmQsIG90aGVyd2lzZQogICAgICAgICMgc2V0IGl0IHRvIHRoZSBzdGFydCBvZiB0aGUgc3RyZWFtCiAgICAgICAgaWYgZW5jb2Rpbmc6CiAgICAgICAgICAgIHNlbGYucmF3U3RyZWFtLnNlZWsoc2VlaykKICAgICAgICAgICAgcmV0dXJuIGxvb2t1cEVuY29kaW5nKGVuY29kaW5nKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYucmF3U3RyZWFtLnNlZWsoMCkKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBkZWYgZGV0ZWN0RW5jb2RpbmdNZXRhKHNlbGYpOgogICAgICAgICIiIlJlcG9ydCB0aGUgZW5jb2RpbmcgZGVjbGFyZWQgYnkgdGhlIG1ldGEgZWxlbWVudAogICAgICAgICIiIgogICAgICAgIGJ1ZmZlciA9IHNlbGYucmF3U3RyZWFtLnJlYWQoc2VsZi5udW1CeXRlc01ldGEpCiAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoYnVmZmVyLCBieXRlcykKICAgICAgICBwYXJzZXIgPSBFbmNvZGluZ1BhcnNlcihidWZmZXIpCiAgICAgICAgc2VsZi5yYXdTdHJlYW0uc2VlaygwKQogICAgICAgIGVuY29kaW5nID0gcGFyc2VyLmdldEVuY29kaW5nKCkKCiAgICAgICAgaWYgZW5jb2RpbmcgaXMgbm90IE5vbmUgYW5kIGVuY29kaW5nLm5hbWUgaW4gKCJ1dGYtMTZiZSIsICJ1dGYtMTZsZSIpOgogICAgICAgICAgICBlbmNvZGluZyA9IGxvb2t1cEVuY29kaW5nKCJ1dGYtOCIpCgogICAgICAgIHJldHVybiBlbmNvZGluZwoKCmNsYXNzIEVuY29kaW5nQnl0ZXMoYnl0ZXMpOgogICAgIiIiU3RyaW5nLWxpa2Ugb2JqZWN0IHdpdGggYW4gYXNzb2NpYXRlZCBwb3NpdGlvbiBhbmQgdmFyaW91cyBleHRyYSBtZXRob2RzCiAgICBJZiB0aGUgcG9zaXRpb24gaXMgZXZlciBncmVhdGVyIHRoYW4gdGhlIHN0cmluZyBsZW5ndGggdGhlbiBhbiBleGNlcHRpb24gaXMKICAgIHJhaXNlZCIiIgogICAgZGVmIF9fbmV3X18oc2VsZiwgdmFsdWUpOgogICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHZhbHVlLCBieXRlcykKICAgICAgICByZXR1cm4gYnl0ZXMuX19uZXdfXyhzZWxmLCB2YWx1ZS5sb3dlcigpKQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSk6CiAgICAgICAgIyBweWxpbnQ6ZGlzYWJsZT11bnVzZWQtYXJndW1lbnQKICAgICAgICBzZWxmLl9wb3NpdGlvbiA9IC0xCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIF9fbmV4dF9fKHNlbGYpOgogICAgICAgIHAgPSBzZWxmLl9wb3NpdGlvbiA9IHNlbGYuX3Bvc2l0aW9uICsgMQogICAgICAgIGlmIHAgPj0gbGVuKHNlbGYpOgogICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCiAgICAgICAgZWxpZiBwIDwgMDoKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yCiAgICAgICAgcmV0dXJuIHNlbGZbcDpwICsgMV0KCiAgICBkZWYgbmV4dChzZWxmKToKICAgICAgICAjIFB5MiBjb21wYXQKICAgICAgICByZXR1cm4gc2VsZi5fX25leHRfXygpCgogICAgZGVmIHByZXZpb3VzKHNlbGYpOgogICAgICAgIHAgPSBzZWxmLl9wb3NpdGlvbgogICAgICAgIGlmIHAgPj0gbGVuKHNlbGYpOgogICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCiAgICAgICAgZWxpZiBwIDwgMDoKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yCiAgICAgICAgc2VsZi5fcG9zaXRpb24gPSBwID0gcCAtIDEKICAgICAgICByZXR1cm4gc2VsZltwOnAgKyAxXQoKICAgIGRlZiBzZXRQb3NpdGlvbihzZWxmLCBwb3NpdGlvbik6CiAgICAgICAgaWYgc2VsZi5fcG9zaXRpb24gPj0gbGVuKHNlbGYpOgogICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCiAgICAgICAgc2VsZi5fcG9zaXRpb24gPSBwb3NpdGlvbgoKICAgIGRlZiBnZXRQb3NpdGlvbihzZWxmKToKICAgICAgICBpZiBzZWxmLl9wb3NpdGlvbiA+PSBsZW4oc2VsZik6CiAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KICAgICAgICBpZiBzZWxmLl9wb3NpdGlvbiA+PSAwOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fcG9zaXRpb24KICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgIHBvc2l0aW9uID0gcHJvcGVydHkoZ2V0UG9zaXRpb24sIHNldFBvc2l0aW9uKQoKICAgIGRlZiBnZXRDdXJyZW50Qnl0ZShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZltzZWxmLnBvc2l0aW9uOnNlbGYucG9zaXRpb24gKyAxXQoKICAgIGN1cnJlbnRCeXRlID0gcHJvcGVydHkoZ2V0Q3VycmVudEJ5dGUpCgogICAgZGVmIHNraXAoc2VsZiwgY2hhcnM9c3BhY2VDaGFyYWN0ZXJzQnl0ZXMpOgogICAgICAgICIiIlNraXAgcGFzdCBhIGxpc3Qgb2YgY2hhcmFjdGVycyIiIgogICAgICAgIHAgPSBzZWxmLnBvc2l0aW9uICAgICAgICAgICAgICAgIyB1c2UgcHJvcGVydHkgZm9yIHRoZSBlcnJvci1jaGVja2luZwogICAgICAgIHdoaWxlIHAgPCBsZW4oc2VsZik6CiAgICAgICAgICAgIGMgPSBzZWxmW3A6cCArIDFdCiAgICAgICAgICAgIGlmIGMgbm90IGluIGNoYXJzOgogICAgICAgICAgICAgICAgc2VsZi5fcG9zaXRpb24gPSBwCiAgICAgICAgICAgICAgICByZXR1cm4gYwogICAgICAgICAgICBwICs9IDEKICAgICAgICBzZWxmLl9wb3NpdGlvbiA9IHAKICAgICAgICByZXR1cm4gTm9uZQoKICAgIGRlZiBza2lwVW50aWwoc2VsZiwgY2hhcnMpOgogICAgICAgIHAgPSBzZWxmLnBvc2l0aW9uCiAgICAgICAgd2hpbGUgcCA8IGxlbihzZWxmKToKICAgICAgICAgICAgYyA9IHNlbGZbcDpwICsgMV0KICAgICAgICAgICAgaWYgYyBpbiBjaGFyczoKICAgICAgICAgICAgICAgIHNlbGYuX3Bvc2l0aW9uID0gcAogICAgICAgICAgICAgICAgcmV0dXJuIGMKICAgICAgICAgICAgcCArPSAxCiAgICAgICAgc2VsZi5fcG9zaXRpb24gPSBwCiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBkZWYgbWF0Y2hCeXRlcyhzZWxmLCBieXRlcyk6CiAgICAgICAgIiIiTG9vayBmb3IgYSBzZXF1ZW5jZSBvZiBieXRlcyBhdCB0aGUgc3RhcnQgb2YgYSBzdHJpbmcuIElmIHRoZSBieXRlcwogICAgICAgIGFyZSBmb3VuZCByZXR1cm4gVHJ1ZSBhbmQgYWR2YW5jZSB0aGUgcG9zaXRpb24gdG8gdGhlIGJ5dGUgYWZ0ZXIgdGhlCiAgICAgICAgbWF0Y2guIE90aGVyd2lzZSByZXR1cm4gRmFsc2UgYW5kIGxlYXZlIHRoZSBwb3NpdGlvbiBhbG9uZSIiIgogICAgICAgIHAgPSBzZWxmLnBvc2l0aW9uCiAgICAgICAgZGF0YSA9IHNlbGZbcDpwICsgbGVuKGJ5dGVzKV0KICAgICAgICBydiA9IGRhdGEuc3RhcnRzd2l0aChieXRlcykKICAgICAgICBpZiBydjoKICAgICAgICAgICAgc2VsZi5wb3NpdGlvbiArPSBsZW4oYnl0ZXMpCiAgICAgICAgcmV0dXJuIHJ2CgogICAgZGVmIGp1bXBUbyhzZWxmLCBieXRlcyk6CiAgICAgICAgIiIiTG9vayBmb3IgdGhlIG5leHQgc2VxdWVuY2Ugb2YgYnl0ZXMgbWF0Y2hpbmcgYSBnaXZlbiBzZXF1ZW5jZS4gSWYKICAgICAgICBhIG1hdGNoIGlzIGZvdW5kIGFkdmFuY2UgdGhlIHBvc2l0aW9uIHRvIHRoZSBsYXN0IGJ5dGUgb2YgdGhlIG1hdGNoIiIiCiAgICAgICAgbmV3UG9zaXRpb24gPSBzZWxmW3NlbGYucG9zaXRpb246XS5maW5kKGJ5dGVzKQogICAgICAgIGlmIG5ld1Bvc2l0aW9uID4gLTE6CiAgICAgICAgICAgICMgWFhYOiBUaGlzIGlzIHVnbHksIGJ1dCBJIGNhbid0IHNlZSBhIG5pY2VyIHdheSB0byBmaXggdGhpcy4KICAgICAgICAgICAgaWYgc2VsZi5fcG9zaXRpb24gPT0gLTE6CiAgICAgICAgICAgICAgICBzZWxmLl9wb3NpdGlvbiA9IDAKICAgICAgICAgICAgc2VsZi5fcG9zaXRpb24gKz0gKG5ld1Bvc2l0aW9uICsgbGVuKGJ5dGVzKSAtIDEpCiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgoKCmNsYXNzIEVuY29kaW5nUGFyc2VyKG9iamVjdCk6CiAgICAiIiJNaW5pIHBhcnNlciBmb3IgZGV0ZWN0aW5nIGNoYXJhY3RlciBlbmNvZGluZyBmcm9tIG1ldGEgZWxlbWVudHMiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgZGF0YSk6CiAgICAgICAgIiIic3RyaW5nIC0gdGhlIGRhdGEgdG8gd29yayBvbiBmb3IgZW5jb2RpbmcgZGV0ZWN0aW9uIiIiCiAgICAgICAgc2VsZi5kYXRhID0gRW5jb2RpbmdCeXRlcyhkYXRhKQogICAgICAgIHNlbGYuZW5jb2RpbmcgPSBOb25lCgogICAgZGVmIGdldEVuY29kaW5nKHNlbGYpOgogICAgICAgIG1ldGhvZERpc3BhdGNoID0gKAogICAgICAgICAgICAoYiI8IS0tIiwgc2VsZi5oYW5kbGVDb21tZW50KSwKICAgICAgICAgICAgKGIiPG1ldGEiLCBzZWxmLmhhbmRsZU1ldGEpLAogICAgICAgICAgICAoYiI8LyIsIHNlbGYuaGFuZGxlUG9zc2libGVFbmRUYWcpLAogICAgICAgICAgICAoYiI8ISIsIHNlbGYuaGFuZGxlT3RoZXIpLAogICAgICAgICAgICAoYiI8PyIsIHNlbGYuaGFuZGxlT3RoZXIpLAogICAgICAgICAgICAoYiI8Iiwgc2VsZi5oYW5kbGVQb3NzaWJsZVN0YXJ0VGFnKSkKICAgICAgICBmb3IgXyBpbiBzZWxmLmRhdGE6CiAgICAgICAgICAgIGtlZXBQYXJzaW5nID0gVHJ1ZQogICAgICAgICAgICBmb3Iga2V5LCBtZXRob2QgaW4gbWV0aG9kRGlzcGF0Y2g6CiAgICAgICAgICAgICAgICBpZiBzZWxmLmRhdGEubWF0Y2hCeXRlcyhrZXkpOgogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAga2VlcFBhcnNpbmcgPSBtZXRob2QoKQogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgogICAgICAgICAgICAgICAgICAgICAgICBrZWVwUGFyc2luZyA9IEZhbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGlmIG5vdCBrZWVwUGFyc2luZzoKICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgIHJldHVybiBzZWxmLmVuY29kaW5nCgogICAgZGVmIGhhbmRsZUNvbW1lbnQoc2VsZik6CiAgICAgICAgIiIiU2tpcCBvdmVyIGNvbW1lbnRzIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuZGF0YS5qdW1wVG8oYiItLT4iKQoKICAgIGRlZiBoYW5kbGVNZXRhKHNlbGYpOgogICAgICAgIGlmIHNlbGYuZGF0YS5jdXJyZW50Qnl0ZSBub3QgaW4gc3BhY2VDaGFyYWN0ZXJzQnl0ZXM6CiAgICAgICAgICAgICMgaWYgd2UgaGF2ZSA8bWV0YSBub3QgZm9sbG93ZWQgYnkgYSBzcGFjZSBzbyBqdXN0IGtlZXAgZ29pbmcKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICAjIFdlIGhhdmUgYSB2YWxpZCBtZXRhIGVsZW1lbnQgd2Ugd2FudCB0byBzZWFyY2ggZm9yIGF0dHJpYnV0ZXMKICAgICAgICBoYXNQcmFnbWEgPSBGYWxzZQogICAgICAgIHBlbmRpbmdFbmNvZGluZyA9IE5vbmUKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAjIFRyeSB0byBmaW5kIHRoZSBuZXh0IGF0dHJpYnV0ZSBhZnRlciB0aGUgY3VycmVudCBwb3NpdGlvbgogICAgICAgICAgICBhdHRyID0gc2VsZi5nZXRBdHRyaWJ1dGUoKQogICAgICAgICAgICBpZiBhdHRyIGlzIE5vbmU6CiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaWYgYXR0clswXSA9PSBiImh0dHAtZXF1aXYiOgogICAgICAgICAgICAgICAgICAgIGhhc1ByYWdtYSA9IGF0dHJbMV0gPT0gYiJjb250ZW50LXR5cGUiCiAgICAgICAgICAgICAgICAgICAgaWYgaGFzUHJhZ21hIGFuZCBwZW5kaW5nRW5jb2RpbmcgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZW5jb2RpbmcgPSBwZW5kaW5nRW5jb2RpbmcKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICAgICAgICBlbGlmIGF0dHJbMF0gPT0gYiJjaGFyc2V0IjoKICAgICAgICAgICAgICAgICAgICB0ZW50YXRpdmVFbmNvZGluZyA9IGF0dHJbMV0KICAgICAgICAgICAgICAgICAgICBjb2RlYyA9IGxvb2t1cEVuY29kaW5nKHRlbnRhdGl2ZUVuY29kaW5nKQogICAgICAgICAgICAgICAgICAgIGlmIGNvZGVjIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVuY29kaW5nID0gY29kZWMKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICAgICAgICBlbGlmIGF0dHJbMF0gPT0gYiJjb250ZW50IjoKICAgICAgICAgICAgICAgICAgICBjb250ZW50UGFyc2VyID0gQ29udGVudEF0dHJQYXJzZXIoRW5jb2RpbmdCeXRlcyhhdHRyWzFdKSkKICAgICAgICAgICAgICAgICAgICB0ZW50YXRpdmVFbmNvZGluZyA9IGNvbnRlbnRQYXJzZXIucGFyc2UoKQogICAgICAgICAgICAgICAgICAgIGlmIHRlbnRhdGl2ZUVuY29kaW5nIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICBjb2RlYyA9IGxvb2t1cEVuY29kaW5nKHRlbnRhdGl2ZUVuY29kaW5nKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBjb2RlYyBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGhhc1ByYWdtYToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVuY29kaW5nID0gY29kZWMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ0VuY29kaW5nID0gY29kZWMKCiAgICBkZWYgaGFuZGxlUG9zc2libGVTdGFydFRhZyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5oYW5kbGVQb3NzaWJsZVRhZyhGYWxzZSkKCiAgICBkZWYgaGFuZGxlUG9zc2libGVFbmRUYWcoc2VsZik6CiAgICAgICAgbmV4dChzZWxmLmRhdGEpCiAgICAgICAgcmV0dXJuIHNlbGYuaGFuZGxlUG9zc2libGVUYWcoVHJ1ZSkKCiAgICBkZWYgaGFuZGxlUG9zc2libGVUYWcoc2VsZiwgZW5kVGFnKToKICAgICAgICBkYXRhID0gc2VsZi5kYXRhCiAgICAgICAgaWYgZGF0YS5jdXJyZW50Qnl0ZSBub3QgaW4gYXNjaWlMZXR0ZXJzQnl0ZXM6CiAgICAgICAgICAgICMgSWYgdGhlIG5leHQgYnl0ZSBpcyBub3QgYW4gYXNjaWkgbGV0dGVyIGVpdGhlciBpZ25vcmUgdGhpcwogICAgICAgICAgICAjIGZyYWdtZW50IChwb3NzaWJsZSBzdGFydCB0YWcgY2FzZSkgb3IgdHJlYXQgaXQgYWNjb3JkaW5nIHRvCiAgICAgICAgICAgICMgaGFuZGxlT3RoZXIKICAgICAgICAgICAgaWYgZW5kVGFnOgogICAgICAgICAgICAgICAgZGF0YS5wcmV2aW91cygpCiAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZU90aGVyKCkKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgYyA9IGRhdGEuc2tpcFVudGlsKHNwYWNlc0FuZ2xlQnJhY2tldHMpCiAgICAgICAgaWYgYyA9PSBiIjwiOgogICAgICAgICAgICAjIHJldHVybiB0byB0aGUgZmlyc3Qgc3RlcCBpbiB0aGUgb3ZlcmFsbCAidHdvIHN0ZXAiIGFsZ29yaXRobQogICAgICAgICAgICAjIHJlcHJvY2Vzc2luZyB0aGUgPCBieXRlCiAgICAgICAgICAgIGRhdGEucHJldmlvdXMoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgUmVhZCBhbGwgYXR0cmlidXRlcwogICAgICAgICAgICBhdHRyID0gc2VsZi5nZXRBdHRyaWJ1dGUoKQogICAgICAgICAgICB3aGlsZSBhdHRyIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgYXR0ciA9IHNlbGYuZ2V0QXR0cmlidXRlKCkKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBoYW5kbGVPdGhlcihzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5kYXRhLmp1bXBUbyhiIj4iKQoKICAgIGRlZiBnZXRBdHRyaWJ1dGUoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIGEgbmFtZSx2YWx1ZSBwYWlyIGZvciB0aGUgbmV4dCBhdHRyaWJ1dGUgaW4gdGhlIHN0cmVhbSwKICAgICAgICBpZiBvbmUgaXMgZm91bmQsIG9yIE5vbmUiIiIKICAgICAgICBkYXRhID0gc2VsZi5kYXRhCiAgICAgICAgIyBTdGVwIDEgKHNraXAgY2hhcnMpCiAgICAgICAgYyA9IGRhdGEuc2tpcChzcGFjZUNoYXJhY3RlcnNCeXRlcyB8IGZyb3plbnNldChbYiIvIl0pKQogICAgICAgIGFzc2VydCBjIGlzIE5vbmUgb3IgbGVuKGMpID09IDEKICAgICAgICAjIFN0ZXAgMgogICAgICAgIGlmIGMgaW4gKGIiPiIsIE5vbmUpOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgICMgU3RlcCAzCiAgICAgICAgYXR0ck5hbWUgPSBbXQogICAgICAgIGF0dHJWYWx1ZSA9IFtdCiAgICAgICAgIyBTdGVwIDQgYXR0cmlidXRlIG5hbWUKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICBpZiBjID09IGIiPSIgYW5kIGF0dHJOYW1lOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZWxpZiBjIGluIHNwYWNlQ2hhcmFjdGVyc0J5dGVzOgogICAgICAgICAgICAgICAgIyBTdGVwIDYhCiAgICAgICAgICAgICAgICBjID0gZGF0YS5za2lwKCkKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGVsaWYgYyBpbiAoYiIvIiwgYiI+Iik6CiAgICAgICAgICAgICAgICByZXR1cm4gYiIiLmpvaW4oYXR0ck5hbWUpLCBiIiIKICAgICAgICAgICAgZWxpZiBjIGluIGFzY2lpVXBwZXJjYXNlQnl0ZXM6CiAgICAgICAgICAgICAgICBhdHRyTmFtZS5hcHBlbmQoYy5sb3dlcigpKQogICAgICAgICAgICBlbGlmIGMgaXMgTm9uZToKICAgICAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBhdHRyTmFtZS5hcHBlbmQoYykKICAgICAgICAgICAgIyBTdGVwIDUKICAgICAgICAgICAgYyA9IG5leHQoZGF0YSkKICAgICAgICAjIFN0ZXAgNwogICAgICAgIGlmIGMgIT0gYiI9IjoKICAgICAgICAgICAgZGF0YS5wcmV2aW91cygpCiAgICAgICAgICAgIHJldHVybiBiIiIuam9pbihhdHRyTmFtZSksIGIiIgogICAgICAgICMgU3RlcCA4CiAgICAgICAgbmV4dChkYXRhKQogICAgICAgICMgU3RlcCA5CiAgICAgICAgYyA9IGRhdGEuc2tpcCgpCiAgICAgICAgIyBTdGVwIDEwCiAgICAgICAgaWYgYyBpbiAoYiInIiwgYiciJyk6CiAgICAgICAgICAgICMgMTAuMQogICAgICAgICAgICBxdW90ZUNoYXIgPSBjCiAgICAgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICAgICAjIDEwLjIKICAgICAgICAgICAgICAgIGMgPSBuZXh0KGRhdGEpCiAgICAgICAgICAgICAgICAjIDEwLjMKICAgICAgICAgICAgICAgIGlmIGMgPT0gcXVvdGVDaGFyOgogICAgICAgICAgICAgICAgICAgIG5leHQoZGF0YSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYiIiLmpvaW4oYXR0ck5hbWUpLCBiIiIuam9pbihhdHRyVmFsdWUpCiAgICAgICAgICAgICAgICAjIDEwLjQKICAgICAgICAgICAgICAgIGVsaWYgYyBpbiBhc2NpaVVwcGVyY2FzZUJ5dGVzOgogICAgICAgICAgICAgICAgICAgIGF0dHJWYWx1ZS5hcHBlbmQoYy5sb3dlcigpKQogICAgICAgICAgICAgICAgIyAxMC41CiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGF0dHJWYWx1ZS5hcHBlbmQoYykKICAgICAgICBlbGlmIGMgPT0gYiI+IjoKICAgICAgICAgICAgcmV0dXJuIGIiIi5qb2luKGF0dHJOYW1lKSwgYiIiCiAgICAgICAgZWxpZiBjIGluIGFzY2lpVXBwZXJjYXNlQnl0ZXM6CiAgICAgICAgICAgIGF0dHJWYWx1ZS5hcHBlbmQoYy5sb3dlcigpKQogICAgICAgIGVsaWYgYyBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGF0dHJWYWx1ZS5hcHBlbmQoYykKICAgICAgICAjIFN0ZXAgMTEKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICBjID0gbmV4dChkYXRhKQogICAgICAgICAgICBpZiBjIGluIHNwYWNlc0FuZ2xlQnJhY2tldHM6CiAgICAgICAgICAgICAgICByZXR1cm4gYiIiLmpvaW4oYXR0ck5hbWUpLCBiIiIuam9pbihhdHRyVmFsdWUpCiAgICAgICAgICAgIGVsaWYgYyBpbiBhc2NpaVVwcGVyY2FzZUJ5dGVzOgogICAgICAgICAgICAgICAgYXR0clZhbHVlLmFwcGVuZChjLmxvd2VyKCkpCiAgICAgICAgICAgIGVsaWYgYyBpcyBOb25lOgogICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGF0dHJWYWx1ZS5hcHBlbmQoYykKCgpjbGFzcyBDb250ZW50QXR0clBhcnNlcihvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGRhdGEpOgogICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGRhdGEsIGJ5dGVzKQogICAgICAgIHNlbGYuZGF0YSA9IGRhdGEKCiAgICBkZWYgcGFyc2Uoc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIENoZWNrIGlmIHRoZSBhdHRyIG5hbWUgaXMgY2hhcnNldAogICAgICAgICAgICAjIG90aGVyd2lzZSByZXR1cm4KICAgICAgICAgICAgc2VsZi5kYXRhLmp1bXBUbyhiImNoYXJzZXQiKQogICAgICAgICAgICBzZWxmLmRhdGEucG9zaXRpb24gKz0gMQogICAgICAgICAgICBzZWxmLmRhdGEuc2tpcCgpCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLmRhdGEuY3VycmVudEJ5dGUgPT0gYiI9IjoKICAgICAgICAgICAgICAgICMgSWYgdGhlcmUgaXMgbm8gPSBzaWduIGtlZXAgbG9va2luZyBmb3IgYXR0cnMKICAgICAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgICAgIHNlbGYuZGF0YS5wb3NpdGlvbiArPSAxCiAgICAgICAgICAgIHNlbGYuZGF0YS5za2lwKCkKICAgICAgICAgICAgIyBMb29rIGZvciBhbiBlbmNvZGluZyBiZXR3ZWVuIG1hdGNoaW5nIHF1b3RlIG1hcmtzCiAgICAgICAgICAgIGlmIHNlbGYuZGF0YS5jdXJyZW50Qnl0ZSBpbiAoYiciJywgYiInIik6CiAgICAgICAgICAgICAgICBxdW90ZU1hcmsgPSBzZWxmLmRhdGEuY3VycmVudEJ5dGUKICAgICAgICAgICAgICAgIHNlbGYuZGF0YS5wb3NpdGlvbiArPSAxCiAgICAgICAgICAgICAgICBvbGRQb3NpdGlvbiA9IHNlbGYuZGF0YS5wb3NpdGlvbgogICAgICAgICAgICAgICAgaWYgc2VsZi5kYXRhLmp1bXBUbyhxdW90ZU1hcmspOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmRhdGFbb2xkUG9zaXRpb246c2VsZi5kYXRhLnBvc2l0aW9uXQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBVbnF1b3RlZCB2YWx1ZQogICAgICAgICAgICAgICAgb2xkUG9zaXRpb24gPSBzZWxmLmRhdGEucG9zaXRpb24KICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEuc2tpcFVudGlsKHNwYWNlQ2hhcmFjdGVyc0J5dGVzKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmRhdGFbb2xkUG9zaXRpb246c2VsZi5kYXRhLnBvc2l0aW9uXQogICAgICAgICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CiAgICAgICAgICAgICAgICAgICAgIyBSZXR1cm4gdGhlIHdob2xlIHJlbWFpbmluZyB2YWx1ZQogICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmRhdGFbb2xkUG9zaXRpb246XQogICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgogICAgICAgICAgICByZXR1cm4gTm9uZQoKCmRlZiBsb29rdXBFbmNvZGluZyhlbmNvZGluZyk6CiAgICAiIiJSZXR1cm4gdGhlIHB5dGhvbiBjb2RlYyBuYW1lIGNvcnJlc3BvbmRpbmcgdG8gYW4gZW5jb2Rpbmcgb3IgTm9uZSBpZiB0aGUKICAgIHN0cmluZyBkb2Vzbid0IGNvcnJlc3BvbmQgdG8gYSB2YWxpZCBlbmNvZGluZy4iIiIKICAgIGlmIGlzaW5zdGFuY2UoZW5jb2RpbmcsIGJpbmFyeV90eXBlKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGVuY29kaW5nID0gZW5jb2RpbmcuZGVjb2RlKCJhc2NpaSIpCiAgICAgICAgZXhjZXB0IFVuaWNvZGVEZWNvZGVFcnJvcjoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBpZiBlbmNvZGluZyBpcyBub3QgTm9uZToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiB3ZWJlbmNvZGluZ3MubG9va3VwKGVuY29kaW5nKQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIE5vbmUKUEsDBBQAAAAAAAAAIQDERmoWJCsBACQrAQAyAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL190b2tlbml6ZXIucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKCmZyb20gcGlwLl92ZW5kb3Iuc2l4IGltcG9ydCB1bmljaHIgYXMgY2hyCgpmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZXF1ZQoKZnJvbSAuY29uc3RhbnRzIGltcG9ydCBzcGFjZUNoYXJhY3RlcnMKZnJvbSAuY29uc3RhbnRzIGltcG9ydCBlbnRpdGllcwpmcm9tIC5jb25zdGFudHMgaW1wb3J0IGFzY2lpTGV0dGVycywgYXNjaWlVcHBlcjJMb3dlcgpmcm9tIC5jb25zdGFudHMgaW1wb3J0IGRpZ2l0cywgaGV4RGlnaXRzLCBFT0YKZnJvbSAuY29uc3RhbnRzIGltcG9ydCB0b2tlblR5cGVzLCB0YWdUb2tlblR5cGVzCmZyb20gLmNvbnN0YW50cyBpbXBvcnQgcmVwbGFjZW1lbnRDaGFyYWN0ZXJzCgpmcm9tIC5faW5wdXRzdHJlYW0gaW1wb3J0IEhUTUxJbnB1dFN0cmVhbQoKZnJvbSAuX3RyaWUgaW1wb3J0IFRyaWUKCmVudGl0aWVzVHJpZSA9IFRyaWUoZW50aXRpZXMpCgoKY2xhc3MgSFRNTFRva2VuaXplcihvYmplY3QpOgogICAgIiIiIFRoaXMgY2xhc3MgdGFrZXMgY2FyZSBvZiB0b2tlbml6aW5nIEhUTUwuCgogICAgKiBzZWxmLmN1cnJlbnRUb2tlbgogICAgICBIb2xkcyB0aGUgdG9rZW4gdGhhdCBpcyBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkLgoKICAgICogc2VsZi5zdGF0ZQogICAgICBIb2xkcyBhIHJlZmVyZW5jZSB0byB0aGUgbWV0aG9kIHRvIGJlIGludm9rZWQuLi4gWFhYCgogICAgKiBzZWxmLnN0cmVhbQogICAgICBQb2ludHMgdG8gSFRNTElucHV0U3RyZWFtIG9iamVjdC4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIHBhcnNlcj1Ob25lLCAqKmt3YXJncyk6CgogICAgICAgIHNlbGYuc3RyZWFtID0gSFRNTElucHV0U3RyZWFtKHN0cmVhbSwgKiprd2FyZ3MpCiAgICAgICAgc2VsZi5wYXJzZXIgPSBwYXJzZXIKCiAgICAgICAgIyBTZXR1cCB0aGUgaW5pdGlhbCB0b2tlbml6ZXIgc3RhdGUKICAgICAgICBzZWxmLmVzY2FwZUZsYWcgPSBGYWxzZQogICAgICAgIHNlbGYubGFzdEZvdXJDaGFycyA9IFtdCiAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgc2VsZi5lc2NhcGUgPSBGYWxzZQoKICAgICAgICAjIFRoZSBjdXJyZW50IHRva2VuIGJlaW5nIGNyZWF0ZWQKICAgICAgICBzZWxmLmN1cnJlbnRUb2tlbiA9IE5vbmUKICAgICAgICBzdXBlcihIVE1MVG9rZW5pemVyLCBzZWxmKS5fX2luaXRfXygpCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgICIiIiBUaGlzIGlzIHdoZXJlIHRoZSBtYWdpYyBoYXBwZW5zLgoKICAgICAgICBXZSBkbyBvdXIgdXN1YWxseSBwcm9jZXNzaW5nIHRocm91Z2ggdGhlIHN0YXRlcyBhbmQgd2hlbiB3ZSBoYXZlIGEgdG9rZW4KICAgICAgICB0byByZXR1cm4gd2UgeWllbGQgdGhlIHRva2VuIHdoaWNoIHBhdXNlcyBwcm9jZXNzaW5nIHVudGlsIHRoZSBuZXh0IHRva2VuCiAgICAgICAgaXMgcmVxdWVzdGVkLgogICAgICAgICIiIgogICAgICAgIHNlbGYudG9rZW5RdWV1ZSA9IGRlcXVlKFtdKQogICAgICAgICMgU3RhcnQgcHJvY2Vzc2luZy4gV2hlbiBFT0YgaXMgcmVhY2hlZCBzZWxmLnN0YXRlIHdpbGwgcmV0dXJuIEZhbHNlCiAgICAgICAgIyBpbnN0ZWFkIG9mIFRydWUgYW5kIHRoZSBsb29wIHdpbGwgdGVybWluYXRlLgogICAgICAgIHdoaWxlIHNlbGYuc3RhdGUoKToKICAgICAgICAgICAgd2hpbGUgc2VsZi5zdHJlYW0uZXJyb3JzOgogICAgICAgICAgICAgICAgeWllbGQgeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6IHNlbGYuc3RyZWFtLmVycm9ycy5wb3AoMCl9CiAgICAgICAgICAgIHdoaWxlIHNlbGYudG9rZW5RdWV1ZToKICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYudG9rZW5RdWV1ZS5wb3BsZWZ0KCkKCiAgICBkZWYgY29uc3VtZU51bWJlckVudGl0eShzZWxmLCBpc0hleCk6CiAgICAgICAgIiIiVGhpcyBmdW5jdGlvbiByZXR1cm5zIGVpdGhlciBVK0ZGRkQgb3IgdGhlIGNoYXJhY3RlciBiYXNlZCBvbiB0aGUKICAgICAgICBkZWNpbWFsIG9yIGhleGFkZWNpbWFsIHJlcHJlc2VudGF0aW9uLiBJdCBhbHNvIGRpc2NhcmRzICI7IiBpZiBwcmVzZW50LgogICAgICAgIElmIG5vdCBwcmVzZW50IHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdfSkgaXMgaW52b2tlZC4KICAgICAgICAiIiIKCiAgICAgICAgYWxsb3dlZCA9IGRpZ2l0cwogICAgICAgIHJhZGl4ID0gMTAKICAgICAgICBpZiBpc0hleDoKICAgICAgICAgICAgYWxsb3dlZCA9IGhleERpZ2l0cwogICAgICAgICAgICByYWRpeCA9IDE2CgogICAgICAgIGNoYXJTdGFjayA9IFtdCgogICAgICAgICMgQ29uc3VtZSBhbGwgdGhlIGNoYXJhY3RlcnMgdGhhdCBhcmUgaW4gcmFuZ2Ugd2hpbGUgbWFraW5nIHN1cmUgd2UKICAgICAgICAjIGRvbid0IGhpdCBhbiBFT0YuCiAgICAgICAgYyA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIHdoaWxlIGMgaW4gYWxsb3dlZCBhbmQgYyBpcyBub3QgRU9GOgogICAgICAgICAgICBjaGFyU3RhY2suYXBwZW5kKGMpCiAgICAgICAgICAgIGMgPSBzZWxmLnN0cmVhbS5jaGFyKCkKCiAgICAgICAgIyBDb252ZXJ0IHRoZSBzZXQgb2YgY2hhcmFjdGVycyBjb25zdW1lZCB0byBhbiBpbnQuCiAgICAgICAgY2hhckFzSW50ID0gaW50KCIiLmpvaW4oY2hhclN0YWNrKSwgcmFkaXgpCgogICAgICAgICMgQ2VydGFpbiBjaGFyYWN0ZXJzIGdldCByZXBsYWNlZCB3aXRoIG90aGVycwogICAgICAgIGlmIGNoYXJBc0ludCBpbiByZXBsYWNlbWVudENoYXJhY3RlcnM6CiAgICAgICAgICAgIGNoYXIgPSByZXBsYWNlbWVudENoYXJhY3RlcnNbY2hhckFzSW50XQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWxsZWdhbC1jb2RlcG9pbnQtZm9yLW51bWVyaWMtZW50aXR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGF2YXJzIjogeyJjaGFyQXNJbnQiOiBjaGFyQXNJbnR9fSkKICAgICAgICBlbGlmICgoMHhEODAwIDw9IGNoYXJBc0ludCA8PSAweERGRkYpIG9yCiAgICAgICAgICAgICAgKGNoYXJBc0ludCA+IDB4MTBGRkZGKSk6CiAgICAgICAgICAgIGNoYXIgPSAiXHVGRkZEIgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWxsZWdhbC1jb2RlcG9pbnQtZm9yLW51bWVyaWMtZW50aXR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGF2YXJzIjogeyJjaGFyQXNJbnQiOiBjaGFyQXNJbnR9fSkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIFNob3VsZCBzcGVlZCB1cCB0aGlzIGNoZWNrIHNvbWVob3cgKGUuZy4gbW92ZSB0aGUgc2V0IHRvIGEgY29uc3RhbnQpCiAgICAgICAgICAgIGlmICgoMHgwMDAxIDw9IGNoYXJBc0ludCA8PSAweDAwMDgpIG9yCiAgICAgICAgICAgICAgICAoMHgwMDBFIDw9IGNoYXJBc0ludCA8PSAweDAwMUYpIG9yCiAgICAgICAgICAgICAgICAoMHgwMDdGIDw9IGNoYXJBc0ludCA8PSAweDAwOUYpIG9yCiAgICAgICAgICAgICAgICAoMHhGREQwIDw9IGNoYXJBc0ludCA8PSAweEZERUYpIG9yCiAgICAgICAgICAgICAgICBjaGFyQXNJbnQgaW4gZnJvemVuc2V0KFsweDAwMEIsIDB4RkZGRSwgMHhGRkZGLCAweDFGRkZFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxRkZGRiwgMHgyRkZGRSwgMHgyRkZGRiwgMHgzRkZGRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4M0ZGRkYsIDB4NEZGRkUsIDB4NEZGRkYsIDB4NUZGRkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDVGRkZGLCAweDZGRkZFLCAweDZGRkZGLCAweDdGRkZFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3RkZGRiwgMHg4RkZGRSwgMHg4RkZGRiwgMHg5RkZGRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OUZGRkYsIDB4QUZGRkUsIDB4QUZGRkYsIDB4QkZGRkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEJGRkZGLCAweENGRkZFLCAweENGRkZGLCAweERGRkZFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhERkZGRiwgMHhFRkZGRSwgMHhFRkZGRiwgMHhGRkZGRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkYsIDB4MTBGRkZFLCAweDEwRkZGRl0pKToKICAgICAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlsbGVnYWwtY29kZXBvaW50LWZvci1udW1lcmljLWVudGl0eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YXZhcnMiOiB7ImNoYXJBc0ludCI6IGNoYXJBc0ludH19KQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAjIFRyeS9leGNlcHQgbmVlZGVkIGFzIFVDUy0yIFB5dGhvbiBidWlsZHMnIHVuaWNoYXIgb25seSB3b3JrcwogICAgICAgICAgICAgICAgIyB3aXRoaW4gdGhlIEJNUC4KICAgICAgICAgICAgICAgIGNoYXIgPSBjaHIoY2hhckFzSW50KQogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgIHYgPSBjaGFyQXNJbnQgLSAweDEwMDAwCiAgICAgICAgICAgICAgICBjaGFyID0gY2hyKDB4RDgwMCB8ICh2ID4+IDEwKSkgKyBjaHIoMHhEQzAwIHwgKHYgJiAweDNGRikpCgogICAgICAgICMgRGlzY2FyZCB0aGUgOyBpZiBwcmVzZW50LiBPdGhlcndpc2UsIHB1dCBpdCBiYWNrIG9uIHRoZSBxdWV1ZSBhbmQKICAgICAgICAjIGludm9rZSBwYXJzZUVycm9yIG9uIHBhcnNlci4KICAgICAgICBpZiBjICE9ICI7IjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm51bWVyaWMtZW50aXR5LXdpdGhvdXQtc2VtaWNvbG9uIn0pCiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGMpCgogICAgICAgIHJldHVybiBjaGFyCgogICAgZGVmIGNvbnN1bWVFbnRpdHkoc2VsZiwgYWxsb3dlZENoYXI9Tm9uZSwgZnJvbUF0dHJpYnV0ZT1GYWxzZSk6CiAgICAgICAgIyBJbml0aWFsaXNlIHRvIHRoZSBkZWZhdWx0IG91dHB1dCBmb3Igd2hlbiBubyBlbnRpdHkgaXMgbWF0Y2hlZAogICAgICAgIG91dHB1dCA9ICImIgoKICAgICAgICBjaGFyU3RhY2sgPSBbc2VsZi5zdHJlYW0uY2hhcigpXQogICAgICAgIGlmIChjaGFyU3RhY2tbMF0gaW4gc3BhY2VDaGFyYWN0ZXJzIG9yIGNoYXJTdGFja1swXSBpbiAoRU9GLCAiPCIsICImIikgb3IKICAgICAgICAgICAgICAgIChhbGxvd2VkQ2hhciBpcyBub3QgTm9uZSBhbmQgYWxsb3dlZENoYXIgPT0gY2hhclN0YWNrWzBdKSk6CiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGNoYXJTdGFja1swXSkKCiAgICAgICAgZWxpZiBjaGFyU3RhY2tbMF0gPT0gIiMiOgogICAgICAgICAgICAjIFJlYWQgdGhlIG5leHQgY2hhcmFjdGVyIHRvIHNlZSBpZiBpdCdzIGhleCBvciBkZWNpbWFsCiAgICAgICAgICAgIGhleCA9IEZhbHNlCiAgICAgICAgICAgIGNoYXJTdGFjay5hcHBlbmQoc2VsZi5zdHJlYW0uY2hhcigpKQogICAgICAgICAgICBpZiBjaGFyU3RhY2tbLTFdIGluICgieCIsICJYIik6CiAgICAgICAgICAgICAgICBoZXggPSBUcnVlCiAgICAgICAgICAgICAgICBjaGFyU3RhY2suYXBwZW5kKHNlbGYuc3RyZWFtLmNoYXIoKSkKCiAgICAgICAgICAgICMgY2hhclN0YWNrWy0xXSBzaG91bGQgYmUgdGhlIGZpcnN0IGRpZ2l0CiAgICAgICAgICAgIGlmIChoZXggYW5kIGNoYXJTdGFja1stMV0gaW4gaGV4RGlnaXRzKSBcCiAgICAgICAgICAgICAgICAgICAgb3IgKG5vdCBoZXggYW5kIGNoYXJTdGFja1stMV0gaW4gZGlnaXRzKToKICAgICAgICAgICAgICAgICMgQXQgbGVhc3Qgb25lIGRpZ2l0IGZvdW5kLCBzbyBjb25zdW1lIHRoZSB3aG9sZSBudW1iZXIKICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGNoYXJTdGFja1stMV0pCiAgICAgICAgICAgICAgICBvdXRwdXQgPSBzZWxmLmNvbnN1bWVOdW1iZXJFbnRpdHkoaGV4KQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBObyBkaWdpdHMgZm91bmQKICAgICAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiZXhwZWN0ZWQtbnVtZXJpYy1lbnRpdHkifSkKICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGNoYXJTdGFjay5wb3AoKSkKICAgICAgICAgICAgICAgIG91dHB1dCA9ICImIiArICIiLmpvaW4oY2hhclN0YWNrKQoKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIEF0IHRoaXMgcG9pbnQgaW4gdGhlIHByb2Nlc3MgbWlnaHQgaGF2ZSBuYW1lZCBlbnRpdHkuIEVudGl0aWVzCiAgICAgICAgICAgICMgYXJlIHN0b3JlZCBpbiB0aGUgZ2xvYmFsIHZhcmlhYmxlICJlbnRpdGllcyIuCiAgICAgICAgICAgICMKICAgICAgICAgICAgIyBDb25zdW1lIGNoYXJhY3RlcnMgYW5kIGNvbXBhcmUgdG8gdGhlc2UgdG8gYSBzdWJzdHJpbmcgb2YgdGhlCiAgICAgICAgICAgICMgZW50aXR5IG5hbWVzIGluIHRoZSBsaXN0IHVudGlsIHRoZSBzdWJzdHJpbmcgbm8gbG9uZ2VyIG1hdGNoZXMuCiAgICAgICAgICAgIHdoaWxlIChjaGFyU3RhY2tbLTFdIGlzIG5vdCBFT0YpOgogICAgICAgICAgICAgICAgaWYgbm90IGVudGl0aWVzVHJpZS5oYXNfa2V5c193aXRoX3ByZWZpeCgiIi5qb2luKGNoYXJTdGFjaykpOgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBjaGFyU3RhY2suYXBwZW5kKHNlbGYuc3RyZWFtLmNoYXIoKSkKCiAgICAgICAgICAgICMgQXQgdGhpcyBwb2ludCB3ZSBoYXZlIGEgc3RyaW5nIHRoYXQgc3RhcnRzIHdpdGggc29tZSBjaGFyYWN0ZXJzCiAgICAgICAgICAgICMgdGhhdCBtYXkgbWF0Y2ggYW4gZW50aXR5CiAgICAgICAgICAgICMgVHJ5IHRvIGZpbmQgdGhlIGxvbmdlc3QgZW50aXR5IHRoZSBzdHJpbmcgd2lsbCBtYXRjaCB0byB0YWtlIGNhcmUKICAgICAgICAgICAgIyBvZiAmbm90aSBmb3IgaW5zdGFuY2UuCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGVudGl0eU5hbWUgPSBlbnRpdGllc1RyaWUubG9uZ2VzdF9wcmVmaXgoIiIuam9pbihjaGFyU3RhY2tbOi0xXSkpCiAgICAgICAgICAgICAgICBlbnRpdHlMZW5ndGggPSBsZW4oZW50aXR5TmFtZSkKICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgICAgZW50aXR5TmFtZSA9IE5vbmUKCiAgICAgICAgICAgIGlmIGVudGl0eU5hbWUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBpZiBlbnRpdHlOYW1lWy0xXSAhPSAiOyI6CiAgICAgICAgICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZWQtZW50aXR5LXdpdGhvdXQtc2VtaWNvbG9uIn0pCiAgICAgICAgICAgICAgICBpZiAoZW50aXR5TmFtZVstMV0gIT0gIjsiIGFuZCBmcm9tQXR0cmlidXRlIGFuZAogICAgICAgICAgICAgICAgICAgIChjaGFyU3RhY2tbZW50aXR5TGVuZ3RoXSBpbiBhc2NpaUxldHRlcnMgb3IKICAgICAgICAgICAgICAgICAgICAgY2hhclN0YWNrW2VudGl0eUxlbmd0aF0gaW4gZGlnaXRzIG9yCiAgICAgICAgICAgICAgICAgICAgIGNoYXJTdGFja1tlbnRpdHlMZW5ndGhdID09ICI9IikpOgogICAgICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGNoYXJTdGFjay5wb3AoKSkKICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSAiJiIgKyAiIi5qb2luKGNoYXJTdGFjaykKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gZW50aXRpZXNbZW50aXR5TmFtZV0KICAgICAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChjaGFyU3RhY2sucG9wKCkpCiAgICAgICAgICAgICAgICAgICAgb3V0cHV0ICs9ICIiLmpvaW4oY2hhclN0YWNrW2VudGl0eUxlbmd0aDpdKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZC1uYW1lZC1lbnRpdHkifSkKICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGNoYXJTdGFjay5wb3AoKSkKICAgICAgICAgICAgICAgIG91dHB1dCA9ICImIiArICIiLmpvaW4oY2hhclN0YWNrKQoKICAgICAgICBpZiBmcm9tQXR0cmlidXRlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdWy0xXVsxXSArPSBvdXRwdXQKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBvdXRwdXQgaW4gc3BhY2VDaGFyYWN0ZXJzOgogICAgICAgICAgICAgICAgdG9rZW5UeXBlID0gIlNwYWNlQ2hhcmFjdGVycyIKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHRva2VuVHlwZSA9ICJDaGFyYWN0ZXJzIgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbdG9rZW5UeXBlXSwgImRhdGEiOiBvdXRwdXR9KQoKICAgIGRlZiBwcm9jZXNzRW50aXR5SW5BdHRyaWJ1dGUoc2VsZiwgYWxsb3dlZENoYXIpOgogICAgICAgICIiIlRoaXMgbWV0aG9kIHJlcGxhY2VzIHRoZSBuZWVkIGZvciAiZW50aXR5SW5BdHRyaWJ1dGVWYWx1ZVN0YXRlIi4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmNvbnN1bWVFbnRpdHkoYWxsb3dlZENoYXI9YWxsb3dlZENoYXIsIGZyb21BdHRyaWJ1dGU9VHJ1ZSkKCiAgICBkZWYgZW1pdEN1cnJlbnRUb2tlbihzZWxmKToKICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBhIGdlbmVyaWMgaGFuZGxlciBmb3IgZW1pdHRpbmcgdGhlIHRhZ3MuIEl0IGFsc28gc2V0cwogICAgICAgIHRoZSBzdGF0ZSB0byAiZGF0YSIgYmVjYXVzZSB0aGF0J3Mgd2hhdCdzIG5lZWRlZCBhZnRlciBhIHRva2VuIGhhcyBiZWVuCiAgICAgICAgZW1pdHRlZC4KICAgICAgICAiIiIKICAgICAgICB0b2tlbiA9IHNlbGYuY3VycmVudFRva2VuCiAgICAgICAgIyBBZGQgdG9rZW4gdG8gdGhlIHF1ZXVlIHRvIGJlIHlpZWxkZWQKICAgICAgICBpZiAodG9rZW5bInR5cGUiXSBpbiB0YWdUb2tlblR5cGVzKToKICAgICAgICAgICAgdG9rZW5bIm5hbWUiXSA9IHRva2VuWyJuYW1lIl0udHJhbnNsYXRlKGFzY2lpVXBwZXIyTG93ZXIpCiAgICAgICAgICAgIGlmIHRva2VuWyJ0eXBlIl0gPT0gdG9rZW5UeXBlc1siRW5kVGFnIl06CiAgICAgICAgICAgICAgICBpZiB0b2tlblsiZGF0YSJdOgogICAgICAgICAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImF0dHJpYnV0ZXMtaW4tZW5kLXRhZyJ9KQogICAgICAgICAgICAgICAgaWYgdG9rZW5bInNlbGZDbG9zaW5nIl06CiAgICAgICAgICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAic2VsZi1jbG9zaW5nLWZsYWctb24tZW5kLXRhZyJ9KQogICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQodG9rZW4pCiAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCgogICAgIyBCZWxvdyBhcmUgdGhlIHZhcmlvdXMgdG9rZW5pemVyIHN0YXRlcyB3b3JrZWQgb3V0LgogICAgZGVmIGRhdGFTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSAiJiI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmVudGl0eURhdGFTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiPCI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnRhZ09wZW5TdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJcdTAwMDAifSkKICAgICAgICBlbGlmIGRhdGEgaXMgRU9GOgogICAgICAgICAgICAjIFRva2VuaXphdGlvbiBlbmRzLgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICBlbGlmIGRhdGEgaW4gc3BhY2VDaGFyYWN0ZXJzOgogICAgICAgICAgICAjIERpcmVjdGx5IGFmdGVyIGVtaXR0aW5nIGEgdG9rZW4geW91IHN3aXRjaCBiYWNrIHRvIHRoZSAiZGF0YQogICAgICAgICAgICAjIHN0YXRlIi4gQXQgdGhhdCBwb2ludCBzcGFjZUNoYXJhY3RlcnMgYXJlIGltcG9ydGFudCBzbyB0aGV5IGFyZQogICAgICAgICAgICAjIGVtaXR0ZWQgc2VwYXJhdGVseS4KICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJTcGFjZUNoYXJhY3RlcnMiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhICsgc2VsZi5zdHJlYW0uY2hhcnNVbnRpbChzcGFjZUNoYXJhY3RlcnMsIFRydWUpfSkKICAgICAgICAgICAgIyBObyBuZWVkIHRvIHVwZGF0ZSBsYXN0Rm91ckNoYXJzIGhlcmUsIHNpbmNlIHRoZSBmaXJzdCBzcGFjZSB3aWxsCiAgICAgICAgICAgICMgaGF2ZSBhbHJlYWR5IGJlZW4gYXBwZW5kZWQgdG8gbGFzdEZvdXJDaGFycyBhbmQgd2lsbCBoYXZlIGJyb2tlbgogICAgICAgICAgICAjIGFueSA8IS0tIG9yIC0tPiBzZXF1ZW5jZXMKICAgICAgICBlbHNlOgogICAgICAgICAgICBjaGFycyA9IHNlbGYuc3RyZWFtLmNoYXJzVW50aWwoKCImIiwgIjwiLCAiXHUwMDAwIikpCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgKyBjaGFyc30pCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgZW50aXR5RGF0YVN0YXRlKHNlbGYpOgogICAgICAgIHNlbGYuY29uc3VtZUVudGl0eSgpCiAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgcmNkYXRhU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIiYiOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5jaGFyYWN0ZXJSZWZlcmVuY2VJblJjZGF0YQogICAgICAgIGVsaWYgZGF0YSA9PSAiPCI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnJjZGF0YUxlc3NUaGFuU2lnblN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09IEVPRjoKICAgICAgICAgICAgIyBUb2tlbml6YXRpb24gZW5kcy4KICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogIlx1RkZGRCJ9KQogICAgICAgIGVsaWYgZGF0YSBpbiBzcGFjZUNoYXJhY3RlcnM6CiAgICAgICAgICAgICMgRGlyZWN0bHkgYWZ0ZXIgZW1pdHRpbmcgYSB0b2tlbiB5b3Ugc3dpdGNoIGJhY2sgdG8gdGhlICJkYXRhCiAgICAgICAgICAgICMgc3RhdGUiLiBBdCB0aGF0IHBvaW50IHNwYWNlQ2hhcmFjdGVycyBhcmUgaW1wb3J0YW50IHNvIHRoZXkgYXJlCiAgICAgICAgICAgICMgZW1pdHRlZCBzZXBhcmF0ZWx5LgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlNwYWNlQ2hhcmFjdGVycyJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgKyBzZWxmLnN0cmVhbS5jaGFyc1VudGlsKHNwYWNlQ2hhcmFjdGVycywgVHJ1ZSl9KQogICAgICAgICAgICAjIE5vIG5lZWQgdG8gdXBkYXRlIGxhc3RGb3VyQ2hhcnMgaGVyZSwgc2luY2UgdGhlIGZpcnN0IHNwYWNlIHdpbGwKICAgICAgICAgICAgIyBoYXZlIGFscmVhZHkgYmVlbiBhcHBlbmRlZCB0byBsYXN0Rm91ckNoYXJzIGFuZCB3aWxsIGhhdmUgYnJva2VuCiAgICAgICAgICAgICMgYW55IDwhLS0gb3IgLS0+IHNlcXVlbmNlcwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGNoYXJzID0gc2VsZi5zdHJlYW0uY2hhcnNVbnRpbCgoIiYiLCAiPCIsICJcdTAwMDAiKSkKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSArIGNoYXJzfSkKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBjaGFyYWN0ZXJSZWZlcmVuY2VJblJjZGF0YShzZWxmKToKICAgICAgICBzZWxmLmNvbnN1bWVFbnRpdHkoKQogICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnJjZGF0YVN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgcmF3dGV4dFN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICI8IjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYucmF3dGV4dExlc3NUaGFuU2lnblN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogIlx1RkZGRCJ9KQogICAgICAgIGVsaWYgZGF0YSA9PSBFT0Y6CiAgICAgICAgICAgICMgVG9rZW5pemF0aW9uIGVuZHMuCiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGNoYXJzID0gc2VsZi5zdHJlYW0uY2hhcnNVbnRpbCgoIjwiLCAiXHUwMDAwIikpCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgKyBjaGFyc30pCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgc2NyaXB0RGF0YVN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICI8IjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YUxlc3NUaGFuU2lnblN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogIlx1RkZGRCJ9KQogICAgICAgIGVsaWYgZGF0YSA9PSBFT0Y6CiAgICAgICAgICAgICMgVG9rZW5pemF0aW9uIGVuZHMuCiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGNoYXJzID0gc2VsZi5zdHJlYW0uY2hhcnNVbnRpbCgoIjwiLCAiXHUwMDAwIikpCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgKyBjaGFyc30pCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgcGxhaW50ZXh0U3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gRU9GOgogICAgICAgICAgICAjIFRva2VuaXphdGlvbiBlbmRzLgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICBlbGlmIGRhdGEgPT0gIlx1MDAwMCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJpbnZhbGlkLWNvZGVwb2ludCJ9KQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiXHVGRkZEIn0pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSArIHNlbGYuc3RyZWFtLmNoYXJzVW50aWwoIlx1MDAwMCIpfSkKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiB0YWdPcGVuU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIiEiOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5tYXJrdXBEZWNsYXJhdGlvbk9wZW5TdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiLyI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmNsb3NlVGFnT3BlblN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGluIGFzY2lpTGV0dGVyczoKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW4gPSB7InR5cGUiOiB0b2tlblR5cGVzWyJTdGFydFRhZyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IGRhdGEsICJkYXRhIjogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZWxmQ2xvc2luZyI6IEZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VsZkNsb3NpbmdBY2tub3dsZWRnZWQiOiBGYWxzZX0KICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYudGFnTmFtZVN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICI+IjoKICAgICAgICAgICAgIyBYWFggSW4gdGhlb3J5IGl0IGNvdWxkIGJlIHNvbWV0aGluZyBiZXNpZGVzIGEgdGFnIG5hbWUuIEJ1dAogICAgICAgICAgICAjIGRvIHdlIHJlYWxseSBjYXJlPwogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQtdGFnLW5hbWUtYnV0LWdvdC1yaWdodC1icmFja2V0In0pCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6ICI8PiJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIj8iOgogICAgICAgICAgICAjIFhYWCBJbiB0aGVvcnkgaXQgY291bGQgYmUgc29tZXRoaW5nIGJlc2lkZXMgYSB0YWcgbmFtZS4gQnV0CiAgICAgICAgICAgICMgZG8gd2UgcmVhbGx5IGNhcmU/CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZC10YWctbmFtZS1idXQtZ290LXF1ZXN0aW9uLW1hcmsifSkKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYm9ndXNDb21tZW50U3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIFhYWAogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQtdGFnLW5hbWUifSkKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogIjwifSkKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgY2xvc2VUYWdPcGVuU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgaW4gYXNjaWlMZXR0ZXJzOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlbiA9IHsidHlwZSI6IHRva2VuVHlwZXNbIkVuZFRhZyJdLCAibmFtZSI6IGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogW10sICJzZWxmQ2xvc2luZyI6IEZhbHNlfQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi50YWdOYW1lU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIj4iOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQtY2xvc2luZy10YWctYnV0LWdvdC1yaWdodC1icmFja2V0In0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZC1jbG9zaW5nLXRhZy1idXQtZ290LWVvZiJ9KQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiAiPC8ifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBYWFggZGF0YSBjYW4gYmUgXydfLi4uCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZC1jbG9zaW5nLXRhZy1idXQtZ290LWNoYXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YXZhcnMiOiB7ImRhdGEiOiBkYXRhfX0pCiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmJvZ3VzQ29tbWVudFN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgdGFnTmFtZVN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhIGluIHNwYWNlQ2hhcmFjdGVyczoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYmVmb3JlQXR0cmlidXRlTmFtZVN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICI+IjoKICAgICAgICAgICAgc2VsZi5lbWl0Q3VycmVudFRva2VuKCkKICAgICAgICBlbGlmIGRhdGEgaXMgRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW9mLWluLXRhZy1uYW1lIn0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiLyI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNlbGZDbG9zaW5nU3RhcnRUYWdTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJuYW1lIl0gKz0gIlx1RkZGRCIKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsibmFtZSJdICs9IGRhdGEKICAgICAgICAgICAgIyAoRG9uJ3QgdXNlIGNoYXJzVW50aWwgaGVyZSwgYmVjYXVzZSB0YWcgbmFtZXMgYXJlCiAgICAgICAgICAgICMgdmVyeSBzaG9ydCBhbmQgaXQncyBmYXN0ZXIgdG8gbm90IGRvIGFueXRoaW5nIGZhbmN5KQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHJjZGF0YUxlc3NUaGFuU2lnblN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICIvIjoKICAgICAgICAgICAgc2VsZi50ZW1wb3JhcnlCdWZmZXIgPSAiIgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5yY2RhdGFFbmRUYWdPcGVuU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiAiPCJ9KQogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5yY2RhdGFTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHJjZGF0YUVuZFRhZ09wZW5TdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSBpbiBhc2NpaUxldHRlcnM6CiAgICAgICAgICAgIHNlbGYudGVtcG9yYXJ5QnVmZmVyICs9IGRhdGEKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYucmNkYXRhRW5kVGFnTmFtZVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogIjwvIn0pCiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnJjZGF0YVN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgcmNkYXRhRW5kVGFnTmFtZVN0YXRlKHNlbGYpOgogICAgICAgIGFwcHJvcHJpYXRlID0gc2VsZi5jdXJyZW50VG9rZW4gYW5kIHNlbGYuY3VycmVudFRva2VuWyJuYW1lIl0ubG93ZXIoKSA9PSBzZWxmLnRlbXBvcmFyeUJ1ZmZlci5sb3dlcigpCiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgaW4gc3BhY2VDaGFyYWN0ZXJzIGFuZCBhcHByb3ByaWF0ZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW4gPSB7InR5cGUiOiB0b2tlblR5cGVzWyJFbmRUYWciXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBzZWxmLnRlbXBvcmFyeUJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiBbXSwgInNlbGZDbG9zaW5nIjogRmFsc2V9CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmJlZm9yZUF0dHJpYnV0ZU5hbWVTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiLyIgYW5kIGFwcHJvcHJpYXRlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlbiA9IHsidHlwZSI6IHRva2VuVHlwZXNbIkVuZFRhZyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHNlbGYudGVtcG9yYXJ5QnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IFtdLCAic2VsZkNsb3NpbmciOiBGYWxzZX0KICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2VsZkNsb3NpbmdTdGFydFRhZ1N0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICI+IiBhbmQgYXBwcm9wcmlhdGU6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuID0geyJ0eXBlIjogdG9rZW5UeXBlc1siRW5kVGFnIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogc2VsZi50ZW1wb3JhcnlCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogW10sICJzZWxmQ2xvc2luZyI6IEZhbHNlfQogICAgICAgICAgICBzZWxmLmVtaXRDdXJyZW50VG9rZW4oKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaW4gYXNjaWlMZXR0ZXJzOgogICAgICAgICAgICBzZWxmLnRlbXBvcmFyeUJ1ZmZlciArPSBkYXRhCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogIjwvIiArIHNlbGYudGVtcG9yYXJ5QnVmZmVyfSkKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYucmNkYXRhU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiByYXd0ZXh0TGVzc1RoYW5TaWduU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIi8iOgogICAgICAgICAgICBzZWxmLnRlbXBvcmFyeUJ1ZmZlciA9ICIiCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnJhd3RleHRFbmRUYWdPcGVuU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiAiPCJ9KQogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5yYXd0ZXh0U3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiByYXd0ZXh0RW5kVGFnT3BlblN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhIGluIGFzY2lpTGV0dGVyczoKICAgICAgICAgICAgc2VsZi50ZW1wb3JhcnlCdWZmZXIgKz0gZGF0YQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5yYXd0ZXh0RW5kVGFnTmFtZVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogIjwvIn0pCiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnJhd3RleHRTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHJhd3RleHRFbmRUYWdOYW1lU3RhdGUoc2VsZik6CiAgICAgICAgYXBwcm9wcmlhdGUgPSBzZWxmLmN1cnJlbnRUb2tlbiBhbmQgc2VsZi5jdXJyZW50VG9rZW5bIm5hbWUiXS5sb3dlcigpID09IHNlbGYudGVtcG9yYXJ5QnVmZmVyLmxvd2VyKCkKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSBpbiBzcGFjZUNoYXJhY3RlcnMgYW5kIGFwcHJvcHJpYXRlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlbiA9IHsidHlwZSI6IHRva2VuVHlwZXNbIkVuZFRhZyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHNlbGYudGVtcG9yYXJ5QnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IFtdLCAic2VsZkNsb3NpbmciOiBGYWxzZX0KICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYmVmb3JlQXR0cmlidXRlTmFtZVN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICIvIiBhbmQgYXBwcm9wcmlhdGU6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuID0geyJ0eXBlIjogdG9rZW5UeXBlc1siRW5kVGFnIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogc2VsZi50ZW1wb3JhcnlCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogW10sICJzZWxmQ2xvc2luZyI6IEZhbHNlfQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zZWxmQ2xvc2luZ1N0YXJ0VGFnU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIj4iIGFuZCBhcHByb3ByaWF0ZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW4gPSB7InR5cGUiOiB0b2tlblR5cGVzWyJFbmRUYWciXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBzZWxmLnRlbXBvcmFyeUJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiBbXSwgInNlbGZDbG9zaW5nIjogRmFsc2V9CiAgICAgICAgICAgIHNlbGYuZW1pdEN1cnJlbnRUb2tlbigpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpbiBhc2NpaUxldHRlcnM6CiAgICAgICAgICAgIHNlbGYudGVtcG9yYXJ5QnVmZmVyICs9IGRhdGEKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiPC8iICsgc2VsZi50ZW1wb3JhcnlCdWZmZXJ9KQogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5yYXd0ZXh0U3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBzY3JpcHREYXRhTGVzc1RoYW5TaWduU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIi8iOgogICAgICAgICAgICBzZWxmLnRlbXBvcmFyeUJ1ZmZlciA9ICIiCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFFbmRUYWdPcGVuU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIiEiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiAiPCEifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YUVzY2FwZVN0YXJ0U3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiAiPCJ9KQogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBzY3JpcHREYXRhRW5kVGFnT3BlblN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhIGluIGFzY2lpTGV0dGVyczoKICAgICAgICAgICAgc2VsZi50ZW1wb3JhcnlCdWZmZXIgKz0gZGF0YQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRW5kVGFnTmFtZVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogIjwvIn0pCiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHNjcmlwdERhdGFFbmRUYWdOYW1lU3RhdGUoc2VsZik6CiAgICAgICAgYXBwcm9wcmlhdGUgPSBzZWxmLmN1cnJlbnRUb2tlbiBhbmQgc2VsZi5jdXJyZW50VG9rZW5bIm5hbWUiXS5sb3dlcigpID09IHNlbGYudGVtcG9yYXJ5QnVmZmVyLmxvd2VyKCkKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSBpbiBzcGFjZUNoYXJhY3RlcnMgYW5kIGFwcHJvcHJpYXRlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlbiA9IHsidHlwZSI6IHRva2VuVHlwZXNbIkVuZFRhZyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHNlbGYudGVtcG9yYXJ5QnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IFtdLCAic2VsZkNsb3NpbmciOiBGYWxzZX0KICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYmVmb3JlQXR0cmlidXRlTmFtZVN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICIvIiBhbmQgYXBwcm9wcmlhdGU6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuID0geyJ0eXBlIjogdG9rZW5UeXBlc1siRW5kVGFnIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogc2VsZi50ZW1wb3JhcnlCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogW10sICJzZWxmQ2xvc2luZyI6IEZhbHNlfQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zZWxmQ2xvc2luZ1N0YXJ0VGFnU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIj4iIGFuZCBhcHByb3ByaWF0ZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW4gPSB7InR5cGUiOiB0b2tlblR5cGVzWyJFbmRUYWciXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBzZWxmLnRlbXBvcmFyeUJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiBbXSwgInNlbGZDbG9zaW5nIjogRmFsc2V9CiAgICAgICAgICAgIHNlbGYuZW1pdEN1cnJlbnRUb2tlbigpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpbiBhc2NpaUxldHRlcnM6CiAgICAgICAgICAgIHNlbGYudGVtcG9yYXJ5QnVmZmVyICs9IGRhdGEKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiPC8iICsgc2VsZi50ZW1wb3JhcnlCdWZmZXJ9KQogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBzY3JpcHREYXRhRXNjYXBlU3RhcnRTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSAiLSI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6ICItIn0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFFc2NhcGVTdGFydERhc2hTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHNjcmlwdERhdGFFc2NhcGVTdGFydERhc2hTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSAiLSI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6ICItIn0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFFc2NhcGVkRGFzaERhc2hTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHNjcmlwdERhdGFFc2NhcGVkU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIi0iOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiAiLSJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRXNjYXBlZERhc2hTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiPCI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFFc2NhcGVkTGVzc1RoYW5TaWduU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIlx1MDAwMCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJpbnZhbGlkLWNvZGVwb2ludCJ9KQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiXHVGRkZEIn0pCiAgICAgICAgZWxpZiBkYXRhID09IEVPRjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgY2hhcnMgPSBzZWxmLnN0cmVhbS5jaGFyc1VudGlsKCgiPCIsICItIiwgIlx1MDAwMCIpKQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhICsgY2hhcnN9KQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHNjcmlwdERhdGFFc2NhcGVkRGFzaFN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICItIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogIi0ifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YUVzY2FwZWREYXNoRGFzaFN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICI8IjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YUVzY2FwZWRMZXNzVGhhblNpZ25TdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJcdUZGRkQifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YUVzY2FwZWRTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSBFT0Y6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6IGRhdGF9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRXNjYXBlZFN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgc2NyaXB0RGF0YUVzY2FwZWREYXNoRGFzaFN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICItIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogIi0ifSkKICAgICAgICBlbGlmIGRhdGEgPT0gIjwiOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRXNjYXBlZExlc3NUaGFuU2lnblN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICI+IjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogIj4ifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YVN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogIlx1RkZGRCJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRXNjYXBlZFN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09IEVPRjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogZGF0YX0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFFc2NhcGVkU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBzY3JpcHREYXRhRXNjYXBlZExlc3NUaGFuU2lnblN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICIvIjoKICAgICAgICAgICAgc2VsZi50ZW1wb3JhcnlCdWZmZXIgPSAiIgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRXNjYXBlZEVuZFRhZ09wZW5TdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpbiBhc2NpaUxldHRlcnM6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6ICI8IiArIGRhdGF9KQogICAgICAgICAgICBzZWxmLnRlbXBvcmFyeUJ1ZmZlciA9IGRhdGEKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YURvdWJsZUVzY2FwZVN0YXJ0U3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiAiPCJ9KQogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRXNjYXBlZFN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgc2NyaXB0RGF0YUVzY2FwZWRFbmRUYWdPcGVuU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgaW4gYXNjaWlMZXR0ZXJzOgogICAgICAgICAgICBzZWxmLnRlbXBvcmFyeUJ1ZmZlciA9IGRhdGEKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YUVzY2FwZWRFbmRUYWdOYW1lU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiAiPC8ifSkKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YUVzY2FwZWRTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHNjcmlwdERhdGFFc2NhcGVkRW5kVGFnTmFtZVN0YXRlKHNlbGYpOgogICAgICAgIGFwcHJvcHJpYXRlID0gc2VsZi5jdXJyZW50VG9rZW4gYW5kIHNlbGYuY3VycmVudFRva2VuWyJuYW1lIl0ubG93ZXIoKSA9PSBzZWxmLnRlbXBvcmFyeUJ1ZmZlci5sb3dlcigpCiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgaW4gc3BhY2VDaGFyYWN0ZXJzIGFuZCBhcHByb3ByaWF0ZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW4gPSB7InR5cGUiOiB0b2tlblR5cGVzWyJFbmRUYWciXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBzZWxmLnRlbXBvcmFyeUJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiBbXSwgInNlbGZDbG9zaW5nIjogRmFsc2V9CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmJlZm9yZUF0dHJpYnV0ZU5hbWVTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiLyIgYW5kIGFwcHJvcHJpYXRlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlbiA9IHsidHlwZSI6IHRva2VuVHlwZXNbIkVuZFRhZyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6IHNlbGYudGVtcG9yYXJ5QnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IFtdLCAic2VsZkNsb3NpbmciOiBGYWxzZX0KICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2VsZkNsb3NpbmdTdGFydFRhZ1N0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICI+IiBhbmQgYXBwcm9wcmlhdGU6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuID0geyJ0eXBlIjogdG9rZW5UeXBlc1siRW5kVGFnIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogc2VsZi50ZW1wb3JhcnlCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogW10sICJzZWxmQ2xvc2luZyI6IEZhbHNlfQogICAgICAgICAgICBzZWxmLmVtaXRDdXJyZW50VG9rZW4oKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaW4gYXNjaWlMZXR0ZXJzOgogICAgICAgICAgICBzZWxmLnRlbXBvcmFyeUJ1ZmZlciArPSBkYXRhCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogIjwvIiArIHNlbGYudGVtcG9yYXJ5QnVmZmVyfSkKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YUVzY2FwZWRTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHNjcmlwdERhdGFEb3VibGVFc2NhcGVTdGFydFN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhIGluIChzcGFjZUNoYXJhY3RlcnMgfCBmcm96ZW5zZXQoKCIvIiwgIj4iKSkpOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiBkYXRhfSkKICAgICAgICAgICAgaWYgc2VsZi50ZW1wb3JhcnlCdWZmZXIubG93ZXIoKSA9PSAic2NyaXB0IjoKICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFEb3VibGVFc2NhcGVkU3RhdGUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFFc2NhcGVkU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaW4gYXNjaWlMZXR0ZXJzOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiBkYXRhfSkKICAgICAgICAgICAgc2VsZi50ZW1wb3JhcnlCdWZmZXIgKz0gZGF0YQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFFc2NhcGVkU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBzY3JpcHREYXRhRG91YmxlRXNjYXBlZFN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICItIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogIi0ifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2NyaXB0RGF0YURvdWJsZUVzY2FwZWREYXNoU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIjwiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiAiPCJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRG91YmxlRXNjYXBlZExlc3NUaGFuU2lnblN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogIlx1RkZGRCJ9KQogICAgICAgIGVsaWYgZGF0YSA9PSBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlb2YtaW4tc2NyaXB0LWluLXNjcmlwdCJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiBkYXRhfSkKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBzY3JpcHREYXRhRG91YmxlRXNjYXBlZERhc2hTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSAiLSI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6ICItIn0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFEb3VibGVFc2NhcGVkRGFzaERhc2hTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiPCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6ICI8In0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFEb3VibGVFc2NhcGVkTGVzc1RoYW5TaWduU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIlx1MDAwMCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJpbnZhbGlkLWNvZGVwb2ludCJ9KQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiXHVGRkZEIn0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFEb3VibGVFc2NhcGVkU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW9mLWluLXNjcmlwdC1pbi1zY3JpcHQifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogZGF0YX0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFEb3VibGVFc2NhcGVkU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBzY3JpcHREYXRhRG91YmxlRXNjYXBlZERhc2hEYXNoU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIi0iOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiAiLSJ9KQogICAgICAgIGVsaWYgZGF0YSA9PSAiPCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLCAiZGF0YSI6ICI8In0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFEb3VibGVFc2NhcGVkTGVzc1RoYW5TaWduU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIj4iOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiAiPiJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIlx1MDAwMCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJpbnZhbGlkLWNvZGVwb2ludCJ9KQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiXHVGRkZEIn0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFEb3VibGVFc2NhcGVkU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW9mLWluLXNjcmlwdC1pbi1zY3JpcHQifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogZGF0YX0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFEb3VibGVFc2NhcGVkU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBzY3JpcHREYXRhRG91YmxlRXNjYXBlZExlc3NUaGFuU2lnblN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICIvIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogIi8ifSkKICAgICAgICAgICAgc2VsZi50ZW1wb3JhcnlCdWZmZXIgPSAiIgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRG91YmxlRXNjYXBlRW5kU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5zY3JpcHREYXRhRG91YmxlRXNjYXBlZFN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgc2NyaXB0RGF0YURvdWJsZUVzY2FwZUVuZFN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhIGluIChzcGFjZUNoYXJhY3RlcnMgfCBmcm96ZW5zZXQoKCIvIiwgIj4iKSkpOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiBkYXRhfSkKICAgICAgICAgICAgaWYgc2VsZi50ZW1wb3JhcnlCdWZmZXIubG93ZXIoKSA9PSAic2NyaXB0IjoKICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFFc2NhcGVkU3RhdGUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFEb3VibGVFc2NhcGVkU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaW4gYXNjaWlMZXR0ZXJzOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIkNoYXJhY3RlcnMiXSwgImRhdGEiOiBkYXRhfSkKICAgICAgICAgICAgc2VsZi50ZW1wb3JhcnlCdWZmZXIgKz0gZGF0YQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNjcmlwdERhdGFEb3VibGVFc2NhcGVkU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBiZWZvcmVBdHRyaWJ1dGVOYW1lU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgaW4gc3BhY2VDaGFyYWN0ZXJzOgogICAgICAgICAgICBzZWxmLnN0cmVhbS5jaGFyc1VudGlsKHNwYWNlQ2hhcmFjdGVycywgVHJ1ZSkKICAgICAgICBlbGlmIGRhdGEgaW4gYXNjaWlMZXR0ZXJzOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdLmFwcGVuZChbZGF0YSwgIiJdKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5hdHRyaWJ1dGVOYW1lU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIj4iOgogICAgICAgICAgICBzZWxmLmVtaXRDdXJyZW50VG9rZW4oKQogICAgICAgIGVsaWYgZGF0YSA9PSAiLyI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNlbGZDbG9zaW5nU3RhcnRUYWdTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpbiAoIiciLCAnIicsICI9IiwgIjwiKToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQtY2hhcmFjdGVyLWluLWF0dHJpYnV0ZS1uYW1lIn0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl0uYXBwZW5kKFtkYXRhLCAiIl0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmF0dHJpYnV0ZU5hbWVTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl0uYXBwZW5kKFsiXHVGRkZEIiwgIiJdKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5hdHRyaWJ1dGVOYW1lU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaXMgRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQtYXR0cmlidXRlLW5hbWUtYnV0LWdvdC1lb2YifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXS5hcHBlbmQoW2RhdGEsICIiXSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYXR0cmlidXRlTmFtZVN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgYXR0cmlidXRlTmFtZVN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBsZWF2aW5nVGhpc1N0YXRlID0gVHJ1ZQogICAgICAgIGVtaXRUb2tlbiA9IEZhbHNlCiAgICAgICAgaWYgZGF0YSA9PSAiPSI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmJlZm9yZUF0dHJpYnV0ZVZhbHVlU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaW4gYXNjaWlMZXR0ZXJzOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdWy0xXVswXSArPSBkYXRhICtcCiAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbS5jaGFyc1VudGlsKGFzY2lpTGV0dGVycywgVHJ1ZSkKICAgICAgICAgICAgbGVhdmluZ1RoaXNTdGF0ZSA9IEZhbHNlCiAgICAgICAgZWxpZiBkYXRhID09ICI+IjoKICAgICAgICAgICAgIyBYWFggSWYgd2UgZW1pdCBoZXJlIHRoZSBhdHRyaWJ1dGVzIGFyZSBjb252ZXJ0ZWQgdG8gYSBkaWN0CiAgICAgICAgICAgICMgd2l0aG91dCBiZWluZyBjaGVja2VkIGFuZCB3aGVuIHRoZSBjb2RlIGJlbG93IHJ1bnMgd2UgZXJyb3IKICAgICAgICAgICAgIyBiZWNhdXNlIGRhdGEgaXMgYSBkaWN0IG5vdCBhIGxpc3QKICAgICAgICAgICAgZW1pdFRva2VuID0gVHJ1ZQogICAgICAgIGVsaWYgZGF0YSBpbiBzcGFjZUNoYXJhY3RlcnM6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmFmdGVyQXR0cmlidXRlTmFtZVN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICIvIjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2VsZkNsb3NpbmdTdGFydFRhZ1N0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXVstMV1bMF0gKz0gIlx1RkZGRCIKICAgICAgICAgICAgbGVhdmluZ1RoaXNTdGF0ZSA9IEZhbHNlCiAgICAgICAgZWxpZiBkYXRhIGluICgiJyIsICciJywgIjwiKToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQtY2hhcmFjdGVyLWluLWF0dHJpYnV0ZS1uYW1lIn0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl1bLTFdWzBdICs9IGRhdGEKICAgICAgICAgICAgbGVhdmluZ1RoaXNTdGF0ZSA9IEZhbHNlCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImVvZi1pbi1hdHRyaWJ1dGUtbmFtZSJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdWy0xXVswXSArPSBkYXRhCiAgICAgICAgICAgIGxlYXZpbmdUaGlzU3RhdGUgPSBGYWxzZQoKICAgICAgICBpZiBsZWF2aW5nVGhpc1N0YXRlOgogICAgICAgICAgICAjIEF0dHJpYnV0ZXMgYXJlIG5vdCBkcm9wcGVkIGF0IHRoaXMgc3RhZ2UuIFRoYXQgaGFwcGVucyB3aGVuIHRoZQogICAgICAgICAgICAjIHN0YXJ0IHRhZyB0b2tlbiBpcyBlbWl0dGVkIHNvIHZhbHVlcyBjYW4gc3RpbGwgYmUgc2FmZWx5IGFwcGVuZGVkCiAgICAgICAgICAgICMgdG8gYXR0cmlidXRlcywgYnV0IHdlIGRvIHdhbnQgdG8gcmVwb3J0IHRoZSBwYXJzZSBlcnJvciBpbiB0aW1lLgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdWy0xXVswXSA9ICgKICAgICAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl1bLTFdWzBdLnRyYW5zbGF0ZShhc2NpaVVwcGVyMkxvd2VyKSkKICAgICAgICAgICAgZm9yIG5hbWUsIF8gaW4gc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXVs6LTFdOgogICAgICAgICAgICAgICAgaWYgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXVstMV1bMF0gPT0gbmFtZToKICAgICAgICAgICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkdXBsaWNhdGUtYXR0cmlidXRlIn0pCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgIyBYWFggRml4IGZvciBhYm92ZSBYWFgKICAgICAgICAgICAgaWYgZW1pdFRva2VuOgogICAgICAgICAgICAgICAgc2VsZi5lbWl0Q3VycmVudFRva2VuKCkKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBhZnRlckF0dHJpYnV0ZU5hbWVTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSBpbiBzcGFjZUNoYXJhY3RlcnM6CiAgICAgICAgICAgIHNlbGYuc3RyZWFtLmNoYXJzVW50aWwoc3BhY2VDaGFyYWN0ZXJzLCBUcnVlKQogICAgICAgIGVsaWYgZGF0YSA9PSAiPSI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmJlZm9yZUF0dHJpYnV0ZVZhbHVlU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIj4iOgogICAgICAgICAgICBzZWxmLmVtaXRDdXJyZW50VG9rZW4oKQogICAgICAgIGVsaWYgZGF0YSBpbiBhc2NpaUxldHRlcnM6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl0uYXBwZW5kKFtkYXRhLCAiIl0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmF0dHJpYnV0ZU5hbWVTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiLyI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnNlbGZDbG9zaW5nU3RhcnRUYWdTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl0uYXBwZW5kKFsiXHVGRkZEIiwgIiJdKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5hdHRyaWJ1dGVOYW1lU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaW4gKCInIiwgJyInLCAiPCIpOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZC1jaGFyYWN0ZXItYWZ0ZXItYXR0cmlidXRlLW5hbWUifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXS5hcHBlbmQoW2RhdGEsICIiXSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYXR0cmlidXRlTmFtZVN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkLWVuZC1vZi10YWctYnV0LWdvdC1lb2YifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXS5hcHBlbmQoW2RhdGEsICIiXSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYXR0cmlidXRlTmFtZVN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgYmVmb3JlQXR0cmlidXRlVmFsdWVTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSBpbiBzcGFjZUNoYXJhY3RlcnM6CiAgICAgICAgICAgIHNlbGYuc3RyZWFtLmNoYXJzVW50aWwoc3BhY2VDaGFyYWN0ZXJzLCBUcnVlKQogICAgICAgIGVsaWYgZGF0YSA9PSAiXCIiOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5hdHRyaWJ1dGVWYWx1ZURvdWJsZVF1b3RlZFN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICImIjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYXR0cmlidXRlVmFsdWVVblF1b3RlZFN0YXRlCiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgZWxpZiBkYXRhID09ICInIjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYXR0cmlidXRlVmFsdWVTaW5nbGVRdW90ZWRTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiPiI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZC1hdHRyaWJ1dGUtdmFsdWUtYnV0LWdvdC1yaWdodC1icmFja2V0In0pCiAgICAgICAgICAgIHNlbGYuZW1pdEN1cnJlbnRUb2tlbigpCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXVstMV1bMV0gKz0gIlx1RkZGRCIKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYXR0cmlidXRlVmFsdWVVblF1b3RlZFN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGluICgiPSIsICI8IiwgImAiKToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVxdWFscy1pbi11bnF1b3RlZC1hdHRyaWJ1dGUtdmFsdWUifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXVstMV1bMV0gKz0gZGF0YQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5hdHRyaWJ1dGVWYWx1ZVVuUXVvdGVkU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaXMgRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQtYXR0cmlidXRlLXZhbHVlLWJ1dC1nb3QtZW9mIn0pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl1bLTFdWzFdICs9IGRhdGEKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYXR0cmlidXRlVmFsdWVVblF1b3RlZFN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgYXR0cmlidXRlVmFsdWVEb3VibGVRdW90ZWRTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSAiXCIiOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5hZnRlckF0dHJpYnV0ZVZhbHVlU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIiYiOgogICAgICAgICAgICBzZWxmLnByb2Nlc3NFbnRpdHlJbkF0dHJpYnV0ZSgnIicpCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXVstMV1bMV0gKz0gIlx1RkZGRCIKICAgICAgICBlbGlmIGRhdGEgaXMgRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW9mLWluLWF0dHJpYnV0ZS12YWx1ZS1kb3VibGUtcXVvdGUifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXVstMV1bMV0gKz0gZGF0YSArXAogICAgICAgICAgICAgICAgc2VsZi5zdHJlYW0uY2hhcnNVbnRpbCgoIlwiIiwgIiYiLCAiXHUwMDAwIikpCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgYXR0cmlidXRlVmFsdWVTaW5nbGVRdW90ZWRTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSAiJyI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmFmdGVyQXR0cmlidXRlVmFsdWVTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiJiI6CiAgICAgICAgICAgIHNlbGYucHJvY2Vzc0VudGl0eUluQXR0cmlidXRlKCInIikKICAgICAgICBlbGlmIGRhdGEgPT0gIlx1MDAwMCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJpbnZhbGlkLWNvZGVwb2ludCJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdWy0xXVsxXSArPSAiXHVGRkZEIgogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlb2YtaW4tYXR0cmlidXRlLXZhbHVlLXNpbmdsZS1xdW90ZSJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdWy0xXVsxXSArPSBkYXRhICtcCiAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbS5jaGFyc1VudGlsKCgiJyIsICImIiwgIlx1MDAwMCIpKQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGF0dHJpYnV0ZVZhbHVlVW5RdW90ZWRTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSBpbiBzcGFjZUNoYXJhY3RlcnM6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmJlZm9yZUF0dHJpYnV0ZU5hbWVTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiJiI6CiAgICAgICAgICAgIHNlbGYucHJvY2Vzc0VudGl0eUluQXR0cmlidXRlKCI+IikKICAgICAgICBlbGlmIGRhdGEgPT0gIj4iOgogICAgICAgICAgICBzZWxmLmVtaXRDdXJyZW50VG9rZW4oKQogICAgICAgIGVsaWYgZGF0YSBpbiAoJyInLCAiJyIsICI9IiwgIjwiLCAiYCIpOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZC1jaGFyYWN0ZXItaW4tdW5xdW90ZWQtYXR0cmlidXRlLXZhbHVlIn0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl1bLTFdWzFdICs9IGRhdGEKICAgICAgICBlbGlmIGRhdGEgPT0gIlx1MDAwMCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJpbnZhbGlkLWNvZGVwb2ludCJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdWy0xXVsxXSArPSAiXHVGRkZEIgogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlb2YtaW4tYXR0cmlidXRlLXZhbHVlLW5vLXF1b3RlcyJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdWy0xXVsxXSArPSBkYXRhICsgc2VsZi5zdHJlYW0uY2hhcnNVbnRpbCgKICAgICAgICAgICAgICAgIGZyb3plbnNldCgoIiYiLCAiPiIsICciJywgIiciLCAiPSIsICI8IiwgImAiLCAiXHUwMDAwIikpIHwgc3BhY2VDaGFyYWN0ZXJzKQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGFmdGVyQXR0cmlidXRlVmFsdWVTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSBpbiBzcGFjZUNoYXJhY3RlcnM6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmJlZm9yZUF0dHJpYnV0ZU5hbWVTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiPiI6CiAgICAgICAgICAgIHNlbGYuZW1pdEN1cnJlbnRUb2tlbigpCiAgICAgICAgZWxpZiBkYXRhID09ICIvIjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuc2VsZkNsb3NpbmdTdGFydFRhZ1N0YXRlCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQtRU9GLWFmdGVyLWF0dHJpYnV0ZS12YWx1ZSJ9KQogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZC1jaGFyYWN0ZXItYWZ0ZXItYXR0cmlidXRlLXZhbHVlIn0pCiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGRhdGEpCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmJlZm9yZUF0dHJpYnV0ZU5hbWVTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHNlbGZDbG9zaW5nU3RhcnRUYWdTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSAiPiI6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJzZWxmQ2xvc2luZyJdID0gVHJ1ZQogICAgICAgICAgICBzZWxmLmVtaXRDdXJyZW50VG9rZW4oKQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkLUVPRi1hZnRlci1zb2xpZHVzLWluLXRhZyJ9KQogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZC1jaGFyYWN0ZXItYWZ0ZXItc29saWR1cy1pbi10YWcifSkKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYmVmb3JlQXR0cmlidXRlTmFtZVN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgYm9ndXNDb21tZW50U3RhdGUoc2VsZik6CiAgICAgICAgIyBNYWtlIGEgbmV3IGNvbW1lbnQgdG9rZW4gYW5kIGdpdmUgaXQgYXMgdmFsdWUgYWxsIHRoZSBjaGFyYWN0ZXJzCiAgICAgICAgIyB1bnRpbCB0aGUgZmlyc3QgPiBvciBFT0YgKGNoYXJzVW50aWwgY2hlY2tzIGZvciBFT0YgYXV0b21hdGljYWxseSkKICAgICAgICAjIGFuZCBlbWl0IGl0LgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyc1VudGlsKCI+IikKICAgICAgICBkYXRhID0gZGF0YS5yZXBsYWNlKCJcdTAwMDAiLCAiXHVGRkZEIikKICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKAogICAgICAgICAgICB7InR5cGUiOiB0b2tlblR5cGVzWyJDb21tZW50Il0sICJkYXRhIjogZGF0YX0pCgogICAgICAgICMgRWF0IHRoZSBjaGFyYWN0ZXIgZGlyZWN0bHkgYWZ0ZXIgdGhlIGJvZ3VzIGNvbW1lbnQgd2hpY2ggaXMgZWl0aGVyIGEKICAgICAgICAjICI+IiBvciBhbiBFT0YuCiAgICAgICAgc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgbWFya3VwRGVjbGFyYXRpb25PcGVuU3RhdGUoc2VsZik6CiAgICAgICAgY2hhclN0YWNrID0gW3NlbGYuc3RyZWFtLmNoYXIoKV0KICAgICAgICBpZiBjaGFyU3RhY2tbLTFdID09ICItIjoKICAgICAgICAgICAgY2hhclN0YWNrLmFwcGVuZChzZWxmLnN0cmVhbS5jaGFyKCkpCiAgICAgICAgICAgIGlmIGNoYXJTdGFja1stMV0gPT0gIi0iOgogICAgICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW4gPSB7InR5cGUiOiB0b2tlblR5cGVzWyJDb21tZW50Il0sICJkYXRhIjogIiJ9CiAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5jb21tZW50U3RhcnRTdGF0ZQogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBlbGlmIGNoYXJTdGFja1stMV0gaW4gKCdkJywgJ0QnKToKICAgICAgICAgICAgbWF0Y2hlZCA9IFRydWUKICAgICAgICAgICAgZm9yIGV4cGVjdGVkIGluICgoJ28nLCAnTycpLCAoJ2MnLCAnQycpLCAoJ3QnLCAnVCcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgneScsICdZJyksICgncCcsICdQJyksICgnZScsICdFJykpOgogICAgICAgICAgICAgICAgY2hhclN0YWNrLmFwcGVuZChzZWxmLnN0cmVhbS5jaGFyKCkpCiAgICAgICAgICAgICAgICBpZiBjaGFyU3RhY2tbLTFdIG5vdCBpbiBleHBlY3RlZDoKICAgICAgICAgICAgICAgICAgICBtYXRjaGVkID0gRmFsc2UKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBpZiBtYXRjaGVkOgogICAgICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW4gPSB7InR5cGUiOiB0b2tlblR5cGVzWyJEb2N0eXBlIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB1YmxpY0lkIjogTm9uZSwgInN5c3RlbUlkIjogTm9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb3JyZWN0IjogVHJ1ZX0KICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRvY3R5cGVTdGF0ZQogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBlbGlmIChjaGFyU3RhY2tbLTFdID09ICJbIiBhbmQKICAgICAgICAgICAgICBzZWxmLnBhcnNlciBpcyBub3QgTm9uZSBhbmQKICAgICAgICAgICAgICBzZWxmLnBhcnNlci50cmVlLm9wZW5FbGVtZW50cyBhbmQKICAgICAgICAgICAgICBzZWxmLnBhcnNlci50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZXNwYWNlICE9IHNlbGYucGFyc2VyLnRyZWUuZGVmYXVsdE5hbWVzcGFjZSk6CiAgICAgICAgICAgIG1hdGNoZWQgPSBUcnVlCiAgICAgICAgICAgIGZvciBleHBlY3RlZCBpbiBbIkMiLCAiRCIsICJBIiwgIlQiLCAiQSIsICJbIl06CiAgICAgICAgICAgICAgICBjaGFyU3RhY2suYXBwZW5kKHNlbGYuc3RyZWFtLmNoYXIoKSkKICAgICAgICAgICAgICAgIGlmIGNoYXJTdGFja1stMV0gIT0gZXhwZWN0ZWQ6CiAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZCA9IEZhbHNlCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgaWYgbWF0Y2hlZDoKICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmNkYXRhU2VjdGlvblN0YXRlCiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZC1kYXNoZXMtb3ItZG9jdHlwZSJ9KQoKICAgICAgICB3aGlsZSBjaGFyU3RhY2s6CiAgICAgICAgICAgIHNlbGYuc3RyZWFtLnVuZ2V0KGNoYXJTdGFjay5wb3AoKSkKICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5ib2d1c0NvbW1lbnRTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGNvbW1lbnRTdGFydFN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICItIjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuY29tbWVudFN0YXJ0RGFzaFN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXSArPSAiXHVGRkZEIgogICAgICAgIGVsaWYgZGF0YSA9PSAiPiI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmNvcnJlY3QtY29tbWVudCJ9KQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaXMgRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW9mLWluLWNvbW1lbnQifSkKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXSArPSBkYXRhCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmNvbW1lbnRTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGNvbW1lbnRTdGFydERhc2hTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSAiLSI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmNvbW1lbnRFbmRTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl0gKz0gIi1cdUZGRkQiCiAgICAgICAgZWxpZiBkYXRhID09ICI+IjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluY29ycmVjdC1jb21tZW50In0pCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlb2YtaW4tY29tbWVudCJ9KQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdICs9ICItIiArIGRhdGEKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuY29tbWVudFN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgY29tbWVudFN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICItIjoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuY29tbWVudEVuZERhc2hTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl0gKz0gIlx1RkZGRCIKICAgICAgICBlbGlmIGRhdGEgaXMgRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiZW9mLWluLWNvbW1lbnQifSkKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXSArPSBkYXRhICsgXAogICAgICAgICAgICAgICAgc2VsZi5zdHJlYW0uY2hhcnNVbnRpbCgoIi0iLCAiXHUwMDAwIikpCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgY29tbWVudEVuZERhc2hTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSAiLSI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmNvbW1lbnRFbmRTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl0gKz0gIi1cdUZGRkQiCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmNvbW1lbnRTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlb2YtaW4tY29tbWVudC1lbmQtZGFzaCJ9KQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiZGF0YSJdICs9ICItIiArIGRhdGEKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuY29tbWVudFN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgY29tbWVudEVuZFN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICI+IjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXSArPSAiLS1cdUZGRkQiCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmNvbW1lbnRTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiISI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkLWJhbmctYWZ0ZXItZG91YmxlLWRhc2gtaW4tY29tbWVudCJ9KQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5jb21tZW50RW5kQmFuZ1N0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICItIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQtZGFzaC1hZnRlci1kb3VibGUtZGFzaC1pbi1jb21tZW50In0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJkYXRhIl0gKz0gZGF0YQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlb2YtaW4tY29tbWVudC1kb3VibGUtZGFzaCJ9KQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIFhYWAogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZC1jaGFyLWluLWNvbW1lbnQifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXSArPSAiLS0iICsgZGF0YQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5jb21tZW50U3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBjb21tZW50RW5kQmFuZ1N0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICI+IjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICItIjoKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXSArPSAiLS0hIgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5jb21tZW50RW5kRGFzaFN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICJcdTAwMDAiOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiAiaW52YWxpZC1jb2RlcG9pbnQifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXSArPSAiLS0hXHVGRkZEIgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5jb21tZW50U3RhdGUKICAgICAgICBlbGlmIGRhdGEgaXMgRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW9mLWluLWNvbW1lbnQtZW5kLWJhbmctc3RhdGUifSkKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImRhdGEiXSArPSAiLS0hIiArIGRhdGEKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuY29tbWVudFN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgZG9jdHlwZVN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhIGluIHNwYWNlQ2hhcmFjdGVyczoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYmVmb3JlRG9jdHlwZU5hbWVTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZC1kb2N0eXBlLW5hbWUtYnV0LWdvdC1lb2YifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImNvcnJlY3QiXSA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZWVkLXNwYWNlLWFmdGVyLWRvY3R5cGUifSkKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYmVmb3JlRG9jdHlwZU5hbWVTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGJlZm9yZURvY3R5cGVOYW1lU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgaW4gc3BhY2VDaGFyYWN0ZXJzOgogICAgICAgICAgICBwYXNzCiAgICAgICAgZWxpZiBkYXRhID09ICI+IjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkLWRvY3R5cGUtbmFtZS1idXQtZ290LXJpZ2h0LWJyYWNrZXQifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImNvcnJlY3QiXSA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJuYW1lIl0gPSAiXHVGRkZEIgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kb2N0eXBlTmFtZVN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkLWRvY3R5cGUtbmFtZS1idXQtZ290LWVvZiJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiY29ycmVjdCJdID0gRmFsc2UKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bIm5hbWUiXSA9IGRhdGEKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZG9jdHlwZU5hbWVTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGRvY3R5cGVOYW1lU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgaW4gc3BhY2VDaGFyYWN0ZXJzOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsibmFtZSJdID0gc2VsZi5jdXJyZW50VG9rZW5bIm5hbWUiXS50cmFuc2xhdGUoYXNjaWlVcHBlcjJMb3dlcikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYWZ0ZXJEb2N0eXBlTmFtZVN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICI+IjoKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bIm5hbWUiXSA9IHNlbGYuY3VycmVudFRva2VuWyJuYW1lIl0udHJhbnNsYXRlKGFzY2lpVXBwZXIyTG93ZXIpCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJuYW1lIl0gKz0gIlx1RkZGRCIKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZG9jdHlwZU5hbWVTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlb2YtaW4tZG9jdHlwZS1uYW1lIn0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJjb3JyZWN0Il0gPSBGYWxzZQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsibmFtZSJdID0gc2VsZi5jdXJyZW50VG9rZW5bIm5hbWUiXS50cmFuc2xhdGUoYXNjaWlVcHBlcjJMb3dlcikKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bIm5hbWUiXSArPSBkYXRhCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgYWZ0ZXJEb2N0eXBlTmFtZVN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhIGluIHNwYWNlQ2hhcmFjdGVyczoKICAgICAgICAgICAgcGFzcwogICAgICAgIGVsaWYgZGF0YSA9PSAiPiI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJjb3JyZWN0Il0gPSBGYWxzZQogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW9mLWluLWRvY3R5cGUifSkKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgZGF0YSBpbiAoInAiLCAiUCIpOgogICAgICAgICAgICAgICAgbWF0Y2hlZCA9IFRydWUKICAgICAgICAgICAgICAgIGZvciBleHBlY3RlZCBpbiAoKCJ1IiwgIlUiKSwgKCJiIiwgIkIiKSwgKCJsIiwgIkwiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJpIiwgIkkiKSwgKCJjIiwgIkMiKSk6CiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgICAgICAgICAgICAgIGlmIGRhdGEgbm90IGluIGV4cGVjdGVkOgogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVkID0gRmFsc2UKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIGlmIG1hdGNoZWQ6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYWZ0ZXJEb2N0eXBlUHVibGljS2V5d29yZFN0YXRlCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICAgICAgZWxpZiBkYXRhIGluICgicyIsICJTIik6CiAgICAgICAgICAgICAgICBtYXRjaGVkID0gVHJ1ZQogICAgICAgICAgICAgICAgZm9yIGV4cGVjdGVkIGluICgoInkiLCAiWSIpLCAoInMiLCAiUyIpLCAoInQiLCAiVCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImUiLCAiRSIpLCAoIm0iLCAiTSIpKToKICAgICAgICAgICAgICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgICAgICAgICAgICAgaWYgZGF0YSBub3QgaW4gZXhwZWN0ZWQ6CiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWQgPSBGYWxzZQogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgaWYgbWF0Y2hlZDoKICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5hZnRlckRvY3R5cGVTeXN0ZW1LZXl3b3JkU3RhdGUKICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICAgICAgIyBBbGwgdGhlIGNoYXJhY3RlcnMgcmVhZCBiZWZvcmUgdGhlIGN1cnJlbnQgJ2RhdGEnIHdpbGwgYmUKICAgICAgICAgICAgIyBbYS16QS1aXSwgc28gdGhleSdyZSBnYXJiYWdlIGluIHRoZSBib2d1cyBkb2N0eXBlIGFuZCBjYW4gYmUKICAgICAgICAgICAgIyBkaXNjYXJkZWQ7IG9ubHkgdGhlIGxhdGVzdCBjaGFyYWN0ZXIgbWlnaHQgYmUgJz4nIG9yIEVPRgogICAgICAgICAgICAjIGFuZCBuZWVkcyB0byBiZSB1bmdldHRlZAogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQtc3BhY2Utb3ItcmlnaHQtYnJhY2tldC1pbi1kb2N0eXBlIiwgImRhdGF2YXJzIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJkYXRhIjogZGF0YX19KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiY29ycmVjdCJdID0gRmFsc2UKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYm9ndXNEb2N0eXBlU3RhdGUKCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgYWZ0ZXJEb2N0eXBlUHVibGljS2V5d29yZFN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhIGluIHNwYWNlQ2hhcmFjdGVyczoKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYmVmb3JlRG9jdHlwZVB1YmxpY0lkZW50aWZpZXJTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpbiAoIiciLCAnIicpOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZC1jaGFyLWluLWRvY3R5cGUifSkKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYmVmb3JlRG9jdHlwZVB1YmxpY0lkZW50aWZpZXJTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlb2YtaW4tZG9jdHlwZSJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiY29ycmVjdCJdID0gRmFsc2UKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYmVmb3JlRG9jdHlwZVB1YmxpY0lkZW50aWZpZXJTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGJlZm9yZURvY3R5cGVQdWJsaWNJZGVudGlmaWVyU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgaW4gc3BhY2VDaGFyYWN0ZXJzOgogICAgICAgICAgICBwYXNzCiAgICAgICAgZWxpZiBkYXRhID09ICJcIiI6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJwdWJsaWNJZCJdID0gIiIKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZG9jdHlwZVB1YmxpY0lkZW50aWZpZXJEb3VibGVRdW90ZWRTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiJyI6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJwdWJsaWNJZCJdID0gIiIKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZG9jdHlwZVB1YmxpY0lkZW50aWZpZXJTaW5nbGVRdW90ZWRTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiPiI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkLWVuZC1vZi1kb2N0eXBlIn0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJjb3JyZWN0Il0gPSBGYWxzZQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaXMgRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW9mLWluLWRvY3R5cGUifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImNvcnJlY3QiXSA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkLWNoYXItaW4tZG9jdHlwZSJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiY29ycmVjdCJdID0gRmFsc2UKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYm9ndXNEb2N0eXBlU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBkb2N0eXBlUHVibGljSWRlbnRpZmllckRvdWJsZVF1b3RlZFN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICJcIiI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmFmdGVyRG9jdHlwZVB1YmxpY0lkZW50aWZpZXJTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJwdWJsaWNJZCJdICs9ICJcdUZGRkQiCiAgICAgICAgZWxpZiBkYXRhID09ICI+IjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQtZW5kLW9mLWRvY3R5cGUifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImNvcnJlY3QiXSA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlb2YtaW4tZG9jdHlwZSJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiY29ycmVjdCJdID0gRmFsc2UKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bInB1YmxpY0lkIl0gKz0gZGF0YQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGRvY3R5cGVQdWJsaWNJZGVudGlmaWVyU2luZ2xlUXVvdGVkU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIiciOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5hZnRlckRvY3R5cGVQdWJsaWNJZGVudGlmaWVyU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIlx1MDAwMCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJpbnZhbGlkLWNvZGVwb2ludCJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsicHVibGljSWQiXSArPSAiXHVGRkZEIgogICAgICAgIGVsaWYgZGF0YSA9PSAiPiI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkLWVuZC1vZi1kb2N0eXBlIn0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJjb3JyZWN0Il0gPSBGYWxzZQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaXMgRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW9mLWluLWRvY3R5cGUifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImNvcnJlY3QiXSA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJwdWJsaWNJZCJdICs9IGRhdGEKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBhZnRlckRvY3R5cGVQdWJsaWNJZGVudGlmaWVyU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgaW4gc3BhY2VDaGFyYWN0ZXJzOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5iZXR3ZWVuRG9jdHlwZVB1YmxpY0FuZFN5c3RlbUlkZW50aWZpZXJzU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIj4iOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gJyInOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZC1jaGFyLWluLWRvY3R5cGUifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bInN5c3RlbUlkIl0gPSAiIgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kb2N0eXBlU3lzdGVtSWRlbnRpZmllckRvdWJsZVF1b3RlZFN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICInIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQtY2hhci1pbi1kb2N0eXBlIn0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJzeXN0ZW1JZCJdID0gIiIKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZG9jdHlwZVN5c3RlbUlkZW50aWZpZXJTaW5nbGVRdW90ZWRTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlb2YtaW4tZG9jdHlwZSJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiY29ycmVjdCJdID0gRmFsc2UKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQtY2hhci1pbi1kb2N0eXBlIn0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJjb3JyZWN0Il0gPSBGYWxzZQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5ib2d1c0RvY3R5cGVTdGF0ZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGJldHdlZW5Eb2N0eXBlUHVibGljQW5kU3lzdGVtSWRlbnRpZmllcnNTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSBpbiBzcGFjZUNoYXJhY3RlcnM6CiAgICAgICAgICAgIHBhc3MKICAgICAgICBlbGlmIGRhdGEgPT0gIj4iOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gJyInOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsic3lzdGVtSWQiXSA9ICIiCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRvY3R5cGVTeXN0ZW1JZGVudGlmaWVyRG91YmxlUXVvdGVkU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIiciOgogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsic3lzdGVtSWQiXSA9ICIiCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRvY3R5cGVTeXN0ZW1JZGVudGlmaWVyU2luZ2xlUXVvdGVkU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW9mLWluLWRvY3R5cGUifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImNvcnJlY3QiXSA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkLWNoYXItaW4tZG9jdHlwZSJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiY29ycmVjdCJdID0gRmFsc2UKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYm9ndXNEb2N0eXBlU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBhZnRlckRvY3R5cGVTeXN0ZW1LZXl3b3JkU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgaW4gc3BhY2VDaGFyYWN0ZXJzOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5iZWZvcmVEb2N0eXBlU3lzdGVtSWRlbnRpZmllclN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGluICgiJyIsICciJyk6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkLWNoYXItaW4tZG9jdHlwZSJ9KQogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5iZWZvcmVEb2N0eXBlU3lzdGVtSWRlbnRpZmllclN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVvZi1pbi1kb2N0eXBlIn0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJjb3JyZWN0Il0gPSBGYWxzZQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnN0cmVhbS51bmdldChkYXRhKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5iZWZvcmVEb2N0eXBlU3lzdGVtSWRlbnRpZmllclN0YXRlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgYmVmb3JlRG9jdHlwZVN5c3RlbUlkZW50aWZpZXJTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSBpbiBzcGFjZUNoYXJhY3RlcnM6CiAgICAgICAgICAgIHBhc3MKICAgICAgICBlbGlmIGRhdGEgPT0gIlwiIjoKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bInN5c3RlbUlkIl0gPSAiIgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kb2N0eXBlU3lzdGVtSWRlbnRpZmllckRvdWJsZVF1b3RlZFN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICInIjoKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bInN5c3RlbUlkIl0gPSAiIgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kb2N0eXBlU3lzdGVtSWRlbnRpZmllclNpbmdsZVF1b3RlZFN0YXRlCiAgICAgICAgZWxpZiBkYXRhID09ICI+IjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQtY2hhci1pbi1kb2N0eXBlIn0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJjb3JyZWN0Il0gPSBGYWxzZQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaXMgRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW9mLWluLWRvY3R5cGUifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImNvcnJlY3QiXSA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkLWNoYXItaW4tZG9jdHlwZSJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiY29ycmVjdCJdID0gRmFsc2UKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYm9ndXNEb2N0eXBlU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBkb2N0eXBlU3lzdGVtSWRlbnRpZmllckRvdWJsZVF1b3RlZFN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5jaGFyKCkKICAgICAgICBpZiBkYXRhID09ICJcIiI6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmFmdGVyRG9jdHlwZVN5c3RlbUlkZW50aWZpZXJTdGF0ZQogICAgICAgIGVsaWYgZGF0YSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJzeXN0ZW1JZCJdICs9ICJcdUZGRkQiCiAgICAgICAgZWxpZiBkYXRhID09ICI+IjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQtZW5kLW9mLWRvY3R5cGUifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImNvcnJlY3QiXSA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlb2YtaW4tZG9jdHlwZSJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsiY29ycmVjdCJdID0gRmFsc2UKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bInN5c3RlbUlkIl0gKz0gZGF0YQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGRvY3R5cGVTeXN0ZW1JZGVudGlmaWVyU2luZ2xlUXVvdGVkU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgPT0gIiciOgogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5hZnRlckRvY3R5cGVTeXN0ZW1JZGVudGlmaWVyU3RhdGUKICAgICAgICBlbGlmIGRhdGEgPT0gIlx1MDAwMCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6ICJpbnZhbGlkLWNvZGVwb2ludCJ9KQogICAgICAgICAgICBzZWxmLmN1cnJlbnRUb2tlblsic3lzdGVtSWQiXSArPSAiXHVGRkZEIgogICAgICAgIGVsaWYgZGF0YSA9PSAiPiI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siUGFyc2VFcnJvciJdLCAiZGF0YSI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkLWVuZC1vZi1kb2N0eXBlIn0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJjb3JyZWN0Il0gPSBGYWxzZQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbGlmIGRhdGEgaXMgRU9GOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW9mLWluLWRvY3R5cGUifSkKICAgICAgICAgICAgc2VsZi5jdXJyZW50VG9rZW5bImNvcnJlY3QiXSA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJzeXN0ZW1JZCJdICs9IGRhdGEKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBhZnRlckRvY3R5cGVTeXN0ZW1JZGVudGlmaWVyU3RhdGUoc2VsZik6CiAgICAgICAgZGF0YSA9IHNlbGYuc3RyZWFtLmNoYXIoKQogICAgICAgIGlmIGRhdGEgaW4gc3BhY2VDaGFyYWN0ZXJzOgogICAgICAgICAgICBwYXNzCiAgICAgICAgZWxpZiBkYXRhID09ICI+IjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxpZiBkYXRhIGlzIEVPRjoKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZCh7InR5cGUiOiB0b2tlblR5cGVzWyJQYXJzZUVycm9yIl0sICJkYXRhIjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVvZi1pbi1kb2N0eXBlIn0pCiAgICAgICAgICAgIHNlbGYuY3VycmVudFRva2VuWyJjb3JyZWN0Il0gPSBGYWxzZQogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHNlbGYuY3VycmVudFRva2VuKQogICAgICAgICAgICBzZWxmLnN0YXRlID0gc2VsZi5kYXRhU3RhdGUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwgImRhdGEiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZC1jaGFyLWluLWRvY3R5cGUifSkKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuYm9ndXNEb2N0eXBlU3RhdGUKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBib2d1c0RvY3R5cGVTdGF0ZShzZWxmKToKICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgaWYgZGF0YSA9PSAiPiI6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoc2VsZi5jdXJyZW50VG9rZW4pCiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIGVsaWYgZGF0YSBpcyBFT0Y6CiAgICAgICAgICAgICMgWFhYIEVNSVQKICAgICAgICAgICAgc2VsZi5zdHJlYW0udW5nZXQoZGF0YSkKICAgICAgICAgICAgc2VsZi50b2tlblF1ZXVlLmFwcGVuZChzZWxmLmN1cnJlbnRUb2tlbikKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IHNlbGYuZGF0YVN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcGFzcwogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGNkYXRhU2VjdGlvblN0YXRlKHNlbGYpOgogICAgICAgIGRhdGEgPSBbXQogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIGRhdGEuYXBwZW5kKHNlbGYuc3RyZWFtLmNoYXJzVW50aWwoIl0iKSkKICAgICAgICAgICAgZGF0YS5hcHBlbmQoc2VsZi5zdHJlYW0uY2hhcnNVbnRpbCgiPiIpKQogICAgICAgICAgICBjaGFyID0gc2VsZi5zdHJlYW0uY2hhcigpCiAgICAgICAgICAgIGlmIGNoYXIgPT0gRU9GOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGFzc2VydCBjaGFyID09ICI+IgogICAgICAgICAgICAgICAgaWYgZGF0YVstMV1bLTI6XSA9PSAiXV0iOgogICAgICAgICAgICAgICAgICAgIGRhdGFbLTFdID0gZGF0YVstMV1bOi0yXQogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGRhdGEuYXBwZW5kKGNoYXIpCgogICAgICAgIGRhdGEgPSAiIi5qb2luKGRhdGEpICAjIHB5bGludDpkaXNhYmxlPXJlZGVmaW5lZC12YXJpYWJsZS10eXBlCiAgICAgICAgIyBEZWFsIHdpdGggbnVsbCBoZXJlIHJhdGhlciB0aGFuIGluIHRoZSBwYXJzZXIKICAgICAgICBudWxsQ291bnQgPSBkYXRhLmNvdW50KCJcdTAwMDAiKQogICAgICAgIGlmIG51bGxDb3VudCA+IDA6CiAgICAgICAgICAgIGZvciBfIGluIHJhbmdlKG51bGxDb3VudCk6CiAgICAgICAgICAgICAgICBzZWxmLnRva2VuUXVldWUuYXBwZW5kKHsidHlwZSI6IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogImludmFsaWQtY29kZXBvaW50In0pCiAgICAgICAgICAgIGRhdGEgPSBkYXRhLnJlcGxhY2UoIlx1MDAwMCIsICJcdUZGRkQiKQogICAgICAgIGlmIGRhdGE6CiAgICAgICAgICAgIHNlbGYudG9rZW5RdWV1ZS5hcHBlbmQoeyJ0eXBlIjogdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IGRhdGF9KQogICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLmRhdGFTdGF0ZQogICAgICAgIHJldHVybiBUcnVlClBLAwQUAAAAAAAAACEA79OvDyEBAAAhAQAANgAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9fdHJpZS9fX2luaXRfXy5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwoKZnJvbSAucHkgaW1wb3J0IFRyaWUgYXMgUHlUcmllCgpUcmllID0gUHlUcmllCgojIHB5bGludDpkaXNhYmxlPXdyb25nLWltcG9ydC1wb3NpdGlvbgp0cnk6CiAgICBmcm9tIC5kYXRyaWUgaW1wb3J0IFRyaWUgYXMgREFUcmllCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIHBhc3MKZWxzZToKICAgIFRyaWUgPSBEQVRyaWUKIyBweWxpbnQ6ZW5hYmxlPXdyb25nLWltcG9ydC1wb3NpdGlvbgpQSwMEFAAAAAAAAAAhAMyVPpbTAwAA0wMAADMAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvX3RyaWUvX2Jhc2UucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKCmZyb20gY29sbGVjdGlvbnMgaW1wb3J0IE1hcHBpbmcKCgpjbGFzcyBUcmllKE1hcHBpbmcpOgogICAgIiIiQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgdHJpZXMiIiIKCiAgICBkZWYga2V5cyhzZWxmLCBwcmVmaXg9Tm9uZSk6CiAgICAgICAgIyBweWxpbnQ6ZGlzYWJsZT1hcmd1bWVudHMtZGlmZmVyCiAgICAgICAga2V5cyA9IHN1cGVyKFRyaWUsIHNlbGYpLmtleXMoKQoKICAgICAgICBpZiBwcmVmaXggaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIHNldChrZXlzKQoKICAgICAgICAjIFB5dGhvbiAyLjY6IG5vIHNldCBjb21wcmVoZW5zaW9ucwogICAgICAgIHJldHVybiBzZXQoW3ggZm9yIHggaW4ga2V5cyBpZiB4LnN0YXJ0c3dpdGgocHJlZml4KV0pCgogICAgZGVmIGhhc19rZXlzX3dpdGhfcHJlZml4KHNlbGYsIHByZWZpeCk6CiAgICAgICAgZm9yIGtleSBpbiBzZWxmLmtleXMoKToKICAgICAgICAgICAgaWYga2V5LnN0YXJ0c3dpdGgocHJlZml4KToKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBsb25nZXN0X3ByZWZpeChzZWxmLCBwcmVmaXgpOgogICAgICAgIGlmIHByZWZpeCBpbiBzZWxmOgogICAgICAgICAgICByZXR1cm4gcHJlZml4CgogICAgICAgIGZvciBpIGluIHJhbmdlKDEsIGxlbihwcmVmaXgpICsgMSk6CiAgICAgICAgICAgIGlmIHByZWZpeFs6LWldIGluIHNlbGY6CiAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4WzotaV0KCiAgICAgICAgcmFpc2UgS2V5RXJyb3IocHJlZml4KQoKICAgIGRlZiBsb25nZXN0X3ByZWZpeF9pdGVtKHNlbGYsIHByZWZpeCk6CiAgICAgICAgbHByZWZpeCA9IHNlbGYubG9uZ2VzdF9wcmVmaXgocHJlZml4KQogICAgICAgIHJldHVybiAobHByZWZpeCwgc2VsZltscHJlZml4XSkKUEsDBBQAAAAAAAAAIQAkVZ2pmgQAAJoEAAA0AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL190cmllL2RhdHJpZS5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwoKZnJvbSBkYXRyaWUgaW1wb3J0IFRyaWUgYXMgREFUcmllCmZyb20gcGlwLl92ZW5kb3Iuc2l4IGltcG9ydCB0ZXh0X3R5cGUKCmZyb20gLl9iYXNlIGltcG9ydCBUcmllIGFzIEFCQ1RyaWUKCgpjbGFzcyBUcmllKEFCQ1RyaWUpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGRhdGEpOgogICAgICAgIGNoYXJzID0gc2V0KCkKICAgICAgICBmb3Iga2V5IGluIGRhdGEua2V5cygpOgogICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShrZXksIHRleHRfdHlwZSk6CiAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIkFsbCBrZXlzIG11c3QgYmUgc3RyaW5ncyIpCiAgICAgICAgICAgIGZvciBjaGFyIGluIGtleToKICAgICAgICAgICAgICAgIGNoYXJzLmFkZChjaGFyKQoKICAgICAgICBzZWxmLl9kYXRhID0gREFUcmllKCIiLmpvaW4oY2hhcnMpKQogICAgICAgIGZvciBrZXksIHZhbHVlIGluIGRhdGEuaXRlbXMoKToKICAgICAgICAgICAgc2VsZi5fZGF0YVtrZXldID0gdmFsdWUKCiAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGtleSk6CiAgICAgICAgcmV0dXJuIGtleSBpbiBzZWxmLl9kYXRhCgogICAgZGVmIF9fbGVuX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGxlbihzZWxmLl9kYXRhKQoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCkKCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKICAgICAgICByZXR1cm4gc2VsZi5fZGF0YVtrZXldCgogICAgZGVmIGtleXMoc2VsZiwgcHJlZml4PU5vbmUpOgogICAgICAgIHJldHVybiBzZWxmLl9kYXRhLmtleXMocHJlZml4KQoKICAgIGRlZiBoYXNfa2V5c193aXRoX3ByZWZpeChzZWxmLCBwcmVmaXgpOgogICAgICAgIHJldHVybiBzZWxmLl9kYXRhLmhhc19rZXlzX3dpdGhfcHJlZml4KHByZWZpeCkKCiAgICBkZWYgbG9uZ2VzdF9wcmVmaXgoc2VsZiwgcHJlZml4KToKICAgICAgICByZXR1cm4gc2VsZi5fZGF0YS5sb25nZXN0X3ByZWZpeChwcmVmaXgpCgogICAgZGVmIGxvbmdlc3RfcHJlZml4X2l0ZW0oc2VsZiwgcHJlZml4KToKICAgICAgICByZXR1cm4gc2VsZi5fZGF0YS5sb25nZXN0X3ByZWZpeF9pdGVtKHByZWZpeCkKUEsDBBQAAAAAAAAAIQBLT27O7wYAAO8GAAAwAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL190cmllL3B5LnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCmZyb20gcGlwLl92ZW5kb3Iuc2l4IGltcG9ydCB0ZXh0X3R5cGUKCmZyb20gYmlzZWN0IGltcG9ydCBiaXNlY3RfbGVmdAoKZnJvbSAuX2Jhc2UgaW1wb3J0IFRyaWUgYXMgQUJDVHJpZQoKCmNsYXNzIFRyaWUoQUJDVHJpZSk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgZGF0YSk6CiAgICAgICAgaWYgbm90IGFsbChpc2luc3RhbmNlKHgsIHRleHRfdHlwZSkgZm9yIHggaW4gZGF0YS5rZXlzKCkpOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIkFsbCBrZXlzIG11c3QgYmUgc3RyaW5ncyIpCgogICAgICAgIHNlbGYuX2RhdGEgPSBkYXRhCiAgICAgICAgc2VsZi5fa2V5cyA9IHNvcnRlZChkYXRhLmtleXMoKSkKICAgICAgICBzZWxmLl9jYWNoZXN0ciA9ICIiCiAgICAgICAgc2VsZi5fY2FjaGVwb2ludHMgPSAoMCwgbGVuKGRhdGEpKQoKICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwga2V5KToKICAgICAgICByZXR1cm4ga2V5IGluIHNlbGYuX2RhdGEKCiAgICBkZWYgX19sZW5fXyhzZWxmKToKICAgICAgICByZXR1cm4gbGVuKHNlbGYuX2RhdGEpCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBpdGVyKHNlbGYuX2RhdGEpCgogICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CiAgICAgICAgcmV0dXJuIHNlbGYuX2RhdGFba2V5XQoKICAgIGRlZiBrZXlzKHNlbGYsIHByZWZpeD1Ob25lKToKICAgICAgICBpZiBwcmVmaXggaXMgTm9uZSBvciBwcmVmaXggPT0gIiIgb3Igbm90IHNlbGYuX2tleXM6CiAgICAgICAgICAgIHJldHVybiBzZXQoc2VsZi5fa2V5cykKCiAgICAgICAgaWYgcHJlZml4LnN0YXJ0c3dpdGgoc2VsZi5fY2FjaGVzdHIpOgogICAgICAgICAgICBsbywgaGkgPSBzZWxmLl9jYWNoZXBvaW50cwogICAgICAgICAgICBzdGFydCA9IGkgPSBiaXNlY3RfbGVmdChzZWxmLl9rZXlzLCBwcmVmaXgsIGxvLCBoaSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzdGFydCA9IGkgPSBiaXNlY3RfbGVmdChzZWxmLl9rZXlzLCBwcmVmaXgpCgogICAgICAgIGtleXMgPSBzZXQoKQogICAgICAgIGlmIHN0YXJ0ID09IGxlbihzZWxmLl9rZXlzKToKICAgICAgICAgICAgcmV0dXJuIGtleXMKCiAgICAgICAgd2hpbGUgc2VsZi5fa2V5c1tpXS5zdGFydHN3aXRoKHByZWZpeCk6CiAgICAgICAgICAgIGtleXMuYWRkKHNlbGYuX2tleXNbaV0pCiAgICAgICAgICAgIGkgKz0gMQoKICAgICAgICBzZWxmLl9jYWNoZXN0ciA9IHByZWZpeAogICAgICAgIHNlbGYuX2NhY2hlcG9pbnRzID0gKHN0YXJ0LCBpKQoKICAgICAgICByZXR1cm4ga2V5cwoKICAgIGRlZiBoYXNfa2V5c193aXRoX3ByZWZpeChzZWxmLCBwcmVmaXgpOgogICAgICAgIGlmIHByZWZpeCBpbiBzZWxmLl9kYXRhOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICBpZiBwcmVmaXguc3RhcnRzd2l0aChzZWxmLl9jYWNoZXN0cik6CiAgICAgICAgICAgIGxvLCBoaSA9IHNlbGYuX2NhY2hlcG9pbnRzCiAgICAgICAgICAgIGkgPSBiaXNlY3RfbGVmdChzZWxmLl9rZXlzLCBwcmVmaXgsIGxvLCBoaSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBpID0gYmlzZWN0X2xlZnQoc2VsZi5fa2V5cywgcHJlZml4KQoKICAgICAgICBpZiBpID09IGxlbihzZWxmLl9rZXlzKToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIHJldHVybiBzZWxmLl9rZXlzW2ldLnN0YXJ0c3dpdGgocHJlZml4KQpQSwMEFAAAAAAAAAAhACbjrlgAEAAAABAAAC4AAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvX3V0aWxzLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCgppbXBvcnQgc3lzCmZyb20gdHlwZXMgaW1wb3J0IE1vZHVsZVR5cGUKCmZyb20gcGlwLl92ZW5kb3Iuc2l4IGltcG9ydCB0ZXh0X3R5cGUKCnRyeToKICAgIGltcG9ydCB4bWwuZXRyZWUuY0VsZW1lbnRUcmVlIGFzIGRlZmF1bHRfZXRyZWUKZXhjZXB0IEltcG9ydEVycm9yOgogICAgaW1wb3J0IHhtbC5ldHJlZS5FbGVtZW50VHJlZSBhcyBkZWZhdWx0X2V0cmVlCgoKX19hbGxfXyA9IFsiZGVmYXVsdF9ldHJlZSIsICJNZXRob2REaXNwYXRjaGVyIiwgImlzU3Vycm9nYXRlUGFpciIsCiAgICAgICAgICAgInN1cnJvZ2F0ZVBhaXJUb0NvZGVwb2ludCIsICJtb2R1bGVGYWN0b3J5RmFjdG9yeSIsCiAgICAgICAgICAgInN1cHBvcnRzX2xvbmVfc3Vycm9nYXRlcyIsICJQWTI3Il0KCgpQWTI3ID0gc3lzLnZlcnNpb25faW5mb1swXSA9PSAyIGFuZCBzeXMudmVyc2lvbl9pbmZvWzFdID49IDcKCiMgUGxhdGZvcm1zIG5vdCBzdXBwb3J0aW5nIGxvbmUgc3Vycm9nYXRlcyAoXHVEODAwLVx1REZGRikgc2hvdWxkIGJlCiMgY2F1Z2h0IGJ5IHRoZSBiZWxvdyB0ZXN0LiBJbiBnZW5lcmFsIHRoaXMgd291bGQgYmUgYW55IHBsYXRmb3JtCiMgdXNpbmcgVVRGLTE2IGFzIGl0cyBlbmNvZGluZyBvZiB1bmljb2RlIHN0cmluZ3MsIHN1Y2ggYXMKIyBKeXRob24uIFRoaXMgaXMgYmVjYXVzZSBVVEYtMTYgaXRzZWxmIGlzIGJhc2VkIG9uIHRoZSB1c2Ugb2Ygc3VjaAojIHN1cnJvZ2F0ZXMsIGFuZCB0aGVyZSBpcyBubyBtZWNoYW5pc20gdG8gZnVydGhlciBlc2NhcGUgc3VjaAojIGVzY2FwZXMuCnRyeToKICAgIF94ID0gZXZhbCgnIlxcdUQ4MDAiJykgICMgcHlsaW50OmRpc2FibGU9ZXZhbC11c2VkCiAgICBpZiBub3QgaXNpbnN0YW5jZShfeCwgdGV4dF90eXBlKToKICAgICAgICAjIFdlIG5lZWQgdGhpcyB3aXRoIHUiIiBiZWNhdXNlIG9mIGh0dHA6Ly9idWdzLmp5dGhvbi5vcmcvaXNzdWUyMDM5CiAgICAgICAgX3ggPSBldmFsKCd1IlxcdUQ4MDAiJykgICMgcHlsaW50OmRpc2FibGU9ZXZhbC11c2VkCiAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoX3gsIHRleHRfdHlwZSkKZXhjZXB0OiAgIyBweWxpbnQ6ZGlzYWJsZT1iYXJlLWV4Y2VwdAogICAgc3VwcG9ydHNfbG9uZV9zdXJyb2dhdGVzID0gRmFsc2UKZWxzZToKICAgIHN1cHBvcnRzX2xvbmVfc3Vycm9nYXRlcyA9IFRydWUKCgpjbGFzcyBNZXRob2REaXNwYXRjaGVyKGRpY3QpOgogICAgIiIiRGljdCB3aXRoIDIgc3BlY2lhbCBwcm9wZXJ0aWVzOgoKICAgIE9uIGluaXRpYXRpb24sIGtleXMgdGhhdCBhcmUgbGlzdHMsIHNldHMgb3IgdHVwbGVzIGFyZSBjb252ZXJ0ZWQgdG8KICAgIG11bHRpcGxlIGtleXMgc28gYWNjZXNzaW5nIGFueSBvbmUgb2YgdGhlIGl0ZW1zIGluIHRoZSBvcmlnaW5hbAogICAgbGlzdC1saWtlIG9iamVjdCByZXR1cm5zIHRoZSBtYXRjaGluZyB2YWx1ZQoKICAgIG1kID0gTWV0aG9kRGlzcGF0Y2hlcih7KCJmb28iLCAiYmFyIik6ImJheiJ9KQogICAgbWRbImZvbyJdID09ICJiYXoiCgogICAgQSBkZWZhdWx0IHZhbHVlIHdoaWNoIGNhbiBiZSBzZXQgdGhyb3VnaCB0aGUgZGVmYXVsdCBhdHRyaWJ1dGUuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgaXRlbXM9KCkpOgogICAgICAgICMgVXNpbmcgX2RpY3RFbnRyaWVzIGluc3RlYWQgb2YgZGlyZWN0bHkgYXNzaWduaW5nIHRvIHNlbGYgaXMgYWJvdXQKICAgICAgICAjIHR3aWNlIGFzIGZhc3QuIFBsZWFzZSBkbyBjYXJlZnVsIHBlcmZvcm1hbmNlIHRlc3RpbmcgYmVmb3JlIGNoYW5naW5nCiAgICAgICAgIyBhbnl0aGluZyBoZXJlLgogICAgICAgIF9kaWN0RW50cmllcyA9IFtdCiAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIGl0ZW1zOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKG5hbWUsIChsaXN0LCB0dXBsZSwgZnJvemVuc2V0LCBzZXQpKToKICAgICAgICAgICAgICAgIGZvciBpdGVtIGluIG5hbWU6CiAgICAgICAgICAgICAgICAgICAgX2RpY3RFbnRyaWVzLmFwcGVuZCgoaXRlbSwgdmFsdWUpKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgX2RpY3RFbnRyaWVzLmFwcGVuZCgobmFtZSwgdmFsdWUpKQogICAgICAgIGRpY3QuX19pbml0X18oc2VsZiwgX2RpY3RFbnRyaWVzKQogICAgICAgIGFzc2VydCBsZW4oc2VsZikgPT0gbGVuKF9kaWN0RW50cmllcykKICAgICAgICBzZWxmLmRlZmF1bHQgPSBOb25lCgogICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CiAgICAgICAgcmV0dXJuIGRpY3QuZ2V0KHNlbGYsIGtleSwgc2VsZi5kZWZhdWx0KQoKCiMgU29tZSB1dGlsaXR5IGZ1bmN0aW9ucyB0byBkZWFsIHdpdGggd2VpcmRuZXNzIGFyb3VuZCBVQ1MyIHZzIFVDUzQKIyBweXRob24gYnVpbGRzCgpkZWYgaXNTdXJyb2dhdGVQYWlyKGRhdGEpOgogICAgcmV0dXJuIChsZW4oZGF0YSkgPT0gMiBhbmQKICAgICAgICAgICAgb3JkKGRhdGFbMF0pID49IDB4RDgwMCBhbmQgb3JkKGRhdGFbMF0pIDw9IDB4REJGRiBhbmQKICAgICAgICAgICAgb3JkKGRhdGFbMV0pID49IDB4REMwMCBhbmQgb3JkKGRhdGFbMV0pIDw9IDB4REZGRikKCgpkZWYgc3Vycm9nYXRlUGFpclRvQ29kZXBvaW50KGRhdGEpOgogICAgY2hhcl92YWwgPSAoMHgxMDAwMCArIChvcmQoZGF0YVswXSkgLSAweEQ4MDApICogMHg0MDAgKwogICAgICAgICAgICAgICAgKG9yZChkYXRhWzFdKSAtIDB4REMwMCkpCiAgICByZXR1cm4gY2hhcl92YWwKCiMgTW9kdWxlIEZhY3RvcnkgRmFjdG9yeSAobm8sIHRoaXMgaXNuJ3QgSmF2YSwgSSBrbm93KQojIEhlcmUgdG8gc3RvcCB0aGlzIGJlaW5nIGR1cGxpY2F0ZWQgYWxsIG92ZXIgdGhlIHBsYWNlLgoKCmRlZiBtb2R1bGVGYWN0b3J5RmFjdG9yeShmYWN0b3J5KToKICAgIG1vZHVsZUNhY2hlID0ge30KCiAgICBkZWYgbW9kdWxlRmFjdG9yeShiYXNlTW9kdWxlLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgIGlmIGlzaW5zdGFuY2UoTW9kdWxlVHlwZS5fX25hbWVfXywgdHlwZSgiIikpOgogICAgICAgICAgICBuYW1lID0gIl8lc19mYWN0b3J5IiAlIGJhc2VNb2R1bGUuX19uYW1lX18KICAgICAgICBlbHNlOgogICAgICAgICAgICBuYW1lID0gYiJfJXNfZmFjdG9yeSIgJSBiYXNlTW9kdWxlLl9fbmFtZV9fCgogICAgICAgIGt3YXJnc190dXBsZSA9IHR1cGxlKGt3YXJncy5pdGVtcygpKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBtb2R1bGVDYWNoZVtuYW1lXVthcmdzXVtrd2FyZ3NfdHVwbGVdCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICBtb2QgPSBNb2R1bGVUeXBlKG5hbWUpCiAgICAgICAgICAgIG9ianMgPSBmYWN0b3J5KGJhc2VNb2R1bGUsICphcmdzLCAqKmt3YXJncykKICAgICAgICAgICAgbW9kLl9fZGljdF9fLnVwZGF0ZShvYmpzKQogICAgICAgICAgICBpZiAibmFtZSIgbm90IGluIG1vZHVsZUNhY2hlOgogICAgICAgICAgICAgICAgbW9kdWxlQ2FjaGVbbmFtZV0gPSB7fQogICAgICAgICAgICBpZiAiYXJncyIgbm90IGluIG1vZHVsZUNhY2hlW25hbWVdOgogICAgICAgICAgICAgICAgbW9kdWxlQ2FjaGVbbmFtZV1bYXJnc10gPSB7fQogICAgICAgICAgICBpZiAia3dhcmdzIiBub3QgaW4gbW9kdWxlQ2FjaGVbbmFtZV1bYXJnc106CiAgICAgICAgICAgICAgICBtb2R1bGVDYWNoZVtuYW1lXVthcmdzXVtrd2FyZ3NfdHVwbGVdID0ge30KICAgICAgICAgICAgbW9kdWxlQ2FjaGVbbmFtZV1bYXJnc11ba3dhcmdzX3R1cGxlXSA9IG1vZAogICAgICAgICAgICByZXR1cm4gbW9kCgogICAgcmV0dXJuIG1vZHVsZUZhY3RvcnkKCgpkZWYgbWVtb2l6ZShmdW5jKToKICAgIGNhY2hlID0ge30KCiAgICBkZWYgd3JhcHBlZCgqYXJncywgKiprd2FyZ3MpOgogICAgICAgIGtleSA9ICh0dXBsZShhcmdzKSwgdHVwbGUoa3dhcmdzLml0ZW1zKCkpKQogICAgICAgIGlmIGtleSBub3QgaW4gY2FjaGU6CiAgICAgICAgICAgIGNhY2hlW2tleV0gPSBmdW5jKCphcmdzLCAqKmt3YXJncykKICAgICAgICByZXR1cm4gY2FjaGVba2V5XQoKICAgIHJldHVybiB3cmFwcGVkClBLAwQUAAAAAAAAACEAyKR9/rtFAQC7RQEAMQAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9jb25zdGFudHMucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKCmltcG9ydCBzdHJpbmcKCkVPRiA9IE5vbmUKCkUgPSB7CiAgICAibnVsbC1jaGFyYWN0ZXIiOgogICAgICAgICJOdWxsIGNoYXJhY3RlciBpbiBpbnB1dCBzdHJlYW0sIHJlcGxhY2VkIHdpdGggVStGRkZELiIsCiAgICAiaW52YWxpZC1jb2RlcG9pbnQiOgogICAgICAgICJJbnZhbGlkIGNvZGVwb2ludCBpbiBzdHJlYW0uIiwKICAgICJpbmNvcnJlY3RseS1wbGFjZWQtc29saWR1cyI6CiAgICAgICAgIlNvbGlkdXMgKC8pIGluY29ycmVjdGx5IHBsYWNlZCBpbiB0YWcuIiwKICAgICJpbmNvcnJlY3QtY3ItbmV3bGluZS1lbnRpdHkiOgogICAgICAgICJJbmNvcnJlY3QgQ1IgbmV3bGluZSBlbnRpdHksIHJlcGxhY2VkIHdpdGggTEYuIiwKICAgICJpbGxlZ2FsLXdpbmRvd3MtMTI1Mi1lbnRpdHkiOgogICAgICAgICJFbnRpdHkgdXNlZCB3aXRoIGlsbGVnYWwgbnVtYmVyICh3aW5kb3dzLTEyNTIgcmVmZXJlbmNlKS4iLAogICAgImNhbnQtY29udmVydC1udW1lcmljLWVudGl0eSI6CiAgICAgICAgIk51bWVyaWMgZW50aXR5IGNvdWxkbid0IGJlIGNvbnZlcnRlZCB0byBjaGFyYWN0ZXIgIgogICAgICAgICIoY29kZXBvaW50IFUrJShjaGFyQXNJbnQpMDh4KS4iLAogICAgImlsbGVnYWwtY29kZXBvaW50LWZvci1udW1lcmljLWVudGl0eSI6CiAgICAgICAgIk51bWVyaWMgZW50aXR5IHJlcHJlc2VudHMgYW4gaWxsZWdhbCBjb2RlcG9pbnQ6ICIKICAgICAgICAiVSslKGNoYXJBc0ludCkwOHguIiwKICAgICJudW1lcmljLWVudGl0eS13aXRob3V0LXNlbWljb2xvbiI6CiAgICAgICAgIk51bWVyaWMgZW50aXR5IGRpZG4ndCBlbmQgd2l0aCAnOycuIiwKICAgICJleHBlY3RlZC1udW1lcmljLWVudGl0eS1idXQtZ290LWVvZiI6CiAgICAgICAgIk51bWVyaWMgZW50aXR5IGV4cGVjdGVkLiBHb3QgZW5kIG9mIGZpbGUgaW5zdGVhZC4iLAogICAgImV4cGVjdGVkLW51bWVyaWMtZW50aXR5IjoKICAgICAgICAiTnVtZXJpYyBlbnRpdHkgZXhwZWN0ZWQgYnV0IG5vbmUgZm91bmQuIiwKICAgICJuYW1lZC1lbnRpdHktd2l0aG91dC1zZW1pY29sb24iOgogICAgICAgICJOYW1lZCBlbnRpdHkgZGlkbid0IGVuZCB3aXRoICc7Jy4iLAogICAgImV4cGVjdGVkLW5hbWVkLWVudGl0eSI6CiAgICAgICAgIk5hbWVkIGVudGl0eSBleHBlY3RlZC4gR290IG5vbmUuIiwKICAgICJhdHRyaWJ1dGVzLWluLWVuZC10YWciOgogICAgICAgICJFbmQgdGFnIGNvbnRhaW5zIHVuZXhwZWN0ZWQgYXR0cmlidXRlcy4iLAogICAgJ3NlbGYtY2xvc2luZy1mbGFnLW9uLWVuZC10YWcnOgogICAgICAgICJFbmQgdGFnIGNvbnRhaW5zIHVuZXhwZWN0ZWQgc2VsZi1jbG9zaW5nIGZsYWcuIiwKICAgICJleHBlY3RlZC10YWctbmFtZS1idXQtZ290LXJpZ2h0LWJyYWNrZXQiOgogICAgICAgICJFeHBlY3RlZCB0YWcgbmFtZS4gR290ICc+JyBpbnN0ZWFkLiIsCiAgICAiZXhwZWN0ZWQtdGFnLW5hbWUtYnV0LWdvdC1xdWVzdGlvbi1tYXJrIjoKICAgICAgICAiRXhwZWN0ZWQgdGFnIG5hbWUuIEdvdCAnPycgaW5zdGVhZC4gKEhUTUwgZG9lc24ndCAiCiAgICAgICAgInN1cHBvcnQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMuKSIsCiAgICAiZXhwZWN0ZWQtdGFnLW5hbWUiOgogICAgICAgICJFeHBlY3RlZCB0YWcgbmFtZS4gR290IHNvbWV0aGluZyBlbHNlIGluc3RlYWQiLAogICAgImV4cGVjdGVkLWNsb3NpbmctdGFnLWJ1dC1nb3QtcmlnaHQtYnJhY2tldCI6CiAgICAgICAgIkV4cGVjdGVkIGNsb3NpbmcgdGFnLiBHb3QgJz4nIGluc3RlYWQuIElnbm9yaW5nICc8Lz4nLiIsCiAgICAiZXhwZWN0ZWQtY2xvc2luZy10YWctYnV0LWdvdC1lb2YiOgogICAgICAgICJFeHBlY3RlZCBjbG9zaW5nIHRhZy4gVW5leHBlY3RlZCBlbmQgb2YgZmlsZS4iLAogICAgImV4cGVjdGVkLWNsb3NpbmctdGFnLWJ1dC1nb3QtY2hhciI6CiAgICAgICAgIkV4cGVjdGVkIGNsb3NpbmcgdGFnLiBVbmV4cGVjdGVkIGNoYXJhY3RlciAnJShkYXRhKXMnIGZvdW5kLiIsCiAgICAiZW9mLWluLXRhZy1uYW1lIjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgb2YgZmlsZSBpbiB0aGUgdGFnIG5hbWUuIiwKICAgICJleHBlY3RlZC1hdHRyaWJ1dGUtbmFtZS1idXQtZ290LWVvZiI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUuIEV4cGVjdGVkIGF0dHJpYnV0ZSBuYW1lIGluc3RlYWQuIiwKICAgICJlb2YtaW4tYXR0cmlidXRlLW5hbWUiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlIGluIGF0dHJpYnV0ZSBuYW1lLiIsCiAgICAiaW52YWxpZC1jaGFyYWN0ZXItaW4tYXR0cmlidXRlLW5hbWUiOgogICAgICAgICJJbnZhbGlkIGNoYXJhY3RlciBpbiBhdHRyaWJ1dGUgbmFtZSIsCiAgICAiZHVwbGljYXRlLWF0dHJpYnV0ZSI6CiAgICAgICAgIkRyb3BwZWQgZHVwbGljYXRlIGF0dHJpYnV0ZSBvbiB0YWcuIiwKICAgICJleHBlY3RlZC1lbmQtb2YtdGFnLW5hbWUtYnV0LWdvdC1lb2YiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlLiBFeHBlY3RlZCA9IG9yIGVuZCBvZiB0YWcuIiwKICAgICJleHBlY3RlZC1hdHRyaWJ1dGUtdmFsdWUtYnV0LWdvdC1lb2YiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlLiBFeHBlY3RlZCBhdHRyaWJ1dGUgdmFsdWUuIiwKICAgICJleHBlY3RlZC1hdHRyaWJ1dGUtdmFsdWUtYnV0LWdvdC1yaWdodC1icmFja2V0IjoKICAgICAgICAiRXhwZWN0ZWQgYXR0cmlidXRlIHZhbHVlLiBHb3QgJz4nIGluc3RlYWQuIiwKICAgICdlcXVhbHMtaW4tdW5xdW90ZWQtYXR0cmlidXRlLXZhbHVlJzoKICAgICAgICAiVW5leHBlY3RlZCA9IGluIHVucXVvdGVkIGF0dHJpYnV0ZSIsCiAgICAndW5leHBlY3RlZC1jaGFyYWN0ZXItaW4tdW5xdW90ZWQtYXR0cmlidXRlLXZhbHVlJzoKICAgICAgICAiVW5leHBlY3RlZCBjaGFyYWN0ZXIgaW4gdW5xdW90ZWQgYXR0cmlidXRlIiwKICAgICJpbnZhbGlkLWNoYXJhY3Rlci1hZnRlci1hdHRyaWJ1dGUtbmFtZSI6CiAgICAgICAgIlVuZXhwZWN0ZWQgY2hhcmFjdGVyIGFmdGVyIGF0dHJpYnV0ZSBuYW1lLiIsCiAgICAidW5leHBlY3RlZC1jaGFyYWN0ZXItYWZ0ZXItYXR0cmlidXRlLXZhbHVlIjoKICAgICAgICAiVW5leHBlY3RlZCBjaGFyYWN0ZXIgYWZ0ZXIgYXR0cmlidXRlIHZhbHVlLiIsCiAgICAiZW9mLWluLWF0dHJpYnV0ZS12YWx1ZS1kb3VibGUtcXVvdGUiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlIGluIGF0dHJpYnV0ZSB2YWx1ZSAoXCIpLiIsCiAgICAiZW9mLWluLWF0dHJpYnV0ZS12YWx1ZS1zaW5nbGUtcXVvdGUiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlIGluIGF0dHJpYnV0ZSB2YWx1ZSAoJykuIiwKICAgICJlb2YtaW4tYXR0cmlidXRlLXZhbHVlLW5vLXF1b3RlcyI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUgaW4gYXR0cmlidXRlIHZhbHVlLiIsCiAgICAidW5leHBlY3RlZC1FT0YtYWZ0ZXItc29saWR1cy1pbi10YWciOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlIGluIHRhZy4gRXhwZWN0ZWQgPiIsCiAgICAidW5leHBlY3RlZC1jaGFyYWN0ZXItYWZ0ZXItc29saWR1cy1pbi10YWciOgogICAgICAgICJVbmV4cGVjdGVkIGNoYXJhY3RlciBhZnRlciAvIGluIHRhZy4gRXhwZWN0ZWQgPiIsCiAgICAiZXhwZWN0ZWQtZGFzaGVzLW9yLWRvY3R5cGUiOgogICAgICAgICJFeHBlY3RlZCAnLS0nIG9yICdET0NUWVBFJy4gTm90IGZvdW5kLiIsCiAgICAidW5leHBlY3RlZC1iYW5nLWFmdGVyLWRvdWJsZS1kYXNoLWluLWNvbW1lbnQiOgogICAgICAgICJVbmV4cGVjdGVkICEgYWZ0ZXIgLS0gaW4gY29tbWVudCIsCiAgICAidW5leHBlY3RlZC1zcGFjZS1hZnRlci1kb3VibGUtZGFzaC1pbi1jb21tZW50IjoKICAgICAgICAiVW5leHBlY3RlZCBzcGFjZSBhZnRlciAtLSBpbiBjb21tZW50IiwKICAgICJpbmNvcnJlY3QtY29tbWVudCI6CiAgICAgICAgIkluY29ycmVjdCBjb21tZW50LiIsCiAgICAiZW9mLWluLWNvbW1lbnQiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlIGluIGNvbW1lbnQuIiwKICAgICJlb2YtaW4tY29tbWVudC1lbmQtZGFzaCI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUgaW4gY29tbWVudCAoLSkiLAogICAgInVuZXhwZWN0ZWQtZGFzaC1hZnRlci1kb3VibGUtZGFzaC1pbi1jb21tZW50IjoKICAgICAgICAiVW5leHBlY3RlZCAnLScgYWZ0ZXIgJy0tJyBmb3VuZCBpbiBjb21tZW50LiIsCiAgICAiZW9mLWluLWNvbW1lbnQtZG91YmxlLWRhc2giOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlIGluIGNvbW1lbnQgKC0tKS4iLAogICAgImVvZi1pbi1jb21tZW50LWVuZC1zcGFjZS1zdGF0ZSI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUgaW4gY29tbWVudC4iLAogICAgImVvZi1pbi1jb21tZW50LWVuZC1iYW5nLXN0YXRlIjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgb2YgZmlsZSBpbiBjb21tZW50LiIsCiAgICAidW5leHBlY3RlZC1jaGFyLWluLWNvbW1lbnQiOgogICAgICAgICJVbmV4cGVjdGVkIGNoYXJhY3RlciBpbiBjb21tZW50IGZvdW5kLiIsCiAgICAibmVlZC1zcGFjZS1hZnRlci1kb2N0eXBlIjoKICAgICAgICAiTm8gc3BhY2UgYWZ0ZXIgbGl0ZXJhbCBzdHJpbmcgJ0RPQ1RZUEUnLiIsCiAgICAiZXhwZWN0ZWQtZG9jdHlwZS1uYW1lLWJ1dC1nb3QtcmlnaHQtYnJhY2tldCI6CiAgICAgICAgIlVuZXhwZWN0ZWQgPiBjaGFyYWN0ZXIuIEV4cGVjdGVkIERPQ1RZUEUgbmFtZS4iLAogICAgImV4cGVjdGVkLWRvY3R5cGUtbmFtZS1idXQtZ290LWVvZiI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUuIEV4cGVjdGVkIERPQ1RZUEUgbmFtZS4iLAogICAgImVvZi1pbi1kb2N0eXBlLW5hbWUiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlIGluIERPQ1RZUEUgbmFtZS4iLAogICAgImVvZi1pbi1kb2N0eXBlIjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgb2YgZmlsZSBpbiBET0NUWVBFLiIsCiAgICAiZXhwZWN0ZWQtc3BhY2Utb3ItcmlnaHQtYnJhY2tldC1pbi1kb2N0eXBlIjoKICAgICAgICAiRXhwZWN0ZWQgc3BhY2Ugb3IgJz4nLiBHb3QgJyUoZGF0YSlzJyIsCiAgICAidW5leHBlY3RlZC1lbmQtb2YtZG9jdHlwZSI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIG9mIERPQ1RZUEUuIiwKICAgICJ1bmV4cGVjdGVkLWNoYXItaW4tZG9jdHlwZSI6CiAgICAgICAgIlVuZXhwZWN0ZWQgY2hhcmFjdGVyIGluIERPQ1RZUEUuIiwKICAgICJlb2YtaW4taW5uZXJodG1sIjoKICAgICAgICAiWFhYIGlubmVySFRNTCBFT0YiLAogICAgInVuZXhwZWN0ZWQtZG9jdHlwZSI6CiAgICAgICAgIlVuZXhwZWN0ZWQgRE9DVFlQRS4gSWdub3JlZC4iLAogICAgIm5vbi1odG1sLXJvb3QiOgogICAgICAgICJodG1sIG5lZWRzIHRvIGJlIHRoZSBmaXJzdCBzdGFydCB0YWcuIiwKICAgICJleHBlY3RlZC1kb2N0eXBlLWJ1dC1nb3QtZW9mIjoKICAgICAgICAiVW5leHBlY3RlZCBFbmQgb2YgZmlsZS4gRXhwZWN0ZWQgRE9DVFlQRS4iLAogICAgInVua25vd24tZG9jdHlwZSI6CiAgICAgICAgIkVycm9uZW91cyBET0NUWVBFLiIsCiAgICAiZXhwZWN0ZWQtZG9jdHlwZS1idXQtZ290LWNoYXJzIjoKICAgICAgICAiVW5leHBlY3RlZCBub24tc3BhY2UgY2hhcmFjdGVycy4gRXhwZWN0ZWQgRE9DVFlQRS4iLAogICAgImV4cGVjdGVkLWRvY3R5cGUtYnV0LWdvdC1zdGFydC10YWciOgogICAgICAgICJVbmV4cGVjdGVkIHN0YXJ0IHRhZyAoJShuYW1lKXMpLiBFeHBlY3RlZCBET0NUWVBFLiIsCiAgICAiZXhwZWN0ZWQtZG9jdHlwZS1idXQtZ290LWVuZC10YWciOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCB0YWcgKCUobmFtZSlzKS4gRXhwZWN0ZWQgRE9DVFlQRS4iLAogICAgImVuZC10YWctYWZ0ZXItaW1wbGllZC1yb290IjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgdGFnICglKG5hbWUpcykgYWZ0ZXIgdGhlIChpbXBsaWVkKSByb290IGVsZW1lbnQuIiwKICAgICJleHBlY3RlZC1uYW1lZC1jbG9zaW5nLXRhZy1idXQtZ290LWVvZiI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUuIEV4cGVjdGVkIGVuZCB0YWcgKCUobmFtZSlzKS4iLAogICAgInR3by1oZWFkcy1hcmUtbm90LWJldHRlci10aGFuLW9uZSI6CiAgICAgICAgIlVuZXhwZWN0ZWQgc3RhcnQgdGFnIGhlYWQgaW4gZXhpc3RpbmcgaGVhZC4gSWdub3JlZC4iLAogICAgInVuZXhwZWN0ZWQtZW5kLXRhZyI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIHRhZyAoJShuYW1lKXMpLiBJZ25vcmVkLiIsCiAgICAidW5leHBlY3RlZC1zdGFydC10YWctb3V0LW9mLW15LWhlYWQiOgogICAgICAgICJVbmV4cGVjdGVkIHN0YXJ0IHRhZyAoJShuYW1lKXMpIHRoYXQgY2FuIGJlIGluIGhlYWQuIE1vdmVkLiIsCiAgICAidW5leHBlY3RlZC1zdGFydC10YWciOgogICAgICAgICJVbmV4cGVjdGVkIHN0YXJ0IHRhZyAoJShuYW1lKXMpLiIsCiAgICAibWlzc2luZy1lbmQtdGFnIjoKICAgICAgICAiTWlzc2luZyBlbmQgdGFnICglKG5hbWUpcykuIiwKICAgICJtaXNzaW5nLWVuZC10YWdzIjoKICAgICAgICAiTWlzc2luZyBlbmQgdGFncyAoJShuYW1lKXMpLiIsCiAgICAidW5leHBlY3RlZC1zdGFydC10YWctaW1wbGllcy1lbmQtdGFnIjoKICAgICAgICAiVW5leHBlY3RlZCBzdGFydCB0YWcgKCUoc3RhcnROYW1lKXMpICIKICAgICAgICAiaW1wbGllcyBlbmQgdGFnICglKGVuZE5hbWUpcykuIiwKICAgICJ1bmV4cGVjdGVkLXN0YXJ0LXRhZy10cmVhdGVkLWFzIjoKICAgICAgICAiVW5leHBlY3RlZCBzdGFydCB0YWcgKCUob3JpZ2luYWxOYW1lKXMpLiBUcmVhdGVkIGFzICUobmV3TmFtZSlzLiIsCiAgICAiZGVwcmVjYXRlZC10YWciOgogICAgICAgICJVbmV4cGVjdGVkIHN0YXJ0IHRhZyAlKG5hbWUpcy4gRG9uJ3QgdXNlIGl0ISIsCiAgICAidW5leHBlY3RlZC1zdGFydC10YWctaWdub3JlZCI6CiAgICAgICAgIlVuZXhwZWN0ZWQgc3RhcnQgdGFnICUobmFtZSlzLiBJZ25vcmVkLiIsCiAgICAiZXhwZWN0ZWQtb25lLWVuZC10YWctYnV0LWdvdC1hbm90aGVyIjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgdGFnICglKGdvdE5hbWUpcykuICIKICAgICAgICAiTWlzc2luZyBlbmQgdGFnICglKGV4cGVjdGVkTmFtZSlzKS4iLAogICAgImVuZC10YWctdG9vLWVhcmx5IjoKICAgICAgICAiRW5kIHRhZyAoJShuYW1lKXMpIHNlZW4gdG9vIGVhcmx5LiBFeHBlY3RlZCBvdGhlciBlbmQgdGFnLiIsCiAgICAiZW5kLXRhZy10b28tZWFybHktbmFtZWQiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCB0YWcgKCUoZ290TmFtZSlzKS4gRXhwZWN0ZWQgZW5kIHRhZyAoJShleHBlY3RlZE5hbWUpcykuIiwKICAgICJlbmQtdGFnLXRvby1lYXJseS1pZ25vcmVkIjoKICAgICAgICAiRW5kIHRhZyAoJShuYW1lKXMpIHNlZW4gdG9vIGVhcmx5LiBJZ25vcmVkLiIsCiAgICAiYWRvcHRpb24tYWdlbmN5LTEuMSI6CiAgICAgICAgIkVuZCB0YWcgKCUobmFtZSlzKSB2aW9sYXRlcyBzdGVwIDEsICIKICAgICAgICAicGFyYWdyYXBoIDEgb2YgdGhlIGFkb3B0aW9uIGFnZW5jeSBhbGdvcml0aG0uIiwKICAgICJhZG9wdGlvbi1hZ2VuY3ktMS4yIjoKICAgICAgICAiRW5kIHRhZyAoJShuYW1lKXMpIHZpb2xhdGVzIHN0ZXAgMSwgIgogICAgICAgICJwYXJhZ3JhcGggMiBvZiB0aGUgYWRvcHRpb24gYWdlbmN5IGFsZ29yaXRobS4iLAogICAgImFkb3B0aW9uLWFnZW5jeS0xLjMiOgogICAgICAgICJFbmQgdGFnICglKG5hbWUpcykgdmlvbGF0ZXMgc3RlcCAxLCAiCiAgICAgICAgInBhcmFncmFwaCAzIG9mIHRoZSBhZG9wdGlvbiBhZ2VuY3kgYWxnb3JpdGhtLiIsCiAgICAiYWRvcHRpb24tYWdlbmN5LTQuNCI6CiAgICAgICAgIkVuZCB0YWcgKCUobmFtZSlzKSB2aW9sYXRlcyBzdGVwIDQsICIKICAgICAgICAicGFyYWdyYXBoIDQgb2YgdGhlIGFkb3B0aW9uIGFnZW5jeSBhbGdvcml0aG0uIiwKICAgICJ1bmV4cGVjdGVkLWVuZC10YWctdHJlYXRlZC1hcyI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIHRhZyAoJShvcmlnaW5hbE5hbWUpcykuIFRyZWF0ZWQgYXMgJShuZXdOYW1lKXMuIiwKICAgICJuby1lbmQtdGFnIjoKICAgICAgICAiVGhpcyBlbGVtZW50ICglKG5hbWUpcykgaGFzIG5vIGVuZCB0YWcuIiwKICAgICJ1bmV4cGVjdGVkLWltcGxpZWQtZW5kLXRhZy1pbi10YWJsZSI6CiAgICAgICAgIlVuZXhwZWN0ZWQgaW1wbGllZCBlbmQgdGFnICglKG5hbWUpcykgaW4gdGhlIHRhYmxlIHBoYXNlLiIsCiAgICAidW5leHBlY3RlZC1pbXBsaWVkLWVuZC10YWctaW4tdGFibGUtYm9keSI6CiAgICAgICAgIlVuZXhwZWN0ZWQgaW1wbGllZCBlbmQgdGFnICglKG5hbWUpcykgaW4gdGhlIHRhYmxlIGJvZHkgcGhhc2UuIiwKICAgICJ1bmV4cGVjdGVkLWNoYXItaW1wbGllcy10YWJsZS12b29kb28iOgogICAgICAgICJVbmV4cGVjdGVkIG5vbi1zcGFjZSBjaGFyYWN0ZXJzIGluICIKICAgICAgICAidGFibGUgY29udGV4dCBjYXVzZWQgdm9vZG9vIG1vZGUuIiwKICAgICJ1bmV4cGVjdGVkLWhpZGRlbi1pbnB1dC1pbi10YWJsZSI6CiAgICAgICAgIlVuZXhwZWN0ZWQgaW5wdXQgd2l0aCB0eXBlIGhpZGRlbiBpbiB0YWJsZSBjb250ZXh0LiIsCiAgICAidW5leHBlY3RlZC1mb3JtLWluLXRhYmxlIjoKICAgICAgICAiVW5leHBlY3RlZCBmb3JtIGluIHRhYmxlIGNvbnRleHQuIiwKICAgICJ1bmV4cGVjdGVkLXN0YXJ0LXRhZy1pbXBsaWVzLXRhYmxlLXZvb2RvbyI6CiAgICAgICAgIlVuZXhwZWN0ZWQgc3RhcnQgdGFnICglKG5hbWUpcykgaW4gIgogICAgICAgICJ0YWJsZSBjb250ZXh0IGNhdXNlZCB2b29kb28gbW9kZS4iLAogICAgInVuZXhwZWN0ZWQtZW5kLXRhZy1pbXBsaWVzLXRhYmxlLXZvb2RvbyI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIHRhZyAoJShuYW1lKXMpIGluICIKICAgICAgICAidGFibGUgY29udGV4dCBjYXVzZWQgdm9vZG9vIG1vZGUuIiwKICAgICJ1bmV4cGVjdGVkLWNlbGwtaW4tdGFibGUtYm9keSI6CiAgICAgICAgIlVuZXhwZWN0ZWQgdGFibGUgY2VsbCBzdGFydCB0YWcgKCUobmFtZSlzKSAiCiAgICAgICAgImluIHRoZSB0YWJsZSBib2R5IHBoYXNlLiIsCiAgICAidW5leHBlY3RlZC1jZWxsLWVuZC10YWciOgogICAgICAgICJHb3QgdGFibGUgY2VsbCBlbmQgdGFnICglKG5hbWUpcykgIgogICAgICAgICJ3aGlsZSByZXF1aXJlZCBlbmQgdGFncyBhcmUgbWlzc2luZy4iLAogICAgInVuZXhwZWN0ZWQtZW5kLXRhZy1pbi10YWJsZS1ib2R5IjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgdGFnICglKG5hbWUpcykgaW4gdGhlIHRhYmxlIGJvZHkgcGhhc2UuIElnbm9yZWQuIiwKICAgICJ1bmV4cGVjdGVkLWltcGxpZWQtZW5kLXRhZy1pbi10YWJsZS1yb3ciOgogICAgICAgICJVbmV4cGVjdGVkIGltcGxpZWQgZW5kIHRhZyAoJShuYW1lKXMpIGluIHRoZSB0YWJsZSByb3cgcGhhc2UuIiwKICAgICJ1bmV4cGVjdGVkLWVuZC10YWctaW4tdGFibGUtcm93IjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgdGFnICglKG5hbWUpcykgaW4gdGhlIHRhYmxlIHJvdyBwaGFzZS4gSWdub3JlZC4iLAogICAgInVuZXhwZWN0ZWQtc2VsZWN0LWluLXNlbGVjdCI6CiAgICAgICAgIlVuZXhwZWN0ZWQgc2VsZWN0IHN0YXJ0IHRhZyBpbiB0aGUgc2VsZWN0IHBoYXNlICIKICAgICAgICAidHJlYXRlZCBhcyBzZWxlY3QgZW5kIHRhZy4iLAogICAgInVuZXhwZWN0ZWQtaW5wdXQtaW4tc2VsZWN0IjoKICAgICAgICAiVW5leHBlY3RlZCBpbnB1dCBzdGFydCB0YWcgaW4gdGhlIHNlbGVjdCBwaGFzZS4iLAogICAgInVuZXhwZWN0ZWQtc3RhcnQtdGFnLWluLXNlbGVjdCI6CiAgICAgICAgIlVuZXhwZWN0ZWQgc3RhcnQgdGFnIHRva2VuICglKG5hbWUpcyBpbiB0aGUgc2VsZWN0IHBoYXNlLiAiCiAgICAgICAgIklnbm9yZWQuIiwKICAgICJ1bmV4cGVjdGVkLWVuZC10YWctaW4tc2VsZWN0IjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgdGFnICglKG5hbWUpcykgaW4gdGhlIHNlbGVjdCBwaGFzZS4gSWdub3JlZC4iLAogICAgInVuZXhwZWN0ZWQtdGFibGUtZWxlbWVudC1zdGFydC10YWctaW4tc2VsZWN0LWluLXRhYmxlIjoKICAgICAgICAiVW5leHBlY3RlZCB0YWJsZSBlbGVtZW50IHN0YXJ0IHRhZyAoJShuYW1lKXMpIGluIHRoZSBzZWxlY3QgaW4gdGFibGUgcGhhc2UuIiwKICAgICJ1bmV4cGVjdGVkLXRhYmxlLWVsZW1lbnQtZW5kLXRhZy1pbi1zZWxlY3QtaW4tdGFibGUiOgogICAgICAgICJVbmV4cGVjdGVkIHRhYmxlIGVsZW1lbnQgZW5kIHRhZyAoJShuYW1lKXMpIGluIHRoZSBzZWxlY3QgaW4gdGFibGUgcGhhc2UuIiwKICAgICJ1bmV4cGVjdGVkLWNoYXItYWZ0ZXItYm9keSI6CiAgICAgICAgIlVuZXhwZWN0ZWQgbm9uLXNwYWNlIGNoYXJhY3RlcnMgaW4gdGhlIGFmdGVyIGJvZHkgcGhhc2UuIiwKICAgICJ1bmV4cGVjdGVkLXN0YXJ0LXRhZy1hZnRlci1ib2R5IjoKICAgICAgICAiVW5leHBlY3RlZCBzdGFydCB0YWcgdG9rZW4gKCUobmFtZSlzKSIKICAgICAgICAiIGluIHRoZSBhZnRlciBib2R5IHBoYXNlLiIsCiAgICAidW5leHBlY3RlZC1lbmQtdGFnLWFmdGVyLWJvZHkiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCB0YWcgdG9rZW4gKCUobmFtZSlzKSIKICAgICAgICAiIGluIHRoZSBhZnRlciBib2R5IHBoYXNlLiIsCiAgICAidW5leHBlY3RlZC1jaGFyLWluLWZyYW1lc2V0IjoKICAgICAgICAiVW5leHBlY3RlZCBjaGFyYWN0ZXJzIGluIHRoZSBmcmFtZXNldCBwaGFzZS4gQ2hhcmFjdGVycyBpZ25vcmVkLiIsCiAgICAidW5leHBlY3RlZC1zdGFydC10YWctaW4tZnJhbWVzZXQiOgogICAgICAgICJVbmV4cGVjdGVkIHN0YXJ0IHRhZyB0b2tlbiAoJShuYW1lKXMpIgogICAgICAgICIgaW4gdGhlIGZyYW1lc2V0IHBoYXNlLiBJZ25vcmVkLiIsCiAgICAidW5leHBlY3RlZC1mcmFtZXNldC1pbi1mcmFtZXNldC1pbm5lcmh0bWwiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCB0YWcgdG9rZW4gKGZyYW1lc2V0KSAiCiAgICAgICAgImluIHRoZSBmcmFtZXNldCBwaGFzZSAoaW5uZXJIVE1MKS4iLAogICAgInVuZXhwZWN0ZWQtZW5kLXRhZy1pbi1mcmFtZXNldCI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIHRhZyB0b2tlbiAoJShuYW1lKXMpIgogICAgICAgICIgaW4gdGhlIGZyYW1lc2V0IHBoYXNlLiBJZ25vcmVkLiIsCiAgICAidW5leHBlY3RlZC1jaGFyLWFmdGVyLWZyYW1lc2V0IjoKICAgICAgICAiVW5leHBlY3RlZCBub24tc3BhY2UgY2hhcmFjdGVycyBpbiB0aGUgIgogICAgICAgICJhZnRlciBmcmFtZXNldCBwaGFzZS4gSWdub3JlZC4iLAogICAgInVuZXhwZWN0ZWQtc3RhcnQtdGFnLWFmdGVyLWZyYW1lc2V0IjoKICAgICAgICAiVW5leHBlY3RlZCBzdGFydCB0YWcgKCUobmFtZSlzKSIKICAgICAgICAiIGluIHRoZSBhZnRlciBmcmFtZXNldCBwaGFzZS4gSWdub3JlZC4iLAogICAgInVuZXhwZWN0ZWQtZW5kLXRhZy1hZnRlci1mcmFtZXNldCI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIHRhZyAoJShuYW1lKXMpIgogICAgICAgICIgaW4gdGhlIGFmdGVyIGZyYW1lc2V0IHBoYXNlLiBJZ25vcmVkLiIsCiAgICAidW5leHBlY3RlZC1lbmQtdGFnLWFmdGVyLWJvZHktaW5uZXJodG1sIjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgdGFnIGFmdGVyIGJvZHkoaW5uZXJIdG1sKSIsCiAgICAiZXhwZWN0ZWQtZW9mLWJ1dC1nb3QtY2hhciI6CiAgICAgICAgIlVuZXhwZWN0ZWQgbm9uLXNwYWNlIGNoYXJhY3RlcnMuIEV4cGVjdGVkIGVuZCBvZiBmaWxlLiIsCiAgICAiZXhwZWN0ZWQtZW9mLWJ1dC1nb3Qtc3RhcnQtdGFnIjoKICAgICAgICAiVW5leHBlY3RlZCBzdGFydCB0YWcgKCUobmFtZSlzKSIKICAgICAgICAiLiBFeHBlY3RlZCBlbmQgb2YgZmlsZS4iLAogICAgImV4cGVjdGVkLWVvZi1idXQtZ290LWVuZC10YWciOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCB0YWcgKCUobmFtZSlzKSIKICAgICAgICAiLiBFeHBlY3RlZCBlbmQgb2YgZmlsZS4iLAogICAgImVvZi1pbi10YWJsZSI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUuIEV4cGVjdGVkIHRhYmxlIGNvbnRlbnQuIiwKICAgICJlb2YtaW4tc2VsZWN0IjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgb2YgZmlsZS4gRXhwZWN0ZWQgc2VsZWN0IGNvbnRlbnQuIiwKICAgICJlb2YtaW4tZnJhbWVzZXQiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlLiBFeHBlY3RlZCBmcmFtZXNldCBjb250ZW50LiIsCiAgICAiZW9mLWluLXNjcmlwdC1pbi1zY3JpcHQiOgogICAgICAgICJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlLiBFeHBlY3RlZCBzY3JpcHQgY29udGVudC4iLAogICAgImVvZi1pbi1mb3JlaWduLWxhbmRzIjoKICAgICAgICAiVW5leHBlY3RlZCBlbmQgb2YgZmlsZS4gRXhwZWN0ZWQgZm9yZWlnbiBjb250ZW50IiwKICAgICJub24tdm9pZC1lbGVtZW50LXdpdGgtdHJhaWxpbmctc29saWR1cyI6CiAgICAgICAgIlRyYWlsaW5nIHNvbGlkdXMgbm90IGFsbG93ZWQgb24gZWxlbWVudCAlKG5hbWUpcyIsCiAgICAidW5leHBlY3RlZC1odG1sLWVsZW1lbnQtaW4tZm9yZWlnbi1jb250ZW50IjoKICAgICAgICAiRWxlbWVudCAlKG5hbWUpcyBub3QgYWxsb3dlZCBpbiBhIG5vbi1odG1sIGNvbnRleHQiLAogICAgInVuZXhwZWN0ZWQtZW5kLXRhZy1iZWZvcmUtaHRtbCI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIHRhZyAoJShuYW1lKXMpIGJlZm9yZSBodG1sLiIsCiAgICAidW5leHBlY3RlZC1pbmhlYWQtbm9zY3JpcHQtdGFnIjoKICAgICAgICAiRWxlbWVudCAlKG5hbWUpcyBub3QgYWxsb3dlZCBpbiBhIGluaGVhZC1ub3NjcmlwdCBjb250ZXh0IiwKICAgICJlb2YtaW4taGVhZC1ub3NjcmlwdCI6CiAgICAgICAgIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUuIEV4cGVjdGVkIGluaGVhZC1ub3NjcmlwdCBjb250ZW50IiwKICAgICJjaGFyLWluLWhlYWQtbm9zY3JpcHQiOgogICAgICAgICJVbmV4cGVjdGVkIG5vbi1zcGFjZSBjaGFyYWN0ZXIuIEV4cGVjdGVkIGluaGVhZC1ub3NjcmlwdCBjb250ZW50IiwKICAgICJYWFgtdW5kZWZpbmVkLWVycm9yIjoKICAgICAgICAiVW5kZWZpbmVkIGVycm9yICh0aGlzIHN1Y2tzIGFuZCBzaG91bGQgYmUgZml4ZWQpIiwKfQoKbmFtZXNwYWNlcyA9IHsKICAgICJodG1sIjogImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLAogICAgIm1hdGhtbCI6ICJodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MIiwKICAgICJzdmciOiAiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLAogICAgInhsaW5rIjogImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLAogICAgInhtbCI6ICJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiLAogICAgInhtbG5zIjogImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIgp9CgpzY29waW5nRWxlbWVudHMgPSBmcm96ZW5zZXQoWwogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImFwcGxldCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImNhcHRpb24iKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJodG1sIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAibWFycXVlZSIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgIm9iamVjdCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInRhYmxlIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAidGQiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJ0aCIpLAogICAgKG5hbWVzcGFjZXNbIm1hdGhtbCJdLCAibWkiKSwKICAgIChuYW1lc3BhY2VzWyJtYXRobWwiXSwgIm1vIiksCiAgICAobmFtZXNwYWNlc1sibWF0aG1sIl0sICJtbiIpLAogICAgKG5hbWVzcGFjZXNbIm1hdGhtbCJdLCAibXMiKSwKICAgIChuYW1lc3BhY2VzWyJtYXRobWwiXSwgIm10ZXh0IiksCiAgICAobmFtZXNwYWNlc1sibWF0aG1sIl0sICJhbm5vdGF0aW9uLXhtbCIpLAogICAgKG5hbWVzcGFjZXNbInN2ZyJdLCAiZm9yZWlnbk9iamVjdCIpLAogICAgKG5hbWVzcGFjZXNbInN2ZyJdLCAiZGVzYyIpLAogICAgKG5hbWVzcGFjZXNbInN2ZyJdLCAidGl0bGUiKSwKXSkKCmZvcm1hdHRpbmdFbGVtZW50cyA9IGZyb3plbnNldChbCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiYSIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImIiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJiaWciKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJjb2RlIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiZW0iKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJmb250IiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiaSIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgIm5vYnIiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJzIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAic21hbGwiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJzdHJpa2UiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJzdHJvbmciKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJ0dCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInUiKQpdKQoKc3BlY2lhbEVsZW1lbnRzID0gZnJvemVuc2V0KFsKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJhZGRyZXNzIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiYXBwbGV0IiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiYXJlYSIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImFydGljbGUiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJhc2lkZSIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImJhc2UiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJiYXNlZm9udCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImJnc291bmQiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJibG9ja3F1b3RlIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiYm9keSIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImJyIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiYnV0dG9uIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiY2FwdGlvbiIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImNlbnRlciIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImNvbCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImNvbGdyb3VwIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiY29tbWFuZCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImRkIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiZGV0YWlscyIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImRpciIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImRpdiIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImRsIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiZHQiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJlbWJlZCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImZpZWxkc2V0IiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiZmlndXJlIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiZm9vdGVyIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiZm9ybSIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImZyYW1lIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiZnJhbWVzZXQiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJoMSIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImgyIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiaDMiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJoNCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImg1IiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiaDYiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJoZWFkIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiaGVhZGVyIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiaHIiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJodG1sIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiaWZyYW1lIiksCiAgICAjIE5vdGUgdGhhdCBpbWFnZSBpcyBjb21tZW50ZWQgb3V0IGluIHRoZSBzcGVjIGFzICJ0aGlzIGlzbid0IGFuCiAgICAjIGVsZW1lbnQgdGhhdCBjYW4gZW5kIHVwIG9uIHRoZSBzdGFjaywgc28gaXQgZG9lc24ndCBtYXR0ZXIsIgogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgImltYWdlIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiaW1nIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAiaW5wdXQiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJpc2luZGV4IiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAibGkiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJsaW5rIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAibGlzdGluZyIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgIm1hcnF1ZWUiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJtZW51IiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAibWV0YSIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgIm5hdiIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgIm5vZW1iZWQiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJub2ZyYW1lcyIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgIm5vc2NyaXB0IiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAib2JqZWN0IiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAib2wiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJwIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAicGFyYW0iKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJwbGFpbnRleHQiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJwcmUiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJzY3JpcHQiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJzZWN0aW9uIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAic2VsZWN0IiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAic3R5bGUiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJ0YWJsZSIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInRib2R5IiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAidGQiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJ0ZXh0YXJlYSIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInRmb290IiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAidGgiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJ0aGVhZCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInRpdGxlIiksCiAgICAobmFtZXNwYWNlc1siaHRtbCJdLCAidHIiKSwKICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJ1bCIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgIndiciIpLAogICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInhtcCIpLAogICAgKG5hbWVzcGFjZXNbInN2ZyJdLCAiZm9yZWlnbk9iamVjdCIpCl0pCgpodG1sSW50ZWdyYXRpb25Qb2ludEVsZW1lbnRzID0gZnJvemVuc2V0KFsKICAgIChuYW1lc3BhY2VzWyJtYXRobWwiXSwgImFubm90YWlvbi14bWwiKSwKICAgIChuYW1lc3BhY2VzWyJzdmciXSwgImZvcmVpZ25PYmplY3QiKSwKICAgIChuYW1lc3BhY2VzWyJzdmciXSwgImRlc2MiKSwKICAgIChuYW1lc3BhY2VzWyJzdmciXSwgInRpdGxlIikKXSkKCm1hdGhtbFRleHRJbnRlZ3JhdGlvblBvaW50RWxlbWVudHMgPSBmcm96ZW5zZXQoWwogICAgKG5hbWVzcGFjZXNbIm1hdGhtbCJdLCAibWkiKSwKICAgIChuYW1lc3BhY2VzWyJtYXRobWwiXSwgIm1vIiksCiAgICAobmFtZXNwYWNlc1sibWF0aG1sIl0sICJtbiIpLAogICAgKG5hbWVzcGFjZXNbIm1hdGhtbCJdLCAibXMiKSwKICAgIChuYW1lc3BhY2VzWyJtYXRobWwiXSwgIm10ZXh0IikKXSkKCmFkanVzdFNWR0F0dHJpYnV0ZXMgPSB7CiAgICAiYXR0cmlidXRlbmFtZSI6ICJhdHRyaWJ1dGVOYW1lIiwKICAgICJhdHRyaWJ1dGV0eXBlIjogImF0dHJpYnV0ZVR5cGUiLAogICAgImJhc2VmcmVxdWVuY3kiOiAiYmFzZUZyZXF1ZW5jeSIsCiAgICAiYmFzZXByb2ZpbGUiOiAiYmFzZVByb2ZpbGUiLAogICAgImNhbGNtb2RlIjogImNhbGNNb2RlIiwKICAgICJjbGlwcGF0aHVuaXRzIjogImNsaXBQYXRoVW5pdHMiLAogICAgImNvbnRlbnRzY3JpcHR0eXBlIjogImNvbnRlbnRTY3JpcHRUeXBlIiwKICAgICJjb250ZW50c3R5bGV0eXBlIjogImNvbnRlbnRTdHlsZVR5cGUiLAogICAgImRpZmZ1c2Vjb25zdGFudCI6ICJkaWZmdXNlQ29uc3RhbnQiLAogICAgImVkZ2Vtb2RlIjogImVkZ2VNb2RlIiwKICAgICJleHRlcm5hbHJlc291cmNlc3JlcXVpcmVkIjogImV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQiLAogICAgImZpbHRlcnJlcyI6ICJmaWx0ZXJSZXMiLAogICAgImZpbHRlcnVuaXRzIjogImZpbHRlclVuaXRzIiwKICAgICJnbHlwaHJlZiI6ICJnbHlwaFJlZiIsCiAgICAiZ3JhZGllbnR0cmFuc2Zvcm0iOiAiZ3JhZGllbnRUcmFuc2Zvcm0iLAogICAgImdyYWRpZW50dW5pdHMiOiAiZ3JhZGllbnRVbml0cyIsCiAgICAia2VybmVsbWF0cml4IjogImtlcm5lbE1hdHJpeCIsCiAgICAia2VybmVsdW5pdGxlbmd0aCI6ICJrZXJuZWxVbml0TGVuZ3RoIiwKICAgICJrZXlwb2ludHMiOiAia2V5UG9pbnRzIiwKICAgICJrZXlzcGxpbmVzIjogImtleVNwbGluZXMiLAogICAgImtleXRpbWVzIjogImtleVRpbWVzIiwKICAgICJsZW5ndGhhZGp1c3QiOiAibGVuZ3RoQWRqdXN0IiwKICAgICJsaW1pdGluZ2NvbmVhbmdsZSI6ICJsaW1pdGluZ0NvbmVBbmdsZSIsCiAgICAibWFya2VyaGVpZ2h0IjogIm1hcmtlckhlaWdodCIsCiAgICAibWFya2VydW5pdHMiOiAibWFya2VyVW5pdHMiLAogICAgIm1hcmtlcndpZHRoIjogIm1hcmtlcldpZHRoIiwKICAgICJtYXNrY29udGVudHVuaXRzIjogIm1hc2tDb250ZW50VW5pdHMiLAogICAgIm1hc2t1bml0cyI6ICJtYXNrVW5pdHMiLAogICAgIm51bW9jdGF2ZXMiOiAibnVtT2N0YXZlcyIsCiAgICAicGF0aGxlbmd0aCI6ICJwYXRoTGVuZ3RoIiwKICAgICJwYXR0ZXJuY29udGVudHVuaXRzIjogInBhdHRlcm5Db250ZW50VW5pdHMiLAogICAgInBhdHRlcm50cmFuc2Zvcm0iOiAicGF0dGVyblRyYW5zZm9ybSIsCiAgICAicGF0dGVybnVuaXRzIjogInBhdHRlcm5Vbml0cyIsCiAgICAicG9pbnRzYXR4IjogInBvaW50c0F0WCIsCiAgICAicG9pbnRzYXR5IjogInBvaW50c0F0WSIsCiAgICAicG9pbnRzYXR6IjogInBvaW50c0F0WiIsCiAgICAicHJlc2VydmVhbHBoYSI6ICJwcmVzZXJ2ZUFscGhhIiwKICAgICJwcmVzZXJ2ZWFzcGVjdHJhdGlvIjogInByZXNlcnZlQXNwZWN0UmF0aW8iLAogICAgInByaW1pdGl2ZXVuaXRzIjogInByaW1pdGl2ZVVuaXRzIiwKICAgICJyZWZ4IjogInJlZlgiLAogICAgInJlZnkiOiAicmVmWSIsCiAgICAicmVwZWF0Y291bnQiOiAicmVwZWF0Q291bnQiLAogICAgInJlcGVhdGR1ciI6ICJyZXBlYXREdXIiLAogICAgInJlcXVpcmVkZXh0ZW5zaW9ucyI6ICJyZXF1aXJlZEV4dGVuc2lvbnMiLAogICAgInJlcXVpcmVkZmVhdHVyZXMiOiAicmVxdWlyZWRGZWF0dXJlcyIsCiAgICAic3BlY3VsYXJjb25zdGFudCI6ICJzcGVjdWxhckNvbnN0YW50IiwKICAgICJzcGVjdWxhcmV4cG9uZW50IjogInNwZWN1bGFyRXhwb25lbnQiLAogICAgInNwcmVhZG1ldGhvZCI6ICJzcHJlYWRNZXRob2QiLAogICAgInN0YXJ0b2Zmc2V0IjogInN0YXJ0T2Zmc2V0IiwKICAgICJzdGRkZXZpYXRpb24iOiAic3RkRGV2aWF0aW9uIiwKICAgICJzdGl0Y2h0aWxlcyI6ICJzdGl0Y2hUaWxlcyIsCiAgICAic3VyZmFjZXNjYWxlIjogInN1cmZhY2VTY2FsZSIsCiAgICAic3lzdGVtbGFuZ3VhZ2UiOiAic3lzdGVtTGFuZ3VhZ2UiLAogICAgInRhYmxldmFsdWVzIjogInRhYmxlVmFsdWVzIiwKICAgICJ0YXJnZXR4IjogInRhcmdldFgiLAogICAgInRhcmdldHkiOiAidGFyZ2V0WSIsCiAgICAidGV4dGxlbmd0aCI6ICJ0ZXh0TGVuZ3RoIiwKICAgICJ2aWV3Ym94IjogInZpZXdCb3giLAogICAgInZpZXd0YXJnZXQiOiAidmlld1RhcmdldCIsCiAgICAieGNoYW5uZWxzZWxlY3RvciI6ICJ4Q2hhbm5lbFNlbGVjdG9yIiwKICAgICJ5Y2hhbm5lbHNlbGVjdG9yIjogInlDaGFubmVsU2VsZWN0b3IiLAogICAgInpvb21hbmRwYW4iOiAiem9vbUFuZFBhbiIKfQoKYWRqdXN0TWF0aE1MQXR0cmlidXRlcyA9IHsiZGVmaW5pdGlvbnVybCI6ICJkZWZpbml0aW9uVVJMIn0KCmFkanVzdEZvcmVpZ25BdHRyaWJ1dGVzID0gewogICAgInhsaW5rOmFjdHVhdGUiOiAoInhsaW5rIiwgImFjdHVhdGUiLCBuYW1lc3BhY2VzWyJ4bGluayJdKSwKICAgICJ4bGluazphcmNyb2xlIjogKCJ4bGluayIsICJhcmNyb2xlIiwgbmFtZXNwYWNlc1sieGxpbmsiXSksCiAgICAieGxpbms6aHJlZiI6ICgieGxpbmsiLCAiaHJlZiIsIG5hbWVzcGFjZXNbInhsaW5rIl0pLAogICAgInhsaW5rOnJvbGUiOiAoInhsaW5rIiwgInJvbGUiLCBuYW1lc3BhY2VzWyJ4bGluayJdKSwKICAgICJ4bGluazpzaG93IjogKCJ4bGluayIsICJzaG93IiwgbmFtZXNwYWNlc1sieGxpbmsiXSksCiAgICAieGxpbms6dGl0bGUiOiAoInhsaW5rIiwgInRpdGxlIiwgbmFtZXNwYWNlc1sieGxpbmsiXSksCiAgICAieGxpbms6dHlwZSI6ICgieGxpbmsiLCAidHlwZSIsIG5hbWVzcGFjZXNbInhsaW5rIl0pLAogICAgInhtbDpiYXNlIjogKCJ4bWwiLCAiYmFzZSIsIG5hbWVzcGFjZXNbInhtbCJdKSwKICAgICJ4bWw6bGFuZyI6ICgieG1sIiwgImxhbmciLCBuYW1lc3BhY2VzWyJ4bWwiXSksCiAgICAieG1sOnNwYWNlIjogKCJ4bWwiLCAic3BhY2UiLCBuYW1lc3BhY2VzWyJ4bWwiXSksCiAgICAieG1sbnMiOiAoTm9uZSwgInhtbG5zIiwgbmFtZXNwYWNlc1sieG1sbnMiXSksCiAgICAieG1sbnM6eGxpbmsiOiAoInhtbG5zIiwgInhsaW5rIiwgbmFtZXNwYWNlc1sieG1sbnMiXSkKfQoKdW5hZGp1c3RGb3JlaWduQXR0cmlidXRlcyA9IGRpY3QoWygobnMsIGxvY2FsKSwgcW5hbWUpIGZvciBxbmFtZSwgKHByZWZpeCwgbG9jYWwsIG5zKSBpbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRqdXN0Rm9yZWlnbkF0dHJpYnV0ZXMuaXRlbXMoKV0pCgpzcGFjZUNoYXJhY3RlcnMgPSBmcm96ZW5zZXQoWwogICAgIlx0IiwKICAgICJcbiIsCiAgICAiXHUwMDBDIiwKICAgICIgIiwKICAgICJcciIKXSkKCnRhYmxlSW5zZXJ0TW9kZUVsZW1lbnRzID0gZnJvemVuc2V0KFsKICAgICJ0YWJsZSIsCiAgICAidGJvZHkiLAogICAgInRmb290IiwKICAgICJ0aGVhZCIsCiAgICAidHIiCl0pCgphc2NpaUxvd2VyY2FzZSA9IGZyb3plbnNldChzdHJpbmcuYXNjaWlfbG93ZXJjYXNlKQphc2NpaVVwcGVyY2FzZSA9IGZyb3plbnNldChzdHJpbmcuYXNjaWlfdXBwZXJjYXNlKQphc2NpaUxldHRlcnMgPSBmcm96ZW5zZXQoc3RyaW5nLmFzY2lpX2xldHRlcnMpCmRpZ2l0cyA9IGZyb3plbnNldChzdHJpbmcuZGlnaXRzKQpoZXhEaWdpdHMgPSBmcm96ZW5zZXQoc3RyaW5nLmhleGRpZ2l0cykKCmFzY2lpVXBwZXIyTG93ZXIgPSBkaWN0KFsob3JkKGMpLCBvcmQoYy5sb3dlcigpKSkKICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBjIGluIHN0cmluZy5hc2NpaV91cHBlcmNhc2VdKQoKIyBIZWFkaW5nIGVsZW1lbnRzIG5lZWQgdG8gYmUgb3JkZXJlZApoZWFkaW5nRWxlbWVudHMgPSAoCiAgICAiaDEiLAogICAgImgyIiwKICAgICJoMyIsCiAgICAiaDQiLAogICAgImg1IiwKICAgICJoNiIKKQoKdm9pZEVsZW1lbnRzID0gZnJvemVuc2V0KFsKICAgICJiYXNlIiwKICAgICJjb21tYW5kIiwKICAgICJldmVudC1zb3VyY2UiLAogICAgImxpbmsiLAogICAgIm1ldGEiLAogICAgImhyIiwKICAgICJiciIsCiAgICAiaW1nIiwKICAgICJlbWJlZCIsCiAgICAicGFyYW0iLAogICAgImFyZWEiLAogICAgImNvbCIsCiAgICAiaW5wdXQiLAogICAgInNvdXJjZSIsCiAgICAidHJhY2siCl0pCgpjZGF0YUVsZW1lbnRzID0gZnJvemVuc2V0KFsndGl0bGUnLCAndGV4dGFyZWEnXSkKCnJjZGF0YUVsZW1lbnRzID0gZnJvemVuc2V0KFsKICAgICdzdHlsZScsCiAgICAnc2NyaXB0JywKICAgICd4bXAnLAogICAgJ2lmcmFtZScsCiAgICAnbm9lbWJlZCcsCiAgICAnbm9mcmFtZXMnLAogICAgJ25vc2NyaXB0JwpdKQoKYm9vbGVhbkF0dHJpYnV0ZXMgPSB7CiAgICAiIjogZnJvemVuc2V0KFsiaXJyZWxldmFudCJdKSwKICAgICJzdHlsZSI6IGZyb3plbnNldChbInNjb3BlZCJdKSwKICAgICJpbWciOiBmcm96ZW5zZXQoWyJpc21hcCJdKSwKICAgICJhdWRpbyI6IGZyb3plbnNldChbImF1dG9wbGF5IiwgImNvbnRyb2xzIl0pLAogICAgInZpZGVvIjogZnJvemVuc2V0KFsiYXV0b3BsYXkiLCAiY29udHJvbHMiXSksCiAgICAic2NyaXB0IjogZnJvemVuc2V0KFsiZGVmZXIiLCAiYXN5bmMiXSksCiAgICAiZGV0YWlscyI6IGZyb3plbnNldChbIm9wZW4iXSksCiAgICAiZGF0YWdyaWQiOiBmcm96ZW5zZXQoWyJtdWx0aXBsZSIsICJkaXNhYmxlZCJdKSwKICAgICJjb21tYW5kIjogZnJvemVuc2V0KFsiaGlkZGVuIiwgImRpc2FibGVkIiwgImNoZWNrZWQiLCAiZGVmYXVsdCJdKSwKICAgICJociI6IGZyb3plbnNldChbIm5vc2hhZGUiXSksCiAgICAibWVudSI6IGZyb3plbnNldChbImF1dG9zdWJtaXQiXSksCiAgICAiZmllbGRzZXQiOiBmcm96ZW5zZXQoWyJkaXNhYmxlZCIsICJyZWFkb25seSJdKSwKICAgICJvcHRpb24iOiBmcm96ZW5zZXQoWyJkaXNhYmxlZCIsICJyZWFkb25seSIsICJzZWxlY3RlZCJdKSwKICAgICJvcHRncm91cCI6IGZyb3plbnNldChbImRpc2FibGVkIiwgInJlYWRvbmx5Il0pLAogICAgImJ1dHRvbiI6IGZyb3plbnNldChbImRpc2FibGVkIiwgImF1dG9mb2N1cyJdKSwKICAgICJpbnB1dCI6IGZyb3plbnNldChbImRpc2FibGVkIiwgInJlYWRvbmx5IiwgInJlcXVpcmVkIiwgImF1dG9mb2N1cyIsICJjaGVja2VkIiwgImlzbWFwIl0pLAogICAgInNlbGVjdCI6IGZyb3plbnNldChbImRpc2FibGVkIiwgInJlYWRvbmx5IiwgImF1dG9mb2N1cyIsICJtdWx0aXBsZSJdKSwKICAgICJvdXRwdXQiOiBmcm96ZW5zZXQoWyJkaXNhYmxlZCIsICJyZWFkb25seSJdKSwKfQoKIyBlbnRpdGllc1dpbmRvd3MxMjUyIGhhcyB0byBiZSBfb3JkZXJlZF8gYW5kIG5lZWRzIHRvIGhhdmUgYW4gaW5kZXguIEl0CiMgdGhlcmVmb3JlIGNhbid0IGJlIGEgZnJvemVuc2V0LgplbnRpdGllc1dpbmRvd3MxMjUyID0gKAogICAgODM2NCwgICAjIDB4ODAgIDB4MjBBQyAgRVVSTyBTSUdOCiAgICA2NTUzMywgICMgMHg4MSAgICAgICAgICBVTkRFRklORUQKICAgIDgyMTgsICAgIyAweDgyICAweDIwMUEgIFNJTkdMRSBMT1ctOSBRVU9UQVRJT04gTUFSSwogICAgNDAyLCAgICAjIDB4ODMgIDB4MDE5MiAgTEFUSU4gU01BTEwgTEVUVEVSIEYgV0lUSCBIT09LCiAgICA4MjIyLCAgICMgMHg4NCAgMHgyMDFFICBET1VCTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksKICAgIDgyMzAsICAgIyAweDg1ICAweDIwMjYgIEhPUklaT05UQUwgRUxMSVBTSVMKICAgIDgyMjQsICAgIyAweDg2ICAweDIwMjAgIERBR0dFUgogICAgODIyNSwgICAjIDB4ODcgIDB4MjAyMSAgRE9VQkxFIERBR0dFUgogICAgNzEwLCAgICAjIDB4ODggIDB4MDJDNiAgTU9ESUZJRVIgTEVUVEVSIENJUkNVTUZMRVggQUNDRU5UCiAgICA4MjQwLCAgICMgMHg4OSAgMHgyMDMwICBQRVIgTUlMTEUgU0lHTgogICAgMzUyLCAgICAjIDB4OEEgIDB4MDE2MCAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIENBUk9OCiAgICA4MjQ5LCAgICMgMHg4QiAgMHgyMDM5ICBTSU5HTEUgTEVGVC1QT0lOVElORyBBTkdMRSBRVU9UQVRJT04gTUFSSwogICAgMzM4LCAgICAjIDB4OEMgIDB4MDE1MiAgTEFUSU4gQ0FQSVRBTCBMSUdBVFVSRSBPRQogICAgNjU1MzMsICAjIDB4OEQgICAgICAgICAgVU5ERUZJTkVECiAgICAzODEsICAgICMgMHg4RSAgMHgwMTdEICBMQVRJTiBDQVBJVEFMIExFVFRFUiBaIFdJVEggQ0FST04KICAgIDY1NTMzLCAgIyAweDhGICAgICAgICAgIFVOREVGSU5FRAogICAgNjU1MzMsICAjIDB4OTAgICAgICAgICAgVU5ERUZJTkVECiAgICA4MjE2LCAgICMgMHg5MSAgMHgyMDE4ICBMRUZUIFNJTkdMRSBRVU9UQVRJT04gTUFSSwogICAgODIxNywgICAjIDB4OTIgIDB4MjAxOSAgUklHSFQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCiAgICA4MjIwLCAgICMgMHg5MyAgMHgyMDFDICBMRUZUIERPVUJMRSBRVU9UQVRJT04gTUFSSwogICAgODIyMSwgICAjIDB4OTQgIDB4MjAxRCAgUklHSFQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCiAgICA4MjI2LCAgICMgMHg5NSAgMHgyMDIyICBCVUxMRVQKICAgIDgyMTEsICAgIyAweDk2ICAweDIwMTMgIEVOIERBU0gKICAgIDgyMTIsICAgIyAweDk3ICAweDIwMTQgIEVNIERBU0gKICAgIDczMiwgICAgIyAweDk4ICAweDAyREMgIFNNQUxMIFRJTERFCiAgICA4NDgyLCAgICMgMHg5OSAgMHgyMTIyICBUUkFERSBNQVJLIFNJR04KICAgIDM1MywgICAgIyAweDlBICAweDAxNjEgIExBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQ0FST04KICAgIDgyNTAsICAgIyAweDlCICAweDIwM0EgIFNJTkdMRSBSSUdIVC1QT0lOVElORyBBTkdMRSBRVU9UQVRJT04gTUFSSwogICAgMzM5LCAgICAjIDB4OUMgIDB4MDE1MyAgTEFUSU4gU01BTEwgTElHQVRVUkUgT0UKICAgIDY1NTMzLCAgIyAweDlEICAgICAgICAgIFVOREVGSU5FRAogICAgMzgyLCAgICAjIDB4OUUgIDB4MDE3RSAgTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBDQVJPTgogICAgMzc2ICAgICAjIDB4OUYgIDB4MDE3OCAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIERJQUVSRVNJUwopCgp4bWxFbnRpdGllcyA9IGZyb3plbnNldChbJ2x0OycsICdndDsnLCAnYW1wOycsICdhcG9zOycsICdxdW90OyddKQoKZW50aXRpZXMgPSB7CiAgICAiQUVsaWciOiAiXHhjNiIsCiAgICAiQUVsaWc7IjogIlx4YzYiLAogICAgIkFNUCI6ICImIiwKICAgICJBTVA7IjogIiYiLAogICAgIkFhY3V0ZSI6ICJceGMxIiwKICAgICJBYWN1dGU7IjogIlx4YzEiLAogICAgIkFicmV2ZTsiOiAiXHUwMTAyIiwKICAgICJBY2lyYyI6ICJceGMyIiwKICAgICJBY2lyYzsiOiAiXHhjMiIsCiAgICAiQWN5OyI6ICJcdTA0MTAiLAogICAgIkFmcjsiOiAiXFUwMDAxZDUwNCIsCiAgICAiQWdyYXZlIjogIlx4YzAiLAogICAgIkFncmF2ZTsiOiAiXHhjMCIsCiAgICAiQWxwaGE7IjogIlx1MDM5MSIsCiAgICAiQW1hY3I7IjogIlx1MDEwMCIsCiAgICAiQW5kOyI6ICJcdTJhNTMiLAogICAgIkFvZ29uOyI6ICJcdTAxMDQiLAogICAgIkFvcGY7IjogIlxVMDAwMWQ1MzgiLAogICAgIkFwcGx5RnVuY3Rpb247IjogIlx1MjA2MSIsCiAgICAiQXJpbmciOiAiXHhjNSIsCiAgICAiQXJpbmc7IjogIlx4YzUiLAogICAgIkFzY3I7IjogIlxVMDAwMWQ0OWMiLAogICAgIkFzc2lnbjsiOiAiXHUyMjU0IiwKICAgICJBdGlsZGUiOiAiXHhjMyIsCiAgICAiQXRpbGRlOyI6ICJceGMzIiwKICAgICJBdW1sIjogIlx4YzQiLAogICAgIkF1bWw7IjogIlx4YzQiLAogICAgIkJhY2tzbGFzaDsiOiAiXHUyMjE2IiwKICAgICJCYXJ2OyI6ICJcdTJhZTciLAogICAgIkJhcndlZDsiOiAiXHUyMzA2IiwKICAgICJCY3k7IjogIlx1MDQxMSIsCiAgICAiQmVjYXVzZTsiOiAiXHUyMjM1IiwKICAgICJCZXJub3VsbGlzOyI6ICJcdTIxMmMiLAogICAgIkJldGE7IjogIlx1MDM5MiIsCiAgICAiQmZyOyI6ICJcVTAwMDFkNTA1IiwKICAgICJCb3BmOyI6ICJcVTAwMDFkNTM5IiwKICAgICJCcmV2ZTsiOiAiXHUwMmQ4IiwKICAgICJCc2NyOyI6ICJcdTIxMmMiLAogICAgIkJ1bXBlcTsiOiAiXHUyMjRlIiwKICAgICJDSGN5OyI6ICJcdTA0MjciLAogICAgIkNPUFkiOiAiXHhhOSIsCiAgICAiQ09QWTsiOiAiXHhhOSIsCiAgICAiQ2FjdXRlOyI6ICJcdTAxMDYiLAogICAgIkNhcDsiOiAiXHUyMmQyIiwKICAgICJDYXBpdGFsRGlmZmVyZW50aWFsRDsiOiAiXHUyMTQ1IiwKICAgICJDYXlsZXlzOyI6ICJcdTIxMmQiLAogICAgIkNjYXJvbjsiOiAiXHUwMTBjIiwKICAgICJDY2VkaWwiOiAiXHhjNyIsCiAgICAiQ2NlZGlsOyI6ICJceGM3IiwKICAgICJDY2lyYzsiOiAiXHUwMTA4IiwKICAgICJDY29uaW50OyI6ICJcdTIyMzAiLAogICAgIkNkb3Q7IjogIlx1MDEwYSIsCiAgICAiQ2VkaWxsYTsiOiAiXHhiOCIsCiAgICAiQ2VudGVyRG90OyI6ICJceGI3IiwKICAgICJDZnI7IjogIlx1MjEyZCIsCiAgICAiQ2hpOyI6ICJcdTAzYTciLAogICAgIkNpcmNsZURvdDsiOiAiXHUyMjk5IiwKICAgICJDaXJjbGVNaW51czsiOiAiXHUyMjk2IiwKICAgICJDaXJjbGVQbHVzOyI6ICJcdTIyOTUiLAogICAgIkNpcmNsZVRpbWVzOyI6ICJcdTIyOTciLAogICAgIkNsb2Nrd2lzZUNvbnRvdXJJbnRlZ3JhbDsiOiAiXHUyMjMyIiwKICAgICJDbG9zZUN1cmx5RG91YmxlUXVvdGU7IjogIlx1MjAxZCIsCiAgICAiQ2xvc2VDdXJseVF1b3RlOyI6ICJcdTIwMTkiLAogICAgIkNvbG9uOyI6ICJcdTIyMzciLAogICAgIkNvbG9uZTsiOiAiXHUyYTc0IiwKICAgICJDb25ncnVlbnQ7IjogIlx1MjI2MSIsCiAgICAiQ29uaW50OyI6ICJcdTIyMmYiLAogICAgIkNvbnRvdXJJbnRlZ3JhbDsiOiAiXHUyMjJlIiwKICAgICJDb3BmOyI6ICJcdTIxMDIiLAogICAgIkNvcHJvZHVjdDsiOiAiXHUyMjEwIiwKICAgICJDb3VudGVyQ2xvY2t3aXNlQ29udG91ckludGVncmFsOyI6ICJcdTIyMzMiLAogICAgIkNyb3NzOyI6ICJcdTJhMmYiLAogICAgIkNzY3I7IjogIlxVMDAwMWQ0OWUiLAogICAgIkN1cDsiOiAiXHUyMmQzIiwKICAgICJDdXBDYXA7IjogIlx1MjI0ZCIsCiAgICAiREQ7IjogIlx1MjE0NSIsCiAgICAiRERvdHJhaGQ7IjogIlx1MjkxMSIsCiAgICAiREpjeTsiOiAiXHUwNDAyIiwKICAgICJEU2N5OyI6ICJcdTA0MDUiLAogICAgIkRaY3k7IjogIlx1MDQwZiIsCiAgICAiRGFnZ2VyOyI6ICJcdTIwMjEiLAogICAgIkRhcnI7IjogIlx1MjFhMSIsCiAgICAiRGFzaHY7IjogIlx1MmFlNCIsCiAgICAiRGNhcm9uOyI6ICJcdTAxMGUiLAogICAgIkRjeTsiOiAiXHUwNDE0IiwKICAgICJEZWw7IjogIlx1MjIwNyIsCiAgICAiRGVsdGE7IjogIlx1MDM5NCIsCiAgICAiRGZyOyI6ICJcVTAwMDFkNTA3IiwKICAgICJEaWFjcml0aWNhbEFjdXRlOyI6ICJceGI0IiwKICAgICJEaWFjcml0aWNhbERvdDsiOiAiXHUwMmQ5IiwKICAgICJEaWFjcml0aWNhbERvdWJsZUFjdXRlOyI6ICJcdTAyZGQiLAogICAgIkRpYWNyaXRpY2FsR3JhdmU7IjogImAiLAogICAgIkRpYWNyaXRpY2FsVGlsZGU7IjogIlx1MDJkYyIsCiAgICAiRGlhbW9uZDsiOiAiXHUyMmM0IiwKICAgICJEaWZmZXJlbnRpYWxEOyI6ICJcdTIxNDYiLAogICAgIkRvcGY7IjogIlxVMDAwMWQ1M2IiLAogICAgIkRvdDsiOiAiXHhhOCIsCiAgICAiRG90RG90OyI6ICJcdTIwZGMiLAogICAgIkRvdEVxdWFsOyI6ICJcdTIyNTAiLAogICAgIkRvdWJsZUNvbnRvdXJJbnRlZ3JhbDsiOiAiXHUyMjJmIiwKICAgICJEb3VibGVEb3Q7IjogIlx4YTgiLAogICAgIkRvdWJsZURvd25BcnJvdzsiOiAiXHUyMWQzIiwKICAgICJEb3VibGVMZWZ0QXJyb3c7IjogIlx1MjFkMCIsCiAgICAiRG91YmxlTGVmdFJpZ2h0QXJyb3c7IjogIlx1MjFkNCIsCiAgICAiRG91YmxlTGVmdFRlZTsiOiAiXHUyYWU0IiwKICAgICJEb3VibGVMb25nTGVmdEFycm93OyI6ICJcdTI3ZjgiLAogICAgIkRvdWJsZUxvbmdMZWZ0UmlnaHRBcnJvdzsiOiAiXHUyN2ZhIiwKICAgICJEb3VibGVMb25nUmlnaHRBcnJvdzsiOiAiXHUyN2Y5IiwKICAgICJEb3VibGVSaWdodEFycm93OyI6ICJcdTIxZDIiLAogICAgIkRvdWJsZVJpZ2h0VGVlOyI6ICJcdTIyYTgiLAogICAgIkRvdWJsZVVwQXJyb3c7IjogIlx1MjFkMSIsCiAgICAiRG91YmxlVXBEb3duQXJyb3c7IjogIlx1MjFkNSIsCiAgICAiRG91YmxlVmVydGljYWxCYXI7IjogIlx1MjIyNSIsCiAgICAiRG93bkFycm93OyI6ICJcdTIxOTMiLAogICAgIkRvd25BcnJvd0JhcjsiOiAiXHUyOTEzIiwKICAgICJEb3duQXJyb3dVcEFycm93OyI6ICJcdTIxZjUiLAogICAgIkRvd25CcmV2ZTsiOiAiXHUwMzExIiwKICAgICJEb3duTGVmdFJpZ2h0VmVjdG9yOyI6ICJcdTI5NTAiLAogICAgIkRvd25MZWZ0VGVlVmVjdG9yOyI6ICJcdTI5NWUiLAogICAgIkRvd25MZWZ0VmVjdG9yOyI6ICJcdTIxYmQiLAogICAgIkRvd25MZWZ0VmVjdG9yQmFyOyI6ICJcdTI5NTYiLAogICAgIkRvd25SaWdodFRlZVZlY3RvcjsiOiAiXHUyOTVmIiwKICAgICJEb3duUmlnaHRWZWN0b3I7IjogIlx1MjFjMSIsCiAgICAiRG93blJpZ2h0VmVjdG9yQmFyOyI6ICJcdTI5NTciLAogICAgIkRvd25UZWU7IjogIlx1MjJhNCIsCiAgICAiRG93blRlZUFycm93OyI6ICJcdTIxYTciLAogICAgIkRvd25hcnJvdzsiOiAiXHUyMWQzIiwKICAgICJEc2NyOyI6ICJcVTAwMDFkNDlmIiwKICAgICJEc3Ryb2s7IjogIlx1MDExMCIsCiAgICAiRU5HOyI6ICJcdTAxNGEiLAogICAgIkVUSCI6ICJceGQwIiwKICAgICJFVEg7IjogIlx4ZDAiLAogICAgIkVhY3V0ZSI6ICJceGM5IiwKICAgICJFYWN1dGU7IjogIlx4YzkiLAogICAgIkVjYXJvbjsiOiAiXHUwMTFhIiwKICAgICJFY2lyYyI6ICJceGNhIiwKICAgICJFY2lyYzsiOiAiXHhjYSIsCiAgICAiRWN5OyI6ICJcdTA0MmQiLAogICAgIkVkb3Q7IjogIlx1MDExNiIsCiAgICAiRWZyOyI6ICJcVTAwMDFkNTA4IiwKICAgICJFZ3JhdmUiOiAiXHhjOCIsCiAgICAiRWdyYXZlOyI6ICJceGM4IiwKICAgICJFbGVtZW50OyI6ICJcdTIyMDgiLAogICAgIkVtYWNyOyI6ICJcdTAxMTIiLAogICAgIkVtcHR5U21hbGxTcXVhcmU7IjogIlx1MjVmYiIsCiAgICAiRW1wdHlWZXJ5U21hbGxTcXVhcmU7IjogIlx1MjVhYiIsCiAgICAiRW9nb247IjogIlx1MDExOCIsCiAgICAiRW9wZjsiOiAiXFUwMDAxZDUzYyIsCiAgICAiRXBzaWxvbjsiOiAiXHUwMzk1IiwKICAgICJFcXVhbDsiOiAiXHUyYTc1IiwKICAgICJFcXVhbFRpbGRlOyI6ICJcdTIyNDIiLAogICAgIkVxdWlsaWJyaXVtOyI6ICJcdTIxY2MiLAogICAgIkVzY3I7IjogIlx1MjEzMCIsCiAgICAiRXNpbTsiOiAiXHUyYTczIiwKICAgICJFdGE7IjogIlx1MDM5NyIsCiAgICAiRXVtbCI6ICJceGNiIiwKICAgICJFdW1sOyI6ICJceGNiIiwKICAgICJFeGlzdHM7IjogIlx1MjIwMyIsCiAgICAiRXhwb25lbnRpYWxFOyI6ICJcdTIxNDciLAogICAgIkZjeTsiOiAiXHUwNDI0IiwKICAgICJGZnI7IjogIlxVMDAwMWQ1MDkiLAogICAgIkZpbGxlZFNtYWxsU3F1YXJlOyI6ICJcdTI1ZmMiLAogICAgIkZpbGxlZFZlcnlTbWFsbFNxdWFyZTsiOiAiXHUyNWFhIiwKICAgICJGb3BmOyI6ICJcVTAwMDFkNTNkIiwKICAgICJGb3JBbGw7IjogIlx1MjIwMCIsCiAgICAiRm91cmllcnRyZjsiOiAiXHUyMTMxIiwKICAgICJGc2NyOyI6ICJcdTIxMzEiLAogICAgIkdKY3k7IjogIlx1MDQwMyIsCiAgICAiR1QiOiAiPiIsCiAgICAiR1Q7IjogIj4iLAogICAgIkdhbW1hOyI6ICJcdTAzOTMiLAogICAgIkdhbW1hZDsiOiAiXHUwM2RjIiwKICAgICJHYnJldmU7IjogIlx1MDExZSIsCiAgICAiR2NlZGlsOyI6ICJcdTAxMjIiLAogICAgIkdjaXJjOyI6ICJcdTAxMWMiLAogICAgIkdjeTsiOiAiXHUwNDEzIiwKICAgICJHZG90OyI6ICJcdTAxMjAiLAogICAgIkdmcjsiOiAiXFUwMDAxZDUwYSIsCiAgICAiR2c7IjogIlx1MjJkOSIsCiAgICAiR29wZjsiOiAiXFUwMDAxZDUzZSIsCiAgICAiR3JlYXRlckVxdWFsOyI6ICJcdTIyNjUiLAogICAgIkdyZWF0ZXJFcXVhbExlc3M7IjogIlx1MjJkYiIsCiAgICAiR3JlYXRlckZ1bGxFcXVhbDsiOiAiXHUyMjY3IiwKICAgICJHcmVhdGVyR3JlYXRlcjsiOiAiXHUyYWEyIiwKICAgICJHcmVhdGVyTGVzczsiOiAiXHUyMjc3IiwKICAgICJHcmVhdGVyU2xhbnRFcXVhbDsiOiAiXHUyYTdlIiwKICAgICJHcmVhdGVyVGlsZGU7IjogIlx1MjI3MyIsCiAgICAiR3NjcjsiOiAiXFUwMDAxZDRhMiIsCiAgICAiR3Q7IjogIlx1MjI2YiIsCiAgICAiSEFSRGN5OyI6ICJcdTA0MmEiLAogICAgIkhhY2VrOyI6ICJcdTAyYzciLAogICAgIkhhdDsiOiAiXiIsCiAgICAiSGNpcmM7IjogIlx1MDEyNCIsCiAgICAiSGZyOyI6ICJcdTIxMGMiLAogICAgIkhpbGJlcnRTcGFjZTsiOiAiXHUyMTBiIiwKICAgICJIb3BmOyI6ICJcdTIxMGQiLAogICAgIkhvcml6b250YWxMaW5lOyI6ICJcdTI1MDAiLAogICAgIkhzY3I7IjogIlx1MjEwYiIsCiAgICAiSHN0cm9rOyI6ICJcdTAxMjYiLAogICAgIkh1bXBEb3duSHVtcDsiOiAiXHUyMjRlIiwKICAgICJIdW1wRXF1YWw7IjogIlx1MjI0ZiIsCiAgICAiSUVjeTsiOiAiXHUwNDE1IiwKICAgICJJSmxpZzsiOiAiXHUwMTMyIiwKICAgICJJT2N5OyI6ICJcdTA0MDEiLAogICAgIklhY3V0ZSI6ICJceGNkIiwKICAgICJJYWN1dGU7IjogIlx4Y2QiLAogICAgIkljaXJjIjogIlx4Y2UiLAogICAgIkljaXJjOyI6ICJceGNlIiwKICAgICJJY3k7IjogIlx1MDQxOCIsCiAgICAiSWRvdDsiOiAiXHUwMTMwIiwKICAgICJJZnI7IjogIlx1MjExMSIsCiAgICAiSWdyYXZlIjogIlx4Y2MiLAogICAgIklncmF2ZTsiOiAiXHhjYyIsCiAgICAiSW07IjogIlx1MjExMSIsCiAgICAiSW1hY3I7IjogIlx1MDEyYSIsCiAgICAiSW1hZ2luYXJ5STsiOiAiXHUyMTQ4IiwKICAgICJJbXBsaWVzOyI6ICJcdTIxZDIiLAogICAgIkludDsiOiAiXHUyMjJjIiwKICAgICJJbnRlZ3JhbDsiOiAiXHUyMjJiIiwKICAgICJJbnRlcnNlY3Rpb247IjogIlx1MjJjMiIsCiAgICAiSW52aXNpYmxlQ29tbWE7IjogIlx1MjA2MyIsCiAgICAiSW52aXNpYmxlVGltZXM7IjogIlx1MjA2MiIsCiAgICAiSW9nb247IjogIlx1MDEyZSIsCiAgICAiSW9wZjsiOiAiXFUwMDAxZDU0MCIsCiAgICAiSW90YTsiOiAiXHUwMzk5IiwKICAgICJJc2NyOyI6ICJcdTIxMTAiLAogICAgIkl0aWxkZTsiOiAiXHUwMTI4IiwKICAgICJJdWtjeTsiOiAiXHUwNDA2IiwKICAgICJJdW1sIjogIlx4Y2YiLAogICAgIkl1bWw7IjogIlx4Y2YiLAogICAgIkpjaXJjOyI6ICJcdTAxMzQiLAogICAgIkpjeTsiOiAiXHUwNDE5IiwKICAgICJKZnI7IjogIlxVMDAwMWQ1MGQiLAogICAgIkpvcGY7IjogIlxVMDAwMWQ1NDEiLAogICAgIkpzY3I7IjogIlxVMDAwMWQ0YTUiLAogICAgIkpzZXJjeTsiOiAiXHUwNDA4IiwKICAgICJKdWtjeTsiOiAiXHUwNDA0IiwKICAgICJLSGN5OyI6ICJcdTA0MjUiLAogICAgIktKY3k7IjogIlx1MDQwYyIsCiAgICAiS2FwcGE7IjogIlx1MDM5YSIsCiAgICAiS2NlZGlsOyI6ICJcdTAxMzYiLAogICAgIktjeTsiOiAiXHUwNDFhIiwKICAgICJLZnI7IjogIlxVMDAwMWQ1MGUiLAogICAgIktvcGY7IjogIlxVMDAwMWQ1NDIiLAogICAgIktzY3I7IjogIlxVMDAwMWQ0YTYiLAogICAgIkxKY3k7IjogIlx1MDQwOSIsCiAgICAiTFQiOiAiPCIsCiAgICAiTFQ7IjogIjwiLAogICAgIkxhY3V0ZTsiOiAiXHUwMTM5IiwKICAgICJMYW1iZGE7IjogIlx1MDM5YiIsCiAgICAiTGFuZzsiOiAiXHUyN2VhIiwKICAgICJMYXBsYWNldHJmOyI6ICJcdTIxMTIiLAogICAgIkxhcnI7IjogIlx1MjE5ZSIsCiAgICAiTGNhcm9uOyI6ICJcdTAxM2QiLAogICAgIkxjZWRpbDsiOiAiXHUwMTNiIiwKICAgICJMY3k7IjogIlx1MDQxYiIsCiAgICAiTGVmdEFuZ2xlQnJhY2tldDsiOiAiXHUyN2U4IiwKICAgICJMZWZ0QXJyb3c7IjogIlx1MjE5MCIsCiAgICAiTGVmdEFycm93QmFyOyI6ICJcdTIxZTQiLAogICAgIkxlZnRBcnJvd1JpZ2h0QXJyb3c7IjogIlx1MjFjNiIsCiAgICAiTGVmdENlaWxpbmc7IjogIlx1MjMwOCIsCiAgICAiTGVmdERvdWJsZUJyYWNrZXQ7IjogIlx1MjdlNiIsCiAgICAiTGVmdERvd25UZWVWZWN0b3I7IjogIlx1Mjk2MSIsCiAgICAiTGVmdERvd25WZWN0b3I7IjogIlx1MjFjMyIsCiAgICAiTGVmdERvd25WZWN0b3JCYXI7IjogIlx1Mjk1OSIsCiAgICAiTGVmdEZsb29yOyI6ICJcdTIzMGEiLAogICAgIkxlZnRSaWdodEFycm93OyI6ICJcdTIxOTQiLAogICAgIkxlZnRSaWdodFZlY3RvcjsiOiAiXHUyOTRlIiwKICAgICJMZWZ0VGVlOyI6ICJcdTIyYTMiLAogICAgIkxlZnRUZWVBcnJvdzsiOiAiXHUyMWE0IiwKICAgICJMZWZ0VGVlVmVjdG9yOyI6ICJcdTI5NWEiLAogICAgIkxlZnRUcmlhbmdsZTsiOiAiXHUyMmIyIiwKICAgICJMZWZ0VHJpYW5nbGVCYXI7IjogIlx1MjljZiIsCiAgICAiTGVmdFRyaWFuZ2xlRXF1YWw7IjogIlx1MjJiNCIsCiAgICAiTGVmdFVwRG93blZlY3RvcjsiOiAiXHUyOTUxIiwKICAgICJMZWZ0VXBUZWVWZWN0b3I7IjogIlx1Mjk2MCIsCiAgICAiTGVmdFVwVmVjdG9yOyI6ICJcdTIxYmYiLAogICAgIkxlZnRVcFZlY3RvckJhcjsiOiAiXHUyOTU4IiwKICAgICJMZWZ0VmVjdG9yOyI6ICJcdTIxYmMiLAogICAgIkxlZnRWZWN0b3JCYXI7IjogIlx1Mjk1MiIsCiAgICAiTGVmdGFycm93OyI6ICJcdTIxZDAiLAogICAgIkxlZnRyaWdodGFycm93OyI6ICJcdTIxZDQiLAogICAgIkxlc3NFcXVhbEdyZWF0ZXI7IjogIlx1MjJkYSIsCiAgICAiTGVzc0Z1bGxFcXVhbDsiOiAiXHUyMjY2IiwKICAgICJMZXNzR3JlYXRlcjsiOiAiXHUyMjc2IiwKICAgICJMZXNzTGVzczsiOiAiXHUyYWExIiwKICAgICJMZXNzU2xhbnRFcXVhbDsiOiAiXHUyYTdkIiwKICAgICJMZXNzVGlsZGU7IjogIlx1MjI3MiIsCiAgICAiTGZyOyI6ICJcVTAwMDFkNTBmIiwKICAgICJMbDsiOiAiXHUyMmQ4IiwKICAgICJMbGVmdGFycm93OyI6ICJcdTIxZGEiLAogICAgIkxtaWRvdDsiOiAiXHUwMTNmIiwKICAgICJMb25nTGVmdEFycm93OyI6ICJcdTI3ZjUiLAogICAgIkxvbmdMZWZ0UmlnaHRBcnJvdzsiOiAiXHUyN2Y3IiwKICAgICJMb25nUmlnaHRBcnJvdzsiOiAiXHUyN2Y2IiwKICAgICJMb25nbGVmdGFycm93OyI6ICJcdTI3ZjgiLAogICAgIkxvbmdsZWZ0cmlnaHRhcnJvdzsiOiAiXHUyN2ZhIiwKICAgICJMb25ncmlnaHRhcnJvdzsiOiAiXHUyN2Y5IiwKICAgICJMb3BmOyI6ICJcVTAwMDFkNTQzIiwKICAgICJMb3dlckxlZnRBcnJvdzsiOiAiXHUyMTk5IiwKICAgICJMb3dlclJpZ2h0QXJyb3c7IjogIlx1MjE5OCIsCiAgICAiTHNjcjsiOiAiXHUyMTEyIiwKICAgICJMc2g7IjogIlx1MjFiMCIsCiAgICAiTHN0cm9rOyI6ICJcdTAxNDEiLAogICAgIkx0OyI6ICJcdTIyNmEiLAogICAgIk1hcDsiOiAiXHUyOTA1IiwKICAgICJNY3k7IjogIlx1MDQxYyIsCiAgICAiTWVkaXVtU3BhY2U7IjogIlx1MjA1ZiIsCiAgICAiTWVsbGludHJmOyI6ICJcdTIxMzMiLAogICAgIk1mcjsiOiAiXFUwMDAxZDUxMCIsCiAgICAiTWludXNQbHVzOyI6ICJcdTIyMTMiLAogICAgIk1vcGY7IjogIlxVMDAwMWQ1NDQiLAogICAgIk1zY3I7IjogIlx1MjEzMyIsCiAgICAiTXU7IjogIlx1MDM5YyIsCiAgICAiTkpjeTsiOiAiXHUwNDBhIiwKICAgICJOYWN1dGU7IjogIlx1MDE0MyIsCiAgICAiTmNhcm9uOyI6ICJcdTAxNDciLAogICAgIk5jZWRpbDsiOiAiXHUwMTQ1IiwKICAgICJOY3k7IjogIlx1MDQxZCIsCiAgICAiTmVnYXRpdmVNZWRpdW1TcGFjZTsiOiAiXHUyMDBiIiwKICAgICJOZWdhdGl2ZVRoaWNrU3BhY2U7IjogIlx1MjAwYiIsCiAgICAiTmVnYXRpdmVUaGluU3BhY2U7IjogIlx1MjAwYiIsCiAgICAiTmVnYXRpdmVWZXJ5VGhpblNwYWNlOyI6ICJcdTIwMGIiLAogICAgIk5lc3RlZEdyZWF0ZXJHcmVhdGVyOyI6ICJcdTIyNmIiLAogICAgIk5lc3RlZExlc3NMZXNzOyI6ICJcdTIyNmEiLAogICAgIk5ld0xpbmU7IjogIlxuIiwKICAgICJOZnI7IjogIlxVMDAwMWQ1MTEiLAogICAgIk5vQnJlYWs7IjogIlx1MjA2MCIsCiAgICAiTm9uQnJlYWtpbmdTcGFjZTsiOiAiXHhhMCIsCiAgICAiTm9wZjsiOiAiXHUyMTE1IiwKICAgICJOb3Q7IjogIlx1MmFlYyIsCiAgICAiTm90Q29uZ3J1ZW50OyI6ICJcdTIyNjIiLAogICAgIk5vdEN1cENhcDsiOiAiXHUyMjZkIiwKICAgICJOb3REb3VibGVWZXJ0aWNhbEJhcjsiOiAiXHUyMjI2IiwKICAgICJOb3RFbGVtZW50OyI6ICJcdTIyMDkiLAogICAgIk5vdEVxdWFsOyI6ICJcdTIyNjAiLAogICAgIk5vdEVxdWFsVGlsZGU7IjogIlx1MjI0Mlx1MDMzOCIsCiAgICAiTm90RXhpc3RzOyI6ICJcdTIyMDQiLAogICAgIk5vdEdyZWF0ZXI7IjogIlx1MjI2ZiIsCiAgICAiTm90R3JlYXRlckVxdWFsOyI6ICJcdTIyNzEiLAogICAgIk5vdEdyZWF0ZXJGdWxsRXF1YWw7IjogIlx1MjI2N1x1MDMzOCIsCiAgICAiTm90R3JlYXRlckdyZWF0ZXI7IjogIlx1MjI2Ylx1MDMzOCIsCiAgICAiTm90R3JlYXRlckxlc3M7IjogIlx1MjI3OSIsCiAgICAiTm90R3JlYXRlclNsYW50RXF1YWw7IjogIlx1MmE3ZVx1MDMzOCIsCiAgICAiTm90R3JlYXRlclRpbGRlOyI6ICJcdTIyNzUiLAogICAgIk5vdEh1bXBEb3duSHVtcDsiOiAiXHUyMjRlXHUwMzM4IiwKICAgICJOb3RIdW1wRXF1YWw7IjogIlx1MjI0Zlx1MDMzOCIsCiAgICAiTm90TGVmdFRyaWFuZ2xlOyI6ICJcdTIyZWEiLAogICAgIk5vdExlZnRUcmlhbmdsZUJhcjsiOiAiXHUyOWNmXHUwMzM4IiwKICAgICJOb3RMZWZ0VHJpYW5nbGVFcXVhbDsiOiAiXHUyMmVjIiwKICAgICJOb3RMZXNzOyI6ICJcdTIyNmUiLAogICAgIk5vdExlc3NFcXVhbDsiOiAiXHUyMjcwIiwKICAgICJOb3RMZXNzR3JlYXRlcjsiOiAiXHUyMjc4IiwKICAgICJOb3RMZXNzTGVzczsiOiAiXHUyMjZhXHUwMzM4IiwKICAgICJOb3RMZXNzU2xhbnRFcXVhbDsiOiAiXHUyYTdkXHUwMzM4IiwKICAgICJOb3RMZXNzVGlsZGU7IjogIlx1MjI3NCIsCiAgICAiTm90TmVzdGVkR3JlYXRlckdyZWF0ZXI7IjogIlx1MmFhMlx1MDMzOCIsCiAgICAiTm90TmVzdGVkTGVzc0xlc3M7IjogIlx1MmFhMVx1MDMzOCIsCiAgICAiTm90UHJlY2VkZXM7IjogIlx1MjI4MCIsCiAgICAiTm90UHJlY2VkZXNFcXVhbDsiOiAiXHUyYWFmXHUwMzM4IiwKICAgICJOb3RQcmVjZWRlc1NsYW50RXF1YWw7IjogIlx1MjJlMCIsCiAgICAiTm90UmV2ZXJzZUVsZW1lbnQ7IjogIlx1MjIwYyIsCiAgICAiTm90UmlnaHRUcmlhbmdsZTsiOiAiXHUyMmViIiwKICAgICJOb3RSaWdodFRyaWFuZ2xlQmFyOyI6ICJcdTI5ZDBcdTAzMzgiLAogICAgIk5vdFJpZ2h0VHJpYW5nbGVFcXVhbDsiOiAiXHUyMmVkIiwKICAgICJOb3RTcXVhcmVTdWJzZXQ7IjogIlx1MjI4Zlx1MDMzOCIsCiAgICAiTm90U3F1YXJlU3Vic2V0RXF1YWw7IjogIlx1MjJlMiIsCiAgICAiTm90U3F1YXJlU3VwZXJzZXQ7IjogIlx1MjI5MFx1MDMzOCIsCiAgICAiTm90U3F1YXJlU3VwZXJzZXRFcXVhbDsiOiAiXHUyMmUzIiwKICAgICJOb3RTdWJzZXQ7IjogIlx1MjI4Mlx1MjBkMiIsCiAgICAiTm90U3Vic2V0RXF1YWw7IjogIlx1MjI4OCIsCiAgICAiTm90U3VjY2VlZHM7IjogIlx1MjI4MSIsCiAgICAiTm90U3VjY2VlZHNFcXVhbDsiOiAiXHUyYWIwXHUwMzM4IiwKICAgICJOb3RTdWNjZWVkc1NsYW50RXF1YWw7IjogIlx1MjJlMSIsCiAgICAiTm90U3VjY2VlZHNUaWxkZTsiOiAiXHUyMjdmXHUwMzM4IiwKICAgICJOb3RTdXBlcnNldDsiOiAiXHUyMjgzXHUyMGQyIiwKICAgICJOb3RTdXBlcnNldEVxdWFsOyI6ICJcdTIyODkiLAogICAgIk5vdFRpbGRlOyI6ICJcdTIyNDEiLAogICAgIk5vdFRpbGRlRXF1YWw7IjogIlx1MjI0NCIsCiAgICAiTm90VGlsZGVGdWxsRXF1YWw7IjogIlx1MjI0NyIsCiAgICAiTm90VGlsZGVUaWxkZTsiOiAiXHUyMjQ5IiwKICAgICJOb3RWZXJ0aWNhbEJhcjsiOiAiXHUyMjI0IiwKICAgICJOc2NyOyI6ICJcVTAwMDFkNGE5IiwKICAgICJOdGlsZGUiOiAiXHhkMSIsCiAgICAiTnRpbGRlOyI6ICJceGQxIiwKICAgICJOdTsiOiAiXHUwMzlkIiwKICAgICJPRWxpZzsiOiAiXHUwMTUyIiwKICAgICJPYWN1dGUiOiAiXHhkMyIsCiAgICAiT2FjdXRlOyI6ICJceGQzIiwKICAgICJPY2lyYyI6ICJceGQ0IiwKICAgICJPY2lyYzsiOiAiXHhkNCIsCiAgICAiT2N5OyI6ICJcdTA0MWUiLAogICAgIk9kYmxhYzsiOiAiXHUwMTUwIiwKICAgICJPZnI7IjogIlxVMDAwMWQ1MTIiLAogICAgIk9ncmF2ZSI6ICJceGQyIiwKICAgICJPZ3JhdmU7IjogIlx4ZDIiLAogICAgIk9tYWNyOyI6ICJcdTAxNGMiLAogICAgIk9tZWdhOyI6ICJcdTAzYTkiLAogICAgIk9taWNyb247IjogIlx1MDM5ZiIsCiAgICAiT29wZjsiOiAiXFUwMDAxZDU0NiIsCiAgICAiT3BlbkN1cmx5RG91YmxlUXVvdGU7IjogIlx1MjAxYyIsCiAgICAiT3BlbkN1cmx5UXVvdGU7IjogIlx1MjAxOCIsCiAgICAiT3I7IjogIlx1MmE1NCIsCiAgICAiT3NjcjsiOiAiXFUwMDAxZDRhYSIsCiAgICAiT3NsYXNoIjogIlx4ZDgiLAogICAgIk9zbGFzaDsiOiAiXHhkOCIsCiAgICAiT3RpbGRlIjogIlx4ZDUiLAogICAgIk90aWxkZTsiOiAiXHhkNSIsCiAgICAiT3RpbWVzOyI6ICJcdTJhMzciLAogICAgIk91bWwiOiAiXHhkNiIsCiAgICAiT3VtbDsiOiAiXHhkNiIsCiAgICAiT3ZlckJhcjsiOiAiXHUyMDNlIiwKICAgICJPdmVyQnJhY2U7IjogIlx1MjNkZSIsCiAgICAiT3ZlckJyYWNrZXQ7IjogIlx1MjNiNCIsCiAgICAiT3ZlclBhcmVudGhlc2lzOyI6ICJcdTIzZGMiLAogICAgIlBhcnRpYWxEOyI6ICJcdTIyMDIiLAogICAgIlBjeTsiOiAiXHUwNDFmIiwKICAgICJQZnI7IjogIlxVMDAwMWQ1MTMiLAogICAgIlBoaTsiOiAiXHUwM2E2IiwKICAgICJQaTsiOiAiXHUwM2EwIiwKICAgICJQbHVzTWludXM7IjogIlx4YjEiLAogICAgIlBvaW5jYXJlcGxhbmU7IjogIlx1MjEwYyIsCiAgICAiUG9wZjsiOiAiXHUyMTE5IiwKICAgICJQcjsiOiAiXHUyYWJiIiwKICAgICJQcmVjZWRlczsiOiAiXHUyMjdhIiwKICAgICJQcmVjZWRlc0VxdWFsOyI6ICJcdTJhYWYiLAogICAgIlByZWNlZGVzU2xhbnRFcXVhbDsiOiAiXHUyMjdjIiwKICAgICJQcmVjZWRlc1RpbGRlOyI6ICJcdTIyN2UiLAogICAgIlByaW1lOyI6ICJcdTIwMzMiLAogICAgIlByb2R1Y3Q7IjogIlx1MjIwZiIsCiAgICAiUHJvcG9ydGlvbjsiOiAiXHUyMjM3IiwKICAgICJQcm9wb3J0aW9uYWw7IjogIlx1MjIxZCIsCiAgICAiUHNjcjsiOiAiXFUwMDAxZDRhYiIsCiAgICAiUHNpOyI6ICJcdTAzYTgiLAogICAgIlFVT1QiOiAiXCIiLAogICAgIlFVT1Q7IjogIlwiIiwKICAgICJRZnI7IjogIlxVMDAwMWQ1MTQiLAogICAgIlFvcGY7IjogIlx1MjExYSIsCiAgICAiUXNjcjsiOiAiXFUwMDAxZDRhYyIsCiAgICAiUkJhcnI7IjogIlx1MjkxMCIsCiAgICAiUkVHIjogIlx4YWUiLAogICAgIlJFRzsiOiAiXHhhZSIsCiAgICAiUmFjdXRlOyI6ICJcdTAxNTQiLAogICAgIlJhbmc7IjogIlx1MjdlYiIsCiAgICAiUmFycjsiOiAiXHUyMWEwIiwKICAgICJSYXJydGw7IjogIlx1MjkxNiIsCiAgICAiUmNhcm9uOyI6ICJcdTAxNTgiLAogICAgIlJjZWRpbDsiOiAiXHUwMTU2IiwKICAgICJSY3k7IjogIlx1MDQyMCIsCiAgICAiUmU7IjogIlx1MjExYyIsCiAgICAiUmV2ZXJzZUVsZW1lbnQ7IjogIlx1MjIwYiIsCiAgICAiUmV2ZXJzZUVxdWlsaWJyaXVtOyI6ICJcdTIxY2IiLAogICAgIlJldmVyc2VVcEVxdWlsaWJyaXVtOyI6ICJcdTI5NmYiLAogICAgIlJmcjsiOiAiXHUyMTFjIiwKICAgICJSaG87IjogIlx1MDNhMSIsCiAgICAiUmlnaHRBbmdsZUJyYWNrZXQ7IjogIlx1MjdlOSIsCiAgICAiUmlnaHRBcnJvdzsiOiAiXHUyMTkyIiwKICAgICJSaWdodEFycm93QmFyOyI6ICJcdTIxZTUiLAogICAgIlJpZ2h0QXJyb3dMZWZ0QXJyb3c7IjogIlx1MjFjNCIsCiAgICAiUmlnaHRDZWlsaW5nOyI6ICJcdTIzMDkiLAogICAgIlJpZ2h0RG91YmxlQnJhY2tldDsiOiAiXHUyN2U3IiwKICAgICJSaWdodERvd25UZWVWZWN0b3I7IjogIlx1Mjk1ZCIsCiAgICAiUmlnaHREb3duVmVjdG9yOyI6ICJcdTIxYzIiLAogICAgIlJpZ2h0RG93blZlY3RvckJhcjsiOiAiXHUyOTU1IiwKICAgICJSaWdodEZsb29yOyI6ICJcdTIzMGIiLAogICAgIlJpZ2h0VGVlOyI6ICJcdTIyYTIiLAogICAgIlJpZ2h0VGVlQXJyb3c7IjogIlx1MjFhNiIsCiAgICAiUmlnaHRUZWVWZWN0b3I7IjogIlx1Mjk1YiIsCiAgICAiUmlnaHRUcmlhbmdsZTsiOiAiXHUyMmIzIiwKICAgICJSaWdodFRyaWFuZ2xlQmFyOyI6ICJcdTI5ZDAiLAogICAgIlJpZ2h0VHJpYW5nbGVFcXVhbDsiOiAiXHUyMmI1IiwKICAgICJSaWdodFVwRG93blZlY3RvcjsiOiAiXHUyOTRmIiwKICAgICJSaWdodFVwVGVlVmVjdG9yOyI6ICJcdTI5NWMiLAogICAgIlJpZ2h0VXBWZWN0b3I7IjogIlx1MjFiZSIsCiAgICAiUmlnaHRVcFZlY3RvckJhcjsiOiAiXHUyOTU0IiwKICAgICJSaWdodFZlY3RvcjsiOiAiXHUyMWMwIiwKICAgICJSaWdodFZlY3RvckJhcjsiOiAiXHUyOTUzIiwKICAgICJSaWdodGFycm93OyI6ICJcdTIxZDIiLAogICAgIlJvcGY7IjogIlx1MjExZCIsCiAgICAiUm91bmRJbXBsaWVzOyI6ICJcdTI5NzAiLAogICAgIlJyaWdodGFycm93OyI6ICJcdTIxZGIiLAogICAgIlJzY3I7IjogIlx1MjExYiIsCiAgICAiUnNoOyI6ICJcdTIxYjEiLAogICAgIlJ1bGVEZWxheWVkOyI6ICJcdTI5ZjQiLAogICAgIlNIQ0hjeTsiOiAiXHUwNDI5IiwKICAgICJTSGN5OyI6ICJcdTA0MjgiLAogICAgIlNPRlRjeTsiOiAiXHUwNDJjIiwKICAgICJTYWN1dGU7IjogIlx1MDE1YSIsCiAgICAiU2M7IjogIlx1MmFiYyIsCiAgICAiU2Nhcm9uOyI6ICJcdTAxNjAiLAogICAgIlNjZWRpbDsiOiAiXHUwMTVlIiwKICAgICJTY2lyYzsiOiAiXHUwMTVjIiwKICAgICJTY3k7IjogIlx1MDQyMSIsCiAgICAiU2ZyOyI6ICJcVTAwMDFkNTE2IiwKICAgICJTaG9ydERvd25BcnJvdzsiOiAiXHUyMTkzIiwKICAgICJTaG9ydExlZnRBcnJvdzsiOiAiXHUyMTkwIiwKICAgICJTaG9ydFJpZ2h0QXJyb3c7IjogIlx1MjE5MiIsCiAgICAiU2hvcnRVcEFycm93OyI6ICJcdTIxOTEiLAogICAgIlNpZ21hOyI6ICJcdTAzYTMiLAogICAgIlNtYWxsQ2lyY2xlOyI6ICJcdTIyMTgiLAogICAgIlNvcGY7IjogIlxVMDAwMWQ1NGEiLAogICAgIlNxcnQ7IjogIlx1MjIxYSIsCiAgICAiU3F1YXJlOyI6ICJcdTI1YTEiLAogICAgIlNxdWFyZUludGVyc2VjdGlvbjsiOiAiXHUyMjkzIiwKICAgICJTcXVhcmVTdWJzZXQ7IjogIlx1MjI4ZiIsCiAgICAiU3F1YXJlU3Vic2V0RXF1YWw7IjogIlx1MjI5MSIsCiAgICAiU3F1YXJlU3VwZXJzZXQ7IjogIlx1MjI5MCIsCiAgICAiU3F1YXJlU3VwZXJzZXRFcXVhbDsiOiAiXHUyMjkyIiwKICAgICJTcXVhcmVVbmlvbjsiOiAiXHUyMjk0IiwKICAgICJTc2NyOyI6ICJcVTAwMDFkNGFlIiwKICAgICJTdGFyOyI6ICJcdTIyYzYiLAogICAgIlN1YjsiOiAiXHUyMmQwIiwKICAgICJTdWJzZXQ7IjogIlx1MjJkMCIsCiAgICAiU3Vic2V0RXF1YWw7IjogIlx1MjI4NiIsCiAgICAiU3VjY2VlZHM7IjogIlx1MjI3YiIsCiAgICAiU3VjY2VlZHNFcXVhbDsiOiAiXHUyYWIwIiwKICAgICJTdWNjZWVkc1NsYW50RXF1YWw7IjogIlx1MjI3ZCIsCiAgICAiU3VjY2VlZHNUaWxkZTsiOiAiXHUyMjdmIiwKICAgICJTdWNoVGhhdDsiOiAiXHUyMjBiIiwKICAgICJTdW07IjogIlx1MjIxMSIsCiAgICAiU3VwOyI6ICJcdTIyZDEiLAogICAgIlN1cGVyc2V0OyI6ICJcdTIyODMiLAogICAgIlN1cGVyc2V0RXF1YWw7IjogIlx1MjI4NyIsCiAgICAiU3Vwc2V0OyI6ICJcdTIyZDEiLAogICAgIlRIT1JOIjogIlx4ZGUiLAogICAgIlRIT1JOOyI6ICJceGRlIiwKICAgICJUUkFERTsiOiAiXHUyMTIyIiwKICAgICJUU0hjeTsiOiAiXHUwNDBiIiwKICAgICJUU2N5OyI6ICJcdTA0MjYiLAogICAgIlRhYjsiOiAiXHQiLAogICAgIlRhdTsiOiAiXHUwM2E0IiwKICAgICJUY2Fyb247IjogIlx1MDE2NCIsCiAgICAiVGNlZGlsOyI6ICJcdTAxNjIiLAogICAgIlRjeTsiOiAiXHUwNDIyIiwKICAgICJUZnI7IjogIlxVMDAwMWQ1MTciLAogICAgIlRoZXJlZm9yZTsiOiAiXHUyMjM0IiwKICAgICJUaGV0YTsiOiAiXHUwMzk4IiwKICAgICJUaGlja1NwYWNlOyI6ICJcdTIwNWZcdTIwMGEiLAogICAgIlRoaW5TcGFjZTsiOiAiXHUyMDA5IiwKICAgICJUaWxkZTsiOiAiXHUyMjNjIiwKICAgICJUaWxkZUVxdWFsOyI6ICJcdTIyNDMiLAogICAgIlRpbGRlRnVsbEVxdWFsOyI6ICJcdTIyNDUiLAogICAgIlRpbGRlVGlsZGU7IjogIlx1MjI0OCIsCiAgICAiVG9wZjsiOiAiXFUwMDAxZDU0YiIsCiAgICAiVHJpcGxlRG90OyI6ICJcdTIwZGIiLAogICAgIlRzY3I7IjogIlxVMDAwMWQ0YWYiLAogICAgIlRzdHJvazsiOiAiXHUwMTY2IiwKICAgICJVYWN1dGUiOiAiXHhkYSIsCiAgICAiVWFjdXRlOyI6ICJceGRhIiwKICAgICJVYXJyOyI6ICJcdTIxOWYiLAogICAgIlVhcnJvY2lyOyI6ICJcdTI5NDkiLAogICAgIlVicmN5OyI6ICJcdTA0MGUiLAogICAgIlVicmV2ZTsiOiAiXHUwMTZjIiwKICAgICJVY2lyYyI6ICJceGRiIiwKICAgICJVY2lyYzsiOiAiXHhkYiIsCiAgICAiVWN5OyI6ICJcdTA0MjMiLAogICAgIlVkYmxhYzsiOiAiXHUwMTcwIiwKICAgICJVZnI7IjogIlxVMDAwMWQ1MTgiLAogICAgIlVncmF2ZSI6ICJceGQ5IiwKICAgICJVZ3JhdmU7IjogIlx4ZDkiLAogICAgIlVtYWNyOyI6ICJcdTAxNmEiLAogICAgIlVuZGVyQmFyOyI6ICJfIiwKICAgICJVbmRlckJyYWNlOyI6ICJcdTIzZGYiLAogICAgIlVuZGVyQnJhY2tldDsiOiAiXHUyM2I1IiwKICAgICJVbmRlclBhcmVudGhlc2lzOyI6ICJcdTIzZGQiLAogICAgIlVuaW9uOyI6ICJcdTIyYzMiLAogICAgIlVuaW9uUGx1czsiOiAiXHUyMjhlIiwKICAgICJVb2dvbjsiOiAiXHUwMTcyIiwKICAgICJVb3BmOyI6ICJcVTAwMDFkNTRjIiwKICAgICJVcEFycm93OyI6ICJcdTIxOTEiLAogICAgIlVwQXJyb3dCYXI7IjogIlx1MjkxMiIsCiAgICAiVXBBcnJvd0Rvd25BcnJvdzsiOiAiXHUyMWM1IiwKICAgICJVcERvd25BcnJvdzsiOiAiXHUyMTk1IiwKICAgICJVcEVxdWlsaWJyaXVtOyI6ICJcdTI5NmUiLAogICAgIlVwVGVlOyI6ICJcdTIyYTUiLAogICAgIlVwVGVlQXJyb3c7IjogIlx1MjFhNSIsCiAgICAiVXBhcnJvdzsiOiAiXHUyMWQxIiwKICAgICJVcGRvd25hcnJvdzsiOiAiXHUyMWQ1IiwKICAgICJVcHBlckxlZnRBcnJvdzsiOiAiXHUyMTk2IiwKICAgICJVcHBlclJpZ2h0QXJyb3c7IjogIlx1MjE5NyIsCiAgICAiVXBzaTsiOiAiXHUwM2QyIiwKICAgICJVcHNpbG9uOyI6ICJcdTAzYTUiLAogICAgIlVyaW5nOyI6ICJcdTAxNmUiLAogICAgIlVzY3I7IjogIlxVMDAwMWQ0YjAiLAogICAgIlV0aWxkZTsiOiAiXHUwMTY4IiwKICAgICJVdW1sIjogIlx4ZGMiLAogICAgIlV1bWw7IjogIlx4ZGMiLAogICAgIlZEYXNoOyI6ICJcdTIyYWIiLAogICAgIlZiYXI7IjogIlx1MmFlYiIsCiAgICAiVmN5OyI6ICJcdTA0MTIiLAogICAgIlZkYXNoOyI6ICJcdTIyYTkiLAogICAgIlZkYXNobDsiOiAiXHUyYWU2IiwKICAgICJWZWU7IjogIlx1MjJjMSIsCiAgICAiVmVyYmFyOyI6ICJcdTIwMTYiLAogICAgIlZlcnQ7IjogIlx1MjAxNiIsCiAgICAiVmVydGljYWxCYXI7IjogIlx1MjIyMyIsCiAgICAiVmVydGljYWxMaW5lOyI6ICJ8IiwKICAgICJWZXJ0aWNhbFNlcGFyYXRvcjsiOiAiXHUyNzU4IiwKICAgICJWZXJ0aWNhbFRpbGRlOyI6ICJcdTIyNDAiLAogICAgIlZlcnlUaGluU3BhY2U7IjogIlx1MjAwYSIsCiAgICAiVmZyOyI6ICJcVTAwMDFkNTE5IiwKICAgICJWb3BmOyI6ICJcVTAwMDFkNTRkIiwKICAgICJWc2NyOyI6ICJcVTAwMDFkNGIxIiwKICAgICJWdmRhc2g7IjogIlx1MjJhYSIsCiAgICAiV2NpcmM7IjogIlx1MDE3NCIsCiAgICAiV2VkZ2U7IjogIlx1MjJjMCIsCiAgICAiV2ZyOyI6ICJcVTAwMDFkNTFhIiwKICAgICJXb3BmOyI6ICJcVTAwMDFkNTRlIiwKICAgICJXc2NyOyI6ICJcVTAwMDFkNGIyIiwKICAgICJYZnI7IjogIlxVMDAwMWQ1MWIiLAogICAgIlhpOyI6ICJcdTAzOWUiLAogICAgIlhvcGY7IjogIlxVMDAwMWQ1NGYiLAogICAgIlhzY3I7IjogIlxVMDAwMWQ0YjMiLAogICAgIllBY3k7IjogIlx1MDQyZiIsCiAgICAiWUljeTsiOiAiXHUwNDA3IiwKICAgICJZVWN5OyI6ICJcdTA0MmUiLAogICAgIllhY3V0ZSI6ICJceGRkIiwKICAgICJZYWN1dGU7IjogIlx4ZGQiLAogICAgIlljaXJjOyI6ICJcdTAxNzYiLAogICAgIlljeTsiOiAiXHUwNDJiIiwKICAgICJZZnI7IjogIlxVMDAwMWQ1MWMiLAogICAgIllvcGY7IjogIlxVMDAwMWQ1NTAiLAogICAgIllzY3I7IjogIlxVMDAwMWQ0YjQiLAogICAgIll1bWw7IjogIlx1MDE3OCIsCiAgICAiWkhjeTsiOiAiXHUwNDE2IiwKICAgICJaYWN1dGU7IjogIlx1MDE3OSIsCiAgICAiWmNhcm9uOyI6ICJcdTAxN2QiLAogICAgIlpjeTsiOiAiXHUwNDE3IiwKICAgICJaZG90OyI6ICJcdTAxN2IiLAogICAgIlplcm9XaWR0aFNwYWNlOyI6ICJcdTIwMGIiLAogICAgIlpldGE7IjogIlx1MDM5NiIsCiAgICAiWmZyOyI6ICJcdTIxMjgiLAogICAgIlpvcGY7IjogIlx1MjEyNCIsCiAgICAiWnNjcjsiOiAiXFUwMDAxZDRiNSIsCiAgICAiYWFjdXRlIjogIlx4ZTEiLAogICAgImFhY3V0ZTsiOiAiXHhlMSIsCiAgICAiYWJyZXZlOyI6ICJcdTAxMDMiLAogICAgImFjOyI6ICJcdTIyM2UiLAogICAgImFjRTsiOiAiXHUyMjNlXHUwMzMzIiwKICAgICJhY2Q7IjogIlx1MjIzZiIsCiAgICAiYWNpcmMiOiAiXHhlMiIsCiAgICAiYWNpcmM7IjogIlx4ZTIiLAogICAgImFjdXRlIjogIlx4YjQiLAogICAgImFjdXRlOyI6ICJceGI0IiwKICAgICJhY3k7IjogIlx1MDQzMCIsCiAgICAiYWVsaWciOiAiXHhlNiIsCiAgICAiYWVsaWc7IjogIlx4ZTYiLAogICAgImFmOyI6ICJcdTIwNjEiLAogICAgImFmcjsiOiAiXFUwMDAxZDUxZSIsCiAgICAiYWdyYXZlIjogIlx4ZTAiLAogICAgImFncmF2ZTsiOiAiXHhlMCIsCiAgICAiYWxlZnN5bTsiOiAiXHUyMTM1IiwKICAgICJhbGVwaDsiOiAiXHUyMTM1IiwKICAgICJhbHBoYTsiOiAiXHUwM2IxIiwKICAgICJhbWFjcjsiOiAiXHUwMTAxIiwKICAgICJhbWFsZzsiOiAiXHUyYTNmIiwKICAgICJhbXAiOiAiJiIsCiAgICAiYW1wOyI6ICImIiwKICAgICJhbmQ7IjogIlx1MjIyNyIsCiAgICAiYW5kYW5kOyI6ICJcdTJhNTUiLAogICAgImFuZGQ7IjogIlx1MmE1YyIsCiAgICAiYW5kc2xvcGU7IjogIlx1MmE1OCIsCiAgICAiYW5kdjsiOiAiXHUyYTVhIiwKICAgICJhbmc7IjogIlx1MjIyMCIsCiAgICAiYW5nZTsiOiAiXHUyOWE0IiwKICAgICJhbmdsZTsiOiAiXHUyMjIwIiwKICAgICJhbmdtc2Q7IjogIlx1MjIyMSIsCiAgICAiYW5nbXNkYWE7IjogIlx1MjlhOCIsCiAgICAiYW5nbXNkYWI7IjogIlx1MjlhOSIsCiAgICAiYW5nbXNkYWM7IjogIlx1MjlhYSIsCiAgICAiYW5nbXNkYWQ7IjogIlx1MjlhYiIsCiAgICAiYW5nbXNkYWU7IjogIlx1MjlhYyIsCiAgICAiYW5nbXNkYWY7IjogIlx1MjlhZCIsCiAgICAiYW5nbXNkYWc7IjogIlx1MjlhZSIsCiAgICAiYW5nbXNkYWg7IjogIlx1MjlhZiIsCiAgICAiYW5ncnQ7IjogIlx1MjIxZiIsCiAgICAiYW5ncnR2YjsiOiAiXHUyMmJlIiwKICAgICJhbmdydHZiZDsiOiAiXHUyOTlkIiwKICAgICJhbmdzcGg7IjogIlx1MjIyMiIsCiAgICAiYW5nc3Q7IjogIlx4YzUiLAogICAgImFuZ3phcnI7IjogIlx1MjM3YyIsCiAgICAiYW9nb247IjogIlx1MDEwNSIsCiAgICAiYW9wZjsiOiAiXFUwMDAxZDU1MiIsCiAgICAiYXA7IjogIlx1MjI0OCIsCiAgICAiYXBFOyI6ICJcdTJhNzAiLAogICAgImFwYWNpcjsiOiAiXHUyYTZmIiwKICAgICJhcGU7IjogIlx1MjI0YSIsCiAgICAiYXBpZDsiOiAiXHUyMjRiIiwKICAgICJhcG9zOyI6ICInIiwKICAgICJhcHByb3g7IjogIlx1MjI0OCIsCiAgICAiYXBwcm94ZXE7IjogIlx1MjI0YSIsCiAgICAiYXJpbmciOiAiXHhlNSIsCiAgICAiYXJpbmc7IjogIlx4ZTUiLAogICAgImFzY3I7IjogIlxVMDAwMWQ0YjYiLAogICAgImFzdDsiOiAiKiIsCiAgICAiYXN5bXA7IjogIlx1MjI0OCIsCiAgICAiYXN5bXBlcTsiOiAiXHUyMjRkIiwKICAgICJhdGlsZGUiOiAiXHhlMyIsCiAgICAiYXRpbGRlOyI6ICJceGUzIiwKICAgICJhdW1sIjogIlx4ZTQiLAogICAgImF1bWw7IjogIlx4ZTQiLAogICAgImF3Y29uaW50OyI6ICJcdTIyMzMiLAogICAgImF3aW50OyI6ICJcdTJhMTEiLAogICAgImJOb3Q7IjogIlx1MmFlZCIsCiAgICAiYmFja2Nvbmc7IjogIlx1MjI0YyIsCiAgICAiYmFja2Vwc2lsb247IjogIlx1MDNmNiIsCiAgICAiYmFja3ByaW1lOyI6ICJcdTIwMzUiLAogICAgImJhY2tzaW07IjogIlx1MjIzZCIsCiAgICAiYmFja3NpbWVxOyI6ICJcdTIyY2QiLAogICAgImJhcnZlZTsiOiAiXHUyMmJkIiwKICAgICJiYXJ3ZWQ7IjogIlx1MjMwNSIsCiAgICAiYmFyd2VkZ2U7IjogIlx1MjMwNSIsCiAgICAiYmJyazsiOiAiXHUyM2I1IiwKICAgICJiYnJrdGJyazsiOiAiXHUyM2I2IiwKICAgICJiY29uZzsiOiAiXHUyMjRjIiwKICAgICJiY3k7IjogIlx1MDQzMSIsCiAgICAiYmRxdW87IjogIlx1MjAxZSIsCiAgICAiYmVjYXVzOyI6ICJcdTIyMzUiLAogICAgImJlY2F1c2U7IjogIlx1MjIzNSIsCiAgICAiYmVtcHR5djsiOiAiXHUyOWIwIiwKICAgICJiZXBzaTsiOiAiXHUwM2Y2IiwKICAgICJiZXJub3U7IjogIlx1MjEyYyIsCiAgICAiYmV0YTsiOiAiXHUwM2IyIiwKICAgICJiZXRoOyI6ICJcdTIxMzYiLAogICAgImJldHdlZW47IjogIlx1MjI2YyIsCiAgICAiYmZyOyI6ICJcVTAwMDFkNTFmIiwKICAgICJiaWdjYXA7IjogIlx1MjJjMiIsCiAgICAiYmlnY2lyYzsiOiAiXHUyNWVmIiwKICAgICJiaWdjdXA7IjogIlx1MjJjMyIsCiAgICAiYmlnb2RvdDsiOiAiXHUyYTAwIiwKICAgICJiaWdvcGx1czsiOiAiXHUyYTAxIiwKICAgICJiaWdvdGltZXM7IjogIlx1MmEwMiIsCiAgICAiYmlnc3FjdXA7IjogIlx1MmEwNiIsCiAgICAiYmlnc3RhcjsiOiAiXHUyNjA1IiwKICAgICJiaWd0cmlhbmdsZWRvd247IjogIlx1MjViZCIsCiAgICAiYmlndHJpYW5nbGV1cDsiOiAiXHUyNWIzIiwKICAgICJiaWd1cGx1czsiOiAiXHUyYTA0IiwKICAgICJiaWd2ZWU7IjogIlx1MjJjMSIsCiAgICAiYmlnd2VkZ2U7IjogIlx1MjJjMCIsCiAgICAiYmthcm93OyI6ICJcdTI5MGQiLAogICAgImJsYWNrbG96ZW5nZTsiOiAiXHUyOWViIiwKICAgICJibGFja3NxdWFyZTsiOiAiXHUyNWFhIiwKICAgICJibGFja3RyaWFuZ2xlOyI6ICJcdTI1YjQiLAogICAgImJsYWNrdHJpYW5nbGVkb3duOyI6ICJcdTI1YmUiLAogICAgImJsYWNrdHJpYW5nbGVsZWZ0OyI6ICJcdTI1YzIiLAogICAgImJsYWNrdHJpYW5nbGVyaWdodDsiOiAiXHUyNWI4IiwKICAgICJibGFuazsiOiAiXHUyNDIzIiwKICAgICJibGsxMjsiOiAiXHUyNTkyIiwKICAgICJibGsxNDsiOiAiXHUyNTkxIiwKICAgICJibGszNDsiOiAiXHUyNTkzIiwKICAgICJibG9jazsiOiAiXHUyNTg4IiwKICAgICJibmU7IjogIj1cdTIwZTUiLAogICAgImJuZXF1aXY7IjogIlx1MjI2MVx1MjBlNSIsCiAgICAiYm5vdDsiOiAiXHUyMzEwIiwKICAgICJib3BmOyI6ICJcVTAwMDFkNTUzIiwKICAgICJib3Q7IjogIlx1MjJhNSIsCiAgICAiYm90dG9tOyI6ICJcdTIyYTUiLAogICAgImJvd3RpZTsiOiAiXHUyMmM4IiwKICAgICJib3hETDsiOiAiXHUyNTU3IiwKICAgICJib3hEUjsiOiAiXHUyNTU0IiwKICAgICJib3hEbDsiOiAiXHUyNTU2IiwKICAgICJib3hEcjsiOiAiXHUyNTUzIiwKICAgICJib3hIOyI6ICJcdTI1NTAiLAogICAgImJveEhEOyI6ICJcdTI1NjYiLAogICAgImJveEhVOyI6ICJcdTI1NjkiLAogICAgImJveEhkOyI6ICJcdTI1NjQiLAogICAgImJveEh1OyI6ICJcdTI1NjciLAogICAgImJveFVMOyI6ICJcdTI1NWQiLAogICAgImJveFVSOyI6ICJcdTI1NWEiLAogICAgImJveFVsOyI6ICJcdTI1NWMiLAogICAgImJveFVyOyI6ICJcdTI1NTkiLAogICAgImJveFY7IjogIlx1MjU1MSIsCiAgICAiYm94Vkg7IjogIlx1MjU2YyIsCiAgICAiYm94Vkw7IjogIlx1MjU2MyIsCiAgICAiYm94VlI7IjogIlx1MjU2MCIsCiAgICAiYm94Vmg7IjogIlx1MjU2YiIsCiAgICAiYm94Vmw7IjogIlx1MjU2MiIsCiAgICAiYm94VnI7IjogIlx1MjU1ZiIsCiAgICAiYm94Ym94OyI6ICJcdTI5YzkiLAogICAgImJveGRMOyI6ICJcdTI1NTUiLAogICAgImJveGRSOyI6ICJcdTI1NTIiLAogICAgImJveGRsOyI6ICJcdTI1MTAiLAogICAgImJveGRyOyI6ICJcdTI1MGMiLAogICAgImJveGg7IjogIlx1MjUwMCIsCiAgICAiYm94aEQ7IjogIlx1MjU2NSIsCiAgICAiYm94aFU7IjogIlx1MjU2OCIsCiAgICAiYm94aGQ7IjogIlx1MjUyYyIsCiAgICAiYm94aHU7IjogIlx1MjUzNCIsCiAgICAiYm94bWludXM7IjogIlx1MjI5ZiIsCiAgICAiYm94cGx1czsiOiAiXHUyMjllIiwKICAgICJib3h0aW1lczsiOiAiXHUyMmEwIiwKICAgICJib3h1TDsiOiAiXHUyNTViIiwKICAgICJib3h1UjsiOiAiXHUyNTU4IiwKICAgICJib3h1bDsiOiAiXHUyNTE4IiwKICAgICJib3h1cjsiOiAiXHUyNTE0IiwKICAgICJib3h2OyI6ICJcdTI1MDIiLAogICAgImJveHZIOyI6ICJcdTI1NmEiLAogICAgImJveHZMOyI6ICJcdTI1NjEiLAogICAgImJveHZSOyI6ICJcdTI1NWUiLAogICAgImJveHZoOyI6ICJcdTI1M2MiLAogICAgImJveHZsOyI6ICJcdTI1MjQiLAogICAgImJveHZyOyI6ICJcdTI1MWMiLAogICAgImJwcmltZTsiOiAiXHUyMDM1IiwKICAgICJicmV2ZTsiOiAiXHUwMmQ4IiwKICAgICJicnZiYXIiOiAiXHhhNiIsCiAgICAiYnJ2YmFyOyI6ICJceGE2IiwKICAgICJic2NyOyI6ICJcVTAwMDFkNGI3IiwKICAgICJic2VtaTsiOiAiXHUyMDRmIiwKICAgICJic2ltOyI6ICJcdTIyM2QiLAogICAgImJzaW1lOyI6ICJcdTIyY2QiLAogICAgImJzb2w7IjogIlxcIiwKICAgICJic29sYjsiOiAiXHUyOWM1IiwKICAgICJic29saHN1YjsiOiAiXHUyN2M4IiwKICAgICJidWxsOyI6ICJcdTIwMjIiLAogICAgImJ1bGxldDsiOiAiXHUyMDIyIiwKICAgICJidW1wOyI6ICJcdTIyNGUiLAogICAgImJ1bXBFOyI6ICJcdTJhYWUiLAogICAgImJ1bXBlOyI6ICJcdTIyNGYiLAogICAgImJ1bXBlcTsiOiAiXHUyMjRmIiwKICAgICJjYWN1dGU7IjogIlx1MDEwNyIsCiAgICAiY2FwOyI6ICJcdTIyMjkiLAogICAgImNhcGFuZDsiOiAiXHUyYTQ0IiwKICAgICJjYXBicmN1cDsiOiAiXHUyYTQ5IiwKICAgICJjYXBjYXA7IjogIlx1MmE0YiIsCiAgICAiY2FwY3VwOyI6ICJcdTJhNDciLAogICAgImNhcGRvdDsiOiAiXHUyYTQwIiwKICAgICJjYXBzOyI6ICJcdTIyMjlcdWZlMDAiLAogICAgImNhcmV0OyI6ICJcdTIwNDEiLAogICAgImNhcm9uOyI6ICJcdTAyYzciLAogICAgImNjYXBzOyI6ICJcdTJhNGQiLAogICAgImNjYXJvbjsiOiAiXHUwMTBkIiwKICAgICJjY2VkaWwiOiAiXHhlNyIsCiAgICAiY2NlZGlsOyI6ICJceGU3IiwKICAgICJjY2lyYzsiOiAiXHUwMTA5IiwKICAgICJjY3VwczsiOiAiXHUyYTRjIiwKICAgICJjY3Vwc3NtOyI6ICJcdTJhNTAiLAogICAgImNkb3Q7IjogIlx1MDEwYiIsCiAgICAiY2VkaWwiOiAiXHhiOCIsCiAgICAiY2VkaWw7IjogIlx4YjgiLAogICAgImNlbXB0eXY7IjogIlx1MjliMiIsCiAgICAiY2VudCI6ICJceGEyIiwKICAgICJjZW50OyI6ICJceGEyIiwKICAgICJjZW50ZXJkb3Q7IjogIlx4YjciLAogICAgImNmcjsiOiAiXFUwMDAxZDUyMCIsCiAgICAiY2hjeTsiOiAiXHUwNDQ3IiwKICAgICJjaGVjazsiOiAiXHUyNzEzIiwKICAgICJjaGVja21hcms7IjogIlx1MjcxMyIsCiAgICAiY2hpOyI6ICJcdTAzYzciLAogICAgImNpcjsiOiAiXHUyNWNiIiwKICAgICJjaXJFOyI6ICJcdTI5YzMiLAogICAgImNpcmM7IjogIlx1MDJjNiIsCiAgICAiY2lyY2VxOyI6ICJcdTIyNTciLAogICAgImNpcmNsZWFycm93bGVmdDsiOiAiXHUyMWJhIiwKICAgICJjaXJjbGVhcnJvd3JpZ2h0OyI6ICJcdTIxYmIiLAogICAgImNpcmNsZWRSOyI6ICJceGFlIiwKICAgICJjaXJjbGVkUzsiOiAiXHUyNGM4IiwKICAgICJjaXJjbGVkYXN0OyI6ICJcdTIyOWIiLAogICAgImNpcmNsZWRjaXJjOyI6ICJcdTIyOWEiLAogICAgImNpcmNsZWRkYXNoOyI6ICJcdTIyOWQiLAogICAgImNpcmU7IjogIlx1MjI1NyIsCiAgICAiY2lyZm5pbnQ7IjogIlx1MmExMCIsCiAgICAiY2lybWlkOyI6ICJcdTJhZWYiLAogICAgImNpcnNjaXI7IjogIlx1MjljMiIsCiAgICAiY2x1YnM7IjogIlx1MjY2MyIsCiAgICAiY2x1YnN1aXQ7IjogIlx1MjY2MyIsCiAgICAiY29sb247IjogIjoiLAogICAgImNvbG9uZTsiOiAiXHUyMjU0IiwKICAgICJjb2xvbmVxOyI6ICJcdTIyNTQiLAogICAgImNvbW1hOyI6ICIsIiwKICAgICJjb21tYXQ7IjogIkAiLAogICAgImNvbXA7IjogIlx1MjIwMSIsCiAgICAiY29tcGZuOyI6ICJcdTIyMTgiLAogICAgImNvbXBsZW1lbnQ7IjogIlx1MjIwMSIsCiAgICAiY29tcGxleGVzOyI6ICJcdTIxMDIiLAogICAgImNvbmc7IjogIlx1MjI0NSIsCiAgICAiY29uZ2RvdDsiOiAiXHUyYTZkIiwKICAgICJjb25pbnQ7IjogIlx1MjIyZSIsCiAgICAiY29wZjsiOiAiXFUwMDAxZDU1NCIsCiAgICAiY29wcm9kOyI6ICJcdTIyMTAiLAogICAgImNvcHkiOiAiXHhhOSIsCiAgICAiY29weTsiOiAiXHhhOSIsCiAgICAiY29weXNyOyI6ICJcdTIxMTciLAogICAgImNyYXJyOyI6ICJcdTIxYjUiLAogICAgImNyb3NzOyI6ICJcdTI3MTciLAogICAgImNzY3I7IjogIlxVMDAwMWQ0YjgiLAogICAgImNzdWI7IjogIlx1MmFjZiIsCiAgICAiY3N1YmU7IjogIlx1MmFkMSIsCiAgICAiY3N1cDsiOiAiXHUyYWQwIiwKICAgICJjc3VwZTsiOiAiXHUyYWQyIiwKICAgICJjdGRvdDsiOiAiXHUyMmVmIiwKICAgICJjdWRhcnJsOyI6ICJcdTI5MzgiLAogICAgImN1ZGFycnI7IjogIlx1MjkzNSIsCiAgICAiY3VlcHI7IjogIlx1MjJkZSIsCiAgICAiY3Vlc2M7IjogIlx1MjJkZiIsCiAgICAiY3VsYXJyOyI6ICJcdTIxYjYiLAogICAgImN1bGFycnA7IjogIlx1MjkzZCIsCiAgICAiY3VwOyI6ICJcdTIyMmEiLAogICAgImN1cGJyY2FwOyI6ICJcdTJhNDgiLAogICAgImN1cGNhcDsiOiAiXHUyYTQ2IiwKICAgICJjdXBjdXA7IjogIlx1MmE0YSIsCiAgICAiY3VwZG90OyI6ICJcdTIyOGQiLAogICAgImN1cG9yOyI6ICJcdTJhNDUiLAogICAgImN1cHM7IjogIlx1MjIyYVx1ZmUwMCIsCiAgICAiY3VyYXJyOyI6ICJcdTIxYjciLAogICAgImN1cmFycm07IjogIlx1MjkzYyIsCiAgICAiY3VybHllcXByZWM7IjogIlx1MjJkZSIsCiAgICAiY3VybHllcXN1Y2M7IjogIlx1MjJkZiIsCiAgICAiY3VybHl2ZWU7IjogIlx1MjJjZSIsCiAgICAiY3VybHl3ZWRnZTsiOiAiXHUyMmNmIiwKICAgICJjdXJyZW4iOiAiXHhhNCIsCiAgICAiY3VycmVuOyI6ICJceGE0IiwKICAgICJjdXJ2ZWFycm93bGVmdDsiOiAiXHUyMWI2IiwKICAgICJjdXJ2ZWFycm93cmlnaHQ7IjogIlx1MjFiNyIsCiAgICAiY3V2ZWU7IjogIlx1MjJjZSIsCiAgICAiY3V3ZWQ7IjogIlx1MjJjZiIsCiAgICAiY3djb25pbnQ7IjogIlx1MjIzMiIsCiAgICAiY3dpbnQ7IjogIlx1MjIzMSIsCiAgICAiY3lsY3R5OyI6ICJcdTIzMmQiLAogICAgImRBcnI7IjogIlx1MjFkMyIsCiAgICAiZEhhcjsiOiAiXHUyOTY1IiwKICAgICJkYWdnZXI7IjogIlx1MjAyMCIsCiAgICAiZGFsZXRoOyI6ICJcdTIxMzgiLAogICAgImRhcnI7IjogIlx1MjE5MyIsCiAgICAiZGFzaDsiOiAiXHUyMDEwIiwKICAgICJkYXNodjsiOiAiXHUyMmEzIiwKICAgICJkYmthcm93OyI6ICJcdTI5MGYiLAogICAgImRibGFjOyI6ICJcdTAyZGQiLAogICAgImRjYXJvbjsiOiAiXHUwMTBmIiwKICAgICJkY3k7IjogIlx1MDQzNCIsCiAgICAiZGQ7IjogIlx1MjE0NiIsCiAgICAiZGRhZ2dlcjsiOiAiXHUyMDIxIiwKICAgICJkZGFycjsiOiAiXHUyMWNhIiwKICAgICJkZG90c2VxOyI6ICJcdTJhNzciLAogICAgImRlZyI6ICJceGIwIiwKICAgICJkZWc7IjogIlx4YjAiLAogICAgImRlbHRhOyI6ICJcdTAzYjQiLAogICAgImRlbXB0eXY7IjogIlx1MjliMSIsCiAgICAiZGZpc2h0OyI6ICJcdTI5N2YiLAogICAgImRmcjsiOiAiXFUwMDAxZDUyMSIsCiAgICAiZGhhcmw7IjogIlx1MjFjMyIsCiAgICAiZGhhcnI7IjogIlx1MjFjMiIsCiAgICAiZGlhbTsiOiAiXHUyMmM0IiwKICAgICJkaWFtb25kOyI6ICJcdTIyYzQiLAogICAgImRpYW1vbmRzdWl0OyI6ICJcdTI2NjYiLAogICAgImRpYW1zOyI6ICJcdTI2NjYiLAogICAgImRpZTsiOiAiXHhhOCIsCiAgICAiZGlnYW1tYTsiOiAiXHUwM2RkIiwKICAgICJkaXNpbjsiOiAiXHUyMmYyIiwKICAgICJkaXY7IjogIlx4ZjciLAogICAgImRpdmlkZSI6ICJceGY3IiwKICAgICJkaXZpZGU7IjogIlx4ZjciLAogICAgImRpdmlkZW9udGltZXM7IjogIlx1MjJjNyIsCiAgICAiZGl2b254OyI6ICJcdTIyYzciLAogICAgImRqY3k7IjogIlx1MDQ1MiIsCiAgICAiZGxjb3JuOyI6ICJcdTIzMWUiLAogICAgImRsY3JvcDsiOiAiXHUyMzBkIiwKICAgICJkb2xsYXI7IjogIiQiLAogICAgImRvcGY7IjogIlxVMDAwMWQ1NTUiLAogICAgImRvdDsiOiAiXHUwMmQ5IiwKICAgICJkb3RlcTsiOiAiXHUyMjUwIiwKICAgICJkb3RlcWRvdDsiOiAiXHUyMjUxIiwKICAgICJkb3RtaW51czsiOiAiXHUyMjM4IiwKICAgICJkb3RwbHVzOyI6ICJcdTIyMTQiLAogICAgImRvdHNxdWFyZTsiOiAiXHUyMmExIiwKICAgICJkb3VibGViYXJ3ZWRnZTsiOiAiXHUyMzA2IiwKICAgICJkb3duYXJyb3c7IjogIlx1MjE5MyIsCiAgICAiZG93bmRvd25hcnJvd3M7IjogIlx1MjFjYSIsCiAgICAiZG93bmhhcnBvb25sZWZ0OyI6ICJcdTIxYzMiLAogICAgImRvd25oYXJwb29ucmlnaHQ7IjogIlx1MjFjMiIsCiAgICAiZHJia2Fyb3c7IjogIlx1MjkxMCIsCiAgICAiZHJjb3JuOyI6ICJcdTIzMWYiLAogICAgImRyY3JvcDsiOiAiXHUyMzBjIiwKICAgICJkc2NyOyI6ICJcVTAwMDFkNGI5IiwKICAgICJkc2N5OyI6ICJcdTA0NTUiLAogICAgImRzb2w7IjogIlx1MjlmNiIsCiAgICAiZHN0cm9rOyI6ICJcdTAxMTEiLAogICAgImR0ZG90OyI6ICJcdTIyZjEiLAogICAgImR0cmk7IjogIlx1MjViZiIsCiAgICAiZHRyaWY7IjogIlx1MjViZSIsCiAgICAiZHVhcnI7IjogIlx1MjFmNSIsCiAgICAiZHVoYXI7IjogIlx1Mjk2ZiIsCiAgICAiZHdhbmdsZTsiOiAiXHUyOWE2IiwKICAgICJkemN5OyI6ICJcdTA0NWYiLAogICAgImR6aWdyYXJyOyI6ICJcdTI3ZmYiLAogICAgImVERG90OyI6ICJcdTJhNzciLAogICAgImVEb3Q7IjogIlx1MjI1MSIsCiAgICAiZWFjdXRlIjogIlx4ZTkiLAogICAgImVhY3V0ZTsiOiAiXHhlOSIsCiAgICAiZWFzdGVyOyI6ICJcdTJhNmUiLAogICAgImVjYXJvbjsiOiAiXHUwMTFiIiwKICAgICJlY2lyOyI6ICJcdTIyNTYiLAogICAgImVjaXJjIjogIlx4ZWEiLAogICAgImVjaXJjOyI6ICJceGVhIiwKICAgICJlY29sb247IjogIlx1MjI1NSIsCiAgICAiZWN5OyI6ICJcdTA0NGQiLAogICAgImVkb3Q7IjogIlx1MDExNyIsCiAgICAiZWU7IjogIlx1MjE0NyIsCiAgICAiZWZEb3Q7IjogIlx1MjI1MiIsCiAgICAiZWZyOyI6ICJcVTAwMDFkNTIyIiwKICAgICJlZzsiOiAiXHUyYTlhIiwKICAgICJlZ3JhdmUiOiAiXHhlOCIsCiAgICAiZWdyYXZlOyI6ICJceGU4IiwKICAgICJlZ3M7IjogIlx1MmE5NiIsCiAgICAiZWdzZG90OyI6ICJcdTJhOTgiLAogICAgImVsOyI6ICJcdTJhOTkiLAogICAgImVsaW50ZXJzOyI6ICJcdTIzZTciLAogICAgImVsbDsiOiAiXHUyMTEzIiwKICAgICJlbHM7IjogIlx1MmE5NSIsCiAgICAiZWxzZG90OyI6ICJcdTJhOTciLAogICAgImVtYWNyOyI6ICJcdTAxMTMiLAogICAgImVtcHR5OyI6ICJcdTIyMDUiLAogICAgImVtcHR5c2V0OyI6ICJcdTIyMDUiLAogICAgImVtcHR5djsiOiAiXHUyMjA1IiwKICAgICJlbXNwMTM7IjogIlx1MjAwNCIsCiAgICAiZW1zcDE0OyI6ICJcdTIwMDUiLAogICAgImVtc3A7IjogIlx1MjAwMyIsCiAgICAiZW5nOyI6ICJcdTAxNGIiLAogICAgImVuc3A7IjogIlx1MjAwMiIsCiAgICAiZW9nb247IjogIlx1MDExOSIsCiAgICAiZW9wZjsiOiAiXFUwMDAxZDU1NiIsCiAgICAiZXBhcjsiOiAiXHUyMmQ1IiwKICAgICJlcGFyc2w7IjogIlx1MjllMyIsCiAgICAiZXBsdXM7IjogIlx1MmE3MSIsCiAgICAiZXBzaTsiOiAiXHUwM2I1IiwKICAgICJlcHNpbG9uOyI6ICJcdTAzYjUiLAogICAgImVwc2l2OyI6ICJcdTAzZjUiLAogICAgImVxY2lyYzsiOiAiXHUyMjU2IiwKICAgICJlcWNvbG9uOyI6ICJcdTIyNTUiLAogICAgImVxc2ltOyI6ICJcdTIyNDIiLAogICAgImVxc2xhbnRndHI7IjogIlx1MmE5NiIsCiAgICAiZXFzbGFudGxlc3M7IjogIlx1MmE5NSIsCiAgICAiZXF1YWxzOyI6ICI9IiwKICAgICJlcXVlc3Q7IjogIlx1MjI1ZiIsCiAgICAiZXF1aXY7IjogIlx1MjI2MSIsCiAgICAiZXF1aXZERDsiOiAiXHUyYTc4IiwKICAgICJlcXZwYXJzbDsiOiAiXHUyOWU1IiwKICAgICJlckRvdDsiOiAiXHUyMjUzIiwKICAgICJlcmFycjsiOiAiXHUyOTcxIiwKICAgICJlc2NyOyI6ICJcdTIxMmYiLAogICAgImVzZG90OyI6ICJcdTIyNTAiLAogICAgImVzaW07IjogIlx1MjI0MiIsCiAgICAiZXRhOyI6ICJcdTAzYjciLAogICAgImV0aCI6ICJceGYwIiwKICAgICJldGg7IjogIlx4ZjAiLAogICAgImV1bWwiOiAiXHhlYiIsCiAgICAiZXVtbDsiOiAiXHhlYiIsCiAgICAiZXVybzsiOiAiXHUyMGFjIiwKICAgICJleGNsOyI6ICIhIiwKICAgICJleGlzdDsiOiAiXHUyMjAzIiwKICAgICJleHBlY3RhdGlvbjsiOiAiXHUyMTMwIiwKICAgICJleHBvbmVudGlhbGU7IjogIlx1MjE0NyIsCiAgICAiZmFsbGluZ2RvdHNlcTsiOiAiXHUyMjUyIiwKICAgICJmY3k7IjogIlx1MDQ0NCIsCiAgICAiZmVtYWxlOyI6ICJcdTI2NDAiLAogICAgImZmaWxpZzsiOiAiXHVmYjAzIiwKICAgICJmZmxpZzsiOiAiXHVmYjAwIiwKICAgICJmZmxsaWc7IjogIlx1ZmIwNCIsCiAgICAiZmZyOyI6ICJcVTAwMDFkNTIzIiwKICAgICJmaWxpZzsiOiAiXHVmYjAxIiwKICAgICJmamxpZzsiOiAiZmoiLAogICAgImZsYXQ7IjogIlx1MjY2ZCIsCiAgICAiZmxsaWc7IjogIlx1ZmIwMiIsCiAgICAiZmx0bnM7IjogIlx1MjViMSIsCiAgICAiZm5vZjsiOiAiXHUwMTkyIiwKICAgICJmb3BmOyI6ICJcVTAwMDFkNTU3IiwKICAgICJmb3JhbGw7IjogIlx1MjIwMCIsCiAgICAiZm9yazsiOiAiXHUyMmQ0IiwKICAgICJmb3JrdjsiOiAiXHUyYWQ5IiwKICAgICJmcGFydGludDsiOiAiXHUyYTBkIiwKICAgICJmcmFjMTIiOiAiXHhiZCIsCiAgICAiZnJhYzEyOyI6ICJceGJkIiwKICAgICJmcmFjMTM7IjogIlx1MjE1MyIsCiAgICAiZnJhYzE0IjogIlx4YmMiLAogICAgImZyYWMxNDsiOiAiXHhiYyIsCiAgICAiZnJhYzE1OyI6ICJcdTIxNTUiLAogICAgImZyYWMxNjsiOiAiXHUyMTU5IiwKICAgICJmcmFjMTg7IjogIlx1MjE1YiIsCiAgICAiZnJhYzIzOyI6ICJcdTIxNTQiLAogICAgImZyYWMyNTsiOiAiXHUyMTU2IiwKICAgICJmcmFjMzQiOiAiXHhiZSIsCiAgICAiZnJhYzM0OyI6ICJceGJlIiwKICAgICJmcmFjMzU7IjogIlx1MjE1NyIsCiAgICAiZnJhYzM4OyI6ICJcdTIxNWMiLAogICAgImZyYWM0NTsiOiAiXHUyMTU4IiwKICAgICJmcmFjNTY7IjogIlx1MjE1YSIsCiAgICAiZnJhYzU4OyI6ICJcdTIxNWQiLAogICAgImZyYWM3ODsiOiAiXHUyMTVlIiwKICAgICJmcmFzbDsiOiAiXHUyMDQ0IiwKICAgICJmcm93bjsiOiAiXHUyMzIyIiwKICAgICJmc2NyOyI6ICJcVTAwMDFkNGJiIiwKICAgICJnRTsiOiAiXHUyMjY3IiwKICAgICJnRWw7IjogIlx1MmE4YyIsCiAgICAiZ2FjdXRlOyI6ICJcdTAxZjUiLAogICAgImdhbW1hOyI6ICJcdTAzYjMiLAogICAgImdhbW1hZDsiOiAiXHUwM2RkIiwKICAgICJnYXA7IjogIlx1MmE4NiIsCiAgICAiZ2JyZXZlOyI6ICJcdTAxMWYiLAogICAgImdjaXJjOyI6ICJcdTAxMWQiLAogICAgImdjeTsiOiAiXHUwNDMzIiwKICAgICJnZG90OyI6ICJcdTAxMjEiLAogICAgImdlOyI6ICJcdTIyNjUiLAogICAgImdlbDsiOiAiXHUyMmRiIiwKICAgICJnZXE7IjogIlx1MjI2NSIsCiAgICAiZ2VxcTsiOiAiXHUyMjY3IiwKICAgICJnZXFzbGFudDsiOiAiXHUyYTdlIiwKICAgICJnZXM7IjogIlx1MmE3ZSIsCiAgICAiZ2VzY2M7IjogIlx1MmFhOSIsCiAgICAiZ2VzZG90OyI6ICJcdTJhODAiLAogICAgImdlc2RvdG87IjogIlx1MmE4MiIsCiAgICAiZ2VzZG90b2w7IjogIlx1MmE4NCIsCiAgICAiZ2VzbDsiOiAiXHUyMmRiXHVmZTAwIiwKICAgICJnZXNsZXM7IjogIlx1MmE5NCIsCiAgICAiZ2ZyOyI6ICJcVTAwMDFkNTI0IiwKICAgICJnZzsiOiAiXHUyMjZiIiwKICAgICJnZ2c7IjogIlx1MjJkOSIsCiAgICAiZ2ltZWw7IjogIlx1MjEzNyIsCiAgICAiZ2pjeTsiOiAiXHUwNDUzIiwKICAgICJnbDsiOiAiXHUyMjc3IiwKICAgICJnbEU7IjogIlx1MmE5MiIsCiAgICAiZ2xhOyI6ICJcdTJhYTUiLAogICAgImdsajsiOiAiXHUyYWE0IiwKICAgICJnbkU7IjogIlx1MjI2OSIsCiAgICAiZ25hcDsiOiAiXHUyYThhIiwKICAgICJnbmFwcHJveDsiOiAiXHUyYThhIiwKICAgICJnbmU7IjogIlx1MmE4OCIsCiAgICAiZ25lcTsiOiAiXHUyYTg4IiwKICAgICJnbmVxcTsiOiAiXHUyMjY5IiwKICAgICJnbnNpbTsiOiAiXHUyMmU3IiwKICAgICJnb3BmOyI6ICJcVTAwMDFkNTU4IiwKICAgICJncmF2ZTsiOiAiYCIsCiAgICAiZ3NjcjsiOiAiXHUyMTBhIiwKICAgICJnc2ltOyI6ICJcdTIyNzMiLAogICAgImdzaW1lOyI6ICJcdTJhOGUiLAogICAgImdzaW1sOyI6ICJcdTJhOTAiLAogICAgImd0IjogIj4iLAogICAgImd0OyI6ICI+IiwKICAgICJndGNjOyI6ICJcdTJhYTciLAogICAgImd0Y2lyOyI6ICJcdTJhN2EiLAogICAgImd0ZG90OyI6ICJcdTIyZDciLAogICAgImd0bFBhcjsiOiAiXHUyOTk1IiwKICAgICJndHF1ZXN0OyI6ICJcdTJhN2MiLAogICAgImd0cmFwcHJveDsiOiAiXHUyYTg2IiwKICAgICJndHJhcnI7IjogIlx1Mjk3OCIsCiAgICAiZ3RyZG90OyI6ICJcdTIyZDciLAogICAgImd0cmVxbGVzczsiOiAiXHUyMmRiIiwKICAgICJndHJlcXFsZXNzOyI6ICJcdTJhOGMiLAogICAgImd0cmxlc3M7IjogIlx1MjI3NyIsCiAgICAiZ3Ryc2ltOyI6ICJcdTIyNzMiLAogICAgImd2ZXJ0bmVxcTsiOiAiXHUyMjY5XHVmZTAwIiwKICAgICJndm5FOyI6ICJcdTIyNjlcdWZlMDAiLAogICAgImhBcnI7IjogIlx1MjFkNCIsCiAgICAiaGFpcnNwOyI6ICJcdTIwMGEiLAogICAgImhhbGY7IjogIlx4YmQiLAogICAgImhhbWlsdDsiOiAiXHUyMTBiIiwKICAgICJoYXJkY3k7IjogIlx1MDQ0YSIsCiAgICAiaGFycjsiOiAiXHUyMTk0IiwKICAgICJoYXJyY2lyOyI6ICJcdTI5NDgiLAogICAgImhhcnJ3OyI6ICJcdTIxYWQiLAogICAgImhiYXI7IjogIlx1MjEwZiIsCiAgICAiaGNpcmM7IjogIlx1MDEyNSIsCiAgICAiaGVhcnRzOyI6ICJcdTI2NjUiLAogICAgImhlYXJ0c3VpdDsiOiAiXHUyNjY1IiwKICAgICJoZWxsaXA7IjogIlx1MjAyNiIsCiAgICAiaGVyY29uOyI6ICJcdTIyYjkiLAogICAgImhmcjsiOiAiXFUwMDAxZDUyNSIsCiAgICAiaGtzZWFyb3c7IjogIlx1MjkyNSIsCiAgICAiaGtzd2Fyb3c7IjogIlx1MjkyNiIsCiAgICAiaG9hcnI7IjogIlx1MjFmZiIsCiAgICAiaG9tdGh0OyI6ICJcdTIyM2IiLAogICAgImhvb2tsZWZ0YXJyb3c7IjogIlx1MjFhOSIsCiAgICAiaG9va3JpZ2h0YXJyb3c7IjogIlx1MjFhYSIsCiAgICAiaG9wZjsiOiAiXFUwMDAxZDU1OSIsCiAgICAiaG9yYmFyOyI6ICJcdTIwMTUiLAogICAgImhzY3I7IjogIlxVMDAwMWQ0YmQiLAogICAgImhzbGFzaDsiOiAiXHUyMTBmIiwKICAgICJoc3Ryb2s7IjogIlx1MDEyNyIsCiAgICAiaHlidWxsOyI6ICJcdTIwNDMiLAogICAgImh5cGhlbjsiOiAiXHUyMDEwIiwKICAgICJpYWN1dGUiOiAiXHhlZCIsCiAgICAiaWFjdXRlOyI6ICJceGVkIiwKICAgICJpYzsiOiAiXHUyMDYzIiwKICAgICJpY2lyYyI6ICJceGVlIiwKICAgICJpY2lyYzsiOiAiXHhlZSIsCiAgICAiaWN5OyI6ICJcdTA0MzgiLAogICAgImllY3k7IjogIlx1MDQzNSIsCiAgICAiaWV4Y2wiOiAiXHhhMSIsCiAgICAiaWV4Y2w7IjogIlx4YTEiLAogICAgImlmZjsiOiAiXHUyMWQ0IiwKICAgICJpZnI7IjogIlxVMDAwMWQ1MjYiLAogICAgImlncmF2ZSI6ICJceGVjIiwKICAgICJpZ3JhdmU7IjogIlx4ZWMiLAogICAgImlpOyI6ICJcdTIxNDgiLAogICAgImlpaWludDsiOiAiXHUyYTBjIiwKICAgICJpaWludDsiOiAiXHUyMjJkIiwKICAgICJpaW5maW47IjogIlx1MjlkYyIsCiAgICAiaWlvdGE7IjogIlx1MjEyOSIsCiAgICAiaWpsaWc7IjogIlx1MDEzMyIsCiAgICAiaW1hY3I7IjogIlx1MDEyYiIsCiAgICAiaW1hZ2U7IjogIlx1MjExMSIsCiAgICAiaW1hZ2xpbmU7IjogIlx1MjExMCIsCiAgICAiaW1hZ3BhcnQ7IjogIlx1MjExMSIsCiAgICAiaW1hdGg7IjogIlx1MDEzMSIsCiAgICAiaW1vZjsiOiAiXHUyMmI3IiwKICAgICJpbXBlZDsiOiAiXHUwMWI1IiwKICAgICJpbjsiOiAiXHUyMjA4IiwKICAgICJpbmNhcmU7IjogIlx1MjEwNSIsCiAgICAiaW5maW47IjogIlx1MjIxZSIsCiAgICAiaW5maW50aWU7IjogIlx1MjlkZCIsCiAgICAiaW5vZG90OyI6ICJcdTAxMzEiLAogICAgImludDsiOiAiXHUyMjJiIiwKICAgICJpbnRjYWw7IjogIlx1MjJiYSIsCiAgICAiaW50ZWdlcnM7IjogIlx1MjEyNCIsCiAgICAiaW50ZXJjYWw7IjogIlx1MjJiYSIsCiAgICAiaW50bGFyaGs7IjogIlx1MmExNyIsCiAgICAiaW50cHJvZDsiOiAiXHUyYTNjIiwKICAgICJpb2N5OyI6ICJcdTA0NTEiLAogICAgImlvZ29uOyI6ICJcdTAxMmYiLAogICAgImlvcGY7IjogIlxVMDAwMWQ1NWEiLAogICAgImlvdGE7IjogIlx1MDNiOSIsCiAgICAiaXByb2Q7IjogIlx1MmEzYyIsCiAgICAiaXF1ZXN0IjogIlx4YmYiLAogICAgImlxdWVzdDsiOiAiXHhiZiIsCiAgICAiaXNjcjsiOiAiXFUwMDAxZDRiZSIsCiAgICAiaXNpbjsiOiAiXHUyMjA4IiwKICAgICJpc2luRTsiOiAiXHUyMmY5IiwKICAgICJpc2luZG90OyI6ICJcdTIyZjUiLAogICAgImlzaW5zOyI6ICJcdTIyZjQiLAogICAgImlzaW5zdjsiOiAiXHUyMmYzIiwKICAgICJpc2ludjsiOiAiXHUyMjA4IiwKICAgICJpdDsiOiAiXHUyMDYyIiwKICAgICJpdGlsZGU7IjogIlx1MDEyOSIsCiAgICAiaXVrY3k7IjogIlx1MDQ1NiIsCiAgICAiaXVtbCI6ICJceGVmIiwKICAgICJpdW1sOyI6ICJceGVmIiwKICAgICJqY2lyYzsiOiAiXHUwMTM1IiwKICAgICJqY3k7IjogIlx1MDQzOSIsCiAgICAiamZyOyI6ICJcVTAwMDFkNTI3IiwKICAgICJqbWF0aDsiOiAiXHUwMjM3IiwKICAgICJqb3BmOyI6ICJcVTAwMDFkNTViIiwKICAgICJqc2NyOyI6ICJcVTAwMDFkNGJmIiwKICAgICJqc2VyY3k7IjogIlx1MDQ1OCIsCiAgICAianVrY3k7IjogIlx1MDQ1NCIsCiAgICAia2FwcGE7IjogIlx1MDNiYSIsCiAgICAia2FwcGF2OyI6ICJcdTAzZjAiLAogICAgImtjZWRpbDsiOiAiXHUwMTM3IiwKICAgICJrY3k7IjogIlx1MDQzYSIsCiAgICAia2ZyOyI6ICJcVTAwMDFkNTI4IiwKICAgICJrZ3JlZW47IjogIlx1MDEzOCIsCiAgICAia2hjeTsiOiAiXHUwNDQ1IiwKICAgICJramN5OyI6ICJcdTA0NWMiLAogICAgImtvcGY7IjogIlxVMDAwMWQ1NWMiLAogICAgImtzY3I7IjogIlxVMDAwMWQ0YzAiLAogICAgImxBYXJyOyI6ICJcdTIxZGEiLAogICAgImxBcnI7IjogIlx1MjFkMCIsCiAgICAibEF0YWlsOyI6ICJcdTI5MWIiLAogICAgImxCYXJyOyI6ICJcdTI5MGUiLAogICAgImxFOyI6ICJcdTIyNjYiLAogICAgImxFZzsiOiAiXHUyYThiIiwKICAgICJsSGFyOyI6ICJcdTI5NjIiLAogICAgImxhY3V0ZTsiOiAiXHUwMTNhIiwKICAgICJsYWVtcHR5djsiOiAiXHUyOWI0IiwKICAgICJsYWdyYW47IjogIlx1MjExMiIsCiAgICAibGFtYmRhOyI6ICJcdTAzYmIiLAogICAgImxhbmc7IjogIlx1MjdlOCIsCiAgICAibGFuZ2Q7IjogIlx1Mjk5MSIsCiAgICAibGFuZ2xlOyI6ICJcdTI3ZTgiLAogICAgImxhcDsiOiAiXHUyYTg1IiwKICAgICJsYXF1byI6ICJceGFiIiwKICAgICJsYXF1bzsiOiAiXHhhYiIsCiAgICAibGFycjsiOiAiXHUyMTkwIiwKICAgICJsYXJyYjsiOiAiXHUyMWU0IiwKICAgICJsYXJyYmZzOyI6ICJcdTI5MWYiLAogICAgImxhcnJmczsiOiAiXHUyOTFkIiwKICAgICJsYXJyaGs7IjogIlx1MjFhOSIsCiAgICAibGFycmxwOyI6ICJcdTIxYWIiLAogICAgImxhcnJwbDsiOiAiXHUyOTM5IiwKICAgICJsYXJyc2ltOyI6ICJcdTI5NzMiLAogICAgImxhcnJ0bDsiOiAiXHUyMWEyIiwKICAgICJsYXQ7IjogIlx1MmFhYiIsCiAgICAibGF0YWlsOyI6ICJcdTI5MTkiLAogICAgImxhdGU7IjogIlx1MmFhZCIsCiAgICAibGF0ZXM7IjogIlx1MmFhZFx1ZmUwMCIsCiAgICAibGJhcnI7IjogIlx1MjkwYyIsCiAgICAibGJicms7IjogIlx1Mjc3MiIsCiAgICAibGJyYWNlOyI6ICJ7IiwKICAgICJsYnJhY2s7IjogIlsiLAogICAgImxicmtlOyI6ICJcdTI5OGIiLAogICAgImxicmtzbGQ7IjogIlx1Mjk4ZiIsCiAgICAibGJya3NsdTsiOiAiXHUyOThkIiwKICAgICJsY2Fyb247IjogIlx1MDEzZSIsCiAgICAibGNlZGlsOyI6ICJcdTAxM2MiLAogICAgImxjZWlsOyI6ICJcdTIzMDgiLAogICAgImxjdWI7IjogInsiLAogICAgImxjeTsiOiAiXHUwNDNiIiwKICAgICJsZGNhOyI6ICJcdTI5MzYiLAogICAgImxkcXVvOyI6ICJcdTIwMWMiLAogICAgImxkcXVvcjsiOiAiXHUyMDFlIiwKICAgICJsZHJkaGFyOyI6ICJcdTI5NjciLAogICAgImxkcnVzaGFyOyI6ICJcdTI5NGIiLAogICAgImxkc2g7IjogIlx1MjFiMiIsCiAgICAibGU7IjogIlx1MjI2NCIsCiAgICAibGVmdGFycm93OyI6ICJcdTIxOTAiLAogICAgImxlZnRhcnJvd3RhaWw7IjogIlx1MjFhMiIsCiAgICAibGVmdGhhcnBvb25kb3duOyI6ICJcdTIxYmQiLAogICAgImxlZnRoYXJwb29udXA7IjogIlx1MjFiYyIsCiAgICAibGVmdGxlZnRhcnJvd3M7IjogIlx1MjFjNyIsCiAgICAibGVmdHJpZ2h0YXJyb3c7IjogIlx1MjE5NCIsCiAgICAibGVmdHJpZ2h0YXJyb3dzOyI6ICJcdTIxYzYiLAogICAgImxlZnRyaWdodGhhcnBvb25zOyI6ICJcdTIxY2IiLAogICAgImxlZnRyaWdodHNxdWlnYXJyb3c7IjogIlx1MjFhZCIsCiAgICAibGVmdHRocmVldGltZXM7IjogIlx1MjJjYiIsCiAgICAibGVnOyI6ICJcdTIyZGEiLAogICAgImxlcTsiOiAiXHUyMjY0IiwKICAgICJsZXFxOyI6ICJcdTIyNjYiLAogICAgImxlcXNsYW50OyI6ICJcdTJhN2QiLAogICAgImxlczsiOiAiXHUyYTdkIiwKICAgICJsZXNjYzsiOiAiXHUyYWE4IiwKICAgICJsZXNkb3Q7IjogIlx1MmE3ZiIsCiAgICAibGVzZG90bzsiOiAiXHUyYTgxIiwKICAgICJsZXNkb3RvcjsiOiAiXHUyYTgzIiwKICAgICJsZXNnOyI6ICJcdTIyZGFcdWZlMDAiLAogICAgImxlc2dlczsiOiAiXHUyYTkzIiwKICAgICJsZXNzYXBwcm94OyI6ICJcdTJhODUiLAogICAgImxlc3Nkb3Q7IjogIlx1MjJkNiIsCiAgICAibGVzc2VxZ3RyOyI6ICJcdTIyZGEiLAogICAgImxlc3NlcXFndHI7IjogIlx1MmE4YiIsCiAgICAibGVzc2d0cjsiOiAiXHUyMjc2IiwKICAgICJsZXNzc2ltOyI6ICJcdTIyNzIiLAogICAgImxmaXNodDsiOiAiXHUyOTdjIiwKICAgICJsZmxvb3I7IjogIlx1MjMwYSIsCiAgICAibGZyOyI6ICJcVTAwMDFkNTI5IiwKICAgICJsZzsiOiAiXHUyMjc2IiwKICAgICJsZ0U7IjogIlx1MmE5MSIsCiAgICAibGhhcmQ7IjogIlx1MjFiZCIsCiAgICAibGhhcnU7IjogIlx1MjFiYyIsCiAgICAibGhhcnVsOyI6ICJcdTI5NmEiLAogICAgImxoYmxrOyI6ICJcdTI1ODQiLAogICAgImxqY3k7IjogIlx1MDQ1OSIsCiAgICAibGw7IjogIlx1MjI2YSIsCiAgICAibGxhcnI7IjogIlx1MjFjNyIsCiAgICAibGxjb3JuZXI7IjogIlx1MjMxZSIsCiAgICAibGxoYXJkOyI6ICJcdTI5NmIiLAogICAgImxsdHJpOyI6ICJcdTI1ZmEiLAogICAgImxtaWRvdDsiOiAiXHUwMTQwIiwKICAgICJsbW91c3Q7IjogIlx1MjNiMCIsCiAgICAibG1vdXN0YWNoZTsiOiAiXHUyM2IwIiwKICAgICJsbkU7IjogIlx1MjI2OCIsCiAgICAibG5hcDsiOiAiXHUyYTg5IiwKICAgICJsbmFwcHJveDsiOiAiXHUyYTg5IiwKICAgICJsbmU7IjogIlx1MmE4NyIsCiAgICAibG5lcTsiOiAiXHUyYTg3IiwKICAgICJsbmVxcTsiOiAiXHUyMjY4IiwKICAgICJsbnNpbTsiOiAiXHUyMmU2IiwKICAgICJsb2FuZzsiOiAiXHUyN2VjIiwKICAgICJsb2FycjsiOiAiXHUyMWZkIiwKICAgICJsb2JyazsiOiAiXHUyN2U2IiwKICAgICJsb25nbGVmdGFycm93OyI6ICJcdTI3ZjUiLAogICAgImxvbmdsZWZ0cmlnaHRhcnJvdzsiOiAiXHUyN2Y3IiwKICAgICJsb25nbWFwc3RvOyI6ICJcdTI3ZmMiLAogICAgImxvbmdyaWdodGFycm93OyI6ICJcdTI3ZjYiLAogICAgImxvb3BhcnJvd2xlZnQ7IjogIlx1MjFhYiIsCiAgICAibG9vcGFycm93cmlnaHQ7IjogIlx1MjFhYyIsCiAgICAibG9wYXI7IjogIlx1Mjk4NSIsCiAgICAibG9wZjsiOiAiXFUwMDAxZDU1ZCIsCiAgICAibG9wbHVzOyI6ICJcdTJhMmQiLAogICAgImxvdGltZXM7IjogIlx1MmEzNCIsCiAgICAibG93YXN0OyI6ICJcdTIyMTciLAogICAgImxvd2JhcjsiOiAiXyIsCiAgICAibG96OyI6ICJcdTI1Y2EiLAogICAgImxvemVuZ2U7IjogIlx1MjVjYSIsCiAgICAibG96ZjsiOiAiXHUyOWViIiwKICAgICJscGFyOyI6ICIoIiwKICAgICJscGFybHQ7IjogIlx1Mjk5MyIsCiAgICAibHJhcnI7IjogIlx1MjFjNiIsCiAgICAibHJjb3JuZXI7IjogIlx1MjMxZiIsCiAgICAibHJoYXI7IjogIlx1MjFjYiIsCiAgICAibHJoYXJkOyI6ICJcdTI5NmQiLAogICAgImxybTsiOiAiXHUyMDBlIiwKICAgICJscnRyaTsiOiAiXHUyMmJmIiwKICAgICJsc2FxdW87IjogIlx1MjAzOSIsCiAgICAibHNjcjsiOiAiXFUwMDAxZDRjMSIsCiAgICAibHNoOyI6ICJcdTIxYjAiLAogICAgImxzaW07IjogIlx1MjI3MiIsCiAgICAibHNpbWU7IjogIlx1MmE4ZCIsCiAgICAibHNpbWc7IjogIlx1MmE4ZiIsCiAgICAibHNxYjsiOiAiWyIsCiAgICAibHNxdW87IjogIlx1MjAxOCIsCiAgICAibHNxdW9yOyI6ICJcdTIwMWEiLAogICAgImxzdHJvazsiOiAiXHUwMTQyIiwKICAgICJsdCI6ICI8IiwKICAgICJsdDsiOiAiPCIsCiAgICAibHRjYzsiOiAiXHUyYWE2IiwKICAgICJsdGNpcjsiOiAiXHUyYTc5IiwKICAgICJsdGRvdDsiOiAiXHUyMmQ2IiwKICAgICJsdGhyZWU7IjogIlx1MjJjYiIsCiAgICAibHRpbWVzOyI6ICJcdTIyYzkiLAogICAgImx0bGFycjsiOiAiXHUyOTc2IiwKICAgICJsdHF1ZXN0OyI6ICJcdTJhN2IiLAogICAgImx0clBhcjsiOiAiXHUyOTk2IiwKICAgICJsdHJpOyI6ICJcdTI1YzMiLAogICAgImx0cmllOyI6ICJcdTIyYjQiLAogICAgImx0cmlmOyI6ICJcdTI1YzIiLAogICAgImx1cmRzaGFyOyI6ICJcdTI5NGEiLAogICAgImx1cnVoYXI7IjogIlx1Mjk2NiIsCiAgICAibHZlcnRuZXFxOyI6ICJcdTIyNjhcdWZlMDAiLAogICAgImx2bkU7IjogIlx1MjI2OFx1ZmUwMCIsCiAgICAibUREb3Q7IjogIlx1MjIzYSIsCiAgICAibWFjciI6ICJceGFmIiwKICAgICJtYWNyOyI6ICJceGFmIiwKICAgICJtYWxlOyI6ICJcdTI2NDIiLAogICAgIm1hbHQ7IjogIlx1MjcyMCIsCiAgICAibWFsdGVzZTsiOiAiXHUyNzIwIiwKICAgICJtYXA7IjogIlx1MjFhNiIsCiAgICAibWFwc3RvOyI6ICJcdTIxYTYiLAogICAgIm1hcHN0b2Rvd247IjogIlx1MjFhNyIsCiAgICAibWFwc3RvbGVmdDsiOiAiXHUyMWE0IiwKICAgICJtYXBzdG91cDsiOiAiXHUyMWE1IiwKICAgICJtYXJrZXI7IjogIlx1MjVhZSIsCiAgICAibWNvbW1hOyI6ICJcdTJhMjkiLAogICAgIm1jeTsiOiAiXHUwNDNjIiwKICAgICJtZGFzaDsiOiAiXHUyMDE0IiwKICAgICJtZWFzdXJlZGFuZ2xlOyI6ICJcdTIyMjEiLAogICAgIm1mcjsiOiAiXFUwMDAxZDUyYSIsCiAgICAibWhvOyI6ICJcdTIxMjciLAogICAgIm1pY3JvIjogIlx4YjUiLAogICAgIm1pY3JvOyI6ICJceGI1IiwKICAgICJtaWQ7IjogIlx1MjIyMyIsCiAgICAibWlkYXN0OyI6ICIqIiwKICAgICJtaWRjaXI7IjogIlx1MmFmMCIsCiAgICAibWlkZG90IjogIlx4YjciLAogICAgIm1pZGRvdDsiOiAiXHhiNyIsCiAgICAibWludXM7IjogIlx1MjIxMiIsCiAgICAibWludXNiOyI6ICJcdTIyOWYiLAogICAgIm1pbnVzZDsiOiAiXHUyMjM4IiwKICAgICJtaW51c2R1OyI6ICJcdTJhMmEiLAogICAgIm1sY3A7IjogIlx1MmFkYiIsCiAgICAibWxkcjsiOiAiXHUyMDI2IiwKICAgICJtbnBsdXM7IjogIlx1MjIxMyIsCiAgICAibW9kZWxzOyI6ICJcdTIyYTciLAogICAgIm1vcGY7IjogIlxVMDAwMWQ1NWUiLAogICAgIm1wOyI6ICJcdTIyMTMiLAogICAgIm1zY3I7IjogIlxVMDAwMWQ0YzIiLAogICAgIm1zdHBvczsiOiAiXHUyMjNlIiwKICAgICJtdTsiOiAiXHUwM2JjIiwKICAgICJtdWx0aW1hcDsiOiAiXHUyMmI4IiwKICAgICJtdW1hcDsiOiAiXHUyMmI4IiwKICAgICJuR2c7IjogIlx1MjJkOVx1MDMzOCIsCiAgICAibkd0OyI6ICJcdTIyNmJcdTIwZDIiLAogICAgIm5HdHY7IjogIlx1MjI2Ylx1MDMzOCIsCiAgICAibkxlZnRhcnJvdzsiOiAiXHUyMWNkIiwKICAgICJuTGVmdHJpZ2h0YXJyb3c7IjogIlx1MjFjZSIsCiAgICAibkxsOyI6ICJcdTIyZDhcdTAzMzgiLAogICAgIm5MdDsiOiAiXHUyMjZhXHUyMGQyIiwKICAgICJuTHR2OyI6ICJcdTIyNmFcdTAzMzgiLAogICAgIm5SaWdodGFycm93OyI6ICJcdTIxY2YiLAogICAgIm5WRGFzaDsiOiAiXHUyMmFmIiwKICAgICJuVmRhc2g7IjogIlx1MjJhZSIsCiAgICAibmFibGE7IjogIlx1MjIwNyIsCiAgICAibmFjdXRlOyI6ICJcdTAxNDQiLAogICAgIm5hbmc7IjogIlx1MjIyMFx1MjBkMiIsCiAgICAibmFwOyI6ICJcdTIyNDkiLAogICAgIm5hcEU7IjogIlx1MmE3MFx1MDMzOCIsCiAgICAibmFwaWQ7IjogIlx1MjI0Ylx1MDMzOCIsCiAgICAibmFwb3M7IjogIlx1MDE0OSIsCiAgICAibmFwcHJveDsiOiAiXHUyMjQ5IiwKICAgICJuYXR1cjsiOiAiXHUyNjZlIiwKICAgICJuYXR1cmFsOyI6ICJcdTI2NmUiLAogICAgIm5hdHVyYWxzOyI6ICJcdTIxMTUiLAogICAgIm5ic3AiOiAiXHhhMCIsCiAgICAibmJzcDsiOiAiXHhhMCIsCiAgICAibmJ1bXA7IjogIlx1MjI0ZVx1MDMzOCIsCiAgICAibmJ1bXBlOyI6ICJcdTIyNGZcdTAzMzgiLAogICAgIm5jYXA7IjogIlx1MmE0MyIsCiAgICAibmNhcm9uOyI6ICJcdTAxNDgiLAogICAgIm5jZWRpbDsiOiAiXHUwMTQ2IiwKICAgICJuY29uZzsiOiAiXHUyMjQ3IiwKICAgICJuY29uZ2RvdDsiOiAiXHUyYTZkXHUwMzM4IiwKICAgICJuY3VwOyI6ICJcdTJhNDIiLAogICAgIm5jeTsiOiAiXHUwNDNkIiwKICAgICJuZGFzaDsiOiAiXHUyMDEzIiwKICAgICJuZTsiOiAiXHUyMjYwIiwKICAgICJuZUFycjsiOiAiXHUyMWQ3IiwKICAgICJuZWFyaGs7IjogIlx1MjkyNCIsCiAgICAibmVhcnI7IjogIlx1MjE5NyIsCiAgICAibmVhcnJvdzsiOiAiXHUyMTk3IiwKICAgICJuZWRvdDsiOiAiXHUyMjUwXHUwMzM4IiwKICAgICJuZXF1aXY7IjogIlx1MjI2MiIsCiAgICAibmVzZWFyOyI6ICJcdTI5MjgiLAogICAgIm5lc2ltOyI6ICJcdTIyNDJcdTAzMzgiLAogICAgIm5leGlzdDsiOiAiXHUyMjA0IiwKICAgICJuZXhpc3RzOyI6ICJcdTIyMDQiLAogICAgIm5mcjsiOiAiXFUwMDAxZDUyYiIsCiAgICAibmdFOyI6ICJcdTIyNjdcdTAzMzgiLAogICAgIm5nZTsiOiAiXHUyMjcxIiwKICAgICJuZ2VxOyI6ICJcdTIyNzEiLAogICAgIm5nZXFxOyI6ICJcdTIyNjdcdTAzMzgiLAogICAgIm5nZXFzbGFudDsiOiAiXHUyYTdlXHUwMzM4IiwKICAgICJuZ2VzOyI6ICJcdTJhN2VcdTAzMzgiLAogICAgIm5nc2ltOyI6ICJcdTIyNzUiLAogICAgIm5ndDsiOiAiXHUyMjZmIiwKICAgICJuZ3RyOyI6ICJcdTIyNmYiLAogICAgIm5oQXJyOyI6ICJcdTIxY2UiLAogICAgIm5oYXJyOyI6ICJcdTIxYWUiLAogICAgIm5ocGFyOyI6ICJcdTJhZjIiLAogICAgIm5pOyI6ICJcdTIyMGIiLAogICAgIm5pczsiOiAiXHUyMmZjIiwKICAgICJuaXNkOyI6ICJcdTIyZmEiLAogICAgIm5pdjsiOiAiXHUyMjBiIiwKICAgICJuamN5OyI6ICJcdTA0NWEiLAogICAgIm5sQXJyOyI6ICJcdTIxY2QiLAogICAgIm5sRTsiOiAiXHUyMjY2XHUwMzM4IiwKICAgICJubGFycjsiOiAiXHUyMTlhIiwKICAgICJubGRyOyI6ICJcdTIwMjUiLAogICAgIm5sZTsiOiAiXHUyMjcwIiwKICAgICJubGVmdGFycm93OyI6ICJcdTIxOWEiLAogICAgIm5sZWZ0cmlnaHRhcnJvdzsiOiAiXHUyMWFlIiwKICAgICJubGVxOyI6ICJcdTIyNzAiLAogICAgIm5sZXFxOyI6ICJcdTIyNjZcdTAzMzgiLAogICAgIm5sZXFzbGFudDsiOiAiXHUyYTdkXHUwMzM4IiwKICAgICJubGVzOyI6ICJcdTJhN2RcdTAzMzgiLAogICAgIm5sZXNzOyI6ICJcdTIyNmUiLAogICAgIm5sc2ltOyI6ICJcdTIyNzQiLAogICAgIm5sdDsiOiAiXHUyMjZlIiwKICAgICJubHRyaTsiOiAiXHUyMmVhIiwKICAgICJubHRyaWU7IjogIlx1MjJlYyIsCiAgICAibm1pZDsiOiAiXHUyMjI0IiwKICAgICJub3BmOyI6ICJcVTAwMDFkNTVmIiwKICAgICJub3QiOiAiXHhhYyIsCiAgICAibm90OyI6ICJceGFjIiwKICAgICJub3RpbjsiOiAiXHUyMjA5IiwKICAgICJub3RpbkU7IjogIlx1MjJmOVx1MDMzOCIsCiAgICAibm90aW5kb3Q7IjogIlx1MjJmNVx1MDMzOCIsCiAgICAibm90aW52YTsiOiAiXHUyMjA5IiwKICAgICJub3RpbnZiOyI6ICJcdTIyZjciLAogICAgIm5vdGludmM7IjogIlx1MjJmNiIsCiAgICAibm90bmk7IjogIlx1MjIwYyIsCiAgICAibm90bml2YTsiOiAiXHUyMjBjIiwKICAgICJub3RuaXZiOyI6ICJcdTIyZmUiLAogICAgIm5vdG5pdmM7IjogIlx1MjJmZCIsCiAgICAibnBhcjsiOiAiXHUyMjI2IiwKICAgICJucGFyYWxsZWw7IjogIlx1MjIyNiIsCiAgICAibnBhcnNsOyI6ICJcdTJhZmRcdTIwZTUiLAogICAgIm5wYXJ0OyI6ICJcdTIyMDJcdTAzMzgiLAogICAgIm5wb2xpbnQ7IjogIlx1MmExNCIsCiAgICAibnByOyI6ICJcdTIyODAiLAogICAgIm5wcmN1ZTsiOiAiXHUyMmUwIiwKICAgICJucHJlOyI6ICJcdTJhYWZcdTAzMzgiLAogICAgIm5wcmVjOyI6ICJcdTIyODAiLAogICAgIm5wcmVjZXE7IjogIlx1MmFhZlx1MDMzOCIsCiAgICAibnJBcnI7IjogIlx1MjFjZiIsCiAgICAibnJhcnI7IjogIlx1MjE5YiIsCiAgICAibnJhcnJjOyI6ICJcdTI5MzNcdTAzMzgiLAogICAgIm5yYXJydzsiOiAiXHUyMTlkXHUwMzM4IiwKICAgICJucmlnaHRhcnJvdzsiOiAiXHUyMTliIiwKICAgICJucnRyaTsiOiAiXHUyMmViIiwKICAgICJucnRyaWU7IjogIlx1MjJlZCIsCiAgICAibnNjOyI6ICJcdTIyODEiLAogICAgIm5zY2N1ZTsiOiAiXHUyMmUxIiwKICAgICJuc2NlOyI6ICJcdTJhYjBcdTAzMzgiLAogICAgIm5zY3I7IjogIlxVMDAwMWQ0YzMiLAogICAgIm5zaG9ydG1pZDsiOiAiXHUyMjI0IiwKICAgICJuc2hvcnRwYXJhbGxlbDsiOiAiXHUyMjI2IiwKICAgICJuc2ltOyI6ICJcdTIyNDEiLAogICAgIm5zaW1lOyI6ICJcdTIyNDQiLAogICAgIm5zaW1lcTsiOiAiXHUyMjQ0IiwKICAgICJuc21pZDsiOiAiXHUyMjI0IiwKICAgICJuc3BhcjsiOiAiXHUyMjI2IiwKICAgICJuc3FzdWJlOyI6ICJcdTIyZTIiLAogICAgIm5zcXN1cGU7IjogIlx1MjJlMyIsCiAgICAibnN1YjsiOiAiXHUyMjg0IiwKICAgICJuc3ViRTsiOiAiXHUyYWM1XHUwMzM4IiwKICAgICJuc3ViZTsiOiAiXHUyMjg4IiwKICAgICJuc3Vic2V0OyI6ICJcdTIyODJcdTIwZDIiLAogICAgIm5zdWJzZXRlcTsiOiAiXHUyMjg4IiwKICAgICJuc3Vic2V0ZXFxOyI6ICJcdTJhYzVcdTAzMzgiLAogICAgIm5zdWNjOyI6ICJcdTIyODEiLAogICAgIm5zdWNjZXE7IjogIlx1MmFiMFx1MDMzOCIsCiAgICAibnN1cDsiOiAiXHUyMjg1IiwKICAgICJuc3VwRTsiOiAiXHUyYWM2XHUwMzM4IiwKICAgICJuc3VwZTsiOiAiXHUyMjg5IiwKICAgICJuc3Vwc2V0OyI6ICJcdTIyODNcdTIwZDIiLAogICAgIm5zdXBzZXRlcTsiOiAiXHUyMjg5IiwKICAgICJuc3Vwc2V0ZXFxOyI6ICJcdTJhYzZcdTAzMzgiLAogICAgIm50Z2w7IjogIlx1MjI3OSIsCiAgICAibnRpbGRlIjogIlx4ZjEiLAogICAgIm50aWxkZTsiOiAiXHhmMSIsCiAgICAibnRsZzsiOiAiXHUyMjc4IiwKICAgICJudHJpYW5nbGVsZWZ0OyI6ICJcdTIyZWEiLAogICAgIm50cmlhbmdsZWxlZnRlcTsiOiAiXHUyMmVjIiwKICAgICJudHJpYW5nbGVyaWdodDsiOiAiXHUyMmViIiwKICAgICJudHJpYW5nbGVyaWdodGVxOyI6ICJcdTIyZWQiLAogICAgIm51OyI6ICJcdTAzYmQiLAogICAgIm51bTsiOiAiIyIsCiAgICAibnVtZXJvOyI6ICJcdTIxMTYiLAogICAgIm51bXNwOyI6ICJcdTIwMDciLAogICAgIm52RGFzaDsiOiAiXHUyMmFkIiwKICAgICJudkhhcnI7IjogIlx1MjkwNCIsCiAgICAibnZhcDsiOiAiXHUyMjRkXHUyMGQyIiwKICAgICJudmRhc2g7IjogIlx1MjJhYyIsCiAgICAibnZnZTsiOiAiXHUyMjY1XHUyMGQyIiwKICAgICJudmd0OyI6ICI+XHUyMGQyIiwKICAgICJudmluZmluOyI6ICJcdTI5ZGUiLAogICAgIm52bEFycjsiOiAiXHUyOTAyIiwKICAgICJudmxlOyI6ICJcdTIyNjRcdTIwZDIiLAogICAgIm52bHQ7IjogIjxcdTIwZDIiLAogICAgIm52bHRyaWU7IjogIlx1MjJiNFx1MjBkMiIsCiAgICAibnZyQXJyOyI6ICJcdTI5MDMiLAogICAgIm52cnRyaWU7IjogIlx1MjJiNVx1MjBkMiIsCiAgICAibnZzaW07IjogIlx1MjIzY1x1MjBkMiIsCiAgICAibndBcnI7IjogIlx1MjFkNiIsCiAgICAibndhcmhrOyI6ICJcdTI5MjMiLAogICAgIm53YXJyOyI6ICJcdTIxOTYiLAogICAgIm53YXJyb3c7IjogIlx1MjE5NiIsCiAgICAibnduZWFyOyI6ICJcdTI5MjciLAogICAgIm9TOyI6ICJcdTI0YzgiLAogICAgIm9hY3V0ZSI6ICJceGYzIiwKICAgICJvYWN1dGU7IjogIlx4ZjMiLAogICAgIm9hc3Q7IjogIlx1MjI5YiIsCiAgICAib2NpcjsiOiAiXHUyMjlhIiwKICAgICJvY2lyYyI6ICJceGY0IiwKICAgICJvY2lyYzsiOiAiXHhmNCIsCiAgICAib2N5OyI6ICJcdTA0M2UiLAogICAgIm9kYXNoOyI6ICJcdTIyOWQiLAogICAgIm9kYmxhYzsiOiAiXHUwMTUxIiwKICAgICJvZGl2OyI6ICJcdTJhMzgiLAogICAgIm9kb3Q7IjogIlx1MjI5OSIsCiAgICAib2Rzb2xkOyI6ICJcdTI5YmMiLAogICAgIm9lbGlnOyI6ICJcdTAxNTMiLAogICAgIm9mY2lyOyI6ICJcdTI5YmYiLAogICAgIm9mcjsiOiAiXFUwMDAxZDUyYyIsCiAgICAib2dvbjsiOiAiXHUwMmRiIiwKICAgICJvZ3JhdmUiOiAiXHhmMiIsCiAgICAib2dyYXZlOyI6ICJceGYyIiwKICAgICJvZ3Q7IjogIlx1MjljMSIsCiAgICAib2hiYXI7IjogIlx1MjliNSIsCiAgICAib2htOyI6ICJcdTAzYTkiLAogICAgIm9pbnQ7IjogIlx1MjIyZSIsCiAgICAib2xhcnI7IjogIlx1MjFiYSIsCiAgICAib2xjaXI7IjogIlx1MjliZSIsCiAgICAib2xjcm9zczsiOiAiXHUyOWJiIiwKICAgICJvbGluZTsiOiAiXHUyMDNlIiwKICAgICJvbHQ7IjogIlx1MjljMCIsCiAgICAib21hY3I7IjogIlx1MDE0ZCIsCiAgICAib21lZ2E7IjogIlx1MDNjOSIsCiAgICAib21pY3JvbjsiOiAiXHUwM2JmIiwKICAgICJvbWlkOyI6ICJcdTI5YjYiLAogICAgIm9taW51czsiOiAiXHUyMjk2IiwKICAgICJvb3BmOyI6ICJcVTAwMDFkNTYwIiwKICAgICJvcGFyOyI6ICJcdTI5YjciLAogICAgIm9wZXJwOyI6ICJcdTI5YjkiLAogICAgIm9wbHVzOyI6ICJcdTIyOTUiLAogICAgIm9yOyI6ICJcdTIyMjgiLAogICAgIm9yYXJyOyI6ICJcdTIxYmIiLAogICAgIm9yZDsiOiAiXHUyYTVkIiwKICAgICJvcmRlcjsiOiAiXHUyMTM0IiwKICAgICJvcmRlcm9mOyI6ICJcdTIxMzQiLAogICAgIm9yZGYiOiAiXHhhYSIsCiAgICAib3JkZjsiOiAiXHhhYSIsCiAgICAib3JkbSI6ICJceGJhIiwKICAgICJvcmRtOyI6ICJceGJhIiwKICAgICJvcmlnb2Y7IjogIlx1MjJiNiIsCiAgICAib3JvcjsiOiAiXHUyYTU2IiwKICAgICJvcnNsb3BlOyI6ICJcdTJhNTciLAogICAgIm9ydjsiOiAiXHUyYTViIiwKICAgICJvc2NyOyI6ICJcdTIxMzQiLAogICAgIm9zbGFzaCI6ICJceGY4IiwKICAgICJvc2xhc2g7IjogIlx4ZjgiLAogICAgIm9zb2w7IjogIlx1MjI5OCIsCiAgICAib3RpbGRlIjogIlx4ZjUiLAogICAgIm90aWxkZTsiOiAiXHhmNSIsCiAgICAib3RpbWVzOyI6ICJcdTIyOTciLAogICAgIm90aW1lc2FzOyI6ICJcdTJhMzYiLAogICAgIm91bWwiOiAiXHhmNiIsCiAgICAib3VtbDsiOiAiXHhmNiIsCiAgICAib3ZiYXI7IjogIlx1MjMzZCIsCiAgICAicGFyOyI6ICJcdTIyMjUiLAogICAgInBhcmEiOiAiXHhiNiIsCiAgICAicGFyYTsiOiAiXHhiNiIsCiAgICAicGFyYWxsZWw7IjogIlx1MjIyNSIsCiAgICAicGFyc2ltOyI6ICJcdTJhZjMiLAogICAgInBhcnNsOyI6ICJcdTJhZmQiLAogICAgInBhcnQ7IjogIlx1MjIwMiIsCiAgICAicGN5OyI6ICJcdTA0M2YiLAogICAgInBlcmNudDsiOiAiJSIsCiAgICAicGVyaW9kOyI6ICIuIiwKICAgICJwZXJtaWw7IjogIlx1MjAzMCIsCiAgICAicGVycDsiOiAiXHUyMmE1IiwKICAgICJwZXJ0ZW5rOyI6ICJcdTIwMzEiLAogICAgInBmcjsiOiAiXFUwMDAxZDUyZCIsCiAgICAicGhpOyI6ICJcdTAzYzYiLAogICAgInBoaXY7IjogIlx1MDNkNSIsCiAgICAicGhtbWF0OyI6ICJcdTIxMzMiLAogICAgInBob25lOyI6ICJcdTI2MGUiLAogICAgInBpOyI6ICJcdTAzYzAiLAogICAgInBpdGNoZm9yazsiOiAiXHUyMmQ0IiwKICAgICJwaXY7IjogIlx1MDNkNiIsCiAgICAicGxhbmNrOyI6ICJcdTIxMGYiLAogICAgInBsYW5ja2g7IjogIlx1MjEwZSIsCiAgICAicGxhbmt2OyI6ICJcdTIxMGYiLAogICAgInBsdXM7IjogIisiLAogICAgInBsdXNhY2lyOyI6ICJcdTJhMjMiLAogICAgInBsdXNiOyI6ICJcdTIyOWUiLAogICAgInBsdXNjaXI7IjogIlx1MmEyMiIsCiAgICAicGx1c2RvOyI6ICJcdTIyMTQiLAogICAgInBsdXNkdTsiOiAiXHUyYTI1IiwKICAgICJwbHVzZTsiOiAiXHUyYTcyIiwKICAgICJwbHVzbW4iOiAiXHhiMSIsCiAgICAicGx1c21uOyI6ICJceGIxIiwKICAgICJwbHVzc2ltOyI6ICJcdTJhMjYiLAogICAgInBsdXN0d287IjogIlx1MmEyNyIsCiAgICAicG07IjogIlx4YjEiLAogICAgInBvaW50aW50OyI6ICJcdTJhMTUiLAogICAgInBvcGY7IjogIlxVMDAwMWQ1NjEiLAogICAgInBvdW5kIjogIlx4YTMiLAogICAgInBvdW5kOyI6ICJceGEzIiwKICAgICJwcjsiOiAiXHUyMjdhIiwKICAgICJwckU7IjogIlx1MmFiMyIsCiAgICAicHJhcDsiOiAiXHUyYWI3IiwKICAgICJwcmN1ZTsiOiAiXHUyMjdjIiwKICAgICJwcmU7IjogIlx1MmFhZiIsCiAgICAicHJlYzsiOiAiXHUyMjdhIiwKICAgICJwcmVjYXBwcm94OyI6ICJcdTJhYjciLAogICAgInByZWNjdXJseWVxOyI6ICJcdTIyN2MiLAogICAgInByZWNlcTsiOiAiXHUyYWFmIiwKICAgICJwcmVjbmFwcHJveDsiOiAiXHUyYWI5IiwKICAgICJwcmVjbmVxcTsiOiAiXHUyYWI1IiwKICAgICJwcmVjbnNpbTsiOiAiXHUyMmU4IiwKICAgICJwcmVjc2ltOyI6ICJcdTIyN2UiLAogICAgInByaW1lOyI6ICJcdTIwMzIiLAogICAgInByaW1lczsiOiAiXHUyMTE5IiwKICAgICJwcm5FOyI6ICJcdTJhYjUiLAogICAgInBybmFwOyI6ICJcdTJhYjkiLAogICAgInBybnNpbTsiOiAiXHUyMmU4IiwKICAgICJwcm9kOyI6ICJcdTIyMGYiLAogICAgInByb2ZhbGFyOyI6ICJcdTIzMmUiLAogICAgInByb2ZsaW5lOyI6ICJcdTIzMTIiLAogICAgInByb2ZzdXJmOyI6ICJcdTIzMTMiLAogICAgInByb3A7IjogIlx1MjIxZCIsCiAgICAicHJvcHRvOyI6ICJcdTIyMWQiLAogICAgInByc2ltOyI6ICJcdTIyN2UiLAogICAgInBydXJlbDsiOiAiXHUyMmIwIiwKICAgICJwc2NyOyI6ICJcVTAwMDFkNGM1IiwKICAgICJwc2k7IjogIlx1MDNjOCIsCiAgICAicHVuY3NwOyI6ICJcdTIwMDgiLAogICAgInFmcjsiOiAiXFUwMDAxZDUyZSIsCiAgICAicWludDsiOiAiXHUyYTBjIiwKICAgICJxb3BmOyI6ICJcVTAwMDFkNTYyIiwKICAgICJxcHJpbWU7IjogIlx1MjA1NyIsCiAgICAicXNjcjsiOiAiXFUwMDAxZDRjNiIsCiAgICAicXVhdGVybmlvbnM7IjogIlx1MjEwZCIsCiAgICAicXVhdGludDsiOiAiXHUyYTE2IiwKICAgICJxdWVzdDsiOiAiPyIsCiAgICAicXVlc3RlcTsiOiAiXHUyMjVmIiwKICAgICJxdW90IjogIlwiIiwKICAgICJxdW90OyI6ICJcIiIsCiAgICAickFhcnI7IjogIlx1MjFkYiIsCiAgICAickFycjsiOiAiXHUyMWQyIiwKICAgICJyQXRhaWw7IjogIlx1MjkxYyIsCiAgICAickJhcnI7IjogIlx1MjkwZiIsCiAgICAickhhcjsiOiAiXHUyOTY0IiwKICAgICJyYWNlOyI6ICJcdTIyM2RcdTAzMzEiLAogICAgInJhY3V0ZTsiOiAiXHUwMTU1IiwKICAgICJyYWRpYzsiOiAiXHUyMjFhIiwKICAgICJyYWVtcHR5djsiOiAiXHUyOWIzIiwKICAgICJyYW5nOyI6ICJcdTI3ZTkiLAogICAgInJhbmdkOyI6ICJcdTI5OTIiLAogICAgInJhbmdlOyI6ICJcdTI5YTUiLAogICAgInJhbmdsZTsiOiAiXHUyN2U5IiwKICAgICJyYXF1byI6ICJceGJiIiwKICAgICJyYXF1bzsiOiAiXHhiYiIsCiAgICAicmFycjsiOiAiXHUyMTkyIiwKICAgICJyYXJyYXA7IjogIlx1Mjk3NSIsCiAgICAicmFycmI7IjogIlx1MjFlNSIsCiAgICAicmFycmJmczsiOiAiXHUyOTIwIiwKICAgICJyYXJyYzsiOiAiXHUyOTMzIiwKICAgICJyYXJyZnM7IjogIlx1MjkxZSIsCiAgICAicmFycmhrOyI6ICJcdTIxYWEiLAogICAgInJhcnJscDsiOiAiXHUyMWFjIiwKICAgICJyYXJycGw7IjogIlx1Mjk0NSIsCiAgICAicmFycnNpbTsiOiAiXHUyOTc0IiwKICAgICJyYXJydGw7IjogIlx1MjFhMyIsCiAgICAicmFycnc7IjogIlx1MjE5ZCIsCiAgICAicmF0YWlsOyI6ICJcdTI5MWEiLAogICAgInJhdGlvOyI6ICJcdTIyMzYiLAogICAgInJhdGlvbmFsczsiOiAiXHUyMTFhIiwKICAgICJyYmFycjsiOiAiXHUyOTBkIiwKICAgICJyYmJyazsiOiAiXHUyNzczIiwKICAgICJyYnJhY2U7IjogIn0iLAogICAgInJicmFjazsiOiAiXSIsCiAgICAicmJya2U7IjogIlx1Mjk4YyIsCiAgICAicmJya3NsZDsiOiAiXHUyOThlIiwKICAgICJyYnJrc2x1OyI6ICJcdTI5OTAiLAogICAgInJjYXJvbjsiOiAiXHUwMTU5IiwKICAgICJyY2VkaWw7IjogIlx1MDE1NyIsCiAgICAicmNlaWw7IjogIlx1MjMwOSIsCiAgICAicmN1YjsiOiAifSIsCiAgICAicmN5OyI6ICJcdTA0NDAiLAogICAgInJkY2E7IjogIlx1MjkzNyIsCiAgICAicmRsZGhhcjsiOiAiXHUyOTY5IiwKICAgICJyZHF1bzsiOiAiXHUyMDFkIiwKICAgICJyZHF1b3I7IjogIlx1MjAxZCIsCiAgICAicmRzaDsiOiAiXHUyMWIzIiwKICAgICJyZWFsOyI6ICJcdTIxMWMiLAogICAgInJlYWxpbmU7IjogIlx1MjExYiIsCiAgICAicmVhbHBhcnQ7IjogIlx1MjExYyIsCiAgICAicmVhbHM7IjogIlx1MjExZCIsCiAgICAicmVjdDsiOiAiXHUyNWFkIiwKICAgICJyZWciOiAiXHhhZSIsCiAgICAicmVnOyI6ICJceGFlIiwKICAgICJyZmlzaHQ7IjogIlx1Mjk3ZCIsCiAgICAicmZsb29yOyI6ICJcdTIzMGIiLAogICAgInJmcjsiOiAiXFUwMDAxZDUyZiIsCiAgICAicmhhcmQ7IjogIlx1MjFjMSIsCiAgICAicmhhcnU7IjogIlx1MjFjMCIsCiAgICAicmhhcnVsOyI6ICJcdTI5NmMiLAogICAgInJobzsiOiAiXHUwM2MxIiwKICAgICJyaG92OyI6ICJcdTAzZjEiLAogICAgInJpZ2h0YXJyb3c7IjogIlx1MjE5MiIsCiAgICAicmlnaHRhcnJvd3RhaWw7IjogIlx1MjFhMyIsCiAgICAicmlnaHRoYXJwb29uZG93bjsiOiAiXHUyMWMxIiwKICAgICJyaWdodGhhcnBvb251cDsiOiAiXHUyMWMwIiwKICAgICJyaWdodGxlZnRhcnJvd3M7IjogIlx1MjFjNCIsCiAgICAicmlnaHRsZWZ0aGFycG9vbnM7IjogIlx1MjFjYyIsCiAgICAicmlnaHRyaWdodGFycm93czsiOiAiXHUyMWM5IiwKICAgICJyaWdodHNxdWlnYXJyb3c7IjogIlx1MjE5ZCIsCiAgICAicmlnaHR0aHJlZXRpbWVzOyI6ICJcdTIyY2MiLAogICAgInJpbmc7IjogIlx1MDJkYSIsCiAgICAicmlzaW5nZG90c2VxOyI6ICJcdTIyNTMiLAogICAgInJsYXJyOyI6ICJcdTIxYzQiLAogICAgInJsaGFyOyI6ICJcdTIxY2MiLAogICAgInJsbTsiOiAiXHUyMDBmIiwKICAgICJybW91c3Q7IjogIlx1MjNiMSIsCiAgICAicm1vdXN0YWNoZTsiOiAiXHUyM2IxIiwKICAgICJybm1pZDsiOiAiXHUyYWVlIiwKICAgICJyb2FuZzsiOiAiXHUyN2VkIiwKICAgICJyb2FycjsiOiAiXHUyMWZlIiwKICAgICJyb2JyazsiOiAiXHUyN2U3IiwKICAgICJyb3BhcjsiOiAiXHUyOTg2IiwKICAgICJyb3BmOyI6ICJcVTAwMDFkNTYzIiwKICAgICJyb3BsdXM7IjogIlx1MmEyZSIsCiAgICAicm90aW1lczsiOiAiXHUyYTM1IiwKICAgICJycGFyOyI6ICIpIiwKICAgICJycGFyZ3Q7IjogIlx1Mjk5NCIsCiAgICAicnBwb2xpbnQ7IjogIlx1MmExMiIsCiAgICAicnJhcnI7IjogIlx1MjFjOSIsCiAgICAicnNhcXVvOyI6ICJcdTIwM2EiLAogICAgInJzY3I7IjogIlxVMDAwMWQ0YzciLAogICAgInJzaDsiOiAiXHUyMWIxIiwKICAgICJyc3FiOyI6ICJdIiwKICAgICJyc3F1bzsiOiAiXHUyMDE5IiwKICAgICJyc3F1b3I7IjogIlx1MjAxOSIsCiAgICAicnRocmVlOyI6ICJcdTIyY2MiLAogICAgInJ0aW1lczsiOiAiXHUyMmNhIiwKICAgICJydHJpOyI6ICJcdTI1YjkiLAogICAgInJ0cmllOyI6ICJcdTIyYjUiLAogICAgInJ0cmlmOyI6ICJcdTI1YjgiLAogICAgInJ0cmlsdHJpOyI6ICJcdTI5Y2UiLAogICAgInJ1bHVoYXI7IjogIlx1Mjk2OCIsCiAgICAicng7IjogIlx1MjExZSIsCiAgICAic2FjdXRlOyI6ICJcdTAxNWIiLAogICAgInNicXVvOyI6ICJcdTIwMWEiLAogICAgInNjOyI6ICJcdTIyN2IiLAogICAgInNjRTsiOiAiXHUyYWI0IiwKICAgICJzY2FwOyI6ICJcdTJhYjgiLAogICAgInNjYXJvbjsiOiAiXHUwMTYxIiwKICAgICJzY2N1ZTsiOiAiXHUyMjdkIiwKICAgICJzY2U7IjogIlx1MmFiMCIsCiAgICAic2NlZGlsOyI6ICJcdTAxNWYiLAogICAgInNjaXJjOyI6ICJcdTAxNWQiLAogICAgInNjbkU7IjogIlx1MmFiNiIsCiAgICAic2NuYXA7IjogIlx1MmFiYSIsCiAgICAic2Nuc2ltOyI6ICJcdTIyZTkiLAogICAgInNjcG9saW50OyI6ICJcdTJhMTMiLAogICAgInNjc2ltOyI6ICJcdTIyN2YiLAogICAgInNjeTsiOiAiXHUwNDQxIiwKICAgICJzZG90OyI6ICJcdTIyYzUiLAogICAgInNkb3RiOyI6ICJcdTIyYTEiLAogICAgInNkb3RlOyI6ICJcdTJhNjYiLAogICAgInNlQXJyOyI6ICJcdTIxZDgiLAogICAgInNlYXJoazsiOiAiXHUyOTI1IiwKICAgICJzZWFycjsiOiAiXHUyMTk4IiwKICAgICJzZWFycm93OyI6ICJcdTIxOTgiLAogICAgInNlY3QiOiAiXHhhNyIsCiAgICAic2VjdDsiOiAiXHhhNyIsCiAgICAic2VtaTsiOiAiOyIsCiAgICAic2Vzd2FyOyI6ICJcdTI5MjkiLAogICAgInNldG1pbnVzOyI6ICJcdTIyMTYiLAogICAgInNldG1uOyI6ICJcdTIyMTYiLAogICAgInNleHQ7IjogIlx1MjczNiIsCiAgICAic2ZyOyI6ICJcVTAwMDFkNTMwIiwKICAgICJzZnJvd247IjogIlx1MjMyMiIsCiAgICAic2hhcnA7IjogIlx1MjY2ZiIsCiAgICAic2hjaGN5OyI6ICJcdTA0NDkiLAogICAgInNoY3k7IjogIlx1MDQ0OCIsCiAgICAic2hvcnRtaWQ7IjogIlx1MjIyMyIsCiAgICAic2hvcnRwYXJhbGxlbDsiOiAiXHUyMjI1IiwKICAgICJzaHkiOiAiXHhhZCIsCiAgICAic2h5OyI6ICJceGFkIiwKICAgICJzaWdtYTsiOiAiXHUwM2MzIiwKICAgICJzaWdtYWY7IjogIlx1MDNjMiIsCiAgICAic2lnbWF2OyI6ICJcdTAzYzIiLAogICAgInNpbTsiOiAiXHUyMjNjIiwKICAgICJzaW1kb3Q7IjogIlx1MmE2YSIsCiAgICAic2ltZTsiOiAiXHUyMjQzIiwKICAgICJzaW1lcTsiOiAiXHUyMjQzIiwKICAgICJzaW1nOyI6ICJcdTJhOWUiLAogICAgInNpbWdFOyI6ICJcdTJhYTAiLAogICAgInNpbWw7IjogIlx1MmE5ZCIsCiAgICAic2ltbEU7IjogIlx1MmE5ZiIsCiAgICAic2ltbmU7IjogIlx1MjI0NiIsCiAgICAic2ltcGx1czsiOiAiXHUyYTI0IiwKICAgICJzaW1yYXJyOyI6ICJcdTI5NzIiLAogICAgInNsYXJyOyI6ICJcdTIxOTAiLAogICAgInNtYWxsc2V0bWludXM7IjogIlx1MjIxNiIsCiAgICAic21hc2hwOyI6ICJcdTJhMzMiLAogICAgInNtZXBhcnNsOyI6ICJcdTI5ZTQiLAogICAgInNtaWQ7IjogIlx1MjIyMyIsCiAgICAic21pbGU7IjogIlx1MjMyMyIsCiAgICAic210OyI6ICJcdTJhYWEiLAogICAgInNtdGU7IjogIlx1MmFhYyIsCiAgICAic210ZXM7IjogIlx1MmFhY1x1ZmUwMCIsCiAgICAic29mdGN5OyI6ICJcdTA0NGMiLAogICAgInNvbDsiOiAiLyIsCiAgICAic29sYjsiOiAiXHUyOWM0IiwKICAgICJzb2xiYXI7IjogIlx1MjMzZiIsCiAgICAic29wZjsiOiAiXFUwMDAxZDU2NCIsCiAgICAic3BhZGVzOyI6ICJcdTI2NjAiLAogICAgInNwYWRlc3VpdDsiOiAiXHUyNjYwIiwKICAgICJzcGFyOyI6ICJcdTIyMjUiLAogICAgInNxY2FwOyI6ICJcdTIyOTMiLAogICAgInNxY2FwczsiOiAiXHUyMjkzXHVmZTAwIiwKICAgICJzcWN1cDsiOiAiXHUyMjk0IiwKICAgICJzcWN1cHM7IjogIlx1MjI5NFx1ZmUwMCIsCiAgICAic3FzdWI7IjogIlx1MjI4ZiIsCiAgICAic3FzdWJlOyI6ICJcdTIyOTEiLAogICAgInNxc3Vic2V0OyI6ICJcdTIyOGYiLAogICAgInNxc3Vic2V0ZXE7IjogIlx1MjI5MSIsCiAgICAic3FzdXA7IjogIlx1MjI5MCIsCiAgICAic3FzdXBlOyI6ICJcdTIyOTIiLAogICAgInNxc3Vwc2V0OyI6ICJcdTIyOTAiLAogICAgInNxc3Vwc2V0ZXE7IjogIlx1MjI5MiIsCiAgICAic3F1OyI6ICJcdTI1YTEiLAogICAgInNxdWFyZTsiOiAiXHUyNWExIiwKICAgICJzcXVhcmY7IjogIlx1MjVhYSIsCiAgICAic3F1ZjsiOiAiXHUyNWFhIiwKICAgICJzcmFycjsiOiAiXHUyMTkyIiwKICAgICJzc2NyOyI6ICJcVTAwMDFkNGM4IiwKICAgICJzc2V0bW47IjogIlx1MjIxNiIsCiAgICAic3NtaWxlOyI6ICJcdTIzMjMiLAogICAgInNzdGFyZjsiOiAiXHUyMmM2IiwKICAgICJzdGFyOyI6ICJcdTI2MDYiLAogICAgInN0YXJmOyI6ICJcdTI2MDUiLAogICAgInN0cmFpZ2h0ZXBzaWxvbjsiOiAiXHUwM2Y1IiwKICAgICJzdHJhaWdodHBoaTsiOiAiXHUwM2Q1IiwKICAgICJzdHJuczsiOiAiXHhhZiIsCiAgICAic3ViOyI6ICJcdTIyODIiLAogICAgInN1YkU7IjogIlx1MmFjNSIsCiAgICAic3ViZG90OyI6ICJcdTJhYmQiLAogICAgInN1YmU7IjogIlx1MjI4NiIsCiAgICAic3ViZWRvdDsiOiAiXHUyYWMzIiwKICAgICJzdWJtdWx0OyI6ICJcdTJhYzEiLAogICAgInN1Ym5FOyI6ICJcdTJhY2IiLAogICAgInN1Ym5lOyI6ICJcdTIyOGEiLAogICAgInN1YnBsdXM7IjogIlx1MmFiZiIsCiAgICAic3VicmFycjsiOiAiXHUyOTc5IiwKICAgICJzdWJzZXQ7IjogIlx1MjI4MiIsCiAgICAic3Vic2V0ZXE7IjogIlx1MjI4NiIsCiAgICAic3Vic2V0ZXFxOyI6ICJcdTJhYzUiLAogICAgInN1YnNldG5lcTsiOiAiXHUyMjhhIiwKICAgICJzdWJzZXRuZXFxOyI6ICJcdTJhY2IiLAogICAgInN1YnNpbTsiOiAiXHUyYWM3IiwKICAgICJzdWJzdWI7IjogIlx1MmFkNSIsCiAgICAic3Vic3VwOyI6ICJcdTJhZDMiLAogICAgInN1Y2M7IjogIlx1MjI3YiIsCiAgICAic3VjY2FwcHJveDsiOiAiXHUyYWI4IiwKICAgICJzdWNjY3VybHllcTsiOiAiXHUyMjdkIiwKICAgICJzdWNjZXE7IjogIlx1MmFiMCIsCiAgICAic3VjY25hcHByb3g7IjogIlx1MmFiYSIsCiAgICAic3VjY25lcXE7IjogIlx1MmFiNiIsCiAgICAic3VjY25zaW07IjogIlx1MjJlOSIsCiAgICAic3VjY3NpbTsiOiAiXHUyMjdmIiwKICAgICJzdW07IjogIlx1MjIxMSIsCiAgICAic3VuZzsiOiAiXHUyNjZhIiwKICAgICJzdXAxIjogIlx4YjkiLAogICAgInN1cDE7IjogIlx4YjkiLAogICAgInN1cDIiOiAiXHhiMiIsCiAgICAic3VwMjsiOiAiXHhiMiIsCiAgICAic3VwMyI6ICJceGIzIiwKICAgICJzdXAzOyI6ICJceGIzIiwKICAgICJzdXA7IjogIlx1MjI4MyIsCiAgICAic3VwRTsiOiAiXHUyYWM2IiwKICAgICJzdXBkb3Q7IjogIlx1MmFiZSIsCiAgICAic3VwZHN1YjsiOiAiXHUyYWQ4IiwKICAgICJzdXBlOyI6ICJcdTIyODciLAogICAgInN1cGVkb3Q7IjogIlx1MmFjNCIsCiAgICAic3VwaHNvbDsiOiAiXHUyN2M5IiwKICAgICJzdXBoc3ViOyI6ICJcdTJhZDciLAogICAgInN1cGxhcnI7IjogIlx1Mjk3YiIsCiAgICAic3VwbXVsdDsiOiAiXHUyYWMyIiwKICAgICJzdXBuRTsiOiAiXHUyYWNjIiwKICAgICJzdXBuZTsiOiAiXHUyMjhiIiwKICAgICJzdXBwbHVzOyI6ICJcdTJhYzAiLAogICAgInN1cHNldDsiOiAiXHUyMjgzIiwKICAgICJzdXBzZXRlcTsiOiAiXHUyMjg3IiwKICAgICJzdXBzZXRlcXE7IjogIlx1MmFjNiIsCiAgICAic3Vwc2V0bmVxOyI6ICJcdTIyOGIiLAogICAgInN1cHNldG5lcXE7IjogIlx1MmFjYyIsCiAgICAic3Vwc2ltOyI6ICJcdTJhYzgiLAogICAgInN1cHN1YjsiOiAiXHUyYWQ0IiwKICAgICJzdXBzdXA7IjogIlx1MmFkNiIsCiAgICAic3dBcnI7IjogIlx1MjFkOSIsCiAgICAic3dhcmhrOyI6ICJcdTI5MjYiLAogICAgInN3YXJyOyI6ICJcdTIxOTkiLAogICAgInN3YXJyb3c7IjogIlx1MjE5OSIsCiAgICAic3dud2FyOyI6ICJcdTI5MmEiLAogICAgInN6bGlnIjogIlx4ZGYiLAogICAgInN6bGlnOyI6ICJceGRmIiwKICAgICJ0YXJnZXQ7IjogIlx1MjMxNiIsCiAgICAidGF1OyI6ICJcdTAzYzQiLAogICAgInRicms7IjogIlx1MjNiNCIsCiAgICAidGNhcm9uOyI6ICJcdTAxNjUiLAogICAgInRjZWRpbDsiOiAiXHUwMTYzIiwKICAgICJ0Y3k7IjogIlx1MDQ0MiIsCiAgICAidGRvdDsiOiAiXHUyMGRiIiwKICAgICJ0ZWxyZWM7IjogIlx1MjMxNSIsCiAgICAidGZyOyI6ICJcVTAwMDFkNTMxIiwKICAgICJ0aGVyZTQ7IjogIlx1MjIzNCIsCiAgICAidGhlcmVmb3JlOyI6ICJcdTIyMzQiLAogICAgInRoZXRhOyI6ICJcdTAzYjgiLAogICAgInRoZXRhc3ltOyI6ICJcdTAzZDEiLAogICAgInRoZXRhdjsiOiAiXHUwM2QxIiwKICAgICJ0aGlja2FwcHJveDsiOiAiXHUyMjQ4IiwKICAgICJ0aGlja3NpbTsiOiAiXHUyMjNjIiwKICAgICJ0aGluc3A7IjogIlx1MjAwOSIsCiAgICAidGhrYXA7IjogIlx1MjI0OCIsCiAgICAidGhrc2ltOyI6ICJcdTIyM2MiLAogICAgInRob3JuIjogIlx4ZmUiLAogICAgInRob3JuOyI6ICJceGZlIiwKICAgICJ0aWxkZTsiOiAiXHUwMmRjIiwKICAgICJ0aW1lcyI6ICJceGQ3IiwKICAgICJ0aW1lczsiOiAiXHhkNyIsCiAgICAidGltZXNiOyI6ICJcdTIyYTAiLAogICAgInRpbWVzYmFyOyI6ICJcdTJhMzEiLAogICAgInRpbWVzZDsiOiAiXHUyYTMwIiwKICAgICJ0aW50OyI6ICJcdTIyMmQiLAogICAgInRvZWE7IjogIlx1MjkyOCIsCiAgICAidG9wOyI6ICJcdTIyYTQiLAogICAgInRvcGJvdDsiOiAiXHUyMzM2IiwKICAgICJ0b3BjaXI7IjogIlx1MmFmMSIsCiAgICAidG9wZjsiOiAiXFUwMDAxZDU2NSIsCiAgICAidG9wZm9yazsiOiAiXHUyYWRhIiwKICAgICJ0b3NhOyI6ICJcdTI5MjkiLAogICAgInRwcmltZTsiOiAiXHUyMDM0IiwKICAgICJ0cmFkZTsiOiAiXHUyMTIyIiwKICAgICJ0cmlhbmdsZTsiOiAiXHUyNWI1IiwKICAgICJ0cmlhbmdsZWRvd247IjogIlx1MjViZiIsCiAgICAidHJpYW5nbGVsZWZ0OyI6ICJcdTI1YzMiLAogICAgInRyaWFuZ2xlbGVmdGVxOyI6ICJcdTIyYjQiLAogICAgInRyaWFuZ2xlcTsiOiAiXHUyMjVjIiwKICAgICJ0cmlhbmdsZXJpZ2h0OyI6ICJcdTI1YjkiLAogICAgInRyaWFuZ2xlcmlnaHRlcTsiOiAiXHUyMmI1IiwKICAgICJ0cmlkb3Q7IjogIlx1MjVlYyIsCiAgICAidHJpZTsiOiAiXHUyMjVjIiwKICAgICJ0cmltaW51czsiOiAiXHUyYTNhIiwKICAgICJ0cmlwbHVzOyI6ICJcdTJhMzkiLAogICAgInRyaXNiOyI6ICJcdTI5Y2QiLAogICAgInRyaXRpbWU7IjogIlx1MmEzYiIsCiAgICAidHJwZXppdW07IjogIlx1MjNlMiIsCiAgICAidHNjcjsiOiAiXFUwMDAxZDRjOSIsCiAgICAidHNjeTsiOiAiXHUwNDQ2IiwKICAgICJ0c2hjeTsiOiAiXHUwNDViIiwKICAgICJ0c3Ryb2s7IjogIlx1MDE2NyIsCiAgICAidHdpeHQ7IjogIlx1MjI2YyIsCiAgICAidHdvaGVhZGxlZnRhcnJvdzsiOiAiXHUyMTllIiwKICAgICJ0d29oZWFkcmlnaHRhcnJvdzsiOiAiXHUyMWEwIiwKICAgICJ1QXJyOyI6ICJcdTIxZDEiLAogICAgInVIYXI7IjogIlx1Mjk2MyIsCiAgICAidWFjdXRlIjogIlx4ZmEiLAogICAgInVhY3V0ZTsiOiAiXHhmYSIsCiAgICAidWFycjsiOiAiXHUyMTkxIiwKICAgICJ1YnJjeTsiOiAiXHUwNDVlIiwKICAgICJ1YnJldmU7IjogIlx1MDE2ZCIsCiAgICAidWNpcmMiOiAiXHhmYiIsCiAgICAidWNpcmM7IjogIlx4ZmIiLAogICAgInVjeTsiOiAiXHUwNDQzIiwKICAgICJ1ZGFycjsiOiAiXHUyMWM1IiwKICAgICJ1ZGJsYWM7IjogIlx1MDE3MSIsCiAgICAidWRoYXI7IjogIlx1Mjk2ZSIsCiAgICAidWZpc2h0OyI6ICJcdTI5N2UiLAogICAgInVmcjsiOiAiXFUwMDAxZDUzMiIsCiAgICAidWdyYXZlIjogIlx4ZjkiLAogICAgInVncmF2ZTsiOiAiXHhmOSIsCiAgICAidWhhcmw7IjogIlx1MjFiZiIsCiAgICAidWhhcnI7IjogIlx1MjFiZSIsCiAgICAidWhibGs7IjogIlx1MjU4MCIsCiAgICAidWxjb3JuOyI6ICJcdTIzMWMiLAogICAgInVsY29ybmVyOyI6ICJcdTIzMWMiLAogICAgInVsY3JvcDsiOiAiXHUyMzBmIiwKICAgICJ1bHRyaTsiOiAiXHUyNWY4IiwKICAgICJ1bWFjcjsiOiAiXHUwMTZiIiwKICAgICJ1bWwiOiAiXHhhOCIsCiAgICAidW1sOyI6ICJceGE4IiwKICAgICJ1b2dvbjsiOiAiXHUwMTczIiwKICAgICJ1b3BmOyI6ICJcVTAwMDFkNTY2IiwKICAgICJ1cGFycm93OyI6ICJcdTIxOTEiLAogICAgInVwZG93bmFycm93OyI6ICJcdTIxOTUiLAogICAgInVwaGFycG9vbmxlZnQ7IjogIlx1MjFiZiIsCiAgICAidXBoYXJwb29ucmlnaHQ7IjogIlx1MjFiZSIsCiAgICAidXBsdXM7IjogIlx1MjI4ZSIsCiAgICAidXBzaTsiOiAiXHUwM2M1IiwKICAgICJ1cHNpaDsiOiAiXHUwM2QyIiwKICAgICJ1cHNpbG9uOyI6ICJcdTAzYzUiLAogICAgInVwdXBhcnJvd3M7IjogIlx1MjFjOCIsCiAgICAidXJjb3JuOyI6ICJcdTIzMWQiLAogICAgInVyY29ybmVyOyI6ICJcdTIzMWQiLAogICAgInVyY3JvcDsiOiAiXHUyMzBlIiwKICAgICJ1cmluZzsiOiAiXHUwMTZmIiwKICAgICJ1cnRyaTsiOiAiXHUyNWY5IiwKICAgICJ1c2NyOyI6ICJcVTAwMDFkNGNhIiwKICAgICJ1dGRvdDsiOiAiXHUyMmYwIiwKICAgICJ1dGlsZGU7IjogIlx1MDE2OSIsCiAgICAidXRyaTsiOiAiXHUyNWI1IiwKICAgICJ1dHJpZjsiOiAiXHUyNWI0IiwKICAgICJ1dWFycjsiOiAiXHUyMWM4IiwKICAgICJ1dW1sIjogIlx4ZmMiLAogICAgInV1bWw7IjogIlx4ZmMiLAogICAgInV3YW5nbGU7IjogIlx1MjlhNyIsCiAgICAidkFycjsiOiAiXHUyMWQ1IiwKICAgICJ2QmFyOyI6ICJcdTJhZTgiLAogICAgInZCYXJ2OyI6ICJcdTJhZTkiLAogICAgInZEYXNoOyI6ICJcdTIyYTgiLAogICAgInZhbmdydDsiOiAiXHUyOTljIiwKICAgICJ2YXJlcHNpbG9uOyI6ICJcdTAzZjUiLAogICAgInZhcmthcHBhOyI6ICJcdTAzZjAiLAogICAgInZhcm5vdGhpbmc7IjogIlx1MjIwNSIsCiAgICAidmFycGhpOyI6ICJcdTAzZDUiLAogICAgInZhcnBpOyI6ICJcdTAzZDYiLAogICAgInZhcnByb3B0bzsiOiAiXHUyMjFkIiwKICAgICJ2YXJyOyI6ICJcdTIxOTUiLAogICAgInZhcnJobzsiOiAiXHUwM2YxIiwKICAgICJ2YXJzaWdtYTsiOiAiXHUwM2MyIiwKICAgICJ2YXJzdWJzZXRuZXE7IjogIlx1MjI4YVx1ZmUwMCIsCiAgICAidmFyc3Vic2V0bmVxcTsiOiAiXHUyYWNiXHVmZTAwIiwKICAgICJ2YXJzdXBzZXRuZXE7IjogIlx1MjI4Ylx1ZmUwMCIsCiAgICAidmFyc3Vwc2V0bmVxcTsiOiAiXHUyYWNjXHVmZTAwIiwKICAgICJ2YXJ0aGV0YTsiOiAiXHUwM2QxIiwKICAgICJ2YXJ0cmlhbmdsZWxlZnQ7IjogIlx1MjJiMiIsCiAgICAidmFydHJpYW5nbGVyaWdodDsiOiAiXHUyMmIzIiwKICAgICJ2Y3k7IjogIlx1MDQzMiIsCiAgICAidmRhc2g7IjogIlx1MjJhMiIsCiAgICAidmVlOyI6ICJcdTIyMjgiLAogICAgInZlZWJhcjsiOiAiXHUyMmJiIiwKICAgICJ2ZWVlcTsiOiAiXHUyMjVhIiwKICAgICJ2ZWxsaXA7IjogIlx1MjJlZSIsCiAgICAidmVyYmFyOyI6ICJ8IiwKICAgICJ2ZXJ0OyI6ICJ8IiwKICAgICJ2ZnI7IjogIlxVMDAwMWQ1MzMiLAogICAgInZsdHJpOyI6ICJcdTIyYjIiLAogICAgInZuc3ViOyI6ICJcdTIyODJcdTIwZDIiLAogICAgInZuc3VwOyI6ICJcdTIyODNcdTIwZDIiLAogICAgInZvcGY7IjogIlxVMDAwMWQ1NjciLAogICAgInZwcm9wOyI6ICJcdTIyMWQiLAogICAgInZydHJpOyI6ICJcdTIyYjMiLAogICAgInZzY3I7IjogIlxVMDAwMWQ0Y2IiLAogICAgInZzdWJuRTsiOiAiXHUyYWNiXHVmZTAwIiwKICAgICJ2c3VibmU7IjogIlx1MjI4YVx1ZmUwMCIsCiAgICAidnN1cG5FOyI6ICJcdTJhY2NcdWZlMDAiLAogICAgInZzdXBuZTsiOiAiXHUyMjhiXHVmZTAwIiwKICAgICJ2emlnemFnOyI6ICJcdTI5OWEiLAogICAgIndjaXJjOyI6ICJcdTAxNzUiLAogICAgIndlZGJhcjsiOiAiXHUyYTVmIiwKICAgICJ3ZWRnZTsiOiAiXHUyMjI3IiwKICAgICJ3ZWRnZXE7IjogIlx1MjI1OSIsCiAgICAid2VpZXJwOyI6ICJcdTIxMTgiLAogICAgIndmcjsiOiAiXFUwMDAxZDUzNCIsCiAgICAid29wZjsiOiAiXFUwMDAxZDU2OCIsCiAgICAid3A7IjogIlx1MjExOCIsCiAgICAid3I7IjogIlx1MjI0MCIsCiAgICAid3JlYXRoOyI6ICJcdTIyNDAiLAogICAgIndzY3I7IjogIlxVMDAwMWQ0Y2MiLAogICAgInhjYXA7IjogIlx1MjJjMiIsCiAgICAieGNpcmM7IjogIlx1MjVlZiIsCiAgICAieGN1cDsiOiAiXHUyMmMzIiwKICAgICJ4ZHRyaTsiOiAiXHUyNWJkIiwKICAgICJ4ZnI7IjogIlxVMDAwMWQ1MzUiLAogICAgInhoQXJyOyI6ICJcdTI3ZmEiLAogICAgInhoYXJyOyI6ICJcdTI3ZjciLAogICAgInhpOyI6ICJcdTAzYmUiLAogICAgInhsQXJyOyI6ICJcdTI3ZjgiLAogICAgInhsYXJyOyI6ICJcdTI3ZjUiLAogICAgInhtYXA7IjogIlx1MjdmYyIsCiAgICAieG5pczsiOiAiXHUyMmZiIiwKICAgICJ4b2RvdDsiOiAiXHUyYTAwIiwKICAgICJ4b3BmOyI6ICJcVTAwMDFkNTY5IiwKICAgICJ4b3BsdXM7IjogIlx1MmEwMSIsCiAgICAieG90aW1lOyI6ICJcdTJhMDIiLAogICAgInhyQXJyOyI6ICJcdTI3ZjkiLAogICAgInhyYXJyOyI6ICJcdTI3ZjYiLAogICAgInhzY3I7IjogIlxVMDAwMWQ0Y2QiLAogICAgInhzcWN1cDsiOiAiXHUyYTA2IiwKICAgICJ4dXBsdXM7IjogIlx1MmEwNCIsCiAgICAieHV0cmk7IjogIlx1MjViMyIsCiAgICAieHZlZTsiOiAiXHUyMmMxIiwKICAgICJ4d2VkZ2U7IjogIlx1MjJjMCIsCiAgICAieWFjdXRlIjogIlx4ZmQiLAogICAgInlhY3V0ZTsiOiAiXHhmZCIsCiAgICAieWFjeTsiOiAiXHUwNDRmIiwKICAgICJ5Y2lyYzsiOiAiXHUwMTc3IiwKICAgICJ5Y3k7IjogIlx1MDQ0YiIsCiAgICAieWVuIjogIlx4YTUiLAogICAgInllbjsiOiAiXHhhNSIsCiAgICAieWZyOyI6ICJcVTAwMDFkNTM2IiwKICAgICJ5aWN5OyI6ICJcdTA0NTciLAogICAgInlvcGY7IjogIlxVMDAwMWQ1NmEiLAogICAgInlzY3I7IjogIlxVMDAwMWQ0Y2UiLAogICAgInl1Y3k7IjogIlx1MDQ0ZSIsCiAgICAieXVtbCI6ICJceGZmIiwKICAgICJ5dW1sOyI6ICJceGZmIiwKICAgICJ6YWN1dGU7IjogIlx1MDE3YSIsCiAgICAiemNhcm9uOyI6ICJcdTAxN2UiLAogICAgInpjeTsiOiAiXHUwNDM3IiwKICAgICJ6ZG90OyI6ICJcdTAxN2MiLAogICAgInplZXRyZjsiOiAiXHUyMTI4IiwKICAgICJ6ZXRhOyI6ICJcdTAzYjYiLAogICAgInpmcjsiOiAiXFUwMDAxZDUzNyIsCiAgICAiemhjeTsiOiAiXHUwNDM2IiwKICAgICJ6aWdyYXJyOyI6ICJcdTIxZGQiLAogICAgInpvcGY7IjogIlxVMDAwMWQ1NmIiLAogICAgInpzY3I7IjogIlxVMDAwMWQ0Y2YiLAogICAgInp3ajsiOiAiXHUyMDBkIiwKICAgICJ6d25qOyI6ICJcdTIwMGMiLAp9CgpyZXBsYWNlbWVudENoYXJhY3RlcnMgPSB7CiAgICAweDA6ICJcdUZGRkQiLAogICAgMHgwZDogIlx1MDAwRCIsCiAgICAweDgwOiAiXHUyMEFDIiwKICAgIDB4ODE6ICJcdTAwODEiLAogICAgMHg4MjogIlx1MjAxQSIsCiAgICAweDgzOiAiXHUwMTkyIiwKICAgIDB4ODQ6ICJcdTIwMUUiLAogICAgMHg4NTogIlx1MjAyNiIsCiAgICAweDg2OiAiXHUyMDIwIiwKICAgIDB4ODc6ICJcdTIwMjEiLAogICAgMHg4ODogIlx1MDJDNiIsCiAgICAweDg5OiAiXHUyMDMwIiwKICAgIDB4OEE6ICJcdTAxNjAiLAogICAgMHg4QjogIlx1MjAzOSIsCiAgICAweDhDOiAiXHUwMTUyIiwKICAgIDB4OEQ6ICJcdTAwOEQiLAogICAgMHg4RTogIlx1MDE3RCIsCiAgICAweDhGOiAiXHUwMDhGIiwKICAgIDB4OTA6ICJcdTAwOTAiLAogICAgMHg5MTogIlx1MjAxOCIsCiAgICAweDkyOiAiXHUyMDE5IiwKICAgIDB4OTM6ICJcdTIwMUMiLAogICAgMHg5NDogIlx1MjAxRCIsCiAgICAweDk1OiAiXHUyMDIyIiwKICAgIDB4OTY6ICJcdTIwMTMiLAogICAgMHg5NzogIlx1MjAxNCIsCiAgICAweDk4OiAiXHUwMkRDIiwKICAgIDB4OTk6ICJcdTIxMjIiLAogICAgMHg5QTogIlx1MDE2MSIsCiAgICAweDlCOiAiXHUyMDNBIiwKICAgIDB4OUM6ICJcdTAxNTMiLAogICAgMHg5RDogIlx1MDA5RCIsCiAgICAweDlFOiAiXHUwMTdFIiwKICAgIDB4OUY6ICJcdTAxNzgiLAp9Cgp0b2tlblR5cGVzID0gewogICAgIkRvY3R5cGUiOiAwLAogICAgIkNoYXJhY3RlcnMiOiAxLAogICAgIlNwYWNlQ2hhcmFjdGVycyI6IDIsCiAgICAiU3RhcnRUYWciOiAzLAogICAgIkVuZFRhZyI6IDQsCiAgICAiRW1wdHlUYWciOiA1LAogICAgIkNvbW1lbnQiOiA2LAogICAgIlBhcnNlRXJyb3IiOiA3Cn0KCnRhZ1Rva2VuVHlwZXMgPSBmcm96ZW5zZXQoW3Rva2VuVHlwZXNbIlN0YXJ0VGFnIl0sIHRva2VuVHlwZXNbIkVuZFRhZyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlblR5cGVzWyJFbXB0eVRhZyJdXSkKCgpwcmVmaXhlcyA9IGRpY3QoWyh2LCBrKSBmb3IgaywgdiBpbiBuYW1lc3BhY2VzLml0ZW1zKCldKQpwcmVmaXhlc1siaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCJdID0gIm1hdGgiCgoKY2xhc3MgRGF0YUxvc3NXYXJuaW5nKFVzZXJXYXJuaW5nKToKICAgIHBhc3MKCgpjbGFzcyBSZXBhcnNlRXhjZXB0aW9uKEV4Y2VwdGlvbik6CiAgICBwYXNzClBLAwQUAAAAAAAAACEAAAAAAAAAAAAAAAAAOAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9maWx0ZXJzL19faW5pdF9fLnB5UEsDBBQAAAAAAAAAIQBu0HyAbQIAAG0CAABGAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL2ZpbHRlcnMvYWxwaGFiZXRpY2FsYXR0cmlidXRlcy5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwoKZnJvbSAuIGltcG9ydCBiYXNlCgp0cnk6CiAgICBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBPcmRlcmVkRGljdApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBmcm9tIG9yZGVyZWRkaWN0IGltcG9ydCBPcmRlcmVkRGljdAoKCmNsYXNzIEZpbHRlcihiYXNlLkZpbHRlcik6CiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgZm9yIHRva2VuIGluIGJhc2UuRmlsdGVyLl9faXRlcl9fKHNlbGYpOgogICAgICAgICAgICBpZiB0b2tlblsidHlwZSJdIGluICgiU3RhcnRUYWciLCAiRW1wdHlUYWciKToKICAgICAgICAgICAgICAgIGF0dHJzID0gT3JkZXJlZERpY3QoKQogICAgICAgICAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIHNvcnRlZCh0b2tlblsiZGF0YSJdLml0ZW1zKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleT1sYW1iZGEgeDogeFswXSk6CiAgICAgICAgICAgICAgICAgICAgYXR0cnNbbmFtZV0gPSB2YWx1ZQogICAgICAgICAgICAgICAgdG9rZW5bImRhdGEiXSA9IGF0dHJzCiAgICAgICAgICAgIHlpZWxkIHRva2VuClBLAwQUAAAAAAAAACEAIoD7xB4BAAAeAQAANAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9maWx0ZXJzL2Jhc2UucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKCgpjbGFzcyBGaWx0ZXIob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzb3VyY2UpOgogICAgICAgIHNlbGYuc291cmNlID0gc291cmNlCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBpdGVyKHNlbGYuc291cmNlKQoKICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLnNvdXJjZSwgbmFtZSkKUEsDBBQAAAAAAAAAIQAhwDyMtgoAALYKAABDAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL2ZpbHRlcnMvaW5qZWN0X21ldGFfY2hhcnNldC5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwoKZnJvbSAuIGltcG9ydCBiYXNlCgoKY2xhc3MgRmlsdGVyKGJhc2UuRmlsdGVyKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzb3VyY2UsIGVuY29kaW5nKToKICAgICAgICBiYXNlLkZpbHRlci5fX2luaXRfXyhzZWxmLCBzb3VyY2UpCiAgICAgICAgc2VsZi5lbmNvZGluZyA9IGVuY29kaW5nCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIHN0YXRlID0gInByZV9oZWFkIgogICAgICAgIG1ldGFfZm91bmQgPSAoc2VsZi5lbmNvZGluZyBpcyBOb25lKQogICAgICAgIHBlbmRpbmcgPSBbXQoKICAgICAgICBmb3IgdG9rZW4gaW4gYmFzZS5GaWx0ZXIuX19pdGVyX18oc2VsZik6CiAgICAgICAgICAgIHR5cGUgPSB0b2tlblsidHlwZSJdCiAgICAgICAgICAgIGlmIHR5cGUgPT0gIlN0YXJ0VGFnIjoKICAgICAgICAgICAgICAgIGlmIHRva2VuWyJuYW1lIl0ubG93ZXIoKSA9PSAiaGVhZCI6CiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAiaW5faGVhZCIKCiAgICAgICAgICAgIGVsaWYgdHlwZSA9PSAiRW1wdHlUYWciOgogICAgICAgICAgICAgICAgaWYgdG9rZW5bIm5hbWUiXS5sb3dlcigpID09ICJtZXRhIjoKICAgICAgICAgICAgICAgICAgICAjIHJlcGxhY2UgY2hhcnNldCB3aXRoIGFjdHVhbCBlbmNvZGluZwogICAgICAgICAgICAgICAgICAgIGhhc19odHRwX2VxdWl2X2NvbnRlbnRfdHlwZSA9IEZhbHNlCiAgICAgICAgICAgICAgICAgICAgZm9yIChuYW1lc3BhY2UsIG5hbWUpLCB2YWx1ZSBpbiB0b2tlblsiZGF0YSJdLml0ZW1zKCk6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5hbWVzcGFjZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgbmFtZS5sb3dlcigpID09ICdjaGFyc2V0JzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuWyJkYXRhIl1bKG5hbWVzcGFjZSwgbmFtZSldID0gc2VsZi5lbmNvZGluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YV9mb3VuZCA9IFRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgbmFtZSA9PSAnaHR0cC1lcXVpdicgYW5kIHZhbHVlLmxvd2VyKCkgPT0gJ2NvbnRlbnQtdHlwZSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNfaHR0cF9lcXVpdl9jb250ZW50X3R5cGUgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgaWYgaGFzX2h0dHBfZXF1aXZfY29udGVudF90eXBlIGFuZCAoTm9uZSwgImNvbnRlbnQiKSBpbiB0b2tlblsiZGF0YSJdOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5bImRhdGEiXVsoTm9uZSwgImNvbnRlbnQiKV0gPSAndGV4dC9odG1sOyBjaGFyc2V0PSVzJyAlIHNlbGYuZW5jb2RpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFfZm91bmQgPSBUcnVlCgogICAgICAgICAgICAgICAgZWxpZiB0b2tlblsibmFtZSJdLmxvd2VyKCkgPT0gImhlYWQiIGFuZCBub3QgbWV0YV9mb3VuZDoKICAgICAgICAgICAgICAgICAgICAjIGluc2VydCBtZXRhIGludG8gZW1wdHkgaGVhZAogICAgICAgICAgICAgICAgICAgIHlpZWxkIHsidHlwZSI6ICJTdGFydFRhZyIsICJuYW1lIjogImhlYWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSI6IHRva2VuWyJkYXRhIl19CiAgICAgICAgICAgICAgICAgICAgeWllbGQgeyJ0eXBlIjogIkVtcHR5VGFnIiwgIm5hbWUiOiAibWV0YSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIjogeyhOb25lLCAiY2hhcnNldCIpOiBzZWxmLmVuY29kaW5nfX0KICAgICAgICAgICAgICAgICAgICB5aWVsZCB7InR5cGUiOiAiRW5kVGFnIiwgIm5hbWUiOiAiaGVhZCJ9CiAgICAgICAgICAgICAgICAgICAgbWV0YV9mb3VuZCA9IFRydWUKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgZWxpZiB0eXBlID09ICJFbmRUYWciOgogICAgICAgICAgICAgICAgaWYgdG9rZW5bIm5hbWUiXS5sb3dlcigpID09ICJoZWFkIiBhbmQgcGVuZGluZzoKICAgICAgICAgICAgICAgICAgICAjIGluc2VydCBtZXRhIGludG8gaGVhZCAoaWYgbmVjZXNzYXJ5KSBhbmQgZmx1c2ggcGVuZGluZyBxdWV1ZQogICAgICAgICAgICAgICAgICAgIHlpZWxkIHBlbmRpbmcucG9wKDApCiAgICAgICAgICAgICAgICAgICAgaWYgbm90IG1ldGFfZm91bmQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHsidHlwZSI6ICJFbXB0eVRhZyIsICJuYW1lIjogIm1ldGEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiB7KE5vbmUsICJjaGFyc2V0Iik6IHNlbGYuZW5jb2Rpbmd9fQogICAgICAgICAgICAgICAgICAgIHdoaWxlIHBlbmRpbmc6CiAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHBlbmRpbmcucG9wKDApCiAgICAgICAgICAgICAgICAgICAgbWV0YV9mb3VuZCA9IFRydWUKICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9ICJwb3N0X2hlYWQiCgogICAgICAgICAgICBpZiBzdGF0ZSA9PSAiaW5faGVhZCI6CiAgICAgICAgICAgICAgICBwZW5kaW5nLmFwcGVuZCh0b2tlbikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHlpZWxkIHRva2VuClBLAwQUAAAAAAAAACEAfevStSUNAAAlDQAANAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9maWx0ZXJzL2xpbnQucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKCmZyb20gcGlwLl92ZW5kb3Iuc2l4IGltcG9ydCB0ZXh0X3R5cGUKCmZyb20gLiBpbXBvcnQgYmFzZQpmcm9tIC4uY29uc3RhbnRzIGltcG9ydCBuYW1lc3BhY2VzLCB2b2lkRWxlbWVudHMKCmZyb20gLi5jb25zdGFudHMgaW1wb3J0IHNwYWNlQ2hhcmFjdGVycwpzcGFjZUNoYXJhY3RlcnMgPSAiIi5qb2luKHNwYWNlQ2hhcmFjdGVycykKCgpjbGFzcyBGaWx0ZXIoYmFzZS5GaWx0ZXIpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHNvdXJjZSwgcmVxdWlyZV9tYXRjaGluZ190YWdzPVRydWUpOgogICAgICAgIHN1cGVyKEZpbHRlciwgc2VsZikuX19pbml0X18oc291cmNlKQogICAgICAgIHNlbGYucmVxdWlyZV9tYXRjaGluZ190YWdzID0gcmVxdWlyZV9tYXRjaGluZ190YWdzCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIG9wZW5fZWxlbWVudHMgPSBbXQogICAgICAgIGZvciB0b2tlbiBpbiBiYXNlLkZpbHRlci5fX2l0ZXJfXyhzZWxmKToKICAgICAgICAgICAgdHlwZSA9IHRva2VuWyJ0eXBlIl0KICAgICAgICAgICAgaWYgdHlwZSBpbiAoIlN0YXJ0VGFnIiwgIkVtcHR5VGFnIik6CiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPSB0b2tlblsibmFtZXNwYWNlIl0KICAgICAgICAgICAgICAgIG5hbWUgPSB0b2tlblsibmFtZSJdCiAgICAgICAgICAgICAgICBhc3NlcnQgbmFtZXNwYWNlIGlzIE5vbmUgb3IgaXNpbnN0YW5jZShuYW1lc3BhY2UsIHRleHRfdHlwZSkKICAgICAgICAgICAgICAgIGFzc2VydCBuYW1lc3BhY2UgIT0gIiIKICAgICAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKG5hbWUsIHRleHRfdHlwZSkKICAgICAgICAgICAgICAgIGFzc2VydCBuYW1lICE9ICIiCiAgICAgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh0b2tlblsiZGF0YSJdLCBkaWN0KQogICAgICAgICAgICAgICAgaWYgKG5vdCBuYW1lc3BhY2Ugb3IgbmFtZXNwYWNlID09IG5hbWVzcGFjZXNbImh0bWwiXSkgYW5kIG5hbWUgaW4gdm9pZEVsZW1lbnRzOgogICAgICAgICAgICAgICAgICAgIGFzc2VydCB0eXBlID09ICJFbXB0eVRhZyIKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHR5cGUgPT0gIlN0YXJ0VGFnIgogICAgICAgICAgICAgICAgaWYgdHlwZSA9PSAiU3RhcnRUYWciIGFuZCBzZWxmLnJlcXVpcmVfbWF0Y2hpbmdfdGFnczoKICAgICAgICAgICAgICAgICAgICBvcGVuX2VsZW1lbnRzLmFwcGVuZCgobmFtZXNwYWNlLCBuYW1lKSkKICAgICAgICAgICAgICAgIGZvciAobmFtZXNwYWNlLCBuYW1lKSwgdmFsdWUgaW4gdG9rZW5bImRhdGEiXS5pdGVtcygpOgogICAgICAgICAgICAgICAgICAgIGFzc2VydCBuYW1lc3BhY2UgaXMgTm9uZSBvciBpc2luc3RhbmNlKG5hbWVzcGFjZSwgdGV4dF90eXBlKQogICAgICAgICAgICAgICAgICAgIGFzc2VydCBuYW1lc3BhY2UgIT0gIiIKICAgICAgICAgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShuYW1lLCB0ZXh0X3R5cGUpCiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IG5hbWUgIT0gIiIKICAgICAgICAgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh2YWx1ZSwgdGV4dF90eXBlKQoKICAgICAgICAgICAgZWxpZiB0eXBlID09ICJFbmRUYWciOgogICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gdG9rZW5bIm5hbWVzcGFjZSJdCiAgICAgICAgICAgICAgICBuYW1lID0gdG9rZW5bIm5hbWUiXQogICAgICAgICAgICAgICAgYXNzZXJ0IG5hbWVzcGFjZSBpcyBOb25lIG9yIGlzaW5zdGFuY2UobmFtZXNwYWNlLCB0ZXh0X3R5cGUpCiAgICAgICAgICAgICAgICBhc3NlcnQgbmFtZXNwYWNlICE9ICIiCiAgICAgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShuYW1lLCB0ZXh0X3R5cGUpCiAgICAgICAgICAgICAgICBhc3NlcnQgbmFtZSAhPSAiIgogICAgICAgICAgICAgICAgaWYgKG5vdCBuYW1lc3BhY2Ugb3IgbmFtZXNwYWNlID09IG5hbWVzcGFjZXNbImh0bWwiXSkgYW5kIG5hbWUgaW4gdm9pZEVsZW1lbnRzOgogICAgICAgICAgICAgICAgICAgIGFzc2VydCBGYWxzZSwgIlZvaWQgZWxlbWVudCByZXBvcnRlZCBhcyBFbmRUYWcgdG9rZW46ICUodGFnKXMiICUgeyJ0YWciOiBuYW1lfQogICAgICAgICAgICAgICAgZWxpZiBzZWxmLnJlcXVpcmVfbWF0Y2hpbmdfdGFnczoKICAgICAgICAgICAgICAgICAgICBzdGFydCA9IG9wZW5fZWxlbWVudHMucG9wKCkKICAgICAgICAgICAgICAgICAgICBhc3NlcnQgc3RhcnQgPT0gKG5hbWVzcGFjZSwgbmFtZSkKCiAgICAgICAgICAgIGVsaWYgdHlwZSA9PSAiQ29tbWVudCI6CiAgICAgICAgICAgICAgICBkYXRhID0gdG9rZW5bImRhdGEiXQogICAgICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoZGF0YSwgdGV4dF90eXBlKQoKICAgICAgICAgICAgZWxpZiB0eXBlIGluICgiQ2hhcmFjdGVycyIsICJTcGFjZUNoYXJhY3RlcnMiKToKICAgICAgICAgICAgICAgIGRhdGEgPSB0b2tlblsiZGF0YSJdCiAgICAgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShkYXRhLCB0ZXh0X3R5cGUpCiAgICAgICAgICAgICAgICBhc3NlcnQgZGF0YSAhPSAiIgogICAgICAgICAgICAgICAgaWYgdHlwZSA9PSAiU3BhY2VDaGFyYWN0ZXJzIjoKICAgICAgICAgICAgICAgICAgICBhc3NlcnQgZGF0YS5zdHJpcChzcGFjZUNoYXJhY3RlcnMpID09ICIiCgogICAgICAgICAgICBlbGlmIHR5cGUgPT0gIkRvY3R5cGUiOgogICAgICAgICAgICAgICAgbmFtZSA9IHRva2VuWyJuYW1lIl0KICAgICAgICAgICAgICAgIGFzc2VydCBuYW1lIGlzIE5vbmUgb3IgaXNpbnN0YW5jZShuYW1lLCB0ZXh0X3R5cGUpCiAgICAgICAgICAgICAgICBhc3NlcnQgdG9rZW5bInB1YmxpY0lkIl0gaXMgTm9uZSBvciBpc2luc3RhbmNlKG5hbWUsIHRleHRfdHlwZSkKICAgICAgICAgICAgICAgIGFzc2VydCB0b2tlblsic3lzdGVtSWQiXSBpcyBOb25lIG9yIGlzaW5zdGFuY2UobmFtZSwgdGV4dF90eXBlKQoKICAgICAgICAgICAgZWxpZiB0eXBlID09ICJFbnRpdHkiOgogICAgICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UodG9rZW5bIm5hbWUiXSwgdGV4dF90eXBlKQoKICAgICAgICAgICAgZWxpZiB0eXBlID09ICJTZXJpYWxpemVyRXJyb3IiOgogICAgICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UodG9rZW5bImRhdGEiXSwgdGV4dF90eXBlKQoKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGFzc2VydCBGYWxzZSwgIlVua25vd24gdG9rZW4gdHlwZTogJSh0eXBlKXMiICUgeyJ0eXBlIjogdHlwZX0KCiAgICAgICAgICAgIHlpZWxkIHRva2VuClBLAwQUAAAAAAAAACEAIe2dJCYpAAAmKQAAPAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9maWx0ZXJzL29wdGlvbmFsdGFncy5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwoKZnJvbSAuIGltcG9ydCBiYXNlCgoKY2xhc3MgRmlsdGVyKGJhc2UuRmlsdGVyKToKICAgIGRlZiBzbGlkZXIoc2VsZik6CiAgICAgICAgcHJldmlvdXMxID0gcHJldmlvdXMyID0gTm9uZQogICAgICAgIGZvciB0b2tlbiBpbiBzZWxmLnNvdXJjZToKICAgICAgICAgICAgaWYgcHJldmlvdXMxIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgeWllbGQgcHJldmlvdXMyLCBwcmV2aW91czEsIHRva2VuCiAgICAgICAgICAgIHByZXZpb3VzMiA9IHByZXZpb3VzMQogICAgICAgICAgICBwcmV2aW91czEgPSB0b2tlbgogICAgICAgIGlmIHByZXZpb3VzMSBpcyBub3QgTm9uZToKICAgICAgICAgICAgeWllbGQgcHJldmlvdXMyLCBwcmV2aW91czEsIE5vbmUKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgZm9yIHByZXZpb3VzLCB0b2tlbiwgbmV4dCBpbiBzZWxmLnNsaWRlcigpOgogICAgICAgICAgICB0eXBlID0gdG9rZW5bInR5cGUiXQogICAgICAgICAgICBpZiB0eXBlID09ICJTdGFydFRhZyI6CiAgICAgICAgICAgICAgICBpZiAodG9rZW5bImRhdGEiXSBvcgogICAgICAgICAgICAgICAgICAgICAgICBub3Qgc2VsZi5pc19vcHRpb25hbF9zdGFydCh0b2tlblsibmFtZSJdLCBwcmV2aW91cywgbmV4dCkpOgogICAgICAgICAgICAgICAgICAgIHlpZWxkIHRva2VuCiAgICAgICAgICAgIGVsaWYgdHlwZSA9PSAiRW5kVGFnIjoKICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmlzX29wdGlvbmFsX2VuZCh0b2tlblsibmFtZSJdLCBuZXh0KToKICAgICAgICAgICAgICAgICAgICB5aWVsZCB0b2tlbgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgeWllbGQgdG9rZW4KCiAgICBkZWYgaXNfb3B0aW9uYWxfc3RhcnQoc2VsZiwgdGFnbmFtZSwgcHJldmlvdXMsIG5leHQpOgogICAgICAgIHR5cGUgPSBuZXh0IGFuZCBuZXh0WyJ0eXBlIl0gb3IgTm9uZQogICAgICAgIGlmIHRhZ25hbWUgaW4gJ2h0bWwnOgogICAgICAgICAgICAjIEFuIGh0bWwgZWxlbWVudCdzIHN0YXJ0IHRhZyBtYXkgYmUgb21pdHRlZCBpZiB0aGUgZmlyc3QgdGhpbmcKICAgICAgICAgICAgIyBpbnNpZGUgdGhlIGh0bWwgZWxlbWVudCBpcyBub3QgYSBzcGFjZSBjaGFyYWN0ZXIgb3IgYSBjb21tZW50LgogICAgICAgICAgICByZXR1cm4gdHlwZSBub3QgaW4gKCJDb21tZW50IiwgIlNwYWNlQ2hhcmFjdGVycyIpCiAgICAgICAgZWxpZiB0YWduYW1lID09ICdoZWFkJzoKICAgICAgICAgICAgIyBBIGhlYWQgZWxlbWVudCdzIHN0YXJ0IHRhZyBtYXkgYmUgb21pdHRlZCBpZiB0aGUgZmlyc3QgdGhpbmcKICAgICAgICAgICAgIyBpbnNpZGUgdGhlIGhlYWQgZWxlbWVudCBpcyBhbiBlbGVtZW50LgogICAgICAgICAgICAjIFhYWDogd2UgYWxzbyBvbWl0IHRoZSBzdGFydCB0YWcgaWYgdGhlIGhlYWQgZWxlbWVudCBpcyBlbXB0eQogICAgICAgICAgICBpZiB0eXBlIGluICgiU3RhcnRUYWciLCAiRW1wdHlUYWciKToKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgICAgIGVsaWYgdHlwZSA9PSAiRW5kVGFnIjoKICAgICAgICAgICAgICAgIHJldHVybiBuZXh0WyJuYW1lIl0gPT0gImhlYWQiCiAgICAgICAgZWxpZiB0YWduYW1lID09ICdib2R5JzoKICAgICAgICAgICAgIyBBIGJvZHkgZWxlbWVudCdzIHN0YXJ0IHRhZyBtYXkgYmUgb21pdHRlZCBpZiB0aGUgZmlyc3QgdGhpbmcKICAgICAgICAgICAgIyBpbnNpZGUgdGhlIGJvZHkgZWxlbWVudCBpcyBub3QgYSBzcGFjZSBjaGFyYWN0ZXIgb3IgYSBjb21tZW50LAogICAgICAgICAgICAjIGV4Y2VwdCBpZiB0aGUgZmlyc3QgdGhpbmcgaW5zaWRlIHRoZSBib2R5IGVsZW1lbnQgaXMgYSBzY3JpcHQKICAgICAgICAgICAgIyBvciBzdHlsZSBlbGVtZW50IGFuZCB0aGUgbm9kZSBpbW1lZGlhdGVseSBwcmVjZWRpbmcgdGhlIGJvZHkKICAgICAgICAgICAgIyBlbGVtZW50IGlzIGEgaGVhZCBlbGVtZW50IHdob3NlIGVuZCB0YWcgaGFzIGJlZW4gb21pdHRlZC4KICAgICAgICAgICAgaWYgdHlwZSBpbiAoIkNvbW1lbnQiLCAiU3BhY2VDaGFyYWN0ZXJzIik6CiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgICAgZWxpZiB0eXBlID09ICJTdGFydFRhZyI6CiAgICAgICAgICAgICAgICAjIFhYWDogd2UgZG8gbm90IGxvb2sgYXQgdGhlIHByZWNlZGluZyBldmVudCwgc28gd2UgbmV2ZXIgb21pdAogICAgICAgICAgICAgICAgIyB0aGUgYm9keSBlbGVtZW50J3Mgc3RhcnQgdGFnIGlmIGl0J3MgZm9sbG93ZWQgYnkgYSBzY3JpcHQgb3IKICAgICAgICAgICAgICAgICMgYSBzdHlsZSBlbGVtZW50LgogICAgICAgICAgICAgICAgcmV0dXJuIG5leHRbIm5hbWUiXSBub3QgaW4gKCdzY3JpcHQnLCAnc3R5bGUnKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBlbGlmIHRhZ25hbWUgPT0gJ2NvbGdyb3VwJzoKICAgICAgICAgICAgIyBBIGNvbGdyb3VwIGVsZW1lbnQncyBzdGFydCB0YWcgbWF5IGJlIG9taXR0ZWQgaWYgdGhlIGZpcnN0IHRoaW5nCiAgICAgICAgICAgICMgaW5zaWRlIHRoZSBjb2xncm91cCBlbGVtZW50IGlzIGEgY29sIGVsZW1lbnQsIGFuZCBpZiB0aGUgZWxlbWVudAogICAgICAgICAgICAjIGlzIG5vdCBpbW1lZGlhdGVseSBwcmVjZWRlZCBieSBhbm90aGVyIGNvbGdyb3VwIGVsZW1lbnQgd2hvc2UKICAgICAgICAgICAgIyBlbmQgdGFnIGhhcyBiZWVuIG9taXR0ZWQuCiAgICAgICAgICAgIGlmIHR5cGUgaW4gKCJTdGFydFRhZyIsICJFbXB0eVRhZyIpOgogICAgICAgICAgICAgICAgIyBYWFg6IHdlIGRvIG5vdCBsb29rIGF0IHRoZSBwcmVjZWRpbmcgZXZlbnQsIHNvIGluc3RlYWQgd2UgbmV2ZXIKICAgICAgICAgICAgICAgICMgb21pdCB0aGUgY29sZ3JvdXAgZWxlbWVudCdzIGVuZCB0YWcgd2hlbiBpdCBpcyBpbW1lZGlhdGVseQogICAgICAgICAgICAgICAgIyBmb2xsb3dlZCBieSBhbm90aGVyIGNvbGdyb3VwIGVsZW1lbnQuIFNlZSBpc19vcHRpb25hbF9lbmQuCiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dFsibmFtZSJdID09ICJjb2wiCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICBlbGlmIHRhZ25hbWUgPT0gJ3Rib2R5JzoKICAgICAgICAgICAgIyBBIHRib2R5IGVsZW1lbnQncyBzdGFydCB0YWcgbWF5IGJlIG9taXR0ZWQgaWYgdGhlIGZpcnN0IHRoaW5nCiAgICAgICAgICAgICMgaW5zaWRlIHRoZSB0Ym9keSBlbGVtZW50IGlzIGEgdHIgZWxlbWVudCwgYW5kIGlmIHRoZSBlbGVtZW50IGlzCiAgICAgICAgICAgICMgbm90IGltbWVkaWF0ZWx5IHByZWNlZGVkIGJ5IGEgdGJvZHksIHRoZWFkLCBvciB0Zm9vdCBlbGVtZW50CiAgICAgICAgICAgICMgd2hvc2UgZW5kIHRhZyBoYXMgYmVlbiBvbWl0dGVkLgogICAgICAgICAgICBpZiB0eXBlID09ICJTdGFydFRhZyI6CiAgICAgICAgICAgICAgICAjIG9taXQgdGhlIHRoZWFkIGFuZCB0Zm9vdCBlbGVtZW50cycgZW5kIHRhZyB3aGVuIHRoZXkgYXJlCiAgICAgICAgICAgICAgICAjIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgdGJvZHkgZWxlbWVudC4gU2VlIGlzX29wdGlvbmFsX2VuZC4KICAgICAgICAgICAgICAgIGlmIHByZXZpb3VzIGFuZCBwcmV2aW91c1sndHlwZSddID09ICdFbmRUYWcnIGFuZCBcCiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzWyduYW1lJ10gaW4gKCd0Ym9keScsICd0aGVhZCcsICd0Zm9vdCcpOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICAgICAgICAgcmV0dXJuIG5leHRbIm5hbWUiXSA9PSAndHInCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgaXNfb3B0aW9uYWxfZW5kKHNlbGYsIHRhZ25hbWUsIG5leHQpOgogICAgICAgIHR5cGUgPSBuZXh0IGFuZCBuZXh0WyJ0eXBlIl0gb3IgTm9uZQogICAgICAgIGlmIHRhZ25hbWUgaW4gKCdodG1sJywgJ2hlYWQnLCAnYm9keScpOgogICAgICAgICAgICAjIEFuIGh0bWwgZWxlbWVudCdzIGVuZCB0YWcgbWF5IGJlIG9taXR0ZWQgaWYgdGhlIGh0bWwgZWxlbWVudAogICAgICAgICAgICAjIGlzIG5vdCBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIHNwYWNlIGNoYXJhY3RlciBvciBhIGNvbW1lbnQuCiAgICAgICAgICAgIHJldHVybiB0eXBlIG5vdCBpbiAoIkNvbW1lbnQiLCAiU3BhY2VDaGFyYWN0ZXJzIikKICAgICAgICBlbGlmIHRhZ25hbWUgaW4gKCdsaScsICdvcHRncm91cCcsICd0cicpOgogICAgICAgICAgICAjIEEgbGkgZWxlbWVudCdzIGVuZCB0YWcgbWF5IGJlIG9taXR0ZWQgaWYgdGhlIGxpIGVsZW1lbnQgaXMKICAgICAgICAgICAgIyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhbm90aGVyIGxpIGVsZW1lbnQgb3IgaWYgdGhlcmUgaXMKICAgICAgICAgICAgIyBubyBtb3JlIGNvbnRlbnQgaW4gdGhlIHBhcmVudCBlbGVtZW50LgogICAgICAgICAgICAjIEFuIG9wdGdyb3VwIGVsZW1lbnQncyBlbmQgdGFnIG1heSBiZSBvbWl0dGVkIGlmIHRoZSBvcHRncm91cAogICAgICAgICAgICAjIGVsZW1lbnQgaXMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYW5vdGhlciBvcHRncm91cCBlbGVtZW50LAogICAgICAgICAgICAjIG9yIGlmIHRoZXJlIGlzIG5vIG1vcmUgY29udGVudCBpbiB0aGUgcGFyZW50IGVsZW1lbnQuCiAgICAgICAgICAgICMgQSB0ciBlbGVtZW50J3MgZW5kIHRhZyBtYXkgYmUgb21pdHRlZCBpZiB0aGUgdHIgZWxlbWVudCBpcwogICAgICAgICAgICAjIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGFub3RoZXIgdHIgZWxlbWVudCwgb3IgaWYgdGhlcmUgaXMKICAgICAgICAgICAgIyBubyBtb3JlIGNvbnRlbnQgaW4gdGhlIHBhcmVudCBlbGVtZW50LgogICAgICAgICAgICBpZiB0eXBlID09ICJTdGFydFRhZyI6CiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dFsibmFtZSJdID09IHRhZ25hbWUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiB0eXBlID09ICJFbmRUYWciIG9yIHR5cGUgaXMgTm9uZQogICAgICAgIGVsaWYgdGFnbmFtZSBpbiAoJ2R0JywgJ2RkJyk6CiAgICAgICAgICAgICMgQSBkdCBlbGVtZW50J3MgZW5kIHRhZyBtYXkgYmUgb21pdHRlZCBpZiB0aGUgZHQgZWxlbWVudCBpcwogICAgICAgICAgICAjIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGFub3RoZXIgZHQgZWxlbWVudCBvciBhIGRkIGVsZW1lbnQuCiAgICAgICAgICAgICMgQSBkZCBlbGVtZW50J3MgZW5kIHRhZyBtYXkgYmUgb21pdHRlZCBpZiB0aGUgZGQgZWxlbWVudCBpcwogICAgICAgICAgICAjIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGFub3RoZXIgZGQgZWxlbWVudCBvciBhIGR0IGVsZW1lbnQsCiAgICAgICAgICAgICMgb3IgaWYgdGhlcmUgaXMgbm8gbW9yZSBjb250ZW50IGluIHRoZSBwYXJlbnQgZWxlbWVudC4KICAgICAgICAgICAgaWYgdHlwZSA9PSAiU3RhcnRUYWciOgogICAgICAgICAgICAgICAgcmV0dXJuIG5leHRbIm5hbWUiXSBpbiAoJ2R0JywgJ2RkJykKICAgICAgICAgICAgZWxpZiB0YWduYW1lID09ICdkZCc6CiAgICAgICAgICAgICAgICByZXR1cm4gdHlwZSA9PSAiRW5kVGFnIiBvciB0eXBlIGlzIE5vbmUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIGVsaWYgdGFnbmFtZSA9PSAncCc6CiAgICAgICAgICAgICMgQSBwIGVsZW1lbnQncyBlbmQgdGFnIG1heSBiZSBvbWl0dGVkIGlmIHRoZSBwIGVsZW1lbnQgaXMKICAgICAgICAgICAgIyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhbiBhZGRyZXNzLCBhcnRpY2xlLCBhc2lkZSwKICAgICAgICAgICAgIyBibG9ja3F1b3RlLCBkYXRhZ3JpZCwgZGlhbG9nLCBkaXIsIGRpdiwgZGwsIGZpZWxkc2V0LAogICAgICAgICAgICAjIGZvb3RlciwgZm9ybSwgaDEsIGgyLCBoMywgaDQsIGg1LCBoNiwgaGVhZGVyLCBociwgbWVudSwKICAgICAgICAgICAgIyBuYXYsIG9sLCBwLCBwcmUsIHNlY3Rpb24sIHRhYmxlLCBvciB1bCwgZWxlbWVudCwgb3IgaWYKICAgICAgICAgICAgIyB0aGVyZSBpcyBubyBtb3JlIGNvbnRlbnQgaW4gdGhlIHBhcmVudCBlbGVtZW50LgogICAgICAgICAgICBpZiB0eXBlIGluICgiU3RhcnRUYWciLCAiRW1wdHlUYWciKToKICAgICAgICAgICAgICAgIHJldHVybiBuZXh0WyJuYW1lIl0gaW4gKCdhZGRyZXNzJywgJ2FydGljbGUnLCAnYXNpZGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Jsb2NrcXVvdGUnLCAnZGF0YWdyaWQnLCAnZGlhbG9nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkaXInLCAnZGl2JywgJ2RsJywgJ2ZpZWxkc2V0JywgJ2Zvb3RlcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9ybScsICdoMScsICdoMicsICdoMycsICdoNCcsICdoNScsICdoNicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaGVhZGVyJywgJ2hyJywgJ21lbnUnLCAnbmF2JywgJ29sJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwJywgJ3ByZScsICdzZWN0aW9uJywgJ3RhYmxlJywgJ3VsJykKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiB0eXBlID09ICJFbmRUYWciIG9yIHR5cGUgaXMgTm9uZQogICAgICAgIGVsaWYgdGFnbmFtZSA9PSAnb3B0aW9uJzoKICAgICAgICAgICAgIyBBbiBvcHRpb24gZWxlbWVudCdzIGVuZCB0YWcgbWF5IGJlIG9taXR0ZWQgaWYgdGhlIG9wdGlvbgogICAgICAgICAgICAjIGVsZW1lbnQgaXMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYW5vdGhlciBvcHRpb24gZWxlbWVudCwKICAgICAgICAgICAgIyBvciBpZiBpdCBpcyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhbiA8Y29kZT5vcHRncm91cDwvY29kZT4KICAgICAgICAgICAgIyBlbGVtZW50LCBvciBpZiB0aGVyZSBpcyBubyBtb3JlIGNvbnRlbnQgaW4gdGhlIHBhcmVudAogICAgICAgICAgICAjIGVsZW1lbnQuCiAgICAgICAgICAgIGlmIHR5cGUgPT0gIlN0YXJ0VGFnIjoKICAgICAgICAgICAgICAgIHJldHVybiBuZXh0WyJuYW1lIl0gaW4gKCdvcHRpb24nLCAnb3B0Z3JvdXAnKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT0gIkVuZFRhZyIgb3IgdHlwZSBpcyBOb25lCiAgICAgICAgZWxpZiB0YWduYW1lIGluICgncnQnLCAncnAnKToKICAgICAgICAgICAgIyBBbiBydCBlbGVtZW50J3MgZW5kIHRhZyBtYXkgYmUgb21pdHRlZCBpZiB0aGUgcnQgZWxlbWVudCBpcwogICAgICAgICAgICAjIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGFuIHJ0IG9yIHJwIGVsZW1lbnQsIG9yIGlmIHRoZXJlIGlzCiAgICAgICAgICAgICMgbm8gbW9yZSBjb250ZW50IGluIHRoZSBwYXJlbnQgZWxlbWVudC4KICAgICAgICAgICAgIyBBbiBycCBlbGVtZW50J3MgZW5kIHRhZyBtYXkgYmUgb21pdHRlZCBpZiB0aGUgcnAgZWxlbWVudCBpcwogICAgICAgICAgICAjIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGFuIHJ0IG9yIHJwIGVsZW1lbnQsIG9yIGlmIHRoZXJlIGlzCiAgICAgICAgICAgICMgbm8gbW9yZSBjb250ZW50IGluIHRoZSBwYXJlbnQgZWxlbWVudC4KICAgICAgICAgICAgaWYgdHlwZSA9PSAiU3RhcnRUYWciOgogICAgICAgICAgICAgICAgcmV0dXJuIG5leHRbIm5hbWUiXSBpbiAoJ3J0JywgJ3JwJykKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiB0eXBlID09ICJFbmRUYWciIG9yIHR5cGUgaXMgTm9uZQogICAgICAgIGVsaWYgdGFnbmFtZSA9PSAnY29sZ3JvdXAnOgogICAgICAgICAgICAjIEEgY29sZ3JvdXAgZWxlbWVudCdzIGVuZCB0YWcgbWF5IGJlIG9taXR0ZWQgaWYgdGhlIGNvbGdyb3VwCiAgICAgICAgICAgICMgZWxlbWVudCBpcyBub3QgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSBzcGFjZSBjaGFyYWN0ZXIgb3IKICAgICAgICAgICAgIyBhIGNvbW1lbnQuCiAgICAgICAgICAgIGlmIHR5cGUgaW4gKCJDb21tZW50IiwgIlNwYWNlQ2hhcmFjdGVycyIpOgogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICAgIGVsaWYgdHlwZSA9PSAiU3RhcnRUYWciOgogICAgICAgICAgICAgICAgIyBYWFg6IHdlIGFsc28gbG9vayBmb3IgYW4gaW1tZWRpYXRlbHkgZm9sbG93aW5nIGNvbGdyb3VwCiAgICAgICAgICAgICAgICAjIGVsZW1lbnQuIFNlZSBpc19vcHRpb25hbF9zdGFydC4KICAgICAgICAgICAgICAgIHJldHVybiBuZXh0WyJuYW1lIl0gIT0gJ2NvbGdyb3VwJwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBlbGlmIHRhZ25hbWUgaW4gKCd0aGVhZCcsICd0Ym9keScpOgogICAgICAgICAgICAjIEEgdGhlYWQgZWxlbWVudCdzIGVuZCB0YWcgbWF5IGJlIG9taXR0ZWQgaWYgdGhlIHRoZWFkIGVsZW1lbnQKICAgICAgICAgICAgIyBpcyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIHRib2R5IG9yIHRmb290IGVsZW1lbnQuCiAgICAgICAgICAgICMgQSB0Ym9keSBlbGVtZW50J3MgZW5kIHRhZyBtYXkgYmUgb21pdHRlZCBpZiB0aGUgdGJvZHkgZWxlbWVudAogICAgICAgICAgICAjIGlzIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgdGJvZHkgb3IgdGZvb3QgZWxlbWVudCwgb3IgaWYKICAgICAgICAgICAgIyB0aGVyZSBpcyBubyBtb3JlIGNvbnRlbnQgaW4gdGhlIHBhcmVudCBlbGVtZW50LgogICAgICAgICAgICAjIEEgdGZvb3QgZWxlbWVudCdzIGVuZCB0YWcgbWF5IGJlIG9taXR0ZWQgaWYgdGhlIHRmb290IGVsZW1lbnQKICAgICAgICAgICAgIyBpcyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIHRib2R5IGVsZW1lbnQsIG9yIGlmIHRoZXJlIGlzIG5vCiAgICAgICAgICAgICMgbW9yZSBjb250ZW50IGluIHRoZSBwYXJlbnQgZWxlbWVudC4KICAgICAgICAgICAgIyBYWFg6IHdlIG5ldmVyIG9taXQgdGhlIGVuZCB0YWcgd2hlbiB0aGUgZm9sbG93aW5nIGVsZW1lbnQgaXMKICAgICAgICAgICAgIyBhIHRib2R5LiBTZWUgaXNfb3B0aW9uYWxfc3RhcnQuCiAgICAgICAgICAgIGlmIHR5cGUgPT0gIlN0YXJ0VGFnIjoKICAgICAgICAgICAgICAgIHJldHVybiBuZXh0WyJuYW1lIl0gaW4gWyd0Ym9keScsICd0Zm9vdCddCiAgICAgICAgICAgIGVsaWYgdGFnbmFtZSA9PSAndGJvZHknOgogICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT0gIkVuZFRhZyIgb3IgdHlwZSBpcyBOb25lCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICBlbGlmIHRhZ25hbWUgPT0gJ3Rmb290JzoKICAgICAgICAgICAgIyBBIHRmb290IGVsZW1lbnQncyBlbmQgdGFnIG1heSBiZSBvbWl0dGVkIGlmIHRoZSB0Zm9vdCBlbGVtZW50CiAgICAgICAgICAgICMgaXMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSB0Ym9keSBlbGVtZW50LCBvciBpZiB0aGVyZSBpcyBubwogICAgICAgICAgICAjIG1vcmUgY29udGVudCBpbiB0aGUgcGFyZW50IGVsZW1lbnQuCiAgICAgICAgICAgICMgWFhYOiB3ZSBuZXZlciBvbWl0IHRoZSBlbmQgdGFnIHdoZW4gdGhlIGZvbGxvd2luZyBlbGVtZW50IGlzCiAgICAgICAgICAgICMgYSB0Ym9keS4gU2VlIGlzX29wdGlvbmFsX3N0YXJ0LgogICAgICAgICAgICBpZiB0eXBlID09ICJTdGFydFRhZyI6CiAgICAgICAgICAgICAgICByZXR1cm4gbmV4dFsibmFtZSJdID09ICd0Ym9keScKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiB0eXBlID09ICJFbmRUYWciIG9yIHR5cGUgaXMgTm9uZQogICAgICAgIGVsaWYgdGFnbmFtZSBpbiAoJ3RkJywgJ3RoJyk6CiAgICAgICAgICAgICMgQSB0ZCBlbGVtZW50J3MgZW5kIHRhZyBtYXkgYmUgb21pdHRlZCBpZiB0aGUgdGQgZWxlbWVudCBpcwogICAgICAgICAgICAjIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgdGQgb3IgdGggZWxlbWVudCwgb3IgaWYgdGhlcmUgaXMKICAgICAgICAgICAgIyBubyBtb3JlIGNvbnRlbnQgaW4gdGhlIHBhcmVudCBlbGVtZW50LgogICAgICAgICAgICAjIEEgdGggZWxlbWVudCdzIGVuZCB0YWcgbWF5IGJlIG9taXR0ZWQgaWYgdGhlIHRoIGVsZW1lbnQgaXMKICAgICAgICAgICAgIyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIHRkIG9yIHRoIGVsZW1lbnQsIG9yIGlmIHRoZXJlIGlzCiAgICAgICAgICAgICMgbm8gbW9yZSBjb250ZW50IGluIHRoZSBwYXJlbnQgZWxlbWVudC4KICAgICAgICAgICAgaWYgdHlwZSA9PSAiU3RhcnRUYWciOgogICAgICAgICAgICAgICAgcmV0dXJuIG5leHRbIm5hbWUiXSBpbiAoJ3RkJywgJ3RoJykKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiB0eXBlID09ICJFbmRUYWciIG9yIHR5cGUgaXMgTm9uZQogICAgICAgIHJldHVybiBGYWxzZQpQSwMEFAAAAAAAAAAhAJoeVJgYYgAAGGIAADkAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvZmlsdGVycy9zYW5pdGl6ZXIucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKCmltcG9ydCByZQpmcm9tIHhtbC5zYXguc2F4dXRpbHMgaW1wb3J0IGVzY2FwZSwgdW5lc2NhcGUKCmZyb20gcGlwLl92ZW5kb3Iuc2l4Lm1vdmVzIGltcG9ydCB1cmxsaWJfcGFyc2UgYXMgdXJscGFyc2UKCmZyb20gLiBpbXBvcnQgYmFzZQpmcm9tIC4uY29uc3RhbnRzIGltcG9ydCBuYW1lc3BhY2VzLCBwcmVmaXhlcwoKX19hbGxfXyA9IFsiRmlsdGVyIl0KCgphbGxvd2VkX2VsZW1lbnRzID0gZnJvemVuc2V0KCgKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdhJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnYWJicicpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2Fjcm9ueW0nKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdhZGRyZXNzJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnYXJlYScpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2FydGljbGUnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdhc2lkZScpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2F1ZGlvJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnYicpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2JpZycpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2Jsb2NrcXVvdGUnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdicicpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2J1dHRvbicpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2NhbnZhcycpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2NhcHRpb24nKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdjZW50ZXInKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdjaXRlJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnY29kZScpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2NvbCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2NvbGdyb3VwJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnY29tbWFuZCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2RhdGFncmlkJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnZGF0YWxpc3QnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdkZCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2RlbCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2RldGFpbHMnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdkZm4nKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdkaWFsb2cnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdkaXInKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdkaXYnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdkbCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2R0JyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnZW0nKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdldmVudC1zb3VyY2UnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdmaWVsZHNldCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2ZpZ2NhcHRpb24nKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdmaWd1cmUnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdmb290ZXInKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdmb250JyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnZm9ybScpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2hlYWRlcicpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2gxJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnaDInKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdoMycpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2g0JyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnaDUnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdoNicpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2hyJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnaScpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2ltZycpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ2lucHV0JyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnaW5zJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAna2V5Z2VuJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAna2JkJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnbGFiZWwnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdsZWdlbmQnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdsaScpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ20nKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdtYXAnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdtZW51JyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnbWV0ZXInKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdtdWx0aWNvbCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ25hdicpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ25leHRpZCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ29sJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnb3V0cHV0JyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnb3B0Z3JvdXAnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdvcHRpb24nKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdwJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAncHJlJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAncHJvZ3Jlc3MnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdxJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAncycpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ3NhbXAnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdzZWN0aW9uJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnc2VsZWN0JyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAnc21hbGwnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdzb3VuZCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ3NvdXJjZScpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ3NwYWNlcicpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ3NwYW4nKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdzdHJpa2UnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdzdHJvbmcnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdzdWInKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICdzdXAnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICd0YWJsZScpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ3Rib2R5JyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAndGQnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICd0ZXh0YXJlYScpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ3RpbWUnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICd0Zm9vdCcpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ3RoJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAndGhlYWQnKSwKICAgIChuYW1lc3BhY2VzWydodG1sJ10sICd0cicpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ3R0JyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAndScpLAogICAgKG5hbWVzcGFjZXNbJ2h0bWwnXSwgJ3VsJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAndmFyJyksCiAgICAobmFtZXNwYWNlc1snaHRtbCddLCAndmlkZW8nKSwKICAgIChuYW1lc3BhY2VzWydtYXRobWwnXSwgJ21hY3Rpb24nKSwKICAgIChuYW1lc3BhY2VzWydtYXRobWwnXSwgJ21hdGgnKSwKICAgIChuYW1lc3BhY2VzWydtYXRobWwnXSwgJ21lcnJvcicpLAogICAgKG5hbWVzcGFjZXNbJ21hdGhtbCddLCAnbWZyYWMnKSwKICAgIChuYW1lc3BhY2VzWydtYXRobWwnXSwgJ21pJyksCiAgICAobmFtZXNwYWNlc1snbWF0aG1sJ10sICdtbXVsdGlzY3JpcHRzJyksCiAgICAobmFtZXNwYWNlc1snbWF0aG1sJ10sICdtbicpLAogICAgKG5hbWVzcGFjZXNbJ21hdGhtbCddLCAnbW8nKSwKICAgIChuYW1lc3BhY2VzWydtYXRobWwnXSwgJ21vdmVyJyksCiAgICAobmFtZXNwYWNlc1snbWF0aG1sJ10sICdtcGFkZGVkJyksCiAgICAobmFtZXNwYWNlc1snbWF0aG1sJ10sICdtcGhhbnRvbScpLAogICAgKG5hbWVzcGFjZXNbJ21hdGhtbCddLCAnbXByZXNjcmlwdHMnKSwKICAgIChuYW1lc3BhY2VzWydtYXRobWwnXSwgJ21yb290JyksCiAgICAobmFtZXNwYWNlc1snbWF0aG1sJ10sICdtcm93JyksCiAgICAobmFtZXNwYWNlc1snbWF0aG1sJ10sICdtc3BhY2UnKSwKICAgIChuYW1lc3BhY2VzWydtYXRobWwnXSwgJ21zcXJ0JyksCiAgICAobmFtZXNwYWNlc1snbWF0aG1sJ10sICdtc3R5bGUnKSwKICAgIChuYW1lc3BhY2VzWydtYXRobWwnXSwgJ21zdWInKSwKICAgIChuYW1lc3BhY2VzWydtYXRobWwnXSwgJ21zdWJzdXAnKSwKICAgIChuYW1lc3BhY2VzWydtYXRobWwnXSwgJ21zdXAnKSwKICAgIChuYW1lc3BhY2VzWydtYXRobWwnXSwgJ210YWJsZScpLAogICAgKG5hbWVzcGFjZXNbJ21hdGhtbCddLCAnbXRkJyksCiAgICAobmFtZXNwYWNlc1snbWF0aG1sJ10sICdtdGV4dCcpLAogICAgKG5hbWVzcGFjZXNbJ21hdGhtbCddLCAnbXRyJyksCiAgICAobmFtZXNwYWNlc1snbWF0aG1sJ10sICdtdW5kZXInKSwKICAgIChuYW1lc3BhY2VzWydtYXRobWwnXSwgJ211bmRlcm92ZXInKSwKICAgIChuYW1lc3BhY2VzWydtYXRobWwnXSwgJ25vbmUnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ2EnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ2FuaW1hdGUnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ2FuaW1hdGVDb2xvcicpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAnYW5pbWF0ZU1vdGlvbicpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAnYW5pbWF0ZVRyYW5zZm9ybScpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAnY2xpcFBhdGgnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ2NpcmNsZScpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAnZGVmcycpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAnZGVzYycpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAnZWxsaXBzZScpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAnZm9udC1mYWNlJyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICdmb250LWZhY2UtbmFtZScpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAnZm9udC1mYWNlLXNyYycpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAnZycpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAnZ2x5cGgnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ2hrZXJuJyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICdsaW5lYXJHcmFkaWVudCcpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAnbGluZScpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAnbWFya2VyJyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICdtZXRhZGF0YScpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAnbWlzc2luZy1nbHlwaCcpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAnbXBhdGgnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ3BhdGgnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ3BvbHlnb24nKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ3BvbHlsaW5lJyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICdyYWRpYWxHcmFkaWVudCcpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAncmVjdCcpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAnc2V0JyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICdzdG9wJyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICdzdmcnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ3N3aXRjaCcpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAndGV4dCcpLAogICAgKG5hbWVzcGFjZXNbJ3N2ZyddLCAndGl0bGUnKSwKICAgIChuYW1lc3BhY2VzWydzdmcnXSwgJ3RzcGFuJyksCiAgICAobmFtZXNwYWNlc1snc3ZnJ10sICd1c2UnKSwKKSkKCmFsbG93ZWRfYXR0cmlidXRlcyA9IGZyb3plbnNldCgoCiAgICAjIEhUTUwgYXR0cmlidXRlcwogICAgKE5vbmUsICdhYmJyJyksCiAgICAoTm9uZSwgJ2FjY2VwdCcpLAogICAgKE5vbmUsICdhY2NlcHQtY2hhcnNldCcpLAogICAgKE5vbmUsICdhY2Nlc3NrZXknKSwKICAgIChOb25lLCAnYWN0aW9uJyksCiAgICAoTm9uZSwgJ2FsaWduJyksCiAgICAoTm9uZSwgJ2FsdCcpLAogICAgKE5vbmUsICdhdXRvY29tcGxldGUnKSwKICAgIChOb25lLCAnYXV0b2ZvY3VzJyksCiAgICAoTm9uZSwgJ2F4aXMnKSwKICAgIChOb25lLCAnYmFja2dyb3VuZCcpLAogICAgKE5vbmUsICdiYWxhbmNlJyksCiAgICAoTm9uZSwgJ2JnY29sb3InKSwKICAgIChOb25lLCAnYmdwcm9wZXJ0aWVzJyksCiAgICAoTm9uZSwgJ2JvcmRlcicpLAogICAgKE5vbmUsICdib3JkZXJjb2xvcicpLAogICAgKE5vbmUsICdib3JkZXJjb2xvcmRhcmsnKSwKICAgIChOb25lLCAnYm9yZGVyY29sb3JsaWdodCcpLAogICAgKE5vbmUsICdib3R0b21wYWRkaW5nJyksCiAgICAoTm9uZSwgJ2NlbGxwYWRkaW5nJyksCiAgICAoTm9uZSwgJ2NlbGxzcGFjaW5nJyksCiAgICAoTm9uZSwgJ2NoJyksCiAgICAoTm9uZSwgJ2NoYWxsZW5nZScpLAogICAgKE5vbmUsICdjaGFyJyksCiAgICAoTm9uZSwgJ2NoYXJvZmYnKSwKICAgIChOb25lLCAnY2hvZmYnKSwKICAgIChOb25lLCAnY2hhcnNldCcpLAogICAgKE5vbmUsICdjaGVja2VkJyksCiAgICAoTm9uZSwgJ2NpdGUnKSwKICAgIChOb25lLCAnY2xhc3MnKSwKICAgIChOb25lLCAnY2xlYXInKSwKICAgIChOb25lLCAnY29sb3InKSwKICAgIChOb25lLCAnY29scycpLAogICAgKE5vbmUsICdjb2xzcGFuJyksCiAgICAoTm9uZSwgJ2NvbXBhY3QnKSwKICAgIChOb25lLCAnY29udGVudGVkaXRhYmxlJyksCiAgICAoTm9uZSwgJ2NvbnRyb2xzJyksCiAgICAoTm9uZSwgJ2Nvb3JkcycpLAogICAgKE5vbmUsICdkYXRhJyksCiAgICAoTm9uZSwgJ2RhdGFmbGQnKSwKICAgIChOb25lLCAnZGF0YXBhZ2VzaXplJyksCiAgICAoTm9uZSwgJ2RhdGFzcmMnKSwKICAgIChOb25lLCAnZGF0ZXRpbWUnKSwKICAgIChOb25lLCAnZGVmYXVsdCcpLAogICAgKE5vbmUsICdkZWxheScpLAogICAgKE5vbmUsICdkaXInKSwKICAgIChOb25lLCAnZGlzYWJsZWQnKSwKICAgIChOb25lLCAnZHJhZ2dhYmxlJyksCiAgICAoTm9uZSwgJ2R5bnNyYycpLAogICAgKE5vbmUsICdlbmN0eXBlJyksCiAgICAoTm9uZSwgJ2VuZCcpLAogICAgKE5vbmUsICdmYWNlJyksCiAgICAoTm9uZSwgJ2ZvcicpLAogICAgKE5vbmUsICdmb3JtJyksCiAgICAoTm9uZSwgJ2ZyYW1lJyksCiAgICAoTm9uZSwgJ2dhbGxlcnlpbWcnKSwKICAgIChOb25lLCAnZ3V0dGVyJyksCiAgICAoTm9uZSwgJ2hlYWRlcnMnKSwKICAgIChOb25lLCAnaGVpZ2h0JyksCiAgICAoTm9uZSwgJ2hpZGVmb2N1cycpLAogICAgKE5vbmUsICdoaWRkZW4nKSwKICAgIChOb25lLCAnaGlnaCcpLAogICAgKE5vbmUsICdocmVmJyksCiAgICAoTm9uZSwgJ2hyZWZsYW5nJyksCiAgICAoTm9uZSwgJ2hzcGFjZScpLAogICAgKE5vbmUsICdpY29uJyksCiAgICAoTm9uZSwgJ2lkJyksCiAgICAoTm9uZSwgJ2lucHV0bW9kZScpLAogICAgKE5vbmUsICdpc21hcCcpLAogICAgKE5vbmUsICdrZXl0eXBlJyksCiAgICAoTm9uZSwgJ2xhYmVsJyksCiAgICAoTm9uZSwgJ2xlZnRzcGFjaW5nJyksCiAgICAoTm9uZSwgJ2xhbmcnKSwKICAgIChOb25lLCAnbGlzdCcpLAogICAgKE5vbmUsICdsb25nZGVzYycpLAogICAgKE5vbmUsICdsb29wJyksCiAgICAoTm9uZSwgJ2xvb3Bjb3VudCcpLAogICAgKE5vbmUsICdsb29wZW5kJyksCiAgICAoTm9uZSwgJ2xvb3BzdGFydCcpLAogICAgKE5vbmUsICdsb3cnKSwKICAgIChOb25lLCAnbG93c3JjJyksCiAgICAoTm9uZSwgJ21heCcpLAogICAgKE5vbmUsICdtYXhsZW5ndGgnKSwKICAgIChOb25lLCAnbWVkaWEnKSwKICAgIChOb25lLCAnbWV0aG9kJyksCiAgICAoTm9uZSwgJ21pbicpLAogICAgKE5vbmUsICdtdWx0aXBsZScpLAogICAgKE5vbmUsICduYW1lJyksCiAgICAoTm9uZSwgJ25vaHJlZicpLAogICAgKE5vbmUsICdub3NoYWRlJyksCiAgICAoTm9uZSwgJ25vd3JhcCcpLAogICAgKE5vbmUsICdvcGVuJyksCiAgICAoTm9uZSwgJ29wdGltdW0nKSwKICAgIChOb25lLCAncGF0dGVybicpLAogICAgKE5vbmUsICdwaW5nJyksCiAgICAoTm9uZSwgJ3BvaW50LXNpemUnKSwKICAgIChOb25lLCAncG9zdGVyJyksCiAgICAoTm9uZSwgJ3BxZycpLAogICAgKE5vbmUsICdwcmVsb2FkJyksCiAgICAoTm9uZSwgJ3Byb21wdCcpLAogICAgKE5vbmUsICdyYWRpb2dyb3VwJyksCiAgICAoTm9uZSwgJ3JlYWRvbmx5JyksCiAgICAoTm9uZSwgJ3JlbCcpLAogICAgKE5vbmUsICdyZXBlYXQtbWF4JyksCiAgICAoTm9uZSwgJ3JlcGVhdC1taW4nKSwKICAgIChOb25lLCAncmVwbGFjZScpLAogICAgKE5vbmUsICdyZXF1aXJlZCcpLAogICAgKE5vbmUsICdyZXYnKSwKICAgIChOb25lLCAncmlnaHRzcGFjaW5nJyksCiAgICAoTm9uZSwgJ3Jvd3MnKSwKICAgIChOb25lLCAncm93c3BhbicpLAogICAgKE5vbmUsICdydWxlcycpLAogICAgKE5vbmUsICdzY29wZScpLAogICAgKE5vbmUsICdzZWxlY3RlZCcpLAogICAgKE5vbmUsICdzaGFwZScpLAogICAgKE5vbmUsICdzaXplJyksCiAgICAoTm9uZSwgJ3NwYW4nKSwKICAgIChOb25lLCAnc3JjJyksCiAgICAoTm9uZSwgJ3N0YXJ0JyksCiAgICAoTm9uZSwgJ3N0ZXAnKSwKICAgIChOb25lLCAnc3R5bGUnKSwKICAgIChOb25lLCAnc3VtbWFyeScpLAogICAgKE5vbmUsICdzdXBwcmVzcycpLAogICAgKE5vbmUsICd0YWJpbmRleCcpLAogICAgKE5vbmUsICd0YXJnZXQnKSwKICAgIChOb25lLCAndGVtcGxhdGUnKSwKICAgIChOb25lLCAndGl0bGUnKSwKICAgIChOb25lLCAndG9wcGFkZGluZycpLAogICAgKE5vbmUsICd0eXBlJyksCiAgICAoTm9uZSwgJ3Vuc2VsZWN0YWJsZScpLAogICAgKE5vbmUsICd1c2VtYXAnKSwKICAgIChOb25lLCAndXJuJyksCiAgICAoTm9uZSwgJ3ZhbGlnbicpLAogICAgKE5vbmUsICd2YWx1ZScpLAogICAgKE5vbmUsICd2YXJpYWJsZScpLAogICAgKE5vbmUsICd2b2x1bWUnKSwKICAgIChOb25lLCAndnNwYWNlJyksCiAgICAoTm9uZSwgJ3ZybWwnKSwKICAgIChOb25lLCAnd2lkdGgnKSwKICAgIChOb25lLCAnd3JhcCcpLAogICAgKG5hbWVzcGFjZXNbJ3htbCddLCAnbGFuZycpLAogICAgIyBNYXRoTUwgYXR0cmlidXRlcwogICAgKE5vbmUsICdhY3Rpb250eXBlJyksCiAgICAoTm9uZSwgJ2FsaWduJyksCiAgICAoTm9uZSwgJ2NvbHVtbmFsaWduJyksCiAgICAoTm9uZSwgJ2NvbHVtbmFsaWduJyksCiAgICAoTm9uZSwgJ2NvbHVtbmFsaWduJyksCiAgICAoTm9uZSwgJ2NvbHVtbmxpbmVzJyksCiAgICAoTm9uZSwgJ2NvbHVtbnNwYWNpbmcnKSwKICAgIChOb25lLCAnY29sdW1uc3BhbicpLAogICAgKE5vbmUsICdkZXB0aCcpLAogICAgKE5vbmUsICdkaXNwbGF5JyksCiAgICAoTm9uZSwgJ2Rpc3BsYXlzdHlsZScpLAogICAgKE5vbmUsICdlcXVhbGNvbHVtbnMnKSwKICAgIChOb25lLCAnZXF1YWxyb3dzJyksCiAgICAoTm9uZSwgJ2ZlbmNlJyksCiAgICAoTm9uZSwgJ2ZvbnRzdHlsZScpLAogICAgKE5vbmUsICdmb250d2VpZ2h0JyksCiAgICAoTm9uZSwgJ2ZyYW1lJyksCiAgICAoTm9uZSwgJ2hlaWdodCcpLAogICAgKE5vbmUsICdsaW5ldGhpY2tuZXNzJyksCiAgICAoTm9uZSwgJ2xzcGFjZScpLAogICAgKE5vbmUsICdtYXRoYmFja2dyb3VuZCcpLAogICAgKE5vbmUsICdtYXRoY29sb3InKSwKICAgIChOb25lLCAnbWF0aHZhcmlhbnQnKSwKICAgIChOb25lLCAnbWF0aHZhcmlhbnQnKSwKICAgIChOb25lLCAnbWF4c2l6ZScpLAogICAgKE5vbmUsICdtaW5zaXplJyksCiAgICAoTm9uZSwgJ290aGVyJyksCiAgICAoTm9uZSwgJ3Jvd2FsaWduJyksCiAgICAoTm9uZSwgJ3Jvd2FsaWduJyksCiAgICAoTm9uZSwgJ3Jvd2FsaWduJyksCiAgICAoTm9uZSwgJ3Jvd2xpbmVzJyksCiAgICAoTm9uZSwgJ3Jvd3NwYWNpbmcnKSwKICAgIChOb25lLCAncm93c3BhbicpLAogICAgKE5vbmUsICdyc3BhY2UnKSwKICAgIChOb25lLCAnc2NyaXB0bGV2ZWwnKSwKICAgIChOb25lLCAnc2VsZWN0aW9uJyksCiAgICAoTm9uZSwgJ3NlcGFyYXRvcicpLAogICAgKE5vbmUsICdzdHJldGNoeScpLAogICAgKE5vbmUsICd3aWR0aCcpLAogICAgKE5vbmUsICd3aWR0aCcpLAogICAgKG5hbWVzcGFjZXNbJ3hsaW5rJ10sICdocmVmJyksCiAgICAobmFtZXNwYWNlc1sneGxpbmsnXSwgJ3Nob3cnKSwKICAgIChuYW1lc3BhY2VzWyd4bGluayddLCAndHlwZScpLAogICAgIyBTVkcgYXR0cmlidXRlcwogICAgKE5vbmUsICdhY2NlbnQtaGVpZ2h0JyksCiAgICAoTm9uZSwgJ2FjY3VtdWxhdGUnKSwKICAgIChOb25lLCAnYWRkaXRpdmUnKSwKICAgIChOb25lLCAnYWxwaGFiZXRpYycpLAogICAgKE5vbmUsICdhcmFiaWMtZm9ybScpLAogICAgKE5vbmUsICdhc2NlbnQnKSwKICAgIChOb25lLCAnYXR0cmlidXRlTmFtZScpLAogICAgKE5vbmUsICdhdHRyaWJ1dGVUeXBlJyksCiAgICAoTm9uZSwgJ2Jhc2VQcm9maWxlJyksCiAgICAoTm9uZSwgJ2Jib3gnKSwKICAgIChOb25lLCAnYmVnaW4nKSwKICAgIChOb25lLCAnYnknKSwKICAgIChOb25lLCAnY2FsY01vZGUnKSwKICAgIChOb25lLCAnY2FwLWhlaWdodCcpLAogICAgKE5vbmUsICdjbGFzcycpLAogICAgKE5vbmUsICdjbGlwLXBhdGgnKSwKICAgIChOb25lLCAnY29sb3InKSwKICAgIChOb25lLCAnY29sb3ItcmVuZGVyaW5nJyksCiAgICAoTm9uZSwgJ2NvbnRlbnQnKSwKICAgIChOb25lLCAnY3gnKSwKICAgIChOb25lLCAnY3knKSwKICAgIChOb25lLCAnZCcpLAogICAgKE5vbmUsICdkeCcpLAogICAgKE5vbmUsICdkeScpLAogICAgKE5vbmUsICdkZXNjZW50JyksCiAgICAoTm9uZSwgJ2Rpc3BsYXknKSwKICAgIChOb25lLCAnZHVyJyksCiAgICAoTm9uZSwgJ2VuZCcpLAogICAgKE5vbmUsICdmaWxsJyksCiAgICAoTm9uZSwgJ2ZpbGwtb3BhY2l0eScpLAogICAgKE5vbmUsICdmaWxsLXJ1bGUnKSwKICAgIChOb25lLCAnZm9udC1mYW1pbHknKSwKICAgIChOb25lLCAnZm9udC1zaXplJyksCiAgICAoTm9uZSwgJ2ZvbnQtc3RyZXRjaCcpLAogICAgKE5vbmUsICdmb250LXN0eWxlJyksCiAgICAoTm9uZSwgJ2ZvbnQtdmFyaWFudCcpLAogICAgKE5vbmUsICdmb250LXdlaWdodCcpLAogICAgKE5vbmUsICdmcm9tJyksCiAgICAoTm9uZSwgJ2Z4JyksCiAgICAoTm9uZSwgJ2Z5JyksCiAgICAoTm9uZSwgJ2cxJyksCiAgICAoTm9uZSwgJ2cyJyksCiAgICAoTm9uZSwgJ2dseXBoLW5hbWUnKSwKICAgIChOb25lLCAnZ3JhZGllbnRVbml0cycpLAogICAgKE5vbmUsICdoYW5naW5nJyksCiAgICAoTm9uZSwgJ2hlaWdodCcpLAogICAgKE5vbmUsICdob3Jpei1hZHYteCcpLAogICAgKE5vbmUsICdob3Jpei1vcmlnaW4teCcpLAogICAgKE5vbmUsICdpZCcpLAogICAgKE5vbmUsICdpZGVvZ3JhcGhpYycpLAogICAgKE5vbmUsICdrJyksCiAgICAoTm9uZSwgJ2tleVBvaW50cycpLAogICAgKE5vbmUsICdrZXlTcGxpbmVzJyksCiAgICAoTm9uZSwgJ2tleVRpbWVzJyksCiAgICAoTm9uZSwgJ2xhbmcnKSwKICAgIChOb25lLCAnbWFya2VyLWVuZCcpLAogICAgKE5vbmUsICdtYXJrZXItbWlkJyksCiAgICAoTm9uZSwgJ21hcmtlci1zdGFydCcpLAogICAgKE5vbmUsICdtYXJrZXJIZWlnaHQnKSwKICAgIChOb25lLCAnbWFya2VyVW5pdHMnKSwKICAgIChOb25lLCAnbWFya2VyV2lkdGgnKSwKICAgIChOb25lLCAnbWF0aGVtYXRpY2FsJyksCiAgICAoTm9uZSwgJ21heCcpLAogICAgKE5vbmUsICdtaW4nKSwKICAgIChOb25lLCAnbmFtZScpLAogICAgKE5vbmUsICdvZmZzZXQnKSwKICAgIChOb25lLCAnb3BhY2l0eScpLAogICAgKE5vbmUsICdvcmllbnQnKSwKICAgIChOb25lLCAnb3JpZ2luJyksCiAgICAoTm9uZSwgJ292ZXJsaW5lLXBvc2l0aW9uJyksCiAgICAoTm9uZSwgJ292ZXJsaW5lLXRoaWNrbmVzcycpLAogICAgKE5vbmUsICdwYW5vc2UtMScpLAogICAgKE5vbmUsICdwYXRoJyksCiAgICAoTm9uZSwgJ3BhdGhMZW5ndGgnKSwKICAgIChOb25lLCAncG9pbnRzJyksCiAgICAoTm9uZSwgJ3ByZXNlcnZlQXNwZWN0UmF0aW8nKSwKICAgIChOb25lLCAncicpLAogICAgKE5vbmUsICdyZWZYJyksCiAgICAoTm9uZSwgJ3JlZlknKSwKICAgIChOb25lLCAncmVwZWF0Q291bnQnKSwKICAgIChOb25lLCAncmVwZWF0RHVyJyksCiAgICAoTm9uZSwgJ3JlcXVpcmVkRXh0ZW5zaW9ucycpLAogICAgKE5vbmUsICdyZXF1aXJlZEZlYXR1cmVzJyksCiAgICAoTm9uZSwgJ3Jlc3RhcnQnKSwKICAgIChOb25lLCAncm90YXRlJyksCiAgICAoTm9uZSwgJ3J4JyksCiAgICAoTm9uZSwgJ3J5JyksCiAgICAoTm9uZSwgJ3Nsb3BlJyksCiAgICAoTm9uZSwgJ3N0ZW1oJyksCiAgICAoTm9uZSwgJ3N0ZW12JyksCiAgICAoTm9uZSwgJ3N0b3AtY29sb3InKSwKICAgIChOb25lLCAnc3RvcC1vcGFjaXR5JyksCiAgICAoTm9uZSwgJ3N0cmlrZXRocm91Z2gtcG9zaXRpb24nKSwKICAgIChOb25lLCAnc3RyaWtldGhyb3VnaC10aGlja25lc3MnKSwKICAgIChOb25lLCAnc3Ryb2tlJyksCiAgICAoTm9uZSwgJ3N0cm9rZS1kYXNoYXJyYXknKSwKICAgIChOb25lLCAnc3Ryb2tlLWRhc2hvZmZzZXQnKSwKICAgIChOb25lLCAnc3Ryb2tlLWxpbmVjYXAnKSwKICAgIChOb25lLCAnc3Ryb2tlLWxpbmVqb2luJyksCiAgICAoTm9uZSwgJ3N0cm9rZS1taXRlcmxpbWl0JyksCiAgICAoTm9uZSwgJ3N0cm9rZS1vcGFjaXR5JyksCiAgICAoTm9uZSwgJ3N0cm9rZS13aWR0aCcpLAogICAgKE5vbmUsICdzeXN0ZW1MYW5ndWFnZScpLAogICAgKE5vbmUsICd0YXJnZXQnKSwKICAgIChOb25lLCAndGV4dC1hbmNob3InKSwKICAgIChOb25lLCAndG8nKSwKICAgIChOb25lLCAndHJhbnNmb3JtJyksCiAgICAoTm9uZSwgJ3R5cGUnKSwKICAgIChOb25lLCAndTEnKSwKICAgIChOb25lLCAndTInKSwKICAgIChOb25lLCAndW5kZXJsaW5lLXBvc2l0aW9uJyksCiAgICAoTm9uZSwgJ3VuZGVybGluZS10aGlja25lc3MnKSwKICAgIChOb25lLCAndW5pY29kZScpLAogICAgKE5vbmUsICd1bmljb2RlLXJhbmdlJyksCiAgICAoTm9uZSwgJ3VuaXRzLXBlci1lbScpLAogICAgKE5vbmUsICd2YWx1ZXMnKSwKICAgIChOb25lLCAndmVyc2lvbicpLAogICAgKE5vbmUsICd2aWV3Qm94JyksCiAgICAoTm9uZSwgJ3Zpc2liaWxpdHknKSwKICAgIChOb25lLCAnd2lkdGgnKSwKICAgIChOb25lLCAnd2lkdGhzJyksCiAgICAoTm9uZSwgJ3gnKSwKICAgIChOb25lLCAneC1oZWlnaHQnKSwKICAgIChOb25lLCAneDEnKSwKICAgIChOb25lLCAneDInKSwKICAgIChuYW1lc3BhY2VzWyd4bGluayddLCAnYWN0dWF0ZScpLAogICAgKG5hbWVzcGFjZXNbJ3hsaW5rJ10sICdhcmNyb2xlJyksCiAgICAobmFtZXNwYWNlc1sneGxpbmsnXSwgJ2hyZWYnKSwKICAgIChuYW1lc3BhY2VzWyd4bGluayddLCAncm9sZScpLAogICAgKG5hbWVzcGFjZXNbJ3hsaW5rJ10sICdzaG93JyksCiAgICAobmFtZXNwYWNlc1sneGxpbmsnXSwgJ3RpdGxlJyksCiAgICAobmFtZXNwYWNlc1sneGxpbmsnXSwgJ3R5cGUnKSwKICAgIChuYW1lc3BhY2VzWyd4bWwnXSwgJ2Jhc2UnKSwKICAgIChuYW1lc3BhY2VzWyd4bWwnXSwgJ2xhbmcnKSwKICAgIChuYW1lc3BhY2VzWyd4bWwnXSwgJ3NwYWNlJyksCiAgICAoTm9uZSwgJ3knKSwKICAgIChOb25lLCAneTEnKSwKICAgIChOb25lLCAneTInKSwKICAgIChOb25lLCAnem9vbUFuZFBhbicpLAopKQoKYXR0cl92YWxfaXNfdXJpID0gZnJvemVuc2V0KCgKICAgIChOb25lLCAnaHJlZicpLAogICAgKE5vbmUsICdzcmMnKSwKICAgIChOb25lLCAnY2l0ZScpLAogICAgKE5vbmUsICdhY3Rpb24nKSwKICAgIChOb25lLCAnbG9uZ2Rlc2MnKSwKICAgIChOb25lLCAncG9zdGVyJyksCiAgICAoTm9uZSwgJ2JhY2tncm91bmQnKSwKICAgIChOb25lLCAnZGF0YXNyYycpLAogICAgKE5vbmUsICdkeW5zcmMnKSwKICAgIChOb25lLCAnbG93c3JjJyksCiAgICAoTm9uZSwgJ3BpbmcnKSwKICAgIChuYW1lc3BhY2VzWyd4bGluayddLCAnaHJlZicpLAogICAgKG5hbWVzcGFjZXNbJ3htbCddLCAnYmFzZScpLAopKQoKc3ZnX2F0dHJfdmFsX2FsbG93c19yZWYgPSBmcm96ZW5zZXQoKAogICAgKE5vbmUsICdjbGlwLXBhdGgnKSwKICAgIChOb25lLCAnY29sb3ItcHJvZmlsZScpLAogICAgKE5vbmUsICdjdXJzb3InKSwKICAgIChOb25lLCAnZmlsbCcpLAogICAgKE5vbmUsICdmaWx0ZXInKSwKICAgIChOb25lLCAnbWFya2VyJyksCiAgICAoTm9uZSwgJ21hcmtlci1zdGFydCcpLAogICAgKE5vbmUsICdtYXJrZXItbWlkJyksCiAgICAoTm9uZSwgJ21hcmtlci1lbmQnKSwKICAgIChOb25lLCAnbWFzaycpLAogICAgKE5vbmUsICdzdHJva2UnKSwKKSkKCnN2Z19hbGxvd19sb2NhbF9ocmVmID0gZnJvemVuc2V0KCgKICAgIChOb25lLCAnYWx0R2x5cGgnKSwKICAgIChOb25lLCAnYW5pbWF0ZScpLAogICAgKE5vbmUsICdhbmltYXRlQ29sb3InKSwKICAgIChOb25lLCAnYW5pbWF0ZU1vdGlvbicpLAogICAgKE5vbmUsICdhbmltYXRlVHJhbnNmb3JtJyksCiAgICAoTm9uZSwgJ2N1cnNvcicpLAogICAgKE5vbmUsICdmZUltYWdlJyksCiAgICAoTm9uZSwgJ2ZpbHRlcicpLAogICAgKE5vbmUsICdsaW5lYXJHcmFkaWVudCcpLAogICAgKE5vbmUsICdwYXR0ZXJuJyksCiAgICAoTm9uZSwgJ3JhZGlhbEdyYWRpZW50JyksCiAgICAoTm9uZSwgJ3RleHRwYXRoJyksCiAgICAoTm9uZSwgJ3RyZWYnKSwKICAgIChOb25lLCAnc2V0JyksCiAgICAoTm9uZSwgJ3VzZScpCikpCgphbGxvd2VkX2Nzc19wcm9wZXJ0aWVzID0gZnJvemVuc2V0KCgKICAgICdhemltdXRoJywKICAgICdiYWNrZ3JvdW5kLWNvbG9yJywKICAgICdib3JkZXItYm90dG9tLWNvbG9yJywKICAgICdib3JkZXItY29sbGFwc2UnLAogICAgJ2JvcmRlci1jb2xvcicsCiAgICAnYm9yZGVyLWxlZnQtY29sb3InLAogICAgJ2JvcmRlci1yaWdodC1jb2xvcicsCiAgICAnYm9yZGVyLXRvcC1jb2xvcicsCiAgICAnY2xlYXInLAogICAgJ2NvbG9yJywKICAgICdjdXJzb3InLAogICAgJ2RpcmVjdGlvbicsCiAgICAnZGlzcGxheScsCiAgICAnZWxldmF0aW9uJywKICAgICdmbG9hdCcsCiAgICAnZm9udCcsCiAgICAnZm9udC1mYW1pbHknLAogICAgJ2ZvbnQtc2l6ZScsCiAgICAnZm9udC1zdHlsZScsCiAgICAnZm9udC12YXJpYW50JywKICAgICdmb250LXdlaWdodCcsCiAgICAnaGVpZ2h0JywKICAgICdsZXR0ZXItc3BhY2luZycsCiAgICAnbGluZS1oZWlnaHQnLAogICAgJ292ZXJmbG93JywKICAgICdwYXVzZScsCiAgICAncGF1c2UtYWZ0ZXInLAogICAgJ3BhdXNlLWJlZm9yZScsCiAgICAncGl0Y2gnLAogICAgJ3BpdGNoLXJhbmdlJywKICAgICdyaWNobmVzcycsCiAgICAnc3BlYWsnLAogICAgJ3NwZWFrLWhlYWRlcicsCiAgICAnc3BlYWstbnVtZXJhbCcsCiAgICAnc3BlYWstcHVuY3R1YXRpb24nLAogICAgJ3NwZWVjaC1yYXRlJywKICAgICdzdHJlc3MnLAogICAgJ3RleHQtYWxpZ24nLAogICAgJ3RleHQtZGVjb3JhdGlvbicsCiAgICAndGV4dC1pbmRlbnQnLAogICAgJ3VuaWNvZGUtYmlkaScsCiAgICAndmVydGljYWwtYWxpZ24nLAogICAgJ3ZvaWNlLWZhbWlseScsCiAgICAndm9sdW1lJywKICAgICd3aGl0ZS1zcGFjZScsCiAgICAnd2lkdGgnLAopKQoKYWxsb3dlZF9jc3Nfa2V5d29yZHMgPSBmcm96ZW5zZXQoKAogICAgJ2F1dG8nLAogICAgJ2FxdWEnLAogICAgJ2JsYWNrJywKICAgICdibG9jaycsCiAgICAnYmx1ZScsCiAgICAnYm9sZCcsCiAgICAnYm90aCcsCiAgICAnYm90dG9tJywKICAgICdicm93bicsCiAgICAnY2VudGVyJywKICAgICdjb2xsYXBzZScsCiAgICAnZGFzaGVkJywKICAgICdkb3R0ZWQnLAogICAgJ2Z1Y2hzaWEnLAogICAgJ2dyYXknLAogICAgJ2dyZWVuJywKICAgICchaW1wb3J0YW50JywKICAgICdpdGFsaWMnLAogICAgJ2xlZnQnLAogICAgJ2xpbWUnLAogICAgJ21hcm9vbicsCiAgICAnbWVkaXVtJywKICAgICdub25lJywKICAgICduYXZ5JywKICAgICdub3JtYWwnLAogICAgJ25vd3JhcCcsCiAgICAnb2xpdmUnLAogICAgJ3BvaW50ZXInLAogICAgJ3B1cnBsZScsCiAgICAncmVkJywKICAgICdyaWdodCcsCiAgICAnc29saWQnLAogICAgJ3NpbHZlcicsCiAgICAndGVhbCcsCiAgICAndG9wJywKICAgICd0cmFuc3BhcmVudCcsCiAgICAndW5kZXJsaW5lJywKICAgICd3aGl0ZScsCiAgICAneWVsbG93JywKKSkKCmFsbG93ZWRfc3ZnX3Byb3BlcnRpZXMgPSBmcm96ZW5zZXQoKAogICAgJ2ZpbGwnLAogICAgJ2ZpbGwtb3BhY2l0eScsCiAgICAnZmlsbC1ydWxlJywKICAgICdzdHJva2UnLAogICAgJ3N0cm9rZS13aWR0aCcsCiAgICAnc3Ryb2tlLWxpbmVjYXAnLAogICAgJ3N0cm9rZS1saW5lam9pbicsCiAgICAnc3Ryb2tlLW9wYWNpdHknLAopKQoKYWxsb3dlZF9wcm90b2NvbHMgPSBmcm96ZW5zZXQoKAogICAgJ2VkMmsnLAogICAgJ2Z0cCcsCiAgICAnaHR0cCcsCiAgICAnaHR0cHMnLAogICAgJ2lyYycsCiAgICAnbWFpbHRvJywKICAgICduZXdzJywKICAgICdnb3BoZXInLAogICAgJ25udHAnLAogICAgJ3RlbG5ldCcsCiAgICAnd2ViY2FsJywKICAgICd4bXBwJywKICAgICdjYWxsdG8nLAogICAgJ2ZlZWQnLAogICAgJ3VybicsCiAgICAnYWltJywKICAgICdyc3luYycsCiAgICAndGFnJywKICAgICdzc2gnLAogICAgJ3NmdHAnLAogICAgJ3J0c3AnLAogICAgJ2FmcycsCiAgICAnZGF0YScsCikpCgphbGxvd2VkX2NvbnRlbnRfdHlwZXMgPSBmcm96ZW5zZXQoKAogICAgJ2ltYWdlL3BuZycsCiAgICAnaW1hZ2UvanBlZycsCiAgICAnaW1hZ2UvZ2lmJywKICAgICdpbWFnZS93ZWJwJywKICAgICdpbWFnZS9ibXAnLAogICAgJ3RleHQvcGxhaW4nLAopKQoKCmRhdGFfY29udGVudF90eXBlID0gcmUuY29tcGlsZShyJycnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTWF0Y2ggYSBjb250ZW50IHR5cGUgPGFwcGxpY2F0aW9uPi88dHlwZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoP1A8Y29udGVudF90eXBlPlstYS16QS1aMC05Ll0rL1stYS16QS1aMC05Ll0rKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTWF0Y2ggYW55IGNoYXJhY3RlciBzZXQgYW5kIGVuY29kaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKD86KD86O2NoYXJzZXQ9KD86Wy1hLXpBLVowLTldKykoPzo7KD86YmFzZTY0KSk/KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCg/OjsoPzpiYXNlNjQpKT8oPzo7Y2hhcnNldD0oPzpbLWEtekEtWjAtOV0rKSk/KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQXNzdW1lIHRoZSByZXN0IGlzIGRhdGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsLioKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJycnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmUuVkVSQk9TRSkKCgpjbGFzcyBGaWx0ZXIoYmFzZS5GaWx0ZXIpOgogICAgIiIiIHNhbml0aXphdGlvbiBvZiBYSFRNTCtNYXRoTUwrU1ZHIGFuZCBvZiBpbmxpbmUgc3R5bGUgYXR0cmlidXRlcy4iIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLAogICAgICAgICAgICAgICAgIHNvdXJjZSwKICAgICAgICAgICAgICAgICBhbGxvd2VkX2VsZW1lbnRzPWFsbG93ZWRfZWxlbWVudHMsCiAgICAgICAgICAgICAgICAgYWxsb3dlZF9hdHRyaWJ1dGVzPWFsbG93ZWRfYXR0cmlidXRlcywKICAgICAgICAgICAgICAgICBhbGxvd2VkX2Nzc19wcm9wZXJ0aWVzPWFsbG93ZWRfY3NzX3Byb3BlcnRpZXMsCiAgICAgICAgICAgICAgICAgYWxsb3dlZF9jc3Nfa2V5d29yZHM9YWxsb3dlZF9jc3Nfa2V5d29yZHMsCiAgICAgICAgICAgICAgICAgYWxsb3dlZF9zdmdfcHJvcGVydGllcz1hbGxvd2VkX3N2Z19wcm9wZXJ0aWVzLAogICAgICAgICAgICAgICAgIGFsbG93ZWRfcHJvdG9jb2xzPWFsbG93ZWRfcHJvdG9jb2xzLAogICAgICAgICAgICAgICAgIGFsbG93ZWRfY29udGVudF90eXBlcz1hbGxvd2VkX2NvbnRlbnRfdHlwZXMsCiAgICAgICAgICAgICAgICAgYXR0cl92YWxfaXNfdXJpPWF0dHJfdmFsX2lzX3VyaSwKICAgICAgICAgICAgICAgICBzdmdfYXR0cl92YWxfYWxsb3dzX3JlZj1zdmdfYXR0cl92YWxfYWxsb3dzX3JlZiwKICAgICAgICAgICAgICAgICBzdmdfYWxsb3dfbG9jYWxfaHJlZj1zdmdfYWxsb3dfbG9jYWxfaHJlZik6CiAgICAgICAgc3VwZXIoRmlsdGVyLCBzZWxmKS5fX2luaXRfXyhzb3VyY2UpCiAgICAgICAgc2VsZi5hbGxvd2VkX2VsZW1lbnRzID0gYWxsb3dlZF9lbGVtZW50cwogICAgICAgIHNlbGYuYWxsb3dlZF9hdHRyaWJ1dGVzID0gYWxsb3dlZF9hdHRyaWJ1dGVzCiAgICAgICAgc2VsZi5hbGxvd2VkX2Nzc19wcm9wZXJ0aWVzID0gYWxsb3dlZF9jc3NfcHJvcGVydGllcwogICAgICAgIHNlbGYuYWxsb3dlZF9jc3Nfa2V5d29yZHMgPSBhbGxvd2VkX2Nzc19rZXl3b3JkcwogICAgICAgIHNlbGYuYWxsb3dlZF9zdmdfcHJvcGVydGllcyA9IGFsbG93ZWRfc3ZnX3Byb3BlcnRpZXMKICAgICAgICBzZWxmLmFsbG93ZWRfcHJvdG9jb2xzID0gYWxsb3dlZF9wcm90b2NvbHMKICAgICAgICBzZWxmLmFsbG93ZWRfY29udGVudF90eXBlcyA9IGFsbG93ZWRfY29udGVudF90eXBlcwogICAgICAgIHNlbGYuYXR0cl92YWxfaXNfdXJpID0gYXR0cl92YWxfaXNfdXJpCiAgICAgICAgc2VsZi5zdmdfYXR0cl92YWxfYWxsb3dzX3JlZiA9IHN2Z19hdHRyX3ZhbF9hbGxvd3NfcmVmCiAgICAgICAgc2VsZi5zdmdfYWxsb3dfbG9jYWxfaHJlZiA9IHN2Z19hbGxvd19sb2NhbF9ocmVmCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIGZvciB0b2tlbiBpbiBiYXNlLkZpbHRlci5fX2l0ZXJfXyhzZWxmKToKICAgICAgICAgICAgdG9rZW4gPSBzZWxmLnNhbml0aXplX3Rva2VuKHRva2VuKQogICAgICAgICAgICBpZiB0b2tlbjoKICAgICAgICAgICAgICAgIHlpZWxkIHRva2VuCgogICAgIyBTYW5pdGl6ZSB0aGUgK2h0bWwrLCBlc2NhcGluZyBhbGwgZWxlbWVudHMgbm90IGluIEFMTE9XRURfRUxFTUVOVFMsIGFuZAogICAgIyBzdHJpcHBpbmcgb3V0IGFsbCAjIGF0dHJpYnV0ZXMgbm90IGluIEFMTE9XRURfQVRUUklCVVRFUy4gU3R5bGUKICAgICMgYXR0cmlidXRlcyBhcmUgcGFyc2VkLCBhbmQgYSByZXN0cmljdGVkIHNldCwgIyBzcGVjaWZpZWQgYnkKICAgICMgQUxMT1dFRF9DU1NfUFJPUEVSVElFUyBhbmQgQUxMT1dFRF9DU1NfS0VZV09SRFMsIGFyZSBhbGxvd2VkIHRocm91Z2guCiAgICAjIGF0dHJpYnV0ZXMgaW4gQVRUUl9WQUxfSVNfVVJJIGFyZSBzY2FubmVkLCBhbmQgb25seSBVUkkgc2NoZW1lcyBzcGVjaWZpZWQKICAgICMgaW4gQUxMT1dFRF9QUk9UT0NPTFMgYXJlIGFsbG93ZWQuCiAgICAjCiAgICAjICAgc2FuaXRpemVfaHRtbCgnPHNjcmlwdD4gZG9fbmFzdHlfc3R1ZmYoKSA8L3NjcmlwdD4nKQogICAgIyAgICA9PiAmbHQ7c2NyaXB0PiBkb19uYXN0eV9zdHVmZigpICZsdDsvc2NyaXB0PgogICAgIyAgIHNhbml0aXplX2h0bWwoJzxhIGhyZWY9ImphdmFzY3JpcHQ6IHN1Y2tlcigpOyI+Q2xpY2sgaGVyZSBmb3IgJDEwMDwvYT4nKQogICAgIyAgICA9PiA8YT5DbGljayBoZXJlIGZvciAkMTAwPC9hPgogICAgZGVmIHNhbml0aXplX3Rva2VuKHNlbGYsIHRva2VuKToKCiAgICAgICAgIyBhY2NvbW1vZGF0ZSBmaWx0ZXJzIHdoaWNoIHVzZSB0b2tlbl90eXBlIGRpZmZlcmVudGx5CiAgICAgICAgdG9rZW5fdHlwZSA9IHRva2VuWyJ0eXBlIl0KICAgICAgICBpZiB0b2tlbl90eXBlIGluICgiU3RhcnRUYWciLCAiRW5kVGFnIiwgIkVtcHR5VGFnIik6CiAgICAgICAgICAgIG5hbWUgPSB0b2tlblsibmFtZSJdCiAgICAgICAgICAgIG5hbWVzcGFjZSA9IHRva2VuWyJuYW1lc3BhY2UiXQogICAgICAgICAgICBpZiAoKG5hbWVzcGFjZSwgbmFtZSkgaW4gc2VsZi5hbGxvd2VkX2VsZW1lbnRzIG9yCiAgICAgICAgICAgICAgICAobmFtZXNwYWNlIGlzIE5vbmUgYW5kCiAgICAgICAgICAgICAgICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgbmFtZSkgaW4gc2VsZi5hbGxvd2VkX2VsZW1lbnRzKSk6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5hbGxvd2VkX3Rva2VuKHRva2VuKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGlzYWxsb3dlZF90b2tlbih0b2tlbikKICAgICAgICBlbGlmIHRva2VuX3R5cGUgPT0gIkNvbW1lbnQiOgogICAgICAgICAgICBwYXNzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgZGVmIGFsbG93ZWRfdG9rZW4oc2VsZiwgdG9rZW4pOgogICAgICAgIGlmICJkYXRhIiBpbiB0b2tlbjoKICAgICAgICAgICAgYXR0cnMgPSB0b2tlblsiZGF0YSJdCiAgICAgICAgICAgIGF0dHJfbmFtZXMgPSBzZXQoYXR0cnMua2V5cygpKQoKICAgICAgICAgICAgIyBSZW1vdmUgZm9yYmlkZGVuIGF0dHJpYnV0ZXMKICAgICAgICAgICAgZm9yIHRvX3JlbW92ZSBpbiAoYXR0cl9uYW1lcyAtIHNlbGYuYWxsb3dlZF9hdHRyaWJ1dGVzKToKICAgICAgICAgICAgICAgIGRlbCB0b2tlblsiZGF0YSJdW3RvX3JlbW92ZV0KICAgICAgICAgICAgICAgIGF0dHJfbmFtZXMucmVtb3ZlKHRvX3JlbW92ZSkKCiAgICAgICAgICAgICMgUmVtb3ZlIGF0dHJpYnV0ZXMgd2l0aCBkaXNhbGxvd2VkIFVSTCB2YWx1ZXMKICAgICAgICAgICAgZm9yIGF0dHIgaW4gKGF0dHJfbmFtZXMgJiBzZWxmLmF0dHJfdmFsX2lzX3VyaSk6CiAgICAgICAgICAgICAgICBhc3NlcnQgYXR0ciBpbiBhdHRycwogICAgICAgICAgICAgICAgIyBJIGRvbid0IGhhdmUgYSBjbHVlIHdoZXJlIHRoaXMgcmVnZXhwIGNvbWVzIGZyb20gb3Igd2h5IGl0IG1hdGNoZXMgdGhvc2UKICAgICAgICAgICAgICAgICMgY2hhcmFjdGVycywgbm9yIHdoeSB3ZSBjYWxsIHVuZXNjYXBlLiBJIGp1c3Qga25vdyBpdCdzIGFsd2F5cyBiZWVuIGhlcmUuCiAgICAgICAgICAgICAgICAjIFNob3VsZCB5b3UgYmUgd29ycmllZCBieSB0aGlzIGNvbW1lbnQgaW4gYSBzYW5pdGl6ZXI/IFllcy4gT24gdGhlIG90aGVyIGhhbmQsIGFsbAogICAgICAgICAgICAgICAgIyB0aGlzIHdpbGwgZG8gaXMgcmVtb3ZlICptb3JlKiB0aGFuIGl0IG90aGVyd2lzZSB3b3VsZC4KICAgICAgICAgICAgICAgIHZhbF91bmVzY2FwZWQgPSByZS5zdWIoIltgXHgwMC1ceDIwXHg3Zi1ceGEwXHNdKyIsICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmVzY2FwZShhdHRyc1thdHRyXSkpLmxvd2VyKCkKICAgICAgICAgICAgICAgICMgcmVtb3ZlIHJlcGxhY2VtZW50IGNoYXJhY3RlcnMgZnJvbSB1bmVzY2FwZWQgY2hhcmFjdGVycwogICAgICAgICAgICAgICAgdmFsX3VuZXNjYXBlZCA9IHZhbF91bmVzY2FwZWQucmVwbGFjZSgiXHVmZmZkIiwgIiIpCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgdXJpID0gdXJscGFyc2UudXJscGFyc2UodmFsX3VuZXNjYXBlZCkKICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgICAgIHVyaSA9IE5vbmUKICAgICAgICAgICAgICAgICAgICBkZWwgYXR0cnNbYXR0cl0KICAgICAgICAgICAgICAgIGlmIHVyaSBhbmQgdXJpLnNjaGVtZToKICAgICAgICAgICAgICAgICAgICBpZiB1cmkuc2NoZW1lIG5vdCBpbiBzZWxmLmFsbG93ZWRfcHJvdG9jb2xzOgogICAgICAgICAgICAgICAgICAgICAgICBkZWwgYXR0cnNbYXR0cl0KICAgICAgICAgICAgICAgICAgICBpZiB1cmkuc2NoZW1lID09ICdkYXRhJzoKICAgICAgICAgICAgICAgICAgICAgICAgbSA9IGRhdGFfY29udGVudF90eXBlLm1hdGNoKHVyaS5wYXRoKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgbToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBhdHRyc1thdHRyXQogICAgICAgICAgICAgICAgICAgICAgICBlbGlmIG0uZ3JvdXAoJ2NvbnRlbnRfdHlwZScpIG5vdCBpbiBzZWxmLmFsbG93ZWRfY29udGVudF90eXBlczoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBhdHRyc1thdHRyXQoKICAgICAgICAgICAgZm9yIGF0dHIgaW4gc2VsZi5zdmdfYXR0cl92YWxfYWxsb3dzX3JlZjoKICAgICAgICAgICAgICAgIGlmIGF0dHIgaW4gYXR0cnM6CiAgICAgICAgICAgICAgICAgICAgYXR0cnNbYXR0cl0gPSByZS5zdWIocid1cmxccypcKFxzKlteI1xzXVteKV0rP1wpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5lc2NhcGUoYXR0cnNbYXR0cl0pKQogICAgICAgICAgICBpZiAodG9rZW5bIm5hbWUiXSBpbiBzZWxmLnN2Z19hbGxvd19sb2NhbF9ocmVmIGFuZAogICAgICAgICAgICAgICAgKG5hbWVzcGFjZXNbJ3hsaW5rJ10sICdocmVmJykgaW4gYXR0cnMgYW5kIHJlLnNlYXJjaCgnXlxzKlteI1xzXS4qJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnNbKG5hbWVzcGFjZXNbJ3hsaW5rJ10sICdocmVmJyldKSk6CiAgICAgICAgICAgICAgICBkZWwgYXR0cnNbKG5hbWVzcGFjZXNbJ3hsaW5rJ10sICdocmVmJyldCiAgICAgICAgICAgIGlmIChOb25lLCAnc3R5bGUnKSBpbiBhdHRyczoKICAgICAgICAgICAgICAgIGF0dHJzWyhOb25lLCAnc3R5bGUnKV0gPSBzZWxmLnNhbml0aXplX2NzcyhhdHRyc1soTm9uZSwgJ3N0eWxlJyldKQogICAgICAgICAgICB0b2tlblsiZGF0YSJdID0gYXR0cnMKICAgICAgICByZXR1cm4gdG9rZW4KCiAgICBkZWYgZGlzYWxsb3dlZF90b2tlbihzZWxmLCB0b2tlbik6CiAgICAgICAgdG9rZW5fdHlwZSA9IHRva2VuWyJ0eXBlIl0KICAgICAgICBpZiB0b2tlbl90eXBlID09ICJFbmRUYWciOgogICAgICAgICAgICB0b2tlblsiZGF0YSJdID0gIjwvJXM+IiAlIHRva2VuWyJuYW1lIl0KICAgICAgICBlbGlmIHRva2VuWyJkYXRhIl06CiAgICAgICAgICAgIGFzc2VydCB0b2tlbl90eXBlIGluICgiU3RhcnRUYWciLCAiRW1wdHlUYWciKQogICAgICAgICAgICBhdHRycyA9IFtdCiAgICAgICAgICAgIGZvciAobnMsIG5hbWUpLCB2IGluIHRva2VuWyJkYXRhIl0uaXRlbXMoKToKICAgICAgICAgICAgICAgIGF0dHJzLmFwcGVuZCgnICVzPSIlcyInICUgKG5hbWUgaWYgbnMgaXMgTm9uZSBlbHNlICIlczolcyIgJSAocHJlZml4ZXNbbnNdLCBuYW1lKSwgZXNjYXBlKHYpKSkKICAgICAgICAgICAgdG9rZW5bImRhdGEiXSA9ICI8JXMlcz4iICUgKHRva2VuWyJuYW1lIl0sICcnLmpvaW4oYXR0cnMpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHRva2VuWyJkYXRhIl0gPSAiPCVzPiIgJSB0b2tlblsibmFtZSJdCiAgICAgICAgaWYgdG9rZW4uZ2V0KCJzZWxmQ2xvc2luZyIpOgogICAgICAgICAgICB0b2tlblsiZGF0YSJdID0gdG9rZW5bImRhdGEiXVs6LTFdICsgIi8+IgoKICAgICAgICB0b2tlblsidHlwZSJdID0gIkNoYXJhY3RlcnMiCgogICAgICAgIGRlbCB0b2tlblsibmFtZSJdCiAgICAgICAgcmV0dXJuIHRva2VuCgogICAgZGVmIHNhbml0aXplX2NzcyhzZWxmLCBzdHlsZSk6CiAgICAgICAgIyBkaXNhbGxvdyB1cmxzCiAgICAgICAgc3R5bGUgPSByZS5jb21waWxlKCd1cmxccypcKFxzKlteXHMpXSs/XHMqXClccyonKS5zdWIoJyAnLCBzdHlsZSkKCiAgICAgICAgIyBnYXVudGxldAogICAgICAgIGlmIG5vdCByZS5tYXRjaCgiIiJeKFs6LDsjJS5cc2EtekEtWjAtOSFdfFx3LVx3fCdbXHNcd10rJ3wiW1xzXHddKyJ8XChbXGQsXHNdK1wpKSokIiIiLCBzdHlsZSk6CiAgICAgICAgICAgIHJldHVybiAnJwogICAgICAgIGlmIG5vdCByZS5tYXRjaCgiXlxzKihbLVx3XStccyo6W146O10qKDtccyp8JCkpKiQiLCBzdHlsZSk6CiAgICAgICAgICAgIHJldHVybiAnJwoKICAgICAgICBjbGVhbiA9IFtdCiAgICAgICAgZm9yIHByb3AsIHZhbHVlIGluIHJlLmZpbmRhbGwoIihbLVx3XSspXHMqOlxzKihbXjo7XSopIiwgc3R5bGUpOgogICAgICAgICAgICBpZiBub3QgdmFsdWU6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBwcm9wLmxvd2VyKCkgaW4gc2VsZi5hbGxvd2VkX2Nzc19wcm9wZXJ0aWVzOgogICAgICAgICAgICAgICAgY2xlYW4uYXBwZW5kKHByb3AgKyAnOiAnICsgdmFsdWUgKyAnOycpCiAgICAgICAgICAgIGVsaWYgcHJvcC5zcGxpdCgnLScpWzBdLmxvd2VyKCkgaW4gWydiYWNrZ3JvdW5kJywgJ2JvcmRlcicsICdtYXJnaW4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGFkZGluZyddOgogICAgICAgICAgICAgICAgZm9yIGtleXdvcmQgaW4gdmFsdWUuc3BsaXQoKToKICAgICAgICAgICAgICAgICAgICBpZiBrZXl3b3JkIG5vdCBpbiBzZWxmLmFsbG93ZWRfY3NzX2tleXdvcmRzIGFuZCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgcmUubWF0Y2goIl4oI1swLTlhLWZdK3xyZ2JcKFxkKyU/LFxkKiU/LD9cZColP1wpP3xcZHswLDJ9XC4/XGR7MCwyfShjbXxlbXxleHxpbnxtbXxwY3xwdHxweHwlfCx8XCkpPykkIiwga2V5d29yZCk6ICAjIG5vcWEKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgY2xlYW4uYXBwZW5kKHByb3AgKyAnOiAnICsgdmFsdWUgKyAnOycpCiAgICAgICAgICAgIGVsaWYgcHJvcC5sb3dlcigpIGluIHNlbGYuYWxsb3dlZF9zdmdfcHJvcGVydGllczoKICAgICAgICAgICAgICAgIGNsZWFuLmFwcGVuZChwcm9wICsgJzogJyArIHZhbHVlICsgJzsnKQoKICAgICAgICByZXR1cm4gJyAnLmpvaW4oY2xlYW4pClBLAwQUAAAAAAAAACEAn45qrXMEAABzBAAAOgAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9maWx0ZXJzL3doaXRlc3BhY2UucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKCmltcG9ydCByZQoKZnJvbSAuIGltcG9ydCBiYXNlCmZyb20gLi5jb25zdGFudHMgaW1wb3J0IHJjZGF0YUVsZW1lbnRzLCBzcGFjZUNoYXJhY3RlcnMKc3BhY2VDaGFyYWN0ZXJzID0gIiIuam9pbihzcGFjZUNoYXJhY3RlcnMpCgpTUEFDRVNfUkVHRVggPSByZS5jb21waWxlKCJbJXNdKyIgJSBzcGFjZUNoYXJhY3RlcnMpCgoKY2xhc3MgRmlsdGVyKGJhc2UuRmlsdGVyKToKCiAgICBzcGFjZVByZXNlcnZlRWxlbWVudHMgPSBmcm96ZW5zZXQoWyJwcmUiLCAidGV4dGFyZWEiXSArIGxpc3QocmNkYXRhRWxlbWVudHMpKQoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICBwcmVzZXJ2ZSA9IDAKICAgICAgICBmb3IgdG9rZW4gaW4gYmFzZS5GaWx0ZXIuX19pdGVyX18oc2VsZik6CiAgICAgICAgICAgIHR5cGUgPSB0b2tlblsidHlwZSJdCiAgICAgICAgICAgIGlmIHR5cGUgPT0gIlN0YXJ0VGFnIiBcCiAgICAgICAgICAgICAgICAgICAgYW5kIChwcmVzZXJ2ZSBvciB0b2tlblsibmFtZSJdIGluIHNlbGYuc3BhY2VQcmVzZXJ2ZUVsZW1lbnRzKToKICAgICAgICAgICAgICAgIHByZXNlcnZlICs9IDEKCiAgICAgICAgICAgIGVsaWYgdHlwZSA9PSAiRW5kVGFnIiBhbmQgcHJlc2VydmU6CiAgICAgICAgICAgICAgICBwcmVzZXJ2ZSAtPSAxCgogICAgICAgICAgICBlbGlmIG5vdCBwcmVzZXJ2ZSBhbmQgdHlwZSA9PSAiU3BhY2VDaGFyYWN0ZXJzIiBhbmQgdG9rZW5bImRhdGEiXToKICAgICAgICAgICAgICAgICMgVGVzdCBvbiB0b2tlblsiZGF0YSJdIGFib3ZlIHRvIG5vdCBpbnRyb2R1Y2Ugc3BhY2VzIHdoZXJlIHRoZXJlIHdlcmUgbm90CiAgICAgICAgICAgICAgICB0b2tlblsiZGF0YSJdID0gIiAiCgogICAgICAgICAgICBlbGlmIG5vdCBwcmVzZXJ2ZSBhbmQgdHlwZSA9PSAiQ2hhcmFjdGVycyI6CiAgICAgICAgICAgICAgICB0b2tlblsiZGF0YSJdID0gY29sbGFwc2Vfc3BhY2VzKHRva2VuWyJkYXRhIl0pCgogICAgICAgICAgICB5aWVsZCB0b2tlbgoKCmRlZiBjb2xsYXBzZV9zcGFjZXModGV4dCk6CiAgICByZXR1cm4gU1BBQ0VTX1JFR0VYLnN1YignICcsIHRleHQpClBLAwQUAAAAAAAAACEAY9h33LLJAQCyyQEAMwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9odG1sNXBhcnNlci5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwpmcm9tIHBpcC5fdmVuZG9yLnNpeCBpbXBvcnQgd2l0aF9tZXRhY2xhc3MsIHZpZXdrZXlzLCBQWTMKCmltcG9ydCB0eXBlcwoKdHJ5OgogICAgZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgT3JkZXJlZERpY3QKZXhjZXB0IEltcG9ydEVycm9yOgogICAgZnJvbSBwaXAuX3ZlbmRvci5vcmRlcmVkZGljdCBpbXBvcnQgT3JkZXJlZERpY3QKCmZyb20gLiBpbXBvcnQgX2lucHV0c3RyZWFtCmZyb20gLiBpbXBvcnQgX3Rva2VuaXplcgoKZnJvbSAuIGltcG9ydCB0cmVlYnVpbGRlcnMKZnJvbSAudHJlZWJ1aWxkZXJzLmJhc2UgaW1wb3J0IE1hcmtlcgoKZnJvbSAuIGltcG9ydCBfdXRpbHMKZnJvbSAuY29uc3RhbnRzIGltcG9ydCAoCiAgICBzcGFjZUNoYXJhY3RlcnMsIGFzY2lpVXBwZXIyTG93ZXIsCiAgICBzcGVjaWFsRWxlbWVudHMsIGhlYWRpbmdFbGVtZW50cywgY2RhdGFFbGVtZW50cywgcmNkYXRhRWxlbWVudHMsCiAgICB0b2tlblR5cGVzLCB0YWdUb2tlblR5cGVzLAogICAgbmFtZXNwYWNlcywKICAgIGh0bWxJbnRlZ3JhdGlvblBvaW50RWxlbWVudHMsIG1hdGhtbFRleHRJbnRlZ3JhdGlvblBvaW50RWxlbWVudHMsCiAgICBhZGp1c3RGb3JlaWduQXR0cmlidXRlcyBhcyBhZGp1c3RGb3JlaWduQXR0cmlidXRlc01hcCwKICAgIGFkanVzdE1hdGhNTEF0dHJpYnV0ZXMsIGFkanVzdFNWR0F0dHJpYnV0ZXMsCiAgICBFLAogICAgUmVwYXJzZUV4Y2VwdGlvbgopCgoKZGVmIHBhcnNlKGRvYywgdHJlZWJ1aWxkZXI9ImV0cmVlIiwgbmFtZXNwYWNlSFRNTEVsZW1lbnRzPVRydWUsICoqa3dhcmdzKToKICAgICIiIlBhcnNlIGEgc3RyaW5nIG9yIGZpbGUtbGlrZSBvYmplY3QgaW50byBhIHRyZWUiIiIKICAgIHRiID0gdHJlZWJ1aWxkZXJzLmdldFRyZWVCdWlsZGVyKHRyZWVidWlsZGVyKQogICAgcCA9IEhUTUxQYXJzZXIodGIsIG5hbWVzcGFjZUhUTUxFbGVtZW50cz1uYW1lc3BhY2VIVE1MRWxlbWVudHMpCiAgICByZXR1cm4gcC5wYXJzZShkb2MsICoqa3dhcmdzKQoKCmRlZiBwYXJzZUZyYWdtZW50KGRvYywgY29udGFpbmVyPSJkaXYiLCB0cmVlYnVpbGRlcj0iZXRyZWUiLCBuYW1lc3BhY2VIVE1MRWxlbWVudHM9VHJ1ZSwgKiprd2FyZ3MpOgogICAgdGIgPSB0cmVlYnVpbGRlcnMuZ2V0VHJlZUJ1aWxkZXIodHJlZWJ1aWxkZXIpCiAgICBwID0gSFRNTFBhcnNlcih0YiwgbmFtZXNwYWNlSFRNTEVsZW1lbnRzPW5hbWVzcGFjZUhUTUxFbGVtZW50cykKICAgIHJldHVybiBwLnBhcnNlRnJhZ21lbnQoZG9jLCBjb250YWluZXI9Y29udGFpbmVyLCAqKmt3YXJncykKCgpkZWYgbWV0aG9kX2RlY29yYXRvcl9tZXRhY2xhc3MoZnVuY3Rpb24pOgogICAgY2xhc3MgRGVjb3JhdGVkKHR5cGUpOgogICAgICAgIGRlZiBfX25ld19fKG1ldGEsIGNsYXNzbmFtZSwgYmFzZXMsIGNsYXNzRGljdCk6CiAgICAgICAgICAgIGZvciBhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGUgaW4gY2xhc3NEaWN0Lml0ZW1zKCk6CiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGF0dHJpYnV0ZSwgdHlwZXMuRnVuY3Rpb25UeXBlKToKICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSBmdW5jdGlvbihhdHRyaWJ1dGUpCgogICAgICAgICAgICAgICAgY2xhc3NEaWN0W2F0dHJpYnV0ZU5hbWVdID0gYXR0cmlidXRlCiAgICAgICAgICAgIHJldHVybiB0eXBlLl9fbmV3X18obWV0YSwgY2xhc3NuYW1lLCBiYXNlcywgY2xhc3NEaWN0KQogICAgcmV0dXJuIERlY29yYXRlZAoKCmNsYXNzIEhUTUxQYXJzZXIob2JqZWN0KToKICAgICIiIkhUTUwgcGFyc2VyLiBHZW5lcmF0ZXMgYSB0cmVlIHN0cnVjdHVyZSBmcm9tIGEgc3RyZWFtIG9mIChwb3NzaWJseQogICAgICAgIG1hbGZvcm1lZCkgSFRNTCIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0cmVlPU5vbmUsIHN0cmljdD1GYWxzZSwgbmFtZXNwYWNlSFRNTEVsZW1lbnRzPVRydWUsIGRlYnVnPUZhbHNlKToKICAgICAgICAiIiIKICAgICAgICBzdHJpY3QgLSByYWlzZSBhbiBleGNlcHRpb24gd2hlbiBhIHBhcnNlIGVycm9yIGlzIGVuY291bnRlcmVkCgogICAgICAgIHRyZWUgLSBhIHRyZWVidWlsZGVyIGNsYXNzIGNvbnRyb2xsaW5nIHRoZSB0eXBlIG9mIHRyZWUgdGhhdCB3aWxsIGJlCiAgICAgICAgcmV0dXJuZWQuIEJ1aWx0IGluIHRyZWVidWlsZGVycyBjYW4gYmUgYWNjZXNzZWQgdGhyb3VnaAogICAgICAgIGh0bWw1bGliLnRyZWVidWlsZGVycy5nZXRUcmVlQnVpbGRlcih0cmVlVHlwZSkKICAgICAgICAiIiIKCiAgICAgICAgIyBSYWlzZSBhbiBleGNlcHRpb24gb24gdGhlIGZpcnN0IGVycm9yIGVuY291bnRlcmVkCiAgICAgICAgc2VsZi5zdHJpY3QgPSBzdHJpY3QKCiAgICAgICAgaWYgdHJlZSBpcyBOb25lOgogICAgICAgICAgICB0cmVlID0gdHJlZWJ1aWxkZXJzLmdldFRyZWVCdWlsZGVyKCJldHJlZSIpCiAgICAgICAgc2VsZi50cmVlID0gdHJlZShuYW1lc3BhY2VIVE1MRWxlbWVudHMpCiAgICAgICAgc2VsZi5lcnJvcnMgPSBbXQoKICAgICAgICBzZWxmLnBoYXNlcyA9IGRpY3QoWyhuYW1lLCBjbHMoc2VsZiwgc2VsZi50cmVlKSkgZm9yIG5hbWUsIGNscyBpbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UGhhc2VzKGRlYnVnKS5pdGVtcygpXSkKCiAgICBkZWYgX3BhcnNlKHNlbGYsIHN0cmVhbSwgaW5uZXJIVE1MPUZhbHNlLCBjb250YWluZXI9ImRpdiIsIHNjcmlwdGluZz1GYWxzZSwgKiprd2FyZ3MpOgoKICAgICAgICBzZWxmLmlubmVySFRNTE1vZGUgPSBpbm5lckhUTUwKICAgICAgICBzZWxmLmNvbnRhaW5lciA9IGNvbnRhaW5lcgogICAgICAgIHNlbGYuc2NyaXB0aW5nID0gc2NyaXB0aW5nCiAgICAgICAgc2VsZi50b2tlbml6ZXIgPSBfdG9rZW5pemVyLkhUTUxUb2tlbml6ZXIoc3RyZWFtLCBwYXJzZXI9c2VsZiwgKiprd2FyZ3MpCiAgICAgICAgc2VsZi5yZXNldCgpCgogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5tYWluTG9vcCgpCiAgICAgICAgZXhjZXB0IFJlcGFyc2VFeGNlcHRpb246CiAgICAgICAgICAgIHNlbGYucmVzZXQoKQogICAgICAgICAgICBzZWxmLm1haW5Mb29wKCkKCiAgICBkZWYgcmVzZXQoc2VsZik6CiAgICAgICAgc2VsZi50cmVlLnJlc2V0KCkKICAgICAgICBzZWxmLmZpcnN0U3RhcnRUYWcgPSBGYWxzZQogICAgICAgIHNlbGYuZXJyb3JzID0gW10KICAgICAgICBzZWxmLmxvZyA9IFtdICAjIG9ubHkgdXNlZCB3aXRoIGRlYnVnIG1vZGUKICAgICAgICAjICJxdWlya3MiIC8gImxpbWl0ZWQgcXVpcmtzIiAvICJubyBxdWlya3MiCiAgICAgICAgc2VsZi5jb21wYXRNb2RlID0gIm5vIHF1aXJrcyIKCiAgICAgICAgaWYgc2VsZi5pbm5lckhUTUxNb2RlOgogICAgICAgICAgICBzZWxmLmlubmVySFRNTCA9IHNlbGYuY29udGFpbmVyLmxvd2VyKCkKCiAgICAgICAgICAgIGlmIHNlbGYuaW5uZXJIVE1MIGluIGNkYXRhRWxlbWVudHM6CiAgICAgICAgICAgICAgICBzZWxmLnRva2VuaXplci5zdGF0ZSA9IHNlbGYudG9rZW5pemVyLnJjZGF0YVN0YXRlCiAgICAgICAgICAgIGVsaWYgc2VsZi5pbm5lckhUTUwgaW4gcmNkYXRhRWxlbWVudHM6CiAgICAgICAgICAgICAgICBzZWxmLnRva2VuaXplci5zdGF0ZSA9IHNlbGYudG9rZW5pemVyLnJhd3RleHRTdGF0ZQogICAgICAgICAgICBlbGlmIHNlbGYuaW5uZXJIVE1MID09ICdwbGFpbnRleHQnOgogICAgICAgICAgICAgICAgc2VsZi50b2tlbml6ZXIuc3RhdGUgPSBzZWxmLnRva2VuaXplci5wbGFpbnRleHRTdGF0ZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBzdGF0ZSBhbHJlYWR5IGlzIGRhdGEgc3RhdGUKICAgICAgICAgICAgICAgICMgc2VsZi50b2tlbml6ZXIuc3RhdGUgPSBzZWxmLnRva2VuaXplci5kYXRhU3RhdGUKICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgc2VsZi5waGFzZSA9IHNlbGYucGhhc2VzWyJiZWZvcmVIdG1sIl0KICAgICAgICAgICAgc2VsZi5waGFzZS5pbnNlcnRIdG1sRWxlbWVudCgpCiAgICAgICAgICAgIHNlbGYucmVzZXRJbnNlcnRpb25Nb2RlKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmlubmVySFRNTCA9IEZhbHNlICAjIHB5bGludDpkaXNhYmxlPXJlZGVmaW5lZC12YXJpYWJsZS10eXBlCiAgICAgICAgICAgIHNlbGYucGhhc2UgPSBzZWxmLnBoYXNlc1siaW5pdGlhbCJdCgogICAgICAgIHNlbGYubGFzdFBoYXNlID0gTm9uZQoKICAgICAgICBzZWxmLmJlZm9yZVJDRGF0YVBoYXNlID0gTm9uZQoKICAgICAgICBzZWxmLmZyYW1lc2V0T0sgPSBUcnVlCgogICAgQHByb3BlcnR5CiAgICBkZWYgZG9jdW1lbnRFbmNvZGluZyhzZWxmKToKICAgICAgICAiIiJUaGUgbmFtZSBvZiB0aGUgY2hhcmFjdGVyIGVuY29kaW5nCiAgICAgICAgdGhhdCB3YXMgdXNlZCB0byBkZWNvZGUgdGhlIGlucHV0IHN0cmVhbSwKICAgICAgICBvciA6b2JqOmBOb25lYCBpZiB0aGF0IGlzIG5vdCBkZXRlcm1pbmVkIHlldC4KCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IGhhc2F0dHIoc2VsZiwgJ3Rva2VuaXplcicpOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHJldHVybiBzZWxmLnRva2VuaXplci5zdHJlYW0uY2hhckVuY29kaW5nWzBdLm5hbWUKCiAgICBkZWYgaXNIVE1MSW50ZWdyYXRpb25Qb2ludChzZWxmLCBlbGVtZW50KToKICAgICAgICBpZiAoZWxlbWVudC5uYW1lID09ICJhbm5vdGF0aW9uLXhtbCIgYW5kCiAgICAgICAgICAgICAgICBlbGVtZW50Lm5hbWVzcGFjZSA9PSBuYW1lc3BhY2VzWyJtYXRobWwiXSk6CiAgICAgICAgICAgIHJldHVybiAoImVuY29kaW5nIiBpbiBlbGVtZW50LmF0dHJpYnV0ZXMgYW5kCiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5hdHRyaWJ1dGVzWyJlbmNvZGluZyJdLnRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgYXNjaWlVcHBlcjJMb3dlcikgaW4KICAgICAgICAgICAgICAgICAgICAoInRleHQvaHRtbCIsICJhcHBsaWNhdGlvbi94aHRtbCt4bWwiKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gKGVsZW1lbnQubmFtZXNwYWNlLCBlbGVtZW50Lm5hbWUpIGluIGh0bWxJbnRlZ3JhdGlvblBvaW50RWxlbWVudHMKCiAgICBkZWYgaXNNYXRoTUxUZXh0SW50ZWdyYXRpb25Qb2ludChzZWxmLCBlbGVtZW50KToKICAgICAgICByZXR1cm4gKGVsZW1lbnQubmFtZXNwYWNlLCBlbGVtZW50Lm5hbWUpIGluIG1hdGhtbFRleHRJbnRlZ3JhdGlvblBvaW50RWxlbWVudHMKCiAgICBkZWYgbWFpbkxvb3Aoc2VsZik6CiAgICAgICAgQ2hhcmFjdGVyc1Rva2VuID0gdG9rZW5UeXBlc1siQ2hhcmFjdGVycyJdCiAgICAgICAgU3BhY2VDaGFyYWN0ZXJzVG9rZW4gPSB0b2tlblR5cGVzWyJTcGFjZUNoYXJhY3RlcnMiXQogICAgICAgIFN0YXJ0VGFnVG9rZW4gPSB0b2tlblR5cGVzWyJTdGFydFRhZyJdCiAgICAgICAgRW5kVGFnVG9rZW4gPSB0b2tlblR5cGVzWyJFbmRUYWciXQogICAgICAgIENvbW1lbnRUb2tlbiA9IHRva2VuVHlwZXNbIkNvbW1lbnQiXQogICAgICAgIERvY3R5cGVUb2tlbiA9IHRva2VuVHlwZXNbIkRvY3R5cGUiXQogICAgICAgIFBhcnNlRXJyb3JUb2tlbiA9IHRva2VuVHlwZXNbIlBhcnNlRXJyb3IiXQoKICAgICAgICBmb3IgdG9rZW4gaW4gc2VsZi5ub3JtYWxpemVkVG9rZW5zKCk6CiAgICAgICAgICAgIHByZXZfdG9rZW4gPSBOb25lCiAgICAgICAgICAgIG5ld190b2tlbiA9IHRva2VuCiAgICAgICAgICAgIHdoaWxlIG5ld190b2tlbiBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHByZXZfdG9rZW4gPSBuZXdfdG9rZW4KICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlID0gc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0gaWYgc2VsZi50cmVlLm9wZW5FbGVtZW50cyBlbHNlIE5vbmUKICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlTmFtZXNwYWNlID0gY3VycmVudE5vZGUubmFtZXNwYWNlIGlmIGN1cnJlbnROb2RlIGVsc2UgTm9uZQogICAgICAgICAgICAgICAgY3VycmVudE5vZGVOYW1lID0gY3VycmVudE5vZGUubmFtZSBpZiBjdXJyZW50Tm9kZSBlbHNlIE5vbmUKCiAgICAgICAgICAgICAgICB0eXBlID0gbmV3X3Rva2VuWyJ0eXBlIl0KCiAgICAgICAgICAgICAgICBpZiB0eXBlID09IFBhcnNlRXJyb3JUb2tlbjoKICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlRXJyb3IobmV3X3Rva2VuWyJkYXRhIl0sIG5ld190b2tlbi5nZXQoImRhdGF2YXJzIiwge30pKQogICAgICAgICAgICAgICAgICAgIG5ld190b2tlbiA9IE5vbmUKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgaWYgKGxlbihzZWxmLnRyZWUub3BlbkVsZW1lbnRzKSA9PSAwIG9yCiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlTmFtZXNwYWNlID09IHNlbGYudHJlZS5kZWZhdWx0TmFtZXNwYWNlIG9yCiAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLmlzTWF0aE1MVGV4dEludGVncmF0aW9uUG9pbnQoY3VycmVudE5vZGUpIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgKCh0eXBlID09IFN0YXJ0VGFnVG9rZW4gYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuWyJuYW1lIl0gbm90IGluIGZyb3plbnNldChbIm1nbHlwaCIsICJtYWxpZ25tYXJrIl0pKSBvcgogICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgaW4gKENoYXJhY3RlcnNUb2tlbiwgU3BhY2VDaGFyYWN0ZXJzVG9rZW4pKSkgb3IKICAgICAgICAgICAgICAgICAgICAgICAgKGN1cnJlbnROb2RlTmFtZXNwYWNlID09IG5hbWVzcGFjZXNbIm1hdGhtbCJdIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGVOYW1lID09ICJhbm5vdGF0aW9uLXhtbCIgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID09IFN0YXJ0VGFnVG9rZW4gYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlblsibmFtZSJdID09ICJzdmciKSBvcgogICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5pc0hUTUxJbnRlZ3JhdGlvblBvaW50KGN1cnJlbnROb2RlKSBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgaW4gKFN0YXJ0VGFnVG9rZW4sIENoYXJhY3RlcnNUb2tlbiwgU3BhY2VDaGFyYWN0ZXJzVG9rZW4pKSk6CiAgICAgICAgICAgICAgICAgICAgICAgIHBoYXNlID0gc2VsZi5waGFzZQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIHBoYXNlID0gc2VsZi5waGFzZXNbImluRm9yZWlnbkNvbnRlbnQiXQoKICAgICAgICAgICAgICAgICAgICBpZiB0eXBlID09IENoYXJhY3RlcnNUb2tlbjoKICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3Rva2VuID0gcGhhc2UucHJvY2Vzc0NoYXJhY3RlcnMobmV3X3Rva2VuKQogICAgICAgICAgICAgICAgICAgIGVsaWYgdHlwZSA9PSBTcGFjZUNoYXJhY3RlcnNUb2tlbjoKICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3Rva2VuID0gcGhhc2UucHJvY2Vzc1NwYWNlQ2hhcmFjdGVycyhuZXdfdG9rZW4pCiAgICAgICAgICAgICAgICAgICAgZWxpZiB0eXBlID09IFN0YXJ0VGFnVG9rZW46CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld190b2tlbiA9IHBoYXNlLnByb2Nlc3NTdGFydFRhZyhuZXdfdG9rZW4pCiAgICAgICAgICAgICAgICAgICAgZWxpZiB0eXBlID09IEVuZFRhZ1Rva2VuOgogICAgICAgICAgICAgICAgICAgICAgICBuZXdfdG9rZW4gPSBwaGFzZS5wcm9jZXNzRW5kVGFnKG5ld190b2tlbikKICAgICAgICAgICAgICAgICAgICBlbGlmIHR5cGUgPT0gQ29tbWVudFRva2VuOgogICAgICAgICAgICAgICAgICAgICAgICBuZXdfdG9rZW4gPSBwaGFzZS5wcm9jZXNzQ29tbWVudChuZXdfdG9rZW4pCiAgICAgICAgICAgICAgICAgICAgZWxpZiB0eXBlID09IERvY3R5cGVUb2tlbjoKICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3Rva2VuID0gcGhhc2UucHJvY2Vzc0RvY3R5cGUobmV3X3Rva2VuKQoKICAgICAgICAgICAgaWYgKHR5cGUgPT0gU3RhcnRUYWdUb2tlbiBhbmQgcHJldl90b2tlblsic2VsZkNsb3NpbmciXSBhbmQKICAgICAgICAgICAgICAgICAgICBub3QgcHJldl90b2tlblsic2VsZkNsb3NpbmdBY2tub3dsZWRnZWQiXSk6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlRXJyb3IoIm5vbi12b2lkLWVsZW1lbnQtd2l0aC10cmFpbGluZy1zb2xpZHVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiBwcmV2X3Rva2VuWyJuYW1lIl19KQoKICAgICAgICAjIFdoZW4gdGhlIGxvb3AgZmluaXNoZXMgaXQncyBFT0YKICAgICAgICByZXByb2Nlc3MgPSBUcnVlCiAgICAgICAgcGhhc2VzID0gW10KICAgICAgICB3aGlsZSByZXByb2Nlc3M6CiAgICAgICAgICAgIHBoYXNlcy5hcHBlbmQoc2VsZi5waGFzZSkKICAgICAgICAgICAgcmVwcm9jZXNzID0gc2VsZi5waGFzZS5wcm9jZXNzRU9GKCkKICAgICAgICAgICAgaWYgcmVwcm9jZXNzOgogICAgICAgICAgICAgICAgYXNzZXJ0IHNlbGYucGhhc2Ugbm90IGluIHBoYXNlcwoKICAgIGRlZiBub3JtYWxpemVkVG9rZW5zKHNlbGYpOgogICAgICAgIGZvciB0b2tlbiBpbiBzZWxmLnRva2VuaXplcjoKICAgICAgICAgICAgeWllbGQgc2VsZi5ub3JtYWxpemVUb2tlbih0b2tlbikKCiAgICBkZWYgcGFyc2Uoc2VsZiwgc3RyZWFtLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICIiIlBhcnNlIGEgSFRNTCBkb2N1bWVudCBpbnRvIGEgd2VsbC1mb3JtZWQgdHJlZQoKICAgICAgICBzdHJlYW0gLSBhIGZpbGVsaWtlIG9iamVjdCBvciBzdHJpbmcgY29udGFpbmluZyB0aGUgSFRNTCB0byBiZSBwYXJzZWQKCiAgICAgICAgVGhlIG9wdGlvbmFsIGVuY29kaW5nIHBhcmFtZXRlciBtdXN0IGJlIGEgc3RyaW5nIHRoYXQgaW5kaWNhdGVzCiAgICAgICAgdGhlIGVuY29kaW5nLiAgSWYgc3BlY2lmaWVkLCB0aGF0IGVuY29kaW5nIHdpbGwgYmUgdXNlZCwKICAgICAgICByZWdhcmRsZXNzIG9mIGFueSBCT00gb3IgbGF0ZXIgZGVjbGFyYXRpb24gKHN1Y2ggYXMgaW4gYSBtZXRhCiAgICAgICAgZWxlbWVudCkKCiAgICAgICAgc2NyaXB0aW5nIC0gdHJlYXQgbm9zY3JpcHQgZWxlbWVudHMgYXMgaWYgamF2YXNjcmlwdCB3YXMgdHVybmVkIG9uCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5fcGFyc2Uoc3RyZWFtLCBGYWxzZSwgTm9uZSwgKmFyZ3MsICoqa3dhcmdzKQogICAgICAgIHJldHVybiBzZWxmLnRyZWUuZ2V0RG9jdW1lbnQoKQoKICAgIGRlZiBwYXJzZUZyYWdtZW50KHNlbGYsIHN0cmVhbSwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAiIiJQYXJzZSBhIEhUTUwgZnJhZ21lbnQgaW50byBhIHdlbGwtZm9ybWVkIHRyZWUgZnJhZ21lbnQKCiAgICAgICAgY29udGFpbmVyIC0gbmFtZSBvZiB0aGUgZWxlbWVudCB3ZSdyZSBzZXR0aW5nIHRoZSBpbm5lckhUTUwgcHJvcGVydHkKICAgICAgICBpZiBzZXQgdG8gTm9uZSwgZGVmYXVsdCB0byAnZGl2JwoKICAgICAgICBzdHJlYW0gLSBhIGZpbGVsaWtlIG9iamVjdCBvciBzdHJpbmcgY29udGFpbmluZyB0aGUgSFRNTCB0byBiZSBwYXJzZWQKCiAgICAgICAgVGhlIG9wdGlvbmFsIGVuY29kaW5nIHBhcmFtZXRlciBtdXN0IGJlIGEgc3RyaW5nIHRoYXQgaW5kaWNhdGVzCiAgICAgICAgdGhlIGVuY29kaW5nLiAgSWYgc3BlY2lmaWVkLCB0aGF0IGVuY29kaW5nIHdpbGwgYmUgdXNlZCwKICAgICAgICByZWdhcmRsZXNzIG9mIGFueSBCT00gb3IgbGF0ZXIgZGVjbGFyYXRpb24gKHN1Y2ggYXMgaW4gYSBtZXRhCiAgICAgICAgZWxlbWVudCkKCiAgICAgICAgc2NyaXB0aW5nIC0gdHJlYXQgbm9zY3JpcHQgZWxlbWVudHMgYXMgaWYgamF2YXNjcmlwdCB3YXMgdHVybmVkIG9uCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5fcGFyc2Uoc3RyZWFtLCBUcnVlLCAqYXJncywgKiprd2FyZ3MpCiAgICAgICAgcmV0dXJuIHNlbGYudHJlZS5nZXRGcmFnbWVudCgpCgogICAgZGVmIHBhcnNlRXJyb3Ioc2VsZiwgZXJyb3Jjb2RlPSJYWFgtdW5kZWZpbmVkLWVycm9yIiwgZGF0YXZhcnM9Tm9uZSk6CiAgICAgICAgIyBYWFggVGhlIGlkZWEgaXMgdG8gbWFrZSBlcnJvcmNvZGUgbWFuZGF0b3J5LgogICAgICAgIGlmIGRhdGF2YXJzIGlzIE5vbmU6CiAgICAgICAgICAgIGRhdGF2YXJzID0ge30KICAgICAgICBzZWxmLmVycm9ycy5hcHBlbmQoKHNlbGYudG9rZW5pemVyLnN0cmVhbS5wb3NpdGlvbigpLCBlcnJvcmNvZGUsIGRhdGF2YXJzKSkKICAgICAgICBpZiBzZWxmLnN0cmljdDoKICAgICAgICAgICAgcmFpc2UgUGFyc2VFcnJvcihFW2Vycm9yY29kZV0gJSBkYXRhdmFycykKCiAgICBkZWYgbm9ybWFsaXplVG9rZW4oc2VsZiwgdG9rZW4pOgogICAgICAgICIiIiBIVE1MNSBzcGVjaWZpYyBub3JtYWxpemF0aW9ucyB0byB0aGUgdG9rZW4gc3RyZWFtICIiIgoKICAgICAgICBpZiB0b2tlblsidHlwZSJdID09IHRva2VuVHlwZXNbIlN0YXJ0VGFnIl06CiAgICAgICAgICAgIHJhdyA9IHRva2VuWyJkYXRhIl0KICAgICAgICAgICAgdG9rZW5bImRhdGEiXSA9IE9yZGVyZWREaWN0KHJhdykKICAgICAgICAgICAgaWYgbGVuKHJhdykgPiBsZW4odG9rZW5bImRhdGEiXSk6CiAgICAgICAgICAgICAgICAjIHdlIGhhZCBzb21lIGR1cGxpY2F0ZWQgYXR0cmlidXRlLCBmaXggc28gZmlyc3Qgd2lucwogICAgICAgICAgICAgICAgdG9rZW5bImRhdGEiXS51cGRhdGUocmF3Wzo6LTFdKQoKICAgICAgICByZXR1cm4gdG9rZW4KCiAgICBkZWYgYWRqdXN0TWF0aE1MQXR0cmlidXRlcyhzZWxmLCB0b2tlbik6CiAgICAgICAgYWRqdXN0X2F0dHJpYnV0ZXModG9rZW4sIGFkanVzdE1hdGhNTEF0dHJpYnV0ZXMpCgogICAgZGVmIGFkanVzdFNWR0F0dHJpYnV0ZXMoc2VsZiwgdG9rZW4pOgogICAgICAgIGFkanVzdF9hdHRyaWJ1dGVzKHRva2VuLCBhZGp1c3RTVkdBdHRyaWJ1dGVzKQoKICAgIGRlZiBhZGp1c3RGb3JlaWduQXR0cmlidXRlcyhzZWxmLCB0b2tlbik6CiAgICAgICAgYWRqdXN0X2F0dHJpYnV0ZXModG9rZW4sIGFkanVzdEZvcmVpZ25BdHRyaWJ1dGVzTWFwKQoKICAgIGRlZiByZXBhcnNlVG9rZW5Ob3JtYWwoc2VsZiwgdG9rZW4pOgogICAgICAgICMgcHlsaW50OmRpc2FibGU9dW51c2VkLWFyZ3VtZW50CiAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UoKQoKICAgIGRlZiByZXNldEluc2VydGlvbk1vZGUoc2VsZik6CiAgICAgICAgIyBUaGUgbmFtZSBvZiB0aGlzIG1ldGhvZCBpcyBtb3N0bHkgaGlzdG9yaWNhbC4gKEl0J3MgYWxzbyB1c2VkIGluIHRoZQogICAgICAgICMgc3BlY2lmaWNhdGlvbi4pCiAgICAgICAgbGFzdCA9IEZhbHNlCiAgICAgICAgbmV3TW9kZXMgPSB7CiAgICAgICAgICAgICJzZWxlY3QiOiAiaW5TZWxlY3QiLAogICAgICAgICAgICAidGQiOiAiaW5DZWxsIiwKICAgICAgICAgICAgInRoIjogImluQ2VsbCIsCiAgICAgICAgICAgICJ0ciI6ICJpblJvdyIsCiAgICAgICAgICAgICJ0Ym9keSI6ICJpblRhYmxlQm9keSIsCiAgICAgICAgICAgICJ0aGVhZCI6ICJpblRhYmxlQm9keSIsCiAgICAgICAgICAgICJ0Zm9vdCI6ICJpblRhYmxlQm9keSIsCiAgICAgICAgICAgICJjYXB0aW9uIjogImluQ2FwdGlvbiIsCiAgICAgICAgICAgICJjb2xncm91cCI6ICJpbkNvbHVtbkdyb3VwIiwKICAgICAgICAgICAgInRhYmxlIjogImluVGFibGUiLAogICAgICAgICAgICAiaGVhZCI6ICJpbkJvZHkiLAogICAgICAgICAgICAiYm9keSI6ICJpbkJvZHkiLAogICAgICAgICAgICAiZnJhbWVzZXQiOiAiaW5GcmFtZXNldCIsCiAgICAgICAgICAgICJodG1sIjogImJlZm9yZUhlYWQiCiAgICAgICAgfQogICAgICAgIGZvciBub2RlIGluIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbOjotMV06CiAgICAgICAgICAgIG5vZGVOYW1lID0gbm9kZS5uYW1lCiAgICAgICAgICAgIG5ld19waGFzZSA9IE5vbmUKICAgICAgICAgICAgaWYgbm9kZSA9PSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWzBdOgogICAgICAgICAgICAgICAgYXNzZXJ0IHNlbGYuaW5uZXJIVE1MCiAgICAgICAgICAgICAgICBsYXN0ID0gVHJ1ZQogICAgICAgICAgICAgICAgbm9kZU5hbWUgPSBzZWxmLmlubmVySFRNTAogICAgICAgICAgICAjIENoZWNrIGZvciBjb25kaXRpb25zIHRoYXQgc2hvdWxkIG9ubHkgaGFwcGVuIGluIHRoZSBpbm5lckhUTUwKICAgICAgICAgICAgIyBjYXNlCiAgICAgICAgICAgIGlmIG5vZGVOYW1lIGluICgic2VsZWN0IiwgImNvbGdyb3VwIiwgImhlYWQiLCAiaHRtbCIpOgogICAgICAgICAgICAgICAgYXNzZXJ0IHNlbGYuaW5uZXJIVE1MCgogICAgICAgICAgICBpZiBub3QgbGFzdCBhbmQgbm9kZS5uYW1lc3BhY2UgIT0gc2VsZi50cmVlLmRlZmF1bHROYW1lc3BhY2U6CiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgaWYgbm9kZU5hbWUgaW4gbmV3TW9kZXM6CiAgICAgICAgICAgICAgICBuZXdfcGhhc2UgPSBzZWxmLnBoYXNlc1tuZXdNb2Rlc1tub2RlTmFtZV1dCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBlbGlmIGxhc3Q6CiAgICAgICAgICAgICAgICBuZXdfcGhhc2UgPSBzZWxmLnBoYXNlc1siaW5Cb2R5Il0KICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgIHNlbGYucGhhc2UgPSBuZXdfcGhhc2UKCiAgICBkZWYgcGFyc2VSQ0RhdGFSYXd0ZXh0KHNlbGYsIHRva2VuLCBjb250ZW50VHlwZSk6CiAgICAgICAgIiIiR2VuZXJpYyBSQ0RBVEEvUkFXVEVYVCBQYXJzaW5nIGFsZ29yaXRobQogICAgICAgIGNvbnRlbnRUeXBlIC0gUkNEQVRBIG9yIFJBV1RFWFQKICAgICAgICAiIiIKICAgICAgICBhc3NlcnQgY29udGVudFR5cGUgaW4gKCJSQVdURVhUIiwgIlJDREFUQSIpCgogICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQoKICAgICAgICBpZiBjb250ZW50VHlwZSA9PSAiUkFXVEVYVCI6CiAgICAgICAgICAgIHNlbGYudG9rZW5pemVyLnN0YXRlID0gc2VsZi50b2tlbml6ZXIucmF3dGV4dFN0YXRlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi50b2tlbml6ZXIuc3RhdGUgPSBzZWxmLnRva2VuaXplci5yY2RhdGFTdGF0ZQoKICAgICAgICBzZWxmLm9yaWdpbmFsUGhhc2UgPSBzZWxmLnBoYXNlCgogICAgICAgIHNlbGYucGhhc2UgPSBzZWxmLnBoYXNlc1sidGV4dCJdCgoKQF91dGlscy5tZW1vaXplCmRlZiBnZXRQaGFzZXMoZGVidWcpOgogICAgZGVmIGxvZyhmdW5jdGlvbik6CiAgICAgICAgIiIiTG9nZ2VyIHRoYXQgcmVjb3JkcyB3aGljaCBwaGFzZSBwcm9jZXNzZXMgZWFjaCB0b2tlbiIiIgogICAgICAgIHR5cGVfbmFtZXMgPSBkaWN0KCh2YWx1ZSwga2V5KSBmb3Iga2V5LCB2YWx1ZSBpbgogICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuVHlwZXMuaXRlbXMoKSkKCiAgICAgICAgZGVmIHdyYXBwZWQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAgICAgaWYgZnVuY3Rpb24uX19uYW1lX18uc3RhcnRzd2l0aCgicHJvY2VzcyIpIGFuZCBsZW4oYXJncykgPiAwOgogICAgICAgICAgICAgICAgdG9rZW4gPSBhcmdzWzBdCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgaW5mbyA9IHsidHlwZSI6IHR5cGVfbmFtZXNbdG9rZW5bJ3R5cGUnXV19CiAgICAgICAgICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgICAgIGlmIHRva2VuWyd0eXBlJ10gaW4gdGFnVG9rZW5UeXBlczoKICAgICAgICAgICAgICAgICAgICBpbmZvWyJuYW1lIl0gPSB0b2tlblsnbmFtZSddCgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIubG9nLmFwcGVuZCgoc2VsZi5wYXJzZXIudG9rZW5pemVyLnN0YXRlLl9fbmFtZV9fLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UuX19jbGFzc19fLl9fbmFtZV9fLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18uX19uYW1lX18sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbi5fX25hbWVfXywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8pKQogICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHNlbGYsICphcmdzLCAqKmt3YXJncykKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihzZWxmLCAqYXJncywgKiprd2FyZ3MpCiAgICAgICAgcmV0dXJuIHdyYXBwZWQKCiAgICBkZWYgZ2V0TWV0YWNsYXNzKHVzZV9tZXRhY2xhc3MsIG1ldGFjbGFzc19mdW5jKToKICAgICAgICBpZiB1c2VfbWV0YWNsYXNzOgogICAgICAgICAgICByZXR1cm4gbWV0aG9kX2RlY29yYXRvcl9tZXRhY2xhc3MobWV0YWNsYXNzX2Z1bmMpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHR5cGUKCiAgICAjIHB5bGludDpkaXNhYmxlPXVudXNlZC1hcmd1bWVudAogICAgY2xhc3MgUGhhc2Uod2l0aF9tZXRhY2xhc3MoZ2V0TWV0YWNsYXNzKGRlYnVnLCBsb2cpKSk6CiAgICAgICAgIiIiQmFzZSBjbGFzcyBmb3IgaGVscGVyIG9iamVjdCB0aGF0IGltcGxlbWVudHMgZWFjaCBwaGFzZSBvZiBwcm9jZXNzaW5nCiAgICAgICAgIiIiCgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpOgogICAgICAgICAgICBzZWxmLnBhcnNlciA9IHBhcnNlcgogICAgICAgICAgICBzZWxmLnRyZWUgPSB0cmVlCgogICAgICAgIGRlZiBwcm9jZXNzRU9GKHNlbGYpOgogICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCgogICAgICAgIGRlZiBwcm9jZXNzQ29tbWVudChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgICMgRm9yIG1vc3QgcGhhc2VzIHRoZSBmb2xsb3dpbmcgaXMgY29ycmVjdC4gV2hlcmUgaXQncyBub3QgaXQgd2lsbCBiZQogICAgICAgICAgICAjIG92ZXJyaWRkZW4uCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRDb21tZW50KHRva2VuLCBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXSkKCiAgICAgICAgZGVmIHByb2Nlc3NEb2N0eXBlKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1kb2N0eXBlIikKCiAgICAgICAgZGVmIHByb2Nlc3NDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydFRleHQodG9rZW5bImRhdGEiXSkKCiAgICAgICAgZGVmIHByb2Nlc3NTcGFjZUNoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0VGV4dCh0b2tlblsiZGF0YSJdKQoKICAgICAgICBkZWYgcHJvY2Vzc1N0YXJ0VGFnKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuc3RhcnRUYWdIYW5kbGVyW3Rva2VuWyJuYW1lIl1dKHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdIdG1sKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgbm90IHNlbGYucGFyc2VyLmZpcnN0U3RhcnRUYWcgYW5kIHRva2VuWyJuYW1lIl0gPT0gImh0bWwiOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigibm9uLWh0bWwtcm9vdCIpCiAgICAgICAgICAgICMgWFhYIE5lZWQgYSBjaGVjayBoZXJlIHRvIHNlZSBpZiB0aGUgZmlyc3Qgc3RhcnQgdGFnIHRva2VuIGVtaXR0ZWQgaXMKICAgICAgICAgICAgIyB0aGlzIHRva2VuLi4uIElmIGl0J3Mgbm90LCBpbnZva2Ugc2VsZi5wYXJzZXIucGFyc2VFcnJvcigpLgogICAgICAgICAgICBmb3IgYXR0ciwgdmFsdWUgaW4gdG9rZW5bImRhdGEiXS5pdGVtcygpOgogICAgICAgICAgICAgICAgaWYgYXR0ciBub3QgaW4gc2VsZi50cmVlLm9wZW5FbGVtZW50c1swXS5hdHRyaWJ1dGVzOgogICAgICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbMF0uYXR0cmlidXRlc1thdHRyXSA9IHZhbHVlCiAgICAgICAgICAgIHNlbGYucGFyc2VyLmZpcnN0U3RhcnRUYWcgPSBGYWxzZQoKICAgICAgICBkZWYgcHJvY2Vzc0VuZFRhZyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmVuZFRhZ0hhbmRsZXJbdG9rZW5bIm5hbWUiXV0odG9rZW4pCgogICAgY2xhc3MgSW5pdGlhbFBoYXNlKFBoYXNlKToKICAgICAgICBkZWYgcHJvY2Vzc1NwYWNlQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgZGVmIHByb2Nlc3NDb21tZW50KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydENvbW1lbnQodG9rZW4sIHNlbGYudHJlZS5kb2N1bWVudCkKCiAgICAgICAgZGVmIHByb2Nlc3NEb2N0eXBlKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgbmFtZSA9IHRva2VuWyJuYW1lIl0KICAgICAgICAgICAgcHVibGljSWQgPSB0b2tlblsicHVibGljSWQiXQogICAgICAgICAgICBzeXN0ZW1JZCA9IHRva2VuWyJzeXN0ZW1JZCJdCiAgICAgICAgICAgIGNvcnJlY3QgPSB0b2tlblsiY29ycmVjdCJdCgogICAgICAgICAgICBpZiAobmFtZSAhPSAiaHRtbCIgb3IgcHVibGljSWQgaXMgbm90IE5vbmUgb3IKICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCBpcyBub3QgTm9uZSBhbmQgc3lzdGVtSWQgIT0gImFib3V0OmxlZ2FjeS1jb21wYXQiKToKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVua25vd24tZG9jdHlwZSIpCgogICAgICAgICAgICBpZiBwdWJsaWNJZCBpcyBOb25lOgogICAgICAgICAgICAgICAgcHVibGljSWQgPSAiIgoKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydERvY3R5cGUodG9rZW4pCgogICAgICAgICAgICBpZiBwdWJsaWNJZCAhPSAiIjoKICAgICAgICAgICAgICAgIHB1YmxpY0lkID0gcHVibGljSWQudHJhbnNsYXRlKGFzY2lpVXBwZXIyTG93ZXIpCgogICAgICAgICAgICBpZiAobm90IGNvcnJlY3Qgb3IgdG9rZW5bIm5hbWUiXSAhPSAiaHRtbCIgb3IKICAgICAgICAgICAgICAgICAgICBwdWJsaWNJZC5zdGFydHN3aXRoKAogICAgICAgICAgICAgICAgICAgICAgICAoIisvL3NpbG1hcmlsLy9kdGQgaHRtbCBwcm8gdjByMTEgMTk5NzAxMDEvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vYWR2YXNvZnQgbHRkLy9kdGQgaHRtbCAzLjAgYXN3ZWRpdCArIGV4dGVuc2lvbnMvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vYXMvL2R0ZCBodG1sIDMuMCBhc3dlZGl0ICsgZXh0ZW5zaW9ucy8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9pZXRmLy9kdGQgaHRtbCAyLjAgbGV2ZWwgMS8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9pZXRmLy9kdGQgaHRtbCAyLjAgbGV2ZWwgMi8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9pZXRmLy9kdGQgaHRtbCAyLjAgc3RyaWN0IGxldmVsIDEvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vaWV0Zi8vZHRkIGh0bWwgMi4wIHN0cmljdCBsZXZlbCAyLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL2lldGYvL2R0ZCBodG1sIDIuMCBzdHJpY3QvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vaWV0Zi8vZHRkIGh0bWwgMi4wLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL2lldGYvL2R0ZCBodG1sIDIuMWUvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vaWV0Zi8vZHRkIGh0bWwgMy4wLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL2lldGYvL2R0ZCBodG1sIDMuMiBmaW5hbC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9pZXRmLy9kdGQgaHRtbCAzLjIvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vaWV0Zi8vZHRkIGh0bWwgMy8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9pZXRmLy9kdGQgaHRtbCBsZXZlbCAwLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL2lldGYvL2R0ZCBodG1sIGxldmVsIDEvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vaWV0Zi8vZHRkIGh0bWwgbGV2ZWwgMi8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9pZXRmLy9kdGQgaHRtbCBsZXZlbCAzLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL2lldGYvL2R0ZCBodG1sIHN0cmljdCBsZXZlbCAwLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL2lldGYvL2R0ZCBodG1sIHN0cmljdCBsZXZlbCAxLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL2lldGYvL2R0ZCBodG1sIHN0cmljdCBsZXZlbCAyLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL2lldGYvL2R0ZCBodG1sIHN0cmljdCBsZXZlbCAzLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL2lldGYvL2R0ZCBodG1sIHN0cmljdC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9pZXRmLy9kdGQgaHRtbC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9tZXRyaXVzLy9kdGQgbWV0cml1cyBwcmVzZW50YXRpb25hbC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9taWNyb3NvZnQvL2R0ZCBpbnRlcm5ldCBleHBsb3JlciAyLjAgaHRtbCBzdHJpY3QvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vbWljcm9zb2Z0Ly9kdGQgaW50ZXJuZXQgZXhwbG9yZXIgMi4wIGh0bWwvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vbWljcm9zb2Z0Ly9kdGQgaW50ZXJuZXQgZXhwbG9yZXIgMi4wIHRhYmxlcy8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9taWNyb3NvZnQvL2R0ZCBpbnRlcm5ldCBleHBsb3JlciAzLjAgaHRtbCBzdHJpY3QvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vbWljcm9zb2Z0Ly9kdGQgaW50ZXJuZXQgZXhwbG9yZXIgMy4wIGh0bWwvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vbWljcm9zb2Z0Ly9kdGQgaW50ZXJuZXQgZXhwbG9yZXIgMy4wIHRhYmxlcy8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9uZXRzY2FwZSBjb21tLiBjb3JwLi8vZHRkIGh0bWwvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vbmV0c2NhcGUgY29tbS4gY29ycC4vL2R0ZCBzdHJpY3QgaHRtbC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9vJ3JlaWxseSBhbmQgYXNzb2NpYXRlcy8vZHRkIGh0bWwgMi4wLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL28ncmVpbGx5IGFuZCBhc3NvY2lhdGVzLy9kdGQgaHRtbCBleHRlbmRlZCAxLjAvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vbydyZWlsbHkgYW5kIGFzc29jaWF0ZXMvL2R0ZCBodG1sIGV4dGVuZGVkIHJlbGF4ZWQgMS4wLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL3NvZnRxdWFkIHNvZnR3YXJlLy9kdGQgaG90bWV0YWwgcHJvIDYuMDo6MTk5OTA2MDE6OmV4dGVuc2lvbnMgdG8gaHRtbCA0LjAvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vc29mdHF1YWQvL2R0ZCBob3RtZXRhbCBwcm8gNC4wOjoxOTk3MTAxMDo6ZXh0ZW5zaW9ucyB0byBodG1sIDQuMC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy9zcHlnbGFzcy8vZHRkIGh0bWwgMi4wIGV4dGVuZGVkLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL3NxLy9kdGQgaHRtbCAyLjAgaG90bWV0YWwgKyBleHRlbnNpb25zLy8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL3N1biBtaWNyb3N5c3RlbXMgY29ycC4vL2R0ZCBob3RqYXZhIGh0bWwvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vc3VuIG1pY3Jvc3lzdGVtcyBjb3JwLi8vZHRkIGhvdGphdmEgc3RyaWN0IGh0bWwvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vdzNjLy9kdGQgaHRtbCAzIDE5OTUtMDMtMjQvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vdzNjLy9kdGQgaHRtbCAzLjIgZHJhZnQvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vdzNjLy9kdGQgaHRtbCAzLjIgZmluYWwvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vdzNjLy9kdGQgaHRtbCAzLjIvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vdzNjLy9kdGQgaHRtbCAzLjJzIGRyYWZ0Ly8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL3czYy8vZHRkIGh0bWwgNC4wIGZyYW1lc2V0Ly8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy93M2MvL2R0ZCBodG1sIGV4cGVyaW1lbnRhbCAxOTk2MDcxMi8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy93M2MvL2R0ZCBodG1sIGV4cGVyaW1lbnRhbCA5NzA0MjEvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vdzNjLy9kdGQgdzMgaHRtbC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy93M28vL2R0ZCB3MyBodG1sIDMuMC8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICItLy93ZWJ0ZWNocy8vZHRkIG1vemlsbGEgaHRtbCAyLjAvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vd2VidGVjaHMvL2R0ZCBtb3ppbGxhIGh0bWwvLyIpKSBvcgogICAgICAgICAgICAgICAgICAgIHB1YmxpY0lkIGluICgiLS8vdzNvLy9kdGQgdzMgaHRtbCBzdHJpY3QgMy4wLy9lbi8vIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0vdzNjL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvZW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHRtbCIpIG9yCiAgICAgICAgICAgICAgICAgICAgcHVibGljSWQuc3RhcnRzd2l0aCgKICAgICAgICAgICAgICAgICAgICAgICAgKCItLy93M2MvL2R0ZCBodG1sIDQuMDEgZnJhbWVzZXQvLyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiLS8vdzNjLy9kdGQgaHRtbCA0LjAxIHRyYW5zaXRpb25hbC8vIikpIGFuZAogICAgICAgICAgICAgICAgICAgIHN5c3RlbUlkIGlzIE5vbmUgb3IKICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCBhbmQgc3lzdGVtSWQubG93ZXIoKSA9PSAiaHR0cDovL3d3dy5pYm0uY29tL2RhdGEvZHRkL3YxMS9pYm14aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCIpOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIuY29tcGF0TW9kZSA9ICJxdWlya3MiCiAgICAgICAgICAgIGVsaWYgKHB1YmxpY0lkLnN0YXJ0c3dpdGgoCiAgICAgICAgICAgICAgICAgICAgKCItLy93M2MvL2R0ZCB4aHRtbCAxLjAgZnJhbWVzZXQvLyIsCiAgICAgICAgICAgICAgICAgICAgICItLy93M2MvL2R0ZCB4aHRtbCAxLjAgdHJhbnNpdGlvbmFsLy8iKSkgb3IKICAgICAgICAgICAgICAgICAgcHVibGljSWQuc3RhcnRzd2l0aCgKICAgICAgICAgICAgICAgICAgICAgICgiLS8vdzNjLy9kdGQgaHRtbCA0LjAxIGZyYW1lc2V0Ly8iLAogICAgICAgICAgICAgICAgICAgICAgICItLy93M2MvL2R0ZCBodG1sIDQuMDEgdHJhbnNpdGlvbmFsLy8iKSkgYW5kCiAgICAgICAgICAgICAgICAgIHN5c3RlbUlkIGlzIG5vdCBOb25lKToKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLmNvbXBhdE1vZGUgPSAibGltaXRlZCBxdWlya3MiCgogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siYmVmb3JlSHRtbCJdCgogICAgICAgIGRlZiBhbnl0aGluZ0Vsc2Uoc2VsZik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLmNvbXBhdE1vZGUgPSAicXVpcmtzIgogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siYmVmb3JlSHRtbCJdCgogICAgICAgIGRlZiBwcm9jZXNzQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoImV4cGVjdGVkLWRvY3R5cGUtYnV0LWdvdC1jaGFycyIpCiAgICAgICAgICAgIHNlbGYuYW55dGhpbmdFbHNlKCkKICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBwcm9jZXNzU3RhcnRUYWcoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJleHBlY3RlZC1kb2N0eXBlLWJ1dC1nb3Qtc3RhcnQtdGFnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKICAgICAgICAgICAgc2VsZi5hbnl0aGluZ0Vsc2UoKQogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIHByb2Nlc3NFbmRUYWcoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJleHBlY3RlZC1kb2N0eXBlLWJ1dC1nb3QtZW5kLXRhZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCiAgICAgICAgICAgIHNlbGYuYW55dGhpbmdFbHNlKCkKICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBwcm9jZXNzRU9GKHNlbGYpOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJleHBlY3RlZC1kb2N0eXBlLWJ1dC1nb3QtZW9mIikKICAgICAgICAgICAgc2VsZi5hbnl0aGluZ0Vsc2UoKQogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGNsYXNzIEJlZm9yZUh0bWxQaGFzZShQaGFzZSk6CiAgICAgICAgIyBoZWxwZXIgbWV0aG9kcwogICAgICAgIGRlZiBpbnNlcnRIdG1sRWxlbWVudChzZWxmKToKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydFJvb3QoaW1wbGllZFRhZ1Rva2VuKCJodG1sIiwgIlN0YXJ0VGFnIikpCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJiZWZvcmVIZWFkIl0KCiAgICAgICAgIyBvdGhlcgogICAgICAgIGRlZiBwcm9jZXNzRU9GKHNlbGYpOgogICAgICAgICAgICBzZWxmLmluc2VydEh0bWxFbGVtZW50KCkKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgZGVmIHByb2Nlc3NDb21tZW50KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydENvbW1lbnQodG9rZW4sIHNlbGYudHJlZS5kb2N1bWVudCkKCiAgICAgICAgZGVmIHByb2Nlc3NTcGFjZUNoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBwYXNzCgogICAgICAgIGRlZiBwcm9jZXNzQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYuaW5zZXJ0SHRtbEVsZW1lbnQoKQogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIHByb2Nlc3NTdGFydFRhZyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHRva2VuWyJuYW1lIl0gPT0gImh0bWwiOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIuZmlyc3RTdGFydFRhZyA9IFRydWUKICAgICAgICAgICAgc2VsZi5pbnNlcnRIdG1sRWxlbWVudCgpCiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgcHJvY2Vzc0VuZFRhZyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHRva2VuWyJuYW1lIl0gbm90IGluICgiaGVhZCIsICJib2R5IiwgImh0bWwiLCAiYnIiKToKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtZW5kLXRhZy1iZWZvcmUtaHRtbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5pbnNlcnRIdG1sRWxlbWVudCgpCiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICBjbGFzcyBCZWZvcmVIZWFkUGhhc2UoUGhhc2UpOgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpOgogICAgICAgICAgICBQaGFzZS5fX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpCgogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgiaHRtbCIsIHNlbGYuc3RhcnRUYWdIdG1sKSwKICAgICAgICAgICAgICAgICgiaGVhZCIsIHNlbGYuc3RhcnRUYWdIZWFkKQogICAgICAgICAgICBdKQogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5zdGFydFRhZ090aGVyCgogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoKCJoZWFkIiwgImJvZHkiLCAiaHRtbCIsICJiciIpLCBzZWxmLmVuZFRhZ0ltcGx5SGVhZCkKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLmVuZFRhZ090aGVyCgogICAgICAgIGRlZiBwcm9jZXNzRU9GKHNlbGYpOgogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGVhZChpbXBsaWVkVGFnVG9rZW4oImhlYWQiLCAiU3RhcnRUYWciKSkKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgZGVmIHByb2Nlc3NTcGFjZUNoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBwYXNzCgogICAgICAgIGRlZiBwcm9jZXNzQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIZWFkKGltcGxpZWRUYWdUb2tlbigiaGVhZCIsICJTdGFydFRhZyIpKQogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIHN0YXJ0VGFnSHRtbChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdLnByb2Nlc3NTdGFydFRhZyh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnSGVhZChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQogICAgICAgICAgICBzZWxmLnRyZWUuaGVhZFBvaW50ZXIgPSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siaW5IZWFkIl0KCiAgICAgICAgZGVmIHN0YXJ0VGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGVhZChpbXBsaWVkVGFnVG9rZW4oImhlYWQiLCAiU3RhcnRUYWciKSkKICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBlbmRUYWdJbXBseUhlYWQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGVhZChpbXBsaWVkVGFnVG9rZW4oImhlYWQiLCAiU3RhcnRUYWciKSkKICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBlbmRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoImVuZC10YWctYWZ0ZXItaW1wbGllZC1yb290IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKCiAgICBjbGFzcyBJbkhlYWRQaGFzZShQaGFzZSk6CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSk6CiAgICAgICAgICAgIFBoYXNlLl9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSkKCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCJodG1sIiwgc2VsZi5zdGFydFRhZ0h0bWwpLAogICAgICAgICAgICAgICAgKCJ0aXRsZSIsIHNlbGYuc3RhcnRUYWdUaXRsZSksCiAgICAgICAgICAgICAgICAoKCJub2ZyYW1lcyIsICJzdHlsZSIpLCBzZWxmLnN0YXJ0VGFnTm9GcmFtZXNTdHlsZSksCiAgICAgICAgICAgICAgICAoIm5vc2NyaXB0Iiwgc2VsZi5zdGFydFRhZ05vc2NyaXB0KSwKICAgICAgICAgICAgICAgICgic2NyaXB0Iiwgc2VsZi5zdGFydFRhZ1NjcmlwdCksCiAgICAgICAgICAgICAgICAoKCJiYXNlIiwgImJhc2Vmb250IiwgImJnc291bmQiLCAiY29tbWFuZCIsICJsaW5rIiksCiAgICAgICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0Jhc2VMaW5rQ29tbWFuZCksCiAgICAgICAgICAgICAgICAoIm1ldGEiLCBzZWxmLnN0YXJ0VGFnTWV0YSksCiAgICAgICAgICAgICAgICAoImhlYWQiLCBzZWxmLnN0YXJ0VGFnSGVhZCkKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuc3RhcnRUYWdPdGhlcgoKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCJoZWFkIiwgc2VsZi5lbmRUYWdIZWFkKSwKICAgICAgICAgICAgICAgICgoImJyIiwgImh0bWwiLCAiYm9keSIpLCBzZWxmLmVuZFRhZ0h0bWxCb2R5QnIpCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5lbmRUYWdPdGhlcgoKICAgICAgICAjIHRoZSByZWFsIHRoaW5nCiAgICAgICAgZGVmIHByb2Nlc3NFT0Yoc2VsZik6CiAgICAgICAgICAgIHNlbGYuYW55dGhpbmdFbHNlKCkKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgZGVmIHByb2Nlc3NDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5hbnl0aGluZ0Vsc2UoKQogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIHN0YXJ0VGFnSHRtbChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdLnByb2Nlc3NTdGFydFRhZyh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnSGVhZChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInR3by1oZWFkcy1hcmUtbm90LWJldHRlci10aGFuLW9uZSIpCgogICAgICAgIGRlZiBzdGFydFRhZ0Jhc2VMaW5rQ29tbWFuZChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQogICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgIHRva2VuWyJzZWxmQ2xvc2luZ0Fja25vd2xlZGdlZCJdID0gVHJ1ZQoKICAgICAgICBkZWYgc3RhcnRUYWdNZXRhKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgdG9rZW5bInNlbGZDbG9zaW5nQWNrbm93bGVkZ2VkIl0gPSBUcnVlCgogICAgICAgICAgICBhdHRyaWJ1dGVzID0gdG9rZW5bImRhdGEiXQogICAgICAgICAgICBpZiBzZWxmLnBhcnNlci50b2tlbml6ZXIuc3RyZWFtLmNoYXJFbmNvZGluZ1sxXSA9PSAidGVudGF0aXZlIjoKICAgICAgICAgICAgICAgIGlmICJjaGFyc2V0IiBpbiBhdHRyaWJ1dGVzOgogICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnRva2VuaXplci5zdHJlYW0uY2hhbmdlRW5jb2RpbmcoYXR0cmlidXRlc1siY2hhcnNldCJdKQogICAgICAgICAgICAgICAgZWxpZiAoImNvbnRlbnQiIGluIGF0dHJpYnV0ZXMgYW5kCiAgICAgICAgICAgICAgICAgICAgICAiaHR0cC1lcXVpdiIgaW4gYXR0cmlidXRlcyBhbmQKICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNbImh0dHAtZXF1aXYiXS5sb3dlcigpID09ICJjb250ZW50LXR5cGUiKToKICAgICAgICAgICAgICAgICAgICAjIEVuY29kaW5nIGl0IGFzIFVURi04IGhlcmUgaXMgYSBoYWNrLCBhcyByZWFsbHkgd2Ugc2hvdWxkIHBhc3MKICAgICAgICAgICAgICAgICAgICAjIHRoZSBhYnN0cmFjdCBVbmljb2RlIHN0cmluZywgYW5kIGp1c3QgdXNlIHRoZQogICAgICAgICAgICAgICAgICAgICMgQ29udGVudEF0dHJQYXJzZXIgb24gdGhhdCwgYnV0IHVzaW5nIFVURi04IGFsbG93cyBhbGwgY2hhcnMKICAgICAgICAgICAgICAgICAgICAjIHRvIGJlIGVuY29kZWQgYW5kIGFzIGEgQVNDSUktc3VwZXJzZXQgd29ya3MuCiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IF9pbnB1dHN0cmVhbS5FbmNvZGluZ0J5dGVzKGF0dHJpYnV0ZXNbImNvbnRlbnQiXS5lbmNvZGUoInV0Zi04IikpCiAgICAgICAgICAgICAgICAgICAgcGFyc2VyID0gX2lucHV0c3RyZWFtLkNvbnRlbnRBdHRyUGFyc2VyKGRhdGEpCiAgICAgICAgICAgICAgICAgICAgY29kZWMgPSBwYXJzZXIucGFyc2UoKQogICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnRva2VuaXplci5zdHJlYW0uY2hhbmdlRW5jb2RpbmcoY29kZWMpCgogICAgICAgIGRlZiBzdGFydFRhZ1RpdGxlKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VSQ0RhdGFSYXd0ZXh0KHRva2VuLCAiUkNEQVRBIikKCiAgICAgICAgZGVmIHN0YXJ0VGFnTm9GcmFtZXNTdHlsZShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgICMgTmVlZCB0byBkZWNpZGUgd2hldGhlciB0byBpbXBsZW1lbnQgdGhlIHNjcmlwdGluZy1kaXNhYmxlZCBjYXNlCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlUkNEYXRhUmF3dGV4dCh0b2tlbiwgIlJBV1RFWFQiKQoKICAgICAgICBkZWYgc3RhcnRUYWdOb3NjcmlwdChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHNlbGYucGFyc2VyLnNjcmlwdGluZzoKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlUkNEYXRhUmF3dGV4dCh0b2tlbiwgIlJBV1RFWFQiKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siaW5IZWFkTm9zY3JpcHQiXQoKICAgICAgICBkZWYgc3RhcnRUYWdTY3JpcHQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgc2VsZi5wYXJzZXIudG9rZW5pemVyLnN0YXRlID0gc2VsZi5wYXJzZXIudG9rZW5pemVyLnNjcmlwdERhdGFTdGF0ZQogICAgICAgICAgICBzZWxmLnBhcnNlci5vcmlnaW5hbFBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2UKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbInRleHQiXQoKICAgICAgICBkZWYgc3RhcnRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYuYW55dGhpbmdFbHNlKCkKICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBlbmRUYWdIZWFkKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgbm9kZSA9IHNlbGYucGFyc2VyLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgIGFzc2VydCBub2RlLm5hbWUgPT0gImhlYWQiLCAiRXhwZWN0ZWQgaGVhZCBnb3QgJXMiICUgbm9kZS5uYW1lCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJhZnRlckhlYWQiXQoKICAgICAgICBkZWYgZW5kVGFnSHRtbEJvZHlCcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYuYW55dGhpbmdFbHNlKCkKICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBlbmRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtZW5kLXRhZyIsIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQoKICAgICAgICBkZWYgYW55dGhpbmdFbHNlKHNlbGYpOgogICAgICAgICAgICBzZWxmLmVuZFRhZ0hlYWQoaW1wbGllZFRhZ1Rva2VuKCJoZWFkIikpCgogICAgY2xhc3MgSW5IZWFkTm9zY3JpcHRQaGFzZShQaGFzZSk6CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSk6CiAgICAgICAgICAgIFBoYXNlLl9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSkKCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCJodG1sIiwgc2VsZi5zdGFydFRhZ0h0bWwpLAogICAgICAgICAgICAgICAgKCgiYmFzZWZvbnQiLCAiYmdzb3VuZCIsICJsaW5rIiwgIm1ldGEiLCAibm9mcmFtZXMiLCAic3R5bGUiKSwgc2VsZi5zdGFydFRhZ0Jhc2VMaW5rQ29tbWFuZCksCiAgICAgICAgICAgICAgICAoKCJoZWFkIiwgIm5vc2NyaXB0IiksIHNlbGYuc3RhcnRUYWdIZWFkTm9zY3JpcHQpLAogICAgICAgICAgICBdKQogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5zdGFydFRhZ090aGVyCgogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoIm5vc2NyaXB0Iiwgc2VsZi5lbmRUYWdOb3NjcmlwdCksCiAgICAgICAgICAgICAgICAoImJyIiwgc2VsZi5lbmRUYWdCciksCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5lbmRUYWdPdGhlcgoKICAgICAgICBkZWYgcHJvY2Vzc0VPRihzZWxmKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigiZW9mLWluLWhlYWQtbm9zY3JpcHQiKQogICAgICAgICAgICBzZWxmLmFueXRoaW5nRWxzZSgpCiAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgICAgIGRlZiBwcm9jZXNzQ29tbWVudChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluSGVhZCJdLnByb2Nlc3NDb21tZW50KHRva2VuKQoKICAgICAgICBkZWYgcHJvY2Vzc0NoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJjaGFyLWluLWhlYWQtbm9zY3JpcHQiKQogICAgICAgICAgICBzZWxmLmFueXRoaW5nRWxzZSgpCiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgcHJvY2Vzc1NwYWNlQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluSGVhZCJdLnByb2Nlc3NTcGFjZUNoYXJhY3RlcnModG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ0h0bWwoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkJvZHkiXS5wcm9jZXNzU3RhcnRUYWcodG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ0Jhc2VMaW5rQ29tbWFuZChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluSGVhZCJdLnByb2Nlc3NTdGFydFRhZyh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnSGVhZE5vc2NyaXB0KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1zdGFydC10YWciLCB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKCiAgICAgICAgZGVmIHN0YXJ0VGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWluaGVhZC1ub3NjcmlwdC10YWciLCB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKICAgICAgICAgICAgc2VsZi5hbnl0aGluZ0Vsc2UoKQogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIGVuZFRhZ05vc2NyaXB0KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgbm9kZSA9IHNlbGYucGFyc2VyLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgIGFzc2VydCBub2RlLm5hbWUgPT0gIm5vc2NyaXB0IiwgIkV4cGVjdGVkIG5vc2NyaXB0IGdvdCAlcyIgJSBub2RlLm5hbWUKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImluSGVhZCJdCgogICAgICAgIGRlZiBlbmRUYWdCcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtaW5oZWFkLW5vc2NyaXB0LXRhZyIsIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQogICAgICAgICAgICBzZWxmLmFueXRoaW5nRWxzZSgpCiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgZW5kVGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWVuZC10YWciLCB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKCiAgICAgICAgZGVmIGFueXRoaW5nRWxzZShzZWxmKToKICAgICAgICAgICAgIyBDYWxsZXIgbXVzdCByYWlzZSBwYXJzZSBlcnJvciBmaXJzdCEKICAgICAgICAgICAgc2VsZi5lbmRUYWdOb3NjcmlwdChpbXBsaWVkVGFnVG9rZW4oIm5vc2NyaXB0IikpCgogICAgY2xhc3MgQWZ0ZXJIZWFkUGhhc2UoUGhhc2UpOgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpOgogICAgICAgICAgICBQaGFzZS5fX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpCgogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgiaHRtbCIsIHNlbGYuc3RhcnRUYWdIdG1sKSwKICAgICAgICAgICAgICAgICgiYm9keSIsIHNlbGYuc3RhcnRUYWdCb2R5KSwKICAgICAgICAgICAgICAgICgiZnJhbWVzZXQiLCBzZWxmLnN0YXJ0VGFnRnJhbWVzZXQpLAogICAgICAgICAgICAgICAgKCgiYmFzZSIsICJiYXNlZm9udCIsICJiZ3NvdW5kIiwgImxpbmsiLCAibWV0YSIsICJub2ZyYW1lcyIsICJzY3JpcHQiLAogICAgICAgICAgICAgICAgICAic3R5bGUiLCAidGl0bGUiKSwKICAgICAgICAgICAgICAgICBzZWxmLnN0YXJ0VGFnRnJvbUhlYWQpLAogICAgICAgICAgICAgICAgKCJoZWFkIiwgc2VsZi5zdGFydFRhZ0hlYWQpCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLnN0YXJ0VGFnT3RoZXIKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWygoImJvZHkiLCAiaHRtbCIsICJiciIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZW5kVGFnSHRtbEJvZHlCcildKQogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuZW5kVGFnT3RoZXIKCiAgICAgICAgZGVmIHByb2Nlc3NFT0Yoc2VsZik6CiAgICAgICAgICAgIHNlbGYuYW55dGhpbmdFbHNlKCkKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgZGVmIHByb2Nlc3NDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5hbnl0aGluZ0Vsc2UoKQogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIHN0YXJ0VGFnSHRtbChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdLnByb2Nlc3NTdGFydFRhZyh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnQm9keShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLmZyYW1lc2V0T0sgPSBGYWxzZQogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdCgogICAgICAgIGRlZiBzdGFydFRhZ0ZyYW1lc2V0KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkZyYW1lc2V0Il0KCiAgICAgICAgZGVmIHN0YXJ0VGFnRnJvbUhlYWQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLXN0YXJ0LXRhZy1vdXQtb2YtbXktaGVhZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCiAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMuYXBwZW5kKHNlbGYudHJlZS5oZWFkUG9pbnRlcikKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2VzWyJpbkhlYWQiXS5wcm9jZXNzU3RhcnRUYWcodG9rZW4pCiAgICAgICAgICAgIGZvciBub2RlIGluIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbOjotMV06CiAgICAgICAgICAgICAgICBpZiBub2RlLm5hbWUgPT0gImhlYWQiOgogICAgICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucmVtb3ZlKG5vZGUpCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgZGVmIHN0YXJ0VGFnSGVhZChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtc3RhcnQtdGFnIiwgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCgogICAgICAgIGRlZiBzdGFydFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5hbnl0aGluZ0Vsc2UoKQogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIGVuZFRhZ0h0bWxCb2R5QnIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLmFueXRoaW5nRWxzZSgpCiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgZW5kVGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWVuZC10YWciLCB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKCiAgICAgICAgZGVmIGFueXRoaW5nRWxzZShzZWxmKToKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQoaW1wbGllZFRhZ1Rva2VuKCJib2R5IiwgIlN0YXJ0VGFnIikpCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkJvZHkiXQogICAgICAgICAgICBzZWxmLnBhcnNlci5mcmFtZXNldE9LID0gVHJ1ZQoKICAgIGNsYXNzIEluQm9keVBoYXNlKFBoYXNlKToKICAgICAgICAjIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvI3BhcnNpbmctbWFpbi1pbmJvZHkKICAgICAgICAjIHRoZSByZWFsbHktcmVhbGx5LXJlYWxseS12ZXJ5IGNyYXp5IG1vZGUKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKToKICAgICAgICAgICAgUGhhc2UuX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKQoKICAgICAgICAgICAgIyBTZXQgdGhpcyB0byB0aGUgZGVmYXVsdCBoYW5kbGVyCiAgICAgICAgICAgIHNlbGYucHJvY2Vzc1NwYWNlQ2hhcmFjdGVycyA9IHNlbGYucHJvY2Vzc1NwYWNlQ2hhcmFjdGVyc05vblByZQoKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoImh0bWwiLCBzZWxmLnN0YXJ0VGFnSHRtbCksCiAgICAgICAgICAgICAgICAoKCJiYXNlIiwgImJhc2Vmb250IiwgImJnc291bmQiLCAiY29tbWFuZCIsICJsaW5rIiwgIm1ldGEiLAogICAgICAgICAgICAgICAgICAic2NyaXB0IiwgInN0eWxlIiwgInRpdGxlIiksCiAgICAgICAgICAgICAgICAgc2VsZi5zdGFydFRhZ1Byb2Nlc3NJbkhlYWQpLAogICAgICAgICAgICAgICAgKCJib2R5Iiwgc2VsZi5zdGFydFRhZ0JvZHkpLAogICAgICAgICAgICAgICAgKCJmcmFtZXNldCIsIHNlbGYuc3RhcnRUYWdGcmFtZXNldCksCiAgICAgICAgICAgICAgICAoKCJhZGRyZXNzIiwgImFydGljbGUiLCAiYXNpZGUiLCAiYmxvY2txdW90ZSIsICJjZW50ZXIiLCAiZGV0YWlscyIsCiAgICAgICAgICAgICAgICAgICJkaXIiLCAiZGl2IiwgImRsIiwgImZpZWxkc2V0IiwgImZpZ2NhcHRpb24iLCAiZmlndXJlIiwKICAgICAgICAgICAgICAgICAgImZvb3RlciIsICJoZWFkZXIiLCAiaGdyb3VwIiwgIm1haW4iLCAibWVudSIsICJuYXYiLCAib2wiLCAicCIsCiAgICAgICAgICAgICAgICAgICJzZWN0aW9uIiwgInN1bW1hcnkiLCAidWwiKSwKICAgICAgICAgICAgICAgICBzZWxmLnN0YXJ0VGFnQ2xvc2VQKSwKICAgICAgICAgICAgICAgIChoZWFkaW5nRWxlbWVudHMsIHNlbGYuc3RhcnRUYWdIZWFkaW5nKSwKICAgICAgICAgICAgICAgICgoInByZSIsICJsaXN0aW5nIiksIHNlbGYuc3RhcnRUYWdQcmVMaXN0aW5nKSwKICAgICAgICAgICAgICAgICgiZm9ybSIsIHNlbGYuc3RhcnRUYWdGb3JtKSwKICAgICAgICAgICAgICAgICgoImxpIiwgImRkIiwgImR0IiksIHNlbGYuc3RhcnRUYWdMaXN0SXRlbSksCiAgICAgICAgICAgICAgICAoInBsYWludGV4dCIsIHNlbGYuc3RhcnRUYWdQbGFpbnRleHQpLAogICAgICAgICAgICAgICAgKCJhIiwgc2VsZi5zdGFydFRhZ0EpLAogICAgICAgICAgICAgICAgKCgiYiIsICJiaWciLCAiY29kZSIsICJlbSIsICJmb250IiwgImkiLCAicyIsICJzbWFsbCIsICJzdHJpa2UiLAogICAgICAgICAgICAgICAgICAic3Ryb25nIiwgInR0IiwgInUiKSwgc2VsZi5zdGFydFRhZ0Zvcm1hdHRpbmcpLAogICAgICAgICAgICAgICAgKCJub2JyIiwgc2VsZi5zdGFydFRhZ05vYnIpLAogICAgICAgICAgICAgICAgKCJidXR0b24iLCBzZWxmLnN0YXJ0VGFnQnV0dG9uKSwKICAgICAgICAgICAgICAgICgoImFwcGxldCIsICJtYXJxdWVlIiwgIm9iamVjdCIpLCBzZWxmLnN0YXJ0VGFnQXBwbGV0TWFycXVlZU9iamVjdCksCiAgICAgICAgICAgICAgICAoInhtcCIsIHNlbGYuc3RhcnRUYWdYbXApLAogICAgICAgICAgICAgICAgKCJ0YWJsZSIsIHNlbGYuc3RhcnRUYWdUYWJsZSksCiAgICAgICAgICAgICAgICAoKCJhcmVhIiwgImJyIiwgImVtYmVkIiwgImltZyIsICJrZXlnZW4iLCAid2JyIiksCiAgICAgICAgICAgICAgICAgc2VsZi5zdGFydFRhZ1ZvaWRGb3JtYXR0aW5nKSwKICAgICAgICAgICAgICAgICgoInBhcmFtIiwgInNvdXJjZSIsICJ0cmFjayIpLCBzZWxmLnN0YXJ0VGFnUGFyYW1Tb3VyY2UpLAogICAgICAgICAgICAgICAgKCJpbnB1dCIsIHNlbGYuc3RhcnRUYWdJbnB1dCksCiAgICAgICAgICAgICAgICAoImhyIiwgc2VsZi5zdGFydFRhZ0hyKSwKICAgICAgICAgICAgICAgICgiaW1hZ2UiLCBzZWxmLnN0YXJ0VGFnSW1hZ2UpLAogICAgICAgICAgICAgICAgKCJpc2luZGV4Iiwgc2VsZi5zdGFydFRhZ0lzSW5kZXgpLAogICAgICAgICAgICAgICAgKCJ0ZXh0YXJlYSIsIHNlbGYuc3RhcnRUYWdUZXh0YXJlYSksCiAgICAgICAgICAgICAgICAoImlmcmFtZSIsIHNlbGYuc3RhcnRUYWdJRnJhbWUpLAogICAgICAgICAgICAgICAgKCJub3NjcmlwdCIsIHNlbGYuc3RhcnRUYWdOb3NjcmlwdCksCiAgICAgICAgICAgICAgICAoKCJub2VtYmVkIiwgIm5vZnJhbWVzIiksIHNlbGYuc3RhcnRUYWdSYXd0ZXh0KSwKICAgICAgICAgICAgICAgICgic2VsZWN0Iiwgc2VsZi5zdGFydFRhZ1NlbGVjdCksCiAgICAgICAgICAgICAgICAoKCJycCIsICJydCIpLCBzZWxmLnN0YXJ0VGFnUnBSdCksCiAgICAgICAgICAgICAgICAoKCJvcHRpb24iLCAib3B0Z3JvdXAiKSwgc2VsZi5zdGFydFRhZ09wdCksCiAgICAgICAgICAgICAgICAoKCJtYXRoIiksIHNlbGYuc3RhcnRUYWdNYXRoKSwKICAgICAgICAgICAgICAgICgoInN2ZyIpLCBzZWxmLnN0YXJ0VGFnU3ZnKSwKICAgICAgICAgICAgICAgICgoImNhcHRpb24iLCAiY29sIiwgImNvbGdyb3VwIiwgImZyYW1lIiwgImhlYWQiLAogICAgICAgICAgICAgICAgICAidGJvZHkiLCAidGQiLCAidGZvb3QiLCAidGgiLCAidGhlYWQiLAogICAgICAgICAgICAgICAgICAidHIiKSwgc2VsZi5zdGFydFRhZ01pc3BsYWNlZCkKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuc3RhcnRUYWdPdGhlcgoKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCJib2R5Iiwgc2VsZi5lbmRUYWdCb2R5KSwKICAgICAgICAgICAgICAgICgiaHRtbCIsIHNlbGYuZW5kVGFnSHRtbCksCiAgICAgICAgICAgICAgICAoKCJhZGRyZXNzIiwgImFydGljbGUiLCAiYXNpZGUiLCAiYmxvY2txdW90ZSIsICJidXR0b24iLCAiY2VudGVyIiwKICAgICAgICAgICAgICAgICAgImRldGFpbHMiLCAiZGlhbG9nIiwgImRpciIsICJkaXYiLCAiZGwiLCAiZmllbGRzZXQiLCAiZmlnY2FwdGlvbiIsICJmaWd1cmUiLAogICAgICAgICAgICAgICAgICAiZm9vdGVyIiwgImhlYWRlciIsICJoZ3JvdXAiLCAibGlzdGluZyIsICJtYWluIiwgIm1lbnUiLCAibmF2IiwgIm9sIiwgInByZSIsCiAgICAgICAgICAgICAgICAgICJzZWN0aW9uIiwgInN1bW1hcnkiLCAidWwiKSwgc2VsZi5lbmRUYWdCbG9jayksCiAgICAgICAgICAgICAgICAoImZvcm0iLCBzZWxmLmVuZFRhZ0Zvcm0pLAogICAgICAgICAgICAgICAgKCJwIiwgc2VsZi5lbmRUYWdQKSwKICAgICAgICAgICAgICAgICgoImRkIiwgImR0IiwgImxpIiksIHNlbGYuZW5kVGFnTGlzdEl0ZW0pLAogICAgICAgICAgICAgICAgKGhlYWRpbmdFbGVtZW50cywgc2VsZi5lbmRUYWdIZWFkaW5nKSwKICAgICAgICAgICAgICAgICgoImEiLCAiYiIsICJiaWciLCAiY29kZSIsICJlbSIsICJmb250IiwgImkiLCAibm9iciIsICJzIiwgInNtYWxsIiwKICAgICAgICAgICAgICAgICAgInN0cmlrZSIsICJzdHJvbmciLCAidHQiLCAidSIpLCBzZWxmLmVuZFRhZ0Zvcm1hdHRpbmcpLAogICAgICAgICAgICAgICAgKCgiYXBwbGV0IiwgIm1hcnF1ZWUiLCAib2JqZWN0IiksIHNlbGYuZW5kVGFnQXBwbGV0TWFycXVlZU9iamVjdCksCiAgICAgICAgICAgICAgICAoImJyIiwgc2VsZi5lbmRUYWdCciksCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5lbmRUYWdPdGhlcgoKICAgICAgICBkZWYgaXNNYXRjaGluZ0Zvcm1hdHRpbmdFbGVtZW50KHNlbGYsIG5vZGUxLCBub2RlMik6CiAgICAgICAgICAgIHJldHVybiAobm9kZTEubmFtZSA9PSBub2RlMi5uYW1lIGFuZAogICAgICAgICAgICAgICAgICAgIG5vZGUxLm5hbWVzcGFjZSA9PSBub2RlMi5uYW1lc3BhY2UgYW5kCiAgICAgICAgICAgICAgICAgICAgbm9kZTEuYXR0cmlidXRlcyA9PSBub2RlMi5hdHRyaWJ1dGVzKQoKICAgICAgICAjIGhlbHBlcgogICAgICAgIGRlZiBhZGRGb3JtYXR0aW5nRWxlbWVudChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQogICAgICAgICAgICBlbGVtZW50ID0gc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0KCiAgICAgICAgICAgIG1hdGNoaW5nRWxlbWVudHMgPSBbXQogICAgICAgICAgICBmb3Igbm9kZSBpbiBzZWxmLnRyZWUuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzWzo6LTFdOgogICAgICAgICAgICAgICAgaWYgbm9kZSBpcyBNYXJrZXI6CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5pc01hdGNoaW5nRm9ybWF0dGluZ0VsZW1lbnQobm9kZSwgZWxlbWVudCk6CiAgICAgICAgICAgICAgICAgICAgbWF0Y2hpbmdFbGVtZW50cy5hcHBlbmQobm9kZSkKCiAgICAgICAgICAgIGFzc2VydCBsZW4obWF0Y2hpbmdFbGVtZW50cykgPD0gMwogICAgICAgICAgICBpZiBsZW4obWF0Y2hpbmdFbGVtZW50cykgPT0gMzoKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMucmVtb3ZlKG1hdGNoaW5nRWxlbWVudHNbLTFdKQogICAgICAgICAgICBzZWxmLnRyZWUuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzLmFwcGVuZChlbGVtZW50KQoKICAgICAgICAjIHRoZSByZWFsIGRlYWwKICAgICAgICBkZWYgcHJvY2Vzc0VPRihzZWxmKToKICAgICAgICAgICAgYWxsb3dlZF9lbGVtZW50cyA9IGZyb3plbnNldCgoImRkIiwgImR0IiwgImxpIiwgInAiLCAidGJvZHkiLCAidGQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGZvb3QiLCAidGgiLCAidGhlYWQiLCAidHIiLCAiYm9keSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodG1sIikpCiAgICAgICAgICAgIGZvciBub2RlIGluIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbOjotMV06CiAgICAgICAgICAgICAgICBpZiBub2RlLm5hbWUgbm90IGluIGFsbG93ZWRfZWxlbWVudHM6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigiZXhwZWN0ZWQtY2xvc2luZy10YWctYnV0LWdvdC1lb2YiKQogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICMgU3RvcCBwYXJzaW5nCgogICAgICAgIGRlZiBwcm9jZXNzU3BhY2VDaGFyYWN0ZXJzRHJvcE5ld2xpbmUoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICAjIFNvbWV0aW1lcyAoc3RhcnQgb2YgPHByZT4sIDxsaXN0aW5nPiwgYW5kIDx0ZXh0YXJlYT4gYmxvY2tzKSB3ZQogICAgICAgICAgICAjIHdhbnQgdG8gZHJvcCBsZWFkaW5nIG5ld2xpbmVzCiAgICAgICAgICAgIGRhdGEgPSB0b2tlblsiZGF0YSJdCiAgICAgICAgICAgIHNlbGYucHJvY2Vzc1NwYWNlQ2hhcmFjdGVycyA9IHNlbGYucHJvY2Vzc1NwYWNlQ2hhcmFjdGVyc05vblByZQogICAgICAgICAgICBpZiAoZGF0YS5zdGFydHN3aXRoKCJcbiIpIGFuZAogICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSBpbiAoInByZSIsICJsaXN0aW5nIiwgInRleHRhcmVhIikgYW5kCiAgICAgICAgICAgICAgICAgICAgbm90IHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLmhhc0NvbnRlbnQoKSk6CiAgICAgICAgICAgICAgICBkYXRhID0gZGF0YVsxOl0KICAgICAgICAgICAgaWYgZGF0YToKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5yZWNvbnN0cnVjdEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpCiAgICAgICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0VGV4dChkYXRhKQoKICAgICAgICBkZWYgcHJvY2Vzc0NoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiB0b2tlblsiZGF0YSJdID09ICJcdTAwMDAiOgogICAgICAgICAgICAgICAgIyBUaGUgdG9rZW5pemVyIHNob3VsZCBhbHdheXMgZW1pdCBudWxsIG9uIGl0cyBvd24KICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBzZWxmLnRyZWUucmVjb25zdHJ1Y3RBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoKQogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0VGV4dCh0b2tlblsiZGF0YSJdKQogICAgICAgICAgICAjIFRoaXMgbXVzdCBiZSBiYWQgZm9yIHBlcmZvcm1hbmNlCiAgICAgICAgICAgIGlmIChzZWxmLnBhcnNlci5mcmFtZXNldE9LIGFuZAogICAgICAgICAgICAgICAgYW55KFtjaGFyIG5vdCBpbiBzcGFjZUNoYXJhY3RlcnMKICAgICAgICAgICAgICAgICAgICAgZm9yIGNoYXIgaW4gdG9rZW5bImRhdGEiXV0pKToKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLmZyYW1lc2V0T0sgPSBGYWxzZQoKICAgICAgICBkZWYgcHJvY2Vzc1NwYWNlQ2hhcmFjdGVyc05vblByZShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYudHJlZS5yZWNvbnN0cnVjdEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRUZXh0KHRva2VuWyJkYXRhIl0pCgogICAgICAgIGRlZiBzdGFydFRhZ1Byb2Nlc3NJbkhlYWQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkhlYWQiXS5wcm9jZXNzU3RhcnRUYWcodG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ0JvZHkoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLXN0YXJ0LXRhZyIsIHsibmFtZSI6ICJib2R5In0pCiAgICAgICAgICAgIGlmIChsZW4oc2VsZi50cmVlLm9wZW5FbGVtZW50cykgPT0gMSBvcgogICAgICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbMV0ubmFtZSAhPSAiYm9keSIpOgogICAgICAgICAgICAgICAgYXNzZXJ0IHNlbGYucGFyc2VyLmlubmVySFRNTAogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIuZnJhbWVzZXRPSyA9IEZhbHNlCiAgICAgICAgICAgICAgICBmb3IgYXR0ciwgdmFsdWUgaW4gdG9rZW5bImRhdGEiXS5pdGVtcygpOgogICAgICAgICAgICAgICAgICAgIGlmIGF0dHIgbm90IGluIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbMV0uYXR0cmlidXRlczoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50c1sxXS5hdHRyaWJ1dGVzW2F0dHJdID0gdmFsdWUKCiAgICAgICAgZGVmIHN0YXJ0VGFnRnJhbWVzZXQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLXN0YXJ0LXRhZyIsIHsibmFtZSI6ICJmcmFtZXNldCJ9KQogICAgICAgICAgICBpZiAobGVuKHNlbGYudHJlZS5vcGVuRWxlbWVudHMpID09IDEgb3Igc2VsZi50cmVlLm9wZW5FbGVtZW50c1sxXS5uYW1lICE9ICJib2R5Iik6CiAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi5wYXJzZXIuaW5uZXJIVE1MCiAgICAgICAgICAgIGVsaWYgbm90IHNlbGYucGFyc2VyLmZyYW1lc2V0T0s6CiAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpZiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWzFdLnBhcmVudDoKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWzFdLnBhcmVudC5yZW1vdmVDaGlsZChzZWxmLnRyZWUub3BlbkVsZW1lbnRzWzFdKQogICAgICAgICAgICAgICAgd2hpbGUgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSAhPSAiaHRtbCI6CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siaW5GcmFtZXNldCJdCgogICAgICAgIGRlZiBzdGFydFRhZ0Nsb3NlUChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgicCIsIHZhcmlhbnQ9ImJ1dHRvbiIpOgogICAgICAgICAgICAgICAgc2VsZi5lbmRUYWdQKGltcGxpZWRUYWdUb2tlbigicCIpKQogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnUHJlTGlzdGluZyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgicCIsIHZhcmlhbnQ9ImJ1dHRvbiIpOgogICAgICAgICAgICAgICAgc2VsZi5lbmRUYWdQKGltcGxpZWRUYWdUb2tlbigicCIpKQogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgc2VsZi5wYXJzZXIuZnJhbWVzZXRPSyA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYucHJvY2Vzc1NwYWNlQ2hhcmFjdGVycyA9IHNlbGYucHJvY2Vzc1NwYWNlQ2hhcmFjdGVyc0Ryb3BOZXdsaW5lCgogICAgICAgIGRlZiBzdGFydFRhZ0Zvcm0oc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiBzZWxmLnRyZWUuZm9ybVBvaW50ZXI6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLXN0YXJ0LXRhZyIsIHsibmFtZSI6ICJmb3JtIn0pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpZiBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoInAiLCB2YXJpYW50PSJidXR0b24iKToKICAgICAgICAgICAgICAgICAgICBzZWxmLmVuZFRhZ1AoaW1wbGllZFRhZ1Rva2VuKCJwIikpCiAgICAgICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5mb3JtUG9pbnRlciA9IHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdCgogICAgICAgIGRlZiBzdGFydFRhZ0xpc3RJdGVtKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIuZnJhbWVzZXRPSyA9IEZhbHNlCgogICAgICAgICAgICBzdG9wTmFtZXNNYXAgPSB7ImxpIjogWyJsaSJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImR0IjogWyJkdCIsICJkZCJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRkIjogWyJkdCIsICJkZCJdfQogICAgICAgICAgICBzdG9wTmFtZXMgPSBzdG9wTmFtZXNNYXBbdG9rZW5bIm5hbWUiXV0KICAgICAgICAgICAgZm9yIG5vZGUgaW4gcmV2ZXJzZWQoc2VsZi50cmVlLm9wZW5FbGVtZW50cyk6CiAgICAgICAgICAgICAgICBpZiBub2RlLm5hbWUgaW4gc3RvcE5hbWVzOgogICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlLnByb2Nlc3NFbmRUYWcoCiAgICAgICAgICAgICAgICAgICAgICAgIGltcGxpZWRUYWdUb2tlbihub2RlLm5hbWUsICJFbmRUYWciKSkKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgaWYgKG5vZGUubmFtZVR1cGxlIGluIHNwZWNpYWxFbGVtZW50cyBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5uYW1lIG5vdCBpbiAoImFkZHJlc3MiLCAiZGl2IiwgInAiKSk6CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgicCIsIHZhcmlhbnQ9ImJ1dHRvbiIpOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UucHJvY2Vzc0VuZFRhZygKICAgICAgICAgICAgICAgICAgICBpbXBsaWVkVGFnVG9rZW4oInAiLCAiRW5kVGFnIikpCgogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnUGxhaW50ZXh0KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJwIiwgdmFyaWFudD0iYnV0dG9uIik6CiAgICAgICAgICAgICAgICBzZWxmLmVuZFRhZ1AoaW1wbGllZFRhZ1Rva2VuKCJwIikpCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQogICAgICAgICAgICBzZWxmLnBhcnNlci50b2tlbml6ZXIuc3RhdGUgPSBzZWxmLnBhcnNlci50b2tlbml6ZXIucGxhaW50ZXh0U3RhdGUKCiAgICAgICAgZGVmIHN0YXJ0VGFnSGVhZGluZyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgicCIsIHZhcmlhbnQ9ImJ1dHRvbiIpOgogICAgICAgICAgICAgICAgc2VsZi5lbmRUYWdQKGltcGxpZWRUYWdUb2tlbigicCIpKQogICAgICAgICAgICBpZiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lIGluIGhlYWRpbmdFbGVtZW50czoKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtc3RhcnQtdGFnIiwgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCiAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdBKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgYWZlQUVsZW1lbnQgPSBzZWxmLnRyZWUuZWxlbWVudEluQWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCJhIikKICAgICAgICAgICAgaWYgYWZlQUVsZW1lbnQ6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLXN0YXJ0LXRhZy1pbXBsaWVzLWVuZC10YWciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7InN0YXJ0TmFtZSI6ICJhIiwgImVuZE5hbWUiOiAiYSJ9KQogICAgICAgICAgICAgICAgc2VsZi5lbmRUYWdGb3JtYXR0aW5nKGltcGxpZWRUYWdUb2tlbigiYSIpKQogICAgICAgICAgICAgICAgaWYgYWZlQUVsZW1lbnQgaW4gc2VsZi50cmVlLm9wZW5FbGVtZW50czoKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnJlbW92ZShhZmVBRWxlbWVudCkKICAgICAgICAgICAgICAgIGlmIGFmZUFFbGVtZW50IGluIHNlbGYudHJlZS5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHM6CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmVlLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cy5yZW1vdmUoYWZlQUVsZW1lbnQpCiAgICAgICAgICAgIHNlbGYudHJlZS5yZWNvbnN0cnVjdEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpCiAgICAgICAgICAgIHNlbGYuYWRkRm9ybWF0dGluZ0VsZW1lbnQodG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ0Zvcm1hdHRpbmcoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnRyZWUucmVjb25zdHJ1Y3RBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoKQogICAgICAgICAgICBzZWxmLmFkZEZvcm1hdHRpbmdFbGVtZW50KHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdOb2JyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi50cmVlLnJlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCkKICAgICAgICAgICAgaWYgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJub2JyIik6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLXN0YXJ0LXRhZy1pbXBsaWVzLWVuZC10YWciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7InN0YXJ0TmFtZSI6ICJub2JyIiwgImVuZE5hbWUiOiAibm9iciJ9KQogICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzRW5kVGFnKGltcGxpZWRUYWdUb2tlbigibm9iciIpKQogICAgICAgICAgICAgICAgIyBYWFggTmVlZCB0ZXN0cyB0aGF0IHRyaWdnZXIgdGhlIGZvbGxvd2luZwogICAgICAgICAgICAgICAgc2VsZi50cmVlLnJlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCkKICAgICAgICAgICAgc2VsZi5hZGRGb3JtYXR0aW5nRWxlbWVudCh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnQnV0dG9uKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJidXR0b24iKToKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtc3RhcnQtdGFnLWltcGxpZXMtZW5kLXRhZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsic3RhcnROYW1lIjogImJ1dHRvbiIsICJlbmROYW1lIjogImJ1dHRvbiJ9KQogICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzRW5kVGFnKGltcGxpZWRUYWdUb2tlbigiYnV0dG9uIikpCiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5yZWNvbnN0cnVjdEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpCiAgICAgICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLmZyYW1lc2V0T0sgPSBGYWxzZQoKICAgICAgICBkZWYgc3RhcnRUYWdBcHBsZXRNYXJxdWVlT2JqZWN0KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi50cmVlLnJlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCkKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgIHNlbGYudHJlZS5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMuYXBwZW5kKE1hcmtlcikKICAgICAgICAgICAgc2VsZi5wYXJzZXIuZnJhbWVzZXRPSyA9IEZhbHNlCgogICAgICAgIGRlZiBzdGFydFRhZ1htcChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgicCIsIHZhcmlhbnQ9ImJ1dHRvbiIpOgogICAgICAgICAgICAgICAgc2VsZi5lbmRUYWdQKGltcGxpZWRUYWdUb2tlbigicCIpKQogICAgICAgICAgICBzZWxmLnRyZWUucmVjb25zdHJ1Y3RBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoKQogICAgICAgICAgICBzZWxmLnBhcnNlci5mcmFtZXNldE9LID0gRmFsc2UKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VSQ0RhdGFSYXd0ZXh0KHRva2VuLCAiUkFXVEVYVCIpCgogICAgICAgIGRlZiBzdGFydFRhZ1RhYmxlKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgc2VsZi5wYXJzZXIuY29tcGF0TW9kZSAhPSAicXVpcmtzIjoKICAgICAgICAgICAgICAgIGlmIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgicCIsIHZhcmlhbnQ9ImJ1dHRvbiIpOgogICAgICAgICAgICAgICAgICAgIHNlbGYucHJvY2Vzc0VuZFRhZyhpbXBsaWVkVGFnVG9rZW4oInAiKSkKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgIHNlbGYucGFyc2VyLmZyYW1lc2V0T0sgPSBGYWxzZQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siaW5UYWJsZSJdCgogICAgICAgIGRlZiBzdGFydFRhZ1ZvaWRGb3JtYXR0aW5nKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi50cmVlLnJlY29uc3RydWN0QWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCkKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgdG9rZW5bInNlbGZDbG9zaW5nQWNrbm93bGVkZ2VkIl0gPSBUcnVlCiAgICAgICAgICAgIHNlbGYucGFyc2VyLmZyYW1lc2V0T0sgPSBGYWxzZQoKICAgICAgICBkZWYgc3RhcnRUYWdJbnB1dChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGZyYW1lc2V0T0sgPSBzZWxmLnBhcnNlci5mcmFtZXNldE9LCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdWb2lkRm9ybWF0dGluZyh0b2tlbikKICAgICAgICAgICAgaWYgKCJ0eXBlIiBpbiB0b2tlblsiZGF0YSJdIGFuZAogICAgICAgICAgICAgICAgICAgIHRva2VuWyJkYXRhIl1bInR5cGUiXS50cmFuc2xhdGUoYXNjaWlVcHBlcjJMb3dlcikgPT0gImhpZGRlbiIpOgogICAgICAgICAgICAgICAgIyBpbnB1dCB0eXBlPWhpZGRlbiBkb2Vzbid0IGNoYW5nZSBmcmFtZXNldE9LCiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5mcmFtZXNldE9LID0gZnJhbWVzZXRPSwoKICAgICAgICBkZWYgc3RhcnRUYWdQYXJhbVNvdXJjZShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQogICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgIHRva2VuWyJzZWxmQ2xvc2luZ0Fja25vd2xlZGdlZCJdID0gVHJ1ZQoKICAgICAgICBkZWYgc3RhcnRUYWdIcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgicCIsIHZhcmlhbnQ9ImJ1dHRvbiIpOgogICAgICAgICAgICAgICAgc2VsZi5lbmRUYWdQKGltcGxpZWRUYWdUb2tlbigicCIpKQogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICB0b2tlblsic2VsZkNsb3NpbmdBY2tub3dsZWRnZWQiXSA9IFRydWUKICAgICAgICAgICAgc2VsZi5wYXJzZXIuZnJhbWVzZXRPSyA9IEZhbHNlCgogICAgICAgIGRlZiBzdGFydFRhZ0ltYWdlKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgIyBObyByZWFsbHkuLi4KICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1zdGFydC10YWctdHJlYXRlZC1hcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJvcmlnaW5hbE5hbWUiOiAiaW1hZ2UiLCAibmV3TmFtZSI6ICJpbWcifSkKICAgICAgICAgICAgc2VsZi5wcm9jZXNzU3RhcnRUYWcoaW1wbGllZFRhZ1Rva2VuKCJpbWciLCAiU3RhcnRUYWciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcz10b2tlblsiZGF0YSJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZkNsb3Npbmc9dG9rZW5bInNlbGZDbG9zaW5nIl0pKQoKICAgICAgICBkZWYgc3RhcnRUYWdJc0luZGV4KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigiZGVwcmVjYXRlZC10YWciLCB7Im5hbWUiOiAiaXNpbmRleCJ9KQogICAgICAgICAgICBpZiBzZWxmLnRyZWUuZm9ybVBvaW50ZXI6CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgZm9ybV9hdHRycyA9IHt9CiAgICAgICAgICAgIGlmICJhY3Rpb24iIGluIHRva2VuWyJkYXRhIl06CiAgICAgICAgICAgICAgICBmb3JtX2F0dHJzWyJhY3Rpb24iXSA9IHRva2VuWyJkYXRhIl1bImFjdGlvbiJdCiAgICAgICAgICAgIHNlbGYucHJvY2Vzc1N0YXJ0VGFnKGltcGxpZWRUYWdUb2tlbigiZm9ybSIsICJTdGFydFRhZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzPWZvcm1fYXR0cnMpKQogICAgICAgICAgICBzZWxmLnByb2Nlc3NTdGFydFRhZyhpbXBsaWVkVGFnVG9rZW4oImhyIiwgIlN0YXJ0VGFnIikpCiAgICAgICAgICAgIHNlbGYucHJvY2Vzc1N0YXJ0VGFnKGltcGxpZWRUYWdUb2tlbigibGFiZWwiLCAiU3RhcnRUYWciKSkKICAgICAgICAgICAgIyBYWFggTG9jYWxpemF0aW9uIC4uLgogICAgICAgICAgICBpZiAicHJvbXB0IiBpbiB0b2tlblsiZGF0YSJdOgogICAgICAgICAgICAgICAgcHJvbXB0ID0gdG9rZW5bImRhdGEiXVsicHJvbXB0Il0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHByb21wdCA9ICJUaGlzIGlzIGEgc2VhcmNoYWJsZSBpbmRleC4gRW50ZXIgc2VhcmNoIGtleXdvcmRzOiAiCiAgICAgICAgICAgIHNlbGYucHJvY2Vzc0NoYXJhY3RlcnMoCiAgICAgICAgICAgICAgICB7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogcHJvbXB0fSkKICAgICAgICAgICAgYXR0cmlidXRlcyA9IHRva2VuWyJkYXRhIl0uY29weSgpCiAgICAgICAgICAgIGlmICJhY3Rpb24iIGluIGF0dHJpYnV0ZXM6CiAgICAgICAgICAgICAgICBkZWwgYXR0cmlidXRlc1siYWN0aW9uIl0KICAgICAgICAgICAgaWYgInByb21wdCIgaW4gYXR0cmlidXRlczoKICAgICAgICAgICAgICAgIGRlbCBhdHRyaWJ1dGVzWyJwcm9tcHQiXQogICAgICAgICAgICBhdHRyaWJ1dGVzWyJuYW1lIl0gPSAiaXNpbmRleCIKICAgICAgICAgICAgc2VsZi5wcm9jZXNzU3RhcnRUYWcoaW1wbGllZFRhZ1Rva2VuKCJpbnB1dCIsICJTdGFydFRhZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzPWF0dHJpYnV0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmQ2xvc2luZz10b2tlblsic2VsZkNsb3NpbmciXSkpCiAgICAgICAgICAgIHNlbGYucHJvY2Vzc0VuZFRhZyhpbXBsaWVkVGFnVG9rZW4oImxhYmVsIikpCiAgICAgICAgICAgIHNlbGYucHJvY2Vzc1N0YXJ0VGFnKGltcGxpZWRUYWdUb2tlbigiaHIiLCAiU3RhcnRUYWciKSkKICAgICAgICAgICAgc2VsZi5wcm9jZXNzRW5kVGFnKGltcGxpZWRUYWdUb2tlbigiZm9ybSIpKQoKICAgICAgICBkZWYgc3RhcnRUYWdUZXh0YXJlYShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQogICAgICAgICAgICBzZWxmLnBhcnNlci50b2tlbml6ZXIuc3RhdGUgPSBzZWxmLnBhcnNlci50b2tlbml6ZXIucmNkYXRhU3RhdGUKICAgICAgICAgICAgc2VsZi5wcm9jZXNzU3BhY2VDaGFyYWN0ZXJzID0gc2VsZi5wcm9jZXNzU3BhY2VDaGFyYWN0ZXJzRHJvcE5ld2xpbmUKICAgICAgICAgICAgc2VsZi5wYXJzZXIuZnJhbWVzZXRPSyA9IEZhbHNlCgogICAgICAgIGRlZiBzdGFydFRhZ0lGcmFtZShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLmZyYW1lc2V0T0sgPSBGYWxzZQogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnUmF3dGV4dCh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnTm9zY3JpcHQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiBzZWxmLnBhcnNlci5zY3JpcHRpbmc6CiAgICAgICAgICAgICAgICBzZWxmLnN0YXJ0VGFnUmF3dGV4dCh0b2tlbikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdPdGhlcih0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnUmF3dGV4dChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgICIiImlmcmFtZSwgbm9lbWJlZCBub2ZyYW1lcywgbm9zY3JpcHQoaWYgc2NyaXB0aW5nIGVuYWJsZWQpIiIiCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlUkNEYXRhUmF3dGV4dCh0b2tlbiwgIlJBV1RFWFQiKQoKICAgICAgICBkZWYgc3RhcnRUYWdPcHQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lID09ICJvcHRpb24iOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UucHJvY2Vzc0VuZFRhZyhpbXBsaWVkVGFnVG9rZW4oIm9wdGlvbiIpKQogICAgICAgICAgICBzZWxmLnRyZWUucmVjb25zdHJ1Y3RBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoKQogICAgICAgICAgICBzZWxmLnBhcnNlci50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ1NlbGVjdChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYudHJlZS5yZWNvbnN0cnVjdEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQogICAgICAgICAgICBzZWxmLnBhcnNlci5mcmFtZXNldE9LID0gRmFsc2UKICAgICAgICAgICAgaWYgc2VsZi5wYXJzZXIucGhhc2UgaW4gKHNlbGYucGFyc2VyLnBoYXNlc1siaW5UYWJsZSJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2VzWyJpbkNhcHRpb24iXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlc1siaW5Db2x1bW5Hcm91cCJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2VzWyJpblRhYmxlQm9keSJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2VzWyJpblJvdyJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2VzWyJpbkNlbGwiXSk6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siaW5TZWxlY3RJblRhYmxlIl0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJpblNlbGVjdCJdCgogICAgICAgIGRlZiBzdGFydFRhZ1JwUnQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoInJ1YnkiKToKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5nZW5lcmF0ZUltcGxpZWRFbmRUYWdzKCkKICAgICAgICAgICAgICAgIGlmIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgIT0gInJ1YnkiOgogICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoKQogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnTWF0aChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYudHJlZS5yZWNvbnN0cnVjdEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpCiAgICAgICAgICAgIHNlbGYucGFyc2VyLmFkanVzdE1hdGhNTEF0dHJpYnV0ZXModG9rZW4pCiAgICAgICAgICAgIHNlbGYucGFyc2VyLmFkanVzdEZvcmVpZ25BdHRyaWJ1dGVzKHRva2VuKQogICAgICAgICAgICB0b2tlblsibmFtZXNwYWNlIl0gPSBuYW1lc3BhY2VzWyJtYXRobWwiXQogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgIyBOZWVkIHRvIGdldCB0aGUgcGFyc2UgZXJyb3IgcmlnaHQgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZSB0b2tlbgogICAgICAgICAgICAjIGhhcyBhIG5hbWVzcGFjZSBub3QgZXF1YWwgdG8gdGhlIHhtbG5zIGF0dHJpYnV0ZQogICAgICAgICAgICBpZiB0b2tlblsic2VsZkNsb3NpbmciXToKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgICAgIHRva2VuWyJzZWxmQ2xvc2luZ0Fja25vd2xlZGdlZCJdID0gVHJ1ZQoKICAgICAgICBkZWYgc3RhcnRUYWdTdmcoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnRyZWUucmVjb25zdHJ1Y3RBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoKQogICAgICAgICAgICBzZWxmLnBhcnNlci5hZGp1c3RTVkdBdHRyaWJ1dGVzKHRva2VuKQogICAgICAgICAgICBzZWxmLnBhcnNlci5hZGp1c3RGb3JlaWduQXR0cmlidXRlcyh0b2tlbikKICAgICAgICAgICAgdG9rZW5bIm5hbWVzcGFjZSJdID0gbmFtZXNwYWNlc1sic3ZnIl0KICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgICMgTmVlZCB0byBnZXQgdGhlIHBhcnNlIGVycm9yIHJpZ2h0IGZvciB0aGUgY2FzZSB3aGVyZSB0aGUgdG9rZW4KICAgICAgICAgICAgIyBoYXMgYSBuYW1lc3BhY2Ugbm90IGVxdWFsIHRvIHRoZSB4bWxucyBhdHRyaWJ1dGUKICAgICAgICAgICAgaWYgdG9rZW5bInNlbGZDbG9zaW5nIl06CiAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgICAgICB0b2tlblsic2VsZkNsb3NpbmdBY2tub3dsZWRnZWQiXSA9IFRydWUKCiAgICAgICAgZGVmIHN0YXJ0VGFnTWlzcGxhY2VkKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgIiIiIEVsZW1lbnRzIHRoYXQgc2hvdWxkIGJlIGNoaWxkcmVuIG9mIG90aGVyIGVsZW1lbnRzIHRoYXQgaGF2ZSBhCiAgICAgICAgICAgIGRpZmZlcmVudCBpbnNlcnRpb24gbW9kZTsgaGVyZSB0aGV5IGFyZSBpZ25vcmVkCiAgICAgICAgICAgICJjYXB0aW9uIiwgImNvbCIsICJjb2xncm91cCIsICJmcmFtZSIsICJmcmFtZXNldCIsICJoZWFkIiwKICAgICAgICAgICAgIm9wdGlvbiIsICJvcHRncm91cCIsICJ0Ym9keSIsICJ0ZCIsICJ0Zm9vdCIsICJ0aCIsICJ0aGVhZCIsCiAgICAgICAgICAgICJ0ciIsICJub3NjcmlwdCIKICAgICAgICAgICAgIiIiCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtc3RhcnQtdGFnLWlnbm9yZWQiLCB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKCiAgICAgICAgZGVmIHN0YXJ0VGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnRyZWUucmVjb25zdHJ1Y3RBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoKQogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKCiAgICAgICAgZGVmIGVuZFRhZ1Aoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiBub3Qgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJwIiwgdmFyaWFudD0iYnV0dG9uIik6CiAgICAgICAgICAgICAgICBzZWxmLnN0YXJ0VGFnQ2xvc2VQKGltcGxpZWRUYWdUb2tlbigicCIsICJTdGFydFRhZyIpKQogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1lbmQtdGFnIiwgeyJuYW1lIjogInAifSkKICAgICAgICAgICAgICAgIHNlbGYuZW5kVGFnUChpbXBsaWVkVGFnVG9rZW4oInAiLCAiRW5kVGFnIikpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLnRyZWUuZ2VuZXJhdGVJbXBsaWVkRW5kVGFncygicCIpCiAgICAgICAgICAgICAgICBpZiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lICE9ICJwIjoKICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWVuZC10YWciLCB7Im5hbWUiOiAicCJ9KQogICAgICAgICAgICAgICAgbm9kZSA9IHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgICAgIHdoaWxlIG5vZGUubmFtZSAhPSAicCI6CiAgICAgICAgICAgICAgICAgICAgbm9kZSA9IHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKCiAgICAgICAgZGVmIGVuZFRhZ0JvZHkoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiBub3Qgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJib2R5Iik6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCkKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBlbGlmIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgIT0gImJvZHkiOgogICAgICAgICAgICAgICAgZm9yIG5vZGUgaW4gc2VsZi50cmVlLm9wZW5FbGVtZW50c1syOl06CiAgICAgICAgICAgICAgICAgICAgaWYgbm9kZS5uYW1lIG5vdCBpbiBmcm96ZW5zZXQoKCJkZCIsICJkdCIsICJsaSIsICJvcHRncm91cCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb24iLCAicCIsICJycCIsICJydCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0Ym9keSIsICJ0ZCIsICJ0Zm9vdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aCIsICJ0aGVhZCIsICJ0ciIsICJib2R5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0bWwiKSk6CiAgICAgICAgICAgICAgICAgICAgICAgICMgTm90IHN1cmUgdGhpcyBpcyB0aGUgY29ycmVjdCBuYW1lIGZvciB0aGUgcGFyc2UgZXJyb3IKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZC1vbmUtZW5kLXRhZy1idXQtZ290LWFub3RoZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJnb3ROYW1lIjogImJvZHkiLCAiZXhwZWN0ZWROYW1lIjogbm9kZS5uYW1lfSkKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImFmdGVyQm9keSJdCgogICAgICAgIGRlZiBlbmRUYWdIdG1sKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgIyBXZSByZXBlYXQgdGhlIHRlc3QgZm9yIHRoZSBib2R5IGVuZCB0YWcgdG9rZW4gYmVpbmcgaWdub3JlZCBoZXJlCiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgiYm9keSIpOgogICAgICAgICAgICAgICAgc2VsZi5lbmRUYWdCb2R5KGltcGxpZWRUYWdUb2tlbigiYm9keSIpKQogICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBlbmRUYWdCbG9jayhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgICMgUHV0IHVzIGJhY2sgaW4gdGhlIHJpZ2h0IHdoaXRlc3BhY2UgaGFuZGxpbmcgbW9kZQogICAgICAgICAgICBpZiB0b2tlblsibmFtZSJdID09ICJwcmUiOgogICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzU3BhY2VDaGFyYWN0ZXJzID0gc2VsZi5wcm9jZXNzU3BhY2VDaGFyYWN0ZXJzTm9uUHJlCiAgICAgICAgICAgIGluU2NvcGUgPSBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUodG9rZW5bIm5hbWUiXSkKICAgICAgICAgICAgaWYgaW5TY29wZToKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5nZW5lcmF0ZUltcGxpZWRFbmRUYWdzKCkKICAgICAgICAgICAgaWYgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSAhPSB0b2tlblsibmFtZSJdOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigiZW5kLXRhZy10b28tZWFybHkiLCB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKICAgICAgICAgICAgaWYgaW5TY29wZToKICAgICAgICAgICAgICAgIG5vZGUgPSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgICAgICB3aGlsZSBub2RlLm5hbWUgIT0gdG9rZW5bIm5hbWUiXToKICAgICAgICAgICAgICAgICAgICBub2RlID0gc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQoKICAgICAgICBkZWYgZW5kVGFnRm9ybShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIG5vZGUgPSBzZWxmLnRyZWUuZm9ybVBvaW50ZXIKICAgICAgICAgICAgc2VsZi50cmVlLmZvcm1Qb2ludGVyID0gTm9uZQogICAgICAgICAgICBpZiBub2RlIGlzIE5vbmUgb3Igbm90IHNlbGYudHJlZS5lbGVtZW50SW5TY29wZShub2RlKToKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtZW5kLXRhZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6ICJmb3JtIn0pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLnRyZWUuZ2VuZXJhdGVJbXBsaWVkRW5kVGFncygpCiAgICAgICAgICAgICAgICBpZiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXSAhPSBub2RlOgogICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoImVuZC10YWctdG9vLWVhcmx5LWlnbm9yZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogImZvcm0ifSkKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucmVtb3ZlKG5vZGUpCgogICAgICAgIGRlZiBlbmRUYWdMaXN0SXRlbShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHRva2VuWyJuYW1lIl0gPT0gImxpIjoKICAgICAgICAgICAgICAgIHZhcmlhbnQgPSAibGlzdCIKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHZhcmlhbnQgPSBOb25lCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUodG9rZW5bIm5hbWUiXSwgdmFyaWFudD12YXJpYW50KToKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtZW5kLXRhZyIsIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi50cmVlLmdlbmVyYXRlSW1wbGllZEVuZFRhZ3MoZXhjbHVkZT10b2tlblsibmFtZSJdKQogICAgICAgICAgICAgICAgaWYgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSAhPSB0b2tlblsibmFtZSJdOgogICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgICJlbmQtdGFnLXRvby1lYXJseSIsCiAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQogICAgICAgICAgICAgICAgbm9kZSA9IHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgICAgIHdoaWxlIG5vZGUubmFtZSAhPSB0b2tlblsibmFtZSJdOgogICAgICAgICAgICAgICAgICAgIG5vZGUgPSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCgogICAgICAgIGRlZiBlbmRUYWdIZWFkaW5nKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgZm9yIGl0ZW0gaW4gaGVhZGluZ0VsZW1lbnRzOgogICAgICAgICAgICAgICAgaWYgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKGl0ZW0pOgogICAgICAgICAgICAgICAgICAgIHNlbGYudHJlZS5nZW5lcmF0ZUltcGxpZWRFbmRUYWdzKCkKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBpZiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lICE9IHRva2VuWyJuYW1lIl06CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJlbmQtdGFnLXRvby1lYXJseSIsIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQoKICAgICAgICAgICAgZm9yIGl0ZW0gaW4gaGVhZGluZ0VsZW1lbnRzOgogICAgICAgICAgICAgICAgaWYgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKGl0ZW0pOgogICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgICAgICAgICAgd2hpbGUgaXRlbS5uYW1lIG5vdCBpbiBoZWFkaW5nRWxlbWVudHM6CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgZGVmIGVuZFRhZ0Zvcm1hdHRpbmcoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICAiIiJUaGUgbXVjaC1mZWFyZWQgYWRvcHRpb24gYWdlbmN5IGFsZ29yaXRobSIiIgogICAgICAgICAgICAjIGh0dHA6Ly9zdm4ud2hhdHdnLm9yZy93ZWJhcHBzL2NvbXBsZXRlLmh0bWwjYWRvcHRpb25BZ2VuY3kgcmV2aXNpb24gNzg2NwogICAgICAgICAgICAjIFhYWCBCZXR0ZXIgcGFyc2VFcnJvciBtZXNzYWdlcyBhcHByZWNpYXRlZC4KCiAgICAgICAgICAgICMgU3RlcCAxCiAgICAgICAgICAgIG91dGVyTG9vcENvdW50ZXIgPSAwCgogICAgICAgICAgICAjIFN0ZXAgMgogICAgICAgICAgICB3aGlsZSBvdXRlckxvb3BDb3VudGVyIDwgODoKCiAgICAgICAgICAgICAgICAjIFN0ZXAgMwogICAgICAgICAgICAgICAgb3V0ZXJMb29wQ291bnRlciArPSAxCgogICAgICAgICAgICAgICAgIyBTdGVwIDQ6CgogICAgICAgICAgICAgICAgIyBMZXQgdGhlIGZvcm1hdHRpbmcgZWxlbWVudCBiZSB0aGUgbGFzdCBlbGVtZW50IGluCiAgICAgICAgICAgICAgICAjIHRoZSBsaXN0IG9mIGFjdGl2ZSBmb3JtYXR0aW5nIGVsZW1lbnRzIHRoYXQ6CiAgICAgICAgICAgICAgICAjIC0gaXMgYmV0d2VlbiB0aGUgZW5kIG9mIHRoZSBsaXN0IGFuZCB0aGUgbGFzdCBzY29wZQogICAgICAgICAgICAgICAgIyBtYXJrZXIgaW4gdGhlIGxpc3QsIGlmIGFueSwgb3IgdGhlIHN0YXJ0IG9mIHRoZSBsaXN0CiAgICAgICAgICAgICAgICAjIG90aGVyd2lzZSwgYW5kCiAgICAgICAgICAgICAgICAjIC0gaGFzIHRoZSBzYW1lIHRhZyBuYW1lIGFzIHRoZSB0b2tlbi4KICAgICAgICAgICAgICAgIGZvcm1hdHRpbmdFbGVtZW50ID0gc2VsZi50cmVlLmVsZW1lbnRJbkFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygKICAgICAgICAgICAgICAgICAgICB0b2tlblsibmFtZSJdKQogICAgICAgICAgICAgICAgaWYgKG5vdCBmb3JtYXR0aW5nRWxlbWVudCBvcgogICAgICAgICAgICAgICAgICAgIChmb3JtYXR0aW5nRWxlbWVudCBpbiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzIGFuZAogICAgICAgICAgICAgICAgICAgICBub3Qgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKGZvcm1hdHRpbmdFbGVtZW50Lm5hbWUpKSk6CiAgICAgICAgICAgICAgICAgICAgIyBJZiB0aGVyZSBpcyBubyBzdWNoIG5vZGUsIHRoZW4gYWJvcnQgdGhlc2Ugc3RlcHMKICAgICAgICAgICAgICAgICAgICAjIGFuZCBpbnN0ZWFkIGFjdCBhcyBkZXNjcmliZWQgaW4gdGhlICJhbnkgb3RoZXIKICAgICAgICAgICAgICAgICAgICAjIGVuZCB0YWciIGVudHJ5IGJlbG93LgogICAgICAgICAgICAgICAgICAgIHNlbGYuZW5kVGFnT3RoZXIodG9rZW4pCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICAgICAgICAgIyBPdGhlcndpc2UsIGlmIHRoZXJlIGlzIHN1Y2ggYSBub2RlLCBidXQgdGhhdCBub2RlIGlzCiAgICAgICAgICAgICAgICAjIG5vdCBpbiB0aGUgc3RhY2sgb2Ygb3BlbiBlbGVtZW50cywgdGhlbiB0aGlzIGlzIGEKICAgICAgICAgICAgICAgICMgcGFyc2UgZXJyb3I7IHJlbW92ZSB0aGUgZWxlbWVudCBmcm9tIHRoZSBsaXN0LCBhbmQKICAgICAgICAgICAgICAgICMgYWJvcnQgdGhlc2Ugc3RlcHMuCiAgICAgICAgICAgICAgICBlbGlmIGZvcm1hdHRpbmdFbGVtZW50IG5vdCBpbiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzOgogICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoImFkb3B0aW9uLWFnZW5jeS0xLjIiLCB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyZWUuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzLnJlbW92ZShmb3JtYXR0aW5nRWxlbWVudCkKICAgICAgICAgICAgICAgICAgICByZXR1cm4KCiAgICAgICAgICAgICAgICAjIE90aGVyd2lzZSwgaWYgdGhlcmUgaXMgc3VjaCBhIG5vZGUsIGFuZCB0aGF0IG5vZGUgaXMKICAgICAgICAgICAgICAgICMgYWxzbyBpbiB0aGUgc3RhY2sgb2Ygb3BlbiBlbGVtZW50cywgYnV0IHRoZSBlbGVtZW50CiAgICAgICAgICAgICAgICAjIGlzIG5vdCBpbiBzY29wZSwgdGhlbiB0aGlzIGlzIGEgcGFyc2UgZXJyb3I7IGlnbm9yZQogICAgICAgICAgICAgICAgIyB0aGUgdG9rZW4sIGFuZCBhYm9ydCB0aGVzZSBzdGVwcy4KICAgICAgICAgICAgICAgIGVsaWYgbm90IHNlbGYudHJlZS5lbGVtZW50SW5TY29wZShmb3JtYXR0aW5nRWxlbWVudC5uYW1lKToKICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJhZG9wdGlvbi1hZ2VuY3ktNC40IiwgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICAgICAgICAgIyBPdGhlcndpc2UsIHRoZXJlIGlzIGEgZm9ybWF0dGluZyBlbGVtZW50IGFuZCB0aGF0CiAgICAgICAgICAgICAgICAjIGVsZW1lbnQgaXMgaW4gdGhlIHN0YWNrIGFuZCBpcyBpbiBzY29wZS4gSWYgdGhlCiAgICAgICAgICAgICAgICAjIGVsZW1lbnQgaXMgbm90IHRoZSBjdXJyZW50IG5vZGUsIHRoaXMgaXMgYSBwYXJzZQogICAgICAgICAgICAgICAgIyBlcnJvci4gSW4gYW55IGNhc2UsIHByb2NlZWQgd2l0aCB0aGUgYWxnb3JpdGhtIGFzCiAgICAgICAgICAgICAgICAjIHdyaXR0ZW4gaW4gdGhlIGZvbGxvd2luZyBzdGVwcy4KICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgaWYgZm9ybWF0dGluZ0VsZW1lbnQgIT0gc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV06CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoImFkb3B0aW9uLWFnZW5jeS0xLjMiLCB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKCiAgICAgICAgICAgICAgICAjIFN0ZXAgNToKCiAgICAgICAgICAgICAgICAjIExldCB0aGUgZnVydGhlc3QgYmxvY2sgYmUgdGhlIHRvcG1vc3Qgbm9kZSBpbiB0aGUKICAgICAgICAgICAgICAgICMgc3RhY2sgb2Ygb3BlbiBlbGVtZW50cyB0aGF0IGlzIGxvd2VyIGluIHRoZSBzdGFjawogICAgICAgICAgICAgICAgIyB0aGFuIHRoZSBmb3JtYXR0aW5nIGVsZW1lbnQsIGFuZCBpcyBhbiBlbGVtZW50IGluCiAgICAgICAgICAgICAgICAjIHRoZSBzcGVjaWFsIGNhdGVnb3J5LiBUaGVyZSBtaWdodCBub3QgYmUgb25lLgogICAgICAgICAgICAgICAgYWZlSW5kZXggPSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLmluZGV4KGZvcm1hdHRpbmdFbGVtZW50KQogICAgICAgICAgICAgICAgZnVydGhlc3RCbG9jayA9IE5vbmUKICAgICAgICAgICAgICAgIGZvciBlbGVtZW50IGluIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbYWZlSW5kZXg6XToKICAgICAgICAgICAgICAgICAgICBpZiBlbGVtZW50Lm5hbWVUdXBsZSBpbiBzcGVjaWFsRWxlbWVudHM6CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1cnRoZXN0QmxvY2sgPSBlbGVtZW50CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgICAgICAgICAgIyBTdGVwIDY6CgogICAgICAgICAgICAgICAgIyBJZiB0aGVyZSBpcyBubyBmdXJ0aGVzdCBibG9jaywgdGhlbiB0aGUgVUEgbXVzdAogICAgICAgICAgICAgICAgIyBmaXJzdCBwb3AgYWxsIHRoZSBub2RlcyBmcm9tIHRoZSBib3R0b20gb2YgdGhlIHN0YWNrCiAgICAgICAgICAgICAgICAjIG9mIG9wZW4gZWxlbWVudHMsIGZyb20gdGhlIGN1cnJlbnQgbm9kZSB1cCB0byBhbmQKICAgICAgICAgICAgICAgICMgaW5jbHVkaW5nIHRoZSBmb3JtYXR0aW5nIGVsZW1lbnQsIHRoZW4gcmVtb3ZlIHRoZQogICAgICAgICAgICAgICAgIyBmb3JtYXR0aW5nIGVsZW1lbnQgZnJvbSB0aGUgbGlzdCBvZiBhY3RpdmUKICAgICAgICAgICAgICAgICMgZm9ybWF0dGluZyBlbGVtZW50cywgYW5kIGZpbmFsbHkgYWJvcnQgdGhlc2Ugc3RlcHMuCiAgICAgICAgICAgICAgICBpZiBmdXJ0aGVzdEJsb2NrIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgICAgICAgICB3aGlsZSBlbGVtZW50ICE9IGZvcm1hdHRpbmdFbGVtZW50OgogICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICAgICAgICAgIHNlbGYudHJlZS5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMucmVtb3ZlKGVsZW1lbnQpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICAgICAgICAgIyBTdGVwIDcKICAgICAgICAgICAgICAgIGNvbW1vbkFuY2VzdG9yID0gc2VsZi50cmVlLm9wZW5FbGVtZW50c1thZmVJbmRleCAtIDFdCgogICAgICAgICAgICAgICAgIyBTdGVwIDg6CiAgICAgICAgICAgICAgICAjIFRoZSBib29rbWFyayBpcyBzdXBwb3NlZCB0byBoZWxwIHVzIGlkZW50aWZ5IHdoZXJlIHRvIHJlaW5zZXJ0CiAgICAgICAgICAgICAgICAjIG5vZGVzIGluIHN0ZXAgMTUuIFdlIGhhdmUgdG8gZW5zdXJlIHRoYXQgd2UgcmVpbnNlcnQgbm9kZXMgYWZ0ZXIKICAgICAgICAgICAgICAgICMgdGhlIG5vZGUgYmVmb3JlIHRoZSBhY3RpdmUgZm9ybWF0dGluZyBlbGVtZW50LiBOb3RlIHRoZSBib29rbWFyawogICAgICAgICAgICAgICAgIyBjYW4gbW92ZSBpbiBzdGVwIDkuNwogICAgICAgICAgICAgICAgYm9va21hcmsgPSBzZWxmLnRyZWUuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzLmluZGV4KGZvcm1hdHRpbmdFbGVtZW50KQoKICAgICAgICAgICAgICAgICMgU3RlcCA5CiAgICAgICAgICAgICAgICBsYXN0Tm9kZSA9IG5vZGUgPSBmdXJ0aGVzdEJsb2NrCiAgICAgICAgICAgICAgICBpbm5lckxvb3BDb3VudGVyID0gMAoKICAgICAgICAgICAgICAgIGluZGV4ID0gc2VsZi50cmVlLm9wZW5FbGVtZW50cy5pbmRleChub2RlKQogICAgICAgICAgICAgICAgd2hpbGUgaW5uZXJMb29wQ291bnRlciA8IDM6CiAgICAgICAgICAgICAgICAgICAgaW5uZXJMb29wQ291bnRlciArPSAxCiAgICAgICAgICAgICAgICAgICAgIyBOb2RlIGlzIGVsZW1lbnQgYmVmb3JlIG5vZGUgaW4gb3BlbiBlbGVtZW50cwogICAgICAgICAgICAgICAgICAgIGluZGV4IC09IDEKICAgICAgICAgICAgICAgICAgICBub2RlID0gc2VsZi50cmVlLm9wZW5FbGVtZW50c1tpbmRleF0KICAgICAgICAgICAgICAgICAgICBpZiBub2RlIG5vdCBpbiBzZWxmLnRyZWUuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnJlbW92ZShub2RlKQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgICMgU3RlcCA5LjYKICAgICAgICAgICAgICAgICAgICBpZiBub2RlID09IGZvcm1hdHRpbmdFbGVtZW50OgogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgICMgU3RlcCA5LjcKICAgICAgICAgICAgICAgICAgICBpZiBsYXN0Tm9kZSA9PSBmdXJ0aGVzdEJsb2NrOgogICAgICAgICAgICAgICAgICAgICAgICBib29rbWFyayA9IHNlbGYudHJlZS5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMuaW5kZXgobm9kZSkgKyAxCiAgICAgICAgICAgICAgICAgICAgIyBTdGVwIDkuOAogICAgICAgICAgICAgICAgICAgIGNsb25lID0gbm9kZS5jbG9uZU5vZGUoKQogICAgICAgICAgICAgICAgICAgICMgUmVwbGFjZSBub2RlIHdpdGggY2xvbmUKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyZWUuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzWwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyZWUuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzLmluZGV4KG5vZGUpXSA9IGNsb25lCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50c1sKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5pbmRleChub2RlKV0gPSBjbG9uZQogICAgICAgICAgICAgICAgICAgIG5vZGUgPSBjbG9uZQogICAgICAgICAgICAgICAgICAgICMgU3RlcCA5LjkKICAgICAgICAgICAgICAgICAgICAjIFJlbW92ZSBsYXN0Tm9kZSBmcm9tIGl0cyBwYXJlbnRzLCBpZiBhbnkKICAgICAgICAgICAgICAgICAgICBpZiBsYXN0Tm9kZS5wYXJlbnQ6CiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3ROb2RlLnBhcmVudC5yZW1vdmVDaGlsZChsYXN0Tm9kZSkKICAgICAgICAgICAgICAgICAgICBub2RlLmFwcGVuZENoaWxkKGxhc3ROb2RlKQogICAgICAgICAgICAgICAgICAgICMgU3RlcCA5LjEwCiAgICAgICAgICAgICAgICAgICAgbGFzdE5vZGUgPSBub2RlCgogICAgICAgICAgICAgICAgIyBTdGVwIDEwCiAgICAgICAgICAgICAgICAjIEZvc3RlciBwYXJlbnQgbGFzdE5vZGUgaWYgY29tbW9uQW5jZXN0b3IgaXMgYQogICAgICAgICAgICAgICAgIyB0YWJsZSwgdGJvZHksIHRmb290LCB0aGVhZCwgb3IgdHIgd2UgbmVlZCB0byBmb3N0ZXIKICAgICAgICAgICAgICAgICMgcGFyZW50IHRoZSBsYXN0Tm9kZQogICAgICAgICAgICAgICAgaWYgbGFzdE5vZGUucGFyZW50OgogICAgICAgICAgICAgICAgICAgIGxhc3ROb2RlLnBhcmVudC5yZW1vdmVDaGlsZChsYXN0Tm9kZSkKCiAgICAgICAgICAgICAgICBpZiBjb21tb25BbmNlc3Rvci5uYW1lIGluIGZyb3plbnNldCgoInRhYmxlIiwgInRib2R5IiwgInRmb290IiwgInRoZWFkIiwgInRyIikpOgogICAgICAgICAgICAgICAgICAgIHBhcmVudCwgaW5zZXJ0QmVmb3JlID0gc2VsZi50cmVlLmdldFRhYmxlTWlzbmVzdGVkTm9kZVBvc2l0aW9uKCkKICAgICAgICAgICAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGxhc3ROb2RlLCBpbnNlcnRCZWZvcmUpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGNvbW1vbkFuY2VzdG9yLmFwcGVuZENoaWxkKGxhc3ROb2RlKQoKICAgICAgICAgICAgICAgICMgU3RlcCAxMQogICAgICAgICAgICAgICAgY2xvbmUgPSBmb3JtYXR0aW5nRWxlbWVudC5jbG9uZU5vZGUoKQoKICAgICAgICAgICAgICAgICMgU3RlcCAxMgogICAgICAgICAgICAgICAgZnVydGhlc3RCbG9jay5yZXBhcmVudENoaWxkcmVuKGNsb25lKQoKICAgICAgICAgICAgICAgICMgU3RlcCAxMwogICAgICAgICAgICAgICAgZnVydGhlc3RCbG9jay5hcHBlbmRDaGlsZChjbG9uZSkKCiAgICAgICAgICAgICAgICAjIFN0ZXAgMTQKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMucmVtb3ZlKGZvcm1hdHRpbmdFbGVtZW50KQogICAgICAgICAgICAgICAgc2VsZi50cmVlLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cy5pbnNlcnQoYm9va21hcmssIGNsb25lKQoKICAgICAgICAgICAgICAgICMgU3RlcCAxNQogICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5yZW1vdmUoZm9ybWF0dGluZ0VsZW1lbnQpCiAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLmluc2VydCgKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLmluZGV4KGZ1cnRoZXN0QmxvY2spICsgMSwgY2xvbmUpCgogICAgICAgIGRlZiBlbmRUYWdBcHBsZXRNYXJxdWVlT2JqZWN0KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKHRva2VuWyJuYW1lIl0pOgogICAgICAgICAgICAgICAgc2VsZi50cmVlLmdlbmVyYXRlSW1wbGllZEVuZFRhZ3MoKQogICAgICAgICAgICBpZiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lICE9IHRva2VuWyJuYW1lIl06CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJlbmQtdGFnLXRvby1lYXJseSIsIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQoKICAgICAgICAgICAgaWYgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKHRva2VuWyJuYW1lIl0pOgogICAgICAgICAgICAgICAgZWxlbWVudCA9IHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgICAgIHdoaWxlIGVsZW1lbnQubmFtZSAhPSB0b2tlblsibmFtZSJdOgogICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgICAgICBzZWxmLnRyZWUuY2xlYXJBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoKQoKICAgICAgICBkZWYgZW5kVGFnQnIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWVuZC10YWctdHJlYXRlZC1hcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJvcmlnaW5hbE5hbWUiOiAiYnIiLCAibmV3TmFtZSI6ICJiciBlbGVtZW50In0pCiAgICAgICAgICAgIHNlbGYudHJlZS5yZWNvbnN0cnVjdEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cygpCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KGltcGxpZWRUYWdUb2tlbigiYnIiLCAiU3RhcnRUYWciKSkKICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQoKICAgICAgICBkZWYgZW5kVGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBmb3Igbm9kZSBpbiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWzo6LTFdOgogICAgICAgICAgICAgICAgaWYgbm9kZS5uYW1lID09IHRva2VuWyJuYW1lIl06CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmVlLmdlbmVyYXRlSW1wbGllZEVuZFRhZ3MoZXhjbHVkZT10b2tlblsibmFtZSJdKQogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgIT0gdG9rZW5bIm5hbWUiXToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1lbmQtdGFnIiwgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCiAgICAgICAgICAgICAgICAgICAgd2hpbGUgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKSAhPSBub2RlOgogICAgICAgICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgaWYgbm9kZS5uYW1lVHVwbGUgaW4gc3BlY2lhbEVsZW1lbnRzOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWVuZC10YWciLCB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKCiAgICBjbGFzcyBUZXh0UGhhc2UoUGhhc2UpOgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpOgogICAgICAgICAgICBQaGFzZS5fX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoW10pCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLnN0YXJ0VGFnT3RoZXIKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCJzY3JpcHQiLCBzZWxmLmVuZFRhZ1NjcmlwdCldKQogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuZW5kVGFnT3RoZXIKCiAgICAgICAgZGVmIHByb2Nlc3NDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydFRleHQodG9rZW5bImRhdGEiXSkKCiAgICAgICAgZGVmIHByb2Nlc3NFT0Yoc2VsZik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoImV4cGVjdGVkLW5hbWVkLWNsb3NpbmctdGFnLWJ1dC1nb3QtZW9mIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lfSkKICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLm9yaWdpbmFsUGhhc2UKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgZGVmIHN0YXJ0VGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBhc3NlcnQgRmFsc2UsICJUcmllZCB0byBwcm9jZXNzIHN0YXJ0IHRhZyAlcyBpbiBSQ0RBVEEvUkFXVEVYVCBtb2RlIiAlIHRva2VuWyduYW1lJ10KCiAgICAgICAgZGVmIGVuZFRhZ1NjcmlwdChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIG5vZGUgPSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgIGFzc2VydCBub2RlLm5hbWUgPT0gInNjcmlwdCIKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5vcmlnaW5hbFBoYXNlCiAgICAgICAgICAgICMgVGhlIHJlc3Qgb2YgdGhpcyBtZXRob2QgaXMgYWxsIHN0dWZmIHRoYXQgb25seSBoYXBwZW5zIGlmCiAgICAgICAgICAgICMgZG9jdW1lbnQud3JpdGUgd29ya3MKCiAgICAgICAgZGVmIGVuZFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLm9yaWdpbmFsUGhhc2UKCiAgICBjbGFzcyBJblRhYmxlUGhhc2UoUGhhc2UpOgogICAgICAgICMgaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay8jaW4tdGFibGUKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKToKICAgICAgICAgICAgUGhhc2UuX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKQogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgiaHRtbCIsIHNlbGYuc3RhcnRUYWdIdG1sKSwKICAgICAgICAgICAgICAgICgiY2FwdGlvbiIsIHNlbGYuc3RhcnRUYWdDYXB0aW9uKSwKICAgICAgICAgICAgICAgICgiY29sZ3JvdXAiLCBzZWxmLnN0YXJ0VGFnQ29sZ3JvdXApLAogICAgICAgICAgICAgICAgKCJjb2wiLCBzZWxmLnN0YXJ0VGFnQ29sKSwKICAgICAgICAgICAgICAgICgoInRib2R5IiwgInRmb290IiwgInRoZWFkIiksIHNlbGYuc3RhcnRUYWdSb3dHcm91cCksCiAgICAgICAgICAgICAgICAoKCJ0ZCIsICJ0aCIsICJ0ciIpLCBzZWxmLnN0YXJ0VGFnSW1wbHlUYm9keSksCiAgICAgICAgICAgICAgICAoInRhYmxlIiwgc2VsZi5zdGFydFRhZ1RhYmxlKSwKICAgICAgICAgICAgICAgICgoInN0eWxlIiwgInNjcmlwdCIpLCBzZWxmLnN0YXJ0VGFnU3R5bGVTY3JpcHQpLAogICAgICAgICAgICAgICAgKCJpbnB1dCIsIHNlbGYuc3RhcnRUYWdJbnB1dCksCiAgICAgICAgICAgICAgICAoImZvcm0iLCBzZWxmLnN0YXJ0VGFnRm9ybSkKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuc3RhcnRUYWdPdGhlcgoKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCJ0YWJsZSIsIHNlbGYuZW5kVGFnVGFibGUpLAogICAgICAgICAgICAgICAgKCgiYm9keSIsICJjYXB0aW9uIiwgImNvbCIsICJjb2xncm91cCIsICJodG1sIiwgInRib2R5IiwgInRkIiwKICAgICAgICAgICAgICAgICAgInRmb290IiwgInRoIiwgInRoZWFkIiwgInRyIiksIHNlbGYuZW5kVGFnSWdub3JlKQogICAgICAgICAgICBdKQogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuZW5kVGFnT3RoZXIKCiAgICAgICAgIyBoZWxwZXIgbWV0aG9kcwogICAgICAgIGRlZiBjbGVhclN0YWNrVG9UYWJsZUNvbnRleHQoc2VsZik6CiAgICAgICAgICAgICMgImNsZWFyIHRoZSBzdGFjayBiYWNrIHRvIGEgdGFibGUgY29udGV4dCIKICAgICAgICAgICAgd2hpbGUgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSBub3QgaW4gKCJ0YWJsZSIsICJodG1sIik6CiAgICAgICAgICAgICAgICAjIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtaW1wbGllZC1lbmQtdGFnLWluLXRhYmxlIiwKICAgICAgICAgICAgICAgICMgIHsibmFtZSI6ICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lfSkKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgIyBXaGVuIHRoZSBjdXJyZW50IG5vZGUgaXMgPGh0bWw+IGl0J3MgYW4gaW5uZXJIVE1MIGNhc2UKCiAgICAgICAgIyBwcm9jZXNzaW5nIG1ldGhvZHMKICAgICAgICBkZWYgcHJvY2Vzc0VPRihzZWxmKToKICAgICAgICAgICAgaWYgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSAhPSAiaHRtbCI6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJlb2YtaW4tdGFibGUiKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYXNzZXJ0IHNlbGYucGFyc2VyLmlubmVySFRNTAogICAgICAgICAgICAjIFN0b3AgcGFyc2luZwoKICAgICAgICBkZWYgcHJvY2Vzc1NwYWNlQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIG9yaWdpbmFsUGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siaW5UYWJsZVRleHQiXQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZS5vcmlnaW5hbFBoYXNlID0gb3JpZ2luYWxQaGFzZQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZS5wcm9jZXNzU3BhY2VDaGFyYWN0ZXJzKHRva2VuKQoKICAgICAgICBkZWYgcHJvY2Vzc0NoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBvcmlnaW5hbFBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2UKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImluVGFibGVUZXh0Il0KICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2Uub3JpZ2luYWxQaGFzZSA9IG9yaWdpbmFsUGhhc2UKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UucHJvY2Vzc0NoYXJhY3RlcnModG9rZW4pCgogICAgICAgIGRlZiBpbnNlcnRUZXh0KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgIyBJZiB3ZSBnZXQgaGVyZSB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIKICAgICAgICAgICAgIyBEbyB0aGUgdGFibGUgbWFnaWMhCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRGcm9tVGFibGUgPSBUcnVlCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlc1siaW5Cb2R5Il0ucHJvY2Vzc0NoYXJhY3RlcnModG9rZW4pCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRGcm9tVGFibGUgPSBGYWxzZQoKICAgICAgICBkZWYgc3RhcnRUYWdDYXB0aW9uKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5jbGVhclN0YWNrVG9UYWJsZUNvbnRleHQoKQogICAgICAgICAgICBzZWxmLnRyZWUuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzLmFwcGVuZChNYXJrZXIpCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siaW5DYXB0aW9uIl0KCiAgICAgICAgZGVmIHN0YXJ0VGFnQ29sZ3JvdXAoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLmNsZWFyU3RhY2tUb1RhYmxlQ29udGV4dCgpCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siaW5Db2x1bW5Hcm91cCJdCgogICAgICAgIGRlZiBzdGFydFRhZ0NvbChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdDb2xncm91cChpbXBsaWVkVGFnVG9rZW4oImNvbGdyb3VwIiwgIlN0YXJ0VGFnIikpCiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgc3RhcnRUYWdSb3dHcm91cChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYuY2xlYXJTdGFja1RvVGFibGVDb250ZXh0KCkKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJpblRhYmxlQm9keSJdCgogICAgICAgIGRlZiBzdGFydFRhZ0ltcGx5VGJvZHkoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnUm93R3JvdXAoaW1wbGllZFRhZ1Rva2VuKCJ0Ym9keSIsICJTdGFydFRhZyIpKQogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIHN0YXJ0VGFnVGFibGUoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLXN0YXJ0LXRhZy1pbXBsaWVzLWVuZC10YWciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsic3RhcnROYW1lIjogInRhYmxlIiwgImVuZE5hbWUiOiAidGFibGUifSkKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UucHJvY2Vzc0VuZFRhZyhpbXBsaWVkVGFnVG9rZW4oInRhYmxlIikpCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLnBhcnNlci5pbm5lckhUTUw6CiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIHN0YXJ0VGFnU3R5bGVTY3JpcHQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkhlYWQiXS5wcm9jZXNzU3RhcnRUYWcodG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ0lucHV0KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgKCJ0eXBlIiBpbiB0b2tlblsiZGF0YSJdIGFuZAogICAgICAgICAgICAgICAgICAgIHRva2VuWyJkYXRhIl1bInR5cGUiXS50cmFuc2xhdGUoYXNjaWlVcHBlcjJMb3dlcikgPT0gImhpZGRlbiIpOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1oaWRkZW4taW5wdXQtaW4tdGFibGUiKQogICAgICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgICAgICAjIFhYWCBhc3NvY2lhdGUgd2l0aCBmb3JtCiAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLnN0YXJ0VGFnT3RoZXIodG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ0Zvcm0oc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWZvcm0taW4tdGFibGUiKQogICAgICAgICAgICBpZiBzZWxmLnRyZWUuZm9ybVBvaW50ZXIgaXMgTm9uZToKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQogICAgICAgICAgICAgICAgc2VsZi50cmVlLmZvcm1Qb2ludGVyID0gc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0KICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKCiAgICAgICAgZGVmIHN0YXJ0VGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLXN0YXJ0LXRhZy1pbXBsaWVzLXRhYmxlLXZvb2RvbyIsIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQogICAgICAgICAgICAjIERvIHRoZSB0YWJsZSBtYWdpYyEKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEZyb21UYWJsZSA9IFRydWUKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2VzWyJpbkJvZHkiXS5wcm9jZXNzU3RhcnRUYWcodG9rZW4pCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRGcm9tVGFibGUgPSBGYWxzZQoKICAgICAgICBkZWYgZW5kVGFnVGFibGUoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoInRhYmxlIiwgdmFyaWFudD0idGFibGUiKToKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5nZW5lcmF0ZUltcGxpZWRFbmRUYWdzKCkKICAgICAgICAgICAgICAgIGlmIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgIT0gInRhYmxlIjoKICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJlbmQtdGFnLXRvby1lYXJseS1uYW1lZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ImdvdE5hbWUiOiAidGFibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZE5hbWUiOiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lfSkKICAgICAgICAgICAgICAgIHdoaWxlIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgIT0gInRhYmxlIjoKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5yZXNldEluc2VydGlvbk1vZGUoKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBpbm5lckhUTUwgY2FzZQogICAgICAgICAgICAgICAgYXNzZXJ0IHNlbGYucGFyc2VyLmlubmVySFRNTAogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigpCgogICAgICAgIGRlZiBlbmRUYWdJZ25vcmUoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWVuZC10YWciLCB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKCiAgICAgICAgZGVmIGVuZFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1lbmQtdGFnLWltcGxpZXMtdGFibGUtdm9vZG9vIiwgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCiAgICAgICAgICAgICMgRG8gdGhlIHRhYmxlIG1hZ2ljIQogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RnJvbVRhYmxlID0gVHJ1ZQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdLnByb2Nlc3NFbmRUYWcodG9rZW4pCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRGcm9tVGFibGUgPSBGYWxzZQoKICAgIGNsYXNzIEluVGFibGVUZXh0UGhhc2UoUGhhc2UpOgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpOgogICAgICAgICAgICBQaGFzZS5fX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpCiAgICAgICAgICAgIHNlbGYub3JpZ2luYWxQaGFzZSA9IE5vbmUKICAgICAgICAgICAgc2VsZi5jaGFyYWN0ZXJUb2tlbnMgPSBbXQoKICAgICAgICBkZWYgZmx1c2hDaGFyYWN0ZXJzKHNlbGYpOgogICAgICAgICAgICBkYXRhID0gIiIuam9pbihbaXRlbVsiZGF0YSJdIGZvciBpdGVtIGluIHNlbGYuY2hhcmFjdGVyVG9rZW5zXSkKICAgICAgICAgICAgaWYgYW55KFtpdGVtIG5vdCBpbiBzcGFjZUNoYXJhY3RlcnMgZm9yIGl0ZW0gaW4gZGF0YV0pOgogICAgICAgICAgICAgICAgdG9rZW4gPSB7InR5cGUiOiB0b2tlblR5cGVzWyJDaGFyYWN0ZXJzIl0sICJkYXRhIjogZGF0YX0KICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlc1siaW5UYWJsZSJdLmluc2VydFRleHQodG9rZW4pCiAgICAgICAgICAgIGVsaWYgZGF0YToKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRUZXh0KGRhdGEpCiAgICAgICAgICAgIHNlbGYuY2hhcmFjdGVyVG9rZW5zID0gW10KCiAgICAgICAgZGVmIHByb2Nlc3NDb21tZW50KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5mbHVzaENoYXJhY3RlcnMoKQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYub3JpZ2luYWxQaGFzZQogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIHByb2Nlc3NFT0Yoc2VsZik6CiAgICAgICAgICAgIHNlbGYuZmx1c2hDaGFyYWN0ZXJzKCkKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLm9yaWdpbmFsUGhhc2UKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgZGVmIHByb2Nlc3NDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgdG9rZW5bImRhdGEiXSA9PSAiXHUwMDAwIjoKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBzZWxmLmNoYXJhY3RlclRva2Vucy5hcHBlbmQodG9rZW4pCgogICAgICAgIGRlZiBwcm9jZXNzU3BhY2VDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgIyBwcmV0dHkgc3VyZSB3ZSBzaG91bGQgbmV2ZXIgcmVhY2ggaGVyZQogICAgICAgICAgICBzZWxmLmNoYXJhY3RlclRva2Vucy5hcHBlbmQodG9rZW4pCiAgICAjICAgICAgICBhc3NlcnQgRmFsc2UKCiAgICAgICAgZGVmIHByb2Nlc3NTdGFydFRhZyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYuZmx1c2hDaGFyYWN0ZXJzKCkKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLm9yaWdpbmFsUGhhc2UKICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBwcm9jZXNzRW5kVGFnKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5mbHVzaENoYXJhY3RlcnMoKQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYub3JpZ2luYWxQaGFzZQogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICBjbGFzcyBJbkNhcHRpb25QaGFzZShQaGFzZSk6CiAgICAgICAgIyBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrLyNpbi1jYXB0aW9uCiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSk6CiAgICAgICAgICAgIFBoYXNlLl9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSkKCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCJodG1sIiwgc2VsZi5zdGFydFRhZ0h0bWwpLAogICAgICAgICAgICAgICAgKCgiY2FwdGlvbiIsICJjb2wiLCAiY29sZ3JvdXAiLCAidGJvZHkiLCAidGQiLCAidGZvb3QiLCAidGgiLAogICAgICAgICAgICAgICAgICAidGhlYWQiLCAidHIiKSwgc2VsZi5zdGFydFRhZ1RhYmxlRWxlbWVudCkKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuc3RhcnRUYWdPdGhlcgoKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCJjYXB0aW9uIiwgc2VsZi5lbmRUYWdDYXB0aW9uKSwKICAgICAgICAgICAgICAgICgidGFibGUiLCBzZWxmLmVuZFRhZ1RhYmxlKSwKICAgICAgICAgICAgICAgICgoImJvZHkiLCAiY29sIiwgImNvbGdyb3VwIiwgImh0bWwiLCAidGJvZHkiLCAidGQiLCAidGZvb3QiLCAidGgiLAogICAgICAgICAgICAgICAgICAidGhlYWQiLCAidHIiKSwgc2VsZi5lbmRUYWdJZ25vcmUpCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5lbmRUYWdPdGhlcgoKICAgICAgICBkZWYgaWdub3JlRW5kVGFnQ2FwdGlvbihzZWxmKToKICAgICAgICAgICAgcmV0dXJuIG5vdCBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoImNhcHRpb24iLCB2YXJpYW50PSJ0YWJsZSIpCgogICAgICAgIGRlZiBwcm9jZXNzRU9GKHNlbGYpOgogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdLnByb2Nlc3NFT0YoKQoKICAgICAgICBkZWYgcHJvY2Vzc0NoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkJvZHkiXS5wcm9jZXNzQ2hhcmFjdGVycyh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnVGFibGVFbGVtZW50KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigpCiAgICAgICAgICAgICMgWFhYIEhhdmUgdG8gZHVwbGljYXRlIGxvZ2ljIGhlcmUgdG8gZmluZCBvdXQgaWYgdGhlIHRhZyBpcyBpZ25vcmVkCiAgICAgICAgICAgIGlnbm9yZUVuZFRhZyA9IHNlbGYuaWdub3JlRW5kVGFnQ2FwdGlvbigpCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlLnByb2Nlc3NFbmRUYWcoaW1wbGllZFRhZ1Rva2VuKCJjYXB0aW9uIikpCiAgICAgICAgICAgIGlmIG5vdCBpZ25vcmVFbmRUYWc6CiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIHN0YXJ0VGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkJvZHkiXS5wcm9jZXNzU3RhcnRUYWcodG9rZW4pCgogICAgICAgIGRlZiBlbmRUYWdDYXB0aW9uKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgbm90IHNlbGYuaWdub3JlRW5kVGFnQ2FwdGlvbigpOgogICAgICAgICAgICAgICAgIyBBVCB0aGlzIGNvZGUgaXMgcXVpdGUgc2ltaWxhciB0byBlbmRUYWdUYWJsZSBpbiAiSW5UYWJsZSIKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5nZW5lcmF0ZUltcGxpZWRFbmRUYWdzKCkKICAgICAgICAgICAgICAgIGlmIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgIT0gImNhcHRpb24iOgogICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoImV4cGVjdGVkLW9uZS1lbmQtdGFnLWJ1dC1nb3QtYW5vdGhlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ImdvdE5hbWUiOiAiY2FwdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkTmFtZSI6IHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWV9KQogICAgICAgICAgICAgICAgd2hpbGUgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSAhPSAiY2FwdGlvbiI6CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICAgICAgc2VsZi50cmVlLmNsZWFyQWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCkKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJpblRhYmxlIl0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgaW5uZXJIVE1MIGNhc2UKICAgICAgICAgICAgICAgIGFzc2VydCBzZWxmLnBhcnNlci5pbm5lckhUTUwKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoKQoKICAgICAgICBkZWYgZW5kVGFnVGFibGUoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCkKICAgICAgICAgICAgaWdub3JlRW5kVGFnID0gc2VsZi5pZ25vcmVFbmRUYWdDYXB0aW9uKCkKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UucHJvY2Vzc0VuZFRhZyhpbXBsaWVkVGFnVG9rZW4oImNhcHRpb24iKSkKICAgICAgICAgICAgaWYgbm90IGlnbm9yZUVuZFRhZzoKICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgZW5kVGFnSWdub3JlKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1lbmQtdGFnIiwgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCgogICAgICAgIGRlZiBlbmRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdLnByb2Nlc3NFbmRUYWcodG9rZW4pCgogICAgY2xhc3MgSW5Db2x1bW5Hcm91cFBoYXNlKFBoYXNlKToKICAgICAgICAjIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvI2luLWNvbHVtbgoKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKToKICAgICAgICAgICAgUGhhc2UuX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKQoKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoImh0bWwiLCBzZWxmLnN0YXJ0VGFnSHRtbCksCiAgICAgICAgICAgICAgICAoImNvbCIsIHNlbGYuc3RhcnRUYWdDb2wpCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLnN0YXJ0VGFnT3RoZXIKCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgiY29sZ3JvdXAiLCBzZWxmLmVuZFRhZ0NvbGdyb3VwKSwKICAgICAgICAgICAgICAgICgiY29sIiwgc2VsZi5lbmRUYWdDb2wpCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5lbmRUYWdPdGhlcgoKICAgICAgICBkZWYgaWdub3JlRW5kVGFnQ29sZ3JvdXAoc2VsZik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lID09ICJodG1sIgoKICAgICAgICBkZWYgcHJvY2Vzc0VPRihzZWxmKToKICAgICAgICAgICAgaWYgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSA9PSAiaHRtbCI6CiAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi5wYXJzZXIuaW5uZXJIVE1MCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlnbm9yZUVuZFRhZyA9IHNlbGYuaWdub3JlRW5kVGFnQ29sZ3JvdXAoKQogICAgICAgICAgICAgICAgc2VsZi5lbmRUYWdDb2xncm91cChpbXBsaWVkVGFnVG9rZW4oImNvbGdyb3VwIikpCiAgICAgICAgICAgICAgICBpZiBub3QgaWdub3JlRW5kVGFnOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgICAgIGRlZiBwcm9jZXNzQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlnbm9yZUVuZFRhZyA9IHNlbGYuaWdub3JlRW5kVGFnQ29sZ3JvdXAoKQogICAgICAgICAgICBzZWxmLmVuZFRhZ0NvbGdyb3VwKGltcGxpZWRUYWdUb2tlbigiY29sZ3JvdXAiKSkKICAgICAgICAgICAgaWYgbm90IGlnbm9yZUVuZFRhZzoKICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgc3RhcnRUYWdDb2woc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICB0b2tlblsic2VsZkNsb3NpbmdBY2tub3dsZWRnZWQiXSA9IFRydWUKCiAgICAgICAgZGVmIHN0YXJ0VGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZ25vcmVFbmRUYWcgPSBzZWxmLmlnbm9yZUVuZFRhZ0NvbGdyb3VwKCkKICAgICAgICAgICAgc2VsZi5lbmRUYWdDb2xncm91cChpbXBsaWVkVGFnVG9rZW4oImNvbGdyb3VwIikpCiAgICAgICAgICAgIGlmIG5vdCBpZ25vcmVFbmRUYWc6CiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIGVuZFRhZ0NvbGdyb3VwKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgc2VsZi5pZ25vcmVFbmRUYWdDb2xncm91cCgpOgogICAgICAgICAgICAgICAgIyBpbm5lckhUTUwgY2FzZQogICAgICAgICAgICAgICAgYXNzZXJ0IHNlbGYucGFyc2VyLmlubmVySFRNTAogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siaW5UYWJsZSJdCgogICAgICAgIGRlZiBlbmRUYWdDb2woc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJuby1lbmQtdGFnIiwgeyJuYW1lIjogImNvbCJ9KQoKICAgICAgICBkZWYgZW5kVGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZ25vcmVFbmRUYWcgPSBzZWxmLmlnbm9yZUVuZFRhZ0NvbGdyb3VwKCkKICAgICAgICAgICAgc2VsZi5lbmRUYWdDb2xncm91cChpbXBsaWVkVGFnVG9rZW4oImNvbGdyb3VwIikpCiAgICAgICAgICAgIGlmIG5vdCBpZ25vcmVFbmRUYWc6CiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICBjbGFzcyBJblRhYmxlQm9keVBoYXNlKFBoYXNlKToKICAgICAgICAjIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvI2luLXRhYmxlMAogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpOgogICAgICAgICAgICBQaGFzZS5fX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCJodG1sIiwgc2VsZi5zdGFydFRhZ0h0bWwpLAogICAgICAgICAgICAgICAgKCJ0ciIsIHNlbGYuc3RhcnRUYWdUciksCiAgICAgICAgICAgICAgICAoKCJ0ZCIsICJ0aCIpLCBzZWxmLnN0YXJ0VGFnVGFibGVDZWxsKSwKICAgICAgICAgICAgICAgICgoImNhcHRpb24iLCAiY29sIiwgImNvbGdyb3VwIiwgInRib2R5IiwgInRmb290IiwgInRoZWFkIiksCiAgICAgICAgICAgICAgICAgc2VsZi5zdGFydFRhZ1RhYmxlT3RoZXIpCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLnN0YXJ0VGFnT3RoZXIKCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgoInRib2R5IiwgInRmb290IiwgInRoZWFkIiksIHNlbGYuZW5kVGFnVGFibGVSb3dHcm91cCksCiAgICAgICAgICAgICAgICAoInRhYmxlIiwgc2VsZi5lbmRUYWdUYWJsZSksCiAgICAgICAgICAgICAgICAoKCJib2R5IiwgImNhcHRpb24iLCAiY29sIiwgImNvbGdyb3VwIiwgImh0bWwiLCAidGQiLCAidGgiLAogICAgICAgICAgICAgICAgICAidHIiKSwgc2VsZi5lbmRUYWdJZ25vcmUpCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5lbmRUYWdPdGhlcgoKICAgICAgICAjIGhlbHBlciBtZXRob2RzCiAgICAgICAgZGVmIGNsZWFyU3RhY2tUb1RhYmxlQm9keUNvbnRleHQoc2VsZik6CiAgICAgICAgICAgIHdoaWxlIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgbm90IGluICgidGJvZHkiLCAidGZvb3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZWFkIiwgImh0bWwiKToKICAgICAgICAgICAgICAgICMgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1pbXBsaWVkLWVuZC10YWctaW4tdGFibGUiLAogICAgICAgICAgICAgICAgIyAgeyJuYW1lIjogc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZX0pCiAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgPT0gImh0bWwiOgogICAgICAgICAgICAgICAgYXNzZXJ0IHNlbGYucGFyc2VyLmlubmVySFRNTAoKICAgICAgICAjIHRoZSByZXN0CiAgICAgICAgZGVmIHByb2Nlc3NFT0Yoc2VsZik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlc1siaW5UYWJsZSJdLnByb2Nlc3NFT0YoKQoKICAgICAgICBkZWYgcHJvY2Vzc1NwYWNlQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluVGFibGUiXS5wcm9jZXNzU3BhY2VDaGFyYWN0ZXJzKHRva2VuKQoKICAgICAgICBkZWYgcHJvY2Vzc0NoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpblRhYmxlIl0ucHJvY2Vzc0NoYXJhY3RlcnModG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ1RyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5jbGVhclN0YWNrVG9UYWJsZUJvZHlDb250ZXh0KCkKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJpblJvdyJdCgogICAgICAgIGRlZiBzdGFydFRhZ1RhYmxlQ2VsbChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtY2VsbC1pbi10YWJsZS1ib2R5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ1RyKGltcGxpZWRUYWdUb2tlbigidHIiLCAiU3RhcnRUYWciKSkKICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBzdGFydFRhZ1RhYmxlT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICAjIFhYWCBBVCBBbnkgaWRlYXMgb24gaG93IHRvIHNoYXJlIHRoaXMgd2l0aCBlbmRUYWdUYWJsZT8KICAgICAgICAgICAgaWYgKHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgidGJvZHkiLCB2YXJpYW50PSJ0YWJsZSIpIG9yCiAgICAgICAgICAgICAgICBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoInRoZWFkIiwgdmFyaWFudD0idGFibGUiKSBvcgogICAgICAgICAgICAgICAgICAgIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgidGZvb3QiLCB2YXJpYW50PSJ0YWJsZSIpKToKICAgICAgICAgICAgICAgIHNlbGYuY2xlYXJTdGFja1RvVGFibGVCb2R5Q29udGV4dCgpCiAgICAgICAgICAgICAgICBzZWxmLmVuZFRhZ1RhYmxlUm93R3JvdXAoCiAgICAgICAgICAgICAgICAgICAgaW1wbGllZFRhZ1Rva2VuKHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUpKQogICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIGlubmVySFRNTCBjYXNlCiAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi5wYXJzZXIuaW5uZXJIVE1MCiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCkKCiAgICAgICAgZGVmIHN0YXJ0VGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpblRhYmxlIl0ucHJvY2Vzc1N0YXJ0VGFnKHRva2VuKQoKICAgICAgICBkZWYgZW5kVGFnVGFibGVSb3dHcm91cChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSh0b2tlblsibmFtZSJdLCB2YXJpYW50PSJ0YWJsZSIpOgogICAgICAgICAgICAgICAgc2VsZi5jbGVhclN0YWNrVG9UYWJsZUJvZHlDb250ZXh0KCkKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJpblRhYmxlIl0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtZW5kLXRhZy1pbi10YWJsZS1ib2R5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCgogICAgICAgIGRlZiBlbmRUYWdUYWJsZShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIChzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoInRib2R5IiwgdmFyaWFudD0idGFibGUiKSBvcgogICAgICAgICAgICAgICAgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJ0aGVhZCIsIHZhcmlhbnQ9InRhYmxlIikgb3IKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoInRmb290IiwgdmFyaWFudD0idGFibGUiKSk6CiAgICAgICAgICAgICAgICBzZWxmLmNsZWFyU3RhY2tUb1RhYmxlQm9keUNvbnRleHQoKQogICAgICAgICAgICAgICAgc2VsZi5lbmRUYWdUYWJsZVJvd0dyb3VwKAogICAgICAgICAgICAgICAgICAgIGltcGxpZWRUYWdUb2tlbihzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lKSkKICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBpbm5lckhUTUwgY2FzZQogICAgICAgICAgICAgICAgYXNzZXJ0IHNlbGYucGFyc2VyLmlubmVySFRNTAogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigpCgogICAgICAgIGRlZiBlbmRUYWdJZ25vcmUoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWVuZC10YWctaW4tdGFibGUtYm9keSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCgogICAgICAgIGRlZiBlbmRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluVGFibGUiXS5wcm9jZXNzRW5kVGFnKHRva2VuKQoKICAgIGNsYXNzIEluUm93UGhhc2UoUGhhc2UpOgogICAgICAgICMgaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay8jaW4tcm93CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSk6CiAgICAgICAgICAgIFBoYXNlLl9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSkKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoImh0bWwiLCBzZWxmLnN0YXJ0VGFnSHRtbCksCiAgICAgICAgICAgICAgICAoKCJ0ZCIsICJ0aCIpLCBzZWxmLnN0YXJ0VGFnVGFibGVDZWxsKSwKICAgICAgICAgICAgICAgICgoImNhcHRpb24iLCAiY29sIiwgImNvbGdyb3VwIiwgInRib2R5IiwgInRmb290IiwgInRoZWFkIiwKICAgICAgICAgICAgICAgICAgInRyIiksIHNlbGYuc3RhcnRUYWdUYWJsZU90aGVyKQogICAgICAgICAgICBdKQogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5zdGFydFRhZ090aGVyCgogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoInRyIiwgc2VsZi5lbmRUYWdUciksCiAgICAgICAgICAgICAgICAoInRhYmxlIiwgc2VsZi5lbmRUYWdUYWJsZSksCiAgICAgICAgICAgICAgICAoKCJ0Ym9keSIsICJ0Zm9vdCIsICJ0aGVhZCIpLCBzZWxmLmVuZFRhZ1RhYmxlUm93R3JvdXApLAogICAgICAgICAgICAgICAgKCgiYm9keSIsICJjYXB0aW9uIiwgImNvbCIsICJjb2xncm91cCIsICJodG1sIiwgInRkIiwgInRoIiksCiAgICAgICAgICAgICAgICAgc2VsZi5lbmRUYWdJZ25vcmUpCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5lbmRUYWdPdGhlcgoKICAgICAgICAjIGhlbHBlciBtZXRob2RzIChYWFggdW5pZnkgdGhpcyB3aXRoIG90aGVyIHRhYmxlIGhlbHBlciBtZXRob2RzKQogICAgICAgIGRlZiBjbGVhclN0YWNrVG9UYWJsZVJvd0NvbnRleHQoc2VsZik6CiAgICAgICAgICAgIHdoaWxlIHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgbm90IGluICgidHIiLCAiaHRtbCIpOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1pbXBsaWVkLWVuZC10YWctaW4tdGFibGUtcm93IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZX0pCiAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCgogICAgICAgIGRlZiBpZ25vcmVFbmRUYWdUcihzZWxmKToKICAgICAgICAgICAgcmV0dXJuIG5vdCBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUoInRyIiwgdmFyaWFudD0idGFibGUiKQoKICAgICAgICAjIHRoZSByZXN0CiAgICAgICAgZGVmIHByb2Nlc3NFT0Yoc2VsZik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlc1siaW5UYWJsZSJdLnByb2Nlc3NFT0YoKQoKICAgICAgICBkZWYgcHJvY2Vzc1NwYWNlQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluVGFibGUiXS5wcm9jZXNzU3BhY2VDaGFyYWN0ZXJzKHRva2VuKQoKICAgICAgICBkZWYgcHJvY2Vzc0NoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpblRhYmxlIl0ucHJvY2Vzc0NoYXJhY3RlcnModG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ1RhYmxlQ2VsbChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYuY2xlYXJTdGFja1RvVGFibGVSb3dDb250ZXh0KCkKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkNlbGwiXQogICAgICAgICAgICBzZWxmLnRyZWUuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzLmFwcGVuZChNYXJrZXIpCgogICAgICAgIGRlZiBzdGFydFRhZ1RhYmxlT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZ25vcmVFbmRUYWcgPSBzZWxmLmlnbm9yZUVuZFRhZ1RyKCkKICAgICAgICAgICAgc2VsZi5lbmRUYWdUcihpbXBsaWVkVGFnVG9rZW4oInRyIikpCiAgICAgICAgICAgICMgWFhYIGhvdyBhcmUgd2Ugc3VyZSBpdCdzIGFsd2F5cyBpZ25vcmVkIGluIHRoZSBpbm5lckhUTUwgY2FzZT8KICAgICAgICAgICAgaWYgbm90IGlnbm9yZUVuZFRhZzoKICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgc3RhcnRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluVGFibGUiXS5wcm9jZXNzU3RhcnRUYWcodG9rZW4pCgogICAgICAgIGRlZiBlbmRUYWdUcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIG5vdCBzZWxmLmlnbm9yZUVuZFRhZ1RyKCk6CiAgICAgICAgICAgICAgICBzZWxmLmNsZWFyU3RhY2tUb1RhYmxlUm93Q29udGV4dCgpCiAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siaW5UYWJsZUJvZHkiXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBpbm5lckhUTUwgY2FzZQogICAgICAgICAgICAgICAgYXNzZXJ0IHNlbGYucGFyc2VyLmlubmVySFRNTAogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigpCgogICAgICAgIGRlZiBlbmRUYWdUYWJsZShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlnbm9yZUVuZFRhZyA9IHNlbGYuaWdub3JlRW5kVGFnVHIoKQogICAgICAgICAgICBzZWxmLmVuZFRhZ1RyKGltcGxpZWRUYWdUb2tlbigidHIiKSkKICAgICAgICAgICAgIyBSZXByb2Nlc3MgdGhlIGN1cnJlbnQgdGFnIGlmIHRoZSB0ciBlbmQgdGFnIHdhcyBub3QgaWdub3JlZAogICAgICAgICAgICAjIFhYWCBob3cgYXJlIHdlIHN1cmUgaXQncyBhbHdheXMgaWdub3JlZCBpbiB0aGUgaW5uZXJIVE1MIGNhc2U/CiAgICAgICAgICAgIGlmIG5vdCBpZ25vcmVFbmRUYWc6CiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIGVuZFRhZ1RhYmxlUm93R3JvdXAoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUodG9rZW5bIm5hbWUiXSwgdmFyaWFudD0idGFibGUiKToKICAgICAgICAgICAgICAgIHNlbGYuZW5kVGFnVHIoaW1wbGllZFRhZ1Rva2VuKCJ0ciIpKQogICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCkKCiAgICAgICAgZGVmIGVuZFRhZ0lnbm9yZShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtZW5kLXRhZy1pbi10YWJsZS1yb3ciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQoKICAgICAgICBkZWYgZW5kVGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpblRhYmxlIl0ucHJvY2Vzc0VuZFRhZyh0b2tlbikKCiAgICBjbGFzcyBJbkNlbGxQaGFzZShQaGFzZSk6CiAgICAgICAgIyBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrLyNpbi1jZWxsCiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSk6CiAgICAgICAgICAgIFBoYXNlLl9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSkKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoImh0bWwiLCBzZWxmLnN0YXJ0VGFnSHRtbCksCiAgICAgICAgICAgICAgICAoKCJjYXB0aW9uIiwgImNvbCIsICJjb2xncm91cCIsICJ0Ym9keSIsICJ0ZCIsICJ0Zm9vdCIsICJ0aCIsCiAgICAgICAgICAgICAgICAgICJ0aGVhZCIsICJ0ciIpLCBzZWxmLnN0YXJ0VGFnVGFibGVPdGhlcikKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuc3RhcnRUYWdPdGhlcgoKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCgidGQiLCAidGgiKSwgc2VsZi5lbmRUYWdUYWJsZUNlbGwpLAogICAgICAgICAgICAgICAgKCgiYm9keSIsICJjYXB0aW9uIiwgImNvbCIsICJjb2xncm91cCIsICJodG1sIiksIHNlbGYuZW5kVGFnSWdub3JlKSwKICAgICAgICAgICAgICAgICgoInRhYmxlIiwgInRib2R5IiwgInRmb290IiwgInRoZWFkIiwgInRyIiksIHNlbGYuZW5kVGFnSW1wbHkpCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5lbmRUYWdPdGhlcgoKICAgICAgICAjIGhlbHBlcgogICAgICAgIGRlZiBjbG9zZUNlbGwoc2VsZik6CiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgidGQiLCB2YXJpYW50PSJ0YWJsZSIpOgogICAgICAgICAgICAgICAgc2VsZi5lbmRUYWdUYWJsZUNlbGwoaW1wbGllZFRhZ1Rva2VuKCJ0ZCIpKQogICAgICAgICAgICBlbGlmIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgidGgiLCB2YXJpYW50PSJ0YWJsZSIpOgogICAgICAgICAgICAgICAgc2VsZi5lbmRUYWdUYWJsZUNlbGwoaW1wbGllZFRhZ1Rva2VuKCJ0aCIpKQoKICAgICAgICAjIHRoZSByZXN0CiAgICAgICAgZGVmIHByb2Nlc3NFT0Yoc2VsZik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlc1siaW5Cb2R5Il0ucHJvY2Vzc0VPRigpCgogICAgICAgIGRlZiBwcm9jZXNzQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdLnByb2Nlc3NDaGFyYWN0ZXJzKHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdUYWJsZU90aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgKHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgidGQiLCB2YXJpYW50PSJ0YWJsZSIpIG9yCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJ0aCIsIHZhcmlhbnQ9InRhYmxlIikpOgogICAgICAgICAgICAgICAgc2VsZi5jbG9zZUNlbGwoKQogICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIGlubmVySFRNTCBjYXNlCiAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi5wYXJzZXIuaW5uZXJIVE1MCiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCkKCiAgICAgICAgZGVmIHN0YXJ0VGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkJvZHkiXS5wcm9jZXNzU3RhcnRUYWcodG9rZW4pCgogICAgICAgIGRlZiBlbmRUYWdUYWJsZUNlbGwoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiBzZWxmLnRyZWUuZWxlbWVudEluU2NvcGUodG9rZW5bIm5hbWUiXSwgdmFyaWFudD0idGFibGUiKToKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5nZW5lcmF0ZUltcGxpZWRFbmRUYWdzKHRva2VuWyJuYW1lIl0pCiAgICAgICAgICAgICAgICBpZiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lICE9IHRva2VuWyJuYW1lIl06CiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1jZWxsLWVuZC10YWciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCiAgICAgICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm9kZS5uYW1lID09IHRva2VuWyJuYW1lIl06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgICAgICBzZWxmLnRyZWUuY2xlYXJBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMoKQogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImluUm93Il0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtZW5kLXRhZyIsIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQoKICAgICAgICBkZWYgZW5kVGFnSWdub3JlKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1lbmQtdGFnIiwgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCgogICAgICAgIGRlZiBlbmRUYWdJbXBseShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSh0b2tlblsibmFtZSJdLCB2YXJpYW50PSJ0YWJsZSIpOgogICAgICAgICAgICAgICAgc2VsZi5jbG9zZUNlbGwoKQogICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIHNvbWV0aW1lcyBpbm5lckhUTUwgY2FzZQogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigpCgogICAgICAgIGRlZiBlbmRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdLnByb2Nlc3NFbmRUYWcodG9rZW4pCgogICAgY2xhc3MgSW5TZWxlY3RQaGFzZShQaGFzZSk6CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSk6CiAgICAgICAgICAgIFBoYXNlLl9faW5pdF9fKHNlbGYsIHBhcnNlciwgdHJlZSkKCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyID0gX3V0aWxzLk1ldGhvZERpc3BhdGNoZXIoWwogICAgICAgICAgICAgICAgKCJodG1sIiwgc2VsZi5zdGFydFRhZ0h0bWwpLAogICAgICAgICAgICAgICAgKCJvcHRpb24iLCBzZWxmLnN0YXJ0VGFnT3B0aW9uKSwKICAgICAgICAgICAgICAgICgib3B0Z3JvdXAiLCBzZWxmLnN0YXJ0VGFnT3B0Z3JvdXApLAogICAgICAgICAgICAgICAgKCJzZWxlY3QiLCBzZWxmLnN0YXJ0VGFnU2VsZWN0KSwKICAgICAgICAgICAgICAgICgoImlucHV0IiwgImtleWdlbiIsICJ0ZXh0YXJlYSIpLCBzZWxmLnN0YXJ0VGFnSW5wdXQpLAogICAgICAgICAgICAgICAgKCJzY3JpcHQiLCBzZWxmLnN0YXJ0VGFnU2NyaXB0KQogICAgICAgICAgICBdKQogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5zdGFydFRhZ090aGVyCgogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoIm9wdGlvbiIsIHNlbGYuZW5kVGFnT3B0aW9uKSwKICAgICAgICAgICAgICAgICgib3B0Z3JvdXAiLCBzZWxmLmVuZFRhZ09wdGdyb3VwKSwKICAgICAgICAgICAgICAgICgic2VsZWN0Iiwgc2VsZi5lbmRUYWdTZWxlY3QpCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5lbmRUYWdPdGhlcgoKICAgICAgICAjIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvI2luLXNlbGVjdAogICAgICAgIGRlZiBwcm9jZXNzRU9GKHNlbGYpOgogICAgICAgICAgICBpZiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lICE9ICJodG1sIjoKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoImVvZi1pbi1zZWxlY3QiKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYXNzZXJ0IHNlbGYucGFyc2VyLmlubmVySFRNTAoKICAgICAgICBkZWYgcHJvY2Vzc0NoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiB0b2tlblsiZGF0YSJdID09ICJcdTAwMDAiOgogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRUZXh0KHRva2VuWyJkYXRhIl0pCgogICAgICAgIGRlZiBzdGFydFRhZ09wdGlvbihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgICMgV2UgbmVlZCB0byBpbXBseSA8L29wdGlvbj4gaWYgPG9wdGlvbj4gaXMgdGhlIGN1cnJlbnQgbm9kZS4KICAgICAgICAgICAgaWYgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSA9PSAib3B0aW9uIjoKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ09wdGdyb3VwKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSA9PSAib3B0aW9uIjoKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgaWYgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSA9PSAib3B0Z3JvdXAiOgogICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0RWxlbWVudCh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnU2VsZWN0KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1zZWxlY3QtaW4tc2VsZWN0IikKICAgICAgICAgICAgc2VsZi5lbmRUYWdTZWxlY3QoaW1wbGllZFRhZ1Rva2VuKCJzZWxlY3QiKSkKCiAgICAgICAgZGVmIHN0YXJ0VGFnSW5wdXQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWlucHV0LWluLXNlbGVjdCIpCiAgICAgICAgICAgIGlmIHNlbGYudHJlZS5lbGVtZW50SW5TY29wZSgic2VsZWN0IiwgdmFyaWFudD0ic2VsZWN0Iik6CiAgICAgICAgICAgICAgICBzZWxmLmVuZFRhZ1NlbGVjdChpbXBsaWVkVGFnVG9rZW4oInNlbGVjdCIpKQogICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi5wYXJzZXIuaW5uZXJIVE1MCgogICAgICAgIGRlZiBzdGFydFRhZ1NjcmlwdChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluSGVhZCJdLnByb2Nlc3NTdGFydFRhZyh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLXN0YXJ0LXRhZy1pbi1zZWxlY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQoKICAgICAgICBkZWYgZW5kVGFnT3B0aW9uKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSA9PSAib3B0aW9uIjoKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtZW5kLXRhZy1pbi1zZWxlY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiAib3B0aW9uIn0pCgogICAgICAgIGRlZiBlbmRUYWdPcHRncm91cChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgICMgPC9vcHRncm91cD4gaW1wbGljaXRseSBjbG9zZXMgPG9wdGlvbj4KICAgICAgICAgICAgaWYgKHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWUgPT0gIm9wdGlvbiIgYW5kCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMl0ubmFtZSA9PSAib3B0Z3JvdXAiKToKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgIyBJdCBhbHNvIGNsb3NlcyA8L29wdGdyb3VwPgogICAgICAgICAgICBpZiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lID09ICJvcHRncm91cCI6CiAgICAgICAgICAgICAgICBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgICMgQnV0IG5vdGhpbmcgZWxzZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1lbmQtdGFnLWluLXNlbGVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6ICJvcHRncm91cCJ9KQoKICAgICAgICBkZWYgZW5kVGFnU2VsZWN0KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgaWYgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKCJzZWxlY3QiLCB2YXJpYW50PSJzZWxlY3QiKToKICAgICAgICAgICAgICAgIG5vZGUgPSBzZWxmLnRyZWUub3BlbkVsZW1lbnRzLnBvcCgpCiAgICAgICAgICAgICAgICB3aGlsZSBub2RlLm5hbWUgIT0gInNlbGVjdCI6CiAgICAgICAgICAgICAgICAgICAgbm9kZSA9IHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnJlc2V0SW5zZXJ0aW9uTW9kZSgpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIGlubmVySFRNTCBjYXNlCiAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi5wYXJzZXIuaW5uZXJIVE1MCiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCkKCiAgICAgICAgZGVmIGVuZFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1lbmQtdGFnLWluLXNlbGVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCgogICAgY2xhc3MgSW5TZWxlY3RJblRhYmxlUGhhc2UoUGhhc2UpOgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpOgogICAgICAgICAgICBQaGFzZS5fX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpCgogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgoImNhcHRpb24iLCAidGFibGUiLCAidGJvZHkiLCAidGZvb3QiLCAidGhlYWQiLCAidHIiLCAidGQiLCAidGgiKSwKICAgICAgICAgICAgICAgICBzZWxmLnN0YXJ0VGFnVGFibGUpCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLnN0YXJ0VGFnT3RoZXIKCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgoImNhcHRpb24iLCAidGFibGUiLCAidGJvZHkiLCAidGZvb3QiLCAidGhlYWQiLCAidHIiLCAidGQiLCAidGgiKSwKICAgICAgICAgICAgICAgICBzZWxmLmVuZFRhZ1RhYmxlKQogICAgICAgICAgICBdKQogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuZW5kVGFnT3RoZXIKCiAgICAgICAgZGVmIHByb2Nlc3NFT0Yoc2VsZik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlc1siaW5TZWxlY3QiXS5wcm9jZXNzRU9GKCkKCiAgICAgICAgZGVmIHByb2Nlc3NDaGFyYWN0ZXJzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5TZWxlY3QiXS5wcm9jZXNzQ2hhcmFjdGVycyh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnVGFibGUoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLXRhYmxlLWVsZW1lbnQtc3RhcnQtdGFnLWluLXNlbGVjdC1pbi10YWJsZSIsIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQogICAgICAgICAgICBzZWxmLmVuZFRhZ090aGVyKGltcGxpZWRUYWdUb2tlbigic2VsZWN0IikpCiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgc3RhcnRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluU2VsZWN0Il0ucHJvY2Vzc1N0YXJ0VGFnKHRva2VuKQoKICAgICAgICBkZWYgZW5kVGFnVGFibGUoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLXRhYmxlLWVsZW1lbnQtZW5kLXRhZy1pbi1zZWxlY3QtaW4tdGFibGUiLCB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKICAgICAgICAgICAgaWYgc2VsZi50cmVlLmVsZW1lbnRJblNjb3BlKHRva2VuWyJuYW1lIl0sIHZhcmlhbnQ9InRhYmxlIik6CiAgICAgICAgICAgICAgICBzZWxmLmVuZFRhZ090aGVyKGltcGxpZWRUYWdUb2tlbigic2VsZWN0IikpCiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIGVuZFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5TZWxlY3QiXS5wcm9jZXNzRW5kVGFnKHRva2VuKQoKICAgIGNsYXNzIEluRm9yZWlnbkNvbnRlbnRQaGFzZShQaGFzZSk6CiAgICAgICAgYnJlYWtvdXRFbGVtZW50cyA9IGZyb3plbnNldChbImIiLCAiYmlnIiwgImJsb2NrcXVvdGUiLCAiYm9keSIsICJiciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNlbnRlciIsICJjb2RlIiwgImRkIiwgImRpdiIsICJkbCIsICJkdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVtIiwgImVtYmVkIiwgImgxIiwgImgyIiwgImgzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaDQiLCAiaDUiLCAiaDYiLCAiaGVhZCIsICJociIsICJpIiwgImltZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpIiwgImxpc3RpbmciLCAibWVudSIsICJtZXRhIiwgIm5vYnIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvbCIsICJwIiwgInByZSIsICJydWJ5IiwgInMiLCAic21hbGwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcGFuIiwgInN0cm9uZyIsICJzdHJpa2UiLCAic3ViIiwgInN1cCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhYmxlIiwgInR0IiwgInUiLCAidWwiLCAidmFyIl0pCgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpOgogICAgICAgICAgICBQaGFzZS5fX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpCgogICAgICAgIGRlZiBhZGp1c3RTVkdUYWdOYW1lcyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJlcGxhY2VtZW50cyA9IHsiYWx0Z2x5cGgiOiAiYWx0R2x5cGgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFsdGdseXBoZGVmIjogImFsdEdseXBoRGVmIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbHRnbHlwaGl0ZW0iOiAiYWx0R2x5cGhJdGVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmltYXRlY29sb3IiOiAiYW5pbWF0ZUNvbG9yIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmltYXRlbW90aW9uIjogImFuaW1hdGVNb3Rpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuaW1hdGV0cmFuc2Zvcm0iOiAiYW5pbWF0ZVRyYW5zZm9ybSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xpcHBhdGgiOiAiY2xpcFBhdGgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImZlYmxlbmQiOiAiZmVCbGVuZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmVjb2xvcm1hdHJpeCI6ICJmZUNvbG9yTWF0cml4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZWNvbXBvbmVudHRyYW5zZmVyIjogImZlQ29tcG9uZW50VHJhbnNmZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImZlY29tcG9zaXRlIjogImZlQ29tcG9zaXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZWNvbnZvbHZlbWF0cml4IjogImZlQ29udm9sdmVNYXRyaXgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImZlZGlmZnVzZWxpZ2h0aW5nIjogImZlRGlmZnVzZUxpZ2h0aW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZWRpc3BsYWNlbWVudG1hcCI6ICJmZURpc3BsYWNlbWVudE1hcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmVkaXN0YW50bGlnaHQiOiAiZmVEaXN0YW50TGlnaHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImZlZmxvb2QiOiAiZmVGbG9vZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmVmdW5jYSI6ICJmZUZ1bmNBIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZWZ1bmNiIjogImZlRnVuY0IiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImZlZnVuY2ciOiAiZmVGdW5jRyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmVmdW5jciI6ICJmZUZ1bmNSIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZWdhdXNzaWFuYmx1ciI6ICJmZUdhdXNzaWFuQmx1ciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmVpbWFnZSI6ICJmZUltYWdlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZW1lcmdlIjogImZlTWVyZ2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImZlbWVyZ2Vub2RlIjogImZlTWVyZ2VOb2RlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZW1vcnBob2xvZ3kiOiAiZmVNb3JwaG9sb2d5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZW9mZnNldCI6ICJmZU9mZnNldCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmVwb2ludGxpZ2h0IjogImZlUG9pbnRMaWdodCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmVzcGVjdWxhcmxpZ2h0aW5nIjogImZlU3BlY3VsYXJMaWdodGluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmVzcG90bGlnaHQiOiAiZmVTcG90TGlnaHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImZldGlsZSI6ICJmZVRpbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImZldHVyYnVsZW5jZSI6ICJmZVR1cmJ1bGVuY2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvcmVpZ25vYmplY3QiOiAiZm9yZWlnbk9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2x5cGhyZWYiOiAiZ2x5cGhSZWYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpbmVhcmdyYWRpZW50IjogImxpbmVhckdyYWRpZW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyYWRpYWxncmFkaWVudCI6ICJyYWRpYWxHcmFkaWVudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dHBhdGgiOiAidGV4dFBhdGgifQoKICAgICAgICAgICAgaWYgdG9rZW5bIm5hbWUiXSBpbiByZXBsYWNlbWVudHM6CiAgICAgICAgICAgICAgICB0b2tlblsibmFtZSJdID0gcmVwbGFjZW1lbnRzW3Rva2VuWyJuYW1lIl1dCgogICAgICAgIGRlZiBwcm9jZXNzQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIGlmIHRva2VuWyJkYXRhIl0gPT0gIlx1MDAwMCI6CiAgICAgICAgICAgICAgICB0b2tlblsiZGF0YSJdID0gIlx1RkZGRCIKICAgICAgICAgICAgZWxpZiAoc2VsZi5wYXJzZXIuZnJhbWVzZXRPSyBhbmQKICAgICAgICAgICAgICAgICAgYW55KGNoYXIgbm90IGluIHNwYWNlQ2hhcmFjdGVycyBmb3IgY2hhciBpbiB0b2tlblsiZGF0YSJdKSk6CiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5mcmFtZXNldE9LID0gRmFsc2UKICAgICAgICAgICAgUGhhc2UucHJvY2Vzc0NoYXJhY3RlcnMoc2VsZiwgdG9rZW4pCgogICAgICAgIGRlZiBwcm9jZXNzU3RhcnRUYWcoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBjdXJyZW50Tm9kZSA9IHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdCiAgICAgICAgICAgIGlmICh0b2tlblsibmFtZSJdIGluIHNlbGYuYnJlYWtvdXRFbGVtZW50cyBvcgogICAgICAgICAgICAgICAgKHRva2VuWyJuYW1lIl0gPT0gImZvbnQiIGFuZAogICAgICAgICAgICAgICAgIHNldCh0b2tlblsiZGF0YSJdLmtleXMoKSkgJiBzZXQoWyJjb2xvciIsICJmYWNlIiwgInNpemUiXSkpKToKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtaHRtbC1lbGVtZW50LWluLWZvcmVpZ24tY29udGVudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQogICAgICAgICAgICAgICAgd2hpbGUgKHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdLm5hbWVzcGFjZSAhPQogICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJlZS5kZWZhdWx0TmFtZXNwYWNlIGFuZAogICAgICAgICAgICAgICAgICAgICAgIG5vdCBzZWxmLnBhcnNlci5pc0hUTUxJbnRlZ3JhdGlvblBvaW50KHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdKSBhbmQKICAgICAgICAgICAgICAgICAgICAgICBub3Qgc2VsZi5wYXJzZXIuaXNNYXRoTUxUZXh0SW50ZWdyYXRpb25Qb2ludChzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXSkpOgogICAgICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlmIGN1cnJlbnROb2RlLm5hbWVzcGFjZSA9PSBuYW1lc3BhY2VzWyJtYXRobWwiXToKICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5hZGp1c3RNYXRoTUxBdHRyaWJ1dGVzKHRva2VuKQogICAgICAgICAgICAgICAgZWxpZiBjdXJyZW50Tm9kZS5uYW1lc3BhY2UgPT0gbmFtZXNwYWNlc1sic3ZnIl06CiAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGp1c3RTVkdUYWdOYW1lcyh0b2tlbikKICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5hZGp1c3RTVkdBdHRyaWJ1dGVzKHRva2VuKQogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIuYWRqdXN0Rm9yZWlnbkF0dHJpYnV0ZXModG9rZW4pCiAgICAgICAgICAgICAgICB0b2tlblsibmFtZXNwYWNlIl0gPSBjdXJyZW50Tm9kZS5uYW1lc3BhY2UKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRFbGVtZW50KHRva2VuKQogICAgICAgICAgICAgICAgaWYgdG9rZW5bInNlbGZDbG9zaW5nIl06CiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICAgICAgICAgIHRva2VuWyJzZWxmQ2xvc2luZ0Fja25vd2xlZGdlZCJdID0gVHJ1ZQoKICAgICAgICBkZWYgcHJvY2Vzc0VuZFRhZyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIG5vZGVJbmRleCA9IGxlbihzZWxmLnRyZWUub3BlbkVsZW1lbnRzKSAtIDEKICAgICAgICAgICAgbm9kZSA9IHNlbGYudHJlZS5vcGVuRWxlbWVudHNbLTFdCiAgICAgICAgICAgIGlmIG5vZGUubmFtZS50cmFuc2xhdGUoYXNjaWlVcHBlcjJMb3dlcikgIT0gdG9rZW5bIm5hbWUiXToKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtZW5kLXRhZyIsIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQoKICAgICAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgICAgIGlmIG5vZGUubmFtZS50cmFuc2xhdGUoYXNjaWlVcHBlcjJMb3dlcikgPT0gdG9rZW5bIm5hbWUiXToKICAgICAgICAgICAgICAgICAgICAjIFhYWCB0aGlzIGlzbid0IGluIHRoZSBzcGVjIGJ1dCBpdCBzZWVtcyBuZWNlc3NhcnkKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnBhcnNlci5waGFzZSA9PSBzZWxmLnBhcnNlci5waGFzZXNbImluVGFibGVUZXh0Il06CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlLmZsdXNoQ2hhcmFjdGVycygpCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2Uub3JpZ2luYWxQaGFzZQogICAgICAgICAgICAgICAgICAgIHdoaWxlIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkgIT0gbm9kZToKICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHNlbGYudHJlZS5vcGVuRWxlbWVudHMKICAgICAgICAgICAgICAgICAgICBuZXdfdG9rZW4gPSBOb25lCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIG5vZGVJbmRleCAtPSAxCgogICAgICAgICAgICAgICAgbm9kZSA9IHNlbGYudHJlZS5vcGVuRWxlbWVudHNbbm9kZUluZGV4XQogICAgICAgICAgICAgICAgaWYgbm9kZS5uYW1lc3BhY2UgIT0gc2VsZi50cmVlLmRlZmF1bHROYW1lc3BhY2U6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbmV3X3Rva2VuID0gc2VsZi5wYXJzZXIucGhhc2UucHJvY2Vzc0VuZFRhZyh0b2tlbikKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICByZXR1cm4gbmV3X3Rva2VuCgogICAgY2xhc3MgQWZ0ZXJCb2R5UGhhc2UoUGhhc2UpOgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpOgogICAgICAgICAgICBQaGFzZS5fX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpCgogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgiaHRtbCIsIHNlbGYuc3RhcnRUYWdIdG1sKQogICAgICAgICAgICBdKQogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5zdGFydFRhZ090aGVyCgogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbKCJodG1sIiwgc2VsZi5lbmRUYWdIdG1sKV0pCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5lbmRUYWdPdGhlcgoKICAgICAgICBkZWYgcHJvY2Vzc0VPRihzZWxmKToKICAgICAgICAgICAgIyBTdG9wIHBhcnNpbmcKICAgICAgICAgICAgcGFzcwoKICAgICAgICBkZWYgcHJvY2Vzc0NvbW1lbnQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICAjIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgZGF0YSBpcyB0byBiZSBhcHBlbmRlZCB0byB0aGUgPGh0bWw+IGVsZW1lbnQKICAgICAgICAgICAgIyBoZXJlIGFuZCBub3QgdG8gd2hhdGV2ZXIgaXMgY3VycmVudGx5IG9wZW4uCiAgICAgICAgICAgIHNlbGYudHJlZS5pbnNlcnRDb21tZW50KHRva2VuLCBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWzBdKQoKICAgICAgICBkZWYgcHJvY2Vzc0NoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLWNoYXItYWZ0ZXItYm9keSIpCiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkJvZHkiXQogICAgICAgICAgICByZXR1cm4gdG9rZW4KCiAgICAgICAgZGVmIHN0YXJ0VGFnSHRtbChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdLnByb2Nlc3NTdGFydFRhZyh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnT3RoZXIoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJ1bmV4cGVjdGVkLXN0YXJ0LXRhZy1hZnRlci1ib2R5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdCiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgZW5kVGFnSHRtbChzZWxmLCBuYW1lKToKICAgICAgICAgICAgaWYgc2VsZi5wYXJzZXIuaW5uZXJIVE1MOgogICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1lbmQtdGFnLWFmdGVyLWJvZHktaW5uZXJodG1sIikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBoYXNlID0gc2VsZi5wYXJzZXIucGhhc2VzWyJhZnRlckFmdGVyQm9keSJdCgogICAgICAgIGRlZiBlbmRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtZW5kLXRhZy1hZnRlci1ib2R5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdCiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgIGNsYXNzIEluRnJhbWVzZXRQaGFzZShQaGFzZSk6CiAgICAgICAgIyBodHRwOi8vd3d3LndoYXR3Zy5vcmcvc3BlY3Mvd2ViLWFwcHMvY3VycmVudC13b3JrLyNpbi1mcmFtZXNldAogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpOgogICAgICAgICAgICBQaGFzZS5fX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpCgogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgiaHRtbCIsIHNlbGYuc3RhcnRUYWdIdG1sKSwKICAgICAgICAgICAgICAgICgiZnJhbWVzZXQiLCBzZWxmLnN0YXJ0VGFnRnJhbWVzZXQpLAogICAgICAgICAgICAgICAgKCJmcmFtZSIsIHNlbGYuc3RhcnRUYWdGcmFtZSksCiAgICAgICAgICAgICAgICAoIm5vZnJhbWVzIiwgc2VsZi5zdGFydFRhZ05vZnJhbWVzKQogICAgICAgICAgICBdKQogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlci5kZWZhdWx0ID0gc2VsZi5zdGFydFRhZ090aGVyCgogICAgICAgICAgICBzZWxmLmVuZFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoImZyYW1lc2V0Iiwgc2VsZi5lbmRUYWdGcmFtZXNldCkKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLmVuZFRhZ090aGVyCgogICAgICAgIGRlZiBwcm9jZXNzRU9GKHNlbGYpOgogICAgICAgICAgICBpZiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lICE9ICJodG1sIjoKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoImVvZi1pbi1mcmFtZXNldCIpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi5wYXJzZXIuaW5uZXJIVE1MCgogICAgICAgIGRlZiBwcm9jZXNzQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtY2hhci1pbi1mcmFtZXNldCIpCgogICAgICAgIGRlZiBzdGFydFRhZ0ZyYW1lc2V0KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ0ZyYW1lKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydEVsZW1lbnQodG9rZW4pCiAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKCiAgICAgICAgZGVmIHN0YXJ0VGFnTm9mcmFtZXMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkJvZHkiXS5wcm9jZXNzU3RhcnRUYWcodG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1zdGFydC10YWctaW4tZnJhbWVzZXQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQoKICAgICAgICBkZWYgZW5kVGFnRnJhbWVzZXQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBpZiBzZWxmLnRyZWUub3BlbkVsZW1lbnRzWy0xXS5uYW1lID09ICJodG1sIjoKICAgICAgICAgICAgICAgICMgaW5uZXJIVE1MIGNhc2UKICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtZnJhbWVzZXQtaW4tZnJhbWVzZXQtaW5uZXJodG1sIikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYudHJlZS5vcGVuRWxlbWVudHMucG9wKCkKICAgICAgICAgICAgaWYgKG5vdCBzZWxmLnBhcnNlci5pbm5lckhUTUwgYW5kCiAgICAgICAgICAgICAgICAgICAgc2VsZi50cmVlLm9wZW5FbGVtZW50c1stMV0ubmFtZSAhPSAiZnJhbWVzZXQiKToKICAgICAgICAgICAgICAgICMgSWYgd2UncmUgbm90IGluIGlubmVySFRNTCBtb2RlIGFuZCB0aGUgY3VycmVudCBub2RlIGlzIG5vdCBhCiAgICAgICAgICAgICAgICAjICJmcmFtZXNldCIgZWxlbWVudCAoYW55bW9yZSkgdGhlbiBzd2l0Y2guCiAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siYWZ0ZXJGcmFtZXNldCJdCgogICAgICAgIGRlZiBlbmRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtZW5kLXRhZy1pbi1mcmFtZXNldCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogdG9rZW5bIm5hbWUiXX0pCgogICAgY2xhc3MgQWZ0ZXJGcmFtZXNldFBoYXNlKFBoYXNlKToKICAgICAgICAjIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvI2FmdGVyMwogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpOgogICAgICAgICAgICBQaGFzZS5fX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpCgogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgiaHRtbCIsIHNlbGYuc3RhcnRUYWdIdG1sKSwKICAgICAgICAgICAgICAgICgibm9mcmFtZXMiLCBzZWxmLnN0YXJ0VGFnTm9mcmFtZXMpCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLnN0YXJ0VGFnT3RoZXIKCiAgICAgICAgICAgIHNlbGYuZW5kVGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgiaHRtbCIsIHNlbGYuZW5kVGFnSHRtbCkKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5lbmRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLmVuZFRhZ090aGVyCgogICAgICAgIGRlZiBwcm9jZXNzRU9GKHNlbGYpOgogICAgICAgICAgICAjIFN0b3AgcGFyc2luZwogICAgICAgICAgICBwYXNzCgogICAgICAgIGRlZiBwcm9jZXNzQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtY2hhci1hZnRlci1mcmFtZXNldCIpCgogICAgICAgIGRlZiBzdGFydFRhZ05vZnJhbWVzKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VyLnBoYXNlc1siaW5IZWFkIl0ucHJvY2Vzc1N0YXJ0VGFnKHRva2VuKQoKICAgICAgICBkZWYgc3RhcnRUYWdPdGhlcihzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoInVuZXhwZWN0ZWQtc3RhcnQtdGFnLWFmdGVyLWZyYW1lc2V0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKCiAgICAgICAgZGVmIGVuZFRhZ0h0bWwoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siYWZ0ZXJBZnRlckZyYW1lc2V0Il0KCiAgICAgICAgZGVmIGVuZFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigidW5leHBlY3RlZC1lbmQtdGFnLWFmdGVyLWZyYW1lc2V0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKCiAgICBjbGFzcyBBZnRlckFmdGVyQm9keVBoYXNlKFBoYXNlKToKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKToKICAgICAgICAgICAgUGhhc2UuX19pbml0X18oc2VsZiwgcGFyc2VyLCB0cmVlKQoKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIgPSBfdXRpbHMuTWV0aG9kRGlzcGF0Y2hlcihbCiAgICAgICAgICAgICAgICAoImh0bWwiLCBzZWxmLnN0YXJ0VGFnSHRtbCkKICAgICAgICAgICAgXSkKICAgICAgICAgICAgc2VsZi5zdGFydFRhZ0hhbmRsZXIuZGVmYXVsdCA9IHNlbGYuc3RhcnRUYWdPdGhlcgoKICAgICAgICBkZWYgcHJvY2Vzc0VPRihzZWxmKToKICAgICAgICAgICAgcGFzcwoKICAgICAgICBkZWYgcHJvY2Vzc0NvbW1lbnQoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnRyZWUuaW5zZXJ0Q29tbWVudCh0b2tlbiwgc2VsZi50cmVlLmRvY3VtZW50KQoKICAgICAgICBkZWYgcHJvY2Vzc1NwYWNlQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdLnByb2Nlc3NTcGFjZUNoYXJhY3RlcnModG9rZW4pCgogICAgICAgIGRlZiBwcm9jZXNzQ2hhcmFjdGVycyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoImV4cGVjdGVkLWVvZi1idXQtZ290LWNoYXIiKQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siaW5Cb2R5Il0KICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgICAgIGRlZiBzdGFydFRhZ0h0bWwoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkJvZHkiXS5wcm9jZXNzU3RhcnRUYWcodG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigiZXhwZWN0ZWQtZW9mLWJ1dC1nb3Qtc3RhcnQtdGFnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGhhc2UgPSBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdCiAgICAgICAgICAgIHJldHVybiB0b2tlbgoKICAgICAgICBkZWYgcHJvY2Vzc0VuZFRhZyhzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlRXJyb3IoImV4cGVjdGVkLWVvZi1idXQtZ290LWVuZC10YWciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6IHRva2VuWyJuYW1lIl19KQogICAgICAgICAgICBzZWxmLnBhcnNlci5waGFzZSA9IHNlbGYucGFyc2VyLnBoYXNlc1siaW5Cb2R5Il0KICAgICAgICAgICAgcmV0dXJuIHRva2VuCgogICAgY2xhc3MgQWZ0ZXJBZnRlckZyYW1lc2V0UGhhc2UoUGhhc2UpOgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpOgogICAgICAgICAgICBQaGFzZS5fX2luaXRfXyhzZWxmLCBwYXJzZXIsIHRyZWUpCgogICAgICAgICAgICBzZWxmLnN0YXJ0VGFnSGFuZGxlciA9IF91dGlscy5NZXRob2REaXNwYXRjaGVyKFsKICAgICAgICAgICAgICAgICgiaHRtbCIsIHNlbGYuc3RhcnRUYWdIdG1sKSwKICAgICAgICAgICAgICAgICgibm9mcmFtZXMiLCBzZWxmLnN0YXJ0VGFnTm9GcmFtZXMpCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIHNlbGYuc3RhcnRUYWdIYW5kbGVyLmRlZmF1bHQgPSBzZWxmLnN0YXJ0VGFnT3RoZXIKCiAgICAgICAgZGVmIHByb2Nlc3NFT0Yoc2VsZik6CiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgZGVmIHByb2Nlc3NDb21tZW50KHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi50cmVlLmluc2VydENvbW1lbnQodG9rZW4sIHNlbGYudHJlZS5kb2N1bWVudCkKCiAgICAgICAgZGVmIHByb2Nlc3NTcGFjZUNoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkJvZHkiXS5wcm9jZXNzU3BhY2VDaGFyYWN0ZXJzKHRva2VuKQoKICAgICAgICBkZWYgcHJvY2Vzc0NoYXJhY3RlcnMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJleHBlY3RlZC1lb2YtYnV0LWdvdC1jaGFyIikKCiAgICAgICAgZGVmIHN0YXJ0VGFnSHRtbChzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5waGFzZXNbImluQm9keSJdLnByb2Nlc3NTdGFydFRhZyh0b2tlbikKCiAgICAgICAgZGVmIHN0YXJ0VGFnTm9GcmFtZXMoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZXIucGhhc2VzWyJpbkhlYWQiXS5wcm9jZXNzU3RhcnRUYWcodG9rZW4pCgogICAgICAgIGRlZiBzdGFydFRhZ090aGVyKHNlbGYsIHRva2VuKToKICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VFcnJvcigiZXhwZWN0ZWQtZW9mLWJ1dC1nb3Qtc3RhcnQtdGFnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKCiAgICAgICAgZGVmIHByb2Nlc3NFbmRUYWcoc2VsZiwgdG9rZW4pOgogICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZUVycm9yKCJleHBlY3RlZC1lb2YtYnV0LWdvdC1lbmQtdGFnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiB0b2tlblsibmFtZSJdfSkKICAgICMgcHlsaW50OmVuYWJsZT11bnVzZWQtYXJndW1lbnQKCiAgICByZXR1cm4gewogICAgICAgICJpbml0aWFsIjogSW5pdGlhbFBoYXNlLAogICAgICAgICJiZWZvcmVIdG1sIjogQmVmb3JlSHRtbFBoYXNlLAogICAgICAgICJiZWZvcmVIZWFkIjogQmVmb3JlSGVhZFBoYXNlLAogICAgICAgICJpbkhlYWQiOiBJbkhlYWRQaGFzZSwKICAgICAgICAiaW5IZWFkTm9zY3JpcHQiOiBJbkhlYWROb3NjcmlwdFBoYXNlLAogICAgICAgICJhZnRlckhlYWQiOiBBZnRlckhlYWRQaGFzZSwKICAgICAgICAiaW5Cb2R5IjogSW5Cb2R5UGhhc2UsCiAgICAgICAgInRleHQiOiBUZXh0UGhhc2UsCiAgICAgICAgImluVGFibGUiOiBJblRhYmxlUGhhc2UsCiAgICAgICAgImluVGFibGVUZXh0IjogSW5UYWJsZVRleHRQaGFzZSwKICAgICAgICAiaW5DYXB0aW9uIjogSW5DYXB0aW9uUGhhc2UsCiAgICAgICAgImluQ29sdW1uR3JvdXAiOiBJbkNvbHVtbkdyb3VwUGhhc2UsCiAgICAgICAgImluVGFibGVCb2R5IjogSW5UYWJsZUJvZHlQaGFzZSwKICAgICAgICAiaW5Sb3ciOiBJblJvd1BoYXNlLAogICAgICAgICJpbkNlbGwiOiBJbkNlbGxQaGFzZSwKICAgICAgICAiaW5TZWxlY3QiOiBJblNlbGVjdFBoYXNlLAogICAgICAgICJpblNlbGVjdEluVGFibGUiOiBJblNlbGVjdEluVGFibGVQaGFzZSwKICAgICAgICAiaW5Gb3JlaWduQ29udGVudCI6IEluRm9yZWlnbkNvbnRlbnRQaGFzZSwKICAgICAgICAiYWZ0ZXJCb2R5IjogQWZ0ZXJCb2R5UGhhc2UsCiAgICAgICAgImluRnJhbWVzZXQiOiBJbkZyYW1lc2V0UGhhc2UsCiAgICAgICAgImFmdGVyRnJhbWVzZXQiOiBBZnRlckZyYW1lc2V0UGhhc2UsCiAgICAgICAgImFmdGVyQWZ0ZXJCb2R5IjogQWZ0ZXJBZnRlckJvZHlQaGFzZSwKICAgICAgICAiYWZ0ZXJBZnRlckZyYW1lc2V0IjogQWZ0ZXJBZnRlckZyYW1lc2V0UGhhc2UsCiAgICAgICAgIyBYWFggYWZ0ZXIgYWZ0ZXIgZnJhbWVzZXQKICAgIH0KCgpkZWYgYWRqdXN0X2F0dHJpYnV0ZXModG9rZW4sIHJlcGxhY2VtZW50cyk6CiAgICBpZiBQWTMgb3IgX3V0aWxzLlBZMjc6CiAgICAgICAgbmVlZHNfYWRqdXN0bWVudCA9IHZpZXdrZXlzKHRva2VuWydkYXRhJ10pICYgdmlld2tleXMocmVwbGFjZW1lbnRzKQogICAgZWxzZToKICAgICAgICBuZWVkc19hZGp1c3RtZW50ID0gZnJvemVuc2V0KHRva2VuWydkYXRhJ10pICYgZnJvemVuc2V0KHJlcGxhY2VtZW50cykKICAgIGlmIG5lZWRzX2FkanVzdG1lbnQ6CiAgICAgICAgdG9rZW5bJ2RhdGEnXSA9IE9yZGVyZWREaWN0KChyZXBsYWNlbWVudHMuZ2V0KGssIGspLCB2KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaywgdiBpbiB0b2tlblsnZGF0YSddLml0ZW1zKCkpCgoKZGVmIGltcGxpZWRUYWdUb2tlbihuYW1lLCB0eXBlPSJFbmRUYWciLCBhdHRyaWJ1dGVzPU5vbmUsCiAgICAgICAgICAgICAgICAgICAgc2VsZkNsb3Npbmc9RmFsc2UpOgogICAgaWYgYXR0cmlidXRlcyBpcyBOb25lOgogICAgICAgIGF0dHJpYnV0ZXMgPSB7fQogICAgcmV0dXJuIHsidHlwZSI6IHRva2VuVHlwZXNbdHlwZV0sICJuYW1lIjogbmFtZSwgImRhdGEiOiBhdHRyaWJ1dGVzLAogICAgICAgICAgICAic2VsZkNsb3NpbmciOiBzZWxmQ2xvc2luZ30KCgpjbGFzcyBQYXJzZUVycm9yKEV4Y2VwdGlvbik6CiAgICAiIiJFcnJvciBpbiBwYXJzZWQgZG9jdW1lbnQiIiIKICAgIHBhc3MKUEsDBBQAAAAAAAAAIQDcx7s0YTcAAGE3AAAyAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL3NlcmlhbGl6ZXIucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKZnJvbSBwaXAuX3ZlbmRvci5zaXggaW1wb3J0IHRleHRfdHlwZQoKaW1wb3J0IHJlCgpmcm9tIGNvZGVjcyBpbXBvcnQgcmVnaXN0ZXJfZXJyb3IsIHhtbGNoYXJyZWZyZXBsYWNlX2Vycm9ycwoKZnJvbSAuY29uc3RhbnRzIGltcG9ydCB2b2lkRWxlbWVudHMsIGJvb2xlYW5BdHRyaWJ1dGVzLCBzcGFjZUNoYXJhY3RlcnMKZnJvbSAuY29uc3RhbnRzIGltcG9ydCByY2RhdGFFbGVtZW50cywgZW50aXRpZXMsIHhtbEVudGl0aWVzCmZyb20gLiBpbXBvcnQgdHJlZXdhbGtlcnMsIF91dGlscwpmcm9tIHhtbC5zYXguc2F4dXRpbHMgaW1wb3J0IGVzY2FwZQoKX3F1b3RlQXR0cmlidXRlU3BlY0NoYXJzID0gIiIuam9pbihzcGFjZUNoYXJhY3RlcnMpICsgIlwiJz08PmAiCl9xdW90ZUF0dHJpYnV0ZVNwZWMgPSByZS5jb21waWxlKCJbIiArIF9xdW90ZUF0dHJpYnV0ZVNwZWNDaGFycyArICJdIikKX3F1b3RlQXR0cmlidXRlTGVnYWN5ID0gcmUuY29tcGlsZSgiWyIgKyBfcXVvdGVBdHRyaWJ1dGVTcGVjQ2hhcnMgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwN1x4MDhcdFxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJceDBiXHgwY1xyXHgwZVx4MGZceDEwXHgxMVx4MTJceDEzXHgxNFx4MTUiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4MTZceDE3XHgxOFx4MTlceDFhXHgxYlx4MWNceDFkXHgxZVx4MWYiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4MjBceDJmXHg2MFx4YTBcdTE2ODBcdTE4MGVcdTE4MGZcdTIwMDAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx1MjAwMVx1MjAwMlx1MjAwM1x1MjAwNFx1MjAwNVx1MjAwNlx1MjAwNyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHUyMDA4XHUyMDA5XHUyMDBhXHUyMDI4XHUyMDI5XHUyMDJmXHUyMDVmIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdTMwMDBdIikKCgpfZW5jb2RlX2VudGl0eV9tYXAgPSB7fQpfaXNfdWNzNCA9IGxlbigiXFUwMDEwRkZGRiIpID09IDEKZm9yIGssIHYgaW4gbGlzdChlbnRpdGllcy5pdGVtcygpKToKICAgICMgc2tpcCBtdWx0aS1jaGFyYWN0ZXIgZW50aXRpZXMKICAgIGlmICgoX2lzX3VjczQgYW5kIGxlbih2KSA+IDEpIG9yCiAgICAgICAgICAgIChub3QgX2lzX3VjczQgYW5kIGxlbih2KSA+IDIpKToKICAgICAgICBjb250aW51ZQogICAgaWYgdiAhPSAiJiI6CiAgICAgICAgaWYgbGVuKHYpID09IDI6CiAgICAgICAgICAgIHYgPSBfdXRpbHMuc3Vycm9nYXRlUGFpclRvQ29kZXBvaW50KHYpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdiA9IG9yZCh2KQogICAgICAgIGlmIHYgbm90IGluIF9lbmNvZGVfZW50aXR5X21hcCBvciBrLmlzbG93ZXIoKToKICAgICAgICAgICAgIyBwcmVmZXIgJmx0OyBvdmVyICZMVDsgYW5kIHNpbWlsYXJseSBmb3IgJmFtcDssICZndDssIGV0Yy4KICAgICAgICAgICAgX2VuY29kZV9lbnRpdHlfbWFwW3ZdID0gawoKCmRlZiBodG1sZW50aXR5cmVwbGFjZV9lcnJvcnMoZXhjKToKICAgIGlmIGlzaW5zdGFuY2UoZXhjLCAoVW5pY29kZUVuY29kZUVycm9yLCBVbmljb2RlVHJhbnNsYXRlRXJyb3IpKToKICAgICAgICByZXMgPSBbXQogICAgICAgIGNvZGVwb2ludHMgPSBbXQogICAgICAgIHNraXAgPSBGYWxzZQogICAgICAgIGZvciBpLCBjIGluIGVudW1lcmF0ZShleGMub2JqZWN0W2V4Yy5zdGFydDpleGMuZW5kXSk6CiAgICAgICAgICAgIGlmIHNraXA6CiAgICAgICAgICAgICAgICBza2lwID0gRmFsc2UKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGluZGV4ID0gaSArIGV4Yy5zdGFydAogICAgICAgICAgICBpZiBfdXRpbHMuaXNTdXJyb2dhdGVQYWlyKGV4Yy5vYmplY3RbaW5kZXg6bWluKFtleGMuZW5kLCBpbmRleCArIDJdKV0pOgogICAgICAgICAgICAgICAgY29kZXBvaW50ID0gX3V0aWxzLnN1cnJvZ2F0ZVBhaXJUb0NvZGVwb2ludChleGMub2JqZWN0W2luZGV4OmluZGV4ICsgMl0pCiAgICAgICAgICAgICAgICBza2lwID0gVHJ1ZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgY29kZXBvaW50ID0gb3JkKGMpCiAgICAgICAgICAgIGNvZGVwb2ludHMuYXBwZW5kKGNvZGVwb2ludCkKICAgICAgICBmb3IgY3AgaW4gY29kZXBvaW50czoKICAgICAgICAgICAgZSA9IF9lbmNvZGVfZW50aXR5X21hcC5nZXQoY3ApCiAgICAgICAgICAgIGlmIGU6CiAgICAgICAgICAgICAgICByZXMuYXBwZW5kKCImIikKICAgICAgICAgICAgICAgIHJlcy5hcHBlbmQoZSkKICAgICAgICAgICAgICAgIGlmIG5vdCBlLmVuZHN3aXRoKCI7Iik6CiAgICAgICAgICAgICAgICAgICAgcmVzLmFwcGVuZCgiOyIpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXMuYXBwZW5kKCImI3glczsiICUgKGhleChjcClbMjpdKSkKICAgICAgICByZXR1cm4gKCIiLmpvaW4ocmVzKSwgZXhjLmVuZCkKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIHhtbGNoYXJyZWZyZXBsYWNlX2Vycm9ycyhleGMpCgpyZWdpc3Rlcl9lcnJvcigiaHRtbGVudGl0eXJlcGxhY2UiLCBodG1sZW50aXR5cmVwbGFjZV9lcnJvcnMpCgoKZGVmIHNlcmlhbGl6ZShpbnB1dCwgdHJlZT0iZXRyZWUiLCBlbmNvZGluZz1Ob25lLCAqKnNlcmlhbGl6ZXJfb3B0cyk6CiAgICAjIFhYWDogU2hvdWxkIHdlIGNhY2hlIHRoaXM/CiAgICB3YWxrZXIgPSB0cmVld2Fsa2Vycy5nZXRUcmVlV2Fsa2VyKHRyZWUpCiAgICBzID0gSFRNTFNlcmlhbGl6ZXIoKipzZXJpYWxpemVyX29wdHMpCiAgICByZXR1cm4gcy5yZW5kZXIod2Fsa2VyKGlucHV0KSwgZW5jb2RpbmcpCgoKY2xhc3MgSFRNTFNlcmlhbGl6ZXIob2JqZWN0KToKCiAgICAjIGF0dHJpYnV0ZSBxdW90aW5nIG9wdGlvbnMKICAgIHF1b3RlX2F0dHJfdmFsdWVzID0gImxlZ2FjeSIgICMgYmUgc2VjdXJlIGJ5IGRlZmF1bHQKICAgIHF1b3RlX2NoYXIgPSAnIicKICAgIHVzZV9iZXN0X3F1b3RlX2NoYXIgPSBUcnVlCgogICAgIyB0YWcgc3ludGF4IG9wdGlvbnMKICAgIG9taXRfb3B0aW9uYWxfdGFncyA9IFRydWUKICAgIG1pbmltaXplX2Jvb2xlYW5fYXR0cmlidXRlcyA9IFRydWUKICAgIHVzZV90cmFpbGluZ19zb2xpZHVzID0gRmFsc2UKICAgIHNwYWNlX2JlZm9yZV90cmFpbGluZ19zb2xpZHVzID0gVHJ1ZQoKICAgICMgZXNjYXBpbmcgb3B0aW9ucwogICAgZXNjYXBlX2x0X2luX2F0dHJzID0gRmFsc2UKICAgIGVzY2FwZV9yY2RhdGEgPSBGYWxzZQogICAgcmVzb2x2ZV9lbnRpdGllcyA9IFRydWUKCiAgICAjIG1pc2NlbGxhbmVvdXMgb3B0aW9ucwogICAgYWxwaGFiZXRpY2FsX2F0dHJpYnV0ZXMgPSBGYWxzZQogICAgaW5qZWN0X21ldGFfY2hhcnNldCA9IFRydWUKICAgIHN0cmlwX3doaXRlc3BhY2UgPSBGYWxzZQogICAgc2FuaXRpemUgPSBGYWxzZQoKICAgIG9wdGlvbnMgPSAoInF1b3RlX2F0dHJfdmFsdWVzIiwgInF1b3RlX2NoYXIiLCAidXNlX2Jlc3RfcXVvdGVfY2hhciIsCiAgICAgICAgICAgICAgICJvbWl0X29wdGlvbmFsX3RhZ3MiLCAibWluaW1pemVfYm9vbGVhbl9hdHRyaWJ1dGVzIiwKICAgICAgICAgICAgICAgInVzZV90cmFpbGluZ19zb2xpZHVzIiwgInNwYWNlX2JlZm9yZV90cmFpbGluZ19zb2xpZHVzIiwKICAgICAgICAgICAgICAgImVzY2FwZV9sdF9pbl9hdHRycyIsICJlc2NhcGVfcmNkYXRhIiwgInJlc29sdmVfZW50aXRpZXMiLAogICAgICAgICAgICAgICAiYWxwaGFiZXRpY2FsX2F0dHJpYnV0ZXMiLCAiaW5qZWN0X21ldGFfY2hhcnNldCIsCiAgICAgICAgICAgICAgICJzdHJpcF93aGl0ZXNwYWNlIiwgInNhbml0aXplIikKCiAgICBkZWYgX19pbml0X18oc2VsZiwgKiprd2FyZ3MpOgogICAgICAgICIiIkluaXRpYWxpemUgSFRNTFNlcmlhbGl6ZXIuCgogICAgICAgIEtleXdvcmQgb3B0aW9ucyAoZGVmYXVsdCBnaXZlbiBmaXJzdCB1bmxlc3Mgc3BlY2lmaWVkKSBpbmNsdWRlOgoKICAgICAgICBpbmplY3RfbWV0YV9jaGFyc2V0PVRydWV8RmFsc2UKICAgICAgICAgIFdoZXRoZXIgaXQgaW5zZXJ0IGEgbWV0YSBlbGVtZW50IHRvIGRlZmluZSB0aGUgY2hhcmFjdGVyIHNldCBvZiB0aGUKICAgICAgICAgIGRvY3VtZW50LgogICAgICAgIHF1b3RlX2F0dHJfdmFsdWVzPSJsZWdhY3kifCJzcGVjInwiYWx3YXlzIgogICAgICAgICAgV2hldGhlciB0byBxdW90ZSBhdHRyaWJ1dGUgdmFsdWVzIHRoYXQgZG9uJ3QgcmVxdWlyZSBxdW90aW5nCiAgICAgICAgICBwZXIgbGVnYWN5IGJyb3dzZXIgYmVoYXZpb3VyLCB3aGVuIHJlcXVpcmVkIGJ5IHRoZSBzdGFuZGFyZCwgb3IgYWx3YXlzLgogICAgICAgIHF1b3RlX2NoYXI9dSciJ3x1IiciCiAgICAgICAgICBVc2UgZ2l2ZW4gcXVvdGUgY2hhcmFjdGVyIGZvciBhdHRyaWJ1dGUgcXVvdGluZy4gRGVmYXVsdCBpcyB0bwogICAgICAgICAgdXNlIGRvdWJsZSBxdW90ZSB1bmxlc3MgYXR0cmlidXRlIHZhbHVlIGNvbnRhaW5zIGEgZG91YmxlIHF1b3RlLAogICAgICAgICAgaW4gd2hpY2ggY2FzZSBzaW5nbGUgcXVvdGVzIGFyZSB1c2VkIGluc3RlYWQuCiAgICAgICAgZXNjYXBlX2x0X2luX2F0dHJzPUZhbHNlfFRydWUKICAgICAgICAgIFdoZXRoZXIgdG8gZXNjYXBlIDwgaW4gYXR0cmlidXRlIHZhbHVlcy4KICAgICAgICBlc2NhcGVfcmNkYXRhPUZhbHNlfFRydWUKICAgICAgICAgIFdoZXRoZXIgdG8gZXNjYXBlIGNoYXJhY3RlcnMgdGhhdCBuZWVkIHRvIGJlIGVzY2FwZWQgd2l0aGluIG5vcm1hbAogICAgICAgICAgZWxlbWVudHMgd2l0aGluIHJjZGF0YSBlbGVtZW50cyBzdWNoIGFzIHN0eWxlLgogICAgICAgIHJlc29sdmVfZW50aXRpZXM9VHJ1ZXxGYWxzZQogICAgICAgICAgV2hldGhlciB0byByZXNvbHZlIG5hbWVkIGNoYXJhY3RlciBlbnRpdGllcyB0aGF0IGFwcGVhciBpbiB0aGUKICAgICAgICAgIHNvdXJjZSB0cmVlLiBUaGUgWE1MIHByZWRlZmluZWQgZW50aXRpZXMgJmx0OyAmZ3Q7ICZhbXA7ICZxdW90OyAmYXBvczsKICAgICAgICAgIGFyZSB1bmFmZmVjdGVkIGJ5IHRoaXMgc2V0dGluZy4KICAgICAgICBzdHJpcF93aGl0ZXNwYWNlPUZhbHNlfFRydWUKICAgICAgICAgIFdoZXRoZXIgdG8gcmVtb3ZlIHNlbWFudGljYWxseSBtZWFuaW5nbGVzcyB3aGl0ZXNwYWNlLiAoVGhpcwogICAgICAgICAgY29tcHJlc3NlcyBhbGwgd2hpdGVzcGFjZSB0byBhIHNpbmdsZSBzcGFjZSBleGNlcHQgd2l0aGluIHByZS4pCiAgICAgICAgbWluaW1pemVfYm9vbGVhbl9hdHRyaWJ1dGVzPVRydWV8RmFsc2UKICAgICAgICAgIFNob3J0ZW5zIGJvb2xlYW4gYXR0cmlidXRlcyB0byBnaXZlIGp1c3QgdGhlIGF0dHJpYnV0ZSB2YWx1ZSwKICAgICAgICAgIGZvciBleGFtcGxlIDxpbnB1dCBkaXNhYmxlZD0iZGlzYWJsZWQiPiBiZWNvbWVzIDxpbnB1dCBkaXNhYmxlZD4uCiAgICAgICAgdXNlX3RyYWlsaW5nX3NvbGlkdXM9RmFsc2V8VHJ1ZQogICAgICAgICAgSW5jbHVkZXMgYSBjbG9zZS10YWcgc2xhc2ggYXQgdGhlIGVuZCBvZiB0aGUgc3RhcnQgdGFnIG9mIHZvaWQKICAgICAgICAgIGVsZW1lbnRzIChlbXB0eSBlbGVtZW50cyB3aG9zZSBlbmQgdGFnIGlzIGZvcmJpZGRlbikuIEUuZy4gPGhyLz4uCiAgICAgICAgc3BhY2VfYmVmb3JlX3RyYWlsaW5nX3NvbGlkdXM9VHJ1ZXxGYWxzZQogICAgICAgICAgUGxhY2VzIGEgc3BhY2UgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBjbG9zaW5nIHNsYXNoIGluIGEgdGFnCiAgICAgICAgICB1c2luZyBhIHRyYWlsaW5nIHNvbGlkdXMuIEUuZy4gPGhyIC8+LiBSZXF1aXJlcyB1c2VfdHJhaWxpbmdfc29saWR1cy4KICAgICAgICBzYW5pdGl6ZT1GYWxzZXxUcnVlCiAgICAgICAgICBTdHJpcCBhbGwgdW5zYWZlIG9yIHVua25vd24gY29uc3RydWN0cyBmcm9tIG91dHB1dC4KICAgICAgICAgIFNlZSBgaHRtbDVsaWIgdXNlciBkb2N1bWVudGF0aW9uYF8KICAgICAgICBvbWl0X29wdGlvbmFsX3RhZ3M9VHJ1ZXxGYWxzZQogICAgICAgICAgT21pdCBzdGFydC9lbmQgdGFncyB0aGF0IGFyZSBvcHRpb25hbC4KICAgICAgICBhbHBoYWJldGljYWxfYXR0cmlidXRlcz1GYWxzZXxUcnVlCiAgICAgICAgICBSZW9yZGVyIGF0dHJpYnV0ZXMgdG8gYmUgaW4gYWxwaGFiZXRpY2FsIG9yZGVyLgoKICAgICAgICAuLiBfaHRtbDVsaWIgdXNlciBkb2N1bWVudGF0aW9uOiBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvaHRtbDVsaWIvd2lraS9Vc2VyRG9jdW1lbnRhdGlvbgogICAgICAgICIiIgogICAgICAgIHVuZXhwZWN0ZWRfYXJncyA9IGZyb3plbnNldChrd2FyZ3MpIC0gZnJvemVuc2V0KHNlbGYub3B0aW9ucykKICAgICAgICBpZiBsZW4odW5leHBlY3RlZF9hcmdzKSA+IDA6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiX19pbml0X18oKSBnb3QgYW4gdW5leHBlY3RlZCBrZXl3b3JkIGFyZ3VtZW50ICclcyciICUgbmV4dChpdGVyKHVuZXhwZWN0ZWRfYXJncykpKQogICAgICAgIGlmICdxdW90ZV9jaGFyJyBpbiBrd2FyZ3M6CiAgICAgICAgICAgIHNlbGYudXNlX2Jlc3RfcXVvdGVfY2hhciA9IEZhbHNlCiAgICAgICAgZm9yIGF0dHIgaW4gc2VsZi5vcHRpb25zOgogICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGF0dHIsIGt3YXJncy5nZXQoYXR0ciwgZ2V0YXR0cihzZWxmLCBhdHRyKSkpCiAgICAgICAgc2VsZi5lcnJvcnMgPSBbXQogICAgICAgIHNlbGYuc3RyaWN0ID0gRmFsc2UKCiAgICBkZWYgZW5jb2RlKHNlbGYsIHN0cmluZyk6CiAgICAgICAgYXNzZXJ0KGlzaW5zdGFuY2Uoc3RyaW5nLCB0ZXh0X3R5cGUpKQogICAgICAgIGlmIHNlbGYuZW5jb2Rpbmc6CiAgICAgICAgICAgIHJldHVybiBzdHJpbmcuZW5jb2RlKHNlbGYuZW5jb2RpbmcsICJodG1sZW50aXR5cmVwbGFjZSIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHN0cmluZwoKICAgIGRlZiBlbmNvZGVTdHJpY3Qoc2VsZiwgc3RyaW5nKToKICAgICAgICBhc3NlcnQoaXNpbnN0YW5jZShzdHJpbmcsIHRleHRfdHlwZSkpCiAgICAgICAgaWYgc2VsZi5lbmNvZGluZzoKICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5lbmNvZGUoc2VsZi5lbmNvZGluZywgInN0cmljdCIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHN0cmluZwoKICAgIGRlZiBzZXJpYWxpemUoc2VsZiwgdHJlZXdhbGtlciwgZW5jb2Rpbmc9Tm9uZSk6CiAgICAgICAgIyBweWxpbnQ6ZGlzYWJsZT10b28tbWFueS1uZXN0ZWQtYmxvY2tzCiAgICAgICAgc2VsZi5lbmNvZGluZyA9IGVuY29kaW5nCiAgICAgICAgaW5fY2RhdGEgPSBGYWxzZQogICAgICAgIHNlbGYuZXJyb3JzID0gW10KCiAgICAgICAgaWYgZW5jb2RpbmcgYW5kIHNlbGYuaW5qZWN0X21ldGFfY2hhcnNldDoKICAgICAgICAgICAgZnJvbSAuZmlsdGVycy5pbmplY3RfbWV0YV9jaGFyc2V0IGltcG9ydCBGaWx0ZXIKICAgICAgICAgICAgdHJlZXdhbGtlciA9IEZpbHRlcih0cmVld2Fsa2VyLCBlbmNvZGluZykKICAgICAgICAjIEFscGhhYmV0aWNhbCBhdHRyaWJ1dGVzIGlzIGhlcmUgdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCBub25lIG9mCiAgICAgICAgIyB0aGUgbGF0ZXIgZmlsdGVycyBhZGQgb3IgY2hhbmdlIG9yZGVyIG9mIGF0dHJpYnV0ZXM7IGl0IG5lZWRzIHRvIGJlCiAgICAgICAgIyBiZWZvcmUgdGhlIHNhbml0aXplciBzbyBlc2NhcGVkIGVsZW1lbnRzIGNvbWUgb3V0IGNvcnJlY3RseQogICAgICAgIGlmIHNlbGYuYWxwaGFiZXRpY2FsX2F0dHJpYnV0ZXM6CiAgICAgICAgICAgIGZyb20gLmZpbHRlcnMuYWxwaGFiZXRpY2FsYXR0cmlidXRlcyBpbXBvcnQgRmlsdGVyCiAgICAgICAgICAgIHRyZWV3YWxrZXIgPSBGaWx0ZXIodHJlZXdhbGtlcikKICAgICAgICAjIFdoaXRlc3BhY2VGaWx0ZXIgc2hvdWxkIGJlIHVzZWQgYmVmb3JlIE9wdGlvbmFsVGFnRmlsdGVyCiAgICAgICAgIyBmb3IgbWF4aW11bSBlZmZpY2llbnRseSBvZiB0aGlzIGxhdHRlciBmaWx0ZXIKICAgICAgICBpZiBzZWxmLnN0cmlwX3doaXRlc3BhY2U6CiAgICAgICAgICAgIGZyb20gLmZpbHRlcnMud2hpdGVzcGFjZSBpbXBvcnQgRmlsdGVyCiAgICAgICAgICAgIHRyZWV3YWxrZXIgPSBGaWx0ZXIodHJlZXdhbGtlcikKICAgICAgICBpZiBzZWxmLnNhbml0aXplOgogICAgICAgICAgICBmcm9tIC5maWx0ZXJzLnNhbml0aXplciBpbXBvcnQgRmlsdGVyCiAgICAgICAgICAgIHRyZWV3YWxrZXIgPSBGaWx0ZXIodHJlZXdhbGtlcikKICAgICAgICBpZiBzZWxmLm9taXRfb3B0aW9uYWxfdGFnczoKICAgICAgICAgICAgZnJvbSAuZmlsdGVycy5vcHRpb25hbHRhZ3MgaW1wb3J0IEZpbHRlcgogICAgICAgICAgICB0cmVld2Fsa2VyID0gRmlsdGVyKHRyZWV3YWxrZXIpCgogICAgICAgIGZvciB0b2tlbiBpbiB0cmVld2Fsa2VyOgogICAgICAgICAgICB0eXBlID0gdG9rZW5bInR5cGUiXQogICAgICAgICAgICBpZiB0eXBlID09ICJEb2N0eXBlIjoKICAgICAgICAgICAgICAgIGRvY3R5cGUgPSAiPCFET0NUWVBFICVzIiAlIHRva2VuWyJuYW1lIl0KCiAgICAgICAgICAgICAgICBpZiB0b2tlblsicHVibGljSWQiXToKICAgICAgICAgICAgICAgICAgICBkb2N0eXBlICs9ICcgUFVCTElDICIlcyInICUgdG9rZW5bInB1YmxpY0lkIl0KICAgICAgICAgICAgICAgIGVsaWYgdG9rZW5bInN5c3RlbUlkIl06CiAgICAgICAgICAgICAgICAgICAgZG9jdHlwZSArPSAiIFNZU1RFTSIKICAgICAgICAgICAgICAgIGlmIHRva2VuWyJzeXN0ZW1JZCJdOgogICAgICAgICAgICAgICAgICAgIGlmIHRva2VuWyJzeXN0ZW1JZCJdLmZpbmQoJyInKSA+PSAwOgogICAgICAgICAgICAgICAgICAgICAgICBpZiB0b2tlblsic3lzdGVtSWQiXS5maW5kKCInIikgPj0gMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VyaWFsaXplRXJyb3IoIlN5c3RlbSBpZGVudGlmZXIgY29udGFpbnMgYm90aCBzaW5nbGUgYW5kIGRvdWJsZSBxdW90ZSBjaGFyYWN0ZXJzIikKICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGVfY2hhciA9ICInIgogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIHF1b3RlX2NoYXIgPSAnIicKICAgICAgICAgICAgICAgICAgICBkb2N0eXBlICs9ICIgJXMlcyVzIiAlIChxdW90ZV9jaGFyLCB0b2tlblsic3lzdGVtSWQiXSwgcXVvdGVfY2hhcikKCiAgICAgICAgICAgICAgICBkb2N0eXBlICs9ICI+IgogICAgICAgICAgICAgICAgeWllbGQgc2VsZi5lbmNvZGVTdHJpY3QoZG9jdHlwZSkKCiAgICAgICAgICAgIGVsaWYgdHlwZSBpbiAoIkNoYXJhY3RlcnMiLCAiU3BhY2VDaGFyYWN0ZXJzIik6CiAgICAgICAgICAgICAgICBpZiB0eXBlID09ICJTcGFjZUNoYXJhY3RlcnMiIG9yIGluX2NkYXRhOgogICAgICAgICAgICAgICAgICAgIGlmIGluX2NkYXRhIGFuZCB0b2tlblsiZGF0YSJdLmZpbmQoIjwvIikgPj0gMDoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXJpYWxpemVFcnJvcigiVW5leHBlY3RlZCA8LyBpbiBDREFUQSIpCiAgICAgICAgICAgICAgICAgICAgeWllbGQgc2VsZi5lbmNvZGUodG9rZW5bImRhdGEiXSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgeWllbGQgc2VsZi5lbmNvZGUoZXNjYXBlKHRva2VuWyJkYXRhIl0pKQoKICAgICAgICAgICAgZWxpZiB0eXBlIGluICgiU3RhcnRUYWciLCAiRW1wdHlUYWciKToKICAgICAgICAgICAgICAgIG5hbWUgPSB0b2tlblsibmFtZSJdCiAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLmVuY29kZVN0cmljdCgiPCVzIiAlIG5hbWUpCiAgICAgICAgICAgICAgICBpZiBuYW1lIGluIHJjZGF0YUVsZW1lbnRzIGFuZCBub3Qgc2VsZi5lc2NhcGVfcmNkYXRhOgogICAgICAgICAgICAgICAgICAgIGluX2NkYXRhID0gVHJ1ZQogICAgICAgICAgICAgICAgZWxpZiBpbl9jZGF0YToKICAgICAgICAgICAgICAgICAgICBzZWxmLnNlcmlhbGl6ZUVycm9yKCJVbmV4cGVjdGVkIGNoaWxkIGVsZW1lbnQgb2YgYSBDREFUQSBlbGVtZW50IikKICAgICAgICAgICAgICAgIGZvciAoXywgYXR0cl9uYW1lKSwgYXR0cl92YWx1ZSBpbiB0b2tlblsiZGF0YSJdLml0ZW1zKCk6CiAgICAgICAgICAgICAgICAgICAgIyBUT0RPOiBBZGQgbmFtZXNwYWNlIHN1cHBvcnQgaGVyZQogICAgICAgICAgICAgICAgICAgIGsgPSBhdHRyX25hbWUKICAgICAgICAgICAgICAgICAgICB2ID0gYXR0cl92YWx1ZQogICAgICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuZW5jb2RlU3RyaWN0KCcgJykKCiAgICAgICAgICAgICAgICAgICAgeWllbGQgc2VsZi5lbmNvZGVTdHJpY3QoaykKICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5taW5pbWl6ZV9ib29sZWFuX2F0dHJpYnV0ZXMgb3IgXAogICAgICAgICAgICAgICAgICAgICAgICAoayBub3QgaW4gYm9vbGVhbkF0dHJpYnV0ZXMuZ2V0KG5hbWUsIHR1cGxlKCkpIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgayBub3QgaW4gYm9vbGVhbkF0dHJpYnV0ZXMuZ2V0KCIiLCB0dXBsZSgpKSk6CiAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuZW5jb2RlU3RyaWN0KCI9IikKICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5xdW90ZV9hdHRyX3ZhbHVlcyA9PSAiYWx3YXlzIiBvciBsZW4odikgPT0gMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1b3RlX2F0dHIgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5xdW90ZV9hdHRyX3ZhbHVlcyA9PSAic3BlYyI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdW90ZV9hdHRyID0gX3F1b3RlQXR0cmlidXRlU3BlYy5zZWFyY2godikgaXMgbm90IE5vbmUKICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiBzZWxmLnF1b3RlX2F0dHJfdmFsdWVzID09ICJsZWdhY3kiOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGVfYXR0ciA9IF9xdW90ZUF0dHJpYnV0ZUxlZ2FjeS5zZWFyY2godikgaXMgbm90IE5vbmUKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInF1b3RlX2F0dHJfdmFsdWVzIG11c3QgYmUgb25lIG9mOiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInYWx3YXlzJywgJ3NwZWMnLCBvciAnbGVnYWN5JyIpCiAgICAgICAgICAgICAgICAgICAgICAgIHYgPSB2LnJlcGxhY2UoIiYiLCAiJmFtcDsiKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmVzY2FwZV9sdF9pbl9hdHRyczoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSB2LnJlcGxhY2UoIjwiLCAiJmx0OyIpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHF1b3RlX2F0dHI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdW90ZV9jaGFyID0gc2VsZi5xdW90ZV9jaGFyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnVzZV9iZXN0X3F1b3RlX2NoYXI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgIiciIGluIHYgYW5kICciJyBub3QgaW4gdjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGVfY2hhciA9ICciJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgJyInIGluIHYgYW5kICInIiBub3QgaW4gdjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGVfY2hhciA9ICInIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgcXVvdGVfY2hhciA9PSAiJyI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHYucmVwbGFjZSgiJyIsICImIzM5OyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSB2LnJlcGxhY2UoJyInLCAiJnF1b3Q7IikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuZW5jb2RlU3RyaWN0KHF1b3RlX2NoYXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLmVuY29kZSh2KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgc2VsZi5lbmNvZGVTdHJpY3QocXVvdGVfY2hhcikKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuZW5jb2RlKHYpCiAgICAgICAgICAgICAgICBpZiBuYW1lIGluIHZvaWRFbGVtZW50cyBhbmQgc2VsZi51c2VfdHJhaWxpbmdfc29saWR1czoKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnNwYWNlX2JlZm9yZV90cmFpbGluZ19zb2xpZHVzOgogICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLmVuY29kZVN0cmljdCgiIC8iKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuZW5jb2RlU3RyaWN0KCIvIikKICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuZW5jb2RlKCI+IikKCiAgICAgICAgICAgIGVsaWYgdHlwZSA9PSAiRW5kVGFnIjoKICAgICAgICAgICAgICAgIG5hbWUgPSB0b2tlblsibmFtZSJdCiAgICAgICAgICAgICAgICBpZiBuYW1lIGluIHJjZGF0YUVsZW1lbnRzOgogICAgICAgICAgICAgICAgICAgIGluX2NkYXRhID0gRmFsc2UKICAgICAgICAgICAgICAgIGVsaWYgaW5fY2RhdGE6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXJpYWxpemVFcnJvcigiVW5leHBlY3RlZCBjaGlsZCBlbGVtZW50IG9mIGEgQ0RBVEEgZWxlbWVudCIpCiAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLmVuY29kZVN0cmljdCgiPC8lcz4iICUgbmFtZSkKCiAgICAgICAgICAgIGVsaWYgdHlwZSA9PSAiQ29tbWVudCI6CiAgICAgICAgICAgICAgICBkYXRhID0gdG9rZW5bImRhdGEiXQogICAgICAgICAgICAgICAgaWYgZGF0YS5maW5kKCItLSIpID49IDA6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXJpYWxpemVFcnJvcigiQ29tbWVudCBjb250YWlucyAtLSIpCiAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLmVuY29kZVN0cmljdCgiPCEtLSVzLS0+IiAlIHRva2VuWyJkYXRhIl0pCgogICAgICAgICAgICBlbGlmIHR5cGUgPT0gIkVudGl0eSI6CiAgICAgICAgICAgICAgICBuYW1lID0gdG9rZW5bIm5hbWUiXQogICAgICAgICAgICAgICAga2V5ID0gbmFtZSArICI7IgogICAgICAgICAgICAgICAgaWYga2V5IG5vdCBpbiBlbnRpdGllczoKICAgICAgICAgICAgICAgICAgICBzZWxmLnNlcmlhbGl6ZUVycm9yKCJFbnRpdHkgJXMgbm90IHJlY29nbml6ZWQiICUgbmFtZSkKICAgICAgICAgICAgICAgIGlmIHNlbGYucmVzb2x2ZV9lbnRpdGllcyBhbmQga2V5IG5vdCBpbiB4bWxFbnRpdGllczoKICAgICAgICAgICAgICAgICAgICBkYXRhID0gZW50aXRpZXNba2V5XQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBkYXRhID0gIiYlczsiICUgbmFtZQogICAgICAgICAgICAgICAgeWllbGQgc2VsZi5lbmNvZGVTdHJpY3QoZGF0YSkKCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLnNlcmlhbGl6ZUVycm9yKHRva2VuWyJkYXRhIl0pCgogICAgZGVmIHJlbmRlcihzZWxmLCB0cmVld2Fsa2VyLCBlbmNvZGluZz1Ob25lKToKICAgICAgICBpZiBlbmNvZGluZzoKICAgICAgICAgICAgcmV0dXJuIGIiIi5qb2luKGxpc3Qoc2VsZi5zZXJpYWxpemUodHJlZXdhbGtlciwgZW5jb2RpbmcpKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gIiIuam9pbihsaXN0KHNlbGYuc2VyaWFsaXplKHRyZWV3YWxrZXIpKSkKCiAgICBkZWYgc2VyaWFsaXplRXJyb3Ioc2VsZiwgZGF0YT0iWFhYIEVSUk9SIE1FU1NBR0UgTkVFREVEIik6CiAgICAgICAgIyBYWFggVGhlIGlkZWEgaXMgdG8gbWFrZSBkYXRhIG1hbmRhdG9yeS4KICAgICAgICBzZWxmLmVycm9ycy5hcHBlbmQoZGF0YSkKICAgICAgICBpZiBzZWxmLnN0cmljdDoKICAgICAgICAgICAgcmFpc2UgU2VyaWFsaXplRXJyb3IKCgpjbGFzcyBTZXJpYWxpemVFcnJvcihFeGNlcHRpb24pOgogICAgIiIiRXJyb3IgaW4gc2VyaWFsaXplZCB0cmVlIiIiCiAgICBwYXNzClBLAwQUAAAAAAAAACEAgjJjJNAAAADQAAAAPQAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVlYWRhcHRlcnMvX19pbml0X18ucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKCmZyb20gLiBpbXBvcnQgc2F4CgpfX2FsbF9fID0gWyJzYXgiXQoKdHJ5OgogICAgZnJvbSAuIGltcG9ydCBnZW5zaGkgICMgbm9xYQpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBwYXNzCmVsc2U6CiAgICBfX2FsbF9fLmFwcGVuZCgiZ2Vuc2hpIikKUEsDBBQAAAAAAAAAIQAxJ8e+EwYAABMGAAA7AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWVhZGFwdGVycy9nZW5zaGkucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKCmZyb20gZ2Vuc2hpLmNvcmUgaW1wb3J0IFFOYW1lLCBBdHRycwpmcm9tIGdlbnNoaS5jb3JlIGltcG9ydCBTVEFSVCwgRU5ELCBURVhULCBDT01NRU5ULCBET0NUWVBFCgoKZGVmIHRvX2dlbnNoaSh3YWxrZXIpOgogICAgdGV4dCA9IFtdCiAgICBmb3IgdG9rZW4gaW4gd2Fsa2VyOgogICAgICAgIHR5cGUgPSB0b2tlblsidHlwZSJdCiAgICAgICAgaWYgdHlwZSBpbiAoIkNoYXJhY3RlcnMiLCAiU3BhY2VDaGFyYWN0ZXJzIik6CiAgICAgICAgICAgIHRleHQuYXBwZW5kKHRva2VuWyJkYXRhIl0pCiAgICAgICAgZWxpZiB0ZXh0OgogICAgICAgICAgICB5aWVsZCBURVhULCAiIi5qb2luKHRleHQpLCAoTm9uZSwgLTEsIC0xKQogICAgICAgICAgICB0ZXh0ID0gW10KCiAgICAgICAgaWYgdHlwZSBpbiAoIlN0YXJ0VGFnIiwgIkVtcHR5VGFnIik6CiAgICAgICAgICAgIGlmIHRva2VuWyJuYW1lc3BhY2UiXToKICAgICAgICAgICAgICAgIG5hbWUgPSAieyVzfSVzIiAlICh0b2tlblsibmFtZXNwYWNlIl0sIHRva2VuWyJuYW1lIl0pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBuYW1lID0gdG9rZW5bIm5hbWUiXQogICAgICAgICAgICBhdHRycyA9IEF0dHJzKFsoUU5hbWUoInslc30lcyIgJSBhdHRyIGlmIGF0dHJbMF0gaXMgbm90IE5vbmUgZWxzZSBhdHRyWzFdKSwgdmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBhdHRyLCB2YWx1ZSBpbiB0b2tlblsiZGF0YSJdLml0ZW1zKCldKQogICAgICAgICAgICB5aWVsZCAoU1RBUlQsIChRTmFtZShuYW1lKSwgYXR0cnMpLCAoTm9uZSwgLTEsIC0xKSkKICAgICAgICAgICAgaWYgdHlwZSA9PSAiRW1wdHlUYWciOgogICAgICAgICAgICAgICAgdHlwZSA9ICJFbmRUYWciCgogICAgICAgIGlmIHR5cGUgPT0gIkVuZFRhZyI6CiAgICAgICAgICAgIGlmIHRva2VuWyJuYW1lc3BhY2UiXToKICAgICAgICAgICAgICAgIG5hbWUgPSAieyVzfSVzIiAlICh0b2tlblsibmFtZXNwYWNlIl0sIHRva2VuWyJuYW1lIl0pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBuYW1lID0gdG9rZW5bIm5hbWUiXQoKICAgICAgICAgICAgeWllbGQgRU5ELCBRTmFtZShuYW1lKSwgKE5vbmUsIC0xLCAtMSkKCiAgICAgICAgZWxpZiB0eXBlID09ICJDb21tZW50IjoKICAgICAgICAgICAgeWllbGQgQ09NTUVOVCwgdG9rZW5bImRhdGEiXSwgKE5vbmUsIC0xLCAtMSkKCiAgICAgICAgZWxpZiB0eXBlID09ICJEb2N0eXBlIjoKICAgICAgICAgICAgeWllbGQgRE9DVFlQRSwgKHRva2VuWyJuYW1lIl0sIHRva2VuWyJwdWJsaWNJZCJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5bInN5c3RlbUlkIl0pLCAoTm9uZSwgLTEsIC0xKQoKICAgICAgICBlbHNlOgogICAgICAgICAgICBwYXNzICAjIEZJWE1FOiBXaGF0IHRvIGRvPwoKICAgIGlmIHRleHQ6CiAgICAgICAgeWllbGQgVEVYVCwgIiIuam9pbih0ZXh0KSwgKE5vbmUsIC0xLCAtMSkKUEsDBBQAAAAAAAAAIQDkXF8QfQYAAH0GAAA4AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWVhZGFwdGVycy9zYXgucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKCmZyb20geG1sLnNheC54bWxyZWFkZXIgaW1wb3J0IEF0dHJpYnV0ZXNOU0ltcGwKCmZyb20gLi5jb25zdGFudHMgaW1wb3J0IGFkanVzdEZvcmVpZ25BdHRyaWJ1dGVzLCB1bmFkanVzdEZvcmVpZ25BdHRyaWJ1dGVzCgpwcmVmaXhfbWFwcGluZyA9IHt9CmZvciBwcmVmaXgsIGxvY2FsTmFtZSwgbmFtZXNwYWNlIGluIGFkanVzdEZvcmVpZ25BdHRyaWJ1dGVzLnZhbHVlcygpOgogICAgaWYgcHJlZml4IGlzIG5vdCBOb25lOgogICAgICAgIHByZWZpeF9tYXBwaW5nW3ByZWZpeF0gPSBuYW1lc3BhY2UKCgpkZWYgdG9fc2F4KHdhbGtlciwgaGFuZGxlcik6CiAgICAiIiJDYWxsIFNBWC1saWtlIGNvbnRlbnQgaGFuZGxlciBiYXNlZCBvbiB0cmVld2Fsa2VyIHdhbGtlciIiIgogICAgaGFuZGxlci5zdGFydERvY3VtZW50KCkKICAgIGZvciBwcmVmaXgsIG5hbWVzcGFjZSBpbiBwcmVmaXhfbWFwcGluZy5pdGVtcygpOgogICAgICAgIGhhbmRsZXIuc3RhcnRQcmVmaXhNYXBwaW5nKHByZWZpeCwgbmFtZXNwYWNlKQoKICAgIGZvciB0b2tlbiBpbiB3YWxrZXI6CiAgICAgICAgdHlwZSA9IHRva2VuWyJ0eXBlIl0KICAgICAgICBpZiB0eXBlID09ICJEb2N0eXBlIjoKICAgICAgICAgICAgY29udGludWUKICAgICAgICBlbGlmIHR5cGUgaW4gKCJTdGFydFRhZyIsICJFbXB0eVRhZyIpOgogICAgICAgICAgICBhdHRycyA9IEF0dHJpYnV0ZXNOU0ltcGwodG9rZW5bImRhdGEiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuYWRqdXN0Rm9yZWlnbkF0dHJpYnV0ZXMpCiAgICAgICAgICAgIGhhbmRsZXIuc3RhcnRFbGVtZW50TlMoKHRva2VuWyJuYW1lc3BhY2UiXSwgdG9rZW5bIm5hbWUiXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5bIm5hbWUiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRycykKICAgICAgICAgICAgaWYgdHlwZSA9PSAiRW1wdHlUYWciOgogICAgICAgICAgICAgICAgaGFuZGxlci5lbmRFbGVtZW50TlMoKHRva2VuWyJuYW1lc3BhY2UiXSwgdG9rZW5bIm5hbWUiXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlblsibmFtZSJdKQogICAgICAgIGVsaWYgdHlwZSA9PSAiRW5kVGFnIjoKICAgICAgICAgICAgaGFuZGxlci5lbmRFbGVtZW50TlMoKHRva2VuWyJuYW1lc3BhY2UiXSwgdG9rZW5bIm5hbWUiXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuWyJuYW1lIl0pCiAgICAgICAgZWxpZiB0eXBlIGluICgiQ2hhcmFjdGVycyIsICJTcGFjZUNoYXJhY3RlcnMiKToKICAgICAgICAgICAgaGFuZGxlci5jaGFyYWN0ZXJzKHRva2VuWyJkYXRhIl0pCiAgICAgICAgZWxpZiB0eXBlID09ICJDb21tZW50IjoKICAgICAgICAgICAgcGFzcwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGFzc2VydCBGYWxzZSwgIlVua25vd24gdG9rZW4gdHlwZSIKCiAgICBmb3IgcHJlZml4LCBuYW1lc3BhY2UgaW4gcHJlZml4X21hcHBpbmcuaXRlbXMoKToKICAgICAgICBoYW5kbGVyLmVuZFByZWZpeE1hcHBpbmcocHJlZml4KQogICAgaGFuZGxlci5lbmREb2N1bWVudCgpClBLAwQUAAAAAAAAACEAR9k3bk4NAABODQAAPQAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVlYnVpbGRlcnMvX19pbml0X18ucHkiIiJBIGNvbGxlY3Rpb24gb2YgbW9kdWxlcyBmb3IgYnVpbGRpbmcgZGlmZmVyZW50IGtpbmRzIG9mIHRyZWUgZnJvbQpIVE1MIGRvY3VtZW50cy4KClRvIGNyZWF0ZSBhIHRyZWVidWlsZGVyIGZvciBhIG5ldyB0eXBlIG9mIHRyZWUsIHlvdSBuZWVkIHRvIGRvCmltcGxlbWVudCBzZXZlcmFsIHRoaW5nczoKCjEpIEEgc2V0IG9mIGNsYXNzZXMgZm9yIHZhcmlvdXMgdHlwZXMgb2YgZWxlbWVudHM6IERvY3VtZW50LCBEb2N0eXBlLApDb21tZW50LCBFbGVtZW50LiBUaGVzZSBtdXN0IGltcGxlbWVudCB0aGUgaW50ZXJmYWNlIG9mCl9iYXNlLnRyZWVidWlsZGVycy5Ob2RlIChhbHRob3VnaCBjb21tZW50IG5vZGVzIGhhdmUgYSBkaWZmZXJlbnQKc2lnbmF0dXJlIGZvciB0aGVpciBjb25zdHJ1Y3Rvciwgc2VlIHRyZWVidWlsZGVycy5ldHJlZS5Db21tZW50KQpUZXh0dWFsIGNvbnRlbnQgbWF5IGFsc28gYmUgaW1wbGVtZW50ZWQgYXMgYW5vdGhlciBub2RlIHR5cGUsIG9yIG5vdCwgYXMKeW91ciB0cmVlIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzLgoKMikgQSB0cmVlYnVpbGRlciBvYmplY3QgKGNhbGxlZCBUcmVlQnVpbGRlciBieSBjb252ZW50aW9uKSB0aGF0CmluaGVyaXRzIGZyb20gdHJlZWJ1aWxkZXJzLl9iYXNlLlRyZWVCdWlsZGVyLiBUaGlzIGhhcyA0IHJlcXVpcmVkIGF0dHJpYnV0ZXM6CmRvY3VtZW50Q2xhc3MgLSB0aGUgY2xhc3MgdG8gdXNlIGZvciB0aGUgYm90dG9tbW9zdCBub2RlIG9mIGEgZG9jdW1lbnQKZWxlbWVudENsYXNzIC0gdGhlIGNsYXNzIHRvIHVzZSBmb3IgSFRNTCBFbGVtZW50cwpjb21tZW50Q2xhc3MgLSB0aGUgY2xhc3MgdG8gdXNlIGZvciBjb21tZW50cwpkb2N0eXBlQ2xhc3MgLSB0aGUgY2xhc3MgdG8gdXNlIGZvciBkb2N0eXBlcwpJdCBhbHNvIGhhcyBvbmUgcmVxdWlyZWQgbWV0aG9kOgpnZXREb2N1bWVudCAtIFJldHVybnMgdGhlIHJvb3Qgbm9kZSBvZiB0aGUgY29tcGxldGUgZG9jdW1lbnQgdHJlZQoKMykgSWYgeW91IHdpc2ggdG8gcnVuIHRoZSB1bml0IHRlc3RzLCB5b3UgbXVzdCBhbHNvIGNyZWF0ZSBhCnRlc3RTZXJpYWxpemVyIG1ldGhvZCBvbiB5b3VyIHRyZWVidWlsZGVyIHdoaWNoIGFjY2VwdHMgYSBub2RlIGFuZApyZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgTm9kZSBhbmQgaXRzIGNoaWxkcmVuIHNlcmlhbGl6ZWQgYWNjb3JkaW5nCnRvIHRoZSBmb3JtYXQgdXNlZCBpbiB0aGUgdW5pdHRlc3RzCiIiIgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCgpmcm9tIC4uX3V0aWxzIGltcG9ydCBkZWZhdWx0X2V0cmVlCgp0cmVlQnVpbGRlckNhY2hlID0ge30KCgpkZWYgZ2V0VHJlZUJ1aWxkZXIodHJlZVR5cGUsIGltcGxlbWVudGF0aW9uPU5vbmUsICoqa3dhcmdzKToKICAgICIiIkdldCBhIFRyZWVCdWlsZGVyIGNsYXNzIGZvciB2YXJpb3VzIHR5cGVzIG9mIHRyZWUgd2l0aCBidWlsdC1pbiBzdXBwb3J0CgogICAgdHJlZVR5cGUgLSB0aGUgbmFtZSBvZiB0aGUgdHJlZSB0eXBlIHJlcXVpcmVkIChjYXNlLWluc2Vuc2l0aXZlKS4gU3VwcG9ydGVkCiAgICAgICAgICAgICAgIHZhbHVlcyBhcmU6CgogICAgICAgICAgICAgICAiZG9tIiAtIEEgZ2VuZXJpYyBidWlsZGVyIGZvciBET00gaW1wbGVtZW50YXRpb25zLCBkZWZhdWx0aW5nIHRvCiAgICAgICAgICAgICAgICAgICAgICAgYSB4bWwuZG9tLm1pbmlkb20gYmFzZWQgaW1wbGVtZW50YXRpb24uCiAgICAgICAgICAgICAgICJldHJlZSIgLSBBIGdlbmVyaWMgYnVpbGRlciBmb3IgdHJlZSBpbXBsZW1lbnRhdGlvbnMgZXhwb3NpbmcgYW4KICAgICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnRUcmVlLWxpa2UgaW50ZXJmYWNlLCBkZWZhdWx0aW5nIHRvCiAgICAgICAgICAgICAgICAgICAgICAgICB4bWwuZXRyZWUuY0VsZW1lbnRUcmVlIGlmIGF2YWlsYWJsZSBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgIHhtbC5ldHJlZS5FbGVtZW50VHJlZSBpZiBub3QuCiAgICAgICAgICAgICAgICJseG1sIiAtIEEgZXRyZWUtYmFzZWQgYnVpbGRlciBmb3IgbHhtbC5ldHJlZSwgaGFuZGxpbmcKICAgICAgICAgICAgICAgICAgICAgICAgbGltaXRhdGlvbnMgb2YgbHhtbCdzIGltcGxlbWVudGF0aW9uLgoKICAgIGltcGxlbWVudGF0aW9uIC0gKEN1cnJlbnRseSBhcHBsaWVzIHRvIHRoZSAiZXRyZWUiIGFuZCAiZG9tIiB0cmVlIHR5cGVzKS4gQQogICAgICAgICAgICAgICAgICAgICAgbW9kdWxlIGltcGxlbWVudGluZyB0aGUgdHJlZSB0eXBlIGUuZy4KICAgICAgICAgICAgICAgICAgICAgIHhtbC5ldHJlZS5FbGVtZW50VHJlZSBvciB4bWwuZXRyZWUuY0VsZW1lbnRUcmVlLiIiIgoKICAgIHRyZWVUeXBlID0gdHJlZVR5cGUubG93ZXIoKQogICAgaWYgdHJlZVR5cGUgbm90IGluIHRyZWVCdWlsZGVyQ2FjaGU6CiAgICAgICAgaWYgdHJlZVR5cGUgPT0gImRvbSI6CiAgICAgICAgICAgIGZyb20gLiBpbXBvcnQgZG9tCiAgICAgICAgICAgICMgQ29tZSB1cCB3aXRoIGEgc2FuZSBkZWZhdWx0IChwcmVmLiBmcm9tIHRoZSBzdGRsaWIpCiAgICAgICAgICAgIGlmIGltcGxlbWVudGF0aW9uIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBmcm9tIHhtbC5kb20gaW1wb3J0IG1pbmlkb20KICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uID0gbWluaWRvbQogICAgICAgICAgICAjIE5FVkVSIGNhY2hlIGhlcmUsIGNhY2hpbmcgaXMgZG9uZSBpbiB0aGUgZG9tIHN1Ym1vZHVsZQogICAgICAgICAgICByZXR1cm4gZG9tLmdldERvbU1vZHVsZShpbXBsZW1lbnRhdGlvbiwgKiprd2FyZ3MpLlRyZWVCdWlsZGVyCiAgICAgICAgZWxpZiB0cmVlVHlwZSA9PSAibHhtbCI6CiAgICAgICAgICAgIGZyb20gLiBpbXBvcnQgZXRyZWVfbHhtbAogICAgICAgICAgICB0cmVlQnVpbGRlckNhY2hlW3RyZWVUeXBlXSA9IGV0cmVlX2x4bWwuVHJlZUJ1aWxkZXIKICAgICAgICBlbGlmIHRyZWVUeXBlID09ICJldHJlZSI6CiAgICAgICAgICAgIGZyb20gLiBpbXBvcnQgZXRyZWUKICAgICAgICAgICAgaWYgaW1wbGVtZW50YXRpb24gaXMgTm9uZToKICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uID0gZGVmYXVsdF9ldHJlZQogICAgICAgICAgICAjIE5FVkVSIGNhY2hlIGhlcmUsIGNhY2hpbmcgaXMgZG9uZSBpbiB0aGUgZXRyZWUgc3VibW9kdWxlCiAgICAgICAgICAgIHJldHVybiBldHJlZS5nZXRFVHJlZU1vZHVsZShpbXBsZW1lbnRhdGlvbiwgKiprd2FyZ3MpLlRyZWVCdWlsZGVyCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiIiJVbnJlY29nbmlzZWQgdHJlZWJ1aWxkZXIgIiVzIiAiIiIgJSB0cmVlVHlwZSkKICAgIHJldHVybiB0cmVlQnVpbGRlckNhY2hlLmdldCh0cmVlVHlwZSkKUEsDBBQAAAAAAAAAIQBEylaqdjYAAHY2AAA5AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWVidWlsZGVycy9iYXNlLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCmZyb20gcGlwLl92ZW5kb3Iuc2l4IGltcG9ydCB0ZXh0X3R5cGUKCmZyb20gLi5jb25zdGFudHMgaW1wb3J0IHNjb3BpbmdFbGVtZW50cywgdGFibGVJbnNlcnRNb2RlRWxlbWVudHMsIG5hbWVzcGFjZXMKCiMgVGhlIHNjb3BlIG1hcmtlcnMgYXJlIGluc2VydGVkIHdoZW4gZW50ZXJpbmcgb2JqZWN0IGVsZW1lbnRzLAojIG1hcnF1ZWVzLCB0YWJsZSBjZWxscywgYW5kIHRhYmxlIGNhcHRpb25zLCBhbmQgYXJlIHVzZWQgdG8gcHJldmVudCBmb3JtYXR0aW5nCiMgZnJvbSAibGVha2luZyIgaW50byB0YWJsZXMsIG9iamVjdCBlbGVtZW50cywgYW5kIG1hcnF1ZWVzLgpNYXJrZXIgPSBOb25lCgpsaXN0RWxlbWVudHNNYXAgPSB7CiAgICBOb25lOiAoZnJvemVuc2V0KHNjb3BpbmdFbGVtZW50cyksIEZhbHNlKSwKICAgICJidXR0b24iOiAoZnJvemVuc2V0KHNjb3BpbmdFbGVtZW50cyB8IHNldChbKG5hbWVzcGFjZXNbImh0bWwiXSwgImJ1dHRvbiIpXSkpLCBGYWxzZSksCiAgICAibGlzdCI6IChmcm96ZW5zZXQoc2NvcGluZ0VsZW1lbnRzIHwgc2V0KFsobmFtZXNwYWNlc1siaHRtbCJdLCAib2wiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJ1bCIpXSkpLCBGYWxzZSksCiAgICAidGFibGUiOiAoZnJvemVuc2V0KFsobmFtZXNwYWNlc1siaHRtbCJdLCAiaHRtbCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgKG5hbWVzcGFjZXNbImh0bWwiXSwgInRhYmxlIildKSwgRmFsc2UpLAogICAgInNlbGVjdCI6IChmcm96ZW5zZXQoWyhuYW1lc3BhY2VzWyJodG1sIl0sICJvcHRncm91cCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgIChuYW1lc3BhY2VzWyJodG1sIl0sICJvcHRpb24iKV0pLCBUcnVlKQp9CgoKY2xhc3MgTm9kZShvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUpOgogICAgICAgICIiIk5vZGUgcmVwcmVzZW50aW5nIGFuIGl0ZW0gaW4gdGhlIHRyZWUuCiAgICAgICAgbmFtZSAtIFRoZSB0YWcgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIG5vZGUKICAgICAgICBwYXJlbnQgLSBUaGUgcGFyZW50IG9mIHRoZSBjdXJyZW50IG5vZGUgKG9yIE5vbmUgZm9yIHRoZSBkb2N1bWVudCBub2RlKQogICAgICAgIHZhbHVlIC0gVGhlIHZhbHVlIG9mIHRoZSBjdXJyZW50IG5vZGUgKGFwcGxpZXMgdG8gdGV4dCBub2RlcyBhbmQKICAgICAgICBjb21tZW50cwogICAgICAgIGF0dHJpYnV0ZXMgLSBhIGRpY3QgaG9sZGluZyBuYW1lLCB2YWx1ZSBwYWlycyBmb3IgYXR0cmlidXRlcyBvZiB0aGUgbm9kZQogICAgICAgIGNoaWxkTm9kZXMgLSBhIGxpc3Qgb2YgY2hpbGQgbm9kZXMgb2YgdGhlIGN1cnJlbnQgbm9kZS4gVGhpcyBtdXN0CiAgICAgICAgaW5jbHVkZSBhbGwgZWxlbWVudHMgYnV0IG5vdCBuZWNlc3NhcmlseSBvdGhlciBub2RlIHR5cGVzCiAgICAgICAgX2ZsYWdzIC0gQSBsaXN0IG9mIG1pc2NlbGxhbmVvdXMgZmxhZ3MgdGhhdCBjYW4gYmUgc2V0IG9uIHRoZSBub2RlCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5uYW1lID0gbmFtZQogICAgICAgIHNlbGYucGFyZW50ID0gTm9uZQogICAgICAgIHNlbGYudmFsdWUgPSBOb25lCiAgICAgICAgc2VsZi5hdHRyaWJ1dGVzID0ge30KICAgICAgICBzZWxmLmNoaWxkTm9kZXMgPSBbXQogICAgICAgIHNlbGYuX2ZsYWdzID0gW10KCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICBhdHRyaWJ1dGVzU3RyID0gIiAiLmpvaW4oWyIlcz1cIiVzXCIiICUgKG5hbWUsIHZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmF0dHJpYnV0ZXMuaXRlbXMoKV0pCiAgICAgICAgaWYgYXR0cmlidXRlc1N0cjoKICAgICAgICAgICAgcmV0dXJuICI8JXMgJXM+IiAlIChzZWxmLm5hbWUsIGF0dHJpYnV0ZXNTdHIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuICI8JXM+IiAlIChzZWxmLm5hbWUpCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiPCVzPiIgJSAoc2VsZi5uYW1lKQoKICAgIGRlZiBhcHBlbmRDaGlsZChzZWxmLCBub2RlKToKICAgICAgICAiIiJJbnNlcnQgbm9kZSBhcyBhIGNoaWxkIG9mIHRoZSBjdXJyZW50IG5vZGUKICAgICAgICAiIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCgogICAgZGVmIGluc2VydFRleHQoc2VsZiwgZGF0YSwgaW5zZXJ0QmVmb3JlPU5vbmUpOgogICAgICAgICIiIkluc2VydCBkYXRhIGFzIHRleHQgaW4gdGhlIGN1cnJlbnQgbm9kZSwgcG9zaXRpb25lZCBiZWZvcmUgdGhlCiAgICAgICAgc3RhcnQgb2Ygbm9kZSBpbnNlcnRCZWZvcmUgb3IgdG8gdGhlIGVuZCBvZiB0aGUgbm9kZSdzIHRleHQuCiAgICAgICAgIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgoKICAgIGRlZiBpbnNlcnRCZWZvcmUoc2VsZiwgbm9kZSwgcmVmTm9kZSk6CiAgICAgICAgIiIiSW5zZXJ0IG5vZGUgYXMgYSBjaGlsZCBvZiB0aGUgY3VycmVudCBub2RlLCBiZWZvcmUgcmVmTm9kZSBpbiB0aGUKICAgICAgICBsaXN0IG9mIGNoaWxkIG5vZGVzLiBSYWlzZXMgVmFsdWVFcnJvciBpZiByZWZOb2RlIGlzIG5vdCBhIGNoaWxkIG9mCiAgICAgICAgdGhlIGN1cnJlbnQgbm9kZSIiIgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKCiAgICBkZWYgcmVtb3ZlQ2hpbGQoc2VsZiwgbm9kZSk6CiAgICAgICAgIiIiUmVtb3ZlIG5vZGUgZnJvbSB0aGUgY2hpbGRyZW4gb2YgdGhlIGN1cnJlbnQgbm9kZQogICAgICAgICIiIgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKCiAgICBkZWYgcmVwYXJlbnRDaGlsZHJlbihzZWxmLCBuZXdQYXJlbnQpOgogICAgICAgICIiIk1vdmUgYWxsIHRoZSBjaGlsZHJlbiBvZiB0aGUgY3VycmVudCBub2RlIHRvIG5ld1BhcmVudC4KICAgICAgICBUaGlzIGlzIG5lZWRlZCBzbyB0aGF0IHRyZWVzIHRoYXQgZG9uJ3Qgc3RvcmUgdGV4dCBhcyBub2RlcyBtb3ZlIHRoZQogICAgICAgIHRleHQgaW4gdGhlIGNvcnJlY3Qgd2F5CiAgICAgICAgIiIiCiAgICAgICAgIyBYWFggLSBzaG91bGQgdGhpcyBtZXRob2QgYmUgbWFkZSBtb3JlIGdlbmVyYWw/CiAgICAgICAgZm9yIGNoaWxkIGluIHNlbGYuY2hpbGROb2RlczoKICAgICAgICAgICAgbmV3UGFyZW50LmFwcGVuZENoaWxkKGNoaWxkKQogICAgICAgIHNlbGYuY2hpbGROb2RlcyA9IFtdCgogICAgZGVmIGNsb25lTm9kZShzZWxmKToKICAgICAgICAiIiJSZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgdGhlIGN1cnJlbnQgbm9kZSBpLmUuIGEgbm9kZSB3aXRoIHRoZSBzYW1lCiAgICAgICAgbmFtZSBhbmQgYXR0cmlidXRlcyBidXQgd2l0aCBubyBwYXJlbnQgb3IgY2hpbGQgbm9kZXMKICAgICAgICAiIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCgogICAgZGVmIGhhc0NvbnRlbnQoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIHRydWUgaWYgdGhlIG5vZGUgaGFzIGNoaWxkcmVuIG9yIHRleHQsIGZhbHNlIG90aGVyd2lzZQogICAgICAgICIiIgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKCgpjbGFzcyBBY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMobGlzdCk6CiAgICBkZWYgYXBwZW5kKHNlbGYsIG5vZGUpOgogICAgICAgIGVxdWFsQ291bnQgPSAwCiAgICAgICAgaWYgbm9kZSAhPSBNYXJrZXI6CiAgICAgICAgICAgIGZvciBlbGVtZW50IGluIHNlbGZbOjotMV06CiAgICAgICAgICAgICAgICBpZiBlbGVtZW50ID09IE1hcmtlcjoKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgaWYgc2VsZi5ub2Rlc0VxdWFsKGVsZW1lbnQsIG5vZGUpOgogICAgICAgICAgICAgICAgICAgIGVxdWFsQ291bnQgKz0gMQogICAgICAgICAgICAgICAgaWYgZXF1YWxDb3VudCA9PSAzOgogICAgICAgICAgICAgICAgICAgIHNlbGYucmVtb3ZlKGVsZW1lbnQpCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBsaXN0LmFwcGVuZChzZWxmLCBub2RlKQoKICAgIGRlZiBub2Rlc0VxdWFsKHNlbGYsIG5vZGUxLCBub2RlMik6CiAgICAgICAgaWYgbm90IG5vZGUxLm5hbWVUdXBsZSA9PSBub2RlMi5uYW1lVHVwbGU6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICBpZiBub3Qgbm9kZTEuYXR0cmlidXRlcyA9PSBub2RlMi5hdHRyaWJ1dGVzOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgcmV0dXJuIFRydWUKCgpjbGFzcyBUcmVlQnVpbGRlcihvYmplY3QpOgogICAgIiIiQmFzZSB0cmVlYnVpbGRlciBpbXBsZW1lbnRhdGlvbgogICAgZG9jdW1lbnRDbGFzcyAtIHRoZSBjbGFzcyB0byB1c2UgZm9yIHRoZSBib3R0b21tb3N0IG5vZGUgb2YgYSBkb2N1bWVudAogICAgZWxlbWVudENsYXNzIC0gdGhlIGNsYXNzIHRvIHVzZSBmb3IgSFRNTCBFbGVtZW50cwogICAgY29tbWVudENsYXNzIC0gdGhlIGNsYXNzIHRvIHVzZSBmb3IgY29tbWVudHMKICAgIGRvY3R5cGVDbGFzcyAtIHRoZSBjbGFzcyB0byB1c2UgZm9yIGRvY3R5cGVzCiAgICAiIiIKICAgICMgcHlsaW50OmRpc2FibGU9bm90LWNhbGxhYmxlCgogICAgIyBEb2N1bWVudCBjbGFzcwogICAgZG9jdW1lbnRDbGFzcyA9IE5vbmUKCiAgICAjIFRoZSBjbGFzcyB0byB1c2UgZm9yIGNyZWF0aW5nIGEgbm9kZQogICAgZWxlbWVudENsYXNzID0gTm9uZQoKICAgICMgVGhlIGNsYXNzIHRvIHVzZSBmb3IgY3JlYXRpbmcgY29tbWVudHMKICAgIGNvbW1lbnRDbGFzcyA9IE5vbmUKCiAgICAjIFRoZSBjbGFzcyB0byB1c2UgZm9yIGNyZWF0aW5nIGRvY3R5cGVzCiAgICBkb2N0eXBlQ2xhc3MgPSBOb25lCgogICAgIyBGcmFnbWVudCBjbGFzcwogICAgZnJhZ21lbnRDbGFzcyA9IE5vbmUKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZXNwYWNlSFRNTEVsZW1lbnRzKToKICAgICAgICBpZiBuYW1lc3BhY2VIVE1MRWxlbWVudHM6CiAgICAgICAgICAgIHNlbGYuZGVmYXVsdE5hbWVzcGFjZSA9ICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuZGVmYXVsdE5hbWVzcGFjZSA9IE5vbmUKICAgICAgICBzZWxmLnJlc2V0KCkKCiAgICBkZWYgcmVzZXQoc2VsZik6CiAgICAgICAgc2VsZi5vcGVuRWxlbWVudHMgPSBbXQogICAgICAgIHNlbGYuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzID0gQWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKCkKCiAgICAgICAgIyBYWFggLSByZW5hbWUgdGhlc2UgdG8gaGVhZEVsZW1lbnQsIGZvcm1FbGVtZW50CiAgICAgICAgc2VsZi5oZWFkUG9pbnRlciA9IE5vbmUKICAgICAgICBzZWxmLmZvcm1Qb2ludGVyID0gTm9uZQoKICAgICAgICBzZWxmLmluc2VydEZyb21UYWJsZSA9IEZhbHNlCgogICAgICAgIHNlbGYuZG9jdW1lbnQgPSBzZWxmLmRvY3VtZW50Q2xhc3MoKQoKICAgIGRlZiBlbGVtZW50SW5TY29wZShzZWxmLCB0YXJnZXQsIHZhcmlhbnQ9Tm9uZSk6CgogICAgICAgICMgSWYgd2UgcGFzcyBhIG5vZGUgaW4gd2UgbWF0Y2ggdGhhdC4gaWYgd2UgcGFzcyBhIHN0cmluZwogICAgICAgICMgbWF0Y2ggYW55IG5vZGUgd2l0aCB0aGF0IG5hbWUKICAgICAgICBleGFjdE5vZGUgPSBoYXNhdHRyKHRhcmdldCwgIm5hbWVUdXBsZSIpCiAgICAgICAgaWYgbm90IGV4YWN0Tm9kZToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh0YXJnZXQsIHRleHRfdHlwZSk6CiAgICAgICAgICAgICAgICB0YXJnZXQgPSAobmFtZXNwYWNlc1siaHRtbCJdLCB0YXJnZXQpCiAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHRhcmdldCwgdHVwbGUpCgogICAgICAgIGxpc3RFbGVtZW50cywgaW52ZXJ0ID0gbGlzdEVsZW1lbnRzTWFwW3ZhcmlhbnRdCgogICAgICAgIGZvciBub2RlIGluIHJldmVyc2VkKHNlbGYub3BlbkVsZW1lbnRzKToKICAgICAgICAgICAgaWYgZXhhY3ROb2RlIGFuZCBub2RlID09IHRhcmdldDoKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgICAgIGVsaWYgbm90IGV4YWN0Tm9kZSBhbmQgbm9kZS5uYW1lVHVwbGUgPT0gdGFyZ2V0OgogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICAgICAgZWxpZiAoaW52ZXJ0IF4gKG5vZGUubmFtZVR1cGxlIGluIGxpc3RFbGVtZW50cykpOgogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIGFzc2VydCBGYWxzZSAgIyBXZSBzaG91bGQgbmV2ZXIgcmVhY2ggdGhpcyBwb2ludAoKICAgIGRlZiByZWNvbnN0cnVjdEFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cyhzZWxmKToKICAgICAgICAjIFdpdGhpbiB0aGlzIGFsZ29yaXRobSB0aGUgb3JkZXIgb2Ygc3RlcHMgZGVzY3JpYmVkIGluIHRoZQogICAgICAgICMgc3BlY2lmaWNhdGlvbiBpcyBub3QgcXVpdGUgdGhlIHNhbWUgYXMgdGhlIG9yZGVyIG9mIHN0ZXBzIGluIHRoZQogICAgICAgICMgY29kZS4gSXQgc2hvdWxkIHN0aWxsIGRvIHRoZSBzYW1lIHRob3VnaC4KCiAgICAgICAgIyBTdGVwIDE6IHN0b3AgdGhlIGFsZ29yaXRobSB3aGVuIHRoZXJlJ3Mgbm90aGluZyB0byBkby4KICAgICAgICBpZiBub3Qgc2VsZi5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHM6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIFN0ZXAgMiBhbmQgc3RlcCAzOiB3ZSBzdGFydCB3aXRoIHRoZSBsYXN0IGVsZW1lbnQuIFNvIGkgaXMgLTEuCiAgICAgICAgaSA9IGxlbihzZWxmLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cykgLSAxCiAgICAgICAgZW50cnkgPSBzZWxmLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50c1tpXQogICAgICAgIGlmIGVudHJ5ID09IE1hcmtlciBvciBlbnRyeSBpbiBzZWxmLm9wZW5FbGVtZW50czoKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICMgU3RlcCA2CiAgICAgICAgd2hpbGUgZW50cnkgIT0gTWFya2VyIGFuZCBlbnRyeSBub3QgaW4gc2VsZi5vcGVuRWxlbWVudHM6CiAgICAgICAgICAgIGlmIGkgPT0gMDoKICAgICAgICAgICAgICAgICMgVGhpcyB3aWxsIGJlIHJlc2V0IHRvIDAgYmVsb3cKICAgICAgICAgICAgICAgIGkgPSAtMQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgaSAtPSAxCiAgICAgICAgICAgICMgU3RlcCA1OiBsZXQgZW50cnkgYmUgb25lIGVhcmxpZXIgaW4gdGhlIGxpc3QuCiAgICAgICAgICAgIGVudHJ5ID0gc2VsZi5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHNbaV0KCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgIyBTdGVwIDcKICAgICAgICAgICAgaSArPSAxCgogICAgICAgICAgICAjIFN0ZXAgOAogICAgICAgICAgICBlbnRyeSA9IHNlbGYuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzW2ldCiAgICAgICAgICAgIGNsb25lID0gZW50cnkuY2xvbmVOb2RlKCkgICMgTWFpbmx5IHRvIGdldCBhIG5ldyBjb3B5IG9mIHRoZSBhdHRyaWJ1dGVzCgogICAgICAgICAgICAjIFN0ZXAgOQogICAgICAgICAgICBlbGVtZW50ID0gc2VsZi5pbnNlcnRFbGVtZW50KHsidHlwZSI6ICJTdGFydFRhZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogY2xvbmUubmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5hbWVzcGFjZSI6IGNsb25lLm5hbWVzcGFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiOiBjbG9uZS5hdHRyaWJ1dGVzfSkKCiAgICAgICAgICAgICMgU3RlcCAxMAogICAgICAgICAgICBzZWxmLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50c1tpXSA9IGVsZW1lbnQKCiAgICAgICAgICAgICMgU3RlcCAxMQogICAgICAgICAgICBpZiBlbGVtZW50ID09IHNlbGYuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzWy0xXToKICAgICAgICAgICAgICAgIGJyZWFrCgogICAgZGVmIGNsZWFyQWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzKHNlbGYpOgogICAgICAgIGVudHJ5ID0gc2VsZi5hY3RpdmVGb3JtYXR0aW5nRWxlbWVudHMucG9wKCkKICAgICAgICB3aGlsZSBzZWxmLmFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cyBhbmQgZW50cnkgIT0gTWFya2VyOgogICAgICAgICAgICBlbnRyeSA9IHNlbGYuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzLnBvcCgpCgogICAgZGVmIGVsZW1lbnRJbkFjdGl2ZUZvcm1hdHRpbmdFbGVtZW50cyhzZWxmLCBuYW1lKToKICAgICAgICAiIiJDaGVjayBpZiBhbiBlbGVtZW50IGV4aXN0cyBiZXR3ZWVuIHRoZSBlbmQgb2YgdGhlIGFjdGl2ZQogICAgICAgIGZvcm1hdHRpbmcgZWxlbWVudHMgYW5kIHRoZSBsYXN0IG1hcmtlci4gSWYgaXQgZG9lcywgcmV0dXJuIGl0LCBlbHNlCiAgICAgICAgcmV0dXJuIGZhbHNlIiIiCgogICAgICAgIGZvciBpdGVtIGluIHNlbGYuYWN0aXZlRm9ybWF0dGluZ0VsZW1lbnRzWzo6LTFdOgogICAgICAgICAgICAjIENoZWNrIGZvciBNYXJrZXIgZmlyc3QgYmVjYXVzZSBpZiBpdCdzIGEgTWFya2VyIGl0IGRvZXNuJ3QgaGF2ZSBhCiAgICAgICAgICAgICMgbmFtZSBhdHRyaWJ1dGUuCiAgICAgICAgICAgIGlmIGl0ZW0gPT0gTWFya2VyOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZWxpZiBpdGVtLm5hbWUgPT0gbmFtZToKICAgICAgICAgICAgICAgIHJldHVybiBpdGVtCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIGluc2VydFJvb3Qoc2VsZiwgdG9rZW4pOgogICAgICAgIGVsZW1lbnQgPSBzZWxmLmNyZWF0ZUVsZW1lbnQodG9rZW4pCiAgICAgICAgc2VsZi5vcGVuRWxlbWVudHMuYXBwZW5kKGVsZW1lbnQpCiAgICAgICAgc2VsZi5kb2N1bWVudC5hcHBlbmRDaGlsZChlbGVtZW50KQoKICAgIGRlZiBpbnNlcnREb2N0eXBlKHNlbGYsIHRva2VuKToKICAgICAgICBuYW1lID0gdG9rZW5bIm5hbWUiXQogICAgICAgIHB1YmxpY0lkID0gdG9rZW5bInB1YmxpY0lkIl0KICAgICAgICBzeXN0ZW1JZCA9IHRva2VuWyJzeXN0ZW1JZCJdCgogICAgICAgIGRvY3R5cGUgPSBzZWxmLmRvY3R5cGVDbGFzcyhuYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQpCiAgICAgICAgc2VsZi5kb2N1bWVudC5hcHBlbmRDaGlsZChkb2N0eXBlKQoKICAgIGRlZiBpbnNlcnRDb21tZW50KHNlbGYsIHRva2VuLCBwYXJlbnQ9Tm9uZSk6CiAgICAgICAgaWYgcGFyZW50IGlzIE5vbmU6CiAgICAgICAgICAgIHBhcmVudCA9IHNlbGYub3BlbkVsZW1lbnRzWy0xXQogICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChzZWxmLmNvbW1lbnRDbGFzcyh0b2tlblsiZGF0YSJdKSkKCiAgICBkZWYgY3JlYXRlRWxlbWVudChzZWxmLCB0b2tlbik6CiAgICAgICAgIiIiQ3JlYXRlIGFuIGVsZW1lbnQgYnV0IGRvbid0IGluc2VydCBpdCBhbnl3aGVyZSIiIgogICAgICAgIG5hbWUgPSB0b2tlblsibmFtZSJdCiAgICAgICAgbmFtZXNwYWNlID0gdG9rZW4uZ2V0KCJuYW1lc3BhY2UiLCBzZWxmLmRlZmF1bHROYW1lc3BhY2UpCiAgICAgICAgZWxlbWVudCA9IHNlbGYuZWxlbWVudENsYXNzKG5hbWUsIG5hbWVzcGFjZSkKICAgICAgICBlbGVtZW50LmF0dHJpYnV0ZXMgPSB0b2tlblsiZGF0YSJdCiAgICAgICAgcmV0dXJuIGVsZW1lbnQKCiAgICBkZWYgX2dldEluc2VydEZyb21UYWJsZShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5faW5zZXJ0RnJvbVRhYmxlCgogICAgZGVmIF9zZXRJbnNlcnRGcm9tVGFibGUoc2VsZiwgdmFsdWUpOgogICAgICAgICIiIlN3aXRjaCB0aGUgZnVuY3Rpb24gdXNlZCB0byBpbnNlcnQgYW4gZWxlbWVudCBmcm9tIHRoZQogICAgICAgIG5vcm1hbCBvbmUgdG8gdGhlIG1pc25lc3RlZCB0YWJsZSBvbmUgYW5kIGJhY2sgYWdhaW4iIiIKICAgICAgICBzZWxmLl9pbnNlcnRGcm9tVGFibGUgPSB2YWx1ZQogICAgICAgIGlmIHZhbHVlOgogICAgICAgICAgICBzZWxmLmluc2VydEVsZW1lbnQgPSBzZWxmLmluc2VydEVsZW1lbnRUYWJsZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuaW5zZXJ0RWxlbWVudCA9IHNlbGYuaW5zZXJ0RWxlbWVudE5vcm1hbAoKICAgIGluc2VydEZyb21UYWJsZSA9IHByb3BlcnR5KF9nZXRJbnNlcnRGcm9tVGFibGUsIF9zZXRJbnNlcnRGcm9tVGFibGUpCgogICAgZGVmIGluc2VydEVsZW1lbnROb3JtYWwoc2VsZiwgdG9rZW4pOgogICAgICAgIG5hbWUgPSB0b2tlblsibmFtZSJdCiAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UobmFtZSwgdGV4dF90eXBlKSwgIkVsZW1lbnQgJXMgbm90IHVuaWNvZGUiICUgbmFtZQogICAgICAgIG5hbWVzcGFjZSA9IHRva2VuLmdldCgibmFtZXNwYWNlIiwgc2VsZi5kZWZhdWx0TmFtZXNwYWNlKQogICAgICAgIGVsZW1lbnQgPSBzZWxmLmVsZW1lbnRDbGFzcyhuYW1lLCBuYW1lc3BhY2UpCiAgICAgICAgZWxlbWVudC5hdHRyaWJ1dGVzID0gdG9rZW5bImRhdGEiXQogICAgICAgIHNlbGYub3BlbkVsZW1lbnRzWy0xXS5hcHBlbmRDaGlsZChlbGVtZW50KQogICAgICAgIHNlbGYub3BlbkVsZW1lbnRzLmFwcGVuZChlbGVtZW50KQogICAgICAgIHJldHVybiBlbGVtZW50CgogICAgZGVmIGluc2VydEVsZW1lbnRUYWJsZShzZWxmLCB0b2tlbik6CiAgICAgICAgIiIiQ3JlYXRlIGFuIGVsZW1lbnQgYW5kIGluc2VydCBpdCBpbnRvIHRoZSB0cmVlIiIiCiAgICAgICAgZWxlbWVudCA9IHNlbGYuY3JlYXRlRWxlbWVudCh0b2tlbikKICAgICAgICBpZiBzZWxmLm9wZW5FbGVtZW50c1stMV0ubmFtZSBub3QgaW4gdGFibGVJbnNlcnRNb2RlRWxlbWVudHM6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmluc2VydEVsZW1lbnROb3JtYWwodG9rZW4pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBXZSBzaG91bGQgYmUgaW4gdGhlIEluVGFibGUgbW9kZS4gVGhpcyBtZWFucyB3ZSB3YW50IHRvIGRvCiAgICAgICAgICAgICMgc3BlY2lhbCBtYWdpYyBlbGVtZW50IHJlYXJyYW5naW5nCiAgICAgICAgICAgIHBhcmVudCwgaW5zZXJ0QmVmb3JlID0gc2VsZi5nZXRUYWJsZU1pc25lc3RlZE5vZGVQb3NpdGlvbigpCiAgICAgICAgICAgIGlmIGluc2VydEJlZm9yZSBpcyBOb25lOgogICAgICAgICAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKGVsZW1lbnQsIGluc2VydEJlZm9yZSkKICAgICAgICAgICAgc2VsZi5vcGVuRWxlbWVudHMuYXBwZW5kKGVsZW1lbnQpCiAgICAgICAgcmV0dXJuIGVsZW1lbnQKCiAgICBkZWYgaW5zZXJ0VGV4dChzZWxmLCBkYXRhLCBwYXJlbnQ9Tm9uZSk6CiAgICAgICAgIiIiSW5zZXJ0IHRleHQgZGF0YS4iIiIKICAgICAgICBpZiBwYXJlbnQgaXMgTm9uZToKICAgICAgICAgICAgcGFyZW50ID0gc2VsZi5vcGVuRWxlbWVudHNbLTFdCgogICAgICAgIGlmIChub3Qgc2VsZi5pbnNlcnRGcm9tVGFibGUgb3IgKHNlbGYuaW5zZXJ0RnJvbVRhYmxlIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3BlbkVsZW1lbnRzWy0xXS5uYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGluIHRhYmxlSW5zZXJ0TW9kZUVsZW1lbnRzKSk6CiAgICAgICAgICAgIHBhcmVudC5pbnNlcnRUZXh0KGRhdGEpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBXZSBzaG91bGQgYmUgaW4gdGhlIEluVGFibGUgbW9kZS4gVGhpcyBtZWFucyB3ZSB3YW50IHRvIGRvCiAgICAgICAgICAgICMgc3BlY2lhbCBtYWdpYyBlbGVtZW50IHJlYXJyYW5naW5nCiAgICAgICAgICAgIHBhcmVudCwgaW5zZXJ0QmVmb3JlID0gc2VsZi5nZXRUYWJsZU1pc25lc3RlZE5vZGVQb3NpdGlvbigpCiAgICAgICAgICAgIHBhcmVudC5pbnNlcnRUZXh0KGRhdGEsIGluc2VydEJlZm9yZSkKCiAgICBkZWYgZ2V0VGFibGVNaXNuZXN0ZWROb2RlUG9zaXRpb24oc2VsZik6CiAgICAgICAgIiIiR2V0IHRoZSBmb3N0ZXIgcGFyZW50IGVsZW1lbnQsIGFuZCBzaWJsaW5nIHRvIGluc2VydCBiZWZvcmUKICAgICAgICAob3IgTm9uZSkgd2hlbiBpbnNlcnRpbmcgYSBtaXNuZXN0ZWQgdGFibGUgbm9kZSIiIgogICAgICAgICMgVGhlIGZvc3RlciBwYXJlbnQgZWxlbWVudCBpcyB0aGUgb25lIHdoaWNoIGNvbWVzIGJlZm9yZSB0aGUgbW9zdAogICAgICAgICMgcmVjZW50bHkgb3BlbmVkIHRhYmxlIGVsZW1lbnQKICAgICAgICAjIFhYWCAtIHRoaXMgaXMgcmVhbGx5IGluZWxlZ2FudAogICAgICAgIGxhc3RUYWJsZSA9IE5vbmUKICAgICAgICBmb3N0ZXJQYXJlbnQgPSBOb25lCiAgICAgICAgaW5zZXJ0QmVmb3JlID0gTm9uZQogICAgICAgIGZvciBlbG0gaW4gc2VsZi5vcGVuRWxlbWVudHNbOjotMV06CiAgICAgICAgICAgIGlmIGVsbS5uYW1lID09ICJ0YWJsZSI6CiAgICAgICAgICAgICAgICBsYXN0VGFibGUgPSBlbG0KICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgaWYgbGFzdFRhYmxlOgogICAgICAgICAgICAjIFhYWCAtIHdlIHNob3VsZCByZWFsbHkgY2hlY2sgdGhhdCB0aGlzIHBhcmVudCBpcyBhY3R1YWxseSBhCiAgICAgICAgICAgICMgbm9kZSBoZXJlCiAgICAgICAgICAgIGlmIGxhc3RUYWJsZS5wYXJlbnQ6CiAgICAgICAgICAgICAgICBmb3N0ZXJQYXJlbnQgPSBsYXN0VGFibGUucGFyZW50CiAgICAgICAgICAgICAgICBpbnNlcnRCZWZvcmUgPSBsYXN0VGFibGUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGZvc3RlclBhcmVudCA9IHNlbGYub3BlbkVsZW1lbnRzWwogICAgICAgICAgICAgICAgICAgIHNlbGYub3BlbkVsZW1lbnRzLmluZGV4KGxhc3RUYWJsZSkgLSAxXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGZvc3RlclBhcmVudCA9IHNlbGYub3BlbkVsZW1lbnRzWzBdCiAgICAgICAgcmV0dXJuIGZvc3RlclBhcmVudCwgaW5zZXJ0QmVmb3JlCgogICAgZGVmIGdlbmVyYXRlSW1wbGllZEVuZFRhZ3Moc2VsZiwgZXhjbHVkZT1Ob25lKToKICAgICAgICBuYW1lID0gc2VsZi5vcGVuRWxlbWVudHNbLTFdLm5hbWUKICAgICAgICAjIFhYWCB0ZCwgdGggYW5kIHRyIGFyZSBub3QgYWN0dWFsbHkgbmVlZGVkCiAgICAgICAgaWYgKG5hbWUgaW4gZnJvemVuc2V0KCgiZGQiLCAiZHQiLCAibGkiLCAib3B0aW9uIiwgIm9wdGdyb3VwIiwgInAiLCAicnAiLCAicnQiKSkgYW5kCiAgICAgICAgICAgICAgICBuYW1lICE9IGV4Y2x1ZGUpOgogICAgICAgICAgICBzZWxmLm9wZW5FbGVtZW50cy5wb3AoKQogICAgICAgICAgICAjIFhYWCBUaGlzIGlzIG5vdCBlbnRpcmVseSB3aGF0IHRoZSBzcGVjaWZpY2F0aW9uIHNheXMuIFdlIHNob3VsZAogICAgICAgICAgICAjIGludmVzdGlnYXRlIGl0IG1vcmUgY2xvc2VseS4KICAgICAgICAgICAgc2VsZi5nZW5lcmF0ZUltcGxpZWRFbmRUYWdzKGV4Y2x1ZGUpCgogICAgZGVmIGdldERvY3VtZW50KHNlbGYpOgogICAgICAgICJSZXR1cm4gdGhlIGZpbmFsIHRyZWUiCiAgICAgICAgcmV0dXJuIHNlbGYuZG9jdW1lbnQKCiAgICBkZWYgZ2V0RnJhZ21lbnQoc2VsZik6CiAgICAgICAgIlJldHVybiB0aGUgZmluYWwgZnJhZ21lbnQiCiAgICAgICAgIyBhc3NlcnQgc2VsZi5pbm5lckhUTUwKICAgICAgICBmcmFnbWVudCA9IHNlbGYuZnJhZ21lbnRDbGFzcygpCiAgICAgICAgc2VsZi5vcGVuRWxlbWVudHNbMF0ucmVwYXJlbnRDaGlsZHJlbihmcmFnbWVudCkKICAgICAgICByZXR1cm4gZnJhZ21lbnQKCiAgICBkZWYgdGVzdFNlcmlhbGl6ZXIoc2VsZiwgbm9kZSk6CiAgICAgICAgIiIiU2VyaWFsaXplIHRoZSBzdWJ0cmVlIG9mIG5vZGUgaW4gdGhlIGZvcm1hdCByZXF1aXJlZCBieSB1bml0IHRlc3RzCiAgICAgICAgbm9kZSAtIHRoZSBub2RlIGZyb20gd2hpY2ggdG8gc3RhcnQgc2VyaWFsaXppbmciIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yClBLAwQUAAAAAAAAACEACOou+IMiAACDIgAAOAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVlYnVpbGRlcnMvZG9tLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCgoKZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgTXV0YWJsZU1hcHBpbmcKZnJvbSB4bWwuZG9tIGltcG9ydCBtaW5pZG9tLCBOb2RlCmltcG9ydCB3ZWFrcmVmCgpmcm9tIC4gaW1wb3J0IGJhc2UKZnJvbSAuLiBpbXBvcnQgY29uc3RhbnRzCmZyb20gLi5jb25zdGFudHMgaW1wb3J0IG5hbWVzcGFjZXMKZnJvbSAuLl91dGlscyBpbXBvcnQgbW9kdWxlRmFjdG9yeUZhY3RvcnkKCgpkZWYgZ2V0RG9tQnVpbGRlcihEb21JbXBsZW1lbnRhdGlvbik6CiAgICBEb20gPSBEb21JbXBsZW1lbnRhdGlvbgoKICAgIGNsYXNzIEF0dHJMaXN0KE11dGFibGVNYXBwaW5nKToKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgZWxlbWVudCk6CiAgICAgICAgICAgIHNlbGYuZWxlbWVudCA9IGVsZW1lbnQKCiAgICAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gaXRlcihzZWxmLmVsZW1lbnQuYXR0cmlidXRlcy5rZXlzKCkpCgogICAgICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBuYW1lLCB2YWx1ZSk6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UobmFtZSwgdHVwbGUpOgogICAgICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYXR0ciA9IHNlbGYuZWxlbWVudC5vd25lckRvY3VtZW50LmNyZWF0ZUF0dHJpYnV0ZShuYW1lKQogICAgICAgICAgICAgICAgYXR0ci52YWx1ZSA9IHZhbHVlCiAgICAgICAgICAgICAgICBzZWxmLmVsZW1lbnQuYXR0cmlidXRlc1tuYW1lXSA9IGF0dHIKCiAgICAgICAgZGVmIF9fbGVuX18oc2VsZik6CiAgICAgICAgICAgIHJldHVybiBsZW4oc2VsZi5lbGVtZW50LmF0dHJpYnV0ZXMpCgogICAgICAgIGRlZiBpdGVtcyhzZWxmKToKICAgICAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5lbGVtZW50LmF0dHJpYnV0ZXMuaXRlbXMoKSkKCiAgICAgICAgZGVmIHZhbHVlcyhzZWxmKToKICAgICAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5lbGVtZW50LmF0dHJpYnV0ZXMudmFsdWVzKCkpCgogICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBuYW1lKToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShuYW1lLCB0dXBsZSk6CiAgICAgICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5lbGVtZW50LmF0dHJpYnV0ZXNbbmFtZV0udmFsdWUKCiAgICAgICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIG5hbWUpOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKG5hbWUsIHR1cGxlKToKICAgICAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGRlbCBzZWxmLmVsZW1lbnQuYXR0cmlidXRlc1tuYW1lXQoKICAgIGNsYXNzIE5vZGVCdWlsZGVyKGJhc2UuTm9kZSk6CiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGVsZW1lbnQpOgogICAgICAgICAgICBiYXNlLk5vZGUuX19pbml0X18oc2VsZiwgZWxlbWVudC5ub2RlTmFtZSkKICAgICAgICAgICAgc2VsZi5lbGVtZW50ID0gZWxlbWVudAoKICAgICAgICBuYW1lc3BhY2UgPSBwcm9wZXJ0eShsYW1iZGEgc2VsZjogaGFzYXR0cihzZWxmLmVsZW1lbnQsICJuYW1lc3BhY2VVUkkiKSBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVsZW1lbnQubmFtZXNwYWNlVVJJIG9yIE5vbmUpCgogICAgICAgIGRlZiBhcHBlbmRDaGlsZChzZWxmLCBub2RlKToKICAgICAgICAgICAgbm9kZS5wYXJlbnQgPSBzZWxmCiAgICAgICAgICAgIHNlbGYuZWxlbWVudC5hcHBlbmRDaGlsZChub2RlLmVsZW1lbnQpCgogICAgICAgIGRlZiBpbnNlcnRUZXh0KHNlbGYsIGRhdGEsIGluc2VydEJlZm9yZT1Ob25lKToKICAgICAgICAgICAgdGV4dCA9IHNlbGYuZWxlbWVudC5vd25lckRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGRhdGEpCiAgICAgICAgICAgIGlmIGluc2VydEJlZm9yZToKICAgICAgICAgICAgICAgIHNlbGYuZWxlbWVudC5pbnNlcnRCZWZvcmUodGV4dCwgaW5zZXJ0QmVmb3JlLmVsZW1lbnQpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLmVsZW1lbnQuYXBwZW5kQ2hpbGQodGV4dCkKCiAgICAgICAgZGVmIGluc2VydEJlZm9yZShzZWxmLCBub2RlLCByZWZOb2RlKToKICAgICAgICAgICAgc2VsZi5lbGVtZW50Lmluc2VydEJlZm9yZShub2RlLmVsZW1lbnQsIHJlZk5vZGUuZWxlbWVudCkKICAgICAgICAgICAgbm9kZS5wYXJlbnQgPSBzZWxmCgogICAgICAgIGRlZiByZW1vdmVDaGlsZChzZWxmLCBub2RlKToKICAgICAgICAgICAgaWYgbm9kZS5lbGVtZW50LnBhcmVudE5vZGUgPT0gc2VsZi5lbGVtZW50OgogICAgICAgICAgICAgICAgc2VsZi5lbGVtZW50LnJlbW92ZUNoaWxkKG5vZGUuZWxlbWVudCkKICAgICAgICAgICAgbm9kZS5wYXJlbnQgPSBOb25lCgogICAgICAgIGRlZiByZXBhcmVudENoaWxkcmVuKHNlbGYsIG5ld1BhcmVudCk6CiAgICAgICAgICAgIHdoaWxlIHNlbGYuZWxlbWVudC5oYXNDaGlsZE5vZGVzKCk6CiAgICAgICAgICAgICAgICBjaGlsZCA9IHNlbGYuZWxlbWVudC5maXJzdENoaWxkCiAgICAgICAgICAgICAgICBzZWxmLmVsZW1lbnQucmVtb3ZlQ2hpbGQoY2hpbGQpCiAgICAgICAgICAgICAgICBuZXdQYXJlbnQuZWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZCkKICAgICAgICAgICAgc2VsZi5jaGlsZE5vZGVzID0gW10KCiAgICAgICAgZGVmIGdldEF0dHJpYnV0ZXMoc2VsZik6CiAgICAgICAgICAgIHJldHVybiBBdHRyTGlzdChzZWxmLmVsZW1lbnQpCgogICAgICAgIGRlZiBzZXRBdHRyaWJ1dGVzKHNlbGYsIGF0dHJpYnV0ZXMpOgogICAgICAgICAgICBpZiBhdHRyaWJ1dGVzOgogICAgICAgICAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIGxpc3QoYXR0cmlidXRlcy5pdGVtcygpKToKICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG5hbWUsIHR1cGxlKToKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbmFtZVswXSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpZmllZE5hbWUgPSAobmFtZVswXSArICI6IiArIG5hbWVbMV0pCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaWZpZWROYW1lID0gbmFtZVsxXQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVsZW1lbnQuc2V0QXR0cmlidXRlTlMobmFtZVsyXSwgcXVhbGlmaWVkTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZWxlbWVudC5zZXRBdHRyaWJ1dGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCB2YWx1ZSkKICAgICAgICBhdHRyaWJ1dGVzID0gcHJvcGVydHkoZ2V0QXR0cmlidXRlcywgc2V0QXR0cmlidXRlcykKCiAgICAgICAgZGVmIGNsb25lTm9kZShzZWxmKToKICAgICAgICAgICAgcmV0dXJuIE5vZGVCdWlsZGVyKHNlbGYuZWxlbWVudC5jbG9uZU5vZGUoRmFsc2UpKQoKICAgICAgICBkZWYgaGFzQ29udGVudChzZWxmKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuZWxlbWVudC5oYXNDaGlsZE5vZGVzKCkKCiAgICAgICAgZGVmIGdldE5hbWVUdXBsZShzZWxmKToKICAgICAgICAgICAgaWYgc2VsZi5uYW1lc3BhY2UgaXMgTm9uZToKICAgICAgICAgICAgICAgIHJldHVybiBuYW1lc3BhY2VzWyJodG1sIl0sIHNlbGYubmFtZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZXNwYWNlLCBzZWxmLm5hbWUKCiAgICAgICAgbmFtZVR1cGxlID0gcHJvcGVydHkoZ2V0TmFtZVR1cGxlKQoKICAgIGNsYXNzIFRyZWVCdWlsZGVyKGJhc2UuVHJlZUJ1aWxkZXIpOiAgIyBweWxpbnQ6ZGlzYWJsZT11bnVzZWQtdmFyaWFibGUKICAgICAgICBkZWYgZG9jdW1lbnRDbGFzcyhzZWxmKToKICAgICAgICAgICAgc2VsZi5kb20gPSBEb20uZ2V0RE9NSW1wbGVtZW50YXRpb24oKS5jcmVhdGVEb2N1bWVudChOb25lLCBOb25lLCBOb25lKQogICAgICAgICAgICByZXR1cm4gd2Vha3JlZi5wcm94eShzZWxmKQoKICAgICAgICBkZWYgaW5zZXJ0RG9jdHlwZShzZWxmLCB0b2tlbik6CiAgICAgICAgICAgIG5hbWUgPSB0b2tlblsibmFtZSJdCiAgICAgICAgICAgIHB1YmxpY0lkID0gdG9rZW5bInB1YmxpY0lkIl0KICAgICAgICAgICAgc3lzdGVtSWQgPSB0b2tlblsic3lzdGVtSWQiXQoKICAgICAgICAgICAgZG9taW1wbCA9IERvbS5nZXRET01JbXBsZW1lbnRhdGlvbigpCiAgICAgICAgICAgIGRvY3R5cGUgPSBkb21pbXBsLmNyZWF0ZURvY3VtZW50VHlwZShuYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQpCiAgICAgICAgICAgIHNlbGYuZG9jdW1lbnQuYXBwZW5kQ2hpbGQoTm9kZUJ1aWxkZXIoZG9jdHlwZSkpCiAgICAgICAgICAgIGlmIERvbSA9PSBtaW5pZG9tOgogICAgICAgICAgICAgICAgZG9jdHlwZS5vd25lckRvY3VtZW50ID0gc2VsZi5kb20KCiAgICAgICAgZGVmIGVsZW1lbnRDbGFzcyhzZWxmLCBuYW1lLCBuYW1lc3BhY2U9Tm9uZSk6CiAgICAgICAgICAgIGlmIG5hbWVzcGFjZSBpcyBOb25lIGFuZCBzZWxmLmRlZmF1bHROYW1lc3BhY2UgaXMgTm9uZToKICAgICAgICAgICAgICAgIG5vZGUgPSBzZWxmLmRvbS5jcmVhdGVFbGVtZW50KG5hbWUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBub2RlID0gc2VsZi5kb20uY3JlYXRlRWxlbWVudE5TKG5hbWVzcGFjZSwgbmFtZSkKCiAgICAgICAgICAgIHJldHVybiBOb2RlQnVpbGRlcihub2RlKQoKICAgICAgICBkZWYgY29tbWVudENsYXNzKHNlbGYsIGRhdGEpOgogICAgICAgICAgICByZXR1cm4gTm9kZUJ1aWxkZXIoc2VsZi5kb20uY3JlYXRlQ29tbWVudChkYXRhKSkKCiAgICAgICAgZGVmIGZyYWdtZW50Q2xhc3Moc2VsZik6CiAgICAgICAgICAgIHJldHVybiBOb2RlQnVpbGRlcihzZWxmLmRvbS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkpCgogICAgICAgIGRlZiBhcHBlbmRDaGlsZChzZWxmLCBub2RlKToKICAgICAgICAgICAgc2VsZi5kb20uYXBwZW5kQ2hpbGQobm9kZS5lbGVtZW50KQoKICAgICAgICBkZWYgdGVzdFNlcmlhbGl6ZXIoc2VsZiwgZWxlbWVudCk6CiAgICAgICAgICAgIHJldHVybiB0ZXN0U2VyaWFsaXplcihlbGVtZW50KQoKICAgICAgICBkZWYgZ2V0RG9jdW1lbnQoc2VsZik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmRvbQoKICAgICAgICBkZWYgZ2V0RnJhZ21lbnQoc2VsZik6CiAgICAgICAgICAgIHJldHVybiBiYXNlLlRyZWVCdWlsZGVyLmdldEZyYWdtZW50KHNlbGYpLmVsZW1lbnQKCiAgICAgICAgZGVmIGluc2VydFRleHQoc2VsZiwgZGF0YSwgcGFyZW50PU5vbmUpOgogICAgICAgICAgICBkYXRhID0gZGF0YQogICAgICAgICAgICBpZiBwYXJlbnQgIT0gc2VsZjoKICAgICAgICAgICAgICAgIGJhc2UuVHJlZUJ1aWxkZXIuaW5zZXJ0VGV4dChzZWxmLCBkYXRhLCBwYXJlbnQpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIEhBQ0s6IGFsbG93IHRleHQgbm9kZXMgYXMgY2hpbGRyZW4gb2YgdGhlIGRvY3VtZW50IG5vZGUKICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIoc2VsZi5kb20sICdfY2hpbGRfbm9kZV90eXBlcycpOgogICAgICAgICAgICAgICAgICAgICMgcHlsaW50OmRpc2FibGU9cHJvdGVjdGVkLWFjY2VzcwogICAgICAgICAgICAgICAgICAgIGlmIE5vZGUuVEVYVF9OT0RFIG5vdCBpbiBzZWxmLmRvbS5fY2hpbGRfbm9kZV90eXBlczoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kb20uX2NoaWxkX25vZGVfdHlwZXMgPSBsaXN0KHNlbGYuZG9tLl9jaGlsZF9ub2RlX3R5cGVzKQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRvbS5fY2hpbGRfbm9kZV90eXBlcy5hcHBlbmQoTm9kZS5URVhUX05PREUpCiAgICAgICAgICAgICAgICBzZWxmLmRvbS5hcHBlbmRDaGlsZChzZWxmLmRvbS5jcmVhdGVUZXh0Tm9kZShkYXRhKSkKCiAgICAgICAgaW1wbGVtZW50YXRpb24gPSBEb21JbXBsZW1lbnRhdGlvbgogICAgICAgIG5hbWUgPSBOb25lCgogICAgZGVmIHRlc3RTZXJpYWxpemVyKGVsZW1lbnQpOgogICAgICAgIGVsZW1lbnQubm9ybWFsaXplKCkKICAgICAgICBydiA9IFtdCgogICAgICAgIGRlZiBzZXJpYWxpemVFbGVtZW50KGVsZW1lbnQsIGluZGVudD0wKToKICAgICAgICAgICAgaWYgZWxlbWVudC5ub2RlVHlwZSA9PSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERToKICAgICAgICAgICAgICAgIGlmIGVsZW1lbnQubmFtZToKICAgICAgICAgICAgICAgICAgICBpZiBlbGVtZW50LnB1YmxpY0lkIG9yIGVsZW1lbnQuc3lzdGVtSWQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpY0lkID0gZWxlbWVudC5wdWJsaWNJZCBvciAiIgogICAgICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCA9IGVsZW1lbnQuc3lzdGVtSWQgb3IgIiIKICAgICAgICAgICAgICAgICAgICAgICAgcnYuYXBwZW5kKCIiInwlczwhRE9DVFlQRSAlcyAiJXMiICIlcyI+IiIiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnICcgKiBpbmRlbnQsIGVsZW1lbnQubmFtZSwgcHVibGljSWQsIHN5c3RlbUlkKSkKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBydi5hcHBlbmQoInwlczwhRE9DVFlQRSAlcz4iICUgKCcgJyAqIGluZGVudCwgZWxlbWVudC5uYW1lKSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcnYuYXBwZW5kKCJ8JXM8IURPQ1RZUEUgPiIgJSAoJyAnICogaW5kZW50LCkpCiAgICAgICAgICAgIGVsaWYgZWxlbWVudC5ub2RlVHlwZSA9PSBOb2RlLkRPQ1VNRU5UX05PREU6CiAgICAgICAgICAgICAgICBydi5hcHBlbmQoIiNkb2N1bWVudCIpCiAgICAgICAgICAgIGVsaWYgZWxlbWVudC5ub2RlVHlwZSA9PSBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU6CiAgICAgICAgICAgICAgICBydi5hcHBlbmQoIiNkb2N1bWVudC1mcmFnbWVudCIpCiAgICAgICAgICAgIGVsaWYgZWxlbWVudC5ub2RlVHlwZSA9PSBOb2RlLkNPTU1FTlRfTk9ERToKICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgifCVzPCEtLSAlcyAtLT4iICUgKCcgJyAqIGluZGVudCwgZWxlbWVudC5ub2RlVmFsdWUpKQogICAgICAgICAgICBlbGlmIGVsZW1lbnQubm9kZVR5cGUgPT0gTm9kZS5URVhUX05PREU6CiAgICAgICAgICAgICAgICBydi5hcHBlbmQoInwlc1wiJXNcIiIgJSAoJyAnICogaW5kZW50LCBlbGVtZW50Lm5vZGVWYWx1ZSkpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpZiAoaGFzYXR0cihlbGVtZW50LCAibmFtZXNwYWNlVVJJIikgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQubmFtZXNwYWNlVVJJIGlzIG5vdCBOb25lKToKICAgICAgICAgICAgICAgICAgICBuYW1lID0gIiVzICVzIiAlIChjb25zdGFudHMucHJlZml4ZXNbZWxlbWVudC5uYW1lc3BhY2VVUkldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQubm9kZU5hbWUpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG5hbWUgPSBlbGVtZW50Lm5vZGVOYW1lCiAgICAgICAgICAgICAgICBydi5hcHBlbmQoInwlczwlcz4iICUgKCcgJyAqIGluZGVudCwgbmFtZSkpCiAgICAgICAgICAgICAgICBpZiBlbGVtZW50Lmhhc0F0dHJpYnV0ZXMoKToKICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzID0gW10KICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oZWxlbWVudC5hdHRyaWJ1dGVzKSk6CiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIgPSBlbGVtZW50LmF0dHJpYnV0ZXMuaXRlbShpKQogICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gYXR0ci5ub2RlTmFtZQogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGF0dHIudmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgbnMgPSBhdHRyLm5hbWVzcGFjZVVSSQogICAgICAgICAgICAgICAgICAgICAgICBpZiBuczoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiJXMgJXMiICUgKGNvbnN0YW50cy5wcmVmaXhlc1tuc10sIGF0dHIubG9jYWxOYW1lKQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGF0dHIubm9kZU5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcy5hcHBlbmQoKG5hbWUsIHZhbHVlKSkKCiAgICAgICAgICAgICAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIHNvcnRlZChhdHRyaWJ1dGVzKToKICAgICAgICAgICAgICAgICAgICAgICAgcnYuYXBwZW5kKCd8JXMlcz0iJXMiJyAlICgnICcgKiAoaW5kZW50ICsgMiksIG5hbWUsIHZhbHVlKSkKICAgICAgICAgICAgaW5kZW50ICs9IDIKICAgICAgICAgICAgZm9yIGNoaWxkIGluIGVsZW1lbnQuY2hpbGROb2RlczoKICAgICAgICAgICAgICAgIHNlcmlhbGl6ZUVsZW1lbnQoY2hpbGQsIGluZGVudCkKICAgICAgICBzZXJpYWxpemVFbGVtZW50KGVsZW1lbnQsIDApCgogICAgICAgIHJldHVybiAiXG4iLmpvaW4ocnYpCgogICAgcmV0dXJuIGxvY2FscygpCgoKIyBUaGUgYWN0dWFsIG1lYW5zIHRvIGdldCBhIG1vZHVsZSEKZ2V0RG9tTW9kdWxlID0gbW9kdWxlRmFjdG9yeUZhY3RvcnkoZ2V0RG9tQnVpbGRlcikKUEsDBBQAAAAAAAAAIQChfZfw3DEAANwxAAA6AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWVidWlsZGVycy9ldHJlZS5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgdW5pY29kZV9saXRlcmFscwojIHB5bGludDpkaXNhYmxlPXByb3RlY3RlZC1hY2Nlc3MKCmZyb20gcGlwLl92ZW5kb3Iuc2l4IGltcG9ydCB0ZXh0X3R5cGUKCmltcG9ydCByZQoKZnJvbSAuIGltcG9ydCBiYXNlCmZyb20gLi4gaW1wb3J0IF9paGF0ZXhtbApmcm9tIC4uIGltcG9ydCBjb25zdGFudHMKZnJvbSAuLmNvbnN0YW50cyBpbXBvcnQgbmFtZXNwYWNlcwpmcm9tIC4uX3V0aWxzIGltcG9ydCBtb2R1bGVGYWN0b3J5RmFjdG9yeQoKdGFnX3JlZ2V4cCA9IHJlLmNvbXBpbGUoInsoW159XSopfSguKikiKQoKCmRlZiBnZXRFVHJlZUJ1aWxkZXIoRWxlbWVudFRyZWVJbXBsZW1lbnRhdGlvbiwgZnVsbFRyZWU9RmFsc2UpOgogICAgRWxlbWVudFRyZWUgPSBFbGVtZW50VHJlZUltcGxlbWVudGF0aW9uCiAgICBFbGVtZW50VHJlZUNvbW1lbnRUeXBlID0gRWxlbWVudFRyZWUuQ29tbWVudCgiYXNkIikudGFnCgogICAgY2xhc3MgRWxlbWVudChiYXNlLk5vZGUpOgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBuYW1lc3BhY2U9Tm9uZSk6CiAgICAgICAgICAgIHNlbGYuX25hbWUgPSBuYW1lCiAgICAgICAgICAgIHNlbGYuX25hbWVzcGFjZSA9IG5hbWVzcGFjZQogICAgICAgICAgICBzZWxmLl9lbGVtZW50ID0gRWxlbWVudFRyZWUuRWxlbWVudChzZWxmLl9nZXRFVHJlZVRhZyhuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UpKQogICAgICAgICAgICBpZiBuYW1lc3BhY2UgaXMgTm9uZToKICAgICAgICAgICAgICAgIHNlbGYubmFtZVR1cGxlID0gbmFtZXNwYWNlc1siaHRtbCJdLCBzZWxmLl9uYW1lCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLm5hbWVUdXBsZSA9IHNlbGYuX25hbWVzcGFjZSwgc2VsZi5fbmFtZQogICAgICAgICAgICBzZWxmLnBhcmVudCA9IE5vbmUKICAgICAgICAgICAgc2VsZi5fY2hpbGROb2RlcyA9IFtdCiAgICAgICAgICAgIHNlbGYuX2ZsYWdzID0gW10KCiAgICAgICAgZGVmIF9nZXRFVHJlZVRhZyhzZWxmLCBuYW1lLCBuYW1lc3BhY2UpOgogICAgICAgICAgICBpZiBuYW1lc3BhY2UgaXMgTm9uZToKICAgICAgICAgICAgICAgIGV0cmVlX3RhZyA9IG5hbWUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGV0cmVlX3RhZyA9ICJ7JXN9JXMiICUgKG5hbWVzcGFjZSwgbmFtZSkKICAgICAgICAgICAgcmV0dXJuIGV0cmVlX3RhZwoKICAgICAgICBkZWYgX3NldE5hbWUoc2VsZiwgbmFtZSk6CiAgICAgICAgICAgIHNlbGYuX25hbWUgPSBuYW1lCiAgICAgICAgICAgIHNlbGYuX2VsZW1lbnQudGFnID0gc2VsZi5fZ2V0RVRyZWVUYWcoc2VsZi5fbmFtZSwgc2VsZi5fbmFtZXNwYWNlKQoKICAgICAgICBkZWYgX2dldE5hbWUoc2VsZik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9uYW1lCgogICAgICAgIG5hbWUgPSBwcm9wZXJ0eShfZ2V0TmFtZSwgX3NldE5hbWUpCgogICAgICAgIGRlZiBfc2V0TmFtZXNwYWNlKHNlbGYsIG5hbWVzcGFjZSk6CiAgICAgICAgICAgIHNlbGYuX25hbWVzcGFjZSA9IG5hbWVzcGFjZQogICAgICAgICAgICBzZWxmLl9lbGVtZW50LnRhZyA9IHNlbGYuX2dldEVUcmVlVGFnKHNlbGYuX25hbWUsIHNlbGYuX25hbWVzcGFjZSkKCiAgICAgICAgZGVmIF9nZXROYW1lc3BhY2Uoc2VsZik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9uYW1lc3BhY2UKCiAgICAgICAgbmFtZXNwYWNlID0gcHJvcGVydHkoX2dldE5hbWVzcGFjZSwgX3NldE5hbWVzcGFjZSkKCiAgICAgICAgZGVmIF9nZXRBdHRyaWJ1dGVzKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fZWxlbWVudC5hdHRyaWIKCiAgICAgICAgZGVmIF9zZXRBdHRyaWJ1dGVzKHNlbGYsIGF0dHJpYnV0ZXMpOgogICAgICAgICAgICAjIERlbGV0ZSBleGlzdGluZyBhdHRyaWJ1dGVzIGZpcnN0CiAgICAgICAgICAgICMgWFhYIC0gdGhlcmUgbWF5IGJlIGEgYmV0dGVyIHdheSB0byBkbyB0aGlzLi4uCiAgICAgICAgICAgIGZvciBrZXkgaW4gbGlzdChzZWxmLl9lbGVtZW50LmF0dHJpYi5rZXlzKCkpOgogICAgICAgICAgICAgICAgZGVsIHNlbGYuX2VsZW1lbnQuYXR0cmliW2tleV0KICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gYXR0cmlidXRlcy5pdGVtcygpOgogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShrZXksIHR1cGxlKToKICAgICAgICAgICAgICAgICAgICBuYW1lID0gInslc30lcyIgJSAoa2V5WzJdLCBrZXlbMV0pCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG5hbWUgPSBrZXkKICAgICAgICAgICAgICAgIHNlbGYuX2VsZW1lbnQuc2V0KG5hbWUsIHZhbHVlKQoKICAgICAgICBhdHRyaWJ1dGVzID0gcHJvcGVydHkoX2dldEF0dHJpYnV0ZXMsIF9zZXRBdHRyaWJ1dGVzKQoKICAgICAgICBkZWYgX2dldENoaWxkTm9kZXMoc2VsZik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jaGlsZE5vZGVzCgogICAgICAgIGRlZiBfc2V0Q2hpbGROb2RlcyhzZWxmLCB2YWx1ZSk6CiAgICAgICAgICAgIGRlbCBzZWxmLl9lbGVtZW50WzpdCiAgICAgICAgICAgIHNlbGYuX2NoaWxkTm9kZXMgPSBbXQogICAgICAgICAgICBmb3IgZWxlbWVudCBpbiB2YWx1ZToKICAgICAgICAgICAgICAgIHNlbGYuaW5zZXJ0Q2hpbGQoZWxlbWVudCkKCiAgICAgICAgY2hpbGROb2RlcyA9IHByb3BlcnR5KF9nZXRDaGlsZE5vZGVzLCBfc2V0Q2hpbGROb2RlcykKCiAgICAgICAgZGVmIGhhc0NvbnRlbnQoc2VsZik6CiAgICAgICAgICAgICIiIlJldHVybiB0cnVlIGlmIHRoZSBub2RlIGhhcyBjaGlsZHJlbiBvciB0ZXh0IiIiCiAgICAgICAgICAgIHJldHVybiBib29sKHNlbGYuX2VsZW1lbnQudGV4dCBvciBsZW4oc2VsZi5fZWxlbWVudCkpCgogICAgICAgIGRlZiBhcHBlbmRDaGlsZChzZWxmLCBub2RlKToKICAgICAgICAgICAgc2VsZi5fY2hpbGROb2Rlcy5hcHBlbmQobm9kZSkKICAgICAgICAgICAgc2VsZi5fZWxlbWVudC5hcHBlbmQobm9kZS5fZWxlbWVudCkKICAgICAgICAgICAgbm9kZS5wYXJlbnQgPSBzZWxmCgogICAgICAgIGRlZiBpbnNlcnRCZWZvcmUoc2VsZiwgbm9kZSwgcmVmTm9kZSk6CiAgICAgICAgICAgIGluZGV4ID0gbGlzdChzZWxmLl9lbGVtZW50KS5pbmRleChyZWZOb2RlLl9lbGVtZW50KQogICAgICAgICAgICBzZWxmLl9lbGVtZW50Lmluc2VydChpbmRleCwgbm9kZS5fZWxlbWVudCkKICAgICAgICAgICAgbm9kZS5wYXJlbnQgPSBzZWxmCgogICAgICAgIGRlZiByZW1vdmVDaGlsZChzZWxmLCBub2RlKToKICAgICAgICAgICAgc2VsZi5fY2hpbGROb2Rlcy5yZW1vdmUobm9kZSkKICAgICAgICAgICAgc2VsZi5fZWxlbWVudC5yZW1vdmUobm9kZS5fZWxlbWVudCkKICAgICAgICAgICAgbm9kZS5wYXJlbnQgPSBOb25lCgogICAgICAgIGRlZiBpbnNlcnRUZXh0KHNlbGYsIGRhdGEsIGluc2VydEJlZm9yZT1Ob25lKToKICAgICAgICAgICAgaWYgbm90KGxlbihzZWxmLl9lbGVtZW50KSk6CiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5fZWxlbWVudC50ZXh0OgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2VsZW1lbnQudGV4dCA9ICIiCiAgICAgICAgICAgICAgICBzZWxmLl9lbGVtZW50LnRleHQgKz0gZGF0YQogICAgICAgICAgICBlbGlmIGluc2VydEJlZm9yZSBpcyBOb25lOgogICAgICAgICAgICAgICAgIyBJbnNlcnQgdGhlIHRleHQgYXMgdGhlIHRhaWwgb2YgdGhlIGxhc3QgY2hpbGQgZWxlbWVudAogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuX2VsZW1lbnRbLTFdLnRhaWw6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZWxlbWVudFstMV0udGFpbCA9ICIiCiAgICAgICAgICAgICAgICBzZWxmLl9lbGVtZW50Wy0xXS50YWlsICs9IGRhdGEKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgSW5zZXJ0IHRoZSB0ZXh0IGJlZm9yZSB0aGUgc3BlY2lmaWVkIG5vZGUKICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gbGlzdChzZWxmLl9lbGVtZW50KQogICAgICAgICAgICAgICAgaW5kZXggPSBjaGlsZHJlbi5pbmRleChpbnNlcnRCZWZvcmUuX2VsZW1lbnQpCiAgICAgICAgICAgICAgICBpZiBpbmRleCA+IDA6CiAgICAgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuX2VsZW1lbnRbaW5kZXggLSAxXS50YWlsOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9lbGVtZW50W2luZGV4IC0gMV0udGFpbCA9ICIiCiAgICAgICAgICAgICAgICAgICAgc2VsZi5fZWxlbWVudFtpbmRleCAtIDFdLnRhaWwgKz0gZGF0YQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5fZWxlbWVudC50ZXh0OgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9lbGVtZW50LnRleHQgPSAiIgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2VsZW1lbnQudGV4dCArPSBkYXRhCgogICAgICAgIGRlZiBjbG9uZU5vZGUoc2VsZik6CiAgICAgICAgICAgIGVsZW1lbnQgPSB0eXBlKHNlbGYpKHNlbGYubmFtZSwgc2VsZi5uYW1lc3BhY2UpCiAgICAgICAgICAgIGZvciBuYW1lLCB2YWx1ZSBpbiBzZWxmLmF0dHJpYnV0ZXMuaXRlbXMoKToKICAgICAgICAgICAgICAgIGVsZW1lbnQuYXR0cmlidXRlc1tuYW1lXSA9IHZhbHVlCiAgICAgICAgICAgIHJldHVybiBlbGVtZW50CgogICAgICAgIGRlZiByZXBhcmVudENoaWxkcmVuKHNlbGYsIG5ld1BhcmVudCk6CiAgICAgICAgICAgIGlmIG5ld1BhcmVudC5jaGlsZE5vZGVzOgogICAgICAgICAgICAgICAgbmV3UGFyZW50LmNoaWxkTm9kZXNbLTFdLl9lbGVtZW50LnRhaWwgKz0gc2VsZi5fZWxlbWVudC50ZXh0CiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpZiBub3QgbmV3UGFyZW50Ll9lbGVtZW50LnRleHQ6CiAgICAgICAgICAgICAgICAgICAgbmV3UGFyZW50Ll9lbGVtZW50LnRleHQgPSAiIgogICAgICAgICAgICAgICAgaWYgc2VsZi5fZWxlbWVudC50ZXh0IGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgIG5ld1BhcmVudC5fZWxlbWVudC50ZXh0ICs9IHNlbGYuX2VsZW1lbnQudGV4dAogICAgICAgICAgICBzZWxmLl9lbGVtZW50LnRleHQgPSAiIgogICAgICAgICAgICBiYXNlLk5vZGUucmVwYXJlbnRDaGlsZHJlbihzZWxmLCBuZXdQYXJlbnQpCgogICAgY2xhc3MgQ29tbWVudChFbGVtZW50KToKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgZGF0YSk6CiAgICAgICAgICAgICMgVXNlIHRoZSBzdXBlcmNsYXNzIGNvbnN0cnVjdG9yIHRvIHNldCBhbGwgcHJvcGVydGllcyBvbiB0aGUKICAgICAgICAgICAgIyB3cmFwcGVyIGVsZW1lbnQKICAgICAgICAgICAgc2VsZi5fZWxlbWVudCA9IEVsZW1lbnRUcmVlLkNvbW1lbnQoZGF0YSkKICAgICAgICAgICAgc2VsZi5wYXJlbnQgPSBOb25lCiAgICAgICAgICAgIHNlbGYuX2NoaWxkTm9kZXMgPSBbXQogICAgICAgICAgICBzZWxmLl9mbGFncyA9IFtdCgogICAgICAgIGRlZiBfZ2V0RGF0YShzZWxmKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2VsZW1lbnQudGV4dAoKICAgICAgICBkZWYgX3NldERhdGEoc2VsZiwgdmFsdWUpOgogICAgICAgICAgICBzZWxmLl9lbGVtZW50LnRleHQgPSB2YWx1ZQoKICAgICAgICBkYXRhID0gcHJvcGVydHkoX2dldERhdGEsIF9zZXREYXRhKQoKICAgIGNsYXNzIERvY3VtZW50VHlwZShFbGVtZW50KToKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgcHVibGljSWQsIHN5c3RlbUlkKToKICAgICAgICAgICAgRWxlbWVudC5fX2luaXRfXyhzZWxmLCAiPCFET0NUWVBFPiIpCiAgICAgICAgICAgIHNlbGYuX2VsZW1lbnQudGV4dCA9IG5hbWUKICAgICAgICAgICAgc2VsZi5wdWJsaWNJZCA9IHB1YmxpY0lkCiAgICAgICAgICAgIHNlbGYuc3lzdGVtSWQgPSBzeXN0ZW1JZAoKICAgICAgICBkZWYgX2dldFB1YmxpY0lkKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fZWxlbWVudC5nZXQoInB1YmxpY0lkIiwgIiIpCgogICAgICAgIGRlZiBfc2V0UHVibGljSWQoc2VsZiwgdmFsdWUpOgogICAgICAgICAgICBpZiB2YWx1ZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHNlbGYuX2VsZW1lbnQuc2V0KCJwdWJsaWNJZCIsIHZhbHVlKQoKICAgICAgICBwdWJsaWNJZCA9IHByb3BlcnR5KF9nZXRQdWJsaWNJZCwgX3NldFB1YmxpY0lkKQoKICAgICAgICBkZWYgX2dldFN5c3RlbUlkKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fZWxlbWVudC5nZXQoInN5c3RlbUlkIiwgIiIpCgogICAgICAgIGRlZiBfc2V0U3lzdGVtSWQoc2VsZiwgdmFsdWUpOgogICAgICAgICAgICBpZiB2YWx1ZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHNlbGYuX2VsZW1lbnQuc2V0KCJzeXN0ZW1JZCIsIHZhbHVlKQoKICAgICAgICBzeXN0ZW1JZCA9IHByb3BlcnR5KF9nZXRTeXN0ZW1JZCwgX3NldFN5c3RlbUlkKQoKICAgIGNsYXNzIERvY3VtZW50KEVsZW1lbnQpOgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAgICAgRWxlbWVudC5fX2luaXRfXyhzZWxmLCAiRE9DVU1FTlRfUk9PVCIpCgogICAgY2xhc3MgRG9jdW1lbnRGcmFnbWVudChFbGVtZW50KToKICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgICAgIEVsZW1lbnQuX19pbml0X18oc2VsZiwgIkRPQ1VNRU5UX0ZSQUdNRU5UIikKCiAgICBkZWYgdGVzdFNlcmlhbGl6ZXIoZWxlbWVudCk6CiAgICAgICAgcnYgPSBbXQoKICAgICAgICBkZWYgc2VyaWFsaXplRWxlbWVudChlbGVtZW50LCBpbmRlbnQ9MCk6CiAgICAgICAgICAgIGlmIG5vdChoYXNhdHRyKGVsZW1lbnQsICJ0YWciKSk6CiAgICAgICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5nZXRyb290KCkKICAgICAgICAgICAgaWYgZWxlbWVudC50YWcgPT0gIjwhRE9DVFlQRT4iOgogICAgICAgICAgICAgICAgaWYgZWxlbWVudC5nZXQoInB1YmxpY0lkIikgb3IgZWxlbWVudC5nZXQoInN5c3RlbUlkIik6CiAgICAgICAgICAgICAgICAgICAgcHVibGljSWQgPSBlbGVtZW50LmdldCgicHVibGljSWQiKSBvciAiIgogICAgICAgICAgICAgICAgICAgIHN5c3RlbUlkID0gZWxlbWVudC5nZXQoInN5c3RlbUlkIikgb3IgIiIKICAgICAgICAgICAgICAgICAgICBydi5hcHBlbmQoIiIiPCFET0NUWVBFICVzICIlcyIgIiVzIj4iIiIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZWxlbWVudC50ZXh0LCBwdWJsaWNJZCwgc3lzdGVtSWQpKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBydi5hcHBlbmQoIjwhRE9DVFlQRSAlcz4iICUgKGVsZW1lbnQudGV4dCwpKQogICAgICAgICAgICBlbGlmIGVsZW1lbnQudGFnID09ICJET0NVTUVOVF9ST09UIjoKICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgiI2RvY3VtZW50IikKICAgICAgICAgICAgICAgIGlmIGVsZW1lbnQudGV4dCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICBydi5hcHBlbmQoInwlc1wiJXNcIiIgJSAoJyAnICogKGluZGVudCArIDIpLCBlbGVtZW50LnRleHQpKQogICAgICAgICAgICAgICAgaWYgZWxlbWVudC50YWlsIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiRG9jdW1lbnQgbm9kZSBjYW5ub3QgaGF2ZSB0YWlsIikKICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIoZWxlbWVudCwgImF0dHJpYiIpIGFuZCBsZW4oZWxlbWVudC5hdHRyaWIpOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiRG9jdW1lbnQgbm9kZSBjYW5ub3QgaGF2ZSBhdHRyaWJ1dGVzIikKICAgICAgICAgICAgZWxpZiBlbGVtZW50LnRhZyA9PSBFbGVtZW50VHJlZUNvbW1lbnRUeXBlOgogICAgICAgICAgICAgICAgcnYuYXBwZW5kKCJ8JXM8IS0tICVzIC0tPiIgJSAoJyAnICogaW5kZW50LCBlbGVtZW50LnRleHQpKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoZWxlbWVudC50YWcsIHRleHRfdHlwZSksIFwKICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgdW5pY29kZSwgZ290ICVzLCAlcyIgJSAodHlwZShlbGVtZW50LnRhZyksIGVsZW1lbnQudGFnKQogICAgICAgICAgICAgICAgbnNtYXRjaCA9IHRhZ19yZWdleHAubWF0Y2goZWxlbWVudC50YWcpCgogICAgICAgICAgICAgICAgaWYgbnNtYXRjaCBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgIG5hbWUgPSBlbGVtZW50LnRhZwogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBucywgbmFtZSA9IG5zbWF0Y2guZ3JvdXBzKCkKICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBjb25zdGFudHMucHJlZml4ZXNbbnNdCiAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICIlcyAlcyIgJSAocHJlZml4LCBuYW1lKQogICAgICAgICAgICAgICAgcnYuYXBwZW5kKCJ8JXM8JXM+IiAlICgnICcgKiBpbmRlbnQsIG5hbWUpKQoKICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIoZWxlbWVudCwgImF0dHJpYiIpOgogICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSBbXQogICAgICAgICAgICAgICAgICAgIGZvciBuYW1lLCB2YWx1ZSBpbiBlbGVtZW50LmF0dHJpYi5pdGVtcygpOgogICAgICAgICAgICAgICAgICAgICAgICBuc21hdGNoID0gdGFnX3JlZ2V4cC5tYXRjaChuYW1lKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBuc21hdGNoIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbnMsIG5hbWUgPSBuc21hdGNoLmdyb3VwcygpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBjb25zdGFudHMucHJlZml4ZXNbbnNdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyX3N0cmluZyA9ICIlcyAlcyIgJSAocHJlZml4LCBuYW1lKQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cl9zdHJpbmcgPSBuYW1lCiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMuYXBwZW5kKChhdHRyX3N0cmluZywgdmFsdWUpKQoKICAgICAgICAgICAgICAgICAgICBmb3IgbmFtZSwgdmFsdWUgaW4gc29ydGVkKGF0dHJpYnV0ZXMpOgogICAgICAgICAgICAgICAgICAgICAgICBydi5hcHBlbmQoJ3wlcyVzPSIlcyInICUgKCcgJyAqIChpbmRlbnQgKyAyKSwgbmFtZSwgdmFsdWUpKQogICAgICAgICAgICAgICAgaWYgZWxlbWVudC50ZXh0OgogICAgICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgifCVzXCIlc1wiIiAlICgnICcgKiAoaW5kZW50ICsgMiksIGVsZW1lbnQudGV4dCkpCiAgICAgICAgICAgIGluZGVudCArPSAyCiAgICAgICAgICAgIGZvciBjaGlsZCBpbiBlbGVtZW50OgogICAgICAgICAgICAgICAgc2VyaWFsaXplRWxlbWVudChjaGlsZCwgaW5kZW50KQogICAgICAgICAgICBpZiBlbGVtZW50LnRhaWw6CiAgICAgICAgICAgICAgICBydi5hcHBlbmQoInwlc1wiJXNcIiIgJSAoJyAnICogKGluZGVudCAtIDIpLCBlbGVtZW50LnRhaWwpKQogICAgICAgIHNlcmlhbGl6ZUVsZW1lbnQoZWxlbWVudCwgMCkKCiAgICAgICAgcmV0dXJuICJcbiIuam9pbihydikKCiAgICBkZWYgdG9zdHJpbmcoZWxlbWVudCk6ICAjIHB5bGludDpkaXNhYmxlPXVudXNlZC12YXJpYWJsZQogICAgICAgICIiIlNlcmlhbGl6ZSBhbiBlbGVtZW50IGFuZCBpdHMgY2hpbGQgbm9kZXMgdG8gYSBzdHJpbmciIiIKICAgICAgICBydiA9IFtdCiAgICAgICAgZmlsdGVyID0gX2loYXRleG1sLkluZm9zZXRGaWx0ZXIoKQoKICAgICAgICBkZWYgc2VyaWFsaXplRWxlbWVudChlbGVtZW50KToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShlbGVtZW50LCBFbGVtZW50VHJlZS5FbGVtZW50VHJlZSk6CiAgICAgICAgICAgICAgICBlbGVtZW50ID0gZWxlbWVudC5nZXRyb290KCkKCiAgICAgICAgICAgIGlmIGVsZW1lbnQudGFnID09ICI8IURPQ1RZUEU+IjoKICAgICAgICAgICAgICAgIGlmIGVsZW1lbnQuZ2V0KCJwdWJsaWNJZCIpIG9yIGVsZW1lbnQuZ2V0KCJzeXN0ZW1JZCIpOgogICAgICAgICAgICAgICAgICAgIHB1YmxpY0lkID0gZWxlbWVudC5nZXQoInB1YmxpY0lkIikgb3IgIiIKICAgICAgICAgICAgICAgICAgICBzeXN0ZW1JZCA9IGVsZW1lbnQuZ2V0KCJzeXN0ZW1JZCIpIG9yICIiCiAgICAgICAgICAgICAgICAgICAgcnYuYXBwZW5kKCIiIjwhRE9DVFlQRSAlcyBQVUJMSUMgIiVzIiAiJXMiPiIiIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbGVtZW50LnRleHQsIHB1YmxpY0lkLCBzeXN0ZW1JZCkpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgiPCFET0NUWVBFICVzPiIgJSAoZWxlbWVudC50ZXh0LCkpCiAgICAgICAgICAgIGVsaWYgZWxlbWVudC50YWcgPT0gIkRPQ1VNRU5UX1JPT1QiOgogICAgICAgICAgICAgICAgaWYgZWxlbWVudC50ZXh0IGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgIHJ2LmFwcGVuZChlbGVtZW50LnRleHQpCiAgICAgICAgICAgICAgICBpZiBlbGVtZW50LnRhaWwgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJEb2N1bWVudCBub2RlIGNhbm5vdCBoYXZlIHRhaWwiKQogICAgICAgICAgICAgICAgaWYgaGFzYXR0cihlbGVtZW50LCAiYXR0cmliIikgYW5kIGxlbihlbGVtZW50LmF0dHJpYik6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJEb2N1bWVudCBub2RlIGNhbm5vdCBoYXZlIGF0dHJpYnV0ZXMiKQoKICAgICAgICAgICAgICAgIGZvciBjaGlsZCBpbiBlbGVtZW50OgogICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZUVsZW1lbnQoY2hpbGQpCgogICAgICAgICAgICBlbGlmIGVsZW1lbnQudGFnID09IEVsZW1lbnRUcmVlQ29tbWVudFR5cGU6CiAgICAgICAgICAgICAgICBydi5hcHBlbmQoIjwhLS0lcy0tPiIgJSAoZWxlbWVudC50ZXh0LCkpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIFRoaXMgaXMgYXNzdW1lZCB0byBiZSBhbiBvcmRpbmFyeSBlbGVtZW50CiAgICAgICAgICAgICAgICBpZiBub3QgZWxlbWVudC5hdHRyaWI6CiAgICAgICAgICAgICAgICAgICAgcnYuYXBwZW5kKCI8JXM+IiAlIChmaWx0ZXIuZnJvbVhtbE5hbWUoZWxlbWVudC50YWcpLCkpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGF0dHIgPSAiICIuam9pbihbIiVzPVwiJXNcIiIgJSAoCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlci5mcm9tWG1sTmFtZShuYW1lKSwgdmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBuYW1lLCB2YWx1ZSBpbiBlbGVtZW50LmF0dHJpYi5pdGVtcygpXSkKICAgICAgICAgICAgICAgICAgICBydi5hcHBlbmQoIjwlcyAlcz4iICUgKGVsZW1lbnQudGFnLCBhdHRyKSkKICAgICAgICAgICAgICAgIGlmIGVsZW1lbnQudGV4dDoKICAgICAgICAgICAgICAgICAgICBydi5hcHBlbmQoZWxlbWVudC50ZXh0KQoKICAgICAgICAgICAgICAgIGZvciBjaGlsZCBpbiBlbGVtZW50OgogICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZUVsZW1lbnQoY2hpbGQpCgogICAgICAgICAgICAgICAgcnYuYXBwZW5kKCI8LyVzPiIgJSAoZWxlbWVudC50YWcsKSkKCiAgICAgICAgICAgIGlmIGVsZW1lbnQudGFpbDoKICAgICAgICAgICAgICAgIHJ2LmFwcGVuZChlbGVtZW50LnRhaWwpCgogICAgICAgIHNlcmlhbGl6ZUVsZW1lbnQoZWxlbWVudCkKCiAgICAgICAgcmV0dXJuICIiLmpvaW4ocnYpCgogICAgY2xhc3MgVHJlZUJ1aWxkZXIoYmFzZS5UcmVlQnVpbGRlcik6ICAjIHB5bGludDpkaXNhYmxlPXVudXNlZC12YXJpYWJsZQogICAgICAgIGRvY3VtZW50Q2xhc3MgPSBEb2N1bWVudAogICAgICAgIGRvY3R5cGVDbGFzcyA9IERvY3VtZW50VHlwZQogICAgICAgIGVsZW1lbnRDbGFzcyA9IEVsZW1lbnQKICAgICAgICBjb21tZW50Q2xhc3MgPSBDb21tZW50CiAgICAgICAgZnJhZ21lbnRDbGFzcyA9IERvY3VtZW50RnJhZ21lbnQKICAgICAgICBpbXBsZW1lbnRhdGlvbiA9IEVsZW1lbnRUcmVlSW1wbGVtZW50YXRpb24KCiAgICAgICAgZGVmIHRlc3RTZXJpYWxpemVyKHNlbGYsIGVsZW1lbnQpOgogICAgICAgICAgICByZXR1cm4gdGVzdFNlcmlhbGl6ZXIoZWxlbWVudCkKCiAgICAgICAgZGVmIGdldERvY3VtZW50KHNlbGYpOgogICAgICAgICAgICBpZiBmdWxsVHJlZToKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmRvY3VtZW50Ll9lbGVtZW50CiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBpZiBzZWxmLmRlZmF1bHROYW1lc3BhY2UgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZG9jdW1lbnQuX2VsZW1lbnQuZmluZCgKICAgICAgICAgICAgICAgICAgICAgICAgInslc31odG1sIiAlIHNlbGYuZGVmYXVsdE5hbWVzcGFjZSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZG9jdW1lbnQuX2VsZW1lbnQuZmluZCgiaHRtbCIpCgogICAgICAgIGRlZiBnZXRGcmFnbWVudChzZWxmKToKICAgICAgICAgICAgcmV0dXJuIGJhc2UuVHJlZUJ1aWxkZXIuZ2V0RnJhZ21lbnQoc2VsZikuX2VsZW1lbnQKCiAgICByZXR1cm4gbG9jYWxzKCkKCgpnZXRFVHJlZU1vZHVsZSA9IG1vZHVsZUZhY3RvcnlGYWN0b3J5KGdldEVUcmVlQnVpbGRlcikKUEsDBBQAAAAAAAAAIQDa/krQUTcAAFE3AAA/AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWVidWlsZGVycy9ldHJlZV9seG1sLnB5IiIiTW9kdWxlIGZvciBzdXBwb3J0aW5nIHRoZSBseG1sLmV0cmVlIGxpYnJhcnkuIFRoZSBpZGVhIGhlcmUgaXMgdG8gdXNlIGFzIG11Y2gKb2YgdGhlIG5hdGl2ZSBsaWJyYXJ5IGFzIHBvc3NpYmxlLCB3aXRob3V0IHVzaW5nIGZyYWdpbGUgaGFja3MgbGlrZSBjdXN0b20gZWxlbWVudApuYW1lcyB0aGF0IGJyZWFrIGJldHdlZW4gcmVsZWFzZXMuIFRoZSBkb3duc2lkZSBvZiB0aGlzIGlzIHRoYXQgd2UgY2Fubm90IHJlcHJlc2VudAphbGwgcG9zc2libGUgdHJlZXM7IHNwZWNpZmljYWxseSB0aGUgZm9sbG93aW5nIGFyZSBrbm93biB0byBjYXVzZSBwcm9ibGVtczoKClRleHQgb3IgY29tbWVudHMgYXMgc2libGluZ3Mgb2YgdGhlIHJvb3QgZWxlbWVudApEb2N5cGVzIHdpdGggbm8gbmFtZQoKV2hlbiBhbnkgb2YgdGhlc2UgdGhpbmdzIG9jY3VyLCB3ZSBlbWl0IGEgRGF0YUxvc3NXYXJuaW5nCiIiIgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCiMgcHlsaW50OmRpc2FibGU9cHJvdGVjdGVkLWFjY2VzcwoKaW1wb3J0IHdhcm5pbmdzCmltcG9ydCByZQppbXBvcnQgc3lzCgpmcm9tIC4gaW1wb3J0IGJhc2UKZnJvbSAuLmNvbnN0YW50cyBpbXBvcnQgRGF0YUxvc3NXYXJuaW5nCmZyb20gLi4gaW1wb3J0IGNvbnN0YW50cwpmcm9tIC4gaW1wb3J0IGV0cmVlIGFzIGV0cmVlX2J1aWxkZXJzCmZyb20gLi4gaW1wb3J0IF9paGF0ZXhtbAoKaW1wb3J0IGx4bWwuZXRyZWUgYXMgZXRyZWUKCgpmdWxsVHJlZSA9IFRydWUKdGFnX3JlZ2V4cCA9IHJlLmNvbXBpbGUoInsoW159XSopfSguKikiKQoKY29tbWVudF90eXBlID0gZXRyZWUuQ29tbWVudCgiYXNkIikudGFnCgoKY2xhc3MgRG9jdW1lbnRUeXBlKG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgcHVibGljSWQsIHN5c3RlbUlkKToKICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCiAgICAgICAgc2VsZi5wdWJsaWNJZCA9IHB1YmxpY0lkCiAgICAgICAgc2VsZi5zeXN0ZW1JZCA9IHN5c3RlbUlkCgoKY2xhc3MgRG9jdW1lbnQob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLl9lbGVtZW50VHJlZSA9IE5vbmUKICAgICAgICBzZWxmLl9jaGlsZE5vZGVzID0gW10KCiAgICBkZWYgYXBwZW5kQ2hpbGQoc2VsZiwgZWxlbWVudCk6CiAgICAgICAgc2VsZi5fZWxlbWVudFRyZWUuZ2V0cm9vdCgpLmFkZG5leHQoZWxlbWVudC5fZWxlbWVudCkKCiAgICBkZWYgX2dldENoaWxkTm9kZXMoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2NoaWxkTm9kZXMKCiAgICBjaGlsZE5vZGVzID0gcHJvcGVydHkoX2dldENoaWxkTm9kZXMpCgoKZGVmIHRlc3RTZXJpYWxpemVyKGVsZW1lbnQpOgogICAgcnYgPSBbXQogICAgaW5mb3NldEZpbHRlciA9IF9paGF0ZXhtbC5JbmZvc2V0RmlsdGVyKHByZXZlbnREb3VibGVEYXNoQ29tbWVudHM9VHJ1ZSkKCiAgICBkZWYgc2VyaWFsaXplRWxlbWVudChlbGVtZW50LCBpbmRlbnQ9MCk6CiAgICAgICAgaWYgbm90IGhhc2F0dHIoZWxlbWVudCwgInRhZyIpOgogICAgICAgICAgICBpZiBoYXNhdHRyKGVsZW1lbnQsICJnZXRyb290Iik6CiAgICAgICAgICAgICAgICAjIEZ1bGwgdHJlZSBjYXNlCiAgICAgICAgICAgICAgICBydi5hcHBlbmQoIiNkb2N1bWVudCIpCiAgICAgICAgICAgICAgICBpZiBlbGVtZW50LmRvY2luZm8uaW50ZXJuYWxEVEQ6CiAgICAgICAgICAgICAgICAgICAgaWYgbm90IChlbGVtZW50LmRvY2luZm8ucHVibGljX2lkIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmRvY2luZm8uc3lzdGVtX3VybCk6CiAgICAgICAgICAgICAgICAgICAgICAgIGR0ZF9zdHIgPSAiPCFET0NUWVBFICVzPiIgJSBlbGVtZW50LmRvY2luZm8ucm9vdF9uYW1lCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgZHRkX3N0ciA9ICIiIjwhRE9DVFlQRSAlcyAiJXMiICIlcyI+IiIiICUgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5kb2NpbmZvLnJvb3RfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuZG9jaW5mby5wdWJsaWNfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmRvY2luZm8uc3lzdGVtX3VybCkKICAgICAgICAgICAgICAgICAgICBydi5hcHBlbmQoInwlcyVzIiAlICgnICcgKiAoaW5kZW50ICsgMiksIGR0ZF9zdHIpKQogICAgICAgICAgICAgICAgbmV4dF9lbGVtZW50ID0gZWxlbWVudC5nZXRyb290KCkKICAgICAgICAgICAgICAgIHdoaWxlIG5leHRfZWxlbWVudC5nZXRwcmV2aW91cygpIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgIG5leHRfZWxlbWVudCA9IG5leHRfZWxlbWVudC5nZXRwcmV2aW91cygpCiAgICAgICAgICAgICAgICB3aGlsZSBuZXh0X2VsZW1lbnQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplRWxlbWVudChuZXh0X2VsZW1lbnQsIGluZGVudCArIDIpCiAgICAgICAgICAgICAgICAgICAgbmV4dF9lbGVtZW50ID0gbmV4dF9lbGVtZW50LmdldG5leHQoKQogICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZWxlbWVudCwgc3RyKSBvciBpc2luc3RhbmNlKGVsZW1lbnQsIGJ5dGVzKToKICAgICAgICAgICAgICAgICMgVGV4dCBpbiBhIGZyYWdtZW50CiAgICAgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShlbGVtZW50LCBzdHIpIG9yIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMgogICAgICAgICAgICAgICAgcnYuYXBwZW5kKCJ8JXNcIiVzXCIiICUgKCcgJyAqIGluZGVudCwgZWxlbWVudCkpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIEZyYWdtZW50IGNhc2UKICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgiI2RvY3VtZW50LWZyYWdtZW50IikKICAgICAgICAgICAgICAgIGZvciBuZXh0X2VsZW1lbnQgaW4gZWxlbWVudDoKICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVFbGVtZW50KG5leHRfZWxlbWVudCwgaW5kZW50ICsgMikKICAgICAgICBlbGlmIGVsZW1lbnQudGFnID09IGNvbW1lbnRfdHlwZToKICAgICAgICAgICAgcnYuYXBwZW5kKCJ8JXM8IS0tICVzIC0tPiIgJSAoJyAnICogaW5kZW50LCBlbGVtZW50LnRleHQpKQogICAgICAgICAgICBpZiBoYXNhdHRyKGVsZW1lbnQsICJ0YWlsIikgYW5kIGVsZW1lbnQudGFpbDoKICAgICAgICAgICAgICAgIHJ2LmFwcGVuZCgifCVzXCIlc1wiIiAlICgnICcgKiBpbmRlbnQsIGVsZW1lbnQudGFpbCkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoZWxlbWVudCwgZXRyZWUuX0VsZW1lbnQpCiAgICAgICAgICAgIG5zbWF0Y2ggPSBldHJlZV9idWlsZGVycy50YWdfcmVnZXhwLm1hdGNoKGVsZW1lbnQudGFnKQogICAgICAgICAgICBpZiBuc21hdGNoIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgbnMgPSBuc21hdGNoLmdyb3VwKDEpCiAgICAgICAgICAgICAgICB0YWcgPSBuc21hdGNoLmdyb3VwKDIpCiAgICAgICAgICAgICAgICBwcmVmaXggPSBjb25zdGFudHMucHJlZml4ZXNbbnNdCiAgICAgICAgICAgICAgICBydi5hcHBlbmQoInwlczwlcyAlcz4iICUgKCcgJyAqIGluZGVudCwgcHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvc2V0RmlsdGVyLmZyb21YbWxOYW1lKHRhZykpKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcnYuYXBwZW5kKCJ8JXM8JXM+IiAlICgnICcgKiBpbmRlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9zZXRGaWx0ZXIuZnJvbVhtbE5hbWUoZWxlbWVudC50YWcpKSkKCiAgICAgICAgICAgIGlmIGhhc2F0dHIoZWxlbWVudCwgImF0dHJpYiIpOgogICAgICAgICAgICAgICAgYXR0cmlidXRlcyA9IFtdCiAgICAgICAgICAgICAgICBmb3IgbmFtZSwgdmFsdWUgaW4gZWxlbWVudC5hdHRyaWIuaXRlbXMoKToKICAgICAgICAgICAgICAgICAgICBuc21hdGNoID0gdGFnX3JlZ2V4cC5tYXRjaChuYW1lKQogICAgICAgICAgICAgICAgICAgIGlmIG5zbWF0Y2ggaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgIG5zLCBuYW1lID0gbnNtYXRjaC5ncm91cHMoKQogICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gaW5mb3NldEZpbHRlci5mcm9tWG1sTmFtZShuYW1lKQogICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBjb25zdGFudHMucHJlZml4ZXNbbnNdCiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJfc3RyaW5nID0gIiVzICVzIiAlIChwcmVmaXgsIG5hbWUpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgYXR0cl9zdHJpbmcgPSBpbmZvc2V0RmlsdGVyLmZyb21YbWxOYW1lKG5hbWUpCiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcy5hcHBlbmQoKGF0dHJfc3RyaW5nLCB2YWx1ZSkpCgogICAgICAgICAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIHNvcnRlZChhdHRyaWJ1dGVzKToKICAgICAgICAgICAgICAgICAgICBydi5hcHBlbmQoJ3wlcyVzPSIlcyInICUgKCcgJyAqIChpbmRlbnQgKyAyKSwgbmFtZSwgdmFsdWUpKQoKICAgICAgICAgICAgaWYgZWxlbWVudC50ZXh0OgogICAgICAgICAgICAgICAgcnYuYXBwZW5kKCJ8JXNcIiVzXCIiICUgKCcgJyAqIChpbmRlbnQgKyAyKSwgZWxlbWVudC50ZXh0KSkKICAgICAgICAgICAgaW5kZW50ICs9IDIKICAgICAgICAgICAgZm9yIGNoaWxkIGluIGVsZW1lbnQ6CiAgICAgICAgICAgICAgICBzZXJpYWxpemVFbGVtZW50KGNoaWxkLCBpbmRlbnQpCiAgICAgICAgICAgIGlmIGhhc2F0dHIoZWxlbWVudCwgInRhaWwiKSBhbmQgZWxlbWVudC50YWlsOgogICAgICAgICAgICAgICAgcnYuYXBwZW5kKCJ8JXNcIiVzXCIiICUgKCcgJyAqIChpbmRlbnQgLSAyKSwgZWxlbWVudC50YWlsKSkKICAgIHNlcmlhbGl6ZUVsZW1lbnQoZWxlbWVudCwgMCkKCiAgICByZXR1cm4gIlxuIi5qb2luKHJ2KQoKCmRlZiB0b3N0cmluZyhlbGVtZW50KToKICAgICIiIlNlcmlhbGl6ZSBhbiBlbGVtZW50IGFuZCBpdHMgY2hpbGQgbm9kZXMgdG8gYSBzdHJpbmciIiIKICAgIHJ2ID0gW10KCiAgICBkZWYgc2VyaWFsaXplRWxlbWVudChlbGVtZW50KToKICAgICAgICBpZiBub3QgaGFzYXR0cihlbGVtZW50LCAidGFnIik6CiAgICAgICAgICAgIGlmIGVsZW1lbnQuZG9jaW5mby5pbnRlcm5hbERURDoKICAgICAgICAgICAgICAgIGlmIGVsZW1lbnQuZG9jaW5mby5kb2N0eXBlOgogICAgICAgICAgICAgICAgICAgIGR0ZF9zdHIgPSBlbGVtZW50LmRvY2luZm8uZG9jdHlwZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBkdGRfc3RyID0gIjwhRE9DVFlQRSAlcz4iICUgZWxlbWVudC5kb2NpbmZvLnJvb3RfbmFtZQogICAgICAgICAgICAgICAgcnYuYXBwZW5kKGR0ZF9zdHIpCiAgICAgICAgICAgIHNlcmlhbGl6ZUVsZW1lbnQoZWxlbWVudC5nZXRyb290KCkpCgogICAgICAgIGVsaWYgZWxlbWVudC50YWcgPT0gY29tbWVudF90eXBlOgogICAgICAgICAgICBydi5hcHBlbmQoIjwhLS0lcy0tPiIgJSAoZWxlbWVudC50ZXh0LCkpCgogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgVGhpcyBpcyBhc3N1bWVkIHRvIGJlIGFuIG9yZGluYXJ5IGVsZW1lbnQKICAgICAgICAgICAgaWYgbm90IGVsZW1lbnQuYXR0cmliOgogICAgICAgICAgICAgICAgcnYuYXBwZW5kKCI8JXM+IiAlIChlbGVtZW50LnRhZywpKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYXR0ciA9ICIgIi5qb2luKFsiJXM9XCIlc1wiIiAlIChuYW1lLCB2YWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIGVsZW1lbnQuYXR0cmliLml0ZW1zKCldKQogICAgICAgICAgICAgICAgcnYuYXBwZW5kKCI8JXMgJXM+IiAlIChlbGVtZW50LnRhZywgYXR0cikpCiAgICAgICAgICAgIGlmIGVsZW1lbnQudGV4dDoKICAgICAgICAgICAgICAgIHJ2LmFwcGVuZChlbGVtZW50LnRleHQpCgogICAgICAgICAgICBmb3IgY2hpbGQgaW4gZWxlbWVudDoKICAgICAgICAgICAgICAgIHNlcmlhbGl6ZUVsZW1lbnQoY2hpbGQpCgogICAgICAgICAgICBydi5hcHBlbmQoIjwvJXM+IiAlIChlbGVtZW50LnRhZywpKQoKICAgICAgICBpZiBoYXNhdHRyKGVsZW1lbnQsICJ0YWlsIikgYW5kIGVsZW1lbnQudGFpbDoKICAgICAgICAgICAgcnYuYXBwZW5kKGVsZW1lbnQudGFpbCkKCiAgICBzZXJpYWxpemVFbGVtZW50KGVsZW1lbnQpCgogICAgcmV0dXJuICIiLmpvaW4ocnYpCgoKY2xhc3MgVHJlZUJ1aWxkZXIoYmFzZS5UcmVlQnVpbGRlcik6CiAgICBkb2N1bWVudENsYXNzID0gRG9jdW1lbnQKICAgIGRvY3R5cGVDbGFzcyA9IERvY3VtZW50VHlwZQogICAgZWxlbWVudENsYXNzID0gTm9uZQogICAgY29tbWVudENsYXNzID0gTm9uZQogICAgZnJhZ21lbnRDbGFzcyA9IERvY3VtZW50CiAgICBpbXBsZW1lbnRhdGlvbiA9IGV0cmVlCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWVzcGFjZUhUTUxFbGVtZW50cywgZnVsbFRyZWU9RmFsc2UpOgogICAgICAgIGJ1aWxkZXIgPSBldHJlZV9idWlsZGVycy5nZXRFVHJlZU1vZHVsZShldHJlZSwgZnVsbFRyZWU9ZnVsbFRyZWUpCiAgICAgICAgaW5mb3NldEZpbHRlciA9IHNlbGYuaW5mb3NldEZpbHRlciA9IF9paGF0ZXhtbC5JbmZvc2V0RmlsdGVyKHByZXZlbnREb3VibGVEYXNoQ29tbWVudHM9VHJ1ZSkKICAgICAgICBzZWxmLm5hbWVzcGFjZUhUTUxFbGVtZW50cyA9IG5hbWVzcGFjZUhUTUxFbGVtZW50cwoKICAgICAgICBjbGFzcyBBdHRyaWJ1dGVzKGRpY3QpOgogICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgZWxlbWVudCwgdmFsdWU9Tm9uZSk6CiAgICAgICAgICAgICAgICBpZiB2YWx1ZSBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgIHZhbHVlID0ge30KICAgICAgICAgICAgICAgIHNlbGYuX2VsZW1lbnQgPSBlbGVtZW50CiAgICAgICAgICAgICAgICBkaWN0Ll9faW5pdF9fKHNlbGYsIHZhbHVlKSAgIyBweWxpbnQ6ZGlzYWJsZT1ub24tcGFyZW50LWluaXQtY2FsbGVkCiAgICAgICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzZWxmLml0ZW1zKCk6CiAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShrZXksIHR1cGxlKToKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJ7JXN9JXMiICUgKGtleVsyXSwgaW5mb3NldEZpbHRlci5jb2VyY2VBdHRyaWJ1dGUoa2V5WzFdKSkKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gaW5mb3NldEZpbHRlci5jb2VyY2VBdHRyaWJ1dGUoa2V5KQogICAgICAgICAgICAgICAgICAgIHNlbGYuX2VsZW1lbnQuX2VsZW1lbnQuYXR0cmliW25hbWVdID0gdmFsdWUKCiAgICAgICAgICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKToKICAgICAgICAgICAgICAgIGRpY3QuX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSkKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoa2V5LCB0dXBsZSk6CiAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJ7JXN9JXMiICUgKGtleVsyXSwgaW5mb3NldEZpbHRlci5jb2VyY2VBdHRyaWJ1dGUoa2V5WzFdKSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGluZm9zZXRGaWx0ZXIuY29lcmNlQXR0cmlidXRlKGtleSkKICAgICAgICAgICAgICAgIHNlbGYuX2VsZW1lbnQuX2VsZW1lbnQuYXR0cmliW25hbWVdID0gdmFsdWUKCiAgICAgICAgY2xhc3MgRWxlbWVudChidWlsZGVyLkVsZW1lbnQpOgogICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgbmFtZXNwYWNlKToKICAgICAgICAgICAgICAgIG5hbWUgPSBpbmZvc2V0RmlsdGVyLmNvZXJjZUVsZW1lbnQobmFtZSkKICAgICAgICAgICAgICAgIGJ1aWxkZXIuRWxlbWVudC5fX2luaXRfXyhzZWxmLCBuYW1lLCBuYW1lc3BhY2U9bmFtZXNwYWNlKQogICAgICAgICAgICAgICAgc2VsZi5fYXR0cmlidXRlcyA9IEF0dHJpYnV0ZXMoc2VsZikKCiAgICAgICAgICAgIGRlZiBfc2V0TmFtZShzZWxmLCBuYW1lKToKICAgICAgICAgICAgICAgIHNlbGYuX25hbWUgPSBpbmZvc2V0RmlsdGVyLmNvZXJjZUVsZW1lbnQobmFtZSkKICAgICAgICAgICAgICAgIHNlbGYuX2VsZW1lbnQudGFnID0gc2VsZi5fZ2V0RVRyZWVUYWcoCiAgICAgICAgICAgICAgICAgICAgc2VsZi5fbmFtZSwgc2VsZi5fbmFtZXNwYWNlKQoKICAgICAgICAgICAgZGVmIF9nZXROYW1lKHNlbGYpOgogICAgICAgICAgICAgICAgcmV0dXJuIGluZm9zZXRGaWx0ZXIuZnJvbVhtbE5hbWUoc2VsZi5fbmFtZSkKCiAgICAgICAgICAgIG5hbWUgPSBwcm9wZXJ0eShfZ2V0TmFtZSwgX3NldE5hbWUpCgogICAgICAgICAgICBkZWYgX2dldEF0dHJpYnV0ZXMoc2VsZik6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fYXR0cmlidXRlcwoKICAgICAgICAgICAgZGVmIF9zZXRBdHRyaWJ1dGVzKHNlbGYsIGF0dHJpYnV0ZXMpOgogICAgICAgICAgICAgICAgc2VsZi5fYXR0cmlidXRlcyA9IEF0dHJpYnV0ZXMoc2VsZiwgYXR0cmlidXRlcykKCiAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSBwcm9wZXJ0eShfZ2V0QXR0cmlidXRlcywgX3NldEF0dHJpYnV0ZXMpCgogICAgICAgICAgICBkZWYgaW5zZXJ0VGV4dChzZWxmLCBkYXRhLCBpbnNlcnRCZWZvcmU9Tm9uZSk6CiAgICAgICAgICAgICAgICBkYXRhID0gaW5mb3NldEZpbHRlci5jb2VyY2VDaGFyYWN0ZXJzKGRhdGEpCiAgICAgICAgICAgICAgICBidWlsZGVyLkVsZW1lbnQuaW5zZXJ0VGV4dChzZWxmLCBkYXRhLCBpbnNlcnRCZWZvcmUpCgogICAgICAgICAgICBkZWYgYXBwZW5kQ2hpbGQoc2VsZiwgY2hpbGQpOgogICAgICAgICAgICAgICAgYnVpbGRlci5FbGVtZW50LmFwcGVuZENoaWxkKHNlbGYsIGNoaWxkKQoKICAgICAgICBjbGFzcyBDb21tZW50KGJ1aWxkZXIuQ29tbWVudCk6CiAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYXRhKToKICAgICAgICAgICAgICAgIGRhdGEgPSBpbmZvc2V0RmlsdGVyLmNvZXJjZUNvbW1lbnQoZGF0YSkKICAgICAgICAgICAgICAgIGJ1aWxkZXIuQ29tbWVudC5fX2luaXRfXyhzZWxmLCBkYXRhKQoKICAgICAgICAgICAgZGVmIF9zZXREYXRhKHNlbGYsIGRhdGEpOgogICAgICAgICAgICAgICAgZGF0YSA9IGluZm9zZXRGaWx0ZXIuY29lcmNlQ29tbWVudChkYXRhKQogICAgICAgICAgICAgICAgc2VsZi5fZWxlbWVudC50ZXh0ID0gZGF0YQoKICAgICAgICAgICAgZGVmIF9nZXREYXRhKHNlbGYpOgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2VsZW1lbnQudGV4dAoKICAgICAgICAgICAgZGF0YSA9IHByb3BlcnR5KF9nZXREYXRhLCBfc2V0RGF0YSkKCiAgICAgICAgc2VsZi5lbGVtZW50Q2xhc3MgPSBFbGVtZW50CiAgICAgICAgc2VsZi5jb21tZW50Q2xhc3MgPSBDb21tZW50CiAgICAgICAgIyBzZWxmLmZyYWdtZW50Q2xhc3MgPSBidWlsZGVyLkRvY3VtZW50RnJhZ21lbnQKICAgICAgICBiYXNlLlRyZWVCdWlsZGVyLl9faW5pdF9fKHNlbGYsIG5hbWVzcGFjZUhUTUxFbGVtZW50cykKCiAgICBkZWYgcmVzZXQoc2VsZik6CiAgICAgICAgYmFzZS5UcmVlQnVpbGRlci5yZXNldChzZWxmKQogICAgICAgIHNlbGYuaW5zZXJ0Q29tbWVudCA9IHNlbGYuaW5zZXJ0Q29tbWVudEluaXRpYWwKICAgICAgICBzZWxmLmluaXRpYWxfY29tbWVudHMgPSBbXQogICAgICAgIHNlbGYuZG9jdHlwZSA9IE5vbmUKCiAgICBkZWYgdGVzdFNlcmlhbGl6ZXIoc2VsZiwgZWxlbWVudCk6CiAgICAgICAgcmV0dXJuIHRlc3RTZXJpYWxpemVyKGVsZW1lbnQpCgogICAgZGVmIGdldERvY3VtZW50KHNlbGYpOgogICAgICAgIGlmIGZ1bGxUcmVlOgogICAgICAgICAgICByZXR1cm4gc2VsZi5kb2N1bWVudC5fZWxlbWVudFRyZWUKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc2VsZi5kb2N1bWVudC5fZWxlbWVudFRyZWUuZ2V0cm9vdCgpCgogICAgZGVmIGdldEZyYWdtZW50KHNlbGYpOgogICAgICAgIGZyYWdtZW50ID0gW10KICAgICAgICBlbGVtZW50ID0gc2VsZi5vcGVuRWxlbWVudHNbMF0uX2VsZW1lbnQKICAgICAgICBpZiBlbGVtZW50LnRleHQ6CiAgICAgICAgICAgIGZyYWdtZW50LmFwcGVuZChlbGVtZW50LnRleHQpCiAgICAgICAgZnJhZ21lbnQuZXh0ZW5kKGxpc3QoZWxlbWVudCkpCiAgICAgICAgaWYgZWxlbWVudC50YWlsOgogICAgICAgICAgICBmcmFnbWVudC5hcHBlbmQoZWxlbWVudC50YWlsKQogICAgICAgIHJldHVybiBmcmFnbWVudAoKICAgIGRlZiBpbnNlcnREb2N0eXBlKHNlbGYsIHRva2VuKToKICAgICAgICBuYW1lID0gdG9rZW5bIm5hbWUiXQogICAgICAgIHB1YmxpY0lkID0gdG9rZW5bInB1YmxpY0lkIl0KICAgICAgICBzeXN0ZW1JZCA9IHRva2VuWyJzeXN0ZW1JZCJdCgogICAgICAgIGlmIG5vdCBuYW1lOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJseG1sIGNhbm5vdCByZXByZXNlbnQgZW1wdHkgZG9jdHlwZSIsIERhdGFMb3NzV2FybmluZykKICAgICAgICAgICAgc2VsZi5kb2N0eXBlID0gTm9uZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGNvZXJjZWROYW1lID0gc2VsZi5pbmZvc2V0RmlsdGVyLmNvZXJjZUVsZW1lbnQobmFtZSkKICAgICAgICAgICAgaWYgY29lcmNlZE5hbWUgIT0gbmFtZToKICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oImx4bWwgY2Fubm90IHJlcHJlc2VudCBub24teG1sIGRvY3R5cGUiLCBEYXRhTG9zc1dhcm5pbmcpCgogICAgICAgICAgICBkb2N0eXBlID0gc2VsZi5kb2N0eXBlQ2xhc3MoY29lcmNlZE5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCkKICAgICAgICAgICAgc2VsZi5kb2N0eXBlID0gZG9jdHlwZQoKICAgIGRlZiBpbnNlcnRDb21tZW50SW5pdGlhbChzZWxmLCBkYXRhLCBwYXJlbnQ9Tm9uZSk6CiAgICAgICAgYXNzZXJ0IHBhcmVudCBpcyBOb25lIG9yIHBhcmVudCBpcyBzZWxmLmRvY3VtZW50CiAgICAgICAgYXNzZXJ0IHNlbGYuZG9jdW1lbnQuX2VsZW1lbnRUcmVlIGlzIE5vbmUKICAgICAgICBzZWxmLmluaXRpYWxfY29tbWVudHMuYXBwZW5kKGRhdGEpCgogICAgZGVmIGluc2VydENvbW1lbnRNYWluKHNlbGYsIGRhdGEsIHBhcmVudD1Ob25lKToKICAgICAgICBpZiAocGFyZW50ID09IHNlbGYuZG9jdW1lbnQgYW5kCiAgICAgICAgICAgICAgICBzZWxmLmRvY3VtZW50Ll9lbGVtZW50VHJlZS5nZXRyb290KClbLTFdLnRhZyA9PSBjb21tZW50X3R5cGUpOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJseG1sIGNhbm5vdCByZXByZXNlbnQgYWRqYWNlbnQgY29tbWVudHMgYmV5b25kIHRoZSByb290IGVsZW1lbnRzIiwgRGF0YUxvc3NXYXJuaW5nKQogICAgICAgIHN1cGVyKFRyZWVCdWlsZGVyLCBzZWxmKS5pbnNlcnRDb21tZW50KGRhdGEsIHBhcmVudCkKCiAgICBkZWYgaW5zZXJ0Um9vdChzZWxmLCB0b2tlbik6CiAgICAgICAgIiIiQ3JlYXRlIHRoZSBkb2N1bWVudCByb290IiIiCiAgICAgICAgIyBCZWNhdXNlIG9mIHRoZSB3YXkgbGlieG1sMiB3b3JrcywgaXQgZG9lc24ndCBzZWVtIHRvIGJlIHBvc3NpYmxlIHRvCiAgICAgICAgIyBhbHRlciBpbmZvcm1hdGlvbiBsaWtlIHRoZSBkb2N0eXBlIGFmdGVyIHRoZSB0cmVlIGhhcyBiZWVuIHBhcnNlZC4KICAgICAgICAjIFRoZXJlZm9yZSB3ZSBuZWVkIHRvIHVzZSB0aGUgYnVpbHQtaW4gcGFyc2VyIHRvIGNyZWF0ZSBvdXIgaW5pdGlhbAogICAgICAgICMgdHJlZSwgYWZ0ZXIgd2hpY2ggd2UgY2FuIGFkZCBlbGVtZW50cyBsaWtlIG5vcm1hbAogICAgICAgIGRvY1N0ciA9ICIiCiAgICAgICAgaWYgc2VsZi5kb2N0eXBlOgogICAgICAgICAgICBhc3NlcnQgc2VsZi5kb2N0eXBlLm5hbWUKICAgICAgICAgICAgZG9jU3RyICs9ICI8IURPQ1RZUEUgJXMiICUgc2VsZi5kb2N0eXBlLm5hbWUKICAgICAgICAgICAgaWYgKHNlbGYuZG9jdHlwZS5wdWJsaWNJZCBpcyBub3QgTm9uZSBvcgogICAgICAgICAgICAgICAgICAgIHNlbGYuZG9jdHlwZS5zeXN0ZW1JZCBpcyBub3QgTm9uZSk6CiAgICAgICAgICAgICAgICBkb2NTdHIgKz0gKCcgUFVCTElDICIlcyIgJyAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLmluZm9zZXRGaWx0ZXIuY29lcmNlUHViaWQoc2VsZi5kb2N0eXBlLnB1YmxpY0lkIG9yICIiKSkpCiAgICAgICAgICAgICAgICBpZiBzZWxmLmRvY3R5cGUuc3lzdGVtSWQ6CiAgICAgICAgICAgICAgICAgICAgc3lzaWQgPSBzZWxmLmRvY3R5cGUuc3lzdGVtSWQKICAgICAgICAgICAgICAgICAgICBpZiBzeXNpZC5maW5kKCInIikgPj0gMCBhbmQgc3lzaWQuZmluZCgnIicpID49IDA6CiAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkRPQ1RZUEUgc3lzdGVtIGNhbm5vdCBjb250YWluIHNpbmdsZSBhbmQgZG91YmxlIHF1b3RlcyIsIERhdGFMb3NzV2FybmluZykKICAgICAgICAgICAgICAgICAgICAgICAgc3lzaWQgPSBzeXNpZC5yZXBsYWNlKCInIiwgJ1UwMDAyNycpCiAgICAgICAgICAgICAgICAgICAgaWYgc3lzaWQuZmluZCgiJyIpID49IDA6CiAgICAgICAgICAgICAgICAgICAgICAgIGRvY1N0ciArPSAnIiVzIicgJSBzeXNpZAogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGRvY1N0ciArPSAiJyVzJyIgJSBzeXNpZAogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBkb2NTdHIgKz0gIicnIgogICAgICAgICAgICBkb2NTdHIgKz0gIj4iCiAgICAgICAgICAgIGlmIHNlbGYuZG9jdHlwZS5uYW1lICE9IHRva2VuWyJuYW1lIl06CiAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJseG1sIGNhbm5vdCByZXByZXNlbnQgZG9jdHlwZSB3aXRoIGEgZGlmZmVyZW50IG5hbWUgdG8gdGhlIHJvb3QgZWxlbWVudCIsIERhdGFMb3NzV2FybmluZykKICAgICAgICBkb2NTdHIgKz0gIjxUSElTX1NIT1VMRF9ORVZFUl9BUFBFQVJfUFVCTElDTFkvPiIKICAgICAgICByb290ID0gZXRyZWUuZnJvbXN0cmluZyhkb2NTdHIpCgogICAgICAgICMgQXBwZW5kIHRoZSBpbml0aWFsIGNvbW1lbnRzOgogICAgICAgIGZvciBjb21tZW50X3Rva2VuIGluIHNlbGYuaW5pdGlhbF9jb21tZW50czoKICAgICAgICAgICAgY29tbWVudCA9IHNlbGYuY29tbWVudENsYXNzKGNvbW1lbnRfdG9rZW5bImRhdGEiXSkKICAgICAgICAgICAgcm9vdC5hZGRwcmV2aW91cyhjb21tZW50Ll9lbGVtZW50KQoKICAgICAgICAjIENyZWF0ZSB0aGUgcm9vdCBkb2N1bWVudCBhbmQgYWRkIHRoZSBFbGVtZW50VHJlZSB0byBpdAogICAgICAgIHNlbGYuZG9jdW1lbnQgPSBzZWxmLmRvY3VtZW50Q2xhc3MoKQogICAgICAgIHNlbGYuZG9jdW1lbnQuX2VsZW1lbnRUcmVlID0gcm9vdC5nZXRyb290dHJlZSgpCgogICAgICAgICMgR2l2ZSB0aGUgcm9vdCBlbGVtZW50IHRoZSByaWdodCBuYW1lCiAgICAgICAgbmFtZSA9IHRva2VuWyJuYW1lIl0KICAgICAgICBuYW1lc3BhY2UgPSB0b2tlbi5nZXQoIm5hbWVzcGFjZSIsIHNlbGYuZGVmYXVsdE5hbWVzcGFjZSkKICAgICAgICBpZiBuYW1lc3BhY2UgaXMgTm9uZToKICAgICAgICAgICAgZXRyZWVfdGFnID0gbmFtZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGV0cmVlX3RhZyA9ICJ7JXN9JXMiICUgKG5hbWVzcGFjZSwgbmFtZSkKICAgICAgICByb290LnRhZyA9IGV0cmVlX3RhZwoKICAgICAgICAjIEFkZCB0aGUgcm9vdCBlbGVtZW50IHRvIHRoZSBpbnRlcm5hbCBjaGlsZC9vcGVuIGRhdGEgc3RydWN0dXJlcwogICAgICAgIHJvb3RfZWxlbWVudCA9IHNlbGYuZWxlbWVudENsYXNzKG5hbWUsIG5hbWVzcGFjZSkKICAgICAgICByb290X2VsZW1lbnQuX2VsZW1lbnQgPSByb290CiAgICAgICAgc2VsZi5kb2N1bWVudC5fY2hpbGROb2Rlcy5hcHBlbmQocm9vdF9lbGVtZW50KQogICAgICAgIHNlbGYub3BlbkVsZW1lbnRzLmFwcGVuZChyb290X2VsZW1lbnQpCgogICAgICAgICMgUmVzZXQgdG8gdGhlIGRlZmF1bHQgaW5zZXJ0IGNvbW1lbnQgZnVuY3Rpb24KICAgICAgICBzZWxmLmluc2VydENvbW1lbnQgPSBzZWxmLmluc2VydENvbW1lbnRNYWluClBLAwQUAAAAAAAAACEAc0QhlqgVAACoFQAAPAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVld2Fsa2Vycy9fX2luaXRfXy5weSIiIkEgY29sbGVjdGlvbiBvZiBtb2R1bGVzIGZvciBpdGVyYXRpbmcgdGhyb3VnaCBkaWZmZXJlbnQga2luZHMgb2YKdHJlZSwgZ2VuZXJhdGluZyB0b2tlbnMgaWRlbnRpY2FsIHRvIHRob3NlIHByb2R1Y2VkIGJ5IHRoZSB0b2tlbml6ZXIKbW9kdWxlLgoKVG8gY3JlYXRlIGEgdHJlZSB3YWxrZXIgZm9yIGEgbmV3IHR5cGUgb2YgdHJlZSwgeW91IG5lZWQgdG8gZG8KaW1wbGVtZW50IGEgdHJlZSB3YWxrZXIgb2JqZWN0IChjYWxsZWQgVHJlZVdhbGtlciBieSBjb252ZW50aW9uKSB0aGF0CmltcGxlbWVudHMgYSAnc2VyaWFsaXplJyBtZXRob2QgdGFraW5nIGEgdHJlZSBhcyBzb2xlIGFyZ3VtZW50IGFuZApyZXR1cm5pbmcgYW4gaXRlcmF0b3IgZ2VuZXJhdGluZyB0b2tlbnMuCiIiIgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCgpmcm9tIC4uIGltcG9ydCBjb25zdGFudHMKZnJvbSAuLl91dGlscyBpbXBvcnQgZGVmYXVsdF9ldHJlZQoKX19hbGxfXyA9IFsiZ2V0VHJlZVdhbGtlciIsICJwcHJpbnQiLCAiZG9tIiwgImV0cmVlIiwgImdlbnNoaSIsICJldHJlZV9seG1sIl0KCnRyZWVXYWxrZXJDYWNoZSA9IHt9CgoKZGVmIGdldFRyZWVXYWxrZXIodHJlZVR5cGUsIGltcGxlbWVudGF0aW9uPU5vbmUsICoqa3dhcmdzKToKICAgICIiIkdldCBhIFRyZWVXYWxrZXIgY2xhc3MgZm9yIHZhcmlvdXMgdHlwZXMgb2YgdHJlZSB3aXRoIGJ1aWx0LWluIHN1cHBvcnQKCiAgICBBcmdzOgogICAgICAgIHRyZWVUeXBlIChzdHIpOiB0aGUgbmFtZSBvZiB0aGUgdHJlZSB0eXBlIHJlcXVpcmVkIChjYXNlLWluc2Vuc2l0aXZlKS4KICAgICAgICAgICAgU3VwcG9ydGVkIHZhbHVlcyBhcmU6CgogICAgICAgICAgICAtICJkb20iOiBUaGUgeG1sLmRvbS5taW5pZG9tIERPTSBpbXBsZW1lbnRhdGlvbgogICAgICAgICAgICAtICJldHJlZSI6IEEgZ2VuZXJpYyB3YWxrZXIgZm9yIHRyZWUgaW1wbGVtZW50YXRpb25zIGV4cG9zaW5nIGFuCiAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHRyZWUtbGlrZSBpbnRlcmZhY2UgKGtub3duIHRvIHdvcmsgd2l0aAogICAgICAgICAgICAgICAgICAgICAgIEVsZW1lbnRUcmVlLCBjRWxlbWVudFRyZWUgYW5kIGx4bWwuZXRyZWUpLgogICAgICAgICAgICAtICJseG1sIjogT3B0aW1pemVkIHdhbGtlciBmb3IgbHhtbC5ldHJlZQogICAgICAgICAgICAtICJnZW5zaGkiOiBhIEdlbnNoaSBzdHJlYW0KCiAgICAgICAgSW1wbGVtZW50YXRpb246IEEgbW9kdWxlIGltcGxlbWVudGluZyB0aGUgdHJlZSB0eXBlIGUuZy4KICAgICAgICAgICAgeG1sLmV0cmVlLkVsZW1lbnRUcmVlIG9yIGNFbGVtZW50VHJlZSAoQ3VycmVudGx5IGFwcGxpZXMgdG8gdGhlCiAgICAgICAgICAgICJldHJlZSIgdHJlZSB0eXBlIG9ubHkpLgogICAgIiIiCgogICAgdHJlZVR5cGUgPSB0cmVlVHlwZS5sb3dlcigpCiAgICBpZiB0cmVlVHlwZSBub3QgaW4gdHJlZVdhbGtlckNhY2hlOgogICAgICAgIGlmIHRyZWVUeXBlID09ICJkb20iOgogICAgICAgICAgICBmcm9tIC4gaW1wb3J0IGRvbQogICAgICAgICAgICB0cmVlV2Fsa2VyQ2FjaGVbdHJlZVR5cGVdID0gZG9tLlRyZWVXYWxrZXIKICAgICAgICBlbGlmIHRyZWVUeXBlID09ICJnZW5zaGkiOgogICAgICAgICAgICBmcm9tIC4gaW1wb3J0IGdlbnNoaQogICAgICAgICAgICB0cmVlV2Fsa2VyQ2FjaGVbdHJlZVR5cGVdID0gZ2Vuc2hpLlRyZWVXYWxrZXIKICAgICAgICBlbGlmIHRyZWVUeXBlID09ICJseG1sIjoKICAgICAgICAgICAgZnJvbSAuIGltcG9ydCBldHJlZV9seG1sCiAgICAgICAgICAgIHRyZWVXYWxrZXJDYWNoZVt0cmVlVHlwZV0gPSBldHJlZV9seG1sLlRyZWVXYWxrZXIKICAgICAgICBlbGlmIHRyZWVUeXBlID09ICJldHJlZSI6CiAgICAgICAgICAgIGZyb20gLiBpbXBvcnQgZXRyZWUKICAgICAgICAgICAgaWYgaW1wbGVtZW50YXRpb24gaXMgTm9uZToKICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uID0gZGVmYXVsdF9ldHJlZQogICAgICAgICAgICAjIFhYWDogTkVWRVIgY2FjaGUgaGVyZSwgY2FjaGluZyBpcyBkb25lIGluIHRoZSBldHJlZSBzdWJtb2R1bGUKICAgICAgICAgICAgcmV0dXJuIGV0cmVlLmdldEVUcmVlTW9kdWxlKGltcGxlbWVudGF0aW9uLCAqKmt3YXJncykuVHJlZVdhbGtlcgogICAgcmV0dXJuIHRyZWVXYWxrZXJDYWNoZS5nZXQodHJlZVR5cGUpCgoKZGVmIGNvbmNhdGVuYXRlQ2hhcmFjdGVyVG9rZW5zKHRva2Vucyk6CiAgICBwZW5kaW5nQ2hhcmFjdGVycyA9IFtdCiAgICBmb3IgdG9rZW4gaW4gdG9rZW5zOgogICAgICAgIHR5cGUgPSB0b2tlblsidHlwZSJdCiAgICAgICAgaWYgdHlwZSBpbiAoIkNoYXJhY3RlcnMiLCAiU3BhY2VDaGFyYWN0ZXJzIik6CiAgICAgICAgICAgIHBlbmRpbmdDaGFyYWN0ZXJzLmFwcGVuZCh0b2tlblsiZGF0YSJdKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIHBlbmRpbmdDaGFyYWN0ZXJzOgogICAgICAgICAgICAgICAgeWllbGQgeyJ0eXBlIjogIkNoYXJhY3RlcnMiLCAiZGF0YSI6ICIiLmpvaW4ocGVuZGluZ0NoYXJhY3RlcnMpfQogICAgICAgICAgICAgICAgcGVuZGluZ0NoYXJhY3RlcnMgPSBbXQogICAgICAgICAgICB5aWVsZCB0b2tlbgogICAgaWYgcGVuZGluZ0NoYXJhY3RlcnM6CiAgICAgICAgeWllbGQgeyJ0eXBlIjogIkNoYXJhY3RlcnMiLCAiZGF0YSI6ICIiLmpvaW4ocGVuZGluZ0NoYXJhY3RlcnMpfQoKCmRlZiBwcHJpbnQod2Fsa2VyKToKICAgICIiIlByZXR0eSBwcmludGVyIGZvciB0cmVlIHdhbGtlcnMiIiIKICAgIG91dHB1dCA9IFtdCiAgICBpbmRlbnQgPSAwCiAgICBmb3IgdG9rZW4gaW4gY29uY2F0ZW5hdGVDaGFyYWN0ZXJUb2tlbnMod2Fsa2VyKToKICAgICAgICB0eXBlID0gdG9rZW5bInR5cGUiXQogICAgICAgIGlmIHR5cGUgaW4gKCJTdGFydFRhZyIsICJFbXB0eVRhZyIpOgogICAgICAgICAgICAjIHRhZyBuYW1lCiAgICAgICAgICAgIGlmIHRva2VuWyJuYW1lc3BhY2UiXSBhbmQgdG9rZW5bIm5hbWVzcGFjZSJdICE9IGNvbnN0YW50cy5uYW1lc3BhY2VzWyJodG1sIl06CiAgICAgICAgICAgICAgICBpZiB0b2tlblsibmFtZXNwYWNlIl0gaW4gY29uc3RhbnRzLnByZWZpeGVzOgogICAgICAgICAgICAgICAgICAgIG5zID0gY29uc3RhbnRzLnByZWZpeGVzW3Rva2VuWyJuYW1lc3BhY2UiXV0KICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbnMgPSB0b2tlblsibmFtZXNwYWNlIl0KICAgICAgICAgICAgICAgIG5hbWUgPSAiJXMgJXMiICUgKG5zLCB0b2tlblsibmFtZSJdKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbmFtZSA9IHRva2VuWyJuYW1lIl0KICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiJXM8JXM+IiAlICgiICIgKiBpbmRlbnQsIG5hbWUpKQogICAgICAgICAgICBpbmRlbnQgKz0gMgogICAgICAgICAgICAjIGF0dHJpYnV0ZXMgKHNvcnRlZCBmb3IgY29uc2lzdGVudCBvcmRlcmluZykKICAgICAgICAgICAgYXR0cnMgPSB0b2tlblsiZGF0YSJdCiAgICAgICAgICAgIGZvciAobmFtZXNwYWNlLCBsb2NhbG5hbWUpLCB2YWx1ZSBpbiBzb3J0ZWQoYXR0cnMuaXRlbXMoKSk6CiAgICAgICAgICAgICAgICBpZiBuYW1lc3BhY2U6CiAgICAgICAgICAgICAgICAgICAgaWYgbmFtZXNwYWNlIGluIGNvbnN0YW50cy5wcmVmaXhlczoKICAgICAgICAgICAgICAgICAgICAgICAgbnMgPSBjb25zdGFudHMucHJlZml4ZXNbbmFtZXNwYWNlXQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIG5zID0gbmFtZXNwYWNlCiAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICIlcyAlcyIgJSAobnMsIGxvY2FsbmFtZSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGxvY2FsbmFtZQogICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiJXMlcz1cIiVzXCIiICUgKCIgIiAqIGluZGVudCwgbmFtZSwgdmFsdWUpKQogICAgICAgICAgICAjIHNlbGYtY2xvc2luZwogICAgICAgICAgICBpZiB0eXBlID09ICJFbXB0eVRhZyI6CiAgICAgICAgICAgICAgICBpbmRlbnQgLT0gMgoKICAgICAgICBlbGlmIHR5cGUgPT0gIkVuZFRhZyI6CiAgICAgICAgICAgIGluZGVudCAtPSAyCgogICAgICAgIGVsaWYgdHlwZSA9PSAiQ29tbWVudCI6CiAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIiVzPCEtLSAlcyAtLT4iICUgKCIgIiAqIGluZGVudCwgdG9rZW5bImRhdGEiXSkpCgogICAgICAgIGVsaWYgdHlwZSA9PSAiRG9jdHlwZSI6CiAgICAgICAgICAgIGlmIHRva2VuWyJuYW1lIl06CiAgICAgICAgICAgICAgICBpZiB0b2tlblsicHVibGljSWQiXToKICAgICAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCIiIiVzPCFET0NUWVBFICVzICIlcyIgIiVzIj4iIiIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCIgIiAqIGluZGVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlblsibmFtZSJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuWyJwdWJsaWNJZCJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuWyJzeXN0ZW1JZCJdIGlmIHRva2VuWyJzeXN0ZW1JZCJdIGVsc2UgIiIpKQogICAgICAgICAgICAgICAgZWxpZiB0b2tlblsic3lzdGVtSWQiXToKICAgICAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCIiIiVzPCFET0NUWVBFICVzICIiICIlcyI+IiIiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiICIgKiBpbmRlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5bIm5hbWUiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlblsic3lzdGVtSWQiXSkpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIiVzPCFET0NUWVBFICVzPiIgJSAoIiAiICogaW5kZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5bIm5hbWUiXSkpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCIlczwhRE9DVFlQRSA+IiAlICgiICIgKiBpbmRlbnQsKSkKCiAgICAgICAgZWxpZiB0eXBlID09ICJDaGFyYWN0ZXJzIjoKICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiJXNcIiVzXCIiICUgKCIgIiAqIGluZGVudCwgdG9rZW5bImRhdGEiXSkpCgogICAgICAgIGVsaWYgdHlwZSA9PSAiU3BhY2VDaGFyYWN0ZXJzIjoKICAgICAgICAgICAgYXNzZXJ0IEZhbHNlLCAiY29uY2F0ZW5hdGVDaGFyYWN0ZXJUb2tlbnMgc2hvdWxkIGhhdmUgZ290IHJpZCBvZiBhbGwgU3BhY2UgdG9rZW5zIgoKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJVbmtub3duIHRva2VuIHR5cGUsICVzIiAlIHR5cGUpCgogICAgcmV0dXJuICJcbiIuam9pbihvdXRwdXQpClBLAwQUAAAAAAAAACEATSOYwEsTAABLEwAAOAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVld2Fsa2Vycy9iYXNlLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCgpmcm9tIHhtbC5kb20gaW1wb3J0IE5vZGUKZnJvbSAuLmNvbnN0YW50cyBpbXBvcnQgbmFtZXNwYWNlcywgdm9pZEVsZW1lbnRzLCBzcGFjZUNoYXJhY3RlcnMKCl9fYWxsX18gPSBbIkRPQ1VNRU5UIiwgIkRPQ1RZUEUiLCAiVEVYVCIsICJFTEVNRU5UIiwgIkNPTU1FTlQiLCAiRU5USVRZIiwgIlVOS05PV04iLAogICAgICAgICAgICJUcmVlV2Fsa2VyIiwgIk5vblJlY3Vyc2l2ZVRyZWVXYWxrZXIiXQoKRE9DVU1FTlQgPSBOb2RlLkRPQ1VNRU5UX05PREUKRE9DVFlQRSA9IE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFClRFWFQgPSBOb2RlLlRFWFRfTk9ERQpFTEVNRU5UID0gTm9kZS5FTEVNRU5UX05PREUKQ09NTUVOVCA9IE5vZGUuQ09NTUVOVF9OT0RFCkVOVElUWSA9IE5vZGUuRU5USVRZX05PREUKVU5LTk9XTiA9ICI8I1VOS05PV04jPiIKCnNwYWNlQ2hhcmFjdGVycyA9ICIiLmpvaW4oc3BhY2VDaGFyYWN0ZXJzKQoKCmNsYXNzIFRyZWVXYWxrZXIob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0cmVlKToKICAgICAgICBzZWxmLnRyZWUgPSB0cmVlCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKCiAgICBkZWYgZXJyb3Ioc2VsZiwgbXNnKToKICAgICAgICByZXR1cm4geyJ0eXBlIjogIlNlcmlhbGl6ZUVycm9yIiwgImRhdGEiOiBtc2d9CgogICAgZGVmIGVtcHR5VGFnKHNlbGYsIG5hbWVzcGFjZSwgbmFtZSwgYXR0cnMsIGhhc0NoaWxkcmVuPUZhbHNlKToKICAgICAgICB5aWVsZCB7InR5cGUiOiAiRW1wdHlUYWciLCAibmFtZSI6IG5hbWUsCiAgICAgICAgICAgICAgICJuYW1lc3BhY2UiOiBuYW1lc3BhY2UsCiAgICAgICAgICAgICAgICJkYXRhIjogYXR0cnN9CiAgICAgICAgaWYgaGFzQ2hpbGRyZW46CiAgICAgICAgICAgIHlpZWxkIHNlbGYuZXJyb3IoIlZvaWQgZWxlbWVudCBoYXMgY2hpbGRyZW4iKQoKICAgIGRlZiBzdGFydFRhZyhzZWxmLCBuYW1lc3BhY2UsIG5hbWUsIGF0dHJzKToKICAgICAgICByZXR1cm4geyJ0eXBlIjogIlN0YXJ0VGFnIiwKICAgICAgICAgICAgICAgICJuYW1lIjogbmFtZSwKICAgICAgICAgICAgICAgICJuYW1lc3BhY2UiOiBuYW1lc3BhY2UsCiAgICAgICAgICAgICAgICAiZGF0YSI6IGF0dHJzfQoKICAgIGRlZiBlbmRUYWcoc2VsZiwgbmFtZXNwYWNlLCBuYW1lKToKICAgICAgICByZXR1cm4geyJ0eXBlIjogIkVuZFRhZyIsCiAgICAgICAgICAgICAgICAibmFtZSI6IG5hbWUsCiAgICAgICAgICAgICAgICAibmFtZXNwYWNlIjogbmFtZXNwYWNlfQoKICAgIGRlZiB0ZXh0KHNlbGYsIGRhdGEpOgogICAgICAgIGRhdGEgPSBkYXRhCiAgICAgICAgbWlkZGxlID0gZGF0YS5sc3RyaXAoc3BhY2VDaGFyYWN0ZXJzKQogICAgICAgIGxlZnQgPSBkYXRhWzpsZW4oZGF0YSkgLSBsZW4obWlkZGxlKV0KICAgICAgICBpZiBsZWZ0OgogICAgICAgICAgICB5aWVsZCB7InR5cGUiOiAiU3BhY2VDaGFyYWN0ZXJzIiwgImRhdGEiOiBsZWZ0fQogICAgICAgIGRhdGEgPSBtaWRkbGUKICAgICAgICBtaWRkbGUgPSBkYXRhLnJzdHJpcChzcGFjZUNoYXJhY3RlcnMpCiAgICAgICAgcmlnaHQgPSBkYXRhW2xlbihtaWRkbGUpOl0KICAgICAgICBpZiBtaWRkbGU6CiAgICAgICAgICAgIHlpZWxkIHsidHlwZSI6ICJDaGFyYWN0ZXJzIiwgImRhdGEiOiBtaWRkbGV9CiAgICAgICAgaWYgcmlnaHQ6CiAgICAgICAgICAgIHlpZWxkIHsidHlwZSI6ICJTcGFjZUNoYXJhY3RlcnMiLCAiZGF0YSI6IHJpZ2h0fQoKICAgIGRlZiBjb21tZW50KHNlbGYsIGRhdGEpOgogICAgICAgIHJldHVybiB7InR5cGUiOiAiQ29tbWVudCIsICJkYXRhIjogZGF0YX0KCiAgICBkZWYgZG9jdHlwZShzZWxmLCBuYW1lLCBwdWJsaWNJZD1Ob25lLCBzeXN0ZW1JZD1Ob25lKToKICAgICAgICByZXR1cm4geyJ0eXBlIjogIkRvY3R5cGUiLAogICAgICAgICAgICAgICAgIm5hbWUiOiBuYW1lLAogICAgICAgICAgICAgICAgInB1YmxpY0lkIjogcHVibGljSWQsCiAgICAgICAgICAgICAgICAic3lzdGVtSWQiOiBzeXN0ZW1JZH0KCiAgICBkZWYgZW50aXR5KHNlbGYsIG5hbWUpOgogICAgICAgIHJldHVybiB7InR5cGUiOiAiRW50aXR5IiwgIm5hbWUiOiBuYW1lfQoKICAgIGRlZiB1bmtub3duKHNlbGYsIG5vZGVUeXBlKToKICAgICAgICByZXR1cm4gc2VsZi5lcnJvcigiVW5rbm93biBub2RlIHR5cGU6ICIgKyBub2RlVHlwZSkKCgpjbGFzcyBOb25SZWN1cnNpdmVUcmVlV2Fsa2VyKFRyZWVXYWxrZXIpOgogICAgZGVmIGdldE5vZGVEZXRhaWxzKHNlbGYsIG5vZGUpOgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKCiAgICBkZWYgZ2V0Rmlyc3RDaGlsZChzZWxmLCBub2RlKToKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCgogICAgZGVmIGdldE5leHRTaWJsaW5nKHNlbGYsIG5vZGUpOgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKCiAgICBkZWYgZ2V0UGFyZW50Tm9kZShzZWxmLCBub2RlKToKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIGN1cnJlbnROb2RlID0gc2VsZi50cmVlCiAgICAgICAgd2hpbGUgY3VycmVudE5vZGUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGRldGFpbHMgPSBzZWxmLmdldE5vZGVEZXRhaWxzKGN1cnJlbnROb2RlKQogICAgICAgICAgICB0eXBlLCBkZXRhaWxzID0gZGV0YWlsc1swXSwgZGV0YWlsc1sxOl0KICAgICAgICAgICAgaGFzQ2hpbGRyZW4gPSBGYWxzZQoKICAgICAgICAgICAgaWYgdHlwZSA9PSBET0NUWVBFOgogICAgICAgICAgICAgICAgeWllbGQgc2VsZi5kb2N0eXBlKCpkZXRhaWxzKQoKICAgICAgICAgICAgZWxpZiB0eXBlID09IFRFWFQ6CiAgICAgICAgICAgICAgICBmb3IgdG9rZW4gaW4gc2VsZi50ZXh0KCpkZXRhaWxzKToKICAgICAgICAgICAgICAgICAgICB5aWVsZCB0b2tlbgoKICAgICAgICAgICAgZWxpZiB0eXBlID09IEVMRU1FTlQ6CiAgICAgICAgICAgICAgICBuYW1lc3BhY2UsIG5hbWUsIGF0dHJpYnV0ZXMsIGhhc0NoaWxkcmVuID0gZGV0YWlscwogICAgICAgICAgICAgICAgaWYgKG5vdCBuYW1lc3BhY2Ugb3IgbmFtZXNwYWNlID09IG5hbWVzcGFjZXNbImh0bWwiXSkgYW5kIG5hbWUgaW4gdm9pZEVsZW1lbnRzOgogICAgICAgICAgICAgICAgICAgIGZvciB0b2tlbiBpbiBzZWxmLmVtcHR5VGFnKG5hbWVzcGFjZSwgbmFtZSwgYXR0cmlidXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNDaGlsZHJlbik6CiAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHRva2VuCiAgICAgICAgICAgICAgICAgICAgaGFzQ2hpbGRyZW4gPSBGYWxzZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLnN0YXJ0VGFnKG5hbWVzcGFjZSwgbmFtZSwgYXR0cmlidXRlcykKCiAgICAgICAgICAgIGVsaWYgdHlwZSA9PSBDT01NRU5UOgogICAgICAgICAgICAgICAgeWllbGQgc2VsZi5jb21tZW50KGRldGFpbHNbMF0pCgogICAgICAgICAgICBlbGlmIHR5cGUgPT0gRU5USVRZOgogICAgICAgICAgICAgICAgeWllbGQgc2VsZi5lbnRpdHkoZGV0YWlsc1swXSkKCiAgICAgICAgICAgIGVsaWYgdHlwZSA9PSBET0NVTUVOVDoKICAgICAgICAgICAgICAgIGhhc0NoaWxkcmVuID0gVHJ1ZQoKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYudW5rbm93bihkZXRhaWxzWzBdKQoKICAgICAgICAgICAgaWYgaGFzQ2hpbGRyZW46CiAgICAgICAgICAgICAgICBmaXJzdENoaWxkID0gc2VsZi5nZXRGaXJzdENoaWxkKGN1cnJlbnROb2RlKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZmlyc3RDaGlsZCA9IE5vbmUKCiAgICAgICAgICAgIGlmIGZpcnN0Q2hpbGQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZSA9IGZpcnN0Q2hpbGQKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHdoaWxlIGN1cnJlbnROb2RlIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgIGRldGFpbHMgPSBzZWxmLmdldE5vZGVEZXRhaWxzKGN1cnJlbnROb2RlKQogICAgICAgICAgICAgICAgICAgIHR5cGUsIGRldGFpbHMgPSBkZXRhaWxzWzBdLCBkZXRhaWxzWzE6XQogICAgICAgICAgICAgICAgICAgIGlmIHR5cGUgPT0gRUxFTUVOVDoKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlLCBuYW1lLCBhdHRyaWJ1dGVzLCBoYXNDaGlsZHJlbiA9IGRldGFpbHMKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZSBhbmQgbmFtZXNwYWNlICE9IG5hbWVzcGFjZXNbImh0bWwiXSkgb3IgbmFtZSBub3QgaW4gdm9pZEVsZW1lbnRzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgc2VsZi5lbmRUYWcobmFtZXNwYWNlLCBuYW1lKQogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYudHJlZSBpcyBjdXJyZW50Tm9kZToKICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUgPSBOb25lCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICAgICAgbmV4dFNpYmxpbmcgPSBzZWxmLmdldE5leHRTaWJsaW5nKGN1cnJlbnROb2RlKQogICAgICAgICAgICAgICAgICAgIGlmIG5leHRTaWJsaW5nIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZSA9IG5leHRTaWJsaW5nCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE5vZGUgPSBzZWxmLmdldFBhcmVudE5vZGUoY3VycmVudE5vZGUpClBLAwQUAAAAAAAAACEAZYpvqYUFAACFBQAANwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVld2Fsa2Vycy9kb20ucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKCmZyb20geG1sLmRvbSBpbXBvcnQgTm9kZQoKZnJvbSAuIGltcG9ydCBiYXNlCgoKY2xhc3MgVHJlZVdhbGtlcihiYXNlLk5vblJlY3Vyc2l2ZVRyZWVXYWxrZXIpOgogICAgZGVmIGdldE5vZGVEZXRhaWxzKHNlbGYsIG5vZGUpOgogICAgICAgIGlmIG5vZGUubm9kZVR5cGUgPT0gTm9kZS5ET0NVTUVOVF9UWVBFX05PREU6CiAgICAgICAgICAgIHJldHVybiBiYXNlLkRPQ1RZUEUsIG5vZGUubmFtZSwgbm9kZS5wdWJsaWNJZCwgbm9kZS5zeXN0ZW1JZAoKICAgICAgICBlbGlmIG5vZGUubm9kZVR5cGUgaW4gKE5vZGUuVEVYVF9OT0RFLCBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSk6CiAgICAgICAgICAgIHJldHVybiBiYXNlLlRFWFQsIG5vZGUubm9kZVZhbHVlCgogICAgICAgIGVsaWYgbm9kZS5ub2RlVHlwZSA9PSBOb2RlLkVMRU1FTlRfTk9ERToKICAgICAgICAgICAgYXR0cnMgPSB7fQogICAgICAgICAgICBmb3IgYXR0ciBpbiBsaXN0KG5vZGUuYXR0cmlidXRlcy5rZXlzKCkpOgogICAgICAgICAgICAgICAgYXR0ciA9IG5vZGUuZ2V0QXR0cmlidXRlTm9kZShhdHRyKQogICAgICAgICAgICAgICAgaWYgYXR0ci5uYW1lc3BhY2VVUkk6CiAgICAgICAgICAgICAgICAgICAgYXR0cnNbKGF0dHIubmFtZXNwYWNlVVJJLCBhdHRyLmxvY2FsTmFtZSldID0gYXR0ci52YWx1ZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBhdHRyc1soTm9uZSwgYXR0ci5uYW1lKV0gPSBhdHRyLnZhbHVlCiAgICAgICAgICAgIHJldHVybiAoYmFzZS5FTEVNRU5ULCBub2RlLm5hbWVzcGFjZVVSSSwgbm9kZS5ub2RlTmFtZSwKICAgICAgICAgICAgICAgICAgICBhdHRycywgbm9kZS5oYXNDaGlsZE5vZGVzKCkpCgogICAgICAgIGVsaWYgbm9kZS5ub2RlVHlwZSA9PSBOb2RlLkNPTU1FTlRfTk9ERToKICAgICAgICAgICAgcmV0dXJuIGJhc2UuQ09NTUVOVCwgbm9kZS5ub2RlVmFsdWUKCiAgICAgICAgZWxpZiBub2RlLm5vZGVUeXBlIGluIChOb2RlLkRPQ1VNRU5UX05PREUsIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSk6CiAgICAgICAgICAgIHJldHVybiAoYmFzZS5ET0NVTUVOVCwpCgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBiYXNlLlVOS05PV04sIG5vZGUubm9kZVR5cGUKCiAgICBkZWYgZ2V0Rmlyc3RDaGlsZChzZWxmLCBub2RlKToKICAgICAgICByZXR1cm4gbm9kZS5maXJzdENoaWxkCgogICAgZGVmIGdldE5leHRTaWJsaW5nKHNlbGYsIG5vZGUpOgogICAgICAgIHJldHVybiBub2RlLm5leHRTaWJsaW5nCgogICAgZGVmIGdldFBhcmVudE5vZGUoc2VsZiwgbm9kZSk6CiAgICAgICAgcmV0dXJuIG5vZGUucGFyZW50Tm9kZQpQSwMEFAAAAAAAAAAhACLBEDFMEgAATBIAADkAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZXdhbGtlcnMvZXRyZWUucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKCnRyeToKICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IE9yZGVyZWREaWN0CmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIHRyeToKICAgICAgICBmcm9tIG9yZGVyZWRkaWN0IGltcG9ydCBPcmRlcmVkRGljdAogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIE9yZGVyZWREaWN0ID0gZGljdAoKaW1wb3J0IHJlCgpmcm9tIHBpcC5fdmVuZG9yLnNpeCBpbXBvcnQgc3RyaW5nX3R5cGVzCgpmcm9tIC4gaW1wb3J0IGJhc2UKZnJvbSAuLl91dGlscyBpbXBvcnQgbW9kdWxlRmFjdG9yeUZhY3RvcnkKCnRhZ19yZWdleHAgPSByZS5jb21waWxlKCJ7KFtefV0qKX0oLiopIikKCgpkZWYgZ2V0RVRyZWVCdWlsZGVyKEVsZW1lbnRUcmVlSW1wbGVtZW50YXRpb24pOgogICAgRWxlbWVudFRyZWUgPSBFbGVtZW50VHJlZUltcGxlbWVudGF0aW9uCiAgICBFbGVtZW50VHJlZUNvbW1lbnRUeXBlID0gRWxlbWVudFRyZWUuQ29tbWVudCgiYXNkIikudGFnCgogICAgY2xhc3MgVHJlZVdhbGtlcihiYXNlLk5vblJlY3Vyc2l2ZVRyZWVXYWxrZXIpOiAgIyBweWxpbnQ6ZGlzYWJsZT11bnVzZWQtdmFyaWFibGUKICAgICAgICAiIiJHaXZlbiB0aGUgcGFydGljdWxhciBFbGVtZW50VHJlZSByZXByZXNlbnRhdGlvbiwgdGhpcyBpbXBsZW1lbnRhdGlvbiwKICAgICAgICB0byBhdm9pZCB1c2luZyByZWN1cnNpb24sIHJldHVybnMgIm5vZGVzIiBhcyB0dXBsZXMgd2l0aCB0aGUgZm9sbG93aW5nCiAgICAgICAgY29udGVudDoKCiAgICAgICAgMS4gVGhlIGN1cnJlbnQgZWxlbWVudAoKICAgICAgICAyLiBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgcmVsYXRpdmUgdG8gaXRzIHBhcmVudAoKICAgICAgICAzLiBBIHN0YWNrIG9mIGFuY2VzdG9yIGVsZW1lbnRzCgogICAgICAgIDQuIEEgZmxhZyAidGV4dCIsICJ0YWlsIiBvciBOb25lIHRvIGluZGljYXRlIGlmIHRoZSBjdXJyZW50IG5vZGUgaXMgYQogICAgICAgICAgIHRleHQgbm9kZTsgZWl0aGVyIHRoZSB0ZXh0IG9yIHRhaWwgb2YgdGhlIGN1cnJlbnQgZWxlbWVudCAoMSkKICAgICAgICAiIiIKICAgICAgICBkZWYgZ2V0Tm9kZURldGFpbHMoc2VsZiwgbm9kZSk6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZSwgdHVwbGUpOiAgIyBJdCBtaWdodCBiZSB0aGUgcm9vdCBFbGVtZW50CiAgICAgICAgICAgICAgICBlbHQsIF8sIF8sIGZsYWcgPSBub2RlCiAgICAgICAgICAgICAgICBpZiBmbGFnIGluICgidGV4dCIsICJ0YWlsIik6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJhc2UuVEVYVCwgZ2V0YXR0cihlbHQsIGZsYWcpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG5vZGUgPSBlbHQKCiAgICAgICAgICAgIGlmIG5vdChoYXNhdHRyKG5vZGUsICJ0YWciKSk6CiAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5nZXRyb290KCkKCiAgICAgICAgICAgIGlmIG5vZGUudGFnIGluICgiRE9DVU1FTlRfUk9PVCIsICJET0NVTUVOVF9GUkFHTUVOVCIpOgogICAgICAgICAgICAgICAgcmV0dXJuIChiYXNlLkRPQ1VNRU5ULCkKCiAgICAgICAgICAgIGVsaWYgbm9kZS50YWcgPT0gIjwhRE9DVFlQRT4iOgogICAgICAgICAgICAgICAgcmV0dXJuIChiYXNlLkRPQ1RZUEUsIG5vZGUudGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5nZXQoInB1YmxpY0lkIiksIG5vZGUuZ2V0KCJzeXN0ZW1JZCIpKQoKICAgICAgICAgICAgZWxpZiBub2RlLnRhZyA9PSBFbGVtZW50VHJlZUNvbW1lbnRUeXBlOgogICAgICAgICAgICAgICAgcmV0dXJuIGJhc2UuQ09NTUVOVCwgbm9kZS50ZXh0CgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2Uobm9kZS50YWcsIHN0cmluZ190eXBlcyksIHR5cGUobm9kZS50YWcpCiAgICAgICAgICAgICAgICAjIFRoaXMgaXMgYXNzdW1lZCB0byBiZSBhbiBvcmRpbmFyeSBlbGVtZW50CiAgICAgICAgICAgICAgICBtYXRjaCA9IHRhZ19yZWdleHAubWF0Y2gobm9kZS50YWcpCiAgICAgICAgICAgICAgICBpZiBtYXRjaDoKICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UsIHRhZyA9IG1hdGNoLmdyb3VwcygpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IE5vbmUKICAgICAgICAgICAgICAgICAgICB0YWcgPSBub2RlLnRhZwogICAgICAgICAgICAgICAgYXR0cnMgPSBPcmRlcmVkRGljdCgpCiAgICAgICAgICAgICAgICBmb3IgbmFtZSwgdmFsdWUgaW4gbGlzdChub2RlLmF0dHJpYi5pdGVtcygpKToKICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IHRhZ19yZWdleHAubWF0Y2gobmFtZSkKICAgICAgICAgICAgICAgICAgICBpZiBtYXRjaDoKICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnNbKG1hdGNoLmdyb3VwKDEpLCBtYXRjaC5ncm91cCgyKSldID0gdmFsdWUKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBhdHRyc1soTm9uZSwgbmFtZSldID0gdmFsdWUKICAgICAgICAgICAgICAgIHJldHVybiAoYmFzZS5FTEVNRU5ULCBuYW1lc3BhY2UsIHRhZywKICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnMsIGxlbihub2RlKSBvciBub2RlLnRleHQpCgogICAgICAgIGRlZiBnZXRGaXJzdENoaWxkKHNlbGYsIG5vZGUpOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUsIHR1cGxlKToKICAgICAgICAgICAgICAgIGVsZW1lbnQsIGtleSwgcGFyZW50cywgZmxhZyA9IG5vZGUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGVsZW1lbnQsIGtleSwgcGFyZW50cywgZmxhZyA9IG5vZGUsIE5vbmUsIFtdLCBOb25lCgogICAgICAgICAgICBpZiBmbGFnIGluICgidGV4dCIsICJ0YWlsIik6CiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaWYgZWxlbWVudC50ZXh0OgogICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50LCBrZXksIHBhcmVudHMsICJ0ZXh0IgogICAgICAgICAgICAgICAgZWxpZiBsZW4oZWxlbWVudCk6CiAgICAgICAgICAgICAgICAgICAgcGFyZW50cy5hcHBlbmQoZWxlbWVudCkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudFswXSwgMCwgcGFyZW50cywgTm9uZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICBkZWYgZ2V0TmV4dFNpYmxpbmcoc2VsZiwgbm9kZSk6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZSwgdHVwbGUpOgogICAgICAgICAgICAgICAgZWxlbWVudCwga2V5LCBwYXJlbnRzLCBmbGFnID0gbm9kZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgICAgIGlmIGZsYWcgPT0gInRleHQiOgogICAgICAgICAgICAgICAgaWYgbGVuKGVsZW1lbnQpOgogICAgICAgICAgICAgICAgICAgIHBhcmVudHMuYXBwZW5kKGVsZW1lbnQpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRbMF0sIDAsIHBhcmVudHMsIE5vbmUKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlmIGVsZW1lbnQudGFpbCBhbmQgZmxhZyAhPSAidGFpbCI6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQsIGtleSwgcGFyZW50cywgInRhaWwiCiAgICAgICAgICAgICAgICBlbGlmIGtleSA8IGxlbihwYXJlbnRzWy0xXSkgLSAxOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJlbnRzWy0xXVtrZXkgKyAxXSwga2V5ICsgMSwgcGFyZW50cywgTm9uZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICBkZWYgZ2V0UGFyZW50Tm9kZShzZWxmLCBub2RlKToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLCB0dXBsZSk6CiAgICAgICAgICAgICAgICBlbGVtZW50LCBrZXksIHBhcmVudHMsIGZsYWcgPSBub2RlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICAgICAgaWYgZmxhZyA9PSAidGV4dCI6CiAgICAgICAgICAgICAgICBpZiBub3QgcGFyZW50czoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudAogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudCwga2V5LCBwYXJlbnRzLCBOb25lCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnRzLnBvcCgpCiAgICAgICAgICAgICAgICBpZiBub3QgcGFyZW50czoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50CiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGFzc2VydCBsaXN0KHBhcmVudHNbLTFdKS5jb3VudChwYXJlbnQpID09IDEKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50LCBsaXN0KHBhcmVudHNbLTFdKS5pbmRleChwYXJlbnQpLCBwYXJlbnRzLCBOb25lCgogICAgcmV0dXJuIGxvY2FscygpCgpnZXRFVHJlZU1vZHVsZSA9IG1vZHVsZUZhY3RvcnlGYWN0b3J5KGdldEVUcmVlQnVpbGRlcikKUEsDBBQAAAAAAAAAIQCWDZxHpRgAAKUYAAA+AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWV3YWxrZXJzL2V0cmVlX2x4bWwucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHVuaWNvZGVfbGl0ZXJhbHMKZnJvbSBwaXAuX3ZlbmRvci5zaXggaW1wb3J0IHRleHRfdHlwZQoKZnJvbSBseG1sIGltcG9ydCBldHJlZQpmcm9tIC4udHJlZWJ1aWxkZXJzLmV0cmVlIGltcG9ydCB0YWdfcmVnZXhwCgpmcm9tIC4gaW1wb3J0IGJhc2UKCmZyb20gLi4gaW1wb3J0IF9paGF0ZXhtbAoKCmRlZiBlbnN1cmVfc3RyKHMpOgogICAgaWYgcyBpcyBOb25lOgogICAgICAgIHJldHVybiBOb25lCiAgICBlbGlmIGlzaW5zdGFuY2UocywgdGV4dF90eXBlKToKICAgICAgICByZXR1cm4gcwogICAgZWxzZToKICAgICAgICByZXR1cm4gcy5kZWNvZGUoImFzY2lpIiwgInN0cmljdCIpCgoKY2xhc3MgUm9vdChvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGV0KToKICAgICAgICBzZWxmLmVsZW1lbnR0cmVlID0gZXQKICAgICAgICBzZWxmLmNoaWxkcmVuID0gW10KCiAgICAgICAgdHJ5OgogICAgICAgICAgICBpZiBldC5kb2NpbmZvLmludGVybmFsRFREOgogICAgICAgICAgICAgICAgc2VsZi5jaGlsZHJlbi5hcHBlbmQoRG9jdHlwZShzZWxmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnN1cmVfc3RyKGV0LmRvY2luZm8ucm9vdF9uYW1lKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5zdXJlX3N0cihldC5kb2NpbmZvLnB1YmxpY19pZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuc3VyZV9zdHIoZXQuZG9jaW5mby5zeXN0ZW1fdXJsKSkpCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBwYXNzCgogICAgICAgIHRyeToKICAgICAgICAgICAgbm9kZSA9IGV0LmdldHJvb3QoKQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgbm9kZSA9IGV0CgogICAgICAgIHdoaWxlIG5vZGUuZ2V0cHJldmlvdXMoKSBpcyBub3QgTm9uZToKICAgICAgICAgICAgbm9kZSA9IG5vZGUuZ2V0cHJldmlvdXMoKQogICAgICAgIHdoaWxlIG5vZGUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYuY2hpbGRyZW4uYXBwZW5kKG5vZGUpCiAgICAgICAgICAgIG5vZGUgPSBub2RlLmdldG5leHQoKQoKICAgICAgICBzZWxmLnRleHQgPSBOb25lCiAgICAgICAgc2VsZi50YWlsID0gTm9uZQoKICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgogICAgICAgIHJldHVybiBzZWxmLmNoaWxkcmVuW2tleV0KCiAgICBkZWYgZ2V0bmV4dChzZWxmKToKICAgICAgICByZXR1cm4gTm9uZQoKICAgIGRlZiBfX2xlbl9fKHNlbGYpOgogICAgICAgIHJldHVybiAxCgoKY2xhc3MgRG9jdHlwZShvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHJvb3Rfbm9kZSwgbmFtZSwgcHVibGljX2lkLCBzeXN0ZW1faWQpOgogICAgICAgIHNlbGYucm9vdF9ub2RlID0gcm9vdF9ub2RlCiAgICAgICAgc2VsZi5uYW1lID0gbmFtZQogICAgICAgIHNlbGYucHVibGljX2lkID0gcHVibGljX2lkCiAgICAgICAgc2VsZi5zeXN0ZW1faWQgPSBzeXN0ZW1faWQKCiAgICAgICAgc2VsZi50ZXh0ID0gTm9uZQogICAgICAgIHNlbGYudGFpbCA9IE5vbmUKCiAgICBkZWYgZ2V0bmV4dChzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5yb290X25vZGUuY2hpbGRyZW5bMV0KCgpjbGFzcyBGcmFnbWVudFJvb3QoUm9vdCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgY2hpbGRyZW4pOgogICAgICAgIHNlbGYuY2hpbGRyZW4gPSBbRnJhZ21lbnRXcmFwcGVyKHNlbGYsIGNoaWxkKSBmb3IgY2hpbGQgaW4gY2hpbGRyZW5dCiAgICAgICAgc2VsZi50ZXh0ID0gc2VsZi50YWlsID0gTm9uZQoKICAgIGRlZiBnZXRuZXh0KHNlbGYpOgogICAgICAgIHJldHVybiBOb25lCgoKY2xhc3MgRnJhZ21lbnRXcmFwcGVyKG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgZnJhZ21lbnRfcm9vdCwgb2JqKToKICAgICAgICBzZWxmLnJvb3Rfbm9kZSA9IGZyYWdtZW50X3Jvb3QKICAgICAgICBzZWxmLm9iaiA9IG9iagogICAgICAgIGlmIGhhc2F0dHIoc2VsZi5vYmosICd0ZXh0Jyk6CiAgICAgICAgICAgIHNlbGYudGV4dCA9IGVuc3VyZV9zdHIoc2VsZi5vYmoudGV4dCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnRleHQgPSBOb25lCiAgICAgICAgaWYgaGFzYXR0cihzZWxmLm9iaiwgJ3RhaWwnKToKICAgICAgICAgICAgc2VsZi50YWlsID0gZW5zdXJlX3N0cihzZWxmLm9iai50YWlsKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudGFpbCA9IE5vbmUKCiAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6CiAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZi5vYmosIG5hbWUpCgogICAgZGVmIGdldG5leHQoc2VsZik6CiAgICAgICAgc2libGluZ3MgPSBzZWxmLnJvb3Rfbm9kZS5jaGlsZHJlbgogICAgICAgIGlkeCA9IHNpYmxpbmdzLmluZGV4KHNlbGYpCiAgICAgICAgaWYgaWR4IDwgbGVuKHNpYmxpbmdzKSAtIDE6CiAgICAgICAgICAgIHJldHVybiBzaWJsaW5nc1tpZHggKyAxXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CiAgICAgICAgcmV0dXJuIHNlbGYub2JqW2tleV0KCiAgICBkZWYgX19ib29sX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5vYmopCgogICAgZGVmIGdldHBhcmVudChzZWxmKToKICAgICAgICByZXR1cm4gTm9uZQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzdHIoc2VsZi5vYmopCgogICAgZGVmIF9fdW5pY29kZV9fKHNlbGYpOgogICAgICAgIHJldHVybiBzdHIoc2VsZi5vYmopCgogICAgZGVmIF9fbGVuX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGxlbihzZWxmLm9iaikKCgpjbGFzcyBUcmVlV2Fsa2VyKGJhc2UuTm9uUmVjdXJzaXZlVHJlZVdhbGtlcik6CiAgICBkZWYgX19pbml0X18oc2VsZiwgdHJlZSk6CiAgICAgICAgIyBweWxpbnQ6ZGlzYWJsZT1yZWRlZmluZWQtdmFyaWFibGUtdHlwZQogICAgICAgIGlmIGlzaW5zdGFuY2UodHJlZSwgbGlzdCk6CiAgICAgICAgICAgIHNlbGYuZnJhZ21lbnRDaGlsZHJlbiA9IHNldCh0cmVlKQogICAgICAgICAgICB0cmVlID0gRnJhZ21lbnRSb290KHRyZWUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5mcmFnbWVudENoaWxkcmVuID0gc2V0KCkKICAgICAgICAgICAgdHJlZSA9IFJvb3QodHJlZSkKICAgICAgICBiYXNlLk5vblJlY3Vyc2l2ZVRyZWVXYWxrZXIuX19pbml0X18oc2VsZiwgdHJlZSkKICAgICAgICBzZWxmLmZpbHRlciA9IF9paGF0ZXhtbC5JbmZvc2V0RmlsdGVyKCkKCiAgICBkZWYgZ2V0Tm9kZURldGFpbHMoc2VsZiwgbm9kZSk6CiAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLCB0dXBsZSk6ICAjIFRleHQgbm9kZQogICAgICAgICAgICBub2RlLCBrZXkgPSBub2RlCiAgICAgICAgICAgIGFzc2VydCBrZXkgaW4gKCJ0ZXh0IiwgInRhaWwiKSwgIlRleHQgbm9kZXMgYXJlIHRleHQgb3IgdGFpbCwgZm91bmQgJXMiICUga2V5CiAgICAgICAgICAgIHJldHVybiBiYXNlLlRFWFQsIGVuc3VyZV9zdHIoZ2V0YXR0cihub2RlLCBrZXkpKQoKICAgICAgICBlbGlmIGlzaW5zdGFuY2Uobm9kZSwgUm9vdCk6CiAgICAgICAgICAgIHJldHVybiAoYmFzZS5ET0NVTUVOVCwpCgogICAgICAgIGVsaWYgaXNpbnN0YW5jZShub2RlLCBEb2N0eXBlKToKICAgICAgICAgICAgcmV0dXJuIGJhc2UuRE9DVFlQRSwgbm9kZS5uYW1lLCBub2RlLnB1YmxpY19pZCwgbm9kZS5zeXN0ZW1faWQKCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKG5vZGUsIEZyYWdtZW50V3JhcHBlcikgYW5kIG5vdCBoYXNhdHRyKG5vZGUsICJ0YWciKToKICAgICAgICAgICAgcmV0dXJuIGJhc2UuVEVYVCwgZW5zdXJlX3N0cihub2RlLm9iaikKCiAgICAgICAgZWxpZiBub2RlLnRhZyA9PSBldHJlZS5Db21tZW50OgogICAgICAgICAgICByZXR1cm4gYmFzZS5DT01NRU5ULCBlbnN1cmVfc3RyKG5vZGUudGV4dCkKCiAgICAgICAgZWxpZiBub2RlLnRhZyA9PSBldHJlZS5FbnRpdHk6CiAgICAgICAgICAgIHJldHVybiBiYXNlLkVOVElUWSwgZW5zdXJlX3N0cihub2RlLnRleHQpWzE6LTFdICAjIHN0cmlwICY7CgogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgVGhpcyBpcyBhc3N1bWVkIHRvIGJlIGFuIG9yZGluYXJ5IGVsZW1lbnQKICAgICAgICAgICAgbWF0Y2ggPSB0YWdfcmVnZXhwLm1hdGNoKGVuc3VyZV9zdHIobm9kZS50YWcpKQogICAgICAgICAgICBpZiBtYXRjaDoKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSwgdGFnID0gbWF0Y2guZ3JvdXBzKCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IE5vbmUKICAgICAgICAgICAgICAgIHRhZyA9IGVuc3VyZV9zdHIobm9kZS50YWcpCiAgICAgICAgICAgIGF0dHJzID0ge30KICAgICAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIGxpc3Qobm9kZS5hdHRyaWIuaXRlbXMoKSk6CiAgICAgICAgICAgICAgICBuYW1lID0gZW5zdXJlX3N0cihuYW1lKQogICAgICAgICAgICAgICAgdmFsdWUgPSBlbnN1cmVfc3RyKHZhbHVlKQogICAgICAgICAgICAgICAgbWF0Y2ggPSB0YWdfcmVnZXhwLm1hdGNoKG5hbWUpCiAgICAgICAgICAgICAgICBpZiBtYXRjaDoKICAgICAgICAgICAgICAgICAgICBhdHRyc1sobWF0Y2guZ3JvdXAoMSksIG1hdGNoLmdyb3VwKDIpKV0gPSB2YWx1ZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBhdHRyc1soTm9uZSwgbmFtZSldID0gdmFsdWUKICAgICAgICAgICAgcmV0dXJuIChiYXNlLkVMRU1FTlQsIG5hbWVzcGFjZSwgc2VsZi5maWx0ZXIuZnJvbVhtbE5hbWUodGFnKSwKICAgICAgICAgICAgICAgICAgICBhdHRycywgbGVuKG5vZGUpID4gMCBvciBub2RlLnRleHQpCgogICAgZGVmIGdldEZpcnN0Q2hpbGQoc2VsZiwgbm9kZSk6CiAgICAgICAgYXNzZXJ0IG5vdCBpc2luc3RhbmNlKG5vZGUsIHR1cGxlKSwgIlRleHQgbm9kZXMgaGF2ZSBubyBjaGlsZHJlbiIKCiAgICAgICAgYXNzZXJ0IGxlbihub2RlKSBvciBub2RlLnRleHQsICJOb2RlIGhhcyBubyBjaGlsZHJlbiIKICAgICAgICBpZiBub2RlLnRleHQ6CiAgICAgICAgICAgIHJldHVybiAobm9kZSwgInRleHQiKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBub2RlWzBdCgogICAgZGVmIGdldE5leHRTaWJsaW5nKHNlbGYsIG5vZGUpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZSwgdHVwbGUpOiAgIyBUZXh0IG5vZGUKICAgICAgICAgICAgbm9kZSwga2V5ID0gbm9kZQogICAgICAgICAgICBhc3NlcnQga2V5IGluICgidGV4dCIsICJ0YWlsIiksICJUZXh0IG5vZGVzIGFyZSB0ZXh0IG9yIHRhaWwsIGZvdW5kICVzIiAlIGtleQogICAgICAgICAgICBpZiBrZXkgPT0gInRleHQiOgogICAgICAgICAgICAgICAgIyBYWFg6IHdlIGNhbm5vdCB1c2UgYSAiYm9vbChub2RlKSBhbmQgbm9kZVswXSBvciBOb25lIiBjb25zdHJ1Y3QgaGVyZQogICAgICAgICAgICAgICAgIyBiZWNhdXNlIG5vZGVbMF0gbWlnaHQgZXZhbHVhdGUgdG8gRmFsc2UgaWYgaXQgaGFzIG5vIGNoaWxkIGVsZW1lbnQKICAgICAgICAgICAgICAgIGlmIGxlbihub2RlKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9kZVswXQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgICAgICBlbHNlOiAgIyB0YWlsCiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS5nZXRuZXh0KCkKCiAgICAgICAgcmV0dXJuIChub2RlLCAidGFpbCIpIGlmIG5vZGUudGFpbCBlbHNlIG5vZGUuZ2V0bmV4dCgpCgogICAgZGVmIGdldFBhcmVudE5vZGUoc2VsZiwgbm9kZSk6CiAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLCB0dXBsZSk6ICAjIFRleHQgbm9kZQogICAgICAgICAgICBub2RlLCBrZXkgPSBub2RlCiAgICAgICAgICAgIGFzc2VydCBrZXkgaW4gKCJ0ZXh0IiwgInRhaWwiKSwgIlRleHQgbm9kZXMgYXJlIHRleHQgb3IgdGFpbCwgZm91bmQgJXMiICUga2V5CiAgICAgICAgICAgIGlmIGtleSA9PSAidGV4dCI6CiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZQogICAgICAgICAgICAjIGVsc2U6IGZhbGxiYWNrIHRvICJub3JtYWwiIHByb2Nlc3NpbmcKICAgICAgICBlbGlmIG5vZGUgaW4gc2VsZi5mcmFnbWVudENoaWxkcmVuOgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICByZXR1cm4gbm9kZS5nZXRwYXJlbnQoKQpQSwMEFAAAAAAAAAAhABNfbRAFCQAABQkAADoAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZXdhbGtlcnMvZ2Vuc2hpLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCB1bmljb2RlX2xpdGVyYWxzCgpmcm9tIGdlbnNoaS5jb3JlIGltcG9ydCBRTmFtZQpmcm9tIGdlbnNoaS5jb3JlIGltcG9ydCBTVEFSVCwgRU5ELCBYTUxfTkFNRVNQQUNFLCBET0NUWVBFLCBURVhUCmZyb20gZ2Vuc2hpLmNvcmUgaW1wb3J0IFNUQVJUX05TLCBFTkRfTlMsIFNUQVJUX0NEQVRBLCBFTkRfQ0RBVEEsIFBJLCBDT01NRU5UCgpmcm9tIC4gaW1wb3J0IGJhc2UKCmZyb20gLi5jb25zdGFudHMgaW1wb3J0IHZvaWRFbGVtZW50cywgbmFtZXNwYWNlcwoKCmNsYXNzIFRyZWVXYWxrZXIoYmFzZS5UcmVlV2Fsa2VyKToKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICAjIEJ1ZmZlciB0aGUgZXZlbnRzIHNvIHdlIGNhbiBwYXNzIGluIHRoZSBmb2xsb3dpbmcgb25lCiAgICAgICAgcHJldmlvdXMgPSBOb25lCiAgICAgICAgZm9yIGV2ZW50IGluIHNlbGYudHJlZToKICAgICAgICAgICAgaWYgcHJldmlvdXMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBmb3IgdG9rZW4gaW4gc2VsZi50b2tlbnMocHJldmlvdXMsIGV2ZW50KToKICAgICAgICAgICAgICAgICAgICB5aWVsZCB0b2tlbgogICAgICAgICAgICBwcmV2aW91cyA9IGV2ZW50CgogICAgICAgICMgRG9uJ3QgZm9yZ2V0IHRoZSBmaW5hbCBldmVudCEKICAgICAgICBpZiBwcmV2aW91cyBpcyBub3QgTm9uZToKICAgICAgICAgICAgZm9yIHRva2VuIGluIHNlbGYudG9rZW5zKHByZXZpb3VzLCBOb25lKToKICAgICAgICAgICAgICAgIHlpZWxkIHRva2VuCgogICAgZGVmIHRva2VucyhzZWxmLCBldmVudCwgbmV4dCk6CiAgICAgICAga2luZCwgZGF0YSwgXyA9IGV2ZW50CiAgICAgICAgaWYga2luZCA9PSBTVEFSVDoKICAgICAgICAgICAgdGFnLCBhdHRyaWJzID0gZGF0YQogICAgICAgICAgICBuYW1lID0gdGFnLmxvY2FsbmFtZQogICAgICAgICAgICBuYW1lc3BhY2UgPSB0YWcubmFtZXNwYWNlCiAgICAgICAgICAgIGNvbnZlcnRlZF9hdHRyaWJzID0ge30KICAgICAgICAgICAgZm9yIGssIHYgaW4gYXR0cmliczoKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoaywgUU5hbWUpOgogICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlZF9hdHRyaWJzWyhrLm5hbWVzcGFjZSwgay5sb2NhbG5hbWUpXSA9IHYKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgY29udmVydGVkX2F0dHJpYnNbKE5vbmUsIGspXSA9IHYKCiAgICAgICAgICAgIGlmIG5hbWVzcGFjZSA9PSBuYW1lc3BhY2VzWyJodG1sIl0gYW5kIG5hbWUgaW4gdm9pZEVsZW1lbnRzOgogICAgICAgICAgICAgICAgZm9yIHRva2VuIGluIHNlbGYuZW1wdHlUYWcobmFtZXNwYWNlLCBuYW1lLCBjb252ZXJ0ZWRfYXR0cmlicywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBuZXh0IG9yIG5leHRbMF0gIT0gRU5EIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0WzFdICE9IHRhZyk6CiAgICAgICAgICAgICAgICAgICAgeWllbGQgdG9rZW4KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYuc3RhcnRUYWcobmFtZXNwYWNlLCBuYW1lLCBjb252ZXJ0ZWRfYXR0cmlicykKCiAgICAgICAgZWxpZiBraW5kID09IEVORDoKICAgICAgICAgICAgbmFtZSA9IGRhdGEubG9jYWxuYW1lCiAgICAgICAgICAgIG5hbWVzcGFjZSA9IGRhdGEubmFtZXNwYWNlCiAgICAgICAgICAgIGlmIG5hbWVzcGFjZSAhPSBuYW1lc3BhY2VzWyJodG1sIl0gb3IgbmFtZSBub3QgaW4gdm9pZEVsZW1lbnRzOgogICAgICAgICAgICAgICAgeWllbGQgc2VsZi5lbmRUYWcobmFtZXNwYWNlLCBuYW1lKQoKICAgICAgICBlbGlmIGtpbmQgPT0gQ09NTUVOVDoKICAgICAgICAgICAgeWllbGQgc2VsZi5jb21tZW50KGRhdGEpCgogICAgICAgIGVsaWYga2luZCA9PSBURVhUOgogICAgICAgICAgICBmb3IgdG9rZW4gaW4gc2VsZi50ZXh0KGRhdGEpOgogICAgICAgICAgICAgICAgeWllbGQgdG9rZW4KCiAgICAgICAgZWxpZiBraW5kID09IERPQ1RZUEU6CiAgICAgICAgICAgIHlpZWxkIHNlbGYuZG9jdHlwZSgqZGF0YSkKCiAgICAgICAgZWxpZiBraW5kIGluIChYTUxfTkFNRVNQQUNFLCBET0NUWVBFLCBTVEFSVF9OUywgRU5EX05TLAogICAgICAgICAgICAgICAgICAgICAgU1RBUlRfQ0RBVEEsIEVORF9DREFUQSwgUEkpOgogICAgICAgICAgICBwYXNzCgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHlpZWxkIHNlbGYudW5rbm93bihraW5kKQpQSwMEFAAAAAAAAAAhAABHXJs6AAAAOgAAACwAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaWRuYS9fX2luaXRfXy5weWZyb20gLnBhY2thZ2VfZGF0YSBpbXBvcnQgX192ZXJzaW9uX18KZnJvbSAuY29yZSBpbXBvcnQgKgpQSwMEFAAAAAAAAAAhAPNI1OnjDAAA4wwAACkAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaWRuYS9jb2RlYy5weWZyb20gLmNvcmUgaW1wb3J0IGVuY29kZSwgZGVjb2RlLCBhbGFiZWwsIHVsYWJlbCwgSUROQUVycm9yCmltcG9ydCBjb2RlY3MKaW1wb3J0IHJlCgpfdW5pY29kZV9kb3RzX3JlID0gcmUuY29tcGlsZSh1J1tcdTAwMmVcdTMwMDJcdWZmMGVcdWZmNjFdJykKCmNsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CgogICAgZGVmIGVuY29kZShzZWxmLCBkYXRhLCBlcnJvcnM9J3N0cmljdCcpOgoKICAgICAgICBpZiBlcnJvcnMgIT0gJ3N0cmljdCc6CiAgICAgICAgICAgIHJhaXNlIElETkFFcnJvcigiVW5zdXBwb3J0ZWQgZXJyb3IgaGFuZGxpbmcgXCJ7MH1cIiIuZm9ybWF0KGVycm9ycykpCgogICAgICAgIGlmIG5vdCBkYXRhOgogICAgICAgICAgICByZXR1cm4gIiIsIDAKCiAgICAgICAgcmV0dXJuIGVuY29kZShkYXRhKSwgbGVuKGRhdGEpCgogICAgZGVmIGRlY29kZShzZWxmLCBkYXRhLCBlcnJvcnM9J3N0cmljdCcpOgoKICAgICAgICBpZiBlcnJvcnMgIT0gJ3N0cmljdCc6CiAgICAgICAgICAgIHJhaXNlIElETkFFcnJvcigiVW5zdXBwb3J0ZWQgZXJyb3IgaGFuZGxpbmcgXCJ7MH1cIiIuZm9ybWF0KGVycm9ycykpCgogICAgICAgIGlmIG5vdCBkYXRhOgogICAgICAgICAgICByZXR1cm4gdSIiLCAwCgogICAgICAgIHJldHVybiBkZWNvZGUoZGF0YSksIGxlbihkYXRhKQoKY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5CdWZmZXJlZEluY3JlbWVudGFsRW5jb2Rlcik6CiAgICBkZWYgX2J1ZmZlcl9lbmNvZGUoc2VsZiwgZGF0YSwgZXJyb3JzLCBmaW5hbCk6CiAgICAgICAgaWYgZXJyb3JzICE9ICdzdHJpY3QnOgogICAgICAgICAgICByYWlzZSBJRE5BRXJyb3IoIlVuc3VwcG9ydGVkIGVycm9yIGhhbmRsaW5nIFwiezB9XCIiLmZvcm1hdChlcnJvcnMpKQoKICAgICAgICBpZiBub3QgZGF0YToKICAgICAgICAgICAgcmV0dXJuICgiIiwgMCkKCiAgICAgICAgbGFiZWxzID0gX3VuaWNvZGVfZG90c19yZS5zcGxpdChkYXRhKQogICAgICAgIHRyYWlsaW5nX2RvdCA9IHUnJwogICAgICAgIGlmIGxhYmVsczoKICAgICAgICAgICAgaWYgbm90IGxhYmVsc1stMV06CiAgICAgICAgICAgICAgICB0cmFpbGluZ19kb3QgPSAnLicKICAgICAgICAgICAgICAgIGRlbCBsYWJlbHNbLTFdCiAgICAgICAgICAgIGVsaWYgbm90IGZpbmFsOgogICAgICAgICAgICAgICAgIyBLZWVwIHBvdGVudGlhbGx5IHVuZmluaXNoZWQgbGFiZWwgdW50aWwgdGhlIG5leHQgY2FsbAogICAgICAgICAgICAgICAgZGVsIGxhYmVsc1stMV0KICAgICAgICAgICAgICAgIGlmIGxhYmVsczoKICAgICAgICAgICAgICAgICAgICB0cmFpbGluZ19kb3QgPSAnLicKCiAgICAgICAgcmVzdWx0ID0gW10KICAgICAgICBzaXplID0gMAogICAgICAgIGZvciBsYWJlbCBpbiBsYWJlbHM6CiAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYWxhYmVsKGxhYmVsKSkKICAgICAgICAgICAgaWYgc2l6ZToKICAgICAgICAgICAgICAgIHNpemUgKz0gMQogICAgICAgICAgICBzaXplICs9IGxlbihsYWJlbCkKCiAgICAgICAgIyBKb2luIHdpdGggVSswMDJFCiAgICAgICAgcmVzdWx0ID0gIi4iLmpvaW4ocmVzdWx0KSArIHRyYWlsaW5nX2RvdAogICAgICAgIHNpemUgKz0gbGVuKHRyYWlsaW5nX2RvdCkKICAgICAgICByZXR1cm4gKHJlc3VsdCwgc2l6ZSkKCmNsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuQnVmZmVyZWRJbmNyZW1lbnRhbERlY29kZXIpOgogICAgZGVmIF9idWZmZXJfZGVjb2RlKHNlbGYsIGRhdGEsIGVycm9ycywgZmluYWwpOgogICAgICAgIGlmIGVycm9ycyAhPSAnc3RyaWN0JzoKICAgICAgICAgICAgcmFpc2UgSUROQUVycm9yKCJVbnN1cHBvcnRlZCBlcnJvciBoYW5kbGluZyBcInswfVwiIi5mb3JtYXQoZXJyb3JzKSkKCiAgICAgICAgaWYgbm90IGRhdGE6CiAgICAgICAgICAgIHJldHVybiAodSIiLCAwKQoKICAgICAgICAjIElETkEgYWxsb3dzIGRlY29kaW5nIHRvIG9wZXJhdGUgb24gVW5pY29kZSBzdHJpbmdzLCB0b28uCiAgICAgICAgaWYgaXNpbnN0YW5jZShkYXRhLCB1bmljb2RlKToKICAgICAgICAgICAgbGFiZWxzID0gX3VuaWNvZGVfZG90c19yZS5zcGxpdChkYXRhKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgTXVzdCBiZSBBU0NJSSBzdHJpbmcKICAgICAgICAgICAgZGF0YSA9IHN0cihkYXRhKQogICAgICAgICAgICB1bmljb2RlKGRhdGEsICJhc2NpaSIpCiAgICAgICAgICAgIGxhYmVscyA9IGRhdGEuc3BsaXQoIi4iKQoKICAgICAgICB0cmFpbGluZ19kb3QgPSB1JycKICAgICAgICBpZiBsYWJlbHM6CiAgICAgICAgICAgIGlmIG5vdCBsYWJlbHNbLTFdOgogICAgICAgICAgICAgICAgdHJhaWxpbmdfZG90ID0gdScuJwogICAgICAgICAgICAgICAgZGVsIGxhYmVsc1stMV0KICAgICAgICAgICAgZWxpZiBub3QgZmluYWw6CiAgICAgICAgICAgICAgICAjIEtlZXAgcG90ZW50aWFsbHkgdW5maW5pc2hlZCBsYWJlbCB1bnRpbCB0aGUgbmV4dCBjYWxsCiAgICAgICAgICAgICAgICBkZWwgbGFiZWxzWy0xXQogICAgICAgICAgICAgICAgaWYgbGFiZWxzOgogICAgICAgICAgICAgICAgICAgIHRyYWlsaW5nX2RvdCA9IHUnLicKCiAgICAgICAgcmVzdWx0ID0gW10KICAgICAgICBzaXplID0gMAogICAgICAgIGZvciBsYWJlbCBpbiBsYWJlbHM6CiAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQodWxhYmVsKGxhYmVsKSkKICAgICAgICAgICAgaWYgc2l6ZToKICAgICAgICAgICAgICAgIHNpemUgKz0gMQogICAgICAgICAgICBzaXplICs9IGxlbihsYWJlbCkKCiAgICAgICAgcmVzdWx0ID0gdSIuIi5qb2luKHJlc3VsdCkgKyB0cmFpbGluZ19kb3QKICAgICAgICBzaXplICs9IGxlbih0cmFpbGluZ19kb3QpCiAgICAgICAgcmV0dXJuIChyZXN1bHQsIHNpemUpCgoKY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKICAgIHBhc3MKCmNsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgY29kZWNzLlN0cmVhbVJlYWRlcik6CiAgICBwYXNzCgpkZWYgZ2V0cmVnZW50cnkoKToKICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAogICAgICAgIG5hbWU9J2lkbmEnLAogICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCiAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAogICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCiAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKICAgICkKUEsDBBQAAAAAAAAAIQB8gZZw6AAAAOgAAAAqAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2lkbmEvY29tcGF0LnB5ZnJvbSAuY29yZSBpbXBvcnQgKgpmcm9tIC5jb2RlYyBpbXBvcnQgKgoKZGVmIFRvQVNDSUkobGFiZWwpOgogICAgcmV0dXJuIGVuY29kZShsYWJlbCkKCmRlZiBUb1VuaWNvZGUobGFiZWwpOgogICAgcmV0dXJuIGRlY29kZShsYWJlbCkKCmRlZiBuYW1lcHJlcChzKToKICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoIklETkEgMjAwOCBkb2VzIG5vdCB1dGlsaXNlIG5hbWVwcmVwIHByb3RvY29sIikKClBLAwQUAAAAAAAAACEACS76cX4sAAB+LAAAKAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9pZG5hL2NvcmUucHlmcm9tIC4gaW1wb3J0IGlkbmFkYXRhCmltcG9ydCBiaXNlY3QKaW1wb3J0IHVuaWNvZGVkYXRhCmltcG9ydCByZQppbXBvcnQgc3lzCmZyb20gLmludHJhbmdlcyBpbXBvcnQgaW50cmFuZ2VzX2NvbnRhaW4KCl92aXJhbWFfY29tYmluaW5nX2NsYXNzID0gOQpfYWxhYmVsX3ByZWZpeCA9IGIneG4tLScKX3VuaWNvZGVfZG90c19yZSA9IHJlLmNvbXBpbGUodSdbXHUwMDJlXHUzMDAyXHVmZjBlXHVmZjYxXScpCgppZiBzeXMudmVyc2lvbl9pbmZvWzBdID09IDM6CiAgICB1bmljb2RlID0gc3RyCiAgICB1bmljaHIgPSBjaHIKCmNsYXNzIElETkFFcnJvcihVbmljb2RlRXJyb3IpOgogICAgIiIiIEJhc2UgZXhjZXB0aW9uIGZvciBhbGwgSUROQS1lbmNvZGluZyByZWxhdGVkIHByb2JsZW1zICIiIgogICAgcGFzcwoKCmNsYXNzIElETkFCaWRpRXJyb3IoSUROQUVycm9yKToKICAgICIiIiBFeGNlcHRpb24gd2hlbiBiaWRpcmVjdGlvbmFsIHJlcXVpcmVtZW50cyBhcmUgbm90IHNhdGlzZmllZCAiIiIKICAgIHBhc3MKCgpjbGFzcyBJbnZhbGlkQ29kZXBvaW50KElETkFFcnJvcik6CiAgICAiIiIgRXhjZXB0aW9uIHdoZW4gYSBkaXNhbGxvd2VkIG9yIHVuYWxsb2NhdGVkIGNvZGVwb2ludCBpcyB1c2VkICIiIgogICAgcGFzcwoKCmNsYXNzIEludmFsaWRDb2RlcG9pbnRDb250ZXh0KElETkFFcnJvcik6CiAgICAiIiIgRXhjZXB0aW9uIHdoZW4gdGhlIGNvZGVwb2ludCBpcyBub3QgdmFsaWQgaW4gdGhlIGNvbnRleHQgaXQgaXMgdXNlZCAiIiIKICAgIHBhc3MKCgpkZWYgX2NvbWJpbmluZ19jbGFzcyhjcCk6CiAgICByZXR1cm4gdW5pY29kZWRhdGEuY29tYmluaW5nKHVuaWNocihjcCkpCgpkZWYgX2lzX3NjcmlwdChjcCwgc2NyaXB0KToKICAgIHJldHVybiBpbnRyYW5nZXNfY29udGFpbihvcmQoY3ApLCBpZG5hZGF0YS5zY3JpcHRzW3NjcmlwdF0pCgpkZWYgX3B1bnljb2RlKHMpOgogICAgcmV0dXJuIHMuZW5jb2RlKCdwdW55Y29kZScpCgpkZWYgX3Vub3Qocyk6CiAgICByZXR1cm4gJ1UrezA6MDRYfScuZm9ybWF0KHMpCgoKZGVmIHZhbGlkX2xhYmVsX2xlbmd0aChsYWJlbCk6CgogICAgaWYgbGVuKGxhYmVsKSA+IDYzOgogICAgICAgIHJldHVybiBGYWxzZQogICAgcmV0dXJuIFRydWUKCgpkZWYgdmFsaWRfc3RyaW5nX2xlbmd0aChsYWJlbCwgdHJhaWxpbmdfZG90KToKCiAgICBpZiBsZW4obGFiZWwpID4gKDI1NCBpZiB0cmFpbGluZ19kb3QgZWxzZSAyNTMpOgogICAgICAgIHJldHVybiBGYWxzZQogICAgcmV0dXJuIFRydWUKCgpkZWYgY2hlY2tfYmlkaShsYWJlbCwgY2hlY2tfbHRyPUZhbHNlKToKCiAgICAjIEJpZGkgcnVsZXMgc2hvdWxkIG9ubHkgYmUgYXBwbGllZCBpZiBzdHJpbmcgY29udGFpbnMgUlRMIGNoYXJhY3RlcnMKICAgIGJpZGlfbGFiZWwgPSBGYWxzZQogICAgZm9yIChpZHgsIGNwKSBpbiBlbnVtZXJhdGUobGFiZWwsIDEpOgogICAgICAgIGRpcmVjdGlvbiA9IHVuaWNvZGVkYXRhLmJpZGlyZWN0aW9uYWwoY3ApCiAgICAgICAgaWYgZGlyZWN0aW9uID09ICcnOgogICAgICAgICAgICAjIFN0cmluZyBsaWtlbHkgY29tZXMgZnJvbSBhIG5ld2VyIHZlcnNpb24gb2YgVW5pY29kZQogICAgICAgICAgICByYWlzZSBJRE5BQmlkaUVycm9yKCdVbmtub3duIGRpcmVjdGlvbmFsaXR5IGluIGxhYmVsIHswfSBhdCBwb3NpdGlvbiB7MX0nLmZvcm1hdChyZXByKGxhYmVsKSwgaWR4KSkKICAgICAgICBpZiBkaXJlY3Rpb24gaW4gWydSJywgJ0FMJywgJ0FOJ106CiAgICAgICAgICAgIGJpZGlfbGFiZWwgPSBUcnVlCiAgICAgICAgICAgIGJyZWFrCiAgICBpZiBub3QgYmlkaV9sYWJlbCBhbmQgbm90IGNoZWNrX2x0cjoKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICMgQmlkaSBydWxlIDEKICAgIGRpcmVjdGlvbiA9IHVuaWNvZGVkYXRhLmJpZGlyZWN0aW9uYWwobGFiZWxbMF0pCiAgICBpZiBkaXJlY3Rpb24gaW4gWydSJywgJ0FMJ106CiAgICAgICAgcnRsID0gVHJ1ZQogICAgZWxpZiBkaXJlY3Rpb24gPT0gJ0wnOgogICAgICAgIHJ0bCA9IEZhbHNlCiAgICBlbHNlOgogICAgICAgIHJhaXNlIElETkFCaWRpRXJyb3IoJ0ZpcnN0IGNvZGVwb2ludCBpbiBsYWJlbCB7MH0gbXVzdCBiZSBkaXJlY3Rpb25hbGl0eSBMLCBSIG9yIEFMJy5mb3JtYXQocmVwcihsYWJlbCkpKQoKICAgIHZhbGlkX2VuZGluZyA9IEZhbHNlCiAgICBudW1iZXJfdHlwZSA9IEZhbHNlCiAgICBmb3IgKGlkeCwgY3ApIGluIGVudW1lcmF0ZShsYWJlbCwgMSk6CiAgICAgICAgZGlyZWN0aW9uID0gdW5pY29kZWRhdGEuYmlkaXJlY3Rpb25hbChjcCkKCiAgICAgICAgaWYgcnRsOgogICAgICAgICAgICAjIEJpZGkgcnVsZSAyCiAgICAgICAgICAgIGlmIG5vdCBkaXJlY3Rpb24gaW4gWydSJywgJ0FMJywgJ0FOJywgJ0VOJywgJ0VTJywgJ0NTJywgJ0VUJywgJ09OJywgJ0JOJywgJ05TTSddOgogICAgICAgICAgICAgICAgcmFpc2UgSUROQUJpZGlFcnJvcignSW52YWxpZCBkaXJlY3Rpb24gZm9yIGNvZGVwb2ludCBhdCBwb3NpdGlvbiB7MH0gaW4gYSByaWdodC10by1sZWZ0IGxhYmVsJy5mb3JtYXQoaWR4KSkKICAgICAgICAgICAgIyBCaWRpIHJ1bGUgMwogICAgICAgICAgICBpZiBkaXJlY3Rpb24gaW4gWydSJywgJ0FMJywgJ0VOJywgJ0FOJ106CiAgICAgICAgICAgICAgICB2YWxpZF9lbmRpbmcgPSBUcnVlCiAgICAgICAgICAgIGVsaWYgZGlyZWN0aW9uICE9ICdOU00nOgogICAgICAgICAgICAgICAgdmFsaWRfZW5kaW5nID0gRmFsc2UKICAgICAgICAgICAgIyBCaWRpIHJ1bGUgNAogICAgICAgICAgICBpZiBkaXJlY3Rpb24gaW4gWydBTicsICdFTiddOgogICAgICAgICAgICAgICAgaWYgbm90IG51bWJlcl90eXBlOgogICAgICAgICAgICAgICAgICAgIG51bWJlcl90eXBlID0gZGlyZWN0aW9uCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGlmIG51bWJlcl90eXBlICE9IGRpcmVjdGlvbjoKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgSUROQUJpZGlFcnJvcignQ2FuIG5vdCBtaXggbnVtZXJhbCB0eXBlcyBpbiBhIHJpZ2h0LXRvLWxlZnQgbGFiZWwnKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgQmlkaSBydWxlIDUKICAgICAgICAgICAgaWYgbm90IGRpcmVjdGlvbiBpbiBbJ0wnLCAnRU4nLCAnRVMnLCAnQ1MnLCAnRVQnLCAnT04nLCAnQk4nLCAnTlNNJ106CiAgICAgICAgICAgICAgICByYWlzZSBJRE5BQmlkaUVycm9yKCdJbnZhbGlkIGRpcmVjdGlvbiBmb3IgY29kZXBvaW50IGF0IHBvc2l0aW9uIHswfSBpbiBhIGxlZnQtdG8tcmlnaHQgbGFiZWwnLmZvcm1hdChpZHgpKQogICAgICAgICAgICAjIEJpZGkgcnVsZSA2CiAgICAgICAgICAgIGlmIGRpcmVjdGlvbiBpbiBbJ0wnLCAnRU4nXToKICAgICAgICAgICAgICAgIHZhbGlkX2VuZGluZyA9IFRydWUKICAgICAgICAgICAgZWxpZiBkaXJlY3Rpb24gIT0gJ05TTSc6CiAgICAgICAgICAgICAgICB2YWxpZF9lbmRpbmcgPSBGYWxzZQoKICAgIGlmIG5vdCB2YWxpZF9lbmRpbmc6CiAgICAgICAgcmFpc2UgSUROQUJpZGlFcnJvcignTGFiZWwgZW5kcyB3aXRoIGlsbGVnYWwgY29kZXBvaW50IGRpcmVjdGlvbmFsaXR5JykKCiAgICByZXR1cm4gVHJ1ZQoKCmRlZiBjaGVja19pbml0aWFsX2NvbWJpbmVyKGxhYmVsKToKCiAgICBpZiB1bmljb2RlZGF0YS5jYXRlZ29yeShsYWJlbFswXSlbMF0gPT0gJ00nOgogICAgICAgIHJhaXNlIElETkFFcnJvcignTGFiZWwgYmVnaW5zIHdpdGggYW4gaWxsZWdhbCBjb21iaW5pbmcgY2hhcmFjdGVyJykKICAgIHJldHVybiBUcnVlCgoKZGVmIGNoZWNrX2h5cGhlbl9vayhsYWJlbCk6CgogICAgaWYgbGFiZWxbMjo0XSA9PSAnLS0nOgogICAgICAgIHJhaXNlIElETkFFcnJvcignTGFiZWwgaGFzIGRpc2FsbG93ZWQgaHlwaGVucyBpbiAzcmQgYW5kIDR0aCBwb3NpdGlvbicpCiAgICBpZiBsYWJlbFswXSA9PSAnLScgb3IgbGFiZWxbLTFdID09ICctJzoKICAgICAgICByYWlzZSBJRE5BRXJyb3IoJ0xhYmVsIG11c3Qgbm90IHN0YXJ0IG9yIGVuZCB3aXRoIGEgaHlwaGVuJykKICAgIHJldHVybiBUcnVlCgoKZGVmIGNoZWNrX25mYyhsYWJlbCk6CgogICAgaWYgdW5pY29kZWRhdGEubm9ybWFsaXplKCdORkMnLCBsYWJlbCkgIT0gbGFiZWw6CiAgICAgICAgcmFpc2UgSUROQUVycm9yKCdMYWJlbCBtdXN0IGJlIGluIE5vcm1hbGl6YXRpb24gRm9ybSBDJykKCgpkZWYgdmFsaWRfY29udGV4dGoobGFiZWwsIHBvcyk6CgogICAgY3BfdmFsdWUgPSBvcmQobGFiZWxbcG9zXSkKCiAgICBpZiBjcF92YWx1ZSA9PSAweDIwMGM6CgogICAgICAgIGlmIHBvcyA+IDA6CiAgICAgICAgICAgIGlmIF9jb21iaW5pbmdfY2xhc3Mob3JkKGxhYmVsW3BvcyAtIDFdKSkgPT0gX3ZpcmFtYV9jb21iaW5pbmdfY2xhc3M6CiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICBvayA9IEZhbHNlCiAgICAgICAgZm9yIGkgaW4gcmFuZ2UocG9zLTEsIC0xLCAtMSk6CiAgICAgICAgICAgIGpvaW5pbmdfdHlwZSA9IGlkbmFkYXRhLmpvaW5pbmdfdHlwZXMuZ2V0KG9yZChsYWJlbFtpXSkpCiAgICAgICAgICAgIGlmIGpvaW5pbmdfdHlwZSA9PSBvcmQoJ1QnKToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIGpvaW5pbmdfdHlwZSBpbiBbb3JkKCdMJyksIG9yZCgnRCcpXToKICAgICAgICAgICAgICAgIG9rID0gVHJ1ZQogICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgaWYgbm90IG9rOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgb2sgPSBGYWxzZQogICAgICAgIGZvciBpIGluIHJhbmdlKHBvcysxLCBsZW4obGFiZWwpKToKICAgICAgICAgICAgam9pbmluZ190eXBlID0gaWRuYWRhdGEuam9pbmluZ190eXBlcy5nZXQob3JkKGxhYmVsW2ldKSkKICAgICAgICAgICAgaWYgam9pbmluZ190eXBlID09IG9yZCgnVCcpOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgam9pbmluZ190eXBlIGluIFtvcmQoJ1InKSwgb3JkKCdEJyldOgogICAgICAgICAgICAgICAgb2sgPSBUcnVlCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIHJldHVybiBvawoKICAgIGlmIGNwX3ZhbHVlID09IDB4MjAwZDoKCiAgICAgICAgaWYgcG9zID4gMDoKICAgICAgICAgICAgaWYgX2NvbWJpbmluZ19jbGFzcyhvcmQobGFiZWxbcG9zIC0gMV0pKSA9PSBfdmlyYW1hX2NvbWJpbmluZ19jbGFzczoKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZWxzZToKCiAgICAgICAgcmV0dXJuIEZhbHNlCgoKZGVmIHZhbGlkX2NvbnRleHRvKGxhYmVsLCBwb3MsIGV4Y2VwdGlvbj1GYWxzZSk6CgogICAgY3BfdmFsdWUgPSBvcmQobGFiZWxbcG9zXSkKCiAgICBpZiBjcF92YWx1ZSA9PSAweDAwYjc6CiAgICAgICAgaWYgMCA8IHBvcyA8IGxlbihsYWJlbCktMToKICAgICAgICAgICAgaWYgb3JkKGxhYmVsW3BvcyAtIDFdKSA9PSAweDAwNmMgYW5kIG9yZChsYWJlbFtwb3MgKyAxXSkgPT0gMHgwMDZjOgogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBlbGlmIGNwX3ZhbHVlID09IDB4MDM3NToKICAgICAgICBpZiBwb3MgPCBsZW4obGFiZWwpLTEgYW5kIGxlbihsYWJlbCkgPiAxOgogICAgICAgICAgICByZXR1cm4gX2lzX3NjcmlwdChsYWJlbFtwb3MgKyAxXSwgJ0dyZWVrJykKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBlbGlmIGNwX3ZhbHVlID09IDB4MDVmMyBvciBjcF92YWx1ZSA9PSAweDA1ZjQ6CiAgICAgICAgaWYgcG9zID4gMDoKICAgICAgICAgICAgcmV0dXJuIF9pc19zY3JpcHQobGFiZWxbcG9zIC0gMV0sICdIZWJyZXcnKQogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGVsaWYgY3BfdmFsdWUgPT0gMHgzMGZiOgogICAgICAgIGZvciBjcCBpbiBsYWJlbDoKICAgICAgICAgICAgaWYgY3AgPT0gdSdcdTMwZmInOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgX2lzX3NjcmlwdChjcCwgJ0hpcmFnYW5hJykgb3IgX2lzX3NjcmlwdChjcCwgJ0thdGFrYW5hJykgb3IgX2lzX3NjcmlwdChjcCwgJ0hhbicpOgogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBlbGlmIDB4NjYwIDw9IGNwX3ZhbHVlIDw9IDB4NjY5OgogICAgICAgIGZvciBjcCBpbiBsYWJlbDoKICAgICAgICAgICAgaWYgMHg2ZjAgPD0gb3JkKGNwKSA8PSAweDA2Zjk6CiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGVsaWYgMHg2ZjAgPD0gY3BfdmFsdWUgPD0gMHg2Zjk6CiAgICAgICAgZm9yIGNwIGluIGxhYmVsOgogICAgICAgICAgICBpZiAweDY2MCA8PSBvcmQoY3ApIDw9IDB4MDY2OToKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIHJldHVybiBUcnVlCgoKZGVmIGNoZWNrX2xhYmVsKGxhYmVsKToKCiAgICBpZiBpc2luc3RhbmNlKGxhYmVsLCAoYnl0ZXMsIGJ5dGVhcnJheSkpOgogICAgICAgIGxhYmVsID0gbGFiZWwuZGVjb2RlKCd1dGYtOCcpCiAgICBpZiBsZW4obGFiZWwpID09IDA6CiAgICAgICAgcmFpc2UgSUROQUVycm9yKCdFbXB0eSBMYWJlbCcpCgogICAgY2hlY2tfbmZjKGxhYmVsKQogICAgY2hlY2tfaHlwaGVuX29rKGxhYmVsKQogICAgY2hlY2tfaW5pdGlhbF9jb21iaW5lcihsYWJlbCkKCiAgICBmb3IgKHBvcywgY3ApIGluIGVudW1lcmF0ZShsYWJlbCk6CiAgICAgICAgY3BfdmFsdWUgPSBvcmQoY3ApCiAgICAgICAgaWYgaW50cmFuZ2VzX2NvbnRhaW4oY3BfdmFsdWUsIGlkbmFkYXRhLmNvZGVwb2ludF9jbGFzc2VzWydQVkFMSUQnXSk6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgZWxpZiBpbnRyYW5nZXNfY29udGFpbihjcF92YWx1ZSwgaWRuYWRhdGEuY29kZXBvaW50X2NsYXNzZXNbJ0NPTlRFWFRKJ10pOgogICAgICAgICAgICBpZiBub3QgdmFsaWRfY29udGV4dGoobGFiZWwsIHBvcyk6CiAgICAgICAgICAgICAgICByYWlzZSBJbnZhbGlkQ29kZXBvaW50Q29udGV4dCgnSm9pbmVyIHswfSBub3QgYWxsb3dlZCBhdCBwb3NpdGlvbiB7MX0gaW4gezJ9Jy5mb3JtYXQoX3Vub3QoY3BfdmFsdWUpLCBwb3MrMSwgcmVwcihsYWJlbCkpKQogICAgICAgIGVsaWYgaW50cmFuZ2VzX2NvbnRhaW4oY3BfdmFsdWUsIGlkbmFkYXRhLmNvZGVwb2ludF9jbGFzc2VzWydDT05URVhUTyddKToKICAgICAgICAgICAgaWYgbm90IHZhbGlkX2NvbnRleHRvKGxhYmVsLCBwb3MpOgogICAgICAgICAgICAgICAgcmFpc2UgSW52YWxpZENvZGVwb2ludENvbnRleHQoJ0NvZGVwb2ludCB7MH0gbm90IGFsbG93ZWQgYXQgcG9zaXRpb24gezF9IGluIHsyfScuZm9ybWF0KF91bm90KGNwX3ZhbHVlKSwgcG9zKzEsIHJlcHIobGFiZWwpKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBJbnZhbGlkQ29kZXBvaW50KCdDb2RlcG9pbnQgezB9IGF0IHBvc2l0aW9uIHsxfSBvZiB7Mn0gbm90IGFsbG93ZWQnLmZvcm1hdChfdW5vdChjcF92YWx1ZSksIHBvcysxLCByZXByKGxhYmVsKSkpCgogICAgY2hlY2tfYmlkaShsYWJlbCkKCgpkZWYgYWxhYmVsKGxhYmVsKToKCiAgICB0cnk6CiAgICAgICAgbGFiZWwgPSBsYWJlbC5lbmNvZGUoJ2FzY2lpJykKICAgICAgICB0cnk6CiAgICAgICAgICAgIHVsYWJlbChsYWJlbCkKICAgICAgICBleGNlcHQgSUROQUVycm9yOgogICAgICAgICAgICByYWlzZSBJRE5BRXJyb3IoJ1RoZSBsYWJlbCB7MH0gaXMgbm90IGEgdmFsaWQgQS1sYWJlbCcuZm9ybWF0KGxhYmVsKSkKICAgICAgICBpZiBub3QgdmFsaWRfbGFiZWxfbGVuZ3RoKGxhYmVsKToKICAgICAgICAgICAgcmFpc2UgSUROQUVycm9yKCdMYWJlbCB0b28gbG9uZycpCiAgICAgICAgcmV0dXJuIGxhYmVsCiAgICBleGNlcHQgVW5pY29kZUVuY29kZUVycm9yOgogICAgICAgIHBhc3MKCiAgICBpZiBub3QgbGFiZWw6CiAgICAgICAgcmFpc2UgSUROQUVycm9yKCdObyBJbnB1dCcpCgogICAgbGFiZWwgPSB1bmljb2RlKGxhYmVsKQogICAgY2hlY2tfbGFiZWwobGFiZWwpCiAgICBsYWJlbCA9IF9wdW55Y29kZShsYWJlbCkKICAgIGxhYmVsID0gX2FsYWJlbF9wcmVmaXggKyBsYWJlbAoKICAgIGlmIG5vdCB2YWxpZF9sYWJlbF9sZW5ndGgobGFiZWwpOgogICAgICAgIHJhaXNlIElETkFFcnJvcignTGFiZWwgdG9vIGxvbmcnKQoKICAgIHJldHVybiBsYWJlbAoKCmRlZiB1bGFiZWwobGFiZWwpOgoKICAgIGlmIG5vdCBpc2luc3RhbmNlKGxhYmVsLCAoYnl0ZXMsIGJ5dGVhcnJheSkpOgogICAgICAgIHRyeToKICAgICAgICAgICAgbGFiZWwgPSBsYWJlbC5lbmNvZGUoJ2FzY2lpJykKICAgICAgICBleGNlcHQgVW5pY29kZUVuY29kZUVycm9yOgogICAgICAgICAgICBjaGVja19sYWJlbChsYWJlbCkKICAgICAgICAgICAgcmV0dXJuIGxhYmVsCgogICAgbGFiZWwgPSBsYWJlbC5sb3dlcigpCiAgICBpZiBsYWJlbC5zdGFydHN3aXRoKF9hbGFiZWxfcHJlZml4KToKICAgICAgICBsYWJlbCA9IGxhYmVsW2xlbihfYWxhYmVsX3ByZWZpeCk6XQogICAgZWxzZToKICAgICAgICBjaGVja19sYWJlbChsYWJlbCkKICAgICAgICByZXR1cm4gbGFiZWwuZGVjb2RlKCdhc2NpaScpCgogICAgbGFiZWwgPSBsYWJlbC5kZWNvZGUoJ3B1bnljb2RlJykKICAgIGNoZWNrX2xhYmVsKGxhYmVsKQogICAgcmV0dXJuIGxhYmVsCgoKZGVmIHV0czQ2X3JlbWFwKGRvbWFpbiwgc3RkM19ydWxlcz1UcnVlLCB0cmFuc2l0aW9uYWw9RmFsc2UpOgogICAgIiIiUmUtbWFwIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYWNjb3JkaW5nIHRvIFVUUzQ2IHByb2Nlc3NpbmcuIiIiCiAgICBmcm9tIC51dHM0NmRhdGEgaW1wb3J0IHV0czQ2ZGF0YQogICAgb3V0cHV0ID0gdSIiCiAgICB0cnk6CiAgICAgICAgZm9yIHBvcywgY2hhciBpbiBlbnVtZXJhdGUoZG9tYWluKToKICAgICAgICAgICAgY29kZV9wb2ludCA9IG9yZChjaGFyKQogICAgICAgICAgICB1dHM0NnJvdyA9IHV0czQ2ZGF0YVtjb2RlX3BvaW50IGlmIGNvZGVfcG9pbnQgPCAyNTYgZWxzZQogICAgICAgICAgICAgICAgYmlzZWN0LmJpc2VjdF9sZWZ0KHV0czQ2ZGF0YSwgKGNvZGVfcG9pbnQsICJaIikpIC0gMV0KICAgICAgICAgICAgc3RhdHVzID0gdXRzNDZyb3dbMV0KICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSB1dHM0NnJvd1syXSBpZiBsZW4odXRzNDZyb3cpID09IDMgZWxzZSBOb25lCiAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gIlYiIG9yCiAgICAgICAgICAgICAgICAgICAgKHN0YXR1cyA9PSAiRCIgYW5kIG5vdCB0cmFuc2l0aW9uYWwpIG9yCiAgICAgICAgICAgICAgICAgICAgKHN0YXR1cyA9PSAiMyIgYW5kIHN0ZDNfcnVsZXMgYW5kIHJlcGxhY2VtZW50IGlzIE5vbmUpKToKICAgICAgICAgICAgICAgIG91dHB1dCArPSBjaGFyCiAgICAgICAgICAgIGVsaWYgcmVwbGFjZW1lbnQgaXMgbm90IE5vbmUgYW5kIChzdGF0dXMgPT0gIk0iIG9yCiAgICAgICAgICAgICAgICAgICAgKHN0YXR1cyA9PSAiMyIgYW5kIHN0ZDNfcnVsZXMpIG9yCiAgICAgICAgICAgICAgICAgICAgKHN0YXR1cyA9PSAiRCIgYW5kIHRyYW5zaXRpb25hbCkpOgogICAgICAgICAgICAgICAgb3V0cHV0ICs9IHJlcGxhY2VtZW50CiAgICAgICAgICAgIGVsaWYgc3RhdHVzICE9ICJJIjoKICAgICAgICAgICAgICAgIHJhaXNlIEluZGV4RXJyb3IoKQogICAgICAgIHJldHVybiB1bmljb2RlZGF0YS5ub3JtYWxpemUoIk5GQyIsIG91dHB1dCkKICAgIGV4Y2VwdCBJbmRleEVycm9yOgogICAgICAgIHJhaXNlIEludmFsaWRDb2RlcG9pbnQoCiAgICAgICAgICAgICJDb2RlcG9pbnQgezB9IG5vdCBhbGxvd2VkIGF0IHBvc2l0aW9uIHsxfSBpbiB7Mn0iLmZvcm1hdCgKICAgICAgICAgICAgX3Vub3QoY29kZV9wb2ludCksIHBvcyArIDEsIHJlcHIoZG9tYWluKSkpCgoKZGVmIGVuY29kZShzLCBzdHJpY3Q9RmFsc2UsIHV0czQ2PUZhbHNlLCBzdGQzX3J1bGVzPUZhbHNlLCB0cmFuc2l0aW9uYWw9RmFsc2UpOgoKICAgIGlmIGlzaW5zdGFuY2UocywgKGJ5dGVzLCBieXRlYXJyYXkpKToKICAgICAgICBzID0gcy5kZWNvZGUoImFzY2lpIikKICAgIGlmIHV0czQ2OgogICAgICAgIHMgPSB1dHM0Nl9yZW1hcChzLCBzdGQzX3J1bGVzLCB0cmFuc2l0aW9uYWwpCiAgICB0cmFpbGluZ19kb3QgPSBGYWxzZQogICAgcmVzdWx0ID0gW10KICAgIGlmIHN0cmljdDoKICAgICAgICBsYWJlbHMgPSBzLnNwbGl0KCcuJykKICAgIGVsc2U6CiAgICAgICAgbGFiZWxzID0gX3VuaWNvZGVfZG90c19yZS5zcGxpdChzKQogICAgd2hpbGUgbGFiZWxzIGFuZCBub3QgbGFiZWxzWzBdOgogICAgICAgIGRlbCBsYWJlbHNbMF0KICAgIGlmIG5vdCBsYWJlbHM6CiAgICAgICAgcmFpc2UgSUROQUVycm9yKCdFbXB0eSBkb21haW4nKQogICAgaWYgbGFiZWxzWy0xXSA9PSAnJzoKICAgICAgICBkZWwgbGFiZWxzWy0xXQogICAgICAgIHRyYWlsaW5nX2RvdCA9IFRydWUKICAgIGZvciBsYWJlbCBpbiBsYWJlbHM6CiAgICAgICAgcmVzdWx0LmFwcGVuZChhbGFiZWwobGFiZWwpKQogICAgaWYgdHJhaWxpbmdfZG90OgogICAgICAgIHJlc3VsdC5hcHBlbmQoYicnKQogICAgcyA9IGInLicuam9pbihyZXN1bHQpCiAgICBpZiBub3QgdmFsaWRfc3RyaW5nX2xlbmd0aChzLCB0cmFpbGluZ19kb3QpOgogICAgICAgIHJhaXNlIElETkFFcnJvcignRG9tYWluIHRvbyBsb25nJykKICAgIHJldHVybiBzCgoKZGVmIGRlY29kZShzLCBzdHJpY3Q9RmFsc2UsIHV0czQ2PUZhbHNlLCBzdGQzX3J1bGVzPUZhbHNlKToKCiAgICBpZiBpc2luc3RhbmNlKHMsIChieXRlcywgYnl0ZWFycmF5KSk6CiAgICAgICAgcyA9IHMuZGVjb2RlKCJhc2NpaSIpCiAgICBpZiB1dHM0NjoKICAgICAgICBzID0gdXRzNDZfcmVtYXAocywgc3RkM19ydWxlcywgRmFsc2UpCiAgICB0cmFpbGluZ19kb3QgPSBGYWxzZQogICAgcmVzdWx0ID0gW10KICAgIGlmIG5vdCBzdHJpY3Q6CiAgICAgICAgbGFiZWxzID0gX3VuaWNvZGVfZG90c19yZS5zcGxpdChzKQogICAgZWxzZToKICAgICAgICBsYWJlbHMgPSBzLnNwbGl0KHUnLicpCiAgICB3aGlsZSBsYWJlbHMgYW5kIG5vdCBsYWJlbHNbMF06CiAgICAgICAgZGVsIGxhYmVsc1swXQogICAgaWYgbm90IGxhYmVsczoKICAgICAgICByYWlzZSBJRE5BRXJyb3IoJ0VtcHR5IGRvbWFpbicpCiAgICBpZiBub3QgbGFiZWxzWy0xXToKICAgICAgICBkZWwgbGFiZWxzWy0xXQogICAgICAgIHRyYWlsaW5nX2RvdCA9IFRydWUKICAgIGZvciBsYWJlbCBpbiBsYWJlbHM6CiAgICAgICAgcmVzdWx0LmFwcGVuZCh1bGFiZWwobGFiZWwpKQogICAgaWYgdHJhaWxpbmdfZG90OgogICAgICAgIHJlc3VsdC5hcHBlbmQodScnKQogICAgcmV0dXJuIHUnLicuam9pbihyZXN1bHQpClBLAwQUAAAAAAAAACEAY7z6EeeAAADngAAALAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9pZG5hL2lkbmFkYXRhLnB5IyBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdG9vbHMvaWRuYS1kYXRhCgpfX3ZlcnNpb25fXyA9ICI2LjMuMCIKc2NyaXB0cyA9IHsKICAgICdHcmVlayc6ICgKICAgICAgICAweDM3MDAwMDAwMzc0LAogICAgICAgIDB4Mzc1MDAwMDAzNzgsCiAgICAgICAgMHgzN2EwMDAwMDM3ZSwKICAgICAgICAweDM4NDAwMDAwMzg1LAogICAgICAgIDB4Mzg2MDAwMDAzODcsCiAgICAgICAgMHgzODgwMDAwMDM4YiwKICAgICAgICAweDM4YzAwMDAwMzhkLAogICAgICAgIDB4MzhlMDAwMDAzYTIsCiAgICAgICAgMHgzYTMwMDAwMDNlMiwKICAgICAgICAweDNmMDAwMDAwNDAwLAogICAgICAgIDB4MWQyNjAwMDAxZDJiLAogICAgICAgIDB4MWQ1ZDAwMDAxZDYyLAogICAgICAgIDB4MWQ2NjAwMDAxZDZiLAogICAgICAgIDB4MWRiZjAwMDAxZGMwLAogICAgICAgIDB4MWYwMDAwMDAxZjE2LAogICAgICAgIDB4MWYxODAwMDAxZjFlLAogICAgICAgIDB4MWYyMDAwMDAxZjQ2LAogICAgICAgIDB4MWY0ODAwMDAxZjRlLAogICAgICAgIDB4MWY1MDAwMDAxZjU4LAogICAgICAgIDB4MWY1OTAwMDAxZjVhLAogICAgICAgIDB4MWY1YjAwMDAxZjVjLAogICAgICAgIDB4MWY1ZDAwMDAxZjVlLAogICAgICAgIDB4MWY1ZjAwMDAxZjdlLAogICAgICAgIDB4MWY4MDAwMDAxZmI1LAogICAgICAgIDB4MWZiNjAwMDAxZmM1LAogICAgICAgIDB4MWZjNjAwMDAxZmQ0LAogICAgICAgIDB4MWZkNjAwMDAxZmRjLAogICAgICAgIDB4MWZkZDAwMDAxZmYwLAogICAgICAgIDB4MWZmMjAwMDAxZmY1LAogICAgICAgIDB4MWZmNjAwMDAxZmZmLAogICAgICAgIDB4MjEyNjAwMDAyMTI3LAogICAgICAgIDB4MTAxNDAwMDAxMDE4YiwKICAgICAgICAweDFkMjAwMDAwMWQyNDYsCiAgICApLAogICAgJ0hhbic6ICgKICAgICAgICAweDJlODAwMDAwMmU5YSwKICAgICAgICAweDJlOWIwMDAwMmVmNCwKICAgICAgICAweDJmMDAwMDAwMmZkNiwKICAgICAgICAweDMwMDUwMDAwMzAwNiwKICAgICAgICAweDMwMDcwMDAwMzAwOCwKICAgICAgICAweDMwMjEwMDAwMzAyYSwKICAgICAgICAweDMwMzgwMDAwMzAzYywKICAgICAgICAweDM0MDAwMDAwNGRiNiwKICAgICAgICAweDRlMDAwMDAwOWZjZCwKICAgICAgICAweGY5MDAwMDAwZmE2ZSwKICAgICAgICAweGZhNzAwMDAwZmFkYSwKICAgICAgICAweDIwMDAwMDAwMmE2ZDcsCiAgICAgICAgMHgyYTcwMDAwMDJiNzM1LAogICAgICAgIDB4MmI3NDAwMDAyYjgxZSwKICAgICAgICAweDJmODAwMDAwMmZhMWUsCiAgICApLAogICAgJ0hlYnJldyc6ICgKICAgICAgICAweDU5MTAwMDAwNWM4LAogICAgICAgIDB4NWQwMDAwMDA1ZWIsCiAgICAgICAgMHg1ZjAwMDAwMDVmNSwKICAgICAgICAweGZiMWQwMDAwZmIzNywKICAgICAgICAweGZiMzgwMDAwZmIzZCwKICAgICAgICAweGZiM2UwMDAwZmIzZiwKICAgICAgICAweGZiNDAwMDAwZmI0MiwKICAgICAgICAweGZiNDMwMDAwZmI0NSwKICAgICAgICAweGZiNDYwMDAwZmI1MCwKICAgICksCiAgICAnSGlyYWdhbmEnOiAoCiAgICAgICAgMHgzMDQxMDAwMDMwOTcsCiAgICAgICAgMHgzMDlkMDAwMDMwYTAsCiAgICAgICAgMHgxYjAwMTAwMDFiMDAyLAogICAgICAgIDB4MWYyMDAwMDAxZjIwMSwKICAgICksCiAgICAnS2F0YWthbmEnOiAoCiAgICAgICAgMHgzMGExMDAwMDMwZmIsCiAgICAgICAgMHgzMGZkMDAwMDMxMDAsCiAgICAgICAgMHgzMWYwMDAwMDMyMDAsCiAgICAgICAgMHgzMmQwMDAwMDMyZmYsCiAgICAgICAgMHgzMzAwMDAwMDMzNTgsCiAgICAgICAgMHhmZjY2MDAwMGZmNzAsCiAgICAgICAgMHhmZjcxMDAwMGZmOWUsCiAgICAgICAgMHgxYjAwMDAwMDFiMDAxLAogICAgKSwKfQpqb2luaW5nX3R5cGVzID0gewogICAgMHg2MDA6IDg1LAogICAgMHg2MDE6IDg1LAogICAgMHg2MDI6IDg1LAogICAgMHg2MDM6IDg1LAogICAgMHg2MDQ6IDg1LAogICAgMHg2MDg6IDg1LAogICAgMHg2MGI6IDg1LAogICAgMHg2MjA6IDY4LAogICAgMHg2MjE6IDg1LAogICAgMHg2MjI6IDgyLAogICAgMHg2MjM6IDgyLAogICAgMHg2MjQ6IDgyLAogICAgMHg2MjU6IDgyLAogICAgMHg2MjY6IDY4LAogICAgMHg2Mjc6IDgyLAogICAgMHg2Mjg6IDY4LAogICAgMHg2Mjk6IDgyLAogICAgMHg2MmE6IDY4LAogICAgMHg2MmI6IDY4LAogICAgMHg2MmM6IDY4LAogICAgMHg2MmQ6IDY4LAogICAgMHg2MmU6IDY4LAogICAgMHg2MmY6IDgyLAogICAgMHg2MzA6IDgyLAogICAgMHg2MzE6IDgyLAogICAgMHg2MzI6IDgyLAogICAgMHg2MzM6IDY4LAogICAgMHg2MzQ6IDY4LAogICAgMHg2MzU6IDY4LAogICAgMHg2MzY6IDY4LAogICAgMHg2Mzc6IDY4LAogICAgMHg2Mzg6IDY4LAogICAgMHg2Mzk6IDY4LAogICAgMHg2M2E6IDY4LAogICAgMHg2M2I6IDY4LAogICAgMHg2M2M6IDY4LAogICAgMHg2M2Q6IDY4LAogICAgMHg2M2U6IDY4LAogICAgMHg2M2Y6IDY4LAogICAgMHg2NDA6IDY3LAogICAgMHg2NDE6IDY4LAogICAgMHg2NDI6IDY4LAogICAgMHg2NDM6IDY4LAogICAgMHg2NDQ6IDY4LAogICAgMHg2NDU6IDY4LAogICAgMHg2NDY6IDY4LAogICAgMHg2NDc6IDY4LAogICAgMHg2NDg6IDgyLAogICAgMHg2NDk6IDY4LAogICAgMHg2NGE6IDY4LAogICAgMHg2NmU6IDY4LAogICAgMHg2NmY6IDY4LAogICAgMHg2NzE6IDgyLAogICAgMHg2NzI6IDgyLAogICAgMHg2NzM6IDgyLAogICAgMHg2NzQ6IDg1LAogICAgMHg2NzU6IDgyLAogICAgMHg2NzY6IDgyLAogICAgMHg2Nzc6IDgyLAogICAgMHg2Nzg6IDY4LAogICAgMHg2Nzk6IDY4LAogICAgMHg2N2E6IDY4LAogICAgMHg2N2I6IDY4LAogICAgMHg2N2M6IDY4LAogICAgMHg2N2Q6IDY4LAogICAgMHg2N2U6IDY4LAogICAgMHg2N2Y6IDY4LAogICAgMHg2ODA6IDY4LAogICAgMHg2ODE6IDY4LAogICAgMHg2ODI6IDY4LAogICAgMHg2ODM6IDY4LAogICAgMHg2ODQ6IDY4LAogICAgMHg2ODU6IDY4LAogICAgMHg2ODY6IDY4LAogICAgMHg2ODc6IDY4LAogICAgMHg2ODg6IDgyLAogICAgMHg2ODk6IDgyLAogICAgMHg2OGE6IDgyLAogICAgMHg2OGI6IDgyLAogICAgMHg2OGM6IDgyLAogICAgMHg2OGQ6IDgyLAogICAgMHg2OGU6IDgyLAogICAgMHg2OGY6IDgyLAogICAgMHg2OTA6IDgyLAogICAgMHg2OTE6IDgyLAogICAgMHg2OTI6IDgyLAogICAgMHg2OTM6IDgyLAogICAgMHg2OTQ6IDgyLAogICAgMHg2OTU6IDgyLAogICAgMHg2OTY6IDgyLAogICAgMHg2OTc6IDgyLAogICAgMHg2OTg6IDgyLAogICAgMHg2OTk6IDgyLAogICAgMHg2OWE6IDY4LAogICAgMHg2OWI6IDY4LAogICAgMHg2OWM6IDY4LAogICAgMHg2OWQ6IDY4LAogICAgMHg2OWU6IDY4LAogICAgMHg2OWY6IDY4LAogICAgMHg2YTA6IDY4LAogICAgMHg2YTE6IDY4LAogICAgMHg2YTI6IDY4LAogICAgMHg2YTM6IDY4LAogICAgMHg2YTQ6IDY4LAogICAgMHg2YTU6IDY4LAogICAgMHg2YTY6IDY4LAogICAgMHg2YTc6IDY4LAogICAgMHg2YTg6IDY4LAogICAgMHg2YTk6IDY4LAogICAgMHg2YWE6IDY4LAogICAgMHg2YWI6IDY4LAogICAgMHg2YWM6IDY4LAogICAgMHg2YWQ6IDY4LAogICAgMHg2YWU6IDY4LAogICAgMHg2YWY6IDY4LAogICAgMHg2YjA6IDY4LAogICAgMHg2YjE6IDY4LAogICAgMHg2YjI6IDY4LAogICAgMHg2YjM6IDY4LAogICAgMHg2YjQ6IDY4LAogICAgMHg2YjU6IDY4LAogICAgMHg2YjY6IDY4LAogICAgMHg2Yjc6IDY4LAogICAgMHg2Yjg6IDY4LAogICAgMHg2Yjk6IDY4LAogICAgMHg2YmE6IDY4LAogICAgMHg2YmI6IDY4LAogICAgMHg2YmM6IDY4LAogICAgMHg2YmQ6IDY4LAogICAgMHg2YmU6IDY4LAogICAgMHg2YmY6IDY4LAogICAgMHg2YzA6IDgyLAogICAgMHg2YzE6IDY4LAogICAgMHg2YzI6IDY4LAogICAgMHg2YzM6IDgyLAogICAgMHg2YzQ6IDgyLAogICAgMHg2YzU6IDgyLAogICAgMHg2YzY6IDgyLAogICAgMHg2Yzc6IDgyLAogICAgMHg2Yzg6IDgyLAogICAgMHg2Yzk6IDgyLAogICAgMHg2Y2E6IDgyLAogICAgMHg2Y2I6IDgyLAogICAgMHg2Y2M6IDY4LAogICAgMHg2Y2Q6IDgyLAogICAgMHg2Y2U6IDY4LAogICAgMHg2Y2Y6IDgyLAogICAgMHg2ZDA6IDY4LAogICAgMHg2ZDE6IDY4LAogICAgMHg2ZDI6IDgyLAogICAgMHg2ZDM6IDgyLAogICAgMHg2ZDU6IDgyLAogICAgMHg2ZGQ6IDg1LAogICAgMHg2ZWU6IDgyLAogICAgMHg2ZWY6IDgyLAogICAgMHg2ZmE6IDY4LAogICAgMHg2ZmI6IDY4LAogICAgMHg2ZmM6IDY4LAogICAgMHg2ZmY6IDY4LAogICAgMHg3MTA6IDgyLAogICAgMHg3MTI6IDY4LAogICAgMHg3MTM6IDY4LAogICAgMHg3MTQ6IDY4LAogICAgMHg3MTU6IDgyLAogICAgMHg3MTY6IDgyLAogICAgMHg3MTc6IDgyLAogICAgMHg3MTg6IDgyLAogICAgMHg3MTk6IDgyLAogICAgMHg3MWE6IDY4LAogICAgMHg3MWI6IDY4LAogICAgMHg3MWM6IDY4LAogICAgMHg3MWQ6IDY4LAogICAgMHg3MWU6IDgyLAogICAgMHg3MWY6IDY4LAogICAgMHg3MjA6IDY4LAogICAgMHg3MjE6IDY4LAogICAgMHg3MjI6IDY4LAogICAgMHg3MjM6IDY4LAogICAgMHg3MjQ6IDY4LAogICAgMHg3MjU6IDY4LAogICAgMHg3MjY6IDY4LAogICAgMHg3Mjc6IDY4LAogICAgMHg3Mjg6IDgyLAogICAgMHg3Mjk6IDY4LAogICAgMHg3MmE6IDgyLAogICAgMHg3MmI6IDY4LAogICAgMHg3MmM6IDgyLAogICAgMHg3MmQ6IDY4LAogICAgMHg3MmU6IDY4LAogICAgMHg3MmY6IDgyLAogICAgMHg3NGQ6IDgyLAogICAgMHg3NGU6IDY4LAogICAgMHg3NGY6IDY4LAogICAgMHg3NTA6IDY4LAogICAgMHg3NTE6IDY4LAogICAgMHg3NTI6IDY4LAogICAgMHg3NTM6IDY4LAogICAgMHg3NTQ6IDY4LAogICAgMHg3NTU6IDY4LAogICAgMHg3NTY6IDY4LAogICAgMHg3NTc6IDY4LAogICAgMHg3NTg6IDY4LAogICAgMHg3NTk6IDgyLAogICAgMHg3NWE6IDgyLAogICAgMHg3NWI6IDgyLAogICAgMHg3NWM6IDY4LAogICAgMHg3NWQ6IDY4LAogICAgMHg3NWU6IDY4LAogICAgMHg3NWY6IDY4LAogICAgMHg3NjA6IDY4LAogICAgMHg3NjE6IDY4LAogICAgMHg3NjI6IDY4LAogICAgMHg3NjM6IDY4LAogICAgMHg3NjQ6IDY4LAogICAgMHg3NjU6IDY4LAogICAgMHg3NjY6IDY4LAogICAgMHg3Njc6IDY4LAogICAgMHg3Njg6IDY4LAogICAgMHg3Njk6IDY4LAogICAgMHg3NmE6IDY4LAogICAgMHg3NmI6IDgyLAogICAgMHg3NmM6IDgyLAogICAgMHg3NmQ6IDY4LAogICAgMHg3NmU6IDY4LAogICAgMHg3NmY6IDY4LAogICAgMHg3NzA6IDY4LAogICAgMHg3NzE6IDgyLAogICAgMHg3NzI6IDY4LAogICAgMHg3NzM6IDgyLAogICAgMHg3NzQ6IDgyLAogICAgMHg3NzU6IDY4LAogICAgMHg3NzY6IDY4LAogICAgMHg3Nzc6IDY4LAogICAgMHg3Nzg6IDgyLAogICAgMHg3Nzk6IDgyLAogICAgMHg3N2E6IDY4LAogICAgMHg3N2I6IDY4LAogICAgMHg3N2M6IDY4LAogICAgMHg3N2Q6IDY4LAogICAgMHg3N2U6IDY4LAogICAgMHg3N2Y6IDY4LAogICAgMHg3Y2E6IDY4LAogICAgMHg3Y2I6IDY4LAogICAgMHg3Y2M6IDY4LAogICAgMHg3Y2Q6IDY4LAogICAgMHg3Y2U6IDY4LAogICAgMHg3Y2Y6IDY4LAogICAgMHg3ZDA6IDY4LAogICAgMHg3ZDE6IDY4LAogICAgMHg3ZDI6IDY4LAogICAgMHg3ZDM6IDY4LAogICAgMHg3ZDQ6IDY4LAogICAgMHg3ZDU6IDY4LAogICAgMHg3ZDY6IDY4LAogICAgMHg3ZDc6IDY4LAogICAgMHg3ZDg6IDY4LAogICAgMHg3ZDk6IDY4LAogICAgMHg3ZGE6IDY4LAogICAgMHg3ZGI6IDY4LAogICAgMHg3ZGM6IDY4LAogICAgMHg3ZGQ6IDY4LAogICAgMHg3ZGU6IDY4LAogICAgMHg3ZGY6IDY4LAogICAgMHg3ZTA6IDY4LAogICAgMHg3ZTE6IDY4LAogICAgMHg3ZTI6IDY4LAogICAgMHg3ZTM6IDY4LAogICAgMHg3ZTQ6IDY4LAogICAgMHg3ZTU6IDY4LAogICAgMHg3ZTY6IDY4LAogICAgMHg3ZTc6IDY4LAogICAgMHg3ZTg6IDY4LAogICAgMHg3ZTk6IDY4LAogICAgMHg3ZWE6IDY4LAogICAgMHg3ZmE6IDY3LAogICAgMHg4NDA6IDgyLAogICAgMHg4NDE6IDY4LAogICAgMHg4NDI6IDY4LAogICAgMHg4NDM6IDY4LAogICAgMHg4NDQ6IDY4LAogICAgMHg4NDU6IDY4LAogICAgMHg4NDY6IDgyLAogICAgMHg4NDc6IDY4LAogICAgMHg4NDg6IDY4LAogICAgMHg4NDk6IDgyLAogICAgMHg4NGE6IDY4LAogICAgMHg4NGI6IDY4LAogICAgMHg4NGM6IDY4LAogICAgMHg4NGQ6IDY4LAogICAgMHg4NGU6IDY4LAogICAgMHg4NGY6IDgyLAogICAgMHg4NTA6IDY4LAogICAgMHg4NTE6IDY4LAogICAgMHg4NTI6IDY4LAogICAgMHg4NTM6IDY4LAogICAgMHg4NTQ6IDgyLAogICAgMHg4NTU6IDY4LAogICAgMHg4NTY6IDg1LAogICAgMHg4NTc6IDg1LAogICAgMHg4NTg6IDg1LAogICAgMHg4YTA6IDY4LAogICAgMHg4YTI6IDY4LAogICAgMHg4YTM6IDY4LAogICAgMHg4YTQ6IDY4LAogICAgMHg4YTU6IDY4LAogICAgMHg4YTY6IDY4LAogICAgMHg4YTc6IDY4LAogICAgMHg4YTg6IDY4LAogICAgMHg4YTk6IDY4LAogICAgMHg4YWE6IDgyLAogICAgMHg4YWI6IDgyLAogICAgMHg4YWM6IDgyLAogICAgMHgxODA2OiA4NSwKICAgIDB4MTgwNzogNjgsCiAgICAweDE4MGE6IDY3LAogICAgMHgxODBlOiA4NSwKICAgIDB4MTgyMDogNjgsCiAgICAweDE4MjE6IDY4LAogICAgMHgxODIyOiA2OCwKICAgIDB4MTgyMzogNjgsCiAgICAweDE4MjQ6IDY4LAogICAgMHgxODI1OiA2OCwKICAgIDB4MTgyNjogNjgsCiAgICAweDE4Mjc6IDY4LAogICAgMHgxODI4OiA2OCwKICAgIDB4MTgyOTogNjgsCiAgICAweDE4MmE6IDY4LAogICAgMHgxODJiOiA2OCwKICAgIDB4MTgyYzogNjgsCiAgICAweDE4MmQ6IDY4LAogICAgMHgxODJlOiA2OCwKICAgIDB4MTgyZjogNjgsCiAgICAweDE4MzA6IDY4LAogICAgMHgxODMxOiA2OCwKICAgIDB4MTgzMjogNjgsCiAgICAweDE4MzM6IDY4LAogICAgMHgxODM0OiA2OCwKICAgIDB4MTgzNTogNjgsCiAgICAweDE4MzY6IDY4LAogICAgMHgxODM3OiA2OCwKICAgIDB4MTgzODogNjgsCiAgICAweDE4Mzk6IDY4LAogICAgMHgxODNhOiA2OCwKICAgIDB4MTgzYjogNjgsCiAgICAweDE4M2M6IDY4LAogICAgMHgxODNkOiA2OCwKICAgIDB4MTgzZTogNjgsCiAgICAweDE4M2Y6IDY4LAogICAgMHgxODQwOiA2OCwKICAgIDB4MTg0MTogNjgsCiAgICAweDE4NDI6IDY4LAogICAgMHgxODQzOiA2OCwKICAgIDB4MTg0NDogNjgsCiAgICAweDE4NDU6IDY4LAogICAgMHgxODQ2OiA2OCwKICAgIDB4MTg0NzogNjgsCiAgICAweDE4NDg6IDY4LAogICAgMHgxODQ5OiA2OCwKICAgIDB4MTg0YTogNjgsCiAgICAweDE4NGI6IDY4LAogICAgMHgxODRjOiA2OCwKICAgIDB4MTg0ZDogNjgsCiAgICAweDE4NGU6IDY4LAogICAgMHgxODRmOiA2OCwKICAgIDB4MTg1MDogNjgsCiAgICAweDE4NTE6IDY4LAogICAgMHgxODUyOiA2OCwKICAgIDB4MTg1MzogNjgsCiAgICAweDE4NTQ6IDY4LAogICAgMHgxODU1OiA2OCwKICAgIDB4MTg1NjogNjgsCiAgICAweDE4NTc6IDY4LAogICAgMHgxODU4OiA2OCwKICAgIDB4MTg1OTogNjgsCiAgICAweDE4NWE6IDY4LAogICAgMHgxODViOiA2OCwKICAgIDB4MTg1YzogNjgsCiAgICAweDE4NWQ6IDY4LAogICAgMHgxODVlOiA2OCwKICAgIDB4MTg1ZjogNjgsCiAgICAweDE4NjA6IDY4LAogICAgMHgxODYxOiA2OCwKICAgIDB4MTg2MjogNjgsCiAgICAweDE4NjM6IDY4LAogICAgMHgxODY0OiA2OCwKICAgIDB4MTg2NTogNjgsCiAgICAweDE4NjY6IDY4LAogICAgMHgxODY3OiA2OCwKICAgIDB4MTg2ODogNjgsCiAgICAweDE4Njk6IDY4LAogICAgMHgxODZhOiA2OCwKICAgIDB4MTg2YjogNjgsCiAgICAweDE4NmM6IDY4LAogICAgMHgxODZkOiA2OCwKICAgIDB4MTg2ZTogNjgsCiAgICAweDE4NmY6IDY4LAogICAgMHgxODcwOiA2OCwKICAgIDB4MTg3MTogNjgsCiAgICAweDE4NzI6IDY4LAogICAgMHgxODczOiA2OCwKICAgIDB4MTg3NDogNjgsCiAgICAweDE4NzU6IDY4LAogICAgMHgxODc2OiA2OCwKICAgIDB4MTg3NzogNjgsCiAgICAweDE4ODA6IDg1LAogICAgMHgxODgxOiA4NSwKICAgIDB4MTg4MjogODUsCiAgICAweDE4ODM6IDg1LAogICAgMHgxODg0OiA4NSwKICAgIDB4MTg4NTogODUsCiAgICAweDE4ODY6IDg1LAogICAgMHgxODg3OiA2OCwKICAgIDB4MTg4ODogNjgsCiAgICAweDE4ODk6IDY4LAogICAgMHgxODhhOiA2OCwKICAgIDB4MTg4YjogNjgsCiAgICAweDE4OGM6IDY4LAogICAgMHgxODhkOiA2OCwKICAgIDB4MTg4ZTogNjgsCiAgICAweDE4OGY6IDY4LAogICAgMHgxODkwOiA2OCwKICAgIDB4MTg5MTogNjgsCiAgICAweDE4OTI6IDY4LAogICAgMHgxODkzOiA2OCwKICAgIDB4MTg5NDogNjgsCiAgICAweDE4OTU6IDY4LAogICAgMHgxODk2OiA2OCwKICAgIDB4MTg5NzogNjgsCiAgICAweDE4OTg6IDY4LAogICAgMHgxODk5OiA2OCwKICAgIDB4MTg5YTogNjgsCiAgICAweDE4OWI6IDY4LAogICAgMHgxODljOiA2OCwKICAgIDB4MTg5ZDogNjgsCiAgICAweDE4OWU6IDY4LAogICAgMHgxODlmOiA2OCwKICAgIDB4MThhMDogNjgsCiAgICAweDE4YTE6IDY4LAogICAgMHgxOGEyOiA2OCwKICAgIDB4MThhMzogNjgsCiAgICAweDE4YTQ6IDY4LAogICAgMHgxOGE1OiA2OCwKICAgIDB4MThhNjogNjgsCiAgICAweDE4YTc6IDY4LAogICAgMHgxOGE4OiA2OCwKICAgIDB4MThhYTogNjgsCiAgICAweDIwMGM6IDg1LAogICAgMHgyMDBkOiA2NywKICAgIDB4MjA2NjogODUsCiAgICAweDIwNjc6IDg1LAogICAgMHgyMDY4OiA4NSwKICAgIDB4MjA2OTogODUsCiAgICAweGE4NDA6IDY4LAogICAgMHhhODQxOiA2OCwKICAgIDB4YTg0MjogNjgsCiAgICAweGE4NDM6IDY4LAogICAgMHhhODQ0OiA2OCwKICAgIDB4YTg0NTogNjgsCiAgICAweGE4NDY6IDY4LAogICAgMHhhODQ3OiA2OCwKICAgIDB4YTg0ODogNjgsCiAgICAweGE4NDk6IDY4LAogICAgMHhhODRhOiA2OCwKICAgIDB4YTg0YjogNjgsCiAgICAweGE4NGM6IDY4LAogICAgMHhhODRkOiA2OCwKICAgIDB4YTg0ZTogNjgsCiAgICAweGE4NGY6IDY4LAogICAgMHhhODUwOiA2OCwKICAgIDB4YTg1MTogNjgsCiAgICAweGE4NTI6IDY4LAogICAgMHhhODUzOiA2OCwKICAgIDB4YTg1NDogNjgsCiAgICAweGE4NTU6IDY4LAogICAgMHhhODU2OiA2OCwKICAgIDB4YTg1NzogNjgsCiAgICAweGE4NTg6IDY4LAogICAgMHhhODU5OiA2OCwKICAgIDB4YTg1YTogNjgsCiAgICAweGE4NWI6IDY4LAogICAgMHhhODVjOiA2OCwKICAgIDB4YTg1ZDogNjgsCiAgICAweGE4NWU6IDY4LAogICAgMHhhODVmOiA2OCwKICAgIDB4YTg2MDogNjgsCiAgICAweGE4NjE6IDY4LAogICAgMHhhODYyOiA2OCwKICAgIDB4YTg2MzogNjgsCiAgICAweGE4NjQ6IDY4LAogICAgMHhhODY1OiA2OCwKICAgIDB4YTg2NjogNjgsCiAgICAweGE4Njc6IDY4LAogICAgMHhhODY4OiA2OCwKICAgIDB4YTg2OTogNjgsCiAgICAweGE4NmE6IDY4LAogICAgMHhhODZiOiA2OCwKICAgIDB4YTg2YzogNjgsCiAgICAweGE4NmQ6IDY4LAogICAgMHhhODZlOiA2OCwKICAgIDB4YTg2ZjogNjgsCiAgICAweGE4NzA6IDY4LAogICAgMHhhODcxOiA2OCwKICAgIDB4YTg3MjogNzYsCiAgICAweGE4NzM6IDg1LAp9CmNvZGVwb2ludF9jbGFzc2VzID0gewogICAgJ1BWQUxJRCc6ICgKICAgICAgICAweDJkMDAwMDAwMmUsCiAgICAgICAgMHgzMDAwMDAwMDNhLAogICAgICAgIDB4NjEwMDAwMDA3YiwKICAgICAgICAweGRmMDAwMDAwZjcsCiAgICAgICAgMHhmODAwMDAwMTAwLAogICAgICAgIDB4MTAxMDAwMDAxMDIsCiAgICAgICAgMHgxMDMwMDAwMDEwNCwKICAgICAgICAweDEwNTAwMDAwMTA2LAogICAgICAgIDB4MTA3MDAwMDAxMDgsCiAgICAgICAgMHgxMDkwMDAwMDEwYSwKICAgICAgICAweDEwYjAwMDAwMTBjLAogICAgICAgIDB4MTBkMDAwMDAxMGUsCiAgICAgICAgMHgxMGYwMDAwMDExMCwKICAgICAgICAweDExMTAwMDAwMTEyLAogICAgICAgIDB4MTEzMDAwMDAxMTQsCiAgICAgICAgMHgxMTUwMDAwMDExNiwKICAgICAgICAweDExNzAwMDAwMTE4LAogICAgICAgIDB4MTE5MDAwMDAxMWEsCiAgICAgICAgMHgxMWIwMDAwMDExYywKICAgICAgICAweDExZDAwMDAwMTFlLAogICAgICAgIDB4MTFmMDAwMDAxMjAsCiAgICAgICAgMHgxMjEwMDAwMDEyMiwKICAgICAgICAweDEyMzAwMDAwMTI0LAogICAgICAgIDB4MTI1MDAwMDAxMjYsCiAgICAgICAgMHgxMjcwMDAwMDEyOCwKICAgICAgICAweDEyOTAwMDAwMTJhLAogICAgICAgIDB4MTJiMDAwMDAxMmMsCiAgICAgICAgMHgxMmQwMDAwMDEyZSwKICAgICAgICAweDEyZjAwMDAwMTMwLAogICAgICAgIDB4MTMxMDAwMDAxMzIsCiAgICAgICAgMHgxMzUwMDAwMDEzNiwKICAgICAgICAweDEzNzAwMDAwMTM5LAogICAgICAgIDB4MTNhMDAwMDAxM2IsCiAgICAgICAgMHgxM2MwMDAwMDEzZCwKICAgICAgICAweDEzZTAwMDAwMTNmLAogICAgICAgIDB4MTQyMDAwMDAxNDMsCiAgICAgICAgMHgxNDQwMDAwMDE0NSwKICAgICAgICAweDE0NjAwMDAwMTQ3LAogICAgICAgIDB4MTQ4MDAwMDAxNDksCiAgICAgICAgMHgxNGIwMDAwMDE0YywKICAgICAgICAweDE0ZDAwMDAwMTRlLAogICAgICAgIDB4MTRmMDAwMDAxNTAsCiAgICAgICAgMHgxNTEwMDAwMDE1MiwKICAgICAgICAweDE1MzAwMDAwMTU0LAogICAgICAgIDB4MTU1MDAwMDAxNTYsCiAgICAgICAgMHgxNTcwMDAwMDE1OCwKICAgICAgICAweDE1OTAwMDAwMTVhLAogICAgICAgIDB4MTViMDAwMDAxNWMsCiAgICAgICAgMHgxNWQwMDAwMDE1ZSwKICAgICAgICAweDE1ZjAwMDAwMTYwLAogICAgICAgIDB4MTYxMDAwMDAxNjIsCiAgICAgICAgMHgxNjMwMDAwMDE2NCwKICAgICAgICAweDE2NTAwMDAwMTY2LAogICAgICAgIDB4MTY3MDAwMDAxNjgsCiAgICAgICAgMHgxNjkwMDAwMDE2YSwKICAgICAgICAweDE2YjAwMDAwMTZjLAogICAgICAgIDB4MTZkMDAwMDAxNmUsCiAgICAgICAgMHgxNmYwMDAwMDE3MCwKICAgICAgICAweDE3MTAwMDAwMTcyLAogICAgICAgIDB4MTczMDAwMDAxNzQsCiAgICAgICAgMHgxNzUwMDAwMDE3NiwKICAgICAgICAweDE3NzAwMDAwMTc4LAogICAgICAgIDB4MTdhMDAwMDAxN2IsCiAgICAgICAgMHgxN2MwMDAwMDE3ZCwKICAgICAgICAweDE3ZTAwMDAwMTdmLAogICAgICAgIDB4MTgwMDAwMDAxODEsCiAgICAgICAgMHgxODMwMDAwMDE4NCwKICAgICAgICAweDE4NTAwMDAwMTg2LAogICAgICAgIDB4MTg4MDAwMDAxODksCiAgICAgICAgMHgxOGMwMDAwMDE4ZSwKICAgICAgICAweDE5MjAwMDAwMTkzLAogICAgICAgIDB4MTk1MDAwMDAxOTYsCiAgICAgICAgMHgxOTkwMDAwMDE5YywKICAgICAgICAweDE5ZTAwMDAwMTlmLAogICAgICAgIDB4MWExMDAwMDAxYTIsCiAgICAgICAgMHgxYTMwMDAwMDFhNCwKICAgICAgICAweDFhNTAwMDAwMWE2LAogICAgICAgIDB4MWE4MDAwMDAxYTksCiAgICAgICAgMHgxYWEwMDAwMDFhYywKICAgICAgICAweDFhZDAwMDAwMWFlLAogICAgICAgIDB4MWIwMDAwMDAxYjEsCiAgICAgICAgMHgxYjQwMDAwMDFiNSwKICAgICAgICAweDFiNjAwMDAwMWI3LAogICAgICAgIDB4MWI5MDAwMDAxYmMsCiAgICAgICAgMHgxYmQwMDAwMDFjNCwKICAgICAgICAweDFjZTAwMDAwMWNmLAogICAgICAgIDB4MWQwMDAwMDAxZDEsCiAgICAgICAgMHgxZDIwMDAwMDFkMywKICAgICAgICAweDFkNDAwMDAwMWQ1LAogICAgICAgIDB4MWQ2MDAwMDAxZDcsCiAgICAgICAgMHgxZDgwMDAwMDFkOSwKICAgICAgICAweDFkYTAwMDAwMWRiLAogICAgICAgIDB4MWRjMDAwMDAxZGUsCiAgICAgICAgMHgxZGYwMDAwMDFlMCwKICAgICAgICAweDFlMTAwMDAwMWUyLAogICAgICAgIDB4MWUzMDAwMDAxZTQsCiAgICAgICAgMHgxZTUwMDAwMDFlNiwKICAgICAgICAweDFlNzAwMDAwMWU4LAogICAgICAgIDB4MWU5MDAwMDAxZWEsCiAgICAgICAgMHgxZWIwMDAwMDFlYywKICAgICAgICAweDFlZDAwMDAwMWVlLAogICAgICAgIDB4MWVmMDAwMDAxZjEsCiAgICAgICAgMHgxZjUwMDAwMDFmNiwKICAgICAgICAweDFmOTAwMDAwMWZhLAogICAgICAgIDB4MWZiMDAwMDAxZmMsCiAgICAgICAgMHgxZmQwMDAwMDFmZSwKICAgICAgICAweDFmZjAwMDAwMjAwLAogICAgICAgIDB4MjAxMDAwMDAyMDIsCiAgICAgICAgMHgyMDMwMDAwMDIwNCwKICAgICAgICAweDIwNTAwMDAwMjA2LAogICAgICAgIDB4MjA3MDAwMDAyMDgsCiAgICAgICAgMHgyMDkwMDAwMDIwYSwKICAgICAgICAweDIwYjAwMDAwMjBjLAogICAgICAgIDB4MjBkMDAwMDAyMGUsCiAgICAgICAgMHgyMGYwMDAwMDIxMCwKICAgICAgICAweDIxMTAwMDAwMjEyLAogICAgICAgIDB4MjEzMDAwMDAyMTQsCiAgICAgICAgMHgyMTUwMDAwMDIxNiwKICAgICAgICAweDIxNzAwMDAwMjE4LAogICAgICAgIDB4MjE5MDAwMDAyMWEsCiAgICAgICAgMHgyMWIwMDAwMDIxYywKICAgICAgICAweDIxZDAwMDAwMjFlLAogICAgICAgIDB4MjFmMDAwMDAyMjAsCiAgICAgICAgMHgyMjEwMDAwMDIyMiwKICAgICAgICAweDIyMzAwMDAwMjI0LAogICAgICAgIDB4MjI1MDAwMDAyMjYsCiAgICAgICAgMHgyMjcwMDAwMDIyOCwKICAgICAgICAweDIyOTAwMDAwMjJhLAogICAgICAgIDB4MjJiMDAwMDAyMmMsCiAgICAgICAgMHgyMmQwMDAwMDIyZSwKICAgICAgICAweDIyZjAwMDAwMjMwLAogICAgICAgIDB4MjMxMDAwMDAyMzIsCiAgICAgICAgMHgyMzMwMDAwMDIzYSwKICAgICAgICAweDIzYzAwMDAwMjNkLAogICAgICAgIDB4MjNmMDAwMDAyNDEsCiAgICAgICAgMHgyNDIwMDAwMDI0MywKICAgICAgICAweDI0NzAwMDAwMjQ4LAogICAgICAgIDB4MjQ5MDAwMDAyNGEsCiAgICAgICAgMHgyNGIwMDAwMDI0YywKICAgICAgICAweDI0ZDAwMDAwMjRlLAogICAgICAgIDB4MjRmMDAwMDAyYjAsCiAgICAgICAgMHgyYjkwMDAwMDJjMiwKICAgICAgICAweDJjNjAwMDAwMmQyLAogICAgICAgIDB4MmVjMDAwMDAyZWQsCiAgICAgICAgMHgyZWUwMDAwMDJlZiwKICAgICAgICAweDMwMDAwMDAwMzQwLAogICAgICAgIDB4MzQyMDAwMDAzNDMsCiAgICAgICAgMHgzNDYwMDAwMDM0ZiwKICAgICAgICAweDM1MDAwMDAwMzcwLAogICAgICAgIDB4MzcxMDAwMDAzNzIsCiAgICAgICAgMHgzNzMwMDAwMDM3NCwKICAgICAgICAweDM3NzAwMDAwMzc4LAogICAgICAgIDB4MzdiMDAwMDAzN2UsCiAgICAgICAgMHgzOTAwMDAwMDM5MSwKICAgICAgICAweDNhYzAwMDAwM2NmLAogICAgICAgIDB4M2Q3MDAwMDAzZDgsCiAgICAgICAgMHgzZDkwMDAwMDNkYSwKICAgICAgICAweDNkYjAwMDAwM2RjLAogICAgICAgIDB4M2RkMDAwMDAzZGUsCiAgICAgICAgMHgzZGYwMDAwMDNlMCwKICAgICAgICAweDNlMTAwMDAwM2UyLAogICAgICAgIDB4M2UzMDAwMDAzZTQsCiAgICAgICAgMHgzZTUwMDAwMDNlNiwKICAgICAgICAweDNlNzAwMDAwM2U4LAogICAgICAgIDB4M2U5MDAwMDAzZWEsCiAgICAgICAgMHgzZWIwMDAwMDNlYywKICAgICAgICAweDNlZDAwMDAwM2VlLAogICAgICAgIDB4M2VmMDAwMDAzZjAsCiAgICAgICAgMHgzZjMwMDAwMDNmNCwKICAgICAgICAweDNmODAwMDAwM2Y5LAogICAgICAgIDB4M2ZiMDAwMDAzZmQsCiAgICAgICAgMHg0MzAwMDAwMDQ2MCwKICAgICAgICAweDQ2MTAwMDAwNDYyLAogICAgICAgIDB4NDYzMDAwMDA0NjQsCiAgICAgICAgMHg0NjUwMDAwMDQ2NiwKICAgICAgICAweDQ2NzAwMDAwNDY4LAogICAgICAgIDB4NDY5MDAwMDA0NmEsCiAgICAgICAgMHg0NmIwMDAwMDQ2YywKICAgICAgICAweDQ2ZDAwMDAwNDZlLAogICAgICAgIDB4NDZmMDAwMDA0NzAsCiAgICAgICAgMHg0NzEwMDAwMDQ3MiwKICAgICAgICAweDQ3MzAwMDAwNDc0LAogICAgICAgIDB4NDc1MDAwMDA0NzYsCiAgICAgICAgMHg0NzcwMDAwMDQ3OCwKICAgICAgICAweDQ3OTAwMDAwNDdhLAogICAgICAgIDB4NDdiMDAwMDA0N2MsCiAgICAgICAgMHg0N2QwMDAwMDQ3ZSwKICAgICAgICAweDQ3ZjAwMDAwNDgwLAogICAgICAgIDB4NDgxMDAwMDA0ODIsCiAgICAgICAgMHg0ODMwMDAwMDQ4OCwKICAgICAgICAweDQ4YjAwMDAwNDhjLAogICAgICAgIDB4NDhkMDAwMDA0OGUsCiAgICAgICAgMHg0OGYwMDAwMDQ5MCwKICAgICAgICAweDQ5MTAwMDAwNDkyLAogICAgICAgIDB4NDkzMDAwMDA0OTQsCiAgICAgICAgMHg0OTUwMDAwMDQ5NiwKICAgICAgICAweDQ5NzAwMDAwNDk4LAogICAgICAgIDB4NDk5MDAwMDA0OWEsCiAgICAgICAgMHg0OWIwMDAwMDQ5YywKICAgICAgICAweDQ5ZDAwMDAwNDllLAogICAgICAgIDB4NDlmMDAwMDA0YTAsCiAgICAgICAgMHg0YTEwMDAwMDRhMiwKICAgICAgICAweDRhMzAwMDAwNGE0LAogICAgICAgIDB4NGE1MDAwMDA0YTYsCiAgICAgICAgMHg0YTcwMDAwMDRhOCwKICAgICAgICAweDRhOTAwMDAwNGFhLAogICAgICAgIDB4NGFiMDAwMDA0YWMsCiAgICAgICAgMHg0YWQwMDAwMDRhZSwKICAgICAgICAweDRhZjAwMDAwNGIwLAogICAgICAgIDB4NGIxMDAwMDA0YjIsCiAgICAgICAgMHg0YjMwMDAwMDRiNCwKICAgICAgICAweDRiNTAwMDAwNGI2LAogICAgICAgIDB4NGI3MDAwMDA0YjgsCiAgICAgICAgMHg0YjkwMDAwMDRiYSwKICAgICAgICAweDRiYjAwMDAwNGJjLAogICAgICAgIDB4NGJkMDAwMDA0YmUsCiAgICAgICAgMHg0YmYwMDAwMDRjMCwKICAgICAgICAweDRjMjAwMDAwNGMzLAogICAgICAgIDB4NGM0MDAwMDA0YzUsCiAgICAgICAgMHg0YzYwMDAwMDRjNywKICAgICAgICAweDRjODAwMDAwNGM5LAogICAgICAgIDB4NGNhMDAwMDA0Y2IsCiAgICAgICAgMHg0Y2MwMDAwMDRjZCwKICAgICAgICAweDRjZTAwMDAwNGQwLAogICAgICAgIDB4NGQxMDAwMDA0ZDIsCiAgICAgICAgMHg0ZDMwMDAwMDRkNCwKICAgICAgICAweDRkNTAwMDAwNGQ2LAogICAgICAgIDB4NGQ3MDAwMDA0ZDgsCiAgICAgICAgMHg0ZDkwMDAwMDRkYSwKICAgICAgICAweDRkYjAwMDAwNGRjLAogICAgICAgIDB4NGRkMDAwMDA0ZGUsCiAgICAgICAgMHg0ZGYwMDAwMDRlMCwKICAgICAgICAweDRlMTAwMDAwNGUyLAogICAgICAgIDB4NGUzMDAwMDA0ZTQsCiAgICAgICAgMHg0ZTUwMDAwMDRlNiwKICAgICAgICAweDRlNzAwMDAwNGU4LAogICAgICAgIDB4NGU5MDAwMDA0ZWEsCiAgICAgICAgMHg0ZWIwMDAwMDRlYywKICAgICAgICAweDRlZDAwMDAwNGVlLAogICAgICAgIDB4NGVmMDAwMDA0ZjAsCiAgICAgICAgMHg0ZjEwMDAwMDRmMiwKICAgICAgICAweDRmMzAwMDAwNGY0LAogICAgICAgIDB4NGY1MDAwMDA0ZjYsCiAgICAgICAgMHg0ZjcwMDAwMDRmOCwKICAgICAgICAweDRmOTAwMDAwNGZhLAogICAgICAgIDB4NGZiMDAwMDA0ZmMsCiAgICAgICAgMHg0ZmQwMDAwMDRmZSwKICAgICAgICAweDRmZjAwMDAwNTAwLAogICAgICAgIDB4NTAxMDAwMDA1MDIsCiAgICAgICAgMHg1MDMwMDAwMDUwNCwKICAgICAgICAweDUwNTAwMDAwNTA2LAogICAgICAgIDB4NTA3MDAwMDA1MDgsCiAgICAgICAgMHg1MDkwMDAwMDUwYSwKICAgICAgICAweDUwYjAwMDAwNTBjLAogICAgICAgIDB4NTBkMDAwMDA1MGUsCiAgICAgICAgMHg1MGYwMDAwMDUxMCwKICAgICAgICAweDUxMTAwMDAwNTEyLAogICAgICAgIDB4NTEzMDAwMDA1MTQsCiAgICAgICAgMHg1MTUwMDAwMDUxNiwKICAgICAgICAweDUxNzAwMDAwNTE4LAogICAgICAgIDB4NTE5MDAwMDA1MWEsCiAgICAgICAgMHg1MWIwMDAwMDUxYywKICAgICAgICAweDUxZDAwMDAwNTFlLAogICAgICAgIDB4NTFmMDAwMDA1MjAsCiAgICAgICAgMHg1MjEwMDAwMDUyMiwKICAgICAgICAweDUyMzAwMDAwNTI0LAogICAgICAgIDB4NTI1MDAwMDA1MjYsCiAgICAgICAgMHg1MjcwMDAwMDUyOCwKICAgICAgICAweDU1OTAwMDAwNTVhLAogICAgICAgIDB4NTYxMDAwMDA1ODcsCiAgICAgICAgMHg1OTEwMDAwMDViZSwKICAgICAgICAweDViZjAwMDAwNWMwLAogICAgICAgIDB4NWMxMDAwMDA1YzMsCiAgICAgICAgMHg1YzQwMDAwMDVjNiwKICAgICAgICAweDVjNzAwMDAwNWM4LAogICAgICAgIDB4NWQwMDAwMDA1ZWIsCiAgICAgICAgMHg1ZjAwMDAwMDVmMywKICAgICAgICAweDYxMDAwMDAwNjFiLAogICAgICAgIDB4NjIwMDAwMDA2NDAsCiAgICAgICAgMHg2NDEwMDAwMDY2MCwKICAgICAgICAweDY2ZTAwMDAwNjc1LAogICAgICAgIDB4Njc5MDAwMDA2ZDQsCiAgICAgICAgMHg2ZDUwMDAwMDZkZCwKICAgICAgICAweDZkZjAwMDAwNmU5LAogICAgICAgIDB4NmVhMDAwMDA2ZjAsCiAgICAgICAgMHg2ZmEwMDAwMDcwMCwKICAgICAgICAweDcxMDAwMDAwNzRiLAogICAgICAgIDB4NzRkMDAwMDA3YjIsCiAgICAgICAgMHg3YzAwMDAwMDdmNiwKICAgICAgICAweDgwMDAwMDAwODJlLAogICAgICAgIDB4ODQwMDAwMDA4NWMsCiAgICAgICAgMHg4YTAwMDAwMDhhMSwKICAgICAgICAweDhhMjAwMDAwOGFkLAogICAgICAgIDB4OGU0MDAwMDA4ZmYsCiAgICAgICAgMHg5MDAwMDAwMDk1OCwKICAgICAgICAweDk2MDAwMDAwOTY0LAogICAgICAgIDB4OTY2MDAwMDA5NzAsCiAgICAgICAgMHg5NzEwMDAwMDk3OCwKICAgICAgICAweDk3OTAwMDAwOTgwLAogICAgICAgIDB4OTgxMDAwMDA5ODQsCiAgICAgICAgMHg5ODUwMDAwMDk4ZCwKICAgICAgICAweDk4ZjAwMDAwOTkxLAogICAgICAgIDB4OTkzMDAwMDA5YTksCiAgICAgICAgMHg5YWEwMDAwMDliMSwKICAgICAgICAweDliMjAwMDAwOWIzLAogICAgICAgIDB4OWI2MDAwMDA5YmEsCiAgICAgICAgMHg5YmMwMDAwMDljNSwKICAgICAgICAweDljNzAwMDAwOWM5LAogICAgICAgIDB4OWNiMDAwMDA5Y2YsCiAgICAgICAgMHg5ZDcwMDAwMDlkOCwKICAgICAgICAweDllMDAwMDAwOWU0LAogICAgICAgIDB4OWU2MDAwMDA5ZjIsCiAgICAgICAgMHhhMDEwMDAwMGEwNCwKICAgICAgICAweGEwNTAwMDAwYTBiLAogICAgICAgIDB4YTBmMDAwMDBhMTEsCiAgICAgICAgMHhhMTMwMDAwMGEyOSwKICAgICAgICAweGEyYTAwMDAwYTMxLAogICAgICAgIDB4YTMyMDAwMDBhMzMsCiAgICAgICAgMHhhMzUwMDAwMGEzNiwKICAgICAgICAweGEzODAwMDAwYTNhLAogICAgICAgIDB4YTNjMDAwMDBhM2QsCiAgICAgICAgMHhhM2UwMDAwMGE0MywKICAgICAgICAweGE0NzAwMDAwYTQ5LAogICAgICAgIDB4YTRiMDAwMDBhNGUsCiAgICAgICAgMHhhNTEwMDAwMGE1MiwKICAgICAgICAweGE1YzAwMDAwYTVkLAogICAgICAgIDB4YTY2MDAwMDBhNzYsCiAgICAgICAgMHhhODEwMDAwMGE4NCwKICAgICAgICAweGE4NTAwMDAwYThlLAogICAgICAgIDB4YThmMDAwMDBhOTIsCiAgICAgICAgMHhhOTMwMDAwMGFhOSwKICAgICAgICAweGFhYTAwMDAwYWIxLAogICAgICAgIDB4YWIyMDAwMDBhYjQsCiAgICAgICAgMHhhYjUwMDAwMGFiYSwKICAgICAgICAweGFiYzAwMDAwYWM2LAogICAgICAgIDB4YWM3MDAwMDBhY2EsCiAgICAgICAgMHhhY2IwMDAwMGFjZSwKICAgICAgICAweGFkMDAwMDAwYWQxLAogICAgICAgIDB4YWUwMDAwMDBhZTQsCiAgICAgICAgMHhhZTYwMDAwMGFmMCwKICAgICAgICAweGIwMTAwMDAwYjA0LAogICAgICAgIDB4YjA1MDAwMDBiMGQsCiAgICAgICAgMHhiMGYwMDAwMGIxMSwKICAgICAgICAweGIxMzAwMDAwYjI5LAogICAgICAgIDB4YjJhMDAwMDBiMzEsCiAgICAgICAgMHhiMzIwMDAwMGIzNCwKICAgICAgICAweGIzNTAwMDAwYjNhLAogICAgICAgIDB4YjNjMDAwMDBiNDUsCiAgICAgICAgMHhiNDcwMDAwMGI0OSwKICAgICAgICAweGI0YjAwMDAwYjRlLAogICAgICAgIDB4YjU2MDAwMDBiNTgsCiAgICAgICAgMHhiNWYwMDAwMGI2NCwKICAgICAgICAweGI2NjAwMDAwYjcwLAogICAgICAgIDB4YjcxMDAwMDBiNzIsCiAgICAgICAgMHhiODIwMDAwMGI4NCwKICAgICAgICAweGI4NTAwMDAwYjhiLAogICAgICAgIDB4YjhlMDAwMDBiOTEsCiAgICAgICAgMHhiOTIwMDAwMGI5NiwKICAgICAgICAweGI5OTAwMDAwYjliLAogICAgICAgIDB4YjljMDAwMDBiOWQsCiAgICAgICAgMHhiOWUwMDAwMGJhMCwKICAgICAgICAweGJhMzAwMDAwYmE1LAogICAgICAgIDB4YmE4MDAwMDBiYWIsCiAgICAgICAgMHhiYWUwMDAwMGJiYSwKICAgICAgICAweGJiZTAwMDAwYmMzLAogICAgICAgIDB4YmM2MDAwMDBiYzksCiAgICAgICAgMHhiY2EwMDAwMGJjZSwKICAgICAgICAweGJkMDAwMDAwYmQxLAogICAgICAgIDB4YmQ3MDAwMDBiZDgsCiAgICAgICAgMHhiZTYwMDAwMGJmMCwKICAgICAgICAweGMwMTAwMDAwYzA0LAogICAgICAgIDB4YzA1MDAwMDBjMGQsCiAgICAgICAgMHhjMGUwMDAwMGMxMSwKICAgICAgICAweGMxMjAwMDAwYzI5LAogICAgICAgIDB4YzJhMDAwMDBjMzQsCiAgICAgICAgMHhjMzUwMDAwMGMzYSwKICAgICAgICAweGMzZDAwMDAwYzQ1LAogICAgICAgIDB4YzQ2MDAwMDBjNDksCiAgICAgICAgMHhjNGEwMDAwMGM0ZSwKICAgICAgICAweGM1NTAwMDAwYzU3LAogICAgICAgIDB4YzU4MDAwMDBjNWEsCiAgICAgICAgMHhjNjAwMDAwMGM2NCwKICAgICAgICAweGM2NjAwMDAwYzcwLAogICAgICAgIDB4YzgyMDAwMDBjODQsCiAgICAgICAgMHhjODUwMDAwMGM4ZCwKICAgICAgICAweGM4ZTAwMDAwYzkxLAogICAgICAgIDB4YzkyMDAwMDBjYTksCiAgICAgICAgMHhjYWEwMDAwMGNiNCwKICAgICAgICAweGNiNTAwMDAwY2JhLAogICAgICAgIDB4Y2JjMDAwMDBjYzUsCiAgICAgICAgMHhjYzYwMDAwMGNjOSwKICAgICAgICAweGNjYTAwMDAwY2NlLAogICAgICAgIDB4Y2Q1MDAwMDBjZDcsCiAgICAgICAgMHhjZGUwMDAwMGNkZiwKICAgICAgICAweGNlMDAwMDAwY2U0LAogICAgICAgIDB4Y2U2MDAwMDBjZjAsCiAgICAgICAgMHhjZjEwMDAwMGNmMywKICAgICAgICAweGQwMjAwMDAwZDA0LAogICAgICAgIDB4ZDA1MDAwMDBkMGQsCiAgICAgICAgMHhkMGUwMDAwMGQxMSwKICAgICAgICAweGQxMjAwMDAwZDNiLAogICAgICAgIDB4ZDNkMDAwMDBkNDUsCiAgICAgICAgMHhkNDYwMDAwMGQ0OSwKICAgICAgICAweGQ0YTAwMDAwZDRmLAogICAgICAgIDB4ZDU3MDAwMDBkNTgsCiAgICAgICAgMHhkNjAwMDAwMGQ2NCwKICAgICAgICAweGQ2NjAwMDAwZDcwLAogICAgICAgIDB4ZDdhMDAwMDBkODAsCiAgICAgICAgMHhkODIwMDAwMGQ4NCwKICAgICAgICAweGQ4NTAwMDAwZDk3LAogICAgICAgIDB4ZDlhMDAwMDBkYjIsCiAgICAgICAgMHhkYjMwMDAwMGRiYywKICAgICAgICAweGRiZDAwMDAwZGJlLAogICAgICAgIDB4ZGMwMDAwMDBkYzcsCiAgICAgICAgMHhkY2EwMDAwMGRjYiwKICAgICAgICAweGRjZjAwMDAwZGQ1LAogICAgICAgIDB4ZGQ2MDAwMDBkZDcsCiAgICAgICAgMHhkZDgwMDAwMGRlMCwKICAgICAgICAweGRmMjAwMDAwZGY0LAogICAgICAgIDB4ZTAxMDAwMDBlMzMsCiAgICAgICAgMHhlMzQwMDAwMGUzYiwKICAgICAgICAweGU0MDAwMDAwZTRmLAogICAgICAgIDB4ZTUwMDAwMDBlNWEsCiAgICAgICAgMHhlODEwMDAwMGU4MywKICAgICAgICAweGU4NDAwMDAwZTg1LAogICAgICAgIDB4ZTg3MDAwMDBlODksCiAgICAgICAgMHhlOGEwMDAwMGU4YiwKICAgICAgICAweGU4ZDAwMDAwZThlLAogICAgICAgIDB4ZTk0MDAwMDBlOTgsCiAgICAgICAgMHhlOTkwMDAwMGVhMCwKICAgICAgICAweGVhMTAwMDAwZWE0LAogICAgICAgIDB4ZWE1MDAwMDBlYTYsCiAgICAgICAgMHhlYTcwMDAwMGVhOCwKICAgICAgICAweGVhYTAwMDAwZWFjLAogICAgICAgIDB4ZWFkMDAwMDBlYjMsCiAgICAgICAgMHhlYjQwMDAwMGViYSwKICAgICAgICAweGViYjAwMDAwZWJlLAogICAgICAgIDB4ZWMwMDAwMDBlYzUsCiAgICAgICAgMHhlYzYwMDAwMGVjNywKICAgICAgICAweGVjODAwMDAwZWNlLAogICAgICAgIDB4ZWQwMDAwMDBlZGEsCiAgICAgICAgMHhlZGUwMDAwMGVlMCwKICAgICAgICAweGYwMDAwMDAwZjAxLAogICAgICAgIDB4ZjBiMDAwMDBmMGMsCiAgICAgICAgMHhmMTgwMDAwMGYxYSwKICAgICAgICAweGYyMDAwMDAwZjJhLAogICAgICAgIDB4ZjM1MDAwMDBmMzYsCiAgICAgICAgMHhmMzcwMDAwMGYzOCwKICAgICAgICAweGYzOTAwMDAwZjNhLAogICAgICAgIDB4ZjNlMDAwMDBmNDMsCiAgICAgICAgMHhmNDQwMDAwMGY0OCwKICAgICAgICAweGY0OTAwMDAwZjRkLAogICAgICAgIDB4ZjRlMDAwMDBmNTIsCiAgICAgICAgMHhmNTMwMDAwMGY1NywKICAgICAgICAweGY1ODAwMDAwZjVjLAogICAgICAgIDB4ZjVkMDAwMDBmNjksCiAgICAgICAgMHhmNmEwMDAwMGY2ZCwKICAgICAgICAweGY3MTAwMDAwZjczLAogICAgICAgIDB4Zjc0MDAwMDBmNzUsCiAgICAgICAgMHhmN2EwMDAwMGY4MSwKICAgICAgICAweGY4MjAwMDAwZjg1LAogICAgICAgIDB4Zjg2MDAwMDBmOTMsCiAgICAgICAgMHhmOTQwMDAwMGY5OCwKICAgICAgICAweGY5OTAwMDAwZjlkLAogICAgICAgIDB4ZjllMDAwMDBmYTIsCiAgICAgICAgMHhmYTMwMDAwMGZhNywKICAgICAgICAweGZhODAwMDAwZmFjLAogICAgICAgIDB4ZmFkMDAwMDBmYjksCiAgICAgICAgMHhmYmEwMDAwMGZiZCwKICAgICAgICAweGZjNjAwMDAwZmM3LAogICAgICAgIDB4MTAwMDAwMDAxMDRhLAogICAgICAgIDB4MTA1MDAwMDAxMDllLAogICAgICAgIDB4MTBkMDAwMDAxMGZiLAogICAgICAgIDB4MTBmZDAwMDAxMTAwLAogICAgICAgIDB4MTIwMDAwMDAxMjQ5LAogICAgICAgIDB4MTI0YTAwMDAxMjRlLAogICAgICAgIDB4MTI1MDAwMDAxMjU3LAogICAgICAgIDB4MTI1ODAwMDAxMjU5LAogICAgICAgIDB4MTI1YTAwMDAxMjVlLAogICAgICAgIDB4MTI2MDAwMDAxMjg5LAogICAgICAgIDB4MTI4YTAwMDAxMjhlLAogICAgICAgIDB4MTI5MDAwMDAxMmIxLAogICAgICAgIDB4MTJiMjAwMDAxMmI2LAogICAgICAgIDB4MTJiODAwMDAxMmJmLAogICAgICAgIDB4MTJjMDAwMDAxMmMxLAogICAgICAgIDB4MTJjMjAwMDAxMmM2LAogICAgICAgIDB4MTJjODAwMDAxMmQ3LAogICAgICAgIDB4MTJkODAwMDAxMzExLAogICAgICAgIDB4MTMxMjAwMDAxMzE2LAogICAgICAgIDB4MTMxODAwMDAxMzViLAogICAgICAgIDB4MTM1ZDAwMDAxMzYwLAogICAgICAgIDB4MTM4MDAwMDAxMzkwLAogICAgICAgIDB4MTNhMDAwMDAxM2Y1LAogICAgICAgIDB4MTQwMTAwMDAxNjZkLAogICAgICAgIDB4MTY2ZjAwMDAxNjgwLAogICAgICAgIDB4MTY4MTAwMDAxNjliLAogICAgICAgIDB4MTZhMDAwMDAxNmViLAogICAgICAgIDB4MTcwMDAwMDAxNzBkLAogICAgICAgIDB4MTcwZTAwMDAxNzE1LAogICAgICAgIDB4MTcyMDAwMDAxNzM1LAogICAgICAgIDB4MTc0MDAwMDAxNzU0LAogICAgICAgIDB4MTc2MDAwMDAxNzZkLAogICAgICAgIDB4MTc2ZTAwMDAxNzcxLAogICAgICAgIDB4MTc3MjAwMDAxNzc0LAogICAgICAgIDB4MTc4MDAwMDAxN2I0LAogICAgICAgIDB4MTdiNjAwMDAxN2Q0LAogICAgICAgIDB4MTdkNzAwMDAxN2Q4LAogICAgICAgIDB4MTdkYzAwMDAxN2RlLAogICAgICAgIDB4MTdlMDAwMDAxN2VhLAogICAgICAgIDB4MTgxMDAwMDAxODFhLAogICAgICAgIDB4MTgyMDAwMDAxODc4LAogICAgICAgIDB4MTg4MDAwMDAxOGFiLAogICAgICAgIDB4MThiMDAwMDAxOGY2LAogICAgICAgIDB4MTkwMDAwMDAxOTFkLAogICAgICAgIDB4MTkyMDAwMDAxOTJjLAogICAgICAgIDB4MTkzMDAwMDAxOTNjLAogICAgICAgIDB4MTk0NjAwMDAxOTZlLAogICAgICAgIDB4MTk3MDAwMDAxOTc1LAogICAgICAgIDB4MTk4MDAwMDAxOWFjLAogICAgICAgIDB4MTliMDAwMDAxOWNhLAogICAgICAgIDB4MTlkMDAwMDAxOWRhLAogICAgICAgIDB4MWEwMDAwMDAxYTFjLAogICAgICAgIDB4MWEyMDAwMDAxYTVmLAogICAgICAgIDB4MWE2MDAwMDAxYTdkLAogICAgICAgIDB4MWE3ZjAwMDAxYThhLAogICAgICAgIDB4MWE5MDAwMDAxYTlhLAogICAgICAgIDB4MWFhNzAwMDAxYWE4LAogICAgICAgIDB4MWIwMDAwMDAxYjRjLAogICAgICAgIDB4MWI1MDAwMDAxYjVhLAogICAgICAgIDB4MWI2YjAwMDAxYjc0LAogICAgICAgIDB4MWI4MDAwMDAxYmY0LAogICAgICAgIDB4MWMwMDAwMDAxYzM4LAogICAgICAgIDB4MWM0MDAwMDAxYzRhLAogICAgICAgIDB4MWM0ZDAwMDAxYzdlLAogICAgICAgIDB4MWNkMDAwMDAxY2QzLAogICAgICAgIDB4MWNkNDAwMDAxY2Y3LAogICAgICAgIDB4MWQwMDAwMDAxZDJjLAogICAgICAgIDB4MWQyZjAwMDAxZDMwLAogICAgICAgIDB4MWQzYjAwMDAxZDNjLAogICAgICAgIDB4MWQ0ZTAwMDAxZDRmLAogICAgICAgIDB4MWQ2YjAwMDAxZDc4LAogICAgICAgIDB4MWQ3OTAwMDAxZDliLAogICAgICAgIDB4MWRjMDAwMDAxZGU3LAogICAgICAgIDB4MWRmYzAwMDAxZTAwLAogICAgICAgIDB4MWUwMTAwMDAxZTAyLAogICAgICAgIDB4MWUwMzAwMDAxZTA0LAogICAgICAgIDB4MWUwNTAwMDAxZTA2LAogICAgICAgIDB4MWUwNzAwMDAxZTA4LAogICAgICAgIDB4MWUwOTAwMDAxZTBhLAogICAgICAgIDB4MWUwYjAwMDAxZTBjLAogICAgICAgIDB4MWUwZDAwMDAxZTBlLAogICAgICAgIDB4MWUwZjAwMDAxZTEwLAogICAgICAgIDB4MWUxMTAwMDAxZTEyLAogICAgICAgIDB4MWUxMzAwMDAxZTE0LAogICAgICAgIDB4MWUxNTAwMDAxZTE2LAogICAgICAgIDB4MWUxNzAwMDAxZTE4LAogICAgICAgIDB4MWUxOTAwMDAxZTFhLAogICAgICAgIDB4MWUxYjAwMDAxZTFjLAogICAgICAgIDB4MWUxZDAwMDAxZTFlLAogICAgICAgIDB4MWUxZjAwMDAxZTIwLAogICAgICAgIDB4MWUyMTAwMDAxZTIyLAogICAgICAgIDB4MWUyMzAwMDAxZTI0LAogICAgICAgIDB4MWUyNTAwMDAxZTI2LAogICAgICAgIDB4MWUyNzAwMDAxZTI4LAogICAgICAgIDB4MWUyOTAwMDAxZTJhLAogICAgICAgIDB4MWUyYjAwMDAxZTJjLAogICAgICAgIDB4MWUyZDAwMDAxZTJlLAogICAgICAgIDB4MWUyZjAwMDAxZTMwLAogICAgICAgIDB4MWUzMTAwMDAxZTMyLAogICAgICAgIDB4MWUzMzAwMDAxZTM0LAogICAgICAgIDB4MWUzNTAwMDAxZTM2LAogICAgICAgIDB4MWUzNzAwMDAxZTM4LAogICAgICAgIDB4MWUzOTAwMDAxZTNhLAogICAgICAgIDB4MWUzYjAwMDAxZTNjLAogICAgICAgIDB4MWUzZDAwMDAxZTNlLAogICAgICAgIDB4MWUzZjAwMDAxZTQwLAogICAgICAgIDB4MWU0MTAwMDAxZTQyLAogICAgICAgIDB4MWU0MzAwMDAxZTQ0LAogICAgICAgIDB4MWU0NTAwMDAxZTQ2LAogICAgICAgIDB4MWU0NzAwMDAxZTQ4LAogICAgICAgIDB4MWU0OTAwMDAxZTRhLAogICAgICAgIDB4MWU0YjAwMDAxZTRjLAogICAgICAgIDB4MWU0ZDAwMDAxZTRlLAogICAgICAgIDB4MWU0ZjAwMDAxZTUwLAogICAgICAgIDB4MWU1MTAwMDAxZTUyLAogICAgICAgIDB4MWU1MzAwMDAxZTU0LAogICAgICAgIDB4MWU1NTAwMDAxZTU2LAogICAgICAgIDB4MWU1NzAwMDAxZTU4LAogICAgICAgIDB4MWU1OTAwMDAxZTVhLAogICAgICAgIDB4MWU1YjAwMDAxZTVjLAogICAgICAgIDB4MWU1ZDAwMDAxZTVlLAogICAgICAgIDB4MWU1ZjAwMDAxZTYwLAogICAgICAgIDB4MWU2MTAwMDAxZTYyLAogICAgICAgIDB4MWU2MzAwMDAxZTY0LAogICAgICAgIDB4MWU2NTAwMDAxZTY2LAogICAgICAgIDB4MWU2NzAwMDAxZTY4LAogICAgICAgIDB4MWU2OTAwMDAxZTZhLAogICAgICAgIDB4MWU2YjAwMDAxZTZjLAogICAgICAgIDB4MWU2ZDAwMDAxZTZlLAogICAgICAgIDB4MWU2ZjAwMDAxZTcwLAogICAgICAgIDB4MWU3MTAwMDAxZTcyLAogICAgICAgIDB4MWU3MzAwMDAxZTc0LAogICAgICAgIDB4MWU3NTAwMDAxZTc2LAogICAgICAgIDB4MWU3NzAwMDAxZTc4LAogICAgICAgIDB4MWU3OTAwMDAxZTdhLAogICAgICAgIDB4MWU3YjAwMDAxZTdjLAogICAgICAgIDB4MWU3ZDAwMDAxZTdlLAogICAgICAgIDB4MWU3ZjAwMDAxZTgwLAogICAgICAgIDB4MWU4MTAwMDAxZTgyLAogICAgICAgIDB4MWU4MzAwMDAxZTg0LAogICAgICAgIDB4MWU4NTAwMDAxZTg2LAogICAgICAgIDB4MWU4NzAwMDAxZTg4LAogICAgICAgIDB4MWU4OTAwMDAxZThhLAogICAgICAgIDB4MWU4YjAwMDAxZThjLAogICAgICAgIDB4MWU4ZDAwMDAxZThlLAogICAgICAgIDB4MWU4ZjAwMDAxZTkwLAogICAgICAgIDB4MWU5MTAwMDAxZTkyLAogICAgICAgIDB4MWU5MzAwMDAxZTk0LAogICAgICAgIDB4MWU5NTAwMDAxZTlhLAogICAgICAgIDB4MWU5YzAwMDAxZTllLAogICAgICAgIDB4MWU5ZjAwMDAxZWEwLAogICAgICAgIDB4MWVhMTAwMDAxZWEyLAogICAgICAgIDB4MWVhMzAwMDAxZWE0LAogICAgICAgIDB4MWVhNTAwMDAxZWE2LAogICAgICAgIDB4MWVhNzAwMDAxZWE4LAogICAgICAgIDB4MWVhOTAwMDAxZWFhLAogICAgICAgIDB4MWVhYjAwMDAxZWFjLAogICAgICAgIDB4MWVhZDAwMDAxZWFlLAogICAgICAgIDB4MWVhZjAwMDAxZWIwLAogICAgICAgIDB4MWViMTAwMDAxZWIyLAogICAgICAgIDB4MWViMzAwMDAxZWI0LAogICAgICAgIDB4MWViNTAwMDAxZWI2LAogICAgICAgIDB4MWViNzAwMDAxZWI4LAogICAgICAgIDB4MWViOTAwMDAxZWJhLAogICAgICAgIDB4MWViYjAwMDAxZWJjLAogICAgICAgIDB4MWViZDAwMDAxZWJlLAogICAgICAgIDB4MWViZjAwMDAxZWMwLAogICAgICAgIDB4MWVjMTAwMDAxZWMyLAogICAgICAgIDB4MWVjMzAwMDAxZWM0LAogICAgICAgIDB4MWVjNTAwMDAxZWM2LAogICAgICAgIDB4MWVjNzAwMDAxZWM4LAogICAgICAgIDB4MWVjOTAwMDAxZWNhLAogICAgICAgIDB4MWVjYjAwMDAxZWNjLAogICAgICAgIDB4MWVjZDAwMDAxZWNlLAogICAgICAgIDB4MWVjZjAwMDAxZWQwLAogICAgICAgIDB4MWVkMTAwMDAxZWQyLAogICAgICAgIDB4MWVkMzAwMDAxZWQ0LAogICAgICAgIDB4MWVkNTAwMDAxZWQ2LAogICAgICAgIDB4MWVkNzAwMDAxZWQ4LAogICAgICAgIDB4MWVkOTAwMDAxZWRhLAogICAgICAgIDB4MWVkYjAwMDAxZWRjLAogICAgICAgIDB4MWVkZDAwMDAxZWRlLAogICAgICAgIDB4MWVkZjAwMDAxZWUwLAogICAgICAgIDB4MWVlMTAwMDAxZWUyLAogICAgICAgIDB4MWVlMzAwMDAxZWU0LAogICAgICAgIDB4MWVlNTAwMDAxZWU2LAogICAgICAgIDB4MWVlNzAwMDAxZWU4LAogICAgICAgIDB4MWVlOTAwMDAxZWVhLAogICAgICAgIDB4MWVlYjAwMDAxZWVjLAogICAgICAgIDB4MWVlZDAwMDAxZWVlLAogICAgICAgIDB4MWVlZjAwMDAxZWYwLAogICAgICAgIDB4MWVmMTAwMDAxZWYyLAogICAgICAgIDB4MWVmMzAwMDAxZWY0LAogICAgICAgIDB4MWVmNTAwMDAxZWY2LAogICAgICAgIDB4MWVmNzAwMDAxZWY4LAogICAgICAgIDB4MWVmOTAwMDAxZWZhLAogICAgICAgIDB4MWVmYjAwMDAxZWZjLAogICAgICAgIDB4MWVmZDAwMDAxZWZlLAogICAgICAgIDB4MWVmZjAwMDAxZjA4LAogICAgICAgIDB4MWYxMDAwMDAxZjE2LAogICAgICAgIDB4MWYyMDAwMDAxZjI4LAogICAgICAgIDB4MWYzMDAwMDAxZjM4LAogICAgICAgIDB4MWY0MDAwMDAxZjQ2LAogICAgICAgIDB4MWY1MDAwMDAxZjU4LAogICAgICAgIDB4MWY2MDAwMDAxZjY4LAogICAgICAgIDB4MWY3MDAwMDAxZjcxLAogICAgICAgIDB4MWY3MjAwMDAxZjczLAogICAgICAgIDB4MWY3NDAwMDAxZjc1LAogICAgICAgIDB4MWY3NjAwMDAxZjc3LAogICAgICAgIDB4MWY3ODAwMDAxZjc5LAogICAgICAgIDB4MWY3YTAwMDAxZjdiLAogICAgICAgIDB4MWY3YzAwMDAxZjdkLAogICAgICAgIDB4MWZiMDAwMDAxZmIyLAogICAgICAgIDB4MWZiNjAwMDAxZmI3LAogICAgICAgIDB4MWZjNjAwMDAxZmM3LAogICAgICAgIDB4MWZkMDAwMDAxZmQzLAogICAgICAgIDB4MWZkNjAwMDAxZmQ4LAogICAgICAgIDB4MWZlMDAwMDAxZmUzLAogICAgICAgIDB4MWZlNDAwMDAxZmU4LAogICAgICAgIDB4MWZmNjAwMDAxZmY3LAogICAgICAgIDB4MjE0ZTAwMDAyMTRmLAogICAgICAgIDB4MjE4NDAwMDAyMTg1LAogICAgICAgIDB4MmMzMDAwMDAyYzVmLAogICAgICAgIDB4MmM2MTAwMDAyYzYyLAogICAgICAgIDB4MmM2NTAwMDAyYzY3LAogICAgICAgIDB4MmM2ODAwMDAyYzY5LAogICAgICAgIDB4MmM2YTAwMDAyYzZiLAogICAgICAgIDB4MmM2YzAwMDAyYzZkLAogICAgICAgIDB4MmM3MTAwMDAyYzcyLAogICAgICAgIDB4MmM3MzAwMDAyYzc1LAogICAgICAgIDB4MmM3NjAwMDAyYzdjLAogICAgICAgIDB4MmM4MTAwMDAyYzgyLAogICAgICAgIDB4MmM4MzAwMDAyYzg0LAogICAgICAgIDB4MmM4NTAwMDAyYzg2LAogICAgICAgIDB4MmM4NzAwMDAyYzg4LAogICAgICAgIDB4MmM4OTAwMDAyYzhhLAogICAgICAgIDB4MmM4YjAwMDAyYzhjLAogICAgICAgIDB4MmM4ZDAwMDAyYzhlLAogICAgICAgIDB4MmM4ZjAwMDAyYzkwLAogICAgICAgIDB4MmM5MTAwMDAyYzkyLAogICAgICAgIDB4MmM5MzAwMDAyYzk0LAogICAgICAgIDB4MmM5NTAwMDAyYzk2LAogICAgICAgIDB4MmM5NzAwMDAyYzk4LAogICAgICAgIDB4MmM5OTAwMDAyYzlhLAogICAgICAgIDB4MmM5YjAwMDAyYzljLAogICAgICAgIDB4MmM5ZDAwMDAyYzllLAogICAgICAgIDB4MmM5ZjAwMDAyY2EwLAogICAgICAgIDB4MmNhMTAwMDAyY2EyLAogICAgICAgIDB4MmNhMzAwMDAyY2E0LAogICAgICAgIDB4MmNhNTAwMDAyY2E2LAogICAgICAgIDB4MmNhNzAwMDAyY2E4LAogICAgICAgIDB4MmNhOTAwMDAyY2FhLAogICAgICAgIDB4MmNhYjAwMDAyY2FjLAogICAgICAgIDB4MmNhZDAwMDAyY2FlLAogICAgICAgIDB4MmNhZjAwMDAyY2IwLAogICAgICAgIDB4MmNiMTAwMDAyY2IyLAogICAgICAgIDB4MmNiMzAwMDAyY2I0LAogICAgICAgIDB4MmNiNTAwMDAyY2I2LAogICAgICAgIDB4MmNiNzAwMDAyY2I4LAogICAgICAgIDB4MmNiOTAwMDAyY2JhLAogICAgICAgIDB4MmNiYjAwMDAyY2JjLAogICAgICAgIDB4MmNiZDAwMDAyY2JlLAogICAgICAgIDB4MmNiZjAwMDAyY2MwLAogICAgICAgIDB4MmNjMTAwMDAyY2MyLAogICAgICAgIDB4MmNjMzAwMDAyY2M0LAogICAgICAgIDB4MmNjNTAwMDAyY2M2LAogICAgICAgIDB4MmNjNzAwMDAyY2M4LAogICAgICAgIDB4MmNjOTAwMDAyY2NhLAogICAgICAgIDB4MmNjYjAwMDAyY2NjLAogICAgICAgIDB4MmNjZDAwMDAyY2NlLAogICAgICAgIDB4MmNjZjAwMDAyY2QwLAogICAgICAgIDB4MmNkMTAwMDAyY2QyLAogICAgICAgIDB4MmNkMzAwMDAyY2Q0LAogICAgICAgIDB4MmNkNTAwMDAyY2Q2LAogICAgICAgIDB4MmNkNzAwMDAyY2Q4LAogICAgICAgIDB4MmNkOTAwMDAyY2RhLAogICAgICAgIDB4MmNkYjAwMDAyY2RjLAogICAgICAgIDB4MmNkZDAwMDAyY2RlLAogICAgICAgIDB4MmNkZjAwMDAyY2UwLAogICAgICAgIDB4MmNlMTAwMDAyY2UyLAogICAgICAgIDB4MmNlMzAwMDAyY2U1LAogICAgICAgIDB4MmNlYzAwMDAyY2VkLAogICAgICAgIDB4MmNlZTAwMDAyY2YyLAogICAgICAgIDB4MmNmMzAwMDAyY2Y0LAogICAgICAgIDB4MmQwMDAwMDAyZDI2LAogICAgICAgIDB4MmQyNzAwMDAyZDI4LAogICAgICAgIDB4MmQyZDAwMDAyZDJlLAogICAgICAgIDB4MmQzMDAwMDAyZDY4LAogICAgICAgIDB4MmQ3ZjAwMDAyZDk3LAogICAgICAgIDB4MmRhMDAwMDAyZGE3LAogICAgICAgIDB4MmRhODAwMDAyZGFmLAogICAgICAgIDB4MmRiMDAwMDAyZGI3LAogICAgICAgIDB4MmRiODAwMDAyZGJmLAogICAgICAgIDB4MmRjMDAwMDAyZGM3LAogICAgICAgIDB4MmRjODAwMDAyZGNmLAogICAgICAgIDB4MmRkMDAwMDAyZGQ3LAogICAgICAgIDB4MmRkODAwMDAyZGRmLAogICAgICAgIDB4MmRlMDAwMDAyZTAwLAogICAgICAgIDB4MmUyZjAwMDAyZTMwLAogICAgICAgIDB4MzAwNTAwMDAzMDA4LAogICAgICAgIDB4MzAyYTAwMDAzMDJlLAogICAgICAgIDB4MzAzYzAwMDAzMDNkLAogICAgICAgIDB4MzA0MTAwMDAzMDk3LAogICAgICAgIDB4MzA5OTAwMDAzMDliLAogICAgICAgIDB4MzA5ZDAwMDAzMDlmLAogICAgICAgIDB4MzBhMTAwMDAzMGZiLAogICAgICAgIDB4MzBmYzAwMDAzMGZmLAogICAgICAgIDB4MzEwNTAwMDAzMTJlLAogICAgICAgIDB4MzFhMDAwMDAzMWJiLAogICAgICAgIDB4MzFmMDAwMDAzMjAwLAogICAgICAgIDB4MzQwMDAwMDA0ZGI2LAogICAgICAgIDB4NGUwMDAwMDA5ZmNkLAogICAgICAgIDB4YTAwMDAwMDBhNDhkLAogICAgICAgIDB4YTRkMDAwMDBhNGZlLAogICAgICAgIDB4YTUwMDAwMDBhNjBkLAogICAgICAgIDB4YTYxMDAwMDBhNjJjLAogICAgICAgIDB4YTY0MTAwMDBhNjQyLAogICAgICAgIDB4YTY0MzAwMDBhNjQ0LAogICAgICAgIDB4YTY0NTAwMDBhNjQ2LAogICAgICAgIDB4YTY0NzAwMDBhNjQ4LAogICAgICAgIDB4YTY0OTAwMDBhNjRhLAogICAgICAgIDB4YTY0YjAwMDBhNjRjLAogICAgICAgIDB4YTY0ZDAwMDBhNjRlLAogICAgICAgIDB4YTY0ZjAwMDBhNjUwLAogICAgICAgIDB4YTY1MTAwMDBhNjUyLAogICAgICAgIDB4YTY1MzAwMDBhNjU0LAogICAgICAgIDB4YTY1NTAwMDBhNjU2LAogICAgICAgIDB4YTY1NzAwMDBhNjU4LAogICAgICAgIDB4YTY1OTAwMDBhNjVhLAogICAgICAgIDB4YTY1YjAwMDBhNjVjLAogICAgICAgIDB4YTY1ZDAwMDBhNjVlLAogICAgICAgIDB4YTY1ZjAwMDBhNjYwLAogICAgICAgIDB4YTY2MTAwMDBhNjYyLAogICAgICAgIDB4YTY2MzAwMDBhNjY0LAogICAgICAgIDB4YTY2NTAwMDBhNjY2LAogICAgICAgIDB4YTY2NzAwMDBhNjY4LAogICAgICAgIDB4YTY2OTAwMDBhNjZhLAogICAgICAgIDB4YTY2YjAwMDBhNjZjLAogICAgICAgIDB4YTY2ZDAwMDBhNjcwLAogICAgICAgIDB4YTY3NDAwMDBhNjdlLAogICAgICAgIDB4YTY3ZjAwMDBhNjgwLAogICAgICAgIDB4YTY4MTAwMDBhNjgyLAogICAgICAgIDB4YTY4MzAwMDBhNjg0LAogICAgICAgIDB4YTY4NTAwMDBhNjg2LAogICAgICAgIDB4YTY4NzAwMDBhNjg4LAogICAgICAgIDB4YTY4OTAwMDBhNjhhLAogICAgICAgIDB4YTY4YjAwMDBhNjhjLAogICAgICAgIDB4YTY4ZDAwMDBhNjhlLAogICAgICAgIDB4YTY4ZjAwMDBhNjkwLAogICAgICAgIDB4YTY5MTAwMDBhNjkyLAogICAgICAgIDB4YTY5MzAwMDBhNjk0LAogICAgICAgIDB4YTY5NTAwMDBhNjk2LAogICAgICAgIDB4YTY5NzAwMDBhNjk4LAogICAgICAgIDB4YTY5ZjAwMDBhNmU2LAogICAgICAgIDB4YTZmMDAwMDBhNmYyLAogICAgICAgIDB4YTcxNzAwMDBhNzIwLAogICAgICAgIDB4YTcyMzAwMDBhNzI0LAogICAgICAgIDB4YTcyNTAwMDBhNzI2LAogICAgICAgIDB4YTcyNzAwMDBhNzI4LAogICAgICAgIDB4YTcyOTAwMDBhNzJhLAogICAgICAgIDB4YTcyYjAwMDBhNzJjLAogICAgICAgIDB4YTcyZDAwMDBhNzJlLAogICAgICAgIDB4YTcyZjAwMDBhNzMyLAogICAgICAgIDB4YTczMzAwMDBhNzM0LAogICAgICAgIDB4YTczNTAwMDBhNzM2LAogICAgICAgIDB4YTczNzAwMDBhNzM4LAogICAgICAgIDB4YTczOTAwMDBhNzNhLAogICAgICAgIDB4YTczYjAwMDBhNzNjLAogICAgICAgIDB4YTczZDAwMDBhNzNlLAogICAgICAgIDB4YTczZjAwMDBhNzQwLAogICAgICAgIDB4YTc0MTAwMDBhNzQyLAogICAgICAgIDB4YTc0MzAwMDBhNzQ0LAogICAgICAgIDB4YTc0NTAwMDBhNzQ2LAogICAgICAgIDB4YTc0NzAwMDBhNzQ4LAogICAgICAgIDB4YTc0OTAwMDBhNzRhLAogICAgICAgIDB4YTc0YjAwMDBhNzRjLAogICAgICAgIDB4YTc0ZDAwMDBhNzRlLAogICAgICAgIDB4YTc0ZjAwMDBhNzUwLAogICAgICAgIDB4YTc1MTAwMDBhNzUyLAogICAgICAgIDB4YTc1MzAwMDBhNzU0LAogICAgICAgIDB4YTc1NTAwMDBhNzU2LAogICAgICAgIDB4YTc1NzAwMDBhNzU4LAogICAgICAgIDB4YTc1OTAwMDBhNzVhLAogICAgICAgIDB4YTc1YjAwMDBhNzVjLAogICAgICAgIDB4YTc1ZDAwMDBhNzVlLAogICAgICAgIDB4YTc1ZjAwMDBhNzYwLAogICAgICAgIDB4YTc2MTAwMDBhNzYyLAogICAgICAgIDB4YTc2MzAwMDBhNzY0LAogICAgICAgIDB4YTc2NTAwMDBhNzY2LAogICAgICAgIDB4YTc2NzAwMDBhNzY4LAogICAgICAgIDB4YTc2OTAwMDBhNzZhLAogICAgICAgIDB4YTc2YjAwMDBhNzZjLAogICAgICAgIDB4YTc2ZDAwMDBhNzZlLAogICAgICAgIDB4YTc2ZjAwMDBhNzcwLAogICAgICAgIDB4YTc3MTAwMDBhNzc5LAogICAgICAgIDB4YTc3YTAwMDBhNzdiLAogICAgICAgIDB4YTc3YzAwMDBhNzdkLAogICAgICAgIDB4YTc3ZjAwMDBhNzgwLAogICAgICAgIDB4YTc4MTAwMDBhNzgyLAogICAgICAgIDB4YTc4MzAwMDBhNzg0LAogICAgICAgIDB4YTc4NTAwMDBhNzg2LAogICAgICAgIDB4YTc4NzAwMDBhNzg5LAogICAgICAgIDB4YTc4YzAwMDBhNzhkLAogICAgICAgIDB4YTc4ZTAwMDBhNzhmLAogICAgICAgIDB4YTc5MTAwMDBhNzkyLAogICAgICAgIDB4YTc5MzAwMDBhNzk0LAogICAgICAgIDB4YTdhMTAwMDBhN2EyLAogICAgICAgIDB4YTdhMzAwMDBhN2E0LAogICAgICAgIDB4YTdhNTAwMDBhN2E2LAogICAgICAgIDB4YTdhNzAwMDBhN2E4LAogICAgICAgIDB4YTdhOTAwMDBhN2FhLAogICAgICAgIDB4YTdmYTAwMDBhODI4LAogICAgICAgIDB4YTg0MDAwMDBhODc0LAogICAgICAgIDB4YTg4MDAwMDBhOGM1LAogICAgICAgIDB4YThkMDAwMDBhOGRhLAogICAgICAgIDB4YThlMDAwMDBhOGY4LAogICAgICAgIDB4YThmYjAwMDBhOGZjLAogICAgICAgIDB4YTkwMDAwMDBhOTJlLAogICAgICAgIDB4YTkzMDAwMDBhOTU0LAogICAgICAgIDB4YTk4MDAwMDBhOWMxLAogICAgICAgIDB4YTljZjAwMDBhOWRhLAogICAgICAgIDB4YWEwMDAwMDBhYTM3LAogICAgICAgIDB4YWE0MDAwMDBhYTRlLAogICAgICAgIDB4YWE1MDAwMDBhYTVhLAogICAgICAgIDB4YWE2MDAwMDBhYTc3LAogICAgICAgIDB4YWE3YTAwMDBhYTdjLAogICAgICAgIDB4YWE4MDAwMDBhYWMzLAogICAgICAgIDB4YWFkYjAwMDBhYWRlLAogICAgICAgIDB4YWFlMDAwMDBhYWYwLAogICAgICAgIDB4YWFmMjAwMDBhYWY3LAogICAgICAgIDB4YWIwMTAwMDBhYjA3LAogICAgICAgIDB4YWIwOTAwMDBhYjBmLAogICAgICAgIDB4YWIxMTAwMDBhYjE3LAogICAgICAgIDB4YWIyMDAwMDBhYjI3LAogICAgICAgIDB4YWIyODAwMDBhYjJmLAogICAgICAgIDB4YWJjMDAwMDBhYmViLAogICAgICAgIDB4YWJlYzAwMDBhYmVlLAogICAgICAgIDB4YWJmMDAwMDBhYmZhLAogICAgICAgIDB4YWMwMDAwMDBkN2E0LAogICAgICAgIDB4ZmEwZTAwMDBmYTEwLAogICAgICAgIDB4ZmExMTAwMDBmYTEyLAogICAgICAgIDB4ZmExMzAwMDBmYTE1LAogICAgICAgIDB4ZmExZjAwMDBmYTIwLAogICAgICAgIDB4ZmEyMTAwMDBmYTIyLAogICAgICAgIDB4ZmEyMzAwMDBmYTI1LAogICAgICAgIDB4ZmEyNzAwMDBmYTJhLAogICAgICAgIDB4ZmIxZTAwMDBmYjFmLAogICAgICAgIDB4ZmUyMDAwMDBmZTI3LAogICAgICAgIDB4ZmU3MzAwMDBmZTc0LAogICAgICAgIDB4MTAwMDAwMDAxMDAwYywKICAgICAgICAweDEwMDBkMDAwMTAwMjcsCiAgICAgICAgMHgxMDAyODAwMDEwMDNiLAogICAgICAgIDB4MTAwM2MwMDAxMDAzZSwKICAgICAgICAweDEwMDNmMDAwMTAwNGUsCiAgICAgICAgMHgxMDA1MDAwMDEwMDVlLAogICAgICAgIDB4MTAwODAwMDAxMDBmYiwKICAgICAgICAweDEwMWZkMDAwMTAxZmUsCiAgICAgICAgMHgxMDI4MDAwMDEwMjlkLAogICAgICAgIDB4MTAyYTAwMDAxMDJkMSwKICAgICAgICAweDEwMzAwMDAwMTAzMWYsCiAgICAgICAgMHgxMDMzMDAwMDEwMzQxLAogICAgICAgIDB4MTAzNDIwMDAxMDM0YSwKICAgICAgICAweDEwMzgwMDAwMTAzOWUsCiAgICAgICAgMHgxMDNhMDAwMDEwM2M0LAogICAgICAgIDB4MTAzYzgwMDAxMDNkMCwKICAgICAgICAweDEwNDI4MDAwMTA0OWUsCiAgICAgICAgMHgxMDRhMDAwMDEwNGFhLAogICAgICAgIDB4MTA4MDAwMDAxMDgwNiwKICAgICAgICAweDEwODA4MDAwMTA4MDksCiAgICAgICAgMHgxMDgwYTAwMDEwODM2LAogICAgICAgIDB4MTA4MzcwMDAxMDgzOSwKICAgICAgICAweDEwODNjMDAwMTA4M2QsCiAgICAgICAgMHgxMDgzZjAwMDEwODU2LAogICAgICAgIDB4MTA5MDAwMDAxMDkxNiwKICAgICAgICAweDEwOTIwMDAwMTA5M2EsCiAgICAgICAgMHgxMDk4MDAwMDEwOWI4LAogICAgICAgIDB4MTA5YmUwMDAxMDljMCwKICAgICAgICAweDEwYTAwMDAwMTBhMDQsCiAgICAgICAgMHgxMGEwNTAwMDEwYTA3LAogICAgICAgIDB4MTBhMGMwMDAxMGExNCwKICAgICAgICAweDEwYTE1MDAwMTBhMTgsCiAgICAgICAgMHgxMGExOTAwMDEwYTM0LAogICAgICAgIDB4MTBhMzgwMDAxMGEzYiwKICAgICAgICAweDEwYTNmMDAwMTBhNDAsCiAgICAgICAgMHgxMGE2MDAwMDEwYTdkLAogICAgICAgIDB4MTBiMDAwMDAxMGIzNiwKICAgICAgICAweDEwYjQwMDAwMTBiNTYsCiAgICAgICAgMHgxMGI2MDAwMDEwYjczLAogICAgICAgIDB4MTBjMDAwMDAxMGM0OSwKICAgICAgICAweDExMDAwMDAwMTEwNDcsCiAgICAgICAgMHgxMTA2NjAwMDExMDcwLAogICAgICAgIDB4MTEwODAwMDAxMTBiYiwKICAgICAgICAweDExMGQwMDAwMTEwZTksCiAgICAgICAgMHgxMTBmMDAwMDExMGZhLAogICAgICAgIDB4MTExMDAwMDAxMTEzNSwKICAgICAgICAweDExMTM2MDAwMTExNDAsCiAgICAgICAgMHgxMTE4MDAwMDExMWM1LAogICAgICAgIDB4MTExZDAwMDAxMTFkYSwKICAgICAgICAweDExNjgwMDAwMTE2YjgsCiAgICAgICAgMHgxMTZjMDAwMDExNmNhLAogICAgICAgIDB4MTIwMDAwMDAxMjM2ZiwKICAgICAgICAweDEzMDAwMDAwMTM0MmYsCiAgICAgICAgMHgxNjgwMDAwMDE2YTM5LAogICAgICAgIDB4MTZmMDAwMDAxNmY0NSwKICAgICAgICAweDE2ZjUwMDAwMTZmN2YsCiAgICAgICAgMHgxNmY4ZjAwMDE2ZmEwLAogICAgICAgIDB4MWIwMDAwMDAxYjAwMiwKICAgICAgICAweDIwMDAwMDAwMmE2ZDcsCiAgICAgICAgMHgyYTcwMDAwMDJiNzM1LAogICAgICAgIDB4MmI3NDAwMDAyYjgxZSwKICAgICksCiAgICAnQ09OVEVYVEonOiAoCiAgICAgICAgMHgyMDBjMDAwMDIwMGUsCiAgICApLAogICAgJ0NPTlRFWFRPJzogKAogICAgICAgIDB4YjcwMDAwMDBiOCwKICAgICAgICAweDM3NTAwMDAwMzc2LAogICAgICAgIDB4NWYzMDAwMDA1ZjUsCiAgICAgICAgMHg2NjAwMDAwMDY2YSwKICAgICAgICAweDZmMDAwMDAwNmZhLAogICAgICAgIDB4MzBmYjAwMDAzMGZjLAogICAgKSwKfQpQSwMEFAAAAAAAAAAhALdj9LLVBgAA1QYAAC0AAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaWRuYS9pbnRyYW5nZXMucHkiIiIKR2l2ZW4gYSBsaXN0IG9mIGludGVnZXJzLCBtYWRlIHVwIG9mIChob3BlZnVsbHkpIGEgc21hbGwgbnVtYmVyIG9mIGxvbmcgcnVucwpvZiBjb25zZWN1dGl2ZSBpbnRlZ2VycywgY29tcHV0ZSBhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBmb3JtCigoc3RhcnQxLCBlbmQxKSwgKHN0YXJ0MiwgZW5kMikgLi4uKS4gVGhlbiBhbnN3ZXIgdGhlIHF1ZXN0aW9uICJ3YXMgeCBwcmVzZW50CmluIHRoZSBvcmlnaW5hbCBsaXN0PyIgaW4gdGltZSBPKGxvZygjIHJ1bnMpKS4KIiIiCgppbXBvcnQgYmlzZWN0CgpkZWYgaW50cmFuZ2VzX2Zyb21fbGlzdChsaXN0Xyk6CiAgICAiIiJSZXByZXNlbnQgYSBsaXN0IG9mIGludGVnZXJzIGFzIGEgc2VxdWVuY2Ugb2YgcmFuZ2VzOgogICAgKChzdGFydF8wLCBlbmRfMCksIChzdGFydF8xLCBlbmRfMSksIC4uLiksIHN1Y2ggdGhhdCB0aGUgb3JpZ2luYWwKICAgIGludGVnZXJzIGFyZSBleGFjdGx5IHRob3NlIHggc3VjaCB0aGF0IHN0YXJ0X2kgPD0geCA8IGVuZF9pIGZvciBzb21lIGkuCgogICAgUmFuZ2VzIGFyZSBlbmNvZGVkIGFzIHNpbmdsZSBpbnRlZ2VycyAoc3RhcnQgPDwgMzIgfCBlbmQpLCBub3QgYXMgdHVwbGVzLgogICAgIiIiCgogICAgc29ydGVkX2xpc3QgPSBzb3J0ZWQobGlzdF8pCiAgICByYW5nZXMgPSBbXQogICAgbGFzdF93cml0ZSA9IC0xCiAgICBmb3IgaSBpbiByYW5nZShsZW4oc29ydGVkX2xpc3QpKToKICAgICAgICBpZiBpKzEgPCBsZW4oc29ydGVkX2xpc3QpOgogICAgICAgICAgICBpZiBzb3J0ZWRfbGlzdFtpXSA9PSBzb3J0ZWRfbGlzdFtpKzFdLTE6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgIGN1cnJlbnRfcmFuZ2UgPSBzb3J0ZWRfbGlzdFtsYXN0X3dyaXRlKzE6aSsxXQogICAgICAgIHJhbmdlcy5hcHBlbmQoX2VuY29kZV9yYW5nZShjdXJyZW50X3JhbmdlWzBdLCBjdXJyZW50X3JhbmdlWy0xXSArIDEpKQogICAgICAgIGxhc3Rfd3JpdGUgPSBpCgogICAgcmV0dXJuIHR1cGxlKHJhbmdlcykKCmRlZiBfZW5jb2RlX3JhbmdlKHN0YXJ0LCBlbmQpOgogICAgcmV0dXJuIChzdGFydCA8PCAzMikgfCBlbmQKCmRlZiBfZGVjb2RlX3JhbmdlKHIpOgogICAgcmV0dXJuIChyID4+IDMyKSwgKHIgJiAoKDEgPDwgMzIpIC0gMSkpCgoKZGVmIGludHJhbmdlc19jb250YWluKGludF8sIHJhbmdlcyk6CiAgICAiIiJEZXRlcm1pbmUgaWYgYGludF9gIGZhbGxzIGludG8gb25lIG9mIHRoZSByYW5nZXMgaW4gYHJhbmdlc2AuIiIiCiAgICB0dXBsZV8gPSBfZW5jb2RlX3JhbmdlKGludF8sIDApCiAgICBwb3MgPSBiaXNlY3QuYmlzZWN0X2xlZnQocmFuZ2VzLCB0dXBsZV8pCiAgICAjIHdlIGNvdWxkIGJlIGltbWVkaWF0ZWx5IGFoZWFkIG9mIGEgdHVwbGUgKHN0YXJ0LCBlbmQpCiAgICAjIHdpdGggc3RhcnQgPCBpbnRfIDw9IGVuZAogICAgaWYgcG9zID4gMDoKICAgICAgICBsZWZ0LCByaWdodCA9IF9kZWNvZGVfcmFuZ2UocmFuZ2VzW3Bvcy0xXSkKICAgICAgICBpZiBsZWZ0IDw9IGludF8gPCByaWdodDoKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICMgb3Igd2UgY291bGQgYmUgaW1tZWRpYXRlbHkgYmVoaW5kIGEgdHVwbGUgKGludF8sIGVuZCkKICAgIGlmIHBvcyA8IGxlbihyYW5nZXMpOgogICAgICAgIGxlZnQsIF8gPSBfZGVjb2RlX3JhbmdlKHJhbmdlc1twb3NdKQogICAgICAgIGlmIGxlZnQgPT0gaW50XzoKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgIHJldHVybiBGYWxzZQpQSwMEFAAAAAAAAAAhABvnfaIVAAAAFQAAADAAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaWRuYS9wYWNrYWdlX2RhdGEucHlfX3ZlcnNpb25fXyA9ICcyLjYnCgpQSwMEFAAAAAAAAAAhAMmFhYVw0gIAcNICAC0AAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaWRuYS91dHM0NmRhdGEucHkjIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0b29scy9pZG5hLWRhdGEKIyB2aW06IHNldCBmaWxlZW5jb2Rpbmc9dXRmLTggOgoKIiIiSUROQSBNYXBwaW5nIFRhYmxlIGZyb20gVVRTNDYuIiIiCgoKX192ZXJzaW9uX18gPSAiNi4zLjAiCmRlZiBfc2VnXzAoKToKICAgIHJldHVybiBbCiAgICAoMHgwLCAnMycpLAogICAgKDB4MSwgJzMnKSwKICAgICgweDIsICczJyksCiAgICAoMHgzLCAnMycpLAogICAgKDB4NCwgJzMnKSwKICAgICgweDUsICczJyksCiAgICAoMHg2LCAnMycpLAogICAgKDB4NywgJzMnKSwKICAgICgweDgsICczJyksCiAgICAoMHg5LCAnMycpLAogICAgKDB4QSwgJzMnKSwKICAgICgweEIsICczJyksCiAgICAoMHhDLCAnMycpLAogICAgKDB4RCwgJzMnKSwKICAgICgweEUsICczJyksCiAgICAoMHhGLCAnMycpLAogICAgKDB4MTAsICczJyksCiAgICAoMHgxMSwgJzMnKSwKICAgICgweDEyLCAnMycpLAogICAgKDB4MTMsICczJyksCiAgICAoMHgxNCwgJzMnKSwKICAgICgweDE1LCAnMycpLAogICAgKDB4MTYsICczJyksCiAgICAoMHgxNywgJzMnKSwKICAgICgweDE4LCAnMycpLAogICAgKDB4MTksICczJyksCiAgICAoMHgxQSwgJzMnKSwKICAgICgweDFCLCAnMycpLAogICAgKDB4MUMsICczJyksCiAgICAoMHgxRCwgJzMnKSwKICAgICgweDFFLCAnMycpLAogICAgKDB4MUYsICczJyksCiAgICAoMHgyMCwgJzMnKSwKICAgICgweDIxLCAnMycpLAogICAgKDB4MjIsICczJyksCiAgICAoMHgyMywgJzMnKSwKICAgICgweDI0LCAnMycpLAogICAgKDB4MjUsICczJyksCiAgICAoMHgyNiwgJzMnKSwKICAgICgweDI3LCAnMycpLAogICAgKDB4MjgsICczJyksCiAgICAoMHgyOSwgJzMnKSwKICAgICgweDJBLCAnMycpLAogICAgKDB4MkIsICczJyksCiAgICAoMHgyQywgJzMnKSwKICAgICgweDJELCAnVicpLAogICAgKDB4MkUsICdWJyksCiAgICAoMHgyRiwgJzMnKSwKICAgICgweDMwLCAnVicpLAogICAgKDB4MzEsICdWJyksCiAgICAoMHgzMiwgJ1YnKSwKICAgICgweDMzLCAnVicpLAogICAgKDB4MzQsICdWJyksCiAgICAoMHgzNSwgJ1YnKSwKICAgICgweDM2LCAnVicpLAogICAgKDB4MzcsICdWJyksCiAgICAoMHgzOCwgJ1YnKSwKICAgICgweDM5LCAnVicpLAogICAgKDB4M0EsICczJyksCiAgICAoMHgzQiwgJzMnKSwKICAgICgweDNDLCAnMycpLAogICAgKDB4M0QsICczJyksCiAgICAoMHgzRSwgJzMnKSwKICAgICgweDNGLCAnMycpLAogICAgKDB4NDAsICczJyksCiAgICAoMHg0MSwgJ00nLCB1J2EnKSwKICAgICgweDQyLCAnTScsIHUnYicpLAogICAgKDB4NDMsICdNJywgdSdjJyksCiAgICAoMHg0NCwgJ00nLCB1J2QnKSwKICAgICgweDQ1LCAnTScsIHUnZScpLAogICAgKDB4NDYsICdNJywgdSdmJyksCiAgICAoMHg0NywgJ00nLCB1J2cnKSwKICAgICgweDQ4LCAnTScsIHUnaCcpLAogICAgKDB4NDksICdNJywgdSdpJyksCiAgICAoMHg0QSwgJ00nLCB1J2onKSwKICAgICgweDRCLCAnTScsIHUnaycpLAogICAgKDB4NEMsICdNJywgdSdsJyksCiAgICAoMHg0RCwgJ00nLCB1J20nKSwKICAgICgweDRFLCAnTScsIHUnbicpLAogICAgKDB4NEYsICdNJywgdSdvJyksCiAgICAoMHg1MCwgJ00nLCB1J3AnKSwKICAgICgweDUxLCAnTScsIHUncScpLAogICAgKDB4NTIsICdNJywgdSdyJyksCiAgICAoMHg1MywgJ00nLCB1J3MnKSwKICAgICgweDU0LCAnTScsIHUndCcpLAogICAgKDB4NTUsICdNJywgdSd1JyksCiAgICAoMHg1NiwgJ00nLCB1J3YnKSwKICAgICgweDU3LCAnTScsIHUndycpLAogICAgKDB4NTgsICdNJywgdSd4JyksCiAgICAoMHg1OSwgJ00nLCB1J3knKSwKICAgICgweDVBLCAnTScsIHUneicpLAogICAgKDB4NUIsICczJyksCiAgICAoMHg1QywgJzMnKSwKICAgICgweDVELCAnMycpLAogICAgKDB4NUUsICczJyksCiAgICAoMHg1RiwgJzMnKSwKICAgICgweDYwLCAnMycpLAogICAgKDB4NjEsICdWJyksCiAgICAoMHg2MiwgJ1YnKSwKICAgICgweDYzLCAnVicpLAogICAgXQoKZGVmIF9zZWdfMSgpOgogICAgcmV0dXJuIFsKICAgICgweDY0LCAnVicpLAogICAgKDB4NjUsICdWJyksCiAgICAoMHg2NiwgJ1YnKSwKICAgICgweDY3LCAnVicpLAogICAgKDB4NjgsICdWJyksCiAgICAoMHg2OSwgJ1YnKSwKICAgICgweDZBLCAnVicpLAogICAgKDB4NkIsICdWJyksCiAgICAoMHg2QywgJ1YnKSwKICAgICgweDZELCAnVicpLAogICAgKDB4NkUsICdWJyksCiAgICAoMHg2RiwgJ1YnKSwKICAgICgweDcwLCAnVicpLAogICAgKDB4NzEsICdWJyksCiAgICAoMHg3MiwgJ1YnKSwKICAgICgweDczLCAnVicpLAogICAgKDB4NzQsICdWJyksCiAgICAoMHg3NSwgJ1YnKSwKICAgICgweDc2LCAnVicpLAogICAgKDB4NzcsICdWJyksCiAgICAoMHg3OCwgJ1YnKSwKICAgICgweDc5LCAnVicpLAogICAgKDB4N0EsICdWJyksCiAgICAoMHg3QiwgJzMnKSwKICAgICgweDdDLCAnMycpLAogICAgKDB4N0QsICczJyksCiAgICAoMHg3RSwgJzMnKSwKICAgICgweDdGLCAnMycpLAogICAgKDB4ODAsICdYJyksCiAgICAoMHg4MSwgJ1gnKSwKICAgICgweDgyLCAnWCcpLAogICAgKDB4ODMsICdYJyksCiAgICAoMHg4NCwgJ1gnKSwKICAgICgweDg1LCAnWCcpLAogICAgKDB4ODYsICdYJyksCiAgICAoMHg4NywgJ1gnKSwKICAgICgweDg4LCAnWCcpLAogICAgKDB4ODksICdYJyksCiAgICAoMHg4QSwgJ1gnKSwKICAgICgweDhCLCAnWCcpLAogICAgKDB4OEMsICdYJyksCiAgICAoMHg4RCwgJ1gnKSwKICAgICgweDhFLCAnWCcpLAogICAgKDB4OEYsICdYJyksCiAgICAoMHg5MCwgJ1gnKSwKICAgICgweDkxLCAnWCcpLAogICAgKDB4OTIsICdYJyksCiAgICAoMHg5MywgJ1gnKSwKICAgICgweDk0LCAnWCcpLAogICAgKDB4OTUsICdYJyksCiAgICAoMHg5NiwgJ1gnKSwKICAgICgweDk3LCAnWCcpLAogICAgKDB4OTgsICdYJyksCiAgICAoMHg5OSwgJ1gnKSwKICAgICgweDlBLCAnWCcpLAogICAgKDB4OUIsICdYJyksCiAgICAoMHg5QywgJ1gnKSwKICAgICgweDlELCAnWCcpLAogICAgKDB4OUUsICdYJyksCiAgICAoMHg5RiwgJ1gnKSwKICAgICgweEEwLCAnMycsIHUnICcpLAogICAgKDB4QTEsICdWJyksCiAgICAoMHhBMiwgJ1YnKSwKICAgICgweEEzLCAnVicpLAogICAgKDB4QTQsICdWJyksCiAgICAoMHhBNSwgJ1YnKSwKICAgICgweEE2LCAnVicpLAogICAgKDB4QTcsICdWJyksCiAgICAoMHhBOCwgJzMnLCB1JyDMiCcpLAogICAgKDB4QTksICdWJyksCiAgICAoMHhBQSwgJ00nLCB1J2EnKSwKICAgICgweEFCLCAnVicpLAogICAgKDB4QUMsICdWJyksCiAgICAoMHhBRCwgJ0knKSwKICAgICgweEFFLCAnVicpLAogICAgKDB4QUYsICczJywgdScgzIQnKSwKICAgICgweEIwLCAnVicpLAogICAgKDB4QjEsICdWJyksCiAgICAoMHhCMiwgJ00nLCB1JzInKSwKICAgICgweEIzLCAnTScsIHUnMycpLAogICAgKDB4QjQsICczJywgdScgzIEnKSwKICAgICgweEI1LCAnTScsIHUnzrwnKSwKICAgICgweEI2LCAnVicpLAogICAgKDB4QjcsICdWJyksCiAgICAoMHhCOCwgJzMnLCB1JyDMpycpLAogICAgKDB4QjksICdNJywgdScxJyksCiAgICAoMHhCQSwgJ00nLCB1J28nKSwKICAgICgweEJCLCAnVicpLAogICAgKDB4QkMsICdNJywgdScx4oGENCcpLAogICAgKDB4QkQsICdNJywgdScx4oGEMicpLAogICAgKDB4QkUsICdNJywgdScz4oGENCcpLAogICAgKDB4QkYsICdWJyksCiAgICAoMHhDMCwgJ00nLCB1J8OgJyksCiAgICAoMHhDMSwgJ00nLCB1J8OhJyksCiAgICAoMHhDMiwgJ00nLCB1J8OiJyksCiAgICAoMHhDMywgJ00nLCB1J8OjJyksCiAgICAoMHhDNCwgJ00nLCB1J8OkJyksCiAgICAoMHhDNSwgJ00nLCB1J8OlJyksCiAgICAoMHhDNiwgJ00nLCB1J8OmJyksCiAgICAoMHhDNywgJ00nLCB1J8OnJyksCiAgICBdCgpkZWYgX3NlZ18yKCk6CiAgICByZXR1cm4gWwogICAgKDB4QzgsICdNJywgdSfDqCcpLAogICAgKDB4QzksICdNJywgdSfDqScpLAogICAgKDB4Q0EsICdNJywgdSfDqicpLAogICAgKDB4Q0IsICdNJywgdSfDqycpLAogICAgKDB4Q0MsICdNJywgdSfDrCcpLAogICAgKDB4Q0QsICdNJywgdSfDrScpLAogICAgKDB4Q0UsICdNJywgdSfDricpLAogICAgKDB4Q0YsICdNJywgdSfDrycpLAogICAgKDB4RDAsICdNJywgdSfDsCcpLAogICAgKDB4RDEsICdNJywgdSfDsScpLAogICAgKDB4RDIsICdNJywgdSfDsicpLAogICAgKDB4RDMsICdNJywgdSfDsycpLAogICAgKDB4RDQsICdNJywgdSfDtCcpLAogICAgKDB4RDUsICdNJywgdSfDtScpLAogICAgKDB4RDYsICdNJywgdSfDticpLAogICAgKDB4RDcsICdWJyksCiAgICAoMHhEOCwgJ00nLCB1J8O4JyksCiAgICAoMHhEOSwgJ00nLCB1J8O5JyksCiAgICAoMHhEQSwgJ00nLCB1J8O6JyksCiAgICAoMHhEQiwgJ00nLCB1J8O7JyksCiAgICAoMHhEQywgJ00nLCB1J8O8JyksCiAgICAoMHhERCwgJ00nLCB1J8O9JyksCiAgICAoMHhERSwgJ00nLCB1J8O+JyksCiAgICAoMHhERiwgJ0QnLCB1J3NzJyksCiAgICAoMHhFMCwgJ1YnKSwKICAgICgweEUxLCAnVicpLAogICAgKDB4RTIsICdWJyksCiAgICAoMHhFMywgJ1YnKSwKICAgICgweEU0LCAnVicpLAogICAgKDB4RTUsICdWJyksCiAgICAoMHhFNiwgJ1YnKSwKICAgICgweEU3LCAnVicpLAogICAgKDB4RTgsICdWJyksCiAgICAoMHhFOSwgJ1YnKSwKICAgICgweEVBLCAnVicpLAogICAgKDB4RUIsICdWJyksCiAgICAoMHhFQywgJ1YnKSwKICAgICgweEVELCAnVicpLAogICAgKDB4RUUsICdWJyksCiAgICAoMHhFRiwgJ1YnKSwKICAgICgweEYwLCAnVicpLAogICAgKDB4RjEsICdWJyksCiAgICAoMHhGMiwgJ1YnKSwKICAgICgweEYzLCAnVicpLAogICAgKDB4RjQsICdWJyksCiAgICAoMHhGNSwgJ1YnKSwKICAgICgweEY2LCAnVicpLAogICAgKDB4RjcsICdWJyksCiAgICAoMHhGOCwgJ1YnKSwKICAgICgweEY5LCAnVicpLAogICAgKDB4RkEsICdWJyksCiAgICAoMHhGQiwgJ1YnKSwKICAgICgweEZDLCAnVicpLAogICAgKDB4RkQsICdWJyksCiAgICAoMHhGRSwgJ1YnKSwKICAgICgweEZGLCAnVicpLAogICAgKDB4MTAwLCAnTScsIHUnxIEnKSwKICAgICgweDEwMSwgJ1YnKSwKICAgICgweDEwMiwgJ00nLCB1J8SDJyksCiAgICAoMHgxMDMsICdWJyksCiAgICAoMHgxMDQsICdNJywgdSfEhScpLAogICAgKDB4MTA1LCAnVicpLAogICAgKDB4MTA2LCAnTScsIHUnxIcnKSwKICAgICgweDEwNywgJ1YnKSwKICAgICgweDEwOCwgJ00nLCB1J8SJJyksCiAgICAoMHgxMDksICdWJyksCiAgICAoMHgxMEEsICdNJywgdSfEiycpLAogICAgKDB4MTBCLCAnVicpLAogICAgKDB4MTBDLCAnTScsIHUnxI0nKSwKICAgICgweDEwRCwgJ1YnKSwKICAgICgweDEwRSwgJ00nLCB1J8SPJyksCiAgICAoMHgxMEYsICdWJyksCiAgICAoMHgxMTAsICdNJywgdSfEkScpLAogICAgKDB4MTExLCAnVicpLAogICAgKDB4MTEyLCAnTScsIHUnxJMnKSwKICAgICgweDExMywgJ1YnKSwKICAgICgweDExNCwgJ00nLCB1J8SVJyksCiAgICAoMHgxMTUsICdWJyksCiAgICAoMHgxMTYsICdNJywgdSfElycpLAogICAgKDB4MTE3LCAnVicpLAogICAgKDB4MTE4LCAnTScsIHUnxJknKSwKICAgICgweDExOSwgJ1YnKSwKICAgICgweDExQSwgJ00nLCB1J8SbJyksCiAgICAoMHgxMUIsICdWJyksCiAgICAoMHgxMUMsICdNJywgdSfEnScpLAogICAgKDB4MTFELCAnVicpLAogICAgKDB4MTFFLCAnTScsIHUnxJ8nKSwKICAgICgweDExRiwgJ1YnKSwKICAgICgweDEyMCwgJ00nLCB1J8ShJyksCiAgICAoMHgxMjEsICdWJyksCiAgICAoMHgxMjIsICdNJywgdSfEoycpLAogICAgKDB4MTIzLCAnVicpLAogICAgKDB4MTI0LCAnTScsIHUnxKUnKSwKICAgICgweDEyNSwgJ1YnKSwKICAgICgweDEyNiwgJ00nLCB1J8SnJyksCiAgICAoMHgxMjcsICdWJyksCiAgICAoMHgxMjgsICdNJywgdSfEqScpLAogICAgKDB4MTI5LCAnVicpLAogICAgKDB4MTJBLCAnTScsIHUnxKsnKSwKICAgICgweDEyQiwgJ1YnKSwKICAgIF0KCmRlZiBfc2VnXzMoKToKICAgIHJldHVybiBbCiAgICAoMHgxMkMsICdNJywgdSfErScpLAogICAgKDB4MTJELCAnVicpLAogICAgKDB4MTJFLCAnTScsIHUnxK8nKSwKICAgICgweDEyRiwgJ1YnKSwKICAgICgweDEzMCwgJ00nLCB1J2nMhycpLAogICAgKDB4MTMxLCAnVicpLAogICAgKDB4MTMyLCAnTScsIHUnaWonKSwKICAgICgweDEzNCwgJ00nLCB1J8S1JyksCiAgICAoMHgxMzUsICdWJyksCiAgICAoMHgxMzYsICdNJywgdSfEtycpLAogICAgKDB4MTM3LCAnVicpLAogICAgKDB4MTM5LCAnTScsIHUnxLonKSwKICAgICgweDEzQSwgJ1YnKSwKICAgICgweDEzQiwgJ00nLCB1J8S8JyksCiAgICAoMHgxM0MsICdWJyksCiAgICAoMHgxM0QsICdNJywgdSfEvicpLAogICAgKDB4MTNFLCAnVicpLAogICAgKDB4MTNGLCAnTScsIHUnbMK3JyksCiAgICAoMHgxNDEsICdNJywgdSfFgicpLAogICAgKDB4MTQyLCAnVicpLAogICAgKDB4MTQzLCAnTScsIHUnxYQnKSwKICAgICgweDE0NCwgJ1YnKSwKICAgICgweDE0NSwgJ00nLCB1J8WGJyksCiAgICAoMHgxNDYsICdWJyksCiAgICAoMHgxNDcsICdNJywgdSfFiCcpLAogICAgKDB4MTQ4LCAnVicpLAogICAgKDB4MTQ5LCAnTScsIHUnyrxuJyksCiAgICAoMHgxNEEsICdNJywgdSfFiycpLAogICAgKDB4MTRCLCAnVicpLAogICAgKDB4MTRDLCAnTScsIHUnxY0nKSwKICAgICgweDE0RCwgJ1YnKSwKICAgICgweDE0RSwgJ00nLCB1J8WPJyksCiAgICAoMHgxNEYsICdWJyksCiAgICAoMHgxNTAsICdNJywgdSfFkScpLAogICAgKDB4MTUxLCAnVicpLAogICAgKDB4MTUyLCAnTScsIHUnxZMnKSwKICAgICgweDE1MywgJ1YnKSwKICAgICgweDE1NCwgJ00nLCB1J8WVJyksCiAgICAoMHgxNTUsICdWJyksCiAgICAoMHgxNTYsICdNJywgdSfFlycpLAogICAgKDB4MTU3LCAnVicpLAogICAgKDB4MTU4LCAnTScsIHUnxZknKSwKICAgICgweDE1OSwgJ1YnKSwKICAgICgweDE1QSwgJ00nLCB1J8WbJyksCiAgICAoMHgxNUIsICdWJyksCiAgICAoMHgxNUMsICdNJywgdSfFnScpLAogICAgKDB4MTVELCAnVicpLAogICAgKDB4MTVFLCAnTScsIHUnxZ8nKSwKICAgICgweDE1RiwgJ1YnKSwKICAgICgweDE2MCwgJ00nLCB1J8WhJyksCiAgICAoMHgxNjEsICdWJyksCiAgICAoMHgxNjIsICdNJywgdSfFoycpLAogICAgKDB4MTYzLCAnVicpLAogICAgKDB4MTY0LCAnTScsIHUnxaUnKSwKICAgICgweDE2NSwgJ1YnKSwKICAgICgweDE2NiwgJ00nLCB1J8WnJyksCiAgICAoMHgxNjcsICdWJyksCiAgICAoMHgxNjgsICdNJywgdSfFqScpLAogICAgKDB4MTY5LCAnVicpLAogICAgKDB4MTZBLCAnTScsIHUnxasnKSwKICAgICgweDE2QiwgJ1YnKSwKICAgICgweDE2QywgJ00nLCB1J8WtJyksCiAgICAoMHgxNkQsICdWJyksCiAgICAoMHgxNkUsICdNJywgdSfFrycpLAogICAgKDB4MTZGLCAnVicpLAogICAgKDB4MTcwLCAnTScsIHUnxbEnKSwKICAgICgweDE3MSwgJ1YnKSwKICAgICgweDE3MiwgJ00nLCB1J8WzJyksCiAgICAoMHgxNzMsICdWJyksCiAgICAoMHgxNzQsICdNJywgdSfFtScpLAogICAgKDB4MTc1LCAnVicpLAogICAgKDB4MTc2LCAnTScsIHUnxbcnKSwKICAgICgweDE3NywgJ1YnKSwKICAgICgweDE3OCwgJ00nLCB1J8O/JyksCiAgICAoMHgxNzksICdNJywgdSfFuicpLAogICAgKDB4MTdBLCAnVicpLAogICAgKDB4MTdCLCAnTScsIHUnxbwnKSwKICAgICgweDE3QywgJ1YnKSwKICAgICgweDE3RCwgJ00nLCB1J8W+JyksCiAgICAoMHgxN0UsICdWJyksCiAgICAoMHgxN0YsICdNJywgdSdzJyksCiAgICAoMHgxODAsICdWJyksCiAgICAoMHgxODEsICdNJywgdSfJkycpLAogICAgKDB4MTgyLCAnTScsIHUnxoMnKSwKICAgICgweDE4MywgJ1YnKSwKICAgICgweDE4NCwgJ00nLCB1J8aFJyksCiAgICAoMHgxODUsICdWJyksCiAgICAoMHgxODYsICdNJywgdSfJlCcpLAogICAgKDB4MTg3LCAnTScsIHUnxognKSwKICAgICgweDE4OCwgJ1YnKSwKICAgICgweDE4OSwgJ00nLCB1J8mWJyksCiAgICAoMHgxOEEsICdNJywgdSfJlycpLAogICAgKDB4MThCLCAnTScsIHUnxownKSwKICAgICgweDE4QywgJ1YnKSwKICAgICgweDE4RSwgJ00nLCB1J8edJyksCiAgICAoMHgxOEYsICdNJywgdSfJmScpLAogICAgKDB4MTkwLCAnTScsIHUnyZsnKSwKICAgICgweDE5MSwgJ00nLCB1J8aSJyksCiAgICAoMHgxOTIsICdWJyksCiAgICAoMHgxOTMsICdNJywgdSfJoCcpLAogICAgXQoKZGVmIF9zZWdfNCgpOgogICAgcmV0dXJuIFsKICAgICgweDE5NCwgJ00nLCB1J8mjJyksCiAgICAoMHgxOTUsICdWJyksCiAgICAoMHgxOTYsICdNJywgdSfJqScpLAogICAgKDB4MTk3LCAnTScsIHUnyagnKSwKICAgICgweDE5OCwgJ00nLCB1J8aZJyksCiAgICAoMHgxOTksICdWJyksCiAgICAoMHgxOUMsICdNJywgdSfJrycpLAogICAgKDB4MTlELCAnTScsIHUnybInKSwKICAgICgweDE5RSwgJ1YnKSwKICAgICgweDE5RiwgJ00nLCB1J8m1JyksCiAgICAoMHgxQTAsICdNJywgdSfGoScpLAogICAgKDB4MUExLCAnVicpLAogICAgKDB4MUEyLCAnTScsIHUnxqMnKSwKICAgICgweDFBMywgJ1YnKSwKICAgICgweDFBNCwgJ00nLCB1J8alJyksCiAgICAoMHgxQTUsICdWJyksCiAgICAoMHgxQTYsICdNJywgdSfKgCcpLAogICAgKDB4MUE3LCAnTScsIHUnxqgnKSwKICAgICgweDFBOCwgJ1YnKSwKICAgICgweDFBOSwgJ00nLCB1J8qDJyksCiAgICAoMHgxQUEsICdWJyksCiAgICAoMHgxQUMsICdNJywgdSfGrScpLAogICAgKDB4MUFELCAnVicpLAogICAgKDB4MUFFLCAnTScsIHUnyognKSwKICAgICgweDFBRiwgJ00nLCB1J8awJyksCiAgICAoMHgxQjAsICdWJyksCiAgICAoMHgxQjEsICdNJywgdSfKiicpLAogICAgKDB4MUIyLCAnTScsIHUnyosnKSwKICAgICgweDFCMywgJ00nLCB1J8a0JyksCiAgICAoMHgxQjQsICdWJyksCiAgICAoMHgxQjUsICdNJywgdSfGticpLAogICAgKDB4MUI2LCAnVicpLAogICAgKDB4MUI3LCAnTScsIHUnypInKSwKICAgICgweDFCOCwgJ00nLCB1J8a5JyksCiAgICAoMHgxQjksICdWJyksCiAgICAoMHgxQkMsICdNJywgdSfGvScpLAogICAgKDB4MUJELCAnVicpLAogICAgKDB4MUM0LCAnTScsIHUnZMW+JyksCiAgICAoMHgxQzcsICdNJywgdSdsaicpLAogICAgKDB4MUNBLCAnTScsIHUnbmonKSwKICAgICgweDFDRCwgJ00nLCB1J8eOJyksCiAgICAoMHgxQ0UsICdWJyksCiAgICAoMHgxQ0YsICdNJywgdSfHkCcpLAogICAgKDB4MUQwLCAnVicpLAogICAgKDB4MUQxLCAnTScsIHUnx5InKSwKICAgICgweDFEMiwgJ1YnKSwKICAgICgweDFEMywgJ00nLCB1J8eUJyksCiAgICAoMHgxRDQsICdWJyksCiAgICAoMHgxRDUsICdNJywgdSfHlicpLAogICAgKDB4MUQ2LCAnVicpLAogICAgKDB4MUQ3LCAnTScsIHUnx5gnKSwKICAgICgweDFEOCwgJ1YnKSwKICAgICgweDFEOSwgJ00nLCB1J8eaJyksCiAgICAoMHgxREEsICdWJyksCiAgICAoMHgxREIsICdNJywgdSfHnCcpLAogICAgKDB4MURDLCAnVicpLAogICAgKDB4MURFLCAnTScsIHUnx58nKSwKICAgICgweDFERiwgJ1YnKSwKICAgICgweDFFMCwgJ00nLCB1J8ehJyksCiAgICAoMHgxRTEsICdWJyksCiAgICAoMHgxRTIsICdNJywgdSfHoycpLAogICAgKDB4MUUzLCAnVicpLAogICAgKDB4MUU0LCAnTScsIHUnx6UnKSwKICAgICgweDFFNSwgJ1YnKSwKICAgICgweDFFNiwgJ00nLCB1J8enJyksCiAgICAoMHgxRTcsICdWJyksCiAgICAoMHgxRTgsICdNJywgdSfHqScpLAogICAgKDB4MUU5LCAnVicpLAogICAgKDB4MUVBLCAnTScsIHUnx6snKSwKICAgICgweDFFQiwgJ1YnKSwKICAgICgweDFFQywgJ00nLCB1J8etJyksCiAgICAoMHgxRUQsICdWJyksCiAgICAoMHgxRUUsICdNJywgdSfHrycpLAogICAgKDB4MUVGLCAnVicpLAogICAgKDB4MUYxLCAnTScsIHUnZHonKSwKICAgICgweDFGNCwgJ00nLCB1J8e1JyksCiAgICAoMHgxRjUsICdWJyksCiAgICAoMHgxRjYsICdNJywgdSfGlScpLAogICAgKDB4MUY3LCAnTScsIHUnxr8nKSwKICAgICgweDFGOCwgJ00nLCB1J8e5JyksCiAgICAoMHgxRjksICdWJyksCiAgICAoMHgxRkEsICdNJywgdSfHuycpLAogICAgKDB4MUZCLCAnVicpLAogICAgKDB4MUZDLCAnTScsIHUnx70nKSwKICAgICgweDFGRCwgJ1YnKSwKICAgICgweDFGRSwgJ00nLCB1J8e/JyksCiAgICAoMHgxRkYsICdWJyksCiAgICAoMHgyMDAsICdNJywgdSfIgScpLAogICAgKDB4MjAxLCAnVicpLAogICAgKDB4MjAyLCAnTScsIHUnyIMnKSwKICAgICgweDIwMywgJ1YnKSwKICAgICgweDIwNCwgJ00nLCB1J8iFJyksCiAgICAoMHgyMDUsICdWJyksCiAgICAoMHgyMDYsICdNJywgdSfIhycpLAogICAgKDB4MjA3LCAnVicpLAogICAgKDB4MjA4LCAnTScsIHUnyIknKSwKICAgICgweDIwOSwgJ1YnKSwKICAgICgweDIwQSwgJ00nLCB1J8iLJyksCiAgICAoMHgyMEIsICdWJyksCiAgICAoMHgyMEMsICdNJywgdSfIjScpLAogICAgXQoKZGVmIF9zZWdfNSgpOgogICAgcmV0dXJuIFsKICAgICgweDIwRCwgJ1YnKSwKICAgICgweDIwRSwgJ00nLCB1J8iPJyksCiAgICAoMHgyMEYsICdWJyksCiAgICAoMHgyMTAsICdNJywgdSfIkScpLAogICAgKDB4MjExLCAnVicpLAogICAgKDB4MjEyLCAnTScsIHUnyJMnKSwKICAgICgweDIxMywgJ1YnKSwKICAgICgweDIxNCwgJ00nLCB1J8iVJyksCiAgICAoMHgyMTUsICdWJyksCiAgICAoMHgyMTYsICdNJywgdSfIlycpLAogICAgKDB4MjE3LCAnVicpLAogICAgKDB4MjE4LCAnTScsIHUnyJknKSwKICAgICgweDIxOSwgJ1YnKSwKICAgICgweDIxQSwgJ00nLCB1J8ibJyksCiAgICAoMHgyMUIsICdWJyksCiAgICAoMHgyMUMsICdNJywgdSfInScpLAogICAgKDB4MjFELCAnVicpLAogICAgKDB4MjFFLCAnTScsIHUnyJ8nKSwKICAgICgweDIxRiwgJ1YnKSwKICAgICgweDIyMCwgJ00nLCB1J8aeJyksCiAgICAoMHgyMjEsICdWJyksCiAgICAoMHgyMjIsICdNJywgdSfIoycpLAogICAgKDB4MjIzLCAnVicpLAogICAgKDB4MjI0LCAnTScsIHUnyKUnKSwKICAgICgweDIyNSwgJ1YnKSwKICAgICgweDIyNiwgJ00nLCB1J8inJyksCiAgICAoMHgyMjcsICdWJyksCiAgICAoMHgyMjgsICdNJywgdSfIqScpLAogICAgKDB4MjI5LCAnVicpLAogICAgKDB4MjJBLCAnTScsIHUnyKsnKSwKICAgICgweDIyQiwgJ1YnKSwKICAgICgweDIyQywgJ00nLCB1J8itJyksCiAgICAoMHgyMkQsICdWJyksCiAgICAoMHgyMkUsICdNJywgdSfIrycpLAogICAgKDB4MjJGLCAnVicpLAogICAgKDB4MjMwLCAnTScsIHUnyLEnKSwKICAgICgweDIzMSwgJ1YnKSwKICAgICgweDIzMiwgJ00nLCB1J8izJyksCiAgICAoMHgyMzMsICdWJyksCiAgICAoMHgyM0EsICdNJywgdSfisaUnKSwKICAgICgweDIzQiwgJ00nLCB1J8i8JyksCiAgICAoMHgyM0MsICdWJyksCiAgICAoMHgyM0QsICdNJywgdSfGmicpLAogICAgKDB4MjNFLCAnTScsIHUn4rGmJyksCiAgICAoMHgyM0YsICdWJyksCiAgICAoMHgyNDEsICdNJywgdSfJgicpLAogICAgKDB4MjQyLCAnVicpLAogICAgKDB4MjQzLCAnTScsIHUnxoAnKSwKICAgICgweDI0NCwgJ00nLCB1J8qJJyksCiAgICAoMHgyNDUsICdNJywgdSfKjCcpLAogICAgKDB4MjQ2LCAnTScsIHUnyYcnKSwKICAgICgweDI0NywgJ1YnKSwKICAgICgweDI0OCwgJ00nLCB1J8mJJyksCiAgICAoMHgyNDksICdWJyksCiAgICAoMHgyNEEsICdNJywgdSfJiycpLAogICAgKDB4MjRCLCAnVicpLAogICAgKDB4MjRDLCAnTScsIHUnyY0nKSwKICAgICgweDI0RCwgJ1YnKSwKICAgICgweDI0RSwgJ00nLCB1J8mPJyksCiAgICAoMHgyNEYsICdWJyksCiAgICAoMHgyQjAsICdNJywgdSdoJyksCiAgICAoMHgyQjEsICdNJywgdSfJpicpLAogICAgKDB4MkIyLCAnTScsIHUnaicpLAogICAgKDB4MkIzLCAnTScsIHUncicpLAogICAgKDB4MkI0LCAnTScsIHUnybknKSwKICAgICgweDJCNSwgJ00nLCB1J8m7JyksCiAgICAoMHgyQjYsICdNJywgdSfKgScpLAogICAgKDB4MkI3LCAnTScsIHUndycpLAogICAgKDB4MkI4LCAnTScsIHUneScpLAogICAgKDB4MkI5LCAnVicpLAogICAgKDB4MkQ4LCAnMycsIHUnIMyGJyksCiAgICAoMHgyRDksICczJywgdScgzIcnKSwKICAgICgweDJEQSwgJzMnLCB1JyDMiicpLAogICAgKDB4MkRCLCAnMycsIHUnIMyoJyksCiAgICAoMHgyREMsICczJywgdScgzIMnKSwKICAgICgweDJERCwgJzMnLCB1JyDMiycpLAogICAgKDB4MkRFLCAnVicpLAogICAgKDB4MkUwLCAnTScsIHUnyaMnKSwKICAgICgweDJFMSwgJ00nLCB1J2wnKSwKICAgICgweDJFMiwgJ00nLCB1J3MnKSwKICAgICgweDJFMywgJ00nLCB1J3gnKSwKICAgICgweDJFNCwgJ00nLCB1J8qVJyksCiAgICAoMHgyRTUsICdWJyksCiAgICAoMHgzNDAsICdNJywgdSfMgCcpLAogICAgKDB4MzQxLCAnTScsIHUnzIEnKSwKICAgICgweDM0MiwgJ1YnKSwKICAgICgweDM0MywgJ00nLCB1J8yTJyksCiAgICAoMHgzNDQsICdNJywgdSfMiMyBJyksCiAgICAoMHgzNDUsICdNJywgdSfOuScpLAogICAgKDB4MzQ2LCAnVicpLAogICAgKDB4MzRGLCAnSScpLAogICAgKDB4MzUwLCAnVicpLAogICAgKDB4MzcwLCAnTScsIHUnzbEnKSwKICAgICgweDM3MSwgJ1YnKSwKICAgICgweDM3MiwgJ00nLCB1J82zJyksCiAgICAoMHgzNzMsICdWJyksCiAgICAoMHgzNzQsICdNJywgdSfKuScpLAogICAgKDB4Mzc1LCAnVicpLAogICAgKDB4Mzc2LCAnTScsIHUnzbcnKSwKICAgICgweDM3NywgJ1YnKSwKICAgIF0KCmRlZiBfc2VnXzYoKToKICAgIHJldHVybiBbCiAgICAoMHgzNzgsICdYJyksCiAgICAoMHgzN0EsICczJywgdScgzrknKSwKICAgICgweDM3QiwgJ1YnKSwKICAgICgweDM3RSwgJzMnLCB1JzsnKSwKICAgICgweDM3RiwgJ1gnKSwKICAgICgweDM4NCwgJzMnLCB1JyDMgScpLAogICAgKDB4Mzg1LCAnMycsIHUnIMyIzIEnKSwKICAgICgweDM4NiwgJ00nLCB1J86sJyksCiAgICAoMHgzODcsICdNJywgdSfCtycpLAogICAgKDB4Mzg4LCAnTScsIHUnzq0nKSwKICAgICgweDM4OSwgJ00nLCB1J86uJyksCiAgICAoMHgzOEEsICdNJywgdSfOrycpLAogICAgKDB4MzhCLCAnWCcpLAogICAgKDB4MzhDLCAnTScsIHUnz4wnKSwKICAgICgweDM4RCwgJ1gnKSwKICAgICgweDM4RSwgJ00nLCB1J8+NJyksCiAgICAoMHgzOEYsICdNJywgdSfPjicpLAogICAgKDB4MzkwLCAnVicpLAogICAgKDB4MzkxLCAnTScsIHUnzrEnKSwKICAgICgweDM5MiwgJ00nLCB1J86yJyksCiAgICAoMHgzOTMsICdNJywgdSfOsycpLAogICAgKDB4Mzk0LCAnTScsIHUnzrQnKSwKICAgICgweDM5NSwgJ00nLCB1J861JyksCiAgICAoMHgzOTYsICdNJywgdSfOticpLAogICAgKDB4Mzk3LCAnTScsIHUnzrcnKSwKICAgICgweDM5OCwgJ00nLCB1J864JyksCiAgICAoMHgzOTksICdNJywgdSfOuScpLAogICAgKDB4MzlBLCAnTScsIHUnzronKSwKICAgICgweDM5QiwgJ00nLCB1J867JyksCiAgICAoMHgzOUMsICdNJywgdSfOvCcpLAogICAgKDB4MzlELCAnTScsIHUnzr0nKSwKICAgICgweDM5RSwgJ00nLCB1J86+JyksCiAgICAoMHgzOUYsICdNJywgdSfOvycpLAogICAgKDB4M0EwLCAnTScsIHUnz4AnKSwKICAgICgweDNBMSwgJ00nLCB1J8+BJyksCiAgICAoMHgzQTIsICdYJyksCiAgICAoMHgzQTMsICdNJywgdSfPgycpLAogICAgKDB4M0E0LCAnTScsIHUnz4QnKSwKICAgICgweDNBNSwgJ00nLCB1J8+FJyksCiAgICAoMHgzQTYsICdNJywgdSfPhicpLAogICAgKDB4M0E3LCAnTScsIHUnz4cnKSwKICAgICgweDNBOCwgJ00nLCB1J8+IJyksCiAgICAoMHgzQTksICdNJywgdSfPiScpLAogICAgKDB4M0FBLCAnTScsIHUnz4onKSwKICAgICgweDNBQiwgJ00nLCB1J8+LJyksCiAgICAoMHgzQUMsICdWJyksCiAgICAoMHgzQzIsICdEJywgdSfPgycpLAogICAgKDB4M0MzLCAnVicpLAogICAgKDB4M0NGLCAnTScsIHUnz5cnKSwKICAgICgweDNEMCwgJ00nLCB1J86yJyksCiAgICAoMHgzRDEsICdNJywgdSfOuCcpLAogICAgKDB4M0QyLCAnTScsIHUnz4UnKSwKICAgICgweDNEMywgJ00nLCB1J8+NJyksCiAgICAoMHgzRDQsICdNJywgdSfPiycpLAogICAgKDB4M0Q1LCAnTScsIHUnz4YnKSwKICAgICgweDNENiwgJ00nLCB1J8+AJyksCiAgICAoMHgzRDcsICdWJyksCiAgICAoMHgzRDgsICdNJywgdSfPmScpLAogICAgKDB4M0Q5LCAnVicpLAogICAgKDB4M0RBLCAnTScsIHUnz5snKSwKICAgICgweDNEQiwgJ1YnKSwKICAgICgweDNEQywgJ00nLCB1J8+dJyksCiAgICAoMHgzREQsICdWJyksCiAgICAoMHgzREUsICdNJywgdSfPnycpLAogICAgKDB4M0RGLCAnVicpLAogICAgKDB4M0UwLCAnTScsIHUnz6EnKSwKICAgICgweDNFMSwgJ1YnKSwKICAgICgweDNFMiwgJ00nLCB1J8+jJyksCiAgICAoMHgzRTMsICdWJyksCiAgICAoMHgzRTQsICdNJywgdSfPpScpLAogICAgKDB4M0U1LCAnVicpLAogICAgKDB4M0U2LCAnTScsIHUnz6cnKSwKICAgICgweDNFNywgJ1YnKSwKICAgICgweDNFOCwgJ00nLCB1J8+pJyksCiAgICAoMHgzRTksICdWJyksCiAgICAoMHgzRUEsICdNJywgdSfPqycpLAogICAgKDB4M0VCLCAnVicpLAogICAgKDB4M0VDLCAnTScsIHUnz60nKSwKICAgICgweDNFRCwgJ1YnKSwKICAgICgweDNFRSwgJ00nLCB1J8+vJyksCiAgICAoMHgzRUYsICdWJyksCiAgICAoMHgzRjAsICdNJywgdSfOuicpLAogICAgKDB4M0YxLCAnTScsIHUnz4EnKSwKICAgICgweDNGMiwgJ00nLCB1J8+DJyksCiAgICAoMHgzRjMsICdWJyksCiAgICAoMHgzRjQsICdNJywgdSfOuCcpLAogICAgKDB4M0Y1LCAnTScsIHUnzrUnKSwKICAgICgweDNGNiwgJ1YnKSwKICAgICgweDNGNywgJ00nLCB1J8+4JyksCiAgICAoMHgzRjgsICdWJyksCiAgICAoMHgzRjksICdNJywgdSfPgycpLAogICAgKDB4M0ZBLCAnTScsIHUnz7snKSwKICAgICgweDNGQiwgJ1YnKSwKICAgICgweDNGRCwgJ00nLCB1J827JyksCiAgICAoMHgzRkUsICdNJywgdSfNvCcpLAogICAgKDB4M0ZGLCAnTScsIHUnzb0nKSwKICAgICgweDQwMCwgJ00nLCB1J9GQJyksCiAgICAoMHg0MDEsICdNJywgdSfRkScpLAogICAgKDB4NDAyLCAnTScsIHUn0ZInKSwKICAgICgweDQwMywgJ00nLCB1J9GTJyksCiAgICBdCgpkZWYgX3NlZ183KCk6CiAgICByZXR1cm4gWwogICAgKDB4NDA0LCAnTScsIHUn0ZQnKSwKICAgICgweDQwNSwgJ00nLCB1J9GVJyksCiAgICAoMHg0MDYsICdNJywgdSfRlicpLAogICAgKDB4NDA3LCAnTScsIHUn0ZcnKSwKICAgICgweDQwOCwgJ00nLCB1J9GYJyksCiAgICAoMHg0MDksICdNJywgdSfRmScpLAogICAgKDB4NDBBLCAnTScsIHUn0ZonKSwKICAgICgweDQwQiwgJ00nLCB1J9GbJyksCiAgICAoMHg0MEMsICdNJywgdSfRnCcpLAogICAgKDB4NDBELCAnTScsIHUn0Z0nKSwKICAgICgweDQwRSwgJ00nLCB1J9GeJyksCiAgICAoMHg0MEYsICdNJywgdSfRnycpLAogICAgKDB4NDEwLCAnTScsIHUn0LAnKSwKICAgICgweDQxMSwgJ00nLCB1J9CxJyksCiAgICAoMHg0MTIsICdNJywgdSfQsicpLAogICAgKDB4NDEzLCAnTScsIHUn0LMnKSwKICAgICgweDQxNCwgJ00nLCB1J9C0JyksCiAgICAoMHg0MTUsICdNJywgdSfQtScpLAogICAgKDB4NDE2LCAnTScsIHUn0LYnKSwKICAgICgweDQxNywgJ00nLCB1J9C3JyksCiAgICAoMHg0MTgsICdNJywgdSfQuCcpLAogICAgKDB4NDE5LCAnTScsIHUn0LknKSwKICAgICgweDQxQSwgJ00nLCB1J9C6JyksCiAgICAoMHg0MUIsICdNJywgdSfQuycpLAogICAgKDB4NDFDLCAnTScsIHUn0LwnKSwKICAgICgweDQxRCwgJ00nLCB1J9C9JyksCiAgICAoMHg0MUUsICdNJywgdSfQvicpLAogICAgKDB4NDFGLCAnTScsIHUn0L8nKSwKICAgICgweDQyMCwgJ00nLCB1J9GAJyksCiAgICAoMHg0MjEsICdNJywgdSfRgScpLAogICAgKDB4NDIyLCAnTScsIHUn0YInKSwKICAgICgweDQyMywgJ00nLCB1J9GDJyksCiAgICAoMHg0MjQsICdNJywgdSfRhCcpLAogICAgKDB4NDI1LCAnTScsIHUn0YUnKSwKICAgICgweDQyNiwgJ00nLCB1J9GGJyksCiAgICAoMHg0MjcsICdNJywgdSfRhycpLAogICAgKDB4NDI4LCAnTScsIHUn0YgnKSwKICAgICgweDQyOSwgJ00nLCB1J9GJJyksCiAgICAoMHg0MkEsICdNJywgdSfRiicpLAogICAgKDB4NDJCLCAnTScsIHUn0YsnKSwKICAgICgweDQyQywgJ00nLCB1J9GMJyksCiAgICAoMHg0MkQsICdNJywgdSfRjScpLAogICAgKDB4NDJFLCAnTScsIHUn0Y4nKSwKICAgICgweDQyRiwgJ00nLCB1J9GPJyksCiAgICAoMHg0MzAsICdWJyksCiAgICAoMHg0NjAsICdNJywgdSfRoScpLAogICAgKDB4NDYxLCAnVicpLAogICAgKDB4NDYyLCAnTScsIHUn0aMnKSwKICAgICgweDQ2MywgJ1YnKSwKICAgICgweDQ2NCwgJ00nLCB1J9GlJyksCiAgICAoMHg0NjUsICdWJyksCiAgICAoMHg0NjYsICdNJywgdSfRpycpLAogICAgKDB4NDY3LCAnVicpLAogICAgKDB4NDY4LCAnTScsIHUn0aknKSwKICAgICgweDQ2OSwgJ1YnKSwKICAgICgweDQ2QSwgJ00nLCB1J9GrJyksCiAgICAoMHg0NkIsICdWJyksCiAgICAoMHg0NkMsICdNJywgdSfRrScpLAogICAgKDB4NDZELCAnVicpLAogICAgKDB4NDZFLCAnTScsIHUn0a8nKSwKICAgICgweDQ2RiwgJ1YnKSwKICAgICgweDQ3MCwgJ00nLCB1J9GxJyksCiAgICAoMHg0NzEsICdWJyksCiAgICAoMHg0NzIsICdNJywgdSfRsycpLAogICAgKDB4NDczLCAnVicpLAogICAgKDB4NDc0LCAnTScsIHUn0bUnKSwKICAgICgweDQ3NSwgJ1YnKSwKICAgICgweDQ3NiwgJ00nLCB1J9G3JyksCiAgICAoMHg0NzcsICdWJyksCiAgICAoMHg0NzgsICdNJywgdSfRuScpLAogICAgKDB4NDc5LCAnVicpLAogICAgKDB4NDdBLCAnTScsIHUn0bsnKSwKICAgICgweDQ3QiwgJ1YnKSwKICAgICgweDQ3QywgJ00nLCB1J9G9JyksCiAgICAoMHg0N0QsICdWJyksCiAgICAoMHg0N0UsICdNJywgdSfRvycpLAogICAgKDB4NDdGLCAnVicpLAogICAgKDB4NDgwLCAnTScsIHUn0oEnKSwKICAgICgweDQ4MSwgJ1YnKSwKICAgICgweDQ4QSwgJ00nLCB1J9KLJyksCiAgICAoMHg0OEIsICdWJyksCiAgICAoMHg0OEMsICdNJywgdSfSjScpLAogICAgKDB4NDhELCAnVicpLAogICAgKDB4NDhFLCAnTScsIHUn0o8nKSwKICAgICgweDQ4RiwgJ1YnKSwKICAgICgweDQ5MCwgJ00nLCB1J9KRJyksCiAgICAoMHg0OTEsICdWJyksCiAgICAoMHg0OTIsICdNJywgdSfSkycpLAogICAgKDB4NDkzLCAnVicpLAogICAgKDB4NDk0LCAnTScsIHUn0pUnKSwKICAgICgweDQ5NSwgJ1YnKSwKICAgICgweDQ5NiwgJ00nLCB1J9KXJyksCiAgICAoMHg0OTcsICdWJyksCiAgICAoMHg0OTgsICdNJywgdSfSmScpLAogICAgKDB4NDk5LCAnVicpLAogICAgKDB4NDlBLCAnTScsIHUn0psnKSwKICAgICgweDQ5QiwgJ1YnKSwKICAgICgweDQ5QywgJ00nLCB1J9KdJyksCiAgICAoMHg0OUQsICdWJyksCiAgICAoMHg0OUUsICdNJywgdSfSnycpLAogICAgXQoKZGVmIF9zZWdfOCgpOgogICAgcmV0dXJuIFsKICAgICgweDQ5RiwgJ1YnKSwKICAgICgweDRBMCwgJ00nLCB1J9KhJyksCiAgICAoMHg0QTEsICdWJyksCiAgICAoMHg0QTIsICdNJywgdSfSoycpLAogICAgKDB4NEEzLCAnVicpLAogICAgKDB4NEE0LCAnTScsIHUn0qUnKSwKICAgICgweDRBNSwgJ1YnKSwKICAgICgweDRBNiwgJ00nLCB1J9KnJyksCiAgICAoMHg0QTcsICdWJyksCiAgICAoMHg0QTgsICdNJywgdSfSqScpLAogICAgKDB4NEE5LCAnVicpLAogICAgKDB4NEFBLCAnTScsIHUn0qsnKSwKICAgICgweDRBQiwgJ1YnKSwKICAgICgweDRBQywgJ00nLCB1J9KtJyksCiAgICAoMHg0QUQsICdWJyksCiAgICAoMHg0QUUsICdNJywgdSfSrycpLAogICAgKDB4NEFGLCAnVicpLAogICAgKDB4NEIwLCAnTScsIHUn0rEnKSwKICAgICgweDRCMSwgJ1YnKSwKICAgICgweDRCMiwgJ00nLCB1J9KzJyksCiAgICAoMHg0QjMsICdWJyksCiAgICAoMHg0QjQsICdNJywgdSfStScpLAogICAgKDB4NEI1LCAnVicpLAogICAgKDB4NEI2LCAnTScsIHUn0rcnKSwKICAgICgweDRCNywgJ1YnKSwKICAgICgweDRCOCwgJ00nLCB1J9K5JyksCiAgICAoMHg0QjksICdWJyksCiAgICAoMHg0QkEsICdNJywgdSfSuycpLAogICAgKDB4NEJCLCAnVicpLAogICAgKDB4NEJDLCAnTScsIHUn0r0nKSwKICAgICgweDRCRCwgJ1YnKSwKICAgICgweDRCRSwgJ00nLCB1J9K/JyksCiAgICAoMHg0QkYsICdWJyksCiAgICAoMHg0QzAsICdYJyksCiAgICAoMHg0QzEsICdNJywgdSfTgicpLAogICAgKDB4NEMyLCAnVicpLAogICAgKDB4NEMzLCAnTScsIHUn04QnKSwKICAgICgweDRDNCwgJ1YnKSwKICAgICgweDRDNSwgJ00nLCB1J9OGJyksCiAgICAoMHg0QzYsICdWJyksCiAgICAoMHg0QzcsICdNJywgdSfTiCcpLAogICAgKDB4NEM4LCAnVicpLAogICAgKDB4NEM5LCAnTScsIHUn04onKSwKICAgICgweDRDQSwgJ1YnKSwKICAgICgweDRDQiwgJ00nLCB1J9OMJyksCiAgICAoMHg0Q0MsICdWJyksCiAgICAoMHg0Q0QsICdNJywgdSfTjicpLAogICAgKDB4NENFLCAnVicpLAogICAgKDB4NEQwLCAnTScsIHUn05EnKSwKICAgICgweDREMSwgJ1YnKSwKICAgICgweDREMiwgJ00nLCB1J9OTJyksCiAgICAoMHg0RDMsICdWJyksCiAgICAoMHg0RDQsICdNJywgdSfTlScpLAogICAgKDB4NEQ1LCAnVicpLAogICAgKDB4NEQ2LCAnTScsIHUn05cnKSwKICAgICgweDRENywgJ1YnKSwKICAgICgweDREOCwgJ00nLCB1J9OZJyksCiAgICAoMHg0RDksICdWJyksCiAgICAoMHg0REEsICdNJywgdSfTmycpLAogICAgKDB4NERCLCAnVicpLAogICAgKDB4NERDLCAnTScsIHUn050nKSwKICAgICgweDRERCwgJ1YnKSwKICAgICgweDRERSwgJ00nLCB1J9OfJyksCiAgICAoMHg0REYsICdWJyksCiAgICAoMHg0RTAsICdNJywgdSfToScpLAogICAgKDB4NEUxLCAnVicpLAogICAgKDB4NEUyLCAnTScsIHUn06MnKSwKICAgICgweDRFMywgJ1YnKSwKICAgICgweDRFNCwgJ00nLCB1J9OlJyksCiAgICAoMHg0RTUsICdWJyksCiAgICAoMHg0RTYsICdNJywgdSfTpycpLAogICAgKDB4NEU3LCAnVicpLAogICAgKDB4NEU4LCAnTScsIHUn06knKSwKICAgICgweDRFOSwgJ1YnKSwKICAgICgweDRFQSwgJ00nLCB1J9OrJyksCiAgICAoMHg0RUIsICdWJyksCiAgICAoMHg0RUMsICdNJywgdSfTrScpLAogICAgKDB4NEVELCAnVicpLAogICAgKDB4NEVFLCAnTScsIHUn068nKSwKICAgICgweDRFRiwgJ1YnKSwKICAgICgweDRGMCwgJ00nLCB1J9OxJyksCiAgICAoMHg0RjEsICdWJyksCiAgICAoMHg0RjIsICdNJywgdSfTsycpLAogICAgKDB4NEYzLCAnVicpLAogICAgKDB4NEY0LCAnTScsIHUn07UnKSwKICAgICgweDRGNSwgJ1YnKSwKICAgICgweDRGNiwgJ00nLCB1J9O3JyksCiAgICAoMHg0RjcsICdWJyksCiAgICAoMHg0RjgsICdNJywgdSfTuScpLAogICAgKDB4NEY5LCAnVicpLAogICAgKDB4NEZBLCAnTScsIHUn07snKSwKICAgICgweDRGQiwgJ1YnKSwKICAgICgweDRGQywgJ00nLCB1J9O9JyksCiAgICAoMHg0RkQsICdWJyksCiAgICAoMHg0RkUsICdNJywgdSfTvycpLAogICAgKDB4NEZGLCAnVicpLAogICAgKDB4NTAwLCAnTScsIHUn1IEnKSwKICAgICgweDUwMSwgJ1YnKSwKICAgICgweDUwMiwgJ00nLCB1J9SDJyksCiAgICAoMHg1MDMsICdWJyksCiAgICBdCgpkZWYgX3NlZ185KCk6CiAgICByZXR1cm4gWwogICAgKDB4NTA0LCAnTScsIHUn1IUnKSwKICAgICgweDUwNSwgJ1YnKSwKICAgICgweDUwNiwgJ00nLCB1J9SHJyksCiAgICAoMHg1MDcsICdWJyksCiAgICAoMHg1MDgsICdNJywgdSfUiScpLAogICAgKDB4NTA5LCAnVicpLAogICAgKDB4NTBBLCAnTScsIHUn1IsnKSwKICAgICgweDUwQiwgJ1YnKSwKICAgICgweDUwQywgJ00nLCB1J9SNJyksCiAgICAoMHg1MEQsICdWJyksCiAgICAoMHg1MEUsICdNJywgdSfUjycpLAogICAgKDB4NTBGLCAnVicpLAogICAgKDB4NTEwLCAnTScsIHUn1JEnKSwKICAgICgweDUxMSwgJ1YnKSwKICAgICgweDUxMiwgJ00nLCB1J9STJyksCiAgICAoMHg1MTMsICdWJyksCiAgICAoMHg1MTQsICdNJywgdSfUlScpLAogICAgKDB4NTE1LCAnVicpLAogICAgKDB4NTE2LCAnTScsIHUn1JcnKSwKICAgICgweDUxNywgJ1YnKSwKICAgICgweDUxOCwgJ00nLCB1J9SZJyksCiAgICAoMHg1MTksICdWJyksCiAgICAoMHg1MUEsICdNJywgdSfUmycpLAogICAgKDB4NTFCLCAnVicpLAogICAgKDB4NTFDLCAnTScsIHUn1J0nKSwKICAgICgweDUxRCwgJ1YnKSwKICAgICgweDUxRSwgJ00nLCB1J9SfJyksCiAgICAoMHg1MUYsICdWJyksCiAgICAoMHg1MjAsICdNJywgdSfUoScpLAogICAgKDB4NTIxLCAnVicpLAogICAgKDB4NTIyLCAnTScsIHUn1KMnKSwKICAgICgweDUyMywgJ1YnKSwKICAgICgweDUyNCwgJ00nLCB1J9SlJyksCiAgICAoMHg1MjUsICdWJyksCiAgICAoMHg1MjYsICdNJywgdSfUpycpLAogICAgKDB4NTI3LCAnVicpLAogICAgKDB4NTI4LCAnWCcpLAogICAgKDB4NTMxLCAnTScsIHUn1aEnKSwKICAgICgweDUzMiwgJ00nLCB1J9WiJyksCiAgICAoMHg1MzMsICdNJywgdSfVoycpLAogICAgKDB4NTM0LCAnTScsIHUn1aQnKSwKICAgICgweDUzNSwgJ00nLCB1J9WlJyksCiAgICAoMHg1MzYsICdNJywgdSfVpicpLAogICAgKDB4NTM3LCAnTScsIHUn1acnKSwKICAgICgweDUzOCwgJ00nLCB1J9WoJyksCiAgICAoMHg1MzksICdNJywgdSfVqScpLAogICAgKDB4NTNBLCAnTScsIHUn1aonKSwKICAgICgweDUzQiwgJ00nLCB1J9WrJyksCiAgICAoMHg1M0MsICdNJywgdSfVrCcpLAogICAgKDB4NTNELCAnTScsIHUn1a0nKSwKICAgICgweDUzRSwgJ00nLCB1J9WuJyksCiAgICAoMHg1M0YsICdNJywgdSfVrycpLAogICAgKDB4NTQwLCAnTScsIHUn1bAnKSwKICAgICgweDU0MSwgJ00nLCB1J9WxJyksCiAgICAoMHg1NDIsICdNJywgdSfVsicpLAogICAgKDB4NTQzLCAnTScsIHUn1bMnKSwKICAgICgweDU0NCwgJ00nLCB1J9W0JyksCiAgICAoMHg1NDUsICdNJywgdSfVtScpLAogICAgKDB4NTQ2LCAnTScsIHUn1bYnKSwKICAgICgweDU0NywgJ00nLCB1J9W3JyksCiAgICAoMHg1NDgsICdNJywgdSfVuCcpLAogICAgKDB4NTQ5LCAnTScsIHUn1bknKSwKICAgICgweDU0QSwgJ00nLCB1J9W6JyksCiAgICAoMHg1NEIsICdNJywgdSfVuycpLAogICAgKDB4NTRDLCAnTScsIHUn1bwnKSwKICAgICgweDU0RCwgJ00nLCB1J9W9JyksCiAgICAoMHg1NEUsICdNJywgdSfVvicpLAogICAgKDB4NTRGLCAnTScsIHUn1b8nKSwKICAgICgweDU1MCwgJ00nLCB1J9aAJyksCiAgICAoMHg1NTEsICdNJywgdSfWgScpLAogICAgKDB4NTUyLCAnTScsIHUn1oInKSwKICAgICgweDU1MywgJ00nLCB1J9aDJyksCiAgICAoMHg1NTQsICdNJywgdSfWhCcpLAogICAgKDB4NTU1LCAnTScsIHUn1oUnKSwKICAgICgweDU1NiwgJ00nLCB1J9aGJyksCiAgICAoMHg1NTcsICdYJyksCiAgICAoMHg1NTksICdWJyksCiAgICAoMHg1NjAsICdYJyksCiAgICAoMHg1NjEsICdWJyksCiAgICAoMHg1ODcsICdNJywgdSfVpdaCJyksCiAgICAoMHg1ODgsICdYJyksCiAgICAoMHg1ODksICdWJyksCiAgICAoMHg1OEIsICdYJyksCiAgICAoMHg1OEYsICdWJyksCiAgICAoMHg1OTAsICdYJyksCiAgICAoMHg1OTEsICdWJyksCiAgICAoMHg1QzgsICdYJyksCiAgICAoMHg1RDAsICdWJyksCiAgICAoMHg1RUIsICdYJyksCiAgICAoMHg1RjAsICdWJyksCiAgICAoMHg1RjUsICdYJyksCiAgICAoMHg2MDYsICdWJyksCiAgICAoMHg2MUMsICdYJyksCiAgICAoMHg2MUUsICdWJyksCiAgICAoMHg2NzUsICdNJywgdSfYp9m0JyksCiAgICAoMHg2NzYsICdNJywgdSfZiNm0JyksCiAgICAoMHg2NzcsICdNJywgdSfbh9m0JyksCiAgICAoMHg2NzgsICdNJywgdSfZitm0JyksCiAgICAoMHg2NzksICdWJyksCiAgICAoMHg2REQsICdYJyksCiAgICBdCgpkZWYgX3NlZ18xMCgpOgogICAgcmV0dXJuIFsKICAgICgweDZERSwgJ1YnKSwKICAgICgweDcwRSwgJ1gnKSwKICAgICgweDcxMCwgJ1YnKSwKICAgICgweDc0QiwgJ1gnKSwKICAgICgweDc0RCwgJ1YnKSwKICAgICgweDdCMiwgJ1gnKSwKICAgICgweDdDMCwgJ1YnKSwKICAgICgweDdGQiwgJ1gnKSwKICAgICgweDgwMCwgJ1YnKSwKICAgICgweDgyRSwgJ1gnKSwKICAgICgweDgzMCwgJ1YnKSwKICAgICgweDgzRiwgJ1gnKSwKICAgICgweDg0MCwgJ1YnKSwKICAgICgweDg1QywgJ1gnKSwKICAgICgweDg1RSwgJ1YnKSwKICAgICgweDg1RiwgJ1gnKSwKICAgICgweDhBMCwgJ1YnKSwKICAgICgweDhBMSwgJ1gnKSwKICAgICgweDhBMiwgJ1YnKSwKICAgICgweDhBRCwgJ1gnKSwKICAgICgweDhFNCwgJ1YnKSwKICAgICgweDhGRiwgJ1gnKSwKICAgICgweDkwMCwgJ1YnKSwKICAgICgweDk1OCwgJ00nLCB1J+CkleCkvCcpLAogICAgKDB4OTU5LCAnTScsIHUn4KSW4KS8JyksCiAgICAoMHg5NUEsICdNJywgdSfgpJfgpLwnKSwKICAgICgweDk1QiwgJ00nLCB1J+CknOCkvCcpLAogICAgKDB4OTVDLCAnTScsIHUn4KSh4KS8JyksCiAgICAoMHg5NUQsICdNJywgdSfgpKLgpLwnKSwKICAgICgweDk1RSwgJ00nLCB1J+Ckq+CkvCcpLAogICAgKDB4OTVGLCAnTScsIHUn4KSv4KS8JyksCiAgICAoMHg5NjAsICdWJyksCiAgICAoMHg5NzgsICdYJyksCiAgICAoMHg5NzksICdWJyksCiAgICAoMHg5ODAsICdYJyksCiAgICAoMHg5ODEsICdWJyksCiAgICAoMHg5ODQsICdYJyksCiAgICAoMHg5ODUsICdWJyksCiAgICAoMHg5OEQsICdYJyksCiAgICAoMHg5OEYsICdWJyksCiAgICAoMHg5OTEsICdYJyksCiAgICAoMHg5OTMsICdWJyksCiAgICAoMHg5QTksICdYJyksCiAgICAoMHg5QUEsICdWJyksCiAgICAoMHg5QjEsICdYJyksCiAgICAoMHg5QjIsICdWJyksCiAgICAoMHg5QjMsICdYJyksCiAgICAoMHg5QjYsICdWJyksCiAgICAoMHg5QkEsICdYJyksCiAgICAoMHg5QkMsICdWJyksCiAgICAoMHg5QzUsICdYJyksCiAgICAoMHg5QzcsICdWJyksCiAgICAoMHg5QzksICdYJyksCiAgICAoMHg5Q0IsICdWJyksCiAgICAoMHg5Q0YsICdYJyksCiAgICAoMHg5RDcsICdWJyksCiAgICAoMHg5RDgsICdYJyksCiAgICAoMHg5REMsICdNJywgdSfgpqHgprwnKSwKICAgICgweDlERCwgJ00nLCB1J+CmouCmvCcpLAogICAgKDB4OURFLCAnWCcpLAogICAgKDB4OURGLCAnTScsIHUn4Kav4Ka8JyksCiAgICAoMHg5RTAsICdWJyksCiAgICAoMHg5RTQsICdYJyksCiAgICAoMHg5RTYsICdWJyksCiAgICAoMHg5RkMsICdYJyksCiAgICAoMHhBMDEsICdWJyksCiAgICAoMHhBMDQsICdYJyksCiAgICAoMHhBMDUsICdWJyksCiAgICAoMHhBMEIsICdYJyksCiAgICAoMHhBMEYsICdWJyksCiAgICAoMHhBMTEsICdYJyksCiAgICAoMHhBMTMsICdWJyksCiAgICAoMHhBMjksICdYJyksCiAgICAoMHhBMkEsICdWJyksCiAgICAoMHhBMzEsICdYJyksCiAgICAoMHhBMzIsICdWJyksCiAgICAoMHhBMzMsICdNJywgdSfgqLLgqLwnKSwKICAgICgweEEzNCwgJ1gnKSwKICAgICgweEEzNSwgJ1YnKSwKICAgICgweEEzNiwgJ00nLCB1J+CouOCovCcpLAogICAgKDB4QTM3LCAnWCcpLAogICAgKDB4QTM4LCAnVicpLAogICAgKDB4QTNBLCAnWCcpLAogICAgKDB4QTNDLCAnVicpLAogICAgKDB4QTNELCAnWCcpLAogICAgKDB4QTNFLCAnVicpLAogICAgKDB4QTQzLCAnWCcpLAogICAgKDB4QTQ3LCAnVicpLAogICAgKDB4QTQ5LCAnWCcpLAogICAgKDB4QTRCLCAnVicpLAogICAgKDB4QTRFLCAnWCcpLAogICAgKDB4QTUxLCAnVicpLAogICAgKDB4QTUyLCAnWCcpLAogICAgKDB4QTU5LCAnTScsIHUn4KiW4Ki8JyksCiAgICAoMHhBNUEsICdNJywgdSfgqJfgqLwnKSwKICAgICgweEE1QiwgJ00nLCB1J+ConOCovCcpLAogICAgKDB4QTVDLCAnVicpLAogICAgKDB4QTVELCAnWCcpLAogICAgKDB4QTVFLCAnTScsIHUn4Kir4Ki8JyksCiAgICAoMHhBNUYsICdYJyksCiAgICBdCgpkZWYgX3NlZ18xMSgpOgogICAgcmV0dXJuIFsKICAgICgweEE2NiwgJ1YnKSwKICAgICgweEE3NiwgJ1gnKSwKICAgICgweEE4MSwgJ1YnKSwKICAgICgweEE4NCwgJ1gnKSwKICAgICgweEE4NSwgJ1YnKSwKICAgICgweEE4RSwgJ1gnKSwKICAgICgweEE4RiwgJ1YnKSwKICAgICgweEE5MiwgJ1gnKSwKICAgICgweEE5MywgJ1YnKSwKICAgICgweEFBOSwgJ1gnKSwKICAgICgweEFBQSwgJ1YnKSwKICAgICgweEFCMSwgJ1gnKSwKICAgICgweEFCMiwgJ1YnKSwKICAgICgweEFCNCwgJ1gnKSwKICAgICgweEFCNSwgJ1YnKSwKICAgICgweEFCQSwgJ1gnKSwKICAgICgweEFCQywgJ1YnKSwKICAgICgweEFDNiwgJ1gnKSwKICAgICgweEFDNywgJ1YnKSwKICAgICgweEFDQSwgJ1gnKSwKICAgICgweEFDQiwgJ1YnKSwKICAgICgweEFDRSwgJ1gnKSwKICAgICgweEFEMCwgJ1YnKSwKICAgICgweEFEMSwgJ1gnKSwKICAgICgweEFFMCwgJ1YnKSwKICAgICgweEFFNCwgJ1gnKSwKICAgICgweEFFNiwgJ1YnKSwKICAgICgweEFGMiwgJ1gnKSwKICAgICgweEIwMSwgJ1YnKSwKICAgICgweEIwNCwgJ1gnKSwKICAgICgweEIwNSwgJ1YnKSwKICAgICgweEIwRCwgJ1gnKSwKICAgICgweEIwRiwgJ1YnKSwKICAgICgweEIxMSwgJ1gnKSwKICAgICgweEIxMywgJ1YnKSwKICAgICgweEIyOSwgJ1gnKSwKICAgICgweEIyQSwgJ1YnKSwKICAgICgweEIzMSwgJ1gnKSwKICAgICgweEIzMiwgJ1YnKSwKICAgICgweEIzNCwgJ1gnKSwKICAgICgweEIzNSwgJ1YnKSwKICAgICgweEIzQSwgJ1gnKSwKICAgICgweEIzQywgJ1YnKSwKICAgICgweEI0NSwgJ1gnKSwKICAgICgweEI0NywgJ1YnKSwKICAgICgweEI0OSwgJ1gnKSwKICAgICgweEI0QiwgJ1YnKSwKICAgICgweEI0RSwgJ1gnKSwKICAgICgweEI1NiwgJ1YnKSwKICAgICgweEI1OCwgJ1gnKSwKICAgICgweEI1QywgJ00nLCB1J+CsoeCsvCcpLAogICAgKDB4QjVELCAnTScsIHUn4Kyi4Ky8JyksCiAgICAoMHhCNUUsICdYJyksCiAgICAoMHhCNUYsICdWJyksCiAgICAoMHhCNjQsICdYJyksCiAgICAoMHhCNjYsICdWJyksCiAgICAoMHhCNzgsICdYJyksCiAgICAoMHhCODIsICdWJyksCiAgICAoMHhCODQsICdYJyksCiAgICAoMHhCODUsICdWJyksCiAgICAoMHhCOEIsICdYJyksCiAgICAoMHhCOEUsICdWJyksCiAgICAoMHhCOTEsICdYJyksCiAgICAoMHhCOTIsICdWJyksCiAgICAoMHhCOTYsICdYJyksCiAgICAoMHhCOTksICdWJyksCiAgICAoMHhCOUIsICdYJyksCiAgICAoMHhCOUMsICdWJyksCiAgICAoMHhCOUQsICdYJyksCiAgICAoMHhCOUUsICdWJyksCiAgICAoMHhCQTAsICdYJyksCiAgICAoMHhCQTMsICdWJyksCiAgICAoMHhCQTUsICdYJyksCiAgICAoMHhCQTgsICdWJyksCiAgICAoMHhCQUIsICdYJyksCiAgICAoMHhCQUUsICdWJyksCiAgICAoMHhCQkEsICdYJyksCiAgICAoMHhCQkUsICdWJyksCiAgICAoMHhCQzMsICdYJyksCiAgICAoMHhCQzYsICdWJyksCiAgICAoMHhCQzksICdYJyksCiAgICAoMHhCQ0EsICdWJyksCiAgICAoMHhCQ0UsICdYJyksCiAgICAoMHhCRDAsICdWJyksCiAgICAoMHhCRDEsICdYJyksCiAgICAoMHhCRDcsICdWJyksCiAgICAoMHhCRDgsICdYJyksCiAgICAoMHhCRTYsICdWJyksCiAgICAoMHhCRkIsICdYJyksCiAgICAoMHhDMDEsICdWJyksCiAgICAoMHhDMDQsICdYJyksCiAgICAoMHhDMDUsICdWJyksCiAgICAoMHhDMEQsICdYJyksCiAgICAoMHhDMEUsICdWJyksCiAgICAoMHhDMTEsICdYJyksCiAgICAoMHhDMTIsICdWJyksCiAgICAoMHhDMjksICdYJyksCiAgICAoMHhDMkEsICdWJyksCiAgICAoMHhDMzQsICdYJyksCiAgICAoMHhDMzUsICdWJyksCiAgICBdCgpkZWYgX3NlZ18xMigpOgogICAgcmV0dXJuIFsKICAgICgweEMzQSwgJ1gnKSwKICAgICgweEMzRCwgJ1YnKSwKICAgICgweEM0NSwgJ1gnKSwKICAgICgweEM0NiwgJ1YnKSwKICAgICgweEM0OSwgJ1gnKSwKICAgICgweEM0QSwgJ1YnKSwKICAgICgweEM0RSwgJ1gnKSwKICAgICgweEM1NSwgJ1YnKSwKICAgICgweEM1NywgJ1gnKSwKICAgICgweEM1OCwgJ1YnKSwKICAgICgweEM1QSwgJ1gnKSwKICAgICgweEM2MCwgJ1YnKSwKICAgICgweEM2NCwgJ1gnKSwKICAgICgweEM2NiwgJ1YnKSwKICAgICgweEM3MCwgJ1gnKSwKICAgICgweEM3OCwgJ1YnKSwKICAgICgweEM4MCwgJ1gnKSwKICAgICgweEM4MiwgJ1YnKSwKICAgICgweEM4NCwgJ1gnKSwKICAgICgweEM4NSwgJ1YnKSwKICAgICgweEM4RCwgJ1gnKSwKICAgICgweEM4RSwgJ1YnKSwKICAgICgweEM5MSwgJ1gnKSwKICAgICgweEM5MiwgJ1YnKSwKICAgICgweENBOSwgJ1gnKSwKICAgICgweENBQSwgJ1YnKSwKICAgICgweENCNCwgJ1gnKSwKICAgICgweENCNSwgJ1YnKSwKICAgICgweENCQSwgJ1gnKSwKICAgICgweENCQywgJ1YnKSwKICAgICgweENDNSwgJ1gnKSwKICAgICgweENDNiwgJ1YnKSwKICAgICgweENDOSwgJ1gnKSwKICAgICgweENDQSwgJ1YnKSwKICAgICgweENDRSwgJ1gnKSwKICAgICgweENENSwgJ1YnKSwKICAgICgweENENywgJ1gnKSwKICAgICgweENERSwgJ1YnKSwKICAgICgweENERiwgJ1gnKSwKICAgICgweENFMCwgJ1YnKSwKICAgICgweENFNCwgJ1gnKSwKICAgICgweENFNiwgJ1YnKSwKICAgICgweENGMCwgJ1gnKSwKICAgICgweENGMSwgJ1YnKSwKICAgICgweENGMywgJ1gnKSwKICAgICgweEQwMiwgJ1YnKSwKICAgICgweEQwNCwgJ1gnKSwKICAgICgweEQwNSwgJ1YnKSwKICAgICgweEQwRCwgJ1gnKSwKICAgICgweEQwRSwgJ1YnKSwKICAgICgweEQxMSwgJ1gnKSwKICAgICgweEQxMiwgJ1YnKSwKICAgICgweEQzQiwgJ1gnKSwKICAgICgweEQzRCwgJ1YnKSwKICAgICgweEQ0NSwgJ1gnKSwKICAgICgweEQ0NiwgJ1YnKSwKICAgICgweEQ0OSwgJ1gnKSwKICAgICgweEQ0QSwgJ1YnKSwKICAgICgweEQ0RiwgJ1gnKSwKICAgICgweEQ1NywgJ1YnKSwKICAgICgweEQ1OCwgJ1gnKSwKICAgICgweEQ2MCwgJ1YnKSwKICAgICgweEQ2NCwgJ1gnKSwKICAgICgweEQ2NiwgJ1YnKSwKICAgICgweEQ3NiwgJ1gnKSwKICAgICgweEQ3OSwgJ1YnKSwKICAgICgweEQ4MCwgJ1gnKSwKICAgICgweEQ4MiwgJ1YnKSwKICAgICgweEQ4NCwgJ1gnKSwKICAgICgweEQ4NSwgJ1YnKSwKICAgICgweEQ5NywgJ1gnKSwKICAgICgweEQ5QSwgJ1YnKSwKICAgICgweERCMiwgJ1gnKSwKICAgICgweERCMywgJ1YnKSwKICAgICgweERCQywgJ1gnKSwKICAgICgweERCRCwgJ1YnKSwKICAgICgweERCRSwgJ1gnKSwKICAgICgweERDMCwgJ1YnKSwKICAgICgweERDNywgJ1gnKSwKICAgICgweERDQSwgJ1YnKSwKICAgICgweERDQiwgJ1gnKSwKICAgICgweERDRiwgJ1YnKSwKICAgICgweERENSwgJ1gnKSwKICAgICgweERENiwgJ1YnKSwKICAgICgweERENywgJ1gnKSwKICAgICgweEREOCwgJ1YnKSwKICAgICgweERFMCwgJ1gnKSwKICAgICgweERGMiwgJ1YnKSwKICAgICgweERGNSwgJ1gnKSwKICAgICgweEUwMSwgJ1YnKSwKICAgICgweEUzMywgJ00nLCB1J+C5jeC4sicpLAogICAgKDB4RTM0LCAnVicpLAogICAgKDB4RTNCLCAnWCcpLAogICAgKDB4RTNGLCAnVicpLAogICAgKDB4RTVDLCAnWCcpLAogICAgKDB4RTgxLCAnVicpLAogICAgKDB4RTgzLCAnWCcpLAogICAgKDB4RTg0LCAnVicpLAogICAgKDB4RTg1LCAnWCcpLAogICAgKDB4RTg3LCAnVicpLAogICAgXQoKZGVmIF9zZWdfMTMoKToKICAgIHJldHVybiBbCiAgICAoMHhFODksICdYJyksCiAgICAoMHhFOEEsICdWJyksCiAgICAoMHhFOEIsICdYJyksCiAgICAoMHhFOEQsICdWJyksCiAgICAoMHhFOEUsICdYJyksCiAgICAoMHhFOTQsICdWJyksCiAgICAoMHhFOTgsICdYJyksCiAgICAoMHhFOTksICdWJyksCiAgICAoMHhFQTAsICdYJyksCiAgICAoMHhFQTEsICdWJyksCiAgICAoMHhFQTQsICdYJyksCiAgICAoMHhFQTUsICdWJyksCiAgICAoMHhFQTYsICdYJyksCiAgICAoMHhFQTcsICdWJyksCiAgICAoMHhFQTgsICdYJyksCiAgICAoMHhFQUEsICdWJyksCiAgICAoMHhFQUMsICdYJyksCiAgICAoMHhFQUQsICdWJyksCiAgICAoMHhFQjMsICdNJywgdSfgu43gurInKSwKICAgICgweEVCNCwgJ1YnKSwKICAgICgweEVCQSwgJ1gnKSwKICAgICgweEVCQiwgJ1YnKSwKICAgICgweEVCRSwgJ1gnKSwKICAgICgweEVDMCwgJ1YnKSwKICAgICgweEVDNSwgJ1gnKSwKICAgICgweEVDNiwgJ1YnKSwKICAgICgweEVDNywgJ1gnKSwKICAgICgweEVDOCwgJ1YnKSwKICAgICgweEVDRSwgJ1gnKSwKICAgICgweEVEMCwgJ1YnKSwKICAgICgweEVEQSwgJ1gnKSwKICAgICgweEVEQywgJ00nLCB1J+C6q+C6mScpLAogICAgKDB4RURELCAnTScsIHUn4Lqr4LqhJyksCiAgICAoMHhFREUsICdWJyksCiAgICAoMHhFRTAsICdYJyksCiAgICAoMHhGMDAsICdWJyksCiAgICAoMHhGMEMsICdNJywgdSfgvIsnKSwKICAgICgweEYwRCwgJ1YnKSwKICAgICgweEY0MywgJ00nLCB1J+C9guC+tycpLAogICAgKDB4RjQ0LCAnVicpLAogICAgKDB4RjQ4LCAnWCcpLAogICAgKDB4RjQ5LCAnVicpLAogICAgKDB4RjRELCAnTScsIHUn4L2M4L63JyksCiAgICAoMHhGNEUsICdWJyksCiAgICAoMHhGNTIsICdNJywgdSfgvZHgvrcnKSwKICAgICgweEY1MywgJ1YnKSwKICAgICgweEY1NywgJ00nLCB1J+C9luC+tycpLAogICAgKDB4RjU4LCAnVicpLAogICAgKDB4RjVDLCAnTScsIHUn4L2b4L63JyksCiAgICAoMHhGNUQsICdWJyksCiAgICAoMHhGNjksICdNJywgdSfgvYDgvrUnKSwKICAgICgweEY2QSwgJ1YnKSwKICAgICgweEY2RCwgJ1gnKSwKICAgICgweEY3MSwgJ1YnKSwKICAgICgweEY3MywgJ00nLCB1J+C9seC9sicpLAogICAgKDB4Rjc0LCAnVicpLAogICAgKDB4Rjc1LCAnTScsIHUn4L2x4L20JyksCiAgICAoMHhGNzYsICdNJywgdSfgvrLgvoAnKSwKICAgICgweEY3NywgJ00nLCB1J+C+suC9seC+gCcpLAogICAgKDB4Rjc4LCAnTScsIHUn4L6z4L6AJyksCiAgICAoMHhGNzksICdNJywgdSfgvrPgvbHgvoAnKSwKICAgICgweEY3QSwgJ1YnKSwKICAgICgweEY4MSwgJ00nLCB1J+C9seC+gCcpLAogICAgKDB4RjgyLCAnVicpLAogICAgKDB4RjkzLCAnTScsIHUn4L6S4L63JyksCiAgICAoMHhGOTQsICdWJyksCiAgICAoMHhGOTgsICdYJyksCiAgICAoMHhGOTksICdWJyksCiAgICAoMHhGOUQsICdNJywgdSfgvpzgvrcnKSwKICAgICgweEY5RSwgJ1YnKSwKICAgICgweEZBMiwgJ00nLCB1J+C+oeC+tycpLAogICAgKDB4RkEzLCAnVicpLAogICAgKDB4RkE3LCAnTScsIHUn4L6m4L63JyksCiAgICAoMHhGQTgsICdWJyksCiAgICAoMHhGQUMsICdNJywgdSfgvqvgvrcnKSwKICAgICgweEZBRCwgJ1YnKSwKICAgICgweEZCOSwgJ00nLCB1J+C+kOC+tScpLAogICAgKDB4RkJBLCAnVicpLAogICAgKDB4RkJELCAnWCcpLAogICAgKDB4RkJFLCAnVicpLAogICAgKDB4RkNELCAnWCcpLAogICAgKDB4RkNFLCAnVicpLAogICAgKDB4RkRCLCAnWCcpLAogICAgKDB4MTAwMCwgJ1YnKSwKICAgICgweDEwQTAsICdYJyksCiAgICAoMHgxMEM3LCAnTScsIHUn4rSnJyksCiAgICAoMHgxMEM4LCAnWCcpLAogICAgKDB4MTBDRCwgJ00nLCB1J+K0rScpLAogICAgKDB4MTBDRSwgJ1gnKSwKICAgICgweDEwRDAsICdWJyksCiAgICAoMHgxMEZDLCAnTScsIHUn4YOcJyksCiAgICAoMHgxMEZELCAnVicpLAogICAgKDB4MTE1RiwgJ1gnKSwKICAgICgweDExNjEsICdWJyksCiAgICAoMHgxMjQ5LCAnWCcpLAogICAgKDB4MTI0QSwgJ1YnKSwKICAgICgweDEyNEUsICdYJyksCiAgICAoMHgxMjUwLCAnVicpLAogICAgKDB4MTI1NywgJ1gnKSwKICAgICgweDEyNTgsICdWJyksCiAgICBdCgpkZWYgX3NlZ18xNCgpOgogICAgcmV0dXJuIFsKICAgICgweDEyNTksICdYJyksCiAgICAoMHgxMjVBLCAnVicpLAogICAgKDB4MTI1RSwgJ1gnKSwKICAgICgweDEyNjAsICdWJyksCiAgICAoMHgxMjg5LCAnWCcpLAogICAgKDB4MTI4QSwgJ1YnKSwKICAgICgweDEyOEUsICdYJyksCiAgICAoMHgxMjkwLCAnVicpLAogICAgKDB4MTJCMSwgJ1gnKSwKICAgICgweDEyQjIsICdWJyksCiAgICAoMHgxMkI2LCAnWCcpLAogICAgKDB4MTJCOCwgJ1YnKSwKICAgICgweDEyQkYsICdYJyksCiAgICAoMHgxMkMwLCAnVicpLAogICAgKDB4MTJDMSwgJ1gnKSwKICAgICgweDEyQzIsICdWJyksCiAgICAoMHgxMkM2LCAnWCcpLAogICAgKDB4MTJDOCwgJ1YnKSwKICAgICgweDEyRDcsICdYJyksCiAgICAoMHgxMkQ4LCAnVicpLAogICAgKDB4MTMxMSwgJ1gnKSwKICAgICgweDEzMTIsICdWJyksCiAgICAoMHgxMzE2LCAnWCcpLAogICAgKDB4MTMxOCwgJ1YnKSwKICAgICgweDEzNUIsICdYJyksCiAgICAoMHgxMzVELCAnVicpLAogICAgKDB4MTM3RCwgJ1gnKSwKICAgICgweDEzODAsICdWJyksCiAgICAoMHgxMzlBLCAnWCcpLAogICAgKDB4MTNBMCwgJ1YnKSwKICAgICgweDEzRjUsICdYJyksCiAgICAoMHgxNDAwLCAnVicpLAogICAgKDB4MTY4MCwgJ1gnKSwKICAgICgweDE2ODEsICdWJyksCiAgICAoMHgxNjlELCAnWCcpLAogICAgKDB4MTZBMCwgJ1YnKSwKICAgICgweDE2RjEsICdYJyksCiAgICAoMHgxNzAwLCAnVicpLAogICAgKDB4MTcwRCwgJ1gnKSwKICAgICgweDE3MEUsICdWJyksCiAgICAoMHgxNzE1LCAnWCcpLAogICAgKDB4MTcyMCwgJ1YnKSwKICAgICgweDE3MzcsICdYJyksCiAgICAoMHgxNzQwLCAnVicpLAogICAgKDB4MTc1NCwgJ1gnKSwKICAgICgweDE3NjAsICdWJyksCiAgICAoMHgxNzZELCAnWCcpLAogICAgKDB4MTc2RSwgJ1YnKSwKICAgICgweDE3NzEsICdYJyksCiAgICAoMHgxNzcyLCAnVicpLAogICAgKDB4MTc3NCwgJ1gnKSwKICAgICgweDE3ODAsICdWJyksCiAgICAoMHgxN0I0LCAnWCcpLAogICAgKDB4MTdCNiwgJ1YnKSwKICAgICgweDE3REUsICdYJyksCiAgICAoMHgxN0UwLCAnVicpLAogICAgKDB4MTdFQSwgJ1gnKSwKICAgICgweDE3RjAsICdWJyksCiAgICAoMHgxN0ZBLCAnWCcpLAogICAgKDB4MTgwMCwgJ1YnKSwKICAgICgweDE4MDYsICdYJyksCiAgICAoMHgxODA3LCAnVicpLAogICAgKDB4MTgwQiwgJ0knKSwKICAgICgweDE4MEUsICdYJyksCiAgICAoMHgxODEwLCAnVicpLAogICAgKDB4MTgxQSwgJ1gnKSwKICAgICgweDE4MjAsICdWJyksCiAgICAoMHgxODc4LCAnWCcpLAogICAgKDB4MTg4MCwgJ1YnKSwKICAgICgweDE4QUIsICdYJyksCiAgICAoMHgxOEIwLCAnVicpLAogICAgKDB4MThGNiwgJ1gnKSwKICAgICgweDE5MDAsICdWJyksCiAgICAoMHgxOTFELCAnWCcpLAogICAgKDB4MTkyMCwgJ1YnKSwKICAgICgweDE5MkMsICdYJyksCiAgICAoMHgxOTMwLCAnVicpLAogICAgKDB4MTkzQywgJ1gnKSwKICAgICgweDE5NDAsICdWJyksCiAgICAoMHgxOTQxLCAnWCcpLAogICAgKDB4MTk0NCwgJ1YnKSwKICAgICgweDE5NkUsICdYJyksCiAgICAoMHgxOTcwLCAnVicpLAogICAgKDB4MTk3NSwgJ1gnKSwKICAgICgweDE5ODAsICdWJyksCiAgICAoMHgxOUFDLCAnWCcpLAogICAgKDB4MTlCMCwgJ1YnKSwKICAgICgweDE5Q0EsICdYJyksCiAgICAoMHgxOUQwLCAnVicpLAogICAgKDB4MTlEQiwgJ1gnKSwKICAgICgweDE5REUsICdWJyksCiAgICAoMHgxQTFDLCAnWCcpLAogICAgKDB4MUExRSwgJ1YnKSwKICAgICgweDFBNUYsICdYJyksCiAgICAoMHgxQTYwLCAnVicpLAogICAgKDB4MUE3RCwgJ1gnKSwKICAgICgweDFBN0YsICdWJyksCiAgICAoMHgxQThBLCAnWCcpLAogICAgKDB4MUE5MCwgJ1YnKSwKICAgICgweDFBOUEsICdYJyksCiAgICBdCgpkZWYgX3NlZ18xNSgpOgogICAgcmV0dXJuIFsKICAgICgweDFBQTAsICdWJyksCiAgICAoMHgxQUFFLCAnWCcpLAogICAgKDB4MUIwMCwgJ1YnKSwKICAgICgweDFCNEMsICdYJyksCiAgICAoMHgxQjUwLCAnVicpLAogICAgKDB4MUI3RCwgJ1gnKSwKICAgICgweDFCODAsICdWJyksCiAgICAoMHgxQkY0LCAnWCcpLAogICAgKDB4MUJGQywgJ1YnKSwKICAgICgweDFDMzgsICdYJyksCiAgICAoMHgxQzNCLCAnVicpLAogICAgKDB4MUM0QSwgJ1gnKSwKICAgICgweDFDNEQsICdWJyksCiAgICAoMHgxQzgwLCAnWCcpLAogICAgKDB4MUNDMCwgJ1YnKSwKICAgICgweDFDQzgsICdYJyksCiAgICAoMHgxQ0QwLCAnVicpLAogICAgKDB4MUNGNywgJ1gnKSwKICAgICgweDFEMDAsICdWJyksCiAgICAoMHgxRDJDLCAnTScsIHUnYScpLAogICAgKDB4MUQyRCwgJ00nLCB1J8OmJyksCiAgICAoMHgxRDJFLCAnTScsIHUnYicpLAogICAgKDB4MUQyRiwgJ1YnKSwKICAgICgweDFEMzAsICdNJywgdSdkJyksCiAgICAoMHgxRDMxLCAnTScsIHUnZScpLAogICAgKDB4MUQzMiwgJ00nLCB1J8edJyksCiAgICAoMHgxRDMzLCAnTScsIHUnZycpLAogICAgKDB4MUQzNCwgJ00nLCB1J2gnKSwKICAgICgweDFEMzUsICdNJywgdSdpJyksCiAgICAoMHgxRDM2LCAnTScsIHUnaicpLAogICAgKDB4MUQzNywgJ00nLCB1J2snKSwKICAgICgweDFEMzgsICdNJywgdSdsJyksCiAgICAoMHgxRDM5LCAnTScsIHUnbScpLAogICAgKDB4MUQzQSwgJ00nLCB1J24nKSwKICAgICgweDFEM0IsICdWJyksCiAgICAoMHgxRDNDLCAnTScsIHUnbycpLAogICAgKDB4MUQzRCwgJ00nLCB1J8ijJyksCiAgICAoMHgxRDNFLCAnTScsIHUncCcpLAogICAgKDB4MUQzRiwgJ00nLCB1J3InKSwKICAgICgweDFENDAsICdNJywgdSd0JyksCiAgICAoMHgxRDQxLCAnTScsIHUndScpLAogICAgKDB4MUQ0MiwgJ00nLCB1J3cnKSwKICAgICgweDFENDMsICdNJywgdSdhJyksCiAgICAoMHgxRDQ0LCAnTScsIHUnyZAnKSwKICAgICgweDFENDUsICdNJywgdSfJkScpLAogICAgKDB4MUQ0NiwgJ00nLCB1J+G0gicpLAogICAgKDB4MUQ0NywgJ00nLCB1J2InKSwKICAgICgweDFENDgsICdNJywgdSdkJyksCiAgICAoMHgxRDQ5LCAnTScsIHUnZScpLAogICAgKDB4MUQ0QSwgJ00nLCB1J8mZJyksCiAgICAoMHgxRDRCLCAnTScsIHUnyZsnKSwKICAgICgweDFENEMsICdNJywgdSfJnCcpLAogICAgKDB4MUQ0RCwgJ00nLCB1J2cnKSwKICAgICgweDFENEUsICdWJyksCiAgICAoMHgxRDRGLCAnTScsIHUnaycpLAogICAgKDB4MUQ1MCwgJ00nLCB1J20nKSwKICAgICgweDFENTEsICdNJywgdSfFiycpLAogICAgKDB4MUQ1MiwgJ00nLCB1J28nKSwKICAgICgweDFENTMsICdNJywgdSfJlCcpLAogICAgKDB4MUQ1NCwgJ00nLCB1J+G0licpLAogICAgKDB4MUQ1NSwgJ00nLCB1J+G0lycpLAogICAgKDB4MUQ1NiwgJ00nLCB1J3AnKSwKICAgICgweDFENTcsICdNJywgdSd0JyksCiAgICAoMHgxRDU4LCAnTScsIHUndScpLAogICAgKDB4MUQ1OSwgJ00nLCB1J+G0nScpLAogICAgKDB4MUQ1QSwgJ00nLCB1J8mvJyksCiAgICAoMHgxRDVCLCAnTScsIHUndicpLAogICAgKDB4MUQ1QywgJ00nLCB1J+G0pScpLAogICAgKDB4MUQ1RCwgJ00nLCB1J86yJyksCiAgICAoMHgxRDVFLCAnTScsIHUnzrMnKSwKICAgICgweDFENUYsICdNJywgdSfOtCcpLAogICAgKDB4MUQ2MCwgJ00nLCB1J8+GJyksCiAgICAoMHgxRDYxLCAnTScsIHUnz4cnKSwKICAgICgweDFENjIsICdNJywgdSdpJyksCiAgICAoMHgxRDYzLCAnTScsIHUncicpLAogICAgKDB4MUQ2NCwgJ00nLCB1J3UnKSwKICAgICgweDFENjUsICdNJywgdSd2JyksCiAgICAoMHgxRDY2LCAnTScsIHUnzrInKSwKICAgICgweDFENjcsICdNJywgdSfOsycpLAogICAgKDB4MUQ2OCwgJ00nLCB1J8+BJyksCiAgICAoMHgxRDY5LCAnTScsIHUnz4YnKSwKICAgICgweDFENkEsICdNJywgdSfPhycpLAogICAgKDB4MUQ2QiwgJ1YnKSwKICAgICgweDFENzgsICdNJywgdSfQvScpLAogICAgKDB4MUQ3OSwgJ1YnKSwKICAgICgweDFEOUIsICdNJywgdSfJkicpLAogICAgKDB4MUQ5QywgJ00nLCB1J2MnKSwKICAgICgweDFEOUQsICdNJywgdSfJlScpLAogICAgKDB4MUQ5RSwgJ00nLCB1J8OwJyksCiAgICAoMHgxRDlGLCAnTScsIHUnyZwnKSwKICAgICgweDFEQTAsICdNJywgdSdmJyksCiAgICAoMHgxREExLCAnTScsIHUnyZ8nKSwKICAgICgweDFEQTIsICdNJywgdSfJoScpLAogICAgKDB4MURBMywgJ00nLCB1J8mlJyksCiAgICAoMHgxREE0LCAnTScsIHUnyagnKSwKICAgICgweDFEQTUsICdNJywgdSfJqScpLAogICAgKDB4MURBNiwgJ00nLCB1J8mqJyksCiAgICAoMHgxREE3LCAnTScsIHUn4bW7JyksCiAgICAoMHgxREE4LCAnTScsIHUnyp0nKSwKICAgICgweDFEQTksICdNJywgdSfJrScpLAogICAgXQoKZGVmIF9zZWdfMTYoKToKICAgIHJldHVybiBbCiAgICAoMHgxREFBLCAnTScsIHUn4baFJyksCiAgICAoMHgxREFCLCAnTScsIHUnyp8nKSwKICAgICgweDFEQUMsICdNJywgdSfJsScpLAogICAgKDB4MURBRCwgJ00nLCB1J8mwJyksCiAgICAoMHgxREFFLCAnTScsIHUnybInKSwKICAgICgweDFEQUYsICdNJywgdSfJsycpLAogICAgKDB4MURCMCwgJ00nLCB1J8m0JyksCiAgICAoMHgxREIxLCAnTScsIHUnybUnKSwKICAgICgweDFEQjIsICdNJywgdSfJuCcpLAogICAgKDB4MURCMywgJ00nLCB1J8qCJyksCiAgICAoMHgxREI0LCAnTScsIHUnyoMnKSwKICAgICgweDFEQjUsICdNJywgdSfGqycpLAogICAgKDB4MURCNiwgJ00nLCB1J8qJJyksCiAgICAoMHgxREI3LCAnTScsIHUnyoonKSwKICAgICgweDFEQjgsICdNJywgdSfhtJwnKSwKICAgICgweDFEQjksICdNJywgdSfKiycpLAogICAgKDB4MURCQSwgJ00nLCB1J8qMJyksCiAgICAoMHgxREJCLCAnTScsIHUneicpLAogICAgKDB4MURCQywgJ00nLCB1J8qQJyksCiAgICAoMHgxREJELCAnTScsIHUnypEnKSwKICAgICgweDFEQkUsICdNJywgdSfKkicpLAogICAgKDB4MURCRiwgJ00nLCB1J864JyksCiAgICAoMHgxREMwLCAnVicpLAogICAgKDB4MURFNywgJ1gnKSwKICAgICgweDFERkMsICdWJyksCiAgICAoMHgxRTAwLCAnTScsIHUn4biBJyksCiAgICAoMHgxRTAxLCAnVicpLAogICAgKDB4MUUwMiwgJ00nLCB1J+G4gycpLAogICAgKDB4MUUwMywgJ1YnKSwKICAgICgweDFFMDQsICdNJywgdSfhuIUnKSwKICAgICgweDFFMDUsICdWJyksCiAgICAoMHgxRTA2LCAnTScsIHUn4biHJyksCiAgICAoMHgxRTA3LCAnVicpLAogICAgKDB4MUUwOCwgJ00nLCB1J+G4iScpLAogICAgKDB4MUUwOSwgJ1YnKSwKICAgICgweDFFMEEsICdNJywgdSfhuIsnKSwKICAgICgweDFFMEIsICdWJyksCiAgICAoMHgxRTBDLCAnTScsIHUn4biNJyksCiAgICAoMHgxRTBELCAnVicpLAogICAgKDB4MUUwRSwgJ00nLCB1J+G4jycpLAogICAgKDB4MUUwRiwgJ1YnKSwKICAgICgweDFFMTAsICdNJywgdSfhuJEnKSwKICAgICgweDFFMTEsICdWJyksCiAgICAoMHgxRTEyLCAnTScsIHUn4biTJyksCiAgICAoMHgxRTEzLCAnVicpLAogICAgKDB4MUUxNCwgJ00nLCB1J+G4lScpLAogICAgKDB4MUUxNSwgJ1YnKSwKICAgICgweDFFMTYsICdNJywgdSfhuJcnKSwKICAgICgweDFFMTcsICdWJyksCiAgICAoMHgxRTE4LCAnTScsIHUn4biZJyksCiAgICAoMHgxRTE5LCAnVicpLAogICAgKDB4MUUxQSwgJ00nLCB1J+G4mycpLAogICAgKDB4MUUxQiwgJ1YnKSwKICAgICgweDFFMUMsICdNJywgdSfhuJ0nKSwKICAgICgweDFFMUQsICdWJyksCiAgICAoMHgxRTFFLCAnTScsIHUn4bifJyksCiAgICAoMHgxRTFGLCAnVicpLAogICAgKDB4MUUyMCwgJ00nLCB1J+G4oScpLAogICAgKDB4MUUyMSwgJ1YnKSwKICAgICgweDFFMjIsICdNJywgdSfhuKMnKSwKICAgICgweDFFMjMsICdWJyksCiAgICAoMHgxRTI0LCAnTScsIHUn4bilJyksCiAgICAoMHgxRTI1LCAnVicpLAogICAgKDB4MUUyNiwgJ00nLCB1J+G4pycpLAogICAgKDB4MUUyNywgJ1YnKSwKICAgICgweDFFMjgsICdNJywgdSfhuKknKSwKICAgICgweDFFMjksICdWJyksCiAgICAoMHgxRTJBLCAnTScsIHUn4birJyksCiAgICAoMHgxRTJCLCAnVicpLAogICAgKDB4MUUyQywgJ00nLCB1J+G4rScpLAogICAgKDB4MUUyRCwgJ1YnKSwKICAgICgweDFFMkUsICdNJywgdSfhuK8nKSwKICAgICgweDFFMkYsICdWJyksCiAgICAoMHgxRTMwLCAnTScsIHUn4bixJyksCiAgICAoMHgxRTMxLCAnVicpLAogICAgKDB4MUUzMiwgJ00nLCB1J+G4sycpLAogICAgKDB4MUUzMywgJ1YnKSwKICAgICgweDFFMzQsICdNJywgdSfhuLUnKSwKICAgICgweDFFMzUsICdWJyksCiAgICAoMHgxRTM2LCAnTScsIHUn4bi3JyksCiAgICAoMHgxRTM3LCAnVicpLAogICAgKDB4MUUzOCwgJ00nLCB1J+G4uScpLAogICAgKDB4MUUzOSwgJ1YnKSwKICAgICgweDFFM0EsICdNJywgdSfhuLsnKSwKICAgICgweDFFM0IsICdWJyksCiAgICAoMHgxRTNDLCAnTScsIHUn4bi9JyksCiAgICAoMHgxRTNELCAnVicpLAogICAgKDB4MUUzRSwgJ00nLCB1J+G4vycpLAogICAgKDB4MUUzRiwgJ1YnKSwKICAgICgweDFFNDAsICdNJywgdSfhuYEnKSwKICAgICgweDFFNDEsICdWJyksCiAgICAoMHgxRTQyLCAnTScsIHUn4bmDJyksCiAgICAoMHgxRTQzLCAnVicpLAogICAgKDB4MUU0NCwgJ00nLCB1J+G5hScpLAogICAgKDB4MUU0NSwgJ1YnKSwKICAgICgweDFFNDYsICdNJywgdSfhuYcnKSwKICAgICgweDFFNDcsICdWJyksCiAgICAoMHgxRTQ4LCAnTScsIHUn4bmJJyksCiAgICAoMHgxRTQ5LCAnVicpLAogICAgKDB4MUU0QSwgJ00nLCB1J+G5iycpLAogICAgXQoKZGVmIF9zZWdfMTcoKToKICAgIHJldHVybiBbCiAgICAoMHgxRTRCLCAnVicpLAogICAgKDB4MUU0QywgJ00nLCB1J+G5jScpLAogICAgKDB4MUU0RCwgJ1YnKSwKICAgICgweDFFNEUsICdNJywgdSfhuY8nKSwKICAgICgweDFFNEYsICdWJyksCiAgICAoMHgxRTUwLCAnTScsIHUn4bmRJyksCiAgICAoMHgxRTUxLCAnVicpLAogICAgKDB4MUU1MiwgJ00nLCB1J+G5kycpLAogICAgKDB4MUU1MywgJ1YnKSwKICAgICgweDFFNTQsICdNJywgdSfhuZUnKSwKICAgICgweDFFNTUsICdWJyksCiAgICAoMHgxRTU2LCAnTScsIHUn4bmXJyksCiAgICAoMHgxRTU3LCAnVicpLAogICAgKDB4MUU1OCwgJ00nLCB1J+G5mScpLAogICAgKDB4MUU1OSwgJ1YnKSwKICAgICgweDFFNUEsICdNJywgdSfhuZsnKSwKICAgICgweDFFNUIsICdWJyksCiAgICAoMHgxRTVDLCAnTScsIHUn4bmdJyksCiAgICAoMHgxRTVELCAnVicpLAogICAgKDB4MUU1RSwgJ00nLCB1J+G5nycpLAogICAgKDB4MUU1RiwgJ1YnKSwKICAgICgweDFFNjAsICdNJywgdSfhuaEnKSwKICAgICgweDFFNjEsICdWJyksCiAgICAoMHgxRTYyLCAnTScsIHUn4bmjJyksCiAgICAoMHgxRTYzLCAnVicpLAogICAgKDB4MUU2NCwgJ00nLCB1J+G5pScpLAogICAgKDB4MUU2NSwgJ1YnKSwKICAgICgweDFFNjYsICdNJywgdSfhuacnKSwKICAgICgweDFFNjcsICdWJyksCiAgICAoMHgxRTY4LCAnTScsIHUn4bmpJyksCiAgICAoMHgxRTY5LCAnVicpLAogICAgKDB4MUU2QSwgJ00nLCB1J+G5qycpLAogICAgKDB4MUU2QiwgJ1YnKSwKICAgICgweDFFNkMsICdNJywgdSfhua0nKSwKICAgICgweDFFNkQsICdWJyksCiAgICAoMHgxRTZFLCAnTScsIHUn4bmvJyksCiAgICAoMHgxRTZGLCAnVicpLAogICAgKDB4MUU3MCwgJ00nLCB1J+G5sScpLAogICAgKDB4MUU3MSwgJ1YnKSwKICAgICgweDFFNzIsICdNJywgdSfhubMnKSwKICAgICgweDFFNzMsICdWJyksCiAgICAoMHgxRTc0LCAnTScsIHUn4bm1JyksCiAgICAoMHgxRTc1LCAnVicpLAogICAgKDB4MUU3NiwgJ00nLCB1J+G5tycpLAogICAgKDB4MUU3NywgJ1YnKSwKICAgICgweDFFNzgsICdNJywgdSfhubknKSwKICAgICgweDFFNzksICdWJyksCiAgICAoMHgxRTdBLCAnTScsIHUn4bm7JyksCiAgICAoMHgxRTdCLCAnVicpLAogICAgKDB4MUU3QywgJ00nLCB1J+G5vScpLAogICAgKDB4MUU3RCwgJ1YnKSwKICAgICgweDFFN0UsICdNJywgdSfhub8nKSwKICAgICgweDFFN0YsICdWJyksCiAgICAoMHgxRTgwLCAnTScsIHUn4bqBJyksCiAgICAoMHgxRTgxLCAnVicpLAogICAgKDB4MUU4MiwgJ00nLCB1J+G6gycpLAogICAgKDB4MUU4MywgJ1YnKSwKICAgICgweDFFODQsICdNJywgdSfhuoUnKSwKICAgICgweDFFODUsICdWJyksCiAgICAoMHgxRTg2LCAnTScsIHUn4bqHJyksCiAgICAoMHgxRTg3LCAnVicpLAogICAgKDB4MUU4OCwgJ00nLCB1J+G6iScpLAogICAgKDB4MUU4OSwgJ1YnKSwKICAgICgweDFFOEEsICdNJywgdSfhuosnKSwKICAgICgweDFFOEIsICdWJyksCiAgICAoMHgxRThDLCAnTScsIHUn4bqNJyksCiAgICAoMHgxRThELCAnVicpLAogICAgKDB4MUU4RSwgJ00nLCB1J+G6jycpLAogICAgKDB4MUU4RiwgJ1YnKSwKICAgICgweDFFOTAsICdNJywgdSfhupEnKSwKICAgICgweDFFOTEsICdWJyksCiAgICAoMHgxRTkyLCAnTScsIHUn4bqTJyksCiAgICAoMHgxRTkzLCAnVicpLAogICAgKDB4MUU5NCwgJ00nLCB1J+G6lScpLAogICAgKDB4MUU5NSwgJ1YnKSwKICAgICgweDFFOUEsICdNJywgdSdhyr4nKSwKICAgICgweDFFOUIsICdNJywgdSfhuaEnKSwKICAgICgweDFFOUMsICdWJyksCiAgICAoMHgxRTlFLCAnTScsIHUnc3MnKSwKICAgICgweDFFOUYsICdWJyksCiAgICAoMHgxRUEwLCAnTScsIHUn4bqhJyksCiAgICAoMHgxRUExLCAnVicpLAogICAgKDB4MUVBMiwgJ00nLCB1J+G6oycpLAogICAgKDB4MUVBMywgJ1YnKSwKICAgICgweDFFQTQsICdNJywgdSfhuqUnKSwKICAgICgweDFFQTUsICdWJyksCiAgICAoMHgxRUE2LCAnTScsIHUn4bqnJyksCiAgICAoMHgxRUE3LCAnVicpLAogICAgKDB4MUVBOCwgJ00nLCB1J+G6qScpLAogICAgKDB4MUVBOSwgJ1YnKSwKICAgICgweDFFQUEsICdNJywgdSfhuqsnKSwKICAgICgweDFFQUIsICdWJyksCiAgICAoMHgxRUFDLCAnTScsIHUn4bqtJyksCiAgICAoMHgxRUFELCAnVicpLAogICAgKDB4MUVBRSwgJ00nLCB1J+G6rycpLAogICAgKDB4MUVBRiwgJ1YnKSwKICAgICgweDFFQjAsICdNJywgdSfhurEnKSwKICAgICgweDFFQjEsICdWJyksCiAgICAoMHgxRUIyLCAnTScsIHUn4bqzJyksCiAgICAoMHgxRUIzLCAnVicpLAogICAgXQoKZGVmIF9zZWdfMTgoKToKICAgIHJldHVybiBbCiAgICAoMHgxRUI0LCAnTScsIHUn4bq1JyksCiAgICAoMHgxRUI1LCAnVicpLAogICAgKDB4MUVCNiwgJ00nLCB1J+G6tycpLAogICAgKDB4MUVCNywgJ1YnKSwKICAgICgweDFFQjgsICdNJywgdSfhurknKSwKICAgICgweDFFQjksICdWJyksCiAgICAoMHgxRUJBLCAnTScsIHUn4bq7JyksCiAgICAoMHgxRUJCLCAnVicpLAogICAgKDB4MUVCQywgJ00nLCB1J+G6vScpLAogICAgKDB4MUVCRCwgJ1YnKSwKICAgICgweDFFQkUsICdNJywgdSfhur8nKSwKICAgICgweDFFQkYsICdWJyksCiAgICAoMHgxRUMwLCAnTScsIHUn4buBJyksCiAgICAoMHgxRUMxLCAnVicpLAogICAgKDB4MUVDMiwgJ00nLCB1J+G7gycpLAogICAgKDB4MUVDMywgJ1YnKSwKICAgICgweDFFQzQsICdNJywgdSfhu4UnKSwKICAgICgweDFFQzUsICdWJyksCiAgICAoMHgxRUM2LCAnTScsIHUn4buHJyksCiAgICAoMHgxRUM3LCAnVicpLAogICAgKDB4MUVDOCwgJ00nLCB1J+G7iScpLAogICAgKDB4MUVDOSwgJ1YnKSwKICAgICgweDFFQ0EsICdNJywgdSfhu4snKSwKICAgICgweDFFQ0IsICdWJyksCiAgICAoMHgxRUNDLCAnTScsIHUn4buNJyksCiAgICAoMHgxRUNELCAnVicpLAogICAgKDB4MUVDRSwgJ00nLCB1J+G7jycpLAogICAgKDB4MUVDRiwgJ1YnKSwKICAgICgweDFFRDAsICdNJywgdSfhu5EnKSwKICAgICgweDFFRDEsICdWJyksCiAgICAoMHgxRUQyLCAnTScsIHUn4buTJyksCiAgICAoMHgxRUQzLCAnVicpLAogICAgKDB4MUVENCwgJ00nLCB1J+G7lScpLAogICAgKDB4MUVENSwgJ1YnKSwKICAgICgweDFFRDYsICdNJywgdSfhu5cnKSwKICAgICgweDFFRDcsICdWJyksCiAgICAoMHgxRUQ4LCAnTScsIHUn4buZJyksCiAgICAoMHgxRUQ5LCAnVicpLAogICAgKDB4MUVEQSwgJ00nLCB1J+G7mycpLAogICAgKDB4MUVEQiwgJ1YnKSwKICAgICgweDFFREMsICdNJywgdSfhu50nKSwKICAgICgweDFFREQsICdWJyksCiAgICAoMHgxRURFLCAnTScsIHUn4bufJyksCiAgICAoMHgxRURGLCAnVicpLAogICAgKDB4MUVFMCwgJ00nLCB1J+G7oScpLAogICAgKDB4MUVFMSwgJ1YnKSwKICAgICgweDFFRTIsICdNJywgdSfhu6MnKSwKICAgICgweDFFRTMsICdWJyksCiAgICAoMHgxRUU0LCAnTScsIHUn4bulJyksCiAgICAoMHgxRUU1LCAnVicpLAogICAgKDB4MUVFNiwgJ00nLCB1J+G7pycpLAogICAgKDB4MUVFNywgJ1YnKSwKICAgICgweDFFRTgsICdNJywgdSfhu6knKSwKICAgICgweDFFRTksICdWJyksCiAgICAoMHgxRUVBLCAnTScsIHUn4burJyksCiAgICAoMHgxRUVCLCAnVicpLAogICAgKDB4MUVFQywgJ00nLCB1J+G7rScpLAogICAgKDB4MUVFRCwgJ1YnKSwKICAgICgweDFFRUUsICdNJywgdSfhu68nKSwKICAgICgweDFFRUYsICdWJyksCiAgICAoMHgxRUYwLCAnTScsIHUn4buxJyksCiAgICAoMHgxRUYxLCAnVicpLAogICAgKDB4MUVGMiwgJ00nLCB1J+G7sycpLAogICAgKDB4MUVGMywgJ1YnKSwKICAgICgweDFFRjQsICdNJywgdSfhu7UnKSwKICAgICgweDFFRjUsICdWJyksCiAgICAoMHgxRUY2LCAnTScsIHUn4bu3JyksCiAgICAoMHgxRUY3LCAnVicpLAogICAgKDB4MUVGOCwgJ00nLCB1J+G7uScpLAogICAgKDB4MUVGOSwgJ1YnKSwKICAgICgweDFFRkEsICdNJywgdSfhu7snKSwKICAgICgweDFFRkIsICdWJyksCiAgICAoMHgxRUZDLCAnTScsIHUn4bu9JyksCiAgICAoMHgxRUZELCAnVicpLAogICAgKDB4MUVGRSwgJ00nLCB1J+G7vycpLAogICAgKDB4MUVGRiwgJ1YnKSwKICAgICgweDFGMDgsICdNJywgdSfhvIAnKSwKICAgICgweDFGMDksICdNJywgdSfhvIEnKSwKICAgICgweDFGMEEsICdNJywgdSfhvIInKSwKICAgICgweDFGMEIsICdNJywgdSfhvIMnKSwKICAgICgweDFGMEMsICdNJywgdSfhvIQnKSwKICAgICgweDFGMEQsICdNJywgdSfhvIUnKSwKICAgICgweDFGMEUsICdNJywgdSfhvIYnKSwKICAgICgweDFGMEYsICdNJywgdSfhvIcnKSwKICAgICgweDFGMTAsICdWJyksCiAgICAoMHgxRjE2LCAnWCcpLAogICAgKDB4MUYxOCwgJ00nLCB1J+G8kCcpLAogICAgKDB4MUYxOSwgJ00nLCB1J+G8kScpLAogICAgKDB4MUYxQSwgJ00nLCB1J+G8kicpLAogICAgKDB4MUYxQiwgJ00nLCB1J+G8kycpLAogICAgKDB4MUYxQywgJ00nLCB1J+G8lCcpLAogICAgKDB4MUYxRCwgJ00nLCB1J+G8lScpLAogICAgKDB4MUYxRSwgJ1gnKSwKICAgICgweDFGMjAsICdWJyksCiAgICAoMHgxRjI4LCAnTScsIHUn4bygJyksCiAgICAoMHgxRjI5LCAnTScsIHUn4byhJyksCiAgICAoMHgxRjJBLCAnTScsIHUn4byiJyksCiAgICAoMHgxRjJCLCAnTScsIHUn4byjJyksCiAgICAoMHgxRjJDLCAnTScsIHUn4bykJyksCiAgICAoMHgxRjJELCAnTScsIHUn4bylJyksCiAgICBdCgpkZWYgX3NlZ18xOSgpOgogICAgcmV0dXJuIFsKICAgICgweDFGMkUsICdNJywgdSfhvKYnKSwKICAgICgweDFGMkYsICdNJywgdSfhvKcnKSwKICAgICgweDFGMzAsICdWJyksCiAgICAoMHgxRjM4LCAnTScsIHUn4bywJyksCiAgICAoMHgxRjM5LCAnTScsIHUn4byxJyksCiAgICAoMHgxRjNBLCAnTScsIHUn4byyJyksCiAgICAoMHgxRjNCLCAnTScsIHUn4byzJyksCiAgICAoMHgxRjNDLCAnTScsIHUn4by0JyksCiAgICAoMHgxRjNELCAnTScsIHUn4by1JyksCiAgICAoMHgxRjNFLCAnTScsIHUn4by2JyksCiAgICAoMHgxRjNGLCAnTScsIHUn4by3JyksCiAgICAoMHgxRjQwLCAnVicpLAogICAgKDB4MUY0NiwgJ1gnKSwKICAgICgweDFGNDgsICdNJywgdSfhvYAnKSwKICAgICgweDFGNDksICdNJywgdSfhvYEnKSwKICAgICgweDFGNEEsICdNJywgdSfhvYInKSwKICAgICgweDFGNEIsICdNJywgdSfhvYMnKSwKICAgICgweDFGNEMsICdNJywgdSfhvYQnKSwKICAgICgweDFGNEQsICdNJywgdSfhvYUnKSwKICAgICgweDFGNEUsICdYJyksCiAgICAoMHgxRjUwLCAnVicpLAogICAgKDB4MUY1OCwgJ1gnKSwKICAgICgweDFGNTksICdNJywgdSfhvZEnKSwKICAgICgweDFGNUEsICdYJyksCiAgICAoMHgxRjVCLCAnTScsIHUn4b2TJyksCiAgICAoMHgxRjVDLCAnWCcpLAogICAgKDB4MUY1RCwgJ00nLCB1J+G9lScpLAogICAgKDB4MUY1RSwgJ1gnKSwKICAgICgweDFGNUYsICdNJywgdSfhvZcnKSwKICAgICgweDFGNjAsICdWJyksCiAgICAoMHgxRjY4LCAnTScsIHUn4b2gJyksCiAgICAoMHgxRjY5LCAnTScsIHUn4b2hJyksCiAgICAoMHgxRjZBLCAnTScsIHUn4b2iJyksCiAgICAoMHgxRjZCLCAnTScsIHUn4b2jJyksCiAgICAoMHgxRjZDLCAnTScsIHUn4b2kJyksCiAgICAoMHgxRjZELCAnTScsIHUn4b2lJyksCiAgICAoMHgxRjZFLCAnTScsIHUn4b2mJyksCiAgICAoMHgxRjZGLCAnTScsIHUn4b2nJyksCiAgICAoMHgxRjcwLCAnVicpLAogICAgKDB4MUY3MSwgJ00nLCB1J86sJyksCiAgICAoMHgxRjcyLCAnVicpLAogICAgKDB4MUY3MywgJ00nLCB1J86tJyksCiAgICAoMHgxRjc0LCAnVicpLAogICAgKDB4MUY3NSwgJ00nLCB1J86uJyksCiAgICAoMHgxRjc2LCAnVicpLAogICAgKDB4MUY3NywgJ00nLCB1J86vJyksCiAgICAoMHgxRjc4LCAnVicpLAogICAgKDB4MUY3OSwgJ00nLCB1J8+MJyksCiAgICAoMHgxRjdBLCAnVicpLAogICAgKDB4MUY3QiwgJ00nLCB1J8+NJyksCiAgICAoMHgxRjdDLCAnVicpLAogICAgKDB4MUY3RCwgJ00nLCB1J8+OJyksCiAgICAoMHgxRjdFLCAnWCcpLAogICAgKDB4MUY4MCwgJ00nLCB1J+G8gM65JyksCiAgICAoMHgxRjgxLCAnTScsIHUn4byBzrknKSwKICAgICgweDFGODIsICdNJywgdSfhvILOuScpLAogICAgKDB4MUY4MywgJ00nLCB1J+G8g865JyksCiAgICAoMHgxRjg0LCAnTScsIHUn4byEzrknKSwKICAgICgweDFGODUsICdNJywgdSfhvIXOuScpLAogICAgKDB4MUY4NiwgJ00nLCB1J+G8hs65JyksCiAgICAoMHgxRjg3LCAnTScsIHUn4byHzrknKSwKICAgICgweDFGODgsICdNJywgdSfhvIDOuScpLAogICAgKDB4MUY4OSwgJ00nLCB1J+G8gc65JyksCiAgICAoMHgxRjhBLCAnTScsIHUn4byCzrknKSwKICAgICgweDFGOEIsICdNJywgdSfhvIPOuScpLAogICAgKDB4MUY4QywgJ00nLCB1J+G8hM65JyksCiAgICAoMHgxRjhELCAnTScsIHUn4byFzrknKSwKICAgICgweDFGOEUsICdNJywgdSfhvIbOuScpLAogICAgKDB4MUY4RiwgJ00nLCB1J+G8h865JyksCiAgICAoMHgxRjkwLCAnTScsIHUn4bygzrknKSwKICAgICgweDFGOTEsICdNJywgdSfhvKHOuScpLAogICAgKDB4MUY5MiwgJ00nLCB1J+G8os65JyksCiAgICAoMHgxRjkzLCAnTScsIHUn4byjzrknKSwKICAgICgweDFGOTQsICdNJywgdSfhvKTOuScpLAogICAgKDB4MUY5NSwgJ00nLCB1J+G8pc65JyksCiAgICAoMHgxRjk2LCAnTScsIHUn4bymzrknKSwKICAgICgweDFGOTcsICdNJywgdSfhvKfOuScpLAogICAgKDB4MUY5OCwgJ00nLCB1J+G8oM65JyksCiAgICAoMHgxRjk5LCAnTScsIHUn4byhzrknKSwKICAgICgweDFGOUEsICdNJywgdSfhvKLOuScpLAogICAgKDB4MUY5QiwgJ00nLCB1J+G8o865JyksCiAgICAoMHgxRjlDLCAnTScsIHUn4bykzrknKSwKICAgICgweDFGOUQsICdNJywgdSfhvKXOuScpLAogICAgKDB4MUY5RSwgJ00nLCB1J+G8ps65JyksCiAgICAoMHgxRjlGLCAnTScsIHUn4bynzrknKSwKICAgICgweDFGQTAsICdNJywgdSfhvaDOuScpLAogICAgKDB4MUZBMSwgJ00nLCB1J+G9oc65JyksCiAgICAoMHgxRkEyLCAnTScsIHUn4b2izrknKSwKICAgICgweDFGQTMsICdNJywgdSfhvaPOuScpLAogICAgKDB4MUZBNCwgJ00nLCB1J+G9pM65JyksCiAgICAoMHgxRkE1LCAnTScsIHUn4b2lzrknKSwKICAgICgweDFGQTYsICdNJywgdSfhvabOuScpLAogICAgKDB4MUZBNywgJ00nLCB1J+G9p865JyksCiAgICAoMHgxRkE4LCAnTScsIHUn4b2gzrknKSwKICAgICgweDFGQTksICdNJywgdSfhvaHOuScpLAogICAgKDB4MUZBQSwgJ00nLCB1J+G9os65JyksCiAgICAoMHgxRkFCLCAnTScsIHUn4b2jzrknKSwKICAgICgweDFGQUMsICdNJywgdSfhvaTOuScpLAogICAgKDB4MUZBRCwgJ00nLCB1J+G9pc65JyksCiAgICAoMHgxRkFFLCAnTScsIHUn4b2mzrknKSwKICAgIF0KCmRlZiBfc2VnXzIwKCk6CiAgICByZXR1cm4gWwogICAgKDB4MUZBRiwgJ00nLCB1J+G9p865JyksCiAgICAoMHgxRkIwLCAnVicpLAogICAgKDB4MUZCMiwgJ00nLCB1J+G9sM65JyksCiAgICAoMHgxRkIzLCAnTScsIHUnzrHOuScpLAogICAgKDB4MUZCNCwgJ00nLCB1J86szrknKSwKICAgICgweDFGQjUsICdYJyksCiAgICAoMHgxRkI2LCAnVicpLAogICAgKDB4MUZCNywgJ00nLCB1J+G+ts65JyksCiAgICAoMHgxRkI4LCAnTScsIHUn4b6wJyksCiAgICAoMHgxRkI5LCAnTScsIHUn4b6xJyksCiAgICAoMHgxRkJBLCAnTScsIHUn4b2wJyksCiAgICAoMHgxRkJCLCAnTScsIHUnzqwnKSwKICAgICgweDFGQkMsICdNJywgdSfOsc65JyksCiAgICAoMHgxRkJELCAnMycsIHUnIMyTJyksCiAgICAoMHgxRkJFLCAnTScsIHUnzrknKSwKICAgICgweDFGQkYsICczJywgdScgzJMnKSwKICAgICgweDFGQzAsICczJywgdScgzYInKSwKICAgICgweDFGQzEsICczJywgdScgzIjNgicpLAogICAgKDB4MUZDMiwgJ00nLCB1J+G9tM65JyksCiAgICAoMHgxRkMzLCAnTScsIHUnzrfOuScpLAogICAgKDB4MUZDNCwgJ00nLCB1J86uzrknKSwKICAgICgweDFGQzUsICdYJyksCiAgICAoMHgxRkM2LCAnVicpLAogICAgKDB4MUZDNywgJ00nLCB1J+G/hs65JyksCiAgICAoMHgxRkM4LCAnTScsIHUn4b2yJyksCiAgICAoMHgxRkM5LCAnTScsIHUnzq0nKSwKICAgICgweDFGQ0EsICdNJywgdSfhvbQnKSwKICAgICgweDFGQ0IsICdNJywgdSfOricpLAogICAgKDB4MUZDQywgJ00nLCB1J863zrknKSwKICAgICgweDFGQ0QsICczJywgdScgzJPMgCcpLAogICAgKDB4MUZDRSwgJzMnLCB1JyDMk8yBJyksCiAgICAoMHgxRkNGLCAnMycsIHUnIMyTzYInKSwKICAgICgweDFGRDAsICdWJyksCiAgICAoMHgxRkQzLCAnTScsIHUnzpAnKSwKICAgICgweDFGRDQsICdYJyksCiAgICAoMHgxRkQ2LCAnVicpLAogICAgKDB4MUZEOCwgJ00nLCB1J+G/kCcpLAogICAgKDB4MUZEOSwgJ00nLCB1J+G/kScpLAogICAgKDB4MUZEQSwgJ00nLCB1J+G9ticpLAogICAgKDB4MUZEQiwgJ00nLCB1J86vJyksCiAgICAoMHgxRkRDLCAnWCcpLAogICAgKDB4MUZERCwgJzMnLCB1JyDMlMyAJyksCiAgICAoMHgxRkRFLCAnMycsIHUnIMyUzIEnKSwKICAgICgweDFGREYsICczJywgdScgzJTNgicpLAogICAgKDB4MUZFMCwgJ1YnKSwKICAgICgweDFGRTMsICdNJywgdSfOsCcpLAogICAgKDB4MUZFNCwgJ1YnKSwKICAgICgweDFGRTgsICdNJywgdSfhv6AnKSwKICAgICgweDFGRTksICdNJywgdSfhv6EnKSwKICAgICgweDFGRUEsICdNJywgdSfhvbonKSwKICAgICgweDFGRUIsICdNJywgdSfPjScpLAogICAgKDB4MUZFQywgJ00nLCB1J+G/pScpLAogICAgKDB4MUZFRCwgJzMnLCB1JyDMiMyAJyksCiAgICAoMHgxRkVFLCAnMycsIHUnIMyIzIEnKSwKICAgICgweDFGRUYsICczJywgdSdgJyksCiAgICAoMHgxRkYwLCAnWCcpLAogICAgKDB4MUZGMiwgJ00nLCB1J+G9vM65JyksCiAgICAoMHgxRkYzLCAnTScsIHUnz4nOuScpLAogICAgKDB4MUZGNCwgJ00nLCB1J8+OzrknKSwKICAgICgweDFGRjUsICdYJyksCiAgICAoMHgxRkY2LCAnVicpLAogICAgKDB4MUZGNywgJ00nLCB1J+G/ts65JyksCiAgICAoMHgxRkY4LCAnTScsIHUn4b24JyksCiAgICAoMHgxRkY5LCAnTScsIHUnz4wnKSwKICAgICgweDFGRkEsICdNJywgdSfhvbwnKSwKICAgICgweDFGRkIsICdNJywgdSfPjicpLAogICAgKDB4MUZGQywgJ00nLCB1J8+JzrknKSwKICAgICgweDFGRkQsICczJywgdScgzIEnKSwKICAgICgweDFGRkUsICczJywgdScgzJQnKSwKICAgICgweDFGRkYsICdYJyksCiAgICAoMHgyMDAwLCAnMycsIHUnICcpLAogICAgKDB4MjAwQiwgJ0knKSwKICAgICgweDIwMEMsICdEJywgdScnKSwKICAgICgweDIwMEUsICdYJyksCiAgICAoMHgyMDEwLCAnVicpLAogICAgKDB4MjAxMSwgJ00nLCB1J+KAkCcpLAogICAgKDB4MjAxMiwgJ1YnKSwKICAgICgweDIwMTcsICczJywgdScgzLMnKSwKICAgICgweDIwMTgsICdWJyksCiAgICAoMHgyMDI0LCAnWCcpLAogICAgKDB4MjAyNywgJ1YnKSwKICAgICgweDIwMjgsICdYJyksCiAgICAoMHgyMDJGLCAnMycsIHUnICcpLAogICAgKDB4MjAzMCwgJ1YnKSwKICAgICgweDIwMzMsICdNJywgdSfigLLigLInKSwKICAgICgweDIwMzQsICdNJywgdSfigLLigLLigLInKSwKICAgICgweDIwMzUsICdWJyksCiAgICAoMHgyMDM2LCAnTScsIHUn4oC14oC1JyksCiAgICAoMHgyMDM3LCAnTScsIHUn4oC14oC14oC1JyksCiAgICAoMHgyMDM4LCAnVicpLAogICAgKDB4MjAzQywgJzMnLCB1JyEhJyksCiAgICAoMHgyMDNELCAnVicpLAogICAgKDB4MjAzRSwgJzMnLCB1JyDMhScpLAogICAgKDB4MjAzRiwgJ1YnKSwKICAgICgweDIwNDcsICczJywgdSc/PycpLAogICAgKDB4MjA0OCwgJzMnLCB1Jz8hJyksCiAgICAoMHgyMDQ5LCAnMycsIHUnIT8nKSwKICAgICgweDIwNEEsICdWJyksCiAgICAoMHgyMDU3LCAnTScsIHUn4oCy4oCy4oCy4oCyJyksCiAgICAoMHgyMDU4LCAnVicpLAogICAgXQoKZGVmIF9zZWdfMjEoKToKICAgIHJldHVybiBbCiAgICAoMHgyMDVGLCAnMycsIHUnICcpLAogICAgKDB4MjA2MCwgJ0knKSwKICAgICgweDIwNjEsICdYJyksCiAgICAoMHgyMDY0LCAnSScpLAogICAgKDB4MjA2NSwgJ1gnKSwKICAgICgweDIwNzAsICdNJywgdScwJyksCiAgICAoMHgyMDcxLCAnTScsIHUnaScpLAogICAgKDB4MjA3MiwgJ1gnKSwKICAgICgweDIwNzQsICdNJywgdSc0JyksCiAgICAoMHgyMDc1LCAnTScsIHUnNScpLAogICAgKDB4MjA3NiwgJ00nLCB1JzYnKSwKICAgICgweDIwNzcsICdNJywgdSc3JyksCiAgICAoMHgyMDc4LCAnTScsIHUnOCcpLAogICAgKDB4MjA3OSwgJ00nLCB1JzknKSwKICAgICgweDIwN0EsICczJywgdScrJyksCiAgICAoMHgyMDdCLCAnTScsIHUn4oiSJyksCiAgICAoMHgyMDdDLCAnMycsIHUnPScpLAogICAgKDB4MjA3RCwgJzMnLCB1JygnKSwKICAgICgweDIwN0UsICczJywgdScpJyksCiAgICAoMHgyMDdGLCAnTScsIHUnbicpLAogICAgKDB4MjA4MCwgJ00nLCB1JzAnKSwKICAgICgweDIwODEsICdNJywgdScxJyksCiAgICAoMHgyMDgyLCAnTScsIHUnMicpLAogICAgKDB4MjA4MywgJ00nLCB1JzMnKSwKICAgICgweDIwODQsICdNJywgdSc0JyksCiAgICAoMHgyMDg1LCAnTScsIHUnNScpLAogICAgKDB4MjA4NiwgJ00nLCB1JzYnKSwKICAgICgweDIwODcsICdNJywgdSc3JyksCiAgICAoMHgyMDg4LCAnTScsIHUnOCcpLAogICAgKDB4MjA4OSwgJ00nLCB1JzknKSwKICAgICgweDIwOEEsICczJywgdScrJyksCiAgICAoMHgyMDhCLCAnTScsIHUn4oiSJyksCiAgICAoMHgyMDhDLCAnMycsIHUnPScpLAogICAgKDB4MjA4RCwgJzMnLCB1JygnKSwKICAgICgweDIwOEUsICczJywgdScpJyksCiAgICAoMHgyMDhGLCAnWCcpLAogICAgKDB4MjA5MCwgJ00nLCB1J2EnKSwKICAgICgweDIwOTEsICdNJywgdSdlJyksCiAgICAoMHgyMDkyLCAnTScsIHUnbycpLAogICAgKDB4MjA5MywgJ00nLCB1J3gnKSwKICAgICgweDIwOTQsICdNJywgdSfJmScpLAogICAgKDB4MjA5NSwgJ00nLCB1J2gnKSwKICAgICgweDIwOTYsICdNJywgdSdrJyksCiAgICAoMHgyMDk3LCAnTScsIHUnbCcpLAogICAgKDB4MjA5OCwgJ00nLCB1J20nKSwKICAgICgweDIwOTksICdNJywgdSduJyksCiAgICAoMHgyMDlBLCAnTScsIHUncCcpLAogICAgKDB4MjA5QiwgJ00nLCB1J3MnKSwKICAgICgweDIwOUMsICdNJywgdSd0JyksCiAgICAoMHgyMDlELCAnWCcpLAogICAgKDB4MjBBMCwgJ1YnKSwKICAgICgweDIwQTgsICdNJywgdSdycycpLAogICAgKDB4MjBBOSwgJ1YnKSwKICAgICgweDIwQkIsICdYJyksCiAgICAoMHgyMEQwLCAnVicpLAogICAgKDB4MjBGMSwgJ1gnKSwKICAgICgweDIxMDAsICczJywgdSdhL2MnKSwKICAgICgweDIxMDEsICczJywgdSdhL3MnKSwKICAgICgweDIxMDIsICdNJywgdSdjJyksCiAgICAoMHgyMTAzLCAnTScsIHUnwrBjJyksCiAgICAoMHgyMTA0LCAnVicpLAogICAgKDB4MjEwNSwgJzMnLCB1J2MvbycpLAogICAgKDB4MjEwNiwgJzMnLCB1J2MvdScpLAogICAgKDB4MjEwNywgJ00nLCB1J8mbJyksCiAgICAoMHgyMTA4LCAnVicpLAogICAgKDB4MjEwOSwgJ00nLCB1J8KwZicpLAogICAgKDB4MjEwQSwgJ00nLCB1J2cnKSwKICAgICgweDIxMEIsICdNJywgdSdoJyksCiAgICAoMHgyMTBGLCAnTScsIHUnxKcnKSwKICAgICgweDIxMTAsICdNJywgdSdpJyksCiAgICAoMHgyMTEyLCAnTScsIHUnbCcpLAogICAgKDB4MjExNCwgJ1YnKSwKICAgICgweDIxMTUsICdNJywgdSduJyksCiAgICAoMHgyMTE2LCAnTScsIHUnbm8nKSwKICAgICgweDIxMTcsICdWJyksCiAgICAoMHgyMTE5LCAnTScsIHUncCcpLAogICAgKDB4MjExQSwgJ00nLCB1J3EnKSwKICAgICgweDIxMUIsICdNJywgdSdyJyksCiAgICAoMHgyMTFFLCAnVicpLAogICAgKDB4MjEyMCwgJ00nLCB1J3NtJyksCiAgICAoMHgyMTIxLCAnTScsIHUndGVsJyksCiAgICAoMHgyMTIyLCAnTScsIHUndG0nKSwKICAgICgweDIxMjMsICdWJyksCiAgICAoMHgyMTI0LCAnTScsIHUneicpLAogICAgKDB4MjEyNSwgJ1YnKSwKICAgICgweDIxMjYsICdNJywgdSfPiScpLAogICAgKDB4MjEyNywgJ1YnKSwKICAgICgweDIxMjgsICdNJywgdSd6JyksCiAgICAoMHgyMTI5LCAnVicpLAogICAgKDB4MjEyQSwgJ00nLCB1J2snKSwKICAgICgweDIxMkIsICdNJywgdSfDpScpLAogICAgKDB4MjEyQywgJ00nLCB1J2InKSwKICAgICgweDIxMkQsICdNJywgdSdjJyksCiAgICAoMHgyMTJFLCAnVicpLAogICAgKDB4MjEyRiwgJ00nLCB1J2UnKSwKICAgICgweDIxMzEsICdNJywgdSdmJyksCiAgICAoMHgyMTMyLCAnWCcpLAogICAgKDB4MjEzMywgJ00nLCB1J20nKSwKICAgICgweDIxMzQsICdNJywgdSdvJyksCiAgICAoMHgyMTM1LCAnTScsIHUn15AnKSwKICAgIF0KCmRlZiBfc2VnXzIyKCk6CiAgICByZXR1cm4gWwogICAgKDB4MjEzNiwgJ00nLCB1J9eRJyksCiAgICAoMHgyMTM3LCAnTScsIHUn15InKSwKICAgICgweDIxMzgsICdNJywgdSfXkycpLAogICAgKDB4MjEzOSwgJ00nLCB1J2knKSwKICAgICgweDIxM0EsICdWJyksCiAgICAoMHgyMTNCLCAnTScsIHUnZmF4JyksCiAgICAoMHgyMTNDLCAnTScsIHUnz4AnKSwKICAgICgweDIxM0QsICdNJywgdSfOsycpLAogICAgKDB4MjEzRiwgJ00nLCB1J8+AJyksCiAgICAoMHgyMTQwLCAnTScsIHUn4oiRJyksCiAgICAoMHgyMTQxLCAnVicpLAogICAgKDB4MjE0NSwgJ00nLCB1J2QnKSwKICAgICgweDIxNDcsICdNJywgdSdlJyksCiAgICAoMHgyMTQ4LCAnTScsIHUnaScpLAogICAgKDB4MjE0OSwgJ00nLCB1J2onKSwKICAgICgweDIxNEEsICdWJyksCiAgICAoMHgyMTUwLCAnTScsIHUnMeKBhDcnKSwKICAgICgweDIxNTEsICdNJywgdScx4oGEOScpLAogICAgKDB4MjE1MiwgJ00nLCB1JzHigYQxMCcpLAogICAgKDB4MjE1MywgJ00nLCB1JzHigYQzJyksCiAgICAoMHgyMTU0LCAnTScsIHUnMuKBhDMnKSwKICAgICgweDIxNTUsICdNJywgdScx4oGENScpLAogICAgKDB4MjE1NiwgJ00nLCB1JzLigYQ1JyksCiAgICAoMHgyMTU3LCAnTScsIHUnM+KBhDUnKSwKICAgICgweDIxNTgsICdNJywgdSc04oGENScpLAogICAgKDB4MjE1OSwgJ00nLCB1JzHigYQ2JyksCiAgICAoMHgyMTVBLCAnTScsIHUnNeKBhDYnKSwKICAgICgweDIxNUIsICdNJywgdScx4oGEOCcpLAogICAgKDB4MjE1QywgJ00nLCB1JzPigYQ4JyksCiAgICAoMHgyMTVELCAnTScsIHUnNeKBhDgnKSwKICAgICgweDIxNUUsICdNJywgdSc34oGEOCcpLAogICAgKDB4MjE1RiwgJ00nLCB1JzHigYQnKSwKICAgICgweDIxNjAsICdNJywgdSdpJyksCiAgICAoMHgyMTYxLCAnTScsIHUnaWknKSwKICAgICgweDIxNjIsICdNJywgdSdpaWknKSwKICAgICgweDIxNjMsICdNJywgdSdpdicpLAogICAgKDB4MjE2NCwgJ00nLCB1J3YnKSwKICAgICgweDIxNjUsICdNJywgdSd2aScpLAogICAgKDB4MjE2NiwgJ00nLCB1J3ZpaScpLAogICAgKDB4MjE2NywgJ00nLCB1J3ZpaWknKSwKICAgICgweDIxNjgsICdNJywgdSdpeCcpLAogICAgKDB4MjE2OSwgJ00nLCB1J3gnKSwKICAgICgweDIxNkEsICdNJywgdSd4aScpLAogICAgKDB4MjE2QiwgJ00nLCB1J3hpaScpLAogICAgKDB4MjE2QywgJ00nLCB1J2wnKSwKICAgICgweDIxNkQsICdNJywgdSdjJyksCiAgICAoMHgyMTZFLCAnTScsIHUnZCcpLAogICAgKDB4MjE2RiwgJ00nLCB1J20nKSwKICAgICgweDIxNzAsICdNJywgdSdpJyksCiAgICAoMHgyMTcxLCAnTScsIHUnaWknKSwKICAgICgweDIxNzIsICdNJywgdSdpaWknKSwKICAgICgweDIxNzMsICdNJywgdSdpdicpLAogICAgKDB4MjE3NCwgJ00nLCB1J3YnKSwKICAgICgweDIxNzUsICdNJywgdSd2aScpLAogICAgKDB4MjE3NiwgJ00nLCB1J3ZpaScpLAogICAgKDB4MjE3NywgJ00nLCB1J3ZpaWknKSwKICAgICgweDIxNzgsICdNJywgdSdpeCcpLAogICAgKDB4MjE3OSwgJ00nLCB1J3gnKSwKICAgICgweDIxN0EsICdNJywgdSd4aScpLAogICAgKDB4MjE3QiwgJ00nLCB1J3hpaScpLAogICAgKDB4MjE3QywgJ00nLCB1J2wnKSwKICAgICgweDIxN0QsICdNJywgdSdjJyksCiAgICAoMHgyMTdFLCAnTScsIHUnZCcpLAogICAgKDB4MjE3RiwgJ00nLCB1J20nKSwKICAgICgweDIxODAsICdWJyksCiAgICAoMHgyMTgzLCAnWCcpLAogICAgKDB4MjE4NCwgJ1YnKSwKICAgICgweDIxODksICdNJywgdScw4oGEMycpLAogICAgKDB4MjE4QSwgJ1gnKSwKICAgICgweDIxOTAsICdWJyksCiAgICAoMHgyMjJDLCAnTScsIHUn4oir4oirJyksCiAgICAoMHgyMjJELCAnTScsIHUn4oir4oir4oirJyksCiAgICAoMHgyMjJFLCAnVicpLAogICAgKDB4MjIyRiwgJ00nLCB1J+KIruKIricpLAogICAgKDB4MjIzMCwgJ00nLCB1J+KIruKIruKIricpLAogICAgKDB4MjIzMSwgJ1YnKSwKICAgICgweDIyNjAsICczJyksCiAgICAoMHgyMjYxLCAnVicpLAogICAgKDB4MjI2RSwgJzMnKSwKICAgICgweDIyNzAsICdWJyksCiAgICAoMHgyMzI5LCAnTScsIHUn44CIJyksCiAgICAoMHgyMzJBLCAnTScsIHUn44CJJyksCiAgICAoMHgyMzJCLCAnVicpLAogICAgKDB4MjNGNCwgJ1gnKSwKICAgICgweDI0MDAsICdWJyksCiAgICAoMHgyNDI3LCAnWCcpLAogICAgKDB4MjQ0MCwgJ1YnKSwKICAgICgweDI0NEIsICdYJyksCiAgICAoMHgyNDYwLCAnTScsIHUnMScpLAogICAgKDB4MjQ2MSwgJ00nLCB1JzInKSwKICAgICgweDI0NjIsICdNJywgdSczJyksCiAgICAoMHgyNDYzLCAnTScsIHUnNCcpLAogICAgKDB4MjQ2NCwgJ00nLCB1JzUnKSwKICAgICgweDI0NjUsICdNJywgdSc2JyksCiAgICAoMHgyNDY2LCAnTScsIHUnNycpLAogICAgKDB4MjQ2NywgJ00nLCB1JzgnKSwKICAgICgweDI0NjgsICdNJywgdSc5JyksCiAgICAoMHgyNDY5LCAnTScsIHUnMTAnKSwKICAgICgweDI0NkEsICdNJywgdScxMScpLAogICAgKDB4MjQ2QiwgJ00nLCB1JzEyJyksCiAgICBdCgpkZWYgX3NlZ18yMygpOgogICAgcmV0dXJuIFsKICAgICgweDI0NkMsICdNJywgdScxMycpLAogICAgKDB4MjQ2RCwgJ00nLCB1JzE0JyksCiAgICAoMHgyNDZFLCAnTScsIHUnMTUnKSwKICAgICgweDI0NkYsICdNJywgdScxNicpLAogICAgKDB4MjQ3MCwgJ00nLCB1JzE3JyksCiAgICAoMHgyNDcxLCAnTScsIHUnMTgnKSwKICAgICgweDI0NzIsICdNJywgdScxOScpLAogICAgKDB4MjQ3MywgJ00nLCB1JzIwJyksCiAgICAoMHgyNDc0LCAnMycsIHUnKDEpJyksCiAgICAoMHgyNDc1LCAnMycsIHUnKDIpJyksCiAgICAoMHgyNDc2LCAnMycsIHUnKDMpJyksCiAgICAoMHgyNDc3LCAnMycsIHUnKDQpJyksCiAgICAoMHgyNDc4LCAnMycsIHUnKDUpJyksCiAgICAoMHgyNDc5LCAnMycsIHUnKDYpJyksCiAgICAoMHgyNDdBLCAnMycsIHUnKDcpJyksCiAgICAoMHgyNDdCLCAnMycsIHUnKDgpJyksCiAgICAoMHgyNDdDLCAnMycsIHUnKDkpJyksCiAgICAoMHgyNDdELCAnMycsIHUnKDEwKScpLAogICAgKDB4MjQ3RSwgJzMnLCB1JygxMSknKSwKICAgICgweDI0N0YsICczJywgdScoMTIpJyksCiAgICAoMHgyNDgwLCAnMycsIHUnKDEzKScpLAogICAgKDB4MjQ4MSwgJzMnLCB1JygxNCknKSwKICAgICgweDI0ODIsICczJywgdScoMTUpJyksCiAgICAoMHgyNDgzLCAnMycsIHUnKDE2KScpLAogICAgKDB4MjQ4NCwgJzMnLCB1JygxNyknKSwKICAgICgweDI0ODUsICczJywgdScoMTgpJyksCiAgICAoMHgyNDg2LCAnMycsIHUnKDE5KScpLAogICAgKDB4MjQ4NywgJzMnLCB1JygyMCknKSwKICAgICgweDI0ODgsICdYJyksCiAgICAoMHgyNDlDLCAnMycsIHUnKGEpJyksCiAgICAoMHgyNDlELCAnMycsIHUnKGIpJyksCiAgICAoMHgyNDlFLCAnMycsIHUnKGMpJyksCiAgICAoMHgyNDlGLCAnMycsIHUnKGQpJyksCiAgICAoMHgyNEEwLCAnMycsIHUnKGUpJyksCiAgICAoMHgyNEExLCAnMycsIHUnKGYpJyksCiAgICAoMHgyNEEyLCAnMycsIHUnKGcpJyksCiAgICAoMHgyNEEzLCAnMycsIHUnKGgpJyksCiAgICAoMHgyNEE0LCAnMycsIHUnKGkpJyksCiAgICAoMHgyNEE1LCAnMycsIHUnKGopJyksCiAgICAoMHgyNEE2LCAnMycsIHUnKGspJyksCiAgICAoMHgyNEE3LCAnMycsIHUnKGwpJyksCiAgICAoMHgyNEE4LCAnMycsIHUnKG0pJyksCiAgICAoMHgyNEE5LCAnMycsIHUnKG4pJyksCiAgICAoMHgyNEFBLCAnMycsIHUnKG8pJyksCiAgICAoMHgyNEFCLCAnMycsIHUnKHApJyksCiAgICAoMHgyNEFDLCAnMycsIHUnKHEpJyksCiAgICAoMHgyNEFELCAnMycsIHUnKHIpJyksCiAgICAoMHgyNEFFLCAnMycsIHUnKHMpJyksCiAgICAoMHgyNEFGLCAnMycsIHUnKHQpJyksCiAgICAoMHgyNEIwLCAnMycsIHUnKHUpJyksCiAgICAoMHgyNEIxLCAnMycsIHUnKHYpJyksCiAgICAoMHgyNEIyLCAnMycsIHUnKHcpJyksCiAgICAoMHgyNEIzLCAnMycsIHUnKHgpJyksCiAgICAoMHgyNEI0LCAnMycsIHUnKHkpJyksCiAgICAoMHgyNEI1LCAnMycsIHUnKHopJyksCiAgICAoMHgyNEI2LCAnTScsIHUnYScpLAogICAgKDB4MjRCNywgJ00nLCB1J2InKSwKICAgICgweDI0QjgsICdNJywgdSdjJyksCiAgICAoMHgyNEI5LCAnTScsIHUnZCcpLAogICAgKDB4MjRCQSwgJ00nLCB1J2UnKSwKICAgICgweDI0QkIsICdNJywgdSdmJyksCiAgICAoMHgyNEJDLCAnTScsIHUnZycpLAogICAgKDB4MjRCRCwgJ00nLCB1J2gnKSwKICAgICgweDI0QkUsICdNJywgdSdpJyksCiAgICAoMHgyNEJGLCAnTScsIHUnaicpLAogICAgKDB4MjRDMCwgJ00nLCB1J2snKSwKICAgICgweDI0QzEsICdNJywgdSdsJyksCiAgICAoMHgyNEMyLCAnTScsIHUnbScpLAogICAgKDB4MjRDMywgJ00nLCB1J24nKSwKICAgICgweDI0QzQsICdNJywgdSdvJyksCiAgICAoMHgyNEM1LCAnTScsIHUncCcpLAogICAgKDB4MjRDNiwgJ00nLCB1J3EnKSwKICAgICgweDI0QzcsICdNJywgdSdyJyksCiAgICAoMHgyNEM4LCAnTScsIHUncycpLAogICAgKDB4MjRDOSwgJ00nLCB1J3QnKSwKICAgICgweDI0Q0EsICdNJywgdSd1JyksCiAgICAoMHgyNENCLCAnTScsIHUndicpLAogICAgKDB4MjRDQywgJ00nLCB1J3cnKSwKICAgICgweDI0Q0QsICdNJywgdSd4JyksCiAgICAoMHgyNENFLCAnTScsIHUneScpLAogICAgKDB4MjRDRiwgJ00nLCB1J3onKSwKICAgICgweDI0RDAsICdNJywgdSdhJyksCiAgICAoMHgyNEQxLCAnTScsIHUnYicpLAogICAgKDB4MjREMiwgJ00nLCB1J2MnKSwKICAgICgweDI0RDMsICdNJywgdSdkJyksCiAgICAoMHgyNEQ0LCAnTScsIHUnZScpLAogICAgKDB4MjRENSwgJ00nLCB1J2YnKSwKICAgICgweDI0RDYsICdNJywgdSdnJyksCiAgICAoMHgyNEQ3LCAnTScsIHUnaCcpLAogICAgKDB4MjREOCwgJ00nLCB1J2knKSwKICAgICgweDI0RDksICdNJywgdSdqJyksCiAgICAoMHgyNERBLCAnTScsIHUnaycpLAogICAgKDB4MjREQiwgJ00nLCB1J2wnKSwKICAgICgweDI0REMsICdNJywgdSdtJyksCiAgICAoMHgyNERELCAnTScsIHUnbicpLAogICAgKDB4MjRERSwgJ00nLCB1J28nKSwKICAgICgweDI0REYsICdNJywgdSdwJyksCiAgICAoMHgyNEUwLCAnTScsIHUncScpLAogICAgKDB4MjRFMSwgJ00nLCB1J3InKSwKICAgICgweDI0RTIsICdNJywgdSdzJyksCiAgICBdCgpkZWYgX3NlZ18yNCgpOgogICAgcmV0dXJuIFsKICAgICgweDI0RTMsICdNJywgdSd0JyksCiAgICAoMHgyNEU0LCAnTScsIHUndScpLAogICAgKDB4MjRFNSwgJ00nLCB1J3YnKSwKICAgICgweDI0RTYsICdNJywgdSd3JyksCiAgICAoMHgyNEU3LCAnTScsIHUneCcpLAogICAgKDB4MjRFOCwgJ00nLCB1J3knKSwKICAgICgweDI0RTksICdNJywgdSd6JyksCiAgICAoMHgyNEVBLCAnTScsIHUnMCcpLAogICAgKDB4MjRFQiwgJ1YnKSwKICAgICgweDI3MDAsICdYJyksCiAgICAoMHgyNzAxLCAnVicpLAogICAgKDB4MkEwQywgJ00nLCB1J+KIq+KIq+KIq+KIqycpLAogICAgKDB4MkEwRCwgJ1YnKSwKICAgICgweDJBNzQsICczJywgdSc6Oj0nKSwKICAgICgweDJBNzUsICczJywgdSc9PScpLAogICAgKDB4MkE3NiwgJzMnLCB1Jz09PScpLAogICAgKDB4MkE3NywgJ1YnKSwKICAgICgweDJBREMsICdNJywgdSfiq53MuCcpLAogICAgKDB4MkFERCwgJ1YnKSwKICAgICgweDJCNEQsICdYJyksCiAgICAoMHgyQjUwLCAnVicpLAogICAgKDB4MkI1QSwgJ1gnKSwKICAgICgweDJDMDAsICdNJywgdSfisLAnKSwKICAgICgweDJDMDEsICdNJywgdSfisLEnKSwKICAgICgweDJDMDIsICdNJywgdSfisLInKSwKICAgICgweDJDMDMsICdNJywgdSfisLMnKSwKICAgICgweDJDMDQsICdNJywgdSfisLQnKSwKICAgICgweDJDMDUsICdNJywgdSfisLUnKSwKICAgICgweDJDMDYsICdNJywgdSfisLYnKSwKICAgICgweDJDMDcsICdNJywgdSfisLcnKSwKICAgICgweDJDMDgsICdNJywgdSfisLgnKSwKICAgICgweDJDMDksICdNJywgdSfisLknKSwKICAgICgweDJDMEEsICdNJywgdSfisLonKSwKICAgICgweDJDMEIsICdNJywgdSfisLsnKSwKICAgICgweDJDMEMsICdNJywgdSfisLwnKSwKICAgICgweDJDMEQsICdNJywgdSfisL0nKSwKICAgICgweDJDMEUsICdNJywgdSfisL4nKSwKICAgICgweDJDMEYsICdNJywgdSfisL8nKSwKICAgICgweDJDMTAsICdNJywgdSfisYAnKSwKICAgICgweDJDMTEsICdNJywgdSfisYEnKSwKICAgICgweDJDMTIsICdNJywgdSfisYInKSwKICAgICgweDJDMTMsICdNJywgdSfisYMnKSwKICAgICgweDJDMTQsICdNJywgdSfisYQnKSwKICAgICgweDJDMTUsICdNJywgdSfisYUnKSwKICAgICgweDJDMTYsICdNJywgdSfisYYnKSwKICAgICgweDJDMTcsICdNJywgdSfisYcnKSwKICAgICgweDJDMTgsICdNJywgdSfisYgnKSwKICAgICgweDJDMTksICdNJywgdSfisYknKSwKICAgICgweDJDMUEsICdNJywgdSfisYonKSwKICAgICgweDJDMUIsICdNJywgdSfisYsnKSwKICAgICgweDJDMUMsICdNJywgdSfisYwnKSwKICAgICgweDJDMUQsICdNJywgdSfisY0nKSwKICAgICgweDJDMUUsICdNJywgdSfisY4nKSwKICAgICgweDJDMUYsICdNJywgdSfisY8nKSwKICAgICgweDJDMjAsICdNJywgdSfisZAnKSwKICAgICgweDJDMjEsICdNJywgdSfisZEnKSwKICAgICgweDJDMjIsICdNJywgdSfisZInKSwKICAgICgweDJDMjMsICdNJywgdSfisZMnKSwKICAgICgweDJDMjQsICdNJywgdSfisZQnKSwKICAgICgweDJDMjUsICdNJywgdSfisZUnKSwKICAgICgweDJDMjYsICdNJywgdSfisZYnKSwKICAgICgweDJDMjcsICdNJywgdSfisZcnKSwKICAgICgweDJDMjgsICdNJywgdSfisZgnKSwKICAgICgweDJDMjksICdNJywgdSfisZknKSwKICAgICgweDJDMkEsICdNJywgdSfisZonKSwKICAgICgweDJDMkIsICdNJywgdSfisZsnKSwKICAgICgweDJDMkMsICdNJywgdSfisZwnKSwKICAgICgweDJDMkQsICdNJywgdSfisZ0nKSwKICAgICgweDJDMkUsICdNJywgdSfisZ4nKSwKICAgICgweDJDMkYsICdYJyksCiAgICAoMHgyQzMwLCAnVicpLAogICAgKDB4MkM1RiwgJ1gnKSwKICAgICgweDJDNjAsICdNJywgdSfisaEnKSwKICAgICgweDJDNjEsICdWJyksCiAgICAoMHgyQzYyLCAnTScsIHUnyasnKSwKICAgICgweDJDNjMsICdNJywgdSfhtb0nKSwKICAgICgweDJDNjQsICdNJywgdSfJvScpLAogICAgKDB4MkM2NSwgJ1YnKSwKICAgICgweDJDNjcsICdNJywgdSfisagnKSwKICAgICgweDJDNjgsICdWJyksCiAgICAoMHgyQzY5LCAnTScsIHUn4rGqJyksCiAgICAoMHgyQzZBLCAnVicpLAogICAgKDB4MkM2QiwgJ00nLCB1J+KxrCcpLAogICAgKDB4MkM2QywgJ1YnKSwKICAgICgweDJDNkQsICdNJywgdSfJkScpLAogICAgKDB4MkM2RSwgJ00nLCB1J8mxJyksCiAgICAoMHgyQzZGLCAnTScsIHUnyZAnKSwKICAgICgweDJDNzAsICdNJywgdSfJkicpLAogICAgKDB4MkM3MSwgJ1YnKSwKICAgICgweDJDNzIsICdNJywgdSfisbMnKSwKICAgICgweDJDNzMsICdWJyksCiAgICAoMHgyQzc1LCAnTScsIHUn4rG2JyksCiAgICAoMHgyQzc2LCAnVicpLAogICAgKDB4MkM3QywgJ00nLCB1J2onKSwKICAgICgweDJDN0QsICdNJywgdSd2JyksCiAgICAoMHgyQzdFLCAnTScsIHUnyL8nKSwKICAgICgweDJDN0YsICdNJywgdSfJgCcpLAogICAgKDB4MkM4MCwgJ00nLCB1J+KygScpLAogICAgKDB4MkM4MSwgJ1YnKSwKICAgICgweDJDODIsICdNJywgdSfisoMnKSwKICAgIF0KCmRlZiBfc2VnXzI1KCk6CiAgICByZXR1cm4gWwogICAgKDB4MkM4MywgJ1YnKSwKICAgICgweDJDODQsICdNJywgdSfisoUnKSwKICAgICgweDJDODUsICdWJyksCiAgICAoMHgyQzg2LCAnTScsIHUn4rKHJyksCiAgICAoMHgyQzg3LCAnVicpLAogICAgKDB4MkM4OCwgJ00nLCB1J+KyiScpLAogICAgKDB4MkM4OSwgJ1YnKSwKICAgICgweDJDOEEsICdNJywgdSfisosnKSwKICAgICgweDJDOEIsICdWJyksCiAgICAoMHgyQzhDLCAnTScsIHUn4rKNJyksCiAgICAoMHgyQzhELCAnVicpLAogICAgKDB4MkM4RSwgJ00nLCB1J+KyjycpLAogICAgKDB4MkM4RiwgJ1YnKSwKICAgICgweDJDOTAsICdNJywgdSfispEnKSwKICAgICgweDJDOTEsICdWJyksCiAgICAoMHgyQzkyLCAnTScsIHUn4rKTJyksCiAgICAoMHgyQzkzLCAnVicpLAogICAgKDB4MkM5NCwgJ00nLCB1J+KylScpLAogICAgKDB4MkM5NSwgJ1YnKSwKICAgICgweDJDOTYsICdNJywgdSfispcnKSwKICAgICgweDJDOTcsICdWJyksCiAgICAoMHgyQzk4LCAnTScsIHUn4rKZJyksCiAgICAoMHgyQzk5LCAnVicpLAogICAgKDB4MkM5QSwgJ00nLCB1J+KymycpLAogICAgKDB4MkM5QiwgJ1YnKSwKICAgICgweDJDOUMsICdNJywgdSfisp0nKSwKICAgICgweDJDOUQsICdWJyksCiAgICAoMHgyQzlFLCAnTScsIHUn4rKfJyksCiAgICAoMHgyQzlGLCAnVicpLAogICAgKDB4MkNBMCwgJ00nLCB1J+KyoScpLAogICAgKDB4MkNBMSwgJ1YnKSwKICAgICgweDJDQTIsICdNJywgdSfisqMnKSwKICAgICgweDJDQTMsICdWJyksCiAgICAoMHgyQ0E0LCAnTScsIHUn4rKlJyksCiAgICAoMHgyQ0E1LCAnVicpLAogICAgKDB4MkNBNiwgJ00nLCB1J+KypycpLAogICAgKDB4MkNBNywgJ1YnKSwKICAgICgweDJDQTgsICdNJywgdSfisqknKSwKICAgICgweDJDQTksICdWJyksCiAgICAoMHgyQ0FBLCAnTScsIHUn4rKrJyksCiAgICAoMHgyQ0FCLCAnVicpLAogICAgKDB4MkNBQywgJ00nLCB1J+KyrScpLAogICAgKDB4MkNBRCwgJ1YnKSwKICAgICgweDJDQUUsICdNJywgdSfisq8nKSwKICAgICgweDJDQUYsICdWJyksCiAgICAoMHgyQ0IwLCAnTScsIHUn4rKxJyksCiAgICAoMHgyQ0IxLCAnVicpLAogICAgKDB4MkNCMiwgJ00nLCB1J+KysycpLAogICAgKDB4MkNCMywgJ1YnKSwKICAgICgweDJDQjQsICdNJywgdSfisrUnKSwKICAgICgweDJDQjUsICdWJyksCiAgICAoMHgyQ0I2LCAnTScsIHUn4rK3JyksCiAgICAoMHgyQ0I3LCAnVicpLAogICAgKDB4MkNCOCwgJ00nLCB1J+KyuScpLAogICAgKDB4MkNCOSwgJ1YnKSwKICAgICgweDJDQkEsICdNJywgdSfisrsnKSwKICAgICgweDJDQkIsICdWJyksCiAgICAoMHgyQ0JDLCAnTScsIHUn4rK9JyksCiAgICAoMHgyQ0JELCAnVicpLAogICAgKDB4MkNCRSwgJ00nLCB1J+KyvycpLAogICAgKDB4MkNCRiwgJ1YnKSwKICAgICgweDJDQzAsICdNJywgdSfis4EnKSwKICAgICgweDJDQzEsICdWJyksCiAgICAoMHgyQ0MyLCAnTScsIHUn4rODJyksCiAgICAoMHgyQ0MzLCAnVicpLAogICAgKDB4MkNDNCwgJ00nLCB1J+KzhScpLAogICAgKDB4MkNDNSwgJ1YnKSwKICAgICgweDJDQzYsICdNJywgdSfis4cnKSwKICAgICgweDJDQzcsICdWJyksCiAgICAoMHgyQ0M4LCAnTScsIHUn4rOJJyksCiAgICAoMHgyQ0M5LCAnVicpLAogICAgKDB4MkNDQSwgJ00nLCB1J+KziycpLAogICAgKDB4MkNDQiwgJ1YnKSwKICAgICgweDJDQ0MsICdNJywgdSfis40nKSwKICAgICgweDJDQ0QsICdWJyksCiAgICAoMHgyQ0NFLCAnTScsIHUn4rOPJyksCiAgICAoMHgyQ0NGLCAnVicpLAogICAgKDB4MkNEMCwgJ00nLCB1J+KzkScpLAogICAgKDB4MkNEMSwgJ1YnKSwKICAgICgweDJDRDIsICdNJywgdSfis5MnKSwKICAgICgweDJDRDMsICdWJyksCiAgICAoMHgyQ0Q0LCAnTScsIHUn4rOVJyksCiAgICAoMHgyQ0Q1LCAnVicpLAogICAgKDB4MkNENiwgJ00nLCB1J+KzlycpLAogICAgKDB4MkNENywgJ1YnKSwKICAgICgweDJDRDgsICdNJywgdSfis5knKSwKICAgICgweDJDRDksICdWJyksCiAgICAoMHgyQ0RBLCAnTScsIHUn4rObJyksCiAgICAoMHgyQ0RCLCAnVicpLAogICAgKDB4MkNEQywgJ00nLCB1J+KznScpLAogICAgKDB4MkNERCwgJ1YnKSwKICAgICgweDJDREUsICdNJywgdSfis58nKSwKICAgICgweDJDREYsICdWJyksCiAgICAoMHgyQ0UwLCAnTScsIHUn4rOhJyksCiAgICAoMHgyQ0UxLCAnVicpLAogICAgKDB4MkNFMiwgJ00nLCB1J+KzoycpLAogICAgKDB4MkNFMywgJ1YnKSwKICAgICgweDJDRUIsICdNJywgdSfis6wnKSwKICAgICgweDJDRUMsICdWJyksCiAgICAoMHgyQ0VELCAnTScsIHUn4rOuJyksCiAgICBdCgpkZWYgX3NlZ18yNigpOgogICAgcmV0dXJuIFsKICAgICgweDJDRUUsICdWJyksCiAgICAoMHgyQ0YyLCAnTScsIHUn4rOzJyksCiAgICAoMHgyQ0YzLCAnVicpLAogICAgKDB4MkNGNCwgJ1gnKSwKICAgICgweDJDRjksICdWJyksCiAgICAoMHgyRDI2LCAnWCcpLAogICAgKDB4MkQyNywgJ1YnKSwKICAgICgweDJEMjgsICdYJyksCiAgICAoMHgyRDJELCAnVicpLAogICAgKDB4MkQyRSwgJ1gnKSwKICAgICgweDJEMzAsICdWJyksCiAgICAoMHgyRDY4LCAnWCcpLAogICAgKDB4MkQ2RiwgJ00nLCB1J+K1oScpLAogICAgKDB4MkQ3MCwgJ1YnKSwKICAgICgweDJENzEsICdYJyksCiAgICAoMHgyRDdGLCAnVicpLAogICAgKDB4MkQ5NywgJ1gnKSwKICAgICgweDJEQTAsICdWJyksCiAgICAoMHgyREE3LCAnWCcpLAogICAgKDB4MkRBOCwgJ1YnKSwKICAgICgweDJEQUYsICdYJyksCiAgICAoMHgyREIwLCAnVicpLAogICAgKDB4MkRCNywgJ1gnKSwKICAgICgweDJEQjgsICdWJyksCiAgICAoMHgyREJGLCAnWCcpLAogICAgKDB4MkRDMCwgJ1YnKSwKICAgICgweDJEQzcsICdYJyksCiAgICAoMHgyREM4LCAnVicpLAogICAgKDB4MkRDRiwgJ1gnKSwKICAgICgweDJERDAsICdWJyksCiAgICAoMHgyREQ3LCAnWCcpLAogICAgKDB4MkREOCwgJ1YnKSwKICAgICgweDJEREYsICdYJyksCiAgICAoMHgyREUwLCAnVicpLAogICAgKDB4MkUzQywgJ1gnKSwKICAgICgweDJFODAsICdWJyksCiAgICAoMHgyRTlBLCAnWCcpLAogICAgKDB4MkU5QiwgJ1YnKSwKICAgICgweDJFOUYsICdNJywgdSfmr40nKSwKICAgICgweDJFQTAsICdWJyksCiAgICAoMHgyRUYzLCAnTScsIHUn6b6fJyksCiAgICAoMHgyRUY0LCAnWCcpLAogICAgKDB4MkYwMCwgJ00nLCB1J+S4gCcpLAogICAgKDB4MkYwMSwgJ00nLCB1J+S4qCcpLAogICAgKDB4MkYwMiwgJ00nLCB1J+S4ticpLAogICAgKDB4MkYwMywgJ00nLCB1J+S4vycpLAogICAgKDB4MkYwNCwgJ00nLCB1J+S5mScpLAogICAgKDB4MkYwNSwgJ00nLCB1J+S6hScpLAogICAgKDB4MkYwNiwgJ00nLCB1J+S6jCcpLAogICAgKDB4MkYwNywgJ00nLCB1J+S6oCcpLAogICAgKDB4MkYwOCwgJ00nLCB1J+S6uicpLAogICAgKDB4MkYwOSwgJ00nLCB1J+WEvycpLAogICAgKDB4MkYwQSwgJ00nLCB1J+WFpScpLAogICAgKDB4MkYwQiwgJ00nLCB1J+WFqycpLAogICAgKDB4MkYwQywgJ00nLCB1J+WGgicpLAogICAgKDB4MkYwRCwgJ00nLCB1J+WGlicpLAogICAgKDB4MkYwRSwgJ00nLCB1J+WGqycpLAogICAgKDB4MkYwRiwgJ00nLCB1J+WHoCcpLAogICAgKDB4MkYxMCwgJ00nLCB1J+WHtScpLAogICAgKDB4MkYxMSwgJ00nLCB1J+WIgCcpLAogICAgKDB4MkYxMiwgJ00nLCB1J+WKmycpLAogICAgKDB4MkYxMywgJ00nLCB1J+WLuScpLAogICAgKDB4MkYxNCwgJ00nLCB1J+WMlScpLAogICAgKDB4MkYxNSwgJ00nLCB1J+WMmicpLAogICAgKDB4MkYxNiwgJ00nLCB1J+WMuCcpLAogICAgKDB4MkYxNywgJ00nLCB1J+WNgScpLAogICAgKDB4MkYxOCwgJ00nLCB1J+WNnCcpLAogICAgKDB4MkYxOSwgJ00nLCB1J+WNqScpLAogICAgKDB4MkYxQSwgJ00nLCB1J+WOgicpLAogICAgKDB4MkYxQiwgJ00nLCB1J+WOticpLAogICAgKDB4MkYxQywgJ00nLCB1J+WPiCcpLAogICAgKDB4MkYxRCwgJ00nLCB1J+WPoycpLAogICAgKDB4MkYxRSwgJ00nLCB1J+WblycpLAogICAgKDB4MkYxRiwgJ00nLCB1J+WcnycpLAogICAgKDB4MkYyMCwgJ00nLCB1J+WjqycpLAogICAgKDB4MkYyMSwgJ00nLCB1J+WkgicpLAogICAgKDB4MkYyMiwgJ00nLCB1J+WkiicpLAogICAgKDB4MkYyMywgJ00nLCB1J+WklScpLAogICAgKDB4MkYyNCwgJ00nLCB1J+WkpycpLAogICAgKDB4MkYyNSwgJ00nLCB1J+WlsycpLAogICAgKDB4MkYyNiwgJ00nLCB1J+WtkCcpLAogICAgKDB4MkYyNywgJ00nLCB1J+WugCcpLAogICAgKDB4MkYyOCwgJ00nLCB1J+WvuCcpLAogICAgKDB4MkYyOSwgJ00nLCB1J+WwjycpLAogICAgKDB4MkYyQSwgJ00nLCB1J+WwoicpLAogICAgKDB4MkYyQiwgJ00nLCB1J+WwuCcpLAogICAgKDB4MkYyQywgJ00nLCB1J+WxricpLAogICAgKDB4MkYyRCwgJ00nLCB1J+WxsScpLAogICAgKDB4MkYyRSwgJ00nLCB1J+W3mycpLAogICAgKDB4MkYyRiwgJ00nLCB1J+W3pScpLAogICAgKDB4MkYzMCwgJ00nLCB1J+W3sScpLAogICAgKDB4MkYzMSwgJ00nLCB1J+W3vicpLAogICAgKDB4MkYzMiwgJ00nLCB1J+W5sicpLAogICAgKDB4MkYzMywgJ00nLCB1J+W5uicpLAogICAgKDB4MkYzNCwgJ00nLCB1J+W5vycpLAogICAgKDB4MkYzNSwgJ00nLCB1J+W7tCcpLAogICAgKDB4MkYzNiwgJ00nLCB1J+W7vicpLAogICAgKDB4MkYzNywgJ00nLCB1J+W8iycpLAogICAgKDB4MkYzOCwgJ00nLCB1J+W8kycpLAogICAgKDB4MkYzOSwgJ00nLCB1J+W9kCcpLAogICAgXQoKZGVmIF9zZWdfMjcoKToKICAgIHJldHVybiBbCiAgICAoMHgyRjNBLCAnTScsIHUn5b2hJyksCiAgICAoMHgyRjNCLCAnTScsIHUn5b2zJyksCiAgICAoMHgyRjNDLCAnTScsIHUn5b+DJyksCiAgICAoMHgyRjNELCAnTScsIHUn5oiIJyksCiAgICAoMHgyRjNFLCAnTScsIHUn5oi2JyksCiAgICAoMHgyRjNGLCAnTScsIHUn5omLJyksCiAgICAoMHgyRjQwLCAnTScsIHUn5pSvJyksCiAgICAoMHgyRjQxLCAnTScsIHUn5pS0JyksCiAgICAoMHgyRjQyLCAnTScsIHUn5paHJyksCiAgICAoMHgyRjQzLCAnTScsIHUn5paXJyksCiAgICAoMHgyRjQ0LCAnTScsIHUn5pakJyksCiAgICAoMHgyRjQ1LCAnTScsIHUn5pa5JyksCiAgICAoMHgyRjQ2LCAnTScsIHUn5pegJyksCiAgICAoMHgyRjQ3LCAnTScsIHUn5pelJyksCiAgICAoMHgyRjQ4LCAnTScsIHUn5puwJyksCiAgICAoMHgyRjQ5LCAnTScsIHUn5pyIJyksCiAgICAoMHgyRjRBLCAnTScsIHUn5pyoJyksCiAgICAoMHgyRjRCLCAnTScsIHUn5qygJyksCiAgICAoMHgyRjRDLCAnTScsIHUn5q2iJyksCiAgICAoMHgyRjRELCAnTScsIHUn5q25JyksCiAgICAoMHgyRjRFLCAnTScsIHUn5q6zJyksCiAgICAoMHgyRjRGLCAnTScsIHUn5q+LJyksCiAgICAoMHgyRjUwLCAnTScsIHUn5q+UJyksCiAgICAoMHgyRjUxLCAnTScsIHUn5q+bJyksCiAgICAoMHgyRjUyLCAnTScsIHUn5rCPJyksCiAgICAoMHgyRjUzLCAnTScsIHUn5rCUJyksCiAgICAoMHgyRjU0LCAnTScsIHUn5rC0JyksCiAgICAoMHgyRjU1LCAnTScsIHUn54GrJyksCiAgICAoMHgyRjU2LCAnTScsIHUn54iqJyksCiAgICAoMHgyRjU3LCAnTScsIHUn54i2JyksCiAgICAoMHgyRjU4LCAnTScsIHUn54i7JyksCiAgICAoMHgyRjU5LCAnTScsIHUn54i/JyksCiAgICAoMHgyRjVBLCAnTScsIHUn54mHJyksCiAgICAoMHgyRjVCLCAnTScsIHUn54mZJyksCiAgICAoMHgyRjVDLCAnTScsIHUn54mbJyksCiAgICAoMHgyRjVELCAnTScsIHUn54qsJyksCiAgICAoMHgyRjVFLCAnTScsIHUn546EJyksCiAgICAoMHgyRjVGLCAnTScsIHUn546JJyksCiAgICAoMHgyRjYwLCAnTScsIHUn55OcJyksCiAgICAoMHgyRjYxLCAnTScsIHUn55OmJyksCiAgICAoMHgyRjYyLCAnTScsIHUn55SYJyksCiAgICAoMHgyRjYzLCAnTScsIHUn55SfJyksCiAgICAoMHgyRjY0LCAnTScsIHUn55SoJyksCiAgICAoMHgyRjY1LCAnTScsIHUn55SwJyksCiAgICAoMHgyRjY2LCAnTScsIHUn55aLJyksCiAgICAoMHgyRjY3LCAnTScsIHUn55aSJyksCiAgICAoMHgyRjY4LCAnTScsIHUn55m2JyksCiAgICAoMHgyRjY5LCAnTScsIHUn55m9JyksCiAgICAoMHgyRjZBLCAnTScsIHUn55quJyksCiAgICAoMHgyRjZCLCAnTScsIHUn55q/JyksCiAgICAoMHgyRjZDLCAnTScsIHUn55uuJyksCiAgICAoMHgyRjZELCAnTScsIHUn55+bJyksCiAgICAoMHgyRjZFLCAnTScsIHUn55+iJyksCiAgICAoMHgyRjZGLCAnTScsIHUn55+zJyksCiAgICAoMHgyRjcwLCAnTScsIHUn56S6JyksCiAgICAoMHgyRjcxLCAnTScsIHUn56a4JyksCiAgICAoMHgyRjcyLCAnTScsIHUn56a+JyksCiAgICAoMHgyRjczLCAnTScsIHUn56m0JyksCiAgICAoMHgyRjc0LCAnTScsIHUn56uLJyksCiAgICAoMHgyRjc1LCAnTScsIHUn56u5JyksCiAgICAoMHgyRjc2LCAnTScsIHUn57GzJyksCiAgICAoMHgyRjc3LCAnTScsIHUn57O4JyksCiAgICAoMHgyRjc4LCAnTScsIHUn57y2JyksCiAgICAoMHgyRjc5LCAnTScsIHUn572RJyksCiAgICAoMHgyRjdBLCAnTScsIHUn576KJyksCiAgICAoMHgyRjdCLCAnTScsIHUn5769JyksCiAgICAoMHgyRjdDLCAnTScsIHUn6ICBJyksCiAgICAoMHgyRjdELCAnTScsIHUn6ICMJyksCiAgICAoMHgyRjdFLCAnTScsIHUn6ICSJyksCiAgICAoMHgyRjdGLCAnTScsIHUn6ICzJyksCiAgICAoMHgyRjgwLCAnTScsIHUn6IG/JyksCiAgICAoMHgyRjgxLCAnTScsIHUn6IKJJyksCiAgICAoMHgyRjgyLCAnTScsIHUn6IejJyksCiAgICAoMHgyRjgzLCAnTScsIHUn6IeqJyksCiAgICAoMHgyRjg0LCAnTScsIHUn6IezJyksCiAgICAoMHgyRjg1LCAnTScsIHUn6Ie8JyksCiAgICAoMHgyRjg2LCAnTScsIHUn6IiMJyksCiAgICAoMHgyRjg3LCAnTScsIHUn6IibJyksCiAgICAoMHgyRjg4LCAnTScsIHUn6IifJyksCiAgICAoMHgyRjg5LCAnTScsIHUn6ImuJyksCiAgICAoMHgyRjhBLCAnTScsIHUn6ImyJyksCiAgICAoMHgyRjhCLCAnTScsIHUn6Im4JyksCiAgICAoMHgyRjhDLCAnTScsIHUn6JmNJyksCiAgICAoMHgyRjhELCAnTScsIHUn6JmrJyksCiAgICAoMHgyRjhFLCAnTScsIHUn6KGAJyksCiAgICAoMHgyRjhGLCAnTScsIHUn6KGMJyksCiAgICAoMHgyRjkwLCAnTScsIHUn6KGjJyksCiAgICAoMHgyRjkxLCAnTScsIHUn6KW+JyksCiAgICAoMHgyRjkyLCAnTScsIHUn6KaLJyksCiAgICAoMHgyRjkzLCAnTScsIHUn6KeSJyksCiAgICAoMHgyRjk0LCAnTScsIHUn6KiAJyksCiAgICAoMHgyRjk1LCAnTScsIHUn6LC3JyksCiAgICAoMHgyRjk2LCAnTScsIHUn6LGGJyksCiAgICAoMHgyRjk3LCAnTScsIHUn6LGVJyksCiAgICAoMHgyRjk4LCAnTScsIHUn6LG4JyksCiAgICAoMHgyRjk5LCAnTScsIHUn6LKdJyksCiAgICAoMHgyRjlBLCAnTScsIHUn6LWkJyksCiAgICAoMHgyRjlCLCAnTScsIHUn6LWwJyksCiAgICAoMHgyRjlDLCAnTScsIHUn6LazJyksCiAgICAoMHgyRjlELCAnTScsIHUn6LqrJyksCiAgICBdCgpkZWYgX3NlZ18yOCgpOgogICAgcmV0dXJuIFsKICAgICgweDJGOUUsICdNJywgdSfou4onKSwKICAgICgweDJGOUYsICdNJywgdSfovpsnKSwKICAgICgweDJGQTAsICdNJywgdSfovrAnKSwKICAgICgweDJGQTEsICdNJywgdSfovrUnKSwKICAgICgweDJGQTIsICdNJywgdSfpgpEnKSwKICAgICgweDJGQTMsICdNJywgdSfphYknKSwKICAgICgweDJGQTQsICdNJywgdSfph4YnKSwKICAgICgweDJGQTUsICdNJywgdSfph4wnKSwKICAgICgweDJGQTYsICdNJywgdSfph5EnKSwKICAgICgweDJGQTcsICdNJywgdSfplbcnKSwKICAgICgweDJGQTgsICdNJywgdSfploAnKSwKICAgICgweDJGQTksICdNJywgdSfpmJwnKSwKICAgICgweDJGQUEsICdNJywgdSfpmrYnKSwKICAgICgweDJGQUIsICdNJywgdSfpmrknKSwKICAgICgweDJGQUMsICdNJywgdSfpm6gnKSwKICAgICgweDJGQUQsICdNJywgdSfpnZEnKSwKICAgICgweDJGQUUsICdNJywgdSfpnZ4nKSwKICAgICgweDJGQUYsICdNJywgdSfpnaInKSwKICAgICgweDJGQjAsICdNJywgdSfpnaknKSwKICAgICgweDJGQjEsICdNJywgdSfpn4snKSwKICAgICgweDJGQjIsICdNJywgdSfpn60nKSwKICAgICgweDJGQjMsICdNJywgdSfpn7MnKSwKICAgICgweDJGQjQsICdNJywgdSfpoIEnKSwKICAgICgweDJGQjUsICdNJywgdSfpoqgnKSwKICAgICgweDJGQjYsICdNJywgdSfpo5snKSwKICAgICgweDJGQjcsICdNJywgdSfpo58nKSwKICAgICgweDJGQjgsICdNJywgdSfpppYnKSwKICAgICgweDJGQjksICdNJywgdSfpppknKSwKICAgICgweDJGQkEsICdNJywgdSfppqwnKSwKICAgICgweDJGQkIsICdNJywgdSfpqqgnKSwKICAgICgweDJGQkMsICdNJywgdSfpq5gnKSwKICAgICgweDJGQkQsICdNJywgdSfpq58nKSwKICAgICgweDJGQkUsICdNJywgdSfprKUnKSwKICAgICgweDJGQkYsICdNJywgdSfprK8nKSwKICAgICgweDJGQzAsICdNJywgdSfprLInKSwKICAgICgweDJGQzEsICdNJywgdSfprLwnKSwKICAgICgweDJGQzIsICdNJywgdSfprZonKSwKICAgICgweDJGQzMsICdNJywgdSfps6UnKSwKICAgICgweDJGQzQsICdNJywgdSfpubUnKSwKICAgICgweDJGQzUsICdNJywgdSfpub8nKSwKICAgICgweDJGQzYsICdNJywgdSfpuqUnKSwKICAgICgweDJGQzcsICdNJywgdSfpursnKSwKICAgICgweDJGQzgsICdNJywgdSfpu4MnKSwKICAgICgweDJGQzksICdNJywgdSfpu40nKSwKICAgICgweDJGQ0EsICdNJywgdSfpu5EnKSwKICAgICgweDJGQ0IsICdNJywgdSfpu7knKSwKICAgICgweDJGQ0MsICdNJywgdSfpu70nKSwKICAgICgweDJGQ0QsICdNJywgdSfpvI4nKSwKICAgICgweDJGQ0UsICdNJywgdSfpvJMnKSwKICAgICgweDJGQ0YsICdNJywgdSfpvKAnKSwKICAgICgweDJGRDAsICdNJywgdSfpvLsnKSwKICAgICgweDJGRDEsICdNJywgdSfpvYonKSwKICAgICgweDJGRDIsICdNJywgdSfpvZInKSwKICAgICgweDJGRDMsICdNJywgdSfpvo0nKSwKICAgICgweDJGRDQsICdNJywgdSfpvpwnKSwKICAgICgweDJGRDUsICdNJywgdSfpvqAnKSwKICAgICgweDJGRDYsICdYJyksCiAgICAoMHgzMDAwLCAnMycsIHUnICcpLAogICAgKDB4MzAwMSwgJ1YnKSwKICAgICgweDMwMDIsICdNJywgdScuJyksCiAgICAoMHgzMDAzLCAnVicpLAogICAgKDB4MzAzNiwgJ00nLCB1J+OAkicpLAogICAgKDB4MzAzNywgJ1YnKSwKICAgICgweDMwMzgsICdNJywgdSfljYEnKSwKICAgICgweDMwMzksICdNJywgdSfljYQnKSwKICAgICgweDMwM0EsICdNJywgdSfljYUnKSwKICAgICgweDMwM0IsICdWJyksCiAgICAoMHgzMDQwLCAnWCcpLAogICAgKDB4MzA0MSwgJ1YnKSwKICAgICgweDMwOTcsICdYJyksCiAgICAoMHgzMDk5LCAnVicpLAogICAgKDB4MzA5QiwgJzMnLCB1JyDjgpknKSwKICAgICgweDMwOUMsICczJywgdScg44KaJyksCiAgICAoMHgzMDlELCAnVicpLAogICAgKDB4MzA5RiwgJ00nLCB1J+OCiOOCiicpLAogICAgKDB4MzBBMCwgJ1YnKSwKICAgICgweDMwRkYsICdNJywgdSfjgrPjg4gnKSwKICAgICgweDMxMDAsICdYJyksCiAgICAoMHgzMTA1LCAnVicpLAogICAgKDB4MzEyRSwgJ1gnKSwKICAgICgweDMxMzEsICdNJywgdSfhhIAnKSwKICAgICgweDMxMzIsICdNJywgdSfhhIEnKSwKICAgICgweDMxMzMsICdNJywgdSfhhqonKSwKICAgICgweDMxMzQsICdNJywgdSfhhIInKSwKICAgICgweDMxMzUsICdNJywgdSfhhqwnKSwKICAgICgweDMxMzYsICdNJywgdSfhhq0nKSwKICAgICgweDMxMzcsICdNJywgdSfhhIMnKSwKICAgICgweDMxMzgsICdNJywgdSfhhIQnKSwKICAgICgweDMxMzksICdNJywgdSfhhIUnKSwKICAgICgweDMxM0EsICdNJywgdSfhhrAnKSwKICAgICgweDMxM0IsICdNJywgdSfhhrEnKSwKICAgICgweDMxM0MsICdNJywgdSfhhrInKSwKICAgICgweDMxM0QsICdNJywgdSfhhrMnKSwKICAgICgweDMxM0UsICdNJywgdSfhhrQnKSwKICAgICgweDMxM0YsICdNJywgdSfhhrUnKSwKICAgICgweDMxNDAsICdNJywgdSfhhJonKSwKICAgICgweDMxNDEsICdNJywgdSfhhIYnKSwKICAgICgweDMxNDIsICdNJywgdSfhhIcnKSwKICAgICgweDMxNDMsICdNJywgdSfhhIgnKSwKICAgICgweDMxNDQsICdNJywgdSfhhKEnKSwKICAgIF0KCmRlZiBfc2VnXzI5KCk6CiAgICByZXR1cm4gWwogICAgKDB4MzE0NSwgJ00nLCB1J+GEiScpLAogICAgKDB4MzE0NiwgJ00nLCB1J+GEiicpLAogICAgKDB4MzE0NywgJ00nLCB1J+GEiycpLAogICAgKDB4MzE0OCwgJ00nLCB1J+GEjCcpLAogICAgKDB4MzE0OSwgJ00nLCB1J+GEjScpLAogICAgKDB4MzE0QSwgJ00nLCB1J+GEjicpLAogICAgKDB4MzE0QiwgJ00nLCB1J+GEjycpLAogICAgKDB4MzE0QywgJ00nLCB1J+GEkCcpLAogICAgKDB4MzE0RCwgJ00nLCB1J+GEkScpLAogICAgKDB4MzE0RSwgJ00nLCB1J+GEkicpLAogICAgKDB4MzE0RiwgJ00nLCB1J+GFoScpLAogICAgKDB4MzE1MCwgJ00nLCB1J+GFoicpLAogICAgKDB4MzE1MSwgJ00nLCB1J+GFoycpLAogICAgKDB4MzE1MiwgJ00nLCB1J+GFpCcpLAogICAgKDB4MzE1MywgJ00nLCB1J+GFpScpLAogICAgKDB4MzE1NCwgJ00nLCB1J+GFpicpLAogICAgKDB4MzE1NSwgJ00nLCB1J+GFpycpLAogICAgKDB4MzE1NiwgJ00nLCB1J+GFqCcpLAogICAgKDB4MzE1NywgJ00nLCB1J+GFqScpLAogICAgKDB4MzE1OCwgJ00nLCB1J+GFqicpLAogICAgKDB4MzE1OSwgJ00nLCB1J+GFqycpLAogICAgKDB4MzE1QSwgJ00nLCB1J+GFrCcpLAogICAgKDB4MzE1QiwgJ00nLCB1J+GFrScpLAogICAgKDB4MzE1QywgJ00nLCB1J+GFricpLAogICAgKDB4MzE1RCwgJ00nLCB1J+GFrycpLAogICAgKDB4MzE1RSwgJ00nLCB1J+GFsCcpLAogICAgKDB4MzE1RiwgJ00nLCB1J+GFsScpLAogICAgKDB4MzE2MCwgJ00nLCB1J+GFsicpLAogICAgKDB4MzE2MSwgJ00nLCB1J+GFsycpLAogICAgKDB4MzE2MiwgJ00nLCB1J+GFtCcpLAogICAgKDB4MzE2MywgJ00nLCB1J+GFtScpLAogICAgKDB4MzE2NCwgJ1gnKSwKICAgICgweDMxNjUsICdNJywgdSfhhJQnKSwKICAgICgweDMxNjYsICdNJywgdSfhhJUnKSwKICAgICgweDMxNjcsICdNJywgdSfhh4cnKSwKICAgICgweDMxNjgsICdNJywgdSfhh4gnKSwKICAgICgweDMxNjksICdNJywgdSfhh4wnKSwKICAgICgweDMxNkEsICdNJywgdSfhh44nKSwKICAgICgweDMxNkIsICdNJywgdSfhh5MnKSwKICAgICgweDMxNkMsICdNJywgdSfhh5cnKSwKICAgICgweDMxNkQsICdNJywgdSfhh5knKSwKICAgICgweDMxNkUsICdNJywgdSfhhJwnKSwKICAgICgweDMxNkYsICdNJywgdSfhh50nKSwKICAgICgweDMxNzAsICdNJywgdSfhh58nKSwKICAgICgweDMxNzEsICdNJywgdSfhhJ0nKSwKICAgICgweDMxNzIsICdNJywgdSfhhJ4nKSwKICAgICgweDMxNzMsICdNJywgdSfhhKAnKSwKICAgICgweDMxNzQsICdNJywgdSfhhKInKSwKICAgICgweDMxNzUsICdNJywgdSfhhKMnKSwKICAgICgweDMxNzYsICdNJywgdSfhhKcnKSwKICAgICgweDMxNzcsICdNJywgdSfhhKknKSwKICAgICgweDMxNzgsICdNJywgdSfhhKsnKSwKICAgICgweDMxNzksICdNJywgdSfhhKwnKSwKICAgICgweDMxN0EsICdNJywgdSfhhK0nKSwKICAgICgweDMxN0IsICdNJywgdSfhhK4nKSwKICAgICgweDMxN0MsICdNJywgdSfhhK8nKSwKICAgICgweDMxN0QsICdNJywgdSfhhLInKSwKICAgICgweDMxN0UsICdNJywgdSfhhLYnKSwKICAgICgweDMxN0YsICdNJywgdSfhhYAnKSwKICAgICgweDMxODAsICdNJywgdSfhhYcnKSwKICAgICgweDMxODEsICdNJywgdSfhhYwnKSwKICAgICgweDMxODIsICdNJywgdSfhh7EnKSwKICAgICgweDMxODMsICdNJywgdSfhh7InKSwKICAgICgweDMxODQsICdNJywgdSfhhZcnKSwKICAgICgweDMxODUsICdNJywgdSfhhZgnKSwKICAgICgweDMxODYsICdNJywgdSfhhZknKSwKICAgICgweDMxODcsICdNJywgdSfhhoQnKSwKICAgICgweDMxODgsICdNJywgdSfhhoUnKSwKICAgICgweDMxODksICdNJywgdSfhhognKSwKICAgICgweDMxOEEsICdNJywgdSfhhpEnKSwKICAgICgweDMxOEIsICdNJywgdSfhhpInKSwKICAgICgweDMxOEMsICdNJywgdSfhhpQnKSwKICAgICgweDMxOEQsICdNJywgdSfhhp4nKSwKICAgICgweDMxOEUsICdNJywgdSfhhqEnKSwKICAgICgweDMxOEYsICdYJyksCiAgICAoMHgzMTkwLCAnVicpLAogICAgKDB4MzE5MiwgJ00nLCB1J+S4gCcpLAogICAgKDB4MzE5MywgJ00nLCB1J+S6jCcpLAogICAgKDB4MzE5NCwgJ00nLCB1J+S4iScpLAogICAgKDB4MzE5NSwgJ00nLCB1J+WbmycpLAogICAgKDB4MzE5NiwgJ00nLCB1J+S4iicpLAogICAgKDB4MzE5NywgJ00nLCB1J+S4rScpLAogICAgKDB4MzE5OCwgJ00nLCB1J+S4iycpLAogICAgKDB4MzE5OSwgJ00nLCB1J+eUsicpLAogICAgKDB4MzE5QSwgJ00nLCB1J+S5mScpLAogICAgKDB4MzE5QiwgJ00nLCB1J+S4mScpLAogICAgKDB4MzE5QywgJ00nLCB1J+S4gScpLAogICAgKDB4MzE5RCwgJ00nLCB1J+WkqScpLAogICAgKDB4MzE5RSwgJ00nLCB1J+WcsCcpLAogICAgKDB4MzE5RiwgJ00nLCB1J+S6uicpLAogICAgKDB4MzFBMCwgJ1YnKSwKICAgICgweDMxQkIsICdYJyksCiAgICAoMHgzMUMwLCAnVicpLAogICAgKDB4MzFFNCwgJ1gnKSwKICAgICgweDMxRjAsICdWJyksCiAgICAoMHgzMjAwLCAnMycsIHUnKOGEgCknKSwKICAgICgweDMyMDEsICczJywgdSco4YSCKScpLAogICAgKDB4MzIwMiwgJzMnLCB1JyjhhIMpJyksCiAgICAoMHgzMjAzLCAnMycsIHUnKOGEhSknKSwKICAgICgweDMyMDQsICczJywgdSco4YSGKScpLAogICAgXQoKZGVmIF9zZWdfMzAoKToKICAgIHJldHVybiBbCiAgICAoMHgzMjA1LCAnMycsIHUnKOGEhyknKSwKICAgICgweDMyMDYsICczJywgdSco4YSJKScpLAogICAgKDB4MzIwNywgJzMnLCB1JyjhhIspJyksCiAgICAoMHgzMjA4LCAnMycsIHUnKOGEjCknKSwKICAgICgweDMyMDksICczJywgdSco4YSOKScpLAogICAgKDB4MzIwQSwgJzMnLCB1JyjhhI8pJyksCiAgICAoMHgzMjBCLCAnMycsIHUnKOGEkCknKSwKICAgICgweDMyMEMsICczJywgdSco4YSRKScpLAogICAgKDB4MzIwRCwgJzMnLCB1JyjhhJIpJyksCiAgICAoMHgzMjBFLCAnMycsIHUnKOqwgCknKSwKICAgICgweDMyMEYsICczJywgdSco64KYKScpLAogICAgKDB4MzIxMCwgJzMnLCB1Jyjri6QpJyksCiAgICAoMHgzMjExLCAnMycsIHUnKOudvCknKSwKICAgICgweDMyMTIsICczJywgdSco66eIKScpLAogICAgKDB4MzIxMywgJzMnLCB1JyjrsJQpJyksCiAgICAoMHgzMjE0LCAnMycsIHUnKOyCrCknKSwKICAgICgweDMyMTUsICczJywgdSco7JWEKScpLAogICAgKDB4MzIxNiwgJzMnLCB1JyjsnpApJyksCiAgICAoMHgzMjE3LCAnMycsIHUnKOywqCknKSwKICAgICgweDMyMTgsICczJywgdSco7Lm0KScpLAogICAgKDB4MzIxOSwgJzMnLCB1Jyjtg4ApJyksCiAgICAoMHgzMjFBLCAnMycsIHUnKO2MjCknKSwKICAgICgweDMyMUIsICczJywgdSco7ZWYKScpLAogICAgKDB4MzIxQywgJzMnLCB1Jyjso7wpJyksCiAgICAoMHgzMjFELCAnMycsIHUnKOyYpOyghCknKSwKICAgICgweDMyMUUsICczJywgdSco7Jik7ZuEKScpLAogICAgKDB4MzIxRiwgJ1gnKSwKICAgICgweDMyMjAsICczJywgdSco5LiAKScpLAogICAgKDB4MzIyMSwgJzMnLCB1JyjkuowpJyksCiAgICAoMHgzMjIyLCAnMycsIHUnKOS4iSknKSwKICAgICgweDMyMjMsICczJywgdSco5ZubKScpLAogICAgKDB4MzIyNCwgJzMnLCB1JyjkupQpJyksCiAgICAoMHgzMjI1LCAnMycsIHUnKOWFrSknKSwKICAgICgweDMyMjYsICczJywgdSco5LiDKScpLAogICAgKDB4MzIyNywgJzMnLCB1JyjlhaspJyksCiAgICAoMHgzMjI4LCAnMycsIHUnKOS5nSknKSwKICAgICgweDMyMjksICczJywgdSco5Y2BKScpLAogICAgKDB4MzIyQSwgJzMnLCB1JyjmnIgpJyksCiAgICAoMHgzMjJCLCAnMycsIHUnKOeBqyknKSwKICAgICgweDMyMkMsICczJywgdSco5rC0KScpLAogICAgKDB4MzIyRCwgJzMnLCB1JyjmnKgpJyksCiAgICAoMHgzMjJFLCAnMycsIHUnKOmHkSknKSwKICAgICgweDMyMkYsICczJywgdSco5ZyfKScpLAogICAgKDB4MzIzMCwgJzMnLCB1Jyjml6UpJyksCiAgICAoMHgzMjMxLCAnMycsIHUnKOagqiknKSwKICAgICgweDMyMzIsICczJywgdSco5pyJKScpLAogICAgKDB4MzIzMywgJzMnLCB1JyjnpL4pJyksCiAgICAoMHgzMjM0LCAnMycsIHUnKOWQjSknKSwKICAgICgweDMyMzUsICczJywgdSco54m5KScpLAogICAgKDB4MzIzNiwgJzMnLCB1JyjosqEpJyksCiAgICAoMHgzMjM3LCAnMycsIHUnKOelnSknKSwKICAgICgweDMyMzgsICczJywgdSco5Yq0KScpLAogICAgKDB4MzIzOSwgJzMnLCB1Jyjku6MpJyksCiAgICAoMHgzMjNBLCAnMycsIHUnKOWRvCknKSwKICAgICgweDMyM0IsICczJywgdSco5a2mKScpLAogICAgKDB4MzIzQywgJzMnLCB1Jyjnm6MpJyksCiAgICAoMHgzMjNELCAnMycsIHUnKOS8gSknKSwKICAgICgweDMyM0UsICczJywgdSco6LOHKScpLAogICAgKDB4MzIzRiwgJzMnLCB1JyjljZQpJyksCiAgICAoMHgzMjQwLCAnMycsIHUnKOelrSknKSwKICAgICgweDMyNDEsICczJywgdSco5LyRKScpLAogICAgKDB4MzI0MiwgJzMnLCB1Jyjoh6opJyksCiAgICAoMHgzMjQzLCAnMycsIHUnKOiHsyknKSwKICAgICgweDMyNDQsICdNJywgdSfllY8nKSwKICAgICgweDMyNDUsICdNJywgdSflubwnKSwKICAgICgweDMyNDYsICdNJywgdSfmlocnKSwKICAgICgweDMyNDcsICdNJywgdSfnro8nKSwKICAgICgweDMyNDgsICdWJyksCiAgICAoMHgzMjUwLCAnTScsIHUncHRlJyksCiAgICAoMHgzMjUxLCAnTScsIHUnMjEnKSwKICAgICgweDMyNTIsICdNJywgdScyMicpLAogICAgKDB4MzI1MywgJ00nLCB1JzIzJyksCiAgICAoMHgzMjU0LCAnTScsIHUnMjQnKSwKICAgICgweDMyNTUsICdNJywgdScyNScpLAogICAgKDB4MzI1NiwgJ00nLCB1JzI2JyksCiAgICAoMHgzMjU3LCAnTScsIHUnMjcnKSwKICAgICgweDMyNTgsICdNJywgdScyOCcpLAogICAgKDB4MzI1OSwgJ00nLCB1JzI5JyksCiAgICAoMHgzMjVBLCAnTScsIHUnMzAnKSwKICAgICgweDMyNUIsICdNJywgdSczMScpLAogICAgKDB4MzI1QywgJ00nLCB1JzMyJyksCiAgICAoMHgzMjVELCAnTScsIHUnMzMnKSwKICAgICgweDMyNUUsICdNJywgdSczNCcpLAogICAgKDB4MzI1RiwgJ00nLCB1JzM1JyksCiAgICAoMHgzMjYwLCAnTScsIHUn4YSAJyksCiAgICAoMHgzMjYxLCAnTScsIHUn4YSCJyksCiAgICAoMHgzMjYyLCAnTScsIHUn4YSDJyksCiAgICAoMHgzMjYzLCAnTScsIHUn4YSFJyksCiAgICAoMHgzMjY0LCAnTScsIHUn4YSGJyksCiAgICAoMHgzMjY1LCAnTScsIHUn4YSHJyksCiAgICAoMHgzMjY2LCAnTScsIHUn4YSJJyksCiAgICAoMHgzMjY3LCAnTScsIHUn4YSLJyksCiAgICAoMHgzMjY4LCAnTScsIHUn4YSMJyksCiAgICAoMHgzMjY5LCAnTScsIHUn4YSOJyksCiAgICAoMHgzMjZBLCAnTScsIHUn4YSPJyksCiAgICAoMHgzMjZCLCAnTScsIHUn4YSQJyksCiAgICAoMHgzMjZDLCAnTScsIHUn4YSRJyksCiAgICAoMHgzMjZELCAnTScsIHUn4YSSJyksCiAgICAoMHgzMjZFLCAnTScsIHUn6rCAJyksCiAgICAoMHgzMjZGLCAnTScsIHUn64KYJyksCiAgICBdCgpkZWYgX3NlZ18zMSgpOgogICAgcmV0dXJuIFsKICAgICgweDMyNzAsICdNJywgdSfri6QnKSwKICAgICgweDMyNzEsICdNJywgdSfrnbwnKSwKICAgICgweDMyNzIsICdNJywgdSfrp4gnKSwKICAgICgweDMyNzMsICdNJywgdSfrsJQnKSwKICAgICgweDMyNzQsICdNJywgdSfsgqwnKSwKICAgICgweDMyNzUsICdNJywgdSfslYQnKSwKICAgICgweDMyNzYsICdNJywgdSfsnpAnKSwKICAgICgweDMyNzcsICdNJywgdSfssKgnKSwKICAgICgweDMyNzgsICdNJywgdSfsubQnKSwKICAgICgweDMyNzksICdNJywgdSftg4AnKSwKICAgICgweDMyN0EsICdNJywgdSftjIwnKSwKICAgICgweDMyN0IsICdNJywgdSftlZgnKSwKICAgICgweDMyN0MsICdNJywgdSfssLjqs6AnKSwKICAgICgweDMyN0QsICdNJywgdSfso7zsnZgnKSwKICAgICgweDMyN0UsICdNJywgdSfsmrAnKSwKICAgICgweDMyN0YsICdWJyksCiAgICAoMHgzMjgwLCAnTScsIHUn5LiAJyksCiAgICAoMHgzMjgxLCAnTScsIHUn5LqMJyksCiAgICAoMHgzMjgyLCAnTScsIHUn5LiJJyksCiAgICAoMHgzMjgzLCAnTScsIHUn5ZubJyksCiAgICAoMHgzMjg0LCAnTScsIHUn5LqUJyksCiAgICAoMHgzMjg1LCAnTScsIHUn5YWtJyksCiAgICAoMHgzMjg2LCAnTScsIHUn5LiDJyksCiAgICAoMHgzMjg3LCAnTScsIHUn5YWrJyksCiAgICAoMHgzMjg4LCAnTScsIHUn5LmdJyksCiAgICAoMHgzMjg5LCAnTScsIHUn5Y2BJyksCiAgICAoMHgzMjhBLCAnTScsIHUn5pyIJyksCiAgICAoMHgzMjhCLCAnTScsIHUn54GrJyksCiAgICAoMHgzMjhDLCAnTScsIHUn5rC0JyksCiAgICAoMHgzMjhELCAnTScsIHUn5pyoJyksCiAgICAoMHgzMjhFLCAnTScsIHUn6YeRJyksCiAgICAoMHgzMjhGLCAnTScsIHUn5ZyfJyksCiAgICAoMHgzMjkwLCAnTScsIHUn5pelJyksCiAgICAoMHgzMjkxLCAnTScsIHUn5qCqJyksCiAgICAoMHgzMjkyLCAnTScsIHUn5pyJJyksCiAgICAoMHgzMjkzLCAnTScsIHUn56S+JyksCiAgICAoMHgzMjk0LCAnTScsIHUn5ZCNJyksCiAgICAoMHgzMjk1LCAnTScsIHUn54m5JyksCiAgICAoMHgzMjk2LCAnTScsIHUn6LKhJyksCiAgICAoMHgzMjk3LCAnTScsIHUn56WdJyksCiAgICAoMHgzMjk4LCAnTScsIHUn5Yq0JyksCiAgICAoMHgzMjk5LCAnTScsIHUn56eYJyksCiAgICAoMHgzMjlBLCAnTScsIHUn55S3JyksCiAgICAoMHgzMjlCLCAnTScsIHUn5aWzJyksCiAgICAoMHgzMjlDLCAnTScsIHUn6YGpJyksCiAgICAoMHgzMjlELCAnTScsIHUn5YSqJyksCiAgICAoMHgzMjlFLCAnTScsIHUn5Y2wJyksCiAgICAoMHgzMjlGLCAnTScsIHUn5rOoJyksCiAgICAoMHgzMkEwLCAnTScsIHUn6aCFJyksCiAgICAoMHgzMkExLCAnTScsIHUn5LyRJyksCiAgICAoMHgzMkEyLCAnTScsIHUn5YaZJyksCiAgICAoMHgzMkEzLCAnTScsIHUn5q2jJyksCiAgICAoMHgzMkE0LCAnTScsIHUn5LiKJyksCiAgICAoMHgzMkE1LCAnTScsIHUn5LitJyksCiAgICAoMHgzMkE2LCAnTScsIHUn5LiLJyksCiAgICAoMHgzMkE3LCAnTScsIHUn5bemJyksCiAgICAoMHgzMkE4LCAnTScsIHUn5Y+zJyksCiAgICAoMHgzMkE5LCAnTScsIHUn5Yy7JyksCiAgICAoMHgzMkFBLCAnTScsIHUn5a6XJyksCiAgICAoMHgzMkFCLCAnTScsIHUn5a2mJyksCiAgICAoMHgzMkFDLCAnTScsIHUn55ujJyksCiAgICAoMHgzMkFELCAnTScsIHUn5LyBJyksCiAgICAoMHgzMkFFLCAnTScsIHUn6LOHJyksCiAgICAoMHgzMkFGLCAnTScsIHUn5Y2UJyksCiAgICAoMHgzMkIwLCAnTScsIHUn5aScJyksCiAgICAoMHgzMkIxLCAnTScsIHUnMzYnKSwKICAgICgweDMyQjIsICdNJywgdSczNycpLAogICAgKDB4MzJCMywgJ00nLCB1JzM4JyksCiAgICAoMHgzMkI0LCAnTScsIHUnMzknKSwKICAgICgweDMyQjUsICdNJywgdSc0MCcpLAogICAgKDB4MzJCNiwgJ00nLCB1JzQxJyksCiAgICAoMHgzMkI3LCAnTScsIHUnNDInKSwKICAgICgweDMyQjgsICdNJywgdSc0MycpLAogICAgKDB4MzJCOSwgJ00nLCB1JzQ0JyksCiAgICAoMHgzMkJBLCAnTScsIHUnNDUnKSwKICAgICgweDMyQkIsICdNJywgdSc0NicpLAogICAgKDB4MzJCQywgJ00nLCB1JzQ3JyksCiAgICAoMHgzMkJELCAnTScsIHUnNDgnKSwKICAgICgweDMyQkUsICdNJywgdSc0OScpLAogICAgKDB4MzJCRiwgJ00nLCB1JzUwJyksCiAgICAoMHgzMkMwLCAnTScsIHUnMeaciCcpLAogICAgKDB4MzJDMSwgJ00nLCB1JzLmnIgnKSwKICAgICgweDMyQzIsICdNJywgdScz5pyIJyksCiAgICAoMHgzMkMzLCAnTScsIHUnNOaciCcpLAogICAgKDB4MzJDNCwgJ00nLCB1JzXmnIgnKSwKICAgICgweDMyQzUsICdNJywgdSc25pyIJyksCiAgICAoMHgzMkM2LCAnTScsIHUnN+aciCcpLAogICAgKDB4MzJDNywgJ00nLCB1JzjmnIgnKSwKICAgICgweDMyQzgsICdNJywgdSc55pyIJyksCiAgICAoMHgzMkM5LCAnTScsIHUnMTDmnIgnKSwKICAgICgweDMyQ0EsICdNJywgdScxMeaciCcpLAogICAgKDB4MzJDQiwgJ00nLCB1JzEy5pyIJyksCiAgICAoMHgzMkNDLCAnTScsIHUnaGcnKSwKICAgICgweDMyQ0QsICdNJywgdSdlcmcnKSwKICAgICgweDMyQ0UsICdNJywgdSdldicpLAogICAgKDB4MzJDRiwgJ00nLCB1J2x0ZCcpLAogICAgKDB4MzJEMCwgJ00nLCB1J+OCoicpLAogICAgKDB4MzJEMSwgJ00nLCB1J+OCpCcpLAogICAgKDB4MzJEMiwgJ00nLCB1J+OCpicpLAogICAgKDB4MzJEMywgJ00nLCB1J+OCqCcpLAogICAgXQoKZGVmIF9zZWdfMzIoKToKICAgIHJldHVybiBbCiAgICAoMHgzMkQ0LCAnTScsIHUn44KqJyksCiAgICAoMHgzMkQ1LCAnTScsIHUn44KrJyksCiAgICAoMHgzMkQ2LCAnTScsIHUn44KtJyksCiAgICAoMHgzMkQ3LCAnTScsIHUn44KvJyksCiAgICAoMHgzMkQ4LCAnTScsIHUn44KxJyksCiAgICAoMHgzMkQ5LCAnTScsIHUn44KzJyksCiAgICAoMHgzMkRBLCAnTScsIHUn44K1JyksCiAgICAoMHgzMkRCLCAnTScsIHUn44K3JyksCiAgICAoMHgzMkRDLCAnTScsIHUn44K5JyksCiAgICAoMHgzMkRELCAnTScsIHUn44K7JyksCiAgICAoMHgzMkRFLCAnTScsIHUn44K9JyksCiAgICAoMHgzMkRGLCAnTScsIHUn44K/JyksCiAgICAoMHgzMkUwLCAnTScsIHUn44OBJyksCiAgICAoMHgzMkUxLCAnTScsIHUn44OEJyksCiAgICAoMHgzMkUyLCAnTScsIHUn44OGJyksCiAgICAoMHgzMkUzLCAnTScsIHUn44OIJyksCiAgICAoMHgzMkU0LCAnTScsIHUn44OKJyksCiAgICAoMHgzMkU1LCAnTScsIHUn44OLJyksCiAgICAoMHgzMkU2LCAnTScsIHUn44OMJyksCiAgICAoMHgzMkU3LCAnTScsIHUn44ONJyksCiAgICAoMHgzMkU4LCAnTScsIHUn44OOJyksCiAgICAoMHgzMkU5LCAnTScsIHUn44OPJyksCiAgICAoMHgzMkVBLCAnTScsIHUn44OSJyksCiAgICAoMHgzMkVCLCAnTScsIHUn44OVJyksCiAgICAoMHgzMkVDLCAnTScsIHUn44OYJyksCiAgICAoMHgzMkVELCAnTScsIHUn44ObJyksCiAgICAoMHgzMkVFLCAnTScsIHUn44OeJyksCiAgICAoMHgzMkVGLCAnTScsIHUn44OfJyksCiAgICAoMHgzMkYwLCAnTScsIHUn44OgJyksCiAgICAoMHgzMkYxLCAnTScsIHUn44OhJyksCiAgICAoMHgzMkYyLCAnTScsIHUn44OiJyksCiAgICAoMHgzMkYzLCAnTScsIHUn44OkJyksCiAgICAoMHgzMkY0LCAnTScsIHUn44OmJyksCiAgICAoMHgzMkY1LCAnTScsIHUn44OoJyksCiAgICAoMHgzMkY2LCAnTScsIHUn44OpJyksCiAgICAoMHgzMkY3LCAnTScsIHUn44OqJyksCiAgICAoMHgzMkY4LCAnTScsIHUn44OrJyksCiAgICAoMHgzMkY5LCAnTScsIHUn44OsJyksCiAgICAoMHgzMkZBLCAnTScsIHUn44OtJyksCiAgICAoMHgzMkZCLCAnTScsIHUn44OvJyksCiAgICAoMHgzMkZDLCAnTScsIHUn44OwJyksCiAgICAoMHgzMkZELCAnTScsIHUn44OxJyksCiAgICAoMHgzMkZFLCAnTScsIHUn44OyJyksCiAgICAoMHgzMkZGLCAnWCcpLAogICAgKDB4MzMwMCwgJ00nLCB1J+OCouODkeODvOODiCcpLAogICAgKDB4MzMwMSwgJ00nLCB1J+OCouODq+ODleOCoScpLAogICAgKDB4MzMwMiwgJ00nLCB1J+OCouODs+ODmuOCoicpLAogICAgKDB4MzMwMywgJ00nLCB1J+OCouODvOODqycpLAogICAgKDB4MzMwNCwgJ00nLCB1J+OCpOODi+ODs+OCsCcpLAogICAgKDB4MzMwNSwgJ00nLCB1J+OCpOODs+ODgScpLAogICAgKDB4MzMwNiwgJ00nLCB1J+OCpuOCqeODsycpLAogICAgKDB4MzMwNywgJ00nLCB1J+OCqOOCueOCr+ODvOODiScpLAogICAgKDB4MzMwOCwgJ00nLCB1J+OCqOODvOOCq+ODvCcpLAogICAgKDB4MzMwOSwgJ00nLCB1J+OCquODs+OCuScpLAogICAgKDB4MzMwQSwgJ00nLCB1J+OCquODvOODoCcpLAogICAgKDB4MzMwQiwgJ00nLCB1J+OCq+OCpOODqicpLAogICAgKDB4MzMwQywgJ00nLCB1J+OCq+ODqeODg+ODiCcpLAogICAgKDB4MzMwRCwgJ00nLCB1J+OCq+ODreODquODvCcpLAogICAgKDB4MzMwRSwgJ00nLCB1J+OCrOODreODsycpLAogICAgKDB4MzMwRiwgJ00nLCB1J+OCrOODs+ODnicpLAogICAgKDB4MzMxMCwgJ00nLCB1J+OCruOCrCcpLAogICAgKDB4MzMxMSwgJ00nLCB1J+OCruODi+ODvCcpLAogICAgKDB4MzMxMiwgJ00nLCB1J+OCreODpeODquODvCcpLAogICAgKDB4MzMxMywgJ00nLCB1J+OCruODq+ODgOODvCcpLAogICAgKDB4MzMxNCwgJ00nLCB1J+OCreODrScpLAogICAgKDB4MzMxNSwgJ00nLCB1J+OCreODreOCsOODqeODoCcpLAogICAgKDB4MzMxNiwgJ00nLCB1J+OCreODreODoeODvOODiOODqycpLAogICAgKDB4MzMxNywgJ00nLCB1J+OCreODreODr+ODg+ODiCcpLAogICAgKDB4MzMxOCwgJ00nLCB1J+OCsOODqeODoCcpLAogICAgKDB4MzMxOSwgJ00nLCB1J+OCsOODqeODoOODiOODsycpLAogICAgKDB4MzMxQSwgJ00nLCB1J+OCr+ODq+OCvOOCpOODrScpLAogICAgKDB4MzMxQiwgJ00nLCB1J+OCr+ODreODvOODjScpLAogICAgKDB4MzMxQywgJ00nLCB1J+OCseODvOOCuScpLAogICAgKDB4MzMxRCwgJ00nLCB1J+OCs+ODq+ODiicpLAogICAgKDB4MzMxRSwgJ00nLCB1J+OCs+ODvOODnScpLAogICAgKDB4MzMxRiwgJ00nLCB1J+OCteOCpOOCr+ODqycpLAogICAgKDB4MzMyMCwgJ00nLCB1J+OCteODs+ODgeODvOODoCcpLAogICAgKDB4MzMyMSwgJ00nLCB1J+OCt+ODquODs+OCsCcpLAogICAgKDB4MzMyMiwgJ00nLCB1J+OCu+ODs+ODgScpLAogICAgKDB4MzMyMywgJ00nLCB1J+OCu+ODs+ODiCcpLAogICAgKDB4MzMyNCwgJ00nLCB1J+ODgOODvOOCuScpLAogICAgKDB4MzMyNSwgJ00nLCB1J+ODh+OCtycpLAogICAgKDB4MzMyNiwgJ00nLCB1J+ODieODqycpLAogICAgKDB4MzMyNywgJ00nLCB1J+ODiOODsycpLAogICAgKDB4MzMyOCwgJ00nLCB1J+ODiuODjicpLAogICAgKDB4MzMyOSwgJ00nLCB1J+ODjuODg+ODiCcpLAogICAgKDB4MzMyQSwgJ00nLCB1J+ODj+OCpOODhCcpLAogICAgKDB4MzMyQiwgJ00nLCB1J+ODkeODvOOCu+ODs+ODiCcpLAogICAgKDB4MzMyQywgJ00nLCB1J+ODkeODvOODhCcpLAogICAgKDB4MzMyRCwgJ00nLCB1J+ODkOODvOODrOODqycpLAogICAgKDB4MzMyRSwgJ00nLCB1J+ODlOOCouOCueODiOODqycpLAogICAgKDB4MzMyRiwgJ00nLCB1J+ODlOOCr+ODqycpLAogICAgKDB4MzMzMCwgJ00nLCB1J+ODlOOCsycpLAogICAgKDB4MzMzMSwgJ00nLCB1J+ODk+ODqycpLAogICAgKDB4MzMzMiwgJ00nLCB1J+ODleOCoeODqeODg+ODiScpLAogICAgKDB4MzMzMywgJ00nLCB1J+ODleOCo+ODvOODiCcpLAogICAgKDB4MzMzNCwgJ00nLCB1J+ODluODg+OCt+OCp+ODqycpLAogICAgKDB4MzMzNSwgJ00nLCB1J+ODleODqeODsycpLAogICAgKDB4MzMzNiwgJ00nLCB1J+ODmOOCr+OCv+ODvOODqycpLAogICAgKDB4MzMzNywgJ00nLCB1J+ODmuOCvScpLAogICAgXQoKZGVmIF9zZWdfMzMoKToKICAgIHJldHVybiBbCiAgICAoMHgzMzM4LCAnTScsIHUn44Oa44OL44OSJyksCiAgICAoMHgzMzM5LCAnTScsIHUn44OY44Or44OEJyksCiAgICAoMHgzMzNBLCAnTScsIHUn44Oa44Oz44K5JyksCiAgICAoMHgzMzNCLCAnTScsIHUn44Oa44O844K4JyksCiAgICAoMHgzMzNDLCAnTScsIHUn44OZ44O844K/JyksCiAgICAoMHgzMzNELCAnTScsIHUn44Od44Kk44Oz44OIJyksCiAgICAoMHgzMzNFLCAnTScsIHUn44Oc44Or44OIJyksCiAgICAoMHgzMzNGLCAnTScsIHUn44Ob44OzJyksCiAgICAoMHgzMzQwLCAnTScsIHUn44Od44Oz44OJJyksCiAgICAoMHgzMzQxLCAnTScsIHUn44Ob44O844OrJyksCiAgICAoMHgzMzQyLCAnTScsIHUn44Ob44O844OzJyksCiAgICAoMHgzMzQzLCAnTScsIHUn44Oe44Kk44Kv44OtJyksCiAgICAoMHgzMzQ0LCAnTScsIHUn44Oe44Kk44OrJyksCiAgICAoMHgzMzQ1LCAnTScsIHUn44Oe44OD44OPJyksCiAgICAoMHgzMzQ2LCAnTScsIHUn44Oe44Or44KvJyksCiAgICAoMHgzMzQ3LCAnTScsIHUn44Oe44Oz44K344On44OzJyksCiAgICAoMHgzMzQ4LCAnTScsIHUn44Of44Kv44Ot44OzJyksCiAgICAoMHgzMzQ5LCAnTScsIHUn44Of44OqJyksCiAgICAoMHgzMzRBLCAnTScsIHUn44Of44Oq44OQ44O844OrJyksCiAgICAoMHgzMzRCLCAnTScsIHUn44Oh44KsJyksCiAgICAoMHgzMzRDLCAnTScsIHUn44Oh44Ks44OI44OzJyksCiAgICAoMHgzMzRELCAnTScsIHUn44Oh44O844OI44OrJyksCiAgICAoMHgzMzRFLCAnTScsIHUn44Ok44O844OJJyksCiAgICAoMHgzMzRGLCAnTScsIHUn44Ok44O844OrJyksCiAgICAoMHgzMzUwLCAnTScsIHUn44Om44Ki44OzJyksCiAgICAoMHgzMzUxLCAnTScsIHUn44Oq44OD44OI44OrJyksCiAgICAoMHgzMzUyLCAnTScsIHUn44Oq44OpJyksCiAgICAoMHgzMzUzLCAnTScsIHUn44Or44OU44O8JyksCiAgICAoMHgzMzU0LCAnTScsIHUn44Or44O844OW44OrJyksCiAgICAoMHgzMzU1LCAnTScsIHUn44Os44OgJyksCiAgICAoMHgzMzU2LCAnTScsIHUn44Os44Oz44OI44Ky44OzJyksCiAgICAoMHgzMzU3LCAnTScsIHUn44Ov44OD44OIJyksCiAgICAoMHgzMzU4LCAnTScsIHUnMOeCuScpLAogICAgKDB4MzM1OSwgJ00nLCB1JzHngrknKSwKICAgICgweDMzNUEsICdNJywgdScy54K5JyksCiAgICAoMHgzMzVCLCAnTScsIHUnM+eCuScpLAogICAgKDB4MzM1QywgJ00nLCB1JzTngrknKSwKICAgICgweDMzNUQsICdNJywgdSc154K5JyksCiAgICAoMHgzMzVFLCAnTScsIHUnNueCuScpLAogICAgKDB4MzM1RiwgJ00nLCB1JzfngrknKSwKICAgICgweDMzNjAsICdNJywgdSc454K5JyksCiAgICAoMHgzMzYxLCAnTScsIHUnOeeCuScpLAogICAgKDB4MzM2MiwgJ00nLCB1JzEw54K5JyksCiAgICAoMHgzMzYzLCAnTScsIHUnMTHngrknKSwKICAgICgweDMzNjQsICdNJywgdScxMueCuScpLAogICAgKDB4MzM2NSwgJ00nLCB1JzEz54K5JyksCiAgICAoMHgzMzY2LCAnTScsIHUnMTTngrknKSwKICAgICgweDMzNjcsICdNJywgdScxNeeCuScpLAogICAgKDB4MzM2OCwgJ00nLCB1JzE254K5JyksCiAgICAoMHgzMzY5LCAnTScsIHUnMTfngrknKSwKICAgICgweDMzNkEsICdNJywgdScxOOeCuScpLAogICAgKDB4MzM2QiwgJ00nLCB1JzE554K5JyksCiAgICAoMHgzMzZDLCAnTScsIHUnMjDngrknKSwKICAgICgweDMzNkQsICdNJywgdScyMeeCuScpLAogICAgKDB4MzM2RSwgJ00nLCB1JzIy54K5JyksCiAgICAoMHgzMzZGLCAnTScsIHUnMjPngrknKSwKICAgICgweDMzNzAsICdNJywgdScyNOeCuScpLAogICAgKDB4MzM3MSwgJ00nLCB1J2hwYScpLAogICAgKDB4MzM3MiwgJ00nLCB1J2RhJyksCiAgICAoMHgzMzczLCAnTScsIHUnYXUnKSwKICAgICgweDMzNzQsICdNJywgdSdiYXInKSwKICAgICgweDMzNzUsICdNJywgdSdvdicpLAogICAgKDB4MzM3NiwgJ00nLCB1J3BjJyksCiAgICAoMHgzMzc3LCAnTScsIHUnZG0nKSwKICAgICgweDMzNzgsICdNJywgdSdkbTInKSwKICAgICgweDMzNzksICdNJywgdSdkbTMnKSwKICAgICgweDMzN0EsICdNJywgdSdpdScpLAogICAgKDB4MzM3QiwgJ00nLCB1J+W5s+aIkCcpLAogICAgKDB4MzM3QywgJ00nLCB1J+aYreWSjCcpLAogICAgKDB4MzM3RCwgJ00nLCB1J+Wkp+atoycpLAogICAgKDB4MzM3RSwgJ00nLCB1J+aYjuayuycpLAogICAgKDB4MzM3RiwgJ00nLCB1J+agquW8j+S8muekvicpLAogICAgKDB4MzM4MCwgJ00nLCB1J3BhJyksCiAgICAoMHgzMzgxLCAnTScsIHUnbmEnKSwKICAgICgweDMzODIsICdNJywgdSfOvGEnKSwKICAgICgweDMzODMsICdNJywgdSdtYScpLAogICAgKDB4MzM4NCwgJ00nLCB1J2thJyksCiAgICAoMHgzMzg1LCAnTScsIHUna2InKSwKICAgICgweDMzODYsICdNJywgdSdtYicpLAogICAgKDB4MzM4NywgJ00nLCB1J2diJyksCiAgICAoMHgzMzg4LCAnTScsIHUnY2FsJyksCiAgICAoMHgzMzg5LCAnTScsIHUna2NhbCcpLAogICAgKDB4MzM4QSwgJ00nLCB1J3BmJyksCiAgICAoMHgzMzhCLCAnTScsIHUnbmYnKSwKICAgICgweDMzOEMsICdNJywgdSfOvGYnKSwKICAgICgweDMzOEQsICdNJywgdSfOvGcnKSwKICAgICgweDMzOEUsICdNJywgdSdtZycpLAogICAgKDB4MzM4RiwgJ00nLCB1J2tnJyksCiAgICAoMHgzMzkwLCAnTScsIHUnaHonKSwKICAgICgweDMzOTEsICdNJywgdSdraHonKSwKICAgICgweDMzOTIsICdNJywgdSdtaHonKSwKICAgICgweDMzOTMsICdNJywgdSdnaHonKSwKICAgICgweDMzOTQsICdNJywgdSd0aHonKSwKICAgICgweDMzOTUsICdNJywgdSfOvGwnKSwKICAgICgweDMzOTYsICdNJywgdSdtbCcpLAogICAgKDB4MzM5NywgJ00nLCB1J2RsJyksCiAgICAoMHgzMzk4LCAnTScsIHUna2wnKSwKICAgICgweDMzOTksICdNJywgdSdmbScpLAogICAgKDB4MzM5QSwgJ00nLCB1J25tJyksCiAgICAoMHgzMzlCLCAnTScsIHUnzrxtJyksCiAgICBdCgpkZWYgX3NlZ18zNCgpOgogICAgcmV0dXJuIFsKICAgICgweDMzOUMsICdNJywgdSdtbScpLAogICAgKDB4MzM5RCwgJ00nLCB1J2NtJyksCiAgICAoMHgzMzlFLCAnTScsIHUna20nKSwKICAgICgweDMzOUYsICdNJywgdSdtbTInKSwKICAgICgweDMzQTAsICdNJywgdSdjbTInKSwKICAgICgweDMzQTEsICdNJywgdSdtMicpLAogICAgKDB4MzNBMiwgJ00nLCB1J2ttMicpLAogICAgKDB4MzNBMywgJ00nLCB1J21tMycpLAogICAgKDB4MzNBNCwgJ00nLCB1J2NtMycpLAogICAgKDB4MzNBNSwgJ00nLCB1J20zJyksCiAgICAoMHgzM0E2LCAnTScsIHUna20zJyksCiAgICAoMHgzM0E3LCAnTScsIHUnbeKIlXMnKSwKICAgICgweDMzQTgsICdNJywgdSdt4oiVczInKSwKICAgICgweDMzQTksICdNJywgdSdwYScpLAogICAgKDB4MzNBQSwgJ00nLCB1J2twYScpLAogICAgKDB4MzNBQiwgJ00nLCB1J21wYScpLAogICAgKDB4MzNBQywgJ00nLCB1J2dwYScpLAogICAgKDB4MzNBRCwgJ00nLCB1J3JhZCcpLAogICAgKDB4MzNBRSwgJ00nLCB1J3JhZOKIlXMnKSwKICAgICgweDMzQUYsICdNJywgdSdyYWTiiJVzMicpLAogICAgKDB4MzNCMCwgJ00nLCB1J3BzJyksCiAgICAoMHgzM0IxLCAnTScsIHUnbnMnKSwKICAgICgweDMzQjIsICdNJywgdSfOvHMnKSwKICAgICgweDMzQjMsICdNJywgdSdtcycpLAogICAgKDB4MzNCNCwgJ00nLCB1J3B2JyksCiAgICAoMHgzM0I1LCAnTScsIHUnbnYnKSwKICAgICgweDMzQjYsICdNJywgdSfOvHYnKSwKICAgICgweDMzQjcsICdNJywgdSdtdicpLAogICAgKDB4MzNCOCwgJ00nLCB1J2t2JyksCiAgICAoMHgzM0I5LCAnTScsIHUnbXYnKSwKICAgICgweDMzQkEsICdNJywgdSdwdycpLAogICAgKDB4MzNCQiwgJ00nLCB1J253JyksCiAgICAoMHgzM0JDLCAnTScsIHUnzrx3JyksCiAgICAoMHgzM0JELCAnTScsIHUnbXcnKSwKICAgICgweDMzQkUsICdNJywgdSdrdycpLAogICAgKDB4MzNCRiwgJ00nLCB1J213JyksCiAgICAoMHgzM0MwLCAnTScsIHUna8+JJyksCiAgICAoMHgzM0MxLCAnTScsIHUnbc+JJyksCiAgICAoMHgzM0MyLCAnWCcpLAogICAgKDB4MzNDMywgJ00nLCB1J2JxJyksCiAgICAoMHgzM0M0LCAnTScsIHUnY2MnKSwKICAgICgweDMzQzUsICdNJywgdSdjZCcpLAogICAgKDB4MzNDNiwgJ00nLCB1J2PiiJVrZycpLAogICAgKDB4MzNDNywgJ1gnKSwKICAgICgweDMzQzgsICdNJywgdSdkYicpLAogICAgKDB4MzNDOSwgJ00nLCB1J2d5JyksCiAgICAoMHgzM0NBLCAnTScsIHUnaGEnKSwKICAgICgweDMzQ0IsICdNJywgdSdocCcpLAogICAgKDB4MzNDQywgJ00nLCB1J2luJyksCiAgICAoMHgzM0NELCAnTScsIHUna2snKSwKICAgICgweDMzQ0UsICdNJywgdSdrbScpLAogICAgKDB4MzNDRiwgJ00nLCB1J2t0JyksCiAgICAoMHgzM0QwLCAnTScsIHUnbG0nKSwKICAgICgweDMzRDEsICdNJywgdSdsbicpLAogICAgKDB4MzNEMiwgJ00nLCB1J2xvZycpLAogICAgKDB4MzNEMywgJ00nLCB1J2x4JyksCiAgICAoMHgzM0Q0LCAnTScsIHUnbWInKSwKICAgICgweDMzRDUsICdNJywgdSdtaWwnKSwKICAgICgweDMzRDYsICdNJywgdSdtb2wnKSwKICAgICgweDMzRDcsICdNJywgdSdwaCcpLAogICAgKDB4MzNEOCwgJ1gnKSwKICAgICgweDMzRDksICdNJywgdSdwcG0nKSwKICAgICgweDMzREEsICdNJywgdSdwcicpLAogICAgKDB4MzNEQiwgJ00nLCB1J3NyJyksCiAgICAoMHgzM0RDLCAnTScsIHUnc3YnKSwKICAgICgweDMzREQsICdNJywgdSd3YicpLAogICAgKDB4MzNERSwgJ00nLCB1J3biiJVtJyksCiAgICAoMHgzM0RGLCAnTScsIHUnYeKIlW0nKSwKICAgICgweDMzRTAsICdNJywgdScx5pelJyksCiAgICAoMHgzM0UxLCAnTScsIHUnMuaXpScpLAogICAgKDB4MzNFMiwgJ00nLCB1JzPml6UnKSwKICAgICgweDMzRTMsICdNJywgdSc05pelJyksCiAgICAoMHgzM0U0LCAnTScsIHUnNeaXpScpLAogICAgKDB4MzNFNSwgJ00nLCB1Jzbml6UnKSwKICAgICgweDMzRTYsICdNJywgdSc35pelJyksCiAgICAoMHgzM0U3LCAnTScsIHUnOOaXpScpLAogICAgKDB4MzNFOCwgJ00nLCB1Jznml6UnKSwKICAgICgweDMzRTksICdNJywgdScxMOaXpScpLAogICAgKDB4MzNFQSwgJ00nLCB1JzEx5pelJyksCiAgICAoMHgzM0VCLCAnTScsIHUnMTLml6UnKSwKICAgICgweDMzRUMsICdNJywgdScxM+aXpScpLAogICAgKDB4MzNFRCwgJ00nLCB1JzE05pelJyksCiAgICAoMHgzM0VFLCAnTScsIHUnMTXml6UnKSwKICAgICgweDMzRUYsICdNJywgdScxNuaXpScpLAogICAgKDB4MzNGMCwgJ00nLCB1JzE35pelJyksCiAgICAoMHgzM0YxLCAnTScsIHUnMTjml6UnKSwKICAgICgweDMzRjIsICdNJywgdScxOeaXpScpLAogICAgKDB4MzNGMywgJ00nLCB1JzIw5pelJyksCiAgICAoMHgzM0Y0LCAnTScsIHUnMjHml6UnKSwKICAgICgweDMzRjUsICdNJywgdScyMuaXpScpLAogICAgKDB4MzNGNiwgJ00nLCB1JzIz5pelJyksCiAgICAoMHgzM0Y3LCAnTScsIHUnMjTml6UnKSwKICAgICgweDMzRjgsICdNJywgdScyNeaXpScpLAogICAgKDB4MzNGOSwgJ00nLCB1JzI25pelJyksCiAgICAoMHgzM0ZBLCAnTScsIHUnMjfml6UnKSwKICAgICgweDMzRkIsICdNJywgdScyOOaXpScpLAogICAgKDB4MzNGQywgJ00nLCB1JzI55pelJyksCiAgICAoMHgzM0ZELCAnTScsIHUnMzDml6UnKSwKICAgICgweDMzRkUsICdNJywgdSczMeaXpScpLAogICAgKDB4MzNGRiwgJ00nLCB1J2dhbCcpLAogICAgXQoKZGVmIF9zZWdfMzUoKToKICAgIHJldHVybiBbCiAgICAoMHgzNDAwLCAnVicpLAogICAgKDB4NERCNiwgJ1gnKSwKICAgICgweDREQzAsICdWJyksCiAgICAoMHg5RkNELCAnWCcpLAogICAgKDB4QTAwMCwgJ1YnKSwKICAgICgweEE0OEQsICdYJyksCiAgICAoMHhBNDkwLCAnVicpLAogICAgKDB4QTRDNywgJ1gnKSwKICAgICgweEE0RDAsICdWJyksCiAgICAoMHhBNjJDLCAnWCcpLAogICAgKDB4QTY0MCwgJ00nLCB1J+qZgScpLAogICAgKDB4QTY0MSwgJ1YnKSwKICAgICgweEE2NDIsICdNJywgdSfqmYMnKSwKICAgICgweEE2NDMsICdWJyksCiAgICAoMHhBNjQ0LCAnTScsIHUn6pmFJyksCiAgICAoMHhBNjQ1LCAnVicpLAogICAgKDB4QTY0NiwgJ00nLCB1J+qZhycpLAogICAgKDB4QTY0NywgJ1YnKSwKICAgICgweEE2NDgsICdNJywgdSfqmYknKSwKICAgICgweEE2NDksICdWJyksCiAgICAoMHhBNjRBLCAnTScsIHUn6pmLJyksCiAgICAoMHhBNjRCLCAnVicpLAogICAgKDB4QTY0QywgJ00nLCB1J+qZjScpLAogICAgKDB4QTY0RCwgJ1YnKSwKICAgICgweEE2NEUsICdNJywgdSfqmY8nKSwKICAgICgweEE2NEYsICdWJyksCiAgICAoMHhBNjUwLCAnTScsIHUn6pmRJyksCiAgICAoMHhBNjUxLCAnVicpLAogICAgKDB4QTY1MiwgJ00nLCB1J+qZkycpLAogICAgKDB4QTY1MywgJ1YnKSwKICAgICgweEE2NTQsICdNJywgdSfqmZUnKSwKICAgICgweEE2NTUsICdWJyksCiAgICAoMHhBNjU2LCAnTScsIHUn6pmXJyksCiAgICAoMHhBNjU3LCAnVicpLAogICAgKDB4QTY1OCwgJ00nLCB1J+qZmScpLAogICAgKDB4QTY1OSwgJ1YnKSwKICAgICgweEE2NUEsICdNJywgdSfqmZsnKSwKICAgICgweEE2NUIsICdWJyksCiAgICAoMHhBNjVDLCAnTScsIHUn6pmdJyksCiAgICAoMHhBNjVELCAnVicpLAogICAgKDB4QTY1RSwgJ00nLCB1J+qZnycpLAogICAgKDB4QTY1RiwgJ1YnKSwKICAgICgweEE2NjAsICdNJywgdSfqmaEnKSwKICAgICgweEE2NjEsICdWJyksCiAgICAoMHhBNjYyLCAnTScsIHUn6pmjJyksCiAgICAoMHhBNjYzLCAnVicpLAogICAgKDB4QTY2NCwgJ00nLCB1J+qZpScpLAogICAgKDB4QTY2NSwgJ1YnKSwKICAgICgweEE2NjYsICdNJywgdSfqmacnKSwKICAgICgweEE2NjcsICdWJyksCiAgICAoMHhBNjY4LCAnTScsIHUn6pmpJyksCiAgICAoMHhBNjY5LCAnVicpLAogICAgKDB4QTY2QSwgJ00nLCB1J+qZqycpLAogICAgKDB4QTY2QiwgJ1YnKSwKICAgICgweEE2NkMsICdNJywgdSfqma0nKSwKICAgICgweEE2NkQsICdWJyksCiAgICAoMHhBNjgwLCAnTScsIHUn6pqBJyksCiAgICAoMHhBNjgxLCAnVicpLAogICAgKDB4QTY4MiwgJ00nLCB1J+qagycpLAogICAgKDB4QTY4MywgJ1YnKSwKICAgICgweEE2ODQsICdNJywgdSfqmoUnKSwKICAgICgweEE2ODUsICdWJyksCiAgICAoMHhBNjg2LCAnTScsIHUn6pqHJyksCiAgICAoMHhBNjg3LCAnVicpLAogICAgKDB4QTY4OCwgJ00nLCB1J+qaiScpLAogICAgKDB4QTY4OSwgJ1YnKSwKICAgICgweEE2OEEsICdNJywgdSfqmosnKSwKICAgICgweEE2OEIsICdWJyksCiAgICAoMHhBNjhDLCAnTScsIHUn6pqNJyksCiAgICAoMHhBNjhELCAnVicpLAogICAgKDB4QTY4RSwgJ00nLCB1J+qajycpLAogICAgKDB4QTY4RiwgJ1YnKSwKICAgICgweEE2OTAsICdNJywgdSfqmpEnKSwKICAgICgweEE2OTEsICdWJyksCiAgICAoMHhBNjkyLCAnTScsIHUn6pqTJyksCiAgICAoMHhBNjkzLCAnVicpLAogICAgKDB4QTY5NCwgJ00nLCB1J+qalScpLAogICAgKDB4QTY5NSwgJ1YnKSwKICAgICgweEE2OTYsICdNJywgdSfqmpcnKSwKICAgICgweEE2OTcsICdWJyksCiAgICAoMHhBNjk4LCAnWCcpLAogICAgKDB4QTY5RiwgJ1YnKSwKICAgICgweEE2RjgsICdYJyksCiAgICAoMHhBNzAwLCAnVicpLAogICAgKDB4QTcyMiwgJ00nLCB1J+qcoycpLAogICAgKDB4QTcyMywgJ1YnKSwKICAgICgweEE3MjQsICdNJywgdSfqnKUnKSwKICAgICgweEE3MjUsICdWJyksCiAgICAoMHhBNzI2LCAnTScsIHUn6pynJyksCiAgICAoMHhBNzI3LCAnVicpLAogICAgKDB4QTcyOCwgJ00nLCB1J+qcqScpLAogICAgKDB4QTcyOSwgJ1YnKSwKICAgICgweEE3MkEsICdNJywgdSfqnKsnKSwKICAgICgweEE3MkIsICdWJyksCiAgICAoMHhBNzJDLCAnTScsIHUn6pytJyksCiAgICAoMHhBNzJELCAnVicpLAogICAgKDB4QTcyRSwgJ00nLCB1J+qcrycpLAogICAgKDB4QTcyRiwgJ1YnKSwKICAgICgweEE3MzIsICdNJywgdSfqnLMnKSwKICAgICgweEE3MzMsICdWJyksCiAgICBdCgpkZWYgX3NlZ18zNigpOgogICAgcmV0dXJuIFsKICAgICgweEE3MzQsICdNJywgdSfqnLUnKSwKICAgICgweEE3MzUsICdWJyksCiAgICAoMHhBNzM2LCAnTScsIHUn6py3JyksCiAgICAoMHhBNzM3LCAnVicpLAogICAgKDB4QTczOCwgJ00nLCB1J+qcuScpLAogICAgKDB4QTczOSwgJ1YnKSwKICAgICgweEE3M0EsICdNJywgdSfqnLsnKSwKICAgICgweEE3M0IsICdWJyksCiAgICAoMHhBNzNDLCAnTScsIHUn6py9JyksCiAgICAoMHhBNzNELCAnVicpLAogICAgKDB4QTczRSwgJ00nLCB1J+qcvycpLAogICAgKDB4QTczRiwgJ1YnKSwKICAgICgweEE3NDAsICdNJywgdSfqnYEnKSwKICAgICgweEE3NDEsICdWJyksCiAgICAoMHhBNzQyLCAnTScsIHUn6p2DJyksCiAgICAoMHhBNzQzLCAnVicpLAogICAgKDB4QTc0NCwgJ00nLCB1J+qdhScpLAogICAgKDB4QTc0NSwgJ1YnKSwKICAgICgweEE3NDYsICdNJywgdSfqnYcnKSwKICAgICgweEE3NDcsICdWJyksCiAgICAoMHhBNzQ4LCAnTScsIHUn6p2JJyksCiAgICAoMHhBNzQ5LCAnVicpLAogICAgKDB4QTc0QSwgJ00nLCB1J+qdiycpLAogICAgKDB4QTc0QiwgJ1YnKSwKICAgICgweEE3NEMsICdNJywgdSfqnY0nKSwKICAgICgweEE3NEQsICdWJyksCiAgICAoMHhBNzRFLCAnTScsIHUn6p2PJyksCiAgICAoMHhBNzRGLCAnVicpLAogICAgKDB4QTc1MCwgJ00nLCB1J+qdkScpLAogICAgKDB4QTc1MSwgJ1YnKSwKICAgICgweEE3NTIsICdNJywgdSfqnZMnKSwKICAgICgweEE3NTMsICdWJyksCiAgICAoMHhBNzU0LCAnTScsIHUn6p2VJyksCiAgICAoMHhBNzU1LCAnVicpLAogICAgKDB4QTc1NiwgJ00nLCB1J+qdlycpLAogICAgKDB4QTc1NywgJ1YnKSwKICAgICgweEE3NTgsICdNJywgdSfqnZknKSwKICAgICgweEE3NTksICdWJyksCiAgICAoMHhBNzVBLCAnTScsIHUn6p2bJyksCiAgICAoMHhBNzVCLCAnVicpLAogICAgKDB4QTc1QywgJ00nLCB1J+qdnScpLAogICAgKDB4QTc1RCwgJ1YnKSwKICAgICgweEE3NUUsICdNJywgdSfqnZ8nKSwKICAgICgweEE3NUYsICdWJyksCiAgICAoMHhBNzYwLCAnTScsIHUn6p2hJyksCiAgICAoMHhBNzYxLCAnVicpLAogICAgKDB4QTc2MiwgJ00nLCB1J+qdoycpLAogICAgKDB4QTc2MywgJ1YnKSwKICAgICgweEE3NjQsICdNJywgdSfqnaUnKSwKICAgICgweEE3NjUsICdWJyksCiAgICAoMHhBNzY2LCAnTScsIHUn6p2nJyksCiAgICAoMHhBNzY3LCAnVicpLAogICAgKDB4QTc2OCwgJ00nLCB1J+qdqScpLAogICAgKDB4QTc2OSwgJ1YnKSwKICAgICgweEE3NkEsICdNJywgdSfqnasnKSwKICAgICgweEE3NkIsICdWJyksCiAgICAoMHhBNzZDLCAnTScsIHUn6p2tJyksCiAgICAoMHhBNzZELCAnVicpLAogICAgKDB4QTc2RSwgJ00nLCB1J+qdrycpLAogICAgKDB4QTc2RiwgJ1YnKSwKICAgICgweEE3NzAsICdNJywgdSfqna8nKSwKICAgICgweEE3NzEsICdWJyksCiAgICAoMHhBNzc5LCAnTScsIHUn6p26JyksCiAgICAoMHhBNzdBLCAnVicpLAogICAgKDB4QTc3QiwgJ00nLCB1J+qdvCcpLAogICAgKDB4QTc3QywgJ1YnKSwKICAgICgweEE3N0QsICdNJywgdSfhtbknKSwKICAgICgweEE3N0UsICdNJywgdSfqnb8nKSwKICAgICgweEE3N0YsICdWJyksCiAgICAoMHhBNzgwLCAnTScsIHUn6p6BJyksCiAgICAoMHhBNzgxLCAnVicpLAogICAgKDB4QTc4MiwgJ00nLCB1J+qegycpLAogICAgKDB4QTc4MywgJ1YnKSwKICAgICgweEE3ODQsICdNJywgdSfqnoUnKSwKICAgICgweEE3ODUsICdWJyksCiAgICAoMHhBNzg2LCAnTScsIHUn6p6HJyksCiAgICAoMHhBNzg3LCAnVicpLAogICAgKDB4QTc4QiwgJ00nLCB1J+qejCcpLAogICAgKDB4QTc4QywgJ1YnKSwKICAgICgweEE3OEQsICdNJywgdSfJpScpLAogICAgKDB4QTc4RSwgJ1YnKSwKICAgICgweEE3OEYsICdYJyksCiAgICAoMHhBNzkwLCAnTScsIHUn6p6RJyksCiAgICAoMHhBNzkxLCAnVicpLAogICAgKDB4QTc5MiwgJ00nLCB1J+qekycpLAogICAgKDB4QTc5MywgJ1YnKSwKICAgICgweEE3OTQsICdYJyksCiAgICAoMHhBN0EwLCAnTScsIHUn6p6hJyksCiAgICAoMHhBN0ExLCAnVicpLAogICAgKDB4QTdBMiwgJ00nLCB1J+qeoycpLAogICAgKDB4QTdBMywgJ1YnKSwKICAgICgweEE3QTQsICdNJywgdSfqnqUnKSwKICAgICgweEE3QTUsICdWJyksCiAgICAoMHhBN0E2LCAnTScsIHUn6p6nJyksCiAgICAoMHhBN0E3LCAnVicpLAogICAgKDB4QTdBOCwgJ00nLCB1J+qeqScpLAogICAgKDB4QTdBOSwgJ1YnKSwKICAgICgweEE3QUEsICdNJywgdSfJpicpLAogICAgKDB4QTdBQiwgJ1gnKSwKICAgICgweEE3RjgsICdNJywgdSfEpycpLAogICAgXQoKZGVmIF9zZWdfMzcoKToKICAgIHJldHVybiBbCiAgICAoMHhBN0Y5LCAnTScsIHUnxZMnKSwKICAgICgweEE3RkEsICdWJyksCiAgICAoMHhBODJDLCAnWCcpLAogICAgKDB4QTgzMCwgJ1YnKSwKICAgICgweEE4M0EsICdYJyksCiAgICAoMHhBODQwLCAnVicpLAogICAgKDB4QTg3OCwgJ1gnKSwKICAgICgweEE4ODAsICdWJyksCiAgICAoMHhBOEM1LCAnWCcpLAogICAgKDB4QThDRSwgJ1YnKSwKICAgICgweEE4REEsICdYJyksCiAgICAoMHhBOEUwLCAnVicpLAogICAgKDB4QThGQywgJ1gnKSwKICAgICgweEE5MDAsICdWJyksCiAgICAoMHhBOTU0LCAnWCcpLAogICAgKDB4QTk1RiwgJ1YnKSwKICAgICgweEE5N0QsICdYJyksCiAgICAoMHhBOTgwLCAnVicpLAogICAgKDB4QTlDRSwgJ1gnKSwKICAgICgweEE5Q0YsICdWJyksCiAgICAoMHhBOURBLCAnWCcpLAogICAgKDB4QTlERSwgJ1YnKSwKICAgICgweEE5RTAsICdYJyksCiAgICAoMHhBQTAwLCAnVicpLAogICAgKDB4QUEzNywgJ1gnKSwKICAgICgweEFBNDAsICdWJyksCiAgICAoMHhBQTRFLCAnWCcpLAogICAgKDB4QUE1MCwgJ1YnKSwKICAgICgweEFBNUEsICdYJyksCiAgICAoMHhBQTVDLCAnVicpLAogICAgKDB4QUE3QywgJ1gnKSwKICAgICgweEFBODAsICdWJyksCiAgICAoMHhBQUMzLCAnWCcpLAogICAgKDB4QUFEQiwgJ1YnKSwKICAgICgweEFBRjcsICdYJyksCiAgICAoMHhBQjAxLCAnVicpLAogICAgKDB4QUIwNywgJ1gnKSwKICAgICgweEFCMDksICdWJyksCiAgICAoMHhBQjBGLCAnWCcpLAogICAgKDB4QUIxMSwgJ1YnKSwKICAgICgweEFCMTcsICdYJyksCiAgICAoMHhBQjIwLCAnVicpLAogICAgKDB4QUIyNywgJ1gnKSwKICAgICgweEFCMjgsICdWJyksCiAgICAoMHhBQjJGLCAnWCcpLAogICAgKDB4QUJDMCwgJ1YnKSwKICAgICgweEFCRUUsICdYJyksCiAgICAoMHhBQkYwLCAnVicpLAogICAgKDB4QUJGQSwgJ1gnKSwKICAgICgweEFDMDAsICdWJyksCiAgICAoMHhEN0E0LCAnWCcpLAogICAgKDB4RDdCMCwgJ1YnKSwKICAgICgweEQ3QzcsICdYJyksCiAgICAoMHhEN0NCLCAnVicpLAogICAgKDB4RDdGQywgJ1gnKSwKICAgICgweEY5MDAsICdNJywgdSfosYgnKSwKICAgICgweEY5MDEsICdNJywgdSfmm7QnKSwKICAgICgweEY5MDIsICdNJywgdSfou4onKSwKICAgICgweEY5MDMsICdNJywgdSfos4gnKSwKICAgICgweEY5MDQsICdNJywgdSfmu5EnKSwKICAgICgweEY5MDUsICdNJywgdSfkuLInKSwKICAgICgweEY5MDYsICdNJywgdSflj6UnKSwKICAgICgweEY5MDcsICdNJywgdSfpvpwnKSwKICAgICgweEY5MDksICdNJywgdSflpZEnKSwKICAgICgweEY5MEEsICdNJywgdSfph5EnKSwKICAgICgweEY5MEIsICdNJywgdSfllocnKSwKICAgICgweEY5MEMsICdNJywgdSflpYgnKSwKICAgICgweEY5MEQsICdNJywgdSfmh7YnKSwKICAgICgweEY5MEUsICdNJywgdSfnmaknKSwKICAgICgweEY5MEYsICdNJywgdSfnvoUnKSwKICAgICgweEY5MTAsICdNJywgdSfomL8nKSwKICAgICgweEY5MTEsICdNJywgdSfonronKSwKICAgICgweEY5MTIsICdNJywgdSfoo7gnKSwKICAgICgweEY5MTMsICdNJywgdSfpgo8nKSwKICAgICgweEY5MTQsICdNJywgdSfmqIInKSwKICAgICgweEY5MTUsICdNJywgdSfmtJsnKSwKICAgICgweEY5MTYsICdNJywgdSfng5knKSwKICAgICgweEY5MTcsICdNJywgdSfnj54nKSwKICAgICgweEY5MTgsICdNJywgdSfokL0nKSwKICAgICgweEY5MTksICdNJywgdSfphaonKSwKICAgICgweEY5MUEsICdNJywgdSfpp7EnKSwKICAgICgweEY5MUIsICdNJywgdSfkuoInKSwKICAgICgweEY5MUMsICdNJywgdSfljbUnKSwKICAgICgweEY5MUQsICdNJywgdSfmrIQnKSwKICAgICgweEY5MUUsICdNJywgdSfniJsnKSwKICAgICgweEY5MUYsICdNJywgdSfomK0nKSwKICAgICgweEY5MjAsICdNJywgdSfpuJ4nKSwKICAgICgweEY5MjEsICdNJywgdSfltZAnKSwKICAgICgweEY5MjIsICdNJywgdSfmv6snKSwKICAgICgweEY5MjMsICdNJywgdSfol40nKSwKICAgICgweEY5MjQsICdNJywgdSfopaQnKSwKICAgICgweEY5MjUsICdNJywgdSfmi4knKSwKICAgICgweEY5MjYsICdNJywgdSfoh5gnKSwKICAgICgweEY5MjcsICdNJywgdSfooJ8nKSwKICAgICgweEY5MjgsICdNJywgdSflu4onKSwKICAgICgweEY5MjksICdNJywgdSfmnJcnKSwKICAgICgweEY5MkEsICdNJywgdSfmtaonKSwKICAgICgweEY5MkIsICdNJywgdSfni7wnKSwKICAgICgweEY5MkMsICdNJywgdSfpg44nKSwKICAgICgweEY5MkQsICdNJywgdSfkvoYnKSwKICAgIF0KCmRlZiBfc2VnXzM4KCk6CiAgICByZXR1cm4gWwogICAgKDB4RjkyRSwgJ00nLCB1J+WGtycpLAogICAgKDB4RjkyRiwgJ00nLCB1J+WLnicpLAogICAgKDB4RjkzMCwgJ00nLCB1J+aThCcpLAogICAgKDB4RjkzMSwgJ00nLCB1J+arkycpLAogICAgKDB4RjkzMiwgJ00nLCB1J+eIkCcpLAogICAgKDB4RjkzMywgJ00nLCB1J+ebpycpLAogICAgKDB4RjkzNCwgJ00nLCB1J+iAgScpLAogICAgKDB4RjkzNSwgJ00nLCB1J+iYhicpLAogICAgKDB4RjkzNiwgJ00nLCB1J+iZnCcpLAogICAgKDB4RjkzNywgJ00nLCB1J+i3rycpLAogICAgKDB4RjkzOCwgJ00nLCB1J+mcsicpLAogICAgKDB4RjkzOSwgJ00nLCB1J+mtrycpLAogICAgKDB4RjkzQSwgJ00nLCB1J+m3uicpLAogICAgKDB4RjkzQiwgJ00nLCB1J+eijCcpLAogICAgKDB4RjkzQywgJ00nLCB1J+elvycpLAogICAgKDB4RjkzRCwgJ00nLCB1J+e2oCcpLAogICAgKDB4RjkzRSwgJ00nLCB1J+iPiScpLAogICAgKDB4RjkzRiwgJ00nLCB1J+mMhCcpLAogICAgKDB4Rjk0MCwgJ00nLCB1J+m5vycpLAogICAgKDB4Rjk0MSwgJ00nLCB1J+irlicpLAogICAgKDB4Rjk0MiwgJ00nLCB1J+WjnycpLAogICAgKDB4Rjk0MywgJ00nLCB1J+W8hCcpLAogICAgKDB4Rjk0NCwgJ00nLCB1J+exoCcpLAogICAgKDB4Rjk0NSwgJ00nLCB1J+iBvicpLAogICAgKDB4Rjk0NiwgJ00nLCB1J+eJoicpLAogICAgKDB4Rjk0NywgJ00nLCB1J+ejiicpLAogICAgKDB4Rjk0OCwgJ00nLCB1J+izgicpLAogICAgKDB4Rjk0OSwgJ00nLCB1J+mbtycpLAogICAgKDB4Rjk0QSwgJ00nLCB1J+WjmCcpLAogICAgKDB4Rjk0QiwgJ00nLCB1J+WxoicpLAogICAgKDB4Rjk0QywgJ00nLCB1J+aokycpLAogICAgKDB4Rjk0RCwgJ00nLCB1J+a3micpLAogICAgKDB4Rjk0RSwgJ00nLCB1J+a8jycpLAogICAgKDB4Rjk0RiwgJ00nLCB1J+e0rycpLAogICAgKDB4Rjk1MCwgJ00nLCB1J+e4tycpLAogICAgKDB4Rjk1MSwgJ00nLCB1J+mZiycpLAogICAgKDB4Rjk1MiwgJ00nLCB1J+WLkicpLAogICAgKDB4Rjk1MywgJ00nLCB1J+iCiycpLAogICAgKDB4Rjk1NCwgJ00nLCB1J+WHnCcpLAogICAgKDB4Rjk1NSwgJ00nLCB1J+WHjCcpLAogICAgKDB4Rjk1NiwgJ00nLCB1J+eonCcpLAogICAgKDB4Rjk1NywgJ00nLCB1J+e2vicpLAogICAgKDB4Rjk1OCwgJ00nLCB1J+iPsScpLAogICAgKDB4Rjk1OSwgJ00nLCB1J+mZtScpLAogICAgKDB4Rjk1QSwgJ00nLCB1J+iugCcpLAogICAgKDB4Rjk1QiwgJ00nLCB1J+aLjycpLAogICAgKDB4Rjk1QywgJ00nLCB1J+aogicpLAogICAgKDB4Rjk1RCwgJ00nLCB1J+irvicpLAogICAgKDB4Rjk1RSwgJ00nLCB1J+S4uScpLAogICAgKDB4Rjk1RiwgJ00nLCB1J+WvpycpLAogICAgKDB4Rjk2MCwgJ00nLCB1J+aAkicpLAogICAgKDB4Rjk2MSwgJ00nLCB1J+eOhycpLAogICAgKDB4Rjk2MiwgJ00nLCB1J+eVsCcpLAogICAgKDB4Rjk2MywgJ00nLCB1J+WMlycpLAogICAgKDB4Rjk2NCwgJ00nLCB1J+ejuycpLAogICAgKDB4Rjk2NSwgJ00nLCB1J+S+vycpLAogICAgKDB4Rjk2NiwgJ00nLCB1J+W+qScpLAogICAgKDB4Rjk2NywgJ00nLCB1J+S4jScpLAogICAgKDB4Rjk2OCwgJ00nLCB1J+azjCcpLAogICAgKDB4Rjk2OSwgJ00nLCB1J+aVuCcpLAogICAgKDB4Rjk2QSwgJ00nLCB1J+e0oicpLAogICAgKDB4Rjk2QiwgJ00nLCB1J+WPgycpLAogICAgKDB4Rjk2QywgJ00nLCB1J+WhnicpLAogICAgKDB4Rjk2RCwgJ00nLCB1J+ecgScpLAogICAgKDB4Rjk2RSwgJ00nLCB1J+iRiScpLAogICAgKDB4Rjk2RiwgJ00nLCB1J+iqqicpLAogICAgKDB4Rjk3MCwgJ00nLCB1J+auuicpLAogICAgKDB4Rjk3MSwgJ00nLCB1J+i+sCcpLAogICAgKDB4Rjk3MiwgJ00nLCB1J+ayiCcpLAogICAgKDB4Rjk3MywgJ00nLCB1J+aLvicpLAogICAgKDB4Rjk3NCwgJ00nLCB1J+iLpScpLAogICAgKDB4Rjk3NSwgJ00nLCB1J+aOoCcpLAogICAgKDB4Rjk3NiwgJ00nLCB1J+eVpScpLAogICAgKDB4Rjk3NywgJ00nLCB1J+S6ricpLAogICAgKDB4Rjk3OCwgJ00nLCB1J+WFqScpLAogICAgKDB4Rjk3OSwgJ00nLCB1J+WHiScpLAogICAgKDB4Rjk3QSwgJ00nLCB1J+aigScpLAogICAgKDB4Rjk3QiwgJ00nLCB1J+ezpycpLAogICAgKDB4Rjk3QywgJ00nLCB1J+iJrycpLAogICAgKDB4Rjk3RCwgJ00nLCB1J+irkicpLAogICAgKDB4Rjk3RSwgJ00nLCB1J+mHjycpLAogICAgKDB4Rjk3RiwgJ00nLCB1J+WLtScpLAogICAgKDB4Rjk4MCwgJ00nLCB1J+WRgicpLAogICAgKDB4Rjk4MSwgJ00nLCB1J+WlsycpLAogICAgKDB4Rjk4MiwgJ00nLCB1J+W7rCcpLAogICAgKDB4Rjk4MywgJ00nLCB1J+aXhScpLAogICAgKDB4Rjk4NCwgJ00nLCB1J+a/vicpLAogICAgKDB4Rjk4NSwgJ00nLCB1J+ekqicpLAogICAgKDB4Rjk4NiwgJ00nLCB1J+mWrScpLAogICAgKDB4Rjk4NywgJ00nLCB1J+mpqicpLAogICAgKDB4Rjk4OCwgJ00nLCB1J+m6lycpLAogICAgKDB4Rjk4OSwgJ00nLCB1J+m7jicpLAogICAgKDB4Rjk4QSwgJ00nLCB1J+WKmycpLAogICAgKDB4Rjk4QiwgJ00nLCB1J+abhicpLAogICAgKDB4Rjk4QywgJ00nLCB1J+attycpLAogICAgKDB4Rjk4RCwgJ00nLCB1J+i9oicpLAogICAgKDB4Rjk4RSwgJ00nLCB1J+W5tCcpLAogICAgKDB4Rjk4RiwgJ00nLCB1J+aGkCcpLAogICAgKDB4Rjk5MCwgJ00nLCB1J+aIgCcpLAogICAgKDB4Rjk5MSwgJ00nLCB1J+aSmicpLAogICAgXQoKZGVmIF9zZWdfMzkoKToKICAgIHJldHVybiBbCiAgICAoMHhGOTkyLCAnTScsIHUn5ryjJyksCiAgICAoMHhGOTkzLCAnTScsIHUn54WJJyksCiAgICAoMHhGOTk0LCAnTScsIHUn55KJJyksCiAgICAoMHhGOTk1LCAnTScsIHUn56eKJyksCiAgICAoMHhGOTk2LCAnTScsIHUn57e0JyksCiAgICAoMHhGOTk3LCAnTScsIHUn6IGvJyksCiAgICAoMHhGOTk4LCAnTScsIHUn6LymJyksCiAgICAoMHhGOTk5LCAnTScsIHUn6JOuJyksCiAgICAoMHhGOTlBLCAnTScsIHUn6YCjJyksCiAgICAoMHhGOTlCLCAnTScsIHUn6Y2KJyksCiAgICAoMHhGOTlDLCAnTScsIHUn5YiXJyksCiAgICAoMHhGOTlELCAnTScsIHUn5YqjJyksCiAgICAoMHhGOTlFLCAnTScsIHUn5ZK9JyksCiAgICAoMHhGOTlGLCAnTScsIHUn54OIJyksCiAgICAoMHhGOUEwLCAnTScsIHUn6KOCJyksCiAgICAoMHhGOUExLCAnTScsIHUn6KqqJyksCiAgICAoMHhGOUEyLCAnTScsIHUn5buJJyksCiAgICAoMHhGOUEzLCAnTScsIHUn5b+1JyksCiAgICAoMHhGOUE0LCAnTScsIHUn5o27JyksCiAgICAoMHhGOUE1LCAnTScsIHUn5q6uJyksCiAgICAoMHhGOUE2LCAnTScsIHUn57C+JyksCiAgICAoMHhGOUE3LCAnTScsIHUn5421JyksCiAgICAoMHhGOUE4LCAnTScsIHUn5LukJyksCiAgICAoMHhGOUE5LCAnTScsIHUn5Zu5JyksCiAgICAoMHhGOUFBLCAnTScsIHUn5a+nJyksCiAgICAoMHhGOUFCLCAnTScsIHUn5ba6JyksCiAgICAoMHhGOUFDLCAnTScsIHUn5oCcJyksCiAgICAoMHhGOUFELCAnTScsIHUn546yJyksCiAgICAoMHhGOUFFLCAnTScsIHUn55GpJyksCiAgICAoMHhGOUFGLCAnTScsIHUn576aJyksCiAgICAoMHhGOUIwLCAnTScsIHUn6IGGJyksCiAgICAoMHhGOUIxLCAnTScsIHUn6Yi0JyksCiAgICAoMHhGOUIyLCAnTScsIHUn6Zu2JyksCiAgICAoMHhGOUIzLCAnTScsIHUn6Z2IJyksCiAgICAoMHhGOUI0LCAnTScsIHUn6aCYJyksCiAgICAoMHhGOUI1LCAnTScsIHUn5L6LJyksCiAgICAoMHhGOUI2LCAnTScsIHUn56auJyksCiAgICAoMHhGOUI3LCAnTScsIHUn6Ya0JyksCiAgICAoMHhGOUI4LCAnTScsIHUn6Zq4JyksCiAgICAoMHhGOUI5LCAnTScsIHUn5oOhJyksCiAgICAoMHhGOUJBLCAnTScsIHUn5LqGJyksCiAgICAoMHhGOUJCLCAnTScsIHUn5YOaJyksCiAgICAoMHhGOUJDLCAnTScsIHUn5a+uJyksCiAgICAoMHhGOUJELCAnTScsIHUn5bC/JyksCiAgICAoMHhGOUJFLCAnTScsIHUn5paZJyksCiAgICAoMHhGOUJGLCAnTScsIHUn5qiCJyksCiAgICAoMHhGOUMwLCAnTScsIHUn54eOJyksCiAgICAoMHhGOUMxLCAnTScsIHUn55mCJyksCiAgICAoMHhGOUMyLCAnTScsIHUn6JO8JyksCiAgICAoMHhGOUMzLCAnTScsIHUn6YG8JyksCiAgICAoMHhGOUM0LCAnTScsIHUn6b6NJyksCiAgICAoMHhGOUM1LCAnTScsIHUn5pqIJyksCiAgICAoMHhGOUM2LCAnTScsIHUn6ZiuJyksCiAgICAoMHhGOUM3LCAnTScsIHUn5YqJJyksCiAgICAoMHhGOUM4LCAnTScsIHUn5p27JyksCiAgICAoMHhGOUM5LCAnTScsIHUn5p+zJyksCiAgICAoMHhGOUNBLCAnTScsIHUn5rWBJyksCiAgICAoMHhGOUNCLCAnTScsIHUn5rqcJyksCiAgICAoMHhGOUNDLCAnTScsIHUn55CJJyksCiAgICAoMHhGOUNELCAnTScsIHUn55WZJyksCiAgICAoMHhGOUNFLCAnTScsIHUn56GrJyksCiAgICAoMHhGOUNGLCAnTScsIHUn57SQJyksCiAgICAoMHhGOUQwLCAnTScsIHUn6aGeJyksCiAgICAoMHhGOUQxLCAnTScsIHUn5YWtJyksCiAgICAoMHhGOUQyLCAnTScsIHUn5oiuJyksCiAgICAoMHhGOUQzLCAnTScsIHUn6Zm4JyksCiAgICAoMHhGOUQ0LCAnTScsIHUn5YCrJyksCiAgICAoMHhGOUQ1LCAnTScsIHUn5bSZJyksCiAgICAoMHhGOUQ2LCAnTScsIHUn5reqJyksCiAgICAoMHhGOUQ3LCAnTScsIHUn6LyqJyksCiAgICAoMHhGOUQ4LCAnTScsIHUn5b6LJyksCiAgICAoMHhGOUQ5LCAnTScsIHUn5oWEJyksCiAgICAoMHhGOURBLCAnTScsIHUn5qCXJyksCiAgICAoMHhGOURCLCAnTScsIHUn546HJyksCiAgICAoMHhGOURDLCAnTScsIHUn6ZqGJyksCiAgICAoMHhGOURELCAnTScsIHUn5YipJyksCiAgICAoMHhGOURFLCAnTScsIHUn5ZCPJyksCiAgICAoMHhGOURGLCAnTScsIHUn5bGlJyksCiAgICAoMHhGOUUwLCAnTScsIHUn5piTJyksCiAgICAoMHhGOUUxLCAnTScsIHUn5p2OJyksCiAgICAoMHhGOUUyLCAnTScsIHUn5qKoJyksCiAgICAoMHhGOUUzLCAnTScsIHUn5rOlJyksCiAgICAoMHhGOUU0LCAnTScsIHUn55CGJyksCiAgICAoMHhGOUU1LCAnTScsIHUn55eiJyksCiAgICAoMHhGOUU2LCAnTScsIHUn5725JyksCiAgICAoMHhGOUU3LCAnTScsIHUn6KOPJyksCiAgICAoMHhGOUU4LCAnTScsIHUn6KOhJyksCiAgICAoMHhGOUU5LCAnTScsIHUn6YeMJyksCiAgICAoMHhGOUVBLCAnTScsIHUn6ZuiJyksCiAgICAoMHhGOUVCLCAnTScsIHUn5Yy/JyksCiAgICAoMHhGOUVDLCAnTScsIHUn5rq6JyksCiAgICAoMHhGOUVELCAnTScsIHUn5ZCdJyksCiAgICAoMHhGOUVFLCAnTScsIHUn54eQJyksCiAgICAoMHhGOUVGLCAnTScsIHUn55KYJyksCiAgICAoMHhGOUYwLCAnTScsIHUn6Je6JyksCiAgICAoMHhGOUYxLCAnTScsIHUn6ZqjJyksCiAgICAoMHhGOUYyLCAnTScsIHUn6bGXJyksCiAgICAoMHhGOUYzLCAnTScsIHUn6bqfJyksCiAgICAoMHhGOUY0LCAnTScsIHUn5p6XJyksCiAgICAoMHhGOUY1LCAnTScsIHUn5reLJyksCiAgICBdCgpkZWYgX3NlZ180MCgpOgogICAgcmV0dXJuIFsKICAgICgweEY5RjYsICdNJywgdSfoh6gnKSwKICAgICgweEY5RjcsICdNJywgdSfnq4snKSwKICAgICgweEY5RjgsICdNJywgdSfnrKAnKSwKICAgICgweEY5RjksICdNJywgdSfnspInKSwKICAgICgweEY5RkEsICdNJywgdSfni4AnKSwKICAgICgweEY5RkIsICdNJywgdSfngpknKSwKICAgICgweEY5RkMsICdNJywgdSforZgnKSwKICAgICgweEY5RkQsICdNJywgdSfku4AnKSwKICAgICgweEY5RkUsICdNJywgdSfojLYnKSwKICAgICgweEY5RkYsICdNJywgdSfliLonKSwKICAgICgweEZBMDAsICdNJywgdSfliIcnKSwKICAgICgweEZBMDEsICdNJywgdSfluqYnKSwKICAgICgweEZBMDIsICdNJywgdSfmi5MnKSwKICAgICgweEZBMDMsICdNJywgdSfns5YnKSwKICAgICgweEZBMDQsICdNJywgdSflroUnKSwKICAgICgweEZBMDUsICdNJywgdSfmtJ4nKSwKICAgICgweEZBMDYsICdNJywgdSfmmrQnKSwKICAgICgweEZBMDcsICdNJywgdSfovLsnKSwKICAgICgweEZBMDgsICdNJywgdSfooYwnKSwKICAgICgweEZBMDksICdNJywgdSfpmY0nKSwKICAgICgweEZBMEEsICdNJywgdSfoposnKSwKICAgICgweEZBMEIsICdNJywgdSflu5MnKSwKICAgICgweEZBMEMsICdNJywgdSflhYAnKSwKICAgICgweEZBMEQsICdNJywgdSfll4AnKSwKICAgICgweEZBMEUsICdWJyksCiAgICAoMHhGQTEwLCAnTScsIHUn5aGaJyksCiAgICAoMHhGQTExLCAnVicpLAogICAgKDB4RkExMiwgJ00nLCB1J+aZtCcpLAogICAgKDB4RkExMywgJ1YnKSwKICAgICgweEZBMTUsICdNJywgdSflh54nKSwKICAgICgweEZBMTYsICdNJywgdSfnjKonKSwKICAgICgweEZBMTcsICdNJywgdSfnm4onKSwKICAgICgweEZBMTgsICdNJywgdSfnpLwnKSwKICAgICgweEZBMTksICdNJywgdSfnpZ4nKSwKICAgICgweEZBMUEsICdNJywgdSfnpaUnKSwKICAgICgweEZBMUIsICdNJywgdSfnpo8nKSwKICAgICgweEZBMUMsICdNJywgdSfpnZYnKSwKICAgICgweEZBMUQsICdNJywgdSfnsr4nKSwKICAgICgweEZBMUUsICdNJywgdSfnvr0nKSwKICAgICgweEZBMUYsICdWJyksCiAgICAoMHhGQTIwLCAnTScsIHUn6JiSJyksCiAgICAoMHhGQTIxLCAnVicpLAogICAgKDB4RkEyMiwgJ00nLCB1J+iruCcpLAogICAgKDB4RkEyMywgJ1YnKSwKICAgICgweEZBMjUsICdNJywgdSfpgLgnKSwKICAgICgweEZBMjYsICdNJywgdSfpg70nKSwKICAgICgweEZBMjcsICdWJyksCiAgICAoMHhGQTJBLCAnTScsIHUn6aOvJyksCiAgICAoMHhGQTJCLCAnTScsIHUn6aO8JyksCiAgICAoMHhGQTJDLCAnTScsIHUn6aSoJyksCiAgICAoMHhGQTJELCAnTScsIHUn6ba0JyksCiAgICAoMHhGQTJFLCAnTScsIHUn6YOeJyksCiAgICAoMHhGQTJGLCAnTScsIHUn6Zq3JyksCiAgICAoMHhGQTMwLCAnTScsIHUn5L6uJyksCiAgICAoMHhGQTMxLCAnTScsIHUn5YOnJyksCiAgICAoMHhGQTMyLCAnTScsIHUn5YWNJyksCiAgICAoMHhGQTMzLCAnTScsIHUn5YuJJyksCiAgICAoMHhGQTM0LCAnTScsIHUn5YukJyksCiAgICAoMHhGQTM1LCAnTScsIHUn5Y2RJyksCiAgICAoMHhGQTM2LCAnTScsIHUn5ZadJyksCiAgICAoMHhGQTM3LCAnTScsIHUn5ZiGJyksCiAgICAoMHhGQTM4LCAnTScsIHUn5ZmoJyksCiAgICAoMHhGQTM5LCAnTScsIHUn5aGAJyksCiAgICAoMHhGQTNBLCAnTScsIHUn5aKoJyksCiAgICAoMHhGQTNCLCAnTScsIHUn5bGkJyksCiAgICAoMHhGQTNDLCAnTScsIHUn5bGuJyksCiAgICAoMHhGQTNELCAnTScsIHUn5oKUJyksCiAgICAoMHhGQTNFLCAnTScsIHUn5oWoJyksCiAgICAoMHhGQTNGLCAnTScsIHUn5oaOJyksCiAgICAoMHhGQTQwLCAnTScsIHUn5oeyJyksCiAgICAoMHhGQTQxLCAnTScsIHUn5pWPJyksCiAgICAoMHhGQTQyLCAnTScsIHUn5peiJyksCiAgICAoMHhGQTQzLCAnTScsIHUn5pqRJyksCiAgICAoMHhGQTQ0LCAnTScsIHUn5qKFJyksCiAgICAoMHhGQTQ1LCAnTScsIHUn5rW3JyksCiAgICAoMHhGQTQ2LCAnTScsIHUn5riaJyksCiAgICAoMHhGQTQ3LCAnTScsIHUn5ryiJyksCiAgICAoMHhGQTQ4LCAnTScsIHUn54WuJyksCiAgICAoMHhGQTQ5LCAnTScsIHUn54irJyksCiAgICAoMHhGQTRBLCAnTScsIHUn55CiJyksCiAgICAoMHhGQTRCLCAnTScsIHUn56KRJyksCiAgICAoMHhGQTRDLCAnTScsIHUn56S+JyksCiAgICAoMHhGQTRELCAnTScsIHUn56WJJyksCiAgICAoMHhGQTRFLCAnTScsIHUn56WIJyksCiAgICAoMHhGQTRGLCAnTScsIHUn56WQJyksCiAgICAoMHhGQTUwLCAnTScsIHUn56WWJyksCiAgICAoMHhGQTUxLCAnTScsIHUn56WdJyksCiAgICAoMHhGQTUyLCAnTScsIHUn56aNJyksCiAgICAoMHhGQTUzLCAnTScsIHUn56aOJyksCiAgICAoMHhGQTU0LCAnTScsIHUn56mAJyksCiAgICAoMHhGQTU1LCAnTScsIHUn56qBJyksCiAgICAoMHhGQTU2LCAnTScsIHUn56+AJyksCiAgICAoMHhGQTU3LCAnTScsIHUn57e0JyksCiAgICAoMHhGQTU4LCAnTScsIHUn57iJJyksCiAgICAoMHhGQTU5LCAnTScsIHUn57mBJyksCiAgICAoMHhGQTVBLCAnTScsIHUn572yJyksCiAgICAoMHhGQTVCLCAnTScsIHUn6ICFJyksCiAgICAoMHhGQTVDLCAnTScsIHUn6IetJyksCiAgICAoMHhGQTVELCAnTScsIHUn6Im5JyksCiAgICAoMHhGQTVGLCAnTScsIHUn6JGXJyksCiAgICBdCgpkZWYgX3NlZ180MSgpOgogICAgcmV0dXJuIFsKICAgICgweEZBNjAsICdNJywgdSfopJAnKSwKICAgICgweEZBNjEsICdNJywgdSfoppYnKSwKICAgICgweEZBNjIsICdNJywgdSforIEnKSwKICAgICgweEZBNjMsICdNJywgdSforLknKSwKICAgICgweEZBNjQsICdNJywgdSfos5MnKSwKICAgICgweEZBNjUsICdNJywgdSfotIgnKSwKICAgICgweEZBNjYsICdNJywgdSfovrYnKSwKICAgICgweEZBNjcsICdNJywgdSfpgLgnKSwKICAgICgweEZBNjgsICdNJywgdSfpm6MnKSwKICAgICgweEZBNjksICdNJywgdSfpn78nKSwKICAgICgweEZBNkEsICdNJywgdSfpoLsnKSwKICAgICgweEZBNkIsICdNJywgdSfmgbUnKSwKICAgICgweEZBNkMsICdNJywgdSfwpIuuJyksCiAgICAoMHhGQTZELCAnTScsIHUn6IiYJyksCiAgICAoMHhGQTZFLCAnWCcpLAogICAgKDB4RkE3MCwgJ00nLCB1J+S4picpLAogICAgKDB4RkE3MSwgJ00nLCB1J+WGtScpLAogICAgKDB4RkE3MiwgJ00nLCB1J+WFqCcpLAogICAgKDB4RkE3MywgJ00nLCB1J+S+gCcpLAogICAgKDB4RkE3NCwgJ00nLCB1J+WFhScpLAogICAgKDB4RkE3NSwgJ00nLCB1J+WGgCcpLAogICAgKDB4RkE3NiwgJ00nLCB1J+WLhycpLAogICAgKDB4RkE3NywgJ00nLCB1J+WLuicpLAogICAgKDB4RkE3OCwgJ00nLCB1J+WWnScpLAogICAgKDB4RkE3OSwgJ00nLCB1J+WVlScpLAogICAgKDB4RkE3QSwgJ00nLCB1J+WWmScpLAogICAgKDB4RkE3QiwgJ00nLCB1J+WXoicpLAogICAgKDB4RkE3QywgJ00nLCB1J+WhmicpLAogICAgKDB4RkE3RCwgJ00nLCB1J+WisycpLAogICAgKDB4RkE3RSwgJ00nLCB1J+WlhCcpLAogICAgKDB4RkE3RiwgJ00nLCB1J+WllCcpLAogICAgKDB4RkE4MCwgJ00nLCB1J+WpoicpLAogICAgKDB4RkE4MSwgJ00nLCB1J+WsqCcpLAogICAgKDB4RkE4MiwgJ00nLCB1J+W7kicpLAogICAgKDB4RkE4MywgJ00nLCB1J+W7mScpLAogICAgKDB4RkE4NCwgJ00nLCB1J+W9qScpLAogICAgKDB4RkE4NSwgJ00nLCB1J+W+rScpLAogICAgKDB4RkE4NiwgJ00nLCB1J+aDmCcpLAogICAgKDB4RkE4NywgJ00nLCB1J+aFjicpLAogICAgKDB4RkE4OCwgJ00nLCB1J+aEiCcpLAogICAgKDB4RkE4OSwgJ00nLCB1J+aGjicpLAogICAgKDB4RkE4QSwgJ00nLCB1J+aFoCcpLAogICAgKDB4RkE4QiwgJ00nLCB1J+aHsicpLAogICAgKDB4RkE4QywgJ00nLCB1J+aItCcpLAogICAgKDB4RkE4RCwgJ00nLCB1J+aPhCcpLAogICAgKDB4RkE4RSwgJ00nLCB1J+aQnCcpLAogICAgKDB4RkE4RiwgJ00nLCB1J+aRkicpLAogICAgKDB4RkE5MCwgJ00nLCB1J+aVlicpLAogICAgKDB4RkE5MSwgJ00nLCB1J+aZtCcpLAogICAgKDB4RkE5MiwgJ00nLCB1J+aclycpLAogICAgKDB4RkE5MywgJ00nLCB1J+acmycpLAogICAgKDB4RkE5NCwgJ00nLCB1J+adlicpLAogICAgKDB4RkE5NSwgJ00nLCB1J+atuScpLAogICAgKDB4RkE5NiwgJ00nLCB1J+auuicpLAogICAgKDB4RkE5NywgJ00nLCB1J+a1gScpLAogICAgKDB4RkE5OCwgJ00nLCB1J+a7mycpLAogICAgKDB4RkE5OSwgJ00nLCB1J+a7iycpLAogICAgKDB4RkE5QSwgJ00nLCB1J+a8oicpLAogICAgKDB4RkE5QiwgJ00nLCB1J+eAnicpLAogICAgKDB4RkE5QywgJ00nLCB1J+eFricpLAogICAgKDB4RkE5RCwgJ00nLCB1J+eepycpLAogICAgKDB4RkE5RSwgJ00nLCB1J+eItScpLAogICAgKDB4RkE5RiwgJ00nLCB1J+eKrycpLAogICAgKDB4RkFBMCwgJ00nLCB1J+eMqicpLAogICAgKDB4RkFBMSwgJ00nLCB1J+eRsScpLAogICAgKDB4RkFBMiwgJ00nLCB1J+eUhicpLAogICAgKDB4RkFBMywgJ00nLCB1J+eUuycpLAogICAgKDB4RkFBNCwgJ00nLCB1J+eYnScpLAogICAgKDB4RkFBNSwgJ00nLCB1J+eYnycpLAogICAgKDB4RkFBNiwgJ00nLCB1J+ebiicpLAogICAgKDB4RkFBNywgJ00nLCB1J+ebmycpLAogICAgKDB4RkFBOCwgJ00nLCB1J+ebtCcpLAogICAgKDB4RkFBOSwgJ00nLCB1J+ediicpLAogICAgKDB4RkFBQSwgJ00nLCB1J+edgCcpLAogICAgKDB4RkFBQiwgJ00nLCB1J+ejjCcpLAogICAgKDB4RkFBQywgJ00nLCB1J+eqsScpLAogICAgKDB4RkFBRCwgJ00nLCB1J+evgCcpLAogICAgKDB4RkFBRSwgJ00nLCB1J+exuycpLAogICAgKDB4RkFBRiwgJ00nLCB1J+e1mycpLAogICAgKDB4RkFCMCwgJ00nLCB1J+e3tCcpLAogICAgKDB4RkFCMSwgJ00nLCB1J+e8vicpLAogICAgKDB4RkFCMiwgJ00nLCB1J+iAhScpLAogICAgKDB4RkFCMywgJ00nLCB1J+iNkicpLAogICAgKDB4RkFCNCwgJ00nLCB1J+iPrycpLAogICAgKDB4RkFCNSwgJ00nLCB1J+iduScpLAogICAgKDB4RkFCNiwgJ00nLCB1J+ilgScpLAogICAgKDB4RkFCNywgJ00nLCB1J+imhicpLAogICAgKDB4RkFCOCwgJ00nLCB1J+imlicpLAogICAgKDB4RkFCOSwgJ00nLCB1J+iqvycpLAogICAgKDB4RkFCQSwgJ00nLCB1J+iruCcpLAogICAgKDB4RkFCQiwgJ00nLCB1J+iriycpLAogICAgKDB4RkFCQywgJ00nLCB1J+isgScpLAogICAgKDB4RkFCRCwgJ00nLCB1J+irvicpLAogICAgKDB4RkFCRSwgJ00nLCB1J+irrScpLAogICAgKDB4RkFCRiwgJ00nLCB1J+isuScpLAogICAgKDB4RkFDMCwgJ00nLCB1J+iuiicpLAogICAgKDB4RkFDMSwgJ00nLCB1J+i0iCcpLAogICAgKDB4RkFDMiwgJ00nLCB1J+i8uCcpLAogICAgKDB4RkFDMywgJ00nLCB1J+mBsicpLAogICAgKDB4RkFDNCwgJ00nLCB1J+mGmScpLAogICAgXQoKZGVmIF9zZWdfNDIoKToKICAgIHJldHVybiBbCiAgICAoMHhGQUM1LCAnTScsIHUn6Ym2JyksCiAgICAoMHhGQUM2LCAnTScsIHUn6Zm8JyksCiAgICAoMHhGQUM3LCAnTScsIHUn6ZujJyksCiAgICAoMHhGQUM4LCAnTScsIHUn6Z2WJyksCiAgICAoMHhGQUM5LCAnTScsIHUn6Z+bJyksCiAgICAoMHhGQUNBLCAnTScsIHUn6Z+/JyksCiAgICAoMHhGQUNCLCAnTScsIHUn6aCLJyksCiAgICAoMHhGQUNDLCAnTScsIHUn6aC7JyksCiAgICAoMHhGQUNELCAnTScsIHUn6aySJyksCiAgICAoMHhGQUNFLCAnTScsIHUn6b6cJyksCiAgICAoMHhGQUNGLCAnTScsIHUn8KKhiicpLAogICAgKDB4RkFEMCwgJ00nLCB1J/CioYQnKSwKICAgICgweEZBRDEsICdNJywgdSfwo4+VJyksCiAgICAoMHhGQUQyLCAnTScsIHUn466dJyksCiAgICAoMHhGQUQzLCAnTScsIHUn5ICYJyksCiAgICAoMHhGQUQ0LCAnTScsIHUn5IC5JyksCiAgICAoMHhGQUQ1LCAnTScsIHUn8KWJiScpLAogICAgKDB4RkFENiwgJ00nLCB1J/Cls5AnKSwKICAgICgweEZBRDcsICdNJywgdSfwp7uTJyksCiAgICAoMHhGQUQ4LCAnTScsIHUn6b2DJyksCiAgICAoMHhGQUQ5LCAnTScsIHUn6b6OJyksCiAgICAoMHhGQURBLCAnWCcpLAogICAgKDB4RkIwMCwgJ00nLCB1J2ZmJyksCiAgICAoMHhGQjAxLCAnTScsIHUnZmknKSwKICAgICgweEZCMDIsICdNJywgdSdmbCcpLAogICAgKDB4RkIwMywgJ00nLCB1J2ZmaScpLAogICAgKDB4RkIwNCwgJ00nLCB1J2ZmbCcpLAogICAgKDB4RkIwNSwgJ00nLCB1J3N0JyksCiAgICAoMHhGQjA3LCAnWCcpLAogICAgKDB4RkIxMywgJ00nLCB1J9W01bYnKSwKICAgICgweEZCMTQsICdNJywgdSfVtNWlJyksCiAgICAoMHhGQjE1LCAnTScsIHUn1bTVqycpLAogICAgKDB4RkIxNiwgJ00nLCB1J9W+1bYnKSwKICAgICgweEZCMTcsICdNJywgdSfVtNWtJyksCiAgICAoMHhGQjE4LCAnWCcpLAogICAgKDB4RkIxRCwgJ00nLCB1J9eZ1rQnKSwKICAgICgweEZCMUUsICdWJyksCiAgICAoMHhGQjFGLCAnTScsIHUn17LWtycpLAogICAgKDB4RkIyMCwgJ00nLCB1J9eiJyksCiAgICAoMHhGQjIxLCAnTScsIHUn15AnKSwKICAgICgweEZCMjIsICdNJywgdSfXkycpLAogICAgKDB4RkIyMywgJ00nLCB1J9eUJyksCiAgICAoMHhGQjI0LCAnTScsIHUn15snKSwKICAgICgweEZCMjUsICdNJywgdSfXnCcpLAogICAgKDB4RkIyNiwgJ00nLCB1J9edJyksCiAgICAoMHhGQjI3LCAnTScsIHUn16gnKSwKICAgICgweEZCMjgsICdNJywgdSfXqicpLAogICAgKDB4RkIyOSwgJzMnLCB1JysnKSwKICAgICgweEZCMkEsICdNJywgdSfXqdeBJyksCiAgICAoMHhGQjJCLCAnTScsIHUn16nXgicpLAogICAgKDB4RkIyQywgJ00nLCB1J9ep1rzXgScpLAogICAgKDB4RkIyRCwgJ00nLCB1J9ep1rzXgicpLAogICAgKDB4RkIyRSwgJ00nLCB1J9eQ1rcnKSwKICAgICgweEZCMkYsICdNJywgdSfXkNa4JyksCiAgICAoMHhGQjMwLCAnTScsIHUn15DWvCcpLAogICAgKDB4RkIzMSwgJ00nLCB1J9eR1rwnKSwKICAgICgweEZCMzIsICdNJywgdSfXkta8JyksCiAgICAoMHhGQjMzLCAnTScsIHUn15PWvCcpLAogICAgKDB4RkIzNCwgJ00nLCB1J9eU1rwnKSwKICAgICgweEZCMzUsICdNJywgdSfXlda8JyksCiAgICAoMHhGQjM2LCAnTScsIHUn15bWvCcpLAogICAgKDB4RkIzNywgJ1gnKSwKICAgICgweEZCMzgsICdNJywgdSfXmNa8JyksCiAgICAoMHhGQjM5LCAnTScsIHUn15nWvCcpLAogICAgKDB4RkIzQSwgJ00nLCB1J9ea1rwnKSwKICAgICgweEZCM0IsICdNJywgdSfXm9a8JyksCiAgICAoMHhGQjNDLCAnTScsIHUn15zWvCcpLAogICAgKDB4RkIzRCwgJ1gnKSwKICAgICgweEZCM0UsICdNJywgdSfXnta8JyksCiAgICAoMHhGQjNGLCAnWCcpLAogICAgKDB4RkI0MCwgJ00nLCB1J9eg1rwnKSwKICAgICgweEZCNDEsICdNJywgdSfXoda8JyksCiAgICAoMHhGQjQyLCAnWCcpLAogICAgKDB4RkI0MywgJ00nLCB1J9ej1rwnKSwKICAgICgweEZCNDQsICdNJywgdSfXpNa8JyksCiAgICAoMHhGQjQ1LCAnWCcpLAogICAgKDB4RkI0NiwgJ00nLCB1J9em1rwnKSwKICAgICgweEZCNDcsICdNJywgdSfXp9a8JyksCiAgICAoMHhGQjQ4LCAnTScsIHUn16jWvCcpLAogICAgKDB4RkI0OSwgJ00nLCB1J9ep1rwnKSwKICAgICgweEZCNEEsICdNJywgdSfXqta8JyksCiAgICAoMHhGQjRCLCAnTScsIHUn15XWuScpLAogICAgKDB4RkI0QywgJ00nLCB1J9eR1r8nKSwKICAgICgweEZCNEQsICdNJywgdSfXm9a/JyksCiAgICAoMHhGQjRFLCAnTScsIHUn16TWvycpLAogICAgKDB4RkI0RiwgJ00nLCB1J9eQ15wnKSwKICAgICgweEZCNTAsICdNJywgdSfZsScpLAogICAgKDB4RkI1MiwgJ00nLCB1J9m7JyksCiAgICAoMHhGQjU2LCAnTScsIHUn2b4nKSwKICAgICgweEZCNUEsICdNJywgdSfagCcpLAogICAgKDB4RkI1RSwgJ00nLCB1J9m6JyksCiAgICAoMHhGQjYyLCAnTScsIHUn2b8nKSwKICAgICgweEZCNjYsICdNJywgdSfZuScpLAogICAgKDB4RkI2QSwgJ00nLCB1J9qkJyksCiAgICAoMHhGQjZFLCAnTScsIHUn2qYnKSwKICAgICgweEZCNzIsICdNJywgdSfahCcpLAogICAgKDB4RkI3NiwgJ00nLCB1J9qDJyksCiAgICAoMHhGQjdBLCAnTScsIHUn2oYnKSwKICAgICgweEZCN0UsICdNJywgdSfahycpLAogICAgKDB4RkI4MiwgJ00nLCB1J9qNJyksCiAgICBdCgpkZWYgX3NlZ180MygpOgogICAgcmV0dXJuIFsKICAgICgweEZCODQsICdNJywgdSfajCcpLAogICAgKDB4RkI4NiwgJ00nLCB1J9qOJyksCiAgICAoMHhGQjg4LCAnTScsIHUn2ognKSwKICAgICgweEZCOEEsICdNJywgdSfamCcpLAogICAgKDB4RkI4QywgJ00nLCB1J9qRJyksCiAgICAoMHhGQjhFLCAnTScsIHUn2qknKSwKICAgICgweEZCOTIsICdNJywgdSfarycpLAogICAgKDB4RkI5NiwgJ00nLCB1J9qzJyksCiAgICAoMHhGQjlBLCAnTScsIHUn2rEnKSwKICAgICgweEZCOUUsICdNJywgdSfauicpLAogICAgKDB4RkJBMCwgJ00nLCB1J9q7JyksCiAgICAoMHhGQkE0LCAnTScsIHUn24AnKSwKICAgICgweEZCQTYsICdNJywgdSfbgScpLAogICAgKDB4RkJBQSwgJ00nLCB1J9q+JyksCiAgICAoMHhGQkFFLCAnTScsIHUn25InKSwKICAgICgweEZCQjAsICdNJywgdSfbkycpLAogICAgKDB4RkJCMiwgJ1YnKSwKICAgICgweEZCQzIsICdYJyksCiAgICAoMHhGQkQzLCAnTScsIHUn2q0nKSwKICAgICgweEZCRDcsICdNJywgdSfbhycpLAogICAgKDB4RkJEOSwgJ00nLCB1J9uGJyksCiAgICAoMHhGQkRCLCAnTScsIHUn24gnKSwKICAgICgweEZCREQsICdNJywgdSfbh9m0JyksCiAgICAoMHhGQkRFLCAnTScsIHUn24snKSwKICAgICgweEZCRTAsICdNJywgdSfbhScpLAogICAgKDB4RkJFMiwgJ00nLCB1J9uJJyksCiAgICAoMHhGQkU0LCAnTScsIHUn25AnKSwKICAgICgweEZCRTgsICdNJywgdSfZiScpLAogICAgKDB4RkJFQSwgJ00nLCB1J9im2KcnKSwKICAgICgweEZCRUMsICdNJywgdSfYptuVJyksCiAgICAoMHhGQkVFLCAnTScsIHUn2KbZiCcpLAogICAgKDB4RkJGMCwgJ00nLCB1J9im24cnKSwKICAgICgweEZCRjIsICdNJywgdSfYptuGJyksCiAgICAoMHhGQkY0LCAnTScsIHUn2KbbiCcpLAogICAgKDB4RkJGNiwgJ00nLCB1J9im25AnKSwKICAgICgweEZCRjksICdNJywgdSfYptmJJyksCiAgICAoMHhGQkZDLCAnTScsIHUn24wnKSwKICAgICgweEZDMDAsICdNJywgdSfYptisJyksCiAgICAoMHhGQzAxLCAnTScsIHUn2KbYrScpLAogICAgKDB4RkMwMiwgJ00nLCB1J9im2YUnKSwKICAgICgweEZDMDMsICdNJywgdSfYptmJJyksCiAgICAoMHhGQzA0LCAnTScsIHUn2KbZiicpLAogICAgKDB4RkMwNSwgJ00nLCB1J9io2KwnKSwKICAgICgweEZDMDYsICdNJywgdSfYqNitJyksCiAgICAoMHhGQzA3LCAnTScsIHUn2KjYricpLAogICAgKDB4RkMwOCwgJ00nLCB1J9io2YUnKSwKICAgICgweEZDMDksICdNJywgdSfYqNmJJyksCiAgICAoMHhGQzBBLCAnTScsIHUn2KjZiicpLAogICAgKDB4RkMwQiwgJ00nLCB1J9iq2KwnKSwKICAgICgweEZDMEMsICdNJywgdSfYqtitJyksCiAgICAoMHhGQzBELCAnTScsIHUn2KrYricpLAogICAgKDB4RkMwRSwgJ00nLCB1J9iq2YUnKSwKICAgICgweEZDMEYsICdNJywgdSfYqtmJJyksCiAgICAoMHhGQzEwLCAnTScsIHUn2KrZiicpLAogICAgKDB4RkMxMSwgJ00nLCB1J9ir2KwnKSwKICAgICgweEZDMTIsICdNJywgdSfYq9mFJyksCiAgICAoMHhGQzEzLCAnTScsIHUn2KvZiScpLAogICAgKDB4RkMxNCwgJ00nLCB1J9ir2YonKSwKICAgICgweEZDMTUsICdNJywgdSfYrNitJyksCiAgICAoMHhGQzE2LCAnTScsIHUn2KzZhScpLAogICAgKDB4RkMxNywgJ00nLCB1J9it2KwnKSwKICAgICgweEZDMTgsICdNJywgdSfYrdmFJyksCiAgICAoMHhGQzE5LCAnTScsIHUn2K7YrCcpLAogICAgKDB4RkMxQSwgJ00nLCB1J9iu2K0nKSwKICAgICgweEZDMUIsICdNJywgdSfYrtmFJyksCiAgICAoMHhGQzFDLCAnTScsIHUn2LPYrCcpLAogICAgKDB4RkMxRCwgJ00nLCB1J9iz2K0nKSwKICAgICgweEZDMUUsICdNJywgdSfYs9iuJyksCiAgICAoMHhGQzFGLCAnTScsIHUn2LPZhScpLAogICAgKDB4RkMyMCwgJ00nLCB1J9i12K0nKSwKICAgICgweEZDMjEsICdNJywgdSfYtdmFJyksCiAgICAoMHhGQzIyLCAnTScsIHUn2LbYrCcpLAogICAgKDB4RkMyMywgJ00nLCB1J9i22K0nKSwKICAgICgweEZDMjQsICdNJywgdSfYttiuJyksCiAgICAoMHhGQzI1LCAnTScsIHUn2LbZhScpLAogICAgKDB4RkMyNiwgJ00nLCB1J9i32K0nKSwKICAgICgweEZDMjcsICdNJywgdSfYt9mFJyksCiAgICAoMHhGQzI4LCAnTScsIHUn2LjZhScpLAogICAgKDB4RkMyOSwgJ00nLCB1J9i52KwnKSwKICAgICgweEZDMkEsICdNJywgdSfYudmFJyksCiAgICAoMHhGQzJCLCAnTScsIHUn2LrYrCcpLAogICAgKDB4RkMyQywgJ00nLCB1J9i62YUnKSwKICAgICgweEZDMkQsICdNJywgdSfZgdisJyksCiAgICAoMHhGQzJFLCAnTScsIHUn2YHYrScpLAogICAgKDB4RkMyRiwgJ00nLCB1J9mB2K4nKSwKICAgICgweEZDMzAsICdNJywgdSfZgdmFJyksCiAgICAoMHhGQzMxLCAnTScsIHUn2YHZiScpLAogICAgKDB4RkMzMiwgJ00nLCB1J9mB2YonKSwKICAgICgweEZDMzMsICdNJywgdSfZgtitJyksCiAgICAoMHhGQzM0LCAnTScsIHUn2YLZhScpLAogICAgKDB4RkMzNSwgJ00nLCB1J9mC2YknKSwKICAgICgweEZDMzYsICdNJywgdSfZgtmKJyksCiAgICAoMHhGQzM3LCAnTScsIHUn2YPYpycpLAogICAgKDB4RkMzOCwgJ00nLCB1J9mD2KwnKSwKICAgICgweEZDMzksICdNJywgdSfZg9itJyksCiAgICAoMHhGQzNBLCAnTScsIHUn2YPYricpLAogICAgKDB4RkMzQiwgJ00nLCB1J9mD2YQnKSwKICAgICgweEZDM0MsICdNJywgdSfZg9mFJyksCiAgICAoMHhGQzNELCAnTScsIHUn2YPZiScpLAogICAgKDB4RkMzRSwgJ00nLCB1J9mD2YonKSwKICAgIF0KCmRlZiBfc2VnXzQ0KCk6CiAgICByZXR1cm4gWwogICAgKDB4RkMzRiwgJ00nLCB1J9mE2KwnKSwKICAgICgweEZDNDAsICdNJywgdSfZhNitJyksCiAgICAoMHhGQzQxLCAnTScsIHUn2YTYricpLAogICAgKDB4RkM0MiwgJ00nLCB1J9mE2YUnKSwKICAgICgweEZDNDMsICdNJywgdSfZhNmJJyksCiAgICAoMHhGQzQ0LCAnTScsIHUn2YTZiicpLAogICAgKDB4RkM0NSwgJ00nLCB1J9mF2KwnKSwKICAgICgweEZDNDYsICdNJywgdSfZhditJyksCiAgICAoMHhGQzQ3LCAnTScsIHUn2YXYricpLAogICAgKDB4RkM0OCwgJ00nLCB1J9mF2YUnKSwKICAgICgweEZDNDksICdNJywgdSfZhdmJJyksCiAgICAoMHhGQzRBLCAnTScsIHUn2YXZiicpLAogICAgKDB4RkM0QiwgJ00nLCB1J9mG2KwnKSwKICAgICgweEZDNEMsICdNJywgdSfZhtitJyksCiAgICAoMHhGQzRELCAnTScsIHUn2YbYricpLAogICAgKDB4RkM0RSwgJ00nLCB1J9mG2YUnKSwKICAgICgweEZDNEYsICdNJywgdSfZhtmJJyksCiAgICAoMHhGQzUwLCAnTScsIHUn2YbZiicpLAogICAgKDB4RkM1MSwgJ00nLCB1J9mH2KwnKSwKICAgICgweEZDNTIsICdNJywgdSfZh9mFJyksCiAgICAoMHhGQzUzLCAnTScsIHUn2YfZiScpLAogICAgKDB4RkM1NCwgJ00nLCB1J9mH2YonKSwKICAgICgweEZDNTUsICdNJywgdSfZitisJyksCiAgICAoMHhGQzU2LCAnTScsIHUn2YrYrScpLAogICAgKDB4RkM1NywgJ00nLCB1J9mK2K4nKSwKICAgICgweEZDNTgsICdNJywgdSfZitmFJyksCiAgICAoMHhGQzU5LCAnTScsIHUn2YrZiScpLAogICAgKDB4RkM1QSwgJ00nLCB1J9mK2YonKSwKICAgICgweEZDNUIsICdNJywgdSfYsNmwJyksCiAgICAoMHhGQzVDLCAnTScsIHUn2LHZsCcpLAogICAgKDB4RkM1RCwgJ00nLCB1J9mJ2bAnKSwKICAgICgweEZDNUUsICczJywgdScg2YzZkScpLAogICAgKDB4RkM1RiwgJzMnLCB1JyDZjdmRJyksCiAgICAoMHhGQzYwLCAnMycsIHUnINmO2ZEnKSwKICAgICgweEZDNjEsICczJywgdScg2Y/ZkScpLAogICAgKDB4RkM2MiwgJzMnLCB1JyDZkNmRJyksCiAgICAoMHhGQzYzLCAnMycsIHUnINmR2bAnKSwKICAgICgweEZDNjQsICdNJywgdSfYptixJyksCiAgICAoMHhGQzY1LCAnTScsIHUn2KbYsicpLAogICAgKDB4RkM2NiwgJ00nLCB1J9im2YUnKSwKICAgICgweEZDNjcsICdNJywgdSfYptmGJyksCiAgICAoMHhGQzY4LCAnTScsIHUn2KbZiScpLAogICAgKDB4RkM2OSwgJ00nLCB1J9im2YonKSwKICAgICgweEZDNkEsICdNJywgdSfYqNixJyksCiAgICAoMHhGQzZCLCAnTScsIHUn2KjYsicpLAogICAgKDB4RkM2QywgJ00nLCB1J9io2YUnKSwKICAgICgweEZDNkQsICdNJywgdSfYqNmGJyksCiAgICAoMHhGQzZFLCAnTScsIHUn2KjZiScpLAogICAgKDB4RkM2RiwgJ00nLCB1J9io2YonKSwKICAgICgweEZDNzAsICdNJywgdSfYqtixJyksCiAgICAoMHhGQzcxLCAnTScsIHUn2KrYsicpLAogICAgKDB4RkM3MiwgJ00nLCB1J9iq2YUnKSwKICAgICgweEZDNzMsICdNJywgdSfYqtmGJyksCiAgICAoMHhGQzc0LCAnTScsIHUn2KrZiScpLAogICAgKDB4RkM3NSwgJ00nLCB1J9iq2YonKSwKICAgICgweEZDNzYsICdNJywgdSfYq9ixJyksCiAgICAoMHhGQzc3LCAnTScsIHUn2KvYsicpLAogICAgKDB4RkM3OCwgJ00nLCB1J9ir2YUnKSwKICAgICgweEZDNzksICdNJywgdSfYq9mGJyksCiAgICAoMHhGQzdBLCAnTScsIHUn2KvZiScpLAogICAgKDB4RkM3QiwgJ00nLCB1J9ir2YonKSwKICAgICgweEZDN0MsICdNJywgdSfZgdmJJyksCiAgICAoMHhGQzdELCAnTScsIHUn2YHZiicpLAogICAgKDB4RkM3RSwgJ00nLCB1J9mC2YknKSwKICAgICgweEZDN0YsICdNJywgdSfZgtmKJyksCiAgICAoMHhGQzgwLCAnTScsIHUn2YPYpycpLAogICAgKDB4RkM4MSwgJ00nLCB1J9mD2YQnKSwKICAgICgweEZDODIsICdNJywgdSfZg9mFJyksCiAgICAoMHhGQzgzLCAnTScsIHUn2YPZiScpLAogICAgKDB4RkM4NCwgJ00nLCB1J9mD2YonKSwKICAgICgweEZDODUsICdNJywgdSfZhNmFJyksCiAgICAoMHhGQzg2LCAnTScsIHUn2YTZiScpLAogICAgKDB4RkM4NywgJ00nLCB1J9mE2YonKSwKICAgICgweEZDODgsICdNJywgdSfZhdinJyksCiAgICAoMHhGQzg5LCAnTScsIHUn2YXZhScpLAogICAgKDB4RkM4QSwgJ00nLCB1J9mG2LEnKSwKICAgICgweEZDOEIsICdNJywgdSfZhtiyJyksCiAgICAoMHhGQzhDLCAnTScsIHUn2YbZhScpLAogICAgKDB4RkM4RCwgJ00nLCB1J9mG2YYnKSwKICAgICgweEZDOEUsICdNJywgdSfZhtmJJyksCiAgICAoMHhGQzhGLCAnTScsIHUn2YbZiicpLAogICAgKDB4RkM5MCwgJ00nLCB1J9mJ2bAnKSwKICAgICgweEZDOTEsICdNJywgdSfZitixJyksCiAgICAoMHhGQzkyLCAnTScsIHUn2YrYsicpLAogICAgKDB4RkM5MywgJ00nLCB1J9mK2YUnKSwKICAgICgweEZDOTQsICdNJywgdSfZitmGJyksCiAgICAoMHhGQzk1LCAnTScsIHUn2YrZiScpLAogICAgKDB4RkM5NiwgJ00nLCB1J9mK2YonKSwKICAgICgweEZDOTcsICdNJywgdSfYptisJyksCiAgICAoMHhGQzk4LCAnTScsIHUn2KbYrScpLAogICAgKDB4RkM5OSwgJ00nLCB1J9im2K4nKSwKICAgICgweEZDOUEsICdNJywgdSfYptmFJyksCiAgICAoMHhGQzlCLCAnTScsIHUn2KbZhycpLAogICAgKDB4RkM5QywgJ00nLCB1J9io2KwnKSwKICAgICgweEZDOUQsICdNJywgdSfYqNitJyksCiAgICAoMHhGQzlFLCAnTScsIHUn2KjYricpLAogICAgKDB4RkM5RiwgJ00nLCB1J9io2YUnKSwKICAgICgweEZDQTAsICdNJywgdSfYqNmHJyksCiAgICAoMHhGQ0ExLCAnTScsIHUn2KrYrCcpLAogICAgKDB4RkNBMiwgJ00nLCB1J9iq2K0nKSwKICAgIF0KCmRlZiBfc2VnXzQ1KCk6CiAgICByZXR1cm4gWwogICAgKDB4RkNBMywgJ00nLCB1J9iq2K4nKSwKICAgICgweEZDQTQsICdNJywgdSfYqtmFJyksCiAgICAoMHhGQ0E1LCAnTScsIHUn2KrZhycpLAogICAgKDB4RkNBNiwgJ00nLCB1J9ir2YUnKSwKICAgICgweEZDQTcsICdNJywgdSfYrNitJyksCiAgICAoMHhGQ0E4LCAnTScsIHUn2KzZhScpLAogICAgKDB4RkNBOSwgJ00nLCB1J9it2KwnKSwKICAgICgweEZDQUEsICdNJywgdSfYrdmFJyksCiAgICAoMHhGQ0FCLCAnTScsIHUn2K7YrCcpLAogICAgKDB4RkNBQywgJ00nLCB1J9iu2YUnKSwKICAgICgweEZDQUQsICdNJywgdSfYs9isJyksCiAgICAoMHhGQ0FFLCAnTScsIHUn2LPYrScpLAogICAgKDB4RkNBRiwgJ00nLCB1J9iz2K4nKSwKICAgICgweEZDQjAsICdNJywgdSfYs9mFJyksCiAgICAoMHhGQ0IxLCAnTScsIHUn2LXYrScpLAogICAgKDB4RkNCMiwgJ00nLCB1J9i12K4nKSwKICAgICgweEZDQjMsICdNJywgdSfYtdmFJyksCiAgICAoMHhGQ0I0LCAnTScsIHUn2LbYrCcpLAogICAgKDB4RkNCNSwgJ00nLCB1J9i22K0nKSwKICAgICgweEZDQjYsICdNJywgdSfYttiuJyksCiAgICAoMHhGQ0I3LCAnTScsIHUn2LbZhScpLAogICAgKDB4RkNCOCwgJ00nLCB1J9i32K0nKSwKICAgICgweEZDQjksICdNJywgdSfYuNmFJyksCiAgICAoMHhGQ0JBLCAnTScsIHUn2LnYrCcpLAogICAgKDB4RkNCQiwgJ00nLCB1J9i52YUnKSwKICAgICgweEZDQkMsICdNJywgdSfYutisJyksCiAgICAoMHhGQ0JELCAnTScsIHUn2LrZhScpLAogICAgKDB4RkNCRSwgJ00nLCB1J9mB2KwnKSwKICAgICgweEZDQkYsICdNJywgdSfZgditJyksCiAgICAoMHhGQ0MwLCAnTScsIHUn2YHYricpLAogICAgKDB4RkNDMSwgJ00nLCB1J9mB2YUnKSwKICAgICgweEZDQzIsICdNJywgdSfZgtitJyksCiAgICAoMHhGQ0MzLCAnTScsIHUn2YLZhScpLAogICAgKDB4RkNDNCwgJ00nLCB1J9mD2KwnKSwKICAgICgweEZDQzUsICdNJywgdSfZg9itJyksCiAgICAoMHhGQ0M2LCAnTScsIHUn2YPYricpLAogICAgKDB4RkNDNywgJ00nLCB1J9mD2YQnKSwKICAgICgweEZDQzgsICdNJywgdSfZg9mFJyksCiAgICAoMHhGQ0M5LCAnTScsIHUn2YTYrCcpLAogICAgKDB4RkNDQSwgJ00nLCB1J9mE2K0nKSwKICAgICgweEZDQ0IsICdNJywgdSfZhNiuJyksCiAgICAoMHhGQ0NDLCAnTScsIHUn2YTZhScpLAogICAgKDB4RkNDRCwgJ00nLCB1J9mE2YcnKSwKICAgICgweEZDQ0UsICdNJywgdSfZhdisJyksCiAgICAoMHhGQ0NGLCAnTScsIHUn2YXYrScpLAogICAgKDB4RkNEMCwgJ00nLCB1J9mF2K4nKSwKICAgICgweEZDRDEsICdNJywgdSfZhdmFJyksCiAgICAoMHhGQ0QyLCAnTScsIHUn2YbYrCcpLAogICAgKDB4RkNEMywgJ00nLCB1J9mG2K0nKSwKICAgICgweEZDRDQsICdNJywgdSfZhtiuJyksCiAgICAoMHhGQ0Q1LCAnTScsIHUn2YbZhScpLAogICAgKDB4RkNENiwgJ00nLCB1J9mG2YcnKSwKICAgICgweEZDRDcsICdNJywgdSfZh9isJyksCiAgICAoMHhGQ0Q4LCAnTScsIHUn2YfZhScpLAogICAgKDB4RkNEOSwgJ00nLCB1J9mH2bAnKSwKICAgICgweEZDREEsICdNJywgdSfZitisJyksCiAgICAoMHhGQ0RCLCAnTScsIHUn2YrYrScpLAogICAgKDB4RkNEQywgJ00nLCB1J9mK2K4nKSwKICAgICgweEZDREQsICdNJywgdSfZitmFJyksCiAgICAoMHhGQ0RFLCAnTScsIHUn2YrZhycpLAogICAgKDB4RkNERiwgJ00nLCB1J9im2YUnKSwKICAgICgweEZDRTAsICdNJywgdSfYptmHJyksCiAgICAoMHhGQ0UxLCAnTScsIHUn2KjZhScpLAogICAgKDB4RkNFMiwgJ00nLCB1J9io2YcnKSwKICAgICgweEZDRTMsICdNJywgdSfYqtmFJyksCiAgICAoMHhGQ0U0LCAnTScsIHUn2KrZhycpLAogICAgKDB4RkNFNSwgJ00nLCB1J9ir2YUnKSwKICAgICgweEZDRTYsICdNJywgdSfYq9mHJyksCiAgICAoMHhGQ0U3LCAnTScsIHUn2LPZhScpLAogICAgKDB4RkNFOCwgJ00nLCB1J9iz2YcnKSwKICAgICgweEZDRTksICdNJywgdSfYtNmFJyksCiAgICAoMHhGQ0VBLCAnTScsIHUn2LTZhycpLAogICAgKDB4RkNFQiwgJ00nLCB1J9mD2YQnKSwKICAgICgweEZDRUMsICdNJywgdSfZg9mFJyksCiAgICAoMHhGQ0VELCAnTScsIHUn2YTZhScpLAogICAgKDB4RkNFRSwgJ00nLCB1J9mG2YUnKSwKICAgICgweEZDRUYsICdNJywgdSfZhtmHJyksCiAgICAoMHhGQ0YwLCAnTScsIHUn2YrZhScpLAogICAgKDB4RkNGMSwgJ00nLCB1J9mK2YcnKSwKICAgICgweEZDRjIsICdNJywgdSfZgNmO2ZEnKSwKICAgICgweEZDRjMsICdNJywgdSfZgNmP2ZEnKSwKICAgICgweEZDRjQsICdNJywgdSfZgNmQ2ZEnKSwKICAgICgweEZDRjUsICdNJywgdSfYt9mJJyksCiAgICAoMHhGQ0Y2LCAnTScsIHUn2LfZiicpLAogICAgKDB4RkNGNywgJ00nLCB1J9i52YknKSwKICAgICgweEZDRjgsICdNJywgdSfYudmKJyksCiAgICAoMHhGQ0Y5LCAnTScsIHUn2LrZiScpLAogICAgKDB4RkNGQSwgJ00nLCB1J9i62YonKSwKICAgICgweEZDRkIsICdNJywgdSfYs9mJJyksCiAgICAoMHhGQ0ZDLCAnTScsIHUn2LPZiicpLAogICAgKDB4RkNGRCwgJ00nLCB1J9i02YknKSwKICAgICgweEZDRkUsICdNJywgdSfYtNmKJyksCiAgICAoMHhGQ0ZGLCAnTScsIHUn2K3ZiScpLAogICAgKDB4RkQwMCwgJ00nLCB1J9it2YonKSwKICAgICgweEZEMDEsICdNJywgdSfYrNmJJyksCiAgICAoMHhGRDAyLCAnTScsIHUn2KzZiicpLAogICAgKDB4RkQwMywgJ00nLCB1J9iu2YknKSwKICAgICgweEZEMDQsICdNJywgdSfYrtmKJyksCiAgICAoMHhGRDA1LCAnTScsIHUn2LXZiScpLAogICAgKDB4RkQwNiwgJ00nLCB1J9i12YonKSwKICAgIF0KCmRlZiBfc2VnXzQ2KCk6CiAgICByZXR1cm4gWwogICAgKDB4RkQwNywgJ00nLCB1J9i22YknKSwKICAgICgweEZEMDgsICdNJywgdSfYttmKJyksCiAgICAoMHhGRDA5LCAnTScsIHUn2LTYrCcpLAogICAgKDB4RkQwQSwgJ00nLCB1J9i02K0nKSwKICAgICgweEZEMEIsICdNJywgdSfYtNiuJyksCiAgICAoMHhGRDBDLCAnTScsIHUn2LTZhScpLAogICAgKDB4RkQwRCwgJ00nLCB1J9i02LEnKSwKICAgICgweEZEMEUsICdNJywgdSfYs9ixJyksCiAgICAoMHhGRDBGLCAnTScsIHUn2LXYsScpLAogICAgKDB4RkQxMCwgJ00nLCB1J9i22LEnKSwKICAgICgweEZEMTEsICdNJywgdSfYt9mJJyksCiAgICAoMHhGRDEyLCAnTScsIHUn2LfZiicpLAogICAgKDB4RkQxMywgJ00nLCB1J9i52YknKSwKICAgICgweEZEMTQsICdNJywgdSfYudmKJyksCiAgICAoMHhGRDE1LCAnTScsIHUn2LrZiScpLAogICAgKDB4RkQxNiwgJ00nLCB1J9i62YonKSwKICAgICgweEZEMTcsICdNJywgdSfYs9mJJyksCiAgICAoMHhGRDE4LCAnTScsIHUn2LPZiicpLAogICAgKDB4RkQxOSwgJ00nLCB1J9i02YknKSwKICAgICgweEZEMUEsICdNJywgdSfYtNmKJyksCiAgICAoMHhGRDFCLCAnTScsIHUn2K3ZiScpLAogICAgKDB4RkQxQywgJ00nLCB1J9it2YonKSwKICAgICgweEZEMUQsICdNJywgdSfYrNmJJyksCiAgICAoMHhGRDFFLCAnTScsIHUn2KzZiicpLAogICAgKDB4RkQxRiwgJ00nLCB1J9iu2YknKSwKICAgICgweEZEMjAsICdNJywgdSfYrtmKJyksCiAgICAoMHhGRDIxLCAnTScsIHUn2LXZiScpLAogICAgKDB4RkQyMiwgJ00nLCB1J9i12YonKSwKICAgICgweEZEMjMsICdNJywgdSfYttmJJyksCiAgICAoMHhGRDI0LCAnTScsIHUn2LbZiicpLAogICAgKDB4RkQyNSwgJ00nLCB1J9i02KwnKSwKICAgICgweEZEMjYsICdNJywgdSfYtNitJyksCiAgICAoMHhGRDI3LCAnTScsIHUn2LTYricpLAogICAgKDB4RkQyOCwgJ00nLCB1J9i02YUnKSwKICAgICgweEZEMjksICdNJywgdSfYtNixJyksCiAgICAoMHhGRDJBLCAnTScsIHUn2LPYsScpLAogICAgKDB4RkQyQiwgJ00nLCB1J9i12LEnKSwKICAgICgweEZEMkMsICdNJywgdSfYttixJyksCiAgICAoMHhGRDJELCAnTScsIHUn2LTYrCcpLAogICAgKDB4RkQyRSwgJ00nLCB1J9i02K0nKSwKICAgICgweEZEMkYsICdNJywgdSfYtNiuJyksCiAgICAoMHhGRDMwLCAnTScsIHUn2LTZhScpLAogICAgKDB4RkQzMSwgJ00nLCB1J9iz2YcnKSwKICAgICgweEZEMzIsICdNJywgdSfYtNmHJyksCiAgICAoMHhGRDMzLCAnTScsIHUn2LfZhScpLAogICAgKDB4RkQzNCwgJ00nLCB1J9iz2KwnKSwKICAgICgweEZEMzUsICdNJywgdSfYs9itJyksCiAgICAoMHhGRDM2LCAnTScsIHUn2LPYricpLAogICAgKDB4RkQzNywgJ00nLCB1J9i02KwnKSwKICAgICgweEZEMzgsICdNJywgdSfYtNitJyksCiAgICAoMHhGRDM5LCAnTScsIHUn2LTYricpLAogICAgKDB4RkQzQSwgJ00nLCB1J9i32YUnKSwKICAgICgweEZEM0IsICdNJywgdSfYuNmFJyksCiAgICAoMHhGRDNDLCAnTScsIHUn2KfZiycpLAogICAgKDB4RkQzRSwgJ1YnKSwKICAgICgweEZENDAsICdYJyksCiAgICAoMHhGRDUwLCAnTScsIHUn2KrYrNmFJyksCiAgICAoMHhGRDUxLCAnTScsIHUn2KrYrdisJyksCiAgICAoMHhGRDUzLCAnTScsIHUn2KrYrdmFJyksCiAgICAoMHhGRDU0LCAnTScsIHUn2KrYrtmFJyksCiAgICAoMHhGRDU1LCAnTScsIHUn2KrZhdisJyksCiAgICAoMHhGRDU2LCAnTScsIHUn2KrZhditJyksCiAgICAoMHhGRDU3LCAnTScsIHUn2KrZhdiuJyksCiAgICAoMHhGRDU4LCAnTScsIHUn2KzZhditJyksCiAgICAoMHhGRDVBLCAnTScsIHUn2K3ZhdmKJyksCiAgICAoMHhGRDVCLCAnTScsIHUn2K3ZhdmJJyksCiAgICAoMHhGRDVDLCAnTScsIHUn2LPYrdisJyksCiAgICAoMHhGRDVELCAnTScsIHUn2LPYrNitJyksCiAgICAoMHhGRDVFLCAnTScsIHUn2LPYrNmJJyksCiAgICAoMHhGRDVGLCAnTScsIHUn2LPZhditJyksCiAgICAoMHhGRDYxLCAnTScsIHUn2LPZhdisJyksCiAgICAoMHhGRDYyLCAnTScsIHUn2LPZhdmFJyksCiAgICAoMHhGRDY0LCAnTScsIHUn2LXYrditJyksCiAgICAoMHhGRDY2LCAnTScsIHUn2LXZhdmFJyksCiAgICAoMHhGRDY3LCAnTScsIHUn2LTYrdmFJyksCiAgICAoMHhGRDY5LCAnTScsIHUn2LTYrNmKJyksCiAgICAoMHhGRDZBLCAnTScsIHUn2LTZhdiuJyksCiAgICAoMHhGRDZDLCAnTScsIHUn2LTZhdmFJyksCiAgICAoMHhGRDZFLCAnTScsIHUn2LbYrdmJJyksCiAgICAoMHhGRDZGLCAnTScsIHUn2LbYrtmFJyksCiAgICAoMHhGRDcxLCAnTScsIHUn2LfZhditJyksCiAgICAoMHhGRDczLCAnTScsIHUn2LfZhdmFJyksCiAgICAoMHhGRDc0LCAnTScsIHUn2LfZhdmKJyksCiAgICAoMHhGRDc1LCAnTScsIHUn2LnYrNmFJyksCiAgICAoMHhGRDc2LCAnTScsIHUn2LnZhdmFJyksCiAgICAoMHhGRDc4LCAnTScsIHUn2LnZhdmJJyksCiAgICAoMHhGRDc5LCAnTScsIHUn2LrZhdmFJyksCiAgICAoMHhGRDdBLCAnTScsIHUn2LrZhdmKJyksCiAgICAoMHhGRDdCLCAnTScsIHUn2LrZhdmJJyksCiAgICAoMHhGRDdDLCAnTScsIHUn2YHYrtmFJyksCiAgICAoMHhGRDdFLCAnTScsIHUn2YLZhditJyksCiAgICAoMHhGRDdGLCAnTScsIHUn2YLZhdmFJyksCiAgICAoMHhGRDgwLCAnTScsIHUn2YTYrdmFJyksCiAgICAoMHhGRDgxLCAnTScsIHUn2YTYrdmKJyksCiAgICAoMHhGRDgyLCAnTScsIHUn2YTYrdmJJyksCiAgICAoMHhGRDgzLCAnTScsIHUn2YTYrNisJyksCiAgICAoMHhGRDg1LCAnTScsIHUn2YTYrtmFJyksCiAgICAoMHhGRDg3LCAnTScsIHUn2YTZhditJyksCiAgICAoMHhGRDg5LCAnTScsIHUn2YXYrdisJyksCiAgICAoMHhGRDhBLCAnTScsIHUn2YXYrdmFJyksCiAgICBdCgpkZWYgX3NlZ180NygpOgogICAgcmV0dXJuIFsKICAgICgweEZEOEIsICdNJywgdSfZhdit2YonKSwKICAgICgweEZEOEMsICdNJywgdSfZhdis2K0nKSwKICAgICgweEZEOEQsICdNJywgdSfZhdis2YUnKSwKICAgICgweEZEOEUsICdNJywgdSfZhdiu2KwnKSwKICAgICgweEZEOEYsICdNJywgdSfZhdiu2YUnKSwKICAgICgweEZEOTAsICdYJyksCiAgICAoMHhGRDkyLCAnTScsIHUn2YXYrNiuJyksCiAgICAoMHhGRDkzLCAnTScsIHUn2YfZhdisJyksCiAgICAoMHhGRDk0LCAnTScsIHUn2YfZhdmFJyksCiAgICAoMHhGRDk1LCAnTScsIHUn2YbYrdmFJyksCiAgICAoMHhGRDk2LCAnTScsIHUn2YbYrdmJJyksCiAgICAoMHhGRDk3LCAnTScsIHUn2YbYrNmFJyksCiAgICAoMHhGRDk5LCAnTScsIHUn2YbYrNmJJyksCiAgICAoMHhGRDlBLCAnTScsIHUn2YbZhdmKJyksCiAgICAoMHhGRDlCLCAnTScsIHUn2YbZhdmJJyksCiAgICAoMHhGRDlDLCAnTScsIHUn2YrZhdmFJyksCiAgICAoMHhGRDlFLCAnTScsIHUn2KjYrtmKJyksCiAgICAoMHhGRDlGLCAnTScsIHUn2KrYrNmKJyksCiAgICAoMHhGREEwLCAnTScsIHUn2KrYrNmJJyksCiAgICAoMHhGREExLCAnTScsIHUn2KrYrtmKJyksCiAgICAoMHhGREEyLCAnTScsIHUn2KrYrtmJJyksCiAgICAoMHhGREEzLCAnTScsIHUn2KrZhdmKJyksCiAgICAoMHhGREE0LCAnTScsIHUn2KrZhdmJJyksCiAgICAoMHhGREE1LCAnTScsIHUn2KzZhdmKJyksCiAgICAoMHhGREE2LCAnTScsIHUn2KzYrdmJJyksCiAgICAoMHhGREE3LCAnTScsIHUn2KzZhdmJJyksCiAgICAoMHhGREE4LCAnTScsIHUn2LPYrtmJJyksCiAgICAoMHhGREE5LCAnTScsIHUn2LXYrdmKJyksCiAgICAoMHhGREFBLCAnTScsIHUn2LTYrdmKJyksCiAgICAoMHhGREFCLCAnTScsIHUn2LbYrdmKJyksCiAgICAoMHhGREFDLCAnTScsIHUn2YTYrNmKJyksCiAgICAoMHhGREFELCAnTScsIHUn2YTZhdmKJyksCiAgICAoMHhGREFFLCAnTScsIHUn2YrYrdmKJyksCiAgICAoMHhGREFGLCAnTScsIHUn2YrYrNmKJyksCiAgICAoMHhGREIwLCAnTScsIHUn2YrZhdmKJyksCiAgICAoMHhGREIxLCAnTScsIHUn2YXZhdmKJyksCiAgICAoMHhGREIyLCAnTScsIHUn2YLZhdmKJyksCiAgICAoMHhGREIzLCAnTScsIHUn2YbYrdmKJyksCiAgICAoMHhGREI0LCAnTScsIHUn2YLZhditJyksCiAgICAoMHhGREI1LCAnTScsIHUn2YTYrdmFJyksCiAgICAoMHhGREI2LCAnTScsIHUn2LnZhdmKJyksCiAgICAoMHhGREI3LCAnTScsIHUn2YPZhdmKJyksCiAgICAoMHhGREI4LCAnTScsIHUn2YbYrNitJyksCiAgICAoMHhGREI5LCAnTScsIHUn2YXYrtmKJyksCiAgICAoMHhGREJBLCAnTScsIHUn2YTYrNmFJyksCiAgICAoMHhGREJCLCAnTScsIHUn2YPZhdmFJyksCiAgICAoMHhGREJDLCAnTScsIHUn2YTYrNmFJyksCiAgICAoMHhGREJELCAnTScsIHUn2YbYrNitJyksCiAgICAoMHhGREJFLCAnTScsIHUn2KzYrdmKJyksCiAgICAoMHhGREJGLCAnTScsIHUn2K3YrNmKJyksCiAgICAoMHhGREMwLCAnTScsIHUn2YXYrNmKJyksCiAgICAoMHhGREMxLCAnTScsIHUn2YHZhdmKJyksCiAgICAoMHhGREMyLCAnTScsIHUn2KjYrdmKJyksCiAgICAoMHhGREMzLCAnTScsIHUn2YPZhdmFJyksCiAgICAoMHhGREM0LCAnTScsIHUn2LnYrNmFJyksCiAgICAoMHhGREM1LCAnTScsIHUn2LXZhdmFJyksCiAgICAoMHhGREM2LCAnTScsIHUn2LPYrtmKJyksCiAgICAoMHhGREM3LCAnTScsIHUn2YbYrNmKJyksCiAgICAoMHhGREM4LCAnWCcpLAogICAgKDB4RkRGMCwgJ00nLCB1J9i12YTbkicpLAogICAgKDB4RkRGMSwgJ00nLCB1J9mC2YTbkicpLAogICAgKDB4RkRGMiwgJ00nLCB1J9in2YTZhNmHJyksCiAgICAoMHhGREYzLCAnTScsIHUn2KfZg9io2LEnKSwKICAgICgweEZERjQsICdNJywgdSfZhdit2YXYrycpLAogICAgKDB4RkRGNSwgJ00nLCB1J9i12YTYudmFJyksCiAgICAoMHhGREY2LCAnTScsIHUn2LHYs9mI2YQnKSwKICAgICgweEZERjcsICdNJywgdSfYudmE2YrZhycpLAogICAgKDB4RkRGOCwgJ00nLCB1J9mI2LPZhNmFJyksCiAgICAoMHhGREY5LCAnTScsIHUn2LXZhNmJJyksCiAgICAoMHhGREZBLCAnMycsIHUn2LXZhNmJINin2YTZhNmHINi52YTZitmHINmI2LPZhNmFJyksCiAgICAoMHhGREZCLCAnMycsIHUn2KzZhCDYrNmE2KfZhNmHJyksCiAgICAoMHhGREZDLCAnTScsIHUn2LHbjNin2YQnKSwKICAgICgweEZERkQsICdWJyksCiAgICAoMHhGREZFLCAnWCcpLAogICAgKDB4RkUwMCwgJ0knKSwKICAgICgweEZFMTAsICczJywgdScsJyksCiAgICAoMHhGRTExLCAnTScsIHUn44CBJyksCiAgICAoMHhGRTEyLCAnWCcpLAogICAgKDB4RkUxMywgJzMnLCB1JzonKSwKICAgICgweEZFMTQsICczJywgdSc7JyksCiAgICAoMHhGRTE1LCAnMycsIHUnIScpLAogICAgKDB4RkUxNiwgJzMnLCB1Jz8nKSwKICAgICgweEZFMTcsICdNJywgdSfjgJYnKSwKICAgICgweEZFMTgsICdNJywgdSfjgJcnKSwKICAgICgweEZFMTksICdYJyksCiAgICAoMHhGRTIwLCAnVicpLAogICAgKDB4RkUyNywgJ1gnKSwKICAgICgweEZFMzEsICdNJywgdSfigJQnKSwKICAgICgweEZFMzIsICdNJywgdSfigJMnKSwKICAgICgweEZFMzMsICczJywgdSdfJyksCiAgICAoMHhGRTM1LCAnMycsIHUnKCcpLAogICAgKDB4RkUzNiwgJzMnLCB1JyknKSwKICAgICgweEZFMzcsICczJywgdSd7JyksCiAgICAoMHhGRTM4LCAnMycsIHUnfScpLAogICAgKDB4RkUzOSwgJ00nLCB1J+OAlCcpLAogICAgKDB4RkUzQSwgJ00nLCB1J+OAlScpLAogICAgKDB4RkUzQiwgJ00nLCB1J+OAkCcpLAogICAgKDB4RkUzQywgJ00nLCB1J+OAkScpLAogICAgKDB4RkUzRCwgJ00nLCB1J+OAiicpLAogICAgKDB4RkUzRSwgJ00nLCB1J+OAiycpLAogICAgXQoKZGVmIF9zZWdfNDgoKToKICAgIHJldHVybiBbCiAgICAoMHhGRTNGLCAnTScsIHUn44CIJyksCiAgICAoMHhGRTQwLCAnTScsIHUn44CJJyksCiAgICAoMHhGRTQxLCAnTScsIHUn44CMJyksCiAgICAoMHhGRTQyLCAnTScsIHUn44CNJyksCiAgICAoMHhGRTQzLCAnTScsIHUn44COJyksCiAgICAoMHhGRTQ0LCAnTScsIHUn44CPJyksCiAgICAoMHhGRTQ1LCAnVicpLAogICAgKDB4RkU0NywgJzMnLCB1J1snKSwKICAgICgweEZFNDgsICczJywgdSddJyksCiAgICAoMHhGRTQ5LCAnMycsIHUnIMyFJyksCiAgICAoMHhGRTRELCAnMycsIHUnXycpLAogICAgKDB4RkU1MCwgJzMnLCB1JywnKSwKICAgICgweEZFNTEsICdNJywgdSfjgIEnKSwKICAgICgweEZFNTIsICdYJyksCiAgICAoMHhGRTU0LCAnMycsIHUnOycpLAogICAgKDB4RkU1NSwgJzMnLCB1JzonKSwKICAgICgweEZFNTYsICczJywgdSc/JyksCiAgICAoMHhGRTU3LCAnMycsIHUnIScpLAogICAgKDB4RkU1OCwgJ00nLCB1J+KAlCcpLAogICAgKDB4RkU1OSwgJzMnLCB1JygnKSwKICAgICgweEZFNUEsICczJywgdScpJyksCiAgICAoMHhGRTVCLCAnMycsIHUneycpLAogICAgKDB4RkU1QywgJzMnLCB1J30nKSwKICAgICgweEZFNUQsICdNJywgdSfjgJQnKSwKICAgICgweEZFNUUsICdNJywgdSfjgJUnKSwKICAgICgweEZFNUYsICczJywgdScjJyksCiAgICAoMHhGRTYwLCAnMycsIHUnJicpLAogICAgKDB4RkU2MSwgJzMnLCB1JyonKSwKICAgICgweEZFNjIsICczJywgdScrJyksCiAgICAoMHhGRTYzLCAnTScsIHUnLScpLAogICAgKDB4RkU2NCwgJzMnLCB1JzwnKSwKICAgICgweEZFNjUsICczJywgdSc+JyksCiAgICAoMHhGRTY2LCAnMycsIHUnPScpLAogICAgKDB4RkU2NywgJ1gnKSwKICAgICgweEZFNjgsICczJywgdSdcXCcpLAogICAgKDB4RkU2OSwgJzMnLCB1JyQnKSwKICAgICgweEZFNkEsICczJywgdSclJyksCiAgICAoMHhGRTZCLCAnMycsIHUnQCcpLAogICAgKDB4RkU2QywgJ1gnKSwKICAgICgweEZFNzAsICczJywgdScg2YsnKSwKICAgICgweEZFNzEsICdNJywgdSfZgNmLJyksCiAgICAoMHhGRTcyLCAnMycsIHUnINmMJyksCiAgICAoMHhGRTczLCAnVicpLAogICAgKDB4RkU3NCwgJzMnLCB1JyDZjScpLAogICAgKDB4RkU3NSwgJ1gnKSwKICAgICgweEZFNzYsICczJywgdScg2Y4nKSwKICAgICgweEZFNzcsICdNJywgdSfZgNmOJyksCiAgICAoMHhGRTc4LCAnMycsIHUnINmPJyksCiAgICAoMHhGRTc5LCAnTScsIHUn2YDZjycpLAogICAgKDB4RkU3QSwgJzMnLCB1JyDZkCcpLAogICAgKDB4RkU3QiwgJ00nLCB1J9mA2ZAnKSwKICAgICgweEZFN0MsICczJywgdScg2ZEnKSwKICAgICgweEZFN0QsICdNJywgdSfZgNmRJyksCiAgICAoMHhGRTdFLCAnMycsIHUnINmSJyksCiAgICAoMHhGRTdGLCAnTScsIHUn2YDZkicpLAogICAgKDB4RkU4MCwgJ00nLCB1J9ihJyksCiAgICAoMHhGRTgxLCAnTScsIHUn2KInKSwKICAgICgweEZFODMsICdNJywgdSfYoycpLAogICAgKDB4RkU4NSwgJ00nLCB1J9ikJyksCiAgICAoMHhGRTg3LCAnTScsIHUn2KUnKSwKICAgICgweEZFODksICdNJywgdSfYpicpLAogICAgKDB4RkU4RCwgJ00nLCB1J9inJyksCiAgICAoMHhGRThGLCAnTScsIHUn2KgnKSwKICAgICgweEZFOTMsICdNJywgdSfYqScpLAogICAgKDB4RkU5NSwgJ00nLCB1J9iqJyksCiAgICAoMHhGRTk5LCAnTScsIHUn2KsnKSwKICAgICgweEZFOUQsICdNJywgdSfYrCcpLAogICAgKDB4RkVBMSwgJ00nLCB1J9itJyksCiAgICAoMHhGRUE1LCAnTScsIHUn2K4nKSwKICAgICgweEZFQTksICdNJywgdSfYrycpLAogICAgKDB4RkVBQiwgJ00nLCB1J9iwJyksCiAgICAoMHhGRUFELCAnTScsIHUn2LEnKSwKICAgICgweEZFQUYsICdNJywgdSfYsicpLAogICAgKDB4RkVCMSwgJ00nLCB1J9izJyksCiAgICAoMHhGRUI1LCAnTScsIHUn2LQnKSwKICAgICgweEZFQjksICdNJywgdSfYtScpLAogICAgKDB4RkVCRCwgJ00nLCB1J9i2JyksCiAgICAoMHhGRUMxLCAnTScsIHUn2LcnKSwKICAgICgweEZFQzUsICdNJywgdSfYuCcpLAogICAgKDB4RkVDOSwgJ00nLCB1J9i5JyksCiAgICAoMHhGRUNELCAnTScsIHUn2LonKSwKICAgICgweEZFRDEsICdNJywgdSfZgScpLAogICAgKDB4RkVENSwgJ00nLCB1J9mCJyksCiAgICAoMHhGRUQ5LCAnTScsIHUn2YMnKSwKICAgICgweEZFREQsICdNJywgdSfZhCcpLAogICAgKDB4RkVFMSwgJ00nLCB1J9mFJyksCiAgICAoMHhGRUU1LCAnTScsIHUn2YYnKSwKICAgICgweEZFRTksICdNJywgdSfZhycpLAogICAgKDB4RkVFRCwgJ00nLCB1J9mIJyksCiAgICAoMHhGRUVGLCAnTScsIHUn2YknKSwKICAgICgweEZFRjEsICdNJywgdSfZiicpLAogICAgKDB4RkVGNSwgJ00nLCB1J9mE2KInKSwKICAgICgweEZFRjcsICdNJywgdSfZhNijJyksCiAgICAoMHhGRUY5LCAnTScsIHUn2YTYpScpLAogICAgKDB4RkVGQiwgJ00nLCB1J9mE2KcnKSwKICAgICgweEZFRkQsICdYJyksCiAgICAoMHhGRUZGLCAnSScpLAogICAgKDB4RkYwMCwgJ1gnKSwKICAgICgweEZGMDEsICczJywgdSchJyksCiAgICAoMHhGRjAyLCAnMycsIHUnIicpLAogICAgXQoKZGVmIF9zZWdfNDkoKToKICAgIHJldHVybiBbCiAgICAoMHhGRjAzLCAnMycsIHUnIycpLAogICAgKDB4RkYwNCwgJzMnLCB1JyQnKSwKICAgICgweEZGMDUsICczJywgdSclJyksCiAgICAoMHhGRjA2LCAnMycsIHUnJicpLAogICAgKDB4RkYwNywgJzMnLCB1J1wnJyksCiAgICAoMHhGRjA4LCAnMycsIHUnKCcpLAogICAgKDB4RkYwOSwgJzMnLCB1JyknKSwKICAgICgweEZGMEEsICczJywgdScqJyksCiAgICAoMHhGRjBCLCAnMycsIHUnKycpLAogICAgKDB4RkYwQywgJzMnLCB1JywnKSwKICAgICgweEZGMEQsICdNJywgdSctJyksCiAgICAoMHhGRjBFLCAnTScsIHUnLicpLAogICAgKDB4RkYwRiwgJzMnLCB1Jy8nKSwKICAgICgweEZGMTAsICdNJywgdScwJyksCiAgICAoMHhGRjExLCAnTScsIHUnMScpLAogICAgKDB4RkYxMiwgJ00nLCB1JzInKSwKICAgICgweEZGMTMsICdNJywgdSczJyksCiAgICAoMHhGRjE0LCAnTScsIHUnNCcpLAogICAgKDB4RkYxNSwgJ00nLCB1JzUnKSwKICAgICgweEZGMTYsICdNJywgdSc2JyksCiAgICAoMHhGRjE3LCAnTScsIHUnNycpLAogICAgKDB4RkYxOCwgJ00nLCB1JzgnKSwKICAgICgweEZGMTksICdNJywgdSc5JyksCiAgICAoMHhGRjFBLCAnMycsIHUnOicpLAogICAgKDB4RkYxQiwgJzMnLCB1JzsnKSwKICAgICgweEZGMUMsICczJywgdSc8JyksCiAgICAoMHhGRjFELCAnMycsIHUnPScpLAogICAgKDB4RkYxRSwgJzMnLCB1Jz4nKSwKICAgICgweEZGMUYsICczJywgdSc/JyksCiAgICAoMHhGRjIwLCAnMycsIHUnQCcpLAogICAgKDB4RkYyMSwgJ00nLCB1J2EnKSwKICAgICgweEZGMjIsICdNJywgdSdiJyksCiAgICAoMHhGRjIzLCAnTScsIHUnYycpLAogICAgKDB4RkYyNCwgJ00nLCB1J2QnKSwKICAgICgweEZGMjUsICdNJywgdSdlJyksCiAgICAoMHhGRjI2LCAnTScsIHUnZicpLAogICAgKDB4RkYyNywgJ00nLCB1J2cnKSwKICAgICgweEZGMjgsICdNJywgdSdoJyksCiAgICAoMHhGRjI5LCAnTScsIHUnaScpLAogICAgKDB4RkYyQSwgJ00nLCB1J2onKSwKICAgICgweEZGMkIsICdNJywgdSdrJyksCiAgICAoMHhGRjJDLCAnTScsIHUnbCcpLAogICAgKDB4RkYyRCwgJ00nLCB1J20nKSwKICAgICgweEZGMkUsICdNJywgdSduJyksCiAgICAoMHhGRjJGLCAnTScsIHUnbycpLAogICAgKDB4RkYzMCwgJ00nLCB1J3AnKSwKICAgICgweEZGMzEsICdNJywgdSdxJyksCiAgICAoMHhGRjMyLCAnTScsIHUncicpLAogICAgKDB4RkYzMywgJ00nLCB1J3MnKSwKICAgICgweEZGMzQsICdNJywgdSd0JyksCiAgICAoMHhGRjM1LCAnTScsIHUndScpLAogICAgKDB4RkYzNiwgJ00nLCB1J3YnKSwKICAgICgweEZGMzcsICdNJywgdSd3JyksCiAgICAoMHhGRjM4LCAnTScsIHUneCcpLAogICAgKDB4RkYzOSwgJ00nLCB1J3knKSwKICAgICgweEZGM0EsICdNJywgdSd6JyksCiAgICAoMHhGRjNCLCAnMycsIHUnWycpLAogICAgKDB4RkYzQywgJzMnLCB1J1xcJyksCiAgICAoMHhGRjNELCAnMycsIHUnXScpLAogICAgKDB4RkYzRSwgJzMnLCB1J14nKSwKICAgICgweEZGM0YsICczJywgdSdfJyksCiAgICAoMHhGRjQwLCAnMycsIHUnYCcpLAogICAgKDB4RkY0MSwgJ00nLCB1J2EnKSwKICAgICgweEZGNDIsICdNJywgdSdiJyksCiAgICAoMHhGRjQzLCAnTScsIHUnYycpLAogICAgKDB4RkY0NCwgJ00nLCB1J2QnKSwKICAgICgweEZGNDUsICdNJywgdSdlJyksCiAgICAoMHhGRjQ2LCAnTScsIHUnZicpLAogICAgKDB4RkY0NywgJ00nLCB1J2cnKSwKICAgICgweEZGNDgsICdNJywgdSdoJyksCiAgICAoMHhGRjQ5LCAnTScsIHUnaScpLAogICAgKDB4RkY0QSwgJ00nLCB1J2onKSwKICAgICgweEZGNEIsICdNJywgdSdrJyksCiAgICAoMHhGRjRDLCAnTScsIHUnbCcpLAogICAgKDB4RkY0RCwgJ00nLCB1J20nKSwKICAgICgweEZGNEUsICdNJywgdSduJyksCiAgICAoMHhGRjRGLCAnTScsIHUnbycpLAogICAgKDB4RkY1MCwgJ00nLCB1J3AnKSwKICAgICgweEZGNTEsICdNJywgdSdxJyksCiAgICAoMHhGRjUyLCAnTScsIHUncicpLAogICAgKDB4RkY1MywgJ00nLCB1J3MnKSwKICAgICgweEZGNTQsICdNJywgdSd0JyksCiAgICAoMHhGRjU1LCAnTScsIHUndScpLAogICAgKDB4RkY1NiwgJ00nLCB1J3YnKSwKICAgICgweEZGNTcsICdNJywgdSd3JyksCiAgICAoMHhGRjU4LCAnTScsIHUneCcpLAogICAgKDB4RkY1OSwgJ00nLCB1J3knKSwKICAgICgweEZGNUEsICdNJywgdSd6JyksCiAgICAoMHhGRjVCLCAnMycsIHUneycpLAogICAgKDB4RkY1QywgJzMnLCB1J3wnKSwKICAgICgweEZGNUQsICczJywgdSd9JyksCiAgICAoMHhGRjVFLCAnMycsIHUnficpLAogICAgKDB4RkY1RiwgJ00nLCB1J+KmhScpLAogICAgKDB4RkY2MCwgJ00nLCB1J+KmhicpLAogICAgKDB4RkY2MSwgJ00nLCB1Jy4nKSwKICAgICgweEZGNjIsICdNJywgdSfjgIwnKSwKICAgICgweEZGNjMsICdNJywgdSfjgI0nKSwKICAgICgweEZGNjQsICdNJywgdSfjgIEnKSwKICAgICgweEZGNjUsICdNJywgdSfjg7snKSwKICAgICgweEZGNjYsICdNJywgdSfjg7InKSwKICAgIF0KCmRlZiBfc2VnXzUwKCk6CiAgICByZXR1cm4gWwogICAgKDB4RkY2NywgJ00nLCB1J+OCoScpLAogICAgKDB4RkY2OCwgJ00nLCB1J+OCoycpLAogICAgKDB4RkY2OSwgJ00nLCB1J+OCpScpLAogICAgKDB4RkY2QSwgJ00nLCB1J+OCpycpLAogICAgKDB4RkY2QiwgJ00nLCB1J+OCqScpLAogICAgKDB4RkY2QywgJ00nLCB1J+ODoycpLAogICAgKDB4RkY2RCwgJ00nLCB1J+ODpScpLAogICAgKDB4RkY2RSwgJ00nLCB1J+ODpycpLAogICAgKDB4RkY2RiwgJ00nLCB1J+ODgycpLAogICAgKDB4RkY3MCwgJ00nLCB1J+ODvCcpLAogICAgKDB4RkY3MSwgJ00nLCB1J+OCoicpLAogICAgKDB4RkY3MiwgJ00nLCB1J+OCpCcpLAogICAgKDB4RkY3MywgJ00nLCB1J+OCpicpLAogICAgKDB4RkY3NCwgJ00nLCB1J+OCqCcpLAogICAgKDB4RkY3NSwgJ00nLCB1J+OCqicpLAogICAgKDB4RkY3NiwgJ00nLCB1J+OCqycpLAogICAgKDB4RkY3NywgJ00nLCB1J+OCrScpLAogICAgKDB4RkY3OCwgJ00nLCB1J+OCrycpLAogICAgKDB4RkY3OSwgJ00nLCB1J+OCsScpLAogICAgKDB4RkY3QSwgJ00nLCB1J+OCsycpLAogICAgKDB4RkY3QiwgJ00nLCB1J+OCtScpLAogICAgKDB4RkY3QywgJ00nLCB1J+OCtycpLAogICAgKDB4RkY3RCwgJ00nLCB1J+OCuScpLAogICAgKDB4RkY3RSwgJ00nLCB1J+OCuycpLAogICAgKDB4RkY3RiwgJ00nLCB1J+OCvScpLAogICAgKDB4RkY4MCwgJ00nLCB1J+OCvycpLAogICAgKDB4RkY4MSwgJ00nLCB1J+ODgScpLAogICAgKDB4RkY4MiwgJ00nLCB1J+ODhCcpLAogICAgKDB4RkY4MywgJ00nLCB1J+ODhicpLAogICAgKDB4RkY4NCwgJ00nLCB1J+ODiCcpLAogICAgKDB4RkY4NSwgJ00nLCB1J+ODiicpLAogICAgKDB4RkY4NiwgJ00nLCB1J+ODiycpLAogICAgKDB4RkY4NywgJ00nLCB1J+ODjCcpLAogICAgKDB4RkY4OCwgJ00nLCB1J+ODjScpLAogICAgKDB4RkY4OSwgJ00nLCB1J+ODjicpLAogICAgKDB4RkY4QSwgJ00nLCB1J+ODjycpLAogICAgKDB4RkY4QiwgJ00nLCB1J+ODkicpLAogICAgKDB4RkY4QywgJ00nLCB1J+ODlScpLAogICAgKDB4RkY4RCwgJ00nLCB1J+ODmCcpLAogICAgKDB4RkY4RSwgJ00nLCB1J+ODmycpLAogICAgKDB4RkY4RiwgJ00nLCB1J+ODnicpLAogICAgKDB4RkY5MCwgJ00nLCB1J+ODnycpLAogICAgKDB4RkY5MSwgJ00nLCB1J+ODoCcpLAogICAgKDB4RkY5MiwgJ00nLCB1J+ODoScpLAogICAgKDB4RkY5MywgJ00nLCB1J+ODoicpLAogICAgKDB4RkY5NCwgJ00nLCB1J+ODpCcpLAogICAgKDB4RkY5NSwgJ00nLCB1J+ODpicpLAogICAgKDB4RkY5NiwgJ00nLCB1J+ODqCcpLAogICAgKDB4RkY5NywgJ00nLCB1J+ODqScpLAogICAgKDB4RkY5OCwgJ00nLCB1J+ODqicpLAogICAgKDB4RkY5OSwgJ00nLCB1J+ODqycpLAogICAgKDB4RkY5QSwgJ00nLCB1J+ODrCcpLAogICAgKDB4RkY5QiwgJ00nLCB1J+ODrScpLAogICAgKDB4RkY5QywgJ00nLCB1J+ODrycpLAogICAgKDB4RkY5RCwgJ00nLCB1J+ODsycpLAogICAgKDB4RkY5RSwgJ00nLCB1J+OCmScpLAogICAgKDB4RkY5RiwgJ00nLCB1J+OCmicpLAogICAgKDB4RkZBMCwgJ1gnKSwKICAgICgweEZGQTEsICdNJywgdSfhhIAnKSwKICAgICgweEZGQTIsICdNJywgdSfhhIEnKSwKICAgICgweEZGQTMsICdNJywgdSfhhqonKSwKICAgICgweEZGQTQsICdNJywgdSfhhIInKSwKICAgICgweEZGQTUsICdNJywgdSfhhqwnKSwKICAgICgweEZGQTYsICdNJywgdSfhhq0nKSwKICAgICgweEZGQTcsICdNJywgdSfhhIMnKSwKICAgICgweEZGQTgsICdNJywgdSfhhIQnKSwKICAgICgweEZGQTksICdNJywgdSfhhIUnKSwKICAgICgweEZGQUEsICdNJywgdSfhhrAnKSwKICAgICgweEZGQUIsICdNJywgdSfhhrEnKSwKICAgICgweEZGQUMsICdNJywgdSfhhrInKSwKICAgICgweEZGQUQsICdNJywgdSfhhrMnKSwKICAgICgweEZGQUUsICdNJywgdSfhhrQnKSwKICAgICgweEZGQUYsICdNJywgdSfhhrUnKSwKICAgICgweEZGQjAsICdNJywgdSfhhJonKSwKICAgICgweEZGQjEsICdNJywgdSfhhIYnKSwKICAgICgweEZGQjIsICdNJywgdSfhhIcnKSwKICAgICgweEZGQjMsICdNJywgdSfhhIgnKSwKICAgICgweEZGQjQsICdNJywgdSfhhKEnKSwKICAgICgweEZGQjUsICdNJywgdSfhhIknKSwKICAgICgweEZGQjYsICdNJywgdSfhhIonKSwKICAgICgweEZGQjcsICdNJywgdSfhhIsnKSwKICAgICgweEZGQjgsICdNJywgdSfhhIwnKSwKICAgICgweEZGQjksICdNJywgdSfhhI0nKSwKICAgICgweEZGQkEsICdNJywgdSfhhI4nKSwKICAgICgweEZGQkIsICdNJywgdSfhhI8nKSwKICAgICgweEZGQkMsICdNJywgdSfhhJAnKSwKICAgICgweEZGQkQsICdNJywgdSfhhJEnKSwKICAgICgweEZGQkUsICdNJywgdSfhhJInKSwKICAgICgweEZGQkYsICdYJyksCiAgICAoMHhGRkMyLCAnTScsIHUn4YWhJyksCiAgICAoMHhGRkMzLCAnTScsIHUn4YWiJyksCiAgICAoMHhGRkM0LCAnTScsIHUn4YWjJyksCiAgICAoMHhGRkM1LCAnTScsIHUn4YWkJyksCiAgICAoMHhGRkM2LCAnTScsIHUn4YWlJyksCiAgICAoMHhGRkM3LCAnTScsIHUn4YWmJyksCiAgICAoMHhGRkM4LCAnWCcpLAogICAgKDB4RkZDQSwgJ00nLCB1J+GFpycpLAogICAgKDB4RkZDQiwgJ00nLCB1J+GFqCcpLAogICAgKDB4RkZDQywgJ00nLCB1J+GFqScpLAogICAgKDB4RkZDRCwgJ00nLCB1J+GFqicpLAogICAgXQoKZGVmIF9zZWdfNTEoKToKICAgIHJldHVybiBbCiAgICAoMHhGRkNFLCAnTScsIHUn4YWrJyksCiAgICAoMHhGRkNGLCAnTScsIHUn4YWsJyksCiAgICAoMHhGRkQwLCAnWCcpLAogICAgKDB4RkZEMiwgJ00nLCB1J+GFrScpLAogICAgKDB4RkZEMywgJ00nLCB1J+GFricpLAogICAgKDB4RkZENCwgJ00nLCB1J+GFrycpLAogICAgKDB4RkZENSwgJ00nLCB1J+GFsCcpLAogICAgKDB4RkZENiwgJ00nLCB1J+GFsScpLAogICAgKDB4RkZENywgJ00nLCB1J+GFsicpLAogICAgKDB4RkZEOCwgJ1gnKSwKICAgICgweEZGREEsICdNJywgdSfhhbMnKSwKICAgICgweEZGREIsICdNJywgdSfhhbQnKSwKICAgICgweEZGREMsICdNJywgdSfhhbUnKSwKICAgICgweEZGREQsICdYJyksCiAgICAoMHhGRkUwLCAnTScsIHUnwqInKSwKICAgICgweEZGRTEsICdNJywgdSfCoycpLAogICAgKDB4RkZFMiwgJ00nLCB1J8KsJyksCiAgICAoMHhGRkUzLCAnMycsIHUnIMyEJyksCiAgICAoMHhGRkU0LCAnTScsIHUnwqYnKSwKICAgICgweEZGRTUsICdNJywgdSfCpScpLAogICAgKDB4RkZFNiwgJ00nLCB1J+KCqScpLAogICAgKDB4RkZFNywgJ1gnKSwKICAgICgweEZGRTgsICdNJywgdSfilIInKSwKICAgICgweEZGRTksICdNJywgdSfihpAnKSwKICAgICgweEZGRUEsICdNJywgdSfihpEnKSwKICAgICgweEZGRUIsICdNJywgdSfihpInKSwKICAgICgweEZGRUMsICdNJywgdSfihpMnKSwKICAgICgweEZGRUQsICdNJywgdSfilqAnKSwKICAgICgweEZGRUUsICdNJywgdSfil4snKSwKICAgICgweEZGRUYsICdYJyksCiAgICAoMHgxMDAwMCwgJ1YnKSwKICAgICgweDEwMDBDLCAnWCcpLAogICAgKDB4MTAwMEQsICdWJyksCiAgICAoMHgxMDAyNywgJ1gnKSwKICAgICgweDEwMDI4LCAnVicpLAogICAgKDB4MTAwM0IsICdYJyksCiAgICAoMHgxMDAzQywgJ1YnKSwKICAgICgweDEwMDNFLCAnWCcpLAogICAgKDB4MTAwM0YsICdWJyksCiAgICAoMHgxMDA0RSwgJ1gnKSwKICAgICgweDEwMDUwLCAnVicpLAogICAgKDB4MTAwNUUsICdYJyksCiAgICAoMHgxMDA4MCwgJ1YnKSwKICAgICgweDEwMEZCLCAnWCcpLAogICAgKDB4MTAxMDAsICdWJyksCiAgICAoMHgxMDEwMywgJ1gnKSwKICAgICgweDEwMTA3LCAnVicpLAogICAgKDB4MTAxMzQsICdYJyksCiAgICAoMHgxMDEzNywgJ1YnKSwKICAgICgweDEwMThCLCAnWCcpLAogICAgKDB4MTAxOTAsICdWJyksCiAgICAoMHgxMDE5QywgJ1gnKSwKICAgICgweDEwMUQwLCAnVicpLAogICAgKDB4MTAxRkUsICdYJyksCiAgICAoMHgxMDI4MCwgJ1YnKSwKICAgICgweDEwMjlELCAnWCcpLAogICAgKDB4MTAyQTAsICdWJyksCiAgICAoMHgxMDJEMSwgJ1gnKSwKICAgICgweDEwMzAwLCAnVicpLAogICAgKDB4MTAzMUYsICdYJyksCiAgICAoMHgxMDMyMCwgJ1YnKSwKICAgICgweDEwMzI0LCAnWCcpLAogICAgKDB4MTAzMzAsICdWJyksCiAgICAoMHgxMDM0QiwgJ1gnKSwKICAgICgweDEwMzgwLCAnVicpLAogICAgKDB4MTAzOUUsICdYJyksCiAgICAoMHgxMDM5RiwgJ1YnKSwKICAgICgweDEwM0M0LCAnWCcpLAogICAgKDB4MTAzQzgsICdWJyksCiAgICAoMHgxMDNENiwgJ1gnKSwKICAgICgweDEwNDAwLCAnTScsIHUn8JCQqCcpLAogICAgKDB4MTA0MDEsICdNJywgdSfwkJCpJyksCiAgICAoMHgxMDQwMiwgJ00nLCB1J/CQkKonKSwKICAgICgweDEwNDAzLCAnTScsIHUn8JCQqycpLAogICAgKDB4MTA0MDQsICdNJywgdSfwkJCsJyksCiAgICAoMHgxMDQwNSwgJ00nLCB1J/CQkK0nKSwKICAgICgweDEwNDA2LCAnTScsIHUn8JCQricpLAogICAgKDB4MTA0MDcsICdNJywgdSfwkJCvJyksCiAgICAoMHgxMDQwOCwgJ00nLCB1J/CQkLAnKSwKICAgICgweDEwNDA5LCAnTScsIHUn8JCQsScpLAogICAgKDB4MTA0MEEsICdNJywgdSfwkJCyJyksCiAgICAoMHgxMDQwQiwgJ00nLCB1J/CQkLMnKSwKICAgICgweDEwNDBDLCAnTScsIHUn8JCQtCcpLAogICAgKDB4MTA0MEQsICdNJywgdSfwkJC1JyksCiAgICAoMHgxMDQwRSwgJ00nLCB1J/CQkLYnKSwKICAgICgweDEwNDBGLCAnTScsIHUn8JCQtycpLAogICAgKDB4MTA0MTAsICdNJywgdSfwkJC4JyksCiAgICAoMHgxMDQxMSwgJ00nLCB1J/CQkLknKSwKICAgICgweDEwNDEyLCAnTScsIHUn8JCQuicpLAogICAgKDB4MTA0MTMsICdNJywgdSfwkJC7JyksCiAgICAoMHgxMDQxNCwgJ00nLCB1J/CQkLwnKSwKICAgICgweDEwNDE1LCAnTScsIHUn8JCQvScpLAogICAgKDB4MTA0MTYsICdNJywgdSfwkJC+JyksCiAgICAoMHgxMDQxNywgJ00nLCB1J/CQkL8nKSwKICAgICgweDEwNDE4LCAnTScsIHUn8JCRgCcpLAogICAgKDB4MTA0MTksICdNJywgdSfwkJGBJyksCiAgICAoMHgxMDQxQSwgJ00nLCB1J/CQkYInKSwKICAgICgweDEwNDFCLCAnTScsIHUn8JCRgycpLAogICAgKDB4MTA0MUMsICdNJywgdSfwkJGEJyksCiAgICAoMHgxMDQxRCwgJ00nLCB1J/CQkYUnKSwKICAgIF0KCmRlZiBfc2VnXzUyKCk6CiAgICByZXR1cm4gWwogICAgKDB4MTA0MUUsICdNJywgdSfwkJGGJyksCiAgICAoMHgxMDQxRiwgJ00nLCB1J/CQkYcnKSwKICAgICgweDEwNDIwLCAnTScsIHUn8JCRiCcpLAogICAgKDB4MTA0MjEsICdNJywgdSfwkJGJJyksCiAgICAoMHgxMDQyMiwgJ00nLCB1J/CQkYonKSwKICAgICgweDEwNDIzLCAnTScsIHUn8JCRiycpLAogICAgKDB4MTA0MjQsICdNJywgdSfwkJGMJyksCiAgICAoMHgxMDQyNSwgJ00nLCB1J/CQkY0nKSwKICAgICgweDEwNDI2LCAnTScsIHUn8JCRjicpLAogICAgKDB4MTA0MjcsICdNJywgdSfwkJGPJyksCiAgICAoMHgxMDQyOCwgJ1YnKSwKICAgICgweDEwNDlFLCAnWCcpLAogICAgKDB4MTA0QTAsICdWJyksCiAgICAoMHgxMDRBQSwgJ1gnKSwKICAgICgweDEwODAwLCAnVicpLAogICAgKDB4MTA4MDYsICdYJyksCiAgICAoMHgxMDgwOCwgJ1YnKSwKICAgICgweDEwODA5LCAnWCcpLAogICAgKDB4MTA4MEEsICdWJyksCiAgICAoMHgxMDgzNiwgJ1gnKSwKICAgICgweDEwODM3LCAnVicpLAogICAgKDB4MTA4MzksICdYJyksCiAgICAoMHgxMDgzQywgJ1YnKSwKICAgICgweDEwODNELCAnWCcpLAogICAgKDB4MTA4M0YsICdWJyksCiAgICAoMHgxMDg1NiwgJ1gnKSwKICAgICgweDEwODU3LCAnVicpLAogICAgKDB4MTA4NjAsICdYJyksCiAgICAoMHgxMDkwMCwgJ1YnKSwKICAgICgweDEwOTFDLCAnWCcpLAogICAgKDB4MTA5MUYsICdWJyksCiAgICAoMHgxMDkzQSwgJ1gnKSwKICAgICgweDEwOTNGLCAnVicpLAogICAgKDB4MTA5NDAsICdYJyksCiAgICAoMHgxMDk4MCwgJ1YnKSwKICAgICgweDEwOUI4LCAnWCcpLAogICAgKDB4MTA5QkUsICdWJyksCiAgICAoMHgxMDlDMCwgJ1gnKSwKICAgICgweDEwQTAwLCAnVicpLAogICAgKDB4MTBBMDQsICdYJyksCiAgICAoMHgxMEEwNSwgJ1YnKSwKICAgICgweDEwQTA3LCAnWCcpLAogICAgKDB4MTBBMEMsICdWJyksCiAgICAoMHgxMEExNCwgJ1gnKSwKICAgICgweDEwQTE1LCAnVicpLAogICAgKDB4MTBBMTgsICdYJyksCiAgICAoMHgxMEExOSwgJ1YnKSwKICAgICgweDEwQTM0LCAnWCcpLAogICAgKDB4MTBBMzgsICdWJyksCiAgICAoMHgxMEEzQiwgJ1gnKSwKICAgICgweDEwQTNGLCAnVicpLAogICAgKDB4MTBBNDgsICdYJyksCiAgICAoMHgxMEE1MCwgJ1YnKSwKICAgICgweDEwQTU5LCAnWCcpLAogICAgKDB4MTBBNjAsICdWJyksCiAgICAoMHgxMEE4MCwgJ1gnKSwKICAgICgweDEwQjAwLCAnVicpLAogICAgKDB4MTBCMzYsICdYJyksCiAgICAoMHgxMEIzOSwgJ1YnKSwKICAgICgweDEwQjU2LCAnWCcpLAogICAgKDB4MTBCNTgsICdWJyksCiAgICAoMHgxMEI3MywgJ1gnKSwKICAgICgweDEwQjc4LCAnVicpLAogICAgKDB4MTBCODAsICdYJyksCiAgICAoMHgxMEMwMCwgJ1YnKSwKICAgICgweDEwQzQ5LCAnWCcpLAogICAgKDB4MTBFNjAsICdWJyksCiAgICAoMHgxMEU3RiwgJ1gnKSwKICAgICgweDExMDAwLCAnVicpLAogICAgKDB4MTEwNEUsICdYJyksCiAgICAoMHgxMTA1MiwgJ1YnKSwKICAgICgweDExMDcwLCAnWCcpLAogICAgKDB4MTEwODAsICdWJyksCiAgICAoMHgxMTBCRCwgJ1gnKSwKICAgICgweDExMEJFLCAnVicpLAogICAgKDB4MTEwQzIsICdYJyksCiAgICAoMHgxMTBEMCwgJ1YnKSwKICAgICgweDExMEU5LCAnWCcpLAogICAgKDB4MTEwRjAsICdWJyksCiAgICAoMHgxMTBGQSwgJ1gnKSwKICAgICgweDExMTAwLCAnVicpLAogICAgKDB4MTExMzUsICdYJyksCiAgICAoMHgxMTEzNiwgJ1YnKSwKICAgICgweDExMTQ0LCAnWCcpLAogICAgKDB4MTExODAsICdWJyksCiAgICAoMHgxMTFDOSwgJ1gnKSwKICAgICgweDExMUQwLCAnVicpLAogICAgKDB4MTExREEsICdYJyksCiAgICAoMHgxMTY4MCwgJ1YnKSwKICAgICgweDExNkI4LCAnWCcpLAogICAgKDB4MTE2QzAsICdWJyksCiAgICAoMHgxMTZDQSwgJ1gnKSwKICAgICgweDEyMDAwLCAnVicpLAogICAgKDB4MTIzNkYsICdYJyksCiAgICAoMHgxMjQwMCwgJ1YnKSwKICAgICgweDEyNDYzLCAnWCcpLAogICAgKDB4MTI0NzAsICdWJyksCiAgICAoMHgxMjQ3NCwgJ1gnKSwKICAgICgweDEzMDAwLCAnVicpLAogICAgKDB4MTM0MkYsICdYJyksCiAgICBdCgpkZWYgX3NlZ181MygpOgogICAgcmV0dXJuIFsKICAgICgweDE2ODAwLCAnVicpLAogICAgKDB4MTZBMzksICdYJyksCiAgICAoMHgxNkYwMCwgJ1YnKSwKICAgICgweDE2RjQ1LCAnWCcpLAogICAgKDB4MTZGNTAsICdWJyksCiAgICAoMHgxNkY3RiwgJ1gnKSwKICAgICgweDE2RjhGLCAnVicpLAogICAgKDB4MTZGQTAsICdYJyksCiAgICAoMHgxQjAwMCwgJ1YnKSwKICAgICgweDFCMDAyLCAnWCcpLAogICAgKDB4MUQwMDAsICdWJyksCiAgICAoMHgxRDBGNiwgJ1gnKSwKICAgICgweDFEMTAwLCAnVicpLAogICAgKDB4MUQxMjcsICdYJyksCiAgICAoMHgxRDEyOSwgJ1YnKSwKICAgICgweDFEMTVFLCAnTScsIHUn8J2Fl/CdhaUnKSwKICAgICgweDFEMTVGLCAnTScsIHUn8J2FmPCdhaUnKSwKICAgICgweDFEMTYwLCAnTScsIHUn8J2FmPCdhaXwnYWuJyksCiAgICAoMHgxRDE2MSwgJ00nLCB1J/CdhZjwnYWl8J2FrycpLAogICAgKDB4MUQxNjIsICdNJywgdSfwnYWY8J2FpfCdhbAnKSwKICAgICgweDFEMTYzLCAnTScsIHUn8J2FmPCdhaXwnYWxJyksCiAgICAoMHgxRDE2NCwgJ00nLCB1J/CdhZjwnYWl8J2FsicpLAogICAgKDB4MUQxNjUsICdWJyksCiAgICAoMHgxRDE3MywgJ1gnKSwKICAgICgweDFEMTdCLCAnVicpLAogICAgKDB4MUQxQkIsICdNJywgdSfwnYa58J2FpScpLAogICAgKDB4MUQxQkMsICdNJywgdSfwnYa68J2FpScpLAogICAgKDB4MUQxQkQsICdNJywgdSfwnYa58J2FpfCdha4nKSwKICAgICgweDFEMUJFLCAnTScsIHUn8J2GuvCdhaXwnYWuJyksCiAgICAoMHgxRDFCRiwgJ00nLCB1J/CdhrnwnYWl8J2FrycpLAogICAgKDB4MUQxQzAsICdNJywgdSfwnYa68J2FpfCdha8nKSwKICAgICgweDFEMUMxLCAnVicpLAogICAgKDB4MUQxREUsICdYJyksCiAgICAoMHgxRDIwMCwgJ1YnKSwKICAgICgweDFEMjQ2LCAnWCcpLAogICAgKDB4MUQzMDAsICdWJyksCiAgICAoMHgxRDM1NywgJ1gnKSwKICAgICgweDFEMzYwLCAnVicpLAogICAgKDB4MUQzNzIsICdYJyksCiAgICAoMHgxRDQwMCwgJ00nLCB1J2EnKSwKICAgICgweDFENDAxLCAnTScsIHUnYicpLAogICAgKDB4MUQ0MDIsICdNJywgdSdjJyksCiAgICAoMHgxRDQwMywgJ00nLCB1J2QnKSwKICAgICgweDFENDA0LCAnTScsIHUnZScpLAogICAgKDB4MUQ0MDUsICdNJywgdSdmJyksCiAgICAoMHgxRDQwNiwgJ00nLCB1J2cnKSwKICAgICgweDFENDA3LCAnTScsIHUnaCcpLAogICAgKDB4MUQ0MDgsICdNJywgdSdpJyksCiAgICAoMHgxRDQwOSwgJ00nLCB1J2onKSwKICAgICgweDFENDBBLCAnTScsIHUnaycpLAogICAgKDB4MUQ0MEIsICdNJywgdSdsJyksCiAgICAoMHgxRDQwQywgJ00nLCB1J20nKSwKICAgICgweDFENDBELCAnTScsIHUnbicpLAogICAgKDB4MUQ0MEUsICdNJywgdSdvJyksCiAgICAoMHgxRDQwRiwgJ00nLCB1J3AnKSwKICAgICgweDFENDEwLCAnTScsIHUncScpLAogICAgKDB4MUQ0MTEsICdNJywgdSdyJyksCiAgICAoMHgxRDQxMiwgJ00nLCB1J3MnKSwKICAgICgweDFENDEzLCAnTScsIHUndCcpLAogICAgKDB4MUQ0MTQsICdNJywgdSd1JyksCiAgICAoMHgxRDQxNSwgJ00nLCB1J3YnKSwKICAgICgweDFENDE2LCAnTScsIHUndycpLAogICAgKDB4MUQ0MTcsICdNJywgdSd4JyksCiAgICAoMHgxRDQxOCwgJ00nLCB1J3knKSwKICAgICgweDFENDE5LCAnTScsIHUneicpLAogICAgKDB4MUQ0MUEsICdNJywgdSdhJyksCiAgICAoMHgxRDQxQiwgJ00nLCB1J2InKSwKICAgICgweDFENDFDLCAnTScsIHUnYycpLAogICAgKDB4MUQ0MUQsICdNJywgdSdkJyksCiAgICAoMHgxRDQxRSwgJ00nLCB1J2UnKSwKICAgICgweDFENDFGLCAnTScsIHUnZicpLAogICAgKDB4MUQ0MjAsICdNJywgdSdnJyksCiAgICAoMHgxRDQyMSwgJ00nLCB1J2gnKSwKICAgICgweDFENDIyLCAnTScsIHUnaScpLAogICAgKDB4MUQ0MjMsICdNJywgdSdqJyksCiAgICAoMHgxRDQyNCwgJ00nLCB1J2snKSwKICAgICgweDFENDI1LCAnTScsIHUnbCcpLAogICAgKDB4MUQ0MjYsICdNJywgdSdtJyksCiAgICAoMHgxRDQyNywgJ00nLCB1J24nKSwKICAgICgweDFENDI4LCAnTScsIHUnbycpLAogICAgKDB4MUQ0MjksICdNJywgdSdwJyksCiAgICAoMHgxRDQyQSwgJ00nLCB1J3EnKSwKICAgICgweDFENDJCLCAnTScsIHUncicpLAogICAgKDB4MUQ0MkMsICdNJywgdSdzJyksCiAgICAoMHgxRDQyRCwgJ00nLCB1J3QnKSwKICAgICgweDFENDJFLCAnTScsIHUndScpLAogICAgKDB4MUQ0MkYsICdNJywgdSd2JyksCiAgICAoMHgxRDQzMCwgJ00nLCB1J3cnKSwKICAgICgweDFENDMxLCAnTScsIHUneCcpLAogICAgKDB4MUQ0MzIsICdNJywgdSd5JyksCiAgICAoMHgxRDQzMywgJ00nLCB1J3onKSwKICAgICgweDFENDM0LCAnTScsIHUnYScpLAogICAgKDB4MUQ0MzUsICdNJywgdSdiJyksCiAgICAoMHgxRDQzNiwgJ00nLCB1J2MnKSwKICAgICgweDFENDM3LCAnTScsIHUnZCcpLAogICAgKDB4MUQ0MzgsICdNJywgdSdlJyksCiAgICAoMHgxRDQzOSwgJ00nLCB1J2YnKSwKICAgICgweDFENDNBLCAnTScsIHUnZycpLAogICAgKDB4MUQ0M0IsICdNJywgdSdoJyksCiAgICAoMHgxRDQzQywgJ00nLCB1J2knKSwKICAgIF0KCmRlZiBfc2VnXzU0KCk6CiAgICByZXR1cm4gWwogICAgKDB4MUQ0M0QsICdNJywgdSdqJyksCiAgICAoMHgxRDQzRSwgJ00nLCB1J2snKSwKICAgICgweDFENDNGLCAnTScsIHUnbCcpLAogICAgKDB4MUQ0NDAsICdNJywgdSdtJyksCiAgICAoMHgxRDQ0MSwgJ00nLCB1J24nKSwKICAgICgweDFENDQyLCAnTScsIHUnbycpLAogICAgKDB4MUQ0NDMsICdNJywgdSdwJyksCiAgICAoMHgxRDQ0NCwgJ00nLCB1J3EnKSwKICAgICgweDFENDQ1LCAnTScsIHUncicpLAogICAgKDB4MUQ0NDYsICdNJywgdSdzJyksCiAgICAoMHgxRDQ0NywgJ00nLCB1J3QnKSwKICAgICgweDFENDQ4LCAnTScsIHUndScpLAogICAgKDB4MUQ0NDksICdNJywgdSd2JyksCiAgICAoMHgxRDQ0QSwgJ00nLCB1J3cnKSwKICAgICgweDFENDRCLCAnTScsIHUneCcpLAogICAgKDB4MUQ0NEMsICdNJywgdSd5JyksCiAgICAoMHgxRDQ0RCwgJ00nLCB1J3onKSwKICAgICgweDFENDRFLCAnTScsIHUnYScpLAogICAgKDB4MUQ0NEYsICdNJywgdSdiJyksCiAgICAoMHgxRDQ1MCwgJ00nLCB1J2MnKSwKICAgICgweDFENDUxLCAnTScsIHUnZCcpLAogICAgKDB4MUQ0NTIsICdNJywgdSdlJyksCiAgICAoMHgxRDQ1MywgJ00nLCB1J2YnKSwKICAgICgweDFENDU0LCAnTScsIHUnZycpLAogICAgKDB4MUQ0NTUsICdYJyksCiAgICAoMHgxRDQ1NiwgJ00nLCB1J2knKSwKICAgICgweDFENDU3LCAnTScsIHUnaicpLAogICAgKDB4MUQ0NTgsICdNJywgdSdrJyksCiAgICAoMHgxRDQ1OSwgJ00nLCB1J2wnKSwKICAgICgweDFENDVBLCAnTScsIHUnbScpLAogICAgKDB4MUQ0NUIsICdNJywgdSduJyksCiAgICAoMHgxRDQ1QywgJ00nLCB1J28nKSwKICAgICgweDFENDVELCAnTScsIHUncCcpLAogICAgKDB4MUQ0NUUsICdNJywgdSdxJyksCiAgICAoMHgxRDQ1RiwgJ00nLCB1J3InKSwKICAgICgweDFENDYwLCAnTScsIHUncycpLAogICAgKDB4MUQ0NjEsICdNJywgdSd0JyksCiAgICAoMHgxRDQ2MiwgJ00nLCB1J3UnKSwKICAgICgweDFENDYzLCAnTScsIHUndicpLAogICAgKDB4MUQ0NjQsICdNJywgdSd3JyksCiAgICAoMHgxRDQ2NSwgJ00nLCB1J3gnKSwKICAgICgweDFENDY2LCAnTScsIHUneScpLAogICAgKDB4MUQ0NjcsICdNJywgdSd6JyksCiAgICAoMHgxRDQ2OCwgJ00nLCB1J2EnKSwKICAgICgweDFENDY5LCAnTScsIHUnYicpLAogICAgKDB4MUQ0NkEsICdNJywgdSdjJyksCiAgICAoMHgxRDQ2QiwgJ00nLCB1J2QnKSwKICAgICgweDFENDZDLCAnTScsIHUnZScpLAogICAgKDB4MUQ0NkQsICdNJywgdSdmJyksCiAgICAoMHgxRDQ2RSwgJ00nLCB1J2cnKSwKICAgICgweDFENDZGLCAnTScsIHUnaCcpLAogICAgKDB4MUQ0NzAsICdNJywgdSdpJyksCiAgICAoMHgxRDQ3MSwgJ00nLCB1J2onKSwKICAgICgweDFENDcyLCAnTScsIHUnaycpLAogICAgKDB4MUQ0NzMsICdNJywgdSdsJyksCiAgICAoMHgxRDQ3NCwgJ00nLCB1J20nKSwKICAgICgweDFENDc1LCAnTScsIHUnbicpLAogICAgKDB4MUQ0NzYsICdNJywgdSdvJyksCiAgICAoMHgxRDQ3NywgJ00nLCB1J3AnKSwKICAgICgweDFENDc4LCAnTScsIHUncScpLAogICAgKDB4MUQ0NzksICdNJywgdSdyJyksCiAgICAoMHgxRDQ3QSwgJ00nLCB1J3MnKSwKICAgICgweDFENDdCLCAnTScsIHUndCcpLAogICAgKDB4MUQ0N0MsICdNJywgdSd1JyksCiAgICAoMHgxRDQ3RCwgJ00nLCB1J3YnKSwKICAgICgweDFENDdFLCAnTScsIHUndycpLAogICAgKDB4MUQ0N0YsICdNJywgdSd4JyksCiAgICAoMHgxRDQ4MCwgJ00nLCB1J3knKSwKICAgICgweDFENDgxLCAnTScsIHUneicpLAogICAgKDB4MUQ0ODIsICdNJywgdSdhJyksCiAgICAoMHgxRDQ4MywgJ00nLCB1J2InKSwKICAgICgweDFENDg0LCAnTScsIHUnYycpLAogICAgKDB4MUQ0ODUsICdNJywgdSdkJyksCiAgICAoMHgxRDQ4NiwgJ00nLCB1J2UnKSwKICAgICgweDFENDg3LCAnTScsIHUnZicpLAogICAgKDB4MUQ0ODgsICdNJywgdSdnJyksCiAgICAoMHgxRDQ4OSwgJ00nLCB1J2gnKSwKICAgICgweDFENDhBLCAnTScsIHUnaScpLAogICAgKDB4MUQ0OEIsICdNJywgdSdqJyksCiAgICAoMHgxRDQ4QywgJ00nLCB1J2snKSwKICAgICgweDFENDhELCAnTScsIHUnbCcpLAogICAgKDB4MUQ0OEUsICdNJywgdSdtJyksCiAgICAoMHgxRDQ4RiwgJ00nLCB1J24nKSwKICAgICgweDFENDkwLCAnTScsIHUnbycpLAogICAgKDB4MUQ0OTEsICdNJywgdSdwJyksCiAgICAoMHgxRDQ5MiwgJ00nLCB1J3EnKSwKICAgICgweDFENDkzLCAnTScsIHUncicpLAogICAgKDB4MUQ0OTQsICdNJywgdSdzJyksCiAgICAoMHgxRDQ5NSwgJ00nLCB1J3QnKSwKICAgICgweDFENDk2LCAnTScsIHUndScpLAogICAgKDB4MUQ0OTcsICdNJywgdSd2JyksCiAgICAoMHgxRDQ5OCwgJ00nLCB1J3cnKSwKICAgICgweDFENDk5LCAnTScsIHUneCcpLAogICAgKDB4MUQ0OUEsICdNJywgdSd5JyksCiAgICAoMHgxRDQ5QiwgJ00nLCB1J3onKSwKICAgICgweDFENDlDLCAnTScsIHUnYScpLAogICAgKDB4MUQ0OUQsICdYJyksCiAgICAoMHgxRDQ5RSwgJ00nLCB1J2MnKSwKICAgICgweDFENDlGLCAnTScsIHUnZCcpLAogICAgKDB4MUQ0QTAsICdYJyksCiAgICBdCgpkZWYgX3NlZ181NSgpOgogICAgcmV0dXJuIFsKICAgICgweDFENEEyLCAnTScsIHUnZycpLAogICAgKDB4MUQ0QTMsICdYJyksCiAgICAoMHgxRDRBNSwgJ00nLCB1J2onKSwKICAgICgweDFENEE2LCAnTScsIHUnaycpLAogICAgKDB4MUQ0QTcsICdYJyksCiAgICAoMHgxRDRBOSwgJ00nLCB1J24nKSwKICAgICgweDFENEFBLCAnTScsIHUnbycpLAogICAgKDB4MUQ0QUIsICdNJywgdSdwJyksCiAgICAoMHgxRDRBQywgJ00nLCB1J3EnKSwKICAgICgweDFENEFELCAnWCcpLAogICAgKDB4MUQ0QUUsICdNJywgdSdzJyksCiAgICAoMHgxRDRBRiwgJ00nLCB1J3QnKSwKICAgICgweDFENEIwLCAnTScsIHUndScpLAogICAgKDB4MUQ0QjEsICdNJywgdSd2JyksCiAgICAoMHgxRDRCMiwgJ00nLCB1J3cnKSwKICAgICgweDFENEIzLCAnTScsIHUneCcpLAogICAgKDB4MUQ0QjQsICdNJywgdSd5JyksCiAgICAoMHgxRDRCNSwgJ00nLCB1J3onKSwKICAgICgweDFENEI2LCAnTScsIHUnYScpLAogICAgKDB4MUQ0QjcsICdNJywgdSdiJyksCiAgICAoMHgxRDRCOCwgJ00nLCB1J2MnKSwKICAgICgweDFENEI5LCAnTScsIHUnZCcpLAogICAgKDB4MUQ0QkEsICdYJyksCiAgICAoMHgxRDRCQiwgJ00nLCB1J2YnKSwKICAgICgweDFENEJDLCAnWCcpLAogICAgKDB4MUQ0QkQsICdNJywgdSdoJyksCiAgICAoMHgxRDRCRSwgJ00nLCB1J2knKSwKICAgICgweDFENEJGLCAnTScsIHUnaicpLAogICAgKDB4MUQ0QzAsICdNJywgdSdrJyksCiAgICAoMHgxRDRDMSwgJ00nLCB1J2wnKSwKICAgICgweDFENEMyLCAnTScsIHUnbScpLAogICAgKDB4MUQ0QzMsICdNJywgdSduJyksCiAgICAoMHgxRDRDNCwgJ1gnKSwKICAgICgweDFENEM1LCAnTScsIHUncCcpLAogICAgKDB4MUQ0QzYsICdNJywgdSdxJyksCiAgICAoMHgxRDRDNywgJ00nLCB1J3InKSwKICAgICgweDFENEM4LCAnTScsIHUncycpLAogICAgKDB4MUQ0QzksICdNJywgdSd0JyksCiAgICAoMHgxRDRDQSwgJ00nLCB1J3UnKSwKICAgICgweDFENENCLCAnTScsIHUndicpLAogICAgKDB4MUQ0Q0MsICdNJywgdSd3JyksCiAgICAoMHgxRDRDRCwgJ00nLCB1J3gnKSwKICAgICgweDFENENFLCAnTScsIHUneScpLAogICAgKDB4MUQ0Q0YsICdNJywgdSd6JyksCiAgICAoMHgxRDREMCwgJ00nLCB1J2EnKSwKICAgICgweDFENEQxLCAnTScsIHUnYicpLAogICAgKDB4MUQ0RDIsICdNJywgdSdjJyksCiAgICAoMHgxRDREMywgJ00nLCB1J2QnKSwKICAgICgweDFENEQ0LCAnTScsIHUnZScpLAogICAgKDB4MUQ0RDUsICdNJywgdSdmJyksCiAgICAoMHgxRDRENiwgJ00nLCB1J2cnKSwKICAgICgweDFENEQ3LCAnTScsIHUnaCcpLAogICAgKDB4MUQ0RDgsICdNJywgdSdpJyksCiAgICAoMHgxRDREOSwgJ00nLCB1J2onKSwKICAgICgweDFENERBLCAnTScsIHUnaycpLAogICAgKDB4MUQ0REIsICdNJywgdSdsJyksCiAgICAoMHgxRDREQywgJ00nLCB1J20nKSwKICAgICgweDFENERELCAnTScsIHUnbicpLAogICAgKDB4MUQ0REUsICdNJywgdSdvJyksCiAgICAoMHgxRDRERiwgJ00nLCB1J3AnKSwKICAgICgweDFENEUwLCAnTScsIHUncScpLAogICAgKDB4MUQ0RTEsICdNJywgdSdyJyksCiAgICAoMHgxRDRFMiwgJ00nLCB1J3MnKSwKICAgICgweDFENEUzLCAnTScsIHUndCcpLAogICAgKDB4MUQ0RTQsICdNJywgdSd1JyksCiAgICAoMHgxRDRFNSwgJ00nLCB1J3YnKSwKICAgICgweDFENEU2LCAnTScsIHUndycpLAogICAgKDB4MUQ0RTcsICdNJywgdSd4JyksCiAgICAoMHgxRDRFOCwgJ00nLCB1J3knKSwKICAgICgweDFENEU5LCAnTScsIHUneicpLAogICAgKDB4MUQ0RUEsICdNJywgdSdhJyksCiAgICAoMHgxRDRFQiwgJ00nLCB1J2InKSwKICAgICgweDFENEVDLCAnTScsIHUnYycpLAogICAgKDB4MUQ0RUQsICdNJywgdSdkJyksCiAgICAoMHgxRDRFRSwgJ00nLCB1J2UnKSwKICAgICgweDFENEVGLCAnTScsIHUnZicpLAogICAgKDB4MUQ0RjAsICdNJywgdSdnJyksCiAgICAoMHgxRDRGMSwgJ00nLCB1J2gnKSwKICAgICgweDFENEYyLCAnTScsIHUnaScpLAogICAgKDB4MUQ0RjMsICdNJywgdSdqJyksCiAgICAoMHgxRDRGNCwgJ00nLCB1J2snKSwKICAgICgweDFENEY1LCAnTScsIHUnbCcpLAogICAgKDB4MUQ0RjYsICdNJywgdSdtJyksCiAgICAoMHgxRDRGNywgJ00nLCB1J24nKSwKICAgICgweDFENEY4LCAnTScsIHUnbycpLAogICAgKDB4MUQ0RjksICdNJywgdSdwJyksCiAgICAoMHgxRDRGQSwgJ00nLCB1J3EnKSwKICAgICgweDFENEZCLCAnTScsIHUncicpLAogICAgKDB4MUQ0RkMsICdNJywgdSdzJyksCiAgICAoMHgxRDRGRCwgJ00nLCB1J3QnKSwKICAgICgweDFENEZFLCAnTScsIHUndScpLAogICAgKDB4MUQ0RkYsICdNJywgdSd2JyksCiAgICAoMHgxRDUwMCwgJ00nLCB1J3cnKSwKICAgICgweDFENTAxLCAnTScsIHUneCcpLAogICAgKDB4MUQ1MDIsICdNJywgdSd5JyksCiAgICAoMHgxRDUwMywgJ00nLCB1J3onKSwKICAgICgweDFENTA0LCAnTScsIHUnYScpLAogICAgKDB4MUQ1MDUsICdNJywgdSdiJyksCiAgICAoMHgxRDUwNiwgJ1gnKSwKICAgICgweDFENTA3LCAnTScsIHUnZCcpLAogICAgXQoKZGVmIF9zZWdfNTYoKToKICAgIHJldHVybiBbCiAgICAoMHgxRDUwOCwgJ00nLCB1J2UnKSwKICAgICgweDFENTA5LCAnTScsIHUnZicpLAogICAgKDB4MUQ1MEEsICdNJywgdSdnJyksCiAgICAoMHgxRDUwQiwgJ1gnKSwKICAgICgweDFENTBELCAnTScsIHUnaicpLAogICAgKDB4MUQ1MEUsICdNJywgdSdrJyksCiAgICAoMHgxRDUwRiwgJ00nLCB1J2wnKSwKICAgICgweDFENTEwLCAnTScsIHUnbScpLAogICAgKDB4MUQ1MTEsICdNJywgdSduJyksCiAgICAoMHgxRDUxMiwgJ00nLCB1J28nKSwKICAgICgweDFENTEzLCAnTScsIHUncCcpLAogICAgKDB4MUQ1MTQsICdNJywgdSdxJyksCiAgICAoMHgxRDUxNSwgJ1gnKSwKICAgICgweDFENTE2LCAnTScsIHUncycpLAogICAgKDB4MUQ1MTcsICdNJywgdSd0JyksCiAgICAoMHgxRDUxOCwgJ00nLCB1J3UnKSwKICAgICgweDFENTE5LCAnTScsIHUndicpLAogICAgKDB4MUQ1MUEsICdNJywgdSd3JyksCiAgICAoMHgxRDUxQiwgJ00nLCB1J3gnKSwKICAgICgweDFENTFDLCAnTScsIHUneScpLAogICAgKDB4MUQ1MUQsICdYJyksCiAgICAoMHgxRDUxRSwgJ00nLCB1J2EnKSwKICAgICgweDFENTFGLCAnTScsIHUnYicpLAogICAgKDB4MUQ1MjAsICdNJywgdSdjJyksCiAgICAoMHgxRDUyMSwgJ00nLCB1J2QnKSwKICAgICgweDFENTIyLCAnTScsIHUnZScpLAogICAgKDB4MUQ1MjMsICdNJywgdSdmJyksCiAgICAoMHgxRDUyNCwgJ00nLCB1J2cnKSwKICAgICgweDFENTI1LCAnTScsIHUnaCcpLAogICAgKDB4MUQ1MjYsICdNJywgdSdpJyksCiAgICAoMHgxRDUyNywgJ00nLCB1J2onKSwKICAgICgweDFENTI4LCAnTScsIHUnaycpLAogICAgKDB4MUQ1MjksICdNJywgdSdsJyksCiAgICAoMHgxRDUyQSwgJ00nLCB1J20nKSwKICAgICgweDFENTJCLCAnTScsIHUnbicpLAogICAgKDB4MUQ1MkMsICdNJywgdSdvJyksCiAgICAoMHgxRDUyRCwgJ00nLCB1J3AnKSwKICAgICgweDFENTJFLCAnTScsIHUncScpLAogICAgKDB4MUQ1MkYsICdNJywgdSdyJyksCiAgICAoMHgxRDUzMCwgJ00nLCB1J3MnKSwKICAgICgweDFENTMxLCAnTScsIHUndCcpLAogICAgKDB4MUQ1MzIsICdNJywgdSd1JyksCiAgICAoMHgxRDUzMywgJ00nLCB1J3YnKSwKICAgICgweDFENTM0LCAnTScsIHUndycpLAogICAgKDB4MUQ1MzUsICdNJywgdSd4JyksCiAgICAoMHgxRDUzNiwgJ00nLCB1J3knKSwKICAgICgweDFENTM3LCAnTScsIHUneicpLAogICAgKDB4MUQ1MzgsICdNJywgdSdhJyksCiAgICAoMHgxRDUzOSwgJ00nLCB1J2InKSwKICAgICgweDFENTNBLCAnWCcpLAogICAgKDB4MUQ1M0IsICdNJywgdSdkJyksCiAgICAoMHgxRDUzQywgJ00nLCB1J2UnKSwKICAgICgweDFENTNELCAnTScsIHUnZicpLAogICAgKDB4MUQ1M0UsICdNJywgdSdnJyksCiAgICAoMHgxRDUzRiwgJ1gnKSwKICAgICgweDFENTQwLCAnTScsIHUnaScpLAogICAgKDB4MUQ1NDEsICdNJywgdSdqJyksCiAgICAoMHgxRDU0MiwgJ00nLCB1J2snKSwKICAgICgweDFENTQzLCAnTScsIHUnbCcpLAogICAgKDB4MUQ1NDQsICdNJywgdSdtJyksCiAgICAoMHgxRDU0NSwgJ1gnKSwKICAgICgweDFENTQ2LCAnTScsIHUnbycpLAogICAgKDB4MUQ1NDcsICdYJyksCiAgICAoMHgxRDU0QSwgJ00nLCB1J3MnKSwKICAgICgweDFENTRCLCAnTScsIHUndCcpLAogICAgKDB4MUQ1NEMsICdNJywgdSd1JyksCiAgICAoMHgxRDU0RCwgJ00nLCB1J3YnKSwKICAgICgweDFENTRFLCAnTScsIHUndycpLAogICAgKDB4MUQ1NEYsICdNJywgdSd4JyksCiAgICAoMHgxRDU1MCwgJ00nLCB1J3knKSwKICAgICgweDFENTUxLCAnWCcpLAogICAgKDB4MUQ1NTIsICdNJywgdSdhJyksCiAgICAoMHgxRDU1MywgJ00nLCB1J2InKSwKICAgICgweDFENTU0LCAnTScsIHUnYycpLAogICAgKDB4MUQ1NTUsICdNJywgdSdkJyksCiAgICAoMHgxRDU1NiwgJ00nLCB1J2UnKSwKICAgICgweDFENTU3LCAnTScsIHUnZicpLAogICAgKDB4MUQ1NTgsICdNJywgdSdnJyksCiAgICAoMHgxRDU1OSwgJ00nLCB1J2gnKSwKICAgICgweDFENTVBLCAnTScsIHUnaScpLAogICAgKDB4MUQ1NUIsICdNJywgdSdqJyksCiAgICAoMHgxRDU1QywgJ00nLCB1J2snKSwKICAgICgweDFENTVELCAnTScsIHUnbCcpLAogICAgKDB4MUQ1NUUsICdNJywgdSdtJyksCiAgICAoMHgxRDU1RiwgJ00nLCB1J24nKSwKICAgICgweDFENTYwLCAnTScsIHUnbycpLAogICAgKDB4MUQ1NjEsICdNJywgdSdwJyksCiAgICAoMHgxRDU2MiwgJ00nLCB1J3EnKSwKICAgICgweDFENTYzLCAnTScsIHUncicpLAogICAgKDB4MUQ1NjQsICdNJywgdSdzJyksCiAgICAoMHgxRDU2NSwgJ00nLCB1J3QnKSwKICAgICgweDFENTY2LCAnTScsIHUndScpLAogICAgKDB4MUQ1NjcsICdNJywgdSd2JyksCiAgICAoMHgxRDU2OCwgJ00nLCB1J3cnKSwKICAgICgweDFENTY5LCAnTScsIHUneCcpLAogICAgKDB4MUQ1NkEsICdNJywgdSd5JyksCiAgICAoMHgxRDU2QiwgJ00nLCB1J3onKSwKICAgICgweDFENTZDLCAnTScsIHUnYScpLAogICAgKDB4MUQ1NkQsICdNJywgdSdiJyksCiAgICAoMHgxRDU2RSwgJ00nLCB1J2MnKSwKICAgIF0KCmRlZiBfc2VnXzU3KCk6CiAgICByZXR1cm4gWwogICAgKDB4MUQ1NkYsICdNJywgdSdkJyksCiAgICAoMHgxRDU3MCwgJ00nLCB1J2UnKSwKICAgICgweDFENTcxLCAnTScsIHUnZicpLAogICAgKDB4MUQ1NzIsICdNJywgdSdnJyksCiAgICAoMHgxRDU3MywgJ00nLCB1J2gnKSwKICAgICgweDFENTc0LCAnTScsIHUnaScpLAogICAgKDB4MUQ1NzUsICdNJywgdSdqJyksCiAgICAoMHgxRDU3NiwgJ00nLCB1J2snKSwKICAgICgweDFENTc3LCAnTScsIHUnbCcpLAogICAgKDB4MUQ1NzgsICdNJywgdSdtJyksCiAgICAoMHgxRDU3OSwgJ00nLCB1J24nKSwKICAgICgweDFENTdBLCAnTScsIHUnbycpLAogICAgKDB4MUQ1N0IsICdNJywgdSdwJyksCiAgICAoMHgxRDU3QywgJ00nLCB1J3EnKSwKICAgICgweDFENTdELCAnTScsIHUncicpLAogICAgKDB4MUQ1N0UsICdNJywgdSdzJyksCiAgICAoMHgxRDU3RiwgJ00nLCB1J3QnKSwKICAgICgweDFENTgwLCAnTScsIHUndScpLAogICAgKDB4MUQ1ODEsICdNJywgdSd2JyksCiAgICAoMHgxRDU4MiwgJ00nLCB1J3cnKSwKICAgICgweDFENTgzLCAnTScsIHUneCcpLAogICAgKDB4MUQ1ODQsICdNJywgdSd5JyksCiAgICAoMHgxRDU4NSwgJ00nLCB1J3onKSwKICAgICgweDFENTg2LCAnTScsIHUnYScpLAogICAgKDB4MUQ1ODcsICdNJywgdSdiJyksCiAgICAoMHgxRDU4OCwgJ00nLCB1J2MnKSwKICAgICgweDFENTg5LCAnTScsIHUnZCcpLAogICAgKDB4MUQ1OEEsICdNJywgdSdlJyksCiAgICAoMHgxRDU4QiwgJ00nLCB1J2YnKSwKICAgICgweDFENThDLCAnTScsIHUnZycpLAogICAgKDB4MUQ1OEQsICdNJywgdSdoJyksCiAgICAoMHgxRDU4RSwgJ00nLCB1J2knKSwKICAgICgweDFENThGLCAnTScsIHUnaicpLAogICAgKDB4MUQ1OTAsICdNJywgdSdrJyksCiAgICAoMHgxRDU5MSwgJ00nLCB1J2wnKSwKICAgICgweDFENTkyLCAnTScsIHUnbScpLAogICAgKDB4MUQ1OTMsICdNJywgdSduJyksCiAgICAoMHgxRDU5NCwgJ00nLCB1J28nKSwKICAgICgweDFENTk1LCAnTScsIHUncCcpLAogICAgKDB4MUQ1OTYsICdNJywgdSdxJyksCiAgICAoMHgxRDU5NywgJ00nLCB1J3InKSwKICAgICgweDFENTk4LCAnTScsIHUncycpLAogICAgKDB4MUQ1OTksICdNJywgdSd0JyksCiAgICAoMHgxRDU5QSwgJ00nLCB1J3UnKSwKICAgICgweDFENTlCLCAnTScsIHUndicpLAogICAgKDB4MUQ1OUMsICdNJywgdSd3JyksCiAgICAoMHgxRDU5RCwgJ00nLCB1J3gnKSwKICAgICgweDFENTlFLCAnTScsIHUneScpLAogICAgKDB4MUQ1OUYsICdNJywgdSd6JyksCiAgICAoMHgxRDVBMCwgJ00nLCB1J2EnKSwKICAgICgweDFENUExLCAnTScsIHUnYicpLAogICAgKDB4MUQ1QTIsICdNJywgdSdjJyksCiAgICAoMHgxRDVBMywgJ00nLCB1J2QnKSwKICAgICgweDFENUE0LCAnTScsIHUnZScpLAogICAgKDB4MUQ1QTUsICdNJywgdSdmJyksCiAgICAoMHgxRDVBNiwgJ00nLCB1J2cnKSwKICAgICgweDFENUE3LCAnTScsIHUnaCcpLAogICAgKDB4MUQ1QTgsICdNJywgdSdpJyksCiAgICAoMHgxRDVBOSwgJ00nLCB1J2onKSwKICAgICgweDFENUFBLCAnTScsIHUnaycpLAogICAgKDB4MUQ1QUIsICdNJywgdSdsJyksCiAgICAoMHgxRDVBQywgJ00nLCB1J20nKSwKICAgICgweDFENUFELCAnTScsIHUnbicpLAogICAgKDB4MUQ1QUUsICdNJywgdSdvJyksCiAgICAoMHgxRDVBRiwgJ00nLCB1J3AnKSwKICAgICgweDFENUIwLCAnTScsIHUncScpLAogICAgKDB4MUQ1QjEsICdNJywgdSdyJyksCiAgICAoMHgxRDVCMiwgJ00nLCB1J3MnKSwKICAgICgweDFENUIzLCAnTScsIHUndCcpLAogICAgKDB4MUQ1QjQsICdNJywgdSd1JyksCiAgICAoMHgxRDVCNSwgJ00nLCB1J3YnKSwKICAgICgweDFENUI2LCAnTScsIHUndycpLAogICAgKDB4MUQ1QjcsICdNJywgdSd4JyksCiAgICAoMHgxRDVCOCwgJ00nLCB1J3knKSwKICAgICgweDFENUI5LCAnTScsIHUneicpLAogICAgKDB4MUQ1QkEsICdNJywgdSdhJyksCiAgICAoMHgxRDVCQiwgJ00nLCB1J2InKSwKICAgICgweDFENUJDLCAnTScsIHUnYycpLAogICAgKDB4MUQ1QkQsICdNJywgdSdkJyksCiAgICAoMHgxRDVCRSwgJ00nLCB1J2UnKSwKICAgICgweDFENUJGLCAnTScsIHUnZicpLAogICAgKDB4MUQ1QzAsICdNJywgdSdnJyksCiAgICAoMHgxRDVDMSwgJ00nLCB1J2gnKSwKICAgICgweDFENUMyLCAnTScsIHUnaScpLAogICAgKDB4MUQ1QzMsICdNJywgdSdqJyksCiAgICAoMHgxRDVDNCwgJ00nLCB1J2snKSwKICAgICgweDFENUM1LCAnTScsIHUnbCcpLAogICAgKDB4MUQ1QzYsICdNJywgdSdtJyksCiAgICAoMHgxRDVDNywgJ00nLCB1J24nKSwKICAgICgweDFENUM4LCAnTScsIHUnbycpLAogICAgKDB4MUQ1QzksICdNJywgdSdwJyksCiAgICAoMHgxRDVDQSwgJ00nLCB1J3EnKSwKICAgICgweDFENUNCLCAnTScsIHUncicpLAogICAgKDB4MUQ1Q0MsICdNJywgdSdzJyksCiAgICAoMHgxRDVDRCwgJ00nLCB1J3QnKSwKICAgICgweDFENUNFLCAnTScsIHUndScpLAogICAgKDB4MUQ1Q0YsICdNJywgdSd2JyksCiAgICAoMHgxRDVEMCwgJ00nLCB1J3cnKSwKICAgICgweDFENUQxLCAnTScsIHUneCcpLAogICAgKDB4MUQ1RDIsICdNJywgdSd5JyksCiAgICBdCgpkZWYgX3NlZ181OCgpOgogICAgcmV0dXJuIFsKICAgICgweDFENUQzLCAnTScsIHUneicpLAogICAgKDB4MUQ1RDQsICdNJywgdSdhJyksCiAgICAoMHgxRDVENSwgJ00nLCB1J2InKSwKICAgICgweDFENUQ2LCAnTScsIHUnYycpLAogICAgKDB4MUQ1RDcsICdNJywgdSdkJyksCiAgICAoMHgxRDVEOCwgJ00nLCB1J2UnKSwKICAgICgweDFENUQ5LCAnTScsIHUnZicpLAogICAgKDB4MUQ1REEsICdNJywgdSdnJyksCiAgICAoMHgxRDVEQiwgJ00nLCB1J2gnKSwKICAgICgweDFENURDLCAnTScsIHUnaScpLAogICAgKDB4MUQ1REQsICdNJywgdSdqJyksCiAgICAoMHgxRDVERSwgJ00nLCB1J2snKSwKICAgICgweDFENURGLCAnTScsIHUnbCcpLAogICAgKDB4MUQ1RTAsICdNJywgdSdtJyksCiAgICAoMHgxRDVFMSwgJ00nLCB1J24nKSwKICAgICgweDFENUUyLCAnTScsIHUnbycpLAogICAgKDB4MUQ1RTMsICdNJywgdSdwJyksCiAgICAoMHgxRDVFNCwgJ00nLCB1J3EnKSwKICAgICgweDFENUU1LCAnTScsIHUncicpLAogICAgKDB4MUQ1RTYsICdNJywgdSdzJyksCiAgICAoMHgxRDVFNywgJ00nLCB1J3QnKSwKICAgICgweDFENUU4LCAnTScsIHUndScpLAogICAgKDB4MUQ1RTksICdNJywgdSd2JyksCiAgICAoMHgxRDVFQSwgJ00nLCB1J3cnKSwKICAgICgweDFENUVCLCAnTScsIHUneCcpLAogICAgKDB4MUQ1RUMsICdNJywgdSd5JyksCiAgICAoMHgxRDVFRCwgJ00nLCB1J3onKSwKICAgICgweDFENUVFLCAnTScsIHUnYScpLAogICAgKDB4MUQ1RUYsICdNJywgdSdiJyksCiAgICAoMHgxRDVGMCwgJ00nLCB1J2MnKSwKICAgICgweDFENUYxLCAnTScsIHUnZCcpLAogICAgKDB4MUQ1RjIsICdNJywgdSdlJyksCiAgICAoMHgxRDVGMywgJ00nLCB1J2YnKSwKICAgICgweDFENUY0LCAnTScsIHUnZycpLAogICAgKDB4MUQ1RjUsICdNJywgdSdoJyksCiAgICAoMHgxRDVGNiwgJ00nLCB1J2knKSwKICAgICgweDFENUY3LCAnTScsIHUnaicpLAogICAgKDB4MUQ1RjgsICdNJywgdSdrJyksCiAgICAoMHgxRDVGOSwgJ00nLCB1J2wnKSwKICAgICgweDFENUZBLCAnTScsIHUnbScpLAogICAgKDB4MUQ1RkIsICdNJywgdSduJyksCiAgICAoMHgxRDVGQywgJ00nLCB1J28nKSwKICAgICgweDFENUZELCAnTScsIHUncCcpLAogICAgKDB4MUQ1RkUsICdNJywgdSdxJyksCiAgICAoMHgxRDVGRiwgJ00nLCB1J3InKSwKICAgICgweDFENjAwLCAnTScsIHUncycpLAogICAgKDB4MUQ2MDEsICdNJywgdSd0JyksCiAgICAoMHgxRDYwMiwgJ00nLCB1J3UnKSwKICAgICgweDFENjAzLCAnTScsIHUndicpLAogICAgKDB4MUQ2MDQsICdNJywgdSd3JyksCiAgICAoMHgxRDYwNSwgJ00nLCB1J3gnKSwKICAgICgweDFENjA2LCAnTScsIHUneScpLAogICAgKDB4MUQ2MDcsICdNJywgdSd6JyksCiAgICAoMHgxRDYwOCwgJ00nLCB1J2EnKSwKICAgICgweDFENjA5LCAnTScsIHUnYicpLAogICAgKDB4MUQ2MEEsICdNJywgdSdjJyksCiAgICAoMHgxRDYwQiwgJ00nLCB1J2QnKSwKICAgICgweDFENjBDLCAnTScsIHUnZScpLAogICAgKDB4MUQ2MEQsICdNJywgdSdmJyksCiAgICAoMHgxRDYwRSwgJ00nLCB1J2cnKSwKICAgICgweDFENjBGLCAnTScsIHUnaCcpLAogICAgKDB4MUQ2MTAsICdNJywgdSdpJyksCiAgICAoMHgxRDYxMSwgJ00nLCB1J2onKSwKICAgICgweDFENjEyLCAnTScsIHUnaycpLAogICAgKDB4MUQ2MTMsICdNJywgdSdsJyksCiAgICAoMHgxRDYxNCwgJ00nLCB1J20nKSwKICAgICgweDFENjE1LCAnTScsIHUnbicpLAogICAgKDB4MUQ2MTYsICdNJywgdSdvJyksCiAgICAoMHgxRDYxNywgJ00nLCB1J3AnKSwKICAgICgweDFENjE4LCAnTScsIHUncScpLAogICAgKDB4MUQ2MTksICdNJywgdSdyJyksCiAgICAoMHgxRDYxQSwgJ00nLCB1J3MnKSwKICAgICgweDFENjFCLCAnTScsIHUndCcpLAogICAgKDB4MUQ2MUMsICdNJywgdSd1JyksCiAgICAoMHgxRDYxRCwgJ00nLCB1J3YnKSwKICAgICgweDFENjFFLCAnTScsIHUndycpLAogICAgKDB4MUQ2MUYsICdNJywgdSd4JyksCiAgICAoMHgxRDYyMCwgJ00nLCB1J3knKSwKICAgICgweDFENjIxLCAnTScsIHUneicpLAogICAgKDB4MUQ2MjIsICdNJywgdSdhJyksCiAgICAoMHgxRDYyMywgJ00nLCB1J2InKSwKICAgICgweDFENjI0LCAnTScsIHUnYycpLAogICAgKDB4MUQ2MjUsICdNJywgdSdkJyksCiAgICAoMHgxRDYyNiwgJ00nLCB1J2UnKSwKICAgICgweDFENjI3LCAnTScsIHUnZicpLAogICAgKDB4MUQ2MjgsICdNJywgdSdnJyksCiAgICAoMHgxRDYyOSwgJ00nLCB1J2gnKSwKICAgICgweDFENjJBLCAnTScsIHUnaScpLAogICAgKDB4MUQ2MkIsICdNJywgdSdqJyksCiAgICAoMHgxRDYyQywgJ00nLCB1J2snKSwKICAgICgweDFENjJELCAnTScsIHUnbCcpLAogICAgKDB4MUQ2MkUsICdNJywgdSdtJyksCiAgICAoMHgxRDYyRiwgJ00nLCB1J24nKSwKICAgICgweDFENjMwLCAnTScsIHUnbycpLAogICAgKDB4MUQ2MzEsICdNJywgdSdwJyksCiAgICAoMHgxRDYzMiwgJ00nLCB1J3EnKSwKICAgICgweDFENjMzLCAnTScsIHUncicpLAogICAgKDB4MUQ2MzQsICdNJywgdSdzJyksCiAgICAoMHgxRDYzNSwgJ00nLCB1J3QnKSwKICAgICgweDFENjM2LCAnTScsIHUndScpLAogICAgXQoKZGVmIF9zZWdfNTkoKToKICAgIHJldHVybiBbCiAgICAoMHgxRDYzNywgJ00nLCB1J3YnKSwKICAgICgweDFENjM4LCAnTScsIHUndycpLAogICAgKDB4MUQ2MzksICdNJywgdSd4JyksCiAgICAoMHgxRDYzQSwgJ00nLCB1J3knKSwKICAgICgweDFENjNCLCAnTScsIHUneicpLAogICAgKDB4MUQ2M0MsICdNJywgdSdhJyksCiAgICAoMHgxRDYzRCwgJ00nLCB1J2InKSwKICAgICgweDFENjNFLCAnTScsIHUnYycpLAogICAgKDB4MUQ2M0YsICdNJywgdSdkJyksCiAgICAoMHgxRDY0MCwgJ00nLCB1J2UnKSwKICAgICgweDFENjQxLCAnTScsIHUnZicpLAogICAgKDB4MUQ2NDIsICdNJywgdSdnJyksCiAgICAoMHgxRDY0MywgJ00nLCB1J2gnKSwKICAgICgweDFENjQ0LCAnTScsIHUnaScpLAogICAgKDB4MUQ2NDUsICdNJywgdSdqJyksCiAgICAoMHgxRDY0NiwgJ00nLCB1J2snKSwKICAgICgweDFENjQ3LCAnTScsIHUnbCcpLAogICAgKDB4MUQ2NDgsICdNJywgdSdtJyksCiAgICAoMHgxRDY0OSwgJ00nLCB1J24nKSwKICAgICgweDFENjRBLCAnTScsIHUnbycpLAogICAgKDB4MUQ2NEIsICdNJywgdSdwJyksCiAgICAoMHgxRDY0QywgJ00nLCB1J3EnKSwKICAgICgweDFENjRELCAnTScsIHUncicpLAogICAgKDB4MUQ2NEUsICdNJywgdSdzJyksCiAgICAoMHgxRDY0RiwgJ00nLCB1J3QnKSwKICAgICgweDFENjUwLCAnTScsIHUndScpLAogICAgKDB4MUQ2NTEsICdNJywgdSd2JyksCiAgICAoMHgxRDY1MiwgJ00nLCB1J3cnKSwKICAgICgweDFENjUzLCAnTScsIHUneCcpLAogICAgKDB4MUQ2NTQsICdNJywgdSd5JyksCiAgICAoMHgxRDY1NSwgJ00nLCB1J3onKSwKICAgICgweDFENjU2LCAnTScsIHUnYScpLAogICAgKDB4MUQ2NTcsICdNJywgdSdiJyksCiAgICAoMHgxRDY1OCwgJ00nLCB1J2MnKSwKICAgICgweDFENjU5LCAnTScsIHUnZCcpLAogICAgKDB4MUQ2NUEsICdNJywgdSdlJyksCiAgICAoMHgxRDY1QiwgJ00nLCB1J2YnKSwKICAgICgweDFENjVDLCAnTScsIHUnZycpLAogICAgKDB4MUQ2NUQsICdNJywgdSdoJyksCiAgICAoMHgxRDY1RSwgJ00nLCB1J2knKSwKICAgICgweDFENjVGLCAnTScsIHUnaicpLAogICAgKDB4MUQ2NjAsICdNJywgdSdrJyksCiAgICAoMHgxRDY2MSwgJ00nLCB1J2wnKSwKICAgICgweDFENjYyLCAnTScsIHUnbScpLAogICAgKDB4MUQ2NjMsICdNJywgdSduJyksCiAgICAoMHgxRDY2NCwgJ00nLCB1J28nKSwKICAgICgweDFENjY1LCAnTScsIHUncCcpLAogICAgKDB4MUQ2NjYsICdNJywgdSdxJyksCiAgICAoMHgxRDY2NywgJ00nLCB1J3InKSwKICAgICgweDFENjY4LCAnTScsIHUncycpLAogICAgKDB4MUQ2NjksICdNJywgdSd0JyksCiAgICAoMHgxRDY2QSwgJ00nLCB1J3UnKSwKICAgICgweDFENjZCLCAnTScsIHUndicpLAogICAgKDB4MUQ2NkMsICdNJywgdSd3JyksCiAgICAoMHgxRDY2RCwgJ00nLCB1J3gnKSwKICAgICgweDFENjZFLCAnTScsIHUneScpLAogICAgKDB4MUQ2NkYsICdNJywgdSd6JyksCiAgICAoMHgxRDY3MCwgJ00nLCB1J2EnKSwKICAgICgweDFENjcxLCAnTScsIHUnYicpLAogICAgKDB4MUQ2NzIsICdNJywgdSdjJyksCiAgICAoMHgxRDY3MywgJ00nLCB1J2QnKSwKICAgICgweDFENjc0LCAnTScsIHUnZScpLAogICAgKDB4MUQ2NzUsICdNJywgdSdmJyksCiAgICAoMHgxRDY3NiwgJ00nLCB1J2cnKSwKICAgICgweDFENjc3LCAnTScsIHUnaCcpLAogICAgKDB4MUQ2NzgsICdNJywgdSdpJyksCiAgICAoMHgxRDY3OSwgJ00nLCB1J2onKSwKICAgICgweDFENjdBLCAnTScsIHUnaycpLAogICAgKDB4MUQ2N0IsICdNJywgdSdsJyksCiAgICAoMHgxRDY3QywgJ00nLCB1J20nKSwKICAgICgweDFENjdELCAnTScsIHUnbicpLAogICAgKDB4MUQ2N0UsICdNJywgdSdvJyksCiAgICAoMHgxRDY3RiwgJ00nLCB1J3AnKSwKICAgICgweDFENjgwLCAnTScsIHUncScpLAogICAgKDB4MUQ2ODEsICdNJywgdSdyJyksCiAgICAoMHgxRDY4MiwgJ00nLCB1J3MnKSwKICAgICgweDFENjgzLCAnTScsIHUndCcpLAogICAgKDB4MUQ2ODQsICdNJywgdSd1JyksCiAgICAoMHgxRDY4NSwgJ00nLCB1J3YnKSwKICAgICgweDFENjg2LCAnTScsIHUndycpLAogICAgKDB4MUQ2ODcsICdNJywgdSd4JyksCiAgICAoMHgxRDY4OCwgJ00nLCB1J3knKSwKICAgICgweDFENjg5LCAnTScsIHUneicpLAogICAgKDB4MUQ2OEEsICdNJywgdSdhJyksCiAgICAoMHgxRDY4QiwgJ00nLCB1J2InKSwKICAgICgweDFENjhDLCAnTScsIHUnYycpLAogICAgKDB4MUQ2OEQsICdNJywgdSdkJyksCiAgICAoMHgxRDY4RSwgJ00nLCB1J2UnKSwKICAgICgweDFENjhGLCAnTScsIHUnZicpLAogICAgKDB4MUQ2OTAsICdNJywgdSdnJyksCiAgICAoMHgxRDY5MSwgJ00nLCB1J2gnKSwKICAgICgweDFENjkyLCAnTScsIHUnaScpLAogICAgKDB4MUQ2OTMsICdNJywgdSdqJyksCiAgICAoMHgxRDY5NCwgJ00nLCB1J2snKSwKICAgICgweDFENjk1LCAnTScsIHUnbCcpLAogICAgKDB4MUQ2OTYsICdNJywgdSdtJyksCiAgICAoMHgxRDY5NywgJ00nLCB1J24nKSwKICAgICgweDFENjk4LCAnTScsIHUnbycpLAogICAgKDB4MUQ2OTksICdNJywgdSdwJyksCiAgICAoMHgxRDY5QSwgJ00nLCB1J3EnKSwKICAgIF0KCmRlZiBfc2VnXzYwKCk6CiAgICByZXR1cm4gWwogICAgKDB4MUQ2OUIsICdNJywgdSdyJyksCiAgICAoMHgxRDY5QywgJ00nLCB1J3MnKSwKICAgICgweDFENjlELCAnTScsIHUndCcpLAogICAgKDB4MUQ2OUUsICdNJywgdSd1JyksCiAgICAoMHgxRDY5RiwgJ00nLCB1J3YnKSwKICAgICgweDFENkEwLCAnTScsIHUndycpLAogICAgKDB4MUQ2QTEsICdNJywgdSd4JyksCiAgICAoMHgxRDZBMiwgJ00nLCB1J3knKSwKICAgICgweDFENkEzLCAnTScsIHUneicpLAogICAgKDB4MUQ2QTQsICdNJywgdSfEsScpLAogICAgKDB4MUQ2QTUsICdNJywgdSfItycpLAogICAgKDB4MUQ2QTYsICdYJyksCiAgICAoMHgxRDZBOCwgJ00nLCB1J86xJyksCiAgICAoMHgxRDZBOSwgJ00nLCB1J86yJyksCiAgICAoMHgxRDZBQSwgJ00nLCB1J86zJyksCiAgICAoMHgxRDZBQiwgJ00nLCB1J860JyksCiAgICAoMHgxRDZBQywgJ00nLCB1J861JyksCiAgICAoMHgxRDZBRCwgJ00nLCB1J862JyksCiAgICAoMHgxRDZBRSwgJ00nLCB1J863JyksCiAgICAoMHgxRDZBRiwgJ00nLCB1J864JyksCiAgICAoMHgxRDZCMCwgJ00nLCB1J865JyksCiAgICAoMHgxRDZCMSwgJ00nLCB1J866JyksCiAgICAoMHgxRDZCMiwgJ00nLCB1J867JyksCiAgICAoMHgxRDZCMywgJ00nLCB1J868JyksCiAgICAoMHgxRDZCNCwgJ00nLCB1J869JyksCiAgICAoMHgxRDZCNSwgJ00nLCB1J86+JyksCiAgICAoMHgxRDZCNiwgJ00nLCB1J86/JyksCiAgICAoMHgxRDZCNywgJ00nLCB1J8+AJyksCiAgICAoMHgxRDZCOCwgJ00nLCB1J8+BJyksCiAgICAoMHgxRDZCOSwgJ00nLCB1J864JyksCiAgICAoMHgxRDZCQSwgJ00nLCB1J8+DJyksCiAgICAoMHgxRDZCQiwgJ00nLCB1J8+EJyksCiAgICAoMHgxRDZCQywgJ00nLCB1J8+FJyksCiAgICAoMHgxRDZCRCwgJ00nLCB1J8+GJyksCiAgICAoMHgxRDZCRSwgJ00nLCB1J8+HJyksCiAgICAoMHgxRDZCRiwgJ00nLCB1J8+IJyksCiAgICAoMHgxRDZDMCwgJ00nLCB1J8+JJyksCiAgICAoMHgxRDZDMSwgJ00nLCB1J+KIhycpLAogICAgKDB4MUQ2QzIsICdNJywgdSfOsScpLAogICAgKDB4MUQ2QzMsICdNJywgdSfOsicpLAogICAgKDB4MUQ2QzQsICdNJywgdSfOsycpLAogICAgKDB4MUQ2QzUsICdNJywgdSfOtCcpLAogICAgKDB4MUQ2QzYsICdNJywgdSfOtScpLAogICAgKDB4MUQ2QzcsICdNJywgdSfOticpLAogICAgKDB4MUQ2QzgsICdNJywgdSfOtycpLAogICAgKDB4MUQ2QzksICdNJywgdSfOuCcpLAogICAgKDB4MUQ2Q0EsICdNJywgdSfOuScpLAogICAgKDB4MUQ2Q0IsICdNJywgdSfOuicpLAogICAgKDB4MUQ2Q0MsICdNJywgdSfOuycpLAogICAgKDB4MUQ2Q0QsICdNJywgdSfOvCcpLAogICAgKDB4MUQ2Q0UsICdNJywgdSfOvScpLAogICAgKDB4MUQ2Q0YsICdNJywgdSfOvicpLAogICAgKDB4MUQ2RDAsICdNJywgdSfOvycpLAogICAgKDB4MUQ2RDEsICdNJywgdSfPgCcpLAogICAgKDB4MUQ2RDIsICdNJywgdSfPgScpLAogICAgKDB4MUQ2RDMsICdNJywgdSfPgycpLAogICAgKDB4MUQ2RDUsICdNJywgdSfPhCcpLAogICAgKDB4MUQ2RDYsICdNJywgdSfPhScpLAogICAgKDB4MUQ2RDcsICdNJywgdSfPhicpLAogICAgKDB4MUQ2RDgsICdNJywgdSfPhycpLAogICAgKDB4MUQ2RDksICdNJywgdSfPiCcpLAogICAgKDB4MUQ2REEsICdNJywgdSfPiScpLAogICAgKDB4MUQ2REIsICdNJywgdSfiiIInKSwKICAgICgweDFENkRDLCAnTScsIHUnzrUnKSwKICAgICgweDFENkRELCAnTScsIHUnzrgnKSwKICAgICgweDFENkRFLCAnTScsIHUnzronKSwKICAgICgweDFENkRGLCAnTScsIHUnz4YnKSwKICAgICgweDFENkUwLCAnTScsIHUnz4EnKSwKICAgICgweDFENkUxLCAnTScsIHUnz4AnKSwKICAgICgweDFENkUyLCAnTScsIHUnzrEnKSwKICAgICgweDFENkUzLCAnTScsIHUnzrInKSwKICAgICgweDFENkU0LCAnTScsIHUnzrMnKSwKICAgICgweDFENkU1LCAnTScsIHUnzrQnKSwKICAgICgweDFENkU2LCAnTScsIHUnzrUnKSwKICAgICgweDFENkU3LCAnTScsIHUnzrYnKSwKICAgICgweDFENkU4LCAnTScsIHUnzrcnKSwKICAgICgweDFENkU5LCAnTScsIHUnzrgnKSwKICAgICgweDFENkVBLCAnTScsIHUnzrknKSwKICAgICgweDFENkVCLCAnTScsIHUnzronKSwKICAgICgweDFENkVDLCAnTScsIHUnzrsnKSwKICAgICgweDFENkVELCAnTScsIHUnzrwnKSwKICAgICgweDFENkVFLCAnTScsIHUnzr0nKSwKICAgICgweDFENkVGLCAnTScsIHUnzr4nKSwKICAgICgweDFENkYwLCAnTScsIHUnzr8nKSwKICAgICgweDFENkYxLCAnTScsIHUnz4AnKSwKICAgICgweDFENkYyLCAnTScsIHUnz4EnKSwKICAgICgweDFENkYzLCAnTScsIHUnzrgnKSwKICAgICgweDFENkY0LCAnTScsIHUnz4MnKSwKICAgICgweDFENkY1LCAnTScsIHUnz4QnKSwKICAgICgweDFENkY2LCAnTScsIHUnz4UnKSwKICAgICgweDFENkY3LCAnTScsIHUnz4YnKSwKICAgICgweDFENkY4LCAnTScsIHUnz4cnKSwKICAgICgweDFENkY5LCAnTScsIHUnz4gnKSwKICAgICgweDFENkZBLCAnTScsIHUnz4knKSwKICAgICgweDFENkZCLCAnTScsIHUn4oiHJyksCiAgICAoMHgxRDZGQywgJ00nLCB1J86xJyksCiAgICAoMHgxRDZGRCwgJ00nLCB1J86yJyksCiAgICAoMHgxRDZGRSwgJ00nLCB1J86zJyksCiAgICAoMHgxRDZGRiwgJ00nLCB1J860JyksCiAgICAoMHgxRDcwMCwgJ00nLCB1J861JyksCiAgICBdCgpkZWYgX3NlZ182MSgpOgogICAgcmV0dXJuIFsKICAgICgweDFENzAxLCAnTScsIHUnzrYnKSwKICAgICgweDFENzAyLCAnTScsIHUnzrcnKSwKICAgICgweDFENzAzLCAnTScsIHUnzrgnKSwKICAgICgweDFENzA0LCAnTScsIHUnzrknKSwKICAgICgweDFENzA1LCAnTScsIHUnzronKSwKICAgICgweDFENzA2LCAnTScsIHUnzrsnKSwKICAgICgweDFENzA3LCAnTScsIHUnzrwnKSwKICAgICgweDFENzA4LCAnTScsIHUnzr0nKSwKICAgICgweDFENzA5LCAnTScsIHUnzr4nKSwKICAgICgweDFENzBBLCAnTScsIHUnzr8nKSwKICAgICgweDFENzBCLCAnTScsIHUnz4AnKSwKICAgICgweDFENzBDLCAnTScsIHUnz4EnKSwKICAgICgweDFENzBELCAnTScsIHUnz4MnKSwKICAgICgweDFENzBGLCAnTScsIHUnz4QnKSwKICAgICgweDFENzEwLCAnTScsIHUnz4UnKSwKICAgICgweDFENzExLCAnTScsIHUnz4YnKSwKICAgICgweDFENzEyLCAnTScsIHUnz4cnKSwKICAgICgweDFENzEzLCAnTScsIHUnz4gnKSwKICAgICgweDFENzE0LCAnTScsIHUnz4knKSwKICAgICgweDFENzE1LCAnTScsIHUn4oiCJyksCiAgICAoMHgxRDcxNiwgJ00nLCB1J861JyksCiAgICAoMHgxRDcxNywgJ00nLCB1J864JyksCiAgICAoMHgxRDcxOCwgJ00nLCB1J866JyksCiAgICAoMHgxRDcxOSwgJ00nLCB1J8+GJyksCiAgICAoMHgxRDcxQSwgJ00nLCB1J8+BJyksCiAgICAoMHgxRDcxQiwgJ00nLCB1J8+AJyksCiAgICAoMHgxRDcxQywgJ00nLCB1J86xJyksCiAgICAoMHgxRDcxRCwgJ00nLCB1J86yJyksCiAgICAoMHgxRDcxRSwgJ00nLCB1J86zJyksCiAgICAoMHgxRDcxRiwgJ00nLCB1J860JyksCiAgICAoMHgxRDcyMCwgJ00nLCB1J861JyksCiAgICAoMHgxRDcyMSwgJ00nLCB1J862JyksCiAgICAoMHgxRDcyMiwgJ00nLCB1J863JyksCiAgICAoMHgxRDcyMywgJ00nLCB1J864JyksCiAgICAoMHgxRDcyNCwgJ00nLCB1J865JyksCiAgICAoMHgxRDcyNSwgJ00nLCB1J866JyksCiAgICAoMHgxRDcyNiwgJ00nLCB1J867JyksCiAgICAoMHgxRDcyNywgJ00nLCB1J868JyksCiAgICAoMHgxRDcyOCwgJ00nLCB1J869JyksCiAgICAoMHgxRDcyOSwgJ00nLCB1J86+JyksCiAgICAoMHgxRDcyQSwgJ00nLCB1J86/JyksCiAgICAoMHgxRDcyQiwgJ00nLCB1J8+AJyksCiAgICAoMHgxRDcyQywgJ00nLCB1J8+BJyksCiAgICAoMHgxRDcyRCwgJ00nLCB1J864JyksCiAgICAoMHgxRDcyRSwgJ00nLCB1J8+DJyksCiAgICAoMHgxRDcyRiwgJ00nLCB1J8+EJyksCiAgICAoMHgxRDczMCwgJ00nLCB1J8+FJyksCiAgICAoMHgxRDczMSwgJ00nLCB1J8+GJyksCiAgICAoMHgxRDczMiwgJ00nLCB1J8+HJyksCiAgICAoMHgxRDczMywgJ00nLCB1J8+IJyksCiAgICAoMHgxRDczNCwgJ00nLCB1J8+JJyksCiAgICAoMHgxRDczNSwgJ00nLCB1J+KIhycpLAogICAgKDB4MUQ3MzYsICdNJywgdSfOsScpLAogICAgKDB4MUQ3MzcsICdNJywgdSfOsicpLAogICAgKDB4MUQ3MzgsICdNJywgdSfOsycpLAogICAgKDB4MUQ3MzksICdNJywgdSfOtCcpLAogICAgKDB4MUQ3M0EsICdNJywgdSfOtScpLAogICAgKDB4MUQ3M0IsICdNJywgdSfOticpLAogICAgKDB4MUQ3M0MsICdNJywgdSfOtycpLAogICAgKDB4MUQ3M0QsICdNJywgdSfOuCcpLAogICAgKDB4MUQ3M0UsICdNJywgdSfOuScpLAogICAgKDB4MUQ3M0YsICdNJywgdSfOuicpLAogICAgKDB4MUQ3NDAsICdNJywgdSfOuycpLAogICAgKDB4MUQ3NDEsICdNJywgdSfOvCcpLAogICAgKDB4MUQ3NDIsICdNJywgdSfOvScpLAogICAgKDB4MUQ3NDMsICdNJywgdSfOvicpLAogICAgKDB4MUQ3NDQsICdNJywgdSfOvycpLAogICAgKDB4MUQ3NDUsICdNJywgdSfPgCcpLAogICAgKDB4MUQ3NDYsICdNJywgdSfPgScpLAogICAgKDB4MUQ3NDcsICdNJywgdSfPgycpLAogICAgKDB4MUQ3NDksICdNJywgdSfPhCcpLAogICAgKDB4MUQ3NEEsICdNJywgdSfPhScpLAogICAgKDB4MUQ3NEIsICdNJywgdSfPhicpLAogICAgKDB4MUQ3NEMsICdNJywgdSfPhycpLAogICAgKDB4MUQ3NEQsICdNJywgdSfPiCcpLAogICAgKDB4MUQ3NEUsICdNJywgdSfPiScpLAogICAgKDB4MUQ3NEYsICdNJywgdSfiiIInKSwKICAgICgweDFENzUwLCAnTScsIHUnzrUnKSwKICAgICgweDFENzUxLCAnTScsIHUnzrgnKSwKICAgICgweDFENzUyLCAnTScsIHUnzronKSwKICAgICgweDFENzUzLCAnTScsIHUnz4YnKSwKICAgICgweDFENzU0LCAnTScsIHUnz4EnKSwKICAgICgweDFENzU1LCAnTScsIHUnz4AnKSwKICAgICgweDFENzU2LCAnTScsIHUnzrEnKSwKICAgICgweDFENzU3LCAnTScsIHUnzrInKSwKICAgICgweDFENzU4LCAnTScsIHUnzrMnKSwKICAgICgweDFENzU5LCAnTScsIHUnzrQnKSwKICAgICgweDFENzVBLCAnTScsIHUnzrUnKSwKICAgICgweDFENzVCLCAnTScsIHUnzrYnKSwKICAgICgweDFENzVDLCAnTScsIHUnzrcnKSwKICAgICgweDFENzVELCAnTScsIHUnzrgnKSwKICAgICgweDFENzVFLCAnTScsIHUnzrknKSwKICAgICgweDFENzVGLCAnTScsIHUnzronKSwKICAgICgweDFENzYwLCAnTScsIHUnzrsnKSwKICAgICgweDFENzYxLCAnTScsIHUnzrwnKSwKICAgICgweDFENzYyLCAnTScsIHUnzr0nKSwKICAgICgweDFENzYzLCAnTScsIHUnzr4nKSwKICAgICgweDFENzY0LCAnTScsIHUnzr8nKSwKICAgICgweDFENzY1LCAnTScsIHUnz4AnKSwKICAgICgweDFENzY2LCAnTScsIHUnz4EnKSwKICAgIF0KCmRlZiBfc2VnXzYyKCk6CiAgICByZXR1cm4gWwogICAgKDB4MUQ3NjcsICdNJywgdSfOuCcpLAogICAgKDB4MUQ3NjgsICdNJywgdSfPgycpLAogICAgKDB4MUQ3NjksICdNJywgdSfPhCcpLAogICAgKDB4MUQ3NkEsICdNJywgdSfPhScpLAogICAgKDB4MUQ3NkIsICdNJywgdSfPhicpLAogICAgKDB4MUQ3NkMsICdNJywgdSfPhycpLAogICAgKDB4MUQ3NkQsICdNJywgdSfPiCcpLAogICAgKDB4MUQ3NkUsICdNJywgdSfPiScpLAogICAgKDB4MUQ3NkYsICdNJywgdSfiiIcnKSwKICAgICgweDFENzcwLCAnTScsIHUnzrEnKSwKICAgICgweDFENzcxLCAnTScsIHUnzrInKSwKICAgICgweDFENzcyLCAnTScsIHUnzrMnKSwKICAgICgweDFENzczLCAnTScsIHUnzrQnKSwKICAgICgweDFENzc0LCAnTScsIHUnzrUnKSwKICAgICgweDFENzc1LCAnTScsIHUnzrYnKSwKICAgICgweDFENzc2LCAnTScsIHUnzrcnKSwKICAgICgweDFENzc3LCAnTScsIHUnzrgnKSwKICAgICgweDFENzc4LCAnTScsIHUnzrknKSwKICAgICgweDFENzc5LCAnTScsIHUnzronKSwKICAgICgweDFENzdBLCAnTScsIHUnzrsnKSwKICAgICgweDFENzdCLCAnTScsIHUnzrwnKSwKICAgICgweDFENzdDLCAnTScsIHUnzr0nKSwKICAgICgweDFENzdELCAnTScsIHUnzr4nKSwKICAgICgweDFENzdFLCAnTScsIHUnzr8nKSwKICAgICgweDFENzdGLCAnTScsIHUnz4AnKSwKICAgICgweDFENzgwLCAnTScsIHUnz4EnKSwKICAgICgweDFENzgxLCAnTScsIHUnz4MnKSwKICAgICgweDFENzgzLCAnTScsIHUnz4QnKSwKICAgICgweDFENzg0LCAnTScsIHUnz4UnKSwKICAgICgweDFENzg1LCAnTScsIHUnz4YnKSwKICAgICgweDFENzg2LCAnTScsIHUnz4cnKSwKICAgICgweDFENzg3LCAnTScsIHUnz4gnKSwKICAgICgweDFENzg4LCAnTScsIHUnz4knKSwKICAgICgweDFENzg5LCAnTScsIHUn4oiCJyksCiAgICAoMHgxRDc4QSwgJ00nLCB1J861JyksCiAgICAoMHgxRDc4QiwgJ00nLCB1J864JyksCiAgICAoMHgxRDc4QywgJ00nLCB1J866JyksCiAgICAoMHgxRDc4RCwgJ00nLCB1J8+GJyksCiAgICAoMHgxRDc4RSwgJ00nLCB1J8+BJyksCiAgICAoMHgxRDc4RiwgJ00nLCB1J8+AJyksCiAgICAoMHgxRDc5MCwgJ00nLCB1J86xJyksCiAgICAoMHgxRDc5MSwgJ00nLCB1J86yJyksCiAgICAoMHgxRDc5MiwgJ00nLCB1J86zJyksCiAgICAoMHgxRDc5MywgJ00nLCB1J860JyksCiAgICAoMHgxRDc5NCwgJ00nLCB1J861JyksCiAgICAoMHgxRDc5NSwgJ00nLCB1J862JyksCiAgICAoMHgxRDc5NiwgJ00nLCB1J863JyksCiAgICAoMHgxRDc5NywgJ00nLCB1J864JyksCiAgICAoMHgxRDc5OCwgJ00nLCB1J865JyksCiAgICAoMHgxRDc5OSwgJ00nLCB1J866JyksCiAgICAoMHgxRDc5QSwgJ00nLCB1J867JyksCiAgICAoMHgxRDc5QiwgJ00nLCB1J868JyksCiAgICAoMHgxRDc5QywgJ00nLCB1J869JyksCiAgICAoMHgxRDc5RCwgJ00nLCB1J86+JyksCiAgICAoMHgxRDc5RSwgJ00nLCB1J86/JyksCiAgICAoMHgxRDc5RiwgJ00nLCB1J8+AJyksCiAgICAoMHgxRDdBMCwgJ00nLCB1J8+BJyksCiAgICAoMHgxRDdBMSwgJ00nLCB1J864JyksCiAgICAoMHgxRDdBMiwgJ00nLCB1J8+DJyksCiAgICAoMHgxRDdBMywgJ00nLCB1J8+EJyksCiAgICAoMHgxRDdBNCwgJ00nLCB1J8+FJyksCiAgICAoMHgxRDdBNSwgJ00nLCB1J8+GJyksCiAgICAoMHgxRDdBNiwgJ00nLCB1J8+HJyksCiAgICAoMHgxRDdBNywgJ00nLCB1J8+IJyksCiAgICAoMHgxRDdBOCwgJ00nLCB1J8+JJyksCiAgICAoMHgxRDdBOSwgJ00nLCB1J+KIhycpLAogICAgKDB4MUQ3QUEsICdNJywgdSfOsScpLAogICAgKDB4MUQ3QUIsICdNJywgdSfOsicpLAogICAgKDB4MUQ3QUMsICdNJywgdSfOsycpLAogICAgKDB4MUQ3QUQsICdNJywgdSfOtCcpLAogICAgKDB4MUQ3QUUsICdNJywgdSfOtScpLAogICAgKDB4MUQ3QUYsICdNJywgdSfOticpLAogICAgKDB4MUQ3QjAsICdNJywgdSfOtycpLAogICAgKDB4MUQ3QjEsICdNJywgdSfOuCcpLAogICAgKDB4MUQ3QjIsICdNJywgdSfOuScpLAogICAgKDB4MUQ3QjMsICdNJywgdSfOuicpLAogICAgKDB4MUQ3QjQsICdNJywgdSfOuycpLAogICAgKDB4MUQ3QjUsICdNJywgdSfOvCcpLAogICAgKDB4MUQ3QjYsICdNJywgdSfOvScpLAogICAgKDB4MUQ3QjcsICdNJywgdSfOvicpLAogICAgKDB4MUQ3QjgsICdNJywgdSfOvycpLAogICAgKDB4MUQ3QjksICdNJywgdSfPgCcpLAogICAgKDB4MUQ3QkEsICdNJywgdSfPgScpLAogICAgKDB4MUQ3QkIsICdNJywgdSfPgycpLAogICAgKDB4MUQ3QkQsICdNJywgdSfPhCcpLAogICAgKDB4MUQ3QkUsICdNJywgdSfPhScpLAogICAgKDB4MUQ3QkYsICdNJywgdSfPhicpLAogICAgKDB4MUQ3QzAsICdNJywgdSfPhycpLAogICAgKDB4MUQ3QzEsICdNJywgdSfPiCcpLAogICAgKDB4MUQ3QzIsICdNJywgdSfPiScpLAogICAgKDB4MUQ3QzMsICdNJywgdSfiiIInKSwKICAgICgweDFEN0M0LCAnTScsIHUnzrUnKSwKICAgICgweDFEN0M1LCAnTScsIHUnzrgnKSwKICAgICgweDFEN0M2LCAnTScsIHUnzronKSwKICAgICgweDFEN0M3LCAnTScsIHUnz4YnKSwKICAgICgweDFEN0M4LCAnTScsIHUnz4EnKSwKICAgICgweDFEN0M5LCAnTScsIHUnz4AnKSwKICAgICgweDFEN0NBLCAnTScsIHUnz50nKSwKICAgICgweDFEN0NDLCAnWCcpLAogICAgKDB4MUQ3Q0UsICdNJywgdScwJyksCiAgICBdCgpkZWYgX3NlZ182MygpOgogICAgcmV0dXJuIFsKICAgICgweDFEN0NGLCAnTScsIHUnMScpLAogICAgKDB4MUQ3RDAsICdNJywgdScyJyksCiAgICAoMHgxRDdEMSwgJ00nLCB1JzMnKSwKICAgICgweDFEN0QyLCAnTScsIHUnNCcpLAogICAgKDB4MUQ3RDMsICdNJywgdSc1JyksCiAgICAoMHgxRDdENCwgJ00nLCB1JzYnKSwKICAgICgweDFEN0Q1LCAnTScsIHUnNycpLAogICAgKDB4MUQ3RDYsICdNJywgdSc4JyksCiAgICAoMHgxRDdENywgJ00nLCB1JzknKSwKICAgICgweDFEN0Q4LCAnTScsIHUnMCcpLAogICAgKDB4MUQ3RDksICdNJywgdScxJyksCiAgICAoMHgxRDdEQSwgJ00nLCB1JzInKSwKICAgICgweDFEN0RCLCAnTScsIHUnMycpLAogICAgKDB4MUQ3REMsICdNJywgdSc0JyksCiAgICAoMHgxRDdERCwgJ00nLCB1JzUnKSwKICAgICgweDFEN0RFLCAnTScsIHUnNicpLAogICAgKDB4MUQ3REYsICdNJywgdSc3JyksCiAgICAoMHgxRDdFMCwgJ00nLCB1JzgnKSwKICAgICgweDFEN0UxLCAnTScsIHUnOScpLAogICAgKDB4MUQ3RTIsICdNJywgdScwJyksCiAgICAoMHgxRDdFMywgJ00nLCB1JzEnKSwKICAgICgweDFEN0U0LCAnTScsIHUnMicpLAogICAgKDB4MUQ3RTUsICdNJywgdSczJyksCiAgICAoMHgxRDdFNiwgJ00nLCB1JzQnKSwKICAgICgweDFEN0U3LCAnTScsIHUnNScpLAogICAgKDB4MUQ3RTgsICdNJywgdSc2JyksCiAgICAoMHgxRDdFOSwgJ00nLCB1JzcnKSwKICAgICgweDFEN0VBLCAnTScsIHUnOCcpLAogICAgKDB4MUQ3RUIsICdNJywgdSc5JyksCiAgICAoMHgxRDdFQywgJ00nLCB1JzAnKSwKICAgICgweDFEN0VELCAnTScsIHUnMScpLAogICAgKDB4MUQ3RUUsICdNJywgdScyJyksCiAgICAoMHgxRDdFRiwgJ00nLCB1JzMnKSwKICAgICgweDFEN0YwLCAnTScsIHUnNCcpLAogICAgKDB4MUQ3RjEsICdNJywgdSc1JyksCiAgICAoMHgxRDdGMiwgJ00nLCB1JzYnKSwKICAgICgweDFEN0YzLCAnTScsIHUnNycpLAogICAgKDB4MUQ3RjQsICdNJywgdSc4JyksCiAgICAoMHgxRDdGNSwgJ00nLCB1JzknKSwKICAgICgweDFEN0Y2LCAnTScsIHUnMCcpLAogICAgKDB4MUQ3RjcsICdNJywgdScxJyksCiAgICAoMHgxRDdGOCwgJ00nLCB1JzInKSwKICAgICgweDFEN0Y5LCAnTScsIHUnMycpLAogICAgKDB4MUQ3RkEsICdNJywgdSc0JyksCiAgICAoMHgxRDdGQiwgJ00nLCB1JzUnKSwKICAgICgweDFEN0ZDLCAnTScsIHUnNicpLAogICAgKDB4MUQ3RkQsICdNJywgdSc3JyksCiAgICAoMHgxRDdGRSwgJ00nLCB1JzgnKSwKICAgICgweDFEN0ZGLCAnTScsIHUnOScpLAogICAgKDB4MUQ4MDAsICdYJyksCiAgICAoMHgxRUUwMCwgJ00nLCB1J9inJyksCiAgICAoMHgxRUUwMSwgJ00nLCB1J9ioJyksCiAgICAoMHgxRUUwMiwgJ00nLCB1J9isJyksCiAgICAoMHgxRUUwMywgJ00nLCB1J9ivJyksCiAgICAoMHgxRUUwNCwgJ1gnKSwKICAgICgweDFFRTA1LCAnTScsIHUn2YgnKSwKICAgICgweDFFRTA2LCAnTScsIHUn2LInKSwKICAgICgweDFFRTA3LCAnTScsIHUn2K0nKSwKICAgICgweDFFRTA4LCAnTScsIHUn2LcnKSwKICAgICgweDFFRTA5LCAnTScsIHUn2YonKSwKICAgICgweDFFRTBBLCAnTScsIHUn2YMnKSwKICAgICgweDFFRTBCLCAnTScsIHUn2YQnKSwKICAgICgweDFFRTBDLCAnTScsIHUn2YUnKSwKICAgICgweDFFRTBELCAnTScsIHUn2YYnKSwKICAgICgweDFFRTBFLCAnTScsIHUn2LMnKSwKICAgICgweDFFRTBGLCAnTScsIHUn2LknKSwKICAgICgweDFFRTEwLCAnTScsIHUn2YEnKSwKICAgICgweDFFRTExLCAnTScsIHUn2LUnKSwKICAgICgweDFFRTEyLCAnTScsIHUn2YInKSwKICAgICgweDFFRTEzLCAnTScsIHUn2LEnKSwKICAgICgweDFFRTE0LCAnTScsIHUn2LQnKSwKICAgICgweDFFRTE1LCAnTScsIHUn2KonKSwKICAgICgweDFFRTE2LCAnTScsIHUn2KsnKSwKICAgICgweDFFRTE3LCAnTScsIHUn2K4nKSwKICAgICgweDFFRTE4LCAnTScsIHUn2LAnKSwKICAgICgweDFFRTE5LCAnTScsIHUn2LYnKSwKICAgICgweDFFRTFBLCAnTScsIHUn2LgnKSwKICAgICgweDFFRTFCLCAnTScsIHUn2LonKSwKICAgICgweDFFRTFDLCAnTScsIHUn2a4nKSwKICAgICgweDFFRTFELCAnTScsIHUn2ronKSwKICAgICgweDFFRTFFLCAnTScsIHUn2qEnKSwKICAgICgweDFFRTFGLCAnTScsIHUn2a8nKSwKICAgICgweDFFRTIwLCAnWCcpLAogICAgKDB4MUVFMjEsICdNJywgdSfYqCcpLAogICAgKDB4MUVFMjIsICdNJywgdSfYrCcpLAogICAgKDB4MUVFMjMsICdYJyksCiAgICAoMHgxRUUyNCwgJ00nLCB1J9mHJyksCiAgICAoMHgxRUUyNSwgJ1gnKSwKICAgICgweDFFRTI3LCAnTScsIHUn2K0nKSwKICAgICgweDFFRTI4LCAnWCcpLAogICAgKDB4MUVFMjksICdNJywgdSfZiicpLAogICAgKDB4MUVFMkEsICdNJywgdSfZgycpLAogICAgKDB4MUVFMkIsICdNJywgdSfZhCcpLAogICAgKDB4MUVFMkMsICdNJywgdSfZhScpLAogICAgKDB4MUVFMkQsICdNJywgdSfZhicpLAogICAgKDB4MUVFMkUsICdNJywgdSfYsycpLAogICAgKDB4MUVFMkYsICdNJywgdSfYuScpLAogICAgKDB4MUVFMzAsICdNJywgdSfZgScpLAogICAgKDB4MUVFMzEsICdNJywgdSfYtScpLAogICAgKDB4MUVFMzIsICdNJywgdSfZgicpLAogICAgXQoKZGVmIF9zZWdfNjQoKToKICAgIHJldHVybiBbCiAgICAoMHgxRUUzMywgJ1gnKSwKICAgICgweDFFRTM0LCAnTScsIHUn2LQnKSwKICAgICgweDFFRTM1LCAnTScsIHUn2KonKSwKICAgICgweDFFRTM2LCAnTScsIHUn2KsnKSwKICAgICgweDFFRTM3LCAnTScsIHUn2K4nKSwKICAgICgweDFFRTM4LCAnWCcpLAogICAgKDB4MUVFMzksICdNJywgdSfYticpLAogICAgKDB4MUVFM0EsICdYJyksCiAgICAoMHgxRUUzQiwgJ00nLCB1J9i6JyksCiAgICAoMHgxRUUzQywgJ1gnKSwKICAgICgweDFFRTQyLCAnTScsIHUn2KwnKSwKICAgICgweDFFRTQzLCAnWCcpLAogICAgKDB4MUVFNDcsICdNJywgdSfYrScpLAogICAgKDB4MUVFNDgsICdYJyksCiAgICAoMHgxRUU0OSwgJ00nLCB1J9mKJyksCiAgICAoMHgxRUU0QSwgJ1gnKSwKICAgICgweDFFRTRCLCAnTScsIHUn2YQnKSwKICAgICgweDFFRTRDLCAnWCcpLAogICAgKDB4MUVFNEQsICdNJywgdSfZhicpLAogICAgKDB4MUVFNEUsICdNJywgdSfYsycpLAogICAgKDB4MUVFNEYsICdNJywgdSfYuScpLAogICAgKDB4MUVFNTAsICdYJyksCiAgICAoMHgxRUU1MSwgJ00nLCB1J9i1JyksCiAgICAoMHgxRUU1MiwgJ00nLCB1J9mCJyksCiAgICAoMHgxRUU1MywgJ1gnKSwKICAgICgweDFFRTU0LCAnTScsIHUn2LQnKSwKICAgICgweDFFRTU1LCAnWCcpLAogICAgKDB4MUVFNTcsICdNJywgdSfYricpLAogICAgKDB4MUVFNTgsICdYJyksCiAgICAoMHgxRUU1OSwgJ00nLCB1J9i2JyksCiAgICAoMHgxRUU1QSwgJ1gnKSwKICAgICgweDFFRTVCLCAnTScsIHUn2LonKSwKICAgICgweDFFRTVDLCAnWCcpLAogICAgKDB4MUVFNUQsICdNJywgdSfauicpLAogICAgKDB4MUVFNUUsICdYJyksCiAgICAoMHgxRUU1RiwgJ00nLCB1J9mvJyksCiAgICAoMHgxRUU2MCwgJ1gnKSwKICAgICgweDFFRTYxLCAnTScsIHUn2KgnKSwKICAgICgweDFFRTYyLCAnTScsIHUn2KwnKSwKICAgICgweDFFRTYzLCAnWCcpLAogICAgKDB4MUVFNjQsICdNJywgdSfZhycpLAogICAgKDB4MUVFNjUsICdYJyksCiAgICAoMHgxRUU2NywgJ00nLCB1J9itJyksCiAgICAoMHgxRUU2OCwgJ00nLCB1J9i3JyksCiAgICAoMHgxRUU2OSwgJ00nLCB1J9mKJyksCiAgICAoMHgxRUU2QSwgJ00nLCB1J9mDJyksCiAgICAoMHgxRUU2QiwgJ1gnKSwKICAgICgweDFFRTZDLCAnTScsIHUn2YUnKSwKICAgICgweDFFRTZELCAnTScsIHUn2YYnKSwKICAgICgweDFFRTZFLCAnTScsIHUn2LMnKSwKICAgICgweDFFRTZGLCAnTScsIHUn2LknKSwKICAgICgweDFFRTcwLCAnTScsIHUn2YEnKSwKICAgICgweDFFRTcxLCAnTScsIHUn2LUnKSwKICAgICgweDFFRTcyLCAnTScsIHUn2YInKSwKICAgICgweDFFRTczLCAnWCcpLAogICAgKDB4MUVFNzQsICdNJywgdSfYtCcpLAogICAgKDB4MUVFNzUsICdNJywgdSfYqicpLAogICAgKDB4MUVFNzYsICdNJywgdSfYqycpLAogICAgKDB4MUVFNzcsICdNJywgdSfYricpLAogICAgKDB4MUVFNzgsICdYJyksCiAgICAoMHgxRUU3OSwgJ00nLCB1J9i2JyksCiAgICAoMHgxRUU3QSwgJ00nLCB1J9i4JyksCiAgICAoMHgxRUU3QiwgJ00nLCB1J9i6JyksCiAgICAoMHgxRUU3QywgJ00nLCB1J9muJyksCiAgICAoMHgxRUU3RCwgJ1gnKSwKICAgICgweDFFRTdFLCAnTScsIHUn2qEnKSwKICAgICgweDFFRTdGLCAnWCcpLAogICAgKDB4MUVFODAsICdNJywgdSfYpycpLAogICAgKDB4MUVFODEsICdNJywgdSfYqCcpLAogICAgKDB4MUVFODIsICdNJywgdSfYrCcpLAogICAgKDB4MUVFODMsICdNJywgdSfYrycpLAogICAgKDB4MUVFODQsICdNJywgdSfZhycpLAogICAgKDB4MUVFODUsICdNJywgdSfZiCcpLAogICAgKDB4MUVFODYsICdNJywgdSfYsicpLAogICAgKDB4MUVFODcsICdNJywgdSfYrScpLAogICAgKDB4MUVFODgsICdNJywgdSfYtycpLAogICAgKDB4MUVFODksICdNJywgdSfZiicpLAogICAgKDB4MUVFOEEsICdYJyksCiAgICAoMHgxRUU4QiwgJ00nLCB1J9mEJyksCiAgICAoMHgxRUU4QywgJ00nLCB1J9mFJyksCiAgICAoMHgxRUU4RCwgJ00nLCB1J9mGJyksCiAgICAoMHgxRUU4RSwgJ00nLCB1J9izJyksCiAgICAoMHgxRUU4RiwgJ00nLCB1J9i5JyksCiAgICAoMHgxRUU5MCwgJ00nLCB1J9mBJyksCiAgICAoMHgxRUU5MSwgJ00nLCB1J9i1JyksCiAgICAoMHgxRUU5MiwgJ00nLCB1J9mCJyksCiAgICAoMHgxRUU5MywgJ00nLCB1J9ixJyksCiAgICAoMHgxRUU5NCwgJ00nLCB1J9i0JyksCiAgICAoMHgxRUU5NSwgJ00nLCB1J9iqJyksCiAgICAoMHgxRUU5NiwgJ00nLCB1J9irJyksCiAgICAoMHgxRUU5NywgJ00nLCB1J9iuJyksCiAgICAoMHgxRUU5OCwgJ00nLCB1J9iwJyksCiAgICAoMHgxRUU5OSwgJ00nLCB1J9i2JyksCiAgICAoMHgxRUU5QSwgJ00nLCB1J9i4JyksCiAgICAoMHgxRUU5QiwgJ00nLCB1J9i6JyksCiAgICAoMHgxRUU5QywgJ1gnKSwKICAgICgweDFFRUExLCAnTScsIHUn2KgnKSwKICAgICgweDFFRUEyLCAnTScsIHUn2KwnKSwKICAgICgweDFFRUEzLCAnTScsIHUn2K8nKSwKICAgICgweDFFRUE0LCAnWCcpLAogICAgXQoKZGVmIF9zZWdfNjUoKToKICAgIHJldHVybiBbCiAgICAoMHgxRUVBNSwgJ00nLCB1J9mIJyksCiAgICAoMHgxRUVBNiwgJ00nLCB1J9iyJyksCiAgICAoMHgxRUVBNywgJ00nLCB1J9itJyksCiAgICAoMHgxRUVBOCwgJ00nLCB1J9i3JyksCiAgICAoMHgxRUVBOSwgJ00nLCB1J9mKJyksCiAgICAoMHgxRUVBQSwgJ1gnKSwKICAgICgweDFFRUFCLCAnTScsIHUn2YQnKSwKICAgICgweDFFRUFDLCAnTScsIHUn2YUnKSwKICAgICgweDFFRUFELCAnTScsIHUn2YYnKSwKICAgICgweDFFRUFFLCAnTScsIHUn2LMnKSwKICAgICgweDFFRUFGLCAnTScsIHUn2LknKSwKICAgICgweDFFRUIwLCAnTScsIHUn2YEnKSwKICAgICgweDFFRUIxLCAnTScsIHUn2LUnKSwKICAgICgweDFFRUIyLCAnTScsIHUn2YInKSwKICAgICgweDFFRUIzLCAnTScsIHUn2LEnKSwKICAgICgweDFFRUI0LCAnTScsIHUn2LQnKSwKICAgICgweDFFRUI1LCAnTScsIHUn2KonKSwKICAgICgweDFFRUI2LCAnTScsIHUn2KsnKSwKICAgICgweDFFRUI3LCAnTScsIHUn2K4nKSwKICAgICgweDFFRUI4LCAnTScsIHUn2LAnKSwKICAgICgweDFFRUI5LCAnTScsIHUn2LYnKSwKICAgICgweDFFRUJBLCAnTScsIHUn2LgnKSwKICAgICgweDFFRUJCLCAnTScsIHUn2LonKSwKICAgICgweDFFRUJDLCAnWCcpLAogICAgKDB4MUVFRjAsICdWJyksCiAgICAoMHgxRUVGMiwgJ1gnKSwKICAgICgweDFGMDAwLCAnVicpLAogICAgKDB4MUYwMkMsICdYJyksCiAgICAoMHgxRjAzMCwgJ1YnKSwKICAgICgweDFGMDk0LCAnWCcpLAogICAgKDB4MUYwQTAsICdWJyksCiAgICAoMHgxRjBBRiwgJ1gnKSwKICAgICgweDFGMEIxLCAnVicpLAogICAgKDB4MUYwQkYsICdYJyksCiAgICAoMHgxRjBDMSwgJ1YnKSwKICAgICgweDFGMEQwLCAnWCcpLAogICAgKDB4MUYwRDEsICdWJyksCiAgICAoMHgxRjBFMCwgJ1gnKSwKICAgICgweDFGMTAxLCAnMycsIHUnMCwnKSwKICAgICgweDFGMTAyLCAnMycsIHUnMSwnKSwKICAgICgweDFGMTAzLCAnMycsIHUnMiwnKSwKICAgICgweDFGMTA0LCAnMycsIHUnMywnKSwKICAgICgweDFGMTA1LCAnMycsIHUnNCwnKSwKICAgICgweDFGMTA2LCAnMycsIHUnNSwnKSwKICAgICgweDFGMTA3LCAnMycsIHUnNiwnKSwKICAgICgweDFGMTA4LCAnMycsIHUnNywnKSwKICAgICgweDFGMTA5LCAnMycsIHUnOCwnKSwKICAgICgweDFGMTBBLCAnMycsIHUnOSwnKSwKICAgICgweDFGMTBCLCAnWCcpLAogICAgKDB4MUYxMTAsICczJywgdScoYSknKSwKICAgICgweDFGMTExLCAnMycsIHUnKGIpJyksCiAgICAoMHgxRjExMiwgJzMnLCB1JyhjKScpLAogICAgKDB4MUYxMTMsICczJywgdScoZCknKSwKICAgICgweDFGMTE0LCAnMycsIHUnKGUpJyksCiAgICAoMHgxRjExNSwgJzMnLCB1JyhmKScpLAogICAgKDB4MUYxMTYsICczJywgdScoZyknKSwKICAgICgweDFGMTE3LCAnMycsIHUnKGgpJyksCiAgICAoMHgxRjExOCwgJzMnLCB1JyhpKScpLAogICAgKDB4MUYxMTksICczJywgdScoaiknKSwKICAgICgweDFGMTFBLCAnMycsIHUnKGspJyksCiAgICAoMHgxRjExQiwgJzMnLCB1JyhsKScpLAogICAgKDB4MUYxMUMsICczJywgdScobSknKSwKICAgICgweDFGMTFELCAnMycsIHUnKG4pJyksCiAgICAoMHgxRjExRSwgJzMnLCB1JyhvKScpLAogICAgKDB4MUYxMUYsICczJywgdScocCknKSwKICAgICgweDFGMTIwLCAnMycsIHUnKHEpJyksCiAgICAoMHgxRjEyMSwgJzMnLCB1JyhyKScpLAogICAgKDB4MUYxMjIsICczJywgdScocyknKSwKICAgICgweDFGMTIzLCAnMycsIHUnKHQpJyksCiAgICAoMHgxRjEyNCwgJzMnLCB1Jyh1KScpLAogICAgKDB4MUYxMjUsICczJywgdScodiknKSwKICAgICgweDFGMTI2LCAnMycsIHUnKHcpJyksCiAgICAoMHgxRjEyNywgJzMnLCB1Jyh4KScpLAogICAgKDB4MUYxMjgsICczJywgdScoeSknKSwKICAgICgweDFGMTI5LCAnMycsIHUnKHopJyksCiAgICAoMHgxRjEyQSwgJ00nLCB1J+OAlHPjgJUnKSwKICAgICgweDFGMTJCLCAnTScsIHUnYycpLAogICAgKDB4MUYxMkMsICdNJywgdSdyJyksCiAgICAoMHgxRjEyRCwgJ00nLCB1J2NkJyksCiAgICAoMHgxRjEyRSwgJ00nLCB1J3d6JyksCiAgICAoMHgxRjEyRiwgJ1gnKSwKICAgICgweDFGMTMwLCAnTScsIHUnYScpLAogICAgKDB4MUYxMzEsICdNJywgdSdiJyksCiAgICAoMHgxRjEzMiwgJ00nLCB1J2MnKSwKICAgICgweDFGMTMzLCAnTScsIHUnZCcpLAogICAgKDB4MUYxMzQsICdNJywgdSdlJyksCiAgICAoMHgxRjEzNSwgJ00nLCB1J2YnKSwKICAgICgweDFGMTM2LCAnTScsIHUnZycpLAogICAgKDB4MUYxMzcsICdNJywgdSdoJyksCiAgICAoMHgxRjEzOCwgJ00nLCB1J2knKSwKICAgICgweDFGMTM5LCAnTScsIHUnaicpLAogICAgKDB4MUYxM0EsICdNJywgdSdrJyksCiAgICAoMHgxRjEzQiwgJ00nLCB1J2wnKSwKICAgICgweDFGMTNDLCAnTScsIHUnbScpLAogICAgKDB4MUYxM0QsICdNJywgdSduJyksCiAgICAoMHgxRjEzRSwgJ00nLCB1J28nKSwKICAgICgweDFGMTNGLCAnTScsIHUncCcpLAogICAgKDB4MUYxNDAsICdNJywgdSdxJyksCiAgICAoMHgxRjE0MSwgJ00nLCB1J3InKSwKICAgICgweDFGMTQyLCAnTScsIHUncycpLAogICAgXQoKZGVmIF9zZWdfNjYoKToKICAgIHJldHVybiBbCiAgICAoMHgxRjE0MywgJ00nLCB1J3QnKSwKICAgICgweDFGMTQ0LCAnTScsIHUndScpLAogICAgKDB4MUYxNDUsICdNJywgdSd2JyksCiAgICAoMHgxRjE0NiwgJ00nLCB1J3cnKSwKICAgICgweDFGMTQ3LCAnTScsIHUneCcpLAogICAgKDB4MUYxNDgsICdNJywgdSd5JyksCiAgICAoMHgxRjE0OSwgJ00nLCB1J3onKSwKICAgICgweDFGMTRBLCAnTScsIHUnaHYnKSwKICAgICgweDFGMTRCLCAnTScsIHUnbXYnKSwKICAgICgweDFGMTRDLCAnTScsIHUnc2QnKSwKICAgICgweDFGMTRELCAnTScsIHUnc3MnKSwKICAgICgweDFGMTRFLCAnTScsIHUncHB2JyksCiAgICAoMHgxRjE0RiwgJ00nLCB1J3djJyksCiAgICAoMHgxRjE1MCwgJ1YnKSwKICAgICgweDFGMTZBLCAnTScsIHUnbWMnKSwKICAgICgweDFGMTZCLCAnTScsIHUnbWQnKSwKICAgICgweDFGMTZDLCAnWCcpLAogICAgKDB4MUYxNzAsICdWJyksCiAgICAoMHgxRjE5MCwgJ00nLCB1J2RqJyksCiAgICAoMHgxRjE5MSwgJ1YnKSwKICAgICgweDFGMTlCLCAnWCcpLAogICAgKDB4MUYxRTYsICdWJyksCiAgICAoMHgxRjIwMCwgJ00nLCB1J+OBu+OBiycpLAogICAgKDB4MUYyMDEsICdNJywgdSfjgrPjgrMnKSwKICAgICgweDFGMjAyLCAnTScsIHUn44K1JyksCiAgICAoMHgxRjIwMywgJ1gnKSwKICAgICgweDFGMjEwLCAnTScsIHUn5omLJyksCiAgICAoMHgxRjIxMSwgJ00nLCB1J+WtlycpLAogICAgKDB4MUYyMTIsICdNJywgdSflj4wnKSwKICAgICgweDFGMjEzLCAnTScsIHUn44OHJyksCiAgICAoMHgxRjIxNCwgJ00nLCB1J+S6jCcpLAogICAgKDB4MUYyMTUsICdNJywgdSflpJonKSwKICAgICgweDFGMjE2LCAnTScsIHUn6KejJyksCiAgICAoMHgxRjIxNywgJ00nLCB1J+WkqScpLAogICAgKDB4MUYyMTgsICdNJywgdSfkuqQnKSwKICAgICgweDFGMjE5LCAnTScsIHUn5pigJyksCiAgICAoMHgxRjIxQSwgJ00nLCB1J+eEoScpLAogICAgKDB4MUYyMUIsICdNJywgdSfmlpknKSwKICAgICgweDFGMjFDLCAnTScsIHUn5YmNJyksCiAgICAoMHgxRjIxRCwgJ00nLCB1J+W+jCcpLAogICAgKDB4MUYyMUUsICdNJywgdSflho0nKSwKICAgICgweDFGMjFGLCAnTScsIHUn5pawJyksCiAgICAoMHgxRjIyMCwgJ00nLCB1J+WInScpLAogICAgKDB4MUYyMjEsICdNJywgdSfntYInKSwKICAgICgweDFGMjIyLCAnTScsIHUn55SfJyksCiAgICAoMHgxRjIyMywgJ00nLCB1J+iyqScpLAogICAgKDB4MUYyMjQsICdNJywgdSflo7AnKSwKICAgICgweDFGMjI1LCAnTScsIHUn5ZC5JyksCiAgICAoMHgxRjIyNiwgJ00nLCB1J+a8lCcpLAogICAgKDB4MUYyMjcsICdNJywgdSfmipUnKSwKICAgICgweDFGMjI4LCAnTScsIHUn5o2VJyksCiAgICAoMHgxRjIyOSwgJ00nLCB1J+S4gCcpLAogICAgKDB4MUYyMkEsICdNJywgdSfkuIknKSwKICAgICgweDFGMjJCLCAnTScsIHUn6YGKJyksCiAgICAoMHgxRjIyQywgJ00nLCB1J+W3picpLAogICAgKDB4MUYyMkQsICdNJywgdSfkuK0nKSwKICAgICgweDFGMjJFLCAnTScsIHUn5Y+zJyksCiAgICAoMHgxRjIyRiwgJ00nLCB1J+aMhycpLAogICAgKDB4MUYyMzAsICdNJywgdSfotbAnKSwKICAgICgweDFGMjMxLCAnTScsIHUn5omTJyksCiAgICAoMHgxRjIzMiwgJ00nLCB1J+emgScpLAogICAgKDB4MUYyMzMsICdNJywgdSfnqbonKSwKICAgICgweDFGMjM0LCAnTScsIHUn5ZCIJyksCiAgICAoMHgxRjIzNSwgJ00nLCB1J+a6gCcpLAogICAgKDB4MUYyMzYsICdNJywgdSfmnIknKSwKICAgICgweDFGMjM3LCAnTScsIHUn5pyIJyksCiAgICAoMHgxRjIzOCwgJ00nLCB1J+eUsycpLAogICAgKDB4MUYyMzksICdNJywgdSflibInKSwKICAgICgweDFGMjNBLCAnTScsIHUn5Za2JyksCiAgICAoMHgxRjIzQiwgJ1gnKSwKICAgICgweDFGMjQwLCAnTScsIHUn44CU5pys44CVJyksCiAgICAoMHgxRjI0MSwgJ00nLCB1J+OAlOS4ieOAlScpLAogICAgKDB4MUYyNDIsICdNJywgdSfjgJTkuozjgJUnKSwKICAgICgweDFGMjQzLCAnTScsIHUn44CU5a6J44CVJyksCiAgICAoMHgxRjI0NCwgJ00nLCB1J+OAlOeCueOAlScpLAogICAgKDB4MUYyNDUsICdNJywgdSfjgJTmiZPjgJUnKSwKICAgICgweDFGMjQ2LCAnTScsIHUn44CU55uX44CVJyksCiAgICAoMHgxRjI0NywgJ00nLCB1J+OAlOWLneOAlScpLAogICAgKDB4MUYyNDgsICdNJywgdSfjgJTmlZfjgJUnKSwKICAgICgweDFGMjQ5LCAnWCcpLAogICAgKDB4MUYyNTAsICdNJywgdSflvpcnKSwKICAgICgweDFGMjUxLCAnTScsIHUn5Y+vJyksCiAgICAoMHgxRjI1MiwgJ1gnKSwKICAgICgweDFGMzAwLCAnVicpLAogICAgKDB4MUYzMjEsICdYJyksCiAgICAoMHgxRjMzMCwgJ1YnKSwKICAgICgweDFGMzM2LCAnWCcpLAogICAgKDB4MUYzMzcsICdWJyksCiAgICAoMHgxRjM3RCwgJ1gnKSwKICAgICgweDFGMzgwLCAnVicpLAogICAgKDB4MUYzOTQsICdYJyksCiAgICAoMHgxRjNBMCwgJ1YnKSwKICAgICgweDFGM0M1LCAnWCcpLAogICAgKDB4MUYzQzYsICdWJyksCiAgICAoMHgxRjNDQiwgJ1gnKSwKICAgICgweDFGM0UwLCAnVicpLAogICAgKDB4MUYzRjEsICdYJyksCiAgICAoMHgxRjQwMCwgJ1YnKSwKICAgICgweDFGNDNGLCAnWCcpLAogICAgKDB4MUY0NDAsICdWJyksCiAgICBdCgpkZWYgX3NlZ182NygpOgogICAgcmV0dXJuIFsKICAgICgweDFGNDQxLCAnWCcpLAogICAgKDB4MUY0NDIsICdWJyksCiAgICAoMHgxRjRGOCwgJ1gnKSwKICAgICgweDFGNEY5LCAnVicpLAogICAgKDB4MUY0RkQsICdYJyksCiAgICAoMHgxRjUwMCwgJ1YnKSwKICAgICgweDFGNTNFLCAnWCcpLAogICAgKDB4MUY1NDAsICdWJyksCiAgICAoMHgxRjU0NCwgJ1gnKSwKICAgICgweDFGNTUwLCAnVicpLAogICAgKDB4MUY1NjgsICdYJyksCiAgICAoMHgxRjVGQiwgJ1YnKSwKICAgICgweDFGNjQxLCAnWCcpLAogICAgKDB4MUY2NDUsICdWJyksCiAgICAoMHgxRjY1MCwgJ1gnKSwKICAgICgweDFGNjgwLCAnVicpLAogICAgKDB4MUY2QzYsICdYJyksCiAgICAoMHgxRjcwMCwgJ1YnKSwKICAgICgweDFGNzc0LCAnWCcpLAogICAgKDB4MjAwMDAsICdWJyksCiAgICAoMHgyQTZENywgJ1gnKSwKICAgICgweDJBNzAwLCAnVicpLAogICAgKDB4MkI3MzUsICdYJyksCiAgICAoMHgyQjc0MCwgJ1YnKSwKICAgICgweDJCODFFLCAnWCcpLAogICAgKDB4MkY4MDAsICdNJywgdSfkuL0nKSwKICAgICgweDJGODAxLCAnTScsIHUn5Li4JyksCiAgICAoMHgyRjgwMiwgJ00nLCB1J+S5gScpLAogICAgKDB4MkY4MDMsICdNJywgdSfwoISiJyksCiAgICAoMHgyRjgwNCwgJ00nLCB1J+S9oCcpLAogICAgKDB4MkY4MDUsICdNJywgdSfkvq4nKSwKICAgICgweDJGODA2LCAnTScsIHUn5L67JyksCiAgICAoMHgyRjgwNywgJ00nLCB1J+WAgicpLAogICAgKDB4MkY4MDgsICdNJywgdSflgbonKSwKICAgICgweDJGODA5LCAnTScsIHUn5YKZJyksCiAgICAoMHgyRjgwQSwgJ00nLCB1J+WDpycpLAogICAgKDB4MkY4MEIsICdNJywgdSflg48nKSwKICAgICgweDJGODBDLCAnTScsIHUn45KeJyksCiAgICAoMHgyRjgwRCwgJ00nLCB1J/CgmLonKSwKICAgICgweDJGODBFLCAnTScsIHUn5YWNJyksCiAgICAoMHgyRjgwRiwgJ00nLCB1J+WFlCcpLAogICAgKDB4MkY4MTAsICdNJywgdSflhaQnKSwKICAgICgweDJGODExLCAnTScsIHUn5YW3JyksCiAgICAoMHgyRjgxMiwgJ00nLCB1J/CglJwnKSwKICAgICgweDJGODEzLCAnTScsIHUn45K5JyksCiAgICAoMHgyRjgxNCwgJ00nLCB1J+WFpycpLAogICAgKDB4MkY4MTUsICdNJywgdSflho0nKSwKICAgICgweDJGODE2LCAnTScsIHUn8KCViycpLAogICAgKDB4MkY4MTcsICdNJywgdSflhpcnKSwKICAgICgweDJGODE4LCAnTScsIHUn5YakJyksCiAgICAoMHgyRjgxOSwgJ00nLCB1J+S7jCcpLAogICAgKDB4MkY4MUEsICdNJywgdSflhqwnKSwKICAgICgweDJGODFCLCAnTScsIHUn5Ya1JyksCiAgICAoMHgyRjgxQywgJ00nLCB1J/Cph58nKSwKICAgICgweDJGODFELCAnTScsIHUn5Ye1JyksCiAgICAoMHgyRjgxRSwgJ00nLCB1J+WIgycpLAogICAgKDB4MkY4MUYsICdNJywgdSfjk58nKSwKICAgICgweDJGODIwLCAnTScsIHUn5Yi7JyksCiAgICAoMHgyRjgyMSwgJ00nLCB1J+WJhicpLAogICAgKDB4MkY4MjIsICdNJywgdSflibInKSwKICAgICgweDJGODIzLCAnTScsIHUn5Ym3JyksCiAgICAoMHgyRjgyNCwgJ00nLCB1J+OUlScpLAogICAgKDB4MkY4MjUsICdNJywgdSfli4cnKSwKICAgICgweDJGODI2LCAnTScsIHUn5YuJJyksCiAgICAoMHgyRjgyNywgJ00nLCB1J+WLpCcpLAogICAgKDB4MkY4MjgsICdNJywgdSfli7onKSwKICAgICgweDJGODI5LCAnTScsIHUn5YyFJyksCiAgICAoMHgyRjgyQSwgJ00nLCB1J+WMhicpLAogICAgKDB4MkY4MkIsICdNJywgdSfljJcnKSwKICAgICgweDJGODJDLCAnTScsIHUn5Y2JJyksCiAgICAoMHgyRjgyRCwgJ00nLCB1J+WNkScpLAogICAgKDB4MkY4MkUsICdNJywgdSfljZonKSwKICAgICgweDJGODJGLCAnTScsIHUn5Y2zJyksCiAgICAoMHgyRjgzMCwgJ00nLCB1J+WNvScpLAogICAgKDB4MkY4MzEsICdNJywgdSfljb8nKSwKICAgICgweDJGODM0LCAnTScsIHUn8KCorCcpLAogICAgKDB4MkY4MzUsICdNJywgdSfngbAnKSwKICAgICgweDJGODM2LCAnTScsIHUn5Y+KJyksCiAgICAoMHgyRjgzNywgJ00nLCB1J+WPnycpLAogICAgKDB4MkY4MzgsICdNJywgdSfwoK2jJyksCiAgICAoMHgyRjgzOSwgJ00nLCB1J+WPqycpLAogICAgKDB4MkY4M0EsICdNJywgdSflj7EnKSwKICAgICgweDJGODNCLCAnTScsIHUn5ZCGJyksCiAgICAoMHgyRjgzQywgJ00nLCB1J+WSnicpLAogICAgKDB4MkY4M0QsICdNJywgdSflkLgnKSwKICAgICgweDJGODNFLCAnTScsIHUn5ZGIJyksCiAgICAoMHgyRjgzRiwgJ00nLCB1J+WRqCcpLAogICAgKDB4MkY4NDAsICdNJywgdSflkqInKSwKICAgICgweDJGODQxLCAnTScsIHUn5ZO2JyksCiAgICAoMHgyRjg0MiwgJ00nLCB1J+WUkCcpLAogICAgKDB4MkY4NDMsICdNJywgdSfllZMnKSwKICAgICgweDJGODQ0LCAnTScsIHUn5ZWjJyksCiAgICAoMHgyRjg0NSwgJ00nLCB1J+WWhCcpLAogICAgKDB4MkY4NDcsICdNJywgdSfllpknKSwKICAgICgweDJGODQ4LCAnTScsIHUn5ZarJyksCiAgICAoMHgyRjg0OSwgJ00nLCB1J+WWsycpLAogICAgKDB4MkY4NEEsICdNJywgdSfll4InKSwKICAgICgweDJGODRCLCAnTScsIHUn5ZyWJyksCiAgICAoMHgyRjg0QywgJ00nLCB1J+WYhicpLAogICAgKDB4MkY4NEQsICdNJywgdSflnJcnKSwKICAgIF0KCmRlZiBfc2VnXzY4KCk6CiAgICByZXR1cm4gWwogICAgKDB4MkY4NEUsICdNJywgdSflmZEnKSwKICAgICgweDJGODRGLCAnTScsIHUn5Zm0JyksCiAgICAoMHgyRjg1MCwgJ00nLCB1J+WIhycpLAogICAgKDB4MkY4NTEsICdNJywgdSflo64nKSwKICAgICgweDJGODUyLCAnTScsIHUn5Z+OJyksCiAgICAoMHgyRjg1MywgJ00nLCB1J+WftCcpLAogICAgKDB4MkY4NTQsICdNJywgdSfloI0nKSwKICAgICgweDJGODU1LCAnTScsIHUn5Z6LJyksCiAgICAoMHgyRjg1NiwgJ00nLCB1J+WgsicpLAogICAgKDB4MkY4NTcsICdNJywgdSfloLEnKSwKICAgICgweDJGODU4LCAnTScsIHUn5aKsJyksCiAgICAoMHgyRjg1OSwgJ00nLCB1J/Chk6QnKSwKICAgICgweDJGODVBLCAnTScsIHUn5aOyJyksCiAgICAoMHgyRjg1QiwgJ00nLCB1J+WjtycpLAogICAgKDB4MkY4NUMsICdNJywgdSflpIYnKSwKICAgICgweDJGODVELCAnTScsIHUn5aSaJyksCiAgICAoMHgyRjg1RSwgJ00nLCB1J+WkoicpLAogICAgKDB4MkY4NUYsICdNJywgdSflpaInKSwKICAgICgweDJGODYwLCAnTScsIHUn8KGaqCcpLAogICAgKDB4MkY4NjEsICdNJywgdSfwoZuqJyksCiAgICAoMHgyRjg2MiwgJ00nLCB1J+WnrCcpLAogICAgKDB4MkY4NjMsICdNJywgdSflqJsnKSwKICAgICgweDJGODY0LCAnTScsIHUn5ainJyksCiAgICAoMHgyRjg2NSwgJ00nLCB1J+WnmCcpLAogICAgKDB4MkY4NjYsICdNJywgdSflqaYnKSwKICAgICgweDJGODY3LCAnTScsIHUn45uuJyksCiAgICAoMHgyRjg2OCwgJ1gnKSwKICAgICgweDJGODY5LCAnTScsIHUn5ayIJyksCiAgICAoMHgyRjg2QSwgJ00nLCB1J+WsvicpLAogICAgKDB4MkY4NkMsICdNJywgdSfwoaeIJyksCiAgICAoMHgyRjg2RCwgJ00nLCB1J+WvgycpLAogICAgKDB4MkY4NkUsICdNJywgdSflr5gnKSwKICAgICgweDJGODZGLCAnTScsIHUn5a+nJyksCiAgICAoMHgyRjg3MCwgJ00nLCB1J+WvsycpLAogICAgKDB4MkY4NzEsICdNJywgdSfwoayYJyksCiAgICAoMHgyRjg3MiwgJ00nLCB1J+WvvycpLAogICAgKDB4MkY4NzMsICdNJywgdSflsIYnKSwKICAgICgweDJGODc0LCAnWCcpLAogICAgKDB4MkY4NzUsICdNJywgdSflsKInKSwKICAgICgweDJGODc2LCAnTScsIHUn456BJyksCiAgICAoMHgyRjg3NywgJ00nLCB1J+WxoCcpLAogICAgKDB4MkY4NzgsICdNJywgdSflsa4nKSwKICAgICgweDJGODc5LCAnTScsIHUn5bOAJyksCiAgICAoMHgyRjg3QSwgJ00nLCB1J+WyjScpLAogICAgKDB4MkY4N0IsICdNJywgdSfwobekJyksCiAgICAoMHgyRjg3QywgJ00nLCB1J+W1gycpLAogICAgKDB4MkY4N0QsICdNJywgdSfwobemJyksCiAgICAoMHgyRjg3RSwgJ00nLCB1J+W1ricpLAogICAgKDB4MkY4N0YsICdNJywgdSfltasnKSwKICAgICgweDJGODgwLCAnTScsIHUn5bW8JyksCiAgICAoMHgyRjg4MSwgJ00nLCB1J+W3oScpLAogICAgKDB4MkY4ODIsICdNJywgdSflt6InKSwKICAgICgweDJGODgzLCAnTScsIHUn46CvJyksCiAgICAoMHgyRjg4NCwgJ00nLCB1J+W3vScpLAogICAgKDB4MkY4ODUsICdNJywgdSfluKgnKSwKICAgICgweDJGODg2LCAnTScsIHUn5bi9JyksCiAgICAoMHgyRjg4NywgJ00nLCB1J+W5qScpLAogICAgKDB4MkY4ODgsICdNJywgdSfjoaInKSwKICAgICgweDJGODg5LCAnTScsIHUn8KKGgycpLAogICAgKDB4MkY4OEEsICdNJywgdSfjobwnKSwKICAgICgweDJGODhCLCAnTScsIHUn5bqwJyksCiAgICAoMHgyRjg4QywgJ00nLCB1J+W6sycpLAogICAgKDB4MkY4OEQsICdNJywgdSflurYnKSwKICAgICgweDJGODhFLCAnTScsIHUn5buKJyksCiAgICAoMHgyRjg4RiwgJ00nLCB1J/CqjpInKSwKICAgICgweDJGODkwLCAnTScsIHUn5bu+JyksCiAgICAoMHgyRjg5MSwgJ00nLCB1J/CijLEnKSwKICAgICgweDJGODkzLCAnTScsIHUn6IiBJyksCiAgICAoMHgyRjg5NCwgJ00nLCB1J+W8oicpLAogICAgKDB4MkY4OTYsICdNJywgdSfjo4cnKSwKICAgICgweDJGODk3LCAnTScsIHUn8KOKuCcpLAogICAgKDB4MkY4OTgsICdNJywgdSfwpoeaJyksCiAgICAoMHgyRjg5OSwgJ00nLCB1J+W9oicpLAogICAgKDB4MkY4OUEsICdNJywgdSflvasnKSwKICAgICgweDJGODlCLCAnTScsIHUn46OjJyksCiAgICAoMHgyRjg5QywgJ00nLCB1J+W+micpLAogICAgKDB4MkY4OUQsICdNJywgdSflv40nKSwKICAgICgweDJGODlFLCAnTScsIHUn5b+XJyksCiAgICAoMHgyRjg5RiwgJ00nLCB1J+W/uScpLAogICAgKDB4MkY4QTAsICdNJywgdSfmgoEnKSwKICAgICgweDJGOEExLCAnTScsIHUn46S6JyksCiAgICAoMHgyRjhBMiwgJ00nLCB1J+OknCcpLAogICAgKDB4MkY4QTMsICdNJywgdSfmgpQnKSwKICAgICgweDJGOEE0LCAnTScsIHUn8KKblCcpLAogICAgKDB4MkY4QTUsICdNJywgdSfmg4cnKSwKICAgICgweDJGOEE2LCAnTScsIHUn5oWIJyksCiAgICAoMHgyRjhBNywgJ00nLCB1J+aFjCcpLAogICAgKDB4MkY4QTgsICdNJywgdSfmhY4nKSwKICAgICgweDJGOEE5LCAnTScsIHUn5oWMJyksCiAgICAoMHgyRjhBQSwgJ00nLCB1J+aFuicpLAogICAgKDB4MkY4QUIsICdNJywgdSfmho4nKSwKICAgICgweDJGOEFDLCAnTScsIHUn5oayJyksCiAgICAoMHgyRjhBRCwgJ00nLCB1J+aGpCcpLAogICAgKDB4MkY4QUUsICdNJywgdSfmhq8nKSwKICAgICgweDJGOEFGLCAnTScsIHUn5oeeJyksCiAgICAoMHgyRjhCMCwgJ00nLCB1J+aHsicpLAogICAgKDB4MkY4QjEsICdNJywgdSfmh7YnKSwKICAgICgweDJGOEIyLCAnTScsIHUn5oiQJyksCiAgICAoMHgyRjhCMywgJ00nLCB1J+aImycpLAogICAgKDB4MkY4QjQsICdNJywgdSfmiZ0nKSwKICAgIF0KCmRlZiBfc2VnXzY5KCk6CiAgICByZXR1cm4gWwogICAgKDB4MkY4QjUsICdNJywgdSfmirEnKSwKICAgICgweDJGOEI2LCAnTScsIHUn5ouUJyksCiAgICAoMHgyRjhCNywgJ00nLCB1J+aNkCcpLAogICAgKDB4MkY4QjgsICdNJywgdSfwoqyMJyksCiAgICAoMHgyRjhCOSwgJ00nLCB1J+aMvScpLAogICAgKDB4MkY4QkEsICdNJywgdSfmi7wnKSwKICAgICgweDJGOEJCLCAnTScsIHUn5o2oJyksCiAgICAoMHgyRjhCQywgJ00nLCB1J+aOgycpLAogICAgKDB4MkY4QkQsICdNJywgdSfmj6QnKSwKICAgICgweDJGOEJFLCAnTScsIHUn8KKvsScpLAogICAgKDB4MkY4QkYsICdNJywgdSfmkKInKSwKICAgICgweDJGOEMwLCAnTScsIHUn5o+FJyksCiAgICAoMHgyRjhDMSwgJ00nLCB1J+aOqScpLAogICAgKDB4MkY4QzIsICdNJywgdSfjqK4nKSwKICAgICgweDJGOEMzLCAnTScsIHUn5pGpJyksCiAgICAoMHgyRjhDNCwgJ00nLCB1J+aRvicpLAogICAgKDB4MkY4QzUsICdNJywgdSfmkp0nKSwKICAgICgweDJGOEM2LCAnTScsIHUn5pG3JyksCiAgICAoMHgyRjhDNywgJ00nLCB1J+OprCcpLAogICAgKDB4MkY4QzgsICdNJywgdSfmlY8nKSwKICAgICgweDJGOEM5LCAnTScsIHUn5pWsJyksCiAgICAoMHgyRjhDQSwgJ00nLCB1J/CjgIonKSwKICAgICgweDJGOENCLCAnTScsIHUn5pejJyksCiAgICAoMHgyRjhDQywgJ00nLCB1J+abuCcpLAogICAgKDB4MkY4Q0QsICdNJywgdSfmmYknKSwKICAgICgweDJGOENFLCAnTScsIHUn46yZJyksCiAgICAoMHgyRjhDRiwgJ00nLCB1J+aakScpLAogICAgKDB4MkY4RDAsICdNJywgdSfjrIgnKSwKICAgICgweDJGOEQxLCAnTScsIHUn46ukJyksCiAgICAoMHgyRjhEMiwgJ00nLCB1J+WGkicpLAogICAgKDB4MkY4RDMsICdNJywgdSflhpUnKSwKICAgICgweDJGOEQ0LCAnTScsIHUn5pyAJyksCiAgICAoMHgyRjhENSwgJ00nLCB1J+aanCcpLAogICAgKDB4MkY4RDYsICdNJywgdSfogq0nKSwKICAgICgweDJGOEQ3LCAnTScsIHUn5I+ZJyksCiAgICAoMHgyRjhEOCwgJ00nLCB1J+aclycpLAogICAgKDB4MkY4RDksICdNJywgdSfmnJsnKSwKICAgICgweDJGOERBLCAnTScsIHUn5pyhJyksCiAgICAoMHgyRjhEQiwgJ00nLCB1J+adnicpLAogICAgKDB4MkY4REMsICdNJywgdSfmnZMnKSwKICAgICgweDJGOERELCAnTScsIHUn8KOPgycpLAogICAgKDB4MkY4REUsICdNJywgdSfjrYknKSwKICAgICgweDJGOERGLCAnTScsIHUn5p+6JyksCiAgICAoMHgyRjhFMCwgJ00nLCB1J+aehScpLAogICAgKDB4MkY4RTEsICdNJywgdSfmoZInKSwKICAgICgweDJGOEUyLCAnTScsIHUn5qKFJyksCiAgICAoMHgyRjhFMywgJ00nLCB1J/Cjka0nKSwKICAgICgweDJGOEU0LCAnTScsIHUn5qKOJyksCiAgICAoMHgyRjhFNSwgJ00nLCB1J+agnycpLAogICAgKDB4MkY4RTYsICdNJywgdSfmpJQnKSwKICAgICgweDJGOEU3LCAnTScsIHUn466dJyksCiAgICAoMHgyRjhFOCwgJ00nLCB1J+algicpLAogICAgKDB4MkY4RTksICdNJywgdSfmpqMnKSwKICAgICgweDJGOEVBLCAnTScsIHUn5qeqJyksCiAgICAoMHgyRjhFQiwgJ00nLCB1J+aqqCcpLAogICAgKDB4MkY4RUMsICdNJywgdSfwo5qjJyksCiAgICAoMHgyRjhFRCwgJ00nLCB1J+armycpLAogICAgKDB4MkY4RUUsICdNJywgdSfjsJgnKSwKICAgICgweDJGOEVGLCAnTScsIHUn5qyhJyksCiAgICAoMHgyRjhGMCwgJ00nLCB1J/CjoqcnKSwKICAgICgweDJGOEYxLCAnTScsIHUn5q2UJyksCiAgICAoMHgyRjhGMiwgJ00nLCB1J+OxjicpLAogICAgKDB4MkY4RjMsICdNJywgdSfmrbInKSwKICAgICgweDJGOEY0LCAnTScsIHUn5q6fJyksCiAgICAoMHgyRjhGNSwgJ00nLCB1J+auuicpLAogICAgKDB4MkY4RjYsICdNJywgdSfmrrsnKSwKICAgICgweDJGOEY3LCAnTScsIHUn8KOqjScpLAogICAgKDB4MkY4RjgsICdNJywgdSfwobSLJyksCiAgICAoMHgyRjhGOSwgJ00nLCB1J/Cjq7onKSwKICAgICgweDJGOEZBLCAnTScsIHUn5rGOJyksCiAgICAoMHgyRjhGQiwgJ00nLCB1J/CjsrwnKSwKICAgICgweDJGOEZDLCAnTScsIHUn5rK/JyksCiAgICAoMHgyRjhGRCwgJ00nLCB1J+azjScpLAogICAgKDB4MkY4RkUsICdNJywgdSfmsacnKSwKICAgICgweDJGOEZGLCAnTScsIHUn5rSWJyksCiAgICAoMHgyRjkwMCwgJ00nLCB1J+a0vicpLAogICAgKDB4MkY5MDEsICdNJywgdSfmtbcnKSwKICAgICgweDJGOTAyLCAnTScsIHUn5rWBJyksCiAgICAoMHgyRjkwMywgJ00nLCB1J+a1qScpLAogICAgKDB4MkY5MDQsICdNJywgdSfmtbgnKSwKICAgICgweDJGOTA1LCAnTScsIHUn5raFJyksCiAgICAoMHgyRjkwNiwgJ00nLCB1J/CjtJ4nKSwKICAgICgweDJGOTA3LCAnTScsIHUn5rS0JyksCiAgICAoMHgyRjkwOCwgJ00nLCB1J+a4rycpLAogICAgKDB4MkY5MDksICdNJywgdSfmua4nKSwKICAgICgweDJGOTBBLCAnTScsIHUn47SzJyksCiAgICAoMHgyRjkwQiwgJ00nLCB1J+a7iycpLAogICAgKDB4MkY5MEMsICdNJywgdSfmu4cnKSwKICAgICgweDJGOTBELCAnTScsIHUn8KO7kScpLAogICAgKDB4MkY5MEUsICdNJywgdSfmt7knKSwKICAgICgweDJGOTBGLCAnTScsIHUn5r2uJyksCiAgICAoMHgyRjkxMCwgJ00nLCB1J/CjvZ4nKSwKICAgICgweDJGOTExLCAnTScsIHUn8KO+jicpLAogICAgKDB4MkY5MTIsICdNJywgdSfmv4YnKSwKICAgICgweDJGOTEzLCAnTScsIHUn54C5JyksCiAgICAoMHgyRjkxNCwgJ00nLCB1J+eAnicpLAogICAgKDB4MkY5MTUsICdNJywgdSfngJsnKSwKICAgICgweDJGOTE2LCAnTScsIHUn47aWJyksCiAgICAoMHgyRjkxNywgJ00nLCB1J+eBiicpLAogICAgKDB4MkY5MTgsICdNJywgdSfngb0nKSwKICAgIF0KCmRlZiBfc2VnXzcwKCk6CiAgICByZXR1cm4gWwogICAgKDB4MkY5MTksICdNJywgdSfngbcnKSwKICAgICgweDJGOTFBLCAnTScsIHUn54KtJyksCiAgICAoMHgyRjkxQiwgJ00nLCB1J/CglKUnKSwKICAgICgweDJGOTFDLCAnTScsIHUn54WFJyksCiAgICAoMHgyRjkxRCwgJ00nLCB1J/CkiaMnKSwKICAgICgweDJGOTFFLCAnTScsIHUn54acJyksCiAgICAoMHgyRjkxRiwgJ1gnKSwKICAgICgweDJGOTIwLCAnTScsIHUn54ioJyksCiAgICAoMHgyRjkyMSwgJ00nLCB1J+eItScpLAogICAgKDB4MkY5MjIsICdNJywgdSfniZAnKSwKICAgICgweDJGOTIzLCAnTScsIHUn8KSYiCcpLAogICAgKDB4MkY5MjQsICdNJywgdSfnioAnKSwKICAgICgweDJGOTI1LCAnTScsIHUn54qVJyksCiAgICAoMHgyRjkyNiwgJ00nLCB1J/CknLUnKSwKICAgICgweDJGOTI3LCAnTScsIHUn8KSglCcpLAogICAgKDB4MkY5MjgsICdNJywgdSfnjbonKSwKICAgICgweDJGOTI5LCAnTScsIHUn546LJyksCiAgICAoMHgyRjkyQSwgJ00nLCB1J+O6rCcpLAogICAgKDB4MkY5MkIsICdNJywgdSfnjqUnKSwKICAgICgweDJGOTJDLCAnTScsIHUn47q4JyksCiAgICAoMHgyRjkyRSwgJ00nLCB1J+eRhycpLAogICAgKDB4MkY5MkYsICdNJywgdSfnkZwnKSwKICAgICgweDJGOTMwLCAnTScsIHUn55GxJyksCiAgICAoMHgyRjkzMSwgJ00nLCB1J+eShScpLAogICAgKDB4MkY5MzIsICdNJywgdSfnk4onKSwKICAgICgweDJGOTMzLCAnTScsIHUn47ybJyksCiAgICAoMHgyRjkzNCwgJ00nLCB1J+eUpCcpLAogICAgKDB4MkY5MzUsICdNJywgdSfwpLC2JyksCiAgICAoMHgyRjkzNiwgJ00nLCB1J+eUvicpLAogICAgKDB4MkY5MzcsICdNJywgdSfwpLKSJyksCiAgICAoMHgyRjkzOCwgJ00nLCB1J+eVsCcpLAogICAgKDB4MkY5MzksICdNJywgdSfwooafJyksCiAgICAoMHgyRjkzQSwgJ00nLCB1J+eYkCcpLAogICAgKDB4MkY5M0IsICdNJywgdSfwpL6hJyksCiAgICAoMHgyRjkzQywgJ00nLCB1J/CkvrgnKSwKICAgICgweDJGOTNELCAnTScsIHUn8KWBhCcpLAogICAgKDB4MkY5M0UsICdNJywgdSfjv7wnKSwKICAgICgweDJGOTNGLCAnTScsIHUn5ICIJyksCiAgICAoMHgyRjk0MCwgJ00nLCB1J+ebtCcpLAogICAgKDB4MkY5NDEsICdNJywgdSfwpYOzJyksCiAgICAoMHgyRjk0MiwgJ00nLCB1J/Clg7InKSwKICAgICgweDJGOTQzLCAnTScsIHUn8KWEmScpLAogICAgKDB4MkY5NDQsICdNJywgdSfwpYSzJyksCiAgICAoMHgyRjk0NSwgJ00nLCB1J+ecnicpLAogICAgKDB4MkY5NDYsICdNJywgdSfnnJ8nKSwKICAgICgweDJGOTQ4LCAnTScsIHUn552KJyksCiAgICAoMHgyRjk0OSwgJ00nLCB1J+SAuScpLAogICAgKDB4MkY5NEEsICdNJywgdSfnnosnKSwKICAgICgweDJGOTRCLCAnTScsIHUn5IGGJyksCiAgICAoMHgyRjk0QywgJ00nLCB1J+SClicpLAogICAgKDB4MkY5NEQsICdNJywgdSfwpZCdJyksCiAgICAoMHgyRjk0RSwgJ00nLCB1J+ehjicpLAogICAgKDB4MkY5NEYsICdNJywgdSfnoownKSwKICAgICgweDJGOTUwLCAnTScsIHUn56OMJyksCiAgICAoMHgyRjk1MSwgJ00nLCB1J+SDoycpLAogICAgKDB4MkY5NTIsICdNJywgdSfwpZimJyksCiAgICAoMHgyRjk1MywgJ00nLCB1J+ellicpLAogICAgKDB4MkY5NTQsICdNJywgdSfwpZqaJyksCiAgICAoMHgyRjk1NSwgJ00nLCB1J/Clm4UnKSwKICAgICgweDJGOTU2LCAnTScsIHUn56aPJyksCiAgICAoMHgyRjk1NywgJ00nLCB1J+enqycpLAogICAgKDB4MkY5NTgsICdNJywgdSfkhK8nKSwKICAgICgweDJGOTU5LCAnTScsIHUn56mAJyksCiAgICAoMHgyRjk1QSwgJ00nLCB1J+epiicpLAogICAgKDB4MkY5NUIsICdNJywgdSfnqY8nKSwKICAgICgweDJGOTVDLCAnTScsIHUn8KWlvCcpLAogICAgKDB4MkY5NUQsICdNJywgdSfwpaqnJyksCiAgICAoMHgyRjk1RiwgJ1gnKSwKICAgICgweDJGOTYwLCAnTScsIHUn5IiCJyksCiAgICAoMHgyRjk2MSwgJ00nLCB1J/ClrqsnKSwKICAgICgweDJGOTYyLCAnTScsIHUn56+GJyksCiAgICAoMHgyRjk2MywgJ00nLCB1J+eviScpLAogICAgKDB4MkY5NjQsICdNJywgdSfkiKcnKSwKICAgICgweDJGOTY1LCAnTScsIHUn8KWygCcpLAogICAgKDB4MkY5NjYsICdNJywgdSfns5InKSwKICAgICgweDJGOTY3LCAnTScsIHUn5IqgJyksCiAgICAoMHgyRjk2OCwgJ00nLCB1J+ezqCcpLAogICAgKDB4MkY5NjksICdNJywgdSfns6MnKSwKICAgICgweDJGOTZBLCAnTScsIHUn57SAJyksCiAgICAoMHgyRjk2QiwgJ00nLCB1J/ClvoYnKSwKICAgICgweDJGOTZDLCAnTScsIHUn57WjJyksCiAgICAoMHgyRjk2RCwgJ00nLCB1J+SMgScpLAogICAgKDB4MkY5NkUsICdNJywgdSfnt4cnKSwKICAgICgweDJGOTZGLCAnTScsIHUn57iCJyksCiAgICAoMHgyRjk3MCwgJ00nLCB1J+e5hScpLAogICAgKDB4MkY5NzEsICdNJywgdSfkjLQnKSwKICAgICgweDJGOTcyLCAnTScsIHUn8KaIqCcpLAogICAgKDB4MkY5NzMsICdNJywgdSfwpomHJyksCiAgICAoMHgyRjk3NCwgJ00nLCB1J+SNmScpLAogICAgKDB4MkY5NzUsICdNJywgdSfwpouZJyksCiAgICAoMHgyRjk3NiwgJ00nLCB1J+e9uicpLAogICAgKDB4MkY5NzcsICdNJywgdSfwpoy+JyksCiAgICAoMHgyRjk3OCwgJ00nLCB1J+e+lScpLAogICAgKDB4MkY5NzksICdNJywgdSfnv7onKSwKICAgICgweDJGOTdBLCAnTScsIHUn6ICFJyksCiAgICAoMHgyRjk3QiwgJ00nLCB1J/Cmk5onKSwKICAgICgweDJGOTdDLCAnTScsIHUn8KaUoycpLAogICAgKDB4MkY5N0QsICdNJywgdSfogaAnKSwKICAgICgweDJGOTdFLCAnTScsIHUn8KaWqCcpLAogICAgKDB4MkY5N0YsICdNJywgdSfogbAnKSwKICAgIF0KCmRlZiBfc2VnXzcxKCk6CiAgICByZXR1cm4gWwogICAgKDB4MkY5ODAsICdNJywgdSfwo42fJyksCiAgICAoMHgyRjk4MSwgJ00nLCB1J+SPlScpLAogICAgKDB4MkY5ODIsICdNJywgdSfogrInKSwKICAgICgweDJGOTgzLCAnTScsIHUn6ISDJyksCiAgICAoMHgyRjk4NCwgJ00nLCB1J+SQiycpLAogICAgKDB4MkY5ODUsICdNJywgdSfohL4nKSwKICAgICgweDJGOTg2LCAnTScsIHUn5aq1JyksCiAgICAoMHgyRjk4NywgJ00nLCB1J/CmnqcnKSwKICAgICgweDJGOTg4LCAnTScsIHUn8KaetScpLAogICAgKDB4MkY5ODksICdNJywgdSfwo46TJyksCiAgICAoMHgyRjk4QSwgJ00nLCB1J/CjjpwnKSwKICAgICgweDJGOThCLCAnTScsIHUn6IiBJyksCiAgICAoMHgyRjk4QywgJ00nLCB1J+iIhCcpLAogICAgKDB4MkY5OEQsICdNJywgdSfovp4nKSwKICAgICgweDJGOThFLCAnTScsIHUn5JGrJyksCiAgICAoMHgyRjk4RiwgJ00nLCB1J+iKkScpLAogICAgKDB4MkY5OTAsICdNJywgdSfoiosnKSwKICAgICgweDJGOTkxLCAnTScsIHUn6IqdJyksCiAgICAoMHgyRjk5MiwgJ00nLCB1J+WKsycpLAogICAgKDB4MkY5OTMsICdNJywgdSfoirEnKSwKICAgICgweDJGOTk0LCAnTScsIHUn6IqzJyksCiAgICAoMHgyRjk5NSwgJ00nLCB1J+iKvScpLAogICAgKDB4MkY5OTYsICdNJywgdSfoi6YnKSwKICAgICgweDJGOTk3LCAnTScsIHUn8KasvCcpLAogICAgKDB4MkY5OTgsICdNJywgdSfoi6UnKSwKICAgICgweDJGOTk5LCAnTScsIHUn6IydJyksCiAgICAoMHgyRjk5QSwgJ00nLCB1J+iNoycpLAogICAgKDB4MkY5OUIsICdNJywgdSfojq0nKSwKICAgICgweDJGOTlDLCAnTScsIHUn6IyjJyksCiAgICAoMHgyRjk5RCwgJ00nLCB1J+iOvScpLAogICAgKDB4MkY5OUUsICdNJywgdSfoj6cnKSwKICAgICgweDJGOTlGLCAnTScsIHUn6JGXJyksCiAgICAoMHgyRjlBMCwgJ00nLCB1J+iNkycpLAogICAgKDB4MkY5QTEsICdNJywgdSfoj4onKSwKICAgICgweDJGOUEyLCAnTScsIHUn6I+MJyksCiAgICAoMHgyRjlBMywgJ00nLCB1J+iPnCcpLAogICAgKDB4MkY5QTQsICdNJywgdSfwprC2JyksCiAgICAoMHgyRjlBNSwgJ00nLCB1J/CmtasnKSwKICAgICgweDJGOUE2LCAnTScsIHUn8KazlScpLAogICAgKDB4MkY5QTcsICdNJywgdSfklKsnKSwKICAgICgweDJGOUE4LCAnTScsIHUn6JOxJyksCiAgICAoMHgyRjlBOSwgJ00nLCB1J+iTsycpLAogICAgKDB4MkY5QUEsICdNJywgdSfolJYnKSwKICAgICgweDJGOUFCLCAnTScsIHUn8KePiicpLAogICAgKDB4MkY5QUMsICdNJywgdSfolaQnKSwKICAgICgweDJGOUFELCAnTScsIHUn8Ka8rCcpLAogICAgKDB4MkY5QUUsICdNJywgdSfklZ0nKSwKICAgICgweDJGOUFGLCAnTScsIHUn5JWhJyksCiAgICAoMHgyRjlCMCwgJ00nLCB1J/CmvrEnKSwKICAgICgweDJGOUIxLCAnTScsIHUn8KeDkicpLAogICAgKDB4MkY5QjIsICdNJywgdSfklasnKSwKICAgICgweDJGOUIzLCAnTScsIHUn6JmQJyksCiAgICAoMHgyRjlCNCwgJ00nLCB1J+iZnCcpLAogICAgKDB4MkY5QjUsICdNJywgdSfomacnKSwKICAgICgweDJGOUI2LCAnTScsIHUn6JmpJyksCiAgICAoMHgyRjlCNywgJ00nLCB1J+iaqScpLAogICAgKDB4MkY5QjgsICdNJywgdSfomognKSwKICAgICgweDJGOUI5LCAnTScsIHUn6JyOJyksCiAgICAoMHgyRjlCQSwgJ00nLCB1J+iboicpLAogICAgKDB4MkY5QkIsICdNJywgdSfonbknKSwKICAgICgweDJGOUJDLCAnTScsIHUn6JyoJyksCiAgICAoMHgyRjlCRCwgJ00nLCB1J+idqycpLAogICAgKDB4MkY5QkUsICdNJywgdSfonoYnKSwKICAgICgweDJGOUJGLCAnWCcpLAogICAgKDB4MkY5QzAsICdNJywgdSfon6EnKSwKICAgICgweDJGOUMxLCAnTScsIHUn6KCBJyksCiAgICAoMHgyRjlDMiwgJ00nLCB1J+SXuScpLAogICAgKDB4MkY5QzMsICdNJywgdSfooaAnKSwKICAgICgweDJGOUM0LCAnTScsIHUn6KGjJyksCiAgICAoMHgyRjlDNSwgJ00nLCB1J/CnmacnKSwKICAgICgweDJGOUM2LCAnTScsIHUn6KOXJyksCiAgICAoMHgyRjlDNywgJ00nLCB1J+ijnicpLAogICAgKDB4MkY5QzgsICdNJywgdSfkmLUnKSwKICAgICgweDJGOUM5LCAnTScsIHUn6KO6JyksCiAgICAoMHgyRjlDQSwgJ00nLCB1J+OSuycpLAogICAgKDB4MkY5Q0IsICdNJywgdSfwp6KuJyksCiAgICAoMHgyRjlDQywgJ00nLCB1J/CnpaYnKSwKICAgICgweDJGOUNELCAnTScsIHUn5Jq+JyksCiAgICAoMHgyRjlDRSwgJ00nLCB1J+SbhycpLAogICAgKDB4MkY5Q0YsICdNJywgdSfoqqAnKSwKICAgICgweDJGOUQwLCAnTScsIHUn6KutJyksCiAgICAoMHgyRjlEMSwgJ00nLCB1J+iuiicpLAogICAgKDB4MkY5RDIsICdNJywgdSfosZUnKSwKICAgICgweDJGOUQzLCAnTScsIHUn8KeyqCcpLAogICAgKDB4MkY5RDQsICdNJywgdSfosqsnKSwKICAgICgweDJGOUQ1LCAnTScsIHUn6LOBJyksCiAgICAoMHgyRjlENiwgJ00nLCB1J+i0mycpLAogICAgKDB4MkY5RDcsICdNJywgdSfotbcnKSwKICAgICgweDJGOUQ4LCAnTScsIHUn8Ke8rycpLAogICAgKDB4MkY5RDksICdNJywgdSfwoKCEJyksCiAgICAoMHgyRjlEQSwgJ00nLCB1J+i3iycpLAogICAgKDB4MkY5REIsICdNJywgdSfotrwnKSwKICAgICgweDJGOURDLCAnTScsIHUn6LewJyksCiAgICAoMHgyRjlERCwgJ00nLCB1J/Cgo54nKSwKICAgICgweDJGOURFLCAnTScsIHUn6LuUJyksCiAgICAoMHgyRjlERiwgJ00nLCB1J+i8uCcpLAogICAgKDB4MkY5RTAsICdNJywgdSfwqJeSJyksCiAgICAoMHgyRjlFMSwgJ00nLCB1J/Col60nKSwKICAgICgweDJGOUUyLCAnTScsIHUn6YKUJyksCiAgICAoMHgyRjlFMywgJ00nLCB1J+mDsScpLAogICAgXQoKZGVmIF9zZWdfNzIoKToKICAgIHJldHVybiBbCiAgICAoMHgyRjlFNCwgJ00nLCB1J+mEkScpLAogICAgKDB4MkY5RTUsICdNJywgdSfwqJyuJyksCiAgICAoMHgyRjlFNiwgJ00nLCB1J+mEmycpLAogICAgKDB4MkY5RTcsICdNJywgdSfpiLgnKSwKICAgICgweDJGOUU4LCAnTScsIHUn6YuXJyksCiAgICAoMHgyRjlFOSwgJ00nLCB1J+mLmCcpLAogICAgKDB4MkY5RUEsICdNJywgdSfpibwnKSwKICAgICgweDJGOUVCLCAnTScsIHUn6Y+5JyksCiAgICAoMHgyRjlFQywgJ00nLCB1J+mQlScpLAogICAgKDB4MkY5RUQsICdNJywgdSfwqK+6JyksCiAgICAoMHgyRjlFRSwgJ00nLCB1J+mWiycpLAogICAgKDB4MkY5RUYsICdNJywgdSfkppUnKSwKICAgICgweDJGOUYwLCAnTScsIHUn6Za3JyksCiAgICAoMHgyRjlGMSwgJ00nLCB1J/CotbcnKSwKICAgICgweDJGOUYyLCAnTScsIHUn5KemJyksCiAgICAoMHgyRjlGMywgJ00nLCB1J+mbgycpLAogICAgKDB4MkY5RjQsICdNJywgdSfltrInKSwKICAgICgweDJGOUY1LCAnTScsIHUn6ZyjJyksCiAgICAoMHgyRjlGNiwgJ00nLCB1J/CphYUnKSwKICAgICgweDJGOUY3LCAnTScsIHUn8KmImicpLAogICAgKDB4MkY5RjgsICdNJywgdSfkqa4nKSwKICAgICgweDJGOUY5LCAnTScsIHUn5Km2JyksCiAgICAoMHgyRjlGQSwgJ00nLCB1J+mfoCcpLAogICAgKDB4MkY5RkIsICdNJywgdSfwqZCKJyksCiAgICAoMHgyRjlGQywgJ00nLCB1J+SqsicpLAogICAgKDB4MkY5RkQsICdNJywgdSfwqZKWJyksCiAgICAoMHgyRjlGRSwgJ00nLCB1J+mgiycpLAogICAgKDB4MkZBMDAsICdNJywgdSfpoKknKSwKICAgICgweDJGQTAxLCAnTScsIHUn8KmWticpLAogICAgKDB4MkZBMDIsICdNJywgdSfpo6InKSwKICAgICgweDJGQTAzLCAnTScsIHUn5KyzJyksCiAgICAoMHgyRkEwNCwgJ00nLCB1J+mkqScpLAogICAgKDB4MkZBMDUsICdNJywgdSfppqcnKSwKICAgICgweDJGQTA2LCAnTScsIHUn6aeCJyksCiAgICAoMHgyRkEwNywgJ00nLCB1J+mnvicpLAogICAgKDB4MkZBMDgsICdNJywgdSfkr44nKSwKICAgICgweDJGQTA5LCAnTScsIHUn8KmssCcpLAogICAgKDB4MkZBMEEsICdNJywgdSfprJInKSwKICAgICgweDJGQTBCLCAnTScsIHUn6bGAJyksCiAgICAoMHgyRkEwQywgJ00nLCB1J+mzvScpLAogICAgKDB4MkZBMEQsICdNJywgdSfks44nKSwKICAgICgweDJGQTBFLCAnTScsIHUn5LOtJyksCiAgICAoMHgyRkEwRiwgJ00nLCB1J+m1pycpLAogICAgKDB4MkZBMTAsICdNJywgdSfwqoOOJyksCiAgICAoMHgyRkExMSwgJ00nLCB1J+SzuCcpLAogICAgKDB4MkZBMTIsICdNJywgdSfwqoSFJyksCiAgICAoMHgyRkExMywgJ00nLCB1J/CqiI4nKSwKICAgICgweDJGQTE0LCAnTScsIHUn8KqKkScpLAogICAgKDB4MkZBMTUsICdNJywgdSfpursnKSwKICAgICgweDJGQTE2LCAnTScsIHUn5LWWJyksCiAgICAoMHgyRkExNywgJ00nLCB1J+m7uScpLAogICAgKDB4MkZBMTgsICdNJywgdSfpu74nKSwKICAgICgweDJGQTE5LCAnTScsIHUn6byFJyksCiAgICAoMHgyRkExQSwgJ00nLCB1J+m8jycpLAogICAgKDB4MkZBMUIsICdNJywgdSfpvJYnKSwKICAgICgweDJGQTFDLCAnTScsIHUn6by7JyksCiAgICAoMHgyRkExRCwgJ00nLCB1J/CqmIAnKSwKICAgICgweDJGQTFFLCAnWCcpLAogICAgKDB4RTAxMDAsICdJJyksCiAgICAoMHhFMDFGMCwgJ1gnKSwKICAgIF0KCnV0czQ2ZGF0YSA9IHR1cGxlKAogICAgX3NlZ18wKCkKICAgICsgX3NlZ18xKCkKICAgICsgX3NlZ18yKCkKICAgICsgX3NlZ18zKCkKICAgICsgX3NlZ180KCkKICAgICsgX3NlZ181KCkKICAgICsgX3NlZ182KCkKICAgICsgX3NlZ183KCkKICAgICsgX3NlZ184KCkKICAgICsgX3NlZ185KCkKICAgICsgX3NlZ18xMCgpCiAgICArIF9zZWdfMTEoKQogICAgKyBfc2VnXzEyKCkKICAgICsgX3NlZ18xMygpCiAgICArIF9zZWdfMTQoKQogICAgKyBfc2VnXzE1KCkKICAgICsgX3NlZ18xNigpCiAgICArIF9zZWdfMTcoKQogICAgKyBfc2VnXzE4KCkKICAgICsgX3NlZ18xOSgpCiAgICArIF9zZWdfMjAoKQogICAgKyBfc2VnXzIxKCkKICAgICsgX3NlZ18yMigpCiAgICArIF9zZWdfMjMoKQogICAgKyBfc2VnXzI0KCkKICAgICsgX3NlZ18yNSgpCiAgICArIF9zZWdfMjYoKQogICAgKyBfc2VnXzI3KCkKICAgICsgX3NlZ18yOCgpCiAgICArIF9zZWdfMjkoKQogICAgKyBfc2VnXzMwKCkKICAgICsgX3NlZ18zMSgpCiAgICArIF9zZWdfMzIoKQogICAgKyBfc2VnXzMzKCkKICAgICsgX3NlZ18zNCgpCiAgICArIF9zZWdfMzUoKQogICAgKyBfc2VnXzM2KCkKICAgICsgX3NlZ18zNygpCiAgICArIF9zZWdfMzgoKQogICAgKyBfc2VnXzM5KCkKICAgICsgX3NlZ180MCgpCiAgICArIF9zZWdfNDEoKQogICAgKyBfc2VnXzQyKCkKICAgICsgX3NlZ180MygpCiAgICArIF9zZWdfNDQoKQogICAgKyBfc2VnXzQ1KCkKICAgICsgX3NlZ180NigpCiAgICArIF9zZWdfNDcoKQogICAgKyBfc2VnXzQ4KCkKICAgICsgX3NlZ180OSgpCiAgICArIF9zZWdfNTAoKQogICAgKyBfc2VnXzUxKCkKICAgICsgX3NlZ181MigpCiAgICArIF9zZWdfNTMoKQogICAgKyBfc2VnXzU0KCkKICAgICsgX3NlZ181NSgpCiAgICArIF9zZWdfNTYoKQogICAgKyBfc2VnXzU3KCkKICAgICsgX3NlZ181OCgpCiAgICArIF9zZWdfNTkoKQogICAgKyBfc2VnXzYwKCkKICAgICsgX3NlZ182MSgpCiAgICArIF9zZWdfNjIoKQogICAgKyBfc2VnXzYzKCkKICAgICsgX3NlZ182NCgpCiAgICArIF9zZWdfNjUoKQogICAgKyBfc2VnXzY2KCkKICAgICsgX3NlZ182NygpCiAgICArIF9zZWdfNjgoKQogICAgKyBfc2VnXzY5KCkKICAgICsgX3NlZ183MCgpCiAgICArIF9zZWdfNzEoKQogICAgKyBfc2VnXzcyKCkKKQpQSwMEFAAAAAAAAAAhAN3EpgUwOQEAMDkBACgAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaXBhZGRyZXNzLnB5IyBDb3B5cmlnaHQgMjAwNyBHb29nbGUgSW5jLgojICBMaWNlbnNlZCB0byBQU0YgdW5kZXIgYSBDb250cmlidXRvciBBZ3JlZW1lbnQuCgoiIiJBIGZhc3QsIGxpZ2h0d2VpZ2h0IElQdjQvSVB2NiBtYW5pcHVsYXRpb24gbGlicmFyeSBpbiBQeXRob24uCgpUaGlzIGxpYnJhcnkgaXMgdXNlZCB0byBjcmVhdGUvcG9rZS9tYW5pcHVsYXRlIElQdjQgYW5kIElQdjYgYWRkcmVzc2VzCmFuZCBuZXR3b3Jrcy4KCiIiIgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB1bmljb2RlX2xpdGVyYWxzCgoKaW1wb3J0IGl0ZXJ0b29scwppbXBvcnQgc3RydWN0CgpfX3ZlcnNpb25fXyA9ICcxLjAuMTcnCgojIENvbXBhdGliaWxpdHkgZnVuY3Rpb25zCl9jb21wYXRfaW50X3R5cGVzID0gKGludCwpCnRyeToKICAgIF9jb21wYXRfaW50X3R5cGVzID0gKGludCwgbG9uZykKZXhjZXB0IE5hbWVFcnJvcjoKICAgIHBhc3MKdHJ5OgogICAgX2NvbXBhdF9zdHIgPSB1bmljb2RlCmV4Y2VwdCBOYW1lRXJyb3I6CiAgICBfY29tcGF0X3N0ciA9IHN0cgogICAgYXNzZXJ0IGJ5dGVzICE9IHN0cgppZiBiJ1wwJ1swXSA9PSAwOiAgIyBQeXRob24gMyBzZW1hbnRpY3MKICAgIGRlZiBfY29tcGF0X2J5dGVzX3RvX2J5dGVfdmFscyhieXQpOgogICAgICAgIHJldHVybiBieXQKZWxzZToKICAgIGRlZiBfY29tcGF0X2J5dGVzX3RvX2J5dGVfdmFscyhieXQpOgogICAgICAgIHJldHVybiBbc3RydWN0LnVucGFjayhiJyFCJywgYilbMF0gZm9yIGIgaW4gYnl0XQp0cnk6CiAgICBfY29tcGF0X2ludF9mcm9tX2J5dGVfdmFscyA9IGludC5mcm9tX2J5dGVzCmV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgIGRlZiBfY29tcGF0X2ludF9mcm9tX2J5dGVfdmFscyhieXR2YWxzLCBlbmRpYW5lc3MpOgogICAgICAgIGFzc2VydCBlbmRpYW5lc3MgPT0gJ2JpZycKICAgICAgICByZXMgPSAwCiAgICAgICAgZm9yIGJ2IGluIGJ5dHZhbHM6CiAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGJ2LCBfY29tcGF0X2ludF90eXBlcykKICAgICAgICAgICAgcmVzID0gKHJlcyA8PCA4KSArIGJ2CiAgICAgICAgcmV0dXJuIHJlcwoKCmRlZiBfY29tcGF0X3RvX2J5dGVzKGludHZhbCwgbGVuZ3RoLCBlbmRpYW5lc3MpOgogICAgYXNzZXJ0IGlzaW5zdGFuY2UoaW50dmFsLCBfY29tcGF0X2ludF90eXBlcykKICAgIGFzc2VydCBlbmRpYW5lc3MgPT0gJ2JpZycKICAgIGlmIGxlbmd0aCA9PSA0OgogICAgICAgIGlmIGludHZhbCA8IDAgb3IgaW50dmFsID49IDIgKiogMzI6CiAgICAgICAgICAgIHJhaXNlIHN0cnVjdC5lcnJvcigiaW50ZWdlciBvdXQgb2YgcmFuZ2UgZm9yICdJJyBmb3JtYXQgY29kZSIpCiAgICAgICAgcmV0dXJuIHN0cnVjdC5wYWNrKGInIUknLCBpbnR2YWwpCiAgICBlbGlmIGxlbmd0aCA9PSAxNjoKICAgICAgICBpZiBpbnR2YWwgPCAwIG9yIGludHZhbCA+PSAyICoqIDEyODoKICAgICAgICAgICAgcmFpc2Ugc3RydWN0LmVycm9yKCJpbnRlZ2VyIG91dCBvZiByYW5nZSBmb3IgJ1FRJyBmb3JtYXQgY29kZSIpCiAgICAgICAgcmV0dXJuIHN0cnVjdC5wYWNrKGInIVFRJywgaW50dmFsID4+IDY0LCBpbnR2YWwgJiAweGZmZmZmZmZmZmZmZmZmZmYpCiAgICBlbHNlOgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoKQppZiBoYXNhdHRyKGludCwgJ2JpdF9sZW5ndGgnKToKICAgICMgTm90IGludC5iaXRfbGVuZ3RoICwgc2luY2UgdGhhdCB3b24ndCB3b3JrIGluIDIuNyB3aGVyZSBsb25nIGV4aXN0cwogICAgZGVmIF9jb21wYXRfYml0X2xlbmd0aChpKToKICAgICAgICByZXR1cm4gaS5iaXRfbGVuZ3RoKCkKZWxzZToKICAgIGRlZiBfY29tcGF0X2JpdF9sZW5ndGgoaSk6CiAgICAgICAgZm9yIHJlcyBpbiBpdGVydG9vbHMuY291bnQoKToKICAgICAgICAgICAgaWYgaSA+PiByZXMgPT0gMDoKICAgICAgICAgICAgICAgIHJldHVybiByZXMKCgpkZWYgX2NvbXBhdF9yYW5nZShzdGFydCwgZW5kLCBzdGVwPTEpOgogICAgYXNzZXJ0IHN0ZXAgPiAwCiAgICBpID0gc3RhcnQKICAgIHdoaWxlIGkgPCBlbmQ6CiAgICAgICAgeWllbGQgaQogICAgICAgIGkgKz0gc3RlcAoKCmNsYXNzIF9Ub3RhbE9yZGVyaW5nTWl4aW4ob2JqZWN0KToKICAgIF9fc2xvdHNfXyA9ICgpCgogICAgIyBIZWxwZXIgdGhhdCBkZXJpdmVzIHRoZSBvdGhlciBjb21wYXJpc29uIG9wZXJhdGlvbnMgZnJvbQogICAgIyBfX2x0X18gYW5kIF9fZXFfXwogICAgIyBXZSBhdm9pZCBmdW5jdG9vbHMudG90YWxfb3JkZXJpbmcgYmVjYXVzZSBpdCBkb2Vzbid0IGhhbmRsZQogICAgIyBOb3RJbXBsZW1lbnRlZCBjb3JyZWN0bHkgeWV0IChodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMTAwNDIpCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgZXF1YWwgPSBzZWxmLl9fZXFfXyhvdGhlcikKICAgICAgICBpZiBlcXVhbCBpcyBOb3RJbXBsZW1lbnRlZDoKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCiAgICAgICAgcmV0dXJuIG5vdCBlcXVhbAoKICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKCiAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKToKICAgICAgICBsZXNzID0gc2VsZi5fX2x0X18ob3RoZXIpCiAgICAgICAgaWYgbGVzcyBpcyBOb3RJbXBsZW1lbnRlZCBvciBub3QgbGVzczoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19lcV9fKG90aGVyKQogICAgICAgIHJldHVybiBsZXNzCgogICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgbGVzcyA9IHNlbGYuX19sdF9fKG90aGVyKQogICAgICAgIGlmIGxlc3MgaXMgTm90SW1wbGVtZW50ZWQ6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogICAgICAgIGVxdWFsID0gc2VsZi5fX2VxX18ob3RoZXIpCiAgICAgICAgaWYgZXF1YWwgaXMgTm90SW1wbGVtZW50ZWQ6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogICAgICAgIHJldHVybiBub3QgKGxlc3Mgb3IgZXF1YWwpCgogICAgZGVmIF9fZ2VfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgbGVzcyA9IHNlbGYuX19sdF9fKG90aGVyKQogICAgICAgIGlmIGxlc3MgaXMgTm90SW1wbGVtZW50ZWQ6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogICAgICAgIHJldHVybiBub3QgbGVzcwoKCklQVjRMRU5HVEggPSAzMgpJUFY2TEVOR1RIID0gMTI4CgoKY2xhc3MgQWRkcmVzc1ZhbHVlRXJyb3IoVmFsdWVFcnJvcik6CiAgICAiIiJBIFZhbHVlIEVycm9yIHJlbGF0ZWQgdG8gdGhlIGFkZHJlc3MuIiIiCgoKY2xhc3MgTmV0bWFza1ZhbHVlRXJyb3IoVmFsdWVFcnJvcik6CiAgICAiIiJBIFZhbHVlIEVycm9yIHJlbGF0ZWQgdG8gdGhlIG5ldG1hc2suIiIiCgoKZGVmIGlwX2FkZHJlc3MoYWRkcmVzcyk6CiAgICAiIiJUYWtlIGFuIElQIHN0cmluZy9pbnQgYW5kIHJldHVybiBhbiBvYmplY3Qgb2YgdGhlIGNvcnJlY3QgdHlwZS4KCiAgICBBcmdzOgogICAgICAgIGFkZHJlc3M6IEEgc3RyaW5nIG9yIGludGVnZXIsIHRoZSBJUCBhZGRyZXNzLiAgRWl0aGVyIElQdjQgb3IKICAgICAgICAgIElQdjYgYWRkcmVzc2VzIG1heSBiZSBzdXBwbGllZDsgaW50ZWdlcnMgbGVzcyB0aGFuIDIqKjMyIHdpbGwKICAgICAgICAgIGJlIGNvbnNpZGVyZWQgdG8gYmUgSVB2NCBieSBkZWZhdWx0LgoKICAgIFJldHVybnM6CiAgICAgICAgQW4gSVB2NEFkZHJlc3Mgb3IgSVB2NkFkZHJlc3Mgb2JqZWN0LgoKICAgIFJhaXNlczoKICAgICAgICBWYWx1ZUVycm9yOiBpZiB0aGUgKmFkZHJlc3MqIHBhc3NlZCBpc24ndCBlaXRoZXIgYSB2NCBvciBhIHY2CiAgICAgICAgICBhZGRyZXNzCgogICAgIiIiCiAgICB0cnk6CiAgICAgICAgcmV0dXJuIElQdjRBZGRyZXNzKGFkZHJlc3MpCiAgICBleGNlcHQgKEFkZHJlc3NWYWx1ZUVycm9yLCBOZXRtYXNrVmFsdWVFcnJvcik6CiAgICAgICAgcGFzcwoKICAgIHRyeToKICAgICAgICByZXR1cm4gSVB2NkFkZHJlc3MoYWRkcmVzcykKICAgIGV4Y2VwdCAoQWRkcmVzc1ZhbHVlRXJyb3IsIE5ldG1hc2tWYWx1ZUVycm9yKToKICAgICAgICBwYXNzCgogICAgaWYgaXNpbnN0YW5jZShhZGRyZXNzLCBieXRlcyk6CiAgICAgICAgcmFpc2UgQWRkcmVzc1ZhbHVlRXJyb3IoCiAgICAgICAgICAgICclciBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgYW4gSVB2NCBvciBJUHY2IGFkZHJlc3MuICcKICAgICAgICAgICAgJ0RpZCB5b3UgcGFzcyBpbiBhIGJ5dGVzIChzdHIgaW4gUHl0aG9uIDIpIGluc3RlYWQgb2YnCiAgICAgICAgICAgICcgYSB1bmljb2RlIG9iamVjdD8nICUgYWRkcmVzcykKCiAgICByYWlzZSBWYWx1ZUVycm9yKCclciBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgYW4gSVB2NCBvciBJUHY2IGFkZHJlc3MnICUKICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcykKCgpkZWYgaXBfbmV0d29yayhhZGRyZXNzLCBzdHJpY3Q9VHJ1ZSk6CiAgICAiIiJUYWtlIGFuIElQIHN0cmluZy9pbnQgYW5kIHJldHVybiBhbiBvYmplY3Qgb2YgdGhlIGNvcnJlY3QgdHlwZS4KCiAgICBBcmdzOgogICAgICAgIGFkZHJlc3M6IEEgc3RyaW5nIG9yIGludGVnZXIsIHRoZSBJUCBuZXR3b3JrLiAgRWl0aGVyIElQdjQgb3IKICAgICAgICAgIElQdjYgbmV0d29ya3MgbWF5IGJlIHN1cHBsaWVkOyBpbnRlZ2VycyBsZXNzIHRoYW4gMioqMzIgd2lsbAogICAgICAgICAgYmUgY29uc2lkZXJlZCB0byBiZSBJUHY0IGJ5IGRlZmF1bHQuCgogICAgUmV0dXJuczoKICAgICAgICBBbiBJUHY0TmV0d29yayBvciBJUHY2TmV0d29yayBvYmplY3QuCgogICAgUmFpc2VzOgogICAgICAgIFZhbHVlRXJyb3I6IGlmIHRoZSBzdHJpbmcgcGFzc2VkIGlzbid0IGVpdGhlciBhIHY0IG9yIGEgdjYKICAgICAgICAgIGFkZHJlc3MuIE9yIGlmIHRoZSBuZXR3b3JrIGhhcyBob3N0IGJpdHMgc2V0LgoKICAgICIiIgogICAgdHJ5OgogICAgICAgIHJldHVybiBJUHY0TmV0d29yayhhZGRyZXNzLCBzdHJpY3QpCiAgICBleGNlcHQgKEFkZHJlc3NWYWx1ZUVycm9yLCBOZXRtYXNrVmFsdWVFcnJvcik6CiAgICAgICAgcGFzcwoKICAgIHRyeToKICAgICAgICByZXR1cm4gSVB2Nk5ldHdvcmsoYWRkcmVzcywgc3RyaWN0KQogICAgZXhjZXB0IChBZGRyZXNzVmFsdWVFcnJvciwgTmV0bWFza1ZhbHVlRXJyb3IpOgogICAgICAgIHBhc3MKCiAgICBpZiBpc2luc3RhbmNlKGFkZHJlc3MsIGJ5dGVzKToKICAgICAgICByYWlzZSBBZGRyZXNzVmFsdWVFcnJvcigKICAgICAgICAgICAgJyVyIGRvZXMgbm90IGFwcGVhciB0byBiZSBhbiBJUHY0IG9yIElQdjYgbmV0d29yay4gJwogICAgICAgICAgICAnRGlkIHlvdSBwYXNzIGluIGEgYnl0ZXMgKHN0ciBpbiBQeXRob24gMikgaW5zdGVhZCBvZicKICAgICAgICAgICAgJyBhIHVuaWNvZGUgb2JqZWN0PycgJSBhZGRyZXNzKQoKICAgIHJhaXNlIFZhbHVlRXJyb3IoJyVyIGRvZXMgbm90IGFwcGVhciB0byBiZSBhbiBJUHY0IG9yIElQdjYgbmV0d29yaycgJQogICAgICAgICAgICAgICAgICAgICBhZGRyZXNzKQoKCmRlZiBpcF9pbnRlcmZhY2UoYWRkcmVzcyk6CiAgICAiIiJUYWtlIGFuIElQIHN0cmluZy9pbnQgYW5kIHJldHVybiBhbiBvYmplY3Qgb2YgdGhlIGNvcnJlY3QgdHlwZS4KCiAgICBBcmdzOgogICAgICAgIGFkZHJlc3M6IEEgc3RyaW5nIG9yIGludGVnZXIsIHRoZSBJUCBhZGRyZXNzLiAgRWl0aGVyIElQdjQgb3IKICAgICAgICAgIElQdjYgYWRkcmVzc2VzIG1heSBiZSBzdXBwbGllZDsgaW50ZWdlcnMgbGVzcyB0aGFuIDIqKjMyIHdpbGwKICAgICAgICAgIGJlIGNvbnNpZGVyZWQgdG8gYmUgSVB2NCBieSBkZWZhdWx0LgoKICAgIFJldHVybnM6CiAgICAgICAgQW4gSVB2NEludGVyZmFjZSBvciBJUHY2SW50ZXJmYWNlIG9iamVjdC4KCiAgICBSYWlzZXM6CiAgICAgICAgVmFsdWVFcnJvcjogaWYgdGhlIHN0cmluZyBwYXNzZWQgaXNuJ3QgZWl0aGVyIGEgdjQgb3IgYSB2NgogICAgICAgICAgYWRkcmVzcy4KCiAgICBOb3RlczoKICAgICAgICBUaGUgSVB2P0ludGVyZmFjZSBjbGFzc2VzIGRlc2NyaWJlIGFuIEFkZHJlc3Mgb24gYSBwYXJ0aWN1bGFyCiAgICAgICAgTmV0d29yaywgc28gdGhleSdyZSBiYXNpY2FsbHkgYSBjb21iaW5hdGlvbiBvZiBib3RoIHRoZSBBZGRyZXNzCiAgICAgICAgYW5kIE5ldHdvcmsgY2xhc3Nlcy4KCiAgICAiIiIKICAgIHRyeToKICAgICAgICByZXR1cm4gSVB2NEludGVyZmFjZShhZGRyZXNzKQogICAgZXhjZXB0IChBZGRyZXNzVmFsdWVFcnJvciwgTmV0bWFza1ZhbHVlRXJyb3IpOgogICAgICAgIHBhc3MKCiAgICB0cnk6CiAgICAgICAgcmV0dXJuIElQdjZJbnRlcmZhY2UoYWRkcmVzcykKICAgIGV4Y2VwdCAoQWRkcmVzc1ZhbHVlRXJyb3IsIE5ldG1hc2tWYWx1ZUVycm9yKToKICAgICAgICBwYXNzCgogICAgcmFpc2UgVmFsdWVFcnJvcignJXIgZG9lcyBub3QgYXBwZWFyIHRvIGJlIGFuIElQdjQgb3IgSVB2NiBpbnRlcmZhY2UnICUKICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcykKCgpkZWYgdjRfaW50X3RvX3BhY2tlZChhZGRyZXNzKToKICAgICIiIlJlcHJlc2VudCBhbiBhZGRyZXNzIGFzIDQgcGFja2VkIGJ5dGVzIGluIG5ldHdvcmsgKGJpZy1lbmRpYW4pIG9yZGVyLgoKICAgIEFyZ3M6CiAgICAgICAgYWRkcmVzczogQW4gaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZiBhbiBJUHY0IElQIGFkZHJlc3MuCgogICAgUmV0dXJuczoKICAgICAgICBUaGUgaW50ZWdlciBhZGRyZXNzIHBhY2tlZCBhcyA0IGJ5dGVzIGluIG5ldHdvcmsgKGJpZy1lbmRpYW4pIG9yZGVyLgoKICAgIFJhaXNlczoKICAgICAgICBWYWx1ZUVycm9yOiBJZiB0aGUgaW50ZWdlciBpcyBuZWdhdGl2ZSBvciB0b28gbGFyZ2UgdG8gYmUgYW4KICAgICAgICAgIElQdjQgSVAgYWRkcmVzcy4KCiAgICAiIiIKICAgIHRyeToKICAgICAgICByZXR1cm4gX2NvbXBhdF90b19ieXRlcyhhZGRyZXNzLCA0LCAnYmlnJykKICAgIGV4Y2VwdCAoc3RydWN0LmVycm9yLCBPdmVyZmxvd0Vycm9yKToKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJBZGRyZXNzIG5lZ2F0aXZlIG9yIHRvbyBsYXJnZSBmb3IgSVB2NCIpCgoKZGVmIHY2X2ludF90b19wYWNrZWQoYWRkcmVzcyk6CiAgICAiIiJSZXByZXNlbnQgYW4gYWRkcmVzcyBhcyAxNiBwYWNrZWQgYnl0ZXMgaW4gbmV0d29yayAoYmlnLWVuZGlhbikgb3JkZXIuCgogICAgQXJnczoKICAgICAgICBhZGRyZXNzOiBBbiBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIG9mIGFuIElQdjYgSVAgYWRkcmVzcy4KCiAgICBSZXR1cm5zOgogICAgICAgIFRoZSBpbnRlZ2VyIGFkZHJlc3MgcGFja2VkIGFzIDE2IGJ5dGVzIGluIG5ldHdvcmsgKGJpZy1lbmRpYW4pIG9yZGVyLgoKICAgICIiIgogICAgdHJ5OgogICAgICAgIHJldHVybiBfY29tcGF0X3RvX2J5dGVzKGFkZHJlc3MsIDE2LCAnYmlnJykKICAgIGV4Y2VwdCAoc3RydWN0LmVycm9yLCBPdmVyZmxvd0Vycm9yKToKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJBZGRyZXNzIG5lZ2F0aXZlIG9yIHRvbyBsYXJnZSBmb3IgSVB2NiIpCgoKZGVmIF9zcGxpdF9vcHRpb25hbF9uZXRtYXNrKGFkZHJlc3MpOgogICAgIiIiSGVscGVyIHRvIHNwbGl0IHRoZSBuZXRtYXNrIGFuZCByYWlzZSBBZGRyZXNzVmFsdWVFcnJvciBpZiBuZWVkZWQiIiIKICAgIGFkZHIgPSBfY29tcGF0X3N0cihhZGRyZXNzKS5zcGxpdCgnLycpCiAgICBpZiBsZW4oYWRkcikgPiAyOgogICAgICAgIHJhaXNlIEFkZHJlc3NWYWx1ZUVycm9yKCJPbmx5IG9uZSAnLycgcGVybWl0dGVkIGluICVyIiAlIGFkZHJlc3MpCiAgICByZXR1cm4gYWRkcgoKCmRlZiBfZmluZF9hZGRyZXNzX3JhbmdlKGFkZHJlc3Nlcyk6CiAgICAiIiJGaW5kIGEgc2VxdWVuY2Ugb2Ygc29ydGVkIGRlZHVwbGljYXRlZCBJUHYjQWRkcmVzcy4KCiAgICBBcmdzOgogICAgICAgIGFkZHJlc3NlczogYSBsaXN0IG9mIElQdiNBZGRyZXNzIG9iamVjdHMuCgogICAgWWllbGRzOgogICAgICAgIEEgdHVwbGUgY29udGFpbmluZyB0aGUgZmlyc3QgYW5kIGxhc3QgSVAgYWRkcmVzc2VzIGluIHRoZSBzZXF1ZW5jZS4KCiAgICAiIiIKICAgIGl0ID0gaXRlcihhZGRyZXNzZXMpCiAgICBmaXJzdCA9IGxhc3QgPSBuZXh0KGl0KQogICAgZm9yIGlwIGluIGl0OgogICAgICAgIGlmIGlwLl9pcCAhPSBsYXN0Ll9pcCArIDE6CiAgICAgICAgICAgIHlpZWxkIGZpcnN0LCBsYXN0CiAgICAgICAgICAgIGZpcnN0ID0gaXAKICAgICAgICBsYXN0ID0gaXAKICAgIHlpZWxkIGZpcnN0LCBsYXN0CgoKZGVmIF9jb3VudF9yaWdodGhhbmRfemVyb19iaXRzKG51bWJlciwgYml0cyk6CiAgICAiIiJDb3VudCB0aGUgbnVtYmVyIG9mIHplcm8gYml0cyBvbiB0aGUgcmlnaHQgaGFuZCBzaWRlLgoKICAgIEFyZ3M6CiAgICAgICAgbnVtYmVyOiBhbiBpbnRlZ2VyLgogICAgICAgIGJpdHM6IG1heGltdW0gbnVtYmVyIG9mIGJpdHMgdG8gY291bnQuCgogICAgUmV0dXJuczoKICAgICAgICBUaGUgbnVtYmVyIG9mIHplcm8gYml0cyBvbiB0aGUgcmlnaHQgaGFuZCBzaWRlIG9mIHRoZSBudW1iZXIuCgogICAgIiIiCiAgICBpZiBudW1iZXIgPT0gMDoKICAgICAgICByZXR1cm4gYml0cwogICAgcmV0dXJuIG1pbihiaXRzLCBfY29tcGF0X2JpdF9sZW5ndGgofm51bWJlciAmIChudW1iZXIgLSAxKSkpCgoKZGVmIHN1bW1hcml6ZV9hZGRyZXNzX3JhbmdlKGZpcnN0LCBsYXN0KToKICAgICIiIlN1bW1hcml6ZSBhIG5ldHdvcmsgcmFuZ2UgZ2l2ZW4gdGhlIGZpcnN0IGFuZCBsYXN0IElQIGFkZHJlc3Nlcy4KCiAgICBFeGFtcGxlOgogICAgICAgID4+PiBsaXN0KHN1bW1hcml6ZV9hZGRyZXNzX3JhbmdlKElQdjRBZGRyZXNzKCcxOTIuMC4yLjAnKSwKICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUHY0QWRkcmVzcygnMTkyLjAuMi4xMzAnKSkpCiAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZG9jdGVzdDogK05PUk1BTElaRV9XSElURVNQQUNFCiAgICAgICAgW0lQdjROZXR3b3JrKCcxOTIuMC4yLjAvMjUnKSwgSVB2NE5ldHdvcmsoJzE5Mi4wLjIuMTI4LzMxJyksCiAgICAgICAgIElQdjROZXR3b3JrKCcxOTIuMC4yLjEzMC8zMicpXQoKICAgIEFyZ3M6CiAgICAgICAgZmlyc3Q6IHRoZSBmaXJzdCBJUHY0QWRkcmVzcyBvciBJUHY2QWRkcmVzcyBpbiB0aGUgcmFuZ2UuCiAgICAgICAgbGFzdDogdGhlIGxhc3QgSVB2NEFkZHJlc3Mgb3IgSVB2NkFkZHJlc3MgaW4gdGhlIHJhbmdlLgoKICAgIFJldHVybnM6CiAgICAgICAgQW4gaXRlcmF0b3Igb2YgdGhlIHN1bW1hcml6ZWQgSVB2KDR8NikgbmV0d29yayBvYmplY3RzLgoKICAgIFJhaXNlOgogICAgICAgIFR5cGVFcnJvcjoKICAgICAgICAgICAgSWYgdGhlIGZpcnN0IGFuZCBsYXN0IG9iamVjdHMgYXJlIG5vdCBJUCBhZGRyZXNzZXMuCiAgICAgICAgICAgIElmIHRoZSBmaXJzdCBhbmQgbGFzdCBvYmplY3RzIGFyZSBub3QgdGhlIHNhbWUgdmVyc2lvbi4KICAgICAgICBWYWx1ZUVycm9yOgogICAgICAgICAgICBJZiB0aGUgbGFzdCBvYmplY3QgaXMgbm90IGdyZWF0ZXIgdGhhbiB0aGUgZmlyc3QuCiAgICAgICAgICAgIElmIHRoZSB2ZXJzaW9uIG9mIHRoZSBmaXJzdCBhZGRyZXNzIGlzIG5vdCA0IG9yIDYuCgogICAgIiIiCiAgICBpZiAobm90IChpc2luc3RhbmNlKGZpcnN0LCBfQmFzZUFkZHJlc3MpIGFuZAogICAgICAgICAgICAgaXNpbnN0YW5jZShsYXN0LCBfQmFzZUFkZHJlc3MpKSk6CiAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdmaXJzdCBhbmQgbGFzdCBtdXN0IGJlIElQIGFkZHJlc3Nlcywgbm90IG5ldHdvcmtzJykKICAgIGlmIGZpcnN0LnZlcnNpb24gIT0gbGFzdC52ZXJzaW9uOgogICAgICAgIHJhaXNlIFR5cGVFcnJvcigiJXMgYW5kICVzIGFyZSBub3Qgb2YgdGhlIHNhbWUgdmVyc2lvbiIgJSAoCiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0LCBsYXN0KSkKICAgIGlmIGZpcnN0ID4gbGFzdDoKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdsYXN0IElQIGFkZHJlc3MgbXVzdCBiZSBncmVhdGVyIHRoYW4gZmlyc3QnKQoKICAgIGlmIGZpcnN0LnZlcnNpb24gPT0gNDoKICAgICAgICBpcCA9IElQdjROZXR3b3JrCiAgICBlbGlmIGZpcnN0LnZlcnNpb24gPT0gNjoKICAgICAgICBpcCA9IElQdjZOZXR3b3JrCiAgICBlbHNlOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ3Vua25vd24gSVAgdmVyc2lvbicpCgogICAgaXBfYml0cyA9IGZpcnN0Ll9tYXhfcHJlZml4bGVuCiAgICBmaXJzdF9pbnQgPSBmaXJzdC5faXAKICAgIGxhc3RfaW50ID0gbGFzdC5faXAKICAgIHdoaWxlIGZpcnN0X2ludCA8PSBsYXN0X2ludDoKICAgICAgICBuYml0cyA9IG1pbihfY291bnRfcmlnaHRoYW5kX3plcm9fYml0cyhmaXJzdF9pbnQsIGlwX2JpdHMpLAogICAgICAgICAgICAgICAgICAgIF9jb21wYXRfYml0X2xlbmd0aChsYXN0X2ludCAtIGZpcnN0X2ludCArIDEpIC0gMSkKICAgICAgICBuZXQgPSBpcCgoZmlyc3RfaW50LCBpcF9iaXRzIC0gbmJpdHMpKQogICAgICAgIHlpZWxkIG5ldAogICAgICAgIGZpcnN0X2ludCArPSAxIDw8IG5iaXRzCiAgICAgICAgaWYgZmlyc3RfaW50IC0gMSA9PSBpcC5fQUxMX09ORVM6CiAgICAgICAgICAgIGJyZWFrCgoKZGVmIF9jb2xsYXBzZV9hZGRyZXNzZXNfaW50ZXJuYWwoYWRkcmVzc2VzKToKICAgICIiIkxvb3BzIHRocm91Z2ggdGhlIGFkZHJlc3NlcywgY29sbGFwc2luZyBjb25jdXJyZW50IG5ldGJsb2Nrcy4KCiAgICBFeGFtcGxlOgoKICAgICAgICBpcDEgPSBJUHY0TmV0d29yaygnMTkyLjAuMi4wLzI2JykKICAgICAgICBpcDIgPSBJUHY0TmV0d29yaygnMTkyLjAuMi42NC8yNicpCiAgICAgICAgaXAzID0gSVB2NE5ldHdvcmsoJzE5Mi4wLjIuMTI4LzI2JykKICAgICAgICBpcDQgPSBJUHY0TmV0d29yaygnMTkyLjAuMi4xOTIvMjYnKQoKICAgICAgICBfY29sbGFwc2VfYWRkcmVzc2VzX2ludGVybmFsKFtpcDEsIGlwMiwgaXAzLCBpcDRdKSAtPgogICAgICAgICAgW0lQdjROZXR3b3JrKCcxOTIuMC4yLjAvMjQnKV0KCiAgICAgICAgVGhpcyBzaG91bGRuJ3QgYmUgY2FsbGVkIGRpcmVjdGx5OyBpdCBpcyBjYWxsZWQgdmlhCiAgICAgICAgICBjb2xsYXBzZV9hZGRyZXNzZXMoW10pLgoKICAgIEFyZ3M6CiAgICAgICAgYWRkcmVzc2VzOiBBIGxpc3Qgb2YgSVB2NE5ldHdvcmsncyBvciBJUHY2TmV0d29yaydzCgogICAgUmV0dXJuczoKICAgICAgICBBIGxpc3Qgb2YgSVB2NE5ldHdvcmsncyBvciBJUHY2TmV0d29yaydzIGRlcGVuZGluZyBvbiB3aGF0IHdlIHdlcmUKICAgICAgICBwYXNzZWQuCgogICAgIiIiCiAgICAjIEZpcnN0IG1lcmdlCiAgICB0b19tZXJnZSA9IGxpc3QoYWRkcmVzc2VzKQogICAgc3VibmV0cyA9IHt9CiAgICB3aGlsZSB0b19tZXJnZToKICAgICAgICBuZXQgPSB0b19tZXJnZS5wb3AoKQogICAgICAgIHN1cGVybmV0ID0gbmV0LnN1cGVybmV0KCkKICAgICAgICBleGlzdGluZyA9IHN1Ym5ldHMuZ2V0KHN1cGVybmV0KQogICAgICAgIGlmIGV4aXN0aW5nIGlzIE5vbmU6CiAgICAgICAgICAgIHN1Ym5ldHNbc3VwZXJuZXRdID0gbmV0CiAgICAgICAgZWxpZiBleGlzdGluZyAhPSBuZXQ6CiAgICAgICAgICAgICMgTWVyZ2UgY29uc2VjdXRpdmUgc3VibmV0cwogICAgICAgICAgICBkZWwgc3VibmV0c1tzdXBlcm5ldF0KICAgICAgICAgICAgdG9fbWVyZ2UuYXBwZW5kKHN1cGVybmV0KQogICAgIyBUaGVuIGl0ZXJhdGUgb3ZlciByZXN1bHRpbmcgbmV0d29ya3MsIHNraXBwaW5nIHN1YnN1bWVkIHN1Ym5ldHMKICAgIGxhc3QgPSBOb25lCiAgICBmb3IgbmV0IGluIHNvcnRlZChzdWJuZXRzLnZhbHVlcygpKToKICAgICAgICBpZiBsYXN0IGlzIG5vdCBOb25lOgogICAgICAgICAgICAjIFNpbmNlIHRoZXkgYXJlIHNvcnRlZCwKICAgICAgICAgICAgIyBsYXN0Lm5ldHdvcmtfYWRkcmVzcyA8PSBuZXQubmV0d29ya19hZGRyZXNzIGlzIGEgZ2l2ZW4uCiAgICAgICAgICAgIGlmIGxhc3QuYnJvYWRjYXN0X2FkZHJlc3MgPj0gbmV0LmJyb2FkY2FzdF9hZGRyZXNzOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICB5aWVsZCBuZXQKICAgICAgICBsYXN0ID0gbmV0CgoKZGVmIGNvbGxhcHNlX2FkZHJlc3NlcyhhZGRyZXNzZXMpOgogICAgIiIiQ29sbGFwc2UgYSBsaXN0IG9mIElQIG9iamVjdHMuCgogICAgRXhhbXBsZToKICAgICAgICBjb2xsYXBzZV9hZGRyZXNzZXMoW0lQdjROZXR3b3JrKCcxOTIuMC4yLjAvMjUnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQdjROZXR3b3JrKCcxOTIuMC4yLjEyOC8yNScpXSkgLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgW0lQdjROZXR3b3JrKCcxOTIuMC4yLjAvMjQnKV0KCiAgICBBcmdzOgogICAgICAgIGFkZHJlc3NlczogQW4gaXRlcmF0b3Igb2YgSVB2NE5ldHdvcmsgb3IgSVB2Nk5ldHdvcmsgb2JqZWN0cy4KCiAgICBSZXR1cm5zOgogICAgICAgIEFuIGl0ZXJhdG9yIG9mIHRoZSBjb2xsYXBzZWQgSVB2KDR8NilOZXR3b3JrIG9iamVjdHMuCgogICAgUmFpc2VzOgogICAgICAgIFR5cGVFcnJvcjogSWYgcGFzc2VkIGEgbGlzdCBvZiBtaXhlZCB2ZXJzaW9uIG9iamVjdHMuCgogICAgIiIiCiAgICBhZGRycyA9IFtdCiAgICBpcHMgPSBbXQogICAgbmV0cyA9IFtdCgogICAgIyBzcGxpdCBJUCBhZGRyZXNzZXMgYW5kIG5ldHdvcmtzCiAgICBmb3IgaXAgaW4gYWRkcmVzc2VzOgogICAgICAgIGlmIGlzaW5zdGFuY2UoaXAsIF9CYXNlQWRkcmVzcyk6CiAgICAgICAgICAgIGlmIGlwcyBhbmQgaXBzWy0xXS5fdmVyc2lvbiAhPSBpcC5fdmVyc2lvbjoKICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiJXMgYW5kICVzIGFyZSBub3Qgb2YgdGhlIHNhbWUgdmVyc2lvbiIgJSAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXAsIGlwc1stMV0pKQogICAgICAgICAgICBpcHMuYXBwZW5kKGlwKQogICAgICAgIGVsaWYgaXAuX3ByZWZpeGxlbiA9PSBpcC5fbWF4X3ByZWZpeGxlbjoKICAgICAgICAgICAgaWYgaXBzIGFuZCBpcHNbLTFdLl92ZXJzaW9uICE9IGlwLl92ZXJzaW9uOgogICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCIlcyBhbmQgJXMgYXJlIG5vdCBvZiB0aGUgc2FtZSB2ZXJzaW9uIiAlICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcCwgaXBzWy0xXSkpCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGlwcy5hcHBlbmQoaXAuaXApCiAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgICAgIGlwcy5hcHBlbmQoaXAubmV0d29ya19hZGRyZXNzKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIG5ldHMgYW5kIG5ldHNbLTFdLl92ZXJzaW9uICE9IGlwLl92ZXJzaW9uOgogICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCIlcyBhbmQgJXMgYXJlIG5vdCBvZiB0aGUgc2FtZSB2ZXJzaW9uIiAlICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcCwgbmV0c1stMV0pKQogICAgICAgICAgICBuZXRzLmFwcGVuZChpcCkKCiAgICAjIHNvcnQgYW5kIGRlZHVwCiAgICBpcHMgPSBzb3J0ZWQoc2V0KGlwcykpCgogICAgIyBmaW5kIGNvbnNlY3V0aXZlIGFkZHJlc3MgcmFuZ2VzIGluIHRoZSBzb3J0ZWQgc2VxdWVuY2UgYW5kIHN1bW1hcml6ZSB0aGVtCiAgICBpZiBpcHM6CiAgICAgICAgZm9yIGZpcnN0LCBsYXN0IGluIF9maW5kX2FkZHJlc3NfcmFuZ2UoaXBzKToKICAgICAgICAgICAgYWRkcnMuZXh0ZW5kKHN1bW1hcml6ZV9hZGRyZXNzX3JhbmdlKGZpcnN0LCBsYXN0KSkKCiAgICByZXR1cm4gX2NvbGxhcHNlX2FkZHJlc3Nlc19pbnRlcm5hbChhZGRycyArIG5ldHMpCgoKZGVmIGdldF9taXhlZF90eXBlX2tleShvYmopOgogICAgIiIiUmV0dXJuIGEga2V5IHN1aXRhYmxlIGZvciBzb3J0aW5nIGJldHdlZW4gbmV0d29ya3MgYW5kIGFkZHJlc3Nlcy4KCiAgICBBZGRyZXNzIGFuZCBOZXR3b3JrIG9iamVjdHMgYXJlIG5vdCBzb3J0YWJsZSBieSBkZWZhdWx0OyB0aGV5J3JlCiAgICBmdW5kYW1lbnRhbGx5IGRpZmZlcmVudCBzbyB0aGUgZXhwcmVzc2lvbgoKICAgICAgICBJUHY0QWRkcmVzcygnMTkyLjAuMi4wJykgPD0gSVB2NE5ldHdvcmsoJzE5Mi4wLjIuMC8yNCcpCgogICAgZG9lc24ndCBtYWtlIGFueSBzZW5zZS4gIFRoZXJlIGFyZSBzb21lIHRpbWVzIGhvd2V2ZXIsIHdoZXJlIHlvdSBtYXkgd2lzaAogICAgdG8gaGF2ZSBpcGFkZHJlc3Mgc29ydCB0aGVzZSBmb3IgeW91IGFueXdheS4gSWYgeW91IG5lZWQgdG8gZG8gdGhpcywgeW91CiAgICBjYW4gdXNlIHRoaXMgZnVuY3Rpb24gYXMgdGhlIGtleT0gYXJndW1lbnQgdG8gc29ydGVkKCkuCgogICAgQXJnczoKICAgICAgb2JqOiBlaXRoZXIgYSBOZXR3b3JrIG9yIEFkZHJlc3Mgb2JqZWN0LgogICAgUmV0dXJuczoKICAgICAgYXBwcm9wcmlhdGUga2V5LgoKICAgICIiIgogICAgaWYgaXNpbnN0YW5jZShvYmosIF9CYXNlTmV0d29yayk6CiAgICAgICAgcmV0dXJuIG9iai5fZ2V0X25ldHdvcmtzX2tleSgpCiAgICBlbGlmIGlzaW5zdGFuY2Uob2JqLCBfQmFzZUFkZHJlc3MpOgogICAgICAgIHJldHVybiBvYmouX2dldF9hZGRyZXNzX2tleSgpCiAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKCgpjbGFzcyBfSVBBZGRyZXNzQmFzZShfVG90YWxPcmRlcmluZ01peGluKToKCiAgICAiIiJUaGUgbW90aGVyIGNsYXNzLiIiIgoKICAgIF9fc2xvdHNfXyA9ICgpCgogICAgQHByb3BlcnR5CiAgICBkZWYgZXhwbG9kZWQoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIHRoZSBsb25naGFuZCB2ZXJzaW9uIG9mIHRoZSBJUCBhZGRyZXNzIGFzIGEgc3RyaW5nLiIiIgogICAgICAgIHJldHVybiBzZWxmLl9leHBsb2RlX3Nob3J0aGFuZF9pcF9zdHJpbmcoKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNvbXByZXNzZWQoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIHRoZSBzaG9ydGhhbmQgdmVyc2lvbiBvZiB0aGUgSVAgYWRkcmVzcyBhcyBhIHN0cmluZy4iIiIKICAgICAgICByZXR1cm4gX2NvbXBhdF9zdHIoc2VsZikKCiAgICBAcHJvcGVydHkKICAgIGRlZiByZXZlcnNlX3BvaW50ZXIoc2VsZik6CiAgICAgICAgIiIiVGhlIG5hbWUgb2YgdGhlIHJldmVyc2UgRE5TIHBvaW50ZXIgZm9yIHRoZSBJUCBhZGRyZXNzLCBlLmcuOgogICAgICAgICAgICA+Pj4gaXBhZGRyZXNzLmlwX2FkZHJlc3MoIjEyNy4wLjAuMSIpLnJldmVyc2VfcG9pbnRlcgogICAgICAgICAgICAnMS4wLjAuMTI3LmluLWFkZHIuYXJwYScKICAgICAgICAgICAgPj4+IGlwYWRkcmVzcy5pcF9hZGRyZXNzKCIyMDAxOmRiODo6MSIpLnJldmVyc2VfcG9pbnRlcgogICAgICAgICAgICAnMS4wLjAuMC4wLjAuMC4wLjAuMC4wLjAuMC4wLjAuMC4wLjAuMC4wLjAuMC4wLjAuOC5iLmQuMC4xLjAuMC4yLmlwNi5hcnBhJwoKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5fcmV2ZXJzZV9wb2ludGVyKCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiB2ZXJzaW9uKHNlbGYpOgogICAgICAgIG1zZyA9ICclMjAwcyBoYXMgbm8gdmVyc2lvbiBzcGVjaWZpZWQnICUgKHR5cGUoc2VsZiksKQogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IobXNnKQoKICAgIGRlZiBfY2hlY2tfaW50X2FkZHJlc3Moc2VsZiwgYWRkcmVzcyk6CiAgICAgICAgaWYgYWRkcmVzcyA8IDA6CiAgICAgICAgICAgIG1zZyA9ICIlZCAoPCAwKSBpcyBub3QgcGVybWl0dGVkIGFzIGFuIElQdiVkIGFkZHJlc3MiCiAgICAgICAgICAgIHJhaXNlIEFkZHJlc3NWYWx1ZUVycm9yKG1zZyAlIChhZGRyZXNzLCBzZWxmLl92ZXJzaW9uKSkKICAgICAgICBpZiBhZGRyZXNzID4gc2VsZi5fQUxMX09ORVM6CiAgICAgICAgICAgIG1zZyA9ICIlZCAoPj0gMioqJWQpIGlzIG5vdCBwZXJtaXR0ZWQgYXMgYW4gSVB2JWQgYWRkcmVzcyIKICAgICAgICAgICAgcmFpc2UgQWRkcmVzc1ZhbHVlRXJyb3IobXNnICUgKGFkZHJlc3MsIHNlbGYuX21heF9wcmVmaXhsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl92ZXJzaW9uKSkKCiAgICBkZWYgX2NoZWNrX3BhY2tlZF9hZGRyZXNzKHNlbGYsIGFkZHJlc3MsIGV4cGVjdGVkX2xlbik6CiAgICAgICAgYWRkcmVzc19sZW4gPSBsZW4oYWRkcmVzcykKICAgICAgICBpZiBhZGRyZXNzX2xlbiAhPSBleHBlY3RlZF9sZW46CiAgICAgICAgICAgIG1zZyA9ICgKICAgICAgICAgICAgICAgICclciAobGVuICVkICE9ICVkKSBpcyBub3QgcGVybWl0dGVkIGFzIGFuIElQdiVkIGFkZHJlc3MuICcKICAgICAgICAgICAgICAgICdEaWQgeW91IHBhc3MgaW4gYSBieXRlcyAoc3RyIGluIFB5dGhvbiAyKSBpbnN0ZWFkIG9mJwogICAgICAgICAgICAgICAgJyBhIHVuaWNvZGUgb2JqZWN0PycKICAgICAgICAgICAgKQogICAgICAgICAgICByYWlzZSBBZGRyZXNzVmFsdWVFcnJvcihtc2cgJSAoYWRkcmVzcywgYWRkcmVzc19sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9sZW4sIHNlbGYuX3ZlcnNpb24pKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9pcF9pbnRfZnJvbV9wcmVmaXgoY2xzLCBwcmVmaXhsZW4pOgogICAgICAgICIiIlR1cm4gdGhlIHByZWZpeCBsZW5ndGggaW50byBhIGJpdHdpc2UgbmV0bWFzawoKICAgICAgICBBcmdzOgogICAgICAgICAgICBwcmVmaXhsZW46IEFuIGludGVnZXIsIHRoZSBwcmVmaXggbGVuZ3RoLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBbiBpbnRlZ2VyLgoKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gY2xzLl9BTExfT05FUyBeIChjbHMuX0FMTF9PTkVTID4+IHByZWZpeGxlbikKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfcHJlZml4X2Zyb21faXBfaW50KGNscywgaXBfaW50KToKICAgICAgICAiIiJSZXR1cm4gcHJlZml4IGxlbmd0aCBmcm9tIHRoZSBiaXR3aXNlIG5ldG1hc2suCgogICAgICAgIEFyZ3M6CiAgICAgICAgICAgIGlwX2ludDogQW4gaW50ZWdlciwgdGhlIG5ldG1hc2sgaW4gZXhwYW5kZWQgYml0d2lzZSBmb3JtYXQKCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQW4gaW50ZWdlciwgdGhlIHByZWZpeCBsZW5ndGguCgogICAgICAgIFJhaXNlczoKICAgICAgICAgICAgVmFsdWVFcnJvcjogSWYgdGhlIGlucHV0IGludGVybWluZ2xlcyB6ZXJvZXMgJiBvbmVzCiAgICAgICAgIiIiCiAgICAgICAgdHJhaWxpbmdfemVyb2VzID0gX2NvdW50X3JpZ2h0aGFuZF96ZXJvX2JpdHMoaXBfaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNscy5fbWF4X3ByZWZpeGxlbikKICAgICAgICBwcmVmaXhsZW4gPSBjbHMuX21heF9wcmVmaXhsZW4gLSB0cmFpbGluZ196ZXJvZXMKICAgICAgICBsZWFkaW5nX29uZXMgPSBpcF9pbnQgPj4gdHJhaWxpbmdfemVyb2VzCiAgICAgICAgYWxsX29uZXMgPSAoMSA8PCBwcmVmaXhsZW4pIC0gMQogICAgICAgIGlmIGxlYWRpbmdfb25lcyAhPSBhbGxfb25lczoKICAgICAgICAgICAgYnl0ZXNsZW4gPSBjbHMuX21heF9wcmVmaXhsZW4gLy8gOAogICAgICAgICAgICBkZXRhaWxzID0gX2NvbXBhdF90b19ieXRlcyhpcF9pbnQsIGJ5dGVzbGVuLCAnYmlnJykKICAgICAgICAgICAgbXNnID0gJ05ldG1hc2sgcGF0dGVybiAlciBtaXhlcyB6ZXJvZXMgJiBvbmVzJwogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKG1zZyAlIGRldGFpbHMpCiAgICAgICAgcmV0dXJuIHByZWZpeGxlbgoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9yZXBvcnRfaW52YWxpZF9uZXRtYXNrKGNscywgbmV0bWFza19zdHIpOgogICAgICAgIG1zZyA9ICclciBpcyBub3QgYSB2YWxpZCBuZXRtYXNrJyAlIG5ldG1hc2tfc3RyCiAgICAgICAgcmFpc2UgTmV0bWFza1ZhbHVlRXJyb3IobXNnKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9wcmVmaXhfZnJvbV9wcmVmaXhfc3RyaW5nKGNscywgcHJlZml4bGVuX3N0cik6CiAgICAgICAgIiIiUmV0dXJuIHByZWZpeCBsZW5ndGggZnJvbSBhIG51bWVyaWMgc3RyaW5nCgogICAgICAgIEFyZ3M6CiAgICAgICAgICAgIHByZWZpeGxlbl9zdHI6IFRoZSBzdHJpbmcgdG8gYmUgY29udmVydGVkCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEFuIGludGVnZXIsIHRoZSBwcmVmaXggbGVuZ3RoLgoKICAgICAgICBSYWlzZXM6CiAgICAgICAgICAgIE5ldG1hc2tWYWx1ZUVycm9yOiBJZiB0aGUgaW5wdXQgaXMgbm90IGEgdmFsaWQgbmV0bWFzawogICAgICAgICIiIgogICAgICAgICMgaW50IGFsbG93cyBhIGxlYWRpbmcgKy8tIGFzIHdlbGwgYXMgc3Vycm91bmRpbmcgd2hpdGVzcGFjZSwKICAgICAgICAjIHNvIHdlIGVuc3VyZSB0aGF0IGlzbid0IHRoZSBjYXNlCiAgICAgICAgaWYgbm90IF9CYXNlVjQuX0RFQ0lNQUxfRElHSVRTLmlzc3VwZXJzZXQocHJlZml4bGVuX3N0cik6CiAgICAgICAgICAgIGNscy5fcmVwb3J0X2ludmFsaWRfbmV0bWFzayhwcmVmaXhsZW5fc3RyKQogICAgICAgIHRyeToKICAgICAgICAgICAgcHJlZml4bGVuID0gaW50KHByZWZpeGxlbl9zdHIpCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIGNscy5fcmVwb3J0X2ludmFsaWRfbmV0bWFzayhwcmVmaXhsZW5fc3RyKQogICAgICAgIGlmIG5vdCAoMCA8PSBwcmVmaXhsZW4gPD0gY2xzLl9tYXhfcHJlZml4bGVuKToKICAgICAgICAgICAgY2xzLl9yZXBvcnRfaW52YWxpZF9uZXRtYXNrKHByZWZpeGxlbl9zdHIpCiAgICAgICAgcmV0dXJuIHByZWZpeGxlbgoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9wcmVmaXhfZnJvbV9pcF9zdHJpbmcoY2xzLCBpcF9zdHIpOgogICAgICAgICIiIlR1cm4gYSBuZXRtYXNrL2hvc3RtYXNrIHN0cmluZyBpbnRvIGEgcHJlZml4IGxlbmd0aAoKICAgICAgICBBcmdzOgogICAgICAgICAgICBpcF9zdHI6IFRoZSBuZXRtYXNrL2hvc3RtYXNrIHRvIGJlIGNvbnZlcnRlZAoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBbiBpbnRlZ2VyLCB0aGUgcHJlZml4IGxlbmd0aC4KCiAgICAgICAgUmFpc2VzOgogICAgICAgICAgICBOZXRtYXNrVmFsdWVFcnJvcjogSWYgdGhlIGlucHV0IGlzIG5vdCBhIHZhbGlkIG5ldG1hc2svaG9zdG1hc2sKICAgICAgICAiIiIKICAgICAgICAjIFBhcnNlIHRoZSBuZXRtYXNrL2hvc3RtYXNrIGxpa2UgYW4gSVAgYWRkcmVzcy4KICAgICAgICB0cnk6CiAgICAgICAgICAgIGlwX2ludCA9IGNscy5faXBfaW50X2Zyb21fc3RyaW5nKGlwX3N0cikKICAgICAgICBleGNlcHQgQWRkcmVzc1ZhbHVlRXJyb3I6CiAgICAgICAgICAgIGNscy5fcmVwb3J0X2ludmFsaWRfbmV0bWFzayhpcF9zdHIpCgogICAgICAgICMgVHJ5IG1hdGNoaW5nIGEgbmV0bWFzayAodGhpcyB3b3VsZCBiZSAvMSowKi8gYXMgYSBiaXR3aXNlIHJlZ2V4cCkuCiAgICAgICAgIyBOb3RlIHRoYXQgdGhlIHR3byBhbWJpZ3VvdXMgY2FzZXMgKGFsbC1vbmVzIGFuZCBhbGwtemVyb2VzKSBhcmUKICAgICAgICAjIHRyZWF0ZWQgYXMgbmV0bWFza3MuCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gY2xzLl9wcmVmaXhfZnJvbV9pcF9pbnQoaXBfaW50KQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICBwYXNzCgogICAgICAgICMgSW52ZXJ0IHRoZSBiaXRzLCBhbmQgdHJ5IG1hdGNoaW5nIGEgLzArMSsvIGhvc3RtYXNrIGluc3RlYWQuCiAgICAgICAgaXBfaW50IF49IGNscy5fQUxMX09ORVMKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBjbHMuX3ByZWZpeF9mcm9tX2lwX2ludChpcF9pbnQpCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIGNscy5fcmVwb3J0X2ludmFsaWRfbmV0bWFzayhpcF9zdHIpCgogICAgZGVmIF9fcmVkdWNlX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fLCAoX2NvbXBhdF9zdHIoc2VsZiksKQoKCmNsYXNzIF9CYXNlQWRkcmVzcyhfSVBBZGRyZXNzQmFzZSk6CgogICAgIiIiQSBnZW5lcmljIElQIG9iamVjdC4KCiAgICBUaGlzIElQIGNsYXNzIGNvbnRhaW5zIHRoZSB2ZXJzaW9uIGluZGVwZW5kZW50IG1ldGhvZHMgd2hpY2ggYXJlCiAgICB1c2VkIGJ5IHNpbmdsZSBJUCBhZGRyZXNzZXMuCiAgICAiIiIKCiAgICBfX3Nsb3RzX18gPSAoKQoKICAgIGRlZiBfX2ludF9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9pcAoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIChzZWxmLl9pcCA9PSBvdGhlci5faXAgYW5kCiAgICAgICAgICAgICAgICAgICAgc2VsZi5fdmVyc2lvbiA9PSBvdGhlci5fdmVyc2lvbikKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAoKICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBfSVBBZGRyZXNzQmFzZSk6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBfQmFzZUFkZHJlc3MpOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJyVzIGFuZCAlcyBhcmUgbm90IG9mIHRoZSBzYW1lIHR5cGUnICUgKAogICAgICAgICAgICAgICAgc2VsZiwgb3RoZXIpKQogICAgICAgIGlmIHNlbGYuX3ZlcnNpb24gIT0gb3RoZXIuX3ZlcnNpb246CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignJXMgYW5kICVzIGFyZSBub3Qgb2YgdGhlIHNhbWUgdmVyc2lvbicgJSAoCiAgICAgICAgICAgICAgICBzZWxmLCBvdGhlcikpCiAgICAgICAgaWYgc2VsZi5faXAgIT0gb3RoZXIuX2lwOgogICAgICAgICAgICByZXR1cm4gc2VsZi5faXAgPCBvdGhlci5faXAKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAjIFNob3J0aGFuZCBmb3IgSW50ZWdlciBhZGRpdGlvbiBhbmQgc3VidHJhY3Rpb24uIFRoaXMgaXMgbm90CiAgICAjIG1lYW50IHRvIGV2ZXIgc3VwcG9ydCBhZGRpdGlvbi9zdWJ0cmFjdGlvbiBvZiBhZGRyZXNzZXMuCiAgICBkZWYgX19hZGRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIF9jb21wYXRfaW50X3R5cGVzKToKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCiAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKGludChzZWxmKSArIG90aGVyKQoKICAgIGRlZiBfX3N1Yl9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgX2NvbXBhdF9pbnRfdHlwZXMpOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oaW50KHNlbGYpIC0gb3RoZXIpCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAnJXMoJXIpJyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgX2NvbXBhdF9zdHIoc2VsZikpCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIF9jb21wYXRfc3RyKHNlbGYuX3N0cmluZ19mcm9tX2lwX2ludChzZWxmLl9pcCkpCgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBoYXNoKGhleChpbnQoc2VsZi5faXApKSkKCiAgICBkZWYgX2dldF9hZGRyZXNzX2tleShzZWxmKToKICAgICAgICByZXR1cm4gKHNlbGYuX3ZlcnNpb24sIHNlbGYpCgogICAgZGVmIF9fcmVkdWNlX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fLCAoc2VsZi5faXAsKQoKCmNsYXNzIF9CYXNlTmV0d29yayhfSVBBZGRyZXNzQmFzZSk6CgogICAgIiIiQSBnZW5lcmljIElQIG5ldHdvcmsgb2JqZWN0LgoKICAgIFRoaXMgSVAgY2xhc3MgY29udGFpbnMgdGhlIHZlcnNpb24gaW5kZXBlbmRlbnQgbWV0aG9kcyB3aGljaCBhcmUKICAgIHVzZWQgYnkgbmV0d29ya3MuCgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgYWRkcmVzcyk6CiAgICAgICAgc2VsZi5fY2FjaGUgPSB7fQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gJyVzKCVyKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIF9jb21wYXRfc3RyKHNlbGYpKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiAnJXMvJWQnICUgKHNlbGYubmV0d29ya19hZGRyZXNzLCBzZWxmLnByZWZpeGxlbikKCiAgICBkZWYgaG9zdHMoc2VsZik6CiAgICAgICAgIiIiR2VuZXJhdGUgSXRlcmF0b3Igb3ZlciB1c2FibGUgaG9zdHMgaW4gYSBuZXR3b3JrLgoKICAgICAgICBUaGlzIGlzIGxpa2UgX19pdGVyX18gZXhjZXB0IGl0IGRvZXNuJ3QgcmV0dXJuIHRoZSBuZXR3b3JrCiAgICAgICAgb3IgYnJvYWRjYXN0IGFkZHJlc3Nlcy4KCiAgICAgICAgIiIiCiAgICAgICAgbmV0d29yayA9IGludChzZWxmLm5ldHdvcmtfYWRkcmVzcykKICAgICAgICBicm9hZGNhc3QgPSBpbnQoc2VsZi5icm9hZGNhc3RfYWRkcmVzcykKICAgICAgICBmb3IgeCBpbiBfY29tcGF0X3JhbmdlKG5ldHdvcmsgKyAxLCBicm9hZGNhc3QpOgogICAgICAgICAgICB5aWVsZCBzZWxmLl9hZGRyZXNzX2NsYXNzKHgpCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIG5ldHdvcmsgPSBpbnQoc2VsZi5uZXR3b3JrX2FkZHJlc3MpCiAgICAgICAgYnJvYWRjYXN0ID0gaW50KHNlbGYuYnJvYWRjYXN0X2FkZHJlc3MpCiAgICAgICAgZm9yIHggaW4gX2NvbXBhdF9yYW5nZShuZXR3b3JrLCBicm9hZGNhc3QgKyAxKToKICAgICAgICAgICAgeWllbGQgc2VsZi5fYWRkcmVzc19jbGFzcyh4KQoKICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBuKToKICAgICAgICBuZXR3b3JrID0gaW50KHNlbGYubmV0d29ya19hZGRyZXNzKQogICAgICAgIGJyb2FkY2FzdCA9IGludChzZWxmLmJyb2FkY2FzdF9hZGRyZXNzKQogICAgICAgIGlmIG4gPj0gMDoKICAgICAgICAgICAgaWYgbmV0d29yayArIG4gPiBicm9hZGNhc3Q6CiAgICAgICAgICAgICAgICByYWlzZSBJbmRleEVycm9yKCdhZGRyZXNzIG91dCBvZiByYW5nZScpCiAgICAgICAgICAgIHJldHVybiBzZWxmLl9hZGRyZXNzX2NsYXNzKG5ldHdvcmsgKyBuKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG4gKz0gMQogICAgICAgICAgICBpZiBicm9hZGNhc3QgKyBuIDwgbmV0d29yazoKICAgICAgICAgICAgICAgIHJhaXNlIEluZGV4RXJyb3IoJ2FkZHJlc3Mgb3V0IG9mIHJhbmdlJykKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2FkZHJlc3NfY2xhc3MoYnJvYWRjYXN0ICsgbikKCiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgX0lQQWRkcmVzc0Jhc2UpOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgX0Jhc2VOZXR3b3JrKToKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCclcyBhbmQgJXMgYXJlIG5vdCBvZiB0aGUgc2FtZSB0eXBlJyAlICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYsIG90aGVyKSkKICAgICAgICBpZiBzZWxmLl92ZXJzaW9uICE9IG90aGVyLl92ZXJzaW9uOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJyVzIGFuZCAlcyBhcmUgbm90IG9mIHRoZSBzYW1lIHZlcnNpb24nICUgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZiwgb3RoZXIpKQogICAgICAgIGlmIHNlbGYubmV0d29ya19hZGRyZXNzICE9IG90aGVyLm5ldHdvcmtfYWRkcmVzczoKICAgICAgICAgICAgcmV0dXJuIHNlbGYubmV0d29ya19hZGRyZXNzIDwgb3RoZXIubmV0d29ya19hZGRyZXNzCiAgICAgICAgaWYgc2VsZi5uZXRtYXNrICE9IG90aGVyLm5ldG1hc2s6CiAgICAgICAgICAgIHJldHVybiBzZWxmLm5ldG1hc2sgPCBvdGhlci5uZXRtYXNrCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gKHNlbGYuX3ZlcnNpb24gPT0gb3RoZXIuX3ZlcnNpb24gYW5kCiAgICAgICAgICAgICAgICAgICAgc2VsZi5uZXR3b3JrX2FkZHJlc3MgPT0gb3RoZXIubmV0d29ya19hZGRyZXNzIGFuZAogICAgICAgICAgICAgICAgICAgIGludChzZWxmLm5ldG1hc2spID09IGludChvdGhlci5uZXRtYXNrKSkKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAoKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gaGFzaChpbnQoc2VsZi5uZXR3b3JrX2FkZHJlc3MpIF4gaW50KHNlbGYubmV0bWFzaykpCgogICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgIyBhbHdheXMgZmFsc2UgaWYgb25lIGlzIHY0IGFuZCB0aGUgb3RoZXIgaXMgdjYuCiAgICAgICAgaWYgc2VsZi5fdmVyc2lvbiAhPSBvdGhlci5fdmVyc2lvbjoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgIyBkZWFsaW5nIHdpdGggYW5vdGhlciBuZXR3b3JrLgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIF9CYXNlTmV0d29yayk6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICMgZGVhbGluZyB3aXRoIGFub3RoZXIgYWRkcmVzcwogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgYWRkcmVzcwogICAgICAgICAgICByZXR1cm4gKGludChzZWxmLm5ldHdvcmtfYWRkcmVzcykgPD0gaW50KG90aGVyLl9pcCkgPD0KICAgICAgICAgICAgICAgICAgICBpbnQoc2VsZi5icm9hZGNhc3RfYWRkcmVzcykpCgogICAgZGVmIG92ZXJsYXBzKHNlbGYsIG90aGVyKToKICAgICAgICAiIiJUZWxsIGlmIHNlbGYgaXMgcGFydGx5IGNvbnRhaW5lZCBpbiBvdGhlci4iIiIKICAgICAgICByZXR1cm4gc2VsZi5uZXR3b3JrX2FkZHJlc3MgaW4gb3RoZXIgb3IgKAogICAgICAgICAgICBzZWxmLmJyb2FkY2FzdF9hZGRyZXNzIGluIG90aGVyIG9yICgKICAgICAgICAgICAgICAgIG90aGVyLm5ldHdvcmtfYWRkcmVzcyBpbiBzZWxmIG9yICgKICAgICAgICAgICAgICAgICAgICBvdGhlci5icm9hZGNhc3RfYWRkcmVzcyBpbiBzZWxmKSkpCgogICAgQHByb3BlcnR5CiAgICBkZWYgYnJvYWRjYXN0X2FkZHJlc3Moc2VsZik6CiAgICAgICAgeCA9IHNlbGYuX2NhY2hlLmdldCgnYnJvYWRjYXN0X2FkZHJlc3MnKQogICAgICAgIGlmIHggaXMgTm9uZToKICAgICAgICAgICAgeCA9IHNlbGYuX2FkZHJlc3NfY2xhc3MoaW50KHNlbGYubmV0d29ya19hZGRyZXNzKSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludChzZWxmLmhvc3RtYXNrKSkKICAgICAgICAgICAgc2VsZi5fY2FjaGVbJ2Jyb2FkY2FzdF9hZGRyZXNzJ10gPSB4CiAgICAgICAgcmV0dXJuIHgKCiAgICBAcHJvcGVydHkKICAgIGRlZiBob3N0bWFzayhzZWxmKToKICAgICAgICB4ID0gc2VsZi5fY2FjaGUuZ2V0KCdob3N0bWFzaycpCiAgICAgICAgaWYgeCBpcyBOb25lOgogICAgICAgICAgICB4ID0gc2VsZi5fYWRkcmVzc19jbGFzcyhpbnQoc2VsZi5uZXRtYXNrKSBeIHNlbGYuX0FMTF9PTkVTKQogICAgICAgICAgICBzZWxmLl9jYWNoZVsnaG9zdG1hc2snXSA9IHgKICAgICAgICByZXR1cm4geAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHdpdGhfcHJlZml4bGVuKHNlbGYpOgogICAgICAgIHJldHVybiAnJXMvJWQnICUgKHNlbGYubmV0d29ya19hZGRyZXNzLCBzZWxmLl9wcmVmaXhsZW4pCgogICAgQHByb3BlcnR5CiAgICBkZWYgd2l0aF9uZXRtYXNrKHNlbGYpOgogICAgICAgIHJldHVybiAnJXMvJXMnICUgKHNlbGYubmV0d29ya19hZGRyZXNzLCBzZWxmLm5ldG1hc2spCgogICAgQHByb3BlcnR5CiAgICBkZWYgd2l0aF9ob3N0bWFzayhzZWxmKToKICAgICAgICByZXR1cm4gJyVzLyVzJyAlIChzZWxmLm5ldHdvcmtfYWRkcmVzcywgc2VsZi5ob3N0bWFzaykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBudW1fYWRkcmVzc2VzKHNlbGYpOgogICAgICAgICIiIk51bWJlciBvZiBob3N0cyBpbiB0aGUgY3VycmVudCBzdWJuZXQuIiIiCiAgICAgICAgcmV0dXJuIGludChzZWxmLmJyb2FkY2FzdF9hZGRyZXNzKSAtIGludChzZWxmLm5ldHdvcmtfYWRkcmVzcykgKyAxCgogICAgQHByb3BlcnR5CiAgICBkZWYgX2FkZHJlc3NfY2xhc3Moc2VsZik6CiAgICAgICAgIyBSZXR1cm5pbmcgYmFyZSBhZGRyZXNzIG9iamVjdHMgKHJhdGhlciB0aGFuIGludGVyZmFjZXMpIGFsbG93cyBmb3IKICAgICAgICAjIG1vcmUgY29uc2lzdGVudCBiZWhhdmlvdXIgYWNyb3NzIHRoZSBuZXR3b3JrIGFkZHJlc3MsIGJyb2FkY2FzdAogICAgICAgICMgYWRkcmVzcyBhbmQgaW5kaXZpZHVhbCBob3N0IGFkZHJlc3Nlcy4KICAgICAgICBtc2cgPSAnJTIwMHMgaGFzIG5vIGFzc29jaWF0ZWQgYWRkcmVzcyBjbGFzcycgJSAodHlwZShzZWxmKSwpCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihtc2cpCgogICAgQHByb3BlcnR5CiAgICBkZWYgcHJlZml4bGVuKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9wcmVmaXhsZW4KCiAgICBkZWYgYWRkcmVzc19leGNsdWRlKHNlbGYsIG90aGVyKToKICAgICAgICAiIiJSZW1vdmUgYW4gYWRkcmVzcyBmcm9tIGEgbGFyZ2VyIGJsb2NrLgoKICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgIGFkZHIxID0gaXBfbmV0d29yaygnMTkyLjAuMi4wLzI4JykKICAgICAgICAgICAgYWRkcjIgPSBpcF9uZXR3b3JrKCcxOTIuMC4yLjEvMzInKQogICAgICAgICAgICBsaXN0KGFkZHIxLmFkZHJlc3NfZXhjbHVkZShhZGRyMikpID0KICAgICAgICAgICAgICAgIFtJUHY0TmV0d29yaygnMTkyLjAuMi4wLzMyJyksIElQdjROZXR3b3JrKCcxOTIuMC4yLjIvMzEnKSwKICAgICAgICAgICAgICAgICBJUHY0TmV0d29yaygnMTkyLjAuMi40LzMwJyksIElQdjROZXR3b3JrKCcxOTIuMC4yLjgvMjknKV0KCiAgICAgICAgb3IgSVB2NjoKCiAgICAgICAgICAgIGFkZHIxID0gaXBfbmV0d29yaygnMjAwMTpkYjg6OjEvMzInKQogICAgICAgICAgICBhZGRyMiA9IGlwX25ldHdvcmsoJzIwMDE6ZGI4OjoxLzEyOCcpCiAgICAgICAgICAgIGxpc3QoYWRkcjEuYWRkcmVzc19leGNsdWRlKGFkZHIyKSkgPQogICAgICAgICAgICAgICAgW2lwX25ldHdvcmsoJzIwMDE6ZGI4OjoxLzEyOCcpLAogICAgICAgICAgICAgICAgIGlwX25ldHdvcmsoJzIwMDE6ZGI4OjoyLzEyNycpLAogICAgICAgICAgICAgICAgIGlwX25ldHdvcmsoJzIwMDE6ZGI4Ojo0LzEyNicpLAogICAgICAgICAgICAgICAgIGlwX25ldHdvcmsoJzIwMDE6ZGI4Ojo4LzEyNScpLAogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIGlwX25ldHdvcmsoJzIwMDE6ZGI4OjgwMDA6Oi8zMycpXQoKICAgICAgICBBcmdzOgogICAgICAgICAgICBvdGhlcjogQW4gSVB2NE5ldHdvcmsgb3IgSVB2Nk5ldHdvcmsgb2JqZWN0IG9mIHRoZSBzYW1lIHR5cGUuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEFuIGl0ZXJhdG9yIG9mIHRoZSBJUHYoNHw2KU5ldHdvcmsgb2JqZWN0cyB3aGljaCBpcyBzZWxmCiAgICAgICAgICAgIG1pbnVzIG90aGVyLgoKICAgICAgICBSYWlzZXM6CiAgICAgICAgICAgIFR5cGVFcnJvcjogSWYgc2VsZiBhbmQgb3RoZXIgYXJlIG9mIGRpZmZlcmluZyBhZGRyZXNzCiAgICAgICAgICAgICAgdmVyc2lvbnMsIG9yIGlmIG90aGVyIGlzIG5vdCBhIG5ldHdvcmsgb2JqZWN0LgogICAgICAgICAgICBWYWx1ZUVycm9yOiBJZiBvdGhlciBpcyBub3QgY29tcGxldGVseSBjb250YWluZWQgYnkgc2VsZi4KCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IHNlbGYuX3ZlcnNpb24gPT0gb3RoZXIuX3ZlcnNpb246CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiJXMgYW5kICVzIGFyZSBub3Qgb2YgdGhlIHNhbWUgdmVyc2lvbiIgJSAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLCBvdGhlcikpCgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBfQmFzZU5ldHdvcmspOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIiVzIGlzIG5vdCBhIG5ldHdvcmsgb2JqZWN0IiAlIG90aGVyKQoKICAgICAgICBpZiBub3Qgb3RoZXIuc3VibmV0X29mKHNlbGYpOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCclcyBub3QgY29udGFpbmVkIGluICVzJyAlIChvdGhlciwgc2VsZikpCiAgICAgICAgaWYgb3RoZXIgPT0gc2VsZjoKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICMgTWFrZSBzdXJlIHdlJ3JlIGNvbXBhcmluZyB0aGUgbmV0d29yayBvZiBvdGhlci4KICAgICAgICBvdGhlciA9IG90aGVyLl9fY2xhc3NfXygnJXMvJXMnICUgKG90aGVyLm5ldHdvcmtfYWRkcmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyLnByZWZpeGxlbikpCgogICAgICAgIHMxLCBzMiA9IHNlbGYuc3VibmV0cygpCiAgICAgICAgd2hpbGUgczEgIT0gb3RoZXIgYW5kIHMyICE9IG90aGVyOgogICAgICAgICAgICBpZiBvdGhlci5zdWJuZXRfb2YoczEpOgogICAgICAgICAgICAgICAgeWllbGQgczIKICAgICAgICAgICAgICAgIHMxLCBzMiA9IHMxLnN1Ym5ldHMoKQogICAgICAgICAgICBlbGlmIG90aGVyLnN1Ym5ldF9vZihzMik6CiAgICAgICAgICAgICAgICB5aWVsZCBzMQogICAgICAgICAgICAgICAgczEsIHMyID0gczIuc3VibmV0cygpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIElmIHdlIGdvdCBoZXJlLCB0aGVyZSdzIGEgYnVnIHNvbWV3aGVyZS4KICAgICAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCdFcnJvciBwZXJmb3JtaW5nIGV4Y2x1c2lvbjogJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3MxOiAlcyBzMjogJXMgb3RoZXI6ICVzJyAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoczEsIHMyLCBvdGhlcikpCiAgICAgICAgaWYgczEgPT0gb3RoZXI6CiAgICAgICAgICAgIHlpZWxkIHMyCiAgICAgICAgZWxpZiBzMiA9PSBvdGhlcjoKICAgICAgICAgICAgeWllbGQgczEKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIElmIHdlIGdvdCBoZXJlLCB0aGVyZSdzIGEgYnVnIHNvbWV3aGVyZS4KICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoJ0Vycm9yIHBlcmZvcm1pbmcgZXhjbHVzaW9uOiAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzMTogJXMgczI6ICVzIG90aGVyOiAlcycgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoczEsIHMyLCBvdGhlcikpCgogICAgZGVmIGNvbXBhcmVfbmV0d29ya3Moc2VsZiwgb3RoZXIpOgogICAgICAgICIiIkNvbXBhcmUgdHdvIElQIG9iamVjdHMuCgogICAgICAgIFRoaXMgaXMgb25seSBjb25jZXJuZWQgYWJvdXQgdGhlIGNvbXBhcmlzb24gb2YgdGhlIGludGVnZXIKICAgICAgICByZXByZXNlbnRhdGlvbiBvZiB0aGUgbmV0d29yayBhZGRyZXNzZXMuICBUaGlzIG1lYW5zIHRoYXQgdGhlCiAgICAgICAgaG9zdCBiaXRzIGFyZW4ndCBjb25zaWRlcmVkIGF0IGFsbCBpbiB0aGlzIG1ldGhvZC4gIElmIHlvdSB3YW50CiAgICAgICAgdG8gY29tcGFyZSBob3N0IGJpdHMsIHlvdSBjYW4gZWFzaWx5IGVub3VnaCBkbyBhCiAgICAgICAgJ0hvc3RBLl9pcCA8IEhvc3RCLl9pcCcKCiAgICAgICAgQXJnczoKICAgICAgICAgICAgb3RoZXI6IEFuIElQIG9iamVjdC4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgSWYgdGhlIElQIHZlcnNpb25zIG9mIHNlbGYgYW5kIG90aGVyIGFyZSB0aGUgc2FtZSwgcmV0dXJuczoKCiAgICAgICAgICAgIC0xIGlmIHNlbGYgPCBvdGhlcjoKICAgICAgICAgICAgICBlZzogSVB2NE5ldHdvcmsoJzE5Mi4wLjIuMC8yNScpIDwgSVB2NE5ldHdvcmsoJzE5Mi4wLjIuMTI4LzI1JykKICAgICAgICAgICAgICBJUHY2TmV0d29yaygnMjAwMTpkYjg6OjEwMDAvMTI0JykgPAogICAgICAgICAgICAgICAgICBJUHY2TmV0d29yaygnMjAwMTpkYjg6OjIwMDAvMTI0JykKICAgICAgICAgICAgMCBpZiBzZWxmID09IG90aGVyCiAgICAgICAgICAgICAgZWc6IElQdjROZXR3b3JrKCcxOTIuMC4yLjAvMjQnKSA9PSBJUHY0TmV0d29yaygnMTkyLjAuMi4wLzI0JykKICAgICAgICAgICAgICBJUHY2TmV0d29yaygnMjAwMTpkYjg6OjEwMDAvMTI0JykgPT0KICAgICAgICAgICAgICAgICAgSVB2Nk5ldHdvcmsoJzIwMDE6ZGI4OjoxMDAwLzEyNCcpCiAgICAgICAgICAgIDEgaWYgc2VsZiA+IG90aGVyCiAgICAgICAgICAgICAgZWc6IElQdjROZXR3b3JrKCcxOTIuMC4yLjEyOC8yNScpID4gSVB2NE5ldHdvcmsoJzE5Mi4wLjIuMC8yNScpCiAgICAgICAgICAgICAgICAgIElQdjZOZXR3b3JrKCcyMDAxOmRiODo6MjAwMC8xMjQnKSA+CiAgICAgICAgICAgICAgICAgICAgICBJUHY2TmV0d29yaygnMjAwMTpkYjg6OjEwMDAvMTI0JykKCiAgICAgICAgICBSYWlzZXM6CiAgICAgICAgICAgICAgVHlwZUVycm9yIGlmIHRoZSBJUCB2ZXJzaW9ucyBhcmUgZGlmZmVyZW50LgoKICAgICAgICAiIiIKICAgICAgICAjIGRvZXMgdGhpcyBuZWVkIHRvIHJhaXNlIGEgVmFsdWVFcnJvcj8KICAgICAgICBpZiBzZWxmLl92ZXJzaW9uICE9IG90aGVyLl92ZXJzaW9uOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJyVzIGFuZCAlcyBhcmUgbm90IG9mIHRoZSBzYW1lIHR5cGUnICUgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZiwgb3RoZXIpKQogICAgICAgICMgc2VsZi5fdmVyc2lvbiA9PSBvdGhlci5fdmVyc2lvbiBiZWxvdyBoZXJlOgogICAgICAgIGlmIHNlbGYubmV0d29ya19hZGRyZXNzIDwgb3RoZXIubmV0d29ya19hZGRyZXNzOgogICAgICAgICAgICByZXR1cm4gLTEKICAgICAgICBpZiBzZWxmLm5ldHdvcmtfYWRkcmVzcyA+IG90aGVyLm5ldHdvcmtfYWRkcmVzczoKICAgICAgICAgICAgcmV0dXJuIDEKICAgICAgICAjIHNlbGYubmV0d29ya19hZGRyZXNzID09IG90aGVyLm5ldHdvcmtfYWRkcmVzcyBiZWxvdyBoZXJlOgogICAgICAgIGlmIHNlbGYubmV0bWFzayA8IG90aGVyLm5ldG1hc2s6CiAgICAgICAgICAgIHJldHVybiAtMQogICAgICAgIGlmIHNlbGYubmV0bWFzayA+IG90aGVyLm5ldG1hc2s6CiAgICAgICAgICAgIHJldHVybiAxCiAgICAgICAgcmV0dXJuIDAKCiAgICBkZWYgX2dldF9uZXR3b3Jrc19rZXkoc2VsZik6CiAgICAgICAgIiIiTmV0d29yay1vbmx5IGtleSBmdW5jdGlvbi4KCiAgICAgICAgUmV0dXJucyBhbiBvYmplY3QgdGhhdCBpZGVudGlmaWVzIHRoaXMgYWRkcmVzcycgbmV0d29yayBhbmQKICAgICAgICBuZXRtYXNrLiBUaGlzIGZ1bmN0aW9uIGlzIGEgc3VpdGFibGUgImtleSIgYXJndW1lbnQgZm9yIHNvcnRlZCgpCiAgICAgICAgYW5kIGxpc3Quc29ydCgpLgoKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gKHNlbGYuX3ZlcnNpb24sIHNlbGYubmV0d29ya19hZGRyZXNzLCBzZWxmLm5ldG1hc2spCgogICAgZGVmIHN1Ym5ldHMoc2VsZiwgcHJlZml4bGVuX2RpZmY9MSwgbmV3X3ByZWZpeD1Ob25lKToKICAgICAgICAiIiJUaGUgc3VibmV0cyB3aGljaCBqb2luIHRvIG1ha2UgdGhlIGN1cnJlbnQgc3VibmV0LgoKICAgICAgICBJbiB0aGUgY2FzZSB0aGF0IHNlbGYgY29udGFpbnMgb25seSBvbmUgSVAKICAgICAgICAoc2VsZi5fcHJlZml4bGVuID09IDMyIGZvciBJUHY0IG9yIHNlbGYuX3ByZWZpeGxlbiA9PSAxMjgKICAgICAgICBmb3IgSVB2NiksIHlpZWxkIGFuIGl0ZXJhdG9yIHdpdGgganVzdCBvdXJzZWxmLgoKICAgICAgICBBcmdzOgogICAgICAgICAgICBwcmVmaXhsZW5fZGlmZjogQW4gaW50ZWdlciwgdGhlIGFtb3VudCB0aGUgcHJlZml4IGxlbmd0aAogICAgICAgICAgICAgIHNob3VsZCBiZSBpbmNyZWFzZWQgYnkuIFRoaXMgc2hvdWxkIG5vdCBiZSBzZXQgaWYKICAgICAgICAgICAgICBuZXdfcHJlZml4IGlzIGFsc28gc2V0LgogICAgICAgICAgICBuZXdfcHJlZml4OiBUaGUgZGVzaXJlZCBuZXcgcHJlZml4IGxlbmd0aC4gVGhpcyBtdXN0IGJlIGEKICAgICAgICAgICAgICBsYXJnZXIgbnVtYmVyIChzbWFsbGVyIHByZWZpeCkgdGhhbiB0aGUgZXhpc3RpbmcgcHJlZml4LgogICAgICAgICAgICAgIFRoaXMgc2hvdWxkIG5vdCBiZSBzZXQgaWYgcHJlZml4bGVuX2RpZmYgaXMgYWxzbyBzZXQuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEFuIGl0ZXJhdG9yIG9mIElQdig0fDYpIG9iamVjdHMuCgogICAgICAgIFJhaXNlczoKICAgICAgICAgICAgVmFsdWVFcnJvcjogVGhlIHByZWZpeGxlbl9kaWZmIGlzIHRvbyBzbWFsbCBvciB0b28gbGFyZ2UuCiAgICAgICAgICAgICAgICBPUgogICAgICAgICAgICBwcmVmaXhsZW5fZGlmZiBhbmQgbmV3X3ByZWZpeCBhcmUgYm90aCBzZXQgb3IgbmV3X3ByZWZpeAogICAgICAgICAgICAgIGlzIGEgc21hbGxlciBudW1iZXIgdGhhbiB0aGUgY3VycmVudCBwcmVmaXggKHNtYWxsZXIKICAgICAgICAgICAgICBudW1iZXIgbWVhbnMgYSBsYXJnZXIgbmV0d29yaykKCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5fcHJlZml4bGVuID09IHNlbGYuX21heF9wcmVmaXhsZW46CiAgICAgICAgICAgIHlpZWxkIHNlbGYKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGlmIG5ld19wcmVmaXggaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGlmIG5ld19wcmVmaXggPCBzZWxmLl9wcmVmaXhsZW46CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCduZXcgcHJlZml4IG11c3QgYmUgbG9uZ2VyJykKICAgICAgICAgICAgaWYgcHJlZml4bGVuX2RpZmYgIT0gMToKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2Nhbm5vdCBzZXQgcHJlZml4bGVuX2RpZmYgYW5kIG5ld19wcmVmaXgnKQogICAgICAgICAgICBwcmVmaXhsZW5fZGlmZiA9IG5ld19wcmVmaXggLSBzZWxmLl9wcmVmaXhsZW4KCiAgICAgICAgaWYgcHJlZml4bGVuX2RpZmYgPCAwOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdwcmVmaXggbGVuZ3RoIGRpZmYgbXVzdCBiZSA+IDAnKQogICAgICAgIG5ld19wcmVmaXhsZW4gPSBzZWxmLl9wcmVmaXhsZW4gKyBwcmVmaXhsZW5fZGlmZgoKICAgICAgICBpZiBuZXdfcHJlZml4bGVuID4gc2VsZi5fbWF4X3ByZWZpeGxlbjoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAgICAgICAgICdwcmVmaXggbGVuZ3RoIGRpZmYgJWQgaXMgaW52YWxpZCBmb3IgbmV0YmxvY2sgJXMnICUgKAogICAgICAgICAgICAgICAgICAgIG5ld19wcmVmaXhsZW4sIHNlbGYpKQoKICAgICAgICBzdGFydCA9IGludChzZWxmLm5ldHdvcmtfYWRkcmVzcykKICAgICAgICBlbmQgPSBpbnQoc2VsZi5icm9hZGNhc3RfYWRkcmVzcykgKyAxCiAgICAgICAgc3RlcCA9IChpbnQoc2VsZi5ob3N0bWFzaykgKyAxKSA+PiBwcmVmaXhsZW5fZGlmZgogICAgICAgIGZvciBuZXdfYWRkciBpbiBfY29tcGF0X3JhbmdlKHN0YXJ0LCBlbmQsIHN0ZXApOgogICAgICAgICAgICBjdXJyZW50ID0gc2VsZi5fX2NsYXNzX18oKG5ld19hZGRyLCBuZXdfcHJlZml4bGVuKSkKICAgICAgICAgICAgeWllbGQgY3VycmVudAoKICAgIGRlZiBzdXBlcm5ldChzZWxmLCBwcmVmaXhsZW5fZGlmZj0xLCBuZXdfcHJlZml4PU5vbmUpOgogICAgICAgICIiIlRoZSBzdXBlcm5ldCBjb250YWluaW5nIHRoZSBjdXJyZW50IG5ldHdvcmsuCgogICAgICAgIEFyZ3M6CiAgICAgICAgICAgIHByZWZpeGxlbl9kaWZmOiBBbiBpbnRlZ2VyLCB0aGUgYW1vdW50IHRoZSBwcmVmaXggbGVuZ3RoIG9mCiAgICAgICAgICAgICAgdGhlIG5ldHdvcmsgc2hvdWxkIGJlIGRlY3JlYXNlZCBieS4gIEZvciBleGFtcGxlLCBnaXZlbiBhCiAgICAgICAgICAgICAgLzI0IG5ldHdvcmsgYW5kIGEgcHJlZml4bGVuX2RpZmYgb2YgMywgYSBzdXBlcm5ldCB3aXRoIGEKICAgICAgICAgICAgICAvMjEgbmV0bWFzayBpcyByZXR1cm5lZC4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQW4gSVB2NCBuZXR3b3JrIG9iamVjdC4KCiAgICAgICAgUmFpc2VzOgogICAgICAgICAgICBWYWx1ZUVycm9yOiBJZiBzZWxmLnByZWZpeGxlbiAtIHByZWZpeGxlbl9kaWZmIDwgMC4gSS5lLiwgeW91IGhhdmUKICAgICAgICAgICAgICBhIG5lZ2F0aXZlIHByZWZpeCBsZW5ndGguCiAgICAgICAgICAgICAgICBPUgogICAgICAgICAgICBJZiBwcmVmaXhsZW5fZGlmZiBhbmQgbmV3X3ByZWZpeCBhcmUgYm90aCBzZXQgb3IgbmV3X3ByZWZpeCBpcyBhCiAgICAgICAgICAgICAgbGFyZ2VyIG51bWJlciB0aGFuIHRoZSBjdXJyZW50IHByZWZpeCAobGFyZ2VyIG51bWJlciBtZWFucyBhCiAgICAgICAgICAgICAgc21hbGxlciBuZXR3b3JrKQoKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLl9wcmVmaXhsZW4gPT0gMDoKICAgICAgICAgICAgcmV0dXJuIHNlbGYKCiAgICAgICAgaWYgbmV3X3ByZWZpeCBpcyBub3QgTm9uZToKICAgICAgICAgICAgaWYgbmV3X3ByZWZpeCA+IHNlbGYuX3ByZWZpeGxlbjoKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ25ldyBwcmVmaXggbXVzdCBiZSBzaG9ydGVyJykKICAgICAgICAgICAgaWYgcHJlZml4bGVuX2RpZmYgIT0gMToKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2Nhbm5vdCBzZXQgcHJlZml4bGVuX2RpZmYgYW5kIG5ld19wcmVmaXgnKQogICAgICAgICAgICBwcmVmaXhsZW5fZGlmZiA9IHNlbGYuX3ByZWZpeGxlbiAtIG5ld19wcmVmaXgKCiAgICAgICAgbmV3X3ByZWZpeGxlbiA9IHNlbGYucHJlZml4bGVuIC0gcHJlZml4bGVuX2RpZmYKICAgICAgICBpZiBuZXdfcHJlZml4bGVuIDwgMDoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAgICAgICAgICdjdXJyZW50IHByZWZpeGxlbiBpcyAlZCwgY2Fubm90IGhhdmUgYSBwcmVmaXhsZW5fZGlmZiBvZiAlZCcgJQogICAgICAgICAgICAgICAgKHNlbGYucHJlZml4bGVuLCBwcmVmaXhsZW5fZGlmZikpCiAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKCgKICAgICAgICAgICAgaW50KHNlbGYubmV0d29ya19hZGRyZXNzKSAmIChpbnQoc2VsZi5uZXRtYXNrKSA8PCBwcmVmaXhsZW5fZGlmZiksCiAgICAgICAgICAgIG5ld19wcmVmaXhsZW4KICAgICAgICApKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX211bHRpY2FzdChzZWxmKToKICAgICAgICAiIiJUZXN0IGlmIHRoZSBhZGRyZXNzIGlzIHJlc2VydmVkIGZvciBtdWx0aWNhc3QgdXNlLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBIGJvb2xlYW4sIFRydWUgaWYgdGhlIGFkZHJlc3MgaXMgYSBtdWx0aWNhc3QgYWRkcmVzcy4KICAgICAgICAgICAgU2VlIFJGQyAyMzczIDIuNyBmb3IgZGV0YWlscy4KCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIChzZWxmLm5ldHdvcmtfYWRkcmVzcy5pc19tdWx0aWNhc3QgYW5kCiAgICAgICAgICAgICAgICBzZWxmLmJyb2FkY2FzdF9hZGRyZXNzLmlzX211bHRpY2FzdCkKCiAgICBkZWYgc3VibmV0X29mKHNlbGYsIG90aGVyKToKICAgICAgICAjIGFsd2F5cyBmYWxzZSBpZiBvbmUgaXMgdjQgYW5kIHRoZSBvdGhlciBpcyB2Ni4KICAgICAgICBpZiBzZWxmLl92ZXJzaW9uICE9IG90aGVyLl92ZXJzaW9uOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAjIGRlYWxpbmcgd2l0aCBhbm90aGVyIG5ldHdvcmsuCiAgICAgICAgaWYgKGhhc2F0dHIob3RoZXIsICduZXR3b3JrX2FkZHJlc3MnKSBhbmQKICAgICAgICAgICAgICAgIGhhc2F0dHIob3RoZXIsICdicm9hZGNhc3RfYWRkcmVzcycpKToKICAgICAgICAgICAgcmV0dXJuIChvdGhlci5uZXR3b3JrX2FkZHJlc3MgPD0gc2VsZi5uZXR3b3JrX2FkZHJlc3MgYW5kCiAgICAgICAgICAgICAgICAgICAgb3RoZXIuYnJvYWRjYXN0X2FkZHJlc3MgPj0gc2VsZi5icm9hZGNhc3RfYWRkcmVzcykKICAgICAgICAjIGRlYWxpbmcgd2l0aCBhbm90aGVyIGFkZHJlc3MKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ1VuYWJsZSB0byB0ZXN0IHN1Ym5ldCBjb250YWlubWVudCB3aXRoIGVsZW1lbnQgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29mIHR5cGUgJXMnICUgdHlwZShvdGhlcikpCgogICAgZGVmIHN1cGVybmV0X29mKHNlbGYsIG90aGVyKToKICAgICAgICAjIGFsd2F5cyBmYWxzZSBpZiBvbmUgaXMgdjQgYW5kIHRoZSBvdGhlciBpcyB2Ni4KICAgICAgICBpZiBzZWxmLl92ZXJzaW9uICE9IG90aGVyLl92ZXJzaW9uOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAjIGRlYWxpbmcgd2l0aCBhbm90aGVyIG5ldHdvcmsuCiAgICAgICAgaWYgKGhhc2F0dHIob3RoZXIsICduZXR3b3JrX2FkZHJlc3MnKSBhbmQKICAgICAgICAgICAgICAgIGhhc2F0dHIob3RoZXIsICdicm9hZGNhc3RfYWRkcmVzcycpKToKICAgICAgICAgICAgcmV0dXJuIChvdGhlci5uZXR3b3JrX2FkZHJlc3MgPj0gc2VsZi5uZXR3b3JrX2FkZHJlc3MgYW5kCiAgICAgICAgICAgICAgICAgICAgb3RoZXIuYnJvYWRjYXN0X2FkZHJlc3MgPD0gc2VsZi5icm9hZGNhc3RfYWRkcmVzcykKICAgICAgICAjIGRlYWxpbmcgd2l0aCBhbm90aGVyIGFkZHJlc3MKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ1VuYWJsZSB0byB0ZXN0IHN1Ym5ldCBjb250YWlubWVudCB3aXRoIGVsZW1lbnQgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29mIHR5cGUgJXMnICUgdHlwZShvdGhlcikpCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfcmVzZXJ2ZWQoc2VsZik6CiAgICAgICAgIiIiVGVzdCBpZiB0aGUgYWRkcmVzcyBpcyBvdGhlcndpc2UgSUVURiByZXNlcnZlZC4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBib29sZWFuLCBUcnVlIGlmIHRoZSBhZGRyZXNzIGlzIHdpdGhpbiBvbmUgb2YgdGhlCiAgICAgICAgICAgIHJlc2VydmVkIElQdjYgTmV0d29yayByYW5nZXMuCgogICAgICAgICIiIgogICAgICAgIHJldHVybiAoc2VsZi5uZXR3b3JrX2FkZHJlc3MuaXNfcmVzZXJ2ZWQgYW5kCiAgICAgICAgICAgICAgICBzZWxmLmJyb2FkY2FzdF9hZGRyZXNzLmlzX3Jlc2VydmVkKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX2xpbmtfbG9jYWwoc2VsZik6CiAgICAgICAgIiIiVGVzdCBpZiB0aGUgYWRkcmVzcyBpcyByZXNlcnZlZCBmb3IgbGluay1sb2NhbC4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBib29sZWFuLCBUcnVlIGlmIHRoZSBhZGRyZXNzIGlzIHJlc2VydmVkIHBlciBSRkMgNDI5MS4KCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIChzZWxmLm5ldHdvcmtfYWRkcmVzcy5pc19saW5rX2xvY2FsIGFuZAogICAgICAgICAgICAgICAgc2VsZi5icm9hZGNhc3RfYWRkcmVzcy5pc19saW5rX2xvY2FsKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX3ByaXZhdGUoc2VsZik6CiAgICAgICAgIiIiVGVzdCBpZiB0aGlzIGFkZHJlc3MgaXMgYWxsb2NhdGVkIGZvciBwcml2YXRlIG5ldHdvcmtzLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBIGJvb2xlYW4sIFRydWUgaWYgdGhlIGFkZHJlc3MgaXMgcmVzZXJ2ZWQgcGVyCiAgICAgICAgICAgIGlhbmEtaXB2NC1zcGVjaWFsLXJlZ2lzdHJ5IG9yIGlhbmEtaXB2Ni1zcGVjaWFsLXJlZ2lzdHJ5LgoKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gKHNlbGYubmV0d29ya19hZGRyZXNzLmlzX3ByaXZhdGUgYW5kCiAgICAgICAgICAgICAgICBzZWxmLmJyb2FkY2FzdF9hZGRyZXNzLmlzX3ByaXZhdGUpCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfZ2xvYmFsKHNlbGYpOgogICAgICAgICIiIlRlc3QgaWYgdGhpcyBhZGRyZXNzIGlzIGFsbG9jYXRlZCBmb3IgcHVibGljIG5ldHdvcmtzLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBIGJvb2xlYW4sIFRydWUgaWYgdGhlIGFkZHJlc3MgaXMgbm90IHJlc2VydmVkIHBlcgogICAgICAgICAgICBpYW5hLWlwdjQtc3BlY2lhbC1yZWdpc3RyeSBvciBpYW5hLWlwdjYtc3BlY2lhbC1yZWdpc3RyeS4KCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIG5vdCBzZWxmLmlzX3ByaXZhdGUKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc191bnNwZWNpZmllZChzZWxmKToKICAgICAgICAiIiJUZXN0IGlmIHRoZSBhZGRyZXNzIGlzIHVuc3BlY2lmaWVkLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBIGJvb2xlYW4sIFRydWUgaWYgdGhpcyBpcyB0aGUgdW5zcGVjaWZpZWQgYWRkcmVzcyBhcyBkZWZpbmVkIGluCiAgICAgICAgICAgIFJGQyAyMzczIDIuNS4yLgoKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gKHNlbGYubmV0d29ya19hZGRyZXNzLmlzX3Vuc3BlY2lmaWVkIGFuZAogICAgICAgICAgICAgICAgc2VsZi5icm9hZGNhc3RfYWRkcmVzcy5pc191bnNwZWNpZmllZCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19sb29wYmFjayhzZWxmKToKICAgICAgICAiIiJUZXN0IGlmIHRoZSBhZGRyZXNzIGlzIGEgbG9vcGJhY2sgYWRkcmVzcy4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBib29sZWFuLCBUcnVlIGlmIHRoZSBhZGRyZXNzIGlzIGEgbG9vcGJhY2sgYWRkcmVzcyBhcyBkZWZpbmVkIGluCiAgICAgICAgICAgIFJGQyAyMzczIDIuNS4zLgoKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gKHNlbGYubmV0d29ya19hZGRyZXNzLmlzX2xvb3BiYWNrIGFuZAogICAgICAgICAgICAgICAgc2VsZi5icm9hZGNhc3RfYWRkcmVzcy5pc19sb29wYmFjaykKCgpjbGFzcyBfQmFzZVY0KG9iamVjdCk6CgogICAgIiIiQmFzZSBJUHY0IG9iamVjdC4KCiAgICBUaGUgZm9sbG93aW5nIG1ldGhvZHMgYXJlIHVzZWQgYnkgSVB2NCBvYmplY3RzIGluIGJvdGggc2luZ2xlIElQCiAgICBhZGRyZXNzZXMgYW5kIG5ldHdvcmtzLgoKICAgICIiIgoKICAgIF9fc2xvdHNfXyA9ICgpCiAgICBfdmVyc2lvbiA9IDQKICAgICMgRXF1aXZhbGVudCB0byAyNTUuMjU1LjI1NS4yNTUgb3IgMzIgYml0cyBvZiAxJ3MuCiAgICBfQUxMX09ORVMgPSAoMiAqKiBJUFY0TEVOR1RIKSAtIDEKICAgIF9ERUNJTUFMX0RJR0lUUyA9IGZyb3plbnNldCgnMDEyMzQ1Njc4OScpCgogICAgIyB0aGUgdmFsaWQgb2N0ZXRzIGZvciBob3N0IGFuZCBuZXRtYXNrcy4gb25seSB1c2VmdWwgZm9yIElQdjQuCiAgICBfdmFsaWRfbWFza19vY3RldHMgPSBmcm96ZW5zZXQoWzI1NSwgMjU0LCAyNTIsIDI0OCwgMjQwLCAyMjQsIDE5MiwgMTI4LCAwXSkKCiAgICBfbWF4X3ByZWZpeGxlbiA9IElQVjRMRU5HVEgKICAgICMgVGhlcmUgYXJlIG9ubHkgYSBoYW5kZnVsIG9mIHZhbGlkIHY0IG5ldG1hc2tzLCBzbyB3ZSBjYWNoZSB0aGVtIGFsbAogICAgIyB3aGVuIGNvbnN0cnVjdGVkIChzZWUgX21ha2VfbmV0bWFzaygpKS4KICAgIF9uZXRtYXNrX2NhY2hlID0ge30KCiAgICBkZWYgX2V4cGxvZGVfc2hvcnRoYW5kX2lwX3N0cmluZyhzZWxmKToKICAgICAgICByZXR1cm4gX2NvbXBhdF9zdHIoc2VsZikKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfbWFrZV9uZXRtYXNrKGNscywgYXJnKToKICAgICAgICAiIiJNYWtlIGEgKG5ldG1hc2ssIHByZWZpeF9sZW4pIHR1cGxlIGZyb20gdGhlIGdpdmVuIGFyZ3VtZW50LgoKICAgICAgICBBcmd1bWVudCBjYW4gYmU6CiAgICAgICAgLSBhbiBpbnRlZ2VyICh0aGUgcHJlZml4IGxlbmd0aCkKICAgICAgICAtIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcHJlZml4IGxlbmd0aCAoZS5nLiAiMjQiKQogICAgICAgIC0gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwcmVmaXggbmV0bWFzayAoZS5nLiAiMjU1LjI1NS4yNTUuMCIpCiAgICAgICAgIiIiCiAgICAgICAgaWYgYXJnIG5vdCBpbiBjbHMuX25ldG1hc2tfY2FjaGU6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYXJnLCBfY29tcGF0X2ludF90eXBlcyk6CiAgICAgICAgICAgICAgICBwcmVmaXhsZW4gPSBhcmcKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAjIENoZWNrIGZvciBhIG5ldG1hc2sgaW4gcHJlZml4IGxlbmd0aCBmb3JtCiAgICAgICAgICAgICAgICAgICAgcHJlZml4bGVuID0gY2xzLl9wcmVmaXhfZnJvbV9wcmVmaXhfc3RyaW5nKGFyZykKICAgICAgICAgICAgICAgIGV4Y2VwdCBOZXRtYXNrVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgICAgICAjIENoZWNrIGZvciBhIG5ldG1hc2sgb3IgaG9zdG1hc2sgaW4gZG90dGVkLXF1YWQgZm9ybS4KICAgICAgICAgICAgICAgICAgICAjIFRoaXMgbWF5IHJhaXNlIE5ldG1hc2tWYWx1ZUVycm9yLgogICAgICAgICAgICAgICAgICAgIHByZWZpeGxlbiA9IGNscy5fcHJlZml4X2Zyb21faXBfc3RyaW5nKGFyZykKICAgICAgICAgICAgbmV0bWFzayA9IElQdjRBZGRyZXNzKGNscy5faXBfaW50X2Zyb21fcHJlZml4KHByZWZpeGxlbikpCiAgICAgICAgICAgIGNscy5fbmV0bWFza19jYWNoZVthcmddID0gbmV0bWFzaywgcHJlZml4bGVuCiAgICAgICAgcmV0dXJuIGNscy5fbmV0bWFza19jYWNoZVthcmddCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX2lwX2ludF9mcm9tX3N0cmluZyhjbHMsIGlwX3N0cik6CiAgICAgICAgIiIiVHVybiB0aGUgZ2l2ZW4gSVAgc3RyaW5nIGludG8gYW4gaW50ZWdlciBmb3IgY29tcGFyaXNvbi4KCiAgICAgICAgQXJnczoKICAgICAgICAgICAgaXBfc3RyOiBBIHN0cmluZywgdGhlIElQIGlwX3N0ci4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgVGhlIElQIGlwX3N0ciBhcyBhbiBpbnRlZ2VyLgoKICAgICAgICBSYWlzZXM6CiAgICAgICAgICAgIEFkZHJlc3NWYWx1ZUVycm9yOiBpZiBpcF9zdHIgaXNuJ3QgYSB2YWxpZCBJUHY0IEFkZHJlc3MuCgogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBpcF9zdHI6CiAgICAgICAgICAgIHJhaXNlIEFkZHJlc3NWYWx1ZUVycm9yKCdBZGRyZXNzIGNhbm5vdCBiZSBlbXB0eScpCgogICAgICAgIG9jdGV0cyA9IGlwX3N0ci5zcGxpdCgnLicpCiAgICAgICAgaWYgbGVuKG9jdGV0cykgIT0gNDoKICAgICAgICAgICAgcmFpc2UgQWRkcmVzc1ZhbHVlRXJyb3IoIkV4cGVjdGVkIDQgb2N0ZXRzIGluICVyIiAlIGlwX3N0cikKCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gX2NvbXBhdF9pbnRfZnJvbV9ieXRlX3ZhbHMoCiAgICAgICAgICAgICAgICBtYXAoY2xzLl9wYXJzZV9vY3RldCwgb2N0ZXRzKSwgJ2JpZycpCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IgYXMgZXhjOgogICAgICAgICAgICByYWlzZSBBZGRyZXNzVmFsdWVFcnJvcigiJXMgaW4gJXIiICUgKGV4YywgaXBfc3RyKSkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfcGFyc2Vfb2N0ZXQoY2xzLCBvY3RldF9zdHIpOgogICAgICAgICIiIkNvbnZlcnQgYSBkZWNpbWFsIG9jdGV0IGludG8gYW4gaW50ZWdlci4KCiAgICAgICAgQXJnczoKICAgICAgICAgICAgb2N0ZXRfc3RyOiBBIHN0cmluZywgdGhlIG51bWJlciB0byBwYXJzZS4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgVGhlIG9jdGV0IGFzIGFuIGludGVnZXIuCgogICAgICAgIFJhaXNlczoKICAgICAgICAgICAgVmFsdWVFcnJvcjogaWYgdGhlIG9jdGV0IGlzbid0IHN0cmljdGx5IGEgZGVjaW1hbCBmcm9tIFswLi4yNTVdLgoKICAgICAgICAiIiIKICAgICAgICBpZiBub3Qgb2N0ZXRfc3RyOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJFbXB0eSBvY3RldCBub3QgcGVybWl0dGVkIikKICAgICAgICAjIFdoaXRlbGlzdCB0aGUgY2hhcmFjdGVycywgc2luY2UgaW50KCkgYWxsb3dzIGEgbG90IG9mIGJpemFycmUgc3R1ZmYuCiAgICAgICAgaWYgbm90IGNscy5fREVDSU1BTF9ESUdJVFMuaXNzdXBlcnNldChvY3RldF9zdHIpOgogICAgICAgICAgICBtc2cgPSAiT25seSBkZWNpbWFsIGRpZ2l0cyBwZXJtaXR0ZWQgaW4gJXIiCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IobXNnICUgb2N0ZXRfc3RyKQogICAgICAgICMgV2UgZG8gdGhlIGxlbmd0aCBjaGVjayBzZWNvbmQsIHNpbmNlIHRoZSBpbnZhbGlkIGNoYXJhY3RlciBlcnJvcgogICAgICAgICMgaXMgbGlrZWx5IHRvIGJlIG1vcmUgaW5mb3JtYXRpdmUgZm9yIHRoZSB1c2VyCiAgICAgICAgaWYgbGVuKG9jdGV0X3N0cikgPiAzOgogICAgICAgICAgICBtc2cgPSAiQXQgbW9zdCAzIGNoYXJhY3RlcnMgcGVybWl0dGVkIGluICVyIgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKG1zZyAlIG9jdGV0X3N0cikKICAgICAgICAjIENvbnZlcnQgdG8gaW50ZWdlciAod2Uga25vdyBkaWdpdHMgYXJlIGxlZ2FsKQogICAgICAgIG9jdGV0X2ludCA9IGludChvY3RldF9zdHIsIDEwKQogICAgICAgICMgQW55IG9jdGV0cyB0aGF0IGxvb2sgbGlrZSB0aGV5ICptaWdodCogYmUgd3JpdHRlbiBpbiBvY3RhbCwKICAgICAgICAjIGFuZCB3aGljaCBkb24ndCBsb29rIGV4YWN0bHkgdGhlIHNhbWUgaW4gYm90aCBvY3RhbCBhbmQKICAgICAgICAjIGRlY2ltYWwgYXJlIHJlamVjdGVkIGFzIGFtYmlndW91cwogICAgICAgIGlmIG9jdGV0X2ludCA+IDcgYW5kIG9jdGV0X3N0clswXSA9PSAnMCc6CiAgICAgICAgICAgIG1zZyA9ICJBbWJpZ3VvdXMgKG9jdGFsL2RlY2ltYWwpIHZhbHVlIGluICVyIG5vdCBwZXJtaXR0ZWQiCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IobXNnICUgb2N0ZXRfc3RyKQogICAgICAgIGlmIG9jdGV0X2ludCA+IDI1NToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiT2N0ZXQgJWQgKD4gMjU1KSBub3QgcGVybWl0dGVkIiAlIG9jdGV0X2ludCkKICAgICAgICByZXR1cm4gb2N0ZXRfaW50CgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX3N0cmluZ19mcm9tX2lwX2ludChjbHMsIGlwX2ludCk6CiAgICAgICAgIiIiVHVybnMgYSAzMi1iaXQgaW50ZWdlciBpbnRvIGRvdHRlZCBkZWNpbWFsIG5vdGF0aW9uLgoKICAgICAgICBBcmdzOgogICAgICAgICAgICBpcF9pbnQ6IEFuIGludGVnZXIsIHRoZSBJUCBhZGRyZXNzLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBUaGUgSVAgYWRkcmVzcyBhcyBhIHN0cmluZyBpbiBkb3R0ZWQgZGVjaW1hbCBub3RhdGlvbi4KCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuICcuJy5qb2luKF9jb21wYXRfc3RyKHN0cnVjdC51bnBhY2soYichQicsIGIpWzBdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYiwgYnl0ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgYikKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGIgaW4gX2NvbXBhdF90b19ieXRlcyhpcF9pbnQsIDQsICdiaWcnKSkKCiAgICBkZWYgX2lzX2hvc3RtYXNrKHNlbGYsIGlwX3N0cik6CiAgICAgICAgIiIiVGVzdCBpZiB0aGUgSVAgc3RyaW5nIGlzIGEgaG9zdG1hc2sgKHJhdGhlciB0aGFuIGEgbmV0bWFzaykuCgogICAgICAgIEFyZ3M6CiAgICAgICAgICAgIGlwX3N0cjogQSBzdHJpbmcsIHRoZSBwb3RlbnRpYWwgaG9zdG1hc2suCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEEgYm9vbGVhbiwgVHJ1ZSBpZiB0aGUgSVAgc3RyaW5nIGlzIGEgaG9zdG1hc2suCgogICAgICAgICIiIgogICAgICAgIGJpdHMgPSBpcF9zdHIuc3BsaXQoJy4nKQogICAgICAgIHRyeToKICAgICAgICAgICAgcGFydHMgPSBbeCBmb3IgeCBpbiBtYXAoaW50LCBiaXRzKSBpZiB4IGluIHNlbGYuX3ZhbGlkX21hc2tfb2N0ZXRzXQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICBpZiBsZW4ocGFydHMpICE9IGxlbihiaXRzKToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgaWYgcGFydHNbMF0gPCBwYXJ0c1stMV06CiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIF9yZXZlcnNlX3BvaW50ZXIoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIHRoZSByZXZlcnNlIEROUyBwb2ludGVyIG5hbWUgZm9yIHRoZSBJUHY0IGFkZHJlc3MuCgogICAgICAgIFRoaXMgaW1wbGVtZW50cyB0aGUgbWV0aG9kIGRlc2NyaWJlZCBpbiBSRkMxMDM1IDMuNS4KCiAgICAgICAgIiIiCiAgICAgICAgcmV2ZXJzZV9vY3RldHMgPSBfY29tcGF0X3N0cihzZWxmKS5zcGxpdCgnLicpWzo6LTFdCiAgICAgICAgcmV0dXJuICcuJy5qb2luKHJldmVyc2Vfb2N0ZXRzKSArICcuaW4tYWRkci5hcnBhJwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIG1heF9wcmVmaXhsZW4oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX21heF9wcmVmaXhsZW4KCiAgICBAcHJvcGVydHkKICAgIGRlZiB2ZXJzaW9uKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl92ZXJzaW9uCgoKY2xhc3MgSVB2NEFkZHJlc3MoX0Jhc2VWNCwgX0Jhc2VBZGRyZXNzKToKCiAgICAiIiJSZXByZXNlbnQgYW5kIG1hbmlwdWxhdGUgc2luZ2xlIElQdjQgQWRkcmVzc2VzLiIiIgoKICAgIF9fc2xvdHNfXyA9ICgnX2lwJywgJ19fd2Vha3JlZl9fJykKCiAgICBkZWYgX19pbml0X18oc2VsZiwgYWRkcmVzcyk6CgogICAgICAgICIiIgogICAgICAgIEFyZ3M6CiAgICAgICAgICAgIGFkZHJlc3M6IEEgc3RyaW5nIG9yIGludGVnZXIgcmVwcmVzZW50aW5nIHRoZSBJUAoKICAgICAgICAgICAgICBBZGRpdGlvbmFsbHksIGFuIGludGVnZXIgY2FuIGJlIHBhc3NlZCwgc28KICAgICAgICAgICAgICBJUHY0QWRkcmVzcygnMTkyLjAuMi4xJykgPT0gSVB2NEFkZHJlc3MoMzIyMTIyNTk4NSkuCiAgICAgICAgICAgICAgb3IsIG1vcmUgZ2VuZXJhbGx5CiAgICAgICAgICAgICAgSVB2NEFkZHJlc3MoaW50KElQdjRBZGRyZXNzKCcxOTIuMC4yLjEnKSkpID09CiAgICAgICAgICAgICAgICBJUHY0QWRkcmVzcygnMTkyLjAuMi4xJykKCiAgICAgICAgUmFpc2VzOgogICAgICAgICAgICBBZGRyZXNzVmFsdWVFcnJvcjogSWYgaXBhZGRyZXNzIGlzbid0IGEgdmFsaWQgSVB2NCBhZGRyZXNzLgoKICAgICAgICAiIiIKICAgICAgICAjIEVmZmljaWVudCBjb25zdHJ1Y3RvciBmcm9tIGludGVnZXIuCiAgICAgICAgaWYgaXNpbnN0YW5jZShhZGRyZXNzLCBfY29tcGF0X2ludF90eXBlcyk6CiAgICAgICAgICAgIHNlbGYuX2NoZWNrX2ludF9hZGRyZXNzKGFkZHJlc3MpCiAgICAgICAgICAgIHNlbGYuX2lwID0gYWRkcmVzcwogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyBDb25zdHJ1Y3RpbmcgZnJvbSBhIHBhY2tlZCBhZGRyZXNzCiAgICAgICAgaWYgaXNpbnN0YW5jZShhZGRyZXNzLCBieXRlcyk6CiAgICAgICAgICAgIHNlbGYuX2NoZWNrX3BhY2tlZF9hZGRyZXNzKGFkZHJlc3MsIDQpCiAgICAgICAgICAgIGJ2cyA9IF9jb21wYXRfYnl0ZXNfdG9fYnl0ZV92YWxzKGFkZHJlc3MpCiAgICAgICAgICAgIHNlbGYuX2lwID0gX2NvbXBhdF9pbnRfZnJvbV9ieXRlX3ZhbHMoYnZzLCAnYmlnJykKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICMgQXNzdW1lIGlucHV0IGFyZ3VtZW50IHRvIGJlIHN0cmluZyBvciBhbnkgb2JqZWN0IHJlcHJlc2VudGF0aW9uCiAgICAgICAgIyB3aGljaCBjb252ZXJ0cyBpbnRvIGEgZm9ybWF0dGVkIElQIHN0cmluZy4KICAgICAgICBhZGRyX3N0ciA9IF9jb21wYXRfc3RyKGFkZHJlc3MpCiAgICAgICAgaWYgJy8nIGluIGFkZHJfc3RyOgogICAgICAgICAgICByYWlzZSBBZGRyZXNzVmFsdWVFcnJvcigiVW5leHBlY3RlZCAnLycgaW4gJXIiICUgYWRkcmVzcykKICAgICAgICBzZWxmLl9pcCA9IHNlbGYuX2lwX2ludF9mcm9tX3N0cmluZyhhZGRyX3N0cikKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwYWNrZWQoc2VsZik6CiAgICAgICAgIiIiVGhlIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGFkZHJlc3MuIiIiCiAgICAgICAgcmV0dXJuIHY0X2ludF90b19wYWNrZWQoc2VsZi5faXApCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfcmVzZXJ2ZWQoc2VsZik6CiAgICAgICAgIiIiVGVzdCBpZiB0aGUgYWRkcmVzcyBpcyBvdGhlcndpc2UgSUVURiByZXNlcnZlZC4KCiAgICAgICAgIFJldHVybnM6CiAgICAgICAgICAgICBBIGJvb2xlYW4sIFRydWUgaWYgdGhlIGFkZHJlc3MgaXMgd2l0aGluIHRoZQogICAgICAgICAgICAgcmVzZXJ2ZWQgSVB2NCBOZXR3b3JrIHJhbmdlLgoKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZiBpbiBzZWxmLl9jb25zdGFudHMuX3Jlc2VydmVkX25ldHdvcmsKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19wcml2YXRlKHNlbGYpOgogICAgICAgICIiIlRlc3QgaWYgdGhpcyBhZGRyZXNzIGlzIGFsbG9jYXRlZCBmb3IgcHJpdmF0ZSBuZXR3b3Jrcy4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBib29sZWFuLCBUcnVlIGlmIHRoZSBhZGRyZXNzIGlzIHJlc2VydmVkIHBlcgogICAgICAgICAgICBpYW5hLWlwdjQtc3BlY2lhbC1yZWdpc3RyeS4KCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGFueShzZWxmIGluIG5ldCBmb3IgbmV0IGluIHNlbGYuX2NvbnN0YW50cy5fcHJpdmF0ZV9uZXR3b3JrcykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19nbG9iYWwoc2VsZik6CiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgc2VsZiBub3QgaW4gc2VsZi5fY29uc3RhbnRzLl9wdWJsaWNfbmV0d29yayBhbmQKICAgICAgICAgICAgbm90IHNlbGYuaXNfcHJpdmF0ZSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19tdWx0aWNhc3Qoc2VsZik6CiAgICAgICAgIiIiVGVzdCBpZiB0aGUgYWRkcmVzcyBpcyByZXNlcnZlZCBmb3IgbXVsdGljYXN0IHVzZS4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBib29sZWFuLCBUcnVlIGlmIHRoZSBhZGRyZXNzIGlzIG11bHRpY2FzdC4KICAgICAgICAgICAgU2VlIFJGQyAzMTcxIGZvciBkZXRhaWxzLgoKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZiBpbiBzZWxmLl9jb25zdGFudHMuX211bHRpY2FzdF9uZXR3b3JrCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfdW5zcGVjaWZpZWQoc2VsZik6CiAgICAgICAgIiIiVGVzdCBpZiB0aGUgYWRkcmVzcyBpcyB1bnNwZWNpZmllZC4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBib29sZWFuLCBUcnVlIGlmIHRoaXMgaXMgdGhlIHVuc3BlY2lmaWVkIGFkZHJlc3MgYXMgZGVmaW5lZCBpbgogICAgICAgICAgICBSRkMgNTczNSAzLgoKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZiA9PSBzZWxmLl9jb25zdGFudHMuX3Vuc3BlY2lmaWVkX2FkZHJlc3MKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19sb29wYmFjayhzZWxmKToKICAgICAgICAiIiJUZXN0IGlmIHRoZSBhZGRyZXNzIGlzIGEgbG9vcGJhY2sgYWRkcmVzcy4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBib29sZWFuLCBUcnVlIGlmIHRoZSBhZGRyZXNzIGlzIGEgbG9vcGJhY2sgcGVyIFJGQyAzMzMwLgoKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZiBpbiBzZWxmLl9jb25zdGFudHMuX2xvb3BiYWNrX25ldHdvcmsKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19saW5rX2xvY2FsKHNlbGYpOgogICAgICAgICIiIlRlc3QgaWYgdGhlIGFkZHJlc3MgaXMgcmVzZXJ2ZWQgZm9yIGxpbmstbG9jYWwuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEEgYm9vbGVhbiwgVHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyBsaW5rLWxvY2FsIHBlciBSRkMgMzkyNy4KCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYgaW4gc2VsZi5fY29uc3RhbnRzLl9saW5rbG9jYWxfbmV0d29yawoKCmNsYXNzIElQdjRJbnRlcmZhY2UoSVB2NEFkZHJlc3MpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhZGRyZXNzKToKICAgICAgICBpZiBpc2luc3RhbmNlKGFkZHJlc3MsIChieXRlcywgX2NvbXBhdF9pbnRfdHlwZXMpKToKICAgICAgICAgICAgSVB2NEFkZHJlc3MuX19pbml0X18oc2VsZiwgYWRkcmVzcykKICAgICAgICAgICAgc2VsZi5uZXR3b3JrID0gSVB2NE5ldHdvcmsoc2VsZi5faXApCiAgICAgICAgICAgIHNlbGYuX3ByZWZpeGxlbiA9IHNlbGYuX21heF9wcmVmaXhsZW4KICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGlmIGlzaW5zdGFuY2UoYWRkcmVzcywgdHVwbGUpOgogICAgICAgICAgICBJUHY0QWRkcmVzcy5fX2luaXRfXyhzZWxmLCBhZGRyZXNzWzBdKQogICAgICAgICAgICBpZiBsZW4oYWRkcmVzcykgPiAxOgogICAgICAgICAgICAgICAgc2VsZi5fcHJlZml4bGVuID0gaW50KGFkZHJlc3NbMV0pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9wcmVmaXhsZW4gPSBzZWxmLl9tYXhfcHJlZml4bGVuCgogICAgICAgICAgICBzZWxmLm5ldHdvcmsgPSBJUHY0TmV0d29yayhhZGRyZXNzLCBzdHJpY3Q9RmFsc2UpCiAgICAgICAgICAgIHNlbGYubmV0bWFzayA9IHNlbGYubmV0d29yay5uZXRtYXNrCiAgICAgICAgICAgIHNlbGYuaG9zdG1hc2sgPSBzZWxmLm5ldHdvcmsuaG9zdG1hc2sKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGFkZHIgPSBfc3BsaXRfb3B0aW9uYWxfbmV0bWFzayhhZGRyZXNzKQogICAgICAgIElQdjRBZGRyZXNzLl9faW5pdF9fKHNlbGYsIGFkZHJbMF0pCgogICAgICAgIHNlbGYubmV0d29yayA9IElQdjROZXR3b3JrKGFkZHJlc3MsIHN0cmljdD1GYWxzZSkKICAgICAgICBzZWxmLl9wcmVmaXhsZW4gPSBzZWxmLm5ldHdvcmsuX3ByZWZpeGxlbgoKICAgICAgICBzZWxmLm5ldG1hc2sgPSBzZWxmLm5ldHdvcmsubmV0bWFzawogICAgICAgIHNlbGYuaG9zdG1hc2sgPSBzZWxmLm5ldHdvcmsuaG9zdG1hc2sKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gJyVzLyVkJyAlIChzZWxmLl9zdHJpbmdfZnJvbV9pcF9pbnQoc2VsZi5faXApLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubmV0d29yay5wcmVmaXhsZW4pCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgYWRkcmVzc19lcXVhbCA9IElQdjRBZGRyZXNzLl9fZXFfXyhzZWxmLCBvdGhlcikKICAgICAgICBpZiBub3QgYWRkcmVzc19lcXVhbCBvciBhZGRyZXNzX2VxdWFsIGlzIE5vdEltcGxlbWVudGVkOgogICAgICAgICAgICByZXR1cm4gYWRkcmVzc19lcXVhbAogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYubmV0d29yayA9PSBvdGhlci5uZXR3b3JrCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICAjIEFuIGludGVyZmFjZSB3aXRoIGFuIGFzc29jaWF0ZWQgbmV0d29yayBpcyBOT1QgdGhlCiAgICAgICAgICAgICMgc2FtZSBhcyBhbiB1bmFzc29jaWF0ZWQgYWRkcmVzcy4gVGhhdCdzIHdoeSB0aGUgaGFzaAogICAgICAgICAgICAjIHRha2VzIHRoZSBleHRyYSBpbmZvIGludG8gYWNjb3VudC4KICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgYWRkcmVzc19sZXNzID0gSVB2NEFkZHJlc3MuX19sdF9fKHNlbGYsIG90aGVyKQogICAgICAgIGlmIGFkZHJlc3NfbGVzcyBpcyBOb3RJbXBsZW1lbnRlZDoKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5uZXR3b3JrIDwgb3RoZXIubmV0d29yawogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgIyBXZSAqZG8qIGFsbG93IGFkZHJlc3NlcyBhbmQgaW50ZXJmYWNlcyB0byBiZSBzb3J0ZWQuIFRoZQogICAgICAgICAgICAjIHVuYXNzb2NpYXRlZCBhZGRyZXNzIGlzIGNvbnNpZGVyZWQgbGVzcyB0aGFuIGFsbCBpbnRlcmZhY2VzLgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2lwIF4gc2VsZi5fcHJlZml4bGVuIF4gaW50KHNlbGYubmV0d29yay5uZXR3b3JrX2FkZHJlc3MpCgogICAgX19yZWR1Y2VfXyA9IF9JUEFkZHJlc3NCYXNlLl9fcmVkdWNlX18KCiAgICBAcHJvcGVydHkKICAgIGRlZiBpcChzZWxmKToKICAgICAgICByZXR1cm4gSVB2NEFkZHJlc3Moc2VsZi5faXApCgogICAgQHByb3BlcnR5CiAgICBkZWYgd2l0aF9wcmVmaXhsZW4oc2VsZik6CiAgICAgICAgcmV0dXJuICclcy8lcycgJSAoc2VsZi5fc3RyaW5nX2Zyb21faXBfaW50KHNlbGYuX2lwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9wcmVmaXhsZW4pCgogICAgQHByb3BlcnR5CiAgICBkZWYgd2l0aF9uZXRtYXNrKHNlbGYpOgogICAgICAgIHJldHVybiAnJXMvJXMnICUgKHNlbGYuX3N0cmluZ19mcm9tX2lwX2ludChzZWxmLl9pcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5uZXRtYXNrKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHdpdGhfaG9zdG1hc2soc2VsZik6CiAgICAgICAgcmV0dXJuICclcy8lcycgJSAoc2VsZi5fc3RyaW5nX2Zyb21faXBfaW50KHNlbGYuX2lwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmhvc3RtYXNrKQoKCmNsYXNzIElQdjROZXR3b3JrKF9CYXNlVjQsIF9CYXNlTmV0d29yayk6CgogICAgIiIiVGhpcyBjbGFzcyByZXByZXNlbnRzIGFuZCBtYW5pcHVsYXRlcyAzMi1iaXQgSVB2NCBuZXR3b3JrICsgYWRkcmVzc2VzLi4KCiAgICBBdHRyaWJ1dGVzOiBbZXhhbXBsZXMgZm9yIElQdjROZXR3b3JrKCcxOTIuMC4yLjAvMjcnKV0KICAgICAgICAubmV0d29ya19hZGRyZXNzOiBJUHY0QWRkcmVzcygnMTkyLjAuMi4wJykKICAgICAgICAuaG9zdG1hc2s6IElQdjRBZGRyZXNzKCcwLjAuMC4zMScpCiAgICAgICAgLmJyb2FkY2FzdF9hZGRyZXNzOiBJUHY0QWRkcmVzcygnMTkyLjAuMi4zMicpCiAgICAgICAgLm5ldG1hc2s6IElQdjRBZGRyZXNzKCcyNTUuMjU1LjI1NS4yMjQnKQogICAgICAgIC5wcmVmaXhsZW46IDI3CgogICAgIiIiCiAgICAjIENsYXNzIHRvIHVzZSB3aGVuIGNyZWF0aW5nIGFkZHJlc3Mgb2JqZWN0cwogICAgX2FkZHJlc3NfY2xhc3MgPSBJUHY0QWRkcmVzcwoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhZGRyZXNzLCBzdHJpY3Q9VHJ1ZSk6CgogICAgICAgICIiIkluc3RhbnRpYXRlIGEgbmV3IElQdjQgbmV0d29yayBvYmplY3QuCgogICAgICAgIEFyZ3M6CiAgICAgICAgICAgIGFkZHJlc3M6IEEgc3RyaW5nIG9yIGludGVnZXIgcmVwcmVzZW50aW5nIHRoZSBJUCBbJiBuZXR3b3JrXS4KICAgICAgICAgICAgICAnMTkyLjAuMi4wLzI0JwogICAgICAgICAgICAgICcxOTIuMC4yLjAvMjU1LjI1NS4yNTUuMCcKICAgICAgICAgICAgICAnMTkyLjAuMC4yLzAuMC4wLjI1NScKICAgICAgICAgICAgICBhcmUgYWxsIGZ1bmN0aW9uYWxseSB0aGUgc2FtZSBpbiBJUHY0LiBTaW1pbGFybHksCiAgICAgICAgICAgICAgJzE5Mi4wLjIuMScKICAgICAgICAgICAgICAnMTkyLjAuMi4xLzI1NS4yNTUuMjU1LjI1NScKICAgICAgICAgICAgICAnMTkyLjAuMi4xLzMyJwogICAgICAgICAgICAgIGFyZSBhbHNvIGZ1bmN0aW9uYWxseSBlcXVpdmFsZW50LiBUaGF0IGlzIHRvIHNheSwgZmFpbGluZyB0bwogICAgICAgICAgICAgIHByb3ZpZGUgYSBzdWJuZXRtYXNrIHdpbGwgY3JlYXRlIGFuIG9iamVjdCB3aXRoIGEgbWFzayBvZiAvMzIuCgogICAgICAgICAgICAgIElmIHRoZSBtYXNrIChwb3J0aW9uIGFmdGVyIHRoZSAvIGluIHRoZSBhcmd1bWVudCkgaXMgZ2l2ZW4gaW4KICAgICAgICAgICAgICBkb3R0ZWQgcXVhZCBmb3JtLCBpdCBpcyB0cmVhdGVkIGFzIGEgbmV0bWFzayBpZiBpdCBzdGFydHMgd2l0aCBhCiAgICAgICAgICAgICAgbm9uLXplcm8gZmllbGQgKGUuZy4gLzI1NS4wLjAuMCA9PSAvOCkgYW5kIGFzIGEgaG9zdG1hc2sgaWYgaXQKICAgICAgICAgICAgICBzdGFydHMgd2l0aCBhIHplcm8gZmllbGQgKGUuZy4gMC4yNTUuMjU1LjI1NSA9PSAvOCksIHdpdGggdGhlCiAgICAgICAgICAgICAgc2luZ2xlIGV4Y2VwdGlvbiBvZiBhbiBhbGwtemVybyBtYXNrIHdoaWNoIGlzIHRyZWF0ZWQgYXMgYQogICAgICAgICAgICAgIG5ldG1hc2sgPT0gLzAuIElmIG5vIG1hc2sgaXMgZ2l2ZW4sIGEgZGVmYXVsdCBvZiAvMzIgaXMgdXNlZC4KCiAgICAgICAgICAgICAgQWRkaXRpb25hbGx5LCBhbiBpbnRlZ2VyIGNhbiBiZSBwYXNzZWQsIHNvCiAgICAgICAgICAgICAgSVB2NE5ldHdvcmsoJzE5Mi4wLjIuMScpID09IElQdjROZXR3b3JrKDMyMjEyMjU5ODUpCiAgICAgICAgICAgICAgb3IsIG1vcmUgZ2VuZXJhbGx5CiAgICAgICAgICAgICAgSVB2NEludGVyZmFjZShpbnQoSVB2NEludGVyZmFjZSgnMTkyLjAuMi4xJykpKSA9PQogICAgICAgICAgICAgICAgSVB2NEludGVyZmFjZSgnMTkyLjAuMi4xJykKCiAgICAgICAgUmFpc2VzOgogICAgICAgICAgICBBZGRyZXNzVmFsdWVFcnJvcjogSWYgaXBhZGRyZXNzIGlzbid0IGEgdmFsaWQgSVB2NCBhZGRyZXNzLgogICAgICAgICAgICBOZXRtYXNrVmFsdWVFcnJvcjogSWYgdGhlIG5ldG1hc2sgaXNuJ3QgdmFsaWQgZm9yCiAgICAgICAgICAgICAgYW4gSVB2NCBhZGRyZXNzLgogICAgICAgICAgICBWYWx1ZUVycm9yOiBJZiBzdHJpY3QgaXMgVHJ1ZSBhbmQgYSBuZXR3b3JrIGFkZHJlc3MgaXMgbm90CiAgICAgICAgICAgICAgc3VwcGxpZWQuCgogICAgICAgICIiIgogICAgICAgIF9CYXNlTmV0d29yay5fX2luaXRfXyhzZWxmLCBhZGRyZXNzKQoKICAgICAgICAjIENvbnN0cnVjdGluZyBmcm9tIGEgcGFja2VkIGFkZHJlc3Mgb3IgaW50ZWdlcgogICAgICAgIGlmIGlzaW5zdGFuY2UoYWRkcmVzcywgKF9jb21wYXRfaW50X3R5cGVzLCBieXRlcykpOgogICAgICAgICAgICBzZWxmLm5ldHdvcmtfYWRkcmVzcyA9IElQdjRBZGRyZXNzKGFkZHJlc3MpCiAgICAgICAgICAgIHNlbGYubmV0bWFzaywgc2VsZi5fcHJlZml4bGVuID0gc2VsZi5fbWFrZV9uZXRtYXNrKAogICAgICAgICAgICAgICAgc2VsZi5fbWF4X3ByZWZpeGxlbikKICAgICAgICAgICAgIyBmaXhtZTogYWRkcmVzcy9uZXR3b3JrIHRlc3QgaGVyZS4KICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGlmIGlzaW5zdGFuY2UoYWRkcmVzcywgdHVwbGUpOgogICAgICAgICAgICBpZiBsZW4oYWRkcmVzcykgPiAxOgogICAgICAgICAgICAgICAgYXJnID0gYWRkcmVzc1sxXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBXZSB3ZXJlbid0IGdpdmVuIGFuIGFkZHJlc3NbMV0KICAgICAgICAgICAgICAgIGFyZyA9IHNlbGYuX21heF9wcmVmaXhsZW4KICAgICAgICAgICAgc2VsZi5uZXR3b3JrX2FkZHJlc3MgPSBJUHY0QWRkcmVzcyhhZGRyZXNzWzBdKQogICAgICAgICAgICBzZWxmLm5ldG1hc2ssIHNlbGYuX3ByZWZpeGxlbiA9IHNlbGYuX21ha2VfbmV0bWFzayhhcmcpCiAgICAgICAgICAgIHBhY2tlZCA9IGludChzZWxmLm5ldHdvcmtfYWRkcmVzcykKICAgICAgICAgICAgaWYgcGFja2VkICYgaW50KHNlbGYubmV0bWFzaykgIT0gcGFja2VkOgogICAgICAgICAgICAgICAgaWYgc3RyaWN0OgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJyVzIGhhcyBob3N0IGJpdHMgc2V0JyAlIHNlbGYpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHNlbGYubmV0d29ya19hZGRyZXNzID0gSVB2NEFkZHJlc3MocGFja2VkICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludChzZWxmLm5ldG1hc2spKQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyBBc3N1bWUgaW5wdXQgYXJndW1lbnQgdG8gYmUgc3RyaW5nIG9yIGFueSBvYmplY3QgcmVwcmVzZW50YXRpb24KICAgICAgICAjIHdoaWNoIGNvbnZlcnRzIGludG8gYSBmb3JtYXR0ZWQgSVAgcHJlZml4IHN0cmluZy4KICAgICAgICBhZGRyID0gX3NwbGl0X29wdGlvbmFsX25ldG1hc2soYWRkcmVzcykKICAgICAgICBzZWxmLm5ldHdvcmtfYWRkcmVzcyA9IElQdjRBZGRyZXNzKHNlbGYuX2lwX2ludF9mcm9tX3N0cmluZyhhZGRyWzBdKSkKCiAgICAgICAgaWYgbGVuKGFkZHIpID09IDI6CiAgICAgICAgICAgIGFyZyA9IGFkZHJbMV0KICAgICAgICBlbHNlOgogICAgICAgICAgICBhcmcgPSBzZWxmLl9tYXhfcHJlZml4bGVuCiAgICAgICAgc2VsZi5uZXRtYXNrLCBzZWxmLl9wcmVmaXhsZW4gPSBzZWxmLl9tYWtlX25ldG1hc2soYXJnKQoKICAgICAgICBpZiBzdHJpY3Q6CiAgICAgICAgICAgIGlmIChJUHY0QWRkcmVzcyhpbnQoc2VsZi5uZXR3b3JrX2FkZHJlc3MpICYgaW50KHNlbGYubmV0bWFzaykpICE9CiAgICAgICAgICAgICAgICAgICAgc2VsZi5uZXR3b3JrX2FkZHJlc3MpOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignJXMgaGFzIGhvc3QgYml0cyBzZXQnICUgc2VsZikKICAgICAgICBzZWxmLm5ldHdvcmtfYWRkcmVzcyA9IElQdjRBZGRyZXNzKGludChzZWxmLm5ldHdvcmtfYWRkcmVzcykgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KHNlbGYubmV0bWFzaykpCgogICAgICAgIGlmIHNlbGYuX3ByZWZpeGxlbiA9PSAoc2VsZi5fbWF4X3ByZWZpeGxlbiAtIDEpOgogICAgICAgICAgICBzZWxmLmhvc3RzID0gc2VsZi5fX2l0ZXJfXwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX2dsb2JhbChzZWxmKToKICAgICAgICAiIiJUZXN0IGlmIHRoaXMgYWRkcmVzcyBpcyBhbGxvY2F0ZWQgZm9yIHB1YmxpYyBuZXR3b3Jrcy4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBib29sZWFuLCBUcnVlIGlmIHRoZSBhZGRyZXNzIGlzIG5vdCByZXNlcnZlZCBwZXIKICAgICAgICAgICAgaWFuYS1pcHY0LXNwZWNpYWwtcmVnaXN0cnkuCgogICAgICAgICIiIgogICAgICAgIHJldHVybiAobm90IChzZWxmLm5ldHdvcmtfYWRkcmVzcyBpbiBJUHY0TmV0d29yaygnMTAwLjY0LjAuMC8xMCcpIGFuZAogICAgICAgICAgICAgICAgc2VsZi5icm9hZGNhc3RfYWRkcmVzcyBpbiBJUHY0TmV0d29yaygnMTAwLjY0LjAuMC8xMCcpKSBhbmQKICAgICAgICAgICAgICAgIG5vdCBzZWxmLmlzX3ByaXZhdGUpCgoKY2xhc3MgX0lQdjRDb25zdGFudHMob2JqZWN0KToKCiAgICBfbGlua2xvY2FsX25ldHdvcmsgPSBJUHY0TmV0d29yaygnMTY5LjI1NC4wLjAvMTYnKQoKICAgIF9sb29wYmFja19uZXR3b3JrID0gSVB2NE5ldHdvcmsoJzEyNy4wLjAuMC84JykKCiAgICBfbXVsdGljYXN0X25ldHdvcmsgPSBJUHY0TmV0d29yaygnMjI0LjAuMC4wLzQnKQoKICAgIF9wdWJsaWNfbmV0d29yayA9IElQdjROZXR3b3JrKCcxMDAuNjQuMC4wLzEwJykKCiAgICBfcHJpdmF0ZV9uZXR3b3JrcyA9IFsKICAgICAgICBJUHY0TmV0d29yaygnMC4wLjAuMC84JyksCiAgICAgICAgSVB2NE5ldHdvcmsoJzEwLjAuMC4wLzgnKSwKICAgICAgICBJUHY0TmV0d29yaygnMTI3LjAuMC4wLzgnKSwKICAgICAgICBJUHY0TmV0d29yaygnMTY5LjI1NC4wLjAvMTYnKSwKICAgICAgICBJUHY0TmV0d29yaygnMTcyLjE2LjAuMC8xMicpLAogICAgICAgIElQdjROZXR3b3JrKCcxOTIuMC4wLjAvMjknKSwKICAgICAgICBJUHY0TmV0d29yaygnMTkyLjAuMC4xNzAvMzEnKSwKICAgICAgICBJUHY0TmV0d29yaygnMTkyLjAuMi4wLzI0JyksCiAgICAgICAgSVB2NE5ldHdvcmsoJzE5Mi4xNjguMC4wLzE2JyksCiAgICAgICAgSVB2NE5ldHdvcmsoJzE5OC4xOC4wLjAvMTUnKSwKICAgICAgICBJUHY0TmV0d29yaygnMTk4LjUxLjEwMC4wLzI0JyksCiAgICAgICAgSVB2NE5ldHdvcmsoJzIwMy4wLjExMy4wLzI0JyksCiAgICAgICAgSVB2NE5ldHdvcmsoJzI0MC4wLjAuMC80JyksCiAgICAgICAgSVB2NE5ldHdvcmsoJzI1NS4yNTUuMjU1LjI1NS8zMicpLAogICAgXQoKICAgIF9yZXNlcnZlZF9uZXR3b3JrID0gSVB2NE5ldHdvcmsoJzI0MC4wLjAuMC80JykKCiAgICBfdW5zcGVjaWZpZWRfYWRkcmVzcyA9IElQdjRBZGRyZXNzKCcwLjAuMC4wJykKCgpJUHY0QWRkcmVzcy5fY29uc3RhbnRzID0gX0lQdjRDb25zdGFudHMKCgpjbGFzcyBfQmFzZVY2KG9iamVjdCk6CgogICAgIiIiQmFzZSBJUHY2IG9iamVjdC4KCiAgICBUaGUgZm9sbG93aW5nIG1ldGhvZHMgYXJlIHVzZWQgYnkgSVB2NiBvYmplY3RzIGluIGJvdGggc2luZ2xlIElQCiAgICBhZGRyZXNzZXMgYW5kIG5ldHdvcmtzLgoKICAgICIiIgoKICAgIF9fc2xvdHNfXyA9ICgpCiAgICBfdmVyc2lvbiA9IDYKICAgIF9BTExfT05FUyA9ICgyICoqIElQVjZMRU5HVEgpIC0gMQogICAgX0hFWFRFVF9DT1VOVCA9IDgKICAgIF9IRVhfRElHSVRTID0gZnJvemVuc2V0KCcwMTIzNDU2Nzg5QUJDREVGYWJjZGVmJykKICAgIF9tYXhfcHJlZml4bGVuID0gSVBWNkxFTkdUSAoKICAgICMgVGhlcmUgYXJlIG9ubHkgYSBidW5jaCBvZiB2YWxpZCB2NiBuZXRtYXNrcywgc28gd2UgY2FjaGUgdGhlbSBhbGwKICAgICMgd2hlbiBjb25zdHJ1Y3RlZCAoc2VlIF9tYWtlX25ldG1hc2soKSkuCiAgICBfbmV0bWFza19jYWNoZSA9IHt9CgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX21ha2VfbmV0bWFzayhjbHMsIGFyZyk6CiAgICAgICAgIiIiTWFrZSBhIChuZXRtYXNrLCBwcmVmaXhfbGVuKSB0dXBsZSBmcm9tIHRoZSBnaXZlbiBhcmd1bWVudC4KCiAgICAgICAgQXJndW1lbnQgY2FuIGJlOgogICAgICAgIC0gYW4gaW50ZWdlciAodGhlIHByZWZpeCBsZW5ndGgpCiAgICAgICAgLSBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHByZWZpeCBsZW5ndGggKGUuZy4gIjI0IikKICAgICAgICAtIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcHJlZml4IG5ldG1hc2sgKGUuZy4gIjI1NS4yNTUuMjU1LjAiKQogICAgICAgICIiIgogICAgICAgIGlmIGFyZyBub3QgaW4gY2xzLl9uZXRtYXNrX2NhY2hlOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGFyZywgX2NvbXBhdF9pbnRfdHlwZXMpOgogICAgICAgICAgICAgICAgcHJlZml4bGVuID0gYXJnCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwcmVmaXhsZW4gPSBjbHMuX3ByZWZpeF9mcm9tX3ByZWZpeF9zdHJpbmcoYXJnKQogICAgICAgICAgICBuZXRtYXNrID0gSVB2NkFkZHJlc3MoY2xzLl9pcF9pbnRfZnJvbV9wcmVmaXgocHJlZml4bGVuKSkKICAgICAgICAgICAgY2xzLl9uZXRtYXNrX2NhY2hlW2FyZ10gPSBuZXRtYXNrLCBwcmVmaXhsZW4KICAgICAgICByZXR1cm4gY2xzLl9uZXRtYXNrX2NhY2hlW2FyZ10KCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfaXBfaW50X2Zyb21fc3RyaW5nKGNscywgaXBfc3RyKToKICAgICAgICAiIiJUdXJuIGFuIElQdjYgaXBfc3RyIGludG8gYW4gaW50ZWdlci4KCiAgICAgICAgQXJnczoKICAgICAgICAgICAgaXBfc3RyOiBBIHN0cmluZywgdGhlIElQdjYgaXBfc3RyLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBbiBpbnQsIHRoZSBJUHY2IGFkZHJlc3MKCiAgICAgICAgUmFpc2VzOgogICAgICAgICAgICBBZGRyZXNzVmFsdWVFcnJvcjogaWYgaXBfc3RyIGlzbid0IGEgdmFsaWQgSVB2NiBBZGRyZXNzLgoKICAgICAgICAiIiIKICAgICAgICBpZiBub3QgaXBfc3RyOgogICAgICAgICAgICByYWlzZSBBZGRyZXNzVmFsdWVFcnJvcignQWRkcmVzcyBjYW5ub3QgYmUgZW1wdHknKQoKICAgICAgICBwYXJ0cyA9IGlwX3N0ci5zcGxpdCgnOicpCgogICAgICAgICMgQW4gSVB2NiBhZGRyZXNzIG5lZWRzIGF0IGxlYXN0IDIgY29sb25zICgzIHBhcnRzKS4KICAgICAgICBfbWluX3BhcnRzID0gMwogICAgICAgIGlmIGxlbihwYXJ0cykgPCBfbWluX3BhcnRzOgogICAgICAgICAgICBtc2cgPSAiQXQgbGVhc3QgJWQgcGFydHMgZXhwZWN0ZWQgaW4gJXIiICUgKF9taW5fcGFydHMsIGlwX3N0cikKICAgICAgICAgICAgcmFpc2UgQWRkcmVzc1ZhbHVlRXJyb3IobXNnKQoKICAgICAgICAjIElmIHRoZSBhZGRyZXNzIGhhcyBhbiBJUHY0LXN0eWxlIHN1ZmZpeCwgY29udmVydCBpdCB0byBoZXhhZGVjaW1hbC4KICAgICAgICBpZiAnLicgaW4gcGFydHNbLTFdOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBpcHY0X2ludCA9IElQdjRBZGRyZXNzKHBhcnRzLnBvcCgpKS5faXAKICAgICAgICAgICAgZXhjZXB0IEFkZHJlc3NWYWx1ZUVycm9yIGFzIGV4YzoKICAgICAgICAgICAgICAgIHJhaXNlIEFkZHJlc3NWYWx1ZUVycm9yKCIlcyBpbiAlciIgJSAoZXhjLCBpcF9zdHIpKQogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoJyV4JyAlICgoaXB2NF9pbnQgPj4gMTYpICYgMHhGRkZGKSkKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCcleCcgJSAoaXB2NF9pbnQgJiAweEZGRkYpKQoKICAgICAgICAjIEFuIElQdjYgYWRkcmVzcyBjYW4ndCBoYXZlIG1vcmUgdGhhbiA4IGNvbG9ucyAoOSBwYXJ0cykuCiAgICAgICAgIyBUaGUgZXh0cmEgY29sb24gY29tZXMgZnJvbSB1c2luZyB0aGUgIjo6IiBub3RhdGlvbiBmb3IgYSBzaW5nbGUKICAgICAgICAjIGxlYWRpbmcgb3IgdHJhaWxpbmcgemVybyBwYXJ0LgogICAgICAgIF9tYXhfcGFydHMgPSBjbHMuX0hFWFRFVF9DT1VOVCArIDEKICAgICAgICBpZiBsZW4ocGFydHMpID4gX21heF9wYXJ0czoKICAgICAgICAgICAgbXNnID0gIkF0IG1vc3QgJWQgY29sb25zIHBlcm1pdHRlZCBpbiAlciIgJSAoCiAgICAgICAgICAgICAgICBfbWF4X3BhcnRzIC0gMSwgaXBfc3RyKQogICAgICAgICAgICByYWlzZSBBZGRyZXNzVmFsdWVFcnJvcihtc2cpCgogICAgICAgICMgRGlzcmVnYXJkaW5nIHRoZSBlbmRwb2ludHMsIGZpbmQgJzo6JyB3aXRoIG5vdGhpbmcgaW4gYmV0d2Vlbi4KICAgICAgICAjIFRoaXMgaW5kaWNhdGVzIHRoYXQgYSBydW4gb2YgemVyb2VzIGhhcyBiZWVuIHNraXBwZWQuCiAgICAgICAgc2tpcF9pbmRleCA9IE5vbmUKICAgICAgICBmb3IgaSBpbiBfY29tcGF0X3JhbmdlKDEsIGxlbihwYXJ0cykgLSAxKToKICAgICAgICAgICAgaWYgbm90IHBhcnRzW2ldOgogICAgICAgICAgICAgICAgaWYgc2tpcF9pbmRleCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICAjIENhbid0IGhhdmUgbW9yZSB0aGFuIG9uZSAnOjonCiAgICAgICAgICAgICAgICAgICAgbXNnID0gIkF0IG1vc3Qgb25lICc6OicgcGVybWl0dGVkIGluICVyIiAlIGlwX3N0cgogICAgICAgICAgICAgICAgICAgIHJhaXNlIEFkZHJlc3NWYWx1ZUVycm9yKG1zZykKICAgICAgICAgICAgICAgIHNraXBfaW5kZXggPSBpCgogICAgICAgICMgcGFydHNfaGkgaXMgdGhlIG51bWJlciBvZiBwYXJ0cyB0byBjb3B5IGZyb20gYWJvdmUvYmVmb3JlIHRoZSAnOjonCiAgICAgICAgIyBwYXJ0c19sbyBpcyB0aGUgbnVtYmVyIG9mIHBhcnRzIHRvIGNvcHkgZnJvbSBiZWxvdy9hZnRlciB0aGUgJzo6JwogICAgICAgIGlmIHNraXBfaW5kZXggaXMgbm90IE5vbmU6CiAgICAgICAgICAgICMgSWYgd2UgZm91bmQgYSAnOjonLCB0aGVuIGNoZWNrIGlmIGl0IGFsc28gY292ZXJzIHRoZSBlbmRwb2ludHMuCiAgICAgICAgICAgIHBhcnRzX2hpID0gc2tpcF9pbmRleAogICAgICAgICAgICBwYXJ0c19sbyA9IGxlbihwYXJ0cykgLSBza2lwX2luZGV4IC0gMQogICAgICAgICAgICBpZiBub3QgcGFydHNbMF06CiAgICAgICAgICAgICAgICBwYXJ0c19oaSAtPSAxCiAgICAgICAgICAgICAgICBpZiBwYXJ0c19oaToKICAgICAgICAgICAgICAgICAgICBtc2cgPSAiTGVhZGluZyAnOicgb25seSBwZXJtaXR0ZWQgYXMgcGFydCBvZiAnOjonIGluICVyIgogICAgICAgICAgICAgICAgICAgIHJhaXNlIEFkZHJlc3NWYWx1ZUVycm9yKG1zZyAlIGlwX3N0cikgICMgXjogcmVxdWlyZXMgXjo6CiAgICAgICAgICAgIGlmIG5vdCBwYXJ0c1stMV06CiAgICAgICAgICAgICAgICBwYXJ0c19sbyAtPSAxCiAgICAgICAgICAgICAgICBpZiBwYXJ0c19sbzoKICAgICAgICAgICAgICAgICAgICBtc2cgPSAiVHJhaWxpbmcgJzonIG9ubHkgcGVybWl0dGVkIGFzIHBhcnQgb2YgJzo6JyBpbiAlciIKICAgICAgICAgICAgICAgICAgICByYWlzZSBBZGRyZXNzVmFsdWVFcnJvcihtc2cgJSBpcF9zdHIpICAjIDokIHJlcXVpcmVzIDo6JAogICAgICAgICAgICBwYXJ0c19za2lwcGVkID0gY2xzLl9IRVhURVRfQ09VTlQgLSAocGFydHNfaGkgKyBwYXJ0c19sbykKICAgICAgICAgICAgaWYgcGFydHNfc2tpcHBlZCA8IDE6CiAgICAgICAgICAgICAgICBtc2cgPSAiRXhwZWN0ZWQgYXQgbW9zdCAlZCBvdGhlciBwYXJ0cyB3aXRoICc6OicgaW4gJXIiCiAgICAgICAgICAgICAgICByYWlzZSBBZGRyZXNzVmFsdWVFcnJvcihtc2cgJSAoY2xzLl9IRVhURVRfQ09VTlQgLSAxLCBpcF9zdHIpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgT3RoZXJ3aXNlLCBhbGxvY2F0ZSB0aGUgZW50aXJlIGFkZHJlc3MgdG8gcGFydHNfaGkuICBUaGUKICAgICAgICAgICAgIyBlbmRwb2ludHMgY291bGQgc3RpbGwgYmUgZW1wdHksIGJ1dCBfcGFyc2VfaGV4dGV0KCkgd2lsbCBjaGVjawogICAgICAgICAgICAjIGZvciB0aGF0LgogICAgICAgICAgICBpZiBsZW4ocGFydHMpICE9IGNscy5fSEVYVEVUX0NPVU5UOgogICAgICAgICAgICAgICAgbXNnID0gIkV4YWN0bHkgJWQgcGFydHMgZXhwZWN0ZWQgd2l0aG91dCAnOjonIGluICVyIgogICAgICAgICAgICAgICAgcmFpc2UgQWRkcmVzc1ZhbHVlRXJyb3IobXNnICUgKGNscy5fSEVYVEVUX0NPVU5ULCBpcF9zdHIpKQogICAgICAgICAgICBpZiBub3QgcGFydHNbMF06CiAgICAgICAgICAgICAgICBtc2cgPSAiTGVhZGluZyAnOicgb25seSBwZXJtaXR0ZWQgYXMgcGFydCBvZiAnOjonIGluICVyIgogICAgICAgICAgICAgICAgcmFpc2UgQWRkcmVzc1ZhbHVlRXJyb3IobXNnICUgaXBfc3RyKSAgIyBeOiByZXF1aXJlcyBeOjoKICAgICAgICAgICAgaWYgbm90IHBhcnRzWy0xXToKICAgICAgICAgICAgICAgIG1zZyA9ICJUcmFpbGluZyAnOicgb25seSBwZXJtaXR0ZWQgYXMgcGFydCBvZiAnOjonIGluICVyIgogICAgICAgICAgICAgICAgcmFpc2UgQWRkcmVzc1ZhbHVlRXJyb3IobXNnICUgaXBfc3RyKSAgIyA6JCByZXF1aXJlcyA6OiQKICAgICAgICAgICAgcGFydHNfaGkgPSBsZW4ocGFydHMpCiAgICAgICAgICAgIHBhcnRzX2xvID0gMAogICAgICAgICAgICBwYXJ0c19za2lwcGVkID0gMAoKICAgICAgICB0cnk6CiAgICAgICAgICAgICMgTm93LCBwYXJzZSB0aGUgaGV4dGV0cyBpbnRvIGEgMTI4LWJpdCBpbnRlZ2VyLgogICAgICAgICAgICBpcF9pbnQgPSAwCiAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHBhcnRzX2hpKToKICAgICAgICAgICAgICAgIGlwX2ludCA8PD0gMTYKICAgICAgICAgICAgICAgIGlwX2ludCB8PSBjbHMuX3BhcnNlX2hleHRldChwYXJ0c1tpXSkKICAgICAgICAgICAgaXBfaW50IDw8PSAxNiAqIHBhcnRzX3NraXBwZWQKICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoLXBhcnRzX2xvLCAwKToKICAgICAgICAgICAgICAgIGlwX2ludCA8PD0gMTYKICAgICAgICAgICAgICAgIGlwX2ludCB8PSBjbHMuX3BhcnNlX2hleHRldChwYXJ0c1tpXSkKICAgICAgICAgICAgcmV0dXJuIGlwX2ludAogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yIGFzIGV4YzoKICAgICAgICAgICAgcmFpc2UgQWRkcmVzc1ZhbHVlRXJyb3IoIiVzIGluICVyIiAlIChleGMsIGlwX3N0cikpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX3BhcnNlX2hleHRldChjbHMsIGhleHRldF9zdHIpOgogICAgICAgICIiIkNvbnZlcnQgYW4gSVB2NiBoZXh0ZXQgc3RyaW5nIGludG8gYW4gaW50ZWdlci4KCiAgICAgICAgQXJnczoKICAgICAgICAgICAgaGV4dGV0X3N0cjogQSBzdHJpbmcsIHRoZSBudW1iZXIgdG8gcGFyc2UuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIFRoZSBoZXh0ZXQgYXMgYW4gaW50ZWdlci4KCiAgICAgICAgUmFpc2VzOgogICAgICAgICAgICBWYWx1ZUVycm9yOiBpZiB0aGUgaW5wdXQgaXNuJ3Qgc3RyaWN0bHkgYSBoZXggbnVtYmVyIGZyb20KICAgICAgICAgICAgICBbMC4uRkZGRl0uCgogICAgICAgICIiIgogICAgICAgICMgV2hpdGVsaXN0IHRoZSBjaGFyYWN0ZXJzLCBzaW5jZSBpbnQoKSBhbGxvd3MgYSBsb3Qgb2YgYml6YXJyZSBzdHVmZi4KICAgICAgICBpZiBub3QgY2xzLl9IRVhfRElHSVRTLmlzc3VwZXJzZXQoaGV4dGV0X3N0cik6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIk9ubHkgaGV4IGRpZ2l0cyBwZXJtaXR0ZWQgaW4gJXIiICUgaGV4dGV0X3N0cikKICAgICAgICAjIFdlIGRvIHRoZSBsZW5ndGggY2hlY2sgc2Vjb25kLCBzaW5jZSB0aGUgaW52YWxpZCBjaGFyYWN0ZXIgZXJyb3IKICAgICAgICAjIGlzIGxpa2VseSB0byBiZSBtb3JlIGluZm9ybWF0aXZlIGZvciB0aGUgdXNlcgogICAgICAgIGlmIGxlbihoZXh0ZXRfc3RyKSA+IDQ6CiAgICAgICAgICAgIG1zZyA9ICJBdCBtb3N0IDQgY2hhcmFjdGVycyBwZXJtaXR0ZWQgaW4gJXIiCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IobXNnICUgaGV4dGV0X3N0cikKICAgICAgICAjIExlbmd0aCBjaGVjayBtZWFucyB3ZSBjYW4gc2tpcCBjaGVja2luZyB0aGUgaW50ZWdlciB2YWx1ZQogICAgICAgIHJldHVybiBpbnQoaGV4dGV0X3N0ciwgMTYpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX2NvbXByZXNzX2hleHRldHMoY2xzLCBoZXh0ZXRzKToKICAgICAgICAiIiJDb21wcmVzc2VzIGEgbGlzdCBvZiBoZXh0ZXRzLgoKICAgICAgICBDb21wcmVzc2VzIGEgbGlzdCBvZiBzdHJpbmdzLCByZXBsYWNpbmcgdGhlIGxvbmdlc3QgY29udGludW91cwogICAgICAgIHNlcXVlbmNlIG9mICIwIiBpbiB0aGUgbGlzdCB3aXRoICIiIGFuZCBhZGRpbmcgZW1wdHkgc3RyaW5ncyBhdAogICAgICAgIHRoZSBiZWdpbm5pbmcgb3IgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nIHN1Y2ggdGhhdCBzdWJzZXF1ZW50bHkKICAgICAgICBjYWxsaW5nICI6Ii5qb2luKGhleHRldHMpIHdpbGwgcHJvZHVjZSB0aGUgY29tcHJlc3NlZCB2ZXJzaW9uIG9mCiAgICAgICAgdGhlIElQdjYgYWRkcmVzcy4KCiAgICAgICAgQXJnczoKICAgICAgICAgICAgaGV4dGV0czogQSBsaXN0IG9mIHN0cmluZ3MsIHRoZSBoZXh0ZXRzIHRvIGNvbXByZXNzLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBIGxpc3Qgb2Ygc3RyaW5ncy4KCiAgICAgICAgIiIiCiAgICAgICAgYmVzdF9kb3VibGVjb2xvbl9zdGFydCA9IC0xCiAgICAgICAgYmVzdF9kb3VibGVjb2xvbl9sZW4gPSAwCiAgICAgICAgZG91YmxlY29sb25fc3RhcnQgPSAtMQogICAgICAgIGRvdWJsZWNvbG9uX2xlbiA9IDAKICAgICAgICBmb3IgaW5kZXgsIGhleHRldCBpbiBlbnVtZXJhdGUoaGV4dGV0cyk6CiAgICAgICAgICAgIGlmIGhleHRldCA9PSAnMCc6CiAgICAgICAgICAgICAgICBkb3VibGVjb2xvbl9sZW4gKz0gMQogICAgICAgICAgICAgICAgaWYgZG91YmxlY29sb25fc3RhcnQgPT0gLTE6CiAgICAgICAgICAgICAgICAgICAgIyBTdGFydCBvZiBhIHNlcXVlbmNlIG9mIHplcm9zLgogICAgICAgICAgICAgICAgICAgIGRvdWJsZWNvbG9uX3N0YXJ0ID0gaW5kZXgKICAgICAgICAgICAgICAgIGlmIGRvdWJsZWNvbG9uX2xlbiA+IGJlc3RfZG91YmxlY29sb25fbGVuOgogICAgICAgICAgICAgICAgICAgICMgVGhpcyBpcyB0aGUgbG9uZ2VzdCBzZXF1ZW5jZSBvZiB6ZXJvcyBzbyBmYXIuCiAgICAgICAgICAgICAgICAgICAgYmVzdF9kb3VibGVjb2xvbl9sZW4gPSBkb3VibGVjb2xvbl9sZW4KICAgICAgICAgICAgICAgICAgICBiZXN0X2RvdWJsZWNvbG9uX3N0YXJ0ID0gZG91YmxlY29sb25fc3RhcnQKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGRvdWJsZWNvbG9uX2xlbiA9IDAKICAgICAgICAgICAgICAgIGRvdWJsZWNvbG9uX3N0YXJ0ID0gLTEKCiAgICAgICAgaWYgYmVzdF9kb3VibGVjb2xvbl9sZW4gPiAxOgogICAgICAgICAgICBiZXN0X2RvdWJsZWNvbG9uX2VuZCA9IChiZXN0X2RvdWJsZWNvbG9uX3N0YXJ0ICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF9kb3VibGVjb2xvbl9sZW4pCiAgICAgICAgICAgICMgRm9yIHplcm9zIGF0IHRoZSBlbmQgb2YgdGhlIGFkZHJlc3MuCiAgICAgICAgICAgIGlmIGJlc3RfZG91YmxlY29sb25fZW5kID09IGxlbihoZXh0ZXRzKToKICAgICAgICAgICAgICAgIGhleHRldHMgKz0gWycnXQogICAgICAgICAgICBoZXh0ZXRzW2Jlc3RfZG91YmxlY29sb25fc3RhcnQ6YmVzdF9kb3VibGVjb2xvbl9lbmRdID0gWycnXQogICAgICAgICAgICAjIEZvciB6ZXJvcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhZGRyZXNzLgogICAgICAgICAgICBpZiBiZXN0X2RvdWJsZWNvbG9uX3N0YXJ0ID09IDA6CiAgICAgICAgICAgICAgICBoZXh0ZXRzID0gWycnXSArIGhleHRldHMKCiAgICAgICAgcmV0dXJuIGhleHRldHMKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfc3RyaW5nX2Zyb21faXBfaW50KGNscywgaXBfaW50PU5vbmUpOgogICAgICAgICIiIlR1cm5zIGEgMTI4LWJpdCBpbnRlZ2VyIGludG8gaGV4YWRlY2ltYWwgbm90YXRpb24uCgogICAgICAgIEFyZ3M6CiAgICAgICAgICAgIGlwX2ludDogQW4gaW50ZWdlciwgdGhlIElQIGFkZHJlc3MuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEEgc3RyaW5nLCB0aGUgaGV4YWRlY2ltYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFkZHJlc3MuCgogICAgICAgIFJhaXNlczoKICAgICAgICAgICAgVmFsdWVFcnJvcjogVGhlIGFkZHJlc3MgaXMgYmlnZ2VyIHRoYW4gMTI4IGJpdHMgb2YgYWxsIG9uZXMuCgogICAgICAgICIiIgogICAgICAgIGlmIGlwX2ludCBpcyBOb25lOgogICAgICAgICAgICBpcF9pbnQgPSBpbnQoY2xzLl9pcCkKCiAgICAgICAgaWYgaXBfaW50ID4gY2xzLl9BTExfT05FUzoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignSVB2NiBhZGRyZXNzIGlzIHRvbyBsYXJnZScpCgogICAgICAgIGhleF9zdHIgPSAnJTAzMngnICUgaXBfaW50CiAgICAgICAgaGV4dGV0cyA9IFsnJXgnICUgaW50KGhleF9zdHJbeDp4ICsgNF0sIDE2KSBmb3IgeCBpbiByYW5nZSgwLCAzMiwgNCldCgogICAgICAgIGhleHRldHMgPSBjbHMuX2NvbXByZXNzX2hleHRldHMoaGV4dGV0cykKICAgICAgICByZXR1cm4gJzonLmpvaW4oaGV4dGV0cykKCiAgICBkZWYgX2V4cGxvZGVfc2hvcnRoYW5kX2lwX3N0cmluZyhzZWxmKToKICAgICAgICAiIiJFeHBhbmQgYSBzaG9ydGVuZWQgSVB2NiBhZGRyZXNzLgoKICAgICAgICBBcmdzOgogICAgICAgICAgICBpcF9zdHI6IEEgc3RyaW5nLCB0aGUgSVB2NiBhZGRyZXNzLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBIHN0cmluZywgdGhlIGV4cGFuZGVkIElQdjYgYWRkcmVzcy4KCiAgICAgICAgIiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLCBJUHY2TmV0d29yayk6CiAgICAgICAgICAgIGlwX3N0ciA9IF9jb21wYXRfc3RyKHNlbGYubmV0d29ya19hZGRyZXNzKQogICAgICAgIGVsaWYgaXNpbnN0YW5jZShzZWxmLCBJUHY2SW50ZXJmYWNlKToKICAgICAgICAgICAgaXBfc3RyID0gX2NvbXBhdF9zdHIoc2VsZi5pcCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBpcF9zdHIgPSBfY29tcGF0X3N0cihzZWxmKQoKICAgICAgICBpcF9pbnQgPSBzZWxmLl9pcF9pbnRfZnJvbV9zdHJpbmcoaXBfc3RyKQogICAgICAgIGhleF9zdHIgPSAnJTAzMngnICUgaXBfaW50CiAgICAgICAgcGFydHMgPSBbaGV4X3N0clt4OnggKyA0XSBmb3IgeCBpbiByYW5nZSgwLCAzMiwgNCldCiAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLCAoX0Jhc2VOZXR3b3JrLCBJUHY2SW50ZXJmYWNlKSk6CiAgICAgICAgICAgIHJldHVybiAnJXMvJWQnICUgKCc6Jy5qb2luKHBhcnRzKSwgc2VsZi5fcHJlZml4bGVuKQogICAgICAgIHJldHVybiAnOicuam9pbihwYXJ0cykKCiAgICBkZWYgX3JldmVyc2VfcG9pbnRlcihzZWxmKToKICAgICAgICAiIiJSZXR1cm4gdGhlIHJldmVyc2UgRE5TIHBvaW50ZXIgbmFtZSBmb3IgdGhlIElQdjYgYWRkcmVzcy4KCiAgICAgICAgVGhpcyBpbXBsZW1lbnRzIHRoZSBtZXRob2QgZGVzY3JpYmVkIGluIFJGQzM1OTYgMi41LgoKICAgICAgICAiIiIKICAgICAgICByZXZlcnNlX2NoYXJzID0gc2VsZi5leHBsb2RlZFs6Oi0xXS5yZXBsYWNlKCc6JywgJycpCiAgICAgICAgcmV0dXJuICcuJy5qb2luKHJldmVyc2VfY2hhcnMpICsgJy5pcDYuYXJwYScKCiAgICBAcHJvcGVydHkKICAgIGRlZiBtYXhfcHJlZml4bGVuKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9tYXhfcHJlZml4bGVuCgogICAgQHByb3BlcnR5CiAgICBkZWYgdmVyc2lvbihzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fdmVyc2lvbgoKCmNsYXNzIElQdjZBZGRyZXNzKF9CYXNlVjYsIF9CYXNlQWRkcmVzcyk6CgogICAgIiIiUmVwcmVzZW50IGFuZCBtYW5pcHVsYXRlIHNpbmdsZSBJUHY2IEFkZHJlc3Nlcy4iIiIKCiAgICBfX3Nsb3RzX18gPSAoJ19pcCcsICdfX3dlYWtyZWZfXycpCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGFkZHJlc3MpOgogICAgICAgICIiIkluc3RhbnRpYXRlIGEgbmV3IElQdjYgYWRkcmVzcyBvYmplY3QuCgogICAgICAgIEFyZ3M6CiAgICAgICAgICAgIGFkZHJlc3M6IEEgc3RyaW5nIG9yIGludGVnZXIgcmVwcmVzZW50aW5nIHRoZSBJUAoKICAgICAgICAgICAgICBBZGRpdGlvbmFsbHksIGFuIGludGVnZXIgY2FuIGJlIHBhc3NlZCwgc28KICAgICAgICAgICAgICBJUHY2QWRkcmVzcygnMjAwMTpkYjg6OicpID09CiAgICAgICAgICAgICAgICBJUHY2QWRkcmVzcyg0MjU0MDc2NjQxMTI4MjU5Mjg1NjkwMzk4NDk1MTY1MzgyNjU2MCkKICAgICAgICAgICAgICBvciwgbW9yZSBnZW5lcmFsbHkKICAgICAgICAgICAgICBJUHY2QWRkcmVzcyhpbnQoSVB2NkFkZHJlc3MoJzIwMDE6ZGI4OjonKSkpID09CiAgICAgICAgICAgICAgICBJUHY2QWRkcmVzcygnMjAwMTpkYjg6OicpCgogICAgICAgIFJhaXNlczoKICAgICAgICAgICAgQWRkcmVzc1ZhbHVlRXJyb3I6IElmIGFkZHJlc3MgaXNuJ3QgYSB2YWxpZCBJUHY2IGFkZHJlc3MuCgogICAgICAgICIiIgogICAgICAgICMgRWZmaWNpZW50IGNvbnN0cnVjdG9yIGZyb20gaW50ZWdlci4KICAgICAgICBpZiBpc2luc3RhbmNlKGFkZHJlc3MsIF9jb21wYXRfaW50X3R5cGVzKToKICAgICAgICAgICAgc2VsZi5fY2hlY2tfaW50X2FkZHJlc3MoYWRkcmVzcykKICAgICAgICAgICAgc2VsZi5faXAgPSBhZGRyZXNzCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIENvbnN0cnVjdGluZyBmcm9tIGEgcGFja2VkIGFkZHJlc3MKICAgICAgICBpZiBpc2luc3RhbmNlKGFkZHJlc3MsIGJ5dGVzKToKICAgICAgICAgICAgc2VsZi5fY2hlY2tfcGFja2VkX2FkZHJlc3MoYWRkcmVzcywgMTYpCiAgICAgICAgICAgIGJ2cyA9IF9jb21wYXRfYnl0ZXNfdG9fYnl0ZV92YWxzKGFkZHJlc3MpCiAgICAgICAgICAgIHNlbGYuX2lwID0gX2NvbXBhdF9pbnRfZnJvbV9ieXRlX3ZhbHMoYnZzLCAnYmlnJykKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICMgQXNzdW1lIGlucHV0IGFyZ3VtZW50IHRvIGJlIHN0cmluZyBvciBhbnkgb2JqZWN0IHJlcHJlc2VudGF0aW9uCiAgICAgICAgIyB3aGljaCBjb252ZXJ0cyBpbnRvIGEgZm9ybWF0dGVkIElQIHN0cmluZy4KICAgICAgICBhZGRyX3N0ciA9IF9jb21wYXRfc3RyKGFkZHJlc3MpCiAgICAgICAgaWYgJy8nIGluIGFkZHJfc3RyOgogICAgICAgICAgICByYWlzZSBBZGRyZXNzVmFsdWVFcnJvcigiVW5leHBlY3RlZCAnLycgaW4gJXIiICUgYWRkcmVzcykKICAgICAgICBzZWxmLl9pcCA9IHNlbGYuX2lwX2ludF9mcm9tX3N0cmluZyhhZGRyX3N0cikKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwYWNrZWQoc2VsZik6CiAgICAgICAgIiIiVGhlIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGFkZHJlc3MuIiIiCiAgICAgICAgcmV0dXJuIHY2X2ludF90b19wYWNrZWQoc2VsZi5faXApCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfbXVsdGljYXN0KHNlbGYpOgogICAgICAgICIiIlRlc3QgaWYgdGhlIGFkZHJlc3MgaXMgcmVzZXJ2ZWQgZm9yIG11bHRpY2FzdCB1c2UuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIEEgYm9vbGVhbiwgVHJ1ZSBpZiB0aGUgYWRkcmVzcyBpcyBhIG11bHRpY2FzdCBhZGRyZXNzLgogICAgICAgICAgICBTZWUgUkZDIDIzNzMgMi43IGZvciBkZXRhaWxzLgoKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZiBpbiBzZWxmLl9jb25zdGFudHMuX211bHRpY2FzdF9uZXR3b3JrCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfcmVzZXJ2ZWQoc2VsZik6CiAgICAgICAgIiIiVGVzdCBpZiB0aGUgYWRkcmVzcyBpcyBvdGhlcndpc2UgSUVURiByZXNlcnZlZC4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBib29sZWFuLCBUcnVlIGlmIHRoZSBhZGRyZXNzIGlzIHdpdGhpbiBvbmUgb2YgdGhlCiAgICAgICAgICAgIHJlc2VydmVkIElQdjYgTmV0d29yayByYW5nZXMuCgogICAgICAgICIiIgogICAgICAgIHJldHVybiBhbnkoc2VsZiBpbiB4IGZvciB4IGluIHNlbGYuX2NvbnN0YW50cy5fcmVzZXJ2ZWRfbmV0d29ya3MpCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfbGlua19sb2NhbChzZWxmKToKICAgICAgICAiIiJUZXN0IGlmIHRoZSBhZGRyZXNzIGlzIHJlc2VydmVkIGZvciBsaW5rLWxvY2FsLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBIGJvb2xlYW4sIFRydWUgaWYgdGhlIGFkZHJlc3MgaXMgcmVzZXJ2ZWQgcGVyIFJGQyA0MjkxLgoKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZiBpbiBzZWxmLl9jb25zdGFudHMuX2xpbmtsb2NhbF9uZXR3b3JrCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfc2l0ZV9sb2NhbChzZWxmKToKICAgICAgICAiIiJUZXN0IGlmIHRoZSBhZGRyZXNzIGlzIHJlc2VydmVkIGZvciBzaXRlLWxvY2FsLgoKICAgICAgICBOb3RlIHRoYXQgdGhlIHNpdGUtbG9jYWwgYWRkcmVzcyBzcGFjZSBoYXMgYmVlbiBkZXByZWNhdGVkIGJ5IFJGQyAzODc5LgogICAgICAgIFVzZSBpc19wcml2YXRlIHRvIHRlc3QgaWYgdGhpcyBhZGRyZXNzIGlzIGluIHRoZSBzcGFjZSBvZiB1bmlxdWUgbG9jYWwKICAgICAgICBhZGRyZXNzZXMgYXMgZGVmaW5lZCBieSBSRkMgNDE5My4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBib29sZWFuLCBUcnVlIGlmIHRoZSBhZGRyZXNzIGlzIHJlc2VydmVkIHBlciBSRkMgMzUxMyAyLjUuNi4KCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYgaW4gc2VsZi5fY29uc3RhbnRzLl9zaXRlbG9jYWxfbmV0d29yawoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX3ByaXZhdGUoc2VsZik6CiAgICAgICAgIiIiVGVzdCBpZiB0aGlzIGFkZHJlc3MgaXMgYWxsb2NhdGVkIGZvciBwcml2YXRlIG5ldHdvcmtzLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBBIGJvb2xlYW4sIFRydWUgaWYgdGhlIGFkZHJlc3MgaXMgcmVzZXJ2ZWQgcGVyCiAgICAgICAgICAgIGlhbmEtaXB2Ni1zcGVjaWFsLXJlZ2lzdHJ5LgoKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gYW55KHNlbGYgaW4gbmV0IGZvciBuZXQgaW4gc2VsZi5fY29uc3RhbnRzLl9wcml2YXRlX25ldHdvcmtzKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX2dsb2JhbChzZWxmKToKICAgICAgICAiIiJUZXN0IGlmIHRoaXMgYWRkcmVzcyBpcyBhbGxvY2F0ZWQgZm9yIHB1YmxpYyBuZXR3b3Jrcy4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBib29sZWFuLCB0cnVlIGlmIHRoZSBhZGRyZXNzIGlzIG5vdCByZXNlcnZlZCBwZXIKICAgICAgICAgICAgaWFuYS1pcHY2LXNwZWNpYWwtcmVnaXN0cnkuCgogICAgICAgICIiIgogICAgICAgIHJldHVybiBub3Qgc2VsZi5pc19wcml2YXRlCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfdW5zcGVjaWZpZWQoc2VsZik6CiAgICAgICAgIiIiVGVzdCBpZiB0aGUgYWRkcmVzcyBpcyB1bnNwZWNpZmllZC4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBib29sZWFuLCBUcnVlIGlmIHRoaXMgaXMgdGhlIHVuc3BlY2lmaWVkIGFkZHJlc3MgYXMgZGVmaW5lZCBpbgogICAgICAgICAgICBSRkMgMjM3MyAyLjUuMi4KCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuX2lwID09IDAKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19sb29wYmFjayhzZWxmKToKICAgICAgICAiIiJUZXN0IGlmIHRoZSBhZGRyZXNzIGlzIGEgbG9vcGJhY2sgYWRkcmVzcy4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBib29sZWFuLCBUcnVlIGlmIHRoZSBhZGRyZXNzIGlzIGEgbG9vcGJhY2sgYWRkcmVzcyBhcyBkZWZpbmVkIGluCiAgICAgICAgICAgIFJGQyAyMzczIDIuNS4zLgoKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5faXAgPT0gMQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlwdjRfbWFwcGVkKHNlbGYpOgogICAgICAgICIiIlJldHVybiB0aGUgSVB2NCBtYXBwZWQgYWRkcmVzcy4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgSWYgdGhlIElQdjYgYWRkcmVzcyBpcyBhIHY0IG1hcHBlZCBhZGRyZXNzLCByZXR1cm4gdGhlCiAgICAgICAgICAgIElQdjQgbWFwcGVkIGFkZHJlc3MuIFJldHVybiBOb25lIG90aGVyd2lzZS4KCiAgICAgICAgIiIiCiAgICAgICAgaWYgKHNlbGYuX2lwID4+IDMyKSAhPSAweEZGRkY6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcmV0dXJuIElQdjRBZGRyZXNzKHNlbGYuX2lwICYgMHhGRkZGRkZGRikKCiAgICBAcHJvcGVydHkKICAgIGRlZiB0ZXJlZG8oc2VsZik6CiAgICAgICAgIiIiVHVwbGUgb2YgZW1iZWRkZWQgdGVyZWRvIElQcy4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgVHVwbGUgb2YgdGhlIChzZXJ2ZXIsIGNsaWVudCkgSVBzIG9yIE5vbmUgaWYgdGhlIGFkZHJlc3MKICAgICAgICAgICAgZG9lc24ndCBhcHBlYXIgdG8gYmUgYSB0ZXJlZG8gYWRkcmVzcyAoZG9lc24ndCBzdGFydCB3aXRoCiAgICAgICAgICAgIDIwMDE6Oi8zMikKCiAgICAgICAgIiIiCiAgICAgICAgaWYgKHNlbGYuX2lwID4+IDk2KSAhPSAweDIwMDEwMDAwOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHJldHVybiAoSVB2NEFkZHJlc3MoKHNlbGYuX2lwID4+IDY0KSAmIDB4RkZGRkZGRkYpLAogICAgICAgICAgICAgICAgSVB2NEFkZHJlc3MofnNlbGYuX2lwICYgMHhGRkZGRkZGRikpCgogICAgQHByb3BlcnR5CiAgICBkZWYgc2l4dG9mb3VyKHNlbGYpOgogICAgICAgICIiIlJldHVybiB0aGUgSVB2NCA2dG80IGVtYmVkZGVkIGFkZHJlc3MuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIFRoZSBJUHY0IDZ0bzQtZW1iZWRkZWQgYWRkcmVzcyBpZiBwcmVzZW50IG9yIE5vbmUgaWYgdGhlCiAgICAgICAgICAgIGFkZHJlc3MgZG9lc24ndCBhcHBlYXIgdG8gY29udGFpbiBhIDZ0bzQgZW1iZWRkZWQgYWRkcmVzcy4KCiAgICAgICAgIiIiCiAgICAgICAgaWYgKHNlbGYuX2lwID4+IDExMikgIT0gMHgyMDAyOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHJldHVybiBJUHY0QWRkcmVzcygoc2VsZi5faXAgPj4gODApICYgMHhGRkZGRkZGRikKCgpjbGFzcyBJUHY2SW50ZXJmYWNlKElQdjZBZGRyZXNzKToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgYWRkcmVzcyk6CiAgICAgICAgaWYgaXNpbnN0YW5jZShhZGRyZXNzLCAoYnl0ZXMsIF9jb21wYXRfaW50X3R5cGVzKSk6CiAgICAgICAgICAgIElQdjZBZGRyZXNzLl9faW5pdF9fKHNlbGYsIGFkZHJlc3MpCiAgICAgICAgICAgIHNlbGYubmV0d29yayA9IElQdjZOZXR3b3JrKHNlbGYuX2lwKQogICAgICAgICAgICBzZWxmLl9wcmVmaXhsZW4gPSBzZWxmLl9tYXhfcHJlZml4bGVuCiAgICAgICAgICAgIHJldHVybgogICAgICAgIGlmIGlzaW5zdGFuY2UoYWRkcmVzcywgdHVwbGUpOgogICAgICAgICAgICBJUHY2QWRkcmVzcy5fX2luaXRfXyhzZWxmLCBhZGRyZXNzWzBdKQogICAgICAgICAgICBpZiBsZW4oYWRkcmVzcykgPiAxOgogICAgICAgICAgICAgICAgc2VsZi5fcHJlZml4bGVuID0gaW50KGFkZHJlc3NbMV0pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9wcmVmaXhsZW4gPSBzZWxmLl9tYXhfcHJlZml4bGVuCiAgICAgICAgICAgIHNlbGYubmV0d29yayA9IElQdjZOZXR3b3JrKGFkZHJlc3MsIHN0cmljdD1GYWxzZSkKICAgICAgICAgICAgc2VsZi5uZXRtYXNrID0gc2VsZi5uZXR3b3JrLm5ldG1hc2sKICAgICAgICAgICAgc2VsZi5ob3N0bWFzayA9IHNlbGYubmV0d29yay5ob3N0bWFzawogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgYWRkciA9IF9zcGxpdF9vcHRpb25hbF9uZXRtYXNrKGFkZHJlc3MpCiAgICAgICAgSVB2NkFkZHJlc3MuX19pbml0X18oc2VsZiwgYWRkclswXSkKICAgICAgICBzZWxmLm5ldHdvcmsgPSBJUHY2TmV0d29yayhhZGRyZXNzLCBzdHJpY3Q9RmFsc2UpCiAgICAgICAgc2VsZi5uZXRtYXNrID0gc2VsZi5uZXR3b3JrLm5ldG1hc2sKICAgICAgICBzZWxmLl9wcmVmaXhsZW4gPSBzZWxmLm5ldHdvcmsuX3ByZWZpeGxlbgogICAgICAgIHNlbGYuaG9zdG1hc2sgPSBzZWxmLm5ldHdvcmsuaG9zdG1hc2sKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gJyVzLyVkJyAlIChzZWxmLl9zdHJpbmdfZnJvbV9pcF9pbnQoc2VsZi5faXApLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubmV0d29yay5wcmVmaXhsZW4pCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgYWRkcmVzc19lcXVhbCA9IElQdjZBZGRyZXNzLl9fZXFfXyhzZWxmLCBvdGhlcikKICAgICAgICBpZiBub3QgYWRkcmVzc19lcXVhbCBvciBhZGRyZXNzX2VxdWFsIGlzIE5vdEltcGxlbWVudGVkOgogICAgICAgICAgICByZXR1cm4gYWRkcmVzc19lcXVhbAogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYubmV0d29yayA9PSBvdGhlci5uZXR3b3JrCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICAjIEFuIGludGVyZmFjZSB3aXRoIGFuIGFzc29jaWF0ZWQgbmV0d29yayBpcyBOT1QgdGhlCiAgICAgICAgICAgICMgc2FtZSBhcyBhbiB1bmFzc29jaWF0ZWQgYWRkcmVzcy4gVGhhdCdzIHdoeSB0aGUgaGFzaAogICAgICAgICAgICAjIHRha2VzIHRoZSBleHRyYSBpbmZvIGludG8gYWNjb3VudC4KICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgYWRkcmVzc19sZXNzID0gSVB2NkFkZHJlc3MuX19sdF9fKHNlbGYsIG90aGVyKQogICAgICAgIGlmIGFkZHJlc3NfbGVzcyBpcyBOb3RJbXBsZW1lbnRlZDoKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5uZXR3b3JrIDwgb3RoZXIubmV0d29yawogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgIyBXZSAqZG8qIGFsbG93IGFkZHJlc3NlcyBhbmQgaW50ZXJmYWNlcyB0byBiZSBzb3J0ZWQuIFRoZQogICAgICAgICAgICAjIHVuYXNzb2NpYXRlZCBhZGRyZXNzIGlzIGNvbnNpZGVyZWQgbGVzcyB0aGFuIGFsbCBpbnRlcmZhY2VzLgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2lwIF4gc2VsZi5fcHJlZml4bGVuIF4gaW50KHNlbGYubmV0d29yay5uZXR3b3JrX2FkZHJlc3MpCgogICAgX19yZWR1Y2VfXyA9IF9JUEFkZHJlc3NCYXNlLl9fcmVkdWNlX18KCiAgICBAcHJvcGVydHkKICAgIGRlZiBpcChzZWxmKToKICAgICAgICByZXR1cm4gSVB2NkFkZHJlc3Moc2VsZi5faXApCgogICAgQHByb3BlcnR5CiAgICBkZWYgd2l0aF9wcmVmaXhsZW4oc2VsZik6CiAgICAgICAgcmV0dXJuICclcy8lcycgJSAoc2VsZi5fc3RyaW5nX2Zyb21faXBfaW50KHNlbGYuX2lwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9wcmVmaXhsZW4pCgogICAgQHByb3BlcnR5CiAgICBkZWYgd2l0aF9uZXRtYXNrKHNlbGYpOgogICAgICAgIHJldHVybiAnJXMvJXMnICUgKHNlbGYuX3N0cmluZ19mcm9tX2lwX2ludChzZWxmLl9pcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5uZXRtYXNrKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHdpdGhfaG9zdG1hc2soc2VsZik6CiAgICAgICAgcmV0dXJuICclcy8lcycgJSAoc2VsZi5fc3RyaW5nX2Zyb21faXBfaW50KHNlbGYuX2lwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmhvc3RtYXNrKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX3Vuc3BlY2lmaWVkKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9pcCA9PSAwIGFuZCBzZWxmLm5ldHdvcmsuaXNfdW5zcGVjaWZpZWQKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19sb29wYmFjayhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5faXAgPT0gMSBhbmQgc2VsZi5uZXR3b3JrLmlzX2xvb3BiYWNrCgoKY2xhc3MgSVB2Nk5ldHdvcmsoX0Jhc2VWNiwgX0Jhc2VOZXR3b3JrKToKCiAgICAiIiJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW5kIG1hbmlwdWxhdGVzIDEyOC1iaXQgSVB2NiBuZXR3b3Jrcy4KCiAgICBBdHRyaWJ1dGVzOiBbZXhhbXBsZXMgZm9yIElQdjYoJzIwMDE6ZGI4OjoxMDAwLzEyNCcpXQogICAgICAgIC5uZXR3b3JrX2FkZHJlc3M6IElQdjZBZGRyZXNzKCcyMDAxOmRiODo6MTAwMCcpCiAgICAgICAgLmhvc3RtYXNrOiBJUHY2QWRkcmVzcygnOjpmJykKICAgICAgICAuYnJvYWRjYXN0X2FkZHJlc3M6IElQdjZBZGRyZXNzKCcyMDAxOmRiODo6MTAwZicpCiAgICAgICAgLm5ldG1hc2s6IElQdjZBZGRyZXNzKCdmZmZmOmZmZmY6ZmZmZjpmZmZmOmZmZmY6ZmZmZjpmZmZmOmZmZjAnKQogICAgICAgIC5wcmVmaXhsZW46IDEyNAoKICAgICIiIgoKICAgICMgQ2xhc3MgdG8gdXNlIHdoZW4gY3JlYXRpbmcgYWRkcmVzcyBvYmplY3RzCiAgICBfYWRkcmVzc19jbGFzcyA9IElQdjZBZGRyZXNzCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGFkZHJlc3MsIHN0cmljdD1UcnVlKToKICAgICAgICAiIiJJbnN0YW50aWF0ZSBhIG5ldyBJUHY2IE5ldHdvcmsgb2JqZWN0LgoKICAgICAgICBBcmdzOgogICAgICAgICAgICBhZGRyZXNzOiBBIHN0cmluZyBvciBpbnRlZ2VyIHJlcHJlc2VudGluZyB0aGUgSVB2NiBuZXR3b3JrIG9yIHRoZQogICAgICAgICAgICAgIElQIGFuZCBwcmVmaXgvbmV0bWFzay4KICAgICAgICAgICAgICAnMjAwMTpkYjg6Oi8xMjgnCiAgICAgICAgICAgICAgJzIwMDE6ZGI4OjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwLzEyOCcKICAgICAgICAgICAgICAnMjAwMTpkYjg6OicKICAgICAgICAgICAgICBhcmUgYWxsIGZ1bmN0aW9uYWxseSB0aGUgc2FtZSBpbiBJUHY2LiAgVGhhdCBpcyB0byBzYXksCiAgICAgICAgICAgICAgZmFpbGluZyB0byBwcm92aWRlIGEgc3VibmV0bWFzayB3aWxsIGNyZWF0ZSBhbiBvYmplY3Qgd2l0aAogICAgICAgICAgICAgIGEgbWFzayBvZiAvMTI4LgoKICAgICAgICAgICAgICBBZGRpdGlvbmFsbHksIGFuIGludGVnZXIgY2FuIGJlIHBhc3NlZCwgc28KICAgICAgICAgICAgICBJUHY2TmV0d29yaygnMjAwMTpkYjg6OicpID09CiAgICAgICAgICAgICAgICBJUHY2TmV0d29yayg0MjU0MDc2NjQxMTI4MjU5Mjg1NjkwMzk4NDk1MTY1MzgyNjU2MCkKICAgICAgICAgICAgICBvciwgbW9yZSBnZW5lcmFsbHkKICAgICAgICAgICAgICBJUHY2TmV0d29yayhpbnQoSVB2Nk5ldHdvcmsoJzIwMDE6ZGI4OjonKSkpID09CiAgICAgICAgICAgICAgICBJUHY2TmV0d29yaygnMjAwMTpkYjg6OicpCgogICAgICAgICAgICBzdHJpY3Q6IEEgYm9vbGVhbi4gSWYgdHJ1ZSwgZW5zdXJlIHRoYXQgd2UgaGF2ZSBiZWVuIHBhc3NlZAogICAgICAgICAgICAgIEEgdHJ1ZSBuZXR3b3JrIGFkZHJlc3MsIGVnLCAyMDAxOmRiODo6MTAwMC8xMjQgYW5kIG5vdCBhbgogICAgICAgICAgICAgIElQIGFkZHJlc3Mgb24gYSBuZXR3b3JrLCBlZywgMjAwMTpkYjg6OjEvMTI0LgoKICAgICAgICBSYWlzZXM6CiAgICAgICAgICAgIEFkZHJlc3NWYWx1ZUVycm9yOiBJZiBhZGRyZXNzIGlzbid0IGEgdmFsaWQgSVB2NiBhZGRyZXNzLgogICAgICAgICAgICBOZXRtYXNrVmFsdWVFcnJvcjogSWYgdGhlIG5ldG1hc2sgaXNuJ3QgdmFsaWQgZm9yCiAgICAgICAgICAgICAgYW4gSVB2NiBhZGRyZXNzLgogICAgICAgICAgICBWYWx1ZUVycm9yOiBJZiBzdHJpY3Qgd2FzIFRydWUgYW5kIGEgbmV0d29yayBhZGRyZXNzIHdhcyBub3QKICAgICAgICAgICAgICBzdXBwbGllZC4KCiAgICAgICAgIiIiCiAgICAgICAgX0Jhc2VOZXR3b3JrLl9faW5pdF9fKHNlbGYsIGFkZHJlc3MpCgogICAgICAgICMgRWZmaWNpZW50IGNvbnN0cnVjdG9yIGZyb20gaW50ZWdlciBvciBwYWNrZWQgYWRkcmVzcwogICAgICAgIGlmIGlzaW5zdGFuY2UoYWRkcmVzcywgKGJ5dGVzLCBfY29tcGF0X2ludF90eXBlcykpOgogICAgICAgICAgICBzZWxmLm5ldHdvcmtfYWRkcmVzcyA9IElQdjZBZGRyZXNzKGFkZHJlc3MpCiAgICAgICAgICAgIHNlbGYubmV0bWFzaywgc2VsZi5fcHJlZml4bGVuID0gc2VsZi5fbWFrZV9uZXRtYXNrKAogICAgICAgICAgICAgICAgc2VsZi5fbWF4X3ByZWZpeGxlbikKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGlmIGlzaW5zdGFuY2UoYWRkcmVzcywgdHVwbGUpOgogICAgICAgICAgICBpZiBsZW4oYWRkcmVzcykgPiAxOgogICAgICAgICAgICAgICAgYXJnID0gYWRkcmVzc1sxXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYXJnID0gc2VsZi5fbWF4X3ByZWZpeGxlbgogICAgICAgICAgICBzZWxmLm5ldG1hc2ssIHNlbGYuX3ByZWZpeGxlbiA9IHNlbGYuX21ha2VfbmV0bWFzayhhcmcpCiAgICAgICAgICAgIHNlbGYubmV0d29ya19hZGRyZXNzID0gSVB2NkFkZHJlc3MoYWRkcmVzc1swXSkKICAgICAgICAgICAgcGFja2VkID0gaW50KHNlbGYubmV0d29ya19hZGRyZXNzKQogICAgICAgICAgICBpZiBwYWNrZWQgJiBpbnQoc2VsZi5uZXRtYXNrKSAhPSBwYWNrZWQ6CiAgICAgICAgICAgICAgICBpZiBzdHJpY3Q6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignJXMgaGFzIGhvc3QgYml0cyBzZXQnICUgc2VsZikKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5uZXR3b3JrX2FkZHJlc3MgPSBJUHY2QWRkcmVzcyhwYWNrZWQgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KHNlbGYubmV0bWFzaykpCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIEFzc3VtZSBpbnB1dCBhcmd1bWVudCB0byBiZSBzdHJpbmcgb3IgYW55IG9iamVjdCByZXByZXNlbnRhdGlvbgogICAgICAgICMgd2hpY2ggY29udmVydHMgaW50byBhIGZvcm1hdHRlZCBJUCBwcmVmaXggc3RyaW5nLgogICAgICAgIGFkZHIgPSBfc3BsaXRfb3B0aW9uYWxfbmV0bWFzayhhZGRyZXNzKQoKICAgICAgICBzZWxmLm5ldHdvcmtfYWRkcmVzcyA9IElQdjZBZGRyZXNzKHNlbGYuX2lwX2ludF9mcm9tX3N0cmluZyhhZGRyWzBdKSkKCiAgICAgICAgaWYgbGVuKGFkZHIpID09IDI6CiAgICAgICAgICAgIGFyZyA9IGFkZHJbMV0KICAgICAgICBlbHNlOgogICAgICAgICAgICBhcmcgPSBzZWxmLl9tYXhfcHJlZml4bGVuCiAgICAgICAgc2VsZi5uZXRtYXNrLCBzZWxmLl9wcmVmaXhsZW4gPSBzZWxmLl9tYWtlX25ldG1hc2soYXJnKQoKICAgICAgICBpZiBzdHJpY3Q6CiAgICAgICAgICAgIGlmIChJUHY2QWRkcmVzcyhpbnQoc2VsZi5uZXR3b3JrX2FkZHJlc3MpICYgaW50KHNlbGYubmV0bWFzaykpICE9CiAgICAgICAgICAgICAgICAgICAgc2VsZi5uZXR3b3JrX2FkZHJlc3MpOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignJXMgaGFzIGhvc3QgYml0cyBzZXQnICUgc2VsZikKICAgICAgICBzZWxmLm5ldHdvcmtfYWRkcmVzcyA9IElQdjZBZGRyZXNzKGludChzZWxmLm5ldHdvcmtfYWRkcmVzcykgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KHNlbGYubmV0bWFzaykpCgogICAgICAgIGlmIHNlbGYuX3ByZWZpeGxlbiA9PSAoc2VsZi5fbWF4X3ByZWZpeGxlbiAtIDEpOgogICAgICAgICAgICBzZWxmLmhvc3RzID0gc2VsZi5fX2l0ZXJfXwoKICAgIGRlZiBob3N0cyhzZWxmKToKICAgICAgICAiIiJHZW5lcmF0ZSBJdGVyYXRvciBvdmVyIHVzYWJsZSBob3N0cyBpbiBhIG5ldHdvcmsuCgogICAgICAgICAgVGhpcyBpcyBsaWtlIF9faXRlcl9fIGV4Y2VwdCBpdCBkb2Vzbid0IHJldHVybiB0aGUKICAgICAgICAgIFN1Ym5ldC1Sb3V0ZXIgYW55Y2FzdCBhZGRyZXNzLgoKICAgICAgICAiIiIKICAgICAgICBuZXR3b3JrID0gaW50KHNlbGYubmV0d29ya19hZGRyZXNzKQogICAgICAgIGJyb2FkY2FzdCA9IGludChzZWxmLmJyb2FkY2FzdF9hZGRyZXNzKQogICAgICAgIGZvciB4IGluIF9jb21wYXRfcmFuZ2UobmV0d29yayArIDEsIGJyb2FkY2FzdCArIDEpOgogICAgICAgICAgICB5aWVsZCBzZWxmLl9hZGRyZXNzX2NsYXNzKHgpCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfc2l0ZV9sb2NhbChzZWxmKToKICAgICAgICAiIiJUZXN0IGlmIHRoZSBhZGRyZXNzIGlzIHJlc2VydmVkIGZvciBzaXRlLWxvY2FsLgoKICAgICAgICBOb3RlIHRoYXQgdGhlIHNpdGUtbG9jYWwgYWRkcmVzcyBzcGFjZSBoYXMgYmVlbiBkZXByZWNhdGVkIGJ5IFJGQyAzODc5LgogICAgICAgIFVzZSBpc19wcml2YXRlIHRvIHRlc3QgaWYgdGhpcyBhZGRyZXNzIGlzIGluIHRoZSBzcGFjZSBvZiB1bmlxdWUgbG9jYWwKICAgICAgICBhZGRyZXNzZXMgYXMgZGVmaW5lZCBieSBSRkMgNDE5My4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgQSBib29sZWFuLCBUcnVlIGlmIHRoZSBhZGRyZXNzIGlzIHJlc2VydmVkIHBlciBSRkMgMzUxMyAyLjUuNi4KCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIChzZWxmLm5ldHdvcmtfYWRkcmVzcy5pc19zaXRlX2xvY2FsIGFuZAogICAgICAgICAgICAgICAgc2VsZi5icm9hZGNhc3RfYWRkcmVzcy5pc19zaXRlX2xvY2FsKQoKCmNsYXNzIF9JUHY2Q29uc3RhbnRzKG9iamVjdCk6CgogICAgX2xpbmtsb2NhbF9uZXR3b3JrID0gSVB2Nk5ldHdvcmsoJ2ZlODA6Oi8xMCcpCgogICAgX211bHRpY2FzdF9uZXR3b3JrID0gSVB2Nk5ldHdvcmsoJ2ZmMDA6Oi84JykKCiAgICBfcHJpdmF0ZV9uZXR3b3JrcyA9IFsKICAgICAgICBJUHY2TmV0d29yaygnOjoxLzEyOCcpLAogICAgICAgIElQdjZOZXR3b3JrKCc6Oi8xMjgnKSwKICAgICAgICBJUHY2TmV0d29yaygnOjpmZmZmOjA6MC85NicpLAogICAgICAgIElQdjZOZXR3b3JrKCcxMDA6Oi82NCcpLAogICAgICAgIElQdjZOZXR3b3JrKCcyMDAxOjovMjMnKSwKICAgICAgICBJUHY2TmV0d29yaygnMjAwMToyOjovNDgnKSwKICAgICAgICBJUHY2TmV0d29yaygnMjAwMTpkYjg6Oi8zMicpLAogICAgICAgIElQdjZOZXR3b3JrKCcyMDAxOjEwOjovMjgnKSwKICAgICAgICBJUHY2TmV0d29yaygnZmMwMDo6LzcnKSwKICAgICAgICBJUHY2TmV0d29yaygnZmU4MDo6LzEwJyksCiAgICBdCgogICAgX3Jlc2VydmVkX25ldHdvcmtzID0gWwogICAgICAgIElQdjZOZXR3b3JrKCc6Oi84JyksIElQdjZOZXR3b3JrKCcxMDA6Oi84JyksCiAgICAgICAgSVB2Nk5ldHdvcmsoJzIwMDo6LzcnKSwgSVB2Nk5ldHdvcmsoJzQwMDo6LzYnKSwKICAgICAgICBJUHY2TmV0d29yaygnODAwOjovNScpLCBJUHY2TmV0d29yaygnMTAwMDo6LzQnKSwKICAgICAgICBJUHY2TmV0d29yaygnNDAwMDo6LzMnKSwgSVB2Nk5ldHdvcmsoJzYwMDA6Oi8zJyksCiAgICAgICAgSVB2Nk5ldHdvcmsoJzgwMDA6Oi8zJyksIElQdjZOZXR3b3JrKCdBMDAwOjovMycpLAogICAgICAgIElQdjZOZXR3b3JrKCdDMDAwOjovMycpLCBJUHY2TmV0d29yaygnRTAwMDo6LzQnKSwKICAgICAgICBJUHY2TmV0d29yaygnRjAwMDo6LzUnKSwgSVB2Nk5ldHdvcmsoJ0Y4MDA6Oi82JyksCiAgICAgICAgSVB2Nk5ldHdvcmsoJ0ZFMDA6Oi85JyksCiAgICBdCgogICAgX3NpdGVsb2NhbF9uZXR3b3JrID0gSVB2Nk5ldHdvcmsoJ2ZlYzA6Oi8xMCcpCgoKSVB2NkFkZHJlc3MuX2NvbnN0YW50cyA9IF9JUHY2Q29uc3RhbnRzClBLAwQUAAAAAAAAACEA85kjgJskAACbJAAAMAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9sb2NrZmlsZS9fX2luaXRfXy5weSMgLSotIGNvZGluZzogdXRmLTggLSotCgoiIiIKbG9ja2ZpbGUucHkgLSBQbGF0Zm9ybS1pbmRlcGVuZGVudCBhZHZpc29yeSBmaWxlIGxvY2tzLgoKUmVxdWlyZXMgUHl0aG9uIDIuNSB1bmxlc3MgeW91IGFwcGx5IDIuNC5kaWZmCkxvY2tpbmcgaXMgZG9uZSBvbiBhIHBlci10aHJlYWQgYmFzaXMgaW5zdGVhZCBvZiBhIHBlci1wcm9jZXNzIGJhc2lzLgoKVXNhZ2U6Cgo+Pj4gbG9jayA9IExvY2tGaWxlKCdzb21lZmlsZScpCj4+PiB0cnk6Ci4uLiAgICAgbG9jay5hY3F1aXJlKCkKLi4uIGV4Y2VwdCBBbHJlYWR5TG9ja2VkOgouLi4gICAgIHByaW50ICdzb21lZmlsZScsICdpcyBsb2NrZWQgYWxyZWFkeS4nCi4uLiBleGNlcHQgTG9ja0ZhaWxlZDoKLi4uICAgICBwcmludCAnc29tZWZpbGUnLCAnY2FuXFwndCBiZSBsb2NrZWQuJwouLi4gZWxzZToKLi4uICAgICBwcmludCAnZ290IGxvY2snCmdvdCBsb2NrCj4+PiBwcmludCBsb2NrLmlzX2xvY2tlZCgpClRydWUKPj4+IGxvY2sucmVsZWFzZSgpCgo+Pj4gbG9jayA9IExvY2tGaWxlKCdzb21lZmlsZScpCj4+PiBwcmludCBsb2NrLmlzX2xvY2tlZCgpCkZhbHNlCj4+PiB3aXRoIGxvY2s6Ci4uLiAgICBwcmludCBsb2NrLmlzX2xvY2tlZCgpClRydWUKPj4+IHByaW50IGxvY2suaXNfbG9ja2VkKCkKRmFsc2UKCj4+PiBsb2NrID0gTG9ja0ZpbGUoJ3NvbWVmaWxlJykKPj4+ICMgSXQgaXMgb2theSB0byBsb2NrIHR3aWNlIGZyb20gdGhlIHNhbWUgdGhyZWFkLi4uCj4+PiB3aXRoIGxvY2s6Ci4uLiAgICAgbG9jay5hY3F1aXJlKCkKLi4uCj4+PiAjIFRob3VnaCBubyBjb3VudGVyIGlzIGtlcHQsIHNvIHlvdSBjYW4ndCB1bmxvY2sgbXVsdGlwbGUgdGltZXMuLi4KPj4+IHByaW50IGxvY2suaXNfbG9ja2VkKCkKRmFsc2UKCkV4Y2VwdGlvbnM6CgogICAgRXJyb3IgLSBiYXNlIGNsYXNzIGZvciBvdGhlciBleGNlcHRpb25zCiAgICAgICAgTG9ja0Vycm9yIC0gYmFzZSBjbGFzcyBmb3IgYWxsIGxvY2tpbmcgZXhjZXB0aW9ucwogICAgICAgICAgICBBbHJlYWR5TG9ja2VkIC0gQW5vdGhlciB0aHJlYWQgb3IgcHJvY2VzcyBhbHJlYWR5IGhvbGRzIHRoZSBsb2NrCiAgICAgICAgICAgIExvY2tGYWlsZWQgLSBMb2NrIGZhaWxlZCBmb3Igc29tZSBvdGhlciByZWFzb24KICAgICAgICBVbmxvY2tFcnJvciAtIGJhc2UgY2xhc3MgZm9yIGFsbCB1bmxvY2tpbmcgZXhjZXB0aW9ucwogICAgICAgICAgICBBbHJlYWR5VW5sb2NrZWQgLSBGaWxlIHdhcyBub3QgbG9ja2VkLgogICAgICAgICAgICBOb3RNeUxvY2sgLSBGaWxlIHdhcyBsb2NrZWQgYnV0IG5vdCBieSB0aGUgY3VycmVudCB0aHJlYWQvcHJvY2VzcwoiIiIKCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgZnVuY3Rvb2xzCmltcG9ydCBvcwppbXBvcnQgc29ja2V0CmltcG9ydCB0aHJlYWRpbmcKaW1wb3J0IHdhcm5pbmdzCgojIFdvcmsgd2l0aCBQRVA4IGFuZCBub24tUEVQOCB2ZXJzaW9ucyBvZiB0aHJlYWRpbmcgbW9kdWxlLgppZiBub3QgaGFzYXR0cih0aHJlYWRpbmcsICJjdXJyZW50X3RocmVhZCIpOgogICAgdGhyZWFkaW5nLmN1cnJlbnRfdGhyZWFkID0gdGhyZWFkaW5nLmN1cnJlbnRUaHJlYWQKaWYgbm90IGhhc2F0dHIodGhyZWFkaW5nLlRocmVhZCwgImdldF9uYW1lIik6CiAgICB0aHJlYWRpbmcuVGhyZWFkLmdldF9uYW1lID0gdGhyZWFkaW5nLlRocmVhZC5nZXROYW1lCgpfX2FsbF9fID0gWydFcnJvcicsICdMb2NrRXJyb3InLCAnTG9ja1RpbWVvdXQnLCAnQWxyZWFkeUxvY2tlZCcsCiAgICAgICAgICAgJ0xvY2tGYWlsZWQnLCAnVW5sb2NrRXJyb3InLCAnTm90TG9ja2VkJywgJ05vdE15TG9jaycsCiAgICAgICAgICAgJ0xpbmtGaWxlTG9jaycsICdNa2RpckZpbGVMb2NrJywgJ1NRTGl0ZUZpbGVMb2NrJywKICAgICAgICAgICAnTG9ja0Jhc2UnLCAnbG9ja2VkJ10KCgpjbGFzcyBFcnJvcihFeGNlcHRpb24pOgogICAgIiIiCiAgICBCYXNlIGNsYXNzIGZvciBvdGhlciBleGNlcHRpb25zLgoKICAgID4+PiB0cnk6CiAgICAuLi4gICByYWlzZSBFcnJvcgogICAgLi4uIGV4Y2VwdCBFeGNlcHRpb246CiAgICAuLi4gICBwYXNzCiAgICAiIiIKICAgIHBhc3MKCgpjbGFzcyBMb2NrRXJyb3IoRXJyb3IpOgogICAgIiIiCiAgICBCYXNlIGNsYXNzIGZvciBlcnJvciBhcmlzaW5nIGZyb20gYXR0ZW1wdHMgdG8gYWNxdWlyZSB0aGUgbG9jay4KCiAgICA+Pj4gdHJ5OgogICAgLi4uICAgcmFpc2UgTG9ja0Vycm9yCiAgICAuLi4gZXhjZXB0IEVycm9yOgogICAgLi4uICAgcGFzcwogICAgIiIiCiAgICBwYXNzCgoKY2xhc3MgTG9ja1RpbWVvdXQoTG9ja0Vycm9yKToKICAgICIiIlJhaXNlZCB3aGVuIGxvY2sgY3JlYXRpb24gZmFpbHMgd2l0aGluIGEgdXNlci1kZWZpbmVkIHBlcmlvZCBvZiB0aW1lLgoKICAgID4+PiB0cnk6CiAgICAuLi4gICByYWlzZSBMb2NrVGltZW91dAogICAgLi4uIGV4Y2VwdCBMb2NrRXJyb3I6CiAgICAuLi4gICBwYXNzCiAgICAiIiIKICAgIHBhc3MKCgpjbGFzcyBBbHJlYWR5TG9ja2VkKExvY2tFcnJvcik6CiAgICAiIiJTb21lIG90aGVyIHRocmVhZC9wcm9jZXNzIGlzIGxvY2tpbmcgdGhlIGZpbGUuCgogICAgPj4+IHRyeToKICAgIC4uLiAgIHJhaXNlIEFscmVhZHlMb2NrZWQKICAgIC4uLiBleGNlcHQgTG9ja0Vycm9yOgogICAgLi4uICAgcGFzcwogICAgIiIiCiAgICBwYXNzCgoKY2xhc3MgTG9ja0ZhaWxlZChMb2NrRXJyb3IpOgogICAgIiIiTG9jayBmaWxlIGNyZWF0aW9uIGZhaWxlZCBmb3Igc29tZSBvdGhlciByZWFzb24uCgogICAgPj4+IHRyeToKICAgIC4uLiAgIHJhaXNlIExvY2tGYWlsZWQKICAgIC4uLiBleGNlcHQgTG9ja0Vycm9yOgogICAgLi4uICAgcGFzcwogICAgIiIiCiAgICBwYXNzCgoKY2xhc3MgVW5sb2NrRXJyb3IoRXJyb3IpOgogICAgIiIiCiAgICBCYXNlIGNsYXNzIGZvciBlcnJvcnMgYXJpc2luZyBmcm9tIGF0dGVtcHRzIHRvIHJlbGVhc2UgdGhlIGxvY2suCgogICAgPj4+IHRyeToKICAgIC4uLiAgIHJhaXNlIFVubG9ja0Vycm9yCiAgICAuLi4gZXhjZXB0IEVycm9yOgogICAgLi4uICAgcGFzcwogICAgIiIiCiAgICBwYXNzCgoKY2xhc3MgTm90TG9ja2VkKFVubG9ja0Vycm9yKToKICAgICIiIlJhaXNlZCB3aGVuIGFuIGF0dGVtcHQgaXMgbWFkZSB0byB1bmxvY2sgYW4gdW5sb2NrZWQgZmlsZS4KCiAgICA+Pj4gdHJ5OgogICAgLi4uICAgcmFpc2UgTm90TG9ja2VkCiAgICAuLi4gZXhjZXB0IFVubG9ja0Vycm9yOgogICAgLi4uICAgcGFzcwogICAgIiIiCiAgICBwYXNzCgoKY2xhc3MgTm90TXlMb2NrKFVubG9ja0Vycm9yKToKICAgICIiIlJhaXNlZCB3aGVuIGFuIGF0dGVtcHQgaXMgbWFkZSB0byB1bmxvY2sgYSBmaWxlIHNvbWVvbmUgZWxzZSBsb2NrZWQuCgogICAgPj4+IHRyeToKICAgIC4uLiAgIHJhaXNlIE5vdE15TG9jawogICAgLi4uIGV4Y2VwdCBVbmxvY2tFcnJvcjoKICAgIC4uLiAgIHBhc3MKICAgICIiIgogICAgcGFzcwoKCmNsYXNzIF9TaGFyZWRCYXNlKG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCk6CiAgICAgICAgc2VsZi5wYXRoID0gcGF0aAoKICAgIGRlZiBhY3F1aXJlKHNlbGYsIHRpbWVvdXQ9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgQWNxdWlyZSB0aGUgbG9jay4KCiAgICAgICAgKiBJZiB0aW1lb3V0IGlzIG9taXR0ZWQgKG9yIE5vbmUpLCB3YWl0IGZvcmV2ZXIgdHJ5aW5nIHRvIGxvY2sgdGhlCiAgICAgICAgICBmaWxlLgoKICAgICAgICAqIElmIHRpbWVvdXQgPiAwLCB0cnkgdG8gYWNxdWlyZSB0aGUgbG9jayBmb3IgdGhhdCBtYW55IHNlY29uZHMuICBJZgogICAgICAgICAgdGhlIGxvY2sgcGVyaW9kIGV4cGlyZXMgYW5kIHRoZSBmaWxlIGlzIHN0aWxsIGxvY2tlZCwgcmFpc2UKICAgICAgICAgIExvY2tUaW1lb3V0LgoKICAgICAgICAqIElmIHRpbWVvdXQgPD0gMCwgcmFpc2UgQWxyZWFkeUxvY2tlZCBpbW1lZGlhdGVseSBpZiB0aGUgZmlsZSBpcwogICAgICAgICAgYWxyZWFkeSBsb2NrZWQuCiAgICAgICAgIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWQoImltcGxlbWVudCBpbiBzdWJjbGFzcyIpCgogICAgZGVmIHJlbGVhc2Uoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmVsZWFzZSB0aGUgbG9jay4KCiAgICAgICAgSWYgdGhlIGZpbGUgaXMgbm90IGxvY2tlZCwgcmFpc2UgTm90TG9ja2VkLgogICAgICAgICIiIgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkKCJpbXBsZW1lbnQgaW4gc3ViY2xhc3MiKQoKICAgIGRlZiBfX2VudGVyX18oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgQ29udGV4dCBtYW5hZ2VyIHN1cHBvcnQuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5hY3F1aXJlKCkKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqX2V4Yyk6CiAgICAgICAgIiIiCiAgICAgICAgQ29udGV4dCBtYW5hZ2VyIHN1cHBvcnQuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5yZWxlYXNlKCkKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICI8JXM6ICVyPiIgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYucGF0aCkKCgpjbGFzcyBMb2NrQmFzZShfU2hhcmVkQmFzZSk6CiAgICAiIiJCYXNlIGNsYXNzIGZvciBwbGF0Zm9ybS1zcGVjaWZpYyBsb2NrIGNsYXNzZXMuIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCwgdGhyZWFkZWQ9VHJ1ZSwgdGltZW91dD1Ob25lKToKICAgICAgICAiIiIKICAgICAgICA+Pj4gbG9jayA9IExvY2tCYXNlKCdzb21lZmlsZScpCiAgICAgICAgPj4+IGxvY2sgPSBMb2NrQmFzZSgnc29tZWZpbGUnLCB0aHJlYWRlZD1GYWxzZSkKICAgICAgICAiIiIKICAgICAgICBzdXBlcihMb2NrQmFzZSwgc2VsZikuX19pbml0X18ocGF0aCkKICAgICAgICBzZWxmLmxvY2tfZmlsZSA9IG9zLnBhdGguYWJzcGF0aChwYXRoKSArICIubG9jayIKICAgICAgICBzZWxmLmhvc3RuYW1lID0gc29ja2V0LmdldGhvc3RuYW1lKCkKICAgICAgICBzZWxmLnBpZCA9IG9zLmdldHBpZCgpCiAgICAgICAgaWYgdGhyZWFkZWQ6CiAgICAgICAgICAgIHQgPSB0aHJlYWRpbmcuY3VycmVudF90aHJlYWQoKQogICAgICAgICAgICAjIFRocmVhZCBvYmplY3RzIGluIFB5dGhvbiAyLjQgYW5kIGVhcmxpZXIgZG8gbm90IGhhdmUgaWRlbnQKICAgICAgICAgICAgIyBhdHRycy4gIFdvcm0gYXJvdW5kIHRoYXQuCiAgICAgICAgICAgIGlkZW50ID0gZ2V0YXR0cih0LCAiaWRlbnQiLCBoYXNoKHQpKQogICAgICAgICAgICBzZWxmLnRuYW1lID0gIi0leCIgJSAoaWRlbnQgJiAweGZmZmZmZmZmKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudG5hbWUgPSAiIgogICAgICAgIGRpcm5hbWUgPSBvcy5wYXRoLmRpcm5hbWUoc2VsZi5sb2NrX2ZpbGUpCgogICAgICAgICMgdW5pcXVlIG5hbWUgaXMgbW9zdGx5IGFib3V0IHRoZSBjdXJyZW50IHByb2Nlc3MsIGJ1dCBtdXN0CiAgICAgICAgIyBhbHNvIGNvbnRhaW4gdGhlIHBhdGggLS0gb3RoZXJ3aXNlLCB0d28gYWRqYWNlbnQgbG9ja2VkCiAgICAgICAgIyBmaWxlcyBjb25mbGljdCAob25lIGZpbGUgZ2V0cyBsb2NrZWQsIGNyZWF0aW5nIGxvY2stZmlsZSBhbmQKICAgICAgICAjIHVuaXF1ZSBmaWxlLCB0aGUgb3RoZXIgb25lIGdldHMgbG9ja2VkLCBjcmVhdGluZyBsb2NrLWZpbGUKICAgICAgICAjIGFuZCBvdmVyd3JpdGluZyB0aGUgYWxyZWFkeSBleGlzdGluZyBsb2NrLWZpbGUsIHRoZW4gb25lCiAgICAgICAgIyBnZXRzIHVubG9ja2VkLCBkZWxldGluZyBib3RoIGxvY2stZmlsZSBhbmQgdW5pcXVlIGZpbGUsCiAgICAgICAgIyBmaW5hbGx5IHRoZSBsYXN0IGxvY2sgZXJyb3JzIG91dCB1cG9uIHJlbGVhc2luZy4KICAgICAgICBzZWxmLnVuaXF1ZV9uYW1lID0gb3MucGF0aC5qb2luKGRpcm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMlcy4lcyVzIiAlIChzZWxmLmhvc3RuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50bmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaChzZWxmLnBhdGgpKSkKICAgICAgICBzZWxmLnRpbWVvdXQgPSB0aW1lb3V0CgogICAgZGVmIGlzX2xvY2tlZChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZWxsIHdoZXRoZXIgb3Igbm90IHRoZSBmaWxlIGlzIGxvY2tlZC4KICAgICAgICAiIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZCgiaW1wbGVtZW50IGluIHN1YmNsYXNzIikKCiAgICBkZWYgaV9hbV9sb2NraW5nKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBUcnVlIGlmIHRoaXMgb2JqZWN0IGlzIGxvY2tpbmcgdGhlIGZpbGUuCiAgICAgICAgIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWQoImltcGxlbWVudCBpbiBzdWJjbGFzcyIpCgogICAgZGVmIGJyZWFrX2xvY2soc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmVtb3ZlIGEgbG9jay4gIFVzZWZ1bCBpZiBhIGxvY2tpbmcgdGhyZWFkIGZhaWxlZCB0byB1bmxvY2suCiAgICAgICAgIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWQoImltcGxlbWVudCBpbiBzdWJjbGFzcyIpCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiPCVzOiAlciAtLSAlcj4iICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzZWxmLnVuaXF1ZV9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGF0aCkKCgpkZWYgX2ZsX2hlbHBlcihjbHMsIG1vZCwgKmFyZ3MsICoqa3dkcyk6CiAgICB3YXJuaW5ncy53YXJuKCJJbXBvcnQgZnJvbSAlcyBtb2R1bGUgaW5zdGVhZCBvZiBsb2NrZmlsZSBwYWNrYWdlIiAlIG1vZCwKICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCiAgICAjIFRoaXMgaXMgYSBiaXQgZnVua3ksIGJ1dCBpdCdzIG9ubHkgZm9yIGF3aGlsZS4gIFRoZSB3YXkgdGhlIHVuaXQgdGVzdHMKICAgICMgYXJlIGNvbnN0cnVjdGVkIHRoaXMgZnVuY3Rpb24gd2luZHMgdXAgYXMgYW4gdW5ib3VuZCBtZXRob2QsIHNvIGl0CiAgICAjIGFjdHVhbGx5IHRha2VzIHRocmVlIGFyZ3MsIG5vdCB0d28uICBXZSB3YW50IHRvIHRvc3Mgb3V0IHNlbGYuCiAgICBpZiBub3QgaXNpbnN0YW5jZShhcmdzWzBdLCBzdHIpOgogICAgICAgICMgV2UgYXJlIHRlc3RpbmcsIGF2b2lkIHRoZSBmaXJzdCBhcmcKICAgICAgICBhcmdzID0gYXJnc1sxOl0KICAgIGlmIGxlbihhcmdzKSA9PSAxIGFuZCBub3Qga3dkczoKICAgICAgICBrd2RzWyJ0aHJlYWRlZCJdID0gVHJ1ZQogICAgcmV0dXJuIGNscygqYXJncywgKiprd2RzKQoKCmRlZiBMaW5rRmlsZUxvY2soKmFyZ3MsICoqa3dkcyk6CiAgICAiIiJGYWN0b3J5IGZ1bmN0aW9uIHByb3ZpZGVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KCiAgICBEbyBub3QgdXNlIGluIG5ldyBjb2RlLiAgSW5zdGVhZCwgaW1wb3J0IExpbmtMb2NrRmlsZSBmcm9tIHRoZQogICAgbG9ja2ZpbGUubGlua2xvY2tmaWxlIG1vZHVsZS4KICAgICIiIgogICAgZnJvbSAuIGltcG9ydCBsaW5rbG9ja2ZpbGUKICAgIHJldHVybiBfZmxfaGVscGVyKGxpbmtsb2NrZmlsZS5MaW5rTG9ja0ZpbGUsICJsb2NrZmlsZS5saW5rbG9ja2ZpbGUiLAogICAgICAgICAgICAgICAgICAgICAgKmFyZ3MsICoqa3dkcykKCgpkZWYgTWtkaXJGaWxlTG9jaygqYXJncywgKiprd2RzKToKICAgICIiIkZhY3RvcnkgZnVuY3Rpb24gcHJvdmlkZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgoKICAgIERvIG5vdCB1c2UgaW4gbmV3IGNvZGUuICBJbnN0ZWFkLCBpbXBvcnQgTWtkaXJMb2NrRmlsZSBmcm9tIHRoZQogICAgbG9ja2ZpbGUubWtkaXJsb2NrZmlsZSBtb2R1bGUuCiAgICAiIiIKICAgIGZyb20gLiBpbXBvcnQgbWtkaXJsb2NrZmlsZQogICAgcmV0dXJuIF9mbF9oZWxwZXIobWtkaXJsb2NrZmlsZS5Na2RpckxvY2tGaWxlLCAibG9ja2ZpbGUubWtkaXJsb2NrZmlsZSIsCiAgICAgICAgICAgICAgICAgICAgICAqYXJncywgKiprd2RzKQoKCmRlZiBTUUxpdGVGaWxlTG9jaygqYXJncywgKiprd2RzKToKICAgICIiIkZhY3RvcnkgZnVuY3Rpb24gcHJvdmlkZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgoKICAgIERvIG5vdCB1c2UgaW4gbmV3IGNvZGUuICBJbnN0ZWFkLCBpbXBvcnQgU1FMaXRlTG9ja0ZpbGUgZnJvbSB0aGUKICAgIGxvY2tmaWxlLm1rZGlybG9ja2ZpbGUgbW9kdWxlLgogICAgIiIiCiAgICBmcm9tIC4gaW1wb3J0IHNxbGl0ZWxvY2tmaWxlCiAgICByZXR1cm4gX2ZsX2hlbHBlcihzcWxpdGVsb2NrZmlsZS5TUUxpdGVMb2NrRmlsZSwgImxvY2tmaWxlLnNxbGl0ZWxvY2tmaWxlIiwKICAgICAgICAgICAgICAgICAgICAgICphcmdzLCAqKmt3ZHMpCgoKZGVmIGxvY2tlZChwYXRoLCB0aW1lb3V0PU5vbmUpOgogICAgIiIiRGVjb3JhdG9yIHdoaWNoIGVuYWJsZXMgbG9ja3MgZm9yIGRlY29yYXRlZCBmdW5jdGlvbi4KCiAgICBBcmd1bWVudHM6CiAgICAgLSBwYXRoOiBwYXRoIGZvciBsb2NrZmlsZS4KICAgICAtIHRpbWVvdXQgKG9wdGlvbmFsKTogVGltZW91dCBmb3IgYWNxdWlyaW5nIGxvY2suCgogICAgIFVzYWdlOgogICAgICAgICBAbG9ja2VkKCcvdmFyL3J1bi9teW5hbWUnLCB0aW1lb3V0PTApCiAgICAgICAgIGRlZiBteW5hbWUoLi4uKToKICAgICAgICAgICAgIC4uLgogICAgIiIiCiAgICBkZWYgZGVjb3IoZnVuYyk6CiAgICAgICAgQGZ1bmN0b29scy53cmFwcyhmdW5jKQogICAgICAgIGRlZiB3cmFwcGVyKCphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgICAgIGxvY2sgPSBGaWxlTG9jayhwYXRoLCB0aW1lb3V0PXRpbWVvdXQpCiAgICAgICAgICAgIGxvY2suYWNxdWlyZSgpCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jKCphcmdzLCAqKmt3YXJncykKICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgIGxvY2sucmVsZWFzZSgpCiAgICAgICAgcmV0dXJuIHdyYXBwZXIKICAgIHJldHVybiBkZWNvcgoKCmlmIGhhc2F0dHIob3MsICJsaW5rIik6CiAgICBmcm9tIC4gaW1wb3J0IGxpbmtsb2NrZmlsZSBhcyBfbGxmCiAgICBMb2NrRmlsZSA9IF9sbGYuTGlua0xvY2tGaWxlCmVsc2U6CiAgICBmcm9tIC4gaW1wb3J0IG1rZGlybG9ja2ZpbGUgYXMgX21sZgogICAgTG9ja0ZpbGUgPSBfbWxmLk1rZGlyTG9ja0ZpbGUKCkZpbGVMb2NrID0gTG9ja0ZpbGUKUEsDBBQAAAAAAAAAIQAr3vInXAoAAFwKAAA0AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2xvY2tmaWxlL2xpbmtsb2NrZmlsZS5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgdGltZQppbXBvcnQgb3MKCmZyb20gLiBpbXBvcnQgKExvY2tCYXNlLCBMb2NrRmFpbGVkLCBOb3RMb2NrZWQsIE5vdE15TG9jaywgTG9ja1RpbWVvdXQsCiAgICAgICAgICAgICAgIEFscmVhZHlMb2NrZWQpCgoKY2xhc3MgTGlua0xvY2tGaWxlKExvY2tCYXNlKToKICAgICIiIkxvY2sgYWNjZXNzIHRvIGEgZmlsZSB1c2luZyBhdG9taWMgcHJvcGVydHkgb2YgbGluaygyKS4KCiAgICA+Pj4gbG9jayA9IExpbmtMb2NrRmlsZSgnc29tZWZpbGUnKQogICAgPj4+IGxvY2sgPSBMaW5rTG9ja0ZpbGUoJ3NvbWVmaWxlJywgdGhyZWFkZWQ9RmFsc2UpCiAgICAiIiIKCiAgICBkZWYgYWNxdWlyZShzZWxmLCB0aW1lb3V0PU5vbmUpOgogICAgICAgIHRyeToKICAgICAgICAgICAgb3BlbihzZWxmLnVuaXF1ZV9uYW1lLCAid2IiKS5jbG9zZSgpCiAgICAgICAgZXhjZXB0IElPRXJyb3I6CiAgICAgICAgICAgIHJhaXNlIExvY2tGYWlsZWQoImZhaWxlZCB0byBjcmVhdGUgJXMiICUgc2VsZi51bmlxdWVfbmFtZSkKCiAgICAgICAgdGltZW91dCA9IHRpbWVvdXQgaWYgdGltZW91dCBpcyBub3QgTm9uZSBlbHNlIHNlbGYudGltZW91dAogICAgICAgIGVuZF90aW1lID0gdGltZS50aW1lKCkKICAgICAgICBpZiB0aW1lb3V0IGlzIG5vdCBOb25lIGFuZCB0aW1lb3V0ID4gMDoKICAgICAgICAgICAgZW5kX3RpbWUgKz0gdGltZW91dAoKICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAjIFRyeSBhbmQgY3JlYXRlIGEgaGFyZCBsaW5rIHRvIGl0LgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBvcy5saW5rKHNlbGYudW5pcXVlX25hbWUsIHNlbGYubG9ja19maWxlKQogICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICAgICAgICAgICMgTGluayBjcmVhdGlvbiBmYWlsZWQuICBNYXliZSB3ZSd2ZSBkb3VibGUtbG9ja2VkPwogICAgICAgICAgICAgICAgbmxpbmtzID0gb3Muc3RhdChzZWxmLnVuaXF1ZV9uYW1lKS5zdF9ubGluawogICAgICAgICAgICAgICAgaWYgbmxpbmtzID09IDI6CiAgICAgICAgICAgICAgICAgICAgIyBUaGUgb3JpZ2luYWwgbGluayBwbHVzIHRoZSBvbmUgSSBjcmVhdGVkID09IDIuICBXZSdyZQogICAgICAgICAgICAgICAgICAgICMgZ29vZCB0byBnby4KICAgICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIyBPdGhlcndpc2UgdGhlIGxvY2sgY3JlYXRpb24gZmFpbGVkLgogICAgICAgICAgICAgICAgICAgIGlmIHRpbWVvdXQgaXMgbm90IE5vbmUgYW5kIHRpbWUudGltZSgpID4gZW5kX3RpbWU6CiAgICAgICAgICAgICAgICAgICAgICAgIG9zLnVubGluayhzZWxmLnVuaXF1ZV9uYW1lKQogICAgICAgICAgICAgICAgICAgICAgICBpZiB0aW1lb3V0ID4gMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIExvY2tUaW1lb3V0KCJUaW1lb3V0IHdhaXRpbmcgdG8gYWNxdWlyZSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgbG9jayBmb3IgJXMiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGF0aCkKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEFscmVhZHlMb2NrZWQoIiVzIGlzIGFscmVhZHkgbG9ja2VkIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGF0aCkKICAgICAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKHRpbWVvdXQgaXMgbm90IE5vbmUgYW5kIHRpbWVvdXQgLyAxMCBvciAwLjEpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIExpbmsgY3JlYXRpb24gc3VjY2VlZGVkLiAgV2UncmUgZ29vZCB0byBnby4KICAgICAgICAgICAgICAgIHJldHVybgoKICAgIGRlZiByZWxlYXNlKHNlbGYpOgogICAgICAgIGlmIG5vdCBzZWxmLmlzX2xvY2tlZCgpOgogICAgICAgICAgICByYWlzZSBOb3RMb2NrZWQoIiVzIGlzIG5vdCBsb2NrZWQiICUgc2VsZi5wYXRoKQogICAgICAgIGVsaWYgbm90IG9zLnBhdGguZXhpc3RzKHNlbGYudW5pcXVlX25hbWUpOgogICAgICAgICAgICByYWlzZSBOb3RNeUxvY2soIiVzIGlzIGxvY2tlZCwgYnV0IG5vdCBieSBtZSIgJSBzZWxmLnBhdGgpCiAgICAgICAgb3MudW5saW5rKHNlbGYudW5pcXVlX25hbWUpCiAgICAgICAgb3MudW5saW5rKHNlbGYubG9ja19maWxlKQoKICAgIGRlZiBpc19sb2NrZWQoc2VsZik6CiAgICAgICAgcmV0dXJuIG9zLnBhdGguZXhpc3RzKHNlbGYubG9ja19maWxlKQoKICAgIGRlZiBpX2FtX2xvY2tpbmcoc2VsZik6CiAgICAgICAgcmV0dXJuIChzZWxmLmlzX2xvY2tlZCgpIGFuZAogICAgICAgICAgICAgICAgb3MucGF0aC5leGlzdHMoc2VsZi51bmlxdWVfbmFtZSkgYW5kCiAgICAgICAgICAgICAgICBvcy5zdGF0KHNlbGYudW5pcXVlX25hbWUpLnN0X25saW5rID09IDIpCgogICAgZGVmIGJyZWFrX2xvY2soc2VsZik6CiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc2VsZi5sb2NrX2ZpbGUpOgogICAgICAgICAgICBvcy51bmxpbmsoc2VsZi5sb2NrX2ZpbGUpClBLAwQUAAAAAAAAACEAISa8fhgMAAAYDAAANQAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9sb2NrZmlsZS9ta2RpcmxvY2tmaWxlLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uCgppbXBvcnQgdGltZQppbXBvcnQgb3MKaW1wb3J0IHN5cwppbXBvcnQgZXJybm8KCmZyb20gLiBpbXBvcnQgKExvY2tCYXNlLCBMb2NrRmFpbGVkLCBOb3RMb2NrZWQsIE5vdE15TG9jaywgTG9ja1RpbWVvdXQsCiAgICAgICAgICAgICAgIEFscmVhZHlMb2NrZWQpCgoKY2xhc3MgTWtkaXJMb2NrRmlsZShMb2NrQmFzZSk6CiAgICAiIiJMb2NrIGZpbGUgYnkgY3JlYXRpbmcgYSBkaXJlY3RvcnkuIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCwgdGhyZWFkZWQ9VHJ1ZSwgdGltZW91dD1Ob25lKToKICAgICAgICAiIiIKICAgICAgICA+Pj4gbG9jayA9IE1rZGlyTG9ja0ZpbGUoJ3NvbWVmaWxlJykKICAgICAgICA+Pj4gbG9jayA9IE1rZGlyTG9ja0ZpbGUoJ3NvbWVmaWxlJywgdGhyZWFkZWQ9RmFsc2UpCiAgICAgICAgIiIiCiAgICAgICAgTG9ja0Jhc2UuX19pbml0X18oc2VsZiwgcGF0aCwgdGhyZWFkZWQsIHRpbWVvdXQpCiAgICAgICAgIyBMb2NrIGZpbGUgaXRzZWxmIGlzIGEgZGlyZWN0b3J5LiAgUGxhY2UgdGhlIHVuaXF1ZSBmaWxlIG5hbWUgaW50bwogICAgICAgICMgaXQuCiAgICAgICAgc2VsZi51bmlxdWVfbmFtZSA9IG9zLnBhdGguam9pbihzZWxmLmxvY2tfZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcy4lcyVzIiAlIChzZWxmLmhvc3RuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5waWQpKQoKICAgIGRlZiBhY3F1aXJlKHNlbGYsIHRpbWVvdXQ9Tm9uZSk6CiAgICAgICAgdGltZW91dCA9IHRpbWVvdXQgaWYgdGltZW91dCBpcyBub3QgTm9uZSBlbHNlIHNlbGYudGltZW91dAogICAgICAgIGVuZF90aW1lID0gdGltZS50aW1lKCkKICAgICAgICBpZiB0aW1lb3V0IGlzIG5vdCBOb25lIGFuZCB0aW1lb3V0ID4gMDoKICAgICAgICAgICAgZW5kX3RpbWUgKz0gdGltZW91dAoKICAgICAgICBpZiB0aW1lb3V0IGlzIE5vbmU6CiAgICAgICAgICAgIHdhaXQgPSAwLjEKICAgICAgICBlbHNlOgogICAgICAgICAgICB3YWl0ID0gbWF4KDAsIHRpbWVvdXQgLyAxMCkKCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgb3MubWtkaXIoc2VsZi5sb2NrX2ZpbGUpCiAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgICAgICAgICAgZXJyID0gc3lzLmV4Y19pbmZvKClbMV0KICAgICAgICAgICAgICAgIGlmIGVyci5lcnJubyA9PSBlcnJuby5FRVhJU1Q6CiAgICAgICAgICAgICAgICAgICAgIyBBbHJlYWR5IGxvY2tlZC4KICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLnVuaXF1ZV9uYW1lKToKICAgICAgICAgICAgICAgICAgICAgICAgIyBBbHJlYWR5IGxvY2tlZCBieSBtZS4KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICAgICAgaWYgdGltZW91dCBpcyBub3QgTm9uZSBhbmQgdGltZS50aW1lKCkgPiBlbmRfdGltZToKICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGltZW91dCA+IDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBMb2NrVGltZW91dCgiVGltZW91dCB3YWl0aW5nIHRvIGFjcXVpcmUiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGxvY2sgZm9yICVzIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFNvbWVvbmUgZWxzZSBoYXMgdGhlIGxvY2suCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBBbHJlYWR5TG9ja2VkKCIlcyBpcyBhbHJlYWR5IGxvY2tlZCIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhdGgpCiAgICAgICAgICAgICAgICAgICAgdGltZS5zbGVlcCh3YWl0KQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAjIENvdWxkbid0IGNyZWF0ZSB0aGUgbG9jayBmb3Igc29tZSBvdGhlciByZWFzb24KICAgICAgICAgICAgICAgICAgICByYWlzZSBMb2NrRmFpbGVkKCJmYWlsZWQgdG8gY3JlYXRlICVzIiAlIHNlbGYubG9ja19maWxlKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgb3BlbihzZWxmLnVuaXF1ZV9uYW1lLCAid2IiKS5jbG9zZSgpCiAgICAgICAgICAgICAgICByZXR1cm4KCiAgICBkZWYgcmVsZWFzZShzZWxmKToKICAgICAgICBpZiBub3Qgc2VsZi5pc19sb2NrZWQoKToKICAgICAgICAgICAgcmFpc2UgTm90TG9ja2VkKCIlcyBpcyBub3QgbG9ja2VkIiAlIHNlbGYucGF0aCkKICAgICAgICBlbGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLnVuaXF1ZV9uYW1lKToKICAgICAgICAgICAgcmFpc2UgTm90TXlMb2NrKCIlcyBpcyBsb2NrZWQsIGJ1dCBub3QgYnkgbWUiICUgc2VsZi5wYXRoKQogICAgICAgIG9zLnVubGluayhzZWxmLnVuaXF1ZV9uYW1lKQogICAgICAgIG9zLnJtZGlyKHNlbGYubG9ja19maWxlKQoKICAgIGRlZiBpc19sb2NrZWQoc2VsZik6CiAgICAgICAgcmV0dXJuIG9zLnBhdGguZXhpc3RzKHNlbGYubG9ja19maWxlKQoKICAgIGRlZiBpX2FtX2xvY2tpbmcoc2VsZik6CiAgICAgICAgcmV0dXJuIChzZWxmLmlzX2xvY2tlZCgpIGFuZAogICAgICAgICAgICAgICAgb3MucGF0aC5leGlzdHMoc2VsZi51bmlxdWVfbmFtZSkpCgogICAgZGVmIGJyZWFrX2xvY2soc2VsZik6CiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc2VsZi5sb2NrX2ZpbGUpOgogICAgICAgICAgICBmb3IgbmFtZSBpbiBvcy5saXN0ZGlyKHNlbGYubG9ja19maWxlKToKICAgICAgICAgICAgICAgIG9zLnVubGluayhvcy5wYXRoLmpvaW4oc2VsZi5sb2NrX2ZpbGUsIG5hbWUpKQogICAgICAgICAgICBvcy5ybWRpcihzZWxmLmxvY2tfZmlsZSkKUEsDBBQAAAAAAAAAIQAgPHItyhcAAMoXAAAzAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2xvY2tmaWxlL3BpZGxvY2tmaWxlLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KCiMgcGlkbG9ja2ZpbGUucHkKIwojIENvcHlyaWdodCDCqSAyMDA44oCTMjAwOSBCZW4gRmlubmV5IDxiZW4rcHl0aG9uQGJlbmZpbm5leS5pZC5hdT4KIwojIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTogeW91IG1heSBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgd29yawojIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24gTGljZW5zZSwgdmVyc2lvbiAyIG9yCiMgbGF0ZXIgYXMgcHVibGlzaGVkIGJ5IHRoZSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbi4KIyBObyB3YXJyYW50eSBleHByZXNzZWQgb3IgaW1wbGllZC4gU2VlIHRoZSBmaWxlIExJQ0VOU0UuUFNGLTIgZm9yIGRldGFpbHMuCgoiIiIgTG9ja2ZpbGUgYmVoYXZpb3VyIGltcGxlbWVudGVkIHZpYSBVbml4IFBJRCBmaWxlcy4KICAgICIiIgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBlcnJubwppbXBvcnQgb3MKaW1wb3J0IHRpbWUKCmZyb20gLiBpbXBvcnQgKExvY2tCYXNlLCBBbHJlYWR5TG9ja2VkLCBMb2NrRmFpbGVkLCBOb3RMb2NrZWQsIE5vdE15TG9jaywKICAgICAgICAgICAgICAgTG9ja1RpbWVvdXQpCgoMCmNsYXNzIFBJRExvY2tGaWxlKExvY2tCYXNlKToKICAgICIiIiBMb2NrZmlsZSBpbXBsZW1lbnRlZCBhcyBhIFVuaXggUElEIGZpbGUuCgogICAgVGhlIGxvY2sgZmlsZSBpcyBhIG5vcm1hbCBmaWxlIG5hbWVkIGJ5IHRoZSBhdHRyaWJ1dGUgYHBhdGhgLgogICAgQSBsb2NrJ3MgUElEIGZpbGUgY29udGFpbnMgYSBzaW5nbGUgbGluZSBvZiB0ZXh0LCBjb250YWluaW5nCiAgICB0aGUgcHJvY2VzcyBJRCAoUElEKSBvZiB0aGUgcHJvY2VzcyB0aGF0IGFjcXVpcmVkIHRoZSBsb2NrLgoKICAgID4+PiBsb2NrID0gUElETG9ja0ZpbGUoJ3NvbWVmaWxlJykKICAgID4+PiBsb2NrID0gUElETG9ja0ZpbGUoJ3NvbWVmaWxlJykKICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoLCB0aHJlYWRlZD1GYWxzZSwgdGltZW91dD1Ob25lKToKICAgICAgICAjIHBpZCBsb2NrZmlsZXMgZG9uJ3Qgc3VwcG9ydCB0aHJlYWRlZCBvcGVyYXRpb24sIHNvIGFsd2F5cyBmb3JjZQogICAgICAgICMgRmFsc2UgYXMgdGhlIHRocmVhZGVkIGFyZy4KICAgICAgICBMb2NrQmFzZS5fX2luaXRfXyhzZWxmLCBwYXRoLCBGYWxzZSwgdGltZW91dCkKICAgICAgICBzZWxmLnVuaXF1ZV9uYW1lID0gc2VsZi5wYXRoCgogICAgZGVmIHJlYWRfcGlkKHNlbGYpOgogICAgICAgICIiIiBHZXQgdGhlIFBJRCBmcm9tIHRoZSBsb2NrIGZpbGUuCiAgICAgICAgICAgICIiIgogICAgICAgIHJldHVybiByZWFkX3BpZF9mcm9tX3BpZGZpbGUoc2VsZi5wYXRoKQoKICAgIGRlZiBpc19sb2NrZWQoc2VsZik6CiAgICAgICAgIiIiIFRlc3QgaWYgdGhlIGxvY2sgaXMgY3VycmVudGx5IGhlbGQuCgogICAgICAgICAgICBUaGUgbG9jayBpcyBoZWxkIGlmIHRoZSBQSUQgZmlsZSBmb3IgdGhpcyBsb2NrIGV4aXN0cy4KCiAgICAgICAgICAgICIiIgogICAgICAgIHJldHVybiBvcy5wYXRoLmV4aXN0cyhzZWxmLnBhdGgpCgogICAgZGVmIGlfYW1fbG9ja2luZyhzZWxmKToKICAgICAgICAiIiIgVGVzdCBpZiB0aGUgbG9jayBpcyBoZWxkIGJ5IHRoZSBjdXJyZW50IHByb2Nlc3MuCgogICAgICAgIFJldHVybnMgYGBUcnVlYGAgaWYgdGhlIGN1cnJlbnQgcHJvY2VzcyBJRCBtYXRjaGVzIHRoZQogICAgICAgIG51bWJlciBzdG9yZWQgaW4gdGhlIFBJRCBmaWxlLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLmlzX2xvY2tlZCgpIGFuZCBvcy5nZXRwaWQoKSA9PSBzZWxmLnJlYWRfcGlkKCkKCiAgICBkZWYgYWNxdWlyZShzZWxmLCB0aW1lb3V0PU5vbmUpOgogICAgICAgICIiIiBBY3F1aXJlIHRoZSBsb2NrLgoKICAgICAgICBDcmVhdGVzIHRoZSBQSUQgZmlsZSBmb3IgdGhpcyBsb2NrLCBvciByYWlzZXMgYW4gZXJyb3IgaWYKICAgICAgICB0aGUgbG9jayBjb3VsZCBub3QgYmUgYWNxdWlyZWQuCiAgICAgICAgIiIiCgogICAgICAgIHRpbWVvdXQgPSB0aW1lb3V0IGlmIHRpbWVvdXQgaXMgbm90IE5vbmUgZWxzZSBzZWxmLnRpbWVvdXQKICAgICAgICBlbmRfdGltZSA9IHRpbWUudGltZSgpCiAgICAgICAgaWYgdGltZW91dCBpcyBub3QgTm9uZSBhbmQgdGltZW91dCA+IDA6CiAgICAgICAgICAgIGVuZF90aW1lICs9IHRpbWVvdXQKCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgd3JpdGVfcGlkX3RvX3BpZGZpbGUoc2VsZi5wYXRoKQogICAgICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBleGM6CiAgICAgICAgICAgICAgICBpZiBleGMuZXJybm8gPT0gZXJybm8uRUVYSVNUOgogICAgICAgICAgICAgICAgICAgICMgVGhlIGxvY2sgY3JlYXRpb24gZmFpbGVkLiAgTWF5YmUgc2xlZXAgYSBiaXQuCiAgICAgICAgICAgICAgICAgICAgaWYgdGltZS50aW1lKCkgPiBlbmRfdGltZToKICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGltZW91dCBpcyBub3QgTm9uZSBhbmQgdGltZW91dCA+IDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBMb2NrVGltZW91dCgiVGltZW91dCB3YWl0aW5nIHRvIGFjcXVpcmUiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGxvY2sgZm9yICVzIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBBbHJlYWR5TG9ja2VkKCIlcyBpcyBhbHJlYWR5IGxvY2tlZCIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhdGgpCiAgICAgICAgICAgICAgICAgICAgdGltZS5zbGVlcCh0aW1lb3V0IGlzIG5vdCBOb25lIGFuZCB0aW1lb3V0IC8gMTAgb3IgMC4xKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICByYWlzZSBMb2NrRmFpbGVkKCJmYWlsZWQgdG8gY3JlYXRlICVzIiAlIHNlbGYucGF0aCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybgoKICAgIGRlZiByZWxlYXNlKHNlbGYpOgogICAgICAgICIiIiBSZWxlYXNlIHRoZSBsb2NrLgoKICAgICAgICAgICAgUmVtb3ZlcyB0aGUgUElEIGZpbGUgdG8gcmVsZWFzZSB0aGUgbG9jaywgb3IgcmFpc2VzIGFuCiAgICAgICAgICAgIGVycm9yIGlmIHRoZSBjdXJyZW50IHByb2Nlc3MgZG9lcyBub3QgaG9sZCB0aGUgbG9jay4KCiAgICAgICAgICAgICIiIgogICAgICAgIGlmIG5vdCBzZWxmLmlzX2xvY2tlZCgpOgogICAgICAgICAgICByYWlzZSBOb3RMb2NrZWQoIiVzIGlzIG5vdCBsb2NrZWQiICUgc2VsZi5wYXRoKQogICAgICAgIGlmIG5vdCBzZWxmLmlfYW1fbG9ja2luZygpOgogICAgICAgICAgICByYWlzZSBOb3RNeUxvY2soIiVzIGlzIGxvY2tlZCwgYnV0IG5vdCBieSBtZSIgJSBzZWxmLnBhdGgpCiAgICAgICAgcmVtb3ZlX2V4aXN0aW5nX3BpZGZpbGUoc2VsZi5wYXRoKQoKICAgIGRlZiBicmVha19sb2NrKHNlbGYpOgogICAgICAgICIiIiBCcmVhayBhbiBleGlzdGluZyBsb2NrLgoKICAgICAgICAgICAgUmVtb3ZlcyB0aGUgUElEIGZpbGUgaWYgaXQgYWxyZWFkeSBleGlzdHMsIG90aGVyd2lzZSBkb2VzCiAgICAgICAgICAgIG5vdGhpbmcuCgogICAgICAgICAgICAiIiIKICAgICAgICByZW1vdmVfZXhpc3RpbmdfcGlkZmlsZShzZWxmLnBhdGgpCgoKZGVmIHJlYWRfcGlkX2Zyb21fcGlkZmlsZShwaWRmaWxlX3BhdGgpOgogICAgIiIiIFJlYWQgdGhlIFBJRCByZWNvcmRlZCBpbiB0aGUgbmFtZWQgUElEIGZpbGUuCgogICAgICAgIFJlYWQgYW5kIHJldHVybiB0aGUgbnVtZXJpYyBQSUQgcmVjb3JkZWQgYXMgdGV4dCBpbiB0aGUgbmFtZWQKICAgICAgICBQSUQgZmlsZS4gSWYgdGhlIFBJRCBmaWxlIGNhbm5vdCBiZSByZWFkLCBvciBpZiB0aGUgY29udGVudCBpcwogICAgICAgIG5vdCBhIHZhbGlkIFBJRCwgcmV0dXJuIGBgTm9uZWBgLgoKICAgICAgICAiIiIKICAgIHBpZCA9IE5vbmUKICAgIHRyeToKICAgICAgICBwaWRmaWxlID0gb3BlbihwaWRmaWxlX3BhdGgsICdyJykKICAgIGV4Y2VwdCBJT0Vycm9yOgogICAgICAgIHBhc3MKICAgIGVsc2U6CiAgICAgICAgIyBBY2NvcmRpbmcgdG8gdGhlIEZIUyAyLjMgc2VjdGlvbiBvbiBQSUQgZmlsZXMgaW4gL3Zhci9ydW46CiAgICAgICAgIwogICAgICAgICMgICBUaGUgZmlsZSBtdXN0IGNvbnNpc3Qgb2YgdGhlIHByb2Nlc3MgaWRlbnRpZmllciBpbgogICAgICAgICMgICBBU0NJSS1lbmNvZGVkIGRlY2ltYWwsIGZvbGxvd2VkIGJ5IGEgbmV3bGluZSBjaGFyYWN0ZXIuCiAgICAgICAgIwogICAgICAgICMgICBQcm9ncmFtcyB0aGF0IHJlYWQgUElEIGZpbGVzIHNob3VsZCBiZSBzb21ld2hhdCBmbGV4aWJsZQogICAgICAgICMgICBpbiB3aGF0IHRoZXkgYWNjZXB0OyBpLmUuLCB0aGV5IHNob3VsZCBpZ25vcmUgZXh0cmEKICAgICAgICAjICAgd2hpdGVzcGFjZSwgbGVhZGluZyB6ZXJvZXMsIGFic2VuY2Ugb2YgdGhlIHRyYWlsaW5nCiAgICAgICAgIyAgIG5ld2xpbmUsIG9yIGFkZGl0aW9uYWwgbGluZXMgaW4gdGhlIFBJRCBmaWxlLgoKICAgICAgICBsaW5lID0gcGlkZmlsZS5yZWFkbGluZSgpLnN0cmlwKCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIHBpZCA9IGludChsaW5lKQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICBwYXNzCiAgICAgICAgcGlkZmlsZS5jbG9zZSgpCgogICAgcmV0dXJuIHBpZAoKCmRlZiB3cml0ZV9waWRfdG9fcGlkZmlsZShwaWRmaWxlX3BhdGgpOgogICAgIiIiIFdyaXRlIHRoZSBQSUQgaW4gdGhlIG5hbWVkIFBJRCBmaWxlLgoKICAgICAgICBHZXQgdGhlIG51bWVyaWMgcHJvY2VzcyBJRCAo4oCcUElE4oCdKSBvZiB0aGUgY3VycmVudCBwcm9jZXNzCiAgICAgICAgYW5kIHdyaXRlIGl0IHRvIHRoZSBuYW1lZCBmaWxlIGFzIGEgbGluZSBvZiB0ZXh0LgoKICAgICAgICAiIiIKICAgIG9wZW5fZmxhZ3MgPSAob3MuT19DUkVBVCB8IG9zLk9fRVhDTCB8IG9zLk9fV1JPTkxZKQogICAgb3Blbl9tb2RlID0gMG82NDQKICAgIHBpZGZpbGVfZmQgPSBvcy5vcGVuKHBpZGZpbGVfcGF0aCwgb3Blbl9mbGFncywgb3Blbl9tb2RlKQogICAgcGlkZmlsZSA9IG9zLmZkb3BlbihwaWRmaWxlX2ZkLCAndycpCgogICAgIyBBY2NvcmRpbmcgdG8gdGhlIEZIUyAyLjMgc2VjdGlvbiBvbiBQSUQgZmlsZXMgaW4gL3Zhci9ydW46CiAgICAjCiAgICAjICAgVGhlIGZpbGUgbXVzdCBjb25zaXN0IG9mIHRoZSBwcm9jZXNzIGlkZW50aWZpZXIgaW4KICAgICMgICBBU0NJSS1lbmNvZGVkIGRlY2ltYWwsIGZvbGxvd2VkIGJ5IGEgbmV3bGluZSBjaGFyYWN0ZXIuIEZvcgogICAgIyAgIGV4YW1wbGUsIGlmIGNyb25kIHdhcyBwcm9jZXNzIG51bWJlciAyNSwgL3Zhci9ydW4vY3JvbmQucGlkCiAgICAjICAgd291bGQgY29udGFpbiB0aHJlZSBjaGFyYWN0ZXJzOiB0d28sIGZpdmUsIGFuZCBuZXdsaW5lLgoKICAgIHBpZCA9IG9zLmdldHBpZCgpCiAgICBwaWRmaWxlLndyaXRlKCIlc1xuIiAlIHBpZCkKICAgIHBpZGZpbGUuY2xvc2UoKQoKCmRlZiByZW1vdmVfZXhpc3RpbmdfcGlkZmlsZShwaWRmaWxlX3BhdGgpOgogICAgIiIiIFJlbW92ZSB0aGUgbmFtZWQgUElEIGZpbGUgaWYgaXQgZXhpc3RzLgoKICAgICAgICBSZW1vdmluZyBhIFBJRCBmaWxlIHRoYXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0IHB1dHMgdXMgaW4gdGhlCiAgICAgICAgZGVzaXJlZCBzdGF0ZSwgc28gd2UgaWdub3JlIHRoZSBjb25kaXRpb24gaWYgdGhlIGZpbGUgZG9lcyBub3QKICAgICAgICBleGlzdC4KCiAgICAgICAgIiIiCiAgICB0cnk6CiAgICAgICAgb3MucmVtb3ZlKHBpZGZpbGVfcGF0aCkKICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGV4YzoKICAgICAgICBpZiBleGMuZXJybm8gPT0gZXJybm8uRU5PRU5UOgogICAgICAgICAgICBwYXNzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UKUEsDBBQAAAAAAAAAIQC7hfC9ghUAAIIVAAA2AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2xvY2tmaWxlL3NxbGl0ZWxvY2tmaWxlLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uCgppbXBvcnQgdGltZQppbXBvcnQgb3MKCnRyeToKICAgIHVuaWNvZGUKZXhjZXB0IE5hbWVFcnJvcjoKICAgIHVuaWNvZGUgPSBzdHIKCmZyb20gLiBpbXBvcnQgTG9ja0Jhc2UsIE5vdExvY2tlZCwgTm90TXlMb2NrLCBMb2NrVGltZW91dCwgQWxyZWFkeUxvY2tlZAoKCmNsYXNzIFNRTGl0ZUxvY2tGaWxlKExvY2tCYXNlKToKICAgICJEZW1vbnN0cmF0ZSBTUUwtYmFzZWQgbG9ja2luZy4iCgogICAgdGVzdGRiID0gTm9uZQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoLCB0aHJlYWRlZD1UcnVlLCB0aW1lb3V0PU5vbmUpOgogICAgICAgICIiIgogICAgICAgID4+PiBsb2NrID0gU1FMaXRlTG9ja0ZpbGUoJ3NvbWVmaWxlJykKICAgICAgICA+Pj4gbG9jayA9IFNRTGl0ZUxvY2tGaWxlKCdzb21lZmlsZScsIHRocmVhZGVkPUZhbHNlKQogICAgICAgICIiIgogICAgICAgIExvY2tCYXNlLl9faW5pdF9fKHNlbGYsIHBhdGgsIHRocmVhZGVkLCB0aW1lb3V0KQogICAgICAgIHNlbGYubG9ja19maWxlID0gdW5pY29kZShzZWxmLmxvY2tfZmlsZSkKICAgICAgICBzZWxmLnVuaXF1ZV9uYW1lID0gdW5pY29kZShzZWxmLnVuaXF1ZV9uYW1lKQoKICAgICAgICBpZiBTUUxpdGVMb2NrRmlsZS50ZXN0ZGIgaXMgTm9uZToKICAgICAgICAgICAgaW1wb3J0IHRlbXBmaWxlCiAgICAgICAgICAgIF9mZCwgdGVzdGRiID0gdGVtcGZpbGUubWtzdGVtcCgpCiAgICAgICAgICAgIG9zLmNsb3NlKF9mZCkKICAgICAgICAgICAgb3MudW5saW5rKHRlc3RkYikKICAgICAgICAgICAgZGVsIF9mZCwgdGVtcGZpbGUKICAgICAgICAgICAgU1FMaXRlTG9ja0ZpbGUudGVzdGRiID0gdGVzdGRiCgogICAgICAgIGltcG9ydCBzcWxpdGUzCiAgICAgICAgc2VsZi5jb25uZWN0aW9uID0gc3FsaXRlMy5jb25uZWN0KFNRTGl0ZUxvY2tGaWxlLnRlc3RkYikKCiAgICAgICAgYyA9IHNlbGYuY29ubmVjdGlvbi5jdXJzb3IoKQogICAgICAgIHRyeToKICAgICAgICAgICAgYy5leGVjdXRlKCJjcmVhdGUgdGFibGUgbG9ja3MiCiAgICAgICAgICAgICAgICAgICAgICAiKCIKICAgICAgICAgICAgICAgICAgICAgICIgICBsb2NrX2ZpbGUgdmFyY2hhcigzMiksIgogICAgICAgICAgICAgICAgICAgICAgIiAgIHVuaXF1ZV9uYW1lIHZhcmNoYXIoMzIpIgogICAgICAgICAgICAgICAgICAgICAgIikiKQogICAgICAgIGV4Y2VwdCBzcWxpdGUzLk9wZXJhdGlvbmFsRXJyb3I6CiAgICAgICAgICAgIHBhc3MKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmNvbm5lY3Rpb24uY29tbWl0KCkKICAgICAgICAgICAgaW1wb3J0IGF0ZXhpdAogICAgICAgICAgICBhdGV4aXQucmVnaXN0ZXIob3MudW5saW5rLCBTUUxpdGVMb2NrRmlsZS50ZXN0ZGIpCgogICAgZGVmIGFjcXVpcmUoc2VsZiwgdGltZW91dD1Ob25lKToKICAgICAgICB0aW1lb3V0ID0gdGltZW91dCBpZiB0aW1lb3V0IGlzIG5vdCBOb25lIGVsc2Ugc2VsZi50aW1lb3V0CiAgICAgICAgZW5kX3RpbWUgPSB0aW1lLnRpbWUoKQogICAgICAgIGlmIHRpbWVvdXQgaXMgbm90IE5vbmUgYW5kIHRpbWVvdXQgPiAwOgogICAgICAgICAgICBlbmRfdGltZSArPSB0aW1lb3V0CgogICAgICAgIGlmIHRpbWVvdXQgaXMgTm9uZToKICAgICAgICAgICAgd2FpdCA9IDAuMQogICAgICAgIGVsaWYgdGltZW91dCA8PSAwOgogICAgICAgICAgICB3YWl0ID0gMAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHdhaXQgPSB0aW1lb3V0IC8gMTAKCiAgICAgICAgY3Vyc29yID0gc2VsZi5jb25uZWN0aW9uLmN1cnNvcigpCgogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIGlmIG5vdCBzZWxmLmlzX2xvY2tlZCgpOgogICAgICAgICAgICAgICAgIyBOb3QgbG9ja2VkLiAgVHJ5IHRvIGxvY2sgaXQuCiAgICAgICAgICAgICAgICBjdXJzb3IuZXhlY3V0ZSgiaW5zZXJ0IGludG8gbG9ja3MiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAobG9ja19maWxlLCB1bmlxdWVfbmFtZSkiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB2YWx1ZXMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAoPywgPykiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYubG9ja19maWxlLCBzZWxmLnVuaXF1ZV9uYW1lKSkKICAgICAgICAgICAgICAgIHNlbGYuY29ubmVjdGlvbi5jb21taXQoKQoKICAgICAgICAgICAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHdlIGFyZSB0aGUgb25seSBsb2NrIGhvbGRlci4KICAgICAgICAgICAgICAgIGN1cnNvci5leGVjdXRlKCJzZWxlY3QgKiBmcm9tIGxvY2tzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgd2hlcmUgdW5pcXVlX25hbWUgPSA/IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLnVuaXF1ZV9uYW1lLCkpCiAgICAgICAgICAgICAgICByb3dzID0gY3Vyc29yLmZldGNoYWxsKCkKICAgICAgICAgICAgICAgIGlmIGxlbihyb3dzKSA+IDE6CiAgICAgICAgICAgICAgICAgICAgIyBOb3BlLiAgU29tZW9uZSBlbHNlIGdvdCB0aGVyZS4gIFJlbW92ZSBvdXIgbG9jay4KICAgICAgICAgICAgICAgICAgICBjdXJzb3IuZXhlY3V0ZSgiZGVsZXRlIGZyb20gbG9ja3MiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgd2hlcmUgdW5pcXVlX25hbWUgPSA/IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi51bmlxdWVfbmFtZSwpKQogICAgICAgICAgICAgICAgICAgIHNlbGYuY29ubmVjdGlvbi5jb21taXQoKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAjIFl1cC4gIFdlJ3JlIGRvbmUsIHNvIGdvIGhvbWUuCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIENoZWNrIHRvIHNlZSBpZiB3ZSBhcmUgdGhlIG9ubHkgbG9jayBob2xkZXIuCiAgICAgICAgICAgICAgICBjdXJzb3IuZXhlY3V0ZSgic2VsZWN0ICogZnJvbSBsb2NrcyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIHdoZXJlIHVuaXF1ZV9uYW1lID0gPyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi51bmlxdWVfbmFtZSwpKQogICAgICAgICAgICAgICAgcm93cyA9IGN1cnNvci5mZXRjaGFsbCgpCiAgICAgICAgICAgICAgICBpZiBsZW4ocm93cykgPT0gMToKICAgICAgICAgICAgICAgICAgICAjIFdlJ3JlIHRoZSBsb2NrZXIsIHNvIGdvIGhvbWUuCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICAgICAjIE1heWJlIHdlIHNob3VsZCB3YWl0IGEgYml0IGxvbmdlci4KICAgICAgICAgICAgaWYgdGltZW91dCBpcyBub3QgTm9uZSBhbmQgdGltZS50aW1lKCkgPiBlbmRfdGltZToKICAgICAgICAgICAgICAgIGlmIHRpbWVvdXQgPiAwOgogICAgICAgICAgICAgICAgICAgICMgTm8gbW9yZSB3YWl0aW5nLgogICAgICAgICAgICAgICAgICAgIHJhaXNlIExvY2tUaW1lb3V0KCJUaW1lb3V0IHdhaXRpbmcgdG8gYWNxdWlyZSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGxvY2sgZm9yICVzIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXRoKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAjIFNvbWVvbmUgZWxzZSBoYXMgdGhlIGxvY2sgYW5kIHdlIGFyZSBpbXBhdGllbnQuLgogICAgICAgICAgICAgICAgICAgIHJhaXNlIEFscmVhZHlMb2NrZWQoIiVzIGlzIGFscmVhZHkgbG9ja2VkIiAlIHNlbGYucGF0aCkKCiAgICAgICAgICAgICMgV2VsbCwgb2theS4gIFdlJ2xsIGdpdmUgaXQgYSBiaXQgbG9uZ2VyLgogICAgICAgICAgICB0aW1lLnNsZWVwKHdhaXQpCgogICAgZGVmIHJlbGVhc2Uoc2VsZik6CiAgICAgICAgaWYgbm90IHNlbGYuaXNfbG9ja2VkKCk6CiAgICAgICAgICAgIHJhaXNlIE5vdExvY2tlZCgiJXMgaXMgbm90IGxvY2tlZCIgJSBzZWxmLnBhdGgpCiAgICAgICAgaWYgbm90IHNlbGYuaV9hbV9sb2NraW5nKCk6CiAgICAgICAgICAgIHJhaXNlIE5vdE15TG9jaygiJXMgaXMgbG9ja2VkLCBidXQgbm90IGJ5IG1lIChieSAlcykiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLnVuaXF1ZV9uYW1lLCBzZWxmLl93aG9faXNfbG9ja2luZygpKSkKICAgICAgICBjdXJzb3IgPSBzZWxmLmNvbm5lY3Rpb24uY3Vyc29yKCkKICAgICAgICBjdXJzb3IuZXhlY3V0ZSgiZGVsZXRlIGZyb20gbG9ja3MiCiAgICAgICAgICAgICAgICAgICAgICAgIiAgd2hlcmUgdW5pcXVlX25hbWUgPSA/IiwKICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi51bmlxdWVfbmFtZSwpKQogICAgICAgIHNlbGYuY29ubmVjdGlvbi5jb21taXQoKQoKICAgIGRlZiBfd2hvX2lzX2xvY2tpbmcoc2VsZik6CiAgICAgICAgY3Vyc29yID0gc2VsZi5jb25uZWN0aW9uLmN1cnNvcigpCiAgICAgICAgY3Vyc29yLmV4ZWN1dGUoInNlbGVjdCB1bmlxdWVfbmFtZSBmcm9tIGxvY2tzIgogICAgICAgICAgICAgICAgICAgICAgICIgIHdoZXJlIGxvY2tfZmlsZSA9ID8iLAogICAgICAgICAgICAgICAgICAgICAgIChzZWxmLmxvY2tfZmlsZSwpKQogICAgICAgIHJldHVybiBjdXJzb3IuZmV0Y2hvbmUoKVswXQoKICAgIGRlZiBpc19sb2NrZWQoc2VsZik6CiAgICAgICAgY3Vyc29yID0gc2VsZi5jb25uZWN0aW9uLmN1cnNvcigpCiAgICAgICAgY3Vyc29yLmV4ZWN1dGUoInNlbGVjdCAqIGZyb20gbG9ja3MiCiAgICAgICAgICAgICAgICAgICAgICAgIiAgd2hlcmUgbG9ja19maWxlID0gPyIsCiAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYubG9ja19maWxlLCkpCiAgICAgICAgcm93cyA9IGN1cnNvci5mZXRjaGFsbCgpCiAgICAgICAgcmV0dXJuIG5vdCBub3Qgcm93cwoKICAgIGRlZiBpX2FtX2xvY2tpbmcoc2VsZik6CiAgICAgICAgY3Vyc29yID0gc2VsZi5jb25uZWN0aW9uLmN1cnNvcigpCiAgICAgICAgY3Vyc29yLmV4ZWN1dGUoInNlbGVjdCAqIGZyb20gbG9ja3MiCiAgICAgICAgICAgICAgICAgICAgICAgIiAgd2hlcmUgbG9ja19maWxlID0gPyIKICAgICAgICAgICAgICAgICAgICAgICAiICAgIGFuZCB1bmlxdWVfbmFtZSA9ID8iLAogICAgICAgICAgICAgICAgICAgICAgIChzZWxmLmxvY2tfZmlsZSwgc2VsZi51bmlxdWVfbmFtZSkpCiAgICAgICAgcmV0dXJuIG5vdCBub3QgY3Vyc29yLmZldGNoYWxsKCkKCiAgICBkZWYgYnJlYWtfbG9jayhzZWxmKToKICAgICAgICBjdXJzb3IgPSBzZWxmLmNvbm5lY3Rpb24uY3Vyc29yKCkKICAgICAgICBjdXJzb3IuZXhlY3V0ZSgiZGVsZXRlIGZyb20gbG9ja3MiCiAgICAgICAgICAgICAgICAgICAgICAgIiAgd2hlcmUgbG9ja19maWxlID0gPyIsCiAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYubG9ja19maWxlLCkpCiAgICAgICAgc2VsZi5jb25uZWN0aW9uLmNvbW1pdCgpClBLAwQUAAAAAAAAACEAkSMJ2TgKAAA4CgAANwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9sb2NrZmlsZS9zeW1saW5rbG9ja2ZpbGUucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IG9zCmltcG9ydCB0aW1lCgpmcm9tIC4gaW1wb3J0IChMb2NrQmFzZSwgTm90TG9ja2VkLCBOb3RNeUxvY2ssIExvY2tUaW1lb3V0LAogICAgICAgICAgICAgICBBbHJlYWR5TG9ja2VkKQoKCmNsYXNzIFN5bWxpbmtMb2NrRmlsZShMb2NrQmFzZSk6CiAgICAiIiJMb2NrIGFjY2VzcyB0byBhIGZpbGUgdXNpbmcgc3ltbGluaygyKS4iIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCwgdGhyZWFkZWQ9VHJ1ZSwgdGltZW91dD1Ob25lKToKICAgICAgICAjIHN1cGVyKFN5bWxpbmtMb2NrRmlsZSkuX19pbml0KC4uLikKICAgICAgICBMb2NrQmFzZS5fX2luaXRfXyhzZWxmLCBwYXRoLCB0aHJlYWRlZCwgdGltZW91dCkKICAgICAgICAjIHNwbGl0IGl0IGJhY2shCiAgICAgICAgc2VsZi51bmlxdWVfbmFtZSA9IG9zLnBhdGguc3BsaXQoc2VsZi51bmlxdWVfbmFtZSlbMV0KCiAgICBkZWYgYWNxdWlyZShzZWxmLCB0aW1lb3V0PU5vbmUpOgogICAgICAgICMgSG9wZWZ1bGx5IHVubmVjZXNzYXJ5IGZvciBzeW1saW5rLgogICAgICAgICMgdHJ5OgogICAgICAgICMgICAgIG9wZW4oc2VsZi51bmlxdWVfbmFtZSwgIndiIikuY2xvc2UoKQogICAgICAgICMgZXhjZXB0IElPRXJyb3I6CiAgICAgICAgIyAgICAgcmFpc2UgTG9ja0ZhaWxlZCgiZmFpbGVkIHRvIGNyZWF0ZSAlcyIgJSBzZWxmLnVuaXF1ZV9uYW1lKQogICAgICAgIHRpbWVvdXQgPSB0aW1lb3V0IGlmIHRpbWVvdXQgaXMgbm90IE5vbmUgZWxzZSBzZWxmLnRpbWVvdXQKICAgICAgICBlbmRfdGltZSA9IHRpbWUudGltZSgpCiAgICAgICAgaWYgdGltZW91dCBpcyBub3QgTm9uZSBhbmQgdGltZW91dCA+IDA6CiAgICAgICAgICAgIGVuZF90aW1lICs9IHRpbWVvdXQKCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgIyBUcnkgYW5kIGNyZWF0ZSBhIHN5bWJvbGljIGxpbmsgdG8gaXQuCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIG9zLnN5bWxpbmsoc2VsZi51bmlxdWVfbmFtZSwgc2VsZi5sb2NrX2ZpbGUpCiAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgICAgICAgICAgIyBMaW5rIGNyZWF0aW9uIGZhaWxlZC4gIE1heWJlIHdlJ3ZlIGRvdWJsZS1sb2NrZWQ/CiAgICAgICAgICAgICAgICBpZiBzZWxmLmlfYW1fbG9ja2luZygpOgogICAgICAgICAgICAgICAgICAgICMgTGlua2VkIHRvIG91dCB1bmlxdWUgbmFtZS4gUHJvY2VlZC4KICAgICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIyBPdGhlcndpc2UgdGhlIGxvY2sgY3JlYXRpb24gZmFpbGVkLgogICAgICAgICAgICAgICAgICAgIGlmIHRpbWVvdXQgaXMgbm90IE5vbmUgYW5kIHRpbWUudGltZSgpID4gZW5kX3RpbWU6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRpbWVvdXQgPiAwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgTG9ja1RpbWVvdXQoIlRpbWVvdXQgd2FpdGluZyB0byBhY3F1aXJlIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBsb2NrIGZvciAlcyIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXRoKQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgQWxyZWFkeUxvY2tlZCgiJXMgaXMgYWxyZWFkeSBsb2NrZWQiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXRoKQogICAgICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAodGltZW91dCAvIDEwIGlmIHRpbWVvdXQgaXMgbm90IE5vbmUgZWxzZSAwLjEpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIExpbmsgY3JlYXRpb24gc3VjY2VlZGVkLiAgV2UncmUgZ29vZCB0byBnby4KICAgICAgICAgICAgICAgIHJldHVybgoKICAgIGRlZiByZWxlYXNlKHNlbGYpOgogICAgICAgIGlmIG5vdCBzZWxmLmlzX2xvY2tlZCgpOgogICAgICAgICAgICByYWlzZSBOb3RMb2NrZWQoIiVzIGlzIG5vdCBsb2NrZWQiICUgc2VsZi5wYXRoKQogICAgICAgIGVsaWYgbm90IHNlbGYuaV9hbV9sb2NraW5nKCk6CiAgICAgICAgICAgIHJhaXNlIE5vdE15TG9jaygiJXMgaXMgbG9ja2VkLCBidXQgbm90IGJ5IG1lIiAlIHNlbGYucGF0aCkKICAgICAgICBvcy51bmxpbmsoc2VsZi5sb2NrX2ZpbGUpCgogICAgZGVmIGlzX2xvY2tlZChzZWxmKToKICAgICAgICByZXR1cm4gb3MucGF0aC5pc2xpbmsoc2VsZi5sb2NrX2ZpbGUpCgogICAgZGVmIGlfYW1fbG9ja2luZyhzZWxmKToKICAgICAgICByZXR1cm4gKG9zLnBhdGguaXNsaW5rKHNlbGYubG9ja19maWxlKQogICAgICAgICAgICAgICAgYW5kIG9zLnJlYWRsaW5rKHNlbGYubG9ja19maWxlKSA9PSBzZWxmLnVuaXF1ZV9uYW1lKQoKICAgIGRlZiBicmVha19sb2NrKHNlbGYpOgogICAgICAgIGlmIG9zLnBhdGguaXNsaW5rKHNlbGYubG9ja19maWxlKTogICMgZXhpc3RzICYmIGxpbmsKICAgICAgICAgICAgb3MudW5saW5rKHNlbGYubG9ja19maWxlKQpQSwMEFAAAAAAAAAAhANZSGSP+DwAA/g8AACoAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3Ivb3JkZXJlZGRpY3QucHkjIENvcHlyaWdodCAoYykgMjAwOSBSYXltb25kIEhldHRpbmdlcgojCiMgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24KIyBvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcwojICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sCiMgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwKIyBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLAojIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCiMgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiMKIyAgICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKIyAgICAgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCiMKIyAgICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCiMgICAgIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUwojICAgICBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAojICAgICBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVAojICAgICBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKIyAgICAgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCiMgICAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKIyAgICAgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKZnJvbSBVc2VyRGljdCBpbXBvcnQgRGljdE1peGluCgpjbGFzcyBPcmRlcmVkRGljdChkaWN0LCBEaWN0TWl4aW4pOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2RzKToKICAgICAgICBpZiBsZW4oYXJncykgPiAxOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ2V4cGVjdGVkIGF0IG1vc3QgMSBhcmd1bWVudHMsIGdvdCAlZCcgJSBsZW4oYXJncykpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLl9fZW5kCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBzZWxmLmNsZWFyKCkKICAgICAgICBzZWxmLnVwZGF0ZSgqYXJncywgKiprd2RzKQoKICAgIGRlZiBjbGVhcihzZWxmKToKICAgICAgICBzZWxmLl9fZW5kID0gZW5kID0gW10KICAgICAgICBlbmQgKz0gW05vbmUsIGVuZCwgZW5kXSAgICAgICAgICMgc2VudGluZWwgbm9kZSBmb3IgZG91Ymx5IGxpbmtlZCBsaXN0CiAgICAgICAgc2VsZi5fX21hcCA9IHt9ICAgICAgICAgICAgICAgICAjIGtleSAtLT4gW2tleSwgcHJldiwgbmV4dF0KICAgICAgICBkaWN0LmNsZWFyKHNlbGYpCgogICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpOgogICAgICAgIGlmIGtleSBub3QgaW4gc2VsZjoKICAgICAgICAgICAgZW5kID0gc2VsZi5fX2VuZAogICAgICAgICAgICBjdXJyID0gZW5kWzFdCiAgICAgICAgICAgIGN1cnJbMl0gPSBlbmRbMV0gPSBzZWxmLl9fbWFwW2tleV0gPSBba2V5LCBjdXJyLCBlbmRdCiAgICAgICAgZGljdC5fX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKQoKICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBrZXkpOgogICAgICAgIGRpY3QuX19kZWxpdGVtX18oc2VsZiwga2V5KQogICAgICAgIGtleSwgcHJldiwgbmV4dCA9IHNlbGYuX19tYXAucG9wKGtleSkKICAgICAgICBwcmV2WzJdID0gbmV4dAogICAgICAgIG5leHRbMV0gPSBwcmV2CgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIGVuZCA9IHNlbGYuX19lbmQKICAgICAgICBjdXJyID0gZW5kWzJdCiAgICAgICAgd2hpbGUgY3VyciBpcyBub3QgZW5kOgogICAgICAgICAgICB5aWVsZCBjdXJyWzBdCiAgICAgICAgICAgIGN1cnIgPSBjdXJyWzJdCgogICAgZGVmIF9fcmV2ZXJzZWRfXyhzZWxmKToKICAgICAgICBlbmQgPSBzZWxmLl9fZW5kCiAgICAgICAgY3VyciA9IGVuZFsxXQogICAgICAgIHdoaWxlIGN1cnIgaXMgbm90IGVuZDoKICAgICAgICAgICAgeWllbGQgY3VyclswXQogICAgICAgICAgICBjdXJyID0gY3VyclsxXQoKICAgIGRlZiBwb3BpdGVtKHNlbGYsIGxhc3Q9VHJ1ZSk6CiAgICAgICAgaWYgbm90IHNlbGY6CiAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCdkaWN0aW9uYXJ5IGlzIGVtcHR5JykKICAgICAgICBpZiBsYXN0OgogICAgICAgICAgICBrZXkgPSByZXZlcnNlZChzZWxmKS5uZXh0KCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBrZXkgPSBpdGVyKHNlbGYpLm5leHQoKQogICAgICAgIHZhbHVlID0gc2VsZi5wb3Aoa2V5KQogICAgICAgIHJldHVybiBrZXksIHZhbHVlCgogICAgZGVmIF9fcmVkdWNlX18oc2VsZik6CiAgICAgICAgaXRlbXMgPSBbW2ssIHNlbGZba11dIGZvciBrIGluIHNlbGZdCiAgICAgICAgdG1wID0gc2VsZi5fX21hcCwgc2VsZi5fX2VuZAogICAgICAgIGRlbCBzZWxmLl9fbWFwLCBzZWxmLl9fZW5kCiAgICAgICAgaW5zdF9kaWN0ID0gdmFycyhzZWxmKS5jb3B5KCkKICAgICAgICBzZWxmLl9fbWFwLCBzZWxmLl9fZW5kID0gdG1wCiAgICAgICAgaWYgaW5zdF9kaWN0OgogICAgICAgICAgICByZXR1cm4gKHNlbGYuX19jbGFzc19fLCAoaXRlbXMsKSwgaW5zdF9kaWN0KQogICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXywgKGl0ZW1zLCkKCiAgICBkZWYga2V5cyhzZWxmKToKICAgICAgICByZXR1cm4gbGlzdChzZWxmKQoKICAgIHNldGRlZmF1bHQgPSBEaWN0TWl4aW4uc2V0ZGVmYXVsdAogICAgdXBkYXRlID0gRGljdE1peGluLnVwZGF0ZQogICAgcG9wID0gRGljdE1peGluLnBvcAogICAgdmFsdWVzID0gRGljdE1peGluLnZhbHVlcwogICAgaXRlbXMgPSBEaWN0TWl4aW4uaXRlbXMKICAgIGl0ZXJrZXlzID0gRGljdE1peGluLml0ZXJrZXlzCiAgICBpdGVydmFsdWVzID0gRGljdE1peGluLml0ZXJ2YWx1ZXMKICAgIGl0ZXJpdGVtcyA9IERpY3RNaXhpbi5pdGVyaXRlbXMKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgaWYgbm90IHNlbGY6CiAgICAgICAgICAgIHJldHVybiAnJXMoKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sKQogICAgICAgIHJldHVybiAnJXMoJXIpJyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc2VsZi5pdGVtcygpKQoKICAgIGRlZiBjb3B5KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyhzZWxmKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGZyb21rZXlzKGNscywgaXRlcmFibGUsIHZhbHVlPU5vbmUpOgogICAgICAgIGQgPSBjbHMoKQogICAgICAgIGZvciBrZXkgaW4gaXRlcmFibGU6CiAgICAgICAgICAgIGRba2V5XSA9IHZhbHVlCiAgICAgICAgcmV0dXJuIGQKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBPcmRlcmVkRGljdCk6CiAgICAgICAgICAgIGlmIGxlbihzZWxmKSAhPSBsZW4ob3RoZXIpOgogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgICAgIGZvciBwLCBxIGluICB6aXAoc2VsZi5pdGVtcygpLCBvdGhlci5pdGVtcygpKToKICAgICAgICAgICAgICAgIGlmIHAgIT0gcToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICByZXR1cm4gZGljdC5fX2VxX18oc2VsZiwgb3RoZXIpCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIG5vdCBzZWxmID09IG90aGVyClBLAwQUAAAAAAAAACEAPClYxtACAADQAgAAMgAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9wYWNrYWdpbmcvX19hYm91dF9fLnB5IyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uCiMgMi4wLCBhbmQgdGhlIEJTRCBMaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHJlcG9zaXRvcnkKIyBmb3IgY29tcGxldGUgZGV0YWlscy4KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCBwcmludF9mdW5jdGlvbgoKX19hbGxfXyA9IFsKICAgICJfX3RpdGxlX18iLCAiX19zdW1tYXJ5X18iLCAiX191cmlfXyIsICJfX3ZlcnNpb25fXyIsICJfX2F1dGhvcl9fIiwKICAgICJfX2VtYWlsX18iLCAiX19saWNlbnNlX18iLCAiX19jb3B5cmlnaHRfXyIsCl0KCl9fdGl0bGVfXyA9ICJwYWNrYWdpbmciCl9fc3VtbWFyeV9fID0gIkNvcmUgdXRpbGl0aWVzIGZvciBQeXRob24gcGFja2FnZXMiCl9fdXJpX18gPSAiaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvcGFja2FnaW5nIgoKX192ZXJzaW9uX18gPSAiMTYuOCIKCl9fYXV0aG9yX18gPSAiRG9uYWxkIFN0dWZmdCBhbmQgaW5kaXZpZHVhbCBjb250cmlidXRvcnMiCl9fZW1haWxfXyA9ICJkb25hbGRAc3R1ZmZ0LmlvIgoKX19saWNlbnNlX18gPSAiQlNEIG9yIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCIKX19jb3B5cmlnaHRfXyA9ICJDb3B5cmlnaHQgMjAxNC0yMDE2ICVzIiAlIF9fYXV0aG9yX18KUEsDBBQAAAAAAAAAIQCBdpbKAQIAAAECAAAxAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3BhY2thZ2luZy9fX2luaXRfXy5weSMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbgojIDIuMCwgYW5kIHRoZSBCU0QgTGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyByZXBvc2l0b3J5CiMgZm9yIGNvbXBsZXRlIGRldGFpbHMuCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgcHJpbnRfZnVuY3Rpb24KCmZyb20gLl9fYWJvdXRfXyBpbXBvcnQgKAogICAgX19hdXRob3JfXywgX19jb3B5cmlnaHRfXywgX19lbWFpbF9fLCBfX2xpY2Vuc2VfXywgX19zdW1tYXJ5X18sIF9fdGl0bGVfXywKICAgIF9fdXJpX18sIF9fdmVyc2lvbl9fCikKCl9fYWxsX18gPSBbCiAgICAiX190aXRsZV9fIiwgIl9fc3VtbWFyeV9fIiwgIl9fdXJpX18iLCAiX192ZXJzaW9uX18iLCAiX19hdXRob3JfXyIsCiAgICAiX19lbWFpbF9fIiwgIl9fbGljZW5zZV9fIiwgIl9fY29weXJpZ2h0X18iLApdClBLAwQUAAAAAAAAACEA5mlK41wDAABcAwAAMAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9wYWNrYWdpbmcvX2NvbXBhdC5weSMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbgojIDIuMCwgYW5kIHRoZSBCU0QgTGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyByZXBvc2l0b3J5CiMgZm9yIGNvbXBsZXRlIGRldGFpbHMuCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgcHJpbnRfZnVuY3Rpb24KCmltcG9ydCBzeXMKCgpQWTIgPSBzeXMudmVyc2lvbl9pbmZvWzBdID09IDIKUFkzID0gc3lzLnZlcnNpb25faW5mb1swXSA9PSAzCgojIGZsYWtlODogbm9xYQoKaWYgUFkzOgogICAgc3RyaW5nX3R5cGVzID0gc3RyLAplbHNlOgogICAgc3RyaW5nX3R5cGVzID0gYmFzZXN0cmluZywKCgpkZWYgd2l0aF9tZXRhY2xhc3MobWV0YSwgKmJhc2VzKToKICAgICIiIgogICAgQ3JlYXRlIGEgYmFzZSBjbGFzcyB3aXRoIGEgbWV0YWNsYXNzLgogICAgIiIiCiAgICAjIFRoaXMgcmVxdWlyZXMgYSBiaXQgb2YgZXhwbGFuYXRpb246IHRoZSBiYXNpYyBpZGVhIGlzIHRvIG1ha2UgYSBkdW1teQogICAgIyBtZXRhY2xhc3MgZm9yIG9uZSBsZXZlbCBvZiBjbGFzcyBpbnN0YW50aWF0aW9uIHRoYXQgcmVwbGFjZXMgaXRzZWxmIHdpdGgKICAgICMgdGhlIGFjdHVhbCBtZXRhY2xhc3MuCiAgICBjbGFzcyBtZXRhY2xhc3MobWV0YSk6CiAgICAgICAgZGVmIF9fbmV3X18oY2xzLCBuYW1lLCB0aGlzX2Jhc2VzLCBkKToKICAgICAgICAgICAgcmV0dXJuIG1ldGEobmFtZSwgYmFzZXMsIGQpCiAgICByZXR1cm4gdHlwZS5fX25ld19fKG1ldGFjbGFzcywgJ3RlbXBvcmFyeV9jbGFzcycsICgpLCB7fSkKUEsDBBQAAAAAAAAAIQD6/aQSiAUAAIgFAAA0AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3BhY2thZ2luZy9fc3RydWN0dXJlcy5weSMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbgojIDIuMCwgYW5kIHRoZSBCU0QgTGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyByZXBvc2l0b3J5CiMgZm9yIGNvbXBsZXRlIGRldGFpbHMuCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgcHJpbnRfZnVuY3Rpb24KCgpjbGFzcyBJbmZpbml0eShvYmplY3QpOgoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIkluZmluaXR5IgoKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gaGFzaChyZXByKHNlbGYpKQoKICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXykKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gbm90IGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKQoKICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIF9fZ2VfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgX19uZWdfXyhzZWxmKToKICAgICAgICByZXR1cm4gTmVnYXRpdmVJbmZpbml0eQoKSW5maW5pdHkgPSBJbmZpbml0eSgpCgoKY2xhc3MgTmVnYXRpdmVJbmZpbml0eShvYmplY3QpOgoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIi1JbmZpbml0eSIKCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGhhc2gocmVwcihzZWxmKSkKCiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKQoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBub3QgaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pCgogICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIF9fZ2VfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIF9fbmVnX18oc2VsZik6CiAgICAgICAgcmV0dXJuIEluZmluaXR5CgpOZWdhdGl2ZUluZmluaXR5ID0gTmVnYXRpdmVJbmZpbml0eSgpClBLAwQUAAAAAAAAACEAfSwrVyYgAAAmIAAAMAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9wYWNrYWdpbmcvbWFya2Vycy5weSMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbgojIDIuMCwgYW5kIHRoZSBCU0QgTGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyByZXBvc2l0b3J5CiMgZm9yIGNvbXBsZXRlIGRldGFpbHMuCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgcHJpbnRfZnVuY3Rpb24KCmltcG9ydCBvcGVyYXRvcgppbXBvcnQgb3MKaW1wb3J0IHBsYXRmb3JtCmltcG9ydCBzeXMKCmZyb20gcGlwLl92ZW5kb3IucHlwYXJzaW5nIGltcG9ydCAoCiAgICBQYXJzZUV4Y2VwdGlvbiwgUGFyc2VSZXN1bHRzLCBzdHJpbmdTdGFydCwgc3RyaW5nRW5kLAopCmZyb20gcGlwLl92ZW5kb3IucHlwYXJzaW5nIGltcG9ydCBaZXJvT3JNb3JlLCBHcm91cCwgRm9yd2FyZCwgUXVvdGVkU3RyaW5nCmZyb20gcGlwLl92ZW5kb3IucHlwYXJzaW5nIGltcG9ydCBMaXRlcmFsIGFzIEwgICMgbm9xYQoKZnJvbSAuX2NvbXBhdCBpbXBvcnQgc3RyaW5nX3R5cGVzCmZyb20gLnNwZWNpZmllcnMgaW1wb3J0IFNwZWNpZmllciwgSW52YWxpZFNwZWNpZmllcgoKCl9fYWxsX18gPSBbCiAgICAiSW52YWxpZE1hcmtlciIsICJVbmRlZmluZWRDb21wYXJpc29uIiwgIlVuZGVmaW5lZEVudmlyb25tZW50TmFtZSIsCiAgICAiTWFya2VyIiwgImRlZmF1bHRfZW52aXJvbm1lbnQiLApdCgoKY2xhc3MgSW52YWxpZE1hcmtlcihWYWx1ZUVycm9yKToKICAgICIiIgogICAgQW4gaW52YWxpZCBtYXJrZXIgd2FzIGZvdW5kLCB1c2VycyBzaG91bGQgcmVmZXIgdG8gUEVQIDUwOC4KICAgICIiIgoKCmNsYXNzIFVuZGVmaW5lZENvbXBhcmlzb24oVmFsdWVFcnJvcik6CiAgICAiIiIKICAgIEFuIGludmFsaWQgb3BlcmF0aW9uIHdhcyBhdHRlbXB0ZWQgb24gYSB2YWx1ZSB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCBpdC4KICAgICIiIgoKCmNsYXNzIFVuZGVmaW5lZEVudmlyb25tZW50TmFtZShWYWx1ZUVycm9yKToKICAgICIiIgogICAgQSBuYW1lIHdhcyBhdHRlbXB0ZWQgdG8gYmUgdXNlZCB0aGF0IGRvZXMgbm90IGV4aXN0IGluc2lkZSBvZiB0aGUKICAgIGVudmlyb25tZW50LgogICAgIiIiCgoKY2xhc3MgTm9kZShvYmplY3QpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSk6CiAgICAgICAgc2VsZi52YWx1ZSA9IHZhbHVlCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHN0cihzZWxmLnZhbHVlKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIjx7MH0oezEhcn0pPiIuZm9ybWF0KHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzdHIoc2VsZikpCgogICAgZGVmIHNlcmlhbGl6ZShzZWxmKToKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCgoKY2xhc3MgVmFyaWFibGUoTm9kZSk6CgogICAgZGVmIHNlcmlhbGl6ZShzZWxmKToKICAgICAgICByZXR1cm4gc3RyKHNlbGYpCgoKY2xhc3MgVmFsdWUoTm9kZSk6CgogICAgZGVmIHNlcmlhbGl6ZShzZWxmKToKICAgICAgICByZXR1cm4gJyJ7MH0iJy5mb3JtYXQoc2VsZikKCgpjbGFzcyBPcChOb2RlKToKCiAgICBkZWYgc2VyaWFsaXplKHNlbGYpOgogICAgICAgIHJldHVybiBzdHIoc2VsZikKCgpWQVJJQUJMRSA9ICgKICAgIEwoImltcGxlbWVudGF0aW9uX3ZlcnNpb24iKSB8CiAgICBMKCJwbGF0Zm9ybV9weXRob25faW1wbGVtZW50YXRpb24iKSB8CiAgICBMKCJpbXBsZW1lbnRhdGlvbl9uYW1lIikgfAogICAgTCgicHl0aG9uX2Z1bGxfdmVyc2lvbiIpIHwKICAgIEwoInBsYXRmb3JtX3JlbGVhc2UiKSB8CiAgICBMKCJwbGF0Zm9ybV92ZXJzaW9uIikgfAogICAgTCgicGxhdGZvcm1fbWFjaGluZSIpIHwKICAgIEwoInBsYXRmb3JtX3N5c3RlbSIpIHwKICAgIEwoInB5dGhvbl92ZXJzaW9uIikgfAogICAgTCgic3lzX3BsYXRmb3JtIikgfAogICAgTCgib3NfbmFtZSIpIHwKICAgIEwoIm9zLm5hbWUiKSB8ICAjIFBFUC0zNDUKICAgIEwoInN5cy5wbGF0Zm9ybSIpIHwgICMgUEVQLTM0NQogICAgTCgicGxhdGZvcm0udmVyc2lvbiIpIHwgICMgUEVQLTM0NQogICAgTCgicGxhdGZvcm0ubWFjaGluZSIpIHwgICMgUEVQLTM0NQogICAgTCgicGxhdGZvcm0ucHl0aG9uX2ltcGxlbWVudGF0aW9uIikgfCAgIyBQRVAtMzQ1CiAgICBMKCJweXRob25faW1wbGVtZW50YXRpb24iKSB8ICAjIHVuZG9jdW1lbnRlZCBzZXR1cHRvb2xzIGxlZ2FjeQogICAgTCgiZXh0cmEiKQopCkFMSUFTRVMgPSB7CiAgICAnb3MubmFtZSc6ICdvc19uYW1lJywKICAgICdzeXMucGxhdGZvcm0nOiAnc3lzX3BsYXRmb3JtJywKICAgICdwbGF0Zm9ybS52ZXJzaW9uJzogJ3BsYXRmb3JtX3ZlcnNpb24nLAogICAgJ3BsYXRmb3JtLm1hY2hpbmUnOiAncGxhdGZvcm1fbWFjaGluZScsCiAgICAncGxhdGZvcm0ucHl0aG9uX2ltcGxlbWVudGF0aW9uJzogJ3BsYXRmb3JtX3B5dGhvbl9pbXBsZW1lbnRhdGlvbicsCiAgICAncHl0aG9uX2ltcGxlbWVudGF0aW9uJzogJ3BsYXRmb3JtX3B5dGhvbl9pbXBsZW1lbnRhdGlvbicKfQpWQVJJQUJMRS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcywgbCwgdDogVmFyaWFibGUoQUxJQVNFUy5nZXQodFswXSwgdFswXSkpKQoKVkVSU0lPTl9DTVAgPSAoCiAgICBMKCI9PT0iKSB8CiAgICBMKCI9PSIpIHwKICAgIEwoIj49IikgfAogICAgTCgiPD0iKSB8CiAgICBMKCIhPSIpIHwKICAgIEwoIn49IikgfAogICAgTCgiPiIpIHwKICAgIEwoIjwiKQopCgpNQVJLRVJfT1AgPSBWRVJTSU9OX0NNUCB8IEwoIm5vdCBpbiIpIHwgTCgiaW4iKQpNQVJLRVJfT1Auc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsIGwsIHQ6IE9wKHRbMF0pKQoKTUFSS0VSX1ZBTFVFID0gUXVvdGVkU3RyaW5nKCInIikgfCBRdW90ZWRTdHJpbmcoJyInKQpNQVJLRVJfVkFMVUUuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsIGwsIHQ6IFZhbHVlKHRbMF0pKQoKQk9PTE9QID0gTCgiYW5kIikgfCBMKCJvciIpCgpNQVJLRVJfVkFSID0gVkFSSUFCTEUgfCBNQVJLRVJfVkFMVUUKCk1BUktFUl9JVEVNID0gR3JvdXAoTUFSS0VSX1ZBUiArIE1BUktFUl9PUCArIE1BUktFUl9WQVIpCk1BUktFUl9JVEVNLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLCBsLCB0OiB0dXBsZSh0WzBdKSkKCkxQQVJFTiA9IEwoIigiKS5zdXBwcmVzcygpClJQQVJFTiA9IEwoIikiKS5zdXBwcmVzcygpCgpNQVJLRVJfRVhQUiA9IEZvcndhcmQoKQpNQVJLRVJfQVRPTSA9IE1BUktFUl9JVEVNIHwgR3JvdXAoTFBBUkVOICsgTUFSS0VSX0VYUFIgKyBSUEFSRU4pCk1BUktFUl9FWFBSIDw8IE1BUktFUl9BVE9NICsgWmVyb09yTW9yZShCT09MT1AgKyBNQVJLRVJfRVhQUikKCk1BUktFUiA9IHN0cmluZ1N0YXJ0ICsgTUFSS0VSX0VYUFIgKyBzdHJpbmdFbmQKCgpkZWYgX2NvZXJjZV9wYXJzZV9yZXN1bHQocmVzdWx0cyk6CiAgICBpZiBpc2luc3RhbmNlKHJlc3VsdHMsIFBhcnNlUmVzdWx0cyk6CiAgICAgICAgcmV0dXJuIFtfY29lcmNlX3BhcnNlX3Jlc3VsdChpKSBmb3IgaSBpbiByZXN1bHRzXQogICAgZWxzZToKICAgICAgICByZXR1cm4gcmVzdWx0cwoKCmRlZiBfZm9ybWF0X21hcmtlcihtYXJrZXIsIGZpcnN0PVRydWUpOgogICAgYXNzZXJ0IGlzaW5zdGFuY2UobWFya2VyLCAobGlzdCwgdHVwbGUsIHN0cmluZ190eXBlcykpCgogICAgIyBTb21ldGltZXMgd2UgaGF2ZSBhIHN0cnVjdHVyZSBsaWtlIFtbLi4uXV0gd2hpY2ggaXMgYSBzaW5nbGUgaXRlbSBsaXN0CiAgICAjIHdoZXJlIHRoZSBzaW5nbGUgaXRlbSBpcyBpdHNlbGYgaXQncyBvd24gbGlzdC4gSW4gdGhhdCBjYXNlIHdlIHdhbnQgc2tpcAogICAgIyB0aGUgcmVzdCBvZiB0aGlzIGZ1bmN0aW9uIHNvIHRoYXQgd2UgZG9uJ3QgZ2V0IGV4dHJhbmVvdXMgKCkgb24gdGhlCiAgICAjIG91dHNpZGUuCiAgICBpZiAoaXNpbnN0YW5jZShtYXJrZXIsIGxpc3QpIGFuZCBsZW4obWFya2VyKSA9PSAxIGFuZAogICAgICAgICAgICBpc2luc3RhbmNlKG1hcmtlclswXSwgKGxpc3QsIHR1cGxlKSkpOgogICAgICAgIHJldHVybiBfZm9ybWF0X21hcmtlcihtYXJrZXJbMF0pCgogICAgaWYgaXNpbnN0YW5jZShtYXJrZXIsIGxpc3QpOgogICAgICAgIGlubmVyID0gKF9mb3JtYXRfbWFya2VyKG0sIGZpcnN0PUZhbHNlKSBmb3IgbSBpbiBtYXJrZXIpCiAgICAgICAgaWYgZmlyc3Q6CiAgICAgICAgICAgIHJldHVybiAiICIuam9pbihpbm5lcikKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gIigiICsgIiAiLmpvaW4oaW5uZXIpICsgIikiCiAgICBlbGlmIGlzaW5zdGFuY2UobWFya2VyLCB0dXBsZSk6CiAgICAgICAgcmV0dXJuICIgIi5qb2luKFttLnNlcmlhbGl6ZSgpIGZvciBtIGluIG1hcmtlcl0pCiAgICBlbHNlOgogICAgICAgIHJldHVybiBtYXJrZXIKCgpfb3BlcmF0b3JzID0gewogICAgImluIjogbGFtYmRhIGxocywgcmhzOiBsaHMgaW4gcmhzLAogICAgIm5vdCBpbiI6IGxhbWJkYSBsaHMsIHJoczogbGhzIG5vdCBpbiByaHMsCiAgICAiPCI6IG9wZXJhdG9yLmx0LAogICAgIjw9Ijogb3BlcmF0b3IubGUsCiAgICAiPT0iOiBvcGVyYXRvci5lcSwKICAgICIhPSI6IG9wZXJhdG9yLm5lLAogICAgIj49Ijogb3BlcmF0b3IuZ2UsCiAgICAiPiI6IG9wZXJhdG9yLmd0LAp9CgoKZGVmIF9ldmFsX29wKGxocywgb3AsIHJocyk6CiAgICB0cnk6CiAgICAgICAgc3BlYyA9IFNwZWNpZmllcigiIi5qb2luKFtvcC5zZXJpYWxpemUoKSwgcmhzXSkpCiAgICBleGNlcHQgSW52YWxpZFNwZWNpZmllcjoKICAgICAgICBwYXNzCiAgICBlbHNlOgogICAgICAgIHJldHVybiBzcGVjLmNvbnRhaW5zKGxocykKCiAgICBvcGVyID0gX29wZXJhdG9ycy5nZXQob3Auc2VyaWFsaXplKCkpCiAgICBpZiBvcGVyIGlzIE5vbmU6CiAgICAgICAgcmFpc2UgVW5kZWZpbmVkQ29tcGFyaXNvbigKICAgICAgICAgICAgIlVuZGVmaW5lZCB7MCFyfSBvbiB7MSFyfSBhbmQgezIhcn0uIi5mb3JtYXQob3AsIGxocywgcmhzKQogICAgICAgICkKCiAgICByZXR1cm4gb3BlcihsaHMsIHJocykKCgpfdW5kZWZpbmVkID0gb2JqZWN0KCkKCgpkZWYgX2dldF9lbnYoZW52aXJvbm1lbnQsIG5hbWUpOgogICAgdmFsdWUgPSBlbnZpcm9ubWVudC5nZXQobmFtZSwgX3VuZGVmaW5lZCkKCiAgICBpZiB2YWx1ZSBpcyBfdW5kZWZpbmVkOgogICAgICAgIHJhaXNlIFVuZGVmaW5lZEVudmlyb25tZW50TmFtZSgKICAgICAgICAgICAgInswIXJ9IGRvZXMgbm90IGV4aXN0IGluIGV2YWx1YXRpb24gZW52aXJvbm1lbnQuIi5mb3JtYXQobmFtZSkKICAgICAgICApCgogICAgcmV0dXJuIHZhbHVlCgoKZGVmIF9ldmFsdWF0ZV9tYXJrZXJzKG1hcmtlcnMsIGVudmlyb25tZW50KToKICAgIGdyb3VwcyA9IFtbXV0KCiAgICBmb3IgbWFya2VyIGluIG1hcmtlcnM6CiAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UobWFya2VyLCAobGlzdCwgdHVwbGUsIHN0cmluZ190eXBlcykpCgogICAgICAgIGlmIGlzaW5zdGFuY2UobWFya2VyLCBsaXN0KToKICAgICAgICAgICAgZ3JvdXBzWy0xXS5hcHBlbmQoX2V2YWx1YXRlX21hcmtlcnMobWFya2VyLCBlbnZpcm9ubWVudCkpCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKG1hcmtlciwgdHVwbGUpOgogICAgICAgICAgICBsaHMsIG9wLCByaHMgPSBtYXJrZXIKCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UobGhzLCBWYXJpYWJsZSk6CiAgICAgICAgICAgICAgICBsaHNfdmFsdWUgPSBfZ2V0X2VudihlbnZpcm9ubWVudCwgbGhzLnZhbHVlKQogICAgICAgICAgICAgICAgcmhzX3ZhbHVlID0gcmhzLnZhbHVlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBsaHNfdmFsdWUgPSBsaHMudmFsdWUKICAgICAgICAgICAgICAgIHJoc192YWx1ZSA9IF9nZXRfZW52KGVudmlyb25tZW50LCByaHMudmFsdWUpCgogICAgICAgICAgICBncm91cHNbLTFdLmFwcGVuZChfZXZhbF9vcChsaHNfdmFsdWUsIG9wLCByaHNfdmFsdWUpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGFzc2VydCBtYXJrZXIgaW4gWyJhbmQiLCAib3IiXQogICAgICAgICAgICBpZiBtYXJrZXIgPT0gIm9yIjoKICAgICAgICAgICAgICAgIGdyb3Vwcy5hcHBlbmQoW10pCgogICAgcmV0dXJuIGFueShhbGwoaXRlbSkgZm9yIGl0ZW0gaW4gZ3JvdXBzKQoKCmRlZiBmb3JtYXRfZnVsbF92ZXJzaW9uKGluZm8pOgogICAgdmVyc2lvbiA9ICd7MC5tYWpvcn0uezAubWlub3J9LnswLm1pY3JvfScuZm9ybWF0KGluZm8pCiAgICBraW5kID0gaW5mby5yZWxlYXNlbGV2ZWwKICAgIGlmIGtpbmQgIT0gJ2ZpbmFsJzoKICAgICAgICB2ZXJzaW9uICs9IGtpbmRbMF0gKyBzdHIoaW5mby5zZXJpYWwpCiAgICByZXR1cm4gdmVyc2lvbgoKCmRlZiBkZWZhdWx0X2Vudmlyb25tZW50KCk6CiAgICBpZiBoYXNhdHRyKHN5cywgJ2ltcGxlbWVudGF0aW9uJyk6CiAgICAgICAgaXZlciA9IGZvcm1hdF9mdWxsX3ZlcnNpb24oc3lzLmltcGxlbWVudGF0aW9uLnZlcnNpb24pCiAgICAgICAgaW1wbGVtZW50YXRpb25fbmFtZSA9IHN5cy5pbXBsZW1lbnRhdGlvbi5uYW1lCiAgICBlbHNlOgogICAgICAgIGl2ZXIgPSAnMCcKICAgICAgICBpbXBsZW1lbnRhdGlvbl9uYW1lID0gJycKCiAgICByZXR1cm4gewogICAgICAgICJpbXBsZW1lbnRhdGlvbl9uYW1lIjogaW1wbGVtZW50YXRpb25fbmFtZSwKICAgICAgICAiaW1wbGVtZW50YXRpb25fdmVyc2lvbiI6IGl2ZXIsCiAgICAgICAgIm9zX25hbWUiOiBvcy5uYW1lLAogICAgICAgICJwbGF0Zm9ybV9tYWNoaW5lIjogcGxhdGZvcm0ubWFjaGluZSgpLAogICAgICAgICJwbGF0Zm9ybV9yZWxlYXNlIjogcGxhdGZvcm0ucmVsZWFzZSgpLAogICAgICAgICJwbGF0Zm9ybV9zeXN0ZW0iOiBwbGF0Zm9ybS5zeXN0ZW0oKSwKICAgICAgICAicGxhdGZvcm1fdmVyc2lvbiI6IHBsYXRmb3JtLnZlcnNpb24oKSwKICAgICAgICAicHl0aG9uX2Z1bGxfdmVyc2lvbiI6IHBsYXRmb3JtLnB5dGhvbl92ZXJzaW9uKCksCiAgICAgICAgInBsYXRmb3JtX3B5dGhvbl9pbXBsZW1lbnRhdGlvbiI6IHBsYXRmb3JtLnB5dGhvbl9pbXBsZW1lbnRhdGlvbigpLAogICAgICAgICJweXRob25fdmVyc2lvbiI6IHBsYXRmb3JtLnB5dGhvbl92ZXJzaW9uKClbOjNdLAogICAgICAgICJzeXNfcGxhdGZvcm0iOiBzeXMucGxhdGZvcm0sCiAgICB9CgoKY2xhc3MgTWFya2VyKG9iamVjdCk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hcmtlcik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLl9tYXJrZXJzID0gX2NvZXJjZV9wYXJzZV9yZXN1bHQoTUFSS0VSLnBhcnNlU3RyaW5nKG1hcmtlcikpCiAgICAgICAgZXhjZXB0IFBhcnNlRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIGVycl9zdHIgPSAiSW52YWxpZCBtYXJrZXI6IHswIXJ9LCBwYXJzZSBlcnJvciBhdCB7MSFyfSIuZm9ybWF0KAogICAgICAgICAgICAgICAgbWFya2VyLCBtYXJrZXJbZS5sb2M6ZS5sb2MgKyA4XSkKICAgICAgICAgICAgcmFpc2UgSW52YWxpZE1hcmtlcihlcnJfc3RyKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiBfZm9ybWF0X21hcmtlcihzZWxmLl9tYXJrZXJzKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIjxNYXJrZXIoezAhcn0pPiIuZm9ybWF0KHN0cihzZWxmKSkKCiAgICBkZWYgZXZhbHVhdGUoc2VsZiwgZW52aXJvbm1lbnQ9Tm9uZSk6CiAgICAgICAgIiIiRXZhbHVhdGUgYSBtYXJrZXIuCgogICAgICAgIFJldHVybiB0aGUgYm9vbGVhbiBmcm9tIGV2YWx1YXRpbmcgdGhlIGdpdmVuIG1hcmtlciBhZ2FpbnN0IHRoZQogICAgICAgIGVudmlyb25tZW50LiBlbnZpcm9ubWVudCBpcyBhbiBvcHRpb25hbCBhcmd1bWVudCB0byBvdmVycmlkZSBhbGwgb3IKICAgICAgICBwYXJ0IG9mIHRoZSBkZXRlcm1pbmVkIGVudmlyb25tZW50LgoKICAgICAgICBUaGUgZW52aXJvbm1lbnQgaXMgZGV0ZXJtaW5lZCBmcm9tIHRoZSBjdXJyZW50IFB5dGhvbiBwcm9jZXNzLgogICAgICAgICIiIgogICAgICAgIGN1cnJlbnRfZW52aXJvbm1lbnQgPSBkZWZhdWx0X2Vudmlyb25tZW50KCkKICAgICAgICBpZiBlbnZpcm9ubWVudCBpcyBub3QgTm9uZToKICAgICAgICAgICAgY3VycmVudF9lbnZpcm9ubWVudC51cGRhdGUoZW52aXJvbm1lbnQpCgogICAgICAgIHJldHVybiBfZXZhbHVhdGVfbWFya2VycyhzZWxmLl9tYXJrZXJzLCBjdXJyZW50X2Vudmlyb25tZW50KQpQSwMEFAAAAAAAAAAhAK4Rn/PnEAAA5xAAADUAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcGFja2FnaW5nL3JlcXVpcmVtZW50cy5weSMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbgojIDIuMCwgYW5kIHRoZSBCU0QgTGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyByZXBvc2l0b3J5CiMgZm9yIGNvbXBsZXRlIGRldGFpbHMuCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgcHJpbnRfZnVuY3Rpb24KCmltcG9ydCBzdHJpbmcKaW1wb3J0IHJlCgpmcm9tIHBpcC5fdmVuZG9yLnB5cGFyc2luZyBpbXBvcnQgKAogICAgc3RyaW5nU3RhcnQsIHN0cmluZ0VuZCwgb3JpZ2luYWxUZXh0Rm9yLCBQYXJzZUV4Y2VwdGlvbgopCmZyb20gcGlwLl92ZW5kb3IucHlwYXJzaW5nIGltcG9ydCBaZXJvT3JNb3JlLCBXb3JkLCBPcHRpb25hbCwgUmVnZXgsIENvbWJpbmUKZnJvbSBwaXAuX3ZlbmRvci5weXBhcnNpbmcgaW1wb3J0IExpdGVyYWwgYXMgTCAgIyBub3FhCmZyb20gcGlwLl92ZW5kb3Iuc2l4Lm1vdmVzLnVybGxpYiBpbXBvcnQgcGFyc2UgYXMgdXJscGFyc2UKCmZyb20gLm1hcmtlcnMgaW1wb3J0IE1BUktFUl9FWFBSLCBNYXJrZXIKZnJvbSAuc3BlY2lmaWVycyBpbXBvcnQgTGVnYWN5U3BlY2lmaWVyLCBTcGVjaWZpZXIsIFNwZWNpZmllclNldAoKCmNsYXNzIEludmFsaWRSZXF1aXJlbWVudChWYWx1ZUVycm9yKToKICAgICIiIgogICAgQW4gaW52YWxpZCByZXF1aXJlbWVudCB3YXMgZm91bmQsIHVzZXJzIHNob3VsZCByZWZlciB0byBQRVAgNTA4LgogICAgIiIiCgoKQUxQSEFOVU0gPSBXb3JkKHN0cmluZy5hc2NpaV9sZXR0ZXJzICsgc3RyaW5nLmRpZ2l0cykKCkxCUkFDS0VUID0gTCgiWyIpLnN1cHByZXNzKCkKUkJSQUNLRVQgPSBMKCJdIikuc3VwcHJlc3MoKQpMUEFSRU4gPSBMKCIoIikuc3VwcHJlc3MoKQpSUEFSRU4gPSBMKCIpIikuc3VwcHJlc3MoKQpDT01NQSA9IEwoIiwiKS5zdXBwcmVzcygpClNFTUlDT0xPTiA9IEwoIjsiKS5zdXBwcmVzcygpCkFUID0gTCgiQCIpLnN1cHByZXNzKCkKClBVTkNUVUFUSU9OID0gV29yZCgiLV8uIikKSURFTlRJRklFUl9FTkQgPSBBTFBIQU5VTSB8IChaZXJvT3JNb3JlKFBVTkNUVUFUSU9OKSArIEFMUEhBTlVNKQpJREVOVElGSUVSID0gQ29tYmluZShBTFBIQU5VTSArIFplcm9Pck1vcmUoSURFTlRJRklFUl9FTkQpKQoKTkFNRSA9IElERU5USUZJRVIoIm5hbWUiKQpFWFRSQSA9IElERU5USUZJRVIKClVSSSA9IFJlZ2V4KHInW14gXSsnKSgidXJsIikKVVJMID0gKEFUICsgVVJJKQoKRVhUUkFTX0xJU1QgPSBFWFRSQSArIFplcm9Pck1vcmUoQ09NTUEgKyBFWFRSQSkKRVhUUkFTID0gKExCUkFDS0VUICsgT3B0aW9uYWwoRVhUUkFTX0xJU1QpICsgUkJSQUNLRVQpKCJleHRyYXMiKQoKVkVSU0lPTl9QRVA0NDAgPSBSZWdleChTcGVjaWZpZXIuX3JlZ2V4X3N0ciwgcmUuVkVSQk9TRSB8IHJlLklHTk9SRUNBU0UpClZFUlNJT05fTEVHQUNZID0gUmVnZXgoTGVnYWN5U3BlY2lmaWVyLl9yZWdleF9zdHIsIHJlLlZFUkJPU0UgfCByZS5JR05PUkVDQVNFKQoKVkVSU0lPTl9PTkUgPSBWRVJTSU9OX1BFUDQ0MCBeIFZFUlNJT05fTEVHQUNZClZFUlNJT05fTUFOWSA9IENvbWJpbmUoVkVSU0lPTl9PTkUgKyBaZXJvT3JNb3JlKENPTU1BICsgVkVSU0lPTl9PTkUpLAogICAgICAgICAgICAgICAgICAgICAgIGpvaW5TdHJpbmc9IiwiLCBhZGphY2VudD1GYWxzZSkoIl9yYXdfc3BlYyIpCl9WRVJTSU9OX1NQRUMgPSBPcHRpb25hbCgoKExQQVJFTiArIFZFUlNJT05fTUFOWSArIFJQQVJFTikgfCBWRVJTSU9OX01BTlkpKQpfVkVSU0lPTl9TUEVDLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLCBsLCB0OiB0Ll9yYXdfc3BlYyBvciAnJykKClZFUlNJT05fU1BFQyA9IG9yaWdpbmFsVGV4dEZvcihfVkVSU0lPTl9TUEVDKSgic3BlY2lmaWVyIikKVkVSU0lPTl9TUEVDLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLCBsLCB0OiB0WzFdKQoKTUFSS0VSX0VYUFIgPSBvcmlnaW5hbFRleHRGb3IoTUFSS0VSX0VYUFIoKSkoIm1hcmtlciIpCk1BUktFUl9FWFBSLnNldFBhcnNlQWN0aW9uKAogICAgbGFtYmRhIHMsIGwsIHQ6IE1hcmtlcihzW3QuX29yaWdpbmFsX3N0YXJ0OnQuX29yaWdpbmFsX2VuZF0pCikKTUFSS0VSX1NFUEVSQVRPUiA9IFNFTUlDT0xPTgpNQVJLRVIgPSBNQVJLRVJfU0VQRVJBVE9SICsgTUFSS0VSX0VYUFIKClZFUlNJT05fQU5EX01BUktFUiA9IFZFUlNJT05fU1BFQyArIE9wdGlvbmFsKE1BUktFUikKVVJMX0FORF9NQVJLRVIgPSBVUkwgKyBPcHRpb25hbChNQVJLRVIpCgpOQU1FRF9SRVFVSVJFTUVOVCA9IFwKICAgIE5BTUUgKyBPcHRpb25hbChFWFRSQVMpICsgKFVSTF9BTkRfTUFSS0VSIHwgVkVSU0lPTl9BTkRfTUFSS0VSKQoKUkVRVUlSRU1FTlQgPSBzdHJpbmdTdGFydCArIE5BTUVEX1JFUVVJUkVNRU5UICsgc3RyaW5nRW5kCgoKY2xhc3MgUmVxdWlyZW1lbnQob2JqZWN0KToKICAgICIiIlBhcnNlIGEgcmVxdWlyZW1lbnQuCgogICAgUGFyc2UgYSBnaXZlbiByZXF1aXJlbWVudCBzdHJpbmcgaW50byBpdHMgcGFydHMsIHN1Y2ggYXMgbmFtZSwgc3BlY2lmaWVyLAogICAgVVJMLCBhbmQgZXh0cmFzLiBSYWlzZXMgSW52YWxpZFJlcXVpcmVtZW50IG9uIGEgYmFkbHktZm9ybWVkIHJlcXVpcmVtZW50CiAgICBzdHJpbmcuCiAgICAiIiIKCiAgICAjIFRPRE86IENhbiB3ZSB0ZXN0IHdoZXRoZXIgc29tZXRoaW5nIGlzIGNvbnRhaW5lZCB3aXRoaW4gYSByZXF1aXJlbWVudD8KICAgICMgICAgICAgSWYgc28gaG93IGRvIHdlIGRvIHRoYXQ/IERvIHdlIG5lZWQgdG8gdGVzdCBhZ2FpbnN0IHRoZSBfbmFtZV8gb2YKICAgICMgICAgICAgdGhlIHRoaW5nIGFzIHdlbGwgYXMgdGhlIHZlcnNpb24/IFdoYXQgYWJvdXQgdGhlIG1hcmtlcnM/CiAgICAjIFRPRE86IENhbiB3ZSBub3JtYWxpemUgdGhlIG5hbWUgYW5kIGV4dHJhIG5hbWU/CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHJlcXVpcmVtZW50X3N0cmluZyk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXEgPSBSRVFVSVJFTUVOVC5wYXJzZVN0cmluZyhyZXF1aXJlbWVudF9zdHJpbmcpCiAgICAgICAgZXhjZXB0IFBhcnNlRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIHJhaXNlIEludmFsaWRSZXF1aXJlbWVudCgKICAgICAgICAgICAgICAgICJJbnZhbGlkIHJlcXVpcmVtZW50LCBwYXJzZSBlcnJvciBhdCBcInswIXJ9XCIiLmZvcm1hdCgKICAgICAgICAgICAgICAgICAgICByZXF1aXJlbWVudF9zdHJpbmdbZS5sb2M6ZS5sb2MgKyA4XSkpCgogICAgICAgIHNlbGYubmFtZSA9IHJlcS5uYW1lCiAgICAgICAgaWYgcmVxLnVybDoKICAgICAgICAgICAgcGFyc2VkX3VybCA9IHVybHBhcnNlLnVybHBhcnNlKHJlcS51cmwpCiAgICAgICAgICAgIGlmIG5vdCAocGFyc2VkX3VybC5zY2hlbWUgYW5kIHBhcnNlZF91cmwubmV0bG9jKSBvciAoCiAgICAgICAgICAgICAgICAgICAgbm90IHBhcnNlZF91cmwuc2NoZW1lIGFuZCBub3QgcGFyc2VkX3VybC5uZXRsb2MpOgogICAgICAgICAgICAgICAgcmFpc2UgSW52YWxpZFJlcXVpcmVtZW50KCJJbnZhbGlkIFVSTCBnaXZlbiIpCiAgICAgICAgICAgIHNlbGYudXJsID0gcmVxLnVybAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYudXJsID0gTm9uZQogICAgICAgIHNlbGYuZXh0cmFzID0gc2V0KHJlcS5leHRyYXMuYXNMaXN0KCkgaWYgcmVxLmV4dHJhcyBlbHNlIFtdKQogICAgICAgIHNlbGYuc3BlY2lmaWVyID0gU3BlY2lmaWVyU2V0KHJlcS5zcGVjaWZpZXIpCiAgICAgICAgc2VsZi5tYXJrZXIgPSByZXEubWFya2VyIGlmIHJlcS5tYXJrZXIgZWxzZSBOb25lCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcGFydHMgPSBbc2VsZi5uYW1lXQoKICAgICAgICBpZiBzZWxmLmV4dHJhczoKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCJbezB9XSIuZm9ybWF0KCIsIi5qb2luKHNvcnRlZChzZWxmLmV4dHJhcykpKSkKCiAgICAgICAgaWYgc2VsZi5zcGVjaWZpZXI6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZChzdHIoc2VsZi5zcGVjaWZpZXIpKQoKICAgICAgICBpZiBzZWxmLnVybDoKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCJAIHswfSIuZm9ybWF0KHNlbGYudXJsKSkKCiAgICAgICAgaWYgc2VsZi5tYXJrZXI6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgiOyB7MH0iLmZvcm1hdChzZWxmLm1hcmtlcikpCgogICAgICAgIHJldHVybiAiIi5qb2luKHBhcnRzKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIjxSZXF1aXJlbWVudCh7MCFyfSk+Ii5mb3JtYXQoc3RyKHNlbGYpKQpQSwMEFAAAAAAAAAAhAHxFg4x5bQAAeW0AADMAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcGFja2FnaW5nL3NwZWNpZmllcnMucHkjIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24KIyAyLjAsIGFuZCB0aGUgQlNEIExpY2Vuc2UuIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcmVwb3NpdG9yeQojIGZvciBjb21wbGV0ZSBkZXRhaWxzLgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHByaW50X2Z1bmN0aW9uCgppbXBvcnQgYWJjCmltcG9ydCBmdW5jdG9vbHMKaW1wb3J0IGl0ZXJ0b29scwppbXBvcnQgcmUKCmZyb20gLl9jb21wYXQgaW1wb3J0IHN0cmluZ190eXBlcywgd2l0aF9tZXRhY2xhc3MKZnJvbSAudmVyc2lvbiBpbXBvcnQgVmVyc2lvbiwgTGVnYWN5VmVyc2lvbiwgcGFyc2UKCgpjbGFzcyBJbnZhbGlkU3BlY2lmaWVyKFZhbHVlRXJyb3IpOgogICAgIiIiCiAgICBBbiBpbnZhbGlkIHNwZWNpZmllciB3YXMgZm91bmQsIHVzZXJzIHNob3VsZCByZWZlciB0byBQRVAgNDQwLgogICAgIiIiCgoKY2xhc3MgQmFzZVNwZWNpZmllcih3aXRoX21ldGFjbGFzcyhhYmMuQUJDTWV0YSwgb2JqZWN0KSk6CgogICAgQGFiYy5hYnN0cmFjdG1ldGhvZAogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJucyB0aGUgc3RyIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgU3BlY2lmaWVyIGxpa2Ugb2JqZWN0LiBUaGlzCiAgICAgICAgc2hvdWxkIGJlIHJlcHJlc2VudGF0aXZlIG9mIHRoZSBTcGVjaWZpZXIgaXRzZWxmLgogICAgICAgICIiIgoKICAgIEBhYmMuYWJzdHJhY3RtZXRob2QKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm5zIGEgaGFzaCB2YWx1ZSBmb3IgdGhpcyBTcGVjaWZpZXIgbGlrZSBvYmplY3QuCiAgICAgICAgIiIiCgogICAgQGFiYy5hYnN0cmFjdG1ldGhvZAogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJucyBhIGJvb2xlYW4gcmVwcmVzZW50aW5nIHdoZXRoZXIgb3Igbm90IHRoZSB0d28gU3BlY2lmaWVyIGxpa2UKICAgICAgICBvYmplY3RzIGFyZSBlcXVhbC4KICAgICAgICAiIiIKCiAgICBAYWJjLmFic3RyYWN0bWV0aG9kCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm5zIGEgYm9vbGVhbiByZXByZXNlbnRpbmcgd2hldGhlciBvciBub3QgdGhlIHR3byBTcGVjaWZpZXIgbGlrZQogICAgICAgIG9iamVjdHMgYXJlIG5vdCBlcXVhbC4KICAgICAgICAiIiIKCiAgICBAYWJjLmFic3RyYWN0cHJvcGVydHkKICAgIGRlZiBwcmVyZWxlYXNlcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHByZS1yZWxlYXNlcyBhcyBhIHdob2xlIGFyZSBhbGxvd2VkIGJ5IHRoaXMKICAgICAgICBzcGVjaWZpZXIuCiAgICAgICAgIiIiCgogICAgQHByZXJlbGVhc2VzLnNldHRlcgogICAgZGVmIHByZXJlbGVhc2VzKHNlbGYsIHZhbHVlKToKICAgICAgICAiIiIKICAgICAgICBTZXRzIHdoZXRoZXIgb3Igbm90IHByZS1yZWxlYXNlcyBhcyBhIHdob2xlIGFyZSBhbGxvd2VkIGJ5IHRoaXMKICAgICAgICBzcGVjaWZpZXIuCiAgICAgICAgIiIiCgogICAgQGFiYy5hYnN0cmFjdG1ldGhvZAogICAgZGVmIGNvbnRhaW5zKHNlbGYsIGl0ZW0sIHByZXJlbGVhc2VzPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIERldGVybWluZXMgaWYgdGhlIGdpdmVuIGl0ZW0gaXMgY29udGFpbmVkIHdpdGhpbiB0aGlzIHNwZWNpZmllci4KICAgICAgICAiIiIKCiAgICBAYWJjLmFic3RyYWN0bWV0aG9kCiAgICBkZWYgZmlsdGVyKHNlbGYsIGl0ZXJhYmxlLCBwcmVyZWxlYXNlcz1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBUYWtlcyBhbiBpdGVyYWJsZSBvZiBpdGVtcyBhbmQgZmlsdGVycyB0aGVtIHNvIHRoYXQgb25seSBpdGVtcyB3aGljaAogICAgICAgIGFyZSBjb250YWluZWQgd2l0aGluIHRoaXMgc3BlY2lmaWVyIGFyZSBhbGxvd2VkIGluIGl0LgogICAgICAgICIiIgoKCmNsYXNzIF9JbmRpdmlkdWFsU3BlY2lmaWVyKEJhc2VTcGVjaWZpZXIpOgoKICAgIF9vcGVyYXRvcnMgPSB7fQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzcGVjPSIiLCBwcmVyZWxlYXNlcz1Ob25lKToKICAgICAgICBtYXRjaCA9IHNlbGYuX3JlZ2V4LnNlYXJjaChzcGVjKQogICAgICAgIGlmIG5vdCBtYXRjaDoKICAgICAgICAgICAgcmFpc2UgSW52YWxpZFNwZWNpZmllcigiSW52YWxpZCBzcGVjaWZpZXI6ICd7MH0nIi5mb3JtYXQoc3BlYykpCgogICAgICAgIHNlbGYuX3NwZWMgPSAoCiAgICAgICAgICAgIG1hdGNoLmdyb3VwKCJvcGVyYXRvciIpLnN0cmlwKCksCiAgICAgICAgICAgIG1hdGNoLmdyb3VwKCJ2ZXJzaW9uIikuc3RyaXAoKSwKICAgICAgICApCgogICAgICAgICMgU3RvcmUgd2hldGhlciBvciBub3QgdGhpcyBTcGVjaWZpZXIgc2hvdWxkIGFjY2VwdCBwcmVyZWxlYXNlcwogICAgICAgIHNlbGYuX3ByZXJlbGVhc2VzID0gcHJlcmVsZWFzZXMKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcHJlID0gKAogICAgICAgICAgICAiLCBwcmVyZWxlYXNlcz17MCFyfSIuZm9ybWF0KHNlbGYucHJlcmVsZWFzZXMpCiAgICAgICAgICAgIGlmIHNlbGYuX3ByZXJlbGVhc2VzIGlzIG5vdCBOb25lCiAgICAgICAgICAgIGVsc2UgIiIKICAgICAgICApCgogICAgICAgIHJldHVybiAiPHswfSh7MSFyfXsyfSk+Ii5mb3JtYXQoCiAgICAgICAgICAgIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLAogICAgICAgICAgICBzdHIoc2VsZiksCiAgICAgICAgICAgIHByZSwKICAgICAgICApCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuICJ7MH17MX0iLmZvcm1hdCgqc2VsZi5fc3BlYykKCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGhhc2goc2VsZi5fc3BlYykKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBzdHJpbmdfdHlwZXMpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBvdGhlciA9IHNlbGYuX19jbGFzc19fKG90aGVyKQogICAgICAgICAgICBleGNlcHQgSW52YWxpZFNwZWNpZmllcjoKICAgICAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCgogICAgICAgIHJldHVybiBzZWxmLl9zcGVjID09IG90aGVyLl9zcGVjCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgb3RoZXIgPSBzZWxmLl9fY2xhc3NfXyhvdGhlcikKICAgICAgICAgICAgZXhjZXB0IEludmFsaWRTcGVjaWZpZXI6CiAgICAgICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXyk6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAoKICAgICAgICByZXR1cm4gc2VsZi5fc3BlYyAhPSBvdGhlci5fc3BlYwoKICAgIGRlZiBfZ2V0X29wZXJhdG9yKHNlbGYsIG9wKToKICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLCAiX2NvbXBhcmVfezB9Ii5mb3JtYXQoc2VsZi5fb3BlcmF0b3JzW29wXSkpCgogICAgZGVmIF9jb2VyY2VfdmVyc2lvbihzZWxmLCB2ZXJzaW9uKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2ZXJzaW9uLCAoTGVnYWN5VmVyc2lvbiwgVmVyc2lvbikpOgogICAgICAgICAgICB2ZXJzaW9uID0gcGFyc2UodmVyc2lvbikKICAgICAgICByZXR1cm4gdmVyc2lvbgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIG9wZXJhdG9yKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9zcGVjWzBdCgogICAgQHByb3BlcnR5CiAgICBkZWYgdmVyc2lvbihzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fc3BlY1sxXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHByZXJlbGVhc2VzKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9wcmVyZWxlYXNlcwoKICAgIEBwcmVyZWxlYXNlcy5zZXR0ZXIKICAgIGRlZiBwcmVyZWxlYXNlcyhzZWxmLCB2YWx1ZSk6CiAgICAgICAgc2VsZi5fcHJlcmVsZWFzZXMgPSB2YWx1ZQoKICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgaXRlbSk6CiAgICAgICAgcmV0dXJuIHNlbGYuY29udGFpbnMoaXRlbSkKCiAgICBkZWYgY29udGFpbnMoc2VsZiwgaXRlbSwgcHJlcmVsZWFzZXM9Tm9uZSk6CiAgICAgICAgIyBEZXRlcm1pbmUgaWYgcHJlcmVsZWFzZXMgYXJlIHRvIGJlIGFsbG93ZWQgb3Igbm90LgogICAgICAgIGlmIHByZXJlbGVhc2VzIGlzIE5vbmU6CiAgICAgICAgICAgIHByZXJlbGVhc2VzID0gc2VsZi5wcmVyZWxlYXNlcwoKICAgICAgICAjIE5vcm1hbGl6ZSBpdGVtIHRvIGEgVmVyc2lvbiBvciBMZWdhY3lWZXJzaW9uLCB0aGlzIGFsbG93cyB1cyB0byBoYXZlCiAgICAgICAgIyBhIHNob3J0Y3V0IGZvciBgYCIyLjAiIGluIFNwZWNpZmllcigiPj0yIikKICAgICAgICBpdGVtID0gc2VsZi5fY29lcmNlX3ZlcnNpb24oaXRlbSkKCiAgICAgICAgIyBEZXRlcm1pbmUgaWYgd2Ugc2hvdWxkIGJlIHN1cHBvcnRpbmcgcHJlcmVsZWFzZXMgaW4gdGhpcyBzcGVjaWZpZXIKICAgICAgICAjIG9yIG5vdCwgaWYgd2UgZG8gbm90IHN1cHBvcnQgcHJlcmVsZWFzZXMgdGhhbiB3ZSBjYW4gc2hvcnQgY2lyY3VpdAogICAgICAgICMgbG9naWMgaWYgdGhpcyB2ZXJzaW9uIGlzIGEgcHJlcmVsZWFzZXMuCiAgICAgICAgaWYgaXRlbS5pc19wcmVyZWxlYXNlIGFuZCBub3QgcHJlcmVsZWFzZXM6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIEFjdHVhbGx5IGRvIHRoZSBjb21wYXJpc29uIHRvIGRldGVybWluZSBpZiB0aGlzIGl0ZW0gaXMgY29udGFpbmVkCiAgICAgICAgIyB3aXRoaW4gdGhpcyBTcGVjaWZpZXIgb3Igbm90LgogICAgICAgIHJldHVybiBzZWxmLl9nZXRfb3BlcmF0b3Ioc2VsZi5vcGVyYXRvcikoaXRlbSwgc2VsZi52ZXJzaW9uKQoKICAgIGRlZiBmaWx0ZXIoc2VsZiwgaXRlcmFibGUsIHByZXJlbGVhc2VzPU5vbmUpOgogICAgICAgIHlpZWxkZWQgPSBGYWxzZQogICAgICAgIGZvdW5kX3ByZXJlbGVhc2VzID0gW10KCiAgICAgICAga3cgPSB7InByZXJlbGVhc2VzIjogcHJlcmVsZWFzZXMgaWYgcHJlcmVsZWFzZXMgaXMgbm90IE5vbmUgZWxzZSBUcnVlfQoKICAgICAgICAjIEF0dGVtcHQgdG8gaXRlcmF0ZSBvdmVyIGFsbCB0aGUgdmFsdWVzIGluIHRoZSBpdGVyYWJsZSBhbmQgaWYgYW55IG9mCiAgICAgICAgIyB0aGVtIG1hdGNoLCB5aWVsZCB0aGVtLgogICAgICAgIGZvciB2ZXJzaW9uIGluIGl0ZXJhYmxlOgogICAgICAgICAgICBwYXJzZWRfdmVyc2lvbiA9IHNlbGYuX2NvZXJjZV92ZXJzaW9uKHZlcnNpb24pCgogICAgICAgICAgICBpZiBzZWxmLmNvbnRhaW5zKHBhcnNlZF92ZXJzaW9uLCAqKmt3KToKICAgICAgICAgICAgICAgICMgSWYgb3VyIHZlcnNpb24gaXMgYSBwcmVyZWxlYXNlLCBhbmQgd2Ugd2VyZSBub3Qgc2V0IHRvIGFsbG93CiAgICAgICAgICAgICAgICAjIHByZXJlbGVhc2VzLCB0aGVuIHdlJ2xsIHN0b3JlIGl0IGZvciBsYXRlciBpbmNhc2Ugbm90aGluZwogICAgICAgICAgICAgICAgIyBlbHNlIG1hdGNoZXMgdGhpcyBzcGVjaWZpZXIuCiAgICAgICAgICAgICAgICBpZiAocGFyc2VkX3ZlcnNpb24uaXNfcHJlcmVsZWFzZSBhbmQgbm90CiAgICAgICAgICAgICAgICAgICAgICAgIChwcmVyZWxlYXNlcyBvciBzZWxmLnByZXJlbGVhc2VzKSk6CiAgICAgICAgICAgICAgICAgICAgZm91bmRfcHJlcmVsZWFzZXMuYXBwZW5kKHZlcnNpb24pCiAgICAgICAgICAgICAgICAjIEVpdGhlciB0aGlzIGlzIG5vdCBhIHByZXJlbGVhc2UsIG9yIHdlIHNob3VsZCBoYXZlIGJlZW4KICAgICAgICAgICAgICAgICMgYWNjZXB0aW5nIHByZXJlbGVhc2VzIGZyb20gdGhlIGJlZ2luaW5nLgogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICB5aWVsZGVkID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgIHlpZWxkIHZlcnNpb24KCiAgICAgICAgIyBOb3cgdGhhdCB3ZSd2ZSBpdGVyYXRlZCBvdmVyIGV2ZXJ5dGhpbmcsIGRldGVybWluZSBpZiB3ZSd2ZSB5aWVsZGVkCiAgICAgICAgIyBhbnkgdmFsdWVzLCBhbmQgaWYgd2UgaGF2ZSBub3QgYW5kIHdlIGhhdmUgYW55IHByZXJlbGVhc2VzIHN0b3JlZCB1cAogICAgICAgICMgdGhlbiB3ZSB3aWxsIGdvIGFoZWFkIGFuZCB5aWVsZCB0aGUgcHJlcmVsZWFzZXMuCiAgICAgICAgaWYgbm90IHlpZWxkZWQgYW5kIGZvdW5kX3ByZXJlbGVhc2VzOgogICAgICAgICAgICBmb3IgdmVyc2lvbiBpbiBmb3VuZF9wcmVyZWxlYXNlczoKICAgICAgICAgICAgICAgIHlpZWxkIHZlcnNpb24KCgpjbGFzcyBMZWdhY3lTcGVjaWZpZXIoX0luZGl2aWR1YWxTcGVjaWZpZXIpOgoKICAgIF9yZWdleF9zdHIgPSAoCiAgICAgICAgciIiIgogICAgICAgICg/UDxvcGVyYXRvcj4oPT18IT18PD18Pj18PHw+KSkKICAgICAgICBccyoKICAgICAgICAoP1A8dmVyc2lvbj4KICAgICAgICAgICAgW14sO1xzKV0qICMgU2luY2UgdGhpcyBpcyBhICJsZWdhY3kiIHNwZWNpZmllciwgYW5kIHRoZSB2ZXJzaW9uCiAgICAgICAgICAgICAgICAgICAgICAjIHN0cmluZyBjYW4gYmUganVzdCBhYm91dCBhbnl0aGluZywgd2UgbWF0Y2ggZXZlcnl0aGluZwogICAgICAgICAgICAgICAgICAgICAgIyBleGNlcHQgZm9yIHdoaXRlc3BhY2UsIGEgc2VtaS1jb2xvbiBmb3IgbWFya2VyIHN1cHBvcnQsCiAgICAgICAgICAgICAgICAgICAgICAjIGEgY2xvc2luZyBwYXJlbiBzaW5jZSB2ZXJzaW9ucyBjYW4gYmUgZW5jbG9zZWQgaW4KICAgICAgICAgICAgICAgICAgICAgICMgdGhlbSwgYW5kIGEgY29tbWEgc2luY2UgaXQncyBhIHZlcnNpb24gc2VwYXJhdG9yLgogICAgICAgICkKICAgICAgICAiIiIKICAgICkKCiAgICBfcmVnZXggPSByZS5jb21waWxlKAogICAgICAgIHIiXlxzKiIgKyBfcmVnZXhfc3RyICsgciJccyokIiwgcmUuVkVSQk9TRSB8IHJlLklHTk9SRUNBU0UpCgogICAgX29wZXJhdG9ycyA9IHsKICAgICAgICAiPT0iOiAiZXF1YWwiLAogICAgICAgICIhPSI6ICJub3RfZXF1YWwiLAogICAgICAgICI8PSI6ICJsZXNzX3RoYW5fZXF1YWwiLAogICAgICAgICI+PSI6ICJncmVhdGVyX3RoYW5fZXF1YWwiLAogICAgICAgICI8IjogImxlc3NfdGhhbiIsCiAgICAgICAgIj4iOiAiZ3JlYXRlcl90aGFuIiwKICAgIH0KCiAgICBkZWYgX2NvZXJjZV92ZXJzaW9uKHNlbGYsIHZlcnNpb24pOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHZlcnNpb24sIExlZ2FjeVZlcnNpb24pOgogICAgICAgICAgICB2ZXJzaW9uID0gTGVnYWN5VmVyc2lvbihzdHIodmVyc2lvbikpCiAgICAgICAgcmV0dXJuIHZlcnNpb24KCiAgICBkZWYgX2NvbXBhcmVfZXF1YWwoc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgIHJldHVybiBwcm9zcGVjdGl2ZSA9PSBzZWxmLl9jb2VyY2VfdmVyc2lvbihzcGVjKQoKICAgIGRlZiBfY29tcGFyZV9ub3RfZXF1YWwoc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgIHJldHVybiBwcm9zcGVjdGl2ZSAhPSBzZWxmLl9jb2VyY2VfdmVyc2lvbihzcGVjKQoKICAgIGRlZiBfY29tcGFyZV9sZXNzX3RoYW5fZXF1YWwoc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgIHJldHVybiBwcm9zcGVjdGl2ZSA8PSBzZWxmLl9jb2VyY2VfdmVyc2lvbihzcGVjKQoKICAgIGRlZiBfY29tcGFyZV9ncmVhdGVyX3RoYW5fZXF1YWwoc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgIHJldHVybiBwcm9zcGVjdGl2ZSA+PSBzZWxmLl9jb2VyY2VfdmVyc2lvbihzcGVjKQoKICAgIGRlZiBfY29tcGFyZV9sZXNzX3RoYW4oc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgIHJldHVybiBwcm9zcGVjdGl2ZSA8IHNlbGYuX2NvZXJjZV92ZXJzaW9uKHNwZWMpCgogICAgZGVmIF9jb21wYXJlX2dyZWF0ZXJfdGhhbihzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgcmV0dXJuIHByb3NwZWN0aXZlID4gc2VsZi5fY29lcmNlX3ZlcnNpb24oc3BlYykKCgpkZWYgX3JlcXVpcmVfdmVyc2lvbl9jb21wYXJlKGZuKToKICAgIEBmdW5jdG9vbHMud3JhcHMoZm4pCiAgICBkZWYgd3JhcHBlZChzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UocHJvc3BlY3RpdmUsIFZlcnNpb24pOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICByZXR1cm4gZm4oc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpCiAgICByZXR1cm4gd3JhcHBlZAoKCmNsYXNzIFNwZWNpZmllcihfSW5kaXZpZHVhbFNwZWNpZmllcik6CgogICAgX3JlZ2V4X3N0ciA9ICgKICAgICAgICByIiIiCiAgICAgICAgKD9QPG9wZXJhdG9yPih+PXw9PXwhPXw8PXw+PXw8fD58PT09KSkKICAgICAgICAoP1A8dmVyc2lvbj4KICAgICAgICAgICAgKD86CiAgICAgICAgICAgICAgICAjIFRoZSBpZGVudGl0eSBvcGVyYXRvcnMgYWxsb3cgZm9yIGFuIGVzY2FwZSBoYXRjaCB0aGF0IHdpbGwKICAgICAgICAgICAgICAgICMgZG8gYW4gZXhhY3Qgc3RyaW5nIG1hdGNoIG9mIHRoZSB2ZXJzaW9uIHlvdSB3aXNoIHRvIGluc3RhbGwuCiAgICAgICAgICAgICAgICAjIFRoaXMgd2lsbCBub3QgYmUgcGFyc2VkIGJ5IFBFUCA0NDAgYW5kIHdlIGNhbm5vdCBkZXRlcm1pbmUKICAgICAgICAgICAgICAgICMgYW55IHNlbWFudGljIG1lYW5pbmcgZnJvbSBpdC4gVGhpcyBvcGVyYXRvciBpcyBkaXNjb3VyYWdlZAogICAgICAgICAgICAgICAgIyBidXQgaW5jbHVkZWQgZW50aXJlbHkgYXMgYW4gZXNjYXBlIGhhdGNoLgogICAgICAgICAgICAgICAgKD88PT09PSkgICMgT25seSBtYXRjaCBmb3IgdGhlIGlkZW50aXR5IG9wZXJhdG9yCiAgICAgICAgICAgICAgICBccyoKICAgICAgICAgICAgICAgIFteXHNdKiAgICAjIFdlIGp1c3QgbWF0Y2ggZXZlcnl0aGluZywgZXhjZXB0IGZvciB3aGl0ZXNwYWNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzaW5jZSB3ZSBhcmUgb25seSB0ZXN0aW5nIGZvciBzdHJpY3QgaWRlbnRpdHkuCiAgICAgICAgICAgICkKICAgICAgICAgICAgfAogICAgICAgICAgICAoPzoKICAgICAgICAgICAgICAgICMgVGhlIChub24pZXF1YWxpdHkgb3BlcmF0b3JzIGFsbG93IGZvciB3aWxkIGNhcmQgYW5kIGxvY2FsCiAgICAgICAgICAgICAgICAjIHZlcnNpb25zIHRvIGJlIHNwZWNpZmllZCBzbyB3ZSBoYXZlIHRvIGRlZmluZSB0aGVzZSB0d28KICAgICAgICAgICAgICAgICMgb3BlcmF0b3JzIHNlcGFyYXRlbHkgdG8gZW5hYmxlIHRoYXQuCiAgICAgICAgICAgICAgICAoPzw9PT18IT0pICAgICAgICAgICAgIyBPbmx5IG1hdGNoIGZvciBlcXVhbHMgYW5kIG5vdCBlcXVhbHMKCiAgICAgICAgICAgICAgICBccyoKICAgICAgICAgICAgICAgIHY/CiAgICAgICAgICAgICAgICAoPzpbMC05XSshKT8gICAgICAgICAgIyBlcG9jaAogICAgICAgICAgICAgICAgWzAtOV0rKD86XC5bMC05XSspKiAgICMgcmVsZWFzZQogICAgICAgICAgICAgICAgKD86ICAgICAgICAgICAgICAgICAgICMgcHJlIHJlbGVhc2UKICAgICAgICAgICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICAgICAgICAgKGF8YnxjfHJjfGFscGhhfGJldGF8cHJlfHByZXZpZXcpCiAgICAgICAgICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAgICAgICAgIFswLTldKgogICAgICAgICAgICAgICAgKT8KICAgICAgICAgICAgICAgICg/OiAgICAgICAgICAgICAgICAgICAjIHBvc3QgcmVsZWFzZQogICAgICAgICAgICAgICAgICAgICg/Oi1bMC05XSspfCg/OlstX1wuXT8ocG9zdHxyZXZ8cilbLV9cLl0/WzAtOV0qKQogICAgICAgICAgICAgICAgKT8KCiAgICAgICAgICAgICAgICAjIFlvdSBjYW5ub3QgdXNlIGEgd2lsZCBjYXJkIGFuZCBhIGRldiBvciBsb2NhbCB2ZXJzaW9uCiAgICAgICAgICAgICAgICAjIHRvZ2V0aGVyIHNvIGdyb3VwIHRoZW0gd2l0aCBhIHwgYW5kIG1ha2UgdGhlbSBvcHRpb25hbC4KICAgICAgICAgICAgICAgICg/OgogICAgICAgICAgICAgICAgICAgICg/OlstX1wuXT9kZXZbLV9cLl0/WzAtOV0qKT8gICAgICAgICAjIGRldiByZWxlYXNlCiAgICAgICAgICAgICAgICAgICAgKD86XCtbYS16MC05XSsoPzpbLV9cLl1bYS16MC05XSspKik/ICMgbG9jYWwKICAgICAgICAgICAgICAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgXC5cKiAgIyBXaWxkIGNhcmQgc3ludGF4IG9mIC4qCiAgICAgICAgICAgICAgICApPwogICAgICAgICAgICApCiAgICAgICAgICAgIHwKICAgICAgICAgICAgKD86CiAgICAgICAgICAgICAgICAjIFRoZSBjb21wYXRpYmxlIG9wZXJhdG9yIHJlcXVpcmVzIGF0IGxlYXN0IHR3byBkaWdpdHMgaW4gdGhlCiAgICAgICAgICAgICAgICAjIHJlbGVhc2Ugc2VnbWVudC4KICAgICAgICAgICAgICAgICg/PD1+PSkgICAgICAgICAgICAgICAjIE9ubHkgbWF0Y2ggZm9yIHRoZSBjb21wYXRpYmxlIG9wZXJhdG9yCgogICAgICAgICAgICAgICAgXHMqCiAgICAgICAgICAgICAgICB2PwogICAgICAgICAgICAgICAgKD86WzAtOV0rISk/ICAgICAgICAgICMgZXBvY2gKICAgICAgICAgICAgICAgIFswLTldKyg/OlwuWzAtOV0rKSsgICAjIHJlbGVhc2UgIChXZSBoYXZlIGEgKyBpbnN0ZWFkIG9mIGEgKikKICAgICAgICAgICAgICAgICg/OiAgICAgICAgICAgICAgICAgICAjIHByZSByZWxlYXNlCiAgICAgICAgICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAgICAgICAgIChhfGJ8Y3xyY3xhbHBoYXxiZXRhfHByZXxwcmV2aWV3KQogICAgICAgICAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgICAgICAgICBbMC05XSoKICAgICAgICAgICAgICAgICk/CiAgICAgICAgICAgICAgICAoPzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcG9zdCByZWxlYXNlCiAgICAgICAgICAgICAgICAgICAgKD86LVswLTldKyl8KD86Wy1fXC5dPyhwb3N0fHJldnxyKVstX1wuXT9bMC05XSopCiAgICAgICAgICAgICAgICApPwogICAgICAgICAgICAgICAgKD86Wy1fXC5dP2RldlstX1wuXT9bMC05XSopPyAgICAgICAgICAjIGRldiByZWxlYXNlCiAgICAgICAgICAgICkKICAgICAgICAgICAgfAogICAgICAgICAgICAoPzoKICAgICAgICAgICAgICAgICMgQWxsIG90aGVyIG9wZXJhdG9ycyBvbmx5IGFsbG93IGEgc3ViIHNldCBvZiB3aGF0IHRoZQogICAgICAgICAgICAgICAgIyAobm9uKWVxdWFsaXR5IG9wZXJhdG9ycyBkby4gU3BlY2lmaWNhbGx5IHRoZXkgZG8gbm90IGFsbG93CiAgICAgICAgICAgICAgICAjIGxvY2FsIHZlcnNpb25zIHRvIGJlIHNwZWNpZmllZCBub3IgZG8gdGhleSBhbGxvdyB0aGUgcHJlZml4CiAgICAgICAgICAgICAgICAjIG1hdGNoaW5nIHdpbGQgY2FyZHMuCiAgICAgICAgICAgICAgICAoPzwhPT18IT18fj0pICAgICAgICAgIyBXZSBoYXZlIHNwZWNpYWwgY2FzZXMgZm9yIHRoZXNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvcGVyYXRvcnMgc28gd2Ugd2FudCB0byBtYWtlIHN1cmUgdGhleQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZG9uJ3QgbWF0Y2ggaGVyZS4KCiAgICAgICAgICAgICAgICBccyoKICAgICAgICAgICAgICAgIHY/CiAgICAgICAgICAgICAgICAoPzpbMC05XSshKT8gICAgICAgICAgIyBlcG9jaAogICAgICAgICAgICAgICAgWzAtOV0rKD86XC5bMC05XSspKiAgICMgcmVsZWFzZQogICAgICAgICAgICAgICAgKD86ICAgICAgICAgICAgICAgICAgICMgcHJlIHJlbGVhc2UKICAgICAgICAgICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICAgICAgICAgKGF8YnxjfHJjfGFscGhhfGJldGF8cHJlfHByZXZpZXcpCiAgICAgICAgICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAgICAgICAgIFswLTldKgogICAgICAgICAgICAgICAgKT8KICAgICAgICAgICAgICAgICg/OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwb3N0IHJlbGVhc2UKICAgICAgICAgICAgICAgICAgICAoPzotWzAtOV0rKXwoPzpbLV9cLl0/KHBvc3R8cmV2fHIpWy1fXC5dP1swLTldKikKICAgICAgICAgICAgICAgICk/CiAgICAgICAgICAgICAgICAoPzpbLV9cLl0/ZGV2Wy1fXC5dP1swLTldKik/ICAgICAgICAgICMgZGV2IHJlbGVhc2UKICAgICAgICAgICAgKQogICAgICAgICkKICAgICAgICAiIiIKICAgICkKCiAgICBfcmVnZXggPSByZS5jb21waWxlKAogICAgICAgIHIiXlxzKiIgKyBfcmVnZXhfc3RyICsgciJccyokIiwgcmUuVkVSQk9TRSB8IHJlLklHTk9SRUNBU0UpCgogICAgX29wZXJhdG9ycyA9IHsKICAgICAgICAifj0iOiAiY29tcGF0aWJsZSIsCiAgICAgICAgIj09IjogImVxdWFsIiwKICAgICAgICAiIT0iOiAibm90X2VxdWFsIiwKICAgICAgICAiPD0iOiAibGVzc190aGFuX2VxdWFsIiwKICAgICAgICAiPj0iOiAiZ3JlYXRlcl90aGFuX2VxdWFsIiwKICAgICAgICAiPCI6ICJsZXNzX3RoYW4iLAogICAgICAgICI+IjogImdyZWF0ZXJfdGhhbiIsCiAgICAgICAgIj09PSI6ICJhcmJpdHJhcnkiLAogICAgfQoKICAgIEBfcmVxdWlyZV92ZXJzaW9uX2NvbXBhcmUKICAgIGRlZiBfY29tcGFyZV9jb21wYXRpYmxlKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICAjIENvbXBhdGlibGUgcmVsZWFzZXMgaGF2ZSBhbiBlcXVpdmFsZW50IGNvbWJpbmF0aW9uIG9mID49IGFuZCA9PS4gVGhhdAogICAgICAgICMgaXMgdGhhdCB+PTIuMiBpcyBlcXVpdmFsZW50IHRvID49Mi4yLD09Mi4qLiBUaGlzIGFsbG93cyB1cyB0bwogICAgICAgICMgaW1wbGVtZW50IHRoaXMgaW4gdGVybXMgb2YgdGhlIG90aGVyIHNwZWNpZmllcnMgaW5zdGVhZCBvZgogICAgICAgICMgaW1wbGVtZW50aW5nIGl0IG91cnNlbHZlcy4gVGhlIG9ubHkgdGhpbmcgd2UgbmVlZCB0byBkbyBpcyBjb25zdHJ1Y3QKICAgICAgICAjIHRoZSBvdGhlciBzcGVjaWZpZXJzLgoKICAgICAgICAjIFdlIHdhbnQgZXZlcnl0aGluZyBidXQgdGhlIGxhc3QgaXRlbSBpbiB0aGUgdmVyc2lvbiwgYnV0IHdlIHdhbnQgdG8KICAgICAgICAjIGlnbm9yZSBwb3N0IGFuZCBkZXYgcmVsZWFzZXMgYW5kIHdlIHdhbnQgdG8gdHJlYXQgdGhlIHByZS1yZWxlYXNlIGFzCiAgICAgICAgIyBpdCdzIG93biBzZXBhcmF0ZSBzZWdtZW50LgogICAgICAgIHByZWZpeCA9ICIuIi5qb2luKAogICAgICAgICAgICBsaXN0KAogICAgICAgICAgICAgICAgaXRlcnRvb2xzLnRha2V3aGlsZSgKICAgICAgICAgICAgICAgICAgICBsYW1iZGEgeDogKG5vdCB4LnN0YXJ0c3dpdGgoInBvc3QiKSBhbmQgbm90CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LnN0YXJ0c3dpdGgoImRldiIpKSwKICAgICAgICAgICAgICAgICAgICBfdmVyc2lvbl9zcGxpdChzcGVjKSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgKVs6LTFdCiAgICAgICAgKQoKICAgICAgICAjIEFkZCB0aGUgcHJlZml4IG5vdGF0aW9uIHRvIHRoZSBlbmQgb2Ygb3VyIHN0cmluZwogICAgICAgIHByZWZpeCArPSAiLioiCgogICAgICAgIHJldHVybiAoc2VsZi5fZ2V0X29wZXJhdG9yKCI+PSIpKHByb3NwZWN0aXZlLCBzcGVjKSBhbmQKICAgICAgICAgICAgICAgIHNlbGYuX2dldF9vcGVyYXRvcigiPT0iKShwcm9zcGVjdGl2ZSwgcHJlZml4KSkKCiAgICBAX3JlcXVpcmVfdmVyc2lvbl9jb21wYXJlCiAgICBkZWYgX2NvbXBhcmVfZXF1YWwoc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgICMgV2UgbmVlZCBzcGVjaWFsIGxvZ2ljIHRvIGhhbmRsZSBwcmVmaXggbWF0Y2hpbmcKICAgICAgICBpZiBzcGVjLmVuZHN3aXRoKCIuKiIpOgogICAgICAgICAgICAjIEluIHRoZSBjYXNlIG9mIHByZWZpeCBtYXRjaGluZyB3ZSB3YW50IHRvIGlnbm9yZSBsb2NhbCBzZWdtZW50LgogICAgICAgICAgICBwcm9zcGVjdGl2ZSA9IFZlcnNpb24ocHJvc3BlY3RpdmUucHVibGljKQogICAgICAgICAgICAjIFNwbGl0IHRoZSBzcGVjIG91dCBieSBkb3RzLCBhbmQgcHJldGVuZCB0aGF0IHRoZXJlIGlzIGFuIGltcGxpY2l0CiAgICAgICAgICAgICMgZG90IGluIGJldHdlZW4gYSByZWxlYXNlIHNlZ21lbnQgYW5kIGEgcHJlLXJlbGVhc2Ugc2VnbWVudC4KICAgICAgICAgICAgc3BlYyA9IF92ZXJzaW9uX3NwbGl0KHNwZWNbOi0yXSkgICMgUmVtb3ZlIHRoZSB0cmFpbGluZyAuKgoKICAgICAgICAgICAgIyBTcGxpdCB0aGUgcHJvc3BlY3RpdmUgdmVyc2lvbiBvdXQgYnkgZG90cywgYW5kIHByZXRlbmQgdGhhdCB0aGVyZQogICAgICAgICAgICAjIGlzIGFuIGltcGxpY2l0IGRvdCBpbiBiZXR3ZWVuIGEgcmVsZWFzZSBzZWdtZW50IGFuZCBhIHByZS1yZWxlYXNlCiAgICAgICAgICAgICMgc2VnbWVudC4KICAgICAgICAgICAgcHJvc3BlY3RpdmUgPSBfdmVyc2lvbl9zcGxpdChzdHIocHJvc3BlY3RpdmUpKQoKICAgICAgICAgICAgIyBTaG9ydGVuIHRoZSBwcm9zcGVjdGl2ZSB2ZXJzaW9uIHRvIGJlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgc3BlYwogICAgICAgICAgICAjIHNvIHRoYXQgd2UgY2FuIGRldGVybWluZSBpZiB0aGUgc3BlY2lmaWVyIGlzIGEgcHJlZml4IG9mIHRoZQogICAgICAgICAgICAjIHByb3NwZWN0aXZlIHZlcnNpb24gb3Igbm90LgogICAgICAgICAgICBwcm9zcGVjdGl2ZSA9IHByb3NwZWN0aXZlWzpsZW4oc3BlYyldCgogICAgICAgICAgICAjIFBhZCBvdXQgb3VyIHR3byBzaWRlcyB3aXRoIHplcm9zIHNvIHRoYXQgdGhleSBib3RoIGVxdWFsIHRoZSBzYW1lCiAgICAgICAgICAgICMgbGVuZ3RoLgogICAgICAgICAgICBzcGVjLCBwcm9zcGVjdGl2ZSA9IF9wYWRfdmVyc2lvbihzcGVjLCBwcm9zcGVjdGl2ZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIENvbnZlcnQgb3VyIHNwZWMgc3RyaW5nIGludG8gYSBWZXJzaW9uCiAgICAgICAgICAgIHNwZWMgPSBWZXJzaW9uKHNwZWMpCgogICAgICAgICAgICAjIElmIHRoZSBzcGVjaWZpZXIgZG9lcyBub3QgaGF2ZSBhIGxvY2FsIHNlZ21lbnQsIHRoZW4gd2Ugd2FudCB0bwogICAgICAgICAgICAjIGFjdCBhcyBpZiB0aGUgcHJvc3BlY3RpdmUgdmVyc2lvbiBhbHNvIGRvZXMgbm90IGhhdmUgYSBsb2NhbAogICAgICAgICAgICAjIHNlZ21lbnQuCiAgICAgICAgICAgIGlmIG5vdCBzcGVjLmxvY2FsOgogICAgICAgICAgICAgICAgcHJvc3BlY3RpdmUgPSBWZXJzaW9uKHByb3NwZWN0aXZlLnB1YmxpYykKCiAgICAgICAgcmV0dXJuIHByb3NwZWN0aXZlID09IHNwZWMKCiAgICBAX3JlcXVpcmVfdmVyc2lvbl9jb21wYXJlCiAgICBkZWYgX2NvbXBhcmVfbm90X2VxdWFsKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICByZXR1cm4gbm90IHNlbGYuX2NvbXBhcmVfZXF1YWwocHJvc3BlY3RpdmUsIHNwZWMpCgogICAgQF9yZXF1aXJlX3ZlcnNpb25fY29tcGFyZQogICAgZGVmIF9jb21wYXJlX2xlc3NfdGhhbl9lcXVhbChzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgcmV0dXJuIHByb3NwZWN0aXZlIDw9IFZlcnNpb24oc3BlYykKCiAgICBAX3JlcXVpcmVfdmVyc2lvbl9jb21wYXJlCiAgICBkZWYgX2NvbXBhcmVfZ3JlYXRlcl90aGFuX2VxdWFsKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICByZXR1cm4gcHJvc3BlY3RpdmUgPj0gVmVyc2lvbihzcGVjKQoKICAgIEBfcmVxdWlyZV92ZXJzaW9uX2NvbXBhcmUKICAgIGRlZiBfY29tcGFyZV9sZXNzX3RoYW4oc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgICMgQ29udmVydCBvdXIgc3BlYyB0byBhIFZlcnNpb24gaW5zdGFuY2UsIHNpbmNlIHdlJ2xsIHdhbnQgdG8gd29yayB3aXRoCiAgICAgICAgIyBpdCBhcyBhIHZlcnNpb24uCiAgICAgICAgc3BlYyA9IFZlcnNpb24oc3BlYykKCiAgICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb3NwZWN0aXZlIHZlcnNpb24gaXMgbGVzcyB0aGFuIHRoZSBzcGVjCiAgICAgICAgIyB2ZXJzaW9uLiBJZiBpdCdzIG5vdCB3ZSBjYW4gc2hvcnQgY2lyY3VpdCBhbmQganVzdCByZXR1cm4gRmFsc2Ugbm93CiAgICAgICAgIyBpbnN0ZWFkIG9mIGRvaW5nIGV4dHJhIHVubmVlZGVkIHdvcmsuCiAgICAgICAgaWYgbm90IHByb3NwZWN0aXZlIDwgc3BlYzoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgVGhpcyBzcGVjaWFsIGNhc2UgaXMgaGVyZSBzbyB0aGF0LCB1bmxlc3MgdGhlIHNwZWNpZmllciBpdHNlbGYKICAgICAgICAjIGluY2x1ZGVzIGlzIGEgcHJlLXJlbGVhc2UgdmVyc2lvbiwgdGhhdCB3ZSBkbyBub3QgYWNjZXB0IHByZS1yZWxlYXNlCiAgICAgICAgIyB2ZXJzaW9ucyBmb3IgdGhlIHZlcnNpb24gbWVudGlvbmVkIGluIHRoZSBzcGVjaWZpZXIgKGUuZy4gPDMuMSBzaG91bGQKICAgICAgICAjIG5vdCBtYXRjaCAzLjEuZGV2MCwgYnV0IHNob3VsZCBtYXRjaCAzLjAuZGV2MCkuCiAgICAgICAgaWYgbm90IHNwZWMuaXNfcHJlcmVsZWFzZSBhbmQgcHJvc3BlY3RpdmUuaXNfcHJlcmVsZWFzZToKICAgICAgICAgICAgaWYgVmVyc2lvbihwcm9zcGVjdGl2ZS5iYXNlX3ZlcnNpb24pID09IFZlcnNpb24oc3BlYy5iYXNlX3ZlcnNpb24pOgogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgSWYgd2UndmUgZ290dGVuIHRvIGhlcmUsIGl0IG1lYW5zIHRoYXQgcHJvc3BlY3RpdmUgdmVyc2lvbiBpcyBib3RoCiAgICAgICAgIyBsZXNzIHRoYW4gdGhlIHNwZWMgdmVyc2lvbiAqYW5kKiBpdCdzIG5vdCBhIHByZS1yZWxlYXNlIG9mIHRoZSBzYW1lCiAgICAgICAgIyB2ZXJzaW9uIGluIHRoZSBzcGVjLgogICAgICAgIHJldHVybiBUcnVlCgogICAgQF9yZXF1aXJlX3ZlcnNpb25fY29tcGFyZQogICAgZGVmIF9jb21wYXJlX2dyZWF0ZXJfdGhhbihzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgIyBDb252ZXJ0IG91ciBzcGVjIHRvIGEgVmVyc2lvbiBpbnN0YW5jZSwgc2luY2Ugd2UnbGwgd2FudCB0byB3b3JrIHdpdGgKICAgICAgICAjIGl0IGFzIGEgdmVyc2lvbi4KICAgICAgICBzcGVjID0gVmVyc2lvbihzcGVjKQoKICAgICAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGUgcHJvc3BlY3RpdmUgdmVyc2lvbiBpcyBncmVhdGVyIHRoYW4gdGhlIHNwZWMKICAgICAgICAjIHZlcnNpb24uIElmIGl0J3Mgbm90IHdlIGNhbiBzaG9ydCBjaXJjdWl0IGFuZCBqdXN0IHJldHVybiBGYWxzZSBub3cKICAgICAgICAjIGluc3RlYWQgb2YgZG9pbmcgZXh0cmEgdW5uZWVkZWQgd29yay4KICAgICAgICBpZiBub3QgcHJvc3BlY3RpdmUgPiBzcGVjOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBUaGlzIHNwZWNpYWwgY2FzZSBpcyBoZXJlIHNvIHRoYXQsIHVubGVzcyB0aGUgc3BlY2lmaWVyIGl0c2VsZgogICAgICAgICMgaW5jbHVkZXMgaXMgYSBwb3N0LXJlbGVhc2UgdmVyc2lvbiwgdGhhdCB3ZSBkbyBub3QgYWNjZXB0CiAgICAgICAgIyBwb3N0LXJlbGVhc2UgdmVyc2lvbnMgZm9yIHRoZSB2ZXJzaW9uIG1lbnRpb25lZCBpbiB0aGUgc3BlY2lmaWVyCiAgICAgICAgIyAoZS5nLiA+My4xIHNob3VsZCBub3QgbWF0Y2ggMy4wLnBvc3QwLCBidXQgc2hvdWxkIG1hdGNoIDMuMi5wb3N0MCkuCiAgICAgICAgaWYgbm90IHNwZWMuaXNfcG9zdHJlbGVhc2UgYW5kIHByb3NwZWN0aXZlLmlzX3Bvc3RyZWxlYXNlOgogICAgICAgICAgICBpZiBWZXJzaW9uKHByb3NwZWN0aXZlLmJhc2VfdmVyc2lvbikgPT0gVmVyc2lvbihzcGVjLmJhc2VfdmVyc2lvbik6CiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBFbnN1cmUgdGhhdCB3ZSBkbyBub3QgYWxsb3cgYSBsb2NhbCB2ZXJzaW9uIG9mIHRoZSB2ZXJzaW9uIG1lbnRpb25lZAogICAgICAgICMgaW4gdGhlIHNwZWNpZmllciwgd2hpY2ggaXMgdGVjaGluY2FsbHkgZ3JlYXRlciB0aGFuLCB0byBtYXRjaC4KICAgICAgICBpZiBwcm9zcGVjdGl2ZS5sb2NhbCBpcyBub3QgTm9uZToKICAgICAgICAgICAgaWYgVmVyc2lvbihwcm9zcGVjdGl2ZS5iYXNlX3ZlcnNpb24pID09IFZlcnNpb24oc3BlYy5iYXNlX3ZlcnNpb24pOgogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgSWYgd2UndmUgZ290dGVuIHRvIGhlcmUsIGl0IG1lYW5zIHRoYXQgcHJvc3BlY3RpdmUgdmVyc2lvbiBpcyBib3RoCiAgICAgICAgIyBncmVhdGVyIHRoYW4gdGhlIHNwZWMgdmVyc2lvbiAqYW5kKiBpdCdzIG5vdCBhIHByZS1yZWxlYXNlIG9mIHRoZQogICAgICAgICMgc2FtZSB2ZXJzaW9uIGluIHRoZSBzcGVjLgogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIF9jb21wYXJlX2FyYml0cmFyeShzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgcmV0dXJuIHN0cihwcm9zcGVjdGl2ZSkubG93ZXIoKSA9PSBzdHIoc3BlYykubG93ZXIoKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHByZXJlbGVhc2VzKHNlbGYpOgogICAgICAgICMgSWYgdGhlcmUgaXMgYW4gZXhwbGljaXQgcHJlcmVsZWFzZXMgc2V0IGZvciB0aGlzLCB0aGVuIHdlJ2xsIGp1c3QKICAgICAgICAjIGJsaW5kbHkgdXNlIHRoYXQuCiAgICAgICAgaWYgc2VsZi5fcHJlcmVsZWFzZXMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9wcmVyZWxlYXNlcwoKICAgICAgICAjIExvb2sgYXQgYWxsIG9mIG91ciBzcGVjaWZpZXJzIGFuZCBkZXRlcm1pbmUgaWYgdGhleSBhcmUgaW5jbHVzaXZlCiAgICAgICAgIyBvcGVyYXRvcnMsIGFuZCBpZiB0aGV5IGFyZSBpZiB0aGV5IGFyZSBpbmNsdWRpbmcgYW4gZXhwbGljaXQKICAgICAgICAjIHByZXJlbGVhc2UuCiAgICAgICAgb3BlcmF0b3IsIHZlcnNpb24gPSBzZWxmLl9zcGVjCiAgICAgICAgaWYgb3BlcmF0b3IgaW4gWyI9PSIsICI+PSIsICI8PSIsICJ+PSIsICI9PT0iXToKICAgICAgICAgICAgIyBUaGUgPT0gc3BlY2lmaWVyIGNhbiBpbmNsdWRlIGEgdHJhaWxpbmcgLiosIGlmIGl0IGRvZXMgd2UKICAgICAgICAgICAgIyB3YW50IHRvIHJlbW92ZSBiZWZvcmUgcGFyc2luZy4KICAgICAgICAgICAgaWYgb3BlcmF0b3IgPT0gIj09IiBhbmQgdmVyc2lvbi5lbmRzd2l0aCgiLioiKToKICAgICAgICAgICAgICAgIHZlcnNpb24gPSB2ZXJzaW9uWzotMl0KCiAgICAgICAgICAgICMgUGFyc2UgdGhlIHZlcnNpb24sIGFuZCBpZiBpdCBpcyBhIHByZS1yZWxlYXNlIHRoYW4gdGhpcwogICAgICAgICAgICAjIHNwZWNpZmllciBhbGxvd3MgcHJlLXJlbGVhc2VzLgogICAgICAgICAgICBpZiBwYXJzZSh2ZXJzaW9uKS5pc19wcmVyZWxlYXNlOgogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgQHByZXJlbGVhc2VzLnNldHRlcgogICAgZGVmIHByZXJlbGVhc2VzKHNlbGYsIHZhbHVlKToKICAgICAgICBzZWxmLl9wcmVyZWxlYXNlcyA9IHZhbHVlCgoKX3ByZWZpeF9yZWdleCA9IHJlLmNvbXBpbGUociJeKFswLTldKykoKD86YXxifGN8cmMpWzAtOV0rKSQiKQoKCmRlZiBfdmVyc2lvbl9zcGxpdCh2ZXJzaW9uKToKICAgIHJlc3VsdCA9IFtdCiAgICBmb3IgaXRlbSBpbiB2ZXJzaW9uLnNwbGl0KCIuIik6CiAgICAgICAgbWF0Y2ggPSBfcHJlZml4X3JlZ2V4LnNlYXJjaChpdGVtKQogICAgICAgIGlmIG1hdGNoOgogICAgICAgICAgICByZXN1bHQuZXh0ZW5kKG1hdGNoLmdyb3VwcygpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoaXRlbSkKICAgIHJldHVybiByZXN1bHQKCgpkZWYgX3BhZF92ZXJzaW9uKGxlZnQsIHJpZ2h0KToKICAgIGxlZnRfc3BsaXQsIHJpZ2h0X3NwbGl0ID0gW10sIFtdCgogICAgIyBHZXQgdGhlIHJlbGVhc2Ugc2VnbWVudCBvZiBvdXIgdmVyc2lvbnMKICAgIGxlZnRfc3BsaXQuYXBwZW5kKGxpc3QoaXRlcnRvb2xzLnRha2V3aGlsZShsYW1iZGEgeDogeC5pc2RpZ2l0KCksIGxlZnQpKSkKICAgIHJpZ2h0X3NwbGl0LmFwcGVuZChsaXN0KGl0ZXJ0b29scy50YWtld2hpbGUobGFtYmRhIHg6IHguaXNkaWdpdCgpLCByaWdodCkpKQoKICAgICMgR2V0IHRoZSByZXN0IG9mIG91ciB2ZXJzaW9ucwogICAgbGVmdF9zcGxpdC5hcHBlbmQobGVmdFtsZW4obGVmdF9zcGxpdFswXSk6XSkKICAgIHJpZ2h0X3NwbGl0LmFwcGVuZChyaWdodFtsZW4ocmlnaHRfc3BsaXRbMF0pOl0pCgogICAgIyBJbnNlcnQgb3VyIHBhZGRpbmcKICAgIGxlZnRfc3BsaXQuaW5zZXJ0KAogICAgICAgIDEsCiAgICAgICAgWyIwIl0gKiBtYXgoMCwgbGVuKHJpZ2h0X3NwbGl0WzBdKSAtIGxlbihsZWZ0X3NwbGl0WzBdKSksCiAgICApCiAgICByaWdodF9zcGxpdC5pbnNlcnQoCiAgICAgICAgMSwKICAgICAgICBbIjAiXSAqIG1heCgwLCBsZW4obGVmdF9zcGxpdFswXSkgLSBsZW4ocmlnaHRfc3BsaXRbMF0pKSwKICAgICkKCiAgICByZXR1cm4gKAogICAgICAgIGxpc3QoaXRlcnRvb2xzLmNoYWluKCpsZWZ0X3NwbGl0KSksCiAgICAgICAgbGlzdChpdGVydG9vbHMuY2hhaW4oKnJpZ2h0X3NwbGl0KSksCiAgICApCgoKY2xhc3MgU3BlY2lmaWVyU2V0KEJhc2VTcGVjaWZpZXIpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzcGVjaWZpZXJzPSIiLCBwcmVyZWxlYXNlcz1Ob25lKToKICAgICAgICAjIFNwbGl0IG9uICwgdG8gYnJlYWsgZWFjaCBpbmRpZGl2dWFsIHNwZWNpZmllciBpbnRvIGl0J3Mgb3duIGl0ZW0sIGFuZAogICAgICAgICMgc3RyaXAgZWFjaCBpdGVtIHRvIHJlbW92ZSBsZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2UuCiAgICAgICAgc3BlY2lmaWVycyA9IFtzLnN0cmlwKCkgZm9yIHMgaW4gc3BlY2lmaWVycy5zcGxpdCgiLCIpIGlmIHMuc3RyaXAoKV0KCiAgICAgICAgIyBQYXJzZWQgZWFjaCBpbmRpdmlkdWFsIHNwZWNpZmllciwgYXR0ZW1wdGluZyBmaXJzdCB0byBtYWtlIGl0IGEKICAgICAgICAjIFNwZWNpZmllciBhbmQgZmFsbGluZyBiYWNrIHRvIGEgTGVnYWN5U3BlY2lmaWVyLgogICAgICAgIHBhcnNlZCA9IHNldCgpCiAgICAgICAgZm9yIHNwZWNpZmllciBpbiBzcGVjaWZpZXJzOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBwYXJzZWQuYWRkKFNwZWNpZmllcihzcGVjaWZpZXIpKQogICAgICAgICAgICBleGNlcHQgSW52YWxpZFNwZWNpZmllcjoKICAgICAgICAgICAgICAgIHBhcnNlZC5hZGQoTGVnYWN5U3BlY2lmaWVyKHNwZWNpZmllcikpCgogICAgICAgICMgVHVybiBvdXIgcGFyc2VkIHNwZWNpZmllcnMgaW50byBhIGZyb3plbiBzZXQgYW5kIHNhdmUgdGhlbSBmb3IgbGF0ZXIuCiAgICAgICAgc2VsZi5fc3BlY3MgPSBmcm96ZW5zZXQocGFyc2VkKQoKICAgICAgICAjIFN0b3JlIG91ciBwcmVyZWxlYXNlcyB2YWx1ZSBzbyB3ZSBjYW4gdXNlIGl0IGxhdGVyIHRvIGRldGVybWluZSBpZgogICAgICAgICMgd2UgYWNjZXB0IHByZXJlbGVhc2VzIG9yIG5vdC4KICAgICAgICBzZWxmLl9wcmVyZWxlYXNlcyA9IHByZXJlbGVhc2VzCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHByZSA9ICgKICAgICAgICAgICAgIiwgcHJlcmVsZWFzZXM9ezAhcn0iLmZvcm1hdChzZWxmLnByZXJlbGVhc2VzKQogICAgICAgICAgICBpZiBzZWxmLl9wcmVyZWxlYXNlcyBpcyBub3QgTm9uZQogICAgICAgICAgICBlbHNlICIiCiAgICAgICAgKQoKICAgICAgICByZXR1cm4gIjxTcGVjaWZpZXJTZXQoezAhcn17MX0pPiIuZm9ybWF0KHN0cihzZWxmKSwgcHJlKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiLCIuam9pbihzb3J0ZWQoc3RyKHMpIGZvciBzIGluIHNlbGYuX3NwZWNzKSkKCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGhhc2goc2VsZi5fc3BlY3MpCgogICAgZGVmIF9fYW5kX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgIG90aGVyID0gU3BlY2lmaWVyU2V0KG90aGVyKQogICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIFNwZWNpZmllclNldCk6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAoKICAgICAgICBzcGVjaWZpZXIgPSBTcGVjaWZpZXJTZXQoKQogICAgICAgIHNwZWNpZmllci5fc3BlY3MgPSBmcm96ZW5zZXQoc2VsZi5fc3BlY3MgfCBvdGhlci5fc3BlY3MpCgogICAgICAgIGlmIHNlbGYuX3ByZXJlbGVhc2VzIGlzIE5vbmUgYW5kIG90aGVyLl9wcmVyZWxlYXNlcyBpcyBub3QgTm9uZToKICAgICAgICAgICAgc3BlY2lmaWVyLl9wcmVyZWxlYXNlcyA9IG90aGVyLl9wcmVyZWxlYXNlcwogICAgICAgIGVsaWYgc2VsZi5fcHJlcmVsZWFzZXMgaXMgbm90IE5vbmUgYW5kIG90aGVyLl9wcmVyZWxlYXNlcyBpcyBOb25lOgogICAgICAgICAgICBzcGVjaWZpZXIuX3ByZXJlbGVhc2VzID0gc2VsZi5fcHJlcmVsZWFzZXMKICAgICAgICBlbGlmIHNlbGYuX3ByZXJlbGVhc2VzID09IG90aGVyLl9wcmVyZWxlYXNlczoKICAgICAgICAgICAgc3BlY2lmaWVyLl9wcmVyZWxlYXNlcyA9IHNlbGYuX3ByZXJlbGVhc2VzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAgICAgICAgICJDYW5ub3QgY29tYmluZSBTcGVjaWZpZXJTZXRzIHdpdGggVHJ1ZSBhbmQgRmFsc2UgcHJlcmVsZWFzZSAiCiAgICAgICAgICAgICAgICAib3ZlcnJpZGVzLiIKICAgICAgICAgICAgKQoKICAgICAgICByZXR1cm4gc3BlY2lmaWVyCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgb3RoZXIgPSBTcGVjaWZpZXJTZXQob3RoZXIpCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKG90aGVyLCBfSW5kaXZpZHVhbFNwZWNpZmllcik6CiAgICAgICAgICAgIG90aGVyID0gU3BlY2lmaWVyU2V0KHN0cihvdGhlcikpCiAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgU3BlY2lmaWVyU2V0KToKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCgogICAgICAgIHJldHVybiBzZWxmLl9zcGVjcyA9PSBvdGhlci5fc3BlY3MKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBzdHJpbmdfdHlwZXMpOgogICAgICAgICAgICBvdGhlciA9IFNwZWNpZmllclNldChvdGhlcikKICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob3RoZXIsIF9JbmRpdmlkdWFsU3BlY2lmaWVyKToKICAgICAgICAgICAgb3RoZXIgPSBTcGVjaWZpZXJTZXQoc3RyKG90aGVyKSkKICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBTcGVjaWZpZXJTZXQpOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKCiAgICAgICAgcmV0dXJuIHNlbGYuX3NwZWNzICE9IG90aGVyLl9zcGVjcwoKICAgIGRlZiBfX2xlbl9fKHNlbGYpOgogICAgICAgIHJldHVybiBsZW4oc2VsZi5fc3BlY3MpCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBpdGVyKHNlbGYuX3NwZWNzKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHByZXJlbGVhc2VzKHNlbGYpOgogICAgICAgICMgSWYgd2UgaGF2ZSBiZWVuIGdpdmVuIGFuIGV4cGxpY2l0IHByZXJlbGVhc2UgbW9kaWZpZXIsIHRoZW4gd2UnbGwKICAgICAgICAjIHBhc3MgdGhhdCB0aHJvdWdoIGhlcmUuCiAgICAgICAgaWYgc2VsZi5fcHJlcmVsZWFzZXMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9wcmVyZWxlYXNlcwoKICAgICAgICAjIElmIHdlIGRvbid0IGhhdmUgYW55IHNwZWNpZmllcnMsIGFuZCB3ZSBkb24ndCBoYXZlIGEgZm9yY2VkIHZhbHVlLAogICAgICAgICMgdGhlbiB3ZSdsbCBqdXN0IHJldHVybiBOb25lIHNpbmNlIHdlIGRvbid0IGtub3cgaWYgdGhpcyBzaG91bGQgaGF2ZQogICAgICAgICMgcHJlLXJlbGVhc2VzIG9yIG5vdC4KICAgICAgICBpZiBub3Qgc2VsZi5fc3BlY3M6CiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgICMgT3RoZXJ3aXNlIHdlJ2xsIHNlZSBpZiBhbnkgb2YgdGhlIGdpdmVuIHNwZWNpZmllcnMgYWNjZXB0CiAgICAgICAgIyBwcmVyZWxlYXNlcywgaWYgYW55IG9mIHRoZW0gZG8gd2UnbGwgcmV0dXJuIFRydWUsIG90aGVyd2lzZSBGYWxzZS4KICAgICAgICByZXR1cm4gYW55KHMucHJlcmVsZWFzZXMgZm9yIHMgaW4gc2VsZi5fc3BlY3MpCgogICAgQHByZXJlbGVhc2VzLnNldHRlcgogICAgZGVmIHByZXJlbGVhc2VzKHNlbGYsIHZhbHVlKToKICAgICAgICBzZWxmLl9wcmVyZWxlYXNlcyA9IHZhbHVlCgogICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBpdGVtKToKICAgICAgICByZXR1cm4gc2VsZi5jb250YWlucyhpdGVtKQoKICAgIGRlZiBjb250YWlucyhzZWxmLCBpdGVtLCBwcmVyZWxlYXNlcz1Ob25lKToKICAgICAgICAjIEVuc3VyZSB0aGF0IG91ciBpdGVtIGlzIGEgVmVyc2lvbiBvciBMZWdhY3lWZXJzaW9uIGluc3RhbmNlLgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGl0ZW0sIChMZWdhY3lWZXJzaW9uLCBWZXJzaW9uKSk6CiAgICAgICAgICAgIGl0ZW0gPSBwYXJzZShpdGVtKQoKICAgICAgICAjIERldGVybWluZSBpZiB3ZSdyZSBmb3JjaW5nIGEgcHJlcmVsZWFzZSBvciBub3QsIGlmIHdlJ3JlIG5vdCBmb3JjaW5nCiAgICAgICAgIyBvbmUgZm9yIHRoaXMgcGFydGljdWxhciBmaWx0ZXIgY2FsbCwgdGhlbiB3ZSdsbCB1c2Ugd2hhdGV2ZXIgdGhlCiAgICAgICAgIyBTcGVjaWZpZXJTZXQgdGhpbmtzIGZvciB3aGV0aGVyIG9yIG5vdCB3ZSBzaG91bGQgc3VwcG9ydCBwcmVyZWxlYXNlcy4KICAgICAgICBpZiBwcmVyZWxlYXNlcyBpcyBOb25lOgogICAgICAgICAgICBwcmVyZWxlYXNlcyA9IHNlbGYucHJlcmVsZWFzZXMKCiAgICAgICAgIyBXZSBjYW4gZGV0ZXJtaW5lIGlmIHdlJ3JlIGdvaW5nIHRvIGFsbG93IHByZS1yZWxlYXNlcyBieSBsb29raW5nIHRvCiAgICAgICAgIyBzZWUgaWYgYW55IG9mIHRoZSB1bmRlcmx5aW5nIGl0ZW1zIHN1cHBvcnRzIHRoZW0uIElmIG5vbmUgb2YgdGhlbSBkbwogICAgICAgICMgYW5kIHRoaXMgaXRlbSBpcyBhIHByZS1yZWxlYXNlIHRoZW4gd2UgZG8gbm90IGFsbG93IGl0IGFuZCB3ZSBjYW4KICAgICAgICAjIHNob3J0IGNpcmN1aXQgdGhhdCBoZXJlLgogICAgICAgICMgTm90ZTogVGhpcyBtZWFucyB0aGF0IDEuMC5kZXYxIHdvdWxkIG5vdCBiZSBjb250YWluZWQgaW4gc29tZXRoaW5nCiAgICAgICAgIyAgICAgICBsaWtlID49MS4wLmRldmFiYyBob3dldmVyIGl0IHdvdWxkIGJlIGluID49MS4wLmRlYmFiYyw+MC4wLmRldjAKICAgICAgICBpZiBub3QgcHJlcmVsZWFzZXMgYW5kIGl0ZW0uaXNfcHJlcmVsZWFzZToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgV2Ugc2ltcGx5IGRpc3BhdGNoIHRvIHRoZSB1bmRlcmx5aW5nIHNwZWNzIGhlcmUgdG8gbWFrZSBzdXJlIHRoYXQgdGhlCiAgICAgICAgIyBnaXZlbiB2ZXJzaW9uIGlzIGNvbnRhaW5lZCB3aXRoaW4gYWxsIG9mIHRoZW0uCiAgICAgICAgIyBOb3RlOiBUaGlzIHVzZSBvZiBhbGwoKSBoZXJlIG1lYW5zIHRoYXQgYW4gZW1wdHkgc2V0IG9mIHNwZWNpZmllcnMKICAgICAgICAjICAgICAgIHdpbGwgYWx3YXlzIHJldHVybiBUcnVlLCB0aGlzIGlzIGFuIGV4cGxpY2l0IGRlc2lnbiBkZWNpc2lvbi4KICAgICAgICByZXR1cm4gYWxsKAogICAgICAgICAgICBzLmNvbnRhaW5zKGl0ZW0sIHByZXJlbGVhc2VzPXByZXJlbGVhc2VzKQogICAgICAgICAgICBmb3IgcyBpbiBzZWxmLl9zcGVjcwogICAgICAgICkKCiAgICBkZWYgZmlsdGVyKHNlbGYsIGl0ZXJhYmxlLCBwcmVyZWxlYXNlcz1Ob25lKToKICAgICAgICAjIERldGVybWluZSBpZiB3ZSdyZSBmb3JjaW5nIGEgcHJlcmVsZWFzZSBvciBub3QsIGlmIHdlJ3JlIG5vdCBmb3JjaW5nCiAgICAgICAgIyBvbmUgZm9yIHRoaXMgcGFydGljdWxhciBmaWx0ZXIgY2FsbCwgdGhlbiB3ZSdsbCB1c2Ugd2hhdGV2ZXIgdGhlCiAgICAgICAgIyBTcGVjaWZpZXJTZXQgdGhpbmtzIGZvciB3aGV0aGVyIG9yIG5vdCB3ZSBzaG91bGQgc3VwcG9ydCBwcmVyZWxlYXNlcy4KICAgICAgICBpZiBwcmVyZWxlYXNlcyBpcyBOb25lOgogICAgICAgICAgICBwcmVyZWxlYXNlcyA9IHNlbGYucHJlcmVsZWFzZXMKCiAgICAgICAgIyBJZiB3ZSBoYXZlIGFueSBzcGVjaWZpZXJzLCB0aGVuIHdlIHdhbnQgdG8gd3JhcCBvdXIgaXRlcmFibGUgaW4gdGhlCiAgICAgICAgIyBmaWx0ZXIgbWV0aG9kIGZvciBlYWNoIG9uZSwgdGhpcyB3aWxsIGFjdCBhcyBhIGxvZ2ljYWwgQU5EIGFtb25nc3QKICAgICAgICAjIGVhY2ggc3BlY2lmaWVyLgogICAgICAgIGlmIHNlbGYuX3NwZWNzOgogICAgICAgICAgICBmb3Igc3BlYyBpbiBzZWxmLl9zcGVjczoKICAgICAgICAgICAgICAgIGl0ZXJhYmxlID0gc3BlYy5maWx0ZXIoaXRlcmFibGUsIHByZXJlbGVhc2VzPWJvb2wocHJlcmVsZWFzZXMpKQogICAgICAgICAgICByZXR1cm4gaXRlcmFibGUKICAgICAgICAjIElmIHdlIGRvIG5vdCBoYXZlIGFueSBzcGVjaWZpZXJzLCB0aGVuIHdlIG5lZWQgdG8gaGF2ZSBhIHJvdWdoIGZpbHRlcgogICAgICAgICMgd2hpY2ggd2lsbCBmaWx0ZXIgb3V0IGFueSBwcmUtcmVsZWFzZXMsIHVubGVzcyB0aGVyZSBhcmUgbm8gZmluYWwKICAgICAgICAjIHJlbGVhc2VzLCBhbmQgd2hpY2ggd2lsbCBmaWx0ZXIgb3V0IExlZ2FjeVZlcnNpb24gaW4gZ2VuZXJhbC4KICAgICAgICBlbHNlOgogICAgICAgICAgICBmaWx0ZXJlZCA9IFtdCiAgICAgICAgICAgIGZvdW5kX3ByZXJlbGVhc2VzID0gW10KCiAgICAgICAgICAgIGZvciBpdGVtIGluIGl0ZXJhYmxlOgogICAgICAgICAgICAgICAgIyBFbnN1cmUgdGhhdCB3ZSBzb21lIGtpbmQgb2YgVmVyc2lvbiBjbGFzcyBmb3IgdGhpcyBpdGVtLgogICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoaXRlbSwgKExlZ2FjeVZlcnNpb24sIFZlcnNpb24pKToKICAgICAgICAgICAgICAgICAgICBwYXJzZWRfdmVyc2lvbiA9IHBhcnNlKGl0ZW0pCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHBhcnNlZF92ZXJzaW9uID0gaXRlbQoKICAgICAgICAgICAgICAgICMgRmlsdGVyIG91dCBhbnkgaXRlbSB3aGljaCBpcyBwYXJzZWQgYXMgYSBMZWdhY3lWZXJzaW9uCiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHBhcnNlZF92ZXJzaW9uLCBMZWdhY3lWZXJzaW9uKToKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgICAgICMgU3RvcmUgYW55IGl0ZW0gd2hpY2ggaXMgYSBwcmUtcmVsZWFzZSBmb3IgbGF0ZXIgdW5sZXNzIHdlJ3ZlCiAgICAgICAgICAgICAgICAjIGFscmVhZHkgZm91bmQgYSBmaW5hbCB2ZXJzaW9uIG9yIHdlIGFyZSBhY2NlcHRpbmcgcHJlcmVsZWFzZXMKICAgICAgICAgICAgICAgIGlmIHBhcnNlZF92ZXJzaW9uLmlzX3ByZXJlbGVhc2UgYW5kIG5vdCBwcmVyZWxlYXNlczoKICAgICAgICAgICAgICAgICAgICBpZiBub3QgZmlsdGVyZWQ6CiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kX3ByZXJlbGVhc2VzLmFwcGVuZChpdGVtKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZC5hcHBlbmQoaXRlbSkKCiAgICAgICAgICAgICMgSWYgd2UndmUgZm91bmQgbm8gaXRlbXMgZXhjZXB0IGZvciBwcmUtcmVsZWFzZXMsIHRoZW4gd2UnbGwgZ28KICAgICAgICAgICAgIyBhaGVhZCBhbmQgdXNlIHRoZSBwcmUtcmVsZWFzZXMKICAgICAgICAgICAgaWYgbm90IGZpbHRlcmVkIGFuZCBmb3VuZF9wcmVyZWxlYXNlcyBhbmQgcHJlcmVsZWFzZXMgaXMgTm9uZToKICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZF9wcmVyZWxlYXNlcwoKICAgICAgICAgICAgcmV0dXJuIGZpbHRlcmVkClBLAwQUAAAAAAAAACEAxeonD6UBAAClAQAALgAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9wYWNrYWdpbmcvdXRpbHMucHkjIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24KIyAyLjAsIGFuZCB0aGUgQlNEIExpY2Vuc2UuIFNlZSB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcmVwb3NpdG9yeQojIGZvciBjb21wbGV0ZSBkZXRhaWxzLgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCwgZGl2aXNpb24sIHByaW50X2Z1bmN0aW9uCgppbXBvcnQgcmUKCgpfY2Fub25pY2FsaXplX3JlZ2V4ID0gcmUuY29tcGlsZShyIlstXy5dKyIpCgoKZGVmIGNhbm9uaWNhbGl6ZV9uYW1lKG5hbWUpOgogICAgIyBUaGlzIGlzIHRha2VuIGZyb20gUEVQIDUwMy4KICAgIHJldHVybiBfY2Fub25pY2FsaXplX3JlZ2V4LnN1YigiLSIsIG5hbWUpLmxvd2VyKCkKUEsDBBQAAAAAAAAAIQAO78ahJC0AACQtAAAwAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3BhY2thZ2luZy92ZXJzaW9uLnB5IyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uCiMgMi4wLCBhbmQgdGhlIEJTRCBMaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHJlcG9zaXRvcnkKIyBmb3IgY29tcGxldGUgZGV0YWlscy4KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCBwcmludF9mdW5jdGlvbgoKaW1wb3J0IGNvbGxlY3Rpb25zCmltcG9ydCBpdGVydG9vbHMKaW1wb3J0IHJlCgpmcm9tIC5fc3RydWN0dXJlcyBpbXBvcnQgSW5maW5pdHkKCgpfX2FsbF9fID0gWwogICAgInBhcnNlIiwgIlZlcnNpb24iLCAiTGVnYWN5VmVyc2lvbiIsICJJbnZhbGlkVmVyc2lvbiIsICJWRVJTSU9OX1BBVFRFUk4iCl0KCgpfVmVyc2lvbiA9IGNvbGxlY3Rpb25zLm5hbWVkdHVwbGUoCiAgICAiX1ZlcnNpb24iLAogICAgWyJlcG9jaCIsICJyZWxlYXNlIiwgImRldiIsICJwcmUiLCAicG9zdCIsICJsb2NhbCJdLAopCgoKZGVmIHBhcnNlKHZlcnNpb24pOgogICAgIiIiCiAgICBQYXJzZSB0aGUgZ2l2ZW4gdmVyc2lvbiBzdHJpbmcgYW5kIHJldHVybiBlaXRoZXIgYSA6Y2xhc3M6YFZlcnNpb25gIG9iamVjdAogICAgb3IgYSA6Y2xhc3M6YExlZ2FjeVZlcnNpb25gIG9iamVjdCBkZXBlbmRpbmcgb24gaWYgdGhlIGdpdmVuIHZlcnNpb24gaXMKICAgIGEgdmFsaWQgUEVQIDQ0MCB2ZXJzaW9uIG9yIGEgbGVnYWN5IHZlcnNpb24uCiAgICAiIiIKICAgIHRyeToKICAgICAgICByZXR1cm4gVmVyc2lvbih2ZXJzaW9uKQogICAgZXhjZXB0IEludmFsaWRWZXJzaW9uOgogICAgICAgIHJldHVybiBMZWdhY3lWZXJzaW9uKHZlcnNpb24pCgoKY2xhc3MgSW52YWxpZFZlcnNpb24oVmFsdWVFcnJvcik6CiAgICAiIiIKICAgIEFuIGludmFsaWQgdmVyc2lvbiB3YXMgZm91bmQsIHVzZXJzIHNob3VsZCByZWZlciB0byBQRVAgNDQwLgogICAgIiIiCgoKY2xhc3MgX0Jhc2VWZXJzaW9uKG9iamVjdCk6CgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBoYXNoKHNlbGYuX2tleSkKCiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5fY29tcGFyZShvdGhlciwgbGFtYmRhIHMsIG86IHMgPCBvKQoKICAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLl9jb21wYXJlKG90aGVyLCBsYW1iZGEgcywgbzogcyA8PSBvKQoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLl9jb21wYXJlKG90aGVyLCBsYW1iZGEgcywgbzogcyA9PSBvKQoKICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLl9jb21wYXJlKG90aGVyLCBsYW1iZGEgcywgbzogcyA+PSBvKQoKICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLl9jb21wYXJlKG90aGVyLCBsYW1iZGEgcywgbzogcyA+IG8pCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2NvbXBhcmUob3RoZXIsIGxhbWJkYSBzLCBvOiBzICE9IG8pCgogICAgZGVmIF9jb21wYXJlKHNlbGYsIG90aGVyLCBtZXRob2QpOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBfQmFzZVZlcnNpb24pOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKCiAgICAgICAgcmV0dXJuIG1ldGhvZChzZWxmLl9rZXksIG90aGVyLl9rZXkpCgoKY2xhc3MgTGVnYWN5VmVyc2lvbihfQmFzZVZlcnNpb24pOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2ZXJzaW9uKToKICAgICAgICBzZWxmLl92ZXJzaW9uID0gc3RyKHZlcnNpb24pCiAgICAgICAgc2VsZi5fa2V5ID0gX2xlZ2FjeV9jbXBrZXkoc2VsZi5fdmVyc2lvbikKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fdmVyc2lvbgoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIjxMZWdhY3lWZXJzaW9uKHswfSk+Ii5mb3JtYXQocmVwcihzdHIoc2VsZikpKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHB1YmxpYyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fdmVyc2lvbgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGJhc2VfdmVyc2lvbihzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fdmVyc2lvbgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGxvY2FsKHNlbGYpOgogICAgICAgIHJldHVybiBOb25lCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfcHJlcmVsZWFzZShzZWxmKToKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19wb3N0cmVsZWFzZShzZWxmKToKICAgICAgICByZXR1cm4gRmFsc2UKCgpfbGVnYWN5X3ZlcnNpb25fY29tcG9uZW50X3JlID0gcmUuY29tcGlsZSgKICAgIHIiKFxkKyB8IFthLXpdKyB8IFwufCAtKSIsIHJlLlZFUkJPU0UsCikKCl9sZWdhY3lfdmVyc2lvbl9yZXBsYWNlbWVudF9tYXAgPSB7CiAgICAicHJlIjogImMiLCAicHJldmlldyI6ICJjIiwgIi0iOiAiZmluYWwtIiwgInJjIjogImMiLCAiZGV2IjogIkAiLAp9CgoKZGVmIF9wYXJzZV92ZXJzaW9uX3BhcnRzKHMpOgogICAgZm9yIHBhcnQgaW4gX2xlZ2FjeV92ZXJzaW9uX2NvbXBvbmVudF9yZS5zcGxpdChzKToKICAgICAgICBwYXJ0ID0gX2xlZ2FjeV92ZXJzaW9uX3JlcGxhY2VtZW50X21hcC5nZXQocGFydCwgcGFydCkKCiAgICAgICAgaWYgbm90IHBhcnQgb3IgcGFydCA9PSAiLiI6CiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIGlmIHBhcnRbOjFdIGluICIwMTIzNDU2Nzg5IjoKICAgICAgICAgICAgIyBwYWQgZm9yIG51bWVyaWMgY29tcGFyaXNvbgogICAgICAgICAgICB5aWVsZCBwYXJ0LnpmaWxsKDgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgeWllbGQgIioiICsgcGFydAoKICAgICMgZW5zdXJlIHRoYXQgYWxwaGEvYmV0YS9jYW5kaWRhdGUgYXJlIGJlZm9yZSBmaW5hbAogICAgeWllbGQgIipmaW5hbCIKCgpkZWYgX2xlZ2FjeV9jbXBrZXkodmVyc2lvbik6CiAgICAjIFdlIGhhcmRjb2RlIGFuIGVwb2NoIG9mIC0xIGhlcmUuIEEgUEVQIDQ0MCB2ZXJzaW9uIGNhbiBvbmx5IGhhdmUgYSBlcG9jaAogICAgIyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMC4gVGhpcyB3aWxsIGVmZmVjdGl2ZWx5IHB1dCB0aGUgTGVnYWN5VmVyc2lvbiwKICAgICMgd2hpY2ggdXNlcyB0aGUgZGVmYWN0byBzdGFuZGFyZCBvcmlnaW5hbGx5IGltcGxlbWVudGVkIGJ5IHNldHVwdG9vbHMsCiAgICAjIGFzIGJlZm9yZSBhbGwgUEVQIDQ0MCB2ZXJzaW9ucy4KICAgIGVwb2NoID0gLTEKCiAgICAjIFRoaXMgc2NoZW1lIGlzIHRha2VuIGZyb20gcGtnX3Jlc291cmNlcy5wYXJzZV92ZXJzaW9uIHNldHVwdG9vbHMgcHJpb3IgdG8KICAgICMgaXQncyBhZG9wdGlvbiBvZiB0aGUgcGFja2FnaW5nIGxpYnJhcnkuCiAgICBwYXJ0cyA9IFtdCiAgICBmb3IgcGFydCBpbiBfcGFyc2VfdmVyc2lvbl9wYXJ0cyh2ZXJzaW9uLmxvd2VyKCkpOgogICAgICAgIGlmIHBhcnQuc3RhcnRzd2l0aCgiKiIpOgogICAgICAgICAgICAjIHJlbW92ZSAiLSIgYmVmb3JlIGEgcHJlcmVsZWFzZSB0YWcKICAgICAgICAgICAgaWYgcGFydCA8ICIqZmluYWwiOgogICAgICAgICAgICAgICAgd2hpbGUgcGFydHMgYW5kIHBhcnRzWy0xXSA9PSAiKmZpbmFsLSI6CiAgICAgICAgICAgICAgICAgICAgcGFydHMucG9wKCkKCiAgICAgICAgICAgICMgcmVtb3ZlIHRyYWlsaW5nIHplcm9zIGZyb20gZWFjaCBzZXJpZXMgb2YgbnVtZXJpYyBwYXJ0cwogICAgICAgICAgICB3aGlsZSBwYXJ0cyBhbmQgcGFydHNbLTFdID09ICIwMDAwMDAwMCI6CiAgICAgICAgICAgICAgICBwYXJ0cy5wb3AoKQoKICAgICAgICBwYXJ0cy5hcHBlbmQocGFydCkKICAgIHBhcnRzID0gdHVwbGUocGFydHMpCgogICAgcmV0dXJuIGVwb2NoLCBwYXJ0cwoKIyBEZWxpYmVyYXRlbHkgbm90IGFuY2hvcmVkIHRvIHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBzdHJpbmcsIHRvIG1ha2UgaXQKIyBlYXNpZXIgZm9yIDNyZCBwYXJ0eSBjb2RlIHRvIHJldXNlClZFUlNJT05fUEFUVEVSTiA9IHIiIiIKICAgIHY/CiAgICAoPzoKICAgICAgICAoPzooP1A8ZXBvY2g+WzAtOV0rKSEpPyAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZXBvY2gKICAgICAgICAoP1A8cmVsZWFzZT5bMC05XSsoPzpcLlswLTldKykqKSAgICAgICAgICAgICAgICAgICMgcmVsZWFzZSBzZWdtZW50CiAgICAgICAgKD9QPHByZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHByZS1yZWxlYXNlCiAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgKD9QPHByZV9sPihhfGJ8Y3xyY3xhbHBoYXxiZXRhfHByZXxwcmV2aWV3KSkKICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAoP1A8cHJlX24+WzAtOV0rKT8KICAgICAgICApPwogICAgICAgICg/UDxwb3N0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwb3N0IHJlbGVhc2UKICAgICAgICAgICAgKD86LSg/UDxwb3N0X24xPlswLTldKykpCiAgICAgICAgICAgIHwKICAgICAgICAgICAgKD86CiAgICAgICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICAgICAoP1A8cG9zdF9sPnBvc3R8cmV2fHIpCiAgICAgICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICAgICAoP1A8cG9zdF9uMj5bMC05XSspPwogICAgICAgICAgICApCiAgICAgICAgKT8KICAgICAgICAoP1A8ZGV2PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZGV2IHJlbGVhc2UKICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAoP1A8ZGV2X2w+ZGV2KQogICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICg/UDxkZXZfbj5bMC05XSspPwogICAgICAgICk/CiAgICApCiAgICAoPzpcKyg/UDxsb2NhbD5bYS16MC05XSsoPzpbLV9cLl1bYS16MC05XSspKikpPyAgICAgICAjIGxvY2FsIHZlcnNpb24KIiIiCgoKY2xhc3MgVmVyc2lvbihfQmFzZVZlcnNpb24pOgoKICAgIF9yZWdleCA9IHJlLmNvbXBpbGUoCiAgICAgICAgciJeXHMqIiArIFZFUlNJT05fUEFUVEVSTiArIHIiXHMqJCIsCiAgICAgICAgcmUuVkVSQk9TRSB8IHJlLklHTk9SRUNBU0UsCiAgICApCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHZlcnNpb24pOgogICAgICAgICMgVmFsaWRhdGUgdGhlIHZlcnNpb24gYW5kIHBhcnNlIGl0IGludG8gcGllY2VzCiAgICAgICAgbWF0Y2ggPSBzZWxmLl9yZWdleC5zZWFyY2godmVyc2lvbikKICAgICAgICBpZiBub3QgbWF0Y2g6CiAgICAgICAgICAgIHJhaXNlIEludmFsaWRWZXJzaW9uKCJJbnZhbGlkIHZlcnNpb246ICd7MH0nIi5mb3JtYXQodmVyc2lvbikpCgogICAgICAgICMgU3RvcmUgdGhlIHBhcnNlZCBvdXQgcGllY2VzIG9mIHRoZSB2ZXJzaW9uCiAgICAgICAgc2VsZi5fdmVyc2lvbiA9IF9WZXJzaW9uKAogICAgICAgICAgICBlcG9jaD1pbnQobWF0Y2guZ3JvdXAoImVwb2NoIikpIGlmIG1hdGNoLmdyb3VwKCJlcG9jaCIpIGVsc2UgMCwKICAgICAgICAgICAgcmVsZWFzZT10dXBsZShpbnQoaSkgZm9yIGkgaW4gbWF0Y2guZ3JvdXAoInJlbGVhc2UiKS5zcGxpdCgiLiIpKSwKICAgICAgICAgICAgcHJlPV9wYXJzZV9sZXR0ZXJfdmVyc2lvbigKICAgICAgICAgICAgICAgIG1hdGNoLmdyb3VwKCJwcmVfbCIpLAogICAgICAgICAgICAgICAgbWF0Y2guZ3JvdXAoInByZV9uIiksCiAgICAgICAgICAgICksCiAgICAgICAgICAgIHBvc3Q9X3BhcnNlX2xldHRlcl92ZXJzaW9uKAogICAgICAgICAgICAgICAgbWF0Y2guZ3JvdXAoInBvc3RfbCIpLAogICAgICAgICAgICAgICAgbWF0Y2guZ3JvdXAoInBvc3RfbjEiKSBvciBtYXRjaC5ncm91cCgicG9zdF9uMiIpLAogICAgICAgICAgICApLAogICAgICAgICAgICBkZXY9X3BhcnNlX2xldHRlcl92ZXJzaW9uKAogICAgICAgICAgICAgICAgbWF0Y2guZ3JvdXAoImRldl9sIiksCiAgICAgICAgICAgICAgICBtYXRjaC5ncm91cCgiZGV2X24iKSwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgbG9jYWw9X3BhcnNlX2xvY2FsX3ZlcnNpb24obWF0Y2guZ3JvdXAoImxvY2FsIikpLAogICAgICAgICkKCiAgICAgICAgIyBHZW5lcmF0ZSBhIGtleSB3aGljaCB3aWxsIGJlIHVzZWQgZm9yIHNvcnRpbmcKICAgICAgICBzZWxmLl9rZXkgPSBfY21wa2V5KAogICAgICAgICAgICBzZWxmLl92ZXJzaW9uLmVwb2NoLAogICAgICAgICAgICBzZWxmLl92ZXJzaW9uLnJlbGVhc2UsCiAgICAgICAgICAgIHNlbGYuX3ZlcnNpb24ucHJlLAogICAgICAgICAgICBzZWxmLl92ZXJzaW9uLnBvc3QsCiAgICAgICAgICAgIHNlbGYuX3ZlcnNpb24uZGV2LAogICAgICAgICAgICBzZWxmLl92ZXJzaW9uLmxvY2FsLAogICAgICAgICkKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICI8VmVyc2lvbih7MH0pPiIuZm9ybWF0KHJlcHIoc3RyKHNlbGYpKSkKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICBwYXJ0cyA9IFtdCgogICAgICAgICMgRXBvY2gKICAgICAgICBpZiBzZWxmLl92ZXJzaW9uLmVwb2NoICE9IDA6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgiezB9ISIuZm9ybWF0KHNlbGYuX3ZlcnNpb24uZXBvY2gpKQoKICAgICAgICAjIFJlbGVhc2Ugc2VnbWVudAogICAgICAgIHBhcnRzLmFwcGVuZCgiLiIuam9pbihzdHIoeCkgZm9yIHggaW4gc2VsZi5fdmVyc2lvbi5yZWxlYXNlKSkKCiAgICAgICAgIyBQcmUtcmVsZWFzZQogICAgICAgIGlmIHNlbGYuX3ZlcnNpb24ucHJlIGlzIG5vdCBOb25lOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoIiIuam9pbihzdHIoeCkgZm9yIHggaW4gc2VsZi5fdmVyc2lvbi5wcmUpKQoKICAgICAgICAjIFBvc3QtcmVsZWFzZQogICAgICAgIGlmIHNlbGYuX3ZlcnNpb24ucG9zdCBpcyBub3QgTm9uZToKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCIucG9zdHswfSIuZm9ybWF0KHNlbGYuX3ZlcnNpb24ucG9zdFsxXSkpCgogICAgICAgICMgRGV2ZWxvcG1lbnQgcmVsZWFzZQogICAgICAgIGlmIHNlbGYuX3ZlcnNpb24uZGV2IGlzIG5vdCBOb25lOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoIi5kZXZ7MH0iLmZvcm1hdChzZWxmLl92ZXJzaW9uLmRldlsxXSkpCgogICAgICAgICMgTG9jYWwgdmVyc2lvbiBzZWdtZW50CiAgICAgICAgaWYgc2VsZi5fdmVyc2lvbi5sb2NhbCBpcyBub3QgTm9uZToKICAgICAgICAgICAgcGFydHMuYXBwZW5kKAogICAgICAgICAgICAgICAgIit7MH0iLmZvcm1hdCgiLiIuam9pbihzdHIoeCkgZm9yIHggaW4gc2VsZi5fdmVyc2lvbi5sb2NhbCkpCiAgICAgICAgICAgICkKCiAgICAgICAgcmV0dXJuICIiLmpvaW4ocGFydHMpCgogICAgQHByb3BlcnR5CiAgICBkZWYgcHVibGljKHNlbGYpOgogICAgICAgIHJldHVybiBzdHIoc2VsZikuc3BsaXQoIisiLCAxKVswXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGJhc2VfdmVyc2lvbihzZWxmKToKICAgICAgICBwYXJ0cyA9IFtdCgogICAgICAgICMgRXBvY2gKICAgICAgICBpZiBzZWxmLl92ZXJzaW9uLmVwb2NoICE9IDA6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgiezB9ISIuZm9ybWF0KHNlbGYuX3ZlcnNpb24uZXBvY2gpKQoKICAgICAgICAjIFJlbGVhc2Ugc2VnbWVudAogICAgICAgIHBhcnRzLmFwcGVuZCgiLiIuam9pbihzdHIoeCkgZm9yIHggaW4gc2VsZi5fdmVyc2lvbi5yZWxlYXNlKSkKCiAgICAgICAgcmV0dXJuICIiLmpvaW4ocGFydHMpCgogICAgQHByb3BlcnR5CiAgICBkZWYgbG9jYWwoc2VsZik6CiAgICAgICAgdmVyc2lvbl9zdHJpbmcgPSBzdHIoc2VsZikKICAgICAgICBpZiAiKyIgaW4gdmVyc2lvbl9zdHJpbmc6CiAgICAgICAgICAgIHJldHVybiB2ZXJzaW9uX3N0cmluZy5zcGxpdCgiKyIsIDEpWzFdCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfcHJlcmVsZWFzZShzZWxmKToKICAgICAgICByZXR1cm4gYm9vbChzZWxmLl92ZXJzaW9uLmRldiBvciBzZWxmLl92ZXJzaW9uLnByZSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19wb3N0cmVsZWFzZShzZWxmKToKICAgICAgICByZXR1cm4gYm9vbChzZWxmLl92ZXJzaW9uLnBvc3QpCgoKZGVmIF9wYXJzZV9sZXR0ZXJfdmVyc2lvbihsZXR0ZXIsIG51bWJlcik6CiAgICBpZiBsZXR0ZXI6CiAgICAgICAgIyBXZSBjb25zaWRlciB0aGVyZSB0byBiZSBhbiBpbXBsaWNpdCAwIGluIGEgcHJlLXJlbGVhc2UgaWYgdGhlcmUgaXMKICAgICAgICAjIG5vdCBhIG51bWVyYWwgYXNzb2NpYXRlZCB3aXRoIGl0LgogICAgICAgIGlmIG51bWJlciBpcyBOb25lOgogICAgICAgICAgICBudW1iZXIgPSAwCgogICAgICAgICMgV2Ugbm9ybWFsaXplIGFueSBsZXR0ZXJzIHRvIHRoZWlyIGxvd2VyIGNhc2UgZm9ybQogICAgICAgIGxldHRlciA9IGxldHRlci5sb3dlcigpCgogICAgICAgICMgV2UgY29uc2lkZXIgc29tZSB3b3JkcyB0byBiZSBhbHRlcm5hdGUgc3BlbGxpbmdzIG9mIG90aGVyIHdvcmRzIGFuZAogICAgICAgICMgaW4gdGhvc2UgY2FzZXMgd2Ugd2FudCB0byBub3JtYWxpemUgdGhlIHNwZWxsaW5ncyB0byBvdXIgcHJlZmVycmVkCiAgICAgICAgIyBzcGVsbGluZy4KICAgICAgICBpZiBsZXR0ZXIgPT0gImFscGhhIjoKICAgICAgICAgICAgbGV0dGVyID0gImEiCiAgICAgICAgZWxpZiBsZXR0ZXIgPT0gImJldGEiOgogICAgICAgICAgICBsZXR0ZXIgPSAiYiIKICAgICAgICBlbGlmIGxldHRlciBpbiBbImMiLCAicHJlIiwgInByZXZpZXciXToKICAgICAgICAgICAgbGV0dGVyID0gInJjIgogICAgICAgIGVsaWYgbGV0dGVyIGluIFsicmV2IiwgInIiXToKICAgICAgICAgICAgbGV0dGVyID0gInBvc3QiCgogICAgICAgIHJldHVybiBsZXR0ZXIsIGludChudW1iZXIpCiAgICBpZiBub3QgbGV0dGVyIGFuZCBudW1iZXI6CiAgICAgICAgIyBXZSBhc3N1bWUgaWYgd2UgYXJlIGdpdmVuIGEgbnVtYmVyLCBidXQgd2UgYXJlIG5vdCBnaXZlbiBhIGxldHRlcgogICAgICAgICMgdGhlbiB0aGlzIGlzIHVzaW5nIHRoZSBpbXBsaWNpdCBwb3N0IHJlbGVhc2Ugc3ludGF4IChlLmcuIDEuMC0xKQogICAgICAgIGxldHRlciA9ICJwb3N0IgoKICAgICAgICByZXR1cm4gbGV0dGVyLCBpbnQobnVtYmVyKQoKCl9sb2NhbF92ZXJzaW9uX3NlcGVyYXRvcnMgPSByZS5jb21waWxlKHIiW1wuXy1dIikKCgpkZWYgX3BhcnNlX2xvY2FsX3ZlcnNpb24obG9jYWwpOgogICAgIiIiCiAgICBUYWtlcyBhIHN0cmluZyBsaWtlIGFiYy4xLnR3ZWx2ZSBhbmQgdHVybnMgaXQgaW50byAoImFiYyIsIDEsICJ0d2VsdmUiKS4KICAgICIiIgogICAgaWYgbG9jYWwgaXMgbm90IE5vbmU6CiAgICAgICAgcmV0dXJuIHR1cGxlKAogICAgICAgICAgICBwYXJ0Lmxvd2VyKCkgaWYgbm90IHBhcnQuaXNkaWdpdCgpIGVsc2UgaW50KHBhcnQpCiAgICAgICAgICAgIGZvciBwYXJ0IGluIF9sb2NhbF92ZXJzaW9uX3NlcGVyYXRvcnMuc3BsaXQobG9jYWwpCiAgICAgICAgKQoKCmRlZiBfY21wa2V5KGVwb2NoLCByZWxlYXNlLCBwcmUsIHBvc3QsIGRldiwgbG9jYWwpOgogICAgIyBXaGVuIHdlIGNvbXBhcmUgYSByZWxlYXNlIHZlcnNpb24sIHdlIHdhbnQgdG8gY29tcGFyZSBpdCB3aXRoIGFsbCBvZiB0aGUKICAgICMgdHJhaWxpbmcgemVyb3MgcmVtb3ZlZC4gU28gd2UnbGwgdXNlIGEgcmV2ZXJzZSB0aGUgbGlzdCwgZHJvcCBhbGwgdGhlIG5vdwogICAgIyBsZWFkaW5nIHplcm9zIHVudGlsIHdlIGNvbWUgdG8gc29tZXRoaW5nIG5vbiB6ZXJvLCB0aGVuIHRha2UgdGhlIHJlc3QKICAgICMgcmUtcmV2ZXJzZSBpdCBiYWNrIGludG8gdGhlIGNvcnJlY3Qgb3JkZXIgYW5kIG1ha2UgaXQgYSB0dXBsZSBhbmQgdXNlCiAgICAjIHRoYXQgZm9yIG91ciBzb3J0aW5nIGtleS4KICAgIHJlbGVhc2UgPSB0dXBsZSgKICAgICAgICByZXZlcnNlZChsaXN0KAogICAgICAgICAgICBpdGVydG9vbHMuZHJvcHdoaWxlKAogICAgICAgICAgICAgICAgbGFtYmRhIHg6IHggPT0gMCwKICAgICAgICAgICAgICAgIHJldmVyc2VkKHJlbGVhc2UpLAogICAgICAgICAgICApCiAgICAgICAgKSkKICAgICkKCiAgICAjIFdlIG5lZWQgdG8gInRyaWNrIiB0aGUgc29ydGluZyBhbGdvcml0aG0gdG8gcHV0IDEuMC5kZXYwIGJlZm9yZSAxLjBhMC4KICAgICMgV2UnbGwgZG8gdGhpcyBieSBhYnVzaW5nIHRoZSBwcmUgc2VnbWVudCwgYnV0IHdlIF9vbmx5XyB3YW50IHRvIGRvIHRoaXMKICAgICMgaWYgdGhlcmUgaXMgbm90IGEgcHJlIG9yIGEgcG9zdCBzZWdtZW50LiBJZiB3ZSBoYXZlIG9uZSBvZiB0aG9zZSB0aGVuCiAgICAjIHRoZSBub3JtYWwgc29ydGluZyBydWxlcyB3aWxsIGhhbmRsZSB0aGlzIGNhc2UgY29ycmVjdGx5LgogICAgaWYgcHJlIGlzIE5vbmUgYW5kIHBvc3QgaXMgTm9uZSBhbmQgZGV2IGlzIG5vdCBOb25lOgogICAgICAgIHByZSA9IC1JbmZpbml0eQogICAgIyBWZXJzaW9ucyB3aXRob3V0IGEgcHJlLXJlbGVhc2UgKGV4Y2VwdCBhcyBub3RlZCBhYm92ZSkgc2hvdWxkIHNvcnQgYWZ0ZXIKICAgICMgdGhvc2Ugd2l0aCBvbmUuCiAgICBlbGlmIHByZSBpcyBOb25lOgogICAgICAgIHByZSA9IEluZmluaXR5CgogICAgIyBWZXJzaW9ucyB3aXRob3V0IGEgcG9zdCBzZWdtZW50IHNob3VsZCBzb3J0IGJlZm9yZSB0aG9zZSB3aXRoIG9uZS4KICAgIGlmIHBvc3QgaXMgTm9uZToKICAgICAgICBwb3N0ID0gLUluZmluaXR5CgogICAgIyBWZXJzaW9ucyB3aXRob3V0IGEgZGV2ZWxvcG1lbnQgc2VnbWVudCBzaG91bGQgc29ydCBhZnRlciB0aG9zZSB3aXRoIG9uZS4KICAgIGlmIGRldiBpcyBOb25lOgogICAgICAgIGRldiA9IEluZmluaXR5CgogICAgaWYgbG9jYWwgaXMgTm9uZToKICAgICAgICAjIFZlcnNpb25zIHdpdGhvdXQgYSBsb2NhbCBzZWdtZW50IHNob3VsZCBzb3J0IGJlZm9yZSB0aG9zZSB3aXRoIG9uZS4KICAgICAgICBsb2NhbCA9IC1JbmZpbml0eQogICAgZWxzZToKICAgICAgICAjIFZlcnNpb25zIHdpdGggYSBsb2NhbCBzZWdtZW50IG5lZWQgdGhhdCBzZWdtZW50IHBhcnNlZCB0byBpbXBsZW1lbnQKICAgICAgICAjIHRoZSBzb3J0aW5nIHJ1bGVzIGluIFBFUDQ0MC4KICAgICAgICAjIC0gQWxwaGEgbnVtZXJpYyBzZWdtZW50cyBzb3J0IGJlZm9yZSBudW1lcmljIHNlZ21lbnRzCiAgICAgICAgIyAtIEFscGhhIG51bWVyaWMgc2VnbWVudHMgc29ydCBsZXhpY29ncmFwaGljYWxseQogICAgICAgICMgLSBOdW1lcmljIHNlZ21lbnRzIHNvcnQgbnVtZXJpY2FsbHkKICAgICAgICAjIC0gU2hvcnRlciB2ZXJzaW9ucyBzb3J0IGJlZm9yZSBsb25nZXIgdmVyc2lvbnMgd2hlbiB0aGUgcHJlZml4ZXMKICAgICAgICAjICAgbWF0Y2ggZXhhY3RseQogICAgICAgIGxvY2FsID0gdHVwbGUoCiAgICAgICAgICAgIChpLCAiIikgaWYgaXNpbnN0YW5jZShpLCBpbnQpIGVsc2UgKC1JbmZpbml0eSwgaSkKICAgICAgICAgICAgZm9yIGkgaW4gbG9jYWwKICAgICAgICApCgogICAgcmV0dXJuIGVwb2NoLCByZWxlYXNlLCBwcmUsIHBvc3QsIGRldiwgbG9jYWwKUEsDBBQAAAAAAAAAIQDJLUAmPpMBAD6TAQA1AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3BrZ19yZXNvdXJjZXMvX19pbml0X18ucHkjIGNvZGluZzogdXRmLTgKIiIiClBhY2thZ2UgcmVzb3VyY2UgQVBJCi0tLS0tLS0tLS0tLS0tLS0tLS0tCgpBIHJlc291cmNlIGlzIGEgbG9naWNhbCBmaWxlIGNvbnRhaW5lZCB3aXRoaW4gYSBwYWNrYWdlLCBvciBhIGxvZ2ljYWwKc3ViZGlyZWN0b3J5IHRoZXJlb2YuICBUaGUgcGFja2FnZSByZXNvdXJjZSBBUEkgZXhwZWN0cyByZXNvdXJjZSBuYW1lcwp0byBoYXZlIHRoZWlyIHBhdGggcGFydHMgc2VwYXJhdGVkIHdpdGggYGAvYGAsICpub3QqIHdoYXRldmVyIHRoZSBsb2NhbApwYXRoIHNlcGFyYXRvciBpcy4gIERvIG5vdCB1c2Ugb3MucGF0aCBvcGVyYXRpb25zIHRvIG1hbmlwdWxhdGUgcmVzb3VyY2UKbmFtZXMgYmVpbmcgcGFzc2VkIGludG8gdGhlIEFQSS4KClRoZSBwYWNrYWdlIHJlc291cmNlIEFQSSBpcyBkZXNpZ25lZCB0byB3b3JrIHdpdGggbm9ybWFsIGZpbGVzeXN0ZW0gcGFja2FnZXMsCi5lZ2cgZmlsZXMsIGFuZCB1bnBhY2tlZCAuZWdnIGZpbGVzLiAgSXQgY2FuIGFsc28gd29yayBpbiBhIGxpbWl0ZWQgd2F5IHdpdGgKLnppcCBmaWxlcyBhbmQgd2l0aCBjdXN0b20gUEVQIDMwMiBsb2FkZXJzIHRoYXQgc3VwcG9ydCB0aGUgYGBnZXRfZGF0YSgpYGAKbWV0aG9kLgoiIiIKCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgc3lzCmltcG9ydCBvcwppbXBvcnQgaW8KaW1wb3J0IHRpbWUKaW1wb3J0IHJlCmltcG9ydCB0eXBlcwppbXBvcnQgemlwZmlsZQppbXBvcnQgemlwaW1wb3J0CmltcG9ydCB3YXJuaW5ncwppbXBvcnQgc3RhdAppbXBvcnQgZnVuY3Rvb2xzCmltcG9ydCBwa2d1dGlsCmltcG9ydCBvcGVyYXRvcgppbXBvcnQgcGxhdGZvcm0KaW1wb3J0IGNvbGxlY3Rpb25zCmltcG9ydCBwbGlzdGxpYgppbXBvcnQgZW1haWwucGFyc2VyCmltcG9ydCB0ZW1wZmlsZQppbXBvcnQgdGV4dHdyYXAKaW1wb3J0IGl0ZXJ0b29scwpmcm9tIHBrZ3V0aWwgaW1wb3J0IGdldF9pbXBvcnRlcgoKdHJ5OgogICAgaW1wb3J0IF9pbXAKZXhjZXB0IEltcG9ydEVycm9yOgogICAgIyBQeXRob24gMy4yIGNvbXBhdGliaWxpdHkKICAgIGltcG9ydCBpbXAgYXMgX2ltcAoKZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgc2l4CmZyb20gcGlwLl92ZW5kb3Iuc2l4Lm1vdmVzIGltcG9ydCB1cmxsaWIsIG1hcCwgZmlsdGVyCgojIGNhcHR1cmUgdGhlc2UgdG8gYnlwYXNzIHNhbmRib3hpbmcKZnJvbSBvcyBpbXBvcnQgdXRpbWUKdHJ5OgogICAgZnJvbSBvcyBpbXBvcnQgbWtkaXIsIHJlbmFtZSwgdW5saW5rCiAgICBXUklURV9TVVBQT1JUID0gVHJ1ZQpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAjIG5vIHdyaXRlIHN1cHBvcnQsIHByb2JhYmx5IHVuZGVyIEdBRQogICAgV1JJVEVfU1VQUE9SVCA9IEZhbHNlCgpmcm9tIG9zIGltcG9ydCBvcGVuIGFzIG9zX29wZW4KZnJvbSBvcy5wYXRoIGltcG9ydCBpc2Rpciwgc3BsaXQKCnRyeToKICAgIGltcG9ydCBpbXBvcnRsaWIubWFjaGluZXJ5IGFzIGltcG9ydGxpYl9tYWNoaW5lcnkKICAgICMgYWNjZXNzIGF0dHJpYnV0ZSB0byBmb3JjZSBpbXBvcnQgdW5kZXIgZGVsYXllZCBpbXBvcnQgbWVjaGFuaXNtcy4KICAgIGltcG9ydGxpYl9tYWNoaW5lcnkuX19uYW1lX18KZXhjZXB0IEltcG9ydEVycm9yOgogICAgaW1wb3J0bGliX21hY2hpbmVyeSA9IE5vbmUKCmZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IGFwcGRpcnMKZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgcGFja2FnaW5nCl9faW1wb3J0X18oJ3BpcC5fdmVuZG9yLnBhY2thZ2luZy52ZXJzaW9uJykKX19pbXBvcnRfXygncGlwLl92ZW5kb3IucGFja2FnaW5nLnNwZWNpZmllcnMnKQpfX2ltcG9ydF9fKCdwaXAuX3ZlbmRvci5wYWNrYWdpbmcucmVxdWlyZW1lbnRzJykKX19pbXBvcnRfXygncGlwLl92ZW5kb3IucGFja2FnaW5nLm1hcmtlcnMnKQoKCmlmICgzLCAwKSA8IHN5cy52ZXJzaW9uX2luZm8gPCAoMywgMyk6CiAgICBtc2cgPSAoCiAgICAgICAgIlN1cHBvcnQgZm9yIFB5dGhvbiAzLjAtMy4yIGhhcyBiZWVuIGRyb3BwZWQuIEZ1dHVyZSB2ZXJzaW9ucyAiCiAgICAgICAgIndpbGwgZmFpbCBoZXJlLiIKICAgICkKICAgIHdhcm5pbmdzLndhcm4obXNnKQoKIyBkZWNsYXJlIHNvbWUgZ2xvYmFscyB0aGF0IHdpbGwgYmUgZGVmaW5lZCBsYXRlciB0bwojIHNhdGlzZnkgdGhlIGxpbnRlcnMuCnJlcXVpcmUgPSBOb25lCndvcmtpbmdfc2V0ID0gTm9uZQoKCmNsYXNzIFBFUDQ0MFdhcm5pbmcoUnVudGltZVdhcm5pbmcpOgogICAgIiIiCiAgICBVc2VkIHdoZW4gdGhlcmUgaXMgYW4gaXNzdWUgd2l0aCBhIHZlcnNpb24gb3Igc3BlY2lmaWVyIG5vdCBjb21wbHlpbmcgd2l0aAogICAgUEVQIDQ0MC4KICAgICIiIgoKCmNsYXNzIF9TZXR1cHRvb2xzVmVyc2lvbk1peGluKG9iamVjdCk6CiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHN1cGVyKF9TZXR1cHRvb2xzVmVyc2lvbk1peGluLCBzZWxmKS5fX2hhc2hfXygpCgogICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdHVwbGUpOgogICAgICAgICAgICByZXR1cm4gdHVwbGUoc2VsZikgPCBvdGhlcgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzdXBlcihfU2V0dXB0b29sc1ZlcnNpb25NaXhpbiwgc2VsZikuX19sdF9fKG90aGVyKQoKICAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHR1cGxlKToKICAgICAgICAgICAgcmV0dXJuIHR1cGxlKHNlbGYpIDw9IG90aGVyCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHN1cGVyKF9TZXR1cHRvb2xzVmVyc2lvbk1peGluLCBzZWxmKS5fX2xlX18ob3RoZXIpCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdHVwbGUpOgogICAgICAgICAgICByZXR1cm4gdHVwbGUoc2VsZikgPT0gb3RoZXIKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc3VwZXIoX1NldHVwdG9vbHNWZXJzaW9uTWl4aW4sIHNlbGYpLl9fZXFfXyhvdGhlcikKCiAgICBkZWYgX19nZV9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCB0dXBsZSk6CiAgICAgICAgICAgIHJldHVybiB0dXBsZShzZWxmKSA+PSBvdGhlcgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzdXBlcihfU2V0dXB0b29sc1ZlcnNpb25NaXhpbiwgc2VsZikuX19nZV9fKG90aGVyKQoKICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHR1cGxlKToKICAgICAgICAgICAgcmV0dXJuIHR1cGxlKHNlbGYpID4gb3RoZXIKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc3VwZXIoX1NldHVwdG9vbHNWZXJzaW9uTWl4aW4sIHNlbGYpLl9fZ3RfXyhvdGhlcikKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCB0dXBsZSk6CiAgICAgICAgICAgIHJldHVybiB0dXBsZShzZWxmKSAhPSBvdGhlcgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzdXBlcihfU2V0dXB0b29sc1ZlcnNpb25NaXhpbiwgc2VsZikuX19uZV9fKG90aGVyKQoKICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgogICAgICAgIHJldHVybiB0dXBsZShzZWxmKVtrZXldCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIGNvbXBvbmVudF9yZSA9IHJlLmNvbXBpbGUocicoXGQrIHwgW2Etel0rIHwgXC58IC0pJywgcmUuVkVSQk9TRSkKICAgICAgICByZXBsYWNlID0gewogICAgICAgICAgICAncHJlJzogJ2MnLAogICAgICAgICAgICAncHJldmlldyc6ICdjJywKICAgICAgICAgICAgJy0nOiAnZmluYWwtJywKICAgICAgICAgICAgJ3JjJzogJ2MnLAogICAgICAgICAgICAnZGV2JzogJ0AnLAogICAgICAgIH0uZ2V0CgogICAgICAgIGRlZiBfcGFyc2VfdmVyc2lvbl9wYXJ0cyhzKToKICAgICAgICAgICAgZm9yIHBhcnQgaW4gY29tcG9uZW50X3JlLnNwbGl0KHMpOgogICAgICAgICAgICAgICAgcGFydCA9IHJlcGxhY2UocGFydCwgcGFydCkKICAgICAgICAgICAgICAgIGlmIG5vdCBwYXJ0IG9yIHBhcnQgPT0gJy4nOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBpZiBwYXJ0WzoxXSBpbiAnMDEyMzQ1Njc4OSc6CiAgICAgICAgICAgICAgICAgICAgIyBwYWQgZm9yIG51bWVyaWMgY29tcGFyaXNvbgogICAgICAgICAgICAgICAgICAgIHlpZWxkIHBhcnQuemZpbGwoOCkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgeWllbGQgJyonICsgcGFydAoKICAgICAgICAgICAgIyBlbnN1cmUgdGhhdCBhbHBoYS9iZXRhL2NhbmRpZGF0ZSBhcmUgYmVmb3JlIGZpbmFsCiAgICAgICAgICAgIHlpZWxkICcqZmluYWwnCgogICAgICAgIGRlZiBvbGRfcGFyc2VfdmVyc2lvbihzKToKICAgICAgICAgICAgcGFydHMgPSBbXQogICAgICAgICAgICBmb3IgcGFydCBpbiBfcGFyc2VfdmVyc2lvbl9wYXJ0cyhzLmxvd2VyKCkpOgogICAgICAgICAgICAgICAgaWYgcGFydC5zdGFydHN3aXRoKCcqJyk6CiAgICAgICAgICAgICAgICAgICAgIyByZW1vdmUgJy0nIGJlZm9yZSBhIHByZXJlbGVhc2UgdGFnCiAgICAgICAgICAgICAgICAgICAgaWYgcGFydCA8ICcqZmluYWwnOgogICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSBwYXJ0cyBhbmQgcGFydHNbLTFdID09ICcqZmluYWwtJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzLnBvcCgpCiAgICAgICAgICAgICAgICAgICAgIyByZW1vdmUgdHJhaWxpbmcgemVyb3MgZnJvbSBlYWNoIHNlcmllcyBvZiBudW1lcmljIHBhcnRzCiAgICAgICAgICAgICAgICAgICAgd2hpbGUgcGFydHMgYW5kIHBhcnRzWy0xXSA9PSAnMDAwMDAwMDAnOgogICAgICAgICAgICAgICAgICAgICAgICBwYXJ0cy5wb3AoKQogICAgICAgICAgICAgICAgcGFydHMuYXBwZW5kKHBhcnQpCiAgICAgICAgICAgIHJldHVybiB0dXBsZShwYXJ0cykKCiAgICAgICAgIyBXYXJuIGZvciB1c2Ugb2YgdGhpcyBmdW5jdGlvbgogICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICJZb3UgaGF2ZSBpdGVyYXRlZCBvdmVyIHRoZSByZXN1bHQgb2YgIgogICAgICAgICAgICAicGtnX3Jlc291cmNlcy5wYXJzZV92ZXJzaW9uLiBUaGlzIGlzIGEgbGVnYWN5IGJlaGF2aW9yIHdoaWNoIGlzICIKICAgICAgICAgICAgImluY29uc2lzdGVudCB3aXRoIHRoZSBuZXcgdmVyc2lvbiBjbGFzcyBpbnRyb2R1Y2VkIGluIHNldHVwdG9vbHMgIgogICAgICAgICAgICAiOC4wLiBJbiBtb3N0IGNhc2VzLCBjb252ZXJzaW9uIHRvIGEgdHVwbGUgaXMgdW5uZWNlc3NhcnkuIEZvciAiCiAgICAgICAgICAgICJjb21wYXJpc29uIG9mIHZlcnNpb25zLCBzb3J0IHRoZSBWZXJzaW9uIGluc3RhbmNlcyBkaXJlY3RseS4gSWYgIgogICAgICAgICAgICAieW91IGhhdmUgYW5vdGhlciB1c2UgY2FzZSByZXF1aXJpbmcgdGhlIHR1cGxlLCBwbGVhc2UgZmlsZSBhICIKICAgICAgICAgICAgImJ1ZyB3aXRoIHRoZSBzZXR1cHRvb2xzIHByb2plY3QgZGVzY3JpYmluZyB0aGF0IG5lZWQuIiwKICAgICAgICAgICAgUnVudGltZVdhcm5pbmcsCiAgICAgICAgICAgIHN0YWNrbGV2ZWw9MSwKICAgICAgICApCgogICAgICAgIGZvciBwYXJ0IGluIG9sZF9wYXJzZV92ZXJzaW9uKHN0cihzZWxmKSk6CiAgICAgICAgICAgIHlpZWxkIHBhcnQKCgpjbGFzcyBTZXR1cHRvb2xzVmVyc2lvbihfU2V0dXB0b29sc1ZlcnNpb25NaXhpbiwgcGFja2FnaW5nLnZlcnNpb24uVmVyc2lvbik6CiAgICBwYXNzCgoKY2xhc3MgU2V0dXB0b29sc0xlZ2FjeVZlcnNpb24oX1NldHVwdG9vbHNWZXJzaW9uTWl4aW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2luZy52ZXJzaW9uLkxlZ2FjeVZlcnNpb24pOgogICAgcGFzcwoKCmRlZiBwYXJzZV92ZXJzaW9uKHYpOgogICAgdHJ5OgogICAgICAgIHJldHVybiBTZXR1cHRvb2xzVmVyc2lvbih2KQogICAgZXhjZXB0IHBhY2thZ2luZy52ZXJzaW9uLkludmFsaWRWZXJzaW9uOgogICAgICAgIHJldHVybiBTZXR1cHRvb2xzTGVnYWN5VmVyc2lvbih2KQoKCl9zdGF0ZV92YXJzID0ge30KCgpkZWYgX2RlY2xhcmVfc3RhdGUodmFydHlwZSwgKiprdyk6CiAgICBnbG9iYWxzKCkudXBkYXRlKGt3KQogICAgX3N0YXRlX3ZhcnMudXBkYXRlKGRpY3QuZnJvbWtleXMoa3csIHZhcnR5cGUpKQoKCmRlZiBfX2dldHN0YXRlX18oKToKICAgIHN0YXRlID0ge30KICAgIGcgPSBnbG9iYWxzKCkKICAgIGZvciBrLCB2IGluIF9zdGF0ZV92YXJzLml0ZW1zKCk6CiAgICAgICAgc3RhdGVba10gPSBnWydfc2dldF8nICsgdl0oZ1trXSkKICAgIHJldHVybiBzdGF0ZQoKCmRlZiBfX3NldHN0YXRlX18oc3RhdGUpOgogICAgZyA9IGdsb2JhbHMoKQogICAgZm9yIGssIHYgaW4gc3RhdGUuaXRlbXMoKToKICAgICAgICBnWydfc3NldF8nICsgX3N0YXRlX3ZhcnNba11dKGssIGdba10sIHYpCiAgICByZXR1cm4gc3RhdGUKCgpkZWYgX3NnZXRfZGljdCh2YWwpOgogICAgcmV0dXJuIHZhbC5jb3B5KCkKCgpkZWYgX3NzZXRfZGljdChrZXksIG9iLCBzdGF0ZSk6CiAgICBvYi5jbGVhcigpCiAgICBvYi51cGRhdGUoc3RhdGUpCgoKZGVmIF9zZ2V0X29iamVjdCh2YWwpOgogICAgcmV0dXJuIHZhbC5fX2dldHN0YXRlX18oKQoKCmRlZiBfc3NldF9vYmplY3Qoa2V5LCBvYiwgc3RhdGUpOgogICAgb2IuX19zZXRzdGF0ZV9fKHN0YXRlKQoKCl9zZ2V0X25vbmUgPSBfc3NldF9ub25lID0gbGFtYmRhICphcmdzOiBOb25lCgoKZGVmIGdldF9zdXBwb3J0ZWRfcGxhdGZvcm0oKToKICAgICIiIlJldHVybiB0aGlzIHBsYXRmb3JtJ3MgbWF4aW11bSBjb21wYXRpYmxlIHZlcnNpb24uCgogICAgZGlzdHV0aWxzLnV0aWwuZ2V0X3BsYXRmb3JtKCkgbm9ybWFsbHkgcmVwb3J0cyB0aGUgbWluaW11bSB2ZXJzaW9uCiAgICBvZiBNYWMgT1MgWCB0aGF0IHdvdWxkIGJlIHJlcXVpcmVkIHRvICp1c2UqIGV4dGVuc2lvbnMgcHJvZHVjZWQgYnkKICAgIGRpc3R1dGlscy4gIEJ1dCB3aGF0IHdlIHdhbnQgd2hlbiBjaGVja2luZyBjb21wYXRpYmlsaXR5IGlzIHRvIGtub3cgdGhlCiAgICB2ZXJzaW9uIG9mIE1hYyBPUyBYIHRoYXQgd2UgYXJlICpydW5uaW5nKi4gIFRvIGFsbG93IHVzYWdlIG9mIHBhY2thZ2VzIHRoYXQKICAgIGV4cGxpY2l0bHkgcmVxdWlyZSBhIG5ld2VyIHZlcnNpb24gb2YgTWFjIE9TIFgsIHdlIG11c3QgYWxzbyBrbm93IHRoZQogICAgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBPUy4KCiAgICBJZiB0aGlzIGNvbmRpdGlvbiBvY2N1cnMgZm9yIGFueSBvdGhlciBwbGF0Zm9ybSB3aXRoIGEgdmVyc2lvbiBpbiBpdHMKICAgIHBsYXRmb3JtIHN0cmluZ3MsIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGV4dGVuZGVkIGFjY29yZGluZ2x5LgogICAgIiIiCiAgICBwbGF0ID0gZ2V0X2J1aWxkX3BsYXRmb3JtKCkKICAgIG0gPSBtYWNvc1ZlcnNpb25TdHJpbmcubWF0Y2gocGxhdCkKICAgIGlmIG0gaXMgbm90IE5vbmUgYW5kIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIjoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHBsYXQgPSAnbWFjb3N4LSVzLSVzJyAlICgnLicuam9pbihfbWFjb3N4X3ZlcnMoKVs6Ml0pLCBtLmdyb3VwKDMpKQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAjIG5vdCBNYWMgT1MgWAogICAgICAgICAgICBwYXNzCiAgICByZXR1cm4gcGxhdAoKCl9fYWxsX18gPSBbCiAgICAjIEJhc2ljIHJlc291cmNlIGFjY2VzcyBhbmQgZGlzdHJpYnV0aW9uL2VudHJ5IHBvaW50IGRpc2NvdmVyeQogICAgJ3JlcXVpcmUnLCAncnVuX3NjcmlwdCcsICdnZXRfcHJvdmlkZXInLCAnZ2V0X2Rpc3RyaWJ1dGlvbicsCiAgICAnbG9hZF9lbnRyeV9wb2ludCcsICdnZXRfZW50cnlfbWFwJywgJ2dldF9lbnRyeV9pbmZvJywKICAgICdpdGVyX2VudHJ5X3BvaW50cycsCiAgICAncmVzb3VyY2Vfc3RyaW5nJywgJ3Jlc291cmNlX3N0cmVhbScsICdyZXNvdXJjZV9maWxlbmFtZScsCiAgICAncmVzb3VyY2VfbGlzdGRpcicsICdyZXNvdXJjZV9leGlzdHMnLCAncmVzb3VyY2VfaXNkaXInLAoKICAgICMgRW52aXJvbm1lbnRhbCBjb250cm9sCiAgICAnZGVjbGFyZV9uYW1lc3BhY2UnLCAnd29ya2luZ19zZXQnLCAnYWRkX2FjdGl2YXRpb25fbGlzdGVuZXInLAogICAgJ2ZpbmRfZGlzdHJpYnV0aW9ucycsICdzZXRfZXh0cmFjdGlvbl9wYXRoJywgJ2NsZWFudXBfcmVzb3VyY2VzJywKICAgICdnZXRfZGVmYXVsdF9jYWNoZScsCgogICAgIyBQcmltYXJ5IGltcGxlbWVudGF0aW9uIGNsYXNzZXMKICAgICdFbnZpcm9ubWVudCcsICdXb3JraW5nU2V0JywgJ1Jlc291cmNlTWFuYWdlcicsCiAgICAnRGlzdHJpYnV0aW9uJywgJ1JlcXVpcmVtZW50JywgJ0VudHJ5UG9pbnQnLAoKICAgICMgRXhjZXB0aW9ucwogICAgJ1Jlc29sdXRpb25FcnJvcicsICdWZXJzaW9uQ29uZmxpY3QnLCAnRGlzdHJpYnV0aW9uTm90Rm91bmQnLAogICAgJ1Vua25vd25FeHRyYScsICdFeHRyYWN0aW9uRXJyb3InLAoKICAgICMgV2FybmluZ3MKICAgICdQRVA0NDBXYXJuaW5nJywKCiAgICAjIFBhcnNpbmcgZnVuY3Rpb25zIGFuZCBzdHJpbmcgdXRpbGl0aWVzCiAgICAncGFyc2VfcmVxdWlyZW1lbnRzJywgJ3BhcnNlX3ZlcnNpb24nLCAnc2FmZV9uYW1lJywgJ3NhZmVfdmVyc2lvbicsCiAgICAnZ2V0X3BsYXRmb3JtJywgJ2NvbXBhdGlibGVfcGxhdGZvcm1zJywgJ3lpZWxkX2xpbmVzJywgJ3NwbGl0X3NlY3Rpb25zJywKICAgICdzYWZlX2V4dHJhJywgJ3RvX2ZpbGVuYW1lJywgJ2ludmFsaWRfbWFya2VyJywgJ2V2YWx1YXRlX21hcmtlcicsCgogICAgIyBmaWxlc3lzdGVtIHV0aWxpdGllcwogICAgJ2Vuc3VyZV9kaXJlY3RvcnknLCAnbm9ybWFsaXplX3BhdGgnLAoKICAgICMgRGlzdHJpYnV0aW9uICJwcmVjZWRlbmNlIiBjb25zdGFudHMKICAgICdFR0dfRElTVCcsICdCSU5BUllfRElTVCcsICdTT1VSQ0VfRElTVCcsICdDSEVDS09VVF9ESVNUJywgJ0RFVkVMT1BfRElTVCcsCgogICAgIyAiUHJvdmlkZXIiIGludGVyZmFjZXMsIGltcGxlbWVudGF0aW9ucywgYW5kIHJlZ2lzdHJhdGlvbi9sb29rdXAgQVBJcwogICAgJ0lNZXRhZGF0YVByb3ZpZGVyJywgJ0lSZXNvdXJjZVByb3ZpZGVyJywgJ0ZpbGVNZXRhZGF0YScsCiAgICAnUGF0aE1ldGFkYXRhJywgJ0VnZ01ldGFkYXRhJywgJ0VtcHR5UHJvdmlkZXInLCAnZW1wdHlfcHJvdmlkZXInLAogICAgJ051bGxQcm92aWRlcicsICdFZ2dQcm92aWRlcicsICdEZWZhdWx0UHJvdmlkZXInLCAnWmlwUHJvdmlkZXInLAogICAgJ3JlZ2lzdGVyX2ZpbmRlcicsICdyZWdpc3Rlcl9uYW1lc3BhY2VfaGFuZGxlcicsICdyZWdpc3Rlcl9sb2FkZXJfdHlwZScsCiAgICAnZml4dXBfbmFtZXNwYWNlX3BhY2thZ2VzJywgJ2dldF9pbXBvcnRlcicsCgogICAgIyBEZXByZWNhdGVkL2JhY2t3YXJkIGNvbXBhdGliaWxpdHkgb25seQogICAgJ3J1bl9tYWluJywgJ0F2YWlsYWJsZURpc3RyaWJ1dGlvbnMnLApdCgoKY2xhc3MgUmVzb2x1dGlvbkVycm9yKEV4Y2VwdGlvbik6CiAgICAiIiJBYnN0cmFjdCBiYXNlIGZvciBkZXBlbmRlbmN5IHJlc29sdXRpb24gZXJyb3JzIiIiCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXyArIHJlcHIoc2VsZi5hcmdzKQoKCmNsYXNzIFZlcnNpb25Db25mbGljdChSZXNvbHV0aW9uRXJyb3IpOgogICAgIiIiCiAgICBBbiBhbHJlYWR5LWluc3RhbGxlZCB2ZXJzaW9uIGNvbmZsaWN0cyB3aXRoIHRoZSByZXF1ZXN0ZWQgdmVyc2lvbi4KCiAgICBTaG91bGQgYmUgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgaW5zdGFsbGVkIERpc3RyaWJ1dGlvbiBhbmQgdGhlIHJlcXVlc3RlZAogICAgUmVxdWlyZW1lbnQuCiAgICAiIiIKCiAgICBfdGVtcGxhdGUgPSAie3NlbGYuZGlzdH0gaXMgaW5zdGFsbGVkIGJ1dCB7c2VsZi5yZXF9IGlzIHJlcXVpcmVkIgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGRpc3Qoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuYXJnc1swXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHJlcShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5hcmdzWzFdCgogICAgZGVmIHJlcG9ydChzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fdGVtcGxhdGUuZm9ybWF0KCoqbG9jYWxzKCkpCgogICAgZGVmIHdpdGhfY29udGV4dChzZWxmLCByZXF1aXJlZF9ieSk6CiAgICAgICAgIiIiCiAgICAgICAgSWYgcmVxdWlyZWRfYnkgaXMgbm9uLWVtcHR5LCByZXR1cm4gYSB2ZXJzaW9uIG9mIHNlbGYgdGhhdCBpcyBhCiAgICAgICAgQ29udGV4dHVhbFZlcnNpb25Db25mbGljdC4KICAgICAgICAiIiIKICAgICAgICBpZiBub3QgcmVxdWlyZWRfYnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmCiAgICAgICAgYXJncyA9IHNlbGYuYXJncyArIChyZXF1aXJlZF9ieSwpCiAgICAgICAgcmV0dXJuIENvbnRleHR1YWxWZXJzaW9uQ29uZmxpY3QoKmFyZ3MpCgoKY2xhc3MgQ29udGV4dHVhbFZlcnNpb25Db25mbGljdChWZXJzaW9uQ29uZmxpY3QpOgogICAgIiIiCiAgICBBIFZlcnNpb25Db25mbGljdCB0aGF0IGFjY2VwdHMgYSB0aGlyZCBwYXJhbWV0ZXIsIHRoZSBzZXQgb2YgdGhlCiAgICByZXF1aXJlbWVudHMgdGhhdCByZXF1aXJlZCB0aGUgaW5zdGFsbGVkIERpc3RyaWJ1dGlvbi4KICAgICIiIgoKICAgIF90ZW1wbGF0ZSA9IFZlcnNpb25Db25mbGljdC5fdGVtcGxhdGUgKyAnIGJ5IHtzZWxmLnJlcXVpcmVkX2J5fScKCiAgICBAcHJvcGVydHkKICAgIGRlZiByZXF1aXJlZF9ieShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5hcmdzWzJdCgoKY2xhc3MgRGlzdHJpYnV0aW9uTm90Rm91bmQoUmVzb2x1dGlvbkVycm9yKToKICAgICIiIkEgcmVxdWVzdGVkIGRpc3RyaWJ1dGlvbiB3YXMgbm90IGZvdW5kIiIiCgogICAgX3RlbXBsYXRlID0gKCJUaGUgJ3tzZWxmLnJlcX0nIGRpc3RyaWJ1dGlvbiB3YXMgbm90IGZvdW5kICIKICAgICAgICAgICAgICAgICAiYW5kIGlzIHJlcXVpcmVkIGJ5IHtzZWxmLnJlcXVpcmVyc19zdHJ9IikKCiAgICBAcHJvcGVydHkKICAgIGRlZiByZXEoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuYXJnc1swXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHJlcXVpcmVycyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5hcmdzWzFdCgogICAgQHByb3BlcnR5CiAgICBkZWYgcmVxdWlyZXJzX3N0cihzZWxmKToKICAgICAgICBpZiBub3Qgc2VsZi5yZXF1aXJlcnM6CiAgICAgICAgICAgIHJldHVybiAndGhlIGFwcGxpY2F0aW9uJwogICAgICAgIHJldHVybiAnLCAnLmpvaW4oc2VsZi5yZXF1aXJlcnMpCgogICAgZGVmIHJlcG9ydChzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fdGVtcGxhdGUuZm9ybWF0KCoqbG9jYWxzKCkpCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYucmVwb3J0KCkKCgpjbGFzcyBVbmtub3duRXh0cmEoUmVzb2x1dGlvbkVycm9yKToKICAgICIiIkRpc3RyaWJ1dGlvbiBkb2Vzbid0IGhhdmUgYW4gImV4dHJhIGZlYXR1cmUiIG9mIHRoZSBnaXZlbiBuYW1lIiIiCgoKX3Byb3ZpZGVyX2ZhY3RvcmllcyA9IHt9CgpQWV9NQUpPUiA9IHN5cy52ZXJzaW9uWzozXQpFR0dfRElTVCA9IDMKQklOQVJZX0RJU1QgPSAyClNPVVJDRV9ESVNUID0gMQpDSEVDS09VVF9ESVNUID0gMApERVZFTE9QX0RJU1QgPSAtMQoKCmRlZiByZWdpc3Rlcl9sb2FkZXJfdHlwZShsb2FkZXJfdHlwZSwgcHJvdmlkZXJfZmFjdG9yeSk6CiAgICAiIiJSZWdpc3RlciBgcHJvdmlkZXJfZmFjdG9yeWAgdG8gbWFrZSBwcm92aWRlcnMgZm9yIGBsb2FkZXJfdHlwZWAKCiAgICBgbG9hZGVyX3R5cGVgIGlzIHRoZSB0eXBlIG9yIGNsYXNzIG9mIGEgUEVQIDMwMiBgYG1vZHVsZS5fX2xvYWRlcl9fYGAsCiAgICBhbmQgYHByb3ZpZGVyX2ZhY3RvcnlgIGlzIGEgZnVuY3Rpb24gdGhhdCwgcGFzc2VkIGEgKm1vZHVsZSogb2JqZWN0LAogICAgcmV0dXJucyBhbiBgYElSZXNvdXJjZVByb3ZpZGVyYGAgZm9yIHRoYXQgbW9kdWxlLgogICAgIiIiCiAgICBfcHJvdmlkZXJfZmFjdG9yaWVzW2xvYWRlcl90eXBlXSA9IHByb3ZpZGVyX2ZhY3RvcnkKCgpkZWYgZ2V0X3Byb3ZpZGVyKG1vZHVsZU9yUmVxKToKICAgICIiIlJldHVybiBhbiBJUmVzb3VyY2VQcm92aWRlciBmb3IgdGhlIG5hbWVkIG1vZHVsZSBvciByZXF1aXJlbWVudCIiIgogICAgaWYgaXNpbnN0YW5jZShtb2R1bGVPclJlcSwgUmVxdWlyZW1lbnQpOgogICAgICAgIHJldHVybiB3b3JraW5nX3NldC5maW5kKG1vZHVsZU9yUmVxKSBvciByZXF1aXJlKHN0cihtb2R1bGVPclJlcSkpWzBdCiAgICB0cnk6CiAgICAgICAgbW9kdWxlID0gc3lzLm1vZHVsZXNbbW9kdWxlT3JSZXFdCiAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgX19pbXBvcnRfXyhtb2R1bGVPclJlcSkKICAgICAgICBtb2R1bGUgPSBzeXMubW9kdWxlc1ttb2R1bGVPclJlcV0KICAgIGxvYWRlciA9IGdldGF0dHIobW9kdWxlLCAnX19sb2FkZXJfXycsIE5vbmUpCiAgICByZXR1cm4gX2ZpbmRfYWRhcHRlcihfcHJvdmlkZXJfZmFjdG9yaWVzLCBsb2FkZXIpKG1vZHVsZSkKCgpkZWYgX21hY29zeF92ZXJzKF9jYWNoZT1bXSk6CiAgICBpZiBub3QgX2NhY2hlOgogICAgICAgIHZlcnNpb24gPSBwbGF0Zm9ybS5tYWNfdmVyKClbMF0KICAgICAgICAjIGZhbGxiYWNrIGZvciBNYWNQb3J0cwogICAgICAgIGlmIHZlcnNpb24gPT0gJyc6CiAgICAgICAgICAgIHBsaXN0ID0gJy9TeXN0ZW0vTGlicmFyeS9Db3JlU2VydmljZXMvU3lzdGVtVmVyc2lvbi5wbGlzdCcKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocGxpc3QpOgogICAgICAgICAgICAgICAgaWYgaGFzYXR0cihwbGlzdGxpYiwgJ3JlYWRQbGlzdCcpOgogICAgICAgICAgICAgICAgICAgIHBsaXN0X2NvbnRlbnQgPSBwbGlzdGxpYi5yZWFkUGxpc3QocGxpc3QpCiAgICAgICAgICAgICAgICAgICAgaWYgJ1Byb2R1Y3RWZXJzaW9uJyBpbiBwbGlzdF9jb250ZW50OgogICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uID0gcGxpc3RfY29udGVudFsnUHJvZHVjdFZlcnNpb24nXQoKICAgICAgICBfY2FjaGUuYXBwZW5kKHZlcnNpb24uc3BsaXQoJy4nKSkKICAgIHJldHVybiBfY2FjaGVbMF0KCgpkZWYgX21hY29zeF9hcmNoKG1hY2hpbmUpOgogICAgcmV0dXJuIHsnUG93ZXJQQyc6ICdwcGMnLCAnUG93ZXJfTWFjaW50b3NoJzogJ3BwYyd9LmdldChtYWNoaW5lLCBtYWNoaW5lKQoKCmRlZiBnZXRfYnVpbGRfcGxhdGZvcm0oKToKICAgICIiIlJldHVybiB0aGlzIHBsYXRmb3JtJ3Mgc3RyaW5nIGZvciBwbGF0Zm9ybS1zcGVjaWZpYyBkaXN0cmlidXRpb25zCgogICAgWFhYIEN1cnJlbnRseSB0aGlzIGlzIHRoZSBzYW1lIGFzIGBgZGlzdHV0aWxzLnV0aWwuZ2V0X3BsYXRmb3JtKClgYCwgYnV0IGl0CiAgICBuZWVkcyBzb21lIGhhY2tzIGZvciBMaW51eCBhbmQgTWFjIE9TIFguCiAgICAiIiIKICAgIHRyeToKICAgICAgICAjIFB5dGhvbiAyLjcgb3IgPj0zLjIKICAgICAgICBmcm9tIHN5c2NvbmZpZyBpbXBvcnQgZ2V0X3BsYXRmb3JtCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgZ2V0X3BsYXRmb3JtCgogICAgcGxhdCA9IGdldF9wbGF0Zm9ybSgpCiAgICBpZiBzeXMucGxhdGZvcm0gPT0gImRhcndpbiIgYW5kIG5vdCBwbGF0LnN0YXJ0c3dpdGgoJ21hY29zeC0nKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHZlcnNpb24gPSBfbWFjb3N4X3ZlcnMoKQogICAgICAgICAgICBtYWNoaW5lID0gb3MudW5hbWUoKVs0XS5yZXBsYWNlKCIgIiwgIl8iKQogICAgICAgICAgICByZXR1cm4gIm1hY29zeC0lZC4lZC0lcyIgJSAoaW50KHZlcnNpb25bMF0pLCBpbnQodmVyc2lvblsxXSksCiAgICAgICAgICAgICAgICBfbWFjb3N4X2FyY2gobWFjaGluZSkpCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICMgaWYgc29tZW9uZSBpcyBydW5uaW5nIGEgbm9uLU1hYyBkYXJ3aW4gc3lzdGVtLCB0aGlzIHdpbGwgZmFsbAogICAgICAgICAgICAjIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KICAgICAgICAgICAgcGFzcwogICAgcmV0dXJuIHBsYXQKCgptYWNvc1ZlcnNpb25TdHJpbmcgPSByZS5jb21waWxlKHIibWFjb3N4LShcZCspXC4oXGQrKS0oLiopIikKZGFyd2luVmVyc2lvblN0cmluZyA9IHJlLmNvbXBpbGUociJkYXJ3aW4tKFxkKylcLihcZCspXC4oXGQrKS0oLiopIikKIyBYWFggYmFja3dhcmQgY29tcGF0CmdldF9wbGF0Zm9ybSA9IGdldF9idWlsZF9wbGF0Zm9ybQoKCmRlZiBjb21wYXRpYmxlX3BsYXRmb3Jtcyhwcm92aWRlZCwgcmVxdWlyZWQpOgogICAgIiIiQ2FuIGNvZGUgZm9yIHRoZSBgcHJvdmlkZWRgIHBsYXRmb3JtIHJ1biBvbiB0aGUgYHJlcXVpcmVkYCBwbGF0Zm9ybT8KCiAgICBSZXR1cm5zIHRydWUgaWYgZWl0aGVyIHBsYXRmb3JtIGlzIGBgTm9uZWBgLCBvciB0aGUgcGxhdGZvcm1zIGFyZSBlcXVhbC4KCiAgICBYWFggTmVlZHMgY29tcGF0aWJpbGl0eSBjaGVja3MgZm9yIExpbnV4IGFuZCBvdGhlciB1bml4eSBPU2VzLgogICAgIiIiCiAgICBpZiBwcm92aWRlZCBpcyBOb25lIG9yIHJlcXVpcmVkIGlzIE5vbmUgb3IgcHJvdmlkZWQgPT0gcmVxdWlyZWQ6CiAgICAgICAgIyBlYXN5IGNhc2UKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICMgTWFjIE9TIFggc3BlY2lhbCBjYXNlcwogICAgcmVxTWFjID0gbWFjb3NWZXJzaW9uU3RyaW5nLm1hdGNoKHJlcXVpcmVkKQogICAgaWYgcmVxTWFjOgogICAgICAgIHByb3ZNYWMgPSBtYWNvc1ZlcnNpb25TdHJpbmcubWF0Y2gocHJvdmlkZWQpCgogICAgICAgICMgaXMgdGhpcyBhIE1hYyBwYWNrYWdlPwogICAgICAgIGlmIG5vdCBwcm92TWFjOgogICAgICAgICAgICAjIHRoaXMgaXMgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIHBhY2thZ2VzIGJ1aWx0IGJlZm9yZQogICAgICAgICAgICAjIHNldHVwdG9vbHMgMC42LiBBbGwgcGFja2FnZXMgYnVpbHQgYWZ0ZXIgdGhpcyBwb2ludCB3aWxsCiAgICAgICAgICAgICMgdXNlIHRoZSBuZXcgbWFjb3N4IGRlc2lnbmF0aW9uLgogICAgICAgICAgICBwcm92RGFyd2luID0gZGFyd2luVmVyc2lvblN0cmluZy5tYXRjaChwcm92aWRlZCkKICAgICAgICAgICAgaWYgcHJvdkRhcndpbjoKICAgICAgICAgICAgICAgIGR2ZXJzaW9uID0gaW50KHByb3ZEYXJ3aW4uZ3JvdXAoMSkpCiAgICAgICAgICAgICAgICBtYWNvc3ZlcnNpb24gPSAiJXMuJXMiICUgKHJlcU1hYy5ncm91cCgxKSwgcmVxTWFjLmdyb3VwKDIpKQogICAgICAgICAgICAgICAgaWYgZHZlcnNpb24gPT0gNyBhbmQgbWFjb3N2ZXJzaW9uID49ICIxMC4zIiBvciBcCiAgICAgICAgICAgICAgICAgICAgICAgIGR2ZXJzaW9uID09IDggYW5kIG1hY29zdmVyc2lvbiA+PSAiMTAuNCI6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICAgICAgIyBlZ2cgaXNuJ3QgbWFjb3N4IG9yIGxlZ2FjeSBkYXJ3aW4KICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgYXJlIHRoZXkgdGhlIHNhbWUgbWFqb3IgdmVyc2lvbiBhbmQgbWFjaGluZSB0eXBlPwogICAgICAgIGlmIHByb3ZNYWMuZ3JvdXAoMSkgIT0gcmVxTWFjLmdyb3VwKDEpIG9yIFwKICAgICAgICAgICAgICAgIHByb3ZNYWMuZ3JvdXAoMykgIT0gcmVxTWFjLmdyb3VwKDMpOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBpcyB0aGUgcmVxdWlyZWQgT1MgbWFqb3IgdXBkYXRlID49IHRoZSBwcm92aWRlZCBvbmU/CiAgICAgICAgaWYgaW50KHByb3ZNYWMuZ3JvdXAoMikpID4gaW50KHJlcU1hYy5ncm91cCgyKSk6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICMgWFhYIExpbnV4IGFuZCBvdGhlciBwbGF0Zm9ybXMnIHNwZWNpYWwgY2FzZXMgc2hvdWxkIGdvIGhlcmUKICAgIHJldHVybiBGYWxzZQoKCmRlZiBydW5fc2NyaXB0KGRpc3Rfc3BlYywgc2NyaXB0X25hbWUpOgogICAgIiIiTG9jYXRlIGRpc3RyaWJ1dGlvbiBgZGlzdF9zcGVjYCBhbmQgcnVuIGl0cyBgc2NyaXB0X25hbWVgIHNjcmlwdCIiIgogICAgbnMgPSBzeXMuX2dldGZyYW1lKDEpLmZfZ2xvYmFscwogICAgbmFtZSA9IG5zWydfX25hbWVfXyddCiAgICBucy5jbGVhcigpCiAgICBuc1snX19uYW1lX18nXSA9IG5hbWUKICAgIHJlcXVpcmUoZGlzdF9zcGVjKVswXS5ydW5fc2NyaXB0KHNjcmlwdF9uYW1lLCBucykKCgojIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKcnVuX21haW4gPSBydW5fc2NyaXB0CgoKZGVmIGdldF9kaXN0cmlidXRpb24oZGlzdCk6CiAgICAiIiJSZXR1cm4gYSBjdXJyZW50IGRpc3RyaWJ1dGlvbiBvYmplY3QgZm9yIGEgUmVxdWlyZW1lbnQgb3Igc3RyaW5nIiIiCiAgICBpZiBpc2luc3RhbmNlKGRpc3QsIHNpeC5zdHJpbmdfdHlwZXMpOgogICAgICAgIGRpc3QgPSBSZXF1aXJlbWVudC5wYXJzZShkaXN0KQogICAgaWYgaXNpbnN0YW5jZShkaXN0LCBSZXF1aXJlbWVudCk6CiAgICAgICAgZGlzdCA9IGdldF9wcm92aWRlcihkaXN0KQogICAgaWYgbm90IGlzaW5zdGFuY2UoZGlzdCwgRGlzdHJpYnV0aW9uKToKICAgICAgICByYWlzZSBUeXBlRXJyb3IoIkV4cGVjdGVkIHN0cmluZywgUmVxdWlyZW1lbnQsIG9yIERpc3RyaWJ1dGlvbiIsIGRpc3QpCiAgICByZXR1cm4gZGlzdAoKCmRlZiBsb2FkX2VudHJ5X3BvaW50KGRpc3QsIGdyb3VwLCBuYW1lKToKICAgICIiIlJldHVybiBgbmFtZWAgZW50cnkgcG9pbnQgb2YgYGdyb3VwYCBmb3IgYGRpc3RgIG9yIHJhaXNlIEltcG9ydEVycm9yIiIiCiAgICByZXR1cm4gZ2V0X2Rpc3RyaWJ1dGlvbihkaXN0KS5sb2FkX2VudHJ5X3BvaW50KGdyb3VwLCBuYW1lKQoKCmRlZiBnZXRfZW50cnlfbWFwKGRpc3QsIGdyb3VwPU5vbmUpOgogICAgIiIiUmV0dXJuIHRoZSBlbnRyeSBwb2ludCBtYXAgZm9yIGBncm91cGAsIG9yIHRoZSBmdWxsIGVudHJ5IG1hcCIiIgogICAgcmV0dXJuIGdldF9kaXN0cmlidXRpb24oZGlzdCkuZ2V0X2VudHJ5X21hcChncm91cCkKCgpkZWYgZ2V0X2VudHJ5X2luZm8oZGlzdCwgZ3JvdXAsIG5hbWUpOgogICAgIiIiUmV0dXJuIHRoZSBFbnRyeVBvaW50IG9iamVjdCBmb3IgYGdyb3VwYCtgbmFtZWAsIG9yIGBgTm9uZWBgIiIiCiAgICByZXR1cm4gZ2V0X2Rpc3RyaWJ1dGlvbihkaXN0KS5nZXRfZW50cnlfaW5mbyhncm91cCwgbmFtZSkKCgpjbGFzcyBJTWV0YWRhdGFQcm92aWRlcjoKICAgIGRlZiBoYXNfbWV0YWRhdGEobmFtZSk6CiAgICAgICAgIiIiRG9lcyB0aGUgcGFja2FnZSdzIGRpc3RyaWJ1dGlvbiBjb250YWluIHRoZSBuYW1lZCBtZXRhZGF0YT8iIiIKCiAgICBkZWYgZ2V0X21ldGFkYXRhKG5hbWUpOgogICAgICAgICIiIlRoZSBuYW1lZCBtZXRhZGF0YSByZXNvdXJjZSBhcyBhIHN0cmluZyIiIgoKICAgIGRlZiBnZXRfbWV0YWRhdGFfbGluZXMobmFtZSk6CiAgICAgICAgIiIiWWllbGQgbmFtZWQgbWV0YWRhdGEgcmVzb3VyY2UgYXMgbGlzdCBvZiBub24tYmxhbmsgbm9uLWNvbW1lbnQgbGluZXMKCiAgICAgICBMZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIGlzIHN0cmlwcGVkIGZyb20gZWFjaCBsaW5lLCBhbmQgbGluZXMKICAgICAgIHdpdGggYGAjYGAgYXMgdGhlIGZpcnN0IG5vbi1ibGFuayBjaGFyYWN0ZXIgYXJlIG9taXR0ZWQuIiIiCgogICAgZGVmIG1ldGFkYXRhX2lzZGlyKG5hbWUpOgogICAgICAgICIiIklzIHRoZSBuYW1lZCBtZXRhZGF0YSBhIGRpcmVjdG9yeT8gIChsaWtlIGBgb3MucGF0aC5pc2RpcigpYGApIiIiCgogICAgZGVmIG1ldGFkYXRhX2xpc3RkaXIobmFtZSk6CiAgICAgICAgIiIiTGlzdCBvZiBtZXRhZGF0YSBuYW1lcyBpbiB0aGUgZGlyZWN0b3J5IChsaWtlIGBgb3MubGlzdGRpcigpYGApIiIiCgogICAgZGVmIHJ1bl9zY3JpcHQoc2NyaXB0X25hbWUsIG5hbWVzcGFjZSk6CiAgICAgICAgIiIiRXhlY3V0ZSB0aGUgbmFtZWQgc2NyaXB0IGluIHRoZSBzdXBwbGllZCBuYW1lc3BhY2UgZGljdGlvbmFyeSIiIgoKCmNsYXNzIElSZXNvdXJjZVByb3ZpZGVyKElNZXRhZGF0YVByb3ZpZGVyKToKICAgICIiIkFuIG9iamVjdCB0aGF0IHByb3ZpZGVzIGFjY2VzcyB0byBwYWNrYWdlIHJlc291cmNlcyIiIgoKICAgIGRlZiBnZXRfcmVzb3VyY2VfZmlsZW5hbWUobWFuYWdlciwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIGEgdHJ1ZSBmaWxlc3lzdGVtIHBhdGggZm9yIGByZXNvdXJjZV9uYW1lYAoKICAgICAgICBgbWFuYWdlcmAgbXVzdCBiZSBhbiBgYElSZXNvdXJjZU1hbmFnZXJgYCIiIgoKICAgIGRlZiBnZXRfcmVzb3VyY2Vfc3RyZWFtKG1hbmFnZXIsIHJlc291cmNlX25hbWUpOgogICAgICAgICIiIlJldHVybiBhIHJlYWRhYmxlIGZpbGUtbGlrZSBvYmplY3QgZm9yIGByZXNvdXJjZV9uYW1lYAoKICAgICAgICBgbWFuYWdlcmAgbXVzdCBiZSBhbiBgYElSZXNvdXJjZU1hbmFnZXJgYCIiIgoKICAgIGRlZiBnZXRfcmVzb3VyY2Vfc3RyaW5nKG1hbmFnZXIsIHJlc291cmNlX25hbWUpOgogICAgICAgICIiIlJldHVybiBhIHN0cmluZyBjb250YWluaW5nIHRoZSBjb250ZW50cyBvZiBgcmVzb3VyY2VfbmFtZWAKCiAgICAgICAgYG1hbmFnZXJgIG11c3QgYmUgYW4gYGBJUmVzb3VyY2VNYW5hZ2VyYGAiIiIKCiAgICBkZWYgaGFzX3Jlc291cmNlKHJlc291cmNlX25hbWUpOgogICAgICAgICIiIkRvZXMgdGhlIHBhY2thZ2UgY29udGFpbiB0aGUgbmFtZWQgcmVzb3VyY2U/IiIiCgogICAgZGVmIHJlc291cmNlX2lzZGlyKHJlc291cmNlX25hbWUpOgogICAgICAgICIiIklzIHRoZSBuYW1lZCByZXNvdXJjZSBhIGRpcmVjdG9yeT8gIChsaWtlIGBgb3MucGF0aC5pc2RpcigpYGApIiIiCgogICAgZGVmIHJlc291cmNlX2xpc3RkaXIocmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiTGlzdCBvZiByZXNvdXJjZSBuYW1lcyBpbiB0aGUgZGlyZWN0b3J5IChsaWtlIGBgb3MubGlzdGRpcigpYGApIiIiCgoKY2xhc3MgV29ya2luZ1NldChvYmplY3QpOgogICAgIiIiQSBjb2xsZWN0aW9uIG9mIGFjdGl2ZSBkaXN0cmlidXRpb25zIG9uIHN5cy5wYXRoIChvciBhIHNpbWlsYXIgbGlzdCkiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgZW50cmllcz1Ob25lKToKICAgICAgICAiIiJDcmVhdGUgd29ya2luZyBzZXQgZnJvbSBsaXN0IG9mIHBhdGggZW50cmllcyAoZGVmYXVsdD1zeXMucGF0aCkiIiIKICAgICAgICBzZWxmLmVudHJpZXMgPSBbXQogICAgICAgIHNlbGYuZW50cnlfa2V5cyA9IHt9CiAgICAgICAgc2VsZi5ieV9rZXkgPSB7fQogICAgICAgIHNlbGYuY2FsbGJhY2tzID0gW10KCiAgICAgICAgaWYgZW50cmllcyBpcyBOb25lOgogICAgICAgICAgICBlbnRyaWVzID0gc3lzLnBhdGgKCiAgICAgICAgZm9yIGVudHJ5IGluIGVudHJpZXM6CiAgICAgICAgICAgIHNlbGYuYWRkX2VudHJ5KGVudHJ5KQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9idWlsZF9tYXN0ZXIoY2xzKToKICAgICAgICAiIiIKICAgICAgICBQcmVwYXJlIHRoZSBtYXN0ZXIgd29ya2luZyBzZXQuCiAgICAgICAgIiIiCiAgICAgICAgd3MgPSBjbHMoKQogICAgICAgIHRyeToKICAgICAgICAgICAgZnJvbSBfX21haW5fXyBpbXBvcnQgX19yZXF1aXJlc19fCiAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICAjIFRoZSBtYWluIHByb2dyYW0gZG9lcyBub3QgbGlzdCBhbnkgcmVxdWlyZW1lbnRzCiAgICAgICAgICAgIHJldHVybiB3cwoKICAgICAgICAjIGVuc3VyZSB0aGUgcmVxdWlyZW1lbnRzIGFyZSBtZXQKICAgICAgICB0cnk6CiAgICAgICAgICAgIHdzLnJlcXVpcmUoX19yZXF1aXJlc19fKQogICAgICAgIGV4Y2VwdCBWZXJzaW9uQ29uZmxpY3Q6CiAgICAgICAgICAgIHJldHVybiBjbHMuX2J1aWxkX2Zyb21fcmVxdWlyZW1lbnRzKF9fcmVxdWlyZXNfXykKCiAgICAgICAgcmV0dXJuIHdzCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX2J1aWxkX2Zyb21fcmVxdWlyZW1lbnRzKGNscywgcmVxX3NwZWMpOgogICAgICAgICIiIgogICAgICAgIEJ1aWxkIGEgd29ya2luZyBzZXQgZnJvbSBhIHJlcXVpcmVtZW50IHNwZWMuIFJld3JpdGVzIHN5cy5wYXRoLgogICAgICAgICIiIgogICAgICAgICMgdHJ5IGl0IHdpdGhvdXQgZGVmYXVsdHMgYWxyZWFkeSBvbiBzeXMucGF0aAogICAgICAgICMgYnkgc3RhcnRpbmcgd2l0aCBhbiBlbXB0eSBwYXRoCiAgICAgICAgd3MgPSBjbHMoW10pCiAgICAgICAgcmVxcyA9IHBhcnNlX3JlcXVpcmVtZW50cyhyZXFfc3BlYykKICAgICAgICBkaXN0cyA9IHdzLnJlc29sdmUocmVxcywgRW52aXJvbm1lbnQoKSkKICAgICAgICBmb3IgZGlzdCBpbiBkaXN0czoKICAgICAgICAgICAgd3MuYWRkKGRpc3QpCgogICAgICAgICMgYWRkIGFueSBtaXNzaW5nIGVudHJpZXMgZnJvbSBzeXMucGF0aAogICAgICAgIGZvciBlbnRyeSBpbiBzeXMucGF0aDoKICAgICAgICAgICAgaWYgZW50cnkgbm90IGluIHdzLmVudHJpZXM6CiAgICAgICAgICAgICAgICB3cy5hZGRfZW50cnkoZW50cnkpCgogICAgICAgICMgdGhlbiBjb3B5IGJhY2sgdG8gc3lzLnBhdGgKICAgICAgICBzeXMucGF0aFs6XSA9IHdzLmVudHJpZXMKICAgICAgICByZXR1cm4gd3MKCiAgICBkZWYgYWRkX2VudHJ5KHNlbGYsIGVudHJ5KToKICAgICAgICAiIiJBZGQgYSBwYXRoIGl0ZW0gdG8gYGAuZW50cmllc2BgLCBmaW5kaW5nIGFueSBkaXN0cmlidXRpb25zIG9uIGl0CgogICAgICAgIGBgZmluZF9kaXN0cmlidXRpb25zKGVudHJ5LCBUcnVlKWBgIGlzIHVzZWQgdG8gZmluZCBkaXN0cmlidXRpb25zCiAgICAgICAgY29ycmVzcG9uZGluZyB0byB0aGUgcGF0aCBlbnRyeSwgYW5kIHRoZXkgYXJlIGFkZGVkLiAgYGVudHJ5YCBpcwogICAgICAgIGFsd2F5cyBhcHBlbmRlZCB0byBgYC5lbnRyaWVzYGAsIGV2ZW4gaWYgaXQgaXMgYWxyZWFkeSBwcmVzZW50LgogICAgICAgIChUaGlzIGlzIGJlY2F1c2UgYGBzeXMucGF0aGBgIGNhbiBjb250YWluIHRoZSBzYW1lIHZhbHVlIG1vcmUgdGhhbgogICAgICAgIG9uY2UsIGFuZCB0aGUgYGAuZW50cmllc2BgIG9mIHRoZSBgYHN5cy5wYXRoYGAgV29ya2luZ1NldCBzaG91bGQgYWx3YXlzCiAgICAgICAgZXF1YWwgYGBzeXMucGF0aGBgLikKICAgICAgICAiIiIKICAgICAgICBzZWxmLmVudHJ5X2tleXMuc2V0ZGVmYXVsdChlbnRyeSwgW10pCiAgICAgICAgc2VsZi5lbnRyaWVzLmFwcGVuZChlbnRyeSkKICAgICAgICBmb3IgZGlzdCBpbiBmaW5kX2Rpc3RyaWJ1dGlvbnMoZW50cnksIFRydWUpOgogICAgICAgICAgICBzZWxmLmFkZChkaXN0LCBlbnRyeSwgRmFsc2UpCgogICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBkaXN0KToKICAgICAgICAiIiJUcnVlIGlmIGBkaXN0YCBpcyB0aGUgYWN0aXZlIGRpc3RyaWJ1dGlvbiBmb3IgaXRzIHByb2plY3QiIiIKICAgICAgICByZXR1cm4gc2VsZi5ieV9rZXkuZ2V0KGRpc3Qua2V5KSA9PSBkaXN0CgogICAgZGVmIGZpbmQoc2VsZiwgcmVxKToKICAgICAgICAiIiJGaW5kIGEgZGlzdHJpYnV0aW9uIG1hdGNoaW5nIHJlcXVpcmVtZW50IGByZXFgCgogICAgICAgIElmIHRoZXJlIGlzIGFuIGFjdGl2ZSBkaXN0cmlidXRpb24gZm9yIHRoZSByZXF1ZXN0ZWQgcHJvamVjdCwgdGhpcwogICAgICAgIHJldHVybnMgaXQgYXMgbG9uZyBhcyBpdCBtZWV0cyB0aGUgdmVyc2lvbiByZXF1aXJlbWVudCBzcGVjaWZpZWQgYnkKICAgICAgICBgcmVxYC4gIEJ1dCwgaWYgdGhlcmUgaXMgYW4gYWN0aXZlIGRpc3RyaWJ1dGlvbiBmb3IgdGhlIHByb2plY3QgYW5kIGl0CiAgICAgICAgZG9lcyAqbm90KiBtZWV0IHRoZSBgcmVxYCByZXF1aXJlbWVudCwgYGBWZXJzaW9uQ29uZmxpY3RgYCBpcyByYWlzZWQuCiAgICAgICAgSWYgdGhlcmUgaXMgbm8gYWN0aXZlIGRpc3RyaWJ1dGlvbiBmb3IgdGhlIHJlcXVlc3RlZCBwcm9qZWN0LCBgYE5vbmVgYAogICAgICAgIGlzIHJldHVybmVkLgogICAgICAgICIiIgogICAgICAgIGRpc3QgPSBzZWxmLmJ5X2tleS5nZXQocmVxLmtleSkKICAgICAgICBpZiBkaXN0IGlzIG5vdCBOb25lIGFuZCBkaXN0IG5vdCBpbiByZXE6CiAgICAgICAgICAgICMgWFhYIGFkZCBtb3JlIGluZm8KICAgICAgICAgICAgcmFpc2UgVmVyc2lvbkNvbmZsaWN0KGRpc3QsIHJlcSkKICAgICAgICByZXR1cm4gZGlzdAoKICAgIGRlZiBpdGVyX2VudHJ5X3BvaW50cyhzZWxmLCBncm91cCwgbmFtZT1Ob25lKToKICAgICAgICAiIiJZaWVsZCBlbnRyeSBwb2ludCBvYmplY3RzIGZyb20gYGdyb3VwYCBtYXRjaGluZyBgbmFtZWAKCiAgICAgICAgSWYgYG5hbWVgIGlzIE5vbmUsIHlpZWxkcyBhbGwgZW50cnkgcG9pbnRzIGluIGBncm91cGAgZnJvbSBhbGwKICAgICAgICBkaXN0cmlidXRpb25zIGluIHRoZSB3b3JraW5nIHNldCwgb3RoZXJ3aXNlIG9ubHkgb25lcyBtYXRjaGluZwogICAgICAgIGJvdGggYGdyb3VwYCBhbmQgYG5hbWVgIGFyZSB5aWVsZGVkIChpbiBkaXN0cmlidXRpb24gb3JkZXIpLgogICAgICAgICIiIgogICAgICAgIGZvciBkaXN0IGluIHNlbGY6CiAgICAgICAgICAgIGVudHJpZXMgPSBkaXN0LmdldF9lbnRyeV9tYXAoZ3JvdXApCiAgICAgICAgICAgIGlmIG5hbWUgaXMgTm9uZToKICAgICAgICAgICAgICAgIGZvciBlcCBpbiBlbnRyaWVzLnZhbHVlcygpOgogICAgICAgICAgICAgICAgICAgIHlpZWxkIGVwCiAgICAgICAgICAgIGVsaWYgbmFtZSBpbiBlbnRyaWVzOgogICAgICAgICAgICAgICAgeWllbGQgZW50cmllc1tuYW1lXQoKICAgIGRlZiBydW5fc2NyaXB0KHNlbGYsIHJlcXVpcmVzLCBzY3JpcHRfbmFtZSk6CiAgICAgICAgIiIiTG9jYXRlIGRpc3RyaWJ1dGlvbiBmb3IgYHJlcXVpcmVzYCBhbmQgcnVuIGBzY3JpcHRfbmFtZWAgc2NyaXB0IiIiCiAgICAgICAgbnMgPSBzeXMuX2dldGZyYW1lKDEpLmZfZ2xvYmFscwogICAgICAgIG5hbWUgPSBuc1snX19uYW1lX18nXQogICAgICAgIG5zLmNsZWFyKCkKICAgICAgICBuc1snX19uYW1lX18nXSA9IG5hbWUKICAgICAgICBzZWxmLnJlcXVpcmUocmVxdWlyZXMpWzBdLnJ1bl9zY3JpcHQoc2NyaXB0X25hbWUsIG5zKQoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICAiIiJZaWVsZCBkaXN0cmlidXRpb25zIGZvciBub24tZHVwbGljYXRlIHByb2plY3RzIGluIHRoZSB3b3JraW5nIHNldAoKICAgICAgICBUaGUgeWllbGQgb3JkZXIgaXMgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBpdGVtcycgcGF0aCBlbnRyaWVzIHdlcmUKICAgICAgICBhZGRlZCB0byB0aGUgd29ya2luZyBzZXQuCiAgICAgICAgIiIiCiAgICAgICAgc2VlbiA9IHt9CiAgICAgICAgZm9yIGl0ZW0gaW4gc2VsZi5lbnRyaWVzOgogICAgICAgICAgICBpZiBpdGVtIG5vdCBpbiBzZWxmLmVudHJ5X2tleXM6CiAgICAgICAgICAgICAgICAjIHdvcmthcm91bmQgYSBjYWNoZSBpc3N1ZQogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIGZvciBrZXkgaW4gc2VsZi5lbnRyeV9rZXlzW2l0ZW1dOgogICAgICAgICAgICAgICAgaWYga2V5IG5vdCBpbiBzZWVuOgogICAgICAgICAgICAgICAgICAgIHNlZW5ba2V5XSA9IDEKICAgICAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLmJ5X2tleVtrZXldCgogICAgZGVmIGFkZChzZWxmLCBkaXN0LCBlbnRyeT1Ob25lLCBpbnNlcnQ9VHJ1ZSwgcmVwbGFjZT1GYWxzZSk6CiAgICAgICAgIiIiQWRkIGBkaXN0YCB0byB3b3JraW5nIHNldCwgYXNzb2NpYXRlZCB3aXRoIGBlbnRyeWAKCiAgICAgICAgSWYgYGVudHJ5YCBpcyB1bnNwZWNpZmllZCwgaXQgZGVmYXVsdHMgdG8gdGhlIGBgLmxvY2F0aW9uYGAgb2YgYGRpc3RgLgogICAgICAgIE9uIGV4aXQgZnJvbSB0aGlzIHJvdXRpbmUsIGBlbnRyeWAgaXMgYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGUgd29ya2luZwogICAgICAgIHNldCdzIGBgLmVudHJpZXNgYCAoaWYgaXQgd2Fzbid0IGFscmVhZHkgcHJlc2VudCkuCgogICAgICAgIGBkaXN0YCBpcyBvbmx5IGFkZGVkIHRvIHRoZSB3b3JraW5nIHNldCBpZiBpdCdzIGZvciBhIHByb2plY3QgdGhhdAogICAgICAgIGRvZXNuJ3QgYWxyZWFkeSBoYXZlIGEgZGlzdHJpYnV0aW9uIGluIHRoZSBzZXQsIHVubGVzcyBgcmVwbGFjZT1UcnVlYC4KICAgICAgICBJZiBpdCdzIGFkZGVkLCBhbnkgY2FsbGJhY2tzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgYGBzdWJzY3JpYmUoKWBgIG1ldGhvZAogICAgICAgIHdpbGwgYmUgY2FsbGVkLgogICAgICAgICIiIgogICAgICAgIGlmIGluc2VydDoKICAgICAgICAgICAgZGlzdC5pbnNlcnRfb24oc2VsZi5lbnRyaWVzLCBlbnRyeSwgcmVwbGFjZT1yZXBsYWNlKQoKICAgICAgICBpZiBlbnRyeSBpcyBOb25lOgogICAgICAgICAgICBlbnRyeSA9IGRpc3QubG9jYXRpb24KICAgICAgICBrZXlzID0gc2VsZi5lbnRyeV9rZXlzLnNldGRlZmF1bHQoZW50cnksIFtdKQogICAgICAgIGtleXMyID0gc2VsZi5lbnRyeV9rZXlzLnNldGRlZmF1bHQoZGlzdC5sb2NhdGlvbiwgW10pCiAgICAgICAgaWYgbm90IHJlcGxhY2UgYW5kIGRpc3Qua2V5IGluIHNlbGYuYnlfa2V5OgogICAgICAgICAgICAjIGlnbm9yZSBoaWRkZW4gZGlzdHJvcwogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgc2VsZi5ieV9rZXlbZGlzdC5rZXldID0gZGlzdAogICAgICAgIGlmIGRpc3Qua2V5IG5vdCBpbiBrZXlzOgogICAgICAgICAgICBrZXlzLmFwcGVuZChkaXN0LmtleSkKICAgICAgICBpZiBkaXN0LmtleSBub3QgaW4ga2V5czI6CiAgICAgICAgICAgIGtleXMyLmFwcGVuZChkaXN0LmtleSkKICAgICAgICBzZWxmLl9hZGRlZF9uZXcoZGlzdCkKCiAgICBkZWYgcmVzb2x2ZShzZWxmLCByZXF1aXJlbWVudHMsIGVudj1Ob25lLCBpbnN0YWxsZXI9Tm9uZSwKICAgICAgICAgICAgcmVwbGFjZV9jb25mbGljdGluZz1GYWxzZSk6CiAgICAgICAgIiIiTGlzdCBhbGwgZGlzdHJpYnV0aW9ucyBuZWVkZWQgdG8gKHJlY3Vyc2l2ZWx5KSBtZWV0IGByZXF1aXJlbWVudHNgCgogICAgICAgIGByZXF1aXJlbWVudHNgIG11c3QgYmUgYSBzZXF1ZW5jZSBvZiBgYFJlcXVpcmVtZW50YGAgb2JqZWN0cy4gIGBlbnZgLAogICAgICAgIGlmIHN1cHBsaWVkLCBzaG91bGQgYmUgYW4gYGBFbnZpcm9ubWVudGBgIGluc3RhbmNlLiAgSWYKICAgICAgICBub3Qgc3VwcGxpZWQsIGl0IGRlZmF1bHRzIHRvIGFsbCBkaXN0cmlidXRpb25zIGF2YWlsYWJsZSB3aXRoaW4gYW55CiAgICAgICAgZW50cnkgb3IgZGlzdHJpYnV0aW9uIGluIHRoZSB3b3JraW5nIHNldC4gIGBpbnN0YWxsZXJgLCBpZiBzdXBwbGllZCwKICAgICAgICB3aWxsIGJlIGludm9rZWQgd2l0aCBlYWNoIHJlcXVpcmVtZW50IHRoYXQgY2Fubm90IGJlIG1ldCBieSBhbgogICAgICAgIGFscmVhZHktaW5zdGFsbGVkIGRpc3RyaWJ1dGlvbjsgaXQgc2hvdWxkIHJldHVybiBhIGBgRGlzdHJpYnV0aW9uYGAgb3IKICAgICAgICBgYE5vbmVgYC4KCiAgICAgICAgVW5sZXNzIGByZXBsYWNlX2NvbmZsaWN0aW5nPVRydWVgLCByYWlzZXMgYSBWZXJzaW9uQ29uZmxpY3QgZXhjZXB0aW9uIGlmCiAgICAgICAgYW55IHJlcXVpcmVtZW50cyBhcmUgZm91bmQgb24gdGhlIHBhdGggdGhhdCBoYXZlIHRoZSBjb3JyZWN0IG5hbWUgYnV0CiAgICAgICAgdGhlIHdyb25nIHZlcnNpb24uICBPdGhlcndpc2UsIGlmIGFuIGBpbnN0YWxsZXJgIGlzIHN1cHBsaWVkIGl0IHdpbGwgYmUKICAgICAgICBpbnZva2VkIHRvIG9idGFpbiB0aGUgY29ycmVjdCB2ZXJzaW9uIG9mIHRoZSByZXF1aXJlbWVudCBhbmQgYWN0aXZhdGUKICAgICAgICBpdC4KICAgICAgICAiIiIKCiAgICAgICAgIyBzZXQgdXAgdGhlIHN0YWNrCiAgICAgICAgcmVxdWlyZW1lbnRzID0gbGlzdChyZXF1aXJlbWVudHMpWzo6LTFdCiAgICAgICAgIyBzZXQgb2YgcHJvY2Vzc2VkIHJlcXVpcmVtZW50cwogICAgICAgIHByb2Nlc3NlZCA9IHt9CiAgICAgICAgIyBrZXkgLT4gZGlzdAogICAgICAgIGJlc3QgPSB7fQogICAgICAgIHRvX2FjdGl2YXRlID0gW10KCiAgICAgICAgcmVxX2V4dHJhcyA9IF9SZXFFeHRyYXMoKQoKICAgICAgICAjIE1hcHBpbmcgb2YgcmVxdWlyZW1lbnQgdG8gc2V0IG9mIGRpc3RyaWJ1dGlvbnMgdGhhdCByZXF1aXJlZCBpdDsKICAgICAgICAjIHVzZWZ1bCBmb3IgcmVwb3J0aW5nIGluZm8gYWJvdXQgY29uZmxpY3RzLgogICAgICAgIHJlcXVpcmVkX2J5ID0gY29sbGVjdGlvbnMuZGVmYXVsdGRpY3Qoc2V0KQoKICAgICAgICB3aGlsZSByZXF1aXJlbWVudHM6CiAgICAgICAgICAgICMgcHJvY2VzcyBkZXBlbmRlbmNpZXMgYnJlYWR0aC1maXJzdAogICAgICAgICAgICByZXEgPSByZXF1aXJlbWVudHMucG9wKDApCiAgICAgICAgICAgIGlmIHJlcSBpbiBwcm9jZXNzZWQ6CiAgICAgICAgICAgICAgICAjIElnbm9yZSBjeWNsaWMgb3IgcmVkdW5kYW50IGRlcGVuZGVuY2llcwogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIGlmIG5vdCByZXFfZXh0cmFzLm1hcmtlcnNfcGFzcyhyZXEpOgogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIGRpc3QgPSBiZXN0LmdldChyZXEua2V5KQogICAgICAgICAgICBpZiBkaXN0IGlzIE5vbmU6CiAgICAgICAgICAgICAgICAjIEZpbmQgdGhlIGJlc3QgZGlzdHJpYnV0aW9uIGFuZCBhZGQgaXQgdG8gdGhlIG1hcAogICAgICAgICAgICAgICAgZGlzdCA9IHNlbGYuYnlfa2V5LmdldChyZXEua2V5KQogICAgICAgICAgICAgICAgaWYgZGlzdCBpcyBOb25lIG9yIChkaXN0IG5vdCBpbiByZXEgYW5kIHJlcGxhY2VfY29uZmxpY3RpbmcpOgogICAgICAgICAgICAgICAgICAgIHdzID0gc2VsZgogICAgICAgICAgICAgICAgICAgIGlmIGVudiBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICBpZiBkaXN0IGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYgPSBFbnZpcm9ubWVudChzZWxmLmVudHJpZXMpCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFVzZSBhbiBlbXB0eSBlbnZpcm9ubWVudCBhbmQgd29ya2luZ3NldCB0byBhdm9pZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhbnkgZnVydGhlciBjb25mbGljdHMgd2l0aCB0aGUgY29uZmxpY3RpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZGlzdHJpYnV0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYgPSBFbnZpcm9ubWVudChbXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzID0gV29ya2luZ1NldChbXSkKICAgICAgICAgICAgICAgICAgICBkaXN0ID0gYmVzdFtyZXEua2V5XSA9IGVudi5iZXN0X21hdGNoKHJlcSwgd3MsIGluc3RhbGxlcikKICAgICAgICAgICAgICAgICAgICBpZiBkaXN0IGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVycyA9IHJlcXVpcmVkX2J5LmdldChyZXEsIE5vbmUpCiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIERpc3RyaWJ1dGlvbk5vdEZvdW5kKHJlcSwgcmVxdWlyZXJzKQogICAgICAgICAgICAgICAgdG9fYWN0aXZhdGUuYXBwZW5kKGRpc3QpCiAgICAgICAgICAgIGlmIGRpc3Qgbm90IGluIHJlcToKICAgICAgICAgICAgICAgICMgT29wcywgdGhlICJiZXN0IiBzbyBmYXIgY29uZmxpY3RzIHdpdGggYSBkZXBlbmRlbmN5CiAgICAgICAgICAgICAgICBkZXBlbmRlbnRfcmVxID0gcmVxdWlyZWRfYnlbcmVxXQogICAgICAgICAgICAgICAgcmFpc2UgVmVyc2lvbkNvbmZsaWN0KGRpc3QsIHJlcSkud2l0aF9jb250ZXh0KGRlcGVuZGVudF9yZXEpCgogICAgICAgICAgICAjIHB1c2ggdGhlIG5ldyByZXF1aXJlbWVudHMgb250byB0aGUgc3RhY2sKICAgICAgICAgICAgbmV3X3JlcXVpcmVtZW50cyA9IGRpc3QucmVxdWlyZXMocmVxLmV4dHJhcylbOjotMV0KICAgICAgICAgICAgcmVxdWlyZW1lbnRzLmV4dGVuZChuZXdfcmVxdWlyZW1lbnRzKQoKICAgICAgICAgICAgIyBSZWdpc3RlciB0aGUgbmV3IHJlcXVpcmVtZW50cyBuZWVkZWQgYnkgcmVxCiAgICAgICAgICAgIGZvciBuZXdfcmVxdWlyZW1lbnQgaW4gbmV3X3JlcXVpcmVtZW50czoKICAgICAgICAgICAgICAgIHJlcXVpcmVkX2J5W25ld19yZXF1aXJlbWVudF0uYWRkKHJlcS5wcm9qZWN0X25hbWUpCiAgICAgICAgICAgICAgICByZXFfZXh0cmFzW25ld19yZXF1aXJlbWVudF0gPSByZXEuZXh0cmFzCgogICAgICAgICAgICBwcm9jZXNzZWRbcmVxXSA9IFRydWUKCiAgICAgICAgIyByZXR1cm4gbGlzdCBvZiBkaXN0cm9zIHRvIGFjdGl2YXRlCiAgICAgICAgcmV0dXJuIHRvX2FjdGl2YXRlCgogICAgZGVmIGZpbmRfcGx1Z2lucyhzZWxmLCBwbHVnaW5fZW52LCBmdWxsX2Vudj1Ob25lLCBpbnN0YWxsZXI9Tm9uZSwKICAgICAgICAgICAgZmFsbGJhY2s9VHJ1ZSk6CiAgICAgICAgIiIiRmluZCBhbGwgYWN0aXZhdGFibGUgZGlzdHJpYnV0aW9ucyBpbiBgcGx1Z2luX2VudmAKCiAgICAgICAgRXhhbXBsZSB1c2FnZTo6CgogICAgICAgICAgICBkaXN0cmlidXRpb25zLCBlcnJvcnMgPSB3b3JraW5nX3NldC5maW5kX3BsdWdpbnMoCiAgICAgICAgICAgICAgICBFbnZpcm9ubWVudChwbHVnaW5fZGlybGlzdCkKICAgICAgICAgICAgKQogICAgICAgICAgICAjIGFkZCBwbHVnaW5zK2xpYnMgdG8gc3lzLnBhdGgKICAgICAgICAgICAgbWFwKHdvcmtpbmdfc2V0LmFkZCwgZGlzdHJpYnV0aW9ucykKICAgICAgICAgICAgIyBkaXNwbGF5IGVycm9ycwogICAgICAgICAgICBwcmludCgnQ291bGQgbm90IGxvYWQnLCBlcnJvcnMpCgogICAgICAgIFRoZSBgcGx1Z2luX2VudmAgc2hvdWxkIGJlIGFuIGBgRW52aXJvbm1lbnRgYCBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zCiAgICAgICAgb25seSBkaXN0cmlidXRpb25zIHRoYXQgYXJlIGluIHRoZSBwcm9qZWN0J3MgInBsdWdpbiBkaXJlY3RvcnkiIG9yCiAgICAgICAgZGlyZWN0b3JpZXMuIFRoZSBgZnVsbF9lbnZgLCBpZiBzdXBwbGllZCwgc2hvdWxkIGJlIGFuIGBgRW52aXJvbm1lbnRgYAogICAgICAgIGNvbnRhaW5zIGFsbCBjdXJyZW50bHktYXZhaWxhYmxlIGRpc3RyaWJ1dGlvbnMuICBJZiBgZnVsbF9lbnZgIGlzIG5vdAogICAgICAgIHN1cHBsaWVkLCBvbmUgaXMgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gdGhlIGBgV29ya2luZ1NldGBgIHRoaXMKICAgICAgICBtZXRob2QgaXMgY2FsbGVkIG9uLCB3aGljaCB3aWxsIHR5cGljYWxseSBtZWFuIHRoYXQgZXZlcnkgZGlyZWN0b3J5IG9uCiAgICAgICAgYGBzeXMucGF0aGBgIHdpbGwgYmUgc2Nhbm5lZCBmb3IgZGlzdHJpYnV0aW9ucy4KCiAgICAgICAgYGluc3RhbGxlcmAgaXMgYSBzdGFuZGFyZCBpbnN0YWxsZXIgY2FsbGJhY2sgYXMgdXNlZCBieSB0aGUKICAgICAgICBgYHJlc29sdmUoKWBgIG1ldGhvZC4gVGhlIGBmYWxsYmFja2AgZmxhZyBpbmRpY2F0ZXMgd2hldGhlciB3ZSBzaG91bGQKICAgICAgICBhdHRlbXB0IHRvIHJlc29sdmUgb2xkZXIgdmVyc2lvbnMgb2YgYSBwbHVnaW4gaWYgdGhlIG5ld2VzdCB2ZXJzaW9uCiAgICAgICAgY2Fubm90IGJlIHJlc29sdmVkLgoKICAgICAgICBUaGlzIG1ldGhvZCByZXR1cm5zIGEgMi10dXBsZTogKGBkaXN0cmlidXRpb25zYCwgYGVycm9yX2luZm9gKSwgd2hlcmUKICAgICAgICBgZGlzdHJpYnV0aW9uc2AgaXMgYSBsaXN0IG9mIHRoZSBkaXN0cmlidXRpb25zIGZvdW5kIGluIGBwbHVnaW5fZW52YAogICAgICAgIHRoYXQgd2VyZSBsb2FkYWJsZSwgYWxvbmcgd2l0aCBhbnkgb3RoZXIgZGlzdHJpYnV0aW9ucyB0aGF0IGFyZSBuZWVkZWQKICAgICAgICB0byByZXNvbHZlIHRoZWlyIGRlcGVuZGVuY2llcy4gIGBlcnJvcl9pbmZvYCBpcyBhIGRpY3Rpb25hcnkgbWFwcGluZwogICAgICAgIHVubG9hZGFibGUgcGx1Z2luIGRpc3RyaWJ1dGlvbnMgdG8gYW4gZXhjZXB0aW9uIGluc3RhbmNlIGRlc2NyaWJpbmcgdGhlCiAgICAgICAgZXJyb3IgdGhhdCBvY2N1cnJlZC4gVXN1YWxseSB0aGlzIHdpbGwgYmUgYSBgYERpc3RyaWJ1dGlvbk5vdEZvdW5kYGAgb3IKICAgICAgICBgYFZlcnNpb25Db25mbGljdGBgIGluc3RhbmNlLgogICAgICAgICIiIgoKICAgICAgICBwbHVnaW5fcHJvamVjdHMgPSBsaXN0KHBsdWdpbl9lbnYpCiAgICAgICAgIyBzY2FuIHByb2plY3QgbmFtZXMgaW4gYWxwaGFiZXRpYyBvcmRlcgogICAgICAgIHBsdWdpbl9wcm9qZWN0cy5zb3J0KCkKCiAgICAgICAgZXJyb3JfaW5mbyA9IHt9CiAgICAgICAgZGlzdHJpYnV0aW9ucyA9IHt9CgogICAgICAgIGlmIGZ1bGxfZW52IGlzIE5vbmU6CiAgICAgICAgICAgIGVudiA9IEVudmlyb25tZW50KHNlbGYuZW50cmllcykKICAgICAgICAgICAgZW52ICs9IHBsdWdpbl9lbnYKICAgICAgICBlbHNlOgogICAgICAgICAgICBlbnYgPSBmdWxsX2VudiArIHBsdWdpbl9lbnYKCiAgICAgICAgc2hhZG93X3NldCA9IHNlbGYuX19jbGFzc19fKFtdKQogICAgICAgICMgcHV0IGFsbCBvdXIgZW50cmllcyBpbiBzaGFkb3dfc2V0CiAgICAgICAgbGlzdChtYXAoc2hhZG93X3NldC5hZGQsIHNlbGYpKQoKICAgICAgICBmb3IgcHJvamVjdF9uYW1lIGluIHBsdWdpbl9wcm9qZWN0czoKCiAgICAgICAgICAgIGZvciBkaXN0IGluIHBsdWdpbl9lbnZbcHJvamVjdF9uYW1lXToKCiAgICAgICAgICAgICAgICByZXEgPSBbZGlzdC5hc19yZXF1aXJlbWVudCgpXQoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICByZXNvbHZlZXMgPSBzaGFkb3dfc2V0LnJlc29sdmUocmVxLCBlbnYsIGluc3RhbGxlcikKCiAgICAgICAgICAgICAgICBleGNlcHQgUmVzb2x1dGlvbkVycm9yIGFzIHY6CiAgICAgICAgICAgICAgICAgICAgIyBzYXZlIGVycm9yIGluZm8KICAgICAgICAgICAgICAgICAgICBlcnJvcl9pbmZvW2Rpc3RdID0gdgogICAgICAgICAgICAgICAgICAgIGlmIGZhbGxiYWNrOgogICAgICAgICAgICAgICAgICAgICAgICAjIHRyeSB0aGUgbmV4dCBvbGRlciB2ZXJzaW9uIG9mIHByb2plY3QKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAjIGdpdmUgdXAgb24gdGhpcyBwcm9qZWN0LCBrZWVwIGdvaW5nCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBsaXN0KG1hcChzaGFkb3dfc2V0LmFkZCwgcmVzb2x2ZWVzKSkKICAgICAgICAgICAgICAgICAgICBkaXN0cmlidXRpb25zLnVwZGF0ZShkaWN0LmZyb21rZXlzKHJlc29sdmVlcykpCgogICAgICAgICAgICAgICAgICAgICMgc3VjY2Vzcywgbm8gbmVlZCB0byB0cnkgYW55IG1vcmUgdmVyc2lvbnMgb2YgdGhpcyBwcm9qZWN0CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgZGlzdHJpYnV0aW9ucyA9IGxpc3QoZGlzdHJpYnV0aW9ucykKICAgICAgICBkaXN0cmlidXRpb25zLnNvcnQoKQoKICAgICAgICByZXR1cm4gZGlzdHJpYnV0aW9ucywgZXJyb3JfaW5mbwoKICAgIGRlZiByZXF1aXJlKHNlbGYsICpyZXF1aXJlbWVudHMpOgogICAgICAgICIiIkVuc3VyZSB0aGF0IGRpc3RyaWJ1dGlvbnMgbWF0Y2hpbmcgYHJlcXVpcmVtZW50c2AgYXJlIGFjdGl2YXRlZAoKICAgICAgICBgcmVxdWlyZW1lbnRzYCBtdXN0IGJlIGEgc3RyaW5nIG9yIGEgKHBvc3NpYmx5LW5lc3RlZCkgc2VxdWVuY2UKICAgICAgICB0aGVyZW9mLCBzcGVjaWZ5aW5nIHRoZSBkaXN0cmlidXRpb25zIGFuZCB2ZXJzaW9ucyByZXF1aXJlZC4gIFRoZQogICAgICAgIHJldHVybiB2YWx1ZSBpcyBhIHNlcXVlbmNlIG9mIHRoZSBkaXN0cmlidXRpb25zIHRoYXQgbmVlZGVkIHRvIGJlCiAgICAgICAgYWN0aXZhdGVkIHRvIGZ1bGZpbGwgdGhlIHJlcXVpcmVtZW50czsgYWxsIHJlbGV2YW50IGRpc3RyaWJ1dGlvbnMgYXJlCiAgICAgICAgaW5jbHVkZWQsIGV2ZW4gaWYgdGhleSB3ZXJlIGFscmVhZHkgYWN0aXZhdGVkIGluIHRoaXMgd29ya2luZyBzZXQuCiAgICAgICAgIiIiCiAgICAgICAgbmVlZGVkID0gc2VsZi5yZXNvbHZlKHBhcnNlX3JlcXVpcmVtZW50cyhyZXF1aXJlbWVudHMpKQoKICAgICAgICBmb3IgZGlzdCBpbiBuZWVkZWQ6CiAgICAgICAgICAgIHNlbGYuYWRkKGRpc3QpCgogICAgICAgIHJldHVybiBuZWVkZWQKCiAgICBkZWYgc3Vic2NyaWJlKHNlbGYsIGNhbGxiYWNrLCBleGlzdGluZz1UcnVlKToKICAgICAgICAiIiJJbnZva2UgYGNhbGxiYWNrYCBmb3IgYWxsIGRpc3RyaWJ1dGlvbnMKCiAgICAgICAgSWYgYGV4aXN0aW5nPVRydWVgIChkZWZhdWx0KSwKICAgICAgICBjYWxsIG9uIGFsbCBleGlzdGluZyBvbmVzLCBhcyB3ZWxsLgogICAgICAgICIiIgogICAgICAgIGlmIGNhbGxiYWNrIGluIHNlbGYuY2FsbGJhY2tzOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBzZWxmLmNhbGxiYWNrcy5hcHBlbmQoY2FsbGJhY2spCiAgICAgICAgaWYgbm90IGV4aXN0aW5nOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBmb3IgZGlzdCBpbiBzZWxmOgogICAgICAgICAgICBjYWxsYmFjayhkaXN0KQoKICAgIGRlZiBfYWRkZWRfbmV3KHNlbGYsIGRpc3QpOgogICAgICAgIGZvciBjYWxsYmFjayBpbiBzZWxmLmNhbGxiYWNrczoKICAgICAgICAgICAgY2FsbGJhY2soZGlzdCkKCiAgICBkZWYgX19nZXRzdGF0ZV9fKHNlbGYpOgogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgIHNlbGYuZW50cmllc1s6XSwgc2VsZi5lbnRyeV9rZXlzLmNvcHkoKSwgc2VsZi5ieV9rZXkuY29weSgpLAogICAgICAgICAgICBzZWxmLmNhbGxiYWNrc1s6XQogICAgICAgICkKCiAgICBkZWYgX19zZXRzdGF0ZV9fKHNlbGYsIGVfa19iX2MpOgogICAgICAgIGVudHJpZXMsIGtleXMsIGJ5X2tleSwgY2FsbGJhY2tzID0gZV9rX2JfYwogICAgICAgIHNlbGYuZW50cmllcyA9IGVudHJpZXNbOl0KICAgICAgICBzZWxmLmVudHJ5X2tleXMgPSBrZXlzLmNvcHkoKQogICAgICAgIHNlbGYuYnlfa2V5ID0gYnlfa2V5LmNvcHkoKQogICAgICAgIHNlbGYuY2FsbGJhY2tzID0gY2FsbGJhY2tzWzpdCgoKY2xhc3MgX1JlcUV4dHJhcyhkaWN0KToKICAgICIiIgogICAgTWFwIGVhY2ggcmVxdWlyZW1lbnQgdG8gdGhlIGV4dHJhcyB0aGF0IGRlbWFuZGVkIGl0LgogICAgIiIiCgogICAgZGVmIG1hcmtlcnNfcGFzcyhzZWxmLCByZXEpOgogICAgICAgICIiIgogICAgICAgIEV2YWx1YXRlIG1hcmtlcnMgZm9yIHJlcSBhZ2FpbnN0IGVhY2ggZXh0cmEgdGhhdAogICAgICAgIGRlbWFuZGVkIGl0LgoKICAgICAgICBSZXR1cm4gRmFsc2UgaWYgdGhlIHJlcSBoYXMgYSBtYXJrZXIgYW5kIGZhaWxzCiAgICAgICAgZXZhbHVhdGlvbi4gT3RoZXJ3aXNlLCByZXR1cm4gVHJ1ZS4KICAgICAgICAiIiIKICAgICAgICBleHRyYV9ldmFscyA9ICgKICAgICAgICAgICAgcmVxLm1hcmtlci5ldmFsdWF0ZSh7J2V4dHJhJzogZXh0cmF9KQogICAgICAgICAgICBmb3IgZXh0cmEgaW4gc2VsZi5nZXQocmVxLCAoKSkgKyAoTm9uZSwpCiAgICAgICAgKQogICAgICAgIHJldHVybiBub3QgcmVxLm1hcmtlciBvciBhbnkoZXh0cmFfZXZhbHMpCgoKY2xhc3MgRW52aXJvbm1lbnQob2JqZWN0KToKICAgICIiIlNlYXJjaGFibGUgc25hcHNob3Qgb2YgZGlzdHJpYnV0aW9ucyBvbiBhIHNlYXJjaCBwYXRoIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlYXJjaF9wYXRoPU5vbmUsIHBsYXRmb3JtPWdldF9zdXBwb3J0ZWRfcGxhdGZvcm0oKSwKICAgICAgICAgICAgcHl0aG9uPVBZX01BSk9SKToKICAgICAgICAiIiJTbmFwc2hvdCBkaXN0cmlidXRpb25zIGF2YWlsYWJsZSBvbiBhIHNlYXJjaCBwYXRoCgogICAgICAgIEFueSBkaXN0cmlidXRpb25zIGZvdW5kIG9uIGBzZWFyY2hfcGF0aGAgYXJlIGFkZGVkIHRvIHRoZSBlbnZpcm9ubWVudC4KICAgICAgICBgc2VhcmNoX3BhdGhgIHNob3VsZCBiZSBhIHNlcXVlbmNlIG9mIGBgc3lzLnBhdGhgYCBpdGVtcy4gIElmIG5vdAogICAgICAgIHN1cHBsaWVkLCBgYHN5cy5wYXRoYGAgaXMgdXNlZC4KCiAgICAgICAgYHBsYXRmb3JtYCBpcyBhbiBvcHRpb25hbCBzdHJpbmcgc3BlY2lmeWluZyB0aGUgbmFtZSBvZiB0aGUgcGxhdGZvcm0KICAgICAgICB0aGF0IHBsYXRmb3JtLXNwZWNpZmljIGRpc3RyaWJ1dGlvbnMgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGguICBJZgogICAgICAgIHVuc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBwbGF0Zm9ybS4gIGBweXRob25gIGlzIGFuCiAgICAgICAgb3B0aW9uYWwgc3RyaW5nIG5hbWluZyB0aGUgZGVzaXJlZCB2ZXJzaW9uIG9mIFB5dGhvbiAoZS5nLiBgYCczLjMnYGApOwogICAgICAgIGl0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHZlcnNpb24uCgogICAgICAgIFlvdSBtYXkgZXhwbGljaXRseSBzZXQgYHBsYXRmb3JtYCAoYW5kL29yIGBweXRob25gKSB0byBgYE5vbmVgYCBpZiB5b3UKICAgICAgICB3aXNoIHRvIG1hcCAqYWxsKiBkaXN0cmlidXRpb25zLCBub3QganVzdCB0aG9zZSBjb21wYXRpYmxlIHdpdGggdGhlCiAgICAgICAgcnVubmluZyBwbGF0Zm9ybSBvciBQeXRob24gdmVyc2lvbi4KICAgICAgICAiIiIKICAgICAgICBzZWxmLl9kaXN0bWFwID0ge30KICAgICAgICBzZWxmLnBsYXRmb3JtID0gcGxhdGZvcm0KICAgICAgICBzZWxmLnB5dGhvbiA9IHB5dGhvbgogICAgICAgIHNlbGYuc2NhbihzZWFyY2hfcGF0aCkKCiAgICBkZWYgY2FuX2FkZChzZWxmLCBkaXN0KToKICAgICAgICAiIiJJcyBkaXN0cmlidXRpb24gYGRpc3RgIGFjY2VwdGFibGUgZm9yIHRoaXMgZW52aXJvbm1lbnQ/CgogICAgICAgIFRoZSBkaXN0cmlidXRpb24gbXVzdCBtYXRjaCB0aGUgcGxhdGZvcm0gYW5kIHB5dGhvbiB2ZXJzaW9uCiAgICAgICAgcmVxdWlyZW1lbnRzIHNwZWNpZmllZCB3aGVuIHRoaXMgZW52aXJvbm1lbnQgd2FzIGNyZWF0ZWQsIG9yIEZhbHNlCiAgICAgICAgaXMgcmV0dXJuZWQuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIChzZWxmLnB5dGhvbiBpcyBOb25lIG9yIGRpc3QucHlfdmVyc2lvbiBpcyBOb25lCiAgICAgICAgICAgIG9yIGRpc3QucHlfdmVyc2lvbiA9PSBzZWxmLnB5dGhvbikgXAogICAgICAgICAgICBhbmQgY29tcGF0aWJsZV9wbGF0Zm9ybXMoZGlzdC5wbGF0Zm9ybSwgc2VsZi5wbGF0Zm9ybSkKCiAgICBkZWYgcmVtb3ZlKHNlbGYsIGRpc3QpOgogICAgICAgICIiIlJlbW92ZSBgZGlzdGAgZnJvbSB0aGUgZW52aXJvbm1lbnQiIiIKICAgICAgICBzZWxmLl9kaXN0bWFwW2Rpc3Qua2V5XS5yZW1vdmUoZGlzdCkKCiAgICBkZWYgc2NhbihzZWxmLCBzZWFyY2hfcGF0aD1Ob25lKToKICAgICAgICAiIiJTY2FuIGBzZWFyY2hfcGF0aGAgZm9yIGRpc3RyaWJ1dGlvbnMgdXNhYmxlIGluIHRoaXMgZW52aXJvbm1lbnQKCiAgICAgICAgQW55IGRpc3RyaWJ1dGlvbnMgZm91bmQgYXJlIGFkZGVkIHRvIHRoZSBlbnZpcm9ubWVudC4KICAgICAgICBgc2VhcmNoX3BhdGhgIHNob3VsZCBiZSBhIHNlcXVlbmNlIG9mIGBgc3lzLnBhdGhgYCBpdGVtcy4gIElmIG5vdAogICAgICAgIHN1cHBsaWVkLCBgYHN5cy5wYXRoYGAgaXMgdXNlZC4gIE9ubHkgZGlzdHJpYnV0aW9ucyBjb25mb3JtaW5nIHRvCiAgICAgICAgdGhlIHBsYXRmb3JtL3B5dGhvbiB2ZXJzaW9uIGRlZmluZWQgYXQgaW5pdGlhbGl6YXRpb24gYXJlIGFkZGVkLgogICAgICAgICIiIgogICAgICAgIGlmIHNlYXJjaF9wYXRoIGlzIE5vbmU6CiAgICAgICAgICAgIHNlYXJjaF9wYXRoID0gc3lzLnBhdGgKCiAgICAgICAgZm9yIGl0ZW0gaW4gc2VhcmNoX3BhdGg6CiAgICAgICAgICAgIGZvciBkaXN0IGluIGZpbmRfZGlzdHJpYnV0aW9ucyhpdGVtKToKICAgICAgICAgICAgICAgIHNlbGYuYWRkKGRpc3QpCgogICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIHByb2plY3RfbmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIGEgbmV3ZXN0LXRvLW9sZGVzdCBsaXN0IG9mIGRpc3RyaWJ1dGlvbnMgZm9yIGBwcm9qZWN0X25hbWVgCgogICAgICAgIFVzZXMgY2FzZS1pbnNlbnNpdGl2ZSBgcHJvamVjdF9uYW1lYCBjb21wYXJpc29uLCBhc3N1bWluZyBhbGwgdGhlCiAgICAgICAgcHJvamVjdCdzIGRpc3RyaWJ1dGlvbnMgdXNlIHRoZWlyIHByb2plY3QncyBuYW1lIGNvbnZlcnRlZCB0byBhbGwKICAgICAgICBsb3dlcmNhc2UgYXMgdGhlaXIga2V5LgoKICAgICAgICAiIiIKICAgICAgICBkaXN0cmlidXRpb25fa2V5ID0gcHJvamVjdF9uYW1lLmxvd2VyKCkKICAgICAgICByZXR1cm4gc2VsZi5fZGlzdG1hcC5nZXQoZGlzdHJpYnV0aW9uX2tleSwgW10pCgogICAgZGVmIGFkZChzZWxmLCBkaXN0KToKICAgICAgICAiIiJBZGQgYGRpc3RgIGlmIHdlIGBgY2FuX2FkZCgpYGAgaXQgYW5kIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGFkZGVkCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5jYW5fYWRkKGRpc3QpIGFuZCBkaXN0Lmhhc192ZXJzaW9uKCk6CiAgICAgICAgICAgIGRpc3RzID0gc2VsZi5fZGlzdG1hcC5zZXRkZWZhdWx0KGRpc3Qua2V5LCBbXSkKICAgICAgICAgICAgaWYgZGlzdCBub3QgaW4gZGlzdHM6CiAgICAgICAgICAgICAgICBkaXN0cy5hcHBlbmQoZGlzdCkKICAgICAgICAgICAgICAgIGRpc3RzLnNvcnQoa2V5PW9wZXJhdG9yLmF0dHJnZXR0ZXIoJ2hhc2hjbXAnKSwgcmV2ZXJzZT1UcnVlKQoKICAgIGRlZiBiZXN0X21hdGNoKHNlbGYsIHJlcSwgd29ya2luZ19zZXQsIGluc3RhbGxlcj1Ob25lKToKICAgICAgICAiIiJGaW5kIGRpc3RyaWJ1dGlvbiBiZXN0IG1hdGNoaW5nIGByZXFgIGFuZCB1c2FibGUgb24gYHdvcmtpbmdfc2V0YAoKICAgICAgICBUaGlzIGNhbGxzIHRoZSBgYGZpbmQocmVxKWBgIG1ldGhvZCBvZiB0aGUgYHdvcmtpbmdfc2V0YCB0byBzZWUgaWYgYQogICAgICAgIHN1aXRhYmxlIGRpc3RyaWJ1dGlvbiBpcyBhbHJlYWR5IGFjdGl2ZS4gIChUaGlzIG1heSByYWlzZQogICAgICAgIGBgVmVyc2lvbkNvbmZsaWN0YGAgaWYgYW4gdW5zdWl0YWJsZSB2ZXJzaW9uIG9mIHRoZSBwcm9qZWN0IGlzIGFscmVhZHkKICAgICAgICBhY3RpdmUgaW4gdGhlIHNwZWNpZmllZCBgd29ya2luZ19zZXRgLikgIElmIGEgc3VpdGFibGUgZGlzdHJpYnV0aW9uCiAgICAgICAgaXNuJ3QgYWN0aXZlLCB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBuZXdlc3QgZGlzdHJpYnV0aW9uIGluIHRoZQogICAgICAgIGVudmlyb25tZW50IHRoYXQgbWVldHMgdGhlIGBgUmVxdWlyZW1lbnRgYCBpbiBgcmVxYC4gIElmIG5vIHN1aXRhYmxlCiAgICAgICAgZGlzdHJpYnV0aW9uIGlzIGZvdW5kLCBhbmQgYGluc3RhbGxlcmAgaXMgc3VwcGxpZWQsIHRoZW4gdGhlIHJlc3VsdCBvZgogICAgICAgIGNhbGxpbmcgdGhlIGVudmlyb25tZW50J3MgYGBvYnRhaW4ocmVxLCBpbnN0YWxsZXIpYGAgbWV0aG9kIHdpbGwgYmUKICAgICAgICByZXR1cm5lZC4KICAgICAgICAiIiIKICAgICAgICBkaXN0ID0gd29ya2luZ19zZXQuZmluZChyZXEpCiAgICAgICAgaWYgZGlzdCBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIGRpc3QKICAgICAgICBmb3IgZGlzdCBpbiBzZWxmW3JlcS5rZXldOgogICAgICAgICAgICBpZiBkaXN0IGluIHJlcToKICAgICAgICAgICAgICAgIHJldHVybiBkaXN0CiAgICAgICAgIyB0cnkgdG8gZG93bmxvYWQvaW5zdGFsbAogICAgICAgIHJldHVybiBzZWxmLm9idGFpbihyZXEsIGluc3RhbGxlcikKCiAgICBkZWYgb2J0YWluKHNlbGYsIHJlcXVpcmVtZW50LCBpbnN0YWxsZXI9Tm9uZSk6CiAgICAgICAgIiIiT2J0YWluIGEgZGlzdHJpYnV0aW9uIG1hdGNoaW5nIGByZXF1aXJlbWVudGAgKGUuZy4gdmlhIGRvd25sb2FkKQoKICAgICAgICBPYnRhaW4gYSBkaXN0cm8gdGhhdCBtYXRjaGVzIHJlcXVpcmVtZW50IChlLmcuIHZpYSBkb3dubG9hZCkuICBJbiB0aGUKICAgICAgICBiYXNlIGBgRW52aXJvbm1lbnRgYCBjbGFzcywgdGhpcyByb3V0aW5lIGp1c3QgcmV0dXJucwogICAgICAgIGBgaW5zdGFsbGVyKHJlcXVpcmVtZW50KWBgLCB1bmxlc3MgYGluc3RhbGxlcmAgaXMgTm9uZSwgaW4gd2hpY2ggY2FzZQogICAgICAgIE5vbmUgaXMgcmV0dXJuZWQgaW5zdGVhZC4gIFRoaXMgbWV0aG9kIGlzIGEgaG9vayB0aGF0IGFsbG93cyBzdWJjbGFzc2VzCiAgICAgICAgdG8gYXR0ZW1wdCBvdGhlciB3YXlzIG9mIG9idGFpbmluZyBhIGRpc3RyaWJ1dGlvbiBiZWZvcmUgZmFsbGluZyBiYWNrCiAgICAgICAgdG8gdGhlIGBpbnN0YWxsZXJgIGFyZ3VtZW50LiIiIgogICAgICAgIGlmIGluc3RhbGxlciBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIGluc3RhbGxlcihyZXF1aXJlbWVudCkKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgIiIiWWllbGQgdGhlIHVuaXF1ZSBwcm9qZWN0IG5hbWVzIG9mIHRoZSBhdmFpbGFibGUgZGlzdHJpYnV0aW9ucyIiIgogICAgICAgIGZvciBrZXkgaW4gc2VsZi5fZGlzdG1hcC5rZXlzKCk6CiAgICAgICAgICAgIGlmIHNlbGZba2V5XToKICAgICAgICAgICAgICAgIHlpZWxkIGtleQoKICAgIGRlZiBfX2lhZGRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgIiIiSW4tcGxhY2UgYWRkaXRpb24gb2YgYSBkaXN0cmlidXRpb24gb3IgZW52aXJvbm1lbnQiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBEaXN0cmlidXRpb24pOgogICAgICAgICAgICBzZWxmLmFkZChvdGhlcikKICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob3RoZXIsIEVudmlyb25tZW50KToKICAgICAgICAgICAgZm9yIHByb2plY3QgaW4gb3RoZXI6CiAgICAgICAgICAgICAgICBmb3IgZGlzdCBpbiBvdGhlcltwcm9qZWN0XToKICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZChkaXN0KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiQ2FuJ3QgYWRkICVyIHRvIGVudmlyb25tZW50IiAlIChvdGhlciwpKQogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIF9fYWRkX18oc2VsZiwgb3RoZXIpOgogICAgICAgICIiIkFkZCBhbiBlbnZpcm9ubWVudCBvciBkaXN0cmlidXRpb24gdG8gYW4gZW52aXJvbm1lbnQiIiIKICAgICAgICBuZXcgPSBzZWxmLl9fY2xhc3NfXyhbXSwgcGxhdGZvcm09Tm9uZSwgcHl0aG9uPU5vbmUpCiAgICAgICAgZm9yIGVudiBpbiBzZWxmLCBvdGhlcjoKICAgICAgICAgICAgbmV3ICs9IGVudgogICAgICAgIHJldHVybiBuZXcKCgojIFhYWCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CkF2YWlsYWJsZURpc3RyaWJ1dGlvbnMgPSBFbnZpcm9ubWVudAoKCmNsYXNzIEV4dHJhY3Rpb25FcnJvcihSdW50aW1lRXJyb3IpOgogICAgIiIiQW4gZXJyb3Igb2NjdXJyZWQgZXh0cmFjdGluZyBhIHJlc291cmNlCgogICAgVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSBhdmFpbGFibGUgZnJvbSBpbnN0YW5jZXMgb2YgdGhpcyBleGNlcHRpb246CgogICAgbWFuYWdlcgogICAgICAgIFRoZSByZXNvdXJjZSBtYW5hZ2VyIHRoYXQgcmFpc2VkIHRoaXMgZXhjZXB0aW9uCgogICAgY2FjaGVfcGF0aAogICAgICAgIFRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgcmVzb3VyY2UgZXh0cmFjdGlvbgoKICAgIG9yaWdpbmFsX2Vycm9yCiAgICAgICAgVGhlIGV4Y2VwdGlvbiBpbnN0YW5jZSB0aGF0IGNhdXNlZCBleHRyYWN0aW9uIHRvIGZhaWwKICAgICIiIgoKCmNsYXNzIFJlc291cmNlTWFuYWdlcjoKICAgICIiIk1hbmFnZSByZXNvdXJjZSBleHRyYWN0aW9uIGFuZCBwYWNrYWdlcyIiIgogICAgZXh0cmFjdGlvbl9wYXRoID0gTm9uZQoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLmNhY2hlZF9maWxlcyA9IHt9CgogICAgZGVmIHJlc291cmNlX2V4aXN0cyhzZWxmLCBwYWNrYWdlX29yX3JlcXVpcmVtZW50LCByZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJEb2VzIHRoZSBuYW1lZCByZXNvdXJjZSBleGlzdD8iIiIKICAgICAgICByZXR1cm4gZ2V0X3Byb3ZpZGVyKHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQpLmhhc19yZXNvdXJjZShyZXNvdXJjZV9uYW1lKQoKICAgIGRlZiByZXNvdXJjZV9pc2RpcihzZWxmLCBwYWNrYWdlX29yX3JlcXVpcmVtZW50LCByZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJJcyB0aGUgbmFtZWQgcmVzb3VyY2UgYW4gZXhpc3RpbmcgZGlyZWN0b3J5PyIiIgogICAgICAgIHJldHVybiBnZXRfcHJvdmlkZXIocGFja2FnZV9vcl9yZXF1aXJlbWVudCkucmVzb3VyY2VfaXNkaXIoCiAgICAgICAgICAgIHJlc291cmNlX25hbWUKICAgICAgICApCgogICAgZGVmIHJlc291cmNlX2ZpbGVuYW1lKHNlbGYsIHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQsIHJlc291cmNlX25hbWUpOgogICAgICAgICIiIlJldHVybiBhIHRydWUgZmlsZXN5c3RlbSBwYXRoIGZvciBzcGVjaWZpZWQgcmVzb3VyY2UiIiIKICAgICAgICByZXR1cm4gZ2V0X3Byb3ZpZGVyKHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQpLmdldF9yZXNvdXJjZV9maWxlbmFtZSgKICAgICAgICAgICAgc2VsZiwgcmVzb3VyY2VfbmFtZQogICAgICAgICkKCiAgICBkZWYgcmVzb3VyY2Vfc3RyZWFtKHNlbGYsIHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQsIHJlc291cmNlX25hbWUpOgogICAgICAgICIiIlJldHVybiBhIHJlYWRhYmxlIGZpbGUtbGlrZSBvYmplY3QgZm9yIHNwZWNpZmllZCByZXNvdXJjZSIiIgogICAgICAgIHJldHVybiBnZXRfcHJvdmlkZXIocGFja2FnZV9vcl9yZXF1aXJlbWVudCkuZ2V0X3Jlc291cmNlX3N0cmVhbSgKICAgICAgICAgICAgc2VsZiwgcmVzb3VyY2VfbmFtZQogICAgICAgICkKCiAgICBkZWYgcmVzb3VyY2Vfc3RyaW5nKHNlbGYsIHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQsIHJlc291cmNlX25hbWUpOgogICAgICAgICIiIlJldHVybiBzcGVjaWZpZWQgcmVzb3VyY2UgYXMgYSBzdHJpbmciIiIKICAgICAgICByZXR1cm4gZ2V0X3Byb3ZpZGVyKHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQpLmdldF9yZXNvdXJjZV9zdHJpbmcoCiAgICAgICAgICAgIHNlbGYsIHJlc291cmNlX25hbWUKICAgICAgICApCgogICAgZGVmIHJlc291cmNlX2xpc3RkaXIoc2VsZiwgcGFja2FnZV9vcl9yZXF1aXJlbWVudCwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiTGlzdCB0aGUgY29udGVudHMgb2YgdGhlIG5hbWVkIHJlc291cmNlIGRpcmVjdG9yeSIiIgogICAgICAgIHJldHVybiBnZXRfcHJvdmlkZXIocGFja2FnZV9vcl9yZXF1aXJlbWVudCkucmVzb3VyY2VfbGlzdGRpcigKICAgICAgICAgICAgcmVzb3VyY2VfbmFtZQogICAgICAgICkKCiAgICBkZWYgZXh0cmFjdGlvbl9lcnJvcihzZWxmKToKICAgICAgICAiIiJHaXZlIGFuIGVycm9yIG1lc3NhZ2UgZm9yIHByb2JsZW1zIGV4dHJhY3RpbmcgZmlsZShzKSIiIgoKICAgICAgICBvbGRfZXhjID0gc3lzLmV4Y19pbmZvKClbMV0KICAgICAgICBjYWNoZV9wYXRoID0gc2VsZi5leHRyYWN0aW9uX3BhdGggb3IgZ2V0X2RlZmF1bHRfY2FjaGUoKQoKICAgICAgICB0bXBsID0gdGV4dHdyYXAuZGVkZW50KCIiIgogICAgICAgICAgICBDYW4ndCBleHRyYWN0IGZpbGUocykgdG8gZWdnIGNhY2hlCgogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGVycm9yIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byBleHRyYWN0IGZpbGUocykgdG8gdGhlIFB5dGhvbiBlZ2cKICAgICAgICAgICAgY2FjaGU6CgogICAgICAgICAgICAgIHtvbGRfZXhjfQoKICAgICAgICAgICAgVGhlIFB5dGhvbiBlZ2cgY2FjaGUgZGlyZWN0b3J5IGlzIGN1cnJlbnRseSBzZXQgdG86CgogICAgICAgICAgICAgIHtjYWNoZV9wYXRofQoKICAgICAgICAgICAgUGVyaGFwcyB5b3VyIGFjY291bnQgZG9lcyBub3QgaGF2ZSB3cml0ZSBhY2Nlc3MgdG8gdGhpcyBkaXJlY3Rvcnk/ICBZb3UgY2FuCiAgICAgICAgICAgIGNoYW5nZSB0aGUgY2FjaGUgZGlyZWN0b3J5IGJ5IHNldHRpbmcgdGhlIFBZVEhPTl9FR0dfQ0FDSEUgZW52aXJvbm1lbnQKICAgICAgICAgICAgdmFyaWFibGUgdG8gcG9pbnQgdG8gYW4gYWNjZXNzaWJsZSBkaXJlY3RvcnkuCiAgICAgICAgICAgICIiIikubHN0cmlwKCkKICAgICAgICBlcnIgPSBFeHRyYWN0aW9uRXJyb3IodG1wbC5mb3JtYXQoKipsb2NhbHMoKSkpCiAgICAgICAgZXJyLm1hbmFnZXIgPSBzZWxmCiAgICAgICAgZXJyLmNhY2hlX3BhdGggPSBjYWNoZV9wYXRoCiAgICAgICAgZXJyLm9yaWdpbmFsX2Vycm9yID0gb2xkX2V4YwogICAgICAgIHJhaXNlIGVycgoKICAgIGRlZiBnZXRfY2FjaGVfcGF0aChzZWxmLCBhcmNoaXZlX25hbWUsIG5hbWVzPSgpKToKICAgICAgICAiIiJSZXR1cm4gYWJzb2x1dGUgbG9jYXRpb24gaW4gY2FjaGUgZm9yIGBhcmNoaXZlX25hbWVgIGFuZCBgbmFtZXNgCgogICAgICAgIFRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mIHRoZSByZXN1bHRpbmcgcGF0aCB3aWxsIGJlIGNyZWF0ZWQgaWYgaXQgZG9lcwogICAgICAgIG5vdCBhbHJlYWR5IGV4aXN0LiAgYGFyY2hpdmVfbmFtZWAgc2hvdWxkIGJlIHRoZSBiYXNlIGZpbGVuYW1lIG9mIHRoZQogICAgICAgIGVuY2xvc2luZyBlZ2cgKHdoaWNoIG1heSBub3QgYmUgdGhlIG5hbWUgb2YgdGhlIGVuY2xvc2luZyB6aXBmaWxlISksCiAgICAgICAgaW5jbHVkaW5nIGl0cyAiLmVnZyIgZXh0ZW5zaW9uLiAgYG5hbWVzYCwgaWYgcHJvdmlkZWQsIHNob3VsZCBiZSBhCiAgICAgICAgc2VxdWVuY2Ugb2YgcGF0aCBuYW1lIHBhcnRzICJ1bmRlciIgdGhlIGVnZydzIGV4dHJhY3Rpb24gbG9jYXRpb24uCgogICAgICAgIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBieSByZXNvdXJjZSBwcm92aWRlcnMgdGhhdCBuZWVkIHRvCiAgICAgICAgb2J0YWluIGFuIGV4dHJhY3Rpb24gbG9jYXRpb24sIGFuZCBvbmx5IGZvciBuYW1lcyB0aGV5IGludGVuZCB0bwogICAgICAgIGV4dHJhY3QsIGFzIGl0IHRyYWNrcyB0aGUgZ2VuZXJhdGVkIG5hbWVzIGZvciBwb3NzaWJsZSBjbGVhbnVwIGxhdGVyLgogICAgICAgICIiIgogICAgICAgIGV4dHJhY3RfcGF0aCA9IHNlbGYuZXh0cmFjdGlvbl9wYXRoIG9yIGdldF9kZWZhdWx0X2NhY2hlKCkKICAgICAgICB0YXJnZXRfcGF0aCA9IG9zLnBhdGguam9pbihleHRyYWN0X3BhdGgsIGFyY2hpdmVfbmFtZSArICctdG1wJywgKm5hbWVzKQogICAgICAgIHRyeToKICAgICAgICAgICAgX2J5cGFzc19lbnN1cmVfZGlyZWN0b3J5KHRhcmdldF9wYXRoKQogICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgc2VsZi5leHRyYWN0aW9uX2Vycm9yKCkKCiAgICAgICAgc2VsZi5fd2Fybl91bnNhZmVfZXh0cmFjdGlvbl9wYXRoKGV4dHJhY3RfcGF0aCkKCiAgICAgICAgc2VsZi5jYWNoZWRfZmlsZXNbdGFyZ2V0X3BhdGhdID0gMQogICAgICAgIHJldHVybiB0YXJnZXRfcGF0aAoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfd2Fybl91bnNhZmVfZXh0cmFjdGlvbl9wYXRoKHBhdGgpOgogICAgICAgICIiIgogICAgICAgIElmIHRoZSBkZWZhdWx0IGV4dHJhY3Rpb24gcGF0aCBpcyBvdmVycmlkZGVuIGFuZCBzZXQgdG8gYW4gaW5zZWN1cmUKICAgICAgICBsb2NhdGlvbiwgc3VjaCBhcyAvdG1wLCBpdCBvcGVucyB1cCBhbiBvcHBvcnR1bml0eSBmb3IgYW4gYXR0YWNrZXIgdG8KICAgICAgICByZXBsYWNlIGFuIGV4dHJhY3RlZCBmaWxlIHdpdGggYW4gdW5hdXRob3JpemVkIHBheWxvYWQuIFdhcm4gdGhlIHVzZXIKICAgICAgICBpZiBhIGtub3duIGluc2VjdXJlIGxvY2F0aW9uIGlzIHVzZWQuCgogICAgICAgIFNlZSBEaXN0cmlidXRlICMzNzUgZm9yIG1vcmUgZGV0YWlscy4KICAgICAgICAiIiIKICAgICAgICBpZiBvcy5uYW1lID09ICdudCcgYW5kIG5vdCBwYXRoLnN0YXJ0c3dpdGgob3MuZW52aXJvblsnd2luZGlyJ10pOgogICAgICAgICAgICAjIE9uIFdpbmRvd3MsIHBlcm1pc3Npb25zIGFyZSBnZW5lcmFsbHkgcmVzdHJpY3RpdmUgYnkgZGVmYXVsdAogICAgICAgICAgICAjICBhbmQgdGVtcCBkaXJlY3RvcmllcyBhcmUgbm90IHdyaXRhYmxlIGJ5IG90aGVyIHVzZXJzLCBzbwogICAgICAgICAgICAjICBieXBhc3MgdGhlIHdhcm5pbmcuCiAgICAgICAgICAgIHJldHVybgogICAgICAgIG1vZGUgPSBvcy5zdGF0KHBhdGgpLnN0X21vZGUKICAgICAgICBpZiBtb2RlICYgc3RhdC5TX0lXT1RIIG9yIG1vZGUgJiBzdGF0LlNfSVdHUlA6CiAgICAgICAgICAgIG1zZyA9ICgiJXMgaXMgd3JpdGFibGUgYnkgZ3JvdXAvb3RoZXJzIGFuZCB2dWxuZXJhYmxlIHRvIGF0dGFjayAiCiAgICAgICAgICAgICAgICAid2hlbiAiCiAgICAgICAgICAgICAgICAidXNlZCB3aXRoIGdldF9yZXNvdXJjZV9maWxlbmFtZS4gQ29uc2lkZXIgYSBtb3JlIHNlY3VyZSAiCiAgICAgICAgICAgICAgICAibG9jYXRpb24gKHNldCB3aXRoIC5zZXRfZXh0cmFjdGlvbl9wYXRoIG9yIHRoZSAiCiAgICAgICAgICAgICAgICAiUFlUSE9OX0VHR19DQUNIRSBlbnZpcm9ubWVudCB2YXJpYWJsZSkuIiAlIHBhdGgpCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4obXNnLCBVc2VyV2FybmluZykKCiAgICBkZWYgcG9zdHByb2Nlc3Moc2VsZiwgdGVtcG5hbWUsIGZpbGVuYW1lKToKICAgICAgICAiIiJQZXJmb3JtIGFueSBwbGF0Zm9ybS1zcGVjaWZpYyBwb3N0cHJvY2Vzc2luZyBvZiBgdGVtcG5hbWVgCgogICAgICAgIFRoaXMgaXMgd2hlcmUgTWFjIGhlYWRlciByZXdyaXRlcyBzaG91bGQgYmUgZG9uZTsgb3RoZXIgcGxhdGZvcm1zIGRvbid0CiAgICAgICAgaGF2ZSBhbnl0aGluZyBzcGVjaWFsIHRoZXkgc2hvdWxkIGRvLgoKICAgICAgICBSZXNvdXJjZSBwcm92aWRlcnMgc2hvdWxkIGNhbGwgdGhpcyBtZXRob2QgT05MWSBhZnRlciBzdWNjZXNzZnVsbHkKICAgICAgICBleHRyYWN0aW5nIGEgY29tcHJlc3NlZCByZXNvdXJjZS4gIFRoZXkgbXVzdCBOT1QgY2FsbCBpdCBvbiByZXNvdXJjZXMKICAgICAgICB0aGF0IGFyZSBhbHJlYWR5IGluIHRoZSBmaWxlc3lzdGVtLgoKICAgICAgICBgdGVtcG5hbWVgIGlzIHRoZSBjdXJyZW50ICh0ZW1wb3JhcnkpIG5hbWUgb2YgdGhlIGZpbGUsIGFuZCBgZmlsZW5hbWVgCiAgICAgICAgaXMgdGhlIG5hbWUgaXQgd2lsbCBiZSByZW5hbWVkIHRvIGJ5IHRoZSBjYWxsZXIgYWZ0ZXIgdGhpcyByb3V0aW5lCiAgICAgICAgcmV0dXJucy4KICAgICAgICAiIiIKCiAgICAgICAgaWYgb3MubmFtZSA9PSAncG9zaXgnOgogICAgICAgICAgICAjIE1ha2UgdGhlIHJlc291cmNlIGV4ZWN1dGFibGUKICAgICAgICAgICAgbW9kZSA9ICgob3Muc3RhdCh0ZW1wbmFtZSkuc3RfbW9kZSkgfCAwbzU1NSkgJiAwbzc3NzcKICAgICAgICAgICAgb3MuY2htb2QodGVtcG5hbWUsIG1vZGUpCgogICAgZGVmIHNldF9leHRyYWN0aW9uX3BhdGgoc2VsZiwgcGF0aCk6CiAgICAgICAgIiIiU2V0IHRoZSBiYXNlIHBhdGggd2hlcmUgcmVzb3VyY2VzIHdpbGwgYmUgZXh0cmFjdGVkIHRvLCBpZiBuZWVkZWQuCgogICAgICAgIElmIHlvdSBkbyBub3QgY2FsbCB0aGlzIHJvdXRpbmUgYmVmb3JlIGFueSBleHRyYWN0aW9ucyB0YWtlIHBsYWNlLCB0aGUKICAgICAgICBwYXRoIGRlZmF1bHRzIHRvIHRoZSByZXR1cm4gdmFsdWUgb2YgYGBnZXRfZGVmYXVsdF9jYWNoZSgpYGAuICAoV2hpY2gKICAgICAgICBpcyBiYXNlZCBvbiB0aGUgYGBQWVRIT05fRUdHX0NBQ0hFYGAgZW52aXJvbm1lbnQgdmFyaWFibGUsIHdpdGggdmFyaW91cwogICAgICAgIHBsYXRmb3JtLXNwZWNpZmljIGZhbGxiYWNrcy4gIFNlZSB0aGF0IHJvdXRpbmUncyBkb2N1bWVudGF0aW9uIGZvciBtb3JlCiAgICAgICAgZGV0YWlscy4pCgogICAgICAgIFJlc291cmNlcyBhcmUgZXh0cmFjdGVkIHRvIHN1YmRpcmVjdG9yaWVzIG9mIHRoaXMgcGF0aCBiYXNlZCB1cG9uCiAgICAgICAgaW5mb3JtYXRpb24gZ2l2ZW4gYnkgdGhlIGBgSVJlc291cmNlUHJvdmlkZXJgYC4gIFlvdSBtYXkgc2V0IHRoaXMgdG8gYQogICAgICAgIHRlbXBvcmFyeSBkaXJlY3RvcnksIGJ1dCB0aGVuIHlvdSBtdXN0IGNhbGwgYGBjbGVhbnVwX3Jlc291cmNlcygpYGAgdG8KICAgICAgICBkZWxldGUgdGhlIGV4dHJhY3RlZCBmaWxlcyB3aGVuIGRvbmUuICBUaGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdAogICAgICAgIGBgY2xlYW51cF9yZXNvdXJjZXMoKWBgIHdpbGwgYmUgYWJsZSB0byByZW1vdmUgYWxsIGV4dHJhY3RlZCBmaWxlcy4KCiAgICAgICAgKE5vdGU6IHlvdSBtYXkgbm90IGNoYW5nZSB0aGUgZXh0cmFjdGlvbiBwYXRoIGZvciBhIGdpdmVuIHJlc291cmNlCiAgICAgICAgbWFuYWdlciBvbmNlIHJlc291cmNlcyBoYXZlIGJlZW4gZXh0cmFjdGVkLCB1bmxlc3MgeW91IGZpcnN0IGNhbGwKICAgICAgICBgYGNsZWFudXBfcmVzb3VyY2VzKClgYC4pCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5jYWNoZWRfZmlsZXM6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCiAgICAgICAgICAgICAgICAiQ2FuJ3QgY2hhbmdlIGV4dHJhY3Rpb24gcGF0aCwgZmlsZXMgYWxyZWFkeSBleHRyYWN0ZWQiCiAgICAgICAgICAgICkKCiAgICAgICAgc2VsZi5leHRyYWN0aW9uX3BhdGggPSBwYXRoCgogICAgZGVmIGNsZWFudXBfcmVzb3VyY2VzKHNlbGYsIGZvcmNlPUZhbHNlKToKICAgICAgICAiIiIKICAgICAgICBEZWxldGUgYWxsIGV4dHJhY3RlZCByZXNvdXJjZSBmaWxlcyBhbmQgZGlyZWN0b3JpZXMsIHJldHVybmluZyBhIGxpc3QKICAgICAgICBvZiB0aGUgZmlsZSBhbmQgZGlyZWN0b3J5IG5hbWVzIHRoYXQgY291bGQgbm90IGJlIHN1Y2Nlc3NmdWxseSByZW1vdmVkLgogICAgICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaGF2ZSBhbnkgY29uY3VycmVuY3kgcHJvdGVjdGlvbiwgc28gaXQgc2hvdWxkCiAgICAgICAgZ2VuZXJhbGx5IG9ubHkgYmUgY2FsbGVkIHdoZW4gdGhlIGV4dHJhY3Rpb24gcGF0aCBpcyBhIHRlbXBvcmFyeQogICAgICAgIGRpcmVjdG9yeSBleGNsdXNpdmUgdG8gYSBzaW5nbGUgcHJvY2Vzcy4gIFRoaXMgbWV0aG9kIGlzIG5vdAogICAgICAgIGF1dG9tYXRpY2FsbHkgY2FsbGVkOyB5b3UgbXVzdCBjYWxsIGl0IGV4cGxpY2l0bHkgb3IgcmVnaXN0ZXIgaXQgYXMgYW4KICAgICAgICBgYGF0ZXhpdGBgIGZ1bmN0aW9uIGlmIHlvdSB3aXNoIHRvIGVuc3VyZSBjbGVhbnVwIG9mIGEgdGVtcG9yYXJ5CiAgICAgICAgZGlyZWN0b3J5IHVzZWQgZm9yIGV4dHJhY3Rpb25zLgogICAgICAgICIiIgogICAgICAgICMgWFhYCgoKZGVmIGdldF9kZWZhdWx0X2NhY2hlKCk6CiAgICAiIiIKICAgIFJldHVybiB0aGUgYGBQWVRIT05fRUdHX0NBQ0hFYGAgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIG9yIGEgcGxhdGZvcm0tcmVsZXZhbnQgdXNlciBjYWNoZSBkaXIgZm9yIGFuIGFwcAogICAgbmFtZWQgIlB5dGhvbi1FZ2dzIi4KICAgICIiIgogICAgcmV0dXJuICgKICAgICAgICBvcy5lbnZpcm9uLmdldCgnUFlUSE9OX0VHR19DQUNIRScpCiAgICAgICAgb3IgYXBwZGlycy51c2VyX2NhY2hlX2RpcihhcHBuYW1lPSdQeXRob24tRWdncycpCiAgICApCgoKZGVmIHNhZmVfbmFtZShuYW1lKToKICAgICIiIkNvbnZlcnQgYW4gYXJiaXRyYXJ5IHN0cmluZyB0byBhIHN0YW5kYXJkIGRpc3RyaWJ1dGlvbiBuYW1lCgogICAgQW55IHJ1bnMgb2Ygbm9uLWFscGhhbnVtZXJpYy8uIGNoYXJhY3RlcnMgYXJlIHJlcGxhY2VkIHdpdGggYSBzaW5nbGUgJy0nLgogICAgIiIiCiAgICByZXR1cm4gcmUuc3ViKCdbXkEtWmEtejAtOS5dKycsICctJywgbmFtZSkKCgpkZWYgc2FmZV92ZXJzaW9uKHZlcnNpb24pOgogICAgIiIiCiAgICBDb252ZXJ0IGFuIGFyYml0cmFyeSBzdHJpbmcgdG8gYSBzdGFuZGFyZCB2ZXJzaW9uIHN0cmluZwogICAgIiIiCiAgICB0cnk6CiAgICAgICAgIyBub3JtYWxpemUgdGhlIHZlcnNpb24KICAgICAgICByZXR1cm4gc3RyKHBhY2thZ2luZy52ZXJzaW9uLlZlcnNpb24odmVyc2lvbikpCiAgICBleGNlcHQgcGFja2FnaW5nLnZlcnNpb24uSW52YWxpZFZlcnNpb246CiAgICAgICAgdmVyc2lvbiA9IHZlcnNpb24ucmVwbGFjZSgnICcsICcuJykKICAgICAgICByZXR1cm4gcmUuc3ViKCdbXkEtWmEtejAtOS5dKycsICctJywgdmVyc2lvbikKCgpkZWYgc2FmZV9leHRyYShleHRyYSk6CiAgICAiIiJDb252ZXJ0IGFuIGFyYml0cmFyeSBzdHJpbmcgdG8gYSBzdGFuZGFyZCAnZXh0cmEnIG5hbWUKCiAgICBBbnkgcnVucyBvZiBub24tYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYXJlIHJlcGxhY2VkIHdpdGggYSBzaW5nbGUgJ18nLAogICAgYW5kIHRoZSByZXN1bHQgaXMgYWx3YXlzIGxvd2VyY2FzZWQuCiAgICAiIiIKICAgIHJldHVybiByZS5zdWIoJ1teQS1aYS16MC05Li1dKycsICdfJywgZXh0cmEpLmxvd2VyKCkKCgpkZWYgdG9fZmlsZW5hbWUobmFtZSk6CiAgICAiIiJDb252ZXJ0IGEgcHJvamVjdCBvciB2ZXJzaW9uIG5hbWUgdG8gaXRzIGZpbGVuYW1lLWVzY2FwZWQgZm9ybQoKICAgIEFueSAnLScgY2hhcmFjdGVycyBhcmUgY3VycmVudGx5IHJlcGxhY2VkIHdpdGggJ18nLgogICAgIiIiCiAgICByZXR1cm4gbmFtZS5yZXBsYWNlKCctJywgJ18nKQoKCmRlZiBpbnZhbGlkX21hcmtlcih0ZXh0KToKICAgICIiIgogICAgVmFsaWRhdGUgdGV4dCBhcyBhIFBFUCA1MDggZW52aXJvbm1lbnQgbWFya2VyOyByZXR1cm4gYW4gZXhjZXB0aW9uCiAgICBpZiBpbnZhbGlkIG9yIEZhbHNlIG90aGVyd2lzZS4KICAgICIiIgogICAgdHJ5OgogICAgICAgIGV2YWx1YXRlX21hcmtlcih0ZXh0KQogICAgZXhjZXB0IFN5bnRheEVycm9yIGFzIGU6CiAgICAgICAgZS5maWxlbmFtZSA9IE5vbmUKICAgICAgICBlLmxpbmVubyA9IE5vbmUKICAgICAgICByZXR1cm4gZQogICAgcmV0dXJuIEZhbHNlCgoKZGVmIGV2YWx1YXRlX21hcmtlcih0ZXh0LCBleHRyYT1Ob25lKToKICAgICIiIgogICAgRXZhbHVhdGUgYSBQRVAgNTA4IGVudmlyb25tZW50IG1hcmtlci4KICAgIFJldHVybiBhIGJvb2xlYW4gaW5kaWNhdGluZyB0aGUgbWFya2VyIHJlc3VsdCBpbiB0aGlzIGVudmlyb25tZW50LgogICAgUmFpc2UgU3ludGF4RXJyb3IgaWYgbWFya2VyIGlzIGludmFsaWQuCgogICAgVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIHRoZSAncHlwYXJzaW5nJyBtb2R1bGUuCiAgICAiIiIKICAgIHRyeToKICAgICAgICBtYXJrZXIgPSBwYWNrYWdpbmcubWFya2Vycy5NYXJrZXIodGV4dCkKICAgICAgICByZXR1cm4gbWFya2VyLmV2YWx1YXRlKCkKICAgIGV4Y2VwdCBwYWNrYWdpbmcubWFya2Vycy5JbnZhbGlkTWFya2VyIGFzIGU6CiAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IoZSkKCgpjbGFzcyBOdWxsUHJvdmlkZXI6CiAgICAiIiJUcnkgdG8gaW1wbGVtZW50IHJlc291cmNlcyBhbmQgbWV0YWRhdGEgZm9yIGFyYml0cmFyeSBQRVAgMzAyIGxvYWRlcnMiIiIKCiAgICBlZ2dfbmFtZSA9IE5vbmUKICAgIGVnZ19pbmZvID0gTm9uZQogICAgbG9hZGVyID0gTm9uZQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtb2R1bGUpOgogICAgICAgIHNlbGYubG9hZGVyID0gZ2V0YXR0cihtb2R1bGUsICdfX2xvYWRlcl9fJywgTm9uZSkKICAgICAgICBzZWxmLm1vZHVsZV9wYXRoID0gb3MucGF0aC5kaXJuYW1lKGdldGF0dHIobW9kdWxlLCAnX19maWxlX18nLCAnJykpCgogICAgZGVmIGdldF9yZXNvdXJjZV9maWxlbmFtZShzZWxmLCBtYW5hZ2VyLCByZXNvdXJjZV9uYW1lKToKICAgICAgICByZXR1cm4gc2VsZi5fZm4oc2VsZi5tb2R1bGVfcGF0aCwgcmVzb3VyY2VfbmFtZSkKCiAgICBkZWYgZ2V0X3Jlc291cmNlX3N0cmVhbShzZWxmLCBtYW5hZ2VyLCByZXNvdXJjZV9uYW1lKToKICAgICAgICByZXR1cm4gaW8uQnl0ZXNJTyhzZWxmLmdldF9yZXNvdXJjZV9zdHJpbmcobWFuYWdlciwgcmVzb3VyY2VfbmFtZSkpCgogICAgZGVmIGdldF9yZXNvdXJjZV9zdHJpbmcoc2VsZiwgbWFuYWdlciwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuX2dldChzZWxmLl9mbihzZWxmLm1vZHVsZV9wYXRoLCByZXNvdXJjZV9uYW1lKSkKCiAgICBkZWYgaGFzX3Jlc291cmNlKHNlbGYsIHJlc291cmNlX25hbWUpOgogICAgICAgIHJldHVybiBzZWxmLl9oYXMoc2VsZi5fZm4oc2VsZi5tb2R1bGVfcGF0aCwgcmVzb3VyY2VfbmFtZSkpCgogICAgZGVmIGhhc19tZXRhZGF0YShzZWxmLCBuYW1lKToKICAgICAgICByZXR1cm4gc2VsZi5lZ2dfaW5mbyBhbmQgc2VsZi5faGFzKHNlbGYuX2ZuKHNlbGYuZWdnX2luZm8sIG5hbWUpKQoKICAgIGRlZiBnZXRfbWV0YWRhdGEoc2VsZiwgbmFtZSk6CiAgICAgICAgaWYgbm90IHNlbGYuZWdnX2luZm86CiAgICAgICAgICAgIHJldHVybiAiIgogICAgICAgIHZhbHVlID0gc2VsZi5fZ2V0KHNlbGYuX2ZuKHNlbGYuZWdnX2luZm8sIG5hbWUpKQogICAgICAgIHJldHVybiB2YWx1ZS5kZWNvZGUoJ3V0Zi04JykgaWYgc2l4LlBZMyBlbHNlIHZhbHVlCgogICAgZGVmIGdldF9tZXRhZGF0YV9saW5lcyhzZWxmLCBuYW1lKToKICAgICAgICByZXR1cm4geWllbGRfbGluZXMoc2VsZi5nZXRfbWV0YWRhdGEobmFtZSkpCgogICAgZGVmIHJlc291cmNlX2lzZGlyKHNlbGYsIHJlc291cmNlX25hbWUpOgogICAgICAgIHJldHVybiBzZWxmLl9pc2RpcihzZWxmLl9mbihzZWxmLm1vZHVsZV9wYXRoLCByZXNvdXJjZV9uYW1lKSkKCiAgICBkZWYgbWV0YWRhdGFfaXNkaXIoc2VsZiwgbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuZWdnX2luZm8gYW5kIHNlbGYuX2lzZGlyKHNlbGYuX2ZuKHNlbGYuZWdnX2luZm8sIG5hbWUpKQoKICAgIGRlZiByZXNvdXJjZV9saXN0ZGlyKHNlbGYsIHJlc291cmNlX25hbWUpOgogICAgICAgIHJldHVybiBzZWxmLl9saXN0ZGlyKHNlbGYuX2ZuKHNlbGYubW9kdWxlX3BhdGgsIHJlc291cmNlX25hbWUpKQoKICAgIGRlZiBtZXRhZGF0YV9saXN0ZGlyKHNlbGYsIG5hbWUpOgogICAgICAgIGlmIHNlbGYuZWdnX2luZm86CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9saXN0ZGlyKHNlbGYuX2ZuKHNlbGYuZWdnX2luZm8sIG5hbWUpKQogICAgICAgIHJldHVybiBbXQoKICAgIGRlZiBydW5fc2NyaXB0KHNlbGYsIHNjcmlwdF9uYW1lLCBuYW1lc3BhY2UpOgogICAgICAgIHNjcmlwdCA9ICdzY3JpcHRzLycgKyBzY3JpcHRfbmFtZQogICAgICAgIGlmIG5vdCBzZWxmLmhhc19tZXRhZGF0YShzY3JpcHQpOgogICAgICAgICAgICByYWlzZSBSZXNvbHV0aW9uRXJyb3IoIk5vIHNjcmlwdCBuYW1lZCAlciIgJSBzY3JpcHRfbmFtZSkKICAgICAgICBzY3JpcHRfdGV4dCA9IHNlbGYuZ2V0X21ldGFkYXRhKHNjcmlwdCkucmVwbGFjZSgnXHJcbicsICdcbicpCiAgICAgICAgc2NyaXB0X3RleHQgPSBzY3JpcHRfdGV4dC5yZXBsYWNlKCdccicsICdcbicpCiAgICAgICAgc2NyaXB0X2ZpbGVuYW1lID0gc2VsZi5fZm4oc2VsZi5lZ2dfaW5mbywgc2NyaXB0KQogICAgICAgIG5hbWVzcGFjZVsnX19maWxlX18nXSA9IHNjcmlwdF9maWxlbmFtZQogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNjcmlwdF9maWxlbmFtZSk6CiAgICAgICAgICAgIHNvdXJjZSA9IG9wZW4oc2NyaXB0X2ZpbGVuYW1lKS5yZWFkKCkKICAgICAgICAgICAgY29kZSA9IGNvbXBpbGUoc291cmNlLCBzY3JpcHRfZmlsZW5hbWUsICdleGVjJykKICAgICAgICAgICAgZXhlYyhjb2RlLCBuYW1lc3BhY2UsIG5hbWVzcGFjZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBmcm9tIGxpbmVjYWNoZSBpbXBvcnQgY2FjaGUKICAgICAgICAgICAgY2FjaGVbc2NyaXB0X2ZpbGVuYW1lXSA9ICgKICAgICAgICAgICAgICAgIGxlbihzY3JpcHRfdGV4dCksIDAsIHNjcmlwdF90ZXh0LnNwbGl0KCdcbicpLCBzY3JpcHRfZmlsZW5hbWUKICAgICAgICAgICAgKQogICAgICAgICAgICBzY3JpcHRfY29kZSA9IGNvbXBpbGUoc2NyaXB0X3RleHQsIHNjcmlwdF9maWxlbmFtZSwgJ2V4ZWMnKQogICAgICAgICAgICBleGVjKHNjcmlwdF9jb2RlLCBuYW1lc3BhY2UsIG5hbWVzcGFjZSkKCiAgICBkZWYgX2hhcyhzZWxmLCBwYXRoKToKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKAogICAgICAgICAgICAiQ2FuJ3QgcGVyZm9ybSB0aGlzIG9wZXJhdGlvbiBmb3IgdW5yZWdpc3RlcmVkIGxvYWRlciB0eXBlIgogICAgICAgICkKCiAgICBkZWYgX2lzZGlyKHNlbGYsIHBhdGgpOgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCiAgICAgICAgICAgICJDYW4ndCBwZXJmb3JtIHRoaXMgb3BlcmF0aW9uIGZvciB1bnJlZ2lzdGVyZWQgbG9hZGVyIHR5cGUiCiAgICAgICAgKQoKICAgIGRlZiBfbGlzdGRpcihzZWxmLCBwYXRoKToKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKAogICAgICAgICAgICAiQ2FuJ3QgcGVyZm9ybSB0aGlzIG9wZXJhdGlvbiBmb3IgdW5yZWdpc3RlcmVkIGxvYWRlciB0eXBlIgogICAgICAgICkKCiAgICBkZWYgX2ZuKHNlbGYsIGJhc2UsIHJlc291cmNlX25hbWUpOgogICAgICAgIGlmIHJlc291cmNlX25hbWU6CiAgICAgICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oYmFzZSwgKnJlc291cmNlX25hbWUuc3BsaXQoJy8nKSkKICAgICAgICByZXR1cm4gYmFzZQoKICAgIGRlZiBfZ2V0KHNlbGYsIHBhdGgpOgogICAgICAgIGlmIGhhc2F0dHIoc2VsZi5sb2FkZXIsICdnZXRfZGF0YScpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5sb2FkZXIuZ2V0X2RhdGEocGF0aCkKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKAogICAgICAgICAgICAiQ2FuJ3QgcGVyZm9ybSB0aGlzIG9wZXJhdGlvbiBmb3IgbG9hZGVycyB3aXRob3V0ICdnZXRfZGF0YSgpJyIKICAgICAgICApCgoKcmVnaXN0ZXJfbG9hZGVyX3R5cGUob2JqZWN0LCBOdWxsUHJvdmlkZXIpCgoKY2xhc3MgRWdnUHJvdmlkZXIoTnVsbFByb3ZpZGVyKToKICAgICIiIlByb3ZpZGVyIGJhc2VkIG9uIGEgdmlydHVhbCBmaWxlc3lzdGVtIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1vZHVsZSk6CiAgICAgICAgTnVsbFByb3ZpZGVyLl9faW5pdF9fKHNlbGYsIG1vZHVsZSkKICAgICAgICBzZWxmLl9zZXR1cF9wcmVmaXgoKQoKICAgIGRlZiBfc2V0dXBfcHJlZml4KHNlbGYpOgogICAgICAgICMgd2UgYXNzdW1lIGhlcmUgdGhhdCBvdXIgbWV0YWRhdGEgbWF5IGJlIG5lc3RlZCBpbnNpZGUgYSAiYmFza2V0IgogICAgICAgICMgb2YgbXVsdGlwbGUgZWdnczsgdGhhdCdzIHdoeSB3ZSB1c2UgbW9kdWxlX3BhdGggaW5zdGVhZCBvZiAuYXJjaGl2ZQogICAgICAgIHBhdGggPSBzZWxmLm1vZHVsZV9wYXRoCiAgICAgICAgb2xkID0gTm9uZQogICAgICAgIHdoaWxlIHBhdGggIT0gb2xkOgogICAgICAgICAgICBpZiBfaXNfdW5wYWNrZWRfZWdnKHBhdGgpOgogICAgICAgICAgICAgICAgc2VsZi5lZ2dfbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUocGF0aCkKICAgICAgICAgICAgICAgIHNlbGYuZWdnX2luZm8gPSBvcy5wYXRoLmpvaW4ocGF0aCwgJ0VHRy1JTkZPJykKICAgICAgICAgICAgICAgIHNlbGYuZWdnX3Jvb3QgPSBwYXRoCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBvbGQgPSBwYXRoCiAgICAgICAgICAgIHBhdGgsIGJhc2UgPSBvcy5wYXRoLnNwbGl0KHBhdGgpCgoKY2xhc3MgRGVmYXVsdFByb3ZpZGVyKEVnZ1Byb3ZpZGVyKToKICAgICIiIlByb3ZpZGVzIGFjY2VzcyB0byBwYWNrYWdlIHJlc291cmNlcyBpbiB0aGUgZmlsZXN5c3RlbSIiIgoKICAgIGRlZiBfaGFzKHNlbGYsIHBhdGgpOgogICAgICAgIHJldHVybiBvcy5wYXRoLmV4aXN0cyhwYXRoKQoKICAgIGRlZiBfaXNkaXIoc2VsZiwgcGF0aCk6CiAgICAgICAgcmV0dXJuIG9zLnBhdGguaXNkaXIocGF0aCkKCiAgICBkZWYgX2xpc3RkaXIoc2VsZiwgcGF0aCk6CiAgICAgICAgcmV0dXJuIG9zLmxpc3RkaXIocGF0aCkKCiAgICBkZWYgZ2V0X3Jlc291cmNlX3N0cmVhbShzZWxmLCBtYW5hZ2VyLCByZXNvdXJjZV9uYW1lKToKICAgICAgICByZXR1cm4gb3BlbihzZWxmLl9mbihzZWxmLm1vZHVsZV9wYXRoLCByZXNvdXJjZV9uYW1lKSwgJ3JiJykKCiAgICBkZWYgX2dldChzZWxmLCBwYXRoKToKICAgICAgICB3aXRoIG9wZW4ocGF0aCwgJ3JiJykgYXMgc3RyZWFtOgogICAgICAgICAgICByZXR1cm4gc3RyZWFtLnJlYWQoKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9yZWdpc3RlcihjbHMpOgogICAgICAgIGxvYWRlcl9jbHMgPSBnZXRhdHRyKGltcG9ydGxpYl9tYWNoaW5lcnksICdTb3VyY2VGaWxlTG9hZGVyJywKICAgICAgICAgICAgdHlwZShOb25lKSkKICAgICAgICByZWdpc3Rlcl9sb2FkZXJfdHlwZShsb2FkZXJfY2xzLCBjbHMpCgoKRGVmYXVsdFByb3ZpZGVyLl9yZWdpc3RlcigpCgoKY2xhc3MgRW1wdHlQcm92aWRlcihOdWxsUHJvdmlkZXIpOgogICAgIiIiUHJvdmlkZXIgdGhhdCByZXR1cm5zIG5vdGhpbmcgZm9yIGFsbCByZXF1ZXN0cyIiIgoKICAgIF9pc2RpciA9IF9oYXMgPSBsYW1iZGEgc2VsZiwgcGF0aDogRmFsc2UKICAgIF9nZXQgPSBsYW1iZGEgc2VsZiwgcGF0aDogJycKICAgIF9saXN0ZGlyID0gbGFtYmRhIHNlbGYsIHBhdGg6IFtdCiAgICBtb2R1bGVfcGF0aCA9IE5vbmUKCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgcGFzcwoKCmVtcHR5X3Byb3ZpZGVyID0gRW1wdHlQcm92aWRlcigpCgoKY2xhc3MgWmlwTWFuaWZlc3RzKGRpY3QpOgogICAgIiIiCiAgICB6aXAgbWFuaWZlc3QgYnVpbGRlcgogICAgIiIiCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgYnVpbGQoY2xzLCBwYXRoKToKICAgICAgICAiIiIKICAgICAgICBCdWlsZCBhIGRpY3Rpb25hcnkgc2ltaWxhciB0byB0aGUgemlwaW1wb3J0IGRpcmVjdG9yeQogICAgICAgIGNhY2hlcywgZXhjZXB0IGluc3RlYWQgb2YgdHVwbGVzLCBzdG9yZSBaaXBJbmZvIG9iamVjdHMuCgogICAgICAgIFVzZSBhIHBsYXRmb3JtLXNwZWNpZmljIHBhdGggc2VwYXJhdG9yIChvcy5zZXApIGZvciB0aGUgcGF0aCBrZXlzCiAgICAgICAgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBweXB5IG9uIFdpbmRvd3MuCiAgICAgICAgIiIiCiAgICAgICAgd2l0aCBDb250ZXh0dWFsWmlwRmlsZShwYXRoKSBhcyB6ZmlsZToKICAgICAgICAgICAgaXRlbXMgPSAoCiAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgbmFtZS5yZXBsYWNlKCcvJywgb3Muc2VwKSwKICAgICAgICAgICAgICAgICAgICB6ZmlsZS5nZXRpbmZvKG5hbWUpLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4gemZpbGUubmFtZWxpc3QoKQogICAgICAgICAgICApCiAgICAgICAgICAgIHJldHVybiBkaWN0KGl0ZW1zKQoKICAgIGxvYWQgPSBidWlsZAoKCmNsYXNzIE1lbW9pemVkWmlwTWFuaWZlc3RzKFppcE1hbmlmZXN0cyk6CiAgICAiIiIKICAgIE1lbW9pemVkIHppcGZpbGUgbWFuaWZlc3RzLgogICAgIiIiCiAgICBtYW5pZmVzdF9tb2QgPSBjb2xsZWN0aW9ucy5uYW1lZHR1cGxlKCdtYW5pZmVzdF9tb2QnLCAnbWFuaWZlc3QgbXRpbWUnKQoKICAgIGRlZiBsb2FkKHNlbGYsIHBhdGgpOgogICAgICAgICIiIgogICAgICAgIExvYWQgYSBtYW5pZmVzdCBhdCBwYXRoIG9yIHJldHVybiBhIHN1aXRhYmxlIG1hbmlmZXN0IGFscmVhZHkgbG9hZGVkLgogICAgICAgICIiIgogICAgICAgIHBhdGggPSBvcy5wYXRoLm5vcm1wYXRoKHBhdGgpCiAgICAgICAgbXRpbWUgPSBvcy5zdGF0KHBhdGgpLnN0X210aW1lCgogICAgICAgIGlmIHBhdGggbm90IGluIHNlbGYgb3Igc2VsZltwYXRoXS5tdGltZSAhPSBtdGltZToKICAgICAgICAgICAgbWFuaWZlc3QgPSBzZWxmLmJ1aWxkKHBhdGgpCiAgICAgICAgICAgIHNlbGZbcGF0aF0gPSBzZWxmLm1hbmlmZXN0X21vZChtYW5pZmVzdCwgbXRpbWUpCgogICAgICAgIHJldHVybiBzZWxmW3BhdGhdLm1hbmlmZXN0CgoKY2xhc3MgQ29udGV4dHVhbFppcEZpbGUoemlwZmlsZS5aaXBGaWxlKToKICAgICIiIgogICAgU3VwcGxlbWVudCBaaXBGaWxlIGNsYXNzIHRvIHN1cHBvcnQgY29udGV4dCBtYW5hZ2VyIGZvciBQeXRob24gMi42CiAgICAiIiIKCiAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIF9fZXhpdF9fKHNlbGYsIHR5cGUsIHZhbHVlLCB0cmFjZWJhY2spOgogICAgICAgIHNlbGYuY2xvc2UoKQoKICAgIGRlZiBfX25ld19fKGNscywgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAiIiIKICAgICAgICBDb25zdHJ1Y3QgYSBaaXBGaWxlIG9yIENvbnRleHR1YWxaaXBGaWxlIGFzIGFwcHJvcHJpYXRlCiAgICAgICAgIiIiCiAgICAgICAgaWYgaGFzYXR0cih6aXBmaWxlLlppcEZpbGUsICdfX2V4aXRfXycpOgogICAgICAgICAgICByZXR1cm4gemlwZmlsZS5aaXBGaWxlKCphcmdzLCAqKmt3YXJncykKICAgICAgICByZXR1cm4gc3VwZXIoQ29udGV4dHVhbFppcEZpbGUsIGNscykuX19uZXdfXyhjbHMpCgoKY2xhc3MgWmlwUHJvdmlkZXIoRWdnUHJvdmlkZXIpOgogICAgIiIiUmVzb3VyY2Ugc3VwcG9ydCBmb3IgemlwcyBhbmQgZWdncyIiIgoKICAgIGVhZ2VycyA9IE5vbmUKICAgIF96aXBfbWFuaWZlc3RzID0gTWVtb2l6ZWRaaXBNYW5pZmVzdHMoKQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtb2R1bGUpOgogICAgICAgIEVnZ1Byb3ZpZGVyLl9faW5pdF9fKHNlbGYsIG1vZHVsZSkKICAgICAgICBzZWxmLnppcF9wcmUgPSBzZWxmLmxvYWRlci5hcmNoaXZlICsgb3Muc2VwCgogICAgZGVmIF96aXBpbmZvX25hbWUoc2VsZiwgZnNwYXRoKToKICAgICAgICAjIENvbnZlcnQgYSB2aXJ0dWFsIGZpbGVuYW1lIChmdWxsIHBhdGggdG8gZmlsZSkgaW50byBhIHppcGZpbGUgc3VicGF0aAogICAgICAgICMgdXNhYmxlIHdpdGggdGhlIHppcGltcG9ydCBkaXJlY3RvcnkgY2FjaGUgZm9yIG91ciB0YXJnZXQgYXJjaGl2ZQogICAgICAgIGlmIGZzcGF0aC5zdGFydHN3aXRoKHNlbGYuemlwX3ByZSk6CiAgICAgICAgICAgIHJldHVybiBmc3BhdGhbbGVuKHNlbGYuemlwX3ByZSk6XQogICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKAogICAgICAgICAgICAiJXMgaXMgbm90IGEgc3VicGF0aCBvZiAlcyIgJSAoZnNwYXRoLCBzZWxmLnppcF9wcmUpCiAgICAgICAgKQoKICAgIGRlZiBfcGFydHMoc2VsZiwgemlwX3BhdGgpOgogICAgICAgICMgQ29udmVydCBhIHppcGZpbGUgc3VicGF0aCBpbnRvIGFuIGVnZy1yZWxhdGl2ZSBwYXRoIHBhcnQgbGlzdC4KICAgICAgICAjIHBzZXVkby1mcyBwYXRoCiAgICAgICAgZnNwYXRoID0gc2VsZi56aXBfcHJlICsgemlwX3BhdGgKICAgICAgICBpZiBmc3BhdGguc3RhcnRzd2l0aChzZWxmLmVnZ19yb290ICsgb3Muc2VwKToKICAgICAgICAgICAgcmV0dXJuIGZzcGF0aFtsZW4oc2VsZi5lZ2dfcm9vdCkgKyAxOl0uc3BsaXQob3Muc2VwKQogICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKAogICAgICAgICAgICAiJXMgaXMgbm90IGEgc3VicGF0aCBvZiAlcyIgJSAoZnNwYXRoLCBzZWxmLmVnZ19yb290KQogICAgICAgICkKCiAgICBAcHJvcGVydHkKICAgIGRlZiB6aXBpbmZvKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl96aXBfbWFuaWZlc3RzLmxvYWQoc2VsZi5sb2FkZXIuYXJjaGl2ZSkKCiAgICBkZWYgZ2V0X3Jlc291cmNlX2ZpbGVuYW1lKHNlbGYsIG1hbmFnZXIsIHJlc291cmNlX25hbWUpOgogICAgICAgIGlmIG5vdCBzZWxmLmVnZ19uYW1lOgogICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKAogICAgICAgICAgICAgICAgInJlc291cmNlX2ZpbGVuYW1lKCkgb25seSBzdXBwb3J0ZWQgZm9yIC5lZ2csIG5vdCAuemlwIgogICAgICAgICAgICApCiAgICAgICAgIyBubyBuZWVkIHRvIGxvY2sgZm9yIGV4dHJhY3Rpb24sIHNpbmNlIHdlIHVzZSB0ZW1wIG5hbWVzCiAgICAgICAgemlwX3BhdGggPSBzZWxmLl9yZXNvdXJjZV90b196aXAocmVzb3VyY2VfbmFtZSkKICAgICAgICBlYWdlcnMgPSBzZWxmLl9nZXRfZWFnZXJfcmVzb3VyY2VzKCkKICAgICAgICBpZiAnLycuam9pbihzZWxmLl9wYXJ0cyh6aXBfcGF0aCkpIGluIGVhZ2VyczoKICAgICAgICAgICAgZm9yIG5hbWUgaW4gZWFnZXJzOgogICAgICAgICAgICAgICAgc2VsZi5fZXh0cmFjdF9yZXNvdXJjZShtYW5hZ2VyLCBzZWxmLl9lYWdlcl90b196aXAobmFtZSkpCiAgICAgICAgcmV0dXJuIHNlbGYuX2V4dHJhY3RfcmVzb3VyY2UobWFuYWdlciwgemlwX3BhdGgpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9nZXRfZGF0ZV9hbmRfc2l6ZSh6aXBfc3RhdCk6CiAgICAgICAgc2l6ZSA9IHppcF9zdGF0LmZpbGVfc2l6ZQogICAgICAgICMgeW1kaG1zK3dkYXksIHlkYXksIGRzdAogICAgICAgIGRhdGVfdGltZSA9IHppcF9zdGF0LmRhdGVfdGltZSArICgwLCAwLCAtMSkKICAgICAgICAjIDE5ODAgb2Zmc2V0IGFscmVhZHkgZG9uZQogICAgICAgIHRpbWVzdGFtcCA9IHRpbWUubWt0aW1lKGRhdGVfdGltZSkKICAgICAgICByZXR1cm4gdGltZXN0YW1wLCBzaXplCgogICAgZGVmIF9leHRyYWN0X3Jlc291cmNlKHNlbGYsIG1hbmFnZXIsIHppcF9wYXRoKToKCiAgICAgICAgaWYgemlwX3BhdGggaW4gc2VsZi5faW5kZXgoKToKICAgICAgICAgICAgZm9yIG5hbWUgaW4gc2VsZi5faW5kZXgoKVt6aXBfcGF0aF06CiAgICAgICAgICAgICAgICBsYXN0ID0gc2VsZi5fZXh0cmFjdF9yZXNvdXJjZSgKICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyLCBvcy5wYXRoLmpvaW4oemlwX3BhdGgsIG5hbWUpCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICMgcmV0dXJuIHRoZSBleHRyYWN0ZWQgZGlyZWN0b3J5IG5hbWUKICAgICAgICAgICAgcmV0dXJuIG9zLnBhdGguZGlybmFtZShsYXN0KQoKICAgICAgICB0aW1lc3RhbXAsIHNpemUgPSBzZWxmLl9nZXRfZGF0ZV9hbmRfc2l6ZShzZWxmLnppcGluZm9bemlwX3BhdGhdKQoKICAgICAgICBpZiBub3QgV1JJVEVfU1VQUE9SVDoKICAgICAgICAgICAgcmFpc2UgSU9FcnJvcignIm9zLnJlbmFtZSIgYW5kICJvcy51bmxpbmsiIGFyZSBub3Qgc3VwcG9ydGVkICcKICAgICAgICAgICAgICAgICAgICAgICAgICAnb24gdGhpcyBwbGF0Zm9ybScpCiAgICAgICAgdHJ5OgoKICAgICAgICAgICAgcmVhbF9wYXRoID0gbWFuYWdlci5nZXRfY2FjaGVfcGF0aCgKICAgICAgICAgICAgICAgIHNlbGYuZWdnX25hbWUsIHNlbGYuX3BhcnRzKHppcF9wYXRoKQogICAgICAgICAgICApCgogICAgICAgICAgICBpZiBzZWxmLl9pc19jdXJyZW50KHJlYWxfcGF0aCwgemlwX3BhdGgpOgogICAgICAgICAgICAgICAgcmV0dXJuIHJlYWxfcGF0aAoKICAgICAgICAgICAgb3V0ZiwgdG1wbmFtID0gX21rc3RlbXAoIi4kZXh0cmFjdCIsIGRpcj1vcy5wYXRoLmRpcm5hbWUocmVhbF9wYXRoKSkKICAgICAgICAgICAgb3Mud3JpdGUob3V0Ziwgc2VsZi5sb2FkZXIuZ2V0X2RhdGEoemlwX3BhdGgpKQogICAgICAgICAgICBvcy5jbG9zZShvdXRmKQogICAgICAgICAgICB1dGltZSh0bXBuYW0sICh0aW1lc3RhbXAsIHRpbWVzdGFtcCkpCiAgICAgICAgICAgIG1hbmFnZXIucG9zdHByb2Nlc3ModG1wbmFtLCByZWFsX3BhdGgpCgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZW5hbWUodG1wbmFtLCByZWFsX3BhdGgpCgogICAgICAgICAgICBleGNlcHQgb3MuZXJyb3I6CiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShyZWFsX3BhdGgpOgogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuX2lzX2N1cnJlbnQocmVhbF9wYXRoLCB6aXBfcGF0aCk6CiAgICAgICAgICAgICAgICAgICAgICAgICMgdGhlIGZpbGUgYmVjYW1lIGN1cnJlbnQgc2luY2UgaXQgd2FzIGNoZWNrZWQgYWJvdmUsCiAgICAgICAgICAgICAgICAgICAgICAgICMgIHNvIHByb2NlZWQuCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFsX3BhdGgKICAgICAgICAgICAgICAgICAgICAjIFdpbmRvd3MsIGRlbCBvbGQgZmlsZSBhbmQgcmV0cnkKICAgICAgICAgICAgICAgICAgICBlbGlmIG9zLm5hbWUgPT0gJ250JzoKICAgICAgICAgICAgICAgICAgICAgICAgdW5saW5rKHJlYWxfcGF0aCkKICAgICAgICAgICAgICAgICAgICAgICAgcmVuYW1lKHRtcG5hbSwgcmVhbF9wYXRoKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVhbF9wYXRoCiAgICAgICAgICAgICAgICByYWlzZQoKICAgICAgICBleGNlcHQgb3MuZXJyb3I6CiAgICAgICAgICAgICMgcmVwb3J0IGEgdXNlci1mcmllbmRseSBlcnJvcgogICAgICAgICAgICBtYW5hZ2VyLmV4dHJhY3Rpb25fZXJyb3IoKQoKICAgICAgICByZXR1cm4gcmVhbF9wYXRoCgogICAgZGVmIF9pc19jdXJyZW50KHNlbGYsIGZpbGVfcGF0aCwgemlwX3BhdGgpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBUcnVlIGlmIHRoZSBmaWxlX3BhdGggaXMgY3VycmVudCBmb3IgdGhpcyB6aXBfcGF0aAogICAgICAgICIiIgogICAgICAgIHRpbWVzdGFtcCwgc2l6ZSA9IHNlbGYuX2dldF9kYXRlX2FuZF9zaXplKHNlbGYuemlwaW5mb1t6aXBfcGF0aF0pCiAgICAgICAgaWYgbm90IG9zLnBhdGguaXNmaWxlKGZpbGVfcGF0aCk6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIHN0YXQgPSBvcy5zdGF0KGZpbGVfcGF0aCkKICAgICAgICBpZiBzdGF0LnN0X3NpemUgIT0gc2l6ZSBvciBzdGF0LnN0X210aW1lICE9IHRpbWVzdGFtcDoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgIyBjaGVjayB0aGF0IHRoZSBjb250ZW50cyBtYXRjaAogICAgICAgIHppcF9jb250ZW50cyA9IHNlbGYubG9hZGVyLmdldF9kYXRhKHppcF9wYXRoKQogICAgICAgIHdpdGggb3BlbihmaWxlX3BhdGgsICdyYicpIGFzIGY6CiAgICAgICAgICAgIGZpbGVfY29udGVudHMgPSBmLnJlYWQoKQogICAgICAgIHJldHVybiB6aXBfY29udGVudHMgPT0gZmlsZV9jb250ZW50cwoKICAgIGRlZiBfZ2V0X2VhZ2VyX3Jlc291cmNlcyhzZWxmKToKICAgICAgICBpZiBzZWxmLmVhZ2VycyBpcyBOb25lOgogICAgICAgICAgICBlYWdlcnMgPSBbXQogICAgICAgICAgICBmb3IgbmFtZSBpbiAoJ25hdGl2ZV9saWJzLnR4dCcsICdlYWdlcl9yZXNvdXJjZXMudHh0Jyk6CiAgICAgICAgICAgICAgICBpZiBzZWxmLmhhc19tZXRhZGF0YShuYW1lKToKICAgICAgICAgICAgICAgICAgICBlYWdlcnMuZXh0ZW5kKHNlbGYuZ2V0X21ldGFkYXRhX2xpbmVzKG5hbWUpKQogICAgICAgICAgICBzZWxmLmVhZ2VycyA9IGVhZ2VycwogICAgICAgIHJldHVybiBzZWxmLmVhZ2VycwoKICAgIGRlZiBfaW5kZXgoc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5fZGlyaW5kZXgKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIGluZCA9IHt9CiAgICAgICAgICAgIGZvciBwYXRoIGluIHNlbGYuemlwaW5mbzoKICAgICAgICAgICAgICAgIHBhcnRzID0gcGF0aC5zcGxpdChvcy5zZXApCiAgICAgICAgICAgICAgICB3aGlsZSBwYXJ0czoKICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBvcy5zZXAuam9pbihwYXJ0c1s6LTFdKQogICAgICAgICAgICAgICAgICAgIGlmIHBhcmVudCBpbiBpbmQ6CiAgICAgICAgICAgICAgICAgICAgICAgIGluZFtwYXJlbnRdLmFwcGVuZChwYXJ0c1stMV0pCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgaW5kW3BhcmVudF0gPSBbcGFydHMucG9wKCldCiAgICAgICAgICAgIHNlbGYuX2RpcmluZGV4ID0gaW5kCiAgICAgICAgICAgIHJldHVybiBpbmQKCiAgICBkZWYgX2hhcyhzZWxmLCBmc3BhdGgpOgogICAgICAgIHppcF9wYXRoID0gc2VsZi5femlwaW5mb19uYW1lKGZzcGF0aCkKICAgICAgICByZXR1cm4gemlwX3BhdGggaW4gc2VsZi56aXBpbmZvIG9yIHppcF9wYXRoIGluIHNlbGYuX2luZGV4KCkKCiAgICBkZWYgX2lzZGlyKHNlbGYsIGZzcGF0aCk6CiAgICAgICAgcmV0dXJuIHNlbGYuX3ppcGluZm9fbmFtZShmc3BhdGgpIGluIHNlbGYuX2luZGV4KCkKCiAgICBkZWYgX2xpc3RkaXIoc2VsZiwgZnNwYXRoKToKICAgICAgICByZXR1cm4gbGlzdChzZWxmLl9pbmRleCgpLmdldChzZWxmLl96aXBpbmZvX25hbWUoZnNwYXRoKSwgKCkpKQoKICAgIGRlZiBfZWFnZXJfdG9femlwKHNlbGYsIHJlc291cmNlX25hbWUpOgogICAgICAgIHJldHVybiBzZWxmLl96aXBpbmZvX25hbWUoc2VsZi5fZm4oc2VsZi5lZ2dfcm9vdCwgcmVzb3VyY2VfbmFtZSkpCgogICAgZGVmIF9yZXNvdXJjZV90b196aXAoc2VsZiwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuX3ppcGluZm9fbmFtZShzZWxmLl9mbihzZWxmLm1vZHVsZV9wYXRoLCByZXNvdXJjZV9uYW1lKSkKCgpyZWdpc3Rlcl9sb2FkZXJfdHlwZSh6aXBpbXBvcnQuemlwaW1wb3J0ZXIsIFppcFByb3ZpZGVyKQoKCmNsYXNzIEZpbGVNZXRhZGF0YShFbXB0eVByb3ZpZGVyKToKICAgICIiIk1ldGFkYXRhIGhhbmRsZXIgZm9yIHN0YW5kYWxvbmUgUEtHLUlORk8gZmlsZXMKCiAgICBVc2FnZTo6CgogICAgICAgIG1ldGFkYXRhID0gRmlsZU1ldGFkYXRhKCIvcGF0aC90by9QS0ctSU5GTyIpCgogICAgVGhpcyBwcm92aWRlciByZWplY3RzIGFsbCBkYXRhIGFuZCBtZXRhZGF0YSByZXF1ZXN0cyBleGNlcHQgZm9yIFBLRy1JTkZPLAogICAgd2hpY2ggaXMgdHJlYXRlZCBhcyBleGlzdGluZywgYW5kIHdpbGwgYmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIGF0CiAgICB0aGUgcHJvdmlkZWQgbG9jYXRpb24uCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCk6CiAgICAgICAgc2VsZi5wYXRoID0gcGF0aAoKICAgIGRlZiBoYXNfbWV0YWRhdGEoc2VsZiwgbmFtZSk6CiAgICAgICAgcmV0dXJuIG5hbWUgPT0gJ1BLRy1JTkZPJyBhbmQgb3MucGF0aC5pc2ZpbGUoc2VsZi5wYXRoKQoKICAgIGRlZiBnZXRfbWV0YWRhdGEoc2VsZiwgbmFtZSk6CiAgICAgICAgaWYgbmFtZSAhPSAnUEtHLUlORk8nOgogICAgICAgICAgICByYWlzZSBLZXlFcnJvcigiTm8gbWV0YWRhdGEgZXhjZXB0IFBLRy1JTkZPIGlzIGF2YWlsYWJsZSIpCgogICAgICAgIHdpdGggaW8ub3BlbihzZWxmLnBhdGgsIGVuY29kaW5nPSd1dGYtOCcsIGVycm9ycz0icmVwbGFjZSIpIGFzIGY6CiAgICAgICAgICAgIG1ldGFkYXRhID0gZi5yZWFkKCkKICAgICAgICBzZWxmLl93YXJuX29uX3JlcGxhY2VtZW50KG1ldGFkYXRhKQogICAgICAgIHJldHVybiBtZXRhZGF0YQoKICAgIGRlZiBfd2Fybl9vbl9yZXBsYWNlbWVudChzZWxmLCBtZXRhZGF0YSk6CiAgICAgICAgIyBQeXRob24gMi42IGFuZCAzLjIgY29tcGF0IGZvcjogcmVwbGFjZW1lbnRfY2hhciA9ICfvv70nCiAgICAgICAgcmVwbGFjZW1lbnRfY2hhciA9IGInXHhlZlx4YmZceGJkJy5kZWNvZGUoJ3V0Zi04JykKICAgICAgICBpZiByZXBsYWNlbWVudF9jaGFyIGluIG1ldGFkYXRhOgogICAgICAgICAgICB0bXBsID0gIntzZWxmLnBhdGh9IGNvdWxkIG5vdCBiZSBwcm9wZXJseSBkZWNvZGVkIGluIFVURi04IgogICAgICAgICAgICBtc2cgPSB0bXBsLmZvcm1hdCgqKmxvY2FscygpKQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKG1zZykKCiAgICBkZWYgZ2V0X21ldGFkYXRhX2xpbmVzKHNlbGYsIG5hbWUpOgogICAgICAgIHJldHVybiB5aWVsZF9saW5lcyhzZWxmLmdldF9tZXRhZGF0YShuYW1lKSkKCgpjbGFzcyBQYXRoTWV0YWRhdGEoRGVmYXVsdFByb3ZpZGVyKToKICAgICIiIk1ldGFkYXRhIHByb3ZpZGVyIGZvciBlZ2cgZGlyZWN0b3JpZXMKCiAgICBVc2FnZTo6CgogICAgICAgICMgRGV2ZWxvcG1lbnQgZWdnczoKCiAgICAgICAgZWdnX2luZm8gPSAiL3BhdGgvdG8vUGFja2FnZU5hbWUuZWdnLWluZm8iCiAgICAgICAgYmFzZV9kaXIgPSBvcy5wYXRoLmRpcm5hbWUoZWdnX2luZm8pCiAgICAgICAgbWV0YWRhdGEgPSBQYXRoTWV0YWRhdGEoYmFzZV9kaXIsIGVnZ19pbmZvKQogICAgICAgIGRpc3RfbmFtZSA9IG9zLnBhdGguc3BsaXRleHQob3MucGF0aC5iYXNlbmFtZShlZ2dfaW5mbykpWzBdCiAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbihiYXNlZGlyLCBwcm9qZWN0X25hbWU9ZGlzdF9uYW1lLCBtZXRhZGF0YT1tZXRhZGF0YSkKCiAgICAgICAgIyBVbnBhY2tlZCBlZ2cgZGlyZWN0b3JpZXM6CgogICAgICAgIGVnZ19wYXRoID0gIi9wYXRoL3RvL1BhY2thZ2VOYW1lLXZlci1weXZlci1ldGMuZWdnIgogICAgICAgIG1ldGFkYXRhID0gUGF0aE1ldGFkYXRhKGVnZ19wYXRoLCBvcy5wYXRoLmpvaW4oZWdnX3BhdGgsJ0VHRy1JTkZPJykpCiAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbi5mcm9tX2ZpbGVuYW1lKGVnZ19wYXRoLCBtZXRhZGF0YT1tZXRhZGF0YSkKICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoLCBlZ2dfaW5mbyk6CiAgICAgICAgc2VsZi5tb2R1bGVfcGF0aCA9IHBhdGgKICAgICAgICBzZWxmLmVnZ19pbmZvID0gZWdnX2luZm8KCgpjbGFzcyBFZ2dNZXRhZGF0YShaaXBQcm92aWRlcik6CiAgICAiIiJNZXRhZGF0YSBwcm92aWRlciBmb3IgLmVnZyBmaWxlcyIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpbXBvcnRlcik6CiAgICAgICAgIiIiQ3JlYXRlIGEgbWV0YWRhdGEgcHJvdmlkZXIgZnJvbSBhIHppcGltcG9ydGVyIiIiCgogICAgICAgIHNlbGYuemlwX3ByZSA9IGltcG9ydGVyLmFyY2hpdmUgKyBvcy5zZXAKICAgICAgICBzZWxmLmxvYWRlciA9IGltcG9ydGVyCiAgICAgICAgaWYgaW1wb3J0ZXIucHJlZml4OgogICAgICAgICAgICBzZWxmLm1vZHVsZV9wYXRoID0gb3MucGF0aC5qb2luKGltcG9ydGVyLmFyY2hpdmUsIGltcG9ydGVyLnByZWZpeCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLm1vZHVsZV9wYXRoID0gaW1wb3J0ZXIuYXJjaGl2ZQogICAgICAgIHNlbGYuX3NldHVwX3ByZWZpeCgpCgoKX2RlY2xhcmVfc3RhdGUoJ2RpY3QnLCBfZGlzdHJpYnV0aW9uX2ZpbmRlcnM9e30pCgoKZGVmIHJlZ2lzdGVyX2ZpbmRlcihpbXBvcnRlcl90eXBlLCBkaXN0cmlidXRpb25fZmluZGVyKToKICAgICIiIlJlZ2lzdGVyIGBkaXN0cmlidXRpb25fZmluZGVyYCB0byBmaW5kIGRpc3RyaWJ1dGlvbnMgaW4gc3lzLnBhdGggaXRlbXMKCiAgICBgaW1wb3J0ZXJfdHlwZWAgaXMgdGhlIHR5cGUgb3IgY2xhc3Mgb2YgYSBQRVAgMzAyICJJbXBvcnRlciIgKHN5cy5wYXRoIGl0ZW0KICAgIGhhbmRsZXIpLCBhbmQgYGRpc3RyaWJ1dGlvbl9maW5kZXJgIGlzIGEgY2FsbGFibGUgdGhhdCwgcGFzc2VkIGEgcGF0aAogICAgaXRlbSBhbmQgdGhlIGltcG9ydGVyIGluc3RhbmNlLCB5aWVsZHMgYGBEaXN0cmlidXRpb25gYCBpbnN0YW5jZXMgZm91bmQgb24KICAgIHRoYXQgcGF0aCBpdGVtLiAgU2VlIGBgcGtnX3Jlc291cmNlcy5maW5kX29uX3BhdGhgYCBmb3IgYW4gZXhhbXBsZS4iIiIKICAgIF9kaXN0cmlidXRpb25fZmluZGVyc1tpbXBvcnRlcl90eXBlXSA9IGRpc3RyaWJ1dGlvbl9maW5kZXIKCgpkZWYgZmluZF9kaXN0cmlidXRpb25zKHBhdGhfaXRlbSwgb25seT1GYWxzZSk6CiAgICAiIiJZaWVsZCBkaXN0cmlidXRpb25zIGFjY2Vzc2libGUgdmlhIGBwYXRoX2l0ZW1gIiIiCiAgICBpbXBvcnRlciA9IGdldF9pbXBvcnRlcihwYXRoX2l0ZW0pCiAgICBmaW5kZXIgPSBfZmluZF9hZGFwdGVyKF9kaXN0cmlidXRpb25fZmluZGVycywgaW1wb3J0ZXIpCiAgICByZXR1cm4gZmluZGVyKGltcG9ydGVyLCBwYXRoX2l0ZW0sIG9ubHkpCgoKZGVmIGZpbmRfZWdnc19pbl96aXAoaW1wb3J0ZXIsIHBhdGhfaXRlbSwgb25seT1GYWxzZSk6CiAgICAiIiIKICAgIEZpbmQgZWdncyBpbiB6aXAgZmlsZXM7IHBvc3NpYmx5IG11bHRpcGxlIG5lc3RlZCBlZ2dzLgogICAgIiIiCiAgICBpZiBpbXBvcnRlci5hcmNoaXZlLmVuZHN3aXRoKCcud2hsJyk6CiAgICAgICAgIyB3aGVlbHMgYXJlIG5vdCBzdXBwb3J0ZWQgd2l0aCB0aGlzIGZpbmRlcgogICAgICAgICMgdGhleSBkb24ndCBoYXZlIFBLRy1JTkZPIG1ldGFkYXRhLCBhbmQgd29uJ3QgZXZlciBjb250YWluIGVnZ3MKICAgICAgICByZXR1cm4KICAgIG1ldGFkYXRhID0gRWdnTWV0YWRhdGEoaW1wb3J0ZXIpCiAgICBpZiBtZXRhZGF0YS5oYXNfbWV0YWRhdGEoJ1BLRy1JTkZPJyk6CiAgICAgICAgeWllbGQgRGlzdHJpYnV0aW9uLmZyb21fZmlsZW5hbWUocGF0aF9pdGVtLCBtZXRhZGF0YT1tZXRhZGF0YSkKICAgIGlmIG9ubHk6CiAgICAgICAgIyBkb24ndCB5aWVsZCBuZXN0ZWQgZGlzdHJvcwogICAgICAgIHJldHVybgogICAgZm9yIHN1Yml0ZW0gaW4gbWV0YWRhdGEucmVzb3VyY2VfbGlzdGRpcignLycpOgogICAgICAgIGlmIF9pc191bnBhY2tlZF9lZ2coc3ViaXRlbSk6CiAgICAgICAgICAgIHN1YnBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aF9pdGVtLCBzdWJpdGVtKQogICAgICAgICAgICBmb3IgZGlzdCBpbiBmaW5kX2VnZ3NfaW5femlwKHppcGltcG9ydC56aXBpbXBvcnRlcihzdWJwYXRoKSwgc3VicGF0aCk6CiAgICAgICAgICAgICAgICB5aWVsZCBkaXN0CgoKcmVnaXN0ZXJfZmluZGVyKHppcGltcG9ydC56aXBpbXBvcnRlciwgZmluZF9lZ2dzX2luX3ppcCkKCgpkZWYgZmluZF9ub3RoaW5nKGltcG9ydGVyLCBwYXRoX2l0ZW0sIG9ubHk9RmFsc2UpOgogICAgcmV0dXJuICgpCgoKcmVnaXN0ZXJfZmluZGVyKG9iamVjdCwgZmluZF9ub3RoaW5nKQoKCmRlZiBfYnlfdmVyc2lvbl9kZXNjZW5kaW5nKG5hbWVzKToKICAgICIiIgogICAgR2l2ZW4gYSBsaXN0IG9mIGZpbGVuYW1lcywgcmV0dXJuIHRoZW0gaW4gZGVzY2VuZGluZyBvcmRlcgogICAgYnkgdmVyc2lvbiBudW1iZXIuCgogICAgPj4+IG5hbWVzID0gJ2JhcicsICdmb28nLCAnUHl0aG9uLTIuNy4xMC5lZ2cnLCAnUHl0aG9uLTIuNy4yLmVnZycKICAgID4+PiBfYnlfdmVyc2lvbl9kZXNjZW5kaW5nKG5hbWVzKQogICAgWydQeXRob24tMi43LjEwLmVnZycsICdQeXRob24tMi43LjIuZWdnJywgJ2ZvbycsICdiYXInXQogICAgPj4+IG5hbWVzID0gJ1NldHVwdG9vbHMtMS4yLjNiMS5lZ2cnLCAnU2V0dXB0b29scy0xLjIuMy5lZ2cnCiAgICA+Pj4gX2J5X3ZlcnNpb25fZGVzY2VuZGluZyhuYW1lcykKICAgIFsnU2V0dXB0b29scy0xLjIuMy5lZ2cnLCAnU2V0dXB0b29scy0xLjIuM2IxLmVnZyddCiAgICA+Pj4gbmFtZXMgPSAnU2V0dXB0b29scy0xLjIuM2IxLmVnZycsICdTZXR1cHRvb2xzLTEuMi4zLnBvc3QxLmVnZycKICAgID4+PiBfYnlfdmVyc2lvbl9kZXNjZW5kaW5nKG5hbWVzKQogICAgWydTZXR1cHRvb2xzLTEuMi4zLnBvc3QxLmVnZycsICdTZXR1cHRvb2xzLTEuMi4zYjEuZWdnJ10KICAgICIiIgogICAgZGVmIF9ieV92ZXJzaW9uKG5hbWUpOgogICAgICAgICIiIgogICAgICAgIFBhcnNlIGVhY2ggY29tcG9uZW50IG9mIHRoZSBmaWxlbmFtZQogICAgICAgICIiIgogICAgICAgIG5hbWUsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQobmFtZSkKICAgICAgICBwYXJ0cyA9IGl0ZXJ0b29scy5jaGFpbihuYW1lLnNwbGl0KCctJyksIFtleHRdKQogICAgICAgIHJldHVybiBbcGFja2FnaW5nLnZlcnNpb24ucGFyc2UocGFydCkgZm9yIHBhcnQgaW4gcGFydHNdCgogICAgcmV0dXJuIHNvcnRlZChuYW1lcywga2V5PV9ieV92ZXJzaW9uLCByZXZlcnNlPVRydWUpCgoKZGVmIGZpbmRfb25fcGF0aChpbXBvcnRlciwgcGF0aF9pdGVtLCBvbmx5PUZhbHNlKToKICAgICIiIllpZWxkIGRpc3RyaWJ1dGlvbnMgYWNjZXNzaWJsZSBvbiBhIHN5cy5wYXRoIGRpcmVjdG9yeSIiIgogICAgcGF0aF9pdGVtID0gX25vcm1hbGl6ZV9jYWNoZWQocGF0aF9pdGVtKQoKICAgIGlmIG9zLnBhdGguaXNkaXIocGF0aF9pdGVtKSBhbmQgb3MuYWNjZXNzKHBhdGhfaXRlbSwgb3MuUl9PSyk6CiAgICAgICAgaWYgX2lzX3VucGFja2VkX2VnZyhwYXRoX2l0ZW0pOgogICAgICAgICAgICB5aWVsZCBEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZSgKICAgICAgICAgICAgICAgIHBhdGhfaXRlbSwgbWV0YWRhdGE9UGF0aE1ldGFkYXRhKAogICAgICAgICAgICAgICAgICAgIHBhdGhfaXRlbSwgb3MucGF0aC5qb2luKHBhdGhfaXRlbSwgJ0VHRy1JTkZPJykKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgc2NhbiBmb3IgLmVnZyBhbmQgLmVnZy1pbmZvIGluIGRpcmVjdG9yeQogICAgICAgICAgICBwYXRoX2l0ZW1fZW50cmllcyA9IF9ieV92ZXJzaW9uX2Rlc2NlbmRpbmcob3MubGlzdGRpcihwYXRoX2l0ZW0pKQogICAgICAgICAgICBmb3IgZW50cnkgaW4gcGF0aF9pdGVtX2VudHJpZXM6CiAgICAgICAgICAgICAgICBsb3dlciA9IGVudHJ5Lmxvd2VyKCkKICAgICAgICAgICAgICAgIGlmIGxvd2VyLmVuZHN3aXRoKCcuZWdnLWluZm8nKSBvciBsb3dlci5lbmRzd2l0aCgnLmRpc3QtaW5mbycpOgogICAgICAgICAgICAgICAgICAgIGZ1bGxwYXRoID0gb3MucGF0aC5qb2luKHBhdGhfaXRlbSwgZW50cnkpCiAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihmdWxscGF0aCk6CiAgICAgICAgICAgICAgICAgICAgICAgICMgZWdnLWluZm8gZGlyZWN0b3J5LCBhbGxvdyBnZXR0aW5nIG1ldGFkYXRhCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxlbihvcy5saXN0ZGlyKGZ1bGxwYXRoKSkgPT0gMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgRW1wdHkgZWdnIGRpcmVjdG9yeSwgc2tpcC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhID0gUGF0aE1ldGFkYXRhKHBhdGhfaXRlbSwgZnVsbHBhdGgpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgPSBGaWxlTWV0YWRhdGEoZnVsbHBhdGgpCiAgICAgICAgICAgICAgICAgICAgeWllbGQgRGlzdHJpYnV0aW9uLmZyb21fbG9jYXRpb24oCiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhfaXRlbSwgZW50cnksIG1ldGFkYXRhLCBwcmVjZWRlbmNlPURFVkVMT1BfRElTVAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGVsaWYgbm90IG9ubHkgYW5kIF9pc191bnBhY2tlZF9lZ2coZW50cnkpOgogICAgICAgICAgICAgICAgICAgIGRpc3RzID0gZmluZF9kaXN0cmlidXRpb25zKG9zLnBhdGguam9pbihwYXRoX2l0ZW0sIGVudHJ5KSkKICAgICAgICAgICAgICAgICAgICBmb3IgZGlzdCBpbiBkaXN0czoKICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgZGlzdAogICAgICAgICAgICAgICAgZWxpZiBub3Qgb25seSBhbmQgbG93ZXIuZW5kc3dpdGgoJy5lZ2ctbGluaycpOgogICAgICAgICAgICAgICAgICAgIHdpdGggb3Blbihvcy5wYXRoLmpvaW4ocGF0aF9pdGVtLCBlbnRyeSkpIGFzIGVudHJ5X2ZpbGU6CiAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5X2xpbmVzID0gZW50cnlfZmlsZS5yZWFkbGluZXMoKQogICAgICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIGVudHJ5X2xpbmVzOgogICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgbGluZS5zdHJpcCgpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoX2l0ZW0sIGxpbmUucnN0cmlwKCkpCiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RzID0gZmluZF9kaXN0cmlidXRpb25zKHBhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpdGVtIGluIGRpc3RzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgaXRlbQogICAgICAgICAgICAgICAgICAgICAgICBicmVhawoKCnJlZ2lzdGVyX2ZpbmRlcihwa2d1dGlsLkltcEltcG9ydGVyLCBmaW5kX29uX3BhdGgpCgppZiBoYXNhdHRyKGltcG9ydGxpYl9tYWNoaW5lcnksICdGaWxlRmluZGVyJyk6CiAgICByZWdpc3Rlcl9maW5kZXIoaW1wb3J0bGliX21hY2hpbmVyeS5GaWxlRmluZGVyLCBmaW5kX29uX3BhdGgpCgpfZGVjbGFyZV9zdGF0ZSgnZGljdCcsIF9uYW1lc3BhY2VfaGFuZGxlcnM9e30pCl9kZWNsYXJlX3N0YXRlKCdkaWN0JywgX25hbWVzcGFjZV9wYWNrYWdlcz17fSkKCgpkZWYgcmVnaXN0ZXJfbmFtZXNwYWNlX2hhbmRsZXIoaW1wb3J0ZXJfdHlwZSwgbmFtZXNwYWNlX2hhbmRsZXIpOgogICAgIiIiUmVnaXN0ZXIgYG5hbWVzcGFjZV9oYW5kbGVyYCB0byBkZWNsYXJlIG5hbWVzcGFjZSBwYWNrYWdlcwoKICAgIGBpbXBvcnRlcl90eXBlYCBpcyB0aGUgdHlwZSBvciBjbGFzcyBvZiBhIFBFUCAzMDIgIkltcG9ydGVyIiAoc3lzLnBhdGggaXRlbQogICAgaGFuZGxlciksIGFuZCBgbmFtZXNwYWNlX2hhbmRsZXJgIGlzIGEgY2FsbGFibGUgbGlrZSB0aGlzOjoKCiAgICAgICAgZGVmIG5hbWVzcGFjZV9oYW5kbGVyKGltcG9ydGVyLCBwYXRoX2VudHJ5LCBtb2R1bGVOYW1lLCBtb2R1bGUpOgogICAgICAgICAgICAjIHJldHVybiBhIHBhdGhfZW50cnkgdG8gdXNlIGZvciBjaGlsZCBwYWNrYWdlcwoKICAgIE5hbWVzcGFjZSBoYW5kbGVycyBhcmUgb25seSBjYWxsZWQgaWYgdGhlIGltcG9ydGVyIG9iamVjdCBoYXMgYWxyZWFkeQogICAgYWdyZWVkIHRoYXQgaXQgY2FuIGhhbmRsZSB0aGUgcmVsZXZhbnQgcGF0aCBpdGVtLCBhbmQgdGhleSBzaG91bGQgb25seQogICAgcmV0dXJuIGEgc3VicGF0aCBpZiB0aGUgbW9kdWxlIF9fcGF0aF9fIGRvZXMgbm90IGFscmVhZHkgY29udGFpbiBhbgogICAgZXF1aXZhbGVudCBzdWJwYXRoLiAgRm9yIGFuIGV4YW1wbGUgbmFtZXNwYWNlIGhhbmRsZXIsIHNlZQogICAgYGBwa2dfcmVzb3VyY2VzLmZpbGVfbnNfaGFuZGxlcmBgLgogICAgIiIiCiAgICBfbmFtZXNwYWNlX2hhbmRsZXJzW2ltcG9ydGVyX3R5cGVdID0gbmFtZXNwYWNlX2hhbmRsZXIKCgpkZWYgX2hhbmRsZV9ucyhwYWNrYWdlTmFtZSwgcGF0aF9pdGVtKToKICAgICIiIkVuc3VyZSB0aGF0IG5hbWVkIHBhY2thZ2UgaW5jbHVkZXMgYSBzdWJwYXRoIG9mIHBhdGhfaXRlbSAoaWYgbmVlZGVkKSIiIgoKICAgIGltcG9ydGVyID0gZ2V0X2ltcG9ydGVyKHBhdGhfaXRlbSkKICAgIGlmIGltcG9ydGVyIGlzIE5vbmU6CiAgICAgICAgcmV0dXJuIE5vbmUKICAgIGxvYWRlciA9IGltcG9ydGVyLmZpbmRfbW9kdWxlKHBhY2thZ2VOYW1lKQogICAgaWYgbG9hZGVyIGlzIE5vbmU6CiAgICAgICAgcmV0dXJuIE5vbmUKICAgIG1vZHVsZSA9IHN5cy5tb2R1bGVzLmdldChwYWNrYWdlTmFtZSkKICAgIGlmIG1vZHVsZSBpcyBOb25lOgogICAgICAgIG1vZHVsZSA9IHN5cy5tb2R1bGVzW3BhY2thZ2VOYW1lXSA9IHR5cGVzLk1vZHVsZVR5cGUocGFja2FnZU5hbWUpCiAgICAgICAgbW9kdWxlLl9fcGF0aF9fID0gW10KICAgICAgICBfc2V0X3BhcmVudF9ucyhwYWNrYWdlTmFtZSkKICAgIGVsaWYgbm90IGhhc2F0dHIobW9kdWxlLCAnX19wYXRoX18nKToKICAgICAgICByYWlzZSBUeXBlRXJyb3IoIk5vdCBhIHBhY2thZ2U6IiwgcGFja2FnZU5hbWUpCiAgICBoYW5kbGVyID0gX2ZpbmRfYWRhcHRlcihfbmFtZXNwYWNlX2hhbmRsZXJzLCBpbXBvcnRlcikKICAgIHN1YnBhdGggPSBoYW5kbGVyKGltcG9ydGVyLCBwYXRoX2l0ZW0sIHBhY2thZ2VOYW1lLCBtb2R1bGUpCiAgICBpZiBzdWJwYXRoIGlzIG5vdCBOb25lOgogICAgICAgIHBhdGggPSBtb2R1bGUuX19wYXRoX18KICAgICAgICBwYXRoLmFwcGVuZChzdWJwYXRoKQogICAgICAgIGxvYWRlci5sb2FkX21vZHVsZShwYWNrYWdlTmFtZSkKICAgICAgICBfcmVidWlsZF9tb2RfcGF0aChwYXRoLCBwYWNrYWdlTmFtZSwgbW9kdWxlKQogICAgcmV0dXJuIHN1YnBhdGgKCgpkZWYgX3JlYnVpbGRfbW9kX3BhdGgob3JpZ19wYXRoLCBwYWNrYWdlX25hbWUsIG1vZHVsZSk6CiAgICAiIiIKICAgIFJlYnVpbGQgbW9kdWxlLl9fcGF0aF9fIGVuc3VyaW5nIHRoYXQgYWxsIGVudHJpZXMgYXJlIG9yZGVyZWQKICAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlaXIgc3lzLnBhdGggb3JkZXIKICAgICIiIgogICAgc3lzX3BhdGggPSBbX25vcm1hbGl6ZV9jYWNoZWQocCkgZm9yIHAgaW4gc3lzLnBhdGhdCgogICAgZGVmIHNhZmVfc3lzX3BhdGhfaW5kZXgoZW50cnkpOgogICAgICAgICIiIgogICAgICAgIFdvcmthcm91bmQgZm9yICM1MjAgYW5kICM1MTMuCiAgICAgICAgIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc3lzX3BhdGguaW5kZXgoZW50cnkpCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIHJldHVybiBmbG9hdCgnaW5mJykKCiAgICBkZWYgcG9zaXRpb25faW5fc3lzX3BhdGgocGF0aCk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIHRoZSBvcmRpbmFsIG9mIHRoZSBwYXRoIGJhc2VkIG9uIGl0cyBwb3NpdGlvbiBpbiBzeXMucGF0aAogICAgICAgICIiIgogICAgICAgIHBhdGhfcGFydHMgPSBwYXRoLnNwbGl0KG9zLnNlcCkKICAgICAgICBtb2R1bGVfcGFydHMgPSBwYWNrYWdlX25hbWUuY291bnQoJy4nKSArIDEKICAgICAgICBwYXJ0cyA9IHBhdGhfcGFydHNbOi1tb2R1bGVfcGFydHNdCiAgICAgICAgcmV0dXJuIHNhZmVfc3lzX3BhdGhfaW5kZXgoX25vcm1hbGl6ZV9jYWNoZWQob3Muc2VwLmpvaW4ocGFydHMpKSkKCiAgICBvcmlnX3BhdGguc29ydChrZXk9cG9zaXRpb25faW5fc3lzX3BhdGgpCiAgICBtb2R1bGUuX19wYXRoX19bOl0gPSBbX25vcm1hbGl6ZV9jYWNoZWQocCkgZm9yIHAgaW4gb3JpZ19wYXRoXQoKCmRlZiBkZWNsYXJlX25hbWVzcGFjZShwYWNrYWdlTmFtZSk6CiAgICAiIiJEZWNsYXJlIHRoYXQgcGFja2FnZSAncGFja2FnZU5hbWUnIGlzIGEgbmFtZXNwYWNlIHBhY2thZ2UiIiIKCiAgICBfaW1wLmFjcXVpcmVfbG9jaygpCiAgICB0cnk6CiAgICAgICAgaWYgcGFja2FnZU5hbWUgaW4gX25hbWVzcGFjZV9wYWNrYWdlczoKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHBhdGgsIHBhcmVudCA9IHN5cy5wYXRoLCBOb25lCiAgICAgICAgaWYgJy4nIGluIHBhY2thZ2VOYW1lOgogICAgICAgICAgICBwYXJlbnQgPSAnLicuam9pbihwYWNrYWdlTmFtZS5zcGxpdCgnLicpWzotMV0pCiAgICAgICAgICAgIGRlY2xhcmVfbmFtZXNwYWNlKHBhcmVudCkKICAgICAgICAgICAgaWYgcGFyZW50IG5vdCBpbiBfbmFtZXNwYWNlX3BhY2thZ2VzOgogICAgICAgICAgICAgICAgX19pbXBvcnRfXyhwYXJlbnQpCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHBhdGggPSBzeXMubW9kdWxlc1twYXJlbnRdLl9fcGF0aF9fCiAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiTm90IGEgcGFja2FnZToiLCBwYXJlbnQpCgogICAgICAgICMgVHJhY2sgd2hhdCBwYWNrYWdlcyBhcmUgbmFtZXNwYWNlcywgc28gd2hlbiBuZXcgcGF0aCBpdGVtcyBhcmUgYWRkZWQsCiAgICAgICAgIyB0aGV5IGNhbiBiZSB1cGRhdGVkCiAgICAgICAgX25hbWVzcGFjZV9wYWNrYWdlcy5zZXRkZWZhdWx0KHBhcmVudCwgW10pLmFwcGVuZChwYWNrYWdlTmFtZSkKICAgICAgICBfbmFtZXNwYWNlX3BhY2thZ2VzLnNldGRlZmF1bHQocGFja2FnZU5hbWUsIFtdKQoKICAgICAgICBmb3IgcGF0aF9pdGVtIGluIHBhdGg6CiAgICAgICAgICAgICMgRW5zdXJlIGFsbCB0aGUgcGFyZW50J3MgcGF0aCBpdGVtcyBhcmUgcmVmbGVjdGVkIGluIHRoZSBjaGlsZCwKICAgICAgICAgICAgIyBpZiB0aGV5IGFwcGx5CiAgICAgICAgICAgIF9oYW5kbGVfbnMocGFja2FnZU5hbWUsIHBhdGhfaXRlbSkKCiAgICBmaW5hbGx5OgogICAgICAgIF9pbXAucmVsZWFzZV9sb2NrKCkKCgpkZWYgZml4dXBfbmFtZXNwYWNlX3BhY2thZ2VzKHBhdGhfaXRlbSwgcGFyZW50PU5vbmUpOgogICAgIiIiRW5zdXJlIHRoYXQgcHJldmlvdXNseS1kZWNsYXJlZCBuYW1lc3BhY2UgcGFja2FnZXMgaW5jbHVkZSBwYXRoX2l0ZW0iIiIKICAgIF9pbXAuYWNxdWlyZV9sb2NrKCkKICAgIHRyeToKICAgICAgICBmb3IgcGFja2FnZSBpbiBfbmFtZXNwYWNlX3BhY2thZ2VzLmdldChwYXJlbnQsICgpKToKICAgICAgICAgICAgc3VicGF0aCA9IF9oYW5kbGVfbnMocGFja2FnZSwgcGF0aF9pdGVtKQogICAgICAgICAgICBpZiBzdWJwYXRoOgogICAgICAgICAgICAgICAgZml4dXBfbmFtZXNwYWNlX3BhY2thZ2VzKHN1YnBhdGgsIHBhY2thZ2UpCiAgICBmaW5hbGx5OgogICAgICAgIF9pbXAucmVsZWFzZV9sb2NrKCkKCgpkZWYgZmlsZV9uc19oYW5kbGVyKGltcG9ydGVyLCBwYXRoX2l0ZW0sIHBhY2thZ2VOYW1lLCBtb2R1bGUpOgogICAgIiIiQ29tcHV0ZSBhbiBucy1wYWNrYWdlIHN1YnBhdGggZm9yIGEgZmlsZXN5c3RlbSBvciB6aXBmaWxlIGltcG9ydGVyIiIiCgogICAgc3VicGF0aCA9IG9zLnBhdGguam9pbihwYXRoX2l0ZW0sIHBhY2thZ2VOYW1lLnNwbGl0KCcuJylbLTFdKQogICAgbm9ybWFsaXplZCA9IF9ub3JtYWxpemVfY2FjaGVkKHN1YnBhdGgpCiAgICBmb3IgaXRlbSBpbiBtb2R1bGUuX19wYXRoX186CiAgICAgICAgaWYgX25vcm1hbGl6ZV9jYWNoZWQoaXRlbSkgPT0gbm9ybWFsaXplZDoKICAgICAgICAgICAgYnJlYWsKICAgIGVsc2U6CiAgICAgICAgIyBPbmx5IHJldHVybiB0aGUgcGF0aCBpZiBpdCdzIG5vdCBhbHJlYWR5IHRoZXJlCiAgICAgICAgcmV0dXJuIHN1YnBhdGgKCgpyZWdpc3Rlcl9uYW1lc3BhY2VfaGFuZGxlcihwa2d1dGlsLkltcEltcG9ydGVyLCBmaWxlX25zX2hhbmRsZXIpCnJlZ2lzdGVyX25hbWVzcGFjZV9oYW5kbGVyKHppcGltcG9ydC56aXBpbXBvcnRlciwgZmlsZV9uc19oYW5kbGVyKQoKaWYgaGFzYXR0cihpbXBvcnRsaWJfbWFjaGluZXJ5LCAnRmlsZUZpbmRlcicpOgogICAgcmVnaXN0ZXJfbmFtZXNwYWNlX2hhbmRsZXIoaW1wb3J0bGliX21hY2hpbmVyeS5GaWxlRmluZGVyLCBmaWxlX25zX2hhbmRsZXIpCgoKZGVmIG51bGxfbnNfaGFuZGxlcihpbXBvcnRlciwgcGF0aF9pdGVtLCBwYWNrYWdlTmFtZSwgbW9kdWxlKToKICAgIHJldHVybiBOb25lCgoKcmVnaXN0ZXJfbmFtZXNwYWNlX2hhbmRsZXIob2JqZWN0LCBudWxsX25zX2hhbmRsZXIpCgoKZGVmIG5vcm1hbGl6ZV9wYXRoKGZpbGVuYW1lKToKICAgICIiIk5vcm1hbGl6ZSBhIGZpbGUvZGlyIG5hbWUgZm9yIGNvbXBhcmlzb24gcHVycG9zZXMiIiIKICAgIHJldHVybiBvcy5wYXRoLm5vcm1jYXNlKG9zLnBhdGgucmVhbHBhdGgoZmlsZW5hbWUpKQoKCmRlZiBfbm9ybWFsaXplX2NhY2hlZChmaWxlbmFtZSwgX2NhY2hlPXt9KToKICAgIHRyeToKICAgICAgICByZXR1cm4gX2NhY2hlW2ZpbGVuYW1lXQogICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgIF9jYWNoZVtmaWxlbmFtZV0gPSByZXN1bHQgPSBub3JtYWxpemVfcGF0aChmaWxlbmFtZSkKICAgICAgICByZXR1cm4gcmVzdWx0CgoKZGVmIF9pc191bnBhY2tlZF9lZ2cocGF0aCk6CiAgICAiIiIKICAgIERldGVybWluZSBpZiBnaXZlbiBwYXRoIGFwcGVhcnMgdG8gYmUgYW4gdW5wYWNrZWQgZWdnLgogICAgIiIiCiAgICByZXR1cm4gKAogICAgICAgIHBhdGgubG93ZXIoKS5lbmRzd2l0aCgnLmVnZycpCiAgICApCgoKZGVmIF9zZXRfcGFyZW50X25zKHBhY2thZ2VOYW1lKToKICAgIHBhcnRzID0gcGFja2FnZU5hbWUuc3BsaXQoJy4nKQogICAgbmFtZSA9IHBhcnRzLnBvcCgpCiAgICBpZiBwYXJ0czoKICAgICAgICBwYXJlbnQgPSAnLicuam9pbihwYXJ0cykKICAgICAgICBzZXRhdHRyKHN5cy5tb2R1bGVzW3BhcmVudF0sIG5hbWUsIHN5cy5tb2R1bGVzW3BhY2thZ2VOYW1lXSkKCgpkZWYgeWllbGRfbGluZXMoc3Rycyk6CiAgICAiIiJZaWVsZCBub24tZW1wdHkvbm9uLWNvbW1lbnQgbGluZXMgb2YgYSBzdHJpbmcgb3Igc2VxdWVuY2UiIiIKICAgIGlmIGlzaW5zdGFuY2Uoc3Rycywgc2l4LnN0cmluZ190eXBlcyk6CiAgICAgICAgZm9yIHMgaW4gc3Rycy5zcGxpdGxpbmVzKCk6CiAgICAgICAgICAgIHMgPSBzLnN0cmlwKCkKICAgICAgICAgICAgIyBza2lwIGJsYW5rIGxpbmVzL2NvbW1lbnRzCiAgICAgICAgICAgIGlmIHMgYW5kIG5vdCBzLnN0YXJ0c3dpdGgoJyMnKToKICAgICAgICAgICAgICAgIHlpZWxkIHMKICAgIGVsc2U6CiAgICAgICAgZm9yIHNzIGluIHN0cnM6CiAgICAgICAgICAgIGZvciBzIGluIHlpZWxkX2xpbmVzKHNzKToKICAgICAgICAgICAgICAgIHlpZWxkIHMKCgpNT0RVTEUgPSByZS5jb21waWxlKHIiXHcrKFwuXHcrKSokIikubWF0Y2gKRUdHX05BTUUgPSByZS5jb21waWxlKAogICAgciIiIgogICAgKD9QPG5hbWU+W14tXSspICgKICAgICAgICAtKD9QPHZlcj5bXi1dKykgKAogICAgICAgICAgICAtcHkoP1A8cHl2ZXI+W14tXSspICgKICAgICAgICAgICAgICAgIC0oP1A8cGxhdD4uKykKICAgICAgICAgICAgKT8KICAgICAgICApPwogICAgKT8KICAgICIiIiwKICAgIHJlLlZFUkJPU0UgfCByZS5JR05PUkVDQVNFLAopLm1hdGNoCgoKY2xhc3MgRW50cnlQb2ludChvYmplY3QpOgogICAgIiIiT2JqZWN0IHJlcHJlc2VudGluZyBhbiBhZHZlcnRpc2VkIGltcG9ydGFibGUgb2JqZWN0IiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIG1vZHVsZV9uYW1lLCBhdHRycz0oKSwgZXh0cmFzPSgpLCBkaXN0PU5vbmUpOgogICAgICAgIGlmIG5vdCBNT0RVTEUobW9kdWxlX25hbWUpOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJbnZhbGlkIG1vZHVsZSBuYW1lIiwgbW9kdWxlX25hbWUpCiAgICAgICAgc2VsZi5uYW1lID0gbmFtZQogICAgICAgIHNlbGYubW9kdWxlX25hbWUgPSBtb2R1bGVfbmFtZQogICAgICAgIHNlbGYuYXR0cnMgPSB0dXBsZShhdHRycykKICAgICAgICBzZWxmLmV4dHJhcyA9IFJlcXVpcmVtZW50LnBhcnNlKCgieFslc10iICUgJywnLmpvaW4oZXh0cmFzKSkpLmV4dHJhcwogICAgICAgIHNlbGYuZGlzdCA9IGRpc3QKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICBzID0gIiVzID0gJXMiICUgKHNlbGYubmFtZSwgc2VsZi5tb2R1bGVfbmFtZSkKICAgICAgICBpZiBzZWxmLmF0dHJzOgogICAgICAgICAgICBzICs9ICc6JyArICcuJy5qb2luKHNlbGYuYXR0cnMpCiAgICAgICAgaWYgc2VsZi5leHRyYXM6CiAgICAgICAgICAgIHMgKz0gJyBbJXNdJyAlICcsJy5qb2luKHNlbGYuZXh0cmFzKQogICAgICAgIHJldHVybiBzCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiRW50cnlQb2ludC5wYXJzZSglcikiICUgc3RyKHNlbGYpCgogICAgZGVmIGxvYWQoc2VsZiwgcmVxdWlyZT1UcnVlLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICIiIgogICAgICAgIFJlcXVpcmUgcGFja2FnZXMgZm9yIHRoaXMgRW50cnlQb2ludCwgdGhlbiByZXNvbHZlIGl0LgogICAgICAgICIiIgogICAgICAgIGlmIG5vdCByZXF1aXJlIG9yIGFyZ3Mgb3Iga3dhcmdzOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAgICAgIlBhcmFtZXRlcnMgdG8gbG9hZCBhcmUgZGVwcmVjYXRlZC4gIENhbGwgLnJlc29sdmUgYW5kICIKICAgICAgICAgICAgICAgICIucmVxdWlyZSBzZXBhcmF0ZWx5LiIsCiAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsCiAgICAgICAgICAgICAgICBzdGFja2xldmVsPTIsCiAgICAgICAgICAgICkKICAgICAgICBpZiByZXF1aXJlOgogICAgICAgICAgICBzZWxmLnJlcXVpcmUoKmFyZ3MsICoqa3dhcmdzKQogICAgICAgIHJldHVybiBzZWxmLnJlc29sdmUoKQoKICAgIGRlZiByZXNvbHZlKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJlc29sdmUgdGhlIGVudHJ5IHBvaW50IGZyb20gaXRzIG1vZHVsZSBhbmQgYXR0cnMuCiAgICAgICAgIiIiCiAgICAgICAgbW9kdWxlID0gX19pbXBvcnRfXyhzZWxmLm1vZHVsZV9uYW1lLCBmcm9tbGlzdD1bJ19fbmFtZV9fJ10sIGxldmVsPTApCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gZnVuY3Rvb2xzLnJlZHVjZShnZXRhdHRyLCBzZWxmLmF0dHJzLCBtb2R1bGUpCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yIGFzIGV4YzoKICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3Ioc3RyKGV4YykpCgogICAgZGVmIHJlcXVpcmUoc2VsZiwgZW52PU5vbmUsIGluc3RhbGxlcj1Ob25lKToKICAgICAgICBpZiBzZWxmLmV4dHJhcyBhbmQgbm90IHNlbGYuZGlzdDoKICAgICAgICAgICAgcmFpc2UgVW5rbm93bkV4dHJhKCJDYW4ndCByZXF1aXJlKCkgd2l0aG91dCBhIGRpc3RyaWJ1dGlvbiIsIHNlbGYpCiAgICAgICAgcmVxcyA9IHNlbGYuZGlzdC5yZXF1aXJlcyhzZWxmLmV4dHJhcykKICAgICAgICBpdGVtcyA9IHdvcmtpbmdfc2V0LnJlc29sdmUocmVxcywgZW52LCBpbnN0YWxsZXIpCiAgICAgICAgbGlzdChtYXAod29ya2luZ19zZXQuYWRkLCBpdGVtcykpCgogICAgcGF0dGVybiA9IHJlLmNvbXBpbGUoCiAgICAgICAgcidccyonCiAgICAgICAgcicoP1A8bmFtZT4uKz8pXHMqJwogICAgICAgIHInPVxzKicKICAgICAgICByJyg/UDxtb2R1bGU+W1x3Ll0rKVxzKicKICAgICAgICByJyg6XHMqKD9QPGF0dHI+W1x3Ll0rKSk/XHMqJwogICAgICAgIHInKD9QPGV4dHJhcz5cWy4qXF0pP1xzKiQnCiAgICApCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgcGFyc2UoY2xzLCBzcmMsIGRpc3Q9Tm9uZSk6CiAgICAgICAgIiIiUGFyc2UgYSBzaW5nbGUgZW50cnkgcG9pbnQgZnJvbSBzdHJpbmcgYHNyY2AKCiAgICAgICAgRW50cnkgcG9pbnQgc3ludGF4IGZvbGxvd3MgdGhlIGZvcm06OgoKICAgICAgICAgICAgbmFtZSA9IHNvbWUubW9kdWxlOnNvbWUuYXR0ciBbZXh0cmExLCBleHRyYTJdCgogICAgICAgIFRoZSBlbnRyeSBuYW1lIGFuZCBtb2R1bGUgbmFtZSBhcmUgcmVxdWlyZWQsIGJ1dCB0aGUgYGA6YXR0cnNgYCBhbmQKICAgICAgICBgYFtleHRyYXNdYGAgcGFydHMgYXJlIG9wdGlvbmFsCiAgICAgICAgIiIiCiAgICAgICAgbSA9IGNscy5wYXR0ZXJuLm1hdGNoKHNyYykKICAgICAgICBpZiBub3QgbToKICAgICAgICAgICAgbXNnID0gIkVudHJ5UG9pbnQgbXVzdCBiZSBpbiAnbmFtZT1tb2R1bGU6YXR0cnMgW2V4dHJhc10nIGZvcm1hdCIKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihtc2csIHNyYykKICAgICAgICByZXMgPSBtLmdyb3VwZGljdCgpCiAgICAgICAgZXh0cmFzID0gY2xzLl9wYXJzZV9leHRyYXMocmVzWydleHRyYXMnXSkKICAgICAgICBhdHRycyA9IHJlc1snYXR0ciddLnNwbGl0KCcuJykgaWYgcmVzWydhdHRyJ10gZWxzZSAoKQogICAgICAgIHJldHVybiBjbHMocmVzWyduYW1lJ10sIHJlc1snbW9kdWxlJ10sIGF0dHJzLCBleHRyYXMsIGRpc3QpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX3BhcnNlX2V4dHJhcyhjbHMsIGV4dHJhc19zcGVjKToKICAgICAgICBpZiBub3QgZXh0cmFzX3NwZWM6CiAgICAgICAgICAgIHJldHVybiAoKQogICAgICAgIHJlcSA9IFJlcXVpcmVtZW50LnBhcnNlKCd4JyArIGV4dHJhc19zcGVjKQogICAgICAgIGlmIHJlcS5zcGVjczoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigpCiAgICAgICAgcmV0dXJuIHJlcS5leHRyYXMKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBwYXJzZV9ncm91cChjbHMsIGdyb3VwLCBsaW5lcywgZGlzdD1Ob25lKToKICAgICAgICAiIiJQYXJzZSBhbiBlbnRyeSBwb2ludCBncm91cCIiIgogICAgICAgIGlmIG5vdCBNT0RVTEUoZ3JvdXApOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJbnZhbGlkIGdyb3VwIG5hbWUiLCBncm91cCkKICAgICAgICB0aGlzID0ge30KICAgICAgICBmb3IgbGluZSBpbiB5aWVsZF9saW5lcyhsaW5lcyk6CiAgICAgICAgICAgIGVwID0gY2xzLnBhcnNlKGxpbmUsIGRpc3QpCiAgICAgICAgICAgIGlmIGVwLm5hbWUgaW4gdGhpczoKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkR1cGxpY2F0ZSBlbnRyeSBwb2ludCIsIGdyb3VwLCBlcC5uYW1lKQogICAgICAgICAgICB0aGlzW2VwLm5hbWVdID0gZXAKICAgICAgICByZXR1cm4gdGhpcwoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIHBhcnNlX21hcChjbHMsIGRhdGEsIGRpc3Q9Tm9uZSk6CiAgICAgICAgIiIiUGFyc2UgYSBtYXAgb2YgZW50cnkgcG9pbnQgZ3JvdXBzIiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZShkYXRhLCBkaWN0KToKICAgICAgICAgICAgZGF0YSA9IGRhdGEuaXRlbXMoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGRhdGEgPSBzcGxpdF9zZWN0aW9ucyhkYXRhKQogICAgICAgIG1hcHMgPSB7fQogICAgICAgIGZvciBncm91cCwgbGluZXMgaW4gZGF0YToKICAgICAgICAgICAgaWYgZ3JvdXAgaXMgTm9uZToKICAgICAgICAgICAgICAgIGlmIG5vdCBsaW5lczoKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiRW50cnkgcG9pbnRzIG11c3QgYmUgbGlzdGVkIGluIGdyb3VwcyIpCiAgICAgICAgICAgIGdyb3VwID0gZ3JvdXAuc3RyaXAoKQogICAgICAgICAgICBpZiBncm91cCBpbiBtYXBzOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiRHVwbGljYXRlIGdyb3VwIG5hbWUiLCBncm91cCkKICAgICAgICAgICAgbWFwc1tncm91cF0gPSBjbHMucGFyc2VfZ3JvdXAoZ3JvdXAsIGxpbmVzLCBkaXN0KQogICAgICAgIHJldHVybiBtYXBzCgoKZGVmIF9yZW1vdmVfbWQ1X2ZyYWdtZW50KGxvY2F0aW9uKToKICAgIGlmIG5vdCBsb2NhdGlvbjoKICAgICAgICByZXR1cm4gJycKICAgIHBhcnNlZCA9IHVybGxpYi5wYXJzZS51cmxwYXJzZShsb2NhdGlvbikKICAgIGlmIHBhcnNlZFstMV0uc3RhcnRzd2l0aCgnbWQ1PScpOgogICAgICAgIHJldHVybiB1cmxsaWIucGFyc2UudXJsdW5wYXJzZShwYXJzZWRbOi0xXSArICgnJywpKQogICAgcmV0dXJuIGxvY2F0aW9uCgoKZGVmIF92ZXJzaW9uX2Zyb21fZmlsZShsaW5lcyk6CiAgICAiIiIKICAgIEdpdmVuIGFuIGl0ZXJhYmxlIG9mIGxpbmVzIGZyb20gYSBNZXRhZGF0YSBmaWxlLCByZXR1cm4KICAgIHRoZSB2YWx1ZSBvZiB0aGUgVmVyc2lvbiBmaWVsZCwgaWYgcHJlc2VudCwgb3IgTm9uZSBvdGhlcndpc2UuCiAgICAiIiIKICAgIGlzX3ZlcnNpb25fbGluZSA9IGxhbWJkYSBsaW5lOiBsaW5lLmxvd2VyKCkuc3RhcnRzd2l0aCgndmVyc2lvbjonKQogICAgdmVyc2lvbl9saW5lcyA9IGZpbHRlcihpc192ZXJzaW9uX2xpbmUsIGxpbmVzKQogICAgbGluZSA9IG5leHQoaXRlcih2ZXJzaW9uX2xpbmVzKSwgJycpCiAgICBfLCBfLCB2YWx1ZSA9IGxpbmUucGFydGl0aW9uKCc6JykKICAgIHJldHVybiBzYWZlX3ZlcnNpb24odmFsdWUuc3RyaXAoKSkgb3IgTm9uZQoKCmNsYXNzIERpc3RyaWJ1dGlvbihvYmplY3QpOgogICAgIiIiV3JhcCBhbiBhY3R1YWwgb3IgcG90ZW50aWFsIHN5cy5wYXRoIGVudHJ5IHcvbWV0YWRhdGEiIiIKICAgIFBLR19JTkZPID0gJ1BLRy1JTkZPJwoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsb2NhdGlvbj1Ob25lLCBtZXRhZGF0YT1Ob25lLCBwcm9qZWN0X25hbWU9Tm9uZSwKICAgICAgICAgICAgdmVyc2lvbj1Ob25lLCBweV92ZXJzaW9uPVBZX01BSk9SLCBwbGF0Zm9ybT1Ob25lLAogICAgICAgICAgICBwcmVjZWRlbmNlPUVHR19ESVNUKToKICAgICAgICBzZWxmLnByb2plY3RfbmFtZSA9IHNhZmVfbmFtZShwcm9qZWN0X25hbWUgb3IgJ1Vua25vd24nKQogICAgICAgIGlmIHZlcnNpb24gaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYuX3ZlcnNpb24gPSBzYWZlX3ZlcnNpb24odmVyc2lvbikKICAgICAgICBzZWxmLnB5X3ZlcnNpb24gPSBweV92ZXJzaW9uCiAgICAgICAgc2VsZi5wbGF0Zm9ybSA9IHBsYXRmb3JtCiAgICAgICAgc2VsZi5sb2NhdGlvbiA9IGxvY2F0aW9uCiAgICAgICAgc2VsZi5wcmVjZWRlbmNlID0gcHJlY2VkZW5jZQogICAgICAgIHNlbGYuX3Byb3ZpZGVyID0gbWV0YWRhdGEgb3IgZW1wdHlfcHJvdmlkZXIKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBmcm9tX2xvY2F0aW9uKGNscywgbG9jYXRpb24sIGJhc2VuYW1lLCBtZXRhZGF0YT1Ob25lLCAqKmt3KToKICAgICAgICBwcm9qZWN0X25hbWUsIHZlcnNpb24sIHB5X3ZlcnNpb24sIHBsYXRmb3JtID0gW05vbmVdICogNAogICAgICAgIGJhc2VuYW1lLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KGJhc2VuYW1lKQogICAgICAgIGlmIGV4dC5sb3dlcigpIGluIF9kaXN0cmlidXRpb25JbXBsOgogICAgICAgICAgICBjbHMgPSBfZGlzdHJpYnV0aW9uSW1wbFtleHQubG93ZXIoKV0KCiAgICAgICAgICAgIG1hdGNoID0gRUdHX05BTUUoYmFzZW5hbWUpCiAgICAgICAgICAgIGlmIG1hdGNoOgogICAgICAgICAgICAgICAgcHJvamVjdF9uYW1lLCB2ZXJzaW9uLCBweV92ZXJzaW9uLCBwbGF0Zm9ybSA9IG1hdGNoLmdyb3VwKAogICAgICAgICAgICAgICAgICAgICduYW1lJywgJ3ZlcicsICdweXZlcicsICdwbGF0JwogICAgICAgICAgICAgICAgKQogICAgICAgIHJldHVybiBjbHMoCiAgICAgICAgICAgIGxvY2F0aW9uLCBtZXRhZGF0YSwgcHJvamVjdF9uYW1lPXByb2plY3RfbmFtZSwgdmVyc2lvbj12ZXJzaW9uLAogICAgICAgICAgICBweV92ZXJzaW9uPXB5X3ZlcnNpb24sIHBsYXRmb3JtPXBsYXRmb3JtLCAqKmt3CiAgICAgICAgKS5fcmVsb2FkX3ZlcnNpb24oKQoKICAgIGRlZiBfcmVsb2FkX3ZlcnNpb24oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBAcHJvcGVydHkKICAgIGRlZiBoYXNoY21wKHNlbGYpOgogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgIHNlbGYucGFyc2VkX3ZlcnNpb24sCiAgICAgICAgICAgIHNlbGYucHJlY2VkZW5jZSwKICAgICAgICAgICAgc2VsZi5rZXksCiAgICAgICAgICAgIF9yZW1vdmVfbWQ1X2ZyYWdtZW50KHNlbGYubG9jYXRpb24pLAogICAgICAgICAgICBzZWxmLnB5X3ZlcnNpb24gb3IgJycsCiAgICAgICAgICAgIHNlbGYucGxhdGZvcm0gb3IgJycsCiAgICAgICAgKQoKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gaGFzaChzZWxmLmhhc2hjbXApCgogICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuaGFzaGNtcCA8IG90aGVyLmhhc2hjbXAKCiAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5oYXNoY21wIDw9IG90aGVyLmhhc2hjbXAKCiAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5oYXNoY21wID4gb3RoZXIuaGFzaGNtcAoKICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLmhhc2hjbXAgPj0gb3RoZXIuaGFzaGNtcAoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXyk6CiAgICAgICAgICAgICMgSXQncyBub3QgYSBEaXN0cmlidXRpb24sIHNvIHRoZXkgYXJlIG5vdCBlcXVhbAogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICByZXR1cm4gc2VsZi5oYXNoY21wID09IG90aGVyLmhhc2hjbXAKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gbm90IHNlbGYgPT0gb3RoZXIKCiAgICAjIFRoZXNlIHByb3BlcnRpZXMgaGF2ZSB0byBiZSBsYXp5IHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBsb2FkIGFueQogICAgIyBtZXRhZGF0YSB1bnRpbC91bmxlc3MgaXQncyBhY3R1YWxseSBuZWVkZWQuICAoaS5lLiwgc29tZSBkaXN0cmlidXRpb25zCiAgICAjIG1heSBub3Qga25vdyB0aGVpciBuYW1lIG9yIHZlcnNpb24gd2l0aG91dCBsb2FkaW5nIFBLRy1JTkZPKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGtleShzZWxmKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9rZXkKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIHNlbGYuX2tleSA9IGtleSA9IHNlbGYucHJvamVjdF9uYW1lLmxvd2VyKCkKICAgICAgICAgICAgcmV0dXJuIGtleQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHBhcnNlZF92ZXJzaW9uKHNlbGYpOgogICAgICAgIGlmIG5vdCBoYXNhdHRyKHNlbGYsICJfcGFyc2VkX3ZlcnNpb24iKToKICAgICAgICAgICAgc2VsZi5fcGFyc2VkX3ZlcnNpb24gPSBwYXJzZV92ZXJzaW9uKHNlbGYudmVyc2lvbikKCiAgICAgICAgcmV0dXJuIHNlbGYuX3BhcnNlZF92ZXJzaW9uCgogICAgZGVmIF93YXJuX2xlZ2FjeV92ZXJzaW9uKHNlbGYpOgogICAgICAgIExWID0gcGFja2FnaW5nLnZlcnNpb24uTGVnYWN5VmVyc2lvbgogICAgICAgIGlzX2xlZ2FjeSA9IGlzaW5zdGFuY2Uoc2VsZi5fcGFyc2VkX3ZlcnNpb24sIExWKQogICAgICAgIGlmIG5vdCBpc19sZWdhY3k6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIFdoaWxlIGFuIGVtcHR5IHZlcnNpb24gaXMgdGVjaG5pY2FsbHkgYSBsZWdhY3kgdmVyc2lvbiBhbmQKICAgICAgICAjIGlzIG5vdCBhIHZhbGlkIFBFUCA0NDAgdmVyc2lvbiwgaXQncyBhbHNvIHVubGlrZWx5IHRvCiAgICAgICAgIyBhY3R1YWxseSBjb21lIGZyb20gc29tZW9uZSBhbmQgaW5zdGVhZCBpdCBpcyBtb3JlIGxpa2VseSB0aGF0CiAgICAgICAgIyBpdCBjb21lcyBmcm9tIHNldHVwdG9vbHMgYXR0ZW1wdGluZyB0byBwYXJzZSBhIGZpbGVuYW1lIGFuZAogICAgICAgICMgaW5jbHVkaW5nIGl0IGluIHRoZSBsaXN0LiBTbyBmb3IgdGhhdCB3ZSdsbCBnYXRlIHRoaXMgd2FybmluZwogICAgICAgICMgb24gaWYgdGhlIHZlcnNpb24gaXMgYW55dGhpbmcgYXQgYWxsIG9yIG5vdC4KICAgICAgICBpZiBub3Qgc2VsZi52ZXJzaW9uOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgdG1wbCA9IHRleHR3cmFwLmRlZGVudCgiIiIKICAgICAgICAgICAgJ3twcm9qZWN0X25hbWV9ICh7dmVyc2lvbn0pJyBpcyBiZWluZyBwYXJzZWQgYXMgYSBsZWdhY3ksCiAgICAgICAgICAgIG5vbiBQRVAgNDQwLAogICAgICAgICAgICB2ZXJzaW9uLiBZb3UgbWF5IGZpbmQgb2RkIGJlaGF2aW9yIGFuZCBzb3J0IG9yZGVyLgogICAgICAgICAgICBJbiBwYXJ0aWN1bGFyIGl0IHdpbGwgYmUgc29ydGVkIGFzIGxlc3MgdGhhbiAwLjAuIEl0CiAgICAgICAgICAgIGlzIHJlY29tbWVuZGVkIHRvIG1pZ3JhdGUgdG8gUEVQIDQ0MCBjb21wYXRpYmxlCiAgICAgICAgICAgIHZlcnNpb25zLgogICAgICAgICAgICAiIiIpLnN0cmlwKCkucmVwbGFjZSgnXG4nLCAnICcpCgogICAgICAgIHdhcm5pbmdzLndhcm4odG1wbC5mb3JtYXQoKip2YXJzKHNlbGYpKSwgUEVQNDQwV2FybmluZykKCiAgICBAcHJvcGVydHkKICAgIGRlZiB2ZXJzaW9uKHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3ZlcnNpb24KICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIHZlcnNpb24gPSBfdmVyc2lvbl9mcm9tX2ZpbGUoc2VsZi5fZ2V0X21ldGFkYXRhKHNlbGYuUEtHX0lORk8pKQogICAgICAgICAgICBpZiB2ZXJzaW9uIGlzIE5vbmU6CiAgICAgICAgICAgICAgICB0bXBsID0gIk1pc3NpbmcgJ1ZlcnNpb246JyBoZWFkZXIgYW5kL29yICVzIGZpbGUiCiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKHRtcGwgJSBzZWxmLlBLR19JTkZPLCBzZWxmKQogICAgICAgICAgICByZXR1cm4gdmVyc2lvbgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIF9kZXBfbWFwKHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19kZXBfbWFwCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBkbSA9IHNlbGYuX19kZXBfbWFwID0ge05vbmU6IFtdfQogICAgICAgICAgICBmb3IgbmFtZSBpbiAncmVxdWlyZXMudHh0JywgJ2RlcGVuZHMudHh0JzoKICAgICAgICAgICAgICAgIGZvciBleHRyYSwgcmVxcyBpbiBzcGxpdF9zZWN0aW9ucyhzZWxmLl9nZXRfbWV0YWRhdGEobmFtZSkpOgogICAgICAgICAgICAgICAgICAgIGlmIGV4dHJhOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAnOicgaW4gZXh0cmE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYSwgbWFya2VyID0gZXh0cmEuc3BsaXQoJzonLCAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgaW52YWxpZF9tYXJrZXIobWFya2VyKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFhYWCB3YXJuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxcyA9IFtdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGlmIG5vdCBldmFsdWF0ZV9tYXJrZXIobWFya2VyKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXFzID0gW10KICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmEgPSBzYWZlX2V4dHJhKGV4dHJhKSBvciBOb25lCiAgICAgICAgICAgICAgICAgICAgZG0uc2V0ZGVmYXVsdChleHRyYSwgW10pLmV4dGVuZChwYXJzZV9yZXF1aXJlbWVudHMocmVxcykpCiAgICAgICAgICAgIHJldHVybiBkbQoKICAgIGRlZiByZXF1aXJlcyhzZWxmLCBleHRyYXM9KCkpOgogICAgICAgICIiIkxpc3Qgb2YgUmVxdWlyZW1lbnRzIG5lZWRlZCBmb3IgdGhpcyBkaXN0cm8gaWYgYGV4dHJhc2AgYXJlIHVzZWQiIiIKICAgICAgICBkbSA9IHNlbGYuX2RlcF9tYXAKICAgICAgICBkZXBzID0gW10KICAgICAgICBkZXBzLmV4dGVuZChkbS5nZXQoTm9uZSwgKCkpKQogICAgICAgIGZvciBleHQgaW4gZXh0cmFzOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBkZXBzLmV4dGVuZChkbVtzYWZlX2V4dHJhKGV4dCldKQogICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICAgICByYWlzZSBVbmtub3duRXh0cmEoCiAgICAgICAgICAgICAgICAgICAgIiVzIGhhcyBubyBzdWNoIGV4dHJhIGZlYXR1cmUgJXIiICUgKHNlbGYsIGV4dCkKICAgICAgICAgICAgICAgICkKICAgICAgICByZXR1cm4gZGVwcwoKICAgIGRlZiBfZ2V0X21ldGFkYXRhKHNlbGYsIG5hbWUpOgogICAgICAgIGlmIHNlbGYuaGFzX21ldGFkYXRhKG5hbWUpOgogICAgICAgICAgICBmb3IgbGluZSBpbiBzZWxmLmdldF9tZXRhZGF0YV9saW5lcyhuYW1lKToKICAgICAgICAgICAgICAgIHlpZWxkIGxpbmUKCiAgICBkZWYgYWN0aXZhdGUoc2VsZiwgcGF0aD1Ob25lLCByZXBsYWNlPUZhbHNlKToKICAgICAgICAiIiJFbnN1cmUgZGlzdHJpYnV0aW9uIGlzIGltcG9ydGFibGUgb24gYHBhdGhgIChkZWZhdWx0PXN5cy5wYXRoKSIiIgogICAgICAgIGlmIHBhdGggaXMgTm9uZToKICAgICAgICAgICAgcGF0aCA9IHN5cy5wYXRoCiAgICAgICAgc2VsZi5pbnNlcnRfb24ocGF0aCwgcmVwbGFjZT1yZXBsYWNlKQogICAgICAgIGlmIHBhdGggaXMgc3lzLnBhdGg6CiAgICAgICAgICAgIGZpeHVwX25hbWVzcGFjZV9wYWNrYWdlcyhzZWxmLmxvY2F0aW9uKQogICAgICAgICAgICBmb3IgcGtnIGluIHNlbGYuX2dldF9tZXRhZGF0YSgnbmFtZXNwYWNlX3BhY2thZ2VzLnR4dCcpOgogICAgICAgICAgICAgICAgaWYgcGtnIGluIHN5cy5tb2R1bGVzOgogICAgICAgICAgICAgICAgICAgIGRlY2xhcmVfbmFtZXNwYWNlKHBrZykKCiAgICBkZWYgZWdnX25hbWUoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIHdoYXQgdGhpcyBkaXN0cmlidXRpb24ncyBzdGFuZGFyZCAuZWdnIGZpbGVuYW1lIHNob3VsZCBiZSIiIgogICAgICAgIGZpbGVuYW1lID0gIiVzLSVzLXB5JXMiICUgKAogICAgICAgICAgICB0b19maWxlbmFtZShzZWxmLnByb2plY3RfbmFtZSksIHRvX2ZpbGVuYW1lKHNlbGYudmVyc2lvbiksCiAgICAgICAgICAgIHNlbGYucHlfdmVyc2lvbiBvciBQWV9NQUpPUgogICAgICAgICkKCiAgICAgICAgaWYgc2VsZi5wbGF0Zm9ybToKICAgICAgICAgICAgZmlsZW5hbWUgKz0gJy0nICsgc2VsZi5wbGF0Zm9ybQogICAgICAgIHJldHVybiBmaWxlbmFtZQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICBpZiBzZWxmLmxvY2F0aW9uOgogICAgICAgICAgICByZXR1cm4gIiVzICglcykiICUgKHNlbGYsIHNlbGYubG9jYXRpb24pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHN0cihzZWxmKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgdmVyc2lvbiA9IGdldGF0dHIoc2VsZiwgJ3ZlcnNpb24nLCBOb25lKQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICB2ZXJzaW9uID0gTm9uZQogICAgICAgIHZlcnNpb24gPSB2ZXJzaW9uIG9yICJbdW5rbm93biB2ZXJzaW9uXSIKICAgICAgICByZXR1cm4gIiVzICVzIiAlIChzZWxmLnByb2plY3RfbmFtZSwgdmVyc2lvbikKCiAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgYXR0cik6CiAgICAgICAgIiIiRGVsZWdhdGUgYWxsIHVucmVjb2duaXplZCBwdWJsaWMgYXR0cmlidXRlcyB0byAubWV0YWRhdGEgcHJvdmlkZXIiIiIKICAgICAgICBpZiBhdHRyLnN0YXJ0c3dpdGgoJ18nKToKICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IoYXR0cikKICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLl9wcm92aWRlciwgYXR0cikKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBmcm9tX2ZpbGVuYW1lKGNscywgZmlsZW5hbWUsIG1ldGFkYXRhPU5vbmUsICoqa3cpOgogICAgICAgIHJldHVybiBjbHMuZnJvbV9sb2NhdGlvbigKICAgICAgICAgICAgX25vcm1hbGl6ZV9jYWNoZWQoZmlsZW5hbWUpLCBvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKSwgbWV0YWRhdGEsCiAgICAgICAgICAgICoqa3cKICAgICAgICApCgogICAgZGVmIGFzX3JlcXVpcmVtZW50KHNlbGYpOgogICAgICAgICIiIlJldHVybiBhIGBgUmVxdWlyZW1lbnRgYCB0aGF0IG1hdGNoZXMgdGhpcyBkaXN0cmlidXRpb24gZXhhY3RseSIiIgogICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5wYXJzZWRfdmVyc2lvbiwgcGFja2FnaW5nLnZlcnNpb24uVmVyc2lvbik6CiAgICAgICAgICAgIHNwZWMgPSAiJXM9PSVzIiAlIChzZWxmLnByb2plY3RfbmFtZSwgc2VsZi5wYXJzZWRfdmVyc2lvbikKICAgICAgICBlbHNlOgogICAgICAgICAgICBzcGVjID0gIiVzPT09JXMiICUgKHNlbGYucHJvamVjdF9uYW1lLCBzZWxmLnBhcnNlZF92ZXJzaW9uKQoKICAgICAgICByZXR1cm4gUmVxdWlyZW1lbnQucGFyc2Uoc3BlYykKCiAgICBkZWYgbG9hZF9lbnRyeV9wb2ludChzZWxmLCBncm91cCwgbmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIHRoZSBgbmFtZWAgZW50cnkgcG9pbnQgb2YgYGdyb3VwYCBvciByYWlzZSBJbXBvcnRFcnJvciIiIgogICAgICAgIGVwID0gc2VsZi5nZXRfZW50cnlfaW5mbyhncm91cCwgbmFtZSkKICAgICAgICBpZiBlcCBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigiRW50cnkgcG9pbnQgJXIgbm90IGZvdW5kIiAlICgoZ3JvdXAsIG5hbWUpLCkpCiAgICAgICAgcmV0dXJuIGVwLmxvYWQoKQoKICAgIGRlZiBnZXRfZW50cnlfbWFwKHNlbGYsIGdyb3VwPU5vbmUpOgogICAgICAgICIiIlJldHVybiB0aGUgZW50cnkgcG9pbnQgbWFwIGZvciBgZ3JvdXBgLCBvciB0aGUgZnVsbCBlbnRyeSBtYXAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIGVwX21hcCA9IHNlbGYuX2VwX21hcAogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgZXBfbWFwID0gc2VsZi5fZXBfbWFwID0gRW50cnlQb2ludC5wYXJzZV9tYXAoCiAgICAgICAgICAgICAgICBzZWxmLl9nZXRfbWV0YWRhdGEoJ2VudHJ5X3BvaW50cy50eHQnKSwgc2VsZgogICAgICAgICAgICApCiAgICAgICAgaWYgZ3JvdXAgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBlcF9tYXAuZ2V0KGdyb3VwLCB7fSkKICAgICAgICByZXR1cm4gZXBfbWFwCgogICAgZGVmIGdldF9lbnRyeV9pbmZvKHNlbGYsIGdyb3VwLCBuYW1lKToKICAgICAgICAiIiJSZXR1cm4gdGhlIEVudHJ5UG9pbnQgb2JqZWN0IGZvciBgZ3JvdXBgK2BuYW1lYCwgb3IgYGBOb25lYGAiIiIKICAgICAgICByZXR1cm4gc2VsZi5nZXRfZW50cnlfbWFwKGdyb3VwKS5nZXQobmFtZSkKCiAgICBkZWYgaW5zZXJ0X29uKHNlbGYsIHBhdGgsIGxvYz1Ob25lLCByZXBsYWNlPUZhbHNlKToKICAgICAgICAiIiJFbnN1cmUgc2VsZi5sb2NhdGlvbiBpcyBvbiBwYXRoCgogICAgICAgIElmIHJlcGxhY2U9RmFsc2UgKGRlZmF1bHQpOgogICAgICAgICAgICAtIElmIGxvY2F0aW9uIGlzIGFscmVhZHkgaW4gcGF0aCBhbnl3aGVyZSwgZG8gbm90aGluZy4KICAgICAgICAgICAgLSBFbHNlOgogICAgICAgICAgICAgIC0gSWYgaXQncyBhbiBlZ2cgYW5kIGl0cyBwYXJlbnQgZGlyZWN0b3J5IGlzIG9uIHBhdGgsCiAgICAgICAgICAgICAgICBpbnNlcnQganVzdCBhaGVhZCBvZiB0aGUgcGFyZW50LgogICAgICAgICAgICAgIC0gRWxzZTogYWRkIHRvIHRoZSBlbmQgb2YgcGF0aC4KICAgICAgICBJZiByZXBsYWNlPVRydWU6CiAgICAgICAgICAgIC0gSWYgbG9jYXRpb24gaXMgYWxyZWFkeSBvbiBwYXRoIGFueXdoZXJlIChub3QgZWdncykKICAgICAgICAgICAgICBvciBoaWdoZXIgcHJpb3JpdHkgdGhhbiBpdHMgcGFyZW50IChlZ2dzKQogICAgICAgICAgICAgIGRvIG5vdGhpbmcuCiAgICAgICAgICAgIC0gRWxzZToKICAgICAgICAgICAgICAtIElmIGl0J3MgYW4gZWdnIGFuZCBpdHMgcGFyZW50IGRpcmVjdG9yeSBpcyBvbiBwYXRoLAogICAgICAgICAgICAgICAgaW5zZXJ0IGp1c3QgYWhlYWQgb2YgdGhlIHBhcmVudCwKICAgICAgICAgICAgICAgIHJlbW92aW5nIGFueSBsb3dlci1wcmlvcml0eSBlbnRyaWVzLgogICAgICAgICAgICAgIC0gRWxzZTogYWRkIGl0IHRvIHRoZSBmcm9udCBvZiBwYXRoLgogICAgICAgICIiIgoKICAgICAgICBsb2MgPSBsb2Mgb3Igc2VsZi5sb2NhdGlvbgogICAgICAgIGlmIG5vdCBsb2M6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBubG9jID0gX25vcm1hbGl6ZV9jYWNoZWQobG9jKQogICAgICAgIGJkaXIgPSBvcy5wYXRoLmRpcm5hbWUobmxvYykKICAgICAgICBucGF0aCA9IFsocCBhbmQgX25vcm1hbGl6ZV9jYWNoZWQocCkgb3IgcCkgZm9yIHAgaW4gcGF0aF0KCiAgICAgICAgZm9yIHAsIGl0ZW0gaW4gZW51bWVyYXRlKG5wYXRoKToKICAgICAgICAgICAgaWYgaXRlbSA9PSBubG9jOgogICAgICAgICAgICAgICAgaWYgcmVwbGFjZToKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAjIGRvbid0IG1vZGlmeSBwYXRoIChldmVuIHJlbW92aW5nIGR1cGxpY2F0ZXMpIGlmIGZvdW5kIGFuZCBub3QgcmVwbGFjZQogICAgICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBlbGlmIGl0ZW0gPT0gYmRpciBhbmQgc2VsZi5wcmVjZWRlbmNlID09IEVHR19ESVNUOgogICAgICAgICAgICAgICAgIyBpZiBpdCdzIGFuIC5lZ2csIGdpdmUgaXQgcHJlY2VkZW5jZSBvdmVyIGl0cyBkaXJlY3RvcnkKICAgICAgICAgICAgICAgICMgVU5MRVNTIGl0J3MgYWxyZWFkeSBiZWVuIGFkZGVkIHRvIHN5cy5wYXRoIGFuZCByZXBsYWNlPUZhbHNlCiAgICAgICAgICAgICAgICBpZiAobm90IHJlcGxhY2UpIGFuZCBubG9jIGluIG5wYXRoW3A6XToKICAgICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICAgIGlmIHBhdGggaXMgc3lzLnBhdGg6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5jaGVja192ZXJzaW9uX2NvbmZsaWN0KCkKICAgICAgICAgICAgICAgIHBhdGguaW5zZXJ0KHAsIGxvYykKICAgICAgICAgICAgICAgIG5wYXRoLmluc2VydChwLCBubG9jKQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBwYXRoIGlzIHN5cy5wYXRoOgogICAgICAgICAgICAgICAgc2VsZi5jaGVja192ZXJzaW9uX2NvbmZsaWN0KCkKICAgICAgICAgICAgaWYgcmVwbGFjZToKICAgICAgICAgICAgICAgIHBhdGguaW5zZXJ0KDAsIGxvYykKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kKGxvYykKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICMgcCBpcyB0aGUgc3BvdCB3aGVyZSB3ZSBmb3VuZCBvciBpbnNlcnRlZCBsb2M7IG5vdyByZW1vdmUgZHVwbGljYXRlcwogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIG5wID0gbnBhdGguaW5kZXgobmxvYywgcCArIDEpCiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGRlbCBucGF0aFtucF0sIHBhdGhbbnBdCiAgICAgICAgICAgICAgICAjIGhhIQogICAgICAgICAgICAgICAgcCA9IG5wCgogICAgICAgIHJldHVybgoKICAgIGRlZiBjaGVja192ZXJzaW9uX2NvbmZsaWN0KHNlbGYpOgogICAgICAgIGlmIHNlbGYua2V5ID09ICdzZXR1cHRvb2xzJzoKICAgICAgICAgICAgIyBpZ25vcmUgdGhlIGluZXZpdGFibGUgc2V0dXB0b29scyBzZWxmLWNvbmZsaWN0cyAgOigKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIG5zcCA9IGRpY3QuZnJvbWtleXMoc2VsZi5fZ2V0X21ldGFkYXRhKCduYW1lc3BhY2VfcGFja2FnZXMudHh0JykpCiAgICAgICAgbG9jID0gbm9ybWFsaXplX3BhdGgoc2VsZi5sb2NhdGlvbikKICAgICAgICBmb3IgbW9kbmFtZSBpbiBzZWxmLl9nZXRfbWV0YWRhdGEoJ3RvcF9sZXZlbC50eHQnKToKICAgICAgICAgICAgaWYgKG1vZG5hbWUgbm90IGluIHN5cy5tb2R1bGVzIG9yIG1vZG5hbWUgaW4gbnNwCiAgICAgICAgICAgICAgICAgICAgb3IgbW9kbmFtZSBpbiBfbmFtZXNwYWNlX3BhY2thZ2VzKToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIG1vZG5hbWUgaW4gKCdwa2dfcmVzb3VyY2VzJywgJ3NldHVwdG9vbHMnLCAnc2l0ZScpOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgZm4gPSBnZXRhdHRyKHN5cy5tb2R1bGVzW21vZG5hbWVdLCAnX19maWxlX18nLCBOb25lKQogICAgICAgICAgICBpZiBmbiBhbmQgKG5vcm1hbGl6ZV9wYXRoKGZuKS5zdGFydHN3aXRoKGxvYykgb3IKICAgICAgICAgICAgICAgICAgICAgICBmbi5zdGFydHN3aXRoKHNlbGYubG9jYXRpb24pKToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlzc3VlX3dhcm5pbmcoCiAgICAgICAgICAgICAgICAiTW9kdWxlICVzIHdhcyBhbHJlYWR5IGltcG9ydGVkIGZyb20gJXMsIGJ1dCAlcyBpcyBiZWluZyBhZGRlZCIKICAgICAgICAgICAgICAgICIgdG8gc3lzLnBhdGgiICUgKG1vZG5hbWUsIGZuLCBzZWxmLmxvY2F0aW9uKSwKICAgICAgICAgICAgKQoKICAgIGRlZiBoYXNfdmVyc2lvbihzZWxmKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYudmVyc2lvbgogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICBpc3N1ZV93YXJuaW5nKCJVbmJ1aWx0IGVnZyBmb3IgIiArIHJlcHIoc2VsZikpCiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGNsb25lKHNlbGYsICoqa3cpOgogICAgICAgICIiIkNvcHkgdGhpcyBkaXN0cmlidXRpb24sIHN1YnN0aXR1dGluZyBpbiBhbnkgY2hhbmdlZCBrZXl3b3JkIGFyZ3MiIiIKICAgICAgICBuYW1lcyA9ICdwcm9qZWN0X25hbWUgdmVyc2lvbiBweV92ZXJzaW9uIHBsYXRmb3JtIGxvY2F0aW9uIHByZWNlZGVuY2UnCiAgICAgICAgZm9yIGF0dHIgaW4gbmFtZXMuc3BsaXQoKToKICAgICAgICAgICAga3cuc2V0ZGVmYXVsdChhdHRyLCBnZXRhdHRyKHNlbGYsIGF0dHIsIE5vbmUpKQogICAgICAgIGt3LnNldGRlZmF1bHQoJ21ldGFkYXRhJywgc2VsZi5fcHJvdmlkZXIpCiAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKCoqa3cpCgogICAgQHByb3BlcnR5CiAgICBkZWYgZXh0cmFzKHNlbGYpOgogICAgICAgIHJldHVybiBbZGVwIGZvciBkZXAgaW4gc2VsZi5fZGVwX21hcCBpZiBkZXBdCgoKY2xhc3MgRWdnSW5mb0Rpc3RyaWJ1dGlvbihEaXN0cmlidXRpb24pOgogICAgZGVmIF9yZWxvYWRfdmVyc2lvbihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBQYWNrYWdlcyBpbnN0YWxsZWQgYnkgZGlzdHV0aWxzIChlLmcuIG51bXB5IG9yIHNjaXB5KSwKICAgICAgICB3aGljaCB1c2VzIGFuIG9sZCBzYWZlX3ZlcnNpb24sIGFuZCBzbwogICAgICAgIHRoZWlyIHZlcnNpb24gbnVtYmVycyBjYW4gZ2V0IG1hbmdsZWQgd2hlbgogICAgICAgIGNvbnZlcnRlZCB0byBmaWxlbmFtZXMgKGUuZy4sIDEuMTEuMC5kZXYwKzIzMjllYWUgdG8KICAgICAgICAxLjExLjAuZGV2MF8yMzI5ZWFlKS4gVGhlc2UgZGlzdHJpYnV0aW9ucyB3aWxsIG5vdCBiZQogICAgICAgIHBhcnNlZCBwcm9wZXJseQogICAgICAgIGRvd25zdHJlYW0gYnkgRGlzdHJpYnV0aW9uIGFuZCBzYWZlX3ZlcnNpb24sIHNvCiAgICAgICAgdGFrZSBhbiBleHRyYSBzdGVwIGFuZCB0cnkgdG8gZ2V0IHRoZSB2ZXJzaW9uIG51bWJlciBmcm9tCiAgICAgICAgdGhlIG1ldGFkYXRhIGZpbGUgaXRzZWxmIGluc3RlYWQgb2YgdGhlIGZpbGVuYW1lLgogICAgICAgICIiIgogICAgICAgIG1kX3ZlcnNpb24gPSBfdmVyc2lvbl9mcm9tX2ZpbGUoc2VsZi5fZ2V0X21ldGFkYXRhKHNlbGYuUEtHX0lORk8pKQogICAgICAgIGlmIG1kX3ZlcnNpb246CiAgICAgICAgICAgIHNlbGYuX3ZlcnNpb24gPSBtZF92ZXJzaW9uCiAgICAgICAgcmV0dXJuIHNlbGYKCgpjbGFzcyBEaXN0SW5mb0Rpc3RyaWJ1dGlvbihEaXN0cmlidXRpb24pOgogICAgIiIiV3JhcCBhbiBhY3R1YWwgb3IgcG90ZW50aWFsIHN5cy5wYXRoIGVudHJ5IHcvbWV0YWRhdGEsIC5kaXN0LWluZm8gc3R5bGUiIiIKICAgIFBLR19JTkZPID0gJ01FVEFEQVRBJwogICAgRVFFUSA9IHJlLmNvbXBpbGUociIoW1woLF0pXHMqKFxkLio/KVxzKihbLFwpXSkiKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIF9wYXJzZWRfcGtnX2luZm8oc2VsZik6CiAgICAgICAgIiIiUGFyc2UgYW5kIGNhY2hlIG1ldGFkYXRhIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5fcGtnX2luZm8KICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIG1ldGFkYXRhID0gc2VsZi5nZXRfbWV0YWRhdGEoc2VsZi5QS0dfSU5GTykKICAgICAgICAgICAgc2VsZi5fcGtnX2luZm8gPSBlbWFpbC5wYXJzZXIuUGFyc2VyKCkucGFyc2VzdHIobWV0YWRhdGEpCiAgICAgICAgICAgIHJldHVybiBzZWxmLl9wa2dfaW5mbwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIF9kZXBfbWFwKHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19kZXBfbWFwCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBzZWxmLl9fZGVwX21hcCA9IHNlbGYuX2NvbXB1dGVfZGVwZW5kZW5jaWVzKCkKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19kZXBfbWFwCgogICAgZGVmIF9jb21wdXRlX2RlcGVuZGVuY2llcyhzZWxmKToKICAgICAgICAiIiJSZWNvbXB1dGUgdGhpcyBkaXN0cmlidXRpb24ncyBkZXBlbmRlbmNpZXMuIiIiCiAgICAgICAgZG0gPSBzZWxmLl9fZGVwX21hcCA9IHtOb25lOiBbXX0KCiAgICAgICAgcmVxcyA9IFtdCiAgICAgICAgIyBJbmNsdWRpbmcgYW55IGNvbmRpdGlvbiBleHByZXNzaW9ucwogICAgICAgIGZvciByZXEgaW4gc2VsZi5fcGFyc2VkX3BrZ19pbmZvLmdldF9hbGwoJ1JlcXVpcmVzLURpc3QnKSBvciBbXToKICAgICAgICAgICAgcmVxcy5leHRlbmQocGFyc2VfcmVxdWlyZW1lbnRzKHJlcSkpCgogICAgICAgIGRlZiByZXFzX2Zvcl9leHRyYShleHRyYSk6CiAgICAgICAgICAgIGZvciByZXEgaW4gcmVxczoKICAgICAgICAgICAgICAgIGlmIG5vdCByZXEubWFya2VyIG9yIHJlcS5tYXJrZXIuZXZhbHVhdGUoeydleHRyYSc6IGV4dHJhfSk6CiAgICAgICAgICAgICAgICAgICAgeWllbGQgcmVxCgogICAgICAgIGNvbW1vbiA9IGZyb3plbnNldChyZXFzX2Zvcl9leHRyYShOb25lKSkKICAgICAgICBkbVtOb25lXS5leHRlbmQoY29tbW9uKQoKICAgICAgICBmb3IgZXh0cmEgaW4gc2VsZi5fcGFyc2VkX3BrZ19pbmZvLmdldF9hbGwoJ1Byb3ZpZGVzLUV4dHJhJykgb3IgW106CiAgICAgICAgICAgIHNfZXh0cmEgPSBzYWZlX2V4dHJhKGV4dHJhLnN0cmlwKCkpCiAgICAgICAgICAgIGRtW3NfZXh0cmFdID0gbGlzdChmcm96ZW5zZXQocmVxc19mb3JfZXh0cmEoZXh0cmEpKSAtIGNvbW1vbikKCiAgICAgICAgcmV0dXJuIGRtCgoKX2Rpc3RyaWJ1dGlvbkltcGwgPSB7CiAgICAnLmVnZyc6IERpc3RyaWJ1dGlvbiwKICAgICcuZWdnLWluZm8nOiBFZ2dJbmZvRGlzdHJpYnV0aW9uLAogICAgJy5kaXN0LWluZm8nOiBEaXN0SW5mb0Rpc3RyaWJ1dGlvbiwKICAgIH0KCgpkZWYgaXNzdWVfd2FybmluZygqYXJncywgKiprdyk6CiAgICBsZXZlbCA9IDEKICAgIGcgPSBnbG9iYWxzKCkKICAgIHRyeToKICAgICAgICAjIGZpbmQgdGhlIGZpcnN0IHN0YWNrIGZyYW1lIHRoYXQgaXMgKm5vdCogY29kZSBpbgogICAgICAgICMgdGhlIHBrZ19yZXNvdXJjZXMgbW9kdWxlLCB0byB1c2UgZm9yIHRoZSB3YXJuaW5nCiAgICAgICAgd2hpbGUgc3lzLl9nZXRmcmFtZShsZXZlbCkuZl9nbG9iYWxzIGlzIGc6CiAgICAgICAgICAgIGxldmVsICs9IDEKICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgIHBhc3MKICAgIHdhcm5pbmdzLndhcm4oc3RhY2tsZXZlbD1sZXZlbCArIDEsICphcmdzLCAqKmt3KQoKCmNsYXNzIFJlcXVpcmVtZW50UGFyc2VFcnJvcihWYWx1ZUVycm9yKToKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiAnICcuam9pbihzZWxmLmFyZ3MpCgoKZGVmIHBhcnNlX3JlcXVpcmVtZW50cyhzdHJzKToKICAgICIiIllpZWxkIGBgUmVxdWlyZW1lbnRgYCBvYmplY3RzIGZvciBlYWNoIHNwZWNpZmljYXRpb24gaW4gYHN0cnNgCgogICAgYHN0cnNgIG11c3QgYmUgYSBzdHJpbmcsIG9yIGEgKHBvc3NpYmx5LW5lc3RlZCkgaXRlcmFibGUgdGhlcmVvZi4KICAgICIiIgogICAgIyBjcmVhdGUgYSBzdGVwcGFibGUgaXRlcmF0b3IsIHNvIHdlIGNhbiBoYW5kbGUgXC1jb250aW51YXRpb25zCiAgICBsaW5lcyA9IGl0ZXIoeWllbGRfbGluZXMoc3RycykpCgogICAgZm9yIGxpbmUgaW4gbGluZXM6CiAgICAgICAgIyBEcm9wIGNvbW1lbnRzIC0tIGEgaGFzaCB3aXRob3V0IGEgc3BhY2UgbWF5IGJlIGluIGEgVVJMLgogICAgICAgIGlmICcgIycgaW4gbGluZToKICAgICAgICAgICAgbGluZSA9IGxpbmVbOmxpbmUuZmluZCgnICMnKV0KICAgICAgICAjIElmIHRoZXJlIGlzIGEgbGluZSBjb250aW51YXRpb24sIGRyb3AgaXQsIGFuZCBhcHBlbmQgdGhlIG5leHQgbGluZS4KICAgICAgICBpZiBsaW5lLmVuZHN3aXRoKCdcXCcpOgogICAgICAgICAgICBsaW5lID0gbGluZVs6LTJdLnN0cmlwKCkKICAgICAgICAgICAgbGluZSArPSBuZXh0KGxpbmVzKQogICAgICAgIHlpZWxkIFJlcXVpcmVtZW50KGxpbmUpCgoKY2xhc3MgUmVxdWlyZW1lbnQocGFja2FnaW5nLnJlcXVpcmVtZW50cy5SZXF1aXJlbWVudCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgcmVxdWlyZW1lbnRfc3RyaW5nKToKICAgICAgICAiIiJETyBOT1QgQ0FMTCBUSElTIFVORE9DVU1FTlRFRCBNRVRIT0Q7IHVzZSBSZXF1aXJlbWVudC5wYXJzZSgpISIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgc3VwZXIoUmVxdWlyZW1lbnQsIHNlbGYpLl9faW5pdF9fKHJlcXVpcmVtZW50X3N0cmluZykKICAgICAgICBleGNlcHQgcGFja2FnaW5nLnJlcXVpcmVtZW50cy5JbnZhbGlkUmVxdWlyZW1lbnQgYXMgZToKICAgICAgICAgICAgcmFpc2UgUmVxdWlyZW1lbnRQYXJzZUVycm9yKHN0cihlKSkKICAgICAgICBzZWxmLnVuc2FmZV9uYW1lID0gc2VsZi5uYW1lCiAgICAgICAgcHJvamVjdF9uYW1lID0gc2FmZV9uYW1lKHNlbGYubmFtZSkKICAgICAgICBzZWxmLnByb2plY3RfbmFtZSwgc2VsZi5rZXkgPSBwcm9qZWN0X25hbWUsIHByb2plY3RfbmFtZS5sb3dlcigpCiAgICAgICAgc2VsZi5zcGVjcyA9IFsKICAgICAgICAgICAgKHNwZWMub3BlcmF0b3IsIHNwZWMudmVyc2lvbikgZm9yIHNwZWMgaW4gc2VsZi5zcGVjaWZpZXJdCiAgICAgICAgc2VsZi5leHRyYXMgPSB0dXBsZShtYXAoc2FmZV9leHRyYSwgc2VsZi5leHRyYXMpKQogICAgICAgIHNlbGYuaGFzaENtcCA9ICgKICAgICAgICAgICAgc2VsZi5rZXksCiAgICAgICAgICAgIHNlbGYuc3BlY2lmaWVyLAogICAgICAgICAgICBmcm96ZW5zZXQoc2VsZi5leHRyYXMpLAogICAgICAgICAgICBzdHIoc2VsZi5tYXJrZXIpIGlmIHNlbGYubWFya2VyIGVsc2UgTm9uZSwKICAgICAgICApCiAgICAgICAgc2VsZi5fX2hhc2ggPSBoYXNoKHNlbGYuaGFzaENtcCkKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICBpc2luc3RhbmNlKG90aGVyLCBSZXF1aXJlbWVudCkgYW5kCiAgICAgICAgICAgIHNlbGYuaGFzaENtcCA9PSBvdGhlci5oYXNoQ21wCiAgICAgICAgKQoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBub3Qgc2VsZiA9PSBvdGhlcgoKICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgaXRlbSk6CiAgICAgICAgaWYgaXNpbnN0YW5jZShpdGVtLCBEaXN0cmlidXRpb24pOgogICAgICAgICAgICBpZiBpdGVtLmtleSAhPSBzZWxmLmtleToKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAgICAgaXRlbSA9IGl0ZW0udmVyc2lvbgoKICAgICAgICAjIEFsbG93IHByZXJlbGVhc2VzIGFsd2F5cyBpbiBvcmRlciB0byBtYXRjaCB0aGUgcHJldmlvdXMgYmVoYXZpb3Igb2YKICAgICAgICAjIHRoaXMgbWV0aG9kLiBJbiB0aGUgZnV0dXJlIHRoaXMgc2hvdWxkIGJlIHNtYXJ0ZXIgYW5kIGZvbGxvdyBQRVAgNDQwCiAgICAgICAgIyBtb3JlIGFjY3VyYXRlbHkuCiAgICAgICAgcmV0dXJuIHNlbGYuc3BlY2lmaWVyLmNvbnRhaW5zKGl0ZW0sIHByZXJlbGVhc2VzPVRydWUpCgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9faGFzaAoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKTogcmV0dXJuICJSZXF1aXJlbWVudC5wYXJzZSglcikiICUgc3RyKHNlbGYpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIHBhcnNlKHMpOgogICAgICAgIHJlcSwgPSBwYXJzZV9yZXF1aXJlbWVudHMocykKICAgICAgICByZXR1cm4gcmVxCgoKZGVmIF9nZXRfbXJvKGNscyk6CiAgICAiIiJHZXQgYW4gbXJvIGZvciBhIHR5cGUgb3IgY2xhc3NpYyBjbGFzcyIiIgogICAgaWYgbm90IGlzaW5zdGFuY2UoY2xzLCB0eXBlKToKCiAgICAgICAgY2xhc3MgY2xzKGNscywgb2JqZWN0KToKICAgICAgICAgICAgcGFzcwoKICAgICAgICByZXR1cm4gY2xzLl9fbXJvX19bMTpdCiAgICByZXR1cm4gY2xzLl9fbXJvX18KCgpkZWYgX2ZpbmRfYWRhcHRlcihyZWdpc3RyeSwgb2IpOgogICAgIiIiUmV0dXJuIGFuIGFkYXB0ZXIgZmFjdG9yeSBmb3IgYG9iYCBmcm9tIGByZWdpc3RyeWAiIiIKICAgIGZvciB0IGluIF9nZXRfbXJvKGdldGF0dHIob2IsICdfX2NsYXNzX18nLCB0eXBlKG9iKSkpOgogICAgICAgIGlmIHQgaW4gcmVnaXN0cnk6CiAgICAgICAgICAgIHJldHVybiByZWdpc3RyeVt0XQoKCmRlZiBlbnN1cmVfZGlyZWN0b3J5KHBhdGgpOgogICAgIiIiRW5zdXJlIHRoYXQgdGhlIHBhcmVudCBkaXJlY3Rvcnkgb2YgYHBhdGhgIGV4aXN0cyIiIgogICAgZGlybmFtZSA9IG9zLnBhdGguZGlybmFtZShwYXRoKQogICAgaWYgbm90IG9zLnBhdGguaXNkaXIoZGlybmFtZSk6CiAgICAgICAgb3MubWFrZWRpcnMoZGlybmFtZSkKCgpkZWYgX2J5cGFzc19lbnN1cmVfZGlyZWN0b3J5KHBhdGgpOgogICAgIiIiU2FuZGJveC1ieXBhc3NpbmcgdmVyc2lvbiBvZiBlbnN1cmVfZGlyZWN0b3J5KCkiIiIKICAgIGlmIG5vdCBXUklURV9TVVBQT1JUOgogICAgICAgIHJhaXNlIElPRXJyb3IoJyJvcy5ta2RpciIgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtLicpCiAgICBkaXJuYW1lLCBmaWxlbmFtZSA9IHNwbGl0KHBhdGgpCiAgICBpZiBkaXJuYW1lIGFuZCBmaWxlbmFtZSBhbmQgbm90IGlzZGlyKGRpcm5hbWUpOgogICAgICAgIF9ieXBhc3NfZW5zdXJlX2RpcmVjdG9yeShkaXJuYW1lKQogICAgICAgIG1rZGlyKGRpcm5hbWUsIDBvNzU1KQoKCmRlZiBzcGxpdF9zZWN0aW9ucyhzKToKICAgICIiIlNwbGl0IGEgc3RyaW5nIG9yIGl0ZXJhYmxlIHRoZXJlb2YgaW50byAoc2VjdGlvbiwgY29udGVudCkgcGFpcnMKCiAgICBFYWNoIGBgc2VjdGlvbmBgIGlzIGEgc3RyaXBwZWQgdmVyc2lvbiBvZiB0aGUgc2VjdGlvbiBoZWFkZXIgKCJbc2VjdGlvbl0iKQogICAgYW5kIGVhY2ggYGBjb250ZW50YGAgaXMgYSBsaXN0IG9mIHN0cmlwcGVkIGxpbmVzIGV4Y2x1ZGluZyBibGFuayBsaW5lcyBhbmQKICAgIGNvbW1lbnQtb25seSBsaW5lcy4gIElmIHRoZXJlIGFyZSBhbnkgc3VjaCBsaW5lcyBiZWZvcmUgdGhlIGZpcnN0IHNlY3Rpb24KICAgIGhlYWRlciwgdGhleSdyZSByZXR1cm5lZCBpbiBhIGZpcnN0IGBgc2VjdGlvbmBgIG9mIGBgTm9uZWBgLgogICAgIiIiCiAgICBzZWN0aW9uID0gTm9uZQogICAgY29udGVudCA9IFtdCiAgICBmb3IgbGluZSBpbiB5aWVsZF9saW5lcyhzKToKICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoIlsiKToKICAgICAgICAgICAgaWYgbGluZS5lbmRzd2l0aCgiXSIpOgogICAgICAgICAgICAgICAgaWYgc2VjdGlvbiBvciBjb250ZW50OgogICAgICAgICAgICAgICAgICAgIHlpZWxkIHNlY3Rpb24sIGNvbnRlbnQKICAgICAgICAgICAgICAgIHNlY3Rpb24gPSBsaW5lWzE6LTFdLnN0cmlwKCkKICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBbXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSW52YWxpZCBzZWN0aW9uIGhlYWRpbmciLCBsaW5lKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGNvbnRlbnQuYXBwZW5kKGxpbmUpCgogICAgIyB3cmFwIHVwIGxhc3Qgc2VnbWVudAogICAgeWllbGQgc2VjdGlvbiwgY29udGVudAoKCmRlZiBfbWtzdGVtcCgqYXJncywgKiprdyk6CiAgICBvbGRfb3BlbiA9IG9zLm9wZW4KICAgIHRyeToKICAgICAgICAjIHRlbXBvcmFyaWx5IGJ5cGFzcyBzYW5kYm94aW5nCiAgICAgICAgb3Mub3BlbiA9IG9zX29wZW4KICAgICAgICByZXR1cm4gdGVtcGZpbGUubWtzdGVtcCgqYXJncywgKiprdykKICAgIGZpbmFsbHk6CiAgICAgICAgIyBhbmQgdGhlbiBwdXQgaXQgYmFjawogICAgICAgIG9zLm9wZW4gPSBvbGRfb3BlbgoKCiMgU2lsZW5jZSB0aGUgUEVQNDQwV2FybmluZyBieSBkZWZhdWx0LCBzbyB0aGF0IGVuZCB1c2VycyBkb24ndCBnZXQgaGl0IGJ5IGl0CiMgcmFuZG9tbHkganVzdCBiZWNhdXNlIHRoZXkgdXNlIHBrZ19yZXNvdXJjZXMuIFdlIHdhbnQgdG8gYXBwZW5kIHRoZSBydWxlCiMgYmVjYXVzZSB3ZSB3YW50IGVhcmxpZXIgdXNlcyBvZiBmaWx0ZXJ3YXJuaW5ncyB0byB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aGlzCiMgb25lLgp3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwgY2F0ZWdvcnk9UEVQNDQwV2FybmluZywgYXBwZW5kPVRydWUpCgoKIyBmcm9tIGphcmFjby5mdW5jdG9vbHMgMS4zCmRlZiBfY2FsbF9hc2lkZShmLCAqYXJncywgKiprd2FyZ3MpOgogICAgZigqYXJncywgKiprd2FyZ3MpCiAgICByZXR1cm4gZgoKCkBfY2FsbF9hc2lkZQpkZWYgX2luaXRpYWxpemUoZz1nbG9iYWxzKCkpOgogICAgIlNldCB1cCBnbG9iYWwgcmVzb3VyY2UgbWFuYWdlciAoZGVsaWJlcmF0ZWx5IG5vdCBzdGF0ZS1zYXZlZCkiCiAgICBtYW5hZ2VyID0gUmVzb3VyY2VNYW5hZ2VyKCkKICAgIGdbJ19tYW5hZ2VyJ10gPSBtYW5hZ2VyCiAgICBmb3IgbmFtZSBpbiBkaXIobWFuYWdlcik6CiAgICAgICAgaWYgbm90IG5hbWUuc3RhcnRzd2l0aCgnXycpOgogICAgICAgICAgICBnW25hbWVdID0gZ2V0YXR0cihtYW5hZ2VyLCBuYW1lKQoKCkBfY2FsbF9hc2lkZQpkZWYgX2luaXRpYWxpemVfbWFzdGVyX3dvcmtpbmdfc2V0KCk6CiAgICAiIiIKICAgIFByZXBhcmUgdGhlIG1hc3RlciB3b3JraW5nIHNldCBhbmQgbWFrZSB0aGUgYGByZXF1aXJlKClgYAogICAgQVBJIGF2YWlsYWJsZS4KCiAgICBUaGlzIGZ1bmN0aW9uIGhhcyBleHBsaWNpdCBlZmZlY3RzIG9uIHRoZSBnbG9iYWwgc3RhdGUKICAgIG9mIHBrZ19yZXNvdXJjZXMuIEl0IGlzIGludGVuZGVkIHRvIGJlIGludm9rZWQgb25jZSBhdAogICAgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoaXMgbW9kdWxlLgoKICAgIEludm9jYXRpb24gYnkgb3RoZXIgcGFja2FnZXMgaXMgdW5zdXBwb3J0ZWQgYW5kIGRvbmUKICAgIGF0IHRoZWlyIG93biByaXNrLgogICAgIiIiCiAgICB3b3JraW5nX3NldCA9IFdvcmtpbmdTZXQuX2J1aWxkX21hc3RlcigpCiAgICBfZGVjbGFyZV9zdGF0ZSgnb2JqZWN0Jywgd29ya2luZ19zZXQ9d29ya2luZ19zZXQpCgogICAgcmVxdWlyZSA9IHdvcmtpbmdfc2V0LnJlcXVpcmUKICAgIGl0ZXJfZW50cnlfcG9pbnRzID0gd29ya2luZ19zZXQuaXRlcl9lbnRyeV9wb2ludHMKICAgIGFkZF9hY3RpdmF0aW9uX2xpc3RlbmVyID0gd29ya2luZ19zZXQuc3Vic2NyaWJlCiAgICBydW5fc2NyaXB0ID0gd29ya2luZ19zZXQucnVuX3NjcmlwdAogICAgIyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CiAgICBydW5fbWFpbiA9IHJ1bl9zY3JpcHQKICAgICMgQWN0aXZhdGUgYWxsIGRpc3RyaWJ1dGlvbnMgYWxyZWFkeSBvbiBzeXMucGF0aCB3aXRoIHJlcGxhY2U9RmFsc2UgYW5kCiAgICAjIGVuc3VyZSB0aGF0IGFsbCBkaXN0cmlidXRpb25zIGFkZGVkIHRvIHRoZSB3b3JraW5nIHNldCBpbiB0aGUgZnV0dXJlCiAgICAjIChlLmcuIGJ5IGNhbGxpbmcgYGByZXF1aXJlKClgYCkgd2lsbCBnZXQgYWN0aXZhdGVkIGFzIHdlbGwsCiAgICAjIHdpdGggaGlnaGVyIHByaW9yaXR5IChyZXBsYWNlPVRydWUpLgogICAgZGlzdCA9IE5vbmUgICMgZW5zdXJlIGRpc3QgaXMgZGVmaW5lZCBmb3IgZGVsIGRpc3QgYmVsb3cKICAgIGZvciBkaXN0IGluIHdvcmtpbmdfc2V0OgogICAgICAgIGRpc3QuYWN0aXZhdGUocmVwbGFjZT1GYWxzZSkKICAgIGRlbCBkaXN0CiAgICBhZGRfYWN0aXZhdGlvbl9saXN0ZW5lcihsYW1iZGEgZGlzdDogZGlzdC5hY3RpdmF0ZShyZXBsYWNlPVRydWUpLCBleGlzdGluZz1GYWxzZSkKICAgIHdvcmtpbmdfc2V0LmVudHJpZXMgPSBbXQogICAgIyBtYXRjaCBvcmRlcgogICAgbGlzdChtYXAod29ya2luZ19zZXQuYWRkX2VudHJ5LCBzeXMucGF0aCkpCiAgICBnbG9iYWxzKCkudXBkYXRlKGxvY2FscygpKQpQSwMEFAAAAAAAAAAhAPpacYzPCwAAzwsAADAAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcHJvZ3Jlc3MvX19pbml0X18ucHkjIENvcHlyaWdodCAoYykgMjAxMiBHaW9yZ29zIFZlcmlnYWtpcyA8dmVyaWdha0BnbWFpbC5jb20+CiMKIyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKIyBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCiMgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KIwojIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwojIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKIyBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgojIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKIyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KIyBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgojIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uCgpmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZXF1ZQpmcm9tIGRhdGV0aW1lIGltcG9ydCB0aW1lZGVsdGEKZnJvbSBtYXRoIGltcG9ydCBjZWlsCmZyb20gc3lzIGltcG9ydCBzdGRlcnIKZnJvbSB0aW1lIGltcG9ydCB0aW1lCgoKX192ZXJzaW9uX18gPSAnMS4yJwoKCmNsYXNzIEluZmluaXRlKG9iamVjdCk6CiAgICBmaWxlID0gc3RkZXJyCiAgICBzbWFfd2luZG93ID0gMTAKCiAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICBzZWxmLmluZGV4ID0gMAogICAgICAgIHNlbGYuc3RhcnRfdHMgPSB0aW1lKCkKICAgICAgICBzZWxmLl90cyA9IHNlbGYuc3RhcnRfdHMKICAgICAgICBzZWxmLl9kdCA9IGRlcXVlKG1heGxlbj1zZWxmLnNtYV93aW5kb3cpCiAgICAgICAgZm9yIGtleSwgdmFsIGluIGt3YXJncy5pdGVtcygpOgogICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGtleSwgdmFsKQoKICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgogICAgICAgIGlmIGtleS5zdGFydHN3aXRoKCdfJyk6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZiwga2V5LCBOb25lKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGF2ZyhzZWxmKToKICAgICAgICByZXR1cm4gc3VtKHNlbGYuX2R0KSAvIGxlbihzZWxmLl9kdCkgaWYgc2VsZi5fZHQgZWxzZSAwCgogICAgQHByb3BlcnR5CiAgICBkZWYgZWxhcHNlZChzZWxmKToKICAgICAgICByZXR1cm4gaW50KHRpbWUoKSAtIHNlbGYuc3RhcnRfdHMpCgogICAgQHByb3BlcnR5CiAgICBkZWYgZWxhcHNlZF90ZChzZWxmKToKICAgICAgICByZXR1cm4gdGltZWRlbHRhKHNlY29uZHM9c2VsZi5lbGFwc2VkKQoKICAgIGRlZiB1cGRhdGUoc2VsZik6CiAgICAgICAgcGFzcwoKICAgIGRlZiBzdGFydChzZWxmKToKICAgICAgICBwYXNzCgogICAgZGVmIGZpbmlzaChzZWxmKToKICAgICAgICBwYXNzCgogICAgZGVmIG5leHQoc2VsZiwgbj0xKToKICAgICAgICBpZiBuID4gMDoKICAgICAgICAgICAgbm93ID0gdGltZSgpCiAgICAgICAgICAgIGR0ID0gKG5vdyAtIHNlbGYuX3RzKSAvIG4KICAgICAgICAgICAgc2VsZi5fZHQuYXBwZW5kKGR0KQogICAgICAgICAgICBzZWxmLl90cyA9IG5vdwoKICAgICAgICBzZWxmLmluZGV4ID0gc2VsZi5pbmRleCArIG4KICAgICAgICBzZWxmLnVwZGF0ZSgpCgogICAgZGVmIGl0ZXIoc2VsZiwgaXQpOgogICAgICAgIGZvciB4IGluIGl0OgogICAgICAgICAgICB5aWVsZCB4CiAgICAgICAgICAgIHNlbGYubmV4dCgpCiAgICAgICAgc2VsZi5maW5pc2goKQoKCmNsYXNzIFByb2dyZXNzKEluZmluaXRlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgIHN1cGVyKFByb2dyZXNzLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpCiAgICAgICAgc2VsZi5tYXggPSBrd2FyZ3MuZ2V0KCdtYXgnLCAxMDApCgogICAgQHByb3BlcnR5CiAgICBkZWYgZXRhKHNlbGYpOgogICAgICAgIHJldHVybiBpbnQoY2VpbChzZWxmLmF2ZyAqIHNlbGYucmVtYWluaW5nKSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBldGFfdGQoc2VsZik6CiAgICAgICAgcmV0dXJuIHRpbWVkZWx0YShzZWNvbmRzPXNlbGYuZXRhKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHBlcmNlbnQoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYucHJvZ3Jlc3MgKiAxMDAKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwcm9ncmVzcyhzZWxmKToKICAgICAgICByZXR1cm4gbWluKDEsIHNlbGYuaW5kZXggLyBzZWxmLm1heCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiByZW1haW5pbmcoc2VsZik6CiAgICAgICAgcmV0dXJuIG1heChzZWxmLm1heCAtIHNlbGYuaW5kZXgsIDApCgogICAgZGVmIHN0YXJ0KHNlbGYpOgogICAgICAgIHNlbGYudXBkYXRlKCkKCiAgICBkZWYgZ290byhzZWxmLCBpbmRleCk6CiAgICAgICAgaW5jciA9IGluZGV4IC0gc2VsZi5pbmRleAogICAgICAgIHNlbGYubmV4dChpbmNyKQoKICAgIGRlZiBpdGVyKHNlbGYsIGl0KToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYubWF4ID0gbGVuKGl0KQogICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgZm9yIHggaW4gaXQ6CiAgICAgICAgICAgIHlpZWxkIHgKICAgICAgICAgICAgc2VsZi5uZXh0KCkKICAgICAgICBzZWxmLmZpbmlzaCgpClBLAwQUAAAAAAAAACEAD8NGA30KAAB9CgAAKwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9wcm9ncmVzcy9iYXIucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoKIyBDb3B5cmlnaHQgKGMpIDIwMTIgR2lvcmdvcyBWZXJpZ2FraXMgPHZlcmlnYWtAZ21haWwuY29tPgojCiMgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CiMgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQojIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCiMKIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKIyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCiMgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKIyBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCiMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCiMgQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKIyBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgoKZnJvbSAuIGltcG9ydCBQcm9ncmVzcwpmcm9tIC5oZWxwZXJzIGltcG9ydCBXcml0ZWxuTWl4aW4KCgpjbGFzcyBCYXIoV3JpdGVsbk1peGluLCBQcm9ncmVzcyk6CiAgICB3aWR0aCA9IDMyCiAgICBtZXNzYWdlID0gJycKICAgIHN1ZmZpeCA9ICclKGluZGV4KWQvJShtYXgpZCcKICAgIGJhcl9wcmVmaXggPSAnIHwnCiAgICBiYXJfc3VmZml4ID0gJ3wgJwogICAgZW1wdHlfZmlsbCA9ICcgJwogICAgZmlsbCA9ICcjJwogICAgaGlkZV9jdXJzb3IgPSBUcnVlCgogICAgZGVmIHVwZGF0ZShzZWxmKToKICAgICAgICBmaWxsZWRfbGVuZ3RoID0gaW50KHNlbGYud2lkdGggKiBzZWxmLnByb2dyZXNzKQogICAgICAgIGVtcHR5X2xlbmd0aCA9IHNlbGYud2lkdGggLSBmaWxsZWRfbGVuZ3RoCgogICAgICAgIG1lc3NhZ2UgPSBzZWxmLm1lc3NhZ2UgJSBzZWxmCiAgICAgICAgYmFyID0gc2VsZi5maWxsICogZmlsbGVkX2xlbmd0aAogICAgICAgIGVtcHR5ID0gc2VsZi5lbXB0eV9maWxsICogZW1wdHlfbGVuZ3RoCiAgICAgICAgc3VmZml4ID0gc2VsZi5zdWZmaXggJSBzZWxmCiAgICAgICAgbGluZSA9ICcnLmpvaW4oW21lc3NhZ2UsIHNlbGYuYmFyX3ByZWZpeCwgYmFyLCBlbXB0eSwgc2VsZi5iYXJfc3VmZml4LAogICAgICAgICAgICAgICAgICAgICAgICBzdWZmaXhdKQogICAgICAgIHNlbGYud3JpdGVsbihsaW5lKQoKCmNsYXNzIENoYXJnaW5nQmFyKEJhcik6CiAgICBzdWZmaXggPSAnJShwZXJjZW50KWQlJScKICAgIGJhcl9wcmVmaXggPSAnICcKICAgIGJhcl9zdWZmaXggPSAnICcKICAgIGVtcHR5X2ZpbGwgPSB1J+KImScKICAgIGZpbGwgPSB1J+KWiCcKCgpjbGFzcyBGaWxsaW5nU3F1YXJlc0JhcihDaGFyZ2luZ0Jhcik6CiAgICBlbXB0eV9maWxsID0gdSfilqInCiAgICBmaWxsID0gdSfilqMnCgoKY2xhc3MgRmlsbGluZ0NpcmNsZXNCYXIoQ2hhcmdpbmdCYXIpOgogICAgZW1wdHlfZmlsbCA9IHUn4pevJwogICAgZmlsbCA9IHUn4peJJwoKCmNsYXNzIEluY3JlbWVudGFsQmFyKEJhcik6CiAgICBwaGFzZXMgPSAodScgJywgdSfilo8nLCB1J+KWjicsIHUn4paNJywgdSfilownLCB1J+KWiycsIHUn4paKJywgdSfiloknLCB1J+KWiCcpCgogICAgZGVmIHVwZGF0ZShzZWxmKToKICAgICAgICBucGhhc2VzID0gbGVuKHNlbGYucGhhc2VzKQogICAgICAgIGV4cGFuZGVkX2xlbmd0aCA9IGludChucGhhc2VzICogc2VsZi53aWR0aCAqIHNlbGYucHJvZ3Jlc3MpCiAgICAgICAgZmlsbGVkX2xlbmd0aCA9IGludChzZWxmLndpZHRoICogc2VsZi5wcm9ncmVzcykKICAgICAgICBlbXB0eV9sZW5ndGggPSBzZWxmLndpZHRoIC0gZmlsbGVkX2xlbmd0aAogICAgICAgIHBoYXNlID0gZXhwYW5kZWRfbGVuZ3RoIC0gKGZpbGxlZF9sZW5ndGggKiBucGhhc2VzKQoKICAgICAgICBtZXNzYWdlID0gc2VsZi5tZXNzYWdlICUgc2VsZgogICAgICAgIGJhciA9IHNlbGYucGhhc2VzWy0xXSAqIGZpbGxlZF9sZW5ndGgKICAgICAgICBjdXJyZW50ID0gc2VsZi5waGFzZXNbcGhhc2VdIGlmIHBoYXNlID4gMCBlbHNlICcnCiAgICAgICAgZW1wdHkgPSBzZWxmLmVtcHR5X2ZpbGwgKiBtYXgoMCwgZW1wdHlfbGVuZ3RoIC0gbGVuKGN1cnJlbnQpKQogICAgICAgIHN1ZmZpeCA9IHNlbGYuc3VmZml4ICUgc2VsZgogICAgICAgIGxpbmUgPSAnJy5qb2luKFttZXNzYWdlLCBzZWxmLmJhcl9wcmVmaXgsIGJhciwgY3VycmVudCwgZW1wdHksCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYmFyX3N1ZmZpeCwgc3VmZml4XSkKICAgICAgICBzZWxmLndyaXRlbG4obGluZSkKCgpjbGFzcyBTaGFkeUJhcihJbmNyZW1lbnRhbEJhcik6CiAgICBwaGFzZXMgPSAodScgJywgdSfilpEnLCB1J+KWkicsIHUn4paTJywgdSfilognKQpQSwMEFAAAAAAAAAAhACp/8TDeBQAA3gUAAC8AAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcHJvZ3Jlc3MvY291bnRlci5weSMgLSotIGNvZGluZzogdXRmLTggLSotCgojIENvcHlyaWdodCAoYykgMjAxMiBHaW9yZ29zIFZlcmlnYWtpcyA8dmVyaWdha0BnbWFpbC5jb20+CiMKIyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKIyBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCiMgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KIwojIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwojIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKIyBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgojIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKIyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KIyBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgojIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCgpmcm9tIC4gaW1wb3J0IEluZmluaXRlLCBQcm9ncmVzcwpmcm9tIC5oZWxwZXJzIGltcG9ydCBXcml0ZU1peGluCgoKY2xhc3MgQ291bnRlcihXcml0ZU1peGluLCBJbmZpbml0ZSk6CiAgICBtZXNzYWdlID0gJycKICAgIGhpZGVfY3Vyc29yID0gVHJ1ZQoKICAgIGRlZiB1cGRhdGUoc2VsZik6CiAgICAgICAgc2VsZi53cml0ZShzdHIoc2VsZi5pbmRleCkpCgoKY2xhc3MgQ291bnRkb3duKFdyaXRlTWl4aW4sIFByb2dyZXNzKToKICAgIGhpZGVfY3Vyc29yID0gVHJ1ZQoKICAgIGRlZiB1cGRhdGUoc2VsZik6CiAgICAgICAgc2VsZi53cml0ZShzdHIoc2VsZi5yZW1haW5pbmcpKQoKCmNsYXNzIFN0YWNrKFdyaXRlTWl4aW4sIFByb2dyZXNzKToKICAgIHBoYXNlcyA9ICh1JyAnLCB1J+KWgScsIHUn4paCJywgdSfiloMnLCB1J+KWhCcsIHUn4paFJywgdSfiloYnLCB1J+KWhycsIHUn4paIJykKICAgIGhpZGVfY3Vyc29yID0gVHJ1ZQoKICAgIGRlZiB1cGRhdGUoc2VsZik6CiAgICAgICAgbnBoYXNlcyA9IGxlbihzZWxmLnBoYXNlcykKICAgICAgICBpID0gbWluKG5waGFzZXMgLSAxLCBpbnQoc2VsZi5wcm9ncmVzcyAqIG5waGFzZXMpKQogICAgICAgIHNlbGYud3JpdGUoc2VsZi5waGFzZXNbaV0pCgoKY2xhc3MgUGllKFN0YWNrKToKICAgIHBoYXNlcyA9ICh1J+KXiycsIHUn4peUJywgdSfil5EnLCB1J+KXlScsIHUn4pePJykKUEsDBBQAAAAAAAAAIQDO7A9OJgsAACYLAAAvAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3Byb2dyZXNzL2hlbHBlcnMucHkjIENvcHlyaWdodCAoYykgMjAxMiBHaW9yZ29zIFZlcmlnYWtpcyA8dmVyaWdha0BnbWFpbC5jb20+CiMKIyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKIyBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCiMgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KIwojIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwojIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKIyBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgojIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKIyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KIyBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgojIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCgoKSElERV9DVVJTT1IgPSAnXHgxYls/MjVsJwpTSE9XX0NVUlNPUiA9ICdceDFiWz8yNWgnCgoKY2xhc3MgV3JpdGVNaXhpbihvYmplY3QpOgogICAgaGlkZV9jdXJzb3IgPSBGYWxzZQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXNzYWdlPU5vbmUsICoqa3dhcmdzKToKICAgICAgICBzdXBlcihXcml0ZU1peGluLCBzZWxmKS5fX2luaXRfXygqKmt3YXJncykKICAgICAgICBzZWxmLl93aWR0aCA9IDAKICAgICAgICBpZiBtZXNzYWdlOgogICAgICAgICAgICBzZWxmLm1lc3NhZ2UgPSBtZXNzYWdlCgogICAgICAgIGlmIHNlbGYuZmlsZS5pc2F0dHkoKToKICAgICAgICAgICAgaWYgc2VsZi5oaWRlX2N1cnNvcjoKICAgICAgICAgICAgICAgIHByaW50KEhJREVfQ1VSU09SLCBlbmQ9JycsIGZpbGU9c2VsZi5maWxlKQogICAgICAgICAgICBwcmludChzZWxmLm1lc3NhZ2UsIGVuZD0nJywgZmlsZT1zZWxmLmZpbGUpCiAgICAgICAgICAgIHNlbGYuZmlsZS5mbHVzaCgpCgogICAgZGVmIHdyaXRlKHNlbGYsIHMpOgogICAgICAgIGlmIHNlbGYuZmlsZS5pc2F0dHkoKToKICAgICAgICAgICAgYiA9ICdcYicgKiBzZWxmLl93aWR0aAogICAgICAgICAgICBjID0gcy5sanVzdChzZWxmLl93aWR0aCkKICAgICAgICAgICAgcHJpbnQoYiArIGMsIGVuZD0nJywgZmlsZT1zZWxmLmZpbGUpCiAgICAgICAgICAgIHNlbGYuX3dpZHRoID0gbWF4KHNlbGYuX3dpZHRoLCBsZW4ocykpCiAgICAgICAgICAgIHNlbGYuZmlsZS5mbHVzaCgpCgogICAgZGVmIGZpbmlzaChzZWxmKToKICAgICAgICBpZiBzZWxmLmZpbGUuaXNhdHR5KCkgYW5kIHNlbGYuaGlkZV9jdXJzb3I6CiAgICAgICAgICAgIHByaW50KFNIT1dfQ1VSU09SLCBlbmQ9JycsIGZpbGU9c2VsZi5maWxlKQoKCmNsYXNzIFdyaXRlbG5NaXhpbihvYmplY3QpOgogICAgaGlkZV9jdXJzb3IgPSBGYWxzZQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXNzYWdlPU5vbmUsICoqa3dhcmdzKToKICAgICAgICBzdXBlcihXcml0ZWxuTWl4aW4sIHNlbGYpLl9faW5pdF9fKCoqa3dhcmdzKQogICAgICAgIGlmIG1lc3NhZ2U6CiAgICAgICAgICAgIHNlbGYubWVzc2FnZSA9IG1lc3NhZ2UKCiAgICAgICAgaWYgc2VsZi5maWxlLmlzYXR0eSgpIGFuZCBzZWxmLmhpZGVfY3Vyc29yOgogICAgICAgICAgICBwcmludChISURFX0NVUlNPUiwgZW5kPScnLCBmaWxlPXNlbGYuZmlsZSkKCiAgICBkZWYgY2xlYXJsbihzZWxmKToKICAgICAgICBpZiBzZWxmLmZpbGUuaXNhdHR5KCk6CiAgICAgICAgICAgIHByaW50KCdcclx4MWJbSycsIGVuZD0nJywgZmlsZT1zZWxmLmZpbGUpCgogICAgZGVmIHdyaXRlbG4oc2VsZiwgbGluZSk6CiAgICAgICAgaWYgc2VsZi5maWxlLmlzYXR0eSgpOgogICAgICAgICAgICBzZWxmLmNsZWFybG4oKQogICAgICAgICAgICBwcmludChsaW5lLCBlbmQ9JycsIGZpbGU9c2VsZi5maWxlKQogICAgICAgICAgICBzZWxmLmZpbGUuZmx1c2goKQoKICAgIGRlZiBmaW5pc2goc2VsZik6CiAgICAgICAgaWYgc2VsZi5maWxlLmlzYXR0eSgpOgogICAgICAgICAgICBwcmludChmaWxlPXNlbGYuZmlsZSkKICAgICAgICAgICAgaWYgc2VsZi5oaWRlX2N1cnNvcjoKICAgICAgICAgICAgICAgIHByaW50KFNIT1dfQ1VSU09SLCBlbmQ9JycsIGZpbGU9c2VsZi5maWxlKQoKCmZyb20gc2lnbmFsIGltcG9ydCBzaWduYWwsIFNJR0lOVApmcm9tIHN5cyBpbXBvcnQgZXhpdAoKCmNsYXNzIFNpZ0ludE1peGluKG9iamVjdCk6CiAgICAiIiJSZWdpc3RlcnMgYSBzaWduYWwgaGFuZGxlciB0aGF0IGNhbGxzIGZpbmlzaCBvbiBTSUdJTlQiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICBzdXBlcihTaWdJbnRNaXhpbiwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3dhcmdzKQogICAgICAgIHNpZ25hbChTSUdJTlQsIHNlbGYuX3NpZ2ludF9oYW5kbGVyKQoKICAgIGRlZiBfc2lnaW50X2hhbmRsZXIoc2VsZiwgc2lnbnVtLCBmcmFtZSk6CiAgICAgICAgc2VsZi5maW5pc2goKQogICAgICAgIGV4aXQoMCkKUEsDBBQAAAAAAAAAIQB3CFJ7IgUAACIFAAAvAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3Byb2dyZXNzL3NwaW5uZXIucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoKIyBDb3B5cmlnaHQgKGMpIDIwMTIgR2lvcmdvcyBWZXJpZ2FraXMgPHZlcmlnYWtAZ21haWwuY29tPgojCiMgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CiMgcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQojIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCiMKIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKIyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCiMgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKIyBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCiMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCiMgQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKIyBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgoKZnJvbSAuIGltcG9ydCBJbmZpbml0ZQpmcm9tIC5oZWxwZXJzIGltcG9ydCBXcml0ZU1peGluCgoKY2xhc3MgU3Bpbm5lcihXcml0ZU1peGluLCBJbmZpbml0ZSk6CiAgICBtZXNzYWdlID0gJycKICAgIHBoYXNlcyA9ICgnLScsICdcXCcsICd8JywgJy8nKQogICAgaGlkZV9jdXJzb3IgPSBUcnVlCgogICAgZGVmIHVwZGF0ZShzZWxmKToKICAgICAgICBpID0gc2VsZi5pbmRleCAlIGxlbihzZWxmLnBoYXNlcykKICAgICAgICBzZWxmLndyaXRlKHNlbGYucGhhc2VzW2ldKQoKCmNsYXNzIFBpZVNwaW5uZXIoU3Bpbm5lcik6CiAgICBwaGFzZXMgPSBbdSfil7cnLCB1J+KXticsIHUn4pe1JywgdSfil7QnXQoKCmNsYXNzIE1vb25TcGlubmVyKFNwaW5uZXIpOgogICAgcGhhc2VzID0gW3Un4peRJywgdSfil5InLCB1J+KXkCcsIHUn4peTJ10KCgpjbGFzcyBMaW5lU3Bpbm5lcihTcGlubmVyKToKICAgIHBoYXNlcyA9IFt1J+KOuicsIHUn4o67JywgdSfijrwnLCB1J+KOvScsIHUn4o68JywgdSfijrsnXQpQSwMEFAAAAAAAAAAhAMEgdI6rawMAq2sDACgAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcHlwYXJzaW5nLnB5IyBtb2R1bGUgcHlwYXJzaW5nLnB5CiMKIyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNiAgUGF1bCBULiBNY0d1aXJlCiMKIyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKIyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKIyAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCiMgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAojIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bwojIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwojIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKIwojIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCiMgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCiMKIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKIyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKIyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCiMgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKIyBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAojIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCiMgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiMKCl9fZG9jX18gPSBcCiIiIgpweXBhcnNpbmcgbW9kdWxlIC0gQ2xhc3NlcyBhbmQgbWV0aG9kcyB0byBkZWZpbmUgYW5kIGV4ZWN1dGUgcGFyc2luZyBncmFtbWFycwoKVGhlIHB5cGFyc2luZyBtb2R1bGUgaXMgYW4gYWx0ZXJuYXRpdmUgYXBwcm9hY2ggdG8gY3JlYXRpbmcgYW5kIGV4ZWN1dGluZyBzaW1wbGUgZ3JhbW1hcnMsCnZzLiB0aGUgdHJhZGl0aW9uYWwgbGV4L3lhY2MgYXBwcm9hY2gsIG9yIHRoZSB1c2Ugb2YgcmVndWxhciBleHByZXNzaW9ucy4gIFdpdGggcHlwYXJzaW5nLCB5b3UKZG9uJ3QgbmVlZCB0byBsZWFybiBhIG5ldyBzeW50YXggZm9yIGRlZmluaW5nIGdyYW1tYXJzIG9yIG1hdGNoaW5nIGV4cHJlc3Npb25zIC0gdGhlIHBhcnNpbmcgbW9kdWxlCnByb3ZpZGVzIGEgbGlicmFyeSBvZiBjbGFzc2VzIHRoYXQgeW91IHVzZSB0byBjb25zdHJ1Y3QgdGhlIGdyYW1tYXIgZGlyZWN0bHkgaW4gUHl0aG9uLgoKSGVyZSBpcyBhIHByb2dyYW0gdG8gcGFyc2UgIkhlbGxvLCBXb3JsZCEiIChvciBhbnkgZ3JlZXRpbmcgb2YgdGhlIGZvcm0gCkN7IjxzYWx1dGF0aW9uPiwgPGFkZHJlc3NlZT4hIn0pLCBidWlsdCB1cCB1c2luZyBMe1dvcmR9LCBMe0xpdGVyYWx9LCBhbmQgTHtBbmR9IGVsZW1lbnRzIAooTHsnKyc8UGFyc2VyRWxlbWVudC5fX2FkZF9fPn0gb3BlcmF0b3IgZ2l2ZXMgTHtBbmR9IGV4cHJlc3Npb25zLCBzdHJpbmdzIGFyZSBhdXRvLWNvbnZlcnRlZCB0bwpMe0xpdGVyYWx9IGV4cHJlc3Npb25zKTo6CgogICAgZnJvbSBweXBhcnNpbmcgaW1wb3J0IFdvcmQsIGFscGhhcwoKICAgICMgZGVmaW5lIGdyYW1tYXIgb2YgYSBncmVldGluZwogICAgZ3JlZXQgPSBXb3JkKGFscGhhcykgKyAiLCIgKyBXb3JkKGFscGhhcykgKyAiISIKCiAgICBoZWxsbyA9ICJIZWxsbywgV29ybGQhIgogICAgcHJpbnQgKGhlbGxvLCAiLT4iLCBncmVldC5wYXJzZVN0cmluZyhoZWxsbykpCgpUaGUgcHJvZ3JhbSBvdXRwdXRzIHRoZSBmb2xsb3dpbmc6OgoKICAgIEhlbGxvLCBXb3JsZCEgLT4gWydIZWxsbycsICcsJywgJ1dvcmxkJywgJyEnXQoKVGhlIFB5dGhvbiByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ3JhbW1hciBpcyBxdWl0ZSByZWFkYWJsZSwgb3dpbmcgdG8gdGhlIHNlbGYtZXhwbGFuYXRvcnkKY2xhc3MgbmFtZXMsIGFuZCB0aGUgdXNlIG9mICcrJywgJ3wnIGFuZCAnXicgb3BlcmF0b3JzLgoKVGhlIEx7UGFyc2VSZXN1bHRzfSBvYmplY3QgcmV0dXJuZWQgZnJvbSBMe1BhcnNlckVsZW1lbnQucGFyc2VTdHJpbmc8UGFyc2VyRWxlbWVudC5wYXJzZVN0cmluZz59IGNhbiBiZSBhY2Nlc3NlZCBhcyBhIG5lc3RlZCBsaXN0LCBhIGRpY3Rpb25hcnksIG9yIGFuCm9iamVjdCB3aXRoIG5hbWVkIGF0dHJpYnV0ZXMuCgpUaGUgcHlwYXJzaW5nIG1vZHVsZSBoYW5kbGVzIHNvbWUgb2YgdGhlIHByb2JsZW1zIHRoYXQgYXJlIHR5cGljYWxseSB2ZXhpbmcgd2hlbiB3cml0aW5nIHRleHQgcGFyc2VyczoKIC0gZXh0cmEgb3IgbWlzc2luZyB3aGl0ZXNwYWNlICh0aGUgYWJvdmUgcHJvZ3JhbSB3aWxsIGFsc28gaGFuZGxlICJIZWxsbyxXb3JsZCEiLCAiSGVsbG8gICwgIFdvcmxkICAhIiwgZXRjLikKIC0gcXVvdGVkIHN0cmluZ3MKIC0gZW1iZWRkZWQgY29tbWVudHMKIiIiCgpfX3ZlcnNpb25fXyA9ICIyLjEuMTAiCl9fdmVyc2lvblRpbWVfXyA9ICIwNyBPY3QgMjAxNiAwMTozMSBVVEMiCl9fYXV0aG9yX18gPSAiUGF1bCBNY0d1aXJlIDxwdG1jZ0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+IgoKaW1wb3J0IHN0cmluZwpmcm9tIHdlYWtyZWYgaW1wb3J0IHJlZiBhcyB3a3JlZgppbXBvcnQgY29weQppbXBvcnQgc3lzCmltcG9ydCB3YXJuaW5ncwppbXBvcnQgcmUKaW1wb3J0IHNyZV9jb25zdGFudHMKaW1wb3J0IGNvbGxlY3Rpb25zCmltcG9ydCBwcHJpbnQKaW1wb3J0IHRyYWNlYmFjawppbXBvcnQgdHlwZXMKZnJvbSBkYXRldGltZSBpbXBvcnQgZGF0ZXRpbWUKCnRyeToKICAgIGZyb20gX3RocmVhZCBpbXBvcnQgUkxvY2sKZXhjZXB0IEltcG9ydEVycm9yOgogICAgZnJvbSB0aHJlYWRpbmcgaW1wb3J0IFJMb2NrCgp0cnk6CiAgICBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBPcmRlcmVkRGljdCBhcyBfT3JkZXJlZERpY3QKZXhjZXB0IEltcG9ydEVycm9yOgogICAgdHJ5OgogICAgICAgIGZyb20gb3JkZXJlZGRpY3QgaW1wb3J0IE9yZGVyZWREaWN0IGFzIF9PcmRlcmVkRGljdAogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIF9PcmRlcmVkRGljdCA9IE5vbmUKCiN+IHN5cy5zdGRlcnIud3JpdGUoICJ0ZXN0aW5nIHB5cGFyc2luZyBtb2R1bGUsIHZlcnNpb24gJXMsICVzXG4iICUgKF9fdmVyc2lvbl9fLF9fdmVyc2lvblRpbWVfXyApICkKCl9fYWxsX18gPSBbCidBbmQnLCAnQ2FzZWxlc3NLZXl3b3JkJywgJ0Nhc2VsZXNzTGl0ZXJhbCcsICdDaGFyc05vdEluJywgJ0NvbWJpbmUnLCAnRGljdCcsICdFYWNoJywgJ0VtcHR5JywKJ0ZvbGxvd2VkQnknLCAnRm9yd2FyZCcsICdHb1RvQ29sdW1uJywgJ0dyb3VwJywgJ0tleXdvcmQnLCAnTGluZUVuZCcsICdMaW5lU3RhcnQnLCAnTGl0ZXJhbCcsCidNYXRjaEZpcnN0JywgJ05vTWF0Y2gnLCAnTm90QW55JywgJ09uZU9yTW9yZScsICdPbmx5T25jZScsICdPcHRpb25hbCcsICdPcicsCidQYXJzZUJhc2VFeGNlcHRpb24nLCAnUGFyc2VFbGVtZW50RW5oYW5jZScsICdQYXJzZUV4Y2VwdGlvbicsICdQYXJzZUV4cHJlc3Npb24nLCAnUGFyc2VGYXRhbEV4Y2VwdGlvbicsCidQYXJzZVJlc3VsdHMnLCAnUGFyc2VTeW50YXhFeGNlcHRpb24nLCAnUGFyc2VyRWxlbWVudCcsICdRdW90ZWRTdHJpbmcnLCAnUmVjdXJzaXZlR3JhbW1hckV4Y2VwdGlvbicsCidSZWdleCcsICdTa2lwVG8nLCAnU3RyaW5nRW5kJywgJ1N0cmluZ1N0YXJ0JywgJ1N1cHByZXNzJywgJ1Rva2VuJywgJ1Rva2VuQ29udmVydGVyJywgCidXaGl0ZScsICdXb3JkJywgJ1dvcmRFbmQnLCAnV29yZFN0YXJ0JywgJ1plcm9Pck1vcmUnLAonYWxwaGFudW1zJywgJ2FscGhhcycsICdhbHBoYXM4Yml0JywgJ2FueUNsb3NlVGFnJywgJ2FueU9wZW5UYWcnLCAnY1N0eWxlQ29tbWVudCcsICdjb2wnLAonY29tbWFTZXBhcmF0ZWRMaXN0JywgJ2NvbW1vbkhUTUxFbnRpdHknLCAnY291bnRlZEFycmF5JywgJ2NwcFN0eWxlQ29tbWVudCcsICdkYmxRdW90ZWRTdHJpbmcnLAonZGJsU2xhc2hDb21tZW50JywgJ2RlbGltaXRlZExpc3QnLCAnZGljdE9mJywgJ2Rvd25jYXNlVG9rZW5zJywgJ2VtcHR5JywgJ2hleG51bXMnLAonaHRtbENvbW1lbnQnLCAnamF2YVN0eWxlQ29tbWVudCcsICdsaW5lJywgJ2xpbmVFbmQnLCAnbGluZVN0YXJ0JywgJ2xpbmVubycsCidtYWtlSFRNTFRhZ3MnLCAnbWFrZVhNTFRhZ3MnLCAnbWF0Y2hPbmx5QXRDb2wnLCAnbWF0Y2hQcmV2aW91c0V4cHInLCAnbWF0Y2hQcmV2aW91c0xpdGVyYWwnLAonbmVzdGVkRXhwcicsICdudWxsRGVidWdBY3Rpb24nLCAnbnVtcycsICdvbmVPZicsICdvcEFzc29jJywgJ29wZXJhdG9yUHJlY2VkZW5jZScsICdwcmludGFibGVzJywKJ3B1bmM4Yml0JywgJ3B5dGhvblN0eWxlQ29tbWVudCcsICdxdW90ZWRTdHJpbmcnLCAncmVtb3ZlUXVvdGVzJywgJ3JlcGxhY2VIVE1MRW50aXR5JywgCidyZXBsYWNlV2l0aCcsICdyZXN0T2ZMaW5lJywgJ3NnbFF1b3RlZFN0cmluZycsICdzcmFuZ2UnLCAnc3RyaW5nRW5kJywKJ3N0cmluZ1N0YXJ0JywgJ3RyYWNlUGFyc2VBY3Rpb24nLCAndW5pY29kZVN0cmluZycsICd1cGNhc2VUb2tlbnMnLCAnd2l0aEF0dHJpYnV0ZScsCidpbmRlbnRlZEJsb2NrJywgJ29yaWdpbmFsVGV4dEZvcicsICd1bmdyb3VwJywgJ2luZml4Tm90YXRpb24nLCdsb2NhdGVkRXhwcicsICd3aXRoQ2xhc3MnLAonQ2xvc2VNYXRjaCcsICd0b2tlbk1hcCcsICdweXBhcnNpbmdfY29tbW9uJywKXQoKc3lzdGVtX3ZlcnNpb24gPSB0dXBsZShzeXMudmVyc2lvbl9pbmZvKVs6M10KUFlfMyA9IHN5c3RlbV92ZXJzaW9uWzBdID09IDMKaWYgUFlfMzoKICAgIF9NQVhfSU5UID0gc3lzLm1heHNpemUKICAgIGJhc2VzdHJpbmcgPSBzdHIKICAgIHVuaWNociA9IGNocgogICAgX3VzdHIgPSBzdHIKCiAgICAjIGJ1aWxkIGxpc3Qgb2Ygc2luZ2xlIGFyZyBidWlsdGlucywgdGhhdCBjYW4gYmUgdXNlZCBhcyBwYXJzZSBhY3Rpb25zCiAgICBzaW5nbGVBcmdCdWlsdGlucyA9IFtzdW0sIGxlbiwgc29ydGVkLCByZXZlcnNlZCwgbGlzdCwgdHVwbGUsIHNldCwgYW55LCBhbGwsIG1pbiwgbWF4XQoKZWxzZToKICAgIF9NQVhfSU5UID0gc3lzLm1heGludAogICAgcmFuZ2UgPSB4cmFuZ2UKCiAgICBkZWYgX3VzdHIob2JqKToKICAgICAgICAiIiJEcm9wLWluIHJlcGxhY2VtZW50IGZvciBzdHIob2JqKSB0aGF0IHRyaWVzIHRvIGJlIFVuaWNvZGUgZnJpZW5kbHkuIEl0IGZpcnN0IHRyaWVzCiAgICAgICAgICAgc3RyKG9iaikuIElmIHRoYXQgZmFpbHMgd2l0aCBhIFVuaWNvZGVFbmNvZGVFcnJvciwgdGhlbiBpdCB0cmllcyB1bmljb2RlKG9iaikuIEl0CiAgICAgICAgICAgdGhlbiA8IHJldHVybnMgdGhlIHVuaWNvZGUgb2JqZWN0IHwgZW5jb2RlcyBpdCB3aXRoIHRoZSBkZWZhdWx0IGVuY29kaW5nIHwgLi4uID4uCiAgICAgICAgIiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZShvYmosdW5pY29kZSk6CiAgICAgICAgICAgIHJldHVybiBvYmoKCiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIElmIHRoaXMgd29ya3MsIHRoZW4gX3VzdHIob2JqKSBoYXMgdGhlIHNhbWUgYmVoYXZpb3VyIGFzIHN0cihvYmopLCBzbwogICAgICAgICAgICAjIGl0IHdvbid0IGJyZWFrIGFueSBleGlzdGluZyBjb2RlLgogICAgICAgICAgICByZXR1cm4gc3RyKG9iaikKCiAgICAgICAgZXhjZXB0IFVuaWNvZGVFbmNvZGVFcnJvcjoKICAgICAgICAgICAgIyBFbHNlIGVuY29kZSBpdAogICAgICAgICAgICByZXQgPSB1bmljb2RlKG9iaikuZW5jb2RlKHN5cy5nZXRkZWZhdWx0ZW5jb2RpbmcoKSwgJ3htbGNoYXJyZWZyZXBsYWNlJykKICAgICAgICAgICAgeG1sY2hhcnJlZiA9IFJlZ2V4KCcmI1xkKzsnKQogICAgICAgICAgICB4bWxjaGFycmVmLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0OiAnXFx1JyArIGhleChpbnQodFswXVsyOi0xXSkpWzI6XSkKICAgICAgICAgICAgcmV0dXJuIHhtbGNoYXJyZWYudHJhbnNmb3JtU3RyaW5nKHJldCkKCiAgICAjIGJ1aWxkIGxpc3Qgb2Ygc2luZ2xlIGFyZyBidWlsdGlucywgdG9sZXJhbnQgb2YgUHl0aG9uIHZlcnNpb24sIHRoYXQgY2FuIGJlIHVzZWQgYXMgcGFyc2UgYWN0aW9ucwogICAgc2luZ2xlQXJnQnVpbHRpbnMgPSBbXQogICAgaW1wb3J0IF9fYnVpbHRpbl9fCiAgICBmb3IgZm5hbWUgaW4gInN1bSBsZW4gc29ydGVkIHJldmVyc2VkIGxpc3QgdHVwbGUgc2V0IGFueSBhbGwgbWluIG1heCIuc3BsaXQoKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNpbmdsZUFyZ0J1aWx0aW5zLmFwcGVuZChnZXRhdHRyKF9fYnVpbHRpbl9fLGZuYW1lKSkKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIApfZ2VuZXJhdG9yVHlwZSA9IHR5cGUoKHkgZm9yIHkgaW4gcmFuZ2UoMSkpKQogCmRlZiBfeG1sX2VzY2FwZShkYXRhKToKICAgICIiIkVzY2FwZSAmLCA8LCA+LCAiLCAnLCBldGMuIGluIGEgc3RyaW5nIG9mIGRhdGEuIiIiCgogICAgIyBhbXBlcnNhbmQgbXVzdCBiZSByZXBsYWNlZCBmaXJzdAogICAgZnJvbV9zeW1ib2xzID0gJyY+PCJcJycKICAgIHRvX3N5bWJvbHMgPSAoJyYnK3MrJzsnIGZvciBzIGluICJhbXAgZ3QgbHQgcXVvdCBhcG9zIi5zcGxpdCgpKQogICAgZm9yIGZyb21fLHRvXyBpbiB6aXAoZnJvbV9zeW1ib2xzLCB0b19zeW1ib2xzKToKICAgICAgICBkYXRhID0gZGF0YS5yZXBsYWNlKGZyb21fLCB0b18pCiAgICByZXR1cm4gZGF0YQoKY2xhc3MgX0NvbnN0YW50cyhvYmplY3QpOgogICAgcGFzcwoKYWxwaGFzICAgICA9IHN0cmluZy5hc2NpaV91cHBlcmNhc2UgKyBzdHJpbmcuYXNjaWlfbG93ZXJjYXNlCm51bXMgICAgICAgPSAiMDEyMzQ1Njc4OSIKaGV4bnVtcyAgICA9IG51bXMgKyAiQUJDREVGYWJjZGVmIgphbHBoYW51bXMgID0gYWxwaGFzICsgbnVtcwpfYnNsYXNoICAgID0gY2hyKDkyKQpwcmludGFibGVzID0gIiIuam9pbihjIGZvciBjIGluIHN0cmluZy5wcmludGFibGUgaWYgYyBub3QgaW4gc3RyaW5nLndoaXRlc3BhY2UpCgpjbGFzcyBQYXJzZUJhc2VFeGNlcHRpb24oRXhjZXB0aW9uKToKICAgICIiImJhc2UgZXhjZXB0aW9uIGNsYXNzIGZvciBhbGwgcGFyc2luZyBydW50aW1lIGV4Y2VwdGlvbnMiIiIKICAgICMgUGVyZm9ybWFuY2UgdHVuaW5nOiB3ZSBjb25zdHJ1Y3QgYSAqbG90KiBvZiB0aGVzZSwgc28ga2VlcCB0aGlzCiAgICAjIGNvbnN0cnVjdG9yIGFzIHNtYWxsIGFuZCBmYXN0IGFzIHBvc3NpYmxlCiAgICBkZWYgX19pbml0X18oIHNlbGYsIHBzdHIsIGxvYz0wLCBtc2c9Tm9uZSwgZWxlbT1Ob25lICk6CiAgICAgICAgc2VsZi5sb2MgPSBsb2MKICAgICAgICBpZiBtc2cgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5tc2cgPSBwc3RyCiAgICAgICAgICAgIHNlbGYucHN0ciA9ICIiCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5tc2cgPSBtc2cKICAgICAgICAgICAgc2VsZi5wc3RyID0gcHN0cgogICAgICAgIHNlbGYucGFyc2VyRWxlbWVudCA9IGVsZW0KICAgICAgICBzZWxmLmFyZ3MgPSAocHN0ciwgbG9jLCBtc2cpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX2Zyb21fZXhjZXB0aW9uKGNscywgcGUpOgogICAgICAgICIiIgogICAgICAgIGludGVybmFsIGZhY3RvcnkgbWV0aG9kIHRvIHNpbXBsaWZ5IGNyZWF0aW5nIG9uZSB0eXBlIG9mIFBhcnNlRXhjZXB0aW9uIAogICAgICAgIGZyb20gYW5vdGhlciAtIGF2b2lkcyBoYXZpbmcgX19pbml0X18gc2lnbmF0dXJlIGNvbmZsaWN0cyBhbW9uZyBzdWJjbGFzc2VzCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGNscyhwZS5wc3RyLCBwZS5sb2MsIHBlLm1zZywgcGUucGFyc2VyRWxlbWVudCkKCiAgICBkZWYgX19nZXRhdHRyX18oIHNlbGYsIGFuYW1lICk6CiAgICAgICAgIiIic3VwcG9ydGVkIGF0dHJpYnV0ZXMgYnkgbmFtZSBhcmU6CiAgICAgICAgICAgIC0gbGluZW5vIC0gcmV0dXJucyB0aGUgbGluZSBudW1iZXIgb2YgdGhlIGV4Y2VwdGlvbiB0ZXh0CiAgICAgICAgICAgIC0gY29sIC0gcmV0dXJucyB0aGUgY29sdW1uIG51bWJlciBvZiB0aGUgZXhjZXB0aW9uIHRleHQKICAgICAgICAgICAgLSBsaW5lIC0gcmV0dXJucyB0aGUgbGluZSBjb250YWluaW5nIHRoZSBleGNlcHRpb24gdGV4dAogICAgICAgICIiIgogICAgICAgIGlmKCBhbmFtZSA9PSAibGluZW5vIiApOgogICAgICAgICAgICByZXR1cm4gbGluZW5vKCBzZWxmLmxvYywgc2VsZi5wc3RyICkKICAgICAgICBlbGlmKCBhbmFtZSBpbiAoImNvbCIsICJjb2x1bW4iKSApOgogICAgICAgICAgICByZXR1cm4gY29sKCBzZWxmLmxvYywgc2VsZi5wc3RyICkKICAgICAgICBlbGlmKCBhbmFtZSA9PSAibGluZSIgKToKICAgICAgICAgICAgcmV0dXJuIGxpbmUoIHNlbGYubG9jLCBzZWxmLnBzdHIgKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKGFuYW1lKQoKICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6CiAgICAgICAgcmV0dXJuICIlcyAoYXQgY2hhciAlZCksIChsaW5lOiVkLCBjb2w6JWQpIiAlIFwKICAgICAgICAgICAgICAgICggc2VsZi5tc2csIHNlbGYubG9jLCBzZWxmLmxpbmVubywgc2VsZi5jb2x1bW4gKQogICAgZGVmIF9fcmVwcl9fKCBzZWxmICk6CiAgICAgICAgcmV0dXJuIF91c3RyKHNlbGYpCiAgICBkZWYgbWFya0lucHV0bGluZSggc2VsZiwgbWFya2VyU3RyaW5nID0gIj4hPCIgKToKICAgICAgICAiIiJFeHRyYWN0cyB0aGUgZXhjZXB0aW9uIGxpbmUgZnJvbSB0aGUgaW5wdXQgc3RyaW5nLCBhbmQgbWFya3MKICAgICAgICAgICB0aGUgbG9jYXRpb24gb2YgdGhlIGV4Y2VwdGlvbiB3aXRoIGEgc3BlY2lhbCBzeW1ib2wuCiAgICAgICAgIiIiCiAgICAgICAgbGluZV9zdHIgPSBzZWxmLmxpbmUKICAgICAgICBsaW5lX2NvbHVtbiA9IHNlbGYuY29sdW1uIC0gMQogICAgICAgIGlmIG1hcmtlclN0cmluZzoKICAgICAgICAgICAgbGluZV9zdHIgPSAiIi5qb2luKChsaW5lX3N0cls6bGluZV9jb2x1bW5dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlclN0cmluZywgbGluZV9zdHJbbGluZV9jb2x1bW46XSkpCiAgICAgICAgcmV0dXJuIGxpbmVfc3RyLnN0cmlwKCkKICAgIGRlZiBfX2Rpcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAibGluZW5vIGNvbCBsaW5lIi5zcGxpdCgpICsgZGlyKHR5cGUoc2VsZikpCgpjbGFzcyBQYXJzZUV4Y2VwdGlvbihQYXJzZUJhc2VFeGNlcHRpb24pOgogICAgIiIiCiAgICBFeGNlcHRpb24gdGhyb3duIHdoZW4gcGFyc2UgZXhwcmVzc2lvbnMgZG9uJ3QgbWF0Y2ggY2xhc3M7CiAgICBzdXBwb3J0ZWQgYXR0cmlidXRlcyBieSBuYW1lIGFyZToKICAgICAtIGxpbmVubyAtIHJldHVybnMgdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBleGNlcHRpb24gdGV4dAogICAgIC0gY29sIC0gcmV0dXJucyB0aGUgY29sdW1uIG51bWJlciBvZiB0aGUgZXhjZXB0aW9uIHRleHQKICAgICAtIGxpbmUgLSByZXR1cm5zIHRoZSBsaW5lIGNvbnRhaW5pbmcgdGhlIGV4Y2VwdGlvbiB0ZXh0CiAgICAgICAgCiAgICBFeGFtcGxlOjoKICAgICAgICB0cnk6CiAgICAgICAgICAgIFdvcmQobnVtcykuc2V0TmFtZSgiaW50ZWdlciIpLnBhcnNlU3RyaW5nKCJBQkMiKQogICAgICAgIGV4Y2VwdCBQYXJzZUV4Y2VwdGlvbiBhcyBwZToKICAgICAgICAgICAgcHJpbnQocGUpCiAgICAgICAgICAgIHByaW50KCJjb2x1bW46IHt9Ii5mb3JtYXQocGUuY29sKSkKICAgICAgICAgICAgCiAgICBwcmludHM6OgogICAgICAgRXhwZWN0ZWQgaW50ZWdlciAoYXQgY2hhciAwKSwgKGxpbmU6MSwgY29sOjEpCiAgICAgICAgY29sdW1uOiAxCiAgICAiIiIKICAgIHBhc3MKCmNsYXNzIFBhcnNlRmF0YWxFeGNlcHRpb24oUGFyc2VCYXNlRXhjZXB0aW9uKToKICAgICIiInVzZXItdGhyb3dhYmxlIGV4Y2VwdGlvbiB0aHJvd24gd2hlbiBpbmNvbnNpc3RlbnQgcGFyc2UgY29udGVudAogICAgICAgaXMgZm91bmQ7IHN0b3BzIGFsbCBwYXJzaW5nIGltbWVkaWF0ZWx5IiIiCiAgICBwYXNzCgpjbGFzcyBQYXJzZVN5bnRheEV4Y2VwdGlvbihQYXJzZUZhdGFsRXhjZXB0aW9uKToKICAgICIiImp1c3QgbGlrZSBMe1BhcnNlRmF0YWxFeGNlcHRpb259LCBidXQgdGhyb3duIGludGVybmFsbHkgd2hlbiBhbgogICAgICAgTHtFcnJvclN0b3A8QW5kLl9FcnJvclN0b3A+fSAoJy0nIG9wZXJhdG9yKSBpbmRpY2F0ZXMgdGhhdCBwYXJzaW5nIGlzIHRvIHN0b3AgCiAgICAgICBpbW1lZGlhdGVseSBiZWNhdXNlIGFuIHVuYmFja3RyYWNrYWJsZSBzeW50YXggZXJyb3IgaGFzIGJlZW4gZm91bmQiIiIKICAgIHBhc3MKCiN+IGNsYXNzIFJlcGFyc2VFeGNlcHRpb24oUGFyc2VCYXNlRXhjZXB0aW9uKToKICAgICN+ICIiIkV4cGVyaW1lbnRhbCBjbGFzcyAtIHBhcnNlIGFjdGlvbnMgY2FuIHJhaXNlIHRoaXMgZXhjZXB0aW9uIHRvIGNhdXNlCiAgICAgICAjfiBweXBhcnNpbmcgdG8gcmVwYXJzZSB0aGUgaW5wdXQgc3RyaW5nOgogICAgICAgICN+IC0gd2l0aCBhIG1vZGlmaWVkIGlucHV0IHN0cmluZywgYW5kL29yCiAgICAgICAgI34gLSB3aXRoIGEgbW9kaWZpZWQgc3RhcnQgbG9jYXRpb24KICAgICAgICN+IFNldCB0aGUgdmFsdWVzIG9mIHRoZSBSZXBhcnNlRXhjZXB0aW9uIGluIHRoZSBjb25zdHJ1Y3RvciwgYW5kIHJhaXNlIHRoZQogICAgICAgI34gZXhjZXB0aW9uIGluIGEgcGFyc2UgYWN0aW9uIHRvIGNhdXNlIHB5cGFyc2luZyB0byB1c2UgdGhlIG5ldyBzdHJpbmcvbG9jYXRpb24uCiAgICAgICAjfiBTZXR0aW5nIHRoZSB2YWx1ZXMgYXMgTm9uZSBjYXVzZXMgbm8gY2hhbmdlIHRvIGJlIG1hZGUuCiAgICAgICAjfiAiIiIKICAgICN+IGRlZiBfX2luaXRfKCBzZWxmLCBuZXdzdHJpbmcsIHJlc3RhcnRMb2MgKToKICAgICAgICAjfiBzZWxmLm5ld1BhcnNlVGV4dCA9IG5ld3N0cmluZwogICAgICAgICN+IHNlbGYucmVwYXJzZUxvYyA9IHJlc3RhcnRMb2MKCmNsYXNzIFJlY3Vyc2l2ZUdyYW1tYXJFeGNlcHRpb24oRXhjZXB0aW9uKToKICAgICIiImV4Y2VwdGlvbiB0aHJvd24gYnkgTHtQYXJzZXJFbGVtZW50LnZhbGlkYXRlfSBpZiB0aGUgZ3JhbW1hciBjb3VsZCBiZSBpbXByb3Blcmx5IHJlY3Vyc2l2ZSIiIgogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBwYXJzZUVsZW1lbnRMaXN0ICk6CiAgICAgICAgc2VsZi5wYXJzZUVsZW1lbnRUcmFjZSA9IHBhcnNlRWxlbWVudExpc3QKCiAgICBkZWYgX19zdHJfXyggc2VsZiApOgogICAgICAgIHJldHVybiAiUmVjdXJzaXZlR3JhbW1hckV4Y2VwdGlvbjogJXMiICUgc2VsZi5wYXJzZUVsZW1lbnRUcmFjZQoKY2xhc3MgX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLHAxLHAyKToKICAgICAgICBzZWxmLnR1cCA9IChwMSxwMikKICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLGkpOgogICAgICAgIHJldHVybiBzZWxmLnR1cFtpXQogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiByZXByKHNlbGYudHVwWzBdKQogICAgZGVmIHNldE9mZnNldChzZWxmLGkpOgogICAgICAgIHNlbGYudHVwID0gKHNlbGYudHVwWzBdLGkpCgpjbGFzcyBQYXJzZVJlc3VsdHMob2JqZWN0KToKICAgICIiIgogICAgU3RydWN0dXJlZCBwYXJzZSByZXN1bHRzLCB0byBwcm92aWRlIG11bHRpcGxlIG1lYW5zIG9mIGFjY2VzcyB0byB0aGUgcGFyc2VkIGRhdGE6CiAgICAgICAtIGFzIGEgbGlzdCAoQ3tsZW4ocmVzdWx0cyl9KQogICAgICAgLSBieSBsaXN0IGluZGV4IChDe3Jlc3VsdHNbMF0sIHJlc3VsdHNbMV19LCBldGMuKQogICAgICAgLSBieSBhdHRyaWJ1dGUgKEN7cmVzdWx0cy48cmVzdWx0c05hbWU+fSAtIHNlZSBMe1BhcnNlckVsZW1lbnQuc2V0UmVzdWx0c05hbWV9KQoKICAgIEV4YW1wbGU6OgogICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpCiAgICAgICAgZGF0ZV9zdHIgPSAoaW50ZWdlci5zZXRSZXN1bHRzTmFtZSgieWVhciIpICsgJy8nIAogICAgICAgICAgICAgICAgICAgICAgICArIGludGVnZXIuc2V0UmVzdWx0c05hbWUoIm1vbnRoIikgKyAnLycgCiAgICAgICAgICAgICAgICAgICAgICAgICsgaW50ZWdlci5zZXRSZXN1bHRzTmFtZSgiZGF5IikpCiAgICAgICAgIyBlcXVpdmFsZW50IGZvcm06CiAgICAgICAgIyBkYXRlX3N0ciA9IGludGVnZXIoInllYXIiKSArICcvJyArIGludGVnZXIoIm1vbnRoIikgKyAnLycgKyBpbnRlZ2VyKCJkYXkiKQoKICAgICAgICAjIHBhcnNlU3RyaW5nIHJldHVybnMgYSBQYXJzZVJlc3VsdHMgb2JqZWN0CiAgICAgICAgcmVzdWx0ID0gZGF0ZV9zdHIucGFyc2VTdHJpbmcoIjE5OTkvMTIvMzEiKQoKICAgICAgICBkZWYgdGVzdChzLCBmbj1yZXByKToKICAgICAgICAgICAgcHJpbnQoIiVzIC0+ICVzIiAlIChzLCBmbihldmFsKHMpKSkpCiAgICAgICAgdGVzdCgibGlzdChyZXN1bHQpIikKICAgICAgICB0ZXN0KCJyZXN1bHRbMF0iKQogICAgICAgIHRlc3QoInJlc3VsdFsnbW9udGgnXSIpCiAgICAgICAgdGVzdCgicmVzdWx0LmRheSIpCiAgICAgICAgdGVzdCgiJ21vbnRoJyBpbiByZXN1bHQiKQogICAgICAgIHRlc3QoIidtaW51dGVzJyBpbiByZXN1bHQiKQogICAgICAgIHRlc3QoInJlc3VsdC5kdW1wKCkiLCBzdHIpCiAgICBwcmludHM6OgogICAgICAgIGxpc3QocmVzdWx0KSAtPiBbJzE5OTknLCAnLycsICcxMicsICcvJywgJzMxJ10KICAgICAgICByZXN1bHRbMF0gLT4gJzE5OTknCiAgICAgICAgcmVzdWx0Wydtb250aCddIC0+ICcxMicKICAgICAgICByZXN1bHQuZGF5IC0+ICczMScKICAgICAgICAnbW9udGgnIGluIHJlc3VsdCAtPiBUcnVlCiAgICAgICAgJ21pbnV0ZXMnIGluIHJlc3VsdCAtPiBGYWxzZQogICAgICAgIHJlc3VsdC5kdW1wKCkgLT4gWycxOTk5JywgJy8nLCAnMTInLCAnLycsICczMSddCiAgICAgICAgLSBkYXk6IDMxCiAgICAgICAgLSBtb250aDogMTIKICAgICAgICAtIHllYXI6IDE5OTkKICAgICIiIgogICAgZGVmIF9fbmV3X18oY2xzLCB0b2tsaXN0PU5vbmUsIG5hbWU9Tm9uZSwgYXNMaXN0PVRydWUsIG1vZGFsPVRydWUgKToKICAgICAgICBpZiBpc2luc3RhbmNlKHRva2xpc3QsIGNscyk6CiAgICAgICAgICAgIHJldHVybiB0b2tsaXN0CiAgICAgICAgcmV0b2JqID0gb2JqZWN0Ll9fbmV3X18oY2xzKQogICAgICAgIHJldG9iai5fX2RvaW5pdCA9IFRydWUKICAgICAgICByZXR1cm4gcmV0b2JqCgogICAgIyBQZXJmb3JtYW5jZSB0dW5pbmc6IHdlIGNvbnN0cnVjdCBhICpsb3QqIG9mIHRoZXNlLCBzbyBrZWVwIHRoaXMKICAgICMgY29uc3RydWN0b3IgYXMgc21hbGwgYW5kIGZhc3QgYXMgcG9zc2libGUKICAgIGRlZiBfX2luaXRfXyggc2VsZiwgdG9rbGlzdD1Ob25lLCBuYW1lPU5vbmUsIGFzTGlzdD1UcnVlLCBtb2RhbD1UcnVlLCBpc2luc3RhbmNlPWlzaW5zdGFuY2UgKToKICAgICAgICBpZiBzZWxmLl9fZG9pbml0OgogICAgICAgICAgICBzZWxmLl9fZG9pbml0ID0gRmFsc2UKICAgICAgICAgICAgc2VsZi5fX25hbWUgPSBOb25lCiAgICAgICAgICAgIHNlbGYuX19wYXJlbnQgPSBOb25lCiAgICAgICAgICAgIHNlbGYuX19hY2N1bU5hbWVzID0ge30KICAgICAgICAgICAgc2VsZi5fX2FzTGlzdCA9IGFzTGlzdAogICAgICAgICAgICBzZWxmLl9fbW9kYWwgPSBtb2RhbAogICAgICAgICAgICBpZiB0b2tsaXN0IGlzIE5vbmU6CiAgICAgICAgICAgICAgICB0b2tsaXN0ID0gW10KICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh0b2tsaXN0LCBsaXN0KToKICAgICAgICAgICAgICAgIHNlbGYuX190b2tsaXN0ID0gdG9rbGlzdFs6XQogICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UodG9rbGlzdCwgX2dlbmVyYXRvclR5cGUpOgogICAgICAgICAgICAgICAgc2VsZi5fX3Rva2xpc3QgPSBsaXN0KHRva2xpc3QpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9fdG9rbGlzdCA9IFt0b2tsaXN0XQogICAgICAgICAgICBzZWxmLl9fdG9rZGljdCA9IGRpY3QoKQoKICAgICAgICBpZiBuYW1lIGlzIG5vdCBOb25lIGFuZCBuYW1lOgogICAgICAgICAgICBpZiBub3QgbW9kYWw6CiAgICAgICAgICAgICAgICBzZWxmLl9fYWNjdW1OYW1lc1tuYW1lXSA9IDAKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShuYW1lLGludCk6CiAgICAgICAgICAgICAgICBuYW1lID0gX3VzdHIobmFtZSkgIyB3aWxsIGFsd2F5cyByZXR1cm4gYSBzdHIsIGJ1dCB1c2UgX3VzdHIgZm9yIGNvbnNpc3RlbmN5CiAgICAgICAgICAgIHNlbGYuX19uYW1lID0gbmFtZQogICAgICAgICAgICBpZiBub3QgKGlzaW5zdGFuY2UodG9rbGlzdCwgKHR5cGUoTm9uZSksIGJhc2VzdHJpbmcsIGxpc3QpKSBhbmQgdG9rbGlzdCBpbiAoTm9uZSwnJyxbXSkpOgogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh0b2tsaXN0LGJhc2VzdHJpbmcpOgogICAgICAgICAgICAgICAgICAgIHRva2xpc3QgPSBbIHRva2xpc3QgXQogICAgICAgICAgICAgICAgaWYgYXNMaXN0OgogICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodG9rbGlzdCxQYXJzZVJlc3VsdHMpOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmW25hbWVdID0gX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQodG9rbGlzdC5jb3B5KCksMCkKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmW25hbWVdID0gX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQoUGFyc2VSZXN1bHRzKHRva2xpc3RbMF0pLDApCiAgICAgICAgICAgICAgICAgICAgc2VsZltuYW1lXS5fX25hbWUgPSBuYW1lCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZltuYW1lXSA9IHRva2xpc3RbMF0KICAgICAgICAgICAgICAgICAgICBleGNlcHQgKEtleUVycm9yLFR5cGVFcnJvcixJbmRleEVycm9yKToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZltuYW1lXSA9IHRva2xpc3QKCiAgICBkZWYgX19nZXRpdGVtX18oIHNlbGYsIGkgKToKICAgICAgICBpZiBpc2luc3RhbmNlKCBpLCAoaW50LHNsaWNlKSApOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fX3Rva2xpc3RbaV0KICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBpIG5vdCBpbiBzZWxmLl9fYWNjdW1OYW1lczoKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9fdG9rZGljdFtpXVstMV1bMF0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiBQYXJzZVJlc3VsdHMoWyB2WzBdIGZvciB2IGluIHNlbGYuX190b2tkaWN0W2ldIF0pCgogICAgZGVmIF9fc2V0aXRlbV9fKCBzZWxmLCBrLCB2LCBpc2luc3RhbmNlPWlzaW5zdGFuY2UgKToKICAgICAgICBpZiBpc2luc3RhbmNlKHYsX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQpOgogICAgICAgICAgICBzZWxmLl9fdG9rZGljdFtrXSA9IHNlbGYuX190b2tkaWN0LmdldChrLGxpc3QoKSkgKyBbdl0KICAgICAgICAgICAgc3ViID0gdlswXQogICAgICAgIGVsaWYgaXNpbnN0YW5jZShrLChpbnQsc2xpY2UpKToKICAgICAgICAgICAgc2VsZi5fX3Rva2xpc3Rba10gPSB2CiAgICAgICAgICAgIHN1YiA9IHYKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLl9fdG9rZGljdFtrXSA9IHNlbGYuX190b2tkaWN0LmdldChrLGxpc3QoKSkgKyBbX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQodiwwKV0KICAgICAgICAgICAgc3ViID0gdgogICAgICAgIGlmIGlzaW5zdGFuY2Uoc3ViLFBhcnNlUmVzdWx0cyk6CiAgICAgICAgICAgIHN1Yi5fX3BhcmVudCA9IHdrcmVmKHNlbGYpCgogICAgZGVmIF9fZGVsaXRlbV9fKCBzZWxmLCBpICk6CiAgICAgICAgaWYgaXNpbnN0YW5jZShpLChpbnQsc2xpY2UpKToKICAgICAgICAgICAgbXlsZW4gPSBsZW4oIHNlbGYuX190b2tsaXN0ICkKICAgICAgICAgICAgZGVsIHNlbGYuX190b2tsaXN0W2ldCgogICAgICAgICAgICAjIGNvbnZlcnQgaW50IHRvIHNsaWNlCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoaSwgaW50KToKICAgICAgICAgICAgICAgIGlmIGkgPCAwOgogICAgICAgICAgICAgICAgICAgIGkgKz0gbXlsZW4KICAgICAgICAgICAgICAgIGkgPSBzbGljZShpLCBpKzEpCiAgICAgICAgICAgICMgZ2V0IHJlbW92ZWQgaW5kaWNlcwogICAgICAgICAgICByZW1vdmVkID0gbGlzdChyYW5nZSgqaS5pbmRpY2VzKG15bGVuKSkpCiAgICAgICAgICAgIHJlbW92ZWQucmV2ZXJzZSgpCiAgICAgICAgICAgICMgZml4dXAgaW5kaWNlcyBpbiB0b2tlbiBkaWN0aW9uYXJ5CiAgICAgICAgICAgIGZvciBuYW1lLG9jY3VycmVuY2VzIGluIHNlbGYuX190b2tkaWN0Lml0ZW1zKCk6CiAgICAgICAgICAgICAgICBmb3IgaiBpbiByZW1vdmVkOgogICAgICAgICAgICAgICAgICAgIGZvciBrLCAodmFsdWUsIHBvc2l0aW9uKSBpbiBlbnVtZXJhdGUob2NjdXJyZW5jZXMpOgogICAgICAgICAgICAgICAgICAgICAgICBvY2N1cnJlbmNlc1trXSA9IF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KHZhbHVlLCBwb3NpdGlvbiAtIChwb3NpdGlvbiA+IGopKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGRlbCBzZWxmLl9fdG9rZGljdFtpXQoKICAgIGRlZiBfX2NvbnRhaW5zX18oIHNlbGYsIGsgKToKICAgICAgICByZXR1cm4gayBpbiBzZWxmLl9fdG9rZGljdAoKICAgIGRlZiBfX2xlbl9fKCBzZWxmICk6IHJldHVybiBsZW4oIHNlbGYuX190b2tsaXN0ICkKICAgIGRlZiBfX2Jvb2xfXyhzZWxmKTogcmV0dXJuICggbm90IG5vdCBzZWxmLl9fdG9rbGlzdCApCiAgICBfX25vbnplcm9fXyA9IF9fYm9vbF9fCiAgICBkZWYgX19pdGVyX18oIHNlbGYgKTogcmV0dXJuIGl0ZXIoIHNlbGYuX190b2tsaXN0ICkKICAgIGRlZiBfX3JldmVyc2VkX18oIHNlbGYgKTogcmV0dXJuIGl0ZXIoIHNlbGYuX190b2tsaXN0Wzo6LTFdICkKICAgIGRlZiBfaXRlcmtleXMoIHNlbGYgKToKICAgICAgICBpZiBoYXNhdHRyKHNlbGYuX190b2tkaWN0LCAiaXRlcmtleXMiKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX190b2tkaWN0Lml0ZXJrZXlzKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gaXRlcihzZWxmLl9fdG9rZGljdCkKCiAgICBkZWYgX2l0ZXJ2YWx1ZXMoIHNlbGYgKToKICAgICAgICByZXR1cm4gKHNlbGZba10gZm9yIGsgaW4gc2VsZi5faXRlcmtleXMoKSkKICAgICAgICAgICAgCiAgICBkZWYgX2l0ZXJpdGVtcyggc2VsZiApOgogICAgICAgIHJldHVybiAoKGssIHNlbGZba10pIGZvciBrIGluIHNlbGYuX2l0ZXJrZXlzKCkpCgogICAgaWYgUFlfMzoKICAgICAgICBrZXlzID0gX2l0ZXJrZXlzICAgICAgIAogICAgICAgICIiIlJldHVybnMgYW4gaXRlcmF0b3Igb2YgYWxsIG5hbWVkIHJlc3VsdCBrZXlzIChQeXRob24gMy54IG9ubHkpLiIiIgoKICAgICAgICB2YWx1ZXMgPSBfaXRlcnZhbHVlcwogICAgICAgICIiIlJldHVybnMgYW4gaXRlcmF0b3Igb2YgYWxsIG5hbWVkIHJlc3VsdCB2YWx1ZXMgKFB5dGhvbiAzLnggb25seSkuIiIiCgogICAgICAgIGl0ZW1zID0gX2l0ZXJpdGVtcwogICAgICAgICIiIlJldHVybnMgYW4gaXRlcmF0b3Igb2YgYWxsIG5hbWVkIHJlc3VsdCBrZXktdmFsdWUgdHVwbGVzIChQeXRob24gMy54IG9ubHkpLiIiIgoKICAgIGVsc2U6CiAgICAgICAgaXRlcmtleXMgPSBfaXRlcmtleXMKICAgICAgICAiIiJSZXR1cm5zIGFuIGl0ZXJhdG9yIG9mIGFsbCBuYW1lZCByZXN1bHQga2V5cyAoUHl0aG9uIDIueCBvbmx5KS4iIiIKCiAgICAgICAgaXRlcnZhbHVlcyA9IF9pdGVydmFsdWVzCiAgICAgICAgIiIiUmV0dXJucyBhbiBpdGVyYXRvciBvZiBhbGwgbmFtZWQgcmVzdWx0IHZhbHVlcyAoUHl0aG9uIDIueCBvbmx5KS4iIiIKCiAgICAgICAgaXRlcml0ZW1zID0gX2l0ZXJpdGVtcwogICAgICAgICIiIlJldHVybnMgYW4gaXRlcmF0b3Igb2YgYWxsIG5hbWVkIHJlc3VsdCBrZXktdmFsdWUgdHVwbGVzIChQeXRob24gMi54IG9ubHkpLiIiIgoKICAgICAgICBkZWYga2V5cyggc2VsZiApOgogICAgICAgICAgICAiIiJSZXR1cm5zIGFsbCBuYW1lZCByZXN1bHQga2V5cyAoYXMgYSBsaXN0IGluIFB5dGhvbiAyLngsIGFzIGFuIGl0ZXJhdG9yIGluIFB5dGhvbiAzLngpLiIiIgogICAgICAgICAgICByZXR1cm4gbGlzdChzZWxmLml0ZXJrZXlzKCkpCgogICAgICAgIGRlZiB2YWx1ZXMoIHNlbGYgKToKICAgICAgICAgICAgIiIiUmV0dXJucyBhbGwgbmFtZWQgcmVzdWx0IHZhbHVlcyAoYXMgYSBsaXN0IGluIFB5dGhvbiAyLngsIGFzIGFuIGl0ZXJhdG9yIGluIFB5dGhvbiAzLngpLiIiIgogICAgICAgICAgICByZXR1cm4gbGlzdChzZWxmLml0ZXJ2YWx1ZXMoKSkKICAgICAgICAgICAgICAgIAogICAgICAgIGRlZiBpdGVtcyggc2VsZiApOgogICAgICAgICAgICAiIiJSZXR1cm5zIGFsbCBuYW1lZCByZXN1bHQga2V5LXZhbHVlcyAoYXMgYSBsaXN0IG9mIHR1cGxlcyBpbiBQeXRob24gMi54LCBhcyBhbiBpdGVyYXRvciBpbiBQeXRob24gMy54KS4iIiIKICAgICAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5pdGVyaXRlbXMoKSkKCiAgICBkZWYgaGFza2V5cyggc2VsZiApOgogICAgICAgICIiIlNpbmNlIGtleXMoKSByZXR1cm5zIGFuIGl0ZXJhdG9yLCB0aGlzIG1ldGhvZCBpcyBoZWxwZnVsIGluIGJ5cGFzc2luZwogICAgICAgICAgIGNvZGUgdGhhdCBsb29rcyBmb3IgdGhlIGV4aXN0ZW5jZSBvZiBhbnkgZGVmaW5lZCByZXN1bHRzIG5hbWVzLiIiIgogICAgICAgIHJldHVybiBib29sKHNlbGYuX190b2tkaWN0KQogICAgICAgIAogICAgZGVmIHBvcCggc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAiIiIKICAgICAgICBSZW1vdmVzIGFuZCByZXR1cm5zIGl0ZW0gYXQgc3BlY2lmaWVkIGluZGV4IChkZWZhdWx0PUN7bGFzdH0pLgogICAgICAgIFN1cHBvcnRzIGJvdGggQ3tsaXN0fSBhbmQgQ3tkaWN0fSBzZW1hbnRpY3MgZm9yIEN7cG9wKCl9LiBJZiBwYXNzZWQgbm8KICAgICAgICBhcmd1bWVudCBvciBhbiBpbnRlZ2VyIGFyZ3VtZW50LCBpdCB3aWxsIHVzZSBDe2xpc3R9IHNlbWFudGljcwogICAgICAgIGFuZCBwb3AgdG9rZW5zIGZyb20gdGhlIGxpc3Qgb2YgcGFyc2VkIHRva2Vucy4gSWYgcGFzc2VkIGEgCiAgICAgICAgbm9uLWludGVnZXIgYXJndW1lbnQgKG1vc3QgbGlrZWx5IGEgc3RyaW5nKSwgaXQgd2lsbCB1c2UgQ3tkaWN0fQogICAgICAgIHNlbWFudGljcyBhbmQgcG9wIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGZyb20gYW55IGRlZmluZWQgCiAgICAgICAgcmVzdWx0cyBuYW1lcy4gQSBzZWNvbmQgZGVmYXVsdCByZXR1cm4gdmFsdWUgYXJndW1lbnQgaXMgCiAgICAgICAgc3VwcG9ydGVkLCBqdXN0IGFzIGluIEN7ZGljdC5wb3AoKX0uCgogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICBkZWYgcmVtb3ZlX2ZpcnN0KHRva2Vucyk6CiAgICAgICAgICAgICAgICB0b2tlbnMucG9wKDApCiAgICAgICAgICAgIHByaW50KE9uZU9yTW9yZShXb3JkKG51bXMpKS5wYXJzZVN0cmluZygiMCAxMjMgMzIxIikpICMgLT4gWycwJywgJzEyMycsICczMjEnXQogICAgICAgICAgICBwcmludChPbmVPck1vcmUoV29yZChudW1zKSkuYWRkUGFyc2VBY3Rpb24ocmVtb3ZlX2ZpcnN0KS5wYXJzZVN0cmluZygiMCAxMjMgMzIxIikpICMgLT4gWycxMjMnLCAnMzIxJ10KCiAgICAgICAgICAgIGxhYmVsID0gV29yZChhbHBoYXMpCiAgICAgICAgICAgIHBhdHQgPSBsYWJlbCgiTEFCRUwiKSArIE9uZU9yTW9yZShXb3JkKG51bXMpKQogICAgICAgICAgICBwcmludChwYXR0LnBhcnNlU3RyaW5nKCJBQUIgMTIzIDMyMSIpLmR1bXAoKSkKCiAgICAgICAgICAgICMgVXNlIHBvcCgpIGluIGEgcGFyc2UgYWN0aW9uIHRvIHJlbW92ZSBuYW1lZCByZXN1bHQgKG5vdGUgdGhhdCBjb3JyZXNwb25kaW5nIHZhbHVlIGlzIG5vdAogICAgICAgICAgICAjIHJlbW92ZWQgZnJvbSBsaXN0IGZvcm0gb2YgcmVzdWx0cykKICAgICAgICAgICAgZGVmIHJlbW92ZV9MQUJFTCh0b2tlbnMpOgogICAgICAgICAgICAgICAgdG9rZW5zLnBvcCgiTEFCRUwiKQogICAgICAgICAgICAgICAgcmV0dXJuIHRva2VucwogICAgICAgICAgICBwYXR0LmFkZFBhcnNlQWN0aW9uKHJlbW92ZV9MQUJFTCkKICAgICAgICAgICAgcHJpbnQocGF0dC5wYXJzZVN0cmluZygiQUFCIDEyMyAzMjEiKS5kdW1wKCkpCiAgICAgICAgcHJpbnRzOjoKICAgICAgICAgICAgWydBQUInLCAnMTIzJywgJzMyMSddCiAgICAgICAgICAgIC0gTEFCRUw6IEFBQgoKICAgICAgICAgICAgWydBQUInLCAnMTIzJywgJzMyMSddCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IGFyZ3M6CiAgICAgICAgICAgIGFyZ3MgPSBbLTFdCiAgICAgICAgZm9yIGssdiBpbiBrd2FyZ3MuaXRlbXMoKToKICAgICAgICAgICAgaWYgayA9PSAnZGVmYXVsdCc6CiAgICAgICAgICAgICAgICBhcmdzID0gKGFyZ3NbMF0sIHYpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoInBvcCgpIGdvdCBhbiB1bmV4cGVjdGVkIGtleXdvcmQgYXJndW1lbnQgJyVzJyIgJSBrKQogICAgICAgIGlmIChpc2luc3RhbmNlKGFyZ3NbMF0sIGludCkgb3IgCiAgICAgICAgICAgICAgICAgICAgICAgIGxlbihhcmdzKSA9PSAxIG9yIAogICAgICAgICAgICAgICAgICAgICAgICBhcmdzWzBdIGluIHNlbGYpOgogICAgICAgICAgICBpbmRleCA9IGFyZ3NbMF0KICAgICAgICAgICAgcmV0ID0gc2VsZltpbmRleF0KICAgICAgICAgICAgZGVsIHNlbGZbaW5kZXhdCiAgICAgICAgICAgIHJldHVybiByZXQKICAgICAgICBlbHNlOgogICAgICAgICAgICBkZWZhdWx0dmFsdWUgPSBhcmdzWzFdCiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0dmFsdWUKCiAgICBkZWYgZ2V0KHNlbGYsIGtleSwgZGVmYXVsdFZhbHVlPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIFJldHVybnMgbmFtZWQgcmVzdWx0IG1hdGNoaW5nIHRoZSBnaXZlbiBrZXksIG9yIGlmIHRoZXJlIGlzIG5vCiAgICAgICAgc3VjaCBuYW1lLCB0aGVuIHJldHVybnMgdGhlIGdpdmVuIEN7ZGVmYXVsdFZhbHVlfSBvciBDe05vbmV9IGlmIG5vCiAgICAgICAgQ3tkZWZhdWx0VmFsdWV9IGlzIHNwZWNpZmllZC4KCiAgICAgICAgU2ltaWxhciB0byBDe2RpY3QuZ2V0KCl9LgogICAgICAgIAogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQogICAgICAgICAgICBkYXRlX3N0ciA9IGludGVnZXIoInllYXIiKSArICcvJyArIGludGVnZXIoIm1vbnRoIikgKyAnLycgKyBpbnRlZ2VyKCJkYXkiKSAgICAgICAgICAgCgogICAgICAgICAgICByZXN1bHQgPSBkYXRlX3N0ci5wYXJzZVN0cmluZygiMTk5OS8xMi8zMSIpCiAgICAgICAgICAgIHByaW50KHJlc3VsdC5nZXQoInllYXIiKSkgIyAtPiAnMTk5OScKICAgICAgICAgICAgcHJpbnQocmVzdWx0LmdldCgiaG91ciIsICJub3Qgc3BlY2lmaWVkIikpICMgLT4gJ25vdCBzcGVjaWZpZWQnCiAgICAgICAgICAgIHByaW50KHJlc3VsdC5nZXQoImhvdXIiKSkgIyAtPiBOb25lCiAgICAgICAgIiIiCiAgICAgICAgaWYga2V5IGluIHNlbGY6CiAgICAgICAgICAgIHJldHVybiBzZWxmW2tleV0KICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlCgogICAgZGVmIGluc2VydCggc2VsZiwgaW5kZXgsIGluc1N0ciApOgogICAgICAgICIiIgogICAgICAgIEluc2VydHMgbmV3IGVsZW1lbnQgYXQgbG9jYXRpb24gaW5kZXggaW4gdGhlIGxpc3Qgb2YgcGFyc2VkIHRva2Vucy4KICAgICAgICAKICAgICAgICBTaW1pbGFyIHRvIEN7bGlzdC5pbnNlcnQoKX0uCgogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICBwcmludChPbmVPck1vcmUoV29yZChudW1zKSkucGFyc2VTdHJpbmcoIjAgMTIzIDMyMSIpKSAjIC0+IFsnMCcsICcxMjMnLCAnMzIxJ10KCiAgICAgICAgICAgICMgdXNlIGEgcGFyc2UgYWN0aW9uIHRvIGluc2VydCB0aGUgcGFyc2UgbG9jYXRpb24gaW4gdGhlIGZyb250IG9mIHRoZSBwYXJzZWQgcmVzdWx0cwogICAgICAgICAgICBkZWYgaW5zZXJ0X2xvY24obG9jbiwgdG9rZW5zKToKICAgICAgICAgICAgICAgIHRva2Vucy5pbnNlcnQoMCwgbG9jbikKICAgICAgICAgICAgcHJpbnQoT25lT3JNb3JlKFdvcmQobnVtcykpLmFkZFBhcnNlQWN0aW9uKGluc2VydF9sb2NuKS5wYXJzZVN0cmluZygiMCAxMjMgMzIxIikpICMgLT4gWzAsICcwJywgJzEyMycsICczMjEnXQogICAgICAgICIiIgogICAgICAgIHNlbGYuX190b2tsaXN0Lmluc2VydChpbmRleCwgaW5zU3RyKQogICAgICAgICMgZml4dXAgaW5kaWNlcyBpbiB0b2tlbiBkaWN0aW9uYXJ5CiAgICAgICAgZm9yIG5hbWUsb2NjdXJyZW5jZXMgaW4gc2VsZi5fX3Rva2RpY3QuaXRlbXMoKToKICAgICAgICAgICAgZm9yIGssICh2YWx1ZSwgcG9zaXRpb24pIGluIGVudW1lcmF0ZShvY2N1cnJlbmNlcyk6CiAgICAgICAgICAgICAgICBvY2N1cnJlbmNlc1trXSA9IF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KHZhbHVlLCBwb3NpdGlvbiArIChwb3NpdGlvbiA+IGluZGV4KSkKCiAgICBkZWYgYXBwZW5kKCBzZWxmLCBpdGVtICk6CiAgICAgICAgIiIiCiAgICAgICAgQWRkIHNpbmdsZSBlbGVtZW50IHRvIGVuZCBvZiBQYXJzZVJlc3VsdHMgbGlzdCBvZiBlbGVtZW50cy4KCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgIHByaW50KE9uZU9yTW9yZShXb3JkKG51bXMpKS5wYXJzZVN0cmluZygiMCAxMjMgMzIxIikpICMgLT4gWycwJywgJzEyMycsICczMjEnXQogICAgICAgICAgICAKICAgICAgICAgICAgIyB1c2UgYSBwYXJzZSBhY3Rpb24gdG8gY29tcHV0ZSB0aGUgc3VtIG9mIHRoZSBwYXJzZWQgaW50ZWdlcnMsIGFuZCBhZGQgaXQgdG8gdGhlIGVuZAogICAgICAgICAgICBkZWYgYXBwZW5kX3N1bSh0b2tlbnMpOgogICAgICAgICAgICAgICAgdG9rZW5zLmFwcGVuZChzdW0obWFwKGludCwgdG9rZW5zKSkpCiAgICAgICAgICAgIHByaW50KE9uZU9yTW9yZShXb3JkKG51bXMpKS5hZGRQYXJzZUFjdGlvbihhcHBlbmRfc3VtKS5wYXJzZVN0cmluZygiMCAxMjMgMzIxIikpICMgLT4gWycwJywgJzEyMycsICczMjEnLCA0NDRdCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5fX3Rva2xpc3QuYXBwZW5kKGl0ZW0pCgogICAgZGVmIGV4dGVuZCggc2VsZiwgaXRlbXNlcSApOgogICAgICAgICIiIgogICAgICAgIEFkZCBzZXF1ZW5jZSBvZiBlbGVtZW50cyB0byBlbmQgb2YgUGFyc2VSZXN1bHRzIGxpc3Qgb2YgZWxlbWVudHMuCgogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICBwYXR0ID0gT25lT3JNb3JlKFdvcmQoYWxwaGFzKSkKICAgICAgICAgICAgCiAgICAgICAgICAgICMgdXNlIGEgcGFyc2UgYWN0aW9uIHRvIGFwcGVuZCB0aGUgcmV2ZXJzZSBvZiB0aGUgbWF0Y2hlZCBzdHJpbmdzLCB0byBtYWtlIGEgcGFsaW5kcm9tZQogICAgICAgICAgICBkZWYgbWFrZV9wYWxpbmRyb21lKHRva2Vucyk6CiAgICAgICAgICAgICAgICB0b2tlbnMuZXh0ZW5kKHJldmVyc2VkKFt0Wzo6LTFdIGZvciB0IGluIHRva2Vuc10pKQogICAgICAgICAgICAgICAgcmV0dXJuICcnLmpvaW4odG9rZW5zKQogICAgICAgICAgICBwcmludChwYXR0LmFkZFBhcnNlQWN0aW9uKG1ha2VfcGFsaW5kcm9tZSkucGFyc2VTdHJpbmcoImxza2RqIHNkbGtqZiBsa3NkIikpICMgLT4gJ2xza2Rqc2Rsa2pmbGtzZGRza2xmamtsZHNqZGtzbCcKICAgICAgICAiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKGl0ZW1zZXEsIFBhcnNlUmVzdWx0cyk6CiAgICAgICAgICAgIHNlbGYgKz0gaXRlbXNlcQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuX190b2tsaXN0LmV4dGVuZChpdGVtc2VxKQoKICAgIGRlZiBjbGVhciggc2VsZiApOgogICAgICAgICIiIgogICAgICAgIENsZWFyIGFsbCBlbGVtZW50cyBhbmQgcmVzdWx0cyBuYW1lcy4KICAgICAgICAiIiIKICAgICAgICBkZWwgc2VsZi5fX3Rva2xpc3RbOl0KICAgICAgICBzZWxmLl9fdG9rZGljdC5jbGVhcigpCgogICAgZGVmIF9fZ2V0YXR0cl9fKCBzZWxmLCBuYW1lICk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZltuYW1lXQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgcmV0dXJuICIiCiAgICAgICAgICAgIAogICAgICAgIGlmIG5hbWUgaW4gc2VsZi5fX3Rva2RpY3Q6CiAgICAgICAgICAgIGlmIG5hbWUgbm90IGluIHNlbGYuX19hY2N1bU5hbWVzOgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX190b2tkaWN0W25hbWVdWy0xXVswXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIFBhcnNlUmVzdWx0cyhbIHZbMF0gZm9yIHYgaW4gc2VsZi5fX3Rva2RpY3RbbmFtZV0gXSkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gIiIKCiAgICBkZWYgX19hZGRfXyggc2VsZiwgb3RoZXIgKToKICAgICAgICByZXQgPSBzZWxmLmNvcHkoKQogICAgICAgIHJldCArPSBvdGhlcgogICAgICAgIHJldHVybiByZXQKCiAgICBkZWYgX19pYWRkX18oIHNlbGYsIG90aGVyICk6CiAgICAgICAgaWYgb3RoZXIuX190b2tkaWN0OgogICAgICAgICAgICBvZmZzZXQgPSBsZW4oc2VsZi5fX3Rva2xpc3QpCiAgICAgICAgICAgIGFkZG9mZnNldCA9IGxhbWJkYSBhOiBvZmZzZXQgaWYgYTwwIGVsc2UgYStvZmZzZXQKICAgICAgICAgICAgb3RoZXJpdGVtcyA9IG90aGVyLl9fdG9rZGljdC5pdGVtcygpCiAgICAgICAgICAgIG90aGVyZGljdGl0ZW1zID0gWyhrLCBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldCh2WzBdLGFkZG9mZnNldCh2WzFdKSkgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoayx2bGlzdCkgaW4gb3RoZXJpdGVtcyBmb3IgdiBpbiB2bGlzdF0KICAgICAgICAgICAgZm9yIGssdiBpbiBvdGhlcmRpY3RpdGVtczoKICAgICAgICAgICAgICAgIHNlbGZba10gPSB2CiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZbMF0sUGFyc2VSZXN1bHRzKToKICAgICAgICAgICAgICAgICAgICB2WzBdLl9fcGFyZW50ID0gd2tyZWYoc2VsZikKICAgICAgICAgICAgCiAgICAgICAgc2VsZi5fX3Rva2xpc3QgKz0gb3RoZXIuX190b2tsaXN0CiAgICAgICAgc2VsZi5fX2FjY3VtTmFtZXMudXBkYXRlKCBvdGhlci5fX2FjY3VtTmFtZXMgKQogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIF9fcmFkZF9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLGludCkgYW5kIG90aGVyID09IDA6CiAgICAgICAgICAgICMgdXNlZnVsIGZvciBtZXJnaW5nIG1hbnkgUGFyc2VSZXN1bHRzIHVzaW5nIHN1bSgpIGJ1aWx0aW4KICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29weSgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyB0aGlzIG1heSByYWlzZSBhIFR5cGVFcnJvciAtIHNvIGJlIGl0CiAgICAgICAgICAgIHJldHVybiBvdGhlciArIHNlbGYKICAgICAgICAKICAgIGRlZiBfX3JlcHJfXyggc2VsZiApOgogICAgICAgIHJldHVybiAiKCVzLCAlcykiICUgKCByZXByKCBzZWxmLl9fdG9rbGlzdCApLCByZXByKCBzZWxmLl9fdG9rZGljdCApICkKCiAgICBkZWYgX19zdHJfXyggc2VsZiApOgogICAgICAgIHJldHVybiAnWycgKyAnLCAnLmpvaW4oX3VzdHIoaSkgaWYgaXNpbnN0YW5jZShpLCBQYXJzZVJlc3VsdHMpIGVsc2UgcmVwcihpKSBmb3IgaSBpbiBzZWxmLl9fdG9rbGlzdCkgKyAnXScKCiAgICBkZWYgX2FzU3RyaW5nTGlzdCggc2VsZiwgc2VwPScnICk6CiAgICAgICAgb3V0ID0gW10KICAgICAgICBmb3IgaXRlbSBpbiBzZWxmLl9fdG9rbGlzdDoKICAgICAgICAgICAgaWYgb3V0IGFuZCBzZXA6CiAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKHNlcCkKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSggaXRlbSwgUGFyc2VSZXN1bHRzICk6CiAgICAgICAgICAgICAgICBvdXQgKz0gaXRlbS5fYXNTdHJpbmdMaXN0KCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIF91c3RyKGl0ZW0pICkKICAgICAgICByZXR1cm4gb3V0CgogICAgZGVmIGFzTGlzdCggc2VsZiApOgogICAgICAgICIiIgogICAgICAgIFJldHVybnMgdGhlIHBhcnNlIHJlc3VsdHMgYXMgYSBuZXN0ZWQgbGlzdCBvZiBtYXRjaGluZyB0b2tlbnMsIGFsbCBjb252ZXJ0ZWQgdG8gc3RyaW5ncy4KCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgIHBhdHQgPSBPbmVPck1vcmUoV29yZChhbHBoYXMpKQogICAgICAgICAgICByZXN1bHQgPSBwYXR0LnBhcnNlU3RyaW5nKCJzbGRraiBsc2RraiBzbGRraiIpCiAgICAgICAgICAgICMgZXZlbiB0aG91Z2ggdGhlIHJlc3VsdCBwcmludHMgaW4gc3RyaW5nLWxpa2UgZm9ybSwgaXQgaXMgYWN0dWFsbHkgYSBweXBhcnNpbmcgUGFyc2VSZXN1bHRzCiAgICAgICAgICAgIHByaW50KHR5cGUocmVzdWx0KSwgcmVzdWx0KSAjIC0+IDxjbGFzcyAncHlwYXJzaW5nLlBhcnNlUmVzdWx0cyc+IFsnc2xka2onLCAnbHNka2onLCAnc2xka2onXQogICAgICAgICAgICAKICAgICAgICAgICAgIyBVc2UgYXNMaXN0KCkgdG8gY3JlYXRlIGFuIGFjdHVhbCBsaXN0CiAgICAgICAgICAgIHJlc3VsdF9saXN0ID0gcmVzdWx0LmFzTGlzdCgpCiAgICAgICAgICAgIHByaW50KHR5cGUocmVzdWx0X2xpc3QpLCByZXN1bHRfbGlzdCkgIyAtPiA8Y2xhc3MgJ2xpc3QnPiBbJ3NsZGtqJywgJ2xzZGtqJywgJ3NsZGtqJ10KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gW3Jlcy5hc0xpc3QoKSBpZiBpc2luc3RhbmNlKHJlcyxQYXJzZVJlc3VsdHMpIGVsc2UgcmVzIGZvciByZXMgaW4gc2VsZi5fX3Rva2xpc3RdCgogICAgZGVmIGFzRGljdCggc2VsZiApOgogICAgICAgICIiIgogICAgICAgIFJldHVybnMgdGhlIG5hbWVkIHBhcnNlIHJlc3VsdHMgYXMgYSBuZXN0ZWQgZGljdGlvbmFyeS4KCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpCiAgICAgICAgICAgIGRhdGVfc3RyID0gaW50ZWdlcigieWVhciIpICsgJy8nICsgaW50ZWdlcigibW9udGgiKSArICcvJyArIGludGVnZXIoImRheSIpCiAgICAgICAgICAgIAogICAgICAgICAgICByZXN1bHQgPSBkYXRlX3N0ci5wYXJzZVN0cmluZygnMTIvMzEvMTk5OScpCiAgICAgICAgICAgIHByaW50KHR5cGUocmVzdWx0KSwgcmVwcihyZXN1bHQpKSAjIC0+IDxjbGFzcyAncHlwYXJzaW5nLlBhcnNlUmVzdWx0cyc+IChbJzEyJywgJy8nLCAnMzEnLCAnLycsICcxOTk5J10sIHsnZGF5JzogWygnMTk5OScsIDQpXSwgJ3llYXInOiBbKCcxMicsIDApXSwgJ21vbnRoJzogWygnMzEnLCAyKV19KQogICAgICAgICAgICAKICAgICAgICAgICAgcmVzdWx0X2RpY3QgPSByZXN1bHQuYXNEaWN0KCkKICAgICAgICAgICAgcHJpbnQodHlwZShyZXN1bHRfZGljdCksIHJlcHIocmVzdWx0X2RpY3QpKSAjIC0+IDxjbGFzcyAnZGljdCc+IHsnZGF5JzogJzE5OTknLCAneWVhcic6ICcxMicsICdtb250aCc6ICczMSd9CgogICAgICAgICAgICAjIGV2ZW4gdGhvdWdoIGEgUGFyc2VSZXN1bHRzIHN1cHBvcnRzIGRpY3QtbGlrZSBhY2Nlc3MsIHNvbWV0aW1lIHlvdSBqdXN0IG5lZWQgdG8gaGF2ZSBhIGRpY3QKICAgICAgICAgICAgaW1wb3J0IGpzb24KICAgICAgICAgICAgcHJpbnQoanNvbi5kdW1wcyhyZXN1bHQpKSAjIC0+IEV4Y2VwdGlvbjogVHlwZUVycm9yOiAuLi4gaXMgbm90IEpTT04gc2VyaWFsaXphYmxlCiAgICAgICAgICAgIHByaW50KGpzb24uZHVtcHMocmVzdWx0LmFzRGljdCgpKSkgIyAtPiB7Im1vbnRoIjogIjMxIiwgImRheSI6ICIxOTk5IiwgInllYXIiOiAiMTIifQogICAgICAgICIiIgogICAgICAgIGlmIFBZXzM6CiAgICAgICAgICAgIGl0ZW1fZm4gPSBzZWxmLml0ZW1zCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaXRlbV9mbiA9IHNlbGYuaXRlcml0ZW1zCiAgICAgICAgICAgIAogICAgICAgIGRlZiB0b0l0ZW0ob2JqKToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShvYmosIFBhcnNlUmVzdWx0cyk6CiAgICAgICAgICAgICAgICBpZiBvYmouaGFza2V5cygpOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmouYXNEaWN0KCkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFt0b0l0ZW0odikgZm9yIHYgaW4gb2JqXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIG9iagogICAgICAgICAgICAgICAgCiAgICAgICAgcmV0dXJuIGRpY3QoKGssdG9JdGVtKHYpKSBmb3Igayx2IGluIGl0ZW1fZm4oKSkKCiAgICBkZWYgY29weSggc2VsZiApOgogICAgICAgICIiIgogICAgICAgIFJldHVybnMgYSBuZXcgY29weSBvZiBhIEN7UGFyc2VSZXN1bHRzfSBvYmplY3QuCiAgICAgICAgIiIiCiAgICAgICAgcmV0ID0gUGFyc2VSZXN1bHRzKCBzZWxmLl9fdG9rbGlzdCApCiAgICAgICAgcmV0Ll9fdG9rZGljdCA9IHNlbGYuX190b2tkaWN0LmNvcHkoKQogICAgICAgIHJldC5fX3BhcmVudCA9IHNlbGYuX19wYXJlbnQKICAgICAgICByZXQuX19hY2N1bU5hbWVzLnVwZGF0ZSggc2VsZi5fX2FjY3VtTmFtZXMgKQogICAgICAgIHJldC5fX25hbWUgPSBzZWxmLl9fbmFtZQogICAgICAgIHJldHVybiByZXQKCiAgICBkZWYgYXNYTUwoIHNlbGYsIGRvY3RhZz1Ob25lLCBuYW1lZEl0ZW1zT25seT1GYWxzZSwgaW5kZW50PSIiLCBmb3JtYXR0ZWQ9VHJ1ZSApOgogICAgICAgICIiIgogICAgICAgIChEZXByZWNhdGVkKSBSZXR1cm5zIHRoZSBwYXJzZSByZXN1bHRzIGFzIFhNTC4gVGFncyBhcmUgY3JlYXRlZCBmb3IgdG9rZW5zIGFuZCBsaXN0cyB0aGF0IGhhdmUgZGVmaW5lZCByZXN1bHRzIG5hbWVzLgogICAgICAgICIiIgogICAgICAgIG5sID0gIlxuIgogICAgICAgIG91dCA9IFtdCiAgICAgICAgbmFtZWRJdGVtcyA9IGRpY3QoKHZbMV0saykgZm9yIChrLHZsaXN0KSBpbiBzZWxmLl9fdG9rZGljdC5pdGVtcygpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB2IGluIHZsaXN0KQogICAgICAgIG5leHRMZXZlbEluZGVudCA9IGluZGVudCArICIgICIKCiAgICAgICAgIyBjb2xsYXBzZSBvdXQgaW5kZW50cyBpZiBmb3JtYXR0aW5nIGlzIG5vdCBkZXNpcmVkCiAgICAgICAgaWYgbm90IGZvcm1hdHRlZDoKICAgICAgICAgICAgaW5kZW50ID0gIiIKICAgICAgICAgICAgbmV4dExldmVsSW5kZW50ID0gIiIKICAgICAgICAgICAgbmwgPSAiIgoKICAgICAgICBzZWxmVGFnID0gTm9uZQogICAgICAgIGlmIGRvY3RhZyBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZlRhZyA9IGRvY3RhZwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIHNlbGYuX19uYW1lOgogICAgICAgICAgICAgICAgc2VsZlRhZyA9IHNlbGYuX19uYW1lCgogICAgICAgIGlmIG5vdCBzZWxmVGFnOgogICAgICAgICAgICBpZiBuYW1lZEl0ZW1zT25seToKICAgICAgICAgICAgICAgIHJldHVybiAiIgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZlRhZyA9ICJJVEVNIgoKICAgICAgICBvdXQgKz0gWyBubCwgaW5kZW50LCAiPCIsIHNlbGZUYWcsICI+IiBdCgogICAgICAgIGZvciBpLHJlcyBpbiBlbnVtZXJhdGUoc2VsZi5fX3Rva2xpc3QpOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHJlcyxQYXJzZVJlc3VsdHMpOgogICAgICAgICAgICAgICAgaWYgaSBpbiBuYW1lZEl0ZW1zOgogICAgICAgICAgICAgICAgICAgIG91dCArPSBbIHJlcy5hc1hNTChuYW1lZEl0ZW1zW2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZWRJdGVtc09ubHkgYW5kIGRvY3RhZyBpcyBOb25lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dExldmVsSW5kZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkKV0KICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgb3V0ICs9IFsgcmVzLmFzWE1MKE5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lZEl0ZW1zT25seSBhbmQgZG9jdGFnIGlzIE5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0TGV2ZWxJbmRlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWQpXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBpbmRpdmlkdWFsIHRva2VuLCBzZWUgaWYgdGhlcmUgaXMgYSBuYW1lIGZvciBpdAogICAgICAgICAgICAgICAgcmVzVGFnID0gTm9uZQogICAgICAgICAgICAgICAgaWYgaSBpbiBuYW1lZEl0ZW1zOgogICAgICAgICAgICAgICAgICAgIHJlc1RhZyA9IG5hbWVkSXRlbXNbaV0KICAgICAgICAgICAgICAgIGlmIG5vdCByZXNUYWc6CiAgICAgICAgICAgICAgICAgICAgaWYgbmFtZWRJdGVtc09ubHk6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgcmVzVGFnID0gIklURU0iCiAgICAgICAgICAgICAgICB4bWxCb2R5VGV4dCA9IF94bWxfZXNjYXBlKF91c3RyKHJlcykpCiAgICAgICAgICAgICAgICBvdXQgKz0gWyBubCwgbmV4dExldmVsSW5kZW50LCAiPCIsIHJlc1RhZywgIj4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxCb2R5VGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwvIiwgcmVzVGFnLCAiPiIgXQoKICAgICAgICBvdXQgKz0gWyBubCwgaW5kZW50LCAiPC8iLCBzZWxmVGFnLCAiPiIgXQogICAgICAgIHJldHVybiAiIi5qb2luKG91dCkKCiAgICBkZWYgX19sb29rdXAoc2VsZixzdWIpOgogICAgICAgIGZvciBrLHZsaXN0IGluIHNlbGYuX190b2tkaWN0Lml0ZW1zKCk6CiAgICAgICAgICAgIGZvciB2LGxvYyBpbiB2bGlzdDoKICAgICAgICAgICAgICAgIGlmIHN1YiBpcyB2OgogICAgICAgICAgICAgICAgICAgIHJldHVybiBrCiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBkZWYgZ2V0TmFtZShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm5zIHRoZSByZXN1bHRzIG5hbWUgZm9yIHRoaXMgdG9rZW4gZXhwcmVzc2lvbi4gVXNlZnVsIHdoZW4gc2V2ZXJhbCAKICAgICAgICBkaWZmZXJlbnQgZXhwcmVzc2lvbnMgbWlnaHQgbWF0Y2ggYXQgYSBwYXJ0aWN1bGFyIGxvY2F0aW9uLgoKICAgICAgICBFeGFtcGxlOjoKICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykKICAgICAgICAgICAgc3NuX2V4cHIgPSBSZWdleChyIlxkXGRcZC1cZFxkLVxkXGRcZFxkIikKICAgICAgICAgICAgaG91c2VfbnVtYmVyX2V4cHIgPSBTdXBwcmVzcygnIycpICsgV29yZChudW1zLCBhbHBoYW51bXMpCiAgICAgICAgICAgIHVzZXJfZGF0YSA9IChHcm91cChob3VzZV9udW1iZXJfZXhwcikoImhvdXNlX251bWJlciIpIAogICAgICAgICAgICAgICAgICAgICAgICB8IEdyb3VwKHNzbl9leHByKSgic3NuIikKICAgICAgICAgICAgICAgICAgICAgICAgfCBHcm91cChpbnRlZ2VyKSgiYWdlIikpCiAgICAgICAgICAgIHVzZXJfaW5mbyA9IE9uZU9yTW9yZSh1c2VyX2RhdGEpCiAgICAgICAgICAgIAogICAgICAgICAgICByZXN1bHQgPSB1c2VyX2luZm8ucGFyc2VTdHJpbmcoIjIyIDExMS0yMi0zMzMzICMyMjFCIikKICAgICAgICAgICAgZm9yIGl0ZW0gaW4gcmVzdWx0OgogICAgICAgICAgICAgICAgcHJpbnQoaXRlbS5nZXROYW1lKCksICc6JywgaXRlbVswXSkKICAgICAgICBwcmludHM6OgogICAgICAgICAgICBhZ2UgOiAyMgogICAgICAgICAgICBzc24gOiAxMTEtMjItMzMzMwogICAgICAgICAgICBob3VzZV9udW1iZXIgOiAyMjFCCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5fX25hbWU6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9fbmFtZQogICAgICAgIGVsaWYgc2VsZi5fX3BhcmVudDoKICAgICAgICAgICAgcGFyID0gc2VsZi5fX3BhcmVudCgpCiAgICAgICAgICAgIGlmIHBhcjoKICAgICAgICAgICAgICAgIHJldHVybiBwYXIuX19sb29rdXAoc2VsZikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgZWxpZiAobGVuKHNlbGYpID09IDEgYW5kCiAgICAgICAgICAgICAgIGxlbihzZWxmLl9fdG9rZGljdCkgPT0gMSBhbmQKICAgICAgICAgICAgICAgbmV4dChpdGVyKHNlbGYuX190b2tkaWN0LnZhbHVlcygpKSlbMF1bMV0gaW4gKDAsLTEpKToKICAgICAgICAgICAgcmV0dXJuIG5leHQoaXRlcihzZWxmLl9fdG9rZGljdC5rZXlzKCkpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgZGVmIGR1bXAoc2VsZiwgaW5kZW50PScnLCBkZXB0aD0wLCBmdWxsPVRydWUpOgogICAgICAgICIiIgogICAgICAgIERpYWdub3N0aWMgbWV0aG9kIGZvciBsaXN0aW5nIG91dCB0aGUgY29udGVudHMgb2YgYSBDe1BhcnNlUmVzdWx0c30uCiAgICAgICAgQWNjZXB0cyBhbiBvcHRpb25hbCBDe2luZGVudH0gYXJndW1lbnQgc28gdGhhdCB0aGlzIHN0cmluZyBjYW4gYmUgZW1iZWRkZWQKICAgICAgICBpbiBhIG5lc3RlZCBkaXNwbGF5IG9mIG90aGVyIGRhdGEuCgogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQogICAgICAgICAgICBkYXRlX3N0ciA9IGludGVnZXIoInllYXIiKSArICcvJyArIGludGVnZXIoIm1vbnRoIikgKyAnLycgKyBpbnRlZ2VyKCJkYXkiKQogICAgICAgICAgICAKICAgICAgICAgICAgcmVzdWx0ID0gZGF0ZV9zdHIucGFyc2VTdHJpbmcoJzEyLzMxLzE5OTknKQogICAgICAgICAgICBwcmludChyZXN1bHQuZHVtcCgpKQogICAgICAgIHByaW50czo6CiAgICAgICAgICAgIFsnMTInLCAnLycsICczMScsICcvJywgJzE5OTknXQogICAgICAgICAgICAtIGRheTogMTk5OQogICAgICAgICAgICAtIG1vbnRoOiAzMQogICAgICAgICAgICAtIHllYXI6IDEyCiAgICAgICAgIiIiCiAgICAgICAgb3V0ID0gW10KICAgICAgICBOTCA9ICdcbicKICAgICAgICBvdXQuYXBwZW5kKCBpbmRlbnQrX3VzdHIoc2VsZi5hc0xpc3QoKSkgKQogICAgICAgIGlmIGZ1bGw6CiAgICAgICAgICAgIGlmIHNlbGYuaGFza2V5cygpOgogICAgICAgICAgICAgICAgaXRlbXMgPSBzb3J0ZWQoKHN0cihrKSwgdikgZm9yIGssdiBpbiBzZWxmLml0ZW1zKCkpCiAgICAgICAgICAgICAgICBmb3Igayx2IGluIGl0ZW1zOgogICAgICAgICAgICAgICAgICAgIGlmIG91dDoKICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZChOTCkKICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCAiJXMlcy0gJXM6ICIgJSAoaW5kZW50LCgnICAnKmRlcHRoKSwgaykgKQogICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodixQYXJzZVJlc3VsdHMpOgogICAgICAgICAgICAgICAgICAgICAgICBpZiB2OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCggdi5kdW1wKGluZGVudCxkZXB0aCsxKSApCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKF91c3RyKHYpKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQocmVwcih2KSkKICAgICAgICAgICAgZWxpZiBhbnkoaXNpbnN0YW5jZSh2dixQYXJzZVJlc3VsdHMpIGZvciB2diBpbiBzZWxmKToKICAgICAgICAgICAgICAgIHYgPSBzZWxmCiAgICAgICAgICAgICAgICBmb3IgaSx2diBpbiBlbnVtZXJhdGUodik6CiAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2dixQYXJzZVJlc3VsdHMpOgogICAgICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCJcbiVzJXNbJWRdOlxuJXMlcyVzIiAlIChpbmRlbnQsKCcgICcqKGRlcHRoKSksaSxpbmRlbnQsKCcgICcqKGRlcHRoKzEpKSx2di5kdW1wKGluZGVudCxkZXB0aCsxKSApKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIlxuJXMlc1slZF06XG4lcyVzJXMiICUgKGluZGVudCwoJyAgJyooZGVwdGgpKSxpLGluZGVudCwoJyAgJyooZGVwdGgrMSkpLF91c3RyKHZ2KSkpCiAgICAgICAgICAgIAogICAgICAgIHJldHVybiAiIi5qb2luKG91dCkKCiAgICBkZWYgcHByaW50KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgIiIiCiAgICAgICAgUHJldHR5LXByaW50ZXIgZm9yIHBhcnNlZCByZXN1bHRzIGFzIGEgbGlzdCwgdXNpbmcgdGhlIEN7cHByaW50fSBtb2R1bGUuCiAgICAgICAgQWNjZXB0cyBhZGRpdGlvbmFsIHBvc2l0aW9uYWwgb3Iga2V5d29yZCBhcmdzIGFzIGRlZmluZWQgZm9yIHRoZSAKICAgICAgICBDe3BwcmludC5wcHJpbnR9IG1ldGhvZC4gKFV7aHR0cDovL2RvY3MucHl0aG9uLm9yZy8zL2xpYnJhcnkvcHByaW50Lmh0bWwjcHByaW50LnBwcmludH0pCgogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICBpZGVudCA9IFdvcmQoYWxwaGFzLCBhbHBoYW51bXMpCiAgICAgICAgICAgIG51bSA9IFdvcmQobnVtcykKICAgICAgICAgICAgZnVuYyA9IEZvcndhcmQoKQogICAgICAgICAgICB0ZXJtID0gaWRlbnQgfCBudW0gfCBHcm91cCgnKCcgKyBmdW5jICsgJyknKQogICAgICAgICAgICBmdW5jIDw8PSBpZGVudCArIEdyb3VwKE9wdGlvbmFsKGRlbGltaXRlZExpc3QodGVybSkpKQogICAgICAgICAgICByZXN1bHQgPSBmdW5jLnBhcnNlU3RyaW5nKCJmbmEgYSxiLChmbmIgYyxkLDIwMCksMTAwIikKICAgICAgICAgICAgcmVzdWx0LnBwcmludCh3aWR0aD00MCkKICAgICAgICBwcmludHM6OgogICAgICAgICAgICBbJ2ZuYScsCiAgICAgICAgICAgICBbJ2EnLAogICAgICAgICAgICAgICdiJywKICAgICAgICAgICAgICBbJygnLCAnZm5iJywgWydjJywgJ2QnLCAnMjAwJ10sICcpJ10sCiAgICAgICAgICAgICAgJzEwMCddXQogICAgICAgICIiIgogICAgICAgIHBwcmludC5wcHJpbnQoc2VsZi5hc0xpc3QoKSwgKmFyZ3MsICoqa3dhcmdzKQoKICAgICMgYWRkIHN1cHBvcnQgZm9yIHBpY2tsZSBwcm90b2NvbAogICAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToKICAgICAgICByZXR1cm4gKCBzZWxmLl9fdG9rbGlzdCwKICAgICAgICAgICAgICAgICAoIHNlbGYuX190b2tkaWN0LmNvcHkoKSwKICAgICAgICAgICAgICAgICAgIHNlbGYuX19wYXJlbnQgaXMgbm90IE5vbmUgYW5kIHNlbGYuX19wYXJlbnQoKSBvciBOb25lLAogICAgICAgICAgICAgICAgICAgc2VsZi5fX2FjY3VtTmFtZXMsCiAgICAgICAgICAgICAgICAgICBzZWxmLl9fbmFtZSApICkKCiAgICBkZWYgX19zZXRzdGF0ZV9fKHNlbGYsc3RhdGUpOgogICAgICAgIHNlbGYuX190b2tsaXN0ID0gc3RhdGVbMF0KICAgICAgICAoc2VsZi5fX3Rva2RpY3QsCiAgICAgICAgIHBhciwKICAgICAgICAgaW5BY2N1bU5hbWVzLAogICAgICAgICBzZWxmLl9fbmFtZSkgPSBzdGF0ZVsxXQogICAgICAgIHNlbGYuX19hY2N1bU5hbWVzID0ge30KICAgICAgICBzZWxmLl9fYWNjdW1OYW1lcy51cGRhdGUoaW5BY2N1bU5hbWVzKQogICAgICAgIGlmIHBhciBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5fX3BhcmVudCA9IHdrcmVmKHBhcikKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLl9fcGFyZW50ID0gTm9uZQoKICAgIGRlZiBfX2dldG5ld2FyZ3NfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fX3Rva2xpc3QsIHNlbGYuX19uYW1lLCBzZWxmLl9fYXNMaXN0LCBzZWxmLl9fbW9kYWwKCiAgICBkZWYgX19kaXJfXyhzZWxmKToKICAgICAgICByZXR1cm4gKGRpcih0eXBlKHNlbGYpKSArIGxpc3Qoc2VsZi5rZXlzKCkpKQoKY29sbGVjdGlvbnMuTXV0YWJsZU1hcHBpbmcucmVnaXN0ZXIoUGFyc2VSZXN1bHRzKQoKZGVmIGNvbCAobG9jLHN0cmcpOgogICAgIiIiUmV0dXJucyBjdXJyZW50IGNvbHVtbiB3aXRoaW4gYSBzdHJpbmcsIGNvdW50aW5nIG5ld2xpbmVzIGFzIGxpbmUgc2VwYXJhdG9ycy4KICAgVGhlIGZpcnN0IGNvbHVtbiBpcyBudW1iZXIgMS4KCiAgIE5vdGU6IHRoZSBkZWZhdWx0IHBhcnNpbmcgYmVoYXZpb3IgaXMgdG8gZXhwYW5kIHRhYnMgaW4gdGhlIGlucHV0IHN0cmluZwogICBiZWZvcmUgc3RhcnRpbmcgdGhlIHBhcnNpbmcgcHJvY2Vzcy4gIFNlZSBMe0l7UGFyc2VyRWxlbWVudC5wYXJzZVN0cmluZ308UGFyc2VyRWxlbWVudC5wYXJzZVN0cmluZz59IGZvciBtb3JlIGluZm9ybWF0aW9uCiAgIG9uIHBhcnNpbmcgc3RyaW5ncyBjb250YWluaW5nIEN7PFRBQj59cywgYW5kIHN1Z2dlc3RlZCBtZXRob2RzIHRvIG1haW50YWluIGEKICAgY29uc2lzdGVudCB2aWV3IG9mIHRoZSBwYXJzZWQgc3RyaW5nLCB0aGUgcGFyc2UgbG9jYXRpb24sIGFuZCBsaW5lIGFuZCBjb2x1bW4KICAgcG9zaXRpb25zIHdpdGhpbiB0aGUgcGFyc2VkIHN0cmluZy4KICAgIiIiCiAgICBzID0gc3RyZwogICAgcmV0dXJuIDEgaWYgMDxsb2M8bGVuKHMpIGFuZCBzW2xvYy0xXSA9PSAnXG4nIGVsc2UgbG9jIC0gcy5yZmluZCgiXG4iLCAwLCBsb2MpCgpkZWYgbGluZW5vKGxvYyxzdHJnKToKICAgICIiIlJldHVybnMgY3VycmVudCBsaW5lIG51bWJlciB3aXRoaW4gYSBzdHJpbmcsIGNvdW50aW5nIG5ld2xpbmVzIGFzIGxpbmUgc2VwYXJhdG9ycy4KICAgVGhlIGZpcnN0IGxpbmUgaXMgbnVtYmVyIDEuCgogICBOb3RlOiB0aGUgZGVmYXVsdCBwYXJzaW5nIGJlaGF2aW9yIGlzIHRvIGV4cGFuZCB0YWJzIGluIHRoZSBpbnB1dCBzdHJpbmcKICAgYmVmb3JlIHN0YXJ0aW5nIHRoZSBwYXJzaW5nIHByb2Nlc3MuICBTZWUgTHtJe1BhcnNlckVsZW1lbnQucGFyc2VTdHJpbmd9PFBhcnNlckVsZW1lbnQucGFyc2VTdHJpbmc+fSBmb3IgbW9yZSBpbmZvcm1hdGlvbgogICBvbiBwYXJzaW5nIHN0cmluZ3MgY29udGFpbmluZyBDezxUQUI+fXMsIGFuZCBzdWdnZXN0ZWQgbWV0aG9kcyB0byBtYWludGFpbiBhCiAgIGNvbnNpc3RlbnQgdmlldyBvZiB0aGUgcGFyc2VkIHN0cmluZywgdGhlIHBhcnNlIGxvY2F0aW9uLCBhbmQgbGluZSBhbmQgY29sdW1uCiAgIHBvc2l0aW9ucyB3aXRoaW4gdGhlIHBhcnNlZCBzdHJpbmcuCiAgICIiIgogICAgcmV0dXJuIHN0cmcuY291bnQoIlxuIiwwLGxvYykgKyAxCgpkZWYgbGluZSggbG9jLCBzdHJnICk6CiAgICAiIiJSZXR1cm5zIHRoZSBsaW5lIG9mIHRleHQgY29udGFpbmluZyBsb2Mgd2l0aGluIGEgc3RyaW5nLCBjb3VudGluZyBuZXdsaW5lcyBhcyBsaW5lIHNlcGFyYXRvcnMuCiAgICAgICAiIiIKICAgIGxhc3RDUiA9IHN0cmcucmZpbmQoIlxuIiwgMCwgbG9jKQogICAgbmV4dENSID0gc3RyZy5maW5kKCJcbiIsIGxvYykKICAgIGlmIG5leHRDUiA+PSAwOgogICAgICAgIHJldHVybiBzdHJnW2xhc3RDUisxOm5leHRDUl0KICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIHN0cmdbbGFzdENSKzE6XQoKZGVmIF9kZWZhdWx0U3RhcnREZWJ1Z0FjdGlvbiggaW5zdHJpbmcsIGxvYywgZXhwciApOgogICAgcHJpbnQgKCgiTWF0Y2ggIiArIF91c3RyKGV4cHIpICsgIiBhdCBsb2MgIiArIF91c3RyKGxvYykgKyAiKCVkLCVkKSIgJSAoIGxpbmVubyhsb2MsaW5zdHJpbmcpLCBjb2wobG9jLGluc3RyaW5nKSApKSkKCmRlZiBfZGVmYXVsdFN1Y2Nlc3NEZWJ1Z0FjdGlvbiggaW5zdHJpbmcsIHN0YXJ0bG9jLCBlbmRsb2MsIGV4cHIsIHRva3MgKToKICAgIHByaW50ICgiTWF0Y2hlZCAiICsgX3VzdHIoZXhwcikgKyAiIC0+ICIgKyBzdHIodG9rcy5hc0xpc3QoKSkpCgpkZWYgX2RlZmF1bHRFeGNlcHRpb25EZWJ1Z0FjdGlvbiggaW5zdHJpbmcsIGxvYywgZXhwciwgZXhjICk6CiAgICBwcmludCAoIkV4Y2VwdGlvbiByYWlzZWQ6IiArIF91c3RyKGV4YykpCgpkZWYgbnVsbERlYnVnQWN0aW9uKCphcmdzKToKICAgICIiIidEby1ub3RoaW5nJyBkZWJ1ZyBhY3Rpb24sIHRvIHN1cHByZXNzIGRlYnVnZ2luZyBvdXRwdXQgZHVyaW5nIHBhcnNpbmcuIiIiCiAgICBwYXNzCgojIE9ubHkgd29ya3Mgb24gUHl0aG9uIDMueCAtIG5vbmxvY2FsIGlzIHRveGljIHRvIFB5dGhvbiAyIGluc3RhbGxzCiN+ICdkZWNvcmF0b3IgdG8gdHJpbSBmdW5jdGlvbiBjYWxscyB0byBtYXRjaCB0aGUgYXJpdHkgb2YgdGhlIHRhcmdldCcKI34gZGVmIF90cmltX2FyaXR5KGZ1bmMsIG1heGFyZ3M9Myk6CiAgICAjfiBpZiBmdW5jIGluIHNpbmdsZUFyZ0J1aWx0aW5zOgogICAgICAgICN+IHJldHVybiBsYW1iZGEgcyxsLHQ6IGZ1bmModCkKICAgICN+IGxpbWl0ID0gMAogICAgI34gZm91bmRBcml0eSA9IEZhbHNlCiAgICAjfiBkZWYgd3JhcHBlcigqYXJncyk6CiAgICAgICAgI34gbm9ubG9jYWwgbGltaXQsZm91bmRBcml0eQogICAgICAgICN+IHdoaWxlIDE6CiAgICAgICAgICAgICN+IHRyeToKICAgICAgICAgICAgICAgICN+IHJldCA9IGZ1bmMoKmFyZ3NbbGltaXQ6XSkKICAgICAgICAgICAgICAgICN+IGZvdW5kQXJpdHkgPSBUcnVlCiAgICAgICAgICAgICAgICAjfiByZXR1cm4gcmV0CiAgICAgICAgICAgICN+IGV4Y2VwdCBUeXBlRXJyb3I6CiAgICAgICAgICAgICAgICAjfiBpZiBsaW1pdCA9PSBtYXhhcmdzIG9yIGZvdW5kQXJpdHk6CiAgICAgICAgICAgICAgICAgICAgI34gcmFpc2UKICAgICAgICAgICAgICAgICN+IGxpbWl0ICs9IDEKICAgICAgICAgICAgICAgICN+IGNvbnRpbnVlCiAgICAjfiByZXR1cm4gd3JhcHBlcgoKIyB0aGlzIHZlcnNpb24gaXMgUHl0aG9uIDIueC0zLnggY3Jvc3MtY29tcGF0aWJsZQonZGVjb3JhdG9yIHRvIHRyaW0gZnVuY3Rpb24gY2FsbHMgdG8gbWF0Y2ggdGhlIGFyaXR5IG9mIHRoZSB0YXJnZXQnCmRlZiBfdHJpbV9hcml0eShmdW5jLCBtYXhhcmdzPTIpOgogICAgaWYgZnVuYyBpbiBzaW5nbGVBcmdCdWlsdGluczoKICAgICAgICByZXR1cm4gbGFtYmRhIHMsbCx0OiBmdW5jKHQpCiAgICBsaW1pdCA9IFswXQogICAgZm91bmRBcml0eSA9IFtGYWxzZV0KICAgIAogICAgIyB0cmFjZWJhY2sgcmV0dXJuIGRhdGEgc3RydWN0dXJlIGNoYW5nZWQgaW4gUHkzLjUgLSBub3JtYWxpemUgYmFjayB0byBwbGFpbiB0dXBsZXMKICAgIGlmIHN5c3RlbV92ZXJzaW9uWzoyXSA+PSAoMyw1KToKICAgICAgICBkZWYgZXh0cmFjdF9zdGFjayhsaW1pdD0wKToKICAgICAgICAgICAgIyBzcGVjaWFsIGhhbmRsaW5nIGZvciBQeXRob24gMy41LjAgLSBleHRyYSBkZWVwIGNhbGwgc3RhY2sgYnkgMQogICAgICAgICAgICBvZmZzZXQgPSAtMyBpZiBzeXN0ZW1fdmVyc2lvbiA9PSAoMyw1LDApIGVsc2UgLTIKICAgICAgICAgICAgZnJhbWVfc3VtbWFyeSA9IHRyYWNlYmFjay5leHRyYWN0X3N0YWNrKGxpbWl0PS1vZmZzZXQrbGltaXQtMSlbb2Zmc2V0XQogICAgICAgICAgICByZXR1cm4gWyhmcmFtZV9zdW1tYXJ5LmZpbGVuYW1lLCBmcmFtZV9zdW1tYXJ5LmxpbmVubyldCiAgICAgICAgZGVmIGV4dHJhY3RfdGIodGIsIGxpbWl0PTApOgogICAgICAgICAgICBmcmFtZXMgPSB0cmFjZWJhY2suZXh0cmFjdF90Yih0YiwgbGltaXQ9bGltaXQpCiAgICAgICAgICAgIGZyYW1lX3N1bW1hcnkgPSBmcmFtZXNbLTFdCiAgICAgICAgICAgIHJldHVybiBbKGZyYW1lX3N1bW1hcnkuZmlsZW5hbWUsIGZyYW1lX3N1bW1hcnkubGluZW5vKV0KICAgIGVsc2U6CiAgICAgICAgZXh0cmFjdF9zdGFjayA9IHRyYWNlYmFjay5leHRyYWN0X3N0YWNrCiAgICAgICAgZXh0cmFjdF90YiA9IHRyYWNlYmFjay5leHRyYWN0X3RiCiAgICAKICAgICMgc3ludGhlc2l6ZSB3aGF0IHdvdWxkIGJlIHJldHVybmVkIGJ5IHRyYWNlYmFjay5leHRyYWN0X3N0YWNrIGF0IHRoZSBjYWxsIHRvIAogICAgIyB1c2VyJ3MgcGFyc2UgYWN0aW9uICdmdW5jJywgc28gdGhhdCB3ZSBkb24ndCBpbmN1ciBjYWxsIHBlbmFsdHkgYXQgcGFyc2UgdGltZQogICAgCiAgICBMSU5FX0RJRkYgPSA2CiAgICAjIElGIEFOWSBDT0RFIENIQU5HRVMsIEVWRU4gSlVTVCBDT01NRU5UUyBPUiBCTEFOSyBMSU5FUywgQkVUV0VFTiBUSEUgTkVYVCBMSU5FIEFORCAKICAgICMgVEhFIENBTEwgVE8gRlVOQyBJTlNJREUgV1JBUFBFUiwgTElORV9ESUZGIE1VU1QgQkUgTU9ESUZJRUQhISEhCiAgICB0aGlzX2xpbmUgPSBleHRyYWN0X3N0YWNrKGxpbWl0PTIpWy0xXQogICAgcGFfY2FsbF9saW5lX3N5bnRoID0gKHRoaXNfbGluZVswXSwgdGhpc19saW5lWzFdK0xJTkVfRElGRikKCiAgICBkZWYgd3JhcHBlcigqYXJncyk6CiAgICAgICAgd2hpbGUgMToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmV0ID0gZnVuYygqYXJnc1tsaW1pdFswXTpdKQogICAgICAgICAgICAgICAgZm91bmRBcml0eVswXSA9IFRydWUKICAgICAgICAgICAgICAgIHJldHVybiByZXQKICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKICAgICAgICAgICAgICAgICMgcmUtcmFpc2UgVHlwZUVycm9ycyBpZiB0aGV5IGRpZCBub3QgY29tZSBmcm9tIG91ciBhcml0eSB0ZXN0aW5nCiAgICAgICAgICAgICAgICBpZiBmb3VuZEFyaXR5WzBdOgogICAgICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgdGIgPSBzeXMuZXhjX2luZm8oKVstMV0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGV4dHJhY3RfdGIodGIsIGxpbWl0PTIpWy0xXVs6Ml0gPT0gcGFfY2FsbF9saW5lX3N5bnRoOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgICAgICAgICBkZWwgdGIKCiAgICAgICAgICAgICAgICBpZiBsaW1pdFswXSA8PSBtYXhhcmdzOgogICAgICAgICAgICAgICAgICAgIGxpbWl0WzBdICs9IDEKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgcmFpc2UKCiAgICAjIGNvcHkgZnVuYyBuYW1lIHRvIHdyYXBwZXIgZm9yIHNlbnNpYmxlIGRlYnVnIG91dHB1dAogICAgZnVuY19uYW1lID0gIjxwYXJzZSBhY3Rpb24+IgogICAgdHJ5OgogICAgICAgIGZ1bmNfbmFtZSA9IGdldGF0dHIoZnVuYywgJ19fbmFtZV9fJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRhdHRyKGZ1bmMsICdfX2NsYXNzX18nKS5fX25hbWVfXykKICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgZnVuY19uYW1lID0gc3RyKGZ1bmMpCiAgICB3cmFwcGVyLl9fbmFtZV9fID0gZnVuY19uYW1lCgogICAgcmV0dXJuIHdyYXBwZXIKCmNsYXNzIFBhcnNlckVsZW1lbnQob2JqZWN0KToKICAgICIiIkFic3RyYWN0IGJhc2UgbGV2ZWwgcGFyc2VyIGVsZW1lbnQgY2xhc3MuIiIiCiAgICBERUZBVUxUX1dISVRFX0NIQVJTID0gIiBcblx0XHIiCiAgICB2ZXJib3NlX3N0YWNrdHJhY2UgPSBGYWxzZQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBzZXREZWZhdWx0V2hpdGVzcGFjZUNoYXJzKCBjaGFycyApOgogICAgICAgIHIiIiIKICAgICAgICBPdmVycmlkZXMgdGhlIGRlZmF1bHQgd2hpdGVzcGFjZSBjaGFycwoKICAgICAgICBFeGFtcGxlOjoKICAgICAgICAgICAgIyBkZWZhdWx0IHdoaXRlc3BhY2UgY2hhcnMgYXJlIHNwYWNlLCA8VEFCPiBhbmQgbmV3bGluZQogICAgICAgICAgICBPbmVPck1vcmUoV29yZChhbHBoYXMpKS5wYXJzZVN0cmluZygiYWJjIGRlZlxuZ2hpIGprbCIpICAjIC0+IFsnYWJjJywgJ2RlZicsICdnaGknLCAnamtsJ10KICAgICAgICAgICAgCiAgICAgICAgICAgICMgY2hhbmdlIHRvIGp1c3QgdHJlYXQgbmV3bGluZSBhcyBzaWduaWZpY2FudAogICAgICAgICAgICBQYXJzZXJFbGVtZW50LnNldERlZmF1bHRXaGl0ZXNwYWNlQ2hhcnMoIiBcdCIpCiAgICAgICAgICAgIE9uZU9yTW9yZShXb3JkKGFscGhhcykpLnBhcnNlU3RyaW5nKCJhYmMgZGVmXG5naGkgamtsIikgICMgLT4gWydhYmMnLCAnZGVmJ10KICAgICAgICAiIiIKICAgICAgICBQYXJzZXJFbGVtZW50LkRFRkFVTFRfV0hJVEVfQ0hBUlMgPSBjaGFycwoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBpbmxpbmVMaXRlcmFsc1VzaW5nKGNscyk6CiAgICAgICAgIiIiCiAgICAgICAgU2V0IGNsYXNzIHRvIGJlIHVzZWQgZm9yIGluY2x1c2lvbiBvZiBzdHJpbmcgbGl0ZXJhbHMgaW50byBhIHBhcnNlci4KICAgICAgICAKICAgICAgICBFeGFtcGxlOjoKICAgICAgICAgICAgIyBkZWZhdWx0IGxpdGVyYWwgY2xhc3MgdXNlZCBpcyBMaXRlcmFsCiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpCiAgICAgICAgICAgIGRhdGVfc3RyID0gaW50ZWdlcigieWVhciIpICsgJy8nICsgaW50ZWdlcigibW9udGgiKSArICcvJyArIGludGVnZXIoImRheSIpICAgICAgICAgICAKCiAgICAgICAgICAgIGRhdGVfc3RyLnBhcnNlU3RyaW5nKCIxOTk5LzEyLzMxIikgICMgLT4gWycxOTk5JywgJy8nLCAnMTInLCAnLycsICczMSddCgoKICAgICAgICAgICAgIyBjaGFuZ2UgdG8gU3VwcHJlc3MKICAgICAgICAgICAgUGFyc2VyRWxlbWVudC5pbmxpbmVMaXRlcmFsc1VzaW5nKFN1cHByZXNzKQogICAgICAgICAgICBkYXRlX3N0ciA9IGludGVnZXIoInllYXIiKSArICcvJyArIGludGVnZXIoIm1vbnRoIikgKyAnLycgKyBpbnRlZ2VyKCJkYXkiKSAgICAgICAgICAgCgogICAgICAgICAgICBkYXRlX3N0ci5wYXJzZVN0cmluZygiMTk5OS8xMi8zMSIpICAjIC0+IFsnMTk5OScsICcxMicsICczMSddCiAgICAgICAgIiIiCiAgICAgICAgUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzID0gY2xzCgogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBzYXZlbGlzdD1GYWxzZSApOgogICAgICAgIHNlbGYucGFyc2VBY3Rpb24gPSBsaXN0KCkKICAgICAgICBzZWxmLmZhaWxBY3Rpb24gPSBOb25lCiAgICAgICAgI34gc2VsZi5uYW1lID0gIjx1bmtub3duPiIgICMgZG9uJ3QgZGVmaW5lIHNlbGYubmFtZSwgbGV0IHN1YmNsYXNzZXMgdHJ5L2V4Y2VwdCB1cGNhbGwKICAgICAgICBzZWxmLnN0clJlcHIgPSBOb25lCiAgICAgICAgc2VsZi5yZXN1bHRzTmFtZSA9IE5vbmUKICAgICAgICBzZWxmLnNhdmVBc0xpc3QgPSBzYXZlbGlzdAogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBUcnVlCiAgICAgICAgc2VsZi53aGl0ZUNoYXJzID0gUGFyc2VyRWxlbWVudC5ERUZBVUxUX1dISVRFX0NIQVJTCiAgICAgICAgc2VsZi5jb3B5RGVmYXVsdFdoaXRlQ2hhcnMgPSBUcnVlCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IEZhbHNlICMgdXNlZCB3aGVuIGNoZWNraW5nIGZvciBsZWZ0LXJlY3Vyc2lvbgogICAgICAgIHNlbGYua2VlcFRhYnMgPSBGYWxzZQogICAgICAgIHNlbGYuaWdub3JlRXhwcnMgPSBsaXN0KCkKICAgICAgICBzZWxmLmRlYnVnID0gRmFsc2UKICAgICAgICBzZWxmLnN0cmVhbWxpbmVkID0gRmFsc2UKICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBUcnVlICMgdXNlZCB0byBvcHRpbWl6ZSBleGNlcHRpb24gaGFuZGxpbmcgZm9yIHN1YmNsYXNzZXMgdGhhdCBkb24ndCBhZHZhbmNlIHBhcnNlIGluZGV4CiAgICAgICAgc2VsZi5lcnJtc2cgPSAiIgogICAgICAgIHNlbGYubW9kYWxSZXN1bHRzID0gVHJ1ZSAjIHVzZWQgdG8gbWFyayByZXN1bHRzIG5hbWVzIGFzIG1vZGFsIChyZXBvcnQgb25seSBsYXN0KSBvciBjdW11bGF0aXZlIChsaXN0IGFsbCkKICAgICAgICBzZWxmLmRlYnVnQWN0aW9ucyA9ICggTm9uZSwgTm9uZSwgTm9uZSApICNjdXN0b20gZGVidWcgYWN0aW9ucwogICAgICAgIHNlbGYucmUgPSBOb25lCiAgICAgICAgc2VsZi5jYWxsUHJlcGFyc2UgPSBUcnVlICMgdXNlZCB0byBhdm9pZCByZWR1bmRhbnQgY2FsbHMgdG8gcHJlUGFyc2UKICAgICAgICBzZWxmLmNhbGxEdXJpbmdUcnkgPSBGYWxzZQoKICAgIGRlZiBjb3B5KCBzZWxmICk6CiAgICAgICAgIiIiCiAgICAgICAgTWFrZSBhIGNvcHkgb2YgdGhpcyBDe1BhcnNlckVsZW1lbnR9LiAgVXNlZnVsIGZvciBkZWZpbmluZyBkaWZmZXJlbnQgcGFyc2UgYWN0aW9ucwogICAgICAgIGZvciB0aGUgc2FtZSBwYXJzaW5nIHBhdHRlcm4sIHVzaW5nIGNvcGllcyBvZiB0aGUgb3JpZ2luYWwgcGFyc2UgZWxlbWVudC4KICAgICAgICAKICAgICAgICBFeGFtcGxlOjoKICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHRva3M6IGludCh0b2tzWzBdKSkKICAgICAgICAgICAgaW50ZWdlcksgPSBpbnRlZ2VyLmNvcHkoKS5hZGRQYXJzZUFjdGlvbihsYW1iZGEgdG9rczogdG9rc1swXSoxMDI0KSArIFN1cHByZXNzKCJLIikKICAgICAgICAgICAgaW50ZWdlck0gPSBpbnRlZ2VyLmNvcHkoKS5hZGRQYXJzZUFjdGlvbihsYW1iZGEgdG9rczogdG9rc1swXSoxMDI0KjEwMjQpICsgU3VwcHJlc3MoIk0iKQogICAgICAgICAgICAKICAgICAgICAgICAgcHJpbnQoT25lT3JNb3JlKGludGVnZXJLIHwgaW50ZWdlck0gfCBpbnRlZ2VyKS5wYXJzZVN0cmluZygiNUsgMTAwIDY0MEsgMjU2TSIpKQogICAgICAgIHByaW50czo6CiAgICAgICAgICAgIFs1MTIwLCAxMDAsIDY1NTM2MCwgMjY4NDM1NDU2XQogICAgICAgIEVxdWl2YWxlbnQgZm9ybSBvZiBDe2V4cHIuY29weSgpfSBpcyBqdXN0IEN7ZXhwcigpfTo6CiAgICAgICAgICAgIGludGVnZXJNID0gaW50ZWdlcigpLmFkZFBhcnNlQWN0aW9uKGxhbWJkYSB0b2tzOiB0b2tzWzBdKjEwMjQqMTAyNCkgKyBTdXBwcmVzcygiTSIpCiAgICAgICAgIiIiCiAgICAgICAgY3B5ID0gY29weS5jb3B5KCBzZWxmICkKICAgICAgICBjcHkucGFyc2VBY3Rpb24gPSBzZWxmLnBhcnNlQWN0aW9uWzpdCiAgICAgICAgY3B5Lmlnbm9yZUV4cHJzID0gc2VsZi5pZ25vcmVFeHByc1s6XQogICAgICAgIGlmIHNlbGYuY29weURlZmF1bHRXaGl0ZUNoYXJzOgogICAgICAgICAgICBjcHkud2hpdGVDaGFycyA9IFBhcnNlckVsZW1lbnQuREVGQVVMVF9XSElURV9DSEFSUwogICAgICAgIHJldHVybiBjcHkKCiAgICBkZWYgc2V0TmFtZSggc2VsZiwgbmFtZSApOgogICAgICAgICIiIgogICAgICAgIERlZmluZSBuYW1lIGZvciB0aGlzIGV4cHJlc3Npb24sIG1ha2VzIGRlYnVnZ2luZyBhbmQgZXhjZXB0aW9uIG1lc3NhZ2VzIGNsZWFyZXIuCiAgICAgICAgCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgIFdvcmQobnVtcykucGFyc2VTdHJpbmcoIkFCQyIpICAjIC0+IEV4Y2VwdGlvbjogRXhwZWN0ZWQgVzooMDEyMy4uLikgKGF0IGNoYXIgMCksIChsaW5lOjEsIGNvbDoxKQogICAgICAgICAgICBXb3JkKG51bXMpLnNldE5hbWUoImludGVnZXIiKS5wYXJzZVN0cmluZygiQUJDIikgICMgLT4gRXhjZXB0aW9uOiBFeHBlY3RlZCBpbnRlZ2VyIChhdCBjaGFyIDApLCAobGluZToxLCBjb2w6MSkKICAgICAgICAiIiIKICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIHNlbGYubmFtZQogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwiZXhjZXB0aW9uIik6CiAgICAgICAgICAgIHNlbGYuZXhjZXB0aW9uLm1zZyA9IHNlbGYuZXJybXNnCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgc2V0UmVzdWx0c05hbWUoIHNlbGYsIG5hbWUsIGxpc3RBbGxNYXRjaGVzPUZhbHNlICk6CiAgICAgICAgIiIiCiAgICAgICAgRGVmaW5lIG5hbWUgZm9yIHJlZmVyZW5jaW5nIG1hdGNoaW5nIHRva2VucyBhcyBhIG5lc3RlZCBhdHRyaWJ1dGUKICAgICAgICBvZiB0aGUgcmV0dXJuZWQgcGFyc2UgcmVzdWx0cy4KICAgICAgICBOT1RFOiB0aGlzIHJldHVybnMgYSAqY29weSogb2YgdGhlIG9yaWdpbmFsIEN7UGFyc2VyRWxlbWVudH0gb2JqZWN0OwogICAgICAgIHRoaXMgaXMgc28gdGhhdCB0aGUgY2xpZW50IGNhbiBkZWZpbmUgYSBiYXNpYyBlbGVtZW50LCBzdWNoIGFzIGFuCiAgICAgICAgaW50ZWdlciwgYW5kIHJlZmVyZW5jZSBpdCBpbiBtdWx0aXBsZSBwbGFjZXMgd2l0aCBkaWZmZXJlbnQgbmFtZXMuCgogICAgICAgIFlvdSBjYW4gYWxzbyBzZXQgcmVzdWx0cyBuYW1lcyB1c2luZyB0aGUgYWJicmV2aWF0ZWQgc3ludGF4LAogICAgICAgIEN7ZXhwcigibmFtZSIpfSBpbiBwbGFjZSBvZiBDe2V4cHIuc2V0UmVzdWx0c05hbWUoIm5hbWUiKX0gLSAKICAgICAgICBzZWUgTHtJe19fY2FsbF9ffTxfX2NhbGxfXz59LgoKICAgICAgICBFeGFtcGxlOjoKICAgICAgICAgICAgZGF0ZV9zdHIgPSAoaW50ZWdlci5zZXRSZXN1bHRzTmFtZSgieWVhciIpICsgJy8nIAogICAgICAgICAgICAgICAgICAgICAgICArIGludGVnZXIuc2V0UmVzdWx0c05hbWUoIm1vbnRoIikgKyAnLycgCiAgICAgICAgICAgICAgICAgICAgICAgICsgaW50ZWdlci5zZXRSZXN1bHRzTmFtZSgiZGF5IikpCgogICAgICAgICAgICAjIGVxdWl2YWxlbnQgZm9ybToKICAgICAgICAgICAgZGF0ZV9zdHIgPSBpbnRlZ2VyKCJ5ZWFyIikgKyAnLycgKyBpbnRlZ2VyKCJtb250aCIpICsgJy8nICsgaW50ZWdlcigiZGF5IikKICAgICAgICAiIiIKICAgICAgICBuZXdzZWxmID0gc2VsZi5jb3B5KCkKICAgICAgICBpZiBuYW1lLmVuZHN3aXRoKCIqIik6CiAgICAgICAgICAgIG5hbWUgPSBuYW1lWzotMV0KICAgICAgICAgICAgbGlzdEFsbE1hdGNoZXM9VHJ1ZQogICAgICAgIG5ld3NlbGYucmVzdWx0c05hbWUgPSBuYW1lCiAgICAgICAgbmV3c2VsZi5tb2RhbFJlc3VsdHMgPSBub3QgbGlzdEFsbE1hdGNoZXMKICAgICAgICByZXR1cm4gbmV3c2VsZgoKICAgIGRlZiBzZXRCcmVhayhzZWxmLGJyZWFrRmxhZyA9IFRydWUpOgogICAgICAgICIiIk1ldGhvZCB0byBpbnZva2UgdGhlIFB5dGhvbiBwZGIgZGVidWdnZXIgd2hlbiB0aGlzIGVsZW1lbnQgaXMKICAgICAgICAgICBhYm91dCB0byBiZSBwYXJzZWQuIFNldCBDe2JyZWFrRmxhZ30gdG8gVHJ1ZSB0byBlbmFibGUsIEZhbHNlIHRvCiAgICAgICAgICAgZGlzYWJsZS4KICAgICAgICAiIiIKICAgICAgICBpZiBicmVha0ZsYWc6CiAgICAgICAgICAgIF9wYXJzZU1ldGhvZCA9IHNlbGYuX3BhcnNlCiAgICAgICAgICAgIGRlZiBicmVha2VyKGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlLCBjYWxsUHJlUGFyc2U9VHJ1ZSk6CiAgICAgICAgICAgICAgICBpbXBvcnQgcGRiCiAgICAgICAgICAgICAgICBwZGIuc2V0X3RyYWNlKCkKICAgICAgICAgICAgICAgIHJldHVybiBfcGFyc2VNZXRob2QoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucywgY2FsbFByZVBhcnNlICkKICAgICAgICAgICAgYnJlYWtlci5fb3JpZ2luYWxQYXJzZU1ldGhvZCA9IF9wYXJzZU1ldGhvZAogICAgICAgICAgICBzZWxmLl9wYXJzZSA9IGJyZWFrZXIKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBoYXNhdHRyKHNlbGYuX3BhcnNlLCJfb3JpZ2luYWxQYXJzZU1ldGhvZCIpOgogICAgICAgICAgICAgICAgc2VsZi5fcGFyc2UgPSBzZWxmLl9wYXJzZS5fb3JpZ2luYWxQYXJzZU1ldGhvZAogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIHNldFBhcnNlQWN0aW9uKCBzZWxmLCAqZm5zLCAqKmt3YXJncyApOgogICAgICAgICIiIgogICAgICAgIERlZmluZSBhY3Rpb24gdG8gcGVyZm9ybSB3aGVuIHN1Y2Nlc3NmdWxseSBtYXRjaGluZyBwYXJzZSBlbGVtZW50IGRlZmluaXRpb24uCiAgICAgICAgUGFyc2UgYWN0aW9uIGZuIGlzIGEgY2FsbGFibGUgbWV0aG9kIHdpdGggMC0zIGFyZ3VtZW50cywgY2FsbGVkIGFzIEN7Zm4ocyxsb2MsdG9rcyl9LAogICAgICAgIEN7Zm4obG9jLHRva3MpfSwgQ3tmbih0b2tzKX0sIG9yIGp1c3QgQ3tmbigpfSwgd2hlcmU6CiAgICAgICAgIC0gcyAgID0gdGhlIG9yaWdpbmFsIHN0cmluZyBiZWluZyBwYXJzZWQgKHNlZSBub3RlIGJlbG93KQogICAgICAgICAtIGxvYyA9IHRoZSBsb2NhdGlvbiBvZiB0aGUgbWF0Y2hpbmcgc3Vic3RyaW5nCiAgICAgICAgIC0gdG9rcyA9IGEgbGlzdCBvZiB0aGUgbWF0Y2hlZCB0b2tlbnMsIHBhY2thZ2VkIGFzIGEgQ3tMe1BhcnNlUmVzdWx0c319IG9iamVjdAogICAgICAgIElmIHRoZSBmdW5jdGlvbnMgaW4gZm5zIG1vZGlmeSB0aGUgdG9rZW5zLCB0aGV5IGNhbiByZXR1cm4gdGhlbSBhcyB0aGUgcmV0dXJuCiAgICAgICAgdmFsdWUgZnJvbSBmbiwgYW5kIHRoZSBtb2RpZmllZCBsaXN0IG9mIHRva2VucyB3aWxsIHJlcGxhY2UgdGhlIG9yaWdpbmFsLgogICAgICAgIE90aGVyd2lzZSwgZm4gZG9lcyBub3QgbmVlZCB0byByZXR1cm4gYW55IHZhbHVlLgoKICAgICAgICBPcHRpb25hbCBrZXl3b3JkIGFyZ3VtZW50czoKICAgICAgICAgLSBjYWxsRHVyaW5nVHJ5ID0gKGRlZmF1bHQ9Q3tGYWxzZX0pIGluZGljYXRlIGlmIHBhcnNlIGFjdGlvbiBzaG91bGQgYmUgcnVuIGR1cmluZyBsb29rYWhlYWRzIGFuZCBhbHRlcm5hdGUgdGVzdGluZwoKICAgICAgICBOb3RlOiB0aGUgZGVmYXVsdCBwYXJzaW5nIGJlaGF2aW9yIGlzIHRvIGV4cGFuZCB0YWJzIGluIHRoZSBpbnB1dCBzdHJpbmcKICAgICAgICBiZWZvcmUgc3RhcnRpbmcgdGhlIHBhcnNpbmcgcHJvY2Vzcy4gIFNlZSBMe0l7cGFyc2VTdHJpbmd9PHBhcnNlU3RyaW5nPn0gZm9yIG1vcmUgaW5mb3JtYXRpb24KICAgICAgICBvbiBwYXJzaW5nIHN0cmluZ3MgY29udGFpbmluZyBDezxUQUI+fXMsIGFuZCBzdWdnZXN0ZWQgbWV0aG9kcyB0byBtYWludGFpbiBhCiAgICAgICAgY29uc2lzdGVudCB2aWV3IG9mIHRoZSBwYXJzZWQgc3RyaW5nLCB0aGUgcGFyc2UgbG9jYXRpb24sIGFuZCBsaW5lIGFuZCBjb2x1bW4KICAgICAgICBwb3NpdGlvbnMgd2l0aGluIHRoZSBwYXJzZWQgc3RyaW5nLgogICAgICAgIAogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQogICAgICAgICAgICBkYXRlX3N0ciA9IGludGVnZXIgKyAnLycgKyBpbnRlZ2VyICsgJy8nICsgaW50ZWdlcgoKICAgICAgICAgICAgZGF0ZV9zdHIucGFyc2VTdHJpbmcoIjE5OTkvMTIvMzEiKSAgIyAtPiBbJzE5OTknLCAnLycsICcxMicsICcvJywgJzMxJ10KCiAgICAgICAgICAgICMgdXNlIHBhcnNlIGFjdGlvbiB0byBjb252ZXJ0IHRvIGludHMgYXQgcGFyc2UgdGltZQogICAgICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdG9rczogaW50KHRva3NbMF0pKQogICAgICAgICAgICBkYXRlX3N0ciA9IGludGVnZXIgKyAnLycgKyBpbnRlZ2VyICsgJy8nICsgaW50ZWdlcgoKICAgICAgICAgICAgIyBub3RlIHRoYXQgaW50ZWdlciBmaWVsZHMgYXJlIG5vdyBpbnRzLCBub3Qgc3RyaW5ncwogICAgICAgICAgICBkYXRlX3N0ci5wYXJzZVN0cmluZygiMTk5OS8xMi8zMSIpICAjIC0+IFsxOTk5LCAnLycsIDEyLCAnLycsIDMxXQogICAgICAgICIiIgogICAgICAgIHNlbGYucGFyc2VBY3Rpb24gPSBsaXN0KG1hcChfdHJpbV9hcml0eSwgbGlzdChmbnMpKSkKICAgICAgICBzZWxmLmNhbGxEdXJpbmdUcnkgPSBrd2FyZ3MuZ2V0KCJjYWxsRHVyaW5nVHJ5IiwgRmFsc2UpCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgYWRkUGFyc2VBY3Rpb24oIHNlbGYsICpmbnMsICoqa3dhcmdzICk6CiAgICAgICAgIiIiCiAgICAgICAgQWRkIHBhcnNlIGFjdGlvbiB0byBleHByZXNzaW9uJ3MgbGlzdCBvZiBwYXJzZSBhY3Rpb25zLiBTZWUgTHtJe3NldFBhcnNlQWN0aW9ufTxzZXRQYXJzZUFjdGlvbj59LgogICAgICAgIAogICAgICAgIFNlZSBleGFtcGxlcyBpbiBMe0l7Y29weX08Y29weT59LgogICAgICAgICIiIgogICAgICAgIHNlbGYucGFyc2VBY3Rpb24gKz0gbGlzdChtYXAoX3RyaW1fYXJpdHksIGxpc3QoZm5zKSkpCiAgICAgICAgc2VsZi5jYWxsRHVyaW5nVHJ5ID0gc2VsZi5jYWxsRHVyaW5nVHJ5IG9yIGt3YXJncy5nZXQoImNhbGxEdXJpbmdUcnkiLCBGYWxzZSkKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBhZGRDb25kaXRpb24oc2VsZiwgKmZucywgKiprd2FyZ3MpOgogICAgICAgICIiIkFkZCBhIGJvb2xlYW4gcHJlZGljYXRlIGZ1bmN0aW9uIHRvIGV4cHJlc3Npb24ncyBsaXN0IG9mIHBhcnNlIGFjdGlvbnMuIFNlZSAKICAgICAgICBMe0l7c2V0UGFyc2VBY3Rpb259PHNldFBhcnNlQWN0aW9uPn0gZm9yIGZ1bmN0aW9uIGNhbGwgc2lnbmF0dXJlcy4gVW5saWtlIEN7c2V0UGFyc2VBY3Rpb259LCAKICAgICAgICBmdW5jdGlvbnMgcGFzc2VkIHRvIEN7YWRkQ29uZGl0aW9ufSBuZWVkIHRvIHJldHVybiBib29sZWFuIHN1Y2Nlc3MvZmFpbCBvZiB0aGUgY29uZGl0aW9uLgoKICAgICAgICBPcHRpb25hbCBrZXl3b3JkIGFyZ3VtZW50czoKICAgICAgICAgLSBtZXNzYWdlID0gZGVmaW5lIGEgY3VzdG9tIG1lc3NhZ2UgdG8gYmUgdXNlZCBpbiB0aGUgcmFpc2VkIGV4Y2VwdGlvbgogICAgICAgICAtIGZhdGFsICAgPSBpZiBUcnVlLCB3aWxsIHJhaXNlIFBhcnNlRmF0YWxFeGNlcHRpb24gdG8gc3RvcCBwYXJzaW5nIGltbWVkaWF0ZWx5OyBvdGhlcndpc2Ugd2lsbCByYWlzZSBQYXJzZUV4Y2VwdGlvbgogICAgICAgICAKICAgICAgICBFeGFtcGxlOjoKICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHRva3M6IGludCh0b2tzWzBdKSkKICAgICAgICAgICAgeWVhcl9pbnQgPSBpbnRlZ2VyLmNvcHkoKQogICAgICAgICAgICB5ZWFyX2ludC5hZGRDb25kaXRpb24obGFtYmRhIHRva3M6IHRva3NbMF0gPj0gMjAwMCwgbWVzc2FnZT0iT25seSBzdXBwb3J0IHllYXJzIDIwMDAgYW5kIGxhdGVyIikKICAgICAgICAgICAgZGF0ZV9zdHIgPSB5ZWFyX2ludCArICcvJyArIGludGVnZXIgKyAnLycgKyBpbnRlZ2VyCgogICAgICAgICAgICByZXN1bHQgPSBkYXRlX3N0ci5wYXJzZVN0cmluZygiMTk5OS8xMi8zMSIpICAjIC0+IEV4Y2VwdGlvbjogT25seSBzdXBwb3J0IHllYXJzIDIwMDAgYW5kIGxhdGVyIChhdCBjaGFyIDApLCAobGluZToxLCBjb2w6MSkKICAgICAgICAiIiIKICAgICAgICBtc2cgPSBrd2FyZ3MuZ2V0KCJtZXNzYWdlIiwgImZhaWxlZCB1c2VyLWRlZmluZWQgY29uZGl0aW9uIikKICAgICAgICBleGNfdHlwZSA9IFBhcnNlRmF0YWxFeGNlcHRpb24gaWYga3dhcmdzLmdldCgiZmF0YWwiLCBGYWxzZSkgZWxzZSBQYXJzZUV4Y2VwdGlvbgogICAgICAgIGZvciBmbiBpbiBmbnM6CiAgICAgICAgICAgIGRlZiBwYShzLGwsdCk6CiAgICAgICAgICAgICAgICBpZiBub3QgYm9vbChfdHJpbV9hcml0eShmbikocyxsLHQpKToKICAgICAgICAgICAgICAgICAgICByYWlzZSBleGNfdHlwZShzLGwsbXNnKQogICAgICAgICAgICBzZWxmLnBhcnNlQWN0aW9uLmFwcGVuZChwYSkKICAgICAgICBzZWxmLmNhbGxEdXJpbmdUcnkgPSBzZWxmLmNhbGxEdXJpbmdUcnkgb3Iga3dhcmdzLmdldCgiY2FsbER1cmluZ1RyeSIsIEZhbHNlKQogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIHNldEZhaWxBY3Rpb24oIHNlbGYsIGZuICk6CiAgICAgICAgIiIiRGVmaW5lIGFjdGlvbiB0byBwZXJmb3JtIGlmIHBhcnNpbmcgZmFpbHMgYXQgdGhpcyBleHByZXNzaW9uLgogICAgICAgICAgIEZhaWwgYWN0b24gZm4gaXMgYSBjYWxsYWJsZSBmdW5jdGlvbiB0aGF0IHRha2VzIHRoZSBhcmd1bWVudHMKICAgICAgICAgICBDe2ZuKHMsbG9jLGV4cHIsZXJyKX0gd2hlcmU6CiAgICAgICAgICAgIC0gcyA9IHN0cmluZyBiZWluZyBwYXJzZWQKICAgICAgICAgICAgLSBsb2MgPSBsb2NhdGlvbiB3aGVyZSBleHByZXNzaW9uIG1hdGNoIHdhcyBhdHRlbXB0ZWQgYW5kIGZhaWxlZAogICAgICAgICAgICAtIGV4cHIgPSB0aGUgcGFyc2UgZXhwcmVzc2lvbiB0aGF0IGZhaWxlZAogICAgICAgICAgICAtIGVyciA9IHRoZSBleGNlcHRpb24gdGhyb3duCiAgICAgICAgICAgVGhlIGZ1bmN0aW9uIHJldHVybnMgbm8gdmFsdWUuICBJdCBtYXkgdGhyb3cgQ3tMe1BhcnNlRmF0YWxFeGNlcHRpb259fQogICAgICAgICAgIGlmIGl0IGlzIGRlc2lyZWQgdG8gc3RvcCBwYXJzaW5nIGltbWVkaWF0ZWx5LiIiIgogICAgICAgIHNlbGYuZmFpbEFjdGlvbiA9IGZuCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgX3NraXBJZ25vcmFibGVzKCBzZWxmLCBpbnN0cmluZywgbG9jICk6CiAgICAgICAgZXhwcnNGb3VuZCA9IFRydWUKICAgICAgICB3aGlsZSBleHByc0ZvdW5kOgogICAgICAgICAgICBleHByc0ZvdW5kID0gRmFsc2UKICAgICAgICAgICAgZm9yIGUgaW4gc2VsZi5pZ25vcmVFeHByczoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICB3aGlsZSAxOgogICAgICAgICAgICAgICAgICAgICAgICBsb2MsZHVtbXkgPSBlLl9wYXJzZSggaW5zdHJpbmcsIGxvYyApCiAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJzRm91bmQgPSBUcnVlCiAgICAgICAgICAgICAgICBleGNlcHQgUGFyc2VFeGNlcHRpb246CiAgICAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgIHJldHVybiBsb2MKCiAgICBkZWYgcHJlUGFyc2UoIHNlbGYsIGluc3RyaW5nLCBsb2MgKToKICAgICAgICBpZiBzZWxmLmlnbm9yZUV4cHJzOgogICAgICAgICAgICBsb2MgPSBzZWxmLl9za2lwSWdub3JhYmxlcyggaW5zdHJpbmcsIGxvYyApCgogICAgICAgIGlmIHNlbGYuc2tpcFdoaXRlc3BhY2U6CiAgICAgICAgICAgIHd0ID0gc2VsZi53aGl0ZUNoYXJzCiAgICAgICAgICAgIGluc3RybGVuID0gbGVuKGluc3RyaW5nKQogICAgICAgICAgICB3aGlsZSBsb2MgPCBpbnN0cmxlbiBhbmQgaW5zdHJpbmdbbG9jXSBpbiB3dDoKICAgICAgICAgICAgICAgIGxvYyArPSAxCgogICAgICAgIHJldHVybiBsb2MKCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOgogICAgICAgIHJldHVybiBsb2MsIFtdCgogICAgZGVmIHBvc3RQYXJzZSggc2VsZiwgaW5zdHJpbmcsIGxvYywgdG9rZW5saXN0ICk6CiAgICAgICAgcmV0dXJuIHRva2VubGlzdAoKICAgICN+IEBwcm9maWxlCiAgICBkZWYgX3BhcnNlTm9DYWNoZSggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUsIGNhbGxQcmVQYXJzZT1UcnVlICk6CiAgICAgICAgZGVidWdnaW5nID0gKCBzZWxmLmRlYnVnICkgI2FuZCBkb0FjdGlvbnMgKQoKICAgICAgICBpZiBkZWJ1Z2dpbmcgb3Igc2VsZi5mYWlsQWN0aW9uOgogICAgICAgICAgICAjfiBwcmludCAoIk1hdGNoIixzZWxmLCJhdCBsb2MiLGxvYywiKCVkLCVkKSIgJSAoIGxpbmVubyhsb2MsaW5zdHJpbmcpLCBjb2wobG9jLGluc3RyaW5nKSApKQogICAgICAgICAgICBpZiAoc2VsZi5kZWJ1Z0FjdGlvbnNbMF0gKToKICAgICAgICAgICAgICAgIHNlbGYuZGVidWdBY3Rpb25zWzBdKCBpbnN0cmluZywgbG9jLCBzZWxmICkKICAgICAgICAgICAgaWYgY2FsbFByZVBhcnNlIGFuZCBzZWxmLmNhbGxQcmVwYXJzZToKICAgICAgICAgICAgICAgIHByZWxvYyA9IHNlbGYucHJlUGFyc2UoIGluc3RyaW5nLCBsb2MgKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcHJlbG9jID0gbG9jCiAgICAgICAgICAgIHRva2Vuc1N0YXJ0ID0gcHJlbG9jCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBsb2MsdG9rZW5zID0gc2VsZi5wYXJzZUltcGwoIGluc3RyaW5nLCBwcmVsb2MsIGRvQWN0aW9ucyApCiAgICAgICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKICAgICAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbiggaW5zdHJpbmcsIGxlbihpbnN0cmluZyksIHNlbGYuZXJybXNnLCBzZWxmICkKICAgICAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBlcnI6CiAgICAgICAgICAgICAgICAjfiBwcmludCAoIkV4Y2VwdGlvbiByYWlzZWQ6IiwgZXJyKQogICAgICAgICAgICAgICAgaWYgc2VsZi5kZWJ1Z0FjdGlvbnNbMl06CiAgICAgICAgICAgICAgICAgICAgc2VsZi5kZWJ1Z0FjdGlvbnNbMl0oIGluc3RyaW5nLCB0b2tlbnNTdGFydCwgc2VsZiwgZXJyICkKICAgICAgICAgICAgICAgIGlmIHNlbGYuZmFpbEFjdGlvbjoKICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWxBY3Rpb24oIGluc3RyaW5nLCB0b2tlbnNTdGFydCwgc2VsZiwgZXJyICkKICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgY2FsbFByZVBhcnNlIGFuZCBzZWxmLmNhbGxQcmVwYXJzZToKICAgICAgICAgICAgICAgIHByZWxvYyA9IHNlbGYucHJlUGFyc2UoIGluc3RyaW5nLCBsb2MgKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcHJlbG9jID0gbG9jCiAgICAgICAgICAgIHRva2Vuc1N0YXJ0ID0gcHJlbG9jCiAgICAgICAgICAgIGlmIHNlbGYubWF5SW5kZXhFcnJvciBvciBsb2MgPj0gbGVuKGluc3RyaW5nKToKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBsb2MsdG9rZW5zID0gc2VsZi5wYXJzZUltcGwoIGluc3RyaW5nLCBwcmVsb2MsIGRvQWN0aW9ucyApCiAgICAgICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKICAgICAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbiggaW5zdHJpbmcsIGxlbihpbnN0cmluZyksIHNlbGYuZXJybXNnLCBzZWxmICkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGxvYyx0b2tlbnMgPSBzZWxmLnBhcnNlSW1wbCggaW5zdHJpbmcsIHByZWxvYywgZG9BY3Rpb25zICkKCiAgICAgICAgdG9rZW5zID0gc2VsZi5wb3N0UGFyc2UoIGluc3RyaW5nLCBsb2MsIHRva2VucyApCgogICAgICAgIHJldFRva2VucyA9IFBhcnNlUmVzdWx0cyggdG9rZW5zLCBzZWxmLnJlc3VsdHNOYW1lLCBhc0xpc3Q9c2VsZi5zYXZlQXNMaXN0LCBtb2RhbD1zZWxmLm1vZGFsUmVzdWx0cyApCiAgICAgICAgaWYgc2VsZi5wYXJzZUFjdGlvbiBhbmQgKGRvQWN0aW9ucyBvciBzZWxmLmNhbGxEdXJpbmdUcnkpOgogICAgICAgICAgICBpZiBkZWJ1Z2dpbmc6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgZm9yIGZuIGluIHNlbGYucGFyc2VBY3Rpb246CiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VucyA9IGZuKCBpbnN0cmluZywgdG9rZW5zU3RhcnQsIHJldFRva2VucyApCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRva2VucyBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFRva2VucyA9IFBhcnNlUmVzdWx0cyggdG9rZW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlc3VsdHNOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc0xpc3Q9c2VsZi5zYXZlQXNMaXN0IGFuZCBpc2luc3RhbmNlKHRva2VucywoUGFyc2VSZXN1bHRzLGxpc3QpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kYWw9c2VsZi5tb2RhbFJlc3VsdHMgKQogICAgICAgICAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBlcnI6CiAgICAgICAgICAgICAgICAgICAgI34gcHJpbnQgIkV4Y2VwdGlvbiByYWlzZWQgaW4gdXNlciBwYXJzZSBhY3Rpb246IiwgZXJyCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZGVidWdBY3Rpb25zWzJdICk6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGVidWdBY3Rpb25zWzJdKCBpbnN0cmluZywgdG9rZW5zU3RhcnQsIHNlbGYsIGVyciApCiAgICAgICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGZvciBmbiBpbiBzZWxmLnBhcnNlQWN0aW9uOgogICAgICAgICAgICAgICAgICAgIHRva2VucyA9IGZuKCBpbnN0cmluZywgdG9rZW5zU3RhcnQsIHJldFRva2VucyApCiAgICAgICAgICAgICAgICAgICAgaWYgdG9rZW5zIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICByZXRUb2tlbnMgPSBQYXJzZVJlc3VsdHMoIHRva2VucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlc3VsdHNOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzTGlzdD1zZWxmLnNhdmVBc0xpc3QgYW5kIGlzaW5zdGFuY2UodG9rZW5zLChQYXJzZVJlc3VsdHMsbGlzdCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGFsPXNlbGYubW9kYWxSZXN1bHRzICkKCiAgICAgICAgaWYgZGVidWdnaW5nOgogICAgICAgICAgICAjfiBwcmludCAoIk1hdGNoZWQiLHNlbGYsIi0+IixyZXRUb2tlbnMuYXNMaXN0KCkpCiAgICAgICAgICAgIGlmIChzZWxmLmRlYnVnQWN0aW9uc1sxXSApOgogICAgICAgICAgICAgICAgc2VsZi5kZWJ1Z0FjdGlvbnNbMV0oIGluc3RyaW5nLCB0b2tlbnNTdGFydCwgbG9jLCBzZWxmLCByZXRUb2tlbnMgKQoKICAgICAgICByZXR1cm4gbG9jLCByZXRUb2tlbnMKCiAgICBkZWYgdHJ5UGFyc2UoIHNlbGYsIGluc3RyaW5nLCBsb2MgKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9wYXJzZSggaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPUZhbHNlIClbMF0KICAgICAgICBleGNlcHQgUGFyc2VGYXRhbEV4Y2VwdGlvbjoKICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oIGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQogICAgCiAgICBkZWYgY2FuUGFyc2VOZXh0KHNlbGYsIGluc3RyaW5nLCBsb2MpOgogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi50cnlQYXJzZShpbnN0cmluZywgbG9jKQogICAgICAgIGV4Y2VwdCAoUGFyc2VFeGNlcHRpb24sIEluZGV4RXJyb3IpOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGNsYXNzIF9VbmJvdW5kZWRDYWNoZShvYmplY3QpOgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAgICAgY2FjaGUgPSB7fQogICAgICAgICAgICBzZWxmLm5vdF9pbl9jYWNoZSA9IG5vdF9pbl9jYWNoZSA9IG9iamVjdCgpCgogICAgICAgICAgICBkZWYgZ2V0KHNlbGYsIGtleSk6CiAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGUuZ2V0KGtleSwgbm90X2luX2NhY2hlKQoKICAgICAgICAgICAgZGVmIHNldChzZWxmLCBrZXksIHZhbHVlKToKICAgICAgICAgICAgICAgIGNhY2hlW2tleV0gPSB2YWx1ZQoKICAgICAgICAgICAgZGVmIGNsZWFyKHNlbGYpOgogICAgICAgICAgICAgICAgY2FjaGUuY2xlYXIoKQoKICAgICAgICAgICAgc2VsZi5nZXQgPSB0eXBlcy5NZXRob2RUeXBlKGdldCwgc2VsZikKICAgICAgICAgICAgc2VsZi5zZXQgPSB0eXBlcy5NZXRob2RUeXBlKHNldCwgc2VsZikKICAgICAgICAgICAgc2VsZi5jbGVhciA9IHR5cGVzLk1ldGhvZFR5cGUoY2xlYXIsIHNlbGYpCgogICAgaWYgX09yZGVyZWREaWN0IGlzIG5vdCBOb25lOgogICAgICAgIGNsYXNzIF9GaWZvQ2FjaGUob2JqZWN0KToKICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNpemUpOgogICAgICAgICAgICAgICAgc2VsZi5ub3RfaW5fY2FjaGUgPSBub3RfaW5fY2FjaGUgPSBvYmplY3QoKQoKICAgICAgICAgICAgICAgIGNhY2hlID0gX09yZGVyZWREaWN0KCkKCiAgICAgICAgICAgICAgICBkZWYgZ2V0KHNlbGYsIGtleSk6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlLmdldChrZXksIG5vdF9pbl9jYWNoZSkKCiAgICAgICAgICAgICAgICBkZWYgc2V0KHNlbGYsIGtleSwgdmFsdWUpOgogICAgICAgICAgICAgICAgICAgIGNhY2hlW2tleV0gPSB2YWx1ZQogICAgICAgICAgICAgICAgICAgIGlmIGxlbihjYWNoZSkgPiBzaXplOgogICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS5wb3BpdGVtKEZhbHNlKQoKICAgICAgICAgICAgICAgIGRlZiBjbGVhcihzZWxmKToKICAgICAgICAgICAgICAgICAgICBjYWNoZS5jbGVhcigpCgogICAgICAgICAgICAgICAgc2VsZi5nZXQgPSB0eXBlcy5NZXRob2RUeXBlKGdldCwgc2VsZikKICAgICAgICAgICAgICAgIHNlbGYuc2V0ID0gdHlwZXMuTWV0aG9kVHlwZShzZXQsIHNlbGYpCiAgICAgICAgICAgICAgICBzZWxmLmNsZWFyID0gdHlwZXMuTWV0aG9kVHlwZShjbGVhciwgc2VsZikKCiAgICBlbHNlOgogICAgICAgIGNsYXNzIF9GaWZvQ2FjaGUob2JqZWN0KToKICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNpemUpOgogICAgICAgICAgICAgICAgc2VsZi5ub3RfaW5fY2FjaGUgPSBub3RfaW5fY2FjaGUgPSBvYmplY3QoKQoKICAgICAgICAgICAgICAgIGNhY2hlID0ge30KICAgICAgICAgICAgICAgIGtleV9maWZvID0gY29sbGVjdGlvbnMuZGVxdWUoW10sIHNpemUpCgogICAgICAgICAgICAgICAgZGVmIGdldChzZWxmLCBrZXkpOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZS5nZXQoa2V5LCBub3RfaW5fY2FjaGUpCgogICAgICAgICAgICAgICAgZGVmIHNldChzZWxmLCBrZXksIHZhbHVlKToKICAgICAgICAgICAgICAgICAgICBjYWNoZVtrZXldID0gdmFsdWUKICAgICAgICAgICAgICAgICAgICBpZiBsZW4oY2FjaGUpID4gc2l6ZToKICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUucG9wKGtleV9maWZvLnBvcGxlZnQoKSwgTm9uZSkKICAgICAgICAgICAgICAgICAgICBrZXlfZmlmby5hcHBlbmQoa2V5KQoKICAgICAgICAgICAgICAgIGRlZiBjbGVhcihzZWxmKToKICAgICAgICAgICAgICAgICAgICBjYWNoZS5jbGVhcigpCiAgICAgICAgICAgICAgICAgICAga2V5X2ZpZm8uY2xlYXIoKQoKICAgICAgICAgICAgICAgIHNlbGYuZ2V0ID0gdHlwZXMuTWV0aG9kVHlwZShnZXQsIHNlbGYpCiAgICAgICAgICAgICAgICBzZWxmLnNldCA9IHR5cGVzLk1ldGhvZFR5cGUoc2V0LCBzZWxmKQogICAgICAgICAgICAgICAgc2VsZi5jbGVhciA9IHR5cGVzLk1ldGhvZFR5cGUoY2xlYXIsIHNlbGYpCgogICAgIyBhcmd1bWVudCBjYWNoZSBmb3Igb3B0aW1pemluZyByZXBlYXRlZCBjYWxscyB3aGVuIGJhY2t0cmFja2luZyB0aHJvdWdoIHJlY3Vyc2l2ZSBleHByZXNzaW9ucwogICAgcGFja3JhdF9jYWNoZSA9IHt9ICMgdGhpcyBpcyBzZXQgbGF0ZXIgYnkgZW5hYmxlZFBhY2tyYXQoKTsgdGhpcyBpcyBoZXJlIHNvIHRoYXQgcmVzZXRDYWNoZSgpIGRvZXNuJ3QgZmFpbAogICAgcGFja3JhdF9jYWNoZV9sb2NrID0gUkxvY2soKQogICAgcGFja3JhdF9jYWNoZV9zdGF0cyA9IFswLCAwXQoKICAgICMgdGhpcyBtZXRob2QgZ2V0cyByZXBlYXRlZGx5IGNhbGxlZCBkdXJpbmcgYmFja3RyYWNraW5nIHdpdGggdGhlIHNhbWUgYXJndW1lbnRzIC0KICAgICMgd2UgY2FuIGNhY2hlIHRoZXNlIGFyZ3VtZW50cyBhbmQgc2F2ZSBvdXJzZWx2ZXMgdGhlIHRyb3VibGUgb2YgcmUtcGFyc2luZyB0aGUgY29udGFpbmVkIGV4cHJlc3Npb24KICAgIGRlZiBfcGFyc2VDYWNoZSggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUsIGNhbGxQcmVQYXJzZT1UcnVlICk6CiAgICAgICAgSElULCBNSVNTID0gMCwgMQogICAgICAgIGxvb2t1cCA9IChzZWxmLCBpbnN0cmluZywgbG9jLCBjYWxsUHJlUGFyc2UsIGRvQWN0aW9ucykKICAgICAgICB3aXRoIFBhcnNlckVsZW1lbnQucGFja3JhdF9jYWNoZV9sb2NrOgogICAgICAgICAgICBjYWNoZSA9IFBhcnNlckVsZW1lbnQucGFja3JhdF9jYWNoZQogICAgICAgICAgICB2YWx1ZSA9IGNhY2hlLmdldChsb29rdXApCiAgICAgICAgICAgIGlmIHZhbHVlIGlzIGNhY2hlLm5vdF9pbl9jYWNoZToKICAgICAgICAgICAgICAgIFBhcnNlckVsZW1lbnQucGFja3JhdF9jYWNoZV9zdGF0c1tNSVNTXSArPSAxCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxmLl9wYXJzZU5vQ2FjaGUoaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zLCBjYWxsUHJlUGFyc2UpCiAgICAgICAgICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIHBlOgogICAgICAgICAgICAgICAgICAgICMgY2FjaGUgYSBjb3B5IG9mIHRoZSBleGNlcHRpb24sIHdpdGhvdXQgdGhlIHRyYWNlYmFjawogICAgICAgICAgICAgICAgICAgIGNhY2hlLnNldChsb29rdXAsIHBlLl9fY2xhc3NfXygqcGUuYXJncykpCiAgICAgICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgY2FjaGUuc2V0KGxvb2t1cCwgKHZhbHVlWzBdLCB2YWx1ZVsxXS5jb3B5KCkpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgUGFyc2VyRWxlbWVudC5wYWNrcmF0X2NhY2hlX3N0YXRzW0hJVF0gKz0gMQogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgRXhjZXB0aW9uKToKICAgICAgICAgICAgICAgICAgICByYWlzZSB2YWx1ZQogICAgICAgICAgICAgICAgcmV0dXJuICh2YWx1ZVswXSwgdmFsdWVbMV0uY29weSgpKQoKICAgIF9wYXJzZSA9IF9wYXJzZU5vQ2FjaGUKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgcmVzZXRDYWNoZSgpOgogICAgICAgIFBhcnNlckVsZW1lbnQucGFja3JhdF9jYWNoZS5jbGVhcigpCiAgICAgICAgUGFyc2VyRWxlbWVudC5wYWNrcmF0X2NhY2hlX3N0YXRzWzpdID0gWzBdICogbGVuKFBhcnNlckVsZW1lbnQucGFja3JhdF9jYWNoZV9zdGF0cykKCiAgICBfcGFja3JhdEVuYWJsZWQgPSBGYWxzZQogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIGVuYWJsZVBhY2tyYXQoY2FjaGVfc2l6ZV9saW1pdD0xMjgpOgogICAgICAgICIiIkVuYWJsZXMgInBhY2tyYXQiIHBhcnNpbmcsIHdoaWNoIGFkZHMgbWVtb2l6aW5nIHRvIHRoZSBwYXJzaW5nIGxvZ2ljLgogICAgICAgICAgIFJlcGVhdGVkIHBhcnNlIGF0dGVtcHRzIGF0IHRoZSBzYW1lIHN0cmluZyBsb2NhdGlvbiAod2hpY2ggaGFwcGVucwogICAgICAgICAgIG9mdGVuIGluIG1hbnkgY29tcGxleCBncmFtbWFycykgY2FuIGltbWVkaWF0ZWx5IHJldHVybiBhIGNhY2hlZCB2YWx1ZSwKICAgICAgICAgICBpbnN0ZWFkIG9mIHJlLWV4ZWN1dGluZyBwYXJzaW5nL3ZhbGlkYXRpbmcgY29kZS4gIE1lbW9pemluZyBpcyBkb25lIG9mCiAgICAgICAgICAgYm90aCB2YWxpZCByZXN1bHRzIGFuZCBwYXJzaW5nIGV4Y2VwdGlvbnMuCiAgICAgICAgICAgCiAgICAgICAgICAgUGFyYW1ldGVyczoKICAgICAgICAgICAgLSBjYWNoZV9zaXplX2xpbWl0IC0gKGRlZmF1bHQ9Q3sxMjh9KSAtIGlmIGFuIGludGVnZXIgdmFsdWUgaXMgcHJvdmlkZWQKICAgICAgICAgICAgICB3aWxsIGxpbWl0IHRoZSBzaXplIG9mIHRoZSBwYWNrcmF0IGNhY2hlOyBpZiBOb25lIGlzIHBhc3NlZCwgdGhlbgogICAgICAgICAgICAgIHRoZSBjYWNoZSBzaXplIHdpbGwgYmUgdW5ib3VuZGVkOyBpZiAwIGlzIHBhc3NlZCwgdGhlIGNhY2hlIHdpbGwKICAgICAgICAgICAgICBiZSBlZmZlY3RpdmVseSBkaXNhYmxlZC4KICAgICAgICAgICAgCiAgICAgICAgICAgVGhpcyBzcGVlZHVwIG1heSBicmVhayBleGlzdGluZyBwcm9ncmFtcyB0aGF0IHVzZSBwYXJzZSBhY3Rpb25zIHRoYXQKICAgICAgICAgICBoYXZlIHNpZGUtZWZmZWN0cy4gIEZvciB0aGlzIHJlYXNvbiwgcGFja3JhdCBwYXJzaW5nIGlzIGRpc2FibGVkIHdoZW4KICAgICAgICAgICB5b3UgZmlyc3QgaW1wb3J0IHB5cGFyc2luZy4gIFRvIGFjdGl2YXRlIHRoZSBwYWNrcmF0IGZlYXR1cmUsIHlvdXIKICAgICAgICAgICBwcm9ncmFtIG11c3QgY2FsbCB0aGUgY2xhc3MgbWV0aG9kIEN7UGFyc2VyRWxlbWVudC5lbmFibGVQYWNrcmF0KCl9LiAgSWYKICAgICAgICAgICB5b3VyIHByb2dyYW0gdXNlcyBDe3BzeWNvfSB0byAiY29tcGlsZSBhcyB5b3UgZ28iLCB5b3UgbXVzdCBjYWxsCiAgICAgICAgICAgQ3tlbmFibGVQYWNrcmF0fSBiZWZvcmUgY2FsbGluZyBDe3BzeWNvLmZ1bGwoKX0uICBJZiB5b3UgZG8gbm90IGRvIHRoaXMsCiAgICAgICAgICAgUHl0aG9uIHdpbGwgY3Jhc2guICBGb3IgYmVzdCByZXN1bHRzLCBjYWxsIEN7ZW5hYmxlUGFja3JhdCgpfSBpbW1lZGlhdGVseQogICAgICAgICAgIGFmdGVyIGltcG9ydGluZyBweXBhcnNpbmcuCiAgICAgICAgICAgCiAgICAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgICAgIGltcG9ydCBweXBhcnNpbmcKICAgICAgICAgICAgICAgcHlwYXJzaW5nLlBhcnNlckVsZW1lbnQuZW5hYmxlUGFja3JhdCgpCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IFBhcnNlckVsZW1lbnQuX3BhY2tyYXRFbmFibGVkOgogICAgICAgICAgICBQYXJzZXJFbGVtZW50Ll9wYWNrcmF0RW5hYmxlZCA9IFRydWUKICAgICAgICAgICAgaWYgY2FjaGVfc2l6ZV9saW1pdCBpcyBOb25lOgogICAgICAgICAgICAgICAgUGFyc2VyRWxlbWVudC5wYWNrcmF0X2NhY2hlID0gUGFyc2VyRWxlbWVudC5fVW5ib3VuZGVkQ2FjaGUoKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgUGFyc2VyRWxlbWVudC5wYWNrcmF0X2NhY2hlID0gUGFyc2VyRWxlbWVudC5fRmlmb0NhY2hlKGNhY2hlX3NpemVfbGltaXQpCiAgICAgICAgICAgIFBhcnNlckVsZW1lbnQuX3BhcnNlID0gUGFyc2VyRWxlbWVudC5fcGFyc2VDYWNoZQoKICAgIGRlZiBwYXJzZVN0cmluZyggc2VsZiwgaW5zdHJpbmcsIHBhcnNlQWxsPUZhbHNlICk6CiAgICAgICAgIiIiCiAgICAgICAgRXhlY3V0ZSB0aGUgcGFyc2UgZXhwcmVzc2lvbiB3aXRoIHRoZSBnaXZlbiBzdHJpbmcuCiAgICAgICAgVGhpcyBpcyB0aGUgbWFpbiBpbnRlcmZhY2UgdG8gdGhlIGNsaWVudCBjb2RlLCBvbmNlIHRoZSBjb21wbGV0ZQogICAgICAgIGV4cHJlc3Npb24gaGFzIGJlZW4gYnVpbHQuCgogICAgICAgIElmIHlvdSB3YW50IHRoZSBncmFtbWFyIHRvIHJlcXVpcmUgdGhhdCB0aGUgZW50aXJlIGlucHV0IHN0cmluZyBiZQogICAgICAgIHN1Y2Nlc3NmdWxseSBwYXJzZWQsIHRoZW4gc2V0IEN7cGFyc2VBbGx9IHRvIFRydWUgKGVxdWl2YWxlbnQgdG8gZW5kaW5nCiAgICAgICAgdGhlIGdyYW1tYXIgd2l0aCBDe0x7U3RyaW5nRW5kKCl9fSkuCgogICAgICAgIE5vdGU6IEN7cGFyc2VTdHJpbmd9IGltcGxpY2l0bHkgY2FsbHMgQ3tleHBhbmR0YWJzKCl9IG9uIHRoZSBpbnB1dCBzdHJpbmcsCiAgICAgICAgaW4gb3JkZXIgdG8gcmVwb3J0IHByb3BlciBjb2x1bW4gbnVtYmVycyBpbiBwYXJzZSBhY3Rpb25zLgogICAgICAgIElmIHRoZSBpbnB1dCBzdHJpbmcgY29udGFpbnMgdGFicyBhbmQKICAgICAgICB0aGUgZ3JhbW1hciB1c2VzIHBhcnNlIGFjdGlvbnMgdGhhdCB1c2UgdGhlIEN7bG9jfSBhcmd1bWVudCB0byBpbmRleCBpbnRvIHRoZQogICAgICAgIHN0cmluZyBiZWluZyBwYXJzZWQsIHlvdSBjYW4gZW5zdXJlIHlvdSBoYXZlIGEgY29uc2lzdGVudCB2aWV3IG9mIHRoZSBpbnB1dAogICAgICAgIHN0cmluZyBieToKICAgICAgICAgLSBjYWxsaW5nIEN7cGFyc2VXaXRoVGFic30gb24geW91ciBncmFtbWFyIGJlZm9yZSBjYWxsaW5nIEN7cGFyc2VTdHJpbmd9CiAgICAgICAgICAgKHNlZSBMe0l7cGFyc2VXaXRoVGFic308cGFyc2VXaXRoVGFicz59KQogICAgICAgICAtIGRlZmluZSB5b3VyIHBhcnNlIGFjdGlvbiB1c2luZyB0aGUgZnVsbCBDeyhzLGxvYyx0b2tzKX0gc2lnbmF0dXJlLCBhbmQKICAgICAgICAgICByZWZlcmVuY2UgdGhlIGlucHV0IHN0cmluZyB1c2luZyB0aGUgcGFyc2UgYWN0aW9uJ3MgQ3tzfSBhcmd1bWVudAogICAgICAgICAtIGV4cGxpY3RseSBleHBhbmQgdGhlIHRhYnMgaW4geW91ciBpbnB1dCBzdHJpbmcgYmVmb3JlIGNhbGxpbmcKICAgICAgICAgICBDe3BhcnNlU3RyaW5nfQogICAgICAgIAogICAgICAgIEV4YW1wbGU6OgogICAgICAgICAgICBXb3JkKCdhJykucGFyc2VTdHJpbmcoJ2FhYWFhYmFhYScpICAjIC0+IFsnYWFhYWEnXQogICAgICAgICAgICBXb3JkKCdhJykucGFyc2VTdHJpbmcoJ2FhYWFhYmFhYScsIHBhcnNlQWxsPVRydWUpICAjIC0+IEV4Y2VwdGlvbjogRXhwZWN0ZWQgZW5kIG9mIHRleHQKICAgICAgICAiIiIKICAgICAgICBQYXJzZXJFbGVtZW50LnJlc2V0Q2FjaGUoKQogICAgICAgIGlmIG5vdCBzZWxmLnN0cmVhbWxpbmVkOgogICAgICAgICAgICBzZWxmLnN0cmVhbWxpbmUoKQogICAgICAgICAgICAjfiBzZWxmLnNhdmVBc0xpc3QgPSBUcnVlCiAgICAgICAgZm9yIGUgaW4gc2VsZi5pZ25vcmVFeHByczoKICAgICAgICAgICAgZS5zdHJlYW1saW5lKCkKICAgICAgICBpZiBub3Qgc2VsZi5rZWVwVGFiczoKICAgICAgICAgICAgaW5zdHJpbmcgPSBpbnN0cmluZy5leHBhbmR0YWJzKCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGxvYywgdG9rZW5zID0gc2VsZi5fcGFyc2UoIGluc3RyaW5nLCAwICkKICAgICAgICAgICAgaWYgcGFyc2VBbGw6CiAgICAgICAgICAgICAgICBsb2MgPSBzZWxmLnByZVBhcnNlKCBpbnN0cmluZywgbG9jICkKICAgICAgICAgICAgICAgIHNlID0gRW1wdHkoKSArIFN0cmluZ0VuZCgpCiAgICAgICAgICAgICAgICBzZS5fcGFyc2UoIGluc3RyaW5nLCBsb2MgKQogICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgZXhjOgogICAgICAgICAgICBpZiBQYXJzZXJFbGVtZW50LnZlcmJvc2Vfc3RhY2t0cmFjZToKICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIGNhdGNoIGFuZCByZS1yYWlzZSBleGNlcHRpb24gZnJvbSBoZXJlLCBjbGVhcnMgb3V0IHB5cGFyc2luZyBpbnRlcm5hbCBzdGFjayB0cmFjZQogICAgICAgICAgICAgICAgcmFpc2UgZXhjCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHRva2VucwoKICAgIGRlZiBzY2FuU3RyaW5nKCBzZWxmLCBpbnN0cmluZywgbWF4TWF0Y2hlcz1fTUFYX0lOVCwgb3ZlcmxhcD1GYWxzZSApOgogICAgICAgICIiIgogICAgICAgIFNjYW4gdGhlIGlucHV0IHN0cmluZyBmb3IgZXhwcmVzc2lvbiBtYXRjaGVzLiAgRWFjaCBtYXRjaCB3aWxsIHJldHVybiB0aGUKICAgICAgICBtYXRjaGluZyB0b2tlbnMsIHN0YXJ0IGxvY2F0aW9uLCBhbmQgZW5kIGxvY2F0aW9uLiAgTWF5IGJlIGNhbGxlZCB3aXRoIG9wdGlvbmFsCiAgICAgICAgQ3ttYXhNYXRjaGVzfSBhcmd1bWVudCwgdG8gY2xpcCBzY2FubmluZyBhZnRlciAnbicgbWF0Y2hlcyBhcmUgZm91bmQuICBJZgogICAgICAgIEN7b3ZlcmxhcH0gaXMgc3BlY2lmaWVkLCB0aGVuIG92ZXJsYXBwaW5nIG1hdGNoZXMgd2lsbCBiZSByZXBvcnRlZC4KCiAgICAgICAgTm90ZSB0aGF0IHRoZSBzdGFydCBhbmQgZW5kIGxvY2F0aW9ucyBhcmUgcmVwb3J0ZWQgcmVsYXRpdmUgdG8gdGhlIHN0cmluZwogICAgICAgIGJlaW5nIHBhcnNlZC4gIFNlZSBMe0l7cGFyc2VTdHJpbmd9PHBhcnNlU3RyaW5nPn0gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gcGFyc2luZwogICAgICAgIHN0cmluZ3Mgd2l0aCBlbWJlZGRlZCB0YWJzLgoKICAgICAgICBFeGFtcGxlOjoKICAgICAgICAgICAgc291cmNlID0gInNsZGpmMTIzbHNkamprZjM0NXNsZGtqZjg3OWxranNmZDk4NyIKICAgICAgICAgICAgcHJpbnQoc291cmNlKQogICAgICAgICAgICBmb3IgdG9rZW5zLHN0YXJ0LGVuZCBpbiBXb3JkKGFscGhhcykuc2NhblN0cmluZyhzb3VyY2UpOgogICAgICAgICAgICAgICAgcHJpbnQoJyAnKnN0YXJ0ICsgJ14nKihlbmQtc3RhcnQpKQogICAgICAgICAgICAgICAgcHJpbnQoJyAnKnN0YXJ0ICsgdG9rZW5zWzBdKQogICAgICAgIAogICAgICAgIHByaW50czo6CiAgICAgICAgCiAgICAgICAgICAgIHNsZGpmMTIzbHNkamprZjM0NXNsZGtqZjg3OWxranNmZDk4NwogICAgICAgICAgICBeXl5eXgogICAgICAgICAgICBzbGRqZgogICAgICAgICAgICAgICAgICAgIF5eXl5eXl4KICAgICAgICAgICAgICAgICAgICBsc2RqamtmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGRramYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxranNmZAogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBzZWxmLnN0cmVhbWxpbmVkOgogICAgICAgICAgICBzZWxmLnN0cmVhbWxpbmUoKQogICAgICAgIGZvciBlIGluIHNlbGYuaWdub3JlRXhwcnM6CiAgICAgICAgICAgIGUuc3RyZWFtbGluZSgpCgogICAgICAgIGlmIG5vdCBzZWxmLmtlZXBUYWJzOgogICAgICAgICAgICBpbnN0cmluZyA9IF91c3RyKGluc3RyaW5nKS5leHBhbmR0YWJzKCkKICAgICAgICBpbnN0cmxlbiA9IGxlbihpbnN0cmluZykKICAgICAgICBsb2MgPSAwCiAgICAgICAgcHJlcGFyc2VGbiA9IHNlbGYucHJlUGFyc2UKICAgICAgICBwYXJzZUZuID0gc2VsZi5fcGFyc2UKICAgICAgICBQYXJzZXJFbGVtZW50LnJlc2V0Q2FjaGUoKQogICAgICAgIG1hdGNoZXMgPSAwCiAgICAgICAgdHJ5OgogICAgICAgICAgICB3aGlsZSBsb2MgPD0gaW5zdHJsZW4gYW5kIG1hdGNoZXMgPCBtYXhNYXRjaGVzOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHByZWxvYyA9IHByZXBhcnNlRm4oIGluc3RyaW5nLCBsb2MgKQogICAgICAgICAgICAgICAgICAgIG5leHRMb2MsdG9rZW5zID0gcGFyc2VGbiggaW5zdHJpbmcsIHByZWxvYywgY2FsbFByZVBhcnNlPUZhbHNlICkKICAgICAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgICAgICBsb2MgPSBwcmVsb2MrMQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBpZiBuZXh0TG9jID4gbG9jOgogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzICs9IDEKICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgdG9rZW5zLCBwcmVsb2MsIG5leHRMb2MKICAgICAgICAgICAgICAgICAgICAgICAgaWYgb3ZlcmxhcDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRsb2MgPSBwcmVwYXJzZUZuKCBpbnN0cmluZywgbG9jICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5leHRsb2MgPiBsb2M6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jID0gbmV4dExvYwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2MgKz0gMQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jID0gbmV4dExvYwogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGxvYyA9IHByZWxvYysxCiAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBleGM6CiAgICAgICAgICAgIGlmIFBhcnNlckVsZW1lbnQudmVyYm9zZV9zdGFja3RyYWNlOgogICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgY2F0Y2ggYW5kIHJlLXJhaXNlIGV4Y2VwdGlvbiBmcm9tIGhlcmUsIGNsZWFycyBvdXQgcHlwYXJzaW5nIGludGVybmFsIHN0YWNrIHRyYWNlCiAgICAgICAgICAgICAgICByYWlzZSBleGMKCiAgICBkZWYgdHJhbnNmb3JtU3RyaW5nKCBzZWxmLCBpbnN0cmluZyApOgogICAgICAgICIiIgogICAgICAgIEV4dGVuc2lvbiB0byBDe0x7c2NhblN0cmluZ319LCB0byBtb2RpZnkgbWF0Y2hpbmcgdGV4dCB3aXRoIG1vZGlmaWVkIHRva2VucyB0aGF0IG1heQogICAgICAgIGJlIHJldHVybmVkIGZyb20gYSBwYXJzZSBhY3Rpb24uICBUbyB1c2UgQ3t0cmFuc2Zvcm1TdHJpbmd9LCBkZWZpbmUgYSBncmFtbWFyIGFuZAogICAgICAgIGF0dGFjaCBhIHBhcnNlIGFjdGlvbiB0byBpdCB0aGF0IG1vZGlmaWVzIHRoZSByZXR1cm5lZCB0b2tlbiBsaXN0LgogICAgICAgIEludm9raW5nIEN7dHJhbnNmb3JtU3RyaW5nKCl9IG9uIGEgdGFyZ2V0IHN0cmluZyB3aWxsIHRoZW4gc2NhbiBmb3IgbWF0Y2hlcywKICAgICAgICBhbmQgcmVwbGFjZSB0aGUgbWF0Y2hlZCB0ZXh0IHBhdHRlcm5zIGFjY29yZGluZyB0byB0aGUgbG9naWMgaW4gdGhlIHBhcnNlCiAgICAgICAgYWN0aW9uLiAgQ3t0cmFuc2Zvcm1TdHJpbmcoKX0gcmV0dXJucyB0aGUgcmVzdWx0aW5nIHRyYW5zZm9ybWVkIHN0cmluZy4KICAgICAgICAKICAgICAgICBFeGFtcGxlOjoKICAgICAgICAgICAgd2QgPSBXb3JkKGFscGhhcykKICAgICAgICAgICAgd2Quc2V0UGFyc2VBY3Rpb24obGFtYmRhIHRva3M6IHRva3NbMF0udGl0bGUoKSkKICAgICAgICAgICAgCiAgICAgICAgICAgIHByaW50KHdkLnRyYW5zZm9ybVN0cmluZygibm93IGlzIHRoZSB3aW50ZXIgb2Ygb3VyIGRpc2NvbnRlbnQgbWFkZSBnbG9yaW91cyBzdW1tZXIgYnkgdGhpcyBzdW4gb2YgeW9yay4iKSkKICAgICAgICBQcmludHM6OgogICAgICAgICAgICBOb3cgSXMgVGhlIFdpbnRlciBPZiBPdXIgRGlzY29udGVudCBNYWRlIEdsb3Jpb3VzIFN1bW1lciBCeSBUaGlzIFN1biBPZiBZb3JrLgogICAgICAgICIiIgogICAgICAgIG91dCA9IFtdCiAgICAgICAgbGFzdEUgPSAwCiAgICAgICAgIyBmb3JjZSBwcmVzZXJ2YXRpb24gb2YgPFRBQj5zLCB0byBtaW5pbWl6ZSB1bndhbnRlZCB0cmFuc2Zvcm1hdGlvbiBvZiBzdHJpbmcsIGFuZCB0bwogICAgICAgICMga2VlcCBzdHJpbmcgbG9jcyBzdHJhaWdodCBiZXR3ZWVuIHRyYW5zZm9ybVN0cmluZyBhbmQgc2NhblN0cmluZwogICAgICAgIHNlbGYua2VlcFRhYnMgPSBUcnVlCiAgICAgICAgdHJ5OgogICAgICAgICAgICBmb3IgdCxzLGUgaW4gc2VsZi5zY2FuU3RyaW5nKCBpbnN0cmluZyApOgogICAgICAgICAgICAgICAgb3V0LmFwcGVuZCggaW5zdHJpbmdbbGFzdEU6c10gKQogICAgICAgICAgICAgICAgaWYgdDoKICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHQsUGFyc2VSZXN1bHRzKToKICAgICAgICAgICAgICAgICAgICAgICAgb3V0ICs9IHQuYXNMaXN0KCkKICAgICAgICAgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UodCxsaXN0KToKICAgICAgICAgICAgICAgICAgICAgICAgb3V0ICs9IHQKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKHQpCiAgICAgICAgICAgICAgICBsYXN0RSA9IGUKICAgICAgICAgICAgb3V0LmFwcGVuZChpbnN0cmluZ1tsYXN0RTpdKQogICAgICAgICAgICBvdXQgPSBbbyBmb3IgbyBpbiBvdXQgaWYgb10KICAgICAgICAgICAgcmV0dXJuICIiLmpvaW4obWFwKF91c3RyLF9mbGF0dGVuKG91dCkpKQogICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgZXhjOgogICAgICAgICAgICBpZiBQYXJzZXJFbGVtZW50LnZlcmJvc2Vfc3RhY2t0cmFjZToKICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIGNhdGNoIGFuZCByZS1yYWlzZSBleGNlcHRpb24gZnJvbSBoZXJlLCBjbGVhcnMgb3V0IHB5cGFyc2luZyBpbnRlcm5hbCBzdGFjayB0cmFjZQogICAgICAgICAgICAgICAgcmFpc2UgZXhjCgogICAgZGVmIHNlYXJjaFN0cmluZyggc2VsZiwgaW5zdHJpbmcsIG1heE1hdGNoZXM9X01BWF9JTlQgKToKICAgICAgICAiIiIKICAgICAgICBBbm90aGVyIGV4dGVuc2lvbiB0byBDe0x7c2NhblN0cmluZ319LCBzaW1wbGlmeWluZyB0aGUgYWNjZXNzIHRvIHRoZSB0b2tlbnMgZm91bmQKICAgICAgICB0byBtYXRjaCB0aGUgZ2l2ZW4gcGFyc2UgZXhwcmVzc2lvbi4gIE1heSBiZSBjYWxsZWQgd2l0aCBvcHRpb25hbAogICAgICAgIEN7bWF4TWF0Y2hlc30gYXJndW1lbnQsIHRvIGNsaXAgc2VhcmNoaW5nIGFmdGVyICduJyBtYXRjaGVzIGFyZSBmb3VuZC4KICAgICAgICAKICAgICAgICBFeGFtcGxlOjoKICAgICAgICAgICAgIyBhIGNhcGl0YWxpemVkIHdvcmQgc3RhcnRzIHdpdGggYW4gdXBwZXJjYXNlIGxldHRlciwgZm9sbG93ZWQgYnkgemVybyBvciBtb3JlIGxvd2VyY2FzZSBsZXR0ZXJzCiAgICAgICAgICAgIGNhcF93b3JkID0gV29yZChhbHBoYXMudXBwZXIoKSwgYWxwaGFzLmxvd2VyKCkpCiAgICAgICAgICAgIAogICAgICAgICAgICBwcmludChjYXBfd29yZC5zZWFyY2hTdHJpbmcoIk1vcmUgdGhhbiBJcm9uLCBtb3JlIHRoYW4gTGVhZCwgbW9yZSB0aGFuIEdvbGQgSSBuZWVkIEVsZWN0cmljaXR5IikpCiAgICAgICAgcHJpbnRzOjoKICAgICAgICAgICAgWydNb3JlJywgJ0lyb24nLCAnTGVhZCcsICdHb2xkJywgJ0knXQogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIFBhcnNlUmVzdWx0cyhbIHQgZm9yIHQscyxlIGluIHNlbGYuc2NhblN0cmluZyggaW5zdHJpbmcsIG1heE1hdGNoZXMgKSBdKQogICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgZXhjOgogICAgICAgICAgICBpZiBQYXJzZXJFbGVtZW50LnZlcmJvc2Vfc3RhY2t0cmFjZToKICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIGNhdGNoIGFuZCByZS1yYWlzZSBleGNlcHRpb24gZnJvbSBoZXJlLCBjbGVhcnMgb3V0IHB5cGFyc2luZyBpbnRlcm5hbCBzdGFjayB0cmFjZQogICAgICAgICAgICAgICAgcmFpc2UgZXhjCgogICAgZGVmIHNwbGl0KHNlbGYsIGluc3RyaW5nLCBtYXhzcGxpdD1fTUFYX0lOVCwgaW5jbHVkZVNlcGFyYXRvcnM9RmFsc2UpOgogICAgICAgICIiIgogICAgICAgIEdlbmVyYXRvciBtZXRob2QgdG8gc3BsaXQgYSBzdHJpbmcgdXNpbmcgdGhlIGdpdmVuIGV4cHJlc3Npb24gYXMgYSBzZXBhcmF0b3IuCiAgICAgICAgTWF5IGJlIGNhbGxlZCB3aXRoIG9wdGlvbmFsIEN7bWF4c3BsaXR9IGFyZ3VtZW50LCB0byBsaW1pdCB0aGUgbnVtYmVyIG9mIHNwbGl0czsKICAgICAgICBhbmQgdGhlIG9wdGlvbmFsIEN7aW5jbHVkZVNlcGFyYXRvcnN9IGFyZ3VtZW50IChkZWZhdWx0PUN7RmFsc2V9KSwgaWYgdGhlIHNlcGFyYXRpbmcKICAgICAgICBtYXRjaGluZyB0ZXh0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgc3BsaXQgcmVzdWx0cy4KICAgICAgICAKICAgICAgICBFeGFtcGxlOjogICAgICAgIAogICAgICAgICAgICBwdW5jID0gb25lT2YobGlzdCgiLiw7Oi8tIT8iKSkKICAgICAgICAgICAgcHJpbnQobGlzdChwdW5jLnNwbGl0KCJUaGlzLCB0aGlzPywgdGhpcyBzZW50ZW5jZSwgaXMgYmFkbHkgcHVuY3R1YXRlZCEiKSkpCiAgICAgICAgcHJpbnRzOjoKICAgICAgICAgICAgWydUaGlzJywgJyB0aGlzJywgJycsICcgdGhpcyBzZW50ZW5jZScsICcgaXMgYmFkbHkgcHVuY3R1YXRlZCcsICcnXQogICAgICAgICIiIgogICAgICAgIHNwbGl0cyA9IDAKICAgICAgICBsYXN0ID0gMAogICAgICAgIGZvciB0LHMsZSBpbiBzZWxmLnNjYW5TdHJpbmcoaW5zdHJpbmcsIG1heE1hdGNoZXM9bWF4c3BsaXQpOgogICAgICAgICAgICB5aWVsZCBpbnN0cmluZ1tsYXN0OnNdCiAgICAgICAgICAgIGlmIGluY2x1ZGVTZXBhcmF0b3JzOgogICAgICAgICAgICAgICAgeWllbGQgdFswXQogICAgICAgICAgICBsYXN0ID0gZQogICAgICAgIHlpZWxkIGluc3RyaW5nW2xhc3Q6XQoKICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyICk6CiAgICAgICAgIiIiCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgKyBvcGVyYXRvciAtIHJldHVybnMgQ3tMe0FuZH19LiBBZGRpbmcgc3RyaW5ncyB0byBhIFBhcnNlckVsZW1lbnQKICAgICAgICBjb252ZXJ0cyB0aGVtIHRvIEx7TGl0ZXJhbH1zIGJ5IGRlZmF1bHQuCiAgICAgICAgCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgIGdyZWV0ID0gV29yZChhbHBoYXMpICsgIiwiICsgV29yZChhbHBoYXMpICsgIiEiCiAgICAgICAgICAgIGhlbGxvID0gIkhlbGxvLCBXb3JsZCEiCiAgICAgICAgICAgIHByaW50IChoZWxsbywgIi0+IiwgZ3JlZXQucGFyc2VTdHJpbmcoaGVsbG8pKQogICAgICAgIFByaW50czo6CiAgICAgICAgICAgIEhlbGxvLCBXb3JsZCEgLT4gWydIZWxsbycsICcsJywgJ1dvcmxkJywgJyEnXQogICAgICAgICIiIgogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6CiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoIG90aGVyLCBQYXJzZXJFbGVtZW50ICk6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHJldHVybiBBbmQoIFsgc2VsZiwgb3RoZXIgXSApCgogICAgZGVmIF9fcmFkZF9fKHNlbGYsIG90aGVyICk6CiAgICAgICAgIiIiCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgKyBvcGVyYXRvciB3aGVuIGxlZnQgb3BlcmFuZCBpcyBub3QgYSBDe0x7UGFyc2VyRWxlbWVudH19CiAgICAgICAgIiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToKICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToKICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwKICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpCiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcmV0dXJuIG90aGVyICsgc2VsZgoKICAgIGRlZiBfX3N1Yl9fKHNlbGYsIG90aGVyKToKICAgICAgICAiIiIKICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiAtIG9wZXJhdG9yLCByZXR1cm5zIEN7THtBbmR9fSB3aXRoIGVycm9yIHN0b3AKICAgICAgICAiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOgogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLAogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICByZXR1cm4gQW5kKCBbIHNlbGYsIEFuZC5fRXJyb3JTdG9wKCksIG90aGVyIF0gKQoKICAgIGRlZiBfX3JzdWJfXyhzZWxmLCBvdGhlciApOgogICAgICAgICIiIgogICAgICAgIEltcGxlbWVudGF0aW9uIG9mIC0gb3BlcmF0b3Igd2hlbiBsZWZ0IG9wZXJhbmQgaXMgbm90IGEgQ3tMe1BhcnNlckVsZW1lbnR9fQogICAgICAgICIiIgogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6CiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoIG90aGVyLCBQYXJzZXJFbGVtZW50ICk6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHJldHVybiBvdGhlciAtIHNlbGYKCiAgICBkZWYgX19tdWxfXyhzZWxmLG90aGVyKToKICAgICAgICAiIiIKICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiAqIG9wZXJhdG9yLCBhbGxvd3MgdXNlIG9mIEN7ZXhwciAqIDN9IGluIHBsYWNlIG9mCiAgICAgICAgQ3tleHByICsgZXhwciArIGV4cHJ9LiAgRXhwcmVzc2lvbnMgbWF5IGFsc28gbWUgbXVsdGlwbGllZCBieSBhIDItaW50ZWdlcgogICAgICAgIHR1cGxlLCBzaW1pbGFyIHRvIEN7e21pbixtYXh9fSBtdWx0aXBsaWVycyBpbiByZWd1bGFyIGV4cHJlc3Npb25zLiAgVHVwbGVzCiAgICAgICAgbWF5IGFsc28gaW5jbHVkZSBDe05vbmV9IGFzIGluOgogICAgICAgICAtIEN7ZXhwcioobixOb25lKX0gb3IgQ3tleHByKihuLCl9IGlzIGVxdWl2YWxlbnQKICAgICAgICAgICAgICB0byBDe2V4cHIqbiArIEx7WmVyb09yTW9yZX0oZXhwcil9CiAgICAgICAgICAgICAgKHJlYWQgYXMgImF0IGxlYXN0IG4gaW5zdGFuY2VzIG9mIEN7ZXhwcn0iKQogICAgICAgICAtIEN7ZXhwciooTm9uZSxuKX0gaXMgZXF1aXZhbGVudCB0byBDe2V4cHIqKDAsbil9CiAgICAgICAgICAgICAgKHJlYWQgYXMgIjAgdG8gbiBpbnN0YW5jZXMgb2YgQ3tleHByfSIpCiAgICAgICAgIC0gQ3tleHByKihOb25lLE5vbmUpfSBpcyBlcXVpdmFsZW50IHRvIEN7THtaZXJvT3JNb3JlfShleHByKX0KICAgICAgICAgLSBDe2V4cHIqKDEsTm9uZSl9IGlzIGVxdWl2YWxlbnQgdG8gQ3tMe09uZU9yTW9yZX0oZXhwcil9CgogICAgICAgIE5vdGUgdGhhdCBDe2V4cHIqKE5vbmUsbil9IGRvZXMgbm90IHJhaXNlIGFuIGV4Y2VwdGlvbiBpZgogICAgICAgIG1vcmUgdGhhbiBuIGV4cHJzIGV4aXN0IGluIHRoZSBpbnB1dCBzdHJlYW07IHRoYXQgaXMsCiAgICAgICAgQ3tleHByKihOb25lLG4pfSBkb2VzIG5vdCBlbmZvcmNlIGEgbWF4aW11bSBudW1iZXIgb2YgZXhwcgogICAgICAgIG9jY3VycmVuY2VzLiAgSWYgdGhpcyBiZWhhdmlvciBpcyBkZXNpcmVkLCB0aGVuIHdyaXRlCiAgICAgICAgQ3tleHByKihOb25lLG4pICsgfmV4cHJ9CiAgICAgICAgIiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlcixpbnQpOgogICAgICAgICAgICBtaW5FbGVtZW50cywgb3B0RWxlbWVudHMgPSBvdGhlciwwCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKG90aGVyLHR1cGxlKToKICAgICAgICAgICAgb3RoZXIgPSAob3RoZXIgKyAoTm9uZSwgTm9uZSkpWzoyXQogICAgICAgICAgICBpZiBvdGhlclswXSBpcyBOb25lOgogICAgICAgICAgICAgICAgb3RoZXIgPSAoMCwgb3RoZXJbMV0pCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXJbMF0saW50KSBhbmQgb3RoZXJbMV0gaXMgTm9uZToKICAgICAgICAgICAgICAgIGlmIG90aGVyWzBdID09IDA6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFplcm9Pck1vcmUoc2VsZikKICAgICAgICAgICAgICAgIGlmIG90aGVyWzBdID09IDE6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9uZU9yTW9yZShzZWxmKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZipvdGhlclswXSArIFplcm9Pck1vcmUoc2VsZikKICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKG90aGVyWzBdLGludCkgYW5kIGlzaW5zdGFuY2Uob3RoZXJbMV0saW50KToKICAgICAgICAgICAgICAgIG1pbkVsZW1lbnRzLCBvcHRFbGVtZW50cyA9IG90aGVyCiAgICAgICAgICAgICAgICBvcHRFbGVtZW50cyAtPSBtaW5FbGVtZW50cwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJjYW5ub3QgbXVsdGlwbHkgJ1BhcnNlckVsZW1lbnQnIGFuZCAoJyVzJywnJXMnKSBvYmplY3RzIiwgdHlwZShvdGhlclswXSksdHlwZShvdGhlclsxXSkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJjYW5ub3QgbXVsdGlwbHkgJ1BhcnNlckVsZW1lbnQnIGFuZCAnJXMnIG9iamVjdHMiLCB0eXBlKG90aGVyKSkKCiAgICAgICAgaWYgbWluRWxlbWVudHMgPCAwOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJjYW5ub3QgbXVsdGlwbHkgUGFyc2VyRWxlbWVudCBieSBuZWdhdGl2ZSB2YWx1ZSIpCiAgICAgICAgaWYgb3B0RWxlbWVudHMgPCAwOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJzZWNvbmQgdHVwbGUgdmFsdWUgbXVzdCBiZSBncmVhdGVyIG9yIGVxdWFsIHRvIGZpcnN0IHR1cGxlIHZhbHVlIikKICAgICAgICBpZiBtaW5FbGVtZW50cyA9PSBvcHRFbGVtZW50cyA9PSAwOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJjYW5ub3QgbXVsdGlwbHkgUGFyc2VyRWxlbWVudCBieSAwIG9yICgwLDApIikKCiAgICAgICAgaWYgKG9wdEVsZW1lbnRzKToKICAgICAgICAgICAgZGVmIG1ha2VPcHRpb25hbExpc3Qobik6CiAgICAgICAgICAgICAgICBpZiBuPjE6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsKHNlbGYgKyBtYWtlT3B0aW9uYWxMaXN0KG4tMSkpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBPcHRpb25hbChzZWxmKQogICAgICAgICAgICBpZiBtaW5FbGVtZW50czoKICAgICAgICAgICAgICAgIGlmIG1pbkVsZW1lbnRzID09IDE6CiAgICAgICAgICAgICAgICAgICAgcmV0ID0gc2VsZiArIG1ha2VPcHRpb25hbExpc3Qob3B0RWxlbWVudHMpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHJldCA9IEFuZChbc2VsZl0qbWluRWxlbWVudHMpICsgbWFrZU9wdGlvbmFsTGlzdChvcHRFbGVtZW50cykKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldCA9IG1ha2VPcHRpb25hbExpc3Qob3B0RWxlbWVudHMpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgbWluRWxlbWVudHMgPT0gMToKICAgICAgICAgICAgICAgIHJldCA9IHNlbGYKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldCA9IEFuZChbc2VsZl0qbWluRWxlbWVudHMpCiAgICAgICAgcmV0dXJuIHJldAoKICAgIGRlZiBfX3JtdWxfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuX19tdWxfXyhvdGhlcikKCiAgICBkZWYgX19vcl9fKHNlbGYsIG90aGVyICk6CiAgICAgICAgIiIiCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgfCBvcGVyYXRvciAtIHJldHVybnMgQ3tMe01hdGNoRmlyc3R9fQogICAgICAgICIiIgogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6CiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoIG90aGVyLCBQYXJzZXJFbGVtZW50ICk6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHJldHVybiBNYXRjaEZpcnN0KCBbIHNlbGYsIG90aGVyIF0gKQoKICAgIGRlZiBfX3Jvcl9fKHNlbGYsIG90aGVyICk6CiAgICAgICAgIiIiCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgfCBvcGVyYXRvciB3aGVuIGxlZnQgb3BlcmFuZCBpcyBub3QgYSBDe0x7UGFyc2VyRWxlbWVudH19CiAgICAgICAgIiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToKICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToKICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwKICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpCiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcmV0dXJuIG90aGVyIHwgc2VsZgoKICAgIGRlZiBfX3hvcl9fKHNlbGYsIG90aGVyICk6CiAgICAgICAgIiIiCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgXiBvcGVyYXRvciAtIHJldHVybnMgQ3tMe09yfX0KICAgICAgICAiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOgogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLAogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICByZXR1cm4gT3IoIFsgc2VsZiwgb3RoZXIgXSApCgogICAgZGVmIF9fcnhvcl9fKHNlbGYsIG90aGVyICk6CiAgICAgICAgIiIiCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgXiBvcGVyYXRvciB3aGVuIGxlZnQgb3BlcmFuZCBpcyBub3QgYSBDe0x7UGFyc2VyRWxlbWVudH19CiAgICAgICAgIiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToKICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToKICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwKICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpCiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcmV0dXJuIG90aGVyIF4gc2VsZgoKICAgIGRlZiBfX2FuZF9fKHNlbGYsIG90aGVyICk6CiAgICAgICAgIiIiCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgJiBvcGVyYXRvciAtIHJldHVybnMgQ3tMe0VhY2h9fQogICAgICAgICIiIgogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6CiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoIG90aGVyLCBQYXJzZXJFbGVtZW50ICk6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHJldHVybiBFYWNoKCBbIHNlbGYsIG90aGVyIF0gKQoKICAgIGRlZiBfX3JhbmRfXyhzZWxmLCBvdGhlciApOgogICAgICAgICIiIgogICAgICAgIEltcGxlbWVudGF0aW9uIG9mICYgb3BlcmF0b3Igd2hlbiBsZWZ0IG9wZXJhbmQgaXMgbm90IGEgQ3tMe1BhcnNlckVsZW1lbnR9fQogICAgICAgICIiIgogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6CiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoIG90aGVyLCBQYXJzZXJFbGVtZW50ICk6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHJldHVybiBvdGhlciAmIHNlbGYKCiAgICBkZWYgX19pbnZlcnRfXyggc2VsZiApOgogICAgICAgICIiIgogICAgICAgIEltcGxlbWVudGF0aW9uIG9mIH4gb3BlcmF0b3IgLSByZXR1cm5zIEN7THtOb3RBbnl9fQogICAgICAgICIiIgogICAgICAgIHJldHVybiBOb3RBbnkoIHNlbGYgKQoKICAgIGRlZiBfX2NhbGxfXyhzZWxmLCBuYW1lPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIFNob3J0Y3V0IGZvciBDe0x7c2V0UmVzdWx0c05hbWV9fSwgd2l0aCBDe2xpc3RBbGxNYXRjaGVzPUZhbHNlfS4KICAgICAgICAKICAgICAgICBJZiBDe25hbWV9IGlzIGdpdmVuIHdpdGggYSB0cmFpbGluZyBDeycqJ30gY2hhcmFjdGVyLCB0aGVuIEN7bGlzdEFsbE1hdGNoZXN9IHdpbGwgYmUKICAgICAgICBwYXNzZWQgYXMgQ3tUcnVlfS4KICAgICAgICAgICAKICAgICAgICBJZiBDe25hbWV9IGlzIG9taXR0ZWQsIHNhbWUgYXMgY2FsbGluZyBDe0x7Y29weX19LgoKICAgICAgICBFeGFtcGxlOjoKICAgICAgICAgICAgIyB0aGVzZSBhcmUgZXF1aXZhbGVudAogICAgICAgICAgICB1c2VyZGF0YSA9IFdvcmQoYWxwaGFzKS5zZXRSZXN1bHRzTmFtZSgibmFtZSIpICsgV29yZChudW1zKyItIikuc2V0UmVzdWx0c05hbWUoInNvY3NlY25vIikKICAgICAgICAgICAgdXNlcmRhdGEgPSBXb3JkKGFscGhhcykoIm5hbWUiKSArIFdvcmQobnVtcysiLSIpKCJzb2NzZWNubyIpICAgICAgICAgICAgIAogICAgICAgICIiIgogICAgICAgIGlmIG5hbWUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnNldFJlc3VsdHNOYW1lKG5hbWUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29weSgpCgogICAgZGVmIHN1cHByZXNzKCBzZWxmICk6CiAgICAgICAgIiIiCiAgICAgICAgU3VwcHJlc3NlcyB0aGUgb3V0cHV0IG9mIHRoaXMgQ3tQYXJzZXJFbGVtZW50fTsgdXNlZnVsIHRvIGtlZXAgcHVuY3R1YXRpb24gZnJvbQogICAgICAgIGNsdXR0ZXJpbmcgdXAgcmV0dXJuZWQgb3V0cHV0LgogICAgICAgICIiIgogICAgICAgIHJldHVybiBTdXBwcmVzcyggc2VsZiApCgogICAgZGVmIGxlYXZlV2hpdGVzcGFjZSggc2VsZiApOgogICAgICAgICIiIgogICAgICAgIERpc2FibGVzIHRoZSBza2lwcGluZyBvZiB3aGl0ZXNwYWNlIGJlZm9yZSBtYXRjaGluZyB0aGUgY2hhcmFjdGVycyBpbiB0aGUKICAgICAgICBDe1BhcnNlckVsZW1lbnR9J3MgZGVmaW5lZCBwYXR0ZXJuLiAgVGhpcyBpcyBub3JtYWxseSBvbmx5IHVzZWQgaW50ZXJuYWxseSBieQogICAgICAgIHRoZSBweXBhcnNpbmcgbW9kdWxlLCBidXQgbWF5IGJlIG5lZWRlZCBpbiBzb21lIHdoaXRlc3BhY2Utc2Vuc2l0aXZlIGdyYW1tYXJzLgogICAgICAgICIiIgogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBGYWxzZQogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIHNldFdoaXRlc3BhY2VDaGFycyggc2VsZiwgY2hhcnMgKToKICAgICAgICAiIiIKICAgICAgICBPdmVycmlkZXMgdGhlIGRlZmF1bHQgd2hpdGVzcGFjZSBjaGFycwogICAgICAgICIiIgogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBUcnVlCiAgICAgICAgc2VsZi53aGl0ZUNoYXJzID0gY2hhcnMKICAgICAgICBzZWxmLmNvcHlEZWZhdWx0V2hpdGVDaGFycyA9IEZhbHNlCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgcGFyc2VXaXRoVGFicyggc2VsZiApOgogICAgICAgICIiIgogICAgICAgIE92ZXJyaWRlcyBkZWZhdWx0IGJlaGF2aW9yIHRvIGV4cGFuZCBDezxUQUI+fXMgdG8gc3BhY2VzIGJlZm9yZSBwYXJzaW5nIHRoZSBpbnB1dCBzdHJpbmcuCiAgICAgICAgTXVzdCBiZSBjYWxsZWQgYmVmb3JlIEN7cGFyc2VTdHJpbmd9IHdoZW4gdGhlIGlucHV0IGdyYW1tYXIgY29udGFpbnMgZWxlbWVudHMgdGhhdAogICAgICAgIG1hdGNoIEN7PFRBQj59IGNoYXJhY3RlcnMuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5rZWVwVGFicyA9IFRydWUKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBpZ25vcmUoIHNlbGYsIG90aGVyICk6CiAgICAgICAgIiIiCiAgICAgICAgRGVmaW5lIGV4cHJlc3Npb24gdG8gYmUgaWdub3JlZCAoZS5nLiwgY29tbWVudHMpIHdoaWxlIGRvaW5nIHBhdHRlcm4KICAgICAgICBtYXRjaGluZzsgbWF5IGJlIGNhbGxlZCByZXBlYXRlZGx5LCB0byBkZWZpbmUgbXVsdGlwbGUgY29tbWVudCBvciBvdGhlcgogICAgICAgIGlnbm9yYWJsZSBwYXR0ZXJucy4KICAgICAgICAKICAgICAgICBFeGFtcGxlOjoKICAgICAgICAgICAgcGF0dCA9IE9uZU9yTW9yZShXb3JkKGFscGhhcykpCiAgICAgICAgICAgIHBhdHQucGFyc2VTdHJpbmcoJ2FibGFqIC8qIGNvbW1lbnQgKi8gbHNramQnKSAjIC0+IFsnYWJsYWonXQogICAgICAgICAgICAKICAgICAgICAgICAgcGF0dC5pZ25vcmUoY1N0eWxlQ29tbWVudCkKICAgICAgICAgICAgcGF0dC5wYXJzZVN0cmluZygnYWJsYWogLyogY29tbWVudCAqLyBsc2tqZCcpICMgLT4gWydhYmxhaicsICdsc2tqZCddCiAgICAgICAgIiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgYmFzZXN0cmluZyk6CiAgICAgICAgICAgIG90aGVyID0gU3VwcHJlc3Mob3RoZXIpCgogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBTdXBwcmVzcyApOgogICAgICAgICAgICBpZiBvdGhlciBub3QgaW4gc2VsZi5pZ25vcmVFeHByczoKICAgICAgICAgICAgICAgIHNlbGYuaWdub3JlRXhwcnMuYXBwZW5kKG90aGVyKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuaWdub3JlRXhwcnMuYXBwZW5kKCBTdXBwcmVzcyggb3RoZXIuY29weSgpICkgKQogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIHNldERlYnVnQWN0aW9ucyggc2VsZiwgc3RhcnRBY3Rpb24sIHN1Y2Nlc3NBY3Rpb24sIGV4Y2VwdGlvbkFjdGlvbiApOgogICAgICAgICIiIgogICAgICAgIEVuYWJsZSBkaXNwbGF5IG9mIGRlYnVnZ2luZyBtZXNzYWdlcyB3aGlsZSBkb2luZyBwYXR0ZXJuIG1hdGNoaW5nLgogICAgICAgICIiIgogICAgICAgIHNlbGYuZGVidWdBY3Rpb25zID0gKHN0YXJ0QWN0aW9uIG9yIF9kZWZhdWx0U3RhcnREZWJ1Z0FjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzQWN0aW9uIG9yIF9kZWZhdWx0U3VjY2Vzc0RlYnVnQWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbkFjdGlvbiBvciBfZGVmYXVsdEV4Y2VwdGlvbkRlYnVnQWN0aW9uKQogICAgICAgIHNlbGYuZGVidWcgPSBUcnVlCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgc2V0RGVidWcoIHNlbGYsIGZsYWc9VHJ1ZSApOgogICAgICAgICIiIgogICAgICAgIEVuYWJsZSBkaXNwbGF5IG9mIGRlYnVnZ2luZyBtZXNzYWdlcyB3aGlsZSBkb2luZyBwYXR0ZXJuIG1hdGNoaW5nLgogICAgICAgIFNldCBDe2ZsYWd9IHRvIFRydWUgdG8gZW5hYmxlLCBGYWxzZSB0byBkaXNhYmxlLgoKICAgICAgICBFeGFtcGxlOjoKICAgICAgICAgICAgd2QgPSBXb3JkKGFscGhhcykuc2V0TmFtZSgiYWxwaGF3b3JkIikKICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykuc2V0TmFtZSgibnVtd29yZCIpCiAgICAgICAgICAgIHRlcm0gPSB3ZCB8IGludGVnZXIKICAgICAgICAgICAgCiAgICAgICAgICAgICMgdHVybiBvbiBkZWJ1Z2dpbmcgZm9yIHdkCiAgICAgICAgICAgIHdkLnNldERlYnVnKCkKCiAgICAgICAgICAgIE9uZU9yTW9yZSh0ZXJtKS5wYXJzZVN0cmluZygiYWJjIDEyMyB4eXogODkwIikKICAgICAgICAKICAgICAgICBwcmludHM6OgogICAgICAgICAgICBNYXRjaCBhbHBoYXdvcmQgYXQgbG9jIDAoMSwxKQogICAgICAgICAgICBNYXRjaGVkIGFscGhhd29yZCAtPiBbJ2FiYyddCiAgICAgICAgICAgIE1hdGNoIGFscGhhd29yZCBhdCBsb2MgMygxLDQpCiAgICAgICAgICAgIEV4Y2VwdGlvbiByYWlzZWQ6RXhwZWN0ZWQgYWxwaGF3b3JkIChhdCBjaGFyIDQpLCAobGluZToxLCBjb2w6NSkKICAgICAgICAgICAgTWF0Y2ggYWxwaGF3b3JkIGF0IGxvYyA3KDEsOCkKICAgICAgICAgICAgTWF0Y2hlZCBhbHBoYXdvcmQgLT4gWyd4eXonXQogICAgICAgICAgICBNYXRjaCBhbHBoYXdvcmQgYXQgbG9jIDExKDEsMTIpCiAgICAgICAgICAgIEV4Y2VwdGlvbiByYWlzZWQ6RXhwZWN0ZWQgYWxwaGF3b3JkIChhdCBjaGFyIDEyKSwgKGxpbmU6MSwgY29sOjEzKQogICAgICAgICAgICBNYXRjaCBhbHBoYXdvcmQgYXQgbG9jIDE1KDEsMTYpCiAgICAgICAgICAgIEV4Y2VwdGlvbiByYWlzZWQ6RXhwZWN0ZWQgYWxwaGF3b3JkIChhdCBjaGFyIDE1KSwgKGxpbmU6MSwgY29sOjE2KQoKICAgICAgICBUaGUgb3V0cHV0IHNob3duIGlzIHRoYXQgcHJvZHVjZWQgYnkgdGhlIGRlZmF1bHQgZGVidWcgYWN0aW9ucyAtIGN1c3RvbSBkZWJ1ZyBhY3Rpb25zIGNhbiBiZQogICAgICAgIHNwZWNpZmllZCB1c2luZyBMe3NldERlYnVnQWN0aW9uc30uIFByaW9yIHRvIGF0dGVtcHRpbmcKICAgICAgICB0byBtYXRjaCB0aGUgQ3t3ZH0gZXhwcmVzc2lvbiwgdGhlIGRlYnVnZ2luZyBtZXNzYWdlIEN7Ik1hdGNoIDxleHBybmFtZT4gYXQgbG9jIDxuPig8bGluZT4sPGNvbD4pIn0KICAgICAgICBpcyBzaG93bi4gVGhlbiBpZiB0aGUgcGFyc2Ugc3VjY2VlZHMsIGEgQ3siTWF0Y2hlZCJ9IG1lc3NhZ2UgaXMgc2hvd24sIG9yIGFuIEN7IkV4Y2VwdGlvbiByYWlzZWQifQogICAgICAgIG1lc3NhZ2UgaXMgc2hvd24uIEFsc28gbm90ZSB0aGUgdXNlIG9mIEx7c2V0TmFtZX0gdG8gYXNzaWduIGEgaHVtYW4tcmVhZGFibGUgbmFtZSB0byB0aGUgZXhwcmVzc2lvbiwKICAgICAgICB3aGljaCBtYWtlcyBkZWJ1Z2dpbmcgYW5kIGV4Y2VwdGlvbiBtZXNzYWdlcyBlYXNpZXIgdG8gdW5kZXJzdGFuZCAtIGZvciBpbnN0YW5jZSwgdGhlIGRlZmF1bHQKICAgICAgICBuYW1lIGNyZWF0ZWQgZm9yIHRoZSBDe1dvcmR9IGV4cHJlc3Npb24gd2l0aG91dCBjYWxsaW5nIEN7c2V0TmFtZX0gaXMgQ3siVzooQUJDRC4uLikifS4KICAgICAgICAiIiIKICAgICAgICBpZiBmbGFnOgogICAgICAgICAgICBzZWxmLnNldERlYnVnQWN0aW9ucyggX2RlZmF1bHRTdGFydERlYnVnQWN0aW9uLCBfZGVmYXVsdFN1Y2Nlc3NEZWJ1Z0FjdGlvbiwgX2RlZmF1bHRFeGNlcHRpb25EZWJ1Z0FjdGlvbiApCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5kZWJ1ZyA9IEZhbHNlCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgX19zdHJfXyggc2VsZiApOgogICAgICAgIHJldHVybiBzZWxmLm5hbWUKCiAgICBkZWYgX19yZXByX18oIHNlbGYgKToKICAgICAgICByZXR1cm4gX3VzdHIoc2VsZikKCiAgICBkZWYgc3RyZWFtbGluZSggc2VsZiApOgogICAgICAgIHNlbGYuc3RyZWFtbGluZWQgPSBUcnVlCiAgICAgICAgc2VsZi5zdHJSZXByID0gTm9uZQogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIGNoZWNrUmVjdXJzaW9uKCBzZWxmLCBwYXJzZUVsZW1lbnRMaXN0ICk6CiAgICAgICAgcGFzcwoKICAgIGRlZiB2YWxpZGF0ZSggc2VsZiwgdmFsaWRhdGVUcmFjZT1bXSApOgogICAgICAgICIiIgogICAgICAgIENoZWNrIGRlZmluZWQgZXhwcmVzc2lvbnMgZm9yIHZhbGlkIHN0cnVjdHVyZSwgY2hlY2sgZm9yIGluZmluaXRlIHJlY3Vyc2l2ZSBkZWZpbml0aW9ucy4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmNoZWNrUmVjdXJzaW9uKCBbXSApCgogICAgZGVmIHBhcnNlRmlsZSggc2VsZiwgZmlsZV9vcl9maWxlbmFtZSwgcGFyc2VBbGw9RmFsc2UgKToKICAgICAgICAiIiIKICAgICAgICBFeGVjdXRlIHRoZSBwYXJzZSBleHByZXNzaW9uIG9uIHRoZSBnaXZlbiBmaWxlIG9yIGZpbGVuYW1lLgogICAgICAgIElmIGEgZmlsZW5hbWUgaXMgc3BlY2lmaWVkIChpbnN0ZWFkIG9mIGEgZmlsZSBvYmplY3QpLAogICAgICAgIHRoZSBlbnRpcmUgZmlsZSBpcyBvcGVuZWQsIHJlYWQsIGFuZCBjbG9zZWQgYmVmb3JlIHBhcnNpbmcuCiAgICAgICAgIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICBmaWxlX2NvbnRlbnRzID0gZmlsZV9vcl9maWxlbmFtZS5yZWFkKCkKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIHdpdGggb3BlbihmaWxlX29yX2ZpbGVuYW1lLCAiciIpIGFzIGY6CiAgICAgICAgICAgICAgICBmaWxlX2NvbnRlbnRzID0gZi5yZWFkKCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlU3RyaW5nKGZpbGVfY29udGVudHMsIHBhcnNlQWxsKQogICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgZXhjOgogICAgICAgICAgICBpZiBQYXJzZXJFbGVtZW50LnZlcmJvc2Vfc3RhY2t0cmFjZToKICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIGNhdGNoIGFuZCByZS1yYWlzZSBleGNlcHRpb24gZnJvbSBoZXJlLCBjbGVhcnMgb3V0IHB5cGFyc2luZyBpbnRlcm5hbCBzdGFjayB0cmFjZQogICAgICAgICAgICAgICAgcmFpc2UgZXhjCgogICAgZGVmIF9fZXFfXyhzZWxmLG90aGVyKToKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBQYXJzZXJFbGVtZW50KToKICAgICAgICAgICAgcmV0dXJuIHNlbGYgaXMgb3RoZXIgb3IgdmFycyhzZWxmKSA9PSB2YXJzKG90aGVyKQogICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdGhlciwgYmFzZXN0cmluZyk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLm1hdGNoZXMob3RoZXIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHN1cGVyKFBhcnNlckVsZW1lbnQsc2VsZik9PW90aGVyCgogICAgZGVmIF9fbmVfXyhzZWxmLG90aGVyKToKICAgICAgICByZXR1cm4gbm90IChzZWxmID09IG90aGVyKQoKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gaGFzaChpZChzZWxmKSkKCiAgICBkZWYgX19yZXFfXyhzZWxmLG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZiA9PSBvdGhlcgoKICAgIGRlZiBfX3JuZV9fKHNlbGYsb3RoZXIpOgogICAgICAgIHJldHVybiBub3QgKHNlbGYgPT0gb3RoZXIpCgogICAgZGVmIG1hdGNoZXMoc2VsZiwgdGVzdFN0cmluZywgcGFyc2VBbGw9VHJ1ZSk6CiAgICAgICAgIiIiCiAgICAgICAgTWV0aG9kIGZvciBxdWljayB0ZXN0aW5nIG9mIGEgcGFyc2VyIGFnYWluc3QgYSB0ZXN0IHN0cmluZy4gR29vZCBmb3Igc2ltcGxlIAogICAgICAgIGlubGluZSBtaWNyb3Rlc3RzIG9mIHN1YiBleHByZXNzaW9ucyB3aGlsZSBidWlsZGluZyB1cCBsYXJnZXIgcGFyc2VyLgogICAgICAgICAgIAogICAgICAgIFBhcmFtZXRlcnM6CiAgICAgICAgIC0gdGVzdFN0cmluZyAtIHRvIHRlc3QgYWdhaW5zdCB0aGlzIGV4cHJlc3Npb24gZm9yIGEgbWF0Y2gKICAgICAgICAgLSBwYXJzZUFsbCAtIChkZWZhdWx0PUN7VHJ1ZX0pIC0gZmxhZyB0byBwYXNzIHRvIEN7THtwYXJzZVN0cmluZ319IHdoZW4gcnVubmluZyB0ZXN0cwogICAgICAgICAgICAKICAgICAgICBFeGFtcGxlOjoKICAgICAgICAgICAgZXhwciA9IFdvcmQobnVtcykKICAgICAgICAgICAgYXNzZXJ0IGV4cHIubWF0Y2hlcygiMTAwIikKICAgICAgICAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYucGFyc2VTdHJpbmcoX3VzdHIodGVzdFN0cmluZyksIHBhcnNlQWxsPXBhcnNlQWxsKQogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb246CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICAgICAgICAgCiAgICBkZWYgcnVuVGVzdHMoc2VsZiwgdGVzdHMsIHBhcnNlQWxsPVRydWUsIGNvbW1lbnQ9JyMnLCBmdWxsRHVtcD1UcnVlLCBwcmludFJlc3VsdHM9VHJ1ZSwgZmFpbHVyZVRlc3RzPUZhbHNlKToKICAgICAgICAiIiIKICAgICAgICBFeGVjdXRlIHRoZSBwYXJzZSBleHByZXNzaW9uIG9uIGEgc2VyaWVzIG9mIHRlc3Qgc3RyaW5ncywgc2hvd2luZyBlYWNoCiAgICAgICAgdGVzdCwgdGhlIHBhcnNlZCByZXN1bHRzIG9yIHdoZXJlIHRoZSBwYXJzZSBmYWlsZWQuIFF1aWNrIGFuZCBlYXN5IHdheSB0bwogICAgICAgIHJ1biBhIHBhcnNlIGV4cHJlc3Npb24gYWdhaW5zdCBhIGxpc3Qgb2Ygc2FtcGxlIHN0cmluZ3MuCiAgICAgICAgICAgCiAgICAgICAgUGFyYW1ldGVyczoKICAgICAgICAgLSB0ZXN0cyAtIGEgbGlzdCBvZiBzZXBhcmF0ZSB0ZXN0IHN0cmluZ3MsIG9yIGEgbXVsdGlsaW5lIHN0cmluZyBvZiB0ZXN0IHN0cmluZ3MKICAgICAgICAgLSBwYXJzZUFsbCAtIChkZWZhdWx0PUN7VHJ1ZX0pIC0gZmxhZyB0byBwYXNzIHRvIEN7THtwYXJzZVN0cmluZ319IHdoZW4gcnVubmluZyB0ZXN0cyAgICAgICAgICAgCiAgICAgICAgIC0gY29tbWVudCAtIChkZWZhdWx0PUN7JyMnfSkgLSBleHByZXNzaW9uIGZvciBpbmRpY2F0aW5nIGVtYmVkZGVkIGNvbW1lbnRzIGluIHRoZSB0ZXN0IAogICAgICAgICAgICAgIHN0cmluZzsgcGFzcyBOb25lIHRvIGRpc2FibGUgY29tbWVudCBmaWx0ZXJpbmcKICAgICAgICAgLSBmdWxsRHVtcCAtIChkZWZhdWx0PUN7VHJ1ZX0pIC0gZHVtcCByZXN1bHRzIGFzIGxpc3QgZm9sbG93ZWQgYnkgcmVzdWx0cyBuYW1lcyBpbiBuZXN0ZWQgb3V0bGluZTsKICAgICAgICAgICAgICBpZiBGYWxzZSwgb25seSBkdW1wIG5lc3RlZCBsaXN0CiAgICAgICAgIC0gcHJpbnRSZXN1bHRzIC0gKGRlZmF1bHQ9Q3tUcnVlfSkgcHJpbnRzIHRlc3Qgb3V0cHV0IHRvIHN0ZG91dAogICAgICAgICAtIGZhaWx1cmVUZXN0cyAtIChkZWZhdWx0PUN7RmFsc2V9KSBpbmRpY2F0ZXMgaWYgdGhlc2UgdGVzdHMgYXJlIGV4cGVjdGVkIHRvIGZhaWwgcGFyc2luZwoKICAgICAgICBSZXR1cm5zOiBhIChzdWNjZXNzLCByZXN1bHRzKSB0dXBsZSwgd2hlcmUgc3VjY2VzcyBpbmRpY2F0ZXMgdGhhdCBhbGwgdGVzdHMgc3VjY2VlZGVkCiAgICAgICAgKG9yIGZhaWxlZCBpZiBDe2ZhaWx1cmVUZXN0c30gaXMgVHJ1ZSksIGFuZCB0aGUgcmVzdWx0cyBjb250YWluIGEgbGlzdCBvZiBsaW5lcyBvZiBlYWNoIAogICAgICAgIHRlc3QncyBvdXRwdXQKICAgICAgICAKICAgICAgICBFeGFtcGxlOjoKICAgICAgICAgICAgbnVtYmVyX2V4cHIgPSBweXBhcnNpbmdfY29tbW9uLm51bWJlci5jb3B5KCkKCiAgICAgICAgICAgIHJlc3VsdCA9IG51bWJlcl9leHByLnJ1blRlc3RzKCcnJwogICAgICAgICAgICAgICAgIyB1bnNpZ25lZCBpbnRlZ2VyCiAgICAgICAgICAgICAgICAxMDAKICAgICAgICAgICAgICAgICMgbmVnYXRpdmUgaW50ZWdlcgogICAgICAgICAgICAgICAgLTEwMAogICAgICAgICAgICAgICAgIyBmbG9hdCB3aXRoIHNjaWVudGlmaWMgbm90YXRpb24KICAgICAgICAgICAgICAgIDYuMDJlMjMKICAgICAgICAgICAgICAgICMgaW50ZWdlciB3aXRoIHNjaWVudGlmaWMgbm90YXRpb24KICAgICAgICAgICAgICAgIDFlLTEyCiAgICAgICAgICAgICAgICAnJycpCiAgICAgICAgICAgIHByaW50KCJTdWNjZXNzIiBpZiByZXN1bHRbMF0gZWxzZSAiRmFpbGVkISIpCgogICAgICAgICAgICByZXN1bHQgPSBudW1iZXJfZXhwci5ydW5UZXN0cygnJycKICAgICAgICAgICAgICAgICMgc3RyYXkgY2hhcmFjdGVyCiAgICAgICAgICAgICAgICAxMDBaCiAgICAgICAgICAgICAgICAjIG1pc3NpbmcgbGVhZGluZyBkaWdpdCBiZWZvcmUgJy4nCiAgICAgICAgICAgICAgICAtLjEwMAogICAgICAgICAgICAgICAgIyB0b28gbWFueSAnLicKICAgICAgICAgICAgICAgIDMuMTQuMTU5CiAgICAgICAgICAgICAgICAnJycsIGZhaWx1cmVUZXN0cz1UcnVlKQogICAgICAgICAgICBwcmludCgiU3VjY2VzcyIgaWYgcmVzdWx0WzBdIGVsc2UgIkZhaWxlZCEiKQogICAgICAgIHByaW50czo6CiAgICAgICAgICAgICMgdW5zaWduZWQgaW50ZWdlcgogICAgICAgICAgICAxMDAKICAgICAgICAgICAgWzEwMF0KCiAgICAgICAgICAgICMgbmVnYXRpdmUgaW50ZWdlcgogICAgICAgICAgICAtMTAwCiAgICAgICAgICAgIFstMTAwXQoKICAgICAgICAgICAgIyBmbG9hdCB3aXRoIHNjaWVudGlmaWMgbm90YXRpb24KICAgICAgICAgICAgNi4wMmUyMwogICAgICAgICAgICBbNi4wMmUrMjNdCgogICAgICAgICAgICAjIGludGVnZXIgd2l0aCBzY2llbnRpZmljIG5vdGF0aW9uCiAgICAgICAgICAgIDFlLTEyCiAgICAgICAgICAgIFsxZS0xMl0KCiAgICAgICAgICAgIFN1Y2Nlc3MKICAgICAgICAgICAgCiAgICAgICAgICAgICMgc3RyYXkgY2hhcmFjdGVyCiAgICAgICAgICAgIDEwMFoKICAgICAgICAgICAgICAgXgogICAgICAgICAgICBGQUlMOiBFeHBlY3RlZCBlbmQgb2YgdGV4dCAoYXQgY2hhciAzKSwgKGxpbmU6MSwgY29sOjQpCgogICAgICAgICAgICAjIG1pc3NpbmcgbGVhZGluZyBkaWdpdCBiZWZvcmUgJy4nCiAgICAgICAgICAgIC0uMTAwCiAgICAgICAgICAgIF4KICAgICAgICAgICAgRkFJTDogRXhwZWN0ZWQge3JlYWwgbnVtYmVyIHdpdGggc2NpZW50aWZpYyBub3RhdGlvbiB8IHJlYWwgbnVtYmVyIHwgc2lnbmVkIGludGVnZXJ9IChhdCBjaGFyIDApLCAobGluZToxLCBjb2w6MSkKCiAgICAgICAgICAgICMgdG9vIG1hbnkgJy4nCiAgICAgICAgICAgIDMuMTQuMTU5CiAgICAgICAgICAgICAgICBeCiAgICAgICAgICAgIEZBSUw6IEV4cGVjdGVkIGVuZCBvZiB0ZXh0IChhdCBjaGFyIDQpLCAobGluZToxLCBjb2w6NSkKCiAgICAgICAgICAgIFN1Y2Nlc3MKCiAgICAgICAgRWFjaCB0ZXN0IHN0cmluZyBtdXN0IGJlIG9uIGEgc2luZ2xlIGxpbmUuIElmIHlvdSB3YW50IHRvIHRlc3QgYSBzdHJpbmcgdGhhdCBzcGFucyBtdWx0aXBsZQogICAgICAgIGxpbmVzLCBjcmVhdGUgYSB0ZXN0IGxpa2UgdGhpczo6CgogICAgICAgICAgICBleHByLnJ1blRlc3QociJ0aGlzIGlzIGEgdGVzdFxcbiBvZiBzdHJpbmdzIHRoYXQgc3BhbnMgXFxuIDMgbGluZXMiKQogICAgICAgIAogICAgICAgIChOb3RlIHRoYXQgdGhpcyBpcyBhIHJhdyBzdHJpbmcgbGl0ZXJhbCwgeW91IG11c3QgaW5jbHVkZSB0aGUgbGVhZGluZyAncicuKQogICAgICAgICIiIgogICAgICAgIGlmIGlzaW5zdGFuY2UodGVzdHMsIGJhc2VzdHJpbmcpOgogICAgICAgICAgICB0ZXN0cyA9IGxpc3QobWFwKHN0ci5zdHJpcCwgdGVzdHMucnN0cmlwKCkuc3BsaXRsaW5lcygpKSkKICAgICAgICBpZiBpc2luc3RhbmNlKGNvbW1lbnQsIGJhc2VzdHJpbmcpOgogICAgICAgICAgICBjb21tZW50ID0gTGl0ZXJhbChjb21tZW50KQogICAgICAgIGFsbFJlc3VsdHMgPSBbXQogICAgICAgIGNvbW1lbnRzID0gW10KICAgICAgICBzdWNjZXNzID0gVHJ1ZQogICAgICAgIGZvciB0IGluIHRlc3RzOgogICAgICAgICAgICBpZiBjb21tZW50IGlzIG5vdCBOb25lIGFuZCBjb21tZW50Lm1hdGNoZXModCwgRmFsc2UpIG9yIGNvbW1lbnRzIGFuZCBub3QgdDoKICAgICAgICAgICAgICAgIGNvbW1lbnRzLmFwcGVuZCh0KQogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgbm90IHQ6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBvdXQgPSBbJ1xuJy5qb2luKGNvbW1lbnRzKSwgdF0KICAgICAgICAgICAgY29tbWVudHMgPSBbXQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICB0ID0gdC5yZXBsYWNlKHInXG4nLCdcbicpCiAgICAgICAgICAgICAgICByZXN1bHQgPSBzZWxmLnBhcnNlU3RyaW5nKHQsIHBhcnNlQWxsPXBhcnNlQWxsKQogICAgICAgICAgICAgICAgb3V0LmFwcGVuZChyZXN1bHQuZHVtcChmdWxsPWZ1bGxEdW1wKSkKICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBzdWNjZXNzIGFuZCBub3QgZmFpbHVyZVRlc3RzCiAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgcGU6CiAgICAgICAgICAgICAgICBmYXRhbCA9ICIoRkFUQUwpIiBpZiBpc2luc3RhbmNlKHBlLCBQYXJzZUZhdGFsRXhjZXB0aW9uKSBlbHNlICIiCiAgICAgICAgICAgICAgICBpZiAnXG4nIGluIHQ6CiAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZChsaW5lKHBlLmxvYywgdCkpCiAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgnICcqKGNvbChwZS5sb2MsdCktMSkgKyAnXicgKyBmYXRhbCkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgnICcqcGUubG9jICsgJ14nICsgZmF0YWwpCiAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCJGQUlMOiAiICsgc3RyKHBlKSkKICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBzdWNjZXNzIGFuZCBmYWlsdXJlVGVzdHMKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHBlCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXhjOgogICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgiRkFJTC1FWENFUFRJT046ICIgKyBzdHIoZXhjKSkKICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBzdWNjZXNzIGFuZCBmYWlsdXJlVGVzdHMKICAgICAgICAgICAgICAgIHJlc3VsdCA9IGV4YwoKICAgICAgICAgICAgaWYgcHJpbnRSZXN1bHRzOgogICAgICAgICAgICAgICAgaWYgZnVsbER1bXA6CiAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgnJykKICAgICAgICAgICAgICAgIHByaW50KCdcbicuam9pbihvdXQpKQoKICAgICAgICAgICAgYWxsUmVzdWx0cy5hcHBlbmQoKHQsIHJlc3VsdCkpCiAgICAgICAgCiAgICAgICAgcmV0dXJuIHN1Y2Nlc3MsIGFsbFJlc3VsdHMKCiAgICAgICAgCmNsYXNzIFRva2VuKFBhcnNlckVsZW1lbnQpOgogICAgIiIiCiAgICBBYnN0cmFjdCBDe1BhcnNlckVsZW1lbnR9IHN1YmNsYXNzLCBmb3IgZGVmaW5pbmcgYXRvbWljIG1hdGNoaW5nIHBhdHRlcm5zLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oIHNlbGYgKToKICAgICAgICBzdXBlcihUb2tlbixzZWxmKS5fX2luaXRfXyggc2F2ZWxpc3Q9RmFsc2UgKQoKCmNsYXNzIEVtcHR5KFRva2VuKToKICAgICIiIgogICAgQW4gZW1wdHkgdG9rZW4sIHdpbGwgYWx3YXlzIG1hdGNoLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oIHNlbGYgKToKICAgICAgICBzdXBlcihFbXB0eSxzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5uYW1lID0gIkVtcHR5IgogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UKCgpjbGFzcyBOb01hdGNoKFRva2VuKToKICAgICIiIgogICAgQSB0b2tlbiB0aGF0IHdpbGwgbmV2ZXIgbWF0Y2guCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyggc2VsZiApOgogICAgICAgIHN1cGVyKE5vTWF0Y2gsc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYubmFtZSA9ICJOb01hdGNoIgogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UKICAgICAgICBzZWxmLmVycm1zZyA9ICJVbm1hdGNoYWJsZSB0b2tlbiIKCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOgogICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQoKCmNsYXNzIExpdGVyYWwoVG9rZW4pOgogICAgIiIiCiAgICBUb2tlbiB0byBleGFjdGx5IG1hdGNoIGEgc3BlY2lmaWVkIHN0cmluZy4KICAgIAogICAgRXhhbXBsZTo6CiAgICAgICAgTGl0ZXJhbCgnYmxhaCcpLnBhcnNlU3RyaW5nKCdibGFoJykgICMgLT4gWydibGFoJ10KICAgICAgICBMaXRlcmFsKCdibGFoJykucGFyc2VTdHJpbmcoJ2JsYWhmb29ibGFoJykgICMgLT4gWydibGFoJ10KICAgICAgICBMaXRlcmFsKCdibGFoJykucGFyc2VTdHJpbmcoJ2JsYScpICAjIC0+IEV4Y2VwdGlvbjogRXhwZWN0ZWQgImJsYWgiCiAgICAKICAgIEZvciBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoaW5nLCB1c2UgTHtDYXNlbGVzc0xpdGVyYWx9LgogICAgCiAgICBGb3Iga2V5d29yZCBtYXRjaGluZyAoZm9yY2Ugd29yZCBicmVhayBiZWZvcmUgYW5kIGFmdGVyIHRoZSBtYXRjaGVkIHN0cmluZyksCiAgICB1c2UgTHtLZXl3b3JkfSBvciBMe0Nhc2VsZXNzS2V5d29yZH0uCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyggc2VsZiwgbWF0Y2hTdHJpbmcgKToKICAgICAgICBzdXBlcihMaXRlcmFsLHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLm1hdGNoID0gbWF0Y2hTdHJpbmcKICAgICAgICBzZWxmLm1hdGNoTGVuID0gbGVuKG1hdGNoU3RyaW5nKQogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5maXJzdE1hdGNoQ2hhciA9IG1hdGNoU3RyaW5nWzBdCiAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIm51bGwgc3RyaW5nIHBhc3NlZCB0byBMaXRlcmFsOyB1c2UgRW1wdHkoKSBpbnN0ZWFkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikKICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18gPSBFbXB0eQogICAgICAgIHNlbGYubmFtZSA9ICciJXMiJyAlIF91c3RyKHNlbGYubWF0Y2gpCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIHNlbGYubmFtZQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBGYWxzZQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlCgogICAgIyBQZXJmb3JtYW5jZSB0dW5pbmc6IHRoaXMgcm91dGluZSBnZXRzIGNhbGxlZCBhICpsb3QqCiAgICAjIGlmIHRoaXMgaXMgYSBzaW5nbGUgY2hhcmFjdGVyIG1hdGNoIHN0cmluZyAgYW5kIHRoZSBmaXJzdCBjaGFyYWN0ZXIgbWF0Y2hlcywKICAgICMgc2hvcnQtY2lyY3VpdCBhcyBxdWlja2x5IGFzIHBvc3NpYmxlLCBhbmQgYXZvaWQgY2FsbGluZyBzdGFydHN3aXRoCiAgICAjfiBAcHJvZmlsZQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToKICAgICAgICBpZiAoaW5zdHJpbmdbbG9jXSA9PSBzZWxmLmZpcnN0TWF0Y2hDaGFyIGFuZAogICAgICAgICAgICAoc2VsZi5tYXRjaExlbj09MSBvciBpbnN0cmluZy5zdGFydHN3aXRoKHNlbGYubWF0Y2gsbG9jKSkgKToKICAgICAgICAgICAgcmV0dXJuIGxvYytzZWxmLm1hdGNoTGVuLCBzZWxmLm1hdGNoCiAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpCl9MID0gTGl0ZXJhbApQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MgPSBMaXRlcmFsCgpjbGFzcyBLZXl3b3JkKFRva2VuKToKICAgICIiIgogICAgVG9rZW4gdG8gZXhhY3RseSBtYXRjaCBhIHNwZWNpZmllZCBzdHJpbmcgYXMgYSBrZXl3b3JkLCB0aGF0IGlzLCBpdCBtdXN0IGJlCiAgICBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIG5vbi1rZXl3b3JkIGNoYXJhY3Rlci4gIENvbXBhcmUgd2l0aCBDe0x7TGl0ZXJhbH19OgogICAgIC0gQ3tMaXRlcmFsKCJpZiIpfSB3aWxsIG1hdGNoIHRoZSBsZWFkaW5nIEN7J2lmJ30gaW4gQ3snaWZBbmRPbmx5SWYnfS4KICAgICAtIEN7S2V5d29yZCgiaWYiKX0gd2lsbCBub3Q7IGl0IHdpbGwgb25seSBtYXRjaCB0aGUgbGVhZGluZyBDeydpZid9IGluIEN7J2lmIHg9MSd9LCBvciBDeydpZih5PT0yKSd9CiAgICBBY2NlcHRzIHR3byBvcHRpb25hbCBjb25zdHJ1Y3RvciBhcmd1bWVudHMgaW4gYWRkaXRpb24gdG8gdGhlIGtleXdvcmQgc3RyaW5nOgogICAgIC0gQ3tpZGVudENoYXJzfSBpcyBhIHN0cmluZyBvZiBjaGFyYWN0ZXJzIHRoYXQgd291bGQgYmUgdmFsaWQgaWRlbnRpZmllciBjaGFyYWN0ZXJzLAogICAgICAgICAgZGVmYXVsdGluZyB0byBhbGwgYWxwaGFudW1lcmljcyArICJfIiBhbmQgIiQiCiAgICAgLSBDe2Nhc2VsZXNzfSBhbGxvd3MgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaGluZywgZGVmYXVsdCBpcyBDe0ZhbHNlfS4KICAgICAgIAogICAgRXhhbXBsZTo6CiAgICAgICAgS2V5d29yZCgic3RhcnQiKS5wYXJzZVN0cmluZygic3RhcnQiKSAgIyAtPiBbJ3N0YXJ0J10KICAgICAgICBLZXl3b3JkKCJzdGFydCIpLnBhcnNlU3RyaW5nKCJzdGFydGluZyIpICAjIC0+IEV4Y2VwdGlvbgoKICAgIEZvciBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoaW5nLCB1c2UgTHtDYXNlbGVzc0tleXdvcmR9LgogICAgIiIiCiAgICBERUZBVUxUX0tFWVdPUkRfQ0hBUlMgPSBhbHBoYW51bXMrIl8kIgoKICAgIGRlZiBfX2luaXRfXyggc2VsZiwgbWF0Y2hTdHJpbmcsIGlkZW50Q2hhcnM9Tm9uZSwgY2FzZWxlc3M9RmFsc2UgKToKICAgICAgICBzdXBlcihLZXl3b3JkLHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBpZiBpZGVudENoYXJzIGlzIE5vbmU6CiAgICAgICAgICAgIGlkZW50Q2hhcnMgPSBLZXl3b3JkLkRFRkFVTFRfS0VZV09SRF9DSEFSUwogICAgICAgIHNlbGYubWF0Y2ggPSBtYXRjaFN0cmluZwogICAgICAgIHNlbGYubWF0Y2hMZW4gPSBsZW4obWF0Y2hTdHJpbmcpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLmZpcnN0TWF0Y2hDaGFyID0gbWF0Y2hTdHJpbmdbMF0KICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKICAgICAgICAgICAgd2FybmluZ3Mud2FybigibnVsbCBzdHJpbmcgcGFzc2VkIHRvIEtleXdvcmQ7IHVzZSBFbXB0eSgpIGluc3RlYWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQogICAgICAgIHNlbGYubmFtZSA9ICciJXMiJyAlIHNlbGYubWF0Y2gKICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAiICsgc2VsZi5uYW1lCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IEZhbHNlCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UKICAgICAgICBzZWxmLmNhc2VsZXNzID0gY2FzZWxlc3MKICAgICAgICBpZiBjYXNlbGVzczoKICAgICAgICAgICAgc2VsZi5jYXNlbGVzc21hdGNoID0gbWF0Y2hTdHJpbmcudXBwZXIoKQogICAgICAgICAgICBpZGVudENoYXJzID0gaWRlbnRDaGFycy51cHBlcigpCiAgICAgICAgc2VsZi5pZGVudENoYXJzID0gc2V0KGlkZW50Q2hhcnMpCgogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToKICAgICAgICBpZiBzZWxmLmNhc2VsZXNzOgogICAgICAgICAgICBpZiAoIChpbnN0cmluZ1sgbG9jOmxvYytzZWxmLm1hdGNoTGVuIF0udXBwZXIoKSA9PSBzZWxmLmNhc2VsZXNzbWF0Y2gpIGFuZAogICAgICAgICAgICAgICAgIChsb2MgPj0gbGVuKGluc3RyaW5nKS1zZWxmLm1hdGNoTGVuIG9yIGluc3RyaW5nW2xvYytzZWxmLm1hdGNoTGVuXS51cHBlcigpIG5vdCBpbiBzZWxmLmlkZW50Q2hhcnMpIGFuZAogICAgICAgICAgICAgICAgIChsb2MgPT0gMCBvciBpbnN0cmluZ1tsb2MtMV0udXBwZXIoKSBub3QgaW4gc2VsZi5pZGVudENoYXJzKSApOgogICAgICAgICAgICAgICAgcmV0dXJuIGxvYytzZWxmLm1hdGNoTGVuLCBzZWxmLm1hdGNoCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgKGluc3RyaW5nW2xvY10gPT0gc2VsZi5maXJzdE1hdGNoQ2hhciBhbmQKICAgICAgICAgICAgICAgIChzZWxmLm1hdGNoTGVuPT0xIG9yIGluc3RyaW5nLnN0YXJ0c3dpdGgoc2VsZi5tYXRjaCxsb2MpKSBhbmQKICAgICAgICAgICAgICAgIChsb2MgPj0gbGVuKGluc3RyaW5nKS1zZWxmLm1hdGNoTGVuIG9yIGluc3RyaW5nW2xvYytzZWxmLm1hdGNoTGVuXSBub3QgaW4gc2VsZi5pZGVudENoYXJzKSBhbmQKICAgICAgICAgICAgICAgIChsb2MgPT0gMCBvciBpbnN0cmluZ1tsb2MtMV0gbm90IGluIHNlbGYuaWRlbnRDaGFycykgKToKICAgICAgICAgICAgICAgIHJldHVybiBsb2Mrc2VsZi5tYXRjaExlbiwgc2VsZi5tYXRjaAogICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQoKICAgIGRlZiBjb3B5KHNlbGYpOgogICAgICAgIGMgPSBzdXBlcihLZXl3b3JkLHNlbGYpLmNvcHkoKQogICAgICAgIGMuaWRlbnRDaGFycyA9IEtleXdvcmQuREVGQVVMVF9LRVlXT1JEX0NIQVJTCiAgICAgICAgcmV0dXJuIGMKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgc2V0RGVmYXVsdEtleXdvcmRDaGFycyggY2hhcnMgKToKICAgICAgICAiIiJPdmVycmlkZXMgdGhlIGRlZmF1bHQgS2V5d29yZCBjaGFycwogICAgICAgICIiIgogICAgICAgIEtleXdvcmQuREVGQVVMVF9LRVlXT1JEX0NIQVJTID0gY2hhcnMKCmNsYXNzIENhc2VsZXNzTGl0ZXJhbChMaXRlcmFsKToKICAgICIiIgogICAgVG9rZW4gdG8gbWF0Y2ggYSBzcGVjaWZpZWQgc3RyaW5nLCBpZ25vcmluZyBjYXNlIG9mIGxldHRlcnMuCiAgICBOb3RlOiB0aGUgbWF0Y2hlZCByZXN1bHRzIHdpbGwgYWx3YXlzIGJlIGluIHRoZSBjYXNlIG9mIHRoZSBnaXZlbgogICAgbWF0Y2ggc3RyaW5nLCBOT1QgdGhlIGNhc2Ugb2YgdGhlIGlucHV0IHRleHQuCgogICAgRXhhbXBsZTo6CiAgICAgICAgT25lT3JNb3JlKENhc2VsZXNzTGl0ZXJhbCgiQ01EIikpLnBhcnNlU3RyaW5nKCJjbWQgQ01EIENtZDEwIikgIyAtPiBbJ0NNRCcsICdDTUQnLCAnQ01EJ10KICAgICAgICAKICAgIChDb250cmFzdCB3aXRoIGV4YW1wbGUgZm9yIEx7Q2FzZWxlc3NLZXl3b3JkfS4pCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyggc2VsZiwgbWF0Y2hTdHJpbmcgKToKICAgICAgICBzdXBlcihDYXNlbGVzc0xpdGVyYWwsc2VsZikuX19pbml0X18oIG1hdGNoU3RyaW5nLnVwcGVyKCkgKQogICAgICAgICMgUHJlc2VydmUgdGhlIGRlZmluaW5nIGxpdGVyYWwuCiAgICAgICAgc2VsZi5yZXR1cm5TdHJpbmcgPSBtYXRjaFN0cmluZwogICAgICAgIHNlbGYubmFtZSA9ICInJXMnIiAlIHNlbGYucmV0dXJuU3RyaW5nCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIHNlbGYubmFtZQoKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgaWYgaW5zdHJpbmdbIGxvYzpsb2Mrc2VsZi5tYXRjaExlbiBdLnVwcGVyKCkgPT0gc2VsZi5tYXRjaDoKICAgICAgICAgICAgcmV0dXJuIGxvYytzZWxmLm1hdGNoTGVuLCBzZWxmLnJldHVyblN0cmluZwogICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQoKY2xhc3MgQ2FzZWxlc3NLZXl3b3JkKEtleXdvcmQpOgogICAgIiIiCiAgICBDYXNlbGVzcyB2ZXJzaW9uIG9mIEx7S2V5d29yZH0uCgogICAgRXhhbXBsZTo6CiAgICAgICAgT25lT3JNb3JlKENhc2VsZXNzS2V5d29yZCgiQ01EIikpLnBhcnNlU3RyaW5nKCJjbWQgQ01EIENtZDEwIikgIyAtPiBbJ0NNRCcsICdDTUQnXQogICAgICAgIAogICAgKENvbnRyYXN0IHdpdGggZXhhbXBsZSBmb3IgTHtDYXNlbGVzc0xpdGVyYWx9LikKICAgICIiIgogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBtYXRjaFN0cmluZywgaWRlbnRDaGFycz1Ob25lICk6CiAgICAgICAgc3VwZXIoQ2FzZWxlc3NLZXl3b3JkLHNlbGYpLl9faW5pdF9fKCBtYXRjaFN0cmluZywgaWRlbnRDaGFycywgY2FzZWxlc3M9VHJ1ZSApCgogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToKICAgICAgICBpZiAoIChpbnN0cmluZ1sgbG9jOmxvYytzZWxmLm1hdGNoTGVuIF0udXBwZXIoKSA9PSBzZWxmLmNhc2VsZXNzbWF0Y2gpIGFuZAogICAgICAgICAgICAgKGxvYyA+PSBsZW4oaW5zdHJpbmcpLXNlbGYubWF0Y2hMZW4gb3IgaW5zdHJpbmdbbG9jK3NlbGYubWF0Y2hMZW5dLnVwcGVyKCkgbm90IGluIHNlbGYuaWRlbnRDaGFycykgKToKICAgICAgICAgICAgcmV0dXJuIGxvYytzZWxmLm1hdGNoTGVuLCBzZWxmLm1hdGNoCiAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpCgpjbGFzcyBDbG9zZU1hdGNoKFRva2VuKToKICAgICIiIgogICAgQSB2YXJpYXRpb24gb24gTHtMaXRlcmFsfSB3aGljaCBtYXRjaGVzICJjbG9zZSIgbWF0Y2hlcywgdGhhdCBpcywgCiAgICBzdHJpbmdzIHdpdGggYXQgbW9zdCAnbicgbWlzbWF0Y2hpbmcgY2hhcmFjdGVycy4gQ3tDbG9zZU1hdGNofSB0YWtlcyBwYXJhbWV0ZXJzOgogICAgIC0gQ3ttYXRjaF9zdHJpbmd9IC0gc3RyaW5nIHRvIGJlIG1hdGNoZWQKICAgICAtIEN7bWF4TWlzbWF0Y2hlc30gLSAoQ3tkZWZhdWx0PTF9KSBtYXhpbXVtIG51bWJlciBvZiBtaXNtYXRjaGVzIGFsbG93ZWQgdG8gY291bnQgYXMgYSBtYXRjaAogICAgCiAgICBUaGUgcmVzdWx0cyBmcm9tIGEgc3VjY2Vzc2Z1bCBwYXJzZSB3aWxsIGNvbnRhaW4gdGhlIG1hdGNoZWQgdGV4dCBmcm9tIHRoZSBpbnB1dCBzdHJpbmcgYW5kIHRoZSBmb2xsb3dpbmcgbmFtZWQgcmVzdWx0czoKICAgICAtIEN7bWlzbWF0Y2hlc30gLSBhIGxpc3Qgb2YgdGhlIHBvc2l0aW9ucyB3aXRoaW4gdGhlIG1hdGNoX3N0cmluZyB3aGVyZSBtaXNtYXRjaGVzIHdlcmUgZm91bmQKICAgICAtIEN7b3JpZ2luYWx9IC0gdGhlIG9yaWdpbmFsIG1hdGNoX3N0cmluZyB1c2VkIHRvIGNvbXBhcmUgYWdhaW5zdCB0aGUgaW5wdXQgc3RyaW5nCiAgICAKICAgIElmIEN7bWlzbWF0Y2hlc30gaXMgYW4gZW1wdHkgbGlzdCwgdGhlbiB0aGUgbWF0Y2ggd2FzIGFuIGV4YWN0IG1hdGNoLgogICAgCiAgICBFeGFtcGxlOjoKICAgICAgICBwYXR0ID0gQ2xvc2VNYXRjaCgiQVRDQVRDR0FBVEdHQSIpCiAgICAgICAgcGF0dC5wYXJzZVN0cmluZygiQVRDQVRDR0FBWEdHQSIpICMgLT4gKFsnQVRDQVRDR0FBWEdHQSddLCB7J21pc21hdGNoZXMnOiBbWzldXSwgJ29yaWdpbmFsJzogWydBVENBVENHQUFUR0dBJ119KQogICAgICAgIHBhdHQucGFyc2VTdHJpbmcoIkFUQ0FYQ0dBQVhHR0EiKSAjIC0+IEV4Y2VwdGlvbjogRXhwZWN0ZWQgJ0FUQ0FUQ0dBQVRHR0EnICh3aXRoIHVwIHRvIDEgbWlzbWF0Y2hlcykgKGF0IGNoYXIgMCksIChsaW5lOjEsIGNvbDoxKQoKICAgICAgICAjIGV4YWN0IG1hdGNoCiAgICAgICAgcGF0dC5wYXJzZVN0cmluZygiQVRDQVRDR0FBVEdHQSIpICMgLT4gKFsnQVRDQVRDR0FBVEdHQSddLCB7J21pc21hdGNoZXMnOiBbW11dLCAnb3JpZ2luYWwnOiBbJ0FUQ0FUQ0dBQVRHR0EnXX0pCgogICAgICAgICMgY2xvc2UgbWF0Y2ggYWxsb3dpbmcgdXAgdG8gMiBtaXNtYXRjaGVzCiAgICAgICAgcGF0dCA9IENsb3NlTWF0Y2goIkFUQ0FUQ0dBQVRHR0EiLCBtYXhNaXNtYXRjaGVzPTIpCiAgICAgICAgcGF0dC5wYXJzZVN0cmluZygiQVRDQVhDR0FBWEdHQSIpICMgLT4gKFsnQVRDQVhDR0FBWEdHQSddLCB7J21pc21hdGNoZXMnOiBbWzQsIDldXSwgJ29yaWdpbmFsJzogWydBVENBVENHQUFUR0dBJ119KQogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgbWF0Y2hfc3RyaW5nLCBtYXhNaXNtYXRjaGVzPTEpOgogICAgICAgIHN1cGVyKENsb3NlTWF0Y2gsc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYubmFtZSA9IG1hdGNoX3N0cmluZwogICAgICAgIHNlbGYubWF0Y2hfc3RyaW5nID0gbWF0Y2hfc3RyaW5nCiAgICAgICAgc2VsZi5tYXhNaXNtYXRjaGVzID0gbWF4TWlzbWF0Y2hlcwogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICVyICh3aXRoIHVwIHRvICVkIG1pc21hdGNoZXMpIiAlIChzZWxmLm1hdGNoX3N0cmluZywgc2VsZi5tYXhNaXNtYXRjaGVzKQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IEZhbHNlCgogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToKICAgICAgICBzdGFydCA9IGxvYwogICAgICAgIGluc3RybGVuID0gbGVuKGluc3RyaW5nKQogICAgICAgIG1heGxvYyA9IHN0YXJ0ICsgbGVuKHNlbGYubWF0Y2hfc3RyaW5nKQoKICAgICAgICBpZiBtYXhsb2MgPD0gaW5zdHJsZW46CiAgICAgICAgICAgIG1hdGNoX3N0cmluZyA9IHNlbGYubWF0Y2hfc3RyaW5nCiAgICAgICAgICAgIG1hdGNoX3N0cmluZ2xvYyA9IDAKICAgICAgICAgICAgbWlzbWF0Y2hlcyA9IFtdCiAgICAgICAgICAgIG1heE1pc21hdGNoZXMgPSBzZWxmLm1heE1pc21hdGNoZXMKCiAgICAgICAgICAgIGZvciBtYXRjaF9zdHJpbmdsb2Msc19tIGluIGVudW1lcmF0ZSh6aXAoaW5zdHJpbmdbbG9jOm1heGxvY10sIHNlbGYubWF0Y2hfc3RyaW5nKSk6CiAgICAgICAgICAgICAgICBzcmMsbWF0ID0gc19tCiAgICAgICAgICAgICAgICBpZiBzcmMgIT0gbWF0OgogICAgICAgICAgICAgICAgICAgIG1pc21hdGNoZXMuYXBwZW5kKG1hdGNoX3N0cmluZ2xvYykKICAgICAgICAgICAgICAgICAgICBpZiBsZW4obWlzbWF0Y2hlcykgPiBtYXhNaXNtYXRjaGVzOgogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbG9jID0gbWF0Y2hfc3RyaW5nbG9jICsgMQogICAgICAgICAgICAgICAgcmVzdWx0cyA9IFBhcnNlUmVzdWx0cyhbaW5zdHJpbmdbc3RhcnQ6bG9jXV0pCiAgICAgICAgICAgICAgICByZXN1bHRzWydvcmlnaW5hbCddID0gc2VsZi5tYXRjaF9zdHJpbmcKICAgICAgICAgICAgICAgIHJlc3VsdHNbJ21pc21hdGNoZXMnXSA9IG1pc21hdGNoZXMKICAgICAgICAgICAgICAgIHJldHVybiBsb2MsIHJlc3VsdHMKCiAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpCgoKY2xhc3MgV29yZChUb2tlbik6CiAgICAiIiIKICAgIFRva2VuIGZvciBtYXRjaGluZyB3b3JkcyBjb21wb3NlZCBvZiBhbGxvd2VkIGNoYXJhY3RlciBzZXRzLgogICAgRGVmaW5lZCB3aXRoIHN0cmluZyBjb250YWluaW5nIGFsbCBhbGxvd2VkIGluaXRpYWwgY2hhcmFjdGVycywKICAgIGFuIG9wdGlvbmFsIHN0cmluZyBjb250YWluaW5nIGFsbG93ZWQgYm9keSBjaGFyYWN0ZXJzIChpZiBvbWl0dGVkLAogICAgZGVmYXVsdHMgdG8gdGhlIGluaXRpYWwgY2hhcmFjdGVyIHNldCksIGFuZCBhbiBvcHRpb25hbCBtaW5pbXVtLAogICAgbWF4aW11bSwgYW5kL29yIGV4YWN0IGxlbmd0aC4gIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBDe21pbn0gaXMgMSAoYQogICAgbWluaW11bSB2YWx1ZSA8IDEgaXMgbm90IHZhbGlkKTsgdGhlIGRlZmF1bHQgdmFsdWVzIGZvciBDe21heH0gYW5kIEN7ZXhhY3R9CiAgICBhcmUgMCwgbWVhbmluZyBubyBtYXhpbXVtIG9yIGV4YWN0IGxlbmd0aCByZXN0cmljdGlvbi4gQW4gb3B0aW9uYWwKICAgIEN7ZXhjbHVkZUNoYXJzfSBwYXJhbWV0ZXIgY2FuIGxpc3QgY2hhcmFjdGVycyB0aGF0IG1pZ2h0IGJlIGZvdW5kIGluIAogICAgdGhlIGlucHV0IEN7Ym9keUNoYXJzfSBzdHJpbmc7IHVzZWZ1bCB0byBkZWZpbmUgYSB3b3JkIG9mIGFsbCBwcmludGFibGVzCiAgICBleGNlcHQgZm9yIG9uZSBvciB0d28gY2hhcmFjdGVycywgZm9yIGluc3RhbmNlLgogICAgCiAgICBMe3NyYW5nZX0gaXMgdXNlZnVsIGZvciBkZWZpbmluZyBjdXN0b20gY2hhcmFjdGVyIHNldCBzdHJpbmdzIGZvciBkZWZpbmluZyAKICAgIEN7V29yZH0gZXhwcmVzc2lvbnMsIHVzaW5nIHJhbmdlIG5vdGF0aW9uIGZyb20gcmVndWxhciBleHByZXNzaW9uIGNoYXJhY3RlciBzZXRzLgogICAgCiAgICBBIGNvbW1vbiBtaXN0YWtlIGlzIHRvIHVzZSBDe1dvcmR9IHRvIG1hdGNoIGEgc3BlY2lmaWMgbGl0ZXJhbCBzdHJpbmcsIGFzIGluIAogICAgQ3tXb3JkKCJBZGRyZXNzIil9LiBSZW1lbWJlciB0aGF0IEN7V29yZH0gdXNlcyB0aGUgc3RyaW5nIGFyZ3VtZW50IHRvIGRlZmluZQogICAgSXtzZXRzfSBvZiBtYXRjaGFibGUgY2hhcmFjdGVycy4gVGhpcyBleHByZXNzaW9uIHdvdWxkIG1hdGNoICJBZGQiLCAiQUFBIiwKICAgICJkQXJlZCIsIG9yIGFueSBvdGhlciB3b3JkIG1hZGUgdXAgb2YgdGhlIGNoYXJhY3RlcnMgJ0EnLCAnZCcsICdyJywgJ2UnLCBhbmQgJ3MnLgogICAgVG8gbWF0Y2ggYW4gZXhhY3QgbGl0ZXJhbCBzdHJpbmcsIHVzZSBMe0xpdGVyYWx9IG9yIEx7S2V5d29yZH0uCgogICAgcHlwYXJzaW5nIGluY2x1ZGVzIGhlbHBlciBzdHJpbmdzIGZvciBidWlsZGluZyBXb3JkczoKICAgICAtIEx7YWxwaGFzfQogICAgIC0gTHtudW1zfQogICAgIC0gTHthbHBoYW51bXN9CiAgICAgLSBMe2hleG51bXN9CiAgICAgLSBMe2FscGhhczhiaXR9IChhbHBoYWJldGljIGNoYXJhY3RlcnMgaW4gQVNDSUkgcmFuZ2UgMTI4LTI1NSAtIGFjY2VudGVkLCB0aWxkZWQsIHVtbGF1dGVkLCBldGMuKQogICAgIC0gTHtwdW5jOGJpdH0gKG5vbi1hbHBoYWJldGljIGNoYXJhY3RlcnMgaW4gQVNDSUkgcmFuZ2UgMTI4LTI1NSAtIGN1cnJlbmN5LCBzeW1ib2xzLCBzdXBlcnNjcmlwdHMsIGRpYWNyaXRpY2FscywgZXRjLikKICAgICAtIEx7cHJpbnRhYmxlc30gKGFueSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIpCgogICAgRXhhbXBsZTo6CiAgICAgICAgIyBhIHdvcmQgY29tcG9zZWQgb2YgZGlnaXRzCiAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykgIyBlcXVpdmFsZW50IHRvIFdvcmQoIjAxMjM0NTY3ODkiKSBvciBXb3JkKHNyYW5nZSgiMC05IikpCiAgICAgICAgCiAgICAgICAgIyBhIHdvcmQgd2l0aCBhIGxlYWRpbmcgY2FwaXRhbCwgYW5kIHplcm8gb3IgbW9yZSBsb3dlcmNhc2UKICAgICAgICBjYXBpdGFsX3dvcmQgPSBXb3JkKGFscGhhcy51cHBlcigpLCBhbHBoYXMubG93ZXIoKSkKCiAgICAgICAgIyBob3N0bmFtZXMgYXJlIGFscGhhbnVtZXJpYywgd2l0aCBsZWFkaW5nIGFscGhhLCBhbmQgJy0nCiAgICAgICAgaG9zdG5hbWUgPSBXb3JkKGFscGhhcywgYWxwaGFudW1zKyctJykKICAgICAgICAKICAgICAgICAjIHJvbWFuIG51bWVyYWwgKG5vdCBhIHN0cmljdCBwYXJzZXIsIGFjY2VwdHMgaW52YWxpZCBtaXggb2YgY2hhcmFjdGVycykKICAgICAgICByb21hbiA9IFdvcmQoIklWWExDRE0iKQogICAgICAgIAogICAgICAgICMgYW55IHN0cmluZyBvZiBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXJzLCBleGNlcHQgZm9yICcsJwogICAgICAgIGNzdl92YWx1ZSA9IFdvcmQocHJpbnRhYmxlcywgZXhjbHVkZUNoYXJzPSIsIikKICAgICIiIgogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBpbml0Q2hhcnMsIGJvZHlDaGFycz1Ob25lLCBtaW49MSwgbWF4PTAsIGV4YWN0PTAsIGFzS2V5d29yZD1GYWxzZSwgZXhjbHVkZUNoYXJzPU5vbmUgKToKICAgICAgICBzdXBlcihXb3JkLHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBpZiBleGNsdWRlQ2hhcnM6CiAgICAgICAgICAgIGluaXRDaGFycyA9ICcnLmpvaW4oYyBmb3IgYyBpbiBpbml0Q2hhcnMgaWYgYyBub3QgaW4gZXhjbHVkZUNoYXJzKQogICAgICAgICAgICBpZiBib2R5Q2hhcnM6CiAgICAgICAgICAgICAgICBib2R5Q2hhcnMgPSAnJy5qb2luKGMgZm9yIGMgaW4gYm9keUNoYXJzIGlmIGMgbm90IGluIGV4Y2x1ZGVDaGFycykKICAgICAgICBzZWxmLmluaXRDaGFyc09yaWcgPSBpbml0Q2hhcnMKICAgICAgICBzZWxmLmluaXRDaGFycyA9IHNldChpbml0Q2hhcnMpCiAgICAgICAgaWYgYm9keUNoYXJzIDoKICAgICAgICAgICAgc2VsZi5ib2R5Q2hhcnNPcmlnID0gYm9keUNoYXJzCiAgICAgICAgICAgIHNlbGYuYm9keUNoYXJzID0gc2V0KGJvZHlDaGFycykKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmJvZHlDaGFyc09yaWcgPSBpbml0Q2hhcnMKICAgICAgICAgICAgc2VsZi5ib2R5Q2hhcnMgPSBzZXQoaW5pdENoYXJzKQoKICAgICAgICBzZWxmLm1heFNwZWNpZmllZCA9IG1heCA+IDAKCiAgICAgICAgaWYgbWluIDwgMToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiY2Fubm90IHNwZWNpZnkgYSBtaW5pbXVtIGxlbmd0aCA8IDE7IHVzZSBPcHRpb25hbChXb3JkKCkpIGlmIHplcm8tbGVuZ3RoIHdvcmQgaXMgcGVybWl0dGVkIikKCiAgICAgICAgc2VsZi5taW5MZW4gPSBtaW4KCiAgICAgICAgaWYgbWF4ID4gMDoKICAgICAgICAgICAgc2VsZi5tYXhMZW4gPSBtYXgKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLm1heExlbiA9IF9NQVhfSU5UCgogICAgICAgIGlmIGV4YWN0ID4gMDoKICAgICAgICAgICAgc2VsZi5tYXhMZW4gPSBleGFjdAogICAgICAgICAgICBzZWxmLm1pbkxlbiA9IGV4YWN0CgogICAgICAgIHNlbGYubmFtZSA9IF91c3RyKHNlbGYpCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIHNlbGYubmFtZQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlCiAgICAgICAgc2VsZi5hc0tleXdvcmQgPSBhc0tleXdvcmQKCiAgICAgICAgaWYgJyAnIG5vdCBpbiBzZWxmLmluaXRDaGFyc09yaWcrc2VsZi5ib2R5Q2hhcnNPcmlnIGFuZCAobWluPT0xIGFuZCBtYXg9PTAgYW5kIGV4YWN0PT0wKToKICAgICAgICAgICAgaWYgc2VsZi5ib2R5Q2hhcnNPcmlnID09IHNlbGYuaW5pdENoYXJzT3JpZzoKICAgICAgICAgICAgICAgIHNlbGYucmVTdHJpbmcgPSAiWyVzXSsiICUgX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhzZWxmLmluaXRDaGFyc09yaWcpCiAgICAgICAgICAgIGVsaWYgbGVuKHNlbGYuaW5pdENoYXJzT3JpZykgPT0gMToKICAgICAgICAgICAgICAgIHNlbGYucmVTdHJpbmcgPSAiJXNbJXNdKiIgJSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlLmVzY2FwZShzZWxmLmluaXRDaGFyc09yaWcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoc2VsZi5ib2R5Q2hhcnNPcmlnKSwpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLnJlU3RyaW5nID0gIlslc11bJXNdKiIgJSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoc2VsZi5pbml0Q2hhcnNPcmlnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKHNlbGYuYm9keUNoYXJzT3JpZyksKQogICAgICAgICAgICBpZiBzZWxmLmFzS2V5d29yZDoKICAgICAgICAgICAgICAgIHNlbGYucmVTdHJpbmcgPSByIlxiIitzZWxmLnJlU3RyaW5nK3IiXGIiCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHNlbGYucmUgPSByZS5jb21waWxlKCBzZWxmLnJlU3RyaW5nICkKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgIHNlbGYucmUgPSBOb25lCgogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToKICAgICAgICBpZiBzZWxmLnJlOgogICAgICAgICAgICByZXN1bHQgPSBzZWxmLnJlLm1hdGNoKGluc3RyaW5nLGxvYykKICAgICAgICAgICAgaWYgbm90IHJlc3VsdDoKICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQoKICAgICAgICAgICAgbG9jID0gcmVzdWx0LmVuZCgpCiAgICAgICAgICAgIHJldHVybiBsb2MsIHJlc3VsdC5ncm91cCgpCgogICAgICAgIGlmIG5vdChpbnN0cmluZ1sgbG9jIF0gaW4gc2VsZi5pbml0Q2hhcnMpOgogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikKCiAgICAgICAgc3RhcnQgPSBsb2MKICAgICAgICBsb2MgKz0gMQogICAgICAgIGluc3RybGVuID0gbGVuKGluc3RyaW5nKQogICAgICAgIGJvZHljaGFycyA9IHNlbGYuYm9keUNoYXJzCiAgICAgICAgbWF4bG9jID0gc3RhcnQgKyBzZWxmLm1heExlbgogICAgICAgIG1heGxvYyA9IG1pbiggbWF4bG9jLCBpbnN0cmxlbiApCiAgICAgICAgd2hpbGUgbG9jIDwgbWF4bG9jIGFuZCBpbnN0cmluZ1tsb2NdIGluIGJvZHljaGFyczoKICAgICAgICAgICAgbG9jICs9IDEKCiAgICAgICAgdGhyb3dFeGNlcHRpb24gPSBGYWxzZQogICAgICAgIGlmIGxvYyAtIHN0YXJ0IDwgc2VsZi5taW5MZW46CiAgICAgICAgICAgIHRocm93RXhjZXB0aW9uID0gVHJ1ZQogICAgICAgIGlmIHNlbGYubWF4U3BlY2lmaWVkIGFuZCBsb2MgPCBpbnN0cmxlbiBhbmQgaW5zdHJpbmdbbG9jXSBpbiBib2R5Y2hhcnM6CiAgICAgICAgICAgIHRocm93RXhjZXB0aW9uID0gVHJ1ZQogICAgICAgIGlmIHNlbGYuYXNLZXl3b3JkOgogICAgICAgICAgICBpZiAoc3RhcnQ+MCBhbmQgaW5zdHJpbmdbc3RhcnQtMV0gaW4gYm9keWNoYXJzKSBvciAobG9jPGluc3RybGVuIGFuZCBpbnN0cmluZ1tsb2NdIGluIGJvZHljaGFycyk6CiAgICAgICAgICAgICAgICB0aHJvd0V4Y2VwdGlvbiA9IFRydWUKCiAgICAgICAgaWYgdGhyb3dFeGNlcHRpb246CiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQoKICAgICAgICByZXR1cm4gbG9jLCBpbnN0cmluZ1tzdGFydDpsb2NdCgogICAgZGVmIF9fc3RyX18oIHNlbGYgKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzdXBlcihXb3JkLHNlbGYpLl9fc3RyX18oKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIHBhc3MKCgogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOgoKICAgICAgICAgICAgZGVmIGNoYXJzQXNTdHIocyk6CiAgICAgICAgICAgICAgICBpZiBsZW4ocyk+NDoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc1s6NF0rIi4uLiIKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMKCiAgICAgICAgICAgIGlmICggc2VsZi5pbml0Q2hhcnNPcmlnICE9IHNlbGYuYm9keUNoYXJzT3JpZyApOgogICAgICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gIlc6KCVzLCVzKSIgJSAoIGNoYXJzQXNTdHIoc2VsZi5pbml0Q2hhcnNPcmlnKSwgY2hhcnNBc1N0cihzZWxmLmJvZHlDaGFyc09yaWcpICkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJXOiglcykiICUgY2hhcnNBc1N0cihzZWxmLmluaXRDaGFyc09yaWcpCgogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHIKCgpjbGFzcyBSZWdleChUb2tlbik6CiAgICAiIiIKICAgIFRva2VuIGZvciBtYXRjaGluZyBzdHJpbmdzIHRoYXQgbWF0Y2ggYSBnaXZlbiByZWd1bGFyIGV4cHJlc3Npb24uCiAgICBEZWZpbmVkIHdpdGggc3RyaW5nIHNwZWNpZnlpbmcgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBpbiBhIGZvcm0gcmVjb2duaXplZCBieSB0aGUgaW5idWlsdCBQeXRob24gcmUgbW9kdWxlLgogICAgSWYgdGhlIGdpdmVuIHJlZ2V4IGNvbnRhaW5zIG5hbWVkIGdyb3VwcyAoZGVmaW5lZCB1c2luZyBDeyg/UDxuYW1lPi4uLil9KSwgdGhlc2Ugd2lsbCBiZSBwcmVzZXJ2ZWQgYXMgCiAgICBuYW1lZCBwYXJzZSByZXN1bHRzLgoKICAgIEV4YW1wbGU6OgogICAgICAgIHJlYWxudW0gPSBSZWdleChyIlsrLV0/XGQrXC5cZCoiKQogICAgICAgIGRhdGUgPSBSZWdleChyJyg/UDx5ZWFyPlxkezR9KS0oP1A8bW9udGg+XGRcZD8pLSg/UDxkYXk+XGRcZD8pJykKICAgICAgICAjIHJlZjogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8yNjczOTkvaG93LWRvLXlvdS1tYXRjaC1vbmx5LXZhbGlkLXJvbWFuLW51bWVyYWxzLXdpdGgtYS1yZWd1bGFyLWV4cHJlc3Npb24KICAgICAgICByb21hbiA9IFJlZ2V4KHIiTXswLDR9KENNfENEfEQ/Q3swLDN9KShYQ3xYTHxMP1h7MCwzfSkoSVh8SVZ8Vj9JezAsM30pIikKICAgICIiIgogICAgY29tcGlsZWRSRXR5cGUgPSB0eXBlKHJlLmNvbXBpbGUoIltBLVpdIikpCiAgICBkZWYgX19pbml0X18oIHNlbGYsIHBhdHRlcm4sIGZsYWdzPTApOgogICAgICAgICIiIlRoZSBwYXJhbWV0ZXJzIEN7cGF0dGVybn0gYW5kIEN7ZmxhZ3N9IGFyZSBwYXNzZWQgdG8gdGhlIEN7cmUuY29tcGlsZSgpfSBmdW5jdGlvbiBhcy1pcy4gU2VlIHRoZSBQeXRob24gQ3tyZX0gbW9kdWxlIGZvciBhbiBleHBsYW5hdGlvbiBvZiB0aGUgYWNjZXB0YWJsZSBwYXR0ZXJucyBhbmQgZmxhZ3MuIiIiCiAgICAgICAgc3VwZXIoUmVnZXgsc2VsZikuX19pbml0X18oKQoKICAgICAgICBpZiBpc2luc3RhbmNlKHBhdHRlcm4sIGJhc2VzdHJpbmcpOgogICAgICAgICAgICBpZiBub3QgcGF0dGVybjoKICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIm51bGwgc3RyaW5nIHBhc3NlZCB0byBSZWdleDsgdXNlIEVtcHR5KCkgaW5zdGVhZCIsCiAgICAgICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikKCiAgICAgICAgICAgIHNlbGYucGF0dGVybiA9IHBhdHRlcm4KICAgICAgICAgICAgc2VsZi5mbGFncyA9IGZsYWdzCgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzZWxmLnJlID0gcmUuY29tcGlsZShzZWxmLnBhdHRlcm4sIHNlbGYuZmxhZ3MpCiAgICAgICAgICAgICAgICBzZWxmLnJlU3RyaW5nID0gc2VsZi5wYXR0ZXJuCiAgICAgICAgICAgIGV4Y2VwdCBzcmVfY29uc3RhbnRzLmVycm9yOgogICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigiaW52YWxpZCBwYXR0ZXJuICglcykgcGFzc2VkIHRvIFJlZ2V4IiAlIHBhdHRlcm4sCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQogICAgICAgICAgICAgICAgcmFpc2UKCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKHBhdHRlcm4sIFJlZ2V4LmNvbXBpbGVkUkV0eXBlKToKICAgICAgICAgICAgc2VsZi5yZSA9IHBhdHRlcm4KICAgICAgICAgICAgc2VsZi5wYXR0ZXJuID0gXAogICAgICAgICAgICBzZWxmLnJlU3RyaW5nID0gc3RyKHBhdHRlcm4pCiAgICAgICAgICAgIHNlbGYuZmxhZ3MgPSBmbGFncwogICAgICAgICAgICAKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJSZWdleCBtYXkgb25seSBiZSBjb25zdHJ1Y3RlZCB3aXRoIGEgc3RyaW5nIG9yIGEgY29tcGlsZWQgUkUgb2JqZWN0IikKCiAgICAgICAgc2VsZi5uYW1lID0gX3VzdHIoc2VsZikKICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAiICsgc2VsZi5uYW1lCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UKICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQoKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgcmVzdWx0ID0gc2VsZi5yZS5tYXRjaChpbnN0cmluZyxsb2MpCiAgICAgICAgaWYgbm90IHJlc3VsdDoKICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpCgogICAgICAgIGxvYyA9IHJlc3VsdC5lbmQoKQogICAgICAgIGQgPSByZXN1bHQuZ3JvdXBkaWN0KCkKICAgICAgICByZXQgPSBQYXJzZVJlc3VsdHMocmVzdWx0Lmdyb3VwKCkpCiAgICAgICAgaWYgZDoKICAgICAgICAgICAgZm9yIGsgaW4gZDoKICAgICAgICAgICAgICAgIHJldFtrXSA9IGRba10KICAgICAgICByZXR1cm4gbG9jLHJldAoKICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc3VwZXIoUmVnZXgsc2VsZikuX19zdHJfXygpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgcGFzcwoKICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gIlJlOiglcykiICUgcmVwcihzZWxmLnBhdHRlcm4pCgogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHIKCgpjbGFzcyBRdW90ZWRTdHJpbmcoVG9rZW4pOgogICAgciIiIgogICAgVG9rZW4gZm9yIG1hdGNoaW5nIHN0cmluZ3MgdGhhdCBhcmUgZGVsaW1pdGVkIGJ5IHF1b3RpbmcgY2hhcmFjdGVycy4KICAgIAogICAgRGVmaW5lZCB3aXRoIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKICAgICAgICAtIHF1b3RlQ2hhciAtIHN0cmluZyBvZiBvbmUgb3IgbW9yZSBjaGFyYWN0ZXJzIGRlZmluaW5nIHRoZSBxdW90ZSBkZWxpbWl0aW5nIHN0cmluZwogICAgICAgIC0gZXNjQ2hhciAtIGNoYXJhY3RlciB0byBlc2NhcGUgcXVvdGVzLCB0eXBpY2FsbHkgYmFja3NsYXNoIChkZWZhdWx0PUN7Tm9uZX0pCiAgICAgICAgLSBlc2NRdW90ZSAtIHNwZWNpYWwgcXVvdGUgc2VxdWVuY2UgdG8gZXNjYXBlIGFuIGVtYmVkZGVkIHF1b3RlIHN0cmluZyAoc3VjaCBhcyBTUUwncyAiIiB0byBlc2NhcGUgYW4gZW1iZWRkZWQgIikgKGRlZmF1bHQ9Q3tOb25lfSkKICAgICAgICAtIG11bHRpbGluZSAtIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHF1b3RlcyBjYW4gc3BhbiBtdWx0aXBsZSBsaW5lcyAoZGVmYXVsdD1De0ZhbHNlfSkKICAgICAgICAtIHVucXVvdGVSZXN1bHRzIC0gYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIG1hdGNoZWQgdGV4dCBzaG91bGQgYmUgdW5xdW90ZWQgKGRlZmF1bHQ9Q3tUcnVlfSkKICAgICAgICAtIGVuZFF1b3RlQ2hhciAtIHN0cmluZyBvZiBvbmUgb3IgbW9yZSBjaGFyYWN0ZXJzIGRlZmluaW5nIHRoZSBlbmQgb2YgdGhlIHF1b3RlIGRlbGltaXRlZCBzdHJpbmcgKGRlZmF1bHQ9Q3tOb25lfSA9PiBzYW1lIGFzIHF1b3RlQ2hhcikKICAgICAgICAtIGNvbnZlcnRXaGl0ZXNwYWNlRXNjYXBlcyAtIGNvbnZlcnQgZXNjYXBlZCB3aGl0ZXNwYWNlIChDeydcdCd9LCBDeydcbid9LCBldGMuKSB0byBhY3R1YWwgd2hpdGVzcGFjZSAoZGVmYXVsdD1De1RydWV9KQoKICAgIEV4YW1wbGU6OgogICAgICAgIHFzID0gUXVvdGVkU3RyaW5nKCciJykKICAgICAgICBwcmludChxcy5zZWFyY2hTdHJpbmcoJ2xzamRmICJUaGlzIGlzIHRoZSBxdW90ZSIgc2xkamYnKSkKICAgICAgICBjb21wbGV4X3FzID0gUXVvdGVkU3RyaW5nKCd7eycsIGVuZFF1b3RlQ2hhcj0nfX0nKQogICAgICAgIHByaW50KGNvbXBsZXhfcXMuc2VhcmNoU3RyaW5nKCdsc2pkZiB7e1RoaXMgaXMgdGhlICJxdW90ZSJ9fSBzbGRqZicpKQogICAgICAgIHNxbF9xcyA9IFF1b3RlZFN0cmluZygnIicsIGVzY1F1b3RlPSciIicpCiAgICAgICAgcHJpbnQoc3FsX3FzLnNlYXJjaFN0cmluZygnbHNqZGYgIlRoaXMgaXMgdGhlIHF1b3RlIHdpdGggIiJlbWJlZGRlZCIiIHF1b3RlcyIgc2xkamYnKSkKICAgIHByaW50czo6CiAgICAgICAgW1snVGhpcyBpcyB0aGUgcXVvdGUnXV0KICAgICAgICBbWydUaGlzIGlzIHRoZSAicXVvdGUiJ11dCiAgICAgICAgW1snVGhpcyBpcyB0aGUgcXVvdGUgd2l0aCAiZW1iZWRkZWQiIHF1b3RlcyddXQogICAgIiIiCiAgICBkZWYgX19pbml0X18oIHNlbGYsIHF1b3RlQ2hhciwgZXNjQ2hhcj1Ob25lLCBlc2NRdW90ZT1Ob25lLCBtdWx0aWxpbmU9RmFsc2UsIHVucXVvdGVSZXN1bHRzPVRydWUsIGVuZFF1b3RlQ2hhcj1Ob25lLCBjb252ZXJ0V2hpdGVzcGFjZUVzY2FwZXM9VHJ1ZSk6CiAgICAgICAgc3VwZXIoUXVvdGVkU3RyaW5nLHNlbGYpLl9faW5pdF9fKCkKCiAgICAgICAgIyByZW1vdmUgd2hpdGUgc3BhY2UgZnJvbSBxdW90ZSBjaGFycyAtIHdvbnQgd29yayBhbnl3YXkKICAgICAgICBxdW90ZUNoYXIgPSBxdW90ZUNoYXIuc3RyaXAoKQogICAgICAgIGlmIG5vdCBxdW90ZUNoYXI6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oInF1b3RlQ2hhciBjYW5ub3QgYmUgdGhlIGVtcHR5IHN0cmluZyIsU3ludGF4V2FybmluZyxzdGFja2xldmVsPTIpCiAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yKCkKCiAgICAgICAgaWYgZW5kUXVvdGVDaGFyIGlzIE5vbmU6CiAgICAgICAgICAgIGVuZFF1b3RlQ2hhciA9IHF1b3RlQ2hhcgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGVuZFF1b3RlQ2hhciA9IGVuZFF1b3RlQ2hhci5zdHJpcCgpCiAgICAgICAgICAgIGlmIG5vdCBlbmRRdW90ZUNoYXI6CiAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJlbmRRdW90ZUNoYXIgY2Fubm90IGJlIHRoZSBlbXB0eSBzdHJpbmciLFN5bnRheFdhcm5pbmcsc3RhY2tsZXZlbD0yKQogICAgICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IoKQoKICAgICAgICBzZWxmLnF1b3RlQ2hhciA9IHF1b3RlQ2hhcgogICAgICAgIHNlbGYucXVvdGVDaGFyTGVuID0gbGVuKHF1b3RlQ2hhcikKICAgICAgICBzZWxmLmZpcnN0UXVvdGVDaGFyID0gcXVvdGVDaGFyWzBdCiAgICAgICAgc2VsZi5lbmRRdW90ZUNoYXIgPSBlbmRRdW90ZUNoYXIKICAgICAgICBzZWxmLmVuZFF1b3RlQ2hhckxlbiA9IGxlbihlbmRRdW90ZUNoYXIpCiAgICAgICAgc2VsZi5lc2NDaGFyID0gZXNjQ2hhcgogICAgICAgIHNlbGYuZXNjUXVvdGUgPSBlc2NRdW90ZQogICAgICAgIHNlbGYudW5xdW90ZVJlc3VsdHMgPSB1bnF1b3RlUmVzdWx0cwogICAgICAgIHNlbGYuY29udmVydFdoaXRlc3BhY2VFc2NhcGVzID0gY29udmVydFdoaXRlc3BhY2VFc2NhcGVzCgogICAgICAgIGlmIG11bHRpbGluZToKICAgICAgICAgICAgc2VsZi5mbGFncyA9IHJlLk1VTFRJTElORSB8IHJlLkRPVEFMTAogICAgICAgICAgICBzZWxmLnBhdHRlcm4gPSByJyVzKD86W14lcyVzXScgJSBcCiAgICAgICAgICAgICAgICAoIHJlLmVzY2FwZShzZWxmLnF1b3RlQ2hhciksCiAgICAgICAgICAgICAgICAgIF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoc2VsZi5lbmRRdW90ZUNoYXJbMF0pLAogICAgICAgICAgICAgICAgICAoZXNjQ2hhciBpcyBub3QgTm9uZSBhbmQgX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhlc2NDaGFyKSBvciAnJykgKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuZmxhZ3MgPSAwCiAgICAgICAgICAgIHNlbGYucGF0dGVybiA9IHInJXMoPzpbXiVzXG5cciVzXScgJSBcCiAgICAgICAgICAgICAgICAoIHJlLmVzY2FwZShzZWxmLnF1b3RlQ2hhciksCiAgICAgICAgICAgICAgICAgIF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoc2VsZi5lbmRRdW90ZUNoYXJbMF0pLAogICAgICAgICAgICAgICAgICAoZXNjQ2hhciBpcyBub3QgTm9uZSBhbmQgX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhlc2NDaGFyKSBvciAnJykgKQogICAgICAgIGlmIGxlbihzZWxmLmVuZFF1b3RlQ2hhcikgPiAxOgogICAgICAgICAgICBzZWxmLnBhdHRlcm4gKz0gKAogICAgICAgICAgICAgICAgJ3woPzonICsgJyl8KD86Jy5qb2luKCIlc1teJXNdIiAlIChyZS5lc2NhcGUoc2VsZi5lbmRRdW90ZUNoYXJbOmldKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKHNlbGYuZW5kUXVvdGVDaGFyW2ldKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuZW5kUXVvdGVDaGFyKS0xLDAsLTEpKSArICcpJwogICAgICAgICAgICAgICAgKQogICAgICAgIGlmIGVzY1F1b3RlOgogICAgICAgICAgICBzZWxmLnBhdHRlcm4gKz0gKHInfCg/OiVzKScgJSByZS5lc2NhcGUoZXNjUXVvdGUpKQogICAgICAgIGlmIGVzY0NoYXI6CiAgICAgICAgICAgIHNlbGYucGF0dGVybiArPSAocid8KD86JXMuKScgJSByZS5lc2NhcGUoZXNjQ2hhcikpCiAgICAgICAgICAgIHNlbGYuZXNjQ2hhclJlcGxhY2VQYXR0ZXJuID0gcmUuZXNjYXBlKHNlbGYuZXNjQ2hhcikrIiguKSIKICAgICAgICBzZWxmLnBhdHRlcm4gKz0gKHInKSolcycgJSByZS5lc2NhcGUoc2VsZi5lbmRRdW90ZUNoYXIpKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYucmUgPSByZS5jb21waWxlKHNlbGYucGF0dGVybiwgc2VsZi5mbGFncykKICAgICAgICAgICAgc2VsZi5yZVN0cmluZyA9IHNlbGYucGF0dGVybgogICAgICAgIGV4Y2VwdCBzcmVfY29uc3RhbnRzLmVycm9yOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJpbnZhbGlkIHBhdHRlcm4gKCVzKSBwYXNzZWQgdG8gUmVnZXgiICUgc2VsZi5wYXR0ZXJuLAogICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQogICAgICAgICAgICByYWlzZQoKICAgICAgICBzZWxmLm5hbWUgPSBfdXN0cihzZWxmKQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBzZWxmLm5hbWUKICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlCgogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToKICAgICAgICByZXN1bHQgPSBpbnN0cmluZ1tsb2NdID09IHNlbGYuZmlyc3RRdW90ZUNoYXIgYW5kIHNlbGYucmUubWF0Y2goaW5zdHJpbmcsbG9jKSBvciBOb25lCiAgICAgICAgaWYgbm90IHJlc3VsdDoKICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpCgogICAgICAgIGxvYyA9IHJlc3VsdC5lbmQoKQogICAgICAgIHJldCA9IHJlc3VsdC5ncm91cCgpCgogICAgICAgIGlmIHNlbGYudW5xdW90ZVJlc3VsdHM6CgogICAgICAgICAgICAjIHN0cmlwIG9mZiBxdW90ZXMKICAgICAgICAgICAgcmV0ID0gcmV0W3NlbGYucXVvdGVDaGFyTGVuOi1zZWxmLmVuZFF1b3RlQ2hhckxlbl0KCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UocmV0LGJhc2VzdHJpbmcpOgogICAgICAgICAgICAgICAgIyByZXBsYWNlIGVzY2FwZWQgd2hpdGVzcGFjZQogICAgICAgICAgICAgICAgaWYgJ1xcJyBpbiByZXQgYW5kIHNlbGYuY29udmVydFdoaXRlc3BhY2VFc2NhcGVzOgogICAgICAgICAgICAgICAgICAgIHdzX21hcCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgcidcdCcgOiAnXHQnLAogICAgICAgICAgICAgICAgICAgICAgICByJ1xuJyA6ICdcbicsCiAgICAgICAgICAgICAgICAgICAgICAgIHInXGYnIDogJ1xmJywKICAgICAgICAgICAgICAgICAgICAgICAgcidccicgOiAnXHInLAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmb3Igd3NsaXQsd3NjaGFyIGluIHdzX21hcC5pdGVtcygpOgogICAgICAgICAgICAgICAgICAgICAgICByZXQgPSByZXQucmVwbGFjZSh3c2xpdCwgd3NjaGFyKQoKICAgICAgICAgICAgICAgICMgcmVwbGFjZSBlc2NhcGVkIGNoYXJhY3RlcnMKICAgICAgICAgICAgICAgIGlmIHNlbGYuZXNjQ2hhcjoKICAgICAgICAgICAgICAgICAgICByZXQgPSByZS5zdWIoc2VsZi5lc2NDaGFyUmVwbGFjZVBhdHRlcm4sIlxnPDE+IixyZXQpCgogICAgICAgICAgICAgICAgIyByZXBsYWNlIGVzY2FwZWQgcXVvdGVzCiAgICAgICAgICAgICAgICBpZiBzZWxmLmVzY1F1b3RlOgogICAgICAgICAgICAgICAgICAgIHJldCA9IHJldC5yZXBsYWNlKHNlbGYuZXNjUXVvdGUsIHNlbGYuZW5kUXVvdGVDaGFyKQoKICAgICAgICByZXR1cm4gbG9jLCByZXQKCiAgICBkZWYgX19zdHJfXyggc2VsZiApOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHN1cGVyKFF1b3RlZFN0cmluZyxzZWxmKS5fX3N0cl9fKCkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBwYXNzCgogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOgogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAicXVvdGVkIHN0cmluZywgc3RhcnRpbmcgd2l0aCAlcyBlbmRpbmcgd2l0aCAlcyIgJSAoc2VsZi5xdW90ZUNoYXIsIHNlbGYuZW5kUXVvdGVDaGFyKQoKICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByCgoKY2xhc3MgQ2hhcnNOb3RJbihUb2tlbik6CiAgICAiIiIKICAgIFRva2VuIGZvciBtYXRjaGluZyB3b3JkcyBjb21wb3NlZCBvZiBjaGFyYWN0ZXJzIEl7bm90fSBpbiBhIGdpdmVuIHNldCAod2lsbAogICAgaW5jbHVkZSB3aGl0ZXNwYWNlIGluIG1hdGNoZWQgY2hhcmFjdGVycyBpZiBub3QgbGlzdGVkIGluIHRoZSBwcm92aWRlZCBleGNsdXNpb24gc2V0IC0gc2VlIGV4YW1wbGUpLgogICAgRGVmaW5lZCB3aXRoIHN0cmluZyBjb250YWluaW5nIGFsbCBkaXNhbGxvd2VkIGNoYXJhY3RlcnMsIGFuZCBhbiBvcHRpb25hbAogICAgbWluaW11bSwgbWF4aW11bSwgYW5kL29yIGV4YWN0IGxlbmd0aC4gIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBDe21pbn0gaXMgMSAoYQogICAgbWluaW11bSB2YWx1ZSA8IDEgaXMgbm90IHZhbGlkKTsgdGhlIGRlZmF1bHQgdmFsdWVzIGZvciBDe21heH0gYW5kIEN7ZXhhY3R9CiAgICBhcmUgMCwgbWVhbmluZyBubyBtYXhpbXVtIG9yIGV4YWN0IGxlbmd0aCByZXN0cmljdGlvbi4KCiAgICBFeGFtcGxlOjoKICAgICAgICAjIGRlZmluZSBhIGNvbW1hLXNlcGFyYXRlZC12YWx1ZSBhcyBhbnl0aGluZyB0aGF0IGlzIG5vdCBhICcsJwogICAgICAgIGNzdl92YWx1ZSA9IENoYXJzTm90SW4oJywnKQogICAgICAgIHByaW50KGRlbGltaXRlZExpc3QoY3N2X3ZhbHVlKS5wYXJzZVN0cmluZygiZGtscyxsc2RramYsczEyIDM0LEAhIywyMTMiKSkKICAgIHByaW50czo6CiAgICAgICAgWydka2xzJywgJ2xzZGtqZicsICdzMTIgMzQnLCAnQCEjJywgJzIxMyddCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyggc2VsZiwgbm90Q2hhcnMsIG1pbj0xLCBtYXg9MCwgZXhhY3Q9MCApOgogICAgICAgIHN1cGVyKENoYXJzTm90SW4sc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBGYWxzZQogICAgICAgIHNlbGYubm90Q2hhcnMgPSBub3RDaGFycwoKICAgICAgICBpZiBtaW4gPCAxOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJjYW5ub3Qgc3BlY2lmeSBhIG1pbmltdW0gbGVuZ3RoIDwgMTsgdXNlIE9wdGlvbmFsKENoYXJzTm90SW4oKSkgaWYgemVyby1sZW5ndGggY2hhciBncm91cCBpcyBwZXJtaXR0ZWQiKQoKICAgICAgICBzZWxmLm1pbkxlbiA9IG1pbgoKICAgICAgICBpZiBtYXggPiAwOgogICAgICAgICAgICBzZWxmLm1heExlbiA9IG1heAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYubWF4TGVuID0gX01BWF9JTlQKCiAgICAgICAgaWYgZXhhY3QgPiAwOgogICAgICAgICAgICBzZWxmLm1heExlbiA9IGV4YWN0CiAgICAgICAgICAgIHNlbGYubWluTGVuID0gZXhhY3QKCiAgICAgICAgc2VsZi5uYW1lID0gX3VzdHIoc2VsZikKICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAiICsgc2VsZi5uYW1lCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9ICggc2VsZi5taW5MZW4gPT0gMCApCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UKCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOgogICAgICAgIGlmIGluc3RyaW5nW2xvY10gaW4gc2VsZi5ub3RDaGFyczoKICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpCgogICAgICAgIHN0YXJ0ID0gbG9jCiAgICAgICAgbG9jICs9IDEKICAgICAgICBub3RjaGFycyA9IHNlbGYubm90Q2hhcnMKICAgICAgICBtYXhsZW4gPSBtaW4oIHN0YXJ0K3NlbGYubWF4TGVuLCBsZW4oaW5zdHJpbmcpICkKICAgICAgICB3aGlsZSBsb2MgPCBtYXhsZW4gYW5kIFwKICAgICAgICAgICAgICAoaW5zdHJpbmdbbG9jXSBub3QgaW4gbm90Y2hhcnMpOgogICAgICAgICAgICBsb2MgKz0gMQoKICAgICAgICBpZiBsb2MgLSBzdGFydCA8IHNlbGYubWluTGVuOgogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikKCiAgICAgICAgcmV0dXJuIGxvYywgaW5zdHJpbmdbc3RhcnQ6bG9jXQoKICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc3VwZXIoQ2hhcnNOb3RJbiwgc2VsZikuX19zdHJfXygpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgcGFzcwoKICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToKICAgICAgICAgICAgaWYgbGVuKHNlbGYubm90Q2hhcnMpID4gNDoKICAgICAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICIhVzooJXMuLi4pIiAlIHNlbGYubm90Q2hhcnNbOjRdCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAiIVc6KCVzKSIgJSBzZWxmLm5vdENoYXJzCgogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHIKCmNsYXNzIFdoaXRlKFRva2VuKToKICAgICIiIgogICAgU3BlY2lhbCBtYXRjaGluZyBjbGFzcyBmb3IgbWF0Y2hpbmcgd2hpdGVzcGFjZS4gIE5vcm1hbGx5LCB3aGl0ZXNwYWNlIGlzIGlnbm9yZWQKICAgIGJ5IHB5cGFyc2luZyBncmFtbWFycy4gIFRoaXMgY2xhc3MgaXMgaW5jbHVkZWQgd2hlbiBzb21lIHdoaXRlc3BhY2Ugc3RydWN0dXJlcwogICAgYXJlIHNpZ25pZmljYW50LiAgRGVmaW5lIHdpdGggYSBzdHJpbmcgY29udGFpbmluZyB0aGUgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHRvIGJlCiAgICBtYXRjaGVkOyBkZWZhdWx0IGlzIEN7IiBcXHRcXHJcXG4ifS4gIEFsc28gdGFrZXMgb3B0aW9uYWwgQ3ttaW59LCBDe21heH0sIGFuZCBDe2V4YWN0fSBhcmd1bWVudHMsCiAgICBhcyBkZWZpbmVkIGZvciB0aGUgQ3tMe1dvcmR9fSBjbGFzcy4KICAgICIiIgogICAgd2hpdGVTdHJzID0gewogICAgICAgICIgIiA6ICI8U1BDPiIsCiAgICAgICAgIlx0IjogIjxUQUI+IiwKICAgICAgICAiXG4iOiAiPExGPiIsCiAgICAgICAgIlxyIjogIjxDUj4iLAogICAgICAgICJcZiI6ICI8RkY+IiwKICAgICAgICB9CiAgICBkZWYgX19pbml0X18oc2VsZiwgd3M9IiBcdFxyXG4iLCBtaW49MSwgbWF4PTAsIGV4YWN0PTApOgogICAgICAgIHN1cGVyKFdoaXRlLHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLm1hdGNoV2hpdGUgPSB3cwogICAgICAgIHNlbGYuc2V0V2hpdGVzcGFjZUNoYXJzKCAiIi5qb2luKGMgZm9yIGMgaW4gc2VsZi53aGl0ZUNoYXJzIGlmIGMgbm90IGluIHNlbGYubWF0Y2hXaGl0ZSkgKQogICAgICAgICN+IHNlbGYubGVhdmVXaGl0ZXNwYWNlKCkKICAgICAgICBzZWxmLm5hbWUgPSAoIiIuam9pbihXaGl0ZS53aGl0ZVN0cnNbY10gZm9yIGMgaW4gc2VsZi5tYXRjaFdoaXRlKSkKICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBzZWxmLm5hbWUKCiAgICAgICAgc2VsZi5taW5MZW4gPSBtaW4KCiAgICAgICAgaWYgbWF4ID4gMDoKICAgICAgICAgICAgc2VsZi5tYXhMZW4gPSBtYXgKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLm1heExlbiA9IF9NQVhfSU5UCgogICAgICAgIGlmIGV4YWN0ID4gMDoKICAgICAgICAgICAgc2VsZi5tYXhMZW4gPSBleGFjdAogICAgICAgICAgICBzZWxmLm1pbkxlbiA9IGV4YWN0CgogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToKICAgICAgICBpZiBub3QoaW5zdHJpbmdbIGxvYyBdIGluIHNlbGYubWF0Y2hXaGl0ZSk6CiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQogICAgICAgIHN0YXJ0ID0gbG9jCiAgICAgICAgbG9jICs9IDEKICAgICAgICBtYXhsb2MgPSBzdGFydCArIHNlbGYubWF4TGVuCiAgICAgICAgbWF4bG9jID0gbWluKCBtYXhsb2MsIGxlbihpbnN0cmluZykgKQogICAgICAgIHdoaWxlIGxvYyA8IG1heGxvYyBhbmQgaW5zdHJpbmdbbG9jXSBpbiBzZWxmLm1hdGNoV2hpdGU6CiAgICAgICAgICAgIGxvYyArPSAxCgogICAgICAgIGlmIGxvYyAtIHN0YXJ0IDwgc2VsZi5taW5MZW46CiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQoKICAgICAgICByZXR1cm4gbG9jLCBpbnN0cmluZ1tzdGFydDpsb2NdCgoKY2xhc3MgX1Bvc2l0aW9uVG9rZW4oVG9rZW4pOgogICAgZGVmIF9faW5pdF9fKCBzZWxmICk6CiAgICAgICAgc3VwZXIoX1Bvc2l0aW9uVG9rZW4sc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYubmFtZT1zZWxmLl9fY2xhc3NfXy5fX25hbWVfXwogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UKCmNsYXNzIEdvVG9Db2x1bW4oX1Bvc2l0aW9uVG9rZW4pOgogICAgIiIiCiAgICBUb2tlbiB0byBhZHZhbmNlIHRvIGEgc3BlY2lmaWMgY29sdW1uIG9mIGlucHV0IHRleHQ7IHVzZWZ1bCBmb3IgdGFidWxhciByZXBvcnQgc2NyYXBpbmcuCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyggc2VsZiwgY29sbm8gKToKICAgICAgICBzdXBlcihHb1RvQ29sdW1uLHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLmNvbCA9IGNvbG5vCgogICAgZGVmIHByZVBhcnNlKCBzZWxmLCBpbnN0cmluZywgbG9jICk6CiAgICAgICAgaWYgY29sKGxvYyxpbnN0cmluZykgIT0gc2VsZi5jb2w6CiAgICAgICAgICAgIGluc3RybGVuID0gbGVuKGluc3RyaW5nKQogICAgICAgICAgICBpZiBzZWxmLmlnbm9yZUV4cHJzOgogICAgICAgICAgICAgICAgbG9jID0gc2VsZi5fc2tpcElnbm9yYWJsZXMoIGluc3RyaW5nLCBsb2MgKQogICAgICAgICAgICB3aGlsZSBsb2MgPCBpbnN0cmxlbiBhbmQgaW5zdHJpbmdbbG9jXS5pc3NwYWNlKCkgYW5kIGNvbCggbG9jLCBpbnN0cmluZyApICE9IHNlbGYuY29sIDoKICAgICAgICAgICAgICAgIGxvYyArPSAxCiAgICAgICAgcmV0dXJuIGxvYwoKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgdGhpc2NvbCA9IGNvbCggbG9jLCBpbnN0cmluZyApCiAgICAgICAgaWYgdGhpc2NvbCA+IHNlbGYuY29sOgogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbiggaW5zdHJpbmcsIGxvYywgIlRleHQgbm90IGluIGV4cGVjdGVkIGNvbHVtbiIsIHNlbGYgKQogICAgICAgIG5ld2xvYyA9IGxvYyArIHNlbGYuY29sIC0gdGhpc2NvbAogICAgICAgIHJldCA9IGluc3RyaW5nWyBsb2M6IG5ld2xvYyBdCiAgICAgICAgcmV0dXJuIG5ld2xvYywgcmV0CgoKY2xhc3MgTGluZVN0YXJ0KF9Qb3NpdGlvblRva2VuKToKICAgICIiIgogICAgTWF0Y2hlcyBpZiBjdXJyZW50IHBvc2l0aW9uIGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lIHdpdGhpbiB0aGUgcGFyc2Ugc3RyaW5nCiAgICAKICAgIEV4YW1wbGU6OgogICAgCiAgICAgICAgdGVzdCA9ICcnJ1wKICAgICAgICBBQUEgdGhpcyBsaW5lCiAgICAgICAgQUFBIGFuZCB0aGlzIGxpbmUKICAgICAgICAgIEFBQSBidXQgbm90IHRoaXMgb25lCiAgICAgICAgQiBBQUEgYW5kIGRlZmluaXRlbHkgbm90IHRoaXMgb25lCiAgICAgICAgJycnCgogICAgICAgIGZvciB0IGluIChMaW5lU3RhcnQoKSArICdBQUEnICsgcmVzdE9mTGluZSkuc2VhcmNoU3RyaW5nKHRlc3QpOgogICAgICAgICAgICBwcmludCh0KQogICAgCiAgICBQcmludHM6OgogICAgICAgIFsnQUFBJywgJyB0aGlzIGxpbmUnXQogICAgICAgIFsnQUFBJywgJyBhbmQgdGhpcyBsaW5lJ10gICAgCgogICAgIiIiCiAgICBkZWYgX19pbml0X18oIHNlbGYgKToKICAgICAgICBzdXBlcihMaW5lU3RhcnQsc2VsZikuX19pbml0X18oKQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkIHN0YXJ0IG9mIGxpbmUiCgogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToKICAgICAgICBpZiBjb2wobG9jLCBpbnN0cmluZykgPT0gMToKICAgICAgICAgICAgcmV0dXJuIGxvYywgW10KICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikKCmNsYXNzIExpbmVFbmQoX1Bvc2l0aW9uVG9rZW4pOgogICAgIiIiCiAgICBNYXRjaGVzIGlmIGN1cnJlbnQgcG9zaXRpb24gaXMgYXQgdGhlIGVuZCBvZiBhIGxpbmUgd2l0aGluIHRoZSBwYXJzZSBzdHJpbmcKICAgICIiIgogICAgZGVmIF9faW5pdF9fKCBzZWxmICk6CiAgICAgICAgc3VwZXIoTGluZUVuZCxzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5zZXRXaGl0ZXNwYWNlQ2hhcnMoIFBhcnNlckVsZW1lbnQuREVGQVVMVF9XSElURV9DSEFSUy5yZXBsYWNlKCJcbiIsIiIpICkKICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCBlbmQgb2YgbGluZSIKCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOgogICAgICAgIGlmIGxvYzxsZW4oaW5zdHJpbmcpOgogICAgICAgICAgICBpZiBpbnN0cmluZ1tsb2NdID09ICJcbiI6CiAgICAgICAgICAgICAgICByZXR1cm4gbG9jKzEsICJcbiIKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQogICAgICAgIGVsaWYgbG9jID09IGxlbihpbnN0cmluZyk6CiAgICAgICAgICAgIHJldHVybiBsb2MrMSwgW10KICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikKCmNsYXNzIFN0cmluZ1N0YXJ0KF9Qb3NpdGlvblRva2VuKToKICAgICIiIgogICAgTWF0Y2hlcyBpZiBjdXJyZW50IHBvc2l0aW9uIGlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhcnNlIHN0cmluZwogICAgIiIiCiAgICBkZWYgX19pbml0X18oIHNlbGYgKToKICAgICAgICBzdXBlcihTdHJpbmdTdGFydCxzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgc3RhcnQgb2YgdGV4dCIKCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOgogICAgICAgIGlmIGxvYyAhPSAwOgogICAgICAgICAgICAjIHNlZSBpZiBlbnRpcmUgc3RyaW5nIHVwIHRvIGhlcmUgaXMganVzdCB3aGl0ZXNwYWNlIGFuZCBpZ25vcmVhYmxlcwogICAgICAgICAgICBpZiBsb2MgIT0gc2VsZi5wcmVQYXJzZSggaW5zdHJpbmcsIDAgKToKICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQogICAgICAgIHJldHVybiBsb2MsIFtdCgpjbGFzcyBTdHJpbmdFbmQoX1Bvc2l0aW9uVG9rZW4pOgogICAgIiIiCiAgICBNYXRjaGVzIGlmIGN1cnJlbnQgcG9zaXRpb24gaXMgYXQgdGhlIGVuZCBvZiB0aGUgcGFyc2Ugc3RyaW5nCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyggc2VsZiApOgogICAgICAgIHN1cGVyKFN0cmluZ0VuZCxzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgZW5kIG9mIHRleHQiCgogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToKICAgICAgICBpZiBsb2MgPCBsZW4oaW5zdHJpbmcpOgogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikKICAgICAgICBlbGlmIGxvYyA9PSBsZW4oaW5zdHJpbmcpOgogICAgICAgICAgICByZXR1cm4gbG9jKzEsIFtdCiAgICAgICAgZWxpZiBsb2MgPiBsZW4oaW5zdHJpbmcpOgogICAgICAgICAgICByZXR1cm4gbG9jLCBbXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQoKY2xhc3MgV29yZFN0YXJ0KF9Qb3NpdGlvblRva2VuKToKICAgICIiIgogICAgTWF0Y2hlcyBpZiB0aGUgY3VycmVudCBwb3NpdGlvbiBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgV29yZCwgYW5kCiAgICBpcyBub3QgcHJlY2VkZWQgYnkgYW55IGNoYXJhY3RlciBpbiBhIGdpdmVuIHNldCBvZiBDe3dvcmRDaGFyc30KICAgIChkZWZhdWx0PUN7cHJpbnRhYmxlc30pLiBUbyBlbXVsYXRlIHRoZSBDe1xifSBiZWhhdmlvciBvZiByZWd1bGFyIGV4cHJlc3Npb25zLAogICAgdXNlIEN7V29yZFN0YXJ0KGFscGhhbnVtcyl9LiBDe1dvcmRTdGFydH0gd2lsbCBhbHNvIG1hdGNoIGF0IHRoZSBiZWdpbm5pbmcgb2YKICAgIHRoZSBzdHJpbmcgYmVpbmcgcGFyc2VkLCBvciBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZS4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHdvcmRDaGFycyA9IHByaW50YWJsZXMpOgogICAgICAgIHN1cGVyKFdvcmRTdGFydCxzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi53b3JkQ2hhcnMgPSBzZXQod29yZENoYXJzKQogICAgICAgIHNlbGYuZXJybXNnID0gIk5vdCBhdCB0aGUgc3RhcnQgb2YgYSB3b3JkIgoKICAgIGRlZiBwYXJzZUltcGwoc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToKICAgICAgICBpZiBsb2MgIT0gMDoKICAgICAgICAgICAgaWYgKGluc3RyaW5nW2xvYy0xXSBpbiBzZWxmLndvcmRDaGFycyBvcgogICAgICAgICAgICAgICAgaW5zdHJpbmdbbG9jXSBub3QgaW4gc2VsZi53b3JkQ2hhcnMpOgogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpCiAgICAgICAgcmV0dXJuIGxvYywgW10KCmNsYXNzIFdvcmRFbmQoX1Bvc2l0aW9uVG9rZW4pOgogICAgIiIiCiAgICBNYXRjaGVzIGlmIHRoZSBjdXJyZW50IHBvc2l0aW9uIGlzIGF0IHRoZSBlbmQgb2YgYSBXb3JkLCBhbmQKICAgIGlzIG5vdCBmb2xsb3dlZCBieSBhbnkgY2hhcmFjdGVyIGluIGEgZ2l2ZW4gc2V0IG9mIEN7d29yZENoYXJzfQogICAgKGRlZmF1bHQ9Q3twcmludGFibGVzfSkuIFRvIGVtdWxhdGUgdGhlIEN7XGJ9IGJlaGF2aW9yIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMsCiAgICB1c2UgQ3tXb3JkRW5kKGFscGhhbnVtcyl9LiBDe1dvcmRFbmR9IHdpbGwgYWxzbyBtYXRjaCBhdCB0aGUgZW5kIG9mCiAgICB0aGUgc3RyaW5nIGJlaW5nIHBhcnNlZCwgb3IgYXQgdGhlIGVuZCBvZiBhIGxpbmUuCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3b3JkQ2hhcnMgPSBwcmludGFibGVzKToKICAgICAgICBzdXBlcihXb3JkRW5kLHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLndvcmRDaGFycyA9IHNldCh3b3JkQ2hhcnMpCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IEZhbHNlCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiTm90IGF0IHRoZSBlbmQgb2YgYSB3b3JkIgoKICAgIGRlZiBwYXJzZUltcGwoc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToKICAgICAgICBpbnN0cmxlbiA9IGxlbihpbnN0cmluZykKICAgICAgICBpZiBpbnN0cmxlbj4wIGFuZCBsb2M8aW5zdHJsZW46CiAgICAgICAgICAgIGlmIChpbnN0cmluZ1tsb2NdIGluIHNlbGYud29yZENoYXJzIG9yCiAgICAgICAgICAgICAgICBpbnN0cmluZ1tsb2MtMV0gbm90IGluIHNlbGYud29yZENoYXJzKToKICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQogICAgICAgIHJldHVybiBsb2MsIFtdCgoKY2xhc3MgUGFyc2VFeHByZXNzaW9uKFBhcnNlckVsZW1lbnQpOgogICAgIiIiCiAgICBBYnN0cmFjdCBzdWJjbGFzcyBvZiBQYXJzZXJFbGVtZW50LCBmb3IgY29tYmluaW5nIGFuZCBwb3N0LXByb2Nlc3NpbmcgcGFyc2VkIHRva2Vucy4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHBycywgc2F2ZWxpc3QgPSBGYWxzZSApOgogICAgICAgIHN1cGVyKFBhcnNlRXhwcmVzc2lvbixzZWxmKS5fX2luaXRfXyhzYXZlbGlzdCkKICAgICAgICBpZiBpc2luc3RhbmNlKCBleHBycywgX2dlbmVyYXRvclR5cGUgKToKICAgICAgICAgICAgZXhwcnMgPSBsaXN0KGV4cHJzKQoKICAgICAgICBpZiBpc2luc3RhbmNlKCBleHBycywgYmFzZXN0cmluZyApOgogICAgICAgICAgICBzZWxmLmV4cHJzID0gWyBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIGV4cHJzICkgXQogICAgICAgIGVsaWYgaXNpbnN0YW5jZSggZXhwcnMsIGNvbGxlY3Rpb25zLkl0ZXJhYmxlICk6CiAgICAgICAgICAgIGV4cHJzID0gbGlzdChleHBycykKICAgICAgICAgICAgIyBpZiBzZXF1ZW5jZSBvZiBzdHJpbmdzIHByb3ZpZGVkLCB3cmFwIHdpdGggTGl0ZXJhbAogICAgICAgICAgICBpZiBhbGwoaXNpbnN0YW5jZShleHByLCBiYXNlc3RyaW5nKSBmb3IgZXhwciBpbiBleHBycyk6CiAgICAgICAgICAgICAgICBleHBycyA9IG1hcChQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MsIGV4cHJzKQogICAgICAgICAgICBzZWxmLmV4cHJzID0gbGlzdChleHBycykKICAgICAgICBlbHNlOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzZWxmLmV4cHJzID0gbGlzdCggZXhwcnMgKQogICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgogICAgICAgICAgICAgICAgc2VsZi5leHBycyA9IFsgZXhwcnMgXQogICAgICAgIHNlbGYuY2FsbFByZXBhcnNlID0gRmFsc2UKCiAgICBkZWYgX19nZXRpdGVtX18oIHNlbGYsIGkgKToKICAgICAgICByZXR1cm4gc2VsZi5leHByc1tpXQoKICAgIGRlZiBhcHBlbmQoIHNlbGYsIG90aGVyICk6CiAgICAgICAgc2VsZi5leHBycy5hcHBlbmQoIG90aGVyICkKICAgICAgICBzZWxmLnN0clJlcHIgPSBOb25lCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgbGVhdmVXaGl0ZXNwYWNlKCBzZWxmICk6CiAgICAgICAgIiIiRXh0ZW5kcyBDe2xlYXZlV2hpdGVzcGFjZX0gZGVmaW5lZCBpbiBiYXNlIGNsYXNzLCBhbmQgYWxzbyBpbnZva2VzIEN7bGVhdmVXaGl0ZXNwYWNlfSBvbgogICAgICAgICAgIGFsbCBjb250YWluZWQgZXhwcmVzc2lvbnMuIiIiCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IEZhbHNlCiAgICAgICAgc2VsZi5leHBycyA9IFsgZS5jb3B5KCkgZm9yIGUgaW4gc2VsZi5leHBycyBdCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoKICAgICAgICAgICAgZS5sZWF2ZVdoaXRlc3BhY2UoKQogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIGlnbm9yZSggc2VsZiwgb3RoZXIgKToKICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgU3VwcHJlc3MgKToKICAgICAgICAgICAgaWYgb3RoZXIgbm90IGluIHNlbGYuaWdub3JlRXhwcnM6CiAgICAgICAgICAgICAgICBzdXBlciggUGFyc2VFeHByZXNzaW9uLCBzZWxmKS5pZ25vcmUoIG90aGVyICkKICAgICAgICAgICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6CiAgICAgICAgICAgICAgICAgICAgZS5pZ25vcmUoIHNlbGYuaWdub3JlRXhwcnNbLTFdICkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzdXBlciggUGFyc2VFeHByZXNzaW9uLCBzZWxmKS5pZ25vcmUoIG90aGVyICkKICAgICAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoKICAgICAgICAgICAgICAgIGUuaWdub3JlKCBzZWxmLmlnbm9yZUV4cHJzWy0xXSApCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgX19zdHJfXyggc2VsZiApOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHN1cGVyKFBhcnNlRXhwcmVzc2lvbixzZWxmKS5fX3N0cl9fKCkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBwYXNzCgogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOgogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAiJXM6KCVzKSIgJSAoIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBfdXN0cihzZWxmLmV4cHJzKSApCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcgoKICAgIGRlZiBzdHJlYW1saW5lKCBzZWxmICk6CiAgICAgICAgc3VwZXIoUGFyc2VFeHByZXNzaW9uLHNlbGYpLnN0cmVhbWxpbmUoKQoKICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOgogICAgICAgICAgICBlLnN0cmVhbWxpbmUoKQoKICAgICAgICAjIGNvbGxhcHNlIG5lc3RlZCBBbmQncyBvZiB0aGUgZm9ybSBBbmQoIEFuZCggQW5kKCBhLGIpLCBjKSwgZCkgdG8gQW5kKCBhLGIsYyxkICkKICAgICAgICAjIGJ1dCBvbmx5IGlmIHRoZXJlIGFyZSBubyBwYXJzZSBhY3Rpb25zIG9yIHJlc3VsdHNOYW1lcyBvbiB0aGUgbmVzdGVkIEFuZCdzCiAgICAgICAgIyAobGlrZXdpc2UgZm9yIE9yJ3MgYW5kIE1hdGNoRmlyc3QncykKICAgICAgICBpZiAoIGxlbihzZWxmLmV4cHJzKSA9PSAyICk6CiAgICAgICAgICAgIG90aGVyID0gc2VsZi5leHByc1swXQogICAgICAgICAgICBpZiAoIGlzaW5zdGFuY2UoIG90aGVyLCBzZWxmLl9fY2xhc3NfXyApIGFuZAogICAgICAgICAgICAgICAgICBub3Qob3RoZXIucGFyc2VBY3Rpb24pIGFuZAogICAgICAgICAgICAgICAgICBvdGhlci5yZXN1bHRzTmFtZSBpcyBOb25lIGFuZAogICAgICAgICAgICAgICAgICBub3Qgb3RoZXIuZGVidWcgKToKICAgICAgICAgICAgICAgIHNlbGYuZXhwcnMgPSBvdGhlci5leHByc1s6XSArIFsgc2VsZi5leHByc1sxXSBdCiAgICAgICAgICAgICAgICBzZWxmLnN0clJlcHIgPSBOb25lCiAgICAgICAgICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5IHw9IG90aGVyLm1heVJldHVybkVtcHR5CiAgICAgICAgICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgIHw9IG90aGVyLm1heUluZGV4RXJyb3IKCiAgICAgICAgICAgIG90aGVyID0gc2VsZi5leHByc1stMV0KICAgICAgICAgICAgaWYgKCBpc2luc3RhbmNlKCBvdGhlciwgc2VsZi5fX2NsYXNzX18gKSBhbmQKICAgICAgICAgICAgICAgICAgbm90KG90aGVyLnBhcnNlQWN0aW9uKSBhbmQKICAgICAgICAgICAgICAgICAgb3RoZXIucmVzdWx0c05hbWUgaXMgTm9uZSBhbmQKICAgICAgICAgICAgICAgICAgbm90IG90aGVyLmRlYnVnICk6CiAgICAgICAgICAgICAgICBzZWxmLmV4cHJzID0gc2VsZi5leHByc1s6LTFdICsgb3RoZXIuZXhwcnNbOl0KICAgICAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9IE5vbmUKICAgICAgICAgICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgfD0gb3RoZXIubWF5UmV0dXJuRW1wdHkKICAgICAgICAgICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciAgfD0gb3RoZXIubWF5SW5kZXhFcnJvcgoKICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAiICsgX3VzdHIoc2VsZikKICAgICAgICAKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBzZXRSZXN1bHRzTmFtZSggc2VsZiwgbmFtZSwgbGlzdEFsbE1hdGNoZXM9RmFsc2UgKToKICAgICAgICByZXQgPSBzdXBlcihQYXJzZUV4cHJlc3Npb24sc2VsZikuc2V0UmVzdWx0c05hbWUobmFtZSxsaXN0QWxsTWF0Y2hlcykKICAgICAgICByZXR1cm4gcmV0CgogICAgZGVmIHZhbGlkYXRlKCBzZWxmLCB2YWxpZGF0ZVRyYWNlPVtdICk6CiAgICAgICAgdG1wID0gdmFsaWRhdGVUcmFjZVs6XStbc2VsZl0KICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOgogICAgICAgICAgICBlLnZhbGlkYXRlKHRtcCkKICAgICAgICBzZWxmLmNoZWNrUmVjdXJzaW9uKCBbXSApCiAgICAgICAgCiAgICBkZWYgY29weShzZWxmKToKICAgICAgICByZXQgPSBzdXBlcihQYXJzZUV4cHJlc3Npb24sc2VsZikuY29weSgpCiAgICAgICAgcmV0LmV4cHJzID0gW2UuY29weSgpIGZvciBlIGluIHNlbGYuZXhwcnNdCiAgICAgICAgcmV0dXJuIHJldAoKY2xhc3MgQW5kKFBhcnNlRXhwcmVzc2lvbik6CiAgICAiIiIKICAgIFJlcXVpcmVzIGFsbCBnaXZlbiBDe1BhcnNlRXhwcmVzc2lvbn1zIHRvIGJlIGZvdW5kIGluIHRoZSBnaXZlbiBvcmRlci4KICAgIEV4cHJlc3Npb25zIG1heSBiZSBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZS4KICAgIE1heSBiZSBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgQ3snKyd9IG9wZXJhdG9yLgogICAgTWF5IGFsc28gYmUgY29uc3RydWN0ZWQgdXNpbmcgdGhlIEN7Jy0nfSBvcGVyYXRvciwgd2hpY2ggd2lsbCBzdXBwcmVzcyBiYWNrdHJhY2tpbmcuCgogICAgRXhhbXBsZTo6CiAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykKICAgICAgICBuYW1lX2V4cHIgPSBPbmVPck1vcmUoV29yZChhbHBoYXMpKQoKICAgICAgICBleHByID0gQW5kKFtpbnRlZ2VyKCJpZCIpLG5hbWVfZXhwcigibmFtZSIpLGludGVnZXIoImFnZSIpXSkKICAgICAgICAjIG1vcmUgZWFzaWx5IHdyaXR0ZW4gYXM6CiAgICAgICAgZXhwciA9IGludGVnZXIoImlkIikgKyBuYW1lX2V4cHIoIm5hbWUiKSArIGludGVnZXIoImFnZSIpCiAgICAiIiIKCiAgICBjbGFzcyBfRXJyb3JTdG9wKEVtcHR5KToKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAgICAgc3VwZXIoQW5kLl9FcnJvclN0b3Asc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3dhcmdzKQogICAgICAgICAgICBzZWxmLm5hbWUgPSAnLScKICAgICAgICAgICAgc2VsZi5sZWF2ZVdoaXRlc3BhY2UoKQoKICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwcnMsIHNhdmVsaXN0ID0gVHJ1ZSApOgogICAgICAgIHN1cGVyKEFuZCxzZWxmKS5fX2luaXRfXyhleHBycywgc2F2ZWxpc3QpCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IGFsbChlLm1heVJldHVybkVtcHR5IGZvciBlIGluIHNlbGYuZXhwcnMpCiAgICAgICAgc2VsZi5zZXRXaGl0ZXNwYWNlQ2hhcnMoIHNlbGYuZXhwcnNbMF0ud2hpdGVDaGFycyApCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IHNlbGYuZXhwcnNbMF0uc2tpcFdoaXRlc3BhY2UKICAgICAgICBzZWxmLmNhbGxQcmVwYXJzZSA9IFRydWUKCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOgogICAgICAgICMgcGFzcyBGYWxzZSBhcyBsYXN0IGFyZyB0byBfcGFyc2UgZm9yIGZpcnN0IGVsZW1lbnQsIHNpbmNlIHdlIGFscmVhZHkKICAgICAgICAjIHByZS1wYXJzZWQgdGhlIHN0cmluZyBhcyBwYXJ0IG9mIG91ciBBbmQgcHJlLXBhcnNpbmcKICAgICAgICBsb2MsIHJlc3VsdGxpc3QgPSBzZWxmLmV4cHJzWzBdLl9wYXJzZSggaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zLCBjYWxsUHJlUGFyc2U9RmFsc2UgKQogICAgICAgIGVycm9yU3RvcCA9IEZhbHNlCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByc1sxOl06CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZSwgQW5kLl9FcnJvclN0b3ApOgogICAgICAgICAgICAgICAgZXJyb3JTdG9wID0gVHJ1ZQogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgZXJyb3JTdG9wOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGxvYywgZXhwcnRva2VucyA9IGUuX3BhcnNlKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMgKQogICAgICAgICAgICAgICAgZXhjZXB0IFBhcnNlU3ludGF4RXhjZXB0aW9uOgogICAgICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIHBlOgogICAgICAgICAgICAgICAgICAgIHBlLl9fdHJhY2ViYWNrX18gPSBOb25lCiAgICAgICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VTeW50YXhFeGNlcHRpb24uX2Zyb21fZXhjZXB0aW9uKHBlKQogICAgICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VTeW50YXhFeGNlcHRpb24oaW5zdHJpbmcsIGxlbihpbnN0cmluZyksIHNlbGYuZXJybXNnLCBzZWxmKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbG9jLCBleHBydG9rZW5zID0gZS5fcGFyc2UoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucyApCiAgICAgICAgICAgIGlmIGV4cHJ0b2tlbnMgb3IgZXhwcnRva2Vucy5oYXNrZXlzKCk6CiAgICAgICAgICAgICAgICByZXN1bHRsaXN0ICs9IGV4cHJ0b2tlbnMKICAgICAgICByZXR1cm4gbG9jLCByZXN1bHRsaXN0CgogICAgZGVmIF9faWFkZF9fKHNlbGYsIG90aGVyICk6CiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToKICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkKICAgICAgICByZXR1cm4gc2VsZi5hcHBlbmQoIG90aGVyICkgI0FuZCggWyBzZWxmLCBvdGhlciBdICkKCiAgICBkZWYgY2hlY2tSZWN1cnNpb24oIHNlbGYsIHBhcnNlRWxlbWVudExpc3QgKToKICAgICAgICBzdWJSZWNDaGVja0xpc3QgPSBwYXJzZUVsZW1lbnRMaXN0WzpdICsgWyBzZWxmIF0KICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOgogICAgICAgICAgICBlLmNoZWNrUmVjdXJzaW9uKCBzdWJSZWNDaGVja0xpc3QgKQogICAgICAgICAgICBpZiBub3QgZS5tYXlSZXR1cm5FbXB0eToKICAgICAgICAgICAgICAgIGJyZWFrCgogICAgZGVmIF9fc3RyX18oIHNlbGYgKToKICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIm5hbWUiKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQoKICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gInsiICsgIiAiLmpvaW4oX3VzdHIoZSkgZm9yIGUgaW4gc2VsZi5leHBycykgKyAifSIKCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcgoKCmNsYXNzIE9yKFBhcnNlRXhwcmVzc2lvbik6CiAgICAiIiIKICAgIFJlcXVpcmVzIHRoYXQgYXQgbGVhc3Qgb25lIEN7UGFyc2VFeHByZXNzaW9ufSBpcyBmb3VuZC4KICAgIElmIHR3byBleHByZXNzaW9ucyBtYXRjaCwgdGhlIGV4cHJlc3Npb24gdGhhdCBtYXRjaGVzIHRoZSBsb25nZXN0IHN0cmluZyB3aWxsIGJlIHVzZWQuCiAgICBNYXkgYmUgY29uc3RydWN0ZWQgdXNpbmcgdGhlIEN7J14nfSBvcGVyYXRvci4KCiAgICBFeGFtcGxlOjoKICAgICAgICAjIGNvbnN0cnVjdCBPciB1c2luZyAnXicgb3BlcmF0b3IKICAgICAgICAKICAgICAgICBudW1iZXIgPSBXb3JkKG51bXMpIF4gQ29tYmluZShXb3JkKG51bXMpICsgJy4nICsgV29yZChudW1zKSkKICAgICAgICBwcmludChudW1iZXIuc2VhcmNoU3RyaW5nKCIxMjMgMy4xNDE2IDc4OSIpKQogICAgcHJpbnRzOjoKICAgICAgICBbWycxMjMnXSwgWyczLjE0MTYnXSwgWyc3ODknXV0KICAgICIiIgogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHBycywgc2F2ZWxpc3QgPSBGYWxzZSApOgogICAgICAgIHN1cGVyKE9yLHNlbGYpLl9faW5pdF9fKGV4cHJzLCBzYXZlbGlzdCkKICAgICAgICBpZiBzZWxmLmV4cHJzOgogICAgICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gYW55KGUubWF5UmV0dXJuRW1wdHkgZm9yIGUgaW4gc2VsZi5leHBycykKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQoKICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6CiAgICAgICAgbWF4RXhjTG9jID0gLTEKICAgICAgICBtYXhFeGNlcHRpb24gPSBOb25lCiAgICAgICAgbWF0Y2hlcyA9IFtdCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgbG9jMiA9IGUudHJ5UGFyc2UoIGluc3RyaW5nLCBsb2MgKQogICAgICAgICAgICBleGNlcHQgUGFyc2VFeGNlcHRpb24gYXMgZXJyOgogICAgICAgICAgICAgICAgZXJyLl9fdHJhY2ViYWNrX18gPSBOb25lCiAgICAgICAgICAgICAgICBpZiBlcnIubG9jID4gbWF4RXhjTG9jOgogICAgICAgICAgICAgICAgICAgIG1heEV4Y2VwdGlvbiA9IGVycgogICAgICAgICAgICAgICAgICAgIG1heEV4Y0xvYyA9IGVyci5sb2MKICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CiAgICAgICAgICAgICAgICBpZiBsZW4oaW5zdHJpbmcpID4gbWF4RXhjTG9jOgogICAgICAgICAgICAgICAgICAgIG1heEV4Y2VwdGlvbiA9IFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLGxlbihpbnN0cmluZyksZS5lcnJtc2csc2VsZikKICAgICAgICAgICAgICAgICAgICBtYXhFeGNMb2MgPSBsZW4oaW5zdHJpbmcpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIHNhdmUgbWF0Y2ggYW1vbmcgYWxsIG1hdGNoZXMsIHRvIHJldHJ5IGxvbmdlc3QgdG8gc2hvcnRlc3QKICAgICAgICAgICAgICAgIG1hdGNoZXMuYXBwZW5kKChsb2MyLCBlKSkKCiAgICAgICAgaWYgbWF0Y2hlczoKICAgICAgICAgICAgbWF0Y2hlcy5zb3J0KGtleT1sYW1iZGEgeDogLXhbMF0pCiAgICAgICAgICAgIGZvciBfLGUgaW4gbWF0Y2hlczoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5fcGFyc2UoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucyApCiAgICAgICAgICAgICAgICBleGNlcHQgUGFyc2VFeGNlcHRpb24gYXMgZXJyOgogICAgICAgICAgICAgICAgICAgIGVyci5fX3RyYWNlYmFja19fID0gTm9uZQogICAgICAgICAgICAgICAgICAgIGlmIGVyci5sb2MgPiBtYXhFeGNMb2M6CiAgICAgICAgICAgICAgICAgICAgICAgIG1heEV4Y2VwdGlvbiA9IGVycgogICAgICAgICAgICAgICAgICAgICAgICBtYXhFeGNMb2MgPSBlcnIubG9jCgogICAgICAgIGlmIG1heEV4Y2VwdGlvbiBpcyBub3QgTm9uZToKICAgICAgICAgICAgbWF4RXhjZXB0aW9uLm1zZyA9IHNlbGYuZXJybXNnCiAgICAgICAgICAgIHJhaXNlIG1heEV4Y2VwdGlvbgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsICJubyBkZWZpbmVkIGFsdGVybmF0aXZlcyB0byBtYXRjaCIsIHNlbGYpCgoKICAgIGRlZiBfX2l4b3JfXyhzZWxmLCBvdGhlciApOgogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6CiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApCiAgICAgICAgcmV0dXJuIHNlbGYuYXBwZW5kKCBvdGhlciApICNPciggWyBzZWxmLCBvdGhlciBdICkKCiAgICBkZWYgX19zdHJfXyggc2VsZiApOgogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwibmFtZSIpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lCgogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOgogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAieyIgKyAiIF4gIi5qb2luKF91c3RyKGUpIGZvciBlIGluIHNlbGYuZXhwcnMpICsgIn0iCgogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHIKCiAgICBkZWYgY2hlY2tSZWN1cnNpb24oIHNlbGYsIHBhcnNlRWxlbWVudExpc3QgKToKICAgICAgICBzdWJSZWNDaGVja0xpc3QgPSBwYXJzZUVsZW1lbnRMaXN0WzpdICsgWyBzZWxmIF0KICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOgogICAgICAgICAgICBlLmNoZWNrUmVjdXJzaW9uKCBzdWJSZWNDaGVja0xpc3QgKQoKCmNsYXNzIE1hdGNoRmlyc3QoUGFyc2VFeHByZXNzaW9uKToKICAgICIiIgogICAgUmVxdWlyZXMgdGhhdCBhdCBsZWFzdCBvbmUgQ3tQYXJzZUV4cHJlc3Npb259IGlzIGZvdW5kLgogICAgSWYgdHdvIGV4cHJlc3Npb25zIG1hdGNoLCB0aGUgZmlyc3Qgb25lIGxpc3RlZCBpcyB0aGUgb25lIHRoYXQgd2lsbCBtYXRjaC4KICAgIE1heSBiZSBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgQ3snfCd9IG9wZXJhdG9yLgoKICAgIEV4YW1wbGU6OgogICAgICAgICMgY29uc3RydWN0IE1hdGNoRmlyc3QgdXNpbmcgJ3wnIG9wZXJhdG9yCiAgICAgICAgCiAgICAgICAgIyB3YXRjaCB0aGUgb3JkZXIgb2YgZXhwcmVzc2lvbnMgdG8gbWF0Y2gKICAgICAgICBudW1iZXIgPSBXb3JkKG51bXMpIHwgQ29tYmluZShXb3JkKG51bXMpICsgJy4nICsgV29yZChudW1zKSkKICAgICAgICBwcmludChudW1iZXIuc2VhcmNoU3RyaW5nKCIxMjMgMy4xNDE2IDc4OSIpKSAjICBGYWlsISAtPiBbWycxMjMnXSwgWyczJ10sIFsnMTQxNiddLCBbJzc4OSddXQoKICAgICAgICAjIHB1dCBtb3JlIHNlbGVjdGl2ZSBleHByZXNzaW9uIGZpcnN0CiAgICAgICAgbnVtYmVyID0gQ29tYmluZShXb3JkKG51bXMpICsgJy4nICsgV29yZChudW1zKSkgfCBXb3JkKG51bXMpCiAgICAgICAgcHJpbnQobnVtYmVyLnNlYXJjaFN0cmluZygiMTIzIDMuMTQxNiA3ODkiKSkgIyAgQmV0dGVyIC0+IFtbJzEyMyddLCBbJzMuMTQxNiddLCBbJzc4OSddXQogICAgIiIiCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHJzLCBzYXZlbGlzdCA9IEZhbHNlICk6CiAgICAgICAgc3VwZXIoTWF0Y2hGaXJzdCxzZWxmKS5fX2luaXRfXyhleHBycywgc2F2ZWxpc3QpCiAgICAgICAgaWYgc2VsZi5leHByczoKICAgICAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IGFueShlLm1heVJldHVybkVtcHR5IGZvciBlIGluIHNlbGYuZXhwcnMpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUKCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOgogICAgICAgIG1heEV4Y0xvYyA9IC0xCiAgICAgICAgbWF4RXhjZXB0aW9uID0gTm9uZQogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJldCA9IGUuX3BhcnNlKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMgKQogICAgICAgICAgICAgICAgcmV0dXJuIHJldAogICAgICAgICAgICBleGNlcHQgUGFyc2VFeGNlcHRpb24gYXMgZXJyOgogICAgICAgICAgICAgICAgaWYgZXJyLmxvYyA+IG1heEV4Y0xvYzoKICAgICAgICAgICAgICAgICAgICBtYXhFeGNlcHRpb24gPSBlcnIKICAgICAgICAgICAgICAgICAgICBtYXhFeGNMb2MgPSBlcnIubG9jCiAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgogICAgICAgICAgICAgICAgaWYgbGVuKGluc3RyaW5nKSA+IG1heEV4Y0xvYzoKICAgICAgICAgICAgICAgICAgICBtYXhFeGNlcHRpb24gPSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZyxsZW4oaW5zdHJpbmcpLGUuZXJybXNnLHNlbGYpCiAgICAgICAgICAgICAgICAgICAgbWF4RXhjTG9jID0gbGVuKGluc3RyaW5nKQoKICAgICAgICAjIG9ubHkgZ290IGhlcmUgaWYgbm8gZXhwcmVzc2lvbiBtYXRjaGVkLCByYWlzZSBleGNlcHRpb24gZm9yIG1hdGNoIHRoYXQgbWFkZSBpdCB0aGUgZnVydGhlc3QKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBtYXhFeGNlcHRpb24gaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBtYXhFeGNlcHRpb24ubXNnID0gc2VsZi5lcnJtc2cKICAgICAgICAgICAgICAgIHJhaXNlIG1heEV4Y2VwdGlvbgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgIm5vIGRlZmluZWQgYWx0ZXJuYXRpdmVzIHRvIG1hdGNoIiwgc2VsZikKCiAgICBkZWYgX19pb3JfXyhzZWxmLCBvdGhlciApOgogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6CiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApCiAgICAgICAgcmV0dXJuIHNlbGYuYXBwZW5kKCBvdGhlciApICNNYXRjaEZpcnN0KCBbIHNlbGYsIG90aGVyIF0gKQoKICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6CiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJuYW1lIik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUKCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJ7IiArICIgfCAiLmpvaW4oX3VzdHIoZSkgZm9yIGUgaW4gc2VsZi5leHBycykgKyAifSIKCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcgoKICAgIGRlZiBjaGVja1JlY3Vyc2lvbiggc2VsZiwgcGFyc2VFbGVtZW50TGlzdCApOgogICAgICAgIHN1YlJlY0NoZWNrTGlzdCA9IHBhcnNlRWxlbWVudExpc3RbOl0gKyBbIHNlbGYgXQogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6CiAgICAgICAgICAgIGUuY2hlY2tSZWN1cnNpb24oIHN1YlJlY0NoZWNrTGlzdCApCgoKY2xhc3MgRWFjaChQYXJzZUV4cHJlc3Npb24pOgogICAgIiIiCiAgICBSZXF1aXJlcyBhbGwgZ2l2ZW4gQ3tQYXJzZUV4cHJlc3Npb259cyB0byBiZSBmb3VuZCwgYnV0IGluIGFueSBvcmRlci4KICAgIEV4cHJlc3Npb25zIG1heSBiZSBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZS4KICAgIE1heSBiZSBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgQ3snJid9IG9wZXJhdG9yLgoKICAgIEV4YW1wbGU6OgogICAgICAgIGNvbG9yID0gb25lT2YoIlJFRCBPUkFOR0UgWUVMTE9XIEdSRUVOIEJMVUUgUFVSUExFIEJMQUNLIFdISVRFIEJST1dOIikKICAgICAgICBzaGFwZV90eXBlID0gb25lT2YoIlNRVUFSRSBDSVJDTEUgVFJJQU5HTEUgU1RBUiBIRVhBR09OIE9DVEFHT04iKQogICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpCiAgICAgICAgc2hhcGVfYXR0ciA9ICJzaGFwZToiICsgc2hhcGVfdHlwZSgic2hhcGUiKQogICAgICAgIHBvc25fYXR0ciA9ICJwb3NuOiIgKyBHcm91cChpbnRlZ2VyKCJ4IikgKyAnLCcgKyBpbnRlZ2VyKCJ5IikpKCJwb3NuIikKICAgICAgICBjb2xvcl9hdHRyID0gImNvbG9yOiIgKyBjb2xvcigiY29sb3IiKQogICAgICAgIHNpemVfYXR0ciA9ICJzaXplOiIgKyBpbnRlZ2VyKCJzaXplIikKCiAgICAgICAgIyB1c2UgRWFjaCAodXNpbmcgb3BlcmF0b3IgJyYnKSB0byBhY2NlcHQgYXR0cmlidXRlcyBpbiBhbnkgb3JkZXIgCiAgICAgICAgIyAoc2hhcGUgYW5kIHBvc24gYXJlIHJlcXVpcmVkLCBjb2xvciBhbmQgc2l6ZSBhcmUgb3B0aW9uYWwpCiAgICAgICAgc2hhcGVfc3BlYyA9IHNoYXBlX2F0dHIgJiBwb3NuX2F0dHIgJiBPcHRpb25hbChjb2xvcl9hdHRyKSAmIE9wdGlvbmFsKHNpemVfYXR0cikKCiAgICAgICAgc2hhcGVfc3BlYy5ydW5UZXN0cygnJycKICAgICAgICAgICAgc2hhcGU6IFNRVUFSRSBjb2xvcjogQkxBQ0sgcG9zbjogMTAwLCAxMjAKICAgICAgICAgICAgc2hhcGU6IENJUkNMRSBzaXplOiA1MCBjb2xvcjogQkxVRSBwb3NuOiA1MCw4MAogICAgICAgICAgICBjb2xvcjpHUkVFTiBzaXplOjIwIHNoYXBlOlRSSUFOR0xFIHBvc246MjAsNDAKICAgICAgICAgICAgJycnCiAgICAgICAgICAgICkKICAgIHByaW50czo6CiAgICAgICAgc2hhcGU6IFNRVUFSRSBjb2xvcjogQkxBQ0sgcG9zbjogMTAwLCAxMjAKICAgICAgICBbJ3NoYXBlOicsICdTUVVBUkUnLCAnY29sb3I6JywgJ0JMQUNLJywgJ3Bvc246JywgWycxMDAnLCAnLCcsICcxMjAnXV0KICAgICAgICAtIGNvbG9yOiBCTEFDSwogICAgICAgIC0gcG9zbjogWycxMDAnLCAnLCcsICcxMjAnXQogICAgICAgICAgLSB4OiAxMDAKICAgICAgICAgIC0geTogMTIwCiAgICAgICAgLSBzaGFwZTogU1FVQVJFCgoKICAgICAgICBzaGFwZTogQ0lSQ0xFIHNpemU6IDUwIGNvbG9yOiBCTFVFIHBvc246IDUwLDgwCiAgICAgICAgWydzaGFwZTonLCAnQ0lSQ0xFJywgJ3NpemU6JywgJzUwJywgJ2NvbG9yOicsICdCTFVFJywgJ3Bvc246JywgWyc1MCcsICcsJywgJzgwJ11dCiAgICAgICAgLSBjb2xvcjogQkxVRQogICAgICAgIC0gcG9zbjogWyc1MCcsICcsJywgJzgwJ10KICAgICAgICAgIC0geDogNTAKICAgICAgICAgIC0geTogODAKICAgICAgICAtIHNoYXBlOiBDSVJDTEUKICAgICAgICAtIHNpemU6IDUwCgoKICAgICAgICBjb2xvcjogR1JFRU4gc2l6ZTogMjAgc2hhcGU6IFRSSUFOR0xFIHBvc246IDIwLDQwCiAgICAgICAgWydjb2xvcjonLCAnR1JFRU4nLCAnc2l6ZTonLCAnMjAnLCAnc2hhcGU6JywgJ1RSSUFOR0xFJywgJ3Bvc246JywgWycyMCcsICcsJywgJzQwJ11dCiAgICAgICAgLSBjb2xvcjogR1JFRU4KICAgICAgICAtIHBvc246IFsnMjAnLCAnLCcsICc0MCddCiAgICAgICAgICAtIHg6IDIwCiAgICAgICAgICAtIHk6IDQwCiAgICAgICAgLSBzaGFwZTogVFJJQU5HTEUKICAgICAgICAtIHNpemU6IDIwCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwcnMsIHNhdmVsaXN0ID0gVHJ1ZSApOgogICAgICAgIHN1cGVyKEVhY2gsc2VsZikuX19pbml0X18oZXhwcnMsIHNhdmVsaXN0KQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBhbGwoZS5tYXlSZXR1cm5FbXB0eSBmb3IgZSBpbiBzZWxmLmV4cHJzKQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBUcnVlCiAgICAgICAgc2VsZi5pbml0RXhwckdyb3VwcyA9IFRydWUKCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOgogICAgICAgIGlmIHNlbGYuaW5pdEV4cHJHcm91cHM6CiAgICAgICAgICAgIHNlbGYub3B0MW1hcCA9IGRpY3QoKGlkKGUuZXhwciksZSkgZm9yIGUgaW4gc2VsZi5leHBycyBpZiBpc2luc3RhbmNlKGUsT3B0aW9uYWwpKQogICAgICAgICAgICBvcHQxID0gWyBlLmV4cHIgZm9yIGUgaW4gc2VsZi5leHBycyBpZiBpc2luc3RhbmNlKGUsT3B0aW9uYWwpIF0KICAgICAgICAgICAgb3B0MiA9IFsgZSBmb3IgZSBpbiBzZWxmLmV4cHJzIGlmIGUubWF5UmV0dXJuRW1wdHkgYW5kIG5vdCBpc2luc3RhbmNlKGUsT3B0aW9uYWwpXQogICAgICAgICAgICBzZWxmLm9wdGlvbmFscyA9IG9wdDEgKyBvcHQyCiAgICAgICAgICAgIHNlbGYubXVsdGlvcHRpb25hbHMgPSBbIGUuZXhwciBmb3IgZSBpbiBzZWxmLmV4cHJzIGlmIGlzaW5zdGFuY2UoZSxaZXJvT3JNb3JlKSBdCiAgICAgICAgICAgIHNlbGYubXVsdGlyZXF1aXJlZCA9IFsgZS5leHByIGZvciBlIGluIHNlbGYuZXhwcnMgaWYgaXNpbnN0YW5jZShlLE9uZU9yTW9yZSkgXQogICAgICAgICAgICBzZWxmLnJlcXVpcmVkID0gWyBlIGZvciBlIGluIHNlbGYuZXhwcnMgaWYgbm90IGlzaW5zdGFuY2UoZSwoT3B0aW9uYWwsWmVyb09yTW9yZSxPbmVPck1vcmUpKSBdCiAgICAgICAgICAgIHNlbGYucmVxdWlyZWQgKz0gc2VsZi5tdWx0aXJlcXVpcmVkCiAgICAgICAgICAgIHNlbGYuaW5pdEV4cHJHcm91cHMgPSBGYWxzZQogICAgICAgIHRtcExvYyA9IGxvYwogICAgICAgIHRtcFJlcWQgPSBzZWxmLnJlcXVpcmVkWzpdCiAgICAgICAgdG1wT3B0ICA9IHNlbGYub3B0aW9uYWxzWzpdCiAgICAgICAgbWF0Y2hPcmRlciA9IFtdCgogICAgICAgIGtlZXBNYXRjaGluZyA9IFRydWUKICAgICAgICB3aGlsZSBrZWVwTWF0Y2hpbmc6CiAgICAgICAgICAgIHRtcEV4cHJzID0gdG1wUmVxZCArIHRtcE9wdCArIHNlbGYubXVsdGlvcHRpb25hbHMgKyBzZWxmLm11bHRpcmVxdWlyZWQKICAgICAgICAgICAgZmFpbGVkID0gW10KICAgICAgICAgICAgZm9yIGUgaW4gdG1wRXhwcnM6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgdG1wTG9jID0gZS50cnlQYXJzZSggaW5zdHJpbmcsIHRtcExvYyApCiAgICAgICAgICAgICAgICBleGNlcHQgUGFyc2VFeGNlcHRpb246CiAgICAgICAgICAgICAgICAgICAgZmFpbGVkLmFwcGVuZChlKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBtYXRjaE9yZGVyLmFwcGVuZChzZWxmLm9wdDFtYXAuZ2V0KGlkKGUpLGUpKQogICAgICAgICAgICAgICAgICAgIGlmIGUgaW4gdG1wUmVxZDoKICAgICAgICAgICAgICAgICAgICAgICAgdG1wUmVxZC5yZW1vdmUoZSkKICAgICAgICAgICAgICAgICAgICBlbGlmIGUgaW4gdG1wT3B0OgogICAgICAgICAgICAgICAgICAgICAgICB0bXBPcHQucmVtb3ZlKGUpCiAgICAgICAgICAgIGlmIGxlbihmYWlsZWQpID09IGxlbih0bXBFeHBycyk6CiAgICAgICAgICAgICAgICBrZWVwTWF0Y2hpbmcgPSBGYWxzZQoKICAgICAgICBpZiB0bXBSZXFkOgogICAgICAgICAgICBtaXNzaW5nID0gIiwgIi5qb2luKF91c3RyKGUpIGZvciBlIGluIHRtcFJlcWQpCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLGxvYywiTWlzc2luZyBvbmUgb3IgbW9yZSByZXF1aXJlZCBlbGVtZW50cyAoJXMpIiAlIG1pc3NpbmcgKQoKICAgICAgICAjIGFkZCBhbnkgdW5tYXRjaGVkIE9wdGlvbmFscywgaW4gY2FzZSB0aGV5IGhhdmUgZGVmYXVsdCB2YWx1ZXMgZGVmaW5lZAogICAgICAgIG1hdGNoT3JkZXIgKz0gW2UgZm9yIGUgaW4gc2VsZi5leHBycyBpZiBpc2luc3RhbmNlKGUsT3B0aW9uYWwpIGFuZCBlLmV4cHIgaW4gdG1wT3B0XQoKICAgICAgICByZXN1bHRsaXN0ID0gW10KICAgICAgICBmb3IgZSBpbiBtYXRjaE9yZGVyOgogICAgICAgICAgICBsb2MscmVzdWx0cyA9IGUuX3BhcnNlKGluc3RyaW5nLGxvYyxkb0FjdGlvbnMpCiAgICAgICAgICAgIHJlc3VsdGxpc3QuYXBwZW5kKHJlc3VsdHMpCgogICAgICAgIGZpbmFsUmVzdWx0cyA9IHN1bShyZXN1bHRsaXN0LCBQYXJzZVJlc3VsdHMoW10pKQogICAgICAgIHJldHVybiBsb2MsIGZpbmFsUmVzdWx0cwoKICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6CiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJuYW1lIik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUKCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJ7IiArICIgJiAiLmpvaW4oX3VzdHIoZSkgZm9yIGUgaW4gc2VsZi5leHBycykgKyAifSIKCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcgoKICAgIGRlZiBjaGVja1JlY3Vyc2lvbiggc2VsZiwgcGFyc2VFbGVtZW50TGlzdCApOgogICAgICAgIHN1YlJlY0NoZWNrTGlzdCA9IHBhcnNlRWxlbWVudExpc3RbOl0gKyBbIHNlbGYgXQogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6CiAgICAgICAgICAgIGUuY2hlY2tSZWN1cnNpb24oIHN1YlJlY0NoZWNrTGlzdCApCgoKY2xhc3MgUGFyc2VFbGVtZW50RW5oYW5jZShQYXJzZXJFbGVtZW50KToKICAgICIiIgogICAgQWJzdHJhY3Qgc3ViY2xhc3Mgb2YgQ3tQYXJzZXJFbGVtZW50fSwgZm9yIGNvbWJpbmluZyBhbmQgcG9zdC1wcm9jZXNzaW5nIHBhcnNlZCB0b2tlbnMuCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciwgc2F2ZWxpc3Q9RmFsc2UgKToKICAgICAgICBzdXBlcihQYXJzZUVsZW1lbnRFbmhhbmNlLHNlbGYpLl9faW5pdF9fKHNhdmVsaXN0KQogICAgICAgIGlmIGlzaW5zdGFuY2UoIGV4cHIsIGJhc2VzdHJpbmcgKToKICAgICAgICAgICAgaWYgaXNzdWJjbGFzcyhQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MsIFRva2VuKToKICAgICAgICAgICAgICAgIGV4cHIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoZXhwcikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGV4cHIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoTGl0ZXJhbChleHByKSkKICAgICAgICBzZWxmLmV4cHIgPSBleHByCiAgICAgICAgc2VsZi5zdHJSZXByID0gTm9uZQogICAgICAgIGlmIGV4cHIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IGV4cHIubWF5SW5kZXhFcnJvcgogICAgICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gZXhwci5tYXlSZXR1cm5FbXB0eQogICAgICAgICAgICBzZWxmLnNldFdoaXRlc3BhY2VDaGFycyggZXhwci53aGl0ZUNoYXJzICkKICAgICAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IGV4cHIuc2tpcFdoaXRlc3BhY2UKICAgICAgICAgICAgc2VsZi5zYXZlQXNMaXN0ID0gZXhwci5zYXZlQXNMaXN0CiAgICAgICAgICAgIHNlbGYuY2FsbFByZXBhcnNlID0gZXhwci5jYWxsUHJlcGFyc2UKICAgICAgICAgICAgc2VsZi5pZ25vcmVFeHBycy5leHRlbmQoZXhwci5pZ25vcmVFeHBycykKCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOgogICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuZXhwci5fcGFyc2UoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucywgY2FsbFByZVBhcnNlPUZhbHNlICkKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbigiIixsb2Msc2VsZi5lcnJtc2csc2VsZikKCiAgICBkZWYgbGVhdmVXaGl0ZXNwYWNlKCBzZWxmICk6CiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IEZhbHNlCiAgICAgICAgc2VsZi5leHByID0gc2VsZi5leHByLmNvcHkoKQogICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5leHByLmxlYXZlV2hpdGVzcGFjZSgpCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgaWdub3JlKCBzZWxmLCBvdGhlciApOgogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBTdXBwcmVzcyApOgogICAgICAgICAgICBpZiBvdGhlciBub3QgaW4gc2VsZi5pZ25vcmVFeHByczoKICAgICAgICAgICAgICAgIHN1cGVyKCBQYXJzZUVsZW1lbnRFbmhhbmNlLCBzZWxmKS5pZ25vcmUoIG90aGVyICkKICAgICAgICAgICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICBzZWxmLmV4cHIuaWdub3JlKCBzZWxmLmlnbm9yZUV4cHJzWy0xXSApCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc3VwZXIoIFBhcnNlRWxlbWVudEVuaGFuY2UsIHNlbGYpLmlnbm9yZSggb3RoZXIgKQogICAgICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBzZWxmLmV4cHIuaWdub3JlKCBzZWxmLmlnbm9yZUV4cHJzWy0xXSApCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgc3RyZWFtbGluZSggc2VsZiApOgogICAgICAgIHN1cGVyKFBhcnNlRWxlbWVudEVuaGFuY2Usc2VsZikuc3RyZWFtbGluZSgpCiAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLmV4cHIuc3RyZWFtbGluZSgpCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgY2hlY2tSZWN1cnNpb24oIHNlbGYsIHBhcnNlRWxlbWVudExpc3QgKToKICAgICAgICBpZiBzZWxmIGluIHBhcnNlRWxlbWVudExpc3Q6CiAgICAgICAgICAgIHJhaXNlIFJlY3Vyc2l2ZUdyYW1tYXJFeGNlcHRpb24oIHBhcnNlRWxlbWVudExpc3QrW3NlbGZdICkKICAgICAgICBzdWJSZWNDaGVja0xpc3QgPSBwYXJzZUVsZW1lbnRMaXN0WzpdICsgWyBzZWxmIF0KICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYuZXhwci5jaGVja1JlY3Vyc2lvbiggc3ViUmVjQ2hlY2tMaXN0ICkKCiAgICBkZWYgdmFsaWRhdGUoIHNlbGYsIHZhbGlkYXRlVHJhY2U9W10gKToKICAgICAgICB0bXAgPSB2YWxpZGF0ZVRyYWNlWzpdK1tzZWxmXQogICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5leHByLnZhbGlkYXRlKHRtcCkKICAgICAgICBzZWxmLmNoZWNrUmVjdXJzaW9uKCBbXSApCgogICAgZGVmIF9fc3RyX18oIHNlbGYgKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzdXBlcihQYXJzZUVsZW1lbnRFbmhhbmNlLHNlbGYpLl9fc3RyX18oKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmUgYW5kIHNlbGYuZXhwciBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gIiVzOiglcykiICUgKCBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgX3VzdHIoc2VsZi5leHByKSApCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcgoKCmNsYXNzIEZvbGxvd2VkQnkoUGFyc2VFbGVtZW50RW5oYW5jZSk6CiAgICAiIiIKICAgIExvb2thaGVhZCBtYXRjaGluZyBvZiB0aGUgZ2l2ZW4gcGFyc2UgZXhwcmVzc2lvbi4gIEN7Rm9sbG93ZWRCeX0KICAgIGRvZXMgSXtub3R9IGFkdmFuY2UgdGhlIHBhcnNpbmcgcG9zaXRpb24gd2l0aGluIHRoZSBpbnB1dCBzdHJpbmcsIGl0IG9ubHkKICAgIHZlcmlmaWVzIHRoYXQgdGhlIHNwZWNpZmllZCBwYXJzZSBleHByZXNzaW9uIG1hdGNoZXMgYXQgdGhlIGN1cnJlbnQKICAgIHBvc2l0aW9uLiAgQ3tGb2xsb3dlZEJ5fSBhbHdheXMgcmV0dXJucyBhIG51bGwgdG9rZW4gbGlzdC4KCiAgICBFeGFtcGxlOjoKICAgICAgICAjIHVzZSBGb2xsb3dlZEJ5IHRvIG1hdGNoIGEgbGFiZWwgb25seSBpZiBpdCBpcyBmb2xsb3dlZCBieSBhICc6JwogICAgICAgIGRhdGFfd29yZCA9IFdvcmQoYWxwaGFzKQogICAgICAgIGxhYmVsID0gZGF0YV93b3JkICsgRm9sbG93ZWRCeSgnOicpCiAgICAgICAgYXR0cl9leHByID0gR3JvdXAobGFiZWwgKyBTdXBwcmVzcygnOicpICsgT25lT3JNb3JlKGRhdGFfd29yZCwgc3RvcE9uPWxhYmVsKS5zZXRQYXJzZUFjdGlvbignICcuam9pbikpCiAgICAgICAgCiAgICAgICAgT25lT3JNb3JlKGF0dHJfZXhwcikucGFyc2VTdHJpbmcoInNoYXBlOiBTUVVBUkUgY29sb3I6IEJMQUNLIHBvc246IHVwcGVyIGxlZnQiKS5wcHJpbnQoKQogICAgcHJpbnRzOjoKICAgICAgICBbWydzaGFwZScsICdTUVVBUkUnXSwgWydjb2xvcicsICdCTEFDSyddLCBbJ3Bvc24nLCAndXBwZXIgbGVmdCddXQogICAgIiIiCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHIgKToKICAgICAgICBzdXBlcihGb2xsb3dlZEJ5LHNlbGYpLl9faW5pdF9fKGV4cHIpCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUKCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOgogICAgICAgIHNlbGYuZXhwci50cnlQYXJzZSggaW5zdHJpbmcsIGxvYyApCiAgICAgICAgcmV0dXJuIGxvYywgW10KCgpjbGFzcyBOb3RBbnkoUGFyc2VFbGVtZW50RW5oYW5jZSk6CiAgICAiIiIKICAgIExvb2thaGVhZCB0byBkaXNhbGxvdyBtYXRjaGluZyB3aXRoIHRoZSBnaXZlbiBwYXJzZSBleHByZXNzaW9uLiAgQ3tOb3RBbnl9CiAgICBkb2VzIEl7bm90fSBhZHZhbmNlIHRoZSBwYXJzaW5nIHBvc2l0aW9uIHdpdGhpbiB0aGUgaW5wdXQgc3RyaW5nLCBpdCBvbmx5CiAgICB2ZXJpZmllcyB0aGF0IHRoZSBzcGVjaWZpZWQgcGFyc2UgZXhwcmVzc2lvbiBkb2VzIEl7bm90fSBtYXRjaCBhdCB0aGUgY3VycmVudAogICAgcG9zaXRpb24uICBBbHNvLCBDe05vdEFueX0gZG9lcyBJe25vdH0gc2tpcCBvdmVyIGxlYWRpbmcgd2hpdGVzcGFjZS4gQ3tOb3RBbnl9CiAgICBhbHdheXMgcmV0dXJucyBhIG51bGwgdG9rZW4gbGlzdC4gIE1heSBiZSBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgJ34nIG9wZXJhdG9yLgoKICAgIEV4YW1wbGU6OgogICAgICAgIAogICAgIiIiCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHIgKToKICAgICAgICBzdXBlcihOb3RBbnksc2VsZikuX19pbml0X18oZXhwcikKICAgICAgICAjfiBzZWxmLmxlYXZlV2hpdGVzcGFjZSgpCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IEZhbHNlICAjIGRvIE5PVCB1c2Ugc2VsZi5sZWF2ZVdoaXRlc3BhY2UoKSwgZG9uJ3Qgd2FudCB0byBwcm9wYWdhdGUgdG8gZXhwcnMKICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQogICAgICAgIHNlbGYuZXJybXNnID0gIkZvdW5kIHVud2FudGVkIHRva2VuLCAiK191c3RyKHNlbGYuZXhwcikKCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOgogICAgICAgIGlmIHNlbGYuZXhwci5jYW5QYXJzZU5leHQoaW5zdHJpbmcsIGxvYyk6CiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQogICAgICAgIHJldHVybiBsb2MsIFtdCgogICAgZGVmIF9fc3RyX18oIHNlbGYgKToKICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIm5hbWUiKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQoKICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gIn57IiArIF91c3RyKHNlbGYuZXhwcikgKyAifSIKCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcgoKY2xhc3MgX011bHRpcGxlTWF0Y2goUGFyc2VFbGVtZW50RW5oYW5jZSk6CiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHIsIHN0b3BPbj1Ob25lKToKICAgICAgICBzdXBlcihfTXVsdGlwbGVNYXRjaCwgc2VsZikuX19pbml0X18oZXhwcikKICAgICAgICBzZWxmLnNhdmVBc0xpc3QgPSBUcnVlCiAgICAgICAgZW5kZXIgPSBzdG9wT24KICAgICAgICBpZiBpc2luc3RhbmNlKGVuZGVyLCBiYXNlc3RyaW5nKToKICAgICAgICAgICAgZW5kZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoZW5kZXIpCiAgICAgICAgc2VsZi5ub3RfZW5kZXIgPSB+ZW5kZXIgaWYgZW5kZXIgaXMgbm90IE5vbmUgZWxzZSBOb25lCgogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToKICAgICAgICBzZWxmX2V4cHJfcGFyc2UgPSBzZWxmLmV4cHIuX3BhcnNlCiAgICAgICAgc2VsZl9za2lwX2lnbm9yYWJsZXMgPSBzZWxmLl9za2lwSWdub3JhYmxlcwogICAgICAgIGNoZWNrX2VuZGVyID0gc2VsZi5ub3RfZW5kZXIgaXMgbm90IE5vbmUKICAgICAgICBpZiBjaGVja19lbmRlcjoKICAgICAgICAgICAgdHJ5X25vdF9lbmRlciA9IHNlbGYubm90X2VuZGVyLnRyeVBhcnNlCiAgICAgICAgCiAgICAgICAgIyBtdXN0IGJlIGF0IGxlYXN0IG9uZSAoYnV0IGZpcnN0IHNlZSBpZiB3ZSBhcmUgdGhlIHN0b3BPbiBzZW50aW5lbDsKICAgICAgICAjIGlmIHNvLCBmYWlsKQogICAgICAgIGlmIGNoZWNrX2VuZGVyOgogICAgICAgICAgICB0cnlfbm90X2VuZGVyKGluc3RyaW5nLCBsb2MpCiAgICAgICAgbG9jLCB0b2tlbnMgPSBzZWxmX2V4cHJfcGFyc2UoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucywgY2FsbFByZVBhcnNlPUZhbHNlICkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGhhc0lnbm9yZUV4cHJzID0gKG5vdCBub3Qgc2VsZi5pZ25vcmVFeHBycykKICAgICAgICAgICAgd2hpbGUgMToKICAgICAgICAgICAgICAgIGlmIGNoZWNrX2VuZGVyOgogICAgICAgICAgICAgICAgICAgIHRyeV9ub3RfZW5kZXIoaW5zdHJpbmcsIGxvYykKICAgICAgICAgICAgICAgIGlmIGhhc0lnbm9yZUV4cHJzOgogICAgICAgICAgICAgICAgICAgIHByZWxvYyA9IHNlbGZfc2tpcF9pZ25vcmFibGVzKCBpbnN0cmluZywgbG9jICkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcHJlbG9jID0gbG9jCiAgICAgICAgICAgICAgICBsb2MsIHRtcHRva2VucyA9IHNlbGZfZXhwcl9wYXJzZSggaW5zdHJpbmcsIHByZWxvYywgZG9BY3Rpb25zICkKICAgICAgICAgICAgICAgIGlmIHRtcHRva2VucyBvciB0bXB0b2tlbnMuaGFza2V5cygpOgogICAgICAgICAgICAgICAgICAgIHRva2VucyArPSB0bXB0b2tlbnMKICAgICAgICBleGNlcHQgKFBhcnNlRXhjZXB0aW9uLEluZGV4RXJyb3IpOgogICAgICAgICAgICBwYXNzCgogICAgICAgIHJldHVybiBsb2MsIHRva2VucwogICAgICAgIApjbGFzcyBPbmVPck1vcmUoX011bHRpcGxlTWF0Y2gpOgogICAgIiIiCiAgICBSZXBldGl0aW9uIG9mIG9uZSBvciBtb3JlIG9mIHRoZSBnaXZlbiBleHByZXNzaW9uLgogICAgCiAgICBQYXJhbWV0ZXJzOgogICAgIC0gZXhwciAtIGV4cHJlc3Npb24gdGhhdCBtdXN0IG1hdGNoIG9uZSBvciBtb3JlIHRpbWVzCiAgICAgLSBzdG9wT24gLSAoZGVmYXVsdD1De05vbmV9KSAtIGV4cHJlc3Npb24gZm9yIGEgdGVybWluYXRpbmcgc2VudGluZWwKICAgICAgICAgIChvbmx5IHJlcXVpcmVkIGlmIHRoZSBzZW50aW5lbCB3b3VsZCBvcmRpbmFyaWx5IG1hdGNoIHRoZSByZXBldGl0aW9uIAogICAgICAgICAgZXhwcmVzc2lvbikgICAgICAgICAgCgogICAgRXhhbXBsZTo6CiAgICAgICAgZGF0YV93b3JkID0gV29yZChhbHBoYXMpCiAgICAgICAgbGFiZWwgPSBkYXRhX3dvcmQgKyBGb2xsb3dlZEJ5KCc6JykKICAgICAgICBhdHRyX2V4cHIgPSBHcm91cChsYWJlbCArIFN1cHByZXNzKCc6JykgKyBPbmVPck1vcmUoZGF0YV93b3JkKS5zZXRQYXJzZUFjdGlvbignICcuam9pbikpCgogICAgICAgIHRleHQgPSAic2hhcGU6IFNRVUFSRSBwb3NuOiB1cHBlciBsZWZ0IGNvbG9yOiBCTEFDSyIKICAgICAgICBPbmVPck1vcmUoYXR0cl9leHByKS5wYXJzZVN0cmluZyh0ZXh0KS5wcHJpbnQoKSAgIyBGYWlsISByZWFkICdjb2xvcicgYXMgZGF0YSBpbnN0ZWFkIG9mIG5leHQgbGFiZWwgLT4gW1snc2hhcGUnLCAnU1FVQVJFIGNvbG9yJ11dCgogICAgICAgICMgdXNlIHN0b3BPbiBhdHRyaWJ1dGUgZm9yIE9uZU9yTW9yZSB0byBhdm9pZCByZWFkaW5nIGxhYmVsIHN0cmluZyBhcyBwYXJ0IG9mIHRoZSBkYXRhCiAgICAgICAgYXR0cl9leHByID0gR3JvdXAobGFiZWwgKyBTdXBwcmVzcygnOicpICsgT25lT3JNb3JlKGRhdGFfd29yZCwgc3RvcE9uPWxhYmVsKS5zZXRQYXJzZUFjdGlvbignICcuam9pbikpCiAgICAgICAgT25lT3JNb3JlKGF0dHJfZXhwcikucGFyc2VTdHJpbmcodGV4dCkucHByaW50KCkgIyBCZXR0ZXIgLT4gW1snc2hhcGUnLCAnU1FVQVJFJ10sIFsncG9zbicsICd1cHBlciBsZWZ0J10sIFsnY29sb3InLCAnQkxBQ0snXV0KICAgICAgICAKICAgICAgICAjIGNvdWxkIGFsc28gYmUgd3JpdHRlbiBhcwogICAgICAgIChhdHRyX2V4cHIgKiAoMSwpKS5wYXJzZVN0cmluZyh0ZXh0KS5wcHJpbnQoKQogICAgIiIiCgogICAgZGVmIF9fc3RyX18oIHNlbGYgKToKICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIm5hbWUiKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQoKICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gInsiICsgX3VzdHIoc2VsZi5leHByKSArICJ9Li4uIgoKICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByCgpjbGFzcyBaZXJvT3JNb3JlKF9NdWx0aXBsZU1hdGNoKToKICAgICIiIgogICAgT3B0aW9uYWwgcmVwZXRpdGlvbiBvZiB6ZXJvIG9yIG1vcmUgb2YgdGhlIGdpdmVuIGV4cHJlc3Npb24uCiAgICAKICAgIFBhcmFtZXRlcnM6CiAgICAgLSBleHByIC0gZXhwcmVzc2lvbiB0aGF0IG11c3QgbWF0Y2ggemVybyBvciBtb3JlIHRpbWVzCiAgICAgLSBzdG9wT24gLSAoZGVmYXVsdD1De05vbmV9KSAtIGV4cHJlc3Npb24gZm9yIGEgdGVybWluYXRpbmcgc2VudGluZWwKICAgICAgICAgIChvbmx5IHJlcXVpcmVkIGlmIHRoZSBzZW50aW5lbCB3b3VsZCBvcmRpbmFyaWx5IG1hdGNoIHRoZSByZXBldGl0aW9uIAogICAgICAgICAgZXhwcmVzc2lvbikgICAgICAgICAgCgogICAgRXhhbXBsZTogc2ltaWxhciB0byBMe09uZU9yTW9yZX0KICAgICIiIgogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByLCBzdG9wT249Tm9uZSk6CiAgICAgICAgc3VwZXIoWmVyb09yTW9yZSxzZWxmKS5fX2luaXRfXyhleHByLCBzdG9wT249c3RvcE9uKQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlCiAgICAgICAgCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHN1cGVyKFplcm9Pck1vcmUsIHNlbGYpLnBhcnNlSW1wbChpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMpCiAgICAgICAgZXhjZXB0IChQYXJzZUV4Y2VwdGlvbixJbmRleEVycm9yKToKICAgICAgICAgICAgcmV0dXJuIGxvYywgW10KCiAgICBkZWYgX19zdHJfXyggc2VsZiApOgogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwibmFtZSIpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lCgogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOgogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAiWyIgKyBfdXN0cihzZWxmLmV4cHIpICsgIl0uLi4iCgogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHIKCmNsYXNzIF9OdWxsVG9rZW4ob2JqZWN0KToKICAgIGRlZiBfX2Jvb2xfXyhzZWxmKToKICAgICAgICByZXR1cm4gRmFsc2UKICAgIF9fbm9uemVyb19fID0gX19ib29sX18KICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiIgoKX29wdGlvbmFsTm90TWF0Y2hlZCA9IF9OdWxsVG9rZW4oKQpjbGFzcyBPcHRpb25hbChQYXJzZUVsZW1lbnRFbmhhbmNlKToKICAgICIiIgogICAgT3B0aW9uYWwgbWF0Y2hpbmcgb2YgdGhlIGdpdmVuIGV4cHJlc3Npb24uCgogICAgUGFyYW1ldGVyczoKICAgICAtIGV4cHIgLSBleHByZXNzaW9uIHRoYXQgbXVzdCBtYXRjaCB6ZXJvIG9yIG1vcmUgdGltZXMKICAgICAtIGRlZmF1bHQgKG9wdGlvbmFsKSAtIHZhbHVlIHRvIGJlIHJldHVybmVkIGlmIHRoZSBvcHRpb25hbCBleHByZXNzaW9uIGlzIG5vdCBmb3VuZC4KCiAgICBFeGFtcGxlOjoKICAgICAgICAjIFVTIHBvc3RhbCBjb2RlIGNhbiBiZSBhIDUtZGlnaXQgemlwLCBwbHVzIG9wdGlvbmFsIDQtZGlnaXQgcXVhbGlmaWVyCiAgICAgICAgemlwID0gQ29tYmluZShXb3JkKG51bXMsIGV4YWN0PTUpICsgT3B0aW9uYWwoJy0nICsgV29yZChudW1zLCBleGFjdD00KSkpCiAgICAgICAgemlwLnJ1blRlc3RzKCcnJwogICAgICAgICAgICAjIHRyYWRpdGlvbmFsIFpJUCBjb2RlCiAgICAgICAgICAgIDEyMzQ1CiAgICAgICAgICAgIAogICAgICAgICAgICAjIFpJUCs0IGZvcm0KICAgICAgICAgICAgMTIxMDEtMDAwMQogICAgICAgICAgICAKICAgICAgICAgICAgIyBpbnZhbGlkIFpJUAogICAgICAgICAgICA5ODc2NS0KICAgICAgICAgICAgJycnKQogICAgcHJpbnRzOjoKICAgICAgICAjIHRyYWRpdGlvbmFsIFpJUCBjb2RlCiAgICAgICAgMTIzNDUKICAgICAgICBbJzEyMzQ1J10KCiAgICAgICAgIyBaSVArNCBmb3JtCiAgICAgICAgMTIxMDEtMDAwMQogICAgICAgIFsnMTIxMDEtMDAwMSddCgogICAgICAgICMgaW52YWxpZCBaSVAKICAgICAgICA5ODc2NS0KICAgICAgICAgICAgIF4KICAgICAgICBGQUlMOiBFeHBlY3RlZCBlbmQgb2YgdGV4dCAoYXQgY2hhciA1KSwgKGxpbmU6MSwgY29sOjYpCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciwgZGVmYXVsdD1fb3B0aW9uYWxOb3RNYXRjaGVkICk6CiAgICAgICAgc3VwZXIoT3B0aW9uYWwsc2VsZikuX19pbml0X18oIGV4cHIsIHNhdmVsaXN0PUZhbHNlICkKICAgICAgICBzZWxmLnNhdmVBc0xpc3QgPSBzZWxmLmV4cHIuc2F2ZUFzTGlzdAogICAgICAgIHNlbGYuZGVmYXVsdFZhbHVlID0gZGVmYXVsdAogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlCgogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGxvYywgdG9rZW5zID0gc2VsZi5leHByLl9wYXJzZSggaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zLCBjYWxsUHJlUGFyc2U9RmFsc2UgKQogICAgICAgIGV4Y2VwdCAoUGFyc2VFeGNlcHRpb24sSW5kZXhFcnJvcik6CiAgICAgICAgICAgIGlmIHNlbGYuZGVmYXVsdFZhbHVlIGlzIG5vdCBfb3B0aW9uYWxOb3RNYXRjaGVkOgogICAgICAgICAgICAgICAgaWYgc2VsZi5leHByLnJlc3VsdHNOYW1lOgogICAgICAgICAgICAgICAgICAgIHRva2VucyA9IFBhcnNlUmVzdWx0cyhbIHNlbGYuZGVmYXVsdFZhbHVlIF0pCiAgICAgICAgICAgICAgICAgICAgdG9rZW5zW3NlbGYuZXhwci5yZXN1bHRzTmFtZV0gPSBzZWxmLmRlZmF1bHRWYWx1ZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICB0b2tlbnMgPSBbIHNlbGYuZGVmYXVsdFZhbHVlIF0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHRva2VucyA9IFtdCiAgICAgICAgcmV0dXJuIGxvYywgdG9rZW5zCgogICAgZGVmIF9fc3RyX18oIHNlbGYgKToKICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIm5hbWUiKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQoKICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gIlsiICsgX3VzdHIoc2VsZi5leHByKSArICJdIgoKICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByCgpjbGFzcyBTa2lwVG8oUGFyc2VFbGVtZW50RW5oYW5jZSk6CiAgICAiIiIKICAgIFRva2VuIGZvciBza2lwcGluZyBvdmVyIGFsbCB1bmRlZmluZWQgdGV4dCB1bnRpbCB0aGUgbWF0Y2hlZCBleHByZXNzaW9uIGlzIGZvdW5kLgoKICAgIFBhcmFtZXRlcnM6CiAgICAgLSBleHByIC0gdGFyZ2V0IGV4cHJlc3Npb24gbWFya2luZyB0aGUgZW5kIG9mIHRoZSBkYXRhIHRvIGJlIHNraXBwZWQKICAgICAtIGluY2x1ZGUgLSAoZGVmYXVsdD1De0ZhbHNlfSkgaWYgVHJ1ZSwgdGhlIHRhcmdldCBleHByZXNzaW9uIGlzIGFsc28gcGFyc2VkIAogICAgICAgICAgKHRoZSBza2lwcGVkIHRleHQgYW5kIHRhcmdldCBleHByZXNzaW9uIGFyZSByZXR1cm5lZCBhcyBhIDItZWxlbWVudCBsaXN0KS4KICAgICAtIGlnbm9yZSAtIChkZWZhdWx0PUN7Tm9uZX0pIHVzZWQgdG8gZGVmaW5lIGdyYW1tYXJzICh0eXBpY2FsbHkgcXVvdGVkIHN0cmluZ3MgYW5kIAogICAgICAgICAgY29tbWVudHMpIHRoYXQgbWlnaHQgY29udGFpbiBmYWxzZSBtYXRjaGVzIHRvIHRoZSB0YXJnZXQgZXhwcmVzc2lvbgogICAgIC0gZmFpbE9uIC0gKGRlZmF1bHQ9Q3tOb25lfSkgZGVmaW5lIGV4cHJlc3Npb25zIHRoYXQgYXJlIG5vdCBhbGxvd2VkIHRvIGJlIAogICAgICAgICAgaW5jbHVkZWQgaW4gdGhlIHNraXBwZWQgdGVzdDsgaWYgZm91bmQgYmVmb3JlIHRoZSB0YXJnZXQgZXhwcmVzc2lvbiBpcyBmb3VuZCwgCiAgICAgICAgICB0aGUgU2tpcFRvIGlzIG5vdCBhIG1hdGNoCgogICAgRXhhbXBsZTo6CiAgICAgICAgcmVwb3J0ID0gJycnCiAgICAgICAgICAgIE91dHN0YW5kaW5nIElzc3VlcyBSZXBvcnQgLSAxIEphbiAyMDAwCgogICAgICAgICAgICAgICAjIHwgU2V2ZXJpdHkgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBEYXlzIE9wZW4KICAgICAgICAgICAgLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tCiAgICAgICAgICAgICAxMDEgfCBDcml0aWNhbCB8IEludGVybWl0dGVudCBzeXN0ZW0gY3Jhc2ggICAgICAgICAgICAgICAgIHwgICAgICAgICAgNgogICAgICAgICAgICAgIDk0IHwgQ29zbWV0aWMgfCBTcGVsbGluZyBlcnJvciBvbiBMb2dpbiAoJ2xvZ3xuJykgICAgICAgICB8ICAgICAgICAgMTQKICAgICAgICAgICAgICA3OSB8IE1pbm9yICAgIHwgU3lzdGVtIHNsb3cgd2hlbiBydW5uaW5nIHRvbyBtYW55IHJlcG9ydHMgfCAgICAgICAgIDQ3CiAgICAgICAgICAgICcnJwogICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpCiAgICAgICAgU0VQID0gU3VwcHJlc3MoJ3wnKQogICAgICAgICMgdXNlIFNraXBUbyB0byBzaW1wbHkgbWF0Y2ggZXZlcnl0aGluZyB1cCB1bnRpbCB0aGUgbmV4dCBTRVAKICAgICAgICAjIC0gaWdub3JlIHF1b3RlZCBzdHJpbmdzLCBzbyB0aGF0IGEgJ3wnIGNoYXJhY3RlciBpbnNpZGUgYSBxdW90ZWQgc3RyaW5nIGRvZXMgbm90IG1hdGNoCiAgICAgICAgIyAtIHBhcnNlIGFjdGlvbiB3aWxsIGNhbGwgdG9rZW4uc3RyaXAoKSBmb3IgZWFjaCBtYXRjaGVkIHRva2VuLCBpLmUuLCB0aGUgZGVzY3JpcHRpb24gYm9keQogICAgICAgIHN0cmluZ19kYXRhID0gU2tpcFRvKFNFUCwgaWdub3JlPXF1b3RlZFN0cmluZykKICAgICAgICBzdHJpbmdfZGF0YS5zZXRQYXJzZUFjdGlvbih0b2tlbk1hcChzdHIuc3RyaXApKQogICAgICAgIHRpY2tldF9leHByID0gKGludGVnZXIoImlzc3VlX251bSIpICsgU0VQIAogICAgICAgICAgICAgICAgICAgICAgKyBzdHJpbmdfZGF0YSgic2V2IikgKyBTRVAgCiAgICAgICAgICAgICAgICAgICAgICArIHN0cmluZ19kYXRhKCJkZXNjIikgKyBTRVAgCiAgICAgICAgICAgICAgICAgICAgICArIGludGVnZXIoImRheXNfb3BlbiIpKQogICAgICAgIAogICAgICAgIGZvciB0a3QgaW4gdGlja2V0X2V4cHIuc2VhcmNoU3RyaW5nKHJlcG9ydCk6CiAgICAgICAgICAgIHByaW50IHRrdC5kdW1wKCkKICAgIHByaW50czo6CiAgICAgICAgWycxMDEnLCAnQ3JpdGljYWwnLCAnSW50ZXJtaXR0ZW50IHN5c3RlbSBjcmFzaCcsICc2J10KICAgICAgICAtIGRheXNfb3BlbjogNgogICAgICAgIC0gZGVzYzogSW50ZXJtaXR0ZW50IHN5c3RlbSBjcmFzaAogICAgICAgIC0gaXNzdWVfbnVtOiAxMDEKICAgICAgICAtIHNldjogQ3JpdGljYWwKICAgICAgICBbJzk0JywgJ0Nvc21ldGljJywgIlNwZWxsaW5nIGVycm9yIG9uIExvZ2luICgnbG9nfG4nKSIsICcxNCddCiAgICAgICAgLSBkYXlzX29wZW46IDE0CiAgICAgICAgLSBkZXNjOiBTcGVsbGluZyBlcnJvciBvbiBMb2dpbiAoJ2xvZ3xuJykKICAgICAgICAtIGlzc3VlX251bTogOTQKICAgICAgICAtIHNldjogQ29zbWV0aWMKICAgICAgICBbJzc5JywgJ01pbm9yJywgJ1N5c3RlbSBzbG93IHdoZW4gcnVubmluZyB0b28gbWFueSByZXBvcnRzJywgJzQ3J10KICAgICAgICAtIGRheXNfb3BlbjogNDcKICAgICAgICAtIGRlc2M6IFN5c3RlbSBzbG93IHdoZW4gcnVubmluZyB0b28gbWFueSByZXBvcnRzCiAgICAgICAgLSBpc3N1ZV9udW06IDc5CiAgICAgICAgLSBzZXY6IE1pbm9yCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyggc2VsZiwgb3RoZXIsIGluY2x1ZGU9RmFsc2UsIGlnbm9yZT1Ob25lLCBmYWlsT249Tm9uZSApOgogICAgICAgIHN1cGVyKCBTa2lwVG8sIHNlbGYgKS5fX2luaXRfXyggb3RoZXIgKQogICAgICAgIHNlbGYuaWdub3JlRXhwciA9IGlnbm9yZQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UKICAgICAgICBzZWxmLmluY2x1ZGVNYXRjaCA9IGluY2x1ZGUKICAgICAgICBzZWxmLmFzTGlzdCA9IEZhbHNlCiAgICAgICAgaWYgaXNpbnN0YW5jZShmYWlsT24sIGJhc2VzdHJpbmcpOgogICAgICAgICAgICBzZWxmLmZhaWxPbiA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyhmYWlsT24pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5mYWlsT24gPSBmYWlsT24KICAgICAgICBzZWxmLmVycm1zZyA9ICJObyBtYXRjaCBmb3VuZCBmb3IgIitfdXN0cihzZWxmLmV4cHIpCgogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToKICAgICAgICBzdGFydGxvYyA9IGxvYwogICAgICAgIGluc3RybGVuID0gbGVuKGluc3RyaW5nKQogICAgICAgIGV4cHIgPSBzZWxmLmV4cHIKICAgICAgICBleHByX3BhcnNlID0gc2VsZi5leHByLl9wYXJzZQogICAgICAgIHNlbGZfZmFpbE9uX2NhblBhcnNlTmV4dCA9IHNlbGYuZmFpbE9uLmNhblBhcnNlTmV4dCBpZiBzZWxmLmZhaWxPbiBpcyBub3QgTm9uZSBlbHNlIE5vbmUKICAgICAgICBzZWxmX2lnbm9yZUV4cHJfdHJ5UGFyc2UgPSBzZWxmLmlnbm9yZUV4cHIudHJ5UGFyc2UgaWYgc2VsZi5pZ25vcmVFeHByIGlzIG5vdCBOb25lIGVsc2UgTm9uZQogICAgICAgIAogICAgICAgIHRtcGxvYyA9IGxvYwogICAgICAgIHdoaWxlIHRtcGxvYyA8PSBpbnN0cmxlbjoKICAgICAgICAgICAgaWYgc2VsZl9mYWlsT25fY2FuUGFyc2VOZXh0IGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgIyBicmVhayBpZiBmYWlsT24gZXhwcmVzc2lvbiBtYXRjaGVzCiAgICAgICAgICAgICAgICBpZiBzZWxmX2ZhaWxPbl9jYW5QYXJzZU5leHQoaW5zdHJpbmcsIHRtcGxvYyk6CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgaWYgc2VsZl9pZ25vcmVFeHByX3RyeVBhcnNlIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgIyBhZHZhbmNlIHBhc3QgaWdub3JlIGV4cHJlc3Npb25zCiAgICAgICAgICAgICAgICB3aGlsZSAxOgogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgdG1wbG9jID0gc2VsZl9pZ25vcmVFeHByX3RyeVBhcnNlKGluc3RyaW5nLCB0bXBsb2MpCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGV4cHJfcGFyc2UoaW5zdHJpbmcsIHRtcGxvYywgZG9BY3Rpb25zPUZhbHNlLCBjYWxsUHJlUGFyc2U9RmFsc2UpCiAgICAgICAgICAgIGV4Y2VwdCAoUGFyc2VFeGNlcHRpb24sIEluZGV4RXJyb3IpOgogICAgICAgICAgICAgICAgIyBubyBtYXRjaCwgYWR2YW5jZSBsb2MgaW4gc3RyaW5nCiAgICAgICAgICAgICAgICB0bXBsb2MgKz0gMQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBtYXRjaGVkIHNraXB0byBleHByLCBkb25lCiAgICAgICAgICAgICAgICBicmVhawoKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIHJhbiBvZmYgdGhlIGVuZCBvZiB0aGUgaW5wdXQgc3RyaW5nIHdpdGhvdXQgbWF0Y2hpbmcgc2tpcHRvIGV4cHIsIGZhaWwKICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpCgogICAgICAgICMgYnVpbGQgdXAgcmV0dXJuIHZhbHVlcwogICAgICAgIGxvYyA9IHRtcGxvYwogICAgICAgIHNraXB0ZXh0ID0gaW5zdHJpbmdbc3RhcnRsb2M6bG9jXQogICAgICAgIHNraXByZXN1bHQgPSBQYXJzZVJlc3VsdHMoc2tpcHRleHQpCiAgICAgICAgCiAgICAgICAgaWYgc2VsZi5pbmNsdWRlTWF0Y2g6CiAgICAgICAgICAgIGxvYywgbWF0ID0gZXhwcl9wYXJzZShpbnN0cmluZyxsb2MsZG9BY3Rpb25zLGNhbGxQcmVQYXJzZT1GYWxzZSkKICAgICAgICAgICAgc2tpcHJlc3VsdCArPSBtYXQKCiAgICAgICAgcmV0dXJuIGxvYywgc2tpcHJlc3VsdAoKY2xhc3MgRm9yd2FyZChQYXJzZUVsZW1lbnRFbmhhbmNlKToKICAgICIiIgogICAgRm9yd2FyZCBkZWNsYXJhdGlvbiBvZiBhbiBleHByZXNzaW9uIHRvIGJlIGRlZmluZWQgbGF0ZXIgLQogICAgdXNlZCBmb3IgcmVjdXJzaXZlIGdyYW1tYXJzLCBzdWNoIGFzIGFsZ2VicmFpYyBpbmZpeCBub3RhdGlvbi4KICAgIFdoZW4gdGhlIGV4cHJlc3Npb24gaXMga25vd24sIGl0IGlzIGFzc2lnbmVkIHRvIHRoZSBDe0ZvcndhcmR9IHZhcmlhYmxlIHVzaW5nIHRoZSAnPDwnIG9wZXJhdG9yLgoKICAgIE5vdGU6IHRha2UgY2FyZSB3aGVuIGFzc2lnbmluZyB0byBDe0ZvcndhcmR9IG5vdCB0byBvdmVybG9vayBwcmVjZWRlbmNlIG9mIG9wZXJhdG9ycy4KICAgIFNwZWNpZmljYWxseSwgJ3wnIGhhcyBhIGxvd2VyIHByZWNlZGVuY2UgdGhhbiAnPDwnLCBzbyB0aGF0OjoKICAgICAgICBmd2RFeHByIDw8IGEgfCBiIHwgYwogICAgd2lsbCBhY3R1YWxseSBiZSBldmFsdWF0ZWQgYXM6OgogICAgICAgIChmd2RFeHByIDw8IGEpIHwgYiB8IGMKICAgIHRoZXJlYnkgbGVhdmluZyBiIGFuZCBjIG91dCBhcyBwYXJzZWFibGUgYWx0ZXJuYXRpdmVzLiAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB5b3UKICAgIGV4cGxpY2l0bHkgZ3JvdXAgdGhlIHZhbHVlcyBpbnNlcnRlZCBpbnRvIHRoZSBDe0ZvcndhcmR9OjoKICAgICAgICBmd2RFeHByIDw8IChhIHwgYiB8IGMpCiAgICBDb252ZXJ0aW5nIHRvIHVzZSB0aGUgJzw8PScgb3BlcmF0b3IgaW5zdGVhZCB3aWxsIGF2b2lkIHRoaXMgcHJvYmxlbS4KCiAgICBTZWUgTHtQYXJzZVJlc3VsdHMucHByaW50fSBmb3IgYW4gZXhhbXBsZSBvZiBhIHJlY3Vyc2l2ZSBwYXJzZXIgY3JlYXRlZCB1c2luZwogICAgQ3tGb3J3YXJkfS4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBvdGhlcj1Ob25lICk6CiAgICAgICAgc3VwZXIoRm9yd2FyZCxzZWxmKS5fX2luaXRfXyggb3RoZXIsIHNhdmVsaXN0PUZhbHNlICkKCiAgICBkZWYgX19sc2hpZnRfXyggc2VsZiwgb3RoZXIgKToKICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOgogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyhvdGhlcikKICAgICAgICBzZWxmLmV4cHIgPSBvdGhlcgogICAgICAgIHNlbGYuc3RyUmVwciA9IE5vbmUKICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBzZWxmLmV4cHIubWF5SW5kZXhFcnJvcgogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBzZWxmLmV4cHIubWF5UmV0dXJuRW1wdHkKICAgICAgICBzZWxmLnNldFdoaXRlc3BhY2VDaGFycyggc2VsZi5leHByLndoaXRlQ2hhcnMgKQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBzZWxmLmV4cHIuc2tpcFdoaXRlc3BhY2UKICAgICAgICBzZWxmLnNhdmVBc0xpc3QgPSBzZWxmLmV4cHIuc2F2ZUFzTGlzdAogICAgICAgIHNlbGYuaWdub3JlRXhwcnMuZXh0ZW5kKHNlbGYuZXhwci5pZ25vcmVFeHBycykKICAgICAgICByZXR1cm4gc2VsZgogICAgICAgIAogICAgZGVmIF9faWxzaGlmdF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZiA8PCBvdGhlcgogICAgCiAgICBkZWYgbGVhdmVXaGl0ZXNwYWNlKCBzZWxmICk6CiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IEZhbHNlCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgc3RyZWFtbGluZSggc2VsZiApOgogICAgICAgIGlmIG5vdCBzZWxmLnN0cmVhbWxpbmVkOgogICAgICAgICAgICBzZWxmLnN0cmVhbWxpbmVkID0gVHJ1ZQogICAgICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBzZWxmLmV4cHIuc3RyZWFtbGluZSgpCiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgdmFsaWRhdGUoIHNlbGYsIHZhbGlkYXRlVHJhY2U9W10gKToKICAgICAgICBpZiBzZWxmIG5vdCBpbiB2YWxpZGF0ZVRyYWNlOgogICAgICAgICAgICB0bXAgPSB2YWxpZGF0ZVRyYWNlWzpdK1tzZWxmXQogICAgICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBzZWxmLmV4cHIudmFsaWRhdGUodG1wKQogICAgICAgIHNlbGYuY2hlY2tSZWN1cnNpb24oW10pCgogICAgZGVmIF9fc3RyX18oIHNlbGYgKToKICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIm5hbWUiKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQogICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXyArICI6IC4uLiIKCiAgICAgICAgIyBzdHViYmVkIG91dCBmb3Igbm93IC0gY3JlYXRlcyBhd2Z1bCBtZW1vcnkgYW5kIHBlcmYgaXNzdWVzCiAgICAgICAgc2VsZi5fcmV2ZXJ0Q2xhc3MgPSBzZWxmLl9fY2xhc3NfXwogICAgICAgIHNlbGYuX19jbGFzc19fID0gX0ZvcndhcmROb1JlY3Vyc2UKICAgICAgICB0cnk6CiAgICAgICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHJldFN0cmluZyA9IF91c3RyKHNlbGYuZXhwcikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldFN0cmluZyA9ICJOb25lIgogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIHNlbGYuX19jbGFzc19fID0gc2VsZi5fcmV2ZXJ0Q2xhc3MKICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18uX19uYW1lX18gKyAiOiAiICsgcmV0U3RyaW5nCgogICAgZGVmIGNvcHkoc2VsZik6CiAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gc3VwZXIoRm9yd2FyZCxzZWxmKS5jb3B5KCkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXQgPSBGb3J3YXJkKCkKICAgICAgICAgICAgcmV0IDw8PSBzZWxmCiAgICAgICAgICAgIHJldHVybiByZXQKCmNsYXNzIF9Gb3J3YXJkTm9SZWN1cnNlKEZvcndhcmQpOgogICAgZGVmIF9fc3RyX18oIHNlbGYgKToKICAgICAgICByZXR1cm4gIi4uLiIKCmNsYXNzIFRva2VuQ29udmVydGVyKFBhcnNlRWxlbWVudEVuaGFuY2UpOgogICAgIiIiCiAgICBBYnN0cmFjdCBzdWJjbGFzcyBvZiBDe1BhcnNlRXhwcmVzc2lvbn0sIGZvciBjb252ZXJ0aW5nIHBhcnNlZCByZXN1bHRzLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHIsIHNhdmVsaXN0PUZhbHNlICk6CiAgICAgICAgc3VwZXIoVG9rZW5Db252ZXJ0ZXIsc2VsZikuX19pbml0X18oIGV4cHIgKSMsIHNhdmVsaXN0ICkKICAgICAgICBzZWxmLnNhdmVBc0xpc3QgPSBGYWxzZQoKY2xhc3MgQ29tYmluZShUb2tlbkNvbnZlcnRlcik6CiAgICAiIiIKICAgIENvbnZlcnRlciB0byBjb25jYXRlbmF0ZSBhbGwgbWF0Y2hpbmcgdG9rZW5zIHRvIGEgc2luZ2xlIHN0cmluZy4KICAgIEJ5IGRlZmF1bHQsIHRoZSBtYXRjaGluZyBwYXR0ZXJucyBtdXN0IGFsc28gYmUgY29udGlndW91cyBpbiB0aGUgaW5wdXQgc3RyaW5nOwogICAgdGhpcyBjYW4gYmUgZGlzYWJsZWQgYnkgc3BlY2lmeWluZyBDeydhZGphY2VudD1GYWxzZSd9IGluIHRoZSBjb25zdHJ1Y3Rvci4KCiAgICBFeGFtcGxlOjoKICAgICAgICByZWFsID0gV29yZChudW1zKSArICcuJyArIFdvcmQobnVtcykKICAgICAgICBwcmludChyZWFsLnBhcnNlU3RyaW5nKCczLjE0MTYnKSkgIyAtPiBbJzMnLCAnLicsICcxNDE2J10KICAgICAgICAjIHdpbGwgYWxzbyBlcnJvbmVvdXNseSBtYXRjaCB0aGUgZm9sbG93aW5nCiAgICAgICAgcHJpbnQocmVhbC5wYXJzZVN0cmluZygnMy4gMTQxNicpKSAjIC0+IFsnMycsICcuJywgJzE0MTYnXQoKICAgICAgICByZWFsID0gQ29tYmluZShXb3JkKG51bXMpICsgJy4nICsgV29yZChudW1zKSkKICAgICAgICBwcmludChyZWFsLnBhcnNlU3RyaW5nKCczLjE0MTYnKSkgIyAtPiBbJzMuMTQxNiddCiAgICAgICAgIyBubyBtYXRjaCB3aGVuIHRoZXJlIGFyZSBpbnRlcm5hbCBzcGFjZXMKICAgICAgICBwcmludChyZWFsLnBhcnNlU3RyaW5nKCczLiAxNDE2JykpICMgLT4gRXhjZXB0aW9uOiBFeHBlY3RlZCBXOigwMTIzLi4uKQogICAgIiIiCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHIsIGpvaW5TdHJpbmc9IiIsIGFkamFjZW50PVRydWUgKToKICAgICAgICBzdXBlcihDb21iaW5lLHNlbGYpLl9faW5pdF9fKCBleHByICkKICAgICAgICAjIHN1cHByZXNzIHdoaXRlc3BhY2Utc3RyaXBwaW5nIGluIGNvbnRhaW5lZCBwYXJzZSBleHByZXNzaW9ucywgYnV0IHJlLWVuYWJsZSBpdCBvbiB0aGUgQ29tYmluZSBpdHNlbGYKICAgICAgICBpZiBhZGphY2VudDoKICAgICAgICAgICAgc2VsZi5sZWF2ZVdoaXRlc3BhY2UoKQogICAgICAgIHNlbGYuYWRqYWNlbnQgPSBhZGphY2VudAogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBUcnVlCiAgICAgICAgc2VsZi5qb2luU3RyaW5nID0gam9pblN0cmluZwogICAgICAgIHNlbGYuY2FsbFByZXBhcnNlID0gVHJ1ZQoKICAgIGRlZiBpZ25vcmUoIHNlbGYsIG90aGVyICk6CiAgICAgICAgaWYgc2VsZi5hZGphY2VudDoKICAgICAgICAgICAgUGFyc2VyRWxlbWVudC5pZ25vcmUoc2VsZiwgb3RoZXIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc3VwZXIoIENvbWJpbmUsIHNlbGYpLmlnbm9yZSggb3RoZXIgKQogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIHBvc3RQYXJzZSggc2VsZiwgaW5zdHJpbmcsIGxvYywgdG9rZW5saXN0ICk6CiAgICAgICAgcmV0VG9rcyA9IHRva2VubGlzdC5jb3B5KCkKICAgICAgICBkZWwgcmV0VG9rc1s6XQogICAgICAgIHJldFRva3MgKz0gUGFyc2VSZXN1bHRzKFsgIiIuam9pbih0b2tlbmxpc3QuX2FzU3RyaW5nTGlzdChzZWxmLmpvaW5TdHJpbmcpKSBdLCBtb2RhbD1zZWxmLm1vZGFsUmVzdWx0cykKCiAgICAgICAgaWYgc2VsZi5yZXN1bHRzTmFtZSBhbmQgcmV0VG9rcy5oYXNrZXlzKCk6CiAgICAgICAgICAgIHJldHVybiBbIHJldFRva3MgXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiByZXRUb2tzCgpjbGFzcyBHcm91cChUb2tlbkNvbnZlcnRlcik6CiAgICAiIiIKICAgIENvbnZlcnRlciB0byByZXR1cm4gdGhlIG1hdGNoZWQgdG9rZW5zIGFzIGEgbGlzdCAtIHVzZWZ1bCBmb3IgcmV0dXJuaW5nIHRva2VucyBvZiBDe0x7WmVyb09yTW9yZX19IGFuZCBDe0x7T25lT3JNb3JlfX0gZXhwcmVzc2lvbnMuCgogICAgRXhhbXBsZTo6CiAgICAgICAgaWRlbnQgPSBXb3JkKGFscGhhcykKICAgICAgICBudW0gPSBXb3JkKG51bXMpCiAgICAgICAgdGVybSA9IGlkZW50IHwgbnVtCiAgICAgICAgZnVuYyA9IGlkZW50ICsgT3B0aW9uYWwoZGVsaW1pdGVkTGlzdCh0ZXJtKSkKICAgICAgICBwcmludChmdW5jLnBhcnNlU3RyaW5nKCJmbiBhLGIsMTAwIikpICAjIC0+IFsnZm4nLCAnYScsICdiJywgJzEwMCddCgogICAgICAgIGZ1bmMgPSBpZGVudCArIEdyb3VwKE9wdGlvbmFsKGRlbGltaXRlZExpc3QodGVybSkpKQogICAgICAgIHByaW50KGZ1bmMucGFyc2VTdHJpbmcoImZuIGEsYiwxMDAiKSkgICMgLT4gWydmbicsIFsnYScsICdiJywgJzEwMCddXQogICAgIiIiCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHIgKToKICAgICAgICBzdXBlcihHcm91cCxzZWxmKS5fX2luaXRfXyggZXhwciApCiAgICAgICAgc2VsZi5zYXZlQXNMaXN0ID0gVHJ1ZQoKICAgIGRlZiBwb3N0UGFyc2UoIHNlbGYsIGluc3RyaW5nLCBsb2MsIHRva2VubGlzdCApOgogICAgICAgIHJldHVybiBbIHRva2VubGlzdCBdCgpjbGFzcyBEaWN0KFRva2VuQ29udmVydGVyKToKICAgICIiIgogICAgQ29udmVydGVyIHRvIHJldHVybiBhIHJlcGV0aXRpdmUgZXhwcmVzc2lvbiBhcyBhIGxpc3QsIGJ1dCBhbHNvIGFzIGEgZGljdGlvbmFyeS4KICAgIEVhY2ggZWxlbWVudCBjYW4gYWxzbyBiZSByZWZlcmVuY2VkIHVzaW5nIHRoZSBmaXJzdCB0b2tlbiBpbiB0aGUgZXhwcmVzc2lvbiBhcyBpdHMga2V5LgogICAgVXNlZnVsIGZvciB0YWJ1bGFyIHJlcG9ydCBzY3JhcGluZyB3aGVuIHRoZSBmaXJzdCBjb2x1bW4gY2FuIGJlIHVzZWQgYXMgYSBpdGVtIGtleS4KCiAgICBFeGFtcGxlOjoKICAgICAgICBkYXRhX3dvcmQgPSBXb3JkKGFscGhhcykKICAgICAgICBsYWJlbCA9IGRhdGFfd29yZCArIEZvbGxvd2VkQnkoJzonKQogICAgICAgIGF0dHJfZXhwciA9IEdyb3VwKGxhYmVsICsgU3VwcHJlc3MoJzonKSArIE9uZU9yTW9yZShkYXRhX3dvcmQpLnNldFBhcnNlQWN0aW9uKCcgJy5qb2luKSkKCiAgICAgICAgdGV4dCA9ICJzaGFwZTogU1FVQVJFIHBvc246IHVwcGVyIGxlZnQgY29sb3I6IGxpZ2h0IGJsdWUgdGV4dHVyZTogYnVybGFwIgogICAgICAgIGF0dHJfZXhwciA9IChsYWJlbCArIFN1cHByZXNzKCc6JykgKyBPbmVPck1vcmUoZGF0YV93b3JkLCBzdG9wT249bGFiZWwpLnNldFBhcnNlQWN0aW9uKCcgJy5qb2luKSkKICAgICAgICAKICAgICAgICAjIHByaW50IGF0dHJpYnV0ZXMgYXMgcGxhaW4gZ3JvdXBzCiAgICAgICAgcHJpbnQoT25lT3JNb3JlKGF0dHJfZXhwcikucGFyc2VTdHJpbmcodGV4dCkuZHVtcCgpKQogICAgICAgIAogICAgICAgICMgaW5zdGVhZCBvZiBPbmVPck1vcmUoZXhwciksIHBhcnNlIHVzaW5nIERpY3QoT25lT3JNb3JlKEdyb3VwKGV4cHIpKSkgLSBEaWN0IHdpbGwgYXV0by1hc3NpZ24gbmFtZXMKICAgICAgICByZXN1bHQgPSBEaWN0KE9uZU9yTW9yZShHcm91cChhdHRyX2V4cHIpKSkucGFyc2VTdHJpbmcodGV4dCkKICAgICAgICBwcmludChyZXN1bHQuZHVtcCgpKQogICAgICAgIAogICAgICAgICMgYWNjZXNzIG5hbWVkIGZpZWxkcyBhcyBkaWN0IGVudHJpZXMsIG9yIG91dHB1dCBhcyBkaWN0CiAgICAgICAgcHJpbnQocmVzdWx0WydzaGFwZSddKSAgICAgICAgCiAgICAgICAgcHJpbnQocmVzdWx0LmFzRGljdCgpKQogICAgcHJpbnRzOjoKICAgICAgICBbJ3NoYXBlJywgJ1NRVUFSRScsICdwb3NuJywgJ3VwcGVyIGxlZnQnLCAnY29sb3InLCAnbGlnaHQgYmx1ZScsICd0ZXh0dXJlJywgJ2J1cmxhcCddCgogICAgICAgIFtbJ3NoYXBlJywgJ1NRVUFSRSddLCBbJ3Bvc24nLCAndXBwZXIgbGVmdCddLCBbJ2NvbG9yJywgJ2xpZ2h0IGJsdWUnXSwgWyd0ZXh0dXJlJywgJ2J1cmxhcCddXQogICAgICAgIC0gY29sb3I6IGxpZ2h0IGJsdWUKICAgICAgICAtIHBvc246IHVwcGVyIGxlZnQKICAgICAgICAtIHNoYXBlOiBTUVVBUkUKICAgICAgICAtIHRleHR1cmU6IGJ1cmxhcAogICAgICAgIFNRVUFSRQogICAgICAgIHsnY29sb3InOiAnbGlnaHQgYmx1ZScsICdwb3NuJzogJ3VwcGVyIGxlZnQnLCAndGV4dHVyZSc6ICdidXJsYXAnLCAnc2hhcGUnOiAnU1FVQVJFJ30KICAgIFNlZSBtb3JlIGV4YW1wbGVzIGF0IEx7UGFyc2VSZXN1bHRzfSBvZiBhY2Nlc3NpbmcgZmllbGRzIGJ5IHJlc3VsdHMgbmFtZS4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByICk6CiAgICAgICAgc3VwZXIoRGljdCxzZWxmKS5fX2luaXRfXyggZXhwciApCiAgICAgICAgc2VsZi5zYXZlQXNMaXN0ID0gVHJ1ZQoKICAgIGRlZiBwb3N0UGFyc2UoIHNlbGYsIGluc3RyaW5nLCBsb2MsIHRva2VubGlzdCApOgogICAgICAgIGZvciBpLHRvayBpbiBlbnVtZXJhdGUodG9rZW5saXN0KToKICAgICAgICAgICAgaWYgbGVuKHRvaykgPT0gMDoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlrZXkgPSB0b2tbMF0KICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShpa2V5LGludCk6CiAgICAgICAgICAgICAgICBpa2V5ID0gX3VzdHIodG9rWzBdKS5zdHJpcCgpCiAgICAgICAgICAgIGlmIGxlbih0b2spPT0xOgogICAgICAgICAgICAgICAgdG9rZW5saXN0W2lrZXldID0gX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQoIiIsaSkKICAgICAgICAgICAgZWxpZiBsZW4odG9rKT09MiBhbmQgbm90IGlzaW5zdGFuY2UodG9rWzFdLFBhcnNlUmVzdWx0cyk6CiAgICAgICAgICAgICAgICB0b2tlbmxpc3RbaWtleV0gPSBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldCh0b2tbMV0saSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGRpY3R2YWx1ZSA9IHRvay5jb3B5KCkgI1BhcnNlUmVzdWx0cyhpKQogICAgICAgICAgICAgICAgZGVsIGRpY3R2YWx1ZVswXQogICAgICAgICAgICAgICAgaWYgbGVuKGRpY3R2YWx1ZSkhPSAxIG9yIChpc2luc3RhbmNlKGRpY3R2YWx1ZSxQYXJzZVJlc3VsdHMpIGFuZCBkaWN0dmFsdWUuaGFza2V5cygpKToKICAgICAgICAgICAgICAgICAgICB0b2tlbmxpc3RbaWtleV0gPSBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldChkaWN0dmFsdWUsaSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgdG9rZW5saXN0W2lrZXldID0gX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQoZGljdHZhbHVlWzBdLGkpCgogICAgICAgIGlmIHNlbGYucmVzdWx0c05hbWU6CiAgICAgICAgICAgIHJldHVybiBbIHRva2VubGlzdCBdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHRva2VubGlzdAoKCmNsYXNzIFN1cHByZXNzKFRva2VuQ29udmVydGVyKToKICAgICIiIgogICAgQ29udmVydGVyIGZvciBpZ25vcmluZyB0aGUgcmVzdWx0cyBvZiBhIHBhcnNlZCBleHByZXNzaW9uLgoKICAgIEV4YW1wbGU6OgogICAgICAgIHNvdXJjZSA9ICJhLCBiLCBjLGQiCiAgICAgICAgd2QgPSBXb3JkKGFscGhhcykKICAgICAgICB3ZF9saXN0MSA9IHdkICsgWmVyb09yTW9yZSgnLCcgKyB3ZCkKICAgICAgICBwcmludCh3ZF9saXN0MS5wYXJzZVN0cmluZyhzb3VyY2UpKQoKICAgICAgICAjIG9mdGVuLCBkZWxpbWl0ZXJzIHRoYXQgYXJlIHVzZWZ1bCBkdXJpbmcgcGFyc2luZyBhcmUganVzdCBpbiB0aGUKICAgICAgICAjIHdheSBhZnRlcndhcmQgLSB1c2UgU3VwcHJlc3MgdG8ga2VlcCB0aGVtIG91dCBvZiB0aGUgcGFyc2VkIG91dHB1dAogICAgICAgIHdkX2xpc3QyID0gd2QgKyBaZXJvT3JNb3JlKFN1cHByZXNzKCcsJykgKyB3ZCkKICAgICAgICBwcmludCh3ZF9saXN0Mi5wYXJzZVN0cmluZyhzb3VyY2UpKQogICAgcHJpbnRzOjoKICAgICAgICBbJ2EnLCAnLCcsICdiJywgJywnLCAnYycsICcsJywgJ2QnXQogICAgICAgIFsnYScsICdiJywgJ2MnLCAnZCddCiAgICAoU2VlIGFsc28gTHtkZWxpbWl0ZWRMaXN0fS4pCiAgICAiIiIKICAgIGRlZiBwb3N0UGFyc2UoIHNlbGYsIGluc3RyaW5nLCBsb2MsIHRva2VubGlzdCApOgogICAgICAgIHJldHVybiBbXQoKICAgIGRlZiBzdXBwcmVzcyggc2VsZiApOgogICAgICAgIHJldHVybiBzZWxmCgoKY2xhc3MgT25seU9uY2Uob2JqZWN0KToKICAgICIiIgogICAgV3JhcHBlciBmb3IgcGFyc2UgYWN0aW9ucywgdG8gZW5zdXJlIHRoZXkgYXJlIG9ubHkgY2FsbGVkIG9uY2UuCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXRob2RDYWxsKToKICAgICAgICBzZWxmLmNhbGxhYmxlID0gX3RyaW1fYXJpdHkobWV0aG9kQ2FsbCkKICAgICAgICBzZWxmLmNhbGxlZCA9IEZhbHNlCiAgICBkZWYgX19jYWxsX18oc2VsZixzLGwsdCk6CiAgICAgICAgaWYgbm90IHNlbGYuY2FsbGVkOgogICAgICAgICAgICByZXN1bHRzID0gc2VsZi5jYWxsYWJsZShzLGwsdCkKICAgICAgICAgICAgc2VsZi5jYWxsZWQgPSBUcnVlCiAgICAgICAgICAgIHJldHVybiByZXN1bHRzCiAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24ocyxsLCIiKQogICAgZGVmIHJlc2V0KHNlbGYpOgogICAgICAgIHNlbGYuY2FsbGVkID0gRmFsc2UKCmRlZiB0cmFjZVBhcnNlQWN0aW9uKGYpOgogICAgIiIiCiAgICBEZWNvcmF0b3IgZm9yIGRlYnVnZ2luZyBwYXJzZSBhY3Rpb25zLiAKICAgIAogICAgV2hlbiB0aGUgcGFyc2UgYWN0aW9uIGlzIGNhbGxlZCwgdGhpcyBkZWNvcmF0b3Igd2lsbCBwcmludCBDeyI+PiBlbnRlcmluZyBJe21ldGhvZC1uYW1lfShsaW5lOkl7Y3VycmVudF9zb3VyY2VfbGluZX0sIEl7cGFyc2VfbG9jYXRpb259LCBJe21hdGNoZWRfdG9rZW5zfSkiLn0KICAgIFdoZW4gdGhlIHBhcnNlIGFjdGlvbiBjb21wbGV0ZXMsIHRoZSBkZWNvcmF0b3Igd2lsbCBwcmludCBDeyI8PCJ9IGZvbGxvd2VkIGJ5IHRoZSByZXR1cm5lZCB2YWx1ZSwgb3IgYW55IGV4Y2VwdGlvbiB0aGF0IHRoZSBwYXJzZSBhY3Rpb24gcmFpc2VkLgoKICAgIEV4YW1wbGU6OgogICAgICAgIHdkID0gV29yZChhbHBoYXMpCgogICAgICAgIEB0cmFjZVBhcnNlQWN0aW9uCiAgICAgICAgZGVmIHJlbW92ZV9kdXBsaWNhdGVfY2hhcnModG9rZW5zKToKICAgICAgICAgICAgcmV0dXJuICcnLmpvaW4oc29ydGVkKHNldCgnJy5qb2luKHRva2VucykpKQoKICAgICAgICB3ZHMgPSBPbmVPck1vcmUod2QpLnNldFBhcnNlQWN0aW9uKHJlbW92ZV9kdXBsaWNhdGVfY2hhcnMpCiAgICAgICAgcHJpbnQod2RzLnBhcnNlU3RyaW5nKCJzbGtkanMgc2xkIHNsZGQgc2RsZiBzZGxqZiIpKQogICAgcHJpbnRzOjoKICAgICAgICA+PmVudGVyaW5nIHJlbW92ZV9kdXBsaWNhdGVfY2hhcnMobGluZTogJ3Nsa2RqcyBzbGQgc2xkZCBzZGxmIHNkbGpmJywgMCwgKFsnc2xrZGpzJywgJ3NsZCcsICdzbGRkJywgJ3NkbGYnLCAnc2RsamYnXSwge30pKQogICAgICAgIDw8bGVhdmluZyByZW1vdmVfZHVwbGljYXRlX2NoYXJzIChyZXQ6ICdkZmprbHMnKQogICAgICAgIFsnZGZqa2xzJ10KICAgICIiIgogICAgZiA9IF90cmltX2FyaXR5KGYpCiAgICBkZWYgeigqcGFBcmdzKToKICAgICAgICB0aGlzRnVuYyA9IGYuX19uYW1lX18KICAgICAgICBzLGwsdCA9IHBhQXJnc1stMzpdCiAgICAgICAgaWYgbGVuKHBhQXJncyk+MzoKICAgICAgICAgICAgdGhpc0Z1bmMgPSBwYUFyZ3NbMF0uX19jbGFzc19fLl9fbmFtZV9fICsgJy4nICsgdGhpc0Z1bmMKICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCAiPj5lbnRlcmluZyAlcyhsaW5lOiAnJXMnLCAlZCwgJXIpXG4iICUgKHRoaXNGdW5jLGxpbmUobCxzKSxsLHQpICkKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldCA9IGYoKnBhQXJncykKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4YzoKICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSggIjw8bGVhdmluZyAlcyAoZXhjZXB0aW9uOiAlcylcbiIgJSAodGhpc0Z1bmMsZXhjKSApCiAgICAgICAgICAgIHJhaXNlCiAgICAgICAgc3lzLnN0ZGVyci53cml0ZSggIjw8bGVhdmluZyAlcyAocmV0OiAlcilcbiIgJSAodGhpc0Z1bmMscmV0KSApCiAgICAgICAgcmV0dXJuIHJldAogICAgdHJ5OgogICAgICAgIHouX19uYW1lX18gPSBmLl9fbmFtZV9fCiAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgcGFzcwogICAgcmV0dXJuIHoKCiMKIyBnbG9iYWwgaGVscGVycwojCmRlZiBkZWxpbWl0ZWRMaXN0KCBleHByLCBkZWxpbT0iLCIsIGNvbWJpbmU9RmFsc2UgKToKICAgICIiIgogICAgSGVscGVyIHRvIGRlZmluZSBhIGRlbGltaXRlZCBsaXN0IG9mIGV4cHJlc3Npb25zIC0gdGhlIGRlbGltaXRlciBkZWZhdWx0cyB0byAnLCcuCiAgICBCeSBkZWZhdWx0LCB0aGUgbGlzdCBlbGVtZW50cyBhbmQgZGVsaW1pdGVycyBjYW4gaGF2ZSBpbnRlcnZlbmluZyB3aGl0ZXNwYWNlLCBhbmQKICAgIGNvbW1lbnRzLCBidXQgdGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiBieSBwYXNzaW5nIEN7Y29tYmluZT1UcnVlfSBpbiB0aGUgY29uc3RydWN0b3IuCiAgICBJZiBDe2NvbWJpbmV9IGlzIHNldCB0byBDe1RydWV9LCB0aGUgbWF0Y2hpbmcgdG9rZW5zIGFyZSByZXR1cm5lZCBhcyBhIHNpbmdsZSB0b2tlbgogICAgc3RyaW5nLCB3aXRoIHRoZSBkZWxpbWl0ZXJzIGluY2x1ZGVkOyBvdGhlcndpc2UsIHRoZSBtYXRjaGluZyB0b2tlbnMgYXJlIHJldHVybmVkCiAgICBhcyBhIGxpc3Qgb2YgdG9rZW5zLCB3aXRoIHRoZSBkZWxpbWl0ZXJzIHN1cHByZXNzZWQuCgogICAgRXhhbXBsZTo6CiAgICAgICAgZGVsaW1pdGVkTGlzdChXb3JkKGFscGhhcykpLnBhcnNlU3RyaW5nKCJhYSxiYixjYyIpICMgLT4gWydhYScsICdiYicsICdjYyddCiAgICAgICAgZGVsaW1pdGVkTGlzdChXb3JkKGhleG51bXMpLCBkZWxpbT0nOicsIGNvbWJpbmU9VHJ1ZSkucGFyc2VTdHJpbmcoIkFBOkJCOkNDOkREOkVFIikgIyAtPiBbJ0FBOkJCOkNDOkREOkVFJ10KICAgICIiIgogICAgZGxOYW1lID0gX3VzdHIoZXhwcikrIiBbIitfdXN0cihkZWxpbSkrIiAiK191c3RyKGV4cHIpKyJdLi4uIgogICAgaWYgY29tYmluZToKICAgICAgICByZXR1cm4gQ29tYmluZSggZXhwciArIFplcm9Pck1vcmUoIGRlbGltICsgZXhwciApICkuc2V0TmFtZShkbE5hbWUpCiAgICBlbHNlOgogICAgICAgIHJldHVybiAoIGV4cHIgKyBaZXJvT3JNb3JlKCBTdXBwcmVzcyggZGVsaW0gKSArIGV4cHIgKSApLnNldE5hbWUoZGxOYW1lKQoKZGVmIGNvdW50ZWRBcnJheSggZXhwciwgaW50RXhwcj1Ob25lICk6CiAgICAiIiIKICAgIEhlbHBlciB0byBkZWZpbmUgYSBjb3VudGVkIGxpc3Qgb2YgZXhwcmVzc2lvbnMuCiAgICBUaGlzIGhlbHBlciBkZWZpbmVzIGEgcGF0dGVybiBvZiB0aGUgZm9ybTo6CiAgICAgICAgaW50ZWdlciBleHByIGV4cHIgZXhwci4uLgogICAgd2hlcmUgdGhlIGxlYWRpbmcgaW50ZWdlciB0ZWxscyBob3cgbWFueSBleHByIGV4cHJlc3Npb25zIGZvbGxvdy4KICAgIFRoZSBtYXRjaGVkIHRva2VucyByZXR1cm5zIHRoZSBhcnJheSBvZiBleHByIHRva2VucyBhcyBhIGxpc3QgLSB0aGUgbGVhZGluZyBjb3VudCB0b2tlbiBpcyBzdXBwcmVzc2VkLgogICAgCiAgICBJZiBDe2ludEV4cHJ9IGlzIHNwZWNpZmllZCwgaXQgc2hvdWxkIGJlIGEgcHlwYXJzaW5nIGV4cHJlc3Npb24gdGhhdCBwcm9kdWNlcyBhbiBpbnRlZ2VyIHZhbHVlLgoKICAgIEV4YW1wbGU6OgogICAgICAgIGNvdW50ZWRBcnJheShXb3JkKGFscGhhcykpLnBhcnNlU3RyaW5nKCcyIGFiIGNkIGVmJykgICMgLT4gWydhYicsICdjZCddCgogICAgICAgICMgaW4gdGhpcyBwYXJzZXIsIHRoZSBsZWFkaW5nIGludGVnZXIgdmFsdWUgaXMgZ2l2ZW4gaW4gYmluYXJ5LAogICAgICAgICMgJzEwJyBpbmRpY2F0aW5nIHRoYXQgMiB2YWx1ZXMgYXJlIGluIHRoZSBhcnJheQogICAgICAgIGJpbmFyeUNvbnN0YW50ID0gV29yZCgnMDEnKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdDogaW50KHRbMF0sIDIpKQogICAgICAgIGNvdW50ZWRBcnJheShXb3JkKGFscGhhcyksIGludEV4cHI9YmluYXJ5Q29uc3RhbnQpLnBhcnNlU3RyaW5nKCcxMCBhYiBjZCBlZicpICAjIC0+IFsnYWInLCAnY2QnXQogICAgIiIiCiAgICBhcnJheUV4cHIgPSBGb3J3YXJkKCkKICAgIGRlZiBjb3VudEZpZWxkUGFyc2VBY3Rpb24ocyxsLHQpOgogICAgICAgIG4gPSB0WzBdCiAgICAgICAgYXJyYXlFeHByIDw8IChuIGFuZCBHcm91cChBbmQoW2V4cHJdKm4pKSBvciBHcm91cChlbXB0eSkpCiAgICAgICAgcmV0dXJuIFtdCiAgICBpZiBpbnRFeHByIGlzIE5vbmU6CiAgICAgICAgaW50RXhwciA9IFdvcmQobnVtcykuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHQ6aW50KHRbMF0pKQogICAgZWxzZToKICAgICAgICBpbnRFeHByID0gaW50RXhwci5jb3B5KCkKICAgIGludEV4cHIuc2V0TmFtZSgiYXJyYXlMZW4iKQogICAgaW50RXhwci5hZGRQYXJzZUFjdGlvbihjb3VudEZpZWxkUGFyc2VBY3Rpb24sIGNhbGxEdXJpbmdUcnk9VHJ1ZSkKICAgIHJldHVybiAoIGludEV4cHIgKyBhcnJheUV4cHIgKS5zZXROYW1lKCcobGVuKSAnICsgX3VzdHIoZXhwcikgKyAnLi4uJykKCmRlZiBfZmxhdHRlbihMKToKICAgIHJldCA9IFtdCiAgICBmb3IgaSBpbiBMOgogICAgICAgIGlmIGlzaW5zdGFuY2UoaSxsaXN0KToKICAgICAgICAgICAgcmV0LmV4dGVuZChfZmxhdHRlbihpKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXQuYXBwZW5kKGkpCiAgICByZXR1cm4gcmV0CgpkZWYgbWF0Y2hQcmV2aW91c0xpdGVyYWwoZXhwcik6CiAgICAiIiIKICAgIEhlbHBlciB0byBkZWZpbmUgYW4gZXhwcmVzc2lvbiB0aGF0IGlzIGluZGlyZWN0bHkgZGVmaW5lZCBmcm9tCiAgICB0aGUgdG9rZW5zIG1hdGNoZWQgaW4gYSBwcmV2aW91cyBleHByZXNzaW9uLCB0aGF0IGlzLCBpdCBsb29rcwogICAgZm9yIGEgJ3JlcGVhdCcgb2YgYSBwcmV2aW91cyBleHByZXNzaW9uLiAgRm9yIGV4YW1wbGU6OgogICAgICAgIGZpcnN0ID0gV29yZChudW1zKQogICAgICAgIHNlY29uZCA9IG1hdGNoUHJldmlvdXNMaXRlcmFsKGZpcnN0KQogICAgICAgIG1hdGNoRXhwciA9IGZpcnN0ICsgIjoiICsgc2Vjb25kCiAgICB3aWxsIG1hdGNoIEN7IjE6MSJ9LCBidXQgbm90IEN7IjE6MiJ9LiAgQmVjYXVzZSB0aGlzIG1hdGNoZXMgYQogICAgcHJldmlvdXMgbGl0ZXJhbCwgd2lsbCBhbHNvIG1hdGNoIHRoZSBsZWFkaW5nIEN7IjE6MSJ9IGluIEN7IjE6MTAifS4KICAgIElmIHRoaXMgaXMgbm90IGRlc2lyZWQsIHVzZSBDe21hdGNoUHJldmlvdXNFeHByfS4KICAgIERvIEl7bm90fSB1c2Ugd2l0aCBwYWNrcmF0IHBhcnNpbmcgZW5hYmxlZC4KICAgICIiIgogICAgcmVwID0gRm9yd2FyZCgpCiAgICBkZWYgY29weVRva2VuVG9SZXBlYXRlcihzLGwsdCk6CiAgICAgICAgaWYgdDoKICAgICAgICAgICAgaWYgbGVuKHQpID09IDE6CiAgICAgICAgICAgICAgICByZXAgPDwgdFswXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBmbGF0dGVuIHQgdG9rZW5zCiAgICAgICAgICAgICAgICB0ZmxhdCA9IF9mbGF0dGVuKHQuYXNMaXN0KCkpCiAgICAgICAgICAgICAgICByZXAgPDwgQW5kKExpdGVyYWwodHQpIGZvciB0dCBpbiB0ZmxhdCkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXAgPDwgRW1wdHkoKQogICAgZXhwci5hZGRQYXJzZUFjdGlvbihjb3B5VG9rZW5Ub1JlcGVhdGVyLCBjYWxsRHVyaW5nVHJ5PVRydWUpCiAgICByZXAuc2V0TmFtZSgnKHByZXYpICcgKyBfdXN0cihleHByKSkKICAgIHJldHVybiByZXAKCmRlZiBtYXRjaFByZXZpb3VzRXhwcihleHByKToKICAgICIiIgogICAgSGVscGVyIHRvIGRlZmluZSBhbiBleHByZXNzaW9uIHRoYXQgaXMgaW5kaXJlY3RseSBkZWZpbmVkIGZyb20KICAgIHRoZSB0b2tlbnMgbWF0Y2hlZCBpbiBhIHByZXZpb3VzIGV4cHJlc3Npb24sIHRoYXQgaXMsIGl0IGxvb2tzCiAgICBmb3IgYSAncmVwZWF0JyBvZiBhIHByZXZpb3VzIGV4cHJlc3Npb24uICBGb3IgZXhhbXBsZTo6CiAgICAgICAgZmlyc3QgPSBXb3JkKG51bXMpCiAgICAgICAgc2Vjb25kID0gbWF0Y2hQcmV2aW91c0V4cHIoZmlyc3QpCiAgICAgICAgbWF0Y2hFeHByID0gZmlyc3QgKyAiOiIgKyBzZWNvbmQKICAgIHdpbGwgbWF0Y2ggQ3siMToxIn0sIGJ1dCBub3QgQ3siMToyIn0uICBCZWNhdXNlIHRoaXMgbWF0Y2hlcyBieQogICAgZXhwcmVzc2lvbnMsIHdpbGwgSXtub3R9IG1hdGNoIHRoZSBsZWFkaW5nIEN7IjE6MSJ9IGluIEN7IjE6MTAifTsKICAgIHRoZSBleHByZXNzaW9ucyBhcmUgZXZhbHVhdGVkIGZpcnN0LCBhbmQgdGhlbiBjb21wYXJlZCwgc28KICAgIEN7IjEifSBpcyBjb21wYXJlZCB3aXRoIEN7IjEwIn0uCiAgICBEbyBJe25vdH0gdXNlIHdpdGggcGFja3JhdCBwYXJzaW5nIGVuYWJsZWQuCiAgICAiIiIKICAgIHJlcCA9IEZvcndhcmQoKQogICAgZTIgPSBleHByLmNvcHkoKQogICAgcmVwIDw8PSBlMgogICAgZGVmIGNvcHlUb2tlblRvUmVwZWF0ZXIocyxsLHQpOgogICAgICAgIG1hdGNoVG9rZW5zID0gX2ZsYXR0ZW4odC5hc0xpc3QoKSkKICAgICAgICBkZWYgbXVzdE1hdGNoVGhlc2VUb2tlbnMocyxsLHQpOgogICAgICAgICAgICB0aGVzZVRva2VucyA9IF9mbGF0dGVuKHQuYXNMaXN0KCkpCiAgICAgICAgICAgIGlmICB0aGVzZVRva2VucyAhPSBtYXRjaFRva2VuczoKICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKCIiLDAsIiIpCiAgICAgICAgcmVwLnNldFBhcnNlQWN0aW9uKCBtdXN0TWF0Y2hUaGVzZVRva2VucywgY2FsbER1cmluZ1RyeT1UcnVlICkKICAgIGV4cHIuYWRkUGFyc2VBY3Rpb24oY29weVRva2VuVG9SZXBlYXRlciwgY2FsbER1cmluZ1RyeT1UcnVlKQogICAgcmVwLnNldE5hbWUoJyhwcmV2KSAnICsgX3VzdHIoZXhwcikpCiAgICByZXR1cm4gcmVwCgpkZWYgX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhzKToKICAgICN+ICBlc2NhcGUgdGhlc2UgY2hhcnM6IF4tXQogICAgZm9yIGMgaW4gciJcXi1dIjoKICAgICAgICBzID0gcy5yZXBsYWNlKGMsX2JzbGFzaCtjKQogICAgcyA9IHMucmVwbGFjZSgiXG4iLHIiXG4iKQogICAgcyA9IHMucmVwbGFjZSgiXHQiLHIiXHQiKQogICAgcmV0dXJuIF91c3RyKHMpCgpkZWYgb25lT2YoIHN0cnMsIGNhc2VsZXNzPUZhbHNlLCB1c2VSZWdleD1UcnVlICk6CiAgICAiIiIKICAgIEhlbHBlciB0byBxdWlja2x5IGRlZmluZSBhIHNldCBvZiBhbHRlcm5hdGl2ZSBMaXRlcmFscywgYW5kIG1ha2VzIHN1cmUgdG8gZG8KICAgIGxvbmdlc3QtZmlyc3QgdGVzdGluZyB3aGVuIHRoZXJlIGlzIGEgY29uZmxpY3QsIHJlZ2FyZGxlc3Mgb2YgdGhlIGlucHV0IG9yZGVyLAogICAgYnV0IHJldHVybnMgYSBDe0x7TWF0Y2hGaXJzdH19IGZvciBiZXN0IHBlcmZvcm1hbmNlLgoKICAgIFBhcmFtZXRlcnM6CiAgICAgLSBzdHJzIC0gYSBzdHJpbmcgb2Ygc3BhY2UtZGVsaW1pdGVkIGxpdGVyYWxzLCBvciBhIGNvbGxlY3Rpb24gb2Ygc3RyaW5nIGxpdGVyYWxzCiAgICAgLSBjYXNlbGVzcyAtIChkZWZhdWx0PUN7RmFsc2V9KSAtIHRyZWF0IGFsbCBsaXRlcmFscyBhcyBjYXNlbGVzcwogICAgIC0gdXNlUmVnZXggLSAoZGVmYXVsdD1De1RydWV9KSAtIGFzIGFuIG9wdGltaXphdGlvbiwgd2lsbCBnZW5lcmF0ZSBhIFJlZ2V4CiAgICAgICAgICBvYmplY3Q7IG90aGVyd2lzZSwgd2lsbCBnZW5lcmF0ZSBhIEN7TWF0Y2hGaXJzdH0gb2JqZWN0IChpZiBDe2Nhc2VsZXNzPVRydWV9LCBvcgogICAgICAgICAgaWYgY3JlYXRpbmcgYSBDe1JlZ2V4fSByYWlzZXMgYW4gZXhjZXB0aW9uKQoKICAgIEV4YW1wbGU6OgogICAgICAgIGNvbXBfb3BlciA9IG9uZU9mKCI8ID0gPiA8PSA+PSAhPSIpCiAgICAgICAgdmFyID0gV29yZChhbHBoYXMpCiAgICAgICAgbnVtYmVyID0gV29yZChudW1zKQogICAgICAgIHRlcm0gPSB2YXIgfCBudW1iZXIKICAgICAgICBjb21wYXJpc29uX2V4cHIgPSB0ZXJtICsgY29tcF9vcGVyICsgdGVybQogICAgICAgIHByaW50KGNvbXBhcmlzb25fZXhwci5zZWFyY2hTdHJpbmcoIkIgPSAxMiAgQUE9MjMgQjw9QUEgQUE+MTIiKSkKICAgIHByaW50czo6CiAgICAgICAgW1snQicsICc9JywgJzEyJ10sIFsnQUEnLCAnPScsICcyMyddLCBbJ0InLCAnPD0nLCAnQUEnXSwgWydBQScsICc+JywgJzEyJ11dCiAgICAiIiIKICAgIGlmIGNhc2VsZXNzOgogICAgICAgIGlzZXF1YWwgPSAoIGxhbWJkYSBhLGI6IGEudXBwZXIoKSA9PSBiLnVwcGVyKCkgKQogICAgICAgIG1hc2tzID0gKCBsYW1iZGEgYSxiOiBiLnVwcGVyKCkuc3RhcnRzd2l0aChhLnVwcGVyKCkpICkKICAgICAgICBwYXJzZUVsZW1lbnRDbGFzcyA9IENhc2VsZXNzTGl0ZXJhbAogICAgZWxzZToKICAgICAgICBpc2VxdWFsID0gKCBsYW1iZGEgYSxiOiBhID09IGIgKQogICAgICAgIG1hc2tzID0gKCBsYW1iZGEgYSxiOiBiLnN0YXJ0c3dpdGgoYSkgKQogICAgICAgIHBhcnNlRWxlbWVudENsYXNzID0gTGl0ZXJhbAoKICAgIHN5bWJvbHMgPSBbXQogICAgaWYgaXNpbnN0YW5jZShzdHJzLGJhc2VzdHJpbmcpOgogICAgICAgIHN5bWJvbHMgPSBzdHJzLnNwbGl0KCkKICAgIGVsaWYgaXNpbnN0YW5jZShzdHJzLCBjb2xsZWN0aW9ucy5JdGVyYWJsZSk6CiAgICAgICAgc3ltYm9scyA9IGxpc3Qoc3RycykKICAgIGVsc2U6CiAgICAgICAgd2FybmluZ3Mud2FybigiSW52YWxpZCBhcmd1bWVudCB0byBvbmVPZiwgZXhwZWN0ZWQgc3RyaW5nIG9yIGl0ZXJhYmxlIiwKICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikKICAgIGlmIG5vdCBzeW1ib2xzOgogICAgICAgIHJldHVybiBOb01hdGNoKCkKCiAgICBpID0gMAogICAgd2hpbGUgaSA8IGxlbihzeW1ib2xzKS0xOgogICAgICAgIGN1ciA9IHN5bWJvbHNbaV0KICAgICAgICBmb3IgaixvdGhlciBpbiBlbnVtZXJhdGUoc3ltYm9sc1tpKzE6XSk6CiAgICAgICAgICAgIGlmICggaXNlcXVhbChvdGhlciwgY3VyKSApOgogICAgICAgICAgICAgICAgZGVsIHN5bWJvbHNbaStqKzFdCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBlbGlmICggbWFza3MoY3VyLCBvdGhlcikgKToKICAgICAgICAgICAgICAgIGRlbCBzeW1ib2xzW2kraisxXQogICAgICAgICAgICAgICAgc3ltYm9scy5pbnNlcnQoaSxvdGhlcikKICAgICAgICAgICAgICAgIGN1ciA9IG90aGVyCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGkgKz0gMQoKICAgIGlmIG5vdCBjYXNlbGVzcyBhbmQgdXNlUmVnZXg6CiAgICAgICAgI34gcHJpbnQgKHN0cnMsIi0+IiwgInwiLmpvaW4oIFsgX2VzY2FwZVJlZ2V4Q2hhcnMoc3ltKSBmb3Igc3ltIGluIHN5bWJvbHNdICkpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBpZiBsZW4oc3ltYm9scyk9PWxlbigiIi5qb2luKHN5bWJvbHMpKToKICAgICAgICAgICAgICAgIHJldHVybiBSZWdleCggIlslc10iICUgIiIuam9pbihfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKHN5bSkgZm9yIHN5bSBpbiBzeW1ib2xzKSApLnNldE5hbWUoJyB8ICcuam9pbihzeW1ib2xzKSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiBSZWdleCggInwiLmpvaW4ocmUuZXNjYXBlKHN5bSkgZm9yIHN5bSBpbiBzeW1ib2xzKSApLnNldE5hbWUoJyB8ICcuam9pbihzeW1ib2xzKSkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJFeGNlcHRpb24gY3JlYXRpbmcgUmVnZXggZm9yIG9uZU9mLCBidWlsZGluZyBNYXRjaEZpcnN0IiwKICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpCgoKICAgICMgbGFzdCByZXNvcnQsIGp1c3QgdXNlIE1hdGNoRmlyc3QKICAgIHJldHVybiBNYXRjaEZpcnN0KHBhcnNlRWxlbWVudENsYXNzKHN5bSkgZm9yIHN5bSBpbiBzeW1ib2xzKS5zZXROYW1lKCcgfCAnLmpvaW4oc3ltYm9scykpCgpkZWYgZGljdE9mKCBrZXksIHZhbHVlICk6CiAgICAiIiIKICAgIEhlbHBlciB0byBlYXNpbHkgYW5kIGNsZWFybHkgZGVmaW5lIGEgZGljdGlvbmFyeSBieSBzcGVjaWZ5aW5nIHRoZSByZXNwZWN0aXZlIHBhdHRlcm5zCiAgICBmb3IgdGhlIGtleSBhbmQgdmFsdWUuICBUYWtlcyBjYXJlIG9mIGRlZmluaW5nIHRoZSBDe0x7RGljdH19LCBDe0x7WmVyb09yTW9yZX19LCBhbmQgQ3tMe0dyb3VwfX0gdG9rZW5zCiAgICBpbiB0aGUgcHJvcGVyIG9yZGVyLiAgVGhlIGtleSBwYXR0ZXJuIGNhbiBpbmNsdWRlIGRlbGltaXRpbmcgbWFya2VycyBvciBwdW5jdHVhdGlvbiwKICAgIGFzIGxvbmcgYXMgdGhleSBhcmUgc3VwcHJlc3NlZCwgdGhlcmVieSBsZWF2aW5nIHRoZSBzaWduaWZpY2FudCBrZXkgdGV4dC4gIFRoZSB2YWx1ZQogICAgcGF0dGVybiBjYW4gaW5jbHVkZSBuYW1lZCByZXN1bHRzLCBzbyB0aGF0IHRoZSBDe0RpY3R9IHJlc3VsdHMgY2FuIGluY2x1ZGUgbmFtZWQgdG9rZW4KICAgIGZpZWxkcy4KCiAgICBFeGFtcGxlOjoKICAgICAgICB0ZXh0ID0gInNoYXBlOiBTUVVBUkUgcG9zbjogdXBwZXIgbGVmdCBjb2xvcjogbGlnaHQgYmx1ZSB0ZXh0dXJlOiBidXJsYXAiCiAgICAgICAgYXR0cl9leHByID0gKGxhYmVsICsgU3VwcHJlc3MoJzonKSArIE9uZU9yTW9yZShkYXRhX3dvcmQsIHN0b3BPbj1sYWJlbCkuc2V0UGFyc2VBY3Rpb24oJyAnLmpvaW4pKQogICAgICAgIHByaW50KE9uZU9yTW9yZShhdHRyX2V4cHIpLnBhcnNlU3RyaW5nKHRleHQpLmR1bXAoKSkKICAgICAgICAKICAgICAgICBhdHRyX2xhYmVsID0gbGFiZWwKICAgICAgICBhdHRyX3ZhbHVlID0gU3VwcHJlc3MoJzonKSArIE9uZU9yTW9yZShkYXRhX3dvcmQsIHN0b3BPbj1sYWJlbCkuc2V0UGFyc2VBY3Rpb24oJyAnLmpvaW4pCgogICAgICAgICMgc2ltaWxhciB0byBEaWN0LCBidXQgc2ltcGxlciBjYWxsIGZvcm1hdAogICAgICAgIHJlc3VsdCA9IGRpY3RPZihhdHRyX2xhYmVsLCBhdHRyX3ZhbHVlKS5wYXJzZVN0cmluZyh0ZXh0KQogICAgICAgIHByaW50KHJlc3VsdC5kdW1wKCkpCiAgICAgICAgcHJpbnQocmVzdWx0WydzaGFwZSddKQogICAgICAgIHByaW50KHJlc3VsdC5zaGFwZSkgICMgb2JqZWN0IGF0dHJpYnV0ZSBhY2Nlc3Mgd29ya3MgdG9vCiAgICAgICAgcHJpbnQocmVzdWx0LmFzRGljdCgpKQogICAgcHJpbnRzOjoKICAgICAgICBbWydzaGFwZScsICdTUVVBUkUnXSwgWydwb3NuJywgJ3VwcGVyIGxlZnQnXSwgWydjb2xvcicsICdsaWdodCBibHVlJ10sIFsndGV4dHVyZScsICdidXJsYXAnXV0KICAgICAgICAtIGNvbG9yOiBsaWdodCBibHVlCiAgICAgICAgLSBwb3NuOiB1cHBlciBsZWZ0CiAgICAgICAgLSBzaGFwZTogU1FVQVJFCiAgICAgICAgLSB0ZXh0dXJlOiBidXJsYXAKICAgICAgICBTUVVBUkUKICAgICAgICBTUVVBUkUKICAgICAgICB7J2NvbG9yJzogJ2xpZ2h0IGJsdWUnLCAnc2hhcGUnOiAnU1FVQVJFJywgJ3Bvc24nOiAndXBwZXIgbGVmdCcsICd0ZXh0dXJlJzogJ2J1cmxhcCd9CiAgICAiIiIKICAgIHJldHVybiBEaWN0KCBaZXJvT3JNb3JlKCBHcm91cCAoIGtleSArIHZhbHVlICkgKSApCgpkZWYgb3JpZ2luYWxUZXh0Rm9yKGV4cHIsIGFzU3RyaW5nPVRydWUpOgogICAgIiIiCiAgICBIZWxwZXIgdG8gcmV0dXJuIHRoZSBvcmlnaW5hbCwgdW50b2tlbml6ZWQgdGV4dCBmb3IgYSBnaXZlbiBleHByZXNzaW9uLiAgVXNlZnVsIHRvCiAgICByZXN0b3JlIHRoZSBwYXJzZWQgZmllbGRzIG9mIGFuIEhUTUwgc3RhcnQgdGFnIGludG8gdGhlIHJhdyB0YWcgdGV4dCBpdHNlbGYsIG9yIHRvCiAgICByZXZlcnQgc2VwYXJhdGUgdG9rZW5zIHdpdGggaW50ZXJ2ZW5pbmcgd2hpdGVzcGFjZSBiYWNrIHRvIHRoZSBvcmlnaW5hbCBtYXRjaGluZwogICAgaW5wdXQgdGV4dC4gQnkgZGVmYXVsdCwgcmV0dXJucyBhc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG9yaWdpbmFsIHBhcnNlZCB0ZXh0LiAgCiAgICAgICAKICAgIElmIHRoZSBvcHRpb25hbCBDe2FzU3RyaW5nfSBhcmd1bWVudCBpcyBwYXNzZWQgYXMgQ3tGYWxzZX0sIHRoZW4gdGhlIHJldHVybiB2YWx1ZSBpcyBhIAogICAgQ3tMe1BhcnNlUmVzdWx0c319IGNvbnRhaW5pbmcgYW55IHJlc3VsdHMgbmFtZXMgdGhhdCB3ZXJlIG9yaWdpbmFsbHkgbWF0Y2hlZCwgYW5kIGEgCiAgICBzaW5nbGUgdG9rZW4gY29udGFpbmluZyB0aGUgb3JpZ2luYWwgbWF0Y2hlZCB0ZXh0IGZyb20gdGhlIGlucHV0IHN0cmluZy4gIFNvIGlmIAogICAgdGhlIGV4cHJlc3Npb24gcGFzc2VkIHRvIEN7THtvcmlnaW5hbFRleHRGb3J9fSBjb250YWlucyBleHByZXNzaW9ucyB3aXRoIGRlZmluZWQKICAgIHJlc3VsdHMgbmFtZXMsIHlvdSBtdXN0IHNldCBDe2FzU3RyaW5nfSB0byBDe0ZhbHNlfSBpZiB5b3Ugd2FudCB0byBwcmVzZXJ2ZSB0aG9zZQogICAgcmVzdWx0cyBuYW1lIHZhbHVlcy4KCiAgICBFeGFtcGxlOjoKICAgICAgICBzcmMgPSAidGhpcyBpcyB0ZXN0IDxiPiBib2xkIDxpPnRleHQ8L2k+IDwvYj4gbm9ybWFsIHRleHQgIgogICAgICAgIGZvciB0YWcgaW4gKCJiIiwiaSIpOgogICAgICAgICAgICBvcGVuZXIsY2xvc2VyID0gbWFrZUhUTUxUYWdzKHRhZykKICAgICAgICAgICAgcGF0dCA9IG9yaWdpbmFsVGV4dEZvcihvcGVuZXIgKyBTa2lwVG8oY2xvc2VyKSArIGNsb3NlcikKICAgICAgICAgICAgcHJpbnQocGF0dC5zZWFyY2hTdHJpbmcoc3JjKVswXSkKICAgIHByaW50czo6CiAgICAgICAgWyc8Yj4gYm9sZCA8aT50ZXh0PC9pPiA8L2I+J10KICAgICAgICBbJzxpPnRleHQ8L2k+J10KICAgICIiIgogICAgbG9jTWFya2VyID0gRW1wdHkoKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcyxsb2MsdDogbG9jKQogICAgZW5kbG9jTWFya2VyID0gbG9jTWFya2VyLmNvcHkoKQogICAgZW5kbG9jTWFya2VyLmNhbGxQcmVwYXJzZSA9IEZhbHNlCiAgICBtYXRjaEV4cHIgPSBsb2NNYXJrZXIoIl9vcmlnaW5hbF9zdGFydCIpICsgZXhwciArIGVuZGxvY01hcmtlcigiX29yaWdpbmFsX2VuZCIpCiAgICBpZiBhc1N0cmluZzoKICAgICAgICBleHRyYWN0VGV4dCA9IGxhbWJkYSBzLGwsdDogc1t0Ll9vcmlnaW5hbF9zdGFydDp0Ll9vcmlnaW5hbF9lbmRdCiAgICBlbHNlOgogICAgICAgIGRlZiBleHRyYWN0VGV4dChzLGwsdCk6CiAgICAgICAgICAgIHRbOl0gPSBbc1t0LnBvcCgnX29yaWdpbmFsX3N0YXJ0Jyk6dC5wb3AoJ19vcmlnaW5hbF9lbmQnKV1dCiAgICBtYXRjaEV4cHIuc2V0UGFyc2VBY3Rpb24oZXh0cmFjdFRleHQpCiAgICBtYXRjaEV4cHIuaWdub3JlRXhwcnMgPSBleHByLmlnbm9yZUV4cHJzCiAgICByZXR1cm4gbWF0Y2hFeHByCgpkZWYgdW5ncm91cChleHByKTogCiAgICAiIiIKICAgIEhlbHBlciB0byB1bmRvIHB5cGFyc2luZydzIGRlZmF1bHQgZ3JvdXBpbmcgb2YgQW5kIGV4cHJlc3Npb25zLCBldmVuCiAgICBpZiBhbGwgYnV0IG9uZSBhcmUgbm9uLWVtcHR5LgogICAgIiIiCiAgICByZXR1cm4gVG9rZW5Db252ZXJ0ZXIoZXhwcikuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHQ6dFswXSkKCmRlZiBsb2NhdGVkRXhwcihleHByKToKICAgICIiIgogICAgSGVscGVyIHRvIGRlY29yYXRlIGEgcmV0dXJuZWQgdG9rZW4gd2l0aCBpdHMgc3RhcnRpbmcgYW5kIGVuZGluZyBsb2NhdGlvbnMgaW4gdGhlIGlucHV0IHN0cmluZy4KICAgIFRoaXMgaGVscGVyIGFkZHMgdGhlIGZvbGxvd2luZyByZXN1bHRzIG5hbWVzOgogICAgIC0gbG9jbl9zdGFydCA9IGxvY2F0aW9uIHdoZXJlIG1hdGNoZWQgZXhwcmVzc2lvbiBiZWdpbnMKICAgICAtIGxvY25fZW5kID0gbG9jYXRpb24gd2hlcmUgbWF0Y2hlZCBleHByZXNzaW9uIGVuZHMKICAgICAtIHZhbHVlID0gdGhlIGFjdHVhbCBwYXJzZWQgcmVzdWx0cwoKICAgIEJlIGNhcmVmdWwgaWYgdGhlIGlucHV0IHRleHQgY29udGFpbnMgQ3s8VEFCPn0gY2hhcmFjdGVycywgeW91IG1heSB3YW50IHRvIGNhbGwKICAgIEN7THtQYXJzZXJFbGVtZW50LnBhcnNlV2l0aFRhYnN9fQoKICAgIEV4YW1wbGU6OgogICAgICAgIHdkID0gV29yZChhbHBoYXMpCiAgICAgICAgZm9yIG1hdGNoIGluIGxvY2F0ZWRFeHByKHdkKS5zZWFyY2hTdHJpbmcoImxqc2RmMTIzbGtzZGpqZjEyM2xra2pqMTIyMiIpOgogICAgICAgICAgICBwcmludChtYXRjaCkKICAgIHByaW50czo6CiAgICAgICAgW1swLCAnbGpzZGYnLCA1XV0KICAgICAgICBbWzgsICdsa3NkampmJywgMTVdXQogICAgICAgIFtbMTgsICdsa2tqaicsIDIzXV0KICAgICIiIgogICAgbG9jYXRvciA9IEVtcHR5KCkuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsbCx0OiBsKQogICAgcmV0dXJuIEdyb3VwKGxvY2F0b3IoImxvY25fc3RhcnQiKSArIGV4cHIoInZhbHVlIikgKyBsb2NhdG9yLmNvcHkoKS5sZWF2ZVdoaXRlc3BhY2UoKSgibG9jbl9lbmQiKSkKCgojIGNvbnZlbmllbmNlIGNvbnN0YW50cyBmb3IgcG9zaXRpb25hbCBleHByZXNzaW9ucwplbXB0eSAgICAgICA9IEVtcHR5KCkuc2V0TmFtZSgiZW1wdHkiKQpsaW5lU3RhcnQgICA9IExpbmVTdGFydCgpLnNldE5hbWUoImxpbmVTdGFydCIpCmxpbmVFbmQgICAgID0gTGluZUVuZCgpLnNldE5hbWUoImxpbmVFbmQiKQpzdHJpbmdTdGFydCA9IFN0cmluZ1N0YXJ0KCkuc2V0TmFtZSgic3RyaW5nU3RhcnQiKQpzdHJpbmdFbmQgICA9IFN0cmluZ0VuZCgpLnNldE5hbWUoInN0cmluZ0VuZCIpCgpfZXNjYXBlZFB1bmMgPSBXb3JkKCBfYnNsYXNoLCByIlxbXS0qLiQrXj8oKX4gIiwgZXhhY3Q9MiApLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLGwsdDp0WzBdWzFdKQpfZXNjYXBlZEhleENoYXIgPSBSZWdleChyIlxcMD9beFhdWzAtOWEtZkEtRl0rIikuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsbCx0OnVuaWNocihpbnQodFswXS5sc3RyaXAocidcMHgnKSwxNikpKQpfZXNjYXBlZE9jdENoYXIgPSBSZWdleChyIlxcMFswLTddKyIpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLGwsdDp1bmljaHIoaW50KHRbMF1bMTpdLDgpKSkKX3NpbmdsZUNoYXIgPSBfZXNjYXBlZFB1bmMgfCBfZXNjYXBlZEhleENoYXIgfCBfZXNjYXBlZE9jdENoYXIgfCBXb3JkKHByaW50YWJsZXMsIGV4Y2x1ZGVDaGFycz1yJ1xdJywgZXhhY3Q9MSkgfCBSZWdleChyIlx3IiwgcmUuVU5JQ09ERSkKX2NoYXJSYW5nZSA9IEdyb3VwKF9zaW5nbGVDaGFyICsgU3VwcHJlc3MoIi0iKSArIF9zaW5nbGVDaGFyKQpfcmVCcmFja2V0RXhwciA9IExpdGVyYWwoIlsiKSArIE9wdGlvbmFsKCJeIikuc2V0UmVzdWx0c05hbWUoIm5lZ2F0ZSIpICsgR3JvdXAoIE9uZU9yTW9yZSggX2NoYXJSYW5nZSB8IF9zaW5nbGVDaGFyICkgKS5zZXRSZXN1bHRzTmFtZSgiYm9keSIpICsgIl0iCgpkZWYgc3JhbmdlKHMpOgogICAgciIiIgogICAgSGVscGVyIHRvIGVhc2lseSBkZWZpbmUgc3RyaW5nIHJhbmdlcyBmb3IgdXNlIGluIFdvcmQgY29uc3RydWN0aW9uLiAgQm9ycm93cwogICAgc3ludGF4IGZyb20gcmVnZXhwICdbXScgc3RyaW5nIHJhbmdlIGRlZmluaXRpb25zOjoKICAgICAgICBzcmFuZ2UoIlswLTldIikgICAtPiAiMDEyMzQ1Njc4OSIKICAgICAgICBzcmFuZ2UoIlthLXpdIikgICAtPiAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiCiAgICAgICAgc3JhbmdlKCJbYS16JF9dIikgLT4gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JF8iCiAgICBUaGUgaW5wdXQgc3RyaW5nIG11c3QgYmUgZW5jbG9zZWQgaW4gW10ncywgYW5kIHRoZSByZXR1cm5lZCBzdHJpbmcgaXMgdGhlIGV4cGFuZGVkCiAgICBjaGFyYWN0ZXIgc2V0IGpvaW5lZCBpbnRvIGEgc2luZ2xlIHN0cmluZy4KICAgIFRoZSB2YWx1ZXMgZW5jbG9zZWQgaW4gdGhlIFtdJ3MgbWF5IGJlOgogICAgIC0gYSBzaW5nbGUgY2hhcmFjdGVyCiAgICAgLSBhbiBlc2NhcGVkIGNoYXJhY3RlciB3aXRoIGEgbGVhZGluZyBiYWNrc2xhc2ggKHN1Y2ggYXMgQ3tcLX0gb3IgQ3tcXX0pCiAgICAgLSBhbiBlc2NhcGVkIGhleCBjaGFyYWN0ZXIgd2l0aCBhIGxlYWRpbmcgQ3snXHgnfSAoQ3tceDIxfSwgd2hpY2ggaXMgYSBDeychJ30gY2hhcmFjdGVyKSAKICAgICAgICAgKEN7XDB4IyN9IGlzIGFsc28gc3VwcG9ydGVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSkgCiAgICAgLSBhbiBlc2NhcGVkIG9jdGFsIGNoYXJhY3RlciB3aXRoIGEgbGVhZGluZyBDeydcMCd9IChDe1wwNDF9LCB3aGljaCBpcyBhIEN7JyEnfSBjaGFyYWN0ZXIpCiAgICAgLSBhIHJhbmdlIG9mIGFueSBvZiB0aGUgYWJvdmUsIHNlcGFyYXRlZCBieSBhIGRhc2ggKEN7J2Eteid9LCBldGMuKQogICAgIC0gYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBhYm92ZSAoQ3snYWVpb3V5J30sIEN7J2EtekEtWjAtOV8kJ30sIGV0Yy4pCiAgICAiIiIKICAgIF9leHBhbmRlZCA9IGxhbWJkYSBwOiBwIGlmIG5vdCBpc2luc3RhbmNlKHAsUGFyc2VSZXN1bHRzKSBlbHNlICcnLmpvaW4odW5pY2hyKGMpIGZvciBjIGluIHJhbmdlKG9yZChwWzBdKSxvcmQocFsxXSkrMSkpCiAgICB0cnk6CiAgICAgICAgcmV0dXJuICIiLmpvaW4oX2V4cGFuZGVkKHBhcnQpIGZvciBwYXJ0IGluIF9yZUJyYWNrZXRFeHByLnBhcnNlU3RyaW5nKHMpLmJvZHkpCiAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgIHJldHVybiAiIgoKZGVmIG1hdGNoT25seUF0Q29sKG4pOgogICAgIiIiCiAgICBIZWxwZXIgbWV0aG9kIGZvciBkZWZpbmluZyBwYXJzZSBhY3Rpb25zIHRoYXQgcmVxdWlyZSBtYXRjaGluZyBhdCBhIHNwZWNpZmljCiAgICBjb2x1bW4gaW4gdGhlIGlucHV0IHRleHQuCiAgICAiIiIKICAgIGRlZiB2ZXJpZnlDb2woc3RyZyxsb2NuLHRva3MpOgogICAgICAgIGlmIGNvbChsb2NuLHN0cmcpICE9IG46CiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKHN0cmcsbG9jbiwibWF0Y2hlZCB0b2tlbiBub3QgYXQgY29sdW1uICVkIiAlIG4pCiAgICByZXR1cm4gdmVyaWZ5Q29sCgpkZWYgcmVwbGFjZVdpdGgocmVwbFN0cik6CiAgICAiIiIKICAgIEhlbHBlciBtZXRob2QgZm9yIGNvbW1vbiBwYXJzZSBhY3Rpb25zIHRoYXQgc2ltcGx5IHJldHVybiBhIGxpdGVyYWwgdmFsdWUuICBFc3BlY2lhbGx5CiAgICB1c2VmdWwgd2hlbiB1c2VkIHdpdGggQ3tMe3RyYW5zZm9ybVN0cmluZzxQYXJzZXJFbGVtZW50LnRyYW5zZm9ybVN0cmluZz59KCl9LgoKICAgIEV4YW1wbGU6OgogICAgICAgIG51bSA9IFdvcmQobnVtcykuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHRva3M6IGludCh0b2tzWzBdKSkKICAgICAgICBuYSA9IG9uZU9mKCJOL0EgTkEiKS5zZXRQYXJzZUFjdGlvbihyZXBsYWNlV2l0aChtYXRoLm5hbikpCiAgICAgICAgdGVybSA9IG5hIHwgbnVtCiAgICAgICAgCiAgICAgICAgT25lT3JNb3JlKHRlcm0pLnBhcnNlU3RyaW5nKCIzMjQgMjM0IE4vQSAyMzQiKSAjIC0+IFszMjQsIDIzNCwgbmFuLCAyMzRdCiAgICAiIiIKICAgIHJldHVybiBsYW1iZGEgcyxsLHQ6IFtyZXBsU3RyXQoKZGVmIHJlbW92ZVF1b3RlcyhzLGwsdCk6CiAgICAiIiIKICAgIEhlbHBlciBwYXJzZSBhY3Rpb24gZm9yIHJlbW92aW5nIHF1b3RhdGlvbiBtYXJrcyBmcm9tIHBhcnNlZCBxdW90ZWQgc3RyaW5ncy4KCiAgICBFeGFtcGxlOjoKICAgICAgICAjIGJ5IGRlZmF1bHQsIHF1b3RhdGlvbiBtYXJrcyBhcmUgaW5jbHVkZWQgaW4gcGFyc2VkIHJlc3VsdHMKICAgICAgICBxdW90ZWRTdHJpbmcucGFyc2VTdHJpbmcoIidOb3cgaXMgdGhlIFdpbnRlciBvZiBvdXIgRGlzY29udGVudCciKSAjIC0+IFsiJ05vdyBpcyB0aGUgV2ludGVyIG9mIG91ciBEaXNjb250ZW50JyJdCgogICAgICAgICMgdXNlIHJlbW92ZVF1b3RlcyB0byBzdHJpcCBxdW90YXRpb24gbWFya3MgZnJvbSBwYXJzZWQgcmVzdWx0cwogICAgICAgIHF1b3RlZFN0cmluZy5zZXRQYXJzZUFjdGlvbihyZW1vdmVRdW90ZXMpCiAgICAgICAgcXVvdGVkU3RyaW5nLnBhcnNlU3RyaW5nKCInTm93IGlzIHRoZSBXaW50ZXIgb2Ygb3VyIERpc2NvbnRlbnQnIikgIyAtPiBbIk5vdyBpcyB0aGUgV2ludGVyIG9mIG91ciBEaXNjb250ZW50Il0KICAgICIiIgogICAgcmV0dXJuIHRbMF1bMTotMV0KCmRlZiB0b2tlbk1hcChmdW5jLCAqYXJncyk6CiAgICAiIiIKICAgIEhlbHBlciB0byBkZWZpbmUgYSBwYXJzZSBhY3Rpb24gYnkgbWFwcGluZyBhIGZ1bmN0aW9uIHRvIGFsbCBlbGVtZW50cyBvZiBhIFBhcnNlUmVzdWx0cyBsaXN0LklmIGFueSBhZGRpdGlvbmFsIAogICAgYXJncyBhcmUgcGFzc2VkLCB0aGV5IGFyZSBmb3J3YXJkZWQgdG8gdGhlIGdpdmVuIGZ1bmN0aW9uIGFzIGFkZGl0aW9uYWwgYXJndW1lbnRzIGFmdGVyCiAgICB0aGUgdG9rZW4sIGFzIGluIEN7aGV4X2ludGVnZXIgPSBXb3JkKGhleG51bXMpLnNldFBhcnNlQWN0aW9uKHRva2VuTWFwKGludCwgMTYpKX0sIHdoaWNoIHdpbGwgY29udmVydCB0aGUKICAgIHBhcnNlZCBkYXRhIHRvIGFuIGludGVnZXIgdXNpbmcgYmFzZSAxNi4KCiAgICBFeGFtcGxlIChjb21wYXJlIHRoZSBsYXN0IHRvIGV4YW1wbGUgaW4gTHtQYXJzZXJFbGVtZW50LnRyYW5zZm9ybVN0cmluZ306OgogICAgICAgIGhleF9pbnRzID0gT25lT3JNb3JlKFdvcmQoaGV4bnVtcykpLnNldFBhcnNlQWN0aW9uKHRva2VuTWFwKGludCwgMTYpKQogICAgICAgIGhleF9pbnRzLnJ1blRlc3RzKCcnJwogICAgICAgICAgICAwMCAxMSAyMiBhYSBGRiAwYSAwZCAxYQogICAgICAgICAgICAnJycpCiAgICAgICAgCiAgICAgICAgdXBwZXJ3b3JkID0gV29yZChhbHBoYXMpLnNldFBhcnNlQWN0aW9uKHRva2VuTWFwKHN0ci51cHBlcikpCiAgICAgICAgT25lT3JNb3JlKHVwcGVyd29yZCkucnVuVGVzdHMoJycnCiAgICAgICAgICAgIG15IGtpbmdkb20gZm9yIGEgaG9yc2UKICAgICAgICAgICAgJycnKQoKICAgICAgICB3ZCA9IFdvcmQoYWxwaGFzKS5zZXRQYXJzZUFjdGlvbih0b2tlbk1hcChzdHIudGl0bGUpKQogICAgICAgIE9uZU9yTW9yZSh3ZCkuc2V0UGFyc2VBY3Rpb24oJyAnLmpvaW4pLnJ1blRlc3RzKCcnJwogICAgICAgICAgICBub3cgaXMgdGhlIHdpbnRlciBvZiBvdXIgZGlzY29udGVudCBtYWRlIGdsb3Jpb3VzIHN1bW1lciBieSB0aGlzIHN1biBvZiB5b3JrCiAgICAgICAgICAgICcnJykKICAgIHByaW50czo6CiAgICAgICAgMDAgMTEgMjIgYWEgRkYgMGEgMGQgMWEKICAgICAgICBbMCwgMTcsIDM0LCAxNzAsIDI1NSwgMTAsIDEzLCAyNl0KCiAgICAgICAgbXkga2luZ2RvbSBmb3IgYSBob3JzZQogICAgICAgIFsnTVknLCAnS0lOR0RPTScsICdGT1InLCAnQScsICdIT1JTRSddCgogICAgICAgIG5vdyBpcyB0aGUgd2ludGVyIG9mIG91ciBkaXNjb250ZW50IG1hZGUgZ2xvcmlvdXMgc3VtbWVyIGJ5IHRoaXMgc3VuIG9mIHlvcmsKICAgICAgICBbJ05vdyBJcyBUaGUgV2ludGVyIE9mIE91ciBEaXNjb250ZW50IE1hZGUgR2xvcmlvdXMgU3VtbWVyIEJ5IFRoaXMgU3VuIE9mIFlvcmsnXQogICAgIiIiCiAgICBkZWYgcGEocyxsLHQpOgogICAgICAgIHJldHVybiBbZnVuYyh0b2tuLCAqYXJncykgZm9yIHRva24gaW4gdF0KCiAgICB0cnk6CiAgICAgICAgZnVuY19uYW1lID0gZ2V0YXR0cihmdW5jLCAnX19uYW1lX18nLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldGF0dHIoZnVuYywgJ19fY2xhc3NfXycpLl9fbmFtZV9fKQogICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICBmdW5jX25hbWUgPSBzdHIoZnVuYykKICAgIHBhLl9fbmFtZV9fID0gZnVuY19uYW1lCgogICAgcmV0dXJuIHBhCgp1cGNhc2VUb2tlbnMgPSB0b2tlbk1hcChsYW1iZGEgdDogX3VzdHIodCkudXBwZXIoKSkKIiIiKERlcHJlY2F0ZWQpIEhlbHBlciBwYXJzZSBhY3Rpb24gdG8gY29udmVydCB0b2tlbnMgdG8gdXBwZXIgY2FzZS4gRGVwcmVjYXRlZCBpbiBmYXZvciBvZiBMe3B5cGFyc2luZ19jb21tb24udXBjYXNlVG9rZW5zfSIiIgoKZG93bmNhc2VUb2tlbnMgPSB0b2tlbk1hcChsYW1iZGEgdDogX3VzdHIodCkubG93ZXIoKSkKIiIiKERlcHJlY2F0ZWQpIEhlbHBlciBwYXJzZSBhY3Rpb24gdG8gY29udmVydCB0b2tlbnMgdG8gbG93ZXIgY2FzZS4gRGVwcmVjYXRlZCBpbiBmYXZvciBvZiBMe3B5cGFyc2luZ19jb21tb24uZG93bmNhc2VUb2tlbnN9IiIiCiAgICAKZGVmIF9tYWtlVGFncyh0YWdTdHIsIHhtbCk6CiAgICAiIiJJbnRlcm5hbCBoZWxwZXIgdG8gY29uc3RydWN0IG9wZW5pbmcgYW5kIGNsb3NpbmcgdGFnIGV4cHJlc3Npb25zLCBnaXZlbiBhIHRhZyBuYW1lIiIiCiAgICBpZiBpc2luc3RhbmNlKHRhZ1N0cixiYXNlc3RyaW5nKToKICAgICAgICByZXNuYW1lID0gdGFnU3RyCiAgICAgICAgdGFnU3RyID0gS2V5d29yZCh0YWdTdHIsIGNhc2VsZXNzPW5vdCB4bWwpCiAgICBlbHNlOgogICAgICAgIHJlc25hbWUgPSB0YWdTdHIubmFtZQoKICAgIHRhZ0F0dHJOYW1lID0gV29yZChhbHBoYXMsYWxwaGFudW1zKyJfLToiKQogICAgaWYgKHhtbCk6CiAgICAgICAgdGFnQXR0clZhbHVlID0gZGJsUXVvdGVkU3RyaW5nLmNvcHkoKS5zZXRQYXJzZUFjdGlvbiggcmVtb3ZlUXVvdGVzICkKICAgICAgICBvcGVuVGFnID0gU3VwcHJlc3MoIjwiKSArIHRhZ1N0cigidGFnIikgKyBcCiAgICAgICAgICAgICAgICBEaWN0KFplcm9Pck1vcmUoR3JvdXAoIHRhZ0F0dHJOYW1lICsgU3VwcHJlc3MoIj0iKSArIHRhZ0F0dHJWYWx1ZSApKSkgKyBcCiAgICAgICAgICAgICAgICBPcHRpb25hbCgiLyIsZGVmYXVsdD1bRmFsc2VdKS5zZXRSZXN1bHRzTmFtZSgiZW1wdHkiKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcyxsLHQ6dFswXT09Jy8nKSArIFN1cHByZXNzKCI+IikKICAgIGVsc2U6CiAgICAgICAgcHJpbnRhYmxlc0xlc3NSQWJyYWNrID0gIiIuam9pbihjIGZvciBjIGluIHByaW50YWJsZXMgaWYgYyBub3QgaW4gIj4iKQogICAgICAgIHRhZ0F0dHJWYWx1ZSA9IHF1b3RlZFN0cmluZy5jb3B5KCkuc2V0UGFyc2VBY3Rpb24oIHJlbW92ZVF1b3RlcyApIHwgV29yZChwcmludGFibGVzTGVzc1JBYnJhY2spCiAgICAgICAgb3BlblRhZyA9IFN1cHByZXNzKCI8IikgKyB0YWdTdHIoInRhZyIpICsgXAogICAgICAgICAgICAgICAgRGljdChaZXJvT3JNb3JlKEdyb3VwKCB0YWdBdHRyTmFtZS5zZXRQYXJzZUFjdGlvbihkb3duY2FzZVRva2VucykgKyBcCiAgICAgICAgICAgICAgICBPcHRpb25hbCggU3VwcHJlc3MoIj0iKSArIHRhZ0F0dHJWYWx1ZSApICkpKSArIFwKICAgICAgICAgICAgICAgIE9wdGlvbmFsKCIvIixkZWZhdWx0PVtGYWxzZV0pLnNldFJlc3VsdHNOYW1lKCJlbXB0eSIpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLGwsdDp0WzBdPT0nLycpICsgU3VwcHJlc3MoIj4iKQogICAgY2xvc2VUYWcgPSBDb21iaW5lKF9MKCI8LyIpICsgdGFnU3RyICsgIj4iKQoKICAgIG9wZW5UYWcgPSBvcGVuVGFnLnNldFJlc3VsdHNOYW1lKCJzdGFydCIrIiIuam9pbihyZXNuYW1lLnJlcGxhY2UoIjoiLCIgIikudGl0bGUoKS5zcGxpdCgpKSkuc2V0TmFtZSgiPCVzPiIgJSByZXNuYW1lKQogICAgY2xvc2VUYWcgPSBjbG9zZVRhZy5zZXRSZXN1bHRzTmFtZSgiZW5kIisiIi5qb2luKHJlc25hbWUucmVwbGFjZSgiOiIsIiAiKS50aXRsZSgpLnNwbGl0KCkpKS5zZXROYW1lKCI8LyVzPiIgJSByZXNuYW1lKQogICAgb3BlblRhZy50YWcgPSByZXNuYW1lCiAgICBjbG9zZVRhZy50YWcgPSByZXNuYW1lCiAgICByZXR1cm4gb3BlblRhZywgY2xvc2VUYWcKCmRlZiBtYWtlSFRNTFRhZ3ModGFnU3RyKToKICAgICIiIgogICAgSGVscGVyIHRvIGNvbnN0cnVjdCBvcGVuaW5nIGFuZCBjbG9zaW5nIHRhZyBleHByZXNzaW9ucyBmb3IgSFRNTCwgZ2l2ZW4gYSB0YWcgbmFtZS4gTWF0Y2hlcwogICAgdGFncyBpbiBlaXRoZXIgdXBwZXIgb3IgbG93ZXIgY2FzZSwgYXR0cmlidXRlcyB3aXRoIG5hbWVzcGFjZXMgYW5kIHdpdGggcXVvdGVkIG9yIHVucXVvdGVkIHZhbHVlcy4KCiAgICBFeGFtcGxlOjoKICAgICAgICB0ZXh0ID0gJzx0ZD5Nb3JlIGluZm8gYXQgdGhlIDxhIGhyZWY9Imh0dHA6Ly9weXBhcnNpbmcud2lraXNwYWNlcy5jb20iPnB5cGFyc2luZzwvYT4gd2lraSBwYWdlPC90ZD4nCiAgICAgICAgIyBtYWtlSFRNTFRhZ3MgcmV0dXJucyBweXBhcnNpbmcgZXhwcmVzc2lvbnMgZm9yIHRoZSBvcGVuaW5nIGFuZCBjbG9zaW5nIHRhZ3MgYXMgYSAyLXR1cGxlCiAgICAgICAgYSxhX2VuZCA9IG1ha2VIVE1MVGFncygiQSIpCiAgICAgICAgbGlua19leHByID0gYSArIFNraXBUbyhhX2VuZCkoImxpbmtfdGV4dCIpICsgYV9lbmQKICAgICAgICAKICAgICAgICBmb3IgbGluayBpbiBsaW5rX2V4cHIuc2VhcmNoU3RyaW5nKHRleHQpOgogICAgICAgICAgICAjIGF0dHJpYnV0ZXMgaW4gdGhlIDxBPiB0YWcgKGxpa2UgImhyZWYiIHNob3duIGhlcmUpIGFyZSBhbHNvIGFjY2Vzc2libGUgYXMgbmFtZWQgcmVzdWx0cwogICAgICAgICAgICBwcmludChsaW5rLmxpbmtfdGV4dCwgJy0+JywgbGluay5ocmVmKQogICAgcHJpbnRzOjoKICAgICAgICBweXBhcnNpbmcgLT4gaHR0cDovL3B5cGFyc2luZy53aWtpc3BhY2VzLmNvbQogICAgIiIiCiAgICByZXR1cm4gX21ha2VUYWdzKCB0YWdTdHIsIEZhbHNlICkKCmRlZiBtYWtlWE1MVGFncyh0YWdTdHIpOgogICAgIiIiCiAgICBIZWxwZXIgdG8gY29uc3RydWN0IG9wZW5pbmcgYW5kIGNsb3NpbmcgdGFnIGV4cHJlc3Npb25zIGZvciBYTUwsIGdpdmVuIGEgdGFnIG5hbWUuIE1hdGNoZXMKICAgIHRhZ3Mgb25seSBpbiB0aGUgZ2l2ZW4gdXBwZXIvbG93ZXIgY2FzZS4KCiAgICBFeGFtcGxlOiBzaW1pbGFyIHRvIEx7bWFrZUhUTUxUYWdzfQogICAgIiIiCiAgICByZXR1cm4gX21ha2VUYWdzKCB0YWdTdHIsIFRydWUgKQoKZGVmIHdpdGhBdHRyaWJ1dGUoKmFyZ3MsKiphdHRyRGljdCk6CiAgICAiIiIKICAgIEhlbHBlciB0byBjcmVhdGUgYSB2YWxpZGF0aW5nIHBhcnNlIGFjdGlvbiB0byBiZSB1c2VkIHdpdGggc3RhcnQgdGFncyBjcmVhdGVkCiAgICB3aXRoIEN7THttYWtlWE1MVGFnc319IG9yIEN7THttYWtlSFRNTFRhZ3N9fS4gVXNlIEN7d2l0aEF0dHJpYnV0ZX0gdG8gcXVhbGlmeSBhIHN0YXJ0aW5nIHRhZwogICAgd2l0aCBhIHJlcXVpcmVkIGF0dHJpYnV0ZSB2YWx1ZSwgdG8gYXZvaWQgZmFsc2UgbWF0Y2hlcyBvbiBjb21tb24gdGFncyBzdWNoIGFzCiAgICBDezxURD59IG9yIEN7PERJVj59LgoKICAgIENhbGwgQ3t3aXRoQXR0cmlidXRlfSB3aXRoIGEgc2VyaWVzIG9mIGF0dHJpYnV0ZSBuYW1lcyBhbmQgdmFsdWVzLiBTcGVjaWZ5IHRoZSBsaXN0CiAgICBvZiBmaWx0ZXIgYXR0cmlidXRlcyBuYW1lcyBhbmQgdmFsdWVzIGFzOgogICAgIC0ga2V5d29yZCBhcmd1bWVudHMsIGFzIGluIEN7KGFsaWduPSJyaWdodCIpfSwgb3IKICAgICAtIGFzIGFuIGV4cGxpY2l0IGRpY3Qgd2l0aCBDeyoqfSBvcGVyYXRvciwgd2hlbiBhbiBhdHRyaWJ1dGUgbmFtZSBpcyBhbHNvIGEgUHl0aG9uCiAgICAgICAgICByZXNlcnZlZCB3b3JkLCBhcyBpbiBDeyoqeyJjbGFzcyI6IkN1c3RvbWVyIiwgImFsaWduIjoicmlnaHQifX0KICAgICAtIGEgbGlzdCBvZiBuYW1lLXZhbHVlIHR1cGxlcywgYXMgaW4gKCAoIm5zMTpjbGFzcyIsICJDdXN0b21lciIpLCAoIm5zMjphbGlnbiIsInJpZ2h0IikgKQogICAgRm9yIGF0dHJpYnV0ZSBuYW1lcyB3aXRoIGEgbmFtZXNwYWNlIHByZWZpeCwgeW91IG11c3QgdXNlIHRoZSBzZWNvbmQgZm9ybS4gIEF0dHJpYnV0ZQogICAgbmFtZXMgYXJlIG1hdGNoZWQgaW5zZW5zaXRpdmUgdG8gdXBwZXIvbG93ZXIgY2FzZS4KICAgICAgIAogICAgSWYganVzdCB0ZXN0aW5nIGZvciBDe2NsYXNzfSAod2l0aCBvciB3aXRob3V0IGEgbmFtZXNwYWNlKSwgdXNlIEN7THt3aXRoQ2xhc3N9fS4KCiAgICBUbyB2ZXJpZnkgdGhhdCB0aGUgYXR0cmlidXRlIGV4aXN0cywgYnV0IHdpdGhvdXQgc3BlY2lmeWluZyBhIHZhbHVlLCBwYXNzCiAgICBDe3dpdGhBdHRyaWJ1dGUuQU5ZX1ZBTFVFfSBhcyB0aGUgdmFsdWUuCgogICAgRXhhbXBsZTo6CiAgICAgICAgaHRtbCA9ICcnJwogICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICBTb21lIHRleHQKICAgICAgICAgICAgPGRpdiB0eXBlPSJncmlkIj4xIDQgMCAxIDA8L2Rpdj4KICAgICAgICAgICAgPGRpdiB0eXBlPSJncmFwaCI+MSwzIDIsMyAxLDE8L2Rpdj4KICAgICAgICAgICAgPGRpdj50aGlzIGhhcyBubyB0eXBlPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgCiAgICAgICAgJycnCiAgICAgICAgZGl2LGRpdl9lbmQgPSBtYWtlSFRNTFRhZ3MoImRpdiIpCgogICAgICAgICMgb25seSBtYXRjaCBkaXYgdGFnIGhhdmluZyBhIHR5cGUgYXR0cmlidXRlIHdpdGggdmFsdWUgImdyaWQiCiAgICAgICAgZGl2X2dyaWQgPSBkaXYoKS5zZXRQYXJzZUFjdGlvbih3aXRoQXR0cmlidXRlKHR5cGU9ImdyaWQiKSkKICAgICAgICBncmlkX2V4cHIgPSBkaXZfZ3JpZCArIFNraXBUbyhkaXYgfCBkaXZfZW5kKSgiYm9keSIpCiAgICAgICAgZm9yIGdyaWRfaGVhZGVyIGluIGdyaWRfZXhwci5zZWFyY2hTdHJpbmcoaHRtbCk6CiAgICAgICAgICAgIHByaW50KGdyaWRfaGVhZGVyLmJvZHkpCiAgICAgICAgCiAgICAgICAgIyBjb25zdHJ1Y3QgYSBtYXRjaCB3aXRoIGFueSBkaXYgdGFnIGhhdmluZyBhIHR5cGUgYXR0cmlidXRlLCByZWdhcmRsZXNzIG9mIHRoZSB2YWx1ZQogICAgICAgIGRpdl9hbnlfdHlwZSA9IGRpdigpLnNldFBhcnNlQWN0aW9uKHdpdGhBdHRyaWJ1dGUodHlwZT13aXRoQXR0cmlidXRlLkFOWV9WQUxVRSkpCiAgICAgICAgZGl2X2V4cHIgPSBkaXZfYW55X3R5cGUgKyBTa2lwVG8oZGl2IHwgZGl2X2VuZCkoImJvZHkiKQogICAgICAgIGZvciBkaXZfaGVhZGVyIGluIGRpdl9leHByLnNlYXJjaFN0cmluZyhodG1sKToKICAgICAgICAgICAgcHJpbnQoZGl2X2hlYWRlci5ib2R5KQogICAgcHJpbnRzOjoKICAgICAgICAxIDQgMCAxIDAKCiAgICAgICAgMSA0IDAgMSAwCiAgICAgICAgMSwzIDIsMyAxLDEKICAgICIiIgogICAgaWYgYXJnczoKICAgICAgICBhdHRycyA9IGFyZ3NbOl0KICAgIGVsc2U6CiAgICAgICAgYXR0cnMgPSBhdHRyRGljdC5pdGVtcygpCiAgICBhdHRycyA9IFsoayx2KSBmb3Igayx2IGluIGF0dHJzXQogICAgZGVmIHBhKHMsbCx0b2tlbnMpOgogICAgICAgIGZvciBhdHRyTmFtZSxhdHRyVmFsdWUgaW4gYXR0cnM6CiAgICAgICAgICAgIGlmIGF0dHJOYW1lIG5vdCBpbiB0b2tlbnM6CiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihzLGwsIm5vIG1hdGNoaW5nIGF0dHJpYnV0ZSAiICsgYXR0ck5hbWUpCiAgICAgICAgICAgIGlmIGF0dHJWYWx1ZSAhPSB3aXRoQXR0cmlidXRlLkFOWV9WQUxVRSBhbmQgdG9rZW5zW2F0dHJOYW1lXSAhPSBhdHRyVmFsdWU6CiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihzLGwsImF0dHJpYnV0ZSAnJXMnIGhhcyB2YWx1ZSAnJXMnLCBtdXN0IGJlICclcyciICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXR0ck5hbWUsIHRva2Vuc1thdHRyTmFtZV0sIGF0dHJWYWx1ZSkpCiAgICByZXR1cm4gcGEKd2l0aEF0dHJpYnV0ZS5BTllfVkFMVUUgPSBvYmplY3QoKQoKZGVmIHdpdGhDbGFzcyhjbGFzc25hbWUsIG5hbWVzcGFjZT0nJyk6CiAgICAiIiIKICAgIFNpbXBsaWZpZWQgdmVyc2lvbiBvZiBDe0x7d2l0aEF0dHJpYnV0ZX19IHdoZW4gbWF0Y2hpbmcgb24gYSBkaXYgY2xhc3MgLSBtYWRlCiAgICBkaWZmaWN1bHQgYmVjYXVzZSBDe2NsYXNzfSBpcyBhIHJlc2VydmVkIHdvcmQgaW4gUHl0aG9uLgoKICAgIEV4YW1wbGU6OgogICAgICAgIGh0bWwgPSAnJycKICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgU29tZSB0ZXh0CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImdyaWQiPjEgNCAwIDEgMDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJncmFwaCI+MSwzIDIsMyAxLDE8L2Rpdj4KICAgICAgICAgICAgPGRpdj50aGlzICZsdDtkaXYmZ3Q7IGhhcyBubyBjbGFzczwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIAogICAgICAgICcnJwogICAgICAgIGRpdixkaXZfZW5kID0gbWFrZUhUTUxUYWdzKCJkaXYiKQogICAgICAgIGRpdl9ncmlkID0gZGl2KCkuc2V0UGFyc2VBY3Rpb24od2l0aENsYXNzKCJncmlkIikpCiAgICAgICAgCiAgICAgICAgZ3JpZF9leHByID0gZGl2X2dyaWQgKyBTa2lwVG8oZGl2IHwgZGl2X2VuZCkoImJvZHkiKQogICAgICAgIGZvciBncmlkX2hlYWRlciBpbiBncmlkX2V4cHIuc2VhcmNoU3RyaW5nKGh0bWwpOgogICAgICAgICAgICBwcmludChncmlkX2hlYWRlci5ib2R5KQogICAgICAgIAogICAgICAgIGRpdl9hbnlfdHlwZSA9IGRpdigpLnNldFBhcnNlQWN0aW9uKHdpdGhDbGFzcyh3aXRoQXR0cmlidXRlLkFOWV9WQUxVRSkpCiAgICAgICAgZGl2X2V4cHIgPSBkaXZfYW55X3R5cGUgKyBTa2lwVG8oZGl2IHwgZGl2X2VuZCkoImJvZHkiKQogICAgICAgIGZvciBkaXZfaGVhZGVyIGluIGRpdl9leHByLnNlYXJjaFN0cmluZyhodG1sKToKICAgICAgICAgICAgcHJpbnQoZGl2X2hlYWRlci5ib2R5KQogICAgcHJpbnRzOjoKICAgICAgICAxIDQgMCAxIDAKCiAgICAgICAgMSA0IDAgMSAwCiAgICAgICAgMSwzIDIsMyAxLDEKICAgICIiIgogICAgY2xhc3NhdHRyID0gIiVzOmNsYXNzIiAlIG5hbWVzcGFjZSBpZiBuYW1lc3BhY2UgZWxzZSAiY2xhc3MiCiAgICByZXR1cm4gd2l0aEF0dHJpYnV0ZSgqKntjbGFzc2F0dHIgOiBjbGFzc25hbWV9KSAgICAgICAgCgpvcEFzc29jID0gX0NvbnN0YW50cygpCm9wQXNzb2MuTEVGVCA9IG9iamVjdCgpCm9wQXNzb2MuUklHSFQgPSBvYmplY3QoKQoKZGVmIGluZml4Tm90YXRpb24oIGJhc2VFeHByLCBvcExpc3QsIGxwYXI9U3VwcHJlc3MoJygnKSwgcnBhcj1TdXBwcmVzcygnKScpICk6CiAgICAiIiIKICAgIEhlbHBlciBtZXRob2QgZm9yIGNvbnN0cnVjdGluZyBncmFtbWFycyBvZiBleHByZXNzaW9ucyBtYWRlIHVwIG9mCiAgICBvcGVyYXRvcnMgd29ya2luZyBpbiBhIHByZWNlZGVuY2UgaGllcmFyY2h5LiAgT3BlcmF0b3JzIG1heSBiZSB1bmFyeSBvcgogICAgYmluYXJ5LCBsZWZ0LSBvciByaWdodC1hc3NvY2lhdGl2ZS4gIFBhcnNlIGFjdGlvbnMgY2FuIGFsc28gYmUgYXR0YWNoZWQKICAgIHRvIG9wZXJhdG9yIGV4cHJlc3Npb25zLiBUaGUgZ2VuZXJhdGVkIHBhcnNlciB3aWxsIGFsc28gcmVjb2duaXplIHRoZSB1c2UgCiAgICBvZiBwYXJlbnRoZXNlcyB0byBvdmVycmlkZSBvcGVyYXRvciBwcmVjZWRlbmNlcyAoc2VlIGV4YW1wbGUgYmVsb3cpLgogICAgCiAgICBOb3RlOiBpZiB5b3UgZGVmaW5lIGEgZGVlcCBvcGVyYXRvciBsaXN0LCB5b3UgbWF5IHNlZSBwZXJmb3JtYW5jZSBpc3N1ZXMKICAgIHdoZW4gdXNpbmcgaW5maXhOb3RhdGlvbi4gU2VlIEx7UGFyc2VyRWxlbWVudC5lbmFibGVQYWNrcmF0fSBmb3IgYQogICAgbWVjaGFuaXNtIHRvIHBvdGVudGlhbGx5IGltcHJvdmUgeW91ciBwYXJzZXIgcGVyZm9ybWFuY2UuCgogICAgUGFyYW1ldGVyczoKICAgICAtIGJhc2VFeHByIC0gZXhwcmVzc2lvbiByZXByZXNlbnRpbmcgdGhlIG1vc3QgYmFzaWMgZWxlbWVudCBmb3IgdGhlIG5lc3RlZAogICAgIC0gb3BMaXN0IC0gbGlzdCBvZiB0dXBsZXMsIG9uZSBmb3IgZWFjaCBvcGVyYXRvciBwcmVjZWRlbmNlIGxldmVsIGluIHRoZQogICAgICBleHByZXNzaW9uIGdyYW1tYXI7IGVhY2ggdHVwbGUgaXMgb2YgdGhlIGZvcm0KICAgICAgKG9wRXhwciwgbnVtVGVybXMsIHJpZ2h0TGVmdEFzc29jLCBwYXJzZUFjdGlvbiksIHdoZXJlOgogICAgICAgLSBvcEV4cHIgaXMgdGhlIHB5cGFyc2luZyBleHByZXNzaW9uIGZvciB0aGUgb3BlcmF0b3I7CiAgICAgICAgICBtYXkgYWxzbyBiZSBhIHN0cmluZywgd2hpY2ggd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBMaXRlcmFsOwogICAgICAgICAgaWYgbnVtVGVybXMgaXMgMywgb3BFeHByIGlzIGEgdHVwbGUgb2YgdHdvIGV4cHJlc3Npb25zLCBmb3IgdGhlCiAgICAgICAgICB0d28gb3BlcmF0b3JzIHNlcGFyYXRpbmcgdGhlIDMgdGVybXMKICAgICAgIC0gbnVtVGVybXMgaXMgdGhlIG51bWJlciBvZiB0ZXJtcyBmb3IgdGhpcyBvcGVyYXRvciAobXVzdAogICAgICAgICAgYmUgMSwgMiwgb3IgMykKICAgICAgIC0gcmlnaHRMZWZ0QXNzb2MgaXMgdGhlIGluZGljYXRvciB3aGV0aGVyIHRoZSBvcGVyYXRvciBpcwogICAgICAgICAgcmlnaHQgb3IgbGVmdCBhc3NvY2lhdGl2ZSwgdXNpbmcgdGhlIHB5cGFyc2luZy1kZWZpbmVkCiAgICAgICAgICBjb25zdGFudHMgQ3tvcEFzc29jLlJJR0hUfSBhbmQgQ3tvcEFzc29jLkxFRlR9LgogICAgICAgLSBwYXJzZUFjdGlvbiBpcyB0aGUgcGFyc2UgYWN0aW9uIHRvIGJlIGFzc29jaWF0ZWQgd2l0aAogICAgICAgICAgZXhwcmVzc2lvbnMgbWF0Y2hpbmcgdGhpcyBvcGVyYXRvciBleHByZXNzaW9uICh0aGUKICAgICAgICAgIHBhcnNlIGFjdGlvbiB0dXBsZSBtZW1iZXIgbWF5IGJlIG9taXR0ZWQpCiAgICAgLSBscGFyIC0gZXhwcmVzc2lvbiBmb3IgbWF0Y2hpbmcgbGVmdC1wYXJlbnRoZXNlcyAoZGVmYXVsdD1De1N1cHByZXNzKCcoJyl9KQogICAgIC0gcnBhciAtIGV4cHJlc3Npb24gZm9yIG1hdGNoaW5nIHJpZ2h0LXBhcmVudGhlc2VzIChkZWZhdWx0PUN7U3VwcHJlc3MoJyknKX0pCgogICAgRXhhbXBsZTo6CiAgICAgICAgIyBzaW1wbGUgZXhhbXBsZSBvZiBmb3VyLWZ1bmN0aW9uIGFyaXRobWV0aWMgd2l0aCBpbnRzIGFuZCB2YXJpYWJsZSBuYW1lcwogICAgICAgIGludGVnZXIgPSBweXBhcnNpbmdfY29tbW9uLnNpZ25lZF9pbnRlZ2VyCiAgICAgICAgdmFybmFtZSA9IHB5cGFyc2luZ19jb21tb24uaWRlbnRpZmllciAKICAgICAgICAKICAgICAgICBhcml0aF9leHByID0gaW5maXhOb3RhdGlvbihpbnRlZ2VyIHwgdmFybmFtZSwKICAgICAgICAgICAgWwogICAgICAgICAgICAoJy0nLCAxLCBvcEFzc29jLlJJR0hUKSwKICAgICAgICAgICAgKG9uZU9mKCcqIC8nKSwgMiwgb3BBc3NvYy5MRUZUKSwKICAgICAgICAgICAgKG9uZU9mKCcrIC0nKSwgMiwgb3BBc3NvYy5MRUZUKSwKICAgICAgICAgICAgXSkKICAgICAgICAKICAgICAgICBhcml0aF9leHByLnJ1blRlc3RzKCcnJwogICAgICAgICAgICA1KzMqNgogICAgICAgICAgICAoNSszKSo2CiAgICAgICAgICAgIC0yLS0xMQogICAgICAgICAgICAnJycsIGZ1bGxEdW1wPUZhbHNlKQogICAgcHJpbnRzOjoKICAgICAgICA1KzMqNgogICAgICAgIFtbNSwgJysnLCBbMywgJyonLCA2XV1dCgogICAgICAgICg1KzMpKjYKICAgICAgICBbW1s1LCAnKycsIDNdLCAnKicsIDZdXQoKICAgICAgICAtMi0tMTEKICAgICAgICBbW1snLScsIDJdLCAnLScsIFsnLScsIDExXV1dCiAgICAiIiIKICAgIHJldCA9IEZvcndhcmQoKQogICAgbGFzdEV4cHIgPSBiYXNlRXhwciB8ICggbHBhciArIHJldCArIHJwYXIgKQogICAgZm9yIGksb3BlckRlZiBpbiBlbnVtZXJhdGUob3BMaXN0KToKICAgICAgICBvcEV4cHIsYXJpdHkscmlnaHRMZWZ0QXNzb2MscGEgPSAob3BlckRlZiArIChOb25lLCkpWzo0XQogICAgICAgIHRlcm1OYW1lID0gIiVzIHRlcm0iICUgb3BFeHByIGlmIGFyaXR5IDwgMyBlbHNlICIlcyVzIHRlcm0iICUgb3BFeHByCiAgICAgICAgaWYgYXJpdHkgPT0gMzoKICAgICAgICAgICAgaWYgb3BFeHByIGlzIE5vbmUgb3IgbGVuKG9wRXhwcikgIT0gMjoKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImlmIG51bXRlcm1zPTMsIG9wRXhwciBtdXN0IGJlIGEgdHVwbGUgb3IgbGlzdCBvZiB0d28gZXhwcmVzc2lvbnMiKQogICAgICAgICAgICBvcEV4cHIxLCBvcEV4cHIyID0gb3BFeHByCiAgICAgICAgdGhpc0V4cHIgPSBGb3J3YXJkKCkuc2V0TmFtZSh0ZXJtTmFtZSkKICAgICAgICBpZiByaWdodExlZnRBc3NvYyA9PSBvcEFzc29jLkxFRlQ6CiAgICAgICAgICAgIGlmIGFyaXR5ID09IDE6CiAgICAgICAgICAgICAgICBtYXRjaEV4cHIgPSBGb2xsb3dlZEJ5KGxhc3RFeHByICsgb3BFeHByKSArIEdyb3VwKCBsYXN0RXhwciArIE9uZU9yTW9yZSggb3BFeHByICkgKQogICAgICAgICAgICBlbGlmIGFyaXR5ID09IDI6CiAgICAgICAgICAgICAgICBpZiBvcEV4cHIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgbWF0Y2hFeHByID0gRm9sbG93ZWRCeShsYXN0RXhwciArIG9wRXhwciArIGxhc3RFeHByKSArIEdyb3VwKCBsYXN0RXhwciArIE9uZU9yTW9yZSggb3BFeHByICsgbGFzdEV4cHIgKSApCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG1hdGNoRXhwciA9IEZvbGxvd2VkQnkobGFzdEV4cHIrbGFzdEV4cHIpICsgR3JvdXAoIGxhc3RFeHByICsgT25lT3JNb3JlKGxhc3RFeHByKSApCiAgICAgICAgICAgIGVsaWYgYXJpdHkgPT0gMzoKICAgICAgICAgICAgICAgIG1hdGNoRXhwciA9IEZvbGxvd2VkQnkobGFzdEV4cHIgKyBvcEV4cHIxICsgbGFzdEV4cHIgKyBvcEV4cHIyICsgbGFzdEV4cHIpICsgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXAoIGxhc3RFeHByICsgb3BFeHByMSArIGxhc3RFeHByICsgb3BFeHByMiArIGxhc3RFeHByICkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm9wZXJhdG9yIG11c3QgYmUgdW5hcnkgKDEpLCBiaW5hcnkgKDIpLCBvciB0ZXJuYXJ5ICgzKSIpCiAgICAgICAgZWxpZiByaWdodExlZnRBc3NvYyA9PSBvcEFzc29jLlJJR0hUOgogICAgICAgICAgICBpZiBhcml0eSA9PSAxOgogICAgICAgICAgICAgICAgIyB0cnkgdG8gYXZvaWQgTFIgd2l0aCB0aGlzIGV4dHJhIHRlc3QKICAgICAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG9wRXhwciwgT3B0aW9uYWwpOgogICAgICAgICAgICAgICAgICAgIG9wRXhwciA9IE9wdGlvbmFsKG9wRXhwcikKICAgICAgICAgICAgICAgIG1hdGNoRXhwciA9IEZvbGxvd2VkQnkob3BFeHByLmV4cHIgKyB0aGlzRXhwcikgKyBHcm91cCggb3BFeHByICsgdGhpc0V4cHIgKQogICAgICAgICAgICBlbGlmIGFyaXR5ID09IDI6CiAgICAgICAgICAgICAgICBpZiBvcEV4cHIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgbWF0Y2hFeHByID0gRm9sbG93ZWRCeShsYXN0RXhwciArIG9wRXhwciArIHRoaXNFeHByKSArIEdyb3VwKCBsYXN0RXhwciArIE9uZU9yTW9yZSggb3BFeHByICsgdGhpc0V4cHIgKSApCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG1hdGNoRXhwciA9IEZvbGxvd2VkQnkobGFzdEV4cHIgKyB0aGlzRXhwcikgKyBHcm91cCggbGFzdEV4cHIgKyBPbmVPck1vcmUoIHRoaXNFeHByICkgKQogICAgICAgICAgICBlbGlmIGFyaXR5ID09IDM6CiAgICAgICAgICAgICAgICBtYXRjaEV4cHIgPSBGb2xsb3dlZEJ5KGxhc3RFeHByICsgb3BFeHByMSArIHRoaXNFeHByICsgb3BFeHByMiArIHRoaXNFeHByKSArIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwKCBsYXN0RXhwciArIG9wRXhwcjEgKyB0aGlzRXhwciArIG9wRXhwcjIgKyB0aGlzRXhwciApCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJvcGVyYXRvciBtdXN0IGJlIHVuYXJ5ICgxKSwgYmluYXJ5ICgyKSwgb3IgdGVybmFyeSAoMykiKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm9wZXJhdG9yIG11c3QgaW5kaWNhdGUgcmlnaHQgb3IgbGVmdCBhc3NvY2lhdGl2aXR5IikKICAgICAgICBpZiBwYToKICAgICAgICAgICAgbWF0Y2hFeHByLnNldFBhcnNlQWN0aW9uKCBwYSApCiAgICAgICAgdGhpc0V4cHIgPDw9ICggbWF0Y2hFeHByLnNldE5hbWUodGVybU5hbWUpIHwgbGFzdEV4cHIgKQogICAgICAgIGxhc3RFeHByID0gdGhpc0V4cHIKICAgIHJldCA8PD0gbGFzdEV4cHIKICAgIHJldHVybiByZXQKCm9wZXJhdG9yUHJlY2VkZW5jZSA9IGluZml4Tm90YXRpb24KIiIiKERlcHJlY2F0ZWQpIEZvcm1lciBuYW1lIG9mIEN7THtpbmZpeE5vdGF0aW9ufX0sIHdpbGwgYmUgZHJvcHBlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLiIiIgoKZGJsUXVvdGVkU3RyaW5nID0gQ29tYmluZShSZWdleChyJyIoPzpbXiJcblxyXFxdfCg/OiIiKXwoPzpcXCg/OlteeF18eFswLTlhLWZBLUZdKykpKSonKSsnIicpLnNldE5hbWUoInN0cmluZyBlbmNsb3NlZCBpbiBkb3VibGUgcXVvdGVzIikKc2dsUXVvdGVkU3RyaW5nID0gQ29tYmluZShSZWdleChyIicoPzpbXidcblxyXFxdfCg/OicnKXwoPzpcXCg/OlteeF18eFswLTlhLWZBLUZdKykpKSoiKSsiJyIpLnNldE5hbWUoInN0cmluZyBlbmNsb3NlZCBpbiBzaW5nbGUgcXVvdGVzIikKcXVvdGVkU3RyaW5nID0gQ29tYmluZShSZWdleChyJyIoPzpbXiJcblxyXFxdfCg/OiIiKXwoPzpcXCg/OlteeF18eFswLTlhLWZBLUZdKykpKSonKSsnIid8CiAgICAgICAgICAgICAgICAgICAgICAgUmVnZXgociInKD86W14nXG5cclxcXXwoPzonJyl8KD86XFwoPzpbXnhdfHhbMC05YS1mQS1GXSspKSkqIikrIiciKS5zZXROYW1lKCJxdW90ZWRTdHJpbmcgdXNpbmcgc2luZ2xlIG9yIGRvdWJsZSBxdW90ZXMiKQp1bmljb2RlU3RyaW5nID0gQ29tYmluZShfTCgndScpICsgcXVvdGVkU3RyaW5nLmNvcHkoKSkuc2V0TmFtZSgidW5pY29kZSBzdHJpbmcgbGl0ZXJhbCIpCgpkZWYgbmVzdGVkRXhwcihvcGVuZXI9IigiLCBjbG9zZXI9IikiLCBjb250ZW50PU5vbmUsIGlnbm9yZUV4cHI9cXVvdGVkU3RyaW5nLmNvcHkoKSk6CiAgICAiIiIKICAgIEhlbHBlciBtZXRob2QgZm9yIGRlZmluaW5nIG5lc3RlZCBsaXN0cyBlbmNsb3NlZCBpbiBvcGVuaW5nIGFuZCBjbG9zaW5nCiAgICBkZWxpbWl0ZXJzICgiKCIgYW5kICIpIiBhcmUgdGhlIGRlZmF1bHQpLgoKICAgIFBhcmFtZXRlcnM6CiAgICAgLSBvcGVuZXIgLSBvcGVuaW5nIGNoYXJhY3RlciBmb3IgYSBuZXN0ZWQgbGlzdCAoZGVmYXVsdD1DeyIoIn0pOyBjYW4gYWxzbyBiZSBhIHB5cGFyc2luZyBleHByZXNzaW9uCiAgICAgLSBjbG9zZXIgLSBjbG9zaW5nIGNoYXJhY3RlciBmb3IgYSBuZXN0ZWQgbGlzdCAoZGVmYXVsdD1DeyIpIn0pOyBjYW4gYWxzbyBiZSBhIHB5cGFyc2luZyBleHByZXNzaW9uCiAgICAgLSBjb250ZW50IC0gZXhwcmVzc2lvbiBmb3IgaXRlbXMgd2l0aGluIHRoZSBuZXN0ZWQgbGlzdHMgKGRlZmF1bHQ9Q3tOb25lfSkKICAgICAtIGlnbm9yZUV4cHIgLSBleHByZXNzaW9uIGZvciBpZ25vcmluZyBvcGVuaW5nIGFuZCBjbG9zaW5nIGRlbGltaXRlcnMgKGRlZmF1bHQ9Q3txdW90ZWRTdHJpbmd9KQoKICAgIElmIGFuIGV4cHJlc3Npb24gaXMgbm90IHByb3ZpZGVkIGZvciB0aGUgY29udGVudCBhcmd1bWVudCwgdGhlIG5lc3RlZAogICAgZXhwcmVzc2lvbiB3aWxsIGNhcHR1cmUgYWxsIHdoaXRlc3BhY2UtZGVsaW1pdGVkIGNvbnRlbnQgYmV0d2VlbiBkZWxpbWl0ZXJzCiAgICBhcyBhIGxpc3Qgb2Ygc2VwYXJhdGUgdmFsdWVzLgoKICAgIFVzZSB0aGUgQ3tpZ25vcmVFeHByfSBhcmd1bWVudCB0byBkZWZpbmUgZXhwcmVzc2lvbnMgdGhhdCBtYXkgY29udGFpbgogICAgb3BlbmluZyBvciBjbG9zaW5nIGNoYXJhY3RlcnMgdGhhdCBzaG91bGQgbm90IGJlIHRyZWF0ZWQgYXMgb3BlbmluZwogICAgb3IgY2xvc2luZyBjaGFyYWN0ZXJzIGZvciBuZXN0aW5nLCBzdWNoIGFzIHF1b3RlZFN0cmluZyBvciBhIGNvbW1lbnQKICAgIGV4cHJlc3Npb24uICBTcGVjaWZ5IG11bHRpcGxlIGV4cHJlc3Npb25zIHVzaW5nIGFuIEN7THtPcn19IG9yIEN7THtNYXRjaEZpcnN0fX0uCiAgICBUaGUgZGVmYXVsdCBpcyBMe3F1b3RlZFN0cmluZ30sIGJ1dCBpZiBubyBleHByZXNzaW9ucyBhcmUgdG8gYmUgaWdub3JlZCwKICAgIHRoZW4gcGFzcyBDe05vbmV9IGZvciB0aGlzIGFyZ3VtZW50LgoKICAgIEV4YW1wbGU6OgogICAgICAgIGRhdGFfdHlwZSA9IG9uZU9mKCJ2b2lkIGludCBzaG9ydCBsb25nIGNoYXIgZmxvYXQgZG91YmxlIikKICAgICAgICBkZWNsX2RhdGFfdHlwZSA9IENvbWJpbmUoZGF0YV90eXBlICsgT3B0aW9uYWwoV29yZCgnKicpKSkKICAgICAgICBpZGVudCA9IFdvcmQoYWxwaGFzKydfJywgYWxwaGFudW1zKydfJykKICAgICAgICBudW1iZXIgPSBweXBhcnNpbmdfY29tbW9uLm51bWJlcgogICAgICAgIGFyZyA9IEdyb3VwKGRlY2xfZGF0YV90eXBlICsgaWRlbnQpCiAgICAgICAgTFBBUixSUEFSID0gbWFwKFN1cHByZXNzLCAiKCkiKQoKICAgICAgICBjb2RlX2JvZHkgPSBuZXN0ZWRFeHByKCd7JywgJ30nLCBpZ25vcmVFeHByPShxdW90ZWRTdHJpbmcgfCBjU3R5bGVDb21tZW50KSkKCiAgICAgICAgY19mdW5jdGlvbiA9IChkZWNsX2RhdGFfdHlwZSgidHlwZSIpIAogICAgICAgICAgICAgICAgICAgICAgKyBpZGVudCgibmFtZSIpCiAgICAgICAgICAgICAgICAgICAgICArIExQQVIgKyBPcHRpb25hbChkZWxpbWl0ZWRMaXN0KGFyZyksIFtdKSgiYXJncyIpICsgUlBBUiAKICAgICAgICAgICAgICAgICAgICAgICsgY29kZV9ib2R5KCJib2R5IikpCiAgICAgICAgY19mdW5jdGlvbi5pZ25vcmUoY1N0eWxlQ29tbWVudCkKICAgICAgICAKICAgICAgICBzb3VyY2VfY29kZSA9ICcnJwogICAgICAgICAgICBpbnQgaXNfb2RkKGludCB4KSB7IAogICAgICAgICAgICAgICAgcmV0dXJuICh4JTIpOyAKICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIGludCBkZWNfdG9faGV4KGNoYXIgaGNoYXIpIHsgCiAgICAgICAgICAgICAgICBpZiAoaGNoYXIgPj0gJzAnICYmIGhjaGFyIDw9ICc5JykgeyAKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG9yZChoY2hhciktb3JkKCcwJykpOyAKICAgICAgICAgICAgICAgIH0gZWxzZSB7IAogICAgICAgICAgICAgICAgICAgIHJldHVybiAoMTArb3JkKGhjaGFyKS1vcmQoJ0EnKSk7CiAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICB9CiAgICAgICAgJycnCiAgICAgICAgZm9yIGZ1bmMgaW4gY19mdW5jdGlvbi5zZWFyY2hTdHJpbmcoc291cmNlX2NvZGUpOgogICAgICAgICAgICBwcmludCgiJShuYW1lKXMgKCUodHlwZSlzKSBhcmdzOiAlKGFyZ3MpcyIgJSBmdW5jKQoKICAgIHByaW50czo6CiAgICAgICAgaXNfb2RkIChpbnQpIGFyZ3M6IFtbJ2ludCcsICd4J11dCiAgICAgICAgZGVjX3RvX2hleCAoaW50KSBhcmdzOiBbWydjaGFyJywgJ2hjaGFyJ11dCiAgICAiIiIKICAgIGlmIG9wZW5lciA9PSBjbG9zZXI6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigib3BlbmluZyBhbmQgY2xvc2luZyBzdHJpbmdzIGNhbm5vdCBiZSB0aGUgc2FtZSIpCiAgICBpZiBjb250ZW50IGlzIE5vbmU6CiAgICAgICAgaWYgaXNpbnN0YW5jZShvcGVuZXIsYmFzZXN0cmluZykgYW5kIGlzaW5zdGFuY2UoY2xvc2VyLGJhc2VzdHJpbmcpOgogICAgICAgICAgICBpZiBsZW4ob3BlbmVyKSA9PSAxIGFuZCBsZW4oY2xvc2VyKT09MToKICAgICAgICAgICAgICAgIGlmIGlnbm9yZUV4cHIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IChDb21iaW5lKE9uZU9yTW9yZSh+aWdub3JlRXhwciArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJzTm90SW4ob3BlbmVyK2Nsb3NlcitQYXJzZXJFbGVtZW50LkRFRkFVTFRfV0hJVEVfQ0hBUlMsZXhhY3Q9MSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdDp0WzBdLnN0cmlwKCkpKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gKGVtcHR5LmNvcHkoKStDaGFyc05vdEluKG9wZW5lcitjbG9zZXIrUGFyc2VyRWxlbWVudC5ERUZBVUxUX1dISVRFX0NIQVJTCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdDp0WzBdLnN0cmlwKCkpKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaWYgaWdub3JlRXhwciBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gKENvbWJpbmUoT25lT3JNb3JlKH5pZ25vcmVFeHByICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5MaXRlcmFsKG9wZW5lcikgKyB+TGl0ZXJhbChjbG9zZXIpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnNOb3RJbihQYXJzZXJFbGVtZW50LkRFRkFVTFRfV0hJVEVfQ0hBUlMsZXhhY3Q9MSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdDp0WzBdLnN0cmlwKCkpKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gKENvbWJpbmUoT25lT3JNb3JlKH5MaXRlcmFsKG9wZW5lcikgKyB+TGl0ZXJhbChjbG9zZXIpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnNOb3RJbihQYXJzZXJFbGVtZW50LkRFRkFVTFRfV0hJVEVfQ0hBUlMsZXhhY3Q9MSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdDp0WzBdLnN0cmlwKCkpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm9wZW5pbmcgYW5kIGNsb3NpbmcgYXJndW1lbnRzIG11c3QgYmUgc3RyaW5ncyBpZiBubyBjb250ZW50IGV4cHJlc3Npb24gaXMgZ2l2ZW4iKQogICAgcmV0ID0gRm9yd2FyZCgpCiAgICBpZiBpZ25vcmVFeHByIGlzIG5vdCBOb25lOgogICAgICAgIHJldCA8PD0gR3JvdXAoIFN1cHByZXNzKG9wZW5lcikgKyBaZXJvT3JNb3JlKCBpZ25vcmVFeHByIHwgcmV0IHwgY29udGVudCApICsgU3VwcHJlc3MoY2xvc2VyKSApCiAgICBlbHNlOgogICAgICAgIHJldCA8PD0gR3JvdXAoIFN1cHByZXNzKG9wZW5lcikgKyBaZXJvT3JNb3JlKCByZXQgfCBjb250ZW50ICkgICsgU3VwcHJlc3MoY2xvc2VyKSApCiAgICByZXQuc2V0TmFtZSgnbmVzdGVkICVzJXMgZXhwcmVzc2lvbicgJSAob3BlbmVyLGNsb3NlcikpCiAgICByZXR1cm4gcmV0CgpkZWYgaW5kZW50ZWRCbG9jayhibG9ja1N0YXRlbWVudEV4cHIsIGluZGVudFN0YWNrLCBpbmRlbnQ9VHJ1ZSk6CiAgICAiIiIKICAgIEhlbHBlciBtZXRob2QgZm9yIGRlZmluaW5nIHNwYWNlLWRlbGltaXRlZCBpbmRlbnRhdGlvbiBibG9ja3MsIHN1Y2ggYXMKICAgIHRob3NlIHVzZWQgdG8gZGVmaW5lIGJsb2NrIHN0YXRlbWVudHMgaW4gUHl0aG9uIHNvdXJjZSBjb2RlLgoKICAgIFBhcmFtZXRlcnM6CiAgICAgLSBibG9ja1N0YXRlbWVudEV4cHIgLSBleHByZXNzaW9uIGRlZmluaW5nIHN5bnRheCBvZiBzdGF0ZW1lbnQgdGhhdAogICAgICAgICAgICBpcyByZXBlYXRlZCB3aXRoaW4gdGhlIGluZGVudGVkIGJsb2NrCiAgICAgLSBpbmRlbnRTdGFjayAtIGxpc3QgY3JlYXRlZCBieSBjYWxsZXIgdG8gbWFuYWdlIGluZGVudGF0aW9uIHN0YWNrCiAgICAgICAgICAgIChtdWx0aXBsZSBzdGF0ZW1lbnRXaXRoSW5kZW50ZWRCbG9jayBleHByZXNzaW9ucyB3aXRoaW4gYSBzaW5nbGUgZ3JhbW1hcgogICAgICAgICAgICBzaG91bGQgc2hhcmUgYSBjb21tb24gaW5kZW50U3RhY2spCiAgICAgLSBpbmRlbnQgLSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBibG9jayBtdXN0IGJlIGluZGVudGVkIGJleW9uZCB0aGUKICAgICAgICAgICAgdGhlIGN1cnJlbnQgbGV2ZWw7IHNldCB0byBGYWxzZSBmb3IgYmxvY2sgb2YgbGVmdC1tb3N0IHN0YXRlbWVudHMKICAgICAgICAgICAgKGRlZmF1bHQ9Q3tUcnVlfSkKCiAgICBBIHZhbGlkIGJsb2NrIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgQ3tibG9ja1N0YXRlbWVudH0uCgogICAgRXhhbXBsZTo6CiAgICAgICAgZGF0YSA9ICcnJwogICAgICAgIGRlZiBBKHopOgogICAgICAgICAgQTEKICAgICAgICAgIEIgPSAxMDAKICAgICAgICAgIEcgPSBBMgogICAgICAgICAgQTIKICAgICAgICAgIEEzCiAgICAgICAgQgogICAgICAgIGRlZiBCQihhLGIsYyk6CiAgICAgICAgICBCQjEKICAgICAgICAgIGRlZiBCQkEoKToKICAgICAgICAgICAgYmJhMQogICAgICAgICAgICBiYmEyCiAgICAgICAgICAgIGJiYTMKICAgICAgICBDCiAgICAgICAgRAogICAgICAgIGRlZiBzcGFtKHgseSk6CiAgICAgICAgICAgICBkZWYgZWdncyh6KToKICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgJycnCgoKICAgICAgICBpbmRlbnRTdGFjayA9IFsxXQogICAgICAgIHN0bXQgPSBGb3J3YXJkKCkKCiAgICAgICAgaWRlbnRpZmllciA9IFdvcmQoYWxwaGFzLCBhbHBoYW51bXMpCiAgICAgICAgZnVuY0RlY2wgPSAoImRlZiIgKyBpZGVudGlmaWVyICsgR3JvdXAoICIoIiArIE9wdGlvbmFsKCBkZWxpbWl0ZWRMaXN0KGlkZW50aWZpZXIpICkgKyAiKSIgKSArICI6IikKICAgICAgICBmdW5jX2JvZHkgPSBpbmRlbnRlZEJsb2NrKHN0bXQsIGluZGVudFN0YWNrKQogICAgICAgIGZ1bmNEZWYgPSBHcm91cCggZnVuY0RlY2wgKyBmdW5jX2JvZHkgKQoKICAgICAgICBydmFsdWUgPSBGb3J3YXJkKCkKICAgICAgICBmdW5jQ2FsbCA9IEdyb3VwKGlkZW50aWZpZXIgKyAiKCIgKyBPcHRpb25hbChkZWxpbWl0ZWRMaXN0KHJ2YWx1ZSkpICsgIikiKQogICAgICAgIHJ2YWx1ZSA8PCAoZnVuY0NhbGwgfCBpZGVudGlmaWVyIHwgV29yZChudW1zKSkKICAgICAgICBhc3NpZ25tZW50ID0gR3JvdXAoaWRlbnRpZmllciArICI9IiArIHJ2YWx1ZSkKICAgICAgICBzdG10IDw8ICggZnVuY0RlZiB8IGFzc2lnbm1lbnQgfCBpZGVudGlmaWVyICkKCiAgICAgICAgbW9kdWxlX2JvZHkgPSBPbmVPck1vcmUoc3RtdCkKCiAgICAgICAgcGFyc2VUcmVlID0gbW9kdWxlX2JvZHkucGFyc2VTdHJpbmcoZGF0YSkKICAgICAgICBwYXJzZVRyZWUucHByaW50KCkKICAgIHByaW50czo6CiAgICAgICAgW1snZGVmJywKICAgICAgICAgICdBJywKICAgICAgICAgIFsnKCcsICd6JywgJyknXSwKICAgICAgICAgICc6JywKICAgICAgICAgIFtbJ0ExJ10sIFtbJ0InLCAnPScsICcxMDAnXV0sIFtbJ0cnLCAnPScsICdBMiddXSwgWydBMiddLCBbJ0EzJ11dXSwKICAgICAgICAgJ0InLAogICAgICAgICBbJ2RlZicsCiAgICAgICAgICAnQkInLAogICAgICAgICAgWycoJywgJ2EnLCAnYicsICdjJywgJyknXSwKICAgICAgICAgICc6JywKICAgICAgICAgIFtbJ0JCMSddLCBbWydkZWYnLCAnQkJBJywgWycoJywgJyknXSwgJzonLCBbWydiYmExJ10sIFsnYmJhMiddLCBbJ2JiYTMnXV1dXV1dLAogICAgICAgICAnQycsCiAgICAgICAgICdEJywKICAgICAgICAgWydkZWYnLAogICAgICAgICAgJ3NwYW0nLAogICAgICAgICAgWycoJywgJ3gnLCAneScsICcpJ10sCiAgICAgICAgICAnOicsCiAgICAgICAgICBbW1snZGVmJywgJ2VnZ3MnLCBbJygnLCAneicsICcpJ10sICc6JywgW1sncGFzcyddXV1dXV1dIAogICAgIiIiCiAgICBkZWYgY2hlY2tQZWVySW5kZW50KHMsbCx0KToKICAgICAgICBpZiBsID49IGxlbihzKTogcmV0dXJuCiAgICAgICAgY3VyQ29sID0gY29sKGwscykKICAgICAgICBpZiBjdXJDb2wgIT0gaW5kZW50U3RhY2tbLTFdOgogICAgICAgICAgICBpZiBjdXJDb2wgPiBpbmRlbnRTdGFja1stMV06CiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUZhdGFsRXhjZXB0aW9uKHMsbCwiaWxsZWdhbCBuZXN0aW5nIikKICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24ocyxsLCJub3QgYSBwZWVyIGVudHJ5IikKCiAgICBkZWYgY2hlY2tTdWJJbmRlbnQocyxsLHQpOgogICAgICAgIGN1ckNvbCA9IGNvbChsLHMpCiAgICAgICAgaWYgY3VyQ29sID4gaW5kZW50U3RhY2tbLTFdOgogICAgICAgICAgICBpbmRlbnRTdGFjay5hcHBlbmQoIGN1ckNvbCApCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24ocyxsLCJub3QgYSBzdWJlbnRyeSIpCgogICAgZGVmIGNoZWNrVW5pbmRlbnQocyxsLHQpOgogICAgICAgIGlmIGwgPj0gbGVuKHMpOiByZXR1cm4KICAgICAgICBjdXJDb2wgPSBjb2wobCxzKQogICAgICAgIGlmIG5vdChpbmRlbnRTdGFjayBhbmQgY3VyQ29sIDwgaW5kZW50U3RhY2tbLTFdIGFuZCBjdXJDb2wgPD0gaW5kZW50U3RhY2tbLTJdKToKICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24ocyxsLCJub3QgYW4gdW5pbmRlbnQiKQogICAgICAgIGluZGVudFN0YWNrLnBvcCgpCgogICAgTkwgPSBPbmVPck1vcmUoTGluZUVuZCgpLnNldFdoaXRlc3BhY2VDaGFycygiXHQgIikuc3VwcHJlc3MoKSkKICAgIElOREVOVCA9IChFbXB0eSgpICsgRW1wdHkoKS5zZXRQYXJzZUFjdGlvbihjaGVja1N1YkluZGVudCkpLnNldE5hbWUoJ0lOREVOVCcpCiAgICBQRUVSICAgPSBFbXB0eSgpLnNldFBhcnNlQWN0aW9uKGNoZWNrUGVlckluZGVudCkuc2V0TmFtZSgnJykKICAgIFVOREVOVCA9IEVtcHR5KCkuc2V0UGFyc2VBY3Rpb24oY2hlY2tVbmluZGVudCkuc2V0TmFtZSgnVU5JTkRFTlQnKQogICAgaWYgaW5kZW50OgogICAgICAgIHNtRXhwciA9IEdyb3VwKCBPcHRpb25hbChOTCkgKwogICAgICAgICAgICAjfiBGb2xsb3dlZEJ5KGJsb2NrU3RhdGVtZW50RXhwcikgKwogICAgICAgICAgICBJTkRFTlQgKyAoT25lT3JNb3JlKCBQRUVSICsgR3JvdXAoYmxvY2tTdGF0ZW1lbnRFeHByKSArIE9wdGlvbmFsKE5MKSApKSArIFVOREVOVCkKICAgIGVsc2U6CiAgICAgICAgc21FeHByID0gR3JvdXAoIE9wdGlvbmFsKE5MKSArCiAgICAgICAgICAgIChPbmVPck1vcmUoIFBFRVIgKyBHcm91cChibG9ja1N0YXRlbWVudEV4cHIpICsgT3B0aW9uYWwoTkwpICkpICkKICAgIGJsb2NrU3RhdGVtZW50RXhwci5pZ25vcmUoX2JzbGFzaCArIExpbmVFbmQoKSkKICAgIHJldHVybiBzbUV4cHIuc2V0TmFtZSgnaW5kZW50ZWQgYmxvY2snKQoKYWxwaGFzOGJpdCA9IHNyYW5nZShyIltcMHhjMC1cMHhkNlwweGQ4LVwweGY2XDB4ZjgtXDB4ZmZdIikKcHVuYzhiaXQgPSBzcmFuZ2UociJbXDB4YTEtXDB4YmZcMHhkN1wweGY3XSIpCgphbnlPcGVuVGFnLGFueUNsb3NlVGFnID0gbWFrZUhUTUxUYWdzKFdvcmQoYWxwaGFzLGFscGhhbnVtcysiXzoiKS5zZXROYW1lKCdhbnkgdGFnJykpCl9odG1sRW50aXR5TWFwID0gZGljdCh6aXAoImd0IGx0IGFtcCBuYnNwIHF1b3QgYXBvcyIuc3BsaXQoKSwnPjwmICJcJycpKQpjb21tb25IVE1MRW50aXR5ID0gUmVnZXgoJyYoP1A8ZW50aXR5PicgKyAnfCcuam9pbihfaHRtbEVudGl0eU1hcC5rZXlzKCkpICsiKTsiKS5zZXROYW1lKCJjb21tb24gSFRNTCBlbnRpdHkiKQpkZWYgcmVwbGFjZUhUTUxFbnRpdHkodCk6CiAgICAiIiJIZWxwZXIgcGFyc2VyIGFjdGlvbiB0byByZXBsYWNlIGNvbW1vbiBIVE1MIGVudGl0aWVzIHdpdGggdGhlaXIgc3BlY2lhbCBjaGFyYWN0ZXJzIiIiCiAgICByZXR1cm4gX2h0bWxFbnRpdHlNYXAuZ2V0KHQuZW50aXR5KQoKIyBpdCdzIGVhc3kgdG8gZ2V0IHRoZXNlIGNvbW1lbnQgc3RydWN0dXJlcyB3cm9uZyAtIHRoZXkncmUgdmVyeSBjb21tb24sIHNvIG1heSBhcyB3ZWxsIG1ha2UgdGhlbSBhdmFpbGFibGUKY1N0eWxlQ29tbWVudCA9IENvbWJpbmUoUmVnZXgociIvXCooPzpbXipdfFwqKD8hLykpKiIpICsgJyovJykuc2V0TmFtZSgiQyBzdHlsZSBjb21tZW50IikKIkNvbW1lbnQgb2YgdGhlIGZvcm0gQ3svKiAuLi4gKi99IgoKaHRtbENvbW1lbnQgPSBSZWdleChyIjwhLS1bXHNcU10qPy0tPiIpLnNldE5hbWUoIkhUTUwgY29tbWVudCIpCiJDb21tZW50IG9mIHRoZSBmb3JtIEN7PCEtLSAuLi4gLS0+fSIKCnJlc3RPZkxpbmUgPSBSZWdleChyIi4qIikubGVhdmVXaGl0ZXNwYWNlKCkuc2V0TmFtZSgicmVzdCBvZiBsaW5lIikKZGJsU2xhc2hDb21tZW50ID0gUmVnZXgociIvLyg/OlxcXG58W15cbl0pKiIpLnNldE5hbWUoIi8vIGNvbW1lbnQiKQoiQ29tbWVudCBvZiB0aGUgZm9ybSBDey8vIC4uLiAodG8gZW5kIG9mIGxpbmUpfSIKCmNwcFN0eWxlQ29tbWVudCA9IENvbWJpbmUoUmVnZXgociIvXCooPzpbXipdfFwqKD8hLykpKiIpICsgJyovJ3wgZGJsU2xhc2hDb21tZW50KS5zZXROYW1lKCJDKysgc3R5bGUgY29tbWVudCIpCiJDb21tZW50IG9mIGVpdGhlciBmb3JtIEN7THtjU3R5bGVDb21tZW50fX0gb3IgQ3tMe2RibFNsYXNoQ29tbWVudH19IgoKamF2YVN0eWxlQ29tbWVudCA9IGNwcFN0eWxlQ29tbWVudAoiU2FtZSBhcyBDe0x7Y3BwU3R5bGVDb21tZW50fX0iCgpweXRob25TdHlsZUNvbW1lbnQgPSBSZWdleChyIiMuKiIpLnNldE5hbWUoIlB5dGhvbiBzdHlsZSBjb21tZW50IikKIkNvbW1lbnQgb2YgdGhlIGZvcm0gQ3sjIC4uLiAodG8gZW5kIG9mIGxpbmUpfSIKCl9jb21tYXNlcGl0ZW0gPSBDb21iaW5lKE9uZU9yTW9yZShXb3JkKHByaW50YWJsZXMsIGV4Y2x1ZGVDaGFycz0nLCcpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsKCBXb3JkKCIgXHQiKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfkxpdGVyYWwoIiwiKSArIH5MaW5lRW5kKCkgKSApICkuc3RyZWFtbGluZSgpLnNldE5hbWUoImNvbW1hSXRlbSIpCmNvbW1hU2VwYXJhdGVkTGlzdCA9IGRlbGltaXRlZExpc3QoIE9wdGlvbmFsKCBxdW90ZWRTdHJpbmcuY29weSgpIHwgX2NvbW1hc2VwaXRlbSwgZGVmYXVsdD0iIikgKS5zZXROYW1lKCJjb21tYVNlcGFyYXRlZExpc3QiKQoiIiIoRGVwcmVjYXRlZCkgUHJlZGVmaW5lZCBleHByZXNzaW9uIG9mIDEgb3IgbW9yZSBwcmludGFibGUgd29yZHMgb3IgcXVvdGVkIHN0cmluZ3MsIHNlcGFyYXRlZCBieSBjb21tYXMuCiAgIFRoaXMgZXhwcmVzc2lvbiBpcyBkZXByZWNhdGVkIGluIGZhdm9yIG9mIEx7cHlwYXJzaW5nX2NvbW1vbi5jb21tYV9zZXBhcmF0ZWRfbGlzdH0uIiIiCgojIHNvbWUgb3RoZXIgdXNlZnVsIGV4cHJlc3Npb25zIC0gdXNpbmcgbG93ZXItY2FzZSBjbGFzcyBuYW1lIHNpbmNlIHdlIGFyZSByZWFsbHkgdXNpbmcgdGhpcyBhcyBhIG5hbWVzcGFjZQpjbGFzcyBweXBhcnNpbmdfY29tbW9uOgogICAgIiIiCiAgICBIZXJlIGFyZSBzb21lIGNvbW1vbiBsb3ctbGV2ZWwgZXhwcmVzc2lvbnMgdGhhdCBtYXkgYmUgdXNlZnVsIGluIGp1bXAtc3RhcnRpbmcgcGFyc2VyIGRldmVsb3BtZW50OgogICAgIC0gbnVtZXJpYyBmb3JtcyAoTHtpbnRlZ2VyczxpbnRlZ2VyPn0sIEx7cmVhbHM8cmVhbD59LCBMe3NjaWVudGlmaWMgbm90YXRpb248c2NpX3JlYWw+fSkKICAgICAtIGNvbW1vbiBMe3Byb2dyYW1taW5nIGlkZW50aWZpZXJzPGlkZW50aWZpZXI+fQogICAgIC0gbmV0d29yayBhZGRyZXNzZXMgKEx7TUFDPG1hY19hZGRyZXNzPn0sIEx7SVB2NDxpcHY0X2FkZHJlc3M+fSwgTHtJUHY2PGlwdjZfYWRkcmVzcz59KQogICAgIC0gSVNPODYwMSBMe2RhdGVzPGlzbzg2MDFfZGF0ZT59IGFuZCBMe2RhdGV0aW1lPGlzbzg2MDFfZGF0ZXRpbWU+fQogICAgIC0gTHtVVUlEPHV1aWQ+fQogICAgIC0gTHtjb21tYS1zZXBhcmF0ZWQgbGlzdDxjb21tYV9zZXBhcmF0ZWRfbGlzdD59CiAgICBQYXJzZSBhY3Rpb25zOgogICAgIC0gQ3tMe2NvbnZlcnRUb0ludGVnZXJ9fQogICAgIC0gQ3tMe2NvbnZlcnRUb0Zsb2F0fX0KICAgICAtIEN7THtjb252ZXJ0VG9EYXRlfX0KICAgICAtIEN7THtjb252ZXJ0VG9EYXRldGltZX19CiAgICAgLSBDe0x7c3RyaXBIVE1MVGFnc319CiAgICAgLSBDe0x7dXBjYXNlVG9rZW5zfX0KICAgICAtIEN7THtkb3duY2FzZVRva2Vuc319CgogICAgRXhhbXBsZTo6CiAgICAgICAgcHlwYXJzaW5nX2NvbW1vbi5udW1iZXIucnVuVGVzdHMoJycnCiAgICAgICAgICAgICMgYW55IGludCBvciByZWFsIG51bWJlciwgcmV0dXJuZWQgYXMgdGhlIGFwcHJvcHJpYXRlIHR5cGUKICAgICAgICAgICAgMTAwCiAgICAgICAgICAgIC0xMDAKICAgICAgICAgICAgKzEwMAogICAgICAgICAgICAzLjE0MTU5CiAgICAgICAgICAgIDYuMDJlMjMKICAgICAgICAgICAgMWUtMTIKICAgICAgICAgICAgJycnKQoKICAgICAgICBweXBhcnNpbmdfY29tbW9uLmZudW1iZXIucnVuVGVzdHMoJycnCiAgICAgICAgICAgICMgYW55IGludCBvciByZWFsIG51bWJlciwgcmV0dXJuZWQgYXMgZmxvYXQKICAgICAgICAgICAgMTAwCiAgICAgICAgICAgIC0xMDAKICAgICAgICAgICAgKzEwMAogICAgICAgICAgICAzLjE0MTU5CiAgICAgICAgICAgIDYuMDJlMjMKICAgICAgICAgICAgMWUtMTIKICAgICAgICAgICAgJycnKQoKICAgICAgICBweXBhcnNpbmdfY29tbW9uLmhleF9pbnRlZ2VyLnJ1blRlc3RzKCcnJwogICAgICAgICAgICAjIGhleCBudW1iZXJzCiAgICAgICAgICAgIDEwMAogICAgICAgICAgICBGRgogICAgICAgICAgICAnJycpCgogICAgICAgIHB5cGFyc2luZ19jb21tb24uZnJhY3Rpb24ucnVuVGVzdHMoJycnCiAgICAgICAgICAgICMgZnJhY3Rpb25zCiAgICAgICAgICAgIDEvMgogICAgICAgICAgICAtMy80CiAgICAgICAgICAgICcnJykKCiAgICAgICAgcHlwYXJzaW5nX2NvbW1vbi5taXhlZF9pbnRlZ2VyLnJ1blRlc3RzKCcnJwogICAgICAgICAgICAjIG1peGVkIGZyYWN0aW9ucwogICAgICAgICAgICAxCiAgICAgICAgICAgIDEvMgogICAgICAgICAgICAtMy80CiAgICAgICAgICAgIDEtMy80CiAgICAgICAgICAgICcnJykKCiAgICAgICAgaW1wb3J0IHV1aWQKICAgICAgICBweXBhcnNpbmdfY29tbW9uLnV1aWQuc2V0UGFyc2VBY3Rpb24odG9rZW5NYXAodXVpZC5VVUlEKSkKICAgICAgICBweXBhcnNpbmdfY29tbW9uLnV1aWQucnVuVGVzdHMoJycnCiAgICAgICAgICAgICMgdXVpZAogICAgICAgICAgICAxMjM0NTY3OC0xMjM0LTU2NzgtMTIzNC01Njc4MTIzNDU2NzgKICAgICAgICAgICAgJycnKQogICAgcHJpbnRzOjoKICAgICAgICAjIGFueSBpbnQgb3IgcmVhbCBudW1iZXIsIHJldHVybmVkIGFzIHRoZSBhcHByb3ByaWF0ZSB0eXBlCiAgICAgICAgMTAwCiAgICAgICAgWzEwMF0KCiAgICAgICAgLTEwMAogICAgICAgIFstMTAwXQoKICAgICAgICArMTAwCiAgICAgICAgWzEwMF0KCiAgICAgICAgMy4xNDE1OQogICAgICAgIFszLjE0MTU5XQoKICAgICAgICA2LjAyZTIzCiAgICAgICAgWzYuMDJlKzIzXQoKICAgICAgICAxZS0xMgogICAgICAgIFsxZS0xMl0KCiAgICAgICAgIyBhbnkgaW50IG9yIHJlYWwgbnVtYmVyLCByZXR1cm5lZCBhcyBmbG9hdAogICAgICAgIDEwMAogICAgICAgIFsxMDAuMF0KCiAgICAgICAgLTEwMAogICAgICAgIFstMTAwLjBdCgogICAgICAgICsxMDAKICAgICAgICBbMTAwLjBdCgogICAgICAgIDMuMTQxNTkKICAgICAgICBbMy4xNDE1OV0KCiAgICAgICAgNi4wMmUyMwogICAgICAgIFs2LjAyZSsyM10KCiAgICAgICAgMWUtMTIKICAgICAgICBbMWUtMTJdCgogICAgICAgICMgaGV4IG51bWJlcnMKICAgICAgICAxMDAKICAgICAgICBbMjU2XQoKICAgICAgICBGRgogICAgICAgIFsyNTVdCgogICAgICAgICMgZnJhY3Rpb25zCiAgICAgICAgMS8yCiAgICAgICAgWzAuNV0KCiAgICAgICAgLTMvNAogICAgICAgIFstMC43NV0KCiAgICAgICAgIyBtaXhlZCBmcmFjdGlvbnMKICAgICAgICAxCiAgICAgICAgWzFdCgogICAgICAgIDEvMgogICAgICAgIFswLjVdCgogICAgICAgIC0zLzQKICAgICAgICBbLTAuNzVdCgogICAgICAgIDEtMy80CiAgICAgICAgWzEuNzVdCgogICAgICAgICMgdXVpZAogICAgICAgIDEyMzQ1Njc4LTEyMzQtNTY3OC0xMjM0LTU2NzgxMjM0NTY3OAogICAgICAgIFtVVUlEKCcxMjM0NTY3OC0xMjM0LTU2NzgtMTIzNC01Njc4MTIzNDU2NzgnKV0KICAgICIiIgoKICAgIGNvbnZlcnRUb0ludGVnZXIgPSB0b2tlbk1hcChpbnQpCiAgICAiIiIKICAgIFBhcnNlIGFjdGlvbiBmb3IgY29udmVydGluZyBwYXJzZWQgaW50ZWdlcnMgdG8gUHl0aG9uIGludAogICAgIiIiCgogICAgY29udmVydFRvRmxvYXQgPSB0b2tlbk1hcChmbG9hdCkKICAgICIiIgogICAgUGFyc2UgYWN0aW9uIGZvciBjb252ZXJ0aW5nIHBhcnNlZCBudW1iZXJzIHRvIFB5dGhvbiBmbG9hdAogICAgIiIiCgogICAgaW50ZWdlciA9IFdvcmQobnVtcykuc2V0TmFtZSgiaW50ZWdlciIpLnNldFBhcnNlQWN0aW9uKGNvbnZlcnRUb0ludGVnZXIpCiAgICAiIiJleHByZXNzaW9uIHRoYXQgcGFyc2VzIGFuIHVuc2lnbmVkIGludGVnZXIsIHJldHVybnMgYW4gaW50IiIiCgogICAgaGV4X2ludGVnZXIgPSBXb3JkKGhleG51bXMpLnNldE5hbWUoImhleCBpbnRlZ2VyIikuc2V0UGFyc2VBY3Rpb24odG9rZW5NYXAoaW50LDE2KSkKICAgICIiImV4cHJlc3Npb24gdGhhdCBwYXJzZXMgYSBoZXhhZGVjaW1hbCBpbnRlZ2VyLCByZXR1cm5zIGFuIGludCIiIgoKICAgIHNpZ25lZF9pbnRlZ2VyID0gUmVnZXgocidbKy1dP1xkKycpLnNldE5hbWUoInNpZ25lZCBpbnRlZ2VyIikuc2V0UGFyc2VBY3Rpb24oY29udmVydFRvSW50ZWdlcikKICAgICIiImV4cHJlc3Npb24gdGhhdCBwYXJzZXMgYW4gaW50ZWdlciB3aXRoIG9wdGlvbmFsIGxlYWRpbmcgc2lnbiwgcmV0dXJucyBhbiBpbnQiIiIKCiAgICBmcmFjdGlvbiA9IChzaWduZWRfaW50ZWdlcigpLnNldFBhcnNlQWN0aW9uKGNvbnZlcnRUb0Zsb2F0KSArICcvJyArIHNpZ25lZF9pbnRlZ2VyKCkuc2V0UGFyc2VBY3Rpb24oY29udmVydFRvRmxvYXQpKS5zZXROYW1lKCJmcmFjdGlvbiIpCiAgICAiIiJmcmFjdGlvbmFsIGV4cHJlc3Npb24gb2YgYW4gaW50ZWdlciBkaXZpZGVkIGJ5IGFuIGludGVnZXIsIHJldHVybnMgYSBmbG9hdCIiIgogICAgZnJhY3Rpb24uYWRkUGFyc2VBY3Rpb24obGFtYmRhIHQ6IHRbMF0vdFstMV0pCgogICAgbWl4ZWRfaW50ZWdlciA9IChmcmFjdGlvbiB8IHNpZ25lZF9pbnRlZ2VyICsgT3B0aW9uYWwoT3B0aW9uYWwoJy0nKS5zdXBwcmVzcygpICsgZnJhY3Rpb24pKS5zZXROYW1lKCJmcmFjdGlvbiBvciBtaXhlZCBpbnRlZ2VyLWZyYWN0aW9uIikKICAgICIiIm1peGVkIGludGVnZXIgb2YgdGhlIGZvcm0gJ2ludGVnZXIgLSBmcmFjdGlvbicsIHdpdGggb3B0aW9uYWwgbGVhZGluZyBpbnRlZ2VyLCByZXR1cm5zIGZsb2F0IiIiCiAgICBtaXhlZF9pbnRlZ2VyLmFkZFBhcnNlQWN0aW9uKHN1bSkKCiAgICByZWFsID0gUmVnZXgocidbKy1dP1xkK1wuXGQqJykuc2V0TmFtZSgicmVhbCBudW1iZXIiKS5zZXRQYXJzZUFjdGlvbihjb252ZXJ0VG9GbG9hdCkKICAgICIiImV4cHJlc3Npb24gdGhhdCBwYXJzZXMgYSBmbG9hdGluZyBwb2ludCBudW1iZXIgYW5kIHJldHVybnMgYSBmbG9hdCIiIgoKICAgIHNjaV9yZWFsID0gUmVnZXgocidbKy1dP1xkKyhbZUVdWystXT9cZCt8XC5cZCooW2VFXVsrLV0/XGQrKT8pJykuc2V0TmFtZSgicmVhbCBudW1iZXIgd2l0aCBzY2llbnRpZmljIG5vdGF0aW9uIikuc2V0UGFyc2VBY3Rpb24oY29udmVydFRvRmxvYXQpCiAgICAiIiJleHByZXNzaW9uIHRoYXQgcGFyc2VzIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIHdpdGggb3B0aW9uYWwgc2NpZW50aWZpYyBub3RhdGlvbiBhbmQgcmV0dXJucyBhIGZsb2F0IiIiCgogICAgIyBzdHJlYW1saW5pbmcgdGhpcyBleHByZXNzaW9uIG1ha2VzIHRoZSBkb2NzIG5pY2VyLWxvb2tpbmcKICAgIG51bWJlciA9IChzY2lfcmVhbCB8IHJlYWwgfCBzaWduZWRfaW50ZWdlcikuc3RyZWFtbGluZSgpCiAgICAiIiJhbnkgbnVtZXJpYyBleHByZXNzaW9uLCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIFB5dGhvbiB0eXBlIiIiCgogICAgZm51bWJlciA9IFJlZ2V4KHInWystXT9cZCtcLj9cZCooW2VFXVsrLV0/XGQrKT8nKS5zZXROYW1lKCJmbnVtYmVyIikuc2V0UGFyc2VBY3Rpb24oY29udmVydFRvRmxvYXQpCiAgICAiIiJhbnkgaW50IG9yIHJlYWwgbnVtYmVyLCByZXR1cm5lZCBhcyBmbG9hdCIiIgogICAgCiAgICBpZGVudGlmaWVyID0gV29yZChhbHBoYXMrJ18nLCBhbHBoYW51bXMrJ18nKS5zZXROYW1lKCJpZGVudGlmaWVyIikKICAgICIiInR5cGljYWwgY29kZSBpZGVudGlmaWVyIChsZWFkaW5nIGFscGhhIG9yICdfJywgZm9sbG93ZWQgYnkgMCBvciBtb3JlIGFscGhhcywgbnVtcywgb3IgJ18nKSIiIgogICAgCiAgICBpcHY0X2FkZHJlc3MgPSBSZWdleChyJygyNVswLTVdfDJbMC00XVswLTldfDE/WzAtOV17MSwyfSkoXC4oMjVbMC01XXwyWzAtNF1bMC05XXwxP1swLTldezEsMn0pKXszfScpLnNldE5hbWUoIklQdjQgYWRkcmVzcyIpCiAgICAiSVB2NCBhZGRyZXNzIChDezAuMC4wLjAgLSAyNTUuMjU1LjI1NS4yNTV9KSIKCiAgICBfaXB2Nl9wYXJ0ID0gUmVnZXgocidbMC05YS1mQS1GXXsxLDR9Jykuc2V0TmFtZSgiaGV4X2ludGVnZXIiKQogICAgX2Z1bGxfaXB2Nl9hZGRyZXNzID0gKF9pcHY2X3BhcnQgKyAoJzonICsgX2lwdjZfcGFydCkqNykuc2V0TmFtZSgiZnVsbCBJUHY2IGFkZHJlc3MiKQogICAgX3Nob3J0X2lwdjZfYWRkcmVzcyA9IChPcHRpb25hbChfaXB2Nl9wYXJ0ICsgKCc6JyArIF9pcHY2X3BhcnQpKigwLDYpKSArICI6OiIgKyBPcHRpb25hbChfaXB2Nl9wYXJ0ICsgKCc6JyArIF9pcHY2X3BhcnQpKigwLDYpKSkuc2V0TmFtZSgic2hvcnQgSVB2NiBhZGRyZXNzIikKICAgIF9zaG9ydF9pcHY2X2FkZHJlc3MuYWRkQ29uZGl0aW9uKGxhbWJkYSB0OiBzdW0oMSBmb3IgdHQgaW4gdCBpZiBweXBhcnNpbmdfY29tbW9uLl9pcHY2X3BhcnQubWF0Y2hlcyh0dCkpIDwgOCkKICAgIF9taXhlZF9pcHY2X2FkZHJlc3MgPSAoIjo6ZmZmZjoiICsgaXB2NF9hZGRyZXNzKS5zZXROYW1lKCJtaXhlZCBJUHY2IGFkZHJlc3MiKQogICAgaXB2Nl9hZGRyZXNzID0gQ29tYmluZSgoX2Z1bGxfaXB2Nl9hZGRyZXNzIHwgX21peGVkX2lwdjZfYWRkcmVzcyB8IF9zaG9ydF9pcHY2X2FkZHJlc3MpLnNldE5hbWUoIklQdjYgYWRkcmVzcyIpKS5zZXROYW1lKCJJUHY2IGFkZHJlc3MiKQogICAgIklQdjYgYWRkcmVzcyAobG9uZywgc2hvcnQsIG9yIG1peGVkIGZvcm0pIgogICAgCiAgICBtYWNfYWRkcmVzcyA9IFJlZ2V4KHInWzAtOWEtZkEtRl17Mn0oWzouLV0pWzAtOWEtZkEtRl17Mn0oPzpcMVswLTlhLWZBLUZdezJ9KXs0fScpLnNldE5hbWUoIk1BQyBhZGRyZXNzIikKICAgICJNQUMgYWRkcmVzcyB4eDp4eDp4eDp4eDp4eCAobWF5IGFsc28gaGF2ZSAnLScgb3IgJy4nIGRlbGltaXRlcnMpIgoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBjb252ZXJ0VG9EYXRlKGZtdD0iJVktJW0tJWQiKToKICAgICAgICAiIiIKICAgICAgICBIZWxwZXIgdG8gY3JlYXRlIGEgcGFyc2UgYWN0aW9uIGZvciBjb252ZXJ0aW5nIHBhcnNlZCBkYXRlIHN0cmluZyB0byBQeXRob24gZGF0ZXRpbWUuZGF0ZQoKICAgICAgICBQYXJhbXMgLQogICAgICAgICAtIGZtdCAtIGZvcm1hdCB0byBiZSBwYXNzZWQgdG8gZGF0ZXRpbWUuc3RycHRpbWUgKGRlZmF1bHQ9Q3siJVktJW0tJWQifSkKCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgIGRhdGVfZXhwciA9IHB5cGFyc2luZ19jb21tb24uaXNvODYwMV9kYXRlLmNvcHkoKQogICAgICAgICAgICBkYXRlX2V4cHIuc2V0UGFyc2VBY3Rpb24ocHlwYXJzaW5nX2NvbW1vbi5jb252ZXJ0VG9EYXRlKCkpCiAgICAgICAgICAgIHByaW50KGRhdGVfZXhwci5wYXJzZVN0cmluZygiMTk5OS0xMi0zMSIpKQogICAgICAgIHByaW50czo6CiAgICAgICAgICAgIFtkYXRldGltZS5kYXRlKDE5OTksIDEyLCAzMSldCiAgICAgICAgIiIiCiAgICAgICAgZGVmIGN2dF9mbihzLGwsdCk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJldHVybiBkYXRldGltZS5zdHJwdGltZSh0WzBdLCBmbXQpLmRhdGUoKQogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvciBhcyB2ZToKICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKHMsIGwsIHN0cih2ZSkpCiAgICAgICAgcmV0dXJuIGN2dF9mbgoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBjb252ZXJ0VG9EYXRldGltZShmbXQ9IiVZLSVtLSVkVCVIOiVNOiVTLiVmIik6CiAgICAgICAgIiIiCiAgICAgICAgSGVscGVyIHRvIGNyZWF0ZSBhIHBhcnNlIGFjdGlvbiBmb3IgY29udmVydGluZyBwYXJzZWQgZGF0ZXRpbWUgc3RyaW5nIHRvIFB5dGhvbiBkYXRldGltZS5kYXRldGltZQoKICAgICAgICBQYXJhbXMgLQogICAgICAgICAtIGZtdCAtIGZvcm1hdCB0byBiZSBwYXNzZWQgdG8gZGF0ZXRpbWUuc3RycHRpbWUgKGRlZmF1bHQ9Q3siJVktJW0tJWRUJUg6JU06JVMuJWYifSkKCiAgICAgICAgRXhhbXBsZTo6CiAgICAgICAgICAgIGR0X2V4cHIgPSBweXBhcnNpbmdfY29tbW9uLmlzbzg2MDFfZGF0ZXRpbWUuY29weSgpCiAgICAgICAgICAgIGR0X2V4cHIuc2V0UGFyc2VBY3Rpb24ocHlwYXJzaW5nX2NvbW1vbi5jb252ZXJ0VG9EYXRldGltZSgpKQogICAgICAgICAgICBwcmludChkdF9leHByLnBhcnNlU3RyaW5nKCIxOTk5LTEyLTMxVDIzOjU5OjU5Ljk5OSIpKQogICAgICAgIHByaW50czo6CiAgICAgICAgICAgIFtkYXRldGltZS5kYXRldGltZSgxOTk5LCAxMiwgMzEsIDIzLCA1OSwgNTksIDk5OTAwMCldCiAgICAgICAgIiIiCiAgICAgICAgZGVmIGN2dF9mbihzLGwsdCk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJldHVybiBkYXRldGltZS5zdHJwdGltZSh0WzBdLCBmbXQpCiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yIGFzIHZlOgogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24ocywgbCwgc3RyKHZlKSkKICAgICAgICByZXR1cm4gY3Z0X2ZuCgogICAgaXNvODYwMV9kYXRlID0gUmVnZXgocicoP1A8eWVhcj5cZHs0fSkoPzotKD9QPG1vbnRoPlxkXGQpKD86LSg/UDxkYXk+XGRcZCkpPyk/Jykuc2V0TmFtZSgiSVNPODYwMSBkYXRlIikKICAgICJJU084NjAxIGRhdGUgKEN7eXl5eS1tbS1kZH0pIgoKICAgIGlzbzg2MDFfZGF0ZXRpbWUgPSBSZWdleChyJyg/UDx5ZWFyPlxkezR9KS0oP1A8bW9udGg+XGRcZCktKD9QPGRheT5cZFxkKVtUIF0oP1A8aG91cj5cZFxkKTooP1A8bWludXRlPlxkXGQpKDooP1A8c2Vjb25kPlxkXGQoXC5cZCopPyk/KT8oP1A8dHo+WnxbKy1dXGRcZDo/XGRcZCk/Jykuc2V0TmFtZSgiSVNPODYwMSBkYXRldGltZSIpCiAgICAiSVNPODYwMSBkYXRldGltZSAoQ3t5eXl5LW1tLWRkVGhoOm1tOnNzLnMoWnwrLTAwOjAwKX0pIC0gdHJhaWxpbmcgc2Vjb25kcywgbWlsbGlzZWNvbmRzLCBhbmQgdGltZXpvbmUgb3B0aW9uYWw7IGFjY2VwdHMgc2VwYXJhdGluZyBDeydUJ30gb3IgQ3snICd9IgoKICAgIHV1aWQgPSBSZWdleChyJ1swLTlhLWZBLUZdezh9KC1bMC05YS1mQS1GXXs0fSl7M30tWzAtOWEtZkEtRl17MTJ9Jykuc2V0TmFtZSgiVVVJRCIpCiAgICAiVVVJRCAoQ3t4eHh4eHh4eC14eHh4LXh4eHgteHh4eC14eHh4eHh4eHh4eHh9KSIKCiAgICBfaHRtbF9zdHJpcHBlciA9IGFueU9wZW5UYWcuc3VwcHJlc3MoKSB8IGFueUNsb3NlVGFnLnN1cHByZXNzKCkKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBzdHJpcEhUTUxUYWdzKHMsIGwsIHRva2Vucyk6CiAgICAgICAgIiIiCiAgICAgICAgUGFyc2UgYWN0aW9uIHRvIHJlbW92ZSBIVE1MIHRhZ3MgZnJvbSB3ZWIgcGFnZSBIVE1MIHNvdXJjZQoKICAgICAgICBFeGFtcGxlOjoKICAgICAgICAgICAgIyBzdHJpcCBIVE1MIGxpbmtzIGZyb20gbm9ybWFsIHRleHQgCiAgICAgICAgICAgIHRleHQgPSAnPHRkPk1vcmUgaW5mbyBhdCB0aGUgPGEgaHJlZj0iaHR0cDovL3B5cGFyc2luZy53aWtpc3BhY2VzLmNvbSI+cHlwYXJzaW5nPC9hPiB3aWtpIHBhZ2U8L3RkPicKICAgICAgICAgICAgdGQsdGRfZW5kID0gbWFrZUhUTUxUYWdzKCJURCIpCiAgICAgICAgICAgIHRhYmxlX3RleHQgPSB0ZCArIFNraXBUbyh0ZF9lbmQpLnNldFBhcnNlQWN0aW9uKHB5cGFyc2luZ19jb21tb24uc3RyaXBIVE1MVGFncykoImJvZHkiKSArIHRkX2VuZAogICAgICAgICAgICAKICAgICAgICAgICAgcHJpbnQodGFibGVfdGV4dC5wYXJzZVN0cmluZyh0ZXh0KS5ib2R5KSAjIC0+ICdNb3JlIGluZm8gYXQgdGhlIHB5cGFyc2luZyB3aWtpIHBhZ2UnCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHB5cGFyc2luZ19jb21tb24uX2h0bWxfc3RyaXBwZXIudHJhbnNmb3JtU3RyaW5nKHRva2Vuc1swXSkKCiAgICBfY29tbWFzZXBpdGVtID0gQ29tYmluZShPbmVPck1vcmUofkxpdGVyYWwoIiwiKSArIH5MaW5lRW5kKCkgKyBXb3JkKHByaW50YWJsZXMsIGV4Y2x1ZGVDaGFycz0nLCcpIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBPcHRpb25hbCggV2hpdGUoIiBcdCIpICkgKSApLnN0cmVhbWxpbmUoKS5zZXROYW1lKCJjb21tYUl0ZW0iKQogICAgY29tbWFfc2VwYXJhdGVkX2xpc3QgPSBkZWxpbWl0ZWRMaXN0KCBPcHRpb25hbCggcXVvdGVkU3RyaW5nLmNvcHkoKSB8IF9jb21tYXNlcGl0ZW0sIGRlZmF1bHQ9IiIpICkuc2V0TmFtZSgiY29tbWEgc2VwYXJhdGVkIGxpc3QiKQogICAgIiIiUHJlZGVmaW5lZCBleHByZXNzaW9uIG9mIDEgb3IgbW9yZSBwcmludGFibGUgd29yZHMgb3IgcXVvdGVkIHN0cmluZ3MsIHNlcGFyYXRlZCBieSBjb21tYXMuIiIiCgogICAgdXBjYXNlVG9rZW5zID0gc3RhdGljbWV0aG9kKHRva2VuTWFwKGxhbWJkYSB0OiBfdXN0cih0KS51cHBlcigpKSkKICAgICIiIlBhcnNlIGFjdGlvbiB0byBjb252ZXJ0IHRva2VucyB0byB1cHBlciBjYXNlLiIiIgoKICAgIGRvd25jYXNlVG9rZW5zID0gc3RhdGljbWV0aG9kKHRva2VuTWFwKGxhbWJkYSB0OiBfdXN0cih0KS5sb3dlcigpKSkKICAgICIiIlBhcnNlIGFjdGlvbiB0byBjb252ZXJ0IHRva2VucyB0byBsb3dlciBjYXNlLiIiIgoKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CgogICAgc2VsZWN0VG9rZW4gICAgPSBDYXNlbGVzc0xpdGVyYWwoInNlbGVjdCIpCiAgICBmcm9tVG9rZW4gICAgICA9IENhc2VsZXNzTGl0ZXJhbCgiZnJvbSIpCgogICAgaWRlbnQgICAgICAgICAgPSBXb3JkKGFscGhhcywgYWxwaGFudW1zICsgIl8kIikKCiAgICBjb2x1bW5OYW1lICAgICA9IGRlbGltaXRlZExpc3QoaWRlbnQsICIuIiwgY29tYmluZT1UcnVlKS5zZXRQYXJzZUFjdGlvbih1cGNhc2VUb2tlbnMpCiAgICBjb2x1bW5OYW1lTGlzdCA9IEdyb3VwKGRlbGltaXRlZExpc3QoY29sdW1uTmFtZSkpLnNldE5hbWUoImNvbHVtbnMiKQogICAgY29sdW1uU3BlYyAgICAgPSAoJyonIHwgY29sdW1uTmFtZUxpc3QpCgogICAgdGFibGVOYW1lICAgICAgPSBkZWxpbWl0ZWRMaXN0KGlkZW50LCAiLiIsIGNvbWJpbmU9VHJ1ZSkuc2V0UGFyc2VBY3Rpb24odXBjYXNlVG9rZW5zKQogICAgdGFibGVOYW1lTGlzdCAgPSBHcm91cChkZWxpbWl0ZWRMaXN0KHRhYmxlTmFtZSkpLnNldE5hbWUoInRhYmxlcyIpCiAgICAKICAgIHNpbXBsZVNRTCAgICAgID0gc2VsZWN0VG9rZW4oImNvbW1hbmQiKSArIGNvbHVtblNwZWMoImNvbHVtbnMiKSArIGZyb21Ub2tlbiArIHRhYmxlTmFtZUxpc3QoInRhYmxlcyIpCgogICAgIyBkZW1vIHJ1blRlc3RzIG1ldGhvZCwgaW5jbHVkaW5nIGVtYmVkZGVkIGNvbW1lbnRzIGluIHRlc3Qgc3RyaW5nCiAgICBzaW1wbGVTUUwucnVuVGVzdHMoIiIiCiAgICAgICAgIyAnKicgYXMgY29sdW1uIGxpc3QgYW5kIGRvdHRlZCB0YWJsZSBuYW1lCiAgICAgICAgc2VsZWN0ICogZnJvbSBTWVMuWFlaWlkKCiAgICAgICAgIyBjYXNlbGVzcyBtYXRjaCBvbiAiU0VMRUNUIiwgYW5kIGNhc3RzIGJhY2sgdG8gInNlbGVjdCIKICAgICAgICBTRUxFQ1QgKiBmcm9tIFhZWlpZLCBBQkMKCiAgICAgICAgIyBsaXN0IG9mIGNvbHVtbiBuYW1lcywgYW5kIG1peGVkIGNhc2UgU0VMRUNUIGtleXdvcmQKICAgICAgICBTZWxlY3QgQUEsQkIsQ0MgZnJvbSBTeXMuZHVhbAoKICAgICAgICAjIG11bHRpcGxlIHRhYmxlcwogICAgICAgIFNlbGVjdCBBLCBCLCBDIGZyb20gU3lzLmR1YWwsIFRhYmxlMgoKICAgICAgICAjIGludmFsaWQgU0VMRUNUIGtleXdvcmQgLSBzaG91bGQgZmFpbAogICAgICAgIFhlbGVjdCBBLCBCLCBDIGZyb20gU3lzLmR1YWwKCiAgICAgICAgIyBpbmNvbXBsZXRlIGNvbW1hbmQgLSBzaG91bGQgZmFpbAogICAgICAgIFNlbGVjdAoKICAgICAgICAjIGludmFsaWQgY29sdW1uIG5hbWUgLSBzaG91bGQgZmFpbAogICAgICAgIFNlbGVjdCBeXl4gZnJveCBTeXMuZHVhbAoKICAgICAgICAiIiIpCgogICAgcHlwYXJzaW5nX2NvbW1vbi5udW1iZXIucnVuVGVzdHMoIiIiCiAgICAgICAgMTAwCiAgICAgICAgLTEwMAogICAgICAgICsxMDAKICAgICAgICAzLjE0MTU5CiAgICAgICAgNi4wMmUyMwogICAgICAgIDFlLTEyCiAgICAgICAgIiIiKQoKICAgICMgYW55IGludCBvciByZWFsIG51bWJlciwgcmV0dXJuZWQgYXMgZmxvYXQKICAgIHB5cGFyc2luZ19jb21tb24uZm51bWJlci5ydW5UZXN0cygiIiIKICAgICAgICAxMDAKICAgICAgICAtMTAwCiAgICAgICAgKzEwMAogICAgICAgIDMuMTQxNTkKICAgICAgICA2LjAyZTIzCiAgICAgICAgMWUtMTIKICAgICAgICAiIiIpCgogICAgcHlwYXJzaW5nX2NvbW1vbi5oZXhfaW50ZWdlci5ydW5UZXN0cygiIiIKICAgICAgICAxMDAKICAgICAgICBGRgogICAgICAgICIiIikKCiAgICBpbXBvcnQgdXVpZAogICAgcHlwYXJzaW5nX2NvbW1vbi51dWlkLnNldFBhcnNlQWN0aW9uKHRva2VuTWFwKHV1aWQuVVVJRCkpCiAgICBweXBhcnNpbmdfY29tbW9uLnV1aWQucnVuVGVzdHMoIiIiCiAgICAgICAgMTIzNDU2NzgtMTIzNC01Njc4LTEyMzQtNTY3ODEyMzQ1Njc4CiAgICAgICAgIiIiKQpQSwMEFAAAAAAAAAAhAGAeB40FAwAABQMAACgAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmUtdmVuZG9yLnB5aW1wb3J0IG9zCmltcG9ydCBzeXMKaW1wb3J0IHBpcAppbXBvcnQgZ2xvYgppbXBvcnQgc2h1dGlsCgpoZXJlID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpCgpkZWYgdXNhZ2UoKToKICAgIHByaW50KCJVc2FnZTogcmUtdmVuZG9yLnB5IFtjbGVhbnx2ZW5kb3JdIikKICAgIHN5cy5leGl0KDEpCgpkZWYgY2xlYW4oKToKICAgIGZvciBmbiBpbiBvcy5saXN0ZGlyKGhlcmUpOgogICAgICAgIGRpcm5hbWUgPSBvcy5wYXRoLmpvaW4oaGVyZSwgZm4pCiAgICAgICAgaWYgb3MucGF0aC5pc2RpcihkaXJuYW1lKToKICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShkaXJuYW1lKQogICAgIyBzaXggaXMgYSBzaW5nbGUgZmlsZSwgbm90IGEgcGFja2FnZQogICAgb3MudW5saW5rKG9zLnBhdGguam9pbihoZXJlLCAnc2l4LnB5JykpCgpkZWYgdmVuZG9yKCk6CiAgICBwaXAubWFpbihbJ2luc3RhbGwnLCAnLXQnLCBoZXJlLCAnLXInLCAndmVuZG9yLnR4dCddKQogICAgZm9yIGRpcm5hbWUgaW4gZ2xvYi5nbG9iKCcqLmVnZy1pbmZvJyk6CiAgICAgICAgc2h1dGlsLnJtdHJlZShkaXJuYW1lKQoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIGlmIGxlbihzeXMuYXJndikgIT0gMjoKICAgICAgICB1c2FnZSgpCiAgICBpZiBzeXMuYXJndlsxXSA9PSAnY2xlYW4nOgogICAgICAgIGNsZWFuKCkKICAgIGVsaWYgc3lzLmFyZ3ZbMV0gPT0gJ3ZlbmRvcic6CiAgICAgICAgdmVuZG9yKCkKICAgIGVsc2U6CiAgICAgICAgdXNhZ2UoKQpQSwMEFAAAAAAAAAAhAB/G7jD3DQAA9w0AADAAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvX19pbml0X18ucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoKIyAgIF9fCiMgIC9fXykgIF8gIF8gICAgIF8gICBfIF8vICAgXwojIC8gKCAgICgtICgvICgvICgtIF8pICAvICBfKQojICAgICAgICAgIC8KCiIiIgpSZXF1ZXN0cyBIVFRQIExpYnJhcnkKfn5+fn5+fn5+fn5+fn5+fn5+fn5+CgpSZXF1ZXN0cyBpcyBhbiBIVFRQIGxpYnJhcnksIHdyaXR0ZW4gaW4gUHl0aG9uLCBmb3IgaHVtYW4gYmVpbmdzLiBCYXNpYyBHRVQKdXNhZ2U6CgogICA+Pj4gaW1wb3J0IHJlcXVlc3RzCiAgID4+PiByID0gcmVxdWVzdHMuZ2V0KCdodHRwczovL3d3dy5weXRob24ub3JnJykKICAgPj4+IHIuc3RhdHVzX2NvZGUKICAgMjAwCiAgID4+PiAnUHl0aG9uIGlzIGEgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UnIGluIHIuY29udGVudAogICBUcnVlCgouLi4gb3IgUE9TVDoKCiAgID4+PiBwYXlsb2FkID0gZGljdChrZXkxPSd2YWx1ZTEnLCBrZXkyPSd2YWx1ZTInKQogICA+Pj4gciA9IHJlcXVlc3RzLnBvc3QoJ2h0dHA6Ly9odHRwYmluLm9yZy9wb3N0JywgZGF0YT1wYXlsb2FkKQogICA+Pj4gcHJpbnQoci50ZXh0KQogICB7CiAgICAgLi4uCiAgICAgImZvcm0iOiB7CiAgICAgICAia2V5MiI6ICJ2YWx1ZTIiLAogICAgICAgImtleTEiOiAidmFsdWUxIgogICAgIH0sCiAgICAgLi4uCiAgIH0KClRoZSBvdGhlciBIVFRQIG1ldGhvZHMgYXJlIHN1cHBvcnRlZCAtIHNlZSBgcmVxdWVzdHMuYXBpYC4gRnVsbCBkb2N1bWVudGF0aW9uCmlzIGF0IDxodHRwOi8vcHl0aG9uLXJlcXVlc3RzLm9yZz4uCgo6Y29weXJpZ2h0OiAoYykgMjAxNyBieSBLZW5uZXRoIFJlaXR6Lgo6bGljZW5zZTogQXBhY2hlIDIuMCwgc2VlIExJQ0VOU0UgZm9yIG1vcmUgZGV0YWlscy4KIiIiCgpmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCB1cmxsaWIzCmZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IGNoYXJkZXQKaW1wb3J0IHdhcm5pbmdzCmZyb20gLmV4Y2VwdGlvbnMgaW1wb3J0IFJlcXVlc3RzRGVwZW5kZW5jeVdhcm5pbmcKCgpkZWYgY2hlY2tfY29tcGF0aWJpbGl0eSh1cmxsaWIzX3ZlcnNpb24sIGNoYXJkZXRfdmVyc2lvbik6CiAgICB1cmxsaWIzX3ZlcnNpb24gPSB1cmxsaWIzX3ZlcnNpb24uc3BsaXQoJy4nKQogICAgYXNzZXJ0IHVybGxpYjNfdmVyc2lvbiAhPSBbJ2RldiddICAjIFZlcmlmeSB1cmxsaWIzIGlzbid0IGluc3RhbGxlZCBmcm9tIGdpdC4KCiAgICAjIFNvbWV0aW1lcywgdXJsbGliMyBvbmx5IHJlcG9ydHMgaXRzIHZlcnNpb24gYXMgMTYuMS4KICAgIGlmIGxlbih1cmxsaWIzX3ZlcnNpb24pID09IDI6CiAgICAgICAgdXJsbGliM192ZXJzaW9uLmFwcGVuZCgnMCcpCgogICAgIyBDaGVjayB1cmxsaWIzIGZvciBjb21wYXRpYmlsaXR5LgogICAgbWFqb3IsIG1pbm9yLCBwYXRjaCA9IHVybGxpYjNfdmVyc2lvbiAgIyBub3FhOiBGODExCiAgICBtYWpvciwgbWlub3IsIHBhdGNoID0gaW50KG1ham9yKSwgaW50KG1pbm9yKSwgaW50KHBhdGNoKQogICAgIyB1cmxsaWIzID49IDEuMjEuMSwgPD0gMS4yMgogICAgYXNzZXJ0IG1ham9yID09IDEKICAgIGFzc2VydCBtaW5vciA+PSAyMQogICAgYXNzZXJ0IG1pbm9yIDw9IDIyCgogICAgIyBDaGVjayBjaGFyZGV0IGZvciBjb21wYXRpYmlsaXR5LgogICAgbWFqb3IsIG1pbm9yLCBwYXRjaCA9IGNoYXJkZXRfdmVyc2lvbi5zcGxpdCgnLicpWzozXQogICAgbWFqb3IsIG1pbm9yLCBwYXRjaCA9IGludChtYWpvciksIGludChtaW5vciksIGludChwYXRjaCkKICAgICMgY2hhcmRldCA+PSAzLjAuMiwgPCAzLjEuMAogICAgYXNzZXJ0IG1ham9yID09IDMKICAgIGFzc2VydCBtaW5vciA8IDEKICAgIGFzc2VydCBwYXRjaCA+PSAyCgoKIyBDaGVjayBpbXBvcnRlZCBkZXBlbmRlbmNpZXMgZm9yIGNvbXBhdGliaWxpdHkuCnRyeToKICAgIGNoZWNrX2NvbXBhdGliaWxpdHkodXJsbGliMy5fX3ZlcnNpb25fXywgY2hhcmRldC5fX3ZlcnNpb25fXykKZXhjZXB0IChBc3NlcnRpb25FcnJvciwgVmFsdWVFcnJvcik6CiAgICB3YXJuaW5ncy53YXJuKCJ1cmxsaWIzICh7MH0pIG9yIGNoYXJkZXQgKHsxfSkgZG9lc24ndCBtYXRjaCBhIHN1cHBvcnRlZCAiCiAgICAgICAgICAgICAgICAgICJ2ZXJzaW9uISIuZm9ybWF0KHVybGxpYjMuX192ZXJzaW9uX18sIGNoYXJkZXQuX192ZXJzaW9uX18pLAogICAgICAgICAgICAgICAgICBSZXF1ZXN0c0RlcGVuZGVuY3lXYXJuaW5nKQoKIyBBdHRlbXB0IHRvIGVuYWJsZSB1cmxsaWIzJ3MgU05JIHN1cHBvcnQsIGlmIHBvc3NpYmxlCiMgdHJ5OgojICAgICBmcm9tIHBpcC5fdmVuZG9yLnVybGxpYjMuY29udHJpYiBpbXBvcnQgcHlvcGVuc3NsCiMgICAgIHB5b3BlbnNzbC5pbmplY3RfaW50b191cmxsaWIzKCkKIyBleGNlcHQgSW1wb3J0RXJyb3I6CiMgICAgIHBhc3MKCiMgdXJsbGliMydzIERlcGVuZGVuY3lXYXJuaW5ncyBzaG91bGQgYmUgc2lsZW5jZWQuCmZyb20gcGlwLl92ZW5kb3IudXJsbGliMy5leGNlcHRpb25zIGltcG9ydCBEZXBlbmRlbmN5V2FybmluZwp3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoJ2lnbm9yZScsIERlcGVuZGVuY3lXYXJuaW5nKQoKZnJvbSAuX192ZXJzaW9uX18gaW1wb3J0IF9fdGl0bGVfXywgX19kZXNjcmlwdGlvbl9fLCBfX3VybF9fLCBfX3ZlcnNpb25fXwpmcm9tIC5fX3ZlcnNpb25fXyBpbXBvcnQgX19idWlsZF9fLCBfX2F1dGhvcl9fLCBfX2F1dGhvcl9lbWFpbF9fLCBfX2xpY2Vuc2VfXwpmcm9tIC5fX3ZlcnNpb25fXyBpbXBvcnQgX19jb3B5cmlnaHRfXywgX19jYWtlX18KCmZyb20gLiBpbXBvcnQgdXRpbHMKZnJvbSAuIGltcG9ydCBwYWNrYWdlcwpmcm9tIC5tb2RlbHMgaW1wb3J0IFJlcXVlc3QsIFJlc3BvbnNlLCBQcmVwYXJlZFJlcXVlc3QKZnJvbSAuYXBpIGltcG9ydCByZXF1ZXN0LCBnZXQsIGhlYWQsIHBvc3QsIHBhdGNoLCBwdXQsIGRlbGV0ZSwgb3B0aW9ucwpmcm9tIC5zZXNzaW9ucyBpbXBvcnQgc2Vzc2lvbiwgU2Vzc2lvbgpmcm9tIC5zdGF0dXNfY29kZXMgaW1wb3J0IGNvZGVzCmZyb20gLmV4Y2VwdGlvbnMgaW1wb3J0ICgKICAgIFJlcXVlc3RFeGNlcHRpb24sIFRpbWVvdXQsIFVSTFJlcXVpcmVkLAogICAgVG9vTWFueVJlZGlyZWN0cywgSFRUUEVycm9yLCBDb25uZWN0aW9uRXJyb3IsCiAgICBGaWxlTW9kZVdhcm5pbmcsIENvbm5lY3RUaW1lb3V0LCBSZWFkVGltZW91dAopCgojIFNldCBkZWZhdWx0IGxvZ2dpbmcgaGFuZGxlciB0byBhdm9pZCAiTm8gaGFuZGxlciBmb3VuZCIgd2FybmluZ3MuCmltcG9ydCBsb2dnaW5nCnRyeTogICMgUHl0aG9uIDIuNysKICAgIGZyb20gbG9nZ2luZyBpbXBvcnQgTnVsbEhhbmRsZXIKZXhjZXB0IEltcG9ydEVycm9yOgogICAgY2xhc3MgTnVsbEhhbmRsZXIobG9nZ2luZy5IYW5kbGVyKToKICAgICAgICBkZWYgZW1pdChzZWxmLCByZWNvcmQpOgogICAgICAgICAgICBwYXNzCgpsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykuYWRkSGFuZGxlcihOdWxsSGFuZGxlcigpKQoKIyBGaWxlTW9kZVdhcm5pbmdzIGdvIG9mZiBwZXIgdGhlIGRlZmF1bHQuCndhcm5pbmdzLnNpbXBsZWZpbHRlcignZGVmYXVsdCcsIEZpbGVNb2RlV2FybmluZywgYXBwZW5kPVRydWUpClBLAwQUAAAAAAAAACEA33x5JbQBAAC0AQAAMwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9fX3ZlcnNpb25fXy5weSMgLi0uIC4tLiAuLS4gLiAuIC4tLiAuLS4gLi0uIC4tLgojIHwoICB8LSAgfC58IHwgfCB8LSAgYC0uICB8ICBgLS4KIyAnICcgYC0nIGAtYC5gLScgYC0nIGAtJyAgJyAgYC0nCgpfX3RpdGxlX18gPSAncmVxdWVzdHMnCl9fZGVzY3JpcHRpb25fXyA9ICdQeXRob24gSFRUUCBmb3IgSHVtYW5zLicKX191cmxfXyA9ICdodHRwOi8vcHl0aG9uLXJlcXVlc3RzLm9yZycKX192ZXJzaW9uX18gPSAnMi4xOC40JwpfX2J1aWxkX18gPSAweDAyMTgwNApfX2F1dGhvcl9fID0gJ0tlbm5ldGggUmVpdHonCl9fYXV0aG9yX2VtYWlsX18gPSAnbWVAa2VubmV0aHJlaXR6Lm9yZycKX19saWNlbnNlX18gPSAnQXBhY2hlIDIuMCcKX19jb3B5cmlnaHRfXyA9ICdDb3B5cmlnaHQgMjAxNyBLZW5uZXRoIFJlaXR6JwpfX2Nha2VfXyA9IHUnXHUyNzI4IFxVMDAwMWYzNzAgXHUyNzI4JwpQSwMEFAAAAAAAAAAhAIipObtIBAAASAQAADcAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvX2ludGVybmFsX3V0aWxzLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KCiIiIgpyZXF1ZXN0cy5faW50ZXJuYWxfdXRpbHMKfn5+fn5+fn5+fn5+fn4KClByb3ZpZGVzIHV0aWxpdHkgZnVuY3Rpb25zIHRoYXQgYXJlIGNvbnN1bWVkIGludGVybmFsbHkgYnkgUmVxdWVzdHMKd2hpY2ggZGVwZW5kIG9uIGV4dHJlbWVseSBmZXcgZXh0ZXJuYWwgaGVscGVycyAoc3VjaCBhcyBjb21wYXQpCiIiIgoKZnJvbSAuY29tcGF0IGltcG9ydCBpc19weTIsIGJ1aWx0aW5fc3RyLCBzdHIKCgpkZWYgdG9fbmF0aXZlX3N0cmluZyhzdHJpbmcsIGVuY29kaW5nPSdhc2NpaScpOgogICAgIiIiR2l2ZW4gYSBzdHJpbmcgb2JqZWN0LCByZWdhcmRsZXNzIG9mIHR5cGUsIHJldHVybnMgYSByZXByZXNlbnRhdGlvbiBvZgogICAgdGhhdCBzdHJpbmcgaW4gdGhlIG5hdGl2ZSBzdHJpbmcgdHlwZSwgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHdoZXJlCiAgICBuZWNlc3NhcnkuIFRoaXMgYXNzdW1lcyBBU0NJSSB1bmxlc3MgdG9sZCBvdGhlcndpc2UuCiAgICAiIiIKICAgIGlmIGlzaW5zdGFuY2Uoc3RyaW5nLCBidWlsdGluX3N0cik6CiAgICAgICAgb3V0ID0gc3RyaW5nCiAgICBlbHNlOgogICAgICAgIGlmIGlzX3B5MjoKICAgICAgICAgICAgb3V0ID0gc3RyaW5nLmVuY29kZShlbmNvZGluZykKICAgICAgICBlbHNlOgogICAgICAgICAgICBvdXQgPSBzdHJpbmcuZGVjb2RlKGVuY29kaW5nKQoKICAgIHJldHVybiBvdXQKCgpkZWYgdW5pY29kZV9pc19hc2NpaSh1X3N0cmluZyk6CiAgICAiIiJEZXRlcm1pbmUgaWYgdW5pY29kZSBzdHJpbmcgb25seSBjb250YWlucyBBU0NJSSBjaGFyYWN0ZXJzLgoKICAgIDpwYXJhbSBzdHIgdV9zdHJpbmc6IHVuaWNvZGUgc3RyaW5nIHRvIGNoZWNrLiBNdXN0IGJlIHVuaWNvZGUKICAgICAgICBhbmQgbm90IFB5dGhvbiAyIGBzdHJgLgogICAgOnJ0eXBlOiBib29sCiAgICAiIiIKICAgIGFzc2VydCBpc2luc3RhbmNlKHVfc3RyaW5nLCBzdHIpCiAgICB0cnk6CiAgICAgICAgdV9zdHJpbmcuZW5jb2RlKCdhc2NpaScpCiAgICAgICAgcmV0dXJuIFRydWUKICAgIGV4Y2VwdCBVbmljb2RlRW5jb2RlRXJyb3I6CiAgICAgICAgcmV0dXJuIEZhbHNlClBLAwQUAAAAAAAAACEAI1DeUhhSAAAYUgAAMAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9hZGFwdGVycy5weSMgLSotIGNvZGluZzogdXRmLTggLSotCgoiIiIKcmVxdWVzdHMuYWRhcHRlcnMKfn5+fn5+fn5+fn5+fn5+fn4KClRoaXMgbW9kdWxlIGNvbnRhaW5zIHRoZSB0cmFuc3BvcnQgYWRhcHRlcnMgdGhhdCBSZXF1ZXN0cyB1c2VzIHRvIGRlZmluZQphbmQgbWFpbnRhaW4gY29ubmVjdGlvbnMuCiIiIgoKaW1wb3J0IG9zLnBhdGgKaW1wb3J0IHNvY2tldAoKZnJvbSBwaXAuX3ZlbmRvci51cmxsaWIzLnBvb2xtYW5hZ2VyIGltcG9ydCBQb29sTWFuYWdlciwgcHJveHlfZnJvbV91cmwKZnJvbSBwaXAuX3ZlbmRvci51cmxsaWIzLnJlc3BvbnNlIGltcG9ydCBIVFRQUmVzcG9uc2UKZnJvbSBwaXAuX3ZlbmRvci51cmxsaWIzLnV0aWwgaW1wb3J0IFRpbWVvdXQgYXMgVGltZW91dFNhdWNlCmZyb20gcGlwLl92ZW5kb3IudXJsbGliMy51dGlsLnJldHJ5IGltcG9ydCBSZXRyeQpmcm9tIHBpcC5fdmVuZG9yLnVybGxpYjMuZXhjZXB0aW9ucyBpbXBvcnQgQ2xvc2VkUG9vbEVycm9yCmZyb20gcGlwLl92ZW5kb3IudXJsbGliMy5leGNlcHRpb25zIGltcG9ydCBDb25uZWN0VGltZW91dEVycm9yCmZyb20gcGlwLl92ZW5kb3IudXJsbGliMy5leGNlcHRpb25zIGltcG9ydCBIVFRQRXJyb3IgYXMgX0hUVFBFcnJvcgpmcm9tIHBpcC5fdmVuZG9yLnVybGxpYjMuZXhjZXB0aW9ucyBpbXBvcnQgTWF4UmV0cnlFcnJvcgpmcm9tIHBpcC5fdmVuZG9yLnVybGxpYjMuZXhjZXB0aW9ucyBpbXBvcnQgTmV3Q29ubmVjdGlvbkVycm9yCmZyb20gcGlwLl92ZW5kb3IudXJsbGliMy5leGNlcHRpb25zIGltcG9ydCBQcm94eUVycm9yIGFzIF9Qcm94eUVycm9yCmZyb20gcGlwLl92ZW5kb3IudXJsbGliMy5leGNlcHRpb25zIGltcG9ydCBQcm90b2NvbEVycm9yCmZyb20gcGlwLl92ZW5kb3IudXJsbGliMy5leGNlcHRpb25zIGltcG9ydCBSZWFkVGltZW91dEVycm9yCmZyb20gcGlwLl92ZW5kb3IudXJsbGliMy5leGNlcHRpb25zIGltcG9ydCBTU0xFcnJvciBhcyBfU1NMRXJyb3IKZnJvbSBwaXAuX3ZlbmRvci51cmxsaWIzLmV4Y2VwdGlvbnMgaW1wb3J0IFJlc3BvbnNlRXJyb3IKCmZyb20gLm1vZGVscyBpbXBvcnQgUmVzcG9uc2UKZnJvbSAuY29tcGF0IGltcG9ydCB1cmxwYXJzZSwgYmFzZXN0cmluZwpmcm9tIC51dGlscyBpbXBvcnQgKERFRkFVTFRfQ0FfQlVORExFX1BBVEgsIGdldF9lbmNvZGluZ19mcm9tX2hlYWRlcnMsCiAgICAgICAgICAgICAgICAgICAgcHJlcGVuZF9zY2hlbWVfaWZfbmVlZGVkLCBnZXRfYXV0aF9mcm9tX3VybCwgdXJsZGVmcmFnYXV0aCwKICAgICAgICAgICAgICAgICAgICBzZWxlY3RfcHJveHkpCmZyb20gLnN0cnVjdHVyZXMgaW1wb3J0IENhc2VJbnNlbnNpdGl2ZURpY3QKZnJvbSAuY29va2llcyBpbXBvcnQgZXh0cmFjdF9jb29raWVzX3RvX2phcgpmcm9tIC5leGNlcHRpb25zIGltcG9ydCAoQ29ubmVjdGlvbkVycm9yLCBDb25uZWN0VGltZW91dCwgUmVhZFRpbWVvdXQsIFNTTEVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgUHJveHlFcnJvciwgUmV0cnlFcnJvciwgSW52YWxpZFNjaGVtYSkKZnJvbSAuYXV0aCBpbXBvcnQgX2Jhc2ljX2F1dGhfc3RyCgp0cnk6CiAgICBmcm9tIHBpcC5fdmVuZG9yLnVybGxpYjMuY29udHJpYi5zb2NrcyBpbXBvcnQgU09DS1NQcm94eU1hbmFnZXIKZXhjZXB0IEltcG9ydEVycm9yOgogICAgZGVmIFNPQ0tTUHJveHlNYW5hZ2VyKCphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgcmFpc2UgSW52YWxpZFNjaGVtYSgiTWlzc2luZyBkZXBlbmRlbmNpZXMgZm9yIFNPQ0tTIHN1cHBvcnQuIikKCkRFRkFVTFRfUE9PTEJMT0NLID0gRmFsc2UKREVGQVVMVF9QT09MU0laRSA9IDEwCkRFRkFVTFRfUkVUUklFUyA9IDAKREVGQVVMVF9QT09MX1RJTUVPVVQgPSBOb25lCgoKY2xhc3MgQmFzZUFkYXB0ZXIob2JqZWN0KToKICAgICIiIlRoZSBCYXNlIFRyYW5zcG9ydCBBZGFwdGVyIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHN1cGVyKEJhc2VBZGFwdGVyLCBzZWxmKS5fX2luaXRfXygpCgogICAgZGVmIHNlbmQoc2VsZiwgcmVxdWVzdCwgc3RyZWFtPUZhbHNlLCB0aW1lb3V0PU5vbmUsIHZlcmlmeT1UcnVlLAogICAgICAgICAgICAgY2VydD1Ob25lLCBwcm94aWVzPU5vbmUpOgogICAgICAgICIiIlNlbmRzIFByZXBhcmVkUmVxdWVzdCBvYmplY3QuIFJldHVybnMgUmVzcG9uc2Ugb2JqZWN0LgoKICAgICAgICA6cGFyYW0gcmVxdWVzdDogVGhlIDpjbGFzczpgUHJlcGFyZWRSZXF1ZXN0IDxQcmVwYXJlZFJlcXVlc3Q+YCBiZWluZyBzZW50LgogICAgICAgIDpwYXJhbSBzdHJlYW06IChvcHRpb25hbCkgV2hldGhlciB0byBzdHJlYW0gdGhlIHJlcXVlc3QgY29udGVudC4KICAgICAgICA6cGFyYW0gdGltZW91dDogKG9wdGlvbmFsKSBIb3cgbG9uZyB0byB3YWl0IGZvciB0aGUgc2VydmVyIHRvIHNlbmQKICAgICAgICAgICAgZGF0YSBiZWZvcmUgZ2l2aW5nIHVwLCBhcyBhIGZsb2F0LCBvciBhIDpyZWY6YChjb25uZWN0IHRpbWVvdXQsCiAgICAgICAgICAgIHJlYWQgdGltZW91dCkgPHRpbWVvdXRzPmAgdHVwbGUuCiAgICAgICAgOnR5cGUgdGltZW91dDogZmxvYXQgb3IgdHVwbGUKICAgICAgICA6cGFyYW0gdmVyaWZ5OiAob3B0aW9uYWwpIEVpdGhlciBhIGJvb2xlYW4sIGluIHdoaWNoIGNhc2UgaXQgY29udHJvbHMgd2hldGhlciB3ZSB2ZXJpZnkKICAgICAgICAgICAgdGhlIHNlcnZlcidzIFRMUyBjZXJ0aWZpY2F0ZSwgb3IgYSBzdHJpbmcsIGluIHdoaWNoIGNhc2UgaXQgbXVzdCBiZSBhIHBhdGgKICAgICAgICAgICAgdG8gYSBDQSBidW5kbGUgdG8gdXNlCiAgICAgICAgOnBhcmFtIGNlcnQ6IChvcHRpb25hbCkgQW55IHVzZXItcHJvdmlkZWQgU1NMIGNlcnRpZmljYXRlIHRvIGJlIHRydXN0ZWQuCiAgICAgICAgOnBhcmFtIHByb3hpZXM6IChvcHRpb25hbCkgVGhlIHByb3hpZXMgZGljdGlvbmFyeSB0byBhcHBseSB0byB0aGUgcmVxdWVzdC4KICAgICAgICAiIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCgogICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgICIiIkNsZWFucyB1cCBhZGFwdGVyIHNwZWNpZmljIGl0ZW1zLiIiIgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKCgpjbGFzcyBIVFRQQWRhcHRlcihCYXNlQWRhcHRlcik6CiAgICAiIiJUaGUgYnVpbHQtaW4gSFRUUCBBZGFwdGVyIGZvciB1cmxsaWIzLgoKICAgIFByb3ZpZGVzIGEgZ2VuZXJhbC1jYXNlIGludGVyZmFjZSBmb3IgUmVxdWVzdHMgc2Vzc2lvbnMgdG8gY29udGFjdCBIVFRQIGFuZAogICAgSFRUUFMgdXJscyBieSBpbXBsZW1lbnRpbmcgdGhlIFRyYW5zcG9ydCBBZGFwdGVyIGludGVyZmFjZS4gVGhpcyBjbGFzcyB3aWxsCiAgICB1c3VhbGx5IGJlIGNyZWF0ZWQgYnkgdGhlIDpjbGFzczpgU2Vzc2lvbiA8U2Vzc2lvbj5gIGNsYXNzIHVuZGVyIHRoZQogICAgY292ZXJzLgoKICAgIDpwYXJhbSBwb29sX2Nvbm5lY3Rpb25zOiBUaGUgbnVtYmVyIG9mIHVybGxpYjMgY29ubmVjdGlvbiBwb29scyB0byBjYWNoZS4KICAgIDpwYXJhbSBwb29sX21heHNpemU6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25uZWN0aW9ucyB0byBzYXZlIGluIHRoZSBwb29sLgogICAgOnBhcmFtIG1heF9yZXRyaWVzOiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcmV0cmllcyBlYWNoIGNvbm5lY3Rpb24KICAgICAgICBzaG91bGQgYXR0ZW1wdC4gTm90ZSwgdGhpcyBhcHBsaWVzIG9ubHkgdG8gZmFpbGVkIEROUyBsb29rdXBzLCBzb2NrZXQKICAgICAgICBjb25uZWN0aW9ucyBhbmQgY29ubmVjdGlvbiB0aW1lb3V0cywgbmV2ZXIgdG8gcmVxdWVzdHMgd2hlcmUgZGF0YSBoYXMKICAgICAgICBtYWRlIGl0IHRvIHRoZSBzZXJ2ZXIuIEJ5IGRlZmF1bHQsIFJlcXVlc3RzIGRvZXMgbm90IHJldHJ5IGZhaWxlZAogICAgICAgIGNvbm5lY3Rpb25zLiBJZiB5b3UgbmVlZCBncmFudWxhciBjb250cm9sIG92ZXIgdGhlIGNvbmRpdGlvbnMgdW5kZXIKICAgICAgICB3aGljaCB3ZSByZXRyeSBhIHJlcXVlc3QsIGltcG9ydCB1cmxsaWIzJ3MgYGBSZXRyeWBgIGNsYXNzIGFuZCBwYXNzCiAgICAgICAgdGhhdCBpbnN0ZWFkLgogICAgOnBhcmFtIHBvb2xfYmxvY2s6IFdoZXRoZXIgdGhlIGNvbm5lY3Rpb24gcG9vbCBzaG91bGQgYmxvY2sgZm9yIGNvbm5lY3Rpb25zLgoKICAgIFVzYWdlOjoKCiAgICAgID4+PiBpbXBvcnQgcmVxdWVzdHMKICAgICAgPj4+IHMgPSByZXF1ZXN0cy5TZXNzaW9uKCkKICAgICAgPj4+IGEgPSByZXF1ZXN0cy5hZGFwdGVycy5IVFRQQWRhcHRlcihtYXhfcmV0cmllcz0zKQogICAgICA+Pj4gcy5tb3VudCgnaHR0cDovLycsIGEpCiAgICAiIiIKICAgIF9fYXR0cnNfXyA9IFsnbWF4X3JldHJpZXMnLCAnY29uZmlnJywgJ19wb29sX2Nvbm5lY3Rpb25zJywgJ19wb29sX21heHNpemUnLAogICAgICAgICAgICAgICAgICdfcG9vbF9ibG9jayddCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHBvb2xfY29ubmVjdGlvbnM9REVGQVVMVF9QT09MU0laRSwKICAgICAgICAgICAgICAgICBwb29sX21heHNpemU9REVGQVVMVF9QT09MU0laRSwgbWF4X3JldHJpZXM9REVGQVVMVF9SRVRSSUVTLAogICAgICAgICAgICAgICAgIHBvb2xfYmxvY2s9REVGQVVMVF9QT09MQkxPQ0spOgogICAgICAgIGlmIG1heF9yZXRyaWVzID09IERFRkFVTFRfUkVUUklFUzoKICAgICAgICAgICAgc2VsZi5tYXhfcmV0cmllcyA9IFJldHJ5KDAsIHJlYWQ9RmFsc2UpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5tYXhfcmV0cmllcyA9IFJldHJ5LmZyb21faW50KG1heF9yZXRyaWVzKQogICAgICAgIHNlbGYuY29uZmlnID0ge30KICAgICAgICBzZWxmLnByb3h5X21hbmFnZXIgPSB7fQoKICAgICAgICBzdXBlcihIVFRQQWRhcHRlciwgc2VsZikuX19pbml0X18oKQoKICAgICAgICBzZWxmLl9wb29sX2Nvbm5lY3Rpb25zID0gcG9vbF9jb25uZWN0aW9ucwogICAgICAgIHNlbGYuX3Bvb2xfbWF4c2l6ZSA9IHBvb2xfbWF4c2l6ZQogICAgICAgIHNlbGYuX3Bvb2xfYmxvY2sgPSBwb29sX2Jsb2NrCgogICAgICAgIHNlbGYuaW5pdF9wb29sbWFuYWdlcihwb29sX2Nvbm5lY3Rpb25zLCBwb29sX21heHNpemUsIGJsb2NrPXBvb2xfYmxvY2spCgogICAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToKICAgICAgICByZXR1cm4gZGljdCgoYXR0ciwgZ2V0YXR0cihzZWxmLCBhdHRyLCBOb25lKSkgZm9yIGF0dHIgaW4KICAgICAgICAgICAgICAgICAgICBzZWxmLl9fYXR0cnNfXykKCiAgICBkZWYgX19zZXRzdGF0ZV9fKHNlbGYsIHN0YXRlKToKICAgICAgICAjIENhbid0IGhhbmRsZSBieSBhZGRpbmcgJ3Byb3h5X21hbmFnZXInIHRvIHNlbGYuX19hdHRyc19fIGJlY2F1c2UKICAgICAgICAjIHNlbGYucG9vbG1hbmFnZXIgdXNlcyBhIGxhbWJkYSBmdW5jdGlvbiwgd2hpY2ggaXNuJ3QgcGlja2xlYWJsZS4KICAgICAgICBzZWxmLnByb3h5X21hbmFnZXIgPSB7fQogICAgICAgIHNlbGYuY29uZmlnID0ge30KCiAgICAgICAgZm9yIGF0dHIsIHZhbHVlIGluIHN0YXRlLml0ZW1zKCk6CiAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgYXR0ciwgdmFsdWUpCgogICAgICAgIHNlbGYuaW5pdF9wb29sbWFuYWdlcihzZWxmLl9wb29sX2Nvbm5lY3Rpb25zLCBzZWxmLl9wb29sX21heHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrPXNlbGYuX3Bvb2xfYmxvY2spCgogICAgZGVmIGluaXRfcG9vbG1hbmFnZXIoc2VsZiwgY29ubmVjdGlvbnMsIG1heHNpemUsIGJsb2NrPURFRkFVTFRfUE9PTEJMT0NLLCAqKnBvb2xfa3dhcmdzKToKICAgICAgICAiIiJJbml0aWFsaXplcyBhIHVybGxpYjMgUG9vbE1hbmFnZXIuCgogICAgICAgIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIGZyb20gdXNlciBjb2RlLCBhbmQgaXMgb25seQogICAgICAgIGV4cG9zZWQgZm9yIHVzZSB3aGVuIHN1YmNsYXNzaW5nIHRoZQogICAgICAgIDpjbGFzczpgSFRUUEFkYXB0ZXIgPHJlcXVlc3RzLmFkYXB0ZXJzLkhUVFBBZGFwdGVyPmAuCgogICAgICAgIDpwYXJhbSBjb25uZWN0aW9uczogVGhlIG51bWJlciBvZiB1cmxsaWIzIGNvbm5lY3Rpb24gcG9vbHMgdG8gY2FjaGUuCiAgICAgICAgOnBhcmFtIG1heHNpemU6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25uZWN0aW9ucyB0byBzYXZlIGluIHRoZSBwb29sLgogICAgICAgIDpwYXJhbSBibG9jazogQmxvY2sgd2hlbiBubyBmcmVlIGNvbm5lY3Rpb25zIGFyZSBhdmFpbGFibGUuCiAgICAgICAgOnBhcmFtIHBvb2xfa3dhcmdzOiBFeHRyYSBrZXl3b3JkIGFyZ3VtZW50cyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIFBvb2wgTWFuYWdlci4KICAgICAgICAiIiIKICAgICAgICAjIHNhdmUgdGhlc2UgdmFsdWVzIGZvciBwaWNrbGluZwogICAgICAgIHNlbGYuX3Bvb2xfY29ubmVjdGlvbnMgPSBjb25uZWN0aW9ucwogICAgICAgIHNlbGYuX3Bvb2xfbWF4c2l6ZSA9IG1heHNpemUKICAgICAgICBzZWxmLl9wb29sX2Jsb2NrID0gYmxvY2sKCiAgICAgICAgc2VsZi5wb29sbWFuYWdlciA9IFBvb2xNYW5hZ2VyKG51bV9wb29scz1jb25uZWN0aW9ucywgbWF4c2l6ZT1tYXhzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jaz1ibG9jaywgc3RyaWN0PVRydWUsICoqcG9vbF9rd2FyZ3MpCgogICAgZGVmIHByb3h5X21hbmFnZXJfZm9yKHNlbGYsIHByb3h5LCAqKnByb3h5X2t3YXJncyk6CiAgICAgICAgIiIiUmV0dXJuIHVybGxpYjMgUHJveHlNYW5hZ2VyIGZvciB0aGUgZ2l2ZW4gcHJveHkuCgogICAgICAgIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIGZyb20gdXNlciBjb2RlLCBhbmQgaXMgb25seQogICAgICAgIGV4cG9zZWQgZm9yIHVzZSB3aGVuIHN1YmNsYXNzaW5nIHRoZQogICAgICAgIDpjbGFzczpgSFRUUEFkYXB0ZXIgPHJlcXVlc3RzLmFkYXB0ZXJzLkhUVFBBZGFwdGVyPmAuCgogICAgICAgIDpwYXJhbSBwcm94eTogVGhlIHByb3h5IHRvIHJldHVybiBhIHVybGxpYjMgUHJveHlNYW5hZ2VyIGZvci4KICAgICAgICA6cGFyYW0gcHJveHlfa3dhcmdzOiBFeHRyYSBrZXl3b3JkIGFyZ3VtZW50cyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgUHJveHkgTWFuYWdlci4KICAgICAgICA6cmV0dXJuczogUHJveHlNYW5hZ2VyCiAgICAgICAgOnJ0eXBlOiB1cmxsaWIzLlByb3h5TWFuYWdlcgogICAgICAgICIiIgogICAgICAgIGlmIHByb3h5IGluIHNlbGYucHJveHlfbWFuYWdlcjoKICAgICAgICAgICAgbWFuYWdlciA9IHNlbGYucHJveHlfbWFuYWdlcltwcm94eV0KICAgICAgICBlbGlmIHByb3h5Lmxvd2VyKCkuc3RhcnRzd2l0aCgnc29ja3MnKToKICAgICAgICAgICAgdXNlcm5hbWUsIHBhc3N3b3JkID0gZ2V0X2F1dGhfZnJvbV91cmwocHJveHkpCiAgICAgICAgICAgIG1hbmFnZXIgPSBzZWxmLnByb3h5X21hbmFnZXJbcHJveHldID0gU09DS1NQcm94eU1hbmFnZXIoCiAgICAgICAgICAgICAgICBwcm94eSwKICAgICAgICAgICAgICAgIHVzZXJuYW1lPXVzZXJuYW1lLAogICAgICAgICAgICAgICAgcGFzc3dvcmQ9cGFzc3dvcmQsCiAgICAgICAgICAgICAgICBudW1fcG9vbHM9c2VsZi5fcG9vbF9jb25uZWN0aW9ucywKICAgICAgICAgICAgICAgIG1heHNpemU9c2VsZi5fcG9vbF9tYXhzaXplLAogICAgICAgICAgICAgICAgYmxvY2s9c2VsZi5fcG9vbF9ibG9jaywKICAgICAgICAgICAgICAgICoqcHJveHlfa3dhcmdzCiAgICAgICAgICAgICkKICAgICAgICBlbHNlOgogICAgICAgICAgICBwcm94eV9oZWFkZXJzID0gc2VsZi5wcm94eV9oZWFkZXJzKHByb3h5KQogICAgICAgICAgICBtYW5hZ2VyID0gc2VsZi5wcm94eV9tYW5hZ2VyW3Byb3h5XSA9IHByb3h5X2Zyb21fdXJsKAogICAgICAgICAgICAgICAgcHJveHksCiAgICAgICAgICAgICAgICBwcm94eV9oZWFkZXJzPXByb3h5X2hlYWRlcnMsCiAgICAgICAgICAgICAgICBudW1fcG9vbHM9c2VsZi5fcG9vbF9jb25uZWN0aW9ucywKICAgICAgICAgICAgICAgIG1heHNpemU9c2VsZi5fcG9vbF9tYXhzaXplLAogICAgICAgICAgICAgICAgYmxvY2s9c2VsZi5fcG9vbF9ibG9jaywKICAgICAgICAgICAgICAgICoqcHJveHlfa3dhcmdzKQoKICAgICAgICByZXR1cm4gbWFuYWdlcgoKICAgIGRlZiBjZXJ0X3ZlcmlmeShzZWxmLCBjb25uLCB1cmwsIHZlcmlmeSwgY2VydCk6CiAgICAgICAgIiIiVmVyaWZ5IGEgU1NMIGNlcnRpZmljYXRlLiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBmcm9tIHVzZXIKICAgICAgICBjb2RlLCBhbmQgaXMgb25seSBleHBvc2VkIGZvciB1c2Ugd2hlbiBzdWJjbGFzc2luZyB0aGUKICAgICAgICA6Y2xhc3M6YEhUVFBBZGFwdGVyIDxyZXF1ZXN0cy5hZGFwdGVycy5IVFRQQWRhcHRlcj5gLgoKICAgICAgICA6cGFyYW0gY29ubjogVGhlIHVybGxpYjMgY29ubmVjdGlvbiBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBjZXJ0LgogICAgICAgIDpwYXJhbSB1cmw6IFRoZSByZXF1ZXN0ZWQgVVJMLgogICAgICAgIDpwYXJhbSB2ZXJpZnk6IEVpdGhlciBhIGJvb2xlYW4sIGluIHdoaWNoIGNhc2UgaXQgY29udHJvbHMgd2hldGhlciB3ZSB2ZXJpZnkKICAgICAgICAgICAgdGhlIHNlcnZlcidzIFRMUyBjZXJ0aWZpY2F0ZSwgb3IgYSBzdHJpbmcsIGluIHdoaWNoIGNhc2UgaXQgbXVzdCBiZSBhIHBhdGgKICAgICAgICAgICAgdG8gYSBDQSBidW5kbGUgdG8gdXNlCiAgICAgICAgOnBhcmFtIGNlcnQ6IFRoZSBTU0wgY2VydGlmaWNhdGUgdG8gdmVyaWZ5LgogICAgICAgICIiIgogICAgICAgIGlmIHVybC5sb3dlcigpLnN0YXJ0c3dpdGgoJ2h0dHBzJykgYW5kIHZlcmlmeToKCiAgICAgICAgICAgIGNlcnRfbG9jID0gTm9uZQoKICAgICAgICAgICAgIyBBbGxvdyBzZWxmLXNwZWNpZmllZCBjZXJ0IGxvY2F0aW9uLgogICAgICAgICAgICBpZiB2ZXJpZnkgaXMgbm90IFRydWU6CiAgICAgICAgICAgICAgICBjZXJ0X2xvYyA9IHZlcmlmeQoKICAgICAgICAgICAgaWYgbm90IGNlcnRfbG9jOgogICAgICAgICAgICAgICAgY2VydF9sb2MgPSBERUZBVUxUX0NBX0JVTkRMRV9QQVRICgogICAgICAgICAgICBpZiBub3QgY2VydF9sb2Mgb3Igbm90IG9zLnBhdGguZXhpc3RzKGNlcnRfbG9jKToKICAgICAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoIkNvdWxkIG5vdCBmaW5kIGEgc3VpdGFibGUgVExTIENBIGNlcnRpZmljYXRlIGJ1bmRsZSwgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBwYXRoOiB7MH0iLmZvcm1hdChjZXJ0X2xvYykpCgogICAgICAgICAgICBjb25uLmNlcnRfcmVxcyA9ICdDRVJUX1JFUVVJUkVEJwoKICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIoY2VydF9sb2MpOgogICAgICAgICAgICAgICAgY29ubi5jYV9jZXJ0cyA9IGNlcnRfbG9jCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBjb25uLmNhX2NlcnRfZGlyID0gY2VydF9sb2MKICAgICAgICBlbHNlOgogICAgICAgICAgICBjb25uLmNlcnRfcmVxcyA9ICdDRVJUX05PTkUnCiAgICAgICAgICAgIGNvbm4uY2FfY2VydHMgPSBOb25lCiAgICAgICAgICAgIGNvbm4uY2FfY2VydF9kaXIgPSBOb25lCgogICAgICAgIGlmIGNlcnQ6CiAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGNlcnQsIGJhc2VzdHJpbmcpOgogICAgICAgICAgICAgICAgY29ubi5jZXJ0X2ZpbGUgPSBjZXJ0WzBdCiAgICAgICAgICAgICAgICBjb25uLmtleV9maWxlID0gY2VydFsxXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgY29ubi5jZXJ0X2ZpbGUgPSBjZXJ0CiAgICAgICAgICAgICAgICBjb25uLmtleV9maWxlID0gTm9uZQogICAgICAgICAgICBpZiBjb25uLmNlcnRfZmlsZSBhbmQgbm90IG9zLnBhdGguZXhpc3RzKGNvbm4uY2VydF9maWxlKToKICAgICAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoIkNvdWxkIG5vdCBmaW5kIHRoZSBUTFMgY2VydGlmaWNhdGUgZmlsZSwgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBwYXRoOiB7MH0iLmZvcm1hdChjb25uLmNlcnRfZmlsZSkpCiAgICAgICAgICAgIGlmIGNvbm4ua2V5X2ZpbGUgYW5kIG5vdCBvcy5wYXRoLmV4aXN0cyhjb25uLmtleV9maWxlKToKICAgICAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoIkNvdWxkIG5vdCBmaW5kIHRoZSBUTFMga2V5IGZpbGUsICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgcGF0aDogezB9Ii5mb3JtYXQoY29ubi5rZXlfZmlsZSkpCgogICAgZGVmIGJ1aWxkX3Jlc3BvbnNlKHNlbGYsIHJlcSwgcmVzcCk6CiAgICAgICAgIiIiQnVpbGRzIGEgOmNsYXNzOmBSZXNwb25zZSA8cmVxdWVzdHMuUmVzcG9uc2U+YCBvYmplY3QgZnJvbSBhIHVybGxpYjMKICAgICAgICByZXNwb25zZS4gVGhpcyBzaG91bGQgbm90IGJlIGNhbGxlZCBmcm9tIHVzZXIgY29kZSwgYW5kIGlzIG9ubHkgZXhwb3NlZAogICAgICAgIGZvciB1c2Ugd2hlbiBzdWJjbGFzc2luZyB0aGUKICAgICAgICA6Y2xhc3M6YEhUVFBBZGFwdGVyIDxyZXF1ZXN0cy5hZGFwdGVycy5IVFRQQWRhcHRlcj5gCgogICAgICAgIDpwYXJhbSByZXE6IFRoZSA6Y2xhc3M6YFByZXBhcmVkUmVxdWVzdCA8UHJlcGFyZWRSZXF1ZXN0PmAgdXNlZCB0byBnZW5lcmF0ZSB0aGUgcmVzcG9uc2UuCiAgICAgICAgOnBhcmFtIHJlc3A6IFRoZSB1cmxsaWIzIHJlc3BvbnNlIG9iamVjdC4KICAgICAgICA6cnR5cGU6IHJlcXVlc3RzLlJlc3BvbnNlCiAgICAgICAgIiIiCiAgICAgICAgcmVzcG9uc2UgPSBSZXNwb25zZSgpCgogICAgICAgICMgRmFsbGJhY2sgdG8gTm9uZSBpZiB0aGVyZSdzIG5vIHN0YXR1c19jb2RlLCBmb3Igd2hhdGV2ZXIgcmVhc29uLgogICAgICAgIHJlc3BvbnNlLnN0YXR1c19jb2RlID0gZ2V0YXR0cihyZXNwLCAnc3RhdHVzJywgTm9uZSkKCiAgICAgICAgIyBNYWtlIGhlYWRlcnMgY2FzZS1pbnNlbnNpdGl2ZS4KICAgICAgICByZXNwb25zZS5oZWFkZXJzID0gQ2FzZUluc2Vuc2l0aXZlRGljdChnZXRhdHRyKHJlc3AsICdoZWFkZXJzJywge30pKQoKICAgICAgICAjIFNldCBlbmNvZGluZy4KICAgICAgICByZXNwb25zZS5lbmNvZGluZyA9IGdldF9lbmNvZGluZ19mcm9tX2hlYWRlcnMocmVzcG9uc2UuaGVhZGVycykKICAgICAgICByZXNwb25zZS5yYXcgPSByZXNwCiAgICAgICAgcmVzcG9uc2UucmVhc29uID0gcmVzcG9uc2UucmF3LnJlYXNvbgoKICAgICAgICBpZiBpc2luc3RhbmNlKHJlcS51cmwsIGJ5dGVzKToKICAgICAgICAgICAgcmVzcG9uc2UudXJsID0gcmVxLnVybC5kZWNvZGUoJ3V0Zi04JykKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXNwb25zZS51cmwgPSByZXEudXJsCgogICAgICAgICMgQWRkIG5ldyBjb29raWVzIGZyb20gdGhlIHNlcnZlci4KICAgICAgICBleHRyYWN0X2Nvb2tpZXNfdG9famFyKHJlc3BvbnNlLmNvb2tpZXMsIHJlcSwgcmVzcCkKCiAgICAgICAgIyBHaXZlIHRoZSBSZXNwb25zZSBzb21lIGNvbnRleHQuCiAgICAgICAgcmVzcG9uc2UucmVxdWVzdCA9IHJlcQogICAgICAgIHJlc3BvbnNlLmNvbm5lY3Rpb24gPSBzZWxmCgogICAgICAgIHJldHVybiByZXNwb25zZQoKICAgIGRlZiBnZXRfY29ubmVjdGlvbihzZWxmLCB1cmwsIHByb3hpZXM9Tm9uZSk6CiAgICAgICAgIiIiUmV0dXJucyBhIHVybGxpYjMgY29ubmVjdGlvbiBmb3IgdGhlIGdpdmVuIFVSTC4gVGhpcyBzaG91bGQgbm90IGJlCiAgICAgICAgY2FsbGVkIGZyb20gdXNlciBjb2RlLCBhbmQgaXMgb25seSBleHBvc2VkIGZvciB1c2Ugd2hlbiBzdWJjbGFzc2luZyB0aGUKICAgICAgICA6Y2xhc3M6YEhUVFBBZGFwdGVyIDxyZXF1ZXN0cy5hZGFwdGVycy5IVFRQQWRhcHRlcj5gLgoKICAgICAgICA6cGFyYW0gdXJsOiBUaGUgVVJMIHRvIGNvbm5lY3QgdG8uCiAgICAgICAgOnBhcmFtIHByb3hpZXM6IChvcHRpb25hbCkgQSBSZXF1ZXN0cy1zdHlsZSBkaWN0aW9uYXJ5IG9mIHByb3hpZXMgdXNlZCBvbiB0aGlzIHJlcXVlc3QuCiAgICAgICAgOnJ0eXBlOiB1cmxsaWIzLkNvbm5lY3Rpb25Qb29sCiAgICAgICAgIiIiCiAgICAgICAgcHJveHkgPSBzZWxlY3RfcHJveHkodXJsLCBwcm94aWVzKQoKICAgICAgICBpZiBwcm94eToKICAgICAgICAgICAgcHJveHkgPSBwcmVwZW5kX3NjaGVtZV9pZl9uZWVkZWQocHJveHksICdodHRwJykKICAgICAgICAgICAgcHJveHlfbWFuYWdlciA9IHNlbGYucHJveHlfbWFuYWdlcl9mb3IocHJveHkpCiAgICAgICAgICAgIGNvbm4gPSBwcm94eV9tYW5hZ2VyLmNvbm5lY3Rpb25fZnJvbV91cmwodXJsKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgT25seSBzY2hlbWUgc2hvdWxkIGJlIGxvd2VyIGNhc2UKICAgICAgICAgICAgcGFyc2VkID0gdXJscGFyc2UodXJsKQogICAgICAgICAgICB1cmwgPSBwYXJzZWQuZ2V0dXJsKCkKICAgICAgICAgICAgY29ubiA9IHNlbGYucG9vbG1hbmFnZXIuY29ubmVjdGlvbl9mcm9tX3VybCh1cmwpCgogICAgICAgIHJldHVybiBjb25uCgogICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgICIiIkRpc3Bvc2VzIG9mIGFueSBpbnRlcm5hbCBzdGF0ZS4KCiAgICAgICAgQ3VycmVudGx5LCB0aGlzIGNsb3NlcyB0aGUgUG9vbE1hbmFnZXIgYW5kIGFueSBhY3RpdmUgUHJveHlNYW5hZ2VyLAogICAgICAgIHdoaWNoIGNsb3NlcyBhbnkgcG9vbGVkIGNvbm5lY3Rpb25zLgogICAgICAgICIiIgogICAgICAgIHNlbGYucG9vbG1hbmFnZXIuY2xlYXIoKQogICAgICAgIGZvciBwcm94eSBpbiBzZWxmLnByb3h5X21hbmFnZXIudmFsdWVzKCk6CiAgICAgICAgICAgIHByb3h5LmNsZWFyKCkKCiAgICBkZWYgcmVxdWVzdF91cmwoc2VsZiwgcmVxdWVzdCwgcHJveGllcyk6CiAgICAgICAgIiIiT2J0YWluIHRoZSB1cmwgdG8gdXNlIHdoZW4gbWFraW5nIHRoZSBmaW5hbCByZXF1ZXN0LgoKICAgICAgICBJZiB0aGUgbWVzc2FnZSBpcyBiZWluZyBzZW50IHRocm91Z2ggYSBIVFRQIHByb3h5LCB0aGUgZnVsbCBVUkwgaGFzIHRvCiAgICAgICAgYmUgdXNlZC4gT3RoZXJ3aXNlLCB3ZSBzaG91bGQgb25seSB1c2UgdGhlIHBhdGggcG9ydGlvbiBvZiB0aGUgVVJMLgoKICAgICAgICBUaGlzIHNob3VsZCBub3QgYmUgY2FsbGVkIGZyb20gdXNlciBjb2RlLCBhbmQgaXMgb25seSBleHBvc2VkIGZvciB1c2UKICAgICAgICB3aGVuIHN1YmNsYXNzaW5nIHRoZQogICAgICAgIDpjbGFzczpgSFRUUEFkYXB0ZXIgPHJlcXVlc3RzLmFkYXB0ZXJzLkhUVFBBZGFwdGVyPmAuCgogICAgICAgIDpwYXJhbSByZXF1ZXN0OiBUaGUgOmNsYXNzOmBQcmVwYXJlZFJlcXVlc3QgPFByZXBhcmVkUmVxdWVzdD5gIGJlaW5nIHNlbnQuCiAgICAgICAgOnBhcmFtIHByb3hpZXM6IEEgZGljdGlvbmFyeSBvZiBzY2hlbWVzIG9yIHNjaGVtZXMgYW5kIGhvc3RzIHRvIHByb3h5IFVSTHMuCiAgICAgICAgOnJ0eXBlOiBzdHIKICAgICAgICAiIiIKICAgICAgICBwcm94eSA9IHNlbGVjdF9wcm94eShyZXF1ZXN0LnVybCwgcHJveGllcykKICAgICAgICBzY2hlbWUgPSB1cmxwYXJzZShyZXF1ZXN0LnVybCkuc2NoZW1lCgogICAgICAgIGlzX3Byb3hpZWRfaHR0cF9yZXF1ZXN0ID0gKHByb3h5IGFuZCBzY2hlbWUgIT0gJ2h0dHBzJykKICAgICAgICB1c2luZ19zb2Nrc19wcm94eSA9IEZhbHNlCiAgICAgICAgaWYgcHJveHk6CiAgICAgICAgICAgIHByb3h5X3NjaGVtZSA9IHVybHBhcnNlKHByb3h5KS5zY2hlbWUubG93ZXIoKQogICAgICAgICAgICB1c2luZ19zb2Nrc19wcm94eSA9IHByb3h5X3NjaGVtZS5zdGFydHN3aXRoKCdzb2NrcycpCgogICAgICAgIHVybCA9IHJlcXVlc3QucGF0aF91cmwKICAgICAgICBpZiBpc19wcm94aWVkX2h0dHBfcmVxdWVzdCBhbmQgbm90IHVzaW5nX3NvY2tzX3Byb3h5OgogICAgICAgICAgICB1cmwgPSB1cmxkZWZyYWdhdXRoKHJlcXVlc3QudXJsKQoKICAgICAgICByZXR1cm4gdXJsCgogICAgZGVmIGFkZF9oZWFkZXJzKHNlbGYsIHJlcXVlc3QsICoqa3dhcmdzKToKICAgICAgICAiIiJBZGQgYW55IGhlYWRlcnMgbmVlZGVkIGJ5IHRoZSBjb25uZWN0aW9uLiBBcyBvZiB2Mi4wIHRoaXMgZG9lcwogICAgICAgIG5vdGhpbmcgYnkgZGVmYXVsdCwgYnV0IGlzIGxlZnQgZm9yIG92ZXJyaWRpbmcgYnkgdXNlcnMgdGhhdCBzdWJjbGFzcwogICAgICAgIHRoZSA6Y2xhc3M6YEhUVFBBZGFwdGVyIDxyZXF1ZXN0cy5hZGFwdGVycy5IVFRQQWRhcHRlcj5gLgoKICAgICAgICBUaGlzIHNob3VsZCBub3QgYmUgY2FsbGVkIGZyb20gdXNlciBjb2RlLCBhbmQgaXMgb25seSBleHBvc2VkIGZvciB1c2UKICAgICAgICB3aGVuIHN1YmNsYXNzaW5nIHRoZQogICAgICAgIDpjbGFzczpgSFRUUEFkYXB0ZXIgPHJlcXVlc3RzLmFkYXB0ZXJzLkhUVFBBZGFwdGVyPmAuCgogICAgICAgIDpwYXJhbSByZXF1ZXN0OiBUaGUgOmNsYXNzOmBQcmVwYXJlZFJlcXVlc3QgPFByZXBhcmVkUmVxdWVzdD5gIHRvIGFkZCBoZWFkZXJzIHRvLgogICAgICAgIDpwYXJhbSBrd2FyZ3M6IFRoZSBrZXl3b3JkIGFyZ3VtZW50cyBmcm9tIHRoZSBjYWxsIHRvIHNlbmQoKS4KICAgICAgICAiIiIKICAgICAgICBwYXNzCgogICAgZGVmIHByb3h5X2hlYWRlcnMoc2VsZiwgcHJveHkpOgogICAgICAgICIiIlJldHVybnMgYSBkaWN0aW9uYXJ5IG9mIHRoZSBoZWFkZXJzIHRvIGFkZCB0byBhbnkgcmVxdWVzdCBzZW50CiAgICAgICAgdGhyb3VnaCBhIHByb3h5LiBUaGlzIHdvcmtzIHdpdGggdXJsbGliMyBtYWdpYyB0byBlbnN1cmUgdGhhdCB0aGV5IGFyZQogICAgICAgIGNvcnJlY3RseSBzZW50IHRvIHRoZSBwcm94eSwgcmF0aGVyIHRoYW4gaW4gYSB0dW5uZWxsZWQgcmVxdWVzdCBpZgogICAgICAgIENPTk5FQ1QgaXMgYmVpbmcgdXNlZC4KCiAgICAgICAgVGhpcyBzaG91bGQgbm90IGJlIGNhbGxlZCBmcm9tIHVzZXIgY29kZSwgYW5kIGlzIG9ubHkgZXhwb3NlZCBmb3IgdXNlCiAgICAgICAgd2hlbiBzdWJjbGFzc2luZyB0aGUKICAgICAgICA6Y2xhc3M6YEhUVFBBZGFwdGVyIDxyZXF1ZXN0cy5hZGFwdGVycy5IVFRQQWRhcHRlcj5gLgoKICAgICAgICA6cGFyYW0gcHJveGllczogVGhlIHVybCBvZiB0aGUgcHJveHkgYmVpbmcgdXNlZCBmb3IgdGhpcyByZXF1ZXN0LgogICAgICAgIDpydHlwZTogZGljdAogICAgICAgICIiIgogICAgICAgIGhlYWRlcnMgPSB7fQogICAgICAgIHVzZXJuYW1lLCBwYXNzd29yZCA9IGdldF9hdXRoX2Zyb21fdXJsKHByb3h5KQoKICAgICAgICBpZiB1c2VybmFtZToKICAgICAgICAgICAgaGVhZGVyc1snUHJveHktQXV0aG9yaXphdGlvbiddID0gX2Jhc2ljX2F1dGhfc3RyKHVzZXJuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQpCgogICAgICAgIHJldHVybiBoZWFkZXJzCgogICAgZGVmIHNlbmQoc2VsZiwgcmVxdWVzdCwgc3RyZWFtPUZhbHNlLCB0aW1lb3V0PU5vbmUsIHZlcmlmeT1UcnVlLCBjZXJ0PU5vbmUsIHByb3hpZXM9Tm9uZSk6CiAgICAgICAgIiIiU2VuZHMgUHJlcGFyZWRSZXF1ZXN0IG9iamVjdC4gUmV0dXJucyBSZXNwb25zZSBvYmplY3QuCgogICAgICAgIDpwYXJhbSByZXF1ZXN0OiBUaGUgOmNsYXNzOmBQcmVwYXJlZFJlcXVlc3QgPFByZXBhcmVkUmVxdWVzdD5gIGJlaW5nIHNlbnQuCiAgICAgICAgOnBhcmFtIHN0cmVhbTogKG9wdGlvbmFsKSBXaGV0aGVyIHRvIHN0cmVhbSB0aGUgcmVxdWVzdCBjb250ZW50LgogICAgICAgIDpwYXJhbSB0aW1lb3V0OiAob3B0aW9uYWwpIEhvdyBsb25nIHRvIHdhaXQgZm9yIHRoZSBzZXJ2ZXIgdG8gc2VuZAogICAgICAgICAgICBkYXRhIGJlZm9yZSBnaXZpbmcgdXAsIGFzIGEgZmxvYXQsIG9yIGEgOnJlZjpgKGNvbm5lY3QgdGltZW91dCwKICAgICAgICAgICAgcmVhZCB0aW1lb3V0KSA8dGltZW91dHM+YCB0dXBsZS4KICAgICAgICA6dHlwZSB0aW1lb3V0OiBmbG9hdCBvciB0dXBsZSBvciB1cmxsaWIzIFRpbWVvdXQgb2JqZWN0CiAgICAgICAgOnBhcmFtIHZlcmlmeTogKG9wdGlvbmFsKSBFaXRoZXIgYSBib29sZWFuLCBpbiB3aGljaCBjYXNlIGl0IGNvbnRyb2xzIHdoZXRoZXIKICAgICAgICAgICAgd2UgdmVyaWZ5IHRoZSBzZXJ2ZXIncyBUTFMgY2VydGlmaWNhdGUsIG9yIGEgc3RyaW5nLCBpbiB3aGljaCBjYXNlIGl0CiAgICAgICAgICAgIG11c3QgYmUgYSBwYXRoIHRvIGEgQ0EgYnVuZGxlIHRvIHVzZQogICAgICAgIDpwYXJhbSBjZXJ0OiAob3B0aW9uYWwpIEFueSB1c2VyLXByb3ZpZGVkIFNTTCBjZXJ0aWZpY2F0ZSB0byBiZSB0cnVzdGVkLgogICAgICAgIDpwYXJhbSBwcm94aWVzOiAob3B0aW9uYWwpIFRoZSBwcm94aWVzIGRpY3Rpb25hcnkgdG8gYXBwbHkgdG8gdGhlIHJlcXVlc3QuCiAgICAgICAgOnJ0eXBlOiByZXF1ZXN0cy5SZXNwb25zZQogICAgICAgICIiIgoKICAgICAgICBjb25uID0gc2VsZi5nZXRfY29ubmVjdGlvbihyZXF1ZXN0LnVybCwgcHJveGllcykKCiAgICAgICAgc2VsZi5jZXJ0X3ZlcmlmeShjb25uLCByZXF1ZXN0LnVybCwgdmVyaWZ5LCBjZXJ0KQogICAgICAgIHVybCA9IHNlbGYucmVxdWVzdF91cmwocmVxdWVzdCwgcHJveGllcykKICAgICAgICBzZWxmLmFkZF9oZWFkZXJzKHJlcXVlc3QpCgogICAgICAgIGNodW5rZWQgPSBub3QgKHJlcXVlc3QuYm9keSBpcyBOb25lIG9yICdDb250ZW50LUxlbmd0aCcgaW4gcmVxdWVzdC5oZWFkZXJzKQoKICAgICAgICBpZiBpc2luc3RhbmNlKHRpbWVvdXQsIHR1cGxlKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgY29ubmVjdCwgcmVhZCA9IHRpbWVvdXQKICAgICAgICAgICAgICAgIHRpbWVvdXQgPSBUaW1lb3V0U2F1Y2UoY29ubmVjdD1jb25uZWN0LCByZWFkPXJlYWQpCiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICAjIHRoaXMgbWF5IHJhaXNlIGEgc3RyaW5nIGZvcm1hdHRpbmcgZXJyb3IuCiAgICAgICAgICAgICAgICBlcnIgPSAoIkludmFsaWQgdGltZW91dCB7MH0uIFBhc3MgYSAoY29ubmVjdCwgcmVhZCkgIgogICAgICAgICAgICAgICAgICAgICAgICJ0aW1lb3V0IHR1cGxlLCBvciBhIHNpbmdsZSBmbG9hdCB0byBzZXQgIgogICAgICAgICAgICAgICAgICAgICAgICJib3RoIHRpbWVvdXRzIHRvIHRoZSBzYW1lIHZhbHVlIi5mb3JtYXQodGltZW91dCkpCiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKGVycikKICAgICAgICBlbGlmIGlzaW5zdGFuY2UodGltZW91dCwgVGltZW91dFNhdWNlKToKICAgICAgICAgICAgcGFzcwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHRpbWVvdXQgPSBUaW1lb3V0U2F1Y2UoY29ubmVjdD10aW1lb3V0LCByZWFkPXRpbWVvdXQpCgogICAgICAgIHRyeToKICAgICAgICAgICAgaWYgbm90IGNodW5rZWQ6CiAgICAgICAgICAgICAgICByZXNwID0gY29ubi51cmxvcGVuKAogICAgICAgICAgICAgICAgICAgIG1ldGhvZD1yZXF1ZXN0Lm1ldGhvZCwKICAgICAgICAgICAgICAgICAgICB1cmw9dXJsLAogICAgICAgICAgICAgICAgICAgIGJvZHk9cmVxdWVzdC5ib2R5LAogICAgICAgICAgICAgICAgICAgIGhlYWRlcnM9cmVxdWVzdC5oZWFkZXJzLAogICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0PUZhbHNlLAogICAgICAgICAgICAgICAgICAgIGFzc2VydF9zYW1lX2hvc3Q9RmFsc2UsCiAgICAgICAgICAgICAgICAgICAgcHJlbG9hZF9jb250ZW50PUZhbHNlLAogICAgICAgICAgICAgICAgICAgIGRlY29kZV9jb250ZW50PUZhbHNlLAogICAgICAgICAgICAgICAgICAgIHJldHJpZXM9c2VsZi5tYXhfcmV0cmllcywKICAgICAgICAgICAgICAgICAgICB0aW1lb3V0PXRpbWVvdXQKICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICMgU2VuZCB0aGUgcmVxdWVzdC4KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIoY29ubiwgJ3Byb3h5X3Bvb2wnKToKICAgICAgICAgICAgICAgICAgICBjb25uID0gY29ubi5wcm94eV9wb29sCgogICAgICAgICAgICAgICAgbG93X2Nvbm4gPSBjb25uLl9nZXRfY29ubih0aW1lb3V0PURFRkFVTFRfUE9PTF9USU1FT1VUKQoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBsb3dfY29ubi5wdXRyZXF1ZXN0KHJlcXVlc3QubWV0aG9kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcF9hY2NlcHRfZW5jb2Rpbmc9VHJ1ZSkKCiAgICAgICAgICAgICAgICAgICAgZm9yIGhlYWRlciwgdmFsdWUgaW4gcmVxdWVzdC5oZWFkZXJzLml0ZW1zKCk6CiAgICAgICAgICAgICAgICAgICAgICAgIGxvd19jb25uLnB1dGhlYWRlcihoZWFkZXIsIHZhbHVlKQoKICAgICAgICAgICAgICAgICAgICBsb3dfY29ubi5lbmRoZWFkZXJzKCkKCiAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmVxdWVzdC5ib2R5OgogICAgICAgICAgICAgICAgICAgICAgICBsb3dfY29ubi5zZW5kKGhleChsZW4oaSkpWzI6XS5lbmNvZGUoJ3V0Zi04JykpCiAgICAgICAgICAgICAgICAgICAgICAgIGxvd19jb25uLnNlbmQoYidcclxuJykKICAgICAgICAgICAgICAgICAgICAgICAgbG93X2Nvbm4uc2VuZChpKQogICAgICAgICAgICAgICAgICAgICAgICBsb3dfY29ubi5zZW5kKGInXHJcbicpCiAgICAgICAgICAgICAgICAgICAgbG93X2Nvbm4uc2VuZChiJzBcclxuXHJcbicpCgogICAgICAgICAgICAgICAgICAgICMgUmVjZWl2ZSB0aGUgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyCiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICAjIEZvciBQeXRob24gMi43KyB2ZXJzaW9ucywgdXNlIGJ1ZmZlcmluZyBvZiBIVFRQCiAgICAgICAgICAgICAgICAgICAgICAgICMgcmVzcG9uc2VzCiAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBsb3dfY29ubi5nZXRyZXNwb25zZShidWZmZXJpbmc9VHJ1ZSkKICAgICAgICAgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgogICAgICAgICAgICAgICAgICAgICAgICAjIEZvciBjb21wYXRpYmlsaXR5IHdpdGggUHl0aG9uIDIuNiB2ZXJzaW9ucyBhbmQgYmFjawogICAgICAgICAgICAgICAgICAgICAgICByID0gbG93X2Nvbm4uZ2V0cmVzcG9uc2UoKQoKICAgICAgICAgICAgICAgICAgICByZXNwID0gSFRUUFJlc3BvbnNlLmZyb21faHR0cGxpYigKICAgICAgICAgICAgICAgICAgICAgICAgciwKICAgICAgICAgICAgICAgICAgICAgICAgcG9vbD1jb25uLAogICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uPWxvd19jb25uLAogICAgICAgICAgICAgICAgICAgICAgICBwcmVsb2FkX2NvbnRlbnQ9RmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZV9jb250ZW50PUZhbHNlCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgZXhjZXB0OgogICAgICAgICAgICAgICAgICAgICMgSWYgd2UgaGl0IGFueSBwcm9ibGVtcyBoZXJlLCBjbGVhbiB1cCB0aGUgY29ubmVjdGlvbi4KICAgICAgICAgICAgICAgICAgICAjIFRoZW4sIHJlcmFpc2Ugc28gdGhhdCB3ZSBjYW4gaGFuZGxlIHRoZSBhY3R1YWwgZXhjZXB0aW9uLgogICAgICAgICAgICAgICAgICAgIGxvd19jb25uLmNsb3NlKCkKICAgICAgICAgICAgICAgICAgICByYWlzZQoKICAgICAgICBleGNlcHQgKFByb3RvY29sRXJyb3IsIHNvY2tldC5lcnJvcikgYXMgZXJyOgogICAgICAgICAgICByYWlzZSBDb25uZWN0aW9uRXJyb3IoZXJyLCByZXF1ZXN0PXJlcXVlc3QpCgogICAgICAgIGV4Y2VwdCBNYXhSZXRyeUVycm9yIGFzIGU6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZS5yZWFzb24sIENvbm5lY3RUaW1lb3V0RXJyb3IpOgogICAgICAgICAgICAgICAgIyBUT0RPOiBSZW1vdmUgdGhpcyBpbiAzLjAuMDogc2VlICMyODExCiAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShlLnJlYXNvbiwgTmV3Q29ubmVjdGlvbkVycm9yKToKICAgICAgICAgICAgICAgICAgICByYWlzZSBDb25uZWN0VGltZW91dChlLCByZXF1ZXN0PXJlcXVlc3QpCgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGUucmVhc29uLCBSZXNwb25zZUVycm9yKToKICAgICAgICAgICAgICAgIHJhaXNlIFJldHJ5RXJyb3IoZSwgcmVxdWVzdD1yZXF1ZXN0KQoKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShlLnJlYXNvbiwgX1Byb3h5RXJyb3IpOgogICAgICAgICAgICAgICAgcmFpc2UgUHJveHlFcnJvcihlLCByZXF1ZXN0PXJlcXVlc3QpCgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGUucmVhc29uLCBfU1NMRXJyb3IpOgogICAgICAgICAgICAgICAgIyBUaGlzIGJyYW5jaCBpcyBmb3IgdXJsbGliMyB2MS4yMiBhbmQgbGF0ZXIuCiAgICAgICAgICAgICAgICByYWlzZSBTU0xFcnJvcihlLCByZXF1ZXN0PXJlcXVlc3QpCgogICAgICAgICAgICByYWlzZSBDb25uZWN0aW9uRXJyb3IoZSwgcmVxdWVzdD1yZXF1ZXN0KQoKICAgICAgICBleGNlcHQgQ2xvc2VkUG9vbEVycm9yIGFzIGU6CiAgICAgICAgICAgIHJhaXNlIENvbm5lY3Rpb25FcnJvcihlLCByZXF1ZXN0PXJlcXVlc3QpCgogICAgICAgIGV4Y2VwdCBfUHJveHlFcnJvciBhcyBlOgogICAgICAgICAgICByYWlzZSBQcm94eUVycm9yKGUpCgogICAgICAgIGV4Y2VwdCAoX1NTTEVycm9yLCBfSFRUUEVycm9yKSBhcyBlOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGUsIF9TU0xFcnJvcik6CiAgICAgICAgICAgICAgICAjIFRoaXMgYnJhbmNoIGlzIGZvciB1cmxsaWIzIHZlcnNpb25zIGVhcmxpZXIgdGhhbiB2MS4yMgogICAgICAgICAgICAgICAgcmFpc2UgU1NMRXJyb3IoZSwgcmVxdWVzdD1yZXF1ZXN0KQogICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZSwgUmVhZFRpbWVvdXRFcnJvcik6CiAgICAgICAgICAgICAgICByYWlzZSBSZWFkVGltZW91dChlLCByZXF1ZXN0PXJlcXVlc3QpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByYWlzZQoKICAgICAgICByZXR1cm4gc2VsZi5idWlsZF9yZXNwb25zZShyZXF1ZXN0LCByZXNwKQpQSwMEFAAAAAAAAAAhAJhj6C9dGAAAXRgAACsAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvYXBpLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KCiIiIgpyZXF1ZXN0cy5hcGkKfn5+fn5+fn5+fn5+CgpUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIHRoZSBSZXF1ZXN0cyBBUEkuCgo6Y29weXJpZ2h0OiAoYykgMjAxMiBieSBLZW5uZXRoIFJlaXR6Lgo6bGljZW5zZTogQXBhY2hlMiwgc2VlIExJQ0VOU0UgZm9yIG1vcmUgZGV0YWlscy4KIiIiCgpmcm9tIC4gaW1wb3J0IHNlc3Npb25zCgoKZGVmIHJlcXVlc3QobWV0aG9kLCB1cmwsICoqa3dhcmdzKToKICAgICIiIkNvbnN0cnVjdHMgYW5kIHNlbmRzIGEgOmNsYXNzOmBSZXF1ZXN0IDxSZXF1ZXN0PmAuCgogICAgOnBhcmFtIG1ldGhvZDogbWV0aG9kIGZvciB0aGUgbmV3IDpjbGFzczpgUmVxdWVzdGAgb2JqZWN0LgogICAgOnBhcmFtIHVybDogVVJMIGZvciB0aGUgbmV3IDpjbGFzczpgUmVxdWVzdGAgb2JqZWN0LgogICAgOnBhcmFtIHBhcmFtczogKG9wdGlvbmFsKSBEaWN0aW9uYXJ5IG9yIGJ5dGVzIHRvIGJlIHNlbnQgaW4gdGhlIHF1ZXJ5IHN0cmluZyBmb3IgdGhlIDpjbGFzczpgUmVxdWVzdGAuCiAgICA6cGFyYW0gZGF0YTogKG9wdGlvbmFsKSBEaWN0aW9uYXJ5IG9yIGxpc3Qgb2YgdHVwbGVzIGBgWyhrZXksIHZhbHVlKV1gYCAod2lsbCBiZSBmb3JtLWVuY29kZWQpLCBieXRlcywgb3IgZmlsZS1saWtlIG9iamVjdCB0byBzZW5kIGluIHRoZSBib2R5IG9mIHRoZSA6Y2xhc3M6YFJlcXVlc3RgLgogICAgOnBhcmFtIGpzb246IChvcHRpb25hbCkganNvbiBkYXRhIHRvIHNlbmQgaW4gdGhlIGJvZHkgb2YgdGhlIDpjbGFzczpgUmVxdWVzdGAuCiAgICA6cGFyYW0gaGVhZGVyczogKG9wdGlvbmFsKSBEaWN0aW9uYXJ5IG9mIEhUVFAgSGVhZGVycyB0byBzZW5kIHdpdGggdGhlIDpjbGFzczpgUmVxdWVzdGAuCiAgICA6cGFyYW0gY29va2llczogKG9wdGlvbmFsKSBEaWN0IG9yIENvb2tpZUphciBvYmplY3QgdG8gc2VuZCB3aXRoIHRoZSA6Y2xhc3M6YFJlcXVlc3RgLgogICAgOnBhcmFtIGZpbGVzOiAob3B0aW9uYWwpIERpY3Rpb25hcnkgb2YgYGAnbmFtZSc6IGZpbGUtbGlrZS1vYmplY3RzYGAgKG9yIGBgeyduYW1lJzogZmlsZS10dXBsZX1gYCkgZm9yIG11bHRpcGFydCBlbmNvZGluZyB1cGxvYWQuCiAgICAgICAgYGBmaWxlLXR1cGxlYGAgY2FuIGJlIGEgMi10dXBsZSBgYCgnZmlsZW5hbWUnLCBmaWxlb2JqKWBgLCAzLXR1cGxlIGBgKCdmaWxlbmFtZScsIGZpbGVvYmosICdjb250ZW50X3R5cGUnKWBgCiAgICAgICAgb3IgYSA0LXR1cGxlIGBgKCdmaWxlbmFtZScsIGZpbGVvYmosICdjb250ZW50X3R5cGUnLCBjdXN0b21faGVhZGVycylgYCwgd2hlcmUgYGAnY29udGVudC10eXBlJ2BgIGlzIGEgc3RyaW5nCiAgICAgICAgZGVmaW5pbmcgdGhlIGNvbnRlbnQgdHlwZSBvZiB0aGUgZ2l2ZW4gZmlsZSBhbmQgYGBjdXN0b21faGVhZGVyc2BgIGEgZGljdC1saWtlIG9iamVjdCBjb250YWluaW5nIGFkZGl0aW9uYWwgaGVhZGVycwogICAgICAgIHRvIGFkZCBmb3IgdGhlIGZpbGUuCiAgICA6cGFyYW0gYXV0aDogKG9wdGlvbmFsKSBBdXRoIHR1cGxlIHRvIGVuYWJsZSBCYXNpYy9EaWdlc3QvQ3VzdG9tIEhUVFAgQXV0aC4KICAgIDpwYXJhbSB0aW1lb3V0OiAob3B0aW9uYWwpIEhvdyBtYW55IHNlY29uZHMgdG8gd2FpdCBmb3IgdGhlIHNlcnZlciB0byBzZW5kIGRhdGEKICAgICAgICBiZWZvcmUgZ2l2aW5nIHVwLCBhcyBhIGZsb2F0LCBvciBhIDpyZWY6YChjb25uZWN0IHRpbWVvdXQsIHJlYWQKICAgICAgICB0aW1lb3V0KSA8dGltZW91dHM+YCB0dXBsZS4KICAgIDp0eXBlIHRpbWVvdXQ6IGZsb2F0IG9yIHR1cGxlCiAgICA6cGFyYW0gYWxsb3dfcmVkaXJlY3RzOiAob3B0aW9uYWwpIEJvb2xlYW4uIEVuYWJsZS9kaXNhYmxlIEdFVC9PUFRJT05TL1BPU1QvUFVUL1BBVENIL0RFTEVURS9IRUFEIHJlZGlyZWN0aW9uLiBEZWZhdWx0cyB0byBgYFRydWVgYC4KICAgIDp0eXBlIGFsbG93X3JlZGlyZWN0czogYm9vbAogICAgOnBhcmFtIHByb3hpZXM6IChvcHRpb25hbCkgRGljdGlvbmFyeSBtYXBwaW5nIHByb3RvY29sIHRvIHRoZSBVUkwgb2YgdGhlIHByb3h5LgogICAgOnBhcmFtIHZlcmlmeTogKG9wdGlvbmFsKSBFaXRoZXIgYSBib29sZWFuLCBpbiB3aGljaCBjYXNlIGl0IGNvbnRyb2xzIHdoZXRoZXIgd2UgdmVyaWZ5CiAgICAgICAgICAgIHRoZSBzZXJ2ZXIncyBUTFMgY2VydGlmaWNhdGUsIG9yIGEgc3RyaW5nLCBpbiB3aGljaCBjYXNlIGl0IG11c3QgYmUgYSBwYXRoCiAgICAgICAgICAgIHRvIGEgQ0EgYnVuZGxlIHRvIHVzZS4gRGVmYXVsdHMgdG8gYGBUcnVlYGAuCiAgICA6cGFyYW0gc3RyZWFtOiAob3B0aW9uYWwpIGlmIGBgRmFsc2VgYCwgdGhlIHJlc3BvbnNlIGNvbnRlbnQgd2lsbCBiZSBpbW1lZGlhdGVseSBkb3dubG9hZGVkLgogICAgOnBhcmFtIGNlcnQ6IChvcHRpb25hbCkgaWYgU3RyaW5nLCBwYXRoIHRvIHNzbCBjbGllbnQgY2VydCBmaWxlICgucGVtKS4gSWYgVHVwbGUsICgnY2VydCcsICdrZXknKSBwYWlyLgogICAgOnJldHVybjogOmNsYXNzOmBSZXNwb25zZSA8UmVzcG9uc2U+YCBvYmplY3QKICAgIDpydHlwZTogcmVxdWVzdHMuUmVzcG9uc2UKCiAgICBVc2FnZTo6CgogICAgICA+Pj4gaW1wb3J0IHJlcXVlc3RzCiAgICAgID4+PiByZXEgPSByZXF1ZXN0cy5yZXF1ZXN0KCdHRVQnLCAnaHR0cDovL2h0dHBiaW4ub3JnL2dldCcpCiAgICAgIDxSZXNwb25zZSBbMjAwXT4KICAgICIiIgoKICAgICMgQnkgdXNpbmcgdGhlICd3aXRoJyBzdGF0ZW1lbnQgd2UgYXJlIHN1cmUgdGhlIHNlc3Npb24gaXMgY2xvc2VkLCB0aHVzIHdlCiAgICAjIGF2b2lkIGxlYXZpbmcgc29ja2V0cyBvcGVuIHdoaWNoIGNhbiB0cmlnZ2VyIGEgUmVzb3VyY2VXYXJuaW5nIGluIHNvbWUKICAgICMgY2FzZXMsIGFuZCBsb29rIGxpa2UgYSBtZW1vcnkgbGVhayBpbiBvdGhlcnMuCiAgICB3aXRoIHNlc3Npb25zLlNlc3Npb24oKSBhcyBzZXNzaW9uOgogICAgICAgIHJldHVybiBzZXNzaW9uLnJlcXVlc3QobWV0aG9kPW1ldGhvZCwgdXJsPXVybCwgKiprd2FyZ3MpCgoKZGVmIGdldCh1cmwsIHBhcmFtcz1Ob25lLCAqKmt3YXJncyk6CiAgICByIiIiU2VuZHMgYSBHRVQgcmVxdWVzdC4KCiAgICA6cGFyYW0gdXJsOiBVUkwgZm9yIHRoZSBuZXcgOmNsYXNzOmBSZXF1ZXN0YCBvYmplY3QuCiAgICA6cGFyYW0gcGFyYW1zOiAob3B0aW9uYWwpIERpY3Rpb25hcnkgb3IgYnl0ZXMgdG8gYmUgc2VudCBpbiB0aGUgcXVlcnkgc3RyaW5nIGZvciB0aGUgOmNsYXNzOmBSZXF1ZXN0YC4KICAgIDpwYXJhbSBcKlwqa3dhcmdzOiBPcHRpb25hbCBhcmd1bWVudHMgdGhhdCBgYHJlcXVlc3RgYCB0YWtlcy4KICAgIDpyZXR1cm46IDpjbGFzczpgUmVzcG9uc2UgPFJlc3BvbnNlPmAgb2JqZWN0CiAgICA6cnR5cGU6IHJlcXVlc3RzLlJlc3BvbnNlCiAgICAiIiIKCiAgICBrd2FyZ3Muc2V0ZGVmYXVsdCgnYWxsb3dfcmVkaXJlY3RzJywgVHJ1ZSkKICAgIHJldHVybiByZXF1ZXN0KCdnZXQnLCB1cmwsIHBhcmFtcz1wYXJhbXMsICoqa3dhcmdzKQoKCmRlZiBvcHRpb25zKHVybCwgKiprd2FyZ3MpOgogICAgciIiIlNlbmRzIGFuIE9QVElPTlMgcmVxdWVzdC4KCiAgICA6cGFyYW0gdXJsOiBVUkwgZm9yIHRoZSBuZXcgOmNsYXNzOmBSZXF1ZXN0YCBvYmplY3QuCiAgICA6cGFyYW0gXCpcKmt3YXJnczogT3B0aW9uYWwgYXJndW1lbnRzIHRoYXQgYGByZXF1ZXN0YGAgdGFrZXMuCiAgICA6cmV0dXJuOiA6Y2xhc3M6YFJlc3BvbnNlIDxSZXNwb25zZT5gIG9iamVjdAogICAgOnJ0eXBlOiByZXF1ZXN0cy5SZXNwb25zZQogICAgIiIiCgogICAga3dhcmdzLnNldGRlZmF1bHQoJ2FsbG93X3JlZGlyZWN0cycsIFRydWUpCiAgICByZXR1cm4gcmVxdWVzdCgnb3B0aW9ucycsIHVybCwgKiprd2FyZ3MpCgoKZGVmIGhlYWQodXJsLCAqKmt3YXJncyk6CiAgICByIiIiU2VuZHMgYSBIRUFEIHJlcXVlc3QuCgogICAgOnBhcmFtIHVybDogVVJMIGZvciB0aGUgbmV3IDpjbGFzczpgUmVxdWVzdGAgb2JqZWN0LgogICAgOnBhcmFtIFwqXCprd2FyZ3M6IE9wdGlvbmFsIGFyZ3VtZW50cyB0aGF0IGBgcmVxdWVzdGBgIHRha2VzLgogICAgOnJldHVybjogOmNsYXNzOmBSZXNwb25zZSA8UmVzcG9uc2U+YCBvYmplY3QKICAgIDpydHlwZTogcmVxdWVzdHMuUmVzcG9uc2UKICAgICIiIgoKICAgIGt3YXJncy5zZXRkZWZhdWx0KCdhbGxvd19yZWRpcmVjdHMnLCBGYWxzZSkKICAgIHJldHVybiByZXF1ZXN0KCdoZWFkJywgdXJsLCAqKmt3YXJncykKCgpkZWYgcG9zdCh1cmwsIGRhdGE9Tm9uZSwganNvbj1Ob25lLCAqKmt3YXJncyk6CiAgICByIiIiU2VuZHMgYSBQT1NUIHJlcXVlc3QuCgogICAgOnBhcmFtIHVybDogVVJMIGZvciB0aGUgbmV3IDpjbGFzczpgUmVxdWVzdGAgb2JqZWN0LgogICAgOnBhcmFtIGRhdGE6IChvcHRpb25hbCkgRGljdGlvbmFyeSAod2lsbCBiZSBmb3JtLWVuY29kZWQpLCBieXRlcywgb3IgZmlsZS1saWtlIG9iamVjdCB0byBzZW5kIGluIHRoZSBib2R5IG9mIHRoZSA6Y2xhc3M6YFJlcXVlc3RgLgogICAgOnBhcmFtIGpzb246IChvcHRpb25hbCkganNvbiBkYXRhIHRvIHNlbmQgaW4gdGhlIGJvZHkgb2YgdGhlIDpjbGFzczpgUmVxdWVzdGAuCiAgICA6cGFyYW0gXCpcKmt3YXJnczogT3B0aW9uYWwgYXJndW1lbnRzIHRoYXQgYGByZXF1ZXN0YGAgdGFrZXMuCiAgICA6cmV0dXJuOiA6Y2xhc3M6YFJlc3BvbnNlIDxSZXNwb25zZT5gIG9iamVjdAogICAgOnJ0eXBlOiByZXF1ZXN0cy5SZXNwb25zZQogICAgIiIiCgogICAgcmV0dXJuIHJlcXVlc3QoJ3Bvc3QnLCB1cmwsIGRhdGE9ZGF0YSwganNvbj1qc29uLCAqKmt3YXJncykKCgpkZWYgcHV0KHVybCwgZGF0YT1Ob25lLCAqKmt3YXJncyk6CiAgICByIiIiU2VuZHMgYSBQVVQgcmVxdWVzdC4KCiAgICA6cGFyYW0gdXJsOiBVUkwgZm9yIHRoZSBuZXcgOmNsYXNzOmBSZXF1ZXN0YCBvYmplY3QuCiAgICA6cGFyYW0gZGF0YTogKG9wdGlvbmFsKSBEaWN0aW9uYXJ5ICh3aWxsIGJlIGZvcm0tZW5jb2RlZCksIGJ5dGVzLCBvciBmaWxlLWxpa2Ugb2JqZWN0IHRvIHNlbmQgaW4gdGhlIGJvZHkgb2YgdGhlIDpjbGFzczpgUmVxdWVzdGAuCiAgICA6cGFyYW0ganNvbjogKG9wdGlvbmFsKSBqc29uIGRhdGEgdG8gc2VuZCBpbiB0aGUgYm9keSBvZiB0aGUgOmNsYXNzOmBSZXF1ZXN0YC4KICAgIDpwYXJhbSBcKlwqa3dhcmdzOiBPcHRpb25hbCBhcmd1bWVudHMgdGhhdCBgYHJlcXVlc3RgYCB0YWtlcy4KICAgIDpyZXR1cm46IDpjbGFzczpgUmVzcG9uc2UgPFJlc3BvbnNlPmAgb2JqZWN0CiAgICA6cnR5cGU6IHJlcXVlc3RzLlJlc3BvbnNlCiAgICAiIiIKCiAgICByZXR1cm4gcmVxdWVzdCgncHV0JywgdXJsLCBkYXRhPWRhdGEsICoqa3dhcmdzKQoKCmRlZiBwYXRjaCh1cmwsIGRhdGE9Tm9uZSwgKiprd2FyZ3MpOgogICAgciIiIlNlbmRzIGEgUEFUQ0ggcmVxdWVzdC4KCiAgICA6cGFyYW0gdXJsOiBVUkwgZm9yIHRoZSBuZXcgOmNsYXNzOmBSZXF1ZXN0YCBvYmplY3QuCiAgICA6cGFyYW0gZGF0YTogKG9wdGlvbmFsKSBEaWN0aW9uYXJ5ICh3aWxsIGJlIGZvcm0tZW5jb2RlZCksIGJ5dGVzLCBvciBmaWxlLWxpa2Ugb2JqZWN0IHRvIHNlbmQgaW4gdGhlIGJvZHkgb2YgdGhlIDpjbGFzczpgUmVxdWVzdGAuCiAgICA6cGFyYW0ganNvbjogKG9wdGlvbmFsKSBqc29uIGRhdGEgdG8gc2VuZCBpbiB0aGUgYm9keSBvZiB0aGUgOmNsYXNzOmBSZXF1ZXN0YC4KICAgIDpwYXJhbSBcKlwqa3dhcmdzOiBPcHRpb25hbCBhcmd1bWVudHMgdGhhdCBgYHJlcXVlc3RgYCB0YWtlcy4KICAgIDpyZXR1cm46IDpjbGFzczpgUmVzcG9uc2UgPFJlc3BvbnNlPmAgb2JqZWN0CiAgICA6cnR5cGU6IHJlcXVlc3RzLlJlc3BvbnNlCiAgICAiIiIKCiAgICByZXR1cm4gcmVxdWVzdCgncGF0Y2gnLCB1cmwsIGRhdGE9ZGF0YSwgKiprd2FyZ3MpCgoKZGVmIGRlbGV0ZSh1cmwsICoqa3dhcmdzKToKICAgIHIiIiJTZW5kcyBhIERFTEVURSByZXF1ZXN0LgoKICAgIDpwYXJhbSB1cmw6IFVSTCBmb3IgdGhlIG5ldyA6Y2xhc3M6YFJlcXVlc3RgIG9iamVjdC4KICAgIDpwYXJhbSBcKlwqa3dhcmdzOiBPcHRpb25hbCBhcmd1bWVudHMgdGhhdCBgYHJlcXVlc3RgYCB0YWtlcy4KICAgIDpyZXR1cm46IDpjbGFzczpgUmVzcG9uc2UgPFJlc3BvbnNlPmAgb2JqZWN0CiAgICA6cnR5cGU6IHJlcXVlc3RzLlJlc3BvbnNlCiAgICAiIiIKCiAgICByZXR1cm4gcmVxdWVzdCgnZGVsZXRlJywgdXJsLCAqKmt3YXJncykKUEsDBBQAAAAAAAAAIQADrfKSACYAAAAmAAAsAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL2F1dGgucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoKIiIiCnJlcXVlc3RzLmF1dGgKfn5+fn5+fn5+fn5+fgoKVGhpcyBtb2R1bGUgY29udGFpbnMgdGhlIGF1dGhlbnRpY2F0aW9uIGhhbmRsZXJzIGZvciBSZXF1ZXN0cy4KIiIiCgppbXBvcnQgb3MKaW1wb3J0IHJlCmltcG9ydCB0aW1lCmltcG9ydCBoYXNobGliCmltcG9ydCB0aHJlYWRpbmcKaW1wb3J0IHdhcm5pbmdzCgpmcm9tIGJhc2U2NCBpbXBvcnQgYjY0ZW5jb2RlCgpmcm9tIC5jb21wYXQgaW1wb3J0IHVybHBhcnNlLCBzdHIsIGJhc2VzdHJpbmcKZnJvbSAuY29va2llcyBpbXBvcnQgZXh0cmFjdF9jb29raWVzX3RvX2phcgpmcm9tIC5faW50ZXJuYWxfdXRpbHMgaW1wb3J0IHRvX25hdGl2ZV9zdHJpbmcKZnJvbSAudXRpbHMgaW1wb3J0IHBhcnNlX2RpY3RfaGVhZGVyCgpDT05URU5UX1RZUEVfRk9STV9VUkxFTkNPREVEID0gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcKQ09OVEVOVF9UWVBFX01VTFRJX1BBUlQgPSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScKCgpkZWYgX2Jhc2ljX2F1dGhfc3RyKHVzZXJuYW1lLCBwYXNzd29yZCk6CiAgICAiIiJSZXR1cm5zIGEgQmFzaWMgQXV0aCBzdHJpbmcuIiIiCgogICAgIyAiSSB3YW50IHVzIHRvIHB1dCBhIGJpZy1vbCcgY29tbWVudCBvbiB0b3Agb2YgaXQgdGhhdAogICAgIyBzYXlzIHRoYXQgdGhpcyBiZWhhdmlvdXIgaXMgZHVtYiBidXQgd2UgbmVlZCB0byBwcmVzZXJ2ZQogICAgIyBpdCBiZWNhdXNlIHBlb3BsZSBhcmUgcmVseWluZyBvbiBpdC4iCiAgICAjICAgIC0gTHVrYXNhCiAgICAjCiAgICAjIFRoZXNlIGFyZSBoZXJlIHNvbGVseSB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQogICAgIyBmb3IgdGhpbmdzIGxpa2UgaW50cy4gVGhpcyB3aWxsIGJlIHJlbW92ZWQgaW4gMy4wLjAuCiAgICBpZiBub3QgaXNpbnN0YW5jZSh1c2VybmFtZSwgYmFzZXN0cmluZyk6CiAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgIk5vbi1zdHJpbmcgdXNlcm5hbWVzIHdpbGwgbm8gbG9uZ2VyIGJlIHN1cHBvcnRlZCBpbiBSZXF1ZXN0cyAiCiAgICAgICAgICAgICIzLjAuMC4gUGxlYXNlIGNvbnZlcnQgdGhlIG9iamVjdCB5b3UndmUgcGFzc2VkIGluICh7MCFyfSkgdG8gIgogICAgICAgICAgICAiYSBzdHJpbmcgb3IgYnl0ZXMgb2JqZWN0IGluIHRoZSBuZWFyIGZ1dHVyZSB0byBhdm9pZCAiCiAgICAgICAgICAgICJwcm9ibGVtcy4iLmZvcm1hdCh1c2VybmFtZSksCiAgICAgICAgICAgIGNhdGVnb3J5PURlcHJlY2F0aW9uV2FybmluZywKICAgICAgICApCiAgICAgICAgdXNlcm5hbWUgPSBzdHIodXNlcm5hbWUpCgogICAgaWYgbm90IGlzaW5zdGFuY2UocGFzc3dvcmQsIGJhc2VzdHJpbmcpOgogICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICJOb24tc3RyaW5nIHBhc3N3b3JkcyB3aWxsIG5vIGxvbmdlciBiZSBzdXBwb3J0ZWQgaW4gUmVxdWVzdHMgIgogICAgICAgICAgICAiMy4wLjAuIFBsZWFzZSBjb252ZXJ0IHRoZSBvYmplY3QgeW91J3ZlIHBhc3NlZCBpbiAoezAhcn0pIHRvICIKICAgICAgICAgICAgImEgc3RyaW5nIG9yIGJ5dGVzIG9iamVjdCBpbiB0aGUgbmVhciBmdXR1cmUgdG8gYXZvaWQgIgogICAgICAgICAgICAicHJvYmxlbXMuIi5mb3JtYXQocGFzc3dvcmQpLAogICAgICAgICAgICBjYXRlZ29yeT1EZXByZWNhdGlvbldhcm5pbmcsCiAgICAgICAgKQogICAgICAgIHBhc3N3b3JkID0gc3RyKHBhc3N3b3JkKQogICAgIyAtLSBFbmQgUmVtb3ZhbCAtLQoKICAgIGlmIGlzaW5zdGFuY2UodXNlcm5hbWUsIHN0cik6CiAgICAgICAgdXNlcm5hbWUgPSB1c2VybmFtZS5lbmNvZGUoJ2xhdGluMScpCgogICAgaWYgaXNpbnN0YW5jZShwYXNzd29yZCwgc3RyKToKICAgICAgICBwYXNzd29yZCA9IHBhc3N3b3JkLmVuY29kZSgnbGF0aW4xJykKCiAgICBhdXRoc3RyID0gJ0Jhc2ljICcgKyB0b19uYXRpdmVfc3RyaW5nKAogICAgICAgIGI2NGVuY29kZShiJzonLmpvaW4oKHVzZXJuYW1lLCBwYXNzd29yZCkpKS5zdHJpcCgpCiAgICApCgogICAgcmV0dXJuIGF1dGhzdHIKCgpjbGFzcyBBdXRoQmFzZShvYmplY3QpOgogICAgIiIiQmFzZSBjbGFzcyB0aGF0IGFsbCBhdXRoIGltcGxlbWVudGF0aW9ucyBkZXJpdmUgZnJvbSIiIgoKICAgIGRlZiBfX2NhbGxfXyhzZWxmLCByKToKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCdBdXRoIGhvb2tzIG11c3QgYmUgY2FsbGFibGUuJykKCgpjbGFzcyBIVFRQQmFzaWNBdXRoKEF1dGhCYXNlKToKICAgICIiIkF0dGFjaGVzIEhUVFAgQmFzaWMgQXV0aGVudGljYXRpb24gdG8gdGhlIGdpdmVuIFJlcXVlc3Qgb2JqZWN0LiIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB1c2VybmFtZSwgcGFzc3dvcmQpOgogICAgICAgIHNlbGYudXNlcm5hbWUgPSB1c2VybmFtZQogICAgICAgIHNlbGYucGFzc3dvcmQgPSBwYXNzd29yZAoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBhbGwoWwogICAgICAgICAgICBzZWxmLnVzZXJuYW1lID09IGdldGF0dHIob3RoZXIsICd1c2VybmFtZScsIE5vbmUpLAogICAgICAgICAgICBzZWxmLnBhc3N3b3JkID09IGdldGF0dHIob3RoZXIsICdwYXNzd29yZCcsIE5vbmUpCiAgICAgICAgXSkKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gbm90IHNlbGYgPT0gb3RoZXIKCiAgICBkZWYgX19jYWxsX18oc2VsZiwgcik6CiAgICAgICAgci5oZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPSBfYmFzaWNfYXV0aF9zdHIoc2VsZi51c2VybmFtZSwgc2VsZi5wYXNzd29yZCkKICAgICAgICByZXR1cm4gcgoKCmNsYXNzIEhUVFBQcm94eUF1dGgoSFRUUEJhc2ljQXV0aCk6CiAgICAiIiJBdHRhY2hlcyBIVFRQIFByb3h5IEF1dGhlbnRpY2F0aW9uIHRvIGEgZ2l2ZW4gUmVxdWVzdCBvYmplY3QuIiIiCgogICAgZGVmIF9fY2FsbF9fKHNlbGYsIHIpOgogICAgICAgIHIuaGVhZGVyc1snUHJveHktQXV0aG9yaXphdGlvbiddID0gX2Jhc2ljX2F1dGhfc3RyKHNlbGYudXNlcm5hbWUsIHNlbGYucGFzc3dvcmQpCiAgICAgICAgcmV0dXJuIHIKCgpjbGFzcyBIVFRQRGlnZXN0QXV0aChBdXRoQmFzZSk6CiAgICAiIiJBdHRhY2hlcyBIVFRQIERpZ2VzdCBBdXRoZW50aWNhdGlvbiB0byB0aGUgZ2l2ZW4gUmVxdWVzdCBvYmplY3QuIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHVzZXJuYW1lLCBwYXNzd29yZCk6CiAgICAgICAgc2VsZi51c2VybmFtZSA9IHVzZXJuYW1lCiAgICAgICAgc2VsZi5wYXNzd29yZCA9IHBhc3N3b3JkCiAgICAgICAgIyBLZWVwIHN0YXRlIGluIHBlci10aHJlYWQgbG9jYWwgc3RvcmFnZQogICAgICAgIHNlbGYuX3RocmVhZF9sb2NhbCA9IHRocmVhZGluZy5sb2NhbCgpCgogICAgZGVmIGluaXRfcGVyX3RocmVhZF9zdGF0ZShzZWxmKToKICAgICAgICAjIEVuc3VyZSBzdGF0ZSBpcyBpbml0aWFsaXplZCBqdXN0IG9uY2UgcGVyLXRocmVhZAogICAgICAgIGlmIG5vdCBoYXNhdHRyKHNlbGYuX3RocmVhZF9sb2NhbCwgJ2luaXQnKToKICAgICAgICAgICAgc2VsZi5fdGhyZWFkX2xvY2FsLmluaXQgPSBUcnVlCiAgICAgICAgICAgIHNlbGYuX3RocmVhZF9sb2NhbC5sYXN0X25vbmNlID0gJycKICAgICAgICAgICAgc2VsZi5fdGhyZWFkX2xvY2FsLm5vbmNlX2NvdW50ID0gMAogICAgICAgICAgICBzZWxmLl90aHJlYWRfbG9jYWwuY2hhbCA9IHt9CiAgICAgICAgICAgIHNlbGYuX3RocmVhZF9sb2NhbC5wb3MgPSBOb25lCiAgICAgICAgICAgIHNlbGYuX3RocmVhZF9sb2NhbC5udW1fNDAxX2NhbGxzID0gTm9uZQoKICAgIGRlZiBidWlsZF9kaWdlc3RfaGVhZGVyKHNlbGYsIG1ldGhvZCwgdXJsKToKICAgICAgICAiIiIKICAgICAgICA6cnR5cGU6IHN0cgogICAgICAgICIiIgoKICAgICAgICByZWFsbSA9IHNlbGYuX3RocmVhZF9sb2NhbC5jaGFsWydyZWFsbSddCiAgICAgICAgbm9uY2UgPSBzZWxmLl90aHJlYWRfbG9jYWwuY2hhbFsnbm9uY2UnXQogICAgICAgIHFvcCA9IHNlbGYuX3RocmVhZF9sb2NhbC5jaGFsLmdldCgncW9wJykKICAgICAgICBhbGdvcml0aG0gPSBzZWxmLl90aHJlYWRfbG9jYWwuY2hhbC5nZXQoJ2FsZ29yaXRobScpCiAgICAgICAgb3BhcXVlID0gc2VsZi5fdGhyZWFkX2xvY2FsLmNoYWwuZ2V0KCdvcGFxdWUnKQogICAgICAgIGhhc2hfdXRmOCA9IE5vbmUKCiAgICAgICAgaWYgYWxnb3JpdGhtIGlzIE5vbmU6CiAgICAgICAgICAgIF9hbGdvcml0aG0gPSAnTUQ1JwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIF9hbGdvcml0aG0gPSBhbGdvcml0aG0udXBwZXIoKQogICAgICAgICMgbGFtYmRhcyBhc3N1bWUgZGlnZXN0IG1vZHVsZXMgYXJlIGltcG9ydGVkIGF0IHRoZSB0b3AgbGV2ZWwKICAgICAgICBpZiBfYWxnb3JpdGhtID09ICdNRDUnIG9yIF9hbGdvcml0aG0gPT0gJ01ENS1TRVNTJzoKICAgICAgICAgICAgZGVmIG1kNV91dGY4KHgpOgogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh4LCBzdHIpOgogICAgICAgICAgICAgICAgICAgIHggPSB4LmVuY29kZSgndXRmLTgnKQogICAgICAgICAgICAgICAgcmV0dXJuIGhhc2hsaWIubWQ1KHgpLmhleGRpZ2VzdCgpCiAgICAgICAgICAgIGhhc2hfdXRmOCA9IG1kNV91dGY4CiAgICAgICAgZWxpZiBfYWxnb3JpdGhtID09ICdTSEEnOgogICAgICAgICAgICBkZWYgc2hhX3V0ZjgoeCk6CiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHgsIHN0cik6CiAgICAgICAgICAgICAgICAgICAgeCA9IHguZW5jb2RlKCd1dGYtOCcpCiAgICAgICAgICAgICAgICByZXR1cm4gaGFzaGxpYi5zaGExKHgpLmhleGRpZ2VzdCgpCiAgICAgICAgICAgIGhhc2hfdXRmOCA9IHNoYV91dGY4CgogICAgICAgIEtEID0gbGFtYmRhIHMsIGQ6IGhhc2hfdXRmOCgiJXM6JXMiICUgKHMsIGQpKQoKICAgICAgICBpZiBoYXNoX3V0ZjggaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgIyBYWFggbm90IGltcGxlbWVudGVkIHlldAogICAgICAgIGVudGRpZyA9IE5vbmUKICAgICAgICBwX3BhcnNlZCA9IHVybHBhcnNlKHVybCkKICAgICAgICAjOiBwYXRoIGlzIHJlcXVlc3QtdXJpIGRlZmluZWQgaW4gUkZDIDI2MTYgd2hpY2ggc2hvdWxkIG5vdCBiZSBlbXB0eQogICAgICAgIHBhdGggPSBwX3BhcnNlZC5wYXRoIG9yICIvIgogICAgICAgIGlmIHBfcGFyc2VkLnF1ZXJ5OgogICAgICAgICAgICBwYXRoICs9ICc/JyArIHBfcGFyc2VkLnF1ZXJ5CgogICAgICAgIEExID0gJyVzOiVzOiVzJyAlIChzZWxmLnVzZXJuYW1lLCByZWFsbSwgc2VsZi5wYXNzd29yZCkKICAgICAgICBBMiA9ICclczolcycgJSAobWV0aG9kLCBwYXRoKQoKICAgICAgICBIQTEgPSBoYXNoX3V0ZjgoQTEpCiAgICAgICAgSEEyID0gaGFzaF91dGY4KEEyKQoKICAgICAgICBpZiBub25jZSA9PSBzZWxmLl90aHJlYWRfbG9jYWwubGFzdF9ub25jZToKICAgICAgICAgICAgc2VsZi5fdGhyZWFkX2xvY2FsLm5vbmNlX2NvdW50ICs9IDEKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLl90aHJlYWRfbG9jYWwubm9uY2VfY291bnQgPSAxCiAgICAgICAgbmN2YWx1ZSA9ICclMDh4JyAlIHNlbGYuX3RocmVhZF9sb2NhbC5ub25jZV9jb3VudAogICAgICAgIHMgPSBzdHIoc2VsZi5fdGhyZWFkX2xvY2FsLm5vbmNlX2NvdW50KS5lbmNvZGUoJ3V0Zi04JykKICAgICAgICBzICs9IG5vbmNlLmVuY29kZSgndXRmLTgnKQogICAgICAgIHMgKz0gdGltZS5jdGltZSgpLmVuY29kZSgndXRmLTgnKQogICAgICAgIHMgKz0gb3MudXJhbmRvbSg4KQoKICAgICAgICBjbm9uY2UgPSAoaGFzaGxpYi5zaGExKHMpLmhleGRpZ2VzdCgpWzoxNl0pCiAgICAgICAgaWYgX2FsZ29yaXRobSA9PSAnTUQ1LVNFU1MnOgogICAgICAgICAgICBIQTEgPSBoYXNoX3V0ZjgoJyVzOiVzOiVzJyAlIChIQTEsIG5vbmNlLCBjbm9uY2UpKQoKICAgICAgICBpZiBub3QgcW9wOgogICAgICAgICAgICByZXNwZGlnID0gS0QoSEExLCAiJXM6JXMiICUgKG5vbmNlLCBIQTIpKQogICAgICAgIGVsaWYgcW9wID09ICdhdXRoJyBvciAnYXV0aCcgaW4gcW9wLnNwbGl0KCcsJyk6CiAgICAgICAgICAgIG5vbmNlYml0ID0gIiVzOiVzOiVzOiVzOiVzIiAlICgKICAgICAgICAgICAgICAgIG5vbmNlLCBuY3ZhbHVlLCBjbm9uY2UsICdhdXRoJywgSEEyCiAgICAgICAgICAgICkKICAgICAgICAgICAgcmVzcGRpZyA9IEtEKEhBMSwgbm9uY2ViaXQpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBYWFggaGFuZGxlIGF1dGgtaW50LgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICBzZWxmLl90aHJlYWRfbG9jYWwubGFzdF9ub25jZSA9IG5vbmNlCgogICAgICAgICMgWFhYIHNob3VsZCB0aGUgcGFydGlhbCBkaWdlc3RzIGJlIGVuY29kZWQgdG9vPwogICAgICAgIGJhc2UgPSAndXNlcm5hbWU9IiVzIiwgcmVhbG09IiVzIiwgbm9uY2U9IiVzIiwgdXJpPSIlcyIsICcgXAogICAgICAgICAgICAgICAncmVzcG9uc2U9IiVzIicgJSAoc2VsZi51c2VybmFtZSwgcmVhbG0sIG5vbmNlLCBwYXRoLCByZXNwZGlnKQogICAgICAgIGlmIG9wYXF1ZToKICAgICAgICAgICAgYmFzZSArPSAnLCBvcGFxdWU9IiVzIicgJSBvcGFxdWUKICAgICAgICBpZiBhbGdvcml0aG06CiAgICAgICAgICAgIGJhc2UgKz0gJywgYWxnb3JpdGhtPSIlcyInICUgYWxnb3JpdGhtCiAgICAgICAgaWYgZW50ZGlnOgogICAgICAgICAgICBiYXNlICs9ICcsIGRpZ2VzdD0iJXMiJyAlIGVudGRpZwogICAgICAgIGlmIHFvcDoKICAgICAgICAgICAgYmFzZSArPSAnLCBxb3A9ImF1dGgiLCBuYz0lcywgY25vbmNlPSIlcyInICUgKG5jdmFsdWUsIGNub25jZSkKCiAgICAgICAgcmV0dXJuICdEaWdlc3QgJXMnICUgKGJhc2UpCgogICAgZGVmIGhhbmRsZV9yZWRpcmVjdChzZWxmLCByLCAqKmt3YXJncyk6CiAgICAgICAgIiIiUmVzZXQgbnVtXzQwMV9jYWxscyBjb3VudGVyIG9uIHJlZGlyZWN0cy4iIiIKICAgICAgICBpZiByLmlzX3JlZGlyZWN0OgogICAgICAgICAgICBzZWxmLl90aHJlYWRfbG9jYWwubnVtXzQwMV9jYWxscyA9IDEKCiAgICBkZWYgaGFuZGxlXzQwMShzZWxmLCByLCAqKmt3YXJncyk6CiAgICAgICAgIiIiCiAgICAgICAgVGFrZXMgdGhlIGdpdmVuIHJlc3BvbnNlIGFuZCB0cmllcyBkaWdlc3QtYXV0aCwgaWYgbmVlZGVkLgoKICAgICAgICA6cnR5cGU6IHJlcXVlc3RzLlJlc3BvbnNlCiAgICAgICAgIiIiCgogICAgICAgICMgSWYgcmVzcG9uc2UgaXMgbm90IDR4eCwgZG8gbm90IGF1dGgKICAgICAgICAjIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcmVxdWVzdHMvcmVxdWVzdHMvaXNzdWVzLzM3NzIKICAgICAgICBpZiBub3QgNDAwIDw9IHIuc3RhdHVzX2NvZGUgPCA1MDA6CiAgICAgICAgICAgIHNlbGYuX3RocmVhZF9sb2NhbC5udW1fNDAxX2NhbGxzID0gMQogICAgICAgICAgICByZXR1cm4gcgoKICAgICAgICBpZiBzZWxmLl90aHJlYWRfbG9jYWwucG9zIGlzIG5vdCBOb25lOgogICAgICAgICAgICAjIFJld2luZCB0aGUgZmlsZSBwb3NpdGlvbiBpbmRpY2F0b3Igb2YgdGhlIGJvZHkgdG8gd2hlcmUKICAgICAgICAgICAgIyBpdCB3YXMgdG8gcmVzZW5kIHRoZSByZXF1ZXN0LgogICAgICAgICAgICByLnJlcXVlc3QuYm9keS5zZWVrKHNlbGYuX3RocmVhZF9sb2NhbC5wb3MpCiAgICAgICAgc19hdXRoID0gci5oZWFkZXJzLmdldCgnd3d3LWF1dGhlbnRpY2F0ZScsICcnKQoKICAgICAgICBpZiAnZGlnZXN0JyBpbiBzX2F1dGgubG93ZXIoKSBhbmQgc2VsZi5fdGhyZWFkX2xvY2FsLm51bV80MDFfY2FsbHMgPCAyOgoKICAgICAgICAgICAgc2VsZi5fdGhyZWFkX2xvY2FsLm51bV80MDFfY2FsbHMgKz0gMQogICAgICAgICAgICBwYXQgPSByZS5jb21waWxlKHInZGlnZXN0ICcsIGZsYWdzPXJlLklHTk9SRUNBU0UpCiAgICAgICAgICAgIHNlbGYuX3RocmVhZF9sb2NhbC5jaGFsID0gcGFyc2VfZGljdF9oZWFkZXIocGF0LnN1YignJywgc19hdXRoLCBjb3VudD0xKSkKCiAgICAgICAgICAgICMgQ29uc3VtZSBjb250ZW50IGFuZCByZWxlYXNlIHRoZSBvcmlnaW5hbCBjb25uZWN0aW9uCiAgICAgICAgICAgICMgdG8gYWxsb3cgb3VyIG5ldyByZXF1ZXN0IHRvIHJldXNlIHRoZSBzYW1lIG9uZS4KICAgICAgICAgICAgci5jb250ZW50CiAgICAgICAgICAgIHIuY2xvc2UoKQogICAgICAgICAgICBwcmVwID0gci5yZXF1ZXN0LmNvcHkoKQogICAgICAgICAgICBleHRyYWN0X2Nvb2tpZXNfdG9famFyKHByZXAuX2Nvb2tpZXMsIHIucmVxdWVzdCwgci5yYXcpCiAgICAgICAgICAgIHByZXAucHJlcGFyZV9jb29raWVzKHByZXAuX2Nvb2tpZXMpCgogICAgICAgICAgICBwcmVwLmhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXSA9IHNlbGYuYnVpbGRfZGlnZXN0X2hlYWRlcigKICAgICAgICAgICAgICAgIHByZXAubWV0aG9kLCBwcmVwLnVybCkKICAgICAgICAgICAgX3IgPSByLmNvbm5lY3Rpb24uc2VuZChwcmVwLCAqKmt3YXJncykKICAgICAgICAgICAgX3IuaGlzdG9yeS5hcHBlbmQocikKICAgICAgICAgICAgX3IucmVxdWVzdCA9IHByZXAKCiAgICAgICAgICAgIHJldHVybiBfcgoKICAgICAgICBzZWxmLl90aHJlYWRfbG9jYWwubnVtXzQwMV9jYWxscyA9IDEKICAgICAgICByZXR1cm4gcgoKICAgIGRlZiBfX2NhbGxfXyhzZWxmLCByKToKICAgICAgICAjIEluaXRpYWxpemUgcGVyLXRocmVhZCBzdGF0ZSwgaWYgbmVlZGVkCiAgICAgICAgc2VsZi5pbml0X3Blcl90aHJlYWRfc3RhdGUoKQogICAgICAgICMgSWYgd2UgaGF2ZSBhIHNhdmVkIG5vbmNlLCBza2lwIHRoZSA0MDEKICAgICAgICBpZiBzZWxmLl90aHJlYWRfbG9jYWwubGFzdF9ub25jZToKICAgICAgICAgICAgci5oZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPSBzZWxmLmJ1aWxkX2RpZ2VzdF9oZWFkZXIoci5tZXRob2QsIHIudXJsKQogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5fdGhyZWFkX2xvY2FsLnBvcyA9IHIuYm9keS50ZWxsKCkKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgICMgSW4gdGhlIGNhc2Ugb2YgSFRUUERpZ2VzdEF1dGggYmVpbmcgcmV1c2VkIGFuZCB0aGUgYm9keSBvZgogICAgICAgICAgICAjIHRoZSBwcmV2aW91cyByZXF1ZXN0IHdhcyBhIGZpbGUtbGlrZSBvYmplY3QsIHBvcyBoYXMgdGhlCiAgICAgICAgICAgICMgZmlsZSBwb3NpdGlvbiBvZiB0aGUgcHJldmlvdXMgYm9keS4gRW5zdXJlIGl0J3Mgc2V0IHRvCiAgICAgICAgICAgICMgTm9uZS4KICAgICAgICAgICAgc2VsZi5fdGhyZWFkX2xvY2FsLnBvcyA9IE5vbmUKICAgICAgICByLnJlZ2lzdGVyX2hvb2soJ3Jlc3BvbnNlJywgc2VsZi5oYW5kbGVfNDAxKQogICAgICAgIHIucmVnaXN0ZXJfaG9vaygncmVzcG9uc2UnLCBzZWxmLmhhbmRsZV9yZWRpcmVjdCkKICAgICAgICBzZWxmLl90aHJlYWRfbG9jYWwubnVtXzQwMV9jYWxscyA9IDEKCiAgICAgICAgcmV0dXJuIHIKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gYWxsKFsKICAgICAgICAgICAgc2VsZi51c2VybmFtZSA9PSBnZXRhdHRyKG90aGVyLCAndXNlcm5hbWUnLCBOb25lKSwKICAgICAgICAgICAgc2VsZi5wYXNzd29yZCA9PSBnZXRhdHRyKG90aGVyLCAncGFzc3dvcmQnLCBOb25lKQogICAgICAgIF0pCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIG5vdCBzZWxmID09IG90aGVyClBLAwQUAAAAAAAAACEABaHa9fAiBADwIgQALwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9jYWNlcnQucGVtCiMgSXNzdWVyOiBDTj1HbG9iYWxTaWduIFJvb3QgQ0EgTz1HbG9iYWxTaWduIG52LXNhIE9VPVJvb3QgQ0EKIyBTdWJqZWN0OiBDTj1HbG9iYWxTaWduIFJvb3QgQ0EgTz1HbG9iYWxTaWduIG52LXNhIE9VPVJvb3QgQ0EKIyBMYWJlbDogIkdsb2JhbFNpZ24gUm9vdCBDQSIKIyBTZXJpYWw6IDQ4MzU3MDMyNzg0NTk3MDc2NjkwMDUyMDQKIyBNRDUgRmluZ2VycHJpbnQ6IDNlOjQ1OjUyOjE1OjA5OjUxOjkyOmUxOmI3OjVkOjM3OjlmOmIxOjg3OjI5OjhhCiMgU0hBMSBGaW5nZXJwcmludDogYjE6YmM6OTY6OGI6ZDQ6ZjQ6OWQ6NjI6MmE6YTg6OWE6ODE6ZjI6MTU6MDE6NTI6YTQ6MWQ6ODI6OWMKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGViOmQ0OjEwOjQwOmU0OmJiOjNlOmM3OjQyOmM5OmUzOjgxOmQzOjFlOmYyOmE0OjFhOjQ4OmI2OjY4OjVjOjk2OmU3OmNlOmYzOmMxOmRmOjZjOmQ0OjMzOjFjOjk5Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEZFRDQ0FsMmdBd0lCQWdJTEJBQUFBQUFCRlV0YXc1UXdEUVlKS29aSWh2Y05BUUVGQlFBd1Z6RUxNQWtHCkExVUVCaE1DUWtVeEdUQVhCZ05WQkFvVEVFZHNiMkpoYkZOcFoyNGdibll0YzJFeEVEQU9CZ05WQkFzVEIxSnYKYjNRZ1EwRXhHekFaQmdOVkJBTVRFa2RzYjJKaGJGTnBaMjRnVW05dmRDQkRRVEFlRncwNU9EQTVNREV4TWpBdwpNREJhRncweU9EQXhNamd4TWpBd01EQmFNRmN4Q3pBSkJnTlZCQVlUQWtKRk1Sa3dGd1lEVlFRS0V4QkhiRzlpCllXeFRhV2R1SUc1MkxYTmhNUkF3RGdZRFZRUUxFd2RTYjI5MElFTkJNUnN3R1FZRFZRUURFeEpIYkc5aVlXeFQKYVdkdUlGSnZiM1FnUTBFd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUURhRHVhWgpqYzZqNDArS2Z2dnhpNE1sYStwSUgvRXFzTG1WRVFTOThHUFI0bWRtenh6ZHp4dElLKzZOaVk2YXJ5bUFaYXZwCnh5MFN5NnNjVEhBSG9UMEtNTTBWalUvNDNkU01VQlVjNzFEdXhDNzMvT2xTOHBGOTRHM1ZOVENPWGtOejhrSHAKMVdyanNvazZWams0YndZOGlHbGJLazNGcDFTNGJJbk1tL2s4eXVYOWlmVVNQSko0bHRiY2RHNlRSR0hSamNkRwpzblVPaHVnWml0VnRiTlY0RnBXaTZjZ0tPT3Z5SkJOUGMxU1RFNFU2Rzd3ZU5MV0xCWXk1ZDR1eDJ4OGdrYXNKClUyNlF6bnMzZExsd1I1RWlVV01XZWE2eHJrRW1DTWdaSzlGR3FraldaQ3JYZ3pUL0xDckJiQmxEU2dlRjU5TjgKOWlGbzcrcnlVcDkvazVEUEFnTUJBQUdqUWpCQU1BNEdBMVVkRHdFQi93UUVBd0lCQmpBUEJnTlZIUk1CQWY4RQpCVEFEQVFIL01CMEdBMVVkRGdRV0JCUmdlMllhUlEyWHlvbFFMMzBFelRTby8vejlTekFOQmdrcWhraUc5dzBCCkFRVUZBQU9DQVFFQTFuUG5mRTkyMEkyLzdMcWl2alRGS0RLMWZQeHNuQ3dydlFtZVU3OXJYcW9SU0xibENLT3oKeWoxaFRkTkdDYk0rdzZEalkxVWI4cnJ2clRuaFE3azRvK1l2aWlZNzc2QlFWdm5HQ3YwNHpjUUxjRkdVbDVnRQozOE5mbE5VVnlSUkJuTVJkZFdRVkRmOVZNT3lHai84Tjd5eTVZMGIycXZ6ZnZHbjlMaEpJWkpyZ2xmQ203eW1QCkFiRVZ0UXdkcGY1cExHa2tlQjZ6cHh4eFl1N0t5SmVzRjEyS3d2aEhobTRxeEZZeGxkQm5pWVVyK1d5bVhVYWQKREtxQzVKbFIzWEMzMjFZOVllUnE0VnpXOXY0OTNrSE1CNjVqVXI5VFUvUXI2Y2Y5dHZlQ1g0WFNRUmpiZ2JNRQpITVVmcElCdkZTREozZ3lJQ2gzV1psWGkvRWpKS1NacDRBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUdsb2JhbFNpZ24gTz1HbG9iYWxTaWduIE9VPUdsb2JhbFNpZ24gUm9vdCBDQSAtIFIyCiMgU3ViamVjdDogQ049R2xvYmFsU2lnbiBPPUdsb2JhbFNpZ24gT1U9R2xvYmFsU2lnbiBSb290IENBIC0gUjIKIyBMYWJlbDogIkdsb2JhbFNpZ24gUm9vdCBDQSAtIFIyIgojIFNlcmlhbDogNDgzNTcwMzI3ODQ1OTY4Mjg4NTY1ODEyNQojIE1ENSBGaW5nZXJwcmludDogOTQ6MTQ6Nzc6N2U6M2U6NWU6ZmQ6OGY6MzA6YmQ6NDE6YjA6Y2Y6ZTc6ZDA6MzAKIyBTSEExIEZpbmdlcnByaW50OiA3NTplMDphYjpiNjoxMzo4NToxMjoyNzoxYzowNDpmODo1ZjpkZDpkZTozODplNDpiNzoyNDoyZTpmZQojIFNIQTI1NiBGaW5nZXJwcmludDogY2E6NDI6ZGQ6NDE6NzQ6NWY6ZDA6Yjg6MWU6Yjk6MDI6MzY6MmM6Zjk6ZDg6YmY6NzE6OWQ6YTE6YmQ6MWI6MWU6ZmM6OTQ6NmY6NWI6NGM6OTk6ZjQ6MmM6MWI6OWUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR1akNDQXFLZ0F3SUJBZ0lMQkFBQUFBQUJENFltNWcwd0RRWUpLb1pJaHZjTkFRRUZCUUF3VERFZ01CNEcKQTFVRUN4TVhSMnh2WW1Gc1UybG5iaUJTYjI5MElFTkJJQzBnVWpJeEV6QVJCZ05WQkFvVENrZHNiMkpoYkZOcApaMjR4RXpBUkJnTlZCQU1UQ2tkc2IySmhiRk5wWjI0d0hoY05NRFl4TWpFMU1EZ3dNREF3V2hjTk1qRXhNakUxCk1EZ3dNREF3V2pCTU1TQXdIZ1lEVlFRTEV4ZEhiRzlpWVd4VGFXZHVJRkp2YjNRZ1EwRWdMU0JTTWpFVE1CRUcKQTFVRUNoTUtSMnh2WW1Gc1UybG5iakVUTUJFR0ExVUVBeE1LUjJ4dlltRnNVMmxuYmpDQ0FTSXdEUVlKS29aSQpodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUtiUEpBNitMbThvbVVWQ3hLcytJVlNiQzlOL2hIRDZFclBMCnY0ZGZ4bitHMDdJd1hOYjlyZkY3M09YNFlKWUpraEQxMEZQZSszdCtjNGlzVW9oN1NxYktTYVplcUtlTVdoRzgKZW9McnZvenBzNnlXSlFlWFNwa3FCeSswSG5lL2lnKzFBbndibHJqRnVUb3N2TllTdWV0WmZlTFFCb1pmWGtscQp0VGxlaURUc3ZIZ01DSmlFYktqTlM3U2dmUXg1VGZDNExjc2h5dFZzVzMzaG9DbUVvZm5UbEVuTEpHS1JJTHpkCkM5WFp6UG5xSndvcmM1SEduUnVzeU12bzRLRDBMNUNMVGZ1d05odjJHWHFGNEczeVlST0lYSi9na3dwUmw0cGEKenErcjFmZXFDYXBndmR6Wlg5OXlxV0FUWGdBQnlVcjZQNlRxQndNaEFvNkN5Z1BDbTQ4Q0F3RUFBYU9CbkRDQgptVEFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVVtK0lIClYyY2NIc0JxQnQ1WnRKb3QzOXdaaGk0d05nWURWUjBmQkM4d0xUQXJvQ21nSjRZbGFIUjBjRG92TDJOeWJDNW4KYkc5aVlXeHphV2R1TG01bGRDOXliMjkwTFhJeUxtTnliREFmQmdOVkhTTUVHREFXZ0JTYjRnZFhaeHdld0dvRwozbG0wbWkzZjNCbUdMakFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBbVlGVGh4eG9sNGFSN09CS3VFUUxxNEdzCkowL1d3YmdjUTNpekRKcjg2aXc4Ym1FYlRVc3A5WjhGSFNiQnVPbURBR0pGdHFrSWs3bXBNMHNZbXNMNGg0aE8KMjkxeE5CckJWTnBHUCtEVEtxdHRWQ0wxT21MTklHKzZLWW5YM1pIdTAxeWlQcUZiUWZYZjVXUkRMZW5WT2F2UwpvdCszaTlEQWdCa2NSY0F0ak9qNExhUjBWa25GQmJWUEZkNXVSSGc1aDZoK3UvTjVHSkc3OUcrZHdmQ01OWXhkCkFmdkRiYm52UkcxNVJqRitDdjZwZ3NILzc2dHVJTVJReVYrZFRac1hqQXpsQWNtZ1FXcHpVL3FsVUxSdUpRLzcKVEJqMC9WTFpqbW14NkJFUDNvalkreDFKOTZyZWxjOGdlTUpnRXRzbFFJeHEvSDVDT0VCa0V2ZWVnZUdUTGc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VmVyaVNpZ24gQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczIE89VmVyaVNpZ24sIEluYy4gT1U9VmVyaVNpZ24gVHJ1c3QgTmV0d29yay8oYykgMTk5OSBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgU3ViamVjdDogQ049VmVyaVNpZ24gQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczIE89VmVyaVNpZ24sIEluYy4gT1U9VmVyaVNpZ24gVHJ1c3QgTmV0d29yay8oYykgMTk5OSBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgTGFiZWw6ICJWZXJpc2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzMiCiMgU2VyaWFsOiAyMDY2ODQ2OTYyNzk0NzIzMTAyNTQyNzc4NzAxODA5NjY3MjM0MTUKIyBNRDUgRmluZ2VycHJpbnQ6IGNkOjY4OmI2OmE3OmM3OmM0OmNlOjc1OmUwOjFkOjRmOjU3OjQ0OjYxOjkyOjA5CiMgU0hBMSBGaW5nZXJwcmludDogMTM6MmQ6MGQ6NDU6NTM6NGI6Njk6OTc6Y2Q6YjI6ZDU6YzM6Mzk6ZTI6NTU6NzY6NjA6OWI6NWM6YzYKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGViOjA0OmNmOjVlOmIxOmYzOjlhOmZhOjc2OjJmOjJiOmIxOjIwOmYyOjk2OmNiOmE1OjIwOmMxOmI5OjdkOmIxOjU4Ojk1OjY1OmI4OjFjOmI5OmExOjdiOjcyOjQ0Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFR2pDQ0F3SUNFUUNiZmdaSm96NWl1ZFh1a0VoeEtlOVhNQTBHQ1NxR1NJYjNEUUVCQlFVQU1JSEtNUXN3CkNRWURWUVFHRXdKVlV6RVhNQlVHQTFVRUNoTU9WbVZ5YVZOcFoyNHNJRWx1WXk0eEh6QWRCZ05WQkFzVEZsWmwKY21sVGFXZHVJRlJ5ZFhOMElFNWxkSGR2Y21zeE9qQTRCZ05WQkFzVE1TaGpLU0F4T1RrNUlGWmxjbWxUYVdkdQpMQ0JKYm1NdUlDMGdSbTl5SUdGMWRHaHZjbWw2WldRZ2RYTmxJRzl1YkhreFJUQkRCZ05WQkFNVFBGWmxjbWxUCmFXZHVJRU5zWVhOeklETWdVSFZpYkdsaklGQnlhVzFoY25rZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnAKZEhrZ0xTQkhNekFlRncwNU9URXdNREV3TURBd01EQmFGdzB6TmpBM01UWXlNelU1TlRsYU1JSEtNUXN3Q1FZRApWUVFHRXdKVlV6RVhNQlVHQTFVRUNoTU9WbVZ5YVZOcFoyNHNJRWx1WXk0eEh6QWRCZ05WQkFzVEZsWmxjbWxUCmFXZHVJRlJ5ZFhOMElFNWxkSGR2Y21zeE9qQTRCZ05WQkFzVE1TaGpLU0F4T1RrNUlGWmxjbWxUYVdkdUxDQkoKYm1NdUlDMGdSbTl5SUdGMWRHaHZjbWw2WldRZ2RYTmxJRzl1YkhreFJUQkRCZ05WQkFNVFBGWmxjbWxUYVdkdQpJRU5zWVhOeklETWdVSFZpYkdsaklGQnlhVzFoY25rZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGtnCkxTQkhNekNDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFNdTZuRkw4ZUI4YUhtOGIKTjNPOStNbHJsQkl3VC9BMlIvWFFrUXIxRjhpbFljRVdRRTM3aW1HUTVYWWd3UkVHZmFzc2JxYjFFVUdPK2kydApLbUZacEdjbVRORG92RkpiY0NBRVdORjZ5YVJwdklNWFpLMEZpN3pRV002TmpQWHI4RUpKQzUyWEoyY3lidUd1Cmt4VWNjTHdnVFM4WTNwS0k2R3lGVnhFYTZYN2pKaEZVb2tXV1ZZUEtNSW5vM05pajdTcUFQMzk1WlZjK0ZTQm0KQ0MrVms3K3FSeStvUnBmd0V1TCt3Z29yVWVaMjVyZEd0K0lOcHN5b3cweFpWWW5tNkZOY0hPcWQ4R0lXQzZmSgpYd3p3M3NKMnpxLzNhdkw2UWFhaU14VEo1WHBqMDU1aU45V0ZaWjRPNWxNa2RCdGVIUkpUVzhjczU0TkpPeFd1CmltaTVWNWNDQXdFQUFUQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFFUlNXd2F1U0NQYy9MOG15L3VSYW4yVGUKMnlGUGhwazBkalpYM2RBVkw4V3RmeFVmTjJKelB0VG5YODRYQTlzMStpdmJybUFKWHg1ZmoyNjdDejNxV2hNZQpER0J2dGNDMUl5SXVCd3ZMcVhUTFI3c2R3ZGVsYTh3djBrTDlTZDJuaWM5VHV0b0FXaWkvZ3QvNHVoTWRVSWFDCi9ZNHdqeWxHc0I0OU5kbzRZaFlZU3EzbXRsRnMzcTlpNndIUUhpVCtlbzhTR2hKb3VQdG1tUlFVUlZ5dTU2NXAKRjRFcldqZkpYaXIweHVLaFhGU2JwbFFBei9EeHdjZVlNQm83TmhiYm8yN3EvYTJ5d3RydkFrY1Rpc0R4c3pHdApUeHpoVDV5dkR3eWQ5M2dOMlBRMVZvRGF0MjBYajUwZWdXVGgvc1ZGdXExcnVRcDZUazlMaE81TDhYM2RFUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1FbnRydXN0Lm5ldCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAoMjA0OCkgTz1FbnRydXN0Lm5ldCBPVT13d3cuZW50cnVzdC5uZXQvQ1BTXzIwNDggaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pLyhjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQKIyBTdWJqZWN0OiBDTj1FbnRydXN0Lm5ldCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAoMjA0OCkgTz1FbnRydXN0Lm5ldCBPVT13d3cuZW50cnVzdC5uZXQvQ1BTXzIwNDggaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pLyhjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQKIyBMYWJlbDogIkVudHJ1c3QubmV0IFByZW1pdW0gMjA0OCBTZWN1cmUgU2VydmVyIENBIgojIFNlcmlhbDogOTQ2MDY5MjQwCiMgTUQ1IEZpbmdlcnByaW50OiBlZToyOTozMTpiYzozMjo3ZTo5YTplNjplODpiNTpmNzo1MTpiNDozNDo3MTo5MAojIFNIQTEgRmluZ2VycHJpbnQ6IDUwOjMwOjA2OjA5OjFkOjk3OmQ0OmY1OmFlOjM5OmY3OmNiOmU3OjkyOjdkOjdkOjY1OjJkOjM0OjMxCiMgU0hBMjU2IEZpbmdlcnByaW50OiA2ZDpjNDo3MTo3MjplMDoxYzpiYzpiMDpiZjo2Mjo1ODowZDo4OTo1ZjplMjpiODphYzo5YTpkNDpmODo3Mzo4MDoxZTowYzoxMDpiOTpjODozNzpkMjoxZTpiMTo3NwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUtqQ0NBeEtnQXdJQkFnSUVPR1BlK0RBTkJna3Foa2lHOXcwQkFRVUZBRENCdERFVU1CSUdBMVVFQ2hNTApSVzUwY25WemRDNXVaWFF4UURBK0JnTlZCQXNVTjNkM2R5NWxiblJ5ZFhOMExtNWxkQzlEVUZOZk1qQTBPQ0JwCmJtTnZjbkF1SUdKNUlISmxaaTRnS0d4cGJXbDBjeUJzYVdGaUxpa3hKVEFqQmdOVkJBc1RIQ2hqS1NBeE9UazUKSUVWdWRISjFjM1F1Ym1WMElFeHBiV2wwWldReE16QXhCZ05WQkFNVEtrVnVkSEoxYzNRdWJtVjBJRU5sY25ScApabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVJQ2d5TURRNEtUQWVGdzA1T1RFeU1qUXhOelV3TlRGYUZ3MHlPVEEzCk1qUXhOREUxTVRKYU1JRzBNUlF3RWdZRFZRUUtFd3RGYm5SeWRYTjBMbTVsZERGQU1ENEdBMVVFQ3hRM2QzZDMKTG1WdWRISjFjM1F1Ym1WMEwwTlFVMTh5TURRNElHbHVZMjl5Y0M0Z1lua2djbVZtTGlBb2JHbHRhWFJ6SUd4cApZV0l1S1RFbE1DTUdBMVVFQ3hNY0tHTXBJREU1T1RrZ1JXNTBjblZ6ZEM1dVpYUWdUR2x0YVhSbFpERXpNREVHCkExVUVBeE1xUlc1MGNuVnpkQzV1WlhRZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGtnS0RJd05EZ3AKTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFyVTFMcVJLR3N1cWpJQWNWRm1RcQpLMHZSdnd0S1RZN3RnSGFsWjdkNFFNQnpRc2hvd050VEs5MWV1SGFZTlpPTEdwMThFem9PSDF1M0hzL2xKQlFlCnNZR3BqWDI0ekd0TEEvRUNETnlycFVBa0FIOTBsS0dkQ0NtemlBdjFoM2VkVmMza3czN1hhbVNyaFJTR2xWdVgKTWxCdlBjaTZaZ3pqL0wyNFNjRjJpVWtaL2NDb3ZZbWpaeS9Hbjd4eEdXQzRMZWtzeVpCMlpudVU0cTk0MW1WVApYVHpXbkxMUEtRUDVMNlJRc3RSSXpnVXlWWXI5c21STUR1U1lCM1hiZjkrNUNGVmdoVEFwK1h0SXBHbUc0elUvCkhvWmRlbm9WdmU4QWpoVWlWQmNBa0NhVHZBNUphSkcvK0VmVG5aVkN3UTVOMzI4bXo4TVlJV0ptUTNEVzFjQUgKNFFJREFRQUJvMEl3UURBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVgpIUTRFRmdRVVZlU0IwUkdBdnRpSnVRaWpNZm1oSkFrV3VYQXdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBRHViCmoxYWJNT2RUbVh4NmVhZE5sOWNabFpEN0JoL0tNM3hHWTQrV1ppVDZRQnNoSjhybWNuUHlULzR4bWYzSURFeG8KVThhQWdoT1krcmF0MmwwOThjNXU5aFVSbElJTTdqK1ZyeEdyRDljdjNoOERqMWNzSHNtN21ocEVsZXNZVDZZZgp6WDFYRUMrYkJBbGFoTFZ1MkIwNjRkYWUwV3g1WG5rY0ZNWGowRXlUTzJVODdkODl2cWJsbFJyRHRSbkR2VjViCnUvOGo3MmdaeXhLVEoxd0RMVzh3MEI2MkdxemVXdmZScXFnbnB2NTVnY1I1bVROWHVoS3dxZUJDYkpQS1Z0NysKYllRTENJdCtqZXJYbUNIRzgrYzhlUzllbk5GTUZZM2g3Q0kzekpwREM1ZmNnSkNOczJlYmIwZ0lGVmJQdi9FcgpmRjZhZHVsWmtNVjhnelVSWlZFPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QmFsdGltb3JlIEN5YmVyVHJ1c3QgUm9vdCBPPUJhbHRpbW9yZSBPVT1DeWJlclRydXN0CiMgU3ViamVjdDogQ049QmFsdGltb3JlIEN5YmVyVHJ1c3QgUm9vdCBPPUJhbHRpbW9yZSBPVT1DeWJlclRydXN0CiMgTGFiZWw6ICJCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290IgojIFNlcmlhbDogMzM1NTQ2MTcKIyBNRDUgRmluZ2VycHJpbnQ6IGFjOmI2Ojk0OmE1OjljOjE3OmUwOmQ3OjkxOjUyOjliOmIxOjk3OjA2OmE2OmU0CiMgU0hBMSBGaW5nZXJwcmludDogZDQ6ZGU6MjA6ZDA6NWU6NjY6ZmM6NTM6ZmU6MWE6NTA6ODg6MmM6Nzg6ZGI6Mjg6NTI6Y2E6ZTQ6NzQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDE2OmFmOjU3OmE5OmY2Ojc2OmIwOmFiOjEyOjYwOjk1OmFhOjVlOmJhOmRlOmYyOjJhOmIzOjExOjE5OmQ2OjQ0OmFjOjk1OmNkOjRiOjkzOmRiOmYzOmYyOjZhOmViCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEZHpDQ0FsK2dBd0lCQWdJRUFnQUF1VEFOQmdrcWhraUc5dzBCQVFVRkFEQmFNUXN3Q1FZRFZRUUdFd0pKClJURVNNQkFHQTFVRUNoTUpRbUZzZEdsdGIzSmxNUk13RVFZRFZRUUxFd3BEZVdKbGNsUnlkWE4wTVNJd0lBWUQKVlFRREV4bENZV3gwYVcxdmNtVWdRM2xpWlhKVWNuVnpkQ0JTYjI5ME1CNFhEVEF3TURVeE1qRTRORFl3TUZvWApEVEkxTURVeE1qSXpOVGt3TUZvd1dqRUxNQWtHQTFVRUJoTUNTVVV4RWpBUUJnTlZCQW9UQ1VKaGJIUnBiVzl5ClpURVRNQkVHQTFVRUN4TUtRM2xpWlhKVWNuVnpkREVpTUNBR0ExVUVBeE1aUW1Gc2RHbHRiM0psSUVONVltVnkKVkhKMWMzUWdVbTl2ZERDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBS01FdXlLcgptRDFYNkNaeW1yVjUxQ25pNGVpVmdMR3c0MXVPS3ltYVpOK2hYZTJ3Q1FWdDJ5Z3V6bUtpWXY2MGlOb1M2empyCklaM0FRU3NCVW51SWQ5TWNqOGU2dVlpMWFnbm5jK2dSUUtmUnpNcGlqUzNsand1bVVOS29VTU1vNnZXckpZZUsKbXBZY3FXZTRQd3pWOS9sU0V5L0NHOVZ3Y1BDUHdCTEtCc3VhNGRuS00zcDMxdmpzdWZGb1JFSklFOUxBd3FTdQpYbUQrdHFZRi9MVGRCMWtDMUZrWW1HUDFwV1Bna0F4OVhiSUdldk9GNnV2VUE2NWVoRDVmL3hYdGFiejVPVFp5CmRjOTNVazN6eVpBc3VUM2x5U05UUHg4a21DRmNCNWtwdmNZNjdPZHVoanBybDNSak03MW9HREh3ZUkxMnYveWUKamwwcWhxZE5rTnduR2prQ0F3RUFBYU5GTUVNd0hRWURWUjBPQkJZRUZPV2RXVENDUjFqTXJQb0lWRGFHZXpxMQpCRTN3TUJJR0ExVWRFd0VCL3dRSU1BWUJBZjhDQVFNd0RnWURWUjBQQVFIL0JBUURBZ0VHTUEwR0NTcUdTSWIzCkRRRUJCUVVBQTRJQkFRQ0ZERjJPNUc5UmFFSUZvTjI3VHljbGhBTzk5MlQ5TGRjdzQ2UVFGK3ZhS1NtMmVUOTIKOWhrVEk3Z1FDdmxZcE5SaGNMMEVZV29TaWhmVkNyM0Z2REI4MXVrTUpZMkdRRS9zektOK09NWTNFVS90M1dneApqa3pTc3dGMDdyNTFYZ2RJR245dy94WmNoTUI1aGJnRi9YKytaUkdqRDhBQ3RQaFNOemtFMWFreGVoaS9vQ3IwCkVwbjNvMFdDNHp4ZTlaMmV0Y2llZkM3SXBKNU9DQlJMYmYxd2JXc2FZNzFrNWgrM3p2RHlueTY3RzdmeVVJaHoKa3NMaTR4YU5taklDcTQ0WTNla1FFZTUrTmF1UXJ6NHdsSHJRTXoyblpRLzEvSTZlWXM5SFJDd0JYYnNkdFRMUwpSOUk0THREK2dkd3lhaDYxN2p6Vi9PZUJIUm5ESkVMcVl6bXAKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3QgTz1BZGRUcnVzdCBBQiBPVT1BZGRUcnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yawojIFN1YmplY3Q6IENOPUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3QgTz1BZGRUcnVzdCBBQiBPVT1BZGRUcnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yawojIExhYmVsOiAiQWRkVHJ1c3QgRXh0ZXJuYWwgUm9vdCIKIyBTZXJpYWw6IDEKIyBNRDUgRmluZ2VycHJpbnQ6IDFkOjM1OjU0OjA0Ojg1Ojc4OmIwOjNmOjQyOjQyOjRkOmJmOjIwOjczOjBhOjNmCiMgU0hBMSBGaW5nZXJwcmludDogMDI6ZmE6ZjM6ZTI6OTE6NDM6NTQ6Njg6NjA6Nzg6NTc6Njk6NGQ6ZjU6ZTQ6NWI6Njg6ODU6MTg6NjgKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDY4OjdmOmE0OjUxOjM4OjIyOjc4OmZmOmYwOmM4OmIxOjFmOjhkOjQzOmQ1Ojc2OjY3OjFjOjZlOmIyOmJjOmVhOmI0OjEzOmZiOjgzOmQ5OjY1OmQwOjZkOjJmOmYyCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFTmpDQ0F4NmdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCdk1Rc3dDUVlEVlFRR0V3SlRSVEVVCk1CSUdBMVVFQ2hNTFFXUmtWSEoxYzNRZ1FVSXhKakFrQmdOVkJBc1RIVUZrWkZSeWRYTjBJRVY0ZEdWeWJtRnMKSUZSVVVDQk9aWFIzYjNKck1TSXdJQVlEVlFRREV4bEJaR1JVY25WemRDQkZlSFJsY201aGJDQkRRU0JTYjI5MApNQjRYRFRBd01EVXpNREV3TkRnek9Gb1hEVEl3TURVek1ERXdORGd6T0Zvd2J6RUxNQWtHQTFVRUJoTUNVMFV4CkZEQVNCZ05WQkFvVEMwRmtaRlJ5ZFhOMElFRkNNU1l3SkFZRFZRUUxFeDFCWkdSVWNuVnpkQ0JGZUhSbGNtNWgKYkNCVVZGQWdUbVYwZDI5eWF6RWlNQ0FHQTFVRUF4TVpRV1JrVkhKMWMzUWdSWGgwWlhKdVlXd2dRMEVnVW05dgpkRENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFMZjNHalBtOGdBRUxUbmdUbHZ0Ckg3eHNEODIxK2lPMnp0NmJFVE9YcENsTWZaT2Z2VXE4ayswREd1T1B6K1Z0VUZyV2x5bVVXb0N3U1hyYkxwWDkKdU1xL056Z3RIajZSUWExd1ZzZndUei9vTXA1MHlzaVFWT25HWHc5NG5acEFQQTZzWWFwZUZJK2VoNkZxVU56WAptazZ2QmJPbWNaU2NjYk5RWUFySEU1MDRCNFlDcU9tb2FTWVlrS3RNc0U4anF6cFBoTmpmenAvaGFXKzcxMExYCmEwVGt4NjN1YlVGZmNscHhDRGV6ZVdXa1dhQ1VOL2NBTHczQ2tuTGEwRGh5MnhTb1JjUmRLbjIzdE5iRTdxek4KRTBTM3lTdmRRd0FsK21HNWFXcFlJeEczcHpPUFZuVlo5YzBwMTBhM0NpdGx0dE5DYnhXeXVIdjc3K2xkVTlVMApXaWNDQXdFQUFhT0IzRENCMlRBZEJnTlZIUTRFRmdRVXJiMlllalMwSnZmNnhDWlU3d085NENUTFZCb3dDd1lEClZSMFBCQVFEQWdFR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d2daa0dBMVVkSXdTQmtUQ0Jqb0FVcmIyWWVqUzAKSnZmNnhDWlU3d085NENUTFZCcWhjNlJ4TUc4eEN6QUpCZ05WQkFZVEFsTkZNUlF3RWdZRFZRUUtFd3RCWkdSVQpjblZ6ZENCQlFqRW1NQ1FHQTFVRUN4TWRRV1JrVkhKMWMzUWdSWGgwWlhKdVlXd2dWRlJRSUU1bGRIZHZjbXN4CklqQWdCZ05WQkFNVEdVRmtaRlJ5ZFhOMElFVjRkR1Z5Ym1Gc0lFTkJJRkp2YjNTQ0FRRXdEUVlKS29aSWh2Y04KQVFFRkJRQURnZ0VCQUxDYjRJVWx3dFlqNGcrV0JwS2RRWmljMllSNWdka2VXeFFISXpabGo3RFlkN3VzUVd4SApZSU5Sc1BreVBlZjg5aVlUeDRBV3BiOWEvSWZQZUhtSklacmlUQWNLaGpXODh0NVJ4TktXdDl4K1R1NXcvUnc1CjZ3d0NVUlF0anIwVzRNSGZSblhuSkszczlFSzBoWk53RUdlNm5RWTFTaGpUSzNyTVVVS2hlbVBSNXJ1aHhTdkMKTnI0VERlYTlZMzU1ZTZjSkRVQ3JhdDJQaXNQMjlvd2FRZ1ZSMUVYMW42ZGlJV2dWSUVNOG1lZDh2U1RZcVpFWApjNGcvVmhzeE9CaTBjUSthemNnT25vNHVHK0dNbUlQTEh6SHhSRXpHQkhOSmRtQVB4L2k5RjRCckx1bk1UQTVhCm1ua1BJQW91MVo1akpoNVZrcFRZZ2hkYWU5Qzh4NDlPaGdRPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89RW50cnVzdCwgSW5jLiBPVT13d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVuY2UvKGMpIDIwMDYgRW50cnVzdCwgSW5jLgojIFN1YmplY3Q6IENOPUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPUVudHJ1c3QsIEluYy4gT1U9d3d3LmVudHJ1c3QubmV0L0NQUyBpcyBpbmNvcnBvcmF0ZWQgYnkgcmVmZXJlbmNlLyhjKSAyMDA2IEVudHJ1c3QsIEluYy4KIyBMYWJlbDogIkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSIKIyBTZXJpYWw6IDExNjQ2NjA4MjAKIyBNRDUgRmluZ2VycHJpbnQ6IGQ2OmE1OmMzOmVkOjVkOmRkOjNlOjAwOmMxOjNkOjg3OjkyOjFmOjFkOjNmOmU0CiMgU0hBMSBGaW5nZXJwcmludDogYjM6MWU6YjE6Yjc6NDA6ZTM6NmM6ODQ6MDI6ZGE6ZGM6Mzc6ZDQ6NGQ6ZjU6ZDQ6Njc6NDk6NTI6ZjkKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDczOmMxOjc2OjQzOjRmOjFiOmM2OmQ1OmFkOmY0OjViOjBlOjc2OmU3OjI3OjI4OjdjOjhkOmU1Ojc2OjE2OmMxOmU2OmU2OjE0OjFhOjJiOjJjOmJjOjdkOjhlOjRjCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFa1RDQ0EzbWdBd0lCQWdJRVJXdFFWREFOQmdrcWhraUc5dzBCQVFVRkFEQ0JzREVMTUFrR0ExVUVCaE1DClZWTXhGakFVQmdOVkJBb1REVVZ1ZEhKMWMzUXNJRWx1WXk0eE9UQTNCZ05WQkFzVE1IZDNkeTVsYm5SeWRYTjAKTG01bGRDOURVRk1nYVhNZ2FXNWpiM0p3YjNKaGRHVmtJR0o1SUhKbFptVnlaVzVqWlRFZk1CMEdBMVVFQ3hNVwpLR01wSURJd01EWWdSVzUwY25WemRDd2dTVzVqTGpFdE1Dc0dBMVVFQXhNa1JXNTBjblZ6ZENCU2IyOTBJRU5sCmNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNQjRYRFRBMk1URXlOekl3TWpNME1sb1hEVEkyTVRFeU56SXcKTlRNME1sb3dnYkF4Q3pBSkJnTlZCQVlUQWxWVE1SWXdGQVlEVlFRS0V3MUZiblJ5ZFhOMExDQkpibU11TVRrdwpOd1lEVlFRTEV6QjNkM2N1Wlc1MGNuVnpkQzV1WlhRdlExQlRJR2x6SUdsdVkyOXljRzl5WVhSbFpDQmllU0J5ClpXWmxjbVZ1WTJVeEh6QWRCZ05WQkFzVEZpaGpLU0F5TURBMklFVnVkSEoxYzNRc0lFbHVZeTR4TFRBckJnTlYKQkFNVEpFVnVkSEoxYzNRZ1VtOXZkQ0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQ0NBU0l3RFFZSgpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFMYVZ0a05DK3NadEttOUkzNVJNT1ZjRjdzTjVFVUZvCk51M3MvcG9CajZFNEtQejNFRVptTGswZUdyRWFUc2JSd0pXSXNNbi9NWXN6QTl1M2czcytJSVJlN2JKV0tLZjQKNExsQWNUZkZ5MGNPbHlwb3dDS1ZZaFhiUjluMTBDdi9na3ZKclQ3ZVROdVFnRkEvQ1lxRUFPd3dDajBZemZ2OQpLbG1hSTVVWExFV2VIMjVEZVcwTVhKaitTS2ZGSTBkY1h2MXU1eDYwOW1oRjBZYURXNktLamJIaktZRCtKWEdJCnJiNjhqNnhTbGt1cVVZM2tFekVaNkU1Tm45dXNzMnJWdkRsVWNjcDZlbitRM1gwZGdObUJ1MWttd2hIKzVwUGkKOTREa1pmczBOdzRwZ0hCTnJ6aUdMcDUvVjYrZUY2N3JITXNvSVYrMkhOam5vZ1FpK2RQYTJNc0NBd0VBQWFPQgpzRENCclRBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFyQmdOVkhSQUVKREFpCmdBOHlNREEyTVRFeU56SXdNak0wTWxxQkR6SXdNall4TVRJM01qQTFNelF5V2pBZkJnTlZIU01FR0RBV2dCUm8Ka09SbnBLWlRnTWVHWnFUeDkwdEQrNFM5YlRBZEJnTlZIUTRFRmdRVWFKRGtaNlNtVTRESGhtYWs4ZmRMUS91RQp2VzB3SFFZSktvWklodlo5QjBFQUJCQXdEaHNJVmpjdU1UbzBMakFEQWdTUU1BMEdDU3FHU0liM0RRRUJCUVVBCkE0SUJBUUNUMURDdzF3TWdLdEQ1WStpUkRBVWdxVjhaeW50eVR0U3gyOUNXKzFSYUdTd01DUGV5dklXb25YOXQKTzFLekt0dm4xSVNNWS9ZUHl5WUJrVkJzOUY4VTRwTjB3Qk9lTURwUTQ3Umd4Unp3SWtTTmNVZXN5QnJKNlp1YQpBR0FULzNCK1h4Rk5TUnV6RlZKN3lWVGF2NTJWcjJ1YTJKN3A4ZVJEamVJUlJEcS9yNzJEUW5OU2k2cTdweW5QCjlXUWNDazNSdktxc255clEvMzkvMm4zcXNlMHdKY0dFMmpUU1czaURWdXljTnNNbTRoSDJaMGtka3F1TSsrdi8KZXU2RlNxZFFnUENuWEVxVUxsOEZtVHhTUWVETnRHUFBBVU82bklQY2oyQTc4MXEwdEh1dTJndVFPSFh2Z1IxbQowdmRYY0RhenYvd29yM0VsaFZzVC9oNS9XclE4Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1HZW9UcnVzdCBHbG9iYWwgQ0EgTz1HZW9UcnVzdCBJbmMuCiMgU3ViamVjdDogQ049R2VvVHJ1c3QgR2xvYmFsIENBIE89R2VvVHJ1c3QgSW5jLgojIExhYmVsOiAiR2VvVHJ1c3QgR2xvYmFsIENBIgojIFNlcmlhbDogMTQ0NDcwCiMgTUQ1IEZpbmdlcnByaW50OiBmNzo3NTphYjoyOTpmYjo1MTo0ZTpiNzo3Nzo1ZTpmZjowNTozYzo5OTo4ZTpmNQojIFNIQTEgRmluZ2VycHJpbnQ6IGRlOjI4OmY0OmE0OmZmOmU1OmI5OjJmOmEzOmM1OjAzOmQxOmEzOjQ5OmE3OmY5Ojk2OjJhOjgyOjEyCiMgU0hBMjU2IEZpbmdlcnByaW50OiBmZjo4NTo2YToyZDoyNToxZDpjZDo4ODpkMzo2Njo1NjpmNDo1MDoxMjo2Nzo5ODpjZjphYjphYTpkZTo0MDo3OTo5Yzo3MjoyZDplNDpkMjpiNTpkYjozNjphNzozYQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFZEQ0NBanlnQXdJQkFnSURBalJXTUEwR0NTcUdTSWIzRFFFQkJRVUFNRUl4Q3pBSkJnTlZCQVlUQWxWVApNUll3RkFZRFZRUUtFdzFIWlc5VWNuVnpkQ0JKYm1NdU1Sc3dHUVlEVlFRREV4SkhaVzlVY25WemRDQkhiRzlpCllXd2dRMEV3SGhjTk1ESXdOVEl4TURRd01EQXdXaGNOTWpJd05USXhNRFF3TURBd1dqQkNNUXN3Q1FZRFZRUUcKRXdKVlV6RVdNQlFHQTFVRUNoTU5SMlZ2VkhKMWMzUWdTVzVqTGpFYk1Ca0dBMVVFQXhNU1IyVnZWSEoxYzNRZwpSMnh2WW1Gc0lFTkJNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQTJzd1lZekQ5CjlCY2pHbForVzk4OGJEamtjYmQ0a2RTOG9kaE0rS2hEdGdQcFRTRUhDSWphV0M5bU9TbTlCWGlMblRqb0JiZHEKZm5HazVzUmdwckR2Z09TSktBK2VKZGJ0Zy9PdHBwSEhtTWxDR0RVVW5hMllScEl1VDhyeGgwUEJGcFZYTFZEdgppUzJBZWxldDh1NWZhOUlBamJrVStCUVZOZG5BUnFON2NzaVJ2OGxWSzgzUWx6NmNKbVRNMzg2REdYSEtUdWJVCjFYdXBHYzFWM3NqczBsNDRVK1ZjVDR3dC9sQWpOdnhtNXN1T3BEa1pBTGVWQWptUkN3NytPQzdSSFFXYTlrMCsKYnc4SEhhOHNIbzlnT2VMNk5sTVRPZFJlSml2YlBhZ1V2VExyR0FNb1VnUng1YXN6UGVFNHV3YzJoR0tjZWVvVwpNUFJmd0N2b2NXdmsrUUlEQVFBQm8xTXdVVEFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlRBCmVwaG9qWW43cXdWa0RCRjlxbjFsdU1yTVRqQWZCZ05WSFNNRUdEQVdnQlRBZXBob2pZbjdxd1ZrREJGOXFuMWwKdU1yTVRqQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFOZU1wYXVVdlhWU09LVkNVbjVrYUZPU1BlQ3BpbEtJbgpaNTdRenhwZVIrbkJzcVRQM1VFYUJVNmJTKzVLYjFWU3N5U2hOd3JyWkhZcUxpenovVHQxa0wvNmNkakhQVGZTCnRRV1ZZcm1tM29rOU5uczRkMGlYcktZZ2p5Nm15UXpDc3BsRkFNZk9FVkVpSXVDbDZyWVZTQWxrNmw1UGRQY0YKUHNlS1VnemJGYlM5Ylp2bHhyRlVhS25qYVpDMm1xVVB1TGsvSUgydVNyVzRuT1FkdHF2bWxLWEJ4NE90Mi9VbgpodzRFYk5YLzNhQmQ3WWRTdHlzVkFxNDVwbXAwNmRyRTU3eE5OQjZwWEUwelg1SUpMNGhtWFhlWHh4MTJFNm5WCjVmRVdDUkUxMWF6YkpIRndMSmhXQzlrWHROSGpVU3RlZGVqVjBOeFBOTzNDQldhQW9jdm1Ndz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1HZW9UcnVzdCBVbml2ZXJzYWwgQ0EgTz1HZW9UcnVzdCBJbmMuCiMgU3ViamVjdDogQ049R2VvVHJ1c3QgVW5pdmVyc2FsIENBIE89R2VvVHJ1c3QgSW5jLgojIExhYmVsOiAiR2VvVHJ1c3QgVW5pdmVyc2FsIENBIgojIFNlcmlhbDogMQojIE1ENSBGaW5nZXJwcmludDogOTI6NjU6NTg6OGI6YTI6MWE6MzE6NzI6NzM6Njg6NWM6YjQ6YTU6N2E6MDc6NDgKIyBTSEExIEZpbmdlcnByaW50OiBlNjoyMTpmMzozNTo0Mzo3OTowNTo5YTo0Yjo2ODozMDo5ZDo4YToyZjo3NDoyMjoxNTo4NzplYzo3OQojIFNIQTI1NiBGaW5nZXJwcmludDogYTA6NDU6OWI6OWY6NjM6YjI6MjU6NTk6ZjU6ZmE6NWQ6NGM6NmQ6YjM6Zjk6Zjc6MmY6ZjE6OTM6NDI6MDM6MzU6Nzg6ZjA6NzM6YmY6MWQ6MWI6NDY6Y2I6Yjk6MTIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZhRENDQTFDZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRVUZBREJGTVFzd0NRWURWUVFHRXdKVlV6RVcKTUJRR0ExVUVDaE1OUjJWdlZISjFjM1FnU1c1akxqRWVNQndHQTFVRUF4TVZSMlZ2VkhKMWMzUWdWVzVwZG1WeQpjMkZzSUVOQk1CNFhEVEEwTURNd05EQTFNREF3TUZvWERUSTVNRE13TkRBMU1EQXdNRm93UlRFTE1Ba0dBMVVFCkJoTUNWVk14RmpBVUJnTlZCQW9URFVkbGIxUnlkWE4wSUVsdVl5NHhIakFjQmdOVkJBTVRGVWRsYjFSeWRYTjAKSUZWdWFYWmxjbk5oYkNCRFFUQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQUtZVgpWYUNqeHVBZmpKMGhVTmZCdml0YnRhU2VvZGx5V0wwQUcweS9ZY2tVSFVXQ3E4WWRnTlk5NnhDY09xOXRKUGk4CmNRR2VCdlY4WHg3QkRsWEtnNXBaTUs0Wnl6QklsZTBpTjQzMFNwcHlaajZ0bGNEZ0ZnRGdFQjhyTVE3WGxGVFQKUWpPZ05CMGVSWGJkVDhvWU4reUZGWG9aQ1B6Vng1enc4cWt1RUttUzVqMVlQYWtXYUR3dmRTRVlmeWgzcGVGaApGN2VtNmZnZW1kdHpidlFLb2lGczd0cXFoWkptci9aNmE0TGF1aUlJTlEvUFF2RTErbXJ1ZmlzbHpEb1I1RzJ2CmM3SjJIYTNRc25obkdxUTVIRkVMWjFhRC9UaGREYzdkOExzcmxoL2VlekpTL1IyN3RRYWhzaUZlcGRhVmFIL3cKbVo3Y1JRZys1OUlKRFRXVTNZQk9VNWZYdFFsRUlHUVdGd01DVEZNTmFON1ZxbkpOazIyQ0R0dWN2YyswODF4ZApWSHBwQ1piVzJ4SEJqWFdvdE04NXlNNDh2Q1I4NW1MSzRiMTlwNzFYWlF2ay9pWHR0bWtRM0NnYVJyMEJIZENYCnRlR1lPOEEzWk5ZOWxPNEw0ZlVvcmd0V3YzR0xJeWxCam9iRlMxSjcySEdySDRvVnBqdURXdGRZQVZIR1RFSFoKZjloQlozS2lLTjlnZzZtZXlIdjhVM055V2ZXVGVoZDJEczczNVZ6WkMxVTBvcXBidFdwVTV4UEtWK3lYYmZSZQpCaTlGaTFqVUl4YVM1Qlp1S0dOWk1OOVFBWnhqaVJxZjJ4ZVVnbkEzd3lTZW1rZldXc3BPcUdtSmNoK1JiTnQrCm5odXR4eDl6M1N4UEdXWDlmNU5BRUM3UzhPMDhuaTRvUG1rbU04VjdBZ01CQUFHall6QmhNQThHQTFVZEV3RUIKL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRk5xN0xxcXdETGlJSmxGMFhHMEQwOERZajNyV01COEdBMVVkSXdRWQpNQmFBRk5xN0xxcXdETGlJSmxGMFhHMEQwOERZajNyV01BNEdBMVVkRHdFQi93UUVBd0lCaGpBTkJna3Foa2lHCjl3MEJBUVVGQUFPQ0FnRUFNWGpteDdYZnVKUkF5WEhFcURYc1JoM0NoZk1vV0lhd0MveU9zam1QUkZXclpJUmMKYWFuUW1qZzgrdVVmTmVWRTQ0QjVsR2lrdThTZlBlRTB6VEJHaTFRcmxhWHY5eitaaFAwMTVzOHh4dHhxdjZmWApJd2pobUY3RFdnaDJxYWF2ZHkrM1lMMUVSbXJ2bC85emxjR082SlA3L1RHMzdGY1JFVVdiTVBFYWlEbkJUenluCkFOWEgvS3R0Z0NKd3BRemdYUVFwQXZ2TG9KSFJmTmJEZmxEVm5WaStRVGpydVhVOEZkbWJ5VXFEV2NEYVUvMHoKdXpZWW00VVBGZDN1TGF4Mms3blpBWTFJRUtqNzlUaUc4ZHNLeHIyRW95TkIzdFozYjRYVWhSeFE0SzVSaXJxTgpQbmJpdWNvbjhsK2Y3MjVaRFFiWUt4ZWswbnhydTE4VUdraVBHa3puczBjY2preEZLeUR1U04vbjNRbU9HS2phClFJMlNKaEZUWVhOZDY3M254RTBwTjJIcnJEa3RaeTRXMXZVQWc0V2h6SDkyeEgza3QwdG03d05GWUdtMkRGS1cKa29SZXBxTzFwRDRyMmN6WUcwZXE4a1RhVC9rRDZQQVV5ei96Zzk3UXdWVGp0K2dLTjAyTElGa0RNQm1oTE1pOQpFUi9mcnNsS3hmTW5abWFHckdpUi85bm1VeHdQaTF4cFpRb215QjQwdzExUmU5ZXBuQWFoTnQzVmlaUzgyZVF0CkRGNEpiQWlYZktNOWZKUC9QNkVVcDgrMVhldmIyeHpFZHQrSXViMUZCWlVicnZ4R2FreXZTT1BPcmcvU2Z1dm0KYkp4UGdXcDZaS3k3UHRYbnkzWXV4YWRJd1Z5UUQ4dklQL3JtTXVHTkcyK2s1bzdZK1NsSWlzNXovaXc9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1HZW9UcnVzdCBVbml2ZXJzYWwgQ0EgMiBPPUdlb1RydXN0IEluYy4KIyBTdWJqZWN0OiBDTj1HZW9UcnVzdCBVbml2ZXJzYWwgQ0EgMiBPPUdlb1RydXN0IEluYy4KIyBMYWJlbDogIkdlb1RydXN0IFVuaXZlcnNhbCBDQSAyIgojIFNlcmlhbDogMQojIE1ENSBGaW5nZXJwcmludDogMzQ6ZmM6Yjg6ZDA6MzY6ZGI6OWU6MTQ6YjM6YzI6ZjI6ZGI6OGY6ZTQ6OTQ6YzcKIyBTSEExIEZpbmdlcnByaW50OiAzNzo5YToxOTo3Yjo0MTo4NTo0NTozNTowYzphNjowMzo2OTpmMzozYzoyZTphZjo0Nzo0ZjoyMDo3OQojIFNIQTI1NiBGaW5nZXJwcmludDogYTA6MjM6NGY6M2I6Yzg6NTI6N2M6YTU6NjI6OGU6ZWM6ODE6YWQ6NWQ6Njk6ODk6NWQ6YTU6Njg6MGQ6Yzk6MWQ6MWM6Yjg6NDc6N2Y6MzM6Zjg6Nzg6Yjk6NWI6MGIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZiRENDQTFTZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRVUZBREJITVFzd0NRWURWUVFHRXdKVlV6RVcKTUJRR0ExVUVDaE1OUjJWdlZISjFjM1FnU1c1akxqRWdNQjRHQTFVRUF4TVhSMlZ2VkhKMWMzUWdWVzVwZG1WeQpjMkZzSUVOQklESXdIaGNOTURRd016QTBNRFV3TURBd1doY05Namt3TXpBME1EVXdNREF3V2pCSE1Rc3dDUVlEClZRUUdFd0pWVXpFV01CUUdBMVVFQ2hNTlIyVnZWSEoxYzNRZ1NXNWpMakVnTUI0R0ExVUVBeE1YUjJWdlZISjEKYzNRZ1ZXNXBkbVZ5YzJGc0lFTkJJREl3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQwpBUUN6VkZMQnlUN3kyZHl4VXhwWktlZXh3MFVvNWRmUjdjWEZTNkdxZEh0WHIwb20vTmoxWHFkdUdkdDBERTgxCld6SUxBZVBiNjNwM05lcXFXdURXNktGWGxQQ1FvM1JXbEVRd0F4NWNUaXVGSm5TQ2VneDJvRzlOemtFdG9CVUcKRkYrM1FzMTdqMWhoTk53cUNQa3V3d0dtSWtRY1RBZUM1bHZPMEVwOEJOTVpjeWZ3cXBoL0xxOU82NGNlSkhkcQpYYmJvVzBXNjNNT2hCVzlXam84UUpxVkp3eTdYUVljaTRFK0d5bUMxNnFGandBR1hFSG05QUR3U2JTc1ZzYXhMCnNlNFl1VTZXM054Mi96dSt6MThEd1B3NzZMNUdHLy9hUU1KUzkvN2pPdmRxZHpYUTJvM3JYaGhxTWNjZXVqd2IKS05aclZNYXFXOWVpTEJzWnpLSUM5cHRadlRkcmhyVnRncnJZNnNsV3ZLazJXUDArR2ZQdERDYXBremo0VDhGZApJZ2JRbCtyaHJjWlY0SUVyS0lNNit2UjdJVkVBdmxJNHpzMW1lYWowZ1ZiaTBJTUpSMUZiVUdyUDIwZ2FYVDczCnkvWmw5Mnp4bGZnQ096Sldnamw2VzcwdmlSdS9vYlRvLzMrTmpOOEQ4V0JPV0JGTTY2TS9FQ3VEbWdGejJaUnQKaEFBblpxendjRUFKUXBLdFQ1TU5ZUWxSSk5pUzFRdVVZYktIc3UzL21qWC9oVlRLN1VSRHJCczhGbXRJU2dvYwpRSWdma3NJTEFBWC84c2dDU3FTcXFjeVpscHd2V09COTRiNjdCOXhmQkhKY01UVEQ3Rjh0NEQxa2tDTG0wZXk0Ckx0MVpydG1oTjc5VU5keHpNaytNQkI0enNzbEc4ZGhjeUZWUXlXaTlxTG8yQ1FJREFRQUJvMk13WVRBUEJnTlYKSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCUjI4MVhoK3FRMisvQ2ZYR0p4N1R6MFJ6Z1FLekFmQmdOVgpIU01FR0RBV2dCUjI4MVhoK3FRMisvQ2ZYR0p4N1R6MFJ6Z1FLekFPQmdOVkhROEJBZjhFQkFNQ0FZWXdEUVlKCktvWklodmNOQVFFRkJRQURnZ0lCQUdiQnhpUHoyZUF1Ymwvb3o2NndzQ1ZOSy9nN1dKdEFKRGRheTZzV1NmK3oKZFhrem9TOXRjQmMwa2Y1bmZvL3NtK1ZlZ3FsVkh5L2MxRkVIRXY2c0ZqNHNOY1pqL053UTZ3MmpxdEI4ek5IUQpMMUV1eEJSYTN1Z1o0VDdHektRcDV5NkVxZ1l3ZUhaVWN5aVlXVGpnQUExaTAwSjlJWit1UFRxTTFmcDNEUmdyCkZnNWZOdUg4S3JVd0pNL2dZd3g3V0JyK21icENFckdSOUh4bzRzam9yeXpxeVg2dXV5bzlEUlhjTkpXMkdIU28KYWcvSHRQUVR4T1JiN1FyU3BKZE1LdTB2YkJLSlBmRW5jS3BxQTFJaG4wQ29aMUR5ODFvZjM5OGo5dHg0VHVhWQpUMVU2VStQdjh2U2Z4M3pZV0s4cElwZTQ0TDJSTHJCMjdGY1J6KzhwUlBQcGhYcGdZK1JkTTRrWDJUR3EydGJ6CkdEVnl6NGNyTDJNamhGMkVqRDlYb0lqOG1aRW9KbW1aMUkrWFJMNk8xVWl4cENncDhSVzA0ZVdlM2ZpUHBtOG0KMXdrOE9od1JEcVpzTi9ldFJJY3NLTWZZZElLejBHOUtWN3MxS1NlZ2krZ2hwNGRrTmwzTTJCYXN4N0luUUpKVgpPQ2lOVVc3ZEZHZFRiSEZjSm9STmRWcTJmbUJXcVUydCs1c2VsL01OMmRLWFZIZmFQUkszNEI3dkNBYXMrWVdICjZhTGNyMzRZRW9QOVZoZEJMdFVwZ24yWjlESDJjYW5QTEFFbnBRVzVxckpJVGlydm41TlNVWlU4VW5PT1Zrd1gKUU1BSktPU0xha2hUMit6TlZWWHh4dmpwb2l4TXB0RW1YMzZ2V2t6YUg2YnlIQ3grcmdJVzBsYlFMMWRUUitpUwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VmlzYSBlQ29tbWVyY2UgUm9vdCBPPVZJU0EgT1U9VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24KIyBTdWJqZWN0OiBDTj1WaXNhIGVDb21tZXJjZSBSb290IE89VklTQSBPVT1WaXNhIEludGVybmF0aW9uYWwgU2VydmljZSBBc3NvY2lhdGlvbgojIExhYmVsOiAiVmlzYSBlQ29tbWVyY2UgUm9vdCIKIyBTZXJpYWw6IDI1OTUyMTgwNzc2Mjg1ODM2MDQ4MDI0ODkwMjQxNTA1NTY1Nzk0CiMgTUQ1IEZpbmdlcnByaW50OiBmYzoxMTpiODpkODowODo5MzozMDowMDo2ZDoyMzpmOTo3ZTplYjo1MjoxZTowMgojIFNIQTEgRmluZ2VycHJpbnQ6IDcwOjE3OjliOjg2OjhjOjAwOmE0OmZhOjYwOjkxOjUyOjIyOjNmOjlmOjNlOjMyOmJkOmUwOjA1OjYyCiMgU0hBMjU2IEZpbmdlcnByaW50OiA2OTpmYTpjOTpiZDo1NTpmYjowYTpjNzo4ZDo1MzpiYjplZTo1YzpmMTpkNTo5Nzo5ODo5ZjpkMDphYTphYjoyMDphMjo1MTo1MTpiZDpmMTo3MzozZTplNzpkMToyMgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRG9qQ0NBb3FnQXdJQkFnSVFFNFkxVFIwL0J2TEIrV1VGMVpBY1lqQU5CZ2txaGtpRzl3MEJBUVVGQURCcgpNUXN3Q1FZRFZRUUdFd0pWVXpFTk1Bc0dBMVVFQ2hNRVZrbFRRVEV2TUMwR0ExVUVDeE1tVm1sellTQkpiblJsCmNtNWhkR2x2Ym1Gc0lGTmxjblpwWTJVZ1FYTnpiMk5wWVhScGIyNHhIREFhQmdOVkJBTVRFMVpwYzJFZ1pVTnYKYlcxbGNtTmxJRkp2YjNRd0hoY05NREl3TmpJMk1ESXhPRE0yV2hjTk1qSXdOakkwTURBeE5qRXlXakJyTVFzdwpDUVlEVlFRR0V3SlZVekVOTUFzR0ExVUVDaE1FVmtsVFFURXZNQzBHQTFVRUN4TW1WbWx6WVNCSmJuUmxjbTVoCmRHbHZibUZzSUZObGNuWnBZMlVnUVhOemIyTnBZWFJwYjI0eEhEQWFCZ05WQkFNVEUxWnBjMkVnWlVOdmJXMWwKY21ObElGSnZiM1F3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3ZWOTVXSG02aAoybUN4bENmTEY5c0hQNENGVDhpY3R0RDBiMC9QbWRqaDI4SklYRHFzT1RQSEgycUxKajByTmZWSXNaSEJBazRFCmxwRjdzRFB3c1JST0VXKzFRSzhiUmFWSzczNjJyUEtnSDFnL0VrWmdQSTJoNEgzUFZ6NHpIdnRIOGFvVmx3ZFYKWnFXMUxTN1lnRm15cHcyM1J1d2hZLzgxcTZVQ3p5cjBUUDU3OVpSZGhFMm84bUNQMnc0bFBKOXpjYytVMzBycQoyOTl5T0l6emxyM3hGN3pTdWp0RldzYW45c1lYaXdHZC9CbW9Lb01XdURwSS9rNCtvS3NHR2VsVDg0QVRCKzB0CnZ6OEtQRlVnT1N3c0FHbDBsVXE4SUxLcGVlVVlpWkdvM0J4Tjc3dCtOd3RkL2ptbGlGS01BR3pzR0h4QnZmYUwKZFhlNllKMkU1LzR0QWdNQkFBR2pRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRRApBZ0VHTUIwR0ExVWREZ1FXQkJRVk9JTVBQeXcvY0RNZXpVYitCNHdnNE5mRHR6QU5CZ2txaGtpRzl3MEJBUVVGCkFBT0NBUUVBWC9GQmZYeGNDTGtyNE5XU1IvcG5YS1VUd3dNaG15dE1pVWJQV1UzSi9xVkF0bVBOM1hFb2xXY1IKekNTczAwUnNjYTRCSUdzRG9vOFl0eWs2ZmVVV1lGTjRQTUN2RllQM2oxSXpKTDFrazVmdWkvZmJHS2h0Y2JQMwpMQmZRZENWcDkvNXJQSlMrVFV0QmpFN2ljOURqa0NKelE4M3o3K3B6emtXS3NLWkovMHg5blhHSXhIWWRrRnNkCjd2M005Kzc5WUtXeGVoWngwUmJRZkJJOGJHbVgyNjVmT1pwd0x3VThHVVlFbVNBMjBHQnVZUWE3RmtLTWNQY3cKKytEYlpxTUFBYjNtTE5xUlg2QkdpMDFxbkQwOTNRVkcvbmEvb0FvODVBRG1KN2YvaEMzZXVpSW5saEJ4NnlMdAozOTh6bk0vanJhNk8xSTdtVDFHdkZwTGdYUFlIRHc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QUFBIENlcnRpZmljYXRlIFNlcnZpY2VzIE89Q29tb2RvIENBIExpbWl0ZWQKIyBTdWJqZWN0OiBDTj1BQUEgQ2VydGlmaWNhdGUgU2VydmljZXMgTz1Db21vZG8gQ0EgTGltaXRlZAojIExhYmVsOiAiQ29tb2RvIEFBQSBTZXJ2aWNlcyByb290IgojIFNlcmlhbDogMQojIE1ENSBGaW5nZXJwcmludDogNDk6Nzk6MDQ6YjA6ZWI6ODc6MTk6YWM6NDc6YjA6YmM6MTE6NTE6OWI6NzQ6ZDAKIyBTSEExIEZpbmdlcnByaW50OiBkMTplYjoyMzphNDo2ZDoxNzpkNjo4ZjpkOToyNTo2NDpjMjpmMTpmMTo2MDoxNzo2NDpkODplMzo0OQojIFNIQTI1NiBGaW5nZXJwcmludDogZDc6YTc6YTA6ZmI6NWQ6N2U6Mjc6MzE6ZDc6NzE6ZTk6NDg6NGU6YmM6ZGU6Zjc6MWQ6NWY6MGM6M2U6MGE6Mjk6NDg6Nzg6MmI6Yzg6M2U6ZTA6ZWE6Njk6OWU6ZjQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVNakNDQXhxZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRVUZBREI3TVFzd0NRWURWUVFHRXdKSFFqRWIKTUJrR0ExVUVDQXdTUjNKbFlYUmxjaUJOWVc1amFHVnpkR1Z5TVJBd0RnWURWUVFIREFkVFlXeG1iM0prTVJvdwpHQVlEVlFRS0RCRkRiMjF2Wkc4Z1EwRWdUR2x0YVhSbFpERWhNQjhHQTFVRUF3d1lRVUZCSUVObGNuUnBabWxqCllYUmxJRk5sY25acFkyVnpNQjRYRFRBME1ERXdNVEF3TURBd01Gb1hEVEk0TVRJek1USXpOVGsxT1Zvd2V6RUwKTUFrR0ExVUVCaE1DUjBJeEd6QVpCZ05WQkFnTUVrZHlaV0YwWlhJZ1RXRnVZMmhsYzNSbGNqRVFNQTRHQTFVRQpCd3dIVTJGc1ptOXlaREVhTUJnR0ExVUVDZ3dSUTI5dGIyUnZJRU5CSUV4cGJXbDBaV1F4SVRBZkJnTlZCQU1NCkdFRkJRU0JEWlhKMGFXWnBZMkYwWlNCVFpYSjJhV05sY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVAKQURDQ0FRb0NnZ0VCQUw1QW5mUnU0ZXAyaHh4TlJVU092a2JJZ3dhZHdTcitHQitPNUFMNjg2dGRVSW9XTVF1YQpCdERGY0NMTlNTMVVZOHkyYm1oR0MxUHF5MHdrd0x4eVR1cnhGYTcwVkpvU0NzTjZzak5nNHRxSlZmTWlXUFBlCjNNL3ZnNGFpakpSUG4yanltSkJHaENmSGRyL2p6RFVzaTE0SFpHV0N3RWl3cUpINVlaOTJJRkNva2NkbXRldDQKWWdOVzhJb2FFK294b3g2Z21mMDQ5dlluTWxodkIvVnJ1UHNVSzYrM3FzeldZMTl6ak5vRm1hZzRxTXNYZURaUgpyT21lOUhnNmpjOFAyVUxpbUF5ckw1OE9BZDd2bjVsSjhTM2ZySFJORzVpMVI4WGxLZEg1a0JqSFlweStnOGNtCmV6NktKY2ZBM1ozbU5XZ1FJSjJQMk43U3c0U2NEVjdvTDhrQ0F3RUFBYU9Cd0RDQnZUQWRCZ05WSFE0RUZnUVUKb0JFS0l6Nlc4UWZzNHE4cDc0S2xmOUF3cExRd0RnWURWUjBQQVFIL0JBUURBZ0VHTUE4R0ExVWRFd0VCL3dRRgpNQU1CQWY4d2V3WURWUjBmQkhRd2NqQTRvRGFnTklZeWFIUjBjRG92TDJOeWJDNWpiMjF2Wkc5allTNWpiMjB2ClFVRkJRMlZ5ZEdsbWFXTmhkR1ZUWlhKMmFXTmxjeTVqY213d05xQTBvREtHTUdoMGRIQTZMeTlqY213dVkyOXQKYjJSdkxtNWxkQzlCUVVGRFpYSjBhV1pwWTJGMFpWTmxjblpwWTJWekxtTnliREFOQmdrcWhraUc5dzBCQVFVRgpBQU9DQVFFQUNGYjhBdkNiNlArayt0Wjd4a1NBemsvRXhmWUFXTXltdHJ3VVNXZ0VkdWptN2wzc0FnOWcxbzFRCkdFOG1UZ0hqNXJDbDdyKzhkRlJCdi8zOEVyakhUMXIwaVdBRmYyQzNCVXJ6OXZIQ3Y4UzVkSWEyTFgxcnpOTHoKUnQwdnh1QnF3OE0wQXl4OWx0MWF3ZzZuQ3BuQkJZdXJEQy96WERyUGJEZFZDWWZlVTBCc1dPLzh0cXRsYmdUMgpHOXc4NEZvVnhwN1o4VmxJTUNGbEEyenM2U0Z6N0pzRG9lQTNyYUFWR0kvNnVnTE9weXlwRUJNczFPVUlKcXNpCmwyRDRrRjUwMUtLYVU3M3lxV2pnb203QzEyeXhvdytldit0bzUxYnlydkxqS3pnNkNZRzFhNFhYdmkzdFB4cTMKc21QaTlXSXNndFJxQUVGUThUbURuNVhwTnBhWWJnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVF1b1ZhZGlzIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1RdW9WYWRpcyBMaW1pdGVkIE9VPVJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBTdWJqZWN0OiBDTj1RdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89UXVvVmFkaXMgTGltaXRlZCBPVT1Sb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgTGFiZWw6ICJRdW9WYWRpcyBSb290IENBIgojIFNlcmlhbDogOTg1MDI2Njk5CiMgTUQ1IEZpbmdlcnByaW50OiAyNzpkZTozNjpmZTo3MjpiNzowMDowMzowMDo5ZDpmNDpmMDoxZTo2YzowNDoyNAojIFNIQTEgRmluZ2VycHJpbnQ6IGRlOjNmOjQwOmJkOjUwOjkzOmQzOjliOjZjOjYwOmY2OmRhOmJjOjA3OjYyOjAxOjAwOjg5Ojc2OmM5CiMgU0hBMjU2IEZpbmdlcnByaW50OiBhNDo1ZTpkZTozYjpiYjpmMDo5Yzo4YTplMTo1Yzo3MjplZjpjMDo3Mjo2ODpkNjo5MzphMjoxYzo5OTo2ZjpkNToxZTo2NzpjYTowNzo5NDo2MDpmZDo2ZDo4ODo3MwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRjBEQ0NCTGlnQXdJQkFnSUVPclpRaXpBTkJna3Foa2lHOXcwQkFRVUZBREIvTVFzd0NRWURWUVFHRXdKQwpUVEVaTUJjR0ExVUVDaE1RVVhWdlZtRmthWE1nVEdsdGFYUmxaREVsTUNNR0ExVUVDeE1jVW05dmRDQkRaWEowCmFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVURXVNQ3dHQTFVRUF4TWxVWFZ2Vm1Ga2FYTWdVbTl2ZENCRFpYSjAKYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRBZUZ3MHdNVEF6TVRreE9ETXpNek5hRncweU1UQXpNVGN4T0RNegpNek5hTUg4eEN6QUpCZ05WQkFZVEFrSk5NUmt3RndZRFZRUUtFeEJSZFc5V1lXUnBjeUJNYVcxcGRHVmtNU1V3Ckl3WURWUVFMRXh4U2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1TNHdMQVlEVlFRREV5VlIKZFc5V1lXUnBjeUJTYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TUlJQklqQU5CZ2txaGtpRwo5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBdjJHMWxWTzZWL3o2OG1jTE9ocmZFWUJrbGJUUnZNMTZ6L1lwCmxpNGtWRUFrT1BjYWhkeFlUTXVrSjBLWDBKK0Rpc1BrQmdOYkFLVlJIbkFFZE9MQjFEcXIxNjA3QnhnRmp2MkQKck9wbTJSZ2JhSXIxVnhxWXV2WHRkajE4MmQ2VWFqdExGOEhWajcxbE9EcVYwRDFWTms3ZmVWY3hLaDdZV1dWSgpXQ0NZZnF0ZmZwL3AxazNzZzNTcHgyelk3aWxLaFNvR0ZQbFU1dFBhWlFlTFl6Y1MxOURzdzNzZ1FVU2o3Y3VnCkYrRnhaYzRkWmpIM2RnRVp5SDBEV0xhVlNSMm1FaWJveGd4MjRPTm15K3BkcGlidTVjeGZ2V2VuQVNjT29zcFUKeGJGNmxSMXhIa29waWdQY2FrWEJwQmxlYnpiTnc2S3d0LzVjT09KU3ZQaEVRK2FRdXdJREFRQUJvNElDVWpDQwpBazR3UFFZSUt3WUJCUVVIQVFFRU1UQXZNQzBHQ0NzR0FRVUZCekFCaGlGb2RIUndjem92TDI5amMzQXVjWFZ2CmRtRmthWE52Wm1aemFHOXlaUzVqYjIwd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pDQ0FSb0dBMVVkSUFTQ0FSRXcKZ2dFTk1JSUJDUVlKS3dZQkJBRytXQUFCTUlIN01JSFVCZ2dyQmdFRkJRY0NBakNCeHhxQnhGSmxiR2xoYm1ObApJRzl1SUhSb1pTQlJkVzlXWVdScGN5QlNiMjkwSUVObGNuUnBabWxqWVhSbElHSjVJR0Z1ZVNCd1lYSjBlU0JoCmMzTjFiV1Z6SUdGalkyVndkR0Z1WTJVZ2IyWWdkR2hsSUhSb1pXNGdZWEJ3YkdsallXSnNaU0J6ZEdGdVpHRnkKWkNCMFpYSnRjeUJoYm1RZ1kyOXVaR2wwYVc5dWN5QnZaaUIxYzJVc0lHTmxjblJwWm1sallYUnBiMjRnY0hKaApZM1JwWTJWekxDQmhibVFnZEdobElGRjFiMVpoWkdseklFTmxjblJwWm1sallYUmxJRkJ2YkdsamVTNHdJZ1lJCkt3WUJCUVVIQWdFV0ZtaDBkSEE2THk5M2QzY3VjWFZ2ZG1Ga2FYTXVZbTB3SFFZRFZSME9CQllFRkl0TGJlM1QKS2JrR0dldzVPYW53bDRScXkrL2ZNSUd1QmdOVkhTTUVnYVl3Z2FPQUZJdExiZTNUS2JrR0dldzVPYW53bDRScQp5Ky9mb1lHRXBJR0JNSDh4Q3pBSkJnTlZCQVlUQWtKTk1Sa3dGd1lEVlFRS0V4QlJkVzlXWVdScGN5Qk1hVzFwCmRHVmtNU1V3SXdZRFZRUUxFeHhTYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TVM0d0xBWUQKVlFRREV5VlJkVzlXWVdScGN5QlNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVnZ1E2dGxDTApNQTRHQTFVZER3RUIvd1FFQXdJQkJqQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFpdFFVdGY3MG1wS25HZFNrCmZuSVlqOWxvZkZJazNXZHZPWHJFcWw0OTRsaXdUWENZaEdIb0crTnBHQTdPKzBkUW9FNy84Q1FmdmJMTzlTZjgKN0M5VHFuTjdBejEwYnVZV251dWxMc1MvVmlkUUsySzZ2a3NjUEZWY1FSMGt2b0lnUjEzVlJINTZGbWpmZlUxUgpjSGhYSFRNZS9RS1puQXpOQ2dWUHg3dU9wSFg2U20yeGdJNEpWcm1jR21EK1hjSFhldHdSZU5EV1hjRzMxYTB5Cm1RTTZpc3hVSlRreGdYc1RJbEc2Um15aHU1NzZCR3hKSm5TUDBuUHJ6RENpNXVwWklvZjRsL1VPL2VyTWtxUVcKeEZJWTZpSE9zZkhtaElIbHVxbUdLUEpEV2wwU25hd2UyYWpsQ21xbmY2Q0hLYy95aVUzVTdNWGk1bnJRTmlPSwpTblEyK1E9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049UXVvVmFkaXMgUm9vdCBDQSAyIE89UXVvVmFkaXMgTGltaXRlZAojIFN1YmplY3Q6IENOPVF1b1ZhZGlzIFJvb3QgQ0EgMiBPPVF1b1ZhZGlzIExpbWl0ZWQKIyBMYWJlbDogIlF1b1ZhZGlzIFJvb3QgQ0EgMiIKIyBTZXJpYWw6IDEyODkKIyBNRDUgRmluZ2VycHJpbnQ6IDVlOjM5OjdiOmRkOmY4OmJhOmVjOjgyOmU5OmFjOjYyOmJhOjBjOjU0OjAwOjJiCiMgU0hBMSBGaW5nZXJwcmludDogY2E6M2E6ZmI6Y2Y6MTI6NDA6MzY6NGI6NDQ6YjI6MTY6MjA6ODg6ODA6NDg6Mzk6MTk6OTM6N2M6ZjcKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDg1OmEwOmRkOjdkOmQ3OjIwOmFkOmI3OmZmOjA1OmY4OjNkOjU0OjJiOjIwOjlkOmM3OmZmOjQ1OjI4OmY3OmQ2Ojc3OmIxOjgzOjg5OmZlOmE1OmU1OmM0OjllOjg2Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGdHpDQ0E1K2dBd0lCQWdJQ0JRa3dEUVlKS29aSWh2Y05BUUVGQlFBd1JURUxNQWtHQTFVRUJoTUNRazB4CkdUQVhCZ05WQkFvVEVGRjFiMVpoWkdseklFeHBiV2wwWldReEd6QVpCZ05WQkFNVEVsRjFiMVpoWkdseklGSnYKYjNRZ1EwRWdNakFlRncwd05qRXhNalF4T0RJM01EQmFGdzB6TVRFeE1qUXhPREl6TXpOYU1FVXhDekFKQmdOVgpCQVlUQWtKTk1Sa3dGd1lEVlFRS0V4QlJkVzlXWVdScGN5Qk1hVzFwZEdWa01Sc3dHUVlEVlFRREV4SlJkVzlXCllXUnBjeUJTYjI5MElFTkJJREl3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ2EKR01wTGxBMEFMYThES1lyd0Q0SElya3daaFIwSW42c3BSSVh6TDRHdE1oNlFScitqaGlZYUh2NStIQmc2WEp4ZwpGeW82ZElNek1IMWhWQkhMN2F2ZzV0S2lmdlZyYnhpM0Nnc3QvZWsrN3dyR3N4RHAzTUpHRi9oZC9hVGEvNTVKCldwem1NK1lrbHZjL3Vsc3JISG8xd3Rabi9xdG1VSXR0S0dBcjc5ZGd3OGVUdkkwMmtmTi8rTnNSRThTY2QzYkIKcnJjQ2FvRjZxVVdENGdYbXVWYkJsRGVQU0hGakl1d1haUWVWaWt2Zmo4WmFDdVd3NDE5ZWF4R3JEUG1GNjBUcAorQVJ6OHVuK1hKaU05WE92YTdSK3pkUmNBaXRNT2VHeWxaVXRRb2ZYMWJPUVE3ZHNFL0hlM2ZiRStJay8wWFgxCmtzT1IxWXFJMEpEczNHM2VpY0psY1phTERRUDluTDliRnF5UzIrcitlWHl0NjYvM0ZzdmJ6U1VyNVIvN21wL2kKVWN3NlV3eEk1ZzY5eWJSMkJsTG1FUk9GY21NREJPQUVOaXNnR1FMb2RLY2Z0c2xXWnZCMUpkeG53UTVoWUlpegpQdEdvL0tQYUhiRFJzU05VMzBSMmJlMUIyTUd5SXJaVEhOODFIZHloZHlveDVDMzE1ZVhieU9ELzVZRFhDMk9nCi96T2hEN29zRlJYcWw3UFNvclcrOG95V0hocVBIV3lrWVRlNWhuTXoxNWVXbmlOOWdxUk1nZUtoMGJwblg1VUgKb3ljUjdoWVFlN3hGU2t5eUJOS3I3OVg5REZIT1VHb0lNZm1SMmd5UFpGd0R3enFMSUQ5dWpXYzlPdGIrZlZ1SQp5Vjc3ekdIY2l6TjMwMFF5TlFsaUJKSVdFTmllSjBmN095SGorT3NkV3dJREFRQUJvNEd3TUlHdE1BOEdBMVVkCkV3RUIvd1FGTUFNQkFmOHdDd1lEVlIwUEJBUURBZ0VHTUIwR0ExVWREZ1FXQkJRYWhHSzhTRXd6SlFUVTd0RDIKQThRWlJ0R1VhekJ1QmdOVkhTTUVaekJsZ0JRYWhHSzhTRXd6SlFUVTd0RDJBOFFaUnRHVWE2RkpwRWN3UlRFTApNQWtHQTFVRUJoTUNRazB4R1RBWEJnTlZCQW9URUZGMWIxWmhaR2x6SUV4cGJXbDBaV1F4R3pBWkJnTlZCQU1UCkVsRjFiMVpoWkdseklGSnZiM1FnUTBFZ01vSUNCUWt3RFFZSktvWklodmNOQVFFRkJRQURnZ0lCQUQ0S0ZrMmYKQmx1b3JuRmRMd1V2WitZVFJZUEVOdmJ6d0NZTURiVkhaRjM0dEhMSlJxVURHQ2RWaVhoOWR1cVdOSUFYSU56bgpnL2lOL0FlNDJsOU5MbWV5aFAzWlJQeDNVSUhtZkxUSkRRdHlVL2gyQndkQlI1WU0rK0NDSnBOVmpQNGlIMkJsCmZGL25KclAzTXBDWVVOUTNjVlgya2lGNDk1VjUrdmd0Sm9kbVZqQjNwamQ0TTFJUVdLNC9ZWTd5YXJIdkdINUsKV1dQS2phSlcxYWN2dkZZZnp6bkI0dnNLcUJVc2ZVMTZZOFpzbDBRODBtL0RTaGNLK0pEU1Y2SVpVYVV0bDBIYQpCMCtwVU5xUWpaUkc0VDd3bFAwUUFEajFPK2hBNGJSdVZob2d6RzlZamUwdVJZL1c2Wk0vNTdFczN6cldJb3pjCmhMc2liOUQ0NU1ZNTZRU0lQTU82NjFWNmJZQ1pKUFZzQWZ2NGw3Q1VXK3Y5MG0veGQyZ05OV1FqckxoVm9RUFIKVFVJWjNQaDFXVmFqK2FoSmVmaXZEcmtSb0h5M2F1MDAwTFltWWpnYWh3ejQ2UDB1MDVCL0I1RXFIZForWElXRAptYkE0Q0QvcFh2azFCK1RKWW01WGY2ZFFsZmU2eUp2bWpxSUJ4ZFptdjNsaDh6d2M0Ym1DWEYyZ3crbllTTDBaCm9oRVVHVzZ5aGh0b1BrZzNHb2kzWFpaZW5NZnZKMklJNHBFWlhOTHhJZDI2RjBLQ2wzR0JVekdwbi9aOVlyOXkKNGFPVEhjeUtKbG9KT05ETzF3MkFGclI0cFRxSFRJMktwZFZHbC9Jc0VMbThWQ0xBQVZCcFE1NzBzdTl0K096YQo4ZU94NzkrUmoxUXFDeVhCSmhuRVVoQUZaZFdDRU9yQ01jMHUKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVF1b1ZhZGlzIFJvb3QgQ0EgMyBPPVF1b1ZhZGlzIExpbWl0ZWQKIyBTdWJqZWN0OiBDTj1RdW9WYWRpcyBSb290IENBIDMgTz1RdW9WYWRpcyBMaW1pdGVkCiMgTGFiZWw6ICJRdW9WYWRpcyBSb290IENBIDMiCiMgU2VyaWFsOiAxNDc4CiMgTUQ1IEZpbmdlcnByaW50OiAzMTo4NTozYzo2Mjo5NDo5Nzo2MzpiOTphYTpmZDo4OTo0ZTphZjo2ZjplMDpjZgojIFNIQTEgRmluZ2VycHJpbnQ6IDFmOjQ5OjE0OmY3OmQ4Ojc0Ojk1OjFkOmRkOmFlOjAyOmMwOmJlOmZkOjNhOjJkOjgyOjc1OjUxOjg1CiMgU0hBMjU2IEZpbmdlcnByaW50OiAxODpmMTpmYzo3ZjoyMDo1ZDpmODphZDpkZDplYjo3ZjplMDowNzpkZDo1NzplMzphZjozNzo1YTo5Yzo0ZDo4ZDo3Mzo1NDo2YjpmNDpmMTpmZTpkMTplMTo4ZDozNQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJR25UQ0NCSVdnQXdJQkFnSUNCY1l3RFFZSktvWklodmNOQVFFRkJRQXdSVEVMTUFrR0ExVUVCaE1DUWsweApHVEFYQmdOVkJBb1RFRkYxYjFaaFpHbHpJRXhwYldsMFpXUXhHekFaQmdOVkJBTVRFbEYxYjFaaFpHbHpJRkp2CmIzUWdRMEVnTXpBZUZ3MHdOakV4TWpReE9URXhNak5hRncwek1URXhNalF4T1RBMk5EUmFNRVV4Q3pBSkJnTlYKQkFZVEFrSk5NUmt3RndZRFZRUUtFeEJSZFc5V1lXUnBjeUJNYVcxcGRHVmtNUnN3R1FZRFZRUURFeEpSZFc5VwpZV1JwY3lCU2IyOTBJRU5CSURNd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUURNClYwSVdWSnptbU5QVFRlNys3Y2VmUXpsS1piUG9Gb2cwMncxWmtYVFBrcmdFUUswQ1N6R3J2STJSYU5nZ0Rob0IKNGhwN1RoZGQ0b3EzUDVrYXpldGhxOEpscGgrM3Q3MjNqL3o5Y0k4TG9HZStBYUpaejNIbUR5bDIvN0ZXZVVVcgpINTU2Vk9paktUVm9wQUZQRDZRdU4rOGJ2K09QRUtoeXExaFg1MVNHeU1uelc5b3MybDJPYmp5alB0cjdndVhkCjhseXlCVE52aWpiTzBCTk8vNzlLRERSTXBzTWh2VkFFVmV1eHU1MzdSUjVrRmQ1VkFZd0NkclhMb1Q5Q2Fid3YKdldoREZsYUpLamRoa2YybXJrN0F5eFJsbERkTGtnYnZCTkRJbklqYkMzdUJyN0U5S3NSbE9uaTI3dHlBc2RMVAptWnc2N210YWE3T050OVhPbk1LK3BVc3ZGckdlYURzR2I2NTluL2plN013cHA1aWpKVU12Ny9GZkp1R0lUZmhlCmJ0ZlpGRzRaTTJtbk80U0prOFJUVlJPaFVYaEErTGpKb3U1N3VsSkNnNTRVN1FWU1dsbFdwNWY4blQ4S0tkamMKVDVFT0U3emVsYVRmaTVtK3JKc3ppTysxZ2E4YnhpSlR5UGJIN3BjVXNNVjhlRkxJOE01dWQyQ0VwdWtxZGlEdApXQUVYTUpQcEdvdmdjMlBaYXBLVVNVNjByVXFGeEtNaU1Qd0o3V2dpYzZhSURGVWhXTVhoT3A4cTNjcmhrT0RaCmM2dHNnTGpvQzJTVG9KeU1HZit6MGd6c2tTYUhpck9pNFhDUExBcmx6VzFvVWV2YVB3Vi9pekxtRTF4ci9sOUEKNGlMSXRMUmtUOWE2ZlVnK3FHa00xN3VHY2NsenVEODduU1ZMMnY5QTZ3SURBUUFCbzRJQmxUQ0NBWkV3RHdZRApWUjBUQVFIL0JBVXdBd0VCL3pDQjRRWURWUjBnQklIWk1JSFdNSUhUQmdrckJnRUVBYjVZQUFNd2djVXdnWk1HCkNDc0dBUVVGQndJQ01JR0dHb0dEUVc1NUlIVnpaU0J2WmlCMGFHbHpJRU5sY25ScFptbGpZWFJsSUdOdmJuTjAKYVhSMWRHVnpJR0ZqWTJWd2RHRnVZMlVnYjJZZ2RHaGxJRkYxYjFaaFpHbHpJRkp2YjNRZ1EwRWdNeUJEWlhKMAphV1pwWTJGMFpTQlFiMnhwWTNrZ0x5QkRaWEowYVdacFkyRjBhVzl1SUZCeVlXTjBhV05sSUZOMFlYUmxiV1Z1CmRDNHdMUVlJS3dZQkJRVUhBZ0VXSVdoMGRIQTZMeTkzZDNjdWNYVnZkbUZrYVhObmJHOWlZV3d1WTI5dEwyTncKY3pBTEJnTlZIUThFQkFNQ0FRWXdIUVlEVlIwT0JCWUVGUExBRStDQ1F6Nzc3aTluTXBZMVhOdTR5d0xRTUc0RwpBMVVkSXdSbk1HV0FGUExBRStDQ1F6Nzc3aTluTXBZMVhOdTR5d0xRb1Vta1J6QkZNUXN3Q1FZRFZRUUdFd0pDClRURVpNQmNHQTFVRUNoTVFVWFZ2Vm1Ga2FYTWdUR2x0YVhSbFpERWJNQmtHQTFVRUF4TVNVWFZ2Vm1Ga2FYTWcKVW05dmRDQkRRU0F6Z2dJRnhqQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FnRUFUNjJnTEV6NndQSnY5MlpWcXlNMAo3dWNwMnNOYnRyQ0QyZERRNGlINzgyQ25PMTFnVXllaW0vWUlJaXJudjZCeTVad2thakd4a0hvbjI0UVJpU2VtCmQxbzQxNytzaHZ6dVhZTzhCc2JSZDJzUGJTUXZTM3BzcHdlV3l1T0VuNjJJaXgyckZvMWJaaGZaRnZTTGdOTGQKK0xKMncvdzRFNm9NM2tKcEsyN3pQT3VBSjl2MXBrUU5uMXBWV1F2VkRWSkl4YTZmOGkrQXhlb3lVRFVTbHk3Qgo0Zi94STRoUk9KL3labFoyNXc5Umw2VlNERTFKVVpVMlBiK2lTd3dRSFlhWlRLcnpjaEdUNU9yMm05cW9YYWROCnQ1NENybk1BeU5vakErajU2aGwwWWdDVXl5SWd2cFNuV2JXQ2FyNlplWHFwOGtva1V2ZDAvYnBPNXFnZEFtNngKRFlCRXdhN1RJemRmdTRWOEs1SXU2SDZsaTkyWjRiOG5ieTFkcW51SC9ncmRTL3lPOVNia2JuQkNialBzTVo1NwprOEhreVdrYVBjQnJUaUp0N3F0WVRjYlFRY0VyNms4U2gxN3JSZGhzOVpnQzA2RFlWWW9HbVJtaW9IZlJNSjZzCnpIWHVnL1d3WWpuUGJGZmlUTktSQ3c1MUtCdWF2LzBhUS9IS2QvczdqMkc0YVNnV1FnUmVjQ29jSWRpUDRiMGoKV3kxMFFKTFpZeGtOYzkxcHZHSkh2T0IwSzdMcmZiNUJHN1hBUnNXaElzdGZUc0Vva3Q0WXV0VXFLTHNSaXhlVAptSmxnbEZ3anoxb25sMTRMQlFhVE54NDdhVGJycVo1aEhZOHkybzRNMW5RK2V3a2syZ0YzUjhRN3pUU01tZlhLCjRTVmhNN0paRytKdTF6ZFh0ZzJwRXRvPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogTz1TRUNPTSBUcnVzdC5uZXQgT1U9U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0ExCiMgU3ViamVjdDogTz1TRUNPTSBUcnVzdC5uZXQgT1U9U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0ExCiMgTGFiZWw6ICJTZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3QgQ0EiCiMgU2VyaWFsOiAwCiMgTUQ1IEZpbmdlcnByaW50OiBmMTpiYzo2Mzo2YTo1NDplMDpiNToyNzpmNTpjZDplNzoxYTplMzo0ZDo2ZTo0YQojIFNIQTEgRmluZ2VycHJpbnQ6IDM2OmIxOjJiOjQ5OmY5OjgxOjllOmQ3OjRjOjllOmJjOjM4OjBmOmM2OjU2OjhmOjVkOmFjOmIyOmY3CiMgU0hBMjU2IEZpbmdlcnByaW50OiBlNzo1ZTo3MjplZDo5Zjo1NjowZTplYzo2ZTpiNDo4MDowMDo3MzphNDozZjpjMzphZDoxOToxOTo1YTozOToyMjo4MjowMTo3ODo5NTo5Nzo0YTo5OTowMjo2Yjo2YwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFdqQ0NBa0tnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFVRkFEQlFNUXN3Q1FZRFZRUUdFd0pLVURFWQpNQllHQTFVRUNoTVBVMFZEVDAwZ1ZISjFjM1F1Ym1WME1TY3dKUVlEVlFRTEV4NVRaV04xY21sMGVTQkRiMjF0CmRXNXBZMkYwYVc5dUlGSnZiM1JEUVRFd0hoY05NRE13T1RNd01EUXlNRFE1V2hjTk1qTXdPVE13TURReU1EUTUKV2pCUU1Rc3dDUVlEVlFRR0V3SktVREVZTUJZR0ExVUVDaE1QVTBWRFQwMGdWSEoxYzNRdWJtVjBNU2N3SlFZRApWUVFMRXg1VFpXTjFjbWwwZVNCRGIyMXRkVzVwWTJGMGFXOXVJRkp2YjNSRFFURXdnZ0VpTUEwR0NTcUdTSWIzCkRRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3pzLzUvMDIyeDd4WjhWNlVNYlhhS0wwdS9aUHRNN29ydzh5bDgKOWYvdUt1RHA2YnBiWkNLYW1tOHNPaVpwVVFXWkp0elZIR3B4eHBwOUhwM2RmR3pHakdkblNqNzRjYkFaSjZrSgpES2FWdjB1TURQcFZtRHZZNkNLaFMzRTRlYXlYa21temlYN3FJV2dHbUJTV2g5SmhOcnh0SjFhZVYrN0F3RmI5Ck1zK2syWTdDSTllTnFQUFlKYXlYNUhBNDlMWTZ0SjA3bHlaRG82RzhTVmx5VENNd2h3Rlk5azYrSEdoV1pxL04KUVYzSXMwMHFWVWFySDlvZTRrQTkyODE5dVpLQW5EZmRESlprbmR3aTkyU0wzMkhlRlpSU0ZhQjlVc2xMcUNISgp4ckh0eThPVllORVA4S3R3K04vTFRYN3MxdnFyMmIxL1ZQS2w2WG42MmRaMkpDaHpBZ01CQUFHalB6QTlNQjBHCkExVWREZ1FXQkJTZ2MwbVphTnlGVzJYam15Z3ZWNSs5TTd3SFNEQUxCZ05WSFE4RUJBTUNBUVl3RHdZRFZSMFQKQVFIL0JBVXdBd0VCL3pBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQWFFQ3BxTHZrVDExNXN3VzFGN05nRSt2RwprbDNnMGROcS92dSttMjIveHdWdFdTREVIUEMzMm9SWUFtUDZTQmJ2VDZVTDkwcVk4aitlRzYxSGEyUE9DRWZyClVqOTRuSzlOcnZqVlQ4K2FtQ29RUVRsU3hOM1ptdzd2a3dHdXNpN0thRUlrUW15d3N6byt6ZW5hU01RVnkrbjUKQncrU1VFbUszVEdYWDhucE42bzdXV1dYbERMSnM1OCtPbUpZeFVtdFlnNXhwVEtxTDhhSmRrTkFFeE5uUGFKVQpKUkRMOFRyeTJmcmJTVmE3cHY2blFUWEQ0SWhoeVlqSDN6WVFJcGhaNnJCSysxWVdjMjZzVGZjaW9VK3RIWG90ClJTZmxNTUZlOHRvVHl5VkNVWlZIQTR4c0ljeDBRdTFUL3pPTGp3OVhBUll2ejZidXlYQWlGTDM5dm13TEF3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVNvbmVyYSBDbGFzczIgQ0EgTz1Tb25lcmEKIyBTdWJqZWN0OiBDTj1Tb25lcmEgQ2xhc3MyIENBIE89U29uZXJhCiMgTGFiZWw6ICJTb25lcmEgQ2xhc3MgMiBSb290IENBIgojIFNlcmlhbDogMjkKIyBNRDUgRmluZ2VycHJpbnQ6IGEzOmVjOjc1OjBmOjJlOjg4OmRmOmZhOjQ4OjAxOjRlOjBiOjVjOjQ4OjZmOmZiCiMgU0hBMSBGaW5nZXJwcmludDogMzc6Zjc6NmQ6ZTY6MDc6N2M6OTA6YzU6YjE6M2U6OTM6MWE6Yjc6NDE6MTA6YjQ6ZjI6ZTQ6OWE6MjcKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDc5OjA4OmI0OjAzOjE0OmMxOjM4OjEwOjBiOjUxOjhkOjA3OjM1OjgwOjdmOmZiOmZjOmY4OjUxOjhhOjAwOjk1OjMzOjcxOjA1OmJhOjM4OjZiOjE1OjNkOmQ5OjI3Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlESURDQ0FnaWdBd0lCQWdJQkhUQU5CZ2txaGtpRzl3MEJBUVVGQURBNU1Rc3dDUVlEVlFRR0V3SkdTVEVQCk1BMEdBMVVFQ2hNR1UyOXVaWEpoTVJrd0Z3WURWUVFERXhCVGIyNWxjbUVnUTJ4aGMzTXlJRU5CTUI0WERUQXgKTURRd05qQTNNamswTUZvWERUSXhNRFF3TmpBM01qazBNRm93T1RFTE1Ba0dBMVVFQmhNQ1Jra3hEekFOQmdOVgpCQW9UQmxOdmJtVnlZVEVaTUJjR0ExVUVBeE1RVTI5dVpYSmhJRU5zWVhOek1pQkRRVENDQVNJd0RRWUpLb1pJCmh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBSkFYU2pXZHl2QU5sc2RFK2hZMy9FaTl2WCtBTFRVNzRXK28KWjZtL0F4eE5qRzh5UjlWQmFLUVRCTUUxREpxRVEveGNIZitKcytnWEdNMlJYL3VKNCtxL1RsMThHeWJUZFhudAo1b1RqVitXdEtjVDBPaWpucFh1RU5tbXovVjUydmFNdG1kT1FUaU1vZlJoajhWUTdKcDEyVzVkQ3N2K3U4RTdzCjNUbVZUb01HZitkSlFNakZBYkpVV21ZZFBmejU2VHdLbm9HNGNQQUJpK1FqVkh6SXJ2aVFIZ0NXY3RSVXoyRWoKdk9yN25RS1YwYmE1Y1RwcENEOFB0T0ZDeDRqMVA1aW9wN29jNEhGeDcxaFhnVkI2WEd0MFJnNkRBNWpEanFodQo4bll5YmllRHduUHozQmpvdEpQcWRVUnJCR0FnY1ZlSG5mTytvSkFqUFlvazRkb2gyOE1DQXdFQUFhTXpNREV3CkR3WURWUjBUQVFIL0JBVXdBd0VCL3pBUkJnTlZIUTRFQ2dRSVNxQ3FXSVRUWGp3d0N3WURWUjBQQkFRREFnRUcKTUEwR0NTcUdTSWIzRFFFQkJRVUFBNElCQVFCYXpvZjVGbklWVjBzZDJadm5vaVl3N0pObjM5WXQwalN2OXppbAp6cXNXdWFzdmZEWExyTkFQdEV3ci9JRHZhNHlSWHpaMjk5dXpHeG5xOUxJUi9XRnhSTDhvc3pvZHY3TkQ2SisvCjNERUljYkNkamRZMFJ6S1F4bVVrOTZCS2ZBUnpqemx2RjR4eXRiMUx5SHI0ZTRQREtFNmNDZXBuUDdKbkJCdkQKRk5yNDUwa2trZEFkYXZwaE9lOXI1eUYxQmdmWUVyUWhJSEJDY1lIYVBKbzJ2cVpiRFdwc21oK1JlL241NzBLNgpUazZlekF5TmxOelpSWnhlN0VKUVk2NzBYY1N4RXR6S082Z3VuUlJhQlhXMzdOZGo0cm8xdGdRSWtlamFuWnoyClpyVVlyQXFtVkNZME05SWJ3ZFIvR2pxT0M2b3lidHY4VHlXZjJUTEhsbHB3ck45TQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049WFJhbXAgR2xvYmFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89WFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jIE9VPXd3dy54cmFtcHNlY3VyaXR5LmNvbQojIFN1YmplY3Q6IENOPVhSYW1wIEdsb2JhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPVhSYW1wIFNlY3VyaXR5IFNlcnZpY2VzIEluYyBPVT13d3cueHJhbXBzZWN1cml0eS5jb20KIyBMYWJlbDogIlhSYW1wIEdsb2JhbCBDQSBSb290IgojIFNlcmlhbDogMTA3MTA4OTA4ODAzNjUxNTA5NjkyOTgwMTI0MjMzNzQ1MDE0OTU3CiMgTUQ1IEZpbmdlcnByaW50OiBhMTowYjo0NDpiMzpjYToxMDpkODowMDo2ZTo5ZDowZjpkODowZjo5MjowYTpkMQojIFNIQTEgRmluZ2VycHJpbnQ6IGI4OjAxOjg2OmQxOmViOjljOjg2OmE1OjQxOjA0OmNmOjMwOjU0OmYzOjRjOjUyOmI3OmU1OjU4OmM2CiMgU0hBMjU2IEZpbmdlcnByaW50OiBjZTpjZDpkYzo5MDo1MDo5OTpkODpkYTpkZjpjNTpiMTpkMjowOTpiNzozNzpjYjplMjpjMTo4YzpmYjoyYzoxMDpjMDpmZjowYjpjZjowZDozMjo4NjpmYzoxYTphMgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRU1EQ0NBeGlnQXdJQkFnSVFVSlJzN0JqcTFaeE4xWmZ2ZFkrZ3JUQU5CZ2txaGtpRzl3MEJBUVVGQURDQgpnakVMTUFrR0ExVUVCaE1DVlZNeEhqQWNCZ05WQkFzVEZYZDNkeTU0Y21GdGNITmxZM1Z5YVhSNUxtTnZiVEVrCk1DSUdBMVVFQ2hNYldGSmhiWEFnVTJWamRYSnBkSGtnVTJWeWRtbGpaWE1nU1c1ak1TMHdLd1lEVlFRREV5UlkKVW1GdGNDQkhiRzlpWVd3Z1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt3SGhjTk1EUXhNVEF4TVRjeApOREEwV2hjTk16VXdNVEF4TURVek56RTVXakNCZ2pFTE1Ba0dBMVVFQmhNQ1ZWTXhIakFjQmdOVkJBc1RGWGQzCmR5NTRjbUZ0Y0hObFkzVnlhWFI1TG1OdmJURWtNQ0lHQTFVRUNoTWJXRkpoYlhBZ1UyVmpkWEpwZEhrZ1UyVnkKZG1salpYTWdTVzVqTVMwd0t3WURWUVFERXlSWVVtRnRjQ0JIYkc5aVlXd2dRMlZ5ZEdsbWFXTmhkR2x2YmlCQgpkWFJvYjNKcGRIa3dnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDWUpCNjlGYlM2CjM4ZU1wU2UyT0F0cDg3Wk9xQ3d1SVIxY1JOOGhYWDRqZFA1ZWZyUkt0NmF0SDY3Z0JoYmltMXZaWjNSclhZQ1AKS1oyR0c5bWNEWmh0ZGhBb1dPUmxzSDlLbUhtZjRNTXhmb0FydFl6QVFEc1JodERMb29ZMllLVFZNSUp0Mlc3UQpEeElFTTVkZlQyRmE4T1Q1a2F2bkhUdTg2TS8wYXkwMGZPSklZUnlPODJGRXpHK2dTcW1Vc0UzYTU2azBlbkk0CnFFSE1QSlFSZmV2SXBveTNoc3ZLTXp2WlBUZUwrM28raGl6bmM5Y0tWNnhrbXhucjlBOEVDSXFzQXhjWlpQUmEKSlNLTk5DeXk5bWdkRW0zVGloNFUyc1NQcHVJamhkVjZEYjFxNE9uczdCZTdRaHRucWlYdFJZTWgvTUhKZk5WaQpQdnJ5eFMzVC9kUmxBZ01CQUFHamdaOHdnWnd3RXdZSkt3WUJCQUdDTnhRQ0JBWWVCQUJEQUVFd0N3WURWUjBQCkJBUURBZ0dHTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRk1aUG9qMEdZNFFKbk01aTVBU3MKalZ5MTZiWWJNRFlHQTFVZEh3UXZNQzB3SzZBcG9DZUdKV2gwZEhBNkx5OWpjbXd1ZUhKaGJYQnpaV04xY21sMAplUzVqYjIwdldFZERRUzVqY213d0VBWUpLd1lCQkFHQ054VUJCQU1DQVFFd0RRWUpLb1pJaHZjTkFRRUZCUUFECmdnRUJBSkVWT1FNQkcyZjdTaHo1Q21CYm9kcE5sMkw1SkZNbjE0SmtUcEF1dzBrYks1cmMvS2g0WnpYeEhmQVIKdmJkSTR4RDJEZDgvMHNtMnFsV2tTTG9DMjk1WkxoVmJPNTBXZlVmWE4rcGZUWFlTTnJzZjE2R0JCRVlnb3l4dApxWjRCZmo4cHpnQ1QzLzNKa25PSmlXU2U1eXZrSEpFczBybk9mYzV2TVpuVDVyN1NIcER3Q1JSNVhDT3JUZExhCklSOU5tWG1kNGM4bm54Q2JISWdOc0lwa1FURzREbXlRSktTYlhIR1B1cnQrSEJ2YmFvQVBJYnpwMjZhM1FQU3kKaTZteDVPK2FHdEE5YVpudXFDaWo0VHl6OExJUm5NOThRT2JkNTBOOW90ZzZ0YW1OOGpTWnhOUVE0UWI5Q1lRUQpPKzdFVFBUc0ozeEN3blI4Z29vSnliUURKYnc9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBPPVRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLiBPVT1HbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgU3ViamVjdDogTz1UaGUgR28gRGFkZHkgR3JvdXAsIEluYy4gT1U9R28gRGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIExhYmVsOiAiR28gRGFkZHkgQ2xhc3MgMiBDQSIKIyBTZXJpYWw6IDAKIyBNRDUgRmluZ2VycHJpbnQ6IDkxOmRlOjA2OjI1OmFiOmRhOmZkOjMyOjE3OjBjOmJiOjI1OjE3OjJhOjg0OjY3CiMgU0hBMSBGaW5nZXJwcmludDogMjc6OTY6YmE6ZTY6M2Y6MTg6MDE6ZTI6Nzc6MjY6MWI6YTA6ZDc6Nzc6NzA6MDI6OGY6MjA6ZWU6ZTQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGMzOjg0OjZiOmYyOjRiOjllOjkzOmNhOjY0OjI3OjRjOjBlOmM2OjdjOjFlOmNjOjVlOjAyOjRmOmZjOmFjOmQyOmQ3OjQwOjE5OjM1OjBlOjgxOmZlOjU0OjZhOmU0Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFQURDQ0F1aWdBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUVVGQURCak1Rc3dDUVlEVlFRR0V3SlZVekVoCk1COEdBMVVFQ2hNWVZHaGxJRWR2SUVSaFpHUjVJRWR5YjNWd0xDQkpibU11TVRFd0x3WURWUVFMRXloSGJ5QkUKWVdSa2VTQkRiR0Z6Y3lBeUlFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TUI0WERUQTBNRFl5T1RFMwpNRFl5TUZvWERUTTBNRFl5T1RFM01EWXlNRm93WXpFTE1Ba0dBMVVFQmhNQ1ZWTXhJVEFmQmdOVkJBb1RHRlJvClpTQkhieUJFWVdSa2VTQkhjbTkxY0N3Z1NXNWpMakV4TUM4R0ExVUVDeE1vUjI4Z1JHRmtaSGtnUTJ4aGMzTWcKTWlCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVENDQVNBd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFTgpBRENDQVFnQ2dnRUJBTjZkMStwWEdFbWhXK3ZYWDBpRzZyN2QvK1R2Wnh6MFpXaXpWM0dnWG5lNzdadEo2WENBClBWWVlZd2h2MnZMTTBEOS9BbFFpVkJEWXNvSFV3SFU5UzMvSGQ4TStlS3NhQTdVZ2F5OXFLN0hGaUg3RXV4NncKd2RoRkoyK3FOMWozaHliWDJDMzJxUmUzSDNJMlRxWVhQMldZa3RzcWJsMmkvb2pnQzk1LzVZMFY0ZXZMT3RYaQpFcUlUTGRpT3IxOFNQYUFJQlFpMlhLVmxPQVJGbVI2allHQjB4VUdsY21JYllzVWZiMThhUXI0Q1VXV29yaU1ZCmF2eDRBNmxOZjRERCtxdGEvS0ZBcE1vWkZ2Nnl5TzllY3czdWQ3MmE5bm1ZdkxFSFo2SVZEZDJnV01aRWV3bysKWWloZnVrRUhVMWpQRVg0NGRNWDQvN1Zwa0krRWRPcVhHNjhDQVFPamdjQXdnYjB3SFFZRFZSME9CQllFRk5MRQpzTktSMUV3UmNiTmh5ejJoL3Qyb2F0VGpNSUdOQmdOVkhTTUVnWVV3Z1lLQUZOTEVzTktSMUV3UmNiTmh5ejJoCi90Mm9hdFRqb1dla1pUQmpNUXN3Q1FZRFZRUUdFd0pWVXpFaE1COEdBMVVFQ2hNWVZHaGxJRWR2SUVSaFpHUjUKSUVkeWIzVndMQ0JKYm1NdU1URXdMd1lEVlFRTEV5aEhieUJFWVdSa2VTQkRiR0Z6Y3lBeUlFTmxjblJwWm1sagpZWFJwYjI0Z1FYVjBhRzl5YVhSNWdnRUFNQXdHQTFVZEV3UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUZCUUFECmdnRUJBREpMODdMS1BwSDhFc2FoQjR5T2Q2QXpCaFJja0I0WTl3aW1QUW9aK1llQUVXNXA1SllYTVA4MGtXTnkKT083TUhBR2pIWlFvcERIMmVzUlUxL2JsTVZnRG9zek9ZdHVVUlhPMXYwWEpKTFhWZ2dLdEkzbHBqYmkyVGM3UApUTW96SStnY2lLcWRpMEZ1RnNrZzVZbWV6VHZhY1BkK21TWWdGRlFscTI1emhlYWJJWjBLYklJT3FQakNEUG9RCkhteVc3NGNOeEE5aGk2M3VneXVWK0k2U2hISTU2eURxZysyRHpaZHVDTHpyVGlhMmN5dmswL1pNL2laeDRtRVIKZEVyL1Z4cUhEM1ZJTHM5UmFSZWdBaEpobGRYUlFMSVFUTzdFckJCRHBxV2VDdFdWWXBvTno0aUN4VElNNUN1ZgpSZVlObnlpY3Nia3FXbGV0TncrdkhYL2J2Wjg9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBPPVN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4gT1U9U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBTdWJqZWN0OiBPPVN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4gT1U9U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBMYWJlbDogIlN0YXJmaWVsZCBDbGFzcyAyIENBIgojIFNlcmlhbDogMAojIE1ENSBGaW5nZXJwcmludDogMzI6NGE6NGI6YmI6Yzg6NjM6Njk6OWI6YmU6NzQ6OWE6YzY6ZGQ6MWQ6NDY6MjQKIyBTSEExIEZpbmdlcnByaW50OiBhZDo3ZToxYzoyODpiMDo2NDplZjo4Zjo2MDowMzo0MDoyMDoxNDpjMzpkMDplMzozNzowZTpiNTo4YQojIFNIQTI1NiBGaW5nZXJwcmludDogMTQ6NjU6ZmE6MjA6NTM6OTc6Yjg6NzY6ZmE6YTY6ZjA6YTk6OTU6OGU6NTU6OTA6ZTQ6MGY6Y2M6N2Y6YWE6NGY6Yjc6YzI6Yzg6Njc6NzU6MjE6ZmI6NWY6YjY6NTgKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVEekNDQXZlZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRVUZBREJvTVFzd0NRWURWUVFHRXdKVlV6RWwKTUNNR0ExVUVDaE1jVTNSaGNtWnBaV3hrSUZSbFkyaHViMnh2WjJsbGN5d2dTVzVqTGpFeU1EQUdBMVVFQ3hNcApVM1JoY21acFpXeGtJRU5zWVhOeklESWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrd0hoY05NRFF3Ck5qSTVNVGN6T1RFMldoY05NelF3TmpJNU1UY3pPVEUyV2pCb01Rc3dDUVlEVlFRR0V3SlZVekVsTUNNR0ExVUUKQ2hNY1UzUmhjbVpwWld4a0lGUmxZMmh1YjJ4dloybGxjeXdnU1c1akxqRXlNREFHQTFVRUN4TXBVM1JoY21acApaV3hrSUVOc1lYTnpJRElnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa3dnZ0VnTUEwR0NTcUdTSWIzCkRRRUJBUVVBQTRJQkRRQXdnZ0VJQW9JQkFRQzNNc2orNlhHbUJJV3REQkZrMzg1Tjc4Z0RHSWMvb2F2N1BLYWYKOE1PaDJ0VFliaXRUa1Bza3BENkU4SjdvWCt6bEowVDFLS1kvZTk3Z0t2RElyMU12bnNvRkFaTWVqMlljT2FkTgorbHEyY3dRbFp1dDNmK2RaeGtxWkpSUlU2eWJIODM4WjFUQndqNit3UmlyL3Jlc3A3ZGVmcWdTSG85VDVpYVUwClg5dERrWUkyMldZOHNiaTVndjJjT2o0UXlEdnZCbVZtZXBzWkdEMy9jVkU4TUM1ZnZqMTNjN0pkQm16REkxYWEKSzRVbWtoeW5BclBrUHcydkNIbUN1RFk5NnB6VE5iTzhhY3Ixekozby9XU05GNEF6Ymw1S1habkpIb2UwblJyQQoxVzRUTlNOZTM1dGZQZS9XOTNiQzZqNjdlQTBjUW1kckJOajQxdHB2aS9KRW9BR3JBZ0VEbzRIRk1JSENNQjBHCkExVWREZ1FXQkJTL1g3ZlJ6dDBmaHZSYlZhemMxeERDRHFtSTV6Q0JrZ1lEVlIwakJJR0tNSUdIZ0JTL1g3ZlIKenQwZmh2UmJWYXpjMXhEQ0RxbUk1NkZzcEdvd2FERUxNQWtHQTFVRUJoTUNWVk14SlRBakJnTlZCQW9USEZOMApZWEptYVdWc1pDQlVaV05vYm05c2IyZHBaWE1zSUVsdVl5NHhNakF3QmdOVkJBc1RLVk4wWVhKbWFXVnNaQ0JECmJHRnpjeUF5SUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVnZ0VBTUF3R0ExVWRFd1FGTUFNQkFmOHcKRFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUFXZFA0aWQwY2thVmFHc2FmUHpXZHFiQVljYVQxZXBvWGtKS3R2MwpMN0llek1kZWF0aURoNkdYNzBrMVBuY0dRVmhpdjQ1WXVBcG5QK3l6M1NGbUg4bFUrbkxNUFV4QTJJR3ZkNTZECmVydWl4L1UwRjQ3WkVVRDAvQ3dxVFJWL3AySmRMaVhUQUFzZ0doMW8rUmU0OUwyTDdTaFozVTBXaXhlRHlMSmwKeHkxNnBhcThVNFp0M1Zla3l2Z2dRUXRvOFBUN2RMNVdYWHA1OWZrZGhlTXRsYjcxY1pCRHpJMGZtZ0FLaHlucApWU0pZQUNQcTR4SkRLVnRIQ04yTVFXcGxCcWpsSWFwQnRKVWhsYmw5MFRTckU5YXR2TnppUFRuTnZUNTFjS0VZCldRUEpJclNQbk5WZUt0ZWx0dFFLYmZpM1FCRkdtaDk1RG1LL0Q1ZnM0QzhmRjVRPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogTz1Hb3Zlcm5tZW50IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBTdWJqZWN0OiBPPUdvdmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIExhYmVsOiAiVGFpd2FuIEdSQ0EiCiMgU2VyaWFsOiA0MjAyMzA3MDgwNzcwODcyNDE1OTk5MTE0MDU1NjUyNzA2Njg3MAojIE1ENSBGaW5nZXJwcmludDogMzc6ODU6NDQ6NTM6MzI6NDU6MWY6MjA6ZjA6ZjM6OTU6ZTE6MjU6YzQ6NDM6NGUKIyBTSEExIEZpbmdlcnByaW50OiBmNDo4YjoxMTpiZjpkZTphYjpiZTo5NDo1NDoyMDo3MTplNjo0MTpkZTo2YjpiZTo4ODoyYjo0MDpiOQojIFNIQTI1NiBGaW5nZXJwcmludDogNzY6MDA6Mjk6NWU6ZWY6ZTg6NWI6OWU6MWY6ZDY6MjQ6ZGI6NzY6MDY6MmE6YWE6YWU6NTk6ODE6OGE6NTQ6ZDI6Nzc6NGM6ZDQ6YzA6YjI6YzA6MTE6MzE6ZTE6YjMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZjakNDQTFxZ0F3SUJBZ0lRSDUxWld0Y3Z3Z1pFcFlBSWFlTmU5akFOQmdrcWhraUc5dzBCQVFVRkFEQS8KTVFzd0NRWURWUVFHRXdKVVZ6RXdNQzRHQTFVRUNnd25SMjkyWlhKdWJXVnVkQ0JTYjI5MElFTmxjblJwWm1sagpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1CNFhEVEF5TVRJd05URXpNak16TTFvWERUTXlNVEl3TlRFek1qTXpNMW93ClB6RUxNQWtHQTFVRUJoTUNWRmN4TURBdUJnTlZCQW9NSjBkdmRtVnlibTFsYm5RZ1VtOXZkQ0JEWlhKMGFXWnAKWTJGMGFXOXVJRUYxZEdodmNtbDBlVENDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQgpBSm9sdU96TW9uV29lL2ZPVzFtS3lkR0dFZ2hVN0p6eTUwYjJpUE44NmFYZlRFYzJwQnNCSEg4ZVY0cU53OFhSCkllUGFKRDlJSy91ZkxxR1U1eXdjazlHL0d3R0hVNW5PcC9VS0lYWjMvNm0zeG5PVVQwYjNFRWszK3FoWlNWMXEKZ1FkVzhvcjVCdEQzY0NKTnRMZEJ1VEs0c2ZDeHc1dy9jUDFUM1lHcTJHTjQ5dGhUYnFHc2FvUWtjbFNHeHRLeQp5aHdPZVlIV3RYQmlDQUV1VGs4TzFSR3ZxYS9sbXIvY3pJZHRKdVRKVjZMN2x2bk00VDlUakd4TWZwdFRDQXRzCkYvdG55TUt0c2MyQXRKZmNkZ0VXRmVscTE2VGhlRWZPaHRYN01mUDZNYjQwcWlqN2NFd2RTY2V2TEoxdFpxYTIKaldSK3RTQnFuVHVCdG85QUFHZExpWWE0ekdYK0ZWUHBCTUhXWHgxRTF3b3ZKNXBHZmFFTmRhMVVoaFhjU1R2eApsczRQbTZEc28zcGR2dFVxZFVMbGU5Nmx0cXF2S0t5c2tLdzR0OVZvTlNaNjNQYzc4LzFGbTlHN1EzaHViL0ZDClZHcVk4QTJ0bCtsU1h1blZhbkxlYXZjYllCVDBwZVMyY1dlcUgrcmlUY0ZDUVA1blJoYzRMMGMvY1p5dTVTSEsKWVMxdEI2aUVmQzN1VVNYeFk1Q2UvZUZYaUd2dmlpTnRzZWE5UDYzUlBaWUxoWTNOYXllN3R3V2I3THVScVFvSApFZ0tYVGlDUThQOE5IdUpCTzlOQU91ZU5YZHBtNUFLd0IxS1lYQTZPTTV6Q3BwWDdWUmx1VEk2dVN3Kzl3VGhOClhvK0VIV2JOeFdDV3RGSmFCWW1PbFhxWXdaRThsU095RHZSNXRNbDh3VW9oQWdNQkFBR2phakJvTUIwR0ExVWQKRGdRV0JCVE16Ty9NS1dDa083R1N0ano2TW1LUHJDVVZPekFNQmdOVkhSTUVCVEFEQVFIL01Ea0dCR2NxQndBRQpNVEF2TUMwQ0FRQXdDUVlGS3c0REFob0ZBREFIQmdWbktnTUFBQVFVQTV2d0loUC9sU2cyMDl5ZXdETDdNVHFLClVXVXdEUVlKS29aSWh2Y05BUUVGQlFBRGdnSUJBRUNBU3ZvbXljNWVNTjFQaG5SMldQV3VzNE16ZUtSNmRCY1oKVHVsU3RibmdDblJpcW1qS2VLQk1tbzRzSXk3VmFoSWt2OVJvMDRyUTJKeWZ0QjhNM2poK1Z6ajhqZUpQWGd5ZgpxenZTLzNXWHk2VGpad2ovNWNBV3RVZ0JmZW41Q3Y4YjVXcHB2M2docU1Lbkk2bUdxM1pXNkE0TTloUGRLbWFLClpFazlHaGlIa0FTZlFsSzNUOHYrUjBGMk5lLy9BSFkyUlRLYnhrYUZYZUlrc0I3alNKYVlWMGVVVlhvUFFiRkUKSlBQQi9ocHJ2NGo5d2FiYWsyQmVnVXFaSUp4SVpobTFBSGxVRDdnc0wwdThxVjFiWUgrTWg2WGdVbU1xdnRnNwpoVUFWL2g2MlpUL0ZTOXArdFhvMUthTXVlcGhnSXFQMGZTZE9MZXEwZER6cEQ2UXpEeEFSdkJNQjF1VU8wNysxCkVxTGhSU1BBekFodVliZUpxNFBqSkI3bVhRZm5IeUErejJmSTU2d3diU2RMYUc1TEtsd0NDRFRiK0hia1o2TW0KbkQraU1zSkt4WUVZTVJCV3FvVHZMUXIvdUI5MzByK2xXS0JpNU5kTGtYV05pWUNZZm0zTFUwNWVyL2F5bDRXWAp1ZHBWQnJrazd0ZkdPQjVqR3hJN2xlRllyUExmaE5WZm1TOE5WVnZtT05zdVAzTHBTSVhMdXlrVGp4NDRWYm56CnNzUXdtU05PWGZKSW9SSU0zQktRQ1pCVWtRTThSK1hWeVdYZ3QwdDk3RWZUc3dzK3JaN1FkQUFPNjcxUnJjRGUKTE1ERGF2N3YzQXVuK2tiZllOdWNwbGxRZFNOcGM1T3krZndDMDBmbWNjNFFBdTRuaklUL3JFVU5FMXlETXVBbApwWVlzZlBRUwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IENBIE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBTdWJqZWN0OiBDTj1EaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIExhYmVsOiAiRGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IENBIgojIFNlcmlhbDogMTcxNTQ3MTc5MzQxMjA1ODc4NjIxNjc3OTQ5MTQwNzE0MjUwODEKIyBNRDUgRmluZ2VycHJpbnQ6IDg3OmNlOjBiOjdiOjJhOjBlOjQ5OjAwOmUxOjU4OjcxOjliOjM3OmE4OjkzOjcyCiMgU0hBMSBGaW5nZXJwcmludDogMDU6NjM6Yjg6NjM6MGQ6NjI6ZDc6NWE6YmI6Yzg6YWI6MWU6NGI6ZGY6YjU6YTg6OTk6YjI6NGQ6NDMKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDNlOjkwOjk5OmI1OjAxOjVlOjhmOjQ4OjZjOjAwOmJjOmVhOjlkOjExOjFlOmU3OjIxOmZhOmJhOjM1OjVhOjg5OmJjOmYxOmRmOjY5OjU2OjFlOjNkOmM2OjMyOjVjCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEdHpDQ0FwK2dBd0lCQWdJUURPZmc1UmZZUnY2UDVXRDhHL0F3T1RBTkJna3Foa2lHOXcwQkFRVUZBREJsCk1Rc3dDUVlEVlFRR0V3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjMKZDNjdVpHbG5hV05sY25RdVkyOXRNU1F3SWdZRFZRUURFeHRFYVdkcFEyVnlkQ0JCYzNOMWNtVmtJRWxFSUZKdgpiM1FnUTBFd0hoY05NRFl4TVRFd01EQXdNREF3V2hjTk16RXhNVEV3TURBd01EQXdXakJsTVFzd0NRWURWUVFHCkV3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjNkM2N1WkdsbmFXTmwKY25RdVkyOXRNU1F3SWdZRFZRUURFeHRFYVdkcFEyVnlkQ0JCYzNOMWNtVmtJRWxFSUZKdmIzUWdRMEV3Z2dFaQpNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUN0RGhYTzVFT0FYTEdIODdkZytYRVNwYTdjCkpwU0lxdlRPOVNBNUtGaGdEUGlBMnFrVmxUSmhQTFd4S0lTS2l0eWZDZ3lERjNxUGtLeUs1M2xUWERHRUt2WVAKbURJMmRzemUzVHlvb3U5cSt5SHlVbUhmbnlEWEgrS3gyZjRZWk5JU1cxLzVXQmcxdkVmTm9UYjVhMy9Vc0RnKwp3UnZEakRQWjJDOFkvaWdQczZlRDFzTnVSTUJoTlpZVy9sbWNpM1p0MS9HaVN3MHIvd3R5MnA1ZzBJNlFOY1o0ClZZY2dvYy9sYlFySVNYd3htRE5zSXVtSDBESmFvcm9UZ2hIdE9SZWRtVHB5b2ViNnBOblZGekYxcm9WOUlxNC8KQVVhRzlpaDV5TEhhNUZjWHhINGNEckMwa3FaV3M3MnlsKzJxcC9DM3hhZy9sUmJRLzZHVzZ3aGZHSGRQQWdNQgpBQUdqWXpCaE1BNEdBMVVkRHdFQi93UUVBd0lCaGpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXCkJCUkY2Nkt2OUpMTGdqRXRVWXVucHlHZDgyM0lEekFmQmdOVkhTTUVHREFXZ0JSRjY2S3Y5SkxMZ2pFdFVZdW4KcHlHZDgyM0lEekFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBb2c2ODMrTHQ4T055YzNwa2xMLzNjbWJZTXVSQwpkV0t1aCt2eTFkbmVWck9mek00VUtMa05sMkJjRWt4WTVOTTlnMGxGV0pjMWFScW9SK3BXeG5tckV0aG5nWVRmCmZ3azhsT2E0Sml3Z3ZUMnpLSW4zWC84aTRwZUVIK2xsNzRmZzM4Rm5TYk5kNjdJSkt1c203WGkrZlQ4cjg3Y20KTlcxZmlRRzJTVnVmQVFXYnF6MGx3Y3kyZjhMeGI0YkcrbVJvNjRFdGxPdEN0L3FNSHQxaThiNVFaN2RzdmZQeApIMnNNTmdjV2Z6ZDhxVnR0ZXZFU1JtQ0QxeWNFdmt2T2w3N0RaeXBvRWQrQTV3d3pacjhURFJSdTgzOGZZeEFlCitvMGJKVzFzajZXM1lRR3gwcU1tb1JCeG5hM2l3L25EbVZHM0t3Y0l6aTdtVUxLbitncEZMNkx3OGc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RGlnaUNlcnQgR2xvYmFsIFJvb3QgQ0EgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIFN1YmplY3Q6IENOPURpZ2lDZXJ0IEdsb2JhbCBSb290IENBIE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBMYWJlbDogIkRpZ2lDZXJ0IEdsb2JhbCBSb290IENBIgojIFNlcmlhbDogMTA5NDQ3MTk1OTg5NTIwNDAzNzQ5NTE4MzI5NjM3OTQ0NTQzNDYKIyBNRDUgRmluZ2VycHJpbnQ6IDc5OmU0OmE5Ojg0OjBkOjdkOjNhOjk2OmQ3OmMwOjRmOmUyOjQzOjRjOjg5OjJlCiMgU0hBMSBGaW5nZXJwcmludDogYTg6OTg6NWQ6M2E6NjU6ZTU6ZTU6YzQ6YjI6ZDc6ZDY6NmQ6NDA6YzY6ZGQ6MmY6YjE6OWM6NTQ6MzYKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDQzOjQ4OmEwOmU5OjQ0OjRjOjc4OmNiOjI2OjVlOjA1OjhkOjVlOjg5OjQ0OmI0OmQ4OjRmOjk2OjYyOmJkOjI2OmRiOjI1OjdmOjg5OjM0OmE0OjQzOmM3OjAxOjYxCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEcnpDQ0FwZWdBd0lCQWdJUUNEdmdWcEJDUnJHaGRXckpXWkhIU2pBTkJna3Foa2lHOXcwQkFRVUZBREJoCk1Rc3dDUVlEVlFRR0V3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjMKZDNjdVpHbG5hV05sY25RdVkyOXRNU0F3SGdZRFZRUURFeGRFYVdkcFEyVnlkQ0JIYkc5aVlXd2dVbTl2ZENCRApRVEFlRncwd05qRXhNVEF3TURBd01EQmFGdzB6TVRFeE1UQXdNREF3TURCYU1HRXhDekFKQmdOVkJBWVRBbFZUCk1SVXdFd1lEVlFRS0V3eEVhV2RwUTJWeWRDQkpibU14R1RBWEJnTlZCQXNURUhkM2R5NWthV2RwWTJWeWRDNWoKYjIweElEQWVCZ05WQkFNVEYwUnBaMmxEWlhKMElFZHNiMkpoYkNCU2IyOTBJRU5CTUlJQklqQU5CZ2txaGtpRwo5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBNGp2aEVYTGVxS1RUbzFlcVVLS1BDM2VReWFLbDdoTE9sbHNCCkNTRE1BWk9uVGpDM1UvZER4R2tBVjUzaWpTTGRod1pBQUlFSnpzNGJnNy9melR0eFJ1TFdac2NGczNZbkZvOTcKbmg2VmZlNjNTS01JMnRhdmVndzVCbVYvU2wwZnZCZjRxNzd1S05kMGYzcDRtVm1GYUc1Y0l6Skx2MDdBNkZwdAo0M0MvZHhDLy9BSDJoZG1vUkJCWU1xbDFHTlhSb3I1SDRpZHE5Sm96K0VrSVlJdlVYN1E2aEwraHFrcE1mVDdQClQxOXNkbDZnU3plUm50d2k1bTNPRkJxT2Fzdit6Yk1VWkJmSFd5bWVNci95N3ZyVEMwTFVxN2RCTXRvTTFPLzQKZ2RXN2pWZy90UnZvU1NpaWNOb3hCTjMzc2hieVRBcE9CNmp0U2oxZXRYK2prTU92SndJREFRQUJvMk13WVRBTwpCZ05WSFE4QkFmOEVCQU1DQVlZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVUE5NVFOVmJSClRMdG04S1BpR3h2RGw3STkwVlV3SHdZRFZSMGpCQmd3Rm9BVUE5NVFOVmJSVEx0bThLUGlHeHZEbDdJOTBWVXcKRFFZSktvWklodmNOQVFFRkJRQURnZ0VCQU11Y042cElFeElLK3QxRW5FOVNzUFRmcmdUMWVYa0lveVFZL0VzcgpoTUF0dWRYSC92VEJIMWpMdUcyY2VuVG5tQ21yRWJYamNLQ2h6VXlJbVpPTWtYRGlxdzhjdnBPcC8yUFY1QWRnCjA2Ty9uVnNKOGRXTzQxUDBqbVA2UDZmYnRHYmZZbWJXMFc1QmpmSXR0ZXAzU3ArZFdPSXJXY0JBSSswdEtJSkYKUG5sVWtpYVk0SUJJcURmdjhOWjVZQmJlck9nT3pXNnNSQmM0TDBuYTRVVStLcmsyVTg4NlVBYjNMdWpFVjBscwpZU0VZMVFTdGVEd3NPb0JycCt1dkZSVHAySW5CdVRoczRwRnNpdjlrdVhjbFZ6REFHeVNqNGR6cDMwZDh0YlFrCkNBVXc3QzI5Qzc5RnYxQzVxZlBybUFFU3JjaUl4cGcwWDQwS1BNYnAxWldWYmQ0PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RGlnaUNlcnQgSGlnaCBBc3N1cmFuY2UgRVYgUm9vdCBDQSBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgU3ViamVjdDogQ049RGlnaUNlcnQgSGlnaCBBc3N1cmFuY2UgRVYgUm9vdCBDQSBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgTGFiZWw6ICJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBIgojIFNlcmlhbDogMzU1MzQwMDA3NjQxMDU0NzkxOTcyNDczMDczNDM3ODEwMDA4NwojIE1ENSBGaW5nZXJwcmludDogZDQ6NzQ6ZGU6NTc6NWM6Mzk6YjI6ZDM6OWM6ODU6ODM6YzU6YzA6NjU6NDk6OGEKIyBTSEExIEZpbmdlcnByaW50OiA1ZjpiNzplZTowNjozMzplMjo1OTpkYjphZDowYzo0Yzo5YTplNjpkMzo4ZjoxYTo2MTpjNzpkYzoyNQojIFNIQTI1NiBGaW5nZXJwcmludDogNzQ6MzE6ZTU6ZjQ6YzM6YzE6Y2U6NDY6OTA6Nzc6NGY6MGI6NjE6ZTA6NTQ6NDA6ODg6M2I6YTk6YTA6MWU6ZDA6MGI6YTY6YWI6ZDc6ODA6NmU6ZDM6YjE6MTg6Y2YKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR4VENDQXEyZ0F3SUJBZ0lRQXF4Y0ptb0xRSnVQQzNueXJrWWxkekFOQmdrcWhraUc5dzBCQVFVRkFEQnMKTVFzd0NRWURWUVFHRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCMwpkM2N1WkdsbmFXTmxjblF1WTI5dE1Tc3dLUVlEVlFRREV5SkVhV2RwUTJWeWRDQklhV2RvSUVGemMzVnlZVzVqClpTQkZWaUJTYjI5MElFTkJNQjRYRFRBMk1URXhNREF3TURBd01Gb1hEVE14TVRFeE1EQXdNREF3TUZvd2JERUwKTUFrR0ExVUVCaE1DVlZNeEZUQVRCZ05WQkFvVERFUnBaMmxEWlhKMElFbHVZekVaTUJjR0ExVUVDeE1RZDNkMwpMbVJwWjJsalpYSjBMbU52YlRFck1Da0dBMVVFQXhNaVJHbG5hVU5sY25RZ1NHbG5hQ0JCYzNOMWNtRnVZMlVnClJWWWdVbTl2ZENCRFFUQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU1iTTVYUG0KKzlTNzVTMHRNcWJmNVlFL3ljMGxTYlp4S3NQVmxEUm5vZ29jc0Y5cHBrQ3h4TGV5ajlDWXBLbEJXVHJUM0pUVwpQTnQwT0tSS3pFMGxndmRLcFZNU09PN3pTVzF4a1g1anRxdW1YOE9raFBoUFlsRysrTVhzMnppUzR3YmxDSkVNCnhDaEJWZnZMV29rVmZuSG9OYjlOY2drOXZqbzRVRnQzTVJ1TnM4Y2tSWnFuckcwQUZGb0V0N29UNjFFS21FRkIKSWs1bFlZZUJRVkNtZVZ5SjNobEtWOVV1NWwwY1V5eCttTTBhQmhha2FIUFFOQVFUWEtGeDAxcDhWZHRlWk9FMwpoekJXQk9VUnRDbUFFdkY1T1lpaUFoRjhKMmEzaUxkNDhzb0txRGlyQ21UQ3YyWmRsWVRCb1NVZWgxMGFVQXNnCkVzeEJ1MjRMVVRpNFM4c0NBd0VBQWFOak1HRXdEZ1lEVlIwUEFRSC9CQVFEQWdHR01BOEdBMVVkRXdFQi93UUYKTUFNQkFmOHdIUVlEVlIwT0JCWUVGTEUrdzJrRCtMOUhBZFNZSmhvSUF1OWpaQ3ZETUI4R0ExVWRJd1FZTUJhQQpGTEUrdzJrRCtMOUhBZFNZSmhvSUF1OWpaQ3ZETUEwR0NTcUdTSWIzRFFFQkJRVUFBNElCQVFBY0dnYVgzTmVjCm56eUlaZ1lJVnlIYklVZjRLbWVxdnhneWRrQVFWOEdLODNyWkVXV09OZnFlL0VXMW50bE1NVXU0a2VoRExJNnoKZU03YjQxTjVjZGJsSVpRQjJsV0htaVJrOW9wbXpONmNOODJvTkxGcG15UElubmdpSzNCRDQxVkhNV0VaNzFqRgpoUzlPTVBhZ01SWWp5T2ZpWlJZenk3OGFHNkE5K01wZWl6R0xZQWlKTFF3R1hGSzN4UGtLbU5FVlg1OFN2bncyCll6aTlSS1IvNUNZckNzU1hhUTNwak9MQUVGZTR5SFlTa1ZYeVNHbll2Q29DV3c5RTFDQXgyL1M2Y0NaZGtHQ2UKdkVzWENTKzB5eDVEYU1rSEo4SFNYUGZxSWJsb0VwdzhuTCtlL0lCY20yUE43RWVxSlNkbm9EZnpBSUo5Vk5lcAorT2t1RTZOMzZCOUsKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUNsYXNzIDIgUHJpbWFyeSBDQSBPPUNlcnRwbHVzCiMgU3ViamVjdDogQ049Q2xhc3MgMiBQcmltYXJ5IENBIE89Q2VydHBsdXMKIyBMYWJlbDogIkNlcnRwbHVzIENsYXNzIDIgUHJpbWFyeSBDQSIKIyBTZXJpYWw6IDE3Nzc3MDIwODA0NTkzNDA0MDI0MTQ2ODc2MDQ4ODMyNzU5NTA0MwojIE1ENSBGaW5nZXJwcmludDogODg6MmM6OGM6NTI6Yjg6YTI6M2M6ZjM6Zjc6YmI6MDM6ZWE6YWU6YWM6NDI6MGIKIyBTSEExIEZpbmdlcnByaW50OiA3NDoyMDo3NDo0MTo3Mjo5YzpkZDo5MjplYzo3OTozMTpkODoyMzoxMDo4ZDpjMjo4MTo5MjplMjpiYgojIFNIQTI1NiBGaW5nZXJwcmludDogMGY6OTk6M2M6OGE6ZWY6OTc6YmE6YWY6NTY6ODc6MTQ6MGU6ZDU6OWE6ZDE6ODI6MWI6YjQ6YWY6YWM6ZjA6YWE6OWE6NTg6YjU6ZDU6N2E6MzM6OGE6M2E6ZmI6Y2IKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURrakNDQW5xZ0F3SUJBZ0lSQUlXOVMvUFkydU5wOXBUWFg4T2xSQ013RFFZSktvWklodmNOQVFFRkJRQXcKUFRFTE1Ba0dBMVVFQmhNQ1JsSXhFVEFQQmdOVkJBb1RDRU5sY25Sd2JIVnpNUnN3R1FZRFZRUURFeEpEYkdGegpjeUF5SUZCeWFXMWhjbmtnUTBFd0hoY05PVGt3TnpBM01UY3dOVEF3V2hjTk1Ua3dOekEyTWpNMU9UVTVXakE5Ck1Rc3dDUVlEVlFRR0V3SkdVakVSTUE4R0ExVUVDaE1JUTJWeWRIQnNkWE14R3pBWkJnTlZCQU1URWtOc1lYTnoKSURJZ1VISnBiV0Z5ZVNCRFFUQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU54UQpsdEFTK0RYU0NIaDZ0bEp3L1cvdXo3a1J5MTEzNGV6cGZnU04xc3h2YzBOWFlLd3pDa1RzQTE4Y2dDU1I1YWlSClZoS0M5K0FyOU51dVlTNkpFSTFyYkxxekFyM1ZOc1ZJTnlQaThGbzNVak1YRXVMUllFMitMMEVSNC9ZWEpReUwKa2NBYm1YdVpWZzJ2N3RLOFIxZmplVWw3TklrbkpJVGVzZXpwV0U3K1R0OWF2a0d0ckFqRkdBN3YwbFB1Yk5DZApFZ0VUamR5QVl2ZVZxVVNJU25GT1lGV2UyeU1aZVZZSEREOWpDMXl3NHI1K0ZmeVVNMWhCT0hURTRZK0wzeWFzCkg3V0xPN2REV1d1d0pLWnRrSXZFY3VwZE01aTN5OTVlZSsrVThScyt5c2tod2NXWUFxcWk5bHQzbS9WK2xsVTAKSEdkcHdQRkM0MGVzL0NnY1psVUNBd0VBQWFPQmpEQ0JpVEFQQmdOVkhSTUVDREFHQVFIL0FnRUtNQXNHQTFVZApEd1FFQXdJQkJqQWRCZ05WSFE0RUZnUVU0M010MzhzT0tBemUzYk9reW5tNGpydm9NSWt3RVFZSllJWklBWWI0ClFnRUJCQVFEQWdFR01EY0dBMVVkSHdRd01DNHdMS0Fxb0NpR0ptaDBkSEE2THk5M2QzY3VZMlZ5ZEhCc2RYTXUKWTI5dEwwTlNUQzlqYkdGemN6SXVZM0pzTUEwR0NTcUdTSWIzRFFFQkJRVUFBNElCQVFDblZNK0lSQm5MMzlSLwpBTjlXTTJLMTkxRUJrT3ZEUDlHSVJPa2tYZS9uRkwwZ3Q1bzhBUDV0bjl1UTNOZjBZdGFMY0YzbjVRUklxV2g4CnlmRkM4MngveFhwOEhWR0l1dElLUGlkZDNpMVJUdE1UWkdua0x1UFQ1NXNKbWFiZ2xadk9HdGQvdmp6T1VyTVIKRmNFUEY4MER1NXdsRmJxaWRvbjhCdkVZMEpOTERueUN0NlgwOWwvKzdVQ21uWVIwT2JuY0hvVVcyaWtiaGlNQQp5YnVKZm02QWlCNHZGTFFESktneWJ3T2FSeXd3dmxiR3AwSUNjQnZxUU5pNkJRTndCNlNXLy8xSU13cmgzS1dCCmtKdE4zWDNuNTdMTlhNaHFsZmlsOW8zRVhYZ0l2bnNHMWtuUEdUWlFJeTRJNXA0RlRVY1kxUmJwc2RhMkVOVzcKbDcraWpyUlUKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPURTVCBSb290IENBIFgzIE89RGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uCiMgU3ViamVjdDogQ049RFNUIFJvb3QgQ0EgWDMgTz1EaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4KIyBMYWJlbDogIkRTVCBSb290IENBIFgzIgojIFNlcmlhbDogOTEyOTk3MzU1NzUzMzk5NTMzMzU5MTkyNjY5NjU4MDM3NzgxNTUKIyBNRDUgRmluZ2VycHJpbnQ6IDQxOjAzOjUyOmRjOjBmOmY3OjUwOjFiOjE2OmYwOjAyOjhlOmJhOjZmOjQ1OmM1CiMgU0hBMSBGaW5nZXJwcmludDogZGE6Yzk6MDI6NGY6NTQ6ZDg6ZjY6ZGY6OTQ6OTM6NWY6YjE6NzM6MjY6Mzg6Y2E6NmE6ZDc6N2M6MTMKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDA2Ojg3OjI2OjAzOjMxOmE3OjI0OjAzOmQ5OjA5OmYxOjA1OmU2OjliOmNmOjBkOjMyOmUxOmJkOjI0OjkzOmZmOmM2OmQ5OjIwOjZkOjExOmJjOmQ2Ojc3OjA3OjM5Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEU2pDQ0FqS2dBd0lCQWdJUVJLK3dnTmFqSjdxSk1EbUdMdmhBYXpBTkJna3Foa2lHOXcwQkFRVUZBREEvCk1TUXdJZ1lEVlFRS0V4dEVhV2RwZEdGc0lGTnBaMjVoZEhWeVpTQlVjblZ6ZENCRGJ5NHhGekFWQmdOVkJBTVQKRGtSVFZDQlNiMjkwSUVOQklGZ3pNQjRYRFRBd01Ea3pNREl4TVRJeE9Wb1hEVEl4TURrek1ERTBNREV4TlZvdwpQekVrTUNJR0ExVUVDaE1iUkdsbmFYUmhiQ0JUYVdkdVlYUjFjbVVnVkhKMWMzUWdRMjh1TVJjd0ZRWURWUVFECkV3NUVVMVFnVW05dmRDQkRRU0JZTXpDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUIKQU4rdjZaZFFDSU5YdE14aVpmYVFndXpIMHl4ck1NcGI3Tm5EZmNkQXdSZ1VpK0RvTTNaSkt1TS9JVW1UckU0TwpyejVJeTJYdS9OTWhEMlhTS3RreWo0emw5M2V3RW51MWxjQ0pvNm02N1hNdWVnd0dNb09pZm9vVU1NMFJvT0VxCk9MbDVDakg5VUwyQVpkKzNVV09EeU9LSVllcExZWUhzVW11NW91SkxHaWlmU0tPZUROb0pqajRYTGg3ZElOOWIKeGlxS3F5NjljSzNGQ3hvbGtIUnl4WHRxcXpUV01Jbi81V2dUZTFRTHlOYXU3RnFja2g0OVpMT014dCsveVVGdwo3Qlp5MVNic09GVTVROUQ4L1JoY1FQR1g2OVdhbTQwZHV0b2x1Y2JZMzhFVkFqcXIybTd4UGk3MVhBaWNQTmFECmFlUVFteGtxdGlsWDQrVTltNS93QWwwQ0F3RUFBYU5DTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlYKSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPQkJZRUZNU25zYVI3TEhINjIrRkxrSFgveEJWZ2hZa1FNQTBHQ1NxRwpTSWIzRFFFQkJRVUFBNElCQVFDakdpeWJGd0JjcVI3dUtHWTNPcitEeHo5THd3bWdsU0JkNDlsWlJOSStEVDY5CmlrdWdkQi9PRUlLY2RCb2RmcGdhM2NzVFM3TWdST1NSNmN6OGZhWGJhdVgrNXYzZ1R0MjNBRHExY0Vtdjh1WHIKQXZIUkFvc1p5NVE2WGtqRUdCNVlHVjhlQWxyd0RQR3hyYW5jV1lhTGJ1bVI5WWJLK3JsbU02cFpXODdpcHhaegpSOHNyekptd04walA0MVpMOWM4UERISXloOGJ3Ukx0VGNtMUQ5U1pJbWxKbnQxaXIvbWQyY1hqYkRhSldGQk01CkpER0ZvcWdDV2pCSDRkMVFCN3dDQ1pBQTYyUmpZSnNXdklqSkV1YlNmWkdMK1QweWpXVzA2WHl4VjNicXhiWW8KT2I4VlpSekk5bmVXYWdxTmR3dllrUXNFamdmYktiWUs3cDJDTlRVUQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U3dpc3NTaWduIEdvbGQgQ0EgLSBHMiBPPVN3aXNzU2lnbiBBRwojIFN1YmplY3Q6IENOPVN3aXNzU2lnbiBHb2xkIENBIC0gRzIgTz1Td2lzc1NpZ24gQUcKIyBMYWJlbDogIlN3aXNzU2lnbiBHb2xkIENBIC0gRzIiCiMgU2VyaWFsOiAxMzQ5MjgxNTU2MTgwNjk5MTI4MAojIE1ENSBGaW5nZXJwcmludDogMjQ6Nzc6ZDk6YTg6OTE6ZDE6M2I6ZmE6ODg6MmQ6YzI6ZmY6Zjg6Y2Q6MzM6OTMKIyBTSEExIEZpbmdlcnByaW50OiBkODpjNTozODo4YTpiNzozMDoxYjoxYjo2ZTpkNDo3YTplNjo0NToyNTozYTo2Zjo5ZjoxYToyNzo2MQojIFNIQTI1NiBGaW5nZXJwcmludDogNjI6ZGQ6MGI6ZTk6Yjk6ZjU6MGE6MTY6M2U6YTA6Zjg6ZTc6NWM6MDU6M2I6MWU6Y2E6NTc6ZWE6NTU6Yzg6Njg6OGY6NjQ6N2M6Njg6ODE6ZjI6Yzg6MzU6N2I6OTUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZ1akNDQTZLZ0F3SUJBZ0lKQUx0QUhFUDFYayt3TUEwR0NTcUdTSWIzRFFFQkJRVUFNRVV4Q3pBSkJnTlYKQkFZVEFrTklNUlV3RXdZRFZRUUtFd3hUZDJsemMxTnBaMjRnUVVjeEh6QWRCZ05WQkFNVEZsTjNhWE56VTJsbgpiaUJIYjJ4a0lFTkJJQzBnUnpJd0hoY05NRFl4TURJMU1EZ3pNRE0xV2hjTk16WXhNREkxTURnek1ETTFXakJGCk1Rc3dDUVlEVlFRR0V3SkRTREVWTUJNR0ExVUVDaE1NVTNkcGMzTlRhV2R1SUVGSE1SOHdIUVlEVlFRREV4WlQKZDJsemMxTnBaMjRnUjI5c1pDQkRRU0F0SUVjeU1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBTUlJQwpDZ0tDQWdFQXIrVHVmb3NrRGhKdXFWQXRGa1E3a3BKY3lyaGRoSkpDRXlxOFpWZUNRRDVYSk0xUWl5VXF0Mi84Cjc2TFF3QjhDSkVvVGxvOGpFK1lvV0FDalI4Y0dwNFFqSzd1OWxpdC9WY3lMd1ZjZkRtSmxEOTA5Vm9wejJxNSsKYmJxQkhINUNqQ0ExMlVOTmhQcUUyMUlzOHc0bmR3dHJ2eEV2Y25pZkx0Zys1aGczV2lweStkcGlrSktWeWgrYwo2Yk04Szh2ekFSTy9Xcy9CdFFwZ3ZkMjFtV1JUdUtDV3MyL2lKbmVSak9CaUVBS2ZOQStrMVpJelVkNitqYnFFCmVtQThhdHVmSyt6ZTNnRS9iazNsVUliTHRLL3RSRURGeWxxTTJ0SXJmS2p1dnFibENxb09wZDhGVXJkVnh5SmQKTW1xWGwyTVQyOG5iZVRaN2hUcEt4VktKK1NUbm5YZXBndjlWSEtWeGFTdlJBaVR5c3liVWE5b0VWZVhCQ3NkdApNRGVRS3VTZUZETmVGaGRWeFZ1MXl6U0prdkdkSm8raEI5VEdzbmhRMnd3TUMzd0xqRUhYdWVuZGpJajNvMDJ5Ck1zellGOXJOdDg1bW5kVDlYdis5bHo0cGRlZCtwMkpZcnlVMHBVSEhQYndOVU1vREF3OElXaCtWYzNoaXY2OXkKRkdrT3BlVUREbmlPSmloQzhBY0xZaUFRWnpsRytxa0R6QVE0ZW1idklJTzFqRXBXanBFQS9JNWNndDZJb01QaQphRzU5amU4ODNXWDBYYXhSN3lTQXJxcFdsMi81clgzYVlUK1lkenlsa2JZY2pDYmFaYUlKYmNIaVZPTzV5a3hNCmdJOTNlMkNhSHQrMjhrZ2VEcnBPVkcyWTRPR2lHcUozVU0vRVk1THNSeG1kNitacnpzRUNBd0VBQWFPQnJEQ0IKcVRBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVV3lWNwpscVJsVVg2NE9mUEFlR1plNkRybjhPNHdId1lEVlIwakJCZ3dGb0FVV3lWN2xxUmxVWDY0T2ZQQWVHWmU2RHJuCjhPNHdSZ1lEVlIwZ0JEOHdQVEE3QmdsZ2hYUUJXUUVDQVFFd0xqQXNCZ2dyQmdFRkJRY0NBUllnYUhSMGNEb3YKTDNKbGNHOXphWFJ2Y25rdWMzZHBjM056YVdkdUxtTnZiUzh3RFFZSktvWklodmNOQVFFRkJRQURnZ0lCQUNlNgo0NVI4OGE3QTNoZm01ZGpWOVZTd2cvUzd6VjRGZTArZmRXYXZQT2hXZnZ4eWVEZ0QyU3RpR3dDNStPbGd6Y3pPClVZckhVREZ1NFVwK0dDOXBXYlk5WklFcjQ0T0U1aUtIam4zZzdnS1pZYmdlOUxncmlCSVdoTUl4a3ppV01hYTUKTzFNL3d5U1RWbHRwa3V6RndiczRBT1BzRjZtNDNNZDhBWU9mTWtlNlVpSTBIVEo2Q1ZhbmZDVTJxVDFMMnNDQwpid3E3RXNpSFN5Y1IrUjR0eDVNL250dGZKbXRTMlM2SzhSVEdSSTBWcWJlL3ZkNm1HdTZ1TGZ0SWR4Zit1K3l2CkdQVXFVZkE1aEplVmJHNGJ3eXZFZEdCNUpiQUtKOS9mWHRJNXowVjlRa3Zmc3l3ZXhjWmR5bFU2b0p4cG1vL2EKNzdLd1BKK0hiQklyWlhBVlVqRWFKTTl2TVNOUUg0eFBqeVBEZEVGakhGV29GTjArNEZGUXovRWJNRllPa3JDQwpoZGlEeXlKa3ZDMjRKZFZVb3JnRzZxMlNwQ1Nnd1lhMVNoTnFSODh1QzFhVlZNdk9tdHRxdEtheTIwRUloaWQzCjkycWdRbXdMT003WGRWQXlrc0xmS3pBaVNORFZRVGdsWGFUcFhaL0dsSFhRUmYwd2wwT1BrS3NLeDRaellFcHAKTGQ2bGVOY0cybXFlU3o1M09pQVRJZ0hRdjJpZVkyQnJOVTBMYmJxaFBjQ1Q0SDhqczFXdGNpVk9Sdm5TRnUrdwpaTUVCbnVuS29HcVlEcy9ZWVBJdlNiamtRdUU0TlJiMHlHNVA5NEZXNkxxanZpT3ZydjF2QStBQ096QjIraHR0ClFjOEJzZW00eVdiMDJ5YnpPcVIwOGtra1c4bXcwRmZCK2o1NjRaZkoKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVN3aXNzU2lnbiBTaWx2ZXIgQ0EgLSBHMiBPPVN3aXNzU2lnbiBBRwojIFN1YmplY3Q6IENOPVN3aXNzU2lnbiBTaWx2ZXIgQ0EgLSBHMiBPPVN3aXNzU2lnbiBBRwojIExhYmVsOiAiU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyIgojIFNlcmlhbDogNTcwMDM4MzA1MzExNzU5OTU2MwojIE1ENSBGaW5nZXJwcmludDogZTA6MDY6YTE6Yzk6N2Q6Y2Y6Yzk6ZmM6MGQ6YzA6NTY6NzU6OTY6ZDg6NjI6MTMKIyBTSEExIEZpbmdlcnByaW50OiA5YjphYTplNTo5Zjo1NjplZToyMTpjYjo0Mzo1YTpiZToyNTo5MzpkZjphNzpmMDo0MDpkMToxZDpjYgojIFNIQTI1NiBGaW5nZXJwcmludDogYmU6NmM6NGQ6YTI6YmI6Yjk6YmE6NTk6YjY6ZjM6OTM6OTc6Njg6Mzc6NDI6NDY6YzM6YzA6MDU6OTk6M2Y6YTk6OGY6MDI6MGQ6MWQ6ZWQ6YmU6ZDQ6OGE6ODE6ZDUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZ2VENDQTZXZ0F3SUJBZ0lJVHh2VUwxUzdMMHN3RFFZSktvWklodmNOQVFFRkJRQXdSekVMTUFrR0ExVUUKQmhNQ1EwZ3hGVEFUQmdOVkJBb1RERk4zYVhOelUybG5iaUJCUnpFaE1COEdBMVVFQXhNWVUzZHBjM05UYVdkdQpJRk5wYkhabGNpQkRRU0F0SUVjeU1CNFhEVEEyTVRBeU5UQTRNekkwTmxvWERUTTJNVEF5TlRBNE16STBObG93ClJ6RUxNQWtHQTFVRUJoTUNRMGd4RlRBVEJnTlZCQW9UREZOM2FYTnpVMmxuYmlCQlJ6RWhNQjhHQTFVRUF4TVkKVTNkcGMzTlRhV2R1SUZOcGJIWmxjaUJEUVNBdElFY3lNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQWc4QQpNSUlDQ2dLQ0FnRUF4UEdIZjlONE1mYzR5ZmpEbVVPOHgvZThOK2RPY2JwTGo2VnpIVnh1bUs0RFY2NDROME12CkZ6MGZ5TTVvRU1GNHJoa0RLeEQ2TEhtRDl1aTVhTGxWOGdSRXB6bjUvQVNMSHZHaVRTZjVZWHU2dCtXaUU3YnIKWVQ3UWJOSG0rL3BlN1IyMG5xQTFXNkdTeS9CSmt2NkZDZ1UrNXRrTDRrKzczSlUzL0pIcE1qVWkwUjg2VGllRgpuYkFWbERMYVlRMUhUV0JDcnBKSDZJTmFVRmpwaW91NVhhSGMzWmxLSHpabnUwamtnN1kzNjBnNnJ3OW5qeGNICjZBVEs3Mm94aDlUQXR2bVVjWHRuWkxpMmtVcENlMlV1TUdvTTlaRHVsZWJ5ellMczJhRks3UGF5UytWRmhlWnQKZUpNRUxweUNiVGFweERGa0g0YURDeXIwTlFwNHlWWFBRYkJINlRDZm1iNWhxQWFFdVNoNlh6alpHNms0c0lOLwpjOEhETzBncWdnOGhtN2pNcURYRGhCdURzejYrcEpWcEFUcUpBSGdFMmNuMG1SbXJWbjViaTRZNUZaR2tFQ3dKCk1vQmdzNVBBS3JZWUM1MStqVW55RUVwLytkVkdMeG1TbzVtbkpxeTdqRHptRHJ4SEI5eHpVZkZ3WkM4SStiUkgKSFRCc1JPb3BONFdTYUdhOGd6aitlemt1MDFEd0gvdGVZTGFwcHZvblFmR2JHSEx5OVlSMFNzbG54RlN1U0dUZgpqTkZ1c0IzaEI0OElIcG1jY2VsTTJLWDNSeElmZE5GUm5vYnp3cUlqUUF0ejIwdW01M01Hak1HZzZjRlpyRWI2CjVpLzR6M0djUm0yNXhCV05PSGtEUlVqdnhGM1hDTzZIT1NLR3NnMFBXRVAzY2FsSUx2M3ExaDhDQXdFQUFhT0IKckRDQnFUQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVQpGNkROd2VSQnRqcGJPOHRGbmIwY3dwajZobGd3SHdZRFZSMGpCQmd3Rm9BVUY2RE53ZVJCdGpwYk84dEZuYjBjCndwajZobGd3UmdZRFZSMGdCRDh3UFRBN0JnbGdoWFFCV1FFREFRRXdMakFzQmdnckJnRUZCUWNDQVJZZ2FIUjAKY0RvdkwzSmxjRzl6YVhSdmNua3VjM2RwYzNOemFXZHVMbU52YlM4d0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dJQgpBSFBHZ2VBbjBpMFA0SlV3NHBwQmYxQXNYMTlpWWFtR2Fta1lESFJKMWwyRTZrRlNHRzlZclZCV0lHckd2U2hwCldKSGNrUkUxcVRvZHZCcWxZSjdZSDM5RmtXblpmcnQ0Y3NFR0R5ck9qNFZ3WWF5Z3pRdTRPU2xXaERKT2hyczkKeENyWjF4OXk3djVSb1NKQnNYRUNZeHFDc0dLclhsY1NIOS9MM1hXZ3dGMTVrSXdiNEZEbTNqSCttSHR3WDZXUQoySzM0QXJadjAyRGRRRXNpeFQydE9ucWZHaHBIa1hrenVvTGNNbWtEbG00ZlMvQngvdU5uY3FDeHYxeUw1UHFaCklzZUV1UnVOSTVjLzdTWGd6Mlc3OVdFRTc5MGVzbHBCSWxxaG4xMHM2RnZKYmFrTURIaXFZTVpXandGYURHaTgKYVJsNXhCOStsd1cveGVra1VWN1UxVXRUN2RraldqWURaYVBCQTYxQk1QTkdHNFdRcjJXMTFiSGtGbHQ0ZFIyWAplbTFacVNxUGU5N0RoNGtRbVVsemVNZzl2VkUxZENyVjhYNXBHeXE3TzcwbHVKcGFQWEpoa0dhSDdneldUZFFSCmRBdHEvZ3NEL0tOVlY0bitTc3V1V3hjRnlQS05JekZUT05JdGFqK0N1WTBJYXZkZVFYUnV3eEYrQjZ3cFlKRS8KT01wWEVBMjlNQy9IcGVaQm9OcXVCWWVhb0tSbGJFd0pESW02dU5PNXdKT0tNUHFONVpwckZRRk9aNnJhWWxZKwpoQWhtMHNRMmZhYytFUHlJNE5TQTVRQzlxdk5PQnFONmF2bGljdU1KVCt1YkRnRWo4Wis3Zk56Y2JCR1hKYkx5CnRHTVUwZ1lxWjR5RDljN3FCOWlhYWg3czVBcTdLa3pyQ1dBNXpzcGkyQzV1Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1HZW9UcnVzdCBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89R2VvVHJ1c3QgSW5jLgojIFN1YmplY3Q6IENOPUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1HZW9UcnVzdCBJbmMuCiMgTGFiZWw6ICJHZW9UcnVzdCBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IgojIFNlcmlhbDogMzI3OTgyMjY1NTEyNTY5NjMzMjQzMTM4MDY0MzY5ODE5ODIzNjkKIyBNRDUgRmluZ2VycHJpbnQ6IDAyOjI2OmMzOjAxOjVlOjA4OjMwOjM3OjQzOmE5OmQwOjdkOmNmOjM3OmU2OmJmCiMgU0hBMSBGaW5nZXJwcmludDogMzI6M2M6MTE6OGU6MWI6Zjc6Yjg6YjY6NTI6NTQ6ZTI6ZTI6MTA6MGQ6ZDY6MDI6OTA6Mzc6ZjA6OTYKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDM3OmQ1OjEwOjA2OmM1OjEyOmVhOmFiOjYyOjY0OjIxOmYxOmVjOjhjOjkyOjAxOjNmOmM1OmY4OjJhOmU5OjhlOmU1OjMzOmViOjQ2OjE5OmI4OmRlOmI0OmQwOjZjCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEZkRDQ0FtU2dBd0lCQWdJUUdLeTFhdjFwdGhVNlkyeXYydnJFb1RBTkJna3Foa2lHOXcwQkFRVUZBREJZCk1Rc3dDUVlEVlFRR0V3SlZVekVXTUJRR0ExVUVDaE1OUjJWdlZISjFjM1FnU1c1akxqRXhNQzhHQTFVRUF4TW8KUjJWdlZISjFjM1FnVUhKcGJXRnllU0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQWVGdzB3TmpFeApNamN3TURBd01EQmFGdzB6TmpBM01UWXlNelU1TlRsYU1GZ3hDekFKQmdOVkJBWVRBbFZUTVJZd0ZBWURWUVFLCkV3MUhaVzlVY25WemRDQkpibU11TVRFd0x3WURWUVFERXloSFpXOVVjblZ6ZENCUWNtbHRZWEo1SUVObGNuUnAKWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQwpBUUVBdnJnVmUvL1VmSDFucllOa2U4aENVeTNmOW9RSUlHSFdBVmxxbkVRUnIrOTIvWlYrem1Fd3UzcURYd0s5CkFXYks3aFdOYjZFd25MMmhoWjZVT3ZOV2lBQXh6OWp1YXBZQzJlMERqUHQxYmVmcXVGVVdCUmFhOU9CZXNZakEKWklWY0ZVMkl4N2U2NEhYcHJRVTluY2VKU09DN0tNZ0Q0VENUWkY1U3dGbHdJalZYaUlyeGxRcUQxN3d4Y3dFMAo3ZTlHY2VCckFxZzFjbXVYbTJiZ3l4eDVYOWdhQkdnZVJ3TG1uV0RpTnBjQjM4NDFrdCsrWjhkdGQxazdqNTNXCmtCV1V2RUkwRU1FNStiRW5QbjdXaW5YRnNxK1cwNkxlbStTWXZuM2g2WUd0dG0vODF3N2E0RFN3RFJwMzUrTUkKbU85WStweUV0emF2d3QrczB2UVFCbkJ4TlFJREFRQUJvMEl3UURBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUE0RwpBMVVkRHdFQi93UUVBd0lCQmpBZEJnTlZIUTRFRmdRVUxOVlFRWmNWaS9DUE5tRmJTdnRyMlpuSk01SXdEUVlKCktvWklodmNOQVFFRkJRQURnZ0VCQUZwd2Z5emR0elJQOVlaUnFTYStTN2lxOFhFTjNHSEhvT28wSG5wM0R3UTEKNkNlUGJKQy9rUllrUmo1S1RzNHJGdFVMVWgzOEgyZWlBa1V4VDg3eitnT25lWjFUYXRuYVl6cjRnTmZUbWVHbAo0YjdVVlhHWU5UcStrK3F1clVLeWtHL2cvQ0ZOTldNemlVbldtMDdLeCtkT0NRRDMyc2Z2bVdLWmQ3YVZJbDZLCm9LdjB1SGlZeWpnWm1jbHlubmpOUzZ5dkdhQnpFaTM4d2tHNmdaSGFGbG94dC9tMGNZQVNTSmx5YzFwWlU4RmoKVWpQdHA4blNPUUp3K3VDeFFtWXBxcHRSN1RCVUloUmYyYXNkd2VTVThQajFLL2ZxeW5oRzFyaVIvYVlOS3hvVQpBVDZBOEVLZ2xRZGViYzNNUzZSRmphc1M2TFBlV3VXZ2ZPZ1BJaDFhNlZrPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049dGhhd3RlIFByaW1hcnkgUm9vdCBDQSBPPXRoYXd0ZSwgSW5jLiBPVT1DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uLyhjKSAyMDA2IHRoYXd0ZSwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgU3ViamVjdDogQ049dGhhd3RlIFByaW1hcnkgUm9vdCBDQSBPPXRoYXd0ZSwgSW5jLiBPVT1DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uLyhjKSAyMDA2IHRoYXd0ZSwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgTGFiZWw6ICJ0aGF3dGUgUHJpbWFyeSBSb290IENBIgojIFNlcmlhbDogNjk1MjkxODE5OTIwMzkyMDM1NjYyOTg5NTM3ODc3MTI5NDA5MDkKIyBNRDUgRmluZ2VycHJpbnQ6IDhjOmNhOmRjOjBiOjIyOmNlOmY1OmJlOjcyOmFjOjQxOjFhOjExOmE4OmQ4OjEyCiMgU0hBMSBGaW5nZXJwcmludDogOTE6YzY6ZDY6ZWU6M2U6OGE6Yzg6NjM6ODQ6ZTU6NDg6YzI6OTk6Mjk6NWM6NzU6NmM6ODE6N2I6ODEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDhkOjcyOjJmOjgxOmE5OmMxOjEzOmMwOjc5OjFkOmYxOjM2OmEyOjk2OjZkOmIyOjZjOjk1OjBhOjk3OjFkOmI0OjZiOjQxOjk5OmY0OmVhOjU0OmI3OjhiOmZiOjlmCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFSURDQ0F3aWdBd0lCQWdJUU5FN1ZWeURWN2V4SjlDL09OOXNyYlRBTkJna3Foa2lHOXcwQkFRVUZBRENCCnFURUxNQWtHQTFVRUJoTUNWVk14RlRBVEJnTlZCQW9UREhSb1lYZDBaU3dnU1c1akxqRW9NQ1lHQTFVRUN4TWYKUTJWeWRHbG1hV05oZEdsdmJpQlRaWEoyYVdObGN5QkVhWFpwYzJsdmJqRTRNRFlHQTFVRUN4TXZLR01wSURJdwpNRFlnZEdoaGQzUmxMQ0JKYm1NdUlDMGdSbTl5SUdGMWRHaHZjbWw2WldRZ2RYTmxJRzl1YkhreEh6QWRCZ05WCkJBTVRGblJvWVhkMFpTQlFjbWx0WVhKNUlGSnZiM1FnUTBFd0hoY05NRFl4TVRFM01EQXdNREF3V2hjTk16WXcKTnpFMk1qTTFPVFU1V2pDQnFURUxNQWtHQTFVRUJoTUNWVk14RlRBVEJnTlZCQW9UREhSb1lYZDBaU3dnU1c1agpMakVvTUNZR0ExVUVDeE1mUTJWeWRHbG1hV05oZEdsdmJpQlRaWEoyYVdObGN5QkVhWFpwYzJsdmJqRTRNRFlHCkExVUVDeE12S0dNcElESXdNRFlnZEdoaGQzUmxMQ0JKYm1NdUlDMGdSbTl5SUdGMWRHaHZjbWw2WldRZ2RYTmwKSUc5dWJIa3hIekFkQmdOVkJBTVRGblJvWVhkMFpTQlFjbWx0WVhKNUlGSnZiM1FnUTBFd2dnRWlNQTBHQ1NxRwpTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDc29QRDdnRm5Vbk1la3o1MmhXWE1KRUVVTURTeHVhUEZzClcwaG9TVmszL0FzekdjSjNmOHdRTFpVMEhPYnJUUW1uSE5LNHlaYzJBcmVKMUNSZkJzRE1SSlNValFKaWIrdGEKM1JHTktKcGNoSkFRZWcyOWRHWXZhamlnNHRWVVJPc2RCNThIdW0vdTZmMU9DeW4xUG9TZ0FmR2NxL2djZm9tawo2S0hZY1dVTm8xRjc3cnpTSW1BTnVWdWQzN3I4VVZzTHI1aXk2UzdwQk9oaWg5NHJ5TmRPd1V4a0h0M1BoMWk2ClNrL0thQWNkSEoxS3h0VXZrY3g4Y1hJY3hjQm42ekw5eVpKY2xOcUZ3SnUvVTMwckNmU01uWkVmbDJwU3k5NEoKTnFSMzJIdUhVRVRWUG00cGFmczVTU1llQ2FXQWUwQXQ2K2duaGNuK1lmMSs1bnlYSGRXZEFnTUJBQUdqUWpCQQpNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01CMEdBMVVkRGdRV0JCUjdXMFhQCnI4N0xldjB4a2hwcXR2Tkc2MWRJVURBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQWVSSEFTN09SdHZ6dzZXZlUKRFc1RnZsWG9rOUxPQXovdDJpV3dIVmZMSGpwMm9FenNVSGJvWkhJTXBLbnh1SXZXMW9lRXV6TGxRUkhBZDltegpZSjNyRzlYUmJrUkVxYVlCN0ZWaUhYZTRYSTVJU1h5Y08xY1JySzF6TjQ0dmVGeVFhRWZaWUdEbS9BYzlJaUFYCnhQY1c2Y1RZY3ZuSWMzemZGaThWcVQ3OWFpZTJvZXRhdXBnZjFlTk5aQXFkRThoaHV2VTVISWU2dUwxN0luLzIKL3F4QWVlV3NFRzg5anh0NWRvdkVON01oR0lUbE5nRHJZeUNadWVuK013UzdRY2pCQXZsRVl5Q2VnYzVDMDlZLwpMSGJUWTV4WjNZK200UTZnTGtIM0xwVkh6N3o5TS9QMkMyRitmcEVyZ1VmQ0p6RHVweEJkTjQ5Y09TdmtCUEI3CmpWYU1hQT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1WZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUgTz1WZXJpU2lnbiwgSW5jLiBPVT1WZXJpU2lnbiBUcnVzdCBOZXR3b3JrLyhjKSAyMDA2IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBTdWJqZWN0OiBDTj1WZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUgTz1WZXJpU2lnbiwgSW5jLiBPVT1WZXJpU2lnbiBUcnVzdCBOZXR3b3JrLyhjKSAyMDA2IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBMYWJlbDogIlZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHNSIKIyBTZXJpYWw6IDMzMDM3NjQ0MTY3NTY4MDU4OTcwMTY0NzE5NDc1Njc2MTAxNDUwCiMgTUQ1IEZpbmdlcnByaW50OiBjYjoxNzplNDozMTo2NzozZTplMjowOTpmZTo0NTo1Nzo5MzpmMzowYTpmYToxYwojIFNIQTEgRmluZ2VycHJpbnQ6IDRlOmI2OmQ1Ojc4OjQ5OjliOjFjOmNmOjVmOjU4OjFlOmFkOjU2OmJlOjNkOjliOjY3OjQ0OmE1OmU1CiMgU0hBMjU2IEZpbmdlcnByaW50OiA5YTpjZjphYjo3ZTo0MzpjODpkODo4MDpkMDo2YjoyNjoyYTo5NDpkZTplZTplNDpiNDo2NTo5OTo4OTpjMzpkMDpjYTpmMTo5YjphZjo2NDowNTplNDoxYTpiNzpkZgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRTB6Q0NBN3VnQXdJQkFnSVFHTnJSbmlaOTZMdEtJVmpOekdzN1NqQU5CZ2txaGtpRzl3MEJBUVVGQURDQgp5akVMTUFrR0ExVUVCaE1DVlZNeEZ6QVZCZ05WQkFvVERsWmxjbWxUYVdkdUxDQkpibU11TVI4d0hRWURWUVFMCkV4WldaWEpwVTJsbmJpQlVjblZ6ZENCT1pYUjNiM0pyTVRvd09BWURWUVFMRXpFb1l5a2dNakF3TmlCV1pYSnAKVTJsbmJpd2dTVzVqTGlBdElFWnZjaUJoZFhSb2IzSnBlbVZrSUhWelpTQnZibXg1TVVVd1F3WURWUVFERXp4VwpaWEpwVTJsbmJpQkRiR0Z6Y3lBeklGQjFZbXhwWXlCUWNtbHRZWEo1SUVObGNuUnBabWxqWVhScGIyNGdRWFYwCmFHOXlhWFI1SUMwZ1J6VXdIaGNOTURZeE1UQTRNREF3TURBd1doY05Nell3TnpFMk1qTTFPVFU1V2pDQnlqRUwKTUFrR0ExVUVCaE1DVlZNeEZ6QVZCZ05WQkFvVERsWmxjbWxUYVdkdUxDQkpibU11TVI4d0hRWURWUVFMRXhaVwpaWEpwVTJsbmJpQlVjblZ6ZENCT1pYUjNiM0pyTVRvd09BWURWUVFMRXpFb1l5a2dNakF3TmlCV1pYSnBVMmxuCmJpd2dTVzVqTGlBdElFWnZjaUJoZFhSb2IzSnBlbVZrSUhWelpTQnZibXg1TVVVd1F3WURWUVFERXp4V1pYSnAKVTJsbmJpQkRiR0Z6Y3lBeklGQjFZbXhwWXlCUWNtbHRZWEo1SUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eQphWFI1SUMwZ1J6VXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDdkpBZ0lLWG8xCm5tQU1xdWRMTzA3Y2ZMdzhSUnk3SytEK0tRTDVWd2lqWklVVkovWHhyY2d4aVYwaTZDcXFwa0t6ai9pNVZiZXgKdDB1ei9vOStCMWZzNzBQYlptSVZZYzlnRGFUWTN2amd3MklJUFZRVDYwbktXVlNGSnVVcmp4dWY2L1doa2NJegpTZGhEWTJwU1M5S1A2SEJSVGRHSmFYdkhjUGF6M0JKMDIzdGRTMWJUbHI4VmQ2R3c5S0lsOHE4Y2ttY1k1ZlFHCkJPK1F1ZVFBNU4wNnRSbi9BcnIwUE83Z2krczNpK3owMTZ6eTl2QTlyOTExa1RNWkhSeEF5M1FrR1NHVDJSVCsKckNwU3g0L1ZCRW5raldOSGlEeHBnOHYrUjcwcmZrL0ZsYTRPbmRUUlE4Qm5jK01VQ0g3bFA1OXp1RE1LejEwLwpOSWVXaXU1VDZDVVZBZ01CQUFHamdiSXdnYTh3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFCkJBTUNBUVl3YlFZSUt3WUJCUVVIQVF3RVlUQmZvVjJnV3pCWk1GY3dWUllKYVcxaFoyVXZaMmxtTUNFd0h6QUgKQmdVckRnTUNHZ1FVaitYVEdvYXNqWTVydzgrQWF0UklHQ3g3R1M0d0pSWWphSFIwY0RvdkwyeHZaMjh1ZG1WeQphWE5wWjI0dVkyOXRMM1p6Ykc5bmJ5NW5hV1l3SFFZRFZSME9CQllFRkgvVFphZkMzZXk3OERBSjgwTTUrZ0t2Ck16RXpNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUNUSkVvd1gyTFAyQnFZTHozcTNKa3R2WGYycFhraU9PekUKcDZCNEVxMWlEa1Z3Wk1YbmwyWXRtQWwrWDYvV3pDaGw4Z0dxQ0JwSDN2bjVmSkphQ0drZ0RkaytiVzQ4RFc3WQo1Z2FSUUJpNStNSHQzOXRCcXVDV0lNbk5aQlU0Z2NtVTdxS0VLUXNUYjQ3YkROMGxBdHVraXhsRTBrRjZCV2xLCldFOWd5bjZDYWdzQ3FpVVhPYlhiZitlRVpTcVZpcjJHM2w2QkZvTXRFTXplL2FpQ0ttMG9IdzBMeE9YbkdpWVoKNGZRUmJ4QzFsZnpuUWdVeTI4NmRVVjRvdHA2RjAxdnZwWDFGUUhLT3R3NXJEZ2I3TXpWSWNiaWRKNHZFWlY4TgpobmFjUkhyMmxWejJYVElJTTZSVXRoZy9hRnp5UWtxRk9GU0RYOUhvTFBLc0VkYW83V05xCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1TZWN1cmVUcnVzdCBDQSBPPVNlY3VyZVRydXN0IENvcnBvcmF0aW9uCiMgU3ViamVjdDogQ049U2VjdXJlVHJ1c3QgQ0EgTz1TZWN1cmVUcnVzdCBDb3Jwb3JhdGlvbgojIExhYmVsOiAiU2VjdXJlVHJ1c3QgQ0EiCiMgU2VyaWFsOiAxNzE5OTc3NDU4OTEyNTI3Nzc4ODM2Mjc1NzAxNDI2Njg2MjAzMgojIE1ENSBGaW5nZXJwcmludDogZGM6MzI6YzM6YTc6NmQ6MjU6NTc6Yzc6Njg6MDk6OWQ6ZWE6MmQ6YTk6YTI6ZDEKIyBTSEExIEZpbmdlcnByaW50OiA4Nzo4MjpjNjpjMzowNDozNTozYjpjZjpkMjo5Njo5MjpkMjo1OTozZTo3ZDo0NDpkOTozNDpmZjoxMQojIFNIQTI1NiBGaW5nZXJwcmludDogZjE6YzE6YjU6MGE6ZTU6YTI6MGQ6ZDg6MDM6MGU6Yzk6ZjY6YmM6MjQ6ODI6M2Q6ZDM6Njc6YjU6MjU6NTc6NTk6YjQ6ZTc6MWI6NjE6ZmM6ZTk6Zjc6Mzc6NWQ6NzMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR1RENDQXFDZ0F3SUJBZ0lRRFBDT1hBZ1dwYTFDZi9Eckp4aFowREFOQmdrcWhraUc5dzBCQVFVRkFEQkkKTVFzd0NRWURWUVFHRXdKVlV6RWdNQjRHQTFVRUNoTVhVMlZqZFhKbFZISjFjM1FnUTI5eWNHOXlZWFJwYjI0eApGekFWQmdOVkJBTVREbE5sWTNWeVpWUnlkWE4wSUVOQk1CNFhEVEEyTVRFd056RTVNekV4T0ZvWERUSTVNVEl6Ck1URTVOREExTlZvd1NERUxNQWtHQTFVRUJoTUNWVk14SURBZUJnTlZCQW9URjFObFkzVnlaVlJ5ZFhOMElFTnYKY25CdmNtRjBhVzl1TVJjd0ZRWURWUVFERXc1VFpXTjFjbVZVY25WemRDQkRRVENDQVNJd0RRWUpLb1pJaHZjTgpBUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBS3VrZ2VXVnpmWDJGSTdDVDhyVTRuaVZXSnhCNFEyWlFDUVhPWkV6Clp1bSs0WU92WWx5SjBmd2tXMkd6NEJFUlFSd2RidkM0dS9qZXA0RzZwa2pHbngyOXZvNnBRVDY0bE8wcEd0U08KMGdNZEErOXREV2NjVjljR3Jjckk5ZjRPcjJZbFNBU1dDMTJqdWhiRENFL1JSdmdVWFBMSVhnR1piZjJJeklhbwp3Vzh4UW14U1Btakw4eGswMzd1SEdGYUFKc1RRM01CdjM5Nmd3cEVXb0dRUlMwUzhIdmJuK21QZVpxeDJwSEdqCjdEYVVhSHAzcExIbkRpK0JldUsxY29idm9tdUw4QS9iMDFrL3VuSzhSQ1NjNDNPejk2OVhMMEltbmFsMHVnQlMKOGt2TlUzeEhDemFGRG1hcENKY1dORmZCWnZlQTQrMXdWTWVUNEM0b0ZWbUh1cnNDQXdFQUFhT0JuVENCbWpBVApCZ2tyQmdFRUFZSTNGQUlFQmg0RUFFTUFRVEFMQmdOVkhROEVCQU1DQVlZd0R3WURWUjBUQVFIL0JBVXdBd0VCCi96QWRCZ05WSFE0RUZnUVVRaksyRnZvRS9mNWRTM3JEL2ZkTVFCMWFRNjh3TkFZRFZSMGZCQzB3S3pBcG9DZWcKSllZamFIUjBjRG92TDJOeWJDNXpaV04xY21WMGNuVnpkQzVqYjIwdlUxUkRRUzVqY213d0VBWUpLd1lCQkFHQwpOeFVCQkFNQ0FRQXdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBRER0VDByaFdEcFNjbHUxcHFObEdLYTdVVHQzCjZaM3EwNTljNEVWbGV3M0tXK0p3VUxLVUJSU3VTY2VOUVFjU2M1UitEQ01oL2J3UWYyQVFXbkwxbUE2czdMbC8KM1hwdlhkTWM5UCtJQldsQ3FRVnh5TGVzSnVndXRJeHEvM0hjdUxIZm1ieDhJVlFyNUZpaXUxY3BycDZwb3hrbQpENWt1Q0xEdi9XblBtUm9KamVPbm55dkpOalI3SkxONFRKVVhwQVltSHJaa1VqWmZZR2Zabk1VRmRBdm5aeVBTCkNQeUk2YTZMZitFdzlEZCsvY1l5MmkyZVJEQXdiTzRIM3RJMC9OTC9RUFpMOUdaR0JsU204aklLWXlZd2E1dlIKM0l0SHV1RzUxV0xRb3FEMFp3VjRLV01hYndUVytNWk1vNXF4TjdTTjVTaExIWjRzd3Job3ZPMEM3akU9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1TZWN1cmUgR2xvYmFsIENBIE89U2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24KIyBTdWJqZWN0OiBDTj1TZWN1cmUgR2xvYmFsIENBIE89U2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24KIyBMYWJlbDogIlNlY3VyZSBHbG9iYWwgQ0EiCiMgU2VyaWFsOiA5NzUxODM2MTY3NzMxMDUxNTU0MjMyMTE5NDgxNDU2OTc4NTk3CiMgTUQ1IEZpbmdlcnByaW50OiBjZjpmNDoyNzowZDpkNDplZDpkYzo2NToxNjo0OTo2ZDozZDpkYTpiZjo2ZTpkZQojIFNIQTEgRmluZ2VycHJpbnQ6IDNhOjQ0OjczOjVhOmU1OjgxOjkwOjFmOjI0Ojg2OjYxOjQ2OjFlOjNiOjljOmM0OjVmOmY1OjNhOjFiCiMgU0hBMjU2IEZpbmdlcnByaW50OiA0MjowMDpmNTowNDozYTpjODo1OTowZTpiYjo1Mjo3ZDoyMDo5ZTpkMTo1MDozMDoyOTpmYjpjYjpkNDoxYzphMTpiNTowNjplYzoyNzpmMTo1YTpkZTo3ZDphYzo2OQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHZEQ0NBcVNnQXdJQkFnSVFCMVlpcE9qVWlvbE45QlBJOFBqcXBUQU5CZ2txaGtpRzl3MEJBUVVGQURCSwpNUXN3Q1FZRFZRUUdFd0pWVXpFZ01CNEdBMVVFQ2hNWFUyVmpkWEpsVkhKMWMzUWdRMjl5Y0c5eVlYUnBiMjR4CkdUQVhCZ05WQkFNVEVGTmxZM1Z5WlNCSGJHOWlZV3dnUTBFd0hoY05NRFl4TVRBM01UazBNakk0V2hjTk1qa3gKTWpNeE1UazFNakEyV2pCS01Rc3dDUVlEVlFRR0V3SlZVekVnTUI0R0ExVUVDaE1YVTJWamRYSmxWSEoxYzNRZwpRMjl5Y0c5eVlYUnBiMjR4R1RBWEJnTlZCQU1URUZObFkzVnlaU0JIYkc5aVlXd2dRMEV3Z2dFaU1BMEdDU3FHClNJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUN2TlM3WXJHeFZhUVp4NVJOb0pMTlAyTXdoUi9qeFlEaUoKaVFQcHZlcGVSbE1KM0Z6MVd1ajNSU29DNnpGaDF5a3pUTTdIZkFvM2ZnKzZNcGpoSFpldmo4ZmN5VGlXODlzYQovRkh0YU1iUWJxUjhKTkd1UXNpV1VHTXU0UDUxL3Bpblgwa3VsZU01TTJTT0hxUmZrTkpuUExMWi9rRzVWYWNKCmpuSUZIb3ZkUklXQ1F0Qkp3QjFnOE5FWExKWHI5cVhCa3FQRndxY0lZQTFnQkJDV2VaNFdOT2FwdHZvbFJUbkkKSG1YNWsvV3E4VkxjbVpnOXBZWWFERFV6K2t1bEJBWVZIREdBNzZvWWE4SjcxOXJPK1RNZzFmVzlhak10Z1FUNwpzRnpVbktQaVhCM2pxVUoxWG52VWQrODVWTHJKQ2hnYkVwbEpMNGhML1ZCaTBYUG5qM3BEQWdNQkFBR2pnWjB3Cmdab3dFd1lKS3dZQkJBR0NOeFFDQkFZZUJBQkRBRUV3Q3dZRFZSMFBCQVFEQWdHR01BOEdBMVVkRXdFQi93UUYKTUFNQkFmOHdIUVlEVlIwT0JCWUVGSzlFQk1KQmZraUQyMDQ1QXV6c2hIcm16c21rTURRR0ExVWRId1F0TUNzdwpLYUFub0NXR0kyaDBkSEE2THk5amNtd3VjMlZqZFhKbGRISjFjM1F1WTI5dEwxTkhRMEV1WTNKc01CQUdDU3NHCkFRUUJnamNWQVFRREFnRUFNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUJqR2doQWZhUmVVdzEzMkhxdUh3MEwKVVJZRDd4aDh5T092YWxpVEZHQ1Jzb1RjaUU2K09ZbzY4K2FDaVYwQk43T3JKS1FWRHBJMVdrcEVYazVYK25YTwpIMGpPWnZROFFDYVNtR3diN2lSR0RCZXpVcVhicFpHUnp6ZlRiK2NuQ0RwT0dSODZwMWhjRjg5NVA0dmtwOU1tCkk1MG1EMWhwL0VkK3N0Q05pNU8vS1U5RGFYUjJaMHZQQjR6bUF2ZTE0YlJEdFVzdEZKLzUzQ1lOdjZaSGRBYlkKaU5FNktUQ0V6dEk1Z0dJYnFNZFhTYnhxVlZGbkZVcStOUWZrMVhXWU4za3dGTnNwbld6RmFjeEhWYUl3OTh4YwpmOExEbUJ4clRoYUE2M3A0WlVXaUFCcXZEQTFWWkRSSXVKSzU4YlJRS2ZKUEl4L2FiS3dmUk9IZEkzaFJXOGNXCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1DT01PRE8gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1DT01PRE8gQ0EgTGltaXRlZAojIFN1YmplY3Q6IENOPUNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPUNPTU9ETyBDQSBMaW1pdGVkCiMgTGFiZWw6ICJDT01PRE8gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkiCiMgU2VyaWFsOiAxMDQzNTA1MTM2NDgyNDkyMzI5NDE5OTg1MDg5ODU4MzQ0NjQ1NzMKIyBNRDUgRmluZ2VycHJpbnQ6IDVjOjQ4OmRjOmY3OjQyOjcyOmVjOjU2Ojk0OjZkOjFjOmNjOjcxOjM1OjgwOjc1CiMgU0hBMSBGaW5nZXJwcmludDogNjY6MzE6YmY6OWU6Zjc6NGY6OWU6YjY6Yzk6ZDU6YTY6MGM6YmE6NmE6YmU6ZDE6Zjc6YmQ6ZWY6N2IKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDBjOjJjOmQ2OjNkOmY3OjgwOjZmOmEzOjk5OmVkOmU4OjA5OjExOjZiOjU3OjViOmY4Ojc5Ojg5OmYwOjY1OjE4OmY5OjgwOjhjOjg2OjA1OjAzOjE3OjhiOmFmOjY2Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFSFRDQ0F3V2dBd0lCQWdJUVRvRXRpb0psNEFzQzdqNDFBa2JsUFRBTkJna3Foa2lHOXcwQkFRVUZBRENCCmdURUxNQWtHQTFVRUJoTUNSMEl4R3pBWkJnTlZCQWdURWtkeVpXRjBaWElnVFdGdVkyaGxjM1JsY2pFUU1BNEcKQTFVRUJ4TUhVMkZzWm05eVpERWFNQmdHQTFVRUNoTVJRMDlOVDBSUElFTkJJRXhwYldsMFpXUXhKekFsQmdOVgpCQU1USGtOUFRVOUVUeUJEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQWVGdzB3TmpFeU1ERXdNREF3Ck1EQmFGdzB5T1RFeU16RXlNelU1TlRsYU1JR0JNUXN3Q1FZRFZRUUdFd0pIUWpFYk1Ca0dBMVVFQ0JNU1IzSmwKWVhSbGNpQk5ZVzVqYUdWemRHVnlNUkF3RGdZRFZRUUhFd2RUWVd4bWIzSmtNUm93R0FZRFZRUUtFeEZEVDAxUApSRThnUTBFZ1RHbHRhWFJsWkRFbk1DVUdBMVVFQXhNZVEwOU5UMFJQSUVObGNuUnBabWxqWVhScGIyNGdRWFYwCmFHOXlhWFI1TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUEwRUNMaTNMamtSdjMKVWNFYlZBU1kwNm0vd2VhS1hUdUgrN3VJemczakx6OEdsdkNpS1ZDWnJ0czdvVmV3ZEZGeHplMUNrVTFCL3FuSQoyR3FHZDBTN1dXYVhVRjYwMUN4d1JNL2FONVZDYVR3d3hIR3pVdkFoVGFIWXVqbDhISjZqSkozeWd4YVlxaFo4ClE1c1ZXN2V1TkpIKzFHSW1HRWFhUCt2QitmR1FWK3VzZWcyTDIzSXdhbWJWNEVhamNOeG8yZjhFU0lsMzNyWHAKKzJkdFFlbThPYjB5MldJQzhiR29QVzQzbk9JdjR0T2lKb3ZHdUZWRGlPRWpQcVhTSkRscVI2c0ExS0d6cVNYKwpEVCtuSGJyVFVjRUxwTnFzT085VlVDUUZaVWFUTkU4dGphM0cxQ0VaMG83S0JXRnhCM05INVlvWkVyMEVUYzVPCm5LVklyTHNtOXdJREFRQUJvNEdPTUlHTE1CMEdBMVVkRGdRV0JCUUxXT1dMeGt3Vk42UkFxVENwSWI1SE5scFcKL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekJKQmdOVkhSOEVRakJBTUQ2ZwpQS0E2aGpob2RIUndPaTh2WTNKc0xtTnZiVzlrYjJOaExtTnZiUzlEVDAxUFJFOURaWEowYVdacFkyRjBhVzl1ClFYVjBhRzl5YVhSNUxtTnliREFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBUHBpZW0vWWI2ZGM1dDNpdUhYSVkKU2RPSDVFT0M2ei9KcXZXb3RlOVZmQ0ZTWmZuVkRlRnM5RDZNazNPUkxnTEVUZ2R4YjhDUE9HRUlxQjZCQ3NBdgpJQzlCaTVIY1NFVzg4Y2JldW5ack04Z0FMVEZHVE8zbm5jK0lsUDh6d0Zib0pJWW11Tmc0T044cWE5MFN6TWMvClJ4ZE1vc0lHbGduVzIvNC9QRVpCMzFqaVZnODhPOEVja3pYWk9GS3M3c2pzTGpCT2xEVzBKQjlMZUduYThnSTQKekpWU2svQndKVm1jSUdmRTd2bUxWMkgwa25aOVA0U05WYmZvNWF6VjhmVVpWcVphKzVBY3I1UHI1UnpVWjVkZApCQTYrQzRPbUY0TzVNQktneFRNVkJia04rOGNGZHVQWVNvMzhOQmVqeGlFb3ZqQkZNUjdIZUw1WVlUaXNPK0lCClpRPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPU5ldHdvcmsgU29sdXRpb25zIENlcnRpZmljYXRlIEF1dGhvcml0eSBPPU5ldHdvcmsgU29sdXRpb25zIEwuTC5DLgojIFN1YmplY3Q6IENOPU5ldHdvcmsgU29sdXRpb25zIENlcnRpZmljYXRlIEF1dGhvcml0eSBPPU5ldHdvcmsgU29sdXRpb25zIEwuTC5DLgojIExhYmVsOiAiTmV0d29yayBTb2x1dGlvbnMgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IgojIFNlcmlhbDogMTE2Njk3OTE1MTUyOTM3NDk3NDkwNDM3NTU2Mzg2ODEyNDg3OTA0CiMgTUQ1IEZpbmdlcnByaW50OiBkMzpmMzphNjoxNjpjMDpmYTo2YjoxZDo1OTpiMToyZDo5Njo0ZDowZToxMToyZQojIFNIQTEgRmluZ2VycHJpbnQ6IDc0OmY4OmEzOmMzOmVmOmU3OmIzOjkwOjA2OjRiOjgzOjkwOjNjOjIxOjY0OjYwOjIwOmU1OmRmOmNlCiMgU0hBMjU2IEZpbmdlcnByaW50OiAxNTpmMDpiYTowMDphMzphYzo3YTpmMzphYzo4ODo0YzowNzoyYjoxMDoxMTphMDo3NzpiZDo3NzpjMDo5NzpmNDowMTo2NDpiMjpmODo1OTo4YTpiZDo4Mzo4NjowYwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRDVqQ0NBczZnQXdJQkFnSVFWOHN6YjhKY0Z1WkhGaGZqa0RGbzREQU5CZ2txaGtpRzl3MEJBUVVGQURCaQpNUXN3Q1FZRFZRUUdFd0pWVXpFaE1COEdBMVVFQ2hNWVRtVjBkMjl5YXlCVGIyeDFkR2x2Ym5NZ1RDNU1Ma011Ck1UQXdMZ1lEVlFRREV5ZE9aWFIzYjNKcklGTnZiSFYwYVc5dWN5QkRaWEowYVdacFkyRjBaU0JCZFhSb2IzSnAKZEhrd0hoY05NRFl4TWpBeE1EQXdNREF3V2hjTk1qa3hNak14TWpNMU9UVTVXakJpTVFzd0NRWURWUVFHRXdKVgpVekVoTUI4R0ExVUVDaE1ZVG1WMGQyOXlheUJUYjJ4MWRHbHZibk1nVEM1TUxrTXVNVEF3TGdZRFZRUURFeWRPClpYUjNiM0pySUZOdmJIVjBhVzl1Y3lCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcGRIa3dnZ0VpTUEwR0NTcUcKU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRGt2SDZTTUczRzJJNHJDN3hHenVBbmx0N2UrZm9TMHp3egpjN01FTDd4eGpPV2Z0aUpnUGw5ZHpnbi9nZ3dibWxGUUdpYUozZFZoWFJuY0VnOHRDcUpEWFJmUU5KSWc2blBQCk9Dd0dKZ2w2Y3ZmNlVETDR3cFBUYWFJanprR3h6T1RWSHpiUmlqcjRqR1BpRkZscDdRM1RmMnZvdUFQbFQycmwKbUdOcFNBVytMdjh6dHVtWFdXbjRaeG11azJHV1JCWFRjckEvdkdwOTdFaC9qY09ycW5FclUybEJVelMxc0xuRgpCZ3JFc0VYMVFWMXVpVVY3UFRzbWpIVEM1ZExSZmJJUjFQdFlNaUthZ01uYy9RenBmMTREbDg0N0FCU0hKM0E0CnFZNXVzeWQybUZIZ0JlTWhxeHJWaFNJOEtiV2FGc1dBcVBTN2F6Q1BMMFlDb3JFTUl1RFRBZ01CQUFHamdaY3cKZ1pRd0hRWURWUjBPQkJZRUZDRXd5ZnNBMTA2WTJvZXFLdENuTHJGQU1hZE1NQTRHQTFVZER3RUIvd1FFQXdJQgpCakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NRklHQTFVZEh3UkxNRWt3UjZCRm9FT0dRV2gwZEhBNkx5OWpjbXd1CmJtVjBjMjlzYzNOc0xtTnZiUzlPWlhSM2IzSnJVMjlzZFhScGIyNXpRMlZ5ZEdsbWFXTmhkR1ZCZFhSb2IzSnAKZEhrdVkzSnNNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUM3cmt2bnQxZnJmNm90dDNOSGhXckI1S1VkNU9jOAo2ZlJaWlhlMWVsdGFqU1UyNEhxWExqakFWMkNEbUFhRG43bDJlbTVRNExxSUxQeEZ6Qml3bVpWUkR1d2R1SWovCmgxQWNnc0xqNERLQXY2QUxSOGpETWUrWlp6S0FUeGNoZVF4cFhONWVOSzRDdFNicVVOOS9HR1VzeWZKajRha0gKL254eEgyc3pKR29lQmZjRmFNQnFFc3N1WG1ITHJpalRmc0swWnBFbVh6d3VKRi9MV0EvcktPeXZFWmJ6M0h0dgp3S2VJOGxOM3MyQmVycTRvMmpVc2J6UkYweWJoM3V4YlR5ZHJGbnk5UkFRWWdyT0plUmNRY1QxNm9oWk85UUhOCnBHeGxhS0ZKZGx4RHlkaThObWRzcFpTMTFNeTV2V28xVmlIZTJNUHIrOHVrWUV5d1ZhQ2dlMWV5Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1DT01PRE8gRUNDIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89Q09NT0RPIENBIExpbWl0ZWQKIyBTdWJqZWN0OiBDTj1DT01PRE8gRUNDIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89Q09NT0RPIENBIExpbWl0ZWQKIyBMYWJlbDogIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkiCiMgU2VyaWFsOiA0MTU3ODI4Mzg2NzA4NjY5MjYzODI1NjkyMTU4OTcwNzkzODA5MAojIE1ENSBGaW5nZXJwcmludDogN2M6NjI6ZmY6NzQ6OWQ6MzE6NTM6NWU6Njg6NGE6ZDU6Nzg6YWE6MWU6YmY6MjMKIyBTSEExIEZpbmdlcnByaW50OiA5Zjo3NDo0ZTo5ZjoyYjo0ZDpiYTplYzowZjozMToyYzo1MDpiNjo1NjozYjo4ZToyZDo5MzpjMzoxMQojIFNIQTI1NiBGaW5nZXJwcmludDogMTc6OTM6OTI6N2E6MDY6MTQ6NTQ6OTc6ODk6YWQ6Y2U6MmY6OGY6MzQ6Zjc6ZjA6YjY6NmQ6MGY6M2E6ZTM6YTM6Yjg6NGQ6MjE6ZWM6MTU6ZGI6YmE6NGY6YWQ6YzcKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNpVENDQWcrZ0F3SUJBZ0lRSDBldnFtSUFjRkJVVEFHZW0yT1pLakFLQmdncWhrak9QUVFEQXpDQmhURUwKTUFrR0ExVUVCaE1DUjBJeEd6QVpCZ05WQkFnVEVrZHlaV0YwWlhJZ1RXRnVZMmhsYzNSbGNqRVFNQTRHQTFVRQpCeE1IVTJGc1ptOXlaREVhTUJnR0ExVUVDaE1SUTA5TlQwUlBJRU5CSUV4cGJXbDBaV1F4S3pBcEJnTlZCQU1UCklrTlBUVTlFVHlCRlEwTWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrd0hoY05NRGd3TXpBMk1EQXcKTURBd1doY05Nemd3TVRFNE1qTTFPVFU1V2pDQmhURUxNQWtHQTFVRUJoTUNSMEl4R3pBWkJnTlZCQWdURWtkeQpaV0YwWlhJZ1RXRnVZMmhsYzNSbGNqRVFNQTRHQTFVRUJ4TUhVMkZzWm05eVpERWFNQmdHQTFVRUNoTVJRMDlOClQwUlBJRU5CSUV4cGJXbDBaV1F4S3pBcEJnTlZCQU1USWtOUFRVOUVUeUJGUTBNZ1EyVnlkR2xtYVdOaGRHbHYKYmlCQmRYUm9iM0pwZEhrd2RqQVFCZ2NxaGtqT1BRSUJCZ1VyZ1FRQUlnTmlBQVFEUjNzdmRjbUNGWVg3ZGVTUgpGdFNyWXBuMVBsSUxCczVCQUgrWDRRb2tQQjBCQk80OTBvMEpsd3pnZGVUNiszZUtLdlVEWUVzMml4WWpGcTBKCmNmUks5Q2hRdFA2SUhHNC9iQzh2Q1ZsYnBWc0xNNW5pd3oySitXb3M3N0xUQnVtalFqQkFNQjBHQTFVZERnUVcKQkJSMWNhY1pTQm04blozcVFVZmZsTVJJZDVuVGVUQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFILwpCQVV3QXdFQi96QUtCZ2dxaGtqT1BRUURBd05vQURCbEFqRUE3d05iZXF5M2VBcHl0NGpmLzdWR0ZBa0srcURtCmZRakdHb2U5R0toenZTYktZQXlkenBtZnoxd1BNT0crRkRIcUFqQVU5Sk04U2FjemVwQkdSN05qZlJPYlRyZHYKR0RlQVUvN2RJT0ExbWpiUnh3RzU1dHpkOC84ZExEb1dWOW1TT2RZPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049T0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQSBPPVdJU2VLZXkgT1U9Q29weXJpZ2h0IChjKSAyMDA1L09JU1RFIEZvdW5kYXRpb24gRW5kb3JzZWQKIyBTdWJqZWN0OiBDTj1PSVNURSBXSVNlS2V5IEdsb2JhbCBSb290IEdBIENBIE89V0lTZUtleSBPVT1Db3B5cmlnaHQgKGMpIDIwMDUvT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZAojIExhYmVsOiAiT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQSIKIyBTZXJpYWw6IDg2NzE4ODc3ODcxMTMzMTU5MDkwMDgwNTU1OTExODIzNTQ4MzE0CiMgTUQ1IEZpbmdlcnByaW50OiBiYzo2Yzo1MTozMzphNzplOTpkMzo2Njo2Mzo1NDoxNTo3MjoxYjoyMTo5Mjo5MwojIFNIQTEgRmluZ2VycHJpbnQ6IDU5OjIyOmExOmUxOjVhOmVhOjE2OjM1OjIxOmY4Ojk4OjM5OjZhOjQ2OjQ2OmIwOjQ0OjFiOjBmOmE5CiMgU0hBMjU2IEZpbmdlcnByaW50OiA0MTpjOToyMzo4Njo2YTpiNDpjYTpkNjpiNzphZDo1Nzo4MDo4MTo1ODoyZTowMjowNzo5NzphNjpjYjpkZjo0ZjpmZjo3ODpjZTo4Mzo5NjpiMzo4OTozNzpkNzpmNQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRDhUQ0NBdG1nQXdJQkFnSVFRVDF5eC9Sckg0RkRmZkhTS0ZUZm1qQU5CZ2txaGtpRzl3MEJBUVVGQURDQgppakVMTUFrR0ExVUVCaE1DUTBneEVEQU9CZ05WQkFvVEIxZEpVMlZMWlhreEd6QVpCZ05WQkFzVEVrTnZjSGx5CmFXZG9kQ0FvWXlrZ01qQXdOVEVpTUNBR0ExVUVDeE1aVDBsVFZFVWdSbTkxYm1SaGRHbHZiaUJGYm1SdmNuTmwKWkRFb01DWUdBMVVFQXhNZlQwbFRWRVVnVjBsVFpVdGxlU0JIYkc5aVlXd2dVbTl2ZENCSFFTQkRRVEFlRncwdwpOVEV5TVRFeE5qQXpORFJhRncwek56RXlNVEV4TmpBNU5URmFNSUdLTVFzd0NRWURWUVFHRXdKRFNERVFNQTRHCkExVUVDaE1IVjBsVFpVdGxlVEViTUJrR0ExVUVDeE1TUTI5d2VYSnBaMmgwSUNoaktTQXlNREExTVNJd0lBWUQKVlFRTEV4bFBTVk5VUlNCR2IzVnVaR0YwYVc5dUlFVnVaRzl5YzJWa01TZ3dKZ1lEVlFRREV4OVBTVk5VUlNCWApTVk5sUzJWNUlFZHNiMkpoYkNCU2IyOTBJRWRCSUVOQk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBCk1JSUJDZ0tDQVFFQXkwK3pBSnM5TnQzNTBVbHFheEJKSCt6WUs3TEcrREtCS1VPVlRKb1pJeUVWUmQ3anlCeFIKVlZ1dWsrZzMveXRyNmRUcXZpcmRxRkVyMTJiRFlWeGdBc2oxem5KN083anlUbVVJbXMya2FobkJBYnR6cHRmMgp3OTNOdktTTHRabGh1QUdpbzlSTjFBVTlrYTM0dEFoeFpLOXc4UnhyZnZiRGQ1MGtjM3ZrREl6aDJUYmhtWXNGCm1RdnRSVEVKeXNJQTIvZHlvSmFxbFlmUWpzZTJZWE1OZG1hTTNCdTBZNktmZjVNVE1QR2hKOXZaL3l4VmlKR2cKNEU4SHNDaFdqQmdibDBTT2lkM2dGMjduS3UrUE9Rb3hoSUxZUUJSSkxucEI1S2YrNDJUTXdWbHhTeXdocDF0OQo0QjNSTG9HYnc5aG85NzJXRzZ4d3NSWVVDOXRndVNZQkJRSURBUUFCbzFFd1R6QUxCZ05WSFE4RUJBTUNBWVl3CkR3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVXN3TityamE4c0huUjNKUW10aEcrSWJKcGhwUXcKRUFZSkt3WUJCQUdDTnhVQkJBTUNBUUF3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUV1aC93dUhiclA1d1VPeApTUE1vd0IwdXlRbEIrcFFBSEtTa3EwbFBqejBlNzAxdnZieWs5dkltTU1rUXloMkkrM1FaSDRWRnZiQnNVZmsyCmZ0djFUREk2UVU5YlI4L29DeTIyeEJtZGRNVkh4anRxRDZ3VTJ6ejBjNXlwQmQ4QTNIUjQrdmcxWUZrQ0V4aDgKdlB0TnNDQnRRN3RnTUhwbk0xekZtZEg0TFRsU2MvdU1xcGNsWEhMWkNCNnJUanpqZ1RHZkE2Yjd3UDRwaUZYYQpoTlZRQTdiaWhLT21OcW9ST2dIaEdFdldSR2l6UGZsVGRJU3pScEZHbGdDM2dDeTI0ZU1RNHR1aTV5aVBBWlppCkZqNEE0eHlsTm9FWW9reFNkc0FSbzI3bUhicmpXcjQyVThVK2RZK0dhU2xZVTdXY3UyK2ZYTVVZN04wdjRaakoKL0w3ZkNnMD0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUNlcnRpZ25hIE89RGhpbXlvdGlzCiMgU3ViamVjdDogQ049Q2VydGlnbmEgTz1EaGlteW90aXMKIyBMYWJlbDogIkNlcnRpZ25hIgojIFNlcmlhbDogMTgzNjQ4MDI5NzQyMDkzNjIxNzUKIyBNRDUgRmluZ2VycHJpbnQ6IGFiOjU3OmE2OjViOjdkOjQyOjgyOjE5OmI1OmQ4OjU4OjI2OjI4OjVlOmZkOmZmCiMgU0hBMSBGaW5nZXJwcmludDogYjE6MmU6MTM6NjM6NDU6ODY6YTQ6NmY6MWE6YjI6NjA6Njg6Mzc6NTg6MmQ6YzQ6YWM6ZmQ6OTQ6OTcKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGUzOmI2OmEyOmRiOjJlOmQ3OmNlOjQ4Ojg0OjJmOjdhOmM1OjMyOjQxOmM3OmI3OjFkOjU0OjE0OjRiOmZiOjQwOmMxOjFmOjNmOjFkOjBiOjQyOmY1OmVlOmExOjJkCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEcURDQ0FwQ2dBd0lCQWdJSkFQN2M0d0VQeVVqL01BMEdDU3FHU0liM0RRRUJCUVVBTURReEN6QUpCZ05WCkJBWVRBa1pTTVJJd0VBWURWUVFLREFsRWFHbHRlVzkwYVhNeEVUQVBCZ05WQkFNTUNFTmxjblJwWjI1aE1CNFgKRFRBM01EWXlPVEUxTVRNd05Wb1hEVEkzTURZeU9URTFNVE13TlZvd05ERUxNQWtHQTFVRUJoTUNSbEl4RWpBUQpCZ05WQkFvTUNVUm9hVzE1YjNScGN6RVJNQThHQTFVRUF3d0lRMlZ5ZEdsbmJtRXdnZ0VpTUEwR0NTcUdTSWIzCkRRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRElhUEhKMXRhek5IVW1naDdzdEw3cVhPRW03UkZIWWVHaWZCWjQKUUNIa1lKNWF5R1BoeExHV2t2OFliV2tqNFN0aTk5M2lOaStSQjdsSXp3N3NlYllzNXpSTGNBZ2xvenlIR3hueQpnUWNQT0pBWjB4SCtoclR5MFY0ZUhwYk5nR3pPT3pHVHR2S2cwS21WRW4ybG1zeHJ5SVJXaWpPcDV5SVZVeGJ3CnpCZnNWMS9wb2dxWUNkN2pYNXh2M0VqamhRc1ZXcWE2bjZ4STR3bXk5L1F5M2w0MHZoeDRYVUpiemc0aWowMlEKMTMweUdMTUxMR3Evamo4VUVZa2dEbmNVdFQyVUNJZjNKUjdWc21BQTdHOHFLQ1Z1S2o0WVl4Y2xQejVFSUJiMgpKc2dscmdWS3RPZGpMUE9NRmxOK1hQc1JHZ2pCUm1LZklyanh3bzFwM1BvNldBYmZBZ01CQUFHamdid3dnYmt3CkR3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVUd1MytRVG1RdENSWnZnSHlVdFZGOWxvNTNCRXcKWkFZRFZSMGpCRjB3VzRBVUd1MytRVG1RdENSWnZnSHlVdFZGOWxvNTNCR2hPS1EyTURReEN6QUpCZ05WQkFZVApBa1pTTVJJd0VBWURWUVFLREFsRWFHbHRlVzkwYVhNeEVUQVBCZ05WQkFNTUNFTmxjblJwWjI1aGdna0EvdHpqCkFRL0pTUDh3RGdZRFZSMFBBUUgvQkFRREFnRUdNQkVHQ1dDR1NBR0crRUlCQVFRRUF3SUFCekFOQmdrcWhraUcKOXcwQkFRVUZBQU9DQVFFQWhRTWVrbkgyUXEvaG8yR2U2L1BBRC9LbDFOcVY1dGErYURZOWZtNGZUSXJ2MFE4aApiVjZsVW1QT0V2anZLdHB2NnpmK0V3TEh5enMrSW12YVlTNS8xSEk5M1REaEhreEFHWXdQMTV6Umd6QjdtRm5jCmZjYTVEQ2xNb1RPaTYyYzZaWVRUbHVMdGRrVndqN1VyM3ZrajFrbHVQQlMxeHA4MUhsRFF3WTlxY0VRQ1lzdXUKSFdoQnA2cFg2Rk9xQjlJRzl0VVVCZ3VSQTNVc2JISzFZWldhRFl1NURlZjEzMVROM3ViWTFna0lsMlBsd1M2dwp0MFFtd0NiQXIxVXduanZWTmlvWkJQUmNIdi9QTExmLzBQMkhRQkhWRVNPN1NNQWhxYVFvTGYwVitMQk9LL1F3Cld5SDhFWkUwdmtIdmU1MlhkZitYbGNDV1dDL3F1MGJYdStUWkxnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPURldXRzY2hlIFRlbGVrb20gUm9vdCBDQSAyIE89RGV1dHNjaGUgVGVsZWtvbSBBRyBPVT1ULVRlbGVTZWMgVHJ1c3QgQ2VudGVyCiMgU3ViamVjdDogQ049RGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIgTz1EZXV0c2NoZSBUZWxla29tIEFHIE9VPVQtVGVsZVNlYyBUcnVzdCBDZW50ZXIKIyBMYWJlbDogIkRldXRzY2hlIFRlbGVrb20gUm9vdCBDQSAyIgojIFNlcmlhbDogMzgKIyBNRDUgRmluZ2VycHJpbnQ6IDc0OjAxOjRhOjkxOmIxOjA4OmM0OjU4OmNlOjQ3OmNkOmYwOmRkOjExOjUzOjA4CiMgU0hBMSBGaW5nZXJwcmludDogODU6YTQ6MDg6YzA6OWM6MTk6M2U6NWQ6NTE6NTg6N2Q6Y2Q6ZDY6MTM6MzA6ZmQ6OGM6ZGU6Mzc6YmYKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGI2OjE5OjFhOjUwOmQwOmMzOjk3OjdmOjdkOmE5OjliOmNkOmFhOmM4OjZhOjIyOjdkOmFlOmI5OjY3OjllOmM3OjBiOmEzOmIwOmM5OmQ5OjIyOjcxOmMxOjcwOmQzCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEbnpDQ0FvZWdBd0lCQWdJQkpqQU5CZ2txaGtpRzl3MEJBUVVGQURCeE1Rc3dDUVlEVlFRR0V3SkVSVEVjCk1Cb0dBMVVFQ2hNVFJHVjFkSE5qYUdVZ1ZHVnNaV3R2YlNCQlJ6RWZNQjBHQTFVRUN4TVdWQzFVWld4bFUyVmoKSUZSeWRYTjBJRU5sYm5SbGNqRWpNQ0VHQTFVRUF4TWFSR1YxZEhOamFHVWdWR1ZzWld0dmJTQlNiMjkwSUVOQgpJREl3SGhjTk9Ua3dOekE1TVRJeE1UQXdXaGNOTVRrd056QTVNak0xT1RBd1dqQnhNUXN3Q1FZRFZRUUdFd0pFClJURWNNQm9HQTFVRUNoTVRSR1YxZEhOamFHVWdWR1ZzWld0dmJTQkJSekVmTUIwR0ExVUVDeE1XVkMxVVpXeGwKVTJWaklGUnlkWE4wSUVObGJuUmxjakVqTUNFR0ExVUVBeE1hUkdWMWRITmphR1VnVkdWc1pXdHZiU0JTYjI5MApJRU5CSURJd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUNyQzZNMTRJc3BGTEVVCmhhODhFT1E1YnpWZFNxN2Q2bUdObFVuMGIyU2pHbUJtcEtsQUlvVFoxS1hsZUpNT2FBR3R1VTFjT3M3VHVLaEMKUU4vUG83cUNXV3FTRzZ3Y210b0lLeVVuK1dralIvSGc2eXg2bS9VVEF0QitOSHpDbmp3QVdhdjEyZ3oxTWp3cgpyRkRhMXNQZWc1VEtxQXlaTWc0SVNGWmJhdnZhNFZoWUFVbGZja0U4RlFZQmpsMnRxcmlUdE0yZTY2Zm9haTFTCk5OczY3MXgxVWRyYjh6SDU3bkdZTXNSVUZVUU0rWnRWN2EzZkdBaWdvNGFLU2U1VEJZOFpUTlhlV0htYjBtb2MKUXF2RjFhZlBhQStXNU9GaG1IWmh5SkY4MWo0QTRwRlFoK0dkQ3VhdGw5SWR4anA5eTd6YUF6VFZqbHNCOVdvSAp0eGEyYmtwL0FnTUJBQUdqUWpCQU1CMEdBMVVkRGdRV0JCUXh3M2tidXZWVDF4ZmdpWG90RjJ3S3N5dWRNekFQCkJnTlZIUk1FQ0RBR0FRSC9BZ0VGTUE0R0ExVWREd0VCL3dRRUF3SUJCakFOQmdrcWhraUc5dzBCQVFVRkFBT0MKQVFFQWxHUlpyVGxrNXluckUvNWF3NHNUVjhnRUpQQjBkOEJnNDJmNzZZbW1nNytXZ254dTFNTTk3NTZBYnJzcAp0Smg2c1R0VTZ6a1hSMzRhamd2OEh6RlpNUVN5emhmekxNZGlObFhpSXRpSlZiU1lTS3BrK3RZY050aEVlRnBhCkl6cFhsL1Y2TUUrdW4ycE1TeXVPb0FQalB1Q3AxTko3MHJPbzRuSThyWjcvZ0Zua20wVzA5anV3elRrWm1ETGwKNmlGaGtPUXhJWTQwc2Zjdk5VcUZFTnJuaWpjaHZsbGo0UEtGaURGVDFGUVVoWEI1OUM0R2R5ZDFMeCs0aXZuKwp4YnJZTnVTRDdPZGx0NzlqV3ZOR3I0R1VOOVJCak5ZajFoN1A5V2diUkdPaVdycW5OVm1oNVhBRm13NGpWNW1VCkNtMjZPV01vaHBMekdJVFkrOUhQQlZaa1Z3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUN5YmVydHJ1c3QgR2xvYmFsIFJvb3QgTz1DeWJlcnRydXN0LCBJbmMKIyBTdWJqZWN0OiBDTj1DeWJlcnRydXN0IEdsb2JhbCBSb290IE89Q3liZXJ0cnVzdCwgSW5jCiMgTGFiZWw6ICJDeWJlcnRydXN0IEdsb2JhbCBSb290IgojIFNlcmlhbDogNDgzNTcwMzI3ODQ1OTY4Mjg3NzQ4NDM2MAojIE1ENSBGaW5nZXJwcmludDogNzI6ZTQ6NGE6ODc6ZTM6Njk6NDA6ODA6Nzc6ZWE6YmM6ZTM6ZjQ6ZmY6ZjA6ZTEKIyBTSEExIEZpbmdlcnByaW50OiA1Zjo0MzplNTpiMTpiZjpmODo3ODo4YzphYzoxYzpjNzpjYTo0YTo5YTpjNjoyMjoyYjpjYzozNDpjNgojIFNIQTI1NiBGaW5nZXJwcmludDogOTY6MGE6ZGY6MDA6NjM6ZTk6NjM6NTY6NzU6MGM6Mjk6NjU6ZGQ6MGE6MDg6Njc6ZGE6MGI6OWM6YmQ6NmU6Nzc6NzE6NGE6ZWE6ZmI6MjM6NDk6YWI6Mzk6M2Q6YTMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURvVENDQW9tZ0F3SUJBZ0lMQkFBQUFBQUJENFdxTFVnd0RRWUpLb1pJaHZjTkFRRUZCUUF3T3pFWU1CWUcKQTFVRUNoTVBRM2xpWlhKMGNuVnpkQ3dnU1c1ak1SOHdIUVlEVlFRREV4WkRlV0psY25SeWRYTjBJRWRzYjJKaApiQ0JTYjI5ME1CNFhEVEEyTVRJeE5UQTRNREF3TUZvWERUSXhNVEl4TlRBNE1EQXdNRm93T3pFWU1CWUdBMVVFCkNoTVBRM2xpWlhKMGNuVnpkQ3dnU1c1ak1SOHdIUVlEVlFRREV4WkRlV0psY25SeWRYTjBJRWRzYjJKaGJDQlMKYjI5ME1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBK01pOHZSUlFaaFAvOE5ONQo3Q1B5dHhySGpvWHhFbk9tR2FvUTI1eWlaWFJhZHo1UmZWYjIzQ08yMU8xZldMRTNUZFZKRG03MWFvZlcwb3pTCko4YmkvemFmbUdXZ0UwN0dLbVNiMVpBU3p4UUc5RHZqMUNpKzZBNzRxMDVJbEcyT2xURVFYTzJpTGIzVk9tMnkKSEx0Z3dFWkxBZlZKcm41R2l0QjBqYUVNQXM3dS9PZVB1R3RtODM5RUFMOW1KUlFyM1JBd0hRZVdQMDMyYTdpUAp0M3NNcFRqcjNrZmIxVjA1L0lpbjg5Y3FkUEhvV3FJN24xQzZwb3hGTmNKUVpaWGNZNEx2M2I5M1RaeGl5V056CkZ0QXBEMG1wU1BDenFyZHN4YWN3T1VCZHJzVGlYU1pUOE00Y0l3aGhxSlFadWdSaVFPd2ZPSEIzRWdaeHB6QVkKWFNVbnBRSURBUUFCbzRHbE1JR2lNQTRHQTFVZER3RUIvd1FFQXdJQkJqQVBCZ05WSFJNQkFmOEVCVEFEQVFILwpNQjBHQTFVZERnUVdCQlMyQ0hzTmVzeXNJRXlHVmpKZXo2dHVoUzF3VnpBL0JnTlZIUjhFT0RBMk1EU2dNcUF3CmhpNW9kSFJ3T2k4dmQzZDNNaTV3ZFdKc2FXTXRkSEoxYzNRdVkyOXRMMk55YkM5amRDOWpkSEp2YjNRdVkzSnMKTUI4R0ExVWRJd1FZTUJhQUZMWUlldzE2ekt3Z1RJWldNbDdQcTI2RkxYQlhNQTBHQ1NxR1NJYjNEUUVCQlFVQQpBNElCQVFCVzd3b2pvRlJPbFpmSitJbmFSY0hVb3dBbDlCOFRxN2VqaFZocHdqQ3QyQldLTGVQSnpZRmErSE1qCldxZDhCZlA5SWpzTzBRYkUyelpNY3dTTzViQWk1TVh6THFYWkkrTzRUa29ncDI0Q0pKOGlZR2Q3aXgxeUNjVXgKWE9sNW40QkhQYTJoQ3djVVBVZi9BMmthREF0RTUyTWxwMyt5eWJoMmhPMGo5bjBIcTBWKzA5K3p2K21LdHMybwpvbWNyVXRXM1pmQTVUR09na1htVFVnOVUzWU83bjlHUHAxTnp3OHYvTU94OEJMallSQitUWDNFSklyZHVQdW9jCkEwNmRHaUJoKzRFMzdGNzhDa1dyMStjWFZkQ2c2bUNicHZiampGc3B3Z1pnRkowdGwweXBreFdkWWNRQlgwalcKV0wxV01SSk9FY2doNExNUmtXWGJ0S2FJT001VgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogTz1DaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLiBPVT1lUEtJIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBTdWJqZWN0OiBPPUNodW5naHdhIFRlbGVjb20gQ28uLCBMdGQuIE9VPWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIExhYmVsOiAiZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IgojIFNlcmlhbDogMjg5NTYwODg2ODI3MzUxODk2NTUwMzA1MjkwNTczNTI3NjA0NzcKIyBNRDUgRmluZ2VycHJpbnQ6IDFiOjJlOjAwOmNhOjI2OjA2OjkwOjNkOmFkOmZlOjZmOjE1OjY4OmQzOjZiOmIzCiMgU0hBMSBGaW5nZXJwcmludDogNjc6NjU6MGQ6ZjE6N2U6OGU6N2U6NWI6ODI6NDA6YTQ6ZjQ6NTY6NGI6Y2Y6ZTI6M2Q6Njk6YzY6ZjAKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGMwOmE2OmY0OmRjOjYzOmEyOjRiOmZkOmNmOjU0OmVmOjJhOjZhOjA4OjJhOjBhOjcyOmRlOjM1OjgwOjNlOjJmOmY1OmZmOjUyOjdhOmU1OmQ4OjcyOjA2OmRmOmQ1Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGc0RDQ0E1aWdBd0lCQWdJUUZjaTlaVWRjcjdpWEFGN2tCdEs4blRBTkJna3Foa2lHOXcwQkFRVUZBREJlCk1Rc3dDUVlEVlFRR0V3SlVWekVqTUNFR0ExVUVDZ3dhUTJoMWJtZG9kMkVnVkdWc1pXTnZiU0JEYnk0c0lFeDAKWkM0eEtqQW9CZ05WQkFzTUlXVlFTMGtnVW05dmRDQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRBZQpGdzB3TkRFeU1qQXdNak14TWpkYUZ3MHpOREV5TWpBd01qTXhNamRhTUY0eEN6QUpCZ05WQkFZVEFsUlhNU013CklRWURWUVFLREJwRGFIVnVaMmgzWVNCVVpXeGxZMjl0SUVOdkxpd2dUSFJrTGpFcU1DZ0dBMVVFQ3d3aFpWQkwKU1NCU2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1JSUNJakFOQmdrcWhraUc5dzBCQVFFRgpBQU9DQWc4QU1JSUNDZ0tDQWdFQTRTVVA3bzNiaUROMVo4MnRIMzA2VG0yZDB5OFU4Mk4weXdFaGFqZnFoRkFIClN5WmJDVU5zSVo1cXlOVUQ5V0Jwajh6d0l1UWY1L2RxSWpHM0xCWHk0UDRBYWtQL2gyWEd0UnJCcDB4dEluQWgKaWpIeWwzU0pDUkltSEo3SzJSS2lsVHphNldlL0NLQms0OVpDdDBYdmwvVDI5ZGUxU2hVQ1dIMllXRXRndk0zWApEWm9UTTFQUllmbDYxZGQ0czVvejl3Q0d6aDFObERpdnFPeDRVWENLWEJDRFVTSDNFVDAwaGw3bFNNMlhnWUkxClRCbnNaZlpyeFFXaDdrY1Qxck1oSjVRUUN0a2tPN3ErUkJOR01EK1hQTmpYMTJydU96ampLOVNYRHJrYjV3ZEoKZnpjcStYZDR6MVR0VzBhZG80QU9rVVBCMWx0ZkZMcWZwbzBrUjBCWnYzSTRzalpzTi8rWjBWME9XUXFyYWZmQQpzZ1JGZWxRQXJyNVQ5clhuNGZnOG96SFNxZjRoVW1URnBtZndkUWNHbEJTQlZjWW41QUdQRjhGcWNkZStTL3VVCldIMStFVE94UXZkaWJCald6d2xvUG45czloNlBZcTJsWTlzSnB4OGlRa0VlYjVtS1B0ZjVQMEI2ZWJDbEFaTFMKblQwSUZhVVFBUzJ6TW5hb2xRMnplcHI3QnhCNEVXL2hqOGU2RHlVYWRDcmxISmhCbWQ4aGgraVZCbW9LczJwSApkbVgyT3MrUFloY1pld29velJyU2d4NGh4eXkvdnY5aGFMZG5HN3Q0VFkzT1orWGt3WTYzSTJiaW5aQjFOSmlwCk5pdUttcFM1bmV6TWlySDRKWWxjV3JZdmpCOXRlU1NuVW1qRGhEWGlabzFqRGlWTjFSbXk1bmszcHlLZFZERUMKQXdFQUFhTnFNR2d3SFFZRFZSME9CQllFRkI0TTk3Wm44dUdTSmdsRndGVTVMbmMvUWtxaU1Bd0dBMVVkRXdRRgpNQU1CQWY4d09RWUVaeW9IQUFReE1DOHdMUUlCQURBSkJnVXJEZ01DR2dVQU1BY0dCV2NxQXdBQUJCUkZzTUxICkNsWjg3bHQ0REpYNUdGUEJwaHpZRURBTkJna3Foa2lHOXcwQkFRVUZBQU9DQWdFQUNiT0RVMWtCUHBWSnVmR0IKdXZsMklDTzFKMkIwMUdxWk5GNXNBRlBabi9LbXNTUUhSR29xeHFXT2VCTG9SOWxZR3hNcVhubWJud29xWjZZbApQd1pwVm5QRGltWkkreW1CVjNRR3lwenFLT2c0WnlZcjhkVzFQMldUK0RaZGpvMk5RQ0NIR2Vydko4QTl0RGtQCkpYdG9VSFJWbkF4WmZWbzlRWlFsVWdqZ1J5d1ZNUm5WdndkVnhyc1N0WmYwWDRPRnVuSEIyV3lCRVhZS0NyQy8KZ3BmMzZqMzYrdXd0cVNpVU8xYmQwbEV1cnNDOUNCV01kMUkwbHRhYnJOTWRqbUVQTlh1YnJqbHBDMkpnUUNBMgpqNi83TnU0dENFb2R1TCtiWFBqcXBSdWdjNmJZK0c3Z013UmZhS29uaCszWndaQ2M3YjNqYWpXdlk5K3JHTm02CjV1bEs2bENLRDJHVEh1SXRHZUl3bERXU1hRNjJCNjhaZ0k5SGtGRkxMazNkaGVMU0NsSUtGNXI4R3JCUUF1VUIKbzJNM0lVeEV4SnRSbVJFT2M1d0dqMVF1cHloZVJEbUhWaTAzdllWRWxPRU1TeXljdzVLRk5HSExEN2liU2tOUwovalE2ZmJqcEtkeDJxY2d3K0JSeGdNWWVOa2gwSWtGY2g0TG9HSEdMUVlsRTUzNVlXNmk0alJQcHAyekRSKzJ6CkdwMWlybzJDNnBTZTNWa1F3NjNkNGszak1kWEg3T2p5c1A2U0hoWUtHdnpaOC9nbnRzbStIYlJzWkpCLzlPVEUKVzljM3JrSU8zYVFhYjN5SVZNVVdidUY2YUM3NE9yOE5wRHlKTzNpblRtT0RCQ0VJWjQzeWdrblFXLzJ4elErRApoTlErSUlYM1NqMHJuUDBxQ2dsTjZvSDRFWnc9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBPPWNlcnRTSUdOIE9VPWNlcnRTSUdOIFJPT1QgQ0EKIyBTdWJqZWN0OiBPPWNlcnRTSUdOIE9VPWNlcnRTSUdOIFJPT1QgQ0EKIyBMYWJlbDogImNlcnRTSUdOIFJPT1QgQ0EiCiMgU2VyaWFsOiAzNTIxMDIyNzI0OTE1NAojIE1ENSBGaW5nZXJwcmludDogMTg6OTg6YzA6ZDY6ZTk6M2E6ZmM6Zjk6YjA6ZjU6MGM6Zjc6NGI6MDE6NDQ6MTcKIyBTSEExIEZpbmdlcnByaW50OiBmYTpiNzplZTozNjo5NzoyNjo2MjpmYjoyZDpiMDoyYTpmNjpiZjowMzpmZDplODo3Yzo0YjoyZjo5YgojIFNIQTI1NiBGaW5nZXJwcmludDogZWE6YTk6NjI6YzQ6ZmE6NGE6NmI6YWY6ZWI6ZTQ6MTU6MTk6NmQ6MzU6MWM6Y2Q6ODg6OGQ6NGY6NTM6ZjM6ZmE6OGE6ZTY6ZDc6YzQ6NjY6YTk6NGU6NjA6NDI6YmIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURPRENDQWlDZ0F3SUJBZ0lHSUFZRkZuQUNNQTBHQ1NxR1NJYjNEUUVCQlFVQU1Ec3hDekFKQmdOVkJBWVQKQWxKUE1SRXdEd1lEVlFRS0V3aGpaWEowVTBsSFRqRVpNQmNHQTFVRUN4TVFZMlZ5ZEZOSlIwNGdVazlQVkNCRApRVEFlRncwd05qQTNNRFF4TnpJd01EUmFGdzB6TVRBM01EUXhOekl3TURSYU1Ec3hDekFKQmdOVkJBWVRBbEpQCk1SRXdEd1lEVlFRS0V3aGpaWEowVTBsSFRqRVpNQmNHQTFVRUN4TVFZMlZ5ZEZOSlIwNGdVazlQVkNCRFFUQ0MKQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFMY3p1WDdJSlVxT3RkdTBLQnVxVjVEbwowU0xUWkxyVGsralVySVpoUUdwZ1YyaFVoRTI4YWxRQ0JmL2ZtNW9xcmwwSGowckRLSC92K3l2NmVmSEhyZkFRClV5U1FpMmJKcUlpcnIxcWpBT20rdWtidVczTjdMQmVDZ1Y1aUxLRUNaYk85eFNzQWZzVDhBek5YRGUzaStzNWQKUmRZNHpUVzJzc0hRbklGS3F1U3lBVndkajErWnhMR3QyNGdoNjVBSWdvRHpNS05ENXBDQ3JsVW9TZTFiMTZrUQpPQTcrajB4Ym0wYnFRZld3Q0hURDBJZ3p0bnpYZE4vY2hORkREblU1b1NWQUtPcDR5dzRzTGptZGpJdHVGaHd2CkpvSVE0dU5sbEFvRXdGNzNYVnY0RU9MUXVucEwrOTQzQUFBYVd5amowcHh6UGpLSG1LSEpVUy9YM3F3enMwOEMKQXdFQUFhTkNNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FjWXdIUVlEVlIwTwpCQllFRk9DTW05c2xTYlB4ZkliV3NrS0hDOUJyb05ua01BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQSswaHlKCkxqWDgrSFhkNW45bGlQUnlUTWtzMXpKTzg5MFplVWU5amp0Ymt3OVFTU1FUYXhRR2N1OEowNkdoNDBDRXllY1kKTW5ROFNHNFBuMHZVOXg3VGs0WmtWSmRqY2xEVlZjLzZJSk1Db3B2REk1Tk9GbFYyb0hCNWJjMGhIODh2TGJ3Wgo0NGd4K0ZrYWdRbklsNloweDJERVc4eFhqckoxL1JzQ0NkdFpiM0tUYWZjeFFkYUlPTCtIc3IwV2VmbXE1TDZJCkpkMWhKeU1jdFRFSEJEYTBHcEM5b0hSeFVJbHR2QlRqRDRhdThhcyt4NkFKektOSTBlRGJaT2VTdGMrdmNrTncKaS9uRGhEd1RxbjZTbTFkVGsvcHd3cEVPTWZtYloxM3BsamhlWDdOelRvZ1ZaOTZlZGhCaUlMNVZhWlZEQURsTgo5dTZ3V2s1SlJGUllYMEtECi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1HZW9UcnVzdCBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzMgTz1HZW9UcnVzdCBJbmMuIE9VPShjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIFN1YmplY3Q6IENOPUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMyBPPUdlb1RydXN0IEluYy4gT1U9KGMpIDIwMDggR2VvVHJ1c3QgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgTGFiZWw6ICJHZW9UcnVzdCBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzMiCiMgU2VyaWFsOiAyODgwOTEwNTc2OTkyODU2NDMxMzk4NDA4NTIwOTk3NTg4NTU5OQojIE1ENSBGaW5nZXJwcmludDogYjU6ZTg6MzQ6MzY6Yzk6MTA6NDQ6NTg6NDg6NzA6NmQ6MmU6ODM6ZDQ6Yjg6MDUKIyBTSEExIEZpbmdlcnByaW50OiAwMzo5ZTplZDpiODowYjplNzphMDozYzo2OTo1Mzo4OTozYjoyMDpkMjpkOTozMjozYTo0YzoyYTpmZAojIFNIQTI1NiBGaW5nZXJwcmludDogYjQ6Nzg6Yjg6MTI6MjU6MGQ6Zjg6Nzg6NjM6NWM6MmE6YTc6ZWM6N2Q6MTU6NWU6YWE6NjI6NWU6ZTg6Mjk6MTY6ZTI6Y2Q6Mjk6NDM6NjE6ODg6NmM6ZDE6ZmI6ZDQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQvakNDQXVhZ0F3SUJBZ0lRRmF4dWxCbXllVXRCOWllcHd4Z1BIekFOQmdrcWhraUc5dzBCQVFzRkFEQ0IKbURFTE1Ba0dBMVVFQmhNQ1ZWTXhGakFVQmdOVkJBb1REVWRsYjFSeWRYTjBJRWx1WXk0eE9UQTNCZ05WQkFzVApNQ2hqS1NBeU1EQTRJRWRsYjFSeWRYTjBJRWx1WXk0Z0xTQkdiM0lnWVhWMGFHOXlhWHBsWkNCMWMyVWdiMjVzCmVURTJNRFFHQTFVRUF4TXRSMlZ2VkhKMWMzUWdVSEpwYldGeWVTQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHYKY21sMGVTQXRJRWN6TUI0WERUQTRNRFF3TWpBd01EQXdNRm9YRFRNM01USXdNVEl6TlRrMU9Wb3dnWmd4Q3pBSgpCZ05WQkFZVEFsVlRNUll3RkFZRFZRUUtFdzFIWlc5VWNuVnpkQ0JKYm1NdU1Ua3dOd1lEVlFRTEV6QW9ZeWtnCk1qQXdPQ0JIWlc5VWNuVnpkQ0JKYm1NdUlDMGdSbTl5SUdGMWRHaHZjbWw2WldRZ2RYTmxJRzl1YkhreE5qQTAKQmdOVkJBTVRMVWRsYjFSeWRYTjBJRkJ5YVcxaGNua2dRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrZwpMU0JITXpDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTnppWG1KWUhUTlhPVEl6Cit1dkxoNHluMUVyZEJvanFaSTR4bUtVNGtCNll6eTVqSy9CR3ZFU3lpYUhBS0F4SmNDR1ZuMlRBcHBNU0FtVW0KaHNhbGlmRDYxNFNnY0s5UEdwYy9Ca1RWeWV0eUVIM2tNU2o3SEdIbUtBZEVjNUlpYWFjRGlHeWRZOGhTMnBnbgo1d2hNY0Q2MHlSTEJ4V2VEWFRQekF4SHNhdEJUNHRHNk5tQ1VnTHRoWTJ4YkYzN2ZRSlFlcXczQ0lTaHdpUC9XCkpteHNZQVFsVGxWK2ZlKy9sRWpldHgzZGNJMEZYNGlsbS9MQzd1clJRRUZ0WWpnZFZnYkZBMGRSSUJuOGV4QUwKRG1LdWRsVy9YM2UrUGtrQlV6MllKUU4ySkZvZHROdUo2bm5sdHJNN1A3cE1LRUYvQnF4cWpzSFE5Z1VkZmVaQwpodU9sMVVjQ0F3RUFBYU5DTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3CkhRWURWUjBPQkJZRUZNUjV5bzZoVGdNZEhOeHIyekZibEQ0L01IOHRNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUIKQVFBdHhSUFBWb0I3ZW5pOW42NHNtZWZ2MnQrVVhnbHBwK2R1YUl5OWNyNUhxUTZYRXJoSzhXVFRPZDhsTk5UQgp6VTZCOEE4RXhDU3pOSmJHcHFvdzMyaGhjOWY1am9XSjd3NWVsU2hLS2llUEVJNHVmSWJFQXA3YURIZGxEa1FOCmt2MzlzeFkyK2hFTkhZd09CNGxxS1ZiM2N2VGRGWngzTldaWHF4TlQySTdCUU1YWEV4WmFjc2UzYVFIRWVyR0QKQVdoOWpVR2hsQmpCSlZ6ODhQNkRBb2Q4RFEzUExnaGNTa0FOUHV5QlllWWsyOHJnRGkwSHNqNVczSTMxUVlVSApTSnNNQzh0SlAzM3N0LzNMaldlSkdxdnR1eDZqQUFnSUZ5cUNYREZkUm9vdEQ0YWJkTmxGKzlSQXNYcXFhQzJHCnNwa2k0Y0VyeDV6NDgxK29naExyR1JFdAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049dGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcyIE89dGhhd3RlLCBJbmMuIE9VPShjKSAyMDA3IHRoYXd0ZSwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgU3ViamVjdDogQ049dGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcyIE89dGhhd3RlLCBJbmMuIE9VPShjKSAyMDA3IHRoYXd0ZSwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgTGFiZWw6ICJ0aGF3dGUgUHJpbWFyeSBSb290IENBIC0gRzIiCiMgU2VyaWFsOiA3MTc1ODMyMDY3MjgyNTQxMDAyMDY2MTYyMTA4NTI1NjQ3MjQwNgojIE1ENSBGaW5nZXJwcmludDogNzQ6OWQ6ZWE6NjA6MjQ6YzQ6ZmQ6MjI6NTM6M2U6Y2M6M2E6NzI6ZDk6Mjk6NGYKIyBTSEExIEZpbmdlcnByaW50OiBhYTpkYjpiYzoyMjoyMzo4ZjpjNDowMTphMToyNzpiYjozODpkZDpmNDoxZDpkYjowODo5ZTpmMDoxMgojIFNIQTI1NiBGaW5nZXJwcmludDogYTQ6MzE6MGQ6NTA6YWY6MTg6YTY6NDQ6NzE6OTA6Mzc6MmE6ODY6YWY6YWY6OGI6OTU6MWY6ZmI6NDM6MWQ6ODM6N2Y6MWU6NTY6ODg6YjQ6NTk6NzE6ZWQ6MTU6NTcKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNpRENDQWcyZ0F3SUJBZ0lRTmZ3bVhObUVUOGs5SmoxWG02N1hWakFLQmdncWhrak9QUVFEQXpDQmhERUwKTUFrR0ExVUVCaE1DVlZNeEZUQVRCZ05WQkFvVERIUm9ZWGQwWlN3Z1NXNWpMakU0TURZR0ExVUVDeE12S0dNcApJREl3TURjZ2RHaGhkM1JsTENCSmJtTXVJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sSUc5dWJIa3hKREFpCkJnTlZCQU1URzNSb1lYZDBaU0JRY21sdFlYSjVJRkp2YjNRZ1EwRWdMU0JITWpBZUZ3MHdOekV4TURVd01EQXcKTURCYUZ3MHpPREF4TVRneU16VTVOVGxhTUlHRU1Rc3dDUVlEVlFRR0V3SlZVekVWTUJNR0ExVUVDaE1NZEdoaApkM1JsTENCSmJtTXVNVGd3TmdZRFZRUUxFeThvWXlrZ01qQXdOeUIwYUdGM2RHVXNJRWx1WXk0Z0xTQkdiM0lnCllYVjBhRzl5YVhwbFpDQjFjMlVnYjI1c2VURWtNQ0lHQTFVRUF4TWJkR2hoZDNSbElGQnlhVzFoY25rZ1VtOXYKZENCRFFTQXRJRWN5TUhZd0VBWUhLb1pJemowQ0FRWUZLNEVFQUNJRFlnQUVvdFdjZ251Vm5mRlNlSWYraWhhLwpCZWJmb3dKUERRZkdBRkc2REFKU0xTS2tRam5FL28vcXljRysxRTMvbjNxZTRyRjhtcTJuaGdsemg5SG5tdU42CnBhcHUrN3F6Y01CbmlLSTExS09hc2YydHd1OHgrcWk1OC9zSXhwSFIreW1WbzBJd1FEQVBCZ05WSFJNQkFmOEUKQlRBREFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQkJqQWRCZ05WSFE0RUZnUVVtdGdBTUFEbmEzK0ZHTzZMdHM2SwpEUGdSNGJzd0NnWUlLb1pJemowRUF3TURhUUF3WmdJeEFOMzQ0RmRIVzZmbUNzTzk5WUNLbHpVTkc0azhWSVozCktNcWg5SG5ldGVZNHNQQmxjSXgvQWxUQ3YvL1lvVDdaendJeEFNU05sUHpjVTlMY25YZ1dIeFV6STFOUzQxb3gKWFozS3JyMFRLVVFOSjF1bzUyaWNFdmRZUHk1eUFsZWpqNkVVTGc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049dGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczIE89dGhhd3RlLCBJbmMuIE9VPUNlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24vKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBTdWJqZWN0OiBDTj10aGF3dGUgUHJpbWFyeSBSb290IENBIC0gRzMgTz10aGF3dGUsIEluYy4gT1U9Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbi8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIExhYmVsOiAidGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczIgojIFNlcmlhbDogMTI3NjE0MTU3MDU2NjgxMjk5ODA1NTU2NDc2Mjc1OTk1NDE0Nzc5CiMgTUQ1IEZpbmdlcnByaW50OiBmYjoxYjo1ZDo0Mzo4YTo5NDpjZDo0NDpjNjo3NjpmMjo0Mzo0Yjo0NzplNzozMQojIFNIQTEgRmluZ2VycHJpbnQ6IGYxOjhiOjUzOjhkOjFiOmU5OjAzOmI2OmE2OmYwOjU2OjQzOjViOjE3OjE1Ojg5OmNhOmYzOjZiOmYyCiMgU0hBMjU2IEZpbmdlcnByaW50OiA0YjowMzpmNDo1ODowNzphZDo3MDpmMjoxYjpmYzoyYzphZTo3MTpjOTpmZDplNDo2MDo0YzowNjo0YzpmNTpmZjpiNjo4NjpiYTplNTpkYjphYTpkNzpmZDpkMzo0YwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUtqQ0NBeEtnQXdJQkFnSVFZQUdYdDBhbjZyUzBtdFpMTC9lUSt6QU5CZ2txaGtpRzl3MEJBUXNGQURDQgpyakVMTUFrR0ExVUVCaE1DVlZNeEZUQVRCZ05WQkFvVERIUm9ZWGQwWlN3Z1NXNWpMakVvTUNZR0ExVUVDeE1mClEyVnlkR2xtYVdOaGRHbHZiaUJUWlhKMmFXTmxjeUJFYVhacGMybHZiakU0TURZR0ExVUVDeE12S0dNcElESXcKTURnZ2RHaGhkM1JsTENCSmJtTXVJQzBnUm05eUlHRjFkR2h2Y21sNlpXUWdkWE5sSUc5dWJIa3hKREFpQmdOVgpCQU1URzNSb1lYZDBaU0JRY21sdFlYSjVJRkp2YjNRZ1EwRWdMU0JITXpBZUZ3MHdPREEwTURJd01EQXdNREJhCkZ3MHpOekV5TURFeU16VTVOVGxhTUlHdU1Rc3dDUVlEVlFRR0V3SlZVekVWTUJNR0ExVUVDaE1NZEdoaGQzUmwKTENCSmJtTXVNU2d3SmdZRFZRUUxFeDlEWlhKMGFXWnBZMkYwYVc5dUlGTmxjblpwWTJWeklFUnBkbWx6YVc5dQpNVGd3TmdZRFZRUUxFeThvWXlrZ01qQXdPQ0IwYUdGM2RHVXNJRWx1WXk0Z0xTQkdiM0lnWVhWMGFHOXlhWHBsClpDQjFjMlVnYjI1c2VURWtNQ0lHQTFVRUF4TWJkR2hoZDNSbElGQnlhVzFoY25rZ1VtOXZkQ0JEUVNBdElFY3oKTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFzcjhuTFB2YjJGdmRlSHNibm5kbQpnY3Mrdkh5dTg2WW5talNqYURGeE9ETmk1UE54Wm5teHFXV2pwWXZWajJBdFAwTE1xbXN5d0NQTExFSGQ1Ti84CllaemljN0lpbFJGREdGL0V0aDlYYkFvRldDTElOa3c2ZktYUno0YXZpS2RFQWhOMGNYTUtRbGtDK0JzVWEwTGYKYjErNmE0S2luVnZuU3IwZUFYTGJTM1RvTzM5L2ZSOEV0Q2FiNExSYXJFYzlWYmpYc0NaU0tBRXhRR2JZMlNTOQo5aXJZN0NGSlhKdjJldWwvVlRWK2xtdU5rNU1ueTVLNzZxeEF3Si9DK0lEUFhmUmEzTTUwaHFZK2JBdFR5cjJTCnpoa0djdVlNWERocHh3VFd2R3pPVy9iM2FKemNKUlZJaUtIcHFmaVluT0R6MVRFb1lSRnNaNWFOT1puTHdrVWsKT1FJREFRQUJvMEl3UURBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUJCakFkQmdOVgpIUTRFRmdRVXJXeXFsR0NjN2VULytqNEtkQ3RqQS9lMldiOHdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBQnBBCjJKVmxyQW1TaWNZNTlCRGxxUTVtVTExNDN2b2trYnZuUkZIZnhoWTBDdTlxUkZIcUt3ZUtBM3JENno4S0xGSVcKb0N0RHVTV1FQM0NwTXlWdFJSb29PeWZQcXNNcFFodmZPMHpBTXpSYlFZaS9heXRscnlqdnN2WERxbWJPZTFidQp0OGpMWjhISm5Cb1l1TVREU1FQeFlBNVF6VWJGODNkNTk3WVY0RGpieHk4b29Bdy9keVowMlNVUzJqSGFHaDdjCktVR1JJanhwcDdzQzhyWmNKd09KOUFicW0rUnlndU9oQ2NIcEFCblRQdFJ3YTdweHBxcFlydlM3Nld5Mjc0Zk0KbTd2L09lWldZZE1LcDhSY1RHQjdCWGNtZXIvWUIxSXNZdmR3WTlrNXZHOGN3bm5jZGltdnpzVXNaQVJlaURadQpNZFJBR21JME5qODFBYTZzWTZBPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyIE89R2VvVHJ1c3QgSW5jLiBPVT0oYykgMjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBTdWJqZWN0OiBDTj1HZW9UcnVzdCBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIgTz1HZW9UcnVzdCBJbmMuIE9VPShjKSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIExhYmVsOiAiR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyIgojIFNlcmlhbDogODA2ODI4NjMyMDMzODEwNjU3ODIxNzc5MDg3NTE3OTQ2MTkyNDMKIyBNRDUgRmluZ2VycHJpbnQ6IDAxOjVlOmQ4OjZiOmJkOjZmOjNkOjhlOmExOjMxOmY4OjEyOmUwOjk4OjczOjZhCiMgU0hBMSBGaW5nZXJwcmludDogOGQ6MTc6ODQ6ZDU6Mzc6ZjM6MDM6N2Q6ZWM6NzA6ZmU6NTc6OGI6NTE6OWE6OTk6ZTY6MTA6ZDc6YjAKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDVlOmRiOjdhOmM0OjNiOjgyOmEwOjZhOjg3OjYxOmU4OmQ3OmJlOjQ5Ojc5OmViOmYyOjYxOjFmOjdkOmQ3OjliOmY5OjFjOjFjOjZiOjU2OjZhOjIxOjllOmQ3OjY2Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDcmpDQ0FqV2dBd0lCQWdJUVBMTDBTQW9BNHY3ckpEdGVZRDdEYXpBS0JnZ3Foa2pPUFFRREF6Q0JtREVMCk1Ba0dBMVVFQmhNQ1ZWTXhGakFVQmdOVkJBb1REVWRsYjFSeWRYTjBJRWx1WXk0eE9UQTNCZ05WQkFzVE1DaGoKS1NBeU1EQTNJRWRsYjFSeWRYTjBJRWx1WXk0Z0xTQkdiM0lnWVhWMGFHOXlhWHBsWkNCMWMyVWdiMjVzZVRFMgpNRFFHQTFVRUF4TXRSMlZ2VkhKMWMzUWdVSEpwYldGeWVTQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwCmVTQXRJRWN5TUI0WERUQTNNVEV3TlRBd01EQXdNRm9YRFRNNE1ERXhPREl6TlRrMU9Wb3dnWmd4Q3pBSkJnTlYKQkFZVEFsVlRNUll3RkFZRFZRUUtFdzFIWlc5VWNuVnpkQ0JKYm1NdU1Ua3dOd1lEVlFRTEV6QW9ZeWtnTWpBdwpOeUJIWlc5VWNuVnpkQ0JKYm1NdUlDMGdSbTl5SUdGMWRHaHZjbWw2WldRZ2RYTmxJRzl1YkhreE5qQTBCZ05WCkJBTVRMVWRsYjFSeWRYTjBJRkJ5YVcxaGNua2dRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrZ0xTQkgKTWpCMk1CQUdCeXFHU000OUFnRUdCU3VCQkFBaUEySUFCQld4NlAwREZVUGxyT3VITnhGaTc5S0RObEo5UlZjTApTbzE3VkRzNmJsOFZBc0JRcHM4bEwzM0tTTGpIVUdNY0tpRUlmSm8yMkF2KzBTYkZXREV3S0NYelhWMmp1TGFsCnRKTHRiQ3lmNjkxRGlhSThTMGlSSFZEc0p0L1dZQzY5SWFOQ01FQXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU8KQmdOVkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUVGQlZmTlZkUlZmc2xzcTBEYWZ3Qm8vcStFVlhWTUFvRwpDQ3FHU000OUJBTURBMmNBTUdRQ01HU1dXYWJvQ2Q2THV2cGFpSWp3SDVIVFJxanlTa3dDWS90c1h6amJMa0dUCnFRN21uZHd4SExLZ3B4Z2NlZUhITmdJd09sYXZtblJzOXZ1RDREUFRDRitobk1KYm4wYld0c3VSQm1PaUJ1Y3oKckQ2b2dSTFF5N3JRa2d1Mm5wYXFCQStLCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPVZlcmlTaWduLCBJbmMuIE9VPVZlcmlTaWduIFRydXN0IE5ldHdvcmsvKGMpIDIwMDggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIFN1YmplY3Q6IENOPVZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89VmVyaVNpZ24sIEluYy4gT1U9VmVyaVNpZ24gVHJ1c3QgTmV0d29yay8oYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgTGFiZWw6ICJWZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSIKIyBTZXJpYWw6IDg1MjA5NTc0NzM0MDg0NTgxOTE3NzYzNzUyNjQ0MDMxNzI2ODc3CiMgTUQ1IEZpbmdlcnByaW50OiA4ZTphZDpiNTowMTphYTo0ZDo4MTplNDo4YzoxZDpkMTplMToxNDowMDo5NToxOQojIFNIQTEgRmluZ2VycHJpbnQ6IDM2Ojc5OmNhOjM1OjY2Ojg3OjcyOjMwOjRkOjMwOmE1OmZiOjg3OjNiOjBmOmE3OjdiOmI3OjBkOjU0CiMgU0hBMjU2IEZpbmdlcnByaW50OiAyMzo5OTo1NjoxMToyNzphNTo3MToyNTpkZTo4YzplZjplYTo2MTowZDpkZjoyZjphMDo3ODpiNTpjODowNjo3Zjo0ZTo4Mjo4Mjo5MDpiZjpiODo2MDplODo0YjozYwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRXVUQ0NBNkdnQXdJQkFnSVFRQnJFWkNHekV5RUREcnZrRWhyRkhUQU5CZ2txaGtpRzl3MEJBUXNGQURDQgp2VEVMTUFrR0ExVUVCaE1DVlZNeEZ6QVZCZ05WQkFvVERsWmxjbWxUYVdkdUxDQkpibU11TVI4d0hRWURWUVFMCkV4WldaWEpwVTJsbmJpQlVjblZ6ZENCT1pYUjNiM0pyTVRvd09BWURWUVFMRXpFb1l5a2dNakF3T0NCV1pYSnAKVTJsbmJpd2dTVzVqTGlBdElFWnZjaUJoZFhSb2IzSnBlbVZrSUhWelpTQnZibXg1TVRnd05nWURWUVFERXk5VwpaWEpwVTJsbmJpQlZibWwyWlhKellXd2dVbTl2ZENCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEFlCkZ3MHdPREEwTURJd01EQXdNREJhRncwek56RXlNREV5TXpVNU5UbGFNSUc5TVFzd0NRWURWUVFHRXdKVlV6RVgKTUJVR0ExVUVDaE1PVm1WeWFWTnBaMjRzSUVsdVl5NHhIekFkQmdOVkJBc1RGbFpsY21sVGFXZHVJRlJ5ZFhOMApJRTVsZEhkdmNtc3hPakE0QmdOVkJBc1RNU2hqS1NBeU1EQTRJRlpsY21sVGFXZHVMQ0JKYm1NdUlDMGdSbTl5CklHRjFkR2h2Y21sNlpXUWdkWE5sSUc5dWJIa3hPREEyQmdOVkJBTVRMMVpsY21sVGFXZHVJRlZ1YVhabGNuTmgKYkNCU2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1JSUJJakFOQmdrcWhraUc5dzBCQVFFRgpBQU9DQVE4QU1JSUJDZ0tDQVFFQXgyRTNYckVCTk50aTF4V2IvMWhhakNNajFtQ09rZGVRbUlONjVsZ1pPSXpGCjl1VmtoYlNpY2Z2dHZibmF6VTBBdE1ndGM2WEhhWEdWSHprOHNrUUhuT2dPK2sxS3hDSGZLV0dQTWlKaGdzV0gKSDI2TWZGOFdJRkZFMFhCUFYrcmpIT1BNZWU1WTJBN0NzMFdUd0N6bm1oY3Jld0EzZWtFemVPRXo0dk1RR24rSApMTDcyOWZkQzR1Vy9oMktKWHdCTDM4WGQ1SFZFTWtFNkhuRnVhY3NMZFVZSTBjclNLNVhRei91NVFHdGtqRmROCi9CTVJlWVR0WGxUMk5KOElBZk1RSlFZWFN0cnhIWHBtYTVoZ1pxVFo3OUl1Z3ZIdzd3bnFSTWtWYXVJRGJqUFQKcko5VkFNZjJDR3FVdVYvYzREUHhoR0Q1V3ljUnRQd1c4cnRXYW9BbGpRSURBUUFCbzRHeU1JR3ZNQThHQTFVZApFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnRUdNRzBHQ0NzR0FRVUZCd0VNQkdFd1g2RmRvRnN3CldUQlhNRlVXQ1dsdFlXZGxMMmRwWmpBaE1COHdCd1lGS3c0REFob0VGSS9sMHhxR3JJMk9hOFBQZ0dyVVNCZ3MKZXhrdU1DVVdJMmgwZEhBNkx5OXNiMmR2TG5abGNtbHphV2R1TG1OdmJTOTJjMnh2WjI4dVoybG1NQjBHQTFVZApEZ1FXQkJTMmQvcHBTRWVmVXhMVnd1b0hNbllIMFpjSEdUQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUFTdmo0CnNBUG1MR2Q3NUpSM1k4eHVUUGw5RGczY3lMazF1WEJQWS9vaytteURqRWVkTzJQem12bDJNcFdSc1hlOHJKcSsKc2VReEljYUJsVlphRHJIQzFMR21XYXp4WTh1NFRCMVprRXJ2a0JZb0gxcXVFUHVCVURnTWJNenhQY1AxWStPego0eUhKSkRucC9SVm1SdlFiRWRCTmM2TjlSdms5N2FoZll0VHhQL2pnZEZjckdKMkJ0TVFvMnBTWHBYRHJyQjIrCkJ4SHcxZHZkNVl6dzFUS3dnK1pYNG8rL3ZxR3F2ejBkdGRRNDZ0ZXdYRHBQYWorUHdHWnNZNnJwMmFRVzlJSFIKbFJRT2ZjMlZOTm5TajNCemdYdWNmcjJZWWRoRmg1aVF4ZXVHTU1ZMXYvRC93MVdJZzB2dkJaSUdjZks0bUpPMwo3TTJDWWZFNDVrK1htQ3BhalE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VmVyaVNpZ24gQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0IE89VmVyaVNpZ24sIEluYy4gT1U9VmVyaVNpZ24gVHJ1c3QgTmV0d29yay8oYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgU3ViamVjdDogQ049VmVyaVNpZ24gQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEc0IE89VmVyaVNpZ24sIEluYy4gT1U9VmVyaVNpZ24gVHJ1c3QgTmV0d29yay8oYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgTGFiZWw6ICJWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQiCiMgU2VyaWFsOiA2MzE0MzQ4NDM0ODE1MzUwNjY2NTMxMTk4NTUwMTQ1ODY0MDA1MQojIE1ENSBGaW5nZXJwcmludDogM2E6NTI6ZTE6ZTc6ZmQ6NmY6M2E6ZTM6NmY6ZjM6NmY6OTk6MWI6Zjk6MjI6NDEKIyBTSEExIEZpbmdlcnByaW50OiAyMjpkNTpkODpkZjo4ZjowMjozMTpkMTo4ZDpmNzo5ZDpiNzpjZjo4YToyZDo2NDpjOTozZjo2YzozYQojIFNIQTI1NiBGaW5nZXJwcmludDogNjk6ZGQ6ZDc6ZWE6OTA6YmI6NTc6Yzk6M2U6MTM6NWQ6Yzg6NWU6YTY6ZmM6ZDU6NDg6MGI6NjA6MzI6Mzk6YmQ6YzQ6NTQ6ZmM6NzU6OGI6MmE6MjY6Y2Y6N2Y6NzkKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURoRENDQXdxZ0F3SUJBZ0lRTDREK0k0d09JZzlJWnhJb2tZZXNzekFLQmdncWhrak9QUVFEQXpDQnlqRUwKTUFrR0ExVUVCaE1DVlZNeEZ6QVZCZ05WQkFvVERsWmxjbWxUYVdkdUxDQkpibU11TVI4d0hRWURWUVFMRXhaVwpaWEpwVTJsbmJpQlVjblZ6ZENCT1pYUjNiM0pyTVRvd09BWURWUVFMRXpFb1l5a2dNakF3TnlCV1pYSnBVMmxuCmJpd2dTVzVqTGlBdElFWnZjaUJoZFhSb2IzSnBlbVZrSUhWelpTQnZibXg1TVVVd1F3WURWUVFERXp4V1pYSnAKVTJsbmJpQkRiR0Z6Y3lBeklGQjFZbXhwWXlCUWNtbHRZWEo1SUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eQphWFI1SUMwZ1J6UXdIaGNOTURjeE1UQTFNREF3TURBd1doY05Nemd3TVRFNE1qTTFPVFU1V2pDQnlqRUxNQWtHCkExVUVCaE1DVlZNeEZ6QVZCZ05WQkFvVERsWmxjbWxUYVdkdUxDQkpibU11TVI4d0hRWURWUVFMRXhaV1pYSnAKVTJsbmJpQlVjblZ6ZENCT1pYUjNiM0pyTVRvd09BWURWUVFMRXpFb1l5a2dNakF3TnlCV1pYSnBVMmxuYml3ZwpTVzVqTGlBdElFWnZjaUJoZFhSb2IzSnBlbVZrSUhWelpTQnZibXg1TVVVd1F3WURWUVFERXp4V1pYSnBVMmxuCmJpQkRiR0Z6Y3lBeklGQjFZbXhwWXlCUWNtbHRZWEo1SUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjUKSUMwZ1J6UXdkakFRQmdjcWhrak9QUUlCQmdVcmdRUUFJZ05pQUFTblZucDhVdHBrbXc0dFhOaGVySkk5L2dIbQpHVW85RkFOTCttQW5JTm1EaVduNlZNYWFHRjVWS21UZUJ2YU5TanV0RUR4bFBaQ0lCSW5nTUdHenJsMEJwM3ZlCmZMSyt5bVZoQUlhdTJvOTcwSW10VFIxWm1rR3h2RWVBM0o1aXcvbWpnYkl3Z2E4d0R3WURWUjBUQVFIL0JBVXcKQXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd2JRWUlLd1lCQlFVSEFRd0VZVEJmb1YyZ1d6QlpNRmN3VlJZSgphVzFoWjJVdloybG1NQ0V3SHpBSEJnVXJEZ01DR2dRVWorWFRHb2Fzalk1cnc4K0FhdFJJR0N4N0dTNHdKUllqCmFIUjBjRG92TDJ4dloyOHVkbVZ5YVhOcFoyNHVZMjl0TDNaemJHOW5ieTVuYVdZd0hRWURWUjBPQkJZRUZMTVcKa2YzdXBtN2t0UzVKajRkNGdZRHM1YkcxTUFvR0NDcUdTTTQ5QkFNREEyZ0FNR1VDTUdZaERCZ21ZRm80ZTFaQwo0S2Y4Tm9SUmtTQXNkazFEUGNRZGhDUFFyTlo4TlFiT3pXbTlrQTNiYkVoQ0hRNnFRZ0l4QUp3OVNEa2pPVmdhCkZSSlphcDd2MVZteUhWSXNtWEhOeHluZkd5cGhlM0hSM3ZQQTVRMDZTcW90cDlpR0t0MHVFQT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1OZXRMb2NrIEFyYW55IChDbGFzcyBHb2xkKSBGXHUwMTUxdGFuXHhmYXNceGVkdHZceGUxbnkgTz1OZXRMb2NrIEtmdC4gT1U9VGFuXHhmYXNceGVkdHZceGUxbnlraWFkXHhmM2sgKENlcnRpZmljYXRpb24gU2VydmljZXMpCiMgU3ViamVjdDogQ049TmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRlx1MDE1MXRhblx4ZmFzXHhlZHR2XHhlMW55IE89TmV0TG9jayBLZnQuIE9VPVRhblx4ZmFzXHhlZHR2XHhlMW55a2lhZFx4ZjNrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKQojIExhYmVsOiAiTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRlx1MDE1MXRhblx4ZmFzXHhlZHR2XHhlMW55IgojIFNlcmlhbDogODA1NDQyNzQ4NDE2MTYKIyBNRDUgRmluZ2VycHJpbnQ6IGM1OmExOmI3OmZmOjczOmRkOmQ2OmQ3OjM0OjMyOjE4OmRmOmZjOjNjOmFkOjg4CiMgU0hBMSBGaW5nZXJwcmludDogMDY6MDg6M2Y6NTk6M2Y6MTU6YTE6MDQ6YTA6Njk6YTQ6NmI6YTk6MDM6ZDA6MDY6Yjc6OTc6MDk6OTEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDZjOjYxOmRhOmMzOmEyOmRlOmYwOjMxOjUwOjZiOmUwOjM2OmQyOmE2OmZlOjQwOjE5Ojk0OmZiOmQxOjNkOmY5OmM4OmQ0OjY2OjU5OjkyOjc0OmM0OjQ2OmVjOjk4Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFRlRDQ0F2MmdBd0lCQWdJR1NVRXM1QUFRTUEwR0NTcUdTSWIzRFFFQkN3VUFNSUduTVFzd0NRWURWUVFHCkV3SklWVEVSTUE4R0ExVUVCd3dJUW5Wa1lYQmxjM1F4RlRBVEJnTlZCQW9NREU1bGRFeHZZMnNnUzJaMExqRTMKTURVR0ExVUVDd3d1VkdGdXc3cHp3NjEwZHNPaGJubHJhV0ZrdzdOcklDaERaWEowYVdacFkyRjBhVzl1SUZObApjblpwWTJWektURTFNRE1HQTFVRUF3d3NUbVYwVEc5amF5QkJjbUZ1ZVNBb1EyeGhjM01nUjI5c1pDa2dSc1dSCmRHRnV3N3B6dzYxMGRzT2hibmt3SGhjTk1EZ3hNakV4TVRVd09ESXhXaGNOTWpneE1qQTJNVFV3T0RJeFdqQ0IKcHpFTE1Ba0dBMVVFQmhNQ1NGVXhFVEFQQmdOVkJBY01DRUoxWkdGd1pYTjBNUlV3RXdZRFZRUUtEQXhPWlhSTQpiMk5ySUV0bWRDNHhOekExQmdOVkJBc01MbFJoYnNPNmM4T3RkSGJEb1c1NWEybGhaTU96YXlBb1EyVnlkR2xtCmFXTmhkR2x2YmlCVFpYSjJhV05sY3lreE5UQXpCZ05WQkFNTUxFNWxkRXh2WTJzZ1FYSmhibmtnS0VOc1lYTnoKSUVkdmJHUXBJRWJGa1hSaGJzTzZjOE90ZEhiRG9XNTVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QQpNSUlCQ2dLQ0FRRUF4Q1JlYzc1TGJSVERvZlRqbDVCdTBqQkZIanp1WjlsazRCcUtmOG93eW9QaklNSGo5RHJUCmxGOGFmRnR0dnpCUGhDZjJueDlKdk1hWkNwRHlEL1YvUTRRM1kxR0xlcVZ3L0hwWXpZNmI3Y05HYklSd1hkcnoKQVpBai9FNHdxWDdoSjJQbjdXUThvTGpKTTJQK0ZwRC9zTGo5MTZqQXdKUkRDN2JWV2FhZVZ0QWtIM0I1cjlzNQpWQTFsZGRrVlFaUUJyMTdzOW8zeC82MWsvaUNhMTF6ci9xWWZDR1NqaTNaVnJSNDdLR0F1aHlYb3FxOGZ4bVJHCklMZHdmenplU051V1U3YzVkK1FhNHNjV2hIYVhXeSs3R1JXRitHbUY5Wm1ucWZJMHA2bTJwZ1A4YjRZOVZIeDIKQkp0citVQmRBRFRITHBsMW5lV0lBNnBOK0FQU1FuYkFHd0lEQUtpTG8wVXdRekFTQmdOVkhSTUJBZjhFQ0RBRwpBUUgvQWdFRU1BNEdBMVVkRHdFQi93UUVBd0lCQmpBZEJnTlZIUTRFRmdRVXpQcG5rL0MydU5DbHdCN3pVLzJNClU5K0QxNVl3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUt0Lzdod1dxWnc4VVFDZ3dCRUlCYWVaNW04QmlGUmgKYnZHNUdLMUtyZjZCUUNPVUwvdDFmQzhvUzJJa2dZSUw5V0h4SEc2NFlUanJnZnBpb1R0YVl0T1VaY1RoNW0yQworQzhsY0xJaEpzRnlVUitNTE1PRWtNTmFqN3JQOUtkbHBldVkwZnNGc2taMUZTTnFiNFZqTUlEdzFaNGZLUnpDCmJMQlFXVjJRV3p1b0RURFB2MzEvenZHZGc3M0pSbTRncHZsaFVib2hMM3UrcFJWam9kU1ZoL0dldWZPSjh6MkYKdUxqYnZyVzVLZm5hTndVQVNaUURoRVRudjBNeHozV0xKZEgwcG1UMWt2YXJCZXM5NmFVTE5tTGF6QVpmTm91MgpYakc0S3Z0ZTluSGZSQ2FleE9ZTmtiUXVkWldBVVdwTE1LYXdZcUdUOFp2WXpzUmpkVDlaUjdFPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U3RhYXQgZGVyIE5lZGVybGFuZGVuIFJvb3QgQ0EgLSBHMiBPPVN0YWF0IGRlciBOZWRlcmxhbmRlbgojIFN1YmplY3Q6IENOPVN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENBIC0gRzIgTz1TdGFhdCBkZXIgTmVkZXJsYW5kZW4KIyBMYWJlbDogIlN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENBIC0gRzIiCiMgU2VyaWFsOiAxMDAwMDAxMgojIE1ENSBGaW5nZXJwcmludDogN2M6YTU6MGY6Zjg6NWI6OWE6N2Q6NmQ6MzA6YWU6NTQ6NWE6ZTM6NDI6YTI6OGEKIyBTSEExIEZpbmdlcnByaW50OiA1OTphZjo4Mjo3OTo5MTo4NjpjNzpiNDo3NTowNzpjYjpjZjowMzo1Nzo0NjplYjowNDpkZDpiNzoxNgojIFNIQTI1NiBGaW5nZXJwcmludDogNjY6OGM6ODM6OTQ6N2Q6YTY6M2I6NzI6NGI6ZWM6ZTE6NzQ6M2M6MzE6YTA6ZTY6YWU6ZDA6ZGI6OGU6YzU6YjM6MWI6ZTM6Nzc6YmI6Nzg6NGY6OTE6YjY6NzE6NmYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZ5akNDQTdLZ0F3SUJBZ0lFQUppV2pEQU5CZ2txaGtpRzl3MEJBUXNGQURCYU1Rc3dDUVlEVlFRR0V3Sk8KVERFZU1Cd0dBMVVFQ2d3VlUzUmhZWFFnWkdWeUlFNWxaR1Z5YkdGdVpHVnVNU3N3S1FZRFZRUUREQ0pUZEdGaApkQ0JrWlhJZ1RtVmtaWEpzWVc1a1pXNGdVbTl2ZENCRFFTQXRJRWN5TUI0WERUQTRNRE15TmpFeE1UZ3hOMW9YCkRUSXdNRE15TlRFeE1ETXhNRm93V2pFTE1Ba0dBMVVFQmhNQ1Rrd3hIakFjQmdOVkJBb01GVk4wWVdGMElHUmwKY2lCT1pXUmxjbXhoYm1SbGJqRXJNQ2tHQTFVRUF3d2lVM1JoWVhRZ1pHVnlJRTVsWkdWeWJHRnVaR1Z1SUZKdgpiM1FnUTBFZ0xTQkhNakNDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFNVlo1MjkxCnFqNUxuTFc0cko0TDVQblp5cXRkajdVNUVJTFhyMUhnTytFQVNHclAydUVHUXhHWnFoUWxFcTBpNkFCdFE4U3AKdU9VZmlVdG52V0ZJNy8zUzRHQ0k1YmtZWUNqRGR5dXRzRGVxTjk1a1dTcEdWK1JMdWZnM2ZOVTI1NERCdHZQVQpaNXVXNk03WHhncFQwR3RKbHZPakN3VjNTUGNsNVhDc01CUWdKZU4vZFZybFNQaE9ld01IQlBxQ1lZZHU4RHZFCnBNZlE5WFErcFYwYUNQS2JKZEwyckFRbVBsVTZZaWlsZTdJd3IvZzN3dEc2MWpqOTlPOUpNRGVaSmlGSWhRR3AKNVJibjNKQlYzdy9vT00yWk55RlBYZlVpYjJyRkVoWmdGMVh5WldhbXB6Q1JPTUU0SFlZRWhMb2FKWGhlbmEvTQpVR0RXRTRkUzdXTWZiV1Y5d2hVWWRNcmhmbVFwakhMWUZoTjlDMGxLOFNnYklIUnJ4VDNkc0twSUNUMHVncFROCkdtWFpLNGlhbWJ3WWZwL3VmV1o4UHIyVXVJSE96Wmd3ZU1Gdlo5QytYK0JvN2Q3aXNja3NXWGlTcXQ4cllHUHkKNVY2NTQ4cjZmMUNHUHFJMEdBd0phQ2dSSE9UaHVWdytSN295UHhqTVc0VDE4MnQweEhKMDRlT0xvRXE5aldZdgo2cTAxMmlEVGlJSmg4QklpdHJ6UTFhVHNyMVNJSlNROHAyMnhjaWsvUGxlbWYxV3ZiaWJHL3VmTVFGeFJSSUVLCmVONUt6bFcvSGRYWnQxYnY4SGIvQzNtMXI3MzdxV21SUnBkb2dCUTJIYk4vdXltWU5xVWcrb0pnWWpPazdOYTYKQjZkdXhjOFVwdWZXa2pUWWdmWDhIVjJxWEI3Mm8wMDd1UGM1QWdNQkFBR2pnWmN3Z1pRd0R3WURWUjBUQVFILwpCQVV3QXdFQi96QlNCZ05WSFNBRVN6QkpNRWNHQkZVZElBQXdQekE5QmdnckJnRUZCUWNDQVJZeGFIUjBjRG92CkwzZDNkeTV3YTJsdmRtVnlhR1ZwWkM1dWJDOXdiMnhwWTJsbGN5OXliMjkwTFhCdmJHbGplUzFITWpBT0JnTlYKSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPQkJZRUZKRm9Nb2NWSFluaXRmR3NOaWcwalF0OFlvanJNQTBHQ1NxRwpTSWIzRFFFQkN3VUFBNElDQVFDb1FVcG5LcEtCZ2xCdTRkZllzems3OHdJVkNWQlI3eTI5Skh1SWhqdjV0THlTCkNaYTU5c0NySTJBR2VZd1JUbEhTZVlBeis1MUl2dXhCUTRFZmZrZEFIT1Y2Q01xcWkzV3RGTVRDNkdZOGdnZW4KNWllQ1d4am1EMjdaVUQ2S1FoZ3B4clJXL0ZZUW9BVVh2UXdqZi9TVDdad2FVYjdkUlVHL2tTUzBINHpwWDg5NwpJWm1mbFo4NU9rWWNiUG5OZTV5UXpTaXB4NmxWdTZ4aU5HSTFFMHNVT2xXRHVZYU5rcWJHOUFjbFZNd1dWeEpLCmduaklGTmtYZ2lZdFhTQWZlYTcrMUhBV0ZwV0QyRFU1LzFKZGRSd1d4Uk5WejBmTWRXVlNTdDd3c0tma0NwWUwKKzYzQzRpV0VzdDNrdlg1WmJKdnc4TmpueXZMcGx6aCtpYjdNK3prWFlUOXkyenFSMkdVQkdSMnRVS1JYQ254TAp2Snh4Y3lwRlVSbUZ6STc5UjZkMGxSMm8wYTlPRjdGcEpzS3FlRmRieFUybjVaNEZGNVRLc2wrZ1NSaU5OT2ttCmJFZ2VxbWlTQmVHQ2MxcWIzQWRiQ0cxOW5kZU5JZG44RkNDcXdrWGZQK2NBc2xIa3d2Z0Z1WGthakRUem5sdmsKTjF0clN0OHNWNHBBV2phNjNYVkVDRGRDY0F6KzNGNGhvS09Ld0pDY2FOcFE1a1VRUjNpMlR0Smx5Y00zMytGQwpZN0JYTjBVdGU0cWN2d1hxWlZVejl6a1F4U2dxSVhvYmlzUWsrVDhWeUpvVklQVlZZcGJ0YlpOUXZPU3FlSzNaCnl3cGxoNlptd2NTQm8zYzZXQjRMN29PTG5SN1NVcVRNSFcrd21HMlVNYlg0Y1FyY3VmeDlNbURtNjYrS0FRPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUhvbmdrb25nIFBvc3QgUm9vdCBDQSAxIE89SG9uZ2tvbmcgUG9zdAojIFN1YmplY3Q6IENOPUhvbmdrb25nIFBvc3QgUm9vdCBDQSAxIE89SG9uZ2tvbmcgUG9zdAojIExhYmVsOiAiSG9uZ2tvbmcgUG9zdCBSb290IENBIDEiCiMgU2VyaWFsOiAxMDAwCiMgTUQ1IEZpbmdlcnByaW50OiBhODowZDo2ZjozOTo3ODpiOTo0Mzo2ZDo3Nzo0Mjo2ZDo5ODo1YTpjYzoyMzpjYQojIFNIQTEgRmluZ2VycHJpbnQ6IGQ2OmRhOmE4OjIwOjhkOjA5OmQyOjE1OjRkOjI0OmI1OjJmOmNiOjM0OjZlOmIyOjU4OmIyOjhhOjU4CiMgU0hBMjU2IEZpbmdlcnByaW50OiBmOTplNjo3ZDozMzo2Yzo1MTowMDoyYTpjMDo1NDpjNjozMjowMjoyZDo2NjpkZDphMjplNzplMzpmZjpmMTowYTpkMDo2MTplZDozMTpkODpiYjpiNDoxMDpjZjpiMgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRE1EQ0NBaGlnQXdJQkFnSUNBK2d3RFFZSktvWklodmNOQVFFRkJRQXdSekVMTUFrR0ExVUVCaE1DU0VzeApGakFVQmdOVkJBb1REVWh2Ym1kcmIyNW5JRkJ2YzNReElEQWVCZ05WQkFNVEYwaHZibWRyYjI1bklGQnZjM1FnClVtOXZkQ0JEUVNBeE1CNFhEVEF6TURVeE5UQTFNVE14TkZvWERUSXpNRFV4TlRBME5USXlPVm93UnpFTE1Ba0cKQTFVRUJoTUNTRXN4RmpBVUJnTlZCQW9URFVodmJtZHJiMjVuSUZCdmMzUXhJREFlQmdOVkJBTVRGMGh2Ym1kcgpiMjVuSUZCdmMzUWdVbTl2ZENCRFFTQXhNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDCkFRRUFyUDg0dHVsbUFrbmpvclRoa1BsQWozbjU0cjE1L2dLOTdpU1NIU0wyMm9WeWFmN1hQd25VM1pHMUFwelEKalZyaFZjTlFocmtwSnNMajJhRHhhUU1vSUlCRklpMVdwenRVbFZZaVdSOG8zeDhnUFcyaU5yNGpvTEZ1dGJFbgpQemxUQ2VxcmF1aDBzc0psWEk2L2ZNTjRoTTJlRnZ6MUxrOGdLZ2lmZC9QRkhzU2FVbVllU0Y3akVBYVBJcGpoClpZNGJYU05tTzdpbE1sSElocXFocVo1L2RwVENwbXkzUWZEVnlBWTQ1dFFNNHZNN1RHMVFqTVNESjhFVGhGazkKbm5WMHR0Z0NYanFRZXNCQ05uTHNhazNjNzhRQTN4TVlWMThtZU1qV0NubDN2L2V2dDNhNXBRdUVGMTBRNm0vaApxNVVSWDIwOG8xeE5nMXZ5c3htS2dJc0xod0lEQVFBQm95WXdKREFTQmdOVkhSTUJBZjhFQ0RBR0FRSC9BZ0VECk1BNEdBMVVkRHdFQi93UUVBd0lCeGpBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQURrYlZQSzdpaDlsZWdZc0MKbUVFSWpFeTgydHZ1Snh1QzUycEY3QmFMVDRXZzg3Snd2VnFXdXNwdWJlNUdpMjduS2k2V3N4a3o2N1NmcUxJMwo3cGlvbDdZdXRtY24xS1pKL1J5VFpYYWVRaS9jSW15YVQvSmFGVG14Y2RjclVlaHRISmpBMlNyMG9ZSjcxY2xCCm9pTUJkRGhWaXcrNUxtZWlJQVEzMnB3TDB4Y2g0SStYZVRSdmhFZ0NJRE1iNWpSRW41Rnc5SUJlaEVQQ0tkSnMKRWhUa1lZMnNFSkNlaEZDNzhKWnZSWitLODhwc1Qvb1JPaFVWUnNQTkg0TmJMVUVTN1ZCblFSTTlJYXVVaXFwTwpmTUd4KzZmV3RTY3ZsNnR1NEIzaTBSd3NIMFRpL0w2Um9aejcxaWxUYzRhZlU5aEREbDNXWTRKeEhZQjB5dmJpCkFtdlpXZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1TZWN1cmVTaWduIFJvb3RDQTExIE89SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLgojIFN1YmplY3Q6IENOPVNlY3VyZVNpZ24gUm9vdENBMTEgTz1KYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuCiMgTGFiZWw6ICJTZWN1cmVTaWduIFJvb3RDQTExIgojIFNlcmlhbDogMQojIE1ENSBGaW5nZXJwcmludDogYjc6NTI6NzQ6ZTI6OTI6YjQ6ODA6OTM6ZjI6NzU6ZTQ6Y2M6ZDc6ZjI6ZWE6MjYKIyBTSEExIEZpbmdlcnByaW50OiAzYjpjNDo5Zjo0ODpmODpmMzo3MzphMDo5YzoxZTpiZDpmODo1YjpiMTpjMzo2NTpjNzpkODoxMTpiMwojIFNIQTI1NiBGaW5nZXJwcmludDogYmY6MGY6ZWU6ZmI6OWU6M2E6NTg6MWE6ZDU6Zjk6ZTk6ZGI6NzU6ODk6OTg6NTc6NDM6ZDI6NjE6MDg6NWM6NGQ6MzE6NGY6NmY6NWQ6NzI6NTk6YWE6NDI6MTY6MTIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURiVENDQWxXZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRVUZBREJZTVFzd0NRWURWUVFHRXdKS1VERXIKTUNrR0ExVUVDaE1pU21Gd1lXNGdRMlZ5ZEdsbWFXTmhkR2x2YmlCVFpYSjJhV05sY3l3Z1NXNWpMakVjTUJvRwpBMVVFQXhNVFUyVmpkWEpsVTJsbmJpQlNiMjkwUTBFeE1UQWVGdzB3T1RBME1EZ3dORFUyTkRkYUZ3MHlPVEEwCk1EZ3dORFUyTkRkYU1GZ3hDekFKQmdOVkJBWVRBa3BRTVNzd0tRWURWUVFLRXlKS1lYQmhiaUJEWlhKMGFXWnAKWTJGMGFXOXVJRk5sY25acFkyVnpMQ0JKYm1NdU1Sd3dHZ1lEVlFRREV4TlRaV04xY21WVGFXZHVJRkp2YjNSRApRVEV4TUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUEvWGVxcFJ5UUJUdkxUSnN6Cmkxb1VSYVRua0JiUjMxZlNJUkNrRi8zZnJOWWZwK1RiZlBmczM3Z0QycFJZL1YxeWZJdy9Yd0ZuZEJXVzR3STgKaDl1dXl3R093dk5teG9WRjlBTEdPclZpc3EvNm5MK2s1dFNBTUpqekRiYVRqNm5VMkRieXNQeUt5aXloRlRPVgpNZHJBRy9MdVlwbUdZeisvM1pNcWc2aDJ1Uk1mdDg1T1FvV1BJdWN1R3ZLVkNiSUZ0VVJPZDZFZ3ZhbnlUZ3A5ClVLMzFCUTFGVDBaeC9TZytVL3NFMkMzWFpSMUtHL3JQTzdBeG1qVnV5SXNHMHdDUjhwUUlaVXl4TkFZQWVvbmkKOE1jRFdjL1YxdWluTXJQbW1FQ0d4YzBuRW92TWU4NjNFVHhpWUFjalBpdEFicFNBQ1cyMnMyOTNielVJVVBzQwpoOFUraVFJREFRQUJvMEl3UURBZEJnTlZIUTRFRmdRVVcvaE5UN0tsaHRRNjB2RmptcUMrQ2ZaWHQ5NHdEZ1lEClZSMFBBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUIKQUtDaE9CWm1McWRXSHlHY0J2b2Q3YmtpeFRnbTJFNVA3S04vZWQ1R0lhR0hkNDhIQ0pxeXBNV3ZEektZQzN4bQpLYmFiZlNWU1NVT3JUQzRyYm5wd3J4WU80d0pzKzBMbUdKMUYyRlhJNkR2ZDUrSDBMZ3NjTkZ4c1dFcjdqSWhRClg1VWN2KzJySXJWbHM0VzZuZys0cmVWNkc0cFFPaDI5RGJ4N1ZGQUx1VUt2VmFBWWdhMWxtZSsrNUp5L3hJV3IKUWJKVWI5d2x6ZTE0NG80TWpRbEozV043V21tV0FpR292VkpaNlgwMXk4aFN5bitCL3RscjAvY1I3U1hmK09mNQpwUHB5bDRSVERhWFFNaGhSZGxrVWJBL3I3RitBakhWRGc4T0ZtUDlNbmkwTjVIZURrMDYxbGdlTEtCT2JqQm1OClFTZEpRTzdlNWlORU9keWhJdGE2QS9JPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049TWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQSAyMDA5IE89TWljcm9zZWMgTHRkLgojIFN1YmplY3Q6IENOPU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOSBPPU1pY3Jvc2VjIEx0ZC4KIyBMYWJlbDogIk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOSIKIyBTZXJpYWw6IDE0MDE0NzEyNzc2MTk1Nzg0NDczCiMgTUQ1IEZpbmdlcnByaW50OiBmODo0OTpmNDowMzpiYzo0NDoyZDo4MzpiZTo0ODo2OTo3ZDoyOTo2NDpmYzpiMQojIFNIQTEgRmluZ2VycHJpbnQ6IDg5OmRmOjc0OmZlOjVjOmY0OjBmOjRhOjgwOmY5OmUzOjM3OjdkOjU0OmRhOjkxOmUxOjAxOjMxOjhlCiMgU0hBMjU2IEZpbmdlcnByaW50OiAzYzo1Zjo4MTpmZTphNTpmYTpiODoyYzo2NDpiZjphMjplYTplYzphZjpjZDplODplMDo3NzpmYzo4NjoyMDphNzpjYTplNTozNzoxNjozZDpmMzo2ZTpkYjpmMzo3OAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUNqQ0NBdktnQXdJQkFnSUpBTUorUXdST1J6OFpNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1JR0NNUXN3Q1FZRApWUVFHRXdKSVZURVJNQThHQTFVRUJ3d0lRblZrWVhCbGMzUXhGakFVQmdOVkJBb01EVTFwWTNKdmMyVmpJRXgwClpDNHhKekFsQmdOVkJBTU1IazFwWTNKdmMyVmpJR1V0VTNwcFoyNXZJRkp2YjNRZ1EwRWdNakF3T1RFZk1CMEcKQ1NxR1NJYjNEUUVKQVJZUWFXNW1iMEJsTFhONmFXZHVieTVvZFRBZUZ3MHdPVEEyTVRZeE1UTXdNVGhhRncweQpPVEV5TXpBeE1UTXdNVGhhTUlHQ01Rc3dDUVlEVlFRR0V3SklWVEVSTUE4R0ExVUVCd3dJUW5Wa1lYQmxjM1F4CkZqQVVCZ05WQkFvTURVMXBZM0p2YzJWaklFeDBaQzR4SnpBbEJnTlZCQU1NSGsxcFkzSnZjMlZqSUdVdFUzcHAKWjI1dklGSnZiM1FnUTBFZ01qQXdPVEVmTUIwR0NTcUdTSWIzRFFFSkFSWVFhVzVtYjBCbExYTjZhV2R1Ynk1bwpkVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFPbjRqL05qcmRxRzJLZmdRdnZQCmtkNm1KdmlacFdOd3JadXV5ak5BZlcyV2JxRU9STzdoRTUyVVFsS2F2WFdGZEN5b0RoMlR0aGkzakN5b3ovdGMKY2JuYTdQN29mby9rTHgyeXFIV0gyTGVoNVR2UG1VcEcwSU1aZmNDaEVoeVZiVXIwMk1lbFRUTXVoVGxBZFg0VQpmSUFTbUZESFFXZTRvSUJoVktac1RoL2duUTRINmNtNk0rZit3RlVvTEFLQXB4bjFudHhWVXdPWGV3ZEkvNW43Ck40b2t4Rm5NVUJCampxcXBHckNFR29iNVg3dXhVRzZrMFFyTTFYRitINmNiZlBWVGJpSmZ5eXZtMUh4ZHJ0YkMKeGt6bEJRSFo3VmY4d1NONS9QcklKSU9WODdWcVVRSFFkOWJwRXFINUdvUDdnaHU1c0pmMGRnWXpRMG1nL3d1MQorclVDQXdFQUFhT0JnREIrTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnRUdNQjBHCkExVWREZ1FXQkJUTEQ4YmZRa1BNUGN1MVNDT2hHbnFtS3JzMGFEQWZCZ05WSFNNRUdEQVdnQlRMRDhiZlFrUE0KUGN1MVNDT2hHbnFtS3JzMGFEQWJCZ05WSFJFRUZEQVNnUkJwYm1adlFHVXRjM3BwWjI1dkxtaDFNQTBHQ1NxRwpTSWIzRFFFQkN3VUFBNElCQVFESjBRNWVMdFhNczN3K3kvdzkvdzBvbFpNRXlML2F6WG00UTVEd3BMN3Y4dThoCm1MelUxRjBHOXU1QzdEQnNvS3FweXZHdml2by9DM05xUHVvdVFINGZybFJoZWVzdUNEZlhJL09Nbjc0ZHNlR2sKZGR1ZzRsUVVzYm9jS2FRWTloSzZvaFFVNHpFMXlFRC90K0FGZGxmQkhGbnkrTC9rN1NWaVhJVHdmbjRmczc3NQp0eUVSekFNQlZuQ25FSkllR3pTQkhxMmNHc01FUE8wQ1lkWWVCdk5mT29meUsvRkZoK1U5ck5ISFY0UzlhNjdjCjJQbTJHMkp3Q3owMnlVTHlNdGQ2WWViUzJ6M1B5S25KbTl6YldFVFhieml2ZjNqVG82MGFkYm9jd1RaOGp4NXQKSE1OMVJxNDFCYWIyWEQwaDdsYnd5WUlpTFhwVXEzRERmU0psZ25DVwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049R2xvYmFsU2lnbiBPPUdsb2JhbFNpZ24gT1U9R2xvYmFsU2lnbiBSb290IENBIC0gUjMKIyBTdWJqZWN0OiBDTj1HbG9iYWxTaWduIE89R2xvYmFsU2lnbiBPVT1HbG9iYWxTaWduIFJvb3QgQ0EgLSBSMwojIExhYmVsOiAiR2xvYmFsU2lnbiBSb290IENBIC0gUjMiCiMgU2VyaWFsOiA0ODM1NzAzMjc4NDU5NzU5NDI2MjA5OTU0CiMgTUQ1IEZpbmdlcnByaW50OiBjNTpkZjpiODo0OTpjYTowNToxMzo1NTplZToyZDpiYToxYTpjMzozZTpiMDoyOAojIFNIQTEgRmluZ2VycHJpbnQ6IGQ2OjliOjU2OjExOjQ4OmYwOjFjOjc3OmM1OjQ1Ojc4OmMxOjA5OjI2OmRmOjViOjg1OjY5Ojc2OmFkCiMgU0hBMjU2IEZpbmdlcnByaW50OiBjYjpiNToyMjpkNzpiNzpmMToyNzphZDo2YTowMToxMzo4Njo1YjpkZjoxYzpkNDoxMDoyZTo3ZDowNzo1OTphZjo2Mzo1YTo3YzpmNDo3MjowZDpjOTo2MzpjNTozYgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFh6Q0NBa2VnQXdJQkFnSUxCQUFBQUFBQklWaFRDS0l3RFFZSktvWklodmNOQVFFTEJRQXdUREVnTUI0RwpBMVVFQ3hNWFIyeHZZbUZzVTJsbmJpQlNiMjkwSUVOQklDMGdVak14RXpBUkJnTlZCQW9UQ2tkc2IySmhiRk5wCloyNHhFekFSQmdOVkJBTVRDa2RzYjJKaGJGTnBaMjR3SGhjTk1Ea3dNekU0TVRBd01EQXdXaGNOTWprd016RTQKTVRBd01EQXdXakJNTVNBd0hnWURWUVFMRXhkSGJHOWlZV3hUYVdkdUlGSnZiM1FnUTBFZ0xTQlNNekVUTUJFRwpBMVVFQ2hNS1IyeHZZbUZzVTJsbmJqRVRNQkVHQTFVRUF4TUtSMnh2WW1Gc1UybG5iakNDQVNJd0RRWUpLb1pJCmh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTXdsZHBCNUJuZ2lGdlhBZzdhRXlpaWUvUVYyRWNXdGlITDgKUmdKRHg3S0tuUVJmSk1zdVMrRmdna2JoVXFzTWdVZHdiTjFrMGV2MUxLTVBnajBNSzY2WDE3WVVoaEI1dXpzVApnSGVNQ09GSjBtcGlMeDllK3BabzM0a25sVGlmQnRjK3ljc21XUTF6M3JESTZTWU9neFhHNzF1TDBnUmd5a21tCktQWnBPL2JMeUNpUjVaMktZVmMzckhRVTNIVGdPdTV5THk2Yys5Qzd2L1U5QU9FR00raUNLNjVUcGpvV2M0emQKUVE0Z09zQzBwNkhwc2srUUxqSmc2VmZMdVFTU2FHamxPQ1pnZGJLZmQvK1JGTyt1SUVuOHJVQVZTTkVDTVdFWgpYcmlYNzYxM3QyU2Flcjlmd1JQdm0yTDdEV3pnVkdrV3FRUGFidW1EazNGMnhtbUZnaGNDQXdFQUFhTkNNRUF3CkRnWURWUjBQQVFIL0JBUURBZ0VHTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRkkvd1MzK28KTGtVa3JrMVErbU9haTk3aTNSdThNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUJMUU52QVVLcit5QXp2OTVaVQpSVW03bGdBSlFheXpFNGFHS0Fjenltdm1kTG02QUMydXBBclQ5Zkh4RDRxL2MyZEtnOGRFZTNqZ3IyNXNid01wCmpqTTVSY09PNUxsWGJLcjhFcGJzVThZdDVDUnN1WlJqKzl4VGFHZFdQb080enpVaHc4bG8vczdhd2xPcXpKQ0sKNmZCZFJveVYzWHBZS0JvdkhkN05BRGRCaisxRWJkZFRLSmQrODJjRUhoWFhpcGEwMDk1TUo2Uk1HM056ZHZRWAptY0lmZWc3akxRaXRDaHdzL3p5clZRNFBrWDQyNjhOWFNiN2hMaTE4WUl2RFFWRVRJNTNPOXpKcmxBR29tZWNzCk14ODZPeVhTaGtET095eUdlTWxoTHhTNjd0dFZiOStFN2dVSlRiMG8ySExPMDJKUVpSN3JrcGVETWRtenRjcEgKV0Q5ZgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QXV0b3JpZGFkIGRlIENlcnRpZmljYWNpb24gRmlybWFwcm9mZXNpb25hbCBDSUYgQTYyNjM0MDY4CiMgU3ViamVjdDogQ049QXV0b3JpZGFkIGRlIENlcnRpZmljYWNpb24gRmlybWFwcm9mZXNpb25hbCBDSUYgQTYyNjM0MDY4CiMgTGFiZWw6ICJBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgiCiMgU2VyaWFsOiA2MDQ3Mjc0Mjk3MjYyNzUzODg3CiMgTUQ1IEZpbmdlcnByaW50OiA3MzozYTo3NDo3YTplYzpiYjphMzo5NjphNjpjMjplNDplMjpjODo5YjpjMDpjMwojIFNIQTEgRmluZ2VycHJpbnQ6IGFlOmM1OmZiOjNmOmM4OmUxOmJmOmM0OmU1OjRmOjAzOjA3OjVhOjlhOmU4OjAwOmI3OmY3OmI2OmZhCiMgU0hBMjU2IEZpbmdlcnByaW50OiAwNDowNDo4MDoyODpiZjoxZjoyODo2NDpkNDo4Zjo5YTpkNDpkODozMjo5NDozNjo2YTo4Mjo4ODo1Njo1NTozZjozYjoxNDozMDozZjo5MDoxNDo3Zjo1ZDo0MDplZgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJR0ZEQ0NBL3lnQXdJQkFnSUlVK3c3N3Z1eVNGOHdEUVlKS29aSWh2Y05BUUVGQlFBd1VURUxNQWtHQTFVRQpCaE1DUlZNeFFqQkFCZ05WQkFNTU9VRjFkRzl5YVdSaFpDQmtaU0JEWlhKMGFXWnBZMkZqYVc5dUlFWnBjbTFoCmNISnZabVZ6YVc5dVlXd2dRMGxHSUVFMk1qWXpOREEyT0RBZUZ3MHdPVEExTWpBd09ETTRNVFZhRncwek1ERXkKTXpFd09ETTRNVFZhTUZFeEN6QUpCZ05WQkFZVEFrVlRNVUl3UUFZRFZRUURERGxCZFhSdmNtbGtZV1FnWkdVZwpRMlZ5ZEdsbWFXTmhZMmx2YmlCR2FYSnRZWEJ5YjJabGMybHZibUZzSUVOSlJpQkJOakkyTXpRd05qZ3dnZ0lpCk1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRREtsbXVPNnZqNzhhSTE0SDlNMnVERFV0ZDkKdGhESUFsNnpReXJFVDJxeXloeGRLSnA0RVJwcFdWZXZ0U0JDNUlzUDV0OWJwZ09TTC9VUjVHTFhNbkU0MlFRTQpjYXM5VVg0UEI5OWpCVnpwdjVSdndTbUN3TFRhVWJEQlBMdXROMHBjeXZGTE5nNGtxNy9EaEhmOXFGRDBzZWZHCkw5SXRXWTE2Q2s2V2FWSUNxamFZN1B6NkZJTU1OeC9Ka2pkLzE0RXQ1Y1M1NEQ0MC9tZjBQbWJSMC9SQXoxNWkKTkE5d0JqNGdHRnJPOTNJYkpXeVRkQlNUbzNPeERxcUhFQ05aWHlBRkdVZnRhSTZTRXNwZC9OWXJzcEk4SU0vaApYNjhndnFCMmYzYmw3QnFHWVRNKzUzdTBQNkFQanFLNWFtKzVoeVp2UVd5SXBsRDlhbU1MOVpNV0d4bVBzdTJiCm04bVE5UUVNM3hrOUR6NDRJOGt2and6UkF2NGJWZFpPMEkwOHIwK2s4LzZ2S3RNRm5Ya0lvY3RYTWJTY3lKQ3kKWi9RWUZwTTYvRWZZMFhpV01SKzZLd3hmWFptdFk0bGFKQ0IyMk4vOXEwNm1JcXFkWHVZbmluMW9LYVBuaXJqYQpFYnNYTFptZEV5Ukc5OFhpMkorT2Y4ZVBkRzFhc3VoeTlhenVKQkN0THhUYS95MmFSbkZIdmtMZnV3SGI5SC9UCktJOHhXVnZUeVFLbXRGTEticGY3UThVSUptK0s5THY5bnlpcURkVkY4eE02SGRqQWVJOUJaendlbEdTdWV3dkYKNk5rQmlEa2FsNFprUWRVN2h3eHUrZy9HdlVnVXZ6bE4xSjVCdG8rV0hXT1drOW1WQm5neGFKNDNCanVBaVVWaApPU1BIRzBTakZlVWMrSkl3dXdJREFRQUJvNEh2TUlIc01CSUdBMVVkRXdFQi93UUlNQVlCQWY4Q0FRRXdEZ1lEClZSMFBBUUgvQkFRREFnRUdNQjBHQTFVZERnUVdCQlJsemV1ck5SNEFQbjdWZE1BY3RITkhEaHBrTHpDQnBnWUQKVlIwZ0JJR2VNSUdiTUlHWUJnUlZIU0FBTUlHUE1DOEdDQ3NHQVFVRkJ3SUJGaU5vZEhSd09pOHZkM2QzTG1acApjbTFoY0hKdlptVnphVzl1WVd3dVkyOXRMMk53Y3pCY0JnZ3JCZ0VGQlFjQ0FqQlFIazRBVUFCaEFITUFaUUJ2CkFDQUFaQUJsQUNBQWJBQmhBQ0FBUWdCdkFHNEFZUUJ1QUc4QWRnQmhBQ0FBTkFBM0FDQUFRZ0JoQUhJQVl3QmwKQUd3QWJ3QnVBR0VBSUFBd0FEZ0FNQUF4QURjd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dJQkFCZDlvUG0wM2NYRgo2NjFMSkxXaEFxdmRwWWhLc2c5VlN5dFhqRHZsTWQzK3hETHg1MXRrbGpZeUdPeWxNbmZYNDBTMndCRXFnTGs5CmFtNThtOU90L01QV28rWmtLWHpSNFRnZWdpdi9KMld2K3hZVnhDNXhoT1cxLy9xa1I3MWtNcnYySllTaUowTDEKSUxEQ0V4QVJ6UkFWdWtLUUt0SkU0WlltNnpGSUV2MHEyc2tHejNRZXFVdlZoeWo1ZVRTU1BpNUU2UGFQVDQ4MQpQeVd6T2R4aktwQnJJRi9FVWhKT2x5d3FySjJYM2tqeW8yYmJ3dEtEbGFabXA1NGxEK2tMTTVGbENsckQyVlFTCjNhL0RUZzRmSmw0TjNMT043TldCY043U1R5UUY4MnhPOVV4SlpvM1IvOUlMSlVGSS9sR0V4a0t2Z0FUUDBINWsKU2VUeTM2THNzVXpBS2gzbnRMRmxvc1M4OFpqMHFuQUhZN1M0Mmp0TStrQWlNRnNScHZBRkRzWUNBMGlyaHB1RgozZHZkNnFKMmdITjk5WndFeEVXTjU3a2NpNTdxMTNYUmNySGVkVVRuUW4zaVYydDkzSm04UFlNbzZvQ1RqY1ZNClpjRndnYmc0L0VNeHN2WURORWV5clBzaUJzc2UzUmRISEY5bXVkTWFvdG9Sc2FTOEk4bmt2b2YvdVpTMitGMGcKU3RSZjU3MW9lMlh5RlI3U09xa3Q2ZGhySkt5WFdFUkhyVmtZOFNGbGNON09OR0NvUVBIelBLVERLQ09NL2ljegpRMENnRnp6cjZqdXdjcWFqdVVwTFhoWkk5TEs4eUl5U3haMmZySEkydkRTQU5HdXBpNUxBdUJmdDdIWlQ5U1FCCmpMTWk2RXQ4VmNhZCtxTVV1MldGYm01UEVuNEtQSjJWCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1JemVucGUuY29tIE89SVpFTlBFIFMuQS4KIyBTdWJqZWN0OiBDTj1JemVucGUuY29tIE89SVpFTlBFIFMuQS4KIyBMYWJlbDogIkl6ZW5wZS5jb20iCiMgU2VyaWFsOiA5MTc1NjMwNjU0OTAzODkyNDE1OTU1MzY2ODY5OTE0MDI2MjEKIyBNRDUgRmluZ2VycHJpbnQ6IGE2OmIwOmNkOjg1OjgwOmRhOjVjOjUwOjM0OmEzOjM5OjkwOjJmOjU1OjY3OjczCiMgU0hBMSBGaW5nZXJwcmludDogMmY6Nzg6M2Q6MjU6NTI6MTg6YTc6NGE6NjU6Mzk6NzE6YjU6MmM6YTI6OWM6NDU6MTU6NmY6ZTk6MTkKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDI1OjMwOmNjOjhlOjk4OjMyOjE1OjAyOmJhOmQ5OjZmOjliOjFmOmJhOjFiOjA5OjllOjJkOjI5OjllOjBmOjQ1OjQ4OmJiOjkxOjRmOjM2OjNiOmMwOmQ0OjUzOjFmCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGOFRDQ0E5bWdBd0lCQWdJUUFMQzNXaFpJWDcvaHkvV0wxeG5tZlRBTkJna3Foa2lHOXcwQkFRc0ZBREE0Ck1Rc3dDUVlEVlFRR0V3SkZVekVVTUJJR0ExVUVDZ3dMU1ZwRlRsQkZJRk11UVM0eEV6QVJCZ05WQkFNTUNrbDYKWlc1d1pTNWpiMjB3SGhjTk1EY3hNakV6TVRNd09ESTRXaGNOTXpjeE1qRXpNRGd5TnpJMVdqQTRNUXN3Q1FZRApWUVFHRXdKRlV6RVVNQklHQTFVRUNnd0xTVnBGVGxCRklGTXVRUzR4RXpBUkJnTlZCQU1NQ2tsNlpXNXdaUzVqCmIyMHdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFESjAzcktEeDZzcDRib0ZtVnEKc2NJYlJUSnhsZG4rRUZ2TXIrZWxlUUdQaWNQSzhsVng5M2UrZDVUemNxUXNSTmlla3BzVU9xSG5KSkFLQ2xhTwp4ZGdtbE9IWlNPRXRQdG9LY3Qyam1SWGFnYUtIOUh0dUpuZUpXSzNXNnd5eVFYcHpibTNiZW5oQjZRaUlFbjZICkxtWVJZMnhVK3p5ZGNzQzhMdi9DdDkwTmR1TTYxL2UwYUw2aTllT0Jic0ZHYjEyTjRFM0dWRldKR2pNeENyRlgKdWFPS21NUHNPelRGbFVGcGZuWENQQ0RGWWJwUlI2QWdrSk9oa0V2elRueUZSVlNhMFFVbVFiQzFUUjB6dnNRRAp5Q1Y4d1hEYk8vUUpMVlFuU0t3djRjU3NQc2pMa2t4VE9UY2o3Tk1CK2VBSlJFMU5aTURoRFZxSElyeXRHNlArCkpyVVY4NmY4aEJucDdLR0l0RVJwaElQemlkRjBCcW5NQzliQzNpZUZVQ2JLRjdqSmVvZFdMQm9CSG15K0U2MFEKckxVazlUaVJvZFpMMnZHNzB0NUh0Zkc4Z2ZaWmE4OFpVK21ORmN0S3k2bHZST1ViUWMvaGhxZkswR3FmdkV5TgpCak5hb29YbGtEV2dZbHdXVHZEam92b0RHclFzY2JOWUxONTdDOXNhRCt2ZUlSOEdkd1lEc01udm1mekF1VThMCmhpaiswcm5xNDlxbHcwZHBFdURiOFBZWmkrMTdjTmNDMXUySEdDZ3NCQ1JNZCtSSWlockdPNXJVRDhyNmRkSUIKUUZxTmViK0x6MHZQcWhiQmxlU3RUSW8rRjVIVXNXTGxndVdBQktRRGZvMi8ybitpRDVkUEROTU4rOWZSNVhKKwpITWgzLzF1YUQ3ZXVCVWJsOGFnVzdFZWtGd0lEQVFBQm80SDJNSUh6TUlHd0JnTlZIUkVFZ2Fnd2dhV0JEMmx1ClptOUFhWHBsYm5CbExtTnZiYVNCa1RDQmpqRkhNRVVHQTFVRUNndytTVnBGVGxCRklGTXVRUzRnTFNCRFNVWWcKUVRBeE16TTNNall3TFZKTlpYSmpMbFpwZEc5eWFXRXRSMkZ6ZEdWcGVpQlVNVEExTlNCR05qSWdVemd4UXpCQgpCZ05WQkFrTU9rRjJaR0VnWkdWc0lFMWxaR2wwWlhKeVlXNWxieUJGZEc5eVltbGtaV0VnTVRRZ0xTQXdNVEF4Ck1DQldhWFJ2Y21saExVZGhjM1JsYVhvd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUMKQVFZd0hRWURWUjBPQkJZRUZCMGNaUTZvOGlWN3RKSFA1TEd4NXIxVmRHd0ZNQTBHQ1NxR1NJYjNEUUVCQ3dVQQpBNElDQVFCNHBnd1dTcDlNaURyQXl3NmxGbjJmdVVoZkdJOE5ZamIyelJscnJLdlY5cEY5cm5IelA3TU9lSVdiCmxhUW5JVWRDU254SU92VkZmTE1NamxGNHJKVVQzc2I5ZmJnYWtFeXJrZ1BIN1VJQnpnL1lzZnFpa3VGZ2JhNTYKYXdtcXhpbnVhRWxuTUlBa2VqRVdPVnQrOFJ3dTNXd0pyZkl4d1lKT3VidjV2cjhxaFQvQVFLTTZXZnhaU3p3bwpKTnUwRlhXdURZaTZMblBBdlZpSDVVTHk2MTd1SGpBaW1jczMwY1FoYklIc3ZtMG01aHprUWlDZVI3Q3NnMWx3CkxEWFdyelkwdE0wNytES283K040aWZ1TlJTemFuTGgrUUJ4aDV6NmlraXhMOHMzNm1MWXAvL1B5ZTZrZkxxQ1QKVnl2ZWhRUDVhVGZMbm5ocUJiVEZNWGlKN0hxbmhlRzVlenpldmg1NWhNNmZjQTVad2pVdWtDb3gyZVJGZWtHawpMaE9iTkE1bWUwbXJaSmZRUnNONW5YSlFZNmFZV3dhOVNHM1lPWU53NkRYd0JkR3F2T1BieUFMcWZQMkMyc0piClVqV3VtRHF0dWpXVEk2Y2ZTTjAxUnBpeUVHamtwVEhDQ2xndUdZRVF5VkIxL09wYUZzNFIxKzd2VUlndFlmOC8KUW5NRmxFUFZqanhPQVRvWnBSOUdUbmZRWGVXQklpR0gvcFI5aE5pVHJkWm9RMGl5Mit0ekpPZVJmMVNrdG9BKwpuYU04VEhMQ1Y4U2cxTXc0Sjg3VkJwNmlTTm5wbjg2Q2NEYVRtanZmbGlIaldiY00ycEUzOFAxWldyT1p5R2xzClF5WUJOV05nVllrRE9uWFl1a3JaVlAvdTNvRFlMZEU0MVY0dEM1aDlQbXpiL0NhSXh3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUNoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4IE89QUMgQ2FtZXJmaXJtYSBTLkEuCiMgU3ViamVjdDogQ049Q2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDggTz1BQyBDYW1lcmZpcm1hIFMuQS4KIyBMYWJlbDogIkNoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4IgojIFNlcmlhbDogMTE4MDY4MjI0ODQ4MDE1OTcxNDYKIyBNRDUgRmluZ2VycHJpbnQ6IDVlOjgwOjllOjg0OjVhOjBlOjY1OjBiOjE3OjAyOmYzOjU1OjE4OjJhOjNlOmQ3CiMgU0hBMSBGaW5nZXJwcmludDogNzg6NmE6NzQ6YWM6NzY6YWI6MTQ6N2Y6OWM6NmE6MzA6NTA6YmE6OWU6YTg6N2U6ZmU6OWE6Y2U6M2MKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDA2OjNlOjRhOmZhOmM0OjkxOmRmOmQzOjMyOmYzOjA4OjliOjg1OjQyOmU5OjQ2OjE3OmQ4OjkzOmQ3OmZlOjk0OjRlOjEwOmE3OjkzOjdlOmUyOjlkOjk2OjkzOmMwCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlIVHpDQ0JUZWdBd0lCQWdJSkFLUGFRbjZrc2E3YU1BMEdDU3FHU0liM0RRRUJCUVVBTUlHdU1Rc3dDUVlEClZRUUdFd0pGVlRGRE1FRUdBMVVFQnhNNlRXRmtjbWxrSUNoelpXVWdZM1Z5Y21WdWRDQmhaR1J5WlhOeklHRjAKSUhkM2R5NWpZVzFsY21acGNtMWhMbU52YlM5aFpHUnlaWE56S1RFU01CQUdBMVVFQlJNSlFUZ3lOelF6TWpnMwpNUnN3R1FZRFZRUUtFeEpCUXlCRFlXMWxjbVpwY20xaElGTXVRUzR4S1RBbkJnTlZCQU1USUVOb1lXMWlaWEp6CklHOW1JRU52YlcxbGNtTmxJRkp2YjNRZ0xTQXlNREE0TUI0WERUQTRNRGd3TVRFeU1qazFNRm9YRFRNNE1EY3oKTVRFeU1qazFNRm93Z2E0eEN6QUpCZ05WQkFZVEFrVlZNVU13UVFZRFZRUUhFenBOWVdSeWFXUWdLSE5sWlNCagpkWEp5Wlc1MElHRmtaSEpsYzNNZ1lYUWdkM2QzTG1OaGJXVnlabWx5YldFdVkyOXRMMkZrWkhKbGMzTXBNUkl3CkVBWURWUVFGRXdsQk9ESTNORE15T0RjeEd6QVpCZ05WQkFvVEVrRkRJRU5oYldWeVptbHliV0VnVXk1QkxqRXAKTUNjR0ExVUVBeE1nUTJoaGJXSmxjbk1nYjJZZ1EyOXRiV1Z5WTJVZ1VtOXZkQ0F0SURJd01EZ3dnZ0lpTUEwRwpDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ3ZBTXR3Tnl1QVdrbzZiSGlVZmFOL0doLzJOZFc5CjI4c05SSEkrSnJLUVVycGpPeWhZYjZXemJaU204OTFrREZYMjl1ZnlJaUtBWHVGaXhyWXA0WUZzOHIvbGZUSnEKVktBeUdWbitINHZYUFdDR2hTUnY0eEd6ZHo0Z2xqVWhhN01JMlhBdVpQZUVrbFBXRHJDUWlvcmpoNDBHMDcyUQpEdUtab1J1R0R0cWFDcnNMWVZBR1V2R2VmM2JzeXcvUUhnM1BtVEE5SE1SRkVGaXMxdFBvMStYcXhRRUhkOVpSCjVnTi9pa2lsVFdoMXVlbThuazRaY2ZVeVM1eHRZQmtMKzh5ZGRkeS9KczJQazNnNWVYTmVKUTdLWE90M0VnZkwKWkVGSGNwT3JVTVByQ1haa05OSTV0M1lSQ1ExMlJjU3ByajFxcjdWOVpTK1VXQkRzWEh5dmZ1SzJHTm5RbTA1YQpTZCtwWmd2TVBNWjRmS2VjSGVQT2psTytCZDVnRDJ2bEd0cy80K0VoeVNuQjhlc0huRkliQVVSUlBIc2wxOFRsClVsUmRKUWZLRmlDNHJlUkI3bm9JL3Bsdmc2YVJBckJzTmxWcTUzMzFsdWJLZ2RhWDhaU0Q2ZTJ3c1dzU2FSNnMKKzEycHhaanB0RnRZZXI0OW9rUTZZMW5VQ3lYZUcwKzk1UUdlemRJcDFaOFhHUXB2dnd5UTB3bGYyZU9LTmN4NQpXazBaTjVLM3hNR3RyL1I1SkpxeUFRdXhyMXlXODRBeSsxdzltUEdnUDByZXZxK1VMdGxWbWhkdVlKMWpiTGhqCnlhNkJYQmcxNEpDN3ZqeFBOeUs1ZnV2UG5uY2hwajA0Z2Z0STJqRTlLK09KOWRDMXZYN2dVTVFTaWJNam1oQXgKaGR1dWIrODRNeGgyRVFJREFRQUJvNElCYkRDQ0FXZ3dFZ1lEVlIwVEFRSC9CQWd3QmdFQi93SUJEREFkQmdOVgpIUTRFRmdRVStTU3NEN0sxK0huQSttQ0lHOFRaVFFLZUZ4a3dnZU1HQTFVZEl3U0IyekNCMklBVStTU3NEN0sxCitIbkErbUNJRzhUWlRRS2VGeG1oZ2JTa2diRXdnYTR4Q3pBSkJnTlZCQVlUQWtWVk1VTXdRUVlEVlFRSEV6cE4KWVdSeWFXUWdLSE5sWlNCamRYSnlaVzUwSUdGa1pISmxjM01nWVhRZ2QzZDNMbU5oYldWeVptbHliV0V1WTI5dApMMkZrWkhKbGMzTXBNUkl3RUFZRFZRUUZFd2xCT0RJM05ETXlPRGN4R3pBWkJnTlZCQW9URWtGRElFTmhiV1Z5ClptbHliV0VnVXk1QkxqRXBNQ2NHQTFVRUF4TWdRMmhoYldKbGNuTWdiMllnUTI5dGJXVnlZMlVnVW05dmRDQXQKSURJd01EaUNDUUNqMmtKK3BMR3UyakFPQmdOVkhROEJBZjhFQkFNQ0FRWXdQUVlEVlIwZ0JEWXdOREF5QmdSVgpIU0FBTUNvd0tBWUlLd1lCQlFVSEFnRVdIR2gwZEhBNkx5OXdiMnhwWTNrdVkyRnRaWEptYVhKdFlTNWpiMjB3CkRRWUpLb1pJaHZjTkFRRUZCUUFEZ2dJQkFKQVNyeUkxd3FNNThDN2U2YlhwZUh4SXZqOTlSWkplNmRxeEdmd1cKUEorMFcyYWVhdWZEdVYySTZBK3R6eU1QM2lVNlhzeFBwY0cxTGF3azBsZ0gzcUxQYVlSZ00rZ1FEUk9wSTlDRgo1WTU3cHA0OWNoTnlNL1dxZmNaakh3ajAvZ0YvSk04ckxGUUozdUlyYlpMR09VOFc2angrZWtiVVJXcEdxT3QxCmdsYW5xNkI4YUJNejlwMHc4RzhuT1NRaktwRDlrQ2sxOHBQZk5LWEc5L2p2akE5aVNueXUwL1ZVK0kyMm1sYUgKRm9JNk02dGFJZ2ozZ3JycUx1QkhtclMxUmFNRk85bmNMa1ZBTytyY2YrZzc2OUhzSnRnMXBEREZPcXhYbnJOMgpwU0I3K1I1S0JXSUJwaWgxWUplU0RXNCtUVGRERFpJVm5CZ2l6Vkdab0NrYVBGK0tNak5iTU1lSkwwZVlENk1ECnh2YnhyTjh5OE5tQkd1U2N2ZmFBRlBEUkxMbUY5ZGlqc2NpbEllVWNFNWZ1RHIzZkthbnZORk5iMCtScUU0UUcKdGpJQ3hGS3VJdExjc2lGQ0d0cEE4Q25KN0FvTVhPTFF1c3hJMHpjS3pCSUtpbm13UFFOL2FVdjBOQ0I5c3pUcQpqa3RrOVQ3OXN5Tm5GUTBFdVBBdHdRbFJQTEpzRmZDbEk5ZURkT1RsTHNuK21DZEN4cXZHbnJEUVd6aWxtMURlCmZoaVl0VVU3OW5tMDZQY2Fld2FEKzlDTDJydkh2UmlyQ0c4OGdHdEFQeGtadW1XSzVyN1ZYTk0yMSs5QVVpUmcKT0djRU1leVA4NExHM3JsVjh6c3hrVnJjdFFnVnJYWWxDZzE3TG9maURLWUd2Q1lRYlRlZDdOMTRqSHlBeGZEWgpkMGpRCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDggTz1BQyBDYW1lcmZpcm1hIFMuQS4KIyBTdWJqZWN0OiBDTj1HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDggTz1BQyBDYW1lcmZpcm1hIFMuQS4KIyBMYWJlbDogIkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwOCIKIyBTZXJpYWw6IDE0NTQxNTExNzczMTExNzg4NDk0CiMgTUQ1IEZpbmdlcnByaW50OiA5ZTo4MDpmZjo3ODowMTowYzoyZTpjMTozNjpiZDpmZTo5Njo5MDo2ZTowODpmMwojIFNIQTEgRmluZ2VycHJpbnQ6IDRhOmJkOmVlOmVjOjk1OjBkOjM1OjljOjg5OmFlOmM3OjUyOmExOjJjOjViOjI5OmY2OmQ2OmFhOjBjCiMgU0hBMjU2IEZpbmdlcnByaW50OiAxMzo2MzozNTo0Mzo5MzozNDphNzo2OTo4MDoxNjphMDpkMzoyNDpkZTo3MjoyODo0ZTowNzo5ZDo3Yjo1MjoyMDpiYjo4ZjpiZDo3NDo3ODoxNjplZTpiZTpiYTpjYQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJSFNUQ0NCVEdnQXdJQkFnSUpBTW5OMCtuVmZTUE9NQTBHQ1NxR1NJYjNEUUVCQlFVQU1JR3NNUXN3Q1FZRApWUVFHRXdKRlZURkRNRUVHQTFVRUJ4TTZUV0ZrY21sa0lDaHpaV1VnWTNWeWNtVnVkQ0JoWkdSeVpYTnpJR0YwCklIZDNkeTVqWVcxbGNtWnBjbTFoTG1OdmJTOWhaR1J5WlhOektURVNNQkFHQTFVRUJSTUpRVGd5TnpRek1qZzMKTVJzd0dRWURWUVFLRXhKQlF5QkRZVzFsY21acGNtMWhJRk11UVM0eEp6QWxCZ05WQkFNVEhrZHNiMkpoYkNCRAphR0Z0WW1WeWMybG5iaUJTYjI5MElDMGdNakF3T0RBZUZ3MHdPREE0TURFeE1qTXhOREJhRncwek9EQTNNekV4Ck1qTXhOREJhTUlHc01Rc3dDUVlEVlFRR0V3SkZWVEZETUVFR0ExVUVCeE02VFdGa2NtbGtJQ2h6WldVZ1kzVnkKY21WdWRDQmhaR1J5WlhOeklHRjBJSGQzZHk1allXMWxjbVpwY20xaExtTnZiUzloWkdSeVpYTnpLVEVTTUJBRwpBMVVFQlJNSlFUZ3lOelF6TWpnM01Sc3dHUVlEVlFRS0V4SkJReUJEWVcxbGNtWnBjbTFoSUZNdVFTNHhKekFsCkJnTlZCQU1USGtkc2IySmhiQ0JEYUdGdFltVnljMmxuYmlCU2IyOTBJQzBnTWpBd09EQ0NBaUl3RFFZSktvWkkKaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFNRGZWdFBrT3B0MlJiUVQyLy9CdGhtTE4wRVlsVkpINnhlZApLWWlPTld3R01pNUhZdk5KQkw5OVJEYXhjY3k5V2dsejFkbUZSUCtSVnlYZlhqYU9jTkZjY1VNZDJkcnZYTkw3Ckc3MDZ0Y3V0bzh4RXB3MnVJUlUvdVhwYmtuWFlwQkk0aVJtS3Q0RFM0akp2VnB5UjFvZ1FDN04wWkpKMFlQUDIKenhoUFlMSWowTWM3em1GTG1ZL0NETkJBc3BqY0RhaE9vN2tLcm1DZ3JVVlNZN3BtdldqZytiNGFxSUc3SGtGNApkZFBCL2dCVnNJZFU2Q2VRTlIxTU02MlgvSmN1bUlTL0xNbWp2OUdZRVJUdFkvakttSWhZRjVudFJRT1hmanlHCkhvaU12dktSaEk5bE5OZ0FUSDIzTVJkYUtYb0tHQ1F3b3plMWVxa0JmU2JXK1E2T1dmSDlHek8xS1RzWE8wRzIKSWQzVXdEMmxuNThmUTFESnU3eHNlcGVZN3MyTUgvdWNVYTZMY0wwbm4zSEFhNng5a0dibzExMDZEYkRWd28zVgp5SjJkd1czUTBMOVI1T1A0d3pnMnJ0YW5kZWF2aEVOZGs1SU1hZ2ZlT3gyWUl0YXN3VFhibzZBbC8zSzFkaDNlCmJla3NaaXhTaE5CRmtzNGM1ZVV6SGR3SFUxU2pxb0k3bWpjdjNOMmdaT25tM2IydS9HU0ZIVHlueVFiZWhQOXIKNkdzYVBNV2lzMEw3aXdrK1h3aFN4MkxFMUFWeHY4Ums1UGloZytnK0VwdW9IdFEyVFM5eDlvMG85b09wRTlKaAp3Wkc3U01BMGowR01TMHpiYVJML1VKU2NJSU5aYysxOG9mTHgvZDMzU2RORFdLQldZOG85UGVVMVZsbnBEc29nCnpDdExreWtQQWdNQkFBR2pnZ0ZxTUlJQlpqQVNCZ05WSFJNQkFmOEVDREFHQVFIL0FnRU1NQjBHQTFVZERnUVcKQkJTNUNjcWNIdHZUYkRwcnJ1MVU4VnVUQmpVdVhqQ0I0UVlEVlIwakJJSFpNSUhXZ0JTNUNjcWNIdHZUYkRwcgpydTFVOFZ1VEJqVXVYcUdCc3FTQnJ6Q0JyREVMTUFrR0ExVUVCaE1DUlZVeFF6QkJCZ05WQkFjVE9rMWhaSEpwClpDQW9jMlZsSUdOMWNuSmxiblFnWVdSa2NtVnpjeUJoZENCM2QzY3VZMkZ0WlhKbWFYSnRZUzVqYjIwdllXUmsKY21WemN5a3hFakFRQmdOVkJBVVRDVUU0TWpjME16STROekViTUJrR0ExVUVDaE1TUVVNZ1EyRnRaWEptYVhKdApZU0JUTGtFdU1TY3dKUVlEVlFRREV4NUhiRzlpWVd3Z1EyaGhiV0psY25OcFoyNGdVbTl2ZENBdElESXdNRGlDCkNRREp6ZFBwMVgwanpqQU9CZ05WSFE4QkFmOEVCQU1DQVFZd1BRWURWUjBnQkRZd05EQXlCZ1JWSFNBQU1Db3cKS0FZSUt3WUJCUVVIQWdFV0hHaDBkSEE2THk5d2IyeHBZM2t1WTJGdFpYSm1hWEp0WVM1amIyMHdEUVlKS29aSQpodmNOQVFFRkJRQURnZ0lCQUlDSWYzRGVraWpaQlpSRy81QlhxZkV2M3hvTmEvcDhEaHhKSkhrbjJFYXFieWxaClVvaHdFdXJkUGZXYlUxUnY0V0NpcUFtNTdPdFpmTVkxOGR3WTZmRm41YSs2UmVBSjNzcEVEOElYRG5lUlJYb3oKWDErV0xHaUx3VWVQbUpzOXdPekw5ZFdDa29RMTBiNDJPRlp5TVZ0SExhb1hwR05SNndvQnJYL3NkWjdMb1IveApmeEt4dWVSa2YyZldJeXIwdURsZG1PZ2hwK0c5UFVJYWRKcHdyMmhzVUYxSnovLzdEbDNtTEVmWGdUcFpBTFZ6CmEyTWc5akZGQ0RrTzlIQitRSEJhUDlCclFxbDBQU2d2QW0xMWNwVUpqVWhqeHNZalY1S1RYalhCamZrSzl5eWQKWWh6MnJYemRwakVldHJISGZvVW0rcVJxdGRwak1OSHZremV5Wmk5OUJmZm50MHVZbERYQTJUb3B3WjJ5VURNZApTcWxhcHNrRDcrMzA1Nmh1aXJSWGhPdWtQOUR1cXFxSFcyUG9rK0pycU5TNGNuaHJHKzA1NUYzTG02cUgxVTlPCkFQN1phcDg4TVE4b0FnRjltT2luc0tKa25ubjRTUElWcWN6bXlFVHJQM2laOG50eFBqenhtS2ZGR0JJLzVyc28KTTBMcFJRcDhiZktHZVMvRmdobDlDWWw4c2xSMmlLN2V3ZlBNNFc3Yk1kYVRycG1nN3lWcWM1aUpXem91RTRnZQp2OENTbERRYjR5ZTNpeDV2UXYvbjZUZWJVQjB0b3ZrQzdzdFlXRHB4dkdqanFzR3ZIQ2dmb3R3alpUK0I2cTZaCjA5Z3d6eE1OVHhYSmhMeW5TQzM0TUNOMzJFWkxlVzMyak8wNmYyQVJlUFRwbTY3VlZNQjBnTkVMUXAvQgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049R28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMiBPPUdvRGFkZHkuY29tLCBJbmMuCiMgU3ViamVjdDogQ049R28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMiBPPUdvRGFkZHkuY29tLCBJbmMuCiMgTGFiZWw6ICJHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyIgojIFNlcmlhbDogMAojIE1ENSBGaW5nZXJwcmludDogODA6M2E6YmM6MjI6YzE6ZTY6ZmI6OGQ6OWI6M2I6Mjc6NGE6MzI6MWI6OWE6MDEKIyBTSEExIEZpbmdlcnByaW50OiA0NzpiZTphYjpjOToyMjplYTplODowZTo3ODo3ODozNDo2MjphNzo5Zjo0NTpjMjo1NDpmZDplNjo4YgojIFNIQTI1NiBGaW5nZXJwcmludDogNDU6MTQ6MGI6MzI6NDc6ZWI6OWM6Yzg6YzU6YjQ6ZjA6ZDc6YjU6MzA6OTE6Zjc6MzI6OTI6MDg6OWU6NmU6NWE6NjM6ZTI6NzQ6OWQ6ZDM6YWM6YTk6MTk6OGU6ZGEKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR4VENDQXEyZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBRENCZ3pFTE1Ba0dBMVVFQmhNQ1ZWTXgKRURBT0JnTlZCQWdUQjBGeWFYcHZibUV4RXpBUkJnTlZCQWNUQ2xOamIzUjBjMlJoYkdVeEdqQVlCZ05WQkFvVApFVWR2UkdGa1pIa3VZMjl0TENCSmJtTXVNVEV3THdZRFZRUURFeWhIYnlCRVlXUmtlU0JTYjI5MElFTmxjblJwClptbGpZWFJsSUVGMWRHaHZjbWwwZVNBdElFY3lNQjRYRFRBNU1Ea3dNVEF3TURBd01Gb1hEVE0zTVRJek1USXoKTlRrMU9Wb3dnWU14Q3pBSkJnTlZCQVlUQWxWVE1SQXdEZ1lEVlFRSUV3ZEJjbWw2YjI1aE1STXdFUVlEVlFRSApFd3BUWTI5MGRITmtZV3hsTVJvd0dBWURWUVFLRXhGSGIwUmhaR1I1TG1OdmJTd2dTVzVqTGpFeE1DOEdBMVVFCkF4TW9SMjhnUkdGa1pIa2dVbTl2ZENCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcGRIa2dMU0JITWpDQ0FTSXcKRFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUw5eFlnangrbGswOXh2SkdLUDNnRWxZNlNLRApFNmJGSUVNQk80VHg1b1ZKbnlmcTlvUWJUcUMwMjNDWXh6SUJzUVUrQjA3dTlQcFBMMWt3SXVlckdWWnI0b0FICi9QTVdkWUE1VVh2bCtUVzJkRTZwallJVDVMWS9xUU9EK3FLK2loVnFmOTRMdzdZWkZBWEs2c09vQkpRN1Jud3kKRGZNQVppTElqV2x0Tm93UkdMZlRzaHhndERqNkFvek8wOTFHQjk0S1B1dGRmTWg4KzdBclU2U1NZbWxSSlFWaApHa1NCakN5cFE1WWozNnc2Z1pvT0tjVWNxZWxkSHJhZW5qQUtPYzd4aUlEN1MxM01NdXlGWWtNbE5BSldKd0dSCnREdHdLajl1c2VpY2lBRjluOVQ1MjFOdFlKMi9MT2RZcTdoZlJ2ek94QnNEUEFuclNURmNhVWF6NEVjQ0F3RUEKQWFOQ01FQXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPQkJZRQpGRHFhaFFjUVp5aTI3L2E5QlVGdUlNR1UyZy9lTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFDWjIxMTUxZm1YCldXY0RZZkYrT3dZeGRTMmhJSTVQWlllMDk2YWN2TmpwTDlEYld1N1BkSXh6dERoQzJnVjcrQUoxdVAybHNkZXUKOXRmZUU4dFRFSDZLUnRHWCtyY3VLeEdya0xBbmdQbm9uMXJwTjUrcjVOOXNzNFVYblQzWkpFOTVrVFhXWHdUcgpnSU9ybWdJdHRSRDAySkRIQkhOQTdYSWxvS21mN0o2cmFCS1pWOGFQRWpvSnBMMUUvUVlWTjhHYjVES2o3VGpvCjJHVHpMSDRVL0FMcW44My9CMmdYMnlLUU9DMTZqZEZVOFdualh6UEtlajE3Q3VQS2YxODU1ZUoxdXNWMkdEUE8KTFBBdlRLMzNzZWZPVDZqRW0wcFVCc1YvZmRVSUQrSWMvbjRYdUt4ZTl0UVdza01KREUzMnAydTBtWVJseW5xSQo0dUpFdmx6MzZoejEKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyIE89U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLgojIFN1YmplY3Q6IENOPVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyIE89U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLgojIExhYmVsOiAiU3RhcmZpZWxkIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIiCiMgU2VyaWFsOiAwCiMgTUQ1IEZpbmdlcnByaW50OiBkNjozOTo4MTpjNjo1Mjo3ZTo5Njo2OTpmYzpmYzpjYTo2NjplZDowNTpmMjo5NgojIFNIQTEgRmluZ2VycHJpbnQ6IGI1OjFjOjA2OjdjOmVlOjJiOjBjOjNkOmY4OjU1OmFiOjJkOjkyOmY0OmZlOjM5OmQ0OmU3OjBmOjBlCiMgU0hBMjU2IEZpbmdlcnByaW50OiAyYzplMTpjYjowYjpmOTpkMjpmOTplMTowMjo5OTozZjpiZToyMTo1MTo1MjpjMzpiMjpkZDowYzphYjpkZToxYzo2ODplNTozMTo5Yjo4Mzo5MTo1NDpkYjpiNzpmNQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRDNUQ0NBc1dnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFzRkFEQ0JqekVMTUFrR0ExVUVCaE1DVlZNeApFREFPQmdOVkJBZ1RCMEZ5YVhwdmJtRXhFekFSQmdOVkJBY1RDbE5qYjNSMGMyUmhiR1V4SlRBakJnTlZCQW9UCkhGTjBZWEptYVdWc1pDQlVaV05vYm05c2IyZHBaWE1zSUVsdVl5NHhNakF3QmdOVkJBTVRLVk4wWVhKbWFXVnMKWkNCU2IyOTBJRU5sY25ScFptbGpZWFJsSUVGMWRHaHZjbWwwZVNBdElFY3lNQjRYRFRBNU1Ea3dNVEF3TURBdwpNRm9YRFRNM01USXpNVEl6TlRrMU9Wb3dnWTh4Q3pBSkJnTlZCQVlUQWxWVE1SQXdEZ1lEVlFRSUV3ZEJjbWw2CmIyNWhNUk13RVFZRFZRUUhFd3BUWTI5MGRITmtZV3hsTVNVd0l3WURWUVFLRXh4VGRHRnlabWxsYkdRZ1ZHVmoKYUc1dmJHOW5hV1Z6TENCSmJtTXVNVEl3TUFZRFZRUURFeWxUZEdGeVptbGxiR1FnVW05dmRDQkRaWEowYVdacApZMkYwWlNCQmRYUm9iM0pwZEhrZ0xTQkhNakNDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DCmdnRUJBTDN0d1FQODlvLzhBckZ2VzU5STJaMTU0cUszQTJGV0dNTkh0dGZLUFRVdWlVUDNvV21iM29vYS9STWcKbkxSSmR6SXBWdjI1N0l6ZEl2cHkzQ2RobCs3MldvVHNiaG01aVN6Y2hGdlZkUHRyWDhXSnBSQlNpVVpWOUxoMQpIT1ovNUZTdVMvaFZjbGNDR2ZnWGNWbnJIaWdIZE1XZFNMNXN0UFNrc1BOa04zbVN3T3hHWG4vaGJWTk1ZcS9OCkh3dGp1enFkKy94NUFKaGhkTThtZ2tCajg3SnlhaGtObWNyVURuWE1OL3VMaWNGWjhXSi9YN05mWlRENHA3ZE4KZGxvZWRsNDB3T2lXVnBtS3MvQi9wTTI5M0RJeGZKSFA0RjhSK0d1cVNWelJtWlRSb3VOald3bDJ0VlppNFV0MApIWmJVSnRRSUJGblFtQTRPNXQ3OHcrd2ZrUEVDQXdFQUFhTkNNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPCkJnTlZIUThCQWY4RUJBTUNBUVl3SFFZRFZSME9CQllFRkh3TU1oK24yVEIveEgxb28yS29vYzZyQjFzbk1BMEcKQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUFSV2ZvbFR3TnZsSms3bWgrQ2hUblVkZ1dVWHVFb2syMWlYUW5Db0tqVQpzSFU0OFRScW5lU2Zpb1ltVWVZczBjWXRicFVnU3BJQjdMaUtaM3N4NG1jdWpKVURKaTVEblVveDlnNjFETHUzCjRqZC9Jcm9Bb3c1N1V2dHJ1enZFMDNsUlRzMlE5R2NIR2NnOFJub05BWDNGV09kdDVvVXdGNW9reEJEZ0JQZmcKOG4vVXFnci9RaDAzN1pUbFpGa1NJSGM0MHpJK09JRjFsblA2YUkreHk4NGZ4ZXo2bkg3UGZySHhCeTIyL0wvSwpwTC9RbHdWS3ZPb1lLQUtRdlZSNENTRngwOUY5SGRrV3NLbGhQZEFLQUNMOHgzdkxDV1JGQ3p0QWdmZDlmREwxCm1NcFlqbjBxN3BCWmMyVDVOblJlSmFIMVpnVXVmemtWcVNyN1VJdU9oV24wCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1TdGFyZmllbGQgU2VydmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMiBPPVN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4KIyBTdWJqZWN0OiBDTj1TdGFyZmllbGQgU2VydmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMiBPPVN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4KIyBMYWJlbDogIlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyIgojIFNlcmlhbDogMAojIE1ENSBGaW5nZXJwcmludDogMTc6MzU6NzQ6YWY6N2I6NjE6MWM6ZWI6ZjQ6Zjk6M2M6ZTI6ZWU6NDA6Zjk6YTIKIyBTSEExIEZpbmdlcnByaW50OiA5Mjo1YTo4Zjo4ZDoyYzo2ZDowNDplMDo2Njo1Zjo1OTo2YTpmZjoyMjpkODo2MzplODoyNTo2ZjozZgojIFNIQTI1NiBGaW5nZXJwcmludDogNTY6OGQ6Njk6MDU6YTI6Yzg6ODc6MDg6YTQ6YjM6MDI6NTE6OTA6ZWQ6Y2Y6ZWQ6YjE6OTc6NGE6NjA6NmE6MTM6YzY6ZTU6Mjk6MGY6Y2I6MmE6ZTY6M2U6ZGE6YjUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQ3ekNDQXRlZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBRENCbURFTE1Ba0dBMVVFQmhNQ1ZWTXgKRURBT0JnTlZCQWdUQjBGeWFYcHZibUV4RXpBUkJnTlZCQWNUQ2xOamIzUjBjMlJoYkdVeEpUQWpCZ05WQkFvVApIRk4wWVhKbWFXVnNaQ0JVWldOb2JtOXNiMmRwWlhNc0lFbHVZeTR4T3pBNUJnTlZCQU1UTWxOMFlYSm1hV1ZzClpDQlRaWEoyYVdObGN5QlNiMjkwSUVObGNuUnBabWxqWVhSbElFRjFkR2h2Y21sMGVTQXRJRWN5TUI0WERUQTUKTURrd01UQXdNREF3TUZvWERUTTNNVEl6TVRJek5UazFPVm93Z1pneEN6QUpCZ05WQkFZVEFsVlRNUkF3RGdZRApWUVFJRXdkQmNtbDZiMjVoTVJNd0VRWURWUVFIRXdwVFkyOTBkSE5rWVd4bE1TVXdJd1lEVlFRS0V4eFRkR0Z5ClptbGxiR1FnVkdWamFHNXZiRzluYVdWekxDQkpibU11TVRzd09RWURWUVFERXpKVGRHRnlabWxsYkdRZ1UyVnkKZG1salpYTWdVbTl2ZENCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcGRIa2dMU0JITWpDQ0FTSXdEUVlKS29aSQpodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU5VTU9zUXErVTdpOWI0WmwxK09pRk94SHovTHo1OGdFMjBwCk9zZ1BmVHozYTNZNFk5azJZS2liWGx3QWdMSXZXWC8yaC9rbFE0Ym5hUnRTbXBEaGNlUFlMUTFPYi9iSVNkbTIKOHhwV3JpdTJkQlRyei9zbTR4cTZIWll1YWp0WWxJbEhWdjhsb0pOd1U0UGFoSFFVdzJlZUJHZzYzNDVBV2gxSwpUczlEa1R2blZ0WUFjTXRTN250OXJqcm52REg1UmZiQ1lNOFRXUUlyZ013MFI5KzUzcEJsYlFMUExKR21wdWZlCmhSaEpmR1pPb3pwdHFiWHVOQzY2RFFPNE05OUg2N0ZyalNYWm04NkIwVVZHTXBad2g5NENEa2xEaGJac2M3dGsKNm1GQnJNblVWTitITDhjaXNpYk1uMWxVYUovOHZpb3Z4RlVjZFVCZ0Y0VUNWVG1MZndVQ0F3RUFBYU5DTUVBdwpEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPQkJZRUZKeGZBTitxCkFkY3dLemlJb3JodFNwenlFWkdETUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFCTE5xYUVkMm5kT3htZlp5TUkKYnc1aHlmMkUzRi9ZTm9ITjJCdEJMWjlnM2NjYWFOblJib2JoaUNQUEU5NUR6K0kwc3dTZEh5blZ2L2hleU5YQgp2ZTZTYnpKMDhwR0NMNzJDUW5xdEtyY2dmVTI4ZWxVU3doWHF2ZmRxbFM1c2RKL1BITFR5eFFHamhkQnlQcTF6CnF3dWJkUXh0UmJlT2xLeVdON1dnMEk4VlJ3N2o2SVBkai8zdlFRRjN6Q2VwWW9VejhqY0k3M0hQZHdiZXlCa2QKaUVEUGZVWWQveDdINGM3L0k5dkcrbzFWVHFrQzUwY1JSajcwL2IxN0tTYTdxV0ZpTnlpMkxTcjJFSVpreVhDbgowcTIzS1hCNTZqemFZeVdmL1dpM01PeHcrM1dLdDIxZ1o3SWV5TG5wMktodkFvdG5EVTBtVjNIYUlQekJTbENOCnNTaTYKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUFmZmlybVRydXN0IENvbW1lcmNpYWwgTz1BZmZpcm1UcnVzdAojIFN1YmplY3Q6IENOPUFmZmlybVRydXN0IENvbW1lcmNpYWwgTz1BZmZpcm1UcnVzdAojIExhYmVsOiAiQWZmaXJtVHJ1c3QgQ29tbWVyY2lhbCIKIyBTZXJpYWw6IDg2MDgzNTU5Nzc5NjQxMzg4NzYKIyBNRDUgRmluZ2VycHJpbnQ6IDgyOjkyOmJhOjViOmVmOmNkOjhhOjZmOmE2OjNkOjU1OmY5Ojg0OmY2OmQ2OmI3CiMgU0hBMSBGaW5nZXJwcmludDogZjk6YjU6YjY6MzI6NDU6NWY6OWM6YmU6ZWM6NTc6NWY6ODA6ZGM6ZTk6NmU6MmM6Yzc6YjI6Nzg6YjcKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDAzOjc2OmFiOjFkOjU0OmM1OmY5OjgwOjNjOmU0OmIyOmUyOjAxOmEwOmVlOjdlOmVmOjdiOjU3OmI2OjM2OmU4OmE5OjNjOjliOjhkOjQ4OjYwOmM5OjZmOjVmOmE3Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEVERDQ0FqU2dBd0lCQWdJSWQzY0dKeWFwc1h3d0RRWUpLb1pJaHZjTkFRRUxCUUF3UkRFTE1Ba0dBMVVFCkJoTUNWVk14RkRBU0JnTlZCQW9NQzBGbVptbHliVlJ5ZFhOME1SOHdIUVlEVlFRRERCWkJabVpwY20xVWNuVnoKZENCRGIyMXRaWEpqYVdGc01CNFhEVEV3TURFeU9URTBNRFl3TmxvWERUTXdNVEl6TVRFME1EWXdObG93UkRFTApNQWtHQTFVRUJoTUNWVk14RkRBU0JnTlZCQW9NQzBGbVptbHliVlJ5ZFhOME1SOHdIUVlEVlFRRERCWkJabVpwCmNtMVVjblZ6ZENCRGIyMXRaWEpqYVdGc01JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0MKQVFFQTlodFBad2Nyb1JYMUJpTExId0d5NDNORkJrUkpMTHRKSlJUV3pzTzNxeXhQeGtFeWxGZjZFcWRiRHVLUApIeDZHR2FlcXRTMjVYdzJLd3ErRk5Ya3lMYnNjWWpmeXNWdEtQY3JOY1YvcFFyNlU2TWplK1NKSVpNYmxxOFlyCmJhMEY4UHJWQzgrYTVmQlFwSXM3UjZValczcDYrRE0vdU8rWmwrTWd3ZFlvaWMrVSs3bEY3ZU5BRnhIVWRQQUwKTWVJckptcWJURmV1ckNBK3VrVjZCZk85bTJrVnJuMU9JR1BFTlhZNkJ3TEpOLzNIUis3bzhYWWRjeFh5bDZTMQp5SHA1MlVLcUszOWMvczRtVDZObWdUV3ZSTHBVSGh3d01tV2Q1anlUWGxCT2V1TTYxRzdNR3Z2NTBqZXVKQ3FyClZ3TWlLQTFKZFgrM0tOcDF2NDdqM0E1NU1RSURBUUFCbzBJd1FEQWRCZ05WSFE0RUZnUVVuWlBHVTR0ZXlxOC8Kbng0UDVabVZ2Q1QybEk4d0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3RFFZSgpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFGaXM5QVFPemNBTi93cjkxTG9XWHltOWUyaVpXRW5TdEIwM1RYOG5mVVlHClhVUEdoaTQrYzdJbWZVK1RxYmJFS3BxcklaY1VzZDZNMDZ1SkZkaHJKTlR4RnE3WXBGelVmMUdPN1JnQnNaTmoKdmJ6NFlZQ2FuckhPUW5EaXFYMEdKWDBub2Y1djdMTWVKTnJqUzFVYUFEczF0RHZaMTEwdy9ZRVRpZkxDQml2dApaOFNPeVVPeVhHc1ZpUUs4WXZ4TzhyVXpxckp2MHdxaVVPUDJPK2d1Uk1MYlpqaXBNMVpJOFcwYk00ME5qRDlnCk41M1R5bTErTkg0Tm4zSjJpeHVmY3YxU05VRkZBcFl2SExLYWMwa2hzVWxIUlVlMDcybzBFY2xObXN4WnQ5WUMKbmxwT1piV1VyaHZmS2JBVzhiOEFuZ2M2RjJTMUJMVWpJWmtLbFR1WGZPOD0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUFmZmlybVRydXN0IE5ldHdvcmtpbmcgTz1BZmZpcm1UcnVzdAojIFN1YmplY3Q6IENOPUFmZmlybVRydXN0IE5ldHdvcmtpbmcgTz1BZmZpcm1UcnVzdAojIExhYmVsOiAiQWZmaXJtVHJ1c3QgTmV0d29ya2luZyIKIyBTZXJpYWw6IDg5NTczODI4MjcyMDY1NDc3NTcKIyBNRDUgRmluZ2VycHJpbnQ6IDQyOjY1OmNhOmJlOjAxOjlhOjlhOjRjOmE5OjhjOjQxOjQ5OmNkOmMwOmQ1OjdmCiMgU0hBMSBGaW5nZXJwcmludDogMjk6MzY6MjE6MDI6OGI6MjA6ZWQ6MDI6ZjU6NjY6YzU6MzI6ZDE6ZDY6ZWQ6OTA6OWY6NDU6MDA6MmYKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDBhOjgxOmVjOjVhOjkyOjk3Ojc3OmYxOjQ1OjkwOjRhOmYzOjhkOjVkOjUwOjlmOjY2OmI1OmUyOmM1OjhmOmNkOmI1OjMxOjA1OjhiOjBlOjE3OmYzOmYwOmI0OjFiCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEVERDQ0FqU2dBd0lCQWdJSWZFOEVPUnpVbVMwd0RRWUpLb1pJaHZjTkFRRUZCUUF3UkRFTE1Ba0dBMVVFCkJoTUNWVk14RkRBU0JnTlZCQW9NQzBGbVptbHliVlJ5ZFhOME1SOHdIUVlEVlFRRERCWkJabVpwY20xVWNuVnoKZENCT1pYUjNiM0pyYVc1bk1CNFhEVEV3TURFeU9URTBNRGd5TkZvWERUTXdNVEl6TVRFME1EZ3lORm93UkRFTApNQWtHQTFVRUJoTUNWVk14RkRBU0JnTlZCQW9NQzBGbVptbHliVlJ5ZFhOME1SOHdIUVlEVlFRRERCWkJabVpwCmNtMVVjblZ6ZENCT1pYUjNiM0pyYVc1bk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0MKQVFFQXRJVE1NeGN1YTVSc2EyRlNvT3VqejNtVVRPV1VnSm5MVldSRVpZOW5aT0lHNDF3M1NmWXZtNFNFSGkzeQpZSjB3VHN5RWhlSXN6eDZlL2phck0zYzFSTmcxbGhvOU51aDZEdGpWUjZGcWFZdlovTHM2cm5sYTFmVFdjYnVhCmtDTnJtcmVJZEljTUhsKzVuaTM2cTFNcjNMdDJQcE5NQ0FpTUhxSWpITlJxclNLNm1RRXViV1hMdmlSbVZTUkwKUUVTeEc5Zmh3b1hBM2hBL1BlMjQvUEh4STFQY3YyV1hiOW41UUhHTmZiMlYxTTYrb0Y0bkk5NzlwdEFtRGdBcAo2enhHOEQxZ3Z6OVEwdHdtUVZHZUZEZENCS053VjZnYmgrMHQrbnZ1akFyanFXYUpHY3RCK2QxRU5tSFA0bmRHCnlIMzI5SktCTnYzYk5QRnlmdk1NRnIyMEZRSURBUUFCbzBJd1FEQWRCZ05WSFE0RUZnUVVCeC9TNTV6YXdtNmkKUUxTd2VsQVFVSFRFeUwwd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3RFFZSgpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFJbFhzaFo2cU1MOTF0bWJtelRDbkxReUZFMm5wTi9zdnFlKytFUGJrVGZPCnRESXVVRlVhTlU1MlEzRWc3NU4zVGhWd0xvZkR3UjF0M011MUo5UXNWdEZTVXpwRTBuUEl4QnNGWlZwaWtwenUKUVkweDIrYzA2bGtoMVFGNjEyUzRaRG5OeWUydjdVc0RTS2VnbVFHQTNHV2pOcTVsV1VoUGdrdklaZkZYSGVWWgpMZ28vYk5qUjllVUp0R3hVQUFyZ0ZVMkhkVzIzV0paYTNXM1NBS0QwbTBpK3d6ZWt1amJnZkllRmx4b1ZvdDR1Cm9sdTlyeGo1a0ZETmNGbjRKMmRIeThlZ0J6cDkwU3hkYkJrNlpyVjkvWkZ2Z3JHK0NKUGJGRWZ4b2pmSFJaNDgKeDNldlpLaVQzL1pwZzRKZzhrbENOTzFhQUZTRkhCWTJrZ3hjK3FhdHY5cz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUFmZmlybVRydXN0IFByZW1pdW0gTz1BZmZpcm1UcnVzdAojIFN1YmplY3Q6IENOPUFmZmlybVRydXN0IFByZW1pdW0gTz1BZmZpcm1UcnVzdAojIExhYmVsOiAiQWZmaXJtVHJ1c3QgUHJlbWl1bSIKIyBTZXJpYWw6IDc4OTM3MDY1NDA3MzQzNTIxMTAKIyBNRDUgRmluZ2VycHJpbnQ6IGM0OjVkOjBlOjQ4OmI2OmFjOjI4OjMwOjRlOjBhOmJjOmY5OjM4OjE2Ojg3OjU3CiMgU0hBMSBGaW5nZXJwcmludDogZDg6YTY6MzM6MmM6ZTA6MDM6NmY6YjE6ODU6ZjY6NjM6NGY6N2Q6NmE6MDY6NjU6MjY6MzI6Mjg6MjcKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDcwOmE3OjNmOjdmOjM3OjZiOjYwOjA3OjQyOjQ4OjkwOjQ1OjM0OmIxOjE0OjgyOmQ1OmJmOjBlOjY5OjhlOmNjOjQ5OjhkOmY1OjI1Ojc3OmViOmYyOmU5OjNiOjlhCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGUmpDQ0F5NmdBd0lCQWdJSWJZd1VSckdtQ3U0d0RRWUpLb1pJaHZjTkFRRU1CUUF3UVRFTE1Ba0dBMVVFCkJoTUNWVk14RkRBU0JnTlZCQW9NQzBGbVptbHliVlJ5ZFhOME1Sd3dHZ1lEVlFRRERCTkJabVpwY20xVWNuVnoKZENCUWNtVnRhWFZ0TUI0WERURXdNREV5T1RFME1UQXpObG9YRFRRd01USXpNVEUwTVRBek5sb3dRVEVMTUFrRwpBMVVFQmhNQ1ZWTXhGREFTQmdOVkJBb01DMEZtWm1seWJWUnlkWE4wTVJ3d0dnWURWUVFEREJOQlptWnBjbTFVCmNuVnpkQ0JRY21WdGFYVnRNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQWc4QU1JSUNDZ0tDQWdFQXhCTGYKcVYvK1FkM2Q5WitLNC9hczRUeDRtcnpZOEg5Nm9ETXEzSTBnVzY0dGIrZVQyVFp3YW1qUGpsR2poVnRuQktBUQpKRzlkS0lMQmwxZllTQ2tUdHVHK2tVM2ZoUXhUR0pvZUpLSlBqL0NpaFF2TDlDbC8wcVJZN2laTnlhcW9lNXJaCitqamVSRmNWNWZpTXlObEk0ZzBXSngwZXlJT0ZKYmU2cWxWQnpBTWlTeTJSall2bWlhOW14K24vSytrOHJOclMKczhQaGFKeUorSG9BVnQ3MFZaVnMrN3BrM1dLTDN3dDNNdXRpekNhYW03dXFZb05NdEFaNk1NZ3B2KzBHVFplNQpITVF4SzlWZnZGTVNGNXlaVnlsbWQyRWhNUWN1SlVtZEdQTHU4eXR4akxXNk9RZEpkL3p2THBLUUJZMHRMM2Q3CjcwTy9OYnVhMlBsenB5enkwRmZ1S0U0bVg0K1FhQWt2dVBqY0J1a3VtajVScDlFaXhBcW5PRWhzcy9uL2ZhdUcKVitPNjFvVjRkN3BENmtoLzl0aStJMjBldjlFMmJGaGM4ZTZrR1ZRYTlRUFNkdWJoakwwOHM5TklTK0xJK0grUwpxSFpHbkVKbFBxUWV3UWNEV2tZdHVKZnp0OVd5VlNIdnV0eE1BSmY3RkpVbk03L29RMGRHMGdpWkZtQTdtbjdTCjV1MDQ2dXdCSGp4SVZra0p4MHczQUo2SURzQno0VzltNlhKSE1ENFE1UXNEeVpwQ0FHekZsSDVoeElyZmY0SWEKQzFuRVdUSjNzN3hnYVZZNS9iUUdleXpXWkRiWnZVanRoQjkrcFNLUEtyaEM5SUszMUZPUWVFNHRHdjJCYjBUWApPd0YwbGtMZ0FPSXVhK3JGN25Lc3U3Lys2cXFvK056MnNubUt0bWNDQXdFQUFhTkNNRUF3SFFZRFZSME9CQllFCkZKM0FaNllNSXRrbTlVV3JwbVZTRVNmWVJheGpNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC8KQkFRREFnRUdNQTBHQ1NxR1NJYjNEUUVCREFVQUE0SUNBUUN6VjAwUVlrNDY1S3pxdUJ5dk1pUElzMGxhVVp4MgpLSTE1cWxkR0Y5WDFVdmEzUk9nSVJMOFloTklMZ00zRkV2MEFWUVZoaDBIY3RTU2VQTVRZeVB0d25pOTRsb01nCk50NThEMmtUaUtWMU5wZ0lwc2Jmck03aldOYTNQdDY2OCtzMFFOaWlnZlY0UHkvVnBmelpvdFJlQkE0WHJmNUIKOE9XeWN2cEVnak5DNkMxWTkxYU1Zais2UXJDY0RGeCtMbVVtWEZOUEFMSjRmcUVObVMyTnVCMk9vc1N3L1dEUQpNS1NPeUFSaXFjVHROZDU2bCswT09GNlNMNU53cGFtY2I2ZDlFeDEreGdoSXNWNW42MUVJSmVubUpXdFNLWkdjCjBqbHpDRmZlbVFhMFc1MFFCdUhDQUtpNEhFb0NDaFRRd1VISys0dzFJWDJDT1BLcFZKRVpOWk9VYldvNnhiTFEKdTRtR2sraWJ5UTg2cDNxNG9mQjRSdnI4TnkvbGlvVHozLzRFMmFGb29DOGs0Z21WQnRXVnl1RWtsdXQ4OXBNRgp1KzF6NlMzUmRUblg1eVRiMkU1ZlE0K2UwQlE1djFWd1NKbFhNYlNjN2txWUE1WXdIMkFHN2hzai9vRmdJeHBICllvV2x6QmswZ0crenJCcmpuL0I3U0szVkFkbG50cWx5aytvdFpyV3l1T1E5UExMdlRJenE2d2UvcXpXYVZZYTgKR0thMXFGNjBnMnhyYVVEVG45enh3MmxydWVGdENmVHhxbEIyQ25wOWVoZWhWWlpDbVRFSjNXQVJqUVV3ZnVhTwpSdEdkRk5ySEYrUUZsb3pFSkxVYnp4UUhza0Q0bzU1Qmhyd0UwR3VXeUNxQU5QMi83d2FqM1ZqRmhUMCtqLzZlCktlQzJ1QWxvR1J3WVF3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUFmZmlybVRydXN0IFByZW1pdW0gRUNDIE89QWZmaXJtVHJ1c3QKIyBTdWJqZWN0OiBDTj1BZmZpcm1UcnVzdCBQcmVtaXVtIEVDQyBPPUFmZmlybVRydXN0CiMgTGFiZWw6ICJBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQyIKIyBTZXJpYWw6IDg0MDEyMjQ5MDc4NjE0OTAyNjAKIyBNRDUgRmluZ2VycHJpbnQ6IDY0OmIwOjA5OjU1OmNmOmIxOmQ1Ojk5OmUyOmJlOjEzOmFiOmE2OjVkOmVhOjRkCiMgU0hBMSBGaW5nZXJwcmludDogYjg6MjM6NmI6MDA6MmY6MWQ6MTY6ODY6NTM6MDE6NTU6NmM6MTE6YTQ6Mzc6Y2E6ZWI6ZmY6YzM6YmIKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGJkOjcxOmZkOmY2OmRhOjk3OmU0OmNmOjYyOmQxOjY0OjdhOmRkOjI1OjgxOmIwOjdkOjc5OmFkOmY4OjM5OjdlOmI0OmVjOmJhOjljOjVlOjg0Ojg4OjgyOjE0OjIzCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlCL2pDQ0FZV2dBd0lCQWdJSWRKY2xpc2MvZWxRd0NnWUlLb1pJemowRUF3TXdSVEVMTUFrR0ExVUVCaE1DClZWTXhGREFTQmdOVkJBb01DMEZtWm1seWJWUnlkWE4wTVNBd0hnWURWUVFEREJkQlptWnBjbTFVY25WemRDQlEKY21WdGFYVnRJRVZEUXpBZUZ3MHhNREF4TWpreE5ESXdNalJhRncwME1ERXlNekV4TkRJd01qUmFNRVV4Q3pBSgpCZ05WQkFZVEFsVlRNUlF3RWdZRFZRUUtEQXRCWm1acGNtMVVjblZ6ZERFZ01CNEdBMVVFQXd3WFFXWm1hWEp0ClZISjFjM1FnVUhKbGJXbDFiU0JGUTBNd2RqQVFCZ2NxaGtqT1BRSUJCZ1VyZ1FRQUlnTmlBQVFOTUY0YkZaMEQKMEtGNU5iYzZQSko2eWhVY3pXTHpuQ1pjQnozbFZQcWoxc3dTNnZRVVgraU9HYXN2TGtqbXJCaERlS3pRTjhPOQpzczBzNWtmaUd1Wmp1RDB1TDNqRVQ5djBENlJvVEZWeWE1VWRUaGhDbFhqTU56eVI0cHRsS3ltalFqQkFNQjBHCkExVWREZ1FXQkJTYXJ5bDZ3QkUxTlNaUk1BRERhdjVBMWE3V1BEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEcKQTFVZER3RUIvd1FFQXdJQkJqQUtCZ2dxaGtqT1BRUURBd05uQURCa0FqQVhDZk9IaUZCYXI4akFRcjlIWC9Wcwphb2JneENkMDVEaFQxd1YvR3pUanhpK3p5Z2s4TjUzWDU3aEc4ZjJoNG5FQ01FSlpoMFBVVWQrNjB3a3lXczZJCmZsYzluRjlDYS9VSExiWHdncFA1V1crdVpQcFk1WXNlNDJPK3RZSE5id0tNZVE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049Q2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSBPPVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4gT1U9Q2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgU3ViamVjdDogQ049Q2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSBPPVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4gT1U9Q2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5CiMgTGFiZWw6ICJDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBIgojIFNlcmlhbDogMjc5NzQ0CiMgTUQ1IEZpbmdlcnByaW50OiBkNTplOTo4MTo0MDpjNToxODo2OTpmYzo0NjoyYzo4OTo3NTo2MjowZjphYTo3OAojIFNIQTEgRmluZ2VycHJpbnQ6IDA3OmUwOjMyOmUwOjIwOmI3OjJjOjNmOjE5OjJmOjA2OjI4OmEyOjU5OjNhOjE5OmE3OjBmOjA2OjllCiMgU0hBMjU2IEZpbmdlcnByaW50OiA1Yzo1ODo0Njo4ZDo1NTpmNTo4ZTo0OTo3ZTo3NDozOTo4MjpkMjpiNTowMDoxMDpiNjpkMTo2NTozNzo0YTpjZjo4MzphNzpkNDphMzoyZDpiNzo2ODpjNDo0MDo4ZQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHV6Q0NBcU9nQXdJQkFnSURCRVRBTUEwR0NTcUdTSWIzRFFFQkJRVUFNSDR4Q3pBSkJnTlZCQVlUQWxCTQpNU0l3SUFZRFZRUUtFeGxWYm1sNlpYUnZJRlJsWTJodWIyeHZaMmxsY3lCVExrRXVNU2N3SlFZRFZRUUxFeDVEClpYSjBkVzBnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa3hJakFnQmdOVkJBTVRHVU5sY25SMWJTQlUKY25WemRHVmtJRTVsZEhkdmNtc2dRMEV3SGhjTk1EZ3hNREl5TVRJd056TTNXaGNOTWpreE1qTXhNVEl3TnpNMwpXakIrTVFzd0NRWURWUVFHRXdKUVRERWlNQ0FHQTFVRUNoTVpWVzVwZW1WMGJ5QlVaV05vYm05c2IyZHBaWE1nClV5NUJMakVuTUNVR0ExVUVDeE1lUTJWeWRIVnRJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1TSXcKSUFZRFZRUURFeGxEWlhKMGRXMGdWSEoxYzNSbFpDQk9aWFIzYjNKcklFTkJNSUlCSWpBTkJna3Foa2lHOXcwQgpBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUE0L3Q5bzNLNnd2REpGSWYxYXdGTzRXNUFCN3B0SjExLzkxc3RzMXJIClVWK3JwREttWVllMmJnK0cwakFDbC9qWGFWZWhHRGxkYW1SNXhnRlpyRHd4U2poODBnVFNTeWpvSUY4N0I2TE0KVFhQYjg2NVB4MWJWV3FlV2lmcnpxMmpVSTRaWko4OEpKN3lzYm5LREhEQnkzK0NpNmRMaGRIVVp2U3FlZXhWVQpCQnZYUXptdFZTakY0aHE3OU1Ea3JqaEpNOHgyaFo4NVJkS2tudklTakZINGZPUXRmL1dzWCtzV243RXQwYnJNCmtVSjNUQ1hKa0RodjIvRE0rNDRlbDFrKzFXQk81Z1VvN1VsNUUwdTZTTnN2K1hMVE9jcitIOWcwY3ZXMFFNOHgKQWNQczNoRXRGMTBmdUZEUlhobW5hZDRITXlqS1VKWDVwMVRMVklaUVJhbjVTUUlEQVFBQm8wSXdRREFQQmdOVgpIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJRSWRzM0xCLzhrOXNYTjdidVF2T0tFTjBaMTl6QU9CZ05WCkhROEJBZjhFQkFNQ0FRWXdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBS2FvclNMT0FUMm1vLzlpMEVpZGkxNXkKc0hoRTQ5d2Nyd245STBqNnZTckV1VlVFdFJDampTZmVDNEpqME83ZUREZDVRVnNpc3JDYVFWeW1jT0RVMEhmTApJOU1BNEd4V0wrRnBEUTNacXI4aGdWRFpCcVdvLzVVMzBLcis0clAxbVMxRmhJcmxRZ25YZEFJdjk0blltZW04Cko5UkhqYm9OUmh4M3p4U2tITG1rTWNTY0tIUUROUDh6R1NhbDZRMTB0ejZYeG5ib0o1YWpadDNocnZKQlc4cVkKVm9OemNPU0dHdEl4UWJvdnZpMFRXblp2VHVoT2dRNC9Xd01pb0JLK1psZ1JTc3NEeExRcUtpMldGK0E1Vkx4SQowM1lublpvdEJxYko3RG5TcTl1Zm1nc25BalVwc1VDVjUvbm9uRldJR1ViV3R6VDFmczQ1bXRrNDhWSDNUeXc9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1UV0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1UQUlXQU4tQ0EgT1U9Um9vdCBDQQojIFN1YmplY3Q6IENOPVRXQ0EgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPVRBSVdBTi1DQSBPVT1Sb290IENBCiMgTGFiZWw6ICJUV0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkiCiMgU2VyaWFsOiAxCiMgTUQ1IEZpbmdlcnByaW50OiBhYTowODo4ZjpmNjpmOTo3YjpiNzpmMjpiMTphNzoxZTo5YjplYTplYTpiZDo3OQojIFNIQTEgRmluZ2VycHJpbnQ6IGNmOjllOjg3OjZkOmQzOmViOmZjOjQyOjI2Ojk3OmEzOmI1OmEzOjdhOmEwOjc2OmE5OjA2OjIzOjQ4CiMgU0hBMjU2IEZpbmdlcnByaW50OiBiZjpkODo4ZjplMToxMDoxYzo0MTphZTozZTo4MDoxYjpmODpiZTo1NjozNTowZTplOTpiYTpkMTphNjpiOTpiZDo1MTo1ZTpkYzo1Yzo2ZDo1Yjo4NzoxMTphYzo0NAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGV6Q0NBbU9nQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFVRkFEQmZNUXN3Q1FZRFZRUUdFd0pVVnpFUwpNQkFHQTFVRUNnd0pWRUZKVjBGT0xVTkJNUkF3RGdZRFZRUUxEQWRTYjI5MElFTkJNU293S0FZRFZRUUREQ0ZVClYwTkJJRkp2YjNRZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt3SGhjTk1EZ3dPREk0TURjeU5ETXoKV2hjTk16QXhNak14TVRVMU9UVTVXakJmTVFzd0NRWURWUVFHRXdKVVZ6RVNNQkFHQTFVRUNnd0pWRUZKVjBGTwpMVU5CTVJBd0RnWURWUVFMREFkU2IyOTBJRU5CTVNvd0tBWURWUVFERENGVVYwTkJJRkp2YjNRZ1EyVnlkR2xtCmFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUIKQVFDd2ZuSzRwQU9VNXFmZUNUaVJTaEZBaDZkOFdXUVVlN1VSRU4zK3Y5WEF1MWJpaFNYME5YSVArRlBRUWVGRQpBY0swSE1NeFFoWkhoVE1pZHJJS2J3L2xKVkJQaFlhK3Y1Z3VFR2NldmhFRmhnV1F4Rm5RZkhnUXNJQmN0K0hICkszWExmSit1dGRHZEl6ZGpwOXhDb2kyU0JCdFF3WHU0UGh2SlZnU0xMMUticmFsVzZjSC9yYWxZaHpDMmdmZVgKUmZ3WlZ6c3JiK1JIOUpsRi9oM3grSmVqaUIwM0hGeVA0SFlsbWxENG9GVC9SSkIySTlJeXhzT3JCci84KzcvegpyWDJTWWdKYktkTTFvNU9hUTJSZ1hiTDZNdjg3Qks5TlFHcjV4K1B2SS8xcnkrVVBpemdON2dyOC9nK1luekF4CjNXeFNaZm1MZ2I0aTRSeFlBN3FSRzRrSEFnTUJBQUdqUWpCQU1BNEdBMVVkRHdFQi93UUVBd0lCQmpBUEJnTlYKSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCUnFPRnNtamQ2TFd2SlBlbFNER1JqakNEV211akFOQmdrcQpoa2lHOXcwQkFRVUZBQU9DQVFFQVBOVjNQZHJmaWJxSERBaFVhaUJRa3I2d1FUMjVKbVNEQ2kvb1FNQ1hLQ2VDCk1FckprLzlxNTZZQWY0bENtdFlSNVZQT0w4enkyZ1hFL3VKUXhEcUdmY3phZmhBSk81STFLbE95L3VzckJkbHMKWGViUTc5TnFacDRWS0lWNjZJSUFyQjZuQ1dsV1F0Tm9VUmkrVkpxL1JFRzZTYjRndW1sYzdyaDN6YzVzSDYyRApsaGg5RHJVVU9ZVHhLT2t0bzU1N0hucHlXb096ZVcvdnRQelFDcVZZVDBiZisyMTVXZktFSWxLdUQ4ejdmRHZuCmFzcEhZY042K05PU0JCKzRJSVRoTmxRV3gwRGVPNHB6M04vR0NVemY3TnIvMUZOQ29jbnlZaDBpZ3p5WHhma1oKWWllc1pTTFgwenpHNVk2eVU4eEp6cnd3L25zT001RDc3ZElVa1I4SHJ3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IE89U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELiBPVT1TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTIKIyBTdWJqZWN0OiBPPVNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4gT1U9U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyCiMgTGFiZWw6ICJTZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTIiCiMgU2VyaWFsOiAwCiMgTUQ1IEZpbmdlcnByaW50OiA2YzozOTo3ZDphNDowZTo1NTo1OTpiMjozZjpkNjo0MTpiMToxMjo1MDpkZTo0MwojIFNIQTEgRmluZ2VycHJpbnQ6IDVmOjNiOjhjOmYyOmY4OjEwOmIzOjdkOjc4OmI0OmNlOmVjOjE5OjE5OmMzOjczOjM0OmI5OmM3Ojc0CiMgU0hBMjU2IEZpbmdlcnByaW50OiA1MTozYjoyYzplYzpiODoxMDpkNDpjZDplNTpkZDo4NTozOToxYTpkZjpjNjpjMjpkZDo2MDpkODo3YjpiNzozNjpkMjpiNToyMTo0ODo0YTphNDo3YTowZTpiZTpmNgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGR6Q0NBbCtnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFzRkFEQmRNUXN3Q1FZRFZRUUdFd0pLVURFbApNQ01HQTFVRUNoTWNVMFZEVDAwZ1ZISjFjM1FnVTNsemRHVnRjeUJEVHk0c1RGUkVMakVuTUNVR0ExVUVDeE1lClUyVmpkWEpwZEhrZ1EyOXRiWFZ1YVdOaGRHbHZiaUJTYjI5MFEwRXlNQjRYRFRBNU1EVXlPVEExTURBek9Wb1gKRFRJNU1EVXlPVEExTURBek9Wb3dYVEVMTUFrR0ExVUVCaE1DU2xBeEpUQWpCZ05WQkFvVEhGTkZRMDlOSUZSeQpkWE4wSUZONWMzUmxiWE1nUTA4dUxFeFVSQzR4SnpBbEJnTlZCQXNUSGxObFkzVnlhWFI1SUVOdmJXMTFibWxqCllYUnBiMjRnVW05dmRFTkJNakNDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFOQVYKT1ZLeFVyTzZ4Vm1DeEYxU3JqcERaWUJMeC9LV3ZOczJsOWFtWkl5b1h2RGpDaHozMzVjOVM2NzJYZXdodFVHcgp6YmwrZHArKytUNDJOS0E3d2ZZeEVVVjBrejFYZ01YNWlabks1YXRxMUxYYVFaQVF3ZGJXUW9uQ3YvUTRFcFZNClZBWDNOdVJGZzNzVVpkYmNERTNSM240TXF6dkVGYjQ2VnFaYWIzWnBVcWw2dWNqcmFwcGRVdEF0Q21zMUZna1EKaE5CcXlqb0dBRGRINUg1WFR6K0w2MmU0aUtyRnZsTlZzcEhFZmJtd2hSa0dlQzdiWVJyNmhmVktrYUhuRnRXTwpvam5mbExod0h5Zy9pL3hBWG1PRFBJTXFHcGxyejk1WmFqdjhieGJYSC8xS0VPdE9naFk2ckNjTVUvR3QxU1N3CmF3TlF3UzA4RnQxRU5DY2FkZnNDQXdFQUFhTkNNRUF3SFFZRFZSME9CQllFRkFxRnFYZGxCWmg4UUlINEQ1Y3MKT1BFSzdEelBNQTRHQTFVZER3RUIvd1FFQXdJQkJqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BMEdDU3FHU0liMwpEUUVCQ3dVQUE0SUJBUUJNT3FORXJMbEZzY2VUZnNnTENrTGZaT29jN2xsc0NMcUpYMnJLU3BXZWVvOEh4ZHBGCmNvSnhEanJTekcrbnRLRWp1L1lrbjhzWC9veW16c0xTMjh5Ti9ISDhBeW5CYkYwelgyUzJaVHVKYnhoMmVQWGMKb2tnZkdUK09rK3Z4K2hmdXpVN2pCQkpWMXVYazNmcytCWHppSFY3R3A3eVhUMmc2OWVrdUNrTzJyMWRjWW1oOAp0LzJqaW9TZ3JHSytLd21ITlBCcUFidWJLVlk4L2dBM3p5TnM4VTZxdG5SR0VteVI3alRWN0pxUjUwUytrREZ5CjFVa0M5Z0xsOUIvcmZObVdWYW4vN0lyNW1VZi9OVm9DcWdUTGlsdUhjU21SdmFTMGVnMjltdlZYSXdBSElSYy8KU2puUkJVa0xwN1kzZ2FWZGpLb3pYb0VvZktkOUorc0FybzAzCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1IZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExIE89SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkKIyBTdWJqZWN0OiBDTj1IZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExIE89SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkKIyBMYWJlbDogIkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTEiCiMgU2VyaWFsOiAwCiMgTUQ1IEZpbmdlcnByaW50OiA3Mzo5Zjo0Yzo0Yjo3Mzo1Yjo3OTplOTpmYTpiYToxYzplZjo2ZTpjYjpkNTpjOQojIFNIQTEgRmluZ2VycHJpbnQ6IGZlOjQ1OjY1OjliOjc5OjAzOjViOjk4OmExOjYxOmI1OjUxOjJlOmFjOmRhOjU4OjA5OjQ4OjIyOjRkCiMgU0hBMjU2IEZpbmdlcnByaW50OiBiYzoxMDo0ZjoxNTphNDo4YjplNzowOTpkYzphNTo0MjphNzplMTpkNDpiOTpkZjo2ZjowNTo0NToyNzplODowMjplYTphOToyZDo1OTo1NDo0NDoyNTo4YTpmZTo3MQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRU1UQ0NBeG1nQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFVRkFEQ0JsVEVMTUFrR0ExVUVCaE1DUjFJeApSREJDQmdOVkJBb1RPMGhsYkd4bGJtbGpJRUZqWVdSbGJXbGpJR0Z1WkNCU1pYTmxZWEpqYUNCSmJuTjBhWFIxCmRHbHZibk1nUTJWeWRDNGdRWFYwYUc5eWFYUjVNVUF3UGdZRFZRUURFemRJWld4c1pXNXBZeUJCWTJGa1pXMXAKWXlCaGJtUWdVbVZ6WldGeVkyZ2dTVzV6ZEdsMGRYUnBiMjV6SUZKdmIzUkRRU0F5TURFeE1CNFhEVEV4TVRJdwpOakV6TkRrMU1sb1hEVE14TVRJd01URXpORGsxTWxvd2daVXhDekFKQmdOVkJBWVRBa2RTTVVRd1FnWURWUVFLCkV6dElaV3hzWlc1cFl5QkJZMkZrWlcxcFl5QmhibVFnVW1WelpXRnlZMmdnU1c1emRHbDBkWFJwYjI1eklFTmwKY25RdUlFRjFkR2h2Y21sMGVURkFNRDRHQTFVRUF4TTNTR1ZzYkdWdWFXTWdRV05oWkdWdGFXTWdZVzVrSUZKbApjMlZoY21Ob0lFbHVjM1JwZEhWMGFXOXVjeUJTYjI5MFEwRWdNakF4TVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCCkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUtsVEFPTXVwdmFPK21EWUxaVSsrQ3dxVkU3TnVZUmhsRmhQanoyTDVFUHoKZFltTlVlVEROOUtLaUUxNUhyY1MzVU40U29xUzV0ZEkxUStrT2lsRU5iZ0g5bWdkVmMwNFVmQ01KREdGcjRQSgpmZWwzciswYWU1MFgrYk9kT0ZBUHBscDVrWUN2TjY2bTB6SDd0U1lKblR4YTcxSEZLOStXWGVzeUhnTGFjRW5zCmJnekltamVOOS9FMllFc21MSUtlMEhqekRROWpwRkV3NGZrckp4SUgyT3E5R0dLWXNGazNmYjd1OHlCUlFscUQKNzVPNmFSWHhZcDJmbVRtQ29iZDBMb3ZVeFF0N0wvRElDdG85ZVFxYWt4eWxLSEp6a1VPYXA5Rk5oWVM1cVhTUApGRURIM042c1FXUnN0Qm1iQW1OdEpHU1BSTElsNnM1ZGRBeGpNbHlOaCtVQ0F3RUFBYU9CaVRDQmhqQVBCZ05WCkhSTUJBZjhFQlRBREFRSC9NQXNHQTFVZER3UUVBd0lCQmpBZEJnTlZIUTRFRmdRVXBwRkMvUk5oU2lPZUNLUXAKNWRnVEJDUHVRU1V3UndZRFZSMGVCRUF3UHFBOE1BV0NBeTVuY2pBRmdnTXVaWFV3Qm9JRUxtVmtkVEFHZ2dRdQpiM0puTUFXQkF5NW5jakFGZ1FNdVpYVXdCb0VFTG1Wa2RUQUdnUVF1YjNKbk1BMEdDU3FHU0liM0RRRUJCUVVBCkE0SUJBUUFmNzNsQjRYdHVQN0tNaGpkQ1NrNGNOeDZOWnJva2djbFBFZzhod0FPWGhpVnRYZE1pS2Foc29nMnAKNnowR1c1azZ4OHpEbWpSL3F3N0lUaHpoK3VUY3pRMit2eVQrYk9kcndnM0lCcDVPaldFb3Btcjk1ZlppNmhnOApUcUJUbmJJNm5PdWxuSkVXdGsyQzRBd0ZTS2xzOWN6NHk1MUp0UEFDcGYxd0ErMktJYVd1RTRaSnd6Tnp2b2M3CmRJc1hSU1pNRnBHRC9tZDl6VTFqWi9yekF4S1dlQWFOc1dmdGpqKytuMDhDOWJNSkwvTk1oOThxeTVWOEFjeXMKTm5xL29uTjY5NC9CdFpxaEZMS1BNNThON3lMY1pudUV2VVVYQmowOHlybDNOSS9LNnM4L01UN2ppT09BU1NYSQpsN1dkbXBsTnNEejRTZ0NiWk4yZk9VdlJKOWU0Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1BY3RhbGlzIEF1dGhlbnRpY2F0aW9uIFJvb3QgQ0EgTz1BY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NwojIFN1YmplY3Q6IENOPUFjdGFsaXMgQXV0aGVudGljYXRpb24gUm9vdCBDQSBPPUFjdGFsaXMgUy5wLkEuLzAzMzU4NTIwOTY3CiMgTGFiZWw6ICJBY3RhbGlzIEF1dGhlbnRpY2F0aW9uIFJvb3QgQ0EiCiMgU2VyaWFsOiA2MjcxODQ0NzcyNDI0NzcwNTA4CiMgTUQ1IEZpbmdlcnByaW50OiA2OTpjMTowZDo0ZjowNzphMzoxYjpjMzpmZTo1NjozZDowNDpiYzoxMTpmNjphNgojIFNIQTEgRmluZ2VycHJpbnQ6IGYzOjczOmIzOjg3OjA2OjVhOjI4Ojg0OjhhOmYyOmYzOjRhOmNlOjE5OjJiOmRkOmM3OjhlOjljOmFjCiMgU0hBMjU2IEZpbmdlcnByaW50OiA1NTo5Mjo2MDo4NDplYzo5NjozYTo2NDpiOTo2ZToyYTpiZTowMTpjZTowYjphODo2YTo2NDpmYjpmZTpiYzpjNzphYTpiNTphZjpjMTo1NTpiMzo3ZjpkNzo2MDo2NgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRnV6Q0NBNk9nQXdJQkFnSUlWd29SbDBMRTQ4d3dEUVlKS29aSWh2Y05BUUVMQlFBd2F6RUxNQWtHQTFVRQpCaE1DU1ZReERqQU1CZ05WQkFjTUJVMXBiR0Z1TVNNd0lRWURWUVFLREJwQlkzUmhiR2x6SUZNdWNDNUJMaTh3Ck16TTFPRFV5TURrMk56RW5NQ1VHQTFVRUF3d2VRV04wWVd4cGN5QkJkWFJvWlc1MGFXTmhkR2x2YmlCU2IyOTAKSUVOQk1CNFhEVEV4TURreU1qRXhNakl3TWxvWERUTXdNRGt5TWpFeE1qSXdNbG93YXpFTE1Ba0dBMVVFQmhNQwpTVlF4RGpBTUJnTlZCQWNNQlUxcGJHRnVNU013SVFZRFZRUUtEQnBCWTNSaGJHbHpJRk11Y0M1QkxpOHdNek0xCk9EVXlNRGsyTnpFbk1DVUdBMVVFQXd3ZVFXTjBZV3hwY3lCQmRYUm9aVzUwYVdOaGRHbHZiaUJTYjI5MElFTkIKTUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FnOEFNSUlDQ2dLQ0FnRUFwOGJFcFNta0xPL2xHTVd3VUtOdgpVVHVmQ2xySndrZzRDc0ljb0JoL2tiV0h1VUEvM1Ixb0h3aUQxUzBlaUtENGoxYVBiWmtDa3BBVzFWOEliSW5YCjRheThJTUt4NElOUmltbE5BSlphYnkvQVJINmpEdVNSelZqdTNQdkhIa1ZIM1NlNUNBR2ZwaUVkOVVFdEwwejkKS0szZ2lxMGl0Rlpsam9aVWo1TkRLZDQ1Um5pak1DTzZ6ZkI5RTFmQVhkS0RhMGhNeEt1ZmdGcGJPcjNKcHlJLwpnQ2N6V3c2M2lneGRCemNJeTJ6U2VrY2lSRFhGek13dWp0MHE3YmQ5WmcxZllWRWlWUnZqUnVQalBkQTFZcHJiCnJ4VElXNkhNaVJ2aE1DYjhvSnNmZ2FkSEh3VHJvem1TQnArWjA3L1Q2azlRbkJuK2xvY2VQR1gyb3hna2c0WVEKNTFRK3FEcDJKRStCSWNYakR3TDRrNVJISUx2KzFBN1RhTG5keEhxRWd1TlRWSG5kMjV6UzhnZWJMcmE4UHUyRgpiZThsRWZLWEdrSmg5MHFYNkl1eEVBZjZaWUd5b2puUDl6ei9HUHZHOFZxTFdlSUNySHVTMEU0VVQxbEY5Z3hlCktGK3c2RDlGejgrdm0yLzdoTk4zV3BWdnJKU0VudTY4d0VxUFNwUDRSQ0hpTVVWaFVFNFEyT00xZkV3WnRONEYKdjZNR244aTF6ZVFmMXhjR0RYcVZkRlVOYUJyOEVCdGlaSjF0NEpXZ3c1UUhWdzBVNXIwRis3aWY1dCtMNHNibgpmcGIyVThXQU5GQW9XUEFTVUhFWE1Mcm1lR084OUxLdG15dXkvdUU1akY2NkN5Q1UzbnVEdVAvalZvMjNFZWs3CmpQS3h3VjJkcEF0TUs5bXlHUFcxbjBzQ0F3RUFBYU5qTUdFd0hRWURWUjBPQkJZRUZGTFlpRHJJbjNobTdZbnoKZXpod2xNa0NBamJRTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SHdZRFZSMGpCQmd3Rm9BVVV0aUlPc2lmZUdidAppZk43T0hDVXlRSUNOdEF3RGdZRFZSMFBBUUgvQkFRREFnRUdNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUNBUUFMCmUzS0h3R0NtU1V5SVdPWWRpUGNVWkVpbTJGZ0tEazhUTmQ4MUhkVHRCakhJZ1Q1cTFkMDdHakx1a0QwUjBpNzAKanNOakxpTm1zR2UrYjdiQUV6bGdxcUkwSlpOMVV0Nm5uYTBPaDRsU2NXb1dQQmtkZy9pYUtXVys5RCthMmZEegpXb2NoY1lCTnkrQTRteis3K3VBd1RjK0cwMlVRR1JqUmx3S3hLM0pDYUt5Z3ZVNWEyaGkvYTVpQjBQMmF2bDRWClNNMFJGYm5BS1Z5MDZJajNQamF1dDJMOUhtTGVjSGdRSEVoYjJyeWtPTHBuN1ZVK1hsZmYxQU5BVElHazBrOWoKcHdsQ0NSVDhBS25DZ0hOUExzQkEyUkY3U09wNkFzRFQ2eWdCSmxoMHdjQnpJbTJUbGYwNWZic3E0L2FDNHl5WApYMDRma1pUNi9peWoySFlhdUUyeU9FK2IraDFJWUhrbTR2UDlxZENhNkhDUFNYclc1YjBLRHRzdDg0Mi82K09rCmZjdkhsWEhvMnFOOHhjTDRkSklFRzRhc3BDSlRRTGFzL2t4MnovdVVNc0ExbjNZL2J1V1FicUNtSnFLNExMN1IKSzRYOXAyakl1Z0Vyc1d4MEhiaHpsZWZ1dDhjbDhBQk1BTEordGd1TEhQUEFVSjRsdWVBSTNqWm0vemVsMGJ0VQpaQ3pKSjdWTGtuNWwvOU10NGJsT3ZIK2tRU0dRUVhlbU9SL3FudU9mMEdadkJleXFkbjYvYXhhZzY3WEgvSkpVCkx5c1JKeVUzZUV4UmFyRHp6RmhkRlBGcVNCWC93Z2Uyc1kwUGpseFFSck05dndHWVQ3SlpWRWMrTkh0NGJWYVQKTG5QcVppaDR6UjBVdjZDUEx5NjRMbzd5RklyTTZiVjgrMnlkREtYaGxnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IE89VHJ1c3RpcyBMaW1pdGVkIE9VPVRydXN0aXMgRlBTIFJvb3QgQ0EKIyBTdWJqZWN0OiBPPVRydXN0aXMgTGltaXRlZCBPVT1UcnVzdGlzIEZQUyBSb290IENBCiMgTGFiZWw6ICJUcnVzdGlzIEZQUyBSb290IENBIgojIFNlcmlhbDogMzYwNTM2NDAzNzUzOTkwMzQzMDQ3MjQ5ODg5NzU1NjM3MTA1NTMKIyBNRDUgRmluZ2VycHJpbnQ6IDMwOmM5OmU3OjFlOjZiOmU2OjE0OmViOjY1OmIyOjE2OjY5OjIwOjMxOjY3OjRkCiMgU0hBMSBGaW5nZXJwcmludDogM2I6YzA6Mzg6MGI6MzM6YzM6ZjY6YTY6MGM6ODY6MTU6MjI6OTM6ZDk6ZGY6ZjU6NGI6ODE6YzA6MDQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGMxOmI0OjgyOjk5OmFiOmE1OjIwOjhmOmU5OjYzOjBhOmNlOjU1OmNhOjY4OmEwOjNlOmRhOjVhOjUxOjljOjg4OjAyOmEwOmQzOmE2OjczOmJlOjhmOjhlOjU1OjdkCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEWnpDQ0FrK2dBd0lCQWdJUUd4K3R0aUQ1Sk5NMmEvZkg4WXlnV1RBTkJna3Foa2lHOXcwQkFRVUZBREJGCk1Rc3dDUVlEVlFRR0V3SkhRakVZTUJZR0ExVUVDaE1QVkhKMWMzUnBjeUJNYVcxcGRHVmtNUnd3R2dZRFZRUUwKRXhOVWNuVnpkR2x6SUVaUVV5QlNiMjkwSUVOQk1CNFhEVEF6TVRJeU16RXlNVFF3TmxvWERUSTBNREV5TVRFeApNelkxTkZvd1JURUxNQWtHQTFVRUJoTUNSMEl4R0RBV0JnTlZCQW9URDFSeWRYTjBhWE1nVEdsdGFYUmxaREVjCk1Cb0dBMVVFQ3hNVFZISjFjM1JwY3lCR1VGTWdVbTl2ZENCRFFUQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQUQKZ2dFUEFEQ0NBUW9DZ2dFQkFNVlFlNTQ3TmREZnhJek5qcHZ0bzhBMm1mUkM2cWMrZ0lNUHBxZFpoOG1RUlVOKwpBT3FHZVNvRHZUMDNtWWxtdCtXS1ZvYVRuR2hMYUFTTWs1TUNQakRTTnpvaVlZa2NoVTU5ajlXdmV6WDJmaWhICmlUSGNEbmxrSDVuU1c3citmMkMvcmV2blBEZ3BhaS9sa1F0Vi8reHZXTlV0eWQ1TVpuR1BETmNFMmdmbUhoamoKdlNrQ3FQb2M0VnU1ZzZoQlNMd2FjWTNuWXVVdHN1dmZmTS9icTFyS01mRk1Jdk1GRS9lQytYTjVETDdYU3h6QQowUlU4azBGazBlYStJeGNpQUlsZUgydWxyRzZuUzR6dG8zTG1yMk5OTDRYU0ZEV2FMazZNNmpLWUtJYWhrUWxCCk9yVGg0L0w2OE1rS29rSGRxZU1EeDRnVk94elVHcFRYbjJSWkVtMENBd0VBQWFOVE1GRXdEd1lEVlIwVEFRSC8KQkFVd0F3RUIvekFmQmdOVkhTTUVHREFXZ0JTNituRWxlWXRYUVNVaGhndHg2N0prRG9zaFp6QWRCZ05WSFE0RQpGZ1FVdXZweEpYbUxWMEVsSVlZTGNldXlaQTZMSVdjd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFINVkvLzAxCkdYMmNHRStlc0N1OGpvd1UveXlnMmtkYncrK0JMYThGNm5SSVcvTStUZ2ZIYmNXems4OGlOVnkyUDNVblh3bVcKemFEK3ZrQU1YQkpWK0pPQ3lpbnBYajlXVjRzNE52ZEZHa3dvelo1QnVPMVdUSVNrUU1pNHNLVXJhWEFFYXNQNAoxQkl5K1E3RHNkd3loRVFzYjh0R0QrcG1RUTlQOFZpbHBnME5EMkhlcFo1ZGZXV2hQQmZucUZWTzc2REg3Y1pFCmYxVDFvK0NQOEh4VklvOHB0b0dqNFcxT0xCdUFaK3l0SUo4TVltSFZsLzlEN1MzQjJsMHBLb1UvckdYdWhnOEYKalpCZjMrNmY5TC91SGZ1WTVIK1FLNFI0RUE1c1NWUHZGVnRsUmtwZHI3cjdPbklkemZZbGlCNlh6Q0djS1FFTgpaZXRYMmZOWGxydEl6WUU9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1CdXlwYXNzIENsYXNzIDIgUm9vdCBDQSBPPUJ1eXBhc3MgQVMtOTgzMTYzMzI3CiMgU3ViamVjdDogQ049QnV5cGFzcyBDbGFzcyAyIFJvb3QgQ0EgTz1CdXlwYXNzIEFTLTk4MzE2MzMyNwojIExhYmVsOiAiQnV5cGFzcyBDbGFzcyAyIFJvb3QgQ0EiCiMgU2VyaWFsOiAyCiMgTUQ1IEZpbmdlcnByaW50OiA0NjphNzpkMjpmZTo0NTpmYjo2NDo1YTphODo1OTo5MDo5Yjo3ODo0NDo5YjoyOQojIFNIQTEgRmluZ2VycHJpbnQ6IDQ5OjBhOjc1Ojc0OmRlOjg3OjBhOjQ3OmZlOjU4OmVlOmY2OmM3OjZiOmViOmM2OjBiOjEyOjQwOjk5CiMgU0hBMjU2IEZpbmdlcnByaW50OiA5YToxMTo0MDoyNToxOTo3Yzo1YjpiOTo1ZDo5NDplNjozZDo1NTpjZDo0Mzo3OTowODo0NzpiNjo0NjpiMjozYzpkZjoxMTphZDphNDphMDowZTpmZjoxNTpmYjo0OAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRldUQ0NBMEdnQXdJQkFnSUJBakFOQmdrcWhraUc5dzBCQVFzRkFEQk9NUXN3Q1FZRFZRUUdFd0pPVHpFZApNQnNHQTFVRUNnd1VRblY1Y0dGemN5QkJVeTA1T0RNeE5qTXpNamN4SURBZUJnTlZCQU1NRjBKMWVYQmhjM01nClEyeGhjM01nTWlCU2IyOTBJRU5CTUI0WERURXdNVEF5TmpBNE16Z3dNMW9YRFRRd01UQXlOakE0TXpnd00xb3cKVGpFTE1Ba0dBMVVFQmhNQ1RrOHhIVEFiQmdOVkJBb01GRUoxZVhCaGMzTWdRVk10T1Rnek1UWXpNekkzTVNBdwpIZ1lEVlFRRERCZENkWGx3WVhOeklFTnNZWE56SURJZ1VtOXZkQ0JEUVRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCCkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQU5mSFh2ZkJCOVIzKzBNaDlQVDFhZVR1TWdIYm80WWY1RmtOdXVkMWcxTHIKNmh4aEZVaTdIUWZLaks2dzNKYWQ2c05na29hQ0tIT2NWZ2IvUzJUd0RDbzNTYlhsend4ODd2Rkt1M013WmZQVgpMNE8yZnVQbjlaNnJZUG5UOFoyU2RJcmtISmFzVzREcHRmUXhoNk5SL01kK29XK09VM2ZVbDhGVk01SStHQzkxCjFLMkdTY3VWcjFRR2JOZ0dFNDFiLytFbUdWbkFKTHFCY1htUVJGQm9KSlJmdUxNUjhTbEJZYU5CeXlNMjFjSHgKTWxBUVRuLzBocFBzaE5PT3ZFdS9YQUZPQnozY0ZJcVVDcVRxYy9zTFVlZ1RCeGo2RHZFcjBWUVZmVHpoOTdRWgpRbWRpWG5mZ29sWHN0dGxwRjlVNnIwVHRTc1dlNUhvbmZPVjExNnJMSmVmZmF3cmJEMDJUVHFpZ3pYc3U4bGtCCmFyY051QWVCZm9zNEd6am1DbGVaUGU0aDZLUDFEQmJkaSt3MGpwd3FIQUFWRjQxb2c5SndueGdJelJGbzFjbHIKVXMzRVJvL2N0ZlBZVjNNZTZaUTVCTC9UM2pqZXRGUHNhUnlpZnNTUDVCdHdyZktpK2Z2M0ZtUm1hWjlKVWFMaQpGUmhuQmtwLzFXeTFUYk16NEdIclhiN3BtQTh5MXgxTFBDNWFBVktSQ2ZMZjZvM1lCa0JqcWhIay9zTTNuaFJTClAvVGl6UEpoazlIOVoydlhVcTYvYUt0QVE2QlhOVk40OEZQNFlVSUhaTWJYYjV0TU9BMWpyR0t2Tm91aWN3b04KOVNHOWRLcE42bklEU2R2SFh4MWlZOGY5M1pIc00rNzFiYlJ1TUdqZXlOWW1zSFZlZTdRSElKaWhkaks0VFd4UApBZ01CQUFHalFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUVGTW1BZCtCaWtvTDFScHp6CnV2ZE13OTY0bzYwNU1BNEdBMVVkRHdFQi93UUVBd0lCQmpBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQWdFQVUxOGgKOWJxd09sSTVMSkt3YkFESjc4NGc3d2J5bHA3cHBIUi9laGI4dC9XMit4VWJQNnVtd0hKZEVMRng3cnhQNDYycwpBMjB1Y1M2dnhPT3RvNzBNRWFlMC8wcXlleEFRSDZkWFFiTEFydlFzV2RaSEVJanpJVkVwTU1wZ2hxOUdxeDN0Ck9sdXdsTjVFNDBFSW9zSHNIZGI5VDdiV1I5QVVDOHJteXJWN2QzNUJIMTZEeDdhTU9aYXdQNWFCUVc5Z2tPTG8KK2ZzaWNkbDlzejFHdjdTRXI1QWNENDhTYXEvdjdoNTZyZ0pLaWhjcmR2NnNWSWtrTEU4L3RyS25Ub3lva1pmNwpLY1o3WEMyNXkyYTJ0NmhiRWxHRnRRbCtZbmh3L3FscVlMWWREbmtNL2NycUpJQnl3NWMvOG5lclF5SUt4K3UyCkRJU0NMSUJyUVlvSXdPdWxhOStaRXN1SzFWNkFESkhnSmdnMlNNWDZPQkUxL3lXRExmSjZ2OXI5anY2bHkwVXMKSDhTSVU2NTNEdG1hZHNXT0xCMmp1dFhzTXE3QXFxejMwWHBONjlRSDRrajNJbzZ3cEo5cXpvNnlzbUQwb3lMUQpJK3VVV25wcDNRKy9RRmVzYTFsUTJhT1o0VzcralFGNUp5TVYzcEtkZXdsTld1ZExTREJhR09ZS2JlYVA0Tks3CjV0OThiaUdDd1dnNVRiU1lXR1ppekVxUVhzUDZKd1N4ZVJWMG1jeStyU0RlSm1BYzYxWlJwcVBxNUtNL3AvOWgKM1BGYVRXd3lJMFB1cktqdTdrb1NDVHhkY2NLK2VmckNoMmdkQy8xY2Fjd0cwSnA5VkprcXlUa2FHYTlMS2tQegpZMTFhV09JdjR4M2txZGJRQ3RDZXY5ZUJDZkhKeHlZTnJKZ1dWcUE9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1CdXlwYXNzIENsYXNzIDMgUm9vdCBDQSBPPUJ1eXBhc3MgQVMtOTgzMTYzMzI3CiMgU3ViamVjdDogQ049QnV5cGFzcyBDbGFzcyAzIFJvb3QgQ0EgTz1CdXlwYXNzIEFTLTk4MzE2MzMyNwojIExhYmVsOiAiQnV5cGFzcyBDbGFzcyAzIFJvb3QgQ0EiCiMgU2VyaWFsOiAyCiMgTUQ1IEZpbmdlcnByaW50OiAzZDozYjoxODo5ZToyYzo2NDo1YTplODpkNTo4ODpjZTowZTpmOTozNzpjMjplYwojIFNIQTEgRmluZ2VycHJpbnQ6IGRhOmZhOmY3OmZhOjY2Ojg0OmVjOjA2OjhmOjE0OjUwOmJkOmM3OmMyOjgxOmE1OmJjOmE5OjY0OjU3CiMgU0hBMjU2IEZpbmdlcnByaW50OiBlZDpmNzplYjpiYzphMjo3YToyYTozODo0ZDozODo3Yjo3ZDo0MDoxMDpjNjo2NjplMjplZDpiNDo4NDozZTo0YzoyOTpiNDphZToxZDo1Yjo5MzozMjplNjpiMjo0ZAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRldUQ0NBMEdnQXdJQkFnSUJBakFOQmdrcWhraUc5dzBCQVFzRkFEQk9NUXN3Q1FZRFZRUUdFd0pPVHpFZApNQnNHQTFVRUNnd1VRblY1Y0dGemN5QkJVeTA1T0RNeE5qTXpNamN4SURBZUJnTlZCQU1NRjBKMWVYQmhjM01nClEyeGhjM01nTXlCU2IyOTBJRU5CTUI0WERURXdNVEF5TmpBNE1qZzFPRm9YRFRRd01UQXlOakE0TWpnMU9Gb3cKVGpFTE1Ba0dBMVVFQmhNQ1RrOHhIVEFiQmdOVkJBb01GRUoxZVhCaGMzTWdRVk10T1Rnek1UWXpNekkzTVNBdwpIZ1lEVlFRRERCZENkWGx3WVhOeklFTnNZWE56SURNZ1VtOXZkQ0JEUVRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCCkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQUtYYUNwVVdVT09WOGw2ZGRqRUdNbnFiOFJCMnVBQ2F0VkkyelNSSHNKOFkKWkx5YTl2clZlZGlRWWt3aUw5NDRQZGJncU9rY0xOdDRFZW1PYUZFVmNzZnpNNGZrb0YwTFhPQlhCeW93OWMzRQpOM2NvVFJpUjVyL1ZVdjF4TFhBKzU4YkVpdVB3S0F2MGRwaWhpNGRWc2pvVC9MYytKemVPSXVPb1R5cnZZTHM5CnR6bkREZ0ZIbVYwU1Q5dEQrbGVoN2ZtZHZoRkhKbHNUbUt0ZEZvcXdOeHhYblVYL2lKWTJ2N3ZLQjN0dmgyUFgKMERKcTFsMXNEUEd6YmpuaWF6RXVPUUFuRk40NHdPd1pab1lTNkoxeUZoTmtVc2VwTnh6OWdqRHRoQmdkOUs1YwovM0FUQU91eDlUTjZTOVpWK0FXTlMybXc5Yk1vTmx3VXhGRnpUV3NMOFRRSDJ4YzUxOXdvZTJ2MW4vTXV3VThYCktoRHp6TXJvNi8xcnF5NmFueTJDYmdUVVVnR1RMVDJHL0g3ODMrOUNIYVpyNzdrZ3h2ZTlvS2VWL2FmbWlTVFkKekl3MGJPSWpMOWtTR2lHNVZaRnZDNUY1R1F5dFFJZ0xjT0o2MGc3WWFFaTdnaE01RUZqcDJDb0h4aExiV052UwpPMVVRUndVVloySitHR09tUmo4SkRsUXlYcjhOWW5vbjc0RG8yOWxMQmxvM1dpWFFDQkozMUc4SlVKYzl5QjNECjM0eEZNRmJHMDJTclp2UEFYcGFjdzhUdnczeHJpenA1ZjdOSnp6M2lpWitnTUV1RnVaeVVKSG1QZld1cFJXZ1AKSzlEeDJoekxhYmpLU1dKdHlOQmpZdDFnRDFpcWo2RzhCYVZtb3M4YmRyS0VaTEZNT1ZMQU1McndqRXNDc0xhMwpBZ01CQUFHalFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUVGRWU0emYvbGIrNzRzdXd2ClRnNzVKYkNPUEd2RE1BNEdBMVVkRHdFQi93UUVBd0lCQmpBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQWdFQUFDQWoKUVRVRWtNSkFZbUR2NGpWTTF6K3M0alNRdUtGdmR2b1dGcVJJTnl6cGtNTHlQUGdLbjlpQjVidGIyaVVzcEtkVgpjU1F5OXNnTDhyeHErSk9zc2dmQ1g1L2J6TWlLcXI1cWIrRkpFTXd4MTRDN3U4allvZzVrVitxaTljS3BNUlhTCklHcnMvQ0lCS00rR3VJQWVxY3dScFR6eUZyTkhuZnpTZ0NIRXk5QkhjRUdoeW9NWkNDeHQ4bDEzbklvVUU5UTIKSEpMdzVRWTMzS2Jta0pzNGoxeHJHMGFHUTBKZlBnRUhVMVJkWlgzM2luT2htbFJhSHlsREZDZkNoUSsxaUhzYQpPNVMzSFdDbnRaem5LV2xYV3B1VGVrTXdHd1BYWXNoQXBxcjhaT1JLMTVGVEFhZ2dpRzZjWDBTNXkyQ0JOT3h2CjAzM2FTRi9ydEpDOExha2NDNndjMWFKb0lJQUUxdnl4ankrN1NqRU5Tb1ljNitJMktTYjEydGpFOG5WaHozNnUKZG1OS2VrQmxrNGY0SG9DTWh1V0cxbzhPL0ZNc1lPZ1dZUnFpUGtON3pUbGdWR3IxOG9rbUFXaURTS0l6Nk1rRQprYklSTkJFKzZ0QkRHUjhEazVBTS8xRTlWL1JCYnVITG9MN3J5V1BOYmN6aytEYXFhSjN0dlYyWGNFUU50ZzQxCjNPRU1YYnVnVVpUTGZoYnJFUytqa2tYSVRISFp2TW1aVWxkR0wxRFB2VFZwOUQwVnpnYWxMQTgrOW9HNmxMdkQKdTc5bGVOS0dlZjlKT3hxRERQRGVlT3pJOGsxTUd0NkNLZmpCV3RydDd1WW5YdWhGMEowY1VhaG9xMFRqMEl0cQo0L2c3dTl4TjEyVHlVYjdtcXF0YTZUSHVCcnh6dnhOaUNwL0h1WmM9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1ULVRlbGVTZWMgR2xvYmFsUm9vdCBDbGFzcyAzIE89VC1TeXN0ZW1zIEVudGVycHJpc2UgU2VydmljZXMgR21iSCBPVT1ULVN5c3RlbXMgVHJ1c3QgQ2VudGVyCiMgU3ViamVjdDogQ049VC1UZWxlU2VjIEdsb2JhbFJvb3QgQ2xhc3MgMyBPPVQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkggT1U9VC1TeXN0ZW1zIFRydXN0IENlbnRlcgojIExhYmVsOiAiVC1UZWxlU2VjIEdsb2JhbFJvb3QgQ2xhc3MgMyIKIyBTZXJpYWw6IDEKIyBNRDUgRmluZ2VycHJpbnQ6IGNhOmZiOjQwOmE4OjRlOjM5OjkyOjhhOjFkOmZlOjhlOjJmOmM0OjI3OmVhOmVmCiMgU0hBMSBGaW5nZXJwcmludDogNTU6YTY6NzI6M2U6Y2I6ZjI6ZWM6Y2Q6YzM6MjM6NzQ6NzA6MTk6OWQ6MmE6YmU6MTE6ZTM6ODE6ZDEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGZkOjczOmRhOmQzOjFjOjY0OjRmOmYxOmI0OjNiOmVmOjBjOmNkOmRhOjk2OjcxOjBiOjljOmQ5Ojg3OjVlOmNhOjdlOjMxOjcwOjdhOmYzOmU5OjZkOjUyOjJiOmJkCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEd3pDQ0FxdWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUXNGQURDQmdqRUxNQWtHQTFVRUJoTUNSRVV4Ckt6QXBCZ05WQkFvTUlsUXRVM2x6ZEdWdGN5QkZiblJsY25CeWFYTmxJRk5sY25acFkyVnpJRWR0WWtneEh6QWQKQmdOVkJBc01GbFF0VTNsemRHVnRjeUJVY25WemRDQkRaVzUwWlhJeEpUQWpCZ05WQkFNTUhGUXRWR1ZzWlZObApZeUJIYkc5aVlXeFNiMjkwSUVOc1lYTnpJRE13SGhjTk1EZ3hNREF4TVRBeU9UVTJXaGNOTXpNeE1EQXhNak0xCk9UVTVXakNCZ2pFTE1Ba0dBMVVFQmhNQ1JFVXhLekFwQmdOVkJBb01JbFF0VTNsemRHVnRjeUJGYm5SbGNuQnkKYVhObElGTmxjblpwWTJWeklFZHRZa2d4SHpBZEJnTlZCQXNNRmxRdFUzbHpkR1Z0Y3lCVWNuVnpkQ0JEWlc1MApaWEl4SlRBakJnTlZCQU1NSEZRdFZHVnNaVk5sWXlCSGJHOWlZV3hTYjI5MElFTnNZWE56SURNd2dnRWlNQTBHCkNTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDOWRaUHdZaUp2Sks3Z2VuYXNmYjNaSk5XNHQvek4KOEVMZzYzaUlWbDZibWxRZFRReUs5dFBQY1BSU3RkaVRCT05HaG5GQlNpdndLaXhWQTlaSXcrQTVPTzN5WER3LwpSTHlUUFdHclRzME52dkFnSjFnT1JIOEVHb2VsMTVZVU5wRFFTWHVoZGZzYWEzT3grTTZwQ1N6eVU5WERGRVM0CmhxWDJpeXM1MnFNelZObjZjaHIzSWhVY2lKRnJmMmJsdzJxQXNDVHozNFpGaVAwWmYzV0hIeCt4R3dwekpGdTUKWmVBc1ZNaGcwMllYUCtITVZETnprUUk2cG45N2RqbWlINWEyT0s2MXlKTjBIWjY1dE9WZ25TOVcwZURyWGx0TQpFbkFNYkVRZ3F4SFk5Qm4yMHB4U04rZjZ0c0l4TzByVUZKbXR4eHIxWFYvNkI3aDhEUi9XZ3g2ekFnTUJBQUdqClFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01CMEdBMVVkRGdRV0JCUzEKQS9kMk8yR0NhaEtxR0ZQckF5R1V2LzdPeWpBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQVZqM3ZsTlc5Mm5PeQpXTDZ1a0syWUo1ZitBYkd3VWdDNFRlUWJJWFFiZnNEdVhta3FKYTljMWgzYTBubko4NWNwNElhSDNnUlpEL0ZaCjFHU0ZTNW12SlFRZXlVYXBsOTZDc2h0d241ejJyM0V4M1hzRnBTelR1Y3BIOXNyeTl1ZXR1VWcvdkJhM3dXMzAKNmdtdjdQTzE1d1dlcGg2S1UxSFdrNEhNZEpQMnVkcW1KUVYwZVZwK1FENkNTeVlSTUc3aFAwSEhSd0ExMWZYVAo5MVErZ1QzYVNXcWFzKzhRUGVicmI5SElJa2ZMek04Qk1aTFpHT01pdmdrZUdqNWFzdVJyREZSNmZVTk91SW1sCmU5ZWlQWmFHelBJbU5DMXFrcDJhR3RBdzRsMU9CTEJmaXlCK2Q4RTlsWUxSUnBvN1BIaTRiNkhRRFdTaWVCNHAKVHBQRHBGUVVXdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBSb290IENBIE89QVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1cwojIFN1YmplY3Q6IENOPUVFIENlcnRpZmljYXRpb24gQ2VudHJlIFJvb3QgQ0EgTz1BUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzCiMgTGFiZWw6ICJFRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBSb290IENBIgojIFNlcmlhbDogMTEyMzI0ODI4Njc2MjAwMjkxODcxOTI2NDMxODg4NDk0OTQ1ODY2CiMgTUQ1IEZpbmdlcnByaW50OiA0Mzo1ZTo4ODpkNDo3ZDoxYTo0YTo3ZTpmZDo4NDoyZTo1MjplYjowMTpkNDo2ZgojIFNIQTEgRmluZ2VycHJpbnQ6IGM5OmE4OmI5OmU3OjU1OjgwOjVlOjU4OmUzOjUzOjc3OmE3OjI1OmViOmFmOmMzOjdiOjI3OmNjOmQ3CiMgU0hBMjU2IEZpbmdlcnByaW50OiAzZTo4NDpiYTo0Mzo0Mjo5MDo4NToxNjplNzo3NTo3MzpjMDo5OToyZjowOTo3OTpjYTowODo0ZTo0Njo4NTo2ODoxZjpmMTo5NTpjYzpiYTo4YToyMjo5Yjo4YTo3NgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUF6Q0NBdXVnQXdJQkFnSVFWSUQ1b0hQdFB3Qk15b25ZNDNIbVNqQU5CZ2txaGtpRzl3MEJBUVVGQURCMQpNUXN3Q1FZRFZRUUdFd0pGUlRFaU1DQUdBMVVFQ2d3WlFWTWdVMlZ5ZEdsbWFYUnpaV1Z5YVcxcGMydGxjMnQxCmN6RW9NQ1lHQTFVRUF3d2ZSVVVnUTJWeWRHbG1hV05oZEdsdmJpQkRaVzUwY21VZ1VtOXZkQ0JEUVRFWU1CWUcKQ1NxR1NJYjNEUUVKQVJZSmNHdHBRSE5yTG1WbE1DSVlEekl3TVRBeE1ETXdNVEF4TURNd1doZ1BNakF6TURFeQpNVGN5TXpVNU5UbGFNSFV4Q3pBSkJnTlZCQVlUQWtWRk1TSXdJQVlEVlFRS0RCbEJVeUJUWlhKMGFXWnBkSE5sClpYSnBiV2x6YTJWemEzVnpNU2d3SmdZRFZRUUREQjlGUlNCRFpYSjBhV1pwWTJGMGFXOXVJRU5sYm5SeVpTQlMKYjI5MElFTkJNUmd3RmdZSktvWklodmNOQVFrQkZnbHdhMmxBYzJzdVpXVXdnZ0VpTUEwR0NTcUdTSWIzRFFFQgpBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRElJTURzNE1WTHF3ZDRsZk5FN3ZzTERQOTBqbUc3c1dMcUk5aXJvV1V5CmV1dU9GMCtXMkFwN2thSmpiTWVNVEM1NXY2a0YvR2xjbFkxaStibHc3Y05SZmRDVDVtenJNRXZodkgyL1Vwdk8KYm50bDhqaXh3S0l5NzJLeWFPQmhVOEUybGYvc2xMbzJycHdjcHpJUDVYeTB4bTkwL1hzWTZLeFg3UVlnU3pJdwpXRnY5emFqbW9meHd2STZTYzl1WHAzd2hyajNCOVVpSGJDZTlueVYwZ1ZXdzkzWDJQYVJrYTlaUDU4NUFyUS9kCk10TzhpaEpUbU1tSit4QWRUWDdOZmg5V0RTRndoZllnZ3gvMnVoOEVqK3AzaURYRS8rcE9vWXROUDJNYlJNTkUKMUNWMnlyZU4xeDVLWm1UTlhNV2NnK0hDQ0lpYTdFNmo4VDRjTE5sc0hhRkxBZ01CQUFHamdZb3dnWWN3RHdZRApWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3SFFZRFZSME9CQllFRkJMeVdqN3FWaHkvCnpRYXM4ZkVseWFsTDFCU1pNRVVHQTFVZEpRUStNRHdHQ0NzR0FRVUZCd01DQmdnckJnRUZCUWNEQVFZSUt3WUIKQlFVSEF3TUdDQ3NHQVFVRkJ3TUVCZ2dyQmdFRkJRY0RDQVlJS3dZQkJRVUhBd2t3RFFZSktvWklodmNOQVFFRgpCUUFEZ2dFQkFIdjI1TUFOcWhsSHQwMVhvLzZ0dTdGcTFRK2UyK1JqeFk2aFVGYVRscmc0d0NRaVpyeFRGR0dWCnY5REhLcFk1UDMwb3N4QkFJV3JFcjdCU2R4amhsdGhXWGVQZE5sNGRwMUJVb01VcTVLcU1sSXBQblRYL2RxUUcKRTVHaW9uMEFSRDlWMDRJOEd0VmJ2RlpNSWk1R1E0b2tRQzN6RXJnN2NCcWtscmthcjRkQkdtb1lEUVpQeHo1dQp1U2xORFVtSkVZY3lXK1pMQk1qa1hPWjBjNVJkRnBnVGxmNzcyN0ZFNVRwd3JEZHI1ck16Y2lqSnMxZWc5Z0lXCmlBWUx0cVpMSUNqVTNqMkxyVGNGVTNUK2JzeThReGR4WHZuRnpCcXBZZTczZGd6emN2UnlyYzl5QWpZSFI4L3YKR1ZDSllNenBKSlVQd3NzZDhtOTJrTWZNZGNHV3haMD0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOSBPPUQtVHJ1c3QgR21iSAojIFN1YmplY3Q6IENOPUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOSBPPUQtVHJ1c3QgR21iSAojIExhYmVsOiAiRC1UUlVTVCBSb290IENsYXNzIDMgQ0EgMiAyMDA5IgojIFNlcmlhbDogNjIzNjAzCiMgTUQ1IEZpbmdlcnByaW50OiBjZDplMDoyNTo2OTo4ZDo0NzphYzo5Yzo4OTozNTo5MDpmNzpmZDo1MTozZDoyZgojIFNIQTEgRmluZ2VycHJpbnQ6IDU4OmU4OmFiOmIwOjM2OjE1OjMzOmZiOjgwOmY3OjliOjFiOjZkOjI5OmQzOmZmOjhkOjVmOjAwOmYwCiMgU0hBMjU2IEZpbmdlcnByaW50OiA0OTplNzphNDo0MjphYzpmMDplYTo2Mjo4NzowNTowMDo1NDpiNToyNTo2NDpiNjo1MDplNDpmNDo5ZTo0MjplMzo0ODpkNjphYTozODplMDozOTplOTo1NzpiMTpjMQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRU16Q0NBeHVnQXdJQkFnSURDWVB6TUEwR0NTcUdTSWIzRFFFQkN3VUFNRTB4Q3pBSkJnTlZCQVlUQWtSRgpNUlV3RXdZRFZRUUtEQXhFTFZSeWRYTjBJRWR0WWtneEp6QWxCZ05WQkFNTUhrUXRWRkpWVTFRZ1VtOXZkQ0JECmJHRnpjeUF6SUVOQklESWdNakF3T1RBZUZ3MHdPVEV4TURVd09ETTFOVGhhRncweU9URXhNRFV3T0RNMU5UaGEKTUUweEN6QUpCZ05WQkFZVEFrUkZNUlV3RXdZRFZRUUtEQXhFTFZSeWRYTjBJRWR0WWtneEp6QWxCZ05WQkFNTQpIa1F0VkZKVlUxUWdVbTl2ZENCRGJHRnpjeUF6SUVOQklESWdNakF3T1RDQ0FTSXdEUVlKS29aSWh2Y05BUUVCCkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU5PeVNzOTZSKzkxbXlQNk9pL1dVRVdKTlRyR2E5disyd0JvcU9BREVSMDMKVUFpZlRVcG9sRFd6VTlHVVk2Y2dWcS9lVVhqc0tqM3pTRWhRUGdyZlJsV0xKMjNERUUwTmtWSkQySWZnWFU0Mgp0U0hLWHpsQUJGOWJmc3lqeGl1cFFCN1pOb1RXU1BPU0hqUkdJQ1RCcEZHT1NocnZVRDlwWFJsL1JjUEhBWTlSCnlTUG9jcTYwdkZZSmZ4TExITEd2S1pBS3lWWE1EOU8wR3UxSE5WcEs3Wnh6QkNIUXFyME1FN1VBeWlac3hHc00KbEZxVmxOcFFtdkgvcFN0bU1hVEpPS0RmSFIrNENTN3pwK2huVXF1VkgrQkdQdGlrdzhwYXhUR0E2RWlhbjVScAovaG5kMkhOOGdjcVczbzd0c3pJRlpZUTA1dWI5VnhDMVgzYS9MN0FRRGNVQ0F3RUFBYU9DQVJvd2dnRVdNQThHCkExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRlAzYUZNU2ZNTjRodlI1Q09meXJZeU5KNFBHRU1BNEcKQTFVZER3RUIvd1FFQXdJQkJqQ0Iwd1lEVlIwZkJJSExNSUhJTUlHQW9INmdmSVo2YkdSaGNEb3ZMMlJwY21WagpkRzl5ZVM1a0xYUnlkWE4wTG01bGRDOURUajFFTFZSU1ZWTlVKVEl3VW05dmRDVXlNRU5zWVhOekpUSXdNeVV5Ck1FTkJKVEl3TWlVeU1ESXdNRGtzVHoxRUxWUnlkWE4wSlRJd1IyMWlTQ3hEUFVSRlAyTmxjblJwWm1sallYUmwKY21WMmIyTmhkR2x2Ym14cGMzUXdRNkJCb0QrR1BXaDBkSEE2THk5M2QzY3VaQzEwY25WemRDNXVaWFF2WTNKcwpMMlF0ZEhKMWMzUmZjbTl2ZEY5amJHRnpjMTh6WDJOaFh6SmZNakF3T1M1amNtd3dEUVlKS29aSWh2Y05BUUVMCkJRQURnZ0VCQUgrWDJ6REkzNlNjZlNGNmdIRE9GQkpwaUJTVllFUUJyTExwTUUrYlVNSm0ySDZOTUxWd01lbmkKYWNmemNOc2dGWWJRRGZDK3JBRjFoTTUrbjAyL3QyQTduUFBLSGVKZWFOaWpuWmZsUUdEU05pSCswTFM0RjlwMApvMy9VMzdDWUFxeHZhMnNzSlNSeW9XWHVKVnJsNWpMbjh0K3JTZnJ6a0drajJ3VFo1MXhZL0dYVWw3N00vQzRLCnpDVXFOUVQ0WUpFVmRUMUIveU1mR2NoczY0SlRCS2JrVENKTmpZeTZ6bHR6N0dSVVVHM1JuRlg3YWNNMnc0eTgKUElXbWF3b21EZUNUbUdDdWZzWWtsNHBoWDVHT1pwSUpoemJOaTVzdFB2WlIxRkRVV1NpOWcvTE1LSHRUaG0zWQpKb2h3MStxUnpUNjV5c0NRYmxyR1huUmwxMXorbytJPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RC1UUlVTVCBSb290IENsYXNzIDMgQ0EgMiBFViAyMDA5IE89RC1UcnVzdCBHbWJICiMgU3ViamVjdDogQ049RC1UUlVTVCBSb290IENsYXNzIDMgQ0EgMiBFViAyMDA5IE89RC1UcnVzdCBHbWJICiMgTGFiZWw6ICJELVRSVVNUIFJvb3QgQ2xhc3MgMyBDQSAyIEVWIDIwMDkiCiMgU2VyaWFsOiA2MjM2MDQKIyBNRDUgRmluZ2VycHJpbnQ6IGFhOmM2OjQzOjJjOjVlOjJkOmNkOmM0OjM0OmMwOjUwOjRmOjExOjAyOjRmOmI2CiMgU0hBMSBGaW5nZXJwcmludDogOTY6Yzk6MWI6MGI6OTU6YjQ6MTA6OTg6NDI6ZmE6ZDA6ZDg6MjI6Nzk6ZmU6NjA6ZmE6Yjk6MTY6ODMKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGVlOmM1OjQ5OjZiOjk4OjhjOmU5Ojg2OjI1OmI5OjM0OjA5OjJlOmVjOjI5OjA4OmJlOmQwOmIwOmYzOjE2OmMyOmQ0OjczOjBjOjg0OmVhOmYxOmYzOmQzOjQ4OjgxCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFUXpDQ0F5dWdBd0lCQWdJRENZUDBNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1GQXhDekFKQmdOVkJBWVRBa1JGCk1SVXdFd1lEVlFRS0RBeEVMVlJ5ZFhOMElFZHRZa2d4S2pBb0JnTlZCQU1NSVVRdFZGSlZVMVFnVW05dmRDQkQKYkdGemN5QXpJRU5CSURJZ1JWWWdNakF3T1RBZUZ3MHdPVEV4TURVd09EVXdORFphRncweU9URXhNRFV3T0RVdwpORFphTUZBeEN6QUpCZ05WQkFZVEFrUkZNUlV3RXdZRFZRUUtEQXhFTFZSeWRYTjBJRWR0WWtneEtqQW9CZ05WCkJBTU1JVVF0VkZKVlUxUWdVbTl2ZENCRGJHRnpjeUF6SUVOQklESWdSVllnTWpBd09UQ0NBU0l3RFFZSktvWkkKaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFKbnhoRFJ3dWkrM01LQ092WHdFejc1aXZKbjlncGZTZWdwbgpsamdKOWhCT2xTSnptWTNhRlMzbkJmd1pjeUszanBnQXZEdzlyS0ZzKzlaNUpVdXQ4TXhrMm9nK0tiZ1BDZE0wCjNUUDFZdEhoelJucDdoaFBURml1NGg3V0RGc1ZXdGc2dU1RWVpCN2pNN0sxaVhkT0RML1psR3NUbDI4U28vNloKcVFUTUZleGdhRGJ0Q0h1MzliK1Q3V1l4ZzR6R2NUU0hUaGZxcjR1UmpSeFdRYTRpTjE0MzhoM1owUzBOTDJsUgpwNzVtcG9vNktyM0hHckhoRlBDK09oMjV6MXV4YXY2MHNVWWdvdnNlTzNEdms1aDlqSE9XOHNYdmhYQ3RLU2I4CkhnUStIS0RZRDh0U2cySjg3b3RUbFpDcFY2THFZUVhZK1UzRUovcHVyZTM1MTFIM2E2VUNBd0VBQWFPQ0FTUXcKZ2dFZ01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZOT1Vpa3hpRXlvWkxzeXZjb3A5TnRlYQpITnhuTUE0R0ExVWREd0VCL3dRRUF3SUJCakNCM1FZRFZSMGZCSUhWTUlIU01JR0hvSUdFb0lHQmhuOXNaR0Z3Ck9pOHZaR2x5WldOMGIzSjVMbVF0ZEhKMWMzUXVibVYwTDBOT1BVUXRWRkpWVTFRbE1qQlNiMjkwSlRJd1EyeGgKYzNNbE1qQXpKVEl3UTBFbE1qQXlKVEl3UlZZbE1qQXlNREE1TEU4OVJDMVVjblZ6ZENVeU1FZHRZa2dzUXoxRQpSVDlqWlhKMGFXWnBZMkYwWlhKbGRtOWpZWFJwYjI1c2FYTjBNRWFnUktCQ2hrQm9kSFJ3T2k4dmQzZDNMbVF0CmRISjFjM1F1Ym1WMEwyTnliQzlrTFhSeWRYTjBYM0p2YjNSZlkyeGhjM05mTTE5allWOHlYMlYyWHpJd01Ea3UKWTNKc01BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQTA3WHRhUEtTVWlPOGFFWFVITDdQK1BQb2VVU2JyaC9ZcAozdUR4MU1Za0NlbkJ6MVVidEREWnpocitCbEdtRmFRdDc3Skx2eUFvSlVuUnBqWjNOT2hrMzFLeEVjZHplczA1Cm5zS3RqSEVoOGxwcnI5ODhUbFd2c29SbEZJbTVkOHNxTWI3UG8yM1BiMGlVTWtadjUzR01vS2FFR1RjSDhnTkYKQ1N1R2RYemZYMmxYQU50dTJLWnlJa3RRMUhXWVZ0KzNHUDlEUTFDdWVrUjc4SGxSMTBNOXA5T0IwL0RKVDduYQp4cGVHMElMRDVFSnQvckRpWkU0T0p1ZEFOQ2ExQ0luWENHTmpPQ2QxSGpQcWJxamRuNWxQZEUyQmlZQkwzWnFYCktWd3Z2b0ZCdVl6LzZuMWdCcDdOMXozVExxTVZ2S2ptSnVWdnc5eTRBeUhxbnhieExGUzEKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUNBIERpc2lnIFJvb3QgUjIgTz1EaXNpZyBhLnMuCiMgU3ViamVjdDogQ049Q0EgRGlzaWcgUm9vdCBSMiBPPURpc2lnIGEucy4KIyBMYWJlbDogIkNBIERpc2lnIFJvb3QgUjIiCiMgU2VyaWFsOiAxMDU3MjM1MDYwMjM5MzMzODIxMQojIE1ENSBGaW5nZXJwcmludDogMjY6MDE6ZmI6ZDg6Mjc6YTc6MTc6OWE6NDU6NTQ6Mzg6MWE6NDM6MDE6M2I6MDMKIyBTSEExIEZpbmdlcnByaW50OiBiNTo2MTplYjplYTphNDpkZTplNDoyNTo0Yjo2OToxYTo5ODphNTo1Nzo0NzpjMjozNDpjNzpkOTo3MQojIFNIQTI1NiBGaW5nZXJwcmludDogZTI6M2Q6NGE6MDM6NmQ6N2I6NzA6ZTk6ZjU6OTU6YjE6NDI6MjA6Nzk6ZDI6Yjk6MWU6ZGY6YmI6MWY6YjY6NTE6YTA6NjM6M2U6YWE6OGE6OWQ6YzU6Zjg6MDc6MDMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZhVENDQTFHZ0F3SUJBZ0lKQUpLNGlOdXdpc0ZqTUEwR0NTcUdTSWIzRFFFQkN3VUFNRkl4Q3pBSkJnTlYKQkFZVEFsTkxNUk13RVFZRFZRUUhFd3BDY21GMGFYTnNZWFpoTVJNd0VRWURWUVFLRXdwRWFYTnBaeUJoTG5NdQpNUmt3RndZRFZRUURFeEJEUVNCRWFYTnBaeUJTYjI5MElGSXlNQjRYRFRFeU1EY3hPVEE1TVRVek1Gb1hEVFF5Ck1EY3hPVEE1TVRVek1Gb3dVakVMTUFrR0ExVUVCaE1DVTBzeEV6QVJCZ05WQkFjVENrSnlZWFJwYzJ4aGRtRXgKRXpBUkJnTlZCQW9UQ2tScGMybG5JR0V1Y3k0eEdUQVhCZ05WQkFNVEVFTkJJRVJwYzJsbklGSnZiM1FnVWpJdwpnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDaW84UUFDZGFGWFMxdEZQYkN3M09lCk5jSnhWWDZCKzZ0R1VPREJmRWw0NXF0NVdEemEvM3djbjlpWEFuZythMEVFNlVHOXZnTXNSZll2Wk5TclhhTkgKUFdTYjZXaWF4c3diUDdxK3NvczBBaTZZVlJuOGpHK3FYOXBNemswRElhUFkwalNUVnBiTFRBd0FGanhmR3MzSQp4MnltcmRNeHA3em81ZUZtMXRMN0E3UkJaY2tRcmc0Rlk4YUFhbWt3L2RMdWtPOE5KOStmbFhQMDRTWGFiQmJlClFUZzA2b3Y4MGVnRUZHRXRRWDZzeDNkT3kxRlUrMTZTR0JzRVdtakd5Y1Q2dHhPZ21MY1JLN2ZXVjh4OG5oZlIKeXlYK2hrNGtMbFlNZUUyZUFSS21LNmNCWlc1OFloMkVoTi9xd0d1MXBTcVZnOE5URVF4ekhRdXlScERSUWpyTwpRRzZWcmYvR2xLMXVsNFNPZlcrZWlvQU5TVzF6NG51U0hzUHp3ZlByTGdWdjJSdlBOM1lFeUxSYTVCZW55OTEyCkg5QVpkdWdzQmJQV25EVFlsdHhoaDVFRjVFUUlNOEhhdVFobDFLNnlOZzNydWppNkRPV2JudXVOWnQyWno5YUoKUWZZRWtvb3BLVzFyT2h6bmRYMENjUTd6d09lOXl4bmRuV0N5d21aZ3RyRUU3c25taHJtYVprQ281eEh0Z1VVRAppL1puV2VqQkJoRzkzYytBQWs5bFFIaGNSMURJbStZZmdYdmtSS2hiaFpyaTNsclZ4L2s2UkdaTDVESlVmT1JzCm5MTU9QUmVpc2pRUzFuNnlxRW03MFhvb1FMNmlGaC9mNURjZkVYUDdrQXBsUTZJTmZQZ0dBVlV6ZmJBTnVQVDEKcnFWQ1YzdzJFWXg3WHNRRG5ZeDVuUUlEQVFBQm8wSXdRREFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZApEd0VCL3dRRUF3SUJCakFkQmdOVkhRNEVGZ1FVdFpuNHI3Q1U5ZU1nMWdxdHprNVdwQzV1UXUwd0RRWUpLb1pJCmh2Y05BUUVMQlFBRGdnSUJBQ1lHWG5EblpUUElnbTdabkJjNkczcG1zZ0gyZUR0cFhpL3EvMDc1S01PWUttRk0KdENRU2luMXRFUlQzbkxYSzVyeWVKNDVNR2NpcHZYckExellPYllWeWJxakdvbTMyK25OamY3eHVlUWdjbllxZgpHb3BUcHRpNzJUVlZzUkhGcVFPelZqdTVoSk1pWG43QjloSlNpK29zWjd6K05rejF1TS9SczBtU085TXBEcGtiCmx2ZGh1RHZFSzdaNGJMUWpiL0Q5MDdKZWRSK1psYWlzOXRyaHhURjcrOUZHczlLOFo3UmlWTG9KOTJPd2s2S2EKK2VsU0xvdGdFcXY4OVdCVzd4QmNpOFFhUXR5RFcyUU95N1c4MWsvQmZEeHVqUk50KzN2ck1ORGNUYS9GMWJhbApURnR4eWVneHZ1ZzRCa2loR3VMcTB0NFNPVmdhLzRBT2duWG10OGtIYkE3di96anhtSEhFdDM4T0ZkQWxhYjBpCm5TdnRCZlpHUjZ6dHdQRFVPK0xzN3BaYmtCTk9IbFk2NjdEdmxydVdJeEc2OGtPR2RHU1Z5Q2gxM3gwMXV0STMKZ3poVE9EWTd6MnpwK1dzTzBQc0U2RTkzMTJVQmVJWU1lajRoWXZGL1kzRU15WjlFMjZnbm9uVytib0UrMThEcgpHNWdQY0Z3MHNvck13SVVZNjI1NnMvZGFvUWUvcVVLUzgyQWlsK1FVb1FlYlRuYkFqbjM5cENYSFIrMy9IM09zCnpNT2w2VzhLanB0bHdsQ0Z0YU9nVXhMTVZZZGg4NEd1RUVaaHZVUWh1TUk5ZE05K0pEWDZIQWNPbXowaXl1OHgKTDR5c0VyM3ZRQ2o4S1dlZnNoTlBaaVRFVXhucEhpa1Y3K1p0c0g4dFovM3piQnQxUnFQbFNoZnBwTmNMCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1BQ0NWUkFJWjEgTz1BQ0NWIE9VPVBLSUFDQ1YKIyBTdWJqZWN0OiBDTj1BQ0NWUkFJWjEgTz1BQ0NWIE9VPVBLSUFDQ1YKIyBMYWJlbDogIkFDQ1ZSQUlaMSIKIyBTZXJpYWw6IDY4Mjg1MDMzODQ3NDg2OTY4MDAKIyBNRDUgRmluZ2VycHJpbnQ6IGQwOmEwOjVhOmVlOjA1OmI2OjA5Ojk0OjIxOmExOjdkOmYxOmIyOjI5OjgyOjAyCiMgU0hBMSBGaW5nZXJwcmludDogOTM6MDU6N2E6ODg6MTU6YzY6NGY6Y2U6ODg6MmY6ZmE6OTE6MTY6NTI6Mjg6Nzg6YmM6NTM6NjQ6MTcKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDlhOjZlOmMwOjEyOmUxOmE3OmRhOjlkOmJlOjM0OjE5OjRkOjQ3OjhhOmQ3OmMwOmRiOjE4OjIyOmZiOjA3OjFkOmYxOjI5OjgxOjQ5OjZlOmQxOjA0OjM4OjQxOjEzCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlIMHpDQ0JidWdBd0lCQWdJSVhzTzNwa04vcE9Bd0RRWUpLb1pJaHZjTkFRRUZCUUF3UWpFU01CQUdBMVVFCkF3d0pRVU5EVmxKQlNWb3hNUkF3RGdZRFZRUUxEQWRRUzBsQlEwTldNUTB3Q3dZRFZRUUtEQVJCUTBOV01Rc3cKQ1FZRFZRUUdFd0pGVXpBZUZ3MHhNVEExTURVd09UTTNNemRhRncwek1ERXlNekV3T1RNM016ZGFNRUl4RWpBUQpCZ05WQkFNTUNVRkRRMVpTUVVsYU1URVFNQTRHQTFVRUN3d0hVRXRKUVVORFZqRU5NQXNHQTFVRUNnd0VRVU5EClZqRUxNQWtHQTFVRUJoTUNSVk13Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ2IKcWF1L1lVcVhyeStYWnBwMFg5RFpsdjNQNHVSbTd4OGZSelBDUktQZm10NGZ0VlRkRlh4cE5SRnZ1OGdNam1vWQpIdGlQMlJhOEVFZzJYUEJqczVCYVhDUTMxNlBXeXdseHVmRUJjb1N3ZmR0TmdNMzgwMi9KK05xMkRvTFNSWVdvCkcyaW9QZWowUkd5OW9jTExBNzZNUGhNQWhOOUtTTURqSWdybzZUZW5HRXl4Q1EwalZuOEVUZGtYaEJpbHlOcEEKbEhQcnpnNVhQQU9CT3AwS29WZERhYXhYYlhtUWVPVzF0RHZZdkV5TktLR25vNmU2QWs0bDBTcXU3YTRESXJocgpJQTh3S0ZTVmYrRHV6Z3BtbmRGQUxXNGlyNTBhd1FVWjBtL0E4cC80ZTdNQ1F2dFFxUjB0a3c4anE4YkJENUwvCjBLSVY5Vk1KY1J6L1JST0U1aVplK09DSUhBcjhGcmFvY3dhNDhHT0VBcURHV3V6bmROOXdycU9ESmVyV3g1ZUgKazZmR2lvb3psMkEzRUQ2WFBtNHBGZGFoRDlHSUxCS2ZiNnFreGtMclFhTGpsVVBUQVlWdGpyczc4eU0yeC80Nwo0S0VsQjBpcnlZbDAvd2lQZ0wvQWxtWHo3dXhMYUwyZGlNTXhzMER4Nk0vMk9MdWM1TkYvMU9WWW0zejYxUE1PCm0zV1I1THBTTGhsKzBmWE5XaG44dWdiMisxS29TNWtFM2ZqNXRJdFFvMDVpaWZDSEpQcURRc0dIK3RVdEtTcGEKY1hwa2F0Y25ZR01OMjg1SjlZMGZrSWt5Ri9oelE3alNXcE9HWWRiaGRRcnFlV1oyaUU5eDZ3UWwxZ3BhZXBQbAp1VXNYUUEreHRybjEzay9jNExPc094RndZSVJLUTI2WklNQXBjUXJBWlFJREFRQUJvNElDeXpDQ0FzY3dmUVlJCkt3WUJCUVVIQVFFRWNUQnZNRXdHQ0NzR0FRVUZCekFDaGtCb2RIUndPaTh2ZDNkM0xtRmpZM1l1WlhNdlptbHMKWldGa2JXbHVMMEZ5WTJocGRtOXpMMk5sY25ScFptbGpZV1J2Y3k5eVlXbDZZV05qZGpFdVkzSjBNQjhHQ0NzRwpBUVVGQnpBQmhoTm9kSFJ3T2k4dmIyTnpjQzVoWTJOMkxtVnpNQjBHQTFVZERnUVdCQlRTaDdUajN6Y25rMVgyClZ1cUI1VGJNakI0L3ZUQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01COEdBMVVkSXdRWU1CYUFGTktIdE9QZk55ZVQKVmZaVzZvSGxOc3lNSGorOU1JSUJjd1lEVlIwZ0JJSUJhakNDQVdZd2dnRmlCZ1JWSFNBQU1JSUJXRENDQVNJRwpDQ3NHQVFVRkJ3SUNNSUlCRkI2Q0FSQUFRUUIxQUhRQWJ3QnlBR2tBWkFCaEFHUUFJQUJrQUdVQUlBQkRBR1VBCmNnQjBBR2tBWmdCcEFHTUFZUUJqQUdrQTh3QnVBQ0FBVWdCaEFPMEFlZ0FnQUdRQVpRQWdBR3dBWVFBZ0FFRUEKUXdCREFGWUFJQUFvQUVFQVp3QmxBRzRBWXdCcEFHRUFJQUJrQUdVQUlBQlVBR1VBWXdCdUFHOEFiQUJ2QUdjQQo3UUJoQUNBQWVRQWdBRU1BWlFCeUFIUUFhUUJtQUdrQVl3QmhBR01BYVFEekFHNEFJQUJGQUd3QVpRQmpBSFFBCmNnRHpBRzRBYVFCakFHRUFMQUFnQUVNQVNRQkdBQ0FBVVFBMEFEWUFNQUF4QURFQU5RQTJBRVVBS1FBdUFDQUEKUXdCUUFGTUFJQUJsQUc0QUlBQm9BSFFBZEFCd0FEb0FMd0F2QUhjQWR3QjNBQzRBWVFCakFHTUFkZ0F1QUdVQQpjekF3QmdnckJnRUZCUWNDQVJZa2FIUjBjRG92TDNkM2R5NWhZMk4yTG1WekwyeGxaMmx6YkdGamFXOXVYMk11CmFIUnRNRlVHQTFVZEh3Uk9NRXd3U3FCSW9FYUdSR2gwZEhBNkx5OTNkM2N1WVdOamRpNWxjeTltYVd4bFlXUnQKYVc0dlFYSmphR2wyYjNNdlkyVnlkR2xtYVdOaFpHOXpMM0poYVhwaFkyTjJNVjlrWlhJdVkzSnNNQTRHQTFVZApEd0VCL3dRRUF3SUJCakFYQmdOVkhSRUVFREFPZ1F4aFkyTjJRR0ZqWTNZdVpYTXdEUVlKS29aSWh2Y05BUUVGCkJRQURnZ0lCQUpjeEFwL24vVU5uU0VRVTVDbUg3VXdvWnRDUE5kcE5ZYmRLbDAyMTI1RGdCUzRPeG5uUThwZHAKRDcwRVI5bSsyN1VwMnB2WnJxbVoxZE04TUpQMWphR28vQWFOUlBUS0ZwVjhNOXhpaTZnMytDZllDUzBiNzhnVQpKeUNwWkVUL0x0WjFxbXhOWUVBWlNVTlVZOXJpekxwbTVVOUVlbHZaYW9FclFOVi8rUUVuV0N6STdVaVJmRCttCkFNL0VLWE1STnQ2R0dUNmQ3aG1LRzlXdzdZNDluQ3JBRGRnOVp1TThEYjNWbEZ6aTRxYzFHd1FBOWo5YWplcEQKdlYrSkhhbkJzTXlaNGswQUN0ckpKMXZuRTVCYzVQVXpvbFZ0M09BSlRTK3hKbHNuZFFBSnhHSjNLUWhmbmxtcwp0bjZ0bjFRd0lnUEJIbkZrL3ZrNENwWVkzUUlVckNQTEJod2VwSDJORGQ0blFlaXQyaFczc0NQZEs2alQyaVdICjdlaFZSRTJJOURaK2hKcDRyUGNPVmtrTzFqTWwxb1JRUW13Z0VoMHExYjY4OG5DQnBIQmd2Z1cxbTU0RVJMNWgKSTZ6cHBTU01FWUNVV3FLaXVVblN3ZHpScCsweEVTeWVHYWJ1NFZYaHdPclBEWVRrRjdlaWZLWGVWU1VHN3N6QQpoMXhBMnN5VlAxWGdOY2U0aEw2MFhjMTZnd0Z5N29mbVh4MnV0WVhHSnQvbXdacnBIZ0pIbnlxb2JhbGJ6K3hGCmQzK1lKNW95WFNyamhPN0ZtR1l2bGlBZDNkakRKOWV3K2Y3WmZjM1FuNDhMRkZoUm55K0x3emd0M3VpUDFvMkgKcFBWV1F4YVpMUFNrVnJRMHVHRTN5Y0pZZ0J1Z2w2SDhXWTNwRWZiUkQwdFZORVlxaTRZNwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VFdDQSBHbG9iYWwgUm9vdCBDQSBPPVRBSVdBTi1DQSBPVT1Sb290IENBCiMgU3ViamVjdDogQ049VFdDQSBHbG9iYWwgUm9vdCBDQSBPPVRBSVdBTi1DQSBPVT1Sb290IENBCiMgTGFiZWw6ICJUV0NBIEdsb2JhbCBSb290IENBIgojIFNlcmlhbDogMzI2MgojIE1ENSBGaW5nZXJwcmludDogZjk6MDM6N2U6Y2Y6ZTY6OWU6M2M6NzM6N2E6MmE6OTA6MDc6Njk6ZmY6MmI6OTYKIyBTSEExIEZpbmdlcnByaW50OiA5YzpiYjo0ODo1MzpmNjphNDpmNjpkMzo1MjphNDplODozMjo1Mjo1NTo2MDoxMzpmNTphZDphZjo2NQojIFNIQTI1NiBGaW5nZXJwcmludDogNTk6NzY6OTA6MDc6Zjc6Njg6NWQ6MGY6Y2Q6NTA6ODc6MmY6OWY6OTU6ZDU6NzU6NWE6NWI6MmI6NDU6N2Q6ODE6ZjM6Njk6MmI6NjE6MGE6OTg6Njc6MmY6MGU6MWIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZRVENDQXltZ0F3SUJBZ0lDREw0d0RRWUpLb1pJaHZjTkFRRUxCUUF3VVRFTE1Ba0dBMVVFQmhNQ1ZGY3gKRWpBUUJnTlZCQW9UQ1ZSQlNWZEJUaTFEUVRFUU1BNEdBMVVFQ3hNSFVtOXZkQ0JEUVRFY01Cb0dBMVVFQXhNVApWRmREUVNCSGJHOWlZV3dnVW05dmRDQkRRVEFlRncweE1qQTJNamN3TmpJNE16TmFGdzB6TURFeU16RXhOVFU1Ck5UbGFNRkV4Q3pBSkJnTlZCQVlUQWxSWE1SSXdFQVlEVlFRS0V3bFVRVWxYUVU0dFEwRXhFREFPQmdOVkJBc1QKQjFKdmIzUWdRMEV4SERBYUJnTlZCQU1URTFSWFEwRWdSMnh2WW1Gc0lGSnZiM1FnUTBFd2dnSWlNQTBHQ1NxRwpTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDd0Jkdkk2NHpFYm9vaDc0NU5uSEVLSDFKdzdXMkNuSmZGCjEweE9SVW5MUUVLMUVqUnNHY0owcERGZmhRS1g3RU16Q2xQU25JeU90N2g1Mnl2VmF2S09ac1R1S3dFSGt0U3oKMEFMZlVQWlZyMllPeStCSFlDOHJNamsxVWpvb2cvaDdGc1lZdUdMV1J5V1J6dkFaRWsydFkvWFRQM1ZmS2ZDaApNQndxb0ppbUZiM3UvUmsyOE9LUlE0LzZ5dFlRSjBsTTc5M0I4WVZ3bThycXFGcEQvRzJHYjNQcE4wV3A4RGJICnpJaDFIcnRzQnYrYmF6NFg3R0dxY1h6R0hhTDNTZWtWdFR6V29XSDFFZmNGYngzOUViN1FNQWZDS2JBSlRpYmMKNDZLb2tXb2Z3cEZGaUZ6bG1MaHhwUlVaeVh4MUVjeHdkRTh0bXgyUlJQMVdLS0QrdTRacXlQcGNDMWpjeGt0Mgp5S3NpMlhNUHBmUmFBb2svVDU0aWd1NmlkRk1xUFZNbmFSMXNqaklzWkFBbVkyRTJUcU5HdHo5OXN5MnNiWkNpCmxhTE96OXFDNXdjMEdaYnB1Q0dxS1g2bU9MNk9LVW9oWm5rZnM4TzFDV2ZlMXRRSFJ2TXEydVlpTjJETGdiWVAKb0EvcHlKVi92MVdSQlhyUFBSWEFiOTRKbEFHRDF6UWJ6RUNsOExpYlo5V1lrVHVuaEhpVkpxUmFDUGdyZExRQQpCRHpmdUJTTzZOK3BqV3hua2pNZHdMZlM3SkxJdmdtL0xDa0Zid0pybnUrOHZ5cThXOEJRajBGd2NZZXlUYmNFCnFZU2pNcSt1N21zWGk3S3gvbXpoa0l5SXFKZEl6c2hOeS9NR3oxOXFDa0t4SGg1M0w0Nmc1cElPQnZ3Rkl0SW0KNFRGUmZUTGNEd0lEQVFBQm95TXdJVEFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQgovekFOQmdrcWhraUc5dzBCQVFzRkFBT0NBZ0VBWHpTQmR1K1dIZFhsdGRrQ1k0UVd3YTZnY0ZHbjkweEhOY2dMCjF5ZzlpWEhacWpOQjZoUWJiQ0VBd0d4Q0dYNmZhVnNnUXQraTB0ckVmSmRMamJEb3JNanVwV2tFbVFxU3Bxc24KTGhwTmdiK0UxSEFlclVmKy9VcWRNK0R5dWNSRkNDRUsybWxwYzNJTnZqVCtsSXV0d3g0MTE2S0Q3K1U0eDZXRgpINnZQTk93L0tQNE04VmVHVHNsVjl4elUyS1Y5Qm5wdjFkOFEzNEZPSVdXeHR1RVhlWlZGQnM1ZnpOeEdpV05vClJJMlQ5R1J3b0QyZEtBWERPWEM0WW5zZy9lVGI2UWlodUo0OUNjZFAreXo0azNaQjNsTGc0VmZTblFPOGQ1NysKbmlsZTk4RlJZQi9lMmd1eUxYVzNRMGlUNS9aNXhvUmRnRmxnbFB4NG1JODhrMUh0UUpBSDMyUmpKTXRPY1FXaAoxNVFhaURMeEluUWlycVdtMkJKcFRHQ2pBdTRyN05SamtndGV2aTkyYTZPMkpyeVBBOWdLOGt4a1JyMDVZdVdXCjZ6UmpFU2pNbGZHdDcrL2NnRmhJNlV1NDZtV3M2ZnlBdGJYSVJmbXN3Wi9adWVwaWlJN0U4VXVERXEzbWk0VFcKbnNMcmd4aWZhcnNiSkdBemNNenM5ekx6WE5sNWZlK2VwUDdKSThNazdoV1NzVDJSVHlhR3ZXWnpKQlBxcEs1agp3YTE5aEFNOEVIaUdHM25qeFBQeUJKVWdyaU9DeExNNkFHSy81allrNFZlNnh4NlFkZFZmUDVWaEs4RTd6ZVd6CmFHSFFSaWFwSVZKcExlc3V4K3QzenFZNnRRTXpUM2JSNTF4VUFWM0xlUFRKREwvUEVvNFhMU05vbE9lci9xbXkKS3diUUJNMD0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVRlbGlhU29uZXJhIFJvb3QgQ0EgdjEgTz1UZWxpYVNvbmVyYQojIFN1YmplY3Q6IENOPVRlbGlhU29uZXJhIFJvb3QgQ0EgdjEgTz1UZWxpYVNvbmVyYQojIExhYmVsOiAiVGVsaWFTb25lcmEgUm9vdCBDQSB2MSIKIyBTZXJpYWw6IDE5OTA0MTk2Njc0MTA5MDEwNzk2NDkwNDI4NzIxNzc4NjgwMTU1OAojIE1ENSBGaW5nZXJwcmludDogMzc6NDE6NDk6MWI6MTg6NTY6OWE6MjY6ZjU6YWQ6YzI6NjY6ZmI6NDA6YTU6NGMKIyBTSEExIEZpbmdlcnByaW50OiA0MzoxMzpiYjo5NjpmMTpkNTo4Njo5YjpjMTo0ZTo2YTo5MjpmNjpjZjpmNjozNDo2OTo4Nzo4MjozNwojIFNIQTI1NiBGaW5nZXJwcmludDogZGQ6Njk6MzY6ZmU6MjE6Zjg6ZjA6Nzc6YzE6MjM6YTE6YTU6MjE6YzE6MjI6MjQ6Zjc6MjI6NTU6Yjc6M2U6MDM6YTc6MjY6MDY6OTM6ZTg6YTI6NGI6MGY6YTM6ODkKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZPRENDQXlDZ0F3SUJBZ0lSQUpXK0ZxRDNMa2J4ZXptQ2N2cUx6Wll3RFFZSktvWklodmNOQVFFRkJRQXcKTnpFVU1CSUdBMVVFQ2d3TFZHVnNhV0ZUYjI1bGNtRXhIekFkQmdOVkJBTU1GbFJsYkdsaFUyOXVaWEpoSUZKdgpiM1FnUTBFZ2RqRXdIaGNOTURjeE1ERTRNVEl3TURVd1doY05Nekl4TURFNE1USXdNRFV3V2pBM01SUXdFZ1lEClZRUUtEQXRVWld4cFlWTnZibVZ5WVRFZk1CMEdBMVVFQXd3V1ZHVnNhV0ZUYjI1bGNtRWdVbTl2ZENCRFFTQjIKTVRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBTUsrNnlmd0lhUHphU1pWZnAzRgpWUmFSWFAzdkliOVRnSG90MHBHTVl6SHc3Q1R3dzZYU2Nud1FiZlEzdCtYbWZIbnFqTFdDaTY1SXRxd0EzR1YxCjdDcE5YOEdIOVNCbEs0R29SejZKSTVVd0ZwQi82RmNIU09jWnJyOUZaN0UzR3dZcS90NzVySDJEKzE2NjVJK1gKWjc1TGpvMWtCMWM0VldrME5qMFRTTzlQNHRObUhxVFBHcmRlTmpQVXRBYTlHQUg5ZDRSUUFFWDFqRjNvSTd4KwovalhoN1ZCN3FUQ05HZE1Kam1oblhiODhseGhUdXlsaXhjcGVjc0hIbHRUYkxhQzBIMmtEN09yaVVQRU1QUENzCjgxTXQ4QnoxN1d3NU9YT0FGc2hTc0NQTjREN2MzVHhIb0xzMWl1S1lhSXUrNWI5eTd0TDZwZTBTN2Z5WUdLa20KZHR3b1N4QWdITk4vRm5jdDdXK0E5MG03VXdXN1hXakgxTWgxRmorSldvdjNGMGZVVFBIU2lYaytUVDJZcUdIZQpPaDdTK0Y0RDRNSEpISXpUalUzVGxUYXpOMTlqWTVzekZQQXRKbXRUZkltTU1zSnU3RDBoQURuSm9XamlVSU11CnNEb3I4emFnckMva2IySENVUWs1UG90VHVidG4ydHhUdVhaWk5wMUQ1U0RnUFRKZ2hTSlJ0OGN6dTkwVkw2UjQKcGdkN2dVWTJCSWJkZVRYSGxTdzdzS01YTmVWekg3UmNXZS9hNmhCbGUzclFmNSt6dENvM08zQ0xtMXU1SzdmcwpzbEVTbDFNcFd0VHdFaERjVHdLN0VwSXZZdFEvYVVOOERkYjhXSFVCaUoxWUZrdmV1cEQvUndHSkJtcjJYN0tRCmFyTUNwZ0tJdjdOSGZpcloxZnBvZURWTkFnTUJBQUdqUHpBOU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0N3WUQKVlIwUEJBUURBZ0VHTUIwR0ExVWREZ1FXQkJUd2oxazRBTFAxajVxV0ROWHIrbnVxRitnVEVqQU5CZ2txaGtpRwo5dzBCQVFVRkFBT0NBZ0VBdnVSY1lrNGs5QXdJLy9EVERHamtrMGtpUDBRbmI3dHQzb05tenFqTURmejFtZ2JsCmR4U1I2NTFCZTVrcWhPWC8vQ0hCWGZEa0gxZTNkYW1oWHdJbS85Zkg5MDdlVC9qM0hFYkFlazlBTENJMThCbXgKMEd0bkxMQ280TUJBTnpYMmhGeGM0NjlDZVA2bnlRMVE2ZzJFZHZaUjc0TlR4bnIvRGxaSkxvOTYxZ3ptSjFUagpUUXBnY21MTmtRZldwYi9JbVd2dHhCbm1xMHdST01Wdk1lSnVTY2cvZG9BbUF5WXA0RGIyOWlCVDR4ZHdOQmVkClkyZ2VhK3pEVFlhNEV6QXZYVVlOUjBQVkc2cFpEcmxjalFaSXJYU0hYOGY4TVZSQkUrTEhJUTZlNEI0TjRjQjcKUTRXUXhZcFl4bVVLZUZmeXhpTVBBZGtnUzk0UCs1S0ZkU3BjYzQxdGV5V1J5dTVGcmdaTEFNelRzVmxRMmpxSQpPeWxEUmw2WEsxVE9VMitOU3VlVytyOXhEa0tMZlAwb29OQkl5dHJFZ1V5N29uT1RKc2pyRE5ZbWlMYkFKTSs3CnZWdnJkWDNwQ0k2R015eDVkd2xwcFluOHMzQ1FoM2FQMHlLN1FzNjljd3NnSmlyUW16MXdIaVJzellkMnFSZVcKdDg4Tmt2dU9HS21ZU2RHZS9tQkVjaUc1R2UzQzlUSHhPVWlJa0NSMVZCYXR6dlQ0YVJSa09mdWp1THB3UU1jbgpITC9FVmxQNlkyWFE4eHdPRnZWcmhsaE5HTlRrRFk2bG5WdVIzSFlrVUQvR0t2dlp0NXkxMXViUTJlZ1ppeFZ4ClNLMjM2dGhaaU5TUXZ4YXoyZW1zV1dGVXlCeTZ5c0hLNGJrZ1RJODZrNG1sb015LzAvWjFwSFdXYlZZPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RS1UdWdyYSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPUUtVHVcdTAxMWZyYSBFQkcgQmlsaVx1MDE1ZmltIFRla25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLlx1MDE1ZS4gT1U9RS1UdWdyYSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkKIyBTdWJqZWN0OiBDTj1FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89RS1UdVx1MDExZnJhIEVCRyBCaWxpXHUwMTVmaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXptZXRsZXJpIEEuXHUwMTVlLiBPVT1FLVR1Z3JhIFNlcnRpZmlrYXN5b24gTWVya2V6aQojIExhYmVsOiAiRS1UdWdyYSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSIKIyBTZXJpYWw6IDc2Njc0NDcyMDY3MDMyNTQzNTUKIyBNRDUgRmluZ2VycHJpbnQ6IGI4OmExOjAzOjYzOmIwOmJkOjIxOjcxOjcwOjhhOjZmOjEzOjNhOmJiOjc5OjQ5CiMgU0hBMSBGaW5nZXJwcmludDogNTE6YzY6ZTc6MDg6NDk6MDY6NmU6ZjM6OTI6ZDQ6NWM6YTA6MGQ6NmQ6YTM6NjI6OGY6YzM6NTI6MzkKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGIwOmJmOmQ1OjJiOmIwOmQ3OmQ5OmJkOjkyOmJmOjVkOjRkOmMxOjNkOmEyOjU1OmMwOjJjOjU0OjJmOjM3OjgzOjY1OmVhOjg5OjM5OjExOmY1OjVlOjU1OmYyOjNjCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlHU3pDQ0JET2dBd0lCQWdJSWFtZytuRkdieTFNd0RRWUpLb1pJaHZjTkFRRUxCUUF3Z2JJeEN6QUpCZ05WCkJBWVRBbFJTTVE4d0RRWURWUVFIREFaQmJtdGhjbUV4UURBK0JnTlZCQW9NTjBVdFZIWEVuM0poSUVWQ1J5QkMKYVd4cHhaOXBiU0JVWld0dWIyeHZhbWxzWlhKcElIWmxJRWhwZW0xbGRHeGxjbWtnUVM3Rm5pNHhKakFrQmdOVgpCQXNNSFVVdFZIVm5jbUVnVTJWeWRHbG1hV3RoYzNsdmJpQk5aWEpyWlhwcE1TZ3dKZ1lEVlFRRERCOUZMVlIxClozSmhJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1CNFhEVEV6TURNd05URXlNRGswT0ZvWERUSXoKTURNd016RXlNRGswT0Zvd2diSXhDekFKQmdOVkJBWVRBbFJTTVE4d0RRWURWUVFIREFaQmJtdGhjbUV4UURBKwpCZ05WQkFvTU4wVXRWSFhFbjNKaElFVkNSeUJDYVd4cHhaOXBiU0JVWld0dWIyeHZhbWxzWlhKcElIWmxJRWhwCmVtMWxkR3hsY21rZ1FTN0ZuaTR4SmpBa0JnTlZCQXNNSFVVdFZIVm5jbUVnVTJWeWRHbG1hV3RoYzNsdmJpQk4KWlhKclpYcHBNU2d3SmdZRFZRUUREQjlGTFZSMVozSmhJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNQpNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQWc4QU1JSUNDZ0tDQWdFQTR2VS9rd1ZSSG9WaVZGNTZDL1VZCkI0T3VmcTk4OTlTS2E2VmpRem01Uy9mRHhtU0pQWlF1VklCU09Ua0hTMHZkaFFkMmg4eS9MNVZNekgyblBieEgKRDVodytJeUZIblNPa20wYlFOR1pEYnQxYnNpcGE1ckFoREd2eWtQTDZ5czA2SStYYXdHYjFRNUtDS3Bia25TRgpROU9BcnFHSVc2Nno2bDdMRnBwM1JNaWg5bFJvenQ2UGx5dTZXMEFDREdRWHdMV1R6ZUh4RTJiT0RIbnYwWkVvCnExK2dFbEl3Y3htT2orR01CNkxEdTBydzZoOFZxTzRsektSRytCc2k3N01PUTdvc0pMakZMRnpVSFBoZFpMM0QKazE0b3B6OG44WTRlMHlwUUJhTlYyY3ZuT1ZQQW1KNk1WR0tMSnJEM2ZZMTg1TWFlWmtKVmdrZm5zbGlOWnZjSApmQzQyNWxBY1A5dERKTVcvaGtkNXMza2M5MXIwRSt4cytEL2lXUitWN2tJK3VhMm9Nb1ZKbDBiK1N6R1BXc3V0CmRFY2Y2WkczM3lnRUlxRFVEMTNpZVUvcWJJV0d2YWltenVUNncrR3pydDQ4VWU3TEUzd0JmNFFPWFZHVW5oTU0KdGk2bFRQazVjRFp2bHNvdURFUlZ4Y3I2WFFLajM5WmtqRnF6QVFxcHRRcEhGLy92a1VBcWpxRkdPakdZNVJIOAp6THRKVm9yOHVkQmhtbTlsYk9iRHl6NTFTZjZQcCtLSnhXZlhuVVlUVGpGMk95U3puaEZsaHF0Lzd4M1UrTHpuCnJGcGN0MXBIWEZYT1ZiUWljVnRiQy9EUDNLQmhaT3FwMTJnS1k2ZmdEVCtncjlPcTBuN3ZVYURtVVN0VmtoVVgKVTh1M1pnNW1UUGo1ZFV5UTV4Snd4MFVDQXdFQUFhTmpNR0V3SFFZRFZSME9CQllFRkM3ajI3SkowSnhVZVZ6NgpKeXIrekU3UzZFNVVNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdId1lEVlIwakJCZ3dGb0FVTHVQYnNrblFuRlI1ClhQb25LdjdNVHRMb1RsUXdEZ1lEVlIwUEFRSC9CQVFEQWdFR01BMEdDU3FHU0liM0RRRUJDd1VBQTRJQ0FRQUYKTnpyMFRiZEY0a1YxSkkrMmQxTG9ITmdRazJYejhsa0dwRDRlS2V4ZDBkQ3JmT0FLa0VoNDdVNllBNW4rS0dDUgpIVEFkdUdOOHFPWTF0ZnJUWVhibTFnZEx5bW1hc29SNmQ1TkZGeFdmSk5DWUV4TC91NkF1L1U1TWgvak9YS3FZCkd3WGdBRVpLZ29DbE00c28zTzA0MDkvbFB1bisrMW5kWVlSUDBsU1dFMkVUUG8rQWFiNlRSN1UxUTlKYXV6MWMKNzdOQ1I4MDdWUk1Hc0FuYi9XUDJPb2dLbVc5KzRjNGJVMnBFWmlOUkNIdThXMUtpL1FZM09FQmhqMHFXdUpBMworR2JIZUpBQUZTNkxyVkUxVXdlb2EyaXUrVTQ4QnliTkNBVnd6RGsvZHIybDAyY21BWWFtVTlKZ08zeERmMVdLCnZKVWF3U2c1VEI5RDBwSDBjbG1LdVZiOFA3U2QybkNjZGxxTVExRHVqakJ5VGQvL1NmZkdxV2ZaYmF3Q0VlSTYKRmlXbldBakxiMU5CbkVnNFIyZ3owZGZIajlSMElkVERCWkI2Lzg2V2lMRVZLVjBqcTlCZ29SSlAzdlFYelRMbAp5Yi9JUTYzOUxvN3hyK0wwbVBvU0h5RFl3S2NNaGNXUTlEc3RsaWF4TEw1TXErdXgwb3JKMjNnVER4NEpuVzJQCkFKOEMyc0g2SDNwNkNjUks1b2dxbDUrSmkvMDNYMTg2empoWmhrdXZjUXUwMlBKd1Q1OHlFK093cDFmbDJ0cEQKeTRRMDhpakU2bTMwS3UvQmEzYmErMzY3aFR6U1U4Sk52bkhoUmRIOUkyY05FM1g3ejJWbklwMnVzQW5SQ2Y4ZApOTC8rSTVjMzBqbjZQUTBHQzdUYk82T3JiMXdkdG43b3M0STA3UVpjSkE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VC1UZWxlU2VjIEdsb2JhbFJvb3QgQ2xhc3MgMiBPPVQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkggT1U9VC1TeXN0ZW1zIFRydXN0IENlbnRlcgojIFN1YmplY3Q6IENOPVQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIgTz1ULVN5c3RlbXMgRW50ZXJwcmlzZSBTZXJ2aWNlcyBHbWJIIE9VPVQtU3lzdGVtcyBUcnVzdCBDZW50ZXIKIyBMYWJlbDogIlQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIiCiMgU2VyaWFsOiAxCiMgTUQ1IEZpbmdlcnByaW50OiAyYjo5Yjo5ZTplNDo3Yjo2YzoxZjowMDo3MjoxYTpjYzpjMTo3Nzo3OTpkZjo2YQojIFNIQTEgRmluZ2VycHJpbnQ6IDU5OjBkOjJkOjdkOjg4OjRmOjQwOjJlOjYxOjdlOmE1OjYyOjMyOjE3OjY1OmNmOjE3OmQ4Ojk0OmU5CiMgU0hBMjU2IEZpbmdlcnByaW50OiA5MTplMjpmNTo3ODo4ZDo1ODoxMDplYjphNzpiYTo1ODo3Mzo3ZDplMTo1NDo4YTo4ZTpjYTpjZDowMTo0NTo5ODpiYzowYjoxNDozZTowNDoxYjoxNzowNToyNTo1MgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHd6Q0NBcXVnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFzRkFEQ0JnakVMTUFrR0ExVUVCaE1DUkVVeApLekFwQmdOVkJBb01JbFF0VTNsemRHVnRjeUJGYm5SbGNuQnlhWE5sSUZObGNuWnBZMlZ6SUVkdFlrZ3hIekFkCkJnTlZCQXNNRmxRdFUzbHpkR1Z0Y3lCVWNuVnpkQ0JEWlc1MFpYSXhKVEFqQmdOVkJBTU1IRlF0VkdWc1pWTmwKWXlCSGJHOWlZV3hTYjI5MElFTnNZWE56SURJd0hoY05NRGd4TURBeE1UQTBNREUwV2hjTk16TXhNREF4TWpNMQpPVFU1V2pDQmdqRUxNQWtHQTFVRUJoTUNSRVV4S3pBcEJnTlZCQW9NSWxRdFUzbHpkR1Z0Y3lCRmJuUmxjbkJ5CmFYTmxJRk5sY25acFkyVnpJRWR0WWtneEh6QWRCZ05WQkFzTUZsUXRVM2x6ZEdWdGN5QlVjblZ6ZENCRFpXNTAKWlhJeEpUQWpCZ05WQkFNTUhGUXRWR1ZzWlZObFl5QkhiRzlpWVd4U2IyOTBJRU5zWVhOeklESXdnZ0VpTUEwRwpDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3FYOW9iWCtoemtlWGFYUFNpNWtmbDgyaFZZQVVkCkFxU3ptMW56SG9xdk5LMzhEY0xaU0JudWFZL0pJUHdocWdjWjdiQmNyR1hIWCswQ2ZIdDhMUnZXdXJtQXdoaUMKRm9UNlpyQUl4bFFqZ2VUTnVVay85azl1TjBnb09BL0Z2dWRvY1AwNWwwM1N4NWlSVUtyRVJMTWpmVGxINlZKaQoxaEtUWHJjeGxrSUYrM2FuSHFQMXd2enBlc1ZzcVhGUDZzdDR2R0N2eDk3MDJjdStmak9sYnBTRDhEVDZJYXZxCmpuS2dQNlRlTUZ2dmhrMXFsVnREUktnUUZSemxBVmZGbVBIbUJpaVJxaURGdDFNbVVVT3lDeEdWV09IQUQzYloKd0kxOGdmTnljSjV2L2hxTzJWODF4ckp2Tkh5K1NFL2lXam5YMkoxNG5wK0dQZ05lR1l0RW90WEhBZ01CQUFHagpRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnRUdNQjBHQTFVZERnUVdCQlMvCldTQTJBSG1nb0NKcmpOWHlZZEs0TE11Q1NqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUFNUU9pWVFzZmRPaHkKTnNadCtVMmUraUtvNFlGV3o4MjduK3Fya1JrNHI2cDhGVTN6dHFPTnBmU085a1NwcCtnaGxhMCtBR0lXaVBBQwp1dnhoSStZem16QjZhelppZTYwRUk0UllaZUxiSzRybkpWTTNZbE5mdk5vQllpbWlwaWR4NWpvaWZzRnZIWlZ3CklFb0hOTi9xL3hXQTViclhldGhiZFh3RmVpbEhma0NvTVJOM3pVQTd0RkZIZWk0UjQwY1IzcDFtMEl2VlZHYjYKZzFYcWZNSXBpUnZwYjdQTzRnV0V5UzgrZUlWaWJzbGZ3WGhqZEZqQVNCZ01tVG5ycE13YXRYbGFqUldjMkJRTgo5bm9IVjhjaWd3VXRQSnNsSmowWXM2bERmTWpJcTJTUERxTy9uQnVkTU52YTBCa3Vxanp4K3pPQWR1VE5yUmxQCkJTZU9FNkZ1d2c9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QXRvcyBUcnVzdGVkUm9vdCAyMDExIE89QXRvcwojIFN1YmplY3Q6IENOPUF0b3MgVHJ1c3RlZFJvb3QgMjAxMSBPPUF0b3MKIyBMYWJlbDogIkF0b3MgVHJ1c3RlZFJvb3QgMjAxMSIKIyBTZXJpYWw6IDY2NDM4Nzc0OTc4MTMzMTY0MDIKIyBNRDUgRmluZ2VycHJpbnQ6IGFlOmI5OmM0OjMyOjRiOmFjOjdmOjVkOjY2OmNjOjc3Ojk0OmJiOjJhOjc3OjU2CiMgU0hBMSBGaW5nZXJwcmludDogMmI6YjE6ZjU6M2U6NTU6MGM6MWQ6YzU6ZjE6ZDQ6ZTY6Yjc6NmE6NDY6NGI6NTU6MDY6MDI6YWM6MjEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGYzOjU2OmJlOmEyOjQ0OmI3OmE5OjFlOmIzOjVkOjUzOmNhOjlhOmQ3Ojg2OjRhOmNlOjAxOjhlOjJkOjM1OmQ1OmY4OmY5OjZkOmRmOjY4OmE2OmY0OjFhOmE0Ojc0Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEZHpDQ0FsK2dBd0lCQWdJSVhEUExZaXhmc3pJd0RRWUpLb1pJaHZjTkFRRUxCUUF3UERFZU1Cd0dBMVVFCkF3d1ZRWFJ2Y3lCVWNuVnpkR1ZrVW05dmRDQXlNREV4TVEwd0N3WURWUVFLREFSQmRHOXpNUXN3Q1FZRFZRUUcKRXdKRVJUQWVGdzB4TVRBM01EY3hORFU0TXpCYUZ3MHpNREV5TXpFeU16VTVOVGxhTUR3eEhqQWNCZ05WQkFNTQpGVUYwYjNNZ1ZISjFjM1JsWkZKdmIzUWdNakF4TVRFTk1Bc0dBMVVFQ2d3RVFYUnZjekVMTUFrR0ExVUVCaE1DClJFVXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDVmhUdVhieW83TGp2UHB2TXAKTmI3UEdLdytxdG40VGFBK0drZTV2SnJmOHY3TVBrZm9lcGJDSkk0MTlLa00vSUw5YmNGeVlpZTk2bXZyNTRyTQpWRDZRVU0rQTFKWDc2TFdDMUJURnRxbFZKVmZic1ZEMnNHQmtXWHBwendPM2J3Mit5ajV2ZEhMcXFqQXFjMksrClNaRmh5QkgrRGdNcTkyb2czQUlWRFY0VmF2empnc0cxeFoxa0NXeWpXWmdISjhjYmxpdGhkSEZzUS9IM05Za1EKNEo3c1ZhRTNJcUtIQkFVc1IzMjBITGxpS1dZb3lyZmhrL1drbEFPWnVYQ0Z0ZVpJNm8xUS9ObmV6RzhIRHQwTApjcDJBTUJZSGxUOG9EdjNGZFU5VDFuU2F0Q1F1amdLUnozYkZteDVWZEp4NEliSHdMZkVMbjhMVmxoZ2Y4RlFpCmVvd0hBZ01CQUFHamZUQjdNQjBHQTFVZERnUVdCQlNucFFheExLWUpZTzdSbCtsd3JydzdHV3piSVRBUEJnTlYKSFJNQkFmOEVCVEFEQVFIL01COEdBMVVkSXdRWU1CYUFGS2VsQnJFc3BnbGc3dEdYNlhDdXZEc1piTnNoTUJnRwpBMVVkSUFRUk1BOHdEUVlMS3dZQkJBR3dMUU1FQVFFd0RnWURWUjBQQVFIL0JBUURBZ0dHTUEwR0NTcUdTSWIzCkRRRUJDd1VBQTRJQkFRQW1kelRibEVpR0trR2RMRDRHa0dERWpLd0xWTGdmdVh2VEJ6bmsrajU3c2oxTzdaOGoKdlpmemExenY3djFBcHQraGs2RUtocXp2SU5CNUFiMTQ5eG5ZSkRFMEJBR211aFdhd3lmYzJFOFB6QmhqLzVrUApEcEZyZFJiaElmellKc2RIdDZiUFdISnhmcnJoVFpWSE84bXZiYUcwd2V5SjlyUVBPTFhpWk53bHo2YmI2NXBjCm1hSEZDTjc5NXRyVjFscEZETVMzd3JVVTc3UVIvdzRWdGZYMTI4YTk2MXFuOEZZaXFUeGxWTVlWcUwyR25zMkQKbG1oNmNZR0o0UXZoNmhFYmFBak1hWjdzbmtHZVJESW1ldUtIQ25FOTYrUmFwTkxieGMzRzNtQi91Zk5QUkpMdgpLcmNZUHFjWjJRdDlzVGRCUXJDNllCM3kvZ2tSc1BDSGU2ZWQKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMyBPPVF1b1ZhZGlzIExpbWl0ZWQKIyBTdWJqZWN0OiBDTj1RdW9WYWRpcyBSb290IENBIDEgRzMgTz1RdW9WYWRpcyBMaW1pdGVkCiMgTGFiZWw6ICJRdW9WYWRpcyBSb290IENBIDEgRzMiCiMgU2VyaWFsOiA2ODcwNDk2NDk2MjY2NjkyNTA3MzYyNzEwMzc2MDY1NTQ2MjQwNzg3MjAwMzQxOTUKIyBNRDUgRmluZ2VycHJpbnQ6IGE0OmJjOjViOjNmOmZlOjM3OjlhOmZhOjY0OmYwOmUyOmZhOjA1OjNkOjBiOmFiCiMgU0hBMSBGaW5nZXJwcmludDogMWI6OGU6ZWE6NTc6OTY6Mjk6MWE6Yzk6Mzk6ZWE6Yjg6MGE6ODE6MWE6NzM6NzM6YzA6OTM6Nzk6NjcKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDhhOjg2OjZmOmQxOmIyOjc2OmI1OjdlOjU3OjhlOjkyOjFjOjY1OjgyOjhhOjJiOmVkOjU4OmU5OmYyOmYyOjg4OjA1OjQxOjM0OmI3OmYxOmY0OmJmOmM5OmNjOjc0Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGWURDQ0EwaWdBd0lCQWdJVWVGaGZMcTBzR1V2ak53YzFOQk1vdFpiVVpaTXdEUVlKS29aSWh2Y05BUUVMCkJRQXdTREVMTUFrR0ExVUVCaE1DUWsweEdUQVhCZ05WQkFvVEVGRjFiMVpoWkdseklFeHBiV2wwWldReEhqQWMKQmdOVkJBTVRGVkYxYjFaaFpHbHpJRkp2YjNRZ1EwRWdNU0JITXpBZUZ3MHhNakF4TVRJeE56STNORFJhRncwMApNakF4TVRJeE56STNORFJhTUVneEN6QUpCZ05WQkFZVEFrSk5NUmt3RndZRFZRUUtFeEJSZFc5V1lXUnBjeUJNCmFXMXBkR1ZrTVI0d0hBWURWUVFERXhWUmRXOVdZV1JwY3lCU2IyOTBJRU5CSURFZ1J6TXdnZ0lpTUEwR0NTcUcKU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ2d2bEFRanVueWJFQzBCSnlGdVRISzNDM2tFYWtFUEJ0Vgp3ZWRZTUIwa3RNUHZoZDZNTE9IQlBkK0M1ayt0UjRkczdGdEp3VXJWdTQvc2g2eC9ncHFHN0QwRG1WSUIwaldlCnJOcndVOGxtUE5Tc0FnSGFKTk03cUFKR3I2UWM0L2h6V0hhMzlnNlFEYlh3ejh6NitjWk01Y09HTUFxTkYzNDEKNjhYZnV3NmN3STJINDRnNGhXZjZQc2VyNEJPY0JSaVl6NVAxc1pLMC9DUFR6OVhFSjBuZ25qeWJDS09MWFNvaAo0UHc1cWxQYWZYN1BHZ2xUdkYwRkJNK2hTbytMZG9JTm9malN4eFIzVzVBMkI0R2JQZ2I2VWw1anhhWUEvcVhwClVodFN0Wkk1Y2dNSllyMndZQlp1cHQwbHdnTm0zZk1FMFVEaVRvdUc5Ry9sZzZBbmhGNEV3ZldRdlRBOXhPK28KYWJ3NG02U2tsdEZpMm1uQUFaYXV5OFJSTk9vTXF2OGhqbG1QU2x6a1lacW4wdWtxZUkxUlBUb1Y3cUpaanFsYwozc1g1a0NMbGlFVngzWkdaYkhxZlBUMllmRjcydmhab29GNnVDeVA4V2crcUluWXR5YUVRSGVUVFJDT1FpSi9HCkt1Ylg5WnF6V0I0dk1Ja0lHMVNpdFpnajdBaDNISlZkWWRITGlaeGZva3FSbXU4aHFra1dDS2k5WVNneHlYU3QKaGZiWnhiR0wwZVVRTWsxZml5QTZQRWtmTTRWWkRkdkxDWFZEYVhQN2EzRjk4Ti9FVEgzR295N0lsWG5MYzZLTwpUazBrKzE3a0JMNXlHNlluTFVsYW1YclhYQWtndDMrVXVVL3hEUnhlaUVJYkViZm5rZHVlYlBScTM0d0dtQU90CnpDanZwVWZ6VXdJREFRQUJvMEl3UURBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUIKQmpBZEJnTlZIUTRFRmdRVW81Zlc4MTZpRU9HclJaODhGMlE4N2dGd25Nd3dEUVlKS29aSWh2Y05BUUVMQlFBRApnZ0lCQUJqNlczWDhQbnJIWDNmSHl0L1BYOE1TeEVCZDFES3F1R3JYMVJVVlJwZ2pwZWFRV3hpWlRPT3RRcU9DCk1UYUl6ZW43eEFTV1NJc0J4NDBCejFzekJwWkdablFkVCszQnRybTBEV0hNWTM3WExuZU1saHdxSTJocmhWZDIKY0RNVC91RlBwaU4zR1BvYWpPaTlaY25QUC9USkY5enJ4N3pBQkM0dFJpOXBac01iai83c1B0UEtsTDkyQ2lVTgpxWHNDSEtuUU8xOEx3SUU2UFdUaHY2Y3RUcjFOeE5ncHhpSVkwTVdzY2dLQ1A2bzZvam9pbHpIZENHUERkUlM1CllDZ3RXMmpnRnFsbWdpTlI5ZXRUMkRHYmUrbTNuVXZyaUJiUCtWMDRpa2t3aiszeDZ4bjBkeG94R0UxblZHd3YKYjJYNTJ6M3NJZXhlOVBTTHltQmxWTkZ4WlBUNXBxT0JNell6Y2ZDa2VGOU9yWU1oM2pSSmplaFpySjN5ZGxvMgo4aFAwcitBSngyRXFiUGZnbmE2N2hrb29ieTd1dEhuTmtEUERzM2I2OWZCc25RR1ErcDZROXB4eXowZmF3eC9rCk5TQlQ4bFRSMzJHRHBnTGlKVGplaFRJdFhuT1FVbDFDeE00OVMrSDVHWVFkMWFKUXpFSDdRUlREdmRiSldxTmoKWmdLQXZRVTZPMGVjN0FBbVRQV0lVYitvSTM4WUI3QUw3WXNtb1dUVFlVcnJYSi9lczY5bkE3TWYzVzFkYVdocApxMTQ2N0h4cHZNYzdoVTZlRmJtMEZVL0RsWHBZMThsczZXeTU4eWxqWHJRczhDMDk3VnBsNEtsYlFNSkltWUZ0Cm5oOEdLandTdElzUG02SWs4S2FOMW5yZ1M3WmtsbU9WaE1KS3pSd3VKSWN6WU9YRAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049UXVvVmFkaXMgUm9vdCBDQSAyIEczIE89UXVvVmFkaXMgTGltaXRlZAojIFN1YmplY3Q6IENOPVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMyBPPVF1b1ZhZGlzIExpbWl0ZWQKIyBMYWJlbDogIlF1b1ZhZGlzIFJvb3QgQ0EgMiBHMyIKIyBTZXJpYWw6IDM5MDE1NjA3OTQ1ODk1OTI1NzQ0NjEzMzE2OTI2NjA3OTk2MjAyNjgyNDcyNTgwMAojIE1ENSBGaW5nZXJwcmludDogYWY6MGM6ODY6NmU6YmY6NDA6MmQ6N2Y6MGI6M2U6MTI6NTA6YmE6MTI6M2Q6MDYKIyBTSEExIEZpbmdlcnByaW50OiAwOTozYzo2MTpmMzo4Yjo4YjpkYzo3ZDo1NTpkZjo3NTozODowMjowNTowMDplMToyNTpmNTpjODozNgojIFNIQTI1NiBGaW5nZXJwcmludDogOGY6ZTQ6ZmI6MGE6Zjk6M2E6NGQ6MGQ6Njc6ZGI6MGI6ZWI6YjI6M2U6Mzc6Yzc6MWI6ZjM6MjU6ZGM6YmM6ZGQ6MjQ6MGU6YTA6NGQ6YWY6NTg6YjQ6N2U6MTg6NDAKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZZRENDQTBpZ0F3SUJBZ0lVUkZjMEpGdUJpWnMxOHM2NEt6dGJweWJ3ZFNnd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1NERUxNQWtHQTFVRUJoTUNRazB4R1RBWEJnTlZCQW9URUZGMWIxWmhaR2x6SUV4cGJXbDBaV1F4SGpBYwpCZ05WQkFNVEZWRjFiMVpoWkdseklGSnZiM1FnUTBFZ01pQkhNekFlRncweE1qQXhNVEl4T0RVNU16SmFGdzAwCk1qQXhNVEl4T0RVNU16SmFNRWd4Q3pBSkJnTlZCQVlUQWtKTk1Sa3dGd1lEVlFRS0V4QlJkVzlXWVdScGN5Qk0KYVcxcGRHVmtNUjR3SEFZRFZRUURFeFZSZFc5V1lXUnBjeUJTYjI5MElFTkJJRElnUnpNd2dnSWlNQTBHQ1NxRwpTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDaHJpV3lBUmpjVjRnL1J1djVyK0xySTNIaW10RmhaaUZmCnFxOG5VZVZ1R3hiVUxYMVFzRk4zdlhnNllPSmtBcHQ4aHB2V0dvNnQveDhWZjlXVkhoTEw1aFNFQk1IZk5yTVcKbjRyanlkdVlOTTdZTXhjb1J2eW55ZkRTdE5WTkNYSkorZktINDZuYWZhRjlhN0k2SmFsdFVrU3MrTDV1Kzl5bQpjNUdRWWFZREZDRHk1NGVqaUsydG9Jei9wZ3NsVWlYbkZnSFZ5N2cxZ1F5ak8vRGg0ZnhhWGM2QWNXMzRTYXMrCk83cTQxNEFCKzZYclc3UEZYbUFxTWFDdk4rZ2dPcCtvTWl3TXpBa2QwNTZPWGJ4TW1PN0ZHbWg3N0ZPbTZSUTEKbzkvTmdKOE1TUHNjOVBHL1NyajYxWXh4U3NjZnJmNUJtck9EWGZLRVZ1K2xWMFBPS2EyTXExVy94UHRiQWQwagpJYUZZQUk3RDBHb1Q3UlBqRWl1QTNHZm1sYkxOSGlKdUt2aEIxUExLRkFlTmlsVVN4bW4xdUlab0wxTmVzTktxCkljR1k1akRqWjFYSG0yNnNHYWhWcGtVRzBDTTYyK3RsWFNvUkVmQTdUOHB0OURURWNlVC9BRnIyWEs0allJVnoKOGVRUXNTV3UxWks3RThFTTREbmF0RGxYdGFzMXFuSWhPNE0xNXpIZmVpRnV1RElJZlIweWtSVktZbkxQNDNlaAp2TlVSRzNZQlp3amdRUXZENnhWdStLUVoyYUtycitJblVsWXJBb29zRkNUNXYwSUN2eWJJeG8vZ2JqaDlVeTNsCjdaaXpsV05vZi9rMTlOK0l4V0Exa3NCOGFSeGhsUmJRNjk0THJ6NEVFRVZsV0ZBNHIwanlXYllXOGp3TmtBTEcKY0M0QnJUd1Yxd0lEQVFBQm8wSXdRREFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQgpCakFkQmdOVkhRNEVGZ1FVN2VkdmRscS9ZT3hKVzhhbGQ3dHlGbkdieEQwd0RRWUpLb1pJaHZjTkFRRUxCUUFECmdnSUJBSkhmZ0Q5RENYNXh3dmZyczRpUDRWR3l2RDExK1NoZHlMeVptM3RkcXVYSzRRcjM2TExUbjkxbk1YNjYKQWFySGFrRTdrTlFJWExKZ2FwRHd5TTREWXZtTDdmdHVLdHdHVFR3cEQ0a1dpbGhNU0Evb2hHSHFQSEttZCtSQwpyb2lqUTFoNWZxN0twVk1OcVQxd3ZTQVpZYVJzT1B4RE11SEJSLy80N1BFUklqS1duTUwyVzJtV2V5QU1RMEdhClcvWlpHWWplVllnM1VRdDRYQW9lbzBMOXg1MklEOER5ZUFJa1ZKT3ZpWWVJeVVxQUhlclFiajVoTGphN05RNG4KbHYxbU5EdGhjblB4Rmx4SEJsUkpBSHBZRXJBSzc0WDlzYmd6ZFdxVEhCTG1ZRjV2SFgvSkh5UExoR0dmSG9KRQorVit0WWxVa21sS1k3Vkhub1g2WE91WXZIeEhhVTRBc2haNnJOUkRiSWw5cXhWNlhVL0l5QWdrd28xandEUUhWCmNzYXhmR2w3dy9VMlJjeGhibDVNbE1WZXJ1Z09Yb3UvOTgzZzdhRU9HelB1VkJqK0Q3N3Zmb1JyUStOd21OdGQKZGJJTldRZUZGU001MXZIZnFTWVAxa2pIczZZaTlUTTNXcFZIbjN1NkdCVnYvOVlVWklOSjBncG5JZHNQTldOZwpLQ0xqc1pXRHpZV20zUzhQNTJkU2Jyc3ZoWHoxU25QbnhUN0F2U0VTQlQvOHR3TkpBbHZJSmViaVZEajFlWWVNCkhWT3lUb1Y3QmpqSExQajRzSEtOSmVWM1V2UURIRWltVUYrSUlEQnU4b0pEcXoyWGhPZFQreUhCVHc4aW1vYTQKV1NyMlJ6MFppQzNvaGVHZTdJVUlhckZzTk1rZDdFZ3JPM2p0WnNTT2VXbUQzbitNCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1RdW9WYWRpcyBSb290IENBIDMgRzMgTz1RdW9WYWRpcyBMaW1pdGVkCiMgU3ViamVjdDogQ049UXVvVmFkaXMgUm9vdCBDQSAzIEczIE89UXVvVmFkaXMgTGltaXRlZAojIExhYmVsOiAiUXVvVmFkaXMgUm9vdCBDQSAzIEczIgojIFNlcmlhbDogMjY4MDkwNzYxMTcwNDYxNDYyNDYzOTk1OTUyMTU3MzI3MjQyMTM3MDg5MjM5NTgxCiMgTUQ1IEZpbmdlcnByaW50OiBkZjo3ZDpiOTphZDo1NDo2Zjo2ODphMTpkZjo4OTo1NzowMzo5Nzo0MzpiMDpkNwojIFNIQTEgRmluZ2VycHJpbnQ6IDQ4OjEyOmJkOjkyOjNjOmE4OmM0OjM5OjA2OmU3OjMwOjZkOjI3Ojk2OmU2OmE0OmNmOjIyOjJlOjdkCiMgU0hBMjU2IEZpbmdlcnByaW50OiA4ODplZjo4MTpkZToyMDoyZTpiMDoxODo0NToyZTo0MzpmODo2NDo3Mjo1YzplYTo1ZjpiZDoxZjpjMjpkOTpkMjowNTo3MzowNzowOTpjNTpkODpiODo2OTowZjo0NgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRllEQ0NBMGlnQXdJQkFnSVVMdldiQWlpbjIzci8xYU9wN3IwRG9NOFNhaDB3RFFZSktvWklodmNOQVFFTApCUUF3U0RFTE1Ba0dBMVVFQmhNQ1FrMHhHVEFYQmdOVkJBb1RFRkYxYjFaaFpHbHpJRXhwYldsMFpXUXhIakFjCkJnTlZCQU1URlZGMWIxWmhaR2x6SUZKdmIzUWdRMEVnTXlCSE16QWVGdzB4TWpBeE1USXlNREkyTXpKYUZ3MDAKTWpBeE1USXlNREkyTXpKYU1FZ3hDekFKQmdOVkJBWVRBa0pOTVJrd0Z3WURWUVFLRXhCUmRXOVdZV1JwY3lCTQphVzFwZEdWa01SNHdIQVlEVlFRREV4VlJkVzlXWVdScGN5QlNiMjkwSUVOQklETWdSek13Z2dJaU1BMEdDU3FHClNJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUN6eXc0UVo0N3FGSmVuTWlvS1ZqWi9hRXpIczI4Nkl4U1IKL3hsL3BjcXM3ck4yblhycGl4dXJhekhiK2d0VFRLL0ZwUnA1UElwTS82emZKZDVPMllJeUMwVGV5dHVNcktOdQpGb003cG1STE1vbjdGaFk0ZnV0RDR0TjBTc0ppQ25NSzNVbXpWOUt3Q29XZGNUemVvOHZBTXZNQk9TQkRHelhSClU3T3g3c1dUYVlJK0ZyVW9ScUhlNm9rSjdVTzRCVWFLaHZWWlI3NGJid0VoRUxuOXFkSW95aEE1Q2NvVE5zK2MKcmExQWRIa3JBajgwLy9vZ2FYM1Q3bUgxdXJQbk1OQTNJNFp5WVVVcFNGbG9iM2VtTG9HK0IwMXZyODdFUlJPUgpGSEFHangrZitJZHBzUTd2dzRrWjYrb2NZZng2YklyYzFnTUxuaWE2RXQzVVZEbXJKcU16Nm5XQjJpM05EMC9rCkE5SHZGWmNiYTVERkFwQ1RaZ0loc1VmZWk1cEtnTGxWajdXaUw4RFdNMmZhZnNTbnRBUkU2MGY3NWxpNTl3encKZXl1eHdIQXB3MEJpTFR0SWFkd2pQRWpyZXdsNXFXM2FxRENZejRCeUE0aW1XMGF1Y25sOENBTWhaYTYzNFJ5bApzU3FpTWQ1bUJQZkFkT2h4M3Y4OVdjeVdKaEtMaFpWWEdxdHJkUXRFUFJFb1BIdGh0K0tQWjAvbDdEeE1ZSUJwClZ6Z2VBVnVOVmVqSDM4RE1keU0wU1hWODlwZ1I2eTNlN1VFdUZBVUNmK0QrSU9zMTV4R3NJczVYUGQ3Sk1HMFEKQTRYTjhmK01GclhCc2o2SWJHQi9rRStWOS9ZdHJRRTVCd1Q2ZFlCOXYwbFE3ZS9KeEh3YzY0QisyN2JRM1JQKwp5ZE9jMTdLWHFRSURBUUFCbzBJd1FEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCCkJqQWRCZ05WSFE0RUZnUVV4aGZRdktqcUFrUHlHd2FaWFN1UUlMblhuT1F3RFFZSktvWklodmNOQVFFTEJRQUQKZ2dJQkFEUmgyVmExRW9kVlRkMmpOVEZHdTZRSGNyeGZZV0xvcGZzTE43RTh0clA2S1oxL0F2V2t5YWlUdDNweApLR21QYytGU2tOclZ2anJsdDNacVZvQWgzMTNtNlRxZTVUNzJvbW5IS2dxd0dFZmNJSEI5VXFNK1dYekJ1c25JCkZVQmh5bkxXY0t6U3QvQWM1SVlwOE03dmFHUFF0U0NLRldHYWZvYVl0TW5DZHZ2TXVqQVd6S05oeG5RVDVXdnYKb3hYcUEvNFRpMlRrMDhIUzZJVDdTZEVRVFhsbTY2cjk5STB4SG5BVXJkemVaeE5NZ1JWaHZMZlprWGR4R1lGZwp1L0JZcGJXY0MvZVBJbFVud0VzQmJUdVpEZFFkbTJObkw5RHVEY3BtdkpSUHBxM3QvTzVqckZjL1pTWFBzb2FQCjBBai91SFlVYnQ3bEoreXJlTFZUdWJZLzZDRDUwcWkrWVViS2g0eUU4L254b0dpYkloNkJKcHNRQkpGeHdBWWYKM0tEVHVWYW40NWd0ZjRPZDM0d3JuREtPTXBUd0FUd2lLcDlEd2k3RG1Ea0hPSHY4WGdCQ0gvTXlKbm1EaFBibAo4TUZSRXNBTEhnUWpERlNsVEM5SnhVclJ0bTVnRFd2OGE0dUZKR1MzaVE2ckpVZGJQTTkrU2IzSDZRckcydmQrCkRoY0kwMGlYMEhHUzhBODVQalJxSEgzWThpS3V1Mm4wTTdTbVNGWFJEdzRtNk95MkN5Mm5oVFhOL1ZuSW45SE4KUGxvcE5MazloTTZ4WmRSWmtaRldkU0hCZDU3NWV1RmduZE90QkJqMGZPdGVrNDlUU2lJcCtFZ3JQazJHckZ0Lwp5d2FaV1dEWVdHV1ZqVVRSOTM5K0ozOTlyb0QxQjB5MlBweHhWSmtFUy8xWStaajAKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPURpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBHMiBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgU3ViamVjdDogQ049RGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IEcyIE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBMYWJlbDogIkRpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBHMiIKIyBTZXJpYWw6IDE1Mzg1MzQ4MTYwODQwMjEzOTM4NjQzMDMzNjIwODk0OTA1NDE5CiMgTUQ1IEZpbmdlcnByaW50OiA5MjozODpiOTpmODo2MzoyNDo4Mjo2NToyYzo1NzozMzplNjpmZTo4MTo4Zjo5ZAojIFNIQTEgRmluZ2VycHJpbnQ6IGExOjRiOjQ4OmQ5OjQzOmVlOjBhOjBlOjQwOjkwOjRmOjNjOmUwOmE0OmMwOjkxOjkzOjUxOjVkOjNmCiMgU0hBMjU2IEZpbmdlcnByaW50OiA3ZDowNTplYjpiNjo4MjozMzo5Zjo4Yzo5NDo1MTplZTowOTo0ZTplYjpmZTpmYTo3OTo1MzphMToxNDplZDpiMjpmNDo0OTo0OTo0NToyZjphYjo3ZDoyZjpjMTo4NQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRGxqQ0NBbjZnQXdJQkFnSVFDNU1jT3RZNVorcG5JNy9EcjVyMFN6QU5CZ2txaGtpRzl3MEJBUXNGQURCbApNUXN3Q1FZRFZRUUdFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzCmQzY3VaR2xuYVdObGNuUXVZMjl0TVNRd0lnWURWUVFERXh0RWFXZHBRMlZ5ZENCQmMzTjFjbVZrSUVsRUlGSnYKYjNRZ1J6SXdIaGNOTVRNd09EQXhNVEl3TURBd1doY05Nemd3TVRFMU1USXdNREF3V2pCbE1Rc3dDUVlEVlFRRwpFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzZDNjdVpHbG5hV05sCmNuUXVZMjl0TVNRd0lnWURWUVFERXh0RWFXZHBRMlZ5ZENCQmMzTjFjbVZrSUVsRUlGSnZiM1FnUnpJd2dnRWkKTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFEWjV5Z3ZVajgyY2ttSWt6VHorR29lTVZTQQpuNjFVUWJWSDM1YW8xSytBTGJrS3ozWDlpYVY5SlByaklnd3J2SlVYQ3pPL0dVMUJCcEFBdlF4TkVQNEh0ZWNjCmJpSlZNV1dYdmRNWDBoNWk4OXZxYkZDTVA0UU1scyszeXdQZ3ltMmhGRXdiaWQzdEFMQlNmSytSYkxFNEU5SHAKRWdqQUFMQWNLeEhhZDNBMm02N09lWWZjZ25EbUNYUndWV212bzJpZnY5MjJlYlB5blhBcFZmU3IvNVZoODhsQQpieDNSdnBPNzA0Z3F1NTIvY2xwV2NUcy8xUFBSQ3Y0bzc2UHUyWm12QTlPUFlMZnlrcUd4dlltSkh6RE53Nll1CllqT3VGZ0ozUkZybmdRbzhwMFF1ZWJnL0JMeGNvSWZoRzY5UmpzM3NMUHI0L20zd09ueXFpK1JubFRHTkFnTUIKQUFHalFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdHR01CMEdBMVVkRGdRVwpCQlRPdzBxNW1WWHl1TnRndjZsK3ZWYTFsemFuMWpBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQXlxVlZqT1BJClFXNXBKNmQxRWU4OGhqWnYwcDNHZURnZGFaYWlrbWt1T0d5YmZRVFVpYVd4TVRlS3lTSE1xMnpOaXh5YTFyOUkKMGpKbXdZckE4eTg2NzhEajFKR0cwVkRqQTl0emQyOUtPVlB0M2liSHRYMnZLMExSZFdMalNpc0N4MUJMNEduaQpsbXdPUkdZUVJJK3RCZXY0ZWF5bUcrZzNOSjFUeVdHcW9sS3ZTbkFXaHNJNnlMRVRjRGJZeis3MENqVFZXMHo5CkI1eWl1dGtCY2x6elRjSGREckVjRGNSanZxMzBGUHVKN0tKQkRrek15RmRBMEc0RHFzME1qb21abVd6d1BEQ3YKT045dnZLTytLU0FucTNUL0V5SjQzcGRTVlI2RHRWUWdBKzZ1d0U5VzNqZk13MytxQkNlNzAzZTRZdHNYZkp3bwpJaE56Yk04bTlZb3A1dz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1EaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIFN1YmplY3Q6IENOPURpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBHMyBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgTGFiZWw6ICJEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMiCiMgU2VyaWFsOiAxNTQ1OTMxMjk4MTAwODU1MzczMTkyODM4NDk1MzEzNTQyNjc5NgojIE1ENSBGaW5nZXJwcmludDogN2M6N2Y6NjU6MzE6MGM6ODE6ZGY6OGQ6YmE6M2U6OTk6ZTI6NWM6YWQ6NmU6ZmIKIyBTSEExIEZpbmdlcnByaW50OiBmNToxNzphMjo0Zjo5YTo0ODpjNjpjOTpmODphMjowMDoyNjo5ZjpkYzowZjo0ODoyYzphYjozMDo4OQojIFNIQTI1NiBGaW5nZXJwcmludDogN2U6Mzc6Y2I6OGI6NGM6NDc6MDk6MGM6YWI6MzY6NTU6MWI6YTY6ZjQ6NWQ6Yjg6NDA6Njg6MGY6YmE6MTY6NmE6OTU6MmQ6YjE6MDA6NzE6N2Y6NDM6MDU6M2Y6YzIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNSakNDQWMyZ0F3SUJBZ0lRQzZGYStoM2ZvTFZKUksvTkpLQnM3REFLQmdncWhrak9QUVFEQXpCbE1Rc3cKQ1FZRFZRUUdFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzZDNjdQpaR2xuYVdObGNuUXVZMjl0TVNRd0lnWURWUVFERXh0RWFXZHBRMlZ5ZENCQmMzTjFjbVZrSUVsRUlGSnZiM1FnClJ6TXdIaGNOTVRNd09EQXhNVEl3TURBd1doY05Nemd3TVRFMU1USXdNREF3V2pCbE1Rc3dDUVlEVlFRR0V3SlYKVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzZDNjdVpHbG5hV05sY25RdQpZMjl0TVNRd0lnWURWUVFERXh0RWFXZHBRMlZ5ZENCQmMzTjFjbVZrSUVsRUlGSnZiM1FnUnpNd2RqQVFCZ2NxCmhrak9QUUlCQmdVcmdRUUFJZ05pQUFRWjU3eXNSR1h0emJnL1dQdU5zVmVwUkMwRkZmTHZDLzhRZEorMVlsSmYKWm40ZjVkd2JSWGtMek1aVENwMk5YUUxacVZuZUFscjJsU29PalRoS2lrbkd2TVlET0FkZlZkcCtDVzdpZjE3UQpSU0FQV1hZUTFxQWs4QzNlTnZKc0tUbWpRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvCkJBUURBZ0dHTUIwR0ExVWREZ1FXQkJUTDBMMnA0WmdGVWFGTk42S0RlYzZOSFNya2hEQUtCZ2dxaGtqT1BRUUQKQXdObkFEQmtBakFscElGRkFtc1NTM1YwVDhnajQzRHlkWExlZklud3o1RnlZWjVlRUpKWlZybUR4eERuT09sWQpKalo5MWVRMGhqa0NNSHcyVS9BdzVXSmpPcG5pdHFNN216VDZIdG9Ra25GZWtST24zYVJ1a3N3eTF2VWhac2N2CjZwWmphbVZGa3BVQnRBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPURpZ2lDZXJ0IEdsb2JhbCBSb290IEcyIE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBTdWJqZWN0OiBDTj1EaWdpQ2VydCBHbG9iYWwgUm9vdCBHMiBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgTGFiZWw6ICJEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMiIKIyBTZXJpYWw6IDQyOTM3NDM1NDAwNDY5NzUzNzg1MzQ4Nzk1MDMyMDIyNTM1NDEKIyBNRDUgRmluZ2VycHJpbnQ6IGU0OmE2OjhhOmM4OjU0OmFjOjUyOjQyOjQ2OjBhOmZkOjcyOjQ4OjFiOjJhOjQ0CiMgU0hBMSBGaW5nZXJwcmludDogZGY6M2M6MjQ6Zjk6YmY6ZDY6NjY6NzY6MWI6MjY6ODA6NzM6ZmU6MDY6ZDE6Y2M6OGQ6NGY6ODI6YTQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGNiOjNjOmNiOmI3OjYwOjMxOmU1OmUwOjEzOjhmOjhkOmQzOjlhOjIzOmY5OmRlOjQ3OmZmOmMzOjVlOjQzOmMxOjE0OjRjOmVhOjI3OmQ0OjZhOjVhOmIxOmNiOjVmCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEampDQ0FuYWdBd0lCQWdJUUF6cng1cWNScWFDN0tHU3hIUW42NVRBTkJna3Foa2lHOXcwQkFRc0ZBREJoCk1Rc3dDUVlEVlFRR0V3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjMKZDNjdVpHbG5hV05sY25RdVkyOXRNU0F3SGdZRFZRUURFeGRFYVdkcFEyVnlkQ0JIYkc5aVlXd2dVbTl2ZENCSApNakFlRncweE16QTRNREV4TWpBd01EQmFGdzB6T0RBeE1UVXhNakF3TURCYU1HRXhDekFKQmdOVkJBWVRBbFZUCk1SVXdFd1lEVlFRS0V3eEVhV2RwUTJWeWRDQkpibU14R1RBWEJnTlZCQXNURUhkM2R5NWthV2RwWTJWeWRDNWoKYjIweElEQWVCZ05WQkFNVEYwUnBaMmxEWlhKMElFZHNiMkpoYkNCU2IyOTBJRWN5TUlJQklqQU5CZ2txaGtpRwo5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBdXpmTk5OeDdhOG15YUpDdFNuWC9Scm9oQ2dpTjlSbFV5ZnVJCjIvT3U4anFKa1R4NjVxc0dHbXZQckMzb1hna2tSTHBpbW43V282aCs0RlIxSUFXc1VMZWNZeHBzTU56YUh4bXgKMXg3ZS9kZmd5NVNETjY3c0gwTk8zWHNzMHIwdXBTL2txYml0T3RTWnBMWWw2WnRyQUdDU1lQOVBJVWtZOTJlUQpxMkVHbkkveXV1bTA2Wkl5YTdYelYraGRHODJNSGF1VkJKVko4elV0bHVOSmJkMTM0L3RKUzdTc1ZRZXBqNVd6CnRDTzdURzFGOFBhcHNwVXd0UDFNVll3blNsY1VmSUtkelhPUzB4WktCZ3lNVU5HUEhnbStGNkhtSWNyOWcrVVEKdklPbENzUm5LUFp6RkJROVJuYkRoeFNKSVRSTnJ3OUZES1pKb2JxN25NV3hNNE1waFFJREFRQUJvMEl3UURBUApCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCaGpBZEJnTlZIUTRFRmdRVVRpSlVJQmlWCjV1TnU1Zy82K3JrUzdRWVhqemt3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUdCbktKUnZEa2hqNnpIZDZtY1kKMVlsOVBNV0xTbi9wdnRzckY5K3dYM04zS2pJVE9ZRm5Rb1FqOGtWbk5leUl2L2lQc0dFTU5LU3VJRXlFeHR2NApOZUYyMmQrbVFydkhSQWlHZnpaMEpGcmFiQTBVV1RXOThrbmR0aC9Kc3cxSEtqMlpMN3RjdTdYVUlPR1pYMU5HCkZkdG9tL0R6TU5VK01lS05oSjdqaXRyYWxqNDFFNlZmOFBsd1VIQkhRUkZYR1U3QWo2NEd4SlVURnk4YkpaOTEKOHJHT21hRnZFN0ZCY2Y2SUtzaFBFQ0JWMS9NVVJlWGdSUFRxaDVVeWt3NytVMGI2TEozL2l5SzVTOWtKUmFUZQpwTGlhV04wYmZWS2ZqbGxEaUlHa25pYlZiNjNkRGNZM2ZlMERraHZsZDE5MjdqeU54RjFXVzZMWlptNnpOVGZsCk1yWT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPURpZ2lDZXJ0IEdsb2JhbCBSb290IEczIE89RGlnaUNlcnQgSW5jIE9VPXd3dy5kaWdpY2VydC5jb20KIyBTdWJqZWN0OiBDTj1EaWdpQ2VydCBHbG9iYWwgUm9vdCBHMyBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgTGFiZWw6ICJEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMyIKIyBTZXJpYWw6IDcwODkyNDQ0NjkwMzAyOTMyOTE3NjAwODMzMzM4ODQzNjQxNDYKIyBNRDUgRmluZ2VycHJpbnQ6IGY1OjVkOmE0OjUwOmE1OmZiOjI4OjdlOjFlOjBmOjBkOmNjOjk2OjU3OjU2OmNhCiMgU0hBMSBGaW5nZXJwcmludDogN2U6MDQ6ZGU6ODk6NmE6M2U6NjY6NmQ6MDA6ZTY6ODc6ZDM6M2Y6ZmE6ZDk6M2I6ZTg6M2Q6MzQ6OWUKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDMxOmFkOjY2OjQ4OmY4OjEwOjQxOjM4OmM3OjM4OmYzOjllOmE0OjMyOjAxOjMzOjM5OjNlOjNhOjE4OmNjOjAyOjI5OjZlOmY5OjdjOjJhOmM5OmVmOjY3OjMxOmQwCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDUHpDQ0FjV2dBd0lCQWdJUUJWVld2UEplcERVMXc2UVAxYXRGY2pBS0JnZ3Foa2pPUFFRREF6QmhNUXN3CkNRWURWUVFHRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCM2QzY3UKWkdsbmFXTmxjblF1WTI5dE1TQXdIZ1lEVlFRREV4ZEVhV2RwUTJWeWRDQkhiRzlpWVd3Z1VtOXZkQ0JITXpBZQpGdzB4TXpBNE1ERXhNakF3TURCYUZ3MHpPREF4TVRVeE1qQXdNREJhTUdFeEN6QUpCZ05WQkFZVEFsVlRNUlV3CkV3WURWUVFLRXd4RWFXZHBRMlZ5ZENCSmJtTXhHVEFYQmdOVkJBc1RFSGQzZHk1a2FXZHBZMlZ5ZEM1amIyMHgKSURBZUJnTlZCQU1URjBScFoybERaWEowSUVkc2IySmhiQ0JTYjI5MElFY3pNSFl3RUFZSEtvWkl6ajBDQVFZRgpLNEVFQUNJRFlnQUUzYWZadTRxNEMvc0xmeUhTOEw2K2MvTXpYUnE4Tk9yZXhwdTgwSlgyOE16UUM3cGhXMUZHCmZwNHRuKzZPWXd3WDdBZHc5YytFTGtDRG5PZy9RVzA3cmRPa0ZGazJlSjBEUSs0UUUyeHkzcTZJcDZGcnRVUE8KWjl3ai93TWNvK0krbzBJd1FEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCaGpBZApCZ05WSFE0RUZnUVVzOXRJcFBtaHhkaXVOa0hNRVdOcFlpbThTOFl3Q2dZSUtvWkl6ajBFQXdNRGFBQXdaUUl4CkFLMjg4bXcvRWtyUkxUbkRDZ21YYy9TSU5veUlKN3ZtaUkxUWhhZGorWjR5M21hVEQvSE1zUW1QM1d5cittdC8Kb0FJd09XWmJ3bVNOdUo1UTNLalZTYUx0eDl6UlNYOFhBYmpJaG85T2pJZ3JxSnFwaXNYUkFMMzRWT0thNVZ0OApzeWNYCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1EaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQgTz1EaWdpQ2VydCBJbmMgT1U9d3d3LmRpZ2ljZXJ0LmNvbQojIFN1YmplY3Q6IENOPURpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNCBPPURpZ2lDZXJ0IEluYyBPVT13d3cuZGlnaWNlcnQuY29tCiMgTGFiZWw6ICJEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQiCiMgU2VyaWFsOiA3NDUxNTAwNTU4OTc3MzcwNzc3OTMwMDg0ODY5MDE2NjE0MjM2CiMgTUQ1IEZpbmdlcnByaW50OiA3ODpmMjpmYzphYTo2MDoxZjoyZjpiNDplYjpjOTozNzpiYTo1MzoyZTo3NTo0OQojIFNIQTEgRmluZ2VycHJpbnQ6IGRkOmZiOjE2OmNkOjQ5OjMxOmM5OjczOmEyOjAzOjdkOjNmOmM4OjNhOjRkOjdkOjc3OjVkOjA1OmU0CiMgU0hBMjU2IEZpbmdlcnByaW50OiA1NToyZjo3YjpkYzpmMTphNzphZjo5ZTo2YzplNjo3MjowMTo3Zjo0ZjoxMjphYjpmNzo3Mjo0MDpjNzo4ZTo3NjoxYTpjMjowMzpkMTpkOTpkMjowYTpjODo5OTo4OAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmtEQ0NBM2lnQXdJQkFnSVFCWnNiVjU2T0lUTGlPUWU5cDNkMVhEQU5CZ2txaGtpRzl3MEJBUXdGQURCaQpNUXN3Q1FZRFZRUUdFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzCmQzY3VaR2xuYVdObGNuUXVZMjl0TVNFd0h3WURWUVFERXhoRWFXZHBRMlZ5ZENCVWNuVnpkR1ZrSUZKdmIzUWcKUnpRd0hoY05NVE13T0RBeE1USXdNREF3V2hjTk16Z3dNVEUxTVRJd01EQXdXakJpTVFzd0NRWURWUVFHRXdKVgpVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjNkM2N1WkdsbmFXTmxjblF1ClkyOXRNU0V3SHdZRFZRUURFeGhFYVdkcFEyVnlkQ0JVY25WemRHVmtJRkp2YjNRZ1J6UXdnZ0lpTUEwR0NTcUcKU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQy81cEJ6YU42NzVGMUtQREFpTUdrejdNS25KUzdKSVQzeQppdGhad3VFcHB6MVlxM2FhemE1N0c0UU54REFmOHh1a09CYnJWc2FYYlIycnNubnl5aEhTNUYvV0JUeFNEMUlmCnhwNFZwWDYrbjZsWEZsbFZjcTlvazNEQ3NycDFtV3B6TXBUUkVFUVFMdCtDOHdlRTVuUTdiWEhpTFF3YjdpRFYKeVNBZFl5a3R6dXhlVHNpVCtDRmhtelRyQmNaZTdGc2F2T3ZKejgyc05FQmZzWHBtN25mSVNLaG1WMWVmVkZpTwpEQ3UzVDZjdzJWYnV5bnRkNDYzSlQxN2xOZWN4eTlxVFh0eU9qNERhdHBHWVFKQjV3M2pIdHJIRXRXb1lPQU1RCmpkalVONlF1QlgySTlZSStFSkZ3cTFXQ1FUTFgyd1J6S202UkFYd2hUTlM4cmhzRGRWMTRadGs2TVVTYU0wQy8KQ05kYVNhVEM1cW1nWjkya0o3eWhUem0xRVZnWDl5UmNSbzlrOThGcGlIYVlkajFaWFVKMmg0bVhhWHBJOE9DaQpFaHRtbW5USzNrc2U1dzVqcnViVTc1S1NPcDQ5M0FEa1JTV0p0cHBFR1N0K3dKUzAwbUZ0NnpQWnhkOUxCQURNCmZSeVZ3NC8zSWJLeUViZTdmL0xWakhBc1FXQ3FzV01ZUkpVYWRtSis5b0N3Kytoa3BqUFJpUWZodmJmbVE2UVkKdUtaM0FlRVBsQXdoSGJKVUtTV0piT1VPVWxGSGRMNG1yTFpCZGQ1NnJGK05QOG04MDBFUkVsdmxFRkRyTWNYSwpjaFlpQ2Q5OFRIVS9ZK3doWDhRZ1VXdHZzYXVHaTAvQzFrVmZuU0Q4b1I3RndJK2lzWDRLSnBuMTVHa3ZtQjB0CjlkbXBzaDNsR3dJREFRQUJvMEl3UURBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUIKaGpBZEJnTlZIUTRFRmdRVTdOZmpndEp4WFdSTTN5NW5QK2U2bUs0Y0QwOHdEUVlKS29aSWh2Y05BUUVNQlFBRApnZ0lCQUx0aDJYMnBiTDRYeEpFYnc2R2lBSTNqWkdnUFZzOTNybkQ1L1pwS21ibkplRndNREYvazVoUXBWZ3MyClNWMUVZK0N0bkpZWVpoc2pEVDE1NlcxcjFsVDQwanpCUTBDdUhWRDFVdnlRTzd1WW1XbHJ4OEducUdpa0o5eWQKK1NldU1JVzU5bWROT2o2UFdUa2lVMFRyeUYwRHl1MVFlbjFpSVFxQXlITm0wYUFGWUYvb3BiU25yNmozYlRXYwpmRnFLMXFJNG1mTjRpL1JOMGlBTDNnVHVqSnRIZ1hJTndCUXk3ekJaTHE3Z2NmSlc1R3FYYjVKUWJaYU5hSHFhCnNqWVVlZ2J5SkxrSkVWRFhDTEc0aVhxRUkyRkNLZVdqemFJZ1FkZlJuR1RaNmlhaGl4VFhUQm15VUVGeFBUOU4KY0NPR0RFcmNnZExNTXBTRURRZ0pseHhQd081cklIUXcwdUE1TkJDRklSVUJDT2hWTXQ1eFNka29GMUJONXI1TgowWFdzME1yN1FiaERwYXJUd3dWRVR5dzJtK0w2NGtXNEkxTnNCbTluVlg5R3RVdy9iaWhhZVNiU3BLaGlsOUllCjR1MUtpN3diL1VkS0RkOW5abjZ5VzBIUU8rVDBPL1FFWStudndsUUFVYUNLS3NuT2VNelY2b2NFR0xQT3IwbUkKci9PU21iYXo1bUVQMG9VQTUxQWE1QnVWblJtaHVaeXhtN0VBSHUvUUQwOUNiTWtLdk81RCtqcHhwY2hOSnFVMQovWWxkdklWaUhUTFNvQ3RVN1pwWHdkdjZFTThadDR0S0c0OEJ0aWVWVStpMmlXMWJ2R2pVSStpTFVhSlcrZkNtCmdLRFdIck84RHc5VGRTbXE2aE4zNU42TWdTR3RCeEJIRWEySFBRZlJkYnpQODJaKwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049Q09NT0RPIFJTQSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPUNPTU9ETyBDQSBMaW1pdGVkCiMgU3ViamVjdDogQ049Q09NT0RPIFJTQSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPUNPTU9ETyBDQSBMaW1pdGVkCiMgTGFiZWw6ICJDT01PRE8gUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IgojIFNlcmlhbDogMTAxOTA5MDg0NTM3NTgyMDkzMzA4OTQxMzYzNTI0ODczMTkzMTE3CiMgTUQ1IEZpbmdlcnByaW50OiAxYjozMTpiMDo3MTo0MDozNjpjYzoxNDozNjo5MTphZDpjNDozZTpmZDplYzoxOAojIFNIQTEgRmluZ2VycHJpbnQ6IGFmOmU1OmQyOjQ0OmE4OmQxOjE5OjQyOjMwOmZmOjQ3OjlmOmUyOmY4Ojk3OmJiOmNkOjdhOjhjOmI0CiMgU0hBMjU2IEZpbmdlcnByaW50OiA1MjpmMDplMTpjNDplNTo4ZTpjNjoyOToyOToxYjo2MDozMTo3ZjowNzo0Njo3MTpiODo1ZDo3ZTphODowZDo1YjowNzoyNzozNDo2Mzo1Mzo0YjozMjpiNDowMjozNAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRjJEQ0NBOENnQXdJQkFnSVFUS3I1eXR0amIrQWY5MDdZV3dPR25UQU5CZ2txaGtpRzl3MEJBUXdGQURDQgpoVEVMTUFrR0ExVUVCaE1DUjBJeEd6QVpCZ05WQkFnVEVrZHlaV0YwWlhJZ1RXRnVZMmhsYzNSbGNqRVFNQTRHCkExVUVCeE1IVTJGc1ptOXlaREVhTUJnR0ExVUVDaE1SUTA5TlQwUlBJRU5CSUV4cGJXbDBaV1F4S3pBcEJnTlYKQkFNVElrTlBUVTlFVHlCU1UwRWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrd0hoY05NVEF3TVRFNQpNREF3TURBd1doY05Nemd3TVRFNE1qTTFPVFU1V2pDQmhURUxNQWtHQTFVRUJoTUNSMEl4R3pBWkJnTlZCQWdUCkVrZHlaV0YwWlhJZ1RXRnVZMmhsYzNSbGNqRVFNQTRHQTFVRUJ4TUhVMkZzWm05eVpERWFNQmdHQTFVRUNoTVIKUTA5TlQwUlBJRU5CSUV4cGJXbDBaV1F4S3pBcEJnTlZCQU1USWtOUFRVOUVUeUJTVTBFZ1EyVnlkR2xtYVdOaApkR2x2YmlCQmRYUm9iM0pwZEhrd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUNSCjZGU1MwZ3BXc2F3TkpOM0Z6MFJuZEprck42TjlJM0FBY2J4VDM4VDZLaEtQUzM4UVZyMmZjSEszWVgvSlN3OFgKcHozanNBUmg3djhSbDhmMGhqNEsrajVjK1pQbU5IclpGR3ZubkxPRm9JSjZkcTl4a05mcy9RMzZuR3o2MzdDQwo5QlIrK2I3RXBpOVBmNWwvdGZ4blEzSzlEQURXaWV0ckxOUHRqNWdjRkt0KzVlTnUvTmlvNUpJazJrTnJZcmhWCi9lckJ2R3kyaS9NT2pacmttMnhwbWZoNFNEQkYxYTNoRFR4RllQd3lsbEVudkdmRHlpNjJhK3BHeDhjZ29MRWYKWmQ1SUNMcWtUcW55ZzBZM2hPdm96SUZJUTJkT2NpcWJYTDFNR3lpS1hDSjd0S3VZMmU3Z1VZUERDVVpPYlQ2WgorcFVYMm53elYwRThqVkh0QzdaY3J5eGpHdDlYeUQrODZWM0VtNjlGbWVLaldpUzB1cWxXUGM5dnF2OUpXTDd3CnFQLzB1SzNwTi91NnVQUUxPdm5vUTBJZWlkaUV5eFB4MmJ2aGlXQzRqQ2hXckJRZG5Bcm5jZXZQRHQwOXFaYWgKU0wwODk2KzFEU0pNd0JHQjdGWTc5dE9pNGx1M3NnUWlVcFdBazJub2preGw4WkVETFhCMEF1cUxaeFVwYVZJQwp1OWZmVUdwVlJyK2dveWhoZjNEUXc2S3FMQ0dxUjg0b25BWkZkcitDR0NlMDFhNjB5MURtYS9STWhuRXc2YWJmCkZvYmcyUDlBM2Z2UVFvaC9vek02TGx3ZVFSR0JZODRZY1dzcjdLYUt0ekZjT21wSDRNTjVXZFlnR3EveWFwaXEKY3J4WFN0SkxuYnNRL0xCTVFlWHRIVDFlS0oyY3pMK3pVZHFuUitXRVV3SURBUUFCbzBJd1FEQWRCZ05WSFE0RQpGZ1FVdTY5K0FqMzZwdkU4aEk2dDdqaVk3Tmt5TXRRd0RnWURWUjBQQVFIL0JBUURBZ0VHTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRU1CUUFEZ2dJQkFBcngxVWFFdDY1UnUyeXlUVUVVQUpOTW5NdmwKd0ZUUG9DV09Bdm45c0tJTjlTQ1lQQk10ckZhaXNOWitFWkxwTHJxZUxwcHlzYjBaUkd4aE5hS2F0QllTYVZxTQo0ZGMrcEJyb0x3UDBybUVkRUJzcXBJdDZ4ZjRGcHVIQTFzaitucTZQSzdvOW1malljd2xZUm02bW5QVFhKOU9WCjJqZURjaHpUYytDaVI1a0RPRjNWU1hrQUtSekg3SnNnSEFja2FWZDRzam44T29TZ3RaeDhqYjh1azJJbnR6bmEKRnhpdXZUd0phUCtFbXp6VjFnc0Q0MWVlRlBmUjYwL0l2WWNqdDdaSlEzbUZYTHJya2d1aHh1aG9xRXdXc1JxWgpDdWhUTEpLN29Ra1lkUXhscUh2TEk3Y2F3aWlGd3h2LzBDdGk3NlI3Q1pHWVo0d1VBYzFvQm1waklYVURnSWlLCmJvSEdoZktwcEMzbjlLVWtFRWVEeXMzMGpYbFlzUWFiNXhvcTJaMEIxNVI5N1FOS3l2RGI2S2tCUHZWV21ja2UKamtrOXUrVUp1ZUJQU1pJOUZvSkF6TXhaeHVZNjdSSXVhVHhzbGJIOXFoMTdmNGErSGc0eVJ2djdFNDkxZjB5TApTMFpqL2dBMFFIREJ3N21oM2FadzRnU3pRYnpwZ0pIcVpKeDY0U0lEcVp4dWJ3NWxUMnlIaDE3emJxRDVkYVdiClFPaFRzaWVkU3JuQWR5R04vNGZ5M3J5TTd4ZmZ0MGtMMGZKdU1Bc2FEazUyN1JIODllbFdzbjIveDIwS2s0eWwKME1DMkhiNDZUcFNpMTI1c0M4S0tmUG9nODhUazVjME5xTXVSa3JGOGhleTFGR2xtRG9MbnpjN0lMYVpSZnlIQgpOVk9GQmtwZG42MjdHMTkwCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1VU0VSVHJ1c3QgUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IE89VGhlIFVTRVJUUlVTVCBOZXR3b3JrCiMgU3ViamVjdDogQ049VVNFUlRydXN0IFJTQSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPVRoZSBVU0VSVFJVU1QgTmV0d29yawojIExhYmVsOiAiVVNFUlRydXN0IFJTQSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSIKIyBTZXJpYWw6IDI2NDUwOTM3NjQ3ODEwNTg3ODc1OTE4NzE2NDU2NjU3ODg3MTcKIyBNRDUgRmluZ2VycHJpbnQ6IDFiOmZlOjY5OmQxOjkxOmI3OjE5OjMzOmEzOjcyOmE4OjBmOmUxOjU1OmU1OmI1CiMgU0hBMSBGaW5nZXJwcmludDogMmI6OGY6MWI6NTc6MzM6MGQ6YmI6YTI6ZDA6N2E6NmM6NTE6Zjc6MGU6ZTk6MGQ6ZGE6Yjk6YWQ6OGUKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGU3OjkzOmM5OmIwOjJmOmQ4OmFhOjEzOmUyOjFjOjMxOjIyOjhhOmNjOmIwOjgxOjE5OjY0OjNiOjc0OjljOjg5Ojg5OjY0OmIxOjc0OjZkOjQ2OmMzOmQ0OmNiOmQyCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGM2pDQ0E4YWdBd0lCQWdJUUFmMXRNUHlqeWxHb0c3eGtEalVETFRBTkJna3Foa2lHOXcwQkFRd0ZBRENCCmlERUxNQWtHQTFVRUJoTUNWVk14RXpBUkJnTlZCQWdUQ2s1bGR5QktaWEp6WlhreEZEQVNCZ05WQkFjVEMwcGwKY25ObGVTQkRhWFI1TVI0d0hBWURWUVFLRXhWVWFHVWdWVk5GVWxSU1ZWTlVJRTVsZEhkdmNtc3hMakFzQmdOVgpCQU1USlZWVFJWSlVjblZ6ZENCU1UwRWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrd0hoY05NVEF3Ck1qQXhNREF3TURBd1doY05Nemd3TVRFNE1qTTFPVFU1V2pDQmlERUxNQWtHQTFVRUJoTUNWVk14RXpBUkJnTlYKQkFnVENrNWxkeUJLWlhKelpYa3hGREFTQmdOVkJBY1RDMHBsY25ObGVTQkRhWFI1TVI0d0hBWURWUVFLRXhWVQphR1VnVlZORlVsUlNWVk5VSUU1bGRIZHZjbXN4TGpBc0JnTlZCQU1USlZWVFJWSlVjblZ6ZENCU1UwRWdRMlZ5CmRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa3dnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUsKQW9JQ0FRQ0FFbVVYTmc3RDJ3aXowS3hYRFhidHpTZlRUSzFRZzJIaXFpQk5DUzFrQ2R6T2laL01QYW5zOXMvQgozUEhUc2RaN055Z1JLMGZhT2NhOE9obTBYNmE5ZloyalkwSzJkdktwT3l1UitPSnYwT3dXSUpBSlB1TG9kTWtZCnRKSFVZbVRiZjZNRzhZZ1lhcEFpUEx6K0UvQ0hGSHYyNUIrTzFPUlJ4aEZuUmdoUnk0WVVWRCs4TS81K2JKei8KRnAwWXZWR09OYWFuWnNoeVo5c2hackhVbTNnRHdGQTY2TXp3M0x5ZVRQNnZCWlkxSDFkYXQvL08rVDIzTExiMgpWTjNJNXhJNlRhNU1pcmRjbXJTM0lEM0tmeUkwcm40N2FHWUJST2NCVGtaVG16Tmc5NVMrVXplUWMwUHpNc05UCjc5dXEvblJPYWNkcmpHQ1Qzc1RIRE4vaE1xN01renRSZUpWbmkrNDlWdjRNMEdrUEd3L3pKU1pyTTIzM2JrZjYKYzBQbGZnNmxackVwZkRLRVkxV0p4QTNCazFRd0dST3MwMzAzcCt0ZE9tdzFYTnRCMXhMYXFVa0wzOWlBaWdtVApZbzYxWnM4bGlNMkV1TEUvcERrUDJRS2U2eEpNbFh6emF3V3BYaGFEekxobjR1Z1RuY3hiZ3ROTXMrMWIvOTdsCmM2d2pPeTBBdnpWVmRBbEoyRWxZR24rU051WlJrZzd6Sm4wY1RSZTh5ZXhESnRDL1FWOUFxVVJFOUpublY0ZWUKVUI5WFZLZysvWFJqTDdGUVpRbm1XRUl1UXhwTXRQQWxSMW42QkI2VDFDWkdTbENCc3Q2K2VMZjhaeFhoeVZlRQpIZzlqMXVsaXV0WmZWUzdxWE1Zb0NBUWxPYmdPSzZueVRKY2NCejhOVXZYdDd5K0NEd0lEQVFBQm8wSXdRREFkCkJnTlZIUTRFRmdRVVUzbS9XcW9yU3M5VWdPSFltOENkOHJJRFpzc3dEZ1lEVlIwUEFRSC9CQVFEQWdFR01BOEcKQTFVZEV3RUIvd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVNQlFBRGdnSUJBRnpVZkEzUDl3RjlRWmxsREhQRgpVcC9MK00rWkJuOGIya01WbjU0Q1ZWZVdGUEZTUENlSGxDanRIem9CTjZKMi9GTlF3SVNieG10T3Vvd2hUNktPClZXS1I4MmtWMkx5STQ4U3FDLzN2cU9sTFZTb0dJRzFWZUNrWjdsOHdYRXNrRVZYL0pKcHVYaW9yN2d0Tm4zLzMKQVRpVUZKVkRCd243WUtudUhLc1NqS0NhWHFlWWFsbHRpejhJKzhqUlJhOFlGV1NRRWc5ektDN0Y0aVJPL0Zqcwo4UFJGL2lLejZ5K08wdGxGWVFYQmwyK29kbktQaTR3MnI3OE5CYzV4amVhbWJ4OXNwbkZpeGRqUWczSU04V2NSCmlReWNFMHh5Tk4rODFYSGZxbkhkNGJsc2pEd1NYV1hhdlZjU3RrTnIvK1hlVFdZUlVjK1pydXdYdHVoeGtZemUKU2Y3ZE5YR2lGU2VVSE05aDR5YTdiNk5uSlNGZDV0MGRDeTVvR3p1Q3IreURaNFhVbUZGMHNibVpnSW4vZjNnWgpYSGxLWUM2U1FLNU1OeW9zeWNkaXlBNWQ5elpieXVBbEpRRzAzUm9IbkhjQVA5RGMxZXc5MVBxN1A4eUYxbTkvCnFTM2Z1UUwzOVplYXRUWGF3MmV3aDBxcEtKNGpqdjljSjJ2aHNFL3pCKzRBTHRSWmg4dFNRWlhxOUVmWDdtUkIKVlh5TldRS1YzV0tkd3JudVdpaDBoS1didDVESERBZmY5WWsyZERMV0tNR3dzQXZnbkV6REhOYjg0Mm0xUjBhQgpMNktDcTlOalJIREVqZjh0TTdxdGozdTFjSWl1UGhuUFFDalkvTWlRdTEyWkl2VlM1bGpGSDRneFErNklIZGZHCmpqeERhaDJuR041OVBSYnhZdm5La0tqOQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VVNFUlRydXN0IEVDQyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBPPVRoZSBVU0VSVFJVU1QgTmV0d29yawojIFN1YmplY3Q6IENOPVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgTz1UaGUgVVNFUlRSVVNUIE5ldHdvcmsKIyBMYWJlbDogIlVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkiCiMgU2VyaWFsOiAxMjMwMTM4MjM3MjAxOTk0ODE0NTY1Njk3MjA0NDM5OTc1NzIxMzQKIyBNRDUgRmluZ2VycHJpbnQ6IGZhOjY4OmJjOmQ5OmI1OjdmOmFkOmZkOmM5OjFkOjA2OjgzOjI4OmNjOjI0OmMxCiMgU0hBMSBGaW5nZXJwcmludDogZDE6Y2I6Y2E6NWQ6YjI6ZDU6MmE6N2Y6Njk6M2I6Njc6NGQ6ZTU6ZjA6NWE6MWQ6MGM6OTU6N2Q6ZjAKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDRmOmY0OjYwOmQ1OjRiOjljOjg2OmRhOmJmOmJjOmZjOjU3OjEyOmUwOjQwOjBkOjJiOmVkOjNmOmJjOjRkOjRmOmJkOmFhOjg2OmUwOjZhOmRjOmQyOmE5OmFkOjdhCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDanpDQ0FoV2dBd0lCQWdJUVhJdVp4VnFVeGRKeFZ0N05pWURNSmpBS0JnZ3Foa2pPUFFRREF6Q0JpREVMCk1Ba0dBMVVFQmhNQ1ZWTXhFekFSQmdOVkJBZ1RDazVsZHlCS1pYSnpaWGt4RkRBU0JnTlZCQWNUQzBwbGNuTmwKZVNCRGFYUjVNUjR3SEFZRFZRUUtFeFZVYUdVZ1ZWTkZVbFJTVlZOVUlFNWxkSGR2Y21zeExqQXNCZ05WQkFNVApKVlZUUlZKVWNuVnpkQ0JGUTBNZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt3SGhjTk1UQXdNakF4Ck1EQXdNREF3V2hjTk16Z3dNVEU0TWpNMU9UVTVXakNCaURFTE1Ba0dBMVVFQmhNQ1ZWTXhFekFSQmdOVkJBZ1QKQ2s1bGR5QktaWEp6WlhreEZEQVNCZ05WQkFjVEMwcGxjbk5sZVNCRGFYUjVNUjR3SEFZRFZRUUtFeFZVYUdVZwpWVk5GVWxSU1ZWTlVJRTVsZEhkdmNtc3hMakFzQmdOVkJBTVRKVlZUUlZKVWNuVnpkQ0JGUTBNZ1EyVnlkR2xtCmFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrd2RqQVFCZ2NxaGtqT1BRSUJCZ1VyZ1FRQUlnTmlBQVFhckZSYXFmbG8KSStkNjFTUnZVOFphMkV1cnh0VzIwZVp6Y2E3ZG5OWU1ZZjNib0lrRHVBVVU3RmZPN2wwLzRpR3p6dmZVaW5uZwpvNE4rTFpmUVljVHhtZHdsa1dPcmZ6Q2p0SERpeDZFem5QTy9MbHhUc1YremZUSi9palRqZVhtalFqQkFNQjBHCkExVWREZ1FXQkJRNjRRbUcxTThad3BaMmRFbDIzT0ExeG1Oam1qQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WUQKVlIwVEFRSC9CQVV3QXdFQi96QUtCZ2dxaGtqT1BRUURBd05vQURCbEFqQTJaNkVXQ056a2x3QkJIVTYrNFdNQgp6enVxUWhGa29KMlVPUUlSZVZ4N0hmcGt1ZTRXUXJPL2lzSUp4T3prc1UwQ01RRHBLbUZIakZKS1MwNFljUGJXClJOWnU5WU82YlZpOUpObFdTT3J2eEtKR2dZaHFPa2JScVp0TnlXSGEwVjFYYWhnPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049R2xvYmFsU2lnbiBPPUdsb2JhbFNpZ24gT1U9R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0CiMgU3ViamVjdDogQ049R2xvYmFsU2lnbiBPPUdsb2JhbFNpZ24gT1U9R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0CiMgTGFiZWw6ICJHbG9iYWxTaWduIEVDQyBSb290IENBIC0gUjQiCiMgU2VyaWFsOiAxNDM2NzE0ODI5NDkyMjk2NDQ4MDg1OTAyMjEyNTgwMDk3Nzg5NzQ3NAojIE1ENSBGaW5nZXJwcmludDogMjA6ZjA6Mjc6Njg6ZDE6N2U6YTA6OWQ6MGU6ZTY6MmE6Y2E6ZGY6NWM6ODk6OGUKIyBTSEExIEZpbmdlcnByaW50OiA2OTo2OTo1NjoyZTo0MDo4MDpmNDoyNDphMTplNzoxOTo5ZjoxNDpiYTpmMzplZTo1ODphYjo2YTpiYgojIFNIQTI1NiBGaW5nZXJwcmludDogYmU6Yzk6NDk6MTE6YzI6OTU6NTY6NzY6ZGI6NmM6MGE6NTU6MDk6ODY6ZDc6NmU6M2I6YTA6MDU6NjY6N2M6NDQ6MmM6OTc6NjI6YjQ6ZmI6Yjc6NzM6ZGU6MjI6OGMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUI0VENDQVllZ0F3SUJBZ0lSS2ppa0hKWUtCTjVDc2lpbEMrZzBtQUl3Q2dZSUtvWkl6ajBFQXdJd1VERWsKTUNJR0ExVUVDeE1iUjJ4dlltRnNVMmxuYmlCRlEwTWdVbTl2ZENCRFFTQXRJRkkwTVJNd0VRWURWUVFLRXdwSApiRzlpWVd4VGFXZHVNUk13RVFZRFZRUURFd3BIYkc5aVlXeFRhV2R1TUI0WERURXlNVEV4TXpBd01EQXdNRm9YCkRUTTRNREV4T1RBek1UUXdOMW93VURFa01DSUdBMVVFQ3hNYlIyeHZZbUZzVTJsbmJpQkZRME1nVW05dmRDQkQKUVNBdElGSTBNUk13RVFZRFZRUUtFd3BIYkc5aVlXeFRhV2R1TVJNd0VRWURWUVFERXdwSGJHOWlZV3hUYVdkdQpNRmt3RXdZSEtvWkl6ajBDQVFZSUtvWkl6ajBEQVFjRFFnQUV1TVo1MDQ5c0pRNmZMamtaSEFPa3JwcmxPUWNKCkZzcGpzYm1HK0lwWHdWZk9RdnB6b2ZkbFF2OGV3UUN5Ym5NTy84Y2g1UmlrcXRseFA2alV1YzZNSGFOQ01FQXcKRGdZRFZSMFBBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUVGRlN3ZTYxRgp1T0pBZi9zS2J2dStNOGs4bzRUVk1Bb0dDQ3FHU000OUJBTUNBMGdBTUVVQ0lRRGNrcUdnRTZiUEE3RG14Q0dYCmtQb1VWeTBEN080ODAyN0txR3gydktMZXV3SWdKNmlGSnpXYlZzYWo4a2ZTdDI0YkFnQVhxbWVtRlpIZStwVHMKZXd2NG40UT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUdsb2JhbFNpZ24gTz1HbG9iYWxTaWduIE9VPUdsb2JhbFNpZ24gRUNDIFJvb3QgQ0EgLSBSNQojIFN1YmplY3Q6IENOPUdsb2JhbFNpZ24gTz1HbG9iYWxTaWduIE9VPUdsb2JhbFNpZ24gRUNDIFJvb3QgQ0EgLSBSNQojIExhYmVsOiAiR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1IgojIFNlcmlhbDogMzI3ODU3OTIwOTk5OTA1MDcyMjY2ODA2OTgwMTE1NjA5NDc5MzEyNDQKIyBNRDUgRmluZ2VycHJpbnQ6IDlmOmFkOjNiOjFjOjAyOjFlOjhhOmJhOjE3Ojc0OjM4OjgxOjBjOmEyOmJjOjA4CiMgU0hBMSBGaW5nZXJwcmludDogMWY6MjQ6YzY6MzA6Y2Q6YTQ6MTg6ZWY6MjA6Njk6ZmY6YWQ6NGY6ZGQ6NWY6NDY6M2E6MWI6Njk6YWEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDE3OjlmOmJjOjE0OjhhOjNkOmQwOjBmOmQyOjRlOmExOjM0OjU4OmNjOjQzOmJmOmE3OmY1OjljOjgxOjgyOmQ3OjgzOmE1OjEzOmY2OmViOmVjOjEwOjBjOjg5OjI0Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDSGpDQ0FhU2dBd0lCQWdJUllGbEo0Q1l1dTFYNUNuZUtjZmxLMkd3d0NnWUlLb1pJemowRUF3TXdVREVrCk1DSUdBMVVFQ3hNYlIyeHZZbUZzVTJsbmJpQkZRME1nVW05dmRDQkRRU0F0SUZJMU1STXdFUVlEVlFRS0V3cEgKYkc5aVlXeFRhV2R1TVJNd0VRWURWUVFERXdwSGJHOWlZV3hUYVdkdU1CNFhEVEV5TVRFeE16QXdNREF3TUZvWApEVE00TURFeE9UQXpNVFF3TjFvd1VERWtNQ0lHQTFVRUN4TWJSMnh2WW1Gc1UybG5iaUJGUTBNZ1VtOXZkQ0JEClFTQXRJRkkxTVJNd0VRWURWUVFLRXdwSGJHOWlZV3hUYVdkdU1STXdFUVlEVlFRREV3cEhiRzlpWVd4VGFXZHUKTUhZd0VBWUhLb1pJemowQ0FRWUZLNEVFQUNJRFlnQUVSMFVPbHZ0OVhiL3BPZEVoK0o4THR0VjdIcEk2U0ZrYwo4R0l4TGNCNktQNGFwMXl6dHN5WDUwWFVXUHJSZDIxRG9zQ0haVFFLSDNyZDZ6d3pvY1dkVGFSdlFaVTRmOGtlCmhPdlJua21TaDVTSEREcUZTbWFmblZtVFRaZGhCb1pLbzBJd1FEQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WUQKVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVVQZVlwU0p2cUI4b2hSRW9tM203ZTBvUFFuMWt3Q2dZSQpLb1pJemowRUF3TURhQUF3WlFJeEFPVnBFc2x1MjhZeHVnbEI0WmY0Ky8yYTRuMFN5ZTE4Wk5QTEJTV0xWdG1nCjUxNWRUZ3VEbkZ0MkthQUpKaUZxWWdJd2NkSzFqMXpxTytGNENZV29kWkk3eUZ6OVNPOE5kQ0tvQ09KdXhVbk8KeHd5OHAyRnA4ZmM3NFNyTCtTdnpacEEzCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1TdGFhdCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEczIE89U3RhYXQgZGVyIE5lZGVybGFuZGVuCiMgU3ViamVjdDogQ049U3RhYXQgZGVyIE5lZGVybGFuZGVuIFJvb3QgQ0EgLSBHMyBPPVN0YWF0IGRlciBOZWRlcmxhbmRlbgojIExhYmVsOiAiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJvb3QgQ0EgLSBHMyIKIyBTZXJpYWw6IDEwMDAzMDAxCiMgTUQ1IEZpbmdlcnByaW50OiAwYjo0Njo2NzowNzpkYjoxMDoyZjoxOTo4YzozNTo1MDo2MDpkMTowYjpmNDozNwojIFNIQTEgRmluZ2VycHJpbnQ6IGQ4OmViOjZiOjQxOjUxOjkyOjU5OmUwOmYzOmU3Ojg1OjAwOmMwOjNkOmI2Ojg4Ojk3OmM5OmVlOmZjCiMgU0hBMjU2IEZpbmdlcnByaW50OiAzYzo0ZjpiMDpiOTo1YTpiODpiMzowMDozMjpmNDozMjpiODo2Zjo1Mzo1ZjplMTo3MjpjMTo4NTpkMDpmZDozOTo4Njo1ODozNzpjZjozNjoxODo3ZjphNjpmNDoyOAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmREQ0NBMXlnQXdJQkFnSUVBSmlpT1RBTkJna3Foa2lHOXcwQkFRc0ZBREJhTVFzd0NRWURWUVFHRXdKTwpUREVlTUJ3R0ExVUVDZ3dWVTNSaFlYUWdaR1Z5SUU1bFpHVnliR0Z1WkdWdU1Tc3dLUVlEVlFRRERDSlRkR0ZoCmRDQmtaWElnVG1Wa1pYSnNZVzVrWlc0Z1VtOXZkQ0JEUVNBdElFY3pNQjRYRFRFek1URXhOREV4TWpnME1sb1gKRFRJNE1URXhNekl6TURBd01Gb3dXakVMTUFrR0ExVUVCaE1DVGt3eEhqQWNCZ05WQkFvTUZWTjBZV0YwSUdSbApjaUJPWldSbGNteGhibVJsYmpFck1Da0dBMVVFQXd3aVUzUmhZWFFnWkdWeUlFNWxaR1Z5YkdGdVpHVnVJRkp2CmIzUWdRMEVnTFNCSE16Q0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQUw0eW9sUVAKY1Bzc1hGbnJiTVNrVWVpRktyUE1TalR5c0YvekRzY2NQVk1laUFobzJHODlyY0tleklKbkJ5ZUhhSEU2bjNXVwpJa1lGc08ydHgxdWVLdDZjL0RyR2xhZjFGMmNZNXk5SkNBeGN6K2JNTk8xNCsxQ3gzR3N5OEtMK3Rqems3RnFYCnh6OGVjQWd3b056RnMyMXYwSUp5RWF2U2dXaFpnaGUzZUpKZytzemVQNFRyalRnemtBcHlJL28xekNaeE1kRnkKS0pMWld5TnRaclZ0QjBMcnBqUE9rdHZBOW14amVNM0tUajIxNVZLYjhiNDc1bFJnc0dZZUNhc0gvbFNKRVVMUgo5eVM2WUhnYW1QZkpFZjBXd1RVYVZIWHZROVBscms3TzUzdkR4azVoVVV1cm1rVkxvUjlCdlVoVEZYRmtDNGF6CjVTNit6cVFid1NtRW9yWExDQ04yUXlJa0h4Y0UxRzZjeHZ4L0syWWE3SXJsMXM5TjlXTUp0eFU1MW51czYrTjgKNlU3OGRVTEk3VmlWREFaQ29wejM1SEN6MzNKdldqZEFpZGlGcE5meEM5NURHZFJLV0N5TWlqbWV2NFNIOFJZNwpOZ3pwMDdUS2JCbEJVZ21oSGJCcXY0THZjRkVoTXR3RmRvekw5MlRrQTFDdmpKRm5xOFh5N2xqWTNyNzM1ekhQCmJNazdjY0hWaUxWbHZNRG9GeGNIRXJWYzBxc2drN1RtZ29Od05zWE5vNDJ0aSt5andVT0g1a1BpTkw2Vml6WHQKQnpuYXFCMTZuemFlRXJBTVpSS1FGV0RaSmtCRTQxWmdwUkRVYWp6OVFkd09Xa2UyNzVkaGRVL1ovc2V5SGRUdApYVW16cVdyTFpvUVQxVnlnM045dWR3YlJjWFhJVjIrdkQzZGJBZ01CQUFHalFqQkFNQThHQTFVZEV3RUIvd1FGCk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnRUdNQjBHQTFVZERnUVdCQlJVcmZySGtsZXV5aldjTGhMNzVMcGQKSU55VVZ6QU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUFNSm1kQlRMSVhnNDdtQUU2aXFUbkIvZDYrT2VhMzFCRApVNWNxUGNvOFI1Z3U0UlY3OFpMellkcVFKUlpsd0o5VVhRNERPMXQzQXB5RXRnMllYelRkTzJQQ3d5aUJ3cHdwCkxpbml5TU1COGpQcUtxck1DUWozWldmR3pkL1R0aXVudmN6UkRuQmZ1Q1BSeTVGT0N2VElldVhaWXpiQjFOLzgKSXBmM1lGM3FLUzlZc3IxWXZZMldUeEIxdjBoN1BWR0hvVHgwSXNMOEIzK0EzTVNzL21yQmNEQ3c2WTVwNGl4cApnWlFKdXQzK1RjQ0RqSlJZd0VZZ3I1d2ZBdmcxVlVrdlJ0VEE4S0NXQWc4enhYSHpuaU45bExmOU90TUpnd1loCi9XQTlyakxBMHU2TnB2RG50SUo4Q3N4d3lYbUErUDVNOXpXRUdZb3grd3JaMTMrYjhLS2FhOE1GU3UxQllCUXcKMGFvUlFtN1RJd0lFQzhabDNkMVNkOXFCYTdLbytnRTR1WmJxS214bmw0bVVucnpoVk5Ya2FuanZTcjBybWoxQQpmc2JBZGRKdSsyZ3c3T3lMbmZsSk5ab2FMTm16bFRuVkhwTDNwcmxsTCtVOWJUcElUQWpjNUNnU0tMNTlOVnpxCjRCWitFeHRxMXo3WG52d3RkYkxCRk5VakE5dGJid3MrZUM4TjNqT05GcmRJNTRPYWdROTd3VU5OVlFRWE9FcFIKMVZtaWlYVFRuNzRlUzlmR2JiZUlKRzlna2FTQ2hWdFdRYnpRUkt0cUU3N1JMRmkzRWpOWXNqZGozQlAxbEIwLwpRRkgxVC9VNjdjakY2OEllSFJhVmVzZCtRbkdUYmtzVnR6RGZxdTFYaFVpc0hXcmRPV25rNFhsNHZzNEZ2NkVNCjk0QjdJV2NuTUZrPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U3RhYXQgZGVyIE5lZGVybGFuZGVuIEVWIFJvb3QgQ0EgTz1TdGFhdCBkZXIgTmVkZXJsYW5kZW4KIyBTdWJqZWN0OiBDTj1TdGFhdCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQSBPPVN0YWF0IGRlciBOZWRlcmxhbmRlbgojIExhYmVsOiAiU3RhYXQgZGVyIE5lZGVybGFuZGVuIEVWIFJvb3QgQ0EiCiMgU2VyaWFsOiAxMDAwMDAxMwojIE1ENSBGaW5nZXJwcmludDogZmM6MDY6YWY6N2I6ZTg6MWE6ZjE6OWE6YjQ6ZTg6ZDI6NzA6MWY6YzA6ZjU6YmEKIyBTSEExIEZpbmdlcnByaW50OiA3NjplMjo3ZTpjMTo0ZjpkYjo4MjpjMTpjMDphNjo3NTpiNTowNTpiZTozZDoyOTpiNDplZDpkYjpiYgojIFNIQTI1NiBGaW5nZXJwcmludDogNGQ6MjQ6OTE6NDE6NGM6ZmU6OTU6Njc6NDY6ZWM6NGM6ZWY6YTY6Y2Y6NmY6NzI6ZTI6OGE6MTM6Mjk6NDM6MmY6OWQ6OGE6OTA6N2E6YzQ6Y2I6NWQ6YWQ6YzE6NWEKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZjRENDQTFpZ0F3SUJBZ0lFQUppV2pUQU5CZ2txaGtpRzl3MEJBUXNGQURCWU1Rc3dDUVlEVlFRR0V3Sk8KVERFZU1Cd0dBMVVFQ2d3VlUzUmhZWFFnWkdWeUlFNWxaR1Z5YkdGdVpHVnVNU2t3SndZRFZRUUREQ0JUZEdGaApkQ0JrWlhJZ1RtVmtaWEpzWVc1a1pXNGdSVllnVW05dmRDQkRRVEFlRncweE1ERXlNRGd4TVRFNU1qbGFGdzB5Ck1qRXlNRGd4TVRFd01qaGFNRmd4Q3pBSkJnTlZCQVlUQWs1TU1SNHdIQVlEVlFRS0RCVlRkR0ZoZENCa1pYSWcKVG1Wa1pYSnNZVzVrWlc0eEtUQW5CZ05WQkFNTUlGTjBZV0YwSUdSbGNpQk9aV1JsY214aGJtUmxiaUJGVmlCUwpiMjkwSUVOQk1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBNDhkK2lma2tTenJTCk00TTFMR25zM0FtazQxR29KU3Q1dUFnOTRKRzZoSVhHaGFUSzVza3VVNlRKSkI3OVZXWnhYU3pGWUdnRXQ5bkMKVWlZNGlLVFdPMENtd3MwL3paaVRzMVFVV0paVjFWRCtocTJrWTM5Y2gvYU81aWVTWnhlU0FnTXMzTlptZE8zZApaLy9CWVkxalR3K2JiUmN3SnUrcjBoOFFvUG5GZnhacGdRTkg3UjVvalhLaFRiSW14cnBzWDIzV3I5R3hFNDZwCnJmTmVhWFVtR0Q1Qkt5Ri83b3RkQndhZFE4UXBDaXY4S2o2R3l6eURPdm5KRGRyRm1lSzhlRUV6ZHVHL0wxM2wKcEpoUURCWGQ0UHFjZnpobzBMS21lcWZSTWIxK2lsZ25RN082TTVIVHA1Z1ZYSnJtMHc5MTJmeEJtSmMrcWlYYgpqNUl1c0hzTVgvRmpxVGY1bTNWcFRDZ21KZHJWOGhKd1JWWGozM05lTi9VaGJKQ09OVnJKMHlQcjA4QytlS3hDCktGaG1wVVp0Y0FMWEVQbExWUHhkaGtxSHozL0tSYXdSV3JVZ1VZMHZpRWVYT2NEUHVzQkNBVUNaU0NFTGE2ZlMKL1piVjBiNUduVW5nQzZhZ0lrNDQwTUU4TUx4d2p5eDF6TkRGakZFN1BaUUlaQ1poZmJuRFpZOFVuQ0hRcXYwWApjZ09Qdlp1TTVsNVRucm1kNzRLNzRiemlja0ZiSVpUVFJUZVUwZDhKT1Yzbkk2cWFIY3B0cUFxR2hZcUN2a0lICjF2STRnblBhaDF2bFBOT2VQcWM3bnZRRHMvbnhmUk4wQXYrN29lWDZBSGtjcG1aQmlGeGdWNll1Q2NTNi9aclAKcHg5QXc3dk1XZ3BWU3pzNGRsRzRZNHVFbEJibVZ2TUNBd0VBQWFOQ01FQXdEd1lEVlIwVEFRSC9CQVV3QXdFQgovekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUVGUDZyQUpDWW5pVDhxY3dhaXZzbnVMOHdicWc3Ck1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQ0FRRFBkeXh1VnI1T3M3YUVBSlNyUjhrTjBuYkhocDhkQjlPMnRMc0kKZUs5cDBndEozalBGckszQ2lBSjlCcmMxQXNGZ3liL0U2SlRlMU5PcEV5VmEvbTZpcm4wRjNIM3piUEIrcG8zdQoyZGZPV0Jmb3FTbXVjMGlINTV2S2JpbWhaRjhaRS9ldUJoRC9VY2FiVFZVbFQ1T1pFQUZUZGZFVHpzZW1RVUhTCnY0aWxmMFg4ckxpbHRUTU1nc1Q3Qi9acTVTV0VYd2JLd1lZNUVkdFl6WGM3TE1KTUQxNmE0L0NyUG1FYlVDVEMKd1BUeEdmQVJLYmFsR0FLYjEyTk1jSXhIb3dORFhMbGRScUFOYi85WmpyN2RuM0xEV3l2ZmpGdk81UXhHYkpLeQpDcU5NVkVJWUZSSVl2ZHI4dW5SdS84RzJvR1RZcVY5VnJwOWNhbmFXMkhObmgvdE5mMXp1YWNwekVQdUtxZjJlCnZUWTRTVW1IOUE0VThPbUh1RCtuVDNwYWpublVrK1M3YUZLRXJHenA4NWh3VlhJeStUU3JLMG0xelNCaTVEcDYKWjJPcmx0eHRycGZzL0o5MlZvZ3VaczlidHNta3NOY0Z1dUVuTDVPN0ppcWlrN0FiODQ2K0hVQ2p1VGFQUG9JYQpHbDZJNmxENFdlS0RSaWtMNDBSYzRaVzJhWkNhRkcrWHJvSFBhTytabXI2MTUrRi8rUG9UUnhaTXpHMElRT2VMCmVHOVFna1JRUDJZR2lxdERoRlpLRHlBdGhnNzEwdHZTZW9wTHphWG9UdkZlSmlVQldTT2dmdEwyZmlGWDF5ZTgKRlZkTXBFYkI0SU1lREV4TkgwOEdHZUw1cVBRNmdxR3llVU41MXExdmVpZVFBNlRxSkljLzJiM1o2ZkpmVUVrYwo3dXpYTGc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049SWRlblRydXN0IENvbW1lcmNpYWwgUm9vdCBDQSAxIE89SWRlblRydXN0CiMgU3ViamVjdDogQ049SWRlblRydXN0IENvbW1lcmNpYWwgUm9vdCBDQSAxIE89SWRlblRydXN0CiMgTGFiZWw6ICJJZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEiCiMgU2VyaWFsOiAxMzI5ODgyMTAzNDk0NjM0MjM5MDUyMDAwMzg3Nzc5NjgzOTQyNgojIE1ENSBGaW5nZXJwcmludDogYjM6M2U6Nzc6NzM6NzU6ZWU6YTA6ZDM6ZTM6N2U6NDk6NjM6NDk6NTk6YmI6YzcKIyBTSEExIEZpbmdlcnByaW50OiBkZjo3MTo3ZTphYTo0YTpkOTo0ZTpjOTo1NTo4NDo5OTo2MDoyZDo0ODpkZTo1ZjpiYzpmMDozYToyNQojIFNIQTI1NiBGaW5nZXJwcmludDogNWQ6NTY6NDk6OWI6ZTQ6ZDI6ZTA6OGI6Y2Y6Y2E6ZDA6OGE6M2U6Mzg6NzI6M2Q6NTA6NTA6M2I6ZGU6NzA6Njk6NDg6ZTQ6MmY6NTU6NjA6MzA6MTk6ZTU6Mjg6YWUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZZRENDQTBpZ0F3SUJBZ0lRQ2dGQ2dBQUFBVVVqeUVTMUFBQUFBakFOQmdrcWhraUc5dzBCQVFzRkFEQksKTVFzd0NRWURWUVFHRXdKVlV6RVNNQkFHQTFVRUNoTUpTV1JsYmxSeWRYTjBNU2N3SlFZRFZRUURFeDVKWkdWdQpWSEoxYzNRZ1EyOXRiV1Z5WTJsaGJDQlNiMjkwSUVOQklERXdIaGNOTVRRd01URTJNVGd4TWpJeldoY05NelF3Ck1URTJNVGd4TWpJeldqQktNUXN3Q1FZRFZRUUdFd0pWVXpFU01CQUdBMVVFQ2hNSlNXUmxibFJ5ZFhOME1TY3cKSlFZRFZRUURFeDVKWkdWdVZISjFjM1FnUTI5dGJXVnlZMmxoYkNCU2IyOTBJRU5CSURFd2dnSWlNQTBHQ1NxRwpTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDblVCbmVQNWs5MURORzhXOVJZWUt5cVUrUFo0bGRoTmxUCjNRd28yZGZ3LzY2VlEzS1orYlZkZklyQlF1RXhVSFRSZ1ExOHpac2hxMFBpcksxZWhtN3pDWW9mV2pLOW91dVUKK2VoY0N1ei9tTkt2Y2JPMFU1OU9oKytTdkwzc1R6SXdpRXNYWGxmRVU4TDJBcGVOMldJcnZ5UWZZbzNmdzdncApTMGw0UEpOZ2lDTDhtZG8yeU1LaTFDeFVBR2MxYm5PL0FsandwTjNsc0tJbWVzcmdOcVVaRnZYOXQrK3VQMEQxCmJWb0UvYzQweWlUY2RDTWJYVE1URWwzRUFTWDJNTjBDWFovZzFVZTl0T3Nib2J0SlNkaWZXd0x6aXVRa2tPUmkKVDAvQnI0c09kQmVvMFhLSWFub0JTY3kwUm5uR0Y3SGFtQjRIV2ZwMUlZVmwzWkJXenZ1cnBXQ2R4SjM1VXJDTAp2WWY1anlzakNpTjJPL2N6NGNrQTgybjVTNkxnVHJ4K2t6bUVCL2RFY0g3K0IxcmxzYXpSR016eU5lVkpTUWpLClZzazkrdzhZZllzN3dSUENUWS9KVHc0MzZSK2hEbXJmWWk3TE5RWlJlU3pJSlRqMCtrdW5pVnljMHVNTk9ZWksKZEh6VldZZkNQMDRNWEZMMFBmZFNndkhxbzZ6OVNUUWFLUE5CaURvVDd1amUvNWtkWDdyTDZCN3l1VkJnd0RIVApjK1h2dnFEdE13dDB2aUFneEdkczhBZ0RlbFdBZjBaT2xxZjBIajdoOXRnSjRUTmtLMlBYTWw2ZitjQjdEM2h2Cmw3eVRtdm1jRXBCNGVvQ0hGZGR5ZEp4VmRIaXh1dUZ1Y0FTNlQ2QzZhTU43L3pId2N6MDlsQ3F4QzBFT29QNU4KaUdWcmVUTzAxd0lEQVFBQm8wSXdRREFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQgovekFkQmdOVkhRNEVGZ1FVN1VRWndOUHdCb3Z1cEh1K1F1Y21WTWlPTm5Zd0RRWUpLb1pJaHZjTkFRRUxCUUFECmdnSUJBQTJ1a0RMMnBrdDhSSFlaWVI0bktNMWVWTzhsdk9NSWtQa3AxNjVvQ09HVUFGanZMaTUrVTFLTXRsd0gKNm9pNm1ZdFFsTmVDZ045aENRQ1RyUTBVNXM3QjhqZVVlTEJmbkxPaWM3aVBCWk00elkwK3NMajd3TSt4OHV3dApMUnZNN0txYXM2cGdnaHN0TzhPRVBWZUtsaDZjZGJqVE1NMWdDSU9RMDQ1VThVMW13RjEwQTBDajdvVit3aDkzCm5BYm93YWNZWFZLVjdjbmRKWjV0K3FudG96bzAwRmw3MnUxUTh6Vy83ZXNVVFRISFlQVGE4WWVjNGtqaXhzVTMKK3dZUStuVlpaakZIS2RwMm1oenBncTd2bXJsUjk0Z2ptbW1WWWp6bFZZQTIxMVFDLy9HNVhjN1VJMi9ZUllSSwpXMlh2aVF6ZEZLY2d5eGlsSmJRTitRSHdvdEwwQU1oMGpxRXFTSTVsMnhQRTRpVVhmZXUraDFzWElGUlJrMHBUCkF3dnNYY296N1dMOVJjY3ZXOXhZb0lBNTV2clgvaE1VcHUwOWxFcENkTlREZDFsenpZOUd2bFU0Ny9yb2tUTHEKbDFnRUl0NDR3OHk4YmNrek9tb0thVCtneU9weWo0eGpoaU85YlR5V25wWGdTVXlxb3JrcUc1dzJnWGp0dytoRwo0aVpaUkhVZTJYV0pVYzBRaEoxaFlNdGQrWmNpVFk2WTV1Ti85bHU3cnMzS1NvRnJYZ3Z6VWVGMEsrbCtKNmZaCm1VbE8rS1dBMnlVUEhHTmlpc2t6WjJzOEVJUEdyZDZvelJhT2pmQUhOM0dmOHF2OFFmWEJpK3dBTjEwSjVVNkEKNy9xeFhEZ0dwUnRLNGR3NExUemNxeCtRR3RWS25PN1JjR3pNN3ZSWCtCaTZoRzZICi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1JZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEgTz1JZGVuVHJ1c3QKIyBTdWJqZWN0OiBDTj1JZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEgTz1JZGVuVHJ1c3QKIyBMYWJlbDogIklkZW5UcnVzdCBQdWJsaWMgU2VjdG9yIFJvb3QgQ0EgMSIKIyBTZXJpYWw6IDEzMjk4ODIxMDM0OTQ2MzQyMzkwNTIxOTc2MTU2ODQzOTMzNjk4CiMgTUQ1IEZpbmdlcnByaW50OiAzNzowNjphNTpiMDpmYzo4OTo5ZDpiYTpmNDo2Yjo4YzoxYTo2NDpjZDpkNTpiYQojIFNIQTEgRmluZ2VycHJpbnQ6IGJhOjI5OjQxOjYwOjc3Ojk4OjNmOmY0OmYzOmVmOmYyOjMxOjA1OjNiOjJlOmVhOjZkOjRkOjQ1OmZkCiMgU0hBMjU2IEZpbmdlcnByaW50OiAzMDpkMDo4OTo1YTo5YTo0NDo4YToyNjoyMDo5MTo2Mzo1NToyMjpkMTpmNToyMDoxMDpiNTo4Njo3YTpjYTplMToyYzo3ODplZjo5NTo4ZjpkNDpmNDozODo5ZjoyZgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRlpqQ0NBMDZnQXdJQkFnSVFDZ0ZDZ0FBQUFVVWp6MFo4QUFBQUFqQU5CZ2txaGtpRzl3MEJBUXNGQURCTgpNUXN3Q1FZRFZRUUdFd0pWVXpFU01CQUdBMVVFQ2hNSlNXUmxibFJ5ZFhOME1Tb3dLQVlEVlFRREV5RkpaR1Z1ClZISjFjM1FnVUhWaWJHbGpJRk5sWTNSdmNpQlNiMjkwSUVOQklERXdIaGNOTVRRd01URTJNVGMxTXpNeVdoY04KTXpRd01URTJNVGMxTXpNeVdqQk5NUXN3Q1FZRFZRUUdFd0pWVXpFU01CQUdBMVVFQ2hNSlNXUmxibFJ5ZFhOMApNU293S0FZRFZRUURFeUZKWkdWdVZISjFjM1FnVUhWaWJHbGpJRk5sWTNSdmNpQlNiMjkwSUVOQklERXdnZ0lpCk1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQzJJcFQ4cEVpdjZFZHJDdnNuZHVUeVA0bzcKZWtvc01TcU1qYkNwd3pGcnFIZDJoQ2EycklGQ0RRanJWVmk3ZXZpOFpYM3lvRzJMcUVmcFluWWVFZTRJRk5HeQpSQmIwNnRENkhpOWUyOHR6UWE2OEFMQktLMEN5ck9FN1M4SXRuZVNobSt3YU9oN3dDTFBRNUNRMUI1K2N0TWxTCmJkc0h5bysxVy9DRDgwL0hMYVhJcmN1VklLUXhLRmRZV3VTTkc1cXJuZzBNOGdvek9TSTVDcGN1ODFOM3VVUkYKL1lUTE5pQ0JXUzJhYjIxSVNHSEtUTjlUMGE5U3ZFU2ZxeTlyZzNMdmRZRGFCak1iWGNqYVk4Wk56YXhtTWMzUgozajZIRURiaHVhUjY3MkJRc3N2S3BsYmdONityTkJNNUplZzVadVNZZXFvU21KeFpab1krcmZHd3lqNEdEM3Z3CkVVczNvRVJ0ZTh1b2pISDAxYldSTnN6d0ZjWXIzbEVYc1pkTVVEMnhsVmw4QlgwdElkVUF2d0Zub2w1N3BsenkKOXlMeGtBMlQyNnBFVVdiTWZYWUQ2MnFvS2pnWmwzWU5hNHBoK2J6MjduYjljQ3ZkS1R6NENoNWJRaHlMVmk5VgpHeHloTHJYSEZ1YjRxanlTam1tMkFjRzFocDJKRHdzNGxGVG82dHllUFNXOFV5YnQxYXM1cXNWQVRGU3JzclRaCjJmalhjdHNjdkcyOVpWL3ZpRFVxWmkvdTlyTmw4RE9OZkpoQmFVWVBReHhwK3B1MTBHRnF6Y3BMMlV5UVJxc1YKV2FGSFZDa3VneWhmSE1LaXEzSVhBQWFPUmV5TDRqTTlmOW9aUk9SaWNzUGZJc2J5VnRUZFg1Vnk3VzFmOTBnRApXLzNGS3FEMmN5T0VFQnNCNXdJREFRQUJvMEl3UURBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvCkJBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVTQzSGdudGluUXRuYmNaRnJsSlBydzZQUkZLTXdEUVlKS29aSWh2Y04KQVFFTEJRQURnZ0lCQUVmNjNRcXdFWkU0clUxZDkrVU9sMVFaZ2tpSFZJeXFaSm5ZV3Y2SUFjVllwWm14STFRagp0Mm9kSUZmbEFXSkJGOU1KMjNYTGJsU1FkZjRhbjRFS3d0M1g5d25RVzNJVjVCNEphajB6OHlHYTVoVityVkhWCkRSRHRmVUxBais3QW1nalZRZFpjRGlGcGJvQmhEaFhBdU0vRlNSSlN6TDQ2ek5RdU9BWGVOZjBmYjdpQWFKZzkKVGFES1FHWFNjM3oxaTlrS2xUL1lQeU50R3RFcUpCblpoYk1YNzNodXFWalJJOVBIRSsxeUpYOWRzWE53MEg4Rwpsd21FS1lCaEhmcGUvM09zb09PSnVCeHhGY2JlTVg4UzNPRnRtNi9uNko5MWVFeXJSanVhenI4RkdGMU5GVHdXCm1obFFCSnF5bW05bGkxSmZQRmdFS0NYQVptRXhmcm5nZGJrYXFJSFdjaGV6eFFNeE5SRjRlS0xnNlRDTWY0RGYKV044OHVpZVc0b0EwYmVPWTAyUW5yRWgrS0hkY3hpVmhKZmlGREdYNnhESXZwWmdGNVBnTFp4WVd4b0s0TWhuNQorYmw1M0IvTjY2K3JEdDBiMjBYa2V1Y0M0cFZkL0dud1UybGhsWFY1QzE1VjVqZ2NsS2xaTTU3SWNYUjVmMUdKCnRzaHF1RERJYWpqRGJwN2hOeGJxQldKTVd4Skg3YWUwczFoV3gwbnpmeEpvQ1RGeDhHMzRUa2Y3MW9YdXhWaEEKR2FRZHAvbExRemZjYUZwUHordkNaSFRldEJYWjlGUlVHaThjMTVkeFZKQ08yU0NkVXl0L3E0L2k2akM4VURmdgo4VWUxZlh3c0JPeG9uYlJKUkJEMGNrc2NaT2Y4NW11UTNXbDlhZjBBVnFXM3JMYXR0OG8rQWUrYwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIgTz1FbnRydXN0LCBJbmMuIE9VPVNlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMvKGMpIDIwMDkgRW50cnVzdCwgSW5jLiAtIGZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgU3ViamVjdDogQ049RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIgTz1FbnRydXN0LCBJbmMuIE9VPVNlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMvKGMpIDIwMDkgRW50cnVzdCwgSW5jLiAtIGZvciBhdXRob3JpemVkIHVzZSBvbmx5CiMgTGFiZWw6ICJFbnRydXN0IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMiIKIyBTZXJpYWw6IDEyNDY5ODkzNTIKIyBNRDUgRmluZ2VycHJpbnQ6IDRiOmUyOmM5OjkxOjk2OjY1OjBjOmY0OjBlOjVhOjkzOjkyOmEwOjBhOmZlOmIyCiMgU0hBMSBGaW5nZXJwcmludDogOGM6ZjQ6Mjc6ZmQ6Nzk6MGM6M2E6ZDE6NjY6MDY6OGQ6ZTg6MWU6NTc6ZWY6YmI6OTM6MjI6NzI6ZDQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDQzOmRmOjU3Ojc0OmIwOjNlOjdmOmVmOjVmOmU0OjBkOjkzOjFhOjdiOmVkOmYxOmJiOjJlOjZiOjQyOjczOjhjOjRlOjZkOjM4OjQxOjEwOjNkOjNhOmE3OmYzOjM5Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFUGpDQ0F5YWdBd0lCQWdJRVNsT01LREFOQmdrcWhraUc5dzBCQVFzRkFEQ0J2akVMTUFrR0ExVUVCaE1DClZWTXhGakFVQmdOVkJBb1REVVZ1ZEhKMWMzUXNJRWx1WXk0eEtEQW1CZ05WQkFzVEgxTmxaU0IzZDNjdVpXNTAKY25WemRDNXVaWFF2YkdWbllXd3RkR1Z5YlhNeE9UQTNCZ05WQkFzVE1DaGpLU0F5TURBNUlFVnVkSEoxYzNRcwpJRWx1WXk0Z0xTQm1iM0lnWVhWMGFHOXlhWHBsWkNCMWMyVWdiMjVzZVRFeU1EQUdBMVVFQXhNcFJXNTBjblZ6CmRDQlNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVJQzBnUnpJd0hoY05NRGt3TnpBM01UY3kKTlRVMFdoY05NekF4TWpBM01UYzFOVFUwV2pDQnZqRUxNQWtHQTFVRUJoTUNWVk14RmpBVUJnTlZCQW9URFVWdQpkSEoxYzNRc0lFbHVZeTR4S0RBbUJnTlZCQXNUSDFObFpTQjNkM2N1Wlc1MGNuVnpkQzV1WlhRdmJHVm5ZV3d0CmRHVnliWE14T1RBM0JnTlZCQXNUTUNoaktTQXlNREE1SUVWdWRISjFjM1FzSUVsdVl5NGdMU0JtYjNJZ1lYVjAKYUc5eWFYcGxaQ0IxYzJVZ2IyNXNlVEV5TURBR0ExVUVBeE1wUlc1MGNuVnpkQ0JTYjI5MElFTmxjblJwWm1sagpZWFJwYjI0Z1FYVjBhRzl5YVhSNUlDMGdSekl3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLCkFvSUJBUUM2aExaeTI1NE1hK0taNlRBQnAzYnFNcmlWUVJySjJtRk9XSExQL3ZhQ2ViOXpZUVlLcFNmWXMxL1QKUlU0Y2N0Wk9Ndkp5aWcvM2d4blFhb0NBQUVVZXNNZm5tcjhTVnljY28yZ3ZDb2U5YW1zT1htWHpISGZWMUlXTgpjQ0cwc3pMbmk2TFZoamtDc2JqU1I4N2t5VW5FTzZmZSsxUjlWNzd3Nkc3Q2ViSTZDMVhpVUpnV01oTmNMM2hXCndjS1VzL0phNUNlYW55VFh4dXpRbXlXQzQ4ekN4RVhGakpkNkJtc3FFWitwQ201SU8yL2IxQkVaUXZlUEI3LzEKVTErY1B2UVhMT1pwckU0eVRHSjM2cmZvNWJzMHZCbUxycHhSNTdkK3RWT3hNeUxsYmM5d1BCcjY0cHRudG9QMApqYVd2WWt4TjRGaXNaRFFTQS9pMmpaUmpKS1J4QWdNQkFBR2pRakJBTUE0R0ExVWREd0VCL3dRRUF3SUJCakFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJScWNpWjYwQjd2ZmVjN2FWSFViSTJma0JKbXF6QU4KQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBZVo4ZGxzYTJlVDhpallmVGh3TUVZR3BybWk1WmlYTVJyRVBSOVJQLwpqVGtyd1BLOVQzQ01xUy9xRjhRTFZKN1VHNWFZTXp5b3JXS2lBSGFyV1dsdUJoMSt4TGxFalppdkV0Umgyd29aClJrZno2L2Rqd1VBRlFLWFN0L1MxbWphL3FZaDJpQVJWQkN1Y2gzOGFOengrTGFVYTJOU0pYc3E5ckQxczJHMnYKMWZOMkQ4MDdpRGdpbld5VG1zUTl2NEliWlQrbUQxMnEvT1d5RmNxMXJjYThQZENFNk9vR2NyQk5PVEo0dno0UgpuQXVrblpvaDgvQ2JDekI0MjhIY2gwUCt2R09heXNYQ0hNbkhqZjg3RWxnSTVyWTk3SG9zVHZ1RGxzNE1QR21IClZIT2tjOEtULzFFUXJCVlVBZGo4QmJHSm9YOTBnNXBKMTl4T2U0cEliNHRGOWc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxIE89RW50cnVzdCwgSW5jLiBPVT1TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2FsLXRlcm1zLyhjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seQojIFN1YmplY3Q6IENOPUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMSBPPUVudHJ1c3QsIEluYy4gT1U9U2VlIHd3dy5lbnRydXN0Lm5ldC9sZWdhbC10ZXJtcy8oYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkKIyBMYWJlbDogIkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMSIKIyBTZXJpYWw6IDUxNTQzMTI0NDgxOTMwNjQ5MTE0MTE2MTMzMzY5CiMgTUQ1IEZpbmdlcnByaW50OiBiNjo3ZToxZDpmMDo1ODpjNTo0OTo2YzoyNDozYjozZDplZDo5ODoxODplZDpiYwojIFNIQTEgRmluZ2VycHJpbnQ6IDIwOmQ4OjA2OjQwOmRmOjliOjI1OmY1OjEyOjI1OjNhOjExOmVhOmY3OjU5OjhhOmViOjE0OmI1OjQ3CiMgU0hBMjU2IEZpbmdlcnByaW50OiAwMjplZDowZTpiMjo4YzoxNDpkYTo0NToxNjo1Yzo1Njo2Nzo5MTo3MDowZDo2NDo1MTpkNzpmYjo1NjpmMDpiMjphYjoxZDozYjo4ZTpiMDo3MDplNTo2ZTpkZjpmNQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQytUQ0NBb0NnQXdJQkFnSU5BS2FMZVNrQUFBQUFVTkNSK1RBS0JnZ3Foa2pPUFFRREF6Q0J2ekVMTUFrRwpBMVVFQmhNQ1ZWTXhGakFVQmdOVkJBb1REVVZ1ZEhKMWMzUXNJRWx1WXk0eEtEQW1CZ05WQkFzVEgxTmxaU0IzCmQzY3VaVzUwY25WemRDNXVaWFF2YkdWbllXd3RkR1Z5YlhNeE9UQTNCZ05WQkFzVE1DaGpLU0F5TURFeUlFVnUKZEhKMWMzUXNJRWx1WXk0Z0xTQm1iM0lnWVhWMGFHOXlhWHBsWkNCMWMyVWdiMjVzZVRFek1ERUdBMVVFQXhNcQpSVzUwY25WemRDQlNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVJQzBnUlVNeE1CNFhEVEV5Ck1USXhPREUxTWpVek5sb1hEVE0zTVRJeE9ERTFOVFV6Tmxvd2diOHhDekFKQmdOVkJBWVRBbFZUTVJZd0ZBWUQKVlFRS0V3MUZiblJ5ZFhOMExDQkpibU11TVNnd0pnWURWUVFMRXg5VFpXVWdkM2QzTG1WdWRISjFjM1F1Ym1WMApMMnhsWjJGc0xYUmxjbTF6TVRrd053WURWUVFMRXpBb1l5a2dNakF4TWlCRmJuUnlkWE4wTENCSmJtTXVJQzBnClptOXlJR0YxZEdodmNtbDZaV1FnZFhObElHOXViSGt4TXpBeEJnTlZCQU1US2tWdWRISjFjM1FnVW05dmRDQkQKWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVTQXRJRVZETVRCMk1CQUdCeXFHU000OUFnRUdCU3VCQkFBaQpBMklBQklRVHlkQzZiVUY3NG16UTYxVmZaZ0lhSlBSYmlXbEg0N2pDZmZIeUFzV2ZvUFpiMVlzR0dZWlBVeEJ0CkJ5UW5vYUQ0MVVjWllVeDl5cE1uNm5RTTcyK1dDZjVqN0hCZE5xMW5kNjdKblh4VlJEcWlZMUVmOWVOaTFLbEgKQno3TUlLTkNNRUF3RGdZRFZSMFBBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwTwpCQllFRkxkajV4cmRqZWtJcGxXRHBPQnFVRUZsRVVKSk1Bb0dDQ3FHU000OUJBTURBMmNBTUdRQ01HRjUyT1ZDClI5OGNybE9aRjdadkhIM2h2eEdVMFFPSWRlU05pYVNLZDBiZWJXSHZBdlg3dGQvTS9rNy8vcW5tcHdJd1c1blgKaFRjR3RYc0kvZXNuaTBxVStlSDZwNDRtQ09oOGttaHRjOWh2SnF3aEFyaVp0eVpCV3lWZ3J0QklHdTRHCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1DRkNBIEVWIFJPT1QgTz1DaGluYSBGaW5hbmNpYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBTdWJqZWN0OiBDTj1DRkNBIEVWIFJPT1QgTz1DaGluYSBGaW5hbmNpYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBMYWJlbDogIkNGQ0EgRVYgUk9PVCIKIyBTZXJpYWw6IDQwNzU1NTI4NgojIE1ENSBGaW5nZXJwcmludDogNzQ6ZTE6YjY6ZWQ6MjY6N2E6N2E6NDQ6MzA6MzM6OTQ6YWI6N2I6Mjc6ODE6MzAKIyBTSEExIEZpbmdlcnByaW50OiBlMjpiODoyOTo0Yjo1NTo4NDphYjo2Yjo1ODpjMjo5MDo0Njo2YzphYzozZjpiODozOTo4Zjo4NDo4MwojIFNIQTI1NiBGaW5nZXJwcmludDogNWM6YzM6ZDc6OGU6NGU6MWQ6NWU6NDU6NTQ6N2E6MDQ6ZTY6ODc6M2U6NjQ6Zjk6MGM6Zjk6NTM6NmQ6MWM6Y2M6MmU6Zjg6MDA6ZjM6NTU6YzQ6YzU6ZmQ6NzA6ZmQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZqVENDQTNXZ0F3SUJBZ0lFR0VyTTFqQU5CZ2txaGtpRzl3MEJBUXNGQURCV01Rc3dDUVlEVlFRR0V3SkQKVGpFd01DNEdBMVVFQ2d3blEyaHBibUVnUm1sdVlXNWphV0ZzSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eQphWFI1TVJVd0V3WURWUVFEREF4RFJrTkJJRVZXSUZKUFQxUXdIaGNOTVRJd09EQTRNRE13TnpBeFdoY05Namt4Ck1qTXhNRE13TnpBeFdqQldNUXN3Q1FZRFZRUUdFd0pEVGpFd01DNEdBMVVFQ2d3blEyaHBibUVnUm1sdVlXNWoKYVdGc0lFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TVJVd0V3WURWUVFEREF4RFJrTkJJRVZXSUZKUApUMVF3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRRFhYV3ZORUQ4ZkJWblZCVTAzCnNRN3NtQ3VPRlIzNmswc1hnaUZ4RUZMWFVXUndGc0pWYVUyT0ZXMmZ2d3did3VDalo5WU1yTThpcnE5M1ZDcEwKVElwVFVuckQ3aTdlczNFbHdlbGRQZTZoTDZQM0tqekpJeDFxcXgyaHAvSHo3S0RWUk04VnozSXZIV09YNkpuNQovWk9rVklCTVV0UlNxeTVKMzVETnVGKytQOTZoeWswZzFDWG9oQ2xUdDdHSUgvLzYycENmQ3FrdFFUK3g4UmdwCjdoWlpMRFJKR3FnRzE2aUkwZ055ZWpMaTZtaE5iaXlXWlh2S1dmcnk0dDN1TUN6N3pFYXN4R1ByYjM4Mkt6UnoKRXBSLzM4d21udkZ5WFZCbFdZOXBzNGRlTW0vREdJcTFsWSt3ZWpmZVdrVTd4emJoNzJmUk9kT1hXM05pR1VndApoeHdHKzNTWUlFbHo4QVhTRzdHZ283Y2JjTk9JYWJsYTFqajBZdHdsaTNpLytPaCt1RnpKbFU5ZnB5MjVJR3ZQCmE5MzFEZlNDdC9TeVppNFFLUGFYV251V0ZvOEJHUzFzYm44NVdBWmtnd0dEZzhOTmt0MHl4b2VrTitrV3pxb3QKYUs4S2dXVTZjTUdiclUxdFZNb3FMVXVGRzdPQTVuQkZEV3RlTmZCL083aWM1QVJ3aVJJbGs5b0ttU0pnYW1OZwpUbllHbUU2OWc2MGRXSW9saGRMSFpSNHRqc2JmdHNiaGY0b0VJUlVwZFBBK25KQ2REQzd4aWo1YXFnd0pIc2ZWClBLUHRsOE1lTlBvNCtRZ080OEJkSzRQUlZtckp0cWhVVXk1NE1tYzlnbjkwMFB2aHRnVmd1WERiamd2NUUxaHYKY1dBUVVoQzV3VUVKNzNJZlp6RjQvNVlGalFJREFRQUJvMk13WVRBZkJnTlZIU01FR0RBV2dCVGovaTM5S05BTAp0YnEyb3NTL0Jxb0ZqSlA3THpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUJCakFkCkJnTlZIUTRFRmdRVTQvNHQvU2pRQzdXNnRxTEV2d2FxQll5VCt5OHdEUVlKS29aSWh2Y05BUUVMQlFBRGdnSUIKQUNYR3VtdnJoOHZlZ2ptV1BmQkVwMnVFY3dQZW5TdFB1aUIvdkhpeXo1ZXdHNXp6MTNrdTlVaTIwdnNYaU9iVAplai90VXhQUTRpOXFlY3NBSXlqbUhqZFhOWW1Fd25aUE5EYXRaOFBPUVFhSXhmZnUyQnE0MWd0L1VQK1RxaGRMCmpPenRVbUN5cEFicVR1djBheG45Ni9VYTRDVXFtdHpIUVRiM3lIUUZoRG1WT2RZTE82UW4rZ2pZWEI3NEJHQlMKRVNnb0EvL3ZVMllBcFVvMEZtWjgvUW1rcnA1bkdtOUJDMnNHRTV1UGhuRUZ0QytOaVdZektYWlVtaEg0Si9xeQpQNUhnemcwYjh6QWFyYjhpWFJ2VHZ5VUZUZUdTR24rWm56eEVrOHJVUUVsc2dJZlhCRHJETWxJMURsYjRwZDE5CnhJc05FUjlUeXg2eUY3Wm9kMXJnMU12SUI2NzFPaTZPTjdmUUFVdERLWGVNT1plUGdscjRVZVdKb0JqbmFIOWQKQ2k3N28wY09QYVlqZXNZQng0L0lYcjl0Z0ZhK2lpUzZNK3FmNFRJUm52SFNUNEQyRzBDdk9KNFJVSGx6RWhMTgo1bXlkTEloeVBEQ0JCcEVpNmxtdDJoa3VJc0tOdVl5SDRHYThjeU5mSVdSamdFajFvRHdZUFpUSVNFRWRRTHBlCi92NVdPYUhJejE2ZUdXUkdFTm9Ya2JjRmdLeUxtWko5NTZMWUJ3czJKK2RJZVdDS3c5Y1RYUGh5UU45S3k4K1oKQUFvQUN4R1YybFpGQTRnS24yZlExWG14cUkxQWJRM0Nla0Q2ODE5a1I1TExVN203V2M1UC9kQVZVd0hZMyt2Wgo1bmJ2MENPN082bDVzOVVDS2MySm81WVBTalhuVGtMQWRjMEh6K1lzNjNzdQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VFx4ZGNSS1RSVVNUIEVsZWt0cm9uaWsgU2VydGlmaWthIEhpem1ldCBTYVx1MDExZmxheVx1MDEzMWNcdTAxMzFzXHUwMTMxIEg1IE89VFx4ZGNSS1RSVVNUIEJpbGdpIFx1MDEzMGxldGlcdTAxNWZpbSB2ZSBCaWxpXHUwMTVmaW0gR1x4ZmN2ZW5saVx1MDExZmkgSGl6bWV0bGVyaSBBLlx1MDE1ZS4KIyBTdWJqZWN0OiBDTj1UXHhkY1JLVFJVU1QgRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhXHUwMTFmbGF5XHUwMTMxY1x1MDEzMXNcdTAxMzEgSDUgTz1UXHhkY1JLVFJVU1QgQmlsZ2kgXHUwMTMwbGV0aVx1MDE1ZmltIHZlIEJpbGlcdTAxNWZpbSBHXHhmY3ZlbmxpXHUwMTFmaSBIaXptZXRsZXJpIEEuXHUwMTVlLgojIExhYmVsOiAiVFx4ZGNSS1RSVVNUIEVsZWt0cm9uaWsgU2VydGlmaWthIEhpem1ldCBTYVx1MDExZmxheVx1MDEzMWNcdTAxMzFzXHUwMTMxIEg1IgojIFNlcmlhbDogMTU2MjMzNjk5MTcyNDgxCiMgTUQ1IEZpbmdlcnByaW50OiBkYTo3MDo4ZTpmMDoyMjpkZjo5MzoyNjpmNjo1Zjo5ZjpkMzoxNTowNjo1Mjo0ZQojIFNIQTEgRmluZ2VycHJpbnQ6IGM0OjE4OmY2OjRkOjQ2OmQxOmRmOjAwOjNkOjI3OjMwOjEzOjcyOjQzOmE5OjEyOjExOmM2Ojc1OmZiCiMgU0hBMjU2IEZpbmdlcnByaW50OiA0OTozNToxYjo5MDozNDo0NDpjMTo4NTpjYzpkYzo1Yzo2OTozZDoyNDpkODo1NTo1YzpiMjowODpkNjphODoxNDoxMzowNzo2OTo5Zjo0YTpmMDo2MzoxOTo5ZDo3OAotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUp6Q0NBdytnQXdJQkFnSUhBSTRYL2lRZ2dUQU5CZ2txaGtpRzl3MEJBUXNGQURDQnNURUxNQWtHQTFVRQpCaE1DVkZJeER6QU5CZ05WQkFjTUJrRnVhMkZ5WVRGTk1Fc0dBMVVFQ2d4RVZNT2NVa3RVVWxWVFZDQkNhV3huCmFTREVzR3hsZEduRm4ybHRJSFpsSUVKcGJHbkZuMmx0SUVmRHZIWmxibXhweEo5cElFaHBlbTFsZEd4bGNta2cKUVM3Rm5pNHhRakJBQmdOVkJBTU1PVlREbkZKTFZGSlZVMVFnUld4bGEzUnliMjVwYXlCVFpYSjBhV1pwYTJFZwpTR2w2YldWMElGTmh4SjlzWVhuRXNXUEVzWFBFc1NCSU5UQWVGdzB4TXpBME16QXdPREEzTURGYUZ3MHlNekEwCk1qZ3dPREEzTURGYU1JR3hNUXN3Q1FZRFZRUUdFd0pVVWpFUE1BMEdBMVVFQnd3R1FXNXJZWEpoTVUwd1N3WUQKVlFRS0RFUlV3NXhTUzFSU1ZWTlVJRUpwYkdkcElNU3diR1YwYWNXZmFXMGdkbVVnUW1sc2FjV2ZhVzBnUjhPOApkbVZ1YkduRW4ya2dTR2w2YldWMGJHVnlhU0JCTHNXZUxqRkNNRUFHQTFVRUF3dzVWTU9jVWt0VVVsVlRWQ0JGCmJHVnJkSEp2Ym1scklGTmxjblJwWm1scllTQklhWHB0WlhRZ1UySEVuMnhoZWNTeFk4U3hjOFN4SUVnMU1JSUIKSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXBDVVo0V1dlNjBnaFVFb0k1Ukh3V3JvbQovNE5aemtRcUwvN2h6bUFEL0kwRHBlMy9hNmk2ekRRR24xazE5dXdzdTUzN2pWSnA0NXduRUZQenBBTEZwL2tSCkdtbDFic01kaTlHWWpaT0hwM0dYRFNISG1mbFMweXhqWFZXODZCOEJTTGxnL2tKSzlzaUFyczFtZXA1RmltaDMKNGtob242TGE4ZUhCRUovclBDbUJwK0V5Q05TZ0JiR00rNDJXQUE0K0pkOVRoaUk3L1BTOTh3bCtkK3lHNnc4ego1VU5QOUZSMWJTbVpMbVphUTkvTFhNckk1VGp4ZmpzMW5RLzB4VnFoelBNZ2dDVFRWK3dWdW5VbG0raGtTN00wCmhPOEV1UGJKYktvQ1ByWlY0akkzWC94bWwxL04xcDdISUw5Tnhxdy9kVjhjN1RLY2ZHa0FhWkhqSXhoVDZRSUQKQVFBQm8wSXdRREFkQmdOVkhRNEVGZ1FVVnBrSEh0T3NER2xrdEF4UVI5NURMTDRnd1Bzd0RnWURWUjBQQVFILwpCQVFEQWdFR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFKNUZkbnNYClNETHlPSXNwdmU2V1NrNkJHTEZSUnlETjBHU3hEc25aQWRrSnpzaVozR2dsRTlSYzhxUG9CUDV5Q2NjTHFoMGwKVlg2V21sZTN1c1VSZWhubXAzNDloUTcxK1M0cEwrZjViRmdXVjFBbDlqNHVQcXJ0ZDNHcXFwbVdSZ3F1anV3cQpVUmF3WHMzcVp3UWNXREQxWUlxOXByMU41WmEwL0VLSkFXdjJjTWhRT1F3dDFXYlp5Tkt6TXJjYkdXM0xNL25mCnBlWVZoRGZ3d3ZKbGxwS1FkL0N0OUpEcEVYalhrNG5BUFF1NktmVG9tWjF5anUyZEwrNlNmYUh4LzEyNk0yQ0YKWXY0SEFxR0VWa2ErbGdxYUU5Y2hUTGQ4QjU5T1RqK1JkUHNublJITTNlYXh5bkZORXhjNUpzVXBJU3VUS1dxVworcXRCNFV1Mk5RdkFteFU9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1DZXJ0aW5vbWlzIC0gUm9vdCBDQSBPPUNlcnRpbm9taXMgT1U9MDAwMiA0MzM5OTg5MDMKIyBTdWJqZWN0OiBDTj1DZXJ0aW5vbWlzIC0gUm9vdCBDQSBPPUNlcnRpbm9taXMgT1U9MDAwMiA0MzM5OTg5MDMKIyBMYWJlbDogIkNlcnRpbm9taXMgLSBSb290IENBIgojIFNlcmlhbDogMQojIE1ENSBGaW5nZXJwcmludDogMTQ6MGE6ZmQ6OGQ6YTg6Mjg6YjU6Mzg6Njk6ZGI6NTY6N2U6NjE6MjI6MDM6M2YKIyBTSEExIEZpbmdlcnByaW50OiA5ZDo3MDpiYjowMTphNTphNDphMDoxODoxMToyZTpmNzoxYzowMTpiOTozMjpjNTozNDplNzo4ODphOAojIFNIQTI1NiBGaW5nZXJwcmludDogMmE6OTk6ZjU6YmM6MTE6NzQ6Yjc6M2M6YmI6MWQ6NjI6MDg6ODQ6ZTA6MWM6MzQ6ZTU6MWM6Y2I6Mzk6Nzg6ZGE6MTI6NWY6MGU6MzM6MjY6ODg6ODM6YmY6NDE6NTgKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZrakNDQTNxZ0F3SUJBZ0lCQVRBTkJna3Foa2lHOXcwQkFRc0ZBREJhTVFzd0NRWURWUVFHRXdKR1VqRVQKTUJFR0ExVUVDaE1LUTJWeWRHbHViMjFwY3pFWE1CVUdBMVVFQ3hNT01EQXdNaUEwTXpNNU9UZzVNRE14SFRBYgpCZ05WQkFNVEZFTmxjblJwYm05dGFYTWdMU0JTYjI5MElFTkJNQjRYRFRFek1UQXlNVEE1TVRjeE9Gb1hEVE16Ck1UQXlNVEE1TVRjeE9Gb3dXakVMTUFrR0ExVUVCaE1DUmxJeEV6QVJCZ05WQkFvVENrTmxjblJwYm05dGFYTXgKRnpBVkJnTlZCQXNURGpBd01ESWdORE16T1RrNE9UQXpNUjB3R3dZRFZRUURFeFJEWlhKMGFXNXZiV2x6SUMwZwpVbTl2ZENCRFFUQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQU5UTUNRb3NQNUwyCmZ4U2VDNXlhYWgxQU1HVDlxdDhPSGdaYm4xQ0Y2czJOcTBObjNyRDZmb0NXbm9SNGtralc0em51enVSWldKZmwKTGllWTZwT29kNXRLOE85MGdDM3JNQisxMmNlQW5HSW5rWWp3U29uZDNJam1GUG5WQXkvL2xkdTluK3dzK2hRVgpXWlVLeGtkOGFSaTVwd1A1eW5hcHo4ZHZ0RjRGL3U3QlVySjFNb2ZzN1NsbU8vTktGb0wyMXByYmNwanAzdkRGClRLV3J0ZW9CNG93dVpIOWtiLzJqSlpPTHlLSU9TWTAwOEIvc1dFVXVOS3FFVUwzbnNrb1R1TEFQcmpoZHNLa2IKNW5QSldxSFpaa0NxcVUybU5BS3RoSDZ5SThIN0tzWm45RFMyc0pWcU0wOXhSTFd0d0hremlPQy83YU9nRkxTYwpDYkFLNDJDKytQaG1pTTFiOFhjRjRMVnpic0Y5Umk2T1N5ZW16VFVLL2VWTmZhb3FveW5IV21nRTZPWFdrNlJpCndzWG05RS9HK1o4YWpZSkpHWXJLV1VNNjZBMHl3ZlJNRXdOdmJxWS9rWFBMeW5OdkVpQ0w3c0NDZU41TExzSkoKd3gzdEZ2WWs5Q2NiWEZjeDNGWHVxQjV2Ykt6aVJjeFhWNHAxVnhuZ3RWaVpTVFl4UERNQmJSWkt6YmdxZzRTRwptL2xnMGg5dGtRUFRZS2JWUFpyZGQ1QTlOYVNmRDE3MVVrUnB1Y0M2M005OTMzelp4S3lHSWpLOGUydVI3M3I0CkYyaXc0bE5WWUMydlBzS0QyTmtKSy9EQVpOdUhpNUhNa2VzRS9YYTBsWnJtRkFZYjFUUWR2dGovZEJ4VGhabmcKV1ZKS1llMklubXRKaVVaK0lGclo1MHJsYXU3U1pSRkRBZ01CQUFHall6QmhNQTRHQTFVZER3RUIvd1FFQXdJQgpCakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlR2a1V6MXBjTXc2QzhJNnROeElxU1NhSGgwCjJUQWZCZ05WSFNNRUdEQVdnQlR2a1V6MXBjTXc2QzhJNnROeElxU1NhSGgwMlRBTkJna3Foa2lHOXcwQkFRc0YKQUFPQ0FnRUFmajFVMmlKZEdsZytPMVFudXJyTXlPTWFhdW8rK1JMclZsODlVTTdnNmtnbUpzOTVWbjZSSEprLwowS0dSSEN3UFQ1aVZXVk85MENMWWlGMmNOL3o3Wk1GNGpJdWFZQW5xMWZvaFg5QjBaZWRReGI4dXVRc0xyYld3CkY2WVNqTlJpZU9wV2F1d0swa0REUEFVd1BrMlV0NTlLQTlOOUowdTIva1RPK2hrekdtMmtRdEhkek1qSTF4WlMKZzA4MWxMTVNWWDNsNGtMcjVKeVRDY0JNV3dlcngyMFJvRkFYbENPb3RRcVNEN0o2d1dBc09Nd2FwbHYvOGd6agpxaDhjM0xpZ2t5ZmVZK04vSVo4NjVaNzY0Qk5xZGV1V1hHS1JsSTVuVTdhSitCSUp5MjlTV3dOeWhsQ1ZDTlNOCmg0WVZINVVrMktSdm1zNmtuWnR0MHJKMkJvYkdWZ2pGNnduYU5zSWJXMEcrWVNyamNPYTRwdmkyV3NTOUlmZi8KcWwraGJIWTVadGJxVEZYaEFET2JFNWhqeVcvUUFTQUpOMUxuREU4K3piejFYNVlucHlBQ2xlQXU2QWRCQlI4VgpidGF3NUJuZ0R3S1RBQ2R5eFl2UlZCOWRTc05BbDM1VnBuekJNd1FVQVIxSklHa0xHWk9kYmxnaTkwQU1SZ3dqClkvTTUwbjkyVWFmMHlLSHhESFlpSTBaU0tTM2lvMEVIVm1tWTBnVUp2R25IV21ITmo0RmdGVTJBM1pEaWZjUlEKOG93N2Jrckh4dWFBS3p5QnZCR0FGaEFuMS9ETlAzbk1jeXJEZmxPUjFtNzQ5ZlBIMEZGTmprdWxXK1laRnp2VwpnUW5jSXR6dWpybkVqMVBoWjdzenVJZ1ZScy90YVRYL2RRMUc4ODV4NGNWcmhrSUd1VUU9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1PSVNURSBXSVNlS2V5IEdsb2JhbCBSb290IEdCIENBIE89V0lTZUtleSBPVT1PSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkCiMgU3ViamVjdDogQ049T0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQSBPPVdJU2VLZXkgT1U9T0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZAojIExhYmVsOiAiT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQSIKIyBTZXJpYWw6IDE1Nzc2ODU5NTYxNjU4ODQxNDQyMjE1OTI3ODk2Njc1MDc1NzU2OAojIE1ENSBGaW5nZXJwcmludDogYTQ6ZWI6Yjk6NjE6Mjg6MmU6Yjc6MmY6OTg6YjA6MzU6MjY6OTA6OTk6NTE6MWQKIyBTSEExIEZpbmdlcnByaW50OiAwZjpmOTo0MDo3NjoxODpkMzpkNzo2YTo0Yjo5ODpmMDphODozNTo5ZTowYzpmZDoyNzphYzpjYzplZAojIFNIQTI1NiBGaW5nZXJwcmludDogNmI6OWM6MDg6ZTg6NmU6YjA6Zjc6Njc6Y2Y6YWQ6NjU6Y2Q6OTg6YjY6MjE6NDk6ZTU6NDk6NGE6Njc6ZjU6ODQ6NWU6N2I6ZDE6ZWQ6MDE6OWY6Mjc6Yjg6NmI6ZDYKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR0VENDQXAyZ0F3SUJBZ0lRZHJFZ1VuVHdoWWRHcy9nakd2YkN3REFOQmdrcWhraUc5dzBCQVFzRkFEQnQKTVFzd0NRWURWUVFHRXdKRFNERVFNQTRHQTFVRUNoTUhWMGxUWlV0bGVURWlNQ0FHQTFVRUN4TVpUMGxUVkVVZwpSbTkxYm1SaGRHbHZiaUJGYm1SdmNuTmxaREVvTUNZR0ExVUVBeE1mVDBsVFZFVWdWMGxUWlV0bGVTQkhiRzlpCllXd2dVbTl2ZENCSFFpQkRRVEFlRncweE5ERXlNREV4TlRBd016SmFGdzB6T1RFeU1ERXhOVEV3TXpGYU1HMHgKQ3pBSkJnTlZCQVlUQWtOSU1SQXdEZ1lEVlFRS0V3ZFhTVk5sUzJWNU1TSXdJQVlEVlFRTEV4bFBTVk5VUlNCRwpiM1Z1WkdGMGFXOXVJRVZ1Wkc5eWMyVmtNU2d3SmdZRFZRUURFeDlQU1ZOVVJTQlhTVk5sUzJWNUlFZHNiMkpoCmJDQlNiMjkwSUVkQ0lFTkJNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQTJCZTMKSEVva0t0YVhzY3JpSHZ0OU9PK1k5Ykk1bUU0bnVCRmRlOUlsbElpQ0ZTWnFHekc3cUZzaElTdllEMDZmV3ZHeApXdVI1MWpJaksrRlR6SmxGWEh0UHJieS9oMG9MUzVkYXFQWkk3SDE3RGMwaEJ0K2VGZjFCaWtpM0lQU2hlaHRYCjFGMVEvN3BuMkNPWkg4Zy80OTcvYjF0M3NXdHV1TWxrOStIS1FVWU9LWEhRdVNQOHlZRmZUdmR2MzcrRXJYTmsKdTdkQ2ptbjIxSFlkZnAybnVGZUtVV2R5MTlTb3VKVlVRSE1EOXVyMDYvNG9RbmMvblNNYnNyWTlnQlFIVEM1UAo5OVVLRmcyOVprTTNmaU5EZWNOQWh2Vk1LZHFPbXEwTnBRU0hpQjZGNCtsVDFadklpd05qZU92Z0dVcHV1eTlyCk0yUllrNjFwdjQ4Yjc0Skl4d0lEQVFBQm8xRXdUekFMQmdOVkhROEVCQU1DQVlZd0R3WURWUjBUQVFIL0JBVXcKQXdFQi96QWRCZ05WSFE0RUZnUVVOUS9JTm1OZTRxUHMrVHRtRmM1UlV1T1JtajB3RUFZSkt3WUJCQUdDTnhVQgpCQU1DQVFBd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFFQk0rNGV5bVlHUWZwM0ZzTEFtelloN0t6S05icmdoCmNWaVhmYTQzRks4KzUvZWE0bjMyY1ppWkJLcERkSGlqNDBsaFBuT01UWlRnK1hIRXRoWU9VM2dmMXFLSEx3STUKZ1NrOHJ4V1lJVEQrS0pBQWpOSGh5L3BleVAzNEVFWTdvbmhDa1JkMFZRcmVVR2ROWnRHbi8vM1p3TFdvbzRyTwpadlVQUTgybksxZDdZMFpxcWk1UzJQVHQ0VzJ0S1pCNFNMcmhJNnFqaWV5MXE1YkF0RXVpSFplZWV2SnVRSEhmCmFQRmxUYzU4QmQ5VFphbWw4TEdYQkhBVlJnT1kxTksvVkxTZ1dIMVNiOXBXSm1MVTJOdUpNVzhjOENMQzAySWMKTmMxTWFSVlVHcENZM3VzZVg4cDN4OHVPUFVOcG5KcFkwQ1E3M3h0QWxuNDFyWUhIVG5HNmlCTT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVNaQUZJUiBST09UIENBMiBPPUtyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4KIyBTdWJqZWN0OiBDTj1TWkFGSVIgUk9PVCBDQTIgTz1LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuCiMgTGFiZWw6ICJTWkFGSVIgUk9PVCBDQTIiCiMgU2VyaWFsOiAzNTcwNDMwMzQ3NjcxODY5MTQyMTcyNzczNDQ1ODczODY3NDMzNzc1NTgyOTYyOTIKIyBNRDUgRmluZ2VycHJpbnQ6IDExOjY0OmMxOjg5OmIwOjI0OmIxOjhjOmIxOjA3OjdlOjg5OjllOjUxOjllOjk5CiMgU0hBMSBGaW5nZXJwcmludDogZTI6NTI6ZmE6OTU6M2Y6ZWQ6ZGI6MjQ6NjA6YmQ6NmU6Mjg6ZjM6OWM6Y2M6Y2Y6NWU6YjM6M2Y6ZGUKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGExOjMzOjlkOjMzOjI4OjFhOjBiOjU2OmU1OjU3OmQzOmQzOjJiOjFjOmU3OmY5OjM2OjdlOmIwOjk0OmJkOjVmOmE3OjJhOjdlOjUwOjA0OmM4OmRlOmQ3OmNhOmZlCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEY2pDQ0FscWdBd0lCQWdJVVBvcGRCK3hWMGpMVnQrTzJYd0hyTGR6azF1UXdEUVlKS29aSWh2Y05BUUVMCkJRQXdVVEVMTUFrR0ExVUVCaE1DVUV3eEtEQW1CZ05WQkFvTUgwdHlZV3B2ZDJFZ1NYcGlZU0JTYjNwc2FXTjYKWlc1cGIzZGhJRk11UVM0eEdEQVdCZ05WQkFNTUQxTmFRVVpKVWlCU1QwOVVJRU5CTWpBZUZ3MHhOVEV3TVRrdwpOelF6TXpCYUZ3MHpOVEV3TVRrd056UXpNekJhTUZFeEN6QUpCZ05WQkFZVEFsQk1NU2d3SmdZRFZRUUtEQjlMCmNtRnFiM2RoSUVsNlltRWdVbTk2YkdsamVtVnVhVzkzWVNCVExrRXVNUmd3RmdZRFZRUUREQTlUV2tGR1NWSWcKVWs5UFZDQkRRVEl3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQzN2RDVRcUV2TgpRTFhPWWVlV3lyU2gyZ3dpc1BxMWUzWUFkNHdMejMyb2hzd21VZVFnUFlVTTFsamo1L1FxR0ozYTBhNG03dXRUCjNQU1ExaE5LREpBOHcvVGEwbzROa2pyY3NiSC9PTjdEdWkxZmdMa0N2VXFkR3crMHc4TEJad1BkM0J1Y1BiT3cKM2dBZXFEUkh1NXJyL2dzVXZUYUUyZzBndi9wYnk2a1dJSzA1WU80dmRiYm5sNXo1UHYxK1RXOU5MKytJRFdyNgozZkU5YmlDbG9CSzBUWEM1enRkeU80bVRwNENFSENkSmNrbTEvenVWbnNITXlBSHM2QTZLQ3BibnM2YUg1ZGI1CkJTc05sMEJ3UExxc2RWcWMxVTJkQWdyU1M1dG1TMFlIRjJXdG4yeUlBTndpaWVEaFpOUm52REY1WVR5N3lrSE4KWEdvQXlEdzRqbGl2QWdNQkFBR2pRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRRApBZ0VHTUIwR0ExVWREZ1FXQkJRdUZxbEtHTFhMelBWdlVQTWpYL2hkNTZ6d3lEQU5CZ2txaGtpRzl3MEJBUXNGCkFBT0NBUUVBdFhQNEE5eFpXeDEyNmFNcWU1QW9zazNBTTArcW1ySFV1T1FuLzZtV21jNUc0RzE4VEtJNHBBWncKOFBSQkVldy9SNDAvY29mNU8vMmtieXRUQU9EL09ibHFCdzdySFJ6Mm9uS1F5NEk5RVlLTDBydWZLcThoNW1PRwpuWGtaNy9lN0REV1F3NHJ0VHcvMXpCTFpwRDY3b1B3Z2xWOVBKaThSSTROT2RRY1B2NXZSdEIzcEVBVCt5bUNQCm9reTRyYy9oa0EvTnJnckhYWHUzVU5MVVlmclZGZHZYbjRkUlZPdWw0K3ZKaGFBbElEZjdqczRNTklUaFBJR3kKZDA1RHBZaGZobWVoUGVhMFhHRzJQdHYrdHlqRm9nZXV0Y3JLalNvUzc1ZnR3akNreVNwNisvTk5JeHVaTXpTZwpMdldwQ3ovVVhlSFBoSi9pR2NKZml0WWdIdU56dHc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049Q2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyIE89VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLiBPVT1DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKIyBTdWJqZWN0OiBDTj1DZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBIDIgTz1Vbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuIE9VPUNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQojIExhYmVsOiAiQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyIgojIFNlcmlhbDogNDQ5Nzk5MDAwMTcyMDQzODMwOTk0NjM3NjQzNTc1MTI1OTY5NjkKIyBNRDUgRmluZ2VycHJpbnQ6IDZkOjQ2OjllOmQ5OjI1OjZkOjA4OjIzOjViOjVlOjc0OjdkOjFlOjI3OmRiOmYyCiMgU0hBMSBGaW5nZXJwcmludDogZDM6ZGQ6NDg6M2U6MmI6YmY6NGM6MDU6ZTg6YWY6MTA6ZjU6ZmE6NzY6MjY6Y2Y6ZDM6ZGM6MzA6OTIKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGI2Ojc2OmYyOmVkOmRhOmU4Ojc3OjVjOmQzOjZjOmIwOmY2OjNjOmQxOmQ0OjYwOjM5OjYxOmY0OjllOjYyOjY1OmJhOjAxOjNhOjJmOjAzOjA3OmI2OmQwOmI4OjA0Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGMGpDQ0E3cWdBd0lCQWdJUUlkYlFTazhsRDhreU4veXFYaEtONlRBTkJna3Foa2lHOXcwQkFRMEZBRENCCmdERUxNQWtHQTFVRUJoTUNVRXd4SWpBZ0JnTlZCQW9UR1ZWdWFYcGxkRzhnVkdWamFHNXZiRzluYVdWeklGTXUKUVM0eEp6QWxCZ05WQkFzVEhrTmxjblIxYlNCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEVrTUNJRwpBMVVFQXhNYlEyVnlkSFZ0SUZSeWRYTjBaV1FnVG1WMGQyOXlheUJEUVNBeU1DSVlEekl3TVRFeE1EQTJNRGd6Ck9UVTJXaGdQTWpBME5qRXdNRFl3T0RNNU5UWmFNSUdBTVFzd0NRWURWUVFHRXdKUVRERWlNQ0FHQTFVRUNoTVoKVlc1cGVtVjBieUJVWldOb2JtOXNiMmRwWlhNZ1V5NUJMakVuTUNVR0ExVUVDeE1lUTJWeWRIVnRJRU5sY25ScApabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNU1F3SWdZRFZRUURFeHREWlhKMGRXMGdWSEoxYzNSbFpDQk9aWFIzCmIzSnJJRU5CSURJd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUM5K1hqNDV0V0EKREdTZGhodVdaR2MvSWpvZWRRRjk3L3RjWjR6SnpGeHJxWkhtdVVMbElFdWIycHQ3dVpsZDJadUFTOWVFUUNzbgowK2k2TUxzK0NScW5TWlh2SzBBa3dwZkhwKzZiSmUrb0NnQ1hoVnFxbmR3cHllSTFCK3R3VFVyV3diTld1S0ZCCk9KdlIrekYvaitCZjRiRS9ENDRXU1dEWEJvMFkrYW9tRUtzcTA5RFJaNDBiUnI1SE1OVXVjdEhGWTlyblkzbEUKZmt0akpJbUdMalEvS1V4U2l5cW53T0tSS0ltNXdGdjVIZG5uSjYzL21nS1h3Y1pRa3BzQ0xMMnB1VFJaQ3IrRQpTdi9mL3JPZjY5bWU0SmdqN0tacmR4WXEyOHl0T3h5a2g5eEdjMTRaWW1oRlYrU1Fna0s3UXRid1llREJvejFtCm8xMzBHTzZJeVkwWFJTbVpNblVDTWU0cEpzaHJBdWExWWtWL054VmFJMmlKMUQ3ZVRpZXc4RUFNdkUwWHkwMmkKc3g3UUJscmQ5cFBQVjNXWjlmcUdHbWQ0czcrVy9qVGN2ZWRTVnVXejVYVjcxMEdSQmR4ZGFlT1ZEVU81L0lPVwpPWlY3YklCYVR4Tnl4dGQ5S1hwRXVsS2tLdFZCUmdrZy9pS2d0bHN3amJ5SkROWFhjUGlIVXYzYTc2eFJMZ2V6ClR2N1FDZHB3NzVqNlZ1WnQyN1ZYUzl6bExDVVZ5SjR1ZUU3NDJweWVoaXpLVi9NYTVjaVNpeHFDbG5yRHZGQVMKYWRnT1drYUxPdXNtK2lQSnRyQ0J2a0lBcFBqVy9qQXV4OUpHOXVXT2RmM3l6TG5RaDF2TUJoQmd1NE0xdDE1bgoza2ZzbVVqeHBLRVYvcTJNWW80NVZVODVGcm14WTUzL3R3SURBUUFCbzBJd1FEQVBCZ05WSFJNQkFmOEVCVEFECkFRSC9NQjBHQTFVZERnUVdCQlMyb1ZRNUFzT2dQNDZLdlByVStCeW0wVG9PL1RBT0JnTlZIUThCQWY4RUJBTUMKQVFZd0RRWUpLb1pJaHZjTkFRRU5CUUFEZ2dJQkFIR2xEczdrNmI4L09OV0pXc1FDWWZ0TXhSUVhMWXRQVTJzUQpGL3hsaE1jUVNaRGUyOGNtazRnbWIzRFdBbDQ1b1BlUHE1YTFwUk5jZ1JSdERvR0NFUnVLVHNaUHBkMWlIa1RmCkNWbjBXM2NMTittTElNYjRDazR1V0J6ck05RFBobURKMnZ1QUw1NU1ZSVI0UFNGazF2dEJIeGdQNThsMWNiMjkKWE40MGh6NUJzQTcydWRZL0NST1dGQy9lbWgxYXVWYk9OVHF3WDNCTlh1TXA4U01vY2xtMnE4S01aaVljZHl3bQpkaldMS0tkcG9Qazc5U1BkaFJCMHlaQURWcEhucjdwSDFCS1hFU0xqb2ttVWJPZTNsRXU2TGFUYU00dE1wa1QvCldqekdIV1RZdFRIa3BqeDZxRmNMMisxaEdzdnh6bk4zWTZTSGIweFJPTmJrWDhlZnRvRXE1SVZJZVZoZU8vamIKQW9KbndUbmJ3M1JMUFRZZStTbVRpR2hicUVRWklmQ242SUVOTE9pVE5yUTNzc3F3R3laNm1pVWZtcHFBbmtzcQpQL3VqbXY1ek1uSENuc1p5NFlwb0ovSGtEN1RFVEtWaGsvaVhFQWNxTUNXcHVjaHh1TzlvekMxKzllQitENEtvCmI3YTZiSU5EZDgyS2toZWhubHQ0RmoxRjRqTnkzZUZteXBuVHljVW0vUTFvQkVhdXR0bWJqTDRadnJIRzhobmoKWEFMS0xOaHZTZ2ZaeVRYYVFIWHl4S2NaYjU1Q0VKaDE1cFdMWUx6dHhSTFhpczdWbUZ4V2xnUEY3bmNHTmYvUAo1TzQvRTJIdTI5b3RoZkROcnAyeUdBbEZ3NUtoY2hmOFI3YWdDeXp4eE41RGFBaHFYenZ3ZG1QN3pBWXNwc2JpCkRyVzV2aVNQCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1IZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDE1IE89SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkKIyBTdWJqZWN0OiBDTj1IZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDE1IE89SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkKIyBMYWJlbDogIkhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUiCiMgU2VyaWFsOiAwCiMgTUQ1IEZpbmdlcnByaW50OiBjYTpmZjplMjpkYjowMzpkOTpjYjo0YjplOTowZjphZDo4NDpmZDo3YjoxODpjZQojIFNIQTEgRmluZ2VycHJpbnQ6IDAxOjBjOjA2Ojk1OmE2Ojk4OjE5OjE0OmZmOmJmOjVmOmM2OmIwOmI2Ojk1OmVhOjI5OmU5OjEyOmE2CiMgU0hBMjU2IEZpbmdlcnByaW50OiBhMDo0MDo5Mjo5YTowMjpjZTo1MzpiNDphYzpmNDpmMjpmZjpjNjo5ODoxYzplNDo0OTo2Zjo3NTo1ZTo2ZDo0NTpmZTowYjoyYTo2OToyYjpjZDo1Mjo1MjozZjozNgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJR0N6Q0NBL09nQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFzRkFEQ0JwakVMTUFrR0ExVUVCaE1DUjFJeApEekFOQmdOVkJBY1RCa0YwYUdWdWN6RkVNRUlHQTFVRUNoTTdTR1ZzYkdWdWFXTWdRV05oWkdWdGFXTWdZVzVrCklGSmxjMlZoY21Ob0lFbHVjM1JwZEhWMGFXOXVjeUJEWlhKMExpQkJkWFJvYjNKcGRIa3hRREErQmdOVkJBTVQKTjBobGJHeGxibWxqSUVGallXUmxiV2xqSUdGdVpDQlNaWE5sWVhKamFDQkpibk4wYVhSMWRHbHZibk1nVW05dgpkRU5CSURJd01UVXdIaGNOTVRVd056QTNNVEF4TVRJeFdoY05OREF3TmpNd01UQXhNVEl4V2pDQnBqRUxNQWtHCkExVUVCaE1DUjFJeER6QU5CZ05WQkFjVEJrRjBhR1Z1Y3pGRU1FSUdBMVVFQ2hNN1NHVnNiR1Z1YVdNZ1FXTmgKWkdWdGFXTWdZVzVrSUZKbGMyVmhjbU5vSUVsdWMzUnBkSFYwYVc5dWN5QkRaWEowTGlCQmRYUm9iM0pwZEhreApRREErQmdOVkJBTVROMGhsYkd4bGJtbGpJRUZqWVdSbGJXbGpJR0Z1WkNCU1pYTmxZWEpqYUNCSmJuTjBhWFIxCmRHbHZibk1nVW05dmRFTkJJREl3TVRVd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUMKQVFEQytLay9HNG44UER3RVhUMlFOckNST25rOFpscnZiVGtCU1JxMHQ4OS9UU05UdDVBQTR4TXFLS1l4OFpFQQo0eWpzcmlGQnpoL2EvWDBTV3dHREQ3bXdYNW5oOGhLRGdFMEdQdCtzcitlaGlHc3hyL0NMMEJnenVOdEZhalQwCkFvQWtLQW9DRlpWZWRpb05tVG9VVy9iTHkxTzhFMDBCaURlVUpSdEN2Q0xZanFPV1hqclpNdHMrNlBBUVplMTAKNFMrbmZLOG5OTHNwZlp1Mnp3bkk1ZE1LL0lobFpYUUszSE1jWE0xQXNSelV0b1NNVEZEUGFJNm9XYTdDSjA2QwpvalhkRlBRZi83SjMxWWN2cW01OUpDZm54c3NtNXVYK1p3ZGoyRVVOM1RwWlpUbFllcEtaY2oyY2hGNklJYmpWCjlDejgyWEJTVDNpNHZUd3JpNVdZOWJQUmFNOGdGSDVNWEYvbmkrWDFOWUVaTjljUkNMZG12dE5Lem9OWEFEckQKZ2ZnWHk1STJYZEdqMkhVYjRZc242bnBJUWYxRkdRYXRKNWxPd1hCSDNiV2ZnVk1TNWJHTVNGMHhReGZqak1aNgpZNVpMS1RCT2hFNWlHVjQ4enBlUXBYOEI2NTNnK0l1SjNTV1lQWksyZnUvWjhWRlJmUzBteUdsWlllQ3NhcmdxCk5oRUVlbEM5TW9TK0w5eHkxZGNkRmtma1IyWWdQL1NXeGErT0FYcWxEM3BrOVEwWWg5bXVpTlg2aE1FNndHa28KTGZJTmFGR3E0NlYzeHFTUURxRTNpekVqUjhFSkNPdHU5M2liMTRMOGhDQ1pTUm0yRWtheCswVlZGcW1qWmF5YwpCdy9xYTl3ZkxnWnk3SWFJRXVRdDIxOEZMK1R3QTlNbU0rZUF3czFDb1JjMEN3SURBUUFCbzBJd1FEQVBCZ05WCkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQkJqQWRCZ05WSFE0RUZnUVVjUlZueU1qSnZYVmQKY3RBNEdHcWQ4M0VrVkFzd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dJQkFIVzdiVlJMcWhCWVJqVHlZdGNXTmwwSQpYdFZzeUllOXRDNUc4akg0Zk9wQ3RaTVdWZHloREJLZzJtRitEMWhZYzJSeXgraEZqdHlwOGlZL3hubU1zVk1JCk00R3dWaE8rNWxGYzJKc0tUMHVjVmxNQzZVLzJEV0RxVFVKVjZId2JJU0hUR3pyTWQvSzRrUEZveC9sYS92b3QKOUwvSjlVVWJ6amdRS2plS2VhTzA0d2xzaFlhVC80bVdKM2lCajJmalJuUlVqdGtOYWVKSzlFMTBBLyt5ZCsyVgpaNWZrc2NXcnYyb2o2TlNVNGtRb1lzUkw0dkRZNGlsckduQitKR0dUZTA4RE1pVU5SU1FybHJSR2FyOUtDL2VhCmo4R3NHc1ZuODI4MDB2cHpZNHp2RnJDb3BFWXErT3NTN0hLMDcvZ3Jmb3hTd0l1RVZQa3ZQdU5WcU54bXNkbmgKWDlpempGazBXYVNyVDJ5N0h4amJkYXZZeTVMTmxEaGhEZ2NHSDB0R0VQRVZ2bzJGWER0S0s0RjVEN1JwbjBsUQpsMDMzRGxaZHdKVnF3amJERzJqSjlTcmNSNXErc3M3RkplajZBN25hK1JadWtZVDFIQ2pJL0NiTTF4eVFWcWRmCmJ6b0V2TTE0aVF1T0R5K2pxaytpR3hJOUZnaEFEL0ZHVE5lcWV3akJDdlZ0Sjk0Q2o4ckR0U3ZLNmV2SUlWTTQKcGN3NzJIYzNNS0pQMlcvUjhrQ3RRWG9YeGRaS05ZbTNRZFY4aG45VlRZTktwWE1nd0RxdmtQR2FKSTdaam5ISwplN2lHMnJLUG1UNGRFdzBTRWU3VXEvRHBGWFlDNU9EZnFpQWVXMkdGWkVDcGtKY05yVlBTV2gySGFnQ1haV0swCnZtOXFwL1VzUXUweXJiWWhucjY4Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1IZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290Q0EgMjAxNSBPPUhlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5CiMgU3ViamVjdDogQ049SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBFQ0MgUm9vdENBIDIwMTUgTz1IZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENlcnQuIEF1dGhvcml0eQojIExhYmVsOiAiSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBFQ0MgUm9vdENBIDIwMTUiCiMgU2VyaWFsOiAwCiMgTUQ1IEZpbmdlcnByaW50OiA4MTplNTpiNDoxNzplYjpjMjpmNTplMTo0YjowZDo0MTo3Yjo0OTo5MjpmZTplZgojIFNIQTEgRmluZ2VycHJpbnQ6IDlmOmYxOjcxOjhkOjkyOmQ1OjlhOmYzOjdkOjc0Ojk3OmI0OmJjOjZmOjg0OjY4OjBiOmJhOmI2OjY2CiMgU0hBMjU2IEZpbmdlcnByaW50OiA0NDpiNTo0NTphYTo4YToyNTplNjo1YTo3MzpjYToxNTpkYzoyNzpmYzozNjpkMjo0YzoxYzpiOTo5NTozYTowNjo2NTozOTpiMToxNTo4MjpkYzo0ODo3Yjo0ODozMwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ3d6Q0NBa3FnQXdJQkFnSUJBREFLQmdncWhrak9QUVFEQWpDQnFqRUxNQWtHQTFVRUJoTUNSMUl4RHpBTgpCZ05WQkFjVEJrRjBhR1Z1Y3pGRU1FSUdBMVVFQ2hNN1NHVnNiR1Z1YVdNZ1FXTmhaR1Z0YVdNZ1lXNWtJRkpsCmMyVmhjbU5vSUVsdWMzUnBkSFYwYVc5dWN5QkRaWEowTGlCQmRYUm9iM0pwZEhreFJEQkNCZ05WQkFNVE8waGwKYkd4bGJtbGpJRUZqWVdSbGJXbGpJR0Z1WkNCU1pYTmxZWEpqYUNCSmJuTjBhWFIxZEdsdmJuTWdSVU5ESUZKdgpiM1JEUVNBeU1ERTFNQjRYRFRFMU1EY3dOekV3TXpjeE1sb1hEVFF3TURZek1ERXdNemN4TWxvd2dhb3hDekFKCkJnTlZCQVlUQWtkU01ROHdEUVlEVlFRSEV3WkJkR2hsYm5NeFJEQkNCZ05WQkFvVE8waGxiR3hsYm1saklFRmoKWVdSbGJXbGpJR0Z1WkNCU1pYTmxZWEpqYUNCSmJuTjBhWFIxZEdsdmJuTWdRMlZ5ZEM0Z1FYVjBhRzl5YVhSNQpNVVF3UWdZRFZRUURFenRJWld4c1pXNXBZeUJCWTJGa1pXMXBZeUJoYm1RZ1VtVnpaV0Z5WTJnZ1NXNXpkR2wwCmRYUnBiMjV6SUVWRFF5QlNiMjkwUTBFZ01qQXhOVEIyTUJBR0J5cUdTTTQ5QWdFR0JTdUJCQUFpQTJJQUJKS2cKUWVoTGdvUmM0dmd4RVptR1pFNEpKUytkUVM4S3JqVlBkSld5VVdScmpXdm1QM0NWOEFWRVI2WnlPRkIybFFKYQpqcTRvbnZrdFRwbnZMRWh2VENVcDZORnhXOThkd1hVM3ROZjZlM3BDbkdvS1ZscDhhUXVxZ0Fra2JIN0JScU5DCk1FQXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPQkJZRUZMUWkKQzRLWkpBRU9uTHZrRHYyLys1Y2drNWtxTUFvR0NDcUdTTTQ5QkFNQ0EyY0FNR1FDTUdmT0ZtSTRvcXhpUmFlcApsU1RBR2llY01qdkF3Tlc2cWVmNEJFTlRoZTVTSWQ2ZDlTV0RQcDVZU3kvWFp4TU9JUUl3QmVGMUFkNW83U29mClRVd0pDQTNzUzYxa0Z5am5kYzVGWlhJaEY4c2lRUTZNRTVnNG1sUnRtOHJpZk9vQ1dDS1IKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUNlcnRwbHVzIFJvb3QgQ0EgRzEgTz1DZXJ0cGx1cwojIFN1YmplY3Q6IENOPUNlcnRwbHVzIFJvb3QgQ0EgRzEgTz1DZXJ0cGx1cwojIExhYmVsOiAiQ2VydHBsdXMgUm9vdCBDQSBHMSIKIyBTZXJpYWw6IDE0OTE5MTE1NjU3Nzk4OTgzNTY3MDk3MzExNzY5NjU2MTU1NjQ2Mzc3MTMKIyBNRDUgRmluZ2VycHJpbnQ6IDdmOjA5OjljOmY3OmQ5OmI5OjVjOjY5OjY5OjU2OmQ1OjM3OjNlOjE0OjBkOjQyCiMgU0hBMSBGaW5nZXJwcmludDogMjI6ZmQ6ZDA6Yjc6ZmQ6YTI6NGU6MGQ6YWM6NDk6MmM6YTA6YWM6YTY6N2I6NmE6MWY6ZTM6Zjc6NjYKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDE1OjJhOjQwOjJiOmZjOmRmOjJjOmQ1OjQ4OjA1OjRkOjIyOjc1OmIzOjljOjdmOmNhOjNlOmMwOjk3OjgwOjc4OmIwOmYwOmVhOjc2OmU1OjYxOmE2OmM3OjQzOjNlCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGYXpDQ0ExT2dBd0lCQWdJU0VTQlZnK1F0UGxSV2hTMkRON2NzM0VZUk1BMEdDU3FHU0liM0RRRUJEUVVBCk1ENHhDekFKQmdOVkJBWVRBa1pTTVJFd0R3WURWUVFLREFoRFpYSjBjR3gxY3pFY01Cb0dBMVVFQXd3VFEyVnkKZEhCc2RYTWdVbTl2ZENCRFFTQkhNVEFlRncweE5EQTFNall3TURBd01EQmFGdzB6T0RBeE1UVXdNREF3TURCYQpNRDR4Q3pBSkJnTlZCQVlUQWtaU01SRXdEd1lEVlFRS0RBaERaWEowY0d4MWN6RWNNQm9HQTFVRUF3d1RRMlZ5CmRIQnNkWE1nVW05dmRDQkRRU0JITVRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUIKQU5wUWg3YmF1S2srbldUNlZqT2FWajBXNVFPVnNqUWNtbTFpQmRUWWorZUpaSis2MjJTTFpPWjVLbUhOcjQ5YQppWkZsdVZqOHRBTmZrVDh0RUJYZ2ZzKzgvSDlEWjZpdFhqWWoySml6VGZORG5qbDhLdnpzaU5XSTduQzloUll0CjZrdUpQS054UXY0Yy9kTWNMUkM0aGxUcVE3amJ4b2ZhcUs2QUpjOTZKaDJxa2JCSWI2NjEzcDdZMS9vQS9jYVAKMEZHN1luMmtzWXl5L3lBUnVqVmpCWVpIWUVNemtQWkhvZ05QbGsyZFQ4SHE2cHlpL2pRdTNyZktHM2FrdDYyZgo2YWpVZUQ5NC92STRDVFlkMGhZQ3lPd3FhSy8xanBUdkxSTjZIa0pLSFJVeHJnd0VWL3hoYy9NeFZvWXhnS0RFCkVXNHdkdU9VOEY4RXhLeUhjb21ZeFozTVZ3aWE5QXo4ZlhvRk92cEhnRG0yejRRVGQyOG42ditXWnhjSWJla04KMWlOUU1MQVZkQk0rNVMvL0RzM0VDMHBkOE5nQU0wbG02NkVZZkZrdVBTaTVZWEhMdGFXNnVPcmM0bkJ2Q0dyYwpoMmMwNzk4d2N0M3p5VDhqL3pYaHZpRXBJRENCNUJtbElPa2x5bk14ZENtKzRrTFY4N0ltWnNkby9SbXo1eUNUCm1laGQ0RjZINTBib0pad0tLU1RVelZpR1VrQWtzbnNQbUJJZ0pQYVFiRWZJRGJzWUlDN1ovZnlMOGlucWgzU1YKNEVKUWVJUUVRV0d3OUNFamp5M0xLQ0h5YW16MEdxYkZGTFEzWlUrVi9ZREkrSExsSld2RVlMRjdiWTVLaW5QTwpXZnR3ZW5NR0U5blRkRGNrUVFvUmI1ZmM1K1Irb2IwVjhycUhEejFvaWhZSEFnTUJBQUdqWXpCaE1BNEdBMVVkCkR3RUIvd1FFQXdJQkJqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCU293Y0Nia2FoREZYeGQKQmllMEtsSFlsd3VCc1RBZkJnTlZIU01FR0RBV2dCU293Y0Nia2FoREZYeGRCaWUwS2xIWWx3dUJzVEFOQmdrcQpoa2lHOXcwQkFRMEZBQU9DQWdFQW5GWnZBWDdSdlV6MWlzYndKaC9rNERnWXpETERLVHVkUVNrMFljYlg4QUNoCjY2UnlqNVFYdkJNc2RiUlg3Z3A4Q1hyYzFjcWgwRFFUK0hlcm4rWCsyQjUwaW9VSGozL01lWHJLbHMzTi9VLzcKL1NNTmtQWDBYdFBHWVgyZUVlQUM3Z2tFMlFmZHBvcTNESU1rdTROUWt2NWdkUkUrMkoyd2lucTE0SjJieTVCUwpTN0NUS3RRK0ZqUGxuc1psRlQ1a093US8yd3lQWDF3ZGFSK3Y4K2toalBQdmwvYWF0eG0yaEhTY28xUzFjRTVqCjJGZGRVeUdiUUpKRCt0WjNWVE5QWk5YNzBDeHFqbTBscHUrRjZBTEVVejY1bm9lOHpEVWEzcUhwaW1PSFpSNFIKS3R0amQ1Y1V2cG9VbVJHeXdPNndUL2dVSVRKRFQ1K3Jvc3VvRDZvN0JsWEdFaWxYQ05RMzE0Y25yVWxacDVHcgpSSHBlalhEYmw4NUlVTEZ6ay9id2cyRDV6ZkhoTWYxYmZIRWhZeFFVcXEvRjNwTithTEhzSXFLcWtIV2V0VU55CjZtU2poRXY5REtnbWEzR1g3bFpqWnVoQ1ZQbkhIZC9RajF2ZnlEQnZpUDROeERNY1U2aWovVWdROHVRS1R1RVYKVi94dVpERENWUkhjNnFuTlNsU3NLV05FejBwQW9OWm9XUnN6K2U4Nmk5c2drdHhDaEw4QnE0ZkExU0NDMjhhNQpnNFZDWEE5RE8ycEpOZFdZOUJXLyttR0JEQWtnR05MUUZ3ekxTQUJRNlhhQ2pHVFhPcUFIVmN3ZU1jRHZPclJsCisrTy9RbXVlRDZpOWE1amMyTnZMaTZUZDExbjBidDMrcXNPUjBDNUNCOEFNVFZQTkpMRk1XeDVSOU4vcGt2bz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUNlcnRwbHVzIFJvb3QgQ0EgRzIgTz1DZXJ0cGx1cwojIFN1YmplY3Q6IENOPUNlcnRwbHVzIFJvb3QgQ0EgRzIgTz1DZXJ0cGx1cwojIExhYmVsOiAiQ2VydHBsdXMgUm9vdCBDQSBHMiIKIyBTZXJpYWw6IDE0OTIwODcwOTYxMzE1MzY4NDQyMDk1NjM1MDkyMjg5NTE4NzU4NjE1ODkKIyBNRDUgRmluZ2VycHJpbnQ6IGE3OmVlOmM0Ojc4OjJkOjFiOmVlOjJkOmI5OjI5OmNlOmQ2OmE3Ojk2OjMyOjMxCiMgU0hBMSBGaW5nZXJwcmludDogNGY6NjU6OGU6MWY6ZTk6MDY6ZDg6Mjg6MDI6ZTk6NTQ6NDc6NDE6Yzk6NTQ6MjU6NWQ6Njk6Y2M6MWEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDZjOmMwOjUwOjQxOmU2OjQ0OjVlOjc0OjY5OjZjOjRjOmZiOmM5OmY4OjBmOjU0OjNiOjdlOmFiOmJiOjQ0OmI0OmNlOjZmOjc4OjdjOjZhOjk5OjcxOmM0OjJmOjE3Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDSERDQ0FhS2dBd0lCQWdJU0VTRFprYzZ1bytqRjUvL3BBcS9QYzd4Vk1Bb0dDQ3FHU000OUJBTURNRDR4CkN6QUpCZ05WQkFZVEFrWlNNUkV3RHdZRFZRUUtEQWhEWlhKMGNHeDFjekVjTUJvR0ExVUVBd3dUUTJWeWRIQnMKZFhNZ1VtOXZkQ0JEUVNCSE1qQWVGdzB4TkRBMU1qWXdNREF3TURCYUZ3MHpPREF4TVRVd01EQXdNREJhTUQ0eApDekFKQmdOVkJBWVRBa1pTTVJFd0R3WURWUVFLREFoRFpYSjBjR3gxY3pFY01Cb0dBMVVFQXd3VFEyVnlkSEJzCmRYTWdVbTl2ZENCRFFTQkhNakIyTUJBR0J5cUdTTTQ5QWdFR0JTdUJCQUFpQTJJQUJNMFBXMWFDMy9CRkd0YXQKOTNud0hjbXNsdGFlVHB3ZnRFSVJ5b2EvYmZ1Rm84WGxHVnpYN3FZL2FXZlllT0tteWNUYkxYa3U1NHVOQW04eApJazBHNDJCeVJaME9RbmVlenMvbGY0V2JHT1Q4ekM1eTB4YVRUc3FaWTF5aEJTcHNCcU5qTUdFd0RnWURWUjBQCkFRSC9CQVFEQWdFR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZOcURZd0o1anRwTXhqd2oKRk5pUHd5Q3JLR0JaTUI4R0ExVWRJd1FZTUJhQUZOcURZd0o1anRwTXhqd2pGTmlQd3lDcktHQlpNQW9HQ0NxRwpTTTQ5QkFNREEyZ0FNR1VDTUhEK3NBdlo5NE9YN1BOVkhkVGNzd1lPL2pPWW5ZczVrR3VVSWUyMjExM1dUTmNoCnArZS9JUThyemZjcTNJVUhuUUl4QUlZVUZ1WGNzR1hDd0k0VW43OGtGbWpsdlBsNWFkeXRSU3YzdGpGenpBYWwKVTVPUkdwT3VjR3BudXRlZTVXRWFYdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1PcGVuVHJ1c3QgUm9vdCBDQSBHMSBPPU9wZW5UcnVzdAojIFN1YmplY3Q6IENOPU9wZW5UcnVzdCBSb290IENBIEcxIE89T3BlblRydXN0CiMgTGFiZWw6ICJPcGVuVHJ1c3QgUm9vdCBDQSBHMSIKIyBTZXJpYWw6IDE0OTIwMzY1Nzc4MTE5NDcwMTM3NzA0MDAxMjcwMzQ4MjUxNzg4NDQ3NzUKIyBNRDUgRmluZ2VycHJpbnQ6IDc2OjAwOmNjOjgxOjI5OmNkOjU1OjVlOjg4OjZhOjdhOjJlOmY3OjRkOjM5OmRhCiMgU0hBMSBGaW5nZXJwcmludDogNzk6OTE6ZTg6MzQ6Zjc6ZTI6ZWU6ZGQ6MDg6OTU6MDE6NTI6ZTk6NTU6MmQ6MTQ6ZTk6NTg6ZDU6N2UKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDU2OmM3OjcxOjI4OmQ5OjhjOjE4OmQ5OjFiOjRjOmZkOmZmOmJjOjI1OmVlOjkxOjAzOmQ0Ojc1OjhlOmEyOmFiOmFkOjgyOjZhOjkwOmYzOjQ1OjdkOjQ2OjBlOmI0Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGYnpDQ0ExZWdBd0lCQWdJU0VTQ3prRlU1Zlg4MmJXVENwNTlyWTQ1bk1BMEdDU3FHU0liM0RRRUJDd1VBCk1FQXhDekFKQmdOVkJBWVRBa1pTTVJJd0VBWURWUVFLREFsUGNHVnVWSEoxYzNReEhUQWJCZ05WQkFNTUZFOXcKWlc1VWNuVnpkQ0JTYjI5MElFTkJJRWN4TUI0WERURTBNRFV5TmpBNE5EVTFNRm9YRFRNNE1ERXhOVEF3TURBdwpNRm93UURFTE1Ba0dBMVVFQmhNQ1JsSXhFakFRQmdOVkJBb01DVTl3Wlc1VWNuVnpkREVkTUJzR0ExVUVBd3dVClQzQmxibFJ5ZFhOMElGSnZiM1FnUTBFZ1J6RXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUsKQW9JQ0FRRDRlVWJhbHNVd1hvcHhBeTF3cEx1d3hRamN6ZVkxd0lDa0VTM2Q1b2V1WFQyUjBvZHNON2ZhWXA2Ygp3aVRYai9IYnBxYmZSbTlScG5ITFBoc3haMkwzRVZzMEo5VjVUb3liV0wwaUVBMWNKd3pkTU9XbzAxMGhPSFFYCi91TWZ0azg3YXkzYmZXQWZqSDFNQmNMckFSWVZtQlNPMFpCM0lqL3N3am00ZVRyd1NTVGlsWkhjWVRTU2pGUjAKNzdGOWpBSGlPSDNCWDJwZkpMS09ZaGV0ZVNDdHF4MjM0TFNXU0U5bVF4QUdGaVFENGVDY2pzWkdUNDRhbWVHUAp1WTR6YkduZVdLMmdEcWRrVkJGcFJHWlBUQktuaml4OXhOUmJ4UUEwTU1IWm1mNHl6Z2VFdEU3TkN2ODJUV0x4CnAyTlg1TnRxcDY2L0s3bko1ckluaWVWK21oeE5hTWJCR040eksxRkdTeHlPOXowTStZbzBGTVQ3TXpVajhjengKS3NlbHU3Q2l6djVUYTAxQkcyWW9zcGI2cDY0S1RyazVNMFNjZE1HVEhQamduaVFsUS9HYkk0S3EzeXdnc053MgpUZ096ZkFMVTVuc2Fxb2NUdno2aGRMdWJEdUhBazUvWHBHYkt1eHM3NHpEME0xbUtCM0lEVmVkemFnTXhibStXCkcrT2luNitTeCszMVFyY2xURHNUQk04Y2xxOGNJcVBRcXdXeVRCSWpVdHo5R1Zzbm5CNDdldjFDSTlzamdCUHcKdkZFVlZKU21kejdRZEZHOVVSUUlPVGZMSHpTcE1KMVNoQzVWa0xHNjMxVUFDOWhXTGJGSlNYS0FxV0xYd1BZWQpFUVJWelhSN3oyRndlZlI3TEZ4Y2t2emx1RnFyVEpPVm9TZnVwYjdQY1NOQ3VwdDJMUUlEQVFBQm8yTXdZVEFPCkJnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVbDBZaFZ5RTEKMmpaVngvUHhOM0RsQ1BhVEtiWXdId1lEVlIwakJCZ3dGb0FVbDBZaFZ5RTEyalpWeC9QeE4zRGxDUGFUS2JZdwpEUVlKS29aSWh2Y05BUUVMQlFBRGdnSUJBQjNkQW1CODREV241cGg3NmtUT1owQlA4cE51WnRRNWlTYXMwMDBFClBMdUhJVDgzOUhFbDJrdTZxNWFDZ1pHMjdkbXhwR1dYNG05a1dhU1c3bURLSHlQN1Jici9qeVR3eXFreGYza2YKZ0xNdE1ycGtaMkN2dVZuTjM1cEowNmlDc2ZtWWxJck00THZnQkJ1WllMRkdaZHdJb3JKR25rU0k2cE4rVnhiUwpGWEpmTGt1cjFKMWp1T05JNWY2RUxsZ0tuME1kL3JjWWtvWkRTdzZjTW9Zc1lQWHBTT3FWN1hBcDhkVXYvVFcwClY4L2JoVWladWNKdmJJL05lSldzWkNqOVZyRERiOE8rV1ZMaFg0U1BnUEwwRFRhdGRyT2p0ZUZrZGpwWTNIMVAKWGxaczVWVlpWNlhmOFlwbU1JelVVbUk0ZDdTK0tOZktOc1NiQmZENEZkdmI4ZTgwblIxNFNvaFdaMjVnLzQvSQppK0dPdlVLcE13cFpRaElTS3ZxeG5VT09CWnVaMm1LdFZ6YXpIYllOZVMyV3VPdnlERXNNcFpUR01LY21HUzN0ClRBWlFNUEg5V0QyNVN4ZGZHYlJxaEZTME9FODVvZzJXYU1Nb2xQM3RMUjlLYTBPV0xwQUJFUHM0cG9FTDBMOTEKMDlTNXp2RS9idzRjSGpkeDVSaUhkUmsvVUxsZXBFVTByYkRLNXVVVGRnOHhGS21PTFpUVzFZVk5jeFZQUy9LeQpQdTFzdmYwT25XWnpzRDIwOTcrbzRCR2t4SzUxQ1VwakFFZ2dwc2FkQ3dtS3RPRG16ajdIUGlZNDZTdmVwZ2hKCkF3U1FpdW1QditpMnRDcWpJNDBjSExJNWtxaVBBbHhBT1hYVWMwRUNkOTdONEVPSDF1UzZTc05zRW4vK0t1WWoKMW94eAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049T3BlblRydXN0IFJvb3QgQ0EgRzIgTz1PcGVuVHJ1c3QKIyBTdWJqZWN0OiBDTj1PcGVuVHJ1c3QgUm9vdCBDQSBHMiBPPU9wZW5UcnVzdAojIExhYmVsOiAiT3BlblRydXN0IFJvb3QgQ0EgRzIiCiMgU2VyaWFsOiAxNDkyMDEyNDQ4MDQyNzAyMDk2OTg2ODc1OTg3Njc2OTM1NTczNDE1NDQxCiMgTUQ1IEZpbmdlcnByaW50OiA1NzoyNDpiNjo1OToyNDo2YjphZTpjODpmZToxYzowYzoyMDpmMjpjMDo0ZTplYgojIFNIQTEgRmluZ2VycHJpbnQ6IDc5OjVmOjg4OjYwOmM1OmFiOjdjOjNkOjkyOmU2OmNiOmY0OjhkOmUxOjQ1OmNkOjExOmVmOjYwOjBiCiMgU0hBMjU2IEZpbmdlcnByaW50OiAyNzo5OTo1ODoyOTpmZTo2YTo3NToxNTpjMTpiZjplODo0ODpmOTpjNDo3NjoxZDpiMTo2YzoyMjo1OToyOToyNTo3YjpmNDowZDowODo5NDpmMjo5ZTphODpiYTpmMgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmJ6Q0NBMWVnQXdJQkFnSVNFU0NoYVJ1L3ZibTlVcGFQSStoSXZ5WVJNQTBHQ1NxR1NJYjNEUUVCRFFVQQpNRUF4Q3pBSkJnTlZCQVlUQWtaU01SSXdFQVlEVlFRS0RBbFBjR1Z1VkhKMWMzUXhIVEFiQmdOVkJBTU1GRTl3ClpXNVVjblZ6ZENCU2IyOTBJRU5CSUVjeU1CNFhEVEUwTURVeU5qQXdNREF3TUZvWERUTTRNREV4TlRBd01EQXcKTUZvd1FERUxNQWtHQTFVRUJoTUNSbEl4RWpBUUJnTlZCQW9NQ1U5d1pXNVVjblZ6ZERFZE1Cc0dBMVVFQXd3VQpUM0JsYmxSeWRYTjBJRkp2YjNRZ1EwRWdSekl3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLCkFvSUNBUURNdGxlbE01UVFnVEpUMzJGK0QzWTV6MXpDVTNVZFNYcVdPTjJpYzJyeGI5NWVvbHE1Y1NHK050bWgKL0x6dWJLaDhOQnB4R3VnYTJGOE9SQWJ0cCtEejBtRUw0REtpbHRFNDhNTGFBUmY4NUt4UDZPNkpIblNyVDc4ZQpDYlkyYWxiejRlNldpV1lrQnVUTlFqcEszZUNhc01TQ1JiUCt5YXRjZkQ3SjZ4Y3ZESDF1cnFXUHlLd2xDbS82CjFVV1kwalVKOWdORGxQN1p2eUNWZVlDWWl0bUpOYnRSRzZRM2ZmeVpPNnYvdjZ3TmowT3htWHNXRUg0ZGIwZkUKRlk4RWxnZ0dRZ1Q0aE5ZZHZKR21RcjVKMVdxSVA3d3RVZEdlamVCU3pGZmROVFZZMjdTUEpJamtpOS9jYTFUUwpnU3V5enBKTEhCOUcraDNZa3N0Mlo3VUptUW5sckJjVVZYREdQS0JXQ2dPejNHSVozOGkxTUgvMVBDWjFFYjNYCkc3T0huZ2V2WlhIbG9NOGFwd2tRSFpPSlpsdm9QR0l5dGJVNmJ1bUZBWXVlUTR4bmN5aFpXK3ZqM0N6TXBTWnkKWWhLMDVweURSUFpScE9MQWVpUlh5ZzZsUHpxMU80dmxkdTV3NXBMZUZsd29XNWNaSjVMK2VwSlV6cE01Q2hhSAp2R096OWJHVFhPQnV0OURxK1dJeWlFVDd2eWNvdGpDVlhSSW91WlcrajFNWTVhSVlGdUpXcExJc0VQVWRONmI0CnQvYlFXVnlKOThMVnRaUjAwZFgrRzdidzV0WWVlOUk4eTZqajlSanpJUjl1NzAxb0Juc3RYVzVEaWFiQSthQy8KZ2g3UFUzKzA2eXpiWGZacWZVQWtCWEtKT0FHVHkzSENPVjBHRWZadmVQZzNEVG1FSndJREFRQUJvMk13WVRBTwpCZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVWFqbjZRaUwzCjVva0FUVjU5TTRQTHVHNTNocTh3SHdZRFZSMGpCQmd3Rm9BVWFqbjZRaUwzNW9rQVRWNTlNNFBMdUc1M2hxOHcKRFFZSktvWklodmNOQVFFTkJRQURnZ0lCQUpqTHEwQTg1VE1DbDM4dGg2YVAxRjVLcjdnZTU3dHgrNEJrSmFtegpHajVvWFNjbXA3b3E0ZkJYZ3dwa1R4NGlkQnZwa0Yvd3JNLy9UMmg2T0tRUWJBMnh4NlIzZ0JpMm9paEVkcWMwCm5YR0VMOHBaMGtlSW1VRWl5VENZWVc0OXFLZ0ZiZEVmd0ZGRVZuOG5OUUxkWHBnS1F1c3d2NDJobTFHcU8rcVQKUm1URkFIbmVJV3YyVjZDRzF3Wnk3SEJHUzR0ejNhQWhkVDdjSGNDUDAwOXpISVhaL245aXlKVnZ0dE43akxwVAp3bStiUkV4NTBCMXdzOWVmQXZTeUI3REg1Zml0SXc2bVZza3BFbmRJMlM5Ry9UdncvSFJ3a3FXT09BZ2ZaREMyCnQwdjdOcXdRanFCU00yT2RBelZXeFdtOXhpTmFKNVQycEJMNExUTThvVmFsWDlZWjZlMThDTDEzelNka3pKVGEKVGtaUWgrRDV3Vk9BSHJ1dCswZFNpeHY5b3ZuZURpSzNQVE5aYk5UZTlaVUdNZzFSR1VGY1BrOEc5N2tyZ0NmMgpvNnA2ZkFiaFE4TVRPV0lhTnIzZ0tDNlVBdVFwTG1CVnJrQTlzSFNTWHZBZ1pKWS9YMFZkaUxXSzJnS2dXMFZVCjNqZzlDY0NvU21WR0Z2eXF2MVJPVFZ1K09FTzNLTXFMTTZvYUpib2xYQ2t2VzBwdWpPb3RuQ3IyQlhiZ2Q1ZUEKaU4xbkUyOGRhQ1NMVDdkMGdlWDBZSjk2VmRjK045b1dhejUzcks0WWNKVUllU2tEaXY3Qk83TS9HZytrTzE0ZgpXS0dWeWFzdmMwclFMVzZhV1E5VkdIZ3RQRkdtbDR2bXU3Sndxa3dSM3Y5OEt6ZlVldEYzTkkvbitVTDNQSUVNClMxSUsKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPU9wZW5UcnVzdCBSb290IENBIEczIE89T3BlblRydXN0CiMgU3ViamVjdDogQ049T3BlblRydXN0IFJvb3QgQ0EgRzMgTz1PcGVuVHJ1c3QKIyBMYWJlbDogIk9wZW5UcnVzdCBSb290IENBIEczIgojIFNlcmlhbDogMTQ5MjEwNDkwODI3MTQ4NTY1MzA3MTIxOTk0MTg2NDE3MTE3MDQ1NTYxNQojIE1ENSBGaW5nZXJwcmludDogMjE6Mzc6YjQ6MTc6MTY6OTI6N2I6Njc6NDY6NzA6YTk6OTY6ZDc6YTg6MTM6MjQKIyBTSEExIEZpbmdlcnByaW50OiA2ZToyNjo2NDpmMzo1NjpiZjozNDo1NTpiZjpkMTo5MzozZjo3YzowMTpkZTpkODoxMzpkYTo4YTphNgojIFNIQTI1NiBGaW5nZXJwcmludDogYjc6YzM6NjI6MzE6NzA6NmU6ODE6MDc6OGM6MzY6N2M6Yjg6OTY6MTk6OGY6MWU6MzI6MDg6ZGQ6OTI6Njk6NDk6ZGQ6OGY6NTc6MDk6YTQ6MTA6Zjc6NWI6NjI6OTIKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNJVENDQWFhZ0F3SUJBZ0lTRVNEbStFejhKTEMrQlVDczJvTWJOR0EvTUFvR0NDcUdTTTQ5QkFNRE1FQXgKQ3pBSkJnTlZCQVlUQWtaU01SSXdFQVlEVlFRS0RBbFBjR1Z1VkhKMWMzUXhIVEFiQmdOVkJBTU1GRTl3Wlc1VQpjblZ6ZENCU2IyOTBJRU5CSUVjek1CNFhEVEUwTURVeU5qQXdNREF3TUZvWERUTTRNREV4TlRBd01EQXdNRm93ClFERUxNQWtHQTFVRUJoTUNSbEl4RWpBUUJnTlZCQW9NQ1U5d1pXNVVjblZ6ZERFZE1Cc0dBMVVFQXd3VVQzQmwKYmxSeWRYTjBJRkp2YjNRZ1EwRWdSek13ZGpBUUJnY3Foa2pPUFFJQkJnVXJnUVFBSWdOaUFBUks3bGl1VGNwbQozZ1k2b3hIODRCandiaHk2TFRBTWlkblc3cHR6ZzZrakZZd3ZXWXBhM1JUcW5Wa3JRN2NHN0RLMnV1NUJ0YTFkCm9ZWE02aDBVWnFObmZrYmlsUFBudGxhaEZWbWhUemVYdVNJZXZSSHI5TElmWHNNVW11WFpsNW1qWXpCaE1BNEcKQTFVZER3RUIvd1FFQXdJQkJqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCUkhkOE1VaTJJNQpETWx2NFZCTjBCQlkzSldJYlRBZkJnTlZIU01FR0RBV2dCUkhkOE1VaTJJNURNbHY0VkJOMEJCWTNKV0liVEFLCkJnZ3Foa2pPUFFRREF3TnBBREJtQWpFQWo2amNuYm9NQkJmNkZlazlMeWtCbDcrQkZqTkFrMno4K2UyQWNHK3EKajl1RXdvdjFOY29HM0dSdmFCYmhqNUc1QWpFQTJFdWx5OExRQ0d6cEdQdGEzVTFmSkF1d0FDRWw3NCtuQkNaeAo0bnhwNVYyYStFRWZPem1UazUxVjZzMk44ZnZCCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1JU1JHIFJvb3QgWDEgTz1JbnRlcm5ldCBTZWN1cml0eSBSZXNlYXJjaCBHcm91cAojIFN1YmplY3Q6IENOPUlTUkcgUm9vdCBYMSBPPUludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwCiMgTGFiZWw6ICJJU1JHIFJvb3QgWDEiCiMgU2VyaWFsOiAxNzI4ODY5Mjg2Njk3OTA0NzYwNjQ2NzAyNDM1MDQxNjkwNjExMjAKIyBNRDUgRmluZ2VycHJpbnQ6IDBjOmQyOmY5OmUwOmRhOjE3OjczOmU5OmVkOjg2OjRkOmE1OmUzOjcwOmU3OjRlCiMgU0hBMSBGaW5nZXJwcmludDogY2E6YmQ6MmE6Nzk6YTE6MDc6NmE6MzE6ZjI6MWQ6MjU6MzY6MzU6Y2I6MDM6OWQ6NDM6Mjk6YTU6ZTgKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDk2OmJjOmVjOjA2OjI2OjQ5Ojc2OmYzOjc0OjYwOjc3OjlhOmNmOjI4OmM1OmE3OmNmOmU4OmEzOmMwOmFhOmUxOjFhOjhmOmZjOmVlOjA1OmMwOmJkOmRmOjA4OmM2Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGYXpDQ0ExT2dBd0lCQWdJUkFJSVF6N0RTUU9OWlJHUGd1Mk9DaXdBd0RRWUpLb1pJaHZjTkFRRUxCUUF3ClR6RUxNQWtHQTFVRUJoTUNWVk14S1RBbkJnTlZCQW9USUVsdWRHVnlibVYwSUZObFkzVnlhWFI1SUZKbGMyVmgKY21Ob0lFZHliM1Z3TVJVd0V3WURWUVFERXd4SlUxSkhJRkp2YjNRZ1dERXdIaGNOTVRVd05qQTBNVEV3TkRNNApXaGNOTXpVd05qQTBNVEV3TkRNNFdqQlBNUXN3Q1FZRFZRUUdFd0pWVXpFcE1DY0dBMVVFQ2hNZ1NXNTBaWEp1ClpYUWdVMlZqZFhKcGRIa2dVbVZ6WldGeVkyZ2dSM0p2ZFhBeEZUQVRCZ05WQkFNVERFbFRVa2NnVW05dmRDQlkKTVRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBSzNvSkhQMEZEZnptNTRyVnlnYwpoNzdjdDk4NGtJeHVQT1pYb0hqM2RjS2kvdlZxYnZZQVR5amIzbWlHYkVTVHRyRmovUlFTYTc4ZjB1b3hteUYrCjBUTTh1a2oxM1huZnM3ai9FdkVobWt2QmlvWnhhVXBtWm15UGZqeHd2NjBwSWdiejVNRG1nSzdpUzQrM21YNlUKQTUvVFI1ZDhtVWdqVStnNHJrOEtiNE11MFVsWGpJQjB0dG92MERpTmV3TndJUnQxOGpBOCtvK3UzZHBqcStzVwpUOEtPRVV0K3p3dm8vN1YzTHZTeWUwcmdUQklsREhDTkF5bWc0Vk1rN0JQWjdobS9FTE5LakQrSm8yRlIzcXlICkI1VDBZM0hzTHVKdlc1aUI0WWxjTkhsc2R1ODdrR0o1NXR1a21pOG14ZEFRNFE3ZTJSQ09GdnUzOTZqM3grVUMKQjVpUE5naVY1K0kzbGcwMmRaNzdEbkt4SFp1OEEvbEpCZGlCM1FXMEt0WkI2YXdCZHBVS0Q5amYxYjBTSHpVdgpLQmRzMHBqQnFBbGtkMjVITjdyT3JGbGVhSjEvY3RhSnhRWkJLVDVaUHQwbTlTVEpFYWRhbzB4QUgwYWhtYlduCk9sRnVoanVlZlhLbkVnVjRXZTArVVhnVkN3T1BqZEF2QmJJK2Uwb2NTM01GRXZ6RzZ1QlFFM3hEazNTenluVG4Kamg4QkNOQXcxRnR4TnJRSHVzRXdNRnhJdDRJN21LWjlZSXFpb3ltQ3pMcTlnd1Fib29NRFFhSFdCZkVid3JidwpxSHlHTzBhb1NDcUkzSGFhZHI4ZmFxVTlHWS9yT1BOazNzZ3JEUW9vLy9mYjRoVkMxQ0xRSjEzaGVmNFk1M0NJCnJVN20yWXM2eHQwblVXNy92R1QxTTBOUEFnTUJBQUdqUWpCQU1BNEdBMVVkRHdFQi93UUVBd0lCQmpBUEJnTlYKSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCUjV0Rm5tZTdibDVBRnpnQWlJeUJwWTl1bWJiakFOQmdrcQpoa2lHOXcwQkFRc0ZBQU9DQWdFQVZSOVlxYnl5cUZEUURMSFlHbWtnSnlrSXJHRjFYSXB1K0lMbGFTL1Y5bFpMCnViaHpFRm5USVpkKzUweHgrN0xTWUswNXFBdnFGeUZXaGZGUURsbnJ6dUJaNmJySkZlK0duWStFZ1BiazZaR1EKM0JlYllodEY4R2FWMG54dnd1bzc3eC9QeTlhdUovR3BzTWl1L1gxK212b2lCT3YvMlgvcWtTc2lzUmNPai9LSwpORnRZMlB3QnlWUzV1Q2JNaW9nemlVd3RoRHlDMys2V1Z3VzZMTHYzeExmSFRqdUN2akhJSW5Oemt0SENnS1E1Ck9SQXpJNEpNUEorR3NsV1lIYjRwaG93aW01N2lhenRYT29Kd1Rkd0p4NG5MQ2dkTmJPaGRqc252enF2SHU3VXIKVGtYV1N0QW16T1Z5eWdocXBaWGpGYUgzcE8zSkxGK2wrLytzS0FJdXZ0ZDd1K054ZTVBVzB3ZGVSbE44TndkQwpqTlBFbHB6Vm1iVXE0SlVhZ0VpdVREa0h6c3hIcEZLVks3cTQrNjNTTTFOOTVSMU5iZFdoc2NkQ2IrWkFKelZjCm95aTNCNDNualRPUTV5T2YrMUNjZVd4RzFiUVZzNVp1ZnBzTWxqcTRVaTAvMWx2aCt3akNoUDRrcUtPSjJxeHEKNFJncXNhaERZVnZUSDl3N2pYYnlMZWlOZGQ4WE0ydzlVL3Q3eTBGZi85eWkwR0U0NFphNHJGMkxOOWQxMVRQQQptUkd1blVIQmNuV0V2Z0pCUWw5bkpFaVUwWnNudmdjL3ViaFBnWFJSNFhxMzdaMGo0cjdnMVNnRUV6d3hBNTdkCmVteVB4Z2NZeG4vZVI0NC9LSjRFQnMrbFZEUjN2ZXlKbStrWFE5OWIyMS8ramg1WG9zMUFuWDVpSXRyZUdDYz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IE89Rk5NVC1SQ00gT1U9QUMgUkFJWiBGTk1ULVJDTQojIFN1YmplY3Q6IE89Rk5NVC1SQ00gT1U9QUMgUkFJWiBGTk1ULVJDTQojIExhYmVsOiAiQUMgUkFJWiBGTk1ULVJDTSIKIyBTZXJpYWw6IDQ4NTg3NjMwODIwNjQ0ODgwNDcwMTU1NDY4Mjc2MDU1NDc1OQojIE1ENSBGaW5nZXJwcmludDogZTI6MDk6MDQ6YjQ6ZDM6YmQ6ZDE6YTA6MTQ6ZmQ6MWE6ZDI6NDc6YzQ6NTc6MWQKIyBTSEExIEZpbmdlcnByaW50OiBlYzo1MDozNTowNzpiMjoxNTpjNDo5NTo2MjoxOTplMjphODo5YTo1Yjo0Mjo5OToyYzo0YzoyYzoyMAojIFNIQTI1NiBGaW5nZXJwcmludDogZWI6YzU6NTc6MGM6Mjk6MDE6OGM6NGQ6Njc6YjE6YWE6MTI6N2I6YWY6MTI6Zjc6MDM6YjQ6NjE6MWU6YmM6MTc6Yjc6ZGE6YjU6NTc6Mzg6OTQ6MTc6OWI6OTM6ZmEKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZnekNDQTJ1Z0F3SUJBZ0lQWFpPTk1HYzJ5QVlkR3NkVWhHa0hNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1Ec3gKQ3pBSkJnTlZCQVlUQWtWVE1SRXdEd1lEVlFRS0RBaEdUazFVTFZKRFRURVpNQmNHQTFVRUN3d1FRVU1nVWtGSgpXaUJHVGsxVUxWSkRUVEFlRncwd09ERXdNamt4TlRVNU5UWmFGdzB6TURBeE1ERXdNREF3TURCYU1Ec3hDekFKCkJnTlZCQVlUQWtWVE1SRXdEd1lEVlFRS0RBaEdUazFVTFZKRFRURVpNQmNHQTFVRUN3d1FRVU1nVWtGSldpQkcKVGsxVUxWSkRUVENDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFMcHhnSHBNaG01Lwp5Qk50d01aOUhBQ1hqeXdNSTdzUW1rQ3BHcmVIaVBpYlZtcjc1bnVPaTVLT3B5VmRXUkhiTmk2M1VSY2ZxUWdmCkJCY2tXS28zU2hqZjVUblVWLzNYd1N5UkFaSGlJdFFEd0ZqOGQwZnNqejUwUTdxc05JMU5PSFpuanJESWJ6QXoKV0hGY3RQVnJidFFCVUxnVGZteEtvMG5SSUJudXZNQXBHR1duM3Y3djNRcVFJZWNhWjVKQ0VKaGZUekM4UGh4Rgp0QkRYYUVBVXdFRDY1M2NYZXVZTGoyVmJQTm1hVXR1MXZaNUd6ejNya1FVQ3dKYXlka3hORUpZN2t2cWNmdytaCjM3NGpOVVVlQWx6K3RhaWJtU1hhWHZNaXd6bjE1Q291MDhZZnhHeXF4UnhxQVFWS0w5TEZ3YWcwSmwxbXBkSUMKSWZrWXR3YjFUcGx2cUt0TVVlalBVQmpGZDhnNUNTeEpraktacUxzWEYzbXdXc1htbzhSWlpVYzFnMTZwNkRVTAptYnZrelNER20wb0dPYlZvL0NLNjdsV01LMDdxODdIai9MYVptdFZDK25GTkNNK0hIbXB4ZmZuVHRPbWxjWUY3CndrNUhscVgyZG9XaktJL3BnRzZCVTZWdFg3aEkrY0w1TnFZdVNmKzRsc0tNQjdPYmlGajg2eHNjM2kxdzRwZVMKTUtHSjQ3eFZxQ2ZXUysyUXJZdjZZeVZaTGFnMTNjcVhNN3psemNlZDBlenZYZzVLa0FZbVk2MjUyVFV0QjdwMgpaU3lzVjQ5OTlBZVUxNEVDbGwyakIwblZldEJYK1J2blUwWjFxckI1UXN0b2NRanBZTDA1YWM3MHI4TldRTWV0ClVxSUo1RytHUjRvZjZ5Z25YWU1ncndUSmJGYWFpMGIxQWdNQkFBR2pnWU13Z1lBd0R3WURWUjBUQVFIL0JBVXcKQXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPQkJZRUZQZDl4ZjNFNkpvYmQyU245UjJnekwrSApZSnB0TUQ0R0ExVWRJQVEzTURVd013WUVWUjBnQURBck1Da0dDQ3NHQVFVRkJ3SUJGaDFvZEhSd09pOHZkM2QzCkxtTmxjblF1Wm01dGRDNWxjeTlrY0dOekx6QU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUFCNUJLMy9NalR2REQKbkZGbG01d2lvb29NaGZOektXdE4vZ0hpcVF4akFiOEVaNldkbUYvOUFSUDY3SnBpNlliK3RtTFNia3lVKzhCMQpSWHhsRFBpeU44K3NEOCtOYi9rWjk0L3NIdkp3bnZES3VPKzMvM1kzZGx2MmJvanpyMkl5SXBNTk9tcU9GR1lNCkxWTjBWMlVlMWJMZEk0RTdwV1lqSjJjSmorRjNxa1BOWlZFSTdWRlkvdVk1K2N0SGhLUVY4WGE3cE82a084UmYKNzdJemxoRVl0OGxsdmhqaG82VGMraGo1MDd3VG16bDZOTHJUUWZ2Nk1vb3F0eXVHQzJtRE9MN05paTRMY0syTgpKcEx1SHZVQkt3cloxcGViYnVDb0dSdzZJWXNNSGtDdEErZmRabjcxdVNBTkEraVcrWUpGMURuZ29BQmQxNWptCmZaNW5jOE9hS3Zlcmk2RTZGTzgwdkZJT2laaWFCRUNFSFg1RmFaTlh6dXZPK0ZCOFR4eHVCRU9iK2RZN0l4anAKNm83UlRVYU44VHZrYXNxNit5TzNtL3FaQVNsYVdGb3Q0L25VYlE0bXJjRnVOTHd5K0F3RittV2oyenMzZ3lMcAoxdHh5TS8xZDhpQzlkandqMmlqMytSdnJXV1RWM0Y5eWZpRDh6WW0xa0dkTlluby9UcTBkd3puK2V2UW9GdDlCCjlraUFCZGNQVVhtc0VLdlU3QU5tNW1xd3VqR1NRa0JxdmpyVGN1RnFOMVc4ckIyVnQybGg4a09SZE9hZzB3b2sKUnFFSXI5YmFSUm1XMUZNZFc0UjU4TUQzUisrTGo4VUdycDFNWXAzL1JnVDQwOG0yRUNWQWRmNFdxc2xLWUlZdgp1dTh3ZCtSVTRyaUVtVmlBcWhPTFVUcFBTUGFMdHJNPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QW1hem9uIFJvb3QgQ0EgMSBPPUFtYXpvbgojIFN1YmplY3Q6IENOPUFtYXpvbiBSb290IENBIDEgTz1BbWF6b24KIyBMYWJlbDogIkFtYXpvbiBSb290IENBIDEiCiMgU2VyaWFsOiAxNDMyNjY5Nzg5MTY2NTU4NTY4NzgwMzQ3MTIzMTcyMzAwNTQ1MzgzNjk5OTQKIyBNRDUgRmluZ2VycHJpbnQ6IDQzOmM2OmJmOmFlOmVjOmZlOmFkOjJmOjE4OmM2Ojg4OjY4OjMwOmZjOmM4OmU2CiMgU0hBMSBGaW5nZXJwcmludDogOGQ6YTc6Zjk6NjU6ZWM6NWU6ZmM6Mzc6OTE6MGY6MWM6NmU6NTk6ZmQ6YzE6Y2M6NmE6NmU6ZGU6MTYKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDhlOmNkOmU2Ojg4OjRmOjNkOjg3OmIxOjEyOjViOmEzOjFhOmMzOmZjOmIxOjNkOjcwOjE2OmRlOjdmOjU3OmNjOjkwOjRmOmUxOmNiOjk3OmM2OmFlOjk4OjE5OjZlCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEUVRDQ0FpbWdBd0lCQWdJVEJteWZ6NW0vakFvNTR2QjRpa1BtbGpaYnlqQU5CZ2txaGtpRzl3MEJBUXNGCkFEQTVNUXN3Q1FZRFZRUUdFd0pWVXpFUE1BMEdBMVVFQ2hNR1FXMWhlbTl1TVJrd0Z3WURWUVFERXhCQmJXRjYKYjI0Z1VtOXZkQ0JEUVNBeE1CNFhEVEUxTURVeU5qQXdNREF3TUZvWERUTTRNREV4TnpBd01EQXdNRm93T1RFTApNQWtHQTFVRUJoTUNWVk14RHpBTkJnTlZCQW9UQmtGdFlYcHZiakVaTUJjR0ExVUVBeE1RUVcxaGVtOXVJRkp2CmIzUWdRMEVnTVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTEo0Z0hIS2VOWGoKY2E5SGdGQjBmVzdZMTRoMjlKbG85MWdoWVBsMGhBRXZyQUl0aHRPZ1EzcE9zcVRRTnJvQnZvM2JTTWdIRnpaTQo5TzZJSThjKzZ6ZjF0Um40U1dpdzN0ZTVkamdkWVo2ay9vSTJwZVZLVnVSRjRmbjl0QmI2ZE5xY216VTVML3F3CklGQUdiSHJRZ0xLbSthL3NSeG1QVURnSDNLS0hPVmo0dXRXcCtVaG5NSmJ1bEhoZWI0bWpVY0F3aG1haFJXYTYKVk91anc1SDVTTnovMGVnd0xYMHRkSEExMTRnazk1N0VXVzY3YzRjWDhqSkdLTGhEK3JjZHFzcTA4cDhrRGkxTAo5M0ZjWG1uLzZwVUN5emlLcmxBNGI5djdMV0lieGNjZVZPRjM0R2ZJRDV5SEk5WS9RQ0IvSUlERWdFdytPeVFtCmpnU3ViSnJJcWcwQ0F3RUFBYU5DTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUMKQVlZd0hRWURWUjBPQkJZRUZJUVl6SVUwN0x3TWxKUXVDRm1jeDdJUVRnb0lNQTBHQ1NxR1NJYjNEUUVCQ3dVQQpBNElCQVFDWThqZGFRWkNoR3NWMlVTZ2dOaU1PcnVZb3U2cjRsSzVJcERCL0cvd2tqVXUweUtHWDlyYnhlbkRJClU1UE1DQ2pqbUNYUEk2VDUzaUhUZklVSnJVNmFkVHJDQzJxSmVIWkVSeGhsYkkxQmpqdC9tc3YwdGFkUTF3VXMKTitnRFM2M3BZYUFDYnZYeThNV3k3VnUzM1BxVVhIZWVFNlYvVXEyVjh2aVRPOTZMWEZ2S1dsSmJZSzhVOTB2dgpvL3VmUUpWdE1WVDhRdFBIUmg4anJka1BTSENhMlhWNGNkRnlRelIxYmxkWndnSmNKbUFwenlNWkZvNklRNlhVCjVNc0kreU1SUStoREtYSmlvYWxkWGdqVWtLNjQyTTRVd3RCVjhvYjJ4Sk5EZDJaaHdMbm9RZGVYZUdBRGJrcHkKcnFYUmZib1Fub1pzRzRxNVdUUDQ2OFNRdnZHNQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049QW1hem9uIFJvb3QgQ0EgMiBPPUFtYXpvbgojIFN1YmplY3Q6IENOPUFtYXpvbiBSb290IENBIDIgTz1BbWF6b24KIyBMYWJlbDogIkFtYXpvbiBSb290IENBIDIiCiMgU2VyaWFsOiAxNDMyNjY5ODI4ODU5NjM1NTE4MTgzNDkxNjA2NTg5MjUwMDY5NzA2NTMyMzkKIyBNRDUgRmluZ2VycHJpbnQ6IGM4OmU1OjhkOmNlOmE4OjQyOmUyOjdhOmMwOjJhOjVjOjdjOjllOjI2OmJmOjY2CiMgU0hBMSBGaW5nZXJwcmludDogNWE6OGM6ZWY6NDU6ZDc6YTY6OTg6NTk6NzY6N2E6OGM6OGI6NDQ6OTY6YjU6Nzg6Y2Y6NDc6NGI6MWEKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDFiOmE1OmIyOmFhOjhjOjY1OjQwOjFhOjgyOjk2OjAxOjE4OmY4OjBiOmVjOjRmOjYyOjMwOjRkOjgzOmNlOmM0OjcxOjNhOjE5OmMzOjljOjAxOjFlOmE0OjZkOmI0Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGUVRDQ0F5bWdBd0lCQWdJVEJteWYwcFkxaHA4S0QrV0dlUGhiSnJ1S056QU5CZ2txaGtpRzl3MEJBUXdGCkFEQTVNUXN3Q1FZRFZRUUdFd0pWVXpFUE1BMEdBMVVFQ2hNR1FXMWhlbTl1TVJrd0Z3WURWUVFERXhCQmJXRjYKYjI0Z1VtOXZkQ0JEUVNBeU1CNFhEVEUxTURVeU5qQXdNREF3TUZvWERUUXdNRFV5TmpBd01EQXdNRm93T1RFTApNQWtHQTFVRUJoTUNWVk14RHpBTkJnTlZCQW9UQmtGdFlYcHZiakVaTUJjR0ExVUVBeE1RUVcxaGVtOXVJRkp2CmIzUWdRMEVnTWpDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBSzJXbnkyY1NreEsKZ1hsUm1leUt5MnRnVVJPOFRXMEcvTEFJamQwWkVHckhKZ3cxMk1CdklJVHBsTEdiaFFQRFc5dEs2TWo0a0hiWgpXMC9qVE9nR05rM01tcXc5REpBcmt0UUdHV0NzTjBSNWhZR0NyVm8zNEEzTW5hWk1VbmJxUTUyM0JORlE5bFhnCjFkS21TWVhwTituS2ZxNWNsVTFJbWordUlGcHRpSlhaTkxoU0drT1FzTDlzQmJtMmVMZnEwT1E2UEJKVFl2OUsKOG51K05RV3BFalRqODJSMFlpdzlBRWxhS1A0eVJMdUgzV1VuQW5FNzJrcjNIOXJOOXlGVmtFOFA3SzZDNFo5cgoyVVhUdS9CZmgrMDhMRG1HMmovZTdISlY2M21qcmR2ZGZMQzZITTc4M2s4MWRzOFArSGdmYWpaUlJpZGhXK21lCnovQ2lWWDE4Sllwdkw3VEZ6NFF1Sy8wTlVSQnMrMThidkJ0K3hhNDdtQUV4a3Y4TFYvU2FzcmxYNmF2dkRYYlIKOE83MHpvYW40RzdwdEdtaDMybjJNOFpwTHBjVG5xV0hzRmNRZ1RmSlU3TzdmL2FTMFp6UUdQU1NidHFEVDZaagptVXlsKzE3dklXUjZJRjlzWklVVnl6ZnBZZ3dMS2hiY0FTNHkyajVMOVo0NjloZEFsTytla1FpRytyNWpxRm96CjdNdDBRNVg1YkdsU05zY3BiL3hWQTF3Zis1KzlSK3ZuU1VlVkMwNkpJZ2xKNFBWaEh2Ry9Mb3B5Ym9CWi8xYzYKK1hVeW8wNWY3TzBvWXRsTmMvTE1nUmRnN2MzcjNOdW55c1YrQXIzeVZBaFUvYlF0Q1N3WFZFcVkwVlRoVVdjSQowdTF1Zm04LzBpMkJXU2xteTVBNWxSRWVkQ2YrM2V1dkFnTUJBQUdqUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CCkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdHR01CMEdBMVVkRGdRV0JCU3dEUEJNTVBRRldBSkkvVFBsVXE5TGhPTm0KVWpBTkJna3Foa2lHOXcwQkFRd0ZBQU9DQWdFQXFxaUFqdzU0bytDaTFNM205Wmg2TytvQUE3Q1hEcE84V3FqMgpMSXh5aDZteC9IOXovV054ZUtXSFdjOHc0UTBRc2hOYWJZTDFhdWFBbjZBRkMyamtSMnZIYXQrMi9YY3ljdVVZCitnbjBvSk1zWGRLTWRZVjJaWkFNQTNtM01TTmpyWGlEQ1lab2hNci8rYzhtbXBKNTU4MUx4ZWRocHhmTDg2a1MKazVOcnArZ3ZVNUxFWUZpd3pBSlJHRnVGaldKWlk3YXR0TjZhK3liM0FDZkFYVlUzZEpuSlVIL2pXUzVFNHl3bAo3dXhNTW5lMG54cnBTMTBneGRyOUhJY1d4a1BvMUxzbW1rVndYcWtMTjFQaVJuc24vZUJHOG9tM3pFSzJ5eWdtCmJ0bWx5VHJJUVJOZzkxQ01GYTZ5YlJvVkdsZDQ1cElxMldXUWdqOXNBcSt1RWpvbmxqWUUxeDJpZ0dPcG0vSGwKdXJSOEZMQk95YkVmZEY4NDlsSHFtL29zb2hIVXFTMG5Ha1d4cjdKT2NRM0FXRWJXYVFiTFU4dXovbXRCelVGKwpmVXdQZkhKNWVsbk5Ya29Pckp1cG1ITjVmTFQwekxtNEJ3eXlkRnk0eDIrSW9aQ245S3I1djJjNjlCb1ZZaDYzCm43NDlzU212WjZFUzhsZ1FHVk1ETUJ1NEdvbjJuTDJYQTQ2akNmTWRpeUh4dE4va0hOR2ZaUUlHNmx6V0U3T0UKNzZLbFhJeDNLYWRvd0d1dVFOS290T3JOOEkxTE9Kd1ptaHNvVkxpSmtPL0tkWUUrSHZKa0pNY1lyMDcvUjU0SAo5alZscE5NS1Z2LzFGMlJzNzZnaUpVbVR0dDhBRjlwWWZsM3V4UnV3MGRGZklSREgrZk82QWdvbkI4WHgxc2ZUCjRQc0pZR3c9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1BbWF6b24gUm9vdCBDQSAzIE89QW1hem9uCiMgU3ViamVjdDogQ049QW1hem9uIFJvb3QgQ0EgMyBPPUFtYXpvbgojIExhYmVsOiAiQW1hem9uIFJvb3QgQ0EgMyIKIyBTZXJpYWw6IDE0MzI2Njk4NjY5OTA5MDc2NjI5NDcwMDYzNTM4MTIzMDkzNDc4ODY2NTkzMAojIE1ENSBGaW5nZXJwcmludDogYTA6ZDQ6ZWY6MGI6Zjc6YjU6ZDg6NDk6OTU6MmE6ZWM6ZjU6YzQ6ZmM6ODE6ODcKIyBTSEExIEZpbmdlcnByaW50OiAwZDo0NDpkZDo4YzozYzo4YzoxYToxYTo1ODo3NTo2NDo4MTplOTowZjoyZToyYTpmZjpiMzpkMjo2ZQojIFNIQTI1NiBGaW5nZXJwcmludDogMTg6Y2U6NmM6ZmU6N2I6ZjE6NGU6NjA6YjI6ZTM6NDc6Yjg6ZGY6ZTg6Njg6Y2I6MzE6ZDA6MmU6YmI6M2E6ZGE6Mjc6MTU6Njk6ZjU6MDM6NDM6YjQ6NmQ6YjM6YTQKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJ0akNDQVZ1Z0F3SUJBZ0lUQm15ZjFYU1hObVkvT3d1YTJlaWVkZ1B5U2pBS0JnZ3Foa2pPUFFRREFqQTUKTVFzd0NRWURWUVFHRXdKVlV6RVBNQTBHQTFVRUNoTUdRVzFoZW05dU1Sa3dGd1lEVlFRREV4QkJiV0Y2YjI0ZwpVbTl2ZENCRFFTQXpNQjRYRFRFMU1EVXlOakF3TURBd01Gb1hEVFF3TURVeU5qQXdNREF3TUZvd09URUxNQWtHCkExVUVCaE1DVlZNeER6QU5CZ05WQkFvVEJrRnRZWHB2YmpFWk1CY0dBMVVFQXhNUVFXMWhlbTl1SUZKdmIzUWcKUTBFZ016QlpNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDlBd0VIQTBJQUJDbVhwOFpCZjhBTm0rZ0JHMWJHOGxLbAp1aTJ5RXVqU0x0ZjZ5Y1hZcW0wZmM0RTdPNWhyT1h3enBjVk9obzZBRjJoaVJWZDlSRmdkc3pmbFp3anJadDZqClFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdHR01CMEdBMVVkRGdRV0JCU3IKdHR2WEJwNDNyRENHQjVGd3g1ekVHYkY0d0RBS0JnZ3Foa2pPUFFRREFnTkpBREJHQWlFQTRJV1NveGUzamZrcgpCcVdUckJxWWFHRnkrdUdoMFBzY2VHQ21RNW5GdU1RQ0lRQ2NBdS94bEp5emx2bnJ4aXI0dGl6K09wQVVGdGVNCll5UklITjh3ZmRWb093PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUFtYXpvbiBSb290IENBIDQgTz1BbWF6b24KIyBTdWJqZWN0OiBDTj1BbWF6b24gUm9vdCBDQSA0IE89QW1hem9uCiMgTGFiZWw6ICJBbWF6b24gUm9vdCBDQSA0IgojIFNlcmlhbDogMTQzMjY2OTg5NzU4MDgwNzYzOTc0MTA1MjAwNjMwNzYzODc3ODQ5Mjg0ODc4CiMgTUQ1IEZpbmdlcnByaW50OiA4OTpiYzoyNzpkNTplYjoxNzo4ZDowNjo2YTo2OTpkNTpmZDo4OTo0NzpiNDpjZAojIFNIQTEgRmluZ2VycHJpbnQ6IGY2OjEwOjg0OjA3OmQ2OmY4OmJiOjY3Ojk4OjBjOmMyOmUyOjQ0OmMyOmViOmFlOjFjOmVmOjYzOmJlCiMgU0hBMjU2IEZpbmdlcnByaW50OiBlMzo1ZDoyODo0MTo5ZTpkMDoyMDoyNTpjZjphNjo5MDozODpjZDo2MjozOTo2Mjo0NTo4ZDphNTpjNjo5NTpmYjpkZTphMzpjMjoyYjowYjpmYjoyNTo4OTo3MDo5MgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQjhqQ0NBWGlnQXdJQkFnSVRCbXlmMThHN0VFd3BRK1Z4ZTNzc3lCckJEakFLQmdncWhrak9QUVFEQXpBNQpNUXN3Q1FZRFZRUUdFd0pWVXpFUE1BMEdBMVVFQ2hNR1FXMWhlbTl1TVJrd0Z3WURWUVFERXhCQmJXRjZiMjRnClVtOXZkQ0JEUVNBME1CNFhEVEUxTURVeU5qQXdNREF3TUZvWERUUXdNRFV5TmpBd01EQXdNRm93T1RFTE1Ba0cKQTFVRUJoTUNWVk14RHpBTkJnTlZCQW9UQmtGdFlYcHZiakVaTUJjR0ExVUVBeE1RUVcxaGVtOXVJRkp2YjNRZwpRMEVnTkRCMk1CQUdCeXFHU000OUFnRUdCU3VCQkFBaUEySUFCTktyaWpkUG8xTU4vc0dLZTB1b2UwWkxZN0JpCjlpMGIyd2h4SWRJQTZHTzltaWY3OERsdVhlbzlwY21CcXFOYklKaEZYUmJiL2VnUWJlT2M0T085WDRSaTgzQmsKTTZETEpDOXd1b2loS3FCMStJR3VZZ2JFZ2RzNWJpbXdIdm91WEtOQ01FQXdEd1lEVlIwVEFRSC9CQVV3QXdFQgovekFPQmdOVkhROEJBZjhFQkFNQ0FZWXdIUVlEVlIwT0JCWUVGTlBzeHpwbGJzemgybmFhVnZ1Yzg0WnRWK1dCCk1Bb0dDQ3FHU000OUJBTURBMmdBTUdVQ01EcUxJZkc5ZmhHdDBPOVlsaS9XNjUxK2tJMHJ6MlpWd3l6aktLbHcKQ2tjTzhEZFpFdjh0bVpRb1RpcFBOVTB6V2dJeEFPcDFBRTQ3eERxVUVwSEpXRWFkSVJOeXA0aWNpdVJNU3R1VwoxS3lMYTJ0SkVsTXpyZGZrdmlUOHRRcDIxS1c4RUE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049THV4VHJ1c3QgR2xvYmFsIFJvb3QgMiBPPUx1eFRydXN0IFMuQS4KIyBTdWJqZWN0OiBDTj1MdXhUcnVzdCBHbG9iYWwgUm9vdCAyIE89THV4VHJ1c3QgUy5BLgojIExhYmVsOiAiTHV4VHJ1c3QgR2xvYmFsIFJvb3QgMiIKIyBTZXJpYWw6IDU5OTE0MzM4MjI1NzM0MTQ3MTIzOTQxMDU4Mzc2Nzg4MTEwMzA1ODIyNDg5NTIxCiMgTUQ1IEZpbmdlcnByaW50OiBiMjplMTowOTowMDo2MTphZjpmNzpmMTo5MTo2ZjpjNDphZDo4ZDo1ZTozYjo3YwojIFNIQTEgRmluZ2VycHJpbnQ6IDFlOjBlOjU2OjE5OjBhOmQxOjhiOjI1Ojk4OmIyOjA0OjQ0OmZmOjY2OjhhOjA0OjE3Ojk5OjVmOjNmCiMgU0hBMjU2IEZpbmdlcnByaW50OiA1NDo0NTo1Zjo3MToyOTpjMjowYjoxNDo0NzpjNDoxODpmOTo5NzoxNjo4ZjoyNDpjNTo4ZjpjNTowMjozYjpmNTpkYTo1YjplMjplYjo2ZToxZDpkODo5MDoyZTpkNQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRnd6Q0NBNnVnQXdJQkFnSVVDbjZtMzB0RW50cHFKSVdlNXJnVjB4Wi91N0V3RFFZSktvWklodmNOQVFFTApCUUF3UmpFTE1Ba0dBMVVFQmhNQ1RGVXhGakFVQmdOVkJBb01EVXgxZUZSeWRYTjBJRk11UVM0eEh6QWRCZ05WCkJBTU1Ga3gxZUZSeWRYTjBJRWRzYjJKaGJDQlNiMjkwSURJd0hoY05NVFV3TXpBMU1UTXlNVFUzV2hjTk16VXcKTXpBMU1UTXlNVFUzV2pCR01Rc3dDUVlEVlFRR0V3Sk1WVEVXTUJRR0ExVUVDZ3dOVEhWNFZISjFjM1FnVXk1QgpMakVmTUIwR0ExVUVBd3dXVEhWNFZISjFjM1FnUjJ4dlltRnNJRkp2YjNRZ01qQ0NBaUl3RFFZSktvWklodmNOCkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFOZUZsNzhSbU9ud1lvTk1QSWY1VTJvM0MvSVBQSWZPYjl3bUtiM0YKaWJySmd6MzM3c3BieG0xSmM3VEpScU1iTkJNL3dZbEZWL1Rac2ZzMlpVdjdDT0pJY1JISWJqdWVuZCtKWlRlbQpoZlk3UkJpMnhqY3dZa1NTbDJsOVFqQWs1QTBNaVd0ajNzWGgzMDZwRkd4VDRHSE85aGN2SFR5OTVpSk1IWlAxCkVNU2hkdXhxM3NWczM1YTBWa0JDd0dLU01LRXRGWlNnMGlBR0NXNXFiZVhydDc3VThQRVZmSXZtVHJvVHpFc24KWHBrOEYxMlBnWDh6UFUvVFB4dnNYRC93UEV4MWJ2S20xWjNhTFFkakFzWnk2WlM4VEVtVlQ0aFN5TnZvYVlMNAp6RFJiSXZDR3A0bTlTQXB0Wm9GdHlNaGsrd0hoOU9IZTJaN2QyMXZVS3BrbUZSc2VUSklwZ3A3VmtvR1NRWEFaCjk2VGxrMHU4ZDJjeDNSejlNWEFORjVrTStRdzVHU29YdFRCeFZkVVBybGpoUFM4MG04K2Y5bmlGd3BONmNqNW0KajV3V0VXQ1Bub2x2Wjc3Z1IxbzdESnBuaTg5R3hxNDRvL0tudk9iV2hXc3pKSEFpUzhzSW03dkkrQUlwSGI0ZwpERWEvYTRlYnN5cG1RalZHYktxNnJmbVllK2xRVlJReHY3SGFMZTJBcldnaysybXIySEVUTU9abnM0ZEEvWWwrCjhrUFJFZDh2WlM5a3psOFV1YkcvTWIySGVGcFpaWWlxL0ZreVNJYldUTGtwUzVYVGR2TjNKVzFDSERpRFRmMmoKWDV0L0xheDVHdzVDTVpkanBQdUthZFVpRFRTUU1DNm90T0J0dHBTc3ZJdE8xM0Q4eFRpT1pDWGhUVG1RenNtSApoRmh4QWdNQkFBR2pnYWd3Z2FVd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pCQ0JnTlZIU0FFT3pBNU1EY0dCeXVCCkt3RUJBUW93TERBcUJnZ3JCZ0VGQlFjQ0FSWWVhSFIwY0hNNkx5OXlaWEJ2YzJsMGIzSjVMbXgxZUhSeWRYTjAKTG14MU1BNEdBMVVkRHdFQi93UUVBd0lCQmpBZkJnTlZIU01FR0RBV2dCVC9HQ2gyK1VnRkxLR3U4U3NiSzdKVAorRXQ4c3pBZEJnTlZIUTRFRmdRVS94Z29kdmxJQlN5aHJ2RXJHeXV5VS9oTGZMTXdEUVlKS29aSWh2Y05BUUVMCkJRQURnZ0lCQUdvWkZPMXVlY0VzaDlRTmNIN1g5bmpKQ3dST3hMSE9rM0Qrc0ZUQU1zMlpNR1FYdncvbDRqUDkKQnpaQWNnNGF0bXBaMWdEbGFDRGRMbklOSDJwa01TQ0VmVW1tV2pmclJjbUY5ZFRIRjVrSDVwdFY1QXpvcWJUTwpqRnUxRVZ6UGlnNE4xcXgzZ2Y0eW5DU2VjczVVODlCdm9sYlc3TU0zTEdWWXZsY0FHdkkxK3V0N01WM0N3Ukk5CmxvR0lsb25CV1Z4NjVuOXdOT2VENHJIaDRiaFk3OVNWNUdDYzhKYVhjb3pyaEFJdVpZK2t0OUovWjkzSTA1NWMKcXFta29DVVVCcHZzVDM0dEMzOGRkZkV6Mk8zT3VIVnRQbHU1bUIweERWYllRdzh3a2JJRWE5MVd2cFdBVldlKwoyTTJEMlJqdUxnK0dMWktlY0JQczNsSEpRM2dDcFUzSStWL0VrVmhHRm5kYWRLcEF2QWVmTUxteDl4SVgzZVAvCkpFQWRlbXJSVHhnS3FwQWQ2MEFlMzZFZVJKSVFtdktONGRGTFJwN29SVUtYNmtXWjgreG0xUUw2OHFaS0pLcmUKenJuSytUK1RiL21qdXVxbFBwbXQvZjk3bWZWbDd2QlpLR2ZYa0pXa0U0U3BoTUhvenM1MWsyTWF2RHpxMVdRZgpMU29TT2NiRFdqTHRSNUVXRHJ3NHdWRGVqOG9xa0RRYzdrR1VuRjRaTHZoRlNabDBrYkFFYitNRVdyR3JLcXYrCng5Q1d0dHJoU21RR2JtQk52VUpPLzNqYUpNb2J0TmVXT1d5dThRNnFwMzFJaXlCTXoyVFd1SmRHc0U3UktsWTYKb0pPOXI0QWs0QXArNThyVnl1aUZWZHcyS3VHVWFKUEhabkpFRDRBaE1td2x4eU9BZ3dycgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VFVCSVRBSyBLYW11IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxIE89VHVya2l5ZSBCaWxpbXNlbCB2ZSBUZWtub2xvamlrIEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLIE9VPUthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBTTQojIFN1YmplY3Q6IENOPVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3VydW0gMSBPPVR1cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmFzdGlybWEgS3VydW11IC0gVFVCSVRBSyBPVT1LYW11IFNlcnRpZmlrYXN5b24gTWVya2V6aSAtIEthbXUgU00KIyBMYWJlbDogIlRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRpZmlrYXNpIC0gU3VydW0gMSIKIyBTZXJpYWw6IDEKIyBNRDUgRmluZ2VycHJpbnQ6IGRjOjAwOjgxOmRjOjY5OjJmOjNlOjJmOmIwOjNiOmY2OjNkOjVhOjkxOjhlOjQ5CiMgU0hBMSBGaW5nZXJwcmludDogMzE6NDM6NjQ6OWI6ZWM6Y2U6Mjc6ZWM6ZWQ6M2E6M2Y6MGI6OGY6MGQ6ZTQ6ZTg6OTE6ZGQ6ZWU6Y2EKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IDQ2OmVkOmMzOjY4OjkwOjQ2OmQ1OjNhOjQ1OjNmOmIzOjEwOjRhOmI4OjBkOmNhOmVjOjY1OjhiOjI2OjYwOmVhOjE2OjI5OmRkOjdlOjg2Ojc5OjkwOjY0Ojg3OjE2Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFWXpDQ0EwdWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUXNGQURDQjBqRUxNQWtHQTFVRUJoTUNWRkl4CkdEQVdCZ05WQkFjVEQwZGxZbnBsSUMwZ1MyOWpZV1ZzYVRGQ01FQUdBMVVFQ2hNNVZIVnlhMmw1WlNCQ2FXeHAKYlhObGJDQjJaU0JVWld0dWIyeHZhbWxySUVGeVlYTjBhWEp0WVNCTGRYSjFiWFVnTFNCVVZVSkpWRUZMTVMwdwpLd1lEVlFRTEV5UkxZVzExSUZObGNuUnBabWxyWVhONWIyNGdUV1Z5YTJWNmFTQXRJRXRoYlhVZ1UwMHhOakEwCkJnTlZCQU1UTFZSVlFrbFVRVXNnUzJGdGRTQlRUU0JUVTB3Z1MyOXJJRk5sY25ScFptbHJZWE5wSUMwZ1UzVnkKZFcwZ01UQWVGdzB4TXpFeE1qVXdPREkxTlRWYUZ3MDBNekV3TWpVd09ESTFOVFZhTUlIU01Rc3dDUVlEVlFRRwpFd0pVVWpFWU1CWUdBMVVFQnhNUFIyVmllbVVnTFNCTGIyTmhaV3hwTVVJd1FBWURWUVFLRXpsVWRYSnJhWGxsCklFSnBiR2x0YzJWc0lIWmxJRlJsYTI1dmJHOXFhV3NnUVhKaGMzUnBjbTFoSUV0MWNuVnRkU0F0SUZSVlFrbFUKUVVzeExUQXJCZ05WQkFzVEpFdGhiWFVnVTJWeWRHbG1hV3RoYzNsdmJpQk5aWEpyWlhwcElDMGdTMkZ0ZFNCVApUVEUyTURRR0ExVUVBeE10VkZWQ1NWUkJTeUJMWVcxMUlGTk5JRk5UVENCTGIyc2dVMlZ5ZEdsbWFXdGhjMmtnCkxTQlRkWEoxYlNBeE1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBcjNVd002cTcKYTlPWkxCSTNoTm1OZTVlQTAyN24vNXRRbFQ2UWxWWkMxeGw4Sm9TTmt2b0JIVG9QNG1RNHQ0eTg2SWo1aXlTcgpMcVAxTitSQWpoZ2xlWU4xSHp2L2JLakZ4bGI0dE8yS1JLT3JiRXo4SGREYzcyaTl6K1NxenZCVjk2STAxSU5yCk4zd2N3djYxQSt4WHpyeTB0Y1h0QUE5VE55cE45RThNZy91R3o4ditqRTY5aC9tbml5RlhuSHJmQTJlSkxKMlgKWWFjUXVGV1FmdzR0SnpoMDMrZjkyazRTNDAwVklnTEk0T0Q4RDYySzE4bFVVTXc3RDhvV2dJVFFVVmJEamxaLwppU0l6TCthRkNyMmxxQnMyM3RQY0xHMDd4eE85V1NNczV1V2s5OWdMN2VxUVFFU29sYnVUMWRDQU5MWkdlQTRmCkFKTkc0ZTdwK2V4UEZ3SURBUUFCbzBJd1FEQWRCZ05WSFE0RUZnUVVaVC9IaW9iR1BOMDhWRncxK0RydFVneEgKVjhnd0RnWURWUjBQQVFIL0JBUURBZ0VHTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFTApCUUFEZ2dFQkFDby80ZkV5anE3aG1GeExYczlySG1vSjBpS3BFc2RlVjMxelZtU0FoSHFUNUFtNUVNMmZLaWZoCkFIZStTTWcxcUlHZjVMZ3N5WDhPc05KTE4xM3F1ZFVMWGpTOTlITXB3KzBtRlp4K0NGT0tXSTNRU3lqZndiUGYKSVBQNTQrTTYzOHljbE5oT1Q4TnJGN2YzY3VpdFpqTzFKVk9yNFBoTXFaMzk4ZzI2cnJuWnFzWnIrWk83cnF1NApsendER3JwRHhwYTVSWEk0czZlaGxqMlJlMzdBSVZOTWgrM3lDMVNWVVpQVklxVU5pdkdURGo1VURyRFl5VTdjCjhqRXlWdXBrK2VxMW5SWm1Rbkx6ZjlPeE1VUDhwSTRYOFcwanE1Um0rSzM3RHdodUppMS9Gd2NKc296N1VNQ2YKbG8zUHR2MEFuVm9VbXI4Q1JQWEJ3cDhpWHFJUG9lTT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPUdEQ0EgVHJ1c3RBVVRIIFI1IFJPT1QgTz1HVUFORyBET05HIENFUlRJRklDQVRFIEFVVEhPUklUWSBDTy4sTFRELgojIFN1YmplY3Q6IENOPUdEQ0EgVHJ1c3RBVVRIIFI1IFJPT1QgTz1HVUFORyBET05HIENFUlRJRklDQVRFIEFVVEhPUklUWSBDTy4sTFRELgojIExhYmVsOiAiR0RDQSBUcnVzdEFVVEggUjUgUk9PVCIKIyBTZXJpYWw6IDkwMDk4OTk2NTA3NDAxMjAxODYKIyBNRDUgRmluZ2VycHJpbnQ6IDYzOmNjOmQ5OjNkOjM0OjM1OjVjOjZmOjUzOmEzOmUyOjA4OjcwOjQ4OjFmOmI0CiMgU0hBMSBGaW5nZXJwcmludDogMGY6MzY6Mzg6NWI6ODE6MWE6MjU6YzM6OWI6MzE6NGU6ODM6Y2E6ZTk6MzQ6NjY6NzA6Y2M6NzQ6YjQKIyBTSEEyNTYgRmluZ2VycHJpbnQ6IGJmOmZmOjhmOmQwOjQ0OjMzOjQ4OjdkOjZhOjhhOmE2OjBjOjFhOjI5Ojc2OjdhOjlmOmMyOmJiOmIwOjVlOjQyOjBmOjcxOjNhOjEzOmI5OjkyOjg5OjFkOjM4OjkzCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGaURDQ0EzQ2dBd0lCQWdJSWZRbVgvdkJINm5vd0RRWUpLb1pJaHZjTkFRRUxCUUF3WWpFTE1Ba0dBMVVFCkJoTUNRMDR4TWpBd0JnTlZCQW9NS1VkVlFVNUhJRVJQVGtjZ1EwVlNWRWxHU1VOQlZFVWdRVlZVU0U5U1NWUloKSUVOUExpeE1WRVF1TVI4d0hRWURWUVFEREJaSFJFTkJJRlJ5ZFhOMFFWVlVTQ0JTTlNCU1QwOVVNQjRYRFRFMApNVEV5TmpBMU1UTXhOVm9YRFRRd01USXpNVEUxTlRrMU9Wb3dZakVMTUFrR0ExVUVCaE1DUTA0eE1qQXdCZ05WCkJBb01LVWRWUVU1SElFUlBUa2NnUTBWU1ZFbEdTVU5CVkVVZ1FWVlVTRTlTU1ZSWklFTlBMaXhNVkVRdU1SOHcKSFFZRFZRUUREQlpIUkVOQklGUnlkWE4wUVZWVVNDQlNOU0JTVDA5VU1JSUNJakFOQmdrcWhraUc5dzBCQVFFRgpBQU9DQWc4QU1JSUNDZ0tDQWdFQTJhTVc4TWgwZEhlYjd6TU5Pd1orVmZ5MVlJOTJoaEpDZlZabVBvaUM3WEpqCkRwNkwzVFFzQWxGUnd4bjlXVlNFeWZGcnMweXc2ZWhHWFRqR29xY3VFVmU2Z2hXaW5JOXRzSmxLQ3ZMcmlYQmoKVG5uRXQxdTlvbDJ4OGtFQ0s2MnBPcVBzZVFyc1h6cmovZStBUEswMG14cXJpQ1o3VnFLQ2hoL3JOWW1EZjErdQpLVTQ5dG03c3JzSHdKNXV1NC9Uczc2NS85NFk5Y25ycnBmdFpUcWZybFl3aU9YbmhMUWlQekx5UnVFSDNGTUVqCnFjT3Rta1ZFczdMWExNM0dLZUpRRUs1Y3k0S09GeGcyZlpmbWlKcXdUVFFKOUN5NVdtWXFzQmVibmg1Mm5VcG0KTVVIZlAvdkZCdThidG40YVJqYjNaR003NHprWUkrZG5kUlRWZFZlU043MithaHNtVVBJMkpnYVF4WEFCWkcxMgpadUdSMjI0SHdHR0FMckl1TDR4d3A5RTdQTE9SNUc2MnhEdHc4bXlTbHduTlIzMFl3UE83bmcvV2k2NEh0bG9QCnpnc01SNmZsUHJpOWZjZWJOYUJobHpwQmRSZk1LNVozS3BJaEh0bVZkaUJuYU04TnZkL1dId2xxbXVMTWMzR2sKTDMwU2dMZFRNRVplUzFTWkQyZkpwY2p5SU1HQzdKMFIzOElDK3hvNzBlMGdtdTlsWkpJUURTcmkzbkR4R0dlQwpqR0hldUx6Ukw1ejdEOUFyN1J0MnVlUTVWZmo0b1IyNHFvQUFUSUxuc244SnVMd3dvQzhOOVZLZWp2ZVNzd29BCkhRQlVsd2Jnc1FmWnh3OWNaWDA4YlZsWDVPMmxqZWxBVTU4VlM2Qng5aG9oNDlwd0JpRllGSWVGZDNtcWdua0MKQXdFQUFhTkNNRUF3SFFZRFZSME9CQllFRk9MSlFKOU56dWlhb1h6UERqOWx4U21JYWhsUk1BOEdBMVVkRXdFQgovd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdHR01BMEdDU3FHU0liM0RRRUJDd1VBQTRJQ0FRRFJTVmZnCnA4eG9XTG9CRHlzWnpZMndZVVdzRWUxalVHbjRIMysrRm8vOW5lc0xxakpIZHRKbkpPMjlmRE15bHlySEJZWm0KRFJkOUZCVWIxT3Y5SDVyMlhwZHB0eG9scEFxemtUOWZOcXlMN0Zlb1B1ZUJpaGhYT1lWMEdrTEg2VnNUWDQvNQpDT21TZEkzMVI5S3JPOWI3ZUdaT05uMzU2WkxwQk43OVNXUDhiZnNVY1pObkwwZEt0N24vSGlwemNFWXd2MXJ5CkwzbWw0WTBNMmZteVl6ZU1OMldGY0dwY1d3bHl1YTFqUExIZCtQd3l2emVHNUx1T21DZCt1aDhXNFhBUjhnUGYKSldJeUp5WVlNb1NmL3dBNkU3cWFUZlJQdUJSd0lySEtLNURPS2NGdzlDK2RmL0tRSHRaYTM3ZEcvT2FHK3N2ZwpJSFo2dXFiTDlYemVZcVd4aSs3ZWdtYUtUam93SHorQXk2MG51Z3hlMTlDeFZzcDNjYksxZGFGUXFVQkRGOElvCjJjOVNpMXZJWTlSQ1BxQXpla1l1OXdvZ1JsUithazh4OFlGK1FuUTRaWE1uN3NaOHVJN1hwVHJYbUtHY2pCQlYKMDl0TDdFQ1E4czF1VjlKaURueFhrN0duYmMyZGc3c3E1K1cyTzNGWXJmM1JSYnhha2U1VEZXL1RSUWwxYnJxUQpYUjRFenpmZkhxaG1zWXptSUdydi9FaE9kSmhDcnlsdkxtckgrMzNSWmpFaXpJWUFmbWFEREVMMHZUU1N3eHJxClQ4cCtjazBMY0l5bVNMdW1vUlQyKzFoRW1SU3VxZ3VUYWFBcEpVcWx5eXZkaW1ZSEZuZ1ZWM0ViN1BWSGhQT2UKTVRkNjFYOGtyZVM4L2YzTWJvUG9ES2kzUVd3SDNiMDhocGN2MGc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049VHJ1c3RDb3IgUm9vdENlcnQgQ0EtMSBPPVRydXN0Q29yIFN5c3RlbXMgUy4gZGUgUi5MLiBPVT1UcnVzdENvciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkKIyBTdWJqZWN0OiBDTj1UcnVzdENvciBSb290Q2VydCBDQS0xIE89VHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuIE9VPVRydXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eQojIExhYmVsOiAiVHJ1c3RDb3IgUm9vdENlcnQgQ0EtMSIKIyBTZXJpYWw6IDE1NzUyNDQ0MDk1ODExMDA2NDg5CiMgTUQ1IEZpbmdlcnByaW50OiA2ZTo4NTpmMTpkYzoxYTowMDpkMzoyMjpkNTpiMjpiMjphYzo2YjozNzowNTo0NQojIFNIQTEgRmluZ2VycHJpbnQ6IGZmOmJkOmNkOmU3OjgyOmM4OjQzOjVlOjNjOjZmOjI2Ojg2OjVjOmNhOmE4OjNhOjQ1OjViOmMzOjBhCiMgU0hBMjU2IEZpbmdlcnByaW50OiBkNDowZTo5Yzo4NjpjZDo4ZjplNDo2ODpjMTo3Nzo2OTo1OTpmNDo5ZTphNzo3NDpmYTo1NDo4Njo4NDpiNjpjNDowNjpmMzo5MDo5Mjo2MTpmNDpkYzplMjo1Nzo1YwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRU1EQ0NBeGlnQXdJQkFnSUpBTnFiN0hIekE3QVpNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1JR2tNUXN3Q1FZRApWUVFHRXdKUVFURVBNQTBHQTFVRUNBd0dVR0Z1WVcxaE1SUXdFZ1lEVlFRSERBdFFZVzVoYldFZ1EybDBlVEVrCk1DSUdBMVVFQ2d3YlZISjFjM1JEYjNJZ1UzbHpkR1Z0Y3lCVExpQmtaU0JTTGt3dU1TY3dKUVlEVlFRTERCNVUKY25WemRFTnZjaUJEWlhKMGFXWnBZMkYwWlNCQmRYUm9iM0pwZEhreEh6QWRCZ05WQkFNTUZsUnlkWE4wUTI5eQpJRkp2YjNSRFpYSjBJRU5CTFRFd0hoY05NVFl3TWpBME1USXpNakUyV2hjTk1qa3hNak14TVRjeU16RTJXakNCCnBERUxNQWtHQTFVRUJoTUNVRUV4RHpBTkJnTlZCQWdNQmxCaGJtRnRZVEVVTUJJR0ExVUVCd3dMVUdGdVlXMWgKSUVOcGRIa3hKREFpQmdOVkJBb01HMVJ5ZFhOMFEyOXlJRk41YzNSbGJYTWdVeTRnWkdVZ1VpNU1MakVuTUNVRwpBMVVFQ3d3ZVZISjFjM1JEYjNJZ1EyVnlkR2xtYVdOaGRHVWdRWFYwYUc5eWFYUjVNUjh3SFFZRFZRUUREQlpVCmNuVnpkRU52Y2lCU2IyOTBRMlZ5ZENCRFFTMHhNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUIKQ2dLQ0FRRUF2NDYzbGVMQ0poSnJNeG5IUUZnS3ExbXFqUUNqL0lESFVIdU8xQ0FtdWpJUzJDTlVTU1VRSXBpZApSdExCeVo1T0d5NHNEamp6R2lWb0hLWmFCZVllaTBpL21KWjBQbW5LNmJWNHBRYTgxUUJlQ1FyeUozcFMvQzNWCnNlcTBpV0VrOHhvVDI2blBVdTBNSkxxNW51eCtBSFQ2azYxc0taS3VVYlM3MDFlL3MvT29qWnowSkVzcTFwbWUKOUo3K3dINUNPdWNMbFZQYXQyZ09rRXo3Y0QrUFNpeVU4eWJkWTJtcGxOZ1FUc1ZIQ0pDWkd4ZE51V3h1NzJDVgpFWTRoZ0xXOW9IUFkwTEozeEVYcVdpYjdabloyK0FZZllXMFBWY1dEdHhCV2NnWUhwZk94R2dNRlpBNmRXb3JXCmhuQWJKTjcrS0lvcjBHcXcvSHFpM0xKNURvdGxEd0lEQVFBQm8yTXdZVEFkQmdOVkhRNEVGZ1FVN210SlBIby8KRGVPeENiZUt5S3NabjNNelVPY3dId1lEVlIwakJCZ3dGb0FVN210SlBIby9EZU94Q2JlS3lLc1puM016VU9jdwpEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVlZd0RRWUpLb1pJaHZjTkFRRUxCUUFECmdnRUJBQ1VZMUpHUEUrNlBIaDBSVTlvdFJDa1pvQjVyTVo1TkRwNnRQVnhCYjVVckpLRjVtRG80TnZ1N1pwNUkKLzVDUTd6M1V1SnUwaDNVL0lKdk9jcytoVmNGTlpLSVpCcUVITXd3TEtlWHg2cXVqN0xVS2RKREhmWEx5MTF5ZgprZStSaTdmYzdXYWl6NDVtTzd5Zk9nTGdKOTBXbU1DVjFBcWs1SUdhZFpRMW5KQmZpRGNHclZtVkNyRFJaOU1aCnlvbm5NbG8ySEQ2Q3FGcVR2c2JRWkpHMno5bTJHTS9iZnRKbG82YkVqaGN4d2Z0K2R0dlRoZU5Zc25kNmRqdHMKTDFBYzU5djJaM2tmOVlLVm1nZW5GSytQM0NnaFp3blMxazFhSEJrY2puZGN3NVFrUFRKclMzN1VlSlNEdmpkTgp6bC9ISGs0ODRJa3psUXNQcFRMV1BGcDVMQms9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiMgSXNzdWVyOiBDTj1UcnVzdENvciBSb290Q2VydCBDQS0yIE89VHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuIE9VPVRydXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eQojIFN1YmplY3Q6IENOPVRydXN0Q29yIFJvb3RDZXJ0IENBLTIgTz1UcnVzdENvciBTeXN0ZW1zIFMuIGRlIFIuTC4gT1U9VHJ1c3RDb3IgQ2VydGlmaWNhdGUgQXV0aG9yaXR5CiMgTGFiZWw6ICJUcnVzdENvciBSb290Q2VydCBDQS0yIgojIFNlcmlhbDogMjcxMTY5NDUxMDE5OTEwMTY5OAojIE1ENSBGaW5nZXJwcmludDogYTI6ZTE6Zjg6MTg6MGI6YmE6NDU6ZDU6Yzc6NDE6MmE6YmI6Mzc6NTI6NDU6NjQKIyBTSEExIEZpbmdlcnByaW50OiBiODpiZTo2ZDpjYjo1NjpmMTo1NTpiOTo2MzpkNDoxMjpjYTo0ZTowNjozNDpjNzo5NDpiMjoxYzpjMAojIFNIQTI1NiBGaW5nZXJwcmludDogMDc6NTM6ZTk6NDA6Mzc6OGM6MWI6ZDU6ZTM6ODM6NmU6Mzk6NWQ6YWU6YTU6Y2I6ODM6OWU6NTA6NDY6ZjE6YmQ6MGU6YWU6MTk6NTE6Y2Y6MTA6ZmU6Yzc6Yzk6NjUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUdMekNDQkJlZ0F3SUJBZ0lJSmFIZnlqUExXUUl3RFFZSktvWklodmNOQVFFTEJRQXdnYVF4Q3pBSkJnTlYKQkFZVEFsQkJNUTh3RFFZRFZRUUlEQVpRWVc1aGJXRXhGREFTQmdOVkJBY01DMUJoYm1GdFlTQkRhWFI1TVNRdwpJZ1lEVlFRS0RCdFVjblZ6ZEVOdmNpQlRlWE4wWlcxeklGTXVJR1JsSUZJdVRDNHhKekFsQmdOVkJBc01IbFJ5CmRYTjBRMjl5SUVObGNuUnBabWxqWVhSbElFRjFkR2h2Y21sMGVURWZNQjBHQTFVRUF3d1dWSEoxYzNSRGIzSWcKVW05dmRFTmxjblFnUTBFdE1qQWVGdzB4TmpBeU1EUXhNak15TWpOYUZ3MHpOREV5TXpFeE56STJNemxhTUlHawpNUXN3Q1FZRFZRUUdFd0pRUVRFUE1BMEdBMVVFQ0F3R1VHRnVZVzFoTVJRd0VnWURWUVFIREF0UVlXNWhiV0VnClEybDBlVEVrTUNJR0ExVUVDZ3diVkhKMWMzUkRiM0lnVTNsemRHVnRjeUJUTGlCa1pTQlNMa3d1TVNjd0pRWUQKVlFRTERCNVVjblZ6ZEVOdmNpQkRaWEowYVdacFkyRjBaU0JCZFhSb2IzSnBkSGt4SHpBZEJnTlZCQU1NRmxSeQpkWE4wUTI5eUlGSnZiM1JEWlhKMElFTkJMVEl3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLCkFvSUNBUUNuSUc3Q0txSmlKSldRZHNnNGZvRFNxOEdiWlFXVTlNRUtFTlVDck8yZms4ZUh5TEFuSzBJTVBRbysKUVZxZWRkMk55dUNiN0dneXBHbVNhSXdMZ1E1V29ENGEzU3dsRklJdmw5TmtSdlJVcWR3NlZDMHhLNW1DOHRrcQoxKzl4QUxneHBMNTZKQWZEUWlEeWl0U1NCQnRsVmt4czFQdTJZVnBISTdUWWFiUzNPdEIwUEF4MW9ZeE9kcUhwCjJ5cWxPL3JPc1A5K2FpajlKeHpJc2VrcDhWZHVaTFRRd1JWdERyNHVEa2JJWHZSUi91OE9Zem83Y2JyUGIxbksKRE9PYlhVbTRUT0pYc1ppS1FsZWNkdS92dmRGb3FOTDBDYnQzTmI0bGdnakVGaXhFSUZhcFJCRjM3MTIwSGFwZQphejZMTXZZSEwxY0Vrc3IxL3AzQzZlaXpqa3hMQWpIWjVEeElnaWYzR0lKMlNEcHhzUk9oT2RVdXhUVENIV0tGCjN3UCtUZlN2UGQ5Y1c0MzZjT0dsZmlmSGhpNXFqeExHaEY1RFVWQ2NHWnQ0NXZ6MjdVZCtlejFtN3hNVGlGODgKb1dQNytheUhOWi96Z3A2a1B3cWNNV21MbWFTSVNvNXVaazN2RnNRUGVTZ2hZQTJGRm4zWFZEanhrbGI5dFROTQpnOXpYRUo5TC9jYjRRcjI2ZkhNQzRQOTl6VnZoMUt4aGUxZlZTbnRiMUlWWUoxMi8rQ3RncktBbXJoUWhKOFozCm1qT0FQRjVHUC9mRHNhT0dNOGJvWGcyNU5TeXFSc0dGQW5XQW9Pc2sreFdxNUdkL2JuYy85QVNLTDN4NzR4ZGgKOE4wSnFTREl2Z21rMEg1RXc3SXdTamlxcWV3WW1nZUNLOXU0bkJpdDJ1QkdGNnpQWFFJREFRQUJvMk13WVRBZApCZ05WSFE0RUZnUVUyZjRoUUc2VW5yeWJQWng5bUNBWjVZd3dZckl3SHdZRFZSMGpCQmd3Rm9BVTJmNGhRRzZVCm5yeWJQWng5bUNBWjVZd3dZckl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FZWXcKRFFZSktvWklodmNOQVFFTEJRQURnZ0lCQUo1Rm5ndzd0dS9oT3NoODBRQTl6K0xxQnJXeU9yc0dTMmg2MENPWApkS2NzOEFqWWVWclhXb1NLMkJLYUc5bDlYRTF3eGFYNXErV2ppWW5kQWZyczNmbnBrcGZic0VaQzg5TmlxcFgrCk1XY1VhVmlRQ3FvTDdqY2p4MUJSdFBWK251Tjc5K1RNUWpJdFNRekwvMGtNbXg0MC9XNXVsb3A1QTdadjJ3bkwKL1Y5bEZEZmhPUFh6WVJaWTVMVnREUXNFR3o5UUxYK3p4M29hRm9CZytJb2Y2UnNxeHZtNkFScHB2OUpZeDFSWApDSS9oT1dCM1M2eFpoQnFJOGQzTFQzalg1K0V6TGZ6dVFmb2dzTDdMOXppVXdPSFFoUSs3N1N4enErMytrbllhClpIOWJEVE1KQnpON0JqOFJwRnh3UElYQXorT1FxSU4zK3R2bXhZeG9aeEJucFZJdDhNU1pqMysvMFd2aXRVZlcKMmRDRm1VMlVtdzlMamU0QVdrY2RFUU9zUVJpdmg3ZHZERHFQeXMvY0E4R2lDY2psL1lCZXlHQkNBUnNhVTFxNwpONmEzdkxxRTZSNXNHdFJrMnRSRC9wT0xTL0lzZVJZUTFKTUxpSStoMklZVVJwRkhteWdrNzFkU1RseENuS3IzClNld242RUFlczZhSkluS2M5UTB6dEZpak1EdmQxR3BVazc0YVRmT1RsUGY4aEFzL2hDQmNOQU5FeGRxdHZBckIKQXM4ZTVaVFo4NDViMkV6d25leGhGN3NVTWxRTUFpbVRIcEtHOW4vdjU1SUZEbG5kbVFndUx2cWNBRkxUeFdZcAo1S2VYUktRT0tJRVROY1gyYjJUbVFjVFZMOHcwUlNYUFFRQ1dQVW91d3BhWVQwNUtuSmUzMngrU01zai9EMUZ1CjF1d0oKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVRydXN0Q29yIEVDQS0xIE89VHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuIE9VPVRydXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eQojIFN1YmplY3Q6IENOPVRydXN0Q29yIEVDQS0xIE89VHJ1c3RDb3IgU3lzdGVtcyBTLiBkZSBSLkwuIE9VPVRydXN0Q29yIENlcnRpZmljYXRlIEF1dGhvcml0eQojIExhYmVsOiAiVHJ1c3RDb3IgRUNBLTEiCiMgU2VyaWFsOiA5NTQ4MjQyOTQ2OTg4NjI1OTg0CiMgTUQ1IEZpbmdlcnByaW50OiAyNzo5MjoyMzoxZDowYTpmNTo0MDo3YzplOTplNjo2Yjo5ZDpkODpmNTplNzo2YwojIFNIQTEgRmluZ2VycHJpbnQ6IDU4OmQxOmRmOjk1Ojk1OjY3OjZiOjYzOmMwOmYwOjViOjFjOjE3OjRkOjhiOjg0OjBiOmM4Ojc4OmJkCiMgU0hBMjU2IEZpbmdlcnByaW50OiA1YTo4ODo1ZDpiMTo5YzowMTpkOToxMjpjNTo3NTo5Mzo4ODo5Mzo4YzphZjpiYjpkZjowMzoxYTpiMjpkNDo4ZTo5MTplZToxNTo1ODo5Yjo0Mjo5NzoxZDowMzo5YwotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUlEQ0NBd2lnQXdJQkFnSUpBSVNDTEY4Y1l0QkFNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1JR2NNUXN3Q1FZRApWUVFHRXdKUVFURVBNQTBHQTFVRUNBd0dVR0Z1WVcxaE1SUXdFZ1lEVlFRSERBdFFZVzVoYldFZ1EybDBlVEVrCk1DSUdBMVVFQ2d3YlZISjFjM1JEYjNJZ1UzbHpkR1Z0Y3lCVExpQmtaU0JTTGt3dU1TY3dKUVlEVlFRTERCNVUKY25WemRFTnZjaUJEWlhKMGFXWnBZMkYwWlNCQmRYUm9iM0pwZEhreEZ6QVZCZ05WQkFNTURsUnlkWE4wUTI5eQpJRVZEUVMweE1CNFhEVEUyTURJd05ERXlNekl6TTFvWERUSTVNVEl6TVRFM01qZ3dOMW93Z1p3eEN6QUpCZ05WCkJBWVRBbEJCTVE4d0RRWURWUVFJREFaUVlXNWhiV0V4RkRBU0JnTlZCQWNNQzFCaGJtRnRZU0JEYVhSNU1TUXcKSWdZRFZRUUtEQnRVY25WemRFTnZjaUJUZVhOMFpXMXpJRk11SUdSbElGSXVUQzR4SnpBbEJnTlZCQXNNSGxSeQpkWE4wUTI5eUlFTmxjblJwWm1sallYUmxJRUYxZEdodmNtbDBlVEVYTUJVR0ExVUVBd3dPVkhKMWMzUkRiM0lnClJVTkJMVEV3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRFBqK0FSdForb2RuYmIKM3c5VTczTmpLWUt0UjhhamErMytYelA0UTFIcEdqT1JNUmVnZE1UVXB3SG1zcEkrYXAzdER2bDBtRURUUHdPQQpCb0pBNkxIaXAxR25IWU1tYTZ2ZStoZVJLOWpHckI2eG5oa0IxWmVtNmcyM3hGVWZKM3pTQ05WMkh5a1ZoMEE1CjNUaEZFWFhRbXFjMDRML055RklkdVVkK0RiaTd4Z3oyYzFjV1duNURrUjlWT3NadFJBU3FuS21jcDB5SkY0T3UKb3dSZVVvQ0xIaElsRVJuWERIMTlNVVJCNnR1dnNCenZnZEFzeFpvaG16M3RRanRRSnZMc3puRmhCbUloVkU1Lwp3WjArZnlDTWdNc3EySmRpeUlNemtYMndvbG9QVitnN3pQSWxzdFI4TCt4TnhxRTZGWHJudGwwMTlmWklTalpGClp0UzZtRmpCQWdNQkFBR2pZekJoTUIwR0ExVWREZ1FXQkJSRW5rajF6RzFJMUtCTGYvNVpKQytEbDVtYWhqQWYKQmdOVkhTTUVHREFXZ0JSRW5rajF6RzFJMUtCTGYvNVpKQytEbDVtYWhqQVBCZ05WSFJNQkFmOEVCVEFEQVFILwpNQTRHQTFVZER3RUIvd1FFQXdJQmhqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUFCVDQxWEJWd204bkhjMkZ2CmNpdlV3by95UTEwQ3pzU1V1WlFSZzJkZDRtZHNkWGEvdXd5cU5zYXRSNU5qM0I1KzF0NHUvdWtaTWpnRGZ4VDIKQUhNc1diRWhCdUg3ckJpVkRLUC9tWmIzS3llYjFTVE1IZDNCT3VDWVJMREU1RDUzc1hPcFpDejJIQUY4UDExRgpoY0NGNXlXUGxkd1g4enlmR202d3l1TWRLdWxNWS9va1lXTFcybjYySEd6MUFoM1VLdDFWa09zcUVVYzhMbDUwCnNvSWlwWDFUSDBYc0o1Rjk1eUlXNk1Cb050akc4VStBUkRMNTRkSFJIYXJlcUt1Y0JLK3RJQTVrbUUybGE4QkkKV0pacFRkd0hqRkdUb3QrZkR6MkxZTFNDamFvSVRtSkY0UGtMMHVEZ1BGdmVYSEVuSmNMbUE0R0xFRlBqeDFXaQp0Si9YNWc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgojIElzc3VlcjogQ049U1NMLmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQSBPPVNTTCBDb3Jwb3JhdGlvbgojIFN1YmplY3Q6IENOPVNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBSU0EgTz1TU0wgQ29ycG9yYXRpb24KIyBMYWJlbDogIlNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBSU0EiCiMgU2VyaWFsOiA4ODc1NjQwMjk2NTU4MzEwMDQxCiMgTUQ1IEZpbmdlcnByaW50OiA4Njo2OToxMjpjMDo3MDpmMTplYzphYzphYzpjMjpkNTpiYzphNTo1YjphMToyOQojIFNIQTEgRmluZ2VycHJpbnQ6IGI3OmFiOjMzOjA4OmQxOmVhOjQ0Ojc3OmJhOjE0OjgwOjEyOjVhOjZmOmJkOmE5OjM2OjQ5OjBjOmJiCiMgU0hBMjU2IEZpbmdlcnByaW50OiA4NTo2Njo2YTo1NjoyZTplMDpiZTo1YzplOToyNTpjMTpkODo4OTowYTo2Zjo3NjphODo3ZTpjMTo2ZDo0ZDo3ZDo1ZjoyOTplYTo3NDoxOTpjZjoyMDoxMjozYjo2OQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRjNUQ0NBOFdnQXdJQkFnSUlleXliMHhhQU1wa3dEUVlKS29aSWh2Y05BUUVMQlFBd2ZERUxNQWtHQTFVRQpCaE1DVlZNeERqQU1CZ05WQkFnTUJWUmxlR0Z6TVJBd0RnWURWUVFIREFkSWIzVnpkRzl1TVJnd0ZnWURWUVFLCkRBOVRVMHdnUTI5eWNHOXlZWFJwYjI0eE1UQXZCZ05WQkFNTUtGTlRUQzVqYjIwZ1VtOXZkQ0JEWlhKMGFXWnAKWTJGMGFXOXVJRUYxZEdodmNtbDBlU0JTVTBFd0hoY05NVFl3TWpFeU1UY3pPVE01V2hjTk5ERXdNakV5TVRjegpPVE01V2pCOE1Rc3dDUVlEVlFRR0V3SlZVekVPTUF3R0ExVUVDQXdGVkdWNFlYTXhFREFPQmdOVkJBY01CMGh2CmRYTjBiMjR4R0RBV0JnTlZCQW9NRDFOVFRDQkRiM0p3YjNKaGRHbHZiakV4TUM4R0ExVUVBd3dvVTFOTUxtTnYKYlNCU2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNUlGSlRRVENDQWlJd0RRWUpLb1pJaHZjTgpBUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBUGtQM2FNcmZjdlFLdjdzWjRXbTV5NGJ1bmZoNC9XdnBPejZTbDJSCnhGZEhheGgzYTNieS9aUGtQUS9DRnA0TFpzTldsSjRYZzRYT1Z1L3lGdjBBWXZVaUNWVG9aUmRPUWJuZ1QwYVgKcWh2SXVHNWlYbW14WDlzcUFuNzhiTXJ6UWRqdDBPajhQMkZJN2JBREZCMFFEa3NaNEx0TzdJWmwvemJ6WG1jQwpDNTJHVldIOWVqanQvdUlaQUxkdm9WQmlkWFE4b1BySUpaSzBibm9peC9nZW9lT3kzWkV4cXlzZEJQK2xTZ1EzCjZZV2tNeXY5NHRaVk5Id1pwRXBveDdLbzA3ZktvWk9JNjhHWHZJejVIZGtpaENSMHh3UTlhcWtwazh6cnVGdmgKL2w4bHFqUll5TUVqVkowYm1CSERPSngrUFlac3BROUFobndDOUZ3Q1R5akxybkdmRHpySU0vNFJKVFhxL0xyRgpZRDNaZkJqVnNxblRkWGdEY2lMS09zTWY3eXpsTHFuNm5peTJVVWI5cndQVzZtQm82b1VXTm11RjZSN0FzOTNFCkpOeUFLb0ZCYlpRK3lPREpnVUVBbmw2L2Y4VUltS0lZTEVKQXMvbHZPQ2RMVG9EMFBZRkg0SWg4Nmh6T3RYVmMKVVM0Y0szOGFjaWpuQUxYUmRNYlg1Sit0QjVPMlV6VTEvRGZrdy9aZEZyNGhjOTZTQ3ZpZ1kycThscEpxUHZpOApaVldiM3ZVTmlTWUUvQ1VhcGlWcHk4SnR5bnppV1YrWHJPdnZMc2k4MXh0WlBDdk04aG5JazJzbll4blAvT2ttCitNcHhtMytUL2pSbmhFNlo2L3l6ZUFremNMcG1wbmJ0RzNQckdxVU54Q0lUSUpSV0NrNHNiRTZ4L2MrY0NicWkKTSsySEFnTUJBQUdqWXpCaE1CMEdBMVVkRGdRV0JCVGRCQWtIb3ZWNmZWSlRFcEtWN2ppQUpRMm1XVEFQQmdOVgpIUk1CQWY4RUJUQURBUUgvTUI4R0ExVWRJd1FZTUJhQUZOMEVDUWVpOVhwOVVsTVNrcFh1T0lBbERhWlpNQTRHCkExVWREd0VCL3dRRUF3SUJoakFOQmdrcWhraUc5dzBCQVFzRkFBT0NBZ0VBSUJnUmxDbjdKcDBjSGg1d1lmR1YKY3BOeEpLMW9rMWlPTXE4YnMzQUQvQ1VyZElXUVBYaHE5TG1McFpjN3RSaVJ1eDZuK1VCYmtmbFZtYThlRWRCYwpIYWRtNDdHVUJ3d3lPYWJxRzdCNTJCMmNjRVRqaXQzRStaVWZpamhEUHdHRnBVZW5QVWF5dk9VaWFQZDduTmdzClBnb2h5QzB6ckwvRmdaa3hkTUYxY2NXK3NmQWpSZlNkYS93Wlk1Mmp2QVRHR0FzbHUxT0pEN09BVU41RjdrUi8KcTVSNFpKalQ5aWpkaDlod1pYVDdEcmtUNjZjUFlha3lsc3pldSsxalRCaTdxVUQzb0ZSdUlJaHhkUmpxZXJRMApjdUFqSjNkY3RwRHFoaVZBcSs4ekQ4dWZncjZpSVB2MnRTMGE1c0tGc1hRUCs4aGxBcVJTQVVmZFNTTEJ2OWpyCmE2eCszdXhqTXhXM0l3aVB4ZytOUVZyZGpzVzVqK1ZGUDNqYnV0SWJRTEgrY1UwLzRJR2l1bDYwN0JYZ2s5MEkKSDM3aFZaa0xJZDZUbmdyNzVxTkp2VFl3L3VkM3NxQjFsN1V0Z1lnWFpTRDMycEFBbjhsU3pETEtOWHoxUFEvWQpLOWYxSm16SkJqU1dGdXB3V1JveWVYa0x0b2gvRDFKSVBiOXMyS0pFTHRGT3QzSlkwNGtUbGY1RXEvalhpeHR1Cm5Md3NvRnZWYWdDdlh6ZmgxZm9RQzVpY2h1Y21qODd3N0c2S1Z3dUE0MDZ5d0tCallaQzZWV2czZEdxMmt0dWYKb1lZaXRtVW5EdXkybjBKZzVHZkN0ZHBCQzhUVGkyRWJ2UG9ma1N2WFJBZGV1aW1zMmNYcDcxTklXdXVBOFNoWQpJYzJ3QmxYN0p6OVRrSENwQkI1WEo3az0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MgTz1TU0wgQ29ycG9yYXRpb24KIyBTdWJqZWN0OiBDTj1TU0wuY29tIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRUNDIE89U1NMIENvcnBvcmF0aW9uCiMgTGFiZWw6ICJTU0wuY29tIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRUNDIgojIFNlcmlhbDogODQ5NTcyMzgxMzI5NzIxNjQyNAojIE1ENSBGaW5nZXJwcmludDogMmU6ZGE6ZTQ6Mzk6N2Y6OWM6OGY6Mzc6ZDE6NzA6OWY6MjY6MTc6NTE6M2E6OGUKIyBTSEExIEZpbmdlcnByaW50OiBjMzoxOTo3YzozOToyNDplNjo1NDphZjoxYjpjNDphYjoyMDo5NTo3YTplMjpjMzowZToxMzowMjo2YQojIFNIQTI1NiBGaW5nZXJwcmludDogMzQ6MTc6YmI6MDY6Y2M6NjA6MDc6ZGE6MWI6OTY6MWM6OTI6MGI6OGE6YjQ6Y2U6M2Y6YWQ6ODI6MGU6NGE6YTM6MGI6OWE6Y2I6YzQ6YTc6NGU6YmQ6Y2U6YmM6NjUKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNqVENDQWhTZ0F3SUJBZ0lJZGViZnk4Rm9XNmd3Q2dZSUtvWkl6ajBFQXdJd2ZERUxNQWtHQTFVRUJoTUMKVlZNeERqQU1CZ05WQkFnTUJWUmxlR0Z6TVJBd0RnWURWUVFIREFkSWIzVnpkRzl1TVJnd0ZnWURWUVFLREE5VApVMHdnUTI5eWNHOXlZWFJwYjI0eE1UQXZCZ05WQkFNTUtGTlRUQzVqYjIwZ1VtOXZkQ0JEWlhKMGFXWnBZMkYwCmFXOXVJRUYxZEdodmNtbDBlU0JGUTBNd0hoY05NVFl3TWpFeU1UZ3hOREF6V2hjTk5ERXdNakV5TVRneE5EQXoKV2pCOE1Rc3dDUVlEVlFRR0V3SlZVekVPTUF3R0ExVUVDQXdGVkdWNFlYTXhFREFPQmdOVkJBY01CMGh2ZFhOMApiMjR4R0RBV0JnTlZCQW9NRDFOVFRDQkRiM0p3YjNKaGRHbHZiakV4TUM4R0ExVUVBd3dvVTFOTUxtTnZiU0JTCmIyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNUlFVkRRekIyTUJBR0J5cUdTTTQ5QWdFR0JTdUIKQkFBaUEySUFCRVZ1cVZERXBpTTJubDhvalJmTGxpSmtQOXg2amgzTUNMT2ljU1M2amttNUJCdEhsbGlyTFpYSQo3WjRJTmNnbjY0bU1VMWpyWW9yKzhGc1BhekZTWTBFN2ljM3M3TGFOR2RNMEI5eTd4Z1ovd2tXVjdNdC9xQ1BnCkNlbUIrdk5IMDZOak1HRXdIUVlEVlIwT0JCWUVGSUxSaFhNdzV6VUUwNDRDa3Z2bHBOSEVJZWpOTUE4R0ExVWQKRXdFQi93UUZNQU1CQWY4d0h3WURWUjBqQkJnd0ZvQVVndEdGY3pEbk5RVFRqZ0tTKytXazBjUWg2TTB3RGdZRApWUjBQQVFIL0JBUURBZ0dHTUFvR0NDcUdTTTQ5QkFNQ0EyY0FNR1FDTUcvbjYxa1JwR0RQWWJDV2UrMEYrUzhUCmtkenQ1ZnhRYXhGR1JyTWNJUUJpdTc3RDUrak5CNW41RFF0ZGNqN0VxZ0l3SDd5NkMrSXdKUHQ4YllCVkNwaysKZ0EwejVXYWpzNk83cGRXTGp3a3NwbDErNHZBSENHaHQwbnhwYmwvZjVXcGwKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVNTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBSU0EgUjIgTz1TU0wgQ29ycG9yYXRpb24KIyBTdWJqZWN0OiBDTj1TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyIE89U1NMIENvcnBvcmF0aW9uCiMgTGFiZWw6ICJTU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyIgojIFNlcmlhbDogNjI0ODIyNzQ5NDM1Mjk0MzM1MAojIE1ENSBGaW5nZXJwcmludDogZTE6MWU6MzE6NTg6MWE6YWU6NTQ6NTM6MDI6ZjY6MTc6NmE6MTE6N2I6NGQ6OTUKIyBTSEExIEZpbmdlcnByaW50OiA3NDozYTpmMDo1Mjo5YjpkMDozMjphMDpmNDo0YTo4MzpjZDpkNDpiYTphOTo3Yjo3YzoyZTpjNDo5YQojIFNIQTI1NiBGaW5nZXJwcmludDogMmU6N2I6ZjE6NmM6YzI6MjQ6ODU6YTc6YmI6ZTI6YWE6ODY6OTY6NzU6MDc6NjE6YjA6YWU6Mzk6YmU6M2I6MmY6ZTk6ZDA6Y2M6NmQ6NGU6Zjc6MzQ6OTE6NDI6NWMKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUY2ekNDQTlPZ0F3SUJBZ0lJVnJZcHpUUzhlUFl3RFFZSktvWklodmNOQVFFTEJRQXdnWUl4Q3pBSkJnTlYKQkFZVEFsVlRNUTR3REFZRFZRUUlEQVZVWlhoaGN6RVFNQTRHQTFVRUJ3d0hTRzkxYzNSdmJqRVlNQllHQTFVRQpDZ3dQVTFOTUlFTnZjbkJ2Y21GMGFXOXVNVGN3TlFZRFZRUUREQzVUVTB3dVkyOXRJRVZXSUZKdmIzUWdRMlZ5CmRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa2dVbE5CSUZJeU1CNFhEVEUzTURVek1URTRNVFF6TjFvWERUUXkKTURVek1ERTRNVFF6TjFvd2dZSXhDekFKQmdOVkJBWVRBbFZUTVE0d0RBWURWUVFJREFWVVpYaGhjekVRTUE0RwpBMVVFQnd3SFNHOTFjM1J2YmpFWU1CWUdBMVVFQ2d3UFUxTk1JRU52Y25CdmNtRjBhVzl1TVRjd05RWURWUVFECkRDNVRVMHd1WTI5dElFVldJRkp2YjNRZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGtnVWxOQklGSXkKTUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FnOEFNSUlDQ2dLQ0FnRUFqelpsUU9IV1RjRFh0T2xHMm12cQpNMGZOVFBsOWZiNjlMVDN3MjNqaGhxWFp1Z2xYYU8xWFBxRFFDRUdENXloQkpCL2pjaFhRQVJyN1huQWpzc3VmCk9lUFB4VTdHa20wbXhudTdzOW9ublFxRzZZRTNCZjd3Y1hIc3d4enBZNklYRkozdkcyZlRoVlVDQXRaSnljeGEKNGJIM2J6S2Z5ZFE3aUVHb25MM0xxOXR0ZXdrZm9reHlrTm9yQ1B6UFBGVE9adytvejEyV0dRdkU0M0xycmRGOQpIU2Z2a3VzUXYxdnJPNi9QZ04zQjBwWUVXM3ArcEtrOE9IYWtZbzZnT1Y3cWQ4OWRBRm1QWml3K0I2S2pCU1lSCmFaZnFoYmNQbGd0THlFRGhVTG91aXN2M0Q1b2k1MythTnhQTjhrMFRheUhSd013aThxRkc5a1Jwbk1waE5RY0EKYjlaaENCSHF1cmoyNmJOZzVVMjU3SjhVWnNsWFdOdk5oMm40aW9ZU0EwZS9aaE4yckhkOU5DU0ZnODNYcXB5UQpHcDhoTEg5NHQyUzQyT2ltOUhpelZjdUUwakxFZUs2amoySGR6Z2hUcmV5SS9CWGttZzNtbnhwM3preVB1QlFWClBXS2NoamdHQUdZUzVGbDJXbFBBQXBpaUVDdG9SSHVPZWM0elNuYXFXNEVXRzdXSzJOQUFlMTVpdEFuV2htTU8KcGdXVlNib29pNGlUc2pRYzJLUlZicmNjME42WlZUc2o5Q0xnK1NsbUp1d2dVSGZiU2d1UHZ1VUNZSEJCWHRTdQpVRGtpRkNiTHNqdHpkRlZIQjNtQk9hZ3dFMFRsQklxdWxoTWxRZys1VThTYi9NM2tITjQ4K3F2V0Jrb2ZaNmFZCk1CemRMTnZjR0pWWFpzYi9YSXRXOVhjQ0F3RUFBYU5qTUdFd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZkJnTlYKSFNNRUdEQVdnQlQ1WUx2VTQ5VTA5cmoxQm9BbHAzUGJSbW1vbmpBZEJnTlZIUTRFRmdRVStXQzcxT1BWTlBhNAo5UWFBSmFkejIwWnBxSjR3RGdZRFZSMFBBUUgvQkFRREFnR0dNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUNBUUJXCnM0N0xDcDFKanIra3hKRzdaaGNGVVpoMSsrVlFMSHFlOFJUNnE5T0tQditSS1k5amk5aTBxVlFCRGI2VGhpLzUKU20zSFh2VlgrY3BWSEJLK1J3ODJ4ZDlxdDl0MXdrY2xmN254WS9ob0xWVUUwZktOc0tUUHZEeGVIM2pucGFBZwpjTEFFeGJmM2NxZmVJZzI5TXlWR2pHU1NKdU0rTG1PVzJwdU1QZmdZQ2RjRHpIMkdndURLQkFkUlVOZi9rdFVNCjc5cUduNW5YNjdldmFPSTVKcFM2YUxlL2c5UHFlbWM5WW1ldUplVnk2T0xrN0s0Uzlrc3JQSi9wc0VEek9GU3oKL2Jkb3lOckdqMUU4c3Z1UjNCem5tNTNodHcxeWorS2t4S2w0K2VzVXJNWkRCY0psT1NnWUFzT0NzcDBGdm1YdApsbDlsZER6N0NUVXVlNXdUL1JzUFhjZHRnVHBXRDh3NzRhOENMeUtzUnNwR1BLQWNUTlpFdEY0dVhCVm1DZUVtCktmN0dVbUc2c1hQL3d3eWM1V3hxbEQ4VXlrQVdsWVR6V2Ftc1gweGhrMjNSTzh5aWxRd2lwbWRuUkM2NTJkS0sKUWJObUMxcjdmU09sOGhxdy85NmJnNVF1MFQvZmtyZVJyd1U3WmNlZ2JMSE5ZaExEa0J2akpjNDB2RzkzZHJFUQp3L2NGR3NEV3IzUmlTQmQza21tUVlSemVsWUIwVkk4WUhNUHpBOUMvcEVOMWhsTVllZ291Q1J3Mm41SDlnb29pClM5RU9VQ1hkeXdNTUY4bURBQWhPTlUyS2krM3dBcFJtTEVSL3k1VW5saGV0Q1RDc3RuRVhib3NYOWh3SjFDMDcKbUtWeDAxUVQyV0R6OVV0bVQvcng3aUFTamJTc1Y3RkZZNkdzZHFuQyt3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKIyBJc3N1ZXI6IENOPVNTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MgTz1TU0wgQ29ycG9yYXRpb24KIyBTdWJqZWN0OiBDTj1TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRUNDIE89U1NMIENvcnBvcmF0aW9uCiMgTGFiZWw6ICJTU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRUNDIgojIFNlcmlhbDogMzE4MjI0NjUyNjc1NDU1NTI4NQojIE1ENSBGaW5nZXJwcmludDogNTk6NTM6MjI6NjU6ODM6NDI6MDE6NTQ6YzA6Y2U6NDI6Yjk6NWE6N2M6ZjI6OTAKIyBTSEExIEZpbmdlcnByaW50OiA0YzpkZDo1MTphMzpkMTpmNToyMDozMjoxNDpiMDpjNjpjNTozMjoyMzowMzo5MTpjNzo0Njo0Mjo2ZAojIFNIQTI1NiBGaW5nZXJwcmludDogMjI6YTI6YzE6Zjc6YmQ6ZWQ6NzA6NGM6YzE6ZTc6MDE6YjU6ZjQ6MDg6YzM6MTA6ODg6MGY6ZTk6NTY6YjU6ZGU6MmE6NGE6NDQ6Zjk6OWM6ODc6M2E6MjU6YTc6YzgKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNsRENDQWhxZ0F3SUJBZ0lJTENtY1d4YnRCWlV3Q2dZSUtvWkl6ajBFQXdJd2Z6RUxNQWtHQTFVRUJoTUMKVlZNeERqQU1CZ05WQkFnTUJWUmxlR0Z6TVJBd0RnWURWUVFIREFkSWIzVnpkRzl1TVJnd0ZnWURWUVFLREE5VApVMHdnUTI5eWNHOXlZWFJwYjI0eE5EQXlCZ05WQkFNTUsxTlRUQzVqYjIwZ1JWWWdVbTl2ZENCRFpYSjBhV1pwClkyRjBhVzl1SUVGMWRHaHZjbWwwZVNCRlEwTXdIaGNOTVRZd01qRXlNVGd4TlRJeldoY05OREV3TWpFeU1UZ3gKTlRJeldqQi9NUXN3Q1FZRFZRUUdFd0pWVXpFT01Bd0dBMVVFQ0F3RlZHVjRZWE14RURBT0JnTlZCQWNNQjBodgpkWE4wYjI0eEdEQVdCZ05WQkFvTUQxTlRUQ0JEYjNKd2IzSmhkR2x2YmpFME1ESUdBMVVFQXd3clUxTk1MbU52CmJTQkZWaUJTYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1SUVWRFF6QjJNQkFHQnlxR1NNNDkKQWdFR0JTdUJCQUFpQTJJQUJLb1NSNUNZRy92dncwQUhneUJPOFRDQ29nYlI4cEtHWWZMMklXaktBTVRINmtNQQpWSWJjL1IvZkFMaEJZbHpjY0JZeTNoK1oxTXpGQjhnSUgyRVdCMUU5ZlZ3SFUrTTFPSXpmelovWkxnMUt0aGt1ClduQmFCdTIrOEtHd3l0QUpLYU5qTUdFd0hRWURWUjBPQkJZRUZGdktYdVhlMG9HcXphZ3RaRkcyMlhLYmwrWlAKTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SHdZRFZSMGpCQmd3Rm9BVVc4cGU1ZDdTZ2FyTnFDMWtVYmJaY3B1WAo1azh3RGdZRFZSMFBBUUgvQkFRREFnR0dNQW9HQ0NxR1NNNDlCQU1DQTJnQU1HVUNNUUNLNWtDSk4rdnAxUlBaCnl0UnJKUE93UFlkR1dCcnNzZDl2KzFhNmNHdkhPTXpvc1l4UEQvZnhaM1lPZzlBZVVZOENNRDMySXlnbVRNWmcKaDVNbW03STFIcnJXOXp6UkhNNzZKVHltR29FVlcvTVNEMnp1WllySmg2ajVCK0JpbW94Y1NnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpQSwMEFAAAAAAAAAAhAIKyos/RAQAA0QEAAC0AAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvY2VydHMucHkjIS91c3IvYmluL2VudiBweXRob24KIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KCiIiIgpyZXF1ZXN0cy5jZXJ0cwp+fn5+fn5+fn5+fn5+fgoKVGhpcyBtb2R1bGUgcmV0dXJucyB0aGUgcHJlZmVycmVkIGRlZmF1bHQgQ0EgY2VydGlmaWNhdGUgYnVuZGxlLiBUaGVyZSBpcwpvbmx5IG9uZSDigJQgdGhlIG9uZSBmcm9tIHRoZSBjZXJ0aWZpIHBhY2thZ2UuCgpJZiB5b3UgYXJlIHBhY2thZ2luZyBSZXF1ZXN0cywgZS5nLiwgZm9yIGEgTGludXggZGlzdHJpYnV0aW9uIG9yIGEgbWFuYWdlZAplbnZpcm9ubWVudCwgeW91IGNhbiBjaGFuZ2UgdGhlIGRlZmluaXRpb24gb2Ygd2hlcmUoKSB0byByZXR1cm4gYSBzZXBhcmF0ZWx5CnBhY2thZ2VkIENBIGJ1bmRsZS4KIiIiCmZyb20gcGlwLl92ZW5kb3IuY2VydGlmaSBpbXBvcnQgd2hlcmUKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICBwcmludCh3aGVyZSgpKQpQSwMEFAAAAAAAAAAhAHfJYU1aBgAAWgYAAC4AAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvY29tcGF0LnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KCiIiIgpyZXF1ZXN0cy5jb21wYXQKfn5+fn5+fn5+fn5+fn5+CgpUaGlzIG1vZHVsZSBoYW5kbGVzIGltcG9ydCBjb21wYXRpYmlsaXR5IGlzc3VlcyBiZXR3ZWVuIFB5dGhvbiAyIGFuZApQeXRob24gMy4KIiIiCgpmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCBjaGFyZGV0CgppbXBvcnQgc3lzCgojIC0tLS0tLS0KIyBQeXRob25zCiMgLS0tLS0tLQoKIyBTeW50YXggc3VnYXIuCl92ZXIgPSBzeXMudmVyc2lvbl9pbmZvCgojOiBQeXRob24gMi54Pwppc19weTIgPSAoX3ZlclswXSA9PSAyKQoKIzogUHl0aG9uIDMueD8KaXNfcHkzID0gKF92ZXJbMF0gPT0gMykKCiMgdHJ5OgojICAgICBpbXBvcnQgc2ltcGxlanNvbiBhcyBqc29uCiMgZXhjZXB0IEltcG9ydEVycm9yOgppbXBvcnQganNvbgoKIyAtLS0tLS0tLS0KIyBTcGVjaWZpY3MKIyAtLS0tLS0tLS0KCmlmIGlzX3B5MjoKICAgIGZyb20gdXJsbGliIGltcG9ydCAoCiAgICAgICAgcXVvdGUsIHVucXVvdGUsIHF1b3RlX3BsdXMsIHVucXVvdGVfcGx1cywgdXJsZW5jb2RlLCBnZXRwcm94aWVzLAogICAgICAgIHByb3h5X2J5cGFzcywgcHJveHlfYnlwYXNzX2Vudmlyb25tZW50LCBnZXRwcm94aWVzX2Vudmlyb25tZW50KQogICAgZnJvbSB1cmxwYXJzZSBpbXBvcnQgdXJscGFyc2UsIHVybHVucGFyc2UsIHVybGpvaW4sIHVybHNwbGl0LCB1cmxkZWZyYWcKICAgIGZyb20gdXJsbGliMiBpbXBvcnQgcGFyc2VfaHR0cF9saXN0CiAgICBpbXBvcnQgY29va2llbGliCiAgICBmcm9tIENvb2tpZSBpbXBvcnQgTW9yc2VsCiAgICBmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwoKICAgIGZyb20gcGlwLl92ZW5kb3IudXJsbGliMy5wYWNrYWdlcy5vcmRlcmVkX2RpY3QgaW1wb3J0IE9yZGVyZWREaWN0CgogICAgYnVpbHRpbl9zdHIgPSBzdHIKICAgIGJ5dGVzID0gc3RyCiAgICBzdHIgPSB1bmljb2RlCiAgICBiYXNlc3RyaW5nID0gYmFzZXN0cmluZwogICAgbnVtZXJpY190eXBlcyA9IChpbnQsIGxvbmcsIGZsb2F0KQogICAgaW50ZWdlcl90eXBlcyA9IChpbnQsIGxvbmcpCgplbGlmIGlzX3B5MzoKICAgIGZyb20gdXJsbGliLnBhcnNlIGltcG9ydCB1cmxwYXJzZSwgdXJsdW5wYXJzZSwgdXJsam9pbiwgdXJsc3BsaXQsIHVybGVuY29kZSwgcXVvdGUsIHVucXVvdGUsIHF1b3RlX3BsdXMsIHVucXVvdGVfcGx1cywgdXJsZGVmcmFnCiAgICBmcm9tIHVybGxpYi5yZXF1ZXN0IGltcG9ydCBwYXJzZV9odHRwX2xpc3QsIGdldHByb3hpZXMsIHByb3h5X2J5cGFzcywgcHJveHlfYnlwYXNzX2Vudmlyb25tZW50LCBnZXRwcm94aWVzX2Vudmlyb25tZW50CiAgICBmcm9tIGh0dHAgaW1wb3J0IGNvb2tpZWphciBhcyBjb29raWVsaWIKICAgIGZyb20gaHR0cC5jb29raWVzIGltcG9ydCBNb3JzZWwKICAgIGZyb20gaW8gaW1wb3J0IFN0cmluZ0lPCiAgICBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBPcmRlcmVkRGljdAoKICAgIGJ1aWx0aW5fc3RyID0gc3RyCiAgICBzdHIgPSBzdHIKICAgIGJ5dGVzID0gYnl0ZXMKICAgIGJhc2VzdHJpbmcgPSAoc3RyLCBieXRlcykKICAgIG51bWVyaWNfdHlwZXMgPSAoaW50LCBmbG9hdCkKICAgIGludGVnZXJfdHlwZXMgPSAoaW50LCkKUEsDBBQAAAAAAAAAIQATQ8kzIEcAACBHAAAvAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL2Nvb2tpZXMucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoKIiIiCnJlcXVlc3RzLmNvb2tpZXMKfn5+fn5+fn5+fn5+fn5+fgoKQ29tcGF0aWJpbGl0eSBjb2RlIHRvIGJlIGFibGUgdG8gdXNlIGBjb29raWVsaWIuQ29va2llSmFyYCB3aXRoIHJlcXVlc3RzLgoKcmVxdWVzdHMudXRpbHMgaW1wb3J0cyBmcm9tIGhlcmUsIHNvIGJlIGNhcmVmdWwgd2l0aCBpbXBvcnRzLgoiIiIKCmltcG9ydCBjb3B5CmltcG9ydCB0aW1lCmltcG9ydCBjYWxlbmRhcgppbXBvcnQgY29sbGVjdGlvbnMKCmZyb20gLl9pbnRlcm5hbF91dGlscyBpbXBvcnQgdG9fbmF0aXZlX3N0cmluZwpmcm9tIC5jb21wYXQgaW1wb3J0IGNvb2tpZWxpYiwgdXJscGFyc2UsIHVybHVucGFyc2UsIE1vcnNlbAoKdHJ5OgogICAgaW1wb3J0IHRocmVhZGluZwpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBpbXBvcnQgZHVtbXlfdGhyZWFkaW5nIGFzIHRocmVhZGluZwoKCmNsYXNzIE1vY2tSZXF1ZXN0KG9iamVjdCk6CiAgICAiIiJXcmFwcyBhIGByZXF1ZXN0cy5SZXF1ZXN0YCB0byBtaW1pYyBhIGB1cmxsaWIyLlJlcXVlc3RgLgoKICAgIFRoZSBjb2RlIGluIGBjb29raWVsaWIuQ29va2llSmFyYCBleHBlY3RzIHRoaXMgaW50ZXJmYWNlIGluIG9yZGVyIHRvIGNvcnJlY3RseQogICAgbWFuYWdlIGNvb2tpZSBwb2xpY2llcywgaS5lLiwgZGV0ZXJtaW5lIHdoZXRoZXIgYSBjb29raWUgY2FuIGJlIHNldCwgZ2l2ZW4gdGhlCiAgICBkb21haW5zIG9mIHRoZSByZXF1ZXN0IGFuZCB0aGUgY29va2llLgoKICAgIFRoZSBvcmlnaW5hbCByZXF1ZXN0IG9iamVjdCBpcyByZWFkLW9ubHkuIFRoZSBjbGllbnQgaXMgcmVzcG9uc2libGUgZm9yIGNvbGxlY3RpbmcKICAgIHRoZSBuZXcgaGVhZGVycyB2aWEgYGdldF9uZXdfaGVhZGVycygpYCBhbmQgaW50ZXJwcmV0aW5nIHRoZW0gYXBwcm9wcmlhdGVseS4gWW91CiAgICBwcm9iYWJseSB3YW50IGBnZXRfY29va2llX2hlYWRlcmAsIGRlZmluZWQgYmVsb3cuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgcmVxdWVzdCk6CiAgICAgICAgc2VsZi5fciA9IHJlcXVlc3QKICAgICAgICBzZWxmLl9uZXdfaGVhZGVycyA9IHt9CiAgICAgICAgc2VsZi50eXBlID0gdXJscGFyc2Uoc2VsZi5fci51cmwpLnNjaGVtZQoKICAgIGRlZiBnZXRfdHlwZShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi50eXBlCgogICAgZGVmIGdldF9ob3N0KHNlbGYpOgogICAgICAgIHJldHVybiB1cmxwYXJzZShzZWxmLl9yLnVybCkubmV0bG9jCgogICAgZGVmIGdldF9vcmlnaW5fcmVxX2hvc3Qoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuZ2V0X2hvc3QoKQoKICAgIGRlZiBnZXRfZnVsbF91cmwoc2VsZik6CiAgICAgICAgIyBPbmx5IHJldHVybiB0aGUgcmVzcG9uc2UncyBVUkwgaWYgdGhlIHVzZXIgaGFkbid0IHNldCB0aGUgSG9zdAogICAgICAgICMgaGVhZGVyCiAgICAgICAgaWYgbm90IHNlbGYuX3IuaGVhZGVycy5nZXQoJ0hvc3QnKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3IudXJsCiAgICAgICAgIyBJZiB0aGV5IGRpZCBzZXQgaXQsIHJldHJpZXZlIGl0IGFuZCByZWNvbnN0cnVjdCB0aGUgZXhwZWN0ZWQgZG9tYWluCiAgICAgICAgaG9zdCA9IHRvX25hdGl2ZV9zdHJpbmcoc2VsZi5fci5oZWFkZXJzWydIb3N0J10sIGVuY29kaW5nPSd1dGYtOCcpCiAgICAgICAgcGFyc2VkID0gdXJscGFyc2Uoc2VsZi5fci51cmwpCiAgICAgICAgIyBSZWNvbnN0cnVjdCB0aGUgVVJMIGFzIHdlIGV4cGVjdCBpdAogICAgICAgIHJldHVybiB1cmx1bnBhcnNlKFsKICAgICAgICAgICAgcGFyc2VkLnNjaGVtZSwgaG9zdCwgcGFyc2VkLnBhdGgsIHBhcnNlZC5wYXJhbXMsIHBhcnNlZC5xdWVyeSwKICAgICAgICAgICAgcGFyc2VkLmZyYWdtZW50CiAgICAgICAgXSkKCiAgICBkZWYgaXNfdW52ZXJpZmlhYmxlKHNlbGYpOgogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGhhc19oZWFkZXIoc2VsZiwgbmFtZSk6CiAgICAgICAgcmV0dXJuIG5hbWUgaW4gc2VsZi5fci5oZWFkZXJzIG9yIG5hbWUgaW4gc2VsZi5fbmV3X2hlYWRlcnMKCiAgICBkZWYgZ2V0X2hlYWRlcihzZWxmLCBuYW1lLCBkZWZhdWx0PU5vbmUpOgogICAgICAgIHJldHVybiBzZWxmLl9yLmhlYWRlcnMuZ2V0KG5hbWUsIHNlbGYuX25ld19oZWFkZXJzLmdldChuYW1lLCBkZWZhdWx0KSkKCiAgICBkZWYgYWRkX2hlYWRlcihzZWxmLCBrZXksIHZhbCk6CiAgICAgICAgIiIiY29va2llbGliIGhhcyBubyBsZWdpdGltYXRlIHVzZSBmb3IgdGhpcyBtZXRob2Q7IGFkZCBpdCBiYWNrIGlmIHlvdSBmaW5kIG9uZS4iIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCJDb29raWUgaGVhZGVycyBzaG91bGQgYmUgYWRkZWQgd2l0aCBhZGRfdW5yZWRpcmVjdGVkX2hlYWRlcigpIikKCiAgICBkZWYgYWRkX3VucmVkaXJlY3RlZF9oZWFkZXIoc2VsZiwgbmFtZSwgdmFsdWUpOgogICAgICAgIHNlbGYuX25ld19oZWFkZXJzW25hbWVdID0gdmFsdWUKCiAgICBkZWYgZ2V0X25ld19oZWFkZXJzKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9uZXdfaGVhZGVycwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHVudmVyaWZpYWJsZShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5pc191bnZlcmlmaWFibGUoKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIG9yaWdpbl9yZXFfaG9zdChzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5nZXRfb3JpZ2luX3JlcV9ob3N0KCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBob3N0KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmdldF9ob3N0KCkKCgpjbGFzcyBNb2NrUmVzcG9uc2Uob2JqZWN0KToKICAgICIiIldyYXBzIGEgYGh0dHBsaWIuSFRUUE1lc3NhZ2VgIHRvIG1pbWljIGEgYHVybGxpYi5hZGRpbmZvdXJsYC4KCiAgICAuLi53aGF0PyBCYXNpY2FsbHksIGV4cG9zZSB0aGUgcGFyc2VkIEhUVFAgaGVhZGVycyBmcm9tIHRoZSBzZXJ2ZXIgcmVzcG9uc2UKICAgIHRoZSB3YXkgYGNvb2tpZWxpYmAgZXhwZWN0cyB0byBzZWUgdGhlbS4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBoZWFkZXJzKToKICAgICAgICAiIiJNYWtlIGEgTW9ja1Jlc3BvbnNlIGZvciBgY29va2llbGliYCB0byByZWFkLgoKICAgICAgICA6cGFyYW0gaGVhZGVyczogYSBodHRwbGliLkhUVFBNZXNzYWdlIG9yIGFuYWxvZ291cyBjYXJyeWluZyB0aGUgaGVhZGVycwogICAgICAgICIiIgogICAgICAgIHNlbGYuX2hlYWRlcnMgPSBoZWFkZXJzCgogICAgZGVmIGluZm8oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2hlYWRlcnMKCiAgICBkZWYgZ2V0aGVhZGVycyhzZWxmLCBuYW1lKToKICAgICAgICBzZWxmLl9oZWFkZXJzLmdldGhlYWRlcnMobmFtZSkKCgpkZWYgZXh0cmFjdF9jb29raWVzX3RvX2phcihqYXIsIHJlcXVlc3QsIHJlc3BvbnNlKToKICAgICIiIkV4dHJhY3QgdGhlIGNvb2tpZXMgZnJvbSB0aGUgcmVzcG9uc2UgaW50byBhIENvb2tpZUphci4KCiAgICA6cGFyYW0gamFyOiBjb29raWVsaWIuQ29va2llSmFyIChub3QgbmVjZXNzYXJpbHkgYSBSZXF1ZXN0c0Nvb2tpZUphcikKICAgIDpwYXJhbSByZXF1ZXN0OiBvdXIgb3duIHJlcXVlc3RzLlJlcXVlc3Qgb2JqZWN0CiAgICA6cGFyYW0gcmVzcG9uc2U6IHVybGxpYjMuSFRUUFJlc3BvbnNlIG9iamVjdAogICAgIiIiCiAgICBpZiBub3QgKGhhc2F0dHIocmVzcG9uc2UsICdfb3JpZ2luYWxfcmVzcG9uc2UnKSBhbmQKICAgICAgICAgICAgcmVzcG9uc2UuX29yaWdpbmFsX3Jlc3BvbnNlKToKICAgICAgICByZXR1cm4KICAgICMgdGhlIF9vcmlnaW5hbF9yZXNwb25zZSBmaWVsZCBpcyB0aGUgd3JhcHBlZCBodHRwbGliLkhUVFBSZXNwb25zZSBvYmplY3QsCiAgICByZXEgPSBNb2NrUmVxdWVzdChyZXF1ZXN0KQogICAgIyBwdWxsIG91dCB0aGUgSFRUUE1lc3NhZ2Ugd2l0aCB0aGUgaGVhZGVycyBhbmQgcHV0IGl0IGluIHRoZSBtb2NrOgogICAgcmVzID0gTW9ja1Jlc3BvbnNlKHJlc3BvbnNlLl9vcmlnaW5hbF9yZXNwb25zZS5tc2cpCiAgICBqYXIuZXh0cmFjdF9jb29raWVzKHJlcywgcmVxKQoKCmRlZiBnZXRfY29va2llX2hlYWRlcihqYXIsIHJlcXVlc3QpOgogICAgIiIiCiAgICBQcm9kdWNlIGFuIGFwcHJvcHJpYXRlIENvb2tpZSBoZWFkZXIgc3RyaW5nIHRvIGJlIHNlbnQgd2l0aCBgcmVxdWVzdGAsIG9yIE5vbmUuCgogICAgOnJ0eXBlOiBzdHIKICAgICIiIgogICAgciA9IE1vY2tSZXF1ZXN0KHJlcXVlc3QpCiAgICBqYXIuYWRkX2Nvb2tpZV9oZWFkZXIocikKICAgIHJldHVybiByLmdldF9uZXdfaGVhZGVycygpLmdldCgnQ29va2llJykKCgpkZWYgcmVtb3ZlX2Nvb2tpZV9ieV9uYW1lKGNvb2tpZWphciwgbmFtZSwgZG9tYWluPU5vbmUsIHBhdGg9Tm9uZSk6CiAgICAiIiJVbnNldHMgYSBjb29raWUgYnkgbmFtZSwgYnkgZGVmYXVsdCBvdmVyIGFsbCBkb21haW5zIGFuZCBwYXRocy4KCiAgICBXcmFwcyBDb29raWVKYXIuY2xlYXIoKSwgaXMgTyhuKS4KICAgICIiIgogICAgY2xlYXJhYmxlcyA9IFtdCiAgICBmb3IgY29va2llIGluIGNvb2tpZWphcjoKICAgICAgICBpZiBjb29raWUubmFtZSAhPSBuYW1lOgogICAgICAgICAgICBjb250aW51ZQogICAgICAgIGlmIGRvbWFpbiBpcyBub3QgTm9uZSBhbmQgZG9tYWluICE9IGNvb2tpZS5kb21haW46CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgaWYgcGF0aCBpcyBub3QgTm9uZSBhbmQgcGF0aCAhPSBjb29raWUucGF0aDoKICAgICAgICAgICAgY29udGludWUKICAgICAgICBjbGVhcmFibGVzLmFwcGVuZCgoY29va2llLmRvbWFpbiwgY29va2llLnBhdGgsIGNvb2tpZS5uYW1lKSkKCiAgICBmb3IgZG9tYWluLCBwYXRoLCBuYW1lIGluIGNsZWFyYWJsZXM6CiAgICAgICAgY29va2llamFyLmNsZWFyKGRvbWFpbiwgcGF0aCwgbmFtZSkKCgpjbGFzcyBDb29raWVDb25mbGljdEVycm9yKFJ1bnRpbWVFcnJvcik6CiAgICAiIiJUaGVyZSBhcmUgdHdvIGNvb2tpZXMgdGhhdCBtZWV0IHRoZSBjcml0ZXJpYSBzcGVjaWZpZWQgaW4gdGhlIGNvb2tpZSBqYXIuCiAgICBVc2UgLmdldCBhbmQgLnNldCBhbmQgaW5jbHVkZSBkb21haW4gYW5kIHBhdGggYXJncyBpbiBvcmRlciB0byBiZSBtb3JlIHNwZWNpZmljLgogICAgIiIiCgoKY2xhc3MgUmVxdWVzdHNDb29raWVKYXIoY29va2llbGliLkNvb2tpZUphciwgY29sbGVjdGlvbnMuTXV0YWJsZU1hcHBpbmcpOgogICAgIiIiQ29tcGF0aWJpbGl0eSBjbGFzczsgaXMgYSBjb29raWVsaWIuQ29va2llSmFyLCBidXQgZXhwb3NlcyBhIGRpY3QKICAgIGludGVyZmFjZS4KCiAgICBUaGlzIGlzIHRoZSBDb29raWVKYXIgd2UgY3JlYXRlIGJ5IGRlZmF1bHQgZm9yIHJlcXVlc3RzIGFuZCBzZXNzaW9ucyB0aGF0CiAgICBkb24ndCBzcGVjaWZ5IG9uZSwgc2luY2Ugc29tZSBjbGllbnRzIG1heSBleHBlY3QgcmVzcG9uc2UuY29va2llcyBhbmQKICAgIHNlc3Npb24uY29va2llcyB0byBzdXBwb3J0IGRpY3Qgb3BlcmF0aW9ucy4KCiAgICBSZXF1ZXN0cyBkb2VzIG5vdCB1c2UgdGhlIGRpY3QgaW50ZXJmYWNlIGludGVybmFsbHk7IGl0J3MganVzdCBmb3IKICAgIGNvbXBhdGliaWxpdHkgd2l0aCBleHRlcm5hbCBjbGllbnQgY29kZS4gQWxsIHJlcXVlc3RzIGNvZGUgc2hvdWxkIHdvcmsKICAgIG91dCBvZiB0aGUgYm94IHdpdGggZXh0ZXJuYWxseSBwcm92aWRlZCBpbnN0YW5jZXMgb2YgYGBDb29raWVKYXJgYCwgZS5nLgogICAgYGBMV1BDb29raWVKYXJgYCBhbmQgYGBGaWxlQ29va2llSmFyYGAuCgogICAgVW5saWtlIGEgcmVndWxhciBDb29raWVKYXIsIHRoaXMgY2xhc3MgaXMgcGlja2xlYWJsZS4KCiAgICAuLiB3YXJuaW5nOjogZGljdGlvbmFyeSBvcGVyYXRpb25zIHRoYXQgYXJlIG5vcm1hbGx5IE8oMSkgbWF5IGJlIE8obikuCiAgICAiIiIKCiAgICBkZWYgZ2V0KHNlbGYsIG5hbWUsIGRlZmF1bHQ9Tm9uZSwgZG9tYWluPU5vbmUsIHBhdGg9Tm9uZSk6CiAgICAgICAgIiIiRGljdC1saWtlIGdldCgpIHRoYXQgYWxzbyBzdXBwb3J0cyBvcHRpb25hbCBkb21haW4gYW5kIHBhdGggYXJncyBpbgogICAgICAgIG9yZGVyIHRvIHJlc29sdmUgbmFtaW5nIGNvbGxpc2lvbnMgZnJvbSB1c2luZyBvbmUgY29va2llIGphciBvdmVyCiAgICAgICAgbXVsdGlwbGUgZG9tYWlucy4KCiAgICAgICAgLi4gd2FybmluZzo6IG9wZXJhdGlvbiBpcyBPKG4pLCBub3QgTygxKS4KICAgICAgICAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9maW5kX25vX2R1cGxpY2F0ZXMobmFtZSwgZG9tYWluLCBwYXRoKQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHQKCiAgICBkZWYgc2V0KHNlbGYsIG5hbWUsIHZhbHVlLCAqKmt3YXJncyk6CiAgICAgICAgIiIiRGljdC1saWtlIHNldCgpIHRoYXQgYWxzbyBzdXBwb3J0cyBvcHRpb25hbCBkb21haW4gYW5kIHBhdGggYXJncyBpbgogICAgICAgIG9yZGVyIHRvIHJlc29sdmUgbmFtaW5nIGNvbGxpc2lvbnMgZnJvbSB1c2luZyBvbmUgY29va2llIGphciBvdmVyCiAgICAgICAgbXVsdGlwbGUgZG9tYWlucy4KICAgICAgICAiIiIKICAgICAgICAjIHN1cHBvcnQgY2xpZW50IGNvZGUgdGhhdCB1bnNldHMgY29va2llcyBieSBhc3NpZ25tZW50IG9mIGEgTm9uZSB2YWx1ZToKICAgICAgICBpZiB2YWx1ZSBpcyBOb25lOgogICAgICAgICAgICByZW1vdmVfY29va2llX2J5X25hbWUoc2VsZiwgbmFtZSwgZG9tYWluPWt3YXJncy5nZXQoJ2RvbWFpbicpLCBwYXRoPWt3YXJncy5nZXQoJ3BhdGgnKSkKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIE1vcnNlbCk6CiAgICAgICAgICAgIGMgPSBtb3JzZWxfdG9fY29va2llKHZhbHVlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGMgPSBjcmVhdGVfY29va2llKG5hbWUsIHZhbHVlLCAqKmt3YXJncykKICAgICAgICBzZWxmLnNldF9jb29raWUoYykKICAgICAgICByZXR1cm4gYwoKICAgIGRlZiBpdGVya2V5cyhzZWxmKToKICAgICAgICAiIiJEaWN0LWxpa2UgaXRlcmtleXMoKSB0aGF0IHJldHVybnMgYW4gaXRlcmF0b3Igb2YgbmFtZXMgb2YgY29va2llcwogICAgICAgIGZyb20gdGhlIGphci4KCiAgICAgICAgLi4gc2VlYWxzbzo6IGl0ZXJ2YWx1ZXMoKSBhbmQgaXRlcml0ZW1zKCkuCiAgICAgICAgIiIiCiAgICAgICAgZm9yIGNvb2tpZSBpbiBpdGVyKHNlbGYpOgogICAgICAgICAgICB5aWVsZCBjb29raWUubmFtZQoKICAgIGRlZiBrZXlzKHNlbGYpOgogICAgICAgICIiIkRpY3QtbGlrZSBrZXlzKCkgdGhhdCByZXR1cm5zIGEgbGlzdCBvZiBuYW1lcyBvZiBjb29raWVzIGZyb20gdGhlCiAgICAgICAgamFyLgoKICAgICAgICAuLiBzZWVhbHNvOjogdmFsdWVzKCkgYW5kIGl0ZW1zKCkuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5pdGVya2V5cygpKQoKICAgIGRlZiBpdGVydmFsdWVzKHNlbGYpOgogICAgICAgICIiIkRpY3QtbGlrZSBpdGVydmFsdWVzKCkgdGhhdCByZXR1cm5zIGFuIGl0ZXJhdG9yIG9mIHZhbHVlcyBvZiBjb29raWVzCiAgICAgICAgZnJvbSB0aGUgamFyLgoKICAgICAgICAuLiBzZWVhbHNvOjogaXRlcmtleXMoKSBhbmQgaXRlcml0ZW1zKCkuCiAgICAgICAgIiIiCiAgICAgICAgZm9yIGNvb2tpZSBpbiBpdGVyKHNlbGYpOgogICAgICAgICAgICB5aWVsZCBjb29raWUudmFsdWUKCiAgICBkZWYgdmFsdWVzKHNlbGYpOgogICAgICAgICIiIkRpY3QtbGlrZSB2YWx1ZXMoKSB0aGF0IHJldHVybnMgYSBsaXN0IG9mIHZhbHVlcyBvZiBjb29raWVzIGZyb20gdGhlCiAgICAgICAgamFyLgoKICAgICAgICAuLiBzZWVhbHNvOjoga2V5cygpIGFuZCBpdGVtcygpLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBsaXN0KHNlbGYuaXRlcnZhbHVlcygpKQoKICAgIGRlZiBpdGVyaXRlbXMoc2VsZik6CiAgICAgICAgIiIiRGljdC1saWtlIGl0ZXJpdGVtcygpIHRoYXQgcmV0dXJucyBhbiBpdGVyYXRvciBvZiBuYW1lLXZhbHVlIHR1cGxlcwogICAgICAgIGZyb20gdGhlIGphci4KCiAgICAgICAgLi4gc2VlYWxzbzo6IGl0ZXJrZXlzKCkgYW5kIGl0ZXJ2YWx1ZXMoKS4KICAgICAgICAiIiIKICAgICAgICBmb3IgY29va2llIGluIGl0ZXIoc2VsZik6CiAgICAgICAgICAgIHlpZWxkIGNvb2tpZS5uYW1lLCBjb29raWUudmFsdWUKCiAgICBkZWYgaXRlbXMoc2VsZik6CiAgICAgICAgIiIiRGljdC1saWtlIGl0ZW1zKCkgdGhhdCByZXR1cm5zIGEgbGlzdCBvZiBuYW1lLXZhbHVlIHR1cGxlcyBmcm9tIHRoZQogICAgICAgIGphci4gQWxsb3dzIGNsaWVudC1jb2RlIHRvIGNhbGwgYGBkaWN0KFJlcXVlc3RzQ29va2llSmFyKWBgIGFuZCBnZXQgYQogICAgICAgIHZhbmlsbGEgcHl0aG9uIGRpY3Qgb2Yga2V5IHZhbHVlIHBhaXJzLgoKICAgICAgICAuLiBzZWVhbHNvOjoga2V5cygpIGFuZCB2YWx1ZXMoKS4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gbGlzdChzZWxmLml0ZXJpdGVtcygpKQoKICAgIGRlZiBsaXN0X2RvbWFpbnMoc2VsZik6CiAgICAgICAgIiIiVXRpbGl0eSBtZXRob2QgdG8gbGlzdCBhbGwgdGhlIGRvbWFpbnMgaW4gdGhlIGphci4iIiIKICAgICAgICBkb21haW5zID0gW10KICAgICAgICBmb3IgY29va2llIGluIGl0ZXIoc2VsZik6CiAgICAgICAgICAgIGlmIGNvb2tpZS5kb21haW4gbm90IGluIGRvbWFpbnM6CiAgICAgICAgICAgICAgICBkb21haW5zLmFwcGVuZChjb29raWUuZG9tYWluKQogICAgICAgIHJldHVybiBkb21haW5zCgogICAgZGVmIGxpc3RfcGF0aHMoc2VsZik6CiAgICAgICAgIiIiVXRpbGl0eSBtZXRob2QgdG8gbGlzdCBhbGwgdGhlIHBhdGhzIGluIHRoZSBqYXIuIiIiCiAgICAgICAgcGF0aHMgPSBbXQogICAgICAgIGZvciBjb29raWUgaW4gaXRlcihzZWxmKToKICAgICAgICAgICAgaWYgY29va2llLnBhdGggbm90IGluIHBhdGhzOgogICAgICAgICAgICAgICAgcGF0aHMuYXBwZW5kKGNvb2tpZS5wYXRoKQogICAgICAgIHJldHVybiBwYXRocwoKICAgIGRlZiBtdWx0aXBsZV9kb21haW5zKHNlbGYpOgogICAgICAgICIiIlJldHVybnMgVHJ1ZSBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgZG9tYWlucyBpbiB0aGUgamFyLgogICAgICAgIFJldHVybnMgRmFsc2Ugb3RoZXJ3aXNlLgoKICAgICAgICA6cnR5cGU6IGJvb2wKICAgICAgICAiIiIKICAgICAgICBkb21haW5zID0gW10KICAgICAgICBmb3IgY29va2llIGluIGl0ZXIoc2VsZik6CiAgICAgICAgICAgIGlmIGNvb2tpZS5kb21haW4gaXMgbm90IE5vbmUgYW5kIGNvb2tpZS5kb21haW4gaW4gZG9tYWluczoKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgICAgIGRvbWFpbnMuYXBwZW5kKGNvb2tpZS5kb21haW4pCiAgICAgICAgcmV0dXJuIEZhbHNlICAjIHRoZXJlIGlzIG9ubHkgb25lIGRvbWFpbiBpbiBqYXIKCiAgICBkZWYgZ2V0X2RpY3Qoc2VsZiwgZG9tYWluPU5vbmUsIHBhdGg9Tm9uZSk6CiAgICAgICAgIiIiVGFrZXMgYXMgYW4gYXJndW1lbnQgYW4gb3B0aW9uYWwgZG9tYWluIGFuZCBwYXRoIGFuZCByZXR1cm5zIGEgcGxhaW4KICAgICAgICBvbGQgUHl0aG9uIGRpY3Qgb2YgbmFtZS12YWx1ZSBwYWlycyBvZiBjb29raWVzIHRoYXQgbWVldCB0aGUKICAgICAgICByZXF1aXJlbWVudHMuCgogICAgICAgIDpydHlwZTogZGljdAogICAgICAgICIiIgogICAgICAgIGRpY3Rpb25hcnkgPSB7fQogICAgICAgIGZvciBjb29raWUgaW4gaXRlcihzZWxmKToKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgKGRvbWFpbiBpcyBOb25lIG9yIGNvb2tpZS5kb21haW4gPT0gZG9tYWluKSBhbmQKICAgICAgICAgICAgICAgIChwYXRoIGlzIE5vbmUgb3IgY29va2llLnBhdGggPT0gcGF0aCkKICAgICAgICAgICAgKToKICAgICAgICAgICAgICAgIGRpY3Rpb25hcnlbY29va2llLm5hbWVdID0gY29va2llLnZhbHVlCiAgICAgICAgcmV0dXJuIGRpY3Rpb25hcnkKCiAgICBkZWYgX19jb250YWluc19fKHNlbGYsIG5hbWUpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHN1cGVyKFJlcXVlc3RzQ29va2llSmFyLCBzZWxmKS5fX2NvbnRhaW5zX18obmFtZSkKICAgICAgICBleGNlcHQgQ29va2llQ29uZmxpY3RFcnJvcjoKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgbmFtZSk6CiAgICAgICAgIiIiRGljdC1saWtlIF9fZ2V0aXRlbV9fKCkgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBjbGllbnQgY29kZS4gVGhyb3dzCiAgICAgICAgZXhjZXB0aW9uIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIGNvb2tpZSB3aXRoIG5hbWUuIEluIHRoYXQgY2FzZSwKICAgICAgICB1c2UgdGhlIG1vcmUgZXhwbGljaXQgZ2V0KCkgbWV0aG9kIGluc3RlYWQuCgogICAgICAgIC4uIHdhcm5pbmc6OiBvcGVyYXRpb24gaXMgTyhuKSwgbm90IE8oMSkuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbmRfbm9fZHVwbGljYXRlcyhuYW1lKQoKICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBuYW1lLCB2YWx1ZSk6CiAgICAgICAgIiIiRGljdC1saWtlIF9fc2V0aXRlbV9fIGZvciBjb21wYXRpYmlsaXR5IHdpdGggY2xpZW50IGNvZGUuIFRocm93cwogICAgICAgIGV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbHJlYWR5IGEgY29va2llIG9mIHRoYXQgbmFtZSBpbiB0aGUgamFyLiBJbiB0aGF0CiAgICAgICAgY2FzZSwgdXNlIHRoZSBtb3JlIGV4cGxpY2l0IHNldCgpIG1ldGhvZCBpbnN0ZWFkLgogICAgICAgICIiIgogICAgICAgIHNlbGYuc2V0KG5hbWUsIHZhbHVlKQoKICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBuYW1lKToKICAgICAgICAiIiJEZWxldGVzIGEgY29va2llIGdpdmVuIGEgbmFtZS4gV3JhcHMgYGBjb29raWVsaWIuQ29va2llSmFyYGAncwogICAgICAgIGBgcmVtb3ZlX2Nvb2tpZV9ieV9uYW1lKClgYC4KICAgICAgICAiIiIKICAgICAgICByZW1vdmVfY29va2llX2J5X25hbWUoc2VsZiwgbmFtZSkKCiAgICBkZWYgc2V0X2Nvb2tpZShzZWxmLCBjb29raWUsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgaWYgaGFzYXR0cihjb29raWUudmFsdWUsICdzdGFydHN3aXRoJykgYW5kIGNvb2tpZS52YWx1ZS5zdGFydHN3aXRoKCciJykgYW5kIGNvb2tpZS52YWx1ZS5lbmRzd2l0aCgnIicpOgogICAgICAgICAgICBjb29raWUudmFsdWUgPSBjb29raWUudmFsdWUucmVwbGFjZSgnXFwiJywgJycpCiAgICAgICAgcmV0dXJuIHN1cGVyKFJlcXVlc3RzQ29va2llSmFyLCBzZWxmKS5zZXRfY29va2llKGNvb2tpZSwgKmFyZ3MsICoqa3dhcmdzKQoKICAgIGRlZiB1cGRhdGUoc2VsZiwgb3RoZXIpOgogICAgICAgICIiIlVwZGF0ZXMgdGhpcyBqYXIgd2l0aCBjb29raWVzIGZyb20gYW5vdGhlciBDb29raWVKYXIgb3IgZGljdC1saWtlIiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgY29va2llbGliLkNvb2tpZUphcik6CiAgICAgICAgICAgIGZvciBjb29raWUgaW4gb3RoZXI6CiAgICAgICAgICAgICAgICBzZWxmLnNldF9jb29raWUoY29weS5jb3B5KGNvb2tpZSkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc3VwZXIoUmVxdWVzdHNDb29raWVKYXIsIHNlbGYpLnVwZGF0ZShvdGhlcikKCiAgICBkZWYgX2ZpbmQoc2VsZiwgbmFtZSwgZG9tYWluPU5vbmUsIHBhdGg9Tm9uZSk6CiAgICAgICAgIiIiUmVxdWVzdHMgdXNlcyB0aGlzIG1ldGhvZCBpbnRlcm5hbGx5IHRvIGdldCBjb29raWUgdmFsdWVzLgoKICAgICAgICBJZiB0aGVyZSBhcmUgY29uZmxpY3RpbmcgY29va2llcywgX2ZpbmQgYXJiaXRyYXJpbHkgY2hvb3NlcyBvbmUuCiAgICAgICAgU2VlIF9maW5kX25vX2R1cGxpY2F0ZXMgaWYgeW91IHdhbnQgYW4gZXhjZXB0aW9uIHRocm93biBpZiB0aGVyZSBhcmUKICAgICAgICBjb25mbGljdGluZyBjb29raWVzLgoKICAgICAgICA6cGFyYW0gbmFtZTogYSBzdHJpbmcgY29udGFpbmluZyBuYW1lIG9mIGNvb2tpZQogICAgICAgIDpwYXJhbSBkb21haW46IChvcHRpb25hbCkgc3RyaW5nIGNvbnRhaW5pbmcgZG9tYWluIG9mIGNvb2tpZQogICAgICAgIDpwYXJhbSBwYXRoOiAob3B0aW9uYWwpIHN0cmluZyBjb250YWluaW5nIHBhdGggb2YgY29va2llCiAgICAgICAgOnJldHVybjogY29va2llLnZhbHVlCiAgICAgICAgIiIiCiAgICAgICAgZm9yIGNvb2tpZSBpbiBpdGVyKHNlbGYpOgogICAgICAgICAgICBpZiBjb29raWUubmFtZSA9PSBuYW1lOgogICAgICAgICAgICAgICAgaWYgZG9tYWluIGlzIE5vbmUgb3IgY29va2llLmRvbWFpbiA9PSBkb21haW46CiAgICAgICAgICAgICAgICAgICAgaWYgcGF0aCBpcyBOb25lIG9yIGNvb2tpZS5wYXRoID09IHBhdGg6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb29raWUudmFsdWUKCiAgICAgICAgcmFpc2UgS2V5RXJyb3IoJ25hbWU9JXIsIGRvbWFpbj0lciwgcGF0aD0lcicgJSAobmFtZSwgZG9tYWluLCBwYXRoKSkKCiAgICBkZWYgX2ZpbmRfbm9fZHVwbGljYXRlcyhzZWxmLCBuYW1lLCBkb21haW49Tm9uZSwgcGF0aD1Ob25lKToKICAgICAgICAiIiJCb3RoIGBgX19nZXRfaXRlbV9fYGAgYW5kIGBgZ2V0YGAgY2FsbCB0aGlzIGZ1bmN0aW9uOiBpdCdzIG5ldmVyCiAgICAgICAgdXNlZCBlbHNld2hlcmUgaW4gUmVxdWVzdHMuCgogICAgICAgIDpwYXJhbSBuYW1lOiBhIHN0cmluZyBjb250YWluaW5nIG5hbWUgb2YgY29va2llCiAgICAgICAgOnBhcmFtIGRvbWFpbjogKG9wdGlvbmFsKSBzdHJpbmcgY29udGFpbmluZyBkb21haW4gb2YgY29va2llCiAgICAgICAgOnBhcmFtIHBhdGg6IChvcHRpb25hbCkgc3RyaW5nIGNvbnRhaW5pbmcgcGF0aCBvZiBjb29raWUKICAgICAgICA6cmFpc2VzIEtleUVycm9yOiBpZiBjb29raWUgaXMgbm90IGZvdW5kCiAgICAgICAgOnJhaXNlcyBDb29raWVDb25mbGljdEVycm9yOiBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgY29va2llcwogICAgICAgICAgICB0aGF0IG1hdGNoIG5hbWUgYW5kIG9wdGlvbmFsbHkgZG9tYWluIGFuZCBwYXRoCiAgICAgICAgOnJldHVybjogY29va2llLnZhbHVlCiAgICAgICAgIiIiCiAgICAgICAgdG9SZXR1cm4gPSBOb25lCiAgICAgICAgZm9yIGNvb2tpZSBpbiBpdGVyKHNlbGYpOgogICAgICAgICAgICBpZiBjb29raWUubmFtZSA9PSBuYW1lOgogICAgICAgICAgICAgICAgaWYgZG9tYWluIGlzIE5vbmUgb3IgY29va2llLmRvbWFpbiA9PSBkb21haW46CiAgICAgICAgICAgICAgICAgICAgaWYgcGF0aCBpcyBOb25lIG9yIGNvb2tpZS5wYXRoID09IHBhdGg6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRvUmV0dXJuIGlzIG5vdCBOb25lOiAgIyBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgY29va2llcyB0aGF0IG1lZXQgcGFzc2VkIGluIGNyaXRlcmlhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBDb29raWVDb25mbGljdEVycm9yKCdUaGVyZSBhcmUgbXVsdGlwbGUgY29va2llcyB3aXRoIG5hbWUsICVyJyAlIChuYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgdG9SZXR1cm4gPSBjb29raWUudmFsdWUgICMgd2Ugd2lsbCBldmVudHVhbGx5IHJldHVybiB0aGlzIGFzIGxvbmcgYXMgbm8gY29va2llIGNvbmZsaWN0CgogICAgICAgIGlmIHRvUmV0dXJuOgogICAgICAgICAgICByZXR1cm4gdG9SZXR1cm4KICAgICAgICByYWlzZSBLZXlFcnJvcignbmFtZT0lciwgZG9tYWluPSVyLCBwYXRoPSVyJyAlIChuYW1lLCBkb21haW4sIHBhdGgpKQoKICAgIGRlZiBfX2dldHN0YXRlX18oc2VsZik6CiAgICAgICAgIiIiVW5saWtlIGEgbm9ybWFsIENvb2tpZUphciwgdGhpcyBjbGFzcyBpcyBwaWNrbGVhYmxlLiIiIgogICAgICAgIHN0YXRlID0gc2VsZi5fX2RpY3RfXy5jb3B5KCkKICAgICAgICAjIHJlbW92ZSB0aGUgdW5waWNrbGVhYmxlIFJMb2NrIG9iamVjdAogICAgICAgIHN0YXRlLnBvcCgnX2Nvb2tpZXNfbG9jaycpCiAgICAgICAgcmV0dXJuIHN0YXRlCgogICAgZGVmIF9fc2V0c3RhdGVfXyhzZWxmLCBzdGF0ZSk6CiAgICAgICAgIiIiVW5saWtlIGEgbm9ybWFsIENvb2tpZUphciwgdGhpcyBjbGFzcyBpcyBwaWNrbGVhYmxlLiIiIgogICAgICAgIHNlbGYuX19kaWN0X18udXBkYXRlKHN0YXRlKQogICAgICAgIGlmICdfY29va2llc19sb2NrJyBub3QgaW4gc2VsZi5fX2RpY3RfXzoKICAgICAgICAgICAgc2VsZi5fY29va2llc19sb2NrID0gdGhyZWFkaW5nLlJMb2NrKCkKCiAgICBkZWYgY29weShzZWxmKToKICAgICAgICAiIiJSZXR1cm4gYSBjb3B5IG9mIHRoaXMgUmVxdWVzdHNDb29raWVKYXIuIiIiCiAgICAgICAgbmV3X2NqID0gUmVxdWVzdHNDb29raWVKYXIoKQogICAgICAgIG5ld19jai51cGRhdGUoc2VsZikKICAgICAgICByZXR1cm4gbmV3X2NqCgoKZGVmIF9jb3B5X2Nvb2tpZV9qYXIoamFyKToKICAgIGlmIGphciBpcyBOb25lOgogICAgICAgIHJldHVybiBOb25lCgogICAgaWYgaGFzYXR0cihqYXIsICdjb3B5Jyk6CiAgICAgICAgIyBXZSdyZSBkZWFsaW5nIHdpdGggYW4gaW5zdGFuY2Ugb2YgUmVxdWVzdHNDb29raWVKYXIKICAgICAgICByZXR1cm4gamFyLmNvcHkoKQogICAgIyBXZSdyZSBkZWFsaW5nIHdpdGggYSBnZW5lcmljIENvb2tpZUphciBpbnN0YW5jZQogICAgbmV3X2phciA9IGNvcHkuY29weShqYXIpCiAgICBuZXdfamFyLmNsZWFyKCkKICAgIGZvciBjb29raWUgaW4gamFyOgogICAgICAgIG5ld19qYXIuc2V0X2Nvb2tpZShjb3B5LmNvcHkoY29va2llKSkKICAgIHJldHVybiBuZXdfamFyCgoKZGVmIGNyZWF0ZV9jb29raWUobmFtZSwgdmFsdWUsICoqa3dhcmdzKToKICAgICIiIk1ha2UgYSBjb29raWUgZnJvbSB1bmRlcnNwZWNpZmllZCBwYXJhbWV0ZXJzLgoKICAgIEJ5IGRlZmF1bHQsIHRoZSBwYWlyIG9mIGBuYW1lYCBhbmQgYHZhbHVlYCB3aWxsIGJlIHNldCBmb3IgdGhlIGRvbWFpbiAnJwogICAgYW5kIHNlbnQgb24gZXZlcnkgcmVxdWVzdCAodGhpcyBpcyBzb21ldGltZXMgY2FsbGVkIGEgInN1cGVyY29va2llIikuCiAgICAiIiIKICAgIHJlc3VsdCA9IGRpY3QoCiAgICAgICAgdmVyc2lvbj0wLAogICAgICAgIG5hbWU9bmFtZSwKICAgICAgICB2YWx1ZT12YWx1ZSwKICAgICAgICBwb3J0PU5vbmUsCiAgICAgICAgZG9tYWluPScnLAogICAgICAgIHBhdGg9Jy8nLAogICAgICAgIHNlY3VyZT1GYWxzZSwKICAgICAgICBleHBpcmVzPU5vbmUsCiAgICAgICAgZGlzY2FyZD1UcnVlLAogICAgICAgIGNvbW1lbnQ9Tm9uZSwKICAgICAgICBjb21tZW50X3VybD1Ob25lLAogICAgICAgIHJlc3Q9eydIdHRwT25seSc6IE5vbmV9LAogICAgICAgIHJmYzIxMDk9RmFsc2UsKQoKICAgIGJhZGFyZ3MgPSBzZXQoa3dhcmdzKSAtIHNldChyZXN1bHQpCiAgICBpZiBiYWRhcmdzOgogICAgICAgIGVyciA9ICdjcmVhdGVfY29va2llKCkgZ290IHVuZXhwZWN0ZWQga2V5d29yZCBhcmd1bWVudHM6ICVzJwogICAgICAgIHJhaXNlIFR5cGVFcnJvcihlcnIgJSBsaXN0KGJhZGFyZ3MpKQoKICAgIHJlc3VsdC51cGRhdGUoa3dhcmdzKQogICAgcmVzdWx0Wydwb3J0X3NwZWNpZmllZCddID0gYm9vbChyZXN1bHRbJ3BvcnQnXSkKICAgIHJlc3VsdFsnZG9tYWluX3NwZWNpZmllZCddID0gYm9vbChyZXN1bHRbJ2RvbWFpbiddKQogICAgcmVzdWx0Wydkb21haW5faW5pdGlhbF9kb3QnXSA9IHJlc3VsdFsnZG9tYWluJ10uc3RhcnRzd2l0aCgnLicpCiAgICByZXN1bHRbJ3BhdGhfc3BlY2lmaWVkJ10gPSBib29sKHJlc3VsdFsncGF0aCddKQoKICAgIHJldHVybiBjb29raWVsaWIuQ29va2llKCoqcmVzdWx0KQoKCmRlZiBtb3JzZWxfdG9fY29va2llKG1vcnNlbCk6CiAgICAiIiJDb252ZXJ0IGEgTW9yc2VsIG9iamVjdCBpbnRvIGEgQ29va2llIGNvbnRhaW5pbmcgdGhlIG9uZSBrL3YgcGFpci4iIiIKCiAgICBleHBpcmVzID0gTm9uZQogICAgaWYgbW9yc2VsWydtYXgtYWdlJ106CiAgICAgICAgdHJ5OgogICAgICAgICAgICBleHBpcmVzID0gaW50KHRpbWUudGltZSgpICsgaW50KG1vcnNlbFsnbWF4LWFnZSddKSkKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdtYXgtYWdlOiAlcyBtdXN0IGJlIGludGVnZXInICUgbW9yc2VsWydtYXgtYWdlJ10pCiAgICBlbGlmIG1vcnNlbFsnZXhwaXJlcyddOgogICAgICAgIHRpbWVfdGVtcGxhdGUgPSAnJWEsICVkLSViLSVZICVIOiVNOiVTIEdNVCcKICAgICAgICBleHBpcmVzID0gY2FsZW5kYXIudGltZWdtKAogICAgICAgICAgICB0aW1lLnN0cnB0aW1lKG1vcnNlbFsnZXhwaXJlcyddLCB0aW1lX3RlbXBsYXRlKQogICAgICAgICkKICAgIHJldHVybiBjcmVhdGVfY29va2llKAogICAgICAgIGNvbW1lbnQ9bW9yc2VsWydjb21tZW50J10sCiAgICAgICAgY29tbWVudF91cmw9Ym9vbChtb3JzZWxbJ2NvbW1lbnQnXSksCiAgICAgICAgZGlzY2FyZD1GYWxzZSwKICAgICAgICBkb21haW49bW9yc2VsWydkb21haW4nXSwKICAgICAgICBleHBpcmVzPWV4cGlyZXMsCiAgICAgICAgbmFtZT1tb3JzZWwua2V5LAogICAgICAgIHBhdGg9bW9yc2VsWydwYXRoJ10sCiAgICAgICAgcG9ydD1Ob25lLAogICAgICAgIHJlc3Q9eydIdHRwT25seSc6IG1vcnNlbFsnaHR0cG9ubHknXX0sCiAgICAgICAgcmZjMjEwOT1GYWxzZSwKICAgICAgICBzZWN1cmU9Ym9vbChtb3JzZWxbJ3NlY3VyZSddKSwKICAgICAgICB2YWx1ZT1tb3JzZWwudmFsdWUsCiAgICAgICAgdmVyc2lvbj1tb3JzZWxbJ3ZlcnNpb24nXSBvciAwLAogICAgKQoKCmRlZiBjb29raWVqYXJfZnJvbV9kaWN0KGNvb2tpZV9kaWN0LCBjb29raWVqYXI9Tm9uZSwgb3ZlcndyaXRlPVRydWUpOgogICAgIiIiUmV0dXJucyBhIENvb2tpZUphciBmcm9tIGEga2V5L3ZhbHVlIGRpY3Rpb25hcnkuCgogICAgOnBhcmFtIGNvb2tpZV9kaWN0OiBEaWN0IG9mIGtleS92YWx1ZXMgdG8gaW5zZXJ0IGludG8gQ29va2llSmFyLgogICAgOnBhcmFtIGNvb2tpZWphcjogKG9wdGlvbmFsKSBBIGNvb2tpZWphciB0byBhZGQgdGhlIGNvb2tpZXMgdG8uCiAgICA6cGFyYW0gb3ZlcndyaXRlOiAob3B0aW9uYWwpIElmIEZhbHNlLCB3aWxsIG5vdCByZXBsYWNlIGNvb2tpZXMKICAgICAgICBhbHJlYWR5IGluIHRoZSBqYXIgd2l0aCBuZXcgb25lcy4KICAgICIiIgogICAgaWYgY29va2llamFyIGlzIE5vbmU6CiAgICAgICAgY29va2llamFyID0gUmVxdWVzdHNDb29raWVKYXIoKQoKICAgIGlmIGNvb2tpZV9kaWN0IGlzIG5vdCBOb25lOgogICAgICAgIG5hbWVzX2Zyb21famFyID0gW2Nvb2tpZS5uYW1lIGZvciBjb29raWUgaW4gY29va2llamFyXQogICAgICAgIGZvciBuYW1lIGluIGNvb2tpZV9kaWN0OgogICAgICAgICAgICBpZiBvdmVyd3JpdGUgb3IgKG5hbWUgbm90IGluIG5hbWVzX2Zyb21famFyKToKICAgICAgICAgICAgICAgIGNvb2tpZWphci5zZXRfY29va2llKGNyZWF0ZV9jb29raWUobmFtZSwgY29va2llX2RpY3RbbmFtZV0pKQoKICAgIHJldHVybiBjb29raWVqYXIKCgpkZWYgbWVyZ2VfY29va2llcyhjb29raWVqYXIsIGNvb2tpZXMpOgogICAgIiIiQWRkIGNvb2tpZXMgdG8gY29va2llamFyIGFuZCByZXR1cm5zIGEgbWVyZ2VkIENvb2tpZUphci4KCiAgICA6cGFyYW0gY29va2llamFyOiBDb29raWVKYXIgb2JqZWN0IHRvIGFkZCB0aGUgY29va2llcyB0by4KICAgIDpwYXJhbSBjb29raWVzOiBEaWN0aW9uYXJ5IG9yIENvb2tpZUphciBvYmplY3QgdG8gYmUgYWRkZWQuCiAgICAiIiIKICAgIGlmIG5vdCBpc2luc3RhbmNlKGNvb2tpZWphciwgY29va2llbGliLkNvb2tpZUphcik6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignWW91IGNhbiBvbmx5IG1lcmdlIGludG8gQ29va2llSmFyJykKCiAgICBpZiBpc2luc3RhbmNlKGNvb2tpZXMsIGRpY3QpOgogICAgICAgIGNvb2tpZWphciA9IGNvb2tpZWphcl9mcm9tX2RpY3QoCiAgICAgICAgICAgIGNvb2tpZXMsIGNvb2tpZWphcj1jb29raWVqYXIsIG92ZXJ3cml0ZT1GYWxzZSkKICAgIGVsaWYgaXNpbnN0YW5jZShjb29raWVzLCBjb29raWVsaWIuQ29va2llSmFyKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGNvb2tpZWphci51cGRhdGUoY29va2llcykKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIGZvciBjb29raWVfaW5famFyIGluIGNvb2tpZXM6CiAgICAgICAgICAgICAgICBjb29raWVqYXIuc2V0X2Nvb2tpZShjb29raWVfaW5famFyKQoKICAgIHJldHVybiBjb29raWVqYXIKUEsDBBQAAAAAAAAAIQD5zunQKwwAACsMAAAyAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL2V4Y2VwdGlvbnMucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoKIiIiCnJlcXVlc3RzLmV4Y2VwdGlvbnMKfn5+fn5+fn5+fn5+fn5+fn5+fgoKVGhpcyBtb2R1bGUgY29udGFpbnMgdGhlIHNldCBvZiBSZXF1ZXN0cycgZXhjZXB0aW9ucy4KIiIiCmZyb20gcGlwLl92ZW5kb3IudXJsbGliMy5leGNlcHRpb25zIGltcG9ydCBIVFRQRXJyb3IgYXMgQmFzZUhUVFBFcnJvcgoKCmNsYXNzIFJlcXVlc3RFeGNlcHRpb24oSU9FcnJvcik6CiAgICAiIiJUaGVyZSB3YXMgYW4gYW1iaWd1b3VzIGV4Y2VwdGlvbiB0aGF0IG9jY3VycmVkIHdoaWxlIGhhbmRsaW5nIHlvdXIKICAgIHJlcXVlc3QuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAiIiJJbml0aWFsaXplIFJlcXVlc3RFeGNlcHRpb24gd2l0aCBgcmVxdWVzdGAgYW5kIGByZXNwb25zZWAgb2JqZWN0cy4iIiIKICAgICAgICByZXNwb25zZSA9IGt3YXJncy5wb3AoJ3Jlc3BvbnNlJywgTm9uZSkKICAgICAgICBzZWxmLnJlc3BvbnNlID0gcmVzcG9uc2UKICAgICAgICBzZWxmLnJlcXVlc3QgPSBrd2FyZ3MucG9wKCdyZXF1ZXN0JywgTm9uZSkKICAgICAgICBpZiAocmVzcG9uc2UgaXMgbm90IE5vbmUgYW5kIG5vdCBzZWxmLnJlcXVlc3QgYW5kCiAgICAgICAgICAgICAgICBoYXNhdHRyKHJlc3BvbnNlLCAncmVxdWVzdCcpKToKICAgICAgICAgICAgc2VsZi5yZXF1ZXN0ID0gc2VsZi5yZXNwb25zZS5yZXF1ZXN0CiAgICAgICAgc3VwZXIoUmVxdWVzdEV4Y2VwdGlvbiwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3dhcmdzKQoKCmNsYXNzIEhUVFBFcnJvcihSZXF1ZXN0RXhjZXB0aW9uKToKICAgICIiIkFuIEhUVFAgZXJyb3Igb2NjdXJyZWQuIiIiCgoKY2xhc3MgQ29ubmVjdGlvbkVycm9yKFJlcXVlc3RFeGNlcHRpb24pOgogICAgIiIiQSBDb25uZWN0aW9uIGVycm9yIG9jY3VycmVkLiIiIgoKCmNsYXNzIFByb3h5RXJyb3IoQ29ubmVjdGlvbkVycm9yKToKICAgICIiIkEgcHJveHkgZXJyb3Igb2NjdXJyZWQuIiIiCgoKY2xhc3MgU1NMRXJyb3IoQ29ubmVjdGlvbkVycm9yKToKICAgICIiIkFuIFNTTCBlcnJvciBvY2N1cnJlZC4iIiIKCgpjbGFzcyBUaW1lb3V0KFJlcXVlc3RFeGNlcHRpb24pOgogICAgIiIiVGhlIHJlcXVlc3QgdGltZWQgb3V0LgoKICAgIENhdGNoaW5nIHRoaXMgZXJyb3Igd2lsbCBjYXRjaCBib3RoCiAgICA6ZXhjOmB+cmVxdWVzdHMuZXhjZXB0aW9ucy5Db25uZWN0VGltZW91dGAgYW5kCiAgICA6ZXhjOmB+cmVxdWVzdHMuZXhjZXB0aW9ucy5SZWFkVGltZW91dGAgZXJyb3JzLgogICAgIiIiCgoKY2xhc3MgQ29ubmVjdFRpbWVvdXQoQ29ubmVjdGlvbkVycm9yLCBUaW1lb3V0KToKICAgICIiIlRoZSByZXF1ZXN0IHRpbWVkIG91dCB3aGlsZSB0cnlpbmcgdG8gY29ubmVjdCB0byB0aGUgcmVtb3RlIHNlcnZlci4KCiAgICBSZXF1ZXN0cyB0aGF0IHByb2R1Y2VkIHRoaXMgZXJyb3IgYXJlIHNhZmUgdG8gcmV0cnkuCiAgICAiIiIKCgpjbGFzcyBSZWFkVGltZW91dChUaW1lb3V0KToKICAgICIiIlRoZSBzZXJ2ZXIgZGlkIG5vdCBzZW5kIGFueSBkYXRhIGluIHRoZSBhbGxvdHRlZCBhbW91bnQgb2YgdGltZS4iIiIKCgpjbGFzcyBVUkxSZXF1aXJlZChSZXF1ZXN0RXhjZXB0aW9uKToKICAgICIiIkEgdmFsaWQgVVJMIGlzIHJlcXVpcmVkIHRvIG1ha2UgYSByZXF1ZXN0LiIiIgoKCmNsYXNzIFRvb01hbnlSZWRpcmVjdHMoUmVxdWVzdEV4Y2VwdGlvbik6CiAgICAiIiJUb28gbWFueSByZWRpcmVjdHMuIiIiCgoKY2xhc3MgTWlzc2luZ1NjaGVtYShSZXF1ZXN0RXhjZXB0aW9uLCBWYWx1ZUVycm9yKToKICAgICIiIlRoZSBVUkwgc2NoZW1hIChlLmcuIGh0dHAgb3IgaHR0cHMpIGlzIG1pc3NpbmcuIiIiCgoKY2xhc3MgSW52YWxpZFNjaGVtYShSZXF1ZXN0RXhjZXB0aW9uLCBWYWx1ZUVycm9yKToKICAgICIiIlNlZSBkZWZhdWx0cy5weSBmb3IgdmFsaWQgc2NoZW1hcy4iIiIKCgpjbGFzcyBJbnZhbGlkVVJMKFJlcXVlc3RFeGNlcHRpb24sIFZhbHVlRXJyb3IpOgogICAgIiIiVGhlIFVSTCBwcm92aWRlZCB3YXMgc29tZWhvdyBpbnZhbGlkLiIiIgoKCmNsYXNzIEludmFsaWRIZWFkZXIoUmVxdWVzdEV4Y2VwdGlvbiwgVmFsdWVFcnJvcik6CiAgICAiIiJUaGUgaGVhZGVyIHZhbHVlIHByb3ZpZGVkIHdhcyBzb21laG93IGludmFsaWQuIiIiCgoKY2xhc3MgQ2h1bmtlZEVuY29kaW5nRXJyb3IoUmVxdWVzdEV4Y2VwdGlvbik6CiAgICAiIiJUaGUgc2VydmVyIGRlY2xhcmVkIGNodW5rZWQgZW5jb2RpbmcgYnV0IHNlbnQgYW4gaW52YWxpZCBjaHVuay4iIiIKCgpjbGFzcyBDb250ZW50RGVjb2RpbmdFcnJvcihSZXF1ZXN0RXhjZXB0aW9uLCBCYXNlSFRUUEVycm9yKToKICAgICIiIkZhaWxlZCB0byBkZWNvZGUgcmVzcG9uc2UgY29udGVudCIiIgoKCmNsYXNzIFN0cmVhbUNvbnN1bWVkRXJyb3IoUmVxdWVzdEV4Y2VwdGlvbiwgVHlwZUVycm9yKToKICAgICIiIlRoZSBjb250ZW50IGZvciB0aGlzIHJlc3BvbnNlIHdhcyBhbHJlYWR5IGNvbnN1bWVkIiIiCgoKY2xhc3MgUmV0cnlFcnJvcihSZXF1ZXN0RXhjZXB0aW9uKToKICAgICIiIkN1c3RvbSByZXRyaWVzIGxvZ2ljIGZhaWxlZCIiIgoKCmNsYXNzIFVucmV3aW5kYWJsZUJvZHlFcnJvcihSZXF1ZXN0RXhjZXB0aW9uKToKICAgICIiIlJlcXVlc3RzIGVuY291bnRlcmVkIGFuIGVycm9yIHdoZW4gdHJ5aW5nIHRvIHJld2luZCBhIGJvZHkiIiIKCiMgV2FybmluZ3MKCgpjbGFzcyBSZXF1ZXN0c1dhcm5pbmcoV2FybmluZyk6CiAgICAiIiJCYXNlIHdhcm5pbmcgZm9yIFJlcXVlc3RzLiIiIgogICAgcGFzcwoKCmNsYXNzIEZpbGVNb2RlV2FybmluZyhSZXF1ZXN0c1dhcm5pbmcsIERlcHJlY2F0aW9uV2FybmluZyk6CiAgICAiIiJBIGZpbGUgd2FzIG9wZW5lZCBpbiB0ZXh0IG1vZGUsIGJ1dCBSZXF1ZXN0cyBkZXRlcm1pbmVkIGl0cyBiaW5hcnkgbGVuZ3RoLiIiIgogICAgcGFzcwoKCmNsYXNzIFJlcXVlc3RzRGVwZW5kZW5jeVdhcm5pbmcoUmVxdWVzdHNXYXJuaW5nKToKICAgICIiIkFuIGltcG9ydGVkIGRlcGVuZGVuY3kgZG9lc24ndCBtYXRjaCB0aGUgZXhwZWN0ZWQgdmVyc2lvbiByYW5nZS4iIiIKICAgIHBhc3MKUEsDBBQAAAAAAAAAIQCEHWDiUw4AAFMOAAAsAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL2hlbHAucHkiIiJNb2R1bGUgY29udGFpbmluZyBidWcgcmVwb3J0IGhlbHBlcihzKS4iIiIKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgoKaW1wb3J0IGpzb24KaW1wb3J0IHBsYXRmb3JtCmltcG9ydCBzeXMKaW1wb3J0IHNzbAoKZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgaWRuYQpmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCB1cmxsaWIzCmZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IGNoYXJkZXQKCmZyb20gLiBpbXBvcnQgX192ZXJzaW9uX18gYXMgcmVxdWVzdHNfdmVyc2lvbgoKdHJ5OgogICAgZnJvbSAucGFja2FnZXMudXJsbGliMy5jb250cmliIGltcG9ydCBweW9wZW5zc2wKZXhjZXB0IEltcG9ydEVycm9yOgogICAgcHlvcGVuc3NsID0gTm9uZQogICAgT3BlblNTTCA9IE5vbmUKICAgIGNyeXB0b2dyYXBoeSA9IE5vbmUKZWxzZToKICAgIGltcG9ydCBPcGVuU1NMCiAgICBpbXBvcnQgY3J5cHRvZ3JhcGh5CgoKZGVmIF9pbXBsZW1lbnRhdGlvbigpOgogICAgIiIiUmV0dXJuIGEgZGljdCB3aXRoIHRoZSBQeXRob24gaW1wbGVtZW50YXRpb24gYW5kIHZlcnNpb24uCgogICAgUHJvdmlkZSBib3RoIHRoZSBuYW1lIGFuZCB0aGUgdmVyc2lvbiBvZiB0aGUgUHl0aG9uIGltcGxlbWVudGF0aW9uCiAgICBjdXJyZW50bHkgcnVubmluZy4gRm9yIGV4YW1wbGUsIG9uIENQeXRob24gMi43LjUgaXQgd2lsbCByZXR1cm4KICAgIHsnbmFtZSc6ICdDUHl0aG9uJywgJ3ZlcnNpb24nOiAnMi43LjUnfS4KCiAgICBUaGlzIGZ1bmN0aW9uIHdvcmtzIGJlc3Qgb24gQ1B5dGhvbiBhbmQgUHlQeTogaW4gcGFydGljdWxhciwgaXQgcHJvYmFibHkKICAgIGRvZXNuJ3Qgd29yayBmb3IgSnl0aG9uIG9yIElyb25QeXRob24uIEZ1dHVyZSBpbnZlc3RpZ2F0aW9uIHNob3VsZCBiZSBkb25lCiAgICB0byB3b3JrIG91dCB0aGUgY29ycmVjdCBzaGFwZSBvZiB0aGUgY29kZSBmb3IgdGhvc2UgcGxhdGZvcm1zLgogICAgIiIiCiAgICBpbXBsZW1lbnRhdGlvbiA9IHBsYXRmb3JtLnB5dGhvbl9pbXBsZW1lbnRhdGlvbigpCgogICAgaWYgaW1wbGVtZW50YXRpb24gPT0gJ0NQeXRob24nOgogICAgICAgIGltcGxlbWVudGF0aW9uX3ZlcnNpb24gPSBwbGF0Zm9ybS5weXRob25fdmVyc2lvbigpCiAgICBlbGlmIGltcGxlbWVudGF0aW9uID09ICdQeVB5JzoKICAgICAgICBpbXBsZW1lbnRhdGlvbl92ZXJzaW9uID0gJyVzLiVzLiVzJyAlIChzeXMucHlweV92ZXJzaW9uX2luZm8ubWFqb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnB5cHlfdmVyc2lvbl9pbmZvLm1pbm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5weXB5X3ZlcnNpb25faW5mby5taWNybykKICAgICAgICBpZiBzeXMucHlweV92ZXJzaW9uX2luZm8ucmVsZWFzZWxldmVsICE9ICdmaW5hbCc6CiAgICAgICAgICAgIGltcGxlbWVudGF0aW9uX3ZlcnNpb24gPSAnJy5qb2luKFsKICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uX3ZlcnNpb24sIHN5cy5weXB5X3ZlcnNpb25faW5mby5yZWxlYXNlbGV2ZWwKICAgICAgICAgICAgXSkKICAgIGVsaWYgaW1wbGVtZW50YXRpb24gPT0gJ0p5dGhvbic6CiAgICAgICAgaW1wbGVtZW50YXRpb25fdmVyc2lvbiA9IHBsYXRmb3JtLnB5dGhvbl92ZXJzaW9uKCkgICMgQ29tcGxldGUgR3Vlc3MKICAgIGVsaWYgaW1wbGVtZW50YXRpb24gPT0gJ0lyb25QeXRob24nOgogICAgICAgIGltcGxlbWVudGF0aW9uX3ZlcnNpb24gPSBwbGF0Zm9ybS5weXRob25fdmVyc2lvbigpICAjIENvbXBsZXRlIEd1ZXNzCiAgICBlbHNlOgogICAgICAgIGltcGxlbWVudGF0aW9uX3ZlcnNpb24gPSAnVW5rbm93bicKCiAgICByZXR1cm4geyduYW1lJzogaW1wbGVtZW50YXRpb24sICd2ZXJzaW9uJzogaW1wbGVtZW50YXRpb25fdmVyc2lvbn0KCgpkZWYgaW5mbygpOgogICAgIiIiR2VuZXJhdGUgaW5mb3JtYXRpb24gZm9yIGEgYnVnIHJlcG9ydC4iIiIKICAgIHRyeToKICAgICAgICBwbGF0Zm9ybV9pbmZvID0gewogICAgICAgICAgICAnc3lzdGVtJzogcGxhdGZvcm0uc3lzdGVtKCksCiAgICAgICAgICAgICdyZWxlYXNlJzogcGxhdGZvcm0ucmVsZWFzZSgpLAogICAgICAgIH0KICAgIGV4Y2VwdCBJT0Vycm9yOgogICAgICAgIHBsYXRmb3JtX2luZm8gPSB7CiAgICAgICAgICAgICdzeXN0ZW0nOiAnVW5rbm93bicsCiAgICAgICAgICAgICdyZWxlYXNlJzogJ1Vua25vd24nLAogICAgICAgIH0KCiAgICBpbXBsZW1lbnRhdGlvbl9pbmZvID0gX2ltcGxlbWVudGF0aW9uKCkKICAgIHVybGxpYjNfaW5mbyA9IHsndmVyc2lvbic6IHVybGxpYjMuX192ZXJzaW9uX199CiAgICBjaGFyZGV0X2luZm8gPSB7J3ZlcnNpb24nOiBjaGFyZGV0Ll9fdmVyc2lvbl9ffQoKICAgIHB5b3BlbnNzbF9pbmZvID0gewogICAgICAgICd2ZXJzaW9uJzogTm9uZSwKICAgICAgICAnb3BlbnNzbF92ZXJzaW9uJzogJycsCiAgICB9CiAgICBpZiBPcGVuU1NMOgogICAgICAgIHB5b3BlbnNzbF9pbmZvID0gewogICAgICAgICAgICAndmVyc2lvbic6IE9wZW5TU0wuX192ZXJzaW9uX18sCiAgICAgICAgICAgICdvcGVuc3NsX3ZlcnNpb24nOiAnJXgnICUgT3BlblNTTC5TU0wuT1BFTlNTTF9WRVJTSU9OX05VTUJFUiwKICAgICAgICB9CiAgICBjcnlwdG9ncmFwaHlfaW5mbyA9IHsKICAgICAgICAndmVyc2lvbic6IGdldGF0dHIoY3J5cHRvZ3JhcGh5LCAnX192ZXJzaW9uX18nLCAnJyksCiAgICB9CiAgICBpZG5hX2luZm8gPSB7CiAgICAgICAgJ3ZlcnNpb24nOiBnZXRhdHRyKGlkbmEsICdfX3ZlcnNpb25fXycsICcnKSwKICAgIH0KCiAgICAjIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgZG9lc24ndCBleGlzdCBpbiB0aGUgUHl0aG9uIDIuNiBzc2wgbW9kdWxlLgogICAgc3lzdGVtX3NzbCA9IGdldGF0dHIoc3NsLCAnT1BFTlNTTF9WRVJTSU9OX05VTUJFUicsIE5vbmUpCiAgICBzeXN0ZW1fc3NsX2luZm8gPSB7CiAgICAgICAgJ3ZlcnNpb24nOiAnJXgnICUgc3lzdGVtX3NzbCBpZiBzeXN0ZW1fc3NsIGlzIG5vdCBOb25lIGVsc2UgJycKICAgIH0KCiAgICByZXR1cm4gewogICAgICAgICdwbGF0Zm9ybSc6IHBsYXRmb3JtX2luZm8sCiAgICAgICAgJ2ltcGxlbWVudGF0aW9uJzogaW1wbGVtZW50YXRpb25faW5mbywKICAgICAgICAnc3lzdGVtX3NzbCc6IHN5c3RlbV9zc2xfaW5mbywKICAgICAgICAndXNpbmdfcHlvcGVuc3NsJzogcHlvcGVuc3NsIGlzIG5vdCBOb25lLAogICAgICAgICdweU9wZW5TU0wnOiBweW9wZW5zc2xfaW5mbywKICAgICAgICAndXJsbGliMyc6IHVybGxpYjNfaW5mbywKICAgICAgICAnY2hhcmRldCc6IGNoYXJkZXRfaW5mbywKICAgICAgICAnY3J5cHRvZ3JhcGh5JzogY3J5cHRvZ3JhcGh5X2luZm8sCiAgICAgICAgJ2lkbmEnOiBpZG5hX2luZm8sCiAgICAgICAgJ3JlcXVlc3RzJzogewogICAgICAgICAgICAndmVyc2lvbic6IHJlcXVlc3RzX3ZlcnNpb24sCiAgICAgICAgfSwKICAgIH0KCgpkZWYgbWFpbigpOgogICAgIiIiUHJldHR5LXByaW50IHRoZSBidWcgaW5mb3JtYXRpb24gYXMgSlNPTi4iIiIKICAgIHByaW50KGpzb24uZHVtcHMoaW5mbygpLCBzb3J0X2tleXM9VHJ1ZSwgaW5kZW50PTIpKQoKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICBtYWluKCkKUEsDBBQAAAAAAAAAIQB52qPK/wIAAP8CAAAtAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL2hvb2tzLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KCiIiIgpyZXF1ZXN0cy5ob29rcwp+fn5+fn5+fn5+fn5+fgoKVGhpcyBtb2R1bGUgcHJvdmlkZXMgdGhlIGNhcGFiaWxpdGllcyBmb3IgdGhlIFJlcXVlc3RzIGhvb2tzIHN5c3RlbS4KCkF2YWlsYWJsZSBob29rczoKCmBgcmVzcG9uc2VgYDoKICAgIFRoZSByZXNwb25zZSBnZW5lcmF0ZWQgZnJvbSBhIFJlcXVlc3QuCiIiIgpIT09LUyA9IFsncmVzcG9uc2UnXQoKCmRlZiBkZWZhdWx0X2hvb2tzKCk6CiAgICByZXR1cm4gZGljdCgoZXZlbnQsIFtdKSBmb3IgZXZlbnQgaW4gSE9PS1MpCgojIFRPRE86IHJlc3BvbnNlIGlzIHRoZSBvbmx5IG9uZQoKCmRlZiBkaXNwYXRjaF9ob29rKGtleSwgaG9va3MsIGhvb2tfZGF0YSwgKiprd2FyZ3MpOgogICAgIiIiRGlzcGF0Y2hlcyBhIGhvb2sgZGljdGlvbmFyeSBvbiBhIGdpdmVuIHBpZWNlIG9mIGRhdGEuIiIiCiAgICBob29rcyA9IGhvb2tzIG9yIGRpY3QoKQogICAgaG9va3MgPSBob29rcy5nZXQoa2V5KQogICAgaWYgaG9va3M6CiAgICAgICAgaWYgaGFzYXR0cihob29rcywgJ19fY2FsbF9fJyk6CiAgICAgICAgICAgIGhvb2tzID0gW2hvb2tzXQogICAgICAgIGZvciBob29rIGluIGhvb2tzOgogICAgICAgICAgICBfaG9va19kYXRhID0gaG9vayhob29rX2RhdGEsICoqa3dhcmdzKQogICAgICAgICAgICBpZiBfaG9va19kYXRhIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgaG9va19kYXRhID0gX2hvb2tfZGF0YQogICAgcmV0dXJuIGhvb2tfZGF0YQpQSwMEFAAAAAAAAAAhAGV9R3QDhQAAA4UAAC4AAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvbW9kZWxzLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KCiIiIgpyZXF1ZXN0cy5tb2RlbHMKfn5+fn5+fn5+fn5+fn5+CgpUaGlzIG1vZHVsZSBjb250YWlucyB0aGUgcHJpbWFyeSBvYmplY3RzIHRoYXQgcG93ZXIgUmVxdWVzdHMuCiIiIgoKaW1wb3J0IGNvbGxlY3Rpb25zCmltcG9ydCBkYXRldGltZQppbXBvcnQgc3lzCgojIEltcG9ydCBlbmNvZGluZyBub3csIHRvIGF2b2lkIGltcGxpY2l0IGltcG9ydCBsYXRlci4KIyBJbXBsaWNpdCBpbXBvcnQgd2l0aGluIHRocmVhZHMgbWF5IGNhdXNlIExvb2t1cEVycm9yIHdoZW4gc3RhbmRhcmQgbGlicmFyeSBpcyBpbiBhIFpJUCwKIyBzdWNoIGFzIGluIEVtYmVkZGVkIFB5dGhvbi4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9yZXF1ZXN0cy9yZXF1ZXN0cy9pc3N1ZXMvMzU3OC4KaW1wb3J0IGVuY29kaW5ncy5pZG5hCgpmcm9tIHBpcC5fdmVuZG9yLnVybGxpYjMuZmllbGRzIGltcG9ydCBSZXF1ZXN0RmllbGQKZnJvbSBwaXAuX3ZlbmRvci51cmxsaWIzLmZpbGVwb3N0IGltcG9ydCBlbmNvZGVfbXVsdGlwYXJ0X2Zvcm1kYXRhCmZyb20gcGlwLl92ZW5kb3IudXJsbGliMy51dGlsIGltcG9ydCBwYXJzZV91cmwKZnJvbSBwaXAuX3ZlbmRvci51cmxsaWIzLmV4Y2VwdGlvbnMgaW1wb3J0ICgKICAgIERlY29kZUVycm9yLCBSZWFkVGltZW91dEVycm9yLCBQcm90b2NvbEVycm9yLCBMb2NhdGlvblBhcnNlRXJyb3IpCgpmcm9tIGlvIGltcG9ydCBVbnN1cHBvcnRlZE9wZXJhdGlvbgpmcm9tIC5ob29rcyBpbXBvcnQgZGVmYXVsdF9ob29rcwpmcm9tIC5zdHJ1Y3R1cmVzIGltcG9ydCBDYXNlSW5zZW5zaXRpdmVEaWN0Cgpmcm9tIC5hdXRoIGltcG9ydCBIVFRQQmFzaWNBdXRoCmZyb20gLmNvb2tpZXMgaW1wb3J0IGNvb2tpZWphcl9mcm9tX2RpY3QsIGdldF9jb29raWVfaGVhZGVyLCBfY29weV9jb29raWVfamFyCmZyb20gLmV4Y2VwdGlvbnMgaW1wb3J0ICgKICAgIEhUVFBFcnJvciwgTWlzc2luZ1NjaGVtYSwgSW52YWxpZFVSTCwgQ2h1bmtlZEVuY29kaW5nRXJyb3IsCiAgICBDb250ZW50RGVjb2RpbmdFcnJvciwgQ29ubmVjdGlvbkVycm9yLCBTdHJlYW1Db25zdW1lZEVycm9yKQpmcm9tIC5faW50ZXJuYWxfdXRpbHMgaW1wb3J0IHRvX25hdGl2ZV9zdHJpbmcsIHVuaWNvZGVfaXNfYXNjaWkKZnJvbSAudXRpbHMgaW1wb3J0ICgKICAgIGd1ZXNzX2ZpbGVuYW1lLCBnZXRfYXV0aF9mcm9tX3VybCwgcmVxdW90ZV91cmksCiAgICBzdHJlYW1fZGVjb2RlX3Jlc3BvbnNlX3VuaWNvZGUsIHRvX2tleV92YWxfbGlzdCwgcGFyc2VfaGVhZGVyX2xpbmtzLAogICAgaXRlcl9zbGljZXMsIGd1ZXNzX2pzb25fdXRmLCBzdXBlcl9sZW4sIGNoZWNrX2hlYWRlcl92YWxpZGl0eSkKZnJvbSAuY29tcGF0IGltcG9ydCAoCiAgICBjb29raWVsaWIsIHVybHVucGFyc2UsIHVybHNwbGl0LCB1cmxlbmNvZGUsIHN0ciwgYnl0ZXMsCiAgICBpc19weTIsIGNoYXJkZXQsIGJ1aWx0aW5fc3RyLCBiYXNlc3RyaW5nKQpmcm9tIC5jb21wYXQgaW1wb3J0IGpzb24gYXMgY29tcGxleGpzb24KZnJvbSAuc3RhdHVzX2NvZGVzIGltcG9ydCBjb2RlcwoKIzogVGhlIHNldCBvZiBIVFRQIHN0YXR1cyBjb2RlcyB0aGF0IGluZGljYXRlIGFuIGF1dG9tYXRpY2FsbHkKIzogcHJvY2Vzc2FibGUgcmVkaXJlY3QuClJFRElSRUNUX1NUQVRJID0gKAogICAgY29kZXMubW92ZWQsICAgICAgICAgICAgICAgIyAzMDEKICAgIGNvZGVzLmZvdW5kLCAgICAgICAgICAgICAgICMgMzAyCiAgICBjb2Rlcy5vdGhlciwgICAgICAgICAgICAgICAjIDMwMwogICAgY29kZXMudGVtcG9yYXJ5X3JlZGlyZWN0LCAgIyAzMDcKICAgIGNvZGVzLnBlcm1hbmVudF9yZWRpcmVjdCwgICMgMzA4CikKCkRFRkFVTFRfUkVESVJFQ1RfTElNSVQgPSAzMApDT05URU5UX0NIVU5LX1NJWkUgPSAxMCAqIDEwMjQKSVRFUl9DSFVOS19TSVpFID0gNTEyCgoKY2xhc3MgUmVxdWVzdEVuY29kaW5nTWl4aW4ob2JqZWN0KToKICAgIEBwcm9wZXJ0eQogICAgZGVmIHBhdGhfdXJsKHNlbGYpOgogICAgICAgICIiIkJ1aWxkIHRoZSBwYXRoIFVSTCB0byB1c2UuIiIiCgogICAgICAgIHVybCA9IFtdCgogICAgICAgIHAgPSB1cmxzcGxpdChzZWxmLnVybCkKCiAgICAgICAgcGF0aCA9IHAucGF0aAogICAgICAgIGlmIG5vdCBwYXRoOgogICAgICAgICAgICBwYXRoID0gJy8nCgogICAgICAgIHVybC5hcHBlbmQocGF0aCkKCiAgICAgICAgcXVlcnkgPSBwLnF1ZXJ5CiAgICAgICAgaWYgcXVlcnk6CiAgICAgICAgICAgIHVybC5hcHBlbmQoJz8nKQogICAgICAgICAgICB1cmwuYXBwZW5kKHF1ZXJ5KQoKICAgICAgICByZXR1cm4gJycuam9pbih1cmwpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9lbmNvZGVfcGFyYW1zKGRhdGEpOgogICAgICAgICIiIkVuY29kZSBwYXJhbWV0ZXJzIGluIGEgcGllY2Ugb2YgZGF0YS4KCiAgICAgICAgV2lsbCBzdWNjZXNzZnVsbHkgZW5jb2RlIHBhcmFtZXRlcnMgd2hlbiBwYXNzZWQgYXMgYSBkaWN0IG9yIGEgbGlzdCBvZgogICAgICAgIDItdHVwbGVzLiBPcmRlciBpcyByZXRhaW5lZCBpZiBkYXRhIGlzIGEgbGlzdCBvZiAyLXR1cGxlcyBidXQgYXJiaXRyYXJ5CiAgICAgICAgaWYgcGFyYW1ldGVycyBhcmUgc3VwcGxpZWQgYXMgYSBkaWN0LgogICAgICAgICIiIgoKICAgICAgICBpZiBpc2luc3RhbmNlKGRhdGEsIChzdHIsIGJ5dGVzKSk6CiAgICAgICAgICAgIHJldHVybiBkYXRhCiAgICAgICAgZWxpZiBoYXNhdHRyKGRhdGEsICdyZWFkJyk6CiAgICAgICAgICAgIHJldHVybiBkYXRhCiAgICAgICAgZWxpZiBoYXNhdHRyKGRhdGEsICdfX2l0ZXJfXycpOgogICAgICAgICAgICByZXN1bHQgPSBbXQogICAgICAgICAgICBmb3IgaywgdnMgaW4gdG9fa2V5X3ZhbF9saXN0KGRhdGEpOgogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2cywgYmFzZXN0cmluZykgb3Igbm90IGhhc2F0dHIodnMsICdfX2l0ZXJfXycpOgogICAgICAgICAgICAgICAgICAgIHZzID0gW3ZzXQogICAgICAgICAgICAgICAgZm9yIHYgaW4gdnM6CiAgICAgICAgICAgICAgICAgICAgaWYgdiBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrLmVuY29kZSgndXRmLTgnKSBpZiBpc2luc3RhbmNlKGssIHN0cikgZWxzZSBrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYuZW5jb2RlKCd1dGYtOCcpIGlmIGlzaW5zdGFuY2Uodiwgc3RyKSBlbHNlIHYpKQogICAgICAgICAgICByZXR1cm4gdXJsZW5jb2RlKHJlc3VsdCwgZG9zZXE9VHJ1ZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gZGF0YQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfZW5jb2RlX2ZpbGVzKGZpbGVzLCBkYXRhKToKICAgICAgICAiIiJCdWlsZCB0aGUgYm9keSBmb3IgYSBtdWx0aXBhcnQvZm9ybS1kYXRhIHJlcXVlc3QuCgogICAgICAgIFdpbGwgc3VjY2Vzc2Z1bGx5IGVuY29kZSBmaWxlcyB3aGVuIHBhc3NlZCBhcyBhIGRpY3Qgb3IgYSBsaXN0IG9mCiAgICAgICAgdHVwbGVzLiBPcmRlciBpcyByZXRhaW5lZCBpZiBkYXRhIGlzIGEgbGlzdCBvZiB0dXBsZXMgYnV0IGFyYml0cmFyeQogICAgICAgIGlmIHBhcmFtZXRlcnMgYXJlIHN1cHBsaWVkIGFzIGEgZGljdC4KICAgICAgICBUaGUgdHVwbGVzIG1heSBiZSAyLXR1cGxlcyAoZmlsZW5hbWUsIGZpbGVvYmopLCAzLXR1cGxlcyAoZmlsZW5hbWUsIGZpbGVvYmosIGNvbnRlbnR5cGUpCiAgICAgICAgb3IgNC10dXBsZXMgKGZpbGVuYW1lLCBmaWxlb2JqLCBjb250ZW50eXBlLCBjdXN0b21faGVhZGVycykuCiAgICAgICAgIiIiCiAgICAgICAgaWYgKG5vdCBmaWxlcyk6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkZpbGVzIG11c3QgYmUgcHJvdmlkZWQuIikKICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZGF0YSwgYmFzZXN0cmluZyk6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkRhdGEgbXVzdCBub3QgYmUgYSBzdHJpbmcuIikKCiAgICAgICAgbmV3X2ZpZWxkcyA9IFtdCiAgICAgICAgZmllbGRzID0gdG9fa2V5X3ZhbF9saXN0KGRhdGEgb3Ige30pCiAgICAgICAgZmlsZXMgPSB0b19rZXlfdmFsX2xpc3QoZmlsZXMgb3Ige30pCgogICAgICAgIGZvciBmaWVsZCwgdmFsIGluIGZpZWxkczoKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWwsIGJhc2VzdHJpbmcpIG9yIG5vdCBoYXNhdHRyKHZhbCwgJ19faXRlcl9fJyk6CiAgICAgICAgICAgICAgICB2YWwgPSBbdmFsXQogICAgICAgICAgICBmb3IgdiBpbiB2YWw6CiAgICAgICAgICAgICAgICBpZiB2IGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgICMgRG9uJ3QgY2FsbCBzdHIoKSBvbiBieXRlc3RyaW5nczogaW4gUHkzIGl0IGFsbCBnb2VzIHdyb25nLgogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHYsIGJ5dGVzKToKICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHN0cih2KQoKICAgICAgICAgICAgICAgICAgICBuZXdfZmllbGRzLmFwcGVuZCgKICAgICAgICAgICAgICAgICAgICAgICAgKGZpZWxkLmRlY29kZSgndXRmLTgnKSBpZiBpc2luc3RhbmNlKGZpZWxkLCBieXRlcykgZWxzZSBmaWVsZCwKICAgICAgICAgICAgICAgICAgICAgICAgIHYuZW5jb2RlKCd1dGYtOCcpIGlmIGlzaW5zdGFuY2Uodiwgc3RyKSBlbHNlIHYpKQoKICAgICAgICBmb3IgKGssIHYpIGluIGZpbGVzOgogICAgICAgICAgICAjIHN1cHBvcnQgZm9yIGV4cGxpY2l0IGZpbGVuYW1lCiAgICAgICAgICAgIGZ0ID0gTm9uZQogICAgICAgICAgICBmaCA9IE5vbmUKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2LCAodHVwbGUsIGxpc3QpKToKICAgICAgICAgICAgICAgIGlmIGxlbih2KSA9PSAyOgogICAgICAgICAgICAgICAgICAgIGZuLCBmcCA9IHYKICAgICAgICAgICAgICAgIGVsaWYgbGVuKHYpID09IDM6CiAgICAgICAgICAgICAgICAgICAgZm4sIGZwLCBmdCA9IHYKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgZm4sIGZwLCBmdCwgZmggPSB2CiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBmbiA9IGd1ZXNzX2ZpbGVuYW1lKHYpIG9yIGsKICAgICAgICAgICAgICAgIGZwID0gdgoKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShmcCwgKHN0ciwgYnl0ZXMsIGJ5dGVhcnJheSkpOgogICAgICAgICAgICAgICAgZmRhdGEgPSBmcAogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZmRhdGEgPSBmcC5yZWFkKCkKCiAgICAgICAgICAgIHJmID0gUmVxdWVzdEZpZWxkKG5hbWU9aywgZGF0YT1mZGF0YSwgZmlsZW5hbWU9Zm4sIGhlYWRlcnM9ZmgpCiAgICAgICAgICAgIHJmLm1ha2VfbXVsdGlwYXJ0KGNvbnRlbnRfdHlwZT1mdCkKICAgICAgICAgICAgbmV3X2ZpZWxkcy5hcHBlbmQocmYpCgogICAgICAgIGJvZHksIGNvbnRlbnRfdHlwZSA9IGVuY29kZV9tdWx0aXBhcnRfZm9ybWRhdGEobmV3X2ZpZWxkcykKCiAgICAgICAgcmV0dXJuIGJvZHksIGNvbnRlbnRfdHlwZQoKCmNsYXNzIFJlcXVlc3RIb29rc01peGluKG9iamVjdCk6CiAgICBkZWYgcmVnaXN0ZXJfaG9vayhzZWxmLCBldmVudCwgaG9vayk6CiAgICAgICAgIiIiUHJvcGVybHkgcmVnaXN0ZXIgYSBob29rLiIiIgoKICAgICAgICBpZiBldmVudCBub3QgaW4gc2VsZi5ob29rczoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5zdXBwb3J0ZWQgZXZlbnQgc3BlY2lmaWVkLCB3aXRoIGV2ZW50IG5hbWUgIiVzIicgJSAoZXZlbnQpKQoKICAgICAgICBpZiBpc2luc3RhbmNlKGhvb2ssIGNvbGxlY3Rpb25zLkNhbGxhYmxlKToKICAgICAgICAgICAgc2VsZi5ob29rc1tldmVudF0uYXBwZW5kKGhvb2spCiAgICAgICAgZWxpZiBoYXNhdHRyKGhvb2ssICdfX2l0ZXJfXycpOgogICAgICAgICAgICBzZWxmLmhvb2tzW2V2ZW50XS5leHRlbmQoaCBmb3IgaCBpbiBob29rIGlmIGlzaW5zdGFuY2UoaCwgY29sbGVjdGlvbnMuQ2FsbGFibGUpKQoKICAgIGRlZiBkZXJlZ2lzdGVyX2hvb2soc2VsZiwgZXZlbnQsIGhvb2spOgogICAgICAgICIiIkRlcmVnaXN0ZXIgYSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgaG9vay4KICAgICAgICBSZXR1cm5zIFRydWUgaWYgdGhlIGhvb2sgZXhpc3RlZCwgRmFsc2UgaWYgbm90LgogICAgICAgICIiIgoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYuaG9va3NbZXZlbnRdLnJlbW92ZShob29rKQogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCgpjbGFzcyBSZXF1ZXN0KFJlcXVlc3RIb29rc01peGluKToKICAgICIiIkEgdXNlci1jcmVhdGVkIDpjbGFzczpgUmVxdWVzdCA8UmVxdWVzdD5gIG9iamVjdC4KCiAgICBVc2VkIHRvIHByZXBhcmUgYSA6Y2xhc3M6YFByZXBhcmVkUmVxdWVzdCA8UHJlcGFyZWRSZXF1ZXN0PmAsIHdoaWNoIGlzIHNlbnQgdG8gdGhlIHNlcnZlci4KCiAgICA6cGFyYW0gbWV0aG9kOiBIVFRQIG1ldGhvZCB0byB1c2UuCiAgICA6cGFyYW0gdXJsOiBVUkwgdG8gc2VuZC4KICAgIDpwYXJhbSBoZWFkZXJzOiBkaWN0aW9uYXJ5IG9mIGhlYWRlcnMgdG8gc2VuZC4KICAgIDpwYXJhbSBmaWxlczogZGljdGlvbmFyeSBvZiB7ZmlsZW5hbWU6IGZpbGVvYmplY3R9IGZpbGVzIHRvIG11bHRpcGFydCB1cGxvYWQuCiAgICA6cGFyYW0gZGF0YTogdGhlIGJvZHkgdG8gYXR0YWNoIHRvIHRoZSByZXF1ZXN0LiBJZiBhIGRpY3Rpb25hcnkgaXMgcHJvdmlkZWQsIGZvcm0tZW5jb2Rpbmcgd2lsbCB0YWtlIHBsYWNlLgogICAgOnBhcmFtIGpzb246IGpzb24gZm9yIHRoZSBib2R5IHRvIGF0dGFjaCB0byB0aGUgcmVxdWVzdCAoaWYgZmlsZXMgb3IgZGF0YSBpcyBub3Qgc3BlY2lmaWVkKS4KICAgIDpwYXJhbSBwYXJhbXM6IGRpY3Rpb25hcnkgb2YgVVJMIHBhcmFtZXRlcnMgdG8gYXBwZW5kIHRvIHRoZSBVUkwuCiAgICA6cGFyYW0gYXV0aDogQXV0aCBoYW5kbGVyIG9yICh1c2VyLCBwYXNzKSB0dXBsZS4KICAgIDpwYXJhbSBjb29raWVzOiBkaWN0aW9uYXJ5IG9yIENvb2tpZUphciBvZiBjb29raWVzIHRvIGF0dGFjaCB0byB0aGlzIHJlcXVlc3QuCiAgICA6cGFyYW0gaG9va3M6IGRpY3Rpb25hcnkgb2YgY2FsbGJhY2sgaG9va3MsIGZvciBpbnRlcm5hbCB1c2FnZS4KCiAgICBVc2FnZTo6CgogICAgICA+Pj4gaW1wb3J0IHJlcXVlc3RzCiAgICAgID4+PiByZXEgPSByZXF1ZXN0cy5SZXF1ZXN0KCdHRVQnLCAnaHR0cDovL2h0dHBiaW4ub3JnL2dldCcpCiAgICAgID4+PiByZXEucHJlcGFyZSgpCiAgICAgIDxQcmVwYXJlZFJlcXVlc3QgW0dFVF0+CiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwKICAgICAgICAgICAgbWV0aG9kPU5vbmUsIHVybD1Ob25lLCBoZWFkZXJzPU5vbmUsIGZpbGVzPU5vbmUsIGRhdGE9Tm9uZSwKICAgICAgICAgICAgcGFyYW1zPU5vbmUsIGF1dGg9Tm9uZSwgY29va2llcz1Ob25lLCBob29rcz1Ob25lLCBqc29uPU5vbmUpOgoKICAgICAgICAjIERlZmF1bHQgZW1wdHkgZGljdHMgZm9yIGRpY3QgcGFyYW1zLgogICAgICAgIGRhdGEgPSBbXSBpZiBkYXRhIGlzIE5vbmUgZWxzZSBkYXRhCiAgICAgICAgZmlsZXMgPSBbXSBpZiBmaWxlcyBpcyBOb25lIGVsc2UgZmlsZXMKICAgICAgICBoZWFkZXJzID0ge30gaWYgaGVhZGVycyBpcyBOb25lIGVsc2UgaGVhZGVycwogICAgICAgIHBhcmFtcyA9IHt9IGlmIHBhcmFtcyBpcyBOb25lIGVsc2UgcGFyYW1zCiAgICAgICAgaG9va3MgPSB7fSBpZiBob29rcyBpcyBOb25lIGVsc2UgaG9va3MKCiAgICAgICAgc2VsZi5ob29rcyA9IGRlZmF1bHRfaG9va3MoKQogICAgICAgIGZvciAoaywgdikgaW4gbGlzdChob29rcy5pdGVtcygpKToKICAgICAgICAgICAgc2VsZi5yZWdpc3Rlcl9ob29rKGV2ZW50PWssIGhvb2s9dikKCiAgICAgICAgc2VsZi5tZXRob2QgPSBtZXRob2QKICAgICAgICBzZWxmLnVybCA9IHVybAogICAgICAgIHNlbGYuaGVhZGVycyA9IGhlYWRlcnMKICAgICAgICBzZWxmLmZpbGVzID0gZmlsZXMKICAgICAgICBzZWxmLmRhdGEgPSBkYXRhCiAgICAgICAgc2VsZi5qc29uID0ganNvbgogICAgICAgIHNlbGYucGFyYW1zID0gcGFyYW1zCiAgICAgICAgc2VsZi5hdXRoID0gYXV0aAogICAgICAgIHNlbGYuY29va2llcyA9IGNvb2tpZXMKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICc8UmVxdWVzdCBbJXNdPicgJSAoc2VsZi5tZXRob2QpCgogICAgZGVmIHByZXBhcmUoc2VsZik6CiAgICAgICAgIiIiQ29uc3RydWN0cyBhIDpjbGFzczpgUHJlcGFyZWRSZXF1ZXN0IDxQcmVwYXJlZFJlcXVlc3Q+YCBmb3IgdHJhbnNtaXNzaW9uIGFuZCByZXR1cm5zIGl0LiIiIgogICAgICAgIHAgPSBQcmVwYXJlZFJlcXVlc3QoKQogICAgICAgIHAucHJlcGFyZSgKICAgICAgICAgICAgbWV0aG9kPXNlbGYubWV0aG9kLAogICAgICAgICAgICB1cmw9c2VsZi51cmwsCiAgICAgICAgICAgIGhlYWRlcnM9c2VsZi5oZWFkZXJzLAogICAgICAgICAgICBmaWxlcz1zZWxmLmZpbGVzLAogICAgICAgICAgICBkYXRhPXNlbGYuZGF0YSwKICAgICAgICAgICAganNvbj1zZWxmLmpzb24sCiAgICAgICAgICAgIHBhcmFtcz1zZWxmLnBhcmFtcywKICAgICAgICAgICAgYXV0aD1zZWxmLmF1dGgsCiAgICAgICAgICAgIGNvb2tpZXM9c2VsZi5jb29raWVzLAogICAgICAgICAgICBob29rcz1zZWxmLmhvb2tzLAogICAgICAgICkKICAgICAgICByZXR1cm4gcAoKCmNsYXNzIFByZXBhcmVkUmVxdWVzdChSZXF1ZXN0RW5jb2RpbmdNaXhpbiwgUmVxdWVzdEhvb2tzTWl4aW4pOgogICAgIiIiVGhlIGZ1bGx5IG11dGFibGUgOmNsYXNzOmBQcmVwYXJlZFJlcXVlc3QgPFByZXBhcmVkUmVxdWVzdD5gIG9iamVjdCwKICAgIGNvbnRhaW5pbmcgdGhlIGV4YWN0IGJ5dGVzIHRoYXQgd2lsbCBiZSBzZW50IHRvIHRoZSBzZXJ2ZXIuCgogICAgR2VuZXJhdGVkIGZyb20gZWl0aGVyIGEgOmNsYXNzOmBSZXF1ZXN0IDxSZXF1ZXN0PmAgb2JqZWN0IG9yIG1hbnVhbGx5LgoKICAgIFVzYWdlOjoKCiAgICAgID4+PiBpbXBvcnQgcmVxdWVzdHMKICAgICAgPj4+IHJlcSA9IHJlcXVlc3RzLlJlcXVlc3QoJ0dFVCcsICdodHRwOi8vaHR0cGJpbi5vcmcvZ2V0JykKICAgICAgPj4+IHIgPSByZXEucHJlcGFyZSgpCiAgICAgIDxQcmVwYXJlZFJlcXVlc3QgW0dFVF0+CgogICAgICA+Pj4gcyA9IHJlcXVlc3RzLlNlc3Npb24oKQogICAgICA+Pj4gcy5zZW5kKHIpCiAgICAgIDxSZXNwb25zZSBbMjAwXT4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAjOiBIVFRQIHZlcmIgdG8gc2VuZCB0byB0aGUgc2VydmVyLgogICAgICAgIHNlbGYubWV0aG9kID0gTm9uZQogICAgICAgICM6IEhUVFAgVVJMIHRvIHNlbmQgdGhlIHJlcXVlc3QgdG8uCiAgICAgICAgc2VsZi51cmwgPSBOb25lCiAgICAgICAgIzogZGljdGlvbmFyeSBvZiBIVFRQIGhlYWRlcnMuCiAgICAgICAgc2VsZi5oZWFkZXJzID0gTm9uZQogICAgICAgICMgVGhlIGBDb29raWVKYXJgIHVzZWQgdG8gY3JlYXRlIHRoZSBDb29raWUgaGVhZGVyIHdpbGwgYmUgc3RvcmVkIGhlcmUKICAgICAgICAjIGFmdGVyIHByZXBhcmVfY29va2llcyBpcyBjYWxsZWQKICAgICAgICBzZWxmLl9jb29raWVzID0gTm9uZQogICAgICAgICM6IHJlcXVlc3QgYm9keSB0byBzZW5kIHRvIHRoZSBzZXJ2ZXIuCiAgICAgICAgc2VsZi5ib2R5ID0gTm9uZQogICAgICAgICM6IGRpY3Rpb25hcnkgb2YgY2FsbGJhY2sgaG9va3MsIGZvciBpbnRlcm5hbCB1c2FnZS4KICAgICAgICBzZWxmLmhvb2tzID0gZGVmYXVsdF9ob29rcygpCiAgICAgICAgIzogaW50ZWdlciBkZW5vdGluZyBzdGFydGluZyBwb3NpdGlvbiBvZiBhIHJlYWRhYmxlIGZpbGUtbGlrZSBib2R5LgogICAgICAgIHNlbGYuX2JvZHlfcG9zaXRpb24gPSBOb25lCgogICAgZGVmIHByZXBhcmUoc2VsZiwKICAgICAgICAgICAgbWV0aG9kPU5vbmUsIHVybD1Ob25lLCBoZWFkZXJzPU5vbmUsIGZpbGVzPU5vbmUsIGRhdGE9Tm9uZSwKICAgICAgICAgICAgcGFyYW1zPU5vbmUsIGF1dGg9Tm9uZSwgY29va2llcz1Ob25lLCBob29rcz1Ob25lLCBqc29uPU5vbmUpOgogICAgICAgICIiIlByZXBhcmVzIHRoZSBlbnRpcmUgcmVxdWVzdCB3aXRoIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLiIiIgoKICAgICAgICBzZWxmLnByZXBhcmVfbWV0aG9kKG1ldGhvZCkKICAgICAgICBzZWxmLnByZXBhcmVfdXJsKHVybCwgcGFyYW1zKQogICAgICAgIHNlbGYucHJlcGFyZV9oZWFkZXJzKGhlYWRlcnMpCiAgICAgICAgc2VsZi5wcmVwYXJlX2Nvb2tpZXMoY29va2llcykKICAgICAgICBzZWxmLnByZXBhcmVfYm9keShkYXRhLCBmaWxlcywganNvbikKICAgICAgICBzZWxmLnByZXBhcmVfYXV0aChhdXRoLCB1cmwpCgogICAgICAgICMgTm90ZSB0aGF0IHByZXBhcmVfYXV0aCBtdXN0IGJlIGxhc3QgdG8gZW5hYmxlIGF1dGhlbnRpY2F0aW9uIHNjaGVtZXMKICAgICAgICAjIHN1Y2ggYXMgT0F1dGggdG8gd29yayBvbiBhIGZ1bGx5IHByZXBhcmVkIHJlcXVlc3QuCgogICAgICAgICMgVGhpcyBNVVNUIGdvIGFmdGVyIHByZXBhcmVfYXV0aC4gQXV0aGVudGljYXRvcnMgY291bGQgYWRkIGEgaG9vawogICAgICAgIHNlbGYucHJlcGFyZV9ob29rcyhob29rcykKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICc8UHJlcGFyZWRSZXF1ZXN0IFslc10+JyAlIChzZWxmLm1ldGhvZCkKCiAgICBkZWYgY29weShzZWxmKToKICAgICAgICBwID0gUHJlcGFyZWRSZXF1ZXN0KCkKICAgICAgICBwLm1ldGhvZCA9IHNlbGYubWV0aG9kCiAgICAgICAgcC51cmwgPSBzZWxmLnVybAogICAgICAgIHAuaGVhZGVycyA9IHNlbGYuaGVhZGVycy5jb3B5KCkgaWYgc2VsZi5oZWFkZXJzIGlzIG5vdCBOb25lIGVsc2UgTm9uZQogICAgICAgIHAuX2Nvb2tpZXMgPSBfY29weV9jb29raWVfamFyKHNlbGYuX2Nvb2tpZXMpCiAgICAgICAgcC5ib2R5ID0gc2VsZi5ib2R5CiAgICAgICAgcC5ob29rcyA9IHNlbGYuaG9va3MKICAgICAgICBwLl9ib2R5X3Bvc2l0aW9uID0gc2VsZi5fYm9keV9wb3NpdGlvbgogICAgICAgIHJldHVybiBwCgogICAgZGVmIHByZXBhcmVfbWV0aG9kKHNlbGYsIG1ldGhvZCk6CiAgICAgICAgIiIiUHJlcGFyZXMgdGhlIGdpdmVuIEhUVFAgbWV0aG9kLiIiIgogICAgICAgIHNlbGYubWV0aG9kID0gbWV0aG9kCiAgICAgICAgaWYgc2VsZi5tZXRob2QgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYubWV0aG9kID0gdG9fbmF0aXZlX3N0cmluZyhzZWxmLm1ldGhvZC51cHBlcigpKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfZ2V0X2lkbmFfZW5jb2RlZF9ob3N0KGhvc3QpOgogICAgICAgIGltcG9ydCBpZG5hCgogICAgICAgIHRyeToKICAgICAgICAgICAgaG9zdCA9IGlkbmEuZW5jb2RlKGhvc3QsIHV0czQ2PVRydWUpLmRlY29kZSgndXRmLTgnKQogICAgICAgIGV4Y2VwdCBpZG5hLklETkFFcnJvcjoKICAgICAgICAgICAgcmFpc2UgVW5pY29kZUVycm9yCiAgICAgICAgcmV0dXJuIGhvc3QKCiAgICBkZWYgcHJlcGFyZV91cmwoc2VsZiwgdXJsLCBwYXJhbXMpOgogICAgICAgICIiIlByZXBhcmVzIHRoZSBnaXZlbiBIVFRQIFVSTC4iIiIKICAgICAgICAjOiBBY2NlcHQgb2JqZWN0cyB0aGF0IGhhdmUgc3RyaW5nIHJlcHJlc2VudGF0aW9ucy4KICAgICAgICAjOiBXZSdyZSB1bmFibGUgdG8gYmxpbmRseSBjYWxsIHVuaWNvZGUvc3RyIGZ1bmN0aW9ucwogICAgICAgICM6IGFzIHRoaXMgd2lsbCBpbmNsdWRlIHRoZSBieXRlc3RyaW5nIGluZGljYXRvciAoYicnKQogICAgICAgICM6IG9uIHB5dGhvbiAzLnguCiAgICAgICAgIzogaHR0cHM6Ly9naXRodWIuY29tL3JlcXVlc3RzL3JlcXVlc3RzL3B1bGwvMjIzOAogICAgICAgIGlmIGlzaW5zdGFuY2UodXJsLCBieXRlcyk6CiAgICAgICAgICAgIHVybCA9IHVybC5kZWNvZGUoJ3V0ZjgnKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHVybCA9IHVuaWNvZGUodXJsKSBpZiBpc19weTIgZWxzZSBzdHIodXJsKQoKICAgICAgICAjIFJlbW92ZSBsZWFkaW5nIHdoaXRlc3BhY2VzIGZyb20gdXJsCiAgICAgICAgdXJsID0gdXJsLmxzdHJpcCgpCgogICAgICAgICMgRG9uJ3QgZG8gYW55IFVSTCBwcmVwYXJhdGlvbiBmb3Igbm9uLUhUVFAgc2NoZW1lcyBsaWtlIGBtYWlsdG9gLAogICAgICAgICMgYGRhdGFgIGV0YyB0byB3b3JrIGFyb3VuZCBleGNlcHRpb25zIGZyb20gYHVybF9wYXJzZWAsIHdoaWNoCiAgICAgICAgIyBoYW5kbGVzIFJGQyAzOTg2IG9ubHkuCiAgICAgICAgaWYgJzonIGluIHVybCBhbmQgbm90IHVybC5sb3dlcigpLnN0YXJ0c3dpdGgoJ2h0dHAnKToKICAgICAgICAgICAgc2VsZi51cmwgPSB1cmwKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICMgU3VwcG9ydCBmb3IgdW5pY29kZSBkb21haW4gbmFtZXMgYW5kIHBhdGhzLgogICAgICAgIHRyeToKICAgICAgICAgICAgc2NoZW1lLCBhdXRoLCBob3N0LCBwb3J0LCBwYXRoLCBxdWVyeSwgZnJhZ21lbnQgPSBwYXJzZV91cmwodXJsKQogICAgICAgIGV4Y2VwdCBMb2NhdGlvblBhcnNlRXJyb3IgYXMgZToKICAgICAgICAgICAgcmFpc2UgSW52YWxpZFVSTCgqZS5hcmdzKQoKICAgICAgICBpZiBub3Qgc2NoZW1lOgogICAgICAgICAgICBlcnJvciA9ICgiSW52YWxpZCBVUkwgezAhcn06IE5vIHNjaGVtYSBzdXBwbGllZC4gUGVyaGFwcyB5b3UgbWVhbnQgaHR0cDovL3swfT8iKQogICAgICAgICAgICBlcnJvciA9IGVycm9yLmZvcm1hdCh0b19uYXRpdmVfc3RyaW5nKHVybCwgJ3V0ZjgnKSkKCiAgICAgICAgICAgIHJhaXNlIE1pc3NpbmdTY2hlbWEoZXJyb3IpCgogICAgICAgIGlmIG5vdCBob3N0OgogICAgICAgICAgICByYWlzZSBJbnZhbGlkVVJMKCJJbnZhbGlkIFVSTCAlcjogTm8gaG9zdCBzdXBwbGllZCIgJSB1cmwpCgogICAgICAgICMgSW4gZ2VuZXJhbCwgd2Ugd2FudCB0byB0cnkgSUROQSBlbmNvZGluZyB0aGUgaG9zdG5hbWUgaWYgdGhlIHN0cmluZyBjb250YWlucwogICAgICAgICMgbm9uLUFTQ0lJIGNoYXJhY3RlcnMuIFRoaXMgYWxsb3dzIHVzZXJzIHRvIGF1dG9tYXRpY2FsbHkgZ2V0IHRoZSBjb3JyZWN0IElETkEKICAgICAgICAjIGJlaGF2aW91ci4gRm9yIHN0cmluZ3MgY29udGFpbmluZyBvbmx5IEFTQ0lJIGNoYXJhY3RlcnMsIHdlIG5lZWQgdG8gYWxzbyB2ZXJpZnkKICAgICAgICAjIGl0IGRvZXNuJ3Qgc3RhcnQgd2l0aCBhIHdpbGRjYXJkICgqKSwgYmVmb3JlIGFsbG93aW5nIHRoZSB1bmVuY29kZWQgaG9zdG5hbWUuCiAgICAgICAgaWYgbm90IHVuaWNvZGVfaXNfYXNjaWkoaG9zdCk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGhvc3QgPSBzZWxmLl9nZXRfaWRuYV9lbmNvZGVkX2hvc3QoaG9zdCkKICAgICAgICAgICAgZXhjZXB0IFVuaWNvZGVFcnJvcjoKICAgICAgICAgICAgICAgIHJhaXNlIEludmFsaWRVUkwoJ1VSTCBoYXMgYW4gaW52YWxpZCBsYWJlbC4nKQogICAgICAgIGVsaWYgaG9zdC5zdGFydHN3aXRoKHUnKicpOgogICAgICAgICAgICByYWlzZSBJbnZhbGlkVVJMKCdVUkwgaGFzIGFuIGludmFsaWQgbGFiZWwuJykKCiAgICAgICAgIyBDYXJlZnVsbHkgcmVjb25zdHJ1Y3QgdGhlIG5ldHdvcmsgbG9jYXRpb24KICAgICAgICBuZXRsb2MgPSBhdXRoIG9yICcnCiAgICAgICAgaWYgbmV0bG9jOgogICAgICAgICAgICBuZXRsb2MgKz0gJ0AnCiAgICAgICAgbmV0bG9jICs9IGhvc3QKICAgICAgICBpZiBwb3J0OgogICAgICAgICAgICBuZXRsb2MgKz0gJzonICsgc3RyKHBvcnQpCgogICAgICAgICMgQmFyZSBkb21haW5zIGFyZW4ndCB2YWxpZCBVUkxzLgogICAgICAgIGlmIG5vdCBwYXRoOgogICAgICAgICAgICBwYXRoID0gJy8nCgogICAgICAgIGlmIGlzX3B5MjoKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzY2hlbWUsIHN0cik6CiAgICAgICAgICAgICAgICBzY2hlbWUgPSBzY2hlbWUuZW5jb2RlKCd1dGYtOCcpCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UobmV0bG9jLCBzdHIpOgogICAgICAgICAgICAgICAgbmV0bG9jID0gbmV0bG9jLmVuY29kZSgndXRmLTgnKQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHBhdGgsIHN0cik6CiAgICAgICAgICAgICAgICBwYXRoID0gcGF0aC5lbmNvZGUoJ3V0Zi04JykKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShxdWVyeSwgc3RyKToKICAgICAgICAgICAgICAgIHF1ZXJ5ID0gcXVlcnkuZW5jb2RlKCd1dGYtOCcpCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZnJhZ21lbnQsIHN0cik6CiAgICAgICAgICAgICAgICBmcmFnbWVudCA9IGZyYWdtZW50LmVuY29kZSgndXRmLTgnKQoKICAgICAgICBpZiBpc2luc3RhbmNlKHBhcmFtcywgKHN0ciwgYnl0ZXMpKToKICAgICAgICAgICAgcGFyYW1zID0gdG9fbmF0aXZlX3N0cmluZyhwYXJhbXMpCgogICAgICAgIGVuY19wYXJhbXMgPSBzZWxmLl9lbmNvZGVfcGFyYW1zKHBhcmFtcykKICAgICAgICBpZiBlbmNfcGFyYW1zOgogICAgICAgICAgICBpZiBxdWVyeToKICAgICAgICAgICAgICAgIHF1ZXJ5ID0gJyVzJiVzJyAlIChxdWVyeSwgZW5jX3BhcmFtcykKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHF1ZXJ5ID0gZW5jX3BhcmFtcwoKICAgICAgICB1cmwgPSByZXF1b3RlX3VyaSh1cmx1bnBhcnNlKFtzY2hlbWUsIG5ldGxvYywgcGF0aCwgTm9uZSwgcXVlcnksIGZyYWdtZW50XSkpCiAgICAgICAgc2VsZi51cmwgPSB1cmwKCiAgICBkZWYgcHJlcGFyZV9oZWFkZXJzKHNlbGYsIGhlYWRlcnMpOgogICAgICAgICIiIlByZXBhcmVzIHRoZSBnaXZlbiBIVFRQIGhlYWRlcnMuIiIiCgogICAgICAgIHNlbGYuaGVhZGVycyA9IENhc2VJbnNlbnNpdGl2ZURpY3QoKQogICAgICAgIGlmIGhlYWRlcnM6CiAgICAgICAgICAgIGZvciBoZWFkZXIgaW4gaGVhZGVycy5pdGVtcygpOgogICAgICAgICAgICAgICAgIyBSYWlzZSBleGNlcHRpb24gb24gaW52YWxpZCBoZWFkZXIgdmFsdWUuCiAgICAgICAgICAgICAgICBjaGVja19oZWFkZXJfdmFsaWRpdHkoaGVhZGVyKQogICAgICAgICAgICAgICAgbmFtZSwgdmFsdWUgPSBoZWFkZXIKICAgICAgICAgICAgICAgIHNlbGYuaGVhZGVyc1t0b19uYXRpdmVfc3RyaW5nKG5hbWUpXSA9IHZhbHVlCgogICAgZGVmIHByZXBhcmVfYm9keShzZWxmLCBkYXRhLCBmaWxlcywganNvbj1Ob25lKToKICAgICAgICAiIiJQcmVwYXJlcyB0aGUgZ2l2ZW4gSFRUUCBib2R5IGRhdGEuIiIiCgogICAgICAgICMgQ2hlY2sgaWYgZmlsZSwgZm8sIGdlbmVyYXRvciwgaXRlcmF0b3IuCiAgICAgICAgIyBJZiBub3QsIHJ1biB0aHJvdWdoIG5vcm1hbCBwcm9jZXNzLgoKICAgICAgICAjIE5vdHRpbicgb24geW91LgogICAgICAgIGJvZHkgPSBOb25lCiAgICAgICAgY29udGVudF90eXBlID0gTm9uZQoKICAgICAgICBpZiBub3QgZGF0YSBhbmQganNvbiBpcyBub3QgTm9uZToKICAgICAgICAgICAgIyB1cmxsaWIzIHJlcXVpcmVzIGEgYnl0ZXMtbGlrZSBib2R5LiBQeXRob24gMidzIGpzb24uZHVtcHMKICAgICAgICAgICAgIyBwcm92aWRlcyB0aGlzIG5hdGl2ZWx5LCBidXQgUHl0aG9uIDMgZ2l2ZXMgYSBVbmljb2RlIHN0cmluZy4KICAgICAgICAgICAgY29udGVudF90eXBlID0gJ2FwcGxpY2F0aW9uL2pzb24nCiAgICAgICAgICAgIGJvZHkgPSBjb21wbGV4anNvbi5kdW1wcyhqc29uKQogICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShib2R5LCBieXRlcyk6CiAgICAgICAgICAgICAgICBib2R5ID0gYm9keS5lbmNvZGUoJ3V0Zi04JykKCiAgICAgICAgaXNfc3RyZWFtID0gYWxsKFsKICAgICAgICAgICAgaGFzYXR0cihkYXRhLCAnX19pdGVyX18nKSwKICAgICAgICAgICAgbm90IGlzaW5zdGFuY2UoZGF0YSwgKGJhc2VzdHJpbmcsIGxpc3QsIHR1cGxlLCBjb2xsZWN0aW9ucy5NYXBwaW5nKSkKICAgICAgICBdKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGxlbmd0aCA9IHN1cGVyX2xlbihkYXRhKQogICAgICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBBdHRyaWJ1dGVFcnJvciwgVW5zdXBwb3J0ZWRPcGVyYXRpb24pOgogICAgICAgICAgICBsZW5ndGggPSBOb25lCgogICAgICAgIGlmIGlzX3N0cmVhbToKICAgICAgICAgICAgYm9keSA9IGRhdGEKCiAgICAgICAgICAgIGlmIGdldGF0dHIoYm9keSwgJ3RlbGwnLCBOb25lKSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICMgUmVjb3JkIHRoZSBjdXJyZW50IGZpbGUgcG9zaXRpb24gYmVmb3JlIHJlYWRpbmcuCiAgICAgICAgICAgICAgICAjIFRoaXMgd2lsbCBhbGxvdyB1cyB0byByZXdpbmQgYSBmaWxlIGluIHRoZSBldmVudAogICAgICAgICAgICAgICAgIyBvZiBhIHJlZGlyZWN0LgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2JvZHlfcG9zaXRpb24gPSBib2R5LnRlbGwoKQogICAgICAgICAgICAgICAgZXhjZXB0IChJT0Vycm9yLCBPU0Vycm9yKToKICAgICAgICAgICAgICAgICAgICAjIFRoaXMgZGlmZmVyZW50aWF0ZXMgZnJvbSBOb25lLCBhbGxvd2luZyB1cyB0byBjYXRjaAogICAgICAgICAgICAgICAgICAgICMgYSBmYWlsZWQgYHRlbGwoKWAgbGF0ZXIgd2hlbiB0cnlpbmcgdG8gcmV3aW5kIHRoZSBib2R5CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fYm9keV9wb3NpdGlvbiA9IG9iamVjdCgpCgogICAgICAgICAgICBpZiBmaWxlczoKICAgICAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoJ1N0cmVhbWVkIGJvZGllcyBhbmQgZmlsZXMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4nKQoKICAgICAgICAgICAgaWYgbGVuZ3RoOgogICAgICAgICAgICAgICAgc2VsZi5oZWFkZXJzWydDb250ZW50LUxlbmd0aCddID0gYnVpbHRpbl9zdHIobGVuZ3RoKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5oZWFkZXJzWydUcmFuc2Zlci1FbmNvZGluZyddID0gJ2NodW5rZWQnCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBNdWx0aS1wYXJ0IGZpbGUgdXBsb2Fkcy4KICAgICAgICAgICAgaWYgZmlsZXM6CiAgICAgICAgICAgICAgICAoYm9keSwgY29udGVudF90eXBlKSA9IHNlbGYuX2VuY29kZV9maWxlcyhmaWxlcywgZGF0YSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlmIGRhdGE6CiAgICAgICAgICAgICAgICAgICAgYm9keSA9IHNlbGYuX2VuY29kZV9wYXJhbXMoZGF0YSkKICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGRhdGEsIGJhc2VzdHJpbmcpIG9yIGhhc2F0dHIoZGF0YSwgJ3JlYWQnKToKICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudF90eXBlID0gTm9uZQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfdHlwZSA9ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnCgogICAgICAgICAgICBzZWxmLnByZXBhcmVfY29udGVudF9sZW5ndGgoYm9keSkKCiAgICAgICAgICAgICMgQWRkIGNvbnRlbnQtdHlwZSBpZiBpdCB3YXNuJ3QgZXhwbGljaXRseSBwcm92aWRlZC4KICAgICAgICAgICAgaWYgY29udGVudF90eXBlIGFuZCAoJ2NvbnRlbnQtdHlwZScgbm90IGluIHNlbGYuaGVhZGVycyk6CiAgICAgICAgICAgICAgICBzZWxmLmhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gY29udGVudF90eXBlCgogICAgICAgIHNlbGYuYm9keSA9IGJvZHkKCiAgICBkZWYgcHJlcGFyZV9jb250ZW50X2xlbmd0aChzZWxmLCBib2R5KToKICAgICAgICAiIiJQcmVwYXJlIENvbnRlbnQtTGVuZ3RoIGhlYWRlciBiYXNlZCBvbiByZXF1ZXN0IG1ldGhvZCBhbmQgYm9keSIiIgogICAgICAgIGlmIGJvZHkgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGxlbmd0aCA9IHN1cGVyX2xlbihib2R5KQogICAgICAgICAgICBpZiBsZW5ndGg6CiAgICAgICAgICAgICAgICAjIElmIGxlbmd0aCBleGlzdHMsIHNldCBpdC4gT3RoZXJ3aXNlLCB3ZSBmYWxsYmFjawogICAgICAgICAgICAgICAgIyB0byBUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZC4KICAgICAgICAgICAgICAgIHNlbGYuaGVhZGVyc1snQ29udGVudC1MZW5ndGgnXSA9IGJ1aWx0aW5fc3RyKGxlbmd0aCkKICAgICAgICBlbGlmIHNlbGYubWV0aG9kIG5vdCBpbiAoJ0dFVCcsICdIRUFEJykgYW5kIHNlbGYuaGVhZGVycy5nZXQoJ0NvbnRlbnQtTGVuZ3RoJykgaXMgTm9uZToKICAgICAgICAgICAgIyBTZXQgQ29udGVudC1MZW5ndGggdG8gMCBmb3IgbWV0aG9kcyB0aGF0IGNhbiBoYXZlIGEgYm9keQogICAgICAgICAgICAjIGJ1dCBkb24ndCBwcm92aWRlIG9uZS4gKGkuZS4gbm90IEdFVCBvciBIRUFEKQogICAgICAgICAgICBzZWxmLmhlYWRlcnNbJ0NvbnRlbnQtTGVuZ3RoJ10gPSAnMCcKCiAgICBkZWYgcHJlcGFyZV9hdXRoKHNlbGYsIGF1dGgsIHVybD0nJyk6CiAgICAgICAgIiIiUHJlcGFyZXMgdGhlIGdpdmVuIEhUVFAgYXV0aCBkYXRhLiIiIgoKICAgICAgICAjIElmIG5vIEF1dGggaXMgZXhwbGljaXRseSBwcm92aWRlZCwgZXh0cmFjdCBpdCBmcm9tIHRoZSBVUkwgZmlyc3QuCiAgICAgICAgaWYgYXV0aCBpcyBOb25lOgogICAgICAgICAgICB1cmxfYXV0aCA9IGdldF9hdXRoX2Zyb21fdXJsKHNlbGYudXJsKQogICAgICAgICAgICBhdXRoID0gdXJsX2F1dGggaWYgYW55KHVybF9hdXRoKSBlbHNlIE5vbmUKCiAgICAgICAgaWYgYXV0aDoKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShhdXRoLCB0dXBsZSkgYW5kIGxlbihhdXRoKSA9PSAyOgogICAgICAgICAgICAgICAgIyBzcGVjaWFsLWNhc2UgYmFzaWMgSFRUUCBhdXRoCiAgICAgICAgICAgICAgICBhdXRoID0gSFRUUEJhc2ljQXV0aCgqYXV0aCkKCiAgICAgICAgICAgICMgQWxsb3cgYXV0aCB0byBtYWtlIGl0cyBjaGFuZ2VzLgogICAgICAgICAgICByID0gYXV0aChzZWxmKQoKICAgICAgICAgICAgIyBVcGRhdGUgc2VsZiB0byByZWZsZWN0IHRoZSBhdXRoIGNoYW5nZXMuCiAgICAgICAgICAgIHNlbGYuX19kaWN0X18udXBkYXRlKHIuX19kaWN0X18pCgogICAgICAgICAgICAjIFJlY29tcHV0ZSBDb250ZW50LUxlbmd0aAogICAgICAgICAgICBzZWxmLnByZXBhcmVfY29udGVudF9sZW5ndGgoc2VsZi5ib2R5KQoKICAgIGRlZiBwcmVwYXJlX2Nvb2tpZXMoc2VsZiwgY29va2llcyk6CiAgICAgICAgIiIiUHJlcGFyZXMgdGhlIGdpdmVuIEhUVFAgY29va2llIGRhdGEuCgogICAgICAgIFRoaXMgZnVuY3Rpb24gZXZlbnR1YWxseSBnZW5lcmF0ZXMgYSBgYENvb2tpZWBgIGhlYWRlciBmcm9tIHRoZQogICAgICAgIGdpdmVuIGNvb2tpZXMgdXNpbmcgY29va2llbGliLiBEdWUgdG8gY29va2llbGliJ3MgZGVzaWduLCB0aGUgaGVhZGVyCiAgICAgICAgd2lsbCBub3QgYmUgcmVnZW5lcmF0ZWQgaWYgaXQgYWxyZWFkeSBleGlzdHMsIG1lYW5pbmcgdGhpcyBmdW5jdGlvbgogICAgICAgIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlIGZvciB0aGUgbGlmZSBvZiB0aGUKICAgICAgICA6Y2xhc3M6YFByZXBhcmVkUmVxdWVzdCA8UHJlcGFyZWRSZXF1ZXN0PmAgb2JqZWN0LiBBbnkgc3Vic2VxdWVudCBjYWxscwogICAgICAgIHRvIGBgcHJlcGFyZV9jb29raWVzYGAgd2lsbCBoYXZlIG5vIGFjdHVhbCBlZmZlY3QsIHVubGVzcyB0aGUgIkNvb2tpZSIKICAgICAgICBoZWFkZXIgaXMgcmVtb3ZlZCBiZWZvcmVoYW5kLgogICAgICAgICIiIgogICAgICAgIGlmIGlzaW5zdGFuY2UoY29va2llcywgY29va2llbGliLkNvb2tpZUphcik6CiAgICAgICAgICAgIHNlbGYuX2Nvb2tpZXMgPSBjb29raWVzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5fY29va2llcyA9IGNvb2tpZWphcl9mcm9tX2RpY3QoY29va2llcykKCiAgICAgICAgY29va2llX2hlYWRlciA9IGdldF9jb29raWVfaGVhZGVyKHNlbGYuX2Nvb2tpZXMsIHNlbGYpCiAgICAgICAgaWYgY29va2llX2hlYWRlciBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5oZWFkZXJzWydDb29raWUnXSA9IGNvb2tpZV9oZWFkZXIKCiAgICBkZWYgcHJlcGFyZV9ob29rcyhzZWxmLCBob29rcyk6CiAgICAgICAgIiIiUHJlcGFyZXMgdGhlIGdpdmVuIGhvb2tzLiIiIgogICAgICAgICMgaG9va3MgY2FuIGJlIHBhc3NlZCBhcyBOb25lIHRvIHRoZSBwcmVwYXJlIG1ldGhvZCBhbmQgdG8gdGhpcwogICAgICAgICMgbWV0aG9kLiBUbyBwcmV2ZW50IGl0ZXJhdGluZyBvdmVyIE5vbmUsIHNpbXBseSB1c2UgYW4gZW1wdHkgbGlzdAogICAgICAgICMgaWYgaG9va3MgaXMgRmFsc2UteQogICAgICAgIGhvb2tzID0gaG9va3Mgb3IgW10KICAgICAgICBmb3IgZXZlbnQgaW4gaG9va3M6CiAgICAgICAgICAgIHNlbGYucmVnaXN0ZXJfaG9vayhldmVudCwgaG9va3NbZXZlbnRdKQoKCmNsYXNzIFJlc3BvbnNlKG9iamVjdCk6CiAgICAiIiJUaGUgOmNsYXNzOmBSZXNwb25zZSA8UmVzcG9uc2U+YCBvYmplY3QsIHdoaWNoIGNvbnRhaW5zIGEKICAgIHNlcnZlcidzIHJlc3BvbnNlIHRvIGFuIEhUVFAgcmVxdWVzdC4KICAgICIiIgoKICAgIF9fYXR0cnNfXyA9IFsKICAgICAgICAnX2NvbnRlbnQnLCAnc3RhdHVzX2NvZGUnLCAnaGVhZGVycycsICd1cmwnLCAnaGlzdG9yeScsCiAgICAgICAgJ2VuY29kaW5nJywgJ3JlYXNvbicsICdjb29raWVzJywgJ2VsYXBzZWQnLCAncmVxdWVzdCcKICAgIF0KCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc2VsZi5fY29udGVudCA9IEZhbHNlCiAgICAgICAgc2VsZi5fY29udGVudF9jb25zdW1lZCA9IEZhbHNlCiAgICAgICAgc2VsZi5fbmV4dCA9IE5vbmUKCiAgICAgICAgIzogSW50ZWdlciBDb2RlIG9mIHJlc3BvbmRlZCBIVFRQIFN0YXR1cywgZS5nLiA0MDQgb3IgMjAwLgogICAgICAgIHNlbGYuc3RhdHVzX2NvZGUgPSBOb25lCgogICAgICAgICM6IENhc2UtaW5zZW5zaXRpdmUgRGljdGlvbmFyeSBvZiBSZXNwb25zZSBIZWFkZXJzLgogICAgICAgICM6IEZvciBleGFtcGxlLCBgYGhlYWRlcnNbJ2NvbnRlbnQtZW5jb2RpbmcnXWBgIHdpbGwgcmV0dXJuIHRoZQogICAgICAgICM6IHZhbHVlIG9mIGEgYGAnQ29udGVudC1FbmNvZGluZydgYCByZXNwb25zZSBoZWFkZXIuCiAgICAgICAgc2VsZi5oZWFkZXJzID0gQ2FzZUluc2Vuc2l0aXZlRGljdCgpCgogICAgICAgICM6IEZpbGUtbGlrZSBvYmplY3QgcmVwcmVzZW50YXRpb24gb2YgcmVzcG9uc2UgKGZvciBhZHZhbmNlZCB1c2FnZSkuCiAgICAgICAgIzogVXNlIG9mIGBgcmF3YGAgcmVxdWlyZXMgdGhhdCBgYHN0cmVhbT1UcnVlYGAgYmUgc2V0IG9uIHRoZSByZXF1ZXN0LgogICAgICAgICMgVGhpcyByZXF1aXJlbWVudCBkb2VzIG5vdCBhcHBseSBmb3IgdXNlIGludGVybmFsbHkgdG8gUmVxdWVzdHMuCiAgICAgICAgc2VsZi5yYXcgPSBOb25lCgogICAgICAgICM6IEZpbmFsIFVSTCBsb2NhdGlvbiBvZiBSZXNwb25zZS4KICAgICAgICBzZWxmLnVybCA9IE5vbmUKCiAgICAgICAgIzogRW5jb2RpbmcgdG8gZGVjb2RlIHdpdGggd2hlbiBhY2Nlc3Npbmcgci50ZXh0LgogICAgICAgIHNlbGYuZW5jb2RpbmcgPSBOb25lCgogICAgICAgICM6IEEgbGlzdCBvZiA6Y2xhc3M6YFJlc3BvbnNlIDxSZXNwb25zZT5gIG9iamVjdHMgZnJvbQogICAgICAgICM6IHRoZSBoaXN0b3J5IG9mIHRoZSBSZXF1ZXN0LiBBbnkgcmVkaXJlY3QgcmVzcG9uc2VzIHdpbGwgZW5kCiAgICAgICAgIzogdXAgaGVyZS4gVGhlIGxpc3QgaXMgc29ydGVkIGZyb20gdGhlIG9sZGVzdCB0byB0aGUgbW9zdCByZWNlbnQgcmVxdWVzdC4KICAgICAgICBzZWxmLmhpc3RvcnkgPSBbXQoKICAgICAgICAjOiBUZXh0dWFsIHJlYXNvbiBvZiByZXNwb25kZWQgSFRUUCBTdGF0dXMsIGUuZy4gIk5vdCBGb3VuZCIgb3IgIk9LIi4KICAgICAgICBzZWxmLnJlYXNvbiA9IE5vbmUKCiAgICAgICAgIzogQSBDb29raWVKYXIgb2YgQ29va2llcyB0aGUgc2VydmVyIHNlbnQgYmFjay4KICAgICAgICBzZWxmLmNvb2tpZXMgPSBjb29raWVqYXJfZnJvbV9kaWN0KHt9KQoKICAgICAgICAjOiBUaGUgYW1vdW50IG9mIHRpbWUgZWxhcHNlZCBiZXR3ZWVuIHNlbmRpbmcgdGhlIHJlcXVlc3QKICAgICAgICAjOiBhbmQgdGhlIGFycml2YWwgb2YgdGhlIHJlc3BvbnNlIChhcyBhIHRpbWVkZWx0YSkuCiAgICAgICAgIzogVGhpcyBwcm9wZXJ0eSBzcGVjaWZpY2FsbHkgbWVhc3VyZXMgdGhlIHRpbWUgdGFrZW4gYmV0d2VlbiBzZW5kaW5nCiAgICAgICAgIzogdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHJlcXVlc3QgYW5kIGZpbmlzaGluZyBwYXJzaW5nIHRoZSBoZWFkZXJzLiBJdAogICAgICAgICM6IGlzIHRoZXJlZm9yZSB1bmFmZmVjdGVkIGJ5IGNvbnN1bWluZyB0aGUgcmVzcG9uc2UgY29udGVudCBvciB0aGUKICAgICAgICAjOiB2YWx1ZSBvZiB0aGUgYGBzdHJlYW1gYCBrZXl3b3JkIGFyZ3VtZW50LgogICAgICAgIHNlbGYuZWxhcHNlZCA9IGRhdGV0aW1lLnRpbWVkZWx0YSgwKQoKICAgICAgICAjOiBUaGUgOmNsYXNzOmBQcmVwYXJlZFJlcXVlc3QgPFByZXBhcmVkUmVxdWVzdD5gIG9iamVjdCB0byB3aGljaCB0aGlzCiAgICAgICAgIzogaXMgYSByZXNwb25zZS4KICAgICAgICBzZWxmLnJlcXVlc3QgPSBOb25lCgogICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqYXJncyk6CiAgICAgICAgc2VsZi5jbG9zZSgpCgogICAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToKICAgICAgICAjIENvbnN1bWUgZXZlcnl0aGluZzsgYWNjZXNzaW5nIHRoZSBjb250ZW50IGF0dHJpYnV0ZSBtYWtlcwogICAgICAgICMgc3VyZSB0aGUgY29udGVudCBoYXMgYmVlbiBmdWxseSByZWFkLgogICAgICAgIGlmIG5vdCBzZWxmLl9jb250ZW50X2NvbnN1bWVkOgogICAgICAgICAgICBzZWxmLmNvbnRlbnQKCiAgICAgICAgcmV0dXJuIGRpY3QoCiAgICAgICAgICAgIChhdHRyLCBnZXRhdHRyKHNlbGYsIGF0dHIsIE5vbmUpKQogICAgICAgICAgICBmb3IgYXR0ciBpbiBzZWxmLl9fYXR0cnNfXwogICAgICAgICkKCiAgICBkZWYgX19zZXRzdGF0ZV9fKHNlbGYsIHN0YXRlKToKICAgICAgICBmb3IgbmFtZSwgdmFsdWUgaW4gc3RhdGUuaXRlbXMoKToKICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBuYW1lLCB2YWx1ZSkKCiAgICAgICAgIyBwaWNrbGVkIG9iamVjdHMgZG8gbm90IGhhdmUgLnJhdwogICAgICAgIHNldGF0dHIoc2VsZiwgJ19jb250ZW50X2NvbnN1bWVkJywgVHJ1ZSkKICAgICAgICBzZXRhdHRyKHNlbGYsICdyYXcnLCBOb25lKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gJzxSZXNwb25zZSBbJXNdPicgJSAoc2VsZi5zdGF0dXNfY29kZSkKCiAgICBkZWYgX19ib29sX18oc2VsZik6CiAgICAgICAgIiIiUmV0dXJucyBUcnVlIGlmIDphdHRyOmBzdGF0dXNfY29kZWAgaXMgbGVzcyB0aGFuIDQwMC4KCiAgICAgICAgVGhpcyBhdHRyaWJ1dGUgY2hlY2tzIGlmIHRoZSBzdGF0dXMgY29kZSBvZiB0aGUgcmVzcG9uc2UgaXMgYmV0d2VlbgogICAgICAgIDQwMCBhbmQgNjAwIHRvIHNlZSBpZiB0aGVyZSB3YXMgYSBjbGllbnQgZXJyb3Igb3IgYSBzZXJ2ZXIgZXJyb3IuIElmCiAgICAgICAgdGhlIHN0YXR1cyBjb2RlLCBpcyBiZXR3ZWVuIDIwMCBhbmQgNDAwLCB0aGlzIHdpbGwgcmV0dXJuIFRydWUuIFRoaXMKICAgICAgICBpcyAqKm5vdCoqIGEgY2hlY2sgdG8gc2VlIGlmIHRoZSByZXNwb25zZSBjb2RlIGlzIGBgMjAwIE9LYGAuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYub2sKCiAgICBkZWYgX19ub256ZXJvX18oc2VsZik6CiAgICAgICAgIiIiUmV0dXJucyBUcnVlIGlmIDphdHRyOmBzdGF0dXNfY29kZWAgaXMgbGVzcyB0aGFuIDQwMC4KCiAgICAgICAgVGhpcyBhdHRyaWJ1dGUgY2hlY2tzIGlmIHRoZSBzdGF0dXMgY29kZSBvZiB0aGUgcmVzcG9uc2UgaXMgYmV0d2VlbgogICAgICAgIDQwMCBhbmQgNjAwIHRvIHNlZSBpZiB0aGVyZSB3YXMgYSBjbGllbnQgZXJyb3Igb3IgYSBzZXJ2ZXIgZXJyb3IuIElmCiAgICAgICAgdGhlIHN0YXR1cyBjb2RlLCBpcyBiZXR3ZWVuIDIwMCBhbmQgNDAwLCB0aGlzIHdpbGwgcmV0dXJuIFRydWUuIFRoaXMKICAgICAgICBpcyAqKm5vdCoqIGEgY2hlY2sgdG8gc2VlIGlmIHRoZSByZXNwb25zZSBjb2RlIGlzIGBgMjAwIE9LYGAuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYub2sKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgIiIiQWxsb3dzIHlvdSB0byB1c2UgYSByZXNwb25zZSBhcyBhbiBpdGVyYXRvci4iIiIKICAgICAgICByZXR1cm4gc2VsZi5pdGVyX2NvbnRlbnQoMTI4KQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIG9rKHNlbGYpOgogICAgICAgICIiIlJldHVybnMgVHJ1ZSBpZiA6YXR0cjpgc3RhdHVzX2NvZGVgIGlzIGxlc3MgdGhhbiA0MDAuCgogICAgICAgIFRoaXMgYXR0cmlidXRlIGNoZWNrcyBpZiB0aGUgc3RhdHVzIGNvZGUgb2YgdGhlIHJlc3BvbnNlIGlzIGJldHdlZW4KICAgICAgICA0MDAgYW5kIDYwMCB0byBzZWUgaWYgdGhlcmUgd2FzIGEgY2xpZW50IGVycm9yIG9yIGEgc2VydmVyIGVycm9yLiBJZgogICAgICAgIHRoZSBzdGF0dXMgY29kZSwgaXMgYmV0d2VlbiAyMDAgYW5kIDQwMCwgdGhpcyB3aWxsIHJldHVybiBUcnVlLiBUaGlzCiAgICAgICAgaXMgKipub3QqKiBhIGNoZWNrIHRvIHNlZSBpZiB0aGUgcmVzcG9uc2UgY29kZSBpcyBgYDIwMCBPS2BgLgogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5yYWlzZV9mb3Jfc3RhdHVzKCkKICAgICAgICBleGNlcHQgSFRUUEVycm9yOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX3JlZGlyZWN0KHNlbGYpOgogICAgICAgICIiIlRydWUgaWYgdGhpcyBSZXNwb25zZSBpcyBhIHdlbGwtZm9ybWVkIEhUVFAgcmVkaXJlY3QgdGhhdCBjb3VsZCBoYXZlCiAgICAgICAgYmVlbiBwcm9jZXNzZWQgYXV0b21hdGljYWxseSAoYnkgOm1ldGg6YFNlc3Npb24ucmVzb2x2ZV9yZWRpcmVjdHNgKS4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gKCdsb2NhdGlvbicgaW4gc2VsZi5oZWFkZXJzIGFuZCBzZWxmLnN0YXR1c19jb2RlIGluIFJFRElSRUNUX1NUQVRJKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX3Blcm1hbmVudF9yZWRpcmVjdChzZWxmKToKICAgICAgICAiIiJUcnVlIGlmIHRoaXMgUmVzcG9uc2Ugb25lIG9mIHRoZSBwZXJtYW5lbnQgdmVyc2lvbnMgb2YgcmVkaXJlY3QuIiIiCiAgICAgICAgcmV0dXJuICgnbG9jYXRpb24nIGluIHNlbGYuaGVhZGVycyBhbmQgc2VsZi5zdGF0dXNfY29kZSBpbiAoY29kZXMubW92ZWRfcGVybWFuZW50bHksIGNvZGVzLnBlcm1hbmVudF9yZWRpcmVjdCkpCgogICAgQHByb3BlcnR5CiAgICBkZWYgbmV4dChzZWxmKToKICAgICAgICAiIiJSZXR1cm5zIGEgUHJlcGFyZWRSZXF1ZXN0IGZvciB0aGUgbmV4dCByZXF1ZXN0IGluIGEgcmVkaXJlY3QgY2hhaW4sIGlmIHRoZXJlIGlzIG9uZS4iIiIKICAgICAgICByZXR1cm4gc2VsZi5fbmV4dAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGFwcGFyZW50X2VuY29kaW5nKHNlbGYpOgogICAgICAgICIiIlRoZSBhcHBhcmVudCBlbmNvZGluZywgcHJvdmlkZWQgYnkgdGhlIGNoYXJkZXQgbGlicmFyeS4iIiIKICAgICAgICByZXR1cm4gY2hhcmRldC5kZXRlY3Qoc2VsZi5jb250ZW50KVsnZW5jb2RpbmcnXQoKICAgIGRlZiBpdGVyX2NvbnRlbnQoc2VsZiwgY2h1bmtfc2l6ZT0xLCBkZWNvZGVfdW5pY29kZT1GYWxzZSk6CiAgICAgICAgIiIiSXRlcmF0ZXMgb3ZlciB0aGUgcmVzcG9uc2UgZGF0YS4gIFdoZW4gc3RyZWFtPVRydWUgaXMgc2V0IG9uIHRoZQogICAgICAgIHJlcXVlc3QsIHRoaXMgYXZvaWRzIHJlYWRpbmcgdGhlIGNvbnRlbnQgYXQgb25jZSBpbnRvIG1lbW9yeSBmb3IKICAgICAgICBsYXJnZSByZXNwb25zZXMuICBUaGUgY2h1bmsgc2l6ZSBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGl0IHNob3VsZAogICAgICAgIHJlYWQgaW50byBtZW1vcnkuICBUaGlzIGlzIG5vdCBuZWNlc3NhcmlseSB0aGUgbGVuZ3RoIG9mIGVhY2ggaXRlbQogICAgICAgIHJldHVybmVkIGFzIGRlY29kaW5nIGNhbiB0YWtlIHBsYWNlLgoKICAgICAgICBjaHVua19zaXplIG11c3QgYmUgb2YgdHlwZSBpbnQgb3IgTm9uZS4gQSB2YWx1ZSBvZiBOb25lIHdpbGwKICAgICAgICBmdW5jdGlvbiBkaWZmZXJlbnRseSBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIGBzdHJlYW1gLgogICAgICAgIHN0cmVhbT1UcnVlIHdpbGwgcmVhZCBkYXRhIGFzIGl0IGFycml2ZXMgaW4gd2hhdGV2ZXIgc2l6ZSB0aGUKICAgICAgICBjaHVua3MgYXJlIHJlY2VpdmVkLiBJZiBzdHJlYW09RmFsc2UsIGRhdGEgaXMgcmV0dXJuZWQgYXMKICAgICAgICBhIHNpbmdsZSBjaHVuay4KCiAgICAgICAgSWYgZGVjb2RlX3VuaWNvZGUgaXMgVHJ1ZSwgY29udGVudCB3aWxsIGJlIGRlY29kZWQgdXNpbmcgdGhlIGJlc3QKICAgICAgICBhdmFpbGFibGUgZW5jb2RpbmcgYmFzZWQgb24gdGhlIHJlc3BvbnNlLgogICAgICAgICIiIgoKICAgICAgICBkZWYgZ2VuZXJhdGUoKToKICAgICAgICAgICAgIyBTcGVjaWFsIGNhc2UgZm9yIHVybGxpYjMuCiAgICAgICAgICAgIGlmIGhhc2F0dHIoc2VsZi5yYXcsICdzdHJlYW0nKToKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBmb3IgY2h1bmsgaW4gc2VsZi5yYXcuc3RyZWFtKGNodW5rX3NpemUsIGRlY29kZV9jb250ZW50PVRydWUpOgogICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBjaHVuawogICAgICAgICAgICAgICAgZXhjZXB0IFByb3RvY29sRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgICAgICByYWlzZSBDaHVua2VkRW5jb2RpbmdFcnJvcihlKQogICAgICAgICAgICAgICAgZXhjZXB0IERlY29kZUVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgQ29udGVudERlY29kaW5nRXJyb3IoZSkKICAgICAgICAgICAgICAgIGV4Y2VwdCBSZWFkVGltZW91dEVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgQ29ubmVjdGlvbkVycm9yKGUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIFN0YW5kYXJkIGZpbGUtbGlrZSBvYmplY3QuCiAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAgICAgICAgIGNodW5rID0gc2VsZi5yYXcucmVhZChjaHVua19zaXplKQogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBjaHVuazoKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICAgICB5aWVsZCBjaHVuawoKICAgICAgICAgICAgc2VsZi5fY29udGVudF9jb25zdW1lZCA9IFRydWUKCiAgICAgICAgaWYgc2VsZi5fY29udGVudF9jb25zdW1lZCBhbmQgaXNpbnN0YW5jZShzZWxmLl9jb250ZW50LCBib29sKToKICAgICAgICAgICAgcmFpc2UgU3RyZWFtQ29uc3VtZWRFcnJvcigpCiAgICAgICAgZWxpZiBjaHVua19zaXplIGlzIG5vdCBOb25lIGFuZCBub3QgaXNpbnN0YW5jZShjaHVua19zaXplLCBpbnQpOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImNodW5rX3NpemUgbXVzdCBiZSBhbiBpbnQsIGl0IGlzIGluc3RlYWQgYSAlcy4iICUgdHlwZShjaHVua19zaXplKSkKICAgICAgICAjIHNpbXVsYXRlIHJlYWRpbmcgc21hbGwgY2h1bmtzIG9mIHRoZSBjb250ZW50CiAgICAgICAgcmV1c2VkX2NodW5rcyA9IGl0ZXJfc2xpY2VzKHNlbGYuX2NvbnRlbnQsIGNodW5rX3NpemUpCgogICAgICAgIHN0cmVhbV9jaHVua3MgPSBnZW5lcmF0ZSgpCgogICAgICAgIGNodW5rcyA9IHJldXNlZF9jaHVua3MgaWYgc2VsZi5fY29udGVudF9jb25zdW1lZCBlbHNlIHN0cmVhbV9jaHVua3MKCiAgICAgICAgaWYgZGVjb2RlX3VuaWNvZGU6CiAgICAgICAgICAgIGNodW5rcyA9IHN0cmVhbV9kZWNvZGVfcmVzcG9uc2VfdW5pY29kZShjaHVua3MsIHNlbGYpCgogICAgICAgIHJldHVybiBjaHVua3MKCiAgICBkZWYgaXRlcl9saW5lcyhzZWxmLCBjaHVua19zaXplPUlURVJfQ0hVTktfU0laRSwgZGVjb2RlX3VuaWNvZGU9Tm9uZSwgZGVsaW1pdGVyPU5vbmUpOgogICAgICAgICIiIkl0ZXJhdGVzIG92ZXIgdGhlIHJlc3BvbnNlIGRhdGEsIG9uZSBsaW5lIGF0IGEgdGltZS4gIFdoZW4KICAgICAgICBzdHJlYW09VHJ1ZSBpcyBzZXQgb24gdGhlIHJlcXVlc3QsIHRoaXMgYXZvaWRzIHJlYWRpbmcgdGhlCiAgICAgICAgY29udGVudCBhdCBvbmNlIGludG8gbWVtb3J5IGZvciBsYXJnZSByZXNwb25zZXMuCgogICAgICAgIC4uIG5vdGU6OiBUaGlzIG1ldGhvZCBpcyBub3QgcmVlbnRyYW50IHNhZmUuCiAgICAgICAgIiIiCgogICAgICAgIHBlbmRpbmcgPSBOb25lCgogICAgICAgIGZvciBjaHVuayBpbiBzZWxmLml0ZXJfY29udGVudChjaHVua19zaXplPWNodW5rX3NpemUsIGRlY29kZV91bmljb2RlPWRlY29kZV91bmljb2RlKToKCiAgICAgICAgICAgIGlmIHBlbmRpbmcgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBjaHVuayA9IHBlbmRpbmcgKyBjaHVuawoKICAgICAgICAgICAgaWYgZGVsaW1pdGVyOgogICAgICAgICAgICAgICAgbGluZXMgPSBjaHVuay5zcGxpdChkZWxpbWl0ZXIpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBsaW5lcyA9IGNodW5rLnNwbGl0bGluZXMoKQoKICAgICAgICAgICAgaWYgbGluZXMgYW5kIGxpbmVzWy0xXSBhbmQgY2h1bmsgYW5kIGxpbmVzWy0xXVstMV0gPT0gY2h1bmtbLTFdOgogICAgICAgICAgICAgICAgcGVuZGluZyA9IGxpbmVzLnBvcCgpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwZW5kaW5nID0gTm9uZQoKICAgICAgICAgICAgZm9yIGxpbmUgaW4gbGluZXM6CiAgICAgICAgICAgICAgICB5aWVsZCBsaW5lCgogICAgICAgIGlmIHBlbmRpbmcgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHlpZWxkIHBlbmRpbmcKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjb250ZW50KHNlbGYpOgogICAgICAgICIiIkNvbnRlbnQgb2YgdGhlIHJlc3BvbnNlLCBpbiBieXRlcy4iIiIKCiAgICAgICAgaWYgc2VsZi5fY29udGVudCBpcyBGYWxzZToKICAgICAgICAgICAgIyBSZWFkIHRoZSBjb250ZW50cy4KICAgICAgICAgICAgaWYgc2VsZi5fY29udGVudF9jb25zdW1lZDoKICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigKICAgICAgICAgICAgICAgICAgICAnVGhlIGNvbnRlbnQgZm9yIHRoaXMgcmVzcG9uc2Ugd2FzIGFscmVhZHkgY29uc3VtZWQnKQoKICAgICAgICAgICAgaWYgc2VsZi5zdGF0dXNfY29kZSA9PSAwIG9yIHNlbGYucmF3IGlzIE5vbmU6CiAgICAgICAgICAgICAgICBzZWxmLl9jb250ZW50ID0gTm9uZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5fY29udGVudCA9IGJ5dGVzKCkuam9pbihzZWxmLml0ZXJfY29udGVudChDT05URU5UX0NIVU5LX1NJWkUpKSBvciBieXRlcygpCgogICAgICAgIHNlbGYuX2NvbnRlbnRfY29uc3VtZWQgPSBUcnVlCiAgICAgICAgIyBkb24ndCBuZWVkIHRvIHJlbGVhc2UgdGhlIGNvbm5lY3Rpb247IHRoYXQncyBiZWVuIGhhbmRsZWQgYnkgdXJsbGliMwogICAgICAgICMgc2luY2Ugd2UgZXhoYXVzdGVkIHRoZSBkYXRhLgogICAgICAgIHJldHVybiBzZWxmLl9jb250ZW50CgogICAgQHByb3BlcnR5CiAgICBkZWYgdGV4dChzZWxmKToKICAgICAgICAiIiJDb250ZW50IG9mIHRoZSByZXNwb25zZSwgaW4gdW5pY29kZS4KCiAgICAgICAgSWYgUmVzcG9uc2UuZW5jb2RpbmcgaXMgTm9uZSwgZW5jb2Rpbmcgd2lsbCBiZSBndWVzc2VkIHVzaW5nCiAgICAgICAgYGBjaGFyZGV0YGAuCgogICAgICAgIFRoZSBlbmNvZGluZyBvZiB0aGUgcmVzcG9uc2UgY29udGVudCBpcyBkZXRlcm1pbmVkIGJhc2VkIHNvbGVseSBvbiBIVFRQCiAgICAgICAgaGVhZGVycywgZm9sbG93aW5nIFJGQyAyNjE2IHRvIHRoZSBsZXR0ZXIuIElmIHlvdSBjYW4gdGFrZSBhZHZhbnRhZ2Ugb2YKICAgICAgICBub24tSFRUUCBrbm93bGVkZ2UgdG8gbWFrZSBhIGJldHRlciBndWVzcyBhdCB0aGUgZW5jb2RpbmcsIHlvdSBzaG91bGQKICAgICAgICBzZXQgYGByLmVuY29kaW5nYGAgYXBwcm9wcmlhdGVseSBiZWZvcmUgYWNjZXNzaW5nIHRoaXMgcHJvcGVydHkuCiAgICAgICAgIiIiCgogICAgICAgICMgVHJ5IGNoYXJzZXQgZnJvbSBjb250ZW50LXR5cGUKICAgICAgICBjb250ZW50ID0gTm9uZQogICAgICAgIGVuY29kaW5nID0gc2VsZi5lbmNvZGluZwoKICAgICAgICBpZiBub3Qgc2VsZi5jb250ZW50OgogICAgICAgICAgICByZXR1cm4gc3RyKCcnKQoKICAgICAgICAjIEZhbGxiYWNrIHRvIGF1dG8tZGV0ZWN0ZWQgZW5jb2RpbmcuCiAgICAgICAgaWYgc2VsZi5lbmNvZGluZyBpcyBOb25lOgogICAgICAgICAgICBlbmNvZGluZyA9IHNlbGYuYXBwYXJlbnRfZW5jb2RpbmcKCiAgICAgICAgIyBEZWNvZGUgdW5pY29kZSBmcm9tIGdpdmVuIGVuY29kaW5nLgogICAgICAgIHRyeToKICAgICAgICAgICAgY29udGVudCA9IHN0cihzZWxmLmNvbnRlbnQsIGVuY29kaW5nLCBlcnJvcnM9J3JlcGxhY2UnKQogICAgICAgIGV4Y2VwdCAoTG9va3VwRXJyb3IsIFR5cGVFcnJvcik6CiAgICAgICAgICAgICMgQSBMb29rdXBFcnJvciBpcyByYWlzZWQgaWYgdGhlIGVuY29kaW5nIHdhcyBub3QgZm91bmQgd2hpY2ggY291bGQKICAgICAgICAgICAgIyBpbmRpY2F0ZSBhIG1pc3NwZWxsaW5nIG9yIHNpbWlsYXIgbWlzdGFrZS4KICAgICAgICAgICAgIwogICAgICAgICAgICAjIEEgVHlwZUVycm9yIGNhbiBiZSByYWlzZWQgaWYgZW5jb2RpbmcgaXMgTm9uZQogICAgICAgICAgICAjCiAgICAgICAgICAgICMgU28gd2UgdHJ5IGJsaW5kbHkgZW5jb2RpbmcuCiAgICAgICAgICAgIGNvbnRlbnQgPSBzdHIoc2VsZi5jb250ZW50LCBlcnJvcnM9J3JlcGxhY2UnKQoKICAgICAgICByZXR1cm4gY29udGVudAoKICAgIGRlZiBqc29uKHNlbGYsICoqa3dhcmdzKToKICAgICAgICByIiIiUmV0dXJucyB0aGUganNvbi1lbmNvZGVkIGNvbnRlbnQgb2YgYSByZXNwb25zZSwgaWYgYW55LgoKICAgICAgICA6cGFyYW0gXCpcKmt3YXJnczogT3B0aW9uYWwgYXJndW1lbnRzIHRoYXQgYGBqc29uLmxvYWRzYGAgdGFrZXMuCiAgICAgICAgOnJhaXNlcyBWYWx1ZUVycm9yOiBJZiB0aGUgcmVzcG9uc2UgYm9keSBkb2VzIG5vdCBjb250YWluIHZhbGlkIGpzb24uCiAgICAgICAgIiIiCgogICAgICAgIGlmIG5vdCBzZWxmLmVuY29kaW5nIGFuZCBzZWxmLmNvbnRlbnQgYW5kIGxlbihzZWxmLmNvbnRlbnQpID4gMzoKICAgICAgICAgICAgIyBObyBlbmNvZGluZyBzZXQuIEpTT04gUkZDIDQ2Mjcgc2VjdGlvbiAzIHN0YXRlcyB3ZSBzaG91bGQgZXhwZWN0CiAgICAgICAgICAgICMgVVRGLTgsIC0xNiBvciAtMzIuIERldGVjdCB3aGljaCBvbmUgdG8gdXNlOyBJZiB0aGUgZGV0ZWN0aW9uIG9yCiAgICAgICAgICAgICMgZGVjb2RpbmcgZmFpbHMsIGZhbGwgYmFjayB0byBgc2VsZi50ZXh0YCAodXNpbmcgY2hhcmRldCB0byBtYWtlCiAgICAgICAgICAgICMgYSBiZXN0IGd1ZXNzKS4KICAgICAgICAgICAgZW5jb2RpbmcgPSBndWVzc19qc29uX3V0ZihzZWxmLmNvbnRlbnQpCiAgICAgICAgICAgIGlmIGVuY29kaW5nIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wbGV4anNvbi5sb2FkcygKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250ZW50LmRlY29kZShlbmNvZGluZyksICoqa3dhcmdzCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgZXhjZXB0IFVuaWNvZGVEZWNvZGVFcnJvcjoKICAgICAgICAgICAgICAgICAgICAjIFdyb25nIFVURiBjb2RlYyBkZXRlY3RlZDsgdXN1YWxseSBiZWNhdXNlIGl0J3Mgbm90IFVURi04CiAgICAgICAgICAgICAgICAgICAgIyBidXQgc29tZSBvdGhlciA4LWJpdCBjb2RlYy4gIFRoaXMgaXMgYW4gUkZDIHZpb2xhdGlvbiwKICAgICAgICAgICAgICAgICAgICAjIGFuZCB0aGUgc2VydmVyIGRpZG4ndCBib3RoZXIgdG8gdGVsbCB1cyB3aGF0IGNvZGVjICp3YXMqCiAgICAgICAgICAgICAgICAgICAgIyB1c2VkLgogICAgICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICByZXR1cm4gY29tcGxleGpzb24ubG9hZHMoc2VsZi50ZXh0LCAqKmt3YXJncykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBsaW5rcyhzZWxmKToKICAgICAgICAiIiJSZXR1cm5zIHRoZSBwYXJzZWQgaGVhZGVyIGxpbmtzIG9mIHRoZSByZXNwb25zZSwgaWYgYW55LiIiIgoKICAgICAgICBoZWFkZXIgPSBzZWxmLmhlYWRlcnMuZ2V0KCdsaW5rJykKCiAgICAgICAgIyBsID0gTXVsdGlEaWN0KCkKICAgICAgICBsID0ge30KCiAgICAgICAgaWYgaGVhZGVyOgogICAgICAgICAgICBsaW5rcyA9IHBhcnNlX2hlYWRlcl9saW5rcyhoZWFkZXIpCgogICAgICAgICAgICBmb3IgbGluayBpbiBsaW5rczoKICAgICAgICAgICAgICAgIGtleSA9IGxpbmsuZ2V0KCdyZWwnKSBvciBsaW5rLmdldCgndXJsJykKICAgICAgICAgICAgICAgIGxba2V5XSA9IGxpbmsKCiAgICAgICAgcmV0dXJuIGwKCiAgICBkZWYgcmFpc2VfZm9yX3N0YXR1cyhzZWxmKToKICAgICAgICAiIiJSYWlzZXMgc3RvcmVkIDpjbGFzczpgSFRUUEVycm9yYCwgaWYgb25lIG9jY3VycmVkLiIiIgoKICAgICAgICBodHRwX2Vycm9yX21zZyA9ICcnCiAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLnJlYXNvbiwgYnl0ZXMpOgogICAgICAgICAgICAjIFdlIGF0dGVtcHQgdG8gZGVjb2RlIHV0Zi04IGZpcnN0IGJlY2F1c2Ugc29tZSBzZXJ2ZXJzCiAgICAgICAgICAgICMgY2hvb3NlIHRvIGxvY2FsaXplIHRoZWlyIHJlYXNvbiBzdHJpbmdzLiBJZiB0aGUgc3RyaW5nCiAgICAgICAgICAgICMgaXNuJ3QgdXRmLTgsIHdlIGZhbGwgYmFjayB0byBpc28tODg1OS0xIGZvciBhbGwgb3RoZXIKICAgICAgICAgICAgIyBlbmNvZGluZ3MuIChTZWUgUFIgIzM1MzgpCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJlYXNvbiA9IHNlbGYucmVhc29uLmRlY29kZSgndXRmLTgnKQogICAgICAgICAgICBleGNlcHQgVW5pY29kZURlY29kZUVycm9yOgogICAgICAgICAgICAgICAgcmVhc29uID0gc2VsZi5yZWFzb24uZGVjb2RlKCdpc28tODg1OS0xJykKICAgICAgICBlbHNlOgogICAgICAgICAgICByZWFzb24gPSBzZWxmLnJlYXNvbgoKICAgICAgICBpZiA0MDAgPD0gc2VsZi5zdGF0dXNfY29kZSA8IDUwMDoKICAgICAgICAgICAgaHR0cF9lcnJvcl9tc2cgPSB1JyVzIENsaWVudCBFcnJvcjogJXMgZm9yIHVybDogJXMnICUgKHNlbGYuc3RhdHVzX2NvZGUsIHJlYXNvbiwgc2VsZi51cmwpCgogICAgICAgIGVsaWYgNTAwIDw9IHNlbGYuc3RhdHVzX2NvZGUgPCA2MDA6CiAgICAgICAgICAgIGh0dHBfZXJyb3JfbXNnID0gdSclcyBTZXJ2ZXIgRXJyb3I6ICVzIGZvciB1cmw6ICVzJyAlIChzZWxmLnN0YXR1c19jb2RlLCByZWFzb24sIHNlbGYudXJsKQoKICAgICAgICBpZiBodHRwX2Vycm9yX21zZzoKICAgICAgICAgICAgcmFpc2UgSFRUUEVycm9yKGh0dHBfZXJyb3JfbXNnLCByZXNwb25zZT1zZWxmKQoKICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICAiIiJSZWxlYXNlcyB0aGUgY29ubmVjdGlvbiBiYWNrIHRvIHRoZSBwb29sLiBPbmNlIHRoaXMgbWV0aG9kIGhhcyBiZWVuCiAgICAgICAgY2FsbGVkIHRoZSB1bmRlcmx5aW5nIGBgcmF3YGAgb2JqZWN0IG11c3Qgbm90IGJlIGFjY2Vzc2VkIGFnYWluLgoKICAgICAgICAqTm90ZTogU2hvdWxkIG5vdCBub3JtYWxseSBuZWVkIHRvIGJlIGNhbGxlZCBleHBsaWNpdGx5LioKICAgICAgICAiIiIKICAgICAgICBpZiBub3Qgc2VsZi5fY29udGVudF9jb25zdW1lZDoKICAgICAgICAgICAgc2VsZi5yYXcuY2xvc2UoKQoKICAgICAgICByZWxlYXNlX2Nvbm4gPSBnZXRhdHRyKHNlbGYucmF3LCAncmVsZWFzZV9jb25uJywgTm9uZSkKICAgICAgICBpZiByZWxlYXNlX2Nvbm4gaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJlbGVhc2VfY29ubigpClBLAwQUAAAAAAAAACEAEjzegbcCAAC3AgAAMAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9wYWNrYWdlcy5weWltcG9ydCBzeXMKCiMgVGhpcyBjb2RlIGV4aXN0cyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgcmVhc29ucy4KIyBJIGRvbid0IGxpa2UgaXQgZWl0aGVyLiBKdXN0IGxvb2sgdGhlIG90aGVyIHdheS4gOikKCmZvciBwYWNrYWdlIGluICgndXJsbGliMycsICdpZG5hJywgJ2NoYXJkZXQnKToKICAgIHZlbmRvcmVkX3BhY2thZ2UgPSAicGlwLl92ZW5kb3IuIiArIHBhY2thZ2UKICAgIGxvY2FscygpW3BhY2thZ2VdID0gX19pbXBvcnRfXyh2ZW5kb3JlZF9wYWNrYWdlKQogICAgIyBUaGlzIHRyYXZlcnNhbCBpcyBhcHBhcmVudGx5IG5lY2Vzc2FyeSBzdWNoIHRoYXQgdGhlIGlkZW50aXRpZXMgYXJlCiAgICAjIHByZXNlcnZlZCAocmVxdWVzdHMucGFja2FnZXMudXJsbGliMy4qIGlzIHVybGxpYjMuKikKICAgIGZvciBtb2QgaW4gbGlzdChzeXMubW9kdWxlcyk6CiAgICAgICAgaWYgbW9kID09IHZlbmRvcmVkX3BhY2thZ2Ugb3IgbW9kLnN0YXJ0c3dpdGgodmVuZG9yZWRfcGFja2FnZSArICcuJyk6CiAgICAgICAgICAgIHVucHJlZml4ZWRfbW9kID0gbW9kW2xlbigicGlwLl92ZW5kb3IuIik6XQogICAgICAgICAgICBzeXMubW9kdWxlc1sncGlwLl92ZW5kb3IucmVxdWVzdHMucGFja2FnZXMuJyArIHVucHJlZml4ZWRfbW9kXSA9IHN5cy5tb2R1bGVzW21vZF0KCiMgS2luZGEgY29vbCwgdGhvdWdoLCByaWdodD8KUEsDBBQAAAAAAAAAIQBfn2aZmmsAAJprAAAwAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL3Nlc3Npb25zLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KCiIiIgpyZXF1ZXN0cy5zZXNzaW9uCn5+fn5+fn5+fn5+fn5+fn4KClRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgU2Vzc2lvbiBvYmplY3QgdG8gbWFuYWdlIGFuZCBwZXJzaXN0IHNldHRpbmdzIGFjcm9zcwpyZXF1ZXN0cyAoY29va2llcywgYXV0aCwgcHJveGllcykuCiIiIgppbXBvcnQgb3MKaW1wb3J0IHBsYXRmb3JtCmltcG9ydCB0aW1lCmZyb20gY29sbGVjdGlvbnMgaW1wb3J0IE1hcHBpbmcKZnJvbSBkYXRldGltZSBpbXBvcnQgdGltZWRlbHRhCgpmcm9tIC5hdXRoIGltcG9ydCBfYmFzaWNfYXV0aF9zdHIKZnJvbSAuY29tcGF0IGltcG9ydCBjb29raWVsaWIsIGlzX3B5MywgT3JkZXJlZERpY3QsIHVybGpvaW4sIHVybHBhcnNlCmZyb20gLmNvb2tpZXMgaW1wb3J0ICgKICAgIGNvb2tpZWphcl9mcm9tX2RpY3QsIGV4dHJhY3RfY29va2llc190b19qYXIsIFJlcXVlc3RzQ29va2llSmFyLCBtZXJnZV9jb29raWVzKQpmcm9tIC5tb2RlbHMgaW1wb3J0IFJlcXVlc3QsIFByZXBhcmVkUmVxdWVzdCwgREVGQVVMVF9SRURJUkVDVF9MSU1JVApmcm9tIC5ob29rcyBpbXBvcnQgZGVmYXVsdF9ob29rcywgZGlzcGF0Y2hfaG9vawpmcm9tIC5faW50ZXJuYWxfdXRpbHMgaW1wb3J0IHRvX25hdGl2ZV9zdHJpbmcKZnJvbSAudXRpbHMgaW1wb3J0IHRvX2tleV92YWxfbGlzdCwgZGVmYXVsdF9oZWFkZXJzCmZyb20gLmV4Y2VwdGlvbnMgaW1wb3J0ICgKICAgIFRvb01hbnlSZWRpcmVjdHMsIEludmFsaWRTY2hlbWEsIENodW5rZWRFbmNvZGluZ0Vycm9yLCBDb250ZW50RGVjb2RpbmdFcnJvcikKCmZyb20gLnN0cnVjdHVyZXMgaW1wb3J0IENhc2VJbnNlbnNpdGl2ZURpY3QKZnJvbSAuYWRhcHRlcnMgaW1wb3J0IEhUVFBBZGFwdGVyCgpmcm9tIC51dGlscyBpbXBvcnQgKAogICAgcmVxdW90ZV91cmksIGdldF9lbnZpcm9uX3Byb3hpZXMsIGdldF9uZXRyY19hdXRoLCBzaG91bGRfYnlwYXNzX3Byb3hpZXMsCiAgICBnZXRfYXV0aF9mcm9tX3VybCwgcmV3aW5kX2JvZHkKKQoKZnJvbSAuc3RhdHVzX2NvZGVzIGltcG9ydCBjb2RlcwoKIyBmb3JtZXJseSBkZWZpbmVkIGhlcmUsIHJlZXhwb3NlZCBoZXJlIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CmZyb20gLm1vZGVscyBpbXBvcnQgUkVESVJFQ1RfU1RBVEkKCiMgUHJlZmVycmVkIGNsb2NrLCBiYXNlZCBvbiB3aGljaCBvbmUgaXMgbW9yZSBhY2N1cmF0ZSBvbiBhIGdpdmVuIHN5c3RlbS4KaWYgcGxhdGZvcm0uc3lzdGVtKCkgPT0gJ1dpbmRvd3MnOgogICAgdHJ5OiAgIyBQeXRob24gMy4zKwogICAgICAgIHByZWZlcnJlZF9jbG9jayA9IHRpbWUucGVyZl9jb3VudGVyCiAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6ICAjIEVhcmxpZXIgdGhhbiBQeXRob24gMy4KICAgICAgICBwcmVmZXJyZWRfY2xvY2sgPSB0aW1lLmNsb2NrCmVsc2U6CiAgICBwcmVmZXJyZWRfY2xvY2sgPSB0aW1lLnRpbWUKCgpkZWYgbWVyZ2Vfc2V0dGluZyhyZXF1ZXN0X3NldHRpbmcsIHNlc3Npb25fc2V0dGluZywgZGljdF9jbGFzcz1PcmRlcmVkRGljdCk6CiAgICAiIiJEZXRlcm1pbmVzIGFwcHJvcHJpYXRlIHNldHRpbmcgZm9yIGEgZ2l2ZW4gcmVxdWVzdCwgdGFraW5nIGludG8gYWNjb3VudAogICAgdGhlIGV4cGxpY2l0IHNldHRpbmcgb24gdGhhdCByZXF1ZXN0LCBhbmQgdGhlIHNldHRpbmcgaW4gdGhlIHNlc3Npb24uIElmIGEKICAgIHNldHRpbmcgaXMgYSBkaWN0aW9uYXJ5LCB0aGV5IHdpbGwgYmUgbWVyZ2VkIHRvZ2V0aGVyIHVzaW5nIGBkaWN0X2NsYXNzYAogICAgIiIiCgogICAgaWYgc2Vzc2lvbl9zZXR0aW5nIGlzIE5vbmU6CiAgICAgICAgcmV0dXJuIHJlcXVlc3Rfc2V0dGluZwoKICAgIGlmIHJlcXVlc3Rfc2V0dGluZyBpcyBOb25lOgogICAgICAgIHJldHVybiBzZXNzaW9uX3NldHRpbmcKCiAgICAjIEJ5cGFzcyBpZiBub3QgYSBkaWN0aW9uYXJ5IChlLmcuIHZlcmlmeSkKICAgIGlmIG5vdCAoCiAgICAgICAgICAgIGlzaW5zdGFuY2Uoc2Vzc2lvbl9zZXR0aW5nLCBNYXBwaW5nKSBhbmQKICAgICAgICAgICAgaXNpbnN0YW5jZShyZXF1ZXN0X3NldHRpbmcsIE1hcHBpbmcpCiAgICApOgogICAgICAgIHJldHVybiByZXF1ZXN0X3NldHRpbmcKCiAgICBtZXJnZWRfc2V0dGluZyA9IGRpY3RfY2xhc3ModG9fa2V5X3ZhbF9saXN0KHNlc3Npb25fc2V0dGluZykpCiAgICBtZXJnZWRfc2V0dGluZy51cGRhdGUodG9fa2V5X3ZhbF9saXN0KHJlcXVlc3Rfc2V0dGluZykpCgogICAgIyBSZW1vdmUga2V5cyB0aGF0IGFyZSBzZXQgdG8gTm9uZS4gRXh0cmFjdCBrZXlzIGZpcnN0IHRvIGF2b2lkIGFsdGVyaW5nCiAgICAjIHRoZSBkaWN0aW9uYXJ5IGR1cmluZyBpdGVyYXRpb24uCiAgICBub25lX2tleXMgPSBbayBmb3IgKGssIHYpIGluIG1lcmdlZF9zZXR0aW5nLml0ZW1zKCkgaWYgdiBpcyBOb25lXQogICAgZm9yIGtleSBpbiBub25lX2tleXM6CiAgICAgICAgZGVsIG1lcmdlZF9zZXR0aW5nW2tleV0KCiAgICByZXR1cm4gbWVyZ2VkX3NldHRpbmcKCgpkZWYgbWVyZ2VfaG9va3MocmVxdWVzdF9ob29rcywgc2Vzc2lvbl9ob29rcywgZGljdF9jbGFzcz1PcmRlcmVkRGljdCk6CiAgICAiIiJQcm9wZXJseSBtZXJnZXMgYm90aCByZXF1ZXN0cyBhbmQgc2Vzc2lvbiBob29rcy4KCiAgICBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHdoZW4gcmVxdWVzdF9ob29rcyA9PSB7J3Jlc3BvbnNlJzogW119LCB0aGUKICAgIG1lcmdlIGJyZWFrcyBTZXNzaW9uIGhvb2tzIGVudGlyZWx5LgogICAgIiIiCiAgICBpZiBzZXNzaW9uX2hvb2tzIGlzIE5vbmUgb3Igc2Vzc2lvbl9ob29rcy5nZXQoJ3Jlc3BvbnNlJykgPT0gW106CiAgICAgICAgcmV0dXJuIHJlcXVlc3RfaG9va3MKCiAgICBpZiByZXF1ZXN0X2hvb2tzIGlzIE5vbmUgb3IgcmVxdWVzdF9ob29rcy5nZXQoJ3Jlc3BvbnNlJykgPT0gW106CiAgICAgICAgcmV0dXJuIHNlc3Npb25faG9va3MKCiAgICByZXR1cm4gbWVyZ2Vfc2V0dGluZyhyZXF1ZXN0X2hvb2tzLCBzZXNzaW9uX2hvb2tzLCBkaWN0X2NsYXNzKQoKCmNsYXNzIFNlc3Npb25SZWRpcmVjdE1peGluKG9iamVjdCk6CgogICAgZGVmIGdldF9yZWRpcmVjdF90YXJnZXQoc2VsZiwgcmVzcCk6CiAgICAgICAgIiIiUmVjZWl2ZXMgYSBSZXNwb25zZS4gUmV0dXJucyBhIHJlZGlyZWN0IFVSSSBvciBgYE5vbmVgYCIiIgogICAgICAgICMgRHVlIHRvIHRoZSBuYXR1cmUgb2YgaG93IHJlcXVlc3RzIHByb2Nlc3NlcyByZWRpcmVjdHMgdGhpcyBtZXRob2Qgd2lsbAogICAgICAgICMgYmUgY2FsbGVkIGF0IGxlYXN0IG9uY2UgdXBvbiB0aGUgb3JpZ2luYWwgcmVzcG9uc2UgYW5kIGF0IGxlYXN0IHR3aWNlCiAgICAgICAgIyBvbiBlYWNoIHN1YnNlcXVlbnQgcmVkaXJlY3QgcmVzcG9uc2UgKGlmIGFueSkuCiAgICAgICAgIyBJZiBhIGN1c3RvbSBtaXhpbiBpcyB1c2VkIHRvIGhhbmRsZSB0aGlzIGxvZ2ljLCBpdCBtYXkgYmUgYWR2YW50YWdlb3VzCiAgICAgICAgIyB0byBjYWNoZSB0aGUgcmVkaXJlY3QgbG9jYXRpb24gb250byB0aGUgcmVzcG9uc2Ugb2JqZWN0IGFzIGEgcHJpdmF0ZQogICAgICAgICMgYXR0cmlidXRlLgogICAgICAgIGlmIHJlc3AuaXNfcmVkaXJlY3Q6CiAgICAgICAgICAgIGxvY2F0aW9uID0gcmVzcC5oZWFkZXJzWydsb2NhdGlvbiddCiAgICAgICAgICAgICMgQ3VycmVudGx5IHRoZSB1bmRlcmx5aW5nIGh0dHAgbW9kdWxlIG9uIHB5MyBkZWNvZGUgaGVhZGVycwogICAgICAgICAgICAjIGluIGxhdGluMSwgYnV0IGVtcGlyaWNhbCBldmlkZW5jZSBzdWdnZXN0cyB0aGF0IGxhdGluMSBpcyB2ZXJ5CiAgICAgICAgICAgICMgcmFyZWx5IHVzZWQgd2l0aCBub24tQVNDSUkgY2hhcmFjdGVycyBpbiBIVFRQIGhlYWRlcnMuCiAgICAgICAgICAgICMgSXQgaXMgbW9yZSBsaWtlbHkgdG8gZ2V0IFVURjggaGVhZGVyIHJhdGhlciB0aGFuIGxhdGluMS4KICAgICAgICAgICAgIyBUaGlzIGNhdXNlcyBpbmNvcnJlY3QgaGFuZGxpbmcgb2YgVVRGOCBlbmNvZGVkIGxvY2F0aW9uIGhlYWRlcnMuCiAgICAgICAgICAgICMgVG8gc29sdmUgdGhpcywgd2UgcmUtZW5jb2RlIHRoZSBsb2NhdGlvbiBpbiBsYXRpbjEuCiAgICAgICAgICAgIGlmIGlzX3B5MzoKICAgICAgICAgICAgICAgIGxvY2F0aW9uID0gbG9jYXRpb24uZW5jb2RlKCdsYXRpbjEnKQogICAgICAgICAgICByZXR1cm4gdG9fbmF0aXZlX3N0cmluZyhsb2NhdGlvbiwgJ3V0ZjgnKQogICAgICAgIHJldHVybiBOb25lCgogICAgZGVmIHJlc29sdmVfcmVkaXJlY3RzKHNlbGYsIHJlc3AsIHJlcSwgc3RyZWFtPUZhbHNlLCB0aW1lb3V0PU5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyaWZ5PVRydWUsIGNlcnQ9Tm9uZSwgcHJveGllcz1Ob25lLCB5aWVsZF9yZXF1ZXN0cz1GYWxzZSwgKiphZGFwdGVyX2t3YXJncyk6CiAgICAgICAgIiIiUmVjZWl2ZXMgYSBSZXNwb25zZS4gUmV0dXJucyBhIGdlbmVyYXRvciBvZiBSZXNwb25zZXMgb3IgUmVxdWVzdHMuIiIiCgogICAgICAgIGhpc3QgPSBbXSAgIyBrZWVwIHRyYWNrIG9mIGhpc3RvcnkKCiAgICAgICAgdXJsID0gc2VsZi5nZXRfcmVkaXJlY3RfdGFyZ2V0KHJlc3ApCiAgICAgICAgd2hpbGUgdXJsOgogICAgICAgICAgICBwcmVwYXJlZF9yZXF1ZXN0ID0gcmVxLmNvcHkoKQoKICAgICAgICAgICAgIyBVcGRhdGUgaGlzdG9yeSBhbmQga2VlcCB0cmFjayBvZiByZWRpcmVjdHMuCiAgICAgICAgICAgICMgcmVzcC5oaXN0b3J5IG11c3QgaWdub3JlIHRoZSBvcmlnaW5hbCByZXF1ZXN0IGluIHRoaXMgbG9vcAogICAgICAgICAgICBoaXN0LmFwcGVuZChyZXNwKQogICAgICAgICAgICByZXNwLmhpc3RvcnkgPSBoaXN0WzE6XQoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmVzcC5jb250ZW50ICAjIENvbnN1bWUgc29ja2V0IHNvIGl0IGNhbiBiZSByZWxlYXNlZAogICAgICAgICAgICBleGNlcHQgKENodW5rZWRFbmNvZGluZ0Vycm9yLCBDb250ZW50RGVjb2RpbmdFcnJvciwgUnVudGltZUVycm9yKToKICAgICAgICAgICAgICAgIHJlc3AucmF3LnJlYWQoZGVjb2RlX2NvbnRlbnQ9RmFsc2UpCgogICAgICAgICAgICBpZiBsZW4ocmVzcC5oaXN0b3J5KSA+PSBzZWxmLm1heF9yZWRpcmVjdHM6CiAgICAgICAgICAgICAgICByYWlzZSBUb29NYW55UmVkaXJlY3RzKCdFeGNlZWRlZCAlcyByZWRpcmVjdHMuJyAlIHNlbGYubWF4X3JlZGlyZWN0cywgcmVzcG9uc2U9cmVzcCkKCiAgICAgICAgICAgICMgUmVsZWFzZSB0aGUgY29ubmVjdGlvbiBiYWNrIGludG8gdGhlIHBvb2wuCiAgICAgICAgICAgIHJlc3AuY2xvc2UoKQoKICAgICAgICAgICAgIyBIYW5kbGUgcmVkaXJlY3Rpb24gd2l0aG91dCBzY2hlbWUgKHNlZTogUkZDIDE4MDggU2VjdGlvbiA0KQogICAgICAgICAgICBpZiB1cmwuc3RhcnRzd2l0aCgnLy8nKToKICAgICAgICAgICAgICAgIHBhcnNlZF9ydXJsID0gdXJscGFyc2UocmVzcC51cmwpCiAgICAgICAgICAgICAgICB1cmwgPSAnJXM6JXMnICUgKHRvX25hdGl2ZV9zdHJpbmcocGFyc2VkX3J1cmwuc2NoZW1lKSwgdXJsKQoKICAgICAgICAgICAgIyBUaGUgc2NoZW1lIHNob3VsZCBiZSBsb3dlciBjYXNlLi4uCiAgICAgICAgICAgIHBhcnNlZCA9IHVybHBhcnNlKHVybCkKICAgICAgICAgICAgdXJsID0gcGFyc2VkLmdldHVybCgpCgogICAgICAgICAgICAjIEZhY2lsaXRhdGUgcmVsYXRpdmUgJ2xvY2F0aW9uJyBoZWFkZXJzLCBhcyBhbGxvd2VkIGJ5IFJGQyA3MjMxLgogICAgICAgICAgICAjIChlLmcuICcvcGF0aC90by9yZXNvdXJjZScgaW5zdGVhZCBvZiAnaHR0cDovL2RvbWFpbi50bGQvcGF0aC90by9yZXNvdXJjZScpCiAgICAgICAgICAgICMgQ29tcGxpYW50IHdpdGggUkZDMzk4Niwgd2UgcGVyY2VudCBlbmNvZGUgdGhlIHVybC4KICAgICAgICAgICAgaWYgbm90IHBhcnNlZC5uZXRsb2M6CiAgICAgICAgICAgICAgICB1cmwgPSB1cmxqb2luKHJlc3AudXJsLCByZXF1b3RlX3VyaSh1cmwpKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgdXJsID0gcmVxdW90ZV91cmkodXJsKQoKICAgICAgICAgICAgcHJlcGFyZWRfcmVxdWVzdC51cmwgPSB0b19uYXRpdmVfc3RyaW5nKHVybCkKCiAgICAgICAgICAgIHNlbGYucmVidWlsZF9tZXRob2QocHJlcGFyZWRfcmVxdWVzdCwgcmVzcCkKCiAgICAgICAgICAgICMgaHR0cHM6Ly9naXRodWIuY29tL3JlcXVlc3RzL3JlcXVlc3RzL2lzc3Vlcy8xMDg0CiAgICAgICAgICAgIGlmIHJlc3Auc3RhdHVzX2NvZGUgbm90IGluIChjb2Rlcy50ZW1wb3JhcnlfcmVkaXJlY3QsIGNvZGVzLnBlcm1hbmVudF9yZWRpcmVjdCk6CiAgICAgICAgICAgICAgICAjIGh0dHBzOi8vZ2l0aHViLmNvbS9yZXF1ZXN0cy9yZXF1ZXN0cy9pc3N1ZXMvMzQ5MAogICAgICAgICAgICAgICAgcHVyZ2VkX2hlYWRlcnMgPSAoJ0NvbnRlbnQtTGVuZ3RoJywgJ0NvbnRlbnQtVHlwZScsICdUcmFuc2Zlci1FbmNvZGluZycpCiAgICAgICAgICAgICAgICBmb3IgaGVhZGVyIGluIHB1cmdlZF9oZWFkZXJzOgogICAgICAgICAgICAgICAgICAgIHByZXBhcmVkX3JlcXVlc3QuaGVhZGVycy5wb3AoaGVhZGVyLCBOb25lKQogICAgICAgICAgICAgICAgcHJlcGFyZWRfcmVxdWVzdC5ib2R5ID0gTm9uZQoKICAgICAgICAgICAgaGVhZGVycyA9IHByZXBhcmVkX3JlcXVlc3QuaGVhZGVycwogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBkZWwgaGVhZGVyc1snQ29va2llJ10KICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgICAgcGFzcwoKICAgICAgICAgICAgIyBFeHRyYWN0IGFueSBjb29raWVzIHNlbnQgb24gdGhlIHJlc3BvbnNlIHRvIHRoZSBjb29raWVqYXIKICAgICAgICAgICAgIyBpbiB0aGUgbmV3IHJlcXVlc3QuIEJlY2F1c2Ugd2UndmUgbXV0YXRlZCBvdXIgY29waWVkIHByZXBhcmVkCiAgICAgICAgICAgICMgcmVxdWVzdCwgdXNlIHRoZSBvbGQgb25lIHRoYXQgd2UgaGF2ZW4ndCB5ZXQgdG91Y2hlZC4KICAgICAgICAgICAgZXh0cmFjdF9jb29raWVzX3RvX2phcihwcmVwYXJlZF9yZXF1ZXN0Ll9jb29raWVzLCByZXEsIHJlc3AucmF3KQogICAgICAgICAgICBtZXJnZV9jb29raWVzKHByZXBhcmVkX3JlcXVlc3QuX2Nvb2tpZXMsIHNlbGYuY29va2llcykKICAgICAgICAgICAgcHJlcGFyZWRfcmVxdWVzdC5wcmVwYXJlX2Nvb2tpZXMocHJlcGFyZWRfcmVxdWVzdC5fY29va2llcykKCiAgICAgICAgICAgICMgUmVidWlsZCBhdXRoIGFuZCBwcm94eSBpbmZvcm1hdGlvbi4KICAgICAgICAgICAgcHJveGllcyA9IHNlbGYucmVidWlsZF9wcm94aWVzKHByZXBhcmVkX3JlcXVlc3QsIHByb3hpZXMpCiAgICAgICAgICAgIHNlbGYucmVidWlsZF9hdXRoKHByZXBhcmVkX3JlcXVlc3QsIHJlc3ApCgogICAgICAgICAgICAjIEEgZmFpbGVkIHRlbGwoKSBzZXRzIGBfYm9keV9wb3NpdGlvbmAgdG8gYG9iamVjdCgpYC4gVGhpcyBub24tTm9uZQogICAgICAgICAgICAjIHZhbHVlIGVuc3VyZXMgYHJld2luZGFibGVgIHdpbGwgYmUgVHJ1ZSwgYWxsb3dpbmcgdXMgdG8gcmFpc2UgYW4KICAgICAgICAgICAgIyBVbnJld2luZGFibGVCb2R5RXJyb3IsIGluc3RlYWQgb2YgaGFuZ2luZyB0aGUgY29ubmVjdGlvbi4KICAgICAgICAgICAgcmV3aW5kYWJsZSA9ICgKICAgICAgICAgICAgICAgIHByZXBhcmVkX3JlcXVlc3QuX2JvZHlfcG9zaXRpb24gaXMgbm90IE5vbmUgYW5kCiAgICAgICAgICAgICAgICAoJ0NvbnRlbnQtTGVuZ3RoJyBpbiBoZWFkZXJzIG9yICdUcmFuc2Zlci1FbmNvZGluZycgaW4gaGVhZGVycykKICAgICAgICAgICAgKQoKICAgICAgICAgICAgIyBBdHRlbXB0IHRvIHJld2luZCBjb25zdW1lZCBmaWxlLWxpa2Ugb2JqZWN0LgogICAgICAgICAgICBpZiByZXdpbmRhYmxlOgogICAgICAgICAgICAgICAgcmV3aW5kX2JvZHkocHJlcGFyZWRfcmVxdWVzdCkKCiAgICAgICAgICAgICMgT3ZlcnJpZGUgdGhlIG9yaWdpbmFsIHJlcXVlc3QuCiAgICAgICAgICAgIHJlcSA9IHByZXBhcmVkX3JlcXVlc3QKCiAgICAgICAgICAgIGlmIHlpZWxkX3JlcXVlc3RzOgogICAgICAgICAgICAgICAgeWllbGQgcmVxCiAgICAgICAgICAgIGVsc2U6CgogICAgICAgICAgICAgICAgcmVzcCA9IHNlbGYuc2VuZCgKICAgICAgICAgICAgICAgICAgICByZXEsCiAgICAgICAgICAgICAgICAgICAgc3RyZWFtPXN0cmVhbSwKICAgICAgICAgICAgICAgICAgICB0aW1lb3V0PXRpbWVvdXQsCiAgICAgICAgICAgICAgICAgICAgdmVyaWZ5PXZlcmlmeSwKICAgICAgICAgICAgICAgICAgICBjZXJ0PWNlcnQsCiAgICAgICAgICAgICAgICAgICAgcHJveGllcz1wcm94aWVzLAogICAgICAgICAgICAgICAgICAgIGFsbG93X3JlZGlyZWN0cz1GYWxzZSwKICAgICAgICAgICAgICAgICAgICAqKmFkYXB0ZXJfa3dhcmdzCiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgZXh0cmFjdF9jb29raWVzX3RvX2phcihzZWxmLmNvb2tpZXMsIHByZXBhcmVkX3JlcXVlc3QsIHJlc3AucmF3KQoKICAgICAgICAgICAgICAgICMgZXh0cmFjdCByZWRpcmVjdCB1cmwsIGlmIGFueSwgZm9yIHRoZSBuZXh0IGxvb3AKICAgICAgICAgICAgICAgIHVybCA9IHNlbGYuZ2V0X3JlZGlyZWN0X3RhcmdldChyZXNwKQogICAgICAgICAgICAgICAgeWllbGQgcmVzcAoKICAgIGRlZiByZWJ1aWxkX2F1dGgoc2VsZiwgcHJlcGFyZWRfcmVxdWVzdCwgcmVzcG9uc2UpOgogICAgICAgICIiIldoZW4gYmVpbmcgcmVkaXJlY3RlZCB3ZSBtYXkgd2FudCB0byBzdHJpcCBhdXRoZW50aWNhdGlvbiBmcm9tIHRoZQogICAgICAgIHJlcXVlc3QgdG8gYXZvaWQgbGVha2luZyBjcmVkZW50aWFscy4gVGhpcyBtZXRob2QgaW50ZWxsaWdlbnRseSByZW1vdmVzCiAgICAgICAgYW5kIHJlYXBwbGllcyBhdXRoZW50aWNhdGlvbiB3aGVyZSBwb3NzaWJsZSB0byBhdm9pZCBjcmVkZW50aWFsIGxvc3MuCiAgICAgICAgIiIiCiAgICAgICAgaGVhZGVycyA9IHByZXBhcmVkX3JlcXVlc3QuaGVhZGVycwogICAgICAgIHVybCA9IHByZXBhcmVkX3JlcXVlc3QudXJsCgogICAgICAgIGlmICdBdXRob3JpemF0aW9uJyBpbiBoZWFkZXJzOgogICAgICAgICAgICAjIElmIHdlIGdldCByZWRpcmVjdGVkIHRvIGEgbmV3IGhvc3QsIHdlIHNob3VsZCBzdHJpcCBvdXQgYW55CiAgICAgICAgICAgICMgYXV0aGVudGljYXRpb24gaGVhZGVycy4KICAgICAgICAgICAgb3JpZ2luYWxfcGFyc2VkID0gdXJscGFyc2UocmVzcG9uc2UucmVxdWVzdC51cmwpCiAgICAgICAgICAgIHJlZGlyZWN0X3BhcnNlZCA9IHVybHBhcnNlKHVybCkKCiAgICAgICAgICAgIGlmIChvcmlnaW5hbF9wYXJzZWQuaG9zdG5hbWUgIT0gcmVkaXJlY3RfcGFyc2VkLmhvc3RuYW1lKToKICAgICAgICAgICAgICAgIGRlbCBoZWFkZXJzWydBdXRob3JpemF0aW9uJ10KCiAgICAgICAgIyAubmV0cmMgbWlnaHQgaGF2ZSBtb3JlIGF1dGggZm9yIHVzIG9uIG91ciBuZXcgaG9zdC4KICAgICAgICBuZXdfYXV0aCA9IGdldF9uZXRyY19hdXRoKHVybCkgaWYgc2VsZi50cnVzdF9lbnYgZWxzZSBOb25lCiAgICAgICAgaWYgbmV3X2F1dGggaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHByZXBhcmVkX3JlcXVlc3QucHJlcGFyZV9hdXRoKG5ld19hdXRoKQoKICAgICAgICByZXR1cm4KCiAgICBkZWYgcmVidWlsZF9wcm94aWVzKHNlbGYsIHByZXBhcmVkX3JlcXVlc3QsIHByb3hpZXMpOgogICAgICAgICIiIlRoaXMgbWV0aG9kIHJlLWV2YWx1YXRlcyB0aGUgcHJveHkgY29uZmlndXJhdGlvbiBieSBjb25zaWRlcmluZyB0aGUKICAgICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZXMuIElmIHdlIGFyZSByZWRpcmVjdGVkIHRvIGEgVVJMIGNvdmVyZWQgYnkKICAgICAgICBOT19QUk9YWSwgd2Ugc3RyaXAgdGhlIHByb3h5IGNvbmZpZ3VyYXRpb24uIE90aGVyd2lzZSwgd2Ugc2V0IG1pc3NpbmcKICAgICAgICBwcm94eSBrZXlzIGZvciB0aGlzIFVSTCAoaW4gY2FzZSB0aGV5IHdlcmUgc3RyaXBwZWQgYnkgYSBwcmV2aW91cwogICAgICAgIHJlZGlyZWN0KS4KCiAgICAgICAgVGhpcyBtZXRob2QgYWxzbyByZXBsYWNlcyB0aGUgUHJveHktQXV0aG9yaXphdGlvbiBoZWFkZXIgd2hlcmUKICAgICAgICBuZWNlc3NhcnkuCgogICAgICAgIDpydHlwZTogZGljdAogICAgICAgICIiIgogICAgICAgIHByb3hpZXMgPSBwcm94aWVzIGlmIHByb3hpZXMgaXMgbm90IE5vbmUgZWxzZSB7fQogICAgICAgIGhlYWRlcnMgPSBwcmVwYXJlZF9yZXF1ZXN0LmhlYWRlcnMKICAgICAgICB1cmwgPSBwcmVwYXJlZF9yZXF1ZXN0LnVybAogICAgICAgIHNjaGVtZSA9IHVybHBhcnNlKHVybCkuc2NoZW1lCiAgICAgICAgbmV3X3Byb3hpZXMgPSBwcm94aWVzLmNvcHkoKQogICAgICAgIG5vX3Byb3h5ID0gcHJveGllcy5nZXQoJ25vX3Byb3h5JykKCiAgICAgICAgYnlwYXNzX3Byb3h5ID0gc2hvdWxkX2J5cGFzc19wcm94aWVzKHVybCwgbm9fcHJveHk9bm9fcHJveHkpCiAgICAgICAgaWYgc2VsZi50cnVzdF9lbnYgYW5kIG5vdCBieXBhc3NfcHJveHk6CiAgICAgICAgICAgIGVudmlyb25fcHJveGllcyA9IGdldF9lbnZpcm9uX3Byb3hpZXModXJsLCBub19wcm94eT1ub19wcm94eSkKCiAgICAgICAgICAgIHByb3h5ID0gZW52aXJvbl9wcm94aWVzLmdldChzY2hlbWUsIGVudmlyb25fcHJveGllcy5nZXQoJ2FsbCcpKQoKICAgICAgICAgICAgaWYgcHJveHk6CiAgICAgICAgICAgICAgICBuZXdfcHJveGllcy5zZXRkZWZhdWx0KHNjaGVtZSwgcHJveHkpCgogICAgICAgIGlmICdQcm94eS1BdXRob3JpemF0aW9uJyBpbiBoZWFkZXJzOgogICAgICAgICAgICBkZWwgaGVhZGVyc1snUHJveHktQXV0aG9yaXphdGlvbiddCgogICAgICAgIHRyeToKICAgICAgICAgICAgdXNlcm5hbWUsIHBhc3N3b3JkID0gZ2V0X2F1dGhfZnJvbV91cmwobmV3X3Byb3hpZXNbc2NoZW1lXSkKICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgIHVzZXJuYW1lLCBwYXNzd29yZCA9IE5vbmUsIE5vbmUKCiAgICAgICAgaWYgdXNlcm5hbWUgYW5kIHBhc3N3b3JkOgogICAgICAgICAgICBoZWFkZXJzWydQcm94eS1BdXRob3JpemF0aW9uJ10gPSBfYmFzaWNfYXV0aF9zdHIodXNlcm5hbWUsIHBhc3N3b3JkKQoKICAgICAgICByZXR1cm4gbmV3X3Byb3hpZXMKCiAgICBkZWYgcmVidWlsZF9tZXRob2Qoc2VsZiwgcHJlcGFyZWRfcmVxdWVzdCwgcmVzcG9uc2UpOgogICAgICAgICIiIldoZW4gYmVpbmcgcmVkaXJlY3RlZCB3ZSBtYXkgd2FudCB0byBjaGFuZ2UgdGhlIG1ldGhvZCBvZiB0aGUgcmVxdWVzdAogICAgICAgIGJhc2VkIG9uIGNlcnRhaW4gc3BlY3Mgb3IgYnJvd3NlciBiZWhhdmlvci4KICAgICAgICAiIiIKICAgICAgICBtZXRob2QgPSBwcmVwYXJlZF9yZXF1ZXN0Lm1ldGhvZAoKICAgICAgICAjIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzEjc2VjdGlvbi02LjQuNAogICAgICAgIGlmIHJlc3BvbnNlLnN0YXR1c19jb2RlID09IGNvZGVzLnNlZV9vdGhlciBhbmQgbWV0aG9kICE9ICdIRUFEJzoKICAgICAgICAgICAgbWV0aG9kID0gJ0dFVCcKCiAgICAgICAgIyBEbyB3aGF0IHRoZSBicm93c2VycyBkbywgZGVzcGl0ZSBzdGFuZGFyZHMuLi4KICAgICAgICAjIEZpcnN0LCB0dXJuIDMwMnMgaW50byBHRVRzLgogICAgICAgIGlmIHJlc3BvbnNlLnN0YXR1c19jb2RlID09IGNvZGVzLmZvdW5kIGFuZCBtZXRob2QgIT0gJ0hFQUQnOgogICAgICAgICAgICBtZXRob2QgPSAnR0VUJwoKICAgICAgICAjIFNlY29uZCwgaWYgYSBQT1NUIGlzIHJlc3BvbmRlZCB0byB3aXRoIGEgMzAxLCB0dXJuIGl0IGludG8gYSBHRVQuCiAgICAgICAgIyBUaGlzIGJpemFycmUgYmVoYXZpb3VyIGlzIGV4cGxhaW5lZCBpbiBJc3N1ZSAxNzA0LgogICAgICAgIGlmIHJlc3BvbnNlLnN0YXR1c19jb2RlID09IGNvZGVzLm1vdmVkIGFuZCBtZXRob2QgPT0gJ1BPU1QnOgogICAgICAgICAgICBtZXRob2QgPSAnR0VUJwoKICAgICAgICBwcmVwYXJlZF9yZXF1ZXN0Lm1ldGhvZCA9IG1ldGhvZAoKCmNsYXNzIFNlc3Npb24oU2Vzc2lvblJlZGlyZWN0TWl4aW4pOgogICAgIiIiQSBSZXF1ZXN0cyBzZXNzaW9uLgoKICAgIFByb3ZpZGVzIGNvb2tpZSBwZXJzaXN0ZW5jZSwgY29ubmVjdGlvbi1wb29saW5nLCBhbmQgY29uZmlndXJhdGlvbi4KCiAgICBCYXNpYyBVc2FnZTo6CgogICAgICA+Pj4gaW1wb3J0IHJlcXVlc3RzCiAgICAgID4+PiBzID0gcmVxdWVzdHMuU2Vzc2lvbigpCiAgICAgID4+PiBzLmdldCgnaHR0cDovL2h0dHBiaW4ub3JnL2dldCcpCiAgICAgIDxSZXNwb25zZSBbMjAwXT4KCiAgICBPciBhcyBhIGNvbnRleHQgbWFuYWdlcjo6CgogICAgICA+Pj4gd2l0aCByZXF1ZXN0cy5TZXNzaW9uKCkgYXMgczoKICAgICAgPj4+ICAgICBzLmdldCgnaHR0cDovL2h0dHBiaW4ub3JnL2dldCcpCiAgICAgIDxSZXNwb25zZSBbMjAwXT4KICAgICIiIgoKICAgIF9fYXR0cnNfXyA9IFsKICAgICAgICAnaGVhZGVycycsICdjb29raWVzJywgJ2F1dGgnLCAncHJveGllcycsICdob29rcycsICdwYXJhbXMnLCAndmVyaWZ5JywKICAgICAgICAnY2VydCcsICdwcmVmZXRjaCcsICdhZGFwdGVycycsICdzdHJlYW0nLCAndHJ1c3RfZW52JywKICAgICAgICAnbWF4X3JlZGlyZWN0cycsCiAgICBdCgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgoKICAgICAgICAjOiBBIGNhc2UtaW5zZW5zaXRpdmUgZGljdGlvbmFyeSBvZiBoZWFkZXJzIHRvIGJlIHNlbnQgb24gZWFjaAogICAgICAgICM6IDpjbGFzczpgUmVxdWVzdCA8UmVxdWVzdD5gIHNlbnQgZnJvbSB0aGlzCiAgICAgICAgIzogOmNsYXNzOmBTZXNzaW9uIDxTZXNzaW9uPmAuCiAgICAgICAgc2VsZi5oZWFkZXJzID0gZGVmYXVsdF9oZWFkZXJzKCkKCiAgICAgICAgIzogRGVmYXVsdCBBdXRoZW50aWNhdGlvbiB0dXBsZSBvciBvYmplY3QgdG8gYXR0YWNoIHRvCiAgICAgICAgIzogOmNsYXNzOmBSZXF1ZXN0IDxSZXF1ZXN0PmAuCiAgICAgICAgc2VsZi5hdXRoID0gTm9uZQoKICAgICAgICAjOiBEaWN0aW9uYXJ5IG1hcHBpbmcgcHJvdG9jb2wgb3IgcHJvdG9jb2wgYW5kIGhvc3QgdG8gdGhlIFVSTCBvZiB0aGUgcHJveHkKICAgICAgICAjOiAoZS5nLiB7J2h0dHAnOiAnZm9vLmJhcjozMTI4JywgJ2h0dHA6Ly9ob3N0Lm5hbWUnOiAnZm9vLmJhcjo0MDEyJ30pIHRvCiAgICAgICAgIzogYmUgdXNlZCBvbiBlYWNoIDpjbGFzczpgUmVxdWVzdCA8UmVxdWVzdD5gLgogICAgICAgIHNlbGYucHJveGllcyA9IHt9CgogICAgICAgICM6IEV2ZW50LWhhbmRsaW5nIGhvb2tzLgogICAgICAgIHNlbGYuaG9va3MgPSBkZWZhdWx0X2hvb2tzKCkKCiAgICAgICAgIzogRGljdGlvbmFyeSBvZiBxdWVyeXN0cmluZyBkYXRhIHRvIGF0dGFjaCB0byBlYWNoCiAgICAgICAgIzogOmNsYXNzOmBSZXF1ZXN0IDxSZXF1ZXN0PmAuIFRoZSBkaWN0aW9uYXJ5IHZhbHVlcyBtYXkgYmUgbGlzdHMgZm9yCiAgICAgICAgIzogcmVwcmVzZW50aW5nIG11bHRpdmFsdWVkIHF1ZXJ5IHBhcmFtZXRlcnMuCiAgICAgICAgc2VsZi5wYXJhbXMgPSB7fQoKICAgICAgICAjOiBTdHJlYW0gcmVzcG9uc2UgY29udGVudCBkZWZhdWx0LgogICAgICAgIHNlbGYuc3RyZWFtID0gRmFsc2UKCiAgICAgICAgIzogU1NMIFZlcmlmaWNhdGlvbiBkZWZhdWx0LgogICAgICAgIHNlbGYudmVyaWZ5ID0gVHJ1ZQoKICAgICAgICAjOiBTU0wgY2xpZW50IGNlcnRpZmljYXRlIGRlZmF1bHQsIGlmIFN0cmluZywgcGF0aCB0byBzc2wgY2xpZW50CiAgICAgICAgIzogY2VydCBmaWxlICgucGVtKS4gSWYgVHVwbGUsICgnY2VydCcsICdrZXknKSBwYWlyLgogICAgICAgIHNlbGYuY2VydCA9IE5vbmUKCiAgICAgICAgIzogTWF4aW11bSBudW1iZXIgb2YgcmVkaXJlY3RzIGFsbG93ZWQuIElmIHRoZSByZXF1ZXN0IGV4Y2VlZHMgdGhpcwogICAgICAgICM6IGxpbWl0LCBhIDpjbGFzczpgVG9vTWFueVJlZGlyZWN0c2AgZXhjZXB0aW9uIGlzIHJhaXNlZC4KICAgICAgICAjOiBUaGlzIGRlZmF1bHRzIHRvIHJlcXVlc3RzLm1vZGVscy5ERUZBVUxUX1JFRElSRUNUX0xJTUlULCB3aGljaCBpcwogICAgICAgICM6IDMwLgogICAgICAgIHNlbGYubWF4X3JlZGlyZWN0cyA9IERFRkFVTFRfUkVESVJFQ1RfTElNSVQKCiAgICAgICAgIzogVHJ1c3QgZW52aXJvbm1lbnQgc2V0dGluZ3MgZm9yIHByb3h5IGNvbmZpZ3VyYXRpb24sIGRlZmF1bHQKICAgICAgICAjOiBhdXRoZW50aWNhdGlvbiBhbmQgc2ltaWxhci4KICAgICAgICBzZWxmLnRydXN0X2VudiA9IFRydWUKCiAgICAgICAgIzogQSBDb29raWVKYXIgY29udGFpbmluZyBhbGwgY3VycmVudGx5IG91dHN0YW5kaW5nIGNvb2tpZXMgc2V0IG9uIHRoaXMKICAgICAgICAjOiBzZXNzaW9uLiBCeSBkZWZhdWx0IGl0IGlzIGEKICAgICAgICAjOiA6Y2xhc3M6YFJlcXVlc3RzQ29va2llSmFyIDxyZXF1ZXN0cy5jb29raWVzLlJlcXVlc3RzQ29va2llSmFyPmAsIGJ1dAogICAgICAgICM6IG1heSBiZSBhbnkgb3RoZXIgYGBjb29raWVsaWIuQ29va2llSmFyYGAgY29tcGF0aWJsZSBvYmplY3QuCiAgICAgICAgc2VsZi5jb29raWVzID0gY29va2llamFyX2Zyb21fZGljdCh7fSkKCiAgICAgICAgIyBEZWZhdWx0IGNvbm5lY3Rpb24gYWRhcHRlcnMuCiAgICAgICAgc2VsZi5hZGFwdGVycyA9IE9yZGVyZWREaWN0KCkKICAgICAgICBzZWxmLm1vdW50KCdodHRwczovLycsIEhUVFBBZGFwdGVyKCkpCiAgICAgICAgc2VsZi5tb3VudCgnaHR0cDovLycsIEhUVFBBZGFwdGVyKCkpCgogICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqYXJncyk6CiAgICAgICAgc2VsZi5jbG9zZSgpCgogICAgZGVmIHByZXBhcmVfcmVxdWVzdChzZWxmLCByZXF1ZXN0KToKICAgICAgICAiIiJDb25zdHJ1Y3RzIGEgOmNsYXNzOmBQcmVwYXJlZFJlcXVlc3QgPFByZXBhcmVkUmVxdWVzdD5gIGZvcgogICAgICAgIHRyYW5zbWlzc2lvbiBhbmQgcmV0dXJucyBpdC4gVGhlIDpjbGFzczpgUHJlcGFyZWRSZXF1ZXN0YCBoYXMgc2V0dGluZ3MKICAgICAgICBtZXJnZWQgZnJvbSB0aGUgOmNsYXNzOmBSZXF1ZXN0IDxSZXF1ZXN0PmAgaW5zdGFuY2UgYW5kIHRob3NlIG9mIHRoZQogICAgICAgIDpjbGFzczpgU2Vzc2lvbmAuCgogICAgICAgIDpwYXJhbSByZXF1ZXN0OiA6Y2xhc3M6YFJlcXVlc3RgIGluc3RhbmNlIHRvIHByZXBhcmUgd2l0aCB0aGlzCiAgICAgICAgICAgIHNlc3Npb24ncyBzZXR0aW5ncy4KICAgICAgICA6cnR5cGU6IHJlcXVlc3RzLlByZXBhcmVkUmVxdWVzdAogICAgICAgICIiIgogICAgICAgIGNvb2tpZXMgPSByZXF1ZXN0LmNvb2tpZXMgb3Ige30KCiAgICAgICAgIyBCb290c3RyYXAgQ29va2llSmFyLgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGNvb2tpZXMsIGNvb2tpZWxpYi5Db29raWVKYXIpOgogICAgICAgICAgICBjb29raWVzID0gY29va2llamFyX2Zyb21fZGljdChjb29raWVzKQoKICAgICAgICAjIE1lcmdlIHdpdGggc2Vzc2lvbiBjb29raWVzCiAgICAgICAgbWVyZ2VkX2Nvb2tpZXMgPSBtZXJnZV9jb29raWVzKAogICAgICAgICAgICBtZXJnZV9jb29raWVzKFJlcXVlc3RzQ29va2llSmFyKCksIHNlbGYuY29va2llcyksIGNvb2tpZXMpCgogICAgICAgICMgU2V0IGVudmlyb25tZW50J3MgYmFzaWMgYXV0aGVudGljYXRpb24gaWYgbm90IGV4cGxpY2l0bHkgc2V0LgogICAgICAgIGF1dGggPSByZXF1ZXN0LmF1dGgKICAgICAgICBpZiBzZWxmLnRydXN0X2VudiBhbmQgbm90IGF1dGggYW5kIG5vdCBzZWxmLmF1dGg6CiAgICAgICAgICAgIGF1dGggPSBnZXRfbmV0cmNfYXV0aChyZXF1ZXN0LnVybCkKCiAgICAgICAgcCA9IFByZXBhcmVkUmVxdWVzdCgpCiAgICAgICAgcC5wcmVwYXJlKAogICAgICAgICAgICBtZXRob2Q9cmVxdWVzdC5tZXRob2QudXBwZXIoKSwKICAgICAgICAgICAgdXJsPXJlcXVlc3QudXJsLAogICAgICAgICAgICBmaWxlcz1yZXF1ZXN0LmZpbGVzLAogICAgICAgICAgICBkYXRhPXJlcXVlc3QuZGF0YSwKICAgICAgICAgICAganNvbj1yZXF1ZXN0Lmpzb24sCiAgICAgICAgICAgIGhlYWRlcnM9bWVyZ2Vfc2V0dGluZyhyZXF1ZXN0LmhlYWRlcnMsIHNlbGYuaGVhZGVycywgZGljdF9jbGFzcz1DYXNlSW5zZW5zaXRpdmVEaWN0KSwKICAgICAgICAgICAgcGFyYW1zPW1lcmdlX3NldHRpbmcocmVxdWVzdC5wYXJhbXMsIHNlbGYucGFyYW1zKSwKICAgICAgICAgICAgYXV0aD1tZXJnZV9zZXR0aW5nKGF1dGgsIHNlbGYuYXV0aCksCiAgICAgICAgICAgIGNvb2tpZXM9bWVyZ2VkX2Nvb2tpZXMsCiAgICAgICAgICAgIGhvb2tzPW1lcmdlX2hvb2tzKHJlcXVlc3QuaG9va3MsIHNlbGYuaG9va3MpLAogICAgICAgICkKICAgICAgICByZXR1cm4gcAoKICAgIGRlZiByZXF1ZXN0KHNlbGYsIG1ldGhvZCwgdXJsLAogICAgICAgICAgICBwYXJhbXM9Tm9uZSwgZGF0YT1Ob25lLCBoZWFkZXJzPU5vbmUsIGNvb2tpZXM9Tm9uZSwgZmlsZXM9Tm9uZSwKICAgICAgICAgICAgYXV0aD1Ob25lLCB0aW1lb3V0PU5vbmUsIGFsbG93X3JlZGlyZWN0cz1UcnVlLCBwcm94aWVzPU5vbmUsCiAgICAgICAgICAgIGhvb2tzPU5vbmUsIHN0cmVhbT1Ob25lLCB2ZXJpZnk9Tm9uZSwgY2VydD1Ob25lLCBqc29uPU5vbmUpOgogICAgICAgICIiIkNvbnN0cnVjdHMgYSA6Y2xhc3M6YFJlcXVlc3QgPFJlcXVlc3Q+YCwgcHJlcGFyZXMgaXQgYW5kIHNlbmRzIGl0LgogICAgICAgIFJldHVybnMgOmNsYXNzOmBSZXNwb25zZSA8UmVzcG9uc2U+YCBvYmplY3QuCgogICAgICAgIDpwYXJhbSBtZXRob2Q6IG1ldGhvZCBmb3IgdGhlIG5ldyA6Y2xhc3M6YFJlcXVlc3RgIG9iamVjdC4KICAgICAgICA6cGFyYW0gdXJsOiBVUkwgZm9yIHRoZSBuZXcgOmNsYXNzOmBSZXF1ZXN0YCBvYmplY3QuCiAgICAgICAgOnBhcmFtIHBhcmFtczogKG9wdGlvbmFsKSBEaWN0aW9uYXJ5IG9yIGJ5dGVzIHRvIGJlIHNlbnQgaW4gdGhlIHF1ZXJ5CiAgICAgICAgICAgIHN0cmluZyBmb3IgdGhlIDpjbGFzczpgUmVxdWVzdGAuCiAgICAgICAgOnBhcmFtIGRhdGE6IChvcHRpb25hbCkgRGljdGlvbmFyeSwgYnl0ZXMsIG9yIGZpbGUtbGlrZSBvYmplY3QgdG8gc2VuZAogICAgICAgICAgICBpbiB0aGUgYm9keSBvZiB0aGUgOmNsYXNzOmBSZXF1ZXN0YC4KICAgICAgICA6cGFyYW0ganNvbjogKG9wdGlvbmFsKSBqc29uIHRvIHNlbmQgaW4gdGhlIGJvZHkgb2YgdGhlCiAgICAgICAgICAgIDpjbGFzczpgUmVxdWVzdGAuCiAgICAgICAgOnBhcmFtIGhlYWRlcnM6IChvcHRpb25hbCkgRGljdGlvbmFyeSBvZiBIVFRQIEhlYWRlcnMgdG8gc2VuZCB3aXRoIHRoZQogICAgICAgICAgICA6Y2xhc3M6YFJlcXVlc3RgLgogICAgICAgIDpwYXJhbSBjb29raWVzOiAob3B0aW9uYWwpIERpY3Qgb3IgQ29va2llSmFyIG9iamVjdCB0byBzZW5kIHdpdGggdGhlCiAgICAgICAgICAgIDpjbGFzczpgUmVxdWVzdGAuCiAgICAgICAgOnBhcmFtIGZpbGVzOiAob3B0aW9uYWwpIERpY3Rpb25hcnkgb2YgYGAnZmlsZW5hbWUnOiBmaWxlLWxpa2Utb2JqZWN0c2BgCiAgICAgICAgICAgIGZvciBtdWx0aXBhcnQgZW5jb2RpbmcgdXBsb2FkLgogICAgICAgIDpwYXJhbSBhdXRoOiAob3B0aW9uYWwpIEF1dGggdHVwbGUgb3IgY2FsbGFibGUgdG8gZW5hYmxlCiAgICAgICAgICAgIEJhc2ljL0RpZ2VzdC9DdXN0b20gSFRUUCBBdXRoLgogICAgICAgIDpwYXJhbSB0aW1lb3V0OiAob3B0aW9uYWwpIEhvdyBsb25nIHRvIHdhaXQgZm9yIHRoZSBzZXJ2ZXIgdG8gc2VuZAogICAgICAgICAgICBkYXRhIGJlZm9yZSBnaXZpbmcgdXAsIGFzIGEgZmxvYXQsIG9yIGEgOnJlZjpgKGNvbm5lY3QgdGltZW91dCwKICAgICAgICAgICAgcmVhZCB0aW1lb3V0KSA8dGltZW91dHM+YCB0dXBsZS4KICAgICAgICA6dHlwZSB0aW1lb3V0OiBmbG9hdCBvciB0dXBsZQogICAgICAgIDpwYXJhbSBhbGxvd19yZWRpcmVjdHM6IChvcHRpb25hbCkgU2V0IHRvIFRydWUgYnkgZGVmYXVsdC4KICAgICAgICA6dHlwZSBhbGxvd19yZWRpcmVjdHM6IGJvb2wKICAgICAgICA6cGFyYW0gcHJveGllczogKG9wdGlvbmFsKSBEaWN0aW9uYXJ5IG1hcHBpbmcgcHJvdG9jb2wgb3IgcHJvdG9jb2wgYW5kCiAgICAgICAgICAgIGhvc3RuYW1lIHRvIHRoZSBVUkwgb2YgdGhlIHByb3h5LgogICAgICAgIDpwYXJhbSBzdHJlYW06IChvcHRpb25hbCkgd2hldGhlciB0byBpbW1lZGlhdGVseSBkb3dubG9hZCB0aGUgcmVzcG9uc2UKICAgICAgICAgICAgY29udGVudC4gRGVmYXVsdHMgdG8gYGBGYWxzZWBgLgogICAgICAgIDpwYXJhbSB2ZXJpZnk6IChvcHRpb25hbCkgRWl0aGVyIGEgYm9vbGVhbiwgaW4gd2hpY2ggY2FzZSBpdCBjb250cm9scyB3aGV0aGVyIHdlIHZlcmlmeQogICAgICAgICAgICB0aGUgc2VydmVyJ3MgVExTIGNlcnRpZmljYXRlLCBvciBhIHN0cmluZywgaW4gd2hpY2ggY2FzZSBpdCBtdXN0IGJlIGEgcGF0aAogICAgICAgICAgICB0byBhIENBIGJ1bmRsZSB0byB1c2UuIERlZmF1bHRzIHRvIGBgVHJ1ZWBgLgogICAgICAgIDpwYXJhbSBjZXJ0OiAob3B0aW9uYWwpIGlmIFN0cmluZywgcGF0aCB0byBzc2wgY2xpZW50IGNlcnQgZmlsZSAoLnBlbSkuCiAgICAgICAgICAgIElmIFR1cGxlLCAoJ2NlcnQnLCAna2V5JykgcGFpci4KICAgICAgICA6cnR5cGU6IHJlcXVlc3RzLlJlc3BvbnNlCiAgICAgICAgIiIiCiAgICAgICAgIyBDcmVhdGUgdGhlIFJlcXVlc3QuCiAgICAgICAgcmVxID0gUmVxdWVzdCgKICAgICAgICAgICAgbWV0aG9kPW1ldGhvZC51cHBlcigpLAogICAgICAgICAgICB1cmw9dXJsLAogICAgICAgICAgICBoZWFkZXJzPWhlYWRlcnMsCiAgICAgICAgICAgIGZpbGVzPWZpbGVzLAogICAgICAgICAgICBkYXRhPWRhdGEgb3Ige30sCiAgICAgICAgICAgIGpzb249anNvbiwKICAgICAgICAgICAgcGFyYW1zPXBhcmFtcyBvciB7fSwKICAgICAgICAgICAgYXV0aD1hdXRoLAogICAgICAgICAgICBjb29raWVzPWNvb2tpZXMsCiAgICAgICAgICAgIGhvb2tzPWhvb2tzLAogICAgICAgICkKICAgICAgICBwcmVwID0gc2VsZi5wcmVwYXJlX3JlcXVlc3QocmVxKQoKICAgICAgICBwcm94aWVzID0gcHJveGllcyBvciB7fQoKICAgICAgICBzZXR0aW5ncyA9IHNlbGYubWVyZ2VfZW52aXJvbm1lbnRfc2V0dGluZ3MoCiAgICAgICAgICAgIHByZXAudXJsLCBwcm94aWVzLCBzdHJlYW0sIHZlcmlmeSwgY2VydAogICAgICAgICkKCiAgICAgICAgIyBTZW5kIHRoZSByZXF1ZXN0LgogICAgICAgIHNlbmRfa3dhcmdzID0gewogICAgICAgICAgICAndGltZW91dCc6IHRpbWVvdXQsCiAgICAgICAgICAgICdhbGxvd19yZWRpcmVjdHMnOiBhbGxvd19yZWRpcmVjdHMsCiAgICAgICAgfQogICAgICAgIHNlbmRfa3dhcmdzLnVwZGF0ZShzZXR0aW5ncykKICAgICAgICByZXNwID0gc2VsZi5zZW5kKHByZXAsICoqc2VuZF9rd2FyZ3MpCgogICAgICAgIHJldHVybiByZXNwCgogICAgZGVmIGdldChzZWxmLCB1cmwsICoqa3dhcmdzKToKICAgICAgICByIiIiU2VuZHMgYSBHRVQgcmVxdWVzdC4gUmV0dXJucyA6Y2xhc3M6YFJlc3BvbnNlYCBvYmplY3QuCgogICAgICAgIDpwYXJhbSB1cmw6IFVSTCBmb3IgdGhlIG5ldyA6Y2xhc3M6YFJlcXVlc3RgIG9iamVjdC4KICAgICAgICA6cGFyYW0gXCpcKmt3YXJnczogT3B0aW9uYWwgYXJndW1lbnRzIHRoYXQgYGByZXF1ZXN0YGAgdGFrZXMuCiAgICAgICAgOnJ0eXBlOiByZXF1ZXN0cy5SZXNwb25zZQogICAgICAgICIiIgoKICAgICAgICBrd2FyZ3Muc2V0ZGVmYXVsdCgnYWxsb3dfcmVkaXJlY3RzJywgVHJ1ZSkKICAgICAgICByZXR1cm4gc2VsZi5yZXF1ZXN0KCdHRVQnLCB1cmwsICoqa3dhcmdzKQoKICAgIGRlZiBvcHRpb25zKHNlbGYsIHVybCwgKiprd2FyZ3MpOgogICAgICAgIHIiIiJTZW5kcyBhIE9QVElPTlMgcmVxdWVzdC4gUmV0dXJucyA6Y2xhc3M6YFJlc3BvbnNlYCBvYmplY3QuCgogICAgICAgIDpwYXJhbSB1cmw6IFVSTCBmb3IgdGhlIG5ldyA6Y2xhc3M6YFJlcXVlc3RgIG9iamVjdC4KICAgICAgICA6cGFyYW0gXCpcKmt3YXJnczogT3B0aW9uYWwgYXJndW1lbnRzIHRoYXQgYGByZXF1ZXN0YGAgdGFrZXMuCiAgICAgICAgOnJ0eXBlOiByZXF1ZXN0cy5SZXNwb25zZQogICAgICAgICIiIgoKICAgICAgICBrd2FyZ3Muc2V0ZGVmYXVsdCgnYWxsb3dfcmVkaXJlY3RzJywgVHJ1ZSkKICAgICAgICByZXR1cm4gc2VsZi5yZXF1ZXN0KCdPUFRJT05TJywgdXJsLCAqKmt3YXJncykKCiAgICBkZWYgaGVhZChzZWxmLCB1cmwsICoqa3dhcmdzKToKICAgICAgICByIiIiU2VuZHMgYSBIRUFEIHJlcXVlc3QuIFJldHVybnMgOmNsYXNzOmBSZXNwb25zZWAgb2JqZWN0LgoKICAgICAgICA6cGFyYW0gdXJsOiBVUkwgZm9yIHRoZSBuZXcgOmNsYXNzOmBSZXF1ZXN0YCBvYmplY3QuCiAgICAgICAgOnBhcmFtIFwqXCprd2FyZ3M6IE9wdGlvbmFsIGFyZ3VtZW50cyB0aGF0IGBgcmVxdWVzdGBgIHRha2VzLgogICAgICAgIDpydHlwZTogcmVxdWVzdHMuUmVzcG9uc2UKICAgICAgICAiIiIKCiAgICAgICAga3dhcmdzLnNldGRlZmF1bHQoJ2FsbG93X3JlZGlyZWN0cycsIEZhbHNlKQogICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3QoJ0hFQUQnLCB1cmwsICoqa3dhcmdzKQoKICAgIGRlZiBwb3N0KHNlbGYsIHVybCwgZGF0YT1Ob25lLCBqc29uPU5vbmUsICoqa3dhcmdzKToKICAgICAgICByIiIiU2VuZHMgYSBQT1NUIHJlcXVlc3QuIFJldHVybnMgOmNsYXNzOmBSZXNwb25zZWAgb2JqZWN0LgoKICAgICAgICA6cGFyYW0gdXJsOiBVUkwgZm9yIHRoZSBuZXcgOmNsYXNzOmBSZXF1ZXN0YCBvYmplY3QuCiAgICAgICAgOnBhcmFtIGRhdGE6IChvcHRpb25hbCkgRGljdGlvbmFyeSwgYnl0ZXMsIG9yIGZpbGUtbGlrZSBvYmplY3QgdG8gc2VuZCBpbiB0aGUgYm9keSBvZiB0aGUgOmNsYXNzOmBSZXF1ZXN0YC4KICAgICAgICA6cGFyYW0ganNvbjogKG9wdGlvbmFsKSBqc29uIHRvIHNlbmQgaW4gdGhlIGJvZHkgb2YgdGhlIDpjbGFzczpgUmVxdWVzdGAuCiAgICAgICAgOnBhcmFtIFwqXCprd2FyZ3M6IE9wdGlvbmFsIGFyZ3VtZW50cyB0aGF0IGBgcmVxdWVzdGBgIHRha2VzLgogICAgICAgIDpydHlwZTogcmVxdWVzdHMuUmVzcG9uc2UKICAgICAgICAiIiIKCiAgICAgICAgcmV0dXJuIHNlbGYucmVxdWVzdCgnUE9TVCcsIHVybCwgZGF0YT1kYXRhLCBqc29uPWpzb24sICoqa3dhcmdzKQoKICAgIGRlZiBwdXQoc2VsZiwgdXJsLCBkYXRhPU5vbmUsICoqa3dhcmdzKToKICAgICAgICByIiIiU2VuZHMgYSBQVVQgcmVxdWVzdC4gUmV0dXJucyA6Y2xhc3M6YFJlc3BvbnNlYCBvYmplY3QuCgogICAgICAgIDpwYXJhbSB1cmw6IFVSTCBmb3IgdGhlIG5ldyA6Y2xhc3M6YFJlcXVlc3RgIG9iamVjdC4KICAgICAgICA6cGFyYW0gZGF0YTogKG9wdGlvbmFsKSBEaWN0aW9uYXJ5LCBieXRlcywgb3IgZmlsZS1saWtlIG9iamVjdCB0byBzZW5kIGluIHRoZSBib2R5IG9mIHRoZSA6Y2xhc3M6YFJlcXVlc3RgLgogICAgICAgIDpwYXJhbSBcKlwqa3dhcmdzOiBPcHRpb25hbCBhcmd1bWVudHMgdGhhdCBgYHJlcXVlc3RgYCB0YWtlcy4KICAgICAgICA6cnR5cGU6IHJlcXVlc3RzLlJlc3BvbnNlCiAgICAgICAgIiIiCgogICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3QoJ1BVVCcsIHVybCwgZGF0YT1kYXRhLCAqKmt3YXJncykKCiAgICBkZWYgcGF0Y2goc2VsZiwgdXJsLCBkYXRhPU5vbmUsICoqa3dhcmdzKToKICAgICAgICByIiIiU2VuZHMgYSBQQVRDSCByZXF1ZXN0LiBSZXR1cm5zIDpjbGFzczpgUmVzcG9uc2VgIG9iamVjdC4KCiAgICAgICAgOnBhcmFtIHVybDogVVJMIGZvciB0aGUgbmV3IDpjbGFzczpgUmVxdWVzdGAgb2JqZWN0LgogICAgICAgIDpwYXJhbSBkYXRhOiAob3B0aW9uYWwpIERpY3Rpb25hcnksIGJ5dGVzLCBvciBmaWxlLWxpa2Ugb2JqZWN0IHRvIHNlbmQgaW4gdGhlIGJvZHkgb2YgdGhlIDpjbGFzczpgUmVxdWVzdGAuCiAgICAgICAgOnBhcmFtIFwqXCprd2FyZ3M6IE9wdGlvbmFsIGFyZ3VtZW50cyB0aGF0IGBgcmVxdWVzdGBgIHRha2VzLgogICAgICAgIDpydHlwZTogcmVxdWVzdHMuUmVzcG9uc2UKICAgICAgICAiIiIKCiAgICAgICAgcmV0dXJuIHNlbGYucmVxdWVzdCgnUEFUQ0gnLCB1cmwsIGRhdGE9ZGF0YSwgKiprd2FyZ3MpCgogICAgZGVmIGRlbGV0ZShzZWxmLCB1cmwsICoqa3dhcmdzKToKICAgICAgICByIiIiU2VuZHMgYSBERUxFVEUgcmVxdWVzdC4gUmV0dXJucyA6Y2xhc3M6YFJlc3BvbnNlYCBvYmplY3QuCgogICAgICAgIDpwYXJhbSB1cmw6IFVSTCBmb3IgdGhlIG5ldyA6Y2xhc3M6YFJlcXVlc3RgIG9iamVjdC4KICAgICAgICA6cGFyYW0gXCpcKmt3YXJnczogT3B0aW9uYWwgYXJndW1lbnRzIHRoYXQgYGByZXF1ZXN0YGAgdGFrZXMuCiAgICAgICAgOnJ0eXBlOiByZXF1ZXN0cy5SZXNwb25zZQogICAgICAgICIiIgoKICAgICAgICByZXR1cm4gc2VsZi5yZXF1ZXN0KCdERUxFVEUnLCB1cmwsICoqa3dhcmdzKQoKICAgIGRlZiBzZW5kKHNlbGYsIHJlcXVlc3QsICoqa3dhcmdzKToKICAgICAgICAiIiJTZW5kIGEgZ2l2ZW4gUHJlcGFyZWRSZXF1ZXN0LgoKICAgICAgICA6cnR5cGU6IHJlcXVlc3RzLlJlc3BvbnNlCiAgICAgICAgIiIiCiAgICAgICAgIyBTZXQgZGVmYXVsdHMgdGhhdCB0aGUgaG9va3MgY2FuIHV0aWxpemUgdG8gZW5zdXJlIHRoZXkgYWx3YXlzIGhhdmUKICAgICAgICAjIHRoZSBjb3JyZWN0IHBhcmFtZXRlcnMgdG8gcmVwcm9kdWNlIHRoZSBwcmV2aW91cyByZXF1ZXN0LgogICAgICAgIGt3YXJncy5zZXRkZWZhdWx0KCdzdHJlYW0nLCBzZWxmLnN0cmVhbSkKICAgICAgICBrd2FyZ3Muc2V0ZGVmYXVsdCgndmVyaWZ5Jywgc2VsZi52ZXJpZnkpCiAgICAgICAga3dhcmdzLnNldGRlZmF1bHQoJ2NlcnQnLCBzZWxmLmNlcnQpCiAgICAgICAga3dhcmdzLnNldGRlZmF1bHQoJ3Byb3hpZXMnLCBzZWxmLnByb3hpZXMpCgogICAgICAgICMgSXQncyBwb3NzaWJsZSB0aGF0IHVzZXJzIG1pZ2h0IGFjY2lkZW50YWxseSBzZW5kIGEgUmVxdWVzdCBvYmplY3QuCiAgICAgICAgIyBHdWFyZCBhZ2FpbnN0IHRoYXQgc3BlY2lmaWMgZmFpbHVyZSBjYXNlLgogICAgICAgIGlmIGlzaW5zdGFuY2UocmVxdWVzdCwgUmVxdWVzdCk6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1lvdSBjYW4gb25seSBzZW5kIFByZXBhcmVkUmVxdWVzdHMuJykKCiAgICAgICAgIyBTZXQgdXAgdmFyaWFibGVzIG5lZWRlZCBmb3IgcmVzb2x2ZV9yZWRpcmVjdHMgYW5kIGRpc3BhdGNoaW5nIG9mIGhvb2tzCiAgICAgICAgYWxsb3dfcmVkaXJlY3RzID0ga3dhcmdzLnBvcCgnYWxsb3dfcmVkaXJlY3RzJywgVHJ1ZSkKICAgICAgICBzdHJlYW0gPSBrd2FyZ3MuZ2V0KCdzdHJlYW0nKQogICAgICAgIGhvb2tzID0gcmVxdWVzdC5ob29rcwoKICAgICAgICAjIEdldCB0aGUgYXBwcm9wcmlhdGUgYWRhcHRlciB0byB1c2UKICAgICAgICBhZGFwdGVyID0gc2VsZi5nZXRfYWRhcHRlcih1cmw9cmVxdWVzdC51cmwpCgogICAgICAgICMgU3RhcnQgdGltZSAoYXBwcm94aW1hdGVseSkgb2YgdGhlIHJlcXVlc3QKICAgICAgICBzdGFydCA9IHByZWZlcnJlZF9jbG9jaygpCgogICAgICAgICMgU2VuZCB0aGUgcmVxdWVzdAogICAgICAgIHIgPSBhZGFwdGVyLnNlbmQocmVxdWVzdCwgKiprd2FyZ3MpCgogICAgICAgICMgVG90YWwgZWxhcHNlZCB0aW1lIG9mIHRoZSByZXF1ZXN0IChhcHByb3hpbWF0ZWx5KQogICAgICAgIGVsYXBzZWQgPSBwcmVmZXJyZWRfY2xvY2soKSAtIHN0YXJ0CiAgICAgICAgci5lbGFwc2VkID0gdGltZWRlbHRhKHNlY29uZHM9ZWxhcHNlZCkKCiAgICAgICAgIyBSZXNwb25zZSBtYW5pcHVsYXRpb24gaG9va3MKICAgICAgICByID0gZGlzcGF0Y2hfaG9vaygncmVzcG9uc2UnLCBob29rcywgciwgKiprd2FyZ3MpCgogICAgICAgICMgUGVyc2lzdCBjb29raWVzCiAgICAgICAgaWYgci5oaXN0b3J5OgoKICAgICAgICAgICAgIyBJZiB0aGUgaG9va3MgY3JlYXRlIGhpc3RvcnkgdGhlbiB3ZSB3YW50IHRob3NlIGNvb2tpZXMgdG9vCiAgICAgICAgICAgIGZvciByZXNwIGluIHIuaGlzdG9yeToKICAgICAgICAgICAgICAgIGV4dHJhY3RfY29va2llc190b19qYXIoc2VsZi5jb29raWVzLCByZXNwLnJlcXVlc3QsIHJlc3AucmF3KQoKICAgICAgICBleHRyYWN0X2Nvb2tpZXNfdG9famFyKHNlbGYuY29va2llcywgcmVxdWVzdCwgci5yYXcpCgogICAgICAgICMgUmVkaXJlY3QgcmVzb2x2aW5nIGdlbmVyYXRvci4KICAgICAgICBnZW4gPSBzZWxmLnJlc29sdmVfcmVkaXJlY3RzKHIsIHJlcXVlc3QsICoqa3dhcmdzKQoKICAgICAgICAjIFJlc29sdmUgcmVkaXJlY3RzIGlmIGFsbG93ZWQuCiAgICAgICAgaGlzdG9yeSA9IFtyZXNwIGZvciByZXNwIGluIGdlbl0gaWYgYWxsb3dfcmVkaXJlY3RzIGVsc2UgW10KCiAgICAgICAgIyBTaHVmZmxlIHRoaW5ncyBhcm91bmQgaWYgdGhlcmUncyBoaXN0b3J5LgogICAgICAgIGlmIGhpc3Rvcnk6CiAgICAgICAgICAgICMgSW5zZXJ0IHRoZSBmaXJzdCAob3JpZ2luYWwpIHJlcXVlc3QgYXQgdGhlIHN0YXJ0CiAgICAgICAgICAgIGhpc3RvcnkuaW5zZXJ0KDAsIHIpCiAgICAgICAgICAgICMgR2V0IHRoZSBsYXN0IHJlcXVlc3QgbWFkZQogICAgICAgICAgICByID0gaGlzdG9yeS5wb3AoKQogICAgICAgICAgICByLmhpc3RvcnkgPSBoaXN0b3J5CgogICAgICAgICMgSWYgcmVkaXJlY3RzIGFyZW4ndCBiZWluZyBmb2xsb3dlZCwgc3RvcmUgdGhlIHJlc3BvbnNlIG9uIHRoZSBSZXF1ZXN0IGZvciBSZXNwb25zZS5uZXh0KCkuCiAgICAgICAgaWYgbm90IGFsbG93X3JlZGlyZWN0czoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgci5fbmV4dCA9IG5leHQoc2VsZi5yZXNvbHZlX3JlZGlyZWN0cyhyLCByZXF1ZXN0LCB5aWVsZF9yZXF1ZXN0cz1UcnVlLCAqKmt3YXJncykpCiAgICAgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgogICAgICAgICAgICAgICAgcGFzcwoKICAgICAgICBpZiBub3Qgc3RyZWFtOgogICAgICAgICAgICByLmNvbnRlbnQKCiAgICAgICAgcmV0dXJuIHIKCiAgICBkZWYgbWVyZ2VfZW52aXJvbm1lbnRfc2V0dGluZ3Moc2VsZiwgdXJsLCBwcm94aWVzLCBzdHJlYW0sIHZlcmlmeSwgY2VydCk6CiAgICAgICAgIiIiCiAgICAgICAgQ2hlY2sgdGhlIGVudmlyb25tZW50IGFuZCBtZXJnZSBpdCB3aXRoIHNvbWUgc2V0dGluZ3MuCgogICAgICAgIDpydHlwZTogZGljdAogICAgICAgICIiIgogICAgICAgICMgR2F0aGVyIGNsdWVzIGZyb20gdGhlIHN1cnJvdW5kaW5nIGVudmlyb25tZW50LgogICAgICAgIGlmIHNlbGYudHJ1c3RfZW52OgogICAgICAgICAgICAjIFNldCBlbnZpcm9ubWVudCdzIHByb3hpZXMuCiAgICAgICAgICAgIG5vX3Byb3h5ID0gcHJveGllcy5nZXQoJ25vX3Byb3h5JykgaWYgcHJveGllcyBpcyBub3QgTm9uZSBlbHNlIE5vbmUKICAgICAgICAgICAgZW52X3Byb3hpZXMgPSBnZXRfZW52aXJvbl9wcm94aWVzKHVybCwgbm9fcHJveHk9bm9fcHJveHkpCiAgICAgICAgICAgIGZvciAoaywgdikgaW4gZW52X3Byb3hpZXMuaXRlbXMoKToKICAgICAgICAgICAgICAgIHByb3hpZXMuc2V0ZGVmYXVsdChrLCB2KQoKICAgICAgICAgICAgIyBMb29rIGZvciByZXF1ZXN0cyBlbnZpcm9ubWVudCBjb25maWd1cmF0aW9uIGFuZCBiZSBjb21wYXRpYmxlCiAgICAgICAgICAgICMgd2l0aCBjVVJMLgogICAgICAgICAgICBpZiB2ZXJpZnkgaXMgVHJ1ZSBvciB2ZXJpZnkgaXMgTm9uZToKICAgICAgICAgICAgICAgIHZlcmlmeSA9IChvcy5lbnZpcm9uLmdldCgnUkVRVUVTVFNfQ0FfQlVORExFJykgb3IKICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5lbnZpcm9uLmdldCgnQ1VSTF9DQV9CVU5ETEUnKSkKCiAgICAgICAgIyBNZXJnZSBhbGwgdGhlIGt3YXJncy4KICAgICAgICBwcm94aWVzID0gbWVyZ2Vfc2V0dGluZyhwcm94aWVzLCBzZWxmLnByb3hpZXMpCiAgICAgICAgc3RyZWFtID0gbWVyZ2Vfc2V0dGluZyhzdHJlYW0sIHNlbGYuc3RyZWFtKQogICAgICAgIHZlcmlmeSA9IG1lcmdlX3NldHRpbmcodmVyaWZ5LCBzZWxmLnZlcmlmeSkKICAgICAgICBjZXJ0ID0gbWVyZ2Vfc2V0dGluZyhjZXJ0LCBzZWxmLmNlcnQpCgogICAgICAgIHJldHVybiB7J3ZlcmlmeSc6IHZlcmlmeSwgJ3Byb3hpZXMnOiBwcm94aWVzLCAnc3RyZWFtJzogc3RyZWFtLAogICAgICAgICAgICAgICAgJ2NlcnQnOiBjZXJ0fQoKICAgIGRlZiBnZXRfYWRhcHRlcihzZWxmLCB1cmwpOgogICAgICAgICIiIgogICAgICAgIFJldHVybnMgdGhlIGFwcHJvcHJpYXRlIGNvbm5lY3Rpb24gYWRhcHRlciBmb3IgdGhlIGdpdmVuIFVSTC4KCiAgICAgICAgOnJ0eXBlOiByZXF1ZXN0cy5hZGFwdGVycy5CYXNlQWRhcHRlcgogICAgICAgICIiIgogICAgICAgIGZvciAocHJlZml4LCBhZGFwdGVyKSBpbiBzZWxmLmFkYXB0ZXJzLml0ZW1zKCk6CgogICAgICAgICAgICBpZiB1cmwubG93ZXIoKS5zdGFydHN3aXRoKHByZWZpeCk6CiAgICAgICAgICAgICAgICByZXR1cm4gYWRhcHRlcgoKICAgICAgICAjIE5vdGhpbmcgbWF0Y2hlcyA6LS8KICAgICAgICByYWlzZSBJbnZhbGlkU2NoZW1hKCJObyBjb25uZWN0aW9uIGFkYXB0ZXJzIHdlcmUgZm91bmQgZm9yICclcyciICUgdXJsKQoKICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICAiIiJDbG9zZXMgYWxsIGFkYXB0ZXJzIGFuZCBhcyBzdWNoIHRoZSBzZXNzaW9uIiIiCiAgICAgICAgZm9yIHYgaW4gc2VsZi5hZGFwdGVycy52YWx1ZXMoKToKICAgICAgICAgICAgdi5jbG9zZSgpCgogICAgZGVmIG1vdW50KHNlbGYsIHByZWZpeCwgYWRhcHRlcik6CiAgICAgICAgIiIiUmVnaXN0ZXJzIGEgY29ubmVjdGlvbiBhZGFwdGVyIHRvIGEgcHJlZml4LgoKICAgICAgICBBZGFwdGVycyBhcmUgc29ydGVkIGluIGRlc2NlbmRpbmcgb3JkZXIgYnkgcHJlZml4IGxlbmd0aC4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmFkYXB0ZXJzW3ByZWZpeF0gPSBhZGFwdGVyCiAgICAgICAga2V5c190b19tb3ZlID0gW2sgZm9yIGsgaW4gc2VsZi5hZGFwdGVycyBpZiBsZW4oaykgPCBsZW4ocHJlZml4KV0KCiAgICAgICAgZm9yIGtleSBpbiBrZXlzX3RvX21vdmU6CiAgICAgICAgICAgIHNlbGYuYWRhcHRlcnNba2V5XSA9IHNlbGYuYWRhcHRlcnMucG9wKGtleSkKCiAgICBkZWYgX19nZXRzdGF0ZV9fKHNlbGYpOgogICAgICAgIHN0YXRlID0gZGljdCgoYXR0ciwgZ2V0YXR0cihzZWxmLCBhdHRyLCBOb25lKSkgZm9yIGF0dHIgaW4gc2VsZi5fX2F0dHJzX18pCiAgICAgICAgcmV0dXJuIHN0YXRlCgogICAgZGVmIF9fc2V0c3RhdGVfXyhzZWxmLCBzdGF0ZSk6CiAgICAgICAgZm9yIGF0dHIsIHZhbHVlIGluIHN0YXRlLml0ZW1zKCk6CiAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgYXR0ciwgdmFsdWUpCgoKZGVmIHNlc3Npb24oKToKICAgICIiIgogICAgUmV0dXJucyBhIDpjbGFzczpgU2Vzc2lvbmAgZm9yIGNvbnRleHQtbWFuYWdlbWVudC4KCiAgICA6cnR5cGU6IFNlc3Npb24KICAgICIiIgoKICAgIHJldHVybiBTZXNzaW9uKCkKUEsDBBQAAAAAAAAAIQBBONfi+wwAAPsMAAA0AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL3N0YXR1c19jb2Rlcy5weSMgLSotIGNvZGluZzogdXRmLTggLSotCgpmcm9tIC5zdHJ1Y3R1cmVzIGltcG9ydCBMb29rdXBEaWN0CgpfY29kZXMgPSB7CgogICAgIyBJbmZvcm1hdGlvbmFsLgogICAgMTAwOiAoJ2NvbnRpbnVlJywpLAogICAgMTAxOiAoJ3N3aXRjaGluZ19wcm90b2NvbHMnLCksCiAgICAxMDI6ICgncHJvY2Vzc2luZycsKSwKICAgIDEwMzogKCdjaGVja3BvaW50JywpLAogICAgMTIyOiAoJ3VyaV90b29fbG9uZycsICdyZXF1ZXN0X3VyaV90b29fbG9uZycpLAogICAgMjAwOiAoJ29rJywgJ29rYXknLCAnYWxsX29rJywgJ2FsbF9va2F5JywgJ2FsbF9nb29kJywgJ1xcby8nLCAn4pyTJyksCiAgICAyMDE6ICgnY3JlYXRlZCcsKSwKICAgIDIwMjogKCdhY2NlcHRlZCcsKSwKICAgIDIwMzogKCdub25fYXV0aG9yaXRhdGl2ZV9pbmZvJywgJ25vbl9hdXRob3JpdGF0aXZlX2luZm9ybWF0aW9uJyksCiAgICAyMDQ6ICgnbm9fY29udGVudCcsKSwKICAgIDIwNTogKCdyZXNldF9jb250ZW50JywgJ3Jlc2V0JyksCiAgICAyMDY6ICgncGFydGlhbF9jb250ZW50JywgJ3BhcnRpYWwnKSwKICAgIDIwNzogKCdtdWx0aV9zdGF0dXMnLCAnbXVsdGlwbGVfc3RhdHVzJywgJ211bHRpX3N0YXRpJywgJ211bHRpcGxlX3N0YXRpJyksCiAgICAyMDg6ICgnYWxyZWFkeV9yZXBvcnRlZCcsKSwKICAgIDIyNjogKCdpbV91c2VkJywpLAoKICAgICMgUmVkaXJlY3Rpb24uCiAgICAzMDA6ICgnbXVsdGlwbGVfY2hvaWNlcycsKSwKICAgIDMwMTogKCdtb3ZlZF9wZXJtYW5lbnRseScsICdtb3ZlZCcsICdcXG8tJyksCiAgICAzMDI6ICgnZm91bmQnLCksCiAgICAzMDM6ICgnc2VlX290aGVyJywgJ290aGVyJyksCiAgICAzMDQ6ICgnbm90X21vZGlmaWVkJywpLAogICAgMzA1OiAoJ3VzZV9wcm94eScsKSwKICAgIDMwNjogKCdzd2l0Y2hfcHJveHknLCksCiAgICAzMDc6ICgndGVtcG9yYXJ5X3JlZGlyZWN0JywgJ3RlbXBvcmFyeV9tb3ZlZCcsICd0ZW1wb3JhcnknKSwKICAgIDMwODogKCdwZXJtYW5lbnRfcmVkaXJlY3QnLAogICAgICAgICAgJ3Jlc3VtZV9pbmNvbXBsZXRlJywgJ3Jlc3VtZScsKSwgICMgVGhlc2UgMiB0byBiZSByZW1vdmVkIGluIDMuMAoKICAgICMgQ2xpZW50IEVycm9yLgogICAgNDAwOiAoJ2JhZF9yZXF1ZXN0JywgJ2JhZCcpLAogICAgNDAxOiAoJ3VuYXV0aG9yaXplZCcsKSwKICAgIDQwMjogKCdwYXltZW50X3JlcXVpcmVkJywgJ3BheW1lbnQnKSwKICAgIDQwMzogKCdmb3JiaWRkZW4nLCksCiAgICA0MDQ6ICgnbm90X2ZvdW5kJywgJy1vLScpLAogICAgNDA1OiAoJ21ldGhvZF9ub3RfYWxsb3dlZCcsICdub3RfYWxsb3dlZCcpLAogICAgNDA2OiAoJ25vdF9hY2NlcHRhYmxlJywpLAogICAgNDA3OiAoJ3Byb3h5X2F1dGhlbnRpY2F0aW9uX3JlcXVpcmVkJywgJ3Byb3h5X2F1dGgnLCAncHJveHlfYXV0aGVudGljYXRpb24nKSwKICAgIDQwODogKCdyZXF1ZXN0X3RpbWVvdXQnLCAndGltZW91dCcpLAogICAgNDA5OiAoJ2NvbmZsaWN0JywpLAogICAgNDEwOiAoJ2dvbmUnLCksCiAgICA0MTE6ICgnbGVuZ3RoX3JlcXVpcmVkJywpLAogICAgNDEyOiAoJ3ByZWNvbmRpdGlvbl9mYWlsZWQnLCAncHJlY29uZGl0aW9uJyksCiAgICA0MTM6ICgncmVxdWVzdF9lbnRpdHlfdG9vX2xhcmdlJywpLAogICAgNDE0OiAoJ3JlcXVlc3RfdXJpX3Rvb19sYXJnZScsKSwKICAgIDQxNTogKCd1bnN1cHBvcnRlZF9tZWRpYV90eXBlJywgJ3Vuc3VwcG9ydGVkX21lZGlhJywgJ21lZGlhX3R5cGUnKSwKICAgIDQxNjogKCdyZXF1ZXN0ZWRfcmFuZ2Vfbm90X3NhdGlzZmlhYmxlJywgJ3JlcXVlc3RlZF9yYW5nZScsICdyYW5nZV9ub3Rfc2F0aXNmaWFibGUnKSwKICAgIDQxNzogKCdleHBlY3RhdGlvbl9mYWlsZWQnLCksCiAgICA0MTg6ICgnaW1fYV90ZWFwb3QnLCAndGVhcG90JywgJ2lfYW1fYV90ZWFwb3QnKSwKICAgIDQyMTogKCdtaXNkaXJlY3RlZF9yZXF1ZXN0JywpLAogICAgNDIyOiAoJ3VucHJvY2Vzc2FibGVfZW50aXR5JywgJ3VucHJvY2Vzc2FibGUnKSwKICAgIDQyMzogKCdsb2NrZWQnLCksCiAgICA0MjQ6ICgnZmFpbGVkX2RlcGVuZGVuY3knLCAnZGVwZW5kZW5jeScpLAogICAgNDI1OiAoJ3Vub3JkZXJlZF9jb2xsZWN0aW9uJywgJ3Vub3JkZXJlZCcpLAogICAgNDI2OiAoJ3VwZ3JhZGVfcmVxdWlyZWQnLCAndXBncmFkZScpLAogICAgNDI4OiAoJ3ByZWNvbmRpdGlvbl9yZXF1aXJlZCcsICdwcmVjb25kaXRpb24nKSwKICAgIDQyOTogKCd0b29fbWFueV9yZXF1ZXN0cycsICd0b29fbWFueScpLAogICAgNDMxOiAoJ2hlYWRlcl9maWVsZHNfdG9vX2xhcmdlJywgJ2ZpZWxkc190b29fbGFyZ2UnKSwKICAgIDQ0NDogKCdub19yZXNwb25zZScsICdub25lJyksCiAgICA0NDk6ICgncmV0cnlfd2l0aCcsICdyZXRyeScpLAogICAgNDUwOiAoJ2Jsb2NrZWRfYnlfd2luZG93c19wYXJlbnRhbF9jb250cm9scycsICdwYXJlbnRhbF9jb250cm9scycpLAogICAgNDUxOiAoJ3VuYXZhaWxhYmxlX2Zvcl9sZWdhbF9yZWFzb25zJywgJ2xlZ2FsX3JlYXNvbnMnKSwKICAgIDQ5OTogKCdjbGllbnRfY2xvc2VkX3JlcXVlc3QnLCksCgogICAgIyBTZXJ2ZXIgRXJyb3IuCiAgICA1MDA6ICgnaW50ZXJuYWxfc2VydmVyX2Vycm9yJywgJ3NlcnZlcl9lcnJvcicsICcvb1xcJywgJ+KclycpLAogICAgNTAxOiAoJ25vdF9pbXBsZW1lbnRlZCcsKSwKICAgIDUwMjogKCdiYWRfZ2F0ZXdheScsKSwKICAgIDUwMzogKCdzZXJ2aWNlX3VuYXZhaWxhYmxlJywgJ3VuYXZhaWxhYmxlJyksCiAgICA1MDQ6ICgnZ2F0ZXdheV90aW1lb3V0JywpLAogICAgNTA1OiAoJ2h0dHBfdmVyc2lvbl9ub3Rfc3VwcG9ydGVkJywgJ2h0dHBfdmVyc2lvbicpLAogICAgNTA2OiAoJ3ZhcmlhbnRfYWxzb19uZWdvdGlhdGVzJywpLAogICAgNTA3OiAoJ2luc3VmZmljaWVudF9zdG9yYWdlJywpLAogICAgNTA5OiAoJ2JhbmR3aWR0aF9saW1pdF9leGNlZWRlZCcsICdiYW5kd2lkdGgnKSwKICAgIDUxMDogKCdub3RfZXh0ZW5kZWQnLCksCiAgICA1MTE6ICgnbmV0d29ya19hdXRoZW50aWNhdGlvbl9yZXF1aXJlZCcsICduZXR3b3JrX2F1dGgnLCAnbmV0d29ya19hdXRoZW50aWNhdGlvbicpLAp9Cgpjb2RlcyA9IExvb2t1cERpY3QobmFtZT0nc3RhdHVzX2NvZGVzJykKCmZvciBjb2RlLCB0aXRsZXMgaW4gX2NvZGVzLml0ZW1zKCk6CiAgICBmb3IgdGl0bGUgaW4gdGl0bGVzOgogICAgICAgIHNldGF0dHIoY29kZXMsIHRpdGxlLCBjb2RlKQogICAgICAgIGlmIG5vdCB0aXRsZS5zdGFydHN3aXRoKCgnXFwnLCAnLycpKToKICAgICAgICAgICAgc2V0YXR0cihjb2RlcywgdGl0bGUudXBwZXIoKSwgY29kZSkKUEsDBBQAAAAAAAAAIQDmIMoPxAsAAMQLAAAyAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL3N0cnVjdHVyZXMucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoKIiIiCnJlcXVlc3RzLnN0cnVjdHVyZXMKfn5+fn5+fn5+fn5+fn5+fn5+fgoKRGF0YSBzdHJ1Y3R1cmVzIHRoYXQgcG93ZXIgUmVxdWVzdHMuCiIiIgoKaW1wb3J0IGNvbGxlY3Rpb25zCgpmcm9tIC5jb21wYXQgaW1wb3J0IE9yZGVyZWREaWN0CgoKY2xhc3MgQ2FzZUluc2Vuc2l0aXZlRGljdChjb2xsZWN0aW9ucy5NdXRhYmxlTWFwcGluZyk6CiAgICAiIiJBIGNhc2UtaW5zZW5zaXRpdmUgYGBkaWN0YGAtbGlrZSBvYmplY3QuCgogICAgSW1wbGVtZW50cyBhbGwgbWV0aG9kcyBhbmQgb3BlcmF0aW9ucyBvZgogICAgYGBjb2xsZWN0aW9ucy5NdXRhYmxlTWFwcGluZ2BgIGFzIHdlbGwgYXMgZGljdCdzIGBgY29weWBgLiBBbHNvCiAgICBwcm92aWRlcyBgYGxvd2VyX2l0ZW1zYGAuCgogICAgQWxsIGtleXMgYXJlIGV4cGVjdGVkIHRvIGJlIHN0cmluZ3MuIFRoZSBzdHJ1Y3R1cmUgcmVtZW1iZXJzIHRoZQogICAgY2FzZSBvZiB0aGUgbGFzdCBrZXkgdG8gYmUgc2V0LCBhbmQgYGBpdGVyKGluc3RhbmNlKWBgLAogICAgYGBrZXlzKClgYCwgYGBpdGVtcygpYGAsIGBgaXRlcmtleXMoKWBgLCBhbmQgYGBpdGVyaXRlbXMoKWBgCiAgICB3aWxsIGNvbnRhaW4gY2FzZS1zZW5zaXRpdmUga2V5cy4gSG93ZXZlciwgcXVlcnlpbmcgYW5kIGNvbnRhaW5zCiAgICB0ZXN0aW5nIGlzIGNhc2UgaW5zZW5zaXRpdmU6OgoKICAgICAgICBjaWQgPSBDYXNlSW5zZW5zaXRpdmVEaWN0KCkKICAgICAgICBjaWRbJ0FjY2VwdCddID0gJ2FwcGxpY2F0aW9uL2pzb24nCiAgICAgICAgY2lkWydhQ0NFUFQnXSA9PSAnYXBwbGljYXRpb24vanNvbicgICMgVHJ1ZQogICAgICAgIGxpc3QoY2lkKSA9PSBbJ0FjY2VwdCddICAjIFRydWUKCiAgICBGb3IgZXhhbXBsZSwgYGBoZWFkZXJzWydjb250ZW50LWVuY29kaW5nJ11gYCB3aWxsIHJldHVybiB0aGUKICAgIHZhbHVlIG9mIGEgYGAnQ29udGVudC1FbmNvZGluZydgYCByZXNwb25zZSBoZWFkZXIsIHJlZ2FyZGxlc3MKICAgIG9mIGhvdyB0aGUgaGVhZGVyIG5hbWUgd2FzIG9yaWdpbmFsbHkgc3RvcmVkLgoKICAgIElmIHRoZSBjb25zdHJ1Y3RvciwgYGAudXBkYXRlYGAsIG9yIGVxdWFsaXR5IGNvbXBhcmlzb24KICAgIG9wZXJhdGlvbnMgYXJlIGdpdmVuIGtleXMgdGhhdCBoYXZlIGVxdWFsIGBgLmxvd2VyKClgYHMsIHRoZQogICAgYmVoYXZpb3IgaXMgdW5kZWZpbmVkLgogICAgIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGRhdGE9Tm9uZSwgKiprd2FyZ3MpOgogICAgICAgIHNlbGYuX3N0b3JlID0gT3JkZXJlZERpY3QoKQogICAgICAgIGlmIGRhdGEgaXMgTm9uZToKICAgICAgICAgICAgZGF0YSA9IHt9CiAgICAgICAgc2VsZi51cGRhdGUoZGF0YSwgKiprd2FyZ3MpCgogICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpOgogICAgICAgICMgVXNlIHRoZSBsb3dlcmNhc2VkIGtleSBmb3IgbG9va3VwcywgYnV0IHN0b3JlIHRoZSBhY3R1YWwKICAgICAgICAjIGtleSBhbG9uZ3NpZGUgdGhlIHZhbHVlLgogICAgICAgIHNlbGYuX3N0b3JlW2tleS5sb3dlcigpXSA9IChrZXksIHZhbHVlKQoKICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgogICAgICAgIHJldHVybiBzZWxmLl9zdG9yZVtrZXkubG93ZXIoKV1bMV0KCiAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwga2V5KToKICAgICAgICBkZWwgc2VsZi5fc3RvcmVba2V5Lmxvd2VyKCldCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAoY2FzZWRrZXkgZm9yIGNhc2Vka2V5LCBtYXBwZWR2YWx1ZSBpbiBzZWxmLl9zdG9yZS52YWx1ZXMoKSkKCiAgICBkZWYgX19sZW5fXyhzZWxmKToKICAgICAgICByZXR1cm4gbGVuKHNlbGYuX3N0b3JlKQoKICAgIGRlZiBsb3dlcl9pdGVtcyhzZWxmKToKICAgICAgICAiIiJMaWtlIGl0ZXJpdGVtcygpLCBidXQgd2l0aCBhbGwgbG93ZXJjYXNlIGtleXMuIiIiCiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgKGxvd2Vya2V5LCBrZXl2YWxbMV0pCiAgICAgICAgICAgIGZvciAobG93ZXJrZXksIGtleXZhbCkKICAgICAgICAgICAgaW4gc2VsZi5fc3RvcmUuaXRlbXMoKQogICAgICAgICkKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBjb2xsZWN0aW9ucy5NYXBwaW5nKToKICAgICAgICAgICAgb3RoZXIgPSBDYXNlSW5zZW5zaXRpdmVEaWN0KG90aGVyKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogICAgICAgICMgQ29tcGFyZSBpbnNlbnNpdGl2ZWx5CiAgICAgICAgcmV0dXJuIGRpY3Qoc2VsZi5sb3dlcl9pdGVtcygpKSA9PSBkaWN0KG90aGVyLmxvd2VyX2l0ZW1zKCkpCgogICAgIyBDb3B5IGlzIHJlcXVpcmVkCiAgICBkZWYgY29weShzZWxmKToKICAgICAgICByZXR1cm4gQ2FzZUluc2Vuc2l0aXZlRGljdChzZWxmLl9zdG9yZS52YWx1ZXMoKSkKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHN0cihkaWN0KHNlbGYuaXRlbXMoKSkpCgoKY2xhc3MgTG9va3VwRGljdChkaWN0KToKICAgICIiIkRpY3Rpb25hcnkgbG9va3VwIG9iamVjdC4iIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZT1Ob25lKToKICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCiAgICAgICAgc3VwZXIoTG9va3VwRGljdCwgc2VsZikuX19pbml0X18oKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gJzxsb29rdXAgXCclc1wnPicgJSAoc2VsZi5uYW1lKQoKICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgogICAgICAgICMgV2UgYWxsb3cgZmFsbC10aHJvdWdoIGhlcmUsIHNvIHZhbHVlcyBkZWZhdWx0IHRvIE5vbmUKCiAgICAgICAgcmV0dXJuIHNlbGYuX19kaWN0X18uZ2V0KGtleSwgTm9uZSkKCiAgICBkZWYgZ2V0KHNlbGYsIGtleSwgZGVmYXVsdD1Ob25lKToKICAgICAgICByZXR1cm4gc2VsZi5fX2RpY3RfXy5nZXQoa2V5LCBkZWZhdWx0KQpQSwMEFAAAAAAAAAAhAEfB2VcEbAAABGwAAC0AAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvdXRpbHMucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoKIiIiCnJlcXVlc3RzLnV0aWxzCn5+fn5+fn5+fn5+fn5+CgpUaGlzIG1vZHVsZSBwcm92aWRlcyB1dGlsaXR5IGZ1bmN0aW9ucyB0aGF0IGFyZSB1c2VkIHdpdGhpbiBSZXF1ZXN0cwp0aGF0IGFyZSBhbHNvIHVzZWZ1bCBmb3IgZXh0ZXJuYWwgY29uc3VtcHRpb24uCiIiIgoKaW1wb3J0IGNnaQppbXBvcnQgY29kZWNzCmltcG9ydCBjb2xsZWN0aW9ucwppbXBvcnQgY29udGV4dGxpYgppbXBvcnQgaW8KaW1wb3J0IG9zCmltcG9ydCBwbGF0Zm9ybQppbXBvcnQgcmUKaW1wb3J0IHNvY2tldAppbXBvcnQgc3RydWN0CmltcG9ydCB3YXJuaW5ncwoKZnJvbSAuX192ZXJzaW9uX18gaW1wb3J0IF9fdmVyc2lvbl9fCmZyb20gLiBpbXBvcnQgY2VydHMKIyB0b19uYXRpdmVfc3RyaW5nIGlzIHVudXNlZCBoZXJlLCBidXQgaW1wb3J0ZWQgaGVyZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKZnJvbSAuX2ludGVybmFsX3V0aWxzIGltcG9ydCB0b19uYXRpdmVfc3RyaW5nCmZyb20gLmNvbXBhdCBpbXBvcnQgcGFyc2VfaHR0cF9saXN0IGFzIF9wYXJzZV9saXN0X2hlYWRlcgpmcm9tIC5jb21wYXQgaW1wb3J0ICgKICAgIHF1b3RlLCB1cmxwYXJzZSwgYnl0ZXMsIHN0ciwgT3JkZXJlZERpY3QsIHVucXVvdGUsIGdldHByb3hpZXMsCiAgICBwcm94eV9ieXBhc3MsIHVybHVucGFyc2UsIGJhc2VzdHJpbmcsIGludGVnZXJfdHlwZXMsIGlzX3B5MywKICAgIHByb3h5X2J5cGFzc19lbnZpcm9ubWVudCwgZ2V0cHJveGllc19lbnZpcm9ubWVudCkKZnJvbSAuY29va2llcyBpbXBvcnQgY29va2llamFyX2Zyb21fZGljdApmcm9tIC5zdHJ1Y3R1cmVzIGltcG9ydCBDYXNlSW5zZW5zaXRpdmVEaWN0CmZyb20gLmV4Y2VwdGlvbnMgaW1wb3J0ICgKICAgIEludmFsaWRVUkwsIEludmFsaWRIZWFkZXIsIEZpbGVNb2RlV2FybmluZywgVW5yZXdpbmRhYmxlQm9keUVycm9yKQoKTkVUUkNfRklMRVMgPSAoJy5uZXRyYycsICdfbmV0cmMnKQoKREVGQVVMVF9DQV9CVU5ETEVfUEFUSCA9IGNlcnRzLndoZXJlKCkKCgppZiBwbGF0Zm9ybS5zeXN0ZW0oKSA9PSAnV2luZG93cyc6CiAgICAjIHByb3ZpZGUgYSBwcm94eV9ieXBhc3MgdmVyc2lvbiBvbiBXaW5kb3dzIHdpdGhvdXQgRE5TIGxvb2t1cHMKCiAgICBkZWYgcHJveHlfYnlwYXNzX3JlZ2lzdHJ5KGhvc3QpOgogICAgICAgIGlmIGlzX3B5MzoKICAgICAgICAgICAgaW1wb3J0IHdpbnJlZwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGltcG9ydCBfd2lucmVnIGFzIHdpbnJlZwogICAgICAgIHRyeToKICAgICAgICAgICAgaW50ZXJuZXRTZXR0aW5ncyA9IHdpbnJlZy5PcGVuS2V5KHdpbnJlZy5IS0VZX0NVUlJFTlRfVVNFUiwKICAgICAgICAgICAgICAgIHInU29mdHdhcmVcTWljcm9zb2Z0XFdpbmRvd3NcQ3VycmVudFZlcnNpb25cSW50ZXJuZXQgU2V0dGluZ3MnKQogICAgICAgICAgICBwcm94eUVuYWJsZSA9IHdpbnJlZy5RdWVyeVZhbHVlRXgoaW50ZXJuZXRTZXR0aW5ncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQcm94eUVuYWJsZScpWzBdCiAgICAgICAgICAgIHByb3h5T3ZlcnJpZGUgPSB3aW5yZWcuUXVlcnlWYWx1ZUV4KGludGVybmV0U2V0dGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQcm94eU92ZXJyaWRlJylbMF0KICAgICAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgaWYgbm90IHByb3h5RW5hYmxlIG9yIG5vdCBwcm94eU92ZXJyaWRlOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBtYWtlIGEgY2hlY2sgdmFsdWUgbGlzdCBmcm9tIHRoZSByZWdpc3RyeSBlbnRyeTogcmVwbGFjZSB0aGUKICAgICAgICAjICc8bG9jYWw+JyBzdHJpbmcgYnkgdGhlIGxvY2FsaG9zdCBlbnRyeSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcKICAgICAgICAjIGNhbm9uaWNhbCBlbnRyeS4KICAgICAgICBwcm94eU92ZXJyaWRlID0gcHJveHlPdmVycmlkZS5zcGxpdCgnOycpCiAgICAgICAgIyBub3cgY2hlY2sgaWYgd2UgbWF0Y2ggb25lIG9mIHRoZSByZWdpc3RyeSB2YWx1ZXMuCiAgICAgICAgZm9yIHRlc3QgaW4gcHJveHlPdmVycmlkZToKICAgICAgICAgICAgaWYgdGVzdCA9PSAnPGxvY2FsPic6CiAgICAgICAgICAgICAgICBpZiAnLicgbm90IGluIGhvc3Q6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICAgICAgdGVzdCA9IHRlc3QucmVwbGFjZSgiLiIsIHIiXC4iKSAgICAgIyBtYXNrIGRvdHMKICAgICAgICAgICAgdGVzdCA9IHRlc3QucmVwbGFjZSgiKiIsIHIiLioiKSAgICAgIyBjaGFuZ2UgZ2xvYiBzZXF1ZW5jZQogICAgICAgICAgICB0ZXN0ID0gdGVzdC5yZXBsYWNlKCI/IiwgciIuIikgICAgICAjIGNoYW5nZSBnbG9iIGNoYXIKICAgICAgICAgICAgaWYgcmUubWF0Y2godGVzdCwgaG9zdCwgcmUuSSk6CiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBwcm94eV9ieXBhc3MoaG9zdCk6ICAjIG5vcWEKICAgICAgICAiIiJSZXR1cm4gVHJ1ZSwgaWYgdGhlIGhvc3Qgc2hvdWxkIGJlIGJ5cGFzc2VkLgoKICAgICAgICBDaGVja3MgcHJveHkgc2V0dGluZ3MgZ2F0aGVyZWQgZnJvbSB0aGUgZW52aXJvbm1lbnQsIGlmIHNwZWNpZmllZCwKICAgICAgICBvciB0aGUgcmVnaXN0cnkuCiAgICAgICAgIiIiCiAgICAgICAgaWYgZ2V0cHJveGllc19lbnZpcm9ubWVudCgpOgogICAgICAgICAgICByZXR1cm4gcHJveHlfYnlwYXNzX2Vudmlyb25tZW50KGhvc3QpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHByb3h5X2J5cGFzc19yZWdpc3RyeShob3N0KQoKCmRlZiBkaWN0X3RvX3NlcXVlbmNlKGQpOgogICAgIiIiUmV0dXJucyBhbiBpbnRlcm5hbCBzZXF1ZW5jZSBkaWN0aW9uYXJ5IHVwZGF0ZS4iIiIKCiAgICBpZiBoYXNhdHRyKGQsICdpdGVtcycpOgogICAgICAgIGQgPSBkLml0ZW1zKCkKCiAgICByZXR1cm4gZAoKCmRlZiBzdXBlcl9sZW4obyk6CiAgICB0b3RhbF9sZW5ndGggPSBOb25lCiAgICBjdXJyZW50X3Bvc2l0aW9uID0gMAoKICAgIGlmIGhhc2F0dHIobywgJ19fbGVuX18nKToKICAgICAgICB0b3RhbF9sZW5ndGggPSBsZW4obykKCiAgICBlbGlmIGhhc2F0dHIobywgJ2xlbicpOgogICAgICAgIHRvdGFsX2xlbmd0aCA9IG8ubGVuCgogICAgZWxpZiBoYXNhdHRyKG8sICdmaWxlbm8nKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZpbGVubyA9IG8uZmlsZW5vKCkKICAgICAgICBleGNlcHQgaW8uVW5zdXBwb3J0ZWRPcGVyYXRpb246CiAgICAgICAgICAgIHBhc3MKICAgICAgICBlbHNlOgogICAgICAgICAgICB0b3RhbF9sZW5ndGggPSBvcy5mc3RhdChmaWxlbm8pLnN0X3NpemUKCiAgICAgICAgICAgICMgSGF2aW5nIHVzZWQgZnN0YXQgdG8gZGV0ZXJtaW5lIHRoZSBmaWxlIGxlbmd0aCwgd2UgbmVlZCB0bwogICAgICAgICAgICAjIGNvbmZpcm0gdGhhdCB0aGlzIGZpbGUgd2FzIG9wZW5lZCB1cCBpbiBiaW5hcnkgbW9kZS4KICAgICAgICAgICAgaWYgJ2InIG5vdCBpbiBvLm1vZGU6CiAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCgKICAgICAgICAgICAgICAgICAgICAiUmVxdWVzdHMgaGFzIGRldGVybWluZWQgdGhlIGNvbnRlbnQtbGVuZ3RoIGZvciB0aGlzICIKICAgICAgICAgICAgICAgICAgICAicmVxdWVzdCB1c2luZyB0aGUgYmluYXJ5IHNpemUgb2YgdGhlIGZpbGU6IGhvd2V2ZXIsIHRoZSAiCiAgICAgICAgICAgICAgICAgICAgImZpbGUgaGFzIGJlZW4gb3BlbmVkIGluIHRleHQgbW9kZSAoaS5lLiB3aXRob3V0IHRoZSAnYicgIgogICAgICAgICAgICAgICAgICAgICJmbGFnIGluIHRoZSBtb2RlKS4gVGhpcyBtYXkgbGVhZCB0byBhbiBpbmNvcnJlY3QgIgogICAgICAgICAgICAgICAgICAgICJjb250ZW50LWxlbmd0aC4gSW4gUmVxdWVzdHMgMy4wLCBzdXBwb3J0IHdpbGwgYmUgcmVtb3ZlZCAiCiAgICAgICAgICAgICAgICAgICAgImZvciBmaWxlcyBpbiB0ZXh0IG1vZGUuIiksCiAgICAgICAgICAgICAgICAgICAgRmlsZU1vZGVXYXJuaW5nCiAgICAgICAgICAgICAgICApCgogICAgaWYgaGFzYXR0cihvLCAndGVsbCcpOgogICAgICAgIHRyeToKICAgICAgICAgICAgY3VycmVudF9wb3NpdGlvbiA9IG8udGVsbCgpCiAgICAgICAgZXhjZXB0IChPU0Vycm9yLCBJT0Vycm9yKToKICAgICAgICAgICAgIyBUaGlzIGNhbiBoYXBwZW4gaW4gc29tZSB3ZWlyZCBzaXR1YXRpb25zLCBzdWNoIGFzIHdoZW4gdGhlIGZpbGUKICAgICAgICAgICAgIyBpcyBhY3R1YWxseSBhIHNwZWNpYWwgZmlsZSBkZXNjcmlwdG9yIGxpa2Ugc3RkaW4uIEluIHRoaXMKICAgICAgICAgICAgIyBpbnN0YW5jZSwgd2UgZG9uJ3Qga25vdyB3aGF0IHRoZSBsZW5ndGggaXMsIHNvIHNldCBpdCB0byB6ZXJvIGFuZAogICAgICAgICAgICAjIGxldCByZXF1ZXN0cyBjaHVuayBpdCBpbnN0ZWFkLgogICAgICAgICAgICBpZiB0b3RhbF9sZW5ndGggaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBjdXJyZW50X3Bvc2l0aW9uID0gdG90YWxfbGVuZ3RoCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgaGFzYXR0cihvLCAnc2VlaycpIGFuZCB0b3RhbF9sZW5ndGggaXMgTm9uZToKICAgICAgICAgICAgICAgICMgU3RyaW5nSU8gYW5kIEJ5dGVzSU8gaGF2ZSBzZWVrIGJ1dCBubyB1c2VhYmxlIGZpbGVubwogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICMgc2VlayB0byBlbmQgb2YgZmlsZQogICAgICAgICAgICAgICAgICAgIG8uc2VlaygwLCAyKQogICAgICAgICAgICAgICAgICAgIHRvdGFsX2xlbmd0aCA9IG8udGVsbCgpCgogICAgICAgICAgICAgICAgICAgICMgc2VlayBiYWNrIHRvIGN1cnJlbnQgcG9zaXRpb24gdG8gc3VwcG9ydAogICAgICAgICAgICAgICAgICAgICMgcGFydGlhbGx5IHJlYWQgZmlsZS1saWtlIG9iamVjdHMKICAgICAgICAgICAgICAgICAgICBvLnNlZWsoY3VycmVudF9wb3NpdGlvbiBvciAwKQogICAgICAgICAgICAgICAgZXhjZXB0IChPU0Vycm9yLCBJT0Vycm9yKToKICAgICAgICAgICAgICAgICAgICB0b3RhbF9sZW5ndGggPSAwCgogICAgaWYgdG90YWxfbGVuZ3RoIGlzIE5vbmU6CiAgICAgICAgdG90YWxfbGVuZ3RoID0gMAoKICAgIHJldHVybiBtYXgoMCwgdG90YWxfbGVuZ3RoIC0gY3VycmVudF9wb3NpdGlvbikKCgpkZWYgZ2V0X25ldHJjX2F1dGgodXJsLCByYWlzZV9lcnJvcnM9RmFsc2UpOgogICAgIiIiUmV0dXJucyB0aGUgUmVxdWVzdHMgdHVwbGUgYXV0aCBmb3IgYSBnaXZlbiB1cmwgZnJvbSBuZXRyYy4iIiIKCiAgICB0cnk6CiAgICAgICAgZnJvbSBuZXRyYyBpbXBvcnQgbmV0cmMsIE5ldHJjUGFyc2VFcnJvcgoKICAgICAgICBuZXRyY19wYXRoID0gTm9uZQoKICAgICAgICBmb3IgZiBpbiBORVRSQ19GSUxFUzoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgbG9jID0gb3MucGF0aC5leHBhbmR1c2VyKCd+L3swfScuZm9ybWF0KGYpKQogICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICAgICAjIG9zLnBhdGguZXhwYW5kdXNlciBjYW4gZmFpbCB3aGVuICRIT01FIGlzIHVuZGVmaW5lZCBhbmQKICAgICAgICAgICAgICAgICMgZ2V0cHd1aWQgZmFpbHMuIFNlZSBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMjAxNjQgJgogICAgICAgICAgICAgICAgIyBodHRwczovL2dpdGh1Yi5jb20vcmVxdWVzdHMvcmVxdWVzdHMvaXNzdWVzLzE4NDYKICAgICAgICAgICAgICAgIHJldHVybgoKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMobG9jKToKICAgICAgICAgICAgICAgIG5ldHJjX3BhdGggPSBsb2MKICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgICMgQWJvcnQgZWFybHkgaWYgdGhlcmUgaXNuJ3Qgb25lLgogICAgICAgIGlmIG5ldHJjX3BhdGggaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHJpID0gdXJscGFyc2UodXJsKQoKICAgICAgICAjIFN0cmlwIHBvcnQgbnVtYmVycyBmcm9tIG5ldGxvYy4gVGhpcyB3ZWlyZCBgaWYuLi5lbmNvZGVgYCBkYW5jZSBpcwogICAgICAgICMgdXNlZCBmb3IgUHl0aG9uIDMuMiwgd2hpY2ggZG9lc24ndCBzdXBwb3J0IHVuaWNvZGUgbGl0ZXJhbHMuCiAgICAgICAgc3BsaXRzdHIgPSBiJzonCiAgICAgICAgaWYgaXNpbnN0YW5jZSh1cmwsIHN0cik6CiAgICAgICAgICAgIHNwbGl0c3RyID0gc3BsaXRzdHIuZGVjb2RlKCdhc2NpaScpCiAgICAgICAgaG9zdCA9IHJpLm5ldGxvYy5zcGxpdChzcGxpdHN0cilbMF0KCiAgICAgICAgdHJ5OgogICAgICAgICAgICBfbmV0cmMgPSBuZXRyYyhuZXRyY19wYXRoKS5hdXRoZW50aWNhdG9ycyhob3N0KQogICAgICAgICAgICBpZiBfbmV0cmM6CiAgICAgICAgICAgICAgICAjIFJldHVybiB3aXRoIGxvZ2luIC8gcGFzc3dvcmQKICAgICAgICAgICAgICAgIGxvZ2luX2kgPSAoMCBpZiBfbmV0cmNbMF0gZWxzZSAxKQogICAgICAgICAgICAgICAgcmV0dXJuIChfbmV0cmNbbG9naW5faV0sIF9uZXRyY1syXSkKICAgICAgICBleGNlcHQgKE5ldHJjUGFyc2VFcnJvciwgSU9FcnJvcik6CiAgICAgICAgICAgICMgSWYgdGhlcmUgd2FzIGEgcGFyc2luZyBlcnJvciBvciBhIHBlcm1pc3Npb25zIGlzc3VlIHJlYWRpbmcgdGhlIGZpbGUsCiAgICAgICAgICAgICMgd2UnbGwganVzdCBza2lwIG5ldHJjIGF1dGggdW5sZXNzIGV4cGxpY2l0bHkgYXNrZWQgdG8gcmFpc2UgZXJyb3JzLgogICAgICAgICAgICBpZiByYWlzZV9lcnJvcnM6CiAgICAgICAgICAgICAgICByYWlzZQoKICAgICMgQXBwRW5naW5lIGhhY2tpbmVzcy4KICAgIGV4Y2VwdCAoSW1wb3J0RXJyb3IsIEF0dHJpYnV0ZUVycm9yKToKICAgICAgICBwYXNzCgoKZGVmIGd1ZXNzX2ZpbGVuYW1lKG9iaik6CiAgICAiIiJUcmllcyB0byBndWVzcyB0aGUgZmlsZW5hbWUgb2YgdGhlIGdpdmVuIG9iamVjdC4iIiIKICAgIG5hbWUgPSBnZXRhdHRyKG9iaiwgJ25hbWUnLCBOb25lKQogICAgaWYgKG5hbWUgYW5kIGlzaW5zdGFuY2UobmFtZSwgYmFzZXN0cmluZykgYW5kIG5hbWVbMF0gIT0gJzwnIGFuZAogICAgICAgICAgICBuYW1lWy0xXSAhPSAnPicpOgogICAgICAgIHJldHVybiBvcy5wYXRoLmJhc2VuYW1lKG5hbWUpCgoKZGVmIGZyb21fa2V5X3ZhbF9saXN0KHZhbHVlKToKICAgICIiIlRha2UgYW4gb2JqZWN0IGFuZCB0ZXN0IHRvIHNlZSBpZiBpdCBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgYQogICAgZGljdGlvbmFyeS4gVW5sZXNzIGl0IGNhbiBub3QgYmUgcmVwcmVzZW50ZWQgYXMgc3VjaCwgcmV0dXJuIGFuCiAgICBPcmRlcmVkRGljdCwgZS5nLiwKCiAgICA6OgoKICAgICAgICA+Pj4gZnJvbV9rZXlfdmFsX2xpc3QoWygna2V5JywgJ3ZhbCcpXSkKICAgICAgICBPcmRlcmVkRGljdChbKCdrZXknLCAndmFsJyldKQogICAgICAgID4+PiBmcm9tX2tleV92YWxfbGlzdCgnc3RyaW5nJykKICAgICAgICBWYWx1ZUVycm9yOiBuZWVkIG1vcmUgdGhhbiAxIHZhbHVlIHRvIHVucGFjawogICAgICAgID4+PiBmcm9tX2tleV92YWxfbGlzdCh7J2tleSc6ICd2YWwnfSkKICAgICAgICBPcmRlcmVkRGljdChbKCdrZXknLCAndmFsJyldKQoKICAgIDpydHlwZTogT3JkZXJlZERpY3QKICAgICIiIgogICAgaWYgdmFsdWUgaXMgTm9uZToKICAgICAgICByZXR1cm4gTm9uZQoKICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIChzdHIsIGJ5dGVzLCBib29sLCBpbnQpKToKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdjYW5ub3QgZW5jb2RlIG9iamVjdHMgdGhhdCBhcmUgbm90IDItdHVwbGVzJykKCiAgICByZXR1cm4gT3JkZXJlZERpY3QodmFsdWUpCgoKZGVmIHRvX2tleV92YWxfbGlzdCh2YWx1ZSk6CiAgICAiIiJUYWtlIGFuIG9iamVjdCBhbmQgdGVzdCB0byBzZWUgaWYgaXQgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGEKICAgIGRpY3Rpb25hcnkuIElmIGl0IGNhbiBiZSwgcmV0dXJuIGEgbGlzdCBvZiB0dXBsZXMsIGUuZy4sCgogICAgOjoKCiAgICAgICAgPj4+IHRvX2tleV92YWxfbGlzdChbKCdrZXknLCAndmFsJyldKQogICAgICAgIFsoJ2tleScsICd2YWwnKV0KICAgICAgICA+Pj4gdG9fa2V5X3ZhbF9saXN0KHsna2V5JzogJ3ZhbCd9KQogICAgICAgIFsoJ2tleScsICd2YWwnKV0KICAgICAgICA+Pj4gdG9fa2V5X3ZhbF9saXN0KCdzdHJpbmcnKQogICAgICAgIFZhbHVlRXJyb3I6IGNhbm5vdCBlbmNvZGUgb2JqZWN0cyB0aGF0IGFyZSBub3QgMi10dXBsZXMuCgogICAgOnJ0eXBlOiBsaXN0CiAgICAiIiIKICAgIGlmIHZhbHVlIGlzIE5vbmU6CiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCAoc3RyLCBieXRlcywgYm9vbCwgaW50KSk6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignY2Fubm90IGVuY29kZSBvYmplY3RzIHRoYXQgYXJlIG5vdCAyLXR1cGxlcycpCgogICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgY29sbGVjdGlvbnMuTWFwcGluZyk6CiAgICAgICAgdmFsdWUgPSB2YWx1ZS5pdGVtcygpCgogICAgcmV0dXJuIGxpc3QodmFsdWUpCgoKIyBGcm9tIG1pdHN1aGlrby93ZXJremV1ZyAodXNlZCB3aXRoIHBlcm1pc3Npb24pLgpkZWYgcGFyc2VfbGlzdF9oZWFkZXIodmFsdWUpOgogICAgIiIiUGFyc2UgbGlzdHMgYXMgZGVzY3JpYmVkIGJ5IFJGQyAyMDY4IFNlY3Rpb24gMi4KCiAgICBJbiBwYXJ0aWN1bGFyLCBwYXJzZSBjb21tYS1zZXBhcmF0ZWQgbGlzdHMgd2hlcmUgdGhlIGVsZW1lbnRzIG9mCiAgICB0aGUgbGlzdCBtYXkgaW5jbHVkZSBxdW90ZWQtc3RyaW5ncy4gIEEgcXVvdGVkLXN0cmluZyBjb3VsZAogICAgY29udGFpbiBhIGNvbW1hLiAgQSBub24tcXVvdGVkIHN0cmluZyBjb3VsZCBoYXZlIHF1b3RlcyBpbiB0aGUKICAgIG1pZGRsZS4gIFF1b3RlcyBhcmUgcmVtb3ZlZCBhdXRvbWF0aWNhbGx5IGFmdGVyIHBhcnNpbmcuCgogICAgSXQgYmFzaWNhbGx5IHdvcmtzIGxpa2UgOmZ1bmM6YHBhcnNlX3NldF9oZWFkZXJgIGp1c3QgdGhhdCBpdGVtcwogICAgbWF5IGFwcGVhciBtdWx0aXBsZSB0aW1lcyBhbmQgY2FzZSBzZW5zaXRpdml0eSBpcyBwcmVzZXJ2ZWQuCgogICAgVGhlIHJldHVybiB2YWx1ZSBpcyBhIHN0YW5kYXJkIDpjbGFzczpgbGlzdGA6CgogICAgPj4+IHBhcnNlX2xpc3RfaGVhZGVyKCd0b2tlbiwgInF1b3RlZCB2YWx1ZSInKQogICAgWyd0b2tlbicsICdxdW90ZWQgdmFsdWUnXQoKICAgIFRvIGNyZWF0ZSBhIGhlYWRlciBmcm9tIHRoZSA6Y2xhc3M6YGxpc3RgIGFnYWluLCB1c2UgdGhlCiAgICA6ZnVuYzpgZHVtcF9oZWFkZXJgIGZ1bmN0aW9uLgoKICAgIDpwYXJhbSB2YWx1ZTogYSBzdHJpbmcgd2l0aCBhIGxpc3QgaGVhZGVyLgogICAgOnJldHVybjogOmNsYXNzOmBsaXN0YAogICAgOnJ0eXBlOiBsaXN0CiAgICAiIiIKICAgIHJlc3VsdCA9IFtdCiAgICBmb3IgaXRlbSBpbiBfcGFyc2VfbGlzdF9oZWFkZXIodmFsdWUpOgogICAgICAgIGlmIGl0ZW1bOjFdID09IGl0ZW1bLTE6XSA9PSAnIic6CiAgICAgICAgICAgIGl0ZW0gPSB1bnF1b3RlX2hlYWRlcl92YWx1ZShpdGVtWzE6LTFdKQogICAgICAgIHJlc3VsdC5hcHBlbmQoaXRlbSkKICAgIHJldHVybiByZXN1bHQKCgojIEZyb20gbWl0c3VoaWtvL3dlcmt6ZXVnICh1c2VkIHdpdGggcGVybWlzc2lvbikuCmRlZiBwYXJzZV9kaWN0X2hlYWRlcih2YWx1ZSk6CiAgICAiIiJQYXJzZSBsaXN0cyBvZiBrZXksIHZhbHVlIHBhaXJzIGFzIGRlc2NyaWJlZCBieSBSRkMgMjA2OCBTZWN0aW9uIDIgYW5kCiAgICBjb252ZXJ0IHRoZW0gaW50byBhIHB5dGhvbiBkaWN0OgoKICAgID4+PiBkID0gcGFyc2VfZGljdF9oZWFkZXIoJ2Zvbz0iaXMgYSBmaXNoIiwgYmFyPSJhcyB3ZWxsIicpCiAgICA+Pj4gdHlwZShkKSBpcyBkaWN0CiAgICBUcnVlCiAgICA+Pj4gc29ydGVkKGQuaXRlbXMoKSkKICAgIFsoJ2JhcicsICdhcyB3ZWxsJyksICgnZm9vJywgJ2lzIGEgZmlzaCcpXQoKICAgIElmIHRoZXJlIGlzIG5vIHZhbHVlIGZvciBhIGtleSBpdCB3aWxsIGJlIGBOb25lYDoKCiAgICA+Pj4gcGFyc2VfZGljdF9oZWFkZXIoJ2tleV93aXRob3V0X3ZhbHVlJykKICAgIHsna2V5X3dpdGhvdXRfdmFsdWUnOiBOb25lfQoKICAgIFRvIGNyZWF0ZSBhIGhlYWRlciBmcm9tIHRoZSA6Y2xhc3M6YGRpY3RgIGFnYWluLCB1c2UgdGhlCiAgICA6ZnVuYzpgZHVtcF9oZWFkZXJgIGZ1bmN0aW9uLgoKICAgIDpwYXJhbSB2YWx1ZTogYSBzdHJpbmcgd2l0aCBhIGRpY3QgaGVhZGVyLgogICAgOnJldHVybjogOmNsYXNzOmBkaWN0YAogICAgOnJ0eXBlOiBkaWN0CiAgICAiIiIKICAgIHJlc3VsdCA9IHt9CiAgICBmb3IgaXRlbSBpbiBfcGFyc2VfbGlzdF9oZWFkZXIodmFsdWUpOgogICAgICAgIGlmICc9JyBub3QgaW4gaXRlbToKICAgICAgICAgICAgcmVzdWx0W2l0ZW1dID0gTm9uZQogICAgICAgICAgICBjb250aW51ZQogICAgICAgIG5hbWUsIHZhbHVlID0gaXRlbS5zcGxpdCgnPScsIDEpCiAgICAgICAgaWYgdmFsdWVbOjFdID09IHZhbHVlWy0xOl0gPT0gJyInOgogICAgICAgICAgICB2YWx1ZSA9IHVucXVvdGVfaGVhZGVyX3ZhbHVlKHZhbHVlWzE6LTFdKQogICAgICAgIHJlc3VsdFtuYW1lXSA9IHZhbHVlCiAgICByZXR1cm4gcmVzdWx0CgoKIyBGcm9tIG1pdHN1aGlrby93ZXJremV1ZyAodXNlZCB3aXRoIHBlcm1pc3Npb24pLgpkZWYgdW5xdW90ZV9oZWFkZXJfdmFsdWUodmFsdWUsIGlzX2ZpbGVuYW1lPUZhbHNlKToKICAgIHIiIiJVbnF1b3RlcyBhIGhlYWRlciB2YWx1ZS4gIChSZXZlcnNhbCBvZiA6ZnVuYzpgcXVvdGVfaGVhZGVyX3ZhbHVlYCkuCiAgICBUaGlzIGRvZXMgbm90IHVzZSB0aGUgcmVhbCB1bnF1b3RpbmcgYnV0IHdoYXQgYnJvd3NlcnMgYXJlIGFjdHVhbGx5CiAgICB1c2luZyBmb3IgcXVvdGluZy4KCiAgICA6cGFyYW0gdmFsdWU6IHRoZSBoZWFkZXIgdmFsdWUgdG8gdW5xdW90ZS4KICAgIDpydHlwZTogc3RyCiAgICAiIiIKICAgIGlmIHZhbHVlIGFuZCB2YWx1ZVswXSA9PSB2YWx1ZVstMV0gPT0gJyInOgogICAgICAgICMgdGhpcyBpcyBub3QgdGhlIHJlYWwgdW5xdW90aW5nLCBidXQgZml4aW5nIHRoaXMgc28gdGhhdCB0aGUKICAgICAgICAjIFJGQyBpcyBtZXQgd2lsbCByZXN1bHQgaW4gYnVncyB3aXRoIGludGVybmV0IGV4cGxvcmVyIGFuZAogICAgICAgICMgcHJvYmFibHkgc29tZSBvdGhlciBicm93c2VycyBhcyB3ZWxsLiAgSUUgZm9yIGV4YW1wbGUgaXMKICAgICAgICAjIHVwbG9hZGluZyBmaWxlcyB3aXRoICJDOlxmb29cYmFyLnR4dCIgYXMgZmlsZW5hbWUKICAgICAgICB2YWx1ZSA9IHZhbHVlWzE6LTFdCgogICAgICAgICMgaWYgdGhpcyBpcyBhIGZpbGVuYW1lIGFuZCB0aGUgc3RhcnRpbmcgY2hhcmFjdGVycyBsb29rIGxpa2UKICAgICAgICAjIGEgVU5DIHBhdGgsIHRoZW4ganVzdCByZXR1cm4gdGhlIHZhbHVlIHdpdGhvdXQgcXVvdGVzLiAgVXNpbmcgdGhlCiAgICAgICAgIyByZXBsYWNlIHNlcXVlbmNlIGJlbG93IG9uIGEgVU5DIHBhdGggaGFzIHRoZSBlZmZlY3Qgb2YgdHVybmluZwogICAgICAgICMgdGhlIGxlYWRpbmcgZG91YmxlIHNsYXNoIGludG8gYSBzaW5nbGUgc2xhc2ggYW5kIHRoZW4KICAgICAgICAjIF9maXhfaWVfZmlsZW5hbWUoKSBkb2Vzbid0IHdvcmsgY29ycmVjdGx5LiAgU2VlICM0NTguCiAgICAgICAgaWYgbm90IGlzX2ZpbGVuYW1lIG9yIHZhbHVlWzoyXSAhPSAnXFxcXCc6CiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKCdcXFxcJywgJ1xcJykucmVwbGFjZSgnXFwiJywgJyInKQogICAgcmV0dXJuIHZhbHVlCgoKZGVmIGRpY3RfZnJvbV9jb29raWVqYXIoY2opOgogICAgIiIiUmV0dXJucyBhIGtleS92YWx1ZSBkaWN0aW9uYXJ5IGZyb20gYSBDb29raWVKYXIuCgogICAgOnBhcmFtIGNqOiBDb29raWVKYXIgb2JqZWN0IHRvIGV4dHJhY3QgY29va2llcyBmcm9tLgogICAgOnJ0eXBlOiBkaWN0CiAgICAiIiIKCiAgICBjb29raWVfZGljdCA9IHt9CgogICAgZm9yIGNvb2tpZSBpbiBjajoKICAgICAgICBjb29raWVfZGljdFtjb29raWUubmFtZV0gPSBjb29raWUudmFsdWUKCiAgICByZXR1cm4gY29va2llX2RpY3QKCgpkZWYgYWRkX2RpY3RfdG9fY29va2llamFyKGNqLCBjb29raWVfZGljdCk6CiAgICAiIiJSZXR1cm5zIGEgQ29va2llSmFyIGZyb20gYSBrZXkvdmFsdWUgZGljdGlvbmFyeS4KCiAgICA6cGFyYW0gY2o6IENvb2tpZUphciB0byBpbnNlcnQgY29va2llcyBpbnRvLgogICAgOnBhcmFtIGNvb2tpZV9kaWN0OiBEaWN0IG9mIGtleS92YWx1ZXMgdG8gaW5zZXJ0IGludG8gQ29va2llSmFyLgogICAgOnJ0eXBlOiBDb29raWVKYXIKICAgICIiIgoKICAgIHJldHVybiBjb29raWVqYXJfZnJvbV9kaWN0KGNvb2tpZV9kaWN0LCBjaikKCgpkZWYgZ2V0X2VuY29kaW5nc19mcm9tX2NvbnRlbnQoY29udGVudCk6CiAgICAiIiJSZXR1cm5zIGVuY29kaW5ncyBmcm9tIGdpdmVuIGNvbnRlbnQgc3RyaW5nLgoKICAgIDpwYXJhbSBjb250ZW50OiBieXRlc3RyaW5nIHRvIGV4dHJhY3QgZW5jb2RpbmdzIGZyb20uCiAgICAiIiIKICAgIHdhcm5pbmdzLndhcm4oKAogICAgICAgICdJbiByZXF1ZXN0cyAzLjAsIGdldF9lbmNvZGluZ3NfZnJvbV9jb250ZW50IHdpbGwgYmUgcmVtb3ZlZC4gRm9yICcKICAgICAgICAnbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHNlZSB0aGUgZGlzY3Vzc2lvbiBvbiBpc3N1ZSAjMjI2Ni4gKFRoaXMnCiAgICAgICAgJyB3YXJuaW5nIHNob3VsZCBvbmx5IGFwcGVhciBvbmNlLiknKSwKICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpCgogICAgY2hhcnNldF9yZSA9IHJlLmNvbXBpbGUocic8bWV0YS4qP2NoYXJzZXQ9WyJcJ10qKC4rPylbIlwnPl0nLCBmbGFncz1yZS5JKQogICAgcHJhZ21hX3JlID0gcmUuY29tcGlsZShyJzxtZXRhLio/Y29udGVudD1bIlwnXSo7P2NoYXJzZXQ9KC4rPylbIlwnPl0nLCBmbGFncz1yZS5JKQogICAgeG1sX3JlID0gcmUuY29tcGlsZShyJ148XD94bWwuKj9lbmNvZGluZz1bIlwnXSooLis/KVsiXCc+XScpCgogICAgcmV0dXJuIChjaGFyc2V0X3JlLmZpbmRhbGwoY29udGVudCkgKwogICAgICAgICAgICBwcmFnbWFfcmUuZmluZGFsbChjb250ZW50KSArCiAgICAgICAgICAgIHhtbF9yZS5maW5kYWxsKGNvbnRlbnQpKQoKCmRlZiBnZXRfZW5jb2RpbmdfZnJvbV9oZWFkZXJzKGhlYWRlcnMpOgogICAgIiIiUmV0dXJucyBlbmNvZGluZ3MgZnJvbSBnaXZlbiBIVFRQIEhlYWRlciBEaWN0LgoKICAgIDpwYXJhbSBoZWFkZXJzOiBkaWN0aW9uYXJ5IHRvIGV4dHJhY3QgZW5jb2RpbmcgZnJvbS4KICAgIDpydHlwZTogc3RyCiAgICAiIiIKCiAgICBjb250ZW50X3R5cGUgPSBoZWFkZXJzLmdldCgnY29udGVudC10eXBlJykKCiAgICBpZiBub3QgY29udGVudF90eXBlOgogICAgICAgIHJldHVybiBOb25lCgogICAgY29udGVudF90eXBlLCBwYXJhbXMgPSBjZ2kucGFyc2VfaGVhZGVyKGNvbnRlbnRfdHlwZSkKCiAgICBpZiAnY2hhcnNldCcgaW4gcGFyYW1zOgogICAgICAgIHJldHVybiBwYXJhbXNbJ2NoYXJzZXQnXS5zdHJpcCgiJ1wiIikKCiAgICBpZiAndGV4dCcgaW4gY29udGVudF90eXBlOgogICAgICAgIHJldHVybiAnSVNPLTg4NTktMScKCgpkZWYgc3RyZWFtX2RlY29kZV9yZXNwb25zZV91bmljb2RlKGl0ZXJhdG9yLCByKToKICAgICIiIlN0cmVhbSBkZWNvZGVzIGEgaXRlcmF0b3IuIiIiCgogICAgaWYgci5lbmNvZGluZyBpcyBOb25lOgogICAgICAgIGZvciBpdGVtIGluIGl0ZXJhdG9yOgogICAgICAgICAgICB5aWVsZCBpdGVtCiAgICAgICAgcmV0dXJuCgogICAgZGVjb2RlciA9IGNvZGVjcy5nZXRpbmNyZW1lbnRhbGRlY29kZXIoci5lbmNvZGluZykoZXJyb3JzPSdyZXBsYWNlJykKICAgIGZvciBjaHVuayBpbiBpdGVyYXRvcjoKICAgICAgICBydiA9IGRlY29kZXIuZGVjb2RlKGNodW5rKQogICAgICAgIGlmIHJ2OgogICAgICAgICAgICB5aWVsZCBydgogICAgcnYgPSBkZWNvZGVyLmRlY29kZShiJycsIGZpbmFsPVRydWUpCiAgICBpZiBydjoKICAgICAgICB5aWVsZCBydgoKCmRlZiBpdGVyX3NsaWNlcyhzdHJpbmcsIHNsaWNlX2xlbmd0aCk6CiAgICAiIiJJdGVyYXRlIG92ZXIgc2xpY2VzIG9mIGEgc3RyaW5nLiIiIgogICAgcG9zID0gMAogICAgaWYgc2xpY2VfbGVuZ3RoIGlzIE5vbmUgb3Igc2xpY2VfbGVuZ3RoIDw9IDA6CiAgICAgICAgc2xpY2VfbGVuZ3RoID0gbGVuKHN0cmluZykKICAgIHdoaWxlIHBvcyA8IGxlbihzdHJpbmcpOgogICAgICAgIHlpZWxkIHN0cmluZ1twb3M6cG9zICsgc2xpY2VfbGVuZ3RoXQogICAgICAgIHBvcyArPSBzbGljZV9sZW5ndGgKCgpkZWYgZ2V0X3VuaWNvZGVfZnJvbV9yZXNwb25zZShyKToKICAgICIiIlJldHVybnMgdGhlIHJlcXVlc3RlZCBjb250ZW50IGJhY2sgaW4gdW5pY29kZS4KCiAgICA6cGFyYW0gcjogUmVzcG9uc2Ugb2JqZWN0IHRvIGdldCB1bmljb2RlIGNvbnRlbnQgZnJvbS4KCiAgICBUcmllZDoKCiAgICAxLiBjaGFyc2V0IGZyb20gY29udGVudC10eXBlCiAgICAyLiBmYWxsIGJhY2sgYW5kIHJlcGxhY2UgYWxsIHVuaWNvZGUgY2hhcmFjdGVycwoKICAgIDpydHlwZTogc3RyCiAgICAiIiIKICAgIHdhcm5pbmdzLndhcm4oKAogICAgICAgICdJbiByZXF1ZXN0cyAzLjAsIGdldF91bmljb2RlX2Zyb21fcmVzcG9uc2Ugd2lsbCBiZSByZW1vdmVkLiBGb3IgJwogICAgICAgICdtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2Ugc2VlIHRoZSBkaXNjdXNzaW9uIG9uIGlzc3VlICMyMjY2LiAoVGhpcycKICAgICAgICAnIHdhcm5pbmcgc2hvdWxkIG9ubHkgYXBwZWFyIG9uY2UuKScpLAogICAgICAgIERlcHJlY2F0aW9uV2FybmluZykKCiAgICB0cmllZF9lbmNvZGluZ3MgPSBbXQoKICAgICMgVHJ5IGNoYXJzZXQgZnJvbSBjb250ZW50LXR5cGUKICAgIGVuY29kaW5nID0gZ2V0X2VuY29kaW5nX2Zyb21faGVhZGVycyhyLmhlYWRlcnMpCgogICAgaWYgZW5jb2Rpbmc6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc3RyKHIuY29udGVudCwgZW5jb2RpbmcpCiAgICAgICAgZXhjZXB0IFVuaWNvZGVFcnJvcjoKICAgICAgICAgICAgdHJpZWRfZW5jb2RpbmdzLmFwcGVuZChlbmNvZGluZykKCiAgICAjIEZhbGwgYmFjazoKICAgIHRyeToKICAgICAgICByZXR1cm4gc3RyKHIuY29udGVudCwgZW5jb2RpbmcsIGVycm9ycz0ncmVwbGFjZScpCiAgICBleGNlcHQgVHlwZUVycm9yOgogICAgICAgIHJldHVybiByLmNvbnRlbnQKCgojIFRoZSB1bnJlc2VydmVkIFVSSSBjaGFyYWN0ZXJzIChSRkMgMzk4NikKVU5SRVNFUlZFRF9TRVQgPSBmcm96ZW5zZXQoCiAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIgKyAiMDEyMzQ1Njc4OS0uX34iKQoKCmRlZiB1bnF1b3RlX3VucmVzZXJ2ZWQodXJpKToKICAgICIiIlVuLWVzY2FwZSBhbnkgcGVyY2VudC1lc2NhcGUgc2VxdWVuY2VzIGluIGEgVVJJIHRoYXQgYXJlIHVucmVzZXJ2ZWQKICAgIGNoYXJhY3RlcnMuIFRoaXMgbGVhdmVzIGFsbCByZXNlcnZlZCwgaWxsZWdhbCBhbmQgbm9uLUFTQ0lJIGJ5dGVzIGVuY29kZWQuCgogICAgOnJ0eXBlOiBzdHIKICAgICIiIgogICAgcGFydHMgPSB1cmkuc3BsaXQoJyUnKQogICAgZm9yIGkgaW4gcmFuZ2UoMSwgbGVuKHBhcnRzKSk6CiAgICAgICAgaCA9IHBhcnRzW2ldWzA6Ml0KICAgICAgICBpZiBsZW4oaCkgPT0gMiBhbmQgaC5pc2FsbnVtKCk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGMgPSBjaHIoaW50KGgsIDE2KSkKICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICByYWlzZSBJbnZhbGlkVVJMKCJJbnZhbGlkIHBlcmNlbnQtZXNjYXBlIHNlcXVlbmNlOiAnJXMnIiAlIGgpCgogICAgICAgICAgICBpZiBjIGluIFVOUkVTRVJWRURfU0VUOgogICAgICAgICAgICAgICAgcGFydHNbaV0gPSBjICsgcGFydHNbaV1bMjpdCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBwYXJ0c1tpXSA9ICclJyArIHBhcnRzW2ldCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcGFydHNbaV0gPSAnJScgKyBwYXJ0c1tpXQogICAgcmV0dXJuICcnLmpvaW4ocGFydHMpCgoKZGVmIHJlcXVvdGVfdXJpKHVyaSk6CiAgICAiIiJSZS1xdW90ZSB0aGUgZ2l2ZW4gVVJJLgoKICAgIFRoaXMgZnVuY3Rpb24gcGFzc2VzIHRoZSBnaXZlbiBVUkkgdGhyb3VnaCBhbiB1bnF1b3RlL3F1b3RlIGN5Y2xlIHRvCiAgICBlbnN1cmUgdGhhdCBpdCBpcyBmdWxseSBhbmQgY29uc2lzdGVudGx5IHF1b3RlZC4KCiAgICA6cnR5cGU6IHN0cgogICAgIiIiCiAgICBzYWZlX3dpdGhfcGVyY2VudCA9ICIhIyQlJicoKSorLC86Oz0/QFtdfiIKICAgIHNhZmVfd2l0aG91dF9wZXJjZW50ID0gIiEjJCYnKCkqKywvOjs9P0BbXX4iCiAgICB0cnk6CiAgICAgICAgIyBVbnF1b3RlIG9ubHkgdGhlIHVucmVzZXJ2ZWQgY2hhcmFjdGVycwogICAgICAgICMgVGhlbiBxdW90ZSBvbmx5IGlsbGVnYWwgY2hhcmFjdGVycyAoZG8gbm90IHF1b3RlIHJlc2VydmVkLAogICAgICAgICMgdW5yZXNlcnZlZCwgb3IgJyUnKQogICAgICAgIHJldHVybiBxdW90ZSh1bnF1b3RlX3VucmVzZXJ2ZWQodXJpKSwgc2FmZT1zYWZlX3dpdGhfcGVyY2VudCkKICAgIGV4Y2VwdCBJbnZhbGlkVVJMOgogICAgICAgICMgV2UgY291bGRuJ3QgdW5xdW90ZSB0aGUgZ2l2ZW4gVVJJLCBzbyBsZXQncyB0cnkgcXVvdGluZyBpdCwgYnV0CiAgICAgICAgIyB0aGVyZSBtYXkgYmUgdW5xdW90ZWQgJyUncyBpbiB0aGUgVVJJLiBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGV5J3JlCiAgICAgICAgIyBwcm9wZXJseSBxdW90ZWQgc28gdGhleSBkbyBub3QgY2F1c2UgaXNzdWVzIGVsc2V3aGVyZS4KICAgICAgICByZXR1cm4gcXVvdGUodXJpLCBzYWZlPXNhZmVfd2l0aG91dF9wZXJjZW50KQoKCmRlZiBhZGRyZXNzX2luX25ldHdvcmsoaXAsIG5ldCk6CiAgICAiIiJUaGlzIGZ1bmN0aW9uIGFsbG93cyB5b3UgdG8gY2hlY2sgaWYgYW4gSVAgYmVsb25ncyB0byBhIG5ldHdvcmsgc3VibmV0CgogICAgRXhhbXBsZTogcmV0dXJucyBUcnVlIGlmIGlwID0gMTkyLjE2OC4xLjEgYW5kIG5ldCA9IDE5Mi4xNjguMS4wLzI0CiAgICAgICAgICAgICByZXR1cm5zIEZhbHNlIGlmIGlwID0gMTkyLjE2OC4xLjEgYW5kIG5ldCA9IDE5Mi4xNjguMTAwLjAvMjQKCiAgICA6cnR5cGU6IGJvb2wKICAgICIiIgogICAgaXBhZGRyID0gc3RydWN0LnVucGFjaygnPUwnLCBzb2NrZXQuaW5ldF9hdG9uKGlwKSlbMF0KICAgIG5ldGFkZHIsIGJpdHMgPSBuZXQuc3BsaXQoJy8nKQogICAgbmV0bWFzayA9IHN0cnVjdC51bnBhY2soJz1MJywgc29ja2V0LmluZXRfYXRvbihkb3R0ZWRfbmV0bWFzayhpbnQoYml0cykpKSlbMF0KICAgIG5ldHdvcmsgPSBzdHJ1Y3QudW5wYWNrKCc9TCcsIHNvY2tldC5pbmV0X2F0b24obmV0YWRkcikpWzBdICYgbmV0bWFzawogICAgcmV0dXJuIChpcGFkZHIgJiBuZXRtYXNrKSA9PSAobmV0d29yayAmIG5ldG1hc2spCgoKZGVmIGRvdHRlZF9uZXRtYXNrKG1hc2spOgogICAgIiIiQ29udmVydHMgbWFzayBmcm9tIC94eCBmb3JtYXQgdG8geHh4Lnh4eC54eHgueHh4CgogICAgRXhhbXBsZTogaWYgbWFzayBpcyAyNCBmdW5jdGlvbiByZXR1cm5zIDI1NS4yNTUuMjU1LjAKCiAgICA6cnR5cGU6IHN0cgogICAgIiIiCiAgICBiaXRzID0gMHhmZmZmZmZmZiBeICgxIDw8IDMyIC0gbWFzaykgLSAxCiAgICByZXR1cm4gc29ja2V0LmluZXRfbnRvYShzdHJ1Y3QucGFjaygnPkknLCBiaXRzKSkKCgpkZWYgaXNfaXB2NF9hZGRyZXNzKHN0cmluZ19pcCk6CiAgICAiIiIKICAgIDpydHlwZTogYm9vbAogICAgIiIiCiAgICB0cnk6CiAgICAgICAgc29ja2V0LmluZXRfYXRvbihzdHJpbmdfaXApCiAgICBleGNlcHQgc29ja2V0LmVycm9yOgogICAgICAgIHJldHVybiBGYWxzZQogICAgcmV0dXJuIFRydWUKCgpkZWYgaXNfdmFsaWRfY2lkcihzdHJpbmdfbmV0d29yayk6CiAgICAiIiIKICAgIFZlcnkgc2ltcGxlIGNoZWNrIG9mIHRoZSBjaWRyIGZvcm1hdCBpbiBub19wcm94eSB2YXJpYWJsZS4KCiAgICA6cnR5cGU6IGJvb2wKICAgICIiIgogICAgaWYgc3RyaW5nX25ldHdvcmsuY291bnQoJy8nKSA9PSAxOgogICAgICAgIHRyeToKICAgICAgICAgICAgbWFzayA9IGludChzdHJpbmdfbmV0d29yay5zcGxpdCgnLycpWzFdKQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgaWYgbWFzayA8IDEgb3IgbWFzayA+IDMyOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzb2NrZXQuaW5ldF9hdG9uKHN0cmluZ19uZXR3b3JrLnNwbGl0KCcvJylbMF0pCiAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICBlbHNlOgogICAgICAgIHJldHVybiBGYWxzZQogICAgcmV0dXJuIFRydWUKCgpAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgpkZWYgc2V0X2Vudmlyb24oZW52X25hbWUsIHZhbHVlKToKICAgICIiIlNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgJ2Vudl9uYW1lJyB0byAndmFsdWUnCgogICAgU2F2ZSBwcmV2aW91cyB2YWx1ZSwgeWllbGQsIGFuZCB0aGVuIHJlc3RvcmUgdGhlIHByZXZpb3VzIHZhbHVlIHN0b3JlZCBpbgogICAgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlICdlbnZfbmFtZScuCgogICAgSWYgJ3ZhbHVlJyBpcyBOb25lLCBkbyBub3RoaW5nIiIiCiAgICB2YWx1ZV9jaGFuZ2VkID0gdmFsdWUgaXMgbm90IE5vbmUKICAgIGlmIHZhbHVlX2NoYW5nZWQ6CiAgICAgICAgb2xkX3ZhbHVlID0gb3MuZW52aXJvbi5nZXQoZW52X25hbWUpCiAgICAgICAgb3MuZW52aXJvbltlbnZfbmFtZV0gPSB2YWx1ZQogICAgdHJ5OgogICAgICAgIHlpZWxkCiAgICBmaW5hbGx5OgogICAgICAgIGlmIHZhbHVlX2NoYW5nZWQ6CiAgICAgICAgICAgIGlmIG9sZF92YWx1ZSBpcyBOb25lOgogICAgICAgICAgICAgICAgZGVsIG9zLmVudmlyb25bZW52X25hbWVdCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBvcy5lbnZpcm9uW2Vudl9uYW1lXSA9IG9sZF92YWx1ZQoKCmRlZiBzaG91bGRfYnlwYXNzX3Byb3hpZXModXJsLCBub19wcm94eSk6CiAgICAiIiIKICAgIFJldHVybnMgd2hldGhlciB3ZSBzaG91bGQgYnlwYXNzIHByb3hpZXMgb3Igbm90LgoKICAgIDpydHlwZTogYm9vbAogICAgIiIiCiAgICBnZXRfcHJveHkgPSBsYW1iZGEgazogb3MuZW52aXJvbi5nZXQoaykgb3Igb3MuZW52aXJvbi5nZXQoay51cHBlcigpKQoKICAgICMgRmlyc3QgY2hlY2sgd2hldGhlciBub19wcm94eSBpcyBkZWZpbmVkLiBJZiBpdCBpcywgY2hlY2sgdGhhdCB0aGUgVVJMCiAgICAjIHdlJ3JlIGdldHRpbmcgaXNuJ3QgaW4gdGhlIG5vX3Byb3h5IGxpc3QuCiAgICBub19wcm94eV9hcmcgPSBub19wcm94eQogICAgaWYgbm9fcHJveHkgaXMgTm9uZToKICAgICAgICBub19wcm94eSA9IGdldF9wcm94eSgnbm9fcHJveHknKQogICAgbmV0bG9jID0gdXJscGFyc2UodXJsKS5uZXRsb2MKCiAgICBpZiBub19wcm94eToKICAgICAgICAjIFdlIG5lZWQgdG8gY2hlY2sgd2hldGhlciB3ZSBtYXRjaCBoZXJlLiBXZSBuZWVkIHRvIHNlZSBpZiB3ZSBtYXRjaAogICAgICAgICMgdGhlIGVuZCBvZiB0aGUgbmV0bG9jLCBib3RoIHdpdGggYW5kIHdpdGhvdXQgdGhlIHBvcnQuCiAgICAgICAgbm9fcHJveHkgPSAoCiAgICAgICAgICAgIGhvc3QgZm9yIGhvc3QgaW4gbm9fcHJveHkucmVwbGFjZSgnICcsICcnKS5zcGxpdCgnLCcpIGlmIGhvc3QKICAgICAgICApCgogICAgICAgIGlwID0gbmV0bG9jLnNwbGl0KCc6JylbMF0KICAgICAgICBpZiBpc19pcHY0X2FkZHJlc3MoaXApOgogICAgICAgICAgICBmb3IgcHJveHlfaXAgaW4gbm9fcHJveHk6CiAgICAgICAgICAgICAgICBpZiBpc192YWxpZF9jaWRyKHByb3h5X2lwKToKICAgICAgICAgICAgICAgICAgICBpZiBhZGRyZXNzX2luX25ldHdvcmsoaXAsIHByb3h5X2lwKToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICAgICAgICAgIGVsaWYgaXAgPT0gcHJveHlfaXA6CiAgICAgICAgICAgICAgICAgICAgIyBJZiBub19wcm94eSBpcCB3YXMgZGVmaW5lZCBpbiBwbGFpbiBJUCBub3RhdGlvbiBpbnN0ZWFkIG9mIGNpZHIgbm90YXRpb24gJgogICAgICAgICAgICAgICAgICAgICMgbWF0Y2hlcyB0aGUgSVAgb2YgdGhlIGluZGV4CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBlbHNlOgogICAgICAgICAgICBmb3IgaG9zdCBpbiBub19wcm94eToKICAgICAgICAgICAgICAgIGlmIG5ldGxvYy5lbmRzd2l0aChob3N0KSBvciBuZXRsb2Muc3BsaXQoJzonKVswXS5lbmRzd2l0aChob3N0KToKICAgICAgICAgICAgICAgICAgICAjIFRoZSBVUkwgZG9lcyBtYXRjaCBzb21ldGhpbmcgaW4gbm9fcHJveHksIHNvIHdlIGRvbid0IHdhbnQKICAgICAgICAgICAgICAgICAgICAjIHRvIGFwcGx5IHRoZSBwcm94aWVzIG9uIHRoaXMgVVJMLgogICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgIyBJZiB0aGUgc3lzdGVtIHByb3h5IHNldHRpbmdzIGluZGljYXRlIHRoYXQgdGhpcyBVUkwgc2hvdWxkIGJlIGJ5cGFzc2VkLAogICAgIyBkb24ndCBwcm94eS4KICAgICMgVGhlIHByb3h5X2J5cGFzcyBmdW5jdGlvbiBpcyBpbmNyZWRpYmx5IGJ1Z2d5IG9uIE9TIFggaW4gZWFybHkgdmVyc2lvbnMKICAgICMgb2YgUHl0aG9uIDIuNiwgc28gYWxsb3cgdGhpcyBjYWxsIHRvIGZhaWwuIE9ubHkgY2F0Y2ggdGhlIHNwZWNpZmljCiAgICAjIGV4Y2VwdGlvbnMgd2UndmUgc2VlbiwgdGhvdWdoOiB0aGlzIGNhbGwgZmFpbGluZyBpbiBvdGhlciB3YXlzIGNhbiByZXZlYWwKICAgICMgbGVnaXRpbWF0ZSBwcm9ibGVtcy4KICAgIHdpdGggc2V0X2Vudmlyb24oJ25vX3Byb3h5Jywgbm9fcHJveHlfYXJnKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGJ5cGFzcyA9IHByb3h5X2J5cGFzcyhuZXRsb2MpCiAgICAgICAgZXhjZXB0IChUeXBlRXJyb3IsIHNvY2tldC5nYWllcnJvcik6CiAgICAgICAgICAgIGJ5cGFzcyA9IEZhbHNlCgogICAgaWYgYnlwYXNzOgogICAgICAgIHJldHVybiBUcnVlCgogICAgcmV0dXJuIEZhbHNlCgoKZGVmIGdldF9lbnZpcm9uX3Byb3hpZXModXJsLCBub19wcm94eT1Ob25lKToKICAgICIiIgogICAgUmV0dXJuIGEgZGljdCBvZiBlbnZpcm9ubWVudCBwcm94aWVzLgoKICAgIDpydHlwZTogZGljdAogICAgIiIiCiAgICBpZiBzaG91bGRfYnlwYXNzX3Byb3hpZXModXJsLCBub19wcm94eT1ub19wcm94eSk6CiAgICAgICAgcmV0dXJuIHt9CiAgICBlbHNlOgogICAgICAgIHJldHVybiBnZXRwcm94aWVzKCkKCgpkZWYgc2VsZWN0X3Byb3h5KHVybCwgcHJveGllcyk6CiAgICAiIiJTZWxlY3QgYSBwcm94eSBmb3IgdGhlIHVybCwgaWYgYXBwbGljYWJsZS4KCiAgICA6cGFyYW0gdXJsOiBUaGUgdXJsIGJlaW5nIGZvciB0aGUgcmVxdWVzdAogICAgOnBhcmFtIHByb3hpZXM6IEEgZGljdGlvbmFyeSBvZiBzY2hlbWVzIG9yIHNjaGVtZXMgYW5kIGhvc3RzIHRvIHByb3h5IFVSTHMKICAgICIiIgogICAgcHJveGllcyA9IHByb3hpZXMgb3Ige30KICAgIHVybHBhcnRzID0gdXJscGFyc2UodXJsKQogICAgaWYgdXJscGFydHMuaG9zdG5hbWUgaXMgTm9uZToKICAgICAgICByZXR1cm4gcHJveGllcy5nZXQodXJscGFydHMuc2NoZW1lLCBwcm94aWVzLmdldCgnYWxsJykpCgogICAgcHJveHlfa2V5cyA9IFsKICAgICAgICB1cmxwYXJ0cy5zY2hlbWUgKyAnOi8vJyArIHVybHBhcnRzLmhvc3RuYW1lLAogICAgICAgIHVybHBhcnRzLnNjaGVtZSwKICAgICAgICAnYWxsOi8vJyArIHVybHBhcnRzLmhvc3RuYW1lLAogICAgICAgICdhbGwnLAogICAgXQogICAgcHJveHkgPSBOb25lCiAgICBmb3IgcHJveHlfa2V5IGluIHByb3h5X2tleXM6CiAgICAgICAgaWYgcHJveHlfa2V5IGluIHByb3hpZXM6CiAgICAgICAgICAgIHByb3h5ID0gcHJveGllc1twcm94eV9rZXldCiAgICAgICAgICAgIGJyZWFrCgogICAgcmV0dXJuIHByb3h5CgoKZGVmIGRlZmF1bHRfdXNlcl9hZ2VudChuYW1lPSJweXRob24tcmVxdWVzdHMiKToKICAgICIiIgogICAgUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZGVmYXVsdCB1c2VyIGFnZW50LgoKICAgIDpydHlwZTogc3RyCiAgICAiIiIKICAgIHJldHVybiAnJXMvJXMnICUgKG5hbWUsIF9fdmVyc2lvbl9fKQoKCmRlZiBkZWZhdWx0X2hlYWRlcnMoKToKICAgICIiIgogICAgOnJ0eXBlOiByZXF1ZXN0cy5zdHJ1Y3R1cmVzLkNhc2VJbnNlbnNpdGl2ZURpY3QKICAgICIiIgogICAgcmV0dXJuIENhc2VJbnNlbnNpdGl2ZURpY3QoewogICAgICAgICdVc2VyLUFnZW50JzogZGVmYXVsdF91c2VyX2FnZW50KCksCiAgICAgICAgJ0FjY2VwdC1FbmNvZGluZyc6ICcsICcuam9pbigoJ2d6aXAnLCAnZGVmbGF0ZScpKSwKICAgICAgICAnQWNjZXB0JzogJyovKicsCiAgICAgICAgJ0Nvbm5lY3Rpb24nOiAna2VlcC1hbGl2ZScsCiAgICB9KQoKCmRlZiBwYXJzZV9oZWFkZXJfbGlua3ModmFsdWUpOgogICAgIiIiUmV0dXJuIGEgZGljdCBvZiBwYXJzZWQgbGluayBoZWFkZXJzIHByb3hpZXMuCgogICAgaS5lLiBMaW5rOiA8aHR0cDovLi4uL2Zyb250LmpwZWc+OyByZWw9ZnJvbnQ7IHR5cGU9ImltYWdlL2pwZWciLDxodHRwOi8vLi4uL2JhY2suanBlZz47IHJlbD1iYWNrO3R5cGU9ImltYWdlL2pwZWciCgogICAgOnJ0eXBlOiBsaXN0CiAgICAiIiIKCiAgICBsaW5rcyA9IFtdCgogICAgcmVwbGFjZV9jaGFycyA9ICcgXCciJwoKICAgIGZvciB2YWwgaW4gcmUuc3BsaXQoJywgKjwnLCB2YWx1ZSk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICB1cmwsIHBhcmFtcyA9IHZhbC5zcGxpdCgnOycsIDEpCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIHVybCwgcGFyYW1zID0gdmFsLCAnJwoKICAgICAgICBsaW5rID0geyd1cmwnOiB1cmwuc3RyaXAoJzw+IFwnIicpfQoKICAgICAgICBmb3IgcGFyYW0gaW4gcGFyYW1zLnNwbGl0KCc7Jyk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGtleSwgdmFsdWUgPSBwYXJhbS5zcGxpdCgnPScpCiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgICAgIGxpbmtba2V5LnN0cmlwKHJlcGxhY2VfY2hhcnMpXSA9IHZhbHVlLnN0cmlwKHJlcGxhY2VfY2hhcnMpCgogICAgICAgIGxpbmtzLmFwcGVuZChsaW5rKQoKICAgIHJldHVybiBsaW5rcwoKCiMgTnVsbCBieXRlczsgbm8gbmVlZCB0byByZWNyZWF0ZSB0aGVzZSBvbiBlYWNoIGNhbGwgdG8gZ3Vlc3NfanNvbl91dGYKX251bGwgPSAnXHgwMCcuZW5jb2RlKCdhc2NpaScpICAjIGVuY29kaW5nIHRvIEFTQ0lJIGZvciBQeXRob24gMwpfbnVsbDIgPSBfbnVsbCAqIDIKX251bGwzID0gX251bGwgKiAzCgoKZGVmIGd1ZXNzX2pzb25fdXRmKGRhdGEpOgogICAgIiIiCiAgICA6cnR5cGU6IHN0cgogICAgIiIiCiAgICAjIEpTT04gYWx3YXlzIHN0YXJ0cyB3aXRoIHR3byBBU0NJSSBjaGFyYWN0ZXJzLCBzbyBkZXRlY3Rpb24gaXMgYXMKICAgICMgZWFzeSBhcyBjb3VudGluZyB0aGUgbnVsbHMgYW5kIGZyb20gdGhlaXIgbG9jYXRpb24gYW5kIGNvdW50CiAgICAjIGRldGVybWluZSB0aGUgZW5jb2RpbmcuIEFsc28gZGV0ZWN0IGEgQk9NLCBpZiBwcmVzZW50LgogICAgc2FtcGxlID0gZGF0YVs6NF0KICAgIGlmIHNhbXBsZSBpbiAoY29kZWNzLkJPTV9VVEYzMl9MRSwgY29kZWNzLkJPTV9VVEYzMl9CRSk6CiAgICAgICAgcmV0dXJuICd1dGYtMzInICAgICAjIEJPTSBpbmNsdWRlZAogICAgaWYgc2FtcGxlWzozXSA9PSBjb2RlY3MuQk9NX1VURjg6CiAgICAgICAgcmV0dXJuICd1dGYtOC1zaWcnICAjIEJPTSBpbmNsdWRlZCwgTVMgc3R5bGUgKGRpc2NvdXJhZ2VkKQogICAgaWYgc2FtcGxlWzoyXSBpbiAoY29kZWNzLkJPTV9VVEYxNl9MRSwgY29kZWNzLkJPTV9VVEYxNl9CRSk6CiAgICAgICAgcmV0dXJuICd1dGYtMTYnICAgICAjIEJPTSBpbmNsdWRlZAogICAgbnVsbGNvdW50ID0gc2FtcGxlLmNvdW50KF9udWxsKQogICAgaWYgbnVsbGNvdW50ID09IDA6CiAgICAgICAgcmV0dXJuICd1dGYtOCcKICAgIGlmIG51bGxjb3VudCA9PSAyOgogICAgICAgIGlmIHNhbXBsZVs6OjJdID09IF9udWxsMjogICAjIDFzdCBhbmQgM3JkIGFyZSBudWxsCiAgICAgICAgICAgIHJldHVybiAndXRmLTE2LWJlJwogICAgICAgIGlmIHNhbXBsZVsxOjoyXSA9PSBfbnVsbDI6ICAjIDJuZCBhbmQgNHRoIGFyZSBudWxsCiAgICAgICAgICAgIHJldHVybiAndXRmLTE2LWxlJwogICAgICAgICMgRGlkIG5vdCBkZXRlY3QgMiB2YWxpZCBVVEYtMTYgYXNjaWktcmFuZ2UgY2hhcmFjdGVycwogICAgaWYgbnVsbGNvdW50ID09IDM6CiAgICAgICAgaWYgc2FtcGxlWzozXSA9PSBfbnVsbDM6CiAgICAgICAgICAgIHJldHVybiAndXRmLTMyLWJlJwogICAgICAgIGlmIHNhbXBsZVsxOl0gPT0gX251bGwzOgogICAgICAgICAgICByZXR1cm4gJ3V0Zi0zMi1sZScKICAgICAgICAjIERpZCBub3QgZGV0ZWN0IGEgdmFsaWQgVVRGLTMyIGFzY2lpLXJhbmdlIGNoYXJhY3RlcgogICAgcmV0dXJuIE5vbmUKCgpkZWYgcHJlcGVuZF9zY2hlbWVfaWZfbmVlZGVkKHVybCwgbmV3X3NjaGVtZSk6CiAgICAiIiJHaXZlbiBhIFVSTCB0aGF0IG1heSBvciBtYXkgbm90IGhhdmUgYSBzY2hlbWUsIHByZXBlbmQgdGhlIGdpdmVuIHNjaGVtZS4KICAgIERvZXMgbm90IHJlcGxhY2UgYSBwcmVzZW50IHNjaGVtZSB3aXRoIHRoZSBvbmUgcHJvdmlkZWQgYXMgYW4gYXJndW1lbnQuCgogICAgOnJ0eXBlOiBzdHIKICAgICIiIgogICAgc2NoZW1lLCBuZXRsb2MsIHBhdGgsIHBhcmFtcywgcXVlcnksIGZyYWdtZW50ID0gdXJscGFyc2UodXJsLCBuZXdfc2NoZW1lKQoKICAgICMgdXJscGFyc2UgaXMgYSBmaW5pY2t5IGJlYXN0LCBhbmQgc29tZXRpbWVzIGRlY2lkZXMgdGhhdCB0aGVyZSBpc24ndCBhCiAgICAjIG5ldGxvYyBwcmVzZW50LiBBc3N1bWUgdGhhdCBpdCdzIGJlaW5nIG92ZXItY2F1dGlvdXMsIGFuZCBzd2l0Y2ggbmV0bG9jCiAgICAjIGFuZCBwYXRoIGlmIHVybHBhcnNlIGRlY2lkZWQgdGhlcmUgd2FzIG5vIG5ldGxvYy4KICAgIGlmIG5vdCBuZXRsb2M6CiAgICAgICAgbmV0bG9jLCBwYXRoID0gcGF0aCwgbmV0bG9jCgogICAgcmV0dXJuIHVybHVucGFyc2UoKHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBwYXJhbXMsIHF1ZXJ5LCBmcmFnbWVudCkpCgoKZGVmIGdldF9hdXRoX2Zyb21fdXJsKHVybCk6CiAgICAiIiJHaXZlbiBhIHVybCB3aXRoIGF1dGhlbnRpY2F0aW9uIGNvbXBvbmVudHMsIGV4dHJhY3QgdGhlbSBpbnRvIGEgdHVwbGUgb2YKICAgIHVzZXJuYW1lLHBhc3N3b3JkLgoKICAgIDpydHlwZTogKHN0cixzdHIpCiAgICAiIiIKICAgIHBhcnNlZCA9IHVybHBhcnNlKHVybCkKCiAgICB0cnk6CiAgICAgICAgYXV0aCA9ICh1bnF1b3RlKHBhcnNlZC51c2VybmFtZSksIHVucXVvdGUocGFyc2VkLnBhc3N3b3JkKSkKICAgIGV4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIFR5cGVFcnJvcik6CiAgICAgICAgYXV0aCA9ICgnJywgJycpCgogICAgcmV0dXJuIGF1dGgKCgojIE1vdmVkIG91dHNpZGUgb2YgZnVuY3Rpb24gdG8gYXZvaWQgcmVjb21waWxlIGV2ZXJ5IGNhbGwKX0NMRUFOX0hFQURFUl9SRUdFWF9CWVRFID0gcmUuY29tcGlsZShiJ15cXFNbXlxcclxcbl0qJHxeJCcpCl9DTEVBTl9IRUFERVJfUkVHRVhfU1RSID0gcmUuY29tcGlsZShyJ15cU1teXHJcbl0qJHxeJCcpCgoKZGVmIGNoZWNrX2hlYWRlcl92YWxpZGl0eShoZWFkZXIpOgogICAgIiIiVmVyaWZpZXMgdGhhdCBoZWFkZXIgdmFsdWUgaXMgYSBzdHJpbmcgd2hpY2ggZG9lc24ndCBjb250YWluCiAgICBsZWFkaW5nIHdoaXRlc3BhY2Ugb3IgcmV0dXJuIGNoYXJhY3RlcnMuIFRoaXMgcHJldmVudHMgdW5pbnRlbmRlZAogICAgaGVhZGVyIGluamVjdGlvbi4KCiAgICA6cGFyYW0gaGVhZGVyOiB0dXBsZSwgaW4gdGhlIGZvcm1hdCAobmFtZSwgdmFsdWUpLgogICAgIiIiCiAgICBuYW1lLCB2YWx1ZSA9IGhlYWRlcgoKICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIGJ5dGVzKToKICAgICAgICBwYXQgPSBfQ0xFQU5fSEVBREVSX1JFR0VYX0JZVEUKICAgIGVsc2U6CiAgICAgICAgcGF0ID0gX0NMRUFOX0hFQURFUl9SRUdFWF9TVFIKICAgIHRyeToKICAgICAgICBpZiBub3QgcGF0Lm1hdGNoKHZhbHVlKToKICAgICAgICAgICAgcmFpc2UgSW52YWxpZEhlYWRlcigiSW52YWxpZCByZXR1cm4gY2hhcmFjdGVyIG9yIGxlYWRpbmcgc3BhY2UgaW4gaGVhZGVyOiAlcyIgJSBuYW1lKQogICAgZXhjZXB0IFR5cGVFcnJvcjoKICAgICAgICByYWlzZSBJbnZhbGlkSGVhZGVyKCJWYWx1ZSBmb3IgaGVhZGVyIHslczogJXN9IG11c3QgYmUgb2YgdHlwZSBzdHIgb3IgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGVzLCBub3QgJXMiICUgKG5hbWUsIHZhbHVlLCB0eXBlKHZhbHVlKSkpCgoKZGVmIHVybGRlZnJhZ2F1dGgodXJsKToKICAgICIiIgogICAgR2l2ZW4gYSB1cmwgcmVtb3ZlIHRoZSBmcmFnbWVudCBhbmQgdGhlIGF1dGhlbnRpY2F0aW9uIHBhcnQuCgogICAgOnJ0eXBlOiBzdHIKICAgICIiIgogICAgc2NoZW1lLCBuZXRsb2MsIHBhdGgsIHBhcmFtcywgcXVlcnksIGZyYWdtZW50ID0gdXJscGFyc2UodXJsKQoKICAgICMgc2VlIGZ1bmM6YHByZXBlbmRfc2NoZW1lX2lmX25lZWRlZGAKICAgIGlmIG5vdCBuZXRsb2M6CiAgICAgICAgbmV0bG9jLCBwYXRoID0gcGF0aCwgbmV0bG9jCgogICAgbmV0bG9jID0gbmV0bG9jLnJzcGxpdCgnQCcsIDEpWy0xXQoKICAgIHJldHVybiB1cmx1bnBhcnNlKChzY2hlbWUsIG5ldGxvYywgcGF0aCwgcGFyYW1zLCBxdWVyeSwgJycpKQoKCmRlZiByZXdpbmRfYm9keShwcmVwYXJlZF9yZXF1ZXN0KToKICAgICIiIk1vdmUgZmlsZSBwb2ludGVyIGJhY2sgdG8gaXRzIHJlY29yZGVkIHN0YXJ0aW5nIHBvc2l0aW9uCiAgICBzbyBpdCBjYW4gYmUgcmVhZCBhZ2FpbiBvbiByZWRpcmVjdC4KICAgICIiIgogICAgYm9keV9zZWVrID0gZ2V0YXR0cihwcmVwYXJlZF9yZXF1ZXN0LmJvZHksICdzZWVrJywgTm9uZSkKICAgIGlmIGJvZHlfc2VlayBpcyBub3QgTm9uZSBhbmQgaXNpbnN0YW5jZShwcmVwYXJlZF9yZXF1ZXN0Ll9ib2R5X3Bvc2l0aW9uLCBpbnRlZ2VyX3R5cGVzKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGJvZHlfc2VlayhwcmVwYXJlZF9yZXF1ZXN0Ll9ib2R5X3Bvc2l0aW9uKQogICAgICAgIGV4Y2VwdCAoSU9FcnJvciwgT1NFcnJvcik6CiAgICAgICAgICAgIHJhaXNlIFVucmV3aW5kYWJsZUJvZHlFcnJvcigiQW4gZXJyb3Igb2NjdXJyZWQgd2hlbiByZXdpbmRpbmcgcmVxdWVzdCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYm9keSBmb3IgcmVkaXJlY3QuIikKICAgIGVsc2U6CiAgICAgICAgcmFpc2UgVW5yZXdpbmRhYmxlQm9keUVycm9yKCJVbmFibGUgdG8gcmV3aW5kIHJlcXVlc3QgYm9keSBmb3IgcmVkaXJlY3QuIikKUEsDBBQAAAAAAAAAIQAhe7wK9CYAAPQmAAAnAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JldHJ5aW5nLnB5IyMgQ29weXJpZ2h0IDIwMTMtMjAxNCBSYXkgSG9sZGVyCiMjCiMjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwojIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiMjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAojIwojIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIyMKIyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQojIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAojIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAojIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCmltcG9ydCByYW5kb20KZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgc2l4CmltcG9ydCBzeXMKaW1wb3J0IHRpbWUKaW1wb3J0IHRyYWNlYmFjawoKCiMgc3lzLm1heGludCAvIDIsIHNpbmNlIFB5dGhvbiAzLjIgZG9lc24ndCBoYXZlIGEgc3lzLm1heGludC4uLgpNQVhfV0FJVCA9IDEwNzM3NDE4MjMKCgpkZWYgcmV0cnkoKmRhcmdzLCAqKmRrdyk6CiAgICAiIiIKICAgIERlY29yYXRvciBmdW5jdGlvbiB0aGF0IGluc3RhbnRpYXRlcyB0aGUgUmV0cnlpbmcgb2JqZWN0CiAgICBAcGFyYW0gKmRhcmdzOiBwb3NpdGlvbmFsIGFyZ3VtZW50cyBwYXNzZWQgdG8gUmV0cnlpbmcgb2JqZWN0CiAgICBAcGFyYW0gKipka3c6IGtleXdvcmQgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgUmV0cnlpbmcgb2JqZWN0CiAgICAiIiIKICAgICMgc3VwcG9ydCBib3RoIEByZXRyeSBhbmQgQHJldHJ5KCkgYXMgdmFsaWQgc3ludGF4CiAgICBpZiBsZW4oZGFyZ3MpID09IDEgYW5kIGNhbGxhYmxlKGRhcmdzWzBdKToKICAgICAgICBkZWYgd3JhcF9zaW1wbGUoZik6CgogICAgICAgICAgICBAc2l4LndyYXBzKGYpCiAgICAgICAgICAgIGRlZiB3cmFwcGVkX2YoKmFyZ3MsICoqa3cpOgogICAgICAgICAgICAgICAgcmV0dXJuIFJldHJ5aW5nKCkuY2FsbChmLCAqYXJncywgKiprdykKCiAgICAgICAgICAgIHJldHVybiB3cmFwcGVkX2YKCiAgICAgICAgcmV0dXJuIHdyYXBfc2ltcGxlKGRhcmdzWzBdKQoKICAgIGVsc2U6CiAgICAgICAgZGVmIHdyYXAoZik6CgogICAgICAgICAgICBAc2l4LndyYXBzKGYpCiAgICAgICAgICAgIGRlZiB3cmFwcGVkX2YoKmFyZ3MsICoqa3cpOgogICAgICAgICAgICAgICAgcmV0dXJuIFJldHJ5aW5nKCpkYXJncywgKipka3cpLmNhbGwoZiwgKmFyZ3MsICoqa3cpCgogICAgICAgICAgICByZXR1cm4gd3JhcHBlZF9mCgogICAgICAgIHJldHVybiB3cmFwCgoKY2xhc3MgUmV0cnlpbmcob2JqZWN0KToKCiAgICBkZWYgX19pbml0X18oc2VsZiwKICAgICAgICAgICAgICAgICBzdG9wPU5vbmUsIHdhaXQ9Tm9uZSwKICAgICAgICAgICAgICAgICBzdG9wX21heF9hdHRlbXB0X251bWJlcj1Ob25lLAogICAgICAgICAgICAgICAgIHN0b3BfbWF4X2RlbGF5PU5vbmUsCiAgICAgICAgICAgICAgICAgd2FpdF9maXhlZD1Ob25lLAogICAgICAgICAgICAgICAgIHdhaXRfcmFuZG9tX21pbj1Ob25lLCB3YWl0X3JhbmRvbV9tYXg9Tm9uZSwKICAgICAgICAgICAgICAgICB3YWl0X2luY3JlbWVudGluZ19zdGFydD1Ob25lLCB3YWl0X2luY3JlbWVudGluZ19pbmNyZW1lbnQ9Tm9uZSwKICAgICAgICAgICAgICAgICB3YWl0X2V4cG9uZW50aWFsX211bHRpcGxpZXI9Tm9uZSwgd2FpdF9leHBvbmVudGlhbF9tYXg9Tm9uZSwKICAgICAgICAgICAgICAgICByZXRyeV9vbl9leGNlcHRpb249Tm9uZSwKICAgICAgICAgICAgICAgICByZXRyeV9vbl9yZXN1bHQ9Tm9uZSwKICAgICAgICAgICAgICAgICB3cmFwX2V4Y2VwdGlvbj1GYWxzZSwKICAgICAgICAgICAgICAgICBzdG9wX2Z1bmM9Tm9uZSwKICAgICAgICAgICAgICAgICB3YWl0X2Z1bmM9Tm9uZSwKICAgICAgICAgICAgICAgICB3YWl0X2ppdHRlcl9tYXg9Tm9uZSk6CgogICAgICAgIHNlbGYuX3N0b3BfbWF4X2F0dGVtcHRfbnVtYmVyID0gNSBpZiBzdG9wX21heF9hdHRlbXB0X251bWJlciBpcyBOb25lIGVsc2Ugc3RvcF9tYXhfYXR0ZW1wdF9udW1iZXIKICAgICAgICBzZWxmLl9zdG9wX21heF9kZWxheSA9IDEwMCBpZiBzdG9wX21heF9kZWxheSBpcyBOb25lIGVsc2Ugc3RvcF9tYXhfZGVsYXkKICAgICAgICBzZWxmLl93YWl0X2ZpeGVkID0gMTAwMCBpZiB3YWl0X2ZpeGVkIGlzIE5vbmUgZWxzZSB3YWl0X2ZpeGVkCiAgICAgICAgc2VsZi5fd2FpdF9yYW5kb21fbWluID0gMCBpZiB3YWl0X3JhbmRvbV9taW4gaXMgTm9uZSBlbHNlIHdhaXRfcmFuZG9tX21pbgogICAgICAgIHNlbGYuX3dhaXRfcmFuZG9tX21heCA9IDEwMDAgaWYgd2FpdF9yYW5kb21fbWF4IGlzIE5vbmUgZWxzZSB3YWl0X3JhbmRvbV9tYXgKICAgICAgICBzZWxmLl93YWl0X2luY3JlbWVudGluZ19zdGFydCA9IDAgaWYgd2FpdF9pbmNyZW1lbnRpbmdfc3RhcnQgaXMgTm9uZSBlbHNlIHdhaXRfaW5jcmVtZW50aW5nX3N0YXJ0CiAgICAgICAgc2VsZi5fd2FpdF9pbmNyZW1lbnRpbmdfaW5jcmVtZW50ID0gMTAwIGlmIHdhaXRfaW5jcmVtZW50aW5nX2luY3JlbWVudCBpcyBOb25lIGVsc2Ugd2FpdF9pbmNyZW1lbnRpbmdfaW5jcmVtZW50CiAgICAgICAgc2VsZi5fd2FpdF9leHBvbmVudGlhbF9tdWx0aXBsaWVyID0gMSBpZiB3YWl0X2V4cG9uZW50aWFsX211bHRpcGxpZXIgaXMgTm9uZSBlbHNlIHdhaXRfZXhwb25lbnRpYWxfbXVsdGlwbGllcgogICAgICAgIHNlbGYuX3dhaXRfZXhwb25lbnRpYWxfbWF4ID0gTUFYX1dBSVQgaWYgd2FpdF9leHBvbmVudGlhbF9tYXggaXMgTm9uZSBlbHNlIHdhaXRfZXhwb25lbnRpYWxfbWF4CiAgICAgICAgc2VsZi5fd2FpdF9qaXR0ZXJfbWF4ID0gMCBpZiB3YWl0X2ppdHRlcl9tYXggaXMgTm9uZSBlbHNlIHdhaXRfaml0dGVyX21heAoKICAgICAgICAjIFRPRE8gYWRkIGNoYWluaW5nIG9mIHN0b3AgYmVoYXZpb3JzCiAgICAgICAgIyBzdG9wIGJlaGF2aW9yCiAgICAgICAgc3RvcF9mdW5jcyA9IFtdCiAgICAgICAgaWYgc3RvcF9tYXhfYXR0ZW1wdF9udW1iZXIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHN0b3BfZnVuY3MuYXBwZW5kKHNlbGYuc3RvcF9hZnRlcl9hdHRlbXB0KQoKICAgICAgICBpZiBzdG9wX21heF9kZWxheSBpcyBub3QgTm9uZToKICAgICAgICAgICAgc3RvcF9mdW5jcy5hcHBlbmQoc2VsZi5zdG9wX2FmdGVyX2RlbGF5KQoKICAgICAgICBpZiBzdG9wX2Z1bmMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYuc3RvcCA9IHN0b3BfZnVuYwoKICAgICAgICBlbGlmIHN0b3AgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5zdG9wID0gbGFtYmRhIGF0dGVtcHRzLCBkZWxheTogYW55KGYoYXR0ZW1wdHMsIGRlbGF5KSBmb3IgZiBpbiBzdG9wX2Z1bmNzKQoKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnN0b3AgPSBnZXRhdHRyKHNlbGYsIHN0b3ApCgogICAgICAgICMgVE9ETyBhZGQgY2hhaW5pbmcgb2Ygd2FpdCBiZWhhdmlvcnMKICAgICAgICAjIHdhaXQgYmVoYXZpb3IKICAgICAgICB3YWl0X2Z1bmNzID0gW2xhbWJkYSAqYXJncywgKiprd2FyZ3M6IDBdCiAgICAgICAgaWYgd2FpdF9maXhlZCBpcyBub3QgTm9uZToKICAgICAgICAgICAgd2FpdF9mdW5jcy5hcHBlbmQoc2VsZi5maXhlZF9zbGVlcCkKCiAgICAgICAgaWYgd2FpdF9yYW5kb21fbWluIGlzIG5vdCBOb25lIG9yIHdhaXRfcmFuZG9tX21heCBpcyBub3QgTm9uZToKICAgICAgICAgICAgd2FpdF9mdW5jcy5hcHBlbmQoc2VsZi5yYW5kb21fc2xlZXApCgogICAgICAgIGlmIHdhaXRfaW5jcmVtZW50aW5nX3N0YXJ0IGlzIG5vdCBOb25lIG9yIHdhaXRfaW5jcmVtZW50aW5nX2luY3JlbWVudCBpcyBub3QgTm9uZToKICAgICAgICAgICAgd2FpdF9mdW5jcy5hcHBlbmQoc2VsZi5pbmNyZW1lbnRpbmdfc2xlZXApCgogICAgICAgIGlmIHdhaXRfZXhwb25lbnRpYWxfbXVsdGlwbGllciBpcyBub3QgTm9uZSBvciB3YWl0X2V4cG9uZW50aWFsX21heCBpcyBub3QgTm9uZToKICAgICAgICAgICAgd2FpdF9mdW5jcy5hcHBlbmQoc2VsZi5leHBvbmVudGlhbF9zbGVlcCkKCiAgICAgICAgaWYgd2FpdF9mdW5jIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLndhaXQgPSB3YWl0X2Z1bmMKCiAgICAgICAgZWxpZiB3YWl0IGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYud2FpdCA9IGxhbWJkYSBhdHRlbXB0cywgZGVsYXk6IG1heChmKGF0dGVtcHRzLCBkZWxheSkgZm9yIGYgaW4gd2FpdF9mdW5jcykKCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi53YWl0ID0gZ2V0YXR0cihzZWxmLCB3YWl0KQoKICAgICAgICAjIHJldHJ5IG9uIGV4Y2VwdGlvbiBmaWx0ZXIKICAgICAgICBpZiByZXRyeV9vbl9leGNlcHRpb24gaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5fcmV0cnlfb25fZXhjZXB0aW9uID0gc2VsZi5hbHdheXNfcmVqZWN0CiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5fcmV0cnlfb25fZXhjZXB0aW9uID0gcmV0cnlfb25fZXhjZXB0aW9uCgogICAgICAgICMgVE9ETyBzaW1wbGlmeSByZXRyeWluZyBieSBFeGNlcHRpb24gdHlwZXMKICAgICAgICAjIHJldHJ5IG9uIHJlc3VsdCBmaWx0ZXIKICAgICAgICBpZiByZXRyeV9vbl9yZXN1bHQgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5fcmV0cnlfb25fcmVzdWx0ID0gc2VsZi5uZXZlcl9yZWplY3QKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLl9yZXRyeV9vbl9yZXN1bHQgPSByZXRyeV9vbl9yZXN1bHQKCiAgICAgICAgc2VsZi5fd3JhcF9leGNlcHRpb24gPSB3cmFwX2V4Y2VwdGlvbgoKICAgIGRlZiBzdG9wX2FmdGVyX2F0dGVtcHQoc2VsZiwgcHJldmlvdXNfYXR0ZW1wdF9udW1iZXIsIGRlbGF5X3NpbmNlX2ZpcnN0X2F0dGVtcHRfbXMpOgogICAgICAgICIiIlN0b3AgYWZ0ZXIgdGhlIHByZXZpb3VzIGF0dGVtcHQgPj0gc3RvcF9tYXhfYXR0ZW1wdF9udW1iZXIuIiIiCiAgICAgICAgcmV0dXJuIHByZXZpb3VzX2F0dGVtcHRfbnVtYmVyID49IHNlbGYuX3N0b3BfbWF4X2F0dGVtcHRfbnVtYmVyCgogICAgZGVmIHN0b3BfYWZ0ZXJfZGVsYXkoc2VsZiwgcHJldmlvdXNfYXR0ZW1wdF9udW1iZXIsIGRlbGF5X3NpbmNlX2ZpcnN0X2F0dGVtcHRfbXMpOgogICAgICAgICIiIlN0b3AgYWZ0ZXIgdGhlIHRpbWUgZnJvbSB0aGUgZmlyc3QgYXR0ZW1wdCA+PSBzdG9wX21heF9kZWxheS4iIiIKICAgICAgICByZXR1cm4gZGVsYXlfc2luY2VfZmlyc3RfYXR0ZW1wdF9tcyA+PSBzZWxmLl9zdG9wX21heF9kZWxheQoKICAgIGRlZiBub19zbGVlcChzZWxmLCBwcmV2aW91c19hdHRlbXB0X251bWJlciwgZGVsYXlfc2luY2VfZmlyc3RfYXR0ZW1wdF9tcyk6CiAgICAgICAgIiIiRG9uJ3Qgc2xlZXAgYXQgYWxsIGJlZm9yZSByZXRyeWluZy4iIiIKICAgICAgICByZXR1cm4gMAoKICAgIGRlZiBmaXhlZF9zbGVlcChzZWxmLCBwcmV2aW91c19hdHRlbXB0X251bWJlciwgZGVsYXlfc2luY2VfZmlyc3RfYXR0ZW1wdF9tcyk6CiAgICAgICAgIiIiU2xlZXAgYSBmaXhlZCBhbW91bnQgb2YgdGltZSBiZXR3ZWVuIGVhY2ggcmV0cnkuIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuX3dhaXRfZml4ZWQKCiAgICBkZWYgcmFuZG9tX3NsZWVwKHNlbGYsIHByZXZpb3VzX2F0dGVtcHRfbnVtYmVyLCBkZWxheV9zaW5jZV9maXJzdF9hdHRlbXB0X21zKToKICAgICAgICAiIiJTbGVlcCBhIHJhbmRvbSBhbW91bnQgb2YgdGltZSBiZXR3ZWVuIHdhaXRfcmFuZG9tX21pbiBhbmQgd2FpdF9yYW5kb21fbWF4IiIiCiAgICAgICAgcmV0dXJuIHJhbmRvbS5yYW5kaW50KHNlbGYuX3dhaXRfcmFuZG9tX21pbiwgc2VsZi5fd2FpdF9yYW5kb21fbWF4KQoKICAgIGRlZiBpbmNyZW1lbnRpbmdfc2xlZXAoc2VsZiwgcHJldmlvdXNfYXR0ZW1wdF9udW1iZXIsIGRlbGF5X3NpbmNlX2ZpcnN0X2F0dGVtcHRfbXMpOgogICAgICAgICIiIgogICAgICAgIFNsZWVwIGFuIGluY3JlbWVudGFsIGFtb3VudCBvZiB0aW1lIGFmdGVyIGVhY2ggYXR0ZW1wdCwgc3RhcnRpbmcgYXQKICAgICAgICB3YWl0X2luY3JlbWVudGluZ19zdGFydCBhbmQgaW5jcmVtZW50aW5nIGJ5IHdhaXRfaW5jcmVtZW50aW5nX2luY3JlbWVudAogICAgICAgICIiIgogICAgICAgIHJlc3VsdCA9IHNlbGYuX3dhaXRfaW5jcmVtZW50aW5nX3N0YXJ0ICsgKHNlbGYuX3dhaXRfaW5jcmVtZW50aW5nX2luY3JlbWVudCAqIChwcmV2aW91c19hdHRlbXB0X251bWJlciAtIDEpKQogICAgICAgIGlmIHJlc3VsdCA8IDA6CiAgICAgICAgICAgIHJlc3VsdCA9IDAKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIGV4cG9uZW50aWFsX3NsZWVwKHNlbGYsIHByZXZpb3VzX2F0dGVtcHRfbnVtYmVyLCBkZWxheV9zaW5jZV9maXJzdF9hdHRlbXB0X21zKToKICAgICAgICBleHAgPSAyICoqIHByZXZpb3VzX2F0dGVtcHRfbnVtYmVyCiAgICAgICAgcmVzdWx0ID0gc2VsZi5fd2FpdF9leHBvbmVudGlhbF9tdWx0aXBsaWVyICogZXhwCiAgICAgICAgaWYgcmVzdWx0ID4gc2VsZi5fd2FpdF9leHBvbmVudGlhbF9tYXg6CiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuX3dhaXRfZXhwb25lbnRpYWxfbWF4CiAgICAgICAgaWYgcmVzdWx0IDwgMDoKICAgICAgICAgICAgcmVzdWx0ID0gMAogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgbmV2ZXJfcmVqZWN0KHNlbGYsIHJlc3VsdCk6CiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIGFsd2F5c19yZWplY3Qoc2VsZiwgcmVzdWx0KToKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBzaG91bGRfcmVqZWN0KHNlbGYsIGF0dGVtcHQpOgogICAgICAgIHJlamVjdCA9IEZhbHNlCiAgICAgICAgaWYgYXR0ZW1wdC5oYXNfZXhjZXB0aW9uOgogICAgICAgICAgICByZWplY3QgfD0gc2VsZi5fcmV0cnlfb25fZXhjZXB0aW9uKGF0dGVtcHQudmFsdWVbMV0pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVqZWN0IHw9IHNlbGYuX3JldHJ5X29uX3Jlc3VsdChhdHRlbXB0LnZhbHVlKQoKICAgICAgICByZXR1cm4gcmVqZWN0CgogICAgZGVmIGNhbGwoc2VsZiwgZm4sICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgc3RhcnRfdGltZSA9IGludChyb3VuZCh0aW1lLnRpbWUoKSAqIDEwMDApKQogICAgICAgIGF0dGVtcHRfbnVtYmVyID0gMQogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGF0dGVtcHQgPSBBdHRlbXB0KGZuKCphcmdzLCAqKmt3YXJncyksIGF0dGVtcHRfbnVtYmVyLCBGYWxzZSkKICAgICAgICAgICAgZXhjZXB0OgogICAgICAgICAgICAgICAgdGIgPSBzeXMuZXhjX2luZm8oKQogICAgICAgICAgICAgICAgYXR0ZW1wdCA9IEF0dGVtcHQodGIsIGF0dGVtcHRfbnVtYmVyLCBUcnVlKQoKICAgICAgICAgICAgaWYgbm90IHNlbGYuc2hvdWxkX3JlamVjdChhdHRlbXB0KToKICAgICAgICAgICAgICAgIHJldHVybiBhdHRlbXB0LmdldChzZWxmLl93cmFwX2V4Y2VwdGlvbikKCiAgICAgICAgICAgIGRlbGF5X3NpbmNlX2ZpcnN0X2F0dGVtcHRfbXMgPSBpbnQocm91bmQodGltZS50aW1lKCkgKiAxMDAwKSkgLSBzdGFydF90aW1lCiAgICAgICAgICAgIGlmIHNlbGYuc3RvcChhdHRlbXB0X251bWJlciwgZGVsYXlfc2luY2VfZmlyc3RfYXR0ZW1wdF9tcyk6CiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5fd3JhcF9leGNlcHRpb24gYW5kIGF0dGVtcHQuaGFzX2V4Y2VwdGlvbjoKICAgICAgICAgICAgICAgICAgICAjIGdldCgpIG9uIGFuIGF0dGVtcHQgd2l0aCBhbiBleGNlcHRpb24gc2hvdWxkIGNhdXNlIGl0IHRvIGJlIHJhaXNlZCwgYnV0IHJhaXNlIGp1c3QgaW4gY2FzZQogICAgICAgICAgICAgICAgICAgIHJhaXNlIGF0dGVtcHQuZ2V0KCkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgUmV0cnlFcnJvcihhdHRlbXB0KQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2xlZXAgPSBzZWxmLndhaXQoYXR0ZW1wdF9udW1iZXIsIGRlbGF5X3NpbmNlX2ZpcnN0X2F0dGVtcHRfbXMpCiAgICAgICAgICAgICAgICBpZiBzZWxmLl93YWl0X2ppdHRlcl9tYXg6CiAgICAgICAgICAgICAgICAgICAgaml0dGVyID0gcmFuZG9tLnJhbmRvbSgpICogc2VsZi5fd2FpdF9qaXR0ZXJfbWF4CiAgICAgICAgICAgICAgICAgICAgc2xlZXAgPSBzbGVlcCArIG1heCgwLCBqaXR0ZXIpCiAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKHNsZWVwIC8gMTAwMC4wKQoKICAgICAgICAgICAgYXR0ZW1wdF9udW1iZXIgKz0gMQoKCmNsYXNzIEF0dGVtcHQob2JqZWN0KToKICAgICIiIgogICAgQW4gQXR0ZW1wdCBlbmNhcHN1bGF0ZXMgYSBjYWxsIHRvIGEgdGFyZ2V0IGZ1bmN0aW9uIHRoYXQgbWF5IGVuZCBhcyBhCiAgICBub3JtYWwgcmV0dXJuIHZhbHVlIGZyb20gdGhlIGZ1bmN0aW9uIG9yIGFuIEV4Y2VwdGlvbiBkZXBlbmRpbmcgb24gd2hhdAogICAgb2NjdXJyZWQgZHVyaW5nIHRoZSBleGVjdXRpb24uCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWUsIGF0dGVtcHRfbnVtYmVyLCBoYXNfZXhjZXB0aW9uKToKICAgICAgICBzZWxmLnZhbHVlID0gdmFsdWUKICAgICAgICBzZWxmLmF0dGVtcHRfbnVtYmVyID0gYXR0ZW1wdF9udW1iZXIKICAgICAgICBzZWxmLmhhc19leGNlcHRpb24gPSBoYXNfZXhjZXB0aW9uCgogICAgZGVmIGdldChzZWxmLCB3cmFwX2V4Y2VwdGlvbj1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhpcyBBdHRlbXB0IGluc3RhbmNlIG9yIHJhaXNlIGFuIEV4Y2VwdGlvbi4KICAgICAgICBJZiB3cmFwX2V4Y2VwdGlvbiBpcyB0cnVlLCB0aGlzIEF0dGVtcHQgaXMgd3JhcHBlZCBpbnNpZGUgb2YgYQogICAgICAgIFJldHJ5RXJyb3IgYmVmb3JlIGJlaW5nIHJhaXNlZC4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLmhhc19leGNlcHRpb246CiAgICAgICAgICAgIGlmIHdyYXBfZXhjZXB0aW9uOgogICAgICAgICAgICAgICAgcmFpc2UgUmV0cnlFcnJvcihzZWxmKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2l4LnJlcmFpc2Uoc2VsZi52YWx1ZVswXSwgc2VsZi52YWx1ZVsxXSwgc2VsZi52YWx1ZVsyXSkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc2VsZi52YWx1ZQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICBpZiBzZWxmLmhhc19leGNlcHRpb246CiAgICAgICAgICAgIHJldHVybiAiQXR0ZW1wdHM6IHswfSwgRXJyb3I6XG57MX0iLmZvcm1hdChzZWxmLmF0dGVtcHRfbnVtYmVyLCAiIi5qb2luKHRyYWNlYmFjay5mb3JtYXRfdGIoc2VsZi52YWx1ZVsyXSkpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiAiQXR0ZW1wdHM6IHswfSwgVmFsdWU6IHsxfSIuZm9ybWF0KHNlbGYuYXR0ZW1wdF9udW1iZXIsIHNlbGYudmFsdWUpCgoKY2xhc3MgUmV0cnlFcnJvcihFeGNlcHRpb24pOgogICAgIiIiCiAgICBBIFJldHJ5RXJyb3IgZW5jYXBzdWxhdGVzIHRoZSBsYXN0IEF0dGVtcHQgaW5zdGFuY2UgcmlnaHQgYmVmb3JlIGdpdmluZyB1cC4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsYXN0X2F0dGVtcHQpOgogICAgICAgIHNlbGYubGFzdF9hdHRlbXB0ID0gbGFzdF9hdHRlbXB0CgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuICJSZXRyeUVycm9yW3swfV0iLmZvcm1hdChzZWxmLmxhc3RfYXR0ZW1wdCkKUEsDBBQAAAAAAAAAIQCZWE1aknUAAJJ1AAAiAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3NpeC5weSIiIlV0aWxpdGllcyBmb3Igd3JpdGluZyBjb2RlIHRoYXQgcnVucyBvbiBQeXRob24gMiBhbmQgMyIiIgoKIyBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxNSBCZW5qYW1pbiBQZXRlcnNvbgojCiMgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQojIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCiMgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwojIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKIyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKIyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgojCiMgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCiMgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KIwojIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCiMgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCiMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCiMgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgojIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCiMgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKIyBTT0ZUV0FSRS4KCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgZnVuY3Rvb2xzCmltcG9ydCBpdGVydG9vbHMKaW1wb3J0IG9wZXJhdG9yCmltcG9ydCBzeXMKaW1wb3J0IHR5cGVzCgpfX2F1dGhvcl9fID0gIkJlbmphbWluIFBldGVyc29uIDxiZW5qYW1pbkBweXRob24ub3JnPiIKX192ZXJzaW9uX18gPSAiMS4xMC4wIgoKCiMgVXNlZnVsIGZvciB2ZXJ5IGNvYXJzZSB2ZXJzaW9uIGRpZmZlcmVudGlhdGlvbi4KUFkyID0gc3lzLnZlcnNpb25faW5mb1swXSA9PSAyClBZMyA9IHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMwpQWTM0ID0gc3lzLnZlcnNpb25faW5mb1swOjJdID49ICgzLCA0KQoKaWYgUFkzOgogICAgc3RyaW5nX3R5cGVzID0gc3RyLAogICAgaW50ZWdlcl90eXBlcyA9IGludCwKICAgIGNsYXNzX3R5cGVzID0gdHlwZSwKICAgIHRleHRfdHlwZSA9IHN0cgogICAgYmluYXJ5X3R5cGUgPSBieXRlcwoKICAgIE1BWFNJWkUgPSBzeXMubWF4c2l6ZQplbHNlOgogICAgc3RyaW5nX3R5cGVzID0gYmFzZXN0cmluZywKICAgIGludGVnZXJfdHlwZXMgPSAoaW50LCBsb25nKQogICAgY2xhc3NfdHlwZXMgPSAodHlwZSwgdHlwZXMuQ2xhc3NUeXBlKQogICAgdGV4dF90eXBlID0gdW5pY29kZQogICAgYmluYXJ5X3R5cGUgPSBzdHIKCiAgICBpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgiamF2YSIpOgogICAgICAgICMgSnl0aG9uIGFsd2F5cyB1c2VzIDMyIGJpdHMuCiAgICAgICAgTUFYU0laRSA9IGludCgoMSA8PCAzMSkgLSAxKQogICAgZWxzZToKICAgICAgICAjIEl0J3MgcG9zc2libGUgdG8gaGF2ZSBzaXplb2YobG9uZykgIT0gc2l6ZW9mKFB5X3NzaXplX3QpLgogICAgICAgIGNsYXNzIFgob2JqZWN0KToKCiAgICAgICAgICAgIGRlZiBfX2xlbl9fKHNlbGYpOgogICAgICAgICAgICAgICAgcmV0dXJuIDEgPDwgMzEKICAgICAgICB0cnk6CiAgICAgICAgICAgIGxlbihYKCkpCiAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CiAgICAgICAgICAgICMgMzItYml0CiAgICAgICAgICAgIE1BWFNJWkUgPSBpbnQoKDEgPDwgMzEpIC0gMSkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIDY0LWJpdAogICAgICAgICAgICBNQVhTSVpFID0gaW50KCgxIDw8IDYzKSAtIDEpCiAgICAgICAgZGVsIFgKCgpkZWYgX2FkZF9kb2MoZnVuYywgZG9jKToKICAgICIiIkFkZCBkb2N1bWVudGF0aW9uIHRvIGEgZnVuY3Rpb24uIiIiCiAgICBmdW5jLl9fZG9jX18gPSBkb2MKCgpkZWYgX2ltcG9ydF9tb2R1bGUobmFtZSk6CiAgICAiIiJJbXBvcnQgbW9kdWxlLCByZXR1cm5pbmcgdGhlIG1vZHVsZSBhZnRlciB0aGUgbGFzdCBkb3QuIiIiCiAgICBfX2ltcG9ydF9fKG5hbWUpCiAgICByZXR1cm4gc3lzLm1vZHVsZXNbbmFtZV0KCgpjbGFzcyBfTGF6eURlc2NyKG9iamVjdCk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUpOgogICAgICAgIHNlbGYubmFtZSA9IG5hbWUKCiAgICBkZWYgX19nZXRfXyhzZWxmLCBvYmosIHRwKToKICAgICAgICByZXN1bHQgPSBzZWxmLl9yZXNvbHZlKCkKICAgICAgICBzZXRhdHRyKG9iaiwgc2VsZi5uYW1lLCByZXN1bHQpICAjIEludm9rZXMgX19zZXRfXy4KICAgICAgICB0cnk6CiAgICAgICAgICAgICMgVGhpcyBpcyBhIGJpdCB1Z2x5LCBidXQgaXQgYXZvaWRzIHJ1bm5pbmcgdGhpcyBhZ2FpbiBieQogICAgICAgICAgICAjIHJlbW92aW5nIHRoaXMgZGVzY3JpcHRvci4KICAgICAgICAgICAgZGVsYXR0cihvYmouX19jbGFzc19fLCBzZWxmLm5hbWUpCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBwYXNzCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKCmNsYXNzIE1vdmVkTW9kdWxlKF9MYXp5RGVzY3IpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBvbGQsIG5ldz1Ob25lKToKICAgICAgICBzdXBlcihNb3ZlZE1vZHVsZSwgc2VsZikuX19pbml0X18obmFtZSkKICAgICAgICBpZiBQWTM6CiAgICAgICAgICAgIGlmIG5ldyBpcyBOb25lOgogICAgICAgICAgICAgICAgbmV3ID0gbmFtZQogICAgICAgICAgICBzZWxmLm1vZCA9IG5ldwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYubW9kID0gb2xkCgogICAgZGVmIF9yZXNvbHZlKHNlbGYpOgogICAgICAgIHJldHVybiBfaW1wb3J0X21vZHVsZShzZWxmLm1vZCkKCiAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgYXR0cik6CiAgICAgICAgX21vZHVsZSA9IHNlbGYuX3Jlc29sdmUoKQogICAgICAgIHZhbHVlID0gZ2V0YXR0cihfbW9kdWxlLCBhdHRyKQogICAgICAgIHNldGF0dHIoc2VsZiwgYXR0ciwgdmFsdWUpCiAgICAgICAgcmV0dXJuIHZhbHVlCgoKY2xhc3MgX0xhenlNb2R1bGUodHlwZXMuTW9kdWxlVHlwZSk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUpOgogICAgICAgIHN1cGVyKF9MYXp5TW9kdWxlLCBzZWxmKS5fX2luaXRfXyhuYW1lKQogICAgICAgIHNlbGYuX19kb2NfXyA9IHNlbGYuX19jbGFzc19fLl9fZG9jX18KCiAgICBkZWYgX19kaXJfXyhzZWxmKToKICAgICAgICBhdHRycyA9IFsiX19kb2NfXyIsICJfX25hbWVfXyJdCiAgICAgICAgYXR0cnMgKz0gW2F0dHIubmFtZSBmb3IgYXR0ciBpbiBzZWxmLl9tb3ZlZF9hdHRyaWJ1dGVzXQogICAgICAgIHJldHVybiBhdHRycwoKICAgICMgU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcwogICAgX21vdmVkX2F0dHJpYnV0ZXMgPSBbXQoKCmNsYXNzIE1vdmVkQXR0cmlidXRlKF9MYXp5RGVzY3IpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBvbGRfbW9kLCBuZXdfbW9kLCBvbGRfYXR0cj1Ob25lLCBuZXdfYXR0cj1Ob25lKToKICAgICAgICBzdXBlcihNb3ZlZEF0dHJpYnV0ZSwgc2VsZikuX19pbml0X18obmFtZSkKICAgICAgICBpZiBQWTM6CiAgICAgICAgICAgIGlmIG5ld19tb2QgaXMgTm9uZToKICAgICAgICAgICAgICAgIG5ld19tb2QgPSBuYW1lCiAgICAgICAgICAgIHNlbGYubW9kID0gbmV3X21vZAogICAgICAgICAgICBpZiBuZXdfYXR0ciBpcyBOb25lOgogICAgICAgICAgICAgICAgaWYgb2xkX2F0dHIgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICBuZXdfYXR0ciA9IG5hbWUKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbmV3X2F0dHIgPSBvbGRfYXR0cgogICAgICAgICAgICBzZWxmLmF0dHIgPSBuZXdfYXR0cgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYubW9kID0gb2xkX21vZAogICAgICAgICAgICBpZiBvbGRfYXR0ciBpcyBOb25lOgogICAgICAgICAgICAgICAgb2xkX2F0dHIgPSBuYW1lCiAgICAgICAgICAgIHNlbGYuYXR0ciA9IG9sZF9hdHRyCgogICAgZGVmIF9yZXNvbHZlKHNlbGYpOgogICAgICAgIG1vZHVsZSA9IF9pbXBvcnRfbW9kdWxlKHNlbGYubW9kKQogICAgICAgIHJldHVybiBnZXRhdHRyKG1vZHVsZSwgc2VsZi5hdHRyKQoKCmNsYXNzIF9TaXhNZXRhUGF0aEltcG9ydGVyKG9iamVjdCk6CgogICAgIiIiCiAgICBBIG1ldGEgcGF0aCBpbXBvcnRlciB0byBpbXBvcnQgc2l4Lm1vdmVzIGFuZCBpdHMgc3VibW9kdWxlcy4KCiAgICBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBQRVAzMDIgZmluZGVyIGFuZCBsb2FkZXIuIEl0IHNob3VsZCBiZSBjb21wYXRpYmxlCiAgICB3aXRoIFB5dGhvbiAyLjUgYW5kIGFsbCBleGlzdGluZyB2ZXJzaW9ucyBvZiBQeXRob24zCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgc2l4X21vZHVsZV9uYW1lKToKICAgICAgICBzZWxmLm5hbWUgPSBzaXhfbW9kdWxlX25hbWUKICAgICAgICBzZWxmLmtub3duX21vZHVsZXMgPSB7fQoKICAgIGRlZiBfYWRkX21vZHVsZShzZWxmLCBtb2QsICpmdWxsbmFtZXMpOgogICAgICAgIGZvciBmdWxsbmFtZSBpbiBmdWxsbmFtZXM6CiAgICAgICAgICAgIHNlbGYua25vd25fbW9kdWxlc1tzZWxmLm5hbWUgKyAiLiIgKyBmdWxsbmFtZV0gPSBtb2QKCiAgICBkZWYgX2dldF9tb2R1bGUoc2VsZiwgZnVsbG5hbWUpOgogICAgICAgIHJldHVybiBzZWxmLmtub3duX21vZHVsZXNbc2VsZi5uYW1lICsgIi4iICsgZnVsbG5hbWVdCgogICAgZGVmIGZpbmRfbW9kdWxlKHNlbGYsIGZ1bGxuYW1lLCBwYXRoPU5vbmUpOgogICAgICAgIGlmIGZ1bGxuYW1lIGluIHNlbGYua25vd25fbW9kdWxlczoKICAgICAgICAgICAgcmV0dXJuIHNlbGYKICAgICAgICByZXR1cm4gTm9uZQoKICAgIGRlZiBfX2dldF9tb2R1bGUoc2VsZiwgZnVsbG5hbWUpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYua25vd25fbW9kdWxlc1tmdWxsbmFtZV0KICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCJUaGlzIGxvYWRlciBkb2VzIG5vdCBrbm93IG1vZHVsZSAiICsgZnVsbG5hbWUpCgogICAgZGVmIGxvYWRfbW9kdWxlKHNlbGYsIGZ1bGxuYW1lKToKICAgICAgICB0cnk6CiAgICAgICAgICAgICMgaW4gY2FzZSBvZiBhIHJlbG9hZAogICAgICAgICAgICByZXR1cm4gc3lzLm1vZHVsZXNbZnVsbG5hbWVdCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICBwYXNzCiAgICAgICAgbW9kID0gc2VsZi5fX2dldF9tb2R1bGUoZnVsbG5hbWUpCiAgICAgICAgaWYgaXNpbnN0YW5jZShtb2QsIE1vdmVkTW9kdWxlKToKICAgICAgICAgICAgbW9kID0gbW9kLl9yZXNvbHZlKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBtb2QuX19sb2FkZXJfXyA9IHNlbGYKICAgICAgICBzeXMubW9kdWxlc1tmdWxsbmFtZV0gPSBtb2QKICAgICAgICByZXR1cm4gbW9kCgogICAgZGVmIGlzX3BhY2thZ2Uoc2VsZiwgZnVsbG5hbWUpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiB0cnVlLCBpZiB0aGUgbmFtZWQgbW9kdWxlIGlzIGEgcGFja2FnZS4KCiAgICAgICAgV2UgbmVlZCB0aGlzIG1ldGhvZCB0byBnZXQgY29ycmVjdCBzcGVjIG9iamVjdHMgd2l0aAogICAgICAgIFB5dGhvbiAzLjQgKHNlZSBQRVA0NTEpCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGhhc2F0dHIoc2VsZi5fX2dldF9tb2R1bGUoZnVsbG5hbWUpLCAiX19wYXRoX18iKQoKICAgIGRlZiBnZXRfY29kZShzZWxmLCBmdWxsbmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIE5vbmUKCiAgICAgICAgUmVxdWlyZWQsIGlmIGlzX3BhY2thZ2UgaXMgaW1wbGVtZW50ZWQiIiIKICAgICAgICBzZWxmLl9fZ2V0X21vZHVsZShmdWxsbmFtZSkgICMgZXZlbnR1YWxseSByYWlzZXMgSW1wb3J0RXJyb3IKICAgICAgICByZXR1cm4gTm9uZQogICAgZ2V0X3NvdXJjZSA9IGdldF9jb2RlICAjIHNhbWUgYXMgZ2V0X2NvZGUKCl9pbXBvcnRlciA9IF9TaXhNZXRhUGF0aEltcG9ydGVyKF9fbmFtZV9fKQoKCmNsYXNzIF9Nb3ZlZEl0ZW1zKF9MYXp5TW9kdWxlKToKCiAgICAiIiJMYXp5IGxvYWRpbmcgb2YgbW92ZWQgb2JqZWN0cyIiIgogICAgX19wYXRoX18gPSBbXSAgIyBtYXJrIGFzIHBhY2thZ2UKCgpfbW92ZWRfYXR0cmlidXRlcyA9IFsKICAgIE1vdmVkQXR0cmlidXRlKCJjU3RyaW5nSU8iLCAiY1N0cmluZ0lPIiwgImlvIiwgIlN0cmluZ0lPIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiZmlsdGVyIiwgIml0ZXJ0b29scyIsICJidWlsdGlucyIsICJpZmlsdGVyIiwgImZpbHRlciIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImZpbHRlcmZhbHNlIiwgIml0ZXJ0b29scyIsICJpdGVydG9vbHMiLCAiaWZpbHRlcmZhbHNlIiwgImZpbHRlcmZhbHNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiaW5wdXQiLCAiX19idWlsdGluX18iLCAiYnVpbHRpbnMiLCAicmF3X2lucHV0IiwgImlucHV0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiaW50ZXJuIiwgIl9fYnVpbHRpbl9fIiwgInN5cyIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIm1hcCIsICJpdGVydG9vbHMiLCAiYnVpbHRpbnMiLCAiaW1hcCIsICJtYXAiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJnZXRjd2QiLCAib3MiLCAib3MiLCAiZ2V0Y3dkdSIsICJnZXRjd2QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJnZXRjd2RiIiwgIm9zIiwgIm9zIiwgImdldGN3ZCIsICJnZXRjd2RiIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicmFuZ2UiLCAiX19idWlsdGluX18iLCAiYnVpbHRpbnMiLCAieHJhbmdlIiwgInJhbmdlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicmVsb2FkX21vZHVsZSIsICJfX2J1aWx0aW5fXyIsICJpbXBvcnRsaWIiIGlmIFBZMzQgZWxzZSAiaW1wIiwgInJlbG9hZCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInJlZHVjZSIsICJfX2J1aWx0aW5fXyIsICJmdW5jdG9vbHMiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJzaGxleF9xdW90ZSIsICJwaXBlcyIsICJzaGxleCIsICJxdW90ZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlN0cmluZ0lPIiwgIlN0cmluZ0lPIiwgImlvIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiVXNlckRpY3QiLCAiVXNlckRpY3QiLCAiY29sbGVjdGlvbnMiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJVc2VyTGlzdCIsICJVc2VyTGlzdCIsICJjb2xsZWN0aW9ucyIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlVzZXJTdHJpbmciLCAiVXNlclN0cmluZyIsICJjb2xsZWN0aW9ucyIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInhyYW5nZSIsICJfX2J1aWx0aW5fXyIsICJidWlsdGlucyIsICJ4cmFuZ2UiLCAicmFuZ2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ6aXAiLCAiaXRlcnRvb2xzIiwgImJ1aWx0aW5zIiwgIml6aXAiLCAiemlwIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiemlwX2xvbmdlc3QiLCAiaXRlcnRvb2xzIiwgIml0ZXJ0b29scyIsICJpemlwX2xvbmdlc3QiLCAiemlwX2xvbmdlc3QiKSwKICAgIE1vdmVkTW9kdWxlKCJidWlsdGlucyIsICJfX2J1aWx0aW5fXyIpLAogICAgTW92ZWRNb2R1bGUoImNvbmZpZ3BhcnNlciIsICJDb25maWdQYXJzZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJjb3B5cmVnIiwgImNvcHlfcmVnIiksCiAgICBNb3ZlZE1vZHVsZSgiZGJtX2dudSIsICJnZGJtIiwgImRibS5nbnUiKSwKICAgIE1vdmVkTW9kdWxlKCJfZHVtbXlfdGhyZWFkIiwgImR1bW15X3RocmVhZCIsICJfZHVtbXlfdGhyZWFkIiksCiAgICBNb3ZlZE1vZHVsZSgiaHR0cF9jb29raWVqYXIiLCAiY29va2llbGliIiwgImh0dHAuY29va2llamFyIiksCiAgICBNb3ZlZE1vZHVsZSgiaHR0cF9jb29raWVzIiwgIkNvb2tpZSIsICJodHRwLmNvb2tpZXMiKSwKICAgIE1vdmVkTW9kdWxlKCJodG1sX2VudGl0aWVzIiwgImh0bWxlbnRpdHlkZWZzIiwgImh0bWwuZW50aXRpZXMiKSwKICAgIE1vdmVkTW9kdWxlKCJodG1sX3BhcnNlciIsICJIVE1MUGFyc2VyIiwgImh0bWwucGFyc2VyIiksCiAgICBNb3ZlZE1vZHVsZSgiaHR0cF9jbGllbnQiLCAiaHR0cGxpYiIsICJodHRwLmNsaWVudCIpLAogICAgTW92ZWRNb2R1bGUoImVtYWlsX21pbWVfbXVsdGlwYXJ0IiwgImVtYWlsLk1JTUVNdWx0aXBhcnQiLCAiZW1haWwubWltZS5tdWx0aXBhcnQiKSwKICAgIE1vdmVkTW9kdWxlKCJlbWFpbF9taW1lX25vbm11bHRpcGFydCIsICJlbWFpbC5NSU1FTm9uTXVsdGlwYXJ0IiwgImVtYWlsLm1pbWUubm9ubXVsdGlwYXJ0IiksCiAgICBNb3ZlZE1vZHVsZSgiZW1haWxfbWltZV90ZXh0IiwgImVtYWlsLk1JTUVUZXh0IiwgImVtYWlsLm1pbWUudGV4dCIpLAogICAgTW92ZWRNb2R1bGUoImVtYWlsX21pbWVfYmFzZSIsICJlbWFpbC5NSU1FQmFzZSIsICJlbWFpbC5taW1lLmJhc2UiKSwKICAgIE1vdmVkTW9kdWxlKCJCYXNlSFRUUFNlcnZlciIsICJCYXNlSFRUUFNlcnZlciIsICJodHRwLnNlcnZlciIpLAogICAgTW92ZWRNb2R1bGUoIkNHSUhUVFBTZXJ2ZXIiLCAiQ0dJSFRUUFNlcnZlciIsICJodHRwLnNlcnZlciIpLAogICAgTW92ZWRNb2R1bGUoIlNpbXBsZUhUVFBTZXJ2ZXIiLCAiU2ltcGxlSFRUUFNlcnZlciIsICJodHRwLnNlcnZlciIpLAogICAgTW92ZWRNb2R1bGUoImNQaWNrbGUiLCAiY1BpY2tsZSIsICJwaWNrbGUiKSwKICAgIE1vdmVkTW9kdWxlKCJxdWV1ZSIsICJRdWV1ZSIpLAogICAgTW92ZWRNb2R1bGUoInJlcHJsaWIiLCAicmVwciIpLAogICAgTW92ZWRNb2R1bGUoInNvY2tldHNlcnZlciIsICJTb2NrZXRTZXJ2ZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJfdGhyZWFkIiwgInRocmVhZCIsICJfdGhyZWFkIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlciIsICJUa2ludGVyIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9kaWFsb2ciLCAiRGlhbG9nIiwgInRraW50ZXIuZGlhbG9nIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9maWxlZGlhbG9nIiwgIkZpbGVEaWFsb2ciLCAidGtpbnRlci5maWxlZGlhbG9nIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9zY3JvbGxlZHRleHQiLCAiU2Nyb2xsZWRUZXh0IiwgInRraW50ZXIuc2Nyb2xsZWR0ZXh0IiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9zaW1wbGVkaWFsb2ciLCAiU2ltcGxlRGlhbG9nIiwgInRraW50ZXIuc2ltcGxlZGlhbG9nIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl90aXgiLCAiVGl4IiwgInRraW50ZXIudGl4IiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl90dGsiLCAidHRrIiwgInRraW50ZXIudHRrIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9jb25zdGFudHMiLCAiVGtjb25zdGFudHMiLCAidGtpbnRlci5jb25zdGFudHMiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX2RuZCIsICJUa2RuZCIsICJ0a2ludGVyLmRuZCIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfY29sb3JjaG9vc2VyIiwgInRrQ29sb3JDaG9vc2VyIiwKICAgICAgICAgICAgICAgICJ0a2ludGVyLmNvbG9yY2hvb3NlciIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfY29tbW9uZGlhbG9nIiwgInRrQ29tbW9uRGlhbG9nIiwKICAgICAgICAgICAgICAgICJ0a2ludGVyLmNvbW1vbmRpYWxvZyIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfdGtmaWxlZGlhbG9nIiwgInRrRmlsZURpYWxvZyIsICJ0a2ludGVyLmZpbGVkaWFsb2ciKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX2ZvbnQiLCAidGtGb250IiwgInRraW50ZXIuZm9udCIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfbWVzc2FnZWJveCIsICJ0a01lc3NhZ2VCb3giLCAidGtpbnRlci5tZXNzYWdlYm94IiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl90a3NpbXBsZWRpYWxvZyIsICJ0a1NpbXBsZURpYWxvZyIsCiAgICAgICAgICAgICAgICAidGtpbnRlci5zaW1wbGVkaWFsb2ciKSwKICAgIE1vdmVkTW9kdWxlKCJ1cmxsaWJfcGFyc2UiLCBfX25hbWVfXyArICIubW92ZXMudXJsbGliX3BhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRNb2R1bGUoInVybGxpYl9lcnJvciIsIF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWJfZXJyb3IiLCAidXJsbGliLmVycm9yIiksCiAgICBNb3ZlZE1vZHVsZSgidXJsbGliIiwgX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYiIsIF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWIiKSwKICAgIE1vdmVkTW9kdWxlKCJ1cmxsaWJfcm9ib3RwYXJzZXIiLCAicm9ib3RwYXJzZXIiLCAidXJsbGliLnJvYm90cGFyc2VyIiksCiAgICBNb3ZlZE1vZHVsZSgieG1scnBjX2NsaWVudCIsICJ4bWxycGNsaWIiLCAieG1scnBjLmNsaWVudCIpLAogICAgTW92ZWRNb2R1bGUoInhtbHJwY19zZXJ2ZXIiLCAiU2ltcGxlWE1MUlBDU2VydmVyIiwgInhtbHJwYy5zZXJ2ZXIiKSwKXQojIEFkZCB3aW5kb3dzIHNwZWNpZmljIG1vZHVsZXMuCmlmIHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiOgogICAgX21vdmVkX2F0dHJpYnV0ZXMgKz0gWwogICAgICAgIE1vdmVkTW9kdWxlKCJ3aW5yZWciLCAiX3dpbnJlZyIpLAogICAgXQoKZm9yIGF0dHIgaW4gX21vdmVkX2F0dHJpYnV0ZXM6CiAgICBzZXRhdHRyKF9Nb3ZlZEl0ZW1zLCBhdHRyLm5hbWUsIGF0dHIpCiAgICBpZiBpc2luc3RhbmNlKGF0dHIsIE1vdmVkTW9kdWxlKToKICAgICAgICBfaW1wb3J0ZXIuX2FkZF9tb2R1bGUoYXR0ciwgIm1vdmVzLiIgKyBhdHRyLm5hbWUpCmRlbCBhdHRyCgpfTW92ZWRJdGVtcy5fbW92ZWRfYXR0cmlidXRlcyA9IF9tb3ZlZF9hdHRyaWJ1dGVzCgptb3ZlcyA9IF9Nb3ZlZEl0ZW1zKF9fbmFtZV9fICsgIi5tb3ZlcyIpCl9pbXBvcnRlci5fYWRkX21vZHVsZShtb3ZlcywgIm1vdmVzIikKCgpjbGFzcyBNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9wYXJzZShfTGF6eU1vZHVsZSk6CgogICAgIiIiTGF6eSBsb2FkaW5nIG9mIG1vdmVkIG9iamVjdHMgaW4gc2l4Lm1vdmVzLnVybGxpYl9wYXJzZSIiIgoKCl91cmxsaWJfcGFyc2VfbW92ZWRfYXR0cmlidXRlcyA9IFsKICAgIE1vdmVkQXR0cmlidXRlKCJQYXJzZVJlc3VsdCIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJTcGxpdFJlc3VsdCIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJwYXJzZV9xcyIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJwYXJzZV9xc2wiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsZGVmcmFnIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybGpvaW4iLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJscGFyc2UiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsc3BsaXQiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsdW5wYXJzZSIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmx1bnNwbGl0IiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInF1b3RlIiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJxdW90ZV9wbHVzIiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1bnF1b3RlIiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1bnF1b3RlX3BsdXMiLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybGVuY29kZSIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgic3BsaXRxdWVyeSIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgic3BsaXR0YWciLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInNwbGl0dXNlciIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXNlc19mcmFnbWVudCIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1c2VzX25ldGxvYyIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1c2VzX3BhcmFtcyIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1c2VzX3F1ZXJ5IiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVzZXNfcmVsYXRpdmUiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCl0KZm9yIGF0dHIgaW4gX3VybGxpYl9wYXJzZV9tb3ZlZF9hdHRyaWJ1dGVzOgogICAgc2V0YXR0cihNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9wYXJzZSwgYXR0ci5uYW1lLCBhdHRyKQpkZWwgYXR0cgoKTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcGFyc2UuX21vdmVkX2F0dHJpYnV0ZXMgPSBfdXJsbGliX3BhcnNlX21vdmVkX2F0dHJpYnV0ZXMKCl9pbXBvcnRlci5fYWRkX21vZHVsZShNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9wYXJzZShfX25hbWVfXyArICIubW92ZXMudXJsbGliX3BhcnNlIiksCiAgICAgICAgICAgICAgICAgICAgICAibW92ZXMudXJsbGliX3BhcnNlIiwgIm1vdmVzLnVybGxpYi5wYXJzZSIpCgoKY2xhc3MgTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfZXJyb3IoX0xhenlNb2R1bGUpOgoKICAgICIiIkxhenkgbG9hZGluZyBvZiBtb3ZlZCBvYmplY3RzIGluIHNpeC5tb3Zlcy51cmxsaWJfZXJyb3IiIiIKCgpfdXJsbGliX2Vycm9yX21vdmVkX2F0dHJpYnV0ZXMgPSBbCiAgICBNb3ZlZEF0dHJpYnV0ZSgiVVJMRXJyb3IiLCAidXJsbGliMiIsICJ1cmxsaWIuZXJyb3IiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQRXJyb3IiLCAidXJsbGliMiIsICJ1cmxsaWIuZXJyb3IiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJDb250ZW50VG9vU2hvcnRFcnJvciIsICJ1cmxsaWIiLCAidXJsbGliLmVycm9yIiksCl0KZm9yIGF0dHIgaW4gX3VybGxpYl9lcnJvcl9tb3ZlZF9hdHRyaWJ1dGVzOgogICAgc2V0YXR0cihNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9lcnJvciwgYXR0ci5uYW1lLCBhdHRyKQpkZWwgYXR0cgoKTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfZXJyb3IuX21vdmVkX2F0dHJpYnV0ZXMgPSBfdXJsbGliX2Vycm9yX21vdmVkX2F0dHJpYnV0ZXMKCl9pbXBvcnRlci5fYWRkX21vZHVsZShNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9lcnJvcihfX25hbWVfXyArICIubW92ZXMudXJsbGliLmVycm9yIiksCiAgICAgICAgICAgICAgICAgICAgICAibW92ZXMudXJsbGliX2Vycm9yIiwgIm1vdmVzLnVybGxpYi5lcnJvciIpCgoKY2xhc3MgTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcmVxdWVzdChfTGF6eU1vZHVsZSk6CgogICAgIiIiTGF6eSBsb2FkaW5nIG9mIG1vdmVkIG9iamVjdHMgaW4gc2l4Lm1vdmVzLnVybGxpYl9yZXF1ZXN0IiIiCgoKX3VybGxpYl9yZXF1ZXN0X21vdmVkX2F0dHJpYnV0ZXMgPSBbCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsb3BlbiIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiaW5zdGFsbF9vcGVuZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImJ1aWxkX29wZW5lciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicGF0aG5hbWUydXJsIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybDJwYXRobmFtZSIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJnZXRwcm94aWVzIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlJlcXVlc3QiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIk9wZW5lckRpcmVjdG9yIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQRGVmYXVsdEVycm9ySGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUFJlZGlyZWN0SGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUENvb2tpZVByb2Nlc3NvciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiUHJveHlIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJCYXNlSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUFBhc3N3b3JkTWdyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQUGFzc3dvcmRNZ3JXaXRoRGVmYXVsdFJlYWxtIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJBYnN0cmFjdEJhc2ljQXV0aEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBCYXNpY0F1dGhIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJQcm94eUJhc2ljQXV0aEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkFic3RyYWN0RGlnZXN0QXV0aEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBEaWdlc3RBdXRoSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiUHJveHlEaWdlc3RBdXRoSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBTSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiRmlsZUhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkZUUEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkNhY2hlRlRQSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiVW5rbm93bkhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBFcnJvclByb2Nlc3NvciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJscmV0cmlldmUiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsY2xlYW51cCIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJVUkxvcGVuZXIiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiRmFuY3lVUkxvcGVuZXIiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicHJveHlfYnlwYXNzIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLApdCmZvciBhdHRyIGluIF91cmxsaWJfcmVxdWVzdF9tb3ZlZF9hdHRyaWJ1dGVzOgogICAgc2V0YXR0cihNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXF1ZXN0LCBhdHRyLm5hbWUsIGF0dHIpCmRlbCBhdHRyCgpNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXF1ZXN0Ll9tb3ZlZF9hdHRyaWJ1dGVzID0gX3VybGxpYl9yZXF1ZXN0X21vdmVkX2F0dHJpYnV0ZXMKCl9pbXBvcnRlci5fYWRkX21vZHVsZShNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXF1ZXN0KF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWIucmVxdWVzdCIpLAogICAgICAgICAgICAgICAgICAgICAgIm1vdmVzLnVybGxpYl9yZXF1ZXN0IiwgIm1vdmVzLnVybGxpYi5yZXF1ZXN0IikKCgpjbGFzcyBNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXNwb25zZShfTGF6eU1vZHVsZSk6CgogICAgIiIiTGF6eSBsb2FkaW5nIG9mIG1vdmVkIG9iamVjdHMgaW4gc2l4Lm1vdmVzLnVybGxpYl9yZXNwb25zZSIiIgoKCl91cmxsaWJfcmVzcG9uc2VfbW92ZWRfYXR0cmlidXRlcyA9IFsKICAgIE1vdmVkQXR0cmlidXRlKCJhZGRiYXNlIiwgInVybGxpYiIsICJ1cmxsaWIucmVzcG9uc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJhZGRjbG9zZWhvb2siLCAidXJsbGliIiwgInVybGxpYi5yZXNwb25zZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImFkZGluZm8iLCAidXJsbGliIiwgInVybGxpYi5yZXNwb25zZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImFkZGluZm91cmwiLCAidXJsbGliIiwgInVybGxpYi5yZXNwb25zZSIpLApdCmZvciBhdHRyIGluIF91cmxsaWJfcmVzcG9uc2VfbW92ZWRfYXR0cmlidXRlczoKICAgIHNldGF0dHIoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcmVzcG9uc2UsIGF0dHIubmFtZSwgYXR0cikKZGVsIGF0dHIKCk1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3Jlc3BvbnNlLl9tb3ZlZF9hdHRyaWJ1dGVzID0gX3VybGxpYl9yZXNwb25zZV9tb3ZlZF9hdHRyaWJ1dGVzCgpfaW1wb3J0ZXIuX2FkZF9tb2R1bGUoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcmVzcG9uc2UoX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYi5yZXNwb25zZSIpLAogICAgICAgICAgICAgICAgICAgICAgIm1vdmVzLnVybGxpYl9yZXNwb25zZSIsICJtb3Zlcy51cmxsaWIucmVzcG9uc2UiKQoKCmNsYXNzIE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JvYm90cGFyc2VyKF9MYXp5TW9kdWxlKToKCiAgICAiIiJMYXp5IGxvYWRpbmcgb2YgbW92ZWQgb2JqZWN0cyBpbiBzaXgubW92ZXMudXJsbGliX3JvYm90cGFyc2VyIiIiCgoKX3VybGxpYl9yb2JvdHBhcnNlcl9tb3ZlZF9hdHRyaWJ1dGVzID0gWwogICAgTW92ZWRBdHRyaWJ1dGUoIlJvYm90RmlsZVBhcnNlciIsICJyb2JvdHBhcnNlciIsICJ1cmxsaWIucm9ib3RwYXJzZXIiKSwKXQpmb3IgYXR0ciBpbiBfdXJsbGliX3JvYm90cGFyc2VyX21vdmVkX2F0dHJpYnV0ZXM6CiAgICBzZXRhdHRyKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JvYm90cGFyc2VyLCBhdHRyLm5hbWUsIGF0dHIpCmRlbCBhdHRyCgpNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yb2JvdHBhcnNlci5fbW92ZWRfYXR0cmlidXRlcyA9IF91cmxsaWJfcm9ib3RwYXJzZXJfbW92ZWRfYXR0cmlidXRlcwoKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JvYm90cGFyc2VyKF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWIucm9ib3RwYXJzZXIiKSwKICAgICAgICAgICAgICAgICAgICAgICJtb3Zlcy51cmxsaWJfcm9ib3RwYXJzZXIiLCAibW92ZXMudXJsbGliLnJvYm90cGFyc2VyIikKCgpjbGFzcyBNb2R1bGVfc2l4X21vdmVzX3VybGxpYih0eXBlcy5Nb2R1bGVUeXBlKToKCiAgICAiIiJDcmVhdGUgYSBzaXgubW92ZXMudXJsbGliIG5hbWVzcGFjZSB0aGF0IHJlc2VtYmxlcyB0aGUgUHl0aG9uIDMgbmFtZXNwYWNlIiIiCiAgICBfX3BhdGhfXyA9IFtdICAjIG1hcmsgYXMgcGFja2FnZQogICAgcGFyc2UgPSBfaW1wb3J0ZXIuX2dldF9tb2R1bGUoIm1vdmVzLnVybGxpYl9wYXJzZSIpCiAgICBlcnJvciA9IF9pbXBvcnRlci5fZ2V0X21vZHVsZSgibW92ZXMudXJsbGliX2Vycm9yIikKICAgIHJlcXVlc3QgPSBfaW1wb3J0ZXIuX2dldF9tb2R1bGUoIm1vdmVzLnVybGxpYl9yZXF1ZXN0IikKICAgIHJlc3BvbnNlID0gX2ltcG9ydGVyLl9nZXRfbW9kdWxlKCJtb3Zlcy51cmxsaWJfcmVzcG9uc2UiKQogICAgcm9ib3RwYXJzZXIgPSBfaW1wb3J0ZXIuX2dldF9tb2R1bGUoIm1vdmVzLnVybGxpYl9yb2JvdHBhcnNlciIpCgogICAgZGVmIF9fZGlyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIFsncGFyc2UnLCAnZXJyb3InLCAncmVxdWVzdCcsICdyZXNwb25zZScsICdyb2JvdHBhcnNlciddCgpfaW1wb3J0ZXIuX2FkZF9tb2R1bGUoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWIoX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYiIpLAogICAgICAgICAgICAgICAgICAgICAgIm1vdmVzLnVybGxpYiIpCgoKZGVmIGFkZF9tb3ZlKG1vdmUpOgogICAgIiIiQWRkIGFuIGl0ZW0gdG8gc2l4Lm1vdmVzLiIiIgogICAgc2V0YXR0cihfTW92ZWRJdGVtcywgbW92ZS5uYW1lLCBtb3ZlKQoKCmRlZiByZW1vdmVfbW92ZShuYW1lKToKICAgICIiIlJlbW92ZSBpdGVtIGZyb20gc2l4Lm1vdmVzLiIiIgogICAgdHJ5OgogICAgICAgIGRlbGF0dHIoX01vdmVkSXRlbXMsIG5hbWUpCiAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBkZWwgbW92ZXMuX19kaWN0X19bbmFtZV0KICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKCJubyBzdWNoIG1vdmUsICVyIiAlIChuYW1lLCkpCgoKaWYgUFkzOgogICAgX21ldGhfZnVuYyA9ICJfX2Z1bmNfXyIKICAgIF9tZXRoX3NlbGYgPSAiX19zZWxmX18iCgogICAgX2Z1bmNfY2xvc3VyZSA9ICJfX2Nsb3N1cmVfXyIKICAgIF9mdW5jX2NvZGUgPSAiX19jb2RlX18iCiAgICBfZnVuY19kZWZhdWx0cyA9ICJfX2RlZmF1bHRzX18iCiAgICBfZnVuY19nbG9iYWxzID0gIl9fZ2xvYmFsc19fIgplbHNlOgogICAgX21ldGhfZnVuYyA9ICJpbV9mdW5jIgogICAgX21ldGhfc2VsZiA9ICJpbV9zZWxmIgoKICAgIF9mdW5jX2Nsb3N1cmUgPSAiZnVuY19jbG9zdXJlIgogICAgX2Z1bmNfY29kZSA9ICJmdW5jX2NvZGUiCiAgICBfZnVuY19kZWZhdWx0cyA9ICJmdW5jX2RlZmF1bHRzIgogICAgX2Z1bmNfZ2xvYmFscyA9ICJmdW5jX2dsb2JhbHMiCgoKdHJ5OgogICAgYWR2YW5jZV9pdGVyYXRvciA9IG5leHQKZXhjZXB0IE5hbWVFcnJvcjoKICAgIGRlZiBhZHZhbmNlX2l0ZXJhdG9yKGl0KToKICAgICAgICByZXR1cm4gaXQubmV4dCgpCm5leHQgPSBhZHZhbmNlX2l0ZXJhdG9yCgoKdHJ5OgogICAgY2FsbGFibGUgPSBjYWxsYWJsZQpleGNlcHQgTmFtZUVycm9yOgogICAgZGVmIGNhbGxhYmxlKG9iaik6CiAgICAgICAgcmV0dXJuIGFueSgiX19jYWxsX18iIGluIGtsYXNzLl9fZGljdF9fIGZvciBrbGFzcyBpbiB0eXBlKG9iaikuX19tcm9fXykKCgppZiBQWTM6CiAgICBkZWYgZ2V0X3VuYm91bmRfZnVuY3Rpb24odW5ib3VuZCk6CiAgICAgICAgcmV0dXJuIHVuYm91bmQKCiAgICBjcmVhdGVfYm91bmRfbWV0aG9kID0gdHlwZXMuTWV0aG9kVHlwZQoKICAgIGRlZiBjcmVhdGVfdW5ib3VuZF9tZXRob2QoZnVuYywgY2xzKToKICAgICAgICByZXR1cm4gZnVuYwoKICAgIEl0ZXJhdG9yID0gb2JqZWN0CmVsc2U6CiAgICBkZWYgZ2V0X3VuYm91bmRfZnVuY3Rpb24odW5ib3VuZCk6CiAgICAgICAgcmV0dXJuIHVuYm91bmQuaW1fZnVuYwoKICAgIGRlZiBjcmVhdGVfYm91bmRfbWV0aG9kKGZ1bmMsIG9iaik6CiAgICAgICAgcmV0dXJuIHR5cGVzLk1ldGhvZFR5cGUoZnVuYywgb2JqLCBvYmouX19jbGFzc19fKQoKICAgIGRlZiBjcmVhdGVfdW5ib3VuZF9tZXRob2QoZnVuYywgY2xzKToKICAgICAgICByZXR1cm4gdHlwZXMuTWV0aG9kVHlwZShmdW5jLCBOb25lLCBjbHMpCgogICAgY2xhc3MgSXRlcmF0b3Iob2JqZWN0KToKCiAgICAgICAgZGVmIG5leHQoc2VsZik6CiAgICAgICAgICAgIHJldHVybiB0eXBlKHNlbGYpLl9fbmV4dF9fKHNlbGYpCgogICAgY2FsbGFibGUgPSBjYWxsYWJsZQpfYWRkX2RvYyhnZXRfdW5ib3VuZF9mdW5jdGlvbiwKICAgICAgICAgIiIiR2V0IHRoZSBmdW5jdGlvbiBvdXQgb2YgYSBwb3NzaWJseSB1bmJvdW5kIGZ1bmN0aW9uIiIiKQoKCmdldF9tZXRob2RfZnVuY3Rpb24gPSBvcGVyYXRvci5hdHRyZ2V0dGVyKF9tZXRoX2Z1bmMpCmdldF9tZXRob2Rfc2VsZiA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoX21ldGhfc2VsZikKZ2V0X2Z1bmN0aW9uX2Nsb3N1cmUgPSBvcGVyYXRvci5hdHRyZ2V0dGVyKF9mdW5jX2Nsb3N1cmUpCmdldF9mdW5jdGlvbl9jb2RlID0gb3BlcmF0b3IuYXR0cmdldHRlcihfZnVuY19jb2RlKQpnZXRfZnVuY3Rpb25fZGVmYXVsdHMgPSBvcGVyYXRvci5hdHRyZ2V0dGVyKF9mdW5jX2RlZmF1bHRzKQpnZXRfZnVuY3Rpb25fZ2xvYmFscyA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoX2Z1bmNfZ2xvYmFscykKCgppZiBQWTM6CiAgICBkZWYgaXRlcmtleXMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGl0ZXIoZC5rZXlzKCoqa3cpKQoKICAgIGRlZiBpdGVydmFsdWVzKGQsICoqa3cpOgogICAgICAgIHJldHVybiBpdGVyKGQudmFsdWVzKCoqa3cpKQoKICAgIGRlZiBpdGVyaXRlbXMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGl0ZXIoZC5pdGVtcygqKmt3KSkKCiAgICBkZWYgaXRlcmxpc3RzKGQsICoqa3cpOgogICAgICAgIHJldHVybiBpdGVyKGQubGlzdHMoKiprdykpCgogICAgdmlld2tleXMgPSBvcGVyYXRvci5tZXRob2RjYWxsZXIoImtleXMiKQoKICAgIHZpZXd2YWx1ZXMgPSBvcGVyYXRvci5tZXRob2RjYWxsZXIoInZhbHVlcyIpCgogICAgdmlld2l0ZW1zID0gb3BlcmF0b3IubWV0aG9kY2FsbGVyKCJpdGVtcyIpCmVsc2U6CiAgICBkZWYgaXRlcmtleXMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGQuaXRlcmtleXMoKiprdykKCiAgICBkZWYgaXRlcnZhbHVlcyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gZC5pdGVydmFsdWVzKCoqa3cpCgogICAgZGVmIGl0ZXJpdGVtcyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gZC5pdGVyaXRlbXMoKiprdykKCiAgICBkZWYgaXRlcmxpc3RzKGQsICoqa3cpOgogICAgICAgIHJldHVybiBkLml0ZXJsaXN0cygqKmt3KQoKICAgIHZpZXdrZXlzID0gb3BlcmF0b3IubWV0aG9kY2FsbGVyKCJ2aWV3a2V5cyIpCgogICAgdmlld3ZhbHVlcyA9IG9wZXJhdG9yLm1ldGhvZGNhbGxlcigidmlld3ZhbHVlcyIpCgogICAgdmlld2l0ZW1zID0gb3BlcmF0b3IubWV0aG9kY2FsbGVyKCJ2aWV3aXRlbXMiKQoKX2FkZF9kb2MoaXRlcmtleXMsICJSZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUga2V5cyBvZiBhIGRpY3Rpb25hcnkuIikKX2FkZF9kb2MoaXRlcnZhbHVlcywgIlJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSB2YWx1ZXMgb2YgYSBkaWN0aW9uYXJ5LiIpCl9hZGRfZG9jKGl0ZXJpdGVtcywKICAgICAgICAgIlJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSAoa2V5LCB2YWx1ZSkgcGFpcnMgb2YgYSBkaWN0aW9uYXJ5LiIpCl9hZGRfZG9jKGl0ZXJsaXN0cywKICAgICAgICAgIlJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSAoa2V5LCBbdmFsdWVzXSkgcGFpcnMgb2YgYSBkaWN0aW9uYXJ5LiIpCgoKaWYgUFkzOgogICAgZGVmIGIocyk6CiAgICAgICAgcmV0dXJuIHMuZW5jb2RlKCJsYXRpbi0xIikKCiAgICBkZWYgdShzKToKICAgICAgICByZXR1cm4gcwogICAgdW5pY2hyID0gY2hyCiAgICBpbXBvcnQgc3RydWN0CiAgICBpbnQyYnl0ZSA9IHN0cnVjdC5TdHJ1Y3QoIj5CIikucGFjawogICAgZGVsIHN0cnVjdAogICAgYnl0ZTJpbnQgPSBvcGVyYXRvci5pdGVtZ2V0dGVyKDApCiAgICBpbmRleGJ5dGVzID0gb3BlcmF0b3IuZ2V0aXRlbQogICAgaXRlcmJ5dGVzID0gaXRlcgogICAgaW1wb3J0IGlvCiAgICBTdHJpbmdJTyA9IGlvLlN0cmluZ0lPCiAgICBCeXRlc0lPID0gaW8uQnl0ZXNJTwogICAgX2Fzc2VydENvdW50RXF1YWwgPSAiYXNzZXJ0Q291bnRFcXVhbCIKICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMV0gPD0gMToKICAgICAgICBfYXNzZXJ0UmFpc2VzUmVnZXggPSAiYXNzZXJ0UmFpc2VzUmVnZXhwIgogICAgICAgIF9hc3NlcnRSZWdleCA9ICJhc3NlcnRSZWdleHBNYXRjaGVzIgogICAgZWxzZToKICAgICAgICBfYXNzZXJ0UmFpc2VzUmVnZXggPSAiYXNzZXJ0UmFpc2VzUmVnZXgiCiAgICAgICAgX2Fzc2VydFJlZ2V4ID0gImFzc2VydFJlZ2V4IgplbHNlOgogICAgZGVmIGIocyk6CiAgICAgICAgcmV0dXJuIHMKICAgICMgV29ya2Fyb3VuZCBmb3Igc3RhbmRhbG9uZSBiYWNrc2xhc2gKCiAgICBkZWYgdShzKToKICAgICAgICByZXR1cm4gdW5pY29kZShzLnJlcGxhY2UocidcXCcsIHInXFxcXCcpLCAidW5pY29kZV9lc2NhcGUiKQogICAgdW5pY2hyID0gdW5pY2hyCiAgICBpbnQyYnl0ZSA9IGNocgoKICAgIGRlZiBieXRlMmludChicyk6CiAgICAgICAgcmV0dXJuIG9yZChic1swXSkKCiAgICBkZWYgaW5kZXhieXRlcyhidWYsIGkpOgogICAgICAgIHJldHVybiBvcmQoYnVmW2ldKQogICAgaXRlcmJ5dGVzID0gZnVuY3Rvb2xzLnBhcnRpYWwoaXRlcnRvb2xzLmltYXAsIG9yZCkKICAgIGltcG9ydCBTdHJpbmdJTwogICAgU3RyaW5nSU8gPSBCeXRlc0lPID0gU3RyaW5nSU8uU3RyaW5nSU8KICAgIF9hc3NlcnRDb3VudEVxdWFsID0gImFzc2VydEl0ZW1zRXF1YWwiCiAgICBfYXNzZXJ0UmFpc2VzUmVnZXggPSAiYXNzZXJ0UmFpc2VzUmVnZXhwIgogICAgX2Fzc2VydFJlZ2V4ID0gImFzc2VydFJlZ2V4cE1hdGNoZXMiCl9hZGRfZG9jKGIsICIiIkJ5dGUgbGl0ZXJhbCIiIikKX2FkZF9kb2ModSwgIiIiVGV4dCBsaXRlcmFsIiIiKQoKCmRlZiBhc3NlcnRDb3VudEVxdWFsKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICByZXR1cm4gZ2V0YXR0cihzZWxmLCBfYXNzZXJ0Q291bnRFcXVhbCkoKmFyZ3MsICoqa3dhcmdzKQoKCmRlZiBhc3NlcnRSYWlzZXNSZWdleChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgcmV0dXJuIGdldGF0dHIoc2VsZiwgX2Fzc2VydFJhaXNlc1JlZ2V4KSgqYXJncywgKiprd2FyZ3MpCgoKZGVmIGFzc2VydFJlZ2V4KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICByZXR1cm4gZ2V0YXR0cihzZWxmLCBfYXNzZXJ0UmVnZXgpKCphcmdzLCAqKmt3YXJncykKCgppZiBQWTM6CiAgICBleGVjXyA9IGdldGF0dHIobW92ZXMuYnVpbHRpbnMsICJleGVjIikKCiAgICBkZWYgcmVyYWlzZSh0cCwgdmFsdWUsIHRiPU5vbmUpOgogICAgICAgIGlmIHZhbHVlIGlzIE5vbmU6CiAgICAgICAgICAgIHZhbHVlID0gdHAoKQogICAgICAgIGlmIHZhbHVlLl9fdHJhY2ViYWNrX18gaXMgbm90IHRiOgogICAgICAgICAgICByYWlzZSB2YWx1ZS53aXRoX3RyYWNlYmFjayh0YikKICAgICAgICByYWlzZSB2YWx1ZQoKZWxzZToKICAgIGRlZiBleGVjXyhfY29kZV8sIF9nbG9ic189Tm9uZSwgX2xvY3NfPU5vbmUpOgogICAgICAgICIiIkV4ZWN1dGUgY29kZSBpbiBhIG5hbWVzcGFjZS4iIiIKICAgICAgICBpZiBfZ2xvYnNfIGlzIE5vbmU6CiAgICAgICAgICAgIGZyYW1lID0gc3lzLl9nZXRmcmFtZSgxKQogICAgICAgICAgICBfZ2xvYnNfID0gZnJhbWUuZl9nbG9iYWxzCiAgICAgICAgICAgIGlmIF9sb2NzXyBpcyBOb25lOgogICAgICAgICAgICAgICAgX2xvY3NfID0gZnJhbWUuZl9sb2NhbHMKICAgICAgICAgICAgZGVsIGZyYW1lCiAgICAgICAgZWxpZiBfbG9jc18gaXMgTm9uZToKICAgICAgICAgICAgX2xvY3NfID0gX2dsb2JzXwogICAgICAgIGV4ZWMoIiIiZXhlYyBfY29kZV8gaW4gX2dsb2JzXywgX2xvY3NfIiIiKQoKICAgIGV4ZWNfKCIiImRlZiByZXJhaXNlKHRwLCB2YWx1ZSwgdGI9Tm9uZSk6CiAgICByYWlzZSB0cCwgdmFsdWUsIHRiCiIiIikKCgppZiBzeXMudmVyc2lvbl9pbmZvWzoyXSA9PSAoMywgMik6CiAgICBleGVjXygiIiJkZWYgcmFpc2VfZnJvbSh2YWx1ZSwgZnJvbV92YWx1ZSk6CiAgICBpZiBmcm9tX3ZhbHVlIGlzIE5vbmU6CiAgICAgICAgcmFpc2UgdmFsdWUKICAgIHJhaXNlIHZhbHVlIGZyb20gZnJvbV92YWx1ZQoiIiIpCmVsaWYgc3lzLnZlcnNpb25faW5mb1s6Ml0gPiAoMywgMik6CiAgICBleGVjXygiIiJkZWYgcmFpc2VfZnJvbSh2YWx1ZSwgZnJvbV92YWx1ZSk6CiAgICByYWlzZSB2YWx1ZSBmcm9tIGZyb21fdmFsdWUKIiIiKQplbHNlOgogICAgZGVmIHJhaXNlX2Zyb20odmFsdWUsIGZyb21fdmFsdWUpOgogICAgICAgIHJhaXNlIHZhbHVlCgoKcHJpbnRfID0gZ2V0YXR0cihtb3Zlcy5idWlsdGlucywgInByaW50IiwgTm9uZSkKaWYgcHJpbnRfIGlzIE5vbmU6CiAgICBkZWYgcHJpbnRfKCphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgIiIiVGhlIG5ldy1zdHlsZSBwcmludCBmdW5jdGlvbiBmb3IgUHl0aG9uIDIuNCBhbmQgMi41LiIiIgogICAgICAgIGZwID0ga3dhcmdzLnBvcCgiZmlsZSIsIHN5cy5zdGRvdXQpCiAgICAgICAgaWYgZnAgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGRlZiB3cml0ZShkYXRhKToKICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZGF0YSwgYmFzZXN0cmluZyk6CiAgICAgICAgICAgICAgICBkYXRhID0gc3RyKGRhdGEpCiAgICAgICAgICAgICMgSWYgdGhlIGZpbGUgaGFzIGFuIGVuY29kaW5nLCBlbmNvZGUgdW5pY29kZSB3aXRoIGl0LgogICAgICAgICAgICBpZiAoaXNpbnN0YW5jZShmcCwgZmlsZSkgYW5kCiAgICAgICAgICAgICAgICAgICAgaXNpbnN0YW5jZShkYXRhLCB1bmljb2RlKSBhbmQKICAgICAgICAgICAgICAgICAgICBmcC5lbmNvZGluZyBpcyBub3QgTm9uZSk6CiAgICAgICAgICAgICAgICBlcnJvcnMgPSBnZXRhdHRyKGZwLCAiZXJyb3JzIiwgTm9uZSkKICAgICAgICAgICAgICAgIGlmIGVycm9ycyBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgIGVycm9ycyA9ICJzdHJpY3QiCiAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5lbmNvZGUoZnAuZW5jb2RpbmcsIGVycm9ycykKICAgICAgICAgICAgZnAud3JpdGUoZGF0YSkKICAgICAgICB3YW50X3VuaWNvZGUgPSBGYWxzZQogICAgICAgIHNlcCA9IGt3YXJncy5wb3AoInNlcCIsIE5vbmUpCiAgICAgICAgaWYgc2VwIGlzIG5vdCBOb25lOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNlcCwgdW5pY29kZSk6CiAgICAgICAgICAgICAgICB3YW50X3VuaWNvZGUgPSBUcnVlCiAgICAgICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2Uoc2VwLCBzdHIpOgogICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJzZXAgbXVzdCBiZSBOb25lIG9yIGEgc3RyaW5nIikKICAgICAgICBlbmQgPSBrd2FyZ3MucG9wKCJlbmQiLCBOb25lKQogICAgICAgIGlmIGVuZCBpcyBub3QgTm9uZToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShlbmQsIHVuaWNvZGUpOgogICAgICAgICAgICAgICAgd2FudF91bmljb2RlID0gVHJ1ZQogICAgICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKGVuZCwgc3RyKToKICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiZW5kIG11c3QgYmUgTm9uZSBvciBhIHN0cmluZyIpCiAgICAgICAgaWYga3dhcmdzOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImludmFsaWQga2V5d29yZCBhcmd1bWVudHMgdG8gcHJpbnQoKSIpCiAgICAgICAgaWYgbm90IHdhbnRfdW5pY29kZToKICAgICAgICAgICAgZm9yIGFyZyBpbiBhcmdzOgogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShhcmcsIHVuaWNvZGUpOgogICAgICAgICAgICAgICAgICAgIHdhbnRfdW5pY29kZSA9IFRydWUKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGlmIHdhbnRfdW5pY29kZToKICAgICAgICAgICAgbmV3bGluZSA9IHVuaWNvZGUoIlxuIikKICAgICAgICAgICAgc3BhY2UgPSB1bmljb2RlKCIgIikKICAgICAgICBlbHNlOgogICAgICAgICAgICBuZXdsaW5lID0gIlxuIgogICAgICAgICAgICBzcGFjZSA9ICIgIgogICAgICAgIGlmIHNlcCBpcyBOb25lOgogICAgICAgICAgICBzZXAgPSBzcGFjZQogICAgICAgIGlmIGVuZCBpcyBOb25lOgogICAgICAgICAgICBlbmQgPSBuZXdsaW5lCiAgICAgICAgZm9yIGksIGFyZyBpbiBlbnVtZXJhdGUoYXJncyk6CiAgICAgICAgICAgIGlmIGk6CiAgICAgICAgICAgICAgICB3cml0ZShzZXApCiAgICAgICAgICAgIHdyaXRlKGFyZykKICAgICAgICB3cml0ZShlbmQpCmlmIHN5cy52ZXJzaW9uX2luZm9bOjJdIDwgKDMsIDMpOgogICAgX3ByaW50ID0gcHJpbnRfCgogICAgZGVmIHByaW50XygqYXJncywgKiprd2FyZ3MpOgogICAgICAgIGZwID0ga3dhcmdzLmdldCgiZmlsZSIsIHN5cy5zdGRvdXQpCiAgICAgICAgZmx1c2ggPSBrd2FyZ3MucG9wKCJmbHVzaCIsIEZhbHNlKQogICAgICAgIF9wcmludCgqYXJncywgKiprd2FyZ3MpCiAgICAgICAgaWYgZmx1c2ggYW5kIGZwIGlzIG5vdCBOb25lOgogICAgICAgICAgICBmcC5mbHVzaCgpCgpfYWRkX2RvYyhyZXJhaXNlLCAiIiJSZXJhaXNlIGFuIGV4Y2VwdGlvbi4iIiIpCgppZiBzeXMudmVyc2lvbl9pbmZvWzA6Ml0gPCAoMywgNCk6CiAgICBkZWYgd3JhcHMod3JhcHBlZCwgYXNzaWduZWQ9ZnVuY3Rvb2xzLldSQVBQRVJfQVNTSUdOTUVOVFMsCiAgICAgICAgICAgICAgdXBkYXRlZD1mdW5jdG9vbHMuV1JBUFBFUl9VUERBVEVTKToKICAgICAgICBkZWYgd3JhcHBlcihmKToKICAgICAgICAgICAgZiA9IGZ1bmN0b29scy53cmFwcyh3cmFwcGVkLCBhc3NpZ25lZCwgdXBkYXRlZCkoZikKICAgICAgICAgICAgZi5fX3dyYXBwZWRfXyA9IHdyYXBwZWQKICAgICAgICAgICAgcmV0dXJuIGYKICAgICAgICByZXR1cm4gd3JhcHBlcgplbHNlOgogICAgd3JhcHMgPSBmdW5jdG9vbHMud3JhcHMKCgpkZWYgd2l0aF9tZXRhY2xhc3MobWV0YSwgKmJhc2VzKToKICAgICIiIkNyZWF0ZSBhIGJhc2UgY2xhc3Mgd2l0aCBhIG1ldGFjbGFzcy4iIiIKICAgICMgVGhpcyByZXF1aXJlcyBhIGJpdCBvZiBleHBsYW5hdGlvbjogdGhlIGJhc2ljIGlkZWEgaXMgdG8gbWFrZSBhIGR1bW15CiAgICAjIG1ldGFjbGFzcyBmb3Igb25lIGxldmVsIG9mIGNsYXNzIGluc3RhbnRpYXRpb24gdGhhdCByZXBsYWNlcyBpdHNlbGYgd2l0aAogICAgIyB0aGUgYWN0dWFsIG1ldGFjbGFzcy4KICAgIGNsYXNzIG1ldGFjbGFzcyhtZXRhKToKCiAgICAgICAgZGVmIF9fbmV3X18oY2xzLCBuYW1lLCB0aGlzX2Jhc2VzLCBkKToKICAgICAgICAgICAgcmV0dXJuIG1ldGEobmFtZSwgYmFzZXMsIGQpCiAgICByZXR1cm4gdHlwZS5fX25ld19fKG1ldGFjbGFzcywgJ3RlbXBvcmFyeV9jbGFzcycsICgpLCB7fSkKCgpkZWYgYWRkX21ldGFjbGFzcyhtZXRhY2xhc3MpOgogICAgIiIiQ2xhc3MgZGVjb3JhdG9yIGZvciBjcmVhdGluZyBhIGNsYXNzIHdpdGggYSBtZXRhY2xhc3MuIiIiCiAgICBkZWYgd3JhcHBlcihjbHMpOgogICAgICAgIG9yaWdfdmFycyA9IGNscy5fX2RpY3RfXy5jb3B5KCkKICAgICAgICBzbG90cyA9IG9yaWdfdmFycy5nZXQoJ19fc2xvdHNfXycpCiAgICAgICAgaWYgc2xvdHMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2xvdHMsIHN0cik6CiAgICAgICAgICAgICAgICBzbG90cyA9IFtzbG90c10KICAgICAgICAgICAgZm9yIHNsb3RzX3ZhciBpbiBzbG90czoKICAgICAgICAgICAgICAgIG9yaWdfdmFycy5wb3Aoc2xvdHNfdmFyKQogICAgICAgIG9yaWdfdmFycy5wb3AoJ19fZGljdF9fJywgTm9uZSkKICAgICAgICBvcmlnX3ZhcnMucG9wKCdfX3dlYWtyZWZfXycsIE5vbmUpCiAgICAgICAgcmV0dXJuIG1ldGFjbGFzcyhjbHMuX19uYW1lX18sIGNscy5fX2Jhc2VzX18sIG9yaWdfdmFycykKICAgIHJldHVybiB3cmFwcGVyCgoKZGVmIHB5dGhvbl8yX3VuaWNvZGVfY29tcGF0aWJsZShrbGFzcyk6CiAgICAiIiIKICAgIEEgZGVjb3JhdG9yIHRoYXQgZGVmaW5lcyBfX3VuaWNvZGVfXyBhbmQgX19zdHJfXyBtZXRob2RzIHVuZGVyIFB5dGhvbiAyLgogICAgVW5kZXIgUHl0aG9uIDMgaXQgZG9lcyBub3RoaW5nLgoKICAgIFRvIHN1cHBvcnQgUHl0aG9uIDIgYW5kIDMgd2l0aCBhIHNpbmdsZSBjb2RlIGJhc2UsIGRlZmluZSBhIF9fc3RyX18gbWV0aG9kCiAgICByZXR1cm5pbmcgdGV4dCBhbmQgYXBwbHkgdGhpcyBkZWNvcmF0b3IgdG8gdGhlIGNsYXNzLgogICAgIiIiCiAgICBpZiBQWTI6CiAgICAgICAgaWYgJ19fc3RyX18nIG5vdCBpbiBrbGFzcy5fX2RpY3RfXzoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiQHB5dGhvbl8yX3VuaWNvZGVfY29tcGF0aWJsZSBjYW5ub3QgYmUgYXBwbGllZCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvICVzIGJlY2F1c2UgaXQgZG9lc24ndCBkZWZpbmUgX19zdHJfXygpLiIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtsYXNzLl9fbmFtZV9fKQogICAgICAgIGtsYXNzLl9fdW5pY29kZV9fID0ga2xhc3MuX19zdHJfXwogICAgICAgIGtsYXNzLl9fc3RyX18gPSBsYW1iZGEgc2VsZjogc2VsZi5fX3VuaWNvZGVfXygpLmVuY29kZSgndXRmLTgnKQogICAgcmV0dXJuIGtsYXNzCgoKIyBDb21wbGV0ZSB0aGUgbW92ZXMgaW1wbGVtZW50YXRpb24uCiMgVGhpcyBjb2RlIGlzIGF0IHRoZSBlbmQgb2YgdGhpcyBtb2R1bGUgdG8gc3BlZWQgdXAgbW9kdWxlIGxvYWRpbmcuCiMgVHVybiB0aGlzIG1vZHVsZSBpbnRvIGEgcGFja2FnZS4KX19wYXRoX18gPSBbXSAgIyByZXF1aXJlZCBmb3IgUEVQIDMwMiBhbmQgUEVQIDQ1MQpfX3BhY2thZ2VfXyA9IF9fbmFtZV9fICAjIHNlZSBQRVAgMzY2IEBSZXNlcnZlZEFzc2lnbm1lbnQKaWYgZ2xvYmFscygpLmdldCgiX19zcGVjX18iKSBpcyBub3QgTm9uZToKICAgIF9fc3BlY19fLnN1Ym1vZHVsZV9zZWFyY2hfbG9jYXRpb25zID0gW10gICMgUEVQIDQ1MSBAVW5kZWZpbmVkVmFyaWFibGUKIyBSZW1vdmUgb3RoZXIgc2l4IG1ldGEgcGF0aCBpbXBvcnRlcnMsIHNpbmNlIHRoZXkgY2F1c2UgcHJvYmxlbXMuIFRoaXMgY2FuCiMgaGFwcGVuIGlmIHNpeCBpcyByZW1vdmVkIGZyb20gc3lzLm1vZHVsZXMgYW5kIHRoZW4gcmVsb2FkZWQuIChTZXR1cHRvb2xzIGRvZXMKIyB0aGlzIGZvciBzb21lIHJlYXNvbi4pCmlmIHN5cy5tZXRhX3BhdGg6CiAgICBmb3IgaSwgaW1wb3J0ZXIgaW4gZW51bWVyYXRlKHN5cy5tZXRhX3BhdGgpOgogICAgICAgICMgSGVyZSdzIHNvbWUgcmVhbCBuYXN0aW5lc3M6IEFub3RoZXIgImluc3RhbmNlIiBvZiB0aGUgc2l4IG1vZHVsZSBtaWdodAogICAgICAgICMgYmUgZmxvYXRpbmcgYXJvdW5kLiBUaGVyZWZvcmUsIHdlIGNhbid0IHVzZSBpc2luc3RhbmNlKCkgdG8gY2hlY2sgZm9yCiAgICAgICAgIyB0aGUgc2l4IG1ldGEgcGF0aCBpbXBvcnRlciwgc2luY2UgdGhlIG90aGVyIHNpeCBpbnN0YW5jZSB3aWxsIGhhdmUKICAgICAgICAjIGluc2VydGVkIGFuIGltcG9ydGVyIHdpdGggZGlmZmVyZW50IGNsYXNzLgogICAgICAgIGlmICh0eXBlKGltcG9ydGVyKS5fX25hbWVfXyA9PSAiX1NpeE1ldGFQYXRoSW1wb3J0ZXIiIGFuZAogICAgICAgICAgICAgICAgaW1wb3J0ZXIubmFtZSA9PSBfX25hbWVfXyk6CiAgICAgICAgICAgIGRlbCBzeXMubWV0YV9wYXRoW2ldCiAgICAgICAgICAgIGJyZWFrCiAgICBkZWwgaSwgaW1wb3J0ZXIKIyBGaW5hbGx5LCBhZGQgdGhlIGltcG9ydGVyIHRvIHRoZSBtZXRhIHBhdGggaW1wb3J0IGhvb2suCnN5cy5tZXRhX3BhdGguYXBwZW5kKF9pbXBvcnRlcikKUEsDBBQAAAAAAAAAIQCSPvWHJQsAACULAAAvAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvX19pbml0X18ucHkiIiIKdXJsbGliMyAtIFRocmVhZC1zYWZlIGNvbm5lY3Rpb24gcG9vbGluZyBhbmQgcmUtdXNpbmcuCiIiIgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKaW1wb3J0IHdhcm5pbmdzCgpmcm9tIC5jb25uZWN0aW9ucG9vbCBpbXBvcnQgKAogICAgSFRUUENvbm5lY3Rpb25Qb29sLAogICAgSFRUUFNDb25uZWN0aW9uUG9vbCwKICAgIGNvbm5lY3Rpb25fZnJvbV91cmwKKQoKZnJvbSAuIGltcG9ydCBleGNlcHRpb25zCmZyb20gLmZpbGVwb3N0IGltcG9ydCBlbmNvZGVfbXVsdGlwYXJ0X2Zvcm1kYXRhCmZyb20gLnBvb2xtYW5hZ2VyIGltcG9ydCBQb29sTWFuYWdlciwgUHJveHlNYW5hZ2VyLCBwcm94eV9mcm9tX3VybApmcm9tIC5yZXNwb25zZSBpbXBvcnQgSFRUUFJlc3BvbnNlCmZyb20gLnV0aWwucmVxdWVzdCBpbXBvcnQgbWFrZV9oZWFkZXJzCmZyb20gLnV0aWwudXJsIGltcG9ydCBnZXRfaG9zdApmcm9tIC51dGlsLnRpbWVvdXQgaW1wb3J0IFRpbWVvdXQKZnJvbSAudXRpbC5yZXRyeSBpbXBvcnQgUmV0cnkKCgojIFNldCBkZWZhdWx0IGxvZ2dpbmcgaGFuZGxlciB0byBhdm9pZCAiTm8gaGFuZGxlciBmb3VuZCIgd2FybmluZ3MuCmltcG9ydCBsb2dnaW5nCnRyeTogICMgUHl0aG9uIDIuNysKICAgIGZyb20gbG9nZ2luZyBpbXBvcnQgTnVsbEhhbmRsZXIKZXhjZXB0IEltcG9ydEVycm9yOgogICAgY2xhc3MgTnVsbEhhbmRsZXIobG9nZ2luZy5IYW5kbGVyKToKICAgICAgICBkZWYgZW1pdChzZWxmLCByZWNvcmQpOgogICAgICAgICAgICBwYXNzCgpfX2F1dGhvcl9fID0gJ0FuZHJleSBQZXRyb3YgKGFuZHJleS5wZXRyb3ZAc2hhem93Lm5ldCknCl9fbGljZW5zZV9fID0gJ01JVCcKX192ZXJzaW9uX18gPSAnMS4yMicKCl9fYWxsX18gPSAoCiAgICAnSFRUUENvbm5lY3Rpb25Qb29sJywKICAgICdIVFRQU0Nvbm5lY3Rpb25Qb29sJywKICAgICdQb29sTWFuYWdlcicsCiAgICAnUHJveHlNYW5hZ2VyJywKICAgICdIVFRQUmVzcG9uc2UnLAogICAgJ1JldHJ5JywKICAgICdUaW1lb3V0JywKICAgICdhZGRfc3RkZXJyX2xvZ2dlcicsCiAgICAnY29ubmVjdGlvbl9mcm9tX3VybCcsCiAgICAnZGlzYWJsZV93YXJuaW5ncycsCiAgICAnZW5jb2RlX211bHRpcGFydF9mb3JtZGF0YScsCiAgICAnZ2V0X2hvc3QnLAogICAgJ21ha2VfaGVhZGVycycsCiAgICAncHJveHlfZnJvbV91cmwnLAopCgpsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykuYWRkSGFuZGxlcihOdWxsSGFuZGxlcigpKQoKCmRlZiBhZGRfc3RkZXJyX2xvZ2dlcihsZXZlbD1sb2dnaW5nLkRFQlVHKToKICAgICIiIgogICAgSGVscGVyIGZvciBxdWlja2x5IGFkZGluZyBhIFN0cmVhbUhhbmRsZXIgdG8gdGhlIGxvZ2dlci4gVXNlZnVsIGZvcgogICAgZGVidWdnaW5nLgoKICAgIFJldHVybnMgdGhlIGhhbmRsZXIgYWZ0ZXIgYWRkaW5nIGl0LgogICAgIiIiCiAgICAjIFRoaXMgbWV0aG9kIG5lZWRzIHRvIGJlIGluIHRoaXMgX19pbml0X18ucHkgdG8gZ2V0IHRoZSBfX25hbWVfXyBjb3JyZWN0CiAgICAjIGV2ZW4gaWYgdXJsbGliMyBpcyB2ZW5kb3JlZCB3aXRoaW4gYW5vdGhlciBwYWNrYWdlLgogICAgbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCiAgICBoYW5kbGVyID0gbG9nZ2luZy5TdHJlYW1IYW5kbGVyKCkKICAgIGhhbmRsZXIuc2V0Rm9ybWF0dGVyKGxvZ2dpbmcuRm9ybWF0dGVyKCclKGFzY3RpbWUpcyAlKGxldmVsbmFtZSlzICUobWVzc2FnZSlzJykpCiAgICBsb2dnZXIuYWRkSGFuZGxlcihoYW5kbGVyKQogICAgbG9nZ2VyLnNldExldmVsKGxldmVsKQogICAgbG9nZ2VyLmRlYnVnKCdBZGRlZCBhIHN0ZGVyciBsb2dnaW5nIGhhbmRsZXIgdG8gbG9nZ2VyOiAlcycsIF9fbmFtZV9fKQogICAgcmV0dXJuIGhhbmRsZXIKCgojIC4uLiBDbGVhbiB1cC4KZGVsIE51bGxIYW5kbGVyCgoKIyBBbGwgd2FybmluZyBmaWx0ZXJzICptdXN0KiBiZSBhcHBlbmRlZCB1bmxlc3MgeW91J3JlIHJlYWxseSBjZXJ0YWluIHRoYXQgdGhleQojIHNob3VsZG4ndCBiZTogb3RoZXJ3aXNlLCBpdCdzIHZlcnkgaGFyZCBmb3IgdXNlcnMgdG8gdXNlIG1vc3QgUHl0aG9uCiMgbWVjaGFuaXNtcyB0byBzaWxlbmNlIHRoZW0uCiMgU2VjdXJpdHlXYXJuaW5nJ3MgYWx3YXlzIGdvIG9mZiBieSBkZWZhdWx0Lgp3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoJ2Fsd2F5cycsIGV4Y2VwdGlvbnMuU2VjdXJpdHlXYXJuaW5nLCBhcHBlbmQ9VHJ1ZSkKIyBTdWJqZWN0QWx0TmFtZVdhcm5pbmcncyBzaG91bGQgZ28gb2ZmIG9uY2UgcGVyIGhvc3QKd2FybmluZ3Muc2ltcGxlZmlsdGVyKCdkZWZhdWx0JywgZXhjZXB0aW9ucy5TdWJqZWN0QWx0TmFtZVdhcm5pbmcsIGFwcGVuZD1UcnVlKQojIEluc2VjdXJlUGxhdGZvcm1XYXJuaW5nJ3MgZG9uJ3QgdmFyeSBiZXR3ZWVuIHJlcXVlc3RzLCBzbyB3ZSBrZWVwIGl0IGRlZmF1bHQuCndhcm5pbmdzLnNpbXBsZWZpbHRlcignZGVmYXVsdCcsIGV4Y2VwdGlvbnMuSW5zZWN1cmVQbGF0Zm9ybVdhcm5pbmcsCiAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQ9VHJ1ZSkKIyBTTklNaXNzaW5nV2FybmluZ3Mgc2hvdWxkIGdvIG9mZiBvbmx5IG9uY2UuCndhcm5pbmdzLnNpbXBsZWZpbHRlcignZGVmYXVsdCcsIGV4Y2VwdGlvbnMuU05JTWlzc2luZ1dhcm5pbmcsIGFwcGVuZD1UcnVlKQoKCmRlZiBkaXNhYmxlX3dhcm5pbmdzKGNhdGVnb3J5PWV4Y2VwdGlvbnMuSFRUUFdhcm5pbmcpOgogICAgIiIiCiAgICBIZWxwZXIgZm9yIHF1aWNrbHkgZGlzYWJsaW5nIGFsbCB1cmxsaWIzIHdhcm5pbmdzLgogICAgIiIiCiAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoJ2lnbm9yZScsIGNhdGVnb3J5KQpQSwMEFAAAAAAAAAAhAAAZ05TcJwAA3CcAADMAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9fY29sbGVjdGlvbnMucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydApmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBNYXBwaW5nLCBNdXRhYmxlTWFwcGluZwp0cnk6CiAgICBmcm9tIHRocmVhZGluZyBpbXBvcnQgUkxvY2sKZXhjZXB0IEltcG9ydEVycm9yOiAgIyBQbGF0Zm9ybS1zcGVjaWZpYzogTm8gdGhyZWFkcyBhdmFpbGFibGUKICAgIGNsYXNzIFJMb2NrOgogICAgICAgIGRlZiBfX2VudGVyX18oc2VsZik6CiAgICAgICAgICAgIHBhc3MKCiAgICAgICAgZGVmIF9fZXhpdF9fKHNlbGYsIGV4Y190eXBlLCBleGNfdmFsdWUsIHRyYWNlYmFjayk6CiAgICAgICAgICAgIHBhc3MKCgp0cnk6ICAjIFB5dGhvbiAyLjcrCiAgICBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBPcmRlcmVkRGljdApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBmcm9tIC5wYWNrYWdlcy5vcmRlcmVkX2RpY3QgaW1wb3J0IE9yZGVyZWREaWN0CmZyb20gLnBhY2thZ2VzLnNpeCBpbXBvcnQgaXRlcmtleXMsIGl0ZXJ2YWx1ZXMsIFBZMwoKCl9fYWxsX18gPSBbJ1JlY2VudGx5VXNlZENvbnRhaW5lcicsICdIVFRQSGVhZGVyRGljdCddCgoKX051bGwgPSBvYmplY3QoKQoKCmNsYXNzIFJlY2VudGx5VXNlZENvbnRhaW5lcihNdXRhYmxlTWFwcGluZyk6CiAgICAiIiIKICAgIFByb3ZpZGVzIGEgdGhyZWFkLXNhZmUgZGljdC1saWtlIGNvbnRhaW5lciB3aGljaCBtYWludGFpbnMgdXAgdG8KICAgIGBgbWF4c2l6ZWBgIGtleXMgd2hpbGUgdGhyb3dpbmcgYXdheSB0aGUgbGVhc3QtcmVjZW50bHktdXNlZCBrZXlzIGJleW9uZAogICAgYGBtYXhzaXplYGAuCgogICAgOnBhcmFtIG1heHNpemU6CiAgICAgICAgTWF4aW11bSBudW1iZXIgb2YgcmVjZW50IGVsZW1lbnRzIHRvIHJldGFpbi4KCiAgICA6cGFyYW0gZGlzcG9zZV9mdW5jOgogICAgICAgIEV2ZXJ5IHRpbWUgYW4gaXRlbSBpcyBldmljdGVkIGZyb20gdGhlIGNvbnRhaW5lciwKICAgICAgICBgYGRpc3Bvc2VfZnVuYyh2YWx1ZSlgYCBpcyBjYWxsZWQuICBDYWxsYmFjayB3aGljaCB3aWxsIGdldCBjYWxsZWQKICAgICIiIgoKICAgIENvbnRhaW5lckNscyA9IE9yZGVyZWREaWN0CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1heHNpemU9MTAsIGRpc3Bvc2VfZnVuYz1Ob25lKToKICAgICAgICBzZWxmLl9tYXhzaXplID0gbWF4c2l6ZQogICAgICAgIHNlbGYuZGlzcG9zZV9mdW5jID0gZGlzcG9zZV9mdW5jCgogICAgICAgIHNlbGYuX2NvbnRhaW5lciA9IHNlbGYuQ29udGFpbmVyQ2xzKCkKICAgICAgICBzZWxmLmxvY2sgPSBSTG9jaygpCgogICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CiAgICAgICAgIyBSZS1pbnNlcnQgdGhlIGl0ZW0sIG1vdmluZyBpdCB0byB0aGUgZW5kIG9mIHRoZSBldmljdGlvbiBsaW5lLgogICAgICAgIHdpdGggc2VsZi5sb2NrOgogICAgICAgICAgICBpdGVtID0gc2VsZi5fY29udGFpbmVyLnBvcChrZXkpCiAgICAgICAgICAgIHNlbGYuX2NvbnRhaW5lcltrZXldID0gaXRlbQogICAgICAgICAgICByZXR1cm4gaXRlbQoKICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKToKICAgICAgICBldmljdGVkX3ZhbHVlID0gX051bGwKICAgICAgICB3aXRoIHNlbGYubG9jazoKICAgICAgICAgICAgIyBQb3NzaWJseSBldmljdCB0aGUgZXhpc3RpbmcgdmFsdWUgb2YgJ2tleScKICAgICAgICAgICAgZXZpY3RlZF92YWx1ZSA9IHNlbGYuX2NvbnRhaW5lci5nZXQoa2V5LCBfTnVsbCkKICAgICAgICAgICAgc2VsZi5fY29udGFpbmVyW2tleV0gPSB2YWx1ZQoKICAgICAgICAgICAgIyBJZiB3ZSBkaWRuJ3QgZXZpY3QgYW4gZXhpc3RpbmcgdmFsdWUsIHdlIG1pZ2h0IGhhdmUgdG8gZXZpY3QgdGhlCiAgICAgICAgICAgICMgbGVhc3QgcmVjZW50bHkgdXNlZCBpdGVtIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgY29udGFpbmVyLgogICAgICAgICAgICBpZiBsZW4oc2VsZi5fY29udGFpbmVyKSA+IHNlbGYuX21heHNpemU6CiAgICAgICAgICAgICAgICBfa2V5LCBldmljdGVkX3ZhbHVlID0gc2VsZi5fY29udGFpbmVyLnBvcGl0ZW0obGFzdD1GYWxzZSkKCiAgICAgICAgaWYgc2VsZi5kaXNwb3NlX2Z1bmMgYW5kIGV2aWN0ZWRfdmFsdWUgaXMgbm90IF9OdWxsOgogICAgICAgICAgICBzZWxmLmRpc3Bvc2VfZnVuYyhldmljdGVkX3ZhbHVlKQoKICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBrZXkpOgogICAgICAgIHdpdGggc2VsZi5sb2NrOgogICAgICAgICAgICB2YWx1ZSA9IHNlbGYuX2NvbnRhaW5lci5wb3Aoa2V5KQoKICAgICAgICBpZiBzZWxmLmRpc3Bvc2VfZnVuYzoKICAgICAgICAgICAgc2VsZi5kaXNwb3NlX2Z1bmModmFsdWUpCgogICAgZGVmIF9fbGVuX18oc2VsZik6CiAgICAgICAgd2l0aCBzZWxmLmxvY2s6CiAgICAgICAgICAgIHJldHVybiBsZW4oc2VsZi5fY29udGFpbmVyKQoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCdJdGVyYXRpb24gb3ZlciB0aGlzIGNsYXNzIGlzIHVubGlrZWx5IHRvIGJlIHRocmVhZHNhZmUuJykKCiAgICBkZWYgY2xlYXIoc2VsZik6CiAgICAgICAgd2l0aCBzZWxmLmxvY2s6CiAgICAgICAgICAgICMgQ29weSBwb2ludGVycyB0byBhbGwgdmFsdWVzLCB0aGVuIHdpcGUgdGhlIG1hcHBpbmcKICAgICAgICAgICAgdmFsdWVzID0gbGlzdChpdGVydmFsdWVzKHNlbGYuX2NvbnRhaW5lcikpCiAgICAgICAgICAgIHNlbGYuX2NvbnRhaW5lci5jbGVhcigpCgogICAgICAgIGlmIHNlbGYuZGlzcG9zZV9mdW5jOgogICAgICAgICAgICBmb3IgdmFsdWUgaW4gdmFsdWVzOgogICAgICAgICAgICAgICAgc2VsZi5kaXNwb3NlX2Z1bmModmFsdWUpCgogICAgZGVmIGtleXMoc2VsZik6CiAgICAgICAgd2l0aCBzZWxmLmxvY2s6CiAgICAgICAgICAgIHJldHVybiBsaXN0KGl0ZXJrZXlzKHNlbGYuX2NvbnRhaW5lcikpCgoKY2xhc3MgSFRUUEhlYWRlckRpY3QoTXV0YWJsZU1hcHBpbmcpOgogICAgIiIiCiAgICA6cGFyYW0gaGVhZGVyczoKICAgICAgICBBbiBpdGVyYWJsZSBvZiBmaWVsZC12YWx1ZSBwYWlycy4gTXVzdCBub3QgY29udGFpbiBtdWx0aXBsZSBmaWVsZCBuYW1lcwogICAgICAgIHdoZW4gY29tcGFyZWQgY2FzZS1pbnNlbnNpdGl2ZWx5LgoKICAgIDpwYXJhbSBrd2FyZ3M6CiAgICAgICAgQWRkaXRpb25hbCBmaWVsZC12YWx1ZSBwYWlycyB0byBwYXNzIGluIHRvIGBgZGljdC51cGRhdGVgYC4KCiAgICBBIGBgZGljdGBgIGxpa2UgY29udGFpbmVyIGZvciBzdG9yaW5nIEhUVFAgSGVhZGVycy4KCiAgICBGaWVsZCBuYW1lcyBhcmUgc3RvcmVkIGFuZCBjb21wYXJlZCBjYXNlLWluc2Vuc2l0aXZlbHkgaW4gY29tcGxpYW5jZSB3aXRoCiAgICBSRkMgNzIzMC4gSXRlcmF0aW9uIHByb3ZpZGVzIHRoZSBmaXJzdCBjYXNlLXNlbnNpdGl2ZSBrZXkgc2VlbiBmb3IgZWFjaAogICAgY2FzZS1pbnNlbnNpdGl2ZSBwYWlyLgoKICAgIFVzaW5nIGBgX19zZXRpdGVtX19gYCBzeW50YXggb3ZlcndyaXRlcyBmaWVsZHMgdGhhdCBjb21wYXJlIGVxdWFsCiAgICBjYXNlLWluc2Vuc2l0aXZlbHkgaW4gb3JkZXIgdG8gbWFpbnRhaW4gYGBkaWN0YGAncyBhcGkuIEZvciBmaWVsZHMgdGhhdAogICAgY29tcGFyZSBlcXVhbCwgaW5zdGVhZCBjcmVhdGUgYSBuZXcgYGBIVFRQSGVhZGVyRGljdGBgIGFuZCB1c2UgYGAuYWRkYGAKICAgIGluIGEgbG9vcC4KCiAgICBJZiBtdWx0aXBsZSBmaWVsZHMgdGhhdCBhcmUgZXF1YWwgY2FzZS1pbnNlbnNpdGl2ZWx5IGFyZSBwYXNzZWQgdG8gdGhlCiAgICBjb25zdHJ1Y3RvciBvciBgYC51cGRhdGVgYCwgdGhlIGJlaGF2aW9yIGlzIHVuZGVmaW5lZCBhbmQgc29tZSB3aWxsIGJlCiAgICBsb3N0LgoKICAgID4+PiBoZWFkZXJzID0gSFRUUEhlYWRlckRpY3QoKQogICAgPj4+IGhlYWRlcnMuYWRkKCdTZXQtQ29va2llJywgJ2Zvbz1iYXInKQogICAgPj4+IGhlYWRlcnMuYWRkKCdzZXQtY29va2llJywgJ2Jhej1xdXh4JykKICAgID4+PiBoZWFkZXJzWydjb250ZW50LWxlbmd0aCddID0gJzcnCiAgICA+Pj4gaGVhZGVyc1snU0VULWNvb2tpZSddCiAgICAnZm9vPWJhciwgYmF6PXF1eHgnCiAgICA+Pj4gaGVhZGVyc1snQ29udGVudC1MZW5ndGgnXQogICAgJzcnCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgaGVhZGVycz1Ob25lLCAqKmt3YXJncyk6CiAgICAgICAgc3VwZXIoSFRUUEhlYWRlckRpY3QsIHNlbGYpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLl9jb250YWluZXIgPSBPcmRlcmVkRGljdCgpCiAgICAgICAgaWYgaGVhZGVycyBpcyBub3QgTm9uZToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShoZWFkZXJzLCBIVFRQSGVhZGVyRGljdCk6CiAgICAgICAgICAgICAgICBzZWxmLl9jb3B5X2Zyb20oaGVhZGVycykKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuZXh0ZW5kKGhlYWRlcnMpCiAgICAgICAgaWYga3dhcmdzOgogICAgICAgICAgICBzZWxmLmV4dGVuZChrd2FyZ3MpCgogICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsKToKICAgICAgICBzZWxmLl9jb250YWluZXJba2V5Lmxvd2VyKCldID0gW2tleSwgdmFsXQogICAgICAgIHJldHVybiBzZWxmLl9jb250YWluZXJba2V5Lmxvd2VyKCldCgogICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CiAgICAgICAgdmFsID0gc2VsZi5fY29udGFpbmVyW2tleS5sb3dlcigpXQogICAgICAgIHJldHVybiAnLCAnLmpvaW4odmFsWzE6XSkKCiAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwga2V5KToKICAgICAgICBkZWwgc2VsZi5fY29udGFpbmVyW2tleS5sb3dlcigpXQoKICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwga2V5KToKICAgICAgICByZXR1cm4ga2V5Lmxvd2VyKCkgaW4gc2VsZi5fY29udGFpbmVyCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIE1hcHBpbmcpIGFuZCBub3QgaGFzYXR0cihvdGhlciwgJ2tleXMnKToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIHR5cGUoc2VsZikpOgogICAgICAgICAgICBvdGhlciA9IHR5cGUoc2VsZikob3RoZXIpCiAgICAgICAgcmV0dXJuIChkaWN0KChrLmxvd2VyKCksIHYpIGZvciBrLCB2IGluIHNlbGYuaXRlcm1lcmdlZCgpKSA9PQogICAgICAgICAgICAgICAgZGljdCgoay5sb3dlcigpLCB2KSBmb3IgaywgdiBpbiBvdGhlci5pdGVybWVyZ2VkKCkpKQoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBub3Qgc2VsZi5fX2VxX18ob3RoZXIpCgogICAgaWYgbm90IFBZMzogICMgUHl0aG9uIDIKICAgICAgICBpdGVya2V5cyA9IE11dGFibGVNYXBwaW5nLml0ZXJrZXlzCiAgICAgICAgaXRlcnZhbHVlcyA9IE11dGFibGVNYXBwaW5nLml0ZXJ2YWx1ZXMKCiAgICBfX21hcmtlciA9IG9iamVjdCgpCgogICAgZGVmIF9fbGVuX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGxlbihzZWxmLl9jb250YWluZXIpCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgICMgT25seSBwcm92aWRlIHRoZSBvcmlnaW5hbGx5IGNhc2VkIG5hbWVzCiAgICAgICAgZm9yIHZhbHMgaW4gc2VsZi5fY29udGFpbmVyLnZhbHVlcygpOgogICAgICAgICAgICB5aWVsZCB2YWxzWzBdCgogICAgZGVmIHBvcChzZWxmLCBrZXksIGRlZmF1bHQ9X19tYXJrZXIpOgogICAgICAgICcnJ0QucG9wKGtbLGRdKSAtPiB2LCByZW1vdmUgc3BlY2lmaWVkIGtleSBhbmQgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlLgogICAgICAgICAgSWYga2V5IGlzIG5vdCBmb3VuZCwgZCBpcyByZXR1cm5lZCBpZiBnaXZlbiwgb3RoZXJ3aXNlIEtleUVycm9yIGlzIHJhaXNlZC4KICAgICAgICAnJycKICAgICAgICAjIFVzaW5nIHRoZSBNdXRhYmxlTWFwcGluZyBmdW5jdGlvbiBkaXJlY3RseSBmYWlscyBkdWUgdG8gdGhlIHByaXZhdGUgbWFya2VyLgogICAgICAgICMgVXNpbmcgb3JkaW5hcnkgZGljdC5wb3Agd291bGQgZXhwb3NlIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmVzLgogICAgICAgICMgU28gbGV0J3MgcmVpbnZlbnQgdGhlIHdoZWVsLgogICAgICAgIHRyeToKICAgICAgICAgICAgdmFsdWUgPSBzZWxmW2tleV0KICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgIGlmIGRlZmF1bHQgaXMgc2VsZi5fX21hcmtlcjoKICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0CiAgICAgICAgZWxzZToKICAgICAgICAgICAgZGVsIHNlbGZba2V5XQogICAgICAgICAgICByZXR1cm4gdmFsdWUKCiAgICBkZWYgZGlzY2FyZChzZWxmLCBrZXkpOgogICAgICAgIHRyeToKICAgICAgICAgICAgZGVsIHNlbGZba2V5XQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgcGFzcwoKICAgIGRlZiBhZGQoc2VsZiwga2V5LCB2YWwpOgogICAgICAgICIiIkFkZHMgYSAobmFtZSwgdmFsdWUpIHBhaXIsIGRvZXNuJ3Qgb3ZlcndyaXRlIHRoZSB2YWx1ZSBpZiBpdCBhbHJlYWR5CiAgICAgICAgZXhpc3RzLgoKICAgICAgICA+Pj4gaGVhZGVycyA9IEhUVFBIZWFkZXJEaWN0KGZvbz0nYmFyJykKICAgICAgICA+Pj4gaGVhZGVycy5hZGQoJ0ZvbycsICdiYXonKQogICAgICAgID4+PiBoZWFkZXJzWydmb28nXQogICAgICAgICdiYXIsIGJheicKICAgICAgICAiIiIKICAgICAgICBrZXlfbG93ZXIgPSBrZXkubG93ZXIoKQogICAgICAgIG5ld192YWxzID0gW2tleSwgdmFsXQogICAgICAgICMgS2VlcCB0aGUgY29tbW9uIGNhc2UgYWthIG5vIGl0ZW0gcHJlc2VudCBhcyBmYXN0IGFzIHBvc3NpYmxlCiAgICAgICAgdmFscyA9IHNlbGYuX2NvbnRhaW5lci5zZXRkZWZhdWx0KGtleV9sb3dlciwgbmV3X3ZhbHMpCiAgICAgICAgaWYgbmV3X3ZhbHMgaXMgbm90IHZhbHM6CiAgICAgICAgICAgIHZhbHMuYXBwZW5kKHZhbCkKCiAgICBkZWYgZXh0ZW5kKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgIiIiR2VuZXJpYyBpbXBvcnQgZnVuY3Rpb24gZm9yIGFueSB0eXBlIG9mIGhlYWRlci1saWtlIG9iamVjdC4KICAgICAgICBBZGFwdGVkIHZlcnNpb24gb2YgTXV0YWJsZU1hcHBpbmcudXBkYXRlIGluIG9yZGVyIHRvIGluc2VydCBpdGVtcwogICAgICAgIHdpdGggc2VsZi5hZGQgaW5zdGVhZCBvZiBzZWxmLl9fc2V0aXRlbV9fCiAgICAgICAgIiIiCiAgICAgICAgaWYgbGVuKGFyZ3MpID4gMToKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJleHRlbmQoKSB0YWtlcyBhdCBtb3N0IDEgcG9zaXRpb25hbCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJndW1lbnRzICh7MH0gZ2l2ZW4pIi5mb3JtYXQobGVuKGFyZ3MpKSkKICAgICAgICBvdGhlciA9IGFyZ3NbMF0gaWYgbGVuKGFyZ3MpID49IDEgZWxzZSAoKQoKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBIVFRQSGVhZGVyRGljdCk6CiAgICAgICAgICAgIGZvciBrZXksIHZhbCBpbiBvdGhlci5pdGVyaXRlbXMoKToKICAgICAgICAgICAgICAgIHNlbGYuYWRkKGtleSwgdmFsKQogICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdGhlciwgTWFwcGluZyk6CiAgICAgICAgICAgIGZvciBrZXkgaW4gb3RoZXI6CiAgICAgICAgICAgICAgICBzZWxmLmFkZChrZXksIG90aGVyW2tleV0pCiAgICAgICAgZWxpZiBoYXNhdHRyKG90aGVyLCAia2V5cyIpOgogICAgICAgICAgICBmb3Iga2V5IGluIG90aGVyLmtleXMoKToKICAgICAgICAgICAgICAgIHNlbGYuYWRkKGtleSwgb3RoZXJba2V5XSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBvdGhlcjoKICAgICAgICAgICAgICAgIHNlbGYuYWRkKGtleSwgdmFsdWUpCgogICAgICAgIGZvciBrZXksIHZhbHVlIGluIGt3YXJncy5pdGVtcygpOgogICAgICAgICAgICBzZWxmLmFkZChrZXksIHZhbHVlKQoKICAgIGRlZiBnZXRsaXN0KHNlbGYsIGtleSwgZGVmYXVsdD1fX21hcmtlcik6CiAgICAgICAgIiIiUmV0dXJucyBhIGxpc3Qgb2YgYWxsIHRoZSB2YWx1ZXMgZm9yIHRoZSBuYW1lZCBmaWVsZC4gUmV0dXJucyBhbgogICAgICAgIGVtcHR5IGxpc3QgaWYgdGhlIGtleSBkb2Vzbid0IGV4aXN0LiIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgdmFscyA9IHNlbGYuX2NvbnRhaW5lcltrZXkubG93ZXIoKV0KICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgIGlmIGRlZmF1bHQgaXMgc2VsZi5fX21hcmtlcjoKICAgICAgICAgICAgICAgIHJldHVybiBbXQogICAgICAgICAgICByZXR1cm4gZGVmYXVsdAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiB2YWxzWzE6XQoKICAgICMgQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIGh0dHBsaWIKICAgIGdldGhlYWRlcnMgPSBnZXRsaXN0CiAgICBnZXRhbGxtYXRjaGluZ2hlYWRlcnMgPSBnZXRsaXN0CiAgICBpZ2V0ID0gZ2V0bGlzdAoKICAgICMgQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIGh0dHAuY29va2llamFyCiAgICBnZXRfYWxsID0gZ2V0bGlzdAoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIiVzKCVzKSIgJSAodHlwZShzZWxmKS5fX25hbWVfXywgZGljdChzZWxmLml0ZXJtZXJnZWQoKSkpCgogICAgZGVmIF9jb3B5X2Zyb20oc2VsZiwgb3RoZXIpOgogICAgICAgIGZvciBrZXkgaW4gb3RoZXI6CiAgICAgICAgICAgIHZhbCA9IG90aGVyLmdldGxpc3Qoa2V5KQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZhbCwgbGlzdCk6CiAgICAgICAgICAgICAgICAjIERvbid0IG5lZWQgdG8gY29udmVydCB0dXBsZXMKICAgICAgICAgICAgICAgIHZhbCA9IGxpc3QodmFsKQogICAgICAgICAgICBzZWxmLl9jb250YWluZXJba2V5Lmxvd2VyKCldID0gW2tleV0gKyB2YWwKCiAgICBkZWYgY29weShzZWxmKToKICAgICAgICBjbG9uZSA9IHR5cGUoc2VsZikoKQogICAgICAgIGNsb25lLl9jb3B5X2Zyb20oc2VsZikKICAgICAgICByZXR1cm4gY2xvbmUKCiAgICBkZWYgaXRlcml0ZW1zKHNlbGYpOgogICAgICAgICIiIkl0ZXJhdGUgb3ZlciBhbGwgaGVhZGVyIGxpbmVzLCBpbmNsdWRpbmcgZHVwbGljYXRlIG9uZXMuIiIiCiAgICAgICAgZm9yIGtleSBpbiBzZWxmOgogICAgICAgICAgICB2YWxzID0gc2VsZi5fY29udGFpbmVyW2tleS5sb3dlcigpXQogICAgICAgICAgICBmb3IgdmFsIGluIHZhbHNbMTpdOgogICAgICAgICAgICAgICAgeWllbGQgdmFsc1swXSwgdmFsCgogICAgZGVmIGl0ZXJtZXJnZWQoc2VsZik6CiAgICAgICAgIiIiSXRlcmF0ZSBvdmVyIGFsbCBoZWFkZXJzLCBtZXJnaW5nIGR1cGxpY2F0ZSBvbmVzIHRvZ2V0aGVyLiIiIgogICAgICAgIGZvciBrZXkgaW4gc2VsZjoKICAgICAgICAgICAgdmFsID0gc2VsZi5fY29udGFpbmVyW2tleS5sb3dlcigpXQogICAgICAgICAgICB5aWVsZCB2YWxbMF0sICcsICcuam9pbih2YWxbMTpdKQoKICAgIGRlZiBpdGVtcyhzZWxmKToKICAgICAgICByZXR1cm4gbGlzdChzZWxmLml0ZXJpdGVtcygpKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGZyb21faHR0cGxpYihjbHMsIG1lc3NhZ2UpOiAgIyBQeXRob24gMgogICAgICAgICIiIlJlYWQgaGVhZGVycyBmcm9tIGEgUHl0aG9uIDIgaHR0cGxpYiBtZXNzYWdlIG9iamVjdC4iIiIKICAgICAgICAjIHB5dGhvbjIuNyBkb2VzIG5vdCBleHBvc2UgYSBwcm9wZXIgQVBJIGZvciBleHBvcnRpbmcgbXVsdGloZWFkZXJzCiAgICAgICAgIyBlZmZpY2llbnRseS4gVGhpcyBmdW5jdGlvbiByZS1yZWFkcyByYXcgbGluZXMgZnJvbSB0aGUgbWVzc2FnZQogICAgICAgICMgb2JqZWN0IGFuZCBleHRyYWN0cyB0aGUgbXVsdGloZWFkZXJzIHByb3Blcmx5LgogICAgICAgIGhlYWRlcnMgPSBbXQoKICAgICAgICBmb3IgbGluZSBpbiBtZXNzYWdlLmhlYWRlcnM6CiAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgoJyAnLCAnXHQnKSk6CiAgICAgICAgICAgICAgICBrZXksIHZhbHVlID0gaGVhZGVyc1stMV0KICAgICAgICAgICAgICAgIGhlYWRlcnNbLTFdID0gKGtleSwgdmFsdWUgKyAnXHJcbicgKyBsaW5lLnJzdHJpcCgpKQogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIGtleSwgdmFsdWUgPSBsaW5lLnNwbGl0KCc6JywgMSkKICAgICAgICAgICAgaGVhZGVycy5hcHBlbmQoKGtleSwgdmFsdWUuc3RyaXAoKSkpCgogICAgICAgIHJldHVybiBjbHMoaGVhZGVycykKUEsDBBQAAAAAAAAAIQBghK6nyzIAAMsyAAAxAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvY29ubmVjdGlvbi5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CmltcG9ydCBkYXRldGltZQppbXBvcnQgbG9nZ2luZwppbXBvcnQgb3MKaW1wb3J0IHN5cwppbXBvcnQgc29ja2V0CmZyb20gc29ja2V0IGltcG9ydCBlcnJvciBhcyBTb2NrZXRFcnJvciwgdGltZW91dCBhcyBTb2NrZXRUaW1lb3V0CmltcG9ydCB3YXJuaW5ncwpmcm9tIC5wYWNrYWdlcyBpbXBvcnQgc2l4CmZyb20gLnBhY2thZ2VzLnNpeC5tb3Zlcy5odHRwX2NsaWVudCBpbXBvcnQgSFRUUENvbm5lY3Rpb24gYXMgX0hUVFBDb25uZWN0aW9uCmZyb20gLnBhY2thZ2VzLnNpeC5tb3Zlcy5odHRwX2NsaWVudCBpbXBvcnQgSFRUUEV4Y2VwdGlvbiAgIyBub3FhOiBGNDAxCgp0cnk6ICAjIENvbXBpbGVkIHdpdGggU1NMPwogICAgaW1wb3J0IHNzbAogICAgQmFzZVNTTEVycm9yID0gc3NsLlNTTEVycm9yCmV4Y2VwdCAoSW1wb3J0RXJyb3IsIEF0dHJpYnV0ZUVycm9yKTogICMgUGxhdGZvcm0tc3BlY2lmaWM6IE5vIFNTTC4KICAgIHNzbCA9IE5vbmUKCiAgICBjbGFzcyBCYXNlU1NMRXJyb3IoQmFzZUV4Y2VwdGlvbik6CiAgICAgICAgcGFzcwoKCnRyeTogICMgUHl0aG9uIDM6CiAgICAjIE5vdCBhIG5vLW9wLCB3ZSdyZSBhZGRpbmcgdGhpcyB0byB0aGUgbmFtZXNwYWNlIHNvIGl0IGNhbiBiZSBpbXBvcnRlZC4KICAgIENvbm5lY3Rpb25FcnJvciA9IENvbm5lY3Rpb25FcnJvcgpleGNlcHQgTmFtZUVycm9yOiAgIyBQeXRob24gMjoKICAgIGNsYXNzIENvbm5lY3Rpb25FcnJvcihFeGNlcHRpb24pOgogICAgICAgIHBhc3MKCgpmcm9tIC5leGNlcHRpb25zIGltcG9ydCAoCiAgICBOZXdDb25uZWN0aW9uRXJyb3IsCiAgICBDb25uZWN0VGltZW91dEVycm9yLAogICAgU3ViamVjdEFsdE5hbWVXYXJuaW5nLAogICAgU3lzdGVtVGltZVdhcm5pbmcsCikKZnJvbSAucGFja2FnZXMuc3NsX21hdGNoX2hvc3RuYW1lIGltcG9ydCBtYXRjaF9ob3N0bmFtZSwgQ2VydGlmaWNhdGVFcnJvcgoKZnJvbSAudXRpbC5zc2xfIGltcG9ydCAoCiAgICByZXNvbHZlX2NlcnRfcmVxcywKICAgIHJlc29sdmVfc3NsX3ZlcnNpb24sCiAgICBhc3NlcnRfZmluZ2VycHJpbnQsCiAgICBjcmVhdGVfdXJsbGliM19jb250ZXh0LAogICAgc3NsX3dyYXBfc29ja2V0CikKCgpmcm9tIC51dGlsIGltcG9ydCBjb25uZWN0aW9uCgpmcm9tIC5fY29sbGVjdGlvbnMgaW1wb3J0IEhUVFBIZWFkZXJEaWN0Cgpsb2cgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCnBvcnRfYnlfc2NoZW1lID0gewogICAgJ2h0dHAnOiA4MCwKICAgICdodHRwcyc6IDQ0MywKfQoKIyBXaGVuIHVwZGF0aW5nIFJFQ0VOVF9EQVRFLCBtb3ZlIGl0IHRvCiMgd2l0aGluIHR3byB5ZWFycyBvZiB0aGUgY3VycmVudCBkYXRlLCBhbmQgbm8KIyBlYXJsaWVyIHRoYW4gNiBtb250aHMgYWdvLgpSRUNFTlRfREFURSA9IGRhdGV0aW1lLmRhdGUoMjAxNiwgMSwgMSkKCgpjbGFzcyBEdW1teUNvbm5lY3Rpb24ob2JqZWN0KToKICAgICIiIlVzZWQgdG8gZGV0ZWN0IGEgZmFpbGVkIENvbm5lY3Rpb25DbHMgaW1wb3J0LiIiIgogICAgcGFzcwoKCmNsYXNzIEhUVFBDb25uZWN0aW9uKF9IVFRQQ29ubmVjdGlvbiwgb2JqZWN0KToKICAgICIiIgogICAgQmFzZWQgb24gaHR0cGxpYi5IVFRQQ29ubmVjdGlvbiBidXQgcHJvdmlkZXMgYW4gZXh0cmEgY29uc3RydWN0b3IKICAgIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IGxheWVyIGJldHdlZW4gb2xkZXIgYW5kIG5ld2VyIFB5dGhvbnMuCgogICAgQWRkaXRpb25hbCBrZXl3b3JkIHBhcmFtZXRlcnMgYXJlIHVzZWQgdG8gY29uZmlndXJlIGF0dHJpYnV0ZXMgb2YgdGhlIGNvbm5lY3Rpb24uCiAgICBBY2NlcHRlZCBwYXJhbWV0ZXJzIGluY2x1ZGU6CgogICAgICAtIGBgc3RyaWN0YGA6IFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvbiA6Y2xhc3M6YHVybGxpYjMuY29ubmVjdGlvbnBvb2wuSFRUUENvbm5lY3Rpb25Qb29sYAogICAgICAtIGBgc291cmNlX2FkZHJlc3NgYDogU2V0IHRoZSBzb3VyY2UgYWRkcmVzcyBmb3IgdGhlIGN1cnJlbnQgY29ubmVjdGlvbi4KCiAgICAgICAgLi4gbm90ZTo6IFRoaXMgaXMgaWdub3JlZCBmb3IgUHl0aG9uIDIuNi4gSXQgaXMgb25seSBhcHBsaWVkIGZvciAyLjcgYW5kIDMueAoKICAgICAgLSBgYHNvY2tldF9vcHRpb25zYGA6IFNldCBzcGVjaWZpYyBvcHRpb25zIG9uIHRoZSB1bmRlcmx5aW5nIHNvY2tldC4gSWYgbm90IHNwZWNpZmllZCwgdGhlbgogICAgICAgIGRlZmF1bHRzIGFyZSBsb2FkZWQgZnJvbSBgYEhUVFBDb25uZWN0aW9uLmRlZmF1bHRfc29ja2V0X29wdGlvbnNgYCB3aGljaCBpbmNsdWRlcyBkaXNhYmxpbmcKICAgICAgICBOYWdsZSdzIGFsZ29yaXRobSAoc2V0cyBUQ1BfTk9ERUxBWSB0byAxKSB1bmxlc3MgdGhlIGNvbm5lY3Rpb24gaXMgYmVoaW5kIGEgcHJveHkuCgogICAgICAgIEZvciBleGFtcGxlLCBpZiB5b3Ugd2lzaCB0byBlbmFibGUgVENQIEtlZXAgQWxpdmUgaW4gYWRkaXRpb24gdG8gdGhlIGRlZmF1bHRzLAogICAgICAgIHlvdSBtaWdodCBwYXNzOjoKCiAgICAgICAgICAgIEhUVFBDb25uZWN0aW9uLmRlZmF1bHRfc29ja2V0X29wdGlvbnMgKyBbCiAgICAgICAgICAgICAgICAoc29ja2V0LlNPTF9TT0NLRVQsIHNvY2tldC5TT19LRUVQQUxJVkUsIDEpLAogICAgICAgICAgICBdCgogICAgICAgIE9yIHlvdSBtYXkgd2FudCB0byBkaXNhYmxlIHRoZSBkZWZhdWx0cyBieSBwYXNzaW5nIGFuIGVtcHR5IGxpc3QgKGUuZy4sIGBgW11gYCkuCiAgICAiIiIKCiAgICBkZWZhdWx0X3BvcnQgPSBwb3J0X2J5X3NjaGVtZVsnaHR0cCddCgogICAgIzogRGlzYWJsZSBOYWdsZSdzIGFsZ29yaXRobSBieSBkZWZhdWx0LgogICAgIzogYGBbKHNvY2tldC5JUFBST1RPX1RDUCwgc29ja2V0LlRDUF9OT0RFTEFZLCAxKV1gYAogICAgZGVmYXVsdF9zb2NrZXRfb3B0aW9ucyA9IFsoc29ja2V0LklQUFJPVE9fVENQLCBzb2NrZXQuVENQX05PREVMQVksIDEpXQoKICAgICM6IFdoZXRoZXIgdGhpcyBjb25uZWN0aW9uIHZlcmlmaWVzIHRoZSBob3N0J3MgY2VydGlmaWNhdGUuCiAgICBpc192ZXJpZmllZCA9IEZhbHNlCgogICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3KToKICAgICAgICBpZiBzaXguUFkzOiAgIyBQeXRob24gMwogICAgICAgICAgICBrdy5wb3AoJ3N0cmljdCcsIE5vbmUpCgogICAgICAgICMgUHJlLXNldCBzb3VyY2VfYWRkcmVzcyBpbiBjYXNlIHdlIGhhdmUgYW4gb2xkZXIgUHl0aG9uIGxpa2UgMi42LgogICAgICAgIHNlbGYuc291cmNlX2FkZHJlc3MgPSBrdy5nZXQoJ3NvdXJjZV9hZGRyZXNzJykKCiAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mbyA8ICgyLCA3KTogICMgUHl0aG9uIDIuNgogICAgICAgICAgICAjIF9IVFRQQ29ubmVjdGlvbiBvbiBQeXRob24gMi42IHdpbGwgYmFsayBhdCB0aGlzIGtleXdvcmQgYXJnLCBidXQKICAgICAgICAgICAgIyBub3QgbmV3ZXIgdmVyc2lvbnMuIFdlIGNhbiBzdGlsbCB1c2UgaXQgd2hlbiBjcmVhdGluZyBhCiAgICAgICAgICAgICMgY29ubmVjdGlvbiB0aG91Z2gsIHNvIHdlIHBvcCBpdCAqYWZ0ZXIqIHdlIGhhdmUgc2F2ZWQgaXQgYXMKICAgICAgICAgICAgIyBzZWxmLnNvdXJjZV9hZGRyZXNzLgogICAgICAgICAgICBrdy5wb3AoJ3NvdXJjZV9hZGRyZXNzJywgTm9uZSkKCiAgICAgICAgIzogVGhlIHNvY2tldCBvcHRpb25zIHByb3ZpZGVkIGJ5IHRoZSB1c2VyLiBJZiBubyBvcHRpb25zIGFyZQogICAgICAgICM6IHByb3ZpZGVkLCB3ZSB1c2UgdGhlIGRlZmF1bHQgb3B0aW9ucy4KICAgICAgICBzZWxmLnNvY2tldF9vcHRpb25zID0ga3cucG9wKCdzb2NrZXRfb3B0aW9ucycsIHNlbGYuZGVmYXVsdF9zb2NrZXRfb3B0aW9ucykKCiAgICAgICAgIyBTdXBlcmNsYXNzIGFsc28gc2V0cyBzZWxmLnNvdXJjZV9hZGRyZXNzIGluIFB5dGhvbiAyLjcrLgogICAgICAgIF9IVFRQQ29ubmVjdGlvbi5fX2luaXRfXyhzZWxmLCAqYXJncywgKiprdykKCiAgICBkZWYgX25ld19jb25uKHNlbGYpOgogICAgICAgICIiIiBFc3RhYmxpc2ggYSBzb2NrZXQgY29ubmVjdGlvbiBhbmQgc2V0IG5vZGVsYXkgc2V0dGluZ3Mgb24gaXQuCgogICAgICAgIDpyZXR1cm46IE5ldyBzb2NrZXQgY29ubmVjdGlvbi4KICAgICAgICAiIiIKICAgICAgICBleHRyYV9rdyA9IHt9CiAgICAgICAgaWYgc2VsZi5zb3VyY2VfYWRkcmVzczoKICAgICAgICAgICAgZXh0cmFfa3dbJ3NvdXJjZV9hZGRyZXNzJ10gPSBzZWxmLnNvdXJjZV9hZGRyZXNzCgogICAgICAgIGlmIHNlbGYuc29ja2V0X29wdGlvbnM6CiAgICAgICAgICAgIGV4dHJhX2t3Wydzb2NrZXRfb3B0aW9ucyddID0gc2VsZi5zb2NrZXRfb3B0aW9ucwoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGNvbm4gPSBjb25uZWN0aW9uLmNyZWF0ZV9jb25uZWN0aW9uKAogICAgICAgICAgICAgICAgKHNlbGYuaG9zdCwgc2VsZi5wb3J0KSwgc2VsZi50aW1lb3V0LCAqKmV4dHJhX2t3KQoKICAgICAgICBleGNlcHQgU29ja2V0VGltZW91dCBhcyBlOgogICAgICAgICAgICByYWlzZSBDb25uZWN0VGltZW91dEVycm9yKAogICAgICAgICAgICAgICAgc2VsZiwgIkNvbm5lY3Rpb24gdG8gJXMgdGltZWQgb3V0LiAoY29ubmVjdCB0aW1lb3V0PSVzKSIgJQogICAgICAgICAgICAgICAgKHNlbGYuaG9zdCwgc2VsZi50aW1lb3V0KSkKCiAgICAgICAgZXhjZXB0IFNvY2tldEVycm9yIGFzIGU6CiAgICAgICAgICAgIHJhaXNlIE5ld0Nvbm5lY3Rpb25FcnJvcigKICAgICAgICAgICAgICAgIHNlbGYsICJGYWlsZWQgdG8gZXN0YWJsaXNoIGEgbmV3IGNvbm5lY3Rpb246ICVzIiAlIGUpCgogICAgICAgIHJldHVybiBjb25uCgogICAgZGVmIF9wcmVwYXJlX2Nvbm4oc2VsZiwgY29ubik6CiAgICAgICAgc2VsZi5zb2NrID0gY29ubgogICAgICAgICMgdGhlIF90dW5uZWxfaG9zdCBhdHRyaWJ1dGUgd2FzIGFkZGVkIGluIHB5dGhvbiAyLjYuMyAodmlhCiAgICAgICAgIyBodHRwOi8vaGcucHl0aG9uLm9yZy9jcHl0aG9uL3Jldi8wZjU3YjMwYTE1MmYpIHNvIHB5dGhvbnMgMi42KDAtMikgZG8KICAgICAgICAjIG5vdCBoYXZlIHRoZW0uCiAgICAgICAgaWYgZ2V0YXR0cihzZWxmLCAnX3R1bm5lbF9ob3N0JywgTm9uZSk6CiAgICAgICAgICAgICMgVE9ETzogRml4IHR1bm5lbCBzbyBpdCBkb2Vzbid0IGRlcGVuZCBvbiBzZWxmLnNvY2sgc3RhdGUuCiAgICAgICAgICAgIHNlbGYuX3R1bm5lbCgpCiAgICAgICAgICAgICMgTWFyayB0aGlzIGNvbm5lY3Rpb24gYXMgbm90IHJldXNhYmxlCiAgICAgICAgICAgIHNlbGYuYXV0b19vcGVuID0gMAoKICAgIGRlZiBjb25uZWN0KHNlbGYpOgogICAgICAgIGNvbm4gPSBzZWxmLl9uZXdfY29ubigpCiAgICAgICAgc2VsZi5fcHJlcGFyZV9jb25uKGNvbm4pCgogICAgZGVmIHJlcXVlc3RfY2h1bmtlZChzZWxmLCBtZXRob2QsIHVybCwgYm9keT1Ob25lLCBoZWFkZXJzPU5vbmUpOgogICAgICAgICIiIgogICAgICAgIEFsdGVybmF0aXZlIHRvIHRoZSBjb21tb24gcmVxdWVzdCBtZXRob2QsIHdoaWNoIHNlbmRzIHRoZQogICAgICAgIGJvZHkgd2l0aCBjaHVua2VkIGVuY29kaW5nIGFuZCBub3QgYXMgb25lIGJsb2NrCiAgICAgICAgIiIiCiAgICAgICAgaGVhZGVycyA9IEhUVFBIZWFkZXJEaWN0KGhlYWRlcnMgaWYgaGVhZGVycyBpcyBub3QgTm9uZSBlbHNlIHt9KQogICAgICAgIHNraXBfYWNjZXB0X2VuY29kaW5nID0gJ2FjY2VwdC1lbmNvZGluZycgaW4gaGVhZGVycwogICAgICAgIHNraXBfaG9zdCA9ICdob3N0JyBpbiBoZWFkZXJzCiAgICAgICAgc2VsZi5wdXRyZXF1ZXN0KAogICAgICAgICAgICBtZXRob2QsCiAgICAgICAgICAgIHVybCwKICAgICAgICAgICAgc2tpcF9hY2NlcHRfZW5jb2Rpbmc9c2tpcF9hY2NlcHRfZW5jb2RpbmcsCiAgICAgICAgICAgIHNraXBfaG9zdD1za2lwX2hvc3QKICAgICAgICApCiAgICAgICAgZm9yIGhlYWRlciwgdmFsdWUgaW4gaGVhZGVycy5pdGVtcygpOgogICAgICAgICAgICBzZWxmLnB1dGhlYWRlcihoZWFkZXIsIHZhbHVlKQogICAgICAgIGlmICd0cmFuc2Zlci1lbmNvZGluZycgbm90IGluIGhlYWRlcnM6CiAgICAgICAgICAgIHNlbGYucHV0aGVhZGVyKCdUcmFuc2Zlci1FbmNvZGluZycsICdjaHVua2VkJykKICAgICAgICBzZWxmLmVuZGhlYWRlcnMoKQoKICAgICAgICBpZiBib2R5IGlzIG5vdCBOb25lOgogICAgICAgICAgICBzdHJpbmdpc2hfdHlwZXMgPSBzaXguc3RyaW5nX3R5cGVzICsgKHNpeC5iaW5hcnlfdHlwZSwpCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYm9keSwgc3RyaW5naXNoX3R5cGVzKToKICAgICAgICAgICAgICAgIGJvZHkgPSAoYm9keSwpCiAgICAgICAgICAgIGZvciBjaHVuayBpbiBib2R5OgogICAgICAgICAgICAgICAgaWYgbm90IGNodW5rOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShjaHVuaywgc2l4LmJpbmFyeV90eXBlKToKICAgICAgICAgICAgICAgICAgICBjaHVuayA9IGNodW5rLmVuY29kZSgndXRmOCcpCiAgICAgICAgICAgICAgICBsZW5fc3RyID0gaGV4KGxlbihjaHVuaykpWzI6XQogICAgICAgICAgICAgICAgc2VsZi5zZW5kKGxlbl9zdHIuZW5jb2RlKCd1dGYtOCcpKQogICAgICAgICAgICAgICAgc2VsZi5zZW5kKGInXHJcbicpCiAgICAgICAgICAgICAgICBzZWxmLnNlbmQoY2h1bmspCiAgICAgICAgICAgICAgICBzZWxmLnNlbmQoYidcclxuJykKCiAgICAgICAgIyBBZnRlciB0aGUgaWYgY2xhdXNlLCB0byBhbHdheXMgaGF2ZSBhIGNsb3NlZCBib2R5CiAgICAgICAgc2VsZi5zZW5kKGInMFxyXG5cclxuJykKCgpjbGFzcyBIVFRQU0Nvbm5lY3Rpb24oSFRUUENvbm5lY3Rpb24pOgogICAgZGVmYXVsdF9wb3J0ID0gcG9ydF9ieV9zY2hlbWVbJ2h0dHBzJ10KCiAgICBzc2xfdmVyc2lvbiA9IE5vbmUKCiAgICBkZWYgX19pbml0X18oc2VsZiwgaG9zdCwgcG9ydD1Ob25lLCBrZXlfZmlsZT1Ob25lLCBjZXJ0X2ZpbGU9Tm9uZSwKICAgICAgICAgICAgICAgICBzdHJpY3Q9Tm9uZSwgdGltZW91dD1zb2NrZXQuX0dMT0JBTF9ERUZBVUxUX1RJTUVPVVQsCiAgICAgICAgICAgICAgICAgc3NsX2NvbnRleHQ9Tm9uZSwgKiprdyk6CgogICAgICAgIEhUVFBDb25uZWN0aW9uLl9faW5pdF9fKHNlbGYsIGhvc3QsIHBvcnQsIHN0cmljdD1zdHJpY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dD10aW1lb3V0LCAqKmt3KQoKICAgICAgICBzZWxmLmtleV9maWxlID0ga2V5X2ZpbGUKICAgICAgICBzZWxmLmNlcnRfZmlsZSA9IGNlcnRfZmlsZQogICAgICAgIHNlbGYuc3NsX2NvbnRleHQgPSBzc2xfY29udGV4dAoKICAgICAgICAjIFJlcXVpcmVkIHByb3BlcnR5IGZvciBHb29nbGUgQXBwRW5naW5lIDEuOS4wIHdoaWNoIG90aGVyd2lzZSBjYXVzZXMKICAgICAgICAjIEhUVFBTIHJlcXVlc3RzIHRvIGdvIG91dCBhcyBIVFRQLiAoU2VlIElzc3VlICMzNTYpCiAgICAgICAgc2VsZi5fcHJvdG9jb2wgPSAnaHR0cHMnCgogICAgZGVmIGNvbm5lY3Qoc2VsZik6CiAgICAgICAgY29ubiA9IHNlbGYuX25ld19jb25uKCkKICAgICAgICBzZWxmLl9wcmVwYXJlX2Nvbm4oY29ubikKCiAgICAgICAgaWYgc2VsZi5zc2xfY29udGV4dCBpcyBOb25lOgogICAgICAgICAgICBzZWxmLnNzbF9jb250ZXh0ID0gY3JlYXRlX3VybGxpYjNfY29udGV4dCgKICAgICAgICAgICAgICAgIHNzbF92ZXJzaW9uPXJlc29sdmVfc3NsX3ZlcnNpb24oTm9uZSksCiAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9cmVzb2x2ZV9jZXJ0X3JlcXMoTm9uZSksCiAgICAgICAgICAgICkKCiAgICAgICAgc2VsZi5zb2NrID0gc3NsX3dyYXBfc29ja2V0KAogICAgICAgICAgICBzb2NrPWNvbm4sCiAgICAgICAgICAgIGtleWZpbGU9c2VsZi5rZXlfZmlsZSwKICAgICAgICAgICAgY2VydGZpbGU9c2VsZi5jZXJ0X2ZpbGUsCiAgICAgICAgICAgIHNzbF9jb250ZXh0PXNlbGYuc3NsX2NvbnRleHQsCiAgICAgICAgKQoKCmNsYXNzIFZlcmlmaWVkSFRUUFNDb25uZWN0aW9uKEhUVFBTQ29ubmVjdGlvbik6CiAgICAiIiIKICAgIEJhc2VkIG9uIGh0dHBsaWIuSFRUUFNDb25uZWN0aW9uIGJ1dCB3cmFwcyB0aGUgc29ja2V0IHdpdGgKICAgIFNTTCBjZXJ0aWZpY2F0aW9uLgogICAgIiIiCiAgICBjZXJ0X3JlcXMgPSBOb25lCiAgICBjYV9jZXJ0cyA9IE5vbmUKICAgIGNhX2NlcnRfZGlyID0gTm9uZQogICAgc3NsX3ZlcnNpb24gPSBOb25lCiAgICBhc3NlcnRfZmluZ2VycHJpbnQgPSBOb25lCgogICAgZGVmIHNldF9jZXJ0KHNlbGYsIGtleV9maWxlPU5vbmUsIGNlcnRfZmlsZT1Ob25lLAogICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1Ob25lLCBjYV9jZXJ0cz1Ob25lLAogICAgICAgICAgICAgICAgIGFzc2VydF9ob3N0bmFtZT1Ob25lLCBhc3NlcnRfZmluZ2VycHJpbnQ9Tm9uZSwKICAgICAgICAgICAgICAgICBjYV9jZXJ0X2Rpcj1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgb25jZSwgYmVmb3JlIHRoZSBjb25uZWN0aW9uIGlzIHVzZWQuCiAgICAgICAgIiIiCiAgICAgICAgIyBJZiBjZXJ0X3JlcXMgaXMgbm90IHByb3ZpZGVkLCB3ZSBjYW4gdHJ5IHRvIGd1ZXNzLiBJZiB0aGUgdXNlciBnYXZlCiAgICAgICAgIyB1cyBhIGNlcnQgZGF0YWJhc2UsIHdlIGFzc3VtZSB0aGV5IHdhbnQgdG8gdXNlIGl0OiBvdGhlcndpc2UsIGlmCiAgICAgICAgIyB0aGV5IGdhdmUgdXMgYW4gU1NMIENvbnRleHQgb2JqZWN0IHdlIHNob3VsZCB1c2Ugd2hhdGV2ZXIgaXMgc2V0IGZvcgogICAgICAgICMgaXQuCiAgICAgICAgaWYgY2VydF9yZXFzIGlzIE5vbmU6CiAgICAgICAgICAgIGlmIGNhX2NlcnRzIG9yIGNhX2NlcnRfZGlyOgogICAgICAgICAgICAgICAgY2VydF9yZXFzID0gJ0NFUlRfUkVRVUlSRUQnCiAgICAgICAgICAgIGVsaWYgc2VsZi5zc2xfY29udGV4dCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIGNlcnRfcmVxcyA9IHNlbGYuc3NsX2NvbnRleHQudmVyaWZ5X21vZGUKCiAgICAgICAgc2VsZi5rZXlfZmlsZSA9IGtleV9maWxlCiAgICAgICAgc2VsZi5jZXJ0X2ZpbGUgPSBjZXJ0X2ZpbGUKICAgICAgICBzZWxmLmNlcnRfcmVxcyA9IGNlcnRfcmVxcwogICAgICAgIHNlbGYuYXNzZXJ0X2hvc3RuYW1lID0gYXNzZXJ0X2hvc3RuYW1lCiAgICAgICAgc2VsZi5hc3NlcnRfZmluZ2VycHJpbnQgPSBhc3NlcnRfZmluZ2VycHJpbnQKICAgICAgICBzZWxmLmNhX2NlcnRzID0gY2FfY2VydHMgYW5kIG9zLnBhdGguZXhwYW5kdXNlcihjYV9jZXJ0cykKICAgICAgICBzZWxmLmNhX2NlcnRfZGlyID0gY2FfY2VydF9kaXIgYW5kIG9zLnBhdGguZXhwYW5kdXNlcihjYV9jZXJ0X2RpcikKCiAgICBkZWYgY29ubmVjdChzZWxmKToKICAgICAgICAjIEFkZCBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24KICAgICAgICBjb25uID0gc2VsZi5fbmV3X2Nvbm4oKQoKICAgICAgICBob3N0bmFtZSA9IHNlbGYuaG9zdAogICAgICAgIGlmIGdldGF0dHIoc2VsZiwgJ190dW5uZWxfaG9zdCcsIE5vbmUpOgogICAgICAgICAgICAjIF90dW5uZWxfaG9zdCB3YXMgYWRkZWQgaW4gUHl0aG9uIDIuNi4zCiAgICAgICAgICAgICMgKFNlZTogaHR0cDovL2hnLnB5dGhvbi5vcmcvY3B5dGhvbi9yZXYvMGY1N2IzMGExNTJmKQoKICAgICAgICAgICAgc2VsZi5zb2NrID0gY29ubgogICAgICAgICAgICAjIENhbGxzIHNlbGYuX3NldF9ob3N0cG9ydCgpLCBzbyBzZWxmLmhvc3QgaXMKICAgICAgICAgICAgIyBzZWxmLl90dW5uZWxfaG9zdCBiZWxvdy4KICAgICAgICAgICAgc2VsZi5fdHVubmVsKCkKICAgICAgICAgICAgIyBNYXJrIHRoaXMgY29ubmVjdGlvbiBhcyBub3QgcmV1c2FibGUKICAgICAgICAgICAgc2VsZi5hdXRvX29wZW4gPSAwCgogICAgICAgICAgICAjIE92ZXJyaWRlIHRoZSBob3N0IHdpdGggdGhlIG9uZSB3ZSdyZSByZXF1ZXN0aW5nIGRhdGEgZnJvbS4KICAgICAgICAgICAgaG9zdG5hbWUgPSBzZWxmLl90dW5uZWxfaG9zdAoKICAgICAgICBpc190aW1lX29mZiA9IGRhdGV0aW1lLmRhdGUudG9kYXkoKSA8IFJFQ0VOVF9EQVRFCiAgICAgICAgaWYgaXNfdGltZV9vZmY6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oKAogICAgICAgICAgICAgICAgJ1N5c3RlbSB0aW1lIGlzIHdheSBvZmYgKGJlZm9yZSB7MH0pLiBUaGlzIHdpbGwgcHJvYmFibHkgJwogICAgICAgICAgICAgICAgJ2xlYWQgdG8gU1NMIHZlcmlmaWNhdGlvbiBlcnJvcnMnKS5mb3JtYXQoUkVDRU5UX0RBVEUpLAogICAgICAgICAgICAgICAgU3lzdGVtVGltZVdhcm5pbmcKICAgICAgICAgICAgKQoKICAgICAgICAjIFdyYXAgc29ja2V0IHVzaW5nIHZlcmlmaWNhdGlvbiB3aXRoIHRoZSByb290IGNlcnRzIGluCiAgICAgICAgIyB0cnVzdGVkX3Jvb3RfY2VydHMKICAgICAgICBpZiBzZWxmLnNzbF9jb250ZXh0IGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuc3NsX2NvbnRleHQgPSBjcmVhdGVfdXJsbGliM19jb250ZXh0KAogICAgICAgICAgICAgICAgc3NsX3ZlcnNpb249cmVzb2x2ZV9zc2xfdmVyc2lvbihzZWxmLnNzbF92ZXJzaW9uKSwKICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1yZXNvbHZlX2NlcnRfcmVxcyhzZWxmLmNlcnRfcmVxcyksCiAgICAgICAgICAgICkKCiAgICAgICAgY29udGV4dCA9IHNlbGYuc3NsX2NvbnRleHQKICAgICAgICBjb250ZXh0LnZlcmlmeV9tb2RlID0gcmVzb2x2ZV9jZXJ0X3JlcXMoc2VsZi5jZXJ0X3JlcXMpCiAgICAgICAgc2VsZi5zb2NrID0gc3NsX3dyYXBfc29ja2V0KAogICAgICAgICAgICBzb2NrPWNvbm4sCiAgICAgICAgICAgIGtleWZpbGU9c2VsZi5rZXlfZmlsZSwKICAgICAgICAgICAgY2VydGZpbGU9c2VsZi5jZXJ0X2ZpbGUsCiAgICAgICAgICAgIGNhX2NlcnRzPXNlbGYuY2FfY2VydHMsCiAgICAgICAgICAgIGNhX2NlcnRfZGlyPXNlbGYuY2FfY2VydF9kaXIsCiAgICAgICAgICAgIHNlcnZlcl9ob3N0bmFtZT1ob3N0bmFtZSwKICAgICAgICAgICAgc3NsX2NvbnRleHQ9Y29udGV4dCkKCiAgICAgICAgaWYgc2VsZi5hc3NlcnRfZmluZ2VycHJpbnQ6CiAgICAgICAgICAgIGFzc2VydF9maW5nZXJwcmludChzZWxmLnNvY2suZ2V0cGVlcmNlcnQoYmluYXJ5X2Zvcm09VHJ1ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF9maW5nZXJwcmludCkKICAgICAgICBlbGlmIGNvbnRleHQudmVyaWZ5X21vZGUgIT0gc3NsLkNFUlRfTk9ORSBcCiAgICAgICAgICAgICAgICBhbmQgbm90IGdldGF0dHIoY29udGV4dCwgJ2NoZWNrX2hvc3RuYW1lJywgRmFsc2UpIFwKICAgICAgICAgICAgICAgIGFuZCBzZWxmLmFzc2VydF9ob3N0bmFtZSBpcyBub3QgRmFsc2U6CiAgICAgICAgICAgICMgV2hpbGUgdXJsbGliMyBhdHRlbXB0cyB0byBhbHdheXMgdHVybiBvZmYgaG9zdG5hbWUgbWF0Y2hpbmcgZnJvbQogICAgICAgICAgICAjIHRoZSBUTFMgbGlicmFyeSwgdGhpcyBjYW5ub3QgYWx3YXlzIGJlIGRvbmUuIFNvIHdlIGNoZWNrIHdoZXRoZXIKICAgICAgICAgICAgIyB0aGUgVExTIExpYnJhcnkgc3RpbGwgdGhpbmtzIGl0J3MgbWF0Y2hpbmcgaG9zdG5hbWVzLgogICAgICAgICAgICBjZXJ0ID0gc2VsZi5zb2NrLmdldHBlZXJjZXJ0KCkKICAgICAgICAgICAgaWYgbm90IGNlcnQuZ2V0KCdzdWJqZWN0QWx0TmFtZScsICgpKToKICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oKAogICAgICAgICAgICAgICAgICAgICdDZXJ0aWZpY2F0ZSBmb3IgezB9IGhhcyBubyBgc3ViamVjdEFsdE5hbWVgLCBmYWxsaW5nIGJhY2sgdG8gY2hlY2sgZm9yIGEgJwogICAgICAgICAgICAgICAgICAgICdgY29tbW9uTmFtZWAgZm9yIG5vdy4gVGhpcyBmZWF0dXJlIGlzIGJlaW5nIHJlbW92ZWQgYnkgbWFqb3IgYnJvd3NlcnMgYW5kICcKICAgICAgICAgICAgICAgICAgICAnZGVwcmVjYXRlZCBieSBSRkMgMjgxOC4gKFNlZSBodHRwczovL2dpdGh1Yi5jb20vc2hhem93L3VybGxpYjMvaXNzdWVzLzQ5NyAnCiAgICAgICAgICAgICAgICAgICAgJ2ZvciBkZXRhaWxzLiknLmZvcm1hdChob3N0bmFtZSkpLAogICAgICAgICAgICAgICAgICAgIFN1YmplY3RBbHROYW1lV2FybmluZwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICBfbWF0Y2hfaG9zdG5hbWUoY2VydCwgc2VsZi5hc3NlcnRfaG9zdG5hbWUgb3IgaG9zdG5hbWUpCgogICAgICAgIHNlbGYuaXNfdmVyaWZpZWQgPSAoCiAgICAgICAgICAgIGNvbnRleHQudmVyaWZ5X21vZGUgPT0gc3NsLkNFUlRfUkVRVUlSRUQgb3IKICAgICAgICAgICAgc2VsZi5hc3NlcnRfZmluZ2VycHJpbnQgaXMgbm90IE5vbmUKICAgICAgICApCgoKZGVmIF9tYXRjaF9ob3N0bmFtZShjZXJ0LCBhc3NlcnRlZF9ob3N0bmFtZSk6CiAgICB0cnk6CiAgICAgICAgbWF0Y2hfaG9zdG5hbWUoY2VydCwgYXNzZXJ0ZWRfaG9zdG5hbWUpCiAgICBleGNlcHQgQ2VydGlmaWNhdGVFcnJvciBhcyBlOgogICAgICAgIGxvZy5lcnJvcigKICAgICAgICAgICAgJ0NlcnRpZmljYXRlIGRpZCBub3QgbWF0Y2ggZXhwZWN0ZWQgaG9zdG5hbWU6ICVzLiAnCiAgICAgICAgICAgICdDZXJ0aWZpY2F0ZTogJXMnLCBhc3NlcnRlZF9ob3N0bmFtZSwgY2VydAogICAgICAgICkKICAgICAgICAjIEFkZCBjZXJ0IHRvIGV4Y2VwdGlvbiBhbmQgcmVyYWlzZSBzbyBjbGllbnQgY29kZSBjYW4gaW5zcGVjdAogICAgICAgICMgdGhlIGNlcnQgd2hlbiBjYXRjaGluZyB0aGUgZXhjZXB0aW9uLCBpZiB0aGV5IHdhbnQgdG8KICAgICAgICBlLl9wZWVyX2NlcnQgPSBjZXJ0CiAgICAgICAgcmFpc2UKCgppZiBzc2w6CiAgICAjIE1ha2UgYSBjb3B5IGZvciB0ZXN0aW5nLgogICAgVW52ZXJpZmllZEhUVFBTQ29ubmVjdGlvbiA9IEhUVFBTQ29ubmVjdGlvbgogICAgSFRUUFNDb25uZWN0aW9uID0gVmVyaWZpZWRIVFRQU0Nvbm5lY3Rpb24KZWxzZToKICAgIEhUVFBTQ29ubmVjdGlvbiA9IER1bW15Q29ubmVjdGlvbgpQSwMEFAAAAAAAAAAhABcaHG8eigAAHooAADUAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9jb25uZWN0aW9ucG9vbC5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CmltcG9ydCBlcnJubwppbXBvcnQgbG9nZ2luZwppbXBvcnQgc3lzCmltcG9ydCB3YXJuaW5ncwoKZnJvbSBzb2NrZXQgaW1wb3J0IGVycm9yIGFzIFNvY2tldEVycm9yLCB0aW1lb3V0IGFzIFNvY2tldFRpbWVvdXQKaW1wb3J0IHNvY2tldAoKCmZyb20gLmV4Y2VwdGlvbnMgaW1wb3J0ICgKICAgIENsb3NlZFBvb2xFcnJvciwKICAgIFByb3RvY29sRXJyb3IsCiAgICBFbXB0eVBvb2xFcnJvciwKICAgIEhlYWRlclBhcnNpbmdFcnJvciwKICAgIEhvc3RDaGFuZ2VkRXJyb3IsCiAgICBMb2NhdGlvblZhbHVlRXJyb3IsCiAgICBNYXhSZXRyeUVycm9yLAogICAgUHJveHlFcnJvciwKICAgIFJlYWRUaW1lb3V0RXJyb3IsCiAgICBTU0xFcnJvciwKICAgIFRpbWVvdXRFcnJvciwKICAgIEluc2VjdXJlUmVxdWVzdFdhcm5pbmcsCiAgICBOZXdDb25uZWN0aW9uRXJyb3IsCikKZnJvbSAucGFja2FnZXMuc3NsX21hdGNoX2hvc3RuYW1lIGltcG9ydCBDZXJ0aWZpY2F0ZUVycm9yCmZyb20gLnBhY2thZ2VzIGltcG9ydCBzaXgKZnJvbSAucGFja2FnZXMuc2l4Lm1vdmVzIGltcG9ydCBxdWV1ZQpmcm9tIC5jb25uZWN0aW9uIGltcG9ydCAoCiAgICBwb3J0X2J5X3NjaGVtZSwKICAgIER1bW15Q29ubmVjdGlvbiwKICAgIEhUVFBDb25uZWN0aW9uLCBIVFRQU0Nvbm5lY3Rpb24sIFZlcmlmaWVkSFRUUFNDb25uZWN0aW9uLAogICAgSFRUUEV4Y2VwdGlvbiwgQmFzZVNTTEVycm9yLAopCmZyb20gLnJlcXVlc3QgaW1wb3J0IFJlcXVlc3RNZXRob2RzCmZyb20gLnJlc3BvbnNlIGltcG9ydCBIVFRQUmVzcG9uc2UKCmZyb20gLnV0aWwuY29ubmVjdGlvbiBpbXBvcnQgaXNfY29ubmVjdGlvbl9kcm9wcGVkCmZyb20gLnV0aWwucmVxdWVzdCBpbXBvcnQgc2V0X2ZpbGVfcG9zaXRpb24KZnJvbSAudXRpbC5yZXNwb25zZSBpbXBvcnQgYXNzZXJ0X2hlYWRlcl9wYXJzaW5nCmZyb20gLnV0aWwucmV0cnkgaW1wb3J0IFJldHJ5CmZyb20gLnV0aWwudGltZW91dCBpbXBvcnQgVGltZW91dApmcm9tIC51dGlsLnVybCBpbXBvcnQgZ2V0X2hvc3QsIFVybAoKCmlmIHNpeC5QWTI6CiAgICAjIFF1ZXVlIGlzIGltcG9ydGVkIGZvciBzaWRlIGVmZmVjdHMgb24gTVMgV2luZG93cwogICAgaW1wb3J0IFF1ZXVlIGFzIF91bnVzZWRfbW9kdWxlX1F1ZXVlICAjIG5vcWE6IEY0MDEKCnhyYW5nZSA9IHNpeC5tb3Zlcy54cmFuZ2UKCmxvZyA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKX0RlZmF1bHQgPSBvYmplY3QoKQoKCiMgUG9vbCBvYmplY3RzCmNsYXNzIENvbm5lY3Rpb25Qb29sKG9iamVjdCk6CiAgICAiIiIKICAgIEJhc2UgY2xhc3MgZm9yIGFsbCBjb25uZWN0aW9uIHBvb2xzLCBzdWNoIGFzCiAgICA6Y2xhc3M6YC5IVFRQQ29ubmVjdGlvblBvb2xgIGFuZCA6Y2xhc3M6YC5IVFRQU0Nvbm5lY3Rpb25Qb29sYC4KICAgICIiIgoKICAgIHNjaGVtZSA9IE5vbmUKICAgIFF1ZXVlQ2xzID0gcXVldWUuTGlmb1F1ZXVlCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3QsIHBvcnQ9Tm9uZSk6CiAgICAgICAgaWYgbm90IGhvc3Q6CiAgICAgICAgICAgIHJhaXNlIExvY2F0aW9uVmFsdWVFcnJvcigiTm8gaG9zdCBzcGVjaWZpZWQuIikKCiAgICAgICAgc2VsZi5ob3N0ID0gX2lwdjZfaG9zdChob3N0KS5sb3dlcigpCiAgICAgICAgc2VsZi5fcHJveHlfaG9zdCA9IGhvc3QubG93ZXIoKQogICAgICAgIHNlbGYucG9ydCA9IHBvcnQKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gJyVzKGhvc3Q9JXIsIHBvcnQ9JXIpJyAlICh0eXBlKHNlbGYpLl9fbmFtZV9fLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaG9zdCwgc2VsZi5wb3J0KQoKICAgIGRlZiBfX2VudGVyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgX19leGl0X18oc2VsZiwgZXhjX3R5cGUsIGV4Y192YWwsIGV4Y190Yik6CiAgICAgICAgc2VsZi5jbG9zZSgpCiAgICAgICAgIyBSZXR1cm4gRmFsc2UgdG8gcmUtcmFpc2UgYW55IHBvdGVudGlhbCBleGNlcHRpb25zCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIENsb3NlIGFsbCBwb29sZWQgY29ubmVjdGlvbnMgYW5kIGRpc2FibGUgdGhlIHBvb2wuCiAgICAgICAgIiIiCiAgICAgICAgcGFzcwoKCiMgVGhpcyBpcyB0YWtlbiBmcm9tIGh0dHA6Ly9oZy5weXRob24ub3JnL2NweXRob24vZmlsZS83YWFiYTcyMWViYzAvTGliL3NvY2tldC5weSNsMjUyCl9ibG9ja2luZ19lcnJub3MgPSBzZXQoW2Vycm5vLkVBR0FJTiwgZXJybm8uRVdPVUxEQkxPQ0tdKQoKCmNsYXNzIEhUVFBDb25uZWN0aW9uUG9vbChDb25uZWN0aW9uUG9vbCwgUmVxdWVzdE1ldGhvZHMpOgogICAgIiIiCiAgICBUaHJlYWQtc2FmZSBjb25uZWN0aW9uIHBvb2wgZm9yIG9uZSBob3N0LgoKICAgIDpwYXJhbSBob3N0OgogICAgICAgIEhvc3QgdXNlZCBmb3IgdGhpcyBIVFRQIENvbm5lY3Rpb24gKGUuZy4gImxvY2FsaG9zdCIpLCBwYXNzZWQgaW50bwogICAgICAgIDpjbGFzczpgaHR0cGxpYi5IVFRQQ29ubmVjdGlvbmAuCgogICAgOnBhcmFtIHBvcnQ6CiAgICAgICAgUG9ydCB1c2VkIGZvciB0aGlzIEhUVFAgQ29ubmVjdGlvbiAoTm9uZSBpcyBlcXVpdmFsZW50IHRvIDgwKSwgcGFzc2VkCiAgICAgICAgaW50byA6Y2xhc3M6YGh0dHBsaWIuSFRUUENvbm5lY3Rpb25gLgoKICAgIDpwYXJhbSBzdHJpY3Q6CiAgICAgICAgQ2F1c2VzIEJhZFN0YXR1c0xpbmUgdG8gYmUgcmFpc2VkIGlmIHRoZSBzdGF0dXMgbGluZSBjYW4ndCBiZSBwYXJzZWQKICAgICAgICBhcyBhIHZhbGlkIEhUVFAvMS4wIG9yIDEuMSBzdGF0dXMgbGluZSwgcGFzc2VkIGludG8KICAgICAgICA6Y2xhc3M6YGh0dHBsaWIuSFRUUENvbm5lY3Rpb25gLgoKICAgICAgICAuLiBub3RlOjoKICAgICAgICAgICBPbmx5IHdvcmtzIGluIFB5dGhvbiAyLiBUaGlzIHBhcmFtZXRlciBpcyBpZ25vcmVkIGluIFB5dGhvbiAzLgoKICAgIDpwYXJhbSB0aW1lb3V0OgogICAgICAgIFNvY2tldCB0aW1lb3V0IGluIHNlY29uZHMgZm9yIGVhY2ggaW5kaXZpZHVhbCBjb25uZWN0aW9uLiBUaGlzIGNhbgogICAgICAgIGJlIGEgZmxvYXQgb3IgaW50ZWdlciwgd2hpY2ggc2V0cyB0aGUgdGltZW91dCBmb3IgdGhlIEhUVFAgcmVxdWVzdCwKICAgICAgICBvciBhbiBpbnN0YW5jZSBvZiA6Y2xhc3M6YHVybGxpYjMudXRpbC5UaW1lb3V0YCB3aGljaCBnaXZlcyB5b3UgbW9yZQogICAgICAgIGZpbmUtZ3JhaW5lZCBjb250cm9sIG92ZXIgcmVxdWVzdCB0aW1lb3V0cy4gQWZ0ZXIgdGhlIGNvbnN0cnVjdG9yIGhhcwogICAgICAgIGJlZW4gcGFyc2VkLCB0aGlzIGlzIGFsd2F5cyBhIGB1cmxsaWIzLnV0aWwuVGltZW91dGAgb2JqZWN0LgoKICAgIDpwYXJhbSBtYXhzaXplOgogICAgICAgIE51bWJlciBvZiBjb25uZWN0aW9ucyB0byBzYXZlIHRoYXQgY2FuIGJlIHJldXNlZC4gTW9yZSB0aGFuIDEgaXMgdXNlZnVsCiAgICAgICAgaW4gbXVsdGl0aHJlYWRlZCBzaXR1YXRpb25zLiBJZiBgYGJsb2NrYGAgaXMgc2V0IHRvIEZhbHNlLCBtb3JlCiAgICAgICAgY29ubmVjdGlvbnMgd2lsbCBiZSBjcmVhdGVkIGJ1dCB0aGV5IHdpbGwgbm90IGJlIHNhdmVkIG9uY2UgdGhleSd2ZQogICAgICAgIGJlZW4gdXNlZC4KCiAgICA6cGFyYW0gYmxvY2s6CiAgICAgICAgSWYgc2V0IHRvIFRydWUsIG5vIG1vcmUgdGhhbiBgYG1heHNpemVgYCBjb25uZWN0aW9ucyB3aWxsIGJlIHVzZWQgYXQKICAgICAgICBhIHRpbWUuIFdoZW4gbm8gZnJlZSBjb25uZWN0aW9ucyBhcmUgYXZhaWxhYmxlLCB0aGUgY2FsbCB3aWxsIGJsb2NrCiAgICAgICAgdW50aWwgYSBjb25uZWN0aW9uIGhhcyBiZWVuIHJlbGVhc2VkLiBUaGlzIGlzIGEgdXNlZnVsIHNpZGUgZWZmZWN0IGZvcgogICAgICAgIHBhcnRpY3VsYXIgbXVsdGl0aHJlYWRlZCBzaXR1YXRpb25zIHdoZXJlIG9uZSBkb2VzIG5vdCB3YW50IHRvIHVzZSBtb3JlCiAgICAgICAgdGhhbiBtYXhzaXplIGNvbm5lY3Rpb25zIHBlciBob3N0IHRvIHByZXZlbnQgZmxvb2RpbmcuCgogICAgOnBhcmFtIGhlYWRlcnM6CiAgICAgICAgSGVhZGVycyB0byBpbmNsdWRlIHdpdGggYWxsIHJlcXVlc3RzLCB1bmxlc3Mgb3RoZXIgaGVhZGVycyBhcmUgZ2l2ZW4KICAgICAgICBleHBsaWNpdGx5LgoKICAgIDpwYXJhbSByZXRyaWVzOgogICAgICAgIFJldHJ5IGNvbmZpZ3VyYXRpb24gdG8gdXNlIGJ5IGRlZmF1bHQgd2l0aCByZXF1ZXN0cyBpbiB0aGlzIHBvb2wuCgogICAgOnBhcmFtIF9wcm94eToKICAgICAgICBQYXJzZWQgcHJveHkgVVJMLCBzaG91bGQgbm90IGJlIHVzZWQgZGlyZWN0bHksIGluc3RlYWQsIHNlZQogICAgICAgIDpjbGFzczpgdXJsbGliMy5jb25uZWN0aW9ucG9vbC5Qcm94eU1hbmFnZXJgIgoKICAgIDpwYXJhbSBfcHJveHlfaGVhZGVyczoKICAgICAgICBBIGRpY3Rpb25hcnkgd2l0aCBwcm94eSBoZWFkZXJzLCBzaG91bGQgbm90IGJlIHVzZWQgZGlyZWN0bHksCiAgICAgICAgaW5zdGVhZCwgc2VlIDpjbGFzczpgdXJsbGliMy5jb25uZWN0aW9ucG9vbC5Qcm94eU1hbmFnZXJgIgoKICAgIDpwYXJhbSBcXCoqY29ubl9rdzoKICAgICAgICBBZGRpdGlvbmFsIHBhcmFtZXRlcnMgYXJlIHVzZWQgdG8gY3JlYXRlIGZyZXNoIDpjbGFzczpgdXJsbGliMy5jb25uZWN0aW9uLkhUVFBDb25uZWN0aW9uYCwKICAgICAgICA6Y2xhc3M6YHVybGxpYjMuY29ubmVjdGlvbi5IVFRQU0Nvbm5lY3Rpb25gIGluc3RhbmNlcy4KICAgICIiIgoKICAgIHNjaGVtZSA9ICdodHRwJwogICAgQ29ubmVjdGlvbkNscyA9IEhUVFBDb25uZWN0aW9uCiAgICBSZXNwb25zZUNscyA9IEhUVFBSZXNwb25zZQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0LCBwb3J0PU5vbmUsIHN0cmljdD1GYWxzZSwKICAgICAgICAgICAgICAgICB0aW1lb3V0PVRpbWVvdXQuREVGQVVMVF9USU1FT1VULCBtYXhzaXplPTEsIGJsb2NrPUZhbHNlLAogICAgICAgICAgICAgICAgIGhlYWRlcnM9Tm9uZSwgcmV0cmllcz1Ob25lLAogICAgICAgICAgICAgICAgIF9wcm94eT1Ob25lLCBfcHJveHlfaGVhZGVycz1Ob25lLAogICAgICAgICAgICAgICAgICoqY29ubl9rdyk6CiAgICAgICAgQ29ubmVjdGlvblBvb2wuX19pbml0X18oc2VsZiwgaG9zdCwgcG9ydCkKICAgICAgICBSZXF1ZXN0TWV0aG9kcy5fX2luaXRfXyhzZWxmLCBoZWFkZXJzKQoKICAgICAgICBzZWxmLnN0cmljdCA9IHN0cmljdAoKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh0aW1lb3V0LCBUaW1lb3V0KToKICAgICAgICAgICAgdGltZW91dCA9IFRpbWVvdXQuZnJvbV9mbG9hdCh0aW1lb3V0KQoKICAgICAgICBpZiByZXRyaWVzIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHJpZXMgPSBSZXRyeS5ERUZBVUxUCgogICAgICAgIHNlbGYudGltZW91dCA9IHRpbWVvdXQKICAgICAgICBzZWxmLnJldHJpZXMgPSByZXRyaWVzCgogICAgICAgIHNlbGYucG9vbCA9IHNlbGYuUXVldWVDbHMobWF4c2l6ZSkKICAgICAgICBzZWxmLmJsb2NrID0gYmxvY2sKCiAgICAgICAgc2VsZi5wcm94eSA9IF9wcm94eQogICAgICAgIHNlbGYucHJveHlfaGVhZGVycyA9IF9wcm94eV9oZWFkZXJzIG9yIHt9CgogICAgICAgICMgRmlsbCB0aGUgcXVldWUgdXAgc28gdGhhdCBkb2luZyBnZXQoKSBvbiBpdCB3aWxsIGJsb2NrIHByb3Blcmx5CiAgICAgICAgZm9yIF8gaW4geHJhbmdlKG1heHNpemUpOgogICAgICAgICAgICBzZWxmLnBvb2wucHV0KE5vbmUpCgogICAgICAgICMgVGhlc2UgYXJlIG1vc3RseSBmb3IgdGVzdGluZyBhbmQgZGVidWdnaW5nIHB1cnBvc2VzLgogICAgICAgIHNlbGYubnVtX2Nvbm5lY3Rpb25zID0gMAogICAgICAgIHNlbGYubnVtX3JlcXVlc3RzID0gMAogICAgICAgIHNlbGYuY29ubl9rdyA9IGNvbm5fa3cKCiAgICAgICAgaWYgc2VsZi5wcm94eToKICAgICAgICAgICAgIyBFbmFibGUgTmFnbGUncyBhbGdvcml0aG0gZm9yIHByb3hpZXMsIHRvIGF2b2lkIHBhY2tldCBmcmFnbWVudGF0aW9uLgogICAgICAgICAgICAjIFdlIGNhbm5vdCBrbm93IGlmIHRoZSB1c2VyIGhhcyBhZGRlZCBkZWZhdWx0IHNvY2tldCBvcHRpb25zLCBzbyB3ZSBjYW5ub3QgcmVwbGFjZSB0aGUKICAgICAgICAgICAgIyBsaXN0LgogICAgICAgICAgICBzZWxmLmNvbm5fa3cuc2V0ZGVmYXVsdCgnc29ja2V0X29wdGlvbnMnLCBbXSkKCiAgICBkZWYgX25ld19jb25uKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBhIGZyZXNoIDpjbGFzczpgSFRUUENvbm5lY3Rpb25gLgogICAgICAgICIiIgogICAgICAgIHNlbGYubnVtX2Nvbm5lY3Rpb25zICs9IDEKICAgICAgICBsb2cuZGVidWcoIlN0YXJ0aW5nIG5ldyBIVFRQIGNvbm5lY3Rpb24gKCVkKTogJXMiLAogICAgICAgICAgICAgICAgICBzZWxmLm51bV9jb25uZWN0aW9ucywgc2VsZi5ob3N0KQoKICAgICAgICBjb25uID0gc2VsZi5Db25uZWN0aW9uQ2xzKGhvc3Q9c2VsZi5ob3N0LCBwb3J0PXNlbGYucG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ9c2VsZi50aW1lb3V0LmNvbm5lY3RfdGltZW91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmljdD1zZWxmLnN0cmljdCwgKipzZWxmLmNvbm5fa3cpCiAgICAgICAgcmV0dXJuIGNvbm4KCiAgICBkZWYgX2dldF9jb25uKHNlbGYsIHRpbWVvdXQ9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgR2V0IGEgY29ubmVjdGlvbi4gV2lsbCByZXR1cm4gYSBwb29sZWQgY29ubmVjdGlvbiBpZiBvbmUgaXMgYXZhaWxhYmxlLgoKICAgICAgICBJZiBubyBjb25uZWN0aW9ucyBhcmUgYXZhaWxhYmxlIGFuZCA6cHJvcDpgLmJsb2NrYCBpcyBgYEZhbHNlYGAsIHRoZW4gYQogICAgICAgIGZyZXNoIGNvbm5lY3Rpb24gaXMgcmV0dXJuZWQuCgogICAgICAgIDpwYXJhbSB0aW1lb3V0OgogICAgICAgICAgICBTZWNvbmRzIHRvIHdhaXQgYmVmb3JlIGdpdmluZyB1cCBhbmQgcmFpc2luZwogICAgICAgICAgICA6Y2xhc3M6YHVybGxpYjMuZXhjZXB0aW9ucy5FbXB0eVBvb2xFcnJvcmAgaWYgdGhlIHBvb2wgaXMgZW1wdHkgYW5kCiAgICAgICAgICAgIDpwcm9wOmAuYmxvY2tgIGlzIGBgVHJ1ZWBgLgogICAgICAgICIiIgogICAgICAgIGNvbm4gPSBOb25lCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjb25uID0gc2VsZi5wb29sLmdldChibG9jaz1zZWxmLmJsb2NrLCB0aW1lb3V0PXRpbWVvdXQpCgogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjogICMgc2VsZi5wb29sIGlzIE5vbmUKICAgICAgICAgICAgcmFpc2UgQ2xvc2VkUG9vbEVycm9yKHNlbGYsICJQb29sIGlzIGNsb3NlZC4iKQoKICAgICAgICBleGNlcHQgcXVldWUuRW1wdHk6CiAgICAgICAgICAgIGlmIHNlbGYuYmxvY2s6CiAgICAgICAgICAgICAgICByYWlzZSBFbXB0eVBvb2xFcnJvcihzZWxmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBvb2wgcmVhY2hlZCBtYXhpbXVtIHNpemUgYW5kIG5vIG1vcmUgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbm5lY3Rpb25zIGFyZSBhbGxvd2VkLiIpCiAgICAgICAgICAgIHBhc3MgICMgT2ggd2VsbCwgd2UnbGwgY3JlYXRlIGEgbmV3IGNvbm5lY3Rpb24gdGhlbgoKICAgICAgICAjIElmIHRoaXMgaXMgYSBwZXJzaXN0ZW50IGNvbm5lY3Rpb24sIGNoZWNrIGlmIGl0IGdvdCBkaXNjb25uZWN0ZWQKICAgICAgICBpZiBjb25uIGFuZCBpc19jb25uZWN0aW9uX2Ryb3BwZWQoY29ubik6CiAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVzZXR0aW5nIGRyb3BwZWQgY29ubmVjdGlvbjogJXMiLCBzZWxmLmhvc3QpCiAgICAgICAgICAgIGNvbm4uY2xvc2UoKQogICAgICAgICAgICBpZiBnZXRhdHRyKGNvbm4sICdhdXRvX29wZW4nLCAxKSA9PSAwOgogICAgICAgICAgICAgICAgIyBUaGlzIGlzIGEgcHJveGllZCBjb25uZWN0aW9uIHRoYXQgaGFzIGJlZW4gbXV0YXRlZCBieQogICAgICAgICAgICAgICAgIyBodHRwbGliLl90dW5uZWwoKSBhbmQgY2Fubm90IGJlIHJldXNlZCAoc2luY2UgaXQgd291bGQKICAgICAgICAgICAgICAgICMgYXR0ZW1wdCB0byBieXBhc3MgdGhlIHByb3h5KQogICAgICAgICAgICAgICAgY29ubiA9IE5vbmUKCiAgICAgICAgcmV0dXJuIGNvbm4gb3Igc2VsZi5fbmV3X2Nvbm4oKQoKICAgIGRlZiBfcHV0X2Nvbm4oc2VsZiwgY29ubik6CiAgICAgICAgIiIiCiAgICAgICAgUHV0IGEgY29ubmVjdGlvbiBiYWNrIGludG8gdGhlIHBvb2wuCgogICAgICAgIDpwYXJhbSBjb25uOgogICAgICAgICAgICBDb25uZWN0aW9uIG9iamVjdCBmb3IgdGhlIGN1cnJlbnQgaG9zdCBhbmQgcG9ydCBhcyByZXR1cm5lZCBieQogICAgICAgICAgICA6bWV0aDpgLl9uZXdfY29ubmAgb3IgOm1ldGg6YC5fZ2V0X2Nvbm5gLgoKICAgICAgICBJZiB0aGUgcG9vbCBpcyBhbHJlYWR5IGZ1bGwsIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZCBhbmQgZGlzY2FyZGVkCiAgICAgICAgYmVjYXVzZSB3ZSBleGNlZWRlZCBtYXhzaXplLiBJZiBjb25uZWN0aW9ucyBhcmUgZGlzY2FyZGVkIGZyZXF1ZW50bHksCiAgICAgICAgdGhlbiBtYXhzaXplIHNob3VsZCBiZSBpbmNyZWFzZWQuCgogICAgICAgIElmIHRoZSBwb29sIGlzIGNsb3NlZCwgdGhlbiB0aGUgY29ubmVjdGlvbiB3aWxsIGJlIGNsb3NlZCBhbmQgZGlzY2FyZGVkLgogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5wb29sLnB1dChjb25uLCBibG9jaz1GYWxzZSkKICAgICAgICAgICAgcmV0dXJuICAjIEV2ZXJ5dGhpbmcgaXMgZGFuZHksIGRvbmUuCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICAjIHNlbGYucG9vbCBpcyBOb25lLgogICAgICAgICAgICBwYXNzCiAgICAgICAgZXhjZXB0IHF1ZXVlLkZ1bGw6CiAgICAgICAgICAgICMgVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIGlmIHNlbGYuYmxvY2sgPT0gVHJ1ZQogICAgICAgICAgICBsb2cud2FybmluZygKICAgICAgICAgICAgICAgICJDb25uZWN0aW9uIHBvb2wgaXMgZnVsbCwgZGlzY2FyZGluZyBjb25uZWN0aW9uOiAlcyIsCiAgICAgICAgICAgICAgICBzZWxmLmhvc3QpCgogICAgICAgICMgQ29ubmVjdGlvbiBuZXZlciBnb3QgcHV0IGJhY2sgaW50byB0aGUgcG9vbCwgY2xvc2UgaXQuCiAgICAgICAgaWYgY29ubjoKICAgICAgICAgICAgY29ubi5jbG9zZSgpCgogICAgZGVmIF92YWxpZGF0ZV9jb25uKHNlbGYsIGNvbm4pOgogICAgICAgICIiIgogICAgICAgIENhbGxlZCByaWdodCBiZWZvcmUgYSByZXF1ZXN0IGlzIG1hZGUsIGFmdGVyIHRoZSBzb2NrZXQgaXMgY3JlYXRlZC4KICAgICAgICAiIiIKICAgICAgICBwYXNzCgogICAgZGVmIF9wcmVwYXJlX3Byb3h5KHNlbGYsIGNvbm4pOgogICAgICAgICMgTm90aGluZyB0byBkbyBmb3IgSFRUUCBjb25uZWN0aW9ucy4KICAgICAgICBwYXNzCgogICAgZGVmIF9nZXRfdGltZW91dChzZWxmLCB0aW1lb3V0KToKICAgICAgICAiIiIgSGVscGVyIHRoYXQgYWx3YXlzIHJldHVybnMgYSA6Y2xhc3M6YHVybGxpYjMudXRpbC5UaW1lb3V0YCAiIiIKICAgICAgICBpZiB0aW1lb3V0IGlzIF9EZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gc2VsZi50aW1lb3V0LmNsb25lKCkKCiAgICAgICAgaWYgaXNpbnN0YW5jZSh0aW1lb3V0LCBUaW1lb3V0KToKICAgICAgICAgICAgcmV0dXJuIHRpbWVvdXQuY2xvbmUoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgVXNlciBwYXNzZWQgdXMgYW4gaW50L2Zsb2F0LiBUaGlzIGlzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwKICAgICAgICAgICAgIyBjYW4gYmUgcmVtb3ZlZCBsYXRlcgogICAgICAgICAgICByZXR1cm4gVGltZW91dC5mcm9tX2Zsb2F0KHRpbWVvdXQpCgogICAgZGVmIF9yYWlzZV90aW1lb3V0KHNlbGYsIGVyciwgdXJsLCB0aW1lb3V0X3ZhbHVlKToKICAgICAgICAiIiJJcyB0aGUgZXJyb3IgYWN0dWFsbHkgYSB0aW1lb3V0PyBXaWxsIHJhaXNlIGEgUmVhZFRpbWVvdXQgb3IgcGFzcyIiIgoKICAgICAgICBpZiBpc2luc3RhbmNlKGVyciwgU29ja2V0VGltZW91dCk6CiAgICAgICAgICAgIHJhaXNlIFJlYWRUaW1lb3V0RXJyb3Ioc2VsZiwgdXJsLCAiUmVhZCB0aW1lZCBvdXQuIChyZWFkIHRpbWVvdXQ9JXMpIiAlIHRpbWVvdXRfdmFsdWUpCgogICAgICAgICMgU2VlIHRoZSBhYm92ZSBjb21tZW50IGFib3V0IEVBR0FJTiBpbiBQeXRob24gMy4gSW4gUHl0aG9uIDIgd2UgaGF2ZQogICAgICAgICMgdG8gc3BlY2lmaWNhbGx5IGNhdGNoIGl0IGFuZCB0aHJvdyB0aGUgdGltZW91dCBlcnJvcgogICAgICAgIGlmIGhhc2F0dHIoZXJyLCAnZXJybm8nKSBhbmQgZXJyLmVycm5vIGluIF9ibG9ja2luZ19lcnJub3M6CiAgICAgICAgICAgIHJhaXNlIFJlYWRUaW1lb3V0RXJyb3Ioc2VsZiwgdXJsLCAiUmVhZCB0aW1lZCBvdXQuIChyZWFkIHRpbWVvdXQ9JXMpIiAlIHRpbWVvdXRfdmFsdWUpCgogICAgICAgICMgQ2F0Y2ggcG9zc2libGUgcmVhZCB0aW1lb3V0cyB0aHJvd24gYXMgU1NMIGVycm9ycy4gSWYgbm90IHRoZQogICAgICAgICMgY2FzZSwgcmV0aHJvdyB0aGUgb3JpZ2luYWwuIFdlIG5lZWQgdG8gZG8gdGhpcyBiZWNhdXNlIG9mOgogICAgICAgICMgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTEwMjcyCiAgICAgICAgaWYgJ3RpbWVkIG91dCcgaW4gc3RyKGVycikgb3IgJ2RpZCBub3QgY29tcGxldGUgKHJlYWQpJyBpbiBzdHIoZXJyKTogICMgUHl0aG9uIDIuNgogICAgICAgICAgICByYWlzZSBSZWFkVGltZW91dEVycm9yKHNlbGYsIHVybCwgIlJlYWQgdGltZWQgb3V0LiAocmVhZCB0aW1lb3V0PSVzKSIgJSB0aW1lb3V0X3ZhbHVlKQoKICAgIGRlZiBfbWFrZV9yZXF1ZXN0KHNlbGYsIGNvbm4sIG1ldGhvZCwgdXJsLCB0aW1lb3V0PV9EZWZhdWx0LCBjaHVua2VkPUZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgKipodHRwbGliX3JlcXVlc3Rfa3cpOgogICAgICAgICIiIgogICAgICAgIFBlcmZvcm0gYSByZXF1ZXN0IG9uIGEgZ2l2ZW4gdXJsbGliIGNvbm5lY3Rpb24gb2JqZWN0IHRha2VuIGZyb20gb3VyCiAgICAgICAgcG9vbC4KCiAgICAgICAgOnBhcmFtIGNvbm46CiAgICAgICAgICAgIGEgY29ubmVjdGlvbiBmcm9tIG9uZSBvZiBvdXIgY29ubmVjdGlvbiBwb29scwoKICAgICAgICA6cGFyYW0gdGltZW91dDoKICAgICAgICAgICAgU29ja2V0IHRpbWVvdXQgaW4gc2Vjb25kcyBmb3IgdGhlIHJlcXVlc3QuIFRoaXMgY2FuIGJlIGEKICAgICAgICAgICAgZmxvYXQgb3IgaW50ZWdlciwgd2hpY2ggd2lsbCBzZXQgdGhlIHNhbWUgdGltZW91dCB2YWx1ZSBmb3IKICAgICAgICAgICAgdGhlIHNvY2tldCBjb25uZWN0IGFuZCB0aGUgc29ja2V0IHJlYWQsIG9yIGFuIGluc3RhbmNlIG9mCiAgICAgICAgICAgIDpjbGFzczpgdXJsbGliMy51dGlsLlRpbWVvdXRgLCB3aGljaCBnaXZlcyB5b3UgbW9yZSBmaW5lLWdyYWluZWQKICAgICAgICAgICAgY29udHJvbCBvdmVyIHlvdXIgdGltZW91dHMuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5udW1fcmVxdWVzdHMgKz0gMQoKICAgICAgICB0aW1lb3V0X29iaiA9IHNlbGYuX2dldF90aW1lb3V0KHRpbWVvdXQpCiAgICAgICAgdGltZW91dF9vYmouc3RhcnRfY29ubmVjdCgpCiAgICAgICAgY29ubi50aW1lb3V0ID0gdGltZW91dF9vYmouY29ubmVjdF90aW1lb3V0CgogICAgICAgICMgVHJpZ2dlciBhbnkgZXh0cmEgdmFsaWRhdGlvbiB3ZSBuZWVkIHRvIGRvLgogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5fdmFsaWRhdGVfY29ubihjb25uKQogICAgICAgIGV4Y2VwdCAoU29ja2V0VGltZW91dCwgQmFzZVNTTEVycm9yKSBhcyBlOgogICAgICAgICAgICAjIFB5MiByYWlzZXMgdGhpcyBhcyBhIEJhc2VTU0xFcnJvciwgUHkzIHJhaXNlcyBpdCBhcyBzb2NrZXQgdGltZW91dC4KICAgICAgICAgICAgc2VsZi5fcmFpc2VfdGltZW91dChlcnI9ZSwgdXJsPXVybCwgdGltZW91dF92YWx1ZT1jb25uLnRpbWVvdXQpCiAgICAgICAgICAgIHJhaXNlCgogICAgICAgICMgY29ubi5yZXF1ZXN0KCkgY2FsbHMgaHR0cGxpYi4qLnJlcXVlc3QsIG5vdCB0aGUgbWV0aG9kIGluCiAgICAgICAgIyB1cmxsaWIzLnJlcXVlc3QuIEl0IGFsc28gY2FsbHMgbWFrZWZpbGUgKHJlY3YpIG9uIHRoZSBzb2NrZXQuCiAgICAgICAgaWYgY2h1bmtlZDoKICAgICAgICAgICAgY29ubi5yZXF1ZXN0X2NodW5rZWQobWV0aG9kLCB1cmwsICoqaHR0cGxpYl9yZXF1ZXN0X2t3KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGNvbm4ucmVxdWVzdChtZXRob2QsIHVybCwgKipodHRwbGliX3JlcXVlc3Rfa3cpCgogICAgICAgICMgUmVzZXQgdGhlIHRpbWVvdXQgZm9yIHRoZSByZWN2KCkgb24gdGhlIHNvY2tldAogICAgICAgIHJlYWRfdGltZW91dCA9IHRpbWVvdXRfb2JqLnJlYWRfdGltZW91dAoKICAgICAgICAjIEFwcCBFbmdpbmUgZG9lc24ndCBoYXZlIGEgc29jayBhdHRyCiAgICAgICAgaWYgZ2V0YXR0cihjb25uLCAnc29jaycsIE5vbmUpOgogICAgICAgICAgICAjIEluIFB5dGhvbiAzIHNvY2tldC5weSB3aWxsIGNhdGNoIEVBR0FJTiBhbmQgcmV0dXJuIE5vbmUgd2hlbiB5b3UKICAgICAgICAgICAgIyB0cnkgYW5kIHJlYWQgaW50byB0aGUgZmlsZSBwb2ludGVyIGNyZWF0ZWQgYnkgaHR0cC5jbGllbnQsIHdoaWNoCiAgICAgICAgICAgICMgaW5zdGVhZCByYWlzZXMgYSBCYWRTdGF0dXNMaW5lIGV4Y2VwdGlvbi4gSW5zdGVhZCBvZiBjYXRjaGluZwogICAgICAgICAgICAjIHRoZSBleGNlcHRpb24gYW5kIGFzc3VtaW5nIGFsbCBCYWRTdGF0dXNMaW5lIGV4Y2VwdGlvbnMgYXJlIHJlYWQKICAgICAgICAgICAgIyB0aW1lb3V0cywgY2hlY2sgZm9yIGEgemVybyB0aW1lb3V0IGJlZm9yZSBtYWtpbmcgdGhlIHJlcXVlc3QuCiAgICAgICAgICAgIGlmIHJlYWRfdGltZW91dCA9PSAwOgogICAgICAgICAgICAgICAgcmFpc2UgUmVhZFRpbWVvdXRFcnJvcigKICAgICAgICAgICAgICAgICAgICBzZWxmLCB1cmwsICJSZWFkIHRpbWVkIG91dC4gKHJlYWQgdGltZW91dD0lcykiICUgcmVhZF90aW1lb3V0KQogICAgICAgICAgICBpZiByZWFkX3RpbWVvdXQgaXMgVGltZW91dC5ERUZBVUxUX1RJTUVPVVQ6CiAgICAgICAgICAgICAgICBjb25uLnNvY2suc2V0dGltZW91dChzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSkKICAgICAgICAgICAgZWxzZTogICMgTm9uZSBvciBhIHZhbHVlCiAgICAgICAgICAgICAgICBjb25uLnNvY2suc2V0dGltZW91dChyZWFkX3RpbWVvdXQpCgogICAgICAgICMgUmVjZWl2ZSB0aGUgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyCiAgICAgICAgdHJ5OgogICAgICAgICAgICB0cnk6ICAjIFB5dGhvbiAyLjcsIHVzZSBidWZmZXJpbmcgb2YgSFRUUCByZXNwb25zZXMKICAgICAgICAgICAgICAgIGh0dHBsaWJfcmVzcG9uc2UgPSBjb25uLmdldHJlc3BvbnNlKGJ1ZmZlcmluZz1UcnVlKQogICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOiAgIyBQeXRob24gMi42IGFuZCBvbGRlciwgUHl0aG9uIDMKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBodHRwbGliX3Jlc3BvbnNlID0gY29ubi5nZXRyZXNwb25zZSgpCiAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgIyBSZW1vdmUgdGhlIFR5cGVFcnJvciBmcm9tIHRoZSBleGNlcHRpb24gY2hhaW4gaW4gUHl0aG9uIDM7CiAgICAgICAgICAgICAgICAgICAgIyBvdGhlcndpc2UgaXQgbG9va3MgbGlrZSBhIHByb2dyYW1taW5nIGVycm9yIHdhcyB0aGUgY2F1c2UuCiAgICAgICAgICAgICAgICAgICAgc2l4LnJhaXNlX2Zyb20oZSwgTm9uZSkKICAgICAgICBleGNlcHQgKFNvY2tldFRpbWVvdXQsIEJhc2VTU0xFcnJvciwgU29ja2V0RXJyb3IpIGFzIGU6CiAgICAgICAgICAgIHNlbGYuX3JhaXNlX3RpbWVvdXQoZXJyPWUsIHVybD11cmwsIHRpbWVvdXRfdmFsdWU9cmVhZF90aW1lb3V0KQogICAgICAgICAgICByYWlzZQoKICAgICAgICAjIEFwcEVuZ2luZSBkb2Vzbid0IGhhdmUgYSB2ZXJzaW9uIGF0dHIuCiAgICAgICAgaHR0cF92ZXJzaW9uID0gZ2V0YXR0cihjb25uLCAnX2h0dHBfdnNuX3N0cicsICdIVFRQLz8nKQogICAgICAgIGxvZy5kZWJ1ZygiJXM6Ly8lczolcyBcIiVzICVzICVzXCIgJXMgJXMiLCBzZWxmLnNjaGVtZSwgc2VsZi5ob3N0LCBzZWxmLnBvcnQsCiAgICAgICAgICAgICAgICAgIG1ldGhvZCwgdXJsLCBodHRwX3ZlcnNpb24sIGh0dHBsaWJfcmVzcG9uc2Uuc3RhdHVzLAogICAgICAgICAgICAgICAgICBodHRwbGliX3Jlc3BvbnNlLmxlbmd0aCkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBhc3NlcnRfaGVhZGVyX3BhcnNpbmcoaHR0cGxpYl9yZXNwb25zZS5tc2cpCiAgICAgICAgZXhjZXB0IChIZWFkZXJQYXJzaW5nRXJyb3IsIFR5cGVFcnJvcikgYXMgaHBlOiAgIyBQbGF0Zm9ybS1zcGVjaWZpYzogUHl0aG9uIDMKICAgICAgICAgICAgbG9nLndhcm5pbmcoCiAgICAgICAgICAgICAgICAnRmFpbGVkIHRvIHBhcnNlIGhlYWRlcnMgKHVybD0lcyk6ICVzJywKICAgICAgICAgICAgICAgIHNlbGYuX2Fic29sdXRlX3VybCh1cmwpLCBocGUsIGV4Y19pbmZvPVRydWUpCgogICAgICAgIHJldHVybiBodHRwbGliX3Jlc3BvbnNlCgogICAgZGVmIF9hYnNvbHV0ZV91cmwoc2VsZiwgcGF0aCk6CiAgICAgICAgcmV0dXJuIFVybChzY2hlbWU9c2VsZi5zY2hlbWUsIGhvc3Q9c2VsZi5ob3N0LCBwb3J0PXNlbGYucG9ydCwgcGF0aD1wYXRoKS51cmwKCiAgICBkZWYgY2xvc2Uoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgQ2xvc2UgYWxsIHBvb2xlZCBjb25uZWN0aW9ucyBhbmQgZGlzYWJsZSB0aGUgcG9vbC4KICAgICAgICAiIiIKICAgICAgICAjIERpc2FibGUgYWNjZXNzIHRvIHRoZSBwb29sCiAgICAgICAgb2xkX3Bvb2wsIHNlbGYucG9vbCA9IHNlbGYucG9vbCwgTm9uZQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICAgICBjb25uID0gb2xkX3Bvb2wuZ2V0KGJsb2NrPUZhbHNlKQogICAgICAgICAgICAgICAgaWYgY29ubjoKICAgICAgICAgICAgICAgICAgICBjb25uLmNsb3NlKCkKCiAgICAgICAgZXhjZXB0IHF1ZXVlLkVtcHR5OgogICAgICAgICAgICBwYXNzICAjIERvbmUuCgogICAgZGVmIGlzX3NhbWVfaG9zdChzZWxmLCB1cmwpOgogICAgICAgICIiIgogICAgICAgIENoZWNrIGlmIHRoZSBnaXZlbiBgYHVybGBgIGlzIGEgbWVtYmVyIG9mIHRoZSBzYW1lIGhvc3QgYXMgdGhpcwogICAgICAgIGNvbm5lY3Rpb24gcG9vbC4KICAgICAgICAiIiIKICAgICAgICBpZiB1cmwuc3RhcnRzd2l0aCgnLycpOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICAjIFRPRE86IEFkZCBvcHRpb25hbCBzdXBwb3J0IGZvciBzb2NrZXQuZ2V0aG9zdGJ5bmFtZSBjaGVja2luZy4KICAgICAgICBzY2hlbWUsIGhvc3QsIHBvcnQgPSBnZXRfaG9zdCh1cmwpCgogICAgICAgIGhvc3QgPSBfaXB2Nl9ob3N0KGhvc3QpLmxvd2VyKCkKCiAgICAgICAgIyBVc2UgZXhwbGljaXQgZGVmYXVsdCBwb3J0IGZvciBjb21wYXJpc29uIHdoZW4gbm9uZSBpcyBnaXZlbgogICAgICAgIGlmIHNlbGYucG9ydCBhbmQgbm90IHBvcnQ6CiAgICAgICAgICAgIHBvcnQgPSBwb3J0X2J5X3NjaGVtZS5nZXQoc2NoZW1lKQogICAgICAgIGVsaWYgbm90IHNlbGYucG9ydCBhbmQgcG9ydCA9PSBwb3J0X2J5X3NjaGVtZS5nZXQoc2NoZW1lKToKICAgICAgICAgICAgcG9ydCA9IE5vbmUKCiAgICAgICAgcmV0dXJuIChzY2hlbWUsIGhvc3QsIHBvcnQpID09IChzZWxmLnNjaGVtZSwgc2VsZi5ob3N0LCBzZWxmLnBvcnQpCgogICAgZGVmIHVybG9wZW4oc2VsZiwgbWV0aG9kLCB1cmwsIGJvZHk9Tm9uZSwgaGVhZGVycz1Ob25lLCByZXRyaWVzPU5vbmUsCiAgICAgICAgICAgICAgICByZWRpcmVjdD1UcnVlLCBhc3NlcnRfc2FtZV9ob3N0PVRydWUsIHRpbWVvdXQ9X0RlZmF1bHQsCiAgICAgICAgICAgICAgICBwb29sX3RpbWVvdXQ9Tm9uZSwgcmVsZWFzZV9jb25uPU5vbmUsIGNodW5rZWQ9RmFsc2UsCiAgICAgICAgICAgICAgICBib2R5X3Bvcz1Ob25lLCAqKnJlc3BvbnNlX2t3KToKICAgICAgICAiIiIKICAgICAgICBHZXQgYSBjb25uZWN0aW9uIGZyb20gdGhlIHBvb2wgYW5kIHBlcmZvcm0gYW4gSFRUUCByZXF1ZXN0LiBUaGlzIGlzIHRoZQogICAgICAgIGxvd2VzdCBsZXZlbCBjYWxsIGZvciBtYWtpbmcgYSByZXF1ZXN0LCBzbyB5b3UnbGwgbmVlZCB0byBzcGVjaWZ5IGFsbAogICAgICAgIHRoZSByYXcgZGV0YWlscy4KCiAgICAgICAgLi4gbm90ZTo6CgogICAgICAgICAgIE1vcmUgY29tbW9ubHksIGl0J3MgYXBwcm9wcmlhdGUgdG8gdXNlIGEgY29udmVuaWVuY2UgbWV0aG9kIHByb3ZpZGVkCiAgICAgICAgICAgYnkgOmNsYXNzOmAuUmVxdWVzdE1ldGhvZHNgLCBzdWNoIGFzIDptZXRoOmByZXF1ZXN0YC4KCiAgICAgICAgLi4gbm90ZTo6CgogICAgICAgICAgIGByZWxlYXNlX2Nvbm5gIHdpbGwgb25seSBiZWhhdmUgYXMgZXhwZWN0ZWQgaWYKICAgICAgICAgICBgcHJlbG9hZF9jb250ZW50PUZhbHNlYCBiZWNhdXNlIHdlIHdhbnQgdG8gbWFrZQogICAgICAgICAgIGBwcmVsb2FkX2NvbnRlbnQ9RmFsc2VgIHRoZSBkZWZhdWx0IGJlaGF2aW91ciBzb21lZGF5IHNvb24gd2l0aG91dAogICAgICAgICAgIGJyZWFraW5nIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgoKICAgICAgICA6cGFyYW0gbWV0aG9kOgogICAgICAgICAgICBIVFRQIHJlcXVlc3QgbWV0aG9kIChzdWNoIGFzIEdFVCwgUE9TVCwgUFVULCBldGMuKQoKICAgICAgICA6cGFyYW0gYm9keToKICAgICAgICAgICAgRGF0YSB0byBzZW5kIGluIHRoZSByZXF1ZXN0IGJvZHkgKHVzZWZ1bCBmb3IgY3JlYXRpbmcKICAgICAgICAgICAgUE9TVCByZXF1ZXN0cywgc2VlIEhUVFBDb25uZWN0aW9uUG9vbC5wb3N0X3VybCBmb3IKICAgICAgICAgICAgbW9yZSBjb252ZW5pZW5jZSkuCgogICAgICAgIDpwYXJhbSBoZWFkZXJzOgogICAgICAgICAgICBEaWN0aW9uYXJ5IG9mIGN1c3RvbSBoZWFkZXJzIHRvIHNlbmQsIHN1Y2ggYXMgVXNlci1BZ2VudCwKICAgICAgICAgICAgSWYtTm9uZS1NYXRjaCwgZXRjLiBJZiBOb25lLCBwb29sIGhlYWRlcnMgYXJlIHVzZWQuIElmIHByb3ZpZGVkLAogICAgICAgICAgICB0aGVzZSBoZWFkZXJzIGNvbXBsZXRlbHkgcmVwbGFjZSBhbnkgcG9vbC1zcGVjaWZpYyBoZWFkZXJzLgoKICAgICAgICA6cGFyYW0gcmV0cmllczoKICAgICAgICAgICAgQ29uZmlndXJlIHRoZSBudW1iZXIgb2YgcmV0cmllcyB0byBhbGxvdyBiZWZvcmUgcmFpc2luZyBhCiAgICAgICAgICAgIDpjbGFzczpgfnVybGxpYjMuZXhjZXB0aW9ucy5NYXhSZXRyeUVycm9yYCBleGNlcHRpb24uCgogICAgICAgICAgICBQYXNzIGBgTm9uZWBgIHRvIHJldHJ5IHVudGlsIHlvdSByZWNlaXZlIGEgcmVzcG9uc2UuIFBhc3MgYQogICAgICAgICAgICA6Y2xhc3M6YH51cmxsaWIzLnV0aWwucmV0cnkuUmV0cnlgIG9iamVjdCBmb3IgZmluZS1ncmFpbmVkIGNvbnRyb2wKICAgICAgICAgICAgb3ZlciBkaWZmZXJlbnQgdHlwZXMgb2YgcmV0cmllcy4KICAgICAgICAgICAgUGFzcyBhbiBpbnRlZ2VyIG51bWJlciB0byByZXRyeSBjb25uZWN0aW9uIGVycm9ycyB0aGF0IG1hbnkgdGltZXMsCiAgICAgICAgICAgIGJ1dCBubyBvdGhlciB0eXBlcyBvZiBlcnJvcnMuIFBhc3MgemVybyB0byBuZXZlciByZXRyeS4KCiAgICAgICAgICAgIElmIGBgRmFsc2VgYCwgdGhlbiByZXRyaWVzIGFyZSBkaXNhYmxlZCBhbmQgYW55IGV4Y2VwdGlvbiBpcyByYWlzZWQKICAgICAgICAgICAgaW1tZWRpYXRlbHkuIEFsc28sIGluc3RlYWQgb2YgcmFpc2luZyBhIE1heFJldHJ5RXJyb3Igb24gcmVkaXJlY3RzLAogICAgICAgICAgICB0aGUgcmVkaXJlY3QgcmVzcG9uc2Ugd2lsbCBiZSByZXR1cm5lZC4KCiAgICAgICAgOnR5cGUgcmV0cmllczogOmNsYXNzOmB+dXJsbGliMy51dGlsLnJldHJ5LlJldHJ5YCwgRmFsc2UsIG9yIGFuIGludC4KCiAgICAgICAgOnBhcmFtIHJlZGlyZWN0OgogICAgICAgICAgICBJZiBUcnVlLCBhdXRvbWF0aWNhbGx5IGhhbmRsZSByZWRpcmVjdHMgKHN0YXR1cyBjb2RlcyAzMDEsIDMwMiwKICAgICAgICAgICAgMzAzLCAzMDcsIDMwOCkuIEVhY2ggcmVkaXJlY3QgY291bnRzIGFzIGEgcmV0cnkuIERpc2FibGluZyByZXRyaWVzCiAgICAgICAgICAgIHdpbGwgZGlzYWJsZSByZWRpcmVjdCwgdG9vLgoKICAgICAgICA6cGFyYW0gYXNzZXJ0X3NhbWVfaG9zdDoKICAgICAgICAgICAgSWYgYGBUcnVlYGAsIHdpbGwgbWFrZSBzdXJlIHRoYXQgdGhlIGhvc3Qgb2YgdGhlIHBvb2wgcmVxdWVzdHMgaXMKICAgICAgICAgICAgY29uc2lzdGVudCBlbHNlIHdpbGwgcmFpc2UgSG9zdENoYW5nZWRFcnJvci4gV2hlbiBGYWxzZSwgeW91IGNhbgogICAgICAgICAgICB1c2UgdGhlIHBvb2wgb24gYW4gSFRUUCBwcm94eSBhbmQgcmVxdWVzdCBmb3JlaWduIGhvc3RzLgoKICAgICAgICA6cGFyYW0gdGltZW91dDoKICAgICAgICAgICAgSWYgc3BlY2lmaWVkLCBvdmVycmlkZXMgdGhlIGRlZmF1bHQgdGltZW91dCBmb3IgdGhpcyBvbmUKICAgICAgICAgICAgcmVxdWVzdC4gSXQgbWF5IGJlIGEgZmxvYXQgKGluIHNlY29uZHMpIG9yIGFuIGluc3RhbmNlIG9mCiAgICAgICAgICAgIDpjbGFzczpgdXJsbGliMy51dGlsLlRpbWVvdXRgLgoKICAgICAgICA6cGFyYW0gcG9vbF90aW1lb3V0OgogICAgICAgICAgICBJZiBzZXQgYW5kIHRoZSBwb29sIGlzIHNldCB0byBibG9jaz1UcnVlLCB0aGVuIHRoaXMgbWV0aG9kIHdpbGwKICAgICAgICAgICAgYmxvY2sgZm9yIGBgcG9vbF90aW1lb3V0YGAgc2Vjb25kcyBhbmQgcmFpc2UgRW1wdHlQb29sRXJyb3IgaWYgbm8KICAgICAgICAgICAgY29ubmVjdGlvbiBpcyBhdmFpbGFibGUgd2l0aGluIHRoZSB0aW1lIHBlcmlvZC4KCiAgICAgICAgOnBhcmFtIHJlbGVhc2VfY29ubjoKICAgICAgICAgICAgSWYgRmFsc2UsIHRoZW4gdGhlIHVybG9wZW4gY2FsbCB3aWxsIG5vdCByZWxlYXNlIHRoZSBjb25uZWN0aW9uCiAgICAgICAgICAgIGJhY2sgaW50byB0aGUgcG9vbCBvbmNlIGEgcmVzcG9uc2UgaXMgcmVjZWl2ZWQgKGJ1dCB3aWxsIHJlbGVhc2UgaWYKICAgICAgICAgICAgeW91IHJlYWQgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUgcmVzcG9uc2Ugc3VjaCBhcyB3aGVuCiAgICAgICAgICAgIGBwcmVsb2FkX2NvbnRlbnQ9VHJ1ZWApLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UncmUgbm90IHByZWxvYWRpbmcKICAgICAgICAgICAgdGhlIHJlc3BvbnNlJ3MgY29udGVudCBpbW1lZGlhdGVseS4gWW91IHdpbGwgbmVlZCB0byBjYWxsCiAgICAgICAgICAgIGBgci5yZWxlYXNlX2Nvbm4oKWBgIG9uIHRoZSByZXNwb25zZSBgYHJgYCB0byByZXR1cm4gdGhlIGNvbm5lY3Rpb24KICAgICAgICAgICAgYmFjayBpbnRvIHRoZSBwb29sLiBJZiBOb25lLCBpdCB0YWtlcyB0aGUgdmFsdWUgb2YKICAgICAgICAgICAgYGByZXNwb25zZV9rdy5nZXQoJ3ByZWxvYWRfY29udGVudCcsIFRydWUpYGAuCgogICAgICAgIDpwYXJhbSBjaHVua2VkOgogICAgICAgICAgICBJZiBUcnVlLCB1cmxsaWIzIHdpbGwgc2VuZCB0aGUgYm9keSB1c2luZyBjaHVua2VkIHRyYW5zZmVyCiAgICAgICAgICAgIGVuY29kaW5nLiBPdGhlcndpc2UsIHVybGxpYjMgd2lsbCBzZW5kIHRoZSBib2R5IHVzaW5nIHRoZSBzdGFuZGFyZAogICAgICAgICAgICBjb250ZW50LWxlbmd0aCBmb3JtLiBEZWZhdWx0cyB0byBGYWxzZS4KCiAgICAgICAgOnBhcmFtIGludCBib2R5X3BvczoKICAgICAgICAgICAgUG9zaXRpb24gdG8gc2VlayB0byBpbiBmaWxlLWxpa2UgYm9keSBpbiB0aGUgZXZlbnQgb2YgYSByZXRyeSBvcgogICAgICAgICAgICByZWRpcmVjdC4gVHlwaWNhbGx5IHRoaXMgd29uJ3QgbmVlZCB0byBiZSBzZXQgYmVjYXVzZSB1cmxsaWIzIHdpbGwKICAgICAgICAgICAgYXV0by1wb3B1bGF0ZSB0aGUgdmFsdWUgd2hlbiBuZWVkZWQuCgogICAgICAgIDpwYXJhbSBcXCoqcmVzcG9uc2Vfa3c6CiAgICAgICAgICAgIEFkZGl0aW9uYWwgcGFyYW1ldGVycyBhcmUgcGFzc2VkIHRvCiAgICAgICAgICAgIDptZXRoOmB1cmxsaWIzLnJlc3BvbnNlLkhUVFBSZXNwb25zZS5mcm9tX2h0dHBsaWJgCiAgICAgICAgIiIiCiAgICAgICAgaWYgaGVhZGVycyBpcyBOb25lOgogICAgICAgICAgICBoZWFkZXJzID0gc2VsZi5oZWFkZXJzCgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHJldHJpZXMsIFJldHJ5KToKICAgICAgICAgICAgcmV0cmllcyA9IFJldHJ5LmZyb21faW50KHJldHJpZXMsIHJlZGlyZWN0PXJlZGlyZWN0LCBkZWZhdWx0PXNlbGYucmV0cmllcykKCiAgICAgICAgaWYgcmVsZWFzZV9jb25uIGlzIE5vbmU6CiAgICAgICAgICAgIHJlbGVhc2VfY29ubiA9IHJlc3BvbnNlX2t3LmdldCgncHJlbG9hZF9jb250ZW50JywgVHJ1ZSkKCiAgICAgICAgIyBDaGVjayBob3N0CiAgICAgICAgaWYgYXNzZXJ0X3NhbWVfaG9zdCBhbmQgbm90IHNlbGYuaXNfc2FtZV9ob3N0KHVybCk6CiAgICAgICAgICAgIHJhaXNlIEhvc3RDaGFuZ2VkRXJyb3Ioc2VsZiwgdXJsLCByZXRyaWVzKQoKICAgICAgICBjb25uID0gTm9uZQoKICAgICAgICAjIFRyYWNrIHdoZXRoZXIgYGNvbm5gIG5lZWRzIHRvIGJlIHJlbGVhc2VkIGJlZm9yZQogICAgICAgICMgcmV0dXJuaW5nL3JhaXNpbmcvcmVjdXJzaW5nLiBVcGRhdGUgdGhpcyB2YXJpYWJsZSBpZiBuZWNlc3NhcnksIGFuZAogICAgICAgICMgbGVhdmUgYHJlbGVhc2VfY29ubmAgY29uc3RhbnQgdGhyb3VnaG91dCB0aGUgZnVuY3Rpb24uIFRoYXQgd2F5LCBpZgogICAgICAgICMgdGhlIGZ1bmN0aW9uIHJlY3Vyc2VzLCB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgYHJlbGVhc2VfY29ubmAgd2lsbCBiZQogICAgICAgICMgcGFzc2VkIGRvd24gaW50byB0aGUgcmVjdXJzaXZlIGNhbGwsIGFuZCBpdHMgdmFsdWUgd2lsbCBiZSByZXNwZWN0ZWQuCiAgICAgICAgIwogICAgICAgICMgU2VlIGlzc3VlICM2NTEgWzFdIGZvciBkZXRhaWxzLgogICAgICAgICMKICAgICAgICAjIFsxXSA8aHR0cHM6Ly9naXRodWIuY29tL3NoYXpvdy91cmxsaWIzL2lzc3Vlcy82NTE+CiAgICAgICAgcmVsZWFzZV90aGlzX2Nvbm4gPSByZWxlYXNlX2Nvbm4KCiAgICAgICAgIyBNZXJnZSB0aGUgcHJveHkgaGVhZGVycy4gT25seSBkbyB0aGlzIGluIEhUVFAuIFdlIGhhdmUgdG8gY29weSB0aGUKICAgICAgICAjIGhlYWRlcnMgZGljdCBzbyB3ZSBjYW4gc2FmZWx5IGNoYW5nZSBpdCB3aXRob3V0IHRob3NlIGNoYW5nZXMgYmVpbmcKICAgICAgICAjIHJlZmxlY3RlZCBpbiBhbnlvbmUgZWxzZSdzIGNvcHkuCiAgICAgICAgaWYgc2VsZi5zY2hlbWUgPT0gJ2h0dHAnOgogICAgICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5jb3B5KCkKICAgICAgICAgICAgaGVhZGVycy51cGRhdGUoc2VsZi5wcm94eV9oZWFkZXJzKQoKICAgICAgICAjIE11c3Qga2VlcCB0aGUgZXhjZXB0aW9uIGJvdW5kIHRvIGEgc2VwYXJhdGUgdmFyaWFibGUgb3IgZWxzZSBQeXRob24gMwogICAgICAgICMgY29tcGxhaW5zIGFib3V0IFVuYm91bmRMb2NhbEVycm9yLgogICAgICAgIGVyciA9IE5vbmUKCiAgICAgICAgIyBLZWVwIHRyYWNrIG9mIHdoZXRoZXIgd2UgY2xlYW5seSBleGl0ZWQgdGhlIGV4Y2VwdCBibG9jay4gVGhpcwogICAgICAgICMgZW5zdXJlcyB3ZSBkbyBwcm9wZXIgY2xlYW51cCBpbiBmaW5hbGx5LgogICAgICAgIGNsZWFuX2V4aXQgPSBGYWxzZQoKICAgICAgICAjIFJld2luZCBib2R5IHBvc2l0aW9uLCBpZiBuZWVkZWQuIFJlY29yZCBjdXJyZW50IHBvc2l0aW9uCiAgICAgICAgIyBmb3IgZnV0dXJlIHJld2luZHMgaW4gdGhlIGV2ZW50IG9mIGEgcmVkaXJlY3QvcmV0cnkuCiAgICAgICAgYm9keV9wb3MgPSBzZXRfZmlsZV9wb3NpdGlvbihib2R5LCBib2R5X3BvcykKCiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIFJlcXVlc3QgYSBjb25uZWN0aW9uIGZyb20gdGhlIHF1ZXVlLgogICAgICAgICAgICB0aW1lb3V0X29iaiA9IHNlbGYuX2dldF90aW1lb3V0KHRpbWVvdXQpCiAgICAgICAgICAgIGNvbm4gPSBzZWxmLl9nZXRfY29ubih0aW1lb3V0PXBvb2xfdGltZW91dCkKCiAgICAgICAgICAgIGNvbm4udGltZW91dCA9IHRpbWVvdXRfb2JqLmNvbm5lY3RfdGltZW91dAoKICAgICAgICAgICAgaXNfbmV3X3Byb3h5X2Nvbm4gPSBzZWxmLnByb3h5IGlzIG5vdCBOb25lIGFuZCBub3QgZ2V0YXR0cihjb25uLCAnc29jaycsIE5vbmUpCiAgICAgICAgICAgIGlmIGlzX25ld19wcm94eV9jb25uOgogICAgICAgICAgICAgICAgc2VsZi5fcHJlcGFyZV9wcm94eShjb25uKQoKICAgICAgICAgICAgIyBNYWtlIHRoZSByZXF1ZXN0IG9uIHRoZSBodHRwbGliIGNvbm5lY3Rpb24gb2JqZWN0LgogICAgICAgICAgICBodHRwbGliX3Jlc3BvbnNlID0gc2VsZi5fbWFrZV9yZXF1ZXN0KGNvbm4sIG1ldGhvZCwgdXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ9dGltZW91dF9vYmosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keT1ib2R5LCBoZWFkZXJzPWhlYWRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtlZD1jaHVua2VkKQoKICAgICAgICAgICAgIyBJZiB3ZSdyZSBnb2luZyB0byByZWxlYXNlIHRoZSBjb25uZWN0aW9uIGluIGBgZmluYWxseTpgYCwgdGhlbgogICAgICAgICAgICAjIHRoZSByZXNwb25zZSBkb2Vzbid0IG5lZWQgdG8ga25vdyBhYm91dCB0aGUgY29ubmVjdGlvbi4gT3RoZXJ3aXNlCiAgICAgICAgICAgICMgaXQgd2lsbCBhbHNvIHRyeSB0byByZWxlYXNlIGl0IGFuZCB3ZSdsbCBoYXZlIGEgZG91YmxlLXJlbGVhc2UKICAgICAgICAgICAgIyBtZXNzLgogICAgICAgICAgICByZXNwb25zZV9jb25uID0gY29ubiBpZiBub3QgcmVsZWFzZV9jb25uIGVsc2UgTm9uZQoKICAgICAgICAgICAgIyBQYXNzIG1ldGhvZCB0byBSZXNwb25zZSBmb3IgbGVuZ3RoIGNoZWNraW5nCiAgICAgICAgICAgIHJlc3BvbnNlX2t3WydyZXF1ZXN0X21ldGhvZCddID0gbWV0aG9kCgogICAgICAgICAgICAjIEltcG9ydCBodHRwbGliJ3MgcmVzcG9uc2UgaW50byBvdXIgb3duIHdyYXBwZXIgb2JqZWN0CiAgICAgICAgICAgIHJlc3BvbnNlID0gc2VsZi5SZXNwb25zZUNscy5mcm9tX2h0dHBsaWIoaHR0cGxpYl9yZXNwb25zZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29sPXNlbGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbj1yZXNwb25zZV9jb25uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHJpZXM9cmV0cmllcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJlc3BvbnNlX2t3KQoKICAgICAgICAgICAgIyBFdmVyeXRoaW5nIHdlbnQgZ3JlYXQhCiAgICAgICAgICAgIGNsZWFuX2V4aXQgPSBUcnVlCgogICAgICAgIGV4Y2VwdCBxdWV1ZS5FbXB0eToKICAgICAgICAgICAgIyBUaW1lZCBvdXQgYnkgcXVldWUuCiAgICAgICAgICAgIHJhaXNlIEVtcHR5UG9vbEVycm9yKHNlbGYsICJObyBwb29sIGNvbm5lY3Rpb25zIGFyZSBhdmFpbGFibGUuIikKCiAgICAgICAgZXhjZXB0IChUaW1lb3V0RXJyb3IsIEhUVFBFeGNlcHRpb24sIFNvY2tldEVycm9yLCBQcm90b2NvbEVycm9yLAogICAgICAgICAgICAgICAgQmFzZVNTTEVycm9yLCBTU0xFcnJvciwgQ2VydGlmaWNhdGVFcnJvcikgYXMgZToKICAgICAgICAgICAgIyBEaXNjYXJkIHRoZSBjb25uZWN0aW9uIGZvciB0aGVzZSBleGNlcHRpb25zLiBJdCB3aWxsIGJlCiAgICAgICAgICAgICMgcmVwbGFjZWQgZHVyaW5nIHRoZSBuZXh0IF9nZXRfY29ubigpIGNhbGwuCiAgICAgICAgICAgIGNsZWFuX2V4aXQgPSBGYWxzZQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGUsIChCYXNlU1NMRXJyb3IsIENlcnRpZmljYXRlRXJyb3IpKToKICAgICAgICAgICAgICAgIGUgPSBTU0xFcnJvcihlKQogICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZSwgKFNvY2tldEVycm9yLCBOZXdDb25uZWN0aW9uRXJyb3IpKSBhbmQgc2VsZi5wcm94eToKICAgICAgICAgICAgICAgIGUgPSBQcm94eUVycm9yKCdDYW5ub3QgY29ubmVjdCB0byBwcm94eS4nLCBlKQogICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZSwgKFNvY2tldEVycm9yLCBIVFRQRXhjZXB0aW9uKSk6CiAgICAgICAgICAgICAgICBlID0gUHJvdG9jb2xFcnJvcignQ29ubmVjdGlvbiBhYm9ydGVkLicsIGUpCgogICAgICAgICAgICByZXRyaWVzID0gcmV0cmllcy5pbmNyZW1lbnQobWV0aG9kLCB1cmwsIGVycm9yPWUsIF9wb29sPXNlbGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc3RhY2t0cmFjZT1zeXMuZXhjX2luZm8oKVsyXSkKICAgICAgICAgICAgcmV0cmllcy5zbGVlcCgpCgogICAgICAgICAgICAjIEtlZXAgdHJhY2sgb2YgdGhlIGVycm9yIGZvciB0aGUgcmV0cnkgd2FybmluZy4KICAgICAgICAgICAgZXJyID0gZQoKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBpZiBub3QgY2xlYW5fZXhpdDoKICAgICAgICAgICAgICAgICMgV2UgaGl0IHNvbWUga2luZCBvZiBleGNlcHRpb24sIGhhbmRsZWQgb3Igb3RoZXJ3aXNlLiBXZSBuZWVkCiAgICAgICAgICAgICAgICAjIHRvIHRocm93IHRoZSBjb25uZWN0aW9uIGF3YXkgdW5sZXNzIGV4cGxpY2l0bHkgdG9sZCBub3QgdG8uCiAgICAgICAgICAgICAgICAjIENsb3NlIHRoZSBjb25uZWN0aW9uLCBzZXQgdGhlIHZhcmlhYmxlIHRvIE5vbmUsIGFuZCBtYWtlIHN1cmUKICAgICAgICAgICAgICAgICMgd2UgcHV0IHRoZSBOb25lIGJhY2sgaW4gdGhlIHBvb2wgdG8gYXZvaWQgbGVha2luZyBpdC4KICAgICAgICAgICAgICAgIGNvbm4gPSBjb25uIGFuZCBjb25uLmNsb3NlKCkKICAgICAgICAgICAgICAgIHJlbGVhc2VfdGhpc19jb25uID0gVHJ1ZQoKICAgICAgICAgICAgaWYgcmVsZWFzZV90aGlzX2Nvbm46CiAgICAgICAgICAgICAgICAjIFB1dCB0aGUgY29ubmVjdGlvbiBiYWNrIHRvIGJlIHJldXNlZC4gSWYgdGhlIGNvbm5lY3Rpb24gaXMKICAgICAgICAgICAgICAgICMgZXhwaXJlZCB0aGVuIGl0IHdpbGwgYmUgTm9uZSwgd2hpY2ggd2lsbCBnZXQgcmVwbGFjZWQgd2l0aCBhCiAgICAgICAgICAgICAgICAjIGZyZXNoIGNvbm5lY3Rpb24gZHVyaW5nIF9nZXRfY29ubi4KICAgICAgICAgICAgICAgIHNlbGYuX3B1dF9jb25uKGNvbm4pCgogICAgICAgIGlmIG5vdCBjb25uOgogICAgICAgICAgICAjIFRyeSBhZ2FpbgogICAgICAgICAgICBsb2cud2FybmluZygiUmV0cnlpbmcgKCVyKSBhZnRlciBjb25uZWN0aW9uICIKICAgICAgICAgICAgICAgICAgICAgICAgImJyb2tlbiBieSAnJXInOiAlcyIsIHJldHJpZXMsIGVyciwgdXJsKQogICAgICAgICAgICByZXR1cm4gc2VsZi51cmxvcGVuKG1ldGhvZCwgdXJsLCBib2R5LCBoZWFkZXJzLCByZXRyaWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0LCBhc3NlcnRfc2FtZV9ob3N0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ9dGltZW91dCwgcG9vbF90aW1lb3V0PXBvb2xfdGltZW91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxlYXNlX2Nvbm49cmVsZWFzZV9jb25uLCBib2R5X3Bvcz1ib2R5X3BvcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJlc3BvbnNlX2t3KQoKICAgICAgICBkZWYgZHJhaW5fYW5kX3JlbGVhc2VfY29ubihyZXNwb25zZSk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICMgZGlzY2FyZCBhbnkgcmVtYWluaW5nIHJlc3BvbnNlIGJvZHksIHRoZSBjb25uZWN0aW9uIHdpbGwgYmUKICAgICAgICAgICAgICAgICMgcmVsZWFzZWQgYmFjayB0byB0aGUgcG9vbCBvbmNlIHRoZSBlbnRpcmUgcmVzcG9uc2UgaXMgcmVhZAogICAgICAgICAgICAgICAgcmVzcG9uc2UucmVhZCgpCiAgICAgICAgICAgIGV4Y2VwdCAoVGltZW91dEVycm9yLCBIVFRQRXhjZXB0aW9uLCBTb2NrZXRFcnJvciwgUHJvdG9jb2xFcnJvciwKICAgICAgICAgICAgICAgICAgICBCYXNlU1NMRXJyb3IsIFNTTEVycm9yKSBhcyBlOgogICAgICAgICAgICAgICAgcGFzcwoKICAgICAgICAjIEhhbmRsZSByZWRpcmVjdD8KICAgICAgICByZWRpcmVjdF9sb2NhdGlvbiA9IHJlZGlyZWN0IGFuZCByZXNwb25zZS5nZXRfcmVkaXJlY3RfbG9jYXRpb24oKQogICAgICAgIGlmIHJlZGlyZWN0X2xvY2F0aW9uOgogICAgICAgICAgICBpZiByZXNwb25zZS5zdGF0dXMgPT0gMzAzOgogICAgICAgICAgICAgICAgbWV0aG9kID0gJ0dFVCcKCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJldHJpZXMgPSByZXRyaWVzLmluY3JlbWVudChtZXRob2QsIHVybCwgcmVzcG9uc2U9cmVzcG9uc2UsIF9wb29sPXNlbGYpCiAgICAgICAgICAgIGV4Y2VwdCBNYXhSZXRyeUVycm9yOgogICAgICAgICAgICAgICAgaWYgcmV0cmllcy5yYWlzZV9vbl9yZWRpcmVjdDoKICAgICAgICAgICAgICAgICAgICAjIERyYWluIGFuZCByZWxlYXNlIHRoZSBjb25uZWN0aW9uIGZvciB0aGlzIHJlc3BvbnNlLCBzaW5jZQogICAgICAgICAgICAgICAgICAgICMgd2UncmUgbm90IHJldHVybmluZyBpdCB0byBiZSByZWxlYXNlZCBtYW51YWxseS4KICAgICAgICAgICAgICAgICAgICBkcmFpbl9hbmRfcmVsZWFzZV9jb25uKHJlc3BvbnNlKQogICAgICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UKCiAgICAgICAgICAgICMgZHJhaW4gYW5kIHJldHVybiB0aGUgY29ubmVjdGlvbiB0byB0aGUgcG9vbCBiZWZvcmUgcmVjdXJzaW5nCiAgICAgICAgICAgIGRyYWluX2FuZF9yZWxlYXNlX2Nvbm4ocmVzcG9uc2UpCgogICAgICAgICAgICByZXRyaWVzLnNsZWVwX2Zvcl9yZXRyeShyZXNwb25zZSkKICAgICAgICAgICAgbG9nLmRlYnVnKCJSZWRpcmVjdGluZyAlcyAtPiAlcyIsIHVybCwgcmVkaXJlY3RfbG9jYXRpb24pCiAgICAgICAgICAgIHJldHVybiBzZWxmLnVybG9wZW4oCiAgICAgICAgICAgICAgICBtZXRob2QsIHJlZGlyZWN0X2xvY2F0aW9uLCBib2R5LCBoZWFkZXJzLAogICAgICAgICAgICAgICAgcmV0cmllcz1yZXRyaWVzLCByZWRpcmVjdD1yZWRpcmVjdCwKICAgICAgICAgICAgICAgIGFzc2VydF9zYW1lX2hvc3Q9YXNzZXJ0X3NhbWVfaG9zdCwKICAgICAgICAgICAgICAgIHRpbWVvdXQ9dGltZW91dCwgcG9vbF90aW1lb3V0PXBvb2xfdGltZW91dCwKICAgICAgICAgICAgICAgIHJlbGVhc2VfY29ubj1yZWxlYXNlX2Nvbm4sIGJvZHlfcG9zPWJvZHlfcG9zLAogICAgICAgICAgICAgICAgKipyZXNwb25zZV9rdykKCiAgICAgICAgIyBDaGVjayBpZiB3ZSBzaG91bGQgcmV0cnkgdGhlIEhUVFAgcmVzcG9uc2UuCiAgICAgICAgaGFzX3JldHJ5X2FmdGVyID0gYm9vbChyZXNwb25zZS5nZXRoZWFkZXIoJ1JldHJ5LUFmdGVyJykpCiAgICAgICAgaWYgcmV0cmllcy5pc19yZXRyeShtZXRob2QsIHJlc3BvbnNlLnN0YXR1cywgaGFzX3JldHJ5X2FmdGVyKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmV0cmllcyA9IHJldHJpZXMuaW5jcmVtZW50KG1ldGhvZCwgdXJsLCByZXNwb25zZT1yZXNwb25zZSwgX3Bvb2w9c2VsZikKICAgICAgICAgICAgZXhjZXB0IE1heFJldHJ5RXJyb3I6CiAgICAgICAgICAgICAgICBpZiByZXRyaWVzLnJhaXNlX29uX3N0YXR1czoKICAgICAgICAgICAgICAgICAgICAjIERyYWluIGFuZCByZWxlYXNlIHRoZSBjb25uZWN0aW9uIGZvciB0aGlzIHJlc3BvbnNlLCBzaW5jZQogICAgICAgICAgICAgICAgICAgICMgd2UncmUgbm90IHJldHVybmluZyBpdCB0byBiZSByZWxlYXNlZCBtYW51YWxseS4KICAgICAgICAgICAgICAgICAgICBkcmFpbl9hbmRfcmVsZWFzZV9jb25uKHJlc3BvbnNlKQogICAgICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UKCiAgICAgICAgICAgICMgZHJhaW4gYW5kIHJldHVybiB0aGUgY29ubmVjdGlvbiB0byB0aGUgcG9vbCBiZWZvcmUgcmVjdXJzaW5nCiAgICAgICAgICAgIGRyYWluX2FuZF9yZWxlYXNlX2Nvbm4ocmVzcG9uc2UpCgogICAgICAgICAgICByZXRyaWVzLnNsZWVwKHJlc3BvbnNlKQogICAgICAgICAgICBsb2cuZGVidWcoIlJldHJ5OiAlcyIsIHVybCkKICAgICAgICAgICAgcmV0dXJuIHNlbGYudXJsb3BlbigKICAgICAgICAgICAgICAgIG1ldGhvZCwgdXJsLCBib2R5LCBoZWFkZXJzLAogICAgICAgICAgICAgICAgcmV0cmllcz1yZXRyaWVzLCByZWRpcmVjdD1yZWRpcmVjdCwKICAgICAgICAgICAgICAgIGFzc2VydF9zYW1lX2hvc3Q9YXNzZXJ0X3NhbWVfaG9zdCwKICAgICAgICAgICAgICAgIHRpbWVvdXQ9dGltZW91dCwgcG9vbF90aW1lb3V0PXBvb2xfdGltZW91dCwKICAgICAgICAgICAgICAgIHJlbGVhc2VfY29ubj1yZWxlYXNlX2Nvbm4sCiAgICAgICAgICAgICAgICBib2R5X3Bvcz1ib2R5X3BvcywgKipyZXNwb25zZV9rdykKCiAgICAgICAgcmV0dXJuIHJlc3BvbnNlCgoKY2xhc3MgSFRUUFNDb25uZWN0aW9uUG9vbChIVFRQQ29ubmVjdGlvblBvb2wpOgogICAgIiIiCiAgICBTYW1lIGFzIDpjbGFzczpgLkhUVFBDb25uZWN0aW9uUG9vbGAsIGJ1dCBIVFRQUy4KCiAgICBXaGVuIFB5dGhvbiBpcyBjb21waWxlZCB3aXRoIHRoZSA6bW9kOmBzc2xgIG1vZHVsZSwgdGhlbgogICAgOmNsYXNzOmAuVmVyaWZpZWRIVFRQU0Nvbm5lY3Rpb25gIGlzIHVzZWQsIHdoaWNoICpjYW4qIHZlcmlmeSBjZXJ0aWZpY2F0ZXMsCiAgICBpbnN0ZWFkIG9mIDpjbGFzczpgLkhUVFBTQ29ubmVjdGlvbmAuCgogICAgOmNsYXNzOmAuVmVyaWZpZWRIVFRQU0Nvbm5lY3Rpb25gIHVzZXMgb25lIG9mIGBgYXNzZXJ0X2ZpbmdlcnByaW50YGAsCiAgICBgYGFzc2VydF9ob3N0bmFtZWBgIGFuZCBgYGhvc3RgYCBpbiB0aGlzIG9yZGVyIHRvIHZlcmlmeSBjb25uZWN0aW9ucy4KICAgIElmIGBgYXNzZXJ0X2hvc3RuYW1lYGAgaXMgRmFsc2UsIG5vIHZlcmlmaWNhdGlvbiBpcyBkb25lLgoKICAgIFRoZSBgYGtleV9maWxlYGAsIGBgY2VydF9maWxlYGAsIGBgY2VydF9yZXFzYGAsIGBgY2FfY2VydHNgYCwKICAgIGBgY2FfY2VydF9kaXJgYCwgYW5kIGBgc3NsX3ZlcnNpb25gYCBhcmUgb25seSB1c2VkIGlmIDptb2Q6YHNzbGAgaXMKICAgIGF2YWlsYWJsZSBhbmQgYXJlIGZlZCBpbnRvIDptZXRoOmB1cmxsaWIzLnV0aWwuc3NsX3dyYXBfc29ja2V0YCB0byB1cGdyYWRlCiAgICB0aGUgY29ubmVjdGlvbiBzb2NrZXQgaW50byBhbiBTU0wgc29ja2V0LgogICAgIiIiCgogICAgc2NoZW1lID0gJ2h0dHBzJwogICAgQ29ubmVjdGlvbkNscyA9IEhUVFBTQ29ubmVjdGlvbgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0LCBwb3J0PU5vbmUsCiAgICAgICAgICAgICAgICAgc3RyaWN0PUZhbHNlLCB0aW1lb3V0PVRpbWVvdXQuREVGQVVMVF9USU1FT1VULCBtYXhzaXplPTEsCiAgICAgICAgICAgICAgICAgYmxvY2s9RmFsc2UsIGhlYWRlcnM9Tm9uZSwgcmV0cmllcz1Ob25lLAogICAgICAgICAgICAgICAgIF9wcm94eT1Ob25lLCBfcHJveHlfaGVhZGVycz1Ob25lLAogICAgICAgICAgICAgICAgIGtleV9maWxlPU5vbmUsIGNlcnRfZmlsZT1Ob25lLCBjZXJ0X3JlcXM9Tm9uZSwKICAgICAgICAgICAgICAgICBjYV9jZXJ0cz1Ob25lLCBzc2xfdmVyc2lvbj1Ob25lLAogICAgICAgICAgICAgICAgIGFzc2VydF9ob3N0bmFtZT1Ob25lLCBhc3NlcnRfZmluZ2VycHJpbnQ9Tm9uZSwKICAgICAgICAgICAgICAgICBjYV9jZXJ0X2Rpcj1Ob25lLCAqKmNvbm5fa3cpOgoKICAgICAgICBIVFRQQ29ubmVjdGlvblBvb2wuX19pbml0X18oc2VsZiwgaG9zdCwgcG9ydCwgc3RyaWN0LCB0aW1lb3V0LCBtYXhzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jaywgaGVhZGVycywgcmV0cmllcywgX3Byb3h5LCBfcHJveHlfaGVhZGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipjb25uX2t3KQoKICAgICAgICBpZiBjYV9jZXJ0cyBhbmQgY2VydF9yZXFzIGlzIE5vbmU6CiAgICAgICAgICAgIGNlcnRfcmVxcyA9ICdDRVJUX1JFUVVJUkVEJwoKICAgICAgICBzZWxmLmtleV9maWxlID0ga2V5X2ZpbGUKICAgICAgICBzZWxmLmNlcnRfZmlsZSA9IGNlcnRfZmlsZQogICAgICAgIHNlbGYuY2VydF9yZXFzID0gY2VydF9yZXFzCiAgICAgICAgc2VsZi5jYV9jZXJ0cyA9IGNhX2NlcnRzCiAgICAgICAgc2VsZi5jYV9jZXJ0X2RpciA9IGNhX2NlcnRfZGlyCiAgICAgICAgc2VsZi5zc2xfdmVyc2lvbiA9IHNzbF92ZXJzaW9uCiAgICAgICAgc2VsZi5hc3NlcnRfaG9zdG5hbWUgPSBhc3NlcnRfaG9zdG5hbWUKICAgICAgICBzZWxmLmFzc2VydF9maW5nZXJwcmludCA9IGFzc2VydF9maW5nZXJwcmludAoKICAgIGRlZiBfcHJlcGFyZV9jb25uKHNlbGYsIGNvbm4pOgogICAgICAgICIiIgogICAgICAgIFByZXBhcmUgdGhlIGBgY29ubmVjdGlvbmBgIGZvciA6bWV0aDpgdXJsbGliMy51dGlsLnNzbF93cmFwX3NvY2tldGAKICAgICAgICBhbmQgZXN0YWJsaXNoIHRoZSB0dW5uZWwgaWYgcHJveHkgaXMgdXNlZC4KICAgICAgICAiIiIKCiAgICAgICAgaWYgaXNpbnN0YW5jZShjb25uLCBWZXJpZmllZEhUVFBTQ29ubmVjdGlvbik6CiAgICAgICAgICAgIGNvbm4uc2V0X2NlcnQoa2V5X2ZpbGU9c2VsZi5rZXlfZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X2ZpbGU9c2VsZi5jZXJ0X2ZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNlbGYuY2VydF9yZXFzLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNhX2NlcnRzPXNlbGYuY2FfY2VydHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FfY2VydF9kaXI9c2VsZi5jYV9jZXJ0X2RpciwKICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRfaG9zdG5hbWU9c2VsZi5hc3NlcnRfaG9zdG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0X2ZpbmdlcnByaW50PXNlbGYuYXNzZXJ0X2ZpbmdlcnByaW50KQogICAgICAgICAgICBjb25uLnNzbF92ZXJzaW9uID0gc2VsZi5zc2xfdmVyc2lvbgogICAgICAgIHJldHVybiBjb25uCgogICAgZGVmIF9wcmVwYXJlX3Byb3h5KHNlbGYsIGNvbm4pOgogICAgICAgICIiIgogICAgICAgIEVzdGFibGlzaCB0dW5uZWwgY29ubmVjdGlvbiBlYXJseSwgYmVjYXVzZSBvdGhlcndpc2UgaHR0cGxpYgogICAgICAgIHdvdWxkIGltcHJvcGVybHkgc2V0IEhvc3Q6IGhlYWRlciB0byBwcm94eSdzIElQOnBvcnQuCiAgICAgICAgIiIiCiAgICAgICAgIyBQeXRob24gMi43KwogICAgICAgIHRyeToKICAgICAgICAgICAgc2V0X3R1bm5lbCA9IGNvbm4uc2V0X3R1bm5lbAogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjogICMgUGxhdGZvcm0tc3BlY2lmaWM6IFB5dGhvbiAyLjYKICAgICAgICAgICAgc2V0X3R1bm5lbCA9IGNvbm4uX3NldF90dW5uZWwKCiAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mbyA8PSAoMiwgNiwgNCkgYW5kIG5vdCBzZWxmLnByb3h5X2hlYWRlcnM6ICAjIFB5dGhvbiAyLjYuNCBhbmQgb2xkZXIKICAgICAgICAgICAgc2V0X3R1bm5lbChzZWxmLl9wcm94eV9ob3N0LCBzZWxmLnBvcnQpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2V0X3R1bm5lbChzZWxmLl9wcm94eV9ob3N0LCBzZWxmLnBvcnQsIHNlbGYucHJveHlfaGVhZGVycykKCiAgICAgICAgY29ubi5jb25uZWN0KCkKCiAgICBkZWYgX25ld19jb25uKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBhIGZyZXNoIDpjbGFzczpgaHR0cGxpYi5IVFRQU0Nvbm5lY3Rpb25gLgogICAgICAgICIiIgogICAgICAgIHNlbGYubnVtX2Nvbm5lY3Rpb25zICs9IDEKICAgICAgICBsb2cuZGVidWcoIlN0YXJ0aW5nIG5ldyBIVFRQUyBjb25uZWN0aW9uICglZCk6ICVzIiwKICAgICAgICAgICAgICAgICAgc2VsZi5udW1fY29ubmVjdGlvbnMsIHNlbGYuaG9zdCkKCiAgICAgICAgaWYgbm90IHNlbGYuQ29ubmVjdGlvbkNscyBvciBzZWxmLkNvbm5lY3Rpb25DbHMgaXMgRHVtbXlDb25uZWN0aW9uOgogICAgICAgICAgICByYWlzZSBTU0xFcnJvcigiQ2FuJ3QgY29ubmVjdCB0byBIVFRQUyBVUkwgYmVjYXVzZSB0aGUgU1NMICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vZHVsZSBpcyBub3QgYXZhaWxhYmxlLiIpCgogICAgICAgIGFjdHVhbF9ob3N0ID0gc2VsZi5ob3N0CiAgICAgICAgYWN0dWFsX3BvcnQgPSBzZWxmLnBvcnQKICAgICAgICBpZiBzZWxmLnByb3h5IGlzIG5vdCBOb25lOgogICAgICAgICAgICBhY3R1YWxfaG9zdCA9IHNlbGYucHJveHkuaG9zdAogICAgICAgICAgICBhY3R1YWxfcG9ydCA9IHNlbGYucHJveHkucG9ydAoKICAgICAgICBjb25uID0gc2VsZi5Db25uZWN0aW9uQ2xzKGhvc3Q9YWN0dWFsX2hvc3QsIHBvcnQ9YWN0dWFsX3BvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0PXNlbGYudGltZW91dC5jb25uZWN0X3RpbWVvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpY3Q9c2VsZi5zdHJpY3QsICoqc2VsZi5jb25uX2t3KQoKICAgICAgICByZXR1cm4gc2VsZi5fcHJlcGFyZV9jb25uKGNvbm4pCgogICAgZGVmIF92YWxpZGF0ZV9jb25uKHNlbGYsIGNvbm4pOgogICAgICAgICIiIgogICAgICAgIENhbGxlZCByaWdodCBiZWZvcmUgYSByZXF1ZXN0IGlzIG1hZGUsIGFmdGVyIHRoZSBzb2NrZXQgaXMgY3JlYXRlZC4KICAgICAgICAiIiIKICAgICAgICBzdXBlcihIVFRQU0Nvbm5lY3Rpb25Qb29sLCBzZWxmKS5fdmFsaWRhdGVfY29ubihjb25uKQoKICAgICAgICAjIEZvcmNlIGNvbm5lY3QgZWFybHkgdG8gYWxsb3cgdXMgdG8gdmFsaWRhdGUgdGhlIGNvbm5lY3Rpb24uCiAgICAgICAgaWYgbm90IGdldGF0dHIoY29ubiwgJ3NvY2snLCBOb25lKTogICMgQXBwRW5naW5lIG1pZ2h0IG5vdCBoYXZlICBgLnNvY2tgCiAgICAgICAgICAgIGNvbm4uY29ubmVjdCgpCgogICAgICAgIGlmIG5vdCBjb25uLmlzX3ZlcmlmaWVkOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCgKICAgICAgICAgICAgICAgICdVbnZlcmlmaWVkIEhUVFBTIHJlcXVlc3QgaXMgYmVpbmcgbWFkZS4gJwogICAgICAgICAgICAgICAgJ0FkZGluZyBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gaXMgc3Ryb25nbHkgYWR2aXNlZC4gU2VlOiAnCiAgICAgICAgICAgICAgICAnaHR0cHM6Ly91cmxsaWIzLnJlYWR0aGVkb2NzLmlvL2VuL2xhdGVzdC9hZHZhbmNlZC11c2FnZS5odG1sJwogICAgICAgICAgICAgICAgJyNzc2wtd2FybmluZ3MnKSwKICAgICAgICAgICAgICAgIEluc2VjdXJlUmVxdWVzdFdhcm5pbmcpCgoKZGVmIGNvbm5lY3Rpb25fZnJvbV91cmwodXJsLCAqKmt3KToKICAgICIiIgogICAgR2l2ZW4gYSB1cmwsIHJldHVybiBhbiA6Y2xhc3M6YC5Db25uZWN0aW9uUG9vbGAgaW5zdGFuY2Ugb2YgaXRzIGhvc3QuCgogICAgVGhpcyBpcyBhIHNob3J0Y3V0IGZvciBub3QgaGF2aW5nIHRvIHBhcnNlIG91dCB0aGUgc2NoZW1lLCBob3N0LCBhbmQgcG9ydAogICAgb2YgdGhlIHVybCBiZWZvcmUgY3JlYXRpbmcgYW4gOmNsYXNzOmAuQ29ubmVjdGlvblBvb2xgIGluc3RhbmNlLgoKICAgIDpwYXJhbSB1cmw6CiAgICAgICAgQWJzb2x1dGUgVVJMIHN0cmluZyB0aGF0IG11c3QgaW5jbHVkZSB0aGUgc2NoZW1lLiBQb3J0IGlzIG9wdGlvbmFsLgoKICAgIDpwYXJhbSBcXCoqa3c6CiAgICAgICAgUGFzc2VzIGFkZGl0aW9uYWwgcGFyYW1ldGVycyB0byB0aGUgY29uc3RydWN0b3Igb2YgdGhlIGFwcHJvcHJpYXRlCiAgICAgICAgOmNsYXNzOmAuQ29ubmVjdGlvblBvb2xgLiBVc2VmdWwgZm9yIHNwZWNpZnlpbmcgdGhpbmdzIGxpa2UKICAgICAgICB0aW1lb3V0LCBtYXhzaXplLCBoZWFkZXJzLCBldGMuCgogICAgRXhhbXBsZTo6CgogICAgICAgID4+PiBjb25uID0gY29ubmVjdGlvbl9mcm9tX3VybCgnaHR0cDovL2dvb2dsZS5jb20vJykKICAgICAgICA+Pj4gciA9IGNvbm4ucmVxdWVzdCgnR0VUJywgJy8nKQogICAgIiIiCiAgICBzY2hlbWUsIGhvc3QsIHBvcnQgPSBnZXRfaG9zdCh1cmwpCiAgICBwb3J0ID0gcG9ydCBvciBwb3J0X2J5X3NjaGVtZS5nZXQoc2NoZW1lLCA4MCkKICAgIGlmIHNjaGVtZSA9PSAnaHR0cHMnOgogICAgICAgIHJldHVybiBIVFRQU0Nvbm5lY3Rpb25Qb29sKGhvc3QsIHBvcnQ9cG9ydCwgKiprdykKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIEhUVFBDb25uZWN0aW9uUG9vbChob3N0LCBwb3J0PXBvcnQsICoqa3cpCgoKZGVmIF9pcHY2X2hvc3QoaG9zdCk6CiAgICAiIiIKICAgIFByb2Nlc3MgSVB2NiBhZGRyZXNzIGxpdGVyYWxzCiAgICAiIiIKCiAgICAjIGh0dHBsaWIgZG9lc24ndCBsaWtlIGl0IHdoZW4gd2UgaW5jbHVkZSBicmFja2V0cyBpbiBJUHY2IGFkZHJlc3NlcwogICAgIyBTcGVjaWZpY2FsbHksIGlmIHdlIGluY2x1ZGUgYnJhY2tldHMgYnV0IGFsc28gcGFzcyB0aGUgcG9ydCB0aGVuCiAgICAjIGh0dHBsaWIgY3JhemlseSBkb3VibGVzIHVwIHRoZSBzcXVhcmUgYnJhY2tldHMgb24gdGhlIEhvc3QgaGVhZGVyLgogICAgIyBJbnN0ZWFkLCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSBuZXZlciBwYXNzIGBgTm9uZWBgIGFzIHRoZSBwb3J0LgogICAgIyBIb3dldmVyLCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSByZWFzb25zIHdlIGNhbid0IGFjdHVhbGx5CiAgICAjICphc3NlcnQqIHRoYXQuICBTZWUgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTI4NTM5CiAgICAjCiAgICAjIEFsc28gaWYgYW4gSVB2NiBhZGRyZXNzIGxpdGVyYWwgaGFzIGEgem9uZSBpZGVudGlmaWVyLCB0aGUKICAgICMgcGVyY2VudCBzaWduIG1pZ2h0IGJlIFVSSWVuY29kZWQsIGNvbnZlcnQgaXQgYmFjayBpbnRvIEFTQ0lJCiAgICBpZiBob3N0LnN0YXJ0c3dpdGgoJ1snKSBhbmQgaG9zdC5lbmRzd2l0aCgnXScpOgogICAgICAgIGhvc3QgPSBob3N0LnJlcGxhY2UoJyUyNScsICclJykuc3RyaXAoJ1tdJykKICAgIHJldHVybiBob3N0ClBLAwQUAAAAAAAAACEAAAAAAAAAAAAAAAAANwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL2NvbnRyaWIvX19pbml0X18ucHlQSwMEFAAAAAAAAAAhAAAAAAAAAAAAAAAAAEgAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9jb250cmliL19zZWN1cmV0cmFuc3BvcnQvX19pbml0X18ucHlQSwMEFAAAAAAAAAAhALdZi32YRAAAmEQAAEgAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9jb250cmliL19zZWN1cmV0cmFuc3BvcnQvYmluZGluZ3MucHkiIiIKVGhpcyBtb2R1bGUgdXNlcyBjdHlwZXMgdG8gYmluZCBhIHdob2xlIGJ1bmNoIG9mIGZ1bmN0aW9ucyBhbmQgY29uc3RhbnRzIGZyb20KU2VjdXJlVHJhbnNwb3J0LiBUaGUgZ29hbCBoZXJlIGlzIHRvIHByb3ZpZGUgdGhlIGxvdy1sZXZlbCBBUEkgdG8KU2VjdXJlVHJhbnNwb3J0LiBUaGVzZSBhcmUgZXNzZW50aWFsbHkgdGhlIEMtbGV2ZWwgZnVuY3Rpb25zIGFuZCBjb25zdGFudHMsIGFuZAp0aGV5J3JlIHByZXR0eSBncm9zcyB0byB3b3JrIHdpdGguCgpUaGlzIGNvZGUgaXMgYSBiYXN0YXJkaXNlZCB2ZXJzaW9uIG9mIHRoZSBjb2RlIGZvdW5kIGluIFdpbGwgQm9uZCdzIG9zY3J5cHRvCmxpYnJhcnkuIEFuIGVub3Jtb3VzIGRlYnQgaXMgb3dlZCB0byBoaW0gZm9yIGJsYXppbmcgdGhpcyB0cmFpbCBmb3IgdXMuIEZvcgp0aGF0IHJlYXNvbiwgdGhpcyBjb2RlIHNob3VsZCBiZSBjb25zaWRlcmVkIHRvIGJlIGNvdmVyZWQgYm90aCBieSB1cmxsaWIzJ3MKbGljZW5zZSBhbmQgYnkgb3NjcnlwdG8nczoKCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBXaWxsIEJvbmQgPHdpbGxAd2JvbmQubmV0PgoKICAgIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCiAgICBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAogICAgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgogICAgdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCiAgICBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKICAgIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgogICAgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KICAgIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKICAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCiAgICBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKICAgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQogICAgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgogICAgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKICAgIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKICAgIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KIiIiCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgcGxhdGZvcm0KZnJvbSBjdHlwZXMudXRpbCBpbXBvcnQgZmluZF9saWJyYXJ5CmZyb20gY3R5cGVzIGltcG9ydCAoCiAgICBjX3ZvaWRfcCwgY19pbnQzMiwgY19jaGFyX3AsIGNfc2l6ZV90LCBjX2J5dGUsIGNfdWludDMyLCBjX3Vsb25nLCBjX2xvbmcsCiAgICBjX2Jvb2wKKQpmcm9tIGN0eXBlcyBpbXBvcnQgQ0RMTCwgUE9JTlRFUiwgQ0ZVTkNUWVBFCgoKc2VjdXJpdHlfcGF0aCA9IGZpbmRfbGlicmFyeSgnU2VjdXJpdHknKQppZiBub3Qgc2VjdXJpdHlfcGF0aDoKICAgIHJhaXNlIEltcG9ydEVycm9yKCdUaGUgbGlicmFyeSBTZWN1cml0eSBjb3VsZCBub3QgYmUgZm91bmQnKQoKCmNvcmVfZm91bmRhdGlvbl9wYXRoID0gZmluZF9saWJyYXJ5KCdDb3JlRm91bmRhdGlvbicpCmlmIG5vdCBjb3JlX2ZvdW5kYXRpb25fcGF0aDoKICAgIHJhaXNlIEltcG9ydEVycm9yKCdUaGUgbGlicmFyeSBDb3JlRm91bmRhdGlvbiBjb3VsZCBub3QgYmUgZm91bmQnKQoKCnZlcnNpb24gPSBwbGF0Zm9ybS5tYWNfdmVyKClbMF0KdmVyc2lvbl9pbmZvID0gdHVwbGUobWFwKGludCwgdmVyc2lvbi5zcGxpdCgnLicpKSkKaWYgdmVyc2lvbl9pbmZvIDwgKDEwLCA4KToKICAgIHJhaXNlIE9TRXJyb3IoCiAgICAgICAgJ09ubHkgT1MgWCAxMC44IGFuZCBuZXdlciBhcmUgc3VwcG9ydGVkLCBub3QgJXMuJXMnICUgKAogICAgICAgICAgICB2ZXJzaW9uX2luZm9bMF0sIHZlcnNpb25faW5mb1sxXQogICAgICAgICkKICAgICkKClNlY3VyaXR5ID0gQ0RMTChzZWN1cml0eV9wYXRoLCB1c2VfZXJybm89VHJ1ZSkKQ29yZUZvdW5kYXRpb24gPSBDRExMKGNvcmVfZm91bmRhdGlvbl9wYXRoLCB1c2VfZXJybm89VHJ1ZSkKCkJvb2xlYW4gPSBjX2Jvb2wKQ0ZJbmRleCA9IGNfbG9uZwpDRlN0cmluZ0VuY29kaW5nID0gY191aW50MzIKQ0ZEYXRhID0gY192b2lkX3AKQ0ZTdHJpbmcgPSBjX3ZvaWRfcApDRkFycmF5ID0gY192b2lkX3AKQ0ZNdXRhYmxlQXJyYXkgPSBjX3ZvaWRfcApDRkRpY3Rpb25hcnkgPSBjX3ZvaWRfcApDRkVycm9yID0gY192b2lkX3AKQ0ZUeXBlID0gY192b2lkX3AKQ0ZUeXBlSUQgPSBjX3Vsb25nCgpDRlR5cGVSZWYgPSBQT0lOVEVSKENGVHlwZSkKQ0ZBbGxvY2F0b3JSZWYgPSBjX3ZvaWRfcAoKT1NTdGF0dXMgPSBjX2ludDMyCgpDRkRhdGFSZWYgPSBQT0lOVEVSKENGRGF0YSkKQ0ZTdHJpbmdSZWYgPSBQT0lOVEVSKENGU3RyaW5nKQpDRkFycmF5UmVmID0gUE9JTlRFUihDRkFycmF5KQpDRk11dGFibGVBcnJheVJlZiA9IFBPSU5URVIoQ0ZNdXRhYmxlQXJyYXkpCkNGRGljdGlvbmFyeVJlZiA9IFBPSU5URVIoQ0ZEaWN0aW9uYXJ5KQpDRkFycmF5Q2FsbEJhY2tzID0gY192b2lkX3AKQ0ZEaWN0aW9uYXJ5S2V5Q2FsbEJhY2tzID0gY192b2lkX3AKQ0ZEaWN0aW9uYXJ5VmFsdWVDYWxsQmFja3MgPSBjX3ZvaWRfcAoKU2VjQ2VydGlmaWNhdGVSZWYgPSBQT0lOVEVSKGNfdm9pZF9wKQpTZWNFeHRlcm5hbEZvcm1hdCA9IGNfdWludDMyClNlY0V4dGVybmFsSXRlbVR5cGUgPSBjX3VpbnQzMgpTZWNJZGVudGl0eVJlZiA9IFBPSU5URVIoY192b2lkX3ApClNlY0l0ZW1JbXBvcnRFeHBvcnRGbGFncyA9IGNfdWludDMyClNlY0l0ZW1JbXBvcnRFeHBvcnRLZXlQYXJhbWV0ZXJzID0gY192b2lkX3AKU2VjS2V5Y2hhaW5SZWYgPSBQT0lOVEVSKGNfdm9pZF9wKQpTU0xQcm90b2NvbCA9IGNfdWludDMyClNTTENpcGhlclN1aXRlID0gY191aW50MzIKU1NMQ29udGV4dFJlZiA9IFBPSU5URVIoY192b2lkX3ApClNlY1RydXN0UmVmID0gUE9JTlRFUihjX3ZvaWRfcCkKU1NMQ29ubmVjdGlvblJlZiA9IGNfdWludDMyClNlY1RydXN0UmVzdWx0VHlwZSA9IGNfdWludDMyClNlY1RydXN0T3B0aW9uRmxhZ3MgPSBjX3VpbnQzMgpTU0xQcm90b2NvbFNpZGUgPSBjX3VpbnQzMgpTU0xDb25uZWN0aW9uVHlwZSA9IGNfdWludDMyClNTTFNlc3Npb25PcHRpb24gPSBjX3VpbnQzMgoKCnRyeToKICAgIFNlY3VyaXR5LlNlY0l0ZW1JbXBvcnQuYXJndHlwZXMgPSBbCiAgICAgICAgQ0ZEYXRhUmVmLAogICAgICAgIENGU3RyaW5nUmVmLAogICAgICAgIFBPSU5URVIoU2VjRXh0ZXJuYWxGb3JtYXQpLAogICAgICAgIFBPSU5URVIoU2VjRXh0ZXJuYWxJdGVtVHlwZSksCiAgICAgICAgU2VjSXRlbUltcG9ydEV4cG9ydEZsYWdzLAogICAgICAgIFBPSU5URVIoU2VjSXRlbUltcG9ydEV4cG9ydEtleVBhcmFtZXRlcnMpLAogICAgICAgIFNlY0tleWNoYWluUmVmLAogICAgICAgIFBPSU5URVIoQ0ZBcnJheVJlZiksCiAgICBdCiAgICBTZWN1cml0eS5TZWNJdGVtSW1wb3J0LnJlc3R5cGUgPSBPU1N0YXR1cwoKICAgIFNlY3VyaXR5LlNlY0NlcnRpZmljYXRlR2V0VHlwZUlELmFyZ3R5cGVzID0gW10KICAgIFNlY3VyaXR5LlNlY0NlcnRpZmljYXRlR2V0VHlwZUlELnJlc3R5cGUgPSBDRlR5cGVJRAoKICAgIFNlY3VyaXR5LlNlY0lkZW50aXR5R2V0VHlwZUlELmFyZ3R5cGVzID0gW10KICAgIFNlY3VyaXR5LlNlY0lkZW50aXR5R2V0VHlwZUlELnJlc3R5cGUgPSBDRlR5cGVJRAoKICAgIFNlY3VyaXR5LlNlY0tleUdldFR5cGVJRC5hcmd0eXBlcyA9IFtdCiAgICBTZWN1cml0eS5TZWNLZXlHZXRUeXBlSUQucmVzdHlwZSA9IENGVHlwZUlECgogICAgU2VjdXJpdHkuU2VjQ2VydGlmaWNhdGVDcmVhdGVXaXRoRGF0YS5hcmd0eXBlcyA9IFsKICAgICAgICBDRkFsbG9jYXRvclJlZiwKICAgICAgICBDRkRhdGFSZWYKICAgIF0KICAgIFNlY3VyaXR5LlNlY0NlcnRpZmljYXRlQ3JlYXRlV2l0aERhdGEucmVzdHlwZSA9IFNlY0NlcnRpZmljYXRlUmVmCgogICAgU2VjdXJpdHkuU2VjQ2VydGlmaWNhdGVDb3B5RGF0YS5hcmd0eXBlcyA9IFsKICAgICAgICBTZWNDZXJ0aWZpY2F0ZVJlZgogICAgXQogICAgU2VjdXJpdHkuU2VjQ2VydGlmaWNhdGVDb3B5RGF0YS5yZXN0eXBlID0gQ0ZEYXRhUmVmCgogICAgU2VjdXJpdHkuU2VjQ29weUVycm9yTWVzc2FnZVN0cmluZy5hcmd0eXBlcyA9IFsKICAgICAgICBPU1N0YXR1cywKICAgICAgICBjX3ZvaWRfcAogICAgXQogICAgU2VjdXJpdHkuU2VjQ29weUVycm9yTWVzc2FnZVN0cmluZy5yZXN0eXBlID0gQ0ZTdHJpbmdSZWYKCiAgICBTZWN1cml0eS5TZWNJZGVudGl0eUNyZWF0ZVdpdGhDZXJ0aWZpY2F0ZS5hcmd0eXBlcyA9IFsKICAgICAgICBDRlR5cGVSZWYsCiAgICAgICAgU2VjQ2VydGlmaWNhdGVSZWYsCiAgICAgICAgUE9JTlRFUihTZWNJZGVudGl0eVJlZikKICAgIF0KICAgIFNlY3VyaXR5LlNlY0lkZW50aXR5Q3JlYXRlV2l0aENlcnRpZmljYXRlLnJlc3R5cGUgPSBPU1N0YXR1cwoKICAgIFNlY3VyaXR5LlNlY0tleWNoYWluQ3JlYXRlLmFyZ3R5cGVzID0gWwogICAgICAgIGNfY2hhcl9wLAogICAgICAgIGNfdWludDMyLAogICAgICAgIGNfdm9pZF9wLAogICAgICAgIEJvb2xlYW4sCiAgICAgICAgY192b2lkX3AsCiAgICAgICAgUE9JTlRFUihTZWNLZXljaGFpblJlZikKICAgIF0KICAgIFNlY3VyaXR5LlNlY0tleWNoYWluQ3JlYXRlLnJlc3R5cGUgPSBPU1N0YXR1cwoKICAgIFNlY3VyaXR5LlNlY0tleWNoYWluRGVsZXRlLmFyZ3R5cGVzID0gWwogICAgICAgIFNlY0tleWNoYWluUmVmCiAgICBdCiAgICBTZWN1cml0eS5TZWNLZXljaGFpbkRlbGV0ZS5yZXN0eXBlID0gT1NTdGF0dXMKCiAgICBTZWN1cml0eS5TZWNQS0NTMTJJbXBvcnQuYXJndHlwZXMgPSBbCiAgICAgICAgQ0ZEYXRhUmVmLAogICAgICAgIENGRGljdGlvbmFyeVJlZiwKICAgICAgICBQT0lOVEVSKENGQXJyYXlSZWYpCiAgICBdCiAgICBTZWN1cml0eS5TZWNQS0NTMTJJbXBvcnQucmVzdHlwZSA9IE9TU3RhdHVzCgogICAgU1NMUmVhZEZ1bmMgPSBDRlVOQ1RZUEUoT1NTdGF0dXMsIFNTTENvbm5lY3Rpb25SZWYsIGNfdm9pZF9wLCBQT0lOVEVSKGNfc2l6ZV90KSkKICAgIFNTTFdyaXRlRnVuYyA9IENGVU5DVFlQRShPU1N0YXR1cywgU1NMQ29ubmVjdGlvblJlZiwgUE9JTlRFUihjX2J5dGUpLCBQT0lOVEVSKGNfc2l6ZV90KSkKCiAgICBTZWN1cml0eS5TU0xTZXRJT0Z1bmNzLmFyZ3R5cGVzID0gWwogICAgICAgIFNTTENvbnRleHRSZWYsCiAgICAgICAgU1NMUmVhZEZ1bmMsCiAgICAgICAgU1NMV3JpdGVGdW5jCiAgICBdCiAgICBTZWN1cml0eS5TU0xTZXRJT0Z1bmNzLnJlc3R5cGUgPSBPU1N0YXR1cwoKICAgIFNlY3VyaXR5LlNTTFNldFBlZXJJRC5hcmd0eXBlcyA9IFsKICAgICAgICBTU0xDb250ZXh0UmVmLAogICAgICAgIGNfY2hhcl9wLAogICAgICAgIGNfc2l6ZV90CiAgICBdCiAgICBTZWN1cml0eS5TU0xTZXRQZWVySUQucmVzdHlwZSA9IE9TU3RhdHVzCgogICAgU2VjdXJpdHkuU1NMU2V0Q2VydGlmaWNhdGUuYXJndHlwZXMgPSBbCiAgICAgICAgU1NMQ29udGV4dFJlZiwKICAgICAgICBDRkFycmF5UmVmCiAgICBdCiAgICBTZWN1cml0eS5TU0xTZXRDZXJ0aWZpY2F0ZS5yZXN0eXBlID0gT1NTdGF0dXMKCiAgICBTZWN1cml0eS5TU0xTZXRDZXJ0aWZpY2F0ZUF1dGhvcml0aWVzLmFyZ3R5cGVzID0gWwogICAgICAgIFNTTENvbnRleHRSZWYsCiAgICAgICAgQ0ZUeXBlUmVmLAogICAgICAgIEJvb2xlYW4KICAgIF0KICAgIFNlY3VyaXR5LlNTTFNldENlcnRpZmljYXRlQXV0aG9yaXRpZXMucmVzdHlwZSA9IE9TU3RhdHVzCgogICAgU2VjdXJpdHkuU1NMU2V0Q29ubmVjdGlvbi5hcmd0eXBlcyA9IFsKICAgICAgICBTU0xDb250ZXh0UmVmLAogICAgICAgIFNTTENvbm5lY3Rpb25SZWYKICAgIF0KICAgIFNlY3VyaXR5LlNTTFNldENvbm5lY3Rpb24ucmVzdHlwZSA9IE9TU3RhdHVzCgogICAgU2VjdXJpdHkuU1NMU2V0UGVlckRvbWFpbk5hbWUuYXJndHlwZXMgPSBbCiAgICAgICAgU1NMQ29udGV4dFJlZiwKICAgICAgICBjX2NoYXJfcCwKICAgICAgICBjX3NpemVfdAogICAgXQogICAgU2VjdXJpdHkuU1NMU2V0UGVlckRvbWFpbk5hbWUucmVzdHlwZSA9IE9TU3RhdHVzCgogICAgU2VjdXJpdHkuU1NMSGFuZHNoYWtlLmFyZ3R5cGVzID0gWwogICAgICAgIFNTTENvbnRleHRSZWYKICAgIF0KICAgIFNlY3VyaXR5LlNTTEhhbmRzaGFrZS5yZXN0eXBlID0gT1NTdGF0dXMKCiAgICBTZWN1cml0eS5TU0xSZWFkLmFyZ3R5cGVzID0gWwogICAgICAgIFNTTENvbnRleHRSZWYsCiAgICAgICAgY19jaGFyX3AsCiAgICAgICAgY19zaXplX3QsCiAgICAgICAgUE9JTlRFUihjX3NpemVfdCkKICAgIF0KICAgIFNlY3VyaXR5LlNTTFJlYWQucmVzdHlwZSA9IE9TU3RhdHVzCgogICAgU2VjdXJpdHkuU1NMV3JpdGUuYXJndHlwZXMgPSBbCiAgICAgICAgU1NMQ29udGV4dFJlZiwKICAgICAgICBjX2NoYXJfcCwKICAgICAgICBjX3NpemVfdCwKICAgICAgICBQT0lOVEVSKGNfc2l6ZV90KQogICAgXQogICAgU2VjdXJpdHkuU1NMV3JpdGUucmVzdHlwZSA9IE9TU3RhdHVzCgogICAgU2VjdXJpdHkuU1NMQ2xvc2UuYXJndHlwZXMgPSBbCiAgICAgICAgU1NMQ29udGV4dFJlZgogICAgXQogICAgU2VjdXJpdHkuU1NMQ2xvc2UucmVzdHlwZSA9IE9TU3RhdHVzCgogICAgU2VjdXJpdHkuU1NMR2V0TnVtYmVyU3VwcG9ydGVkQ2lwaGVycy5hcmd0eXBlcyA9IFsKICAgICAgICBTU0xDb250ZXh0UmVmLAogICAgICAgIFBPSU5URVIoY19zaXplX3QpCiAgICBdCiAgICBTZWN1cml0eS5TU0xHZXROdW1iZXJTdXBwb3J0ZWRDaXBoZXJzLnJlc3R5cGUgPSBPU1N0YXR1cwoKICAgIFNlY3VyaXR5LlNTTEdldFN1cHBvcnRlZENpcGhlcnMuYXJndHlwZXMgPSBbCiAgICAgICAgU1NMQ29udGV4dFJlZiwKICAgICAgICBQT0lOVEVSKFNTTENpcGhlclN1aXRlKSwKICAgICAgICBQT0lOVEVSKGNfc2l6ZV90KQogICAgXQogICAgU2VjdXJpdHkuU1NMR2V0U3VwcG9ydGVkQ2lwaGVycy5yZXN0eXBlID0gT1NTdGF0dXMKCiAgICBTZWN1cml0eS5TU0xTZXRFbmFibGVkQ2lwaGVycy5hcmd0eXBlcyA9IFsKICAgICAgICBTU0xDb250ZXh0UmVmLAogICAgICAgIFBPSU5URVIoU1NMQ2lwaGVyU3VpdGUpLAogICAgICAgIGNfc2l6ZV90CiAgICBdCiAgICBTZWN1cml0eS5TU0xTZXRFbmFibGVkQ2lwaGVycy5yZXN0eXBlID0gT1NTdGF0dXMKCiAgICBTZWN1cml0eS5TU0xHZXROdW1iZXJFbmFibGVkQ2lwaGVycy5hcmd0eXBlID0gWwogICAgICAgIFNTTENvbnRleHRSZWYsCiAgICAgICAgUE9JTlRFUihjX3NpemVfdCkKICAgIF0KICAgIFNlY3VyaXR5LlNTTEdldE51bWJlckVuYWJsZWRDaXBoZXJzLnJlc3R5cGUgPSBPU1N0YXR1cwoKICAgIFNlY3VyaXR5LlNTTEdldEVuYWJsZWRDaXBoZXJzLmFyZ3R5cGVzID0gWwogICAgICAgIFNTTENvbnRleHRSZWYsCiAgICAgICAgUE9JTlRFUihTU0xDaXBoZXJTdWl0ZSksCiAgICAgICAgUE9JTlRFUihjX3NpemVfdCkKICAgIF0KICAgIFNlY3VyaXR5LlNTTEdldEVuYWJsZWRDaXBoZXJzLnJlc3R5cGUgPSBPU1N0YXR1cwoKICAgIFNlY3VyaXR5LlNTTEdldE5lZ290aWF0ZWRDaXBoZXIuYXJndHlwZXMgPSBbCiAgICAgICAgU1NMQ29udGV4dFJlZiwKICAgICAgICBQT0lOVEVSKFNTTENpcGhlclN1aXRlKQogICAgXQogICAgU2VjdXJpdHkuU1NMR2V0TmVnb3RpYXRlZENpcGhlci5yZXN0eXBlID0gT1NTdGF0dXMKCiAgICBTZWN1cml0eS5TU0xHZXROZWdvdGlhdGVkUHJvdG9jb2xWZXJzaW9uLmFyZ3R5cGVzID0gWwogICAgICAgIFNTTENvbnRleHRSZWYsCiAgICAgICAgUE9JTlRFUihTU0xQcm90b2NvbCkKICAgIF0KICAgIFNlY3VyaXR5LlNTTEdldE5lZ290aWF0ZWRQcm90b2NvbFZlcnNpb24ucmVzdHlwZSA9IE9TU3RhdHVzCgogICAgU2VjdXJpdHkuU1NMQ29weVBlZXJUcnVzdC5hcmd0eXBlcyA9IFsKICAgICAgICBTU0xDb250ZXh0UmVmLAogICAgICAgIFBPSU5URVIoU2VjVHJ1c3RSZWYpCiAgICBdCiAgICBTZWN1cml0eS5TU0xDb3B5UGVlclRydXN0LnJlc3R5cGUgPSBPU1N0YXR1cwoKICAgIFNlY3VyaXR5LlNlY1RydXN0U2V0QW5jaG9yQ2VydGlmaWNhdGVzLmFyZ3R5cGVzID0gWwogICAgICAgIFNlY1RydXN0UmVmLAogICAgICAgIENGQXJyYXlSZWYKICAgIF0KICAgIFNlY3VyaXR5LlNlY1RydXN0U2V0QW5jaG9yQ2VydGlmaWNhdGVzLnJlc3R5cGUgPSBPU1N0YXR1cwoKICAgIFNlY3VyaXR5LlNlY1RydXN0U2V0QW5jaG9yQ2VydGlmaWNhdGVzT25seS5hcmdzdHlwZXMgPSBbCiAgICAgICAgU2VjVHJ1c3RSZWYsCiAgICAgICAgQm9vbGVhbgogICAgXQogICAgU2VjdXJpdHkuU2VjVHJ1c3RTZXRBbmNob3JDZXJ0aWZpY2F0ZXNPbmx5LnJlc3R5cGUgPSBPU1N0YXR1cwoKICAgIFNlY3VyaXR5LlNlY1RydXN0RXZhbHVhdGUuYXJndHlwZXMgPSBbCiAgICAgICAgU2VjVHJ1c3RSZWYsCiAgICAgICAgUE9JTlRFUihTZWNUcnVzdFJlc3VsdFR5cGUpCiAgICBdCiAgICBTZWN1cml0eS5TZWNUcnVzdEV2YWx1YXRlLnJlc3R5cGUgPSBPU1N0YXR1cwoKICAgIFNlY3VyaXR5LlNlY1RydXN0R2V0Q2VydGlmaWNhdGVDb3VudC5hcmd0eXBlcyA9IFsKICAgICAgICBTZWNUcnVzdFJlZgogICAgXQogICAgU2VjdXJpdHkuU2VjVHJ1c3RHZXRDZXJ0aWZpY2F0ZUNvdW50LnJlc3R5cGUgPSBDRkluZGV4CgogICAgU2VjdXJpdHkuU2VjVHJ1c3RHZXRDZXJ0aWZpY2F0ZUF0SW5kZXguYXJndHlwZXMgPSBbCiAgICAgICAgU2VjVHJ1c3RSZWYsCiAgICAgICAgQ0ZJbmRleAogICAgXQogICAgU2VjdXJpdHkuU2VjVHJ1c3RHZXRDZXJ0aWZpY2F0ZUF0SW5kZXgucmVzdHlwZSA9IFNlY0NlcnRpZmljYXRlUmVmCgogICAgU2VjdXJpdHkuU1NMQ3JlYXRlQ29udGV4dC5hcmd0eXBlcyA9IFsKICAgICAgICBDRkFsbG9jYXRvclJlZiwKICAgICAgICBTU0xQcm90b2NvbFNpZGUsCiAgICAgICAgU1NMQ29ubmVjdGlvblR5cGUKICAgIF0KICAgIFNlY3VyaXR5LlNTTENyZWF0ZUNvbnRleHQucmVzdHlwZSA9IFNTTENvbnRleHRSZWYKCiAgICBTZWN1cml0eS5TU0xTZXRTZXNzaW9uT3B0aW9uLmFyZ3R5cGVzID0gWwogICAgICAgIFNTTENvbnRleHRSZWYsCiAgICAgICAgU1NMU2Vzc2lvbk9wdGlvbiwKICAgICAgICBCb29sZWFuCiAgICBdCiAgICBTZWN1cml0eS5TU0xTZXRTZXNzaW9uT3B0aW9uLnJlc3R5cGUgPSBPU1N0YXR1cwoKICAgIFNlY3VyaXR5LlNTTFNldFByb3RvY29sVmVyc2lvbk1pbi5hcmd0eXBlcyA9IFsKICAgICAgICBTU0xDb250ZXh0UmVmLAogICAgICAgIFNTTFByb3RvY29sCiAgICBdCiAgICBTZWN1cml0eS5TU0xTZXRQcm90b2NvbFZlcnNpb25NaW4ucmVzdHlwZSA9IE9TU3RhdHVzCgogICAgU2VjdXJpdHkuU1NMU2V0UHJvdG9jb2xWZXJzaW9uTWF4LmFyZ3R5cGVzID0gWwogICAgICAgIFNTTENvbnRleHRSZWYsCiAgICAgICAgU1NMUHJvdG9jb2wKICAgIF0KICAgIFNlY3VyaXR5LlNTTFNldFByb3RvY29sVmVyc2lvbk1heC5yZXN0eXBlID0gT1NTdGF0dXMKCiAgICBTZWN1cml0eS5TZWNDb3B5RXJyb3JNZXNzYWdlU3RyaW5nLmFyZ3R5cGVzID0gWwogICAgICAgIE9TU3RhdHVzLAogICAgICAgIGNfdm9pZF9wCiAgICBdCiAgICBTZWN1cml0eS5TZWNDb3B5RXJyb3JNZXNzYWdlU3RyaW5nLnJlc3R5cGUgPSBDRlN0cmluZ1JlZgoKICAgIFNlY3VyaXR5LlNTTFJlYWRGdW5jID0gU1NMUmVhZEZ1bmMKICAgIFNlY3VyaXR5LlNTTFdyaXRlRnVuYyA9IFNTTFdyaXRlRnVuYwogICAgU2VjdXJpdHkuU1NMQ29udGV4dFJlZiA9IFNTTENvbnRleHRSZWYKICAgIFNlY3VyaXR5LlNTTFByb3RvY29sID0gU1NMUHJvdG9jb2wKICAgIFNlY3VyaXR5LlNTTENpcGhlclN1aXRlID0gU1NMQ2lwaGVyU3VpdGUKICAgIFNlY3VyaXR5LlNlY0lkZW50aXR5UmVmID0gU2VjSWRlbnRpdHlSZWYKICAgIFNlY3VyaXR5LlNlY0tleWNoYWluUmVmID0gU2VjS2V5Y2hhaW5SZWYKICAgIFNlY3VyaXR5LlNlY1RydXN0UmVmID0gU2VjVHJ1c3RSZWYKICAgIFNlY3VyaXR5LlNlY1RydXN0UmVzdWx0VHlwZSA9IFNlY1RydXN0UmVzdWx0VHlwZQogICAgU2VjdXJpdHkuU2VjRXh0ZXJuYWxGb3JtYXQgPSBTZWNFeHRlcm5hbEZvcm1hdAogICAgU2VjdXJpdHkuT1NTdGF0dXMgPSBPU1N0YXR1cwoKICAgIFNlY3VyaXR5LmtTZWNJbXBvcnRFeHBvcnRQYXNzcGhyYXNlID0gQ0ZTdHJpbmdSZWYuaW5fZGxsKAogICAgICAgIFNlY3VyaXR5LCAna1NlY0ltcG9ydEV4cG9ydFBhc3NwaHJhc2UnCiAgICApCiAgICBTZWN1cml0eS5rU2VjSW1wb3J0SXRlbUlkZW50aXR5ID0gQ0ZTdHJpbmdSZWYuaW5fZGxsKAogICAgICAgIFNlY3VyaXR5LCAna1NlY0ltcG9ydEl0ZW1JZGVudGl0eScKICAgICkKCiAgICAjIENvcmVGb3VuZGF0aW9uIHRpbWUhCiAgICBDb3JlRm91bmRhdGlvbi5DRlJldGFpbi5hcmd0eXBlcyA9IFsKICAgICAgICBDRlR5cGVSZWYKICAgIF0KICAgIENvcmVGb3VuZGF0aW9uLkNGUmV0YWluLnJlc3R5cGUgPSBDRlR5cGVSZWYKCiAgICBDb3JlRm91bmRhdGlvbi5DRlJlbGVhc2UuYXJndHlwZXMgPSBbCiAgICAgICAgQ0ZUeXBlUmVmCiAgICBdCiAgICBDb3JlRm91bmRhdGlvbi5DRlJlbGVhc2UucmVzdHlwZSA9IE5vbmUKCiAgICBDb3JlRm91bmRhdGlvbi5DRkdldFR5cGVJRC5hcmd0eXBlcyA9IFsKICAgICAgICBDRlR5cGVSZWYKICAgIF0KICAgIENvcmVGb3VuZGF0aW9uLkNGR2V0VHlwZUlELnJlc3R5cGUgPSBDRlR5cGVJRAoKICAgIENvcmVGb3VuZGF0aW9uLkNGU3RyaW5nQ3JlYXRlV2l0aENTdHJpbmcuYXJndHlwZXMgPSBbCiAgICAgICAgQ0ZBbGxvY2F0b3JSZWYsCiAgICAgICAgY19jaGFyX3AsCiAgICAgICAgQ0ZTdHJpbmdFbmNvZGluZwogICAgXQogICAgQ29yZUZvdW5kYXRpb24uQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZy5yZXN0eXBlID0gQ0ZTdHJpbmdSZWYKCiAgICBDb3JlRm91bmRhdGlvbi5DRlN0cmluZ0dldENTdHJpbmdQdHIuYXJndHlwZXMgPSBbCiAgICAgICAgQ0ZTdHJpbmdSZWYsCiAgICAgICAgQ0ZTdHJpbmdFbmNvZGluZwogICAgXQogICAgQ29yZUZvdW5kYXRpb24uQ0ZTdHJpbmdHZXRDU3RyaW5nUHRyLnJlc3R5cGUgPSBjX2NoYXJfcAoKICAgIENvcmVGb3VuZGF0aW9uLkNGU3RyaW5nR2V0Q1N0cmluZy5hcmd0eXBlcyA9IFsKICAgICAgICBDRlN0cmluZ1JlZiwKICAgICAgICBjX2NoYXJfcCwKICAgICAgICBDRkluZGV4LAogICAgICAgIENGU3RyaW5nRW5jb2RpbmcKICAgIF0KICAgIENvcmVGb3VuZGF0aW9uLkNGU3RyaW5nR2V0Q1N0cmluZy5yZXN0eXBlID0gY19ib29sCgogICAgQ29yZUZvdW5kYXRpb24uQ0ZEYXRhQ3JlYXRlLmFyZ3R5cGVzID0gWwogICAgICAgIENGQWxsb2NhdG9yUmVmLAogICAgICAgIGNfY2hhcl9wLAogICAgICAgIENGSW5kZXgKICAgIF0KICAgIENvcmVGb3VuZGF0aW9uLkNGRGF0YUNyZWF0ZS5yZXN0eXBlID0gQ0ZEYXRhUmVmCgogICAgQ29yZUZvdW5kYXRpb24uQ0ZEYXRhR2V0TGVuZ3RoLmFyZ3R5cGVzID0gWwogICAgICAgIENGRGF0YVJlZgogICAgXQogICAgQ29yZUZvdW5kYXRpb24uQ0ZEYXRhR2V0TGVuZ3RoLnJlc3R5cGUgPSBDRkluZGV4CgogICAgQ29yZUZvdW5kYXRpb24uQ0ZEYXRhR2V0Qnl0ZVB0ci5hcmd0eXBlcyA9IFsKICAgICAgICBDRkRhdGFSZWYKICAgIF0KICAgIENvcmVGb3VuZGF0aW9uLkNGRGF0YUdldEJ5dGVQdHIucmVzdHlwZSA9IGNfdm9pZF9wCgogICAgQ29yZUZvdW5kYXRpb24uQ0ZEaWN0aW9uYXJ5Q3JlYXRlLmFyZ3R5cGVzID0gWwogICAgICAgIENGQWxsb2NhdG9yUmVmLAogICAgICAgIFBPSU5URVIoQ0ZUeXBlUmVmKSwKICAgICAgICBQT0lOVEVSKENGVHlwZVJlZiksCiAgICAgICAgQ0ZJbmRleCwKICAgICAgICBDRkRpY3Rpb25hcnlLZXlDYWxsQmFja3MsCiAgICAgICAgQ0ZEaWN0aW9uYXJ5VmFsdWVDYWxsQmFja3MKICAgIF0KICAgIENvcmVGb3VuZGF0aW9uLkNGRGljdGlvbmFyeUNyZWF0ZS5yZXN0eXBlID0gQ0ZEaWN0aW9uYXJ5UmVmCgogICAgQ29yZUZvdW5kYXRpb24uQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUuYXJndHlwZXMgPSBbCiAgICAgICAgQ0ZEaWN0aW9uYXJ5UmVmLAogICAgICAgIENGVHlwZVJlZgogICAgXQogICAgQ29yZUZvdW5kYXRpb24uQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUucmVzdHlwZSA9IENGVHlwZVJlZgoKICAgIENvcmVGb3VuZGF0aW9uLkNGQXJyYXlDcmVhdGUuYXJndHlwZXMgPSBbCiAgICAgICAgQ0ZBbGxvY2F0b3JSZWYsCiAgICAgICAgUE9JTlRFUihDRlR5cGVSZWYpLAogICAgICAgIENGSW5kZXgsCiAgICAgICAgQ0ZBcnJheUNhbGxCYWNrcywKICAgIF0KICAgIENvcmVGb3VuZGF0aW9uLkNGQXJyYXlDcmVhdGUucmVzdHlwZSA9IENGQXJyYXlSZWYKCiAgICBDb3JlRm91bmRhdGlvbi5DRkFycmF5Q3JlYXRlTXV0YWJsZS5hcmd0eXBlcyA9IFsKICAgICAgICBDRkFsbG9jYXRvclJlZiwKICAgICAgICBDRkluZGV4LAogICAgICAgIENGQXJyYXlDYWxsQmFja3MKICAgIF0KICAgIENvcmVGb3VuZGF0aW9uLkNGQXJyYXlDcmVhdGVNdXRhYmxlLnJlc3R5cGUgPSBDRk11dGFibGVBcnJheVJlZgoKICAgIENvcmVGb3VuZGF0aW9uLkNGQXJyYXlBcHBlbmRWYWx1ZS5hcmd0eXBlcyA9IFsKICAgICAgICBDRk11dGFibGVBcnJheVJlZiwKICAgICAgICBjX3ZvaWRfcAogICAgXQogICAgQ29yZUZvdW5kYXRpb24uQ0ZBcnJheUFwcGVuZFZhbHVlLnJlc3R5cGUgPSBOb25lCgogICAgQ29yZUZvdW5kYXRpb24uQ0ZBcnJheUdldENvdW50LmFyZ3R5cGVzID0gWwogICAgICAgIENGQXJyYXlSZWYKICAgIF0KICAgIENvcmVGb3VuZGF0aW9uLkNGQXJyYXlHZXRDb3VudC5yZXN0eXBlID0gQ0ZJbmRleAoKICAgIENvcmVGb3VuZGF0aW9uLkNGQXJyYXlHZXRWYWx1ZUF0SW5kZXguYXJndHlwZXMgPSBbCiAgICAgICAgQ0ZBcnJheVJlZiwKICAgICAgICBDRkluZGV4CiAgICBdCiAgICBDb3JlRm91bmRhdGlvbi5DRkFycmF5R2V0VmFsdWVBdEluZGV4LnJlc3R5cGUgPSBjX3ZvaWRfcAoKICAgIENvcmVGb3VuZGF0aW9uLmtDRkFsbG9jYXRvckRlZmF1bHQgPSBDRkFsbG9jYXRvclJlZi5pbl9kbGwoCiAgICAgICAgQ29yZUZvdW5kYXRpb24sICdrQ0ZBbGxvY2F0b3JEZWZhdWx0JwogICAgKQogICAgQ29yZUZvdW5kYXRpb24ua0NGVHlwZUFycmF5Q2FsbEJhY2tzID0gY192b2lkX3AuaW5fZGxsKENvcmVGb3VuZGF0aW9uLCAna0NGVHlwZUFycmF5Q2FsbEJhY2tzJykKICAgIENvcmVGb3VuZGF0aW9uLmtDRlR5cGVEaWN0aW9uYXJ5S2V5Q2FsbEJhY2tzID0gY192b2lkX3AuaW5fZGxsKAogICAgICAgIENvcmVGb3VuZGF0aW9uLCAna0NGVHlwZURpY3Rpb25hcnlLZXlDYWxsQmFja3MnCiAgICApCiAgICBDb3JlRm91bmRhdGlvbi5rQ0ZUeXBlRGljdGlvbmFyeVZhbHVlQ2FsbEJhY2tzID0gY192b2lkX3AuaW5fZGxsKAogICAgICAgIENvcmVGb3VuZGF0aW9uLCAna0NGVHlwZURpY3Rpb25hcnlWYWx1ZUNhbGxCYWNrcycKICAgICkKCiAgICBDb3JlRm91bmRhdGlvbi5DRlR5cGVSZWYgPSBDRlR5cGVSZWYKICAgIENvcmVGb3VuZGF0aW9uLkNGQXJyYXlSZWYgPSBDRkFycmF5UmVmCiAgICBDb3JlRm91bmRhdGlvbi5DRlN0cmluZ1JlZiA9IENGU3RyaW5nUmVmCiAgICBDb3JlRm91bmRhdGlvbi5DRkRpY3Rpb25hcnlSZWYgPSBDRkRpY3Rpb25hcnlSZWYKCmV4Y2VwdCAoQXR0cmlidXRlRXJyb3IpOgogICAgcmFpc2UgSW1wb3J0RXJyb3IoJ0Vycm9yIGluaXRpYWxpemluZyBjdHlwZXMnKQoKCmNsYXNzIENGQ29uc3Qob2JqZWN0KToKICAgICIiIgogICAgQSBjbGFzcyBvYmplY3QgdGhhdCBhY3RzIGFzIGVzc2VudGlhbGx5IGEgbmFtZXNwYWNlIGZvciBDb3JlRm91bmRhdGlvbgogICAgY29uc3RhbnRzLgogICAgIiIiCiAgICBrQ0ZTdHJpbmdFbmNvZGluZ1VURjggPSBDRlN0cmluZ0VuY29kaW5nKDB4MDgwMDAxMDApCgoKY2xhc3MgU2VjdXJpdHlDb25zdChvYmplY3QpOgogICAgIiIiCiAgICBBIGNsYXNzIG9iamVjdCB0aGF0IGFjdHMgYXMgZXNzZW50aWFsbHkgYSBuYW1lc3BhY2UgZm9yIFNlY3VyaXR5IGNvbnN0YW50cy4KICAgICIiIgogICAga1NTTFNlc3Npb25PcHRpb25CcmVha09uU2VydmVyQXV0aCA9IDAKCiAgICBrU1NMUHJvdG9jb2wyID0gMQogICAga1NTTFByb3RvY29sMyA9IDIKICAgIGtUTFNQcm90b2NvbDEgPSA0CiAgICBrVExTUHJvdG9jb2wxMSA9IDcKICAgIGtUTFNQcm90b2NvbDEyID0gOAoKICAgIGtTU0xDbGllbnRTaWRlID0gMQogICAga1NTTFN0cmVhbVR5cGUgPSAwCgogICAga1NlY0Zvcm1hdFBFTVNlcXVlbmNlID0gMTAKCiAgICBrU2VjVHJ1c3RSZXN1bHRJbnZhbGlkID0gMAogICAga1NlY1RydXN0UmVzdWx0UHJvY2VlZCA9IDEKICAgICMgVGhpcyBnYXAgaXMgcHJlc2VudCBvbiBwdXJwb3NlOiB0aGlzIHdhcyBrU2VjVHJ1c3RSZXN1bHRDb25maXJtLCB3aGljaAogICAgIyBpcyBkZXByZWNhdGVkLgogICAga1NlY1RydXN0UmVzdWx0RGVueSA9IDMKICAgIGtTZWNUcnVzdFJlc3VsdFVuc3BlY2lmaWVkID0gNAogICAga1NlY1RydXN0UmVzdWx0UmVjb3ZlcmFibGVUcnVzdEZhaWx1cmUgPSA1CiAgICBrU2VjVHJ1c3RSZXN1bHRGYXRhbFRydXN0RmFpbHVyZSA9IDYKICAgIGtTZWNUcnVzdFJlc3VsdE90aGVyRXJyb3IgPSA3CgogICAgZXJyU1NMUHJvdG9jb2wgPSAtOTgwMAogICAgZXJyU1NMV291bGRCbG9jayA9IC05ODAzCiAgICBlcnJTU0xDbG9zZWRHcmFjZWZ1bCA9IC05ODA1CiAgICBlcnJTU0xDbG9zZWROb05vdGlmeSA9IC05ODE2CiAgICBlcnJTU0xDbG9zZWRBYm9ydCA9IC05ODA2CgogICAgZXJyU1NMWENlcnRDaGFpbkludmFsaWQgPSAtOTgwNwogICAgZXJyU1NMQ3J5cHRvID0gLTk4MDkKICAgIGVyclNTTEludGVybmFsID0gLTk4MTAKICAgIGVyclNTTENlcnRFeHBpcmVkID0gLTk4MTQKICAgIGVyclNTTENlcnROb3RZZXRWYWxpZCA9IC05ODE1CiAgICBlcnJTU0xVbmtub3duUm9vdENlcnQgPSAtOTgxMgogICAgZXJyU1NMTm9Sb290Q2VydCA9IC05ODEzCiAgICBlcnJTU0xIb3N0TmFtZU1pc21hdGNoID0gLTk4NDMKICAgIGVyclNTTFBlZXJIYW5kc2hha2VGYWlsID0gLTk4MjQKICAgIGVyclNTTFBlZXJVc2VyQ2FuY2VsbGVkID0gLTk4MzkKICAgIGVyclNTTFdlYWtQZWVyRXBoZW1lcmFsREhLZXkgPSAtOTg1MAogICAgZXJyU1NMU2VydmVyQXV0aENvbXBsZXRlZCA9IC05ODQxCiAgICBlcnJTU0xSZWNvcmRPdmVyZmxvdyA9IC05ODQ3CgogICAgZXJyU2VjVmVyaWZ5RmFpbGVkID0gLTY3ODA4CiAgICBlcnJTZWNOb1RydXN0U2V0dGluZ3MgPSAtMjUyNjMKICAgIGVyclNlY0l0ZW1Ob3RGb3VuZCA9IC0yNTMwMAogICAgZXJyU2VjSW52YWxpZFRydXN0U2V0dGluZ3MgPSAtMjUyNjIKCiAgICAjIENpcGhlciBzdWl0ZXMuIFdlIG9ubHkgcGljayB0aGUgb25lcyBvdXIgZGVmYXVsdCBjaXBoZXIgc3RyaW5nIGFsbG93cy4KICAgIFRMU19FQ0RIRV9FQ0RTQV9XSVRIX0FFU18yNTZfR0NNX1NIQTM4NCA9IDB4QzAyQwogICAgVExTX0VDREhFX1JTQV9XSVRIX0FFU18yNTZfR0NNX1NIQTM4NCA9IDB4QzAzMAogICAgVExTX0VDREhFX0VDRFNBX1dJVEhfQUVTXzEyOF9HQ01fU0hBMjU2ID0gMHhDMDJCCiAgICBUTFNfRUNESEVfUlNBX1dJVEhfQUVTXzEyOF9HQ01fU0hBMjU2ID0gMHhDMDJGCiAgICBUTFNfREhFX0RTU19XSVRIX0FFU18yNTZfR0NNX1NIQTM4NCA9IDB4MDBBMwogICAgVExTX0RIRV9SU0FfV0lUSF9BRVNfMjU2X0dDTV9TSEEzODQgPSAweDAwOUYKICAgIFRMU19ESEVfRFNTX1dJVEhfQUVTXzEyOF9HQ01fU0hBMjU2ID0gMHgwMEEyCiAgICBUTFNfREhFX1JTQV9XSVRIX0FFU18xMjhfR0NNX1NIQTI1NiA9IDB4MDA5RQogICAgVExTX0VDREhFX0VDRFNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBMzg0ID0gMHhDMDI0CiAgICBUTFNfRUNESEVfUlNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBMzg0ID0gMHhDMDI4CiAgICBUTFNfRUNESEVfRUNEU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEEgPSAweEMwMEEKICAgIFRMU19FQ0RIRV9SU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEEgPSAweEMwMTQKICAgIFRMU19ESEVfUlNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBMjU2ID0gMHgwMDZCCiAgICBUTFNfREhFX0RTU19XSVRIX0FFU18yNTZfQ0JDX1NIQTI1NiA9IDB4MDA2QQogICAgVExTX0RIRV9SU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEEgPSAweDAwMzkKICAgIFRMU19ESEVfRFNTX1dJVEhfQUVTXzI1Nl9DQkNfU0hBID0gMHgwMDM4CiAgICBUTFNfRUNESEVfRUNEU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEyNTYgPSAweEMwMjMKICAgIFRMU19FQ0RIRV9SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEyNTYgPSAweEMwMjcKICAgIFRMU19FQ0RIRV9FQ0RTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQSA9IDB4QzAwOQogICAgVExTX0VDREhFX1JTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQSA9IDB4QzAxMwogICAgVExTX0RIRV9SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEyNTYgPSAweDAwNjcKICAgIFRMU19ESEVfRFNTX1dJVEhfQUVTXzEyOF9DQkNfU0hBMjU2ID0gMHgwMDQwCiAgICBUTFNfREhFX1JTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQSA9IDB4MDAzMwogICAgVExTX0RIRV9EU1NfV0lUSF9BRVNfMTI4X0NCQ19TSEEgPSAweDAwMzIKICAgIFRMU19SU0FfV0lUSF9BRVNfMjU2X0dDTV9TSEEzODQgPSAweDAwOUQKICAgIFRMU19SU0FfV0lUSF9BRVNfMTI4X0dDTV9TSEEyNTYgPSAweDAwOUMKICAgIFRMU19SU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEEyNTYgPSAweDAwM0QKICAgIFRMU19SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEyNTYgPSAweDAwM0MKICAgIFRMU19SU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEEgPSAweDAwMzUKICAgIFRMU19SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEgPSAweDAwMkYKICAgIFRMU19BRVNfMTI4X0dDTV9TSEEyNTYgPSAweDEzMDEKICAgIFRMU19BRVNfMjU2X0dDTV9TSEEzODQgPSAweDEzMDIKICAgIFRMU19DSEFDSEEyMF9QT0xZMTMwNV9TSEEyNTYgPSAweDEzMDMKUEsDBBQAAAAAAAAAIQAEr9yQHi8AAB4vAABJAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvY29udHJpYi9fc2VjdXJldHJhbnNwb3J0L2xvd19sZXZlbC5weSIiIgpMb3ctbGV2ZWwgaGVscGVycyBmb3IgdGhlIFNlY3VyZVRyYW5zcG9ydCBiaW5kaW5ncy4KClRoZXNlIGFyZSBQeXRob24gZnVuY3Rpb25zIHRoYXQgYXJlIG5vdCBkaXJlY3RseSByZWxhdGVkIHRvIHRoZSBoaWdoLWxldmVsIEFQSXMKYnV0IGFyZSBuZWNlc3NhcnkgdG8gZ2V0IHRoZW0gdG8gd29yay4gVGhleSBpbmNsdWRlIGEgd2hvbGUgYnVuY2ggb2YgbG93LWxldmVsCkNvcmVGb3VuZGF0aW9uIG1lc3NpbmcgYWJvdXQgYW5kIG1lbW9yeSBtYW5hZ2VtZW50LiBUaGUgY29uY2VybnMgaW4gdGhpcyBtb2R1bGUKYXJlIGFsbW9zdCBlbnRpcmVseSBhYm91dCB0cnlpbmcgdG8gYXZvaWQgbWVtb3J5IGxlYWtzIGFuZCBwcm92aWRpbmcKYXBwcm9wcmlhdGUgYW5kIHVzZWZ1bCBhc3Npc3RhbmNlIHRvIHRoZSBoaWdoZXItbGV2ZWwgY29kZS4KIiIiCmltcG9ydCBiYXNlNjQKaW1wb3J0IGN0eXBlcwppbXBvcnQgaXRlcnRvb2xzCmltcG9ydCByZQppbXBvcnQgb3MKaW1wb3J0IHNzbAppbXBvcnQgdGVtcGZpbGUKCmZyb20gLmJpbmRpbmdzIGltcG9ydCBTZWN1cml0eSwgQ29yZUZvdW5kYXRpb24sIENGQ29uc3QKCgojIFRoaXMgcmVndWxhciBleHByZXNzaW9uIGlzIHVzZWQgdG8gZ3JhYiBQRU0gZGF0YSBvdXQgb2YgYSBQRU0gYnVuZGxlLgpfUEVNX0NFUlRTX1JFID0gcmUuY29tcGlsZSgKICAgIGIiLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tXG4oLio/KVxuLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLSIsIHJlLkRPVEFMTAopCgoKZGVmIF9jZl9kYXRhX2Zyb21fYnl0ZXMoYnl0ZXN0cmluZyk6CiAgICAiIiIKICAgIEdpdmVuIGEgYnl0ZXN0cmluZywgY3JlYXRlIGEgQ0ZEYXRhIG9iamVjdCBmcm9tIGl0LiBUaGlzIENGRGF0YSBvYmplY3QgbXVzdAogICAgYmUgQ0ZSZWxlYXNlZCBieSB0aGUgY2FsbGVyLgogICAgIiIiCiAgICByZXR1cm4gQ29yZUZvdW5kYXRpb24uQ0ZEYXRhQ3JlYXRlKAogICAgICAgIENvcmVGb3VuZGF0aW9uLmtDRkFsbG9jYXRvckRlZmF1bHQsIGJ5dGVzdHJpbmcsIGxlbihieXRlc3RyaW5nKQogICAgKQoKCmRlZiBfY2ZfZGljdGlvbmFyeV9mcm9tX3R1cGxlcyh0dXBsZXMpOgogICAgIiIiCiAgICBHaXZlbiBhIGxpc3Qgb2YgUHl0aG9uIHR1cGxlcywgY3JlYXRlIGFuIGFzc29jaWF0ZWQgQ0ZEaWN0aW9uYXJ5LgogICAgIiIiCiAgICBkaWN0aW9uYXJ5X3NpemUgPSBsZW4odHVwbGVzKQoKICAgICMgV2UgbmVlZCB0byBnZXQgdGhlIGRpY3Rpb25hcnkga2V5cyBhbmQgdmFsdWVzIG91dCBpbiB0aGUgc2FtZSBvcmRlci4KICAgIGtleXMgPSAodFswXSBmb3IgdCBpbiB0dXBsZXMpCiAgICB2YWx1ZXMgPSAodFsxXSBmb3IgdCBpbiB0dXBsZXMpCiAgICBjZl9rZXlzID0gKENvcmVGb3VuZGF0aW9uLkNGVHlwZVJlZiAqIGRpY3Rpb25hcnlfc2l6ZSkoKmtleXMpCiAgICBjZl92YWx1ZXMgPSAoQ29yZUZvdW5kYXRpb24uQ0ZUeXBlUmVmICogZGljdGlvbmFyeV9zaXplKSgqdmFsdWVzKQoKICAgIHJldHVybiBDb3JlRm91bmRhdGlvbi5DRkRpY3Rpb25hcnlDcmVhdGUoCiAgICAgICAgQ29yZUZvdW5kYXRpb24ua0NGQWxsb2NhdG9yRGVmYXVsdCwKICAgICAgICBjZl9rZXlzLAogICAgICAgIGNmX3ZhbHVlcywKICAgICAgICBkaWN0aW9uYXJ5X3NpemUsCiAgICAgICAgQ29yZUZvdW5kYXRpb24ua0NGVHlwZURpY3Rpb25hcnlLZXlDYWxsQmFja3MsCiAgICAgICAgQ29yZUZvdW5kYXRpb24ua0NGVHlwZURpY3Rpb25hcnlWYWx1ZUNhbGxCYWNrcywKICAgICkKCgpkZWYgX2NmX3N0cmluZ190b191bmljb2RlKHZhbHVlKToKICAgICIiIgogICAgQ3JlYXRlcyBhIFVuaWNvZGUgc3RyaW5nIGZyb20gYSBDRlN0cmluZyBvYmplY3QuIFVzZWQgZW50aXJlbHkgZm9yIGVycm9yCiAgICByZXBvcnRpbmcuCgogICAgWWVzLCBpdCBhbm5veXMgbWUgcXVpdGUgYSBsb3QgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIHRoaXMgY29tcGxleC4KICAgICIiIgogICAgdmFsdWVfYXNfdm9pZF9wID0gY3R5cGVzLmNhc3QodmFsdWUsIGN0eXBlcy5QT0lOVEVSKGN0eXBlcy5jX3ZvaWRfcCkpCgogICAgc3RyaW5nID0gQ29yZUZvdW5kYXRpb24uQ0ZTdHJpbmdHZXRDU3RyaW5nUHRyKAogICAgICAgIHZhbHVlX2FzX3ZvaWRfcCwKICAgICAgICBDRkNvbnN0LmtDRlN0cmluZ0VuY29kaW5nVVRGOAogICAgKQogICAgaWYgc3RyaW5nIGlzIE5vbmU6CiAgICAgICAgYnVmZmVyID0gY3R5cGVzLmNyZWF0ZV9zdHJpbmdfYnVmZmVyKDEwMjQpCiAgICAgICAgcmVzdWx0ID0gQ29yZUZvdW5kYXRpb24uQ0ZTdHJpbmdHZXRDU3RyaW5nKAogICAgICAgICAgICB2YWx1ZV9hc192b2lkX3AsCiAgICAgICAgICAgIGJ1ZmZlciwKICAgICAgICAgICAgMTAyNCwKICAgICAgICAgICAgQ0ZDb25zdC5rQ0ZTdHJpbmdFbmNvZGluZ1VURjgKICAgICAgICApCiAgICAgICAgaWYgbm90IHJlc3VsdDoKICAgICAgICAgICAgcmFpc2UgT1NFcnJvcignRXJyb3IgY29weWluZyBDIHN0cmluZyBmcm9tIENGU3RyaW5nUmVmJykKICAgICAgICBzdHJpbmcgPSBidWZmZXIudmFsdWUKICAgIGlmIHN0cmluZyBpcyBub3QgTm9uZToKICAgICAgICBzdHJpbmcgPSBzdHJpbmcuZGVjb2RlKCd1dGYtOCcpCiAgICByZXR1cm4gc3RyaW5nCgoKZGVmIF9hc3NlcnRfbm9fZXJyb3IoZXJyb3IsIGV4Y2VwdGlvbl9jbGFzcz1Ob25lKToKICAgICIiIgogICAgQ2hlY2tzIHRoZSByZXR1cm4gY29kZSBhbmQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvciB0bwogICAgcmVwb3J0CiAgICAiIiIKICAgIGlmIGVycm9yID09IDA6CiAgICAgICAgcmV0dXJuCgogICAgY2ZfZXJyb3Jfc3RyaW5nID0gU2VjdXJpdHkuU2VjQ29weUVycm9yTWVzc2FnZVN0cmluZyhlcnJvciwgTm9uZSkKICAgIG91dHB1dCA9IF9jZl9zdHJpbmdfdG9fdW5pY29kZShjZl9lcnJvcl9zdHJpbmcpCiAgICBDb3JlRm91bmRhdGlvbi5DRlJlbGVhc2UoY2ZfZXJyb3Jfc3RyaW5nKQoKICAgIGlmIG91dHB1dCBpcyBOb25lIG9yIG91dHB1dCA9PSB1Jyc6CiAgICAgICAgb3V0cHV0ID0gdSdPU1N0YXR1cyAlcycgJSBlcnJvcgoKICAgIGlmIGV4Y2VwdGlvbl9jbGFzcyBpcyBOb25lOgogICAgICAgIGV4Y2VwdGlvbl9jbGFzcyA9IHNzbC5TU0xFcnJvcgoKICAgIHJhaXNlIGV4Y2VwdGlvbl9jbGFzcyhvdXRwdXQpCgoKZGVmIF9jZXJ0X2FycmF5X2Zyb21fcGVtKHBlbV9idW5kbGUpOgogICAgIiIiCiAgICBHaXZlbiBhIGJ1bmRsZSBvZiBjZXJ0cyBpbiBQRU0gZm9ybWF0LCB0dXJucyB0aGVtIGludG8gYSBDRkFycmF5IG9mIGNlcnRzCiAgICB0aGF0IGNhbiBiZSB1c2VkIHRvIHZhbGlkYXRlIGEgY2VydCBjaGFpbi4KICAgICIiIgogICAgZGVyX2NlcnRzID0gWwogICAgICAgIGJhc2U2NC5iNjRkZWNvZGUobWF0Y2guZ3JvdXAoMSkpCiAgICAgICAgZm9yIG1hdGNoIGluIF9QRU1fQ0VSVFNfUkUuZmluZGl0ZXIocGVtX2J1bmRsZSkKICAgIF0KICAgIGlmIG5vdCBkZXJfY2VydHM6CiAgICAgICAgcmFpc2Ugc3NsLlNTTEVycm9yKCJObyByb290IGNlcnRpZmljYXRlcyBzcGVjaWZpZWQiKQoKICAgIGNlcnRfYXJyYXkgPSBDb3JlRm91bmRhdGlvbi5DRkFycmF5Q3JlYXRlTXV0YWJsZSgKICAgICAgICBDb3JlRm91bmRhdGlvbi5rQ0ZBbGxvY2F0b3JEZWZhdWx0LAogICAgICAgIDAsCiAgICAgICAgY3R5cGVzLmJ5cmVmKENvcmVGb3VuZGF0aW9uLmtDRlR5cGVBcnJheUNhbGxCYWNrcykKICAgICkKICAgIGlmIG5vdCBjZXJ0X2FycmF5OgogICAgICAgIHJhaXNlIHNzbC5TU0xFcnJvcigiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSEiKQoKICAgIHRyeToKICAgICAgICBmb3IgZGVyX2J5dGVzIGluIGRlcl9jZXJ0czoKICAgICAgICAgICAgY2VydGRhdGEgPSBfY2ZfZGF0YV9mcm9tX2J5dGVzKGRlcl9ieXRlcykKICAgICAgICAgICAgaWYgbm90IGNlcnRkYXRhOgogICAgICAgICAgICAgICAgcmFpc2Ugc3NsLlNTTEVycm9yKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5ISIpCiAgICAgICAgICAgIGNlcnQgPSBTZWN1cml0eS5TZWNDZXJ0aWZpY2F0ZUNyZWF0ZVdpdGhEYXRhKAogICAgICAgICAgICAgICAgQ29yZUZvdW5kYXRpb24ua0NGQWxsb2NhdG9yRGVmYXVsdCwgY2VydGRhdGEKICAgICAgICAgICAgKQogICAgICAgICAgICBDb3JlRm91bmRhdGlvbi5DRlJlbGVhc2UoY2VydGRhdGEpCiAgICAgICAgICAgIGlmIG5vdCBjZXJ0OgogICAgICAgICAgICAgICAgcmFpc2Ugc3NsLlNTTEVycm9yKCJVbmFibGUgdG8gYnVpbGQgY2VydCBvYmplY3QhIikKCiAgICAgICAgICAgIENvcmVGb3VuZGF0aW9uLkNGQXJyYXlBcHBlbmRWYWx1ZShjZXJ0X2FycmF5LCBjZXJ0KQogICAgICAgICAgICBDb3JlRm91bmRhdGlvbi5DRlJlbGVhc2UoY2VydCkKICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgIyBXZSBuZWVkIHRvIGZyZWUgdGhlIGFycmF5IGJlZm9yZSB0aGUgZXhjZXB0aW9uIGJ1YmJsZXMgZnVydGhlci4KICAgICAgICAjIFdlIG9ubHkgd2FudCB0byBkbyB0aGF0IGlmIGFuIGVycm9yIG9jY3Vyczogb3RoZXJ3aXNlLCB0aGUgY2FsbGVyCiAgICAgICAgIyBzaG91bGQgZnJlZS4KICAgICAgICBDb3JlRm91bmRhdGlvbi5DRlJlbGVhc2UoY2VydF9hcnJheSkKCiAgICByZXR1cm4gY2VydF9hcnJheQoKCmRlZiBfaXNfY2VydChpdGVtKToKICAgICIiIgogICAgUmV0dXJucyBUcnVlIGlmIGEgZ2l2ZW4gQ0ZUeXBlUmVmIGlzIGEgY2VydGlmaWNhdGUuCiAgICAiIiIKICAgIGV4cGVjdGVkID0gU2VjdXJpdHkuU2VjQ2VydGlmaWNhdGVHZXRUeXBlSUQoKQogICAgcmV0dXJuIENvcmVGb3VuZGF0aW9uLkNGR2V0VHlwZUlEKGl0ZW0pID09IGV4cGVjdGVkCgoKZGVmIF9pc19pZGVudGl0eShpdGVtKToKICAgICIiIgogICAgUmV0dXJucyBUcnVlIGlmIGEgZ2l2ZW4gQ0ZUeXBlUmVmIGlzIGFuIGlkZW50aXR5LgogICAgIiIiCiAgICBleHBlY3RlZCA9IFNlY3VyaXR5LlNlY0lkZW50aXR5R2V0VHlwZUlEKCkKICAgIHJldHVybiBDb3JlRm91bmRhdGlvbi5DRkdldFR5cGVJRChpdGVtKSA9PSBleHBlY3RlZAoKCmRlZiBfdGVtcG9yYXJ5X2tleWNoYWluKCk6CiAgICAiIiIKICAgIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIHRlbXBvcmFyeSBNYWMga2V5Y2hhaW4gdGhhdCB3ZSBjYW4gdXNlIHRvIHdvcmsgd2l0aAogICAgY3JlZGVudGlhbHMuIFRoaXMga2V5Y2hhaW4gdXNlcyBhIG9uZS10aW1lIHBhc3N3b3JkIGFuZCBhIHRlbXBvcmFyeSBmaWxlIHRvCiAgICBzdG9yZSB0aGUgZGF0YS4gV2UgZXhwZWN0IHRvIGhhdmUgb25lIGtleWNoYWluIHBlciBzb2NrZXQuIFRoZSByZXR1cm5lZAogICAgU2VjS2V5Y2hhaW5SZWYgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLCBpbmNsdWRpbmcgY2FsbGluZwogICAgU2VjS2V5Y2hhaW5EZWxldGUuCgogICAgUmV0dXJucyBhIHR1cGxlIG9mIHRoZSBTZWNLZXljaGFpblJlZiBhbmQgdGhlIHBhdGggdG8gdGhlIHRlbXBvcmFyeQogICAgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgaXQuCiAgICAiIiIKICAgICMgVW5mb3J0dW5hdGVseSwgU2VjS2V5Y2hhaW5DcmVhdGUgcmVxdWlyZXMgYSBwYXRoIHRvIGEga2V5Y2hhaW4uIFRoaXMKICAgICMgbWVhbnMgd2UgY2Fubm90IHVzZSBta3N0ZW1wIHRvIHVzZSBhIGdlbmVyaWMgdGVtcG9yYXJ5IGZpbGUuIEluc3RlYWQsCiAgICAjIHdlJ3JlIGdvaW5nIHRvIGNyZWF0ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgYW5kIGEgZmlsZW5hbWUgdG8gdXNlIHRoZXJlLgogICAgIyBUaGlzIGZpbGVuYW1lIHdpbGwgYmUgOCByYW5kb20gYnl0ZXMgZXhwYW5kZWQgaW50byBiYXNlNjQuIFdlIGFsc28gbmVlZAogICAgIyBzb21lIHJhbmRvbSBieXRlcyB0byBwYXNzd29yZC1wcm90ZWN0IHRoZSBrZXljaGFpbiB3ZSdyZSBjcmVhdGluZywgc28gd2UKICAgICMgYXNrIGZvciA0MCByYW5kb20gYnl0ZXMuCiAgICByYW5kb21fYnl0ZXMgPSBvcy51cmFuZG9tKDQwKQogICAgZmlsZW5hbWUgPSBiYXNlNjQuYjY0ZW5jb2RlKHJhbmRvbV9ieXRlc1s6OF0pLmRlY29kZSgndXRmLTgnKQogICAgcGFzc3dvcmQgPSBiYXNlNjQuYjY0ZW5jb2RlKHJhbmRvbV9ieXRlc1s4Ol0pICAjIE11c3QgYmUgdmFsaWQgVVRGLTgKICAgIHRlbXBkaXJlY3RvcnkgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKCiAgICBrZXljaGFpbl9wYXRoID0gb3MucGF0aC5qb2luKHRlbXBkaXJlY3RvcnksIGZpbGVuYW1lKS5lbmNvZGUoJ3V0Zi04JykKCiAgICAjIFdlIG5vdyB3YW50IHRvIGNyZWF0ZSB0aGUga2V5Y2hhaW4gaXRzZWxmLgogICAga2V5Y2hhaW4gPSBTZWN1cml0eS5TZWNLZXljaGFpblJlZigpCiAgICBzdGF0dXMgPSBTZWN1cml0eS5TZWNLZXljaGFpbkNyZWF0ZSgKICAgICAgICBrZXljaGFpbl9wYXRoLAogICAgICAgIGxlbihwYXNzd29yZCksCiAgICAgICAgcGFzc3dvcmQsCiAgICAgICAgRmFsc2UsCiAgICAgICAgTm9uZSwKICAgICAgICBjdHlwZXMuYnlyZWYoa2V5Y2hhaW4pCiAgICApCiAgICBfYXNzZXJ0X25vX2Vycm9yKHN0YXR1cykKCiAgICAjIEhhdmluZyBjcmVhdGVkIHRoZSBrZXljaGFpbiwgd2Ugd2FudCB0byBwYXNzIGl0IG9mZiB0byB0aGUgY2FsbGVyLgogICAgcmV0dXJuIGtleWNoYWluLCB0ZW1wZGlyZWN0b3J5CgoKZGVmIF9sb2FkX2l0ZW1zX2Zyb21fZmlsZShrZXljaGFpbiwgcGF0aCk6CiAgICAiIiIKICAgIEdpdmVuIGEgc2luZ2xlIGZpbGUsIGxvYWRzIGFsbCB0aGUgdHJ1c3Qgb2JqZWN0cyBmcm9tIGl0IGludG8gYXJyYXlzIGFuZAogICAgdGhlIGtleWNoYWluLgogICAgUmV0dXJucyBhIHR1cGxlIG9mIGxpc3RzOiB0aGUgZmlyc3QgbGlzdCBpcyBhIGxpc3Qgb2YgaWRlbnRpdGllcywgdGhlCiAgICBzZWNvbmQgYSBsaXN0IG9mIGNlcnRzLgogICAgIiIiCiAgICBjZXJ0aWZpY2F0ZXMgPSBbXQogICAgaWRlbnRpdGllcyA9IFtdCiAgICByZXN1bHRfYXJyYXkgPSBOb25lCgogICAgd2l0aCBvcGVuKHBhdGgsICdyYicpIGFzIGY6CiAgICAgICAgcmF3X2ZpbGVkYXRhID0gZi5yZWFkKCkKCiAgICB0cnk6CiAgICAgICAgZmlsZWRhdGEgPSBDb3JlRm91bmRhdGlvbi5DRkRhdGFDcmVhdGUoCiAgICAgICAgICAgIENvcmVGb3VuZGF0aW9uLmtDRkFsbG9jYXRvckRlZmF1bHQsCiAgICAgICAgICAgIHJhd19maWxlZGF0YSwKICAgICAgICAgICAgbGVuKHJhd19maWxlZGF0YSkKICAgICAgICApCiAgICAgICAgcmVzdWx0X2FycmF5ID0gQ29yZUZvdW5kYXRpb24uQ0ZBcnJheVJlZigpCiAgICAgICAgcmVzdWx0ID0gU2VjdXJpdHkuU2VjSXRlbUltcG9ydCgKICAgICAgICAgICAgZmlsZWRhdGEsICAjIGNlcnQgZGF0YQogICAgICAgICAgICBOb25lLCAgIyBGaWxlbmFtZSwgbGVhdmluZyBpdCBvdXQgZm9yIG5vdwogICAgICAgICAgICBOb25lLCAgIyBXaGF0IHRoZSB0eXBlIG9mIHRoZSBmaWxlIGlzLCB3ZSBkb24ndCBjYXJlCiAgICAgICAgICAgIE5vbmUsICAjIHdoYXQncyBpbiB0aGUgZmlsZSwgd2UgZG9uJ3QgY2FyZQogICAgICAgICAgICAwLCAgIyBpbXBvcnQgZmxhZ3MKICAgICAgICAgICAgTm9uZSwgICMga2V5IHBhcmFtcywgY2FuIGluY2x1ZGUgcGFzc3BocmFzZSBpbiB0aGUgZnV0dXJlCiAgICAgICAgICAgIGtleWNoYWluLCAgIyBUaGUga2V5Y2hhaW4gdG8gaW5zZXJ0IGludG8KICAgICAgICAgICAgY3R5cGVzLmJ5cmVmKHJlc3VsdF9hcnJheSkgICMgUmVzdWx0cwogICAgICAgICkKICAgICAgICBfYXNzZXJ0X25vX2Vycm9yKHJlc3VsdCkKCiAgICAgICAgIyBBIENGQXJyYXkgaXMgbm90IHZlcnkgdXNlZnVsIHRvIHVzIGFzIGFuIGludGVybWVkaWFyeQogICAgICAgICMgcmVwcmVzZW50YXRpb24sIHNvIHdlIGFyZSBnb2luZyB0byBleHRyYWN0IHRoZSBvYmplY3RzIHdlIHdhbnQKICAgICAgICAjIGFuZCB0aGVuIGZyZWUgdGhlIGFycmF5LiBXZSBkb24ndCBuZWVkIHRvIGtlZXAgaG9sZCBvZiBrZXlzOiB0aGUKICAgICAgICAjIGtleWNoYWluIGFscmVhZHkgaGFzIHRoZW0hCiAgICAgICAgcmVzdWx0X2NvdW50ID0gQ29yZUZvdW5kYXRpb24uQ0ZBcnJheUdldENvdW50KHJlc3VsdF9hcnJheSkKICAgICAgICBmb3IgaW5kZXggaW4gcmFuZ2UocmVzdWx0X2NvdW50KToKICAgICAgICAgICAgaXRlbSA9IENvcmVGb3VuZGF0aW9uLkNGQXJyYXlHZXRWYWx1ZUF0SW5kZXgoCiAgICAgICAgICAgICAgICByZXN1bHRfYXJyYXksIGluZGV4CiAgICAgICAgICAgICkKICAgICAgICAgICAgaXRlbSA9IGN0eXBlcy5jYXN0KGl0ZW0sIENvcmVGb3VuZGF0aW9uLkNGVHlwZVJlZikKCiAgICAgICAgICAgIGlmIF9pc19jZXJ0KGl0ZW0pOgogICAgICAgICAgICAgICAgQ29yZUZvdW5kYXRpb24uQ0ZSZXRhaW4oaXRlbSkKICAgICAgICAgICAgICAgIGNlcnRpZmljYXRlcy5hcHBlbmQoaXRlbSkKICAgICAgICAgICAgZWxpZiBfaXNfaWRlbnRpdHkoaXRlbSk6CiAgICAgICAgICAgICAgICBDb3JlRm91bmRhdGlvbi5DRlJldGFpbihpdGVtKQogICAgICAgICAgICAgICAgaWRlbnRpdGllcy5hcHBlbmQoaXRlbSkKICAgIGZpbmFsbHk6CiAgICAgICAgaWYgcmVzdWx0X2FycmF5OgogICAgICAgICAgICBDb3JlRm91bmRhdGlvbi5DRlJlbGVhc2UocmVzdWx0X2FycmF5KQoKICAgICAgICBDb3JlRm91bmRhdGlvbi5DRlJlbGVhc2UoZmlsZWRhdGEpCgogICAgcmV0dXJuIChpZGVudGl0aWVzLCBjZXJ0aWZpY2F0ZXMpCgoKZGVmIF9sb2FkX2NsaWVudF9jZXJ0X2NoYWluKGtleWNoYWluLCAqcGF0aHMpOgogICAgIiIiCiAgICBMb2FkIGNlcnRpZmljYXRlcyBhbmQgbWF5YmUga2V5cyBmcm9tIGEgbnVtYmVyIG9mIGZpbGVzLiBIYXMgdGhlIGVuZCBnb2FsCiAgICBvZiByZXR1cm5pbmcgYSBDRkFycmF5IGNvbnRhaW5pbmcgb25lIFNlY0lkZW50aXR5UmVmLCBhbmQgdGhlbiB6ZXJvIG9yIG1vcmUKICAgIFNlY0NlcnRpZmljYXRlUmVmIG9iamVjdHMsIHN1aXRhYmxlIGZvciB1c2UgYXMgYSBjbGllbnQgY2VydGlmaWNhdGUgdHJ1c3QKICAgIGNoYWluLgogICAgIiIiCiAgICAjIE9rLCB0aGUgc3RyYXRlZ3kuCiAgICAjCiAgICAjIFRoaXMgcmVsaWVzIG9uIGtub3dpbmcgdGhhdCBtYWNPUyB3aWxsIG5vdCBnaXZlIHlvdSBhIFNlY0lkZW50aXR5UmVmCiAgICAjIHVubGVzcyB5b3UgaGF2ZSBpbXBvcnRlZCBhIGtleSBpbnRvIGEga2V5Y2hhaW4uIFRoaXMgaXMgYSBzb21ld2hhdAogICAgIyBhcnRpZmljaWFsIGxpbWl0YXRpb24gb2YgbWFjT1MgKGZvciBleGFtcGxlLCBpdCBkb2Vzbid0IG5lY2Vzc2FyaWx5CiAgICAjIGFmZmVjdCBpT1MpLCBidXQgdGhlcmUgaXMgbm90aGluZyBpbnNpZGUgU2VjdXJpdHkuZnJhbWV3b3JrIHRoYXQgbGV0cyB5b3UKICAgICMgZ2V0IGEgU2VjSWRlbnRpdHlSZWYgd2l0aG91dCBoYXZpbmcgYSBrZXkgaW4gYSBrZXljaGFpbi4KICAgICMKICAgICMgU28gdGhlIHBvbGljeSBoZXJlIGlzIHdlIHRha2UgYWxsIHRoZSBmaWxlcyBhbmQgaXRlcmF0ZSB0aGVtIGluIG9yZGVyLgogICAgIyBFYWNoIG9uZSB3aWxsIHVzZSBTZWNJdGVtSW1wb3J0IHRvIGhhdmUgb25lIG9yIG1vcmUgb2JqZWN0cyBsb2FkZWQgZnJvbQogICAgIyBpdC4gV2Ugd2lsbCBhbHNvIHBvaW50IGF0IGEga2V5Y2hhaW4gdGhhdCBtYWNPUyBjYW4gdXNlIHRvIHdvcmsgd2l0aCB0aGUKICAgICMgcHJpdmF0ZSBrZXkuCiAgICAjCiAgICAjIE9uY2Ugd2UgaGF2ZSBhbGwgdGhlIG9iamVjdHMsIHdlJ2xsIGNoZWNrIHdoYXQgd2UgYWN0dWFsbHkgaGF2ZS4gSWYgd2UKICAgICMgYWxyZWFkeSBoYXZlIGEgU2VjSWRlbnRpdHlSZWYgaW4gaGFuZCwgZmFiOiB3ZSdsbCB1c2UgdGhhdC4gT3RoZXJ3aXNlLAogICAgIyB3ZSdsbCB0YWtlIHRoZSBmaXJzdCBjZXJ0aWZpY2F0ZSAod2hpY2ggd2UgYXNzdW1lIHRvIGJlIG91ciBsZWFmKSBhbmQKICAgICMgYXNrIHRoZSBrZXljaGFpbiB0byBnaXZlIHVzIGEgU2VjSWRlbnRpdHlSZWYgd2l0aCB0aGF0IGNlcnQncyBhc3NvY2lhdGVkCiAgICAjIGtleS4KICAgICMKICAgICMgV2UnbGwgdGhlbiByZXR1cm4gYSBDRkFycmF5IGNvbnRhaW5pbmcgdGhlIHRydXN0IGNoYWluOiBvbmUKICAgICMgU2VjSWRlbnRpdHlSZWYgYW5kIHRoZW4gemVyby1vci1tb3JlIFNlY0NlcnRpZmljYXRlUmVmIG9iamVjdHMuIFRoZQogICAgIyByZXNwb25zaWJpbGl0eSBmb3IgZnJlZWluZyB0aGlzIENGQXJyYXkgd2lsbCBiZSB3aXRoIHRoZSBjYWxsZXIuIFRoaXMKICAgICMgQ0ZBcnJheSBtdXN0IHJlbWFpbiBhbGl2ZSBmb3IgdGhlIGVudGlyZSBjb25uZWN0aW9uLCBzbyBpbiBwcmFjdGljZSBpdAogICAgIyB3aWxsIGJlIHN0b3JlZCB3aXRoIGEgc2luZ2xlIFNTTFNvY2tldCwgYWxvbmcgd2l0aCB0aGUgcmVmZXJlbmNlIHRvIHRoZQogICAgIyBrZXljaGFpbi4KICAgIGNlcnRpZmljYXRlcyA9IFtdCiAgICBpZGVudGl0aWVzID0gW10KCiAgICAjIEZpbHRlciBvdXQgYmFkIHBhdGhzLgogICAgcGF0aHMgPSAocGF0aCBmb3IgcGF0aCBpbiBwYXRocyBpZiBwYXRoKQoKICAgIHRyeToKICAgICAgICBmb3IgZmlsZV9wYXRoIGluIHBhdGhzOgogICAgICAgICAgICBuZXdfaWRlbnRpdGllcywgbmV3X2NlcnRzID0gX2xvYWRfaXRlbXNfZnJvbV9maWxlKAogICAgICAgICAgICAgICAga2V5Y2hhaW4sIGZpbGVfcGF0aAogICAgICAgICAgICApCiAgICAgICAgICAgIGlkZW50aXRpZXMuZXh0ZW5kKG5ld19pZGVudGl0aWVzKQogICAgICAgICAgICBjZXJ0aWZpY2F0ZXMuZXh0ZW5kKG5ld19jZXJ0cykKCiAgICAgICAgIyBPaywgd2UgaGF2ZSBldmVyeXRoaW5nLiBUaGUgcXVlc3Rpb24gaXM6IGRvIHdlIGhhdmUgYW4gaWRlbnRpdHk/IElmCiAgICAgICAgIyBub3QsIHdlIHdhbnQgdG8gZ3JhYiBvbmUgZnJvbSB0aGUgZmlyc3QgY2VydCB3ZSBoYXZlLgogICAgICAgIGlmIG5vdCBpZGVudGl0aWVzOgogICAgICAgICAgICBuZXdfaWRlbnRpdHkgPSBTZWN1cml0eS5TZWNJZGVudGl0eVJlZigpCiAgICAgICAgICAgIHN0YXR1cyA9IFNlY3VyaXR5LlNlY0lkZW50aXR5Q3JlYXRlV2l0aENlcnRpZmljYXRlKAogICAgICAgICAgICAgICAga2V5Y2hhaW4sCiAgICAgICAgICAgICAgICBjZXJ0aWZpY2F0ZXNbMF0sCiAgICAgICAgICAgICAgICBjdHlwZXMuYnlyZWYobmV3X2lkZW50aXR5KQogICAgICAgICAgICApCiAgICAgICAgICAgIF9hc3NlcnRfbm9fZXJyb3Ioc3RhdHVzKQogICAgICAgICAgICBpZGVudGl0aWVzLmFwcGVuZChuZXdfaWRlbnRpdHkpCgogICAgICAgICAgICAjIFdlIG5vdyB3YW50IHRvIHJlbGVhc2UgdGhlIG9yaWdpbmFsIGNlcnRpZmljYXRlLCBhcyB3ZSBubyBsb25nZXIKICAgICAgICAgICAgIyBuZWVkIGl0LgogICAgICAgICAgICBDb3JlRm91bmRhdGlvbi5DRlJlbGVhc2UoY2VydGlmaWNhdGVzLnBvcCgwKSkKCiAgICAgICAgIyBXZSBub3cgbmVlZCB0byBidWlsZCBhIG5ldyBDRkFycmF5IHRoYXQgaG9sZHMgdGhlIHRydXN0IGNoYWluLgogICAgICAgIHRydXN0X2NoYWluID0gQ29yZUZvdW5kYXRpb24uQ0ZBcnJheUNyZWF0ZU11dGFibGUoCiAgICAgICAgICAgIENvcmVGb3VuZGF0aW9uLmtDRkFsbG9jYXRvckRlZmF1bHQsCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgIGN0eXBlcy5ieXJlZihDb3JlRm91bmRhdGlvbi5rQ0ZUeXBlQXJyYXlDYWxsQmFja3MpLAogICAgICAgICkKICAgICAgICBmb3IgaXRlbSBpbiBpdGVydG9vbHMuY2hhaW4oaWRlbnRpdGllcywgY2VydGlmaWNhdGVzKToKICAgICAgICAgICAgIyBBcnJheUFwcGVuZFZhbHVlIGRvZXMgYSBDRlJldGFpbiBvbiB0aGUgaXRlbS4gVGhhdCdzIGZpbmUsCiAgICAgICAgICAgICMgYmVjYXVzZSB0aGUgZmluYWxseSBibG9jayB3aWxsIHJlbGVhc2Ugb3VyIG90aGVyIHJlZnMgdG8gdGhlbS4KICAgICAgICAgICAgQ29yZUZvdW5kYXRpb24uQ0ZBcnJheUFwcGVuZFZhbHVlKHRydXN0X2NoYWluLCBpdGVtKQoKICAgICAgICByZXR1cm4gdHJ1c3RfY2hhaW4KICAgIGZpbmFsbHk6CiAgICAgICAgZm9yIG9iaiBpbiBpdGVydG9vbHMuY2hhaW4oaWRlbnRpdGllcywgY2VydGlmaWNhdGVzKToKICAgICAgICAgICAgQ29yZUZvdW5kYXRpb24uQ0ZSZWxlYXNlKG9iaikKUEsDBBQAAAAAAAAAIQAYw62TcSoAAHEqAAA4AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvY29udHJpYi9hcHBlbmdpbmUucHkiIiIKVGhpcyBtb2R1bGUgcHJvdmlkZXMgYSBwb29sIG1hbmFnZXIgdGhhdCB1c2VzIEdvb2dsZSBBcHAgRW5naW5lJ3MKYFVSTEZldGNoIFNlcnZpY2UgPGh0dHBzOi8vY2xvdWQuZ29vZ2xlLmNvbS9hcHBlbmdpbmUvZG9jcy9weXRob24vdXJsZmV0Y2g+YF8uCgpFeGFtcGxlIHVzYWdlOjoKCiAgICBmcm9tIHVybGxpYjMgaW1wb3J0IFBvb2xNYW5hZ2VyCiAgICBmcm9tIHVybGxpYjMuY29udHJpYi5hcHBlbmdpbmUgaW1wb3J0IEFwcEVuZ2luZU1hbmFnZXIsIGlzX2FwcGVuZ2luZV9zYW5kYm94CgogICAgaWYgaXNfYXBwZW5naW5lX3NhbmRib3goKToKICAgICAgICAjIEFwcEVuZ2luZU1hbmFnZXIgdXNlcyBBcHBFbmdpbmUncyBVUkxGZXRjaCBBUEkgYmVoaW5kIHRoZSBzY2VuZXMKICAgICAgICBodHRwID0gQXBwRW5naW5lTWFuYWdlcigpCiAgICBlbHNlOgogICAgICAgICMgUG9vbE1hbmFnZXIgdXNlcyBhIHNvY2tldC1sZXZlbCBBUEkgYmVoaW5kIHRoZSBzY2VuZXMKICAgICAgICBodHRwID0gUG9vbE1hbmFnZXIoKQoKICAgIHIgPSBodHRwLnJlcXVlc3QoJ0dFVCcsICdodHRwczovL2dvb2dsZS5jb20vJykKClRoZXJlIGFyZSBgbGltaXRhdGlvbnMgPGh0dHBzOi8vY2xvdWQuZ29vZ2xlLmNvbS9hcHBlbmdpbmUvZG9jcy9weXRob24vXAp1cmxmZXRjaC8jUHl0aG9uX1F1b3Rhc19hbmRfbGltaXRzPmBfIHRvIHRoZSBVUkxGZXRjaCBzZXJ2aWNlIGFuZCBpdCBtYXkgbm90IGJlCnRoZSBiZXN0IGNob2ljZSBmb3IgeW91ciBhcHBsaWNhdGlvbi4gVGhlcmUgYXJlIHRocmVlIG9wdGlvbnMgZm9yIHVzaW5nCnVybGxpYjMgb24gR29vZ2xlIEFwcCBFbmdpbmU6CgoxLiBZb3UgY2FuIHVzZSA6Y2xhc3M6YEFwcEVuZ2luZU1hbmFnZXJgIHdpdGggVVJMRmV0Y2guIFVSTEZldGNoIGlzCiAgIGNvc3QtZWZmZWN0aXZlIGluIG1hbnkgY2lyY3Vtc3RhbmNlcyBhcyBsb25nIGFzIHlvdXIgdXNhZ2UgaXMgd2l0aGluIHRoZQogICBsaW1pdGF0aW9ucy4KMi4gWW91IGNhbiB1c2UgYSBub3JtYWwgOmNsYXNzOmB+dXJsbGliMy5Qb29sTWFuYWdlcmAgYnkgZW5hYmxpbmcgc29ja2V0cy4KICAgU29ja2V0cyBhbHNvIGhhdmUgYGxpbWl0YXRpb25zIGFuZCByZXN0cmljdGlvbnMKICAgPGh0dHBzOi8vY2xvdWQuZ29vZ2xlLmNvbS9hcHBlbmdpbmUvZG9jcy9weXRob24vc29ja2V0cy9cCiAgICNsaW1pdGF0aW9ucy1hbmQtcmVzdHJpY3Rpb25zPmBfIGFuZCBoYXZlIGEgbG93ZXIgZnJlZSBxdW90YSB0aGFuIFVSTEZldGNoLgogICBUbyB1c2Ugc29ja2V0cywgYmUgc3VyZSB0byBzcGVjaWZ5IHRoZSBmb2xsb3dpbmcgaW4geW91ciBgYGFwcC55YW1sYGA6OgoKICAgICAgICBlbnZfdmFyaWFibGVzOgogICAgICAgICAgICBHQUVfVVNFX1NPQ0tFVFNfSFRUUExJQiA6ICd0cnVlJwoKMy4gSWYgeW91IGFyZSB1c2luZyBgQXBwIEVuZ2luZSBGbGV4aWJsZQo8aHR0cHM6Ly9jbG91ZC5nb29nbGUuY29tL2FwcGVuZ2luZS9kb2NzL2ZsZXhpYmxlLz5gXywgeW91IGNhbiB1c2UgdGhlIHN0YW5kYXJkCjpjbGFzczpgUG9vbE1hbmFnZXJgIHdpdGhvdXQgYW55IGNvbmZpZ3VyYXRpb24gb3Igc3BlY2lhbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCiIiIgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG9zCmltcG9ydCB3YXJuaW5ncwpmcm9tIC4ucGFja2FnZXMuc2l4Lm1vdmVzLnVybGxpYi5wYXJzZSBpbXBvcnQgdXJsam9pbgoKZnJvbSAuLmV4Y2VwdGlvbnMgaW1wb3J0ICgKICAgIEhUVFBFcnJvciwKICAgIEhUVFBXYXJuaW5nLAogICAgTWF4UmV0cnlFcnJvciwKICAgIFByb3RvY29sRXJyb3IsCiAgICBUaW1lb3V0RXJyb3IsCiAgICBTU0xFcnJvcgopCgpmcm9tIC4ucGFja2FnZXMuc2l4IGltcG9ydCBCeXRlc0lPCmZyb20gLi5yZXF1ZXN0IGltcG9ydCBSZXF1ZXN0TWV0aG9kcwpmcm9tIC4ucmVzcG9uc2UgaW1wb3J0IEhUVFBSZXNwb25zZQpmcm9tIC4udXRpbC50aW1lb3V0IGltcG9ydCBUaW1lb3V0CmZyb20gLi51dGlsLnJldHJ5IGltcG9ydCBSZXRyeQoKdHJ5OgogICAgZnJvbSBnb29nbGUuYXBwZW5naW5lLmFwaSBpbXBvcnQgdXJsZmV0Y2gKZXhjZXB0IEltcG9ydEVycm9yOgogICAgdXJsZmV0Y2ggPSBOb25lCgoKbG9nID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKY2xhc3MgQXBwRW5naW5lUGxhdGZvcm1XYXJuaW5nKEhUVFBXYXJuaW5nKToKICAgIHBhc3MKCgpjbGFzcyBBcHBFbmdpbmVQbGF0Zm9ybUVycm9yKEhUVFBFcnJvcik6CiAgICBwYXNzCgoKY2xhc3MgQXBwRW5naW5lTWFuYWdlcihSZXF1ZXN0TWV0aG9kcyk6CiAgICAiIiIKICAgIENvbm5lY3Rpb24gbWFuYWdlciBmb3IgR29vZ2xlIEFwcCBFbmdpbmUgc2FuZGJveCBhcHBsaWNhdGlvbnMuCgogICAgVGhpcyBtYW5hZ2VyIHVzZXMgdGhlIFVSTEZldGNoIHNlcnZpY2UgZGlyZWN0bHkgaW5zdGVhZCBvZiB1c2luZyB0aGUKICAgIGVtdWxhdGVkIGh0dHBsaWIsIGFuZCBpcyBzdWJqZWN0IHRvIFVSTEZldGNoIGxpbWl0YXRpb25zIGFzIGRlc2NyaWJlZCBpbgogICAgdGhlIEFwcCBFbmdpbmUgZG9jdW1lbnRhdGlvbiBgaGVyZQogICAgPGh0dHBzOi8vY2xvdWQuZ29vZ2xlLmNvbS9hcHBlbmdpbmUvZG9jcy9weXRob24vdXJsZmV0Y2g+YF8uCgogICAgTm90YWJseSBpdCB3aWxsIHJhaXNlIGFuIDpjbGFzczpgQXBwRW5naW5lUGxhdGZvcm1FcnJvcmAgaWY6CiAgICAgICAgKiBVUkxGZXRjaCBpcyBub3QgYXZhaWxhYmxlLgogICAgICAgICogSWYgeW91IGF0dGVtcHQgdG8gdXNlIHRoaXMgb24gQXBwIEVuZ2luZSBGbGV4aWJsZSwgYXMgZnVsbCBzb2NrZXQKICAgICAgICAgIHN1cHBvcnQgaXMgYXZhaWxhYmxlLgogICAgICAgICogSWYgYSByZXF1ZXN0IHNpemUgaXMgbW9yZSB0aGFuIDEwIG1lZ2FieXRlcy4KICAgICAgICAqIElmIGEgcmVzcG9uc2Ugc2l6ZSBpcyBtb3JlIHRoYW4gMzIgbWVnYWJ0eWVzLgogICAgICAgICogSWYgeW91IHVzZSBhbiB1bnN1cHBvcnRlZCByZXF1ZXN0IG1ldGhvZCBzdWNoIGFzIE9QVElPTlMuCgogICAgQmV5b25kIHRob3NlIGNhc2VzLCBpdCB3aWxsIHJhaXNlIG5vcm1hbCB1cmxsaWIzIGVycm9ycy4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBoZWFkZXJzPU5vbmUsIHJldHJpZXM9Tm9uZSwgdmFsaWRhdGVfY2VydGlmaWNhdGU9VHJ1ZSwKICAgICAgICAgICAgICAgICB1cmxmZXRjaF9yZXRyaWVzPVRydWUpOgogICAgICAgIGlmIG5vdCB1cmxmZXRjaDoKICAgICAgICAgICAgcmFpc2UgQXBwRW5naW5lUGxhdGZvcm1FcnJvcigKICAgICAgICAgICAgICAgICJVUkxGZXRjaCBpcyBub3QgYXZhaWxhYmxlIGluIHRoaXMgZW52aXJvbm1lbnQuIikKCiAgICAgICAgaWYgaXNfcHJvZF9hcHBlbmdpbmVfbXZtcygpOgogICAgICAgICAgICByYWlzZSBBcHBFbmdpbmVQbGF0Zm9ybUVycm9yKAogICAgICAgICAgICAgICAgIlVzZSBub3JtYWwgdXJsbGliMy5Qb29sTWFuYWdlciBpbnN0ZWFkIG9mIEFwcEVuZ2luZU1hbmFnZXIiCiAgICAgICAgICAgICAgICAib24gTWFuYWdlZCBWTXMsIGFzIHVzaW5nIFVSTEZldGNoIGlzIG5vdCBuZWNlc3NhcnkgaW4gIgogICAgICAgICAgICAgICAgInRoaXMgZW52aXJvbm1lbnQuIikKCiAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgInVybGxpYjMgaXMgdXNpbmcgVVJMRmV0Y2ggb24gR29vZ2xlIEFwcCBFbmdpbmUgc2FuZGJveCBpbnN0ZWFkICIKICAgICAgICAgICAgIm9mIHNvY2tldHMuIFRvIHVzZSBzb2NrZXRzIGRpcmVjdGx5IGluc3RlYWQgb2YgVVJMRmV0Y2ggc2VlICIKICAgICAgICAgICAgImh0dHBzOi8vdXJsbGliMy5yZWFkdGhlZG9jcy5pby9lbi9sYXRlc3QvcmVmZXJlbmNlL3VybGxpYjMuY29udHJpYi5odG1sLiIsCiAgICAgICAgICAgIEFwcEVuZ2luZVBsYXRmb3JtV2FybmluZykKCiAgICAgICAgUmVxdWVzdE1ldGhvZHMuX19pbml0X18oc2VsZiwgaGVhZGVycykKICAgICAgICBzZWxmLnZhbGlkYXRlX2NlcnRpZmljYXRlID0gdmFsaWRhdGVfY2VydGlmaWNhdGUKICAgICAgICBzZWxmLnVybGZldGNoX3JldHJpZXMgPSB1cmxmZXRjaF9yZXRyaWVzCgogICAgICAgIHNlbGYucmV0cmllcyA9IHJldHJpZXMgb3IgUmV0cnkuREVGQVVMVAoKICAgIGRlZiBfX2VudGVyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgX19leGl0X18oc2VsZiwgZXhjX3R5cGUsIGV4Y192YWwsIGV4Y190Yik6CiAgICAgICAgIyBSZXR1cm4gRmFsc2UgdG8gcmUtcmFpc2UgYW55IHBvdGVudGlhbCBleGNlcHRpb25zCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIHVybG9wZW4oc2VsZiwgbWV0aG9kLCB1cmwsIGJvZHk9Tm9uZSwgaGVhZGVycz1Ob25lLAogICAgICAgICAgICAgICAgcmV0cmllcz1Ob25lLCByZWRpcmVjdD1UcnVlLCB0aW1lb3V0PVRpbWVvdXQuREVGQVVMVF9USU1FT1VULAogICAgICAgICAgICAgICAgKipyZXNwb25zZV9rdyk6CgogICAgICAgIHJldHJpZXMgPSBzZWxmLl9nZXRfcmV0cmllcyhyZXRyaWVzLCByZWRpcmVjdCkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBmb2xsb3dfcmVkaXJlY3RzID0gKAogICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0IGFuZAogICAgICAgICAgICAgICAgICAgIHJldHJpZXMucmVkaXJlY3QgIT0gMCBhbmQKICAgICAgICAgICAgICAgICAgICByZXRyaWVzLnRvdGFsKQogICAgICAgICAgICByZXNwb25zZSA9IHVybGZldGNoLmZldGNoKAogICAgICAgICAgICAgICAgdXJsLAogICAgICAgICAgICAgICAgcGF5bG9hZD1ib2R5LAogICAgICAgICAgICAgICAgbWV0aG9kPW1ldGhvZCwKICAgICAgICAgICAgICAgIGhlYWRlcnM9aGVhZGVycyBvciB7fSwKICAgICAgICAgICAgICAgIGFsbG93X3RydW5jYXRlZD1GYWxzZSwKICAgICAgICAgICAgICAgIGZvbGxvd19yZWRpcmVjdHM9c2VsZi51cmxmZXRjaF9yZXRyaWVzIGFuZCBmb2xsb3dfcmVkaXJlY3RzLAogICAgICAgICAgICAgICAgZGVhZGxpbmU9c2VsZi5fZ2V0X2Fic29sdXRlX3RpbWVvdXQodGltZW91dCksCiAgICAgICAgICAgICAgICB2YWxpZGF0ZV9jZXJ0aWZpY2F0ZT1zZWxmLnZhbGlkYXRlX2NlcnRpZmljYXRlLAogICAgICAgICAgICApCiAgICAgICAgZXhjZXB0IHVybGZldGNoLkRlYWRsaW5lRXhjZWVkZWRFcnJvciBhcyBlOgogICAgICAgICAgICByYWlzZSBUaW1lb3V0RXJyb3Ioc2VsZiwgZSkKCiAgICAgICAgZXhjZXB0IHVybGZldGNoLkludmFsaWRVUkxFcnJvciBhcyBlOgogICAgICAgICAgICBpZiAndG9vIGxhcmdlJyBpbiBzdHIoZSk6CiAgICAgICAgICAgICAgICByYWlzZSBBcHBFbmdpbmVQbGF0Zm9ybUVycm9yKAogICAgICAgICAgICAgICAgICAgICJVUkxGZXRjaCByZXF1ZXN0IHRvbyBsYXJnZSwgVVJMRmV0Y2ggb25seSAiCiAgICAgICAgICAgICAgICAgICAgInN1cHBvcnRzIHJlcXVlc3RzIHVwIHRvIDEwbWIgaW4gc2l6ZS4iLCBlKQogICAgICAgICAgICByYWlzZSBQcm90b2NvbEVycm9yKGUpCgogICAgICAgIGV4Y2VwdCB1cmxmZXRjaC5Eb3dubG9hZEVycm9yIGFzIGU6CiAgICAgICAgICAgIGlmICdUb28gbWFueSByZWRpcmVjdHMnIGluIHN0cihlKToKICAgICAgICAgICAgICAgIHJhaXNlIE1heFJldHJ5RXJyb3Ioc2VsZiwgdXJsLCByZWFzb249ZSkKICAgICAgICAgICAgcmFpc2UgUHJvdG9jb2xFcnJvcihlKQoKICAgICAgICBleGNlcHQgdXJsZmV0Y2guUmVzcG9uc2VUb29MYXJnZUVycm9yIGFzIGU6CiAgICAgICAgICAgIHJhaXNlIEFwcEVuZ2luZVBsYXRmb3JtRXJyb3IoCiAgICAgICAgICAgICAgICAiVVJMRmV0Y2ggcmVzcG9uc2UgdG9vIGxhcmdlLCBVUkxGZXRjaCBvbmx5IHN1cHBvcnRzIgogICAgICAgICAgICAgICAgInJlc3BvbnNlcyB1cCB0byAzMm1iIGluIHNpemUuIiwgZSkKCiAgICAgICAgZXhjZXB0IHVybGZldGNoLlNTTENlcnRpZmljYXRlRXJyb3IgYXMgZToKICAgICAgICAgICAgcmFpc2UgU1NMRXJyb3IoZSkKCiAgICAgICAgZXhjZXB0IHVybGZldGNoLkludmFsaWRNZXRob2RFcnJvciBhcyBlOgogICAgICAgICAgICByYWlzZSBBcHBFbmdpbmVQbGF0Zm9ybUVycm9yKAogICAgICAgICAgICAgICAgIlVSTEZldGNoIGRvZXMgbm90IHN1cHBvcnQgbWV0aG9kOiAlcyIgJSBtZXRob2QsIGUpCgogICAgICAgIGh0dHBfcmVzcG9uc2UgPSBzZWxmLl91cmxmZXRjaF9yZXNwb25zZV90b19odHRwX3Jlc3BvbnNlKAogICAgICAgICAgICByZXNwb25zZSwgcmV0cmllcz1yZXRyaWVzLCAqKnJlc3BvbnNlX2t3KQoKICAgICAgICAjIEhhbmRsZSByZWRpcmVjdD8KICAgICAgICByZWRpcmVjdF9sb2NhdGlvbiA9IHJlZGlyZWN0IGFuZCBodHRwX3Jlc3BvbnNlLmdldF9yZWRpcmVjdF9sb2NhdGlvbigpCiAgICAgICAgaWYgcmVkaXJlY3RfbG9jYXRpb246CiAgICAgICAgICAgICMgQ2hlY2sgZm9yIHJlZGlyZWN0IHJlc3BvbnNlCiAgICAgICAgICAgIGlmIChzZWxmLnVybGZldGNoX3JldHJpZXMgYW5kIHJldHJpZXMucmFpc2Vfb25fcmVkaXJlY3QpOgogICAgICAgICAgICAgICAgcmFpc2UgTWF4UmV0cnlFcnJvcihzZWxmLCB1cmwsICJ0b28gbWFueSByZWRpcmVjdHMiKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaWYgaHR0cF9yZXNwb25zZS5zdGF0dXMgPT0gMzAzOgogICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICdHRVQnCgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHJldHJpZXMgPSByZXRyaWVzLmluY3JlbWVudChtZXRob2QsIHVybCwgcmVzcG9uc2U9aHR0cF9yZXNwb25zZSwgX3Bvb2w9c2VsZikKICAgICAgICAgICAgICAgIGV4Y2VwdCBNYXhSZXRyeUVycm9yOgogICAgICAgICAgICAgICAgICAgIGlmIHJldHJpZXMucmFpc2Vfb25fcmVkaXJlY3Q6CiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIE1heFJldHJ5RXJyb3Ioc2VsZiwgdXJsLCAidG9vIG1hbnkgcmVkaXJlY3RzIikKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaHR0cF9yZXNwb25zZQoKICAgICAgICAgICAgICAgIHJldHJpZXMuc2xlZXBfZm9yX3JldHJ5KGh0dHBfcmVzcG9uc2UpCiAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlJlZGlyZWN0aW5nICVzIC0+ICVzIiwgdXJsLCByZWRpcmVjdF9sb2NhdGlvbikKICAgICAgICAgICAgICAgIHJlZGlyZWN0X3VybCA9IHVybGpvaW4odXJsLCByZWRpcmVjdF9sb2NhdGlvbikKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnVybG9wZW4oCiAgICAgICAgICAgICAgICAgICAgbWV0aG9kLCByZWRpcmVjdF91cmwsIGJvZHksIGhlYWRlcnMsCiAgICAgICAgICAgICAgICAgICAgcmV0cmllcz1yZXRyaWVzLCByZWRpcmVjdD1yZWRpcmVjdCwKICAgICAgICAgICAgICAgICAgICB0aW1lb3V0PXRpbWVvdXQsICoqcmVzcG9uc2Vfa3cpCgogICAgICAgICMgQ2hlY2sgaWYgd2Ugc2hvdWxkIHJldHJ5IHRoZSBIVFRQIHJlc3BvbnNlLgogICAgICAgIGhhc19yZXRyeV9hZnRlciA9IGJvb2woaHR0cF9yZXNwb25zZS5nZXRoZWFkZXIoJ1JldHJ5LUFmdGVyJykpCiAgICAgICAgaWYgcmV0cmllcy5pc19yZXRyeShtZXRob2QsIGh0dHBfcmVzcG9uc2Uuc3RhdHVzLCBoYXNfcmV0cnlfYWZ0ZXIpOgogICAgICAgICAgICByZXRyaWVzID0gcmV0cmllcy5pbmNyZW1lbnQoCiAgICAgICAgICAgICAgICBtZXRob2QsIHVybCwgcmVzcG9uc2U9aHR0cF9yZXNwb25zZSwgX3Bvb2w9c2VsZikKICAgICAgICAgICAgbG9nLmRlYnVnKCJSZXRyeTogJXMiLCB1cmwpCiAgICAgICAgICAgIHJldHJpZXMuc2xlZXAoaHR0cF9yZXNwb25zZSkKICAgICAgICAgICAgcmV0dXJuIHNlbGYudXJsb3BlbigKICAgICAgICAgICAgICAgIG1ldGhvZCwgdXJsLAogICAgICAgICAgICAgICAgYm9keT1ib2R5LCBoZWFkZXJzPWhlYWRlcnMsCiAgICAgICAgICAgICAgICByZXRyaWVzPXJldHJpZXMsIHJlZGlyZWN0PXJlZGlyZWN0LAogICAgICAgICAgICAgICAgdGltZW91dD10aW1lb3V0LCAqKnJlc3BvbnNlX2t3KQoKICAgICAgICByZXR1cm4gaHR0cF9yZXNwb25zZQoKICAgIGRlZiBfdXJsZmV0Y2hfcmVzcG9uc2VfdG9faHR0cF9yZXNwb25zZShzZWxmLCB1cmxmZXRjaF9yZXNwLCAqKnJlc3BvbnNlX2t3KToKCiAgICAgICAgaWYgaXNfcHJvZF9hcHBlbmdpbmUoKToKICAgICAgICAgICAgIyBQcm9kdWN0aW9uIEdBRSBoYW5kbGVzIGRlZmxhdGUgZW5jb2RpbmcgYXV0b21hdGljYWxseSwgYnV0IGRvZXMKICAgICAgICAgICAgIyBub3QgcmVtb3ZlIHRoZSBlbmNvZGluZyBoZWFkZXIuCiAgICAgICAgICAgIGNvbnRlbnRfZW5jb2RpbmcgPSB1cmxmZXRjaF9yZXNwLmhlYWRlcnMuZ2V0KCdjb250ZW50LWVuY29kaW5nJykKCiAgICAgICAgICAgIGlmIGNvbnRlbnRfZW5jb2RpbmcgPT0gJ2RlZmxhdGUnOgogICAgICAgICAgICAgICAgZGVsIHVybGZldGNoX3Jlc3AuaGVhZGVyc1snY29udGVudC1lbmNvZGluZyddCgogICAgICAgIHRyYW5zZmVyX2VuY29kaW5nID0gdXJsZmV0Y2hfcmVzcC5oZWFkZXJzLmdldCgndHJhbnNmZXItZW5jb2RpbmcnKQogICAgICAgICMgV2UgaGF2ZSBhIGZ1bGwgcmVzcG9uc2UncyBjb250ZW50LAogICAgICAgICMgc28gbGV0J3MgbWFrZSBzdXJlIHdlIGRvbid0IHJlcG9ydCBvdXJzZWx2ZXMgYXMgY2h1bmtlZCBkYXRhLgogICAgICAgIGlmIHRyYW5zZmVyX2VuY29kaW5nID09ICdjaHVua2VkJzoKICAgICAgICAgICAgZW5jb2RpbmdzID0gdHJhbnNmZXJfZW5jb2Rpbmcuc3BsaXQoIiwiKQogICAgICAgICAgICBlbmNvZGluZ3MucmVtb3ZlKCdjaHVua2VkJykKICAgICAgICAgICAgdXJsZmV0Y2hfcmVzcC5oZWFkZXJzWyd0cmFuc2Zlci1lbmNvZGluZyddID0gJywnLmpvaW4oZW5jb2RpbmdzKQoKICAgICAgICByZXR1cm4gSFRUUFJlc3BvbnNlKAogICAgICAgICAgICAjIEluIG9yZGVyIGZvciBkZWNvZGluZyB0byB3b3JrLCB3ZSBtdXN0IHByZXNlbnQgdGhlIGNvbnRlbnQgYXMKICAgICAgICAgICAgIyBhIGZpbGUtbGlrZSBvYmplY3QuCiAgICAgICAgICAgIGJvZHk9Qnl0ZXNJTyh1cmxmZXRjaF9yZXNwLmNvbnRlbnQpLAogICAgICAgICAgICBoZWFkZXJzPXVybGZldGNoX3Jlc3AuaGVhZGVycywKICAgICAgICAgICAgc3RhdHVzPXVybGZldGNoX3Jlc3Auc3RhdHVzX2NvZGUsCiAgICAgICAgICAgICoqcmVzcG9uc2Vfa3cKICAgICAgICApCgogICAgZGVmIF9nZXRfYWJzb2x1dGVfdGltZW91dChzZWxmLCB0aW1lb3V0KToKICAgICAgICBpZiB0aW1lb3V0IGlzIFRpbWVvdXQuREVGQVVMVF9USU1FT1VUOgogICAgICAgICAgICByZXR1cm4gTm9uZSAgIyBEZWZlciB0byBVUkxGZXRjaCdzIGRlZmF1bHQuCiAgICAgICAgaWYgaXNpbnN0YW5jZSh0aW1lb3V0LCBUaW1lb3V0KToKICAgICAgICAgICAgaWYgdGltZW91dC5fcmVhZCBpcyBub3QgTm9uZSBvciB0aW1lb3V0Ll9jb25uZWN0IGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgICAgICAgICAiVVJMRmV0Y2ggZG9lcyBub3Qgc3VwcG9ydCBncmFudWxhciB0aW1lb3V0IHNldHRpbmdzLCAiCiAgICAgICAgICAgICAgICAgICAgInJldmVydGluZyB0byB0b3RhbCBvciBkZWZhdWx0IFVSTEZldGNoIHRpbWVvdXQuIiwKICAgICAgICAgICAgICAgICAgICBBcHBFbmdpbmVQbGF0Zm9ybVdhcm5pbmcpCiAgICAgICAgICAgIHJldHVybiB0aW1lb3V0LnRvdGFsCiAgICAgICAgcmV0dXJuIHRpbWVvdXQKCiAgICBkZWYgX2dldF9yZXRyaWVzKHNlbGYsIHJldHJpZXMsIHJlZGlyZWN0KToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShyZXRyaWVzLCBSZXRyeSk6CiAgICAgICAgICAgIHJldHJpZXMgPSBSZXRyeS5mcm9tX2ludCgKICAgICAgICAgICAgICAgIHJldHJpZXMsIHJlZGlyZWN0PXJlZGlyZWN0LCBkZWZhdWx0PXNlbGYucmV0cmllcykKCiAgICAgICAgaWYgcmV0cmllcy5jb25uZWN0IG9yIHJldHJpZXMucmVhZCBvciByZXRyaWVzLnJlZGlyZWN0OgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAgICAgIlVSTEZldGNoIG9ubHkgc3VwcG9ydHMgdG90YWwgcmV0cmllcyBhbmQgZG9lcyBub3QgIgogICAgICAgICAgICAgICAgInJlY29nbml6ZSBjb25uZWN0LCByZWFkLCBvciByZWRpcmVjdCByZXRyeSBwYXJhbWV0ZXJzLiIsCiAgICAgICAgICAgICAgICBBcHBFbmdpbmVQbGF0Zm9ybVdhcm5pbmcpCgogICAgICAgIHJldHVybiByZXRyaWVzCgoKZGVmIGlzX2FwcGVuZ2luZSgpOgogICAgcmV0dXJuIChpc19sb2NhbF9hcHBlbmdpbmUoKSBvcgogICAgICAgICAgICBpc19wcm9kX2FwcGVuZ2luZSgpIG9yCiAgICAgICAgICAgIGlzX3Byb2RfYXBwZW5naW5lX212bXMoKSkKCgpkZWYgaXNfYXBwZW5naW5lX3NhbmRib3goKToKICAgIHJldHVybiBpc19hcHBlbmdpbmUoKSBhbmQgbm90IGlzX3Byb2RfYXBwZW5naW5lX212bXMoKQoKCmRlZiBpc19sb2NhbF9hcHBlbmdpbmUoKToKICAgIHJldHVybiAoJ0FQUEVOR0lORV9SVU5USU1FJyBpbiBvcy5lbnZpcm9uIGFuZAogICAgICAgICAgICAnRGV2ZWxvcG1lbnQvJyBpbiBvcy5lbnZpcm9uWydTRVJWRVJfU09GVFdBUkUnXSkKCgpkZWYgaXNfcHJvZF9hcHBlbmdpbmUoKToKICAgIHJldHVybiAoJ0FQUEVOR0lORV9SVU5USU1FJyBpbiBvcy5lbnZpcm9uIGFuZAogICAgICAgICAgICAnR29vZ2xlIEFwcCBFbmdpbmUvJyBpbiBvcy5lbnZpcm9uWydTRVJWRVJfU09GVFdBUkUnXSBhbmQKICAgICAgICAgICAgbm90IGlzX3Byb2RfYXBwZW5naW5lX212bXMoKSkKCgpkZWYgaXNfcHJvZF9hcHBlbmdpbmVfbXZtcygpOgogICAgcmV0dXJuIG9zLmVudmlyb24uZ2V0KCdHQUVfVk0nLCBGYWxzZSkgPT0gJ3RydWUnClBLAwQUAAAAAAAAACEALqVxjX4RAAB+EQAANwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL2NvbnRyaWIvbnRsbXBvb2wucHkiIiIKTlRMTSBhdXRoZW50aWNhdGluZyBwb29sLCBjb250cmlidXRlZCBieSBlcmlrY2VkZXJzdHJhbgoKSXNzdWUgIzEwLCBzZWU6IGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC91cmxsaWIzL2lzc3Vlcy9kZXRhaWw/aWQ9MTAKIiIiCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0Cgpmcm9tIGxvZ2dpbmcgaW1wb3J0IGdldExvZ2dlcgpmcm9tIG50bG0gaW1wb3J0IG50bG0KCmZyb20gLi4gaW1wb3J0IEhUVFBTQ29ubmVjdGlvblBvb2wKZnJvbSAuLnBhY2thZ2VzLnNpeC5tb3Zlcy5odHRwX2NsaWVudCBpbXBvcnQgSFRUUFNDb25uZWN0aW9uCgoKbG9nID0gZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmNsYXNzIE5UTE1Db25uZWN0aW9uUG9vbChIVFRQU0Nvbm5lY3Rpb25Qb29sKToKICAgICIiIgogICAgSW1wbGVtZW50cyBhbiBOVExNIGF1dGhlbnRpY2F0aW9uIHZlcnNpb24gb2YgYW4gdXJsbGliMyBjb25uZWN0aW9uIHBvb2wKICAgICIiIgoKICAgIHNjaGVtZSA9ICdodHRwcycKCiAgICBkZWYgX19pbml0X18oc2VsZiwgdXNlciwgcHcsIGF1dGh1cmwsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgIiIiCiAgICAgICAgYXV0aHVybCBpcyBhIHJhbmRvbSBVUkwgb24gdGhlIHNlcnZlciB0aGF0IGlzIHByb3RlY3RlZCBieSBOVExNLgogICAgICAgIHVzZXIgaXMgdGhlIFdpbmRvd3MgdXNlciwgcHJvYmFibHkgaW4gdGhlIERPTUFJTlxcdXNlcm5hbWUgZm9ybWF0LgogICAgICAgIHB3IGlzIHRoZSBwYXNzd29yZCBmb3IgdGhlIHVzZXIuCiAgICAgICAgIiIiCiAgICAgICAgc3VwZXIoTlRMTUNvbm5lY3Rpb25Qb29sLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpCiAgICAgICAgc2VsZi5hdXRodXJsID0gYXV0aHVybAogICAgICAgIHNlbGYucmF3dXNlciA9IHVzZXIKICAgICAgICB1c2VyX3BhcnRzID0gdXNlci5zcGxpdCgnXFwnLCAxKQogICAgICAgIHNlbGYuZG9tYWluID0gdXNlcl9wYXJ0c1swXS51cHBlcigpCiAgICAgICAgc2VsZi51c2VyID0gdXNlcl9wYXJ0c1sxXQogICAgICAgIHNlbGYucHcgPSBwdwoKICAgIGRlZiBfbmV3X2Nvbm4oc2VsZik6CiAgICAgICAgIyBQZXJmb3JtcyB0aGUgTlRMTSBoYW5kc2hha2UgdGhhdCBzZWN1cmVzIHRoZSBjb25uZWN0aW9uLiBUaGUgc29ja2V0CiAgICAgICAgIyBtdXN0IGJlIGtlcHQgb3BlbiB3aGlsZSByZXF1ZXN0cyBhcmUgcGVyZm9ybWVkLgogICAgICAgIHNlbGYubnVtX2Nvbm5lY3Rpb25zICs9IDEKICAgICAgICBsb2cuZGVidWcoJ1N0YXJ0aW5nIE5UTE0gSFRUUFMgY29ubmVjdGlvbiBuby4gJWQ6IGh0dHBzOi8vJXMlcycsCiAgICAgICAgICAgICAgICAgIHNlbGYubnVtX2Nvbm5lY3Rpb25zLCBzZWxmLmhvc3QsIHNlbGYuYXV0aHVybCkKCiAgICAgICAgaGVhZGVycyA9IHt9CiAgICAgICAgaGVhZGVyc1snQ29ubmVjdGlvbiddID0gJ0tlZXAtQWxpdmUnCiAgICAgICAgcmVxX2hlYWRlciA9ICdBdXRob3JpemF0aW9uJwogICAgICAgIHJlc3BfaGVhZGVyID0gJ3d3dy1hdXRoZW50aWNhdGUnCgogICAgICAgIGNvbm4gPSBIVFRQU0Nvbm5lY3Rpb24oaG9zdD1zZWxmLmhvc3QsIHBvcnQ9c2VsZi5wb3J0KQoKICAgICAgICAjIFNlbmQgbmVnb3RpYXRpb24gbWVzc2FnZQogICAgICAgIGhlYWRlcnNbcmVxX2hlYWRlcl0gPSAoCiAgICAgICAgICAgICdOVExNICVzJyAlIG50bG0uY3JlYXRlX05UTE1fTkVHT1RJQVRFX01FU1NBR0Uoc2VsZi5yYXd1c2VyKSkKICAgICAgICBsb2cuZGVidWcoJ1JlcXVlc3QgaGVhZGVyczogJXMnLCBoZWFkZXJzKQogICAgICAgIGNvbm4ucmVxdWVzdCgnR0VUJywgc2VsZi5hdXRodXJsLCBOb25lLCBoZWFkZXJzKQogICAgICAgIHJlcyA9IGNvbm4uZ2V0cmVzcG9uc2UoKQogICAgICAgIHJlc2hkciA9IGRpY3QocmVzLmdldGhlYWRlcnMoKSkKICAgICAgICBsb2cuZGVidWcoJ1Jlc3BvbnNlIHN0YXR1czogJXMgJXMnLCByZXMuc3RhdHVzLCByZXMucmVhc29uKQogICAgICAgIGxvZy5kZWJ1ZygnUmVzcG9uc2UgaGVhZGVyczogJXMnLCByZXNoZHIpCiAgICAgICAgbG9nLmRlYnVnKCdSZXNwb25zZSBkYXRhOiAlcyBbLi4uXScsIHJlcy5yZWFkKDEwMCkpCgogICAgICAgICMgUmVtb3ZlIHRoZSByZWZlcmVuY2UgdG8gdGhlIHNvY2tldCwgc28gdGhhdCBpdCBjYW4gbm90IGJlIGNsb3NlZCBieQogICAgICAgICMgdGhlIHJlc3BvbnNlIG9iamVjdCAod2Ugd2FudCB0byBrZWVwIHRoZSBzb2NrZXQgb3BlbikKICAgICAgICByZXMuZnAgPSBOb25lCgogICAgICAgICMgU2VydmVyIHNob3VsZCByZXNwb25kIHdpdGggYSBjaGFsbGVuZ2UgbWVzc2FnZQogICAgICAgIGF1dGhfaGVhZGVyX3ZhbHVlcyA9IHJlc2hkcltyZXNwX2hlYWRlcl0uc3BsaXQoJywgJykKICAgICAgICBhdXRoX2hlYWRlcl92YWx1ZSA9IE5vbmUKICAgICAgICBmb3IgcyBpbiBhdXRoX2hlYWRlcl92YWx1ZXM6CiAgICAgICAgICAgIGlmIHNbOjVdID09ICdOVExNICc6CiAgICAgICAgICAgICAgICBhdXRoX2hlYWRlcl92YWx1ZSA9IHNbNTpdCiAgICAgICAgaWYgYXV0aF9oZWFkZXJfdmFsdWUgaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCdVbmV4cGVjdGVkICVzIHJlc3BvbnNlIGhlYWRlcjogJXMnICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXNwX2hlYWRlciwgcmVzaGRyW3Jlc3BfaGVhZGVyXSkpCgogICAgICAgICMgU2VuZCBhdXRoZW50aWNhdGlvbiBtZXNzYWdlCiAgICAgICAgU2VydmVyQ2hhbGxlbmdlLCBOZWdvdGlhdGVGbGFncyA9IFwKICAgICAgICAgICAgbnRsbS5wYXJzZV9OVExNX0NIQUxMRU5HRV9NRVNTQUdFKGF1dGhfaGVhZGVyX3ZhbHVlKQogICAgICAgIGF1dGhfbXNnID0gbnRsbS5jcmVhdGVfTlRMTV9BVVRIRU5USUNBVEVfTUVTU0FHRShTZXJ2ZXJDaGFsbGVuZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudXNlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kb21haW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucHcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5lZ290aWF0ZUZsYWdzKQogICAgICAgIGhlYWRlcnNbcmVxX2hlYWRlcl0gPSAnTlRMTSAlcycgJSBhdXRoX21zZwogICAgICAgIGxvZy5kZWJ1ZygnUmVxdWVzdCBoZWFkZXJzOiAlcycsIGhlYWRlcnMpCiAgICAgICAgY29ubi5yZXF1ZXN0KCdHRVQnLCBzZWxmLmF1dGh1cmwsIE5vbmUsIGhlYWRlcnMpCiAgICAgICAgcmVzID0gY29ubi5nZXRyZXNwb25zZSgpCiAgICAgICAgbG9nLmRlYnVnKCdSZXNwb25zZSBzdGF0dXM6ICVzICVzJywgcmVzLnN0YXR1cywgcmVzLnJlYXNvbikKICAgICAgICBsb2cuZGVidWcoJ1Jlc3BvbnNlIGhlYWRlcnM6ICVzJywgZGljdChyZXMuZ2V0aGVhZGVycygpKSkKICAgICAgICBsb2cuZGVidWcoJ1Jlc3BvbnNlIGRhdGE6ICVzIFsuLi5dJywgcmVzLnJlYWQoKVs6MTAwXSkKICAgICAgICBpZiByZXMuc3RhdHVzICE9IDIwMDoKICAgICAgICAgICAgaWYgcmVzLnN0YXR1cyA9PSA0MDE6CiAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oJ1NlcnZlciByZWplY3RlZCByZXF1ZXN0OiB3cm9uZyAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZXJuYW1lIG9yIHBhc3N3b3JkJykKICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCdXcm9uZyBzZXJ2ZXIgcmVzcG9uc2U6ICVzICVzJyAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVzLnN0YXR1cywgcmVzLnJlYXNvbikpCgogICAgICAgIHJlcy5mcCA9IE5vbmUKICAgICAgICBsb2cuZGVidWcoJ0Nvbm5lY3Rpb24gZXN0YWJsaXNoZWQnKQogICAgICAgIHJldHVybiBjb25uCgogICAgZGVmIHVybG9wZW4oc2VsZiwgbWV0aG9kLCB1cmwsIGJvZHk9Tm9uZSwgaGVhZGVycz1Ob25lLCByZXRyaWVzPTMsCiAgICAgICAgICAgICAgICByZWRpcmVjdD1UcnVlLCBhc3NlcnRfc2FtZV9ob3N0PVRydWUpOgogICAgICAgIGlmIGhlYWRlcnMgaXMgTm9uZToKICAgICAgICAgICAgaGVhZGVycyA9IHt9CiAgICAgICAgaGVhZGVyc1snQ29ubmVjdGlvbiddID0gJ0tlZXAtQWxpdmUnCiAgICAgICAgcmV0dXJuIHN1cGVyKE5UTE1Db25uZWN0aW9uUG9vbCwgc2VsZikudXJsb3BlbihtZXRob2QsIHVybCwgYm9keSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnMsIHJldHJpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydF9zYW1lX2hvc3QpClBLAwQUAAAAAAAAACEA8yq2cfo7AAD6OwAAOAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL2NvbnRyaWIvcHlvcGVuc3NsLnB5IiIiClNTTCB3aXRoIFNOSV8tc3VwcG9ydCBmb3IgUHl0aG9uIDIuIEZvbGxvdyB0aGVzZSBpbnN0cnVjdGlvbnMgaWYgeW91IHdvdWxkCmxpa2UgdG8gdmVyaWZ5IFNTTCBjZXJ0aWZpY2F0ZXMgaW4gUHl0aG9uIDIuIE5vdGUsIHRoZSBkZWZhdWx0IGxpYnJhcmllcyBkbwoqbm90KiBkbyBjZXJ0aWZpY2F0ZSBjaGVja2luZzsgeW91IG5lZWQgdG8gZG8gYWRkaXRpb25hbCB3b3JrIHRvIHZhbGlkYXRlCmNlcnRpZmljYXRlcyB5b3Vyc2VsZi4KClRoaXMgbmVlZHMgdGhlIGZvbGxvd2luZyBwYWNrYWdlcyBpbnN0YWxsZWQ6CgoqIHB5T3BlblNTTCAodGVzdGVkIHdpdGggMTYuMC4wKQoqIGNyeXB0b2dyYXBoeSAobWluaW11bSAxLjMuNCwgZnJvbSBweW9wZW5zc2wpCiogaWRuYSAobWluaW11bSAyLjAsIGZyb20gY3J5cHRvZ3JhcGh5KQoKSG93ZXZlciwgcHlvcGVuc3NsIGRlcGVuZHMgb24gY3J5cHRvZ3JhcGh5LCB3aGljaCBkZXBlbmRzIG9uIGlkbmEsIHNvIHdoaWxlIHdlCnVzZSBhbGwgdGhyZWUgZGlyZWN0bHkgaGVyZSB3ZSBlbmQgdXAgaGF2aW5nIHJlbGF0aXZlbHkgZmV3IHBhY2thZ2VzIHJlcXVpcmVkLgoKWW91IGNhbiBpbnN0YWxsIHRoZW0gd2l0aCB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6CgogICAgcGlwIGluc3RhbGwgcHlvcGVuc3NsIGNyeXB0b2dyYXBoeSBpZG5hCgpUbyBhY3RpdmF0ZSBjZXJ0aWZpY2F0ZSBjaGVja2luZywgY2FsbAo6ZnVuYzpgfnVybGxpYjMuY29udHJpYi5weW9wZW5zc2wuaW5qZWN0X2ludG9fdXJsbGliM2AgZnJvbSB5b3VyIFB5dGhvbiBjb2RlCmJlZm9yZSB5b3UgYmVnaW4gbWFraW5nIEhUVFAgcmVxdWVzdHMuIFRoaXMgY2FuIGJlIGRvbmUgaW4gYSBgYHNpdGVjdXN0b21pemVgYAptb2R1bGUsIG9yIGF0IGFueSBvdGhlciB0aW1lIGJlZm9yZSB5b3VyIGFwcGxpY2F0aW9uIGJlZ2lucyB1c2luZyBgYHVybGxpYjNgYCwKbGlrZSB0aGlzOjoKCiAgICB0cnk6CiAgICAgICAgaW1wb3J0IHVybGxpYjMuY29udHJpYi5weW9wZW5zc2wKICAgICAgICB1cmxsaWIzLmNvbnRyaWIucHlvcGVuc3NsLmluamVjdF9pbnRvX3VybGxpYjMoKQogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIHBhc3MKCk5vdyB5b3UgY2FuIHVzZSA6bW9kOmB1cmxsaWIzYCBhcyB5b3Ugbm9ybWFsbHkgd291bGQsIGFuZCBpdCB3aWxsIHN1cHBvcnQgU05JCndoZW4gdGhlIHJlcXVpcmVkIG1vZHVsZXMgYXJlIGluc3RhbGxlZC4KCkFjdGl2YXRpbmcgdGhpcyBtb2R1bGUgYWxzbyBoYXMgdGhlIHBvc2l0aXZlIHNpZGUgZWZmZWN0IG9mIGRpc2FibGluZyBTU0wvVExTCmNvbXByZXNzaW9uIGluIFB5dGhvbiAyIChzZWUgYENSSU1FIGF0dGFja2BfKS4KCklmIHlvdSB3YW50IHRvIGNvbmZpZ3VyZSB0aGUgZGVmYXVsdCBsaXN0IG9mIHN1cHBvcnRlZCBjaXBoZXIgc3VpdGVzLCB5b3UgY2FuCnNldCB0aGUgYGB1cmxsaWIzLmNvbnRyaWIucHlvcGVuc3NsLkRFRkFVTFRfU1NMX0NJUEhFUl9MSVNUYGAgdmFyaWFibGUuCgouLiBfc25pOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TZXJ2ZXJfTmFtZV9JbmRpY2F0aW9uCi4uIF9jcmltZSBhdHRhY2s6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NSSU1FXyhzZWN1cml0eV9leHBsb2l0KQoiIiIKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBPcGVuU1NMLlNTTApmcm9tIGNyeXB0b2dyYXBoeSBpbXBvcnQgeDUwOQpmcm9tIGNyeXB0b2dyYXBoeS5oYXptYXQuYmFja2VuZHMub3BlbnNzbCBpbXBvcnQgYmFja2VuZCBhcyBvcGVuc3NsX2JhY2tlbmQKZnJvbSBjcnlwdG9ncmFwaHkuaGF6bWF0LmJhY2tlbmRzLm9wZW5zc2wueDUwOSBpbXBvcnQgX0NlcnRpZmljYXRlCgpmcm9tIHNvY2tldCBpbXBvcnQgdGltZW91dCwgZXJyb3IgYXMgU29ja2V0RXJyb3IKZnJvbSBpbyBpbXBvcnQgQnl0ZXNJTwoKdHJ5OiAgIyBQbGF0Zm9ybS1zcGVjaWZpYzogUHl0aG9uIDIKICAgIGZyb20gc29ja2V0IGltcG9ydCBfZmlsZW9iamVjdApleGNlcHQgSW1wb3J0RXJyb3I6ICAjIFBsYXRmb3JtLXNwZWNpZmljOiBQeXRob24gMwogICAgX2ZpbGVvYmplY3QgPSBOb25lCiAgICBmcm9tIC4ucGFja2FnZXMuYmFja3BvcnRzLm1ha2VmaWxlIGltcG9ydCBiYWNrcG9ydF9tYWtlZmlsZQoKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IHNzbApmcm9tIC4ucGFja2FnZXMgaW1wb3J0IHNpeAppbXBvcnQgc3lzCgpmcm9tIC4uIGltcG9ydCB1dGlsCgpfX2FsbF9fID0gWydpbmplY3RfaW50b191cmxsaWIzJywgJ2V4dHJhY3RfZnJvbV91cmxsaWIzJ10KCiMgU05JIGFsd2F5cyB3b3Jrcy4KSEFTX1NOSSA9IFRydWUKCiMgTWFwIGZyb20gdXJsbGliMyB0byBQeU9wZW5TU0wgY29tcGF0aWJsZSBwYXJhbWV0ZXItdmFsdWVzLgpfb3BlbnNzbF92ZXJzaW9ucyA9IHsKICAgIHNzbC5QUk9UT0NPTF9TU0x2MjM6IE9wZW5TU0wuU1NMLlNTTHYyM19NRVRIT0QsCiAgICBzc2wuUFJPVE9DT0xfVExTdjE6IE9wZW5TU0wuU1NMLlRMU3YxX01FVEhPRCwKfQoKaWYgaGFzYXR0cihzc2wsICdQUk9UT0NPTF9UTFN2MV8xJykgYW5kIGhhc2F0dHIoT3BlblNTTC5TU0wsICdUTFN2MV8xX01FVEhPRCcpOgogICAgX29wZW5zc2xfdmVyc2lvbnNbc3NsLlBST1RPQ09MX1RMU3YxXzFdID0gT3BlblNTTC5TU0wuVExTdjFfMV9NRVRIT0QKCmlmIGhhc2F0dHIoc3NsLCAnUFJPVE9DT0xfVExTdjFfMicpIGFuZCBoYXNhdHRyKE9wZW5TU0wuU1NMLCAnVExTdjFfMl9NRVRIT0QnKToKICAgIF9vcGVuc3NsX3ZlcnNpb25zW3NzbC5QUk9UT0NPTF9UTFN2MV8yXSA9IE9wZW5TU0wuU1NMLlRMU3YxXzJfTUVUSE9ECgp0cnk6CiAgICBfb3BlbnNzbF92ZXJzaW9ucy51cGRhdGUoe3NzbC5QUk9UT0NPTF9TU0x2MzogT3BlblNTTC5TU0wuU1NMdjNfTUVUSE9EfSkKZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgcGFzcwoKX3N0ZGxpYl90b19vcGVuc3NsX3ZlcmlmeSA9IHsKICAgIHNzbC5DRVJUX05PTkU6IE9wZW5TU0wuU1NMLlZFUklGWV9OT05FLAogICAgc3NsLkNFUlRfT1BUSU9OQUw6IE9wZW5TU0wuU1NMLlZFUklGWV9QRUVSLAogICAgc3NsLkNFUlRfUkVRVUlSRUQ6CiAgICAgICAgT3BlblNTTC5TU0wuVkVSSUZZX1BFRVIgKyBPcGVuU1NMLlNTTC5WRVJJRllfRkFJTF9JRl9OT19QRUVSX0NFUlQsCn0KX29wZW5zc2xfdG9fc3RkbGliX3ZlcmlmeSA9IGRpY3QoCiAgICAodiwgaykgZm9yIGssIHYgaW4gX3N0ZGxpYl90b19vcGVuc3NsX3ZlcmlmeS5pdGVtcygpCikKCiMgT3BlblNTTCB3aWxsIG9ubHkgd3JpdGUgMTZLIGF0IGEgdGltZQpTU0xfV1JJVEVfQkxPQ0tTSVpFID0gMTYzODQKCm9yaWdfdXRpbF9IQVNfU05JID0gdXRpbC5IQVNfU05JCm9yaWdfdXRpbF9TU0xDb250ZXh0ID0gdXRpbC5zc2xfLlNTTENvbnRleHQKCgpsb2cgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgpkZWYgaW5qZWN0X2ludG9fdXJsbGliMygpOgogICAgJ01vbmtleS1wYXRjaCB1cmxsaWIzIHdpdGggUHlPcGVuU1NMLWJhY2tlZCBTU0wtc3VwcG9ydC4nCgogICAgX3ZhbGlkYXRlX2RlcGVuZGVuY2llc19tZXQoKQoKICAgIHV0aWwuc3NsXy5TU0xDb250ZXh0ID0gUHlPcGVuU1NMQ29udGV4dAogICAgdXRpbC5IQVNfU05JID0gSEFTX1NOSQogICAgdXRpbC5zc2xfLkhBU19TTkkgPSBIQVNfU05JCiAgICB1dGlsLklTX1BZT1BFTlNTTCA9IFRydWUKICAgIHV0aWwuc3NsXy5JU19QWU9QRU5TU0wgPSBUcnVlCgoKZGVmIGV4dHJhY3RfZnJvbV91cmxsaWIzKCk6CiAgICAnVW5kbyBtb25rZXktcGF0Y2hpbmcgYnkgOmZ1bmM6YGluamVjdF9pbnRvX3VybGxpYjNgLicKCiAgICB1dGlsLnNzbF8uU1NMQ29udGV4dCA9IG9yaWdfdXRpbF9TU0xDb250ZXh0CiAgICB1dGlsLkhBU19TTkkgPSBvcmlnX3V0aWxfSEFTX1NOSQogICAgdXRpbC5zc2xfLkhBU19TTkkgPSBvcmlnX3V0aWxfSEFTX1NOSQogICAgdXRpbC5JU19QWU9QRU5TU0wgPSBGYWxzZQogICAgdXRpbC5zc2xfLklTX1BZT1BFTlNTTCA9IEZhbHNlCgoKZGVmIF92YWxpZGF0ZV9kZXBlbmRlbmNpZXNfbWV0KCk6CiAgICAiIiIKICAgIFZlcmlmaWVzIHRoYXQgUHlPcGVuU1NMJ3MgcGFja2FnZS1sZXZlbCBkZXBlbmRlbmNpZXMgaGF2ZSBiZWVuIG1ldC4KICAgIFRocm93cyBgSW1wb3J0RXJyb3JgIGlmIHRoZXkgYXJlIG5vdCBtZXQuCiAgICAiIiIKICAgICMgTWV0aG9kIGFkZGVkIGluIGBjcnlwdG9ncmFwaHk9PTEuMWA7IG5vdCBhdmFpbGFibGUgaW4gb2xkZXIgdmVyc2lvbnMKICAgIGZyb20gY3J5cHRvZ3JhcGh5Lng1MDkuZXh0ZW5zaW9ucyBpbXBvcnQgRXh0ZW5zaW9ucwogICAgaWYgZ2V0YXR0cihFeHRlbnNpb25zLCAiZ2V0X2V4dGVuc2lvbl9mb3JfY2xhc3MiLCBOb25lKSBpcyBOb25lOgogICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCInY3J5cHRvZ3JhcGh5JyBtb2R1bGUgbWlzc2luZyByZXF1aXJlZCBmdW5jdGlvbmFsaXR5LiAgIgogICAgICAgICAgICAgICAgICAgICAgICAgICJUcnkgdXBncmFkaW5nIHRvIHYxLjMuNCBvciBuZXdlci4iKQoKICAgICMgcHlPcGVuU1NMIDAuMTQgYW5kIGFib3ZlIHVzZSBjcnlwdG9ncmFwaHkgZm9yIE9wZW5TU0wgYmluZGluZ3MuIFRoZSBfeDUwOQogICAgIyBhdHRyaWJ1dGUgaXMgb25seSBwcmVzZW50IG9uIHRob3NlIHZlcnNpb25zLgogICAgZnJvbSBPcGVuU1NMLmNyeXB0byBpbXBvcnQgWDUwOQogICAgeDUwOSA9IFg1MDkoKQogICAgaWYgZ2V0YXR0cih4NTA5LCAiX3g1MDkiLCBOb25lKSBpcyBOb25lOgogICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCIncHlPcGVuU1NMJyBtb2R1bGUgbWlzc2luZyByZXF1aXJlZCBmdW5jdGlvbmFsaXR5LiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgIlRyeSB1cGdyYWRpbmcgdG8gdjAuMTQgb3IgbmV3ZXIuIikKCgpkZWYgX2Ruc25hbWVfdG9fc3RkbGliKG5hbWUpOgogICAgIiIiCiAgICBDb252ZXJ0cyBhIGROU05hbWUgU3ViamVjdEFsdGVybmF0aXZlTmFtZSBmaWVsZCB0byB0aGUgZm9ybSB1c2VkIGJ5IHRoZQogICAgc3RhbmRhcmQgbGlicmFyeSBvbiB0aGUgZ2l2ZW4gUHl0aG9uIHZlcnNpb24uCgogICAgQ3J5cHRvZ3JhcGh5IHByb2R1Y2VzIGEgZE5TTmFtZSBhcyBhIHVuaWNvZGUgc3RyaW5nIHRoYXQgd2FzIGlkbmEtZGVjb2RlZAogICAgZnJvbSBBU0NJSSBieXRlcy4gV2UgbmVlZCB0byBpZG5hLWVuY29kZSB0aGF0IHN0cmluZyB0byBnZXQgaXQgYmFjaywgYW5kCiAgICB0aGVuIG9uIFB5dGhvbiAzIHdlIGFsc28gbmVlZCB0byBjb252ZXJ0IHRvIHVuaWNvZGUgdmlhIFVURi04ICh0aGUgc3RkbGliCiAgICB1c2VzIFB5VW5pY29kZV9Gcm9tU3RyaW5nQW5kU2l6ZSBvbiBpdCwgd2hpY2ggZGVjb2RlcyB2aWEgVVRGLTgpLgogICAgIiIiCiAgICBkZWYgaWRuYV9lbmNvZGUobmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgQm9ycm93ZWQgd2hvbGVzYWxlIGZyb20gdGhlIFB5dGhvbiBDcnlwdG9ncmFwaHkgUHJvamVjdC4gSXQgdHVybnMgb3V0CiAgICAgICAgdGhhdCB3ZSBjYW4ndCBqdXN0IHNhZmVseSBjYWxsIGBpZG5hLmVuY29kZWA6IGl0IGNhbiBleHBsb2RlIGZvcgogICAgICAgIHdpbGRjYXJkIG5hbWVzLiBUaGlzIGF2b2lkcyB0aGF0IHByb2JsZW0uCiAgICAgICAgIiIiCiAgICAgICAgaW1wb3J0IGlkbmEKCiAgICAgICAgZm9yIHByZWZpeCBpbiBbdScqLicsIHUnLiddOgogICAgICAgICAgICBpZiBuYW1lLnN0YXJ0c3dpdGgocHJlZml4KToKICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lW2xlbihwcmVmaXgpOl0KICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXguZW5jb2RlKCdhc2NpaScpICsgaWRuYS5lbmNvZGUobmFtZSkKICAgICAgICByZXR1cm4gaWRuYS5lbmNvZGUobmFtZSkKCiAgICBuYW1lID0gaWRuYV9lbmNvZGUobmFtZSkKICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPj0gKDMsIDApOgogICAgICAgIG5hbWUgPSBuYW1lLmRlY29kZSgndXRmLTgnKQogICAgcmV0dXJuIG5hbWUKCgpkZWYgZ2V0X3N1YmpfYWx0X25hbWUocGVlcl9jZXJ0KToKICAgICIiIgogICAgR2l2ZW4gYW4gUHlPcGVuU1NMIGNlcnRpZmljYXRlLCBwcm92aWRlcyBhbGwgdGhlIHN1YmplY3QgYWx0ZXJuYXRpdmUgbmFtZXMuCiAgICAiIiIKICAgICMgUGFzcyB0aGUgY2VydCB0byBjcnlwdG9ncmFwaHksIHdoaWNoIGhhcyBtdWNoIGJldHRlciBBUElzIGZvciB0aGlzLgogICAgaWYgaGFzYXR0cihwZWVyX2NlcnQsICJ0b19jcnlwdG9ncmFwaHkiKToKICAgICAgICBjZXJ0ID0gcGVlcl9jZXJ0LnRvX2NyeXB0b2dyYXBoeSgpCiAgICBlbHNlOgogICAgICAgICMgVGhpcyBpcyB0ZWNobmljYWxseSB1c2luZyBwcml2YXRlIEFQSXMsIGJ1dCBzaG91bGQgd29yayBhY3Jvc3MgYWxsCiAgICAgICAgIyByZWxldmFudCB2ZXJzaW9ucyBiZWZvcmUgUHlPcGVuU1NMIGdvdCBhIHByb3BlciBBUEkgZm9yIHRoaXMuCiAgICAgICAgY2VydCA9IF9DZXJ0aWZpY2F0ZShvcGVuc3NsX2JhY2tlbmQsIHBlZXJfY2VydC5feDUwOSkKCiAgICAjIFdlIHdhbnQgdG8gZmluZCB0aGUgU0FOIGV4dGVuc2lvbi4gQXNrIENyeXB0b2dyYXBoeSB0byBsb2NhdGUgaXQgKGl0J3MKICAgICMgZmFzdGVyIHRoYW4gbG9vcGluZyBpbiBQeXRob24pCiAgICB0cnk6CiAgICAgICAgZXh0ID0gY2VydC5leHRlbnNpb25zLmdldF9leHRlbnNpb25fZm9yX2NsYXNzKAogICAgICAgICAgICB4NTA5LlN1YmplY3RBbHRlcm5hdGl2ZU5hbWUKICAgICAgICApLnZhbHVlCiAgICBleGNlcHQgeDUwOS5FeHRlbnNpb25Ob3RGb3VuZDoKICAgICAgICAjIE5vIHN1Y2ggZXh0ZW5zaW9uLCByZXR1cm4gdGhlIGVtcHR5IGxpc3QuCiAgICAgICAgcmV0dXJuIFtdCiAgICBleGNlcHQgKHg1MDkuRHVwbGljYXRlRXh0ZW5zaW9uLCB4NTA5LlVuc3VwcG9ydGVkRXh0ZW5zaW9uLAogICAgICAgICAgICB4NTA5LlVuc3VwcG9ydGVkR2VuZXJhbE5hbWVUeXBlLCBVbmljb2RlRXJyb3IpIGFzIGU6CiAgICAgICAgIyBBIHByb2JsZW0gaGFzIGJlZW4gZm91bmQgd2l0aCB0aGUgcXVhbGl0eSBvZiB0aGUgY2VydGlmaWNhdGUuIEFzc3VtZQogICAgICAgICMgbm8gU0FOIGZpZWxkIGlzIHByZXNlbnQuCiAgICAgICAgbG9nLndhcm5pbmcoCiAgICAgICAgICAgICJBIHByb2JsZW0gd2FzIGVuY291bnRlcmVkIHdpdGggdGhlIGNlcnRpZmljYXRlIHRoYXQgcHJldmVudGVkICIKICAgICAgICAgICAgInVybGxpYjMgZnJvbSBmaW5kaW5nIHRoZSBTdWJqZWN0QWx0ZXJuYXRpdmVOYW1lIGZpZWxkLiBUaGlzIGNhbiAiCiAgICAgICAgICAgICJhZmZlY3QgY2VydGlmaWNhdGUgdmFsaWRhdGlvbi4gVGhlIGVycm9yIHdhcyAlcyIsCiAgICAgICAgICAgIGUsCiAgICAgICAgKQogICAgICAgIHJldHVybiBbXQoKICAgICMgV2Ugd2FudCB0byByZXR1cm4gZE5TTmFtZSBhbmQgaVBBZGRyZXNzIGZpZWxkcy4gV2UgbmVlZCB0byBjYXN0IHRoZSBJUHMKICAgICMgYmFjayB0byBzdHJpbmdzIGJlY2F1c2UgdGhlIG1hdGNoX2hvc3RuYW1lIGZ1bmN0aW9uIHdhbnRzIHRoZW0gYXMKICAgICMgc3RyaW5ncy4KICAgICMgU2FkbHkgdGhlIEROUyBuYW1lcyBuZWVkIHRvIGJlIGlkbmEgZW5jb2RlZCBhbmQgdGhlbiwgb24gUHl0aG9uIDMsIFVURi04CiAgICAjIGRlY29kZWQuIFRoaXMgaXMgcHJldHR5IGZydXN0cmF0aW5nLCBidXQgdGhhdCdzIHdoYXQgdGhlIHN0YW5kYXJkIGxpYnJhcnkKICAgICMgZG9lcyB3aXRoIGNlcnRpZmljYXRlcywgYW5kIHNvIHdlIG5lZWQgdG8gYXR0ZW1wdCB0byBkbyB0aGUgc2FtZS4KICAgIG5hbWVzID0gWwogICAgICAgICgnRE5TJywgX2Ruc25hbWVfdG9fc3RkbGliKG5hbWUpKQogICAgICAgIGZvciBuYW1lIGluIGV4dC5nZXRfdmFsdWVzX2Zvcl90eXBlKHg1MDkuRE5TTmFtZSkKICAgIF0KICAgIG5hbWVzLmV4dGVuZCgKICAgICAgICAoJ0lQIEFkZHJlc3MnLCBzdHIobmFtZSkpCiAgICAgICAgZm9yIG5hbWUgaW4gZXh0LmdldF92YWx1ZXNfZm9yX3R5cGUoeDUwOS5JUEFkZHJlc3MpCiAgICApCgogICAgcmV0dXJuIG5hbWVzCgoKY2xhc3MgV3JhcHBlZFNvY2tldChvYmplY3QpOgogICAgJycnQVBJLWNvbXBhdGliaWxpdHkgd3JhcHBlciBmb3IgUHl0aG9uIE9wZW5TU0wncyBDb25uZWN0aW9uLWNsYXNzLgoKICAgIE5vdGU6IF9tYWtlZmlsZV9yZWZzLCBfZHJvcCgpIGFuZCBfcmV1c2UoKSBhcmUgbmVlZGVkIGZvciB0aGUgZ2FyYmFnZQogICAgY29sbGVjdG9yIG9mIHB5cHkuCiAgICAnJycKCiAgICBkZWYgX19pbml0X18oc2VsZiwgY29ubmVjdGlvbiwgc29ja2V0LCBzdXBwcmVzc19yYWdnZWRfZW9mcz1UcnVlKToKICAgICAgICBzZWxmLmNvbm5lY3Rpb24gPSBjb25uZWN0aW9uCiAgICAgICAgc2VsZi5zb2NrZXQgPSBzb2NrZXQKICAgICAgICBzZWxmLnN1cHByZXNzX3JhZ2dlZF9lb2ZzID0gc3VwcHJlc3NfcmFnZ2VkX2VvZnMKICAgICAgICBzZWxmLl9tYWtlZmlsZV9yZWZzID0gMAogICAgICAgIHNlbGYuX2Nsb3NlZCA9IEZhbHNlCgogICAgZGVmIGZpbGVubyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5zb2NrZXQuZmlsZW5vKCkKCiAgICAjIENvcHktcGFzdGVkIGZyb20gUHl0aG9uIDMuNSBzb3VyY2UgY29kZQogICAgZGVmIF9kZWNyZWZfc29ja2V0aW9zKHNlbGYpOgogICAgICAgIGlmIHNlbGYuX21ha2VmaWxlX3JlZnMgPiAwOgogICAgICAgICAgICBzZWxmLl9tYWtlZmlsZV9yZWZzIC09IDEKICAgICAgICBpZiBzZWxmLl9jbG9zZWQ6CiAgICAgICAgICAgIHNlbGYuY2xvc2UoKQoKICAgIGRlZiByZWN2KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBkYXRhID0gc2VsZi5jb25uZWN0aW9uLnJlY3YoKmFyZ3MsICoqa3dhcmdzKQogICAgICAgIGV4Y2VwdCBPcGVuU1NMLlNTTC5TeXNDYWxsRXJyb3IgYXMgZToKICAgICAgICAgICAgaWYgc2VsZi5zdXBwcmVzc19yYWdnZWRfZW9mcyBhbmQgZS5hcmdzID09ICgtMSwgJ1VuZXhwZWN0ZWQgRU9GJyk6CiAgICAgICAgICAgICAgICByZXR1cm4gYicnCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByYWlzZSBTb2NrZXRFcnJvcihzdHIoZSkpCiAgICAgICAgZXhjZXB0IE9wZW5TU0wuU1NMLlplcm9SZXR1cm5FcnJvciBhcyBlOgogICAgICAgICAgICBpZiBzZWxmLmNvbm5lY3Rpb24uZ2V0X3NodXRkb3duKCkgPT0gT3BlblNTTC5TU0wuUkVDRUlWRURfU0hVVERPV046CiAgICAgICAgICAgICAgICByZXR1cm4gYicnCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByYWlzZQogICAgICAgIGV4Y2VwdCBPcGVuU1NMLlNTTC5XYW50UmVhZEVycm9yOgogICAgICAgICAgICByZCA9IHV0aWwud2FpdF9mb3JfcmVhZChzZWxmLnNvY2tldCwgc2VsZi5zb2NrZXQuZ2V0dGltZW91dCgpKQogICAgICAgICAgICBpZiBub3QgcmQ6CiAgICAgICAgICAgICAgICByYWlzZSB0aW1lb3V0KCdUaGUgcmVhZCBvcGVyYXRpb24gdGltZWQgb3V0JykKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJlY3YoKmFyZ3MsICoqa3dhcmdzKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBkYXRhCgogICAgZGVmIHJlY3ZfaW50byhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29ubmVjdGlvbi5yZWN2X2ludG8oKmFyZ3MsICoqa3dhcmdzKQogICAgICAgIGV4Y2VwdCBPcGVuU1NMLlNTTC5TeXNDYWxsRXJyb3IgYXMgZToKICAgICAgICAgICAgaWYgc2VsZi5zdXBwcmVzc19yYWdnZWRfZW9mcyBhbmQgZS5hcmdzID09ICgtMSwgJ1VuZXhwZWN0ZWQgRU9GJyk6CiAgICAgICAgICAgICAgICByZXR1cm4gMAogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmFpc2UgU29ja2V0RXJyb3Ioc3RyKGUpKQogICAgICAgIGV4Y2VwdCBPcGVuU1NMLlNTTC5aZXJvUmV0dXJuRXJyb3IgYXMgZToKICAgICAgICAgICAgaWYgc2VsZi5jb25uZWN0aW9uLmdldF9zaHV0ZG93bigpID09IE9wZW5TU0wuU1NMLlJFQ0VJVkVEX1NIVVRET1dOOgogICAgICAgICAgICAgICAgcmV0dXJuIDAKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgZXhjZXB0IE9wZW5TU0wuU1NMLldhbnRSZWFkRXJyb3I6CiAgICAgICAgICAgIHJkID0gdXRpbC53YWl0X2Zvcl9yZWFkKHNlbGYuc29ja2V0LCBzZWxmLnNvY2tldC5nZXR0aW1lb3V0KCkpCiAgICAgICAgICAgIGlmIG5vdCByZDoKICAgICAgICAgICAgICAgIHJhaXNlIHRpbWVvdXQoJ1RoZSByZWFkIG9wZXJhdGlvbiB0aW1lZCBvdXQnKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYucmVjdl9pbnRvKCphcmdzLCAqKmt3YXJncykKCiAgICBkZWYgc2V0dGltZW91dChzZWxmLCB0aW1lb3V0KToKICAgICAgICByZXR1cm4gc2VsZi5zb2NrZXQuc2V0dGltZW91dCh0aW1lb3V0KQoKICAgIGRlZiBfc2VuZF91bnRpbF9kb25lKHNlbGYsIGRhdGEpOgogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbm5lY3Rpb24uc2VuZChkYXRhKQogICAgICAgICAgICBleGNlcHQgT3BlblNTTC5TU0wuV2FudFdyaXRlRXJyb3I6CiAgICAgICAgICAgICAgICB3ciA9IHV0aWwud2FpdF9mb3Jfd3JpdGUoc2VsZi5zb2NrZXQsIHNlbGYuc29ja2V0LmdldHRpbWVvdXQoKSkKICAgICAgICAgICAgICAgIGlmIG5vdCB3cjoKICAgICAgICAgICAgICAgICAgICByYWlzZSB0aW1lb3V0KCkKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGV4Y2VwdCBPcGVuU1NMLlNTTC5TeXNDYWxsRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgIHJhaXNlIFNvY2tldEVycm9yKHN0cihlKSkKCiAgICBkZWYgc2VuZGFsbChzZWxmLCBkYXRhKToKICAgICAgICB0b3RhbF9zZW50ID0gMAogICAgICAgIHdoaWxlIHRvdGFsX3NlbnQgPCBsZW4oZGF0YSk6CiAgICAgICAgICAgIHNlbnQgPSBzZWxmLl9zZW5kX3VudGlsX2RvbmUoZGF0YVt0b3RhbF9zZW50OnRvdGFsX3NlbnQgKyBTU0xfV1JJVEVfQkxPQ0tTSVpFXSkKICAgICAgICAgICAgdG90YWxfc2VudCArPSBzZW50CgogICAgZGVmIHNodXRkb3duKHNlbGYpOgogICAgICAgICMgRklYTUUgcmV0aHJvdyBjb21wYXRpYmxlIGV4Y2VwdGlvbnMgc2hvdWxkIHdlIGV2ZXIgdXNlIHRoaXMKICAgICAgICBzZWxmLmNvbm5lY3Rpb24uc2h1dGRvd24oKQoKICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICBpZiBzZWxmLl9tYWtlZmlsZV9yZWZzIDwgMToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgc2VsZi5fY2xvc2VkID0gVHJ1ZQogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29ubmVjdGlvbi5jbG9zZSgpCiAgICAgICAgICAgIGV4Y2VwdCBPcGVuU1NMLlNTTC5FcnJvcjoKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuX21ha2VmaWxlX3JlZnMgLT0gMQoKICAgIGRlZiBnZXRwZWVyY2VydChzZWxmLCBiaW5hcnlfZm9ybT1GYWxzZSk6CiAgICAgICAgeDUwOSA9IHNlbGYuY29ubmVjdGlvbi5nZXRfcGVlcl9jZXJ0aWZpY2F0ZSgpCgogICAgICAgIGlmIG5vdCB4NTA5OgogICAgICAgICAgICByZXR1cm4geDUwOQoKICAgICAgICBpZiBiaW5hcnlfZm9ybToKICAgICAgICAgICAgcmV0dXJuIE9wZW5TU0wuY3J5cHRvLmR1bXBfY2VydGlmaWNhdGUoCiAgICAgICAgICAgICAgICBPcGVuU1NMLmNyeXB0by5GSUxFVFlQRV9BU04xLAogICAgICAgICAgICAgICAgeDUwOSkKCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgJ3N1YmplY3QnOiAoCiAgICAgICAgICAgICAgICAoKCdjb21tb25OYW1lJywgeDUwOS5nZXRfc3ViamVjdCgpLkNOKSwpLAogICAgICAgICAgICApLAogICAgICAgICAgICAnc3ViamVjdEFsdE5hbWUnOiBnZXRfc3Vial9hbHRfbmFtZSh4NTA5KQogICAgICAgIH0KCiAgICBkZWYgX3JldXNlKHNlbGYpOgogICAgICAgIHNlbGYuX21ha2VmaWxlX3JlZnMgKz0gMQoKICAgIGRlZiBfZHJvcChzZWxmKToKICAgICAgICBpZiBzZWxmLl9tYWtlZmlsZV9yZWZzIDwgMToKICAgICAgICAgICAgc2VsZi5jbG9zZSgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5fbWFrZWZpbGVfcmVmcyAtPSAxCgoKaWYgX2ZpbGVvYmplY3Q6ICAjIFBsYXRmb3JtLXNwZWNpZmljOiBQeXRob24gMgogICAgZGVmIG1ha2VmaWxlKHNlbGYsIG1vZGUsIGJ1ZnNpemU9LTEpOgogICAgICAgIHNlbGYuX21ha2VmaWxlX3JlZnMgKz0gMQogICAgICAgIHJldHVybiBfZmlsZW9iamVjdChzZWxmLCBtb2RlLCBidWZzaXplLCBjbG9zZT1UcnVlKQplbHNlOiAgIyBQbGF0Zm9ybS1zcGVjaWZpYzogUHl0aG9uIDMKICAgIG1ha2VmaWxlID0gYmFja3BvcnRfbWFrZWZpbGUKCldyYXBwZWRTb2NrZXQubWFrZWZpbGUgPSBtYWtlZmlsZQoKCmNsYXNzIFB5T3BlblNTTENvbnRleHQob2JqZWN0KToKICAgICIiIgogICAgSSBhbSBhIHdyYXBwZXIgY2xhc3MgZm9yIHRoZSBQeU9wZW5TU0wgYGBDb250ZXh0YGAgb2JqZWN0LiBJIGFtIHJlc3BvbnNpYmxlCiAgICBmb3IgdHJhbnNsYXRpbmcgdGhlIGludGVyZmFjZSBvZiB0aGUgc3RhbmRhcmQgbGlicmFyeSBgYFNTTENvbnRleHRgYCBvYmplY3QKICAgIHRvIGNhbGxzIGludG8gUHlPcGVuU1NMLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgcHJvdG9jb2wpOgogICAgICAgIHNlbGYucHJvdG9jb2wgPSBfb3BlbnNzbF92ZXJzaW9uc1twcm90b2NvbF0KICAgICAgICBzZWxmLl9jdHggPSBPcGVuU1NMLlNTTC5Db250ZXh0KHNlbGYucHJvdG9jb2wpCiAgICAgICAgc2VsZi5fb3B0aW9ucyA9IDAKICAgICAgICBzZWxmLmNoZWNrX2hvc3RuYW1lID0gRmFsc2UKCiAgICBAcHJvcGVydHkKICAgIGRlZiBvcHRpb25zKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9vcHRpb25zCgogICAgQG9wdGlvbnMuc2V0dGVyCiAgICBkZWYgb3B0aW9ucyhzZWxmLCB2YWx1ZSk6CiAgICAgICAgc2VsZi5fb3B0aW9ucyA9IHZhbHVlCiAgICAgICAgc2VsZi5fY3R4LnNldF9vcHRpb25zKHZhbHVlKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHZlcmlmeV9tb2RlKHNlbGYpOgogICAgICAgIHJldHVybiBfb3BlbnNzbF90b19zdGRsaWJfdmVyaWZ5W3NlbGYuX2N0eC5nZXRfdmVyaWZ5X21vZGUoKV0KCiAgICBAdmVyaWZ5X21vZGUuc2V0dGVyCiAgICBkZWYgdmVyaWZ5X21vZGUoc2VsZiwgdmFsdWUpOgogICAgICAgIHNlbGYuX2N0eC5zZXRfdmVyaWZ5KAogICAgICAgICAgICBfc3RkbGliX3RvX29wZW5zc2xfdmVyaWZ5W3ZhbHVlXSwKICAgICAgICAgICAgX3ZlcmlmeV9jYWxsYmFjawogICAgICAgICkKCiAgICBkZWYgc2V0X2RlZmF1bHRfdmVyaWZ5X3BhdGhzKHNlbGYpOgogICAgICAgIHNlbGYuX2N0eC5zZXRfZGVmYXVsdF92ZXJpZnlfcGF0aHMoKQoKICAgIGRlZiBzZXRfY2lwaGVycyhzZWxmLCBjaXBoZXJzKToKICAgICAgICBpZiBpc2luc3RhbmNlKGNpcGhlcnMsIHNpeC50ZXh0X3R5cGUpOgogICAgICAgICAgICBjaXBoZXJzID0gY2lwaGVycy5lbmNvZGUoJ3V0Zi04JykKICAgICAgICBzZWxmLl9jdHguc2V0X2NpcGhlcl9saXN0KGNpcGhlcnMpCgogICAgZGVmIGxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhzZWxmLCBjYWZpbGU9Tm9uZSwgY2FwYXRoPU5vbmUsIGNhZGF0YT1Ob25lKToKICAgICAgICBpZiBjYWZpbGUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGNhZmlsZSA9IGNhZmlsZS5lbmNvZGUoJ3V0Zi04JykKICAgICAgICBpZiBjYXBhdGggaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGNhcGF0aCA9IGNhcGF0aC5lbmNvZGUoJ3V0Zi04JykKICAgICAgICBzZWxmLl9jdHgubG9hZF92ZXJpZnlfbG9jYXRpb25zKGNhZmlsZSwgY2FwYXRoKQogICAgICAgIGlmIGNhZGF0YSBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5fY3R4LmxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhCeXRlc0lPKGNhZGF0YSkpCgogICAgZGVmIGxvYWRfY2VydF9jaGFpbihzZWxmLCBjZXJ0ZmlsZSwga2V5ZmlsZT1Ob25lLCBwYXNzd29yZD1Ob25lKToKICAgICAgICBzZWxmLl9jdHgudXNlX2NlcnRpZmljYXRlX2ZpbGUoY2VydGZpbGUpCiAgICAgICAgaWYgcGFzc3dvcmQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYuX2N0eC5zZXRfcGFzc3dkX2NiKGxhbWJkYSBtYXhfbGVuZ3RoLCBwcm9tcHRfdHdpY2UsIHVzZXJkYXRhOiBwYXNzd29yZCkKICAgICAgICBzZWxmLl9jdHgudXNlX3ByaXZhdGVrZXlfZmlsZShrZXlmaWxlIG9yIGNlcnRmaWxlKQoKICAgIGRlZiB3cmFwX3NvY2tldChzZWxmLCBzb2NrLCBzZXJ2ZXJfc2lkZT1GYWxzZSwKICAgICAgICAgICAgICAgICAgICBkb19oYW5kc2hha2Vfb25fY29ubmVjdD1UcnVlLCBzdXBwcmVzc19yYWdnZWRfZW9mcz1UcnVlLAogICAgICAgICAgICAgICAgICAgIHNlcnZlcl9ob3N0bmFtZT1Ob25lKToKICAgICAgICBjbnggPSBPcGVuU1NMLlNTTC5Db25uZWN0aW9uKHNlbGYuX2N0eCwgc29jaykKCiAgICAgICAgaWYgaXNpbnN0YW5jZShzZXJ2ZXJfaG9zdG5hbWUsIHNpeC50ZXh0X3R5cGUpOiAgIyBQbGF0Zm9ybS1zcGVjaWZpYzogUHl0aG9uIDMKICAgICAgICAgICAgc2VydmVyX2hvc3RuYW1lID0gc2VydmVyX2hvc3RuYW1lLmVuY29kZSgndXRmLTgnKQoKICAgICAgICBpZiBzZXJ2ZXJfaG9zdG5hbWUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGNueC5zZXRfdGxzZXh0X2hvc3RfbmFtZShzZXJ2ZXJfaG9zdG5hbWUpCgogICAgICAgIGNueC5zZXRfY29ubmVjdF9zdGF0ZSgpCgogICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGNueC5kb19oYW5kc2hha2UoKQogICAgICAgICAgICBleGNlcHQgT3BlblNTTC5TU0wuV2FudFJlYWRFcnJvcjoKICAgICAgICAgICAgICAgIHJkID0gdXRpbC53YWl0X2Zvcl9yZWFkKHNvY2ssIHNvY2suZ2V0dGltZW91dCgpKQogICAgICAgICAgICAgICAgaWYgbm90IHJkOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIHRpbWVvdXQoJ3NlbGVjdCB0aW1lZCBvdXQnKQogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgZXhjZXB0IE9wZW5TU0wuU1NMLkVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICByYWlzZSBzc2wuU1NMRXJyb3IoJ2JhZCBoYW5kc2hha2U6ICVyJyAlIGUpCiAgICAgICAgICAgIGJyZWFrCgogICAgICAgIHJldHVybiBXcmFwcGVkU29ja2V0KGNueCwgc29jaykKCgpkZWYgX3ZlcmlmeV9jYWxsYmFjayhjbngsIHg1MDksIGVycl9ubywgZXJyX2RlcHRoLCByZXR1cm5fY29kZSk6CiAgICByZXR1cm4gZXJyX25vID09IDAKUEsDBBQAAAAAAAAAIQDnU8DzJXcAACV3AAA+AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvY29udHJpYi9zZWN1cmV0cmFuc3BvcnQucHkiIiIKU2VjdXJlVHJhbnBvcnQgc3VwcG9ydCBmb3IgdXJsbGliMyB2aWEgY3R5cGVzLgoKVGhpcyBtYWtlcyBwbGF0Zm9ybS1uYXRpdmUgVExTIGF2YWlsYWJsZSB0byB1cmxsaWIzIHVzZXJzIG9uIG1hY09TIHdpdGhvdXQgdGhlCnVzZSBvZiBhIGNvbXBpbGVyLiBUaGlzIGlzIGFuIGltcG9ydGFudCBmZWF0dXJlIGJlY2F1c2UgdGhlIFB5dGhvbiBQYWNrYWdlCkluZGV4IGlzIG1vdmluZyB0byBiZWNvbWUgYSBUTFN2MS4yLW9yLWhpZ2hlciBzZXJ2ZXIsIGFuZCB0aGUgZGVmYXVsdCBPcGVuU1NMCnRoYXQgc2hpcHMgd2l0aCBtYWNPUyBpcyBub3QgY2FwYWJsZSBvZiBkb2luZyBUTFN2MS4yLiBUaGUgb25seSB3YXkgdG8gcmVzb2x2ZQp0aGlzIGlzIHRvIGdpdmUgbWFjT1MgdXNlcnMgYW4gYWx0ZXJuYXRpdmUgc29sdXRpb24gdG8gdGhlIHByb2JsZW0sIGFuZCB0aGF0CnNvbHV0aW9uIGlzIHRvIHVzZSBTZWN1cmVUcmFuc3BvcnQuCgpXZSB1c2UgY3R5cGVzIGhlcmUgYmVjYXVzZSB0aGlzIHNvbHV0aW9uIG11c3Qgbm90IHJlcXVpcmUgYSBjb21waWxlci4gVGhhdCdzCmJlY2F1c2UgcGlwIGlzIG5vdCBhbGxvd2VkIHRvIHJlcXVpcmUgYSBjb21waWxlciBlaXRoZXIuCgpUaGlzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBhIHNlcmlvdXNseSBsb25nLXRlcm0gc29sdXRpb24gdG8gdGhpcyBwcm9ibGVtLgpUaGUgaG9wZSBpcyB0aGF0IFBFUCA1NDMgd2lsbCBldmVudHVhbGx5IHNvbHZlIHRoaXMgaXNzdWUgZm9yIHVzLCBhdCB3aGljaApwb2ludCB3ZSBjYW4gcmV0aXJlIHRoaXMgY29udHJpYiBtb2R1bGUuIEJ1dCBpbiB0aGUgc2hvcnQgdGVybSwgd2UgbmVlZCB0bwpzb2x2ZSB0aGUgaW1wZW5kaW5nIHRpcmUgZmlyZSB0aGF0IGlzIFB5dGhvbiBvbiBNYWMgd2l0aG91dCB0aGlzIGtpbmQgb2YKY29udHJpYiBtb2R1bGUuIFNvLi4uaGVyZSB3ZSBhcmUuCgpUbyB1c2UgdGhpcyBtb2R1bGUsIHNpbXBseSBpbXBvcnQgYW5kIGluamVjdCBpdDo6CgogICAgaW1wb3J0IHVybGxpYjMuY29udHJpYi5zZWN1cmV0cmFuc3BvcnQKICAgIHVybGxpYjMuY29udHJpYi5zZWN1cmV0cmFuc3BvcnQuaW5qZWN0X2ludG9fdXJsbGliMygpCgpIYXBweSBUTFNpbmchCiIiIgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGNvbnRleHRsaWIKaW1wb3J0IGN0eXBlcwppbXBvcnQgZXJybm8KaW1wb3J0IG9zLnBhdGgKaW1wb3J0IHNodXRpbAppbXBvcnQgc29ja2V0CmltcG9ydCBzc2wKaW1wb3J0IHRocmVhZGluZwppbXBvcnQgd2Vha3JlZgoKZnJvbSAuLiBpbXBvcnQgdXRpbApmcm9tIC5fc2VjdXJldHJhbnNwb3J0LmJpbmRpbmdzIGltcG9ydCAoCiAgICBTZWN1cml0eSwgU2VjdXJpdHlDb25zdCwgQ29yZUZvdW5kYXRpb24KKQpmcm9tIC5fc2VjdXJldHJhbnNwb3J0Lmxvd19sZXZlbCBpbXBvcnQgKAogICAgX2Fzc2VydF9ub19lcnJvciwgX2NlcnRfYXJyYXlfZnJvbV9wZW0sIF90ZW1wb3Jhcnlfa2V5Y2hhaW4sCiAgICBfbG9hZF9jbGllbnRfY2VydF9jaGFpbgopCgp0cnk6ICAjIFBsYXRmb3JtLXNwZWNpZmljOiBQeXRob24gMgogICAgZnJvbSBzb2NrZXQgaW1wb3J0IF9maWxlb2JqZWN0CmV4Y2VwdCBJbXBvcnRFcnJvcjogICMgUGxhdGZvcm0tc3BlY2lmaWM6IFB5dGhvbiAzCiAgICBfZmlsZW9iamVjdCA9IE5vbmUKICAgIGZyb20gLi5wYWNrYWdlcy5iYWNrcG9ydHMubWFrZWZpbGUgaW1wb3J0IGJhY2twb3J0X21ha2VmaWxlCgp0cnk6CiAgICBtZW1vcnl2aWV3KGInJykKZXhjZXB0IE5hbWVFcnJvcjoKICAgIHJhaXNlIEltcG9ydEVycm9yKCJTZWN1cmVUcmFuc3BvcnQgb25seSB3b3JrcyBvbiBQeXRob25zIHdpdGggbWVtb3J5dmlldyIpCgpfX2FsbF9fID0gWydpbmplY3RfaW50b191cmxsaWIzJywgJ2V4dHJhY3RfZnJvbV91cmxsaWIzJ10KCiMgU05JIGFsd2F5cyB3b3JrcwpIQVNfU05JID0gVHJ1ZQoKb3JpZ191dGlsX0hBU19TTkkgPSB1dGlsLkhBU19TTkkKb3JpZ191dGlsX1NTTENvbnRleHQgPSB1dGlsLnNzbF8uU1NMQ29udGV4dAoKIyBUaGlzIGRpY3Rpb25hcnkgaXMgdXNlZCBieSB0aGUgcmVhZCBjYWxsYmFjayB0byBvYnRhaW4gYSBoYW5kbGUgdG8gdGhlCiMgY2FsbGluZyB3cmFwcGVkIHNvY2tldC4gVGhpcyBpcyBhIHByZXR0eSBzaWxseSBhcHByb2FjaCwgYnV0IGZvciBub3cgaXQnbGwKIyBkby4gSSBmZWVsIGxpa2UgSSBzaG91bGQgYmUgYWJsZSB0byBzbXVnZ2xlIGEgaGFuZGxlIHRvIHRoZSB3cmFwcGVkIHNvY2tldAojIGRpcmVjdGx5IGluIHRoZSBTU0xDb25uZWN0aW9uUmVmLCBidXQgZm9yIG5vdyB0aGlzIGFwcHJvYWNoIHdpbGwgd29yayBJCiMgZ3Vlc3MuCiMKIyBXZSBuZWVkIHRvIGxvY2sgYXJvdW5kIHRoaXMgc3RydWN0dXJlIGZvciBpbnNlcnRzLCBidXQgd2UgZG9uJ3QgZG8gaXQgZm9yCiMgcmVhZHMvd3JpdGVzIGluIHRoZSBjYWxsYmFja3MuIFRoZSByZWFzb25pbmcgaGVyZSBnb2VzIGFzIGZvbGxvd3M6CiMKIyAgICAxLiBJdCBpcyBub3QgcG9zc2libGUgdG8gY2FsbCBpbnRvIHRoZSBjYWxsYmFja3MgYmVmb3JlIHRoZSBkaWN0aW9uYXJ5IGlzCiMgICAgICAgcG9wdWxhdGVkLCBzbyBvbmNlIGluIHRoZSBjYWxsYmFjayB0aGUgaWQgbXVzdCBiZSBpbiB0aGUgZGljdGlvbmFyeS4KIyAgICAyLiBUaGUgY2FsbGJhY2tzIGRvbid0IG11dGF0ZSB0aGUgZGljdGlvbmFyeSwgdGhleSBvbmx5IHJlYWQgZnJvbSBpdCwgYW5kCiMgICAgICAgc28gY2Fubm90IGNvbmZsaWN0IHdpdGggYW55IG9mIHRoZSBpbnNlcnRpb25zLgojCiMgVGhpcyBpcyBnb29kOiBpZiB3ZSBoYWQgdG8gbG9jayBpbiB0aGUgY2FsbGJhY2tzIHdlJ2QgZHJhc3RpY2FsbHkgc2xvdyBkb3duCiMgdGhlIHBlcmZvcm1hbmNlIG9mIHRoaXMgY29kZS4KX2Nvbm5lY3Rpb25fcmVmcyA9IHdlYWtyZWYuV2Vha1ZhbHVlRGljdGlvbmFyeSgpCl9jb25uZWN0aW9uX3JlZl9sb2NrID0gdGhyZWFkaW5nLkxvY2soKQoKIyBMaW1pdCB3cml0ZXMgdG8gMTZrQi4gVGhpcyBpcyBPcGVuU1NMJ3MgbGltaXQsIGJ1dCB3ZSdsbCBjYXJnby1jdWx0IGl0IG92ZXIKIyBmb3Igbm8gYmV0dGVyIHJlYXNvbiB0aGFuIHdlIG5lZWQgKmEqIGxpbWl0LCBhbmQgdGhpcyBvbmUgaXMgcmlnaHQgdGhlcmUuClNTTF9XUklURV9CTE9DS1NJWkUgPSAxNjM4NAoKIyBUaGlzIGlzIG91ciBlcXVpdmFsZW50IG9mIHV0aWwuc3NsXy5ERUZBVUxUX0NJUEhFUlMsIGJ1dCBleHBhbmRlZCBvdXQgdG8KIyBpbmRpdmlkdWFsIGNpcGhlciBzdWl0ZXMuIFdlIG5lZWQgdG8gZG8gdGhpcyBiZWN1YXNlIHRoaXMgaXMgaG93CiMgU2VjdXJlVHJhbnNwb3J0IHdhbnRzIHRoZW0uCkNJUEhFUl9TVUlURVMgPSBbCiAgICBTZWN1cml0eUNvbnN0LlRMU19BRVNfMjU2X0dDTV9TSEEzODQsCiAgICBTZWN1cml0eUNvbnN0LlRMU19DSEFDSEEyMF9QT0xZMTMwNV9TSEEyNTYsCiAgICBTZWN1cml0eUNvbnN0LlRMU19BRVNfMTI4X0dDTV9TSEEyNTYsCiAgICBTZWN1cml0eUNvbnN0LlRMU19FQ0RIRV9FQ0RTQV9XSVRIX0FFU18yNTZfR0NNX1NIQTM4NCwKICAgIFNlY3VyaXR5Q29uc3QuVExTX0VDREhFX1JTQV9XSVRIX0FFU18yNTZfR0NNX1NIQTM4NCwKICAgIFNlY3VyaXR5Q29uc3QuVExTX0VDREhFX0VDRFNBX1dJVEhfQUVTXzEyOF9HQ01fU0hBMjU2LAogICAgU2VjdXJpdHlDb25zdC5UTFNfRUNESEVfUlNBX1dJVEhfQUVTXzEyOF9HQ01fU0hBMjU2LAogICAgU2VjdXJpdHlDb25zdC5UTFNfREhFX0RTU19XSVRIX0FFU18yNTZfR0NNX1NIQTM4NCwKICAgIFNlY3VyaXR5Q29uc3QuVExTX0RIRV9SU0FfV0lUSF9BRVNfMjU2X0dDTV9TSEEzODQsCiAgICBTZWN1cml0eUNvbnN0LlRMU19ESEVfRFNTX1dJVEhfQUVTXzEyOF9HQ01fU0hBMjU2LAogICAgU2VjdXJpdHlDb25zdC5UTFNfREhFX1JTQV9XSVRIX0FFU18xMjhfR0NNX1NIQTI1NiwKICAgIFNlY3VyaXR5Q29uc3QuVExTX0VDREhFX0VDRFNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBMzg0LAogICAgU2VjdXJpdHlDb25zdC5UTFNfRUNESEVfUlNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBMzg0LAogICAgU2VjdXJpdHlDb25zdC5UTFNfRUNESEVfRUNEU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEEsCiAgICBTZWN1cml0eUNvbnN0LlRMU19FQ0RIRV9SU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEEsCiAgICBTZWN1cml0eUNvbnN0LlRMU19ESEVfUlNBX1dJVEhfQUVTXzI1Nl9DQkNfU0hBMjU2LAogICAgU2VjdXJpdHlDb25zdC5UTFNfREhFX0RTU19XSVRIX0FFU18yNTZfQ0JDX1NIQTI1NiwKICAgIFNlY3VyaXR5Q29uc3QuVExTX0RIRV9SU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEEsCiAgICBTZWN1cml0eUNvbnN0LlRMU19ESEVfRFNTX1dJVEhfQUVTXzI1Nl9DQkNfU0hBLAogICAgU2VjdXJpdHlDb25zdC5UTFNfRUNESEVfRUNEU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEyNTYsCiAgICBTZWN1cml0eUNvbnN0LlRMU19FQ0RIRV9SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEyNTYsCiAgICBTZWN1cml0eUNvbnN0LlRMU19FQ0RIRV9FQ0RTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQSwKICAgIFNlY3VyaXR5Q29uc3QuVExTX0VDREhFX1JTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQSwKICAgIFNlY3VyaXR5Q29uc3QuVExTX0RIRV9SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEyNTYsCiAgICBTZWN1cml0eUNvbnN0LlRMU19ESEVfRFNTX1dJVEhfQUVTXzEyOF9DQkNfU0hBMjU2LAogICAgU2VjdXJpdHlDb25zdC5UTFNfREhFX1JTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQSwKICAgIFNlY3VyaXR5Q29uc3QuVExTX0RIRV9EU1NfV0lUSF9BRVNfMTI4X0NCQ19TSEEsCiAgICBTZWN1cml0eUNvbnN0LlRMU19SU0FfV0lUSF9BRVNfMjU2X0dDTV9TSEEzODQsCiAgICBTZWN1cml0eUNvbnN0LlRMU19SU0FfV0lUSF9BRVNfMTI4X0dDTV9TSEEyNTYsCiAgICBTZWN1cml0eUNvbnN0LlRMU19SU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEEyNTYsCiAgICBTZWN1cml0eUNvbnN0LlRMU19SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEyNTYsCiAgICBTZWN1cml0eUNvbnN0LlRMU19SU0FfV0lUSF9BRVNfMjU2X0NCQ19TSEEsCiAgICBTZWN1cml0eUNvbnN0LlRMU19SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEsCl0KCiMgQmFzaWNhbGx5IHRoaXMgaXMgc2ltcGxlOiBmb3IgUFJPVE9DT0xfU1NMdjIzIHdlIHR1cm4gaXQgaW50byBhIGxvdyBvZgojIFRMU3YxIGFuZCBhIGhpZ2ggb2YgVExTdjEuMi4gRm9yIGV2ZXJ5dGhpbmcgZWxzZSwgd2UgcGluIHRvIHRoYXQgdmVyc2lvbi4KX3Byb3RvY29sX3RvX21pbl9tYXggPSB7CiAgICBzc2wuUFJPVE9DT0xfU1NMdjIzOiAoU2VjdXJpdHlDb25zdC5rVExTUHJvdG9jb2wxLCBTZWN1cml0eUNvbnN0LmtUTFNQcm90b2NvbDEyKSwKfQoKaWYgaGFzYXR0cihzc2wsICJQUk9UT0NPTF9TU0x2MiIpOgogICAgX3Byb3RvY29sX3RvX21pbl9tYXhbc3NsLlBST1RPQ09MX1NTTHYyXSA9ICgKICAgICAgICBTZWN1cml0eUNvbnN0LmtTU0xQcm90b2NvbDIsIFNlY3VyaXR5Q29uc3Qua1NTTFByb3RvY29sMgogICAgKQppZiBoYXNhdHRyKHNzbCwgIlBST1RPQ09MX1NTTHYzIik6CiAgICBfcHJvdG9jb2xfdG9fbWluX21heFtzc2wuUFJPVE9DT0xfU1NMdjNdID0gKAogICAgICAgIFNlY3VyaXR5Q29uc3Qua1NTTFByb3RvY29sMywgU2VjdXJpdHlDb25zdC5rU1NMUHJvdG9jb2wzCiAgICApCmlmIGhhc2F0dHIoc3NsLCAiUFJPVE9DT0xfVExTdjEiKToKICAgIF9wcm90b2NvbF90b19taW5fbWF4W3NzbC5QUk9UT0NPTF9UTFN2MV0gPSAoCiAgICAgICAgU2VjdXJpdHlDb25zdC5rVExTUHJvdG9jb2wxLCBTZWN1cml0eUNvbnN0LmtUTFNQcm90b2NvbDEKICAgICkKaWYgaGFzYXR0cihzc2wsICJQUk9UT0NPTF9UTFN2MV8xIik6CiAgICBfcHJvdG9jb2xfdG9fbWluX21heFtzc2wuUFJPVE9DT0xfVExTdjFfMV0gPSAoCiAgICAgICAgU2VjdXJpdHlDb25zdC5rVExTUHJvdG9jb2wxMSwgU2VjdXJpdHlDb25zdC5rVExTUHJvdG9jb2wxMQogICAgKQppZiBoYXNhdHRyKHNzbCwgIlBST1RPQ09MX1RMU3YxXzIiKToKICAgIF9wcm90b2NvbF90b19taW5fbWF4W3NzbC5QUk9UT0NPTF9UTFN2MV8yXSA9ICgKICAgICAgICBTZWN1cml0eUNvbnN0LmtUTFNQcm90b2NvbDEyLCBTZWN1cml0eUNvbnN0LmtUTFNQcm90b2NvbDEyCiAgICApCmlmIGhhc2F0dHIoc3NsLCAiUFJPVE9DT0xfVExTIik6CiAgICBfcHJvdG9jb2xfdG9fbWluX21heFtzc2wuUFJPVE9DT0xfVExTXSA9IF9wcm90b2NvbF90b19taW5fbWF4W3NzbC5QUk9UT0NPTF9TU0x2MjNdCgoKZGVmIGluamVjdF9pbnRvX3VybGxpYjMoKToKICAgICIiIgogICAgTW9ua2V5LXBhdGNoIHVybGxpYjMgd2l0aCBTZWN1cmVUcmFuc3BvcnQtYmFja2VkIFNTTC1zdXBwb3J0LgogICAgIiIiCiAgICB1dGlsLnNzbF8uU1NMQ29udGV4dCA9IFNlY3VyZVRyYW5zcG9ydENvbnRleHQKICAgIHV0aWwuSEFTX1NOSSA9IEhBU19TTkkKICAgIHV0aWwuc3NsXy5IQVNfU05JID0gSEFTX1NOSQogICAgdXRpbC5JU19TRUNVUkVUUkFOU1BPUlQgPSBUcnVlCiAgICB1dGlsLnNzbF8uSVNfU0VDVVJFVFJBTlNQT1JUID0gVHJ1ZQoKCmRlZiBleHRyYWN0X2Zyb21fdXJsbGliMygpOgogICAgIiIiCiAgICBVbmRvIG1vbmtleS1wYXRjaGluZyBieSA6ZnVuYzpgaW5qZWN0X2ludG9fdXJsbGliM2AuCiAgICAiIiIKICAgIHV0aWwuc3NsXy5TU0xDb250ZXh0ID0gb3JpZ191dGlsX1NTTENvbnRleHQKICAgIHV0aWwuSEFTX1NOSSA9IG9yaWdfdXRpbF9IQVNfU05JCiAgICB1dGlsLnNzbF8uSEFTX1NOSSA9IG9yaWdfdXRpbF9IQVNfU05JCiAgICB1dGlsLklTX1NFQ1VSRVRSQU5TUE9SVCA9IEZhbHNlCiAgICB1dGlsLnNzbF8uSVNfU0VDVVJFVFJBTlNQT1JUID0gRmFsc2UKCgpkZWYgX3JlYWRfY2FsbGJhY2soY29ubmVjdGlvbl9pZCwgZGF0YV9idWZmZXIsIGRhdGFfbGVuZ3RoX3BvaW50ZXIpOgogICAgIiIiCiAgICBTZWN1cmVUcmFuc3BvcnQgcmVhZCBjYWxsYmFjay4gVGhpcyBpcyBjYWxsZWQgYnkgU1QgdG8gcmVxdWVzdCB0aGF0IGRhdGEKICAgIGJlIHJldHVybmVkIGZyb20gdGhlIHNvY2tldC4KICAgICIiIgogICAgd3JhcHBlZF9zb2NrZXQgPSBOb25lCiAgICB0cnk6CiAgICAgICAgd3JhcHBlZF9zb2NrZXQgPSBfY29ubmVjdGlvbl9yZWZzLmdldChjb25uZWN0aW9uX2lkKQogICAgICAgIGlmIHdyYXBwZWRfc29ja2V0IGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiBTZWN1cml0eUNvbnN0LmVyclNTTEludGVybmFsCiAgICAgICAgYmFzZV9zb2NrZXQgPSB3cmFwcGVkX3NvY2tldC5zb2NrZXQKCiAgICAgICAgcmVxdWVzdGVkX2xlbmd0aCA9IGRhdGFfbGVuZ3RoX3BvaW50ZXJbMF0KCiAgICAgICAgdGltZW91dCA9IHdyYXBwZWRfc29ja2V0LmdldHRpbWVvdXQoKQogICAgICAgIGVycm9yID0gTm9uZQogICAgICAgIHJlYWRfY291bnQgPSAwCiAgICAgICAgYnVmZmVyID0gKGN0eXBlcy5jX2NoYXIgKiByZXF1ZXN0ZWRfbGVuZ3RoKS5mcm9tX2FkZHJlc3MoZGF0YV9idWZmZXIpCiAgICAgICAgYnVmZmVyX3ZpZXcgPSBtZW1vcnl2aWV3KGJ1ZmZlcikKCiAgICAgICAgdHJ5OgogICAgICAgICAgICB3aGlsZSByZWFkX2NvdW50IDwgcmVxdWVzdGVkX2xlbmd0aDoKICAgICAgICAgICAgICAgIGlmIHRpbWVvdXQgaXMgTm9uZSBvciB0aW1lb3V0ID49IDA6CiAgICAgICAgICAgICAgICAgICAgcmVhZGFibGVzID0gdXRpbC53YWl0X2Zvcl9yZWFkKFtiYXNlX3NvY2tldF0sIHRpbWVvdXQpCiAgICAgICAgICAgICAgICAgICAgaWYgbm90IHJlYWRhYmxlczoKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2Ugc29ja2V0LmVycm9yKGVycm5vLkVBR0FJTiwgJ3RpbWVkIG91dCcpCgogICAgICAgICAgICAgICAgIyBXZSBuZWVkIHRvIHRlbGwgY3R5cGVzIHRoYXQgd2UgaGF2ZSBhIGJ1ZmZlciB0aGF0IGNhbiBiZQogICAgICAgICAgICAgICAgIyB3cml0dGVuIHRvLiBVcHNldHRpbmdseSwgd2UgZG8gdGhhdCBsaWtlIHRoaXM6CiAgICAgICAgICAgICAgICBjaHVua19zaXplID0gYmFzZV9zb2NrZXQucmVjdl9pbnRvKAogICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl92aWV3W3JlYWRfY291bnQ6cmVxdWVzdGVkX2xlbmd0aF0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHJlYWRfY291bnQgKz0gY2h1bmtfc2l6ZQogICAgICAgICAgICAgICAgaWYgbm90IGNodW5rX3NpemU6CiAgICAgICAgICAgICAgICAgICAgaWYgbm90IHJlYWRfY291bnQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTZWN1cml0eUNvbnN0LmVyclNTTENsb3NlZEdyYWNlZnVsCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBleGNlcHQgKHNvY2tldC5lcnJvcikgYXMgZToKICAgICAgICAgICAgZXJyb3IgPSBlLmVycm5vCgogICAgICAgICAgICBpZiBlcnJvciBpcyBub3QgTm9uZSBhbmQgZXJyb3IgIT0gZXJybm8uRUFHQUlOOgogICAgICAgICAgICAgICAgaWYgZXJyb3IgPT0gZXJybm8uRUNPTk5SRVNFVDoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2VjdXJpdHlDb25zdC5lcnJTU0xDbG9zZWRBYm9ydAogICAgICAgICAgICAgICAgcmFpc2UKCiAgICAgICAgZGF0YV9sZW5ndGhfcG9pbnRlclswXSA9IHJlYWRfY291bnQKCiAgICAgICAgaWYgcmVhZF9jb3VudCAhPSByZXF1ZXN0ZWRfbGVuZ3RoOgogICAgICAgICAgICByZXR1cm4gU2VjdXJpdHlDb25zdC5lcnJTU0xXb3VsZEJsb2NrCgogICAgICAgIHJldHVybiAwCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgaWYgd3JhcHBlZF9zb2NrZXQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHdyYXBwZWRfc29ja2V0Ll9leGNlcHRpb24gPSBlCiAgICAgICAgcmV0dXJuIFNlY3VyaXR5Q29uc3QuZXJyU1NMSW50ZXJuYWwKCgpkZWYgX3dyaXRlX2NhbGxiYWNrKGNvbm5lY3Rpb25faWQsIGRhdGFfYnVmZmVyLCBkYXRhX2xlbmd0aF9wb2ludGVyKToKICAgICIiIgogICAgU2VjdXJlVHJhbnNwb3J0IHdyaXRlIGNhbGxiYWNrLiBUaGlzIGlzIGNhbGxlZCBieSBTVCB0byByZXF1ZXN0IHRoYXQgZGF0YQogICAgYWN0dWFsbHkgYmUgc2VudCBvbiB0aGUgbmV0d29yay4KICAgICIiIgogICAgd3JhcHBlZF9zb2NrZXQgPSBOb25lCiAgICB0cnk6CiAgICAgICAgd3JhcHBlZF9zb2NrZXQgPSBfY29ubmVjdGlvbl9yZWZzLmdldChjb25uZWN0aW9uX2lkKQogICAgICAgIGlmIHdyYXBwZWRfc29ja2V0IGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiBTZWN1cml0eUNvbnN0LmVyclNTTEludGVybmFsCiAgICAgICAgYmFzZV9zb2NrZXQgPSB3cmFwcGVkX3NvY2tldC5zb2NrZXQKCiAgICAgICAgYnl0ZXNfdG9fd3JpdGUgPSBkYXRhX2xlbmd0aF9wb2ludGVyWzBdCiAgICAgICAgZGF0YSA9IGN0eXBlcy5zdHJpbmdfYXQoZGF0YV9idWZmZXIsIGJ5dGVzX3RvX3dyaXRlKQoKICAgICAgICB0aW1lb3V0ID0gd3JhcHBlZF9zb2NrZXQuZ2V0dGltZW91dCgpCiAgICAgICAgZXJyb3IgPSBOb25lCiAgICAgICAgc2VudCA9IDAKCiAgICAgICAgdHJ5OgogICAgICAgICAgICB3aGlsZSBzZW50IDwgYnl0ZXNfdG9fd3JpdGU6CiAgICAgICAgICAgICAgICBpZiB0aW1lb3V0IGlzIE5vbmUgb3IgdGltZW91dCA+PSAwOgogICAgICAgICAgICAgICAgICAgIHdyaXRhYmxlcyA9IHV0aWwud2FpdF9mb3Jfd3JpdGUoW2Jhc2Vfc29ja2V0XSwgdGltZW91dCkKICAgICAgICAgICAgICAgICAgICBpZiBub3Qgd3JpdGFibGVzOgogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBzb2NrZXQuZXJyb3IoZXJybm8uRUFHQUlOLCAndGltZWQgb3V0JykKICAgICAgICAgICAgICAgIGNodW5rX3NlbnQgPSBiYXNlX3NvY2tldC5zZW5kKGRhdGEpCiAgICAgICAgICAgICAgICBzZW50ICs9IGNodW5rX3NlbnQKCiAgICAgICAgICAgICAgICAjIFRoaXMgaGFzIHNvbWUgbmVlZGxlc3MgY29weWluZyBoZXJlLCBidXQgSSdtIG5vdCBzdXJlIHRoZXJlJ3MKICAgICAgICAgICAgICAgICMgbXVjaCB2YWx1ZSBpbiBvcHRpbWlzaW5nIHRoaXMgZGF0YSBwYXRoLgogICAgICAgICAgICAgICAgZGF0YSA9IGRhdGFbY2h1bmtfc2VudDpdCiAgICAgICAgZXhjZXB0IChzb2NrZXQuZXJyb3IpIGFzIGU6CiAgICAgICAgICAgIGVycm9yID0gZS5lcnJubwoKICAgICAgICAgICAgaWYgZXJyb3IgaXMgbm90IE5vbmUgYW5kIGVycm9yICE9IGVycm5vLkVBR0FJTjoKICAgICAgICAgICAgICAgIGlmIGVycm9yID09IGVycm5vLkVDT05OUkVTRVQ6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNlY3VyaXR5Q29uc3QuZXJyU1NMQ2xvc2VkQWJvcnQKICAgICAgICAgICAgICAgIHJhaXNlCgogICAgICAgIGRhdGFfbGVuZ3RoX3BvaW50ZXJbMF0gPSBzZW50CiAgICAgICAgaWYgc2VudCAhPSBieXRlc190b193cml0ZToKICAgICAgICAgICAgcmV0dXJuIFNlY3VyaXR5Q29uc3QuZXJyU1NMV291bGRCbG9jawoKICAgICAgICByZXR1cm4gMAogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIGlmIHdyYXBwZWRfc29ja2V0IGlzIG5vdCBOb25lOgogICAgICAgICAgICB3cmFwcGVkX3NvY2tldC5fZXhjZXB0aW9uID0gZQogICAgICAgIHJldHVybiBTZWN1cml0eUNvbnN0LmVyclNTTEludGVybmFsCgoKIyBXZSBuZWVkIHRvIGtlZXAgdGhlc2UgdHdvIG9iamVjdHMgcmVmZXJlbmNlcyBhbGl2ZTogaWYgdGhleSBnZXQgR0MnZCB3aGlsZQojIGluIHVzZSB0aGVuIFNlY3VyZVRyYW5zcG9ydCBjb3VsZCBhdHRlbXB0IHRvIGNhbGwgYSBmdW5jdGlvbiB0aGF0IGlzIGluIGZyZWVkCiMgbWVtb3J5LiBUaGF0IHdvdWxkIGJlLi4udWguLi5iYWQuIFllYWgsIHRoYXQncyB0aGUgd29yZC4gQmFkLgpfcmVhZF9jYWxsYmFja19wb2ludGVyID0gU2VjdXJpdHkuU1NMUmVhZEZ1bmMoX3JlYWRfY2FsbGJhY2spCl93cml0ZV9jYWxsYmFja19wb2ludGVyID0gU2VjdXJpdHkuU1NMV3JpdGVGdW5jKF93cml0ZV9jYWxsYmFjaykKCgpjbGFzcyBXcmFwcGVkU29ja2V0KG9iamVjdCk6CiAgICAiIiIKICAgIEFQSS1jb21wYXRpYmlsaXR5IHdyYXBwZXIgZm9yIFB5dGhvbidzIE9wZW5TU0wgd3JhcHBlZCBzb2NrZXQgb2JqZWN0LgoKICAgIE5vdGU6IF9tYWtlZmlsZV9yZWZzLCBfZHJvcCgpLCBhbmQgX3JldXNlKCkgYXJlIG5lZWRlZCBmb3IgdGhlIGdhcmJhZ2UKICAgIGNvbGxlY3RvciBvZiBQeVB5LgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgc29ja2V0KToKICAgICAgICBzZWxmLnNvY2tldCA9IHNvY2tldAogICAgICAgIHNlbGYuY29udGV4dCA9IE5vbmUKICAgICAgICBzZWxmLl9tYWtlZmlsZV9yZWZzID0gMAogICAgICAgIHNlbGYuX2Nsb3NlZCA9IEZhbHNlCiAgICAgICAgc2VsZi5fZXhjZXB0aW9uID0gTm9uZQogICAgICAgIHNlbGYuX2tleWNoYWluID0gTm9uZQogICAgICAgIHNlbGYuX2tleWNoYWluX2RpciA9IE5vbmUKICAgICAgICBzZWxmLl9jbGllbnRfY2VydF9jaGFpbiA9IE5vbmUKCiAgICAgICAgIyBXZSBzYXZlIG9mZiB0aGUgcHJldmlvdXNseS1jb25maWd1cmVkIHRpbWVvdXQgYW5kIHRoZW4gc2V0IGl0IHRvCiAgICAgICAgIyB6ZXJvLiBUaGlzIGlzIGRvbmUgYmVjYXVzZSB3ZSB1c2Ugc2VsZWN0IGFuZCBmcmllbmRzIHRvIGhhbmRsZSB0aGUKICAgICAgICAjIHRpbWVvdXRzLCBidXQgaWYgd2UgbGVhdmUgdGhlIHRpbWVvdXQgc2V0IG9uIHRoZSBsb3dlciBzb2NrZXQgdGhlbgogICAgICAgICMgUHl0aG9uIHdpbGwgImtpbmRseSIgY2FsbCBzZWxlY3Qgb24gdGhhdCBzb2NrZXQgYWdhaW4gZm9yIHVzLiBBdm9pZAogICAgICAgICMgdGhhdCBieSBmb3JjaW5nIHRoZSB0aW1lb3V0IHRvIHplcm8uCiAgICAgICAgc2VsZi5fdGltZW91dCA9IHNlbGYuc29ja2V0LmdldHRpbWVvdXQoKQogICAgICAgIHNlbGYuc29ja2V0LnNldHRpbWVvdXQoMCkKCiAgICBAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgogICAgZGVmIF9yYWlzZV9vbl9lcnJvcihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBBIGNvbnRleHQgbWFuYWdlciB0aGF0IGNhbiBiZSB1c2VkIHRvIHdyYXAgY2FsbHMgdGhhdCBkbyBJL08gZnJvbQogICAgICAgIFNlY3VyZVRyYW5zcG9ydC4gSWYgYW55IG9mIHRoZSBJL08gY2FsbGJhY2tzIGhpdCBhbiBleGNlcHRpb24sIHRoaXMKICAgICAgICBjb250ZXh0IG1hbmFnZXIgd2lsbCBjb3JyZWN0bHkgcHJvcGFnYXRlIHRoZSBleGNlcHRpb24gYWZ0ZXIgdGhlIGZhY3QuCiAgICAgICAgVGhpcyBhdm9pZHMgc2lsZW50bHkgc3dhbGxvd2luZyB0aG9zZSBleGNlcHRpb25zLgoKICAgICAgICBJdCBhbHNvIGNvcnJlY3RseSBmb3JjZXMgdGhlIHNvY2tldCBjbG9zZWQuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5fZXhjZXB0aW9uID0gTm9uZQoKICAgICAgICAjIFdlIGV4cGxpY2l0bHkgZG9uJ3QgY2F0Y2ggYXJvdW5kIHRoaXMgeWllbGQgYmVjYXVzZSBpbiB0aGUgdW5saWtlbHkKICAgICAgICAjIGV2ZW50IHRoYXQgYW4gZXhjZXB0aW9uIHdhcyBoaXQgaW4gdGhlIGJsb2NrIHdlIGRvbid0IHdhbnQgdG8gc3dhbGxvdwogICAgICAgICMgaXQuCiAgICAgICAgeWllbGQKICAgICAgICBpZiBzZWxmLl9leGNlcHRpb24gaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGV4Y2VwdGlvbiwgc2VsZi5fZXhjZXB0aW9uID0gc2VsZi5fZXhjZXB0aW9uLCBOb25lCiAgICAgICAgICAgIHNlbGYuY2xvc2UoKQogICAgICAgICAgICByYWlzZSBleGNlcHRpb24KCiAgICBkZWYgX3NldF9jaXBoZXJzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFNldHMgdXAgdGhlIGFsbG93ZWQgY2lwaGVycy4gQnkgZGVmYXVsdCB0aGlzIG1hdGNoZXMgdGhlIHNldCBpbgogICAgICAgIHV0aWwuc3NsXy5ERUZBVUxUX0NJUEhFUlMsIGF0IGxlYXN0IGFzIHN1cHBvcnRlZCBieSBtYWNPUy4gVGhpcyBpcyBkb25lCiAgICAgICAgY3VzdG9tIGFuZCBkb2Vzbid0IGFsbG93IGNoYW5naW5nIGF0IHRoaXMgdGltZSwgbW9zdGx5IGJlY2F1c2UgcGFyc2luZwogICAgICAgIE9wZW5TU0wgY2lwaGVyIHN0cmluZ3MgaXMgZ29pbmcgdG8gYmUgYSBmcmVha2luZyBuaWdodG1hcmUuCiAgICAgICAgIiIiCiAgICAgICAgY2lwaGVycyA9IChTZWN1cml0eS5TU0xDaXBoZXJTdWl0ZSAqIGxlbihDSVBIRVJfU1VJVEVTKSkoKkNJUEhFUl9TVUlURVMpCiAgICAgICAgcmVzdWx0ID0gU2VjdXJpdHkuU1NMU2V0RW5hYmxlZENpcGhlcnMoCiAgICAgICAgICAgIHNlbGYuY29udGV4dCwgY2lwaGVycywgbGVuKENJUEhFUl9TVUlURVMpCiAgICAgICAgKQogICAgICAgIF9hc3NlcnRfbm9fZXJyb3IocmVzdWx0KQoKICAgIGRlZiBfY3VzdG9tX3ZhbGlkYXRlKHNlbGYsIHZlcmlmeSwgdHJ1c3RfYnVuZGxlKToKICAgICAgICAiIiIKICAgICAgICBDYWxsZWQgd2hlbiB3ZSBoYXZlIHNldCBjdXN0b20gdmFsaWRhdGlvbi4gV2UgZG8gdGhpcyBpbiB0d28gY2FzZXM6CiAgICAgICAgZmlyc3QsIHdoZW4gY2VydCB2YWxpZGF0aW9uIGlzIGVudGlyZWx5IGRpc2FibGVkOyBhbmQgc2Vjb25kLCB3aGVuCiAgICAgICAgdXNpbmcgYSBjdXN0b20gdHJ1c3QgREIuCiAgICAgICAgIiIiCiAgICAgICAgIyBJZiB3ZSBkaXNhYmxlZCBjZXJ0IHZhbGlkYXRpb24sIGp1c3Qgc2F5OiBjb29sLgogICAgICAgIGlmIG5vdCB2ZXJpZnk6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIFdlIHdhbnQgZGF0YSBpbiBtZW1vcnksIHNvIGxvYWQgaXQgdXAuCiAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUodHJ1c3RfYnVuZGxlKToKICAgICAgICAgICAgd2l0aCBvcGVuKHRydXN0X2J1bmRsZSwgJ3JiJykgYXMgZjoKICAgICAgICAgICAgICAgIHRydXN0X2J1bmRsZSA9IGYucmVhZCgpCgogICAgICAgIGNlcnRfYXJyYXkgPSBOb25lCiAgICAgICAgdHJ1c3QgPSBTZWN1cml0eS5TZWNUcnVzdFJlZigpCgogICAgICAgIHRyeToKICAgICAgICAgICAgIyBHZXQgYSBDRkFycmF5IHRoYXQgY29udGFpbnMgdGhlIGNlcnRzIHdlIHdhbnQuCiAgICAgICAgICAgIGNlcnRfYXJyYXkgPSBfY2VydF9hcnJheV9mcm9tX3BlbSh0cnVzdF9idW5kbGUpCgogICAgICAgICAgICAjIE9rLCBub3cgdGhlIGhhcmQgcGFydC4gV2Ugd2FudCB0byBnZXQgdGhlIFNlY1RydXN0UmVmIHRoYXQgU1QgaGFzCiAgICAgICAgICAgICMgY3JlYXRlZCBmb3IgdGhpcyBjb25uZWN0aW9uLCBzaG92ZSBvdXIgQ0FzIGludG8gaXQsIHRlbGwgU1QgdG8KICAgICAgICAgICAgIyBpZ25vcmUgZXZlcnl0aGluZyBlbHNlIGl0IGtub3dzLCBhbmQgdGhlbiBhc2sgaWYgaXQgY2FuIGJ1aWxkIGEKICAgICAgICAgICAgIyBjaGFpbi4gVGhpcyBpcyBhIGJ1dXV1bmNoIG9mIGNvZGUuCiAgICAgICAgICAgIHJlc3VsdCA9IFNlY3VyaXR5LlNTTENvcHlQZWVyVHJ1c3QoCiAgICAgICAgICAgICAgICBzZWxmLmNvbnRleHQsIGN0eXBlcy5ieXJlZih0cnVzdCkKICAgICAgICAgICAgKQogICAgICAgICAgICBfYXNzZXJ0X25vX2Vycm9yKHJlc3VsdCkKICAgICAgICAgICAgaWYgbm90IHRydXN0OgogICAgICAgICAgICAgICAgcmFpc2Ugc3NsLlNTTEVycm9yKCJGYWlsZWQgdG8gY29weSB0cnVzdCByZWZlcmVuY2UiKQoKICAgICAgICAgICAgcmVzdWx0ID0gU2VjdXJpdHkuU2VjVHJ1c3RTZXRBbmNob3JDZXJ0aWZpY2F0ZXModHJ1c3QsIGNlcnRfYXJyYXkpCiAgICAgICAgICAgIF9hc3NlcnRfbm9fZXJyb3IocmVzdWx0KQoKICAgICAgICAgICAgcmVzdWx0ID0gU2VjdXJpdHkuU2VjVHJ1c3RTZXRBbmNob3JDZXJ0aWZpY2F0ZXNPbmx5KHRydXN0LCBUcnVlKQogICAgICAgICAgICBfYXNzZXJ0X25vX2Vycm9yKHJlc3VsdCkKCiAgICAgICAgICAgIHRydXN0X3Jlc3VsdCA9IFNlY3VyaXR5LlNlY1RydXN0UmVzdWx0VHlwZSgpCiAgICAgICAgICAgIHJlc3VsdCA9IFNlY3VyaXR5LlNlY1RydXN0RXZhbHVhdGUoCiAgICAgICAgICAgICAgICB0cnVzdCwgY3R5cGVzLmJ5cmVmKHRydXN0X3Jlc3VsdCkKICAgICAgICAgICAgKQogICAgICAgICAgICBfYXNzZXJ0X25vX2Vycm9yKHJlc3VsdCkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBpZiB0cnVzdDoKICAgICAgICAgICAgICAgIENvcmVGb3VuZGF0aW9uLkNGUmVsZWFzZSh0cnVzdCkKCiAgICAgICAgICAgIGlmIGNlcnRfYXJyYXkgaXMgTm9uZToKICAgICAgICAgICAgICAgIENvcmVGb3VuZGF0aW9uLkNGUmVsZWFzZShjZXJ0X2FycmF5KQoKICAgICAgICAjIE9rLCBub3cgd2UgY2FuIGxvb2sgYXQgd2hhdCB0aGUgcmVzdWx0IHdhcy4KICAgICAgICBzdWNjZXNzZXMgPSAoCiAgICAgICAgICAgIFNlY3VyaXR5Q29uc3Qua1NlY1RydXN0UmVzdWx0VW5zcGVjaWZpZWQsCiAgICAgICAgICAgIFNlY3VyaXR5Q29uc3Qua1NlY1RydXN0UmVzdWx0UHJvY2VlZAogICAgICAgICkKICAgICAgICBpZiB0cnVzdF9yZXN1bHQudmFsdWUgbm90IGluIHN1Y2Nlc3NlczoKICAgICAgICAgICAgcmFpc2Ugc3NsLlNTTEVycm9yKAogICAgICAgICAgICAgICAgImNlcnRpZmljYXRlIHZlcmlmeSBmYWlsZWQsIGVycm9yIGNvZGU6ICVkIiAlCiAgICAgICAgICAgICAgICB0cnVzdF9yZXN1bHQudmFsdWUKICAgICAgICAgICAgKQoKICAgIGRlZiBoYW5kc2hha2Uoc2VsZiwKICAgICAgICAgICAgICAgICAgc2VydmVyX2hvc3RuYW1lLAogICAgICAgICAgICAgICAgICB2ZXJpZnksCiAgICAgICAgICAgICAgICAgIHRydXN0X2J1bmRsZSwKICAgICAgICAgICAgICAgICAgbWluX3ZlcnNpb24sCiAgICAgICAgICAgICAgICAgIG1heF92ZXJzaW9uLAogICAgICAgICAgICAgICAgICBjbGllbnRfY2VydCwKICAgICAgICAgICAgICAgICAgY2xpZW50X2tleSwKICAgICAgICAgICAgICAgICAgY2xpZW50X2tleV9wYXNzcGhyYXNlKToKICAgICAgICAiIiIKICAgICAgICBBY3R1YWxseSBwZXJmb3JtcyB0aGUgVExTIGhhbmRzaGFrZS4gVGhpcyBpcyBydW4gYXV0b21hdGljYWxseSBieQogICAgICAgIHdyYXBwZWQgc29ja2V0LCBhbmQgc2hvdWxkbid0IGJlIG5lZWRlZCBpbiB1c2VyIGNvZGUuCiAgICAgICAgIiIiCiAgICAgICAgIyBGaXJzdCwgd2UgZG8gdGhlIGluaXRpYWwgYml0cyBvZiBjb25uZWN0aW9uIHNldHVwLiBXZSBuZWVkIHRvIGNyZWF0ZQogICAgICAgICMgYSBjb250ZXh0LCBzZXQgaXRzIEkvTyBmdW5jcywgYW5kIHNldCB0aGUgY29ubmVjdGlvbiByZWZlcmVuY2UuCiAgICAgICAgc2VsZi5jb250ZXh0ID0gU2VjdXJpdHkuU1NMQ3JlYXRlQ29udGV4dCgKICAgICAgICAgICAgTm9uZSwgU2VjdXJpdHlDb25zdC5rU1NMQ2xpZW50U2lkZSwgU2VjdXJpdHlDb25zdC5rU1NMU3RyZWFtVHlwZQogICAgICAgICkKICAgICAgICByZXN1bHQgPSBTZWN1cml0eS5TU0xTZXRJT0Z1bmNzKAogICAgICAgICAgICBzZWxmLmNvbnRleHQsIF9yZWFkX2NhbGxiYWNrX3BvaW50ZXIsIF93cml0ZV9jYWxsYmFja19wb2ludGVyCiAgICAgICAgKQogICAgICAgIF9hc3NlcnRfbm9fZXJyb3IocmVzdWx0KQoKICAgICAgICAjIEhlcmUgd2UgbmVlZCB0byBjb21wdXRlIHRoZSBoYW5kbGUgdG8gdXNlLiBXZSBkbyB0aGlzIGJ5IHRha2luZyB0aGUKICAgICAgICAjIGlkIG9mIHNlbGYgbW9kdWxvIDIqKjMxIC0gMS4gSWYgdGhpcyBpcyBhbHJlYWR5IGluIHRoZSBkaWN0aW9uYXJ5LCB3ZQogICAgICAgICMganVzdCBrZWVwIGluY3JlbWVudGluZyBieSBvbmUgdW50aWwgd2UgZmluZCBhIGZyZWUgc3BhY2UuCiAgICAgICAgd2l0aCBfY29ubmVjdGlvbl9yZWZfbG9jazoKICAgICAgICAgICAgaGFuZGxlID0gaWQoc2VsZikgJSAyMTQ3NDgzNjQ3CiAgICAgICAgICAgIHdoaWxlIGhhbmRsZSBpbiBfY29ubmVjdGlvbl9yZWZzOgogICAgICAgICAgICAgICAgaGFuZGxlID0gKGhhbmRsZSArIDEpICUgMjE0NzQ4MzY0NwogICAgICAgICAgICBfY29ubmVjdGlvbl9yZWZzW2hhbmRsZV0gPSBzZWxmCgogICAgICAgIHJlc3VsdCA9IFNlY3VyaXR5LlNTTFNldENvbm5lY3Rpb24oc2VsZi5jb250ZXh0LCBoYW5kbGUpCiAgICAgICAgX2Fzc2VydF9ub19lcnJvcihyZXN1bHQpCgogICAgICAgICMgSWYgd2UgaGF2ZSBhIHNlcnZlciBob3N0bmFtZSwgd2Ugc2hvdWxkIHNldCB0aGF0IHRvby4KICAgICAgICBpZiBzZXJ2ZXJfaG9zdG5hbWU6CiAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHNlcnZlcl9ob3N0bmFtZSwgYnl0ZXMpOgogICAgICAgICAgICAgICAgc2VydmVyX2hvc3RuYW1lID0gc2VydmVyX2hvc3RuYW1lLmVuY29kZSgndXRmLTgnKQoKICAgICAgICAgICAgcmVzdWx0ID0gU2VjdXJpdHkuU1NMU2V0UGVlckRvbWFpbk5hbWUoCiAgICAgICAgICAgICAgICBzZWxmLmNvbnRleHQsIHNlcnZlcl9ob3N0bmFtZSwgbGVuKHNlcnZlcl9ob3N0bmFtZSkKICAgICAgICAgICAgKQogICAgICAgICAgICBfYXNzZXJ0X25vX2Vycm9yKHJlc3VsdCkKCiAgICAgICAgIyBTZXR1cCB0aGUgY2lwaGVycy4KICAgICAgICBzZWxmLl9zZXRfY2lwaGVycygpCgogICAgICAgICMgU2V0IHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIFRMUyB2ZXJzaW9ucy4KICAgICAgICByZXN1bHQgPSBTZWN1cml0eS5TU0xTZXRQcm90b2NvbFZlcnNpb25NaW4oc2VsZi5jb250ZXh0LCBtaW5fdmVyc2lvbikKICAgICAgICBfYXNzZXJ0X25vX2Vycm9yKHJlc3VsdCkKICAgICAgICByZXN1bHQgPSBTZWN1cml0eS5TU0xTZXRQcm90b2NvbFZlcnNpb25NYXgoc2VsZi5jb250ZXh0LCBtYXhfdmVyc2lvbikKICAgICAgICBfYXNzZXJ0X25vX2Vycm9yKHJlc3VsdCkKCiAgICAgICAgIyBJZiB0aGVyZSdzIGEgdHJ1c3QgREIsIHdlIG5lZWQgdG8gdXNlIGl0LiBXZSBkbyB0aGF0IGJ5IHRlbGxpbmcKICAgICAgICAjIFNlY3VyZVRyYW5zcG9ydCB0byBicmVhayBvbiBzZXJ2ZXIgYXV0aC4gV2UgYWxzbyBkbyB0aGF0IGlmIHdlIGRvbid0CiAgICAgICAgIyB3YW50IHRvIHZhbGlkYXRlIHRoZSBjZXJ0cyBhdCBhbGw6IHdlIGp1c3Qgd29uJ3QgYWN0dWFsbHkgZG8gYW55CiAgICAgICAgIyBhdXRoaW5nIGluIHRoYXQgY2FzZS4KICAgICAgICBpZiBub3QgdmVyaWZ5IG9yIHRydXN0X2J1bmRsZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmVzdWx0ID0gU2VjdXJpdHkuU1NMU2V0U2Vzc2lvbk9wdGlvbigKICAgICAgICAgICAgICAgIHNlbGYuY29udGV4dCwKICAgICAgICAgICAgICAgIFNlY3VyaXR5Q29uc3Qua1NTTFNlc3Npb25PcHRpb25CcmVha09uU2VydmVyQXV0aCwKICAgICAgICAgICAgICAgIFRydWUKICAgICAgICAgICAgKQogICAgICAgICAgICBfYXNzZXJ0X25vX2Vycm9yKHJlc3VsdCkKCiAgICAgICAgIyBJZiB0aGVyZSdzIGEgY2xpZW50IGNlcnQsIHdlIG5lZWQgdG8gdXNlIGl0LgogICAgICAgIGlmIGNsaWVudF9jZXJ0OgogICAgICAgICAgICBzZWxmLl9rZXljaGFpbiwgc2VsZi5fa2V5Y2hhaW5fZGlyID0gX3RlbXBvcmFyeV9rZXljaGFpbigpCiAgICAgICAgICAgIHNlbGYuX2NsaWVudF9jZXJ0X2NoYWluID0gX2xvYWRfY2xpZW50X2NlcnRfY2hhaW4oCiAgICAgICAgICAgICAgICBzZWxmLl9rZXljaGFpbiwgY2xpZW50X2NlcnQsIGNsaWVudF9rZXkKICAgICAgICAgICAgKQogICAgICAgICAgICByZXN1bHQgPSBTZWN1cml0eS5TU0xTZXRDZXJ0aWZpY2F0ZSgKICAgICAgICAgICAgICAgIHNlbGYuY29udGV4dCwgc2VsZi5fY2xpZW50X2NlcnRfY2hhaW4KICAgICAgICAgICAgKQogICAgICAgICAgICBfYXNzZXJ0X25vX2Vycm9yKHJlc3VsdCkKCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgd2l0aCBzZWxmLl9yYWlzZV9vbl9lcnJvcigpOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gU2VjdXJpdHkuU1NMSGFuZHNoYWtlKHNlbGYuY29udGV4dCkKCiAgICAgICAgICAgICAgICBpZiByZXN1bHQgPT0gU2VjdXJpdHlDb25zdC5lcnJTU0xXb3VsZEJsb2NrOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIHNvY2tldC50aW1lb3V0KCJoYW5kc2hha2UgdGltZWQgb3V0IikKICAgICAgICAgICAgICAgIGVsaWYgcmVzdWx0ID09IFNlY3VyaXR5Q29uc3QuZXJyU1NMU2VydmVyQXV0aENvbXBsZXRlZDoKICAgICAgICAgICAgICAgICAgICBzZWxmLl9jdXN0b21fdmFsaWRhdGUodmVyaWZ5LCB0cnVzdF9idW5kbGUpCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgX2Fzc2VydF9ub19lcnJvcihyZXN1bHQpCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKCiAgICBkZWYgZmlsZW5vKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnNvY2tldC5maWxlbm8oKQoKICAgICMgQ29weS1wYXN0ZWQgZnJvbSBQeXRob24gMy41IHNvdXJjZSBjb2RlCiAgICBkZWYgX2RlY3JlZl9zb2NrZXRpb3Moc2VsZik6CiAgICAgICAgaWYgc2VsZi5fbWFrZWZpbGVfcmVmcyA+IDA6CiAgICAgICAgICAgIHNlbGYuX21ha2VmaWxlX3JlZnMgLT0gMQogICAgICAgIGlmIHNlbGYuX2Nsb3NlZDoKICAgICAgICAgICAgc2VsZi5jbG9zZSgpCgogICAgZGVmIHJlY3Yoc2VsZiwgYnVmc2l6KToKICAgICAgICBidWZmZXIgPSBjdHlwZXMuY3JlYXRlX3N0cmluZ19idWZmZXIoYnVmc2l6KQogICAgICAgIGJ5dGVzX3JlYWQgPSBzZWxmLnJlY3ZfaW50byhidWZmZXIsIGJ1ZnNpeikKICAgICAgICBkYXRhID0gYnVmZmVyWzpieXRlc19yZWFkXQogICAgICAgIHJldHVybiBkYXRhCgogICAgZGVmIHJlY3ZfaW50byhzZWxmLCBidWZmZXIsIG5ieXRlcz1Ob25lKToKICAgICAgICAjIFJlYWQgc2hvcnQgb24gRU9GLgogICAgICAgIGlmIHNlbGYuX2Nsb3NlZDoKICAgICAgICAgICAgcmV0dXJuIDAKCiAgICAgICAgaWYgbmJ5dGVzIGlzIE5vbmU6CiAgICAgICAgICAgIG5ieXRlcyA9IGxlbihidWZmZXIpCgogICAgICAgIGJ1ZmZlciA9IChjdHlwZXMuY19jaGFyICogbmJ5dGVzKS5mcm9tX2J1ZmZlcihidWZmZXIpCiAgICAgICAgcHJvY2Vzc2VkX2J5dGVzID0gY3R5cGVzLmNfc2l6ZV90KDApCgogICAgICAgIHdpdGggc2VsZi5fcmFpc2Vfb25fZXJyb3IoKToKICAgICAgICAgICAgcmVzdWx0ID0gU2VjdXJpdHkuU1NMUmVhZCgKICAgICAgICAgICAgICAgIHNlbGYuY29udGV4dCwgYnVmZmVyLCBuYnl0ZXMsIGN0eXBlcy5ieXJlZihwcm9jZXNzZWRfYnl0ZXMpCiAgICAgICAgICAgICkKCiAgICAgICAgIyBUaGVyZSBhcmUgc29tZSByZXN1bHQgY29kZXMgdGhhdCB3ZSB3YW50IHRvIHRyZWF0IGFzICJub3QgYWx3YXlzCiAgICAgICAgIyBlcnJvcnMiLiBTcGVjaWZpY2FsbHksIHRob3NlIGFyZSBlcnJTU0xXb3VsZEJsb2NrLAogICAgICAgICMgZXJyU1NMQ2xvc2VkR3JhY2VmdWwsIGFuZCBlcnJTU0xDbG9zZWROb05vdGlmeS4KICAgICAgICBpZiAocmVzdWx0ID09IFNlY3VyaXR5Q29uc3QuZXJyU1NMV291bGRCbG9jayk6CiAgICAgICAgICAgICMgSWYgd2UgZGlkbid0IHByb2Nlc3MgYW55IGJ5dGVzLCB0aGVuIHRoaXMgd2FzIGp1c3QgYSB0aW1lIG91dC4KICAgICAgICAgICAgIyBIb3dldmVyLCB3ZSBjYW4gZ2V0IGVyclNTTFdvdWxkQmxvY2sgaW4gc2l0dWF0aW9ucyB3aGVuIHdlICpkaWQqCiAgICAgICAgICAgICMgcmVhZCBzb21lIGRhdGEsIGFuZCBpbiB0aG9zZSBjYXNlcyB3ZSBzaG91bGQganVzdCByZWFkICJzaG9ydCIKICAgICAgICAgICAgIyBhbmQgcmV0dXJuLgogICAgICAgICAgICBpZiBwcm9jZXNzZWRfYnl0ZXMudmFsdWUgPT0gMDoKICAgICAgICAgICAgICAgICMgVGltZWQgb3V0LCBubyBkYXRhIHJlYWQuCiAgICAgICAgICAgICAgICByYWlzZSBzb2NrZXQudGltZW91dCgicmVjdiB0aW1lZCBvdXQiKQogICAgICAgIGVsaWYgcmVzdWx0IGluIChTZWN1cml0eUNvbnN0LmVyclNTTENsb3NlZEdyYWNlZnVsLCBTZWN1cml0eUNvbnN0LmVyclNTTENsb3NlZE5vTm90aWZ5KToKICAgICAgICAgICAgIyBUaGUgcmVtb3RlIHBlZXIgaGFzIGNsb3NlZCB0aGlzIGNvbm5lY3Rpb24uIFdlIHNob3VsZCBkbyBzbyBhcwogICAgICAgICAgICAjIHdlbGwuIE5vdGUgdGhhdCB3ZSBkb24ndCBhY3R1YWxseSByZXR1cm4gaGVyZSBiZWNhdXNlIGluCiAgICAgICAgICAgICMgcHJpbmNpcGxlIHRoaXMgY291bGQgYWN0dWFsbHkgYmUgZmlyZWQgYWxvbmcgd2l0aCByZXR1cm4gZGF0YS4KICAgICAgICAgICAgIyBJdCdzIHVubGlrZWx5IHRob3VnaC4KICAgICAgICAgICAgc2VsZi5jbG9zZSgpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgX2Fzc2VydF9ub19lcnJvcihyZXN1bHQpCgogICAgICAgICMgT2ssIHdlIHJlYWQgYW5kIHByb2JhYmx5IHN1Y2NlZWRlZC4gV2Ugc2hvdWxkIHJldHVybiB3aGF0ZXZlciBkYXRhCiAgICAgICAgIyB3YXMgYWN0dWFsbHkgcmVhZC4KICAgICAgICByZXR1cm4gcHJvY2Vzc2VkX2J5dGVzLnZhbHVlCgogICAgZGVmIHNldHRpbWVvdXQoc2VsZiwgdGltZW91dCk6CiAgICAgICAgc2VsZi5fdGltZW91dCA9IHRpbWVvdXQKCiAgICBkZWYgZ2V0dGltZW91dChzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fdGltZW91dAoKICAgIGRlZiBzZW5kKHNlbGYsIGRhdGEpOgogICAgICAgIHByb2Nlc3NlZF9ieXRlcyA9IGN0eXBlcy5jX3NpemVfdCgwKQoKICAgICAgICB3aXRoIHNlbGYuX3JhaXNlX29uX2Vycm9yKCk6CiAgICAgICAgICAgIHJlc3VsdCA9IFNlY3VyaXR5LlNTTFdyaXRlKAogICAgICAgICAgICAgICAgc2VsZi5jb250ZXh0LCBkYXRhLCBsZW4oZGF0YSksIGN0eXBlcy5ieXJlZihwcm9jZXNzZWRfYnl0ZXMpCiAgICAgICAgICAgICkKCiAgICAgICAgaWYgcmVzdWx0ID09IFNlY3VyaXR5Q29uc3QuZXJyU1NMV291bGRCbG9jayBhbmQgcHJvY2Vzc2VkX2J5dGVzLnZhbHVlID09IDA6CiAgICAgICAgICAgICMgVGltZWQgb3V0CiAgICAgICAgICAgIHJhaXNlIHNvY2tldC50aW1lb3V0KCJzZW5kIHRpbWVkIG91dCIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgX2Fzc2VydF9ub19lcnJvcihyZXN1bHQpCgogICAgICAgICMgV2Ugc2VudCwgYW5kIHByb2JhYmx5IHN1Y2NlZWRlZC4gVGVsbCB0aGVtIGhvdyBtdWNoIHdlIHNlbnQuCiAgICAgICAgcmV0dXJuIHByb2Nlc3NlZF9ieXRlcy52YWx1ZQoKICAgIGRlZiBzZW5kYWxsKHNlbGYsIGRhdGEpOgogICAgICAgIHRvdGFsX3NlbnQgPSAwCiAgICAgICAgd2hpbGUgdG90YWxfc2VudCA8IGxlbihkYXRhKToKICAgICAgICAgICAgc2VudCA9IHNlbGYuc2VuZChkYXRhW3RvdGFsX3NlbnQ6dG90YWxfc2VudCArIFNTTF9XUklURV9CTE9DS1NJWkVdKQogICAgICAgICAgICB0b3RhbF9zZW50ICs9IHNlbnQKCiAgICBkZWYgc2h1dGRvd24oc2VsZik6CiAgICAgICAgd2l0aCBzZWxmLl9yYWlzZV9vbl9lcnJvcigpOgogICAgICAgICAgICBTZWN1cml0eS5TU0xDbG9zZShzZWxmLmNvbnRleHQpCgogICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgICMgVE9ETzogc2hvdWxkIEkgZG8gY2xlYW4gc2h1dGRvd24gaGVyZT8gRG8gSSBoYXZlIHRvPwogICAgICAgIGlmIHNlbGYuX21ha2VmaWxlX3JlZnMgPCAxOgogICAgICAgICAgICBzZWxmLl9jbG9zZWQgPSBUcnVlCiAgICAgICAgICAgIGlmIHNlbGYuY29udGV4dDoKICAgICAgICAgICAgICAgIENvcmVGb3VuZGF0aW9uLkNGUmVsZWFzZShzZWxmLmNvbnRleHQpCiAgICAgICAgICAgICAgICBzZWxmLmNvbnRleHQgPSBOb25lCiAgICAgICAgICAgIGlmIHNlbGYuX2NsaWVudF9jZXJ0X2NoYWluOgogICAgICAgICAgICAgICAgQ29yZUZvdW5kYXRpb24uQ0ZSZWxlYXNlKHNlbGYuX2NsaWVudF9jZXJ0X2NoYWluKQogICAgICAgICAgICAgICAgc2VsZi5fY2xpZW50X2NlcnRfY2hhaW4gPSBOb25lCiAgICAgICAgICAgIGlmIHNlbGYuX2tleWNoYWluOgogICAgICAgICAgICAgICAgU2VjdXJpdHkuU2VjS2V5Y2hhaW5EZWxldGUoc2VsZi5fa2V5Y2hhaW4pCiAgICAgICAgICAgICAgICBDb3JlRm91bmRhdGlvbi5DRlJlbGVhc2Uoc2VsZi5fa2V5Y2hhaW4pCiAgICAgICAgICAgICAgICBzaHV0aWwucm10cmVlKHNlbGYuX2tleWNoYWluX2RpcikKICAgICAgICAgICAgICAgIHNlbGYuX2tleWNoYWluID0gc2VsZi5fa2V5Y2hhaW5fZGlyID0gTm9uZQogICAgICAgICAgICByZXR1cm4gc2VsZi5zb2NrZXQuY2xvc2UoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuX21ha2VmaWxlX3JlZnMgLT0gMQoKICAgIGRlZiBnZXRwZWVyY2VydChzZWxmLCBiaW5hcnlfZm9ybT1GYWxzZSk6CiAgICAgICAgIyBVcmdoLCBhbm5veWluZy4KICAgICAgICAjCiAgICAgICAgIyBIZXJlJ3MgaG93IHdlIGRvIHRoaXM6CiAgICAgICAgIwogICAgICAgICMgMS4gQ2FsbCBTU0xDb3B5UGVlclRydXN0IHRvIGdldCBob2xkIG9mIHRoZSB0cnVzdCBvYmplY3QgZm9yIHRoaXMKICAgICAgICAjICAgIGNvbm5lY3Rpb24uCiAgICAgICAgIyAyLiBDYWxsIFNlY1RydXN0R2V0Q2VydGlmaWNhdGVBdEluZGV4IGZvciBpbmRleCAwIHRvIGdldCB0aGUgbGVhZi4KICAgICAgICAjIDMuIFRvIGdldCB0aGUgQ04sIGNhbGwgU2VjQ2VydGlmaWNhdGVDb3B5Q29tbW9uTmFtZSBhbmQgcHJvY2VzcyB0aGF0CiAgICAgICAgIyAgICBzdHJpbmcgc28gdGhhdCBpdCdzIG9mIHRoZSBhcHByb3ByaWF0ZSB0eXBlLgogICAgICAgICMgNC4gVG8gZ2V0IHRoZSBTQU4sIHdlIG5lZWQgdG8gZG8gc29tZXRoaW5nIGEgYml0IG1vcmUgY29tcGxleDoKICAgICAgICAjICAgIGEuIENhbGwgU2VjQ2VydGlmaWNhdGVDb3B5VmFsdWVzIHRvIGdldCB0aGUgZGF0YSwgcmVxdWVzdGluZwogICAgICAgICMgICAgICAga1NlY09JRFN1YmplY3RBbHROYW1lLgogICAgICAgICMgICAgYi4gTWVzcyBhYm91dCB3aXRoIHRoaXMgZGljdGlvbmFyeSB0byB0cnkgdG8gZ2V0IHRoZSBTQU5zIG91dC4KICAgICAgICAjCiAgICAgICAgIyBUaGlzIGlzIGdyb3NzLiBSZWFsbHkgZ3Jvc3MuIEl0J3MgZ29pbmcgdG8gYmUgYSBmZXcgaHVuZHJlZCBMb0MgZXh0cmEKICAgICAgICAjIGp1c3QgdG8gcmVwZWF0IHNvbWV0aGluZyB0aGF0IFNlY3VyZVRyYW5zcG9ydCBjYW4gKmFscmVhZHkgZG8qLiBTbyBteQogICAgICAgICMgb3BlcmF0aW5nIGFzc3VtcHRpb24gYXQgdGhpcyB0aW1lIGlzIHRoYXQgd2hhdCB3ZSB3YW50IHRvIGRvIGlzCiAgICAgICAgIyBpbnN0ZWFkIHRvIGp1c3QgZmxhZyB0byB1cmxsaWIzIHRoYXQgaXQgc2hvdWxkbid0IGRvIGl0cyBvd24gaG9zdG5hbWUKICAgICAgICAjIHZhbGlkYXRpb24gd2hlbiB1c2luZyBTZWN1cmVUcmFuc3BvcnQuCiAgICAgICAgaWYgbm90IGJpbmFyeV9mb3JtOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICAgICAgICAgIlNlY3VyZVRyYW5zcG9ydCBvbmx5IHN1cHBvcnRzIGR1bXBpbmcgYmluYXJ5IGNlcnRzIgogICAgICAgICAgICApCiAgICAgICAgdHJ1c3QgPSBTZWN1cml0eS5TZWNUcnVzdFJlZigpCiAgICAgICAgY2VydGRhdGEgPSBOb25lCiAgICAgICAgZGVyX2J5dGVzID0gTm9uZQoKICAgICAgICB0cnk6CiAgICAgICAgICAgICMgR3JhYiB0aGUgdHJ1c3Qgc3RvcmUuCiAgICAgICAgICAgIHJlc3VsdCA9IFNlY3VyaXR5LlNTTENvcHlQZWVyVHJ1c3QoCiAgICAgICAgICAgICAgICBzZWxmLmNvbnRleHQsIGN0eXBlcy5ieXJlZih0cnVzdCkKICAgICAgICAgICAgKQogICAgICAgICAgICBfYXNzZXJ0X25vX2Vycm9yKHJlc3VsdCkKICAgICAgICAgICAgaWYgbm90IHRydXN0OgogICAgICAgICAgICAgICAgIyBQcm9iYWJseSB3ZSBoYXZlbid0IGRvbmUgdGhlIGhhbmRzaGFrZSB5ZXQuIE5vIGJpZ2dpZS4KICAgICAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgICAgICBjZXJ0X2NvdW50ID0gU2VjdXJpdHkuU2VjVHJ1c3RHZXRDZXJ0aWZpY2F0ZUNvdW50KHRydXN0KQogICAgICAgICAgICBpZiBub3QgY2VydF9jb3VudDoKICAgICAgICAgICAgICAgICMgQWxzbyBhIGNhc2UgdGhhdCBtaWdodCBoYXBwZW4gaWYgd2UgaGF2ZW4ndCBoYW5kc2hha2VkLgogICAgICAgICAgICAgICAgIyBIYW5kc2hvb2s/IEhhbmRzaGFrZW4/CiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICAgICAgbGVhZiA9IFNlY3VyaXR5LlNlY1RydXN0R2V0Q2VydGlmaWNhdGVBdEluZGV4KHRydXN0LCAwKQogICAgICAgICAgICBhc3NlcnQgbGVhZgoKICAgICAgICAgICAgIyBPaywgbm93IHdlIHdhbnQgdGhlIERFUiBieXRlcy4KICAgICAgICAgICAgY2VydGRhdGEgPSBTZWN1cml0eS5TZWNDZXJ0aWZpY2F0ZUNvcHlEYXRhKGxlYWYpCiAgICAgICAgICAgIGFzc2VydCBjZXJ0ZGF0YQoKICAgICAgICAgICAgZGF0YV9sZW5ndGggPSBDb3JlRm91bmRhdGlvbi5DRkRhdGFHZXRMZW5ndGgoY2VydGRhdGEpCiAgICAgICAgICAgIGRhdGFfYnVmZmVyID0gQ29yZUZvdW5kYXRpb24uQ0ZEYXRhR2V0Qnl0ZVB0cihjZXJ0ZGF0YSkKICAgICAgICAgICAgZGVyX2J5dGVzID0gY3R5cGVzLnN0cmluZ19hdChkYXRhX2J1ZmZlciwgZGF0YV9sZW5ndGgpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgaWYgY2VydGRhdGE6CiAgICAgICAgICAgICAgICBDb3JlRm91bmRhdGlvbi5DRlJlbGVhc2UoY2VydGRhdGEpCiAgICAgICAgICAgIGlmIHRydXN0OgogICAgICAgICAgICAgICAgQ29yZUZvdW5kYXRpb24uQ0ZSZWxlYXNlKHRydXN0KQoKICAgICAgICByZXR1cm4gZGVyX2J5dGVzCgogICAgZGVmIF9yZXVzZShzZWxmKToKICAgICAgICBzZWxmLl9tYWtlZmlsZV9yZWZzICs9IDEKCiAgICBkZWYgX2Ryb3Aoc2VsZik6CiAgICAgICAgaWYgc2VsZi5fbWFrZWZpbGVfcmVmcyA8IDE6CiAgICAgICAgICAgIHNlbGYuY2xvc2UoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuX21ha2VmaWxlX3JlZnMgLT0gMQoKCmlmIF9maWxlb2JqZWN0OiAgIyBQbGF0Zm9ybS1zcGVjaWZpYzogUHl0aG9uIDIKICAgIGRlZiBtYWtlZmlsZShzZWxmLCBtb2RlLCBidWZzaXplPS0xKToKICAgICAgICBzZWxmLl9tYWtlZmlsZV9yZWZzICs9IDEKICAgICAgICByZXR1cm4gX2ZpbGVvYmplY3Qoc2VsZiwgbW9kZSwgYnVmc2l6ZSwgY2xvc2U9VHJ1ZSkKZWxzZTogICMgUGxhdGZvcm0tc3BlY2lmaWM6IFB5dGhvbiAzCiAgICBkZWYgbWFrZWZpbGUoc2VsZiwgbW9kZT0iciIsIGJ1ZmZlcmluZz1Ob25lLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICMgV2UgZGlzYWJsZSBidWZmZXJpbmcgd2l0aCBTZWN1cmVUcmFuc3BvcnQgYmVjYXVzZSBpdCBjb25mbGljdHMgd2l0aAogICAgICAgICMgdGhlIGJ1ZmZlcmluZyB0aGF0IFNUIGRvZXMgaW50ZXJuYWxseSAoc2VlIGlzc3VlICMxMTUzIGZvciBtb3JlKS4KICAgICAgICBidWZmZXJpbmcgPSAwCiAgICAgICAgcmV0dXJuIGJhY2twb3J0X21ha2VmaWxlKHNlbGYsIG1vZGUsIGJ1ZmZlcmluZywgKmFyZ3MsICoqa3dhcmdzKQoKV3JhcHBlZFNvY2tldC5tYWtlZmlsZSA9IG1ha2VmaWxlCgoKY2xhc3MgU2VjdXJlVHJhbnNwb3J0Q29udGV4dChvYmplY3QpOgogICAgIiIiCiAgICBJIGFtIGEgd3JhcHBlciBjbGFzcyBmb3IgdGhlIFNlY3VyZVRyYW5zcG9ydCBsaWJyYXJ5LCB0byB0cmFuc2xhdGUgdGhlCiAgICBpbnRlcmZhY2Ugb2YgdGhlIHN0YW5kYXJkIGxpYnJhcnkgYGBTU0xDb250ZXh0YGAgb2JqZWN0IHRvIGNhbGxzIGludG8KICAgIFNlY3VyZVRyYW5zcG9ydC4KICAgICIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHByb3RvY29sKToKICAgICAgICBzZWxmLl9taW5fdmVyc2lvbiwgc2VsZi5fbWF4X3ZlcnNpb24gPSBfcHJvdG9jb2xfdG9fbWluX21heFtwcm90b2NvbF0KICAgICAgICBzZWxmLl9vcHRpb25zID0gMAogICAgICAgIHNlbGYuX3ZlcmlmeSA9IEZhbHNlCiAgICAgICAgc2VsZi5fdHJ1c3RfYnVuZGxlID0gTm9uZQogICAgICAgIHNlbGYuX2NsaWVudF9jZXJ0ID0gTm9uZQogICAgICAgIHNlbGYuX2NsaWVudF9rZXkgPSBOb25lCiAgICAgICAgc2VsZi5fY2xpZW50X2tleV9wYXNzcGhyYXNlID0gTm9uZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGNoZWNrX2hvc3RuYW1lKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFNlY3VyZVRyYW5zcG9ydCBjYW5ub3QgaGF2ZSBpdHMgaG9zdG5hbWUgY2hlY2tpbmcgZGlzYWJsZWQuIEZvciBtb3JlLAogICAgICAgIHNlZSB0aGUgY29tbWVudCBvbiBnZXRwZWVyY2VydCgpIGluIHRoaXMgZmlsZS4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIEBjaGVja19ob3N0bmFtZS5zZXR0ZXIKICAgIGRlZiBjaGVja19ob3N0bmFtZShzZWxmLCB2YWx1ZSk6CiAgICAgICAgIiIiCiAgICAgICAgU2VjdXJlVHJhbnNwb3J0IGNhbm5vdCBoYXZlIGl0cyBob3N0bmFtZSBjaGVja2luZyBkaXNhYmxlZC4gRm9yIG1vcmUsCiAgICAgICAgc2VlIHRoZSBjb21tZW50IG9uIGdldHBlZXJjZXJ0KCkgaW4gdGhpcyBmaWxlLgogICAgICAgICIiIgogICAgICAgIHBhc3MKCiAgICBAcHJvcGVydHkKICAgIGRlZiBvcHRpb25zKHNlbGYpOgogICAgICAgICMgVE9ETzogV2VsbCwgY3JhcC4KICAgICAgICAjCiAgICAgICAgIyBTbyB0aGlzIGlzIHRoZSBiaXQgb2YgdGhlIGNvZGUgdGhhdCBpcyB0aGUgbW9zdCBsaWtlbHkgdG8gY2F1c2UgdXMKICAgICAgICAjIHRyb3VibGUuIEVzc2VudGlhbGx5IHdlIG5lZWQgdG8gZW51bWVyYXRlIGFsbCBvZiB0aGUgU1NMIG9wdGlvbnMgdGhhdAogICAgICAgICMgdXNlcnMgbWlnaHQgd2FudCB0byB1c2UgYW5kIHRyeSB0byBzZWUgaWYgd2UgY2FuIHNlbnNpYmx5IHRyYW5zbGF0ZQogICAgICAgICMgdGhlbSwgb3Igd2hldGhlciB3ZSBzaG91bGQganVzdCBpZ25vcmUgdGhlbS4KICAgICAgICByZXR1cm4gc2VsZi5fb3B0aW9ucwoKICAgIEBvcHRpb25zLnNldHRlcgogICAgZGVmIG9wdGlvbnMoc2VsZiwgdmFsdWUpOgogICAgICAgICMgVE9ETzogVXBkYXRlIGluIGxpbmUgd2l0aCBhYm92ZS4KICAgICAgICBzZWxmLl9vcHRpb25zID0gdmFsdWUKCiAgICBAcHJvcGVydHkKICAgIGRlZiB2ZXJpZnlfbW9kZShzZWxmKToKICAgICAgICByZXR1cm4gc3NsLkNFUlRfUkVRVUlSRUQgaWYgc2VsZi5fdmVyaWZ5IGVsc2Ugc3NsLkNFUlRfTk9ORQoKICAgIEB2ZXJpZnlfbW9kZS5zZXR0ZXIKICAgIGRlZiB2ZXJpZnlfbW9kZShzZWxmLCB2YWx1ZSk6CiAgICAgICAgc2VsZi5fdmVyaWZ5ID0gVHJ1ZSBpZiB2YWx1ZSA9PSBzc2wuQ0VSVF9SRVFVSVJFRCBlbHNlIEZhbHNlCgogICAgZGVmIHNldF9kZWZhdWx0X3ZlcmlmeV9wYXRocyhzZWxmKToKICAgICAgICAjIFNvLCB0aGlzIGhhcyB0byBkbyBzb21ldGhpbmcgYSBiaXQgd2VpcmQuIFNwZWNpZmljYWxseSwgd2hhdCBpdCBkb2VzCiAgICAgICAgIyBpcyBub3RoaW5nLgogICAgICAgICMKICAgICAgICAjIFRoaXMgbWVhbnMgdGhhdCwgaWYgd2UgaGFkIHByZXZpb3VzbHkgaGFkIGxvYWRfdmVyaWZ5X2xvY2F0aW9ucwogICAgICAgICMgY2FsbGVkLCB0aGlzIGRvZXMgbm90IHVuZG8gdGhhdC4gV2UgbmVlZCB0byBkbyB0aGF0IGJlY2F1c2UgaXQgdHVybnMKICAgICAgICAjIG91dCB0aGF0IHRoZSByZXN0IG9mIHRoZSB1cmxsaWIzIGNvZGUgd2lsbCBhdHRlbXB0IHRvIGxvYWQgdGhlCiAgICAgICAgIyBkZWZhdWx0IHZlcmlmeSBwYXRocyBpZiBpdCBoYXNuJ3QgYmVlbiB0b2xkIGFib3V0IGFueSBwYXRocywgZXZlbiBpZgogICAgICAgICMgdGhlIGNvbnRleHQgaXRzZWxmIHdhcyBzb21ldGltZSBlYXJsaWVyLiBXZSByZXNvbHZlIHRoYXQgYnkganVzdAogICAgICAgICMgaWdub3JpbmcgaXQuCiAgICAgICAgcGFzcwoKICAgIGRlZiBsb2FkX2RlZmF1bHRfY2VydHMoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuc2V0X2RlZmF1bHRfdmVyaWZ5X3BhdGhzKCkKCiAgICBkZWYgc2V0X2NpcGhlcnMoc2VsZiwgY2lwaGVycyk6CiAgICAgICAgIyBGb3Igbm93LCB3ZSBqdXN0IHJlcXVpcmUgdGhlIGRlZmF1bHQgY2lwaGVyIHN0cmluZy4KICAgICAgICBpZiBjaXBoZXJzICE9IHV0aWwuc3NsXy5ERUZBVUxUX0NJUEhFUlM6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCiAgICAgICAgICAgICAgICAiU2VjdXJlVHJhbnNwb3J0IGRvZXNuJ3Qgc3VwcG9ydCBjdXN0b20gY2lwaGVyIHN0cmluZ3MiCiAgICAgICAgICAgICkKCiAgICBkZWYgbG9hZF92ZXJpZnlfbG9jYXRpb25zKHNlbGYsIGNhZmlsZT1Ob25lLCBjYXBhdGg9Tm9uZSwgY2FkYXRhPU5vbmUpOgogICAgICAgICMgT0ssIHdlIG9ubHkgcmVhbGx5IHN1cHBvcnQgY2FkYXRhIGFuZCBjYWZpbGUuCiAgICAgICAgaWYgY2FwYXRoIGlzIG5vdCBOb25lOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICAgICAgICAgIlNlY3VyZVRyYW5zcG9ydCBkb2VzIG5vdCBzdXBwb3J0IGNlcnQgZGlyZWN0b3JpZXMiCiAgICAgICAgICAgICkKCiAgICAgICAgc2VsZi5fdHJ1c3RfYnVuZGxlID0gY2FmaWxlIG9yIGNhZGF0YQoKICAgIGRlZiBsb2FkX2NlcnRfY2hhaW4oc2VsZiwgY2VydGZpbGUsIGtleWZpbGU9Tm9uZSwgcGFzc3dvcmQ9Tm9uZSk6CiAgICAgICAgc2VsZi5fY2xpZW50X2NlcnQgPSBjZXJ0ZmlsZQogICAgICAgIHNlbGYuX2NsaWVudF9rZXkgPSBrZXlmaWxlCiAgICAgICAgc2VsZi5fY2xpZW50X2NlcnRfcGFzc3BocmFzZSA9IHBhc3N3b3JkCgogICAgZGVmIHdyYXBfc29ja2V0KHNlbGYsIHNvY2ssIHNlcnZlcl9zaWRlPUZhbHNlLAogICAgICAgICAgICAgICAgICAgIGRvX2hhbmRzaGFrZV9vbl9jb25uZWN0PVRydWUsIHN1cHByZXNzX3JhZ2dlZF9lb2ZzPVRydWUsCiAgICAgICAgICAgICAgICAgICAgc2VydmVyX2hvc3RuYW1lPU5vbmUpOgogICAgICAgICMgU28sIHdoYXQgZG8gd2UgZG8gaGVyZT8gRmlyc3RseSwgd2UgYXNzZXJ0IHNvbWUgcHJvcGVydGllcy4gVGhpcyBpcyBhCiAgICAgICAgIyBzdHJpcHBlZCBkb3duIHNoaW0sIHNvIHRoZXJlIGlzIHNvbWUgZnVuY3Rpb25hbGl0eSB3ZSBkb24ndCBzdXBwb3J0LgogICAgICAgICMgU2VlIFBFUCA1NDMgZm9yIHRoZSByZWFsIGRlYWwuCiAgICAgICAgYXNzZXJ0IG5vdCBzZXJ2ZXJfc2lkZQogICAgICAgIGFzc2VydCBkb19oYW5kc2hha2Vfb25fY29ubmVjdAogICAgICAgIGFzc2VydCBzdXBwcmVzc19yYWdnZWRfZW9mcwoKICAgICAgICAjIE9rLCB3ZSdyZSBnb29kIHRvIGdvLiBOb3cgd2Ugd2FudCB0byBjcmVhdGUgdGhlIHdyYXBwZWQgc29ja2V0IG9iamVjdAogICAgICAgICMgYW5kIHN0b3JlIGl0IGluIHRoZSBhcHByb3ByaWF0ZSBwbGFjZS4KICAgICAgICB3cmFwcGVkX3NvY2tldCA9IFdyYXBwZWRTb2NrZXQoc29jaykKCiAgICAgICAgIyBOb3cgd2UgY2FuIGhhbmRzaGFrZQogICAgICAgIHdyYXBwZWRfc29ja2V0LmhhbmRzaGFrZSgKICAgICAgICAgICAgc2VydmVyX2hvc3RuYW1lLCBzZWxmLl92ZXJpZnksIHNlbGYuX3RydXN0X2J1bmRsZSwKICAgICAgICAgICAgc2VsZi5fbWluX3ZlcnNpb24sIHNlbGYuX21heF92ZXJzaW9uLCBzZWxmLl9jbGllbnRfY2VydCwKICAgICAgICAgICAgc2VsZi5fY2xpZW50X2tleSwgc2VsZi5fY2xpZW50X2tleV9wYXNzcGhyYXNlCiAgICAgICAgKQogICAgICAgIHJldHVybiB3cmFwcGVkX3NvY2tldApQSwMEFAAAAAAAAAAhANBTKZkzGAAAMxgAADQAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9jb250cmliL3NvY2tzLnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KIiIiClRoaXMgbW9kdWxlIGNvbnRhaW5zIHByb3Zpc2lvbmFsIHN1cHBvcnQgZm9yIFNPQ0tTIHByb3hpZXMgZnJvbSB3aXRoaW4KdXJsbGliMy4gVGhpcyBtb2R1bGUgc3VwcG9ydHMgU09DS1M0IChzcGVjaWZpY2FsbHkgdGhlIFNPQ0tTNEEgdmFyaWFudCkgYW5kClNPQ0tTNS4gVG8gZW5hYmxlIGl0cyBmdW5jdGlvbmFsaXR5LCBlaXRoZXIgaW5zdGFsbCBQeVNvY2tzIG9yIGluc3RhbGwgdGhpcwptb2R1bGUgd2l0aCB0aGUgYGBzb2Nrc2BgIGV4dHJhLgoKVGhlIFNPQ0tTIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIHRoZSBmdWxsIHJhbmdlIG9mIHVybGxpYjMgZmVhdHVyZXMuIEl0IGFsc28Kc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBTT0NLUyBmZWF0dXJlczoKCi0gU09DS1M0Ci0gU09DS1M0YQotIFNPQ0tTNQotIFVzZXJuYW1lcyBhbmQgcGFzc3dvcmRzIGZvciB0aGUgU09DS1MgcHJveHkKCktub3duIExpbWl0YXRpb25zOgoKLSBDdXJyZW50bHkgUHlTb2NrcyBkb2VzIG5vdCBzdXBwb3J0IGNvbnRhY3RpbmcgcmVtb3RlIHdlYnNpdGVzIHZpYSBsaXRlcmFsCiAgSVB2NiBhZGRyZXNzZXMuIEFueSBzdWNoIGNvbm5lY3Rpb24gYXR0ZW1wdCB3aWxsIGZhaWwuIFlvdSBtdXN0IHVzZSBhIGRvbWFpbgogIG5hbWUuCi0gQ3VycmVudGx5IFB5U29ja3MgZG9lcyBub3Qgc3VwcG9ydCBJUHY2IGNvbm5lY3Rpb25zIHRvIHRoZSBTT0NLUyBwcm94eS4gQW55CiAgc3VjaCBjb25uZWN0aW9uIGF0dGVtcHQgd2lsbCBmYWlsLgoiIiIKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCnRyeToKICAgIGltcG9ydCBzb2NrcwpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBpbXBvcnQgd2FybmluZ3MKICAgIGZyb20gLi5leGNlcHRpb25zIGltcG9ydCBEZXBlbmRlbmN5V2FybmluZwoKICAgIHdhcm5pbmdzLndhcm4oKAogICAgICAgICdTT0NLUyBzdXBwb3J0IGluIHVybGxpYjMgcmVxdWlyZXMgdGhlIGluc3RhbGxhdGlvbiBvZiBvcHRpb25hbCAnCiAgICAgICAgJ2RlcGVuZGVuY2llczogc3BlY2lmaWNhbGx5LCBQeVNvY2tzLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSAnCiAgICAgICAgJ2h0dHBzOi8vdXJsbGliMy5yZWFkdGhlZG9jcy5pby9lbi9sYXRlc3QvY29udHJpYi5odG1sI3NvY2tzLXByb3hpZXMnCiAgICAgICAgKSwKICAgICAgICBEZXBlbmRlbmN5V2FybmluZwogICAgKQogICAgcmFpc2UKCmZyb20gc29ja2V0IGltcG9ydCBlcnJvciBhcyBTb2NrZXRFcnJvciwgdGltZW91dCBhcyBTb2NrZXRUaW1lb3V0Cgpmcm9tIC4uY29ubmVjdGlvbiBpbXBvcnQgKAogICAgSFRUUENvbm5lY3Rpb24sIEhUVFBTQ29ubmVjdGlvbgopCmZyb20gLi5jb25uZWN0aW9ucG9vbCBpbXBvcnQgKAogICAgSFRUUENvbm5lY3Rpb25Qb29sLCBIVFRQU0Nvbm5lY3Rpb25Qb29sCikKZnJvbSAuLmV4Y2VwdGlvbnMgaW1wb3J0IENvbm5lY3RUaW1lb3V0RXJyb3IsIE5ld0Nvbm5lY3Rpb25FcnJvcgpmcm9tIC4ucG9vbG1hbmFnZXIgaW1wb3J0IFBvb2xNYW5hZ2VyCmZyb20gLi51dGlsLnVybCBpbXBvcnQgcGFyc2VfdXJsCgp0cnk6CiAgICBpbXBvcnQgc3NsCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIHNzbCA9IE5vbmUKCgpjbGFzcyBTT0NLU0Nvbm5lY3Rpb24oSFRUUENvbm5lY3Rpb24pOgogICAgIiIiCiAgICBBIHBsYWluLXRleHQgSFRUUCBjb25uZWN0aW9uIHRoYXQgY29ubmVjdHMgdmlhIGEgU09DS1MgcHJveHkuCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgIHNlbGYuX3NvY2tzX29wdGlvbnMgPSBrd2FyZ3MucG9wKCdfc29ja3Nfb3B0aW9ucycpCiAgICAgICAgc3VwZXIoU09DS1NDb25uZWN0aW9uLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpCgogICAgZGVmIF9uZXdfY29ubihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBFc3RhYmxpc2ggYSBuZXcgY29ubmVjdGlvbiB2aWEgdGhlIFNPQ0tTIHByb3h5LgogICAgICAgICIiIgogICAgICAgIGV4dHJhX2t3ID0ge30KICAgICAgICBpZiBzZWxmLnNvdXJjZV9hZGRyZXNzOgogICAgICAgICAgICBleHRyYV9rd1snc291cmNlX2FkZHJlc3MnXSA9IHNlbGYuc291cmNlX2FkZHJlc3MKCiAgICAgICAgaWYgc2VsZi5zb2NrZXRfb3B0aW9uczoKICAgICAgICAgICAgZXh0cmFfa3dbJ3NvY2tldF9vcHRpb25zJ10gPSBzZWxmLnNvY2tldF9vcHRpb25zCgogICAgICAgIHRyeToKICAgICAgICAgICAgY29ubiA9IHNvY2tzLmNyZWF0ZV9jb25uZWN0aW9uKAogICAgICAgICAgICAgICAgKHNlbGYuaG9zdCwgc2VsZi5wb3J0KSwKICAgICAgICAgICAgICAgIHByb3h5X3R5cGU9c2VsZi5fc29ja3Nfb3B0aW9uc1snc29ja3NfdmVyc2lvbiddLAogICAgICAgICAgICAgICAgcHJveHlfYWRkcj1zZWxmLl9zb2Nrc19vcHRpb25zWydwcm94eV9ob3N0J10sCiAgICAgICAgICAgICAgICBwcm94eV9wb3J0PXNlbGYuX3NvY2tzX29wdGlvbnNbJ3Byb3h5X3BvcnQnXSwKICAgICAgICAgICAgICAgIHByb3h5X3VzZXJuYW1lPXNlbGYuX3NvY2tzX29wdGlvbnNbJ3VzZXJuYW1lJ10sCiAgICAgICAgICAgICAgICBwcm94eV9wYXNzd29yZD1zZWxmLl9zb2Nrc19vcHRpb25zWydwYXNzd29yZCddLAogICAgICAgICAgICAgICAgcHJveHlfcmRucz1zZWxmLl9zb2Nrc19vcHRpb25zWydyZG5zJ10sCiAgICAgICAgICAgICAgICB0aW1lb3V0PXNlbGYudGltZW91dCwKICAgICAgICAgICAgICAgICoqZXh0cmFfa3cKICAgICAgICAgICAgKQoKICAgICAgICBleGNlcHQgU29ja2V0VGltZW91dCBhcyBlOgogICAgICAgICAgICByYWlzZSBDb25uZWN0VGltZW91dEVycm9yKAogICAgICAgICAgICAgICAgc2VsZiwgIkNvbm5lY3Rpb24gdG8gJXMgdGltZWQgb3V0LiAoY29ubmVjdCB0aW1lb3V0PSVzKSIgJQogICAgICAgICAgICAgICAgKHNlbGYuaG9zdCwgc2VsZi50aW1lb3V0KSkKCiAgICAgICAgZXhjZXB0IHNvY2tzLlByb3h5RXJyb3IgYXMgZToKICAgICAgICAgICAgIyBUaGlzIGlzIGZyYWdpbGUgYXMgaGVsbCwgYnV0IGl0IHNlZW1zIHRvIGJlIHRoZSBvbmx5IHdheSB0byByYWlzZQogICAgICAgICAgICAjIHVzZWZ1bCBlcnJvcnMgaGVyZS4KICAgICAgICAgICAgaWYgZS5zb2NrZXRfZXJyOgogICAgICAgICAgICAgICAgZXJyb3IgPSBlLnNvY2tldF9lcnIKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXJyb3IsIFNvY2tldFRpbWVvdXQpOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIENvbm5lY3RUaW1lb3V0RXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYsCiAgICAgICAgICAgICAgICAgICAgICAgICJDb25uZWN0aW9uIHRvICVzIHRpbWVkIG91dC4gKGNvbm5lY3QgdGltZW91dD0lcykiICUKICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYuaG9zdCwgc2VsZi50aW1lb3V0KQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgTmV3Q29ubmVjdGlvbkVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLAogICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGVzdGFibGlzaCBhIG5ldyBjb25uZWN0aW9uOiAlcyIgJSBlcnJvcgogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJhaXNlIE5ld0Nvbm5lY3Rpb25FcnJvcigKICAgICAgICAgICAgICAgICAgICBzZWxmLAogICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZXN0YWJsaXNoIGEgbmV3IGNvbm5lY3Rpb246ICVzIiAlIGUKICAgICAgICAgICAgICAgICkKCiAgICAgICAgZXhjZXB0IFNvY2tldEVycm9yIGFzIGU6ICAjIERlZmVuc2l2ZTogUHlTb2NrcyBzaG91bGQgY2F0Y2ggYWxsIHRoZXNlLgogICAgICAgICAgICByYWlzZSBOZXdDb25uZWN0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICBzZWxmLCAiRmFpbGVkIHRvIGVzdGFibGlzaCBhIG5ldyBjb25uZWN0aW9uOiAlcyIgJSBlKQoKICAgICAgICByZXR1cm4gY29ubgoKCiMgV2UgZG9uJ3QgbmVlZCB0byBkdXBsaWNhdGUgdGhlIFZlcmlmaWVkL1VudmVyaWZpZWQgZGlzdGluY3Rpb24gZnJvbQojIHVybGxpYjMvY29ubmVjdGlvbi5weSBoZXJlIGJlY2F1c2UgdGhlIEhUVFBTQ29ubmVjdGlvbiB3aWxsIGFscmVhZHkgaGF2ZSBiZWVuCiMgY29ycmVjdGx5IHNldCB0byBlaXRoZXIgdGhlIFZlcmlmaWVkIG9yIFVudmVyaWZpZWQgZm9ybSBieSB0aGF0IG1vZHVsZS4gVGhpcwojIG1lYW5zIHRoZSBTT0NLU0hUVFBTQ29ubmVjdGlvbiB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgdGhlIGNvcnJlY3QgdHlwZS4KY2xhc3MgU09DS1NIVFRQU0Nvbm5lY3Rpb24oU09DS1NDb25uZWN0aW9uLCBIVFRQU0Nvbm5lY3Rpb24pOgogICAgcGFzcwoKCmNsYXNzIFNPQ0tTSFRUUENvbm5lY3Rpb25Qb29sKEhUVFBDb25uZWN0aW9uUG9vbCk6CiAgICBDb25uZWN0aW9uQ2xzID0gU09DS1NDb25uZWN0aW9uCgoKY2xhc3MgU09DS1NIVFRQU0Nvbm5lY3Rpb25Qb29sKEhUVFBTQ29ubmVjdGlvblBvb2wpOgogICAgQ29ubmVjdGlvbkNscyA9IFNPQ0tTSFRUUFNDb25uZWN0aW9uCgoKY2xhc3MgU09DS1NQcm94eU1hbmFnZXIoUG9vbE1hbmFnZXIpOgogICAgIiIiCiAgICBBIHZlcnNpb24gb2YgdGhlIHVybGxpYjMgUHJveHlNYW5hZ2VyIHRoYXQgcm91dGVzIGNvbm5lY3Rpb25zIHZpYSB0aGUKICAgIGRlZmluZWQgU09DS1MgcHJveHkuCiAgICAiIiIKICAgIHBvb2xfY2xhc3Nlc19ieV9zY2hlbWUgPSB7CiAgICAgICAgJ2h0dHAnOiBTT0NLU0hUVFBDb25uZWN0aW9uUG9vbCwKICAgICAgICAnaHR0cHMnOiBTT0NLU0hUVFBTQ29ubmVjdGlvblBvb2wsCiAgICB9CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHByb3h5X3VybCwgdXNlcm5hbWU9Tm9uZSwgcGFzc3dvcmQ9Tm9uZSwKICAgICAgICAgICAgICAgICBudW1fcG9vbHM9MTAsIGhlYWRlcnM9Tm9uZSwgKipjb25uZWN0aW9uX3Bvb2xfa3cpOgogICAgICAgIHBhcnNlZCA9IHBhcnNlX3VybChwcm94eV91cmwpCgogICAgICAgIGlmIHBhcnNlZC5zY2hlbWUgPT0gJ3NvY2tzNSc6CiAgICAgICAgICAgIHNvY2tzX3ZlcnNpb24gPSBzb2Nrcy5QUk9YWV9UWVBFX1NPQ0tTNQogICAgICAgICAgICByZG5zID0gRmFsc2UKICAgICAgICBlbGlmIHBhcnNlZC5zY2hlbWUgPT0gJ3NvY2tzNWgnOgogICAgICAgICAgICBzb2Nrc192ZXJzaW9uID0gc29ja3MuUFJPWFlfVFlQRV9TT0NLUzUKICAgICAgICAgICAgcmRucyA9IFRydWUKICAgICAgICBlbGlmIHBhcnNlZC5zY2hlbWUgPT0gJ3NvY2tzNCc6CiAgICAgICAgICAgIHNvY2tzX3ZlcnNpb24gPSBzb2Nrcy5QUk9YWV9UWVBFX1NPQ0tTNAogICAgICAgICAgICByZG5zID0gRmFsc2UKICAgICAgICBlbGlmIHBhcnNlZC5zY2hlbWUgPT0gJ3NvY2tzNGEnOgogICAgICAgICAgICBzb2Nrc192ZXJzaW9uID0gc29ja3MuUFJPWFlfVFlQRV9TT0NLUzQKICAgICAgICAgICAgcmRucyA9IFRydWUKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICAgICAgICAgIlVuYWJsZSB0byBkZXRlcm1pbmUgU09DS1MgdmVyc2lvbiBmcm9tICVzIiAlIHByb3h5X3VybAogICAgICAgICAgICApCgogICAgICAgIHNlbGYucHJveHlfdXJsID0gcHJveHlfdXJsCgogICAgICAgIHNvY2tzX29wdGlvbnMgPSB7CiAgICAgICAgICAgICdzb2Nrc192ZXJzaW9uJzogc29ja3NfdmVyc2lvbiwKICAgICAgICAgICAgJ3Byb3h5X2hvc3QnOiBwYXJzZWQuaG9zdCwKICAgICAgICAgICAgJ3Byb3h5X3BvcnQnOiBwYXJzZWQucG9ydCwKICAgICAgICAgICAgJ3VzZXJuYW1lJzogdXNlcm5hbWUsCiAgICAgICAgICAgICdwYXNzd29yZCc6IHBhc3N3b3JkLAogICAgICAgICAgICAncmRucyc6IHJkbnMKICAgICAgICB9CiAgICAgICAgY29ubmVjdGlvbl9wb29sX2t3Wydfc29ja3Nfb3B0aW9ucyddID0gc29ja3Nfb3B0aW9ucwoKICAgICAgICBzdXBlcihTT0NLU1Byb3h5TWFuYWdlciwgc2VsZikuX19pbml0X18oCiAgICAgICAgICAgIG51bV9wb29scywgaGVhZGVycywgKipjb25uZWN0aW9uX3Bvb2xfa3cKICAgICAgICApCgogICAgICAgIHNlbGYucG9vbF9jbGFzc2VzX2J5X3NjaGVtZSA9IFNPQ0tTUHJveHlNYW5hZ2VyLnBvb2xfY2xhc3Nlc19ieV9zY2hlbWUKUEsDBBQAAAAAAAAAIQDymskDyxkAAMsZAAAxAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvZXhjZXB0aW9ucy5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CmZyb20gLnBhY2thZ2VzLnNpeC5tb3Zlcy5odHRwX2NsaWVudCBpbXBvcnQgKAogICAgSW5jb21wbGV0ZVJlYWQgYXMgaHR0cGxpYl9JbmNvbXBsZXRlUmVhZAopCiMgQmFzZSBFeGNlcHRpb25zCgoKY2xhc3MgSFRUUEVycm9yKEV4Y2VwdGlvbik6CiAgICAiQmFzZSBleGNlcHRpb24gdXNlZCBieSB0aGlzIG1vZHVsZS4iCiAgICBwYXNzCgoKY2xhc3MgSFRUUFdhcm5pbmcoV2FybmluZyk6CiAgICAiQmFzZSB3YXJuaW5nIHVzZWQgYnkgdGhpcyBtb2R1bGUuIgogICAgcGFzcwoKCmNsYXNzIFBvb2xFcnJvcihIVFRQRXJyb3IpOgogICAgIkJhc2UgZXhjZXB0aW9uIGZvciBlcnJvcnMgY2F1c2VkIHdpdGhpbiBhIHBvb2wuIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHBvb2wsIG1lc3NhZ2UpOgogICAgICAgIHNlbGYucG9vbCA9IHBvb2wKICAgICAgICBIVFRQRXJyb3IuX19pbml0X18oc2VsZiwgIiVzOiAlcyIgJSAocG9vbCwgbWVzc2FnZSkpCgogICAgZGVmIF9fcmVkdWNlX18oc2VsZik6CiAgICAgICAgIyBGb3IgcGlja2xpbmcgcHVycG9zZXMuCiAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fLCAoTm9uZSwgTm9uZSkKCgpjbGFzcyBSZXF1ZXN0RXJyb3IoUG9vbEVycm9yKToKICAgICJCYXNlIGV4Y2VwdGlvbiBmb3IgUG9vbEVycm9ycyB0aGF0IGhhdmUgYXNzb2NpYXRlZCBVUkxzLiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwb29sLCB1cmwsIG1lc3NhZ2UpOgogICAgICAgIHNlbGYudXJsID0gdXJsCiAgICAgICAgUG9vbEVycm9yLl9faW5pdF9fKHNlbGYsIHBvb2wsIG1lc3NhZ2UpCgogICAgZGVmIF9fcmVkdWNlX18oc2VsZik6CiAgICAgICAgIyBGb3IgcGlja2xpbmcgcHVycG9zZXMuCiAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fLCAoTm9uZSwgc2VsZi51cmwsIE5vbmUpCgoKY2xhc3MgU1NMRXJyb3IoSFRUUEVycm9yKToKICAgICJSYWlzZWQgd2hlbiBTU0wgY2VydGlmaWNhdGUgZmFpbHMgaW4gYW4gSFRUUFMgY29ubmVjdGlvbi4iCiAgICBwYXNzCgoKY2xhc3MgUHJveHlFcnJvcihIVFRQRXJyb3IpOgogICAgIlJhaXNlZCB3aGVuIHRoZSBjb25uZWN0aW9uIHRvIGEgcHJveHkgZmFpbHMuIgogICAgcGFzcwoKCmNsYXNzIERlY29kZUVycm9yKEhUVFBFcnJvcik6CiAgICAiUmFpc2VkIHdoZW4gYXV0b21hdGljIGRlY29kaW5nIGJhc2VkIG9uIENvbnRlbnQtVHlwZSBmYWlscy4iCiAgICBwYXNzCgoKY2xhc3MgUHJvdG9jb2xFcnJvcihIVFRQRXJyb3IpOgogICAgIlJhaXNlZCB3aGVuIHNvbWV0aGluZyB1bmV4cGVjdGVkIGhhcHBlbnMgbWlkLXJlcXVlc3QvcmVzcG9uc2UuIgogICAgcGFzcwoKCiM6IFJlbmFtZWQgdG8gUHJvdG9jb2xFcnJvciBidXQgYWxpYXNlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCkNvbm5lY3Rpb25FcnJvciA9IFByb3RvY29sRXJyb3IKCgojIExlYWYgRXhjZXB0aW9ucwoKY2xhc3MgTWF4UmV0cnlFcnJvcihSZXF1ZXN0RXJyb3IpOgogICAgIiIiUmFpc2VkIHdoZW4gdGhlIG1heGltdW0gbnVtYmVyIG9mIHJldHJpZXMgaXMgZXhjZWVkZWQuCgogICAgOnBhcmFtIHBvb2w6IFRoZSBjb25uZWN0aW9uIHBvb2wKICAgIDp0eXBlIHBvb2w6IDpjbGFzczpgfnVybGxpYjMuY29ubmVjdGlvbnBvb2wuSFRUUENvbm5lY3Rpb25Qb29sYAogICAgOnBhcmFtIHN0cmluZyB1cmw6IFRoZSByZXF1ZXN0ZWQgVXJsCiAgICA6cGFyYW0gZXhjZXB0aW9ucy5FeGNlcHRpb24gcmVhc29uOiBUaGUgdW5kZXJseWluZyBlcnJvcgoKICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwb29sLCB1cmwsIHJlYXNvbj1Ob25lKToKICAgICAgICBzZWxmLnJlYXNvbiA9IHJlYXNvbgoKICAgICAgICBtZXNzYWdlID0gIk1heCByZXRyaWVzIGV4Y2VlZGVkIHdpdGggdXJsOiAlcyAoQ2F1c2VkIGJ5ICVyKSIgJSAoCiAgICAgICAgICAgIHVybCwgcmVhc29uKQoKICAgICAgICBSZXF1ZXN0RXJyb3IuX19pbml0X18oc2VsZiwgcG9vbCwgdXJsLCBtZXNzYWdlKQoKCmNsYXNzIEhvc3RDaGFuZ2VkRXJyb3IoUmVxdWVzdEVycm9yKToKICAgICJSYWlzZWQgd2hlbiBhbiBleGlzdGluZyBwb29sIGdldHMgYSByZXF1ZXN0IGZvciBhIGZvcmVpZ24gaG9zdC4iCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHBvb2wsIHVybCwgcmV0cmllcz0zKToKICAgICAgICBtZXNzYWdlID0gIlRyaWVkIHRvIG9wZW4gYSBmb3JlaWduIGhvc3Qgd2l0aCB1cmw6ICVzIiAlIHVybAogICAgICAgIFJlcXVlc3RFcnJvci5fX2luaXRfXyhzZWxmLCBwb29sLCB1cmwsIG1lc3NhZ2UpCiAgICAgICAgc2VsZi5yZXRyaWVzID0gcmV0cmllcwoKCmNsYXNzIFRpbWVvdXRTdGF0ZUVycm9yKEhUVFBFcnJvcik6CiAgICAiIiIgUmFpc2VkIHdoZW4gcGFzc2luZyBhbiBpbnZhbGlkIHN0YXRlIHRvIGEgdGltZW91dCAiIiIKICAgIHBhc3MKCgpjbGFzcyBUaW1lb3V0RXJyb3IoSFRUUEVycm9yKToKICAgICIiIiBSYWlzZWQgd2hlbiBhIHNvY2tldCB0aW1lb3V0IGVycm9yIG9jY3Vycy4KCiAgICBDYXRjaGluZyB0aGlzIGVycm9yIHdpbGwgY2F0Y2ggYm90aCA6ZXhjOmBSZWFkVGltZW91dEVycm9ycwogICAgPFJlYWRUaW1lb3V0RXJyb3I+YCBhbmQgOmV4YzpgQ29ubmVjdFRpbWVvdXRFcnJvcnMgPENvbm5lY3RUaW1lb3V0RXJyb3I+YC4KICAgICIiIgogICAgcGFzcwoKCmNsYXNzIFJlYWRUaW1lb3V0RXJyb3IoVGltZW91dEVycm9yLCBSZXF1ZXN0RXJyb3IpOgogICAgIlJhaXNlZCB3aGVuIGEgc29ja2V0IHRpbWVvdXQgb2NjdXJzIHdoaWxlIHJlY2VpdmluZyBkYXRhIGZyb20gYSBzZXJ2ZXIiCiAgICBwYXNzCgoKIyBUaGlzIHRpbWVvdXQgZXJyb3IgZG9lcyBub3QgaGF2ZSBhIFVSTCBhdHRhY2hlZCBhbmQgbmVlZHMgdG8gaW5oZXJpdCBmcm9tIHRoZQojIGJhc2UgSFRUUEVycm9yCmNsYXNzIENvbm5lY3RUaW1lb3V0RXJyb3IoVGltZW91dEVycm9yKToKICAgICJSYWlzZWQgd2hlbiBhIHNvY2tldCB0aW1lb3V0IG9jY3VycyB3aGlsZSBjb25uZWN0aW5nIHRvIGEgc2VydmVyIgogICAgcGFzcwoKCmNsYXNzIE5ld0Nvbm5lY3Rpb25FcnJvcihDb25uZWN0VGltZW91dEVycm9yLCBQb29sRXJyb3IpOgogICAgIlJhaXNlZCB3aGVuIHdlIGZhaWwgdG8gZXN0YWJsaXNoIGEgbmV3IGNvbm5lY3Rpb24uIFVzdWFsbHkgRUNPTk5SRUZVU0VELiIKICAgIHBhc3MKCgpjbGFzcyBFbXB0eVBvb2xFcnJvcihQb29sRXJyb3IpOgogICAgIlJhaXNlZCB3aGVuIGEgcG9vbCBydW5zIG91dCBvZiBjb25uZWN0aW9ucyBhbmQgbm8gbW9yZSBhcmUgYWxsb3dlZC4iCiAgICBwYXNzCgoKY2xhc3MgQ2xvc2VkUG9vbEVycm9yKFBvb2xFcnJvcik6CiAgICAiUmFpc2VkIHdoZW4gYSByZXF1ZXN0IGVudGVycyBhIHBvb2wgYWZ0ZXIgdGhlIHBvb2wgaGFzIGJlZW4gY2xvc2VkLiIKICAgIHBhc3MKCgpjbGFzcyBMb2NhdGlvblZhbHVlRXJyb3IoVmFsdWVFcnJvciwgSFRUUEVycm9yKToKICAgICJSYWlzZWQgd2hlbiB0aGVyZSBpcyBzb21ldGhpbmcgd3Jvbmcgd2l0aCBhIGdpdmVuIFVSTCBpbnB1dC4iCiAgICBwYXNzCgoKY2xhc3MgTG9jYXRpb25QYXJzZUVycm9yKExvY2F0aW9uVmFsdWVFcnJvcik6CiAgICAiUmFpc2VkIHdoZW4gZ2V0X2hvc3Qgb3Igc2ltaWxhciBmYWlscyB0byBwYXJzZSB0aGUgVVJMIGlucHV0LiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbG9jYXRpb24pOgogICAgICAgIG1lc3NhZ2UgPSAiRmFpbGVkIHRvIHBhcnNlOiAlcyIgJSBsb2NhdGlvbgogICAgICAgIEhUVFBFcnJvci5fX2luaXRfXyhzZWxmLCBtZXNzYWdlKQoKICAgICAgICBzZWxmLmxvY2F0aW9uID0gbG9jYXRpb24KCgpjbGFzcyBSZXNwb25zZUVycm9yKEhUVFBFcnJvcik6CiAgICAiVXNlZCBhcyBhIGNvbnRhaW5lciBmb3IgYW4gZXJyb3IgcmVhc29uIHN1cHBsaWVkIGluIGEgTWF4UmV0cnlFcnJvci4iCiAgICBHRU5FUklDX0VSUk9SID0gJ3RvbyBtYW55IGVycm9yIHJlc3BvbnNlcycKICAgIFNQRUNJRklDX0VSUk9SID0gJ3RvbyBtYW55IHtzdGF0dXNfY29kZX0gZXJyb3IgcmVzcG9uc2VzJwoKCmNsYXNzIFNlY3VyaXR5V2FybmluZyhIVFRQV2FybmluZyk6CiAgICAiV2FybmVkIHdoZW4gcGVyZm9taW5nIHNlY3VyaXR5IHJlZHVjaW5nIGFjdGlvbnMiCiAgICBwYXNzCgoKY2xhc3MgU3ViamVjdEFsdE5hbWVXYXJuaW5nKFNlY3VyaXR5V2FybmluZyk6CiAgICAiV2FybmVkIHdoZW4gY29ubmVjdGluZyB0byBhIGhvc3Qgd2l0aCBhIGNlcnRpZmljYXRlIG1pc3NpbmcgYSBTQU4uIgogICAgcGFzcwoKCmNsYXNzIEluc2VjdXJlUmVxdWVzdFdhcm5pbmcoU2VjdXJpdHlXYXJuaW5nKToKICAgICJXYXJuZWQgd2hlbiBtYWtpbmcgYW4gdW52ZXJpZmllZCBIVFRQUyByZXF1ZXN0LiIKICAgIHBhc3MKCgpjbGFzcyBTeXN0ZW1UaW1lV2FybmluZyhTZWN1cml0eVdhcm5pbmcpOgogICAgIldhcm5lZCB3aGVuIHN5c3RlbSB0aW1lIGlzIHN1c3BlY3RlZCB0byBiZSB3cm9uZyIKICAgIHBhc3MKCgpjbGFzcyBJbnNlY3VyZVBsYXRmb3JtV2FybmluZyhTZWN1cml0eVdhcm5pbmcpOgogICAgIldhcm5lZCB3aGVuIGNlcnRhaW4gU1NMIGNvbmZpZ3VyYXRpb24gaXMgbm90IGF2YWlsYWJsZSBvbiBhIHBsYXRmb3JtLiIKICAgIHBhc3MKCgpjbGFzcyBTTklNaXNzaW5nV2FybmluZyhIVFRQV2FybmluZyk6CiAgICAiV2FybmVkIHdoZW4gbWFraW5nIGEgSFRUUFMgcmVxdWVzdCB3aXRob3V0IFNOSSBhdmFpbGFibGUuIgogICAgcGFzcwoKCmNsYXNzIERlcGVuZGVuY3lXYXJuaW5nKEhUVFBXYXJuaW5nKToKICAgICIiIgogICAgV2FybmVkIHdoZW4gYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIGltcG9ydCBhIG1vZHVsZSB3aXRoIG1pc3Npbmcgb3B0aW9uYWwKICAgIGRlcGVuZGVuY2llcy4KICAgICIiIgogICAgcGFzcwoKCmNsYXNzIFJlc3BvbnNlTm90Q2h1bmtlZChQcm90b2NvbEVycm9yLCBWYWx1ZUVycm9yKToKICAgICJSZXNwb25zZSBuZWVkcyB0byBiZSBjaHVua2VkIGluIG9yZGVyIHRvIHJlYWQgaXQgYXMgY2h1bmtzLiIKICAgIHBhc3MKCgpjbGFzcyBCb2R5Tm90SHR0cGxpYkNvbXBhdGlibGUoSFRUUEVycm9yKToKICAgICIiIgogICAgQm9keSBzaG91bGQgYmUgaHR0cGxpYi5IVFRQUmVzcG9uc2UgbGlrZSAoaGF2ZSBhbiBmcCBhdHRyaWJ1dGUgd2hpY2gKICAgIHJldHVybnMgcmF3IGNodW5rcykgZm9yIHJlYWRfY2h1bmtlZCgpLgogICAgIiIiCiAgICBwYXNzCgoKY2xhc3MgSW5jb21wbGV0ZVJlYWQoSFRUUEVycm9yLCBodHRwbGliX0luY29tcGxldGVSZWFkKToKICAgICIiIgogICAgUmVzcG9uc2UgbGVuZ3RoIGRvZXNuJ3QgbWF0Y2ggZXhwZWN0ZWQgQ29udGVudC1MZW5ndGgKCiAgICBTdWJjbGFzcyBvZiBodHRwX2NsaWVudC5JbmNvbXBsZXRlUmVhZCB0byBhbGxvdyBpbnQgdmFsdWUKICAgIGZvciBgcGFydGlhbGAgdG8gYXZvaWQgY3JlYXRpbmcgbGFyZ2Ugb2JqZWN0cyBvbiBzdHJlYW1lZAogICAgcmVhZHMuCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJ0aWFsLCBleHBlY3RlZCk6CiAgICAgICAgc3VwZXIoSW5jb21wbGV0ZVJlYWQsIHNlbGYpLl9faW5pdF9fKHBhcnRpYWwsIGV4cGVjdGVkKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gKCdJbmNvbXBsZXRlUmVhZCglaSBieXRlcyByZWFkLCAnCiAgICAgICAgICAgICAgICAnJWkgbW9yZSBleHBlY3RlZCknICUgKHNlbGYucGFydGlhbCwgc2VsZi5leHBlY3RlZCkpCgoKY2xhc3MgSW52YWxpZEhlYWRlcihIVFRQRXJyb3IpOgogICAgIlRoZSBoZWFkZXIgcHJvdmlkZWQgd2FzIHNvbWVob3cgaW52YWxpZC4iCiAgICBwYXNzCgoKY2xhc3MgUHJveHlTY2hlbWVVbmtub3duKEFzc2VydGlvbkVycm9yLCBWYWx1ZUVycm9yKToKICAgICJQcm94eU1hbmFnZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgc3VwcGxpZWQgc2NoZW1lIgogICAgIyBUT0RPKHQtOGNoKTogU3RvcCBpbmhlcml0aW5nIGZyb20gQXNzZXJ0aW9uRXJyb3IgaW4gdjIuMC4KCiAgICBkZWYgX19pbml0X18oc2VsZiwgc2NoZW1lKToKICAgICAgICBtZXNzYWdlID0gIk5vdCBzdXBwb3J0ZWQgcHJveHkgc2NoZW1lICVzIiAlIHNjaGVtZQogICAgICAgIHN1cGVyKFByb3h5U2NoZW1lVW5rbm93biwgc2VsZikuX19pbml0X18obWVzc2FnZSkKCgpjbGFzcyBIZWFkZXJQYXJzaW5nRXJyb3IoSFRUUEVycm9yKToKICAgICJSYWlzZWQgYnkgYXNzZXJ0X2hlYWRlcl9wYXJzaW5nLCBidXQgd2UgY29udmVydCBpdCB0byBhIGxvZy53YXJuaW5nIHN0YXRlbWVudC4iCiAgICBkZWYgX19pbml0X18oc2VsZiwgZGVmZWN0cywgdW5wYXJzZWRfZGF0YSk6CiAgICAgICAgbWVzc2FnZSA9ICclcywgdW5wYXJzZWQgZGF0YTogJXInICUgKGRlZmVjdHMgb3IgJ1Vua25vd24nLCB1bnBhcnNlZF9kYXRhKQogICAgICAgIHN1cGVyKEhlYWRlclBhcnNpbmdFcnJvciwgc2VsZikuX19pbml0X18obWVzc2FnZSkKCgpjbGFzcyBVbnJld2luZGFibGVCb2R5RXJyb3IoSFRUUEVycm9yKToKICAgICJ1cmxsaWIzIGVuY291bnRlcmVkIGFuIGVycm9yIHdoZW4gdHJ5aW5nIHRvIHJld2luZCBhIGJvZHkiCiAgICBwYXNzClBLAwQUAAAAAAAAACEAATmMsjcXAAA3FwAALQAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL2ZpZWxkcy5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CmltcG9ydCBlbWFpbC51dGlscwppbXBvcnQgbWltZXR5cGVzCgpmcm9tIC5wYWNrYWdlcyBpbXBvcnQgc2l4CgoKZGVmIGd1ZXNzX2NvbnRlbnRfdHlwZShmaWxlbmFtZSwgZGVmYXVsdD0nYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJyk6CiAgICAiIiIKICAgIEd1ZXNzIHRoZSAiQ29udGVudC1UeXBlIiBvZiBhIGZpbGUuCgogICAgOnBhcmFtIGZpbGVuYW1lOgogICAgICAgIFRoZSBmaWxlbmFtZSB0byBndWVzcyB0aGUgIkNvbnRlbnQtVHlwZSIgb2YgdXNpbmcgOm1vZDpgbWltZXR5cGVzYC4KICAgIDpwYXJhbSBkZWZhdWx0OgogICAgICAgIElmIG5vICJDb250ZW50LVR5cGUiIGNhbiBiZSBndWVzc2VkLCBkZWZhdWx0IHRvIGBkZWZhdWx0YC4KICAgICIiIgogICAgaWYgZmlsZW5hbWU6CiAgICAgICAgcmV0dXJuIG1pbWV0eXBlcy5ndWVzc190eXBlKGZpbGVuYW1lKVswXSBvciBkZWZhdWx0CiAgICByZXR1cm4gZGVmYXVsdAoKCmRlZiBmb3JtYXRfaGVhZGVyX3BhcmFtKG5hbWUsIHZhbHVlKToKICAgICIiIgogICAgSGVscGVyIGZ1bmN0aW9uIHRvIGZvcm1hdCBhbmQgcXVvdGUgYSBzaW5nbGUgaGVhZGVyIHBhcmFtZXRlci4KCiAgICBQYXJ0aWN1bGFybHkgdXNlZnVsIGZvciBoZWFkZXIgcGFyYW1ldGVycyB3aGljaCBtaWdodCBjb250YWluCiAgICBub24tQVNDSUkgdmFsdWVzLCBsaWtlIGZpbGUgbmFtZXMuIFRoaXMgZm9sbG93cyBSRkMgMjIzMSwgYXMKICAgIHN1Z2dlc3RlZCBieSBSRkMgMjM4OCBTZWN0aW9uIDQuNC4KCiAgICA6cGFyYW0gbmFtZToKICAgICAgICBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyLCBhIHN0cmluZyBleHBlY3RlZCB0byBiZSBBU0NJSSBvbmx5LgogICAgOnBhcmFtIHZhbHVlOgogICAgICAgIFRoZSB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyLCBwcm92aWRlZCBhcyBhIHVuaWNvZGUgc3RyaW5nLgogICAgIiIiCiAgICBpZiBub3QgYW55KGNoIGluIHZhbHVlIGZvciBjaCBpbiAnIlxcXHJcbicpOgogICAgICAgIHJlc3VsdCA9ICclcz0iJXMiJyAlIChuYW1lLCB2YWx1ZSkKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJlc3VsdC5lbmNvZGUoJ2FzY2lpJykKICAgICAgICBleGNlcHQgKFVuaWNvZGVFbmNvZGVFcnJvciwgVW5pY29kZURlY29kZUVycm9yKToKICAgICAgICAgICAgcGFzcwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiByZXN1bHQKICAgIGlmIG5vdCBzaXguUFkzIGFuZCBpc2luc3RhbmNlKHZhbHVlLCBzaXgudGV4dF90eXBlKTogICMgUHl0aG9uIDI6CiAgICAgICAgdmFsdWUgPSB2YWx1ZS5lbmNvZGUoJ3V0Zi04JykKICAgIHZhbHVlID0gZW1haWwudXRpbHMuZW5jb2RlX3JmYzIyMzEodmFsdWUsICd1dGYtOCcpCiAgICB2YWx1ZSA9ICclcyo9JXMnICUgKG5hbWUsIHZhbHVlKQogICAgcmV0dXJuIHZhbHVlCgoKY2xhc3MgUmVxdWVzdEZpZWxkKG9iamVjdCk6CiAgICAiIiIKICAgIEEgZGF0YSBjb250YWluZXIgZm9yIHJlcXVlc3QgYm9keSBwYXJhbWV0ZXJzLgoKICAgIDpwYXJhbSBuYW1lOgogICAgICAgIFRoZSBuYW1lIG9mIHRoaXMgcmVxdWVzdCBmaWVsZC4KICAgIDpwYXJhbSBkYXRhOgogICAgICAgIFRoZSBkYXRhL3ZhbHVlIGJvZHkuCiAgICA6cGFyYW0gZmlsZW5hbWU6CiAgICAgICAgQW4gb3B0aW9uYWwgZmlsZW5hbWUgb2YgdGhlIHJlcXVlc3QgZmllbGQuCiAgICA6cGFyYW0gaGVhZGVyczoKICAgICAgICBBbiBvcHRpb25hbCBkaWN0LWxpa2Ugb2JqZWN0IG9mIGhlYWRlcnMgdG8gaW5pdGlhbGx5IHVzZSBmb3IgdGhlIGZpZWxkLgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgZGF0YSwgZmlsZW5hbWU9Tm9uZSwgaGVhZGVycz1Ob25lKToKICAgICAgICBzZWxmLl9uYW1lID0gbmFtZQogICAgICAgIHNlbGYuX2ZpbGVuYW1lID0gZmlsZW5hbWUKICAgICAgICBzZWxmLmRhdGEgPSBkYXRhCiAgICAgICAgc2VsZi5oZWFkZXJzID0ge30KICAgICAgICBpZiBoZWFkZXJzOgogICAgICAgICAgICBzZWxmLmhlYWRlcnMgPSBkaWN0KGhlYWRlcnMpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZnJvbV90dXBsZXMoY2xzLCBmaWVsZG5hbWUsIHZhbHVlKToKICAgICAgICAiIiIKICAgICAgICBBIDpjbGFzczpgfnVybGxpYjMuZmllbGRzLlJlcXVlc3RGaWVsZGAgZmFjdG9yeSBmcm9tIG9sZC1zdHlsZSB0dXBsZSBwYXJhbWV0ZXJzLgoKICAgICAgICBTdXBwb3J0cyBjb25zdHJ1Y3RpbmcgOmNsYXNzOmB+dXJsbGliMy5maWVsZHMuUmVxdWVzdEZpZWxkYCBmcm9tCiAgICAgICAgcGFyYW1ldGVyIG9mIGtleS92YWx1ZSBzdHJpbmdzIEFORCBrZXkvZmlsZXR1cGxlLiBBIGZpbGV0dXBsZSBpcyBhCiAgICAgICAgKGZpbGVuYW1lLCBkYXRhLCBNSU1FIHR5cGUpIHR1cGxlIHdoZXJlIHRoZSBNSU1FIHR5cGUgaXMgb3B0aW9uYWwuCiAgICAgICAgRm9yIGV4YW1wbGU6OgoKICAgICAgICAgICAgJ2Zvbyc6ICdiYXInLAogICAgICAgICAgICAnZmFrZWZpbGUnOiAoJ2Zvb2ZpbGUudHh0JywgJ2NvbnRlbnRzIG9mIGZvb2ZpbGUnKSwKICAgICAgICAgICAgJ3JlYWxmaWxlJzogKCdiYXJmaWxlLnR4dCcsIG9wZW4oJ3JlYWxmaWxlJykucmVhZCgpKSwKICAgICAgICAgICAgJ3R5cGVkZmlsZSc6ICgnYmF6ZmlsZS5iaW4nLCBvcGVuKCdiYXpmaWxlJykucmVhZCgpLCAnaW1hZ2UvanBlZycpLAogICAgICAgICAgICAnbm9uYW1lZmlsZSc6ICdjb250ZW50cyBvZiBub25hbWVmaWxlIGZpZWxkJywKCiAgICAgICAgRmllbGQgbmFtZXMgYW5kIGZpbGVuYW1lcyBtdXN0IGJlIHVuaWNvZGUuCiAgICAgICAgIiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgdHVwbGUpOgogICAgICAgICAgICBpZiBsZW4odmFsdWUpID09IDM6CiAgICAgICAgICAgICAgICBmaWxlbmFtZSwgZGF0YSwgY29udGVudF90eXBlID0gdmFsdWUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBkYXRhID0gdmFsdWUKICAgICAgICAgICAgICAgIGNvbnRlbnRfdHlwZSA9IGd1ZXNzX2NvbnRlbnRfdHlwZShmaWxlbmFtZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBmaWxlbmFtZSA9IE5vbmUKICAgICAgICAgICAgY29udGVudF90eXBlID0gTm9uZQogICAgICAgICAgICBkYXRhID0gdmFsdWUKCiAgICAgICAgcmVxdWVzdF9wYXJhbSA9IGNscyhmaWVsZG5hbWUsIGRhdGEsIGZpbGVuYW1lPWZpbGVuYW1lKQogICAgICAgIHJlcXVlc3RfcGFyYW0ubWFrZV9tdWx0aXBhcnQoY29udGVudF90eXBlPWNvbnRlbnRfdHlwZSkKCiAgICAgICAgcmV0dXJuIHJlcXVlc3RfcGFyYW0KCiAgICBkZWYgX3JlbmRlcl9wYXJ0KHNlbGYsIG5hbWUsIHZhbHVlKToKICAgICAgICAiIiIKICAgICAgICBPdmVycmlkYWJsZSBoZWxwZXIgZnVuY3Rpb24gdG8gZm9ybWF0IGEgc2luZ2xlIGhlYWRlciBwYXJhbWV0ZXIuCgogICAgICAgIDpwYXJhbSBuYW1lOgogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyLCBhIHN0cmluZyBleHBlY3RlZCB0byBiZSBBU0NJSSBvbmx5LgogICAgICAgIDpwYXJhbSB2YWx1ZToKICAgICAgICAgICAgVGhlIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIsIHByb3ZpZGVkIGFzIGEgdW5pY29kZSBzdHJpbmcuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGZvcm1hdF9oZWFkZXJfcGFyYW0obmFtZSwgdmFsdWUpCgogICAgZGVmIF9yZW5kZXJfcGFydHMoc2VsZiwgaGVhZGVyX3BhcnRzKToKICAgICAgICAiIiIKICAgICAgICBIZWxwZXIgZnVuY3Rpb24gdG8gZm9ybWF0IGFuZCBxdW90ZSBhIHNpbmdsZSBoZWFkZXIuCgogICAgICAgIFVzZWZ1bCBmb3Igc2luZ2xlIGhlYWRlcnMgdGhhdCBhcmUgY29tcG9zZWQgb2YgbXVsdGlwbGUgaXRlbXMuIEUuZy4sCiAgICAgICAgJ0NvbnRlbnQtRGlzcG9zaXRpb24nIGZpZWxkcy4KCiAgICAgICAgOnBhcmFtIGhlYWRlcl9wYXJ0czoKICAgICAgICAgICAgQSBzZXF1ZW5jZSBvZiAoaywgdikgdHlwbGVzIG9yIGEgOmNsYXNzOmBkaWN0YCBvZiAoaywgdikgdG8gZm9ybWF0CiAgICAgICAgICAgIGFzIGBrMT0idjEiOyBrMj0idjIiOyAuLi5gLgogICAgICAgICIiIgogICAgICAgIHBhcnRzID0gW10KICAgICAgICBpdGVyYWJsZSA9IGhlYWRlcl9wYXJ0cwogICAgICAgIGlmIGlzaW5zdGFuY2UoaGVhZGVyX3BhcnRzLCBkaWN0KToKICAgICAgICAgICAgaXRlcmFibGUgPSBoZWFkZXJfcGFydHMuaXRlbXMoKQoKICAgICAgICBmb3IgbmFtZSwgdmFsdWUgaW4gaXRlcmFibGU6CiAgICAgICAgICAgIGlmIHZhbHVlIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgcGFydHMuYXBwZW5kKHNlbGYuX3JlbmRlcl9wYXJ0KG5hbWUsIHZhbHVlKSkKCiAgICAgICAgcmV0dXJuICc7ICcuam9pbihwYXJ0cykKCiAgICBkZWYgcmVuZGVyX2hlYWRlcnMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmVuZGVycyB0aGUgaGVhZGVycyBmb3IgdGhpcyByZXF1ZXN0IGZpZWxkLgogICAgICAgICIiIgogICAgICAgIGxpbmVzID0gW10KCiAgICAgICAgc29ydF9rZXlzID0gWydDb250ZW50LURpc3Bvc2l0aW9uJywgJ0NvbnRlbnQtVHlwZScsICdDb250ZW50LUxvY2F0aW9uJ10KICAgICAgICBmb3Igc29ydF9rZXkgaW4gc29ydF9rZXlzOgogICAgICAgICAgICBpZiBzZWxmLmhlYWRlcnMuZ2V0KHNvcnRfa2V5LCBGYWxzZSk6CiAgICAgICAgICAgICAgICBsaW5lcy5hcHBlbmQoJyVzOiAlcycgJSAoc29ydF9rZXksIHNlbGYuaGVhZGVyc1tzb3J0X2tleV0pKQoKICAgICAgICBmb3IgaGVhZGVyX25hbWUsIGhlYWRlcl92YWx1ZSBpbiBzZWxmLmhlYWRlcnMuaXRlbXMoKToKICAgICAgICAgICAgaWYgaGVhZGVyX25hbWUgbm90IGluIHNvcnRfa2V5czoKICAgICAgICAgICAgICAgIGlmIGhlYWRlcl92YWx1ZToKICAgICAgICAgICAgICAgICAgICBsaW5lcy5hcHBlbmQoJyVzOiAlcycgJSAoaGVhZGVyX25hbWUsIGhlYWRlcl92YWx1ZSkpCgogICAgICAgIGxpbmVzLmFwcGVuZCgnXHJcbicpCiAgICAgICAgcmV0dXJuICdcclxuJy5qb2luKGxpbmVzKQoKICAgIGRlZiBtYWtlX211bHRpcGFydChzZWxmLCBjb250ZW50X2Rpc3Bvc2l0aW9uPU5vbmUsIGNvbnRlbnRfdHlwZT1Ob25lLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfbG9jYXRpb249Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgTWFrZXMgdGhpcyByZXF1ZXN0IGZpZWxkIGludG8gYSBtdWx0aXBhcnQgcmVxdWVzdCBmaWVsZC4KCiAgICAgICAgVGhpcyBtZXRob2Qgb3ZlcnJpZGVzICJDb250ZW50LURpc3Bvc2l0aW9uIiwgIkNvbnRlbnQtVHlwZSIgYW5kCiAgICAgICAgIkNvbnRlbnQtTG9jYXRpb24iIGhlYWRlcnMgdG8gdGhlIHJlcXVlc3QgcGFyYW1ldGVyLgoKICAgICAgICA6cGFyYW0gY29udGVudF90eXBlOgogICAgICAgICAgICBUaGUgJ0NvbnRlbnQtVHlwZScgb2YgdGhlIHJlcXVlc3QgYm9keS4KICAgICAgICA6cGFyYW0gY29udGVudF9sb2NhdGlvbjoKICAgICAgICAgICAgVGhlICdDb250ZW50LUxvY2F0aW9uJyBvZiB0aGUgcmVxdWVzdCBib2R5LgoKICAgICAgICAiIiIKICAgICAgICBzZWxmLmhlYWRlcnNbJ0NvbnRlbnQtRGlzcG9zaXRpb24nXSA9IGNvbnRlbnRfZGlzcG9zaXRpb24gb3IgJ2Zvcm0tZGF0YScKICAgICAgICBzZWxmLmhlYWRlcnNbJ0NvbnRlbnQtRGlzcG9zaXRpb24nXSArPSAnOyAnLmpvaW4oWwogICAgICAgICAgICAnJywgc2VsZi5fcmVuZGVyX3BhcnRzKAogICAgICAgICAgICAgICAgKCgnbmFtZScsIHNlbGYuX25hbWUpLCAoJ2ZpbGVuYW1lJywgc2VsZi5fZmlsZW5hbWUpKQogICAgICAgICAgICApCiAgICAgICAgXSkKICAgICAgICBzZWxmLmhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gY29udGVudF90eXBlCiAgICAgICAgc2VsZi5oZWFkZXJzWydDb250ZW50LUxvY2F0aW9uJ10gPSBjb250ZW50X2xvY2F0aW9uClBLAwQUAAAAAAAAACEA113QFxEJAAARCQAALwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL2ZpbGVwb3N0LnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKaW1wb3J0IGNvZGVjcwoKZnJvbSB1dWlkIGltcG9ydCB1dWlkNApmcm9tIGlvIGltcG9ydCBCeXRlc0lPCgpmcm9tIC5wYWNrYWdlcyBpbXBvcnQgc2l4CmZyb20gLnBhY2thZ2VzLnNpeCBpbXBvcnQgYgpmcm9tIC5maWVsZHMgaW1wb3J0IFJlcXVlc3RGaWVsZAoKd3JpdGVyID0gY29kZWNzLmxvb2t1cCgndXRmLTgnKVszXQoKCmRlZiBjaG9vc2VfYm91bmRhcnkoKToKICAgICIiIgogICAgT3VyIGVtYmFycmFzc2luZ2x5LXNpbXBsZSByZXBsYWNlbWVudCBmb3IgbWltZXRvb2xzLmNob29zZV9ib3VuZGFyeS4KICAgICIiIgogICAgcmV0dXJuIHV1aWQ0KCkuaGV4CgoKZGVmIGl0ZXJfZmllbGRfb2JqZWN0cyhmaWVsZHMpOgogICAgIiIiCiAgICBJdGVyYXRlIG92ZXIgZmllbGRzLgoKICAgIFN1cHBvcnRzIGxpc3Qgb2YgKGssIHYpIHR1cGxlcyBhbmQgZGljdHMsIGFuZCBsaXN0cyBvZgogICAgOmNsYXNzOmB+dXJsbGliMy5maWVsZHMuUmVxdWVzdEZpZWxkYC4KCiAgICAiIiIKICAgIGlmIGlzaW5zdGFuY2UoZmllbGRzLCBkaWN0KToKICAgICAgICBpID0gc2l4Lml0ZXJpdGVtcyhmaWVsZHMpCiAgICBlbHNlOgogICAgICAgIGkgPSBpdGVyKGZpZWxkcykKCiAgICBmb3IgZmllbGQgaW4gaToKICAgICAgICBpZiBpc2luc3RhbmNlKGZpZWxkLCBSZXF1ZXN0RmllbGQpOgogICAgICAgICAgICB5aWVsZCBmaWVsZAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHlpZWxkIFJlcXVlc3RGaWVsZC5mcm9tX3R1cGxlcygqZmllbGQpCgoKZGVmIGl0ZXJfZmllbGRzKGZpZWxkcyk6CiAgICAiIiIKICAgIC4uIGRlcHJlY2F0ZWQ6OiAxLjYKCiAgICBJdGVyYXRlIG92ZXIgZmllbGRzLgoKICAgIFRoZSBhZGRpdGlvbiBvZiA6Y2xhc3M6YH51cmxsaWIzLmZpZWxkcy5SZXF1ZXN0RmllbGRgIG1ha2VzIHRoaXMgZnVuY3Rpb24KICAgIG9ic29sZXRlLiBJbnN0ZWFkLCB1c2UgOmZ1bmM6YGl0ZXJfZmllbGRfb2JqZWN0c2AsIHdoaWNoIHJldHVybnMKICAgIDpjbGFzczpgfnVybGxpYjMuZmllbGRzLlJlcXVlc3RGaWVsZGAgb2JqZWN0cy4KCiAgICBTdXBwb3J0cyBsaXN0IG9mIChrLCB2KSB0dXBsZXMgYW5kIGRpY3RzLgogICAgIiIiCiAgICBpZiBpc2luc3RhbmNlKGZpZWxkcywgZGljdCk6CiAgICAgICAgcmV0dXJuICgoaywgdikgZm9yIGssIHYgaW4gc2l4Lml0ZXJpdGVtcyhmaWVsZHMpKQoKICAgIHJldHVybiAoKGssIHYpIGZvciBrLCB2IGluIGZpZWxkcykKCgpkZWYgZW5jb2RlX211bHRpcGFydF9mb3JtZGF0YShmaWVsZHMsIGJvdW5kYXJ5PU5vbmUpOgogICAgIiIiCiAgICBFbmNvZGUgYSBkaWN0aW9uYXJ5IG9mIGBgZmllbGRzYGAgdXNpbmcgdGhlIG11bHRpcGFydC9mb3JtLWRhdGEgTUlNRSBmb3JtYXQuCgogICAgOnBhcmFtIGZpZWxkczoKICAgICAgICBEaWN0aW9uYXJ5IG9mIGZpZWxkcyBvciBsaXN0IG9mIChrZXksIDpjbGFzczpgfnVybGxpYjMuZmllbGRzLlJlcXVlc3RGaWVsZGApLgoKICAgIDpwYXJhbSBib3VuZGFyeToKICAgICAgICBJZiBub3Qgc3BlY2lmaWVkLCB0aGVuIGEgcmFuZG9tIGJvdW5kYXJ5IHdpbGwgYmUgZ2VuZXJhdGVkIHVzaW5nCiAgICAgICAgOmZ1bmM6YG1pbWV0b29scy5jaG9vc2VfYm91bmRhcnlgLgogICAgIiIiCiAgICBib2R5ID0gQnl0ZXNJTygpCiAgICBpZiBib3VuZGFyeSBpcyBOb25lOgogICAgICAgIGJvdW5kYXJ5ID0gY2hvb3NlX2JvdW5kYXJ5KCkKCiAgICBmb3IgZmllbGQgaW4gaXRlcl9maWVsZF9vYmplY3RzKGZpZWxkcyk6CiAgICAgICAgYm9keS53cml0ZShiKCctLSVzXHJcbicgJSAoYm91bmRhcnkpKSkKCiAgICAgICAgd3JpdGVyKGJvZHkpLndyaXRlKGZpZWxkLnJlbmRlcl9oZWFkZXJzKCkpCiAgICAgICAgZGF0YSA9IGZpZWxkLmRhdGEKCiAgICAgICAgaWYgaXNpbnN0YW5jZShkYXRhLCBpbnQpOgogICAgICAgICAgICBkYXRhID0gc3RyKGRhdGEpICAjIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CgogICAgICAgIGlmIGlzaW5zdGFuY2UoZGF0YSwgc2l4LnRleHRfdHlwZSk6CiAgICAgICAgICAgIHdyaXRlcihib2R5KS53cml0ZShkYXRhKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGJvZHkud3JpdGUoZGF0YSkKCiAgICAgICAgYm9keS53cml0ZShiJ1xyXG4nKQoKICAgIGJvZHkud3JpdGUoYignLS0lcy0tXHJcbicgJSAoYm91bmRhcnkpKSkKCiAgICBjb250ZW50X3R5cGUgPSBzdHIoJ211bHRpcGFydC9mb3JtLWRhdGE7IGJvdW5kYXJ5PSVzJyAlIGJvdW5kYXJ5KQoKICAgIHJldHVybiBib2R5LmdldHZhbHVlKCksIGNvbnRlbnRfdHlwZQpQSwMEFAAAAAAAAAAhAI9doHxtAAAAbQAAADgAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9wYWNrYWdlcy9fX2luaXRfXy5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0Cgpmcm9tIC4gaW1wb3J0IHNzbF9tYXRjaF9ob3N0bmFtZQoKX19hbGxfXyA9ICgnc3NsX21hdGNoX2hvc3RuYW1lJywgKQpQSwMEFAAAAAAAAAAhAAAAAAAAAAAAAAAAAEIAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9wYWNrYWdlcy9iYWNrcG9ydHMvX19pbml0X18ucHlQSwMEFAAAAAAAAAAhAFJXHLm1BQAAtQUAAEIAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9wYWNrYWdlcy9iYWNrcG9ydHMvbWFrZWZpbGUucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoiIiIKYmFja3BvcnRzLm1ha2VmaWxlCn5+fn5+fn5+fn5+fn5+fn5+fgoKQmFja3BvcnRzIHRoZSBQeXRob24gMyBgYHNvY2tldC5tYWtlZmlsZWBgIG1ldGhvZCBmb3IgdXNlIHdpdGggYW55dGhpbmcgdGhhdAp3YW50cyB0byBjcmVhdGUgYSAiZmFrZSIgc29ja2V0IG9iamVjdC4KIiIiCmltcG9ydCBpbwoKZnJvbSBzb2NrZXQgaW1wb3J0IFNvY2tldElPCgoKZGVmIGJhY2twb3J0X21ha2VmaWxlKHNlbGYsIG1vZGU9InIiLCBidWZmZXJpbmc9Tm9uZSwgZW5jb2Rpbmc9Tm9uZSwKICAgICAgICAgICAgICAgICAgICAgIGVycm9ycz1Ob25lLCBuZXdsaW5lPU5vbmUpOgogICAgIiIiCiAgICBCYWNrcG9ydCBvZiBgYHNvY2tldC5tYWtlZmlsZWBgIGZyb20gUHl0aG9uIDMuNS4KICAgICIiIgogICAgaWYgbm90IHNldChtb2RlKSA8PSBzZXQoWyJyIiwgInciLCAiYiJdKToKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICAgICAiaW52YWxpZCBtb2RlICVyIChvbmx5IHIsIHcsIGIgYWxsb3dlZCkiICUgKG1vZGUsKQogICAgICAgICkKICAgIHdyaXRpbmcgPSAidyIgaW4gbW9kZQogICAgcmVhZGluZyA9ICJyIiBpbiBtb2RlIG9yIG5vdCB3cml0aW5nCiAgICBhc3NlcnQgcmVhZGluZyBvciB3cml0aW5nCiAgICBiaW5hcnkgPSAiYiIgaW4gbW9kZQogICAgcmF3bW9kZSA9ICIiCiAgICBpZiByZWFkaW5nOgogICAgICAgIHJhd21vZGUgKz0gInIiCiAgICBpZiB3cml0aW5nOgogICAgICAgIHJhd21vZGUgKz0gInciCiAgICByYXcgPSBTb2NrZXRJTyhzZWxmLCByYXdtb2RlKQogICAgc2VsZi5fbWFrZWZpbGVfcmVmcyArPSAxCiAgICBpZiBidWZmZXJpbmcgaXMgTm9uZToKICAgICAgICBidWZmZXJpbmcgPSAtMQogICAgaWYgYnVmZmVyaW5nIDwgMDoKICAgICAgICBidWZmZXJpbmcgPSBpby5ERUZBVUxUX0JVRkZFUl9TSVpFCiAgICBpZiBidWZmZXJpbmcgPT0gMDoKICAgICAgICBpZiBub3QgYmluYXJ5OgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ1bmJ1ZmZlcmVkIHN0cmVhbXMgbXVzdCBiZSBiaW5hcnkiKQogICAgICAgIHJldHVybiByYXcKICAgIGlmIHJlYWRpbmcgYW5kIHdyaXRpbmc6CiAgICAgICAgYnVmZmVyID0gaW8uQnVmZmVyZWRSV1BhaXIocmF3LCByYXcsIGJ1ZmZlcmluZykKICAgIGVsaWYgcmVhZGluZzoKICAgICAgICBidWZmZXIgPSBpby5CdWZmZXJlZFJlYWRlcihyYXcsIGJ1ZmZlcmluZykKICAgIGVsc2U6CiAgICAgICAgYXNzZXJ0IHdyaXRpbmcKICAgICAgICBidWZmZXIgPSBpby5CdWZmZXJlZFdyaXRlcihyYXcsIGJ1ZmZlcmluZykKICAgIGlmIGJpbmFyeToKICAgICAgICByZXR1cm4gYnVmZmVyCiAgICB0ZXh0ID0gaW8uVGV4dElPV3JhcHBlcihidWZmZXIsIGVuY29kaW5nLCBlcnJvcnMsIG5ld2xpbmUpCiAgICB0ZXh0Lm1vZGUgPSBtb2RlCiAgICByZXR1cm4gdGV4dApQSwMEFAAAAAAAAAAhAEbBpmfnIgAA5yIAADwAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9wYWNrYWdlcy9vcmRlcmVkX2RpY3QucHkjIEJhY2twb3J0IG9mIE9yZGVyZWREaWN0KCkgY2xhc3MgdGhhdCBydW5zIG9uIFB5dGhvbiAyLjQsIDIuNSwgMi42LCAyLjcgYW5kIHB5cHkuCiMgUGFzc2VzIFB5dGhvbjIuNydzIHRlc3Qgc3VpdGUgYW5kIGluY29ycG9yYXRlcyBhbGwgdGhlIGxhdGVzdCB1cGRhdGVzLgojIENvcHlyaWdodCAyMDA5IFJheW1vbmQgSGV0dGluZ2VyLCByZWxlYXNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuCiMgaHR0cDovL2NvZGUuYWN0aXZlc3RhdGUuY29tL3JlY2lwZXMvNTc2NjkzLwp0cnk6CiAgICBmcm9tIHRocmVhZCBpbXBvcnQgZ2V0X2lkZW50IGFzIF9nZXRfaWRlbnQKZXhjZXB0IEltcG9ydEVycm9yOgogICAgZnJvbSBkdW1teV90aHJlYWQgaW1wb3J0IGdldF9pZGVudCBhcyBfZ2V0X2lkZW50Cgp0cnk6CiAgICBmcm9tIF9hYmNvbGwgaW1wb3J0IEtleXNWaWV3LCBWYWx1ZXNWaWV3LCBJdGVtc1ZpZXcKZXhjZXB0IEltcG9ydEVycm9yOgogICAgcGFzcwoKCmNsYXNzIE9yZGVyZWREaWN0KGRpY3QpOgogICAgJ0RpY3Rpb25hcnkgdGhhdCByZW1lbWJlcnMgaW5zZXJ0aW9uIG9yZGVyJwogICAgIyBBbiBpbmhlcml0ZWQgZGljdCBtYXBzIGtleXMgdG8gdmFsdWVzLgogICAgIyBUaGUgaW5oZXJpdGVkIGRpY3QgcHJvdmlkZXMgX19nZXRpdGVtX18sIF9fbGVuX18sIF9fY29udGFpbnNfXywgYW5kIGdldC4KICAgICMgVGhlIHJlbWFpbmluZyBtZXRob2RzIGFyZSBvcmRlci1hd2FyZS4KICAgICMgQmlnLU8gcnVubmluZyB0aW1lcyBmb3IgYWxsIG1ldGhvZHMgYXJlIHRoZSBzYW1lIGFzIGZvciByZWd1bGFyIGRpY3Rpb25hcmllcy4KCiAgICAjIFRoZSBpbnRlcm5hbCBzZWxmLl9fbWFwIGRpY3Rpb25hcnkgbWFwcyBrZXlzIHRvIGxpbmtzIGluIGEgZG91Ymx5IGxpbmtlZCBsaXN0LgogICAgIyBUaGUgY2lyY3VsYXIgZG91Ymx5IGxpbmtlZCBsaXN0IHN0YXJ0cyBhbmQgZW5kcyB3aXRoIGEgc2VudGluZWwgZWxlbWVudC4KICAgICMgVGhlIHNlbnRpbmVsIGVsZW1lbnQgbmV2ZXIgZ2V0cyBkZWxldGVkICh0aGlzIHNpbXBsaWZpZXMgdGhlIGFsZ29yaXRobSkuCiAgICAjIEVhY2ggbGluayBpcyBzdG9yZWQgYXMgYSBsaXN0IG9mIGxlbmd0aCB0aHJlZTogIFtQUkVWLCBORVhULCBLRVldLgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2RzKToKICAgICAgICAnJydJbml0aWFsaXplIGFuIG9yZGVyZWQgZGljdGlvbmFyeS4gIFNpZ25hdHVyZSBpcyB0aGUgc2FtZSBhcyBmb3IKICAgICAgICByZWd1bGFyIGRpY3Rpb25hcmllcywgYnV0IGtleXdvcmQgYXJndW1lbnRzIGFyZSBub3QgcmVjb21tZW5kZWQKICAgICAgICBiZWNhdXNlIHRoZWlyIGluc2VydGlvbiBvcmRlciBpcyBhcmJpdHJhcnkuCgogICAgICAgICcnJwogICAgICAgIGlmIGxlbihhcmdzKSA+IDE6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignZXhwZWN0ZWQgYXQgbW9zdCAxIGFyZ3VtZW50cywgZ290ICVkJyAlIGxlbihhcmdzKSkKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYuX19yb290CiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBzZWxmLl9fcm9vdCA9IHJvb3QgPSBbXSAgICAgICAgICAgICAgICAgICAgICMgc2VudGluZWwgbm9kZQogICAgICAgICAgICByb290WzpdID0gW3Jvb3QsIHJvb3QsIE5vbmVdCiAgICAgICAgICAgIHNlbGYuX19tYXAgPSB7fQogICAgICAgIHNlbGYuX191cGRhdGUoKmFyZ3MsICoqa3dkcykKCiAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSwgZGljdF9zZXRpdGVtPWRpY3QuX19zZXRpdGVtX18pOgogICAgICAgICdvZC5fX3NldGl0ZW1fXyhpLCB5KSA8PT0+IG9kW2ldPXknCiAgICAgICAgIyBTZXR0aW5nIGEgbmV3IGl0ZW0gY3JlYXRlcyBhIG5ldyBsaW5rIHdoaWNoIGdvZXMgYXQgdGhlIGVuZCBvZiB0aGUgbGlua2VkCiAgICAgICAgIyBsaXN0LCBhbmQgdGhlIGluaGVyaXRlZCBkaWN0aW9uYXJ5IGlzIHVwZGF0ZWQgd2l0aCB0aGUgbmV3IGtleS92YWx1ZSBwYWlyLgogICAgICAgIGlmIGtleSBub3QgaW4gc2VsZjoKICAgICAgICAgICAgcm9vdCA9IHNlbGYuX19yb290CiAgICAgICAgICAgIGxhc3QgPSByb290WzBdCiAgICAgICAgICAgIGxhc3RbMV0gPSByb290WzBdID0gc2VsZi5fX21hcFtrZXldID0gW2xhc3QsIHJvb3QsIGtleV0KICAgICAgICBkaWN0X3NldGl0ZW0oc2VsZiwga2V5LCB2YWx1ZSkKCiAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwga2V5LCBkaWN0X2RlbGl0ZW09ZGljdC5fX2RlbGl0ZW1fXyk6CiAgICAgICAgJ29kLl9fZGVsaXRlbV9fKHkpIDw9PT4gZGVsIG9kW3ldJwogICAgICAgICMgRGVsZXRpbmcgYW4gZXhpc3RpbmcgaXRlbSB1c2VzIHNlbGYuX19tYXAgdG8gZmluZCB0aGUgbGluayB3aGljaCBpcwogICAgICAgICMgdGhlbiByZW1vdmVkIGJ5IHVwZGF0aW5nIHRoZSBsaW5rcyBpbiB0aGUgcHJlZGVjZXNzb3IgYW5kIHN1Y2Nlc3NvciBub2Rlcy4KICAgICAgICBkaWN0X2RlbGl0ZW0oc2VsZiwga2V5KQogICAgICAgIGxpbmtfcHJldiwgbGlua19uZXh0LCBrZXkgPSBzZWxmLl9fbWFwLnBvcChrZXkpCiAgICAgICAgbGlua19wcmV2WzFdID0gbGlua19uZXh0CiAgICAgICAgbGlua19uZXh0WzBdID0gbGlua19wcmV2CgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgICdvZC5fX2l0ZXJfXygpIDw9PT4gaXRlcihvZCknCiAgICAgICAgcm9vdCA9IHNlbGYuX19yb290CiAgICAgICAgY3VyciA9IHJvb3RbMV0KICAgICAgICB3aGlsZSBjdXJyIGlzIG5vdCByb290OgogICAgICAgICAgICB5aWVsZCBjdXJyWzJdCiAgICAgICAgICAgIGN1cnIgPSBjdXJyWzFdCgogICAgZGVmIF9fcmV2ZXJzZWRfXyhzZWxmKToKICAgICAgICAnb2QuX19yZXZlcnNlZF9fKCkgPD09PiByZXZlcnNlZChvZCknCiAgICAgICAgcm9vdCA9IHNlbGYuX19yb290CiAgICAgICAgY3VyciA9IHJvb3RbMF0KICAgICAgICB3aGlsZSBjdXJyIGlzIG5vdCByb290OgogICAgICAgICAgICB5aWVsZCBjdXJyWzJdCiAgICAgICAgICAgIGN1cnIgPSBjdXJyWzBdCgogICAgZGVmIGNsZWFyKHNlbGYpOgogICAgICAgICdvZC5jbGVhcigpIC0+IE5vbmUuICBSZW1vdmUgYWxsIGl0ZW1zIGZyb20gb2QuJwogICAgICAgIHRyeToKICAgICAgICAgICAgZm9yIG5vZGUgaW4gc2VsZi5fX21hcC5pdGVydmFsdWVzKCk6CiAgICAgICAgICAgICAgICBkZWwgbm9kZVs6XQogICAgICAgICAgICByb290ID0gc2VsZi5fX3Jvb3QKICAgICAgICAgICAgcm9vdFs6XSA9IFtyb290LCByb290LCBOb25lXQogICAgICAgICAgICBzZWxmLl9fbWFwLmNsZWFyKCkKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIHBhc3MKICAgICAgICBkaWN0LmNsZWFyKHNlbGYpCgogICAgZGVmIHBvcGl0ZW0oc2VsZiwgbGFzdD1UcnVlKToKICAgICAgICAnJydvZC5wb3BpdGVtKCkgLT4gKGssIHYpLCByZXR1cm4gYW5kIHJlbW92ZSBhIChrZXksIHZhbHVlKSBwYWlyLgogICAgICAgIFBhaXJzIGFyZSByZXR1cm5lZCBpbiBMSUZPIG9yZGVyIGlmIGxhc3QgaXMgdHJ1ZSBvciBGSUZPIG9yZGVyIGlmIGZhbHNlLgoKICAgICAgICAnJycKICAgICAgICBpZiBub3Qgc2VsZjoKICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoJ2RpY3Rpb25hcnkgaXMgZW1wdHknKQogICAgICAgIHJvb3QgPSBzZWxmLl9fcm9vdAogICAgICAgIGlmIGxhc3Q6CiAgICAgICAgICAgIGxpbmsgPSByb290WzBdCiAgICAgICAgICAgIGxpbmtfcHJldiA9IGxpbmtbMF0KICAgICAgICAgICAgbGlua19wcmV2WzFdID0gcm9vdAogICAgICAgICAgICByb290WzBdID0gbGlua19wcmV2CiAgICAgICAgZWxzZToKICAgICAgICAgICAgbGluayA9IHJvb3RbMV0KICAgICAgICAgICAgbGlua19uZXh0ID0gbGlua1sxXQogICAgICAgICAgICByb290WzFdID0gbGlua19uZXh0CiAgICAgICAgICAgIGxpbmtfbmV4dFswXSA9IHJvb3QKICAgICAgICBrZXkgPSBsaW5rWzJdCiAgICAgICAgZGVsIHNlbGYuX19tYXBba2V5XQogICAgICAgIHZhbHVlID0gZGljdC5wb3Aoc2VsZiwga2V5KQogICAgICAgIHJldHVybiBrZXksIHZhbHVlCgogICAgIyAtLSB0aGUgZm9sbG93aW5nIG1ldGhvZHMgZG8gbm90IGRlcGVuZCBvbiB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIC0tCgogICAgZGVmIGtleXMoc2VsZik6CiAgICAgICAgJ29kLmtleXMoKSAtPiBsaXN0IG9mIGtleXMgaW4gb2QnCiAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZikKCiAgICBkZWYgdmFsdWVzKHNlbGYpOgogICAgICAgICdvZC52YWx1ZXMoKSAtPiBsaXN0IG9mIHZhbHVlcyBpbiBvZCcKICAgICAgICByZXR1cm4gW3NlbGZba2V5XSBmb3Iga2V5IGluIHNlbGZdCgogICAgZGVmIGl0ZW1zKHNlbGYpOgogICAgICAgICdvZC5pdGVtcygpIC0+IGxpc3Qgb2YgKGtleSwgdmFsdWUpIHBhaXJzIGluIG9kJwogICAgICAgIHJldHVybiBbKGtleSwgc2VsZltrZXldKSBmb3Iga2V5IGluIHNlbGZdCgogICAgZGVmIGl0ZXJrZXlzKHNlbGYpOgogICAgICAgICdvZC5pdGVya2V5cygpIC0+IGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGtleXMgaW4gb2QnCiAgICAgICAgcmV0dXJuIGl0ZXIoc2VsZikKCiAgICBkZWYgaXRlcnZhbHVlcyhzZWxmKToKICAgICAgICAnb2QuaXRlcnZhbHVlcyAtPiBhbiBpdGVyYXRvciBvdmVyIHRoZSB2YWx1ZXMgaW4gb2QnCiAgICAgICAgZm9yIGsgaW4gc2VsZjoKICAgICAgICAgICAgeWllbGQgc2VsZltrXQoKICAgIGRlZiBpdGVyaXRlbXMoc2VsZik6CiAgICAgICAgJ29kLml0ZXJpdGVtcyAtPiBhbiBpdGVyYXRvciBvdmVyIHRoZSAoa2V5LCB2YWx1ZSkgaXRlbXMgaW4gb2QnCiAgICAgICAgZm9yIGsgaW4gc2VsZjoKICAgICAgICAgICAgeWllbGQgKGssIHNlbGZba10pCgogICAgZGVmIHVwZGF0ZSgqYXJncywgKiprd2RzKToKICAgICAgICAnJydvZC51cGRhdGUoRSwgKipGKSAtPiBOb25lLiAgVXBkYXRlIG9kIGZyb20gZGljdC9pdGVyYWJsZSBFIGFuZCBGLgoKICAgICAgICBJZiBFIGlzIGEgZGljdCBpbnN0YW5jZSwgZG9lczogICAgICAgICAgIGZvciBrIGluIEU6IG9kW2tdID0gRVtrXQogICAgICAgIElmIEUgaGFzIGEgLmtleXMoKSBtZXRob2QsIGRvZXM6ICAgICAgICAgZm9yIGsgaW4gRS5rZXlzKCk6IG9kW2tdID0gRVtrXQogICAgICAgIE9yIGlmIEUgaXMgYW4gaXRlcmFibGUgb2YgaXRlbXMsIGRvZXM6ICAgZm9yIGssIHYgaW4gRTogb2Rba10gPSB2CiAgICAgICAgSW4gZWl0aGVyIGNhc2UsIHRoaXMgaXMgZm9sbG93ZWQgYnk6ICAgICBmb3IgaywgdiBpbiBGLml0ZW1zKCk6IG9kW2tdID0gdgoKICAgICAgICAnJycKICAgICAgICBpZiBsZW4oYXJncykgPiAyOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ3VwZGF0ZSgpIHRha2VzIGF0IG1vc3QgMiBwb3NpdGlvbmFsICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhcmd1bWVudHMgKCVkIGdpdmVuKScgJSAobGVuKGFyZ3MpLCkpCiAgICAgICAgZWxpZiBub3QgYXJnczoKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCd1cGRhdGUoKSB0YWtlcyBhdCBsZWFzdCAxIGFyZ3VtZW50ICgwIGdpdmVuKScpCiAgICAgICAgc2VsZiA9IGFyZ3NbMF0KICAgICAgICAjIE1ha2UgcHJvZ3Jlc3NpdmVseSB3ZWFrZXIgYXNzdW1wdGlvbnMgYWJvdXQgIm90aGVyIgogICAgICAgIG90aGVyID0gKCkKICAgICAgICBpZiBsZW4oYXJncykgPT0gMjoKICAgICAgICAgICAgb3RoZXIgPSBhcmdzWzFdCiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgZGljdCk6CiAgICAgICAgICAgIGZvciBrZXkgaW4gb3RoZXI6CiAgICAgICAgICAgICAgICBzZWxmW2tleV0gPSBvdGhlcltrZXldCiAgICAgICAgZWxpZiBoYXNhdHRyKG90aGVyLCAna2V5cycpOgogICAgICAgICAgICBmb3Iga2V5IGluIG90aGVyLmtleXMoKToKICAgICAgICAgICAgICAgIHNlbGZba2V5XSA9IG90aGVyW2tleV0KICAgICAgICBlbHNlOgogICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBvdGhlcjoKICAgICAgICAgICAgICAgIHNlbGZba2V5XSA9IHZhbHVlCiAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4ga3dkcy5pdGVtcygpOgogICAgICAgICAgICBzZWxmW2tleV0gPSB2YWx1ZQoKICAgIF9fdXBkYXRlID0gdXBkYXRlICAjIGxldCBzdWJjbGFzc2VzIG92ZXJyaWRlIHVwZGF0ZSB3aXRob3V0IGJyZWFraW5nIF9faW5pdF9fCgogICAgX19tYXJrZXIgPSBvYmplY3QoKQoKICAgIGRlZiBwb3Aoc2VsZiwga2V5LCBkZWZhdWx0PV9fbWFya2VyKToKICAgICAgICAnJydvZC5wb3Aoa1ssZF0pIC0+IHYsIHJlbW92ZSBzcGVjaWZpZWQga2V5IGFuZCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUuCiAgICAgICAgSWYga2V5IGlzIG5vdCBmb3VuZCwgZCBpcyByZXR1cm5lZCBpZiBnaXZlbiwgb3RoZXJ3aXNlIEtleUVycm9yIGlzIHJhaXNlZC4KCiAgICAgICAgJycnCiAgICAgICAgaWYga2V5IGluIHNlbGY6CiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGZba2V5XQogICAgICAgICAgICBkZWwgc2VsZltrZXldCiAgICAgICAgICAgIHJldHVybiByZXN1bHQKICAgICAgICBpZiBkZWZhdWx0IGlzIHNlbGYuX19tYXJrZXI6CiAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKGtleSkKICAgICAgICByZXR1cm4gZGVmYXVsdAoKICAgIGRlZiBzZXRkZWZhdWx0KHNlbGYsIGtleSwgZGVmYXVsdD1Ob25lKToKICAgICAgICAnb2Quc2V0ZGVmYXVsdChrWyxkXSkgLT4gb2QuZ2V0KGssZCksIGFsc28gc2V0IG9kW2tdPWQgaWYgayBub3QgaW4gb2QnCiAgICAgICAgaWYga2V5IGluIHNlbGY6CiAgICAgICAgICAgIHJldHVybiBzZWxmW2tleV0KICAgICAgICBzZWxmW2tleV0gPSBkZWZhdWx0CiAgICAgICAgcmV0dXJuIGRlZmF1bHQKCiAgICBkZWYgX19yZXByX18oc2VsZiwgX3JlcHJfcnVubmluZz17fSk6CiAgICAgICAgJ29kLl9fcmVwcl9fKCkgPD09PiByZXByKG9kKScKICAgICAgICBjYWxsX2tleSA9IGlkKHNlbGYpLCBfZ2V0X2lkZW50KCkKICAgICAgICBpZiBjYWxsX2tleSBpbiBfcmVwcl9ydW5uaW5nOgogICAgICAgICAgICByZXR1cm4gJy4uLicKICAgICAgICBfcmVwcl9ydW5uaW5nW2NhbGxfa2V5XSA9IDEKICAgICAgICB0cnk6CiAgICAgICAgICAgIGlmIG5vdCBzZWxmOgogICAgICAgICAgICAgICAgcmV0dXJuICclcygpJyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywpCiAgICAgICAgICAgIHJldHVybiAnJXMoJXIpJyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc2VsZi5pdGVtcygpKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGRlbCBfcmVwcl9ydW5uaW5nW2NhbGxfa2V5XQoKICAgIGRlZiBfX3JlZHVjZV9fKHNlbGYpOgogICAgICAgICdSZXR1cm4gc3RhdGUgaW5mb3JtYXRpb24gZm9yIHBpY2tsaW5nJwogICAgICAgIGl0ZW1zID0gW1trLCBzZWxmW2tdXSBmb3IgayBpbiBzZWxmXQogICAgICAgIGluc3RfZGljdCA9IHZhcnMoc2VsZikuY29weSgpCiAgICAgICAgZm9yIGsgaW4gdmFycyhPcmRlcmVkRGljdCgpKToKICAgICAgICAgICAgaW5zdF9kaWN0LnBvcChrLCBOb25lKQogICAgICAgIGlmIGluc3RfZGljdDoKICAgICAgICAgICAgcmV0dXJuIChzZWxmLl9fY2xhc3NfXywgKGl0ZW1zLCksIGluc3RfZGljdCkKICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18sIChpdGVtcywpCgogICAgZGVmIGNvcHkoc2VsZik6CiAgICAgICAgJ29kLmNvcHkoKSAtPiBhIHNoYWxsb3cgY29weSBvZiBvZCcKICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZikKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBmcm9ta2V5cyhjbHMsIGl0ZXJhYmxlLCB2YWx1ZT1Ob25lKToKICAgICAgICAnJydPRC5mcm9ta2V5cyhTWywgdl0pIC0+IE5ldyBvcmRlcmVkIGRpY3Rpb25hcnkgd2l0aCBrZXlzIGZyb20gUwogICAgICAgIGFuZCB2YWx1ZXMgZXF1YWwgdG8gdiAod2hpY2ggZGVmYXVsdHMgdG8gTm9uZSkuCgogICAgICAgICcnJwogICAgICAgIGQgPSBjbHMoKQogICAgICAgIGZvciBrZXkgaW4gaXRlcmFibGU6CiAgICAgICAgICAgIGRba2V5XSA9IHZhbHVlCiAgICAgICAgcmV0dXJuIGQKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICAnJydvZC5fX2VxX18oeSkgPD09PiBvZD09eS4gIENvbXBhcmlzb24gdG8gYW5vdGhlciBPRCBpcyBvcmRlci1zZW5zaXRpdmUKICAgICAgICB3aGlsZSBjb21wYXJpc29uIHRvIGEgcmVndWxhciBtYXBwaW5nIGlzIG9yZGVyLWluc2Vuc2l0aXZlLgoKICAgICAgICAnJycKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBPcmRlcmVkRGljdCk6CiAgICAgICAgICAgIHJldHVybiBsZW4oc2VsZik9PWxlbihvdGhlcikgYW5kIHNlbGYuaXRlbXMoKSA9PSBvdGhlci5pdGVtcygpCiAgICAgICAgcmV0dXJuIGRpY3QuX19lcV9fKHNlbGYsIG90aGVyKQoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBub3Qgc2VsZiA9PSBvdGhlcgoKICAgICMgLS0gdGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSBvbmx5IHVzZWQgaW4gUHl0aG9uIDIuNyAtLQoKICAgIGRlZiB2aWV3a2V5cyhzZWxmKToKICAgICAgICAib2Qudmlld2tleXMoKSAtPiBhIHNldC1saWtlIG9iamVjdCBwcm92aWRpbmcgYSB2aWV3IG9uIG9kJ3Mga2V5cyIKICAgICAgICByZXR1cm4gS2V5c1ZpZXcoc2VsZikKCiAgICBkZWYgdmlld3ZhbHVlcyhzZWxmKToKICAgICAgICAib2Qudmlld3ZhbHVlcygpIC0+IGFuIG9iamVjdCBwcm92aWRpbmcgYSB2aWV3IG9uIG9kJ3MgdmFsdWVzIgogICAgICAgIHJldHVybiBWYWx1ZXNWaWV3KHNlbGYpCgogICAgZGVmIHZpZXdpdGVtcyhzZWxmKToKICAgICAgICAib2Qudmlld2l0ZW1zKCkgLT4gYSBzZXQtbGlrZSBvYmplY3QgcHJvdmlkaW5nIGEgdmlldyBvbiBvZCdzIGl0ZW1zIgogICAgICAgIHJldHVybiBJdGVtc1ZpZXcoc2VsZikKUEsDBBQAAAAAAAAAIQCZWE1aknUAAJJ1AAAzAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvcGFja2FnZXMvc2l4LnB5IiIiVXRpbGl0aWVzIGZvciB3cml0aW5nIGNvZGUgdGhhdCBydW5zIG9uIFB5dGhvbiAyIGFuZCAzIiIiCgojIENvcHlyaWdodCAoYykgMjAxMC0yMDE1IEJlbmphbWluIFBldGVyc29uCiMKIyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CiMgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKIyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCiMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAojIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwojIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiMKIyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKIyBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgojCiMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKIyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKIyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCiMgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKIyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQojIFNPRlRXQVJFLgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBmdW5jdG9vbHMKaW1wb3J0IGl0ZXJ0b29scwppbXBvcnQgb3BlcmF0b3IKaW1wb3J0IHN5cwppbXBvcnQgdHlwZXMKCl9fYXV0aG9yX18gPSAiQmVuamFtaW4gUGV0ZXJzb24gPGJlbmphbWluQHB5dGhvbi5vcmc+IgpfX3ZlcnNpb25fXyA9ICIxLjEwLjAiCgoKIyBVc2VmdWwgZm9yIHZlcnkgY29hcnNlIHZlcnNpb24gZGlmZmVyZW50aWF0aW9uLgpQWTIgPSBzeXMudmVyc2lvbl9pbmZvWzBdID09IDIKUFkzID0gc3lzLnZlcnNpb25faW5mb1swXSA9PSAzClBZMzQgPSBzeXMudmVyc2lvbl9pbmZvWzA6Ml0gPj0gKDMsIDQpCgppZiBQWTM6CiAgICBzdHJpbmdfdHlwZXMgPSBzdHIsCiAgICBpbnRlZ2VyX3R5cGVzID0gaW50LAogICAgY2xhc3NfdHlwZXMgPSB0eXBlLAogICAgdGV4dF90eXBlID0gc3RyCiAgICBiaW5hcnlfdHlwZSA9IGJ5dGVzCgogICAgTUFYU0laRSA9IHN5cy5tYXhzaXplCmVsc2U6CiAgICBzdHJpbmdfdHlwZXMgPSBiYXNlc3RyaW5nLAogICAgaW50ZWdlcl90eXBlcyA9IChpbnQsIGxvbmcpCiAgICBjbGFzc190eXBlcyA9ICh0eXBlLCB0eXBlcy5DbGFzc1R5cGUpCiAgICB0ZXh0X3R5cGUgPSB1bmljb2RlCiAgICBiaW5hcnlfdHlwZSA9IHN0cgoKICAgIGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCJqYXZhIik6CiAgICAgICAgIyBKeXRob24gYWx3YXlzIHVzZXMgMzIgYml0cy4KICAgICAgICBNQVhTSVpFID0gaW50KCgxIDw8IDMxKSAtIDEpCiAgICBlbHNlOgogICAgICAgICMgSXQncyBwb3NzaWJsZSB0byBoYXZlIHNpemVvZihsb25nKSAhPSBzaXplb2YoUHlfc3NpemVfdCkuCiAgICAgICAgY2xhc3MgWChvYmplY3QpOgoKICAgICAgICAgICAgZGVmIF9fbGVuX18oc2VsZik6CiAgICAgICAgICAgICAgICByZXR1cm4gMSA8PCAzMQogICAgICAgIHRyeToKICAgICAgICAgICAgbGVuKFgoKSkKICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKICAgICAgICAgICAgIyAzMi1iaXQKICAgICAgICAgICAgTUFYU0laRSA9IGludCgoMSA8PCAzMSkgLSAxKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgNjQtYml0CiAgICAgICAgICAgIE1BWFNJWkUgPSBpbnQoKDEgPDwgNjMpIC0gMSkKICAgICAgICBkZWwgWAoKCmRlZiBfYWRkX2RvYyhmdW5jLCBkb2MpOgogICAgIiIiQWRkIGRvY3VtZW50YXRpb24gdG8gYSBmdW5jdGlvbi4iIiIKICAgIGZ1bmMuX19kb2NfXyA9IGRvYwoKCmRlZiBfaW1wb3J0X21vZHVsZShuYW1lKToKICAgICIiIkltcG9ydCBtb2R1bGUsIHJldHVybmluZyB0aGUgbW9kdWxlIGFmdGVyIHRoZSBsYXN0IGRvdC4iIiIKICAgIF9faW1wb3J0X18obmFtZSkKICAgIHJldHVybiBzeXMubW9kdWxlc1tuYW1lXQoKCmNsYXNzIF9MYXp5RGVzY3Iob2JqZWN0KToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6CiAgICAgICAgc2VsZi5uYW1lID0gbmFtZQoKICAgIGRlZiBfX2dldF9fKHNlbGYsIG9iaiwgdHApOgogICAgICAgIHJlc3VsdCA9IHNlbGYuX3Jlc29sdmUoKQogICAgICAgIHNldGF0dHIob2JqLCBzZWxmLm5hbWUsIHJlc3VsdCkgICMgSW52b2tlcyBfX3NldF9fLgogICAgICAgIHRyeToKICAgICAgICAgICAgIyBUaGlzIGlzIGEgYml0IHVnbHksIGJ1dCBpdCBhdm9pZHMgcnVubmluZyB0aGlzIGFnYWluIGJ5CiAgICAgICAgICAgICMgcmVtb3ZpbmcgdGhpcyBkZXNjcmlwdG9yLgogICAgICAgICAgICBkZWxhdHRyKG9iai5fX2NsYXNzX18sIHNlbGYubmFtZSkKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIHBhc3MKICAgICAgICByZXR1cm4gcmVzdWx0CgoKY2xhc3MgTW92ZWRNb2R1bGUoX0xhenlEZXNjcik6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIG9sZCwgbmV3PU5vbmUpOgogICAgICAgIHN1cGVyKE1vdmVkTW9kdWxlLCBzZWxmKS5fX2luaXRfXyhuYW1lKQogICAgICAgIGlmIFBZMzoKICAgICAgICAgICAgaWYgbmV3IGlzIE5vbmU6CiAgICAgICAgICAgICAgICBuZXcgPSBuYW1lCiAgICAgICAgICAgIHNlbGYubW9kID0gbmV3CiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5tb2QgPSBvbGQKCiAgICBkZWYgX3Jlc29sdmUoc2VsZik6CiAgICAgICAgcmV0dXJuIF9pbXBvcnRfbW9kdWxlKHNlbGYubW9kKQoKICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBhdHRyKToKICAgICAgICBfbW9kdWxlID0gc2VsZi5fcmVzb2x2ZSgpCiAgICAgICAgdmFsdWUgPSBnZXRhdHRyKF9tb2R1bGUsIGF0dHIpCiAgICAgICAgc2V0YXR0cihzZWxmLCBhdHRyLCB2YWx1ZSkKICAgICAgICByZXR1cm4gdmFsdWUKCgpjbGFzcyBfTGF6eU1vZHVsZSh0eXBlcy5Nb2R1bGVUeXBlKToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6CiAgICAgICAgc3VwZXIoX0xhenlNb2R1bGUsIHNlbGYpLl9faW5pdF9fKG5hbWUpCiAgICAgICAgc2VsZi5fX2RvY19fID0gc2VsZi5fX2NsYXNzX18uX19kb2NfXwoKICAgIGRlZiBfX2Rpcl9fKHNlbGYpOgogICAgICAgIGF0dHJzID0gWyJfX2RvY19fIiwgIl9fbmFtZV9fIl0KICAgICAgICBhdHRycyArPSBbYXR0ci5uYW1lIGZvciBhdHRyIGluIHNlbGYuX21vdmVkX2F0dHJpYnV0ZXNdCiAgICAgICAgcmV0dXJuIGF0dHJzCgogICAgIyBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzCiAgICBfbW92ZWRfYXR0cmlidXRlcyA9IFtdCgoKY2xhc3MgTW92ZWRBdHRyaWJ1dGUoX0xhenlEZXNjcik6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIG9sZF9tb2QsIG5ld19tb2QsIG9sZF9hdHRyPU5vbmUsIG5ld19hdHRyPU5vbmUpOgogICAgICAgIHN1cGVyKE1vdmVkQXR0cmlidXRlLCBzZWxmKS5fX2luaXRfXyhuYW1lKQogICAgICAgIGlmIFBZMzoKICAgICAgICAgICAgaWYgbmV3X21vZCBpcyBOb25lOgogICAgICAgICAgICAgICAgbmV3X21vZCA9IG5hbWUKICAgICAgICAgICAgc2VsZi5tb2QgPSBuZXdfbW9kCiAgICAgICAgICAgIGlmIG5ld19hdHRyIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBpZiBvbGRfYXR0ciBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgIG5ld19hdHRyID0gbmFtZQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBuZXdfYXR0ciA9IG9sZF9hdHRyCiAgICAgICAgICAgIHNlbGYuYXR0ciA9IG5ld19hdHRyCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5tb2QgPSBvbGRfbW9kCiAgICAgICAgICAgIGlmIG9sZF9hdHRyIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBvbGRfYXR0ciA9IG5hbWUKICAgICAgICAgICAgc2VsZi5hdHRyID0gb2xkX2F0dHIKCiAgICBkZWYgX3Jlc29sdmUoc2VsZik6CiAgICAgICAgbW9kdWxlID0gX2ltcG9ydF9tb2R1bGUoc2VsZi5tb2QpCiAgICAgICAgcmV0dXJuIGdldGF0dHIobW9kdWxlLCBzZWxmLmF0dHIpCgoKY2xhc3MgX1NpeE1ldGFQYXRoSW1wb3J0ZXIob2JqZWN0KToKCiAgICAiIiIKICAgIEEgbWV0YSBwYXRoIGltcG9ydGVyIHRvIGltcG9ydCBzaXgubW92ZXMgYW5kIGl0cyBzdWJtb2R1bGVzLgoKICAgIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIFBFUDMwMiBmaW5kZXIgYW5kIGxvYWRlci4gSXQgc2hvdWxkIGJlIGNvbXBhdGlibGUKICAgIHdpdGggUHl0aG9uIDIuNSBhbmQgYWxsIGV4aXN0aW5nIHZlcnNpb25zIG9mIFB5dGhvbjMKICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzaXhfbW9kdWxlX25hbWUpOgogICAgICAgIHNlbGYubmFtZSA9IHNpeF9tb2R1bGVfbmFtZQogICAgICAgIHNlbGYua25vd25fbW9kdWxlcyA9IHt9CgogICAgZGVmIF9hZGRfbW9kdWxlKHNlbGYsIG1vZCwgKmZ1bGxuYW1lcyk6CiAgICAgICAgZm9yIGZ1bGxuYW1lIGluIGZ1bGxuYW1lczoKICAgICAgICAgICAgc2VsZi5rbm93bl9tb2R1bGVzW3NlbGYubmFtZSArICIuIiArIGZ1bGxuYW1lXSA9IG1vZAoKICAgIGRlZiBfZ2V0X21vZHVsZShzZWxmLCBmdWxsbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYua25vd25fbW9kdWxlc1tzZWxmLm5hbWUgKyAiLiIgKyBmdWxsbmFtZV0KCiAgICBkZWYgZmluZF9tb2R1bGUoc2VsZiwgZnVsbG5hbWUsIHBhdGg9Tm9uZSk6CiAgICAgICAgaWYgZnVsbG5hbWUgaW4gc2VsZi5rbm93bl9tb2R1bGVzOgogICAgICAgICAgICByZXR1cm4gc2VsZgogICAgICAgIHJldHVybiBOb25lCgogICAgZGVmIF9fZ2V0X21vZHVsZShzZWxmLCBmdWxsbmFtZSk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5rbm93bl9tb2R1bGVzW2Z1bGxuYW1lXQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoIlRoaXMgbG9hZGVyIGRvZXMgbm90IGtub3cgbW9kdWxlICIgKyBmdWxsbmFtZSkKCiAgICBkZWYgbG9hZF9tb2R1bGUoc2VsZiwgZnVsbG5hbWUpOgogICAgICAgIHRyeToKICAgICAgICAgICAgIyBpbiBjYXNlIG9mIGEgcmVsb2FkCiAgICAgICAgICAgIHJldHVybiBzeXMubW9kdWxlc1tmdWxsbmFtZV0KICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgIHBhc3MKICAgICAgICBtb2QgPSBzZWxmLl9fZ2V0X21vZHVsZShmdWxsbmFtZSkKICAgICAgICBpZiBpc2luc3RhbmNlKG1vZCwgTW92ZWRNb2R1bGUpOgogICAgICAgICAgICBtb2QgPSBtb2QuX3Jlc29sdmUoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG1vZC5fX2xvYWRlcl9fID0gc2VsZgogICAgICAgIHN5cy5tb2R1bGVzW2Z1bGxuYW1lXSA9IG1vZAogICAgICAgIHJldHVybiBtb2QKCiAgICBkZWYgaXNfcGFja2FnZShzZWxmLCBmdWxsbmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIHRydWUsIGlmIHRoZSBuYW1lZCBtb2R1bGUgaXMgYSBwYWNrYWdlLgoKICAgICAgICBXZSBuZWVkIHRoaXMgbWV0aG9kIHRvIGdldCBjb3JyZWN0IHNwZWMgb2JqZWN0cyB3aXRoCiAgICAgICAgUHl0aG9uIDMuNCAoc2VlIFBFUDQ1MSkKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gaGFzYXR0cihzZWxmLl9fZ2V0X21vZHVsZShmdWxsbmFtZSksICJfX3BhdGhfXyIpCgogICAgZGVmIGdldF9jb2RlKHNlbGYsIGZ1bGxuYW1lKToKICAgICAgICAiIiJSZXR1cm4gTm9uZQoKICAgICAgICBSZXF1aXJlZCwgaWYgaXNfcGFja2FnZSBpcyBpbXBsZW1lbnRlZCIiIgogICAgICAgIHNlbGYuX19nZXRfbW9kdWxlKGZ1bGxuYW1lKSAgIyBldmVudHVhbGx5IHJhaXNlcyBJbXBvcnRFcnJvcgogICAgICAgIHJldHVybiBOb25lCiAgICBnZXRfc291cmNlID0gZ2V0X2NvZGUgICMgc2FtZSBhcyBnZXRfY29kZQoKX2ltcG9ydGVyID0gX1NpeE1ldGFQYXRoSW1wb3J0ZXIoX19uYW1lX18pCgoKY2xhc3MgX01vdmVkSXRlbXMoX0xhenlNb2R1bGUpOgoKICAgICIiIkxhenkgbG9hZGluZyBvZiBtb3ZlZCBvYmplY3RzIiIiCiAgICBfX3BhdGhfXyA9IFtdICAjIG1hcmsgYXMgcGFja2FnZQoKCl9tb3ZlZF9hdHRyaWJ1dGVzID0gWwogICAgTW92ZWRBdHRyaWJ1dGUoImNTdHJpbmdJTyIsICJjU3RyaW5nSU8iLCAiaW8iLCAiU3RyaW5nSU8iKSwKICAgIE1vdmVkQXR0cmlidXRlKCJmaWx0ZXIiLCAiaXRlcnRvb2xzIiwgImJ1aWx0aW5zIiwgImlmaWx0ZXIiLCAiZmlsdGVyIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiZmlsdGVyZmFsc2UiLCAiaXRlcnRvb2xzIiwgIml0ZXJ0b29scyIsICJpZmlsdGVyZmFsc2UiLCAiZmlsdGVyZmFsc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJpbnB1dCIsICJfX2J1aWx0aW5fXyIsICJidWlsdGlucyIsICJyYXdfaW5wdXQiLCAiaW5wdXQiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJpbnRlcm4iLCAiX19idWlsdGluX18iLCAic3lzIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgibWFwIiwgIml0ZXJ0b29scyIsICJidWlsdGlucyIsICJpbWFwIiwgIm1hcCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImdldGN3ZCIsICJvcyIsICJvcyIsICJnZXRjd2R1IiwgImdldGN3ZCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImdldGN3ZGIiLCAib3MiLCAib3MiLCAiZ2V0Y3dkIiwgImdldGN3ZGIiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJyYW5nZSIsICJfX2J1aWx0aW5fXyIsICJidWlsdGlucyIsICJ4cmFuZ2UiLCAicmFuZ2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJyZWxvYWRfbW9kdWxlIiwgIl9fYnVpbHRpbl9fIiwgImltcG9ydGxpYiIgaWYgUFkzNCBlbHNlICJpbXAiLCAicmVsb2FkIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicmVkdWNlIiwgIl9fYnVpbHRpbl9fIiwgImZ1bmN0b29scyIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInNobGV4X3F1b3RlIiwgInBpcGVzIiwgInNobGV4IiwgInF1b3RlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiU3RyaW5nSU8iLCAiU3RyaW5nSU8iLCAiaW8iKSwKICAgIE1vdmVkQXR0cmlidXRlKCJVc2VyRGljdCIsICJVc2VyRGljdCIsICJjb2xsZWN0aW9ucyIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlVzZXJMaXN0IiwgIlVzZXJMaXN0IiwgImNvbGxlY3Rpb25zIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiVXNlclN0cmluZyIsICJVc2VyU3RyaW5nIiwgImNvbGxlY3Rpb25zIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgieHJhbmdlIiwgIl9fYnVpbHRpbl9fIiwgImJ1aWx0aW5zIiwgInhyYW5nZSIsICJyYW5nZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInppcCIsICJpdGVydG9vbHMiLCAiYnVpbHRpbnMiLCAiaXppcCIsICJ6aXAiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ6aXBfbG9uZ2VzdCIsICJpdGVydG9vbHMiLCAiaXRlcnRvb2xzIiwgIml6aXBfbG9uZ2VzdCIsICJ6aXBfbG9uZ2VzdCIpLAogICAgTW92ZWRNb2R1bGUoImJ1aWx0aW5zIiwgIl9fYnVpbHRpbl9fIiksCiAgICBNb3ZlZE1vZHVsZSgiY29uZmlncGFyc2VyIiwgIkNvbmZpZ1BhcnNlciIpLAogICAgTW92ZWRNb2R1bGUoImNvcHlyZWciLCAiY29weV9yZWciKSwKICAgIE1vdmVkTW9kdWxlKCJkYm1fZ251IiwgImdkYm0iLCAiZGJtLmdudSIpLAogICAgTW92ZWRNb2R1bGUoIl9kdW1teV90aHJlYWQiLCAiZHVtbXlfdGhyZWFkIiwgIl9kdW1teV90aHJlYWQiKSwKICAgIE1vdmVkTW9kdWxlKCJodHRwX2Nvb2tpZWphciIsICJjb29raWVsaWIiLCAiaHR0cC5jb29raWVqYXIiKSwKICAgIE1vdmVkTW9kdWxlKCJodHRwX2Nvb2tpZXMiLCAiQ29va2llIiwgImh0dHAuY29va2llcyIpLAogICAgTW92ZWRNb2R1bGUoImh0bWxfZW50aXRpZXMiLCAiaHRtbGVudGl0eWRlZnMiLCAiaHRtbC5lbnRpdGllcyIpLAogICAgTW92ZWRNb2R1bGUoImh0bWxfcGFyc2VyIiwgIkhUTUxQYXJzZXIiLCAiaHRtbC5wYXJzZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJodHRwX2NsaWVudCIsICJodHRwbGliIiwgImh0dHAuY2xpZW50IiksCiAgICBNb3ZlZE1vZHVsZSgiZW1haWxfbWltZV9tdWx0aXBhcnQiLCAiZW1haWwuTUlNRU11bHRpcGFydCIsICJlbWFpbC5taW1lLm11bHRpcGFydCIpLAogICAgTW92ZWRNb2R1bGUoImVtYWlsX21pbWVfbm9ubXVsdGlwYXJ0IiwgImVtYWlsLk1JTUVOb25NdWx0aXBhcnQiLCAiZW1haWwubWltZS5ub25tdWx0aXBhcnQiKSwKICAgIE1vdmVkTW9kdWxlKCJlbWFpbF9taW1lX3RleHQiLCAiZW1haWwuTUlNRVRleHQiLCAiZW1haWwubWltZS50ZXh0IiksCiAgICBNb3ZlZE1vZHVsZSgiZW1haWxfbWltZV9iYXNlIiwgImVtYWlsLk1JTUVCYXNlIiwgImVtYWlsLm1pbWUuYmFzZSIpLAogICAgTW92ZWRNb2R1bGUoIkJhc2VIVFRQU2VydmVyIiwgIkJhc2VIVFRQU2VydmVyIiwgImh0dHAuc2VydmVyIiksCiAgICBNb3ZlZE1vZHVsZSgiQ0dJSFRUUFNlcnZlciIsICJDR0lIVFRQU2VydmVyIiwgImh0dHAuc2VydmVyIiksCiAgICBNb3ZlZE1vZHVsZSgiU2ltcGxlSFRUUFNlcnZlciIsICJTaW1wbGVIVFRQU2VydmVyIiwgImh0dHAuc2VydmVyIiksCiAgICBNb3ZlZE1vZHVsZSgiY1BpY2tsZSIsICJjUGlja2xlIiwgInBpY2tsZSIpLAogICAgTW92ZWRNb2R1bGUoInF1ZXVlIiwgIlF1ZXVlIiksCiAgICBNb3ZlZE1vZHVsZSgicmVwcmxpYiIsICJyZXByIiksCiAgICBNb3ZlZE1vZHVsZSgic29ja2V0c2VydmVyIiwgIlNvY2tldFNlcnZlciIpLAogICAgTW92ZWRNb2R1bGUoIl90aHJlYWQiLCAidGhyZWFkIiwgIl90aHJlYWQiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyIiwgIlRraW50ZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX2RpYWxvZyIsICJEaWFsb2ciLCAidGtpbnRlci5kaWFsb2ciKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX2ZpbGVkaWFsb2ciLCAiRmlsZURpYWxvZyIsICJ0a2ludGVyLmZpbGVkaWFsb2ciKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX3Njcm9sbGVkdGV4dCIsICJTY3JvbGxlZFRleHQiLCAidGtpbnRlci5zY3JvbGxlZHRleHQiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX3NpbXBsZWRpYWxvZyIsICJTaW1wbGVEaWFsb2ciLCAidGtpbnRlci5zaW1wbGVkaWFsb2ciKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX3RpeCIsICJUaXgiLCAidGtpbnRlci50aXgiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX3R0ayIsICJ0dGsiLCAidGtpbnRlci50dGsiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX2NvbnN0YW50cyIsICJUa2NvbnN0YW50cyIsICJ0a2ludGVyLmNvbnN0YW50cyIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfZG5kIiwgIlRrZG5kIiwgInRraW50ZXIuZG5kIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9jb2xvcmNob29zZXIiLCAidGtDb2xvckNob29zZXIiLAogICAgICAgICAgICAgICAgInRraW50ZXIuY29sb3JjaG9vc2VyIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9jb21tb25kaWFsb2ciLCAidGtDb21tb25EaWFsb2ciLAogICAgICAgICAgICAgICAgInRraW50ZXIuY29tbW9uZGlhbG9nIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl90a2ZpbGVkaWFsb2ciLCAidGtGaWxlRGlhbG9nIiwgInRraW50ZXIuZmlsZWRpYWxvZyIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfZm9udCIsICJ0a0ZvbnQiLCAidGtpbnRlci5mb250IiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9tZXNzYWdlYm94IiwgInRrTWVzc2FnZUJveCIsICJ0a2ludGVyLm1lc3NhZ2Vib3giKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX3Rrc2ltcGxlZGlhbG9nIiwgInRrU2ltcGxlRGlhbG9nIiwKICAgICAgICAgICAgICAgICJ0a2ludGVyLnNpbXBsZWRpYWxvZyIpLAogICAgTW92ZWRNb2R1bGUoInVybGxpYl9wYXJzZSIsIF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWJfcGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZE1vZHVsZSgidXJsbGliX2Vycm9yIiwgX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYl9lcnJvciIsICJ1cmxsaWIuZXJyb3IiKSwKICAgIE1vdmVkTW9kdWxlKCJ1cmxsaWIiLCBfX25hbWVfXyArICIubW92ZXMudXJsbGliIiwgX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYiIpLAogICAgTW92ZWRNb2R1bGUoInVybGxpYl9yb2JvdHBhcnNlciIsICJyb2JvdHBhcnNlciIsICJ1cmxsaWIucm9ib3RwYXJzZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJ4bWxycGNfY2xpZW50IiwgInhtbHJwY2xpYiIsICJ4bWxycGMuY2xpZW50IiksCiAgICBNb3ZlZE1vZHVsZSgieG1scnBjX3NlcnZlciIsICJTaW1wbGVYTUxSUENTZXJ2ZXIiLCAieG1scnBjLnNlcnZlciIpLApdCiMgQWRkIHdpbmRvd3Mgc3BlY2lmaWMgbW9kdWxlcy4KaWYgc3lzLnBsYXRmb3JtID09ICJ3aW4zMiI6CiAgICBfbW92ZWRfYXR0cmlidXRlcyArPSBbCiAgICAgICAgTW92ZWRNb2R1bGUoIndpbnJlZyIsICJfd2lucmVnIiksCiAgICBdCgpmb3IgYXR0ciBpbiBfbW92ZWRfYXR0cmlidXRlczoKICAgIHNldGF0dHIoX01vdmVkSXRlbXMsIGF0dHIubmFtZSwgYXR0cikKICAgIGlmIGlzaW5zdGFuY2UoYXR0ciwgTW92ZWRNb2R1bGUpOgogICAgICAgIF9pbXBvcnRlci5fYWRkX21vZHVsZShhdHRyLCAibW92ZXMuIiArIGF0dHIubmFtZSkKZGVsIGF0dHIKCl9Nb3ZlZEl0ZW1zLl9tb3ZlZF9hdHRyaWJ1dGVzID0gX21vdmVkX2F0dHJpYnV0ZXMKCm1vdmVzID0gX01vdmVkSXRlbXMoX19uYW1lX18gKyAiLm1vdmVzIikKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKG1vdmVzLCAibW92ZXMiKQoKCmNsYXNzIE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3BhcnNlKF9MYXp5TW9kdWxlKToKCiAgICAiIiJMYXp5IGxvYWRpbmcgb2YgbW92ZWQgb2JqZWN0cyBpbiBzaXgubW92ZXMudXJsbGliX3BhcnNlIiIiCgoKX3VybGxpYl9wYXJzZV9tb3ZlZF9hdHRyaWJ1dGVzID0gWwogICAgTW92ZWRBdHRyaWJ1dGUoIlBhcnNlUmVzdWx0IiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlNwbGl0UmVzdWx0IiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInBhcnNlX3FzIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInBhcnNlX3FzbCIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxkZWZyYWciLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsam9pbiIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxwYXJzZSIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxzcGxpdCIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmx1bnBhcnNlIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybHVuc3BsaXQiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicXVvdGUiLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInF1b3RlX3BsdXMiLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVucXVvdGUiLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVucXVvdGVfcGx1cyIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsZW5jb2RlIiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJzcGxpdHF1ZXJ5IiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJzcGxpdHRhZyIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgic3BsaXR1c2VyIiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1c2VzX2ZyYWdtZW50IiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVzZXNfbmV0bG9jIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVzZXNfcGFyYW1zIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVzZXNfcXVlcnkiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXNlc19yZWxhdGl2ZSIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKXQpmb3IgYXR0ciBpbiBfdXJsbGliX3BhcnNlX21vdmVkX2F0dHJpYnV0ZXM6CiAgICBzZXRhdHRyKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3BhcnNlLCBhdHRyLm5hbWUsIGF0dHIpCmRlbCBhdHRyCgpNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9wYXJzZS5fbW92ZWRfYXR0cmlidXRlcyA9IF91cmxsaWJfcGFyc2VfbW92ZWRfYXR0cmlidXRlcwoKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3BhcnNlKF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWJfcGFyc2UiKSwKICAgICAgICAgICAgICAgICAgICAgICJtb3Zlcy51cmxsaWJfcGFyc2UiLCAibW92ZXMudXJsbGliLnBhcnNlIikKCgpjbGFzcyBNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9lcnJvcihfTGF6eU1vZHVsZSk6CgogICAgIiIiTGF6eSBsb2FkaW5nIG9mIG1vdmVkIG9iamVjdHMgaW4gc2l4Lm1vdmVzLnVybGxpYl9lcnJvciIiIgoKCl91cmxsaWJfZXJyb3JfbW92ZWRfYXR0cmlidXRlcyA9IFsKICAgIE1vdmVkQXR0cmlidXRlKCJVUkxFcnJvciIsICJ1cmxsaWIyIiwgInVybGxpYi5lcnJvciIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBFcnJvciIsICJ1cmxsaWIyIiwgInVybGxpYi5lcnJvciIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkNvbnRlbnRUb29TaG9ydEVycm9yIiwgInVybGxpYiIsICJ1cmxsaWIuZXJyb3IiKSwKXQpmb3IgYXR0ciBpbiBfdXJsbGliX2Vycm9yX21vdmVkX2F0dHJpYnV0ZXM6CiAgICBzZXRhdHRyKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX2Vycm9yLCBhdHRyLm5hbWUsIGF0dHIpCmRlbCBhdHRyCgpNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9lcnJvci5fbW92ZWRfYXR0cmlidXRlcyA9IF91cmxsaWJfZXJyb3JfbW92ZWRfYXR0cmlidXRlcwoKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX2Vycm9yKF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWIuZXJyb3IiKSwKICAgICAgICAgICAgICAgICAgICAgICJtb3Zlcy51cmxsaWJfZXJyb3IiLCAibW92ZXMudXJsbGliLmVycm9yIikKCgpjbGFzcyBNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXF1ZXN0KF9MYXp5TW9kdWxlKToKCiAgICAiIiJMYXp5IGxvYWRpbmcgb2YgbW92ZWQgb2JqZWN0cyBpbiBzaXgubW92ZXMudXJsbGliX3JlcXVlc3QiIiIKCgpfdXJsbGliX3JlcXVlc3RfbW92ZWRfYXR0cmlidXRlcyA9IFsKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxvcGVuIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJpbnN0YWxsX29wZW5lciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiYnVpbGRfb3BlbmVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJwYXRobmFtZTJ1cmwiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsMnBhdGhuYW1lIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImdldHByb3hpZXMiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiUmVxdWVzdCIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiT3BlbmVyRGlyZWN0b3IiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBEZWZhdWx0RXJyb3JIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQUmVkaXJlY3RIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQQ29va2llUHJvY2Vzc29yIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJQcm94eUhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkJhc2VIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQUGFzc3dvcmRNZ3IiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBQYXNzd29yZE1ncldpdGhEZWZhdWx0UmVhbG0iLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkFic3RyYWN0QmFzaWNBdXRoSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUEJhc2ljQXV0aEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlByb3h5QmFzaWNBdXRoSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiQWJzdHJhY3REaWdlc3RBdXRoSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUERpZ2VzdEF1dGhIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJQcm94eURpZ2VzdEF1dGhIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUFNIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJGaWxlSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiRlRQSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiQ2FjaGVGVFBIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJVbmtub3duSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUEVycm9yUHJvY2Vzc29yIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxyZXRyaWV2ZSIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmxjbGVhbnVwIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlVSTG9wZW5lciIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJGYW5jeVVSTG9wZW5lciIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJwcm94eV9ieXBhc3MiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCl0KZm9yIGF0dHIgaW4gX3VybGxpYl9yZXF1ZXN0X21vdmVkX2F0dHJpYnV0ZXM6CiAgICBzZXRhdHRyKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JlcXVlc3QsIGF0dHIubmFtZSwgYXR0cikKZGVsIGF0dHIKCk1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JlcXVlc3QuX21vdmVkX2F0dHJpYnV0ZXMgPSBfdXJsbGliX3JlcXVlc3RfbW92ZWRfYXR0cmlidXRlcwoKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JlcXVlc3QoX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYi5yZXF1ZXN0IiksCiAgICAgICAgICAgICAgICAgICAgICAibW92ZXMudXJsbGliX3JlcXVlc3QiLCAibW92ZXMudXJsbGliLnJlcXVlc3QiKQoKCmNsYXNzIE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3Jlc3BvbnNlKF9MYXp5TW9kdWxlKToKCiAgICAiIiJMYXp5IGxvYWRpbmcgb2YgbW92ZWQgb2JqZWN0cyBpbiBzaXgubW92ZXMudXJsbGliX3Jlc3BvbnNlIiIiCgoKX3VybGxpYl9yZXNwb25zZV9tb3ZlZF9hdHRyaWJ1dGVzID0gWwogICAgTW92ZWRBdHRyaWJ1dGUoImFkZGJhc2UiLCAidXJsbGliIiwgInVybGxpYi5yZXNwb25zZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImFkZGNsb3NlaG9vayIsICJ1cmxsaWIiLCAidXJsbGliLnJlc3BvbnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiYWRkaW5mbyIsICJ1cmxsaWIiLCAidXJsbGliLnJlc3BvbnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiYWRkaW5mb3VybCIsICJ1cmxsaWIiLCAidXJsbGliLnJlc3BvbnNlIiksCl0KZm9yIGF0dHIgaW4gX3VybGxpYl9yZXNwb25zZV9tb3ZlZF9hdHRyaWJ1dGVzOgogICAgc2V0YXR0cihNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXNwb25zZSwgYXR0ci5uYW1lLCBhdHRyKQpkZWwgYXR0cgoKTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcmVzcG9uc2UuX21vdmVkX2F0dHJpYnV0ZXMgPSBfdXJsbGliX3Jlc3BvbnNlX21vdmVkX2F0dHJpYnV0ZXMKCl9pbXBvcnRlci5fYWRkX21vZHVsZShNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXNwb25zZShfX25hbWVfXyArICIubW92ZXMudXJsbGliLnJlc3BvbnNlIiksCiAgICAgICAgICAgICAgICAgICAgICAibW92ZXMudXJsbGliX3Jlc3BvbnNlIiwgIm1vdmVzLnVybGxpYi5yZXNwb25zZSIpCgoKY2xhc3MgTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcm9ib3RwYXJzZXIoX0xhenlNb2R1bGUpOgoKICAgICIiIkxhenkgbG9hZGluZyBvZiBtb3ZlZCBvYmplY3RzIGluIHNpeC5tb3Zlcy51cmxsaWJfcm9ib3RwYXJzZXIiIiIKCgpfdXJsbGliX3JvYm90cGFyc2VyX21vdmVkX2F0dHJpYnV0ZXMgPSBbCiAgICBNb3ZlZEF0dHJpYnV0ZSgiUm9ib3RGaWxlUGFyc2VyIiwgInJvYm90cGFyc2VyIiwgInVybGxpYi5yb2JvdHBhcnNlciIpLApdCmZvciBhdHRyIGluIF91cmxsaWJfcm9ib3RwYXJzZXJfbW92ZWRfYXR0cmlidXRlczoKICAgIHNldGF0dHIoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcm9ib3RwYXJzZXIsIGF0dHIubmFtZSwgYXR0cikKZGVsIGF0dHIKCk1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JvYm90cGFyc2VyLl9tb3ZlZF9hdHRyaWJ1dGVzID0gX3VybGxpYl9yb2JvdHBhcnNlcl9tb3ZlZF9hdHRyaWJ1dGVzCgpfaW1wb3J0ZXIuX2FkZF9tb2R1bGUoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcm9ib3RwYXJzZXIoX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYi5yb2JvdHBhcnNlciIpLAogICAgICAgICAgICAgICAgICAgICAgIm1vdmVzLnVybGxpYl9yb2JvdHBhcnNlciIsICJtb3Zlcy51cmxsaWIucm9ib3RwYXJzZXIiKQoKCmNsYXNzIE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliKHR5cGVzLk1vZHVsZVR5cGUpOgoKICAgICIiIkNyZWF0ZSBhIHNpeC5tb3Zlcy51cmxsaWIgbmFtZXNwYWNlIHRoYXQgcmVzZW1ibGVzIHRoZSBQeXRob24gMyBuYW1lc3BhY2UiIiIKICAgIF9fcGF0aF9fID0gW10gICMgbWFyayBhcyBwYWNrYWdlCiAgICBwYXJzZSA9IF9pbXBvcnRlci5fZ2V0X21vZHVsZSgibW92ZXMudXJsbGliX3BhcnNlIikKICAgIGVycm9yID0gX2ltcG9ydGVyLl9nZXRfbW9kdWxlKCJtb3Zlcy51cmxsaWJfZXJyb3IiKQogICAgcmVxdWVzdCA9IF9pbXBvcnRlci5fZ2V0X21vZHVsZSgibW92ZXMudXJsbGliX3JlcXVlc3QiKQogICAgcmVzcG9uc2UgPSBfaW1wb3J0ZXIuX2dldF9tb2R1bGUoIm1vdmVzLnVybGxpYl9yZXNwb25zZSIpCiAgICByb2JvdHBhcnNlciA9IF9pbXBvcnRlci5fZ2V0X21vZHVsZSgibW92ZXMudXJsbGliX3JvYm90cGFyc2VyIikKCiAgICBkZWYgX19kaXJfXyhzZWxmKToKICAgICAgICByZXR1cm4gWydwYXJzZScsICdlcnJvcicsICdyZXF1ZXN0JywgJ3Jlc3BvbnNlJywgJ3JvYm90cGFyc2VyJ10KCl9pbXBvcnRlci5fYWRkX21vZHVsZShNb2R1bGVfc2l4X21vdmVzX3VybGxpYihfX25hbWVfXyArICIubW92ZXMudXJsbGliIiksCiAgICAgICAgICAgICAgICAgICAgICAibW92ZXMudXJsbGliIikKCgpkZWYgYWRkX21vdmUobW92ZSk6CiAgICAiIiJBZGQgYW4gaXRlbSB0byBzaXgubW92ZXMuIiIiCiAgICBzZXRhdHRyKF9Nb3ZlZEl0ZW1zLCBtb3ZlLm5hbWUsIG1vdmUpCgoKZGVmIHJlbW92ZV9tb3ZlKG5hbWUpOgogICAgIiIiUmVtb3ZlIGl0ZW0gZnJvbSBzaXgubW92ZXMuIiIiCiAgICB0cnk6CiAgICAgICAgZGVsYXR0cihfTW92ZWRJdGVtcywgbmFtZSkKICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGRlbCBtb3Zlcy5fX2RpY3RfX1tuYW1lXQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IoIm5vIHN1Y2ggbW92ZSwgJXIiICUgKG5hbWUsKSkKCgppZiBQWTM6CiAgICBfbWV0aF9mdW5jID0gIl9fZnVuY19fIgogICAgX21ldGhfc2VsZiA9ICJfX3NlbGZfXyIKCiAgICBfZnVuY19jbG9zdXJlID0gIl9fY2xvc3VyZV9fIgogICAgX2Z1bmNfY29kZSA9ICJfX2NvZGVfXyIKICAgIF9mdW5jX2RlZmF1bHRzID0gIl9fZGVmYXVsdHNfXyIKICAgIF9mdW5jX2dsb2JhbHMgPSAiX19nbG9iYWxzX18iCmVsc2U6CiAgICBfbWV0aF9mdW5jID0gImltX2Z1bmMiCiAgICBfbWV0aF9zZWxmID0gImltX3NlbGYiCgogICAgX2Z1bmNfY2xvc3VyZSA9ICJmdW5jX2Nsb3N1cmUiCiAgICBfZnVuY19jb2RlID0gImZ1bmNfY29kZSIKICAgIF9mdW5jX2RlZmF1bHRzID0gImZ1bmNfZGVmYXVsdHMiCiAgICBfZnVuY19nbG9iYWxzID0gImZ1bmNfZ2xvYmFscyIKCgp0cnk6CiAgICBhZHZhbmNlX2l0ZXJhdG9yID0gbmV4dApleGNlcHQgTmFtZUVycm9yOgogICAgZGVmIGFkdmFuY2VfaXRlcmF0b3IoaXQpOgogICAgICAgIHJldHVybiBpdC5uZXh0KCkKbmV4dCA9IGFkdmFuY2VfaXRlcmF0b3IKCgp0cnk6CiAgICBjYWxsYWJsZSA9IGNhbGxhYmxlCmV4Y2VwdCBOYW1lRXJyb3I6CiAgICBkZWYgY2FsbGFibGUob2JqKToKICAgICAgICByZXR1cm4gYW55KCJfX2NhbGxfXyIgaW4ga2xhc3MuX19kaWN0X18gZm9yIGtsYXNzIGluIHR5cGUob2JqKS5fX21yb19fKQoKCmlmIFBZMzoKICAgIGRlZiBnZXRfdW5ib3VuZF9mdW5jdGlvbih1bmJvdW5kKToKICAgICAgICByZXR1cm4gdW5ib3VuZAoKICAgIGNyZWF0ZV9ib3VuZF9tZXRob2QgPSB0eXBlcy5NZXRob2RUeXBlCgogICAgZGVmIGNyZWF0ZV91bmJvdW5kX21ldGhvZChmdW5jLCBjbHMpOgogICAgICAgIHJldHVybiBmdW5jCgogICAgSXRlcmF0b3IgPSBvYmplY3QKZWxzZToKICAgIGRlZiBnZXRfdW5ib3VuZF9mdW5jdGlvbih1bmJvdW5kKToKICAgICAgICByZXR1cm4gdW5ib3VuZC5pbV9mdW5jCgogICAgZGVmIGNyZWF0ZV9ib3VuZF9tZXRob2QoZnVuYywgb2JqKToKICAgICAgICByZXR1cm4gdHlwZXMuTWV0aG9kVHlwZShmdW5jLCBvYmosIG9iai5fX2NsYXNzX18pCgogICAgZGVmIGNyZWF0ZV91bmJvdW5kX21ldGhvZChmdW5jLCBjbHMpOgogICAgICAgIHJldHVybiB0eXBlcy5NZXRob2RUeXBlKGZ1bmMsIE5vbmUsIGNscykKCiAgICBjbGFzcyBJdGVyYXRvcihvYmplY3QpOgoKICAgICAgICBkZWYgbmV4dChzZWxmKToKICAgICAgICAgICAgcmV0dXJuIHR5cGUoc2VsZikuX19uZXh0X18oc2VsZikKCiAgICBjYWxsYWJsZSA9IGNhbGxhYmxlCl9hZGRfZG9jKGdldF91bmJvdW5kX2Z1bmN0aW9uLAogICAgICAgICAiIiJHZXQgdGhlIGZ1bmN0aW9uIG91dCBvZiBhIHBvc3NpYmx5IHVuYm91bmQgZnVuY3Rpb24iIiIpCgoKZ2V0X21ldGhvZF9mdW5jdGlvbiA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoX21ldGhfZnVuYykKZ2V0X21ldGhvZF9zZWxmID0gb3BlcmF0b3IuYXR0cmdldHRlcihfbWV0aF9zZWxmKQpnZXRfZnVuY3Rpb25fY2xvc3VyZSA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoX2Z1bmNfY2xvc3VyZSkKZ2V0X2Z1bmN0aW9uX2NvZGUgPSBvcGVyYXRvci5hdHRyZ2V0dGVyKF9mdW5jX2NvZGUpCmdldF9mdW5jdGlvbl9kZWZhdWx0cyA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoX2Z1bmNfZGVmYXVsdHMpCmdldF9mdW5jdGlvbl9nbG9iYWxzID0gb3BlcmF0b3IuYXR0cmdldHRlcihfZnVuY19nbG9iYWxzKQoKCmlmIFBZMzoKICAgIGRlZiBpdGVya2V5cyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gaXRlcihkLmtleXMoKiprdykpCgogICAgZGVmIGl0ZXJ2YWx1ZXMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGl0ZXIoZC52YWx1ZXMoKiprdykpCgogICAgZGVmIGl0ZXJpdGVtcyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gaXRlcihkLml0ZW1zKCoqa3cpKQoKICAgIGRlZiBpdGVybGlzdHMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGl0ZXIoZC5saXN0cygqKmt3KSkKCiAgICB2aWV3a2V5cyA9IG9wZXJhdG9yLm1ldGhvZGNhbGxlcigia2V5cyIpCgogICAgdmlld3ZhbHVlcyA9IG9wZXJhdG9yLm1ldGhvZGNhbGxlcigidmFsdWVzIikKCiAgICB2aWV3aXRlbXMgPSBvcGVyYXRvci5tZXRob2RjYWxsZXIoIml0ZW1zIikKZWxzZToKICAgIGRlZiBpdGVya2V5cyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gZC5pdGVya2V5cygqKmt3KQoKICAgIGRlZiBpdGVydmFsdWVzKGQsICoqa3cpOgogICAgICAgIHJldHVybiBkLml0ZXJ2YWx1ZXMoKiprdykKCiAgICBkZWYgaXRlcml0ZW1zKGQsICoqa3cpOgogICAgICAgIHJldHVybiBkLml0ZXJpdGVtcygqKmt3KQoKICAgIGRlZiBpdGVybGlzdHMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGQuaXRlcmxpc3RzKCoqa3cpCgogICAgdmlld2tleXMgPSBvcGVyYXRvci5tZXRob2RjYWxsZXIoInZpZXdrZXlzIikKCiAgICB2aWV3dmFsdWVzID0gb3BlcmF0b3IubWV0aG9kY2FsbGVyKCJ2aWV3dmFsdWVzIikKCiAgICB2aWV3aXRlbXMgPSBvcGVyYXRvci5tZXRob2RjYWxsZXIoInZpZXdpdGVtcyIpCgpfYWRkX2RvYyhpdGVya2V5cywgIlJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSBrZXlzIG9mIGEgZGljdGlvbmFyeS4iKQpfYWRkX2RvYyhpdGVydmFsdWVzLCAiUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIHZhbHVlcyBvZiBhIGRpY3Rpb25hcnkuIikKX2FkZF9kb2MoaXRlcml0ZW1zLAogICAgICAgICAiUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIChrZXksIHZhbHVlKSBwYWlycyBvZiBhIGRpY3Rpb25hcnkuIikKX2FkZF9kb2MoaXRlcmxpc3RzLAogICAgICAgICAiUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIChrZXksIFt2YWx1ZXNdKSBwYWlycyBvZiBhIGRpY3Rpb25hcnkuIikKCgppZiBQWTM6CiAgICBkZWYgYihzKToKICAgICAgICByZXR1cm4gcy5lbmNvZGUoImxhdGluLTEiKQoKICAgIGRlZiB1KHMpOgogICAgICAgIHJldHVybiBzCiAgICB1bmljaHIgPSBjaHIKICAgIGltcG9ydCBzdHJ1Y3QKICAgIGludDJieXRlID0gc3RydWN0LlN0cnVjdCgiPkIiKS5wYWNrCiAgICBkZWwgc3RydWN0CiAgICBieXRlMmludCA9IG9wZXJhdG9yLml0ZW1nZXR0ZXIoMCkKICAgIGluZGV4Ynl0ZXMgPSBvcGVyYXRvci5nZXRpdGVtCiAgICBpdGVyYnl0ZXMgPSBpdGVyCiAgICBpbXBvcnQgaW8KICAgIFN0cmluZ0lPID0gaW8uU3RyaW5nSU8KICAgIEJ5dGVzSU8gPSBpby5CeXRlc0lPCiAgICBfYXNzZXJ0Q291bnRFcXVhbCA9ICJhc3NlcnRDb3VudEVxdWFsIgogICAgaWYgc3lzLnZlcnNpb25faW5mb1sxXSA8PSAxOgogICAgICAgIF9hc3NlcnRSYWlzZXNSZWdleCA9ICJhc3NlcnRSYWlzZXNSZWdleHAiCiAgICAgICAgX2Fzc2VydFJlZ2V4ID0gImFzc2VydFJlZ2V4cE1hdGNoZXMiCiAgICBlbHNlOgogICAgICAgIF9hc3NlcnRSYWlzZXNSZWdleCA9ICJhc3NlcnRSYWlzZXNSZWdleCIKICAgICAgICBfYXNzZXJ0UmVnZXggPSAiYXNzZXJ0UmVnZXgiCmVsc2U6CiAgICBkZWYgYihzKToKICAgICAgICByZXR1cm4gcwogICAgIyBXb3JrYXJvdW5kIGZvciBzdGFuZGFsb25lIGJhY2tzbGFzaAoKICAgIGRlZiB1KHMpOgogICAgICAgIHJldHVybiB1bmljb2RlKHMucmVwbGFjZShyJ1xcJywgcidcXFxcJyksICJ1bmljb2RlX2VzY2FwZSIpCiAgICB1bmljaHIgPSB1bmljaHIKICAgIGludDJieXRlID0gY2hyCgogICAgZGVmIGJ5dGUyaW50KGJzKToKICAgICAgICByZXR1cm4gb3JkKGJzWzBdKQoKICAgIGRlZiBpbmRleGJ5dGVzKGJ1ZiwgaSk6CiAgICAgICAgcmV0dXJuIG9yZChidWZbaV0pCiAgICBpdGVyYnl0ZXMgPSBmdW5jdG9vbHMucGFydGlhbChpdGVydG9vbHMuaW1hcCwgb3JkKQogICAgaW1wb3J0IFN0cmluZ0lPCiAgICBTdHJpbmdJTyA9IEJ5dGVzSU8gPSBTdHJpbmdJTy5TdHJpbmdJTwogICAgX2Fzc2VydENvdW50RXF1YWwgPSAiYXNzZXJ0SXRlbXNFcXVhbCIKICAgIF9hc3NlcnRSYWlzZXNSZWdleCA9ICJhc3NlcnRSYWlzZXNSZWdleHAiCiAgICBfYXNzZXJ0UmVnZXggPSAiYXNzZXJ0UmVnZXhwTWF0Y2hlcyIKX2FkZF9kb2MoYiwgIiIiQnl0ZSBsaXRlcmFsIiIiKQpfYWRkX2RvYyh1LCAiIiJUZXh0IGxpdGVyYWwiIiIpCgoKZGVmIGFzc2VydENvdW50RXF1YWwoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgIHJldHVybiBnZXRhdHRyKHNlbGYsIF9hc3NlcnRDb3VudEVxdWFsKSgqYXJncywgKiprd2FyZ3MpCgoKZGVmIGFzc2VydFJhaXNlc1JlZ2V4KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICByZXR1cm4gZ2V0YXR0cihzZWxmLCBfYXNzZXJ0UmFpc2VzUmVnZXgpKCphcmdzLCAqKmt3YXJncykKCgpkZWYgYXNzZXJ0UmVnZXgoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgIHJldHVybiBnZXRhdHRyKHNlbGYsIF9hc3NlcnRSZWdleCkoKmFyZ3MsICoqa3dhcmdzKQoKCmlmIFBZMzoKICAgIGV4ZWNfID0gZ2V0YXR0cihtb3Zlcy5idWlsdGlucywgImV4ZWMiKQoKICAgIGRlZiByZXJhaXNlKHRwLCB2YWx1ZSwgdGI9Tm9uZSk6CiAgICAgICAgaWYgdmFsdWUgaXMgTm9uZToKICAgICAgICAgICAgdmFsdWUgPSB0cCgpCiAgICAgICAgaWYgdmFsdWUuX190cmFjZWJhY2tfXyBpcyBub3QgdGI6CiAgICAgICAgICAgIHJhaXNlIHZhbHVlLndpdGhfdHJhY2ViYWNrKHRiKQogICAgICAgIHJhaXNlIHZhbHVlCgplbHNlOgogICAgZGVmIGV4ZWNfKF9jb2RlXywgX2dsb2JzXz1Ob25lLCBfbG9jc189Tm9uZSk6CiAgICAgICAgIiIiRXhlY3V0ZSBjb2RlIGluIGEgbmFtZXNwYWNlLiIiIgogICAgICAgIGlmIF9nbG9ic18gaXMgTm9uZToKICAgICAgICAgICAgZnJhbWUgPSBzeXMuX2dldGZyYW1lKDEpCiAgICAgICAgICAgIF9nbG9ic18gPSBmcmFtZS5mX2dsb2JhbHMKICAgICAgICAgICAgaWYgX2xvY3NfIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBfbG9jc18gPSBmcmFtZS5mX2xvY2FscwogICAgICAgICAgICBkZWwgZnJhbWUKICAgICAgICBlbGlmIF9sb2NzXyBpcyBOb25lOgogICAgICAgICAgICBfbG9jc18gPSBfZ2xvYnNfCiAgICAgICAgZXhlYygiIiJleGVjIF9jb2RlXyBpbiBfZ2xvYnNfLCBfbG9jc18iIiIpCgogICAgZXhlY18oIiIiZGVmIHJlcmFpc2UodHAsIHZhbHVlLCB0Yj1Ob25lKToKICAgIHJhaXNlIHRwLCB2YWx1ZSwgdGIKIiIiKQoKCmlmIHN5cy52ZXJzaW9uX2luZm9bOjJdID09ICgzLCAyKToKICAgIGV4ZWNfKCIiImRlZiByYWlzZV9mcm9tKHZhbHVlLCBmcm9tX3ZhbHVlKToKICAgIGlmIGZyb21fdmFsdWUgaXMgTm9uZToKICAgICAgICByYWlzZSB2YWx1ZQogICAgcmFpc2UgdmFsdWUgZnJvbSBmcm9tX3ZhbHVlCiIiIikKZWxpZiBzeXMudmVyc2lvbl9pbmZvWzoyXSA+ICgzLCAyKToKICAgIGV4ZWNfKCIiImRlZiByYWlzZV9mcm9tKHZhbHVlLCBmcm9tX3ZhbHVlKToKICAgIHJhaXNlIHZhbHVlIGZyb20gZnJvbV92YWx1ZQoiIiIpCmVsc2U6CiAgICBkZWYgcmFpc2VfZnJvbSh2YWx1ZSwgZnJvbV92YWx1ZSk6CiAgICAgICAgcmFpc2UgdmFsdWUKCgpwcmludF8gPSBnZXRhdHRyKG1vdmVzLmJ1aWx0aW5zLCAicHJpbnQiLCBOb25lKQppZiBwcmludF8gaXMgTm9uZToKICAgIGRlZiBwcmludF8oKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAiIiJUaGUgbmV3LXN0eWxlIHByaW50IGZ1bmN0aW9uIGZvciBQeXRob24gMi40IGFuZCAyLjUuIiIiCiAgICAgICAgZnAgPSBrd2FyZ3MucG9wKCJmaWxlIiwgc3lzLnN0ZG91dCkKICAgICAgICBpZiBmcCBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgZGVmIHdyaXRlKGRhdGEpOgogICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShkYXRhLCBiYXNlc3RyaW5nKToKICAgICAgICAgICAgICAgIGRhdGEgPSBzdHIoZGF0YSkKICAgICAgICAgICAgIyBJZiB0aGUgZmlsZSBoYXMgYW4gZW5jb2RpbmcsIGVuY29kZSB1bmljb2RlIHdpdGggaXQuCiAgICAgICAgICAgIGlmIChpc2luc3RhbmNlKGZwLCBmaWxlKSBhbmQKICAgICAgICAgICAgICAgICAgICBpc2luc3RhbmNlKGRhdGEsIHVuaWNvZGUpIGFuZAogICAgICAgICAgICAgICAgICAgIGZwLmVuY29kaW5nIGlzIG5vdCBOb25lKToKICAgICAgICAgICAgICAgIGVycm9ycyA9IGdldGF0dHIoZnAsICJlcnJvcnMiLCBOb25lKQogICAgICAgICAgICAgICAgaWYgZXJyb3JzIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgZXJyb3JzID0gInN0cmljdCIKICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLmVuY29kZShmcC5lbmNvZGluZywgZXJyb3JzKQogICAgICAgICAgICBmcC53cml0ZShkYXRhKQogICAgICAgIHdhbnRfdW5pY29kZSA9IEZhbHNlCiAgICAgICAgc2VwID0ga3dhcmdzLnBvcCgic2VwIiwgTm9uZSkKICAgICAgICBpZiBzZXAgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VwLCB1bmljb2RlKToKICAgICAgICAgICAgICAgIHdhbnRfdW5pY29kZSA9IFRydWUKICAgICAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShzZXAsIHN0cik6CiAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoInNlcCBtdXN0IGJlIE5vbmUgb3IgYSBzdHJpbmciKQogICAgICAgIGVuZCA9IGt3YXJncy5wb3AoImVuZCIsIE5vbmUpCiAgICAgICAgaWYgZW5kIGlzIG5vdCBOb25lOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGVuZCwgdW5pY29kZSk6CiAgICAgICAgICAgICAgICB3YW50X3VuaWNvZGUgPSBUcnVlCiAgICAgICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2UoZW5kLCBzdHIpOgogICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJlbmQgbXVzdCBiZSBOb25lIG9yIGEgc3RyaW5nIikKICAgICAgICBpZiBrd2FyZ3M6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiaW52YWxpZCBrZXl3b3JkIGFyZ3VtZW50cyB0byBwcmludCgpIikKICAgICAgICBpZiBub3Qgd2FudF91bmljb2RlOgogICAgICAgICAgICBmb3IgYXJnIGluIGFyZ3M6CiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGFyZywgdW5pY29kZSk6CiAgICAgICAgICAgICAgICAgICAgd2FudF91bmljb2RlID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgaWYgd2FudF91bmljb2RlOgogICAgICAgICAgICBuZXdsaW5lID0gdW5pY29kZSgiXG4iKQogICAgICAgICAgICBzcGFjZSA9IHVuaWNvZGUoIiAiKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG5ld2xpbmUgPSAiXG4iCiAgICAgICAgICAgIHNwYWNlID0gIiAiCiAgICAgICAgaWYgc2VwIGlzIE5vbmU6CiAgICAgICAgICAgIHNlcCA9IHNwYWNlCiAgICAgICAgaWYgZW5kIGlzIE5vbmU6CiAgICAgICAgICAgIGVuZCA9IG5ld2xpbmUKICAgICAgICBmb3IgaSwgYXJnIGluIGVudW1lcmF0ZShhcmdzKToKICAgICAgICAgICAgaWYgaToKICAgICAgICAgICAgICAgIHdyaXRlKHNlcCkKICAgICAgICAgICAgd3JpdGUoYXJnKQogICAgICAgIHdyaXRlKGVuZCkKaWYgc3lzLnZlcnNpb25faW5mb1s6Ml0gPCAoMywgMyk6CiAgICBfcHJpbnQgPSBwcmludF8KCiAgICBkZWYgcHJpbnRfKCphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgZnAgPSBrd2FyZ3MuZ2V0KCJmaWxlIiwgc3lzLnN0ZG91dCkKICAgICAgICBmbHVzaCA9IGt3YXJncy5wb3AoImZsdXNoIiwgRmFsc2UpCiAgICAgICAgX3ByaW50KCphcmdzLCAqKmt3YXJncykKICAgICAgICBpZiBmbHVzaCBhbmQgZnAgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGZwLmZsdXNoKCkKCl9hZGRfZG9jKHJlcmFpc2UsICIiIlJlcmFpc2UgYW4gZXhjZXB0aW9uLiIiIikKCmlmIHN5cy52ZXJzaW9uX2luZm9bMDoyXSA8ICgzLCA0KToKICAgIGRlZiB3cmFwcyh3cmFwcGVkLCBhc3NpZ25lZD1mdW5jdG9vbHMuV1JBUFBFUl9BU1NJR05NRU5UUywKICAgICAgICAgICAgICB1cGRhdGVkPWZ1bmN0b29scy5XUkFQUEVSX1VQREFURVMpOgogICAgICAgIGRlZiB3cmFwcGVyKGYpOgogICAgICAgICAgICBmID0gZnVuY3Rvb2xzLndyYXBzKHdyYXBwZWQsIGFzc2lnbmVkLCB1cGRhdGVkKShmKQogICAgICAgICAgICBmLl9fd3JhcHBlZF9fID0gd3JhcHBlZAogICAgICAgICAgICByZXR1cm4gZgogICAgICAgIHJldHVybiB3cmFwcGVyCmVsc2U6CiAgICB3cmFwcyA9IGZ1bmN0b29scy53cmFwcwoKCmRlZiB3aXRoX21ldGFjbGFzcyhtZXRhLCAqYmFzZXMpOgogICAgIiIiQ3JlYXRlIGEgYmFzZSBjbGFzcyB3aXRoIGEgbWV0YWNsYXNzLiIiIgogICAgIyBUaGlzIHJlcXVpcmVzIGEgYml0IG9mIGV4cGxhbmF0aW9uOiB0aGUgYmFzaWMgaWRlYSBpcyB0byBtYWtlIGEgZHVtbXkKICAgICMgbWV0YWNsYXNzIGZvciBvbmUgbGV2ZWwgb2YgY2xhc3MgaW5zdGFudGlhdGlvbiB0aGF0IHJlcGxhY2VzIGl0c2VsZiB3aXRoCiAgICAjIHRoZSBhY3R1YWwgbWV0YWNsYXNzLgogICAgY2xhc3MgbWV0YWNsYXNzKG1ldGEpOgoKICAgICAgICBkZWYgX19uZXdfXyhjbHMsIG5hbWUsIHRoaXNfYmFzZXMsIGQpOgogICAgICAgICAgICByZXR1cm4gbWV0YShuYW1lLCBiYXNlcywgZCkKICAgIHJldHVybiB0eXBlLl9fbmV3X18obWV0YWNsYXNzLCAndGVtcG9yYXJ5X2NsYXNzJywgKCksIHt9KQoKCmRlZiBhZGRfbWV0YWNsYXNzKG1ldGFjbGFzcyk6CiAgICAiIiJDbGFzcyBkZWNvcmF0b3IgZm9yIGNyZWF0aW5nIGEgY2xhc3Mgd2l0aCBhIG1ldGFjbGFzcy4iIiIKICAgIGRlZiB3cmFwcGVyKGNscyk6CiAgICAgICAgb3JpZ192YXJzID0gY2xzLl9fZGljdF9fLmNvcHkoKQogICAgICAgIHNsb3RzID0gb3JpZ192YXJzLmdldCgnX19zbG90c19fJykKICAgICAgICBpZiBzbG90cyBpcyBub3QgTm9uZToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzbG90cywgc3RyKToKICAgICAgICAgICAgICAgIHNsb3RzID0gW3Nsb3RzXQogICAgICAgICAgICBmb3Igc2xvdHNfdmFyIGluIHNsb3RzOgogICAgICAgICAgICAgICAgb3JpZ192YXJzLnBvcChzbG90c192YXIpCiAgICAgICAgb3JpZ192YXJzLnBvcCgnX19kaWN0X18nLCBOb25lKQogICAgICAgIG9yaWdfdmFycy5wb3AoJ19fd2Vha3JlZl9fJywgTm9uZSkKICAgICAgICByZXR1cm4gbWV0YWNsYXNzKGNscy5fX25hbWVfXywgY2xzLl9fYmFzZXNfXywgb3JpZ192YXJzKQogICAgcmV0dXJuIHdyYXBwZXIKCgpkZWYgcHl0aG9uXzJfdW5pY29kZV9jb21wYXRpYmxlKGtsYXNzKToKICAgICIiIgogICAgQSBkZWNvcmF0b3IgdGhhdCBkZWZpbmVzIF9fdW5pY29kZV9fIGFuZCBfX3N0cl9fIG1ldGhvZHMgdW5kZXIgUHl0aG9uIDIuCiAgICBVbmRlciBQeXRob24gMyBpdCBkb2VzIG5vdGhpbmcuCgogICAgVG8gc3VwcG9ydCBQeXRob24gMiBhbmQgMyB3aXRoIGEgc2luZ2xlIGNvZGUgYmFzZSwgZGVmaW5lIGEgX19zdHJfXyBtZXRob2QKICAgIHJldHVybmluZyB0ZXh0IGFuZCBhcHBseSB0aGlzIGRlY29yYXRvciB0byB0aGUgY2xhc3MuCiAgICAiIiIKICAgIGlmIFBZMjoKICAgICAgICBpZiAnX19zdHJfXycgbm90IGluIGtsYXNzLl9fZGljdF9fOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJAcHl0aG9uXzJfdW5pY29kZV9jb21wYXRpYmxlIGNhbm5vdCBiZSBhcHBsaWVkICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG8gJXMgYmVjYXVzZSBpdCBkb2Vzbid0IGRlZmluZSBfX3N0cl9fKCkuIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2xhc3MuX19uYW1lX18pCiAgICAgICAga2xhc3MuX191bmljb2RlX18gPSBrbGFzcy5fX3N0cl9fCiAgICAgICAga2xhc3MuX19zdHJfXyA9IGxhbWJkYSBzZWxmOiBzZWxmLl9fdW5pY29kZV9fKCkuZW5jb2RlKCd1dGYtOCcpCiAgICByZXR1cm4ga2xhc3MKCgojIENvbXBsZXRlIHRoZSBtb3ZlcyBpbXBsZW1lbnRhdGlvbi4KIyBUaGlzIGNvZGUgaXMgYXQgdGhlIGVuZCBvZiB0aGlzIG1vZHVsZSB0byBzcGVlZCB1cCBtb2R1bGUgbG9hZGluZy4KIyBUdXJuIHRoaXMgbW9kdWxlIGludG8gYSBwYWNrYWdlLgpfX3BhdGhfXyA9IFtdICAjIHJlcXVpcmVkIGZvciBQRVAgMzAyIGFuZCBQRVAgNDUxCl9fcGFja2FnZV9fID0gX19uYW1lX18gICMgc2VlIFBFUCAzNjYgQFJlc2VydmVkQXNzaWdubWVudAppZiBnbG9iYWxzKCkuZ2V0KCJfX3NwZWNfXyIpIGlzIG5vdCBOb25lOgogICAgX19zcGVjX18uc3VibW9kdWxlX3NlYXJjaF9sb2NhdGlvbnMgPSBbXSAgIyBQRVAgNDUxIEBVbmRlZmluZWRWYXJpYWJsZQojIFJlbW92ZSBvdGhlciBzaXggbWV0YSBwYXRoIGltcG9ydGVycywgc2luY2UgdGhleSBjYXVzZSBwcm9ibGVtcy4gVGhpcyBjYW4KIyBoYXBwZW4gaWYgc2l4IGlzIHJlbW92ZWQgZnJvbSBzeXMubW9kdWxlcyBhbmQgdGhlbiByZWxvYWRlZC4gKFNldHVwdG9vbHMgZG9lcwojIHRoaXMgZm9yIHNvbWUgcmVhc29uLikKaWYgc3lzLm1ldGFfcGF0aDoKICAgIGZvciBpLCBpbXBvcnRlciBpbiBlbnVtZXJhdGUoc3lzLm1ldGFfcGF0aCk6CiAgICAgICAgIyBIZXJlJ3Mgc29tZSByZWFsIG5hc3RpbmVzczogQW5vdGhlciAiaW5zdGFuY2UiIG9mIHRoZSBzaXggbW9kdWxlIG1pZ2h0CiAgICAgICAgIyBiZSBmbG9hdGluZyBhcm91bmQuIFRoZXJlZm9yZSwgd2UgY2FuJ3QgdXNlIGlzaW5zdGFuY2UoKSB0byBjaGVjayBmb3IKICAgICAgICAjIHRoZSBzaXggbWV0YSBwYXRoIGltcG9ydGVyLCBzaW5jZSB0aGUgb3RoZXIgc2l4IGluc3RhbmNlIHdpbGwgaGF2ZQogICAgICAgICMgaW5zZXJ0ZWQgYW4gaW1wb3J0ZXIgd2l0aCBkaWZmZXJlbnQgY2xhc3MuCiAgICAgICAgaWYgKHR5cGUoaW1wb3J0ZXIpLl9fbmFtZV9fID09ICJfU2l4TWV0YVBhdGhJbXBvcnRlciIgYW5kCiAgICAgICAgICAgICAgICBpbXBvcnRlci5uYW1lID09IF9fbmFtZV9fKToKICAgICAgICAgICAgZGVsIHN5cy5tZXRhX3BhdGhbaV0KICAgICAgICAgICAgYnJlYWsKICAgIGRlbCBpLCBpbXBvcnRlcgojIEZpbmFsbHksIGFkZCB0aGUgaW1wb3J0ZXIgdG8gdGhlIG1ldGEgcGF0aCBpbXBvcnQgaG9vay4Kc3lzLm1ldGFfcGF0aC5hcHBlbmQoX2ltcG9ydGVyKQpQSwMEFAAAAAAAAAAhAPttyuWwAgAAsAIAAEsAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9wYWNrYWdlcy9zc2xfbWF0Y2hfaG9zdG5hbWUvX19pbml0X18ucHlpbXBvcnQgc3lzCgp0cnk6CiAgICAjIE91ciBtYXRjaF9ob3N0bmFtZSBmdW5jdGlvbiBpcyB0aGUgc2FtZSBhcyAzLjUncywgc28gd2Ugb25seSB3YW50IHRvCiAgICAjIGltcG9ydCB0aGUgbWF0Y2hfaG9zdG5hbWUgZnVuY3Rpb24gaWYgaXQncyBhdCBsZWFzdCB0aGF0IGdvb2QuCiAgICBpZiBzeXMudmVyc2lvbl9pbmZvIDwgKDMsIDUpOgogICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCJGYWxsYmFjayB0byB2ZW5kb3JlZCBjb2RlIikKCiAgICBmcm9tIHNzbCBpbXBvcnQgQ2VydGlmaWNhdGVFcnJvciwgbWF0Y2hfaG9zdG5hbWUKZXhjZXB0IEltcG9ydEVycm9yOgogICAgdHJ5OgogICAgICAgICMgQmFja3BvcnQgb2YgdGhlIGZ1bmN0aW9uIGZyb20gYSBweXBpIG1vZHVsZQogICAgICAgIGZyb20gYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZSBpbXBvcnQgQ2VydGlmaWNhdGVFcnJvciwgbWF0Y2hfaG9zdG5hbWUKICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAjIE91ciB2ZW5kb3JlZCBjb3B5CiAgICAgICAgZnJvbSAuX2ltcGxlbWVudGF0aW9uIGltcG9ydCBDZXJ0aWZpY2F0ZUVycm9yLCBtYXRjaF9ob3N0bmFtZQoKIyBOb3QgbmVlZGVkLCBidXQgZG9jdW1lbnRpbmcgd2hhdCB3ZSBwcm92aWRlLgpfX2FsbF9fID0gKCdDZXJ0aWZpY2F0ZUVycm9yJywgJ21hdGNoX2hvc3RuYW1lJykKUEsDBBQAAAAAAAAAIQC1Oo8rRhYAAEYWAABSAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvcGFja2FnZXMvc3NsX21hdGNoX2hvc3RuYW1lL19pbXBsZW1lbnRhdGlvbi5weSIiIlRoZSBtYXRjaF9ob3N0bmFtZSgpIGZ1bmN0aW9uIGZyb20gUHl0aG9uIDMuMy4zLCBlc3NlbnRpYWwgd2hlbiB1c2luZyBTU0wuIiIiCgojIE5vdGU6IFRoaXMgZmlsZSBpcyB1bmRlciB0aGUgUFNGIGxpY2Vuc2UgYXMgdGhlIGNvZGUgY29tZXMgZnJvbSB0aGUgcHl0aG9uCiMgc3RkbGliLiAgIGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvMy9saWNlbnNlLmh0bWwKCmltcG9ydCByZQppbXBvcnQgc3lzCgojIGlwYWRkcmVzcyBoYXMgYmVlbiBiYWNrcG9ydGVkIHRvIDIuNisgaW4gcHlwaS4gIElmIGl0IGlzIGluc3RhbGxlZCBvbiB0aGUKIyBzeXN0ZW0sIHVzZSBpdCB0byBoYW5kbGUgSVBBZGRyZXNzIFNlcnZlckFsdG5hbWVzICh0aGlzIHdhcyBhZGRlZCBpbgojIHB5dGhvbi0zLjUpIG90aGVyd2lzZSBvbmx5IGRvIEROUyBtYXRjaGluZy4gIFRoaXMgYWxsb3dzCiMgYmFja3BvcnRzLnNzbF9tYXRjaF9ob3N0bmFtZSB0byBjb250aW51ZSB0byBiZSB1c2VkIGFsbCB0aGUgd2F5IGJhY2sgdG8KIyBweXRob24tMi40Lgp0cnk6CiAgICBpbXBvcnQgaXBhZGRyZXNzCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGlwYWRkcmVzcyA9IE5vbmUKCl9fdmVyc2lvbl9fID0gJzMuNS4wLjEnCgoKY2xhc3MgQ2VydGlmaWNhdGVFcnJvcihWYWx1ZUVycm9yKToKICAgIHBhc3MKCgpkZWYgX2Ruc25hbWVfbWF0Y2goZG4sIGhvc3RuYW1lLCBtYXhfd2lsZGNhcmRzPTEpOgogICAgIiIiTWF0Y2hpbmcgYWNjb3JkaW5nIHRvIFJGQyA2MTI1LCBzZWN0aW9uIDYuNC4zCgogICAgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjEyNSNzZWN0aW9uLTYuNC4zCiAgICAiIiIKICAgIHBhdHMgPSBbXQogICAgaWYgbm90IGRuOgogICAgICAgIHJldHVybiBGYWxzZQoKICAgICMgUG9ydGVkIGZyb20gcHl0aG9uMy1zeW50YXg6CiAgICAjIGxlZnRtb3N0LCAqcmVtYWluZGVyID0gZG4uc3BsaXQocicuJykKICAgIHBhcnRzID0gZG4uc3BsaXQocicuJykKICAgIGxlZnRtb3N0ID0gcGFydHNbMF0KICAgIHJlbWFpbmRlciA9IHBhcnRzWzE6XQoKICAgIHdpbGRjYXJkcyA9IGxlZnRtb3N0LmNvdW50KCcqJykKICAgIGlmIHdpbGRjYXJkcyA+IG1heF93aWxkY2FyZHM6CiAgICAgICAgIyBJc3N1ZSAjMTc5ODA6IGF2b2lkIGRlbmlhbHMgb2Ygc2VydmljZSBieSByZWZ1c2luZyBtb3JlCiAgICAgICAgIyB0aGFuIG9uZSB3aWxkY2FyZCBwZXIgZnJhZ21lbnQuICBBIHN1cnZleSBvZiBlc3RhYmxpc2hlZAogICAgICAgICMgcG9saWN5IGFtb25nIFNTTCBpbXBsZW1lbnRhdGlvbnMgc2hvd2VkIGl0IHRvIGJlIGEKICAgICAgICAjIHJlYXNvbmFibGUgY2hvaWNlLgogICAgICAgIHJhaXNlIENlcnRpZmljYXRlRXJyb3IoCiAgICAgICAgICAgICJ0b28gbWFueSB3aWxkY2FyZHMgaW4gY2VydGlmaWNhdGUgRE5TIG5hbWU6ICIgKyByZXByKGRuKSkKCiAgICAjIHNwZWVkIHVwIGNvbW1vbiBjYXNlIHcvbyB3aWxkY2FyZHMKICAgIGlmIG5vdCB3aWxkY2FyZHM6CiAgICAgICAgcmV0dXJuIGRuLmxvd2VyKCkgPT0gaG9zdG5hbWUubG93ZXIoKQoKICAgICMgUkZDIDYxMjUsIHNlY3Rpb24gNi40LjMsIHN1Yml0ZW0gMS4KICAgICMgVGhlIGNsaWVudCBTSE9VTEQgTk9UIGF0dGVtcHQgdG8gbWF0Y2ggYSBwcmVzZW50ZWQgaWRlbnRpZmllciBpbiB3aGljaAogICAgIyB0aGUgd2lsZGNhcmQgY2hhcmFjdGVyIGNvbXByaXNlcyBhIGxhYmVsIG90aGVyIHRoYW4gdGhlIGxlZnQtbW9zdCBsYWJlbC4KICAgIGlmIGxlZnRtb3N0ID09ICcqJzoKICAgICAgICAjIFdoZW4gJyonIGlzIGEgZnJhZ21lbnQgYnkgaXRzZWxmLCBpdCBtYXRjaGVzIGEgbm9uLWVtcHR5IGRvdGxlc3MKICAgICAgICAjIGZyYWdtZW50LgogICAgICAgIHBhdHMuYXBwZW5kKCdbXi5dKycpCiAgICBlbGlmIGxlZnRtb3N0LnN0YXJ0c3dpdGgoJ3huLS0nKSBvciBob3N0bmFtZS5zdGFydHN3aXRoKCd4bi0tJyk6CiAgICAgICAgIyBSRkMgNjEyNSwgc2VjdGlvbiA2LjQuMywgc3ViaXRlbSAzLgogICAgICAgICMgVGhlIGNsaWVudCBTSE9VTEQgTk9UIGF0dGVtcHQgdG8gbWF0Y2ggYSBwcmVzZW50ZWQgaWRlbnRpZmllcgogICAgICAgICMgd2hlcmUgdGhlIHdpbGRjYXJkIGNoYXJhY3RlciBpcyBlbWJlZGRlZCB3aXRoaW4gYW4gQS1sYWJlbCBvcgogICAgICAgICMgVS1sYWJlbCBvZiBhbiBpbnRlcm5hdGlvbmFsaXplZCBkb21haW4gbmFtZS4KICAgICAgICBwYXRzLmFwcGVuZChyZS5lc2NhcGUobGVmdG1vc3QpKQogICAgZWxzZToKICAgICAgICAjIE90aGVyd2lzZSwgJyonIG1hdGNoZXMgYW55IGRvdGxlc3Mgc3RyaW5nLCBlLmcuIHd3dyoKICAgICAgICBwYXRzLmFwcGVuZChyZS5lc2NhcGUobGVmdG1vc3QpLnJlcGxhY2UocidcKicsICdbXi5dKicpKQoKICAgICMgYWRkIHRoZSByZW1haW5pbmcgZnJhZ21lbnRzLCBpZ25vcmUgYW55IHdpbGRjYXJkcwogICAgZm9yIGZyYWcgaW4gcmVtYWluZGVyOgogICAgICAgIHBhdHMuYXBwZW5kKHJlLmVzY2FwZShmcmFnKSkKCiAgICBwYXQgPSByZS5jb21waWxlKHInXEEnICsgcidcLicuam9pbihwYXRzKSArIHInXFonLCByZS5JR05PUkVDQVNFKQogICAgcmV0dXJuIHBhdC5tYXRjaChob3N0bmFtZSkKCgpkZWYgX3RvX3VuaWNvZGUob2JqKToKICAgIGlmIGlzaW5zdGFuY2Uob2JqLCBzdHIpIGFuZCBzeXMudmVyc2lvbl9pbmZvIDwgKDMsKToKICAgICAgICBvYmogPSB1bmljb2RlKG9iaiwgZW5jb2Rpbmc9J2FzY2lpJywgZXJyb3JzPSdzdHJpY3QnKQogICAgcmV0dXJuIG9iagoKZGVmIF9pcGFkZHJlc3NfbWF0Y2goaXBuYW1lLCBob3N0X2lwKToKICAgICIiIkV4YWN0IG1hdGNoaW5nIG9mIElQIGFkZHJlc3Nlcy4KCiAgICBSRkMgNjEyNSBleHBsaWNpdGx5IGRvZXNuJ3QgZGVmaW5lIGFuIGFsZ29yaXRobSBmb3IgdGhpcwogICAgKHNlY3Rpb24gMS43LjIgLSAiT3V0IG9mIFNjb3BlIikuCiAgICAiIiIKICAgICMgT3BlblNTTCBtYXkgYWRkIGEgdHJhaWxpbmcgbmV3bGluZSB0byBhIHN1YmplY3RBbHROYW1lJ3MgSVAgYWRkcmVzcwogICAgIyBEaXZlcmdlbmNlIGZyb20gdXBzdHJlYW06IGlwYWRkcmVzcyBjYW4ndCBoYW5kbGUgYnl0ZSBzdHIKICAgIGlwID0gaXBhZGRyZXNzLmlwX2FkZHJlc3MoX3RvX3VuaWNvZGUoaXBuYW1lKS5yc3RyaXAoKSkKICAgIHJldHVybiBpcCA9PSBob3N0X2lwCgoKZGVmIG1hdGNoX2hvc3RuYW1lKGNlcnQsIGhvc3RuYW1lKToKICAgICIiIlZlcmlmeSB0aGF0ICpjZXJ0KiAoaW4gZGVjb2RlZCBmb3JtYXQgYXMgcmV0dXJuZWQgYnkKICAgIFNTTFNvY2tldC5nZXRwZWVyY2VydCgpKSBtYXRjaGVzIHRoZSAqaG9zdG5hbWUqLiAgUkZDIDI4MTggYW5kIFJGQyA2MTI1CiAgICBydWxlcyBhcmUgZm9sbG93ZWQsIGJ1dCBJUCBhZGRyZXNzZXMgYXJlIG5vdCBhY2NlcHRlZCBmb3IgKmhvc3RuYW1lKi4KCiAgICBDZXJ0aWZpY2F0ZUVycm9yIGlzIHJhaXNlZCBvbiBmYWlsdXJlLiBPbiBzdWNjZXNzLCB0aGUgZnVuY3Rpb24KICAgIHJldHVybnMgbm90aGluZy4KICAgICIiIgogICAgaWYgbm90IGNlcnQ6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZW1wdHkgb3Igbm8gY2VydGlmaWNhdGUsIG1hdGNoX2hvc3RuYW1lIG5lZWRzIGEgIgogICAgICAgICAgICAgICAgICAgICAgICAgIlNTTCBzb2NrZXQgb3IgU1NMIGNvbnRleHQgd2l0aCBlaXRoZXIgIgogICAgICAgICAgICAgICAgICAgICAgICAgIkNFUlRfT1BUSU9OQUwgb3IgQ0VSVF9SRVFVSVJFRCIpCiAgICB0cnk6CiAgICAgICAgIyBEaXZlcmdlbmNlIGZyb20gdXBzdHJlYW06IGlwYWRkcmVzcyBjYW4ndCBoYW5kbGUgYnl0ZSBzdHIKICAgICAgICBob3N0X2lwID0gaXBhZGRyZXNzLmlwX2FkZHJlc3MoX3RvX3VuaWNvZGUoaG9zdG5hbWUpKQogICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgIyBOb3QgYW4gSVAgYWRkcmVzcyAoY29tbW9uIGNhc2UpCiAgICAgICAgaG9zdF9pcCA9IE5vbmUKICAgIGV4Y2VwdCBVbmljb2RlRXJyb3I6CiAgICAgICAgIyBEaXZlcmdlbmNlIGZyb20gdXBzdHJlYW06IEhhdmUgdG8gZGVhbCB3aXRoIGlwYWRkcmVzcyBub3QgdGFraW5nCiAgICAgICAgIyBieXRlIHN0cmluZ3MuICBhZGRyZXNzZXMgc2hvdWxkIGJlIGFsbCBhc2NpaSwgc28gd2UgY29uc2lkZXIgaXQgbm90CiAgICAgICAgIyBhbiBpcGFkZHJlc3MgaW4gdGhpcyBjYXNlCiAgICAgICAgaG9zdF9pcCA9IE5vbmUKICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAjIERpdmVyZ2VuY2UgZnJvbSB1cHN0cmVhbTogTWFrZSBpcGFkZHJlc3MgbGlicmFyeSBvcHRpb25hbAogICAgICAgIGlmIGlwYWRkcmVzcyBpcyBOb25lOgogICAgICAgICAgICBob3N0X2lwID0gTm9uZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlCiAgICBkbnNuYW1lcyA9IFtdCiAgICBzYW4gPSBjZXJ0LmdldCgnc3ViamVjdEFsdE5hbWUnLCAoKSkKICAgIGZvciBrZXksIHZhbHVlIGluIHNhbjoKICAgICAgICBpZiBrZXkgPT0gJ0ROUyc6CiAgICAgICAgICAgIGlmIGhvc3RfaXAgaXMgTm9uZSBhbmQgX2Ruc25hbWVfbWF0Y2godmFsdWUsIGhvc3RuYW1lKToKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBkbnNuYW1lcy5hcHBlbmQodmFsdWUpCiAgICAgICAgZWxpZiBrZXkgPT0gJ0lQIEFkZHJlc3MnOgogICAgICAgICAgICBpZiBob3N0X2lwIGlzIG5vdCBOb25lIGFuZCBfaXBhZGRyZXNzX21hdGNoKHZhbHVlLCBob3N0X2lwKToKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBkbnNuYW1lcy5hcHBlbmQodmFsdWUpCiAgICBpZiBub3QgZG5zbmFtZXM6CiAgICAgICAgIyBUaGUgc3ViamVjdCBpcyBvbmx5IGNoZWNrZWQgd2hlbiB0aGVyZSBpcyBubyBkTlNOYW1lIGVudHJ5CiAgICAgICAgIyBpbiBzdWJqZWN0QWx0TmFtZQogICAgICAgIGZvciBzdWIgaW4gY2VydC5nZXQoJ3N1YmplY3QnLCAoKSk6CiAgICAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIHN1YjoKICAgICAgICAgICAgICAgICMgWFhYIGFjY29yZGluZyB0byBSRkMgMjgxOCwgdGhlIG1vc3Qgc3BlY2lmaWMgQ29tbW9uIE5hbWUKICAgICAgICAgICAgICAgICMgbXVzdCBiZSB1c2VkLgogICAgICAgICAgICAgICAgaWYga2V5ID09ICdjb21tb25OYW1lJzoKICAgICAgICAgICAgICAgICAgICBpZiBfZG5zbmFtZV9tYXRjaCh2YWx1ZSwgaG9zdG5hbWUpOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICAgICAgICBkbnNuYW1lcy5hcHBlbmQodmFsdWUpCiAgICBpZiBsZW4oZG5zbmFtZXMpID4gMToKICAgICAgICByYWlzZSBDZXJ0aWZpY2F0ZUVycm9yKCJob3N0bmFtZSAlciAiCiAgICAgICAgICAgICJkb2Vzbid0IG1hdGNoIGVpdGhlciBvZiAlcyIKICAgICAgICAgICAgJSAoaG9zdG5hbWUsICcsICcuam9pbihtYXAocmVwciwgZG5zbmFtZXMpKSkpCiAgICBlbGlmIGxlbihkbnNuYW1lcykgPT0gMToKICAgICAgICByYWlzZSBDZXJ0aWZpY2F0ZUVycm9yKCJob3N0bmFtZSAlciAiCiAgICAgICAgICAgICJkb2Vzbid0IG1hdGNoICVyIgogICAgICAgICAgICAlIChob3N0bmFtZSwgZG5zbmFtZXNbMF0pKQogICAgZWxzZToKICAgICAgICByYWlzZSBDZXJ0aWZpY2F0ZUVycm9yKCJubyBhcHByb3ByaWF0ZSBjb21tb25OYW1lIG9yICIKICAgICAgICAgICAgInN1YmplY3RBbHROYW1lIGZpZWxkcyB3ZXJlIGZvdW5kIikKUEsDBBQAAAAAAAAAIQDwrhiS2T8AANk/AAAyAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvcG9vbG1hbmFnZXIucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAppbXBvcnQgY29sbGVjdGlvbnMKaW1wb3J0IGZ1bmN0b29scwppbXBvcnQgbG9nZ2luZwoKZnJvbSAuX2NvbGxlY3Rpb25zIGltcG9ydCBSZWNlbnRseVVzZWRDb250YWluZXIKZnJvbSAuY29ubmVjdGlvbnBvb2wgaW1wb3J0IEhUVFBDb25uZWN0aW9uUG9vbCwgSFRUUFNDb25uZWN0aW9uUG9vbApmcm9tIC5jb25uZWN0aW9ucG9vbCBpbXBvcnQgcG9ydF9ieV9zY2hlbWUKZnJvbSAuZXhjZXB0aW9ucyBpbXBvcnQgTG9jYXRpb25WYWx1ZUVycm9yLCBNYXhSZXRyeUVycm9yLCBQcm94eVNjaGVtZVVua25vd24KZnJvbSAucGFja2FnZXMuc2l4Lm1vdmVzLnVybGxpYi5wYXJzZSBpbXBvcnQgdXJsam9pbgpmcm9tIC5yZXF1ZXN0IGltcG9ydCBSZXF1ZXN0TWV0aG9kcwpmcm9tIC51dGlsLnVybCBpbXBvcnQgcGFyc2VfdXJsCmZyb20gLnV0aWwucmV0cnkgaW1wb3J0IFJldHJ5CgoKX19hbGxfXyA9IFsnUG9vbE1hbmFnZXInLCAnUHJveHlNYW5hZ2VyJywgJ3Byb3h5X2Zyb21fdXJsJ10KCgpsb2cgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKClNTTF9LRVlXT1JEUyA9ICgna2V5X2ZpbGUnLCAnY2VydF9maWxlJywgJ2NlcnRfcmVxcycsICdjYV9jZXJ0cycsCiAgICAgICAgICAgICAgICAnc3NsX3ZlcnNpb24nLCAnY2FfY2VydF9kaXInLCAnc3NsX2NvbnRleHQnKQoKIyBBbGwga25vd24ga2V5d29yZCBhcmd1bWVudHMgdGhhdCBjb3VsZCBiZSBwcm92aWRlZCB0byB0aGUgcG9vbCBtYW5hZ2VyLCBpdHMKIyBwb29scywgb3IgdGhlIHVuZGVybHlpbmcgY29ubmVjdGlvbnMuIFRoaXMgaXMgdXNlZCB0byBjb25zdHJ1Y3QgYSBwb29sIGtleS4KX2tleV9maWVsZHMgPSAoCiAgICAna2V5X3NjaGVtZScsICAjIHN0cgogICAgJ2tleV9ob3N0JywgICMgc3RyCiAgICAna2V5X3BvcnQnLCAgIyBpbnQKICAgICdrZXlfdGltZW91dCcsICAjIGludCBvciBmbG9hdCBvciBUaW1lb3V0CiAgICAna2V5X3JldHJpZXMnLCAgIyBpbnQgb3IgUmV0cnkKICAgICdrZXlfc3RyaWN0JywgICMgYm9vbAogICAgJ2tleV9ibG9jaycsICAjIGJvb2wKICAgICdrZXlfc291cmNlX2FkZHJlc3MnLCAgIyBzdHIKICAgICdrZXlfa2V5X2ZpbGUnLCAgIyBzdHIKICAgICdrZXlfY2VydF9maWxlJywgICMgc3RyCiAgICAna2V5X2NlcnRfcmVxcycsICAjIHN0cgogICAgJ2tleV9jYV9jZXJ0cycsICAjIHN0cgogICAgJ2tleV9zc2xfdmVyc2lvbicsICAjIHN0cgogICAgJ2tleV9jYV9jZXJ0X2RpcicsICAjIHN0cgogICAgJ2tleV9zc2xfY29udGV4dCcsICAjIGluc3RhbmNlIG9mIHNzbC5TU0xDb250ZXh0IG9yIHVybGxpYjMudXRpbC5zc2xfLlNTTENvbnRleHQKICAgICdrZXlfbWF4c2l6ZScsICAjIGludAogICAgJ2tleV9oZWFkZXJzJywgICMgZGljdAogICAgJ2tleV9fcHJveHknLCAgIyBwYXJzZWQgcHJveHkgdXJsCiAgICAna2V5X19wcm94eV9oZWFkZXJzJywgICMgZGljdAogICAgJ2tleV9zb2NrZXRfb3B0aW9ucycsICAjIGxpc3Qgb2YgKGxldmVsIChpbnQpLCBvcHRuYW1lIChpbnQpLCB2YWx1ZSAoaW50IG9yIHN0cikpIHR1cGxlcwogICAgJ2tleV9fc29ja3Nfb3B0aW9ucycsICAjIGRpY3QKICAgICdrZXlfYXNzZXJ0X2hvc3RuYW1lJywgICMgYm9vbCBvciBzdHJpbmcKICAgICdrZXlfYXNzZXJ0X2ZpbmdlcnByaW50JywgICMgc3RyCikKCiM6IFRoZSBuYW1lZHR1cGxlIGNsYXNzIHVzZWQgdG8gY29uc3RydWN0IGtleXMgZm9yIHRoZSBjb25uZWN0aW9uIHBvb2wuCiM6IEFsbCBjdXN0b20ga2V5IHNjaGVtZXMgc2hvdWxkIGluY2x1ZGUgdGhlIGZpZWxkcyBpbiB0aGlzIGtleSBhdCBhIG1pbmltdW0uClBvb2xLZXkgPSBjb2xsZWN0aW9ucy5uYW1lZHR1cGxlKCdQb29sS2V5JywgX2tleV9maWVsZHMpCgoKZGVmIF9kZWZhdWx0X2tleV9ub3JtYWxpemVyKGtleV9jbGFzcywgcmVxdWVzdF9jb250ZXh0KToKICAgICIiIgogICAgQ3JlYXRlIGEgcG9vbCBrZXkgb3V0IG9mIGEgcmVxdWVzdCBjb250ZXh0IGRpY3Rpb25hcnkuCgogICAgQWNjb3JkaW5nIHRvIFJGQyAzOTg2LCBib3RoIHRoZSBzY2hlbWUgYW5kIGhvc3QgYXJlIGNhc2UtaW5zZW5zaXRpdmUuCiAgICBUaGVyZWZvcmUsIHRoaXMgZnVuY3Rpb24gbm9ybWFsaXplcyBib3RoIGJlZm9yZSBjb25zdHJ1Y3RpbmcgdGhlIHBvb2wKICAgIGtleSBmb3IgYW4gSFRUUFMgcmVxdWVzdC4gSWYgeW91IHdpc2ggdG8gY2hhbmdlIHRoaXMgYmVoYXZpb3VyLCBwcm92aWRlCiAgICBhbHRlcm5hdGUgY2FsbGFibGVzIHRvIGBga2V5X2ZuX2J5X3NjaGVtZWBgLgoKICAgIDpwYXJhbSBrZXlfY2xhc3M6CiAgICAgICAgVGhlIGNsYXNzIHRvIHVzZSB3aGVuIGNvbnN0cnVjdGluZyB0aGUga2V5LiBUaGlzIHNob3VsZCBiZSBhIG5hbWVkdHVwbGUKICAgICAgICB3aXRoIHRoZSBgYHNjaGVtZWBgIGFuZCBgYGhvc3RgYCBrZXlzIGF0IGEgbWluaW11bS4KICAgIDp0eXBlICBrZXlfY2xhc3M6IG5hbWVkdHVwbGUKICAgIDpwYXJhbSByZXF1ZXN0X2NvbnRleHQ6CiAgICAgICAgQSBkaWN0aW9uYXJ5LWxpa2Ugb2JqZWN0IHRoYXQgY29udGFpbiB0aGUgY29udGV4dCBmb3IgYSByZXF1ZXN0LgogICAgOnR5cGUgIHJlcXVlc3RfY29udGV4dDogZGljdAoKICAgIDpyZXR1cm46IEEgbmFtZWR0dXBsZSB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgY29ubmVjdGlvbiBwb29sIGtleS4KICAgIDpydHlwZTogIFBvb2xLZXkKICAgICIiIgogICAgIyBTaW5jZSB3ZSBtdXRhdGUgdGhlIGRpY3Rpb25hcnksIG1ha2UgYSBjb3B5IGZpcnN0CiAgICBjb250ZXh0ID0gcmVxdWVzdF9jb250ZXh0LmNvcHkoKQogICAgY29udGV4dFsnc2NoZW1lJ10gPSBjb250ZXh0WydzY2hlbWUnXS5sb3dlcigpCiAgICBjb250ZXh0Wydob3N0J10gPSBjb250ZXh0Wydob3N0J10ubG93ZXIoKQoKICAgICMgVGhlc2UgYXJlIGJvdGggZGljdGlvbmFyaWVzIGFuZCBuZWVkIHRvIGJlIHRyYW5zZm9ybWVkIGludG8gZnJvemVuc2V0cwogICAgZm9yIGtleSBpbiAoJ2hlYWRlcnMnLCAnX3Byb3h5X2hlYWRlcnMnLCAnX3NvY2tzX29wdGlvbnMnKToKICAgICAgICBpZiBrZXkgaW4gY29udGV4dCBhbmQgY29udGV4dFtrZXldIGlzIG5vdCBOb25lOgogICAgICAgICAgICBjb250ZXh0W2tleV0gPSBmcm96ZW5zZXQoY29udGV4dFtrZXldLml0ZW1zKCkpCgogICAgIyBUaGUgc29ja2V0X29wdGlvbnMga2V5IG1heSBiZSBhIGxpc3QgYW5kIG5lZWRzIHRvIGJlIHRyYW5zZm9ybWVkIGludG8gYQogICAgIyB0dXBsZS4KICAgIHNvY2tldF9vcHRzID0gY29udGV4dC5nZXQoJ3NvY2tldF9vcHRpb25zJykKICAgIGlmIHNvY2tldF9vcHRzIGlzIG5vdCBOb25lOgogICAgICAgIGNvbnRleHRbJ3NvY2tldF9vcHRpb25zJ10gPSB0dXBsZShzb2NrZXRfb3B0cykKCiAgICAjIE1hcCB0aGUga3dhcmdzIHRvIHRoZSBuYW1lcyBpbiB0aGUgbmFtZWR0dXBsZSAtIHRoaXMgaXMgbmVjZXNzYXJ5IHNpbmNlCiAgICAjIG5hbWVkdHVwbGVzIGNhbid0IGhhdmUgZmllbGRzIHN0YXJ0aW5nIHdpdGggJ18nLgogICAgZm9yIGtleSBpbiBsaXN0KGNvbnRleHQua2V5cygpKToKICAgICAgICBjb250ZXh0WydrZXlfJyArIGtleV0gPSBjb250ZXh0LnBvcChrZXkpCgogICAgIyBEZWZhdWx0IHRvIGBgTm9uZWBgIGZvciBrZXlzIG1pc3NpbmcgZnJvbSB0aGUgY29udGV4dAogICAgZm9yIGZpZWxkIGluIGtleV9jbGFzcy5fZmllbGRzOgogICAgICAgIGlmIGZpZWxkIG5vdCBpbiBjb250ZXh0OgogICAgICAgICAgICBjb250ZXh0W2ZpZWxkXSA9IE5vbmUKCiAgICByZXR1cm4ga2V5X2NsYXNzKCoqY29udGV4dCkKCgojOiBBIGRpY3Rpb25hcnkgdGhhdCBtYXBzIGEgc2NoZW1lIHRvIGEgY2FsbGFibGUgdGhhdCBjcmVhdGVzIGEgcG9vbCBrZXkuCiM6IFRoaXMgY2FuIGJlIHVzZWQgdG8gYWx0ZXIgdGhlIHdheSBwb29sIGtleXMgYXJlIGNvbnN0cnVjdGVkLCBpZiBkZXNpcmVkLgojOiBFYWNoIFBvb2xNYW5hZ2VyIG1ha2VzIGEgY29weSBvZiB0aGlzIGRpY3Rpb25hcnkgc28gdGhleSBjYW4gYmUgY29uZmlndXJlZAojOiBnbG9iYWxseSBoZXJlLCBvciBpbmRpdmlkdWFsbHkgb24gdGhlIGluc3RhbmNlLgprZXlfZm5fYnlfc2NoZW1lID0gewogICAgJ2h0dHAnOiBmdW5jdG9vbHMucGFydGlhbChfZGVmYXVsdF9rZXlfbm9ybWFsaXplciwgUG9vbEtleSksCiAgICAnaHR0cHMnOiBmdW5jdG9vbHMucGFydGlhbChfZGVmYXVsdF9rZXlfbm9ybWFsaXplciwgUG9vbEtleSksCn0KCnBvb2xfY2xhc3Nlc19ieV9zY2hlbWUgPSB7CiAgICAnaHR0cCc6IEhUVFBDb25uZWN0aW9uUG9vbCwKICAgICdodHRwcyc6IEhUVFBTQ29ubmVjdGlvblBvb2wsCn0KCgpjbGFzcyBQb29sTWFuYWdlcihSZXF1ZXN0TWV0aG9kcyk6CiAgICAiIiIKICAgIEFsbG93cyBmb3IgYXJiaXRyYXJ5IHJlcXVlc3RzIHdoaWxlIHRyYW5zcGFyZW50bHkga2VlcGluZyB0cmFjayBvZgogICAgbmVjZXNzYXJ5IGNvbm5lY3Rpb24gcG9vbHMgZm9yIHlvdS4KCiAgICA6cGFyYW0gbnVtX3Bvb2xzOgogICAgICAgIE51bWJlciBvZiBjb25uZWN0aW9uIHBvb2xzIHRvIGNhY2hlIGJlZm9yZSBkaXNjYXJkaW5nIHRoZSBsZWFzdAogICAgICAgIHJlY2VudGx5IHVzZWQgcG9vbC4KCiAgICA6cGFyYW0gaGVhZGVyczoKICAgICAgICBIZWFkZXJzIHRvIGluY2x1ZGUgd2l0aCBhbGwgcmVxdWVzdHMsIHVubGVzcyBvdGhlciBoZWFkZXJzIGFyZSBnaXZlbgogICAgICAgIGV4cGxpY2l0bHkuCgogICAgOnBhcmFtIFxcKipjb25uZWN0aW9uX3Bvb2xfa3c6CiAgICAgICAgQWRkaXRpb25hbCBwYXJhbWV0ZXJzIGFyZSB1c2VkIHRvIGNyZWF0ZSBmcmVzaAogICAgICAgIDpjbGFzczpgdXJsbGliMy5jb25uZWN0aW9ucG9vbC5Db25uZWN0aW9uUG9vbGAgaW5zdGFuY2VzLgoKICAgIEV4YW1wbGU6OgoKICAgICAgICA+Pj4gbWFuYWdlciA9IFBvb2xNYW5hZ2VyKG51bV9wb29scz0yKQogICAgICAgID4+PiByID0gbWFuYWdlci5yZXF1ZXN0KCdHRVQnLCAnaHR0cDovL2dvb2dsZS5jb20vJykKICAgICAgICA+Pj4gciA9IG1hbmFnZXIucmVxdWVzdCgnR0VUJywgJ2h0dHA6Ly9nb29nbGUuY29tL21haWwnKQogICAgICAgID4+PiByID0gbWFuYWdlci5yZXF1ZXN0KCdHRVQnLCAnaHR0cDovL3lhaG9vLmNvbS8nKQogICAgICAgID4+PiBsZW4obWFuYWdlci5wb29scykKICAgICAgICAyCgogICAgIiIiCgogICAgcHJveHkgPSBOb25lCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG51bV9wb29scz0xMCwgaGVhZGVycz1Ob25lLCAqKmNvbm5lY3Rpb25fcG9vbF9rdyk6CiAgICAgICAgUmVxdWVzdE1ldGhvZHMuX19pbml0X18oc2VsZiwgaGVhZGVycykKICAgICAgICBzZWxmLmNvbm5lY3Rpb25fcG9vbF9rdyA9IGNvbm5lY3Rpb25fcG9vbF9rdwogICAgICAgIHNlbGYucG9vbHMgPSBSZWNlbnRseVVzZWRDb250YWluZXIobnVtX3Bvb2xzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcG9zZV9mdW5jPWxhbWJkYSBwOiBwLmNsb3NlKCkpCgogICAgICAgICMgTG9jYWxseSBzZXQgdGhlIHBvb2wgY2xhc3NlcyBhbmQga2V5cyBzbyBvdGhlciBQb29sTWFuYWdlcnMgY2FuCiAgICAgICAgIyBvdmVycmlkZSB0aGVtLgogICAgICAgIHNlbGYucG9vbF9jbGFzc2VzX2J5X3NjaGVtZSA9IHBvb2xfY2xhc3Nlc19ieV9zY2hlbWUKICAgICAgICBzZWxmLmtleV9mbl9ieV9zY2hlbWUgPSBrZXlfZm5fYnlfc2NoZW1lLmNvcHkoKQoKICAgIGRlZiBfX2VudGVyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgX19leGl0X18oc2VsZiwgZXhjX3R5cGUsIGV4Y192YWwsIGV4Y190Yik6CiAgICAgICAgc2VsZi5jbGVhcigpCiAgICAgICAgIyBSZXR1cm4gRmFsc2UgdG8gcmUtcmFpc2UgYW55IHBvdGVudGlhbCBleGNlcHRpb25zCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIF9uZXdfcG9vbChzZWxmLCBzY2hlbWUsIGhvc3QsIHBvcnQsIHJlcXVlc3RfY29udGV4dD1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBDcmVhdGUgYSBuZXcgOmNsYXNzOmBDb25uZWN0aW9uUG9vbGAgYmFzZWQgb24gaG9zdCwgcG9ydCwgc2NoZW1lLCBhbmQKICAgICAgICBhbnkgYWRkaXRpb25hbCBwb29sIGtleXdvcmQgYXJndW1lbnRzLgoKICAgICAgICBJZiBgYHJlcXVlc3RfY29udGV4dGBgIGlzIHByb3ZpZGVkLCBpdCBpcyBwcm92aWRlZCBhcyBrZXl3b3JkIGFyZ3VtZW50cwogICAgICAgIHRvIHRoZSBwb29sIGNsYXNzIHVzZWQuIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gYWN0dWFsbHkgY3JlYXRlIHRoZQogICAgICAgIGNvbm5lY3Rpb24gcG9vbHMgaGFuZGVkIG91dCBieSA6bWV0aDpgY29ubmVjdGlvbl9mcm9tX3VybGAgYW5kCiAgICAgICAgY29tcGFuaW9uIG1ldGhvZHMuIEl0IGlzIGludGVuZGVkIHRvIGJlIG92ZXJyaWRkZW4gZm9yIGN1c3RvbWl6YXRpb24uCiAgICAgICAgIiIiCiAgICAgICAgcG9vbF9jbHMgPSBzZWxmLnBvb2xfY2xhc3Nlc19ieV9zY2hlbWVbc2NoZW1lXQogICAgICAgIGlmIHJlcXVlc3RfY29udGV4dCBpcyBOb25lOgogICAgICAgICAgICByZXF1ZXN0X2NvbnRleHQgPSBzZWxmLmNvbm5lY3Rpb25fcG9vbF9rdy5jb3B5KCkKCiAgICAgICAgIyBBbHRob3VnaCB0aGUgY29udGV4dCBoYXMgZXZlcnl0aGluZyBuZWNlc3NhcnkgdG8gY3JlYXRlIHRoZSBwb29sLAogICAgICAgICMgdGhpcyBmdW5jdGlvbiBoYXMgaGlzdG9yaWNhbGx5IG9ubHkgdXNlZCB0aGUgc2NoZW1lLCBob3N0LCBhbmQgcG9ydAogICAgICAgICMgaW4gdGhlIHBvc2l0aW9uYWwgYXJncy4gV2hlbiBhbiBBUEkgY2hhbmdlIGlzIGFjY2VwdGFibGUgdGhlc2UgY2FuCiAgICAgICAgIyBiZSByZW1vdmVkLgogICAgICAgIGZvciBrZXkgaW4gKCdzY2hlbWUnLCAnaG9zdCcsICdwb3J0Jyk6CiAgICAgICAgICAgIHJlcXVlc3RfY29udGV4dC5wb3Aoa2V5LCBOb25lKQoKICAgICAgICBpZiBzY2hlbWUgPT0gJ2h0dHAnOgogICAgICAgICAgICBmb3Iga3cgaW4gU1NMX0tFWVdPUkRTOgogICAgICAgICAgICAgICAgcmVxdWVzdF9jb250ZXh0LnBvcChrdywgTm9uZSkKCiAgICAgICAgcmV0dXJuIHBvb2xfY2xzKGhvc3QsIHBvcnQsICoqcmVxdWVzdF9jb250ZXh0KQoKICAgIGRlZiBjbGVhcihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBFbXB0eSBvdXIgc3RvcmUgb2YgcG9vbHMgYW5kIGRpcmVjdCB0aGVtIGFsbCB0byBjbG9zZS4KCiAgICAgICAgVGhpcyB3aWxsIG5vdCBhZmZlY3QgaW4tZmxpZ2h0IGNvbm5lY3Rpb25zLCBidXQgdGhleSB3aWxsIG5vdCBiZQogICAgICAgIHJlLXVzZWQgYWZ0ZXIgY29tcGxldGlvbi4KICAgICAgICAiIiIKICAgICAgICBzZWxmLnBvb2xzLmNsZWFyKCkKCiAgICBkZWYgY29ubmVjdGlvbl9mcm9tX2hvc3Qoc2VsZiwgaG9zdCwgcG9ydD1Ob25lLCBzY2hlbWU9J2h0dHAnLCBwb29sX2t3YXJncz1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBHZXQgYSA6Y2xhc3M6YENvbm5lY3Rpb25Qb29sYCBiYXNlZCBvbiB0aGUgaG9zdCwgcG9ydCwgYW5kIHNjaGVtZS4KCiAgICAgICAgSWYgYGBwb3J0YGAgaXNuJ3QgZ2l2ZW4sIGl0IHdpbGwgYmUgZGVyaXZlZCBmcm9tIHRoZSBgYHNjaGVtZWBgIHVzaW5nCiAgICAgICAgYGB1cmxsaWIzLmNvbm5lY3Rpb25wb29sLnBvcnRfYnlfc2NoZW1lYGAuIElmIGBgcG9vbF9rd2FyZ3NgYCBpcwogICAgICAgIHByb3ZpZGVkLCBpdCBpcyBtZXJnZWQgd2l0aCB0aGUgaW5zdGFuY2UncyBgYGNvbm5lY3Rpb25fcG9vbF9rd2BgCiAgICAgICAgdmFyaWFibGUgYW5kIHVzZWQgdG8gY3JlYXRlIHRoZSBuZXcgY29ubmVjdGlvbiBwb29sLCBpZiBvbmUgaXMKICAgICAgICBuZWVkZWQuCiAgICAgICAgIiIiCgogICAgICAgIGlmIG5vdCBob3N0OgogICAgICAgICAgICByYWlzZSBMb2NhdGlvblZhbHVlRXJyb3IoIk5vIGhvc3Qgc3BlY2lmaWVkLiIpCgogICAgICAgIHJlcXVlc3RfY29udGV4dCA9IHNlbGYuX21lcmdlX3Bvb2xfa3dhcmdzKHBvb2xfa3dhcmdzKQogICAgICAgIHJlcXVlc3RfY29udGV4dFsnc2NoZW1lJ10gPSBzY2hlbWUgb3IgJ2h0dHAnCiAgICAgICAgaWYgbm90IHBvcnQ6CiAgICAgICAgICAgIHBvcnQgPSBwb3J0X2J5X3NjaGVtZS5nZXQocmVxdWVzdF9jb250ZXh0WydzY2hlbWUnXS5sb3dlcigpLCA4MCkKICAgICAgICByZXF1ZXN0X2NvbnRleHRbJ3BvcnQnXSA9IHBvcnQKICAgICAgICByZXF1ZXN0X2NvbnRleHRbJ2hvc3QnXSA9IGhvc3QKCiAgICAgICAgcmV0dXJuIHNlbGYuY29ubmVjdGlvbl9mcm9tX2NvbnRleHQocmVxdWVzdF9jb250ZXh0KQoKICAgIGRlZiBjb25uZWN0aW9uX2Zyb21fY29udGV4dChzZWxmLCByZXF1ZXN0X2NvbnRleHQpOgogICAgICAgICIiIgogICAgICAgIEdldCBhIDpjbGFzczpgQ29ubmVjdGlvblBvb2xgIGJhc2VkIG9uIHRoZSByZXF1ZXN0IGNvbnRleHQuCgogICAgICAgIGBgcmVxdWVzdF9jb250ZXh0YGAgbXVzdCBhdCBsZWFzdCBjb250YWluIHRoZSBgYHNjaGVtZWBgIGtleSBhbmQgaXRzCiAgICAgICAgdmFsdWUgbXVzdCBiZSBhIGtleSBpbiBgYGtleV9mbl9ieV9zY2hlbWVgYCBpbnN0YW5jZSB2YXJpYWJsZS4KICAgICAgICAiIiIKICAgICAgICBzY2hlbWUgPSByZXF1ZXN0X2NvbnRleHRbJ3NjaGVtZSddLmxvd2VyKCkKICAgICAgICBwb29sX2tleV9jb25zdHJ1Y3RvciA9IHNlbGYua2V5X2ZuX2J5X3NjaGVtZVtzY2hlbWVdCiAgICAgICAgcG9vbF9rZXkgPSBwb29sX2tleV9jb25zdHJ1Y3RvcihyZXF1ZXN0X2NvbnRleHQpCgogICAgICAgIHJldHVybiBzZWxmLmNvbm5lY3Rpb25fZnJvbV9wb29sX2tleShwb29sX2tleSwgcmVxdWVzdF9jb250ZXh0PXJlcXVlc3RfY29udGV4dCkKCiAgICBkZWYgY29ubmVjdGlvbl9mcm9tX3Bvb2xfa2V5KHNlbGYsIHBvb2xfa2V5LCByZXF1ZXN0X2NvbnRleHQ9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgR2V0IGEgOmNsYXNzOmBDb25uZWN0aW9uUG9vbGAgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHBvb2wga2V5LgoKICAgICAgICBgYHBvb2xfa2V5YGAgc2hvdWxkIGJlIGEgbmFtZWR0dXBsZSB0aGF0IG9ubHkgY29udGFpbnMgaW1tdXRhYmxlCiAgICAgICAgb2JqZWN0cy4gQXQgYSBtaW5pbXVtIGl0IG11c3QgaGF2ZSB0aGUgYGBzY2hlbWVgYCwgYGBob3N0YGAsIGFuZAogICAgICAgIGBgcG9ydGBgIGZpZWxkcy4KICAgICAgICAiIiIKICAgICAgICB3aXRoIHNlbGYucG9vbHMubG9jazoKICAgICAgICAgICAgIyBJZiB0aGUgc2NoZW1lLCBob3N0LCBvciBwb3J0IGRvZXNuJ3QgbWF0Y2ggZXhpc3Rpbmcgb3BlbgogICAgICAgICAgICAjIGNvbm5lY3Rpb25zLCBvcGVuIGEgbmV3IENvbm5lY3Rpb25Qb29sLgogICAgICAgICAgICBwb29sID0gc2VsZi5wb29scy5nZXQocG9vbF9rZXkpCiAgICAgICAgICAgIGlmIHBvb2w6CiAgICAgICAgICAgICAgICByZXR1cm4gcG9vbAoKICAgICAgICAgICAgIyBNYWtlIGEgZnJlc2ggQ29ubmVjdGlvblBvb2wgb2YgdGhlIGRlc2lyZWQgdHlwZQogICAgICAgICAgICBzY2hlbWUgPSByZXF1ZXN0X2NvbnRleHRbJ3NjaGVtZSddCiAgICAgICAgICAgIGhvc3QgPSByZXF1ZXN0X2NvbnRleHRbJ2hvc3QnXQogICAgICAgICAgICBwb3J0ID0gcmVxdWVzdF9jb250ZXh0Wydwb3J0J10KICAgICAgICAgICAgcG9vbCA9IHNlbGYuX25ld19wb29sKHNjaGVtZSwgaG9zdCwgcG9ydCwgcmVxdWVzdF9jb250ZXh0PXJlcXVlc3RfY29udGV4dCkKICAgICAgICAgICAgc2VsZi5wb29sc1twb29sX2tleV0gPSBwb29sCgogICAgICAgIHJldHVybiBwb29sCgogICAgZGVmIGNvbm5lY3Rpb25fZnJvbV91cmwoc2VsZiwgdXJsLCBwb29sX2t3YXJncz1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBTaW1pbGFyIHRvIDpmdW5jOmB1cmxsaWIzLmNvbm5lY3Rpb25wb29sLmNvbm5lY3Rpb25fZnJvbV91cmxgLgoKICAgICAgICBJZiBgYHBvb2xfa3dhcmdzYGAgaXMgbm90IHByb3ZpZGVkIGFuZCBhIG5ldyBwb29sIG5lZWRzIHRvIGJlCiAgICAgICAgY29uc3RydWN0ZWQsIGBgc2VsZi5jb25uZWN0aW9uX3Bvb2xfa3dgYCBpcyB1c2VkIHRvIGluaXRpYWxpemUKICAgICAgICB0aGUgOmNsYXNzOmB1cmxsaWIzLmNvbm5lY3Rpb25wb29sLkNvbm5lY3Rpb25Qb29sYC4gSWYgYGBwb29sX2t3YXJnc2BgCiAgICAgICAgaXMgcHJvdmlkZWQsIGl0IGlzIHVzZWQgaW5zdGVhZC4gTm90ZSB0aGF0IGlmIGEgbmV3IHBvb2wgZG9lcyBub3QKICAgICAgICBuZWVkIHRvIGJlIGNyZWF0ZWQgZm9yIHRoZSByZXF1ZXN0LCB0aGUgcHJvdmlkZWQgYGBwb29sX2t3YXJnc2BgIGFyZQogICAgICAgIG5vdCB1c2VkLgogICAgICAgICIiIgogICAgICAgIHUgPSBwYXJzZV91cmwodXJsKQogICAgICAgIHJldHVybiBzZWxmLmNvbm5lY3Rpb25fZnJvbV9ob3N0KHUuaG9zdCwgcG9ydD11LnBvcnQsIHNjaGVtZT11LnNjaGVtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29sX2t3YXJncz1wb29sX2t3YXJncykKCiAgICBkZWYgX21lcmdlX3Bvb2xfa3dhcmdzKHNlbGYsIG92ZXJyaWRlKToKICAgICAgICAiIiIKICAgICAgICBNZXJnZSBhIGRpY3Rpb25hcnkgb2Ygb3ZlcnJpZGUgdmFsdWVzIGZvciBzZWxmLmNvbm5lY3Rpb25fcG9vbF9rdy4KCiAgICAgICAgVGhpcyBkb2VzIG5vdCBtb2RpZnkgc2VsZi5jb25uZWN0aW9uX3Bvb2xfa3cgYW5kIHJldHVybnMgYSBuZXcgZGljdC4KICAgICAgICBBbnkga2V5cyBpbiB0aGUgb3ZlcnJpZGUgZGljdGlvbmFyeSB3aXRoIGEgdmFsdWUgb2YgYGBOb25lYGAgYXJlCiAgICAgICAgcmVtb3ZlZCBmcm9tIHRoZSBtZXJnZWQgZGljdGlvbmFyeS4KICAgICAgICAiIiIKICAgICAgICBiYXNlX3Bvb2xfa3dhcmdzID0gc2VsZi5jb25uZWN0aW9uX3Bvb2xfa3cuY29weSgpCiAgICAgICAgaWYgb3ZlcnJpZGU6CiAgICAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIG92ZXJyaWRlLml0ZW1zKCk6CiAgICAgICAgICAgICAgICBpZiB2YWx1ZSBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgZGVsIGJhc2VfcG9vbF9rd2FyZ3Nba2V5XQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBiYXNlX3Bvb2xfa3dhcmdzW2tleV0gPSB2YWx1ZQogICAgICAgIHJldHVybiBiYXNlX3Bvb2xfa3dhcmdzCgogICAgZGVmIHVybG9wZW4oc2VsZiwgbWV0aG9kLCB1cmwsIHJlZGlyZWN0PVRydWUsICoqa3cpOgogICAgICAgICIiIgogICAgICAgIFNhbWUgYXMgOm1ldGg6YHVybGxpYjMuY29ubmVjdGlvbnBvb2wuSFRUUENvbm5lY3Rpb25Qb29sLnVybG9wZW5gCiAgICAgICAgd2l0aCBjdXN0b20gY3Jvc3MtaG9zdCByZWRpcmVjdCBsb2dpYyBhbmQgb25seSBzZW5kcyB0aGUgcmVxdWVzdC11cmkKICAgICAgICBwb3J0aW9uIG9mIHRoZSBgYHVybGBgLgoKICAgICAgICBUaGUgZ2l2ZW4gYGB1cmxgYCBwYXJhbWV0ZXIgbXVzdCBiZSBhYnNvbHV0ZSwgc3VjaCB0aGF0IGFuIGFwcHJvcHJpYXRlCiAgICAgICAgOmNsYXNzOmB1cmxsaWIzLmNvbm5lY3Rpb25wb29sLkNvbm5lY3Rpb25Qb29sYCBjYW4gYmUgY2hvc2VuIGZvciBpdC4KICAgICAgICAiIiIKICAgICAgICB1ID0gcGFyc2VfdXJsKHVybCkKICAgICAgICBjb25uID0gc2VsZi5jb25uZWN0aW9uX2Zyb21faG9zdCh1Lmhvc3QsIHBvcnQ9dS5wb3J0LCBzY2hlbWU9dS5zY2hlbWUpCgogICAgICAgIGt3Wydhc3NlcnRfc2FtZV9ob3N0J10gPSBGYWxzZQogICAgICAgIGt3WydyZWRpcmVjdCddID0gRmFsc2UKICAgICAgICBpZiAnaGVhZGVycycgbm90IGluIGt3OgogICAgICAgICAgICBrd1snaGVhZGVycyddID0gc2VsZi5oZWFkZXJzCgogICAgICAgIGlmIHNlbGYucHJveHkgaXMgbm90IE5vbmUgYW5kIHUuc2NoZW1lID09ICJodHRwIjoKICAgICAgICAgICAgcmVzcG9uc2UgPSBjb25uLnVybG9wZW4obWV0aG9kLCB1cmwsICoqa3cpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVzcG9uc2UgPSBjb25uLnVybG9wZW4obWV0aG9kLCB1LnJlcXVlc3RfdXJpLCAqKmt3KQoKICAgICAgICByZWRpcmVjdF9sb2NhdGlvbiA9IHJlZGlyZWN0IGFuZCByZXNwb25zZS5nZXRfcmVkaXJlY3RfbG9jYXRpb24oKQogICAgICAgIGlmIG5vdCByZWRpcmVjdF9sb2NhdGlvbjoKICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlCgogICAgICAgICMgU3VwcG9ydCByZWxhdGl2ZSBVUkxzIGZvciByZWRpcmVjdGluZy4KICAgICAgICByZWRpcmVjdF9sb2NhdGlvbiA9IHVybGpvaW4odXJsLCByZWRpcmVjdF9sb2NhdGlvbikKCiAgICAgICAgIyBSRkMgNzIzMSwgU2VjdGlvbiA2LjQuNAogICAgICAgIGlmIHJlc3BvbnNlLnN0YXR1cyA9PSAzMDM6CiAgICAgICAgICAgIG1ldGhvZCA9ICdHRVQnCgogICAgICAgIHJldHJpZXMgPSBrdy5nZXQoJ3JldHJpZXMnKQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHJldHJpZXMsIFJldHJ5KToKICAgICAgICAgICAgcmV0cmllcyA9IFJldHJ5LmZyb21faW50KHJldHJpZXMsIHJlZGlyZWN0PXJlZGlyZWN0KQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHJpZXMgPSByZXRyaWVzLmluY3JlbWVudChtZXRob2QsIHVybCwgcmVzcG9uc2U9cmVzcG9uc2UsIF9wb29sPWNvbm4pCiAgICAgICAgZXhjZXB0IE1heFJldHJ5RXJyb3I6CiAgICAgICAgICAgIGlmIHJldHJpZXMucmFpc2Vfb25fcmVkaXJlY3Q6CiAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UKCiAgICAgICAga3dbJ3JldHJpZXMnXSA9IHJldHJpZXMKICAgICAgICBrd1sncmVkaXJlY3QnXSA9IHJlZGlyZWN0CgogICAgICAgIGxvZy5pbmZvKCJSZWRpcmVjdGluZyAlcyAtPiAlcyIsIHVybCwgcmVkaXJlY3RfbG9jYXRpb24pCiAgICAgICAgcmV0dXJuIHNlbGYudXJsb3BlbihtZXRob2QsIHJlZGlyZWN0X2xvY2F0aW9uLCAqKmt3KQoKCmNsYXNzIFByb3h5TWFuYWdlcihQb29sTWFuYWdlcik6CiAgICAiIiIKICAgIEJlaGF2ZXMganVzdCBsaWtlIDpjbGFzczpgUG9vbE1hbmFnZXJgLCBidXQgc2VuZHMgYWxsIHJlcXVlc3RzIHRocm91Z2gKICAgIHRoZSBkZWZpbmVkIHByb3h5LCB1c2luZyB0aGUgQ09OTkVDVCBtZXRob2QgZm9yIEhUVFBTIFVSTHMuCgogICAgOnBhcmFtIHByb3h5X3VybDoKICAgICAgICBUaGUgVVJMIG9mIHRoZSBwcm94eSB0byBiZSB1c2VkLgoKICAgIDpwYXJhbSBwcm94eV9oZWFkZXJzOgogICAgICAgIEEgZGljdGlvbmFyeSBjb250YW5pbmcgaGVhZGVycyB0aGF0IHdpbGwgYmUgc2VudCB0byB0aGUgcHJveHkuIEluIGNhc2UKICAgICAgICBvZiBIVFRQIHRoZXkgYXJlIGJlaW5nIHNlbnQgd2l0aCBlYWNoIHJlcXVlc3QsIHdoaWxlIGluIHRoZQogICAgICAgIEhUVFBTL0NPTk5FQ1QgY2FzZSB0aGV5IGFyZSBzZW50IG9ubHkgb25jZS4gQ291bGQgYmUgdXNlZCBmb3IgcHJveHkKICAgICAgICBhdXRoZW50aWNhdGlvbi4KCiAgICBFeGFtcGxlOgogICAgICAgID4+PiBwcm94eSA9IHVybGxpYjMuUHJveHlNYW5hZ2VyKCdodHRwOi8vbG9jYWxob3N0OjMxMjgvJykKICAgICAgICA+Pj4gcjEgPSBwcm94eS5yZXF1ZXN0KCdHRVQnLCAnaHR0cDovL2dvb2dsZS5jb20vJykKICAgICAgICA+Pj4gcjIgPSBwcm94eS5yZXF1ZXN0KCdHRVQnLCAnaHR0cDovL2h0dHBiaW4ub3JnLycpCiAgICAgICAgPj4+IGxlbihwcm94eS5wb29scykKICAgICAgICAxCiAgICAgICAgPj4+IHIzID0gcHJveHkucmVxdWVzdCgnR0VUJywgJ2h0dHBzOi8vaHR0cGJpbi5vcmcvJykKICAgICAgICA+Pj4gcjQgPSBwcm94eS5yZXF1ZXN0KCdHRVQnLCAnaHR0cHM6Ly90d2l0dGVyLmNvbS8nKQogICAgICAgID4+PiBsZW4ocHJveHkucG9vbHMpCiAgICAgICAgMwoKICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm94eV91cmwsIG51bV9wb29scz0xMCwgaGVhZGVycz1Ob25lLAogICAgICAgICAgICAgICAgIHByb3h5X2hlYWRlcnM9Tm9uZSwgKipjb25uZWN0aW9uX3Bvb2xfa3cpOgoKICAgICAgICBpZiBpc2luc3RhbmNlKHByb3h5X3VybCwgSFRUUENvbm5lY3Rpb25Qb29sKToKICAgICAgICAgICAgcHJveHlfdXJsID0gJyVzOi8vJXM6JWknICUgKHByb3h5X3VybC5zY2hlbWUsIHByb3h5X3VybC5ob3N0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJveHlfdXJsLnBvcnQpCiAgICAgICAgcHJveHkgPSBwYXJzZV91cmwocHJveHlfdXJsKQogICAgICAgIGlmIG5vdCBwcm94eS5wb3J0OgogICAgICAgICAgICBwb3J0ID0gcG9ydF9ieV9zY2hlbWUuZ2V0KHByb3h5LnNjaGVtZSwgODApCiAgICAgICAgICAgIHByb3h5ID0gcHJveHkuX3JlcGxhY2UocG9ydD1wb3J0KQoKICAgICAgICBpZiBwcm94eS5zY2hlbWUgbm90IGluICgiaHR0cCIsICJodHRwcyIpOgogICAgICAgICAgICByYWlzZSBQcm94eVNjaGVtZVVua25vd24ocHJveHkuc2NoZW1lKQoKICAgICAgICBzZWxmLnByb3h5ID0gcHJveHkKICAgICAgICBzZWxmLnByb3h5X2hlYWRlcnMgPSBwcm94eV9oZWFkZXJzIG9yIHt9CgogICAgICAgIGNvbm5lY3Rpb25fcG9vbF9rd1snX3Byb3h5J10gPSBzZWxmLnByb3h5CiAgICAgICAgY29ubmVjdGlvbl9wb29sX2t3WydfcHJveHlfaGVhZGVycyddID0gc2VsZi5wcm94eV9oZWFkZXJzCgogICAgICAgIHN1cGVyKFByb3h5TWFuYWdlciwgc2VsZikuX19pbml0X18oCiAgICAgICAgICAgIG51bV9wb29scywgaGVhZGVycywgKipjb25uZWN0aW9uX3Bvb2xfa3cpCgogICAgZGVmIGNvbm5lY3Rpb25fZnJvbV9ob3N0KHNlbGYsIGhvc3QsIHBvcnQ9Tm9uZSwgc2NoZW1lPSdodHRwJywgcG9vbF9rd2FyZ3M9Tm9uZSk6CiAgICAgICAgaWYgc2NoZW1lID09ICJodHRwcyI6CiAgICAgICAgICAgIHJldHVybiBzdXBlcihQcm94eU1hbmFnZXIsIHNlbGYpLmNvbm5lY3Rpb25fZnJvbV9ob3N0KAogICAgICAgICAgICAgICAgaG9zdCwgcG9ydCwgc2NoZW1lLCBwb29sX2t3YXJncz1wb29sX2t3YXJncykKCiAgICAgICAgcmV0dXJuIHN1cGVyKFByb3h5TWFuYWdlciwgc2VsZikuY29ubmVjdGlvbl9mcm9tX2hvc3QoCiAgICAgICAgICAgIHNlbGYucHJveHkuaG9zdCwgc2VsZi5wcm94eS5wb3J0LCBzZWxmLnByb3h5LnNjaGVtZSwgcG9vbF9rd2FyZ3M9cG9vbF9rd2FyZ3MpCgogICAgZGVmIF9zZXRfcHJveHlfaGVhZGVycyhzZWxmLCB1cmwsIGhlYWRlcnM9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgU2V0cyBoZWFkZXJzIG5lZWRlZCBieSBwcm94aWVzOiBzcGVjaWZpY2FsbHksIHRoZSBBY2NlcHQgYW5kIEhvc3QKICAgICAgICBoZWFkZXJzLiBPbmx5IHNldHMgaGVhZGVycyBub3QgcHJvdmlkZWQgYnkgdGhlIHVzZXIuCiAgICAgICAgIiIiCiAgICAgICAgaGVhZGVyc18gPSB7J0FjY2VwdCc6ICcqLyonfQoKICAgICAgICBuZXRsb2MgPSBwYXJzZV91cmwodXJsKS5uZXRsb2MKICAgICAgICBpZiBuZXRsb2M6CiAgICAgICAgICAgIGhlYWRlcnNfWydIb3N0J10gPSBuZXRsb2MKCiAgICAgICAgaWYgaGVhZGVyczoKICAgICAgICAgICAgaGVhZGVyc18udXBkYXRlKGhlYWRlcnMpCiAgICAgICAgcmV0dXJuIGhlYWRlcnNfCgogICAgZGVmIHVybG9wZW4oc2VsZiwgbWV0aG9kLCB1cmwsIHJlZGlyZWN0PVRydWUsICoqa3cpOgogICAgICAgICJTYW1lIGFzIEhUVFAoUylDb25uZWN0aW9uUG9vbC51cmxvcGVuLCBgYHVybGBgIG11c3QgYmUgYWJzb2x1dGUuIgogICAgICAgIHUgPSBwYXJzZV91cmwodXJsKQoKICAgICAgICBpZiB1LnNjaGVtZSA9PSAiaHR0cCI6CiAgICAgICAgICAgICMgRm9yIHByb3hpZWQgSFRUUFMgcmVxdWVzdHMsIGh0dHBsaWIgc2V0cyB0aGUgbmVjZXNzYXJ5IGhlYWRlcnMKICAgICAgICAgICAgIyBvbiB0aGUgQ09OTkVDVCB0byB0aGUgcHJveHkuIEZvciBIVFRQLCB3ZSdsbCBkZWZpbml0ZWx5CiAgICAgICAgICAgICMgbmVlZCB0byBzZXQgJ0hvc3QnIGF0IHRoZSB2ZXJ5IGxlYXN0LgogICAgICAgICAgICBoZWFkZXJzID0ga3cuZ2V0KCdoZWFkZXJzJywgc2VsZi5oZWFkZXJzKQogICAgICAgICAgICBrd1snaGVhZGVycyddID0gc2VsZi5fc2V0X3Byb3h5X2hlYWRlcnModXJsLCBoZWFkZXJzKQoKICAgICAgICByZXR1cm4gc3VwZXIoUHJveHlNYW5hZ2VyLCBzZWxmKS51cmxvcGVuKG1ldGhvZCwgdXJsLCByZWRpcmVjdD1yZWRpcmVjdCwgKiprdykKCgpkZWYgcHJveHlfZnJvbV91cmwodXJsLCAqKmt3KToKICAgIHJldHVybiBQcm94eU1hbmFnZXIocHJveHlfdXJsPXVybCwgKiprdykKUEsDBBQAAAAAAAAAIQDKMeTEOhcAADoXAAAuAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvcmVxdWVzdC5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0Cgpmcm9tIC5maWxlcG9zdCBpbXBvcnQgZW5jb2RlX211bHRpcGFydF9mb3JtZGF0YQpmcm9tIC5wYWNrYWdlcy5zaXgubW92ZXMudXJsbGliLnBhcnNlIGltcG9ydCB1cmxlbmNvZGUKCgpfX2FsbF9fID0gWydSZXF1ZXN0TWV0aG9kcyddCgoKY2xhc3MgUmVxdWVzdE1ldGhvZHMob2JqZWN0KToKICAgICIiIgogICAgQ29udmVuaWVuY2UgbWl4aW4gZm9yIGNsYXNzZXMgd2hvIGltcGxlbWVudCBhIDptZXRoOmB1cmxvcGVuYCBtZXRob2QsIHN1Y2gKICAgIGFzIDpjbGFzczpgfnVybGxpYjMuY29ubmVjdGlvbnBvb2wuSFRUUENvbm5lY3Rpb25Qb29sYCBhbmQKICAgIDpjbGFzczpgfnVybGxpYjMucG9vbG1hbmFnZXIuUG9vbE1hbmFnZXJgLgoKICAgIFByb3ZpZGVzIGJlaGF2aW9yIGZvciBtYWtpbmcgY29tbW9uIHR5cGVzIG9mIEhUVFAgcmVxdWVzdCBtZXRob2RzIGFuZAogICAgZGVjaWRlcyB3aGljaCB0eXBlIG9mIHJlcXVlc3QgZmllbGQgZW5jb2RpbmcgdG8gdXNlLgoKICAgIFNwZWNpZmljYWxseSwKCiAgICA6bWV0aDpgLnJlcXVlc3RfZW5jb2RlX3VybGAgaXMgZm9yIHNlbmRpbmcgcmVxdWVzdHMgd2hvc2UgZmllbGRzIGFyZQogICAgZW5jb2RlZCBpbiB0aGUgVVJMIChzdWNoIGFzIEdFVCwgSEVBRCwgREVMRVRFKS4KCiAgICA6bWV0aDpgLnJlcXVlc3RfZW5jb2RlX2JvZHlgIGlzIGZvciBzZW5kaW5nIHJlcXVlc3RzIHdob3NlIGZpZWxkcyBhcmUKICAgIGVuY29kZWQgaW4gdGhlICpib2R5KiBvZiB0aGUgcmVxdWVzdCB1c2luZyBtdWx0aXBhcnQgb3Igd3d3LWZvcm0tdXJsZW5jb2RlZAogICAgKHN1Y2ggYXMgZm9yIFBPU1QsIFBVVCwgUEFUQ0gpLgoKICAgIDptZXRoOmAucmVxdWVzdGAgaXMgZm9yIG1ha2luZyBhbnkga2luZCBvZiByZXF1ZXN0LCBpdCB3aWxsIGxvb2sgdXAgdGhlCiAgICBhcHByb3ByaWF0ZSBlbmNvZGluZyBmb3JtYXQgYW5kIHVzZSBvbmUgb2YgdGhlIGFib3ZlIHR3byBtZXRob2RzIHRvIG1ha2UKICAgIHRoZSByZXF1ZXN0LgoKICAgIEluaXRpYWxpemVyIHBhcmFtZXRlcnM6CgogICAgOnBhcmFtIGhlYWRlcnM6CiAgICAgICAgSGVhZGVycyB0byBpbmNsdWRlIHdpdGggYWxsIHJlcXVlc3RzLCB1bmxlc3Mgb3RoZXIgaGVhZGVycyBhcmUgZ2l2ZW4KICAgICAgICBleHBsaWNpdGx5LgogICAgIiIiCgogICAgX2VuY29kZV91cmxfbWV0aG9kcyA9IHNldChbJ0RFTEVURScsICdHRVQnLCAnSEVBRCcsICdPUFRJT05TJ10pCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGhlYWRlcnM9Tm9uZSk6CiAgICAgICAgc2VsZi5oZWFkZXJzID0gaGVhZGVycyBvciB7fQoKICAgIGRlZiB1cmxvcGVuKHNlbGYsIG1ldGhvZCwgdXJsLCBib2R5PU5vbmUsIGhlYWRlcnM9Tm9uZSwKICAgICAgICAgICAgICAgIGVuY29kZV9tdWx0aXBhcnQ9VHJ1ZSwgbXVsdGlwYXJ0X2JvdW5kYXJ5PU5vbmUsCiAgICAgICAgICAgICAgICAqKmt3KTogICMgQWJzdHJhY3QKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZCgiQ2xhc3NlcyBleHRlbmRpbmcgUmVxdWVzdE1ldGhvZHMgbXVzdCBpbXBsZW1lbnQgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGVpciBvd24gYGB1cmxvcGVuYGAgbWV0aG9kLiIpCgogICAgZGVmIHJlcXVlc3Qoc2VsZiwgbWV0aG9kLCB1cmwsIGZpZWxkcz1Ob25lLCBoZWFkZXJzPU5vbmUsICoqdXJsb3Blbl9rdyk6CiAgICAgICAgIiIiCiAgICAgICAgTWFrZSBhIHJlcXVlc3QgdXNpbmcgOm1ldGg6YHVybG9wZW5gIHdpdGggdGhlIGFwcHJvcHJpYXRlIGVuY29kaW5nIG9mCiAgICAgICAgYGBmaWVsZHNgYCBiYXNlZCBvbiB0aGUgYGBtZXRob2RgYCB1c2VkLgoKICAgICAgICBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRoYXQgcmVxdWlyZXMgdGhlIGxlYXN0IGFtb3VudCBvZiBtYW51YWwKICAgICAgICBlZmZvcnQuIEl0IGNhbiBiZSB1c2VkIGluIG1vc3Qgc2l0dWF0aW9ucywgd2hpbGUgc3RpbGwgaGF2aW5nIHRoZQogICAgICAgIG9wdGlvbiB0byBkcm9wIGRvd24gdG8gbW9yZSBzcGVjaWZpYyBtZXRob2RzIHdoZW4gbmVjZXNzYXJ5LCBzdWNoIGFzCiAgICAgICAgOm1ldGg6YHJlcXVlc3RfZW5jb2RlX3VybGAsIDptZXRoOmByZXF1ZXN0X2VuY29kZV9ib2R5YCwKICAgICAgICBvciBldmVuIHRoZSBsb3dlc3QgbGV2ZWwgOm1ldGg6YHVybG9wZW5gLgogICAgICAgICIiIgogICAgICAgIG1ldGhvZCA9IG1ldGhvZC51cHBlcigpCgogICAgICAgIGlmIG1ldGhvZCBpbiBzZWxmLl9lbmNvZGVfdXJsX21ldGhvZHM6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnJlcXVlc3RfZW5jb2RlX3VybChtZXRob2QsIHVybCwgZmllbGRzPWZpZWxkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM9aGVhZGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqdXJsb3Blbl9rdykKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc2VsZi5yZXF1ZXN0X2VuY29kZV9ib2R5KG1ldGhvZCwgdXJsLCBmaWVsZHM9ZmllbGRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM9aGVhZGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnVybG9wZW5fa3cpCgogICAgZGVmIHJlcXVlc3RfZW5jb2RlX3VybChzZWxmLCBtZXRob2QsIHVybCwgZmllbGRzPU5vbmUsIGhlYWRlcnM9Tm9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKip1cmxvcGVuX2t3KToKICAgICAgICAiIiIKICAgICAgICBNYWtlIGEgcmVxdWVzdCB1c2luZyA6bWV0aDpgdXJsb3BlbmAgd2l0aCB0aGUgYGBmaWVsZHNgYCBlbmNvZGVkIGluCiAgICAgICAgdGhlIHVybC4gVGhpcyBpcyB1c2VmdWwgZm9yIHJlcXVlc3QgbWV0aG9kcyBsaWtlIEdFVCwgSEVBRCwgREVMRVRFLCBldGMuCiAgICAgICAgIiIiCiAgICAgICAgaWYgaGVhZGVycyBpcyBOb25lOgogICAgICAgICAgICBoZWFkZXJzID0gc2VsZi5oZWFkZXJzCgogICAgICAgIGV4dHJhX2t3ID0geydoZWFkZXJzJzogaGVhZGVyc30KICAgICAgICBleHRyYV9rdy51cGRhdGUodXJsb3Blbl9rdykKCiAgICAgICAgaWYgZmllbGRzOgogICAgICAgICAgICB1cmwgKz0gJz8nICsgdXJsZW5jb2RlKGZpZWxkcykKCiAgICAgICAgcmV0dXJuIHNlbGYudXJsb3BlbihtZXRob2QsIHVybCwgKipleHRyYV9rdykKCiAgICBkZWYgcmVxdWVzdF9lbmNvZGVfYm9keShzZWxmLCBtZXRob2QsIHVybCwgZmllbGRzPU5vbmUsIGhlYWRlcnM9Tm9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZV9tdWx0aXBhcnQ9VHJ1ZSwgbXVsdGlwYXJ0X2JvdW5kYXJ5PU5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnVybG9wZW5fa3cpOgogICAgICAgICIiIgogICAgICAgIE1ha2UgYSByZXF1ZXN0IHVzaW5nIDptZXRoOmB1cmxvcGVuYCB3aXRoIHRoZSBgYGZpZWxkc2BgIGVuY29kZWQgaW4KICAgICAgICB0aGUgYm9keS4gVGhpcyBpcyB1c2VmdWwgZm9yIHJlcXVlc3QgbWV0aG9kcyBsaWtlIFBPU1QsIFBVVCwgUEFUQ0gsIGV0Yy4KCiAgICAgICAgV2hlbiBgYGVuY29kZV9tdWx0aXBhcnQ9VHJ1ZWBgIChkZWZhdWx0KSwgdGhlbgogICAgICAgIDptZXRoOmB1cmxsaWIzLmZpbGVwb3N0LmVuY29kZV9tdWx0aXBhcnRfZm9ybWRhdGFgIGlzIHVzZWQgdG8gZW5jb2RlCiAgICAgICAgdGhlIHBheWxvYWQgd2l0aCB0aGUgYXBwcm9wcmlhdGUgY29udGVudCB0eXBlLiBPdGhlcndpc2UKICAgICAgICA6bWV0aDpgdXJsbGliLnVybGVuY29kZWAgaXMgdXNlZCB3aXRoIHRoZQogICAgICAgICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnIGNvbnRlbnQgdHlwZS4KCiAgICAgICAgTXVsdGlwYXJ0IGVuY29kaW5nIG11c3QgYmUgdXNlZCB3aGVuIHBvc3RpbmcgZmlsZXMsIGFuZCBpdCdzIHJlYXNvbmFibHkKICAgICAgICBzYWZlIHRvIHVzZSBpdCBpbiBvdGhlciB0aW1lcyB0b28uIEhvd2V2ZXIsIGl0IG1heSBicmVhayByZXF1ZXN0CiAgICAgICAgc2lnbmluZywgc3VjaCBhcyB3aXRoIE9BdXRoLgoKICAgICAgICBTdXBwb3J0cyBhbiBvcHRpb25hbCBgYGZpZWxkc2BgIHBhcmFtZXRlciBvZiBrZXkvdmFsdWUgc3RyaW5ncyBBTkQKICAgICAgICBrZXkvZmlsZXR1cGxlLiBBIGZpbGV0dXBsZSBpcyBhIChmaWxlbmFtZSwgZGF0YSwgTUlNRSB0eXBlKSB0dXBsZSB3aGVyZQogICAgICAgIHRoZSBNSU1FIHR5cGUgaXMgb3B0aW9uYWwuIEZvciBleGFtcGxlOjoKCiAgICAgICAgICAgIGZpZWxkcyA9IHsKICAgICAgICAgICAgICAgICdmb28nOiAnYmFyJywKICAgICAgICAgICAgICAgICdmYWtlZmlsZSc6ICgnZm9vZmlsZS50eHQnLCAnY29udGVudHMgb2YgZm9vZmlsZScpLAogICAgICAgICAgICAgICAgJ3JlYWxmaWxlJzogKCdiYXJmaWxlLnR4dCcsIG9wZW4oJ3JlYWxmaWxlJykucmVhZCgpKSwKICAgICAgICAgICAgICAgICd0eXBlZGZpbGUnOiAoJ2JhemZpbGUuYmluJywgb3BlbignYmF6ZmlsZScpLnJlYWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ltYWdlL2pwZWcnKSwKICAgICAgICAgICAgICAgICdub25hbWVmaWxlJzogJ2NvbnRlbnRzIG9mIG5vbmFtZWZpbGUgZmllbGQnLAogICAgICAgICAgICB9CgogICAgICAgIFdoZW4gdXBsb2FkaW5nIGEgZmlsZSwgcHJvdmlkaW5nIGEgZmlsZW5hbWUgKHRoZSBmaXJzdCBwYXJhbWV0ZXIgb2YgdGhlCiAgICAgICAgdHVwbGUpIGlzIG9wdGlvbmFsIGJ1dCByZWNvbW1lbmRlZCB0byBiZXN0IG1pbWljayBiZWhhdmlvciBvZiBicm93c2Vycy4KCiAgICAgICAgTm90ZSB0aGF0IGlmIGBgaGVhZGVyc2BgIGFyZSBzdXBwbGllZCwgdGhlICdDb250ZW50LVR5cGUnIGhlYWRlciB3aWxsCiAgICAgICAgYmUgb3ZlcndyaXR0ZW4gYmVjYXVzZSBpdCBkZXBlbmRzIG9uIHRoZSBkeW5hbWljIHJhbmRvbSBib3VuZGFyeSBzdHJpbmcKICAgICAgICB3aGljaCBpcyB1c2VkIHRvIGNvbXBvc2UgdGhlIGJvZHkgb2YgdGhlIHJlcXVlc3QuIFRoZSByYW5kb20gYm91bmRhcnkKICAgICAgICBzdHJpbmcgY2FuIGJlIGV4cGxpY2l0bHkgc2V0IHdpdGggdGhlIGBgbXVsdGlwYXJ0X2JvdW5kYXJ5YGAgcGFyYW1ldGVyLgogICAgICAgICIiIgogICAgICAgIGlmIGhlYWRlcnMgaXMgTm9uZToKICAgICAgICAgICAgaGVhZGVycyA9IHNlbGYuaGVhZGVycwoKICAgICAgICBleHRyYV9rdyA9IHsnaGVhZGVycyc6IHt9fQoKICAgICAgICBpZiBmaWVsZHM6CiAgICAgICAgICAgIGlmICdib2R5JyBpbiB1cmxvcGVuX2t3OgogICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKAogICAgICAgICAgICAgICAgICAgICJyZXF1ZXN0IGdvdCB2YWx1ZXMgZm9yIGJvdGggJ2ZpZWxkcycgYW5kICdib2R5JywgY2FuIG9ubHkgc3BlY2lmeSBvbmUuIikKCiAgICAgICAgICAgIGlmIGVuY29kZV9tdWx0aXBhcnQ6CiAgICAgICAgICAgICAgICBib2R5LCBjb250ZW50X3R5cGUgPSBlbmNvZGVfbXVsdGlwYXJ0X2Zvcm1kYXRhKGZpZWxkcywgYm91bmRhcnk9bXVsdGlwYXJ0X2JvdW5kYXJ5KQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgYm9keSwgY29udGVudF90eXBlID0gdXJsZW5jb2RlKGZpZWxkcyksICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnCgogICAgICAgICAgICBleHRyYV9rd1snYm9keSddID0gYm9keQogICAgICAgICAgICBleHRyYV9rd1snaGVhZGVycyddID0geydDb250ZW50LVR5cGUnOiBjb250ZW50X3R5cGV9CgogICAgICAgIGV4dHJhX2t3WydoZWFkZXJzJ10udXBkYXRlKGhlYWRlcnMpCiAgICAgICAgZXh0cmFfa3cudXBkYXRlKHVybG9wZW5fa3cpCgogICAgICAgIHJldHVybiBzZWxmLnVybG9wZW4obWV0aG9kLCB1cmwsICoqZXh0cmFfa3cpClBLAwQUAAAAAAAAACEAP0qCYXdZAAB3WQAALwAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3Jlc3BvbnNlLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKZnJvbSBjb250ZXh0bGliIGltcG9ydCBjb250ZXh0bWFuYWdlcgppbXBvcnQgemxpYgppbXBvcnQgaW8KaW1wb3J0IGxvZ2dpbmcKZnJvbSBzb2NrZXQgaW1wb3J0IHRpbWVvdXQgYXMgU29ja2V0VGltZW91dApmcm9tIHNvY2tldCBpbXBvcnQgZXJyb3IgYXMgU29ja2V0RXJyb3IKCmZyb20gLl9jb2xsZWN0aW9ucyBpbXBvcnQgSFRUUEhlYWRlckRpY3QKZnJvbSAuZXhjZXB0aW9ucyBpbXBvcnQgKAogICAgQm9keU5vdEh0dHBsaWJDb21wYXRpYmxlLCBQcm90b2NvbEVycm9yLCBEZWNvZGVFcnJvciwgUmVhZFRpbWVvdXRFcnJvciwKICAgIFJlc3BvbnNlTm90Q2h1bmtlZCwgSW5jb21wbGV0ZVJlYWQsIEludmFsaWRIZWFkZXIKKQpmcm9tIC5wYWNrYWdlcy5zaXggaW1wb3J0IHN0cmluZ190eXBlcyBhcyBiYXNlc3RyaW5nLCBiaW5hcnlfdHlwZSwgUFkzCmZyb20gLnBhY2thZ2VzLnNpeC5tb3ZlcyBpbXBvcnQgaHR0cF9jbGllbnQgYXMgaHR0cGxpYgpmcm9tIC5jb25uZWN0aW9uIGltcG9ydCBIVFRQRXhjZXB0aW9uLCBCYXNlU1NMRXJyb3IKZnJvbSAudXRpbC5yZXNwb25zZSBpbXBvcnQgaXNfZnBfY2xvc2VkLCBpc19yZXNwb25zZV90b19oZWFkCgpsb2cgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgpjbGFzcyBEZWZsYXRlRGVjb2RlcihvYmplY3QpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLl9maXJzdF90cnkgPSBUcnVlCiAgICAgICAgc2VsZi5fZGF0YSA9IGJpbmFyeV90eXBlKCkKICAgICAgICBzZWxmLl9vYmogPSB6bGliLmRlY29tcHJlc3NvYmooKQoKICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLl9vYmosIG5hbWUpCgogICAgZGVmIGRlY29tcHJlc3Moc2VsZiwgZGF0YSk6CiAgICAgICAgaWYgbm90IGRhdGE6CiAgICAgICAgICAgIHJldHVybiBkYXRhCgogICAgICAgIGlmIG5vdCBzZWxmLl9maXJzdF90cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9vYmouZGVjb21wcmVzcyhkYXRhKQoKICAgICAgICBzZWxmLl9kYXRhICs9IGRhdGEKICAgICAgICB0cnk6CiAgICAgICAgICAgIGRlY29tcHJlc3NlZCA9IHNlbGYuX29iai5kZWNvbXByZXNzKGRhdGEpCiAgICAgICAgICAgIGlmIGRlY29tcHJlc3NlZDoKICAgICAgICAgICAgICAgIHNlbGYuX2ZpcnN0X3RyeSA9IEZhbHNlCiAgICAgICAgICAgICAgICBzZWxmLl9kYXRhID0gTm9uZQogICAgICAgICAgICByZXR1cm4gZGVjb21wcmVzc2VkCiAgICAgICAgZXhjZXB0IHpsaWIuZXJyb3I6CiAgICAgICAgICAgIHNlbGYuX2ZpcnN0X3RyeSA9IEZhbHNlCiAgICAgICAgICAgIHNlbGYuX29iaiA9IHpsaWIuZGVjb21wcmVzc29iaigtemxpYi5NQVhfV0JJVFMpCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmRlY29tcHJlc3Moc2VsZi5fZGF0YSkKICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgIHNlbGYuX2RhdGEgPSBOb25lCgoKY2xhc3MgR3ppcERlY29kZXIob2JqZWN0KToKCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc2VsZi5fb2JqID0gemxpYi5kZWNvbXByZXNzb2JqKDE2ICsgemxpYi5NQVhfV0JJVFMpCgogICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgogICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYuX29iaiwgbmFtZSkKCiAgICBkZWYgZGVjb21wcmVzcyhzZWxmLCBkYXRhKToKICAgICAgICBpZiBub3QgZGF0YToKICAgICAgICAgICAgcmV0dXJuIGRhdGEKICAgICAgICByZXR1cm4gc2VsZi5fb2JqLmRlY29tcHJlc3MoZGF0YSkKCgpkZWYgX2dldF9kZWNvZGVyKG1vZGUpOgogICAgaWYgbW9kZSA9PSAnZ3ppcCc6CiAgICAgICAgcmV0dXJuIEd6aXBEZWNvZGVyKCkKCiAgICByZXR1cm4gRGVmbGF0ZURlY29kZXIoKQoKCmNsYXNzIEhUVFBSZXNwb25zZShpby5JT0Jhc2UpOgogICAgIiIiCiAgICBIVFRQIFJlc3BvbnNlIGNvbnRhaW5lci4KCiAgICBCYWNrd2FyZHMtY29tcGF0aWJsZSB0byBodHRwbGliJ3MgSFRUUFJlc3BvbnNlIGJ1dCB0aGUgcmVzcG9uc2UgYGBib2R5YGAgaXMKICAgIGxvYWRlZCBhbmQgZGVjb2RlZCBvbi1kZW1hbmQgd2hlbiB0aGUgYGBkYXRhYGAgcHJvcGVydHkgaXMgYWNjZXNzZWQuICBUaGlzCiAgICBjbGFzcyBpcyBhbHNvIGNvbXBhdGlibGUgd2l0aCB0aGUgUHl0aG9uIHN0YW5kYXJkIGxpYnJhcnkncyA6bW9kOmBpb2AKICAgIG1vZHVsZSwgYW5kIGNhbiBoZW5jZSBiZSB0cmVhdGVkIGFzIGEgcmVhZGFibGUgb2JqZWN0IGluIHRoZSBjb250ZXh0IG9mIHRoYXQKICAgIGZyYW1ld29yay4KCiAgICBFeHRyYSBwYXJhbWV0ZXJzIGZvciBiZWhhdmlvdXIgbm90IHByZXNlbnQgaW4gaHR0cGxpYi5IVFRQUmVzcG9uc2U6CgogICAgOnBhcmFtIHByZWxvYWRfY29udGVudDoKICAgICAgICBJZiBUcnVlLCB0aGUgcmVzcG9uc2UncyBib2R5IHdpbGwgYmUgcHJlbG9hZGVkIGR1cmluZyBjb25zdHJ1Y3Rpb24uCgogICAgOnBhcmFtIGRlY29kZV9jb250ZW50OgogICAgICAgIElmIFRydWUsIGF0dGVtcHRzIHRvIGRlY29kZSBzcGVjaWZpYyBjb250ZW50LWVuY29kaW5nJ3MgYmFzZWQgb24gaGVhZGVycwogICAgICAgIChsaWtlICdnemlwJyBhbmQgJ2RlZmxhdGUnKSB3aWxsIGJlIHNraXBwZWQgYW5kIHJhdyBkYXRhIHdpbGwgYmUgdXNlZAogICAgICAgIGluc3RlYWQuCgogICAgOnBhcmFtIG9yaWdpbmFsX3Jlc3BvbnNlOgogICAgICAgIFdoZW4gdGhpcyBIVFRQUmVzcG9uc2Ugd3JhcHBlciBpcyBnZW5lcmF0ZWQgZnJvbSBhbiBodHRwbGliLkhUVFBSZXNwb25zZQogICAgICAgIG9iamVjdCwgaXQncyBjb252ZW5pZW50IHRvIGluY2x1ZGUgdGhlIG9yaWdpbmFsIGZvciBkZWJ1ZyBwdXJwb3Nlcy4gSXQncwogICAgICAgIG90aGVyd2lzZSB1bnVzZWQuCgogICAgOnBhcmFtIHJldHJpZXM6CiAgICAgICAgVGhlIHJldHJpZXMgY29udGFpbnMgdGhlIGxhc3QgOmNsYXNzOmB+dXJsbGliMy51dGlsLnJldHJ5LlJldHJ5YCB0aGF0CiAgICAgICAgd2FzIHVzZWQgZHVyaW5nIHRoZSByZXF1ZXN0LgoKICAgIDpwYXJhbSBlbmZvcmNlX2NvbnRlbnRfbGVuZ3RoOgogICAgICAgIEVuZm9yY2UgY29udGVudCBsZW5ndGggY2hlY2tpbmcuIEJvZHkgcmV0dXJuZWQgYnkgc2VydmVyIG11c3QgbWF0Y2gKICAgICAgICB2YWx1ZSBvZiBDb250ZW50LUxlbmd0aCBoZWFkZXIsIGlmIHByZXNlbnQuIE90aGVyd2lzZSwgcmFpc2UgZXJyb3IuCiAgICAiIiIKCiAgICBDT05URU5UX0RFQ09ERVJTID0gWydnemlwJywgJ2RlZmxhdGUnXQogICAgUkVESVJFQ1RfU1RBVFVTRVMgPSBbMzAxLCAzMDIsIDMwMywgMzA3LCAzMDhdCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGJvZHk9JycsIGhlYWRlcnM9Tm9uZSwgc3RhdHVzPTAsIHZlcnNpb249MCwgcmVhc29uPU5vbmUsCiAgICAgICAgICAgICAgICAgc3RyaWN0PTAsIHByZWxvYWRfY29udGVudD1UcnVlLCBkZWNvZGVfY29udGVudD1UcnVlLAogICAgICAgICAgICAgICAgIG9yaWdpbmFsX3Jlc3BvbnNlPU5vbmUsIHBvb2w9Tm9uZSwgY29ubmVjdGlvbj1Ob25lLAogICAgICAgICAgICAgICAgIHJldHJpZXM9Tm9uZSwgZW5mb3JjZV9jb250ZW50X2xlbmd0aD1GYWxzZSwgcmVxdWVzdF9tZXRob2Q9Tm9uZSk6CgogICAgICAgIGlmIGlzaW5zdGFuY2UoaGVhZGVycywgSFRUUEhlYWRlckRpY3QpOgogICAgICAgICAgICBzZWxmLmhlYWRlcnMgPSBoZWFkZXJzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5oZWFkZXJzID0gSFRUUEhlYWRlckRpY3QoaGVhZGVycykKICAgICAgICBzZWxmLnN0YXR1cyA9IHN0YXR1cwogICAgICAgIHNlbGYudmVyc2lvbiA9IHZlcnNpb24KICAgICAgICBzZWxmLnJlYXNvbiA9IHJlYXNvbgogICAgICAgIHNlbGYuc3RyaWN0ID0gc3RyaWN0CiAgICAgICAgc2VsZi5kZWNvZGVfY29udGVudCA9IGRlY29kZV9jb250ZW50CiAgICAgICAgc2VsZi5yZXRyaWVzID0gcmV0cmllcwogICAgICAgIHNlbGYuZW5mb3JjZV9jb250ZW50X2xlbmd0aCA9IGVuZm9yY2VfY29udGVudF9sZW5ndGgKCiAgICAgICAgc2VsZi5fZGVjb2RlciA9IE5vbmUKICAgICAgICBzZWxmLl9ib2R5ID0gTm9uZQogICAgICAgIHNlbGYuX2ZwID0gTm9uZQogICAgICAgIHNlbGYuX29yaWdpbmFsX3Jlc3BvbnNlID0gb3JpZ2luYWxfcmVzcG9uc2UKICAgICAgICBzZWxmLl9mcF9ieXRlc19yZWFkID0gMAoKICAgICAgICBpZiBib2R5IGFuZCBpc2luc3RhbmNlKGJvZHksIChiYXNlc3RyaW5nLCBiaW5hcnlfdHlwZSkpOgogICAgICAgICAgICBzZWxmLl9ib2R5ID0gYm9keQoKICAgICAgICBzZWxmLl9wb29sID0gcG9vbAogICAgICAgIHNlbGYuX2Nvbm5lY3Rpb24gPSBjb25uZWN0aW9uCgogICAgICAgIGlmIGhhc2F0dHIoYm9keSwgJ3JlYWQnKToKICAgICAgICAgICAgc2VsZi5fZnAgPSBib2R5CgogICAgICAgICMgQXJlIHdlIHVzaW5nIHRoZSBjaHVua2VkLXN0eWxlIG9mIHRyYW5zZmVyIGVuY29kaW5nPwogICAgICAgIHNlbGYuY2h1bmtlZCA9IEZhbHNlCiAgICAgICAgc2VsZi5jaHVua19sZWZ0ID0gTm9uZQogICAgICAgIHRyX2VuYyA9IHNlbGYuaGVhZGVycy5nZXQoJ3RyYW5zZmVyLWVuY29kaW5nJywgJycpLmxvd2VyKCkKICAgICAgICAjIERvbid0IGluY3VyIHRoZSBwZW5hbHR5IG9mIGNyZWF0aW5nIGEgbGlzdCBhbmQgdGhlbiBkaXNjYXJkaW5nIGl0CiAgICAgICAgZW5jb2RpbmdzID0gKGVuYy5zdHJpcCgpIGZvciBlbmMgaW4gdHJfZW5jLnNwbGl0KCIsIikpCiAgICAgICAgaWYgImNodW5rZWQiIGluIGVuY29kaW5nczoKICAgICAgICAgICAgc2VsZi5jaHVua2VkID0gVHJ1ZQoKICAgICAgICAjIERldGVybWluZSBsZW5ndGggb2YgcmVzcG9uc2UKICAgICAgICBzZWxmLmxlbmd0aF9yZW1haW5pbmcgPSBzZWxmLl9pbml0X2xlbmd0aChyZXF1ZXN0X21ldGhvZCkKCiAgICAgICAgIyBJZiByZXF1ZXN0ZWQsIHByZWxvYWQgdGhlIGJvZHkuCiAgICAgICAgaWYgcHJlbG9hZF9jb250ZW50IGFuZCBub3Qgc2VsZi5fYm9keToKICAgICAgICAgICAgc2VsZi5fYm9keSA9IHNlbGYucmVhZChkZWNvZGVfY29udGVudD1kZWNvZGVfY29udGVudCkKCiAgICBkZWYgZ2V0X3JlZGlyZWN0X2xvY2F0aW9uKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFNob3VsZCB3ZSByZWRpcmVjdCBhbmQgd2hlcmUgdG8/CgogICAgICAgIDpyZXR1cm5zOiBUcnV0aHkgcmVkaXJlY3QgbG9jYXRpb24gc3RyaW5nIGlmIHdlIGdvdCBhIHJlZGlyZWN0IHN0YXR1cwogICAgICAgICAgICBjb2RlIGFuZCB2YWxpZCBsb2NhdGlvbi4gYGBOb25lYGAgaWYgcmVkaXJlY3Qgc3RhdHVzIGFuZCBubwogICAgICAgICAgICBsb2NhdGlvbi4gYGBGYWxzZWBgIGlmIG5vdCBhIHJlZGlyZWN0IHN0YXR1cyBjb2RlLgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuc3RhdHVzIGluIHNlbGYuUkVESVJFQ1RfU1RBVFVTRVM6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmhlYWRlcnMuZ2V0KCdsb2NhdGlvbicpCgogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiByZWxlYXNlX2Nvbm4oc2VsZik6CiAgICAgICAgaWYgbm90IHNlbGYuX3Bvb2wgb3Igbm90IHNlbGYuX2Nvbm5lY3Rpb246CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBzZWxmLl9wb29sLl9wdXRfY29ubihzZWxmLl9jb25uZWN0aW9uKQogICAgICAgIHNlbGYuX2Nvbm5lY3Rpb24gPSBOb25lCgogICAgQHByb3BlcnR5CiAgICBkZWYgZGF0YShzZWxmKToKICAgICAgICAjIEZvciBiYWNrd29yZHMtY29tcGF0IHdpdGggZWFybGllciB1cmxsaWIzIDAuNCBhbmQgZWFybGllci4KICAgICAgICBpZiBzZWxmLl9ib2R5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5fYm9keQoKICAgICAgICBpZiBzZWxmLl9mcDoKICAgICAgICAgICAgcmV0dXJuIHNlbGYucmVhZChjYWNoZV9jb250ZW50PVRydWUpCgogICAgQHByb3BlcnR5CiAgICBkZWYgY29ubmVjdGlvbihzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fY29ubmVjdGlvbgoKICAgIGRlZiB0ZWxsKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE9idGFpbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHB1bGxlZCBvdmVyIHRoZSB3aXJlIHNvIGZhci4gTWF5IGRpZmZlciBmcm9tCiAgICAgICAgdGhlIGFtb3VudCBvZiBjb250ZW50IHJldHVybmVkIGJ5IDptZXRoOmBgSFRUUFJlc3BvbnNlLnJlYWRgYCBpZiBieXRlcwogICAgICAgIGFyZSBlbmNvZGVkIG9uIHRoZSB3aXJlIChlLmcsIGNvbXByZXNzZWQpLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBzZWxmLl9mcF9ieXRlc19yZWFkCgogICAgZGVmIF9pbml0X2xlbmd0aChzZWxmLCByZXF1ZXN0X21ldGhvZCk6CiAgICAgICAgIiIiCiAgICAgICAgU2V0IGluaXRpYWwgbGVuZ3RoIHZhbHVlIGZvciBSZXNwb25zZSBjb250ZW50IGlmIGF2YWlsYWJsZS4KICAgICAgICAiIiIKICAgICAgICBsZW5ndGggPSBzZWxmLmhlYWRlcnMuZ2V0KCdjb250ZW50LWxlbmd0aCcpCgogICAgICAgIGlmIGxlbmd0aCBpcyBub3QgTm9uZSBhbmQgc2VsZi5jaHVua2VkOgogICAgICAgICAgICAjIFRoaXMgUmVzcG9uc2Ugd2lsbCBmYWlsIHdpdGggYW4gSW5jb21wbGV0ZVJlYWQgaWYgaXQgY2FuJ3QgYmUKICAgICAgICAgICAgIyByZWNlaXZlZCBhcyBjaHVua2VkLiBUaGlzIG1ldGhvZCBmYWxscyBiYWNrIHRvIGF0dGVtcHQgcmVhZGluZwogICAgICAgICAgICAjIHRoZSByZXNwb25zZSBiZWZvcmUgcmFpc2luZyBhbiBleGNlcHRpb24uCiAgICAgICAgICAgIGxvZy53YXJuaW5nKCJSZWNlaXZlZCByZXNwb25zZSB3aXRoIGJvdGggQ29udGVudC1MZW5ndGggYW5kICIKICAgICAgICAgICAgICAgICAgICAgICAgIlRyYW5zZmVyLUVuY29kaW5nIHNldC4gVGhpcyBpcyBleHByZXNzbHkgZm9yYmlkZGVuICIKICAgICAgICAgICAgICAgICAgICAgICAgImJ5IFJGQyA3MjMwIHNlYyAzLjMuMi4gSWdub3JpbmcgQ29udGVudC1MZW5ndGggYW5kICIKICAgICAgICAgICAgICAgICAgICAgICAgImF0dGVtcHRpbmcgdG8gcHJvY2VzcyByZXNwb25zZSBhcyBUcmFuc2Zlci1FbmNvZGluZzogIgogICAgICAgICAgICAgICAgICAgICAgICAiY2h1bmtlZC4iKQogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICBlbGlmIGxlbmd0aCBpcyBub3QgTm9uZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIyBSRkMgNzIzMCBzZWN0aW9uIDMuMy4yIHNwZWNpZmllcyBtdWx0aXBsZSBjb250ZW50IGxlbmd0aHMgY2FuCiAgICAgICAgICAgICAgICAjIGJlIHNlbnQgaW4gYSBzaW5nbGUgQ29udGVudC1MZW5ndGggaGVhZGVyCiAgICAgICAgICAgICAgICAjIChlLmcuIENvbnRlbnQtTGVuZ3RoOiA0MiwgNDIpLiBUaGlzIGxpbmUgZW5zdXJlcyB0aGUgdmFsdWVzCiAgICAgICAgICAgICAgICAjIGFyZSBhbGwgdmFsaWQgaW50cyBhbmQgdGhhdCBhcyBsb25nIGFzIHRoZSBgc2V0YCBsZW5ndGggaXMgMSwKICAgICAgICAgICAgICAgICMgYWxsIHZhbHVlcyBhcmUgdGhlIHNhbWUuIE90aGVyd2lzZSwgdGhlIGhlYWRlciBpcyBpbnZhbGlkLgogICAgICAgICAgICAgICAgbGVuZ3RocyA9IHNldChbaW50KHZhbCkgZm9yIHZhbCBpbiBsZW5ndGguc3BsaXQoJywnKV0pCiAgICAgICAgICAgICAgICBpZiBsZW4obGVuZ3RocykgPiAxOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIEludmFsaWRIZWFkZXIoIkNvbnRlbnQtTGVuZ3RoIGNvbnRhaW5lZCBtdWx0aXBsZSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5tYXRjaGluZyB2YWx1ZXMgKCVzKSIgJSBsZW5ndGgpCiAgICAgICAgICAgICAgICBsZW5ndGggPSBsZW5ndGhzLnBvcCgpCiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgbGVuZ3RoID0gTm9uZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaWYgbGVuZ3RoIDwgMDoKICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBOb25lCgogICAgICAgICMgQ29udmVydCBzdGF0dXMgdG8gaW50IGZvciBjb21wYXJpc29uCiAgICAgICAgIyBJbiBzb21lIGNhc2VzLCBodHRwbGliIHJldHVybnMgYSBzdGF0dXMgb2YgIl9VTktOT1dOIgogICAgICAgIHRyeToKICAgICAgICAgICAgc3RhdHVzID0gaW50KHNlbGYuc3RhdHVzKQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICBzdGF0dXMgPSAwCgogICAgICAgICMgQ2hlY2sgZm9yIHJlc3BvbnNlcyB0aGF0IHNob3VsZG4ndCBpbmNsdWRlIGEgYm9keQogICAgICAgIGlmIHN0YXR1cyBpbiAoMjA0LCAzMDQpIG9yIDEwMCA8PSBzdGF0dXMgPCAyMDAgb3IgcmVxdWVzdF9tZXRob2QgPT0gJ0hFQUQnOgogICAgICAgICAgICBsZW5ndGggPSAwCgogICAgICAgIHJldHVybiBsZW5ndGgKCiAgICBkZWYgX2luaXRfZGVjb2RlcihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBTZXQtdXAgdGhlIF9kZWNvZGVyIGF0dHJpYnV0ZSBpZiBuZWNlc3NhcnkuCiAgICAgICAgIiIiCiAgICAgICAgIyBOb3RlOiBjb250ZW50LWVuY29kaW5nIHZhbHVlIHNob3VsZCBiZSBjYXNlLWluc2Vuc2l0aXZlLCBwZXIgUkZDIDcyMzAKICAgICAgICAjIFNlY3Rpb24gMy4yCiAgICAgICAgY29udGVudF9lbmNvZGluZyA9IHNlbGYuaGVhZGVycy5nZXQoJ2NvbnRlbnQtZW5jb2RpbmcnLCAnJykubG93ZXIoKQogICAgICAgIGlmIHNlbGYuX2RlY29kZXIgaXMgTm9uZSBhbmQgY29udGVudF9lbmNvZGluZyBpbiBzZWxmLkNPTlRFTlRfREVDT0RFUlM6CiAgICAgICAgICAgIHNlbGYuX2RlY29kZXIgPSBfZ2V0X2RlY29kZXIoY29udGVudF9lbmNvZGluZykKCiAgICBkZWYgX2RlY29kZShzZWxmLCBkYXRhLCBkZWNvZGVfY29udGVudCwgZmx1c2hfZGVjb2Rlcik6CiAgICAgICAgIiIiCiAgICAgICAgRGVjb2RlIHRoZSBkYXRhIHBhc3NlZCBpbiBhbmQgcG90ZW50aWFsbHkgZmx1c2ggdGhlIGRlY29kZXIuCiAgICAgICAgIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICBpZiBkZWNvZGVfY29udGVudCBhbmQgc2VsZi5fZGVjb2RlcjoKICAgICAgICAgICAgICAgIGRhdGEgPSBzZWxmLl9kZWNvZGVyLmRlY29tcHJlc3MoZGF0YSkKICAgICAgICBleGNlcHQgKElPRXJyb3IsIHpsaWIuZXJyb3IpIGFzIGU6CiAgICAgICAgICAgIGNvbnRlbnRfZW5jb2RpbmcgPSBzZWxmLmhlYWRlcnMuZ2V0KCdjb250ZW50LWVuY29kaW5nJywgJycpLmxvd2VyKCkKICAgICAgICAgICAgcmFpc2UgRGVjb2RlRXJyb3IoCiAgICAgICAgICAgICAgICAiUmVjZWl2ZWQgcmVzcG9uc2Ugd2l0aCBjb250ZW50LWVuY29kaW5nOiAlcywgYnV0ICIKICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gZGVjb2RlIGl0LiIgJSBjb250ZW50X2VuY29kaW5nLCBlKQoKICAgICAgICBpZiBmbHVzaF9kZWNvZGVyIGFuZCBkZWNvZGVfY29udGVudDoKICAgICAgICAgICAgZGF0YSArPSBzZWxmLl9mbHVzaF9kZWNvZGVyKCkKCiAgICAgICAgcmV0dXJuIGRhdGEKCiAgICBkZWYgX2ZsdXNoX2RlY29kZXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgRmx1c2hlcyB0aGUgZGVjb2Rlci4gU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIHRoZSBkZWNvZGVyIGlzIGFjdHVhbGx5CiAgICAgICAgYmVpbmcgdXNlZC4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLl9kZWNvZGVyOgogICAgICAgICAgICBidWYgPSBzZWxmLl9kZWNvZGVyLmRlY29tcHJlc3MoYicnKQogICAgICAgICAgICByZXR1cm4gYnVmICsgc2VsZi5fZGVjb2Rlci5mbHVzaCgpCgogICAgICAgIHJldHVybiBiJycKCiAgICBAY29udGV4dG1hbmFnZXIKICAgIGRlZiBfZXJyb3JfY2F0Y2hlcihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBDYXRjaCBsb3ctbGV2ZWwgcHl0aG9uIGV4Y2VwdGlvbnMsIGluc3RlYWQgcmUtcmFpc2luZyB1cmxsaWIzCiAgICAgICAgdmFyaWFudHMsIHNvIHRoYXQgbG93LWxldmVsIGV4Y2VwdGlvbnMgYXJlIG5vdCBsZWFrZWQgaW4gdGhlCiAgICAgICAgaGlnaC1sZXZlbCBhcGkuCgogICAgICAgIE9uIGV4aXQsIHJlbGVhc2UgdGhlIGNvbm5lY3Rpb24gYmFjayB0byB0aGUgcG9vbC4KICAgICAgICAiIiIKICAgICAgICBjbGVhbl9leGl0ID0gRmFsc2UKCiAgICAgICAgdHJ5OgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICB5aWVsZAoKICAgICAgICAgICAgZXhjZXB0IFNvY2tldFRpbWVvdXQ6CiAgICAgICAgICAgICAgICAjIEZJWE1FOiBJZGVhbGx5IHdlJ2QgbGlrZSB0byBpbmNsdWRlIHRoZSB1cmwgaW4gdGhlIFJlYWRUaW1lb3V0RXJyb3IgYnV0CiAgICAgICAgICAgICAgICAjIHRoZXJlIGlzIHlldCBubyBjbGVhbiB3YXkgdG8gZ2V0IGF0IGl0IGZyb20gdGhpcyBjb250ZXh0LgogICAgICAgICAgICAgICAgcmFpc2UgUmVhZFRpbWVvdXRFcnJvcihzZWxmLl9wb29sLCBOb25lLCAnUmVhZCB0aW1lZCBvdXQuJykKCiAgICAgICAgICAgIGV4Y2VwdCBCYXNlU1NMRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgICMgRklYTUU6IElzIHRoZXJlIGEgYmV0dGVyIHdheSB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gU1NMRXJyb3JzPwogICAgICAgICAgICAgICAgaWYgJ3JlYWQgb3BlcmF0aW9uIHRpbWVkIG91dCcgbm90IGluIHN0cihlKTogICMgRGVmZW5zaXZlOgogICAgICAgICAgICAgICAgICAgICMgVGhpcyBzaG91bGRuJ3QgaGFwcGVuIGJ1dCBqdXN0IGluIGNhc2Ugd2UncmUgbWlzc2luZyBhbiBlZGdlCiAgICAgICAgICAgICAgICAgICAgIyBjYXNlLCBsZXQncyBhdm9pZCBzd2FsbG93aW5nIFNTTCBlcnJvcnMuCiAgICAgICAgICAgICAgICAgICAgcmFpc2UKCiAgICAgICAgICAgICAgICByYWlzZSBSZWFkVGltZW91dEVycm9yKHNlbGYuX3Bvb2wsIE5vbmUsICdSZWFkIHRpbWVkIG91dC4nKQoKICAgICAgICAgICAgZXhjZXB0IChIVFRQRXhjZXB0aW9uLCBTb2NrZXRFcnJvcikgYXMgZToKICAgICAgICAgICAgICAgICMgVGhpcyBpbmNsdWRlcyBJbmNvbXBsZXRlUmVhZC4KICAgICAgICAgICAgICAgIHJhaXNlIFByb3RvY29sRXJyb3IoJ0Nvbm5lY3Rpb24gYnJva2VuOiAlcicgJSBlLCBlKQoKICAgICAgICAgICAgIyBJZiBubyBleGNlcHRpb24gaXMgdGhyb3duLCB3ZSBzaG91bGQgYXZvaWQgY2xlYW5pbmcgdXAKICAgICAgICAgICAgIyB1bm5lY2Vzc2FyaWx5LgogICAgICAgICAgICBjbGVhbl9leGl0ID0gVHJ1ZQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICMgSWYgd2UgZGlkbid0IHRlcm1pbmF0ZSBjbGVhbmx5LCB3ZSBuZWVkIHRvIHRocm93IGF3YXkgb3VyCiAgICAgICAgICAgICMgY29ubmVjdGlvbi4KICAgICAgICAgICAgaWYgbm90IGNsZWFuX2V4aXQ6CiAgICAgICAgICAgICAgICAjIFRoZSByZXNwb25zZSBtYXkgbm90IGJlIGNsb3NlZCBidXQgd2UncmUgbm90IGdvaW5nIHRvIHVzZSBpdAogICAgICAgICAgICAgICAgIyBhbnltb3JlIHNvIGNsb3NlIGl0IG5vdyB0byBlbnN1cmUgdGhhdCB0aGUgY29ubmVjdGlvbiBpcwogICAgICAgICAgICAgICAgIyByZWxlYXNlZCBiYWNrIHRvIHRoZSBwb29sLgogICAgICAgICAgICAgICAgaWYgc2VsZi5fb3JpZ2luYWxfcmVzcG9uc2U6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fb3JpZ2luYWxfcmVzcG9uc2UuY2xvc2UoKQoKICAgICAgICAgICAgICAgICMgQ2xvc2luZyB0aGUgcmVzcG9uc2UgbWF5IG5vdCBhY3R1YWxseSBiZSBzdWZmaWNpZW50IHRvIGNsb3NlCiAgICAgICAgICAgICAgICAjIGV2ZXJ5dGhpbmcsIHNvIGlmIHdlIGhhdmUgYSBob2xkIG9mIHRoZSBjb25uZWN0aW9uIGNsb3NlIHRoYXQKICAgICAgICAgICAgICAgICMgdG9vLgogICAgICAgICAgICAgICAgaWYgc2VsZi5fY29ubmVjdGlvbjoKICAgICAgICAgICAgICAgICAgICBzZWxmLl9jb25uZWN0aW9uLmNsb3NlKCkKCiAgICAgICAgICAgICMgSWYgd2UgaG9sZCB0aGUgb3JpZ2luYWwgcmVzcG9uc2UgYnV0IGl0J3MgY2xvc2VkIG5vdywgd2Ugc2hvdWxkCiAgICAgICAgICAgICMgcmV0dXJuIHRoZSBjb25uZWN0aW9uIGJhY2sgdG8gdGhlIHBvb2wuCiAgICAgICAgICAgIGlmIHNlbGYuX29yaWdpbmFsX3Jlc3BvbnNlIGFuZCBzZWxmLl9vcmlnaW5hbF9yZXNwb25zZS5pc2Nsb3NlZCgpOgogICAgICAgICAgICAgICAgc2VsZi5yZWxlYXNlX2Nvbm4oKQoKICAgIGRlZiByZWFkKHNlbGYsIGFtdD1Ob25lLCBkZWNvZGVfY29udGVudD1Ob25lLCBjYWNoZV9jb250ZW50PUZhbHNlKToKICAgICAgICAiIiIKICAgICAgICBTaW1pbGFyIHRvIDptZXRoOmBodHRwbGliLkhUVFBSZXNwb25zZS5yZWFkYCwgYnV0IHdpdGggdHdvIGFkZGl0aW9uYWwKICAgICAgICBwYXJhbWV0ZXJzOiBgYGRlY29kZV9jb250ZW50YGAgYW5kIGBgY2FjaGVfY29udGVudGBgLgoKICAgICAgICA6cGFyYW0gYW10OgogICAgICAgICAgICBIb3cgbXVjaCBvZiB0aGUgY29udGVudCB0byByZWFkLiBJZiBzcGVjaWZpZWQsIGNhY2hpbmcgaXMgc2tpcHBlZAogICAgICAgICAgICBiZWNhdXNlIGl0IGRvZXNuJ3QgbWFrZSBzZW5zZSB0byBjYWNoZSBwYXJ0aWFsIGNvbnRlbnQgYXMgdGhlIGZ1bGwKICAgICAgICAgICAgcmVzcG9uc2UuCgogICAgICAgIDpwYXJhbSBkZWNvZGVfY29udGVudDoKICAgICAgICAgICAgSWYgVHJ1ZSwgd2lsbCBhdHRlbXB0IHRvIGRlY29kZSB0aGUgYm9keSBiYXNlZCBvbiB0aGUKICAgICAgICAgICAgJ2NvbnRlbnQtZW5jb2RpbmcnIGhlYWRlci4KCiAgICAgICAgOnBhcmFtIGNhY2hlX2NvbnRlbnQ6CiAgICAgICAgICAgIElmIFRydWUsIHdpbGwgc2F2ZSB0aGUgcmV0dXJuZWQgZGF0YSBzdWNoIHRoYXQgdGhlIHNhbWUgcmVzdWx0IGlzCiAgICAgICAgICAgIHJldHVybmVkIGRlc3BpdGUgb2YgdGhlIHN0YXRlIG9mIHRoZSB1bmRlcmx5aW5nIGZpbGUgb2JqZWN0LiBUaGlzCiAgICAgICAgICAgIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0aGUgYGAuZGF0YWBgIHByb3BlcnR5IHRvIGNvbnRpbnVlIHdvcmtpbmcKICAgICAgICAgICAgYWZ0ZXIgaGF2aW5nIGBgLnJlYWQoKWBgIHRoZSBmaWxlIG9iamVjdC4gKE92ZXJyaWRkZW4gaWYgYGBhbXRgYCBpcwogICAgICAgICAgICBzZXQuKQogICAgICAgICIiIgogICAgICAgIHNlbGYuX2luaXRfZGVjb2RlcigpCiAgICAgICAgaWYgZGVjb2RlX2NvbnRlbnQgaXMgTm9uZToKICAgICAgICAgICAgZGVjb2RlX2NvbnRlbnQgPSBzZWxmLmRlY29kZV9jb250ZW50CgogICAgICAgIGlmIHNlbGYuX2ZwIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBmbHVzaF9kZWNvZGVyID0gRmFsc2UKICAgICAgICBkYXRhID0gTm9uZQoKICAgICAgICB3aXRoIHNlbGYuX2Vycm9yX2NhdGNoZXIoKToKICAgICAgICAgICAgaWYgYW10IGlzIE5vbmU6CiAgICAgICAgICAgICAgICAjIGNTdHJpbmdJTyBkb2Vzbid0IGxpa2UgYW10PU5vbmUKICAgICAgICAgICAgICAgIGRhdGEgPSBzZWxmLl9mcC5yZWFkKCkKICAgICAgICAgICAgICAgIGZsdXNoX2RlY29kZXIgPSBUcnVlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBjYWNoZV9jb250ZW50ID0gRmFsc2UKICAgICAgICAgICAgICAgIGRhdGEgPSBzZWxmLl9mcC5yZWFkKGFtdCkKICAgICAgICAgICAgICAgIGlmIGFtdCAhPSAwIGFuZCBub3QgZGF0YTogICMgUGxhdGZvcm0tc3BlY2lmaWM6IEJ1Z2d5IHZlcnNpb25zIG9mIFB5dGhvbi4KICAgICAgICAgICAgICAgICAgICAjIENsb3NlIHRoZSBjb25uZWN0aW9uIHdoZW4gbm8gZGF0YSBpcyByZXR1cm5lZAogICAgICAgICAgICAgICAgICAgICMKICAgICAgICAgICAgICAgICAgICAjIFRoaXMgaXMgcmVkdW5kYW50IHRvIHdoYXQgaHR0cGxpYi9odHRwLmNsaWVudCBfc2hvdWxkXwogICAgICAgICAgICAgICAgICAgICMgYWxyZWFkeSBkby4gIEhvd2V2ZXIsIHZlcnNpb25zIG9mIHB5dGhvbiByZWxlYXNlZCBiZWZvcmUKICAgICAgICAgICAgICAgICAgICAjIERlY2VtYmVyIDE1LCAyMDEyIChodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMTYyOTgpIGRvCiAgICAgICAgICAgICAgICAgICAgIyBub3QgcHJvcGVybHkgY2xvc2UgdGhlIGNvbm5lY3Rpb24gaW4gYWxsIGNhc2VzLiBUaGVyZSBpcwogICAgICAgICAgICAgICAgICAgICMgbm8gaGFybSBpbiByZWR1bmRhbnRseSBjYWxsaW5nIGNsb3NlLgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2ZwLmNsb3NlKCkKICAgICAgICAgICAgICAgICAgICBmbHVzaF9kZWNvZGVyID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuZW5mb3JjZV9jb250ZW50X2xlbmd0aCBhbmQgc2VsZi5sZW5ndGhfcmVtYWluaW5nIG5vdCBpbiAoMCwgTm9uZSk6CiAgICAgICAgICAgICAgICAgICAgICAgICMgVGhpcyBpcyBhbiBlZGdlIGNhc2UgdGhhdCBodHRwbGliIGZhaWxlZCB0byBjb3ZlciBkdWUKICAgICAgICAgICAgICAgICAgICAgICAgIyB0byBjb25jZXJucyBvZiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiBXZSdyZQogICAgICAgICAgICAgICAgICAgICAgICAjIGFkZHJlc3NpbmcgaXQgaGVyZSB0byBtYWtlIHN1cmUgSW5jb21wbGV0ZVJlYWQgaXMKICAgICAgICAgICAgICAgICAgICAgICAgIyByYWlzZWQgZHVyaW5nIHN0cmVhbWluZywgc28gYWxsIGNhbGxzIHdpdGggaW5jb3JyZWN0CiAgICAgICAgICAgICAgICAgICAgICAgICMgQ29udGVudC1MZW5ndGggYXJlIGNhdWdodC4KICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgSW5jb21wbGV0ZVJlYWQoc2VsZi5fZnBfYnl0ZXNfcmVhZCwgc2VsZi5sZW5ndGhfcmVtYWluaW5nKQoKICAgICAgICBpZiBkYXRhOgogICAgICAgICAgICBzZWxmLl9mcF9ieXRlc19yZWFkICs9IGxlbihkYXRhKQogICAgICAgICAgICBpZiBzZWxmLmxlbmd0aF9yZW1haW5pbmcgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBzZWxmLmxlbmd0aF9yZW1haW5pbmcgLT0gbGVuKGRhdGEpCgogICAgICAgICAgICBkYXRhID0gc2VsZi5fZGVjb2RlKGRhdGEsIGRlY29kZV9jb250ZW50LCBmbHVzaF9kZWNvZGVyKQoKICAgICAgICAgICAgaWYgY2FjaGVfY29udGVudDoKICAgICAgICAgICAgICAgIHNlbGYuX2JvZHkgPSBkYXRhCgogICAgICAgIHJldHVybiBkYXRhCgogICAgZGVmIHN0cmVhbShzZWxmLCBhbXQ9MioqMTYsIGRlY29kZV9jb250ZW50PU5vbmUpOgogICAgICAgICIiIgogICAgICAgIEEgZ2VuZXJhdG9yIHdyYXBwZXIgZm9yIHRoZSByZWFkKCkgbWV0aG9kLiBBIGNhbGwgd2lsbCBibG9jayB1bnRpbAogICAgICAgIGBgYW10YGAgYnl0ZXMgaGF2ZSBiZWVuIHJlYWQgZnJvbSB0aGUgY29ubmVjdGlvbiBvciB1bnRpbCB0aGUKICAgICAgICBjb25uZWN0aW9uIGlzIGNsb3NlZC4KCiAgICAgICAgOnBhcmFtIGFtdDoKICAgICAgICAgICAgSG93IG11Y2ggb2YgdGhlIGNvbnRlbnQgdG8gcmVhZC4gVGhlIGdlbmVyYXRvciB3aWxsIHJldHVybiB1cCB0bwogICAgICAgICAgICBtdWNoIGRhdGEgcGVyIGl0ZXJhdGlvbiwgYnV0IG1heSByZXR1cm4gbGVzcy4gVGhpcyBpcyBwYXJ0aWN1bGFybHkKICAgICAgICAgICAgbGlrZWx5IHdoZW4gdXNpbmcgY29tcHJlc3NlZCBkYXRhLiBIb3dldmVyLCB0aGUgZW1wdHkgc3RyaW5nIHdpbGwKICAgICAgICAgICAgbmV2ZXIgYmUgcmV0dXJuZWQuCgogICAgICAgIDpwYXJhbSBkZWNvZGVfY29udGVudDoKICAgICAgICAgICAgSWYgVHJ1ZSwgd2lsbCBhdHRlbXB0IHRvIGRlY29kZSB0aGUgYm9keSBiYXNlZCBvbiB0aGUKICAgICAgICAgICAgJ2NvbnRlbnQtZW5jb2RpbmcnIGhlYWRlci4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLmNodW5rZWQgYW5kIHNlbGYuc3VwcG9ydHNfY2h1bmtlZF9yZWFkcygpOgogICAgICAgICAgICBmb3IgbGluZSBpbiBzZWxmLnJlYWRfY2h1bmtlZChhbXQsIGRlY29kZV9jb250ZW50PWRlY29kZV9jb250ZW50KToKICAgICAgICAgICAgICAgIHlpZWxkIGxpbmUKICAgICAgICBlbHNlOgogICAgICAgICAgICB3aGlsZSBub3QgaXNfZnBfY2xvc2VkKHNlbGYuX2ZwKToKICAgICAgICAgICAgICAgIGRhdGEgPSBzZWxmLnJlYWQoYW10PWFtdCwgZGVjb2RlX2NvbnRlbnQ9ZGVjb2RlX2NvbnRlbnQpCgogICAgICAgICAgICAgICAgaWYgZGF0YToKICAgICAgICAgICAgICAgICAgICB5aWVsZCBkYXRhCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZnJvbV9odHRwbGliKFJlc3BvbnNlQ2xzLCByLCAqKnJlc3BvbnNlX2t3KToKICAgICAgICAiIiIKICAgICAgICBHaXZlbiBhbiA6Y2xhc3M6YGh0dHBsaWIuSFRUUFJlc3BvbnNlYCBpbnN0YW5jZSBgYHJgYCwgcmV0dXJuIGEKICAgICAgICBjb3JyZXNwb25kaW5nIDpjbGFzczpgdXJsbGliMy5yZXNwb25zZS5IVFRQUmVzcG9uc2VgIG9iamVjdC4KCiAgICAgICAgUmVtYWluaW5nIHBhcmFtZXRlcnMgYXJlIHBhc3NlZCB0byB0aGUgSFRUUFJlc3BvbnNlIGNvbnN0cnVjdG9yLCBhbG9uZwogICAgICAgIHdpdGggYGBvcmlnaW5hbF9yZXNwb25zZT1yYGAuCiAgICAgICAgIiIiCiAgICAgICAgaGVhZGVycyA9IHIubXNnCgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGhlYWRlcnMsIEhUVFBIZWFkZXJEaWN0KToKICAgICAgICAgICAgaWYgUFkzOiAgIyBQeXRob24gMwogICAgICAgICAgICAgICAgaGVhZGVycyA9IEhUVFBIZWFkZXJEaWN0KGhlYWRlcnMuaXRlbXMoKSkKICAgICAgICAgICAgZWxzZTogICMgUHl0aG9uIDIKICAgICAgICAgICAgICAgIGhlYWRlcnMgPSBIVFRQSGVhZGVyRGljdC5mcm9tX2h0dHBsaWIoaGVhZGVycykKCiAgICAgICAgIyBIVFRQUmVzcG9uc2Ugb2JqZWN0cyBpbiBQeXRob24gMyBkb24ndCBoYXZlIGEgLnN0cmljdCBhdHRyaWJ1dGUKICAgICAgICBzdHJpY3QgPSBnZXRhdHRyKHIsICdzdHJpY3QnLCAwKQogICAgICAgIHJlc3AgPSBSZXNwb25zZUNscyhib2R5PXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM9aGVhZGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzPXIuc3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPXIudmVyc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uPXIucmVhc29uLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpY3Q9c3RyaWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbF9yZXNwb25zZT1yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAqKnJlc3BvbnNlX2t3KQogICAgICAgIHJldHVybiByZXNwCgogICAgIyBCYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBtZXRob2RzIGZvciBodHRwbGliLkhUVFBSZXNwb25zZQogICAgZGVmIGdldGhlYWRlcnMoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuaGVhZGVycwoKICAgIGRlZiBnZXRoZWFkZXIoc2VsZiwgbmFtZSwgZGVmYXVsdD1Ob25lKToKICAgICAgICByZXR1cm4gc2VsZi5oZWFkZXJzLmdldChuYW1lLCBkZWZhdWx0KQoKICAgICMgQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIGh0dHAuY29va2llamFyCiAgICBkZWYgaW5mbyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5oZWFkZXJzCgogICAgIyBPdmVycmlkZXMgZnJvbSBpby5JT0Jhc2UKICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICBpZiBub3Qgc2VsZi5jbG9zZWQ6CiAgICAgICAgICAgIHNlbGYuX2ZwLmNsb3NlKCkKCiAgICAgICAgaWYgc2VsZi5fY29ubmVjdGlvbjoKICAgICAgICAgICAgc2VsZi5fY29ubmVjdGlvbi5jbG9zZSgpCgogICAgQHByb3BlcnR5CiAgICBkZWYgY2xvc2VkKHNlbGYpOgogICAgICAgIGlmIHNlbGYuX2ZwIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgZWxpZiBoYXNhdHRyKHNlbGYuX2ZwLCAnaXNjbG9zZWQnKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2ZwLmlzY2xvc2VkKCkKICAgICAgICBlbGlmIGhhc2F0dHIoc2VsZi5fZnAsICdjbG9zZWQnKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2ZwLmNsb3NlZAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGZpbGVubyhzZWxmKToKICAgICAgICBpZiBzZWxmLl9mcCBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBJT0Vycm9yKCJIVFRQUmVzcG9uc2UgaGFzIG5vIGZpbGUgdG8gZ2V0IGEgZmlsZW5vIGZyb20iKQogICAgICAgIGVsaWYgaGFzYXR0cihzZWxmLl9mcCwgImZpbGVubyIpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fZnAuZmlsZW5vKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBJT0Vycm9yKCJUaGUgZmlsZS1saWtlIG9iamVjdCB0aGlzIEhUVFBSZXNwb25zZSBpcyB3cmFwcGVkICIKICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJvdW5kIGhhcyBubyBmaWxlIGRlc2NyaXB0b3IiKQoKICAgIGRlZiBmbHVzaChzZWxmKToKICAgICAgICBpZiBzZWxmLl9mcCBpcyBub3QgTm9uZSBhbmQgaGFzYXR0cihzZWxmLl9mcCwgJ2ZsdXNoJyk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9mcC5mbHVzaCgpCgogICAgZGVmIHJlYWRhYmxlKHNlbGYpOgogICAgICAgICMgVGhpcyBtZXRob2QgaXMgcmVxdWlyZWQgZm9yIGBpb2AgbW9kdWxlIGNvbXBhdGliaWxpdHkuCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgcmVhZGludG8oc2VsZiwgYik6CiAgICAgICAgIyBUaGlzIG1ldGhvZCBpcyByZXF1aXJlZCBmb3IgYGlvYCBtb2R1bGUgY29tcGF0aWJpbGl0eS4KICAgICAgICB0ZW1wID0gc2VsZi5yZWFkKGxlbihiKSkKICAgICAgICBpZiBsZW4odGVtcCkgPT0gMDoKICAgICAgICAgICAgcmV0dXJuIDAKICAgICAgICBlbHNlOgogICAgICAgICAgICBiWzpsZW4odGVtcCldID0gdGVtcAogICAgICAgICAgICByZXR1cm4gbGVuKHRlbXApCgogICAgZGVmIHN1cHBvcnRzX2NodW5rZWRfcmVhZHMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgQ2hlY2tzIGlmIHRoZSB1bmRlcmx5aW5nIGZpbGUtbGlrZSBvYmplY3QgbG9va3MgbGlrZSBhCiAgICAgICAgaHR0cGxpYi5IVFRQUmVzcG9uc2Ugb2JqZWN0LiBXZSBkbyB0aGlzIGJ5IHRlc3RpbmcgZm9yIHRoZSBmcAogICAgICAgIGF0dHJpYnV0ZS4gSWYgaXQgaXMgcHJlc2VudCB3ZSBhc3N1bWUgaXQgcmV0dXJucyByYXcgY2h1bmtzIGFzCiAgICAgICAgcHJvY2Vzc2VkIGJ5IHJlYWRfY2h1bmtlZCgpLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBoYXNhdHRyKHNlbGYuX2ZwLCAnZnAnKQoKICAgIGRlZiBfdXBkYXRlX2NodW5rX2xlbmd0aChzZWxmKToKICAgICAgICAjIEZpcnN0LCB3ZSdsbCBmaWd1cmUgb3V0IGxlbmd0aCBvZiBhIGNodW5rIGFuZCB0aGVuCiAgICAgICAgIyB3ZSdsbCB0cnkgdG8gcmVhZCBpdCBmcm9tIHNvY2tldC4KICAgICAgICBpZiBzZWxmLmNodW5rX2xlZnQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGxpbmUgPSBzZWxmLl9mcC5mcC5yZWFkbGluZSgpCiAgICAgICAgbGluZSA9IGxpbmUuc3BsaXQoYic7JywgMSlbMF0KICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYuY2h1bmtfbGVmdCA9IGludChsaW5lLCAxNikKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgIyBJbnZhbGlkIGNodW5rZWQgcHJvdG9jb2wgcmVzcG9uc2UsIGFib3J0LgogICAgICAgICAgICBzZWxmLmNsb3NlKCkKICAgICAgICAgICAgcmFpc2UgaHR0cGxpYi5JbmNvbXBsZXRlUmVhZChsaW5lKQoKICAgIGRlZiBfaGFuZGxlX2NodW5rKHNlbGYsIGFtdCk6CiAgICAgICAgcmV0dXJuZWRfY2h1bmsgPSBOb25lCiAgICAgICAgaWYgYW10IGlzIE5vbmU6CiAgICAgICAgICAgIGNodW5rID0gc2VsZi5fZnAuX3NhZmVfcmVhZChzZWxmLmNodW5rX2xlZnQpCiAgICAgICAgICAgIHJldHVybmVkX2NodW5rID0gY2h1bmsKICAgICAgICAgICAgc2VsZi5fZnAuX3NhZmVfcmVhZCgyKSAgIyBUb3NzIHRoZSBDUkxGIGF0IHRoZSBlbmQgb2YgdGhlIGNodW5rLgogICAgICAgICAgICBzZWxmLmNodW5rX2xlZnQgPSBOb25lCiAgICAgICAgZWxpZiBhbXQgPCBzZWxmLmNodW5rX2xlZnQ6CiAgICAgICAgICAgIHZhbHVlID0gc2VsZi5fZnAuX3NhZmVfcmVhZChhbXQpCiAgICAgICAgICAgIHNlbGYuY2h1bmtfbGVmdCA9IHNlbGYuY2h1bmtfbGVmdCAtIGFtdAogICAgICAgICAgICByZXR1cm5lZF9jaHVuayA9IHZhbHVlCiAgICAgICAgZWxpZiBhbXQgPT0gc2VsZi5jaHVua19sZWZ0OgogICAgICAgICAgICB2YWx1ZSA9IHNlbGYuX2ZwLl9zYWZlX3JlYWQoYW10KQogICAgICAgICAgICBzZWxmLl9mcC5fc2FmZV9yZWFkKDIpICAjIFRvc3MgdGhlIENSTEYgYXQgdGhlIGVuZCBvZiB0aGUgY2h1bmsuCiAgICAgICAgICAgIHNlbGYuY2h1bmtfbGVmdCA9IE5vbmUKICAgICAgICAgICAgcmV0dXJuZWRfY2h1bmsgPSB2YWx1ZQogICAgICAgIGVsc2U6ICAjIGFtdCA+IHNlbGYuY2h1bmtfbGVmdAogICAgICAgICAgICByZXR1cm5lZF9jaHVuayA9IHNlbGYuX2ZwLl9zYWZlX3JlYWQoc2VsZi5jaHVua19sZWZ0KQogICAgICAgICAgICBzZWxmLl9mcC5fc2FmZV9yZWFkKDIpICAjIFRvc3MgdGhlIENSTEYgYXQgdGhlIGVuZCBvZiB0aGUgY2h1bmsuCiAgICAgICAgICAgIHNlbGYuY2h1bmtfbGVmdCA9IE5vbmUKICAgICAgICByZXR1cm4gcmV0dXJuZWRfY2h1bmsKCiAgICBkZWYgcmVhZF9jaHVua2VkKHNlbGYsIGFtdD1Ob25lLCBkZWNvZGVfY29udGVudD1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBTaW1pbGFyIHRvIDptZXRoOmBIVFRQUmVzcG9uc2UucmVhZGAsIGJ1dCB3aXRoIGFuIGFkZGl0aW9uYWwKICAgICAgICBwYXJhbWV0ZXI6IGBgZGVjb2RlX2NvbnRlbnRgYC4KCiAgICAgICAgOnBhcmFtIGRlY29kZV9jb250ZW50OgogICAgICAgICAgICBJZiBUcnVlLCB3aWxsIGF0dGVtcHQgdG8gZGVjb2RlIHRoZSBib2R5IGJhc2VkIG9uIHRoZQogICAgICAgICAgICAnY29udGVudC1lbmNvZGluZycgaGVhZGVyLgogICAgICAgICIiIgogICAgICAgIHNlbGYuX2luaXRfZGVjb2RlcigpCiAgICAgICAgIyBGSVhNRTogUmV3cml0ZSB0aGlzIG1ldGhvZCBhbmQgbWFrZSBpdCBhIGNsYXNzIHdpdGggYSBiZXR0ZXIgc3RydWN0dXJlZCBsb2dpYy4KICAgICAgICBpZiBub3Qgc2VsZi5jaHVua2VkOgogICAgICAgICAgICByYWlzZSBSZXNwb25zZU5vdENodW5rZWQoCiAgICAgICAgICAgICAgICAiUmVzcG9uc2UgaXMgbm90IGNodW5rZWQuICIKICAgICAgICAgICAgICAgICJIZWFkZXIgJ3RyYW5zZmVyLWVuY29kaW5nOiBjaHVua2VkJyBpcyBtaXNzaW5nLiIpCiAgICAgICAgaWYgbm90IHNlbGYuc3VwcG9ydHNfY2h1bmtlZF9yZWFkcygpOgogICAgICAgICAgICByYWlzZSBCb2R5Tm90SHR0cGxpYkNvbXBhdGlibGUoCiAgICAgICAgICAgICAgICAiQm9keSBzaG91bGQgYmUgaHR0cGxpYi5IVFRQUmVzcG9uc2UgbGlrZS4gIgogICAgICAgICAgICAgICAgIkl0IHNob3VsZCBoYXZlIGhhdmUgYW4gZnAgYXR0cmlidXRlIHdoaWNoIHJldHVybnMgcmF3IGNodW5rcy4iKQoKICAgICAgICAjIERvbid0IGJvdGhlciByZWFkaW5nIHRoZSBib2R5IG9mIGEgSEVBRCByZXF1ZXN0LgogICAgICAgIGlmIHNlbGYuX29yaWdpbmFsX3Jlc3BvbnNlIGFuZCBpc19yZXNwb25zZV90b19oZWFkKHNlbGYuX29yaWdpbmFsX3Jlc3BvbnNlKToKICAgICAgICAgICAgc2VsZi5fb3JpZ2luYWxfcmVzcG9uc2UuY2xvc2UoKQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgd2l0aCBzZWxmLl9lcnJvcl9jYXRjaGVyKCk6CiAgICAgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICAgICBzZWxmLl91cGRhdGVfY2h1bmtfbGVuZ3RoKCkKICAgICAgICAgICAgICAgIGlmIHNlbGYuY2h1bmtfbGVmdCA9PSAwOgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBjaHVuayA9IHNlbGYuX2hhbmRsZV9jaHVuayhhbXQpCiAgICAgICAgICAgICAgICBkZWNvZGVkID0gc2VsZi5fZGVjb2RlKGNodW5rLCBkZWNvZGVfY29udGVudD1kZWNvZGVfY29udGVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmx1c2hfZGVjb2Rlcj1GYWxzZSkKICAgICAgICAgICAgICAgIGlmIGRlY29kZWQ6CiAgICAgICAgICAgICAgICAgICAgeWllbGQgZGVjb2RlZAoKICAgICAgICAgICAgaWYgZGVjb2RlX2NvbnRlbnQ6CiAgICAgICAgICAgICAgICAjIE9uIENQeXRob24gYW5kIFB5UHksIHdlIHNob3VsZCBuZXZlciBuZWVkIHRvIGZsdXNoIHRoZQogICAgICAgICAgICAgICAgIyBkZWNvZGVyLiBIb3dldmVyLCBvbiBKeXRob24gd2UgKm1pZ2h0KiBuZWVkIHRvLCBzbwogICAgICAgICAgICAgICAgIyBsZXRzIGRlZmVuc2l2ZWx5IGRvIGl0IGFueXdheS4KICAgICAgICAgICAgICAgIGRlY29kZWQgPSBzZWxmLl9mbHVzaF9kZWNvZGVyKCkKICAgICAgICAgICAgICAgIGlmIGRlY29kZWQ6ICAjIFBsYXRmb3JtLXNwZWNpZmljOiBKeXRob24uCiAgICAgICAgICAgICAgICAgICAgeWllbGQgZGVjb2RlZAoKICAgICAgICAgICAgIyBDaHVuayBjb250ZW50IGVuZHMgd2l0aCBcclxuOiBkaXNjYXJkIGl0LgogICAgICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAgICAgbGluZSA9IHNlbGYuX2ZwLmZwLnJlYWRsaW5lKCkKICAgICAgICAgICAgICAgIGlmIG5vdCBsaW5lOgogICAgICAgICAgICAgICAgICAgICMgU29tZSBzaXRlcyBtYXkgbm90IGVuZCB3aXRoICdcclxuJy4KICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgaWYgbGluZSA9PSBiJ1xyXG4nOgogICAgICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgICAgICAjIFdlIHJlYWQgZXZlcnl0aGluZzsgY2xvc2UgdGhlICJmaWxlIi4KICAgICAgICAgICAgaWYgc2VsZi5fb3JpZ2luYWxfcmVzcG9uc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9vcmlnaW5hbF9yZXNwb25zZS5jbG9zZSgpClBLAwQUAAAAAAAAACEAUnXhvxQEAAAUBAAANAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3V0aWwvX19pbml0X18ucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAojIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgcHJvdmlkZSBpbXBvcnRzIHRoYXQgdXNlZCB0byBiZSBoZXJlLgpmcm9tIC5jb25uZWN0aW9uIGltcG9ydCBpc19jb25uZWN0aW9uX2Ryb3BwZWQKZnJvbSAucmVxdWVzdCBpbXBvcnQgbWFrZV9oZWFkZXJzCmZyb20gLnJlc3BvbnNlIGltcG9ydCBpc19mcF9jbG9zZWQKZnJvbSAuc3NsXyBpbXBvcnQgKAogICAgU1NMQ29udGV4dCwKICAgIEhBU19TTkksCiAgICBJU19QWU9QRU5TU0wsCiAgICBJU19TRUNVUkVUUkFOU1BPUlQsCiAgICBhc3NlcnRfZmluZ2VycHJpbnQsCiAgICByZXNvbHZlX2NlcnRfcmVxcywKICAgIHJlc29sdmVfc3NsX3ZlcnNpb24sCiAgICBzc2xfd3JhcF9zb2NrZXQsCikKZnJvbSAudGltZW91dCBpbXBvcnQgKAogICAgY3VycmVudF90aW1lLAogICAgVGltZW91dCwKKQoKZnJvbSAucmV0cnkgaW1wb3J0IFJldHJ5CmZyb20gLnVybCBpbXBvcnQgKAogICAgZ2V0X2hvc3QsCiAgICBwYXJzZV91cmwsCiAgICBzcGxpdF9maXJzdCwKICAgIFVybCwKKQpmcm9tIC53YWl0IGltcG9ydCAoCiAgICB3YWl0X2Zvcl9yZWFkLAogICAgd2FpdF9mb3Jfd3JpdGUKKQoKX19hbGxfXyA9ICgKICAgICdIQVNfU05JJywKICAgICdJU19QWU9QRU5TU0wnLAogICAgJ0lTX1NFQ1VSRVRSQU5TUE9SVCcsCiAgICAnU1NMQ29udGV4dCcsCiAgICAnUmV0cnknLAogICAgJ1RpbWVvdXQnLAogICAgJ1VybCcsCiAgICAnYXNzZXJ0X2ZpbmdlcnByaW50JywKICAgICdjdXJyZW50X3RpbWUnLAogICAgJ2lzX2Nvbm5lY3Rpb25fZHJvcHBlZCcsCiAgICAnaXNfZnBfY2xvc2VkJywKICAgICdnZXRfaG9zdCcsCiAgICAncGFyc2VfdXJsJywKICAgICdtYWtlX2hlYWRlcnMnLAogICAgJ3Jlc29sdmVfY2VydF9yZXFzJywKICAgICdyZXNvbHZlX3NzbF92ZXJzaW9uJywKICAgICdzcGxpdF9maXJzdCcsCiAgICAnc3NsX3dyYXBfc29ja2V0JywKICAgICd3YWl0X2Zvcl9yZWFkJywKICAgICd3YWl0X2Zvcl93cml0ZScKKQpQSwMEFAAAAAAAAAAhAKufXz2NEAAAjRAAADYAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL2Nvbm5lY3Rpb24ucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAppbXBvcnQgc29ja2V0CmZyb20gLndhaXQgaW1wb3J0IHdhaXRfZm9yX3JlYWQKZnJvbSAuc2VsZWN0b3JzIGltcG9ydCBIQVNfU0VMRUNULCBTZWxlY3RvckVycm9yCgoKZGVmIGlzX2Nvbm5lY3Rpb25fZHJvcHBlZChjb25uKTogICMgUGxhdGZvcm0tc3BlY2lmaWMKICAgICIiIgogICAgUmV0dXJucyBUcnVlIGlmIHRoZSBjb25uZWN0aW9uIGlzIGRyb3BwZWQgYW5kIHNob3VsZCBiZSBjbG9zZWQuCgogICAgOnBhcmFtIGNvbm46CiAgICAgICAgOmNsYXNzOmBodHRwbGliLkhUVFBDb25uZWN0aW9uYCBvYmplY3QuCgogICAgTm90ZTogRm9yIHBsYXRmb3JtcyBsaWtlIEFwcEVuZ2luZSwgdGhpcyB3aWxsIGFsd2F5cyByZXR1cm4gYGBGYWxzZWBgIHRvCiAgICBsZXQgdGhlIHBsYXRmb3JtIGhhbmRsZSBjb25uZWN0aW9uIHJlY3ljbGluZyB0cmFuc3BhcmVudGx5IGZvciB1cy4KICAgICIiIgogICAgc29jayA9IGdldGF0dHIoY29ubiwgJ3NvY2snLCBGYWxzZSkKICAgIGlmIHNvY2sgaXMgRmFsc2U6ICAjIFBsYXRmb3JtLXNwZWNpZmljOiBBcHBFbmdpbmUKICAgICAgICByZXR1cm4gRmFsc2UKICAgIGlmIHNvY2sgaXMgTm9uZTogICMgQ29ubmVjdGlvbiBhbHJlYWR5IGNsb3NlZCAoc3VjaCBhcyBieSBodHRwbGliKS4KICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGlmIG5vdCBIQVNfU0VMRUNUOgogICAgICAgIHJldHVybiBGYWxzZQoKICAgIHRyeToKICAgICAgICByZXR1cm4gYm9vbCh3YWl0X2Zvcl9yZWFkKHNvY2ssIHRpbWVvdXQ9MC4wKSkKICAgIGV4Y2VwdCBTZWxlY3RvckVycm9yOgogICAgICAgIHJldHVybiBUcnVlCgoKIyBUaGlzIGZ1bmN0aW9uIGlzIGNvcGllZCBmcm9tIHNvY2tldC5weSBpbiB0aGUgUHl0aG9uIDIuNyBzdGFuZGFyZAojIGxpYnJhcnkgdGVzdCBzdWl0ZS4gQWRkZWQgdG8gaXRzIHNpZ25hdHVyZSBpcyBvbmx5IGBzb2NrZXRfb3B0aW9uc2AuCiMgT25lIGFkZGl0aW9uYWwgbW9kaWZpY2F0aW9uIGlzIHRoYXQgd2UgYXZvaWQgYmluZGluZyB0byBJUHY2IHNlcnZlcnMKIyBkaXNjb3ZlcmVkIGluIEROUyBpZiB0aGUgc3lzdGVtIGRvZXNuJ3QgaGF2ZSBJUHY2IGZ1bmN0aW9uYWxpdHkuCmRlZiBjcmVhdGVfY29ubmVjdGlvbihhZGRyZXNzLCB0aW1lb3V0PXNvY2tldC5fR0xPQkFMX0RFRkFVTFRfVElNRU9VVCwKICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZV9hZGRyZXNzPU5vbmUsIHNvY2tldF9vcHRpb25zPU5vbmUpOgogICAgIiIiQ29ubmVjdCB0byAqYWRkcmVzcyogYW5kIHJldHVybiB0aGUgc29ja2V0IG9iamVjdC4KCiAgICBDb252ZW5pZW5jZSBmdW5jdGlvbi4gIENvbm5lY3QgdG8gKmFkZHJlc3MqIChhIDItdHVwbGUgYGAoaG9zdCwKICAgIHBvcnQpYGApIGFuZCByZXR1cm4gdGhlIHNvY2tldCBvYmplY3QuICBQYXNzaW5nIHRoZSBvcHRpb25hbAogICAgKnRpbWVvdXQqIHBhcmFtZXRlciB3aWxsIHNldCB0aGUgdGltZW91dCBvbiB0aGUgc29ja2V0IGluc3RhbmNlCiAgICBiZWZvcmUgYXR0ZW1wdGluZyB0byBjb25uZWN0LiAgSWYgbm8gKnRpbWVvdXQqIGlzIHN1cHBsaWVkLCB0aGUKICAgIGdsb2JhbCBkZWZhdWx0IHRpbWVvdXQgc2V0dGluZyByZXR1cm5lZCBieSA6ZnVuYzpgZ2V0ZGVmYXVsdHRpbWVvdXRgCiAgICBpcyB1c2VkLiAgSWYgKnNvdXJjZV9hZGRyZXNzKiBpcyBzZXQgaXQgbXVzdCBiZSBhIHR1cGxlIG9mIChob3N0LCBwb3J0KQogICAgZm9yIHRoZSBzb2NrZXQgdG8gYmluZCBhcyBhIHNvdXJjZSBhZGRyZXNzIGJlZm9yZSBtYWtpbmcgdGhlIGNvbm5lY3Rpb24uCiAgICBBbiBob3N0IG9mICcnIG9yIHBvcnQgMCB0ZWxscyB0aGUgT1MgdG8gdXNlIHRoZSBkZWZhdWx0LgogICAgIiIiCgogICAgaG9zdCwgcG9ydCA9IGFkZHJlc3MKICAgIGlmIGhvc3Quc3RhcnRzd2l0aCgnWycpOgogICAgICAgIGhvc3QgPSBob3N0LnN0cmlwKCdbXScpCiAgICBlcnIgPSBOb25lCgogICAgIyBVc2luZyB0aGUgdmFsdWUgZnJvbSBhbGxvd2VkX2dhaV9mYW1pbHkoKSBpbiB0aGUgY29udGV4dCBvZiBnZXRhZGRyaW5mbyBsZXRzCiAgICAjIHVzIHNlbGVjdCB3aGV0aGVyIHRvIHdvcmsgd2l0aCBJUHY0IEROUyByZWNvcmRzLCBJUHY2IHJlY29yZHMsIG9yIGJvdGguCiAgICAjIFRoZSBvcmlnaW5hbCBjcmVhdGVfY29ubmVjdGlvbiBmdW5jdGlvbiBhbHdheXMgcmV0dXJucyBhbGwgcmVjb3Jkcy4KICAgIGZhbWlseSA9IGFsbG93ZWRfZ2FpX2ZhbWlseSgpCgogICAgZm9yIHJlcyBpbiBzb2NrZXQuZ2V0YWRkcmluZm8oaG9zdCwgcG9ydCwgZmFtaWx5LCBzb2NrZXQuU09DS19TVFJFQU0pOgogICAgICAgIGFmLCBzb2NrdHlwZSwgcHJvdG8sIGNhbm9ubmFtZSwgc2EgPSByZXMKICAgICAgICBzb2NrID0gTm9uZQogICAgICAgIHRyeToKICAgICAgICAgICAgc29jayA9IHNvY2tldC5zb2NrZXQoYWYsIHNvY2t0eXBlLCBwcm90bykKCiAgICAgICAgICAgICMgSWYgcHJvdmlkZWQsIHNldCBzb2NrZXQgbGV2ZWwgb3B0aW9ucyBiZWZvcmUgY29ubmVjdGluZy4KICAgICAgICAgICAgX3NldF9zb2NrZXRfb3B0aW9ucyhzb2NrLCBzb2NrZXRfb3B0aW9ucykKCiAgICAgICAgICAgIGlmIHRpbWVvdXQgaXMgbm90IHNvY2tldC5fR0xPQkFMX0RFRkFVTFRfVElNRU9VVDoKICAgICAgICAgICAgICAgIHNvY2suc2V0dGltZW91dCh0aW1lb3V0KQogICAgICAgICAgICBpZiBzb3VyY2VfYWRkcmVzczoKICAgICAgICAgICAgICAgIHNvY2suYmluZChzb3VyY2VfYWRkcmVzcykKICAgICAgICAgICAgc29jay5jb25uZWN0KHNhKQogICAgICAgICAgICByZXR1cm4gc29jawoKICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yIGFzIGU6CiAgICAgICAgICAgIGVyciA9IGUKICAgICAgICAgICAgaWYgc29jayBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHNvY2suY2xvc2UoKQogICAgICAgICAgICAgICAgc29jayA9IE5vbmUKCiAgICBpZiBlcnIgaXMgbm90IE5vbmU6CiAgICAgICAgcmFpc2UgZXJyCgogICAgcmFpc2Ugc29ja2V0LmVycm9yKCJnZXRhZGRyaW5mbyByZXR1cm5zIGFuIGVtcHR5IGxpc3QiKQoKCmRlZiBfc2V0X3NvY2tldF9vcHRpb25zKHNvY2ssIG9wdGlvbnMpOgogICAgaWYgb3B0aW9ucyBpcyBOb25lOgogICAgICAgIHJldHVybgoKICAgIGZvciBvcHQgaW4gb3B0aW9uczoKICAgICAgICBzb2NrLnNldHNvY2tvcHQoKm9wdCkKCgpkZWYgYWxsb3dlZF9nYWlfZmFtaWx5KCk6CiAgICAiIiJUaGlzIGZ1bmN0aW9uIGlzIGRlc2lnbmVkIHRvIHdvcmsgaW4gdGhlIGNvbnRleHQgb2YKICAgIGdldGFkZHJpbmZvLCB3aGVyZSBmYW1pbHk9c29ja2V0LkFGX1VOU1BFQyBpcyB0aGUgZGVmYXVsdCBhbmQKICAgIHdpbGwgcGVyZm9ybSBhIEROUyBzZWFyY2ggZm9yIGJvdGggSVB2NiBhbmQgSVB2NCByZWNvcmRzLiIiIgoKICAgIGZhbWlseSA9IHNvY2tldC5BRl9JTkVUCiAgICBpZiBIQVNfSVBWNjoKICAgICAgICBmYW1pbHkgPSBzb2NrZXQuQUZfVU5TUEVDCiAgICByZXR1cm4gZmFtaWx5CgoKZGVmIF9oYXNfaXB2Nihob3N0KToKICAgICIiIiBSZXR1cm5zIFRydWUgaWYgdGhlIHN5c3RlbSBjYW4gYmluZCBhbiBJUHY2IGFkZHJlc3MuICIiIgogICAgc29jayA9IE5vbmUKICAgIGhhc19pcHY2ID0gRmFsc2UKCiAgICBpZiBzb2NrZXQuaGFzX2lwdjY6CiAgICAgICAgIyBoYXNfaXB2NiByZXR1cm5zIHRydWUgaWYgY1B5dGhvbiB3YXMgY29tcGlsZWQgd2l0aCBJUHY2IHN1cHBvcnQuCiAgICAgICAgIyBJdCBkb2VzIG5vdCB0ZWxsIHVzIGlmIHRoZSBzeXN0ZW0gaGFzIElQdjYgc3VwcG9ydCBlbmFibGVkLiBUbwogICAgICAgICMgZGV0ZXJtaW5lIHRoYXQgd2UgbXVzdCBiaW5kIHRvIGFuIElQdjYgYWRkcmVzcy4KICAgICAgICAjIGh0dHBzOi8vZ2l0aHViLmNvbS9zaGF6b3cvdXJsbGliMy9wdWxsLzYxMQogICAgICAgICMgaHR0cHM6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWU2NTgzMjcKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNvY2sgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUNikKICAgICAgICAgICAgc29jay5iaW5kKChob3N0LCAwKSkKICAgICAgICAgICAgaGFzX2lwdjYgPSBUcnVlCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgcGFzcwoKICAgIGlmIHNvY2s6CiAgICAgICAgc29jay5jbG9zZSgpCiAgICByZXR1cm4gaGFzX2lwdjYKCgpIQVNfSVBWNiA9IF9oYXNfaXB2NignOjoxJykKUEsDBBQAAAAAAAAAIQBBYZDXeQ4AAHkOAAAzAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvdXRpbC9yZXF1ZXN0LnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKZnJvbSBiYXNlNjQgaW1wb3J0IGI2NGVuY29kZQoKZnJvbSAuLnBhY2thZ2VzLnNpeCBpbXBvcnQgYiwgaW50ZWdlcl90eXBlcwpmcm9tIC4uZXhjZXB0aW9ucyBpbXBvcnQgVW5yZXdpbmRhYmxlQm9keUVycm9yCgpBQ0NFUFRfRU5DT0RJTkcgPSAnZ3ppcCxkZWZsYXRlJwpfRkFJTEVEVEVMTCA9IG9iamVjdCgpCgoKZGVmIG1ha2VfaGVhZGVycyhrZWVwX2FsaXZlPU5vbmUsIGFjY2VwdF9lbmNvZGluZz1Ob25lLCB1c2VyX2FnZW50PU5vbmUsCiAgICAgICAgICAgICAgICAgYmFzaWNfYXV0aD1Ob25lLCBwcm94eV9iYXNpY19hdXRoPU5vbmUsIGRpc2FibGVfY2FjaGU9Tm9uZSk6CiAgICAiIiIKICAgIFNob3J0Y3V0cyBmb3IgZ2VuZXJhdGluZyByZXF1ZXN0IGhlYWRlcnMuCgogICAgOnBhcmFtIGtlZXBfYWxpdmU6CiAgICAgICAgSWYgYGBUcnVlYGAsIGFkZHMgJ2Nvbm5lY3Rpb246IGtlZXAtYWxpdmUnIGhlYWRlci4KCiAgICA6cGFyYW0gYWNjZXB0X2VuY29kaW5nOgogICAgICAgIENhbiBiZSBhIGJvb2xlYW4sIGxpc3QsIG9yIHN0cmluZy4KICAgICAgICBgYFRydWVgYCB0cmFuc2xhdGVzIHRvICdnemlwLGRlZmxhdGUnLgogICAgICAgIExpc3Qgd2lsbCBnZXQgam9pbmVkIGJ5IGNvbW1hLgogICAgICAgIFN0cmluZyB3aWxsIGJlIHVzZWQgYXMgcHJvdmlkZWQuCgogICAgOnBhcmFtIHVzZXJfYWdlbnQ6CiAgICAgICAgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgdXNlci1hZ2VudCB5b3Ugd2FudCwgc3VjaCBhcwogICAgICAgICJweXRob24tdXJsbGliMy8wLjYiCgogICAgOnBhcmFtIGJhc2ljX2F1dGg6CiAgICAgICAgQ29sb24tc2VwYXJhdGVkIHVzZXJuYW1lOnBhc3N3b3JkIHN0cmluZyBmb3IgJ2F1dGhvcml6YXRpb246IGJhc2ljIC4uLicKICAgICAgICBhdXRoIGhlYWRlci4KCiAgICA6cGFyYW0gcHJveHlfYmFzaWNfYXV0aDoKICAgICAgICBDb2xvbi1zZXBhcmF0ZWQgdXNlcm5hbWU6cGFzc3dvcmQgc3RyaW5nIGZvciAncHJveHktYXV0aG9yaXphdGlvbjogYmFzaWMgLi4uJwogICAgICAgIGF1dGggaGVhZGVyLgoKICAgIDpwYXJhbSBkaXNhYmxlX2NhY2hlOgogICAgICAgIElmIGBgVHJ1ZWBgLCBhZGRzICdjYWNoZS1jb250cm9sOiBuby1jYWNoZScgaGVhZGVyLgoKICAgIEV4YW1wbGU6OgoKICAgICAgICA+Pj4gbWFrZV9oZWFkZXJzKGtlZXBfYWxpdmU9VHJ1ZSwgdXNlcl9hZ2VudD0iQmF0bWFuLzEuMCIpCiAgICAgICAgeydjb25uZWN0aW9uJzogJ2tlZXAtYWxpdmUnLCAndXNlci1hZ2VudCc6ICdCYXRtYW4vMS4wJ30KICAgICAgICA+Pj4gbWFrZV9oZWFkZXJzKGFjY2VwdF9lbmNvZGluZz1UcnVlKQogICAgICAgIHsnYWNjZXB0LWVuY29kaW5nJzogJ2d6aXAsZGVmbGF0ZSd9CiAgICAiIiIKICAgIGhlYWRlcnMgPSB7fQogICAgaWYgYWNjZXB0X2VuY29kaW5nOgogICAgICAgIGlmIGlzaW5zdGFuY2UoYWNjZXB0X2VuY29kaW5nLCBzdHIpOgogICAgICAgICAgICBwYXNzCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKGFjY2VwdF9lbmNvZGluZywgbGlzdCk6CiAgICAgICAgICAgIGFjY2VwdF9lbmNvZGluZyA9ICcsJy5qb2luKGFjY2VwdF9lbmNvZGluZykKICAgICAgICBlbHNlOgogICAgICAgICAgICBhY2NlcHRfZW5jb2RpbmcgPSBBQ0NFUFRfRU5DT0RJTkcKICAgICAgICBoZWFkZXJzWydhY2NlcHQtZW5jb2RpbmcnXSA9IGFjY2VwdF9lbmNvZGluZwoKICAgIGlmIHVzZXJfYWdlbnQ6CiAgICAgICAgaGVhZGVyc1sndXNlci1hZ2VudCddID0gdXNlcl9hZ2VudAoKICAgIGlmIGtlZXBfYWxpdmU6CiAgICAgICAgaGVhZGVyc1snY29ubmVjdGlvbiddID0gJ2tlZXAtYWxpdmUnCgogICAgaWYgYmFzaWNfYXV0aDoKICAgICAgICBoZWFkZXJzWydhdXRob3JpemF0aW9uJ10gPSAnQmFzaWMgJyArIFwKICAgICAgICAgICAgYjY0ZW5jb2RlKGIoYmFzaWNfYXV0aCkpLmRlY29kZSgndXRmLTgnKQoKICAgIGlmIHByb3h5X2Jhc2ljX2F1dGg6CiAgICAgICAgaGVhZGVyc1sncHJveHktYXV0aG9yaXphdGlvbiddID0gJ0Jhc2ljICcgKyBcCiAgICAgICAgICAgIGI2NGVuY29kZShiKHByb3h5X2Jhc2ljX2F1dGgpKS5kZWNvZGUoJ3V0Zi04JykKCiAgICBpZiBkaXNhYmxlX2NhY2hlOgogICAgICAgIGhlYWRlcnNbJ2NhY2hlLWNvbnRyb2wnXSA9ICduby1jYWNoZScKCiAgICByZXR1cm4gaGVhZGVycwoKCmRlZiBzZXRfZmlsZV9wb3NpdGlvbihib2R5LCBwb3MpOgogICAgIiIiCiAgICBJZiBhIHBvc2l0aW9uIGlzIHByb3ZpZGVkLCBtb3ZlIGZpbGUgdG8gdGhhdCBwb2ludC4KICAgIE90aGVyd2lzZSwgd2UnbGwgYXR0ZW1wdCB0byByZWNvcmQgYSBwb3NpdGlvbiBmb3IgZnV0dXJlIHVzZS4KICAgICIiIgogICAgaWYgcG9zIGlzIG5vdCBOb25lOgogICAgICAgIHJld2luZF9ib2R5KGJvZHksIHBvcykKICAgIGVsaWYgZ2V0YXR0cihib2R5LCAndGVsbCcsIE5vbmUpIGlzIG5vdCBOb25lOgogICAgICAgIHRyeToKICAgICAgICAgICAgcG9zID0gYm9keS50ZWxsKCkKICAgICAgICBleGNlcHQgKElPRXJyb3IsIE9TRXJyb3IpOgogICAgICAgICAgICAjIFRoaXMgZGlmZmVyZW50aWF0ZXMgZnJvbSBOb25lLCBhbGxvd2luZyB1cyB0byBjYXRjaAogICAgICAgICAgICAjIGEgZmFpbGVkIGB0ZWxsKClgIGxhdGVyIHdoZW4gdHJ5aW5nIHRvIHJld2luZCB0aGUgYm9keS4KICAgICAgICAgICAgcG9zID0gX0ZBSUxFRFRFTEwKCiAgICByZXR1cm4gcG9zCgoKZGVmIHJld2luZF9ib2R5KGJvZHksIGJvZHlfcG9zKToKICAgICIiIgogICAgQXR0ZW1wdCB0byByZXdpbmQgYm9keSB0byBhIGNlcnRhaW4gcG9zaXRpb24uCiAgICBQcmltYXJpbHkgdXNlZCBmb3IgcmVxdWVzdCByZWRpcmVjdHMgYW5kIHJldHJpZXMuCgogICAgOnBhcmFtIGJvZHk6CiAgICAgICAgRmlsZS1saWtlIG9iamVjdCB0aGF0IHN1cHBvcnRzIHNlZWsuCgogICAgOnBhcmFtIGludCBwb3M6CiAgICAgICAgUG9zaXRpb24gdG8gc2VlayB0byBpbiBmaWxlLgogICAgIiIiCiAgICBib2R5X3NlZWsgPSBnZXRhdHRyKGJvZHksICdzZWVrJywgTm9uZSkKICAgIGlmIGJvZHlfc2VlayBpcyBub3QgTm9uZSBhbmQgaXNpbnN0YW5jZShib2R5X3BvcywgaW50ZWdlcl90eXBlcyk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBib2R5X3NlZWsoYm9keV9wb3MpCiAgICAgICAgZXhjZXB0IChJT0Vycm9yLCBPU0Vycm9yKToKICAgICAgICAgICAgcmFpc2UgVW5yZXdpbmRhYmxlQm9keUVycm9yKCJBbiBlcnJvciBvY2N1cnJlZCB3aGVuIHJld2luZGluZyByZXF1ZXN0ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJib2R5IGZvciByZWRpcmVjdC9yZXRyeS4iKQogICAgZWxpZiBib2R5X3BvcyBpcyBfRkFJTEVEVEVMTDoKICAgICAgICByYWlzZSBVbnJld2luZGFibGVCb2R5RXJyb3IoIlVuYWJsZSB0byByZWNvcmQgZmlsZSBwb3NpdGlvbiBmb3IgcmV3aW5kaW5nICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVlc3QgYm9keSBkdXJpbmcgYSByZWRpcmVjdC9yZXRyeS4iKQogICAgZWxzZToKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJib2R5X3BvcyBtdXN0IGJlIG9mIHR5cGUgaW50ZWdlciwgIgogICAgICAgICAgICAgICAgICAgICAgICAgImluc3RlYWQgaXQgd2FzICVzLiIgJSB0eXBlKGJvZHlfcG9zKSkKUEsDBBQAAAAAAAAAIQD0ORyfJwkAACcJAAA0AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvdXRpbC9yZXNwb25zZS5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CmZyb20gLi5wYWNrYWdlcy5zaXgubW92ZXMgaW1wb3J0IGh0dHBfY2xpZW50IGFzIGh0dHBsaWIKCmZyb20gLi5leGNlcHRpb25zIGltcG9ydCBIZWFkZXJQYXJzaW5nRXJyb3IKCgpkZWYgaXNfZnBfY2xvc2VkKG9iaik6CiAgICAiIiIKICAgIENoZWNrcyB3aGV0aGVyIGEgZ2l2ZW4gZmlsZS1saWtlIG9iamVjdCBpcyBjbG9zZWQuCgogICAgOnBhcmFtIG9iajoKICAgICAgICBUaGUgZmlsZS1saWtlIG9iamVjdCB0byBjaGVjay4KICAgICIiIgoKICAgIHRyeToKICAgICAgICAjIENoZWNrIGBpc2Nsb3NlZCgpYCBmaXJzdCwgaW4gY2FzZSBQeXRob24zIGRvZXNuJ3Qgc2V0IGBjbG9zZWRgLgogICAgICAgICMgR0ggSXNzdWUgIzkyOAogICAgICAgIHJldHVybiBvYmouaXNjbG9zZWQoKQogICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgIHBhc3MKCiAgICB0cnk6CiAgICAgICAgIyBDaGVjayB2aWEgdGhlIG9mZmljaWFsIGZpbGUtbGlrZS1vYmplY3Qgd2F5LgogICAgICAgIHJldHVybiBvYmouY2xvc2VkCiAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgcGFzcwoKICAgIHRyeToKICAgICAgICAjIENoZWNrIGlmIHRoZSBvYmplY3QgaXMgYSBjb250YWluZXIgZm9yIGFub3RoZXIgZmlsZS1saWtlIG9iamVjdCB0aGF0CiAgICAgICAgIyBnZXRzIHJlbGVhc2VkIG9uIGV4aGF1c3Rpb24gKGUuZy4gSFRUUFJlc3BvbnNlKS4KICAgICAgICByZXR1cm4gb2JqLmZwIGlzIE5vbmUKICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICBwYXNzCgogICAgcmFpc2UgVmFsdWVFcnJvcigiVW5hYmxlIHRvIGRldGVybWluZSB3aGV0aGVyIGZwIGlzIGNsb3NlZC4iKQoKCmRlZiBhc3NlcnRfaGVhZGVyX3BhcnNpbmcoaGVhZGVycyk6CiAgICAiIiIKICAgIEFzc2VydHMgd2hldGhlciBhbGwgaGVhZGVycyBoYXZlIGJlZW4gc3VjY2Vzc2Z1bGx5IHBhcnNlZC4KICAgIEV4dHJhY3RzIGVuY291bnRlcmVkIGVycm9ycyBmcm9tIHRoZSByZXN1bHQgb2YgcGFyc2luZyBoZWFkZXJzLgoKICAgIE9ubHkgd29ya3Mgb24gUHl0aG9uIDMuCgogICAgOnBhcmFtIGhlYWRlcnM6IEhlYWRlcnMgdG8gdmVyaWZ5LgogICAgOnR5cGUgaGVhZGVyczogYGh0dHBsaWIuSFRUUE1lc3NhZ2VgLgoKICAgIDpyYWlzZXMgdXJsbGliMy5leGNlcHRpb25zLkhlYWRlclBhcnNpbmdFcnJvcjoKICAgICAgICBJZiBwYXJzaW5nIGVycm9ycyBhcmUgZm91bmQuCiAgICAiIiIKCiAgICAjIFRoaXMgd2lsbCBmYWlsIHNpbGVudGx5IGlmIHdlIHBhc3MgaW4gdGhlIHdyb25nIGtpbmQgb2YgcGFyYW1ldGVyLgogICAgIyBUbyBtYWtlIGRlYnVnZ2luZyBlYXNpZXIgYWRkIGFuIGV4cGxpY2l0IGNoZWNrLgogICAgaWYgbm90IGlzaW5zdGFuY2UoaGVhZGVycywgaHR0cGxpYi5IVFRQTWVzc2FnZSk6CiAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdleHBlY3RlZCBodHRwbGliLk1lc3NhZ2UsIGdvdCB7MH0uJy5mb3JtYXQoCiAgICAgICAgICAgIHR5cGUoaGVhZGVycykpKQoKICAgIGRlZmVjdHMgPSBnZXRhdHRyKGhlYWRlcnMsICdkZWZlY3RzJywgTm9uZSkKICAgIGdldF9wYXlsb2FkID0gZ2V0YXR0cihoZWFkZXJzLCAnZ2V0X3BheWxvYWQnLCBOb25lKQoKICAgIHVucGFyc2VkX2RhdGEgPSBOb25lCiAgICBpZiBnZXRfcGF5bG9hZDogICMgUGxhdGZvcm0tc3BlY2lmaWM6IFB5dGhvbiAzLgogICAgICAgIHVucGFyc2VkX2RhdGEgPSBnZXRfcGF5bG9hZCgpCgogICAgaWYgZGVmZWN0cyBvciB1bnBhcnNlZF9kYXRhOgogICAgICAgIHJhaXNlIEhlYWRlclBhcnNpbmdFcnJvcihkZWZlY3RzPWRlZmVjdHMsIHVucGFyc2VkX2RhdGE9dW5wYXJzZWRfZGF0YSkKCgpkZWYgaXNfcmVzcG9uc2VfdG9faGVhZChyZXNwb25zZSk6CiAgICAiIiIKICAgIENoZWNrcyB3aGV0aGVyIHRoZSByZXF1ZXN0IG9mIGEgcmVzcG9uc2UgaGFzIGJlZW4gYSBIRUFELXJlcXVlc3QuCiAgICBIYW5kbGVzIHRoZSBxdWlya3Mgb2YgQXBwRW5naW5lLgoKICAgIDpwYXJhbSBjb25uOgogICAgOnR5cGUgY29ubjogOmNsYXNzOmBodHRwbGliLkhUVFBSZXNwb25zZWAKICAgICIiIgogICAgIyBGSVhNRTogQ2FuIHdlIGRvIHRoaXMgc29tZWhvdyB3aXRob3V0IGFjY2Vzc2luZyBwcml2YXRlIGh0dHBsaWIgX21ldGhvZD8KICAgIG1ldGhvZCA9IHJlc3BvbnNlLl9tZXRob2QKICAgIGlmIGlzaW5zdGFuY2UobWV0aG9kLCBpbnQpOiAgIyBQbGF0Zm9ybS1zcGVjaWZpYzogQXBwZW5naW5lCiAgICAgICAgcmV0dXJuIG1ldGhvZCA9PSAzCiAgICByZXR1cm4gbWV0aG9kLnVwcGVyKCkgPT0gJ0hFQUQnClBLAwQUAAAAAAAAACEAPWHv2wk5AAAJOQAAMQAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3V0aWwvcmV0cnkucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAppbXBvcnQgdGltZQppbXBvcnQgbG9nZ2luZwpmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBuYW1lZHR1cGxlCmZyb20gaXRlcnRvb2xzIGltcG9ydCB0YWtld2hpbGUKaW1wb3J0IGVtYWlsCmltcG9ydCByZQoKZnJvbSAuLmV4Y2VwdGlvbnMgaW1wb3J0ICgKICAgIENvbm5lY3RUaW1lb3V0RXJyb3IsCiAgICBNYXhSZXRyeUVycm9yLAogICAgUHJvdG9jb2xFcnJvciwKICAgIFJlYWRUaW1lb3V0RXJyb3IsCiAgICBSZXNwb25zZUVycm9yLAogICAgSW52YWxpZEhlYWRlciwKKQpmcm9tIC4ucGFja2FnZXMgaW1wb3J0IHNpeAoKCmxvZyA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKIyBEYXRhIHN0cnVjdHVyZSBmb3IgcmVwcmVzZW50aW5nIHRoZSBtZXRhZGF0YSBvZiByZXF1ZXN0cyB0aGF0IHJlc3VsdCBpbiBhIHJldHJ5LgpSZXF1ZXN0SGlzdG9yeSA9IG5hbWVkdHVwbGUoJ1JlcXVlc3RIaXN0b3J5JywgWyJtZXRob2QiLCAidXJsIiwgImVycm9yIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RhdHVzIiwgInJlZGlyZWN0X2xvY2F0aW9uIl0pCgoKY2xhc3MgUmV0cnkob2JqZWN0KToKICAgICIiIiBSZXRyeSBjb25maWd1cmF0aW9uLgoKICAgIEVhY2ggcmV0cnkgYXR0ZW1wdCB3aWxsIGNyZWF0ZSBhIG5ldyBSZXRyeSBvYmplY3Qgd2l0aCB1cGRhdGVkIHZhbHVlcywgc28KICAgIHRoZXkgY2FuIGJlIHNhZmVseSByZXVzZWQuCgogICAgUmV0cmllcyBjYW4gYmUgZGVmaW5lZCBhcyBhIGRlZmF1bHQgZm9yIGEgcG9vbDo6CgogICAgICAgIHJldHJpZXMgPSBSZXRyeShjb25uZWN0PTUsIHJlYWQ9MiwgcmVkaXJlY3Q9NSkKICAgICAgICBodHRwID0gUG9vbE1hbmFnZXIocmV0cmllcz1yZXRyaWVzKQogICAgICAgIHJlc3BvbnNlID0gaHR0cC5yZXF1ZXN0KCdHRVQnLCAnaHR0cDovL2V4YW1wbGUuY29tLycpCgogICAgT3IgcGVyLXJlcXVlc3QgKHdoaWNoIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCBmb3IgdGhlIHBvb2wpOjoKCiAgICAgICAgcmVzcG9uc2UgPSBodHRwLnJlcXVlc3QoJ0dFVCcsICdodHRwOi8vZXhhbXBsZS5jb20vJywgcmV0cmllcz1SZXRyeSgxMCkpCgogICAgUmV0cmllcyBjYW4gYmUgZGlzYWJsZWQgYnkgcGFzc2luZyBgYEZhbHNlYGA6OgoKICAgICAgICByZXNwb25zZSA9IGh0dHAucmVxdWVzdCgnR0VUJywgJ2h0dHA6Ly9leGFtcGxlLmNvbS8nLCByZXRyaWVzPUZhbHNlKQoKICAgIEVycm9ycyB3aWxsIGJlIHdyYXBwZWQgaW4gOmNsYXNzOmB+dXJsbGliMy5leGNlcHRpb25zLk1heFJldHJ5RXJyb3JgIHVubGVzcwogICAgcmV0cmllcyBhcmUgZGlzYWJsZWQsIGluIHdoaWNoIGNhc2UgdGhlIGNhdXNpbmcgZXhjZXB0aW9uIHdpbGwgYmUgcmFpc2VkLgoKICAgIDpwYXJhbSBpbnQgdG90YWw6CiAgICAgICAgVG90YWwgbnVtYmVyIG9mIHJldHJpZXMgdG8gYWxsb3cuIFRha2VzIHByZWNlZGVuY2Ugb3ZlciBvdGhlciBjb3VudHMuCgogICAgICAgIFNldCB0byBgYE5vbmVgYCB0byByZW1vdmUgdGhpcyBjb25zdHJhaW50IGFuZCBmYWxsIGJhY2sgb24gb3RoZXIKICAgICAgICBjb3VudHMuIEl0J3MgYSBnb29kIGlkZWEgdG8gc2V0IHRoaXMgdG8gc29tZSBzZW5zaWJseS1oaWdoIHZhbHVlIHRvCiAgICAgICAgYWNjb3VudCBmb3IgdW5leHBlY3RlZCBlZGdlIGNhc2VzIGFuZCBhdm9pZCBpbmZpbml0ZSByZXRyeSBsb29wcy4KCiAgICAgICAgU2V0IHRvIGBgMGBgIHRvIGZhaWwgb24gdGhlIGZpcnN0IHJldHJ5LgoKICAgICAgICBTZXQgdG8gYGBGYWxzZWBgIHRvIGRpc2FibGUgYW5kIGltcGx5IGBgcmFpc2Vfb25fcmVkaXJlY3Q9RmFsc2VgYC4KCiAgICA6cGFyYW0gaW50IGNvbm5lY3Q6CiAgICAgICAgSG93IG1hbnkgY29ubmVjdGlvbi1yZWxhdGVkIGVycm9ycyB0byByZXRyeSBvbi4KCiAgICAgICAgVGhlc2UgYXJlIGVycm9ycyByYWlzZWQgYmVmb3JlIHRoZSByZXF1ZXN0IGlzIHNlbnQgdG8gdGhlIHJlbW90ZSBzZXJ2ZXIsCiAgICAgICAgd2hpY2ggd2UgYXNzdW1lIGhhcyBub3QgdHJpZ2dlcmVkIHRoZSBzZXJ2ZXIgdG8gcHJvY2VzcyB0aGUgcmVxdWVzdC4KCiAgICAgICAgU2V0IHRvIGBgMGBgIHRvIGZhaWwgb24gdGhlIGZpcnN0IHJldHJ5IG9mIHRoaXMgdHlwZS4KCiAgICA6cGFyYW0gaW50IHJlYWQ6CiAgICAgICAgSG93IG1hbnkgdGltZXMgdG8gcmV0cnkgb24gcmVhZCBlcnJvcnMuCgogICAgICAgIFRoZXNlIGVycm9ycyBhcmUgcmFpc2VkIGFmdGVyIHRoZSByZXF1ZXN0IHdhcyBzZW50IHRvIHRoZSBzZXJ2ZXIsIHNvIHRoZQogICAgICAgIHJlcXVlc3QgbWF5IGhhdmUgc2lkZS1lZmZlY3RzLgoKICAgICAgICBTZXQgdG8gYGAwYGAgdG8gZmFpbCBvbiB0aGUgZmlyc3QgcmV0cnkgb2YgdGhpcyB0eXBlLgoKICAgIDpwYXJhbSBpbnQgcmVkaXJlY3Q6CiAgICAgICAgSG93IG1hbnkgcmVkaXJlY3RzIHRvIHBlcmZvcm0uIExpbWl0IHRoaXMgdG8gYXZvaWQgaW5maW5pdGUgcmVkaXJlY3QKICAgICAgICBsb29wcy4KCiAgICAgICAgQSByZWRpcmVjdCBpcyBhIEhUVFAgcmVzcG9uc2Ugd2l0aCBhIHN0YXR1cyBjb2RlIDMwMSwgMzAyLCAzMDMsIDMwNyBvcgogICAgICAgIDMwOC4KCiAgICAgICAgU2V0IHRvIGBgMGBgIHRvIGZhaWwgb24gdGhlIGZpcnN0IHJldHJ5IG9mIHRoaXMgdHlwZS4KCiAgICAgICAgU2V0IHRvIGBgRmFsc2VgYCB0byBkaXNhYmxlIGFuZCBpbXBseSBgYHJhaXNlX29uX3JlZGlyZWN0PUZhbHNlYGAuCgogICAgOnBhcmFtIGludCBzdGF0dXM6CiAgICAgICAgSG93IG1hbnkgdGltZXMgdG8gcmV0cnkgb24gYmFkIHN0YXR1cyBjb2Rlcy4KCiAgICAgICAgVGhlc2UgYXJlIHJldHJpZXMgbWFkZSBvbiByZXNwb25zZXMsIHdoZXJlIHN0YXR1cyBjb2RlIG1hdGNoZXMKICAgICAgICBgYHN0YXR1c19mb3JjZWxpc3RgYC4KCiAgICAgICAgU2V0IHRvIGBgMGBgIHRvIGZhaWwgb24gdGhlIGZpcnN0IHJldHJ5IG9mIHRoaXMgdHlwZS4KCiAgICA6cGFyYW0gaXRlcmFibGUgbWV0aG9kX3doaXRlbGlzdDoKICAgICAgICBTZXQgb2YgdXBwZXJjYXNlZCBIVFRQIG1ldGhvZCB2ZXJicyB0aGF0IHdlIHNob3VsZCByZXRyeSBvbi4KCiAgICAgICAgQnkgZGVmYXVsdCwgd2Ugb25seSByZXRyeSBvbiBtZXRob2RzIHdoaWNoIGFyZSBjb25zaWRlcmVkIHRvIGJlCiAgICAgICAgaWRlbXBvdGVudCAobXVsdGlwbGUgcmVxdWVzdHMgd2l0aCB0aGUgc2FtZSBwYXJhbWV0ZXJzIGVuZCB3aXRoIHRoZQogICAgICAgIHNhbWUgc3RhdGUpLiBTZWUgOmF0dHI6YFJldHJ5LkRFRkFVTFRfTUVUSE9EX1dISVRFTElTVGAuCgogICAgICAgIFNldCB0byBhIGBgRmFsc2VgYCB2YWx1ZSB0byByZXRyeSBvbiBhbnkgdmVyYi4KCiAgICA6cGFyYW0gaXRlcmFibGUgc3RhdHVzX2ZvcmNlbGlzdDoKICAgICAgICBBIHNldCBvZiBpbnRlZ2VyIEhUVFAgc3RhdHVzIGNvZGVzIHRoYXQgd2Ugc2hvdWxkIGZvcmNlIGEgcmV0cnkgb24uCiAgICAgICAgQSByZXRyeSBpcyBpbml0aWF0ZWQgaWYgdGhlIHJlcXVlc3QgbWV0aG9kIGlzIGluIGBgbWV0aG9kX3doaXRlbGlzdGBgCiAgICAgICAgYW5kIHRoZSByZXNwb25zZSBzdGF0dXMgY29kZSBpcyBpbiBgYHN0YXR1c19mb3JjZWxpc3RgYC4KCiAgICAgICAgQnkgZGVmYXVsdCwgdGhpcyBpcyBkaXNhYmxlZCB3aXRoIGBgTm9uZWBgLgoKICAgIDpwYXJhbSBmbG9hdCBiYWNrb2ZmX2ZhY3RvcjoKICAgICAgICBBIGJhY2tvZmYgZmFjdG9yIHRvIGFwcGx5IGJldHdlZW4gYXR0ZW1wdHMgYWZ0ZXIgdGhlIHNlY29uZCB0cnkKICAgICAgICAobW9zdCBlcnJvcnMgYXJlIHJlc29sdmVkIGltbWVkaWF0ZWx5IGJ5IGEgc2Vjb25kIHRyeSB3aXRob3V0IGEKICAgICAgICBkZWxheSkuIHVybGxpYjMgd2lsbCBzbGVlcCBmb3I6OgoKICAgICAgICAgICAge2JhY2tvZmYgZmFjdG9yfSAqICgyIF4gKHtudW1iZXIgb2YgdG90YWwgcmV0cmllc30gLSAxKSkKCiAgICAgICAgc2Vjb25kcy4gSWYgdGhlIGJhY2tvZmZfZmFjdG9yIGlzIDAuMSwgdGhlbiA6ZnVuYzpgLnNsZWVwYCB3aWxsIHNsZWVwCiAgICAgICAgZm9yIFswLjBzLCAwLjJzLCAwLjRzLCAuLi5dIGJldHdlZW4gcmV0cmllcy4gSXQgd2lsbCBuZXZlciBiZSBsb25nZXIKICAgICAgICB0aGFuIDphdHRyOmBSZXRyeS5CQUNLT0ZGX01BWGAuCgogICAgICAgIEJ5IGRlZmF1bHQsIGJhY2tvZmYgaXMgZGlzYWJsZWQgKHNldCB0byAwKS4KCiAgICA6cGFyYW0gYm9vbCByYWlzZV9vbl9yZWRpcmVjdDogV2hldGhlciwgaWYgdGhlIG51bWJlciBvZiByZWRpcmVjdHMgaXMKICAgICAgICBleGhhdXN0ZWQsIHRvIHJhaXNlIGEgTWF4UmV0cnlFcnJvciwgb3IgdG8gcmV0dXJuIGEgcmVzcG9uc2Ugd2l0aCBhCiAgICAgICAgcmVzcG9uc2UgY29kZSBpbiB0aGUgM3h4IHJhbmdlLgoKICAgIDpwYXJhbSBib29sIHJhaXNlX29uX3N0YXR1czogU2ltaWxhciBtZWFuaW5nIHRvIGBgcmFpc2Vfb25fcmVkaXJlY3RgYDoKICAgICAgICB3aGV0aGVyIHdlIHNob3VsZCByYWlzZSBhbiBleGNlcHRpb24sIG9yIHJldHVybiBhIHJlc3BvbnNlLAogICAgICAgIGlmIHN0YXR1cyBmYWxscyBpbiBgYHN0YXR1c19mb3JjZWxpc3RgYCByYW5nZSBhbmQgcmV0cmllcyBoYXZlCiAgICAgICAgYmVlbiBleGhhdXN0ZWQuCgogICAgOnBhcmFtIHR1cGxlIGhpc3Rvcnk6IFRoZSBoaXN0b3J5IG9mIHRoZSByZXF1ZXN0IGVuY291bnRlcmVkIGR1cmluZwogICAgICAgIGVhY2ggY2FsbCB0byA6bWV0aDpgflJldHJ5LmluY3JlbWVudGAuIFRoZSBsaXN0IGlzIGluIHRoZSBvcmRlcgogICAgICAgIHRoZSByZXF1ZXN0cyBvY2N1cnJlZC4gRWFjaCBsaXN0IGl0ZW0gaXMgb2YgY2xhc3MgOmNsYXNzOmBSZXF1ZXN0SGlzdG9yeWAuCgogICAgOnBhcmFtIGJvb2wgcmVzcGVjdF9yZXRyeV9hZnRlcl9oZWFkZXI6CiAgICAgICAgV2hldGhlciB0byByZXNwZWN0IFJldHJ5LUFmdGVyIGhlYWRlciBvbiBzdGF0dXMgY29kZXMgZGVmaW5lZCBhcwogICAgICAgIDphdHRyOmBSZXRyeS5SRVRSWV9BRlRFUl9TVEFUVVNfQ09ERVNgIG9yIG5vdC4KCiAgICAiIiIKCiAgICBERUZBVUxUX01FVEhPRF9XSElURUxJU1QgPSBmcm96ZW5zZXQoWwogICAgICAgICdIRUFEJywgJ0dFVCcsICdQVVQnLCAnREVMRVRFJywgJ09QVElPTlMnLCAnVFJBQ0UnXSkKCiAgICBSRVRSWV9BRlRFUl9TVEFUVVNfQ09ERVMgPSBmcm96ZW5zZXQoWzQxMywgNDI5LCA1MDNdKQoKICAgICM6IE1heGltdW0gYmFja29mZiB0aW1lLgogICAgQkFDS09GRl9NQVggPSAxMjAKCiAgICBkZWYgX19pbml0X18oc2VsZiwgdG90YWw9MTAsIGNvbm5lY3Q9Tm9uZSwgcmVhZD1Ob25lLCByZWRpcmVjdD1Ob25lLCBzdGF0dXM9Tm9uZSwKICAgICAgICAgICAgICAgICBtZXRob2Rfd2hpdGVsaXN0PURFRkFVTFRfTUVUSE9EX1dISVRFTElTVCwgc3RhdHVzX2ZvcmNlbGlzdD1Ob25lLAogICAgICAgICAgICAgICAgIGJhY2tvZmZfZmFjdG9yPTAsIHJhaXNlX29uX3JlZGlyZWN0PVRydWUsIHJhaXNlX29uX3N0YXR1cz1UcnVlLAogICAgICAgICAgICAgICAgIGhpc3Rvcnk9Tm9uZSwgcmVzcGVjdF9yZXRyeV9hZnRlcl9oZWFkZXI9VHJ1ZSk6CgogICAgICAgIHNlbGYudG90YWwgPSB0b3RhbAogICAgICAgIHNlbGYuY29ubmVjdCA9IGNvbm5lY3QKICAgICAgICBzZWxmLnJlYWQgPSByZWFkCiAgICAgICAgc2VsZi5zdGF0dXMgPSBzdGF0dXMKCiAgICAgICAgaWYgcmVkaXJlY3QgaXMgRmFsc2Ugb3IgdG90YWwgaXMgRmFsc2U6CiAgICAgICAgICAgIHJlZGlyZWN0ID0gMAogICAgICAgICAgICByYWlzZV9vbl9yZWRpcmVjdCA9IEZhbHNlCgogICAgICAgIHNlbGYucmVkaXJlY3QgPSByZWRpcmVjdAogICAgICAgIHNlbGYuc3RhdHVzX2ZvcmNlbGlzdCA9IHN0YXR1c19mb3JjZWxpc3Qgb3Igc2V0KCkKICAgICAgICBzZWxmLm1ldGhvZF93aGl0ZWxpc3QgPSBtZXRob2Rfd2hpdGVsaXN0CiAgICAgICAgc2VsZi5iYWNrb2ZmX2ZhY3RvciA9IGJhY2tvZmZfZmFjdG9yCiAgICAgICAgc2VsZi5yYWlzZV9vbl9yZWRpcmVjdCA9IHJhaXNlX29uX3JlZGlyZWN0CiAgICAgICAgc2VsZi5yYWlzZV9vbl9zdGF0dXMgPSByYWlzZV9vbl9zdGF0dXMKICAgICAgICBzZWxmLmhpc3RvcnkgPSBoaXN0b3J5IG9yIHR1cGxlKCkKICAgICAgICBzZWxmLnJlc3BlY3RfcmV0cnlfYWZ0ZXJfaGVhZGVyID0gcmVzcGVjdF9yZXRyeV9hZnRlcl9oZWFkZXIKCiAgICBkZWYgbmV3KHNlbGYsICoqa3cpOgogICAgICAgIHBhcmFtcyA9IGRpY3QoCiAgICAgICAgICAgIHRvdGFsPXNlbGYudG90YWwsCiAgICAgICAgICAgIGNvbm5lY3Q9c2VsZi5jb25uZWN0LCByZWFkPXNlbGYucmVhZCwgcmVkaXJlY3Q9c2VsZi5yZWRpcmVjdCwgc3RhdHVzPXNlbGYuc3RhdHVzLAogICAgICAgICAgICBtZXRob2Rfd2hpdGVsaXN0PXNlbGYubWV0aG9kX3doaXRlbGlzdCwKICAgICAgICAgICAgc3RhdHVzX2ZvcmNlbGlzdD1zZWxmLnN0YXR1c19mb3JjZWxpc3QsCiAgICAgICAgICAgIGJhY2tvZmZfZmFjdG9yPXNlbGYuYmFja29mZl9mYWN0b3IsCiAgICAgICAgICAgIHJhaXNlX29uX3JlZGlyZWN0PXNlbGYucmFpc2Vfb25fcmVkaXJlY3QsCiAgICAgICAgICAgIHJhaXNlX29uX3N0YXR1cz1zZWxmLnJhaXNlX29uX3N0YXR1cywKICAgICAgICAgICAgaGlzdG9yeT1zZWxmLmhpc3RvcnksCiAgICAgICAgKQogICAgICAgIHBhcmFtcy51cGRhdGUoa3cpCiAgICAgICAgcmV0dXJuIHR5cGUoc2VsZikoKipwYXJhbXMpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZnJvbV9pbnQoY2xzLCByZXRyaWVzLCByZWRpcmVjdD1UcnVlLCBkZWZhdWx0PU5vbmUpOgogICAgICAgICIiIiBCYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBmb3IgdGhlIG9sZCByZXRyaWVzIGZvcm1hdC4iIiIKICAgICAgICBpZiByZXRyaWVzIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHJpZXMgPSBkZWZhdWx0IGlmIGRlZmF1bHQgaXMgbm90IE5vbmUgZWxzZSBjbHMuREVGQVVMVAoKICAgICAgICBpZiBpc2luc3RhbmNlKHJldHJpZXMsIFJldHJ5KToKICAgICAgICAgICAgcmV0dXJuIHJldHJpZXMKCiAgICAgICAgcmVkaXJlY3QgPSBib29sKHJlZGlyZWN0KSBhbmQgTm9uZQogICAgICAgIG5ld19yZXRyaWVzID0gY2xzKHJldHJpZXMsIHJlZGlyZWN0PXJlZGlyZWN0KQogICAgICAgIGxvZy5kZWJ1ZygiQ29udmVydGVkIHJldHJpZXMgdmFsdWU6ICVyIC0+ICVyIiwgcmV0cmllcywgbmV3X3JldHJpZXMpCiAgICAgICAgcmV0dXJuIG5ld19yZXRyaWVzCgogICAgZGVmIGdldF9iYWNrb2ZmX3RpbWUoc2VsZik6CiAgICAgICAgIiIiIEZvcm11bGEgZm9yIGNvbXB1dGluZyB0aGUgY3VycmVudCBiYWNrb2ZmCgogICAgICAgIDpydHlwZTogZmxvYXQKICAgICAgICAiIiIKICAgICAgICAjIFdlIHdhbnQgdG8gY29uc2lkZXIgb25seSB0aGUgbGFzdCBjb25zZWN1dGl2ZSBlcnJvcnMgc2VxdWVuY2UgKElnbm9yZSByZWRpcmVjdHMpLgogICAgICAgIGNvbnNlY3V0aXZlX2Vycm9yc19sZW4gPSBsZW4obGlzdCh0YWtld2hpbGUobGFtYmRhIHg6IHgucmVkaXJlY3RfbG9jYXRpb24gaXMgTm9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldmVyc2VkKHNlbGYuaGlzdG9yeSkpKSkKICAgICAgICBpZiBjb25zZWN1dGl2ZV9lcnJvcnNfbGVuIDw9IDE6CiAgICAgICAgICAgIHJldHVybiAwCgogICAgICAgIGJhY2tvZmZfdmFsdWUgPSBzZWxmLmJhY2tvZmZfZmFjdG9yICogKDIgKiogKGNvbnNlY3V0aXZlX2Vycm9yc19sZW4gLSAxKSkKICAgICAgICByZXR1cm4gbWluKHNlbGYuQkFDS09GRl9NQVgsIGJhY2tvZmZfdmFsdWUpCgogICAgZGVmIHBhcnNlX3JldHJ5X2FmdGVyKHNlbGYsIHJldHJ5X2FmdGVyKToKICAgICAgICAjIFdoaXRlc3BhY2U6IGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMwI3NlY3Rpb24tMy4yLjQKICAgICAgICBpZiByZS5tYXRjaChyIl5ccypbMC05XStccyokIiwgcmV0cnlfYWZ0ZXIpOgogICAgICAgICAgICBzZWNvbmRzID0gaW50KHJldHJ5X2FmdGVyKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHJ5X2RhdGVfdHVwbGUgPSBlbWFpbC51dGlscy5wYXJzZWRhdGUocmV0cnlfYWZ0ZXIpCiAgICAgICAgICAgIGlmIHJldHJ5X2RhdGVfdHVwbGUgaXMgTm9uZToKICAgICAgICAgICAgICAgIHJhaXNlIEludmFsaWRIZWFkZXIoIkludmFsaWQgUmV0cnktQWZ0ZXIgaGVhZGVyOiAlcyIgJSByZXRyeV9hZnRlcikKICAgICAgICAgICAgcmV0cnlfZGF0ZSA9IHRpbWUubWt0aW1lKHJldHJ5X2RhdGVfdHVwbGUpCiAgICAgICAgICAgIHNlY29uZHMgPSByZXRyeV9kYXRlIC0gdGltZS50aW1lKCkKCiAgICAgICAgaWYgc2Vjb25kcyA8IDA6CiAgICAgICAgICAgIHNlY29uZHMgPSAwCgogICAgICAgIHJldHVybiBzZWNvbmRzCgogICAgZGVmIGdldF9yZXRyeV9hZnRlcihzZWxmLCByZXNwb25zZSk6CiAgICAgICAgIiIiIEdldCB0aGUgdmFsdWUgb2YgUmV0cnktQWZ0ZXIgaW4gc2Vjb25kcy4gIiIiCgogICAgICAgIHJldHJ5X2FmdGVyID0gcmVzcG9uc2UuZ2V0aGVhZGVyKCJSZXRyeS1BZnRlciIpCgogICAgICAgIGlmIHJldHJ5X2FmdGVyIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgIHJldHVybiBzZWxmLnBhcnNlX3JldHJ5X2FmdGVyKHJldHJ5X2FmdGVyKQoKICAgIGRlZiBzbGVlcF9mb3JfcmV0cnkoc2VsZiwgcmVzcG9uc2U9Tm9uZSk6CiAgICAgICAgcmV0cnlfYWZ0ZXIgPSBzZWxmLmdldF9yZXRyeV9hZnRlcihyZXNwb25zZSkKICAgICAgICBpZiByZXRyeV9hZnRlcjoKICAgICAgICAgICAgdGltZS5zbGVlcChyZXRyeV9hZnRlcikKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIF9zbGVlcF9iYWNrb2ZmKHNlbGYpOgogICAgICAgIGJhY2tvZmYgPSBzZWxmLmdldF9iYWNrb2ZmX3RpbWUoKQogICAgICAgIGlmIGJhY2tvZmYgPD0gMDoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgdGltZS5zbGVlcChiYWNrb2ZmKQoKICAgIGRlZiBzbGVlcChzZWxmLCByZXNwb25zZT1Ob25lKToKICAgICAgICAiIiIgU2xlZXAgYmV0d2VlbiByZXRyeSBhdHRlbXB0cy4KCiAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCByZXNwZWN0IGEgc2VydmVyJ3MgYGBSZXRyeS1BZnRlcmBgIHJlc3BvbnNlIGhlYWRlcgogICAgICAgIGFuZCBzbGVlcCB0aGUgZHVyYXRpb24gb2YgdGhlIHRpbWUgcmVxdWVzdGVkLiBJZiB0aGF0IGlzIG5vdCBwcmVzZW50LCBpdAogICAgICAgIHdpbGwgdXNlIGFuIGV4cG9uZW50aWFsIGJhY2tvZmYuIEJ5IGRlZmF1bHQsIHRoZSBiYWNrb2ZmIGZhY3RvciBpcyAwIGFuZAogICAgICAgIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5LgogICAgICAgICIiIgoKICAgICAgICBpZiByZXNwb25zZToKICAgICAgICAgICAgc2xlcHQgPSBzZWxmLnNsZWVwX2Zvcl9yZXRyeShyZXNwb25zZSkKICAgICAgICAgICAgaWYgc2xlcHQ6CiAgICAgICAgICAgICAgICByZXR1cm4KCiAgICAgICAgc2VsZi5fc2xlZXBfYmFja29mZigpCgogICAgZGVmIF9pc19jb25uZWN0aW9uX2Vycm9yKHNlbGYsIGVycik6CiAgICAgICAgIiIiIEVycm9ycyB3aGVuIHdlJ3JlIGZhaXJseSBzdXJlIHRoYXQgdGhlIHNlcnZlciBkaWQgbm90IHJlY2VpdmUgdGhlCiAgICAgICAgcmVxdWVzdCwgc28gaXQgc2hvdWxkIGJlIHNhZmUgdG8gcmV0cnkuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGlzaW5zdGFuY2UoZXJyLCBDb25uZWN0VGltZW91dEVycm9yKQoKICAgIGRlZiBfaXNfcmVhZF9lcnJvcihzZWxmLCBlcnIpOgogICAgICAgICIiIiBFcnJvcnMgdGhhdCBvY2N1ciBhZnRlciB0aGUgcmVxdWVzdCBoYXMgYmVlbiBzdGFydGVkLCBzbyB3ZSBzaG91bGQKICAgICAgICBhc3N1bWUgdGhhdCB0aGUgc2VydmVyIGJlZ2FuIHByb2Nlc3NpbmcgaXQuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGlzaW5zdGFuY2UoZXJyLCAoUmVhZFRpbWVvdXRFcnJvciwgUHJvdG9jb2xFcnJvcikpCgogICAgZGVmIF9pc19tZXRob2RfcmV0cnlhYmxlKHNlbGYsIG1ldGhvZCk6CiAgICAgICAgIiIiIENoZWNrcyBpZiBhIGdpdmVuIEhUVFAgbWV0aG9kIHNob3VsZCBiZSByZXRyaWVkIHVwb24sIGRlcGVuZGluZyBpZgogICAgICAgIGl0IGlzIGluY2x1ZGVkIG9uIHRoZSBtZXRob2Qgd2hpdGVsaXN0LgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYubWV0aG9kX3doaXRlbGlzdCBhbmQgbWV0aG9kLnVwcGVyKCkgbm90IGluIHNlbGYubWV0aG9kX3doaXRlbGlzdDoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIGlzX3JldHJ5KHNlbGYsIG1ldGhvZCwgc3RhdHVzX2NvZGUsIGhhc19yZXRyeV9hZnRlcj1GYWxzZSk6CiAgICAgICAgIiIiIElzIHRoaXMgbWV0aG9kL3N0YXR1cyBjb2RlIHJldHJ5YWJsZT8gKEJhc2VkIG9uIHdoaXRlbGlzdHMgYW5kIGNvbnRyb2wKICAgICAgICB2YXJpYWJsZXMgc3VjaCBhcyB0aGUgbnVtYmVyIG9mIHRvdGFsIHJldHJpZXMgdG8gYWxsb3csIHdoZXRoZXIgdG8KICAgICAgICByZXNwZWN0IHRoZSBSZXRyeS1BZnRlciBoZWFkZXIsIHdoZXRoZXIgdGhpcyBoZWFkZXIgaXMgcHJlc2VudCwgYW5kCiAgICAgICAgd2hldGhlciB0aGUgcmV0dXJuZWQgc3RhdHVzIGNvZGUgaXMgb24gdGhlIGxpc3Qgb2Ygc3RhdHVzIGNvZGVzIHRvCiAgICAgICAgYmUgcmV0cmllZCB1cG9uIG9uIHRoZSBwcmVzZW5jZSBvZiB0aGUgYWZvcmVtZW50aW9uZWQgaGVhZGVyKQogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBzZWxmLl9pc19tZXRob2RfcmV0cnlhYmxlKG1ldGhvZCk6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICBpZiBzZWxmLnN0YXR1c19mb3JjZWxpc3QgYW5kIHN0YXR1c19jb2RlIGluIHNlbGYuc3RhdHVzX2ZvcmNlbGlzdDoKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgcmV0dXJuIChzZWxmLnRvdGFsIGFuZCBzZWxmLnJlc3BlY3RfcmV0cnlfYWZ0ZXJfaGVhZGVyIGFuZAogICAgICAgICAgICAgICAgaGFzX3JldHJ5X2FmdGVyIGFuZCAoc3RhdHVzX2NvZGUgaW4gc2VsZi5SRVRSWV9BRlRFUl9TVEFUVVNfQ09ERVMpKQoKICAgIGRlZiBpc19leGhhdXN0ZWQoc2VsZik6CiAgICAgICAgIiIiIEFyZSB3ZSBvdXQgb2YgcmV0cmllcz8gIiIiCiAgICAgICAgcmV0cnlfY291bnRzID0gKHNlbGYudG90YWwsIHNlbGYuY29ubmVjdCwgc2VsZi5yZWFkLCBzZWxmLnJlZGlyZWN0LCBzZWxmLnN0YXR1cykKICAgICAgICByZXRyeV9jb3VudHMgPSBsaXN0KGZpbHRlcihOb25lLCByZXRyeV9jb3VudHMpKQogICAgICAgIGlmIG5vdCByZXRyeV9jb3VudHM6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICByZXR1cm4gbWluKHJldHJ5X2NvdW50cykgPCAwCgogICAgZGVmIGluY3JlbWVudChzZWxmLCBtZXRob2Q9Tm9uZSwgdXJsPU5vbmUsIHJlc3BvbnNlPU5vbmUsIGVycm9yPU5vbmUsCiAgICAgICAgICAgICAgICAgIF9wb29sPU5vbmUsIF9zdGFja3RyYWNlPU5vbmUpOgogICAgICAgICIiIiBSZXR1cm4gYSBuZXcgUmV0cnkgb2JqZWN0IHdpdGggaW5jcmVtZW50ZWQgcmV0cnkgY291bnRlcnMuCgogICAgICAgIDpwYXJhbSByZXNwb25zZTogQSByZXNwb25zZSBvYmplY3QsIG9yIE5vbmUsIGlmIHRoZSBzZXJ2ZXIgZGlkIG5vdAogICAgICAgICAgICByZXR1cm4gYSByZXNwb25zZS4KICAgICAgICA6dHlwZSByZXNwb25zZTogOmNsYXNzOmB+dXJsbGliMy5yZXNwb25zZS5IVFRQUmVzcG9uc2VgCiAgICAgICAgOnBhcmFtIEV4Y2VwdGlvbiBlcnJvcjogQW4gZXJyb3IgZW5jb3VudGVyZWQgZHVyaW5nIHRoZSByZXF1ZXN0LCBvcgogICAgICAgICAgICBOb25lIGlmIHRoZSByZXNwb25zZSB3YXMgcmVjZWl2ZWQgc3VjY2Vzc2Z1bGx5LgoKICAgICAgICA6cmV0dXJuOiBBIG5ldyBgYFJldHJ5YGAgb2JqZWN0LgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYudG90YWwgaXMgRmFsc2UgYW5kIGVycm9yOgogICAgICAgICAgICAjIERpc2FibGVkLCBpbmRpY2F0ZSB0byByZS1yYWlzZSB0aGUgZXJyb3IuCiAgICAgICAgICAgIHJhaXNlIHNpeC5yZXJhaXNlKHR5cGUoZXJyb3IpLCBlcnJvciwgX3N0YWNrdHJhY2UpCgogICAgICAgIHRvdGFsID0gc2VsZi50b3RhbAogICAgICAgIGlmIHRvdGFsIGlzIG5vdCBOb25lOgogICAgICAgICAgICB0b3RhbCAtPSAxCgogICAgICAgIGNvbm5lY3QgPSBzZWxmLmNvbm5lY3QKICAgICAgICByZWFkID0gc2VsZi5yZWFkCiAgICAgICAgcmVkaXJlY3QgPSBzZWxmLnJlZGlyZWN0CiAgICAgICAgc3RhdHVzX2NvdW50ID0gc2VsZi5zdGF0dXMKICAgICAgICBjYXVzZSA9ICd1bmtub3duJwogICAgICAgIHN0YXR1cyA9IE5vbmUKICAgICAgICByZWRpcmVjdF9sb2NhdGlvbiA9IE5vbmUKCiAgICAgICAgaWYgZXJyb3IgYW5kIHNlbGYuX2lzX2Nvbm5lY3Rpb25fZXJyb3IoZXJyb3IpOgogICAgICAgICAgICAjIENvbm5lY3QgcmV0cnk/CiAgICAgICAgICAgIGlmIGNvbm5lY3QgaXMgRmFsc2U6CiAgICAgICAgICAgICAgICByYWlzZSBzaXgucmVyYWlzZSh0eXBlKGVycm9yKSwgZXJyb3IsIF9zdGFja3RyYWNlKQogICAgICAgICAgICBlbGlmIGNvbm5lY3QgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBjb25uZWN0IC09IDEKCiAgICAgICAgZWxpZiBlcnJvciBhbmQgc2VsZi5faXNfcmVhZF9lcnJvcihlcnJvcik6CiAgICAgICAgICAgICMgUmVhZCByZXRyeT8KICAgICAgICAgICAgaWYgcmVhZCBpcyBGYWxzZSBvciBub3Qgc2VsZi5faXNfbWV0aG9kX3JldHJ5YWJsZShtZXRob2QpOgogICAgICAgICAgICAgICAgcmFpc2Ugc2l4LnJlcmFpc2UodHlwZShlcnJvciksIGVycm9yLCBfc3RhY2t0cmFjZSkKICAgICAgICAgICAgZWxpZiByZWFkIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgcmVhZCAtPSAxCgogICAgICAgIGVsaWYgcmVzcG9uc2UgYW5kIHJlc3BvbnNlLmdldF9yZWRpcmVjdF9sb2NhdGlvbigpOgogICAgICAgICAgICAjIFJlZGlyZWN0IHJldHJ5PwogICAgICAgICAgICBpZiByZWRpcmVjdCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHJlZGlyZWN0IC09IDEKICAgICAgICAgICAgY2F1c2UgPSAndG9vIG1hbnkgcmVkaXJlY3RzJwogICAgICAgICAgICByZWRpcmVjdF9sb2NhdGlvbiA9IHJlc3BvbnNlLmdldF9yZWRpcmVjdF9sb2NhdGlvbigpCiAgICAgICAgICAgIHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cwoKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIEluY3JlbWVudGluZyBiZWNhdXNlIG9mIGEgc2VydmVyIGVycm9yIGxpa2UgYSA1MDAgaW4KICAgICAgICAgICAgIyBzdGF0dXNfZm9yY2VsaXN0IGFuZCBhIHRoZSBnaXZlbiBtZXRob2QgaXMgaW4gdGhlIHdoaXRlbGlzdAogICAgICAgICAgICBjYXVzZSA9IFJlc3BvbnNlRXJyb3IuR0VORVJJQ19FUlJPUgogICAgICAgICAgICBpZiByZXNwb25zZSBhbmQgcmVzcG9uc2Uuc3RhdHVzOgogICAgICAgICAgICAgICAgaWYgc3RhdHVzX2NvdW50IGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgIHN0YXR1c19jb3VudCAtPSAxCiAgICAgICAgICAgICAgICBjYXVzZSA9IFJlc3BvbnNlRXJyb3IuU1BFQ0lGSUNfRVJST1IuZm9ybWF0KAogICAgICAgICAgICAgICAgICAgIHN0YXR1c19jb2RlPXJlc3BvbnNlLnN0YXR1cykKICAgICAgICAgICAgICAgIHN0YXR1cyA9IHJlc3BvbnNlLnN0YXR1cwoKICAgICAgICBoaXN0b3J5ID0gc2VsZi5oaXN0b3J5ICsgKFJlcXVlc3RIaXN0b3J5KG1ldGhvZCwgdXJsLCBlcnJvciwgc3RhdHVzLCByZWRpcmVjdF9sb2NhdGlvbiksKQoKICAgICAgICBuZXdfcmV0cnkgPSBzZWxmLm5ldygKICAgICAgICAgICAgdG90YWw9dG90YWwsCiAgICAgICAgICAgIGNvbm5lY3Q9Y29ubmVjdCwgcmVhZD1yZWFkLCByZWRpcmVjdD1yZWRpcmVjdCwgc3RhdHVzPXN0YXR1c19jb3VudCwKICAgICAgICAgICAgaGlzdG9yeT1oaXN0b3J5KQoKICAgICAgICBpZiBuZXdfcmV0cnkuaXNfZXhoYXVzdGVkKCk6CiAgICAgICAgICAgIHJhaXNlIE1heFJldHJ5RXJyb3IoX3Bvb2wsIHVybCwgZXJyb3Igb3IgUmVzcG9uc2VFcnJvcihjYXVzZSkpCgogICAgICAgIGxvZy5kZWJ1ZygiSW5jcmVtZW50ZWQgUmV0cnkgZm9yICh1cmw9JyVzJyk6ICVyIiwgdXJsLCBuZXdfcmV0cnkpCgogICAgICAgIHJldHVybiBuZXdfcmV0cnkKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICgne2Nscy5fX25hbWVfX30odG90YWw9e3NlbGYudG90YWx9LCBjb25uZWN0PXtzZWxmLmNvbm5lY3R9LCAnCiAgICAgICAgICAgICAgICAncmVhZD17c2VsZi5yZWFkfSwgcmVkaXJlY3Q9e3NlbGYucmVkaXJlY3R9LCBzdGF0dXM9e3NlbGYuc3RhdHVzfSknKS5mb3JtYXQoCiAgICAgICAgICAgICAgICAgICAgY2xzPXR5cGUoc2VsZiksIHNlbGY9c2VsZikKCgojIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAoZXF1aXZhbGVudCB0byBwcmUtdjEuOSk6ClJldHJ5LkRFRkFVTFQgPSBSZXRyeSgzKQpQSwMEFAAAAAAAAAAhAH3POz2bUgAAm1IAADUAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL3NlbGVjdG9ycy5weSMgQmFja3BvcnQgb2Ygc2VsZWN0b3JzLnB5IGZyb20gUHl0aG9uIDMuNSsgdG8gc3VwcG9ydCBQeXRob24gPCAzLjQKIyBBbHNvIGhhcyB0aGUgYmVoYXZpb3Igc3BlY2lmaWVkIGluIFBFUCA0NzUgd2hpY2ggaXMgdG8gcmV0cnkgc3lzY2FsbHMKIyBpbiB0aGUgY2FzZSBvZiBhbiBFSU5UUiBlcnJvci4gVGhpcyBtb2R1bGUgaXMgcmVxdWlyZWQgYmVjYXVzZSBzZWxlY3RvcnMzNAojIGRvZXMgbm90IGZvbGxvdyB0aGlzIGJlaGF2aW9yIGFuZCBpbnN0ZWFkIHJldHVybnMgdGhhdCBubyBkaWxlIGRlc2NyaXB0b3IKIyBldmVudHMgaGF2ZSBvY2N1cnJlZCByYXRoZXIgdGhhbiByZXRyeSB0aGUgc3lzY2FsbC4gVGhlIGRlY2lzaW9uIHRvIGRyb3AKIyBzdXBwb3J0IGZvciBzZWxlY3QuZGV2cG9sbCBpcyBtYWRlIHRvIG1haW50YWluIDEwMCUgdGVzdCBjb3ZlcmFnZS4KCmltcG9ydCBlcnJubwppbXBvcnQgbWF0aAppbXBvcnQgc2VsZWN0CmltcG9ydCBzb2NrZXQKaW1wb3J0IHN5cwppbXBvcnQgdGltZQpmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBuYW1lZHR1cGxlLCBNYXBwaW5nCgp0cnk6CiAgICBtb25vdG9uaWMgPSB0aW1lLm1vbm90b25pYwpleGNlcHQgKEF0dHJpYnV0ZUVycm9yLCBJbXBvcnRFcnJvcik6ICAjIFB5dGhvbiAzLjM8CiAgICBtb25vdG9uaWMgPSB0aW1lLnRpbWUKCkVWRU5UX1JFQUQgPSAoMSA8PCAwKQpFVkVOVF9XUklURSA9ICgxIDw8IDEpCgpIQVNfU0VMRUNUID0gVHJ1ZSAgIyBWYXJpYWJsZSB0aGF0IHNob3dzIHdoZXRoZXIgdGhlIHBsYXRmb3JtIGhhcyBhIHNlbGVjdG9yLgpfU1lTQ0FMTF9TRU5USU5FTCA9IG9iamVjdCgpICAjIFNlbnRpbmVsIGluIGNhc2UgYSBzeXN0ZW0gY2FsbCByZXR1cm5zIE5vbmUuCl9ERUZBVUxUX1NFTEVDVE9SID0gTm9uZQoKCmNsYXNzIFNlbGVjdG9yRXJyb3IoRXhjZXB0aW9uKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlcnJjb2RlKToKICAgICAgICBzdXBlcihTZWxlY3RvckVycm9yLCBzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5lcnJubyA9IGVycmNvZGUKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICI8U2VsZWN0b3JFcnJvciBlcnJubz17MH0+Ii5mb3JtYXQoc2VsZi5lcnJubykKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fX3JlcHJfXygpCgoKZGVmIF9maWxlb2JqX3RvX2ZkKGZpbGVvYmopOgogICAgIiIiIFJldHVybiBhIGZpbGUgZGVzY3JpcHRvciBmcm9tIGEgZmlsZSBvYmplY3QuIElmCiAgICBnaXZlbiBhbiBpbnRlZ2VyIHdpbGwgc2ltcGx5IHJldHVybiB0aGF0IGludGVnZXIgYmFjay4gIiIiCiAgICBpZiBpc2luc3RhbmNlKGZpbGVvYmosIGludCk6CiAgICAgICAgZmQgPSBmaWxlb2JqCiAgICBlbHNlOgogICAgICAgIHRyeToKICAgICAgICAgICAgZmQgPSBpbnQoZmlsZW9iai5maWxlbm8oKSkKICAgICAgICBleGNlcHQgKEF0dHJpYnV0ZUVycm9yLCBUeXBlRXJyb3IsIFZhbHVlRXJyb3IpOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJbnZhbGlkIGZpbGUgb2JqZWN0OiB7MCFyfSIuZm9ybWF0KGZpbGVvYmopKQogICAgaWYgZmQgPCAwOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkludmFsaWQgZmlsZSBkZXNjcmlwdG9yOiB7MH0iLmZvcm1hdChmZCkpCiAgICByZXR1cm4gZmQKCgojIERldGVybWluZSB3aGljaCBmdW5jdGlvbiB0byB1c2UgdG8gd3JhcCBzeXN0ZW0gY2FsbHMgYmVjYXVzZSBQeXRob24gMy41KwojIGFscmVhZHkgaGFuZGxlcyB0aGUgY2FzZSB3aGVuIHN5c3RlbSBjYWxscyBhcmUgaW50ZXJydXB0ZWQuCmlmIHN5cy52ZXJzaW9uX2luZm8gPj0gKDMsIDUpOgogICAgZGVmIF9zeXNjYWxsX3dyYXBwZXIoZnVuYywgXywgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAiIiIgVGhpcyBpcyB0aGUgc2hvcnQtY2lyY3VpdCB2ZXJzaW9uIG9mIHRoZSBiZWxvdyBsb2dpYwogICAgICAgIGJlY2F1c2UgaW4gUHl0aG9uIDMuNSsgYWxsIHN5c3RlbSBjYWxscyBhdXRvbWF0aWNhbGx5IHJlc3RhcnQKICAgICAgICBhbmQgcmVjYWxjdWxhdGUgdGhlaXIgdGltZW91dHMuICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIGZ1bmMoKmFyZ3MsICoqa3dhcmdzKQogICAgICAgIGV4Y2VwdCAoT1NFcnJvciwgSU9FcnJvciwgc2VsZWN0LmVycm9yKSBhcyBlOgogICAgICAgICAgICBlcnJjb2RlID0gTm9uZQogICAgICAgICAgICBpZiBoYXNhdHRyKGUsICJlcnJubyIpOgogICAgICAgICAgICAgICAgZXJyY29kZSA9IGUuZXJybm8KICAgICAgICAgICAgcmFpc2UgU2VsZWN0b3JFcnJvcihlcnJjb2RlKQplbHNlOgogICAgZGVmIF9zeXNjYWxsX3dyYXBwZXIoZnVuYywgcmVjYWxjX3RpbWVvdXQsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgIiIiIFdyYXBwZXIgZnVuY3Rpb24gZm9yIHN5c2NhbGxzIHRoYXQgY291bGQgZmFpbCBkdWUgdG8gRUlOVFIuCiAgICAgICAgQWxsIGZ1bmN0aW9ucyBzaG91bGQgYmUgcmV0cmllZCBpZiB0aGVyZSBpcyB0aW1lIGxlZnQgaW4gdGhlIHRpbWVvdXQKICAgICAgICBpbiBhY2NvcmRhbmNlIHdpdGggUEVQIDQ3NS4gIiIiCiAgICAgICAgdGltZW91dCA9IGt3YXJncy5nZXQoInRpbWVvdXQiLCBOb25lKQogICAgICAgIGlmIHRpbWVvdXQgaXMgTm9uZToKICAgICAgICAgICAgZXhwaXJlcyA9IE5vbmUKICAgICAgICAgICAgcmVjYWxjX3RpbWVvdXQgPSBGYWxzZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHRpbWVvdXQgPSBmbG9hdCh0aW1lb3V0KQogICAgICAgICAgICBpZiB0aW1lb3V0IDwgMC4wOiAgIyBUaW1lb3V0IGxlc3MgdGhhbiAwIHRyZWF0ZWQgYXMgbm8gdGltZW91dC4KICAgICAgICAgICAgICAgIGV4cGlyZXMgPSBOb25lCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBleHBpcmVzID0gbW9ub3RvbmljKCkgKyB0aW1lb3V0CgogICAgICAgIGFyZ3MgPSBsaXN0KGFyZ3MpCiAgICAgICAgaWYgcmVjYWxjX3RpbWVvdXQgYW5kICJ0aW1lb3V0IiBub3QgaW4ga3dhcmdzOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAogICAgICAgICAgICAgICAgIlRpbWVvdXQgbXVzdCBiZSBpbiBhcmdzIG9yIGt3YXJncyB0byBiZSByZWNhbGN1bGF0ZWQiKQoKICAgICAgICByZXN1bHQgPSBfU1lTQ0FMTF9TRU5USU5FTAogICAgICAgIHdoaWxlIHJlc3VsdCBpcyBfU1lTQ0FMTF9TRU5USU5FTDoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmVzdWx0ID0gZnVuYygqYXJncywgKiprd2FyZ3MpCiAgICAgICAgICAgICMgT1NFcnJvciBpcyB0aHJvd24gYnkgc2VsZWN0LnNlbGVjdAogICAgICAgICAgICAjIElPRXJyb3IgaXMgdGhyb3duIGJ5IHNlbGVjdC5lcG9sbC5wb2xsCiAgICAgICAgICAgICMgc2VsZWN0LmVycm9yIGlzIHRocm93biBieSBzZWxlY3QucG9sbC5wb2xsCiAgICAgICAgICAgICMgQXJlbid0IHdlIHRoYW5rZnVsIGZvciBQeXRob24gMy54IHJld29yayBmb3IgZXhjZXB0aW9ucz8KICAgICAgICAgICAgZXhjZXB0IChPU0Vycm9yLCBJT0Vycm9yLCBzZWxlY3QuZXJyb3IpIGFzIGU6CiAgICAgICAgICAgICAgICAjIHNlbGVjdC5lcnJvciB3YXNuJ3QgYSBzdWJjbGFzcyBvZiBPU0Vycm9yIGluIHRoZSBwYXN0LgogICAgICAgICAgICAgICAgZXJyY29kZSA9IE5vbmUKICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIoZSwgImVycm5vIik6CiAgICAgICAgICAgICAgICAgICAgZXJyY29kZSA9IGUuZXJybm8KICAgICAgICAgICAgICAgIGVsaWYgaGFzYXR0cihlLCAiYXJncyIpOgogICAgICAgICAgICAgICAgICAgIGVycmNvZGUgPSBlLmFyZ3NbMF0KCiAgICAgICAgICAgICAgICAjIEFsc28gdGVzdCBmb3IgdGhlIFdpbmRvd3MgZXF1aXZhbGVudCBvZiBFSU5UUi4KICAgICAgICAgICAgICAgIGlzX2ludGVycnVwdCA9IChlcnJjb2RlID09IGVycm5vLkVJTlRSIG9yIChoYXNhdHRyKGVycm5vLCAiV1NBRUlOVFIiKSBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJjb2RlID09IGVycm5vLldTQUVJTlRSKSkKCiAgICAgICAgICAgICAgICBpZiBpc19pbnRlcnJ1cHQ6CiAgICAgICAgICAgICAgICAgICAgaWYgZXhwaXJlcyBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF90aW1lID0gbW9ub3RvbmljKCkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgY3VycmVudF90aW1lID4gZXhwaXJlczoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIE9TRXJyb3IoZXJybm89ZXJybm8uRVRJTUVET1VUKQogICAgICAgICAgICAgICAgICAgICAgICBpZiByZWNhbGNfdGltZW91dDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICJ0aW1lb3V0IiBpbiBrd2FyZ3M6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3dhcmdzWyJ0aW1lb3V0Il0gPSBleHBpcmVzIC0gY3VycmVudF90aW1lCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIGlmIGVycmNvZGU6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgU2VsZWN0b3JFcnJvcihlcnJjb2RlKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICByYWlzZQogICAgICAgIHJldHVybiByZXN1bHQKCgpTZWxlY3RvcktleSA9IG5hbWVkdHVwbGUoJ1NlbGVjdG9yS2V5JywgWydmaWxlb2JqJywgJ2ZkJywgJ2V2ZW50cycsICdkYXRhJ10pCgoKY2xhc3MgX1NlbGVjdG9yTWFwcGluZyhNYXBwaW5nKToKICAgICIiIiBNYXBwaW5nIG9mIGZpbGUgb2JqZWN0cyB0byBzZWxlY3RvciBrZXlzICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZWxlY3Rvcik6CiAgICAgICAgc2VsZi5fc2VsZWN0b3IgPSBzZWxlY3RvcgoKICAgIGRlZiBfX2xlbl9fKHNlbGYpOgogICAgICAgIHJldHVybiBsZW4oc2VsZi5fc2VsZWN0b3IuX2ZkX3RvX2tleSkKCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgZmlsZW9iaik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBmZCA9IHNlbGYuX3NlbGVjdG9yLl9maWxlb2JqX2xvb2t1cChmaWxlb2JqKQogICAgICAgICAgICByZXR1cm4gc2VsZi5fc2VsZWN0b3IuX2ZkX3RvX2tleVtmZF0KICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCJ7MCFyfSBpcyBub3QgcmVnaXN0ZXJlZC4iLmZvcm1hdChmaWxlb2JqKSkKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGl0ZXIoc2VsZi5fc2VsZWN0b3IuX2ZkX3RvX2tleSkKCgpjbGFzcyBCYXNlU2VsZWN0b3Iob2JqZWN0KToKICAgICIiIiBBYnN0cmFjdCBTZWxlY3RvciBjbGFzcwoKICAgIEEgc2VsZWN0b3Igc3VwcG9ydHMgcmVnaXN0ZXJpbmcgZmlsZSBvYmplY3RzIHRvIGJlIG1vbml0b3JlZAogICAgZm9yIHNwZWNpZmljIEkvTyBldmVudHMuCgogICAgQSBmaWxlIG9iamVjdCBpcyBhIGZpbGUgZGVzY3JpcHRvciBvciBhbnkgb2JqZWN0IHdpdGggYQogICAgYGZpbGVubygpYCBtZXRob2QuIEFuIGFyYml0cmFyeSBvYmplY3QgY2FuIGJlIGF0dGFjaGVkIHRvIHRoZQogICAgZmlsZSBvYmplY3Qgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIGV4YW1wbGUgdG8gc3RvcmUgY29udGV4dCBpbmZvLAogICAgYSBjYWxsYmFjaywgZXRjLgoKICAgIEEgc2VsZWN0b3IgY2FuIHVzZSB2YXJpb3VzIGltcGxlbWVudGF0aW9ucyAoc2VsZWN0KCksIHBvbGwoKSwgZXBvbGwoKSwKICAgIGFuZCBrcXVldWUoKSkgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybS4gVGhlICdEZWZhdWx0U2VsZWN0b3InIGNsYXNzIHVzZXMKICAgIHRoZSBtb3N0IGVmZmljaWVudCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIGN1cnJlbnQgcGxhdGZvcm0uCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAjIE1hcHMgZmlsZSBkZXNjcmlwdG9ycyB0byBrZXlzLgogICAgICAgIHNlbGYuX2ZkX3RvX2tleSA9IHt9CgogICAgICAgICMgUmVhZC1vbmx5IG1hcHBpbmcgcmV0dXJuZWQgYnkgZ2V0X21hcCgpCiAgICAgICAgc2VsZi5fbWFwID0gX1NlbGVjdG9yTWFwcGluZyhzZWxmKQoKICAgIGRlZiBfZmlsZW9ial9sb29rdXAoc2VsZiwgZmlsZW9iaik6CiAgICAgICAgIiIiIFJldHVybiBhIGZpbGUgZGVzY3JpcHRvciBmcm9tIGEgZmlsZSBvYmplY3QuCiAgICAgICAgVGhpcyB3cmFwcyBfZmlsZW9ial90b19mZCgpIHRvIGRvIGFuIGV4aGF1c3RpdmUKICAgICAgICBzZWFyY2ggaW4gY2FzZSB0aGUgb2JqZWN0IGlzIGludmFsaWQgYnV0IHdlIHN0aWxsCiAgICAgICAgaGF2ZSBpdCBpbiBvdXIgbWFwLiBVc2VkIGJ5IHVucmVnaXN0ZXIoKSBzbyB3ZSBjYW4KICAgICAgICB1bnJlZ2lzdGVyIGFuIG9iamVjdCB0aGF0IHdhcyBwcmV2aW91c2x5IHJlZ2lzdGVyZWQKICAgICAgICBldmVuIGlmIGl0IGlzIGNsb3NlZC4gSXQgaXMgYWxzbyB1c2VkIGJ5IF9TZWxlY3Rvck1hcHBpbmcKICAgICAgICAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBfZmlsZW9ial90b19mZChmaWxlb2JqKQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgoKICAgICAgICAgICAgIyBTZWFyY2ggdGhyb3VnaCBhbGwgb3VyIG1hcHBlZCBrZXlzLgogICAgICAgICAgICBmb3Iga2V5IGluIHNlbGYuX2ZkX3RvX2tleS52YWx1ZXMoKToKICAgICAgICAgICAgICAgIGlmIGtleS5maWxlb2JqIGlzIGZpbGVvYmo6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtleS5mZAoKICAgICAgICAgICAgIyBSYWlzZSBWYWx1ZUVycm9yIGFmdGVyIGFsbC4KICAgICAgICAgICAgcmFpc2UKCiAgICBkZWYgcmVnaXN0ZXIoc2VsZiwgZmlsZW9iaiwgZXZlbnRzLCBkYXRhPU5vbmUpOgogICAgICAgICIiIiBSZWdpc3RlciBhIGZpbGUgb2JqZWN0IGZvciBhIHNldCBvZiBldmVudHMgdG8gbW9uaXRvci4gIiIiCiAgICAgICAgaWYgKG5vdCBldmVudHMpIG9yIChldmVudHMgJiB+KEVWRU5UX1JFQUQgfCBFVkVOVF9XUklURSkpOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJbnZhbGlkIGV2ZW50czogezAhcn0iLmZvcm1hdChldmVudHMpKQoKICAgICAgICBrZXkgPSBTZWxlY3RvcktleShmaWxlb2JqLCBzZWxmLl9maWxlb2JqX2xvb2t1cChmaWxlb2JqKSwgZXZlbnRzLCBkYXRhKQoKICAgICAgICBpZiBrZXkuZmQgaW4gc2VsZi5fZmRfdG9fa2V5OgogICAgICAgICAgICByYWlzZSBLZXlFcnJvcigiezAhcn0gKEZEIHsxfSkgaXMgYWxyZWFkeSByZWdpc3RlcmVkIgogICAgICAgICAgICAgICAgICAgICAgICAgICAuZm9ybWF0KGZpbGVvYmosIGtleS5mZCkpCgogICAgICAgIHNlbGYuX2ZkX3RvX2tleVtrZXkuZmRdID0ga2V5CiAgICAgICAgcmV0dXJuIGtleQoKICAgIGRlZiB1bnJlZ2lzdGVyKHNlbGYsIGZpbGVvYmopOgogICAgICAgICIiIiBVbnJlZ2lzdGVyIGEgZmlsZSBvYmplY3QgZnJvbSBiZWluZyBtb25pdG9yZWQuICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAga2V5ID0gc2VsZi5fZmRfdG9fa2V5LnBvcChzZWxmLl9maWxlb2JqX2xvb2t1cChmaWxlb2JqKSkKICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCJ7MCFyfSBpcyBub3QgcmVnaXN0ZXJlZCIuZm9ybWF0KGZpbGVvYmopKQoKICAgICAgICAjIEdldHRpbmcgdGhlIGZpbGVubyBvZiBhIGNsb3NlZCBzb2NrZXQgb24gV2luZG93cyBlcnJvcnMgd2l0aCBFQkFERi4KICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yIGFzIGU6ICAjIFBsYXRmb3JtLXNwZWNpZmljOiBXaW5kb3dzLgogICAgICAgICAgICBpZiBlLmVycm5vICE9IGVycm5vLkVCQURGOgogICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGZvciBrZXkgaW4gc2VsZi5fZmRfdG9fa2V5LnZhbHVlcygpOgogICAgICAgICAgICAgICAgICAgIGlmIGtleS5maWxlb2JqIGlzIGZpbGVvYmo6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2ZkX3RvX2tleS5wb3Aoa2V5LmZkKQogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICByYWlzZSBLZXlFcnJvcigiezAhcn0gaXMgbm90IHJlZ2lzdGVyZWQiLmZvcm1hdChmaWxlb2JqKSkKICAgICAgICByZXR1cm4ga2V5CgogICAgZGVmIG1vZGlmeShzZWxmLCBmaWxlb2JqLCBldmVudHMsIGRhdGE9Tm9uZSk6CiAgICAgICAgIiIiIENoYW5nZSBhIHJlZ2lzdGVyZWQgZmlsZSBvYmplY3QgbW9uaXRvcmVkIGV2ZW50cyBhbmQgZGF0YS4gIiIiCiAgICAgICAgIyBOT1RFOiBTb21lIHN1YmNsYXNzZXMgb3B0aW1pemUgdGhpcyBvcGVyYXRpb24gZXZlbiBmdXJ0aGVyLgogICAgICAgIHRyeToKICAgICAgICAgICAga2V5ID0gc2VsZi5fZmRfdG9fa2V5W3NlbGYuX2ZpbGVvYmpfbG9va3VwKGZpbGVvYmopXQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoInswIXJ9IGlzIG5vdCByZWdpc3RlcmVkIi5mb3JtYXQoZmlsZW9iaikpCgogICAgICAgIGlmIGV2ZW50cyAhPSBrZXkuZXZlbnRzOgogICAgICAgICAgICBzZWxmLnVucmVnaXN0ZXIoZmlsZW9iaikKICAgICAgICAgICAga2V5ID0gc2VsZi5yZWdpc3RlcihmaWxlb2JqLCBldmVudHMsIGRhdGEpCgogICAgICAgIGVsaWYgZGF0YSAhPSBrZXkuZGF0YToKICAgICAgICAgICAgIyBVc2UgYSBzaG9ydGN1dCB0byB1cGRhdGUgdGhlIGRhdGEuCiAgICAgICAgICAgIGtleSA9IGtleS5fcmVwbGFjZShkYXRhPWRhdGEpCiAgICAgICAgICAgIHNlbGYuX2ZkX3RvX2tleVtrZXkuZmRdID0ga2V5CgogICAgICAgIHJldHVybiBrZXkKCiAgICBkZWYgc2VsZWN0KHNlbGYsIHRpbWVvdXQ9Tm9uZSk6CiAgICAgICAgIiIiIFBlcmZvcm0gdGhlIGFjdHVhbCBzZWxlY3Rpb24gdW50aWwgc29tZSBtb25pdG9yZWQgZmlsZSBvYmplY3RzCiAgICAgICAgYXJlIHJlYWR5IG9yIHRoZSB0aW1lb3V0IGV4cGlyZXMuICIiIgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoKQoKICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICAiIiIgQ2xvc2UgdGhlIHNlbGVjdG9yLiBUaGlzIG11c3QgYmUgY2FsbGVkIHRvIGVuc3VyZSB0aGF0IGFsbAogICAgICAgIHVuZGVybHlpbmcgcmVzb3VyY2VzIGFyZSBmcmVlZC4gIiIiCiAgICAgICAgc2VsZi5fZmRfdG9fa2V5LmNsZWFyKCkKICAgICAgICBzZWxmLl9tYXAgPSBOb25lCgogICAgZGVmIGdldF9rZXkoc2VsZiwgZmlsZW9iaik6CiAgICAgICAgIiIiIFJldHVybiB0aGUga2V5IGFzc29jaWF0ZWQgd2l0aCBhIHJlZ2lzdGVyZWQgZmlsZSBvYmplY3QuICIiIgogICAgICAgIG1hcHBpbmcgPSBzZWxmLmdldF9tYXAoKQogICAgICAgIGlmIG1hcHBpbmcgaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJTZWxlY3RvciBpcyBjbG9zZWQiKQogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIG1hcHBpbmdbZmlsZW9ial0KICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCJ7MCFyfSBpcyBub3QgcmVnaXN0ZXJlZCIuZm9ybWF0KGZpbGVvYmopKQoKICAgIGRlZiBnZXRfbWFwKHNlbGYpOgogICAgICAgICIiIiBSZXR1cm4gYSBtYXBwaW5nIG9mIGZpbGUgb2JqZWN0cyB0byBzZWxlY3RvciBrZXlzICIiIgogICAgICAgIHJldHVybiBzZWxmLl9tYXAKCiAgICBkZWYgX2tleV9mcm9tX2ZkKHNlbGYsIGZkKToKICAgICAgICAiIiIgUmV0dXJuIHRoZSBrZXkgYXNzb2NpYXRlZCB0byBhIGdpdmVuIGZpbGUgZGVzY3JpcHRvcgogICAgICAgICBSZXR1cm4gTm9uZSBpZiBpdCBpcyBub3QgZm91bmQuICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2ZkX3RvX2tleVtmZF0KICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqYXJncyk6CiAgICAgICAgc2VsZi5jbG9zZSgpCgoKIyBBbG1vc3QgYWxsIHBsYXRmb3JtcyBoYXZlIHNlbGVjdC5zZWxlY3QoKQppZiBoYXNhdHRyKHNlbGVjdCwgInNlbGVjdCIpOgogICAgY2xhc3MgU2VsZWN0U2VsZWN0b3IoQmFzZVNlbGVjdG9yKToKICAgICAgICAiIiIgU2VsZWN0LWJhc2VkIHNlbGVjdG9yLiAiIiIKICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgICAgIHN1cGVyKFNlbGVjdFNlbGVjdG9yLCBzZWxmKS5fX2luaXRfXygpCiAgICAgICAgICAgIHNlbGYuX3JlYWRlcnMgPSBzZXQoKQogICAgICAgICAgICBzZWxmLl93cml0ZXJzID0gc2V0KCkKCiAgICAgICAgZGVmIHJlZ2lzdGVyKHNlbGYsIGZpbGVvYmosIGV2ZW50cywgZGF0YT1Ob25lKToKICAgICAgICAgICAga2V5ID0gc3VwZXIoU2VsZWN0U2VsZWN0b3IsIHNlbGYpLnJlZ2lzdGVyKGZpbGVvYmosIGV2ZW50cywgZGF0YSkKICAgICAgICAgICAgaWYgZXZlbnRzICYgRVZFTlRfUkVBRDoKICAgICAgICAgICAgICAgIHNlbGYuX3JlYWRlcnMuYWRkKGtleS5mZCkKICAgICAgICAgICAgaWYgZXZlbnRzICYgRVZFTlRfV1JJVEU6CiAgICAgICAgICAgICAgICBzZWxmLl93cml0ZXJzLmFkZChrZXkuZmQpCiAgICAgICAgICAgIHJldHVybiBrZXkKCiAgICAgICAgZGVmIHVucmVnaXN0ZXIoc2VsZiwgZmlsZW9iaik6CiAgICAgICAgICAgIGtleSA9IHN1cGVyKFNlbGVjdFNlbGVjdG9yLCBzZWxmKS51bnJlZ2lzdGVyKGZpbGVvYmopCiAgICAgICAgICAgIHNlbGYuX3JlYWRlcnMuZGlzY2FyZChrZXkuZmQpCiAgICAgICAgICAgIHNlbGYuX3dyaXRlcnMuZGlzY2FyZChrZXkuZmQpCiAgICAgICAgICAgIHJldHVybiBrZXkKCiAgICAgICAgZGVmIF9zZWxlY3Qoc2VsZiwgciwgdywgdGltZW91dD1Ob25lKToKICAgICAgICAgICAgIiIiIFdyYXBwZXIgZm9yIHNlbGVjdC5zZWxlY3QgYmVjYXVzZSB0aW1lb3V0IGlzIGEgcG9zaXRpb25hbCBhcmcgIiIiCiAgICAgICAgICAgIHJldHVybiBzZWxlY3Quc2VsZWN0KHIsIHcsIFtdLCB0aW1lb3V0KQoKICAgICAgICBkZWYgc2VsZWN0KHNlbGYsIHRpbWVvdXQ9Tm9uZSk6CiAgICAgICAgICAgICMgU2VsZWN0aW5nIG9uIGVtcHR5IGxpc3RzIG9uIFdpbmRvd3MgZXJyb3JzIG91dC4KICAgICAgICAgICAgaWYgbm90IGxlbihzZWxmLl9yZWFkZXJzKSBhbmQgbm90IGxlbihzZWxmLl93cml0ZXJzKToKICAgICAgICAgICAgICAgIHJldHVybiBbXQoKICAgICAgICAgICAgdGltZW91dCA9IE5vbmUgaWYgdGltZW91dCBpcyBOb25lIGVsc2UgbWF4KHRpbWVvdXQsIDAuMCkKICAgICAgICAgICAgcmVhZHkgPSBbXQogICAgICAgICAgICByLCB3LCBfID0gX3N5c2NhbGxfd3JhcHBlcihzZWxmLl9zZWxlY3QsIFRydWUsIHNlbGYuX3JlYWRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3dyaXRlcnMsIHRpbWVvdXQpCiAgICAgICAgICAgIHIgPSBzZXQocikKICAgICAgICAgICAgdyA9IHNldCh3KQogICAgICAgICAgICBmb3IgZmQgaW4gciB8IHc6CiAgICAgICAgICAgICAgICBldmVudHMgPSAwCiAgICAgICAgICAgICAgICBpZiBmZCBpbiByOgogICAgICAgICAgICAgICAgICAgIGV2ZW50cyB8PSBFVkVOVF9SRUFECiAgICAgICAgICAgICAgICBpZiBmZCBpbiB3OgogICAgICAgICAgICAgICAgICAgIGV2ZW50cyB8PSBFVkVOVF9XUklURQoKICAgICAgICAgICAgICAgIGtleSA9IHNlbGYuX2tleV9mcm9tX2ZkKGZkKQogICAgICAgICAgICAgICAgaWYga2V5OgogICAgICAgICAgICAgICAgICAgIHJlYWR5LmFwcGVuZCgoa2V5LCBldmVudHMgJiBrZXkuZXZlbnRzKSkKICAgICAgICAgICAgcmV0dXJuIHJlYWR5CgoKaWYgaGFzYXR0cihzZWxlY3QsICJwb2xsIik6CiAgICBjbGFzcyBQb2xsU2VsZWN0b3IoQmFzZVNlbGVjdG9yKToKICAgICAgICAiIiIgUG9sbC1iYXNlZCBzZWxlY3RvciAiIiIKICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgICAgIHN1cGVyKFBvbGxTZWxlY3Rvciwgc2VsZikuX19pbml0X18oKQogICAgICAgICAgICBzZWxmLl9wb2xsID0gc2VsZWN0LnBvbGwoKQoKICAgICAgICBkZWYgcmVnaXN0ZXIoc2VsZiwgZmlsZW9iaiwgZXZlbnRzLCBkYXRhPU5vbmUpOgogICAgICAgICAgICBrZXkgPSBzdXBlcihQb2xsU2VsZWN0b3IsIHNlbGYpLnJlZ2lzdGVyKGZpbGVvYmosIGV2ZW50cywgZGF0YSkKICAgICAgICAgICAgZXZlbnRfbWFzayA9IDAKICAgICAgICAgICAgaWYgZXZlbnRzICYgRVZFTlRfUkVBRDoKICAgICAgICAgICAgICAgIGV2ZW50X21hc2sgfD0gc2VsZWN0LlBPTExJTgogICAgICAgICAgICBpZiBldmVudHMgJiBFVkVOVF9XUklURToKICAgICAgICAgICAgICAgIGV2ZW50X21hc2sgfD0gc2VsZWN0LlBPTExPVVQKICAgICAgICAgICAgc2VsZi5fcG9sbC5yZWdpc3RlcihrZXkuZmQsIGV2ZW50X21hc2spCiAgICAgICAgICAgIHJldHVybiBrZXkKCiAgICAgICAgZGVmIHVucmVnaXN0ZXIoc2VsZiwgZmlsZW9iaik6CiAgICAgICAgICAgIGtleSA9IHN1cGVyKFBvbGxTZWxlY3Rvciwgc2VsZikudW5yZWdpc3RlcihmaWxlb2JqKQogICAgICAgICAgICBzZWxmLl9wb2xsLnVucmVnaXN0ZXIoa2V5LmZkKQogICAgICAgICAgICByZXR1cm4ga2V5CgogICAgICAgIGRlZiBfd3JhcF9wb2xsKHNlbGYsIHRpbWVvdXQ9Tm9uZSk6CiAgICAgICAgICAgICIiIiBXcmFwcGVyIGZ1bmN0aW9uIGZvciBzZWxlY3QucG9sbC5wb2xsKCkgc28gdGhhdAogICAgICAgICAgICBfc3lzY2FsbF93cmFwcGVyIGNhbiB3b3JrIHdpdGggb25seSBzZWNvbmRzLiAiIiIKICAgICAgICAgICAgaWYgdGltZW91dCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIGlmIHRpbWVvdXQgPD0gMDoKICAgICAgICAgICAgICAgICAgICB0aW1lb3V0ID0gMAogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAjIHNlbGVjdC5wb2xsLnBvbGwoKSBoYXMgYSByZXNvbHV0aW9uIG9mIDEgbWlsbGlzZWNvbmQsCiAgICAgICAgICAgICAgICAgICAgIyByb3VuZCBhd2F5IGZyb20gemVybyB0byB3YWl0ICphdCBsZWFzdCogdGltZW91dCBzZWNvbmRzLgogICAgICAgICAgICAgICAgICAgIHRpbWVvdXQgPSBtYXRoLmNlaWwodGltZW91dCAqIDFlMykKCiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuX3BvbGwucG9sbCh0aW1lb3V0KQogICAgICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgICAgIGRlZiBzZWxlY3Qoc2VsZiwgdGltZW91dD1Ob25lKToKICAgICAgICAgICAgcmVhZHkgPSBbXQogICAgICAgICAgICBmZF9ldmVudHMgPSBfc3lzY2FsbF93cmFwcGVyKHNlbGYuX3dyYXBfcG9sbCwgVHJ1ZSwgdGltZW91dD10aW1lb3V0KQogICAgICAgICAgICBmb3IgZmQsIGV2ZW50X21hc2sgaW4gZmRfZXZlbnRzOgogICAgICAgICAgICAgICAgZXZlbnRzID0gMAogICAgICAgICAgICAgICAgaWYgZXZlbnRfbWFzayAmIH5zZWxlY3QuUE9MTElOOgogICAgICAgICAgICAgICAgICAgIGV2ZW50cyB8PSBFVkVOVF9XUklURQogICAgICAgICAgICAgICAgaWYgZXZlbnRfbWFzayAmIH5zZWxlY3QuUE9MTE9VVDoKICAgICAgICAgICAgICAgICAgICBldmVudHMgfD0gRVZFTlRfUkVBRAoKICAgICAgICAgICAgICAgIGtleSA9IHNlbGYuX2tleV9mcm9tX2ZkKGZkKQogICAgICAgICAgICAgICAgaWYga2V5OgogICAgICAgICAgICAgICAgICAgIHJlYWR5LmFwcGVuZCgoa2V5LCBldmVudHMgJiBrZXkuZXZlbnRzKSkKCiAgICAgICAgICAgIHJldHVybiByZWFkeQoKCmlmIGhhc2F0dHIoc2VsZWN0LCAiZXBvbGwiKToKICAgIGNsYXNzIEVwb2xsU2VsZWN0b3IoQmFzZVNlbGVjdG9yKToKICAgICAgICAiIiIgRXBvbGwtYmFzZWQgc2VsZWN0b3IgIiIiCiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgICAgICBzdXBlcihFcG9sbFNlbGVjdG9yLCBzZWxmKS5fX2luaXRfXygpCiAgICAgICAgICAgIHNlbGYuX2Vwb2xsID0gc2VsZWN0LmVwb2xsKCkKCiAgICAgICAgZGVmIGZpbGVubyhzZWxmKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2Vwb2xsLmZpbGVubygpCgogICAgICAgIGRlZiByZWdpc3RlcihzZWxmLCBmaWxlb2JqLCBldmVudHMsIGRhdGE9Tm9uZSk6CiAgICAgICAgICAgIGtleSA9IHN1cGVyKEVwb2xsU2VsZWN0b3IsIHNlbGYpLnJlZ2lzdGVyKGZpbGVvYmosIGV2ZW50cywgZGF0YSkKICAgICAgICAgICAgZXZlbnRzX21hc2sgPSAwCiAgICAgICAgICAgIGlmIGV2ZW50cyAmIEVWRU5UX1JFQUQ6CiAgICAgICAgICAgICAgICBldmVudHNfbWFzayB8PSBzZWxlY3QuRVBPTExJTgogICAgICAgICAgICBpZiBldmVudHMgJiBFVkVOVF9XUklURToKICAgICAgICAgICAgICAgIGV2ZW50c19tYXNrIHw9IHNlbGVjdC5FUE9MTE9VVAogICAgICAgICAgICBfc3lzY2FsbF93cmFwcGVyKHNlbGYuX2Vwb2xsLnJlZ2lzdGVyLCBGYWxzZSwga2V5LmZkLCBldmVudHNfbWFzaykKICAgICAgICAgICAgcmV0dXJuIGtleQoKICAgICAgICBkZWYgdW5yZWdpc3RlcihzZWxmLCBmaWxlb2JqKToKICAgICAgICAgICAga2V5ID0gc3VwZXIoRXBvbGxTZWxlY3Rvciwgc2VsZikudW5yZWdpc3RlcihmaWxlb2JqKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBfc3lzY2FsbF93cmFwcGVyKHNlbGYuX2Vwb2xsLnVucmVnaXN0ZXIsIEZhbHNlLCBrZXkuZmQpCiAgICAgICAgICAgIGV4Y2VwdCBTZWxlY3RvckVycm9yOgogICAgICAgICAgICAgICAgIyBUaGlzIGNhbiBvY2N1ciB3aGVuIHRoZSBmZCB3YXMgY2xvc2VkIHNpbmNlIHJlZ2lzdHJ5LgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICByZXR1cm4ga2V5CgogICAgICAgIGRlZiBzZWxlY3Qoc2VsZiwgdGltZW91dD1Ob25lKToKICAgICAgICAgICAgaWYgdGltZW91dCBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIGlmIHRpbWVvdXQgPD0gMDoKICAgICAgICAgICAgICAgICAgICB0aW1lb3V0ID0gMC4wCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICMgc2VsZWN0LmVwb2xsLnBvbGwoKSBoYXMgYSByZXNvbHV0aW9uIG9mIDEgbWlsbGlzZWNvbmQKICAgICAgICAgICAgICAgICAgICAjIGJ1dCBsdWNraWx5IHRha2VzIHNlY29uZHMgc28gd2UgZG9uJ3QgbmVlZCBhIHdyYXBwZXIKICAgICAgICAgICAgICAgICAgICAjIGxpa2UgUG9sbFNlbGVjdG9yLiBKdXN0IGZvciBiZXR0ZXIgcm91bmRpbmcuCiAgICAgICAgICAgICAgICAgICAgdGltZW91dCA9IG1hdGguY2VpbCh0aW1lb3V0ICogMWUzKSAqIDFlLTMKICAgICAgICAgICAgICAgIHRpbWVvdXQgPSBmbG9hdCh0aW1lb3V0KQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgdGltZW91dCA9IC0xLjAgICMgZXBvbGwucG9sbCgpIG11c3QgaGF2ZSBhIGZsb2F0LgoKICAgICAgICAgICAgIyBXZSBhbHdheXMgd2FudCBhdCBsZWFzdCAxIHRvIGVuc3VyZSB0aGF0IHNlbGVjdCBjYW4gYmUgY2FsbGVkCiAgICAgICAgICAgICMgd2l0aCBubyBmaWxlIGRlc2NyaXB0b3JzIHJlZ2lzdGVyZWQuIE90aGVyd2lzZSB3aWxsIGZhaWwuCiAgICAgICAgICAgIG1heF9ldmVudHMgPSBtYXgobGVuKHNlbGYuX2ZkX3RvX2tleSksIDEpCgogICAgICAgICAgICByZWFkeSA9IFtdCiAgICAgICAgICAgIGZkX2V2ZW50cyA9IF9zeXNjYWxsX3dyYXBwZXIoc2VsZi5fZXBvbGwucG9sbCwgVHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0PXRpbWVvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4ZXZlbnRzPW1heF9ldmVudHMpCiAgICAgICAgICAgIGZvciBmZCwgZXZlbnRfbWFzayBpbiBmZF9ldmVudHM6CiAgICAgICAgICAgICAgICBldmVudHMgPSAwCiAgICAgICAgICAgICAgICBpZiBldmVudF9tYXNrICYgfnNlbGVjdC5FUE9MTElOOgogICAgICAgICAgICAgICAgICAgIGV2ZW50cyB8PSBFVkVOVF9XUklURQogICAgICAgICAgICAgICAgaWYgZXZlbnRfbWFzayAmIH5zZWxlY3QuRVBPTExPVVQ6CiAgICAgICAgICAgICAgICAgICAgZXZlbnRzIHw9IEVWRU5UX1JFQUQKCiAgICAgICAgICAgICAgICBrZXkgPSBzZWxmLl9rZXlfZnJvbV9mZChmZCkKICAgICAgICAgICAgICAgIGlmIGtleToKICAgICAgICAgICAgICAgICAgICByZWFkeS5hcHBlbmQoKGtleSwgZXZlbnRzICYga2V5LmV2ZW50cykpCiAgICAgICAgICAgIHJldHVybiByZWFkeQoKICAgICAgICBkZWYgY2xvc2Uoc2VsZik6CiAgICAgICAgICAgIHNlbGYuX2Vwb2xsLmNsb3NlKCkKICAgICAgICAgICAgc3VwZXIoRXBvbGxTZWxlY3Rvciwgc2VsZikuY2xvc2UoKQoKCmlmIGhhc2F0dHIoc2VsZWN0LCAia3F1ZXVlIik6CiAgICBjbGFzcyBLcXVldWVTZWxlY3RvcihCYXNlU2VsZWN0b3IpOgogICAgICAgICIiIiBLcXVldWUgLyBLZXZlbnQtYmFzZWQgc2VsZWN0b3IgIiIiCiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgICAgICBzdXBlcihLcXVldWVTZWxlY3Rvciwgc2VsZikuX19pbml0X18oKQogICAgICAgICAgICBzZWxmLl9rcXVldWUgPSBzZWxlY3Qua3F1ZXVlKCkKCiAgICAgICAgZGVmIGZpbGVubyhzZWxmKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2txdWV1ZS5maWxlbm8oKQoKICAgICAgICBkZWYgcmVnaXN0ZXIoc2VsZiwgZmlsZW9iaiwgZXZlbnRzLCBkYXRhPU5vbmUpOgogICAgICAgICAgICBrZXkgPSBzdXBlcihLcXVldWVTZWxlY3Rvciwgc2VsZikucmVnaXN0ZXIoZmlsZW9iaiwgZXZlbnRzLCBkYXRhKQogICAgICAgICAgICBpZiBldmVudHMgJiBFVkVOVF9SRUFEOgogICAgICAgICAgICAgICAga2V2ZW50ID0gc2VsZWN0LmtldmVudChrZXkuZmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdC5LUV9GSUxURVJfUkVBRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0LktRX0VWX0FERCkKCiAgICAgICAgICAgICAgICBfc3lzY2FsbF93cmFwcGVyKHNlbGYuX2txdWV1ZS5jb250cm9sLCBGYWxzZSwgW2tldmVudF0sIDAsIDApCgogICAgICAgICAgICBpZiBldmVudHMgJiBFVkVOVF9XUklURToKICAgICAgICAgICAgICAgIGtldmVudCA9IHNlbGVjdC5rZXZlbnQoa2V5LmZkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QuS1FfRklMVEVSX1dSSVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QuS1FfRVZfQUREKQoKICAgICAgICAgICAgICAgIF9zeXNjYWxsX3dyYXBwZXIoc2VsZi5fa3F1ZXVlLmNvbnRyb2wsIEZhbHNlLCBba2V2ZW50XSwgMCwgMCkKCiAgICAgICAgICAgIHJldHVybiBrZXkKCiAgICAgICAgZGVmIHVucmVnaXN0ZXIoc2VsZiwgZmlsZW9iaik6CiAgICAgICAgICAgIGtleSA9IHN1cGVyKEtxdWV1ZVNlbGVjdG9yLCBzZWxmKS51bnJlZ2lzdGVyKGZpbGVvYmopCiAgICAgICAgICAgIGlmIGtleS5ldmVudHMgJiBFVkVOVF9SRUFEOgogICAgICAgICAgICAgICAga2V2ZW50ID0gc2VsZWN0LmtldmVudChrZXkuZmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdC5LUV9GSUxURVJfUkVBRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0LktRX0VWX0RFTEVURSkKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBfc3lzY2FsbF93cmFwcGVyKHNlbGYuX2txdWV1ZS5jb250cm9sLCBGYWxzZSwgW2tldmVudF0sIDAsIDApCiAgICAgICAgICAgICAgICBleGNlcHQgU2VsZWN0b3JFcnJvcjoKICAgICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgIGlmIGtleS5ldmVudHMgJiBFVkVOVF9XUklURToKICAgICAgICAgICAgICAgIGtldmVudCA9IHNlbGVjdC5rZXZlbnQoa2V5LmZkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QuS1FfRklMVEVSX1dSSVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QuS1FfRVZfREVMRVRFKQogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIF9zeXNjYWxsX3dyYXBwZXIoc2VsZi5fa3F1ZXVlLmNvbnRyb2wsIEZhbHNlLCBba2V2ZW50XSwgMCwgMCkKICAgICAgICAgICAgICAgIGV4Y2VwdCBTZWxlY3RvckVycm9yOgogICAgICAgICAgICAgICAgICAgIHBhc3MKCiAgICAgICAgICAgIHJldHVybiBrZXkKCiAgICAgICAgZGVmIHNlbGVjdChzZWxmLCB0aW1lb3V0PU5vbmUpOgogICAgICAgICAgICBpZiB0aW1lb3V0IGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgdGltZW91dCA9IG1heCh0aW1lb3V0LCAwKQoKICAgICAgICAgICAgbWF4X2V2ZW50cyA9IGxlbihzZWxmLl9mZF90b19rZXkpICogMgogICAgICAgICAgICByZWFkeV9mZHMgPSB7fQoKICAgICAgICAgICAga2V2ZW50X2xpc3QgPSBfc3lzY2FsbF93cmFwcGVyKHNlbGYuX2txdWV1ZS5jb250cm9sLCBUcnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSwgbWF4X2V2ZW50cywgdGltZW91dCkKCiAgICAgICAgICAgIGZvciBrZXZlbnQgaW4ga2V2ZW50X2xpc3Q6CiAgICAgICAgICAgICAgICBmZCA9IGtldmVudC5pZGVudAogICAgICAgICAgICAgICAgZXZlbnRfbWFzayA9IGtldmVudC5maWx0ZXIKICAgICAgICAgICAgICAgIGV2ZW50cyA9IDAKICAgICAgICAgICAgICAgIGlmIGV2ZW50X21hc2sgPT0gc2VsZWN0LktRX0ZJTFRFUl9SRUFEOgogICAgICAgICAgICAgICAgICAgIGV2ZW50cyB8PSBFVkVOVF9SRUFECiAgICAgICAgICAgICAgICBpZiBldmVudF9tYXNrID09IHNlbGVjdC5LUV9GSUxURVJfV1JJVEU6CiAgICAgICAgICAgICAgICAgICAgZXZlbnRzIHw9IEVWRU5UX1dSSVRFCgogICAgICAgICAgICAgICAga2V5ID0gc2VsZi5fa2V5X2Zyb21fZmQoZmQpCiAgICAgICAgICAgICAgICBpZiBrZXk6CiAgICAgICAgICAgICAgICAgICAgaWYga2V5LmZkIG5vdCBpbiByZWFkeV9mZHM6CiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWR5X2Zkc1trZXkuZmRdID0gKGtleSwgZXZlbnRzICYga2V5LmV2ZW50cykKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBvbGRfZXZlbnRzID0gcmVhZHlfZmRzW2tleS5mZF1bMV0KICAgICAgICAgICAgICAgICAgICAgICAgcmVhZHlfZmRzW2tleS5mZF0gPSAoa2V5LCAoZXZlbnRzIHwgb2xkX2V2ZW50cykgJiBrZXkuZXZlbnRzKQoKICAgICAgICAgICAgcmV0dXJuIGxpc3QocmVhZHlfZmRzLnZhbHVlcygpKQoKICAgICAgICBkZWYgY2xvc2Uoc2VsZik6CiAgICAgICAgICAgIHNlbGYuX2txdWV1ZS5jbG9zZSgpCiAgICAgICAgICAgIHN1cGVyKEtxdWV1ZVNlbGVjdG9yLCBzZWxmKS5jbG9zZSgpCgoKaWYgbm90IGhhc2F0dHIoc2VsZWN0LCAnc2VsZWN0Jyk6ICAjIFBsYXRmb3JtLXNwZWNpZmljOiBBcHBFbmdpbmUKICAgIEhBU19TRUxFQ1QgPSBGYWxzZQoKCmRlZiBfY2FuX2FsbG9jYXRlKHN0cnVjdCk6CiAgICAiIiIgQ2hlY2tzIHRoYXQgc2VsZWN0IHN0cnVjdHMgY2FuIGJlIGFsbG9jYXRlZCBieSB0aGUgdW5kZXJseWluZwogICAgb3BlcmF0aW5nIHN5c3RlbSwgbm90IGp1c3QgYWR2ZXJ0aXNlZCBieSB0aGUgc2VsZWN0IG1vZHVsZS4gV2UgZG9uJ3QKICAgIGNoZWNrIHNlbGVjdCgpIGJlY2F1c2Ugd2UnbGwgYmUgaG9wZWZ1bCB0aGF0IG1vc3QgcGxhdGZvcm1zIHRoYXQKICAgIGRvbid0IGhhdmUgaXQgYXZhaWxhYmxlIHdpbGwgbm90IGFkdmVydGlzZSBpdC4gKGllOiBHQUUpICIiIgogICAgdHJ5OgogICAgICAgICMgc2VsZWN0LnBvbGwoKSBvYmplY3RzIHdvbid0IGZhaWwgdW50aWwgdXNlZC4KICAgICAgICBpZiBzdHJ1Y3QgPT0gJ3BvbGwnOgogICAgICAgICAgICBwID0gc2VsZWN0LnBvbGwoKQogICAgICAgICAgICBwLnBvbGwoMCkKCiAgICAgICAgIyBBbGwgb3RoZXJzIHdpbGwgZmFpbCBvbiBhbGxvY2F0aW9uLgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGdldGF0dHIoc2VsZWN0LCBzdHJ1Y3QpKCkuY2xvc2UoKQogICAgICAgIHJldHVybiBUcnVlCiAgICBleGNlcHQgKE9TRXJyb3IsIEF0dHJpYnV0ZUVycm9yKSBhcyBlOgogICAgICAgIHJldHVybiBGYWxzZQoKCiMgQ2hvb3NlIHRoZSBiZXN0IGltcGxlbWVudGF0aW9uLCByb3VnaGx5OgojIGtxdWV1ZSA9PSBlcG9sbCA+IHBvbGwgPiBzZWxlY3QuIERldnBvbGwgbm90IHN1cHBvcnRlZC4gKFNlZSBhYm92ZSkKIyBzZWxlY3QoKSBhbHNvIGNhbid0IGFjY2VwdCBhIEZEID4gRkRfU0VUU0laRSAodXN1YWxseSBhcm91bmQgMTAyNCkKZGVmIERlZmF1bHRTZWxlY3RvcigpOgogICAgIiIiIFRoaXMgZnVuY3Rpb24gc2VydmVzIGFzIGEgZmlyc3QgY2FsbCBmb3IgRGVmYXVsdFNlbGVjdG9yIHRvCiAgICBkZXRlY3QgaWYgdGhlIHNlbGVjdCBtb2R1bGUgaXMgYmVpbmcgbW9ua2V5LXBhdGNoZWQgaW5jb3JyZWN0bHkKICAgIGJ5IGV2ZW50bGV0LCBncmVlbmxldCwgYW5kIHByZXNlcnZlIHByb3BlciBiZWhhdmlvci4gIiIiCiAgICBnbG9iYWwgX0RFRkFVTFRfU0VMRUNUT1IKICAgIGlmIF9ERUZBVUxUX1NFTEVDVE9SIGlzIE5vbmU6CiAgICAgICAgaWYgX2Nhbl9hbGxvY2F0ZSgna3F1ZXVlJyk6CiAgICAgICAgICAgIF9ERUZBVUxUX1NFTEVDVE9SID0gS3F1ZXVlU2VsZWN0b3IKICAgICAgICBlbGlmIF9jYW5fYWxsb2NhdGUoJ2Vwb2xsJyk6CiAgICAgICAgICAgIF9ERUZBVUxUX1NFTEVDVE9SID0gRXBvbGxTZWxlY3RvcgogICAgICAgIGVsaWYgX2Nhbl9hbGxvY2F0ZSgncG9sbCcpOgogICAgICAgICAgICBfREVGQVVMVF9TRUxFQ1RPUiA9IFBvbGxTZWxlY3RvcgogICAgICAgIGVsaWYgaGFzYXR0cihzZWxlY3QsICdzZWxlY3QnKToKICAgICAgICAgICAgX0RFRkFVTFRfU0VMRUNUT1IgPSBTZWxlY3RTZWxlY3RvcgogICAgICAgIGVsc2U6ICAjIFBsYXRmb3JtLXNwZWNpZmljOiBBcHBFbmdpbmUKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignUGxhdGZvcm0gZG9lcyBub3QgaGF2ZSBhIHNlbGVjdG9yJykKICAgIHJldHVybiBfREVGQVVMVF9TRUxFQ1RPUigpClBLAwQUAAAAAAAAACEA1e/IorAvAACwLwAAMAAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3V0aWwvc3NsXy5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CmltcG9ydCBlcnJubwppbXBvcnQgd2FybmluZ3MKaW1wb3J0IGhtYWMKCmZyb20gYmluYXNjaWkgaW1wb3J0IGhleGxpZnksIHVuaGV4bGlmeQpmcm9tIGhhc2hsaWIgaW1wb3J0IG1kNSwgc2hhMSwgc2hhMjU2Cgpmcm9tIC4uZXhjZXB0aW9ucyBpbXBvcnQgU1NMRXJyb3IsIEluc2VjdXJlUGxhdGZvcm1XYXJuaW5nLCBTTklNaXNzaW5nV2FybmluZwoKClNTTENvbnRleHQgPSBOb25lCkhBU19TTkkgPSBGYWxzZQpJU19QWU9QRU5TU0wgPSBGYWxzZQpJU19TRUNVUkVUUkFOU1BPUlQgPSBGYWxzZQoKIyBNYXBzIHRoZSBsZW5ndGggb2YgYSBkaWdlc3QgdG8gYSBwb3NzaWJsZSBoYXNoIGZ1bmN0aW9uIHByb2R1Y2luZyB0aGlzIGRpZ2VzdApIQVNIRlVOQ19NQVAgPSB7CiAgICAzMjogbWQ1LAogICAgNDA6IHNoYTEsCiAgICA2NDogc2hhMjU2LAp9CgoKZGVmIF9jb25zdF9jb21wYXJlX2RpZ2VzdF9iYWNrcG9ydChhLCBiKToKICAgICIiIgogICAgQ29tcGFyZSB0d28gZGlnZXN0cyBvZiBlcXVhbCBsZW5ndGggaW4gY29uc3RhbnQgdGltZS4KCiAgICBUaGUgZGlnZXN0cyBtdXN0IGJlIG9mIHR5cGUgc3RyL2J5dGVzLgogICAgUmV0dXJucyBUcnVlIGlmIHRoZSBkaWdlc3RzIG1hdGNoLCBhbmQgRmFsc2Ugb3RoZXJ3aXNlLgogICAgIiIiCiAgICByZXN1bHQgPSBhYnMobGVuKGEpIC0gbGVuKGIpKQogICAgZm9yIGwsIHIgaW4gemlwKGJ5dGVhcnJheShhKSwgYnl0ZWFycmF5KGIpKToKICAgICAgICByZXN1bHQgfD0gbCBeIHIKICAgIHJldHVybiByZXN1bHQgPT0gMAoKCl9jb25zdF9jb21wYXJlX2RpZ2VzdCA9IGdldGF0dHIoaG1hYywgJ2NvbXBhcmVfZGlnZXN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29uc3RfY29tcGFyZV9kaWdlc3RfYmFja3BvcnQpCgoKdHJ5OiAgIyBUZXN0IGZvciBTU0wgZmVhdHVyZXMKICAgIGltcG9ydCBzc2wKICAgIGZyb20gc3NsIGltcG9ydCB3cmFwX3NvY2tldCwgQ0VSVF9OT05FLCBQUk9UT0NPTF9TU0x2MjMKICAgIGZyb20gc3NsIGltcG9ydCBIQVNfU05JICAjIEhhcyBTTkk/CmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIHBhc3MKCgp0cnk6CiAgICBmcm9tIHNzbCBpbXBvcnQgT1BfTk9fU1NMdjIsIE9QX05PX1NTTHYzLCBPUF9OT19DT01QUkVTU0lPTgpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBPUF9OT19TU0x2MiwgT1BfTk9fU1NMdjMgPSAweDEwMDAwMDAsIDB4MjAwMDAwMAogICAgT1BfTk9fQ09NUFJFU1NJT04gPSAweDIwMDAwCgojIEEgc2VjdXJlIGRlZmF1bHQuCiMgU291cmNlcyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBUTFMgY2lwaGVyczoKIwojIC0gaHR0cHM6Ly93aWtpLm1vemlsbGEub3JnL1NlY3VyaXR5L1NlcnZlcl9TaWRlX1RMUwojIC0gaHR0cHM6Ly93d3cuc3NsbGFicy5jb20vcHJvamVjdHMvYmVzdC1wcmFjdGljZXMvaW5kZXguaHRtbAojIC0gaHR0cHM6Ly9oeW5lay5tZS9hcnRpY2xlcy9oYXJkZW5pbmcteW91ci13ZWItc2VydmVycy1zc2wtY2lwaGVycy8KIwojIFRoZSBnZW5lcmFsIGludGVudCBpczoKIyAtIFByZWZlciBUTFMgMS4zIGNpcGhlciBzdWl0ZXMKIyAtIHByZWZlciBjaXBoZXIgc3VpdGVzIHRoYXQgb2ZmZXIgcGVyZmVjdCBmb3J3YXJkIHNlY3JlY3kgKERIRS9FQ0RIRSksCiMgLSBwcmVmZXIgRUNESEUgb3ZlciBESEUgZm9yIGJldHRlciBwZXJmb3JtYW5jZSwKIyAtIHByZWZlciBhbnkgQUVTLUdDTSBhbmQgQ2hhQ2hhMjAgb3ZlciBhbnkgQUVTLUNCQyBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlIGFuZAojICAgc2VjdXJpdHksCiMgLSBwcmVmZXIgQUVTLUdDTSBvdmVyIENoYUNoYTIwIGJlY2F1c2UgaGFyZHdhcmUtYWNjZWxlcmF0ZWQgQUVTIGlzIGNvbW1vbiwKIyAtIGRpc2FibGUgTlVMTCBhdXRoZW50aWNhdGlvbiwgTUQ1IE1BQ3MgYW5kIERTUyBmb3Igc2VjdXJpdHkgcmVhc29ucy4KREVGQVVMVF9DSVBIRVJTID0gJzonLmpvaW4oWwogICAgJ1RMUzEzLUFFUy0yNTYtR0NNLVNIQTM4NCcsCiAgICAnVExTMTMtQ0hBQ0hBMjAtUE9MWTEzMDUtU0hBMjU2JywKICAgICdUTFMxMy1BRVMtMTI4LUdDTS1TSEEyNTYnLAogICAgJ0VDREgrQUVTR0NNJywKICAgICdFQ0RIK0NIQUNIQTIwJywKICAgICdESCtBRVNHQ00nLAogICAgJ0RIK0NIQUNIQTIwJywKICAgICdFQ0RIK0FFUzI1NicsCiAgICAnREgrQUVTMjU2JywKICAgICdFQ0RIK0FFUzEyOCcsCiAgICAnREgrQUVTJywKICAgICdSU0ErQUVTR0NNJywKICAgICdSU0ErQUVTJywKICAgICchYU5VTEwnLAogICAgJyFlTlVMTCcsCiAgICAnIU1ENScsCl0pCgp0cnk6CiAgICBmcm9tIHNzbCBpbXBvcnQgU1NMQ29udGV4dCAgIyBNb2Rlcm4gU1NMPwpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBpbXBvcnQgc3lzCgogICAgY2xhc3MgU1NMQ29udGV4dChvYmplY3QpOiAgIyBQbGF0Zm9ybS1zcGVjaWZpYzogUHl0aG9uIDIgJiAzLjEKICAgICAgICBzdXBwb3J0c19zZXRfY2lwaGVycyA9ICgoMiwgNykgPD0gc3lzLnZlcnNpb25faW5mbyA8ICgzLCkgb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMywgMikgPD0gc3lzLnZlcnNpb25faW5mbykKCiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHByb3RvY29sX3ZlcnNpb24pOgogICAgICAgICAgICBzZWxmLnByb3RvY29sID0gcHJvdG9jb2xfdmVyc2lvbgogICAgICAgICAgICAjIFVzZSBkZWZhdWx0IHZhbHVlcyBmcm9tIGEgcmVhbCBTU0xDb250ZXh0CiAgICAgICAgICAgIHNlbGYuY2hlY2tfaG9zdG5hbWUgPSBGYWxzZQogICAgICAgICAgICBzZWxmLnZlcmlmeV9tb2RlID0gc3NsLkNFUlRfTk9ORQogICAgICAgICAgICBzZWxmLmNhX2NlcnRzID0gTm9uZQogICAgICAgICAgICBzZWxmLm9wdGlvbnMgPSAwCiAgICAgICAgICAgIHNlbGYuY2VydGZpbGUgPSBOb25lCiAgICAgICAgICAgIHNlbGYua2V5ZmlsZSA9IE5vbmUKICAgICAgICAgICAgc2VsZi5jaXBoZXJzID0gTm9uZQoKICAgICAgICBkZWYgbG9hZF9jZXJ0X2NoYWluKHNlbGYsIGNlcnRmaWxlLCBrZXlmaWxlKToKICAgICAgICAgICAgc2VsZi5jZXJ0ZmlsZSA9IGNlcnRmaWxlCiAgICAgICAgICAgIHNlbGYua2V5ZmlsZSA9IGtleWZpbGUKCiAgICAgICAgZGVmIGxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhzZWxmLCBjYWZpbGU9Tm9uZSwgY2FwYXRoPU5vbmUpOgogICAgICAgICAgICBzZWxmLmNhX2NlcnRzID0gY2FmaWxlCgogICAgICAgICAgICBpZiBjYXBhdGggaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICByYWlzZSBTU0xFcnJvcigiQ0EgZGlyZWN0b3JpZXMgbm90IHN1cHBvcnRlZCBpbiBvbGRlciBQeXRob25zIikKCiAgICAgICAgZGVmIHNldF9jaXBoZXJzKHNlbGYsIGNpcGhlcl9zdWl0ZSk6CiAgICAgICAgICAgIGlmIG5vdCBzZWxmLnN1cHBvcnRzX3NldF9jaXBoZXJzOgogICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKAogICAgICAgICAgICAgICAgICAgICdZb3VyIHZlcnNpb24gb2YgUHl0aG9uIGRvZXMgbm90IHN1cHBvcnQgc2V0dGluZyAnCiAgICAgICAgICAgICAgICAgICAgJ2EgY3VzdG9tIGNpcGhlciBzdWl0ZS4gUGxlYXNlIHVwZ3JhZGUgdG8gUHl0aG9uICcKICAgICAgICAgICAgICAgICAgICAnMi43LCAzLjIsIG9yIGxhdGVyIGlmIHlvdSBuZWVkIHRoaXMgZnVuY3Rpb25hbGl0eS4nCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHNlbGYuY2lwaGVycyA9IGNpcGhlcl9zdWl0ZQoKICAgICAgICBkZWYgd3JhcF9zb2NrZXQoc2VsZiwgc29ja2V0LCBzZXJ2ZXJfaG9zdG5hbWU9Tm9uZSwgc2VydmVyX3NpZGU9RmFsc2UpOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAgICAgJ0EgdHJ1ZSBTU0xDb250ZXh0IG9iamVjdCBpcyBub3QgYXZhaWxhYmxlLiBUaGlzIHByZXZlbnRzICcKICAgICAgICAgICAgICAgICd1cmxsaWIzIGZyb20gY29uZmlndXJpbmcgU1NMIGFwcHJvcHJpYXRlbHkgYW5kIG1heSBjYXVzZSAnCiAgICAgICAgICAgICAgICAnY2VydGFpbiBTU0wgY29ubmVjdGlvbnMgdG8gZmFpbC4gWW91IGNhbiB1cGdyYWRlIHRvIGEgbmV3ZXIgJwogICAgICAgICAgICAgICAgJ3ZlcnNpb24gb2YgUHl0aG9uIHRvIHNvbHZlIHRoaXMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgJwogICAgICAgICAgICAgICAgJ2h0dHBzOi8vdXJsbGliMy5yZWFkdGhlZG9jcy5pby9lbi9sYXRlc3QvYWR2YW5jZWQtdXNhZ2UuaHRtbCcKICAgICAgICAgICAgICAgICcjc3NsLXdhcm5pbmdzJywKICAgICAgICAgICAgICAgIEluc2VjdXJlUGxhdGZvcm1XYXJuaW5nCiAgICAgICAgICAgICkKICAgICAgICAgICAga3dhcmdzID0gewogICAgICAgICAgICAgICAgJ2tleWZpbGUnOiBzZWxmLmtleWZpbGUsCiAgICAgICAgICAgICAgICAnY2VydGZpbGUnOiBzZWxmLmNlcnRmaWxlLAogICAgICAgICAgICAgICAgJ2NhX2NlcnRzJzogc2VsZi5jYV9jZXJ0cywKICAgICAgICAgICAgICAgICdjZXJ0X3JlcXMnOiBzZWxmLnZlcmlmeV9tb2RlLAogICAgICAgICAgICAgICAgJ3NzbF92ZXJzaW9uJzogc2VsZi5wcm90b2NvbCwKICAgICAgICAgICAgICAgICdzZXJ2ZXJfc2lkZSc6IHNlcnZlcl9zaWRlLAogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIHNlbGYuc3VwcG9ydHNfc2V0X2NpcGhlcnM6ICAjIFBsYXRmb3JtLXNwZWNpZmljOiBQeXRob24gMi43KwogICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBfc29ja2V0KHNvY2tldCwgY2lwaGVycz1zZWxmLmNpcGhlcnMsICoqa3dhcmdzKQogICAgICAgICAgICBlbHNlOiAgIyBQbGF0Zm9ybS1zcGVjaWZpYzogUHl0aG9uIDIuNgogICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBfc29ja2V0KHNvY2tldCwgKiprd2FyZ3MpCgoKZGVmIGFzc2VydF9maW5nZXJwcmludChjZXJ0LCBmaW5nZXJwcmludCk6CiAgICAiIiIKICAgIENoZWNrcyBpZiBnaXZlbiBmaW5nZXJwcmludCBtYXRjaGVzIHRoZSBzdXBwbGllZCBjZXJ0aWZpY2F0ZS4KCiAgICA6cGFyYW0gY2VydDoKICAgICAgICBDZXJ0aWZpY2F0ZSBhcyBieXRlcyBvYmplY3QuCiAgICA6cGFyYW0gZmluZ2VycHJpbnQ6CiAgICAgICAgRmluZ2VycHJpbnQgYXMgc3RyaW5nIG9mIGhleGRpZ2l0cywgY2FuIGJlIGludGVyc3BlcnNlZCBieSBjb2xvbnMuCiAgICAiIiIKCiAgICBmaW5nZXJwcmludCA9IGZpbmdlcnByaW50LnJlcGxhY2UoJzonLCAnJykubG93ZXIoKQogICAgZGlnZXN0X2xlbmd0aCA9IGxlbihmaW5nZXJwcmludCkKICAgIGhhc2hmdW5jID0gSEFTSEZVTkNfTUFQLmdldChkaWdlc3RfbGVuZ3RoKQogICAgaWYgbm90IGhhc2hmdW5jOgogICAgICAgIHJhaXNlIFNTTEVycm9yKAogICAgICAgICAgICAnRmluZ2VycHJpbnQgb2YgaW52YWxpZCBsZW5ndGg6IHswfScuZm9ybWF0KGZpbmdlcnByaW50KSkKCiAgICAjIFdlIG5lZWQgZW5jb2RlKCkgaGVyZSBmb3IgcHkzMjsgd29ya3Mgb24gcHkyIGFuZCBwMzMuCiAgICBmaW5nZXJwcmludF9ieXRlcyA9IHVuaGV4bGlmeShmaW5nZXJwcmludC5lbmNvZGUoKSkKCiAgICBjZXJ0X2RpZ2VzdCA9IGhhc2hmdW5jKGNlcnQpLmRpZ2VzdCgpCgogICAgaWYgbm90IF9jb25zdF9jb21wYXJlX2RpZ2VzdChjZXJ0X2RpZ2VzdCwgZmluZ2VycHJpbnRfYnl0ZXMpOgogICAgICAgIHJhaXNlIFNTTEVycm9yKCdGaW5nZXJwcmludHMgZGlkIG5vdCBtYXRjaC4gRXhwZWN0ZWQgInswfSIsIGdvdCAiezF9Ii4nCiAgICAgICAgICAgICAgICAgICAgICAgLmZvcm1hdChmaW5nZXJwcmludCwgaGV4bGlmeShjZXJ0X2RpZ2VzdCkpKQoKCmRlZiByZXNvbHZlX2NlcnRfcmVxcyhjYW5kaWRhdGUpOgogICAgIiIiCiAgICBSZXNvbHZlcyB0aGUgYXJndW1lbnQgdG8gYSBudW1lcmljIGNvbnN0YW50LCB3aGljaCBjYW4gYmUgcGFzc2VkIHRvCiAgICB0aGUgd3JhcF9zb2NrZXQgZnVuY3Rpb24vbWV0aG9kIGZyb20gdGhlIHNzbCBtb2R1bGUuCiAgICBEZWZhdWx0cyB0byA6ZGF0YTpgc3NsLkNFUlRfTk9ORWAuCiAgICBJZiBnaXZlbiBhIHN0cmluZyBpdCBpcyBhc3N1bWVkIHRvIGJlIHRoZSBuYW1lIG9mIHRoZSBjb25zdGFudCBpbiB0aGUKICAgIDptb2Q6YHNzbGAgbW9kdWxlIG9yIGl0cyBhYmJyZXZhdGlvbi4KICAgIChTbyB5b3UgY2FuIHNwZWNpZnkgYFJFUVVJUkVEYCBpbnN0ZWFkIG9mIGBDRVJUX1JFUVVJUkVEYC4KICAgIElmIGl0J3MgbmVpdGhlciBgTm9uZWAgbm9yIGEgc3RyaW5nIHdlIGFzc3VtZSBpdCBpcyBhbHJlYWR5IHRoZSBudW1lcmljCiAgICBjb25zdGFudCB3aGljaCBjYW4gZGlyZWN0bHkgYmUgcGFzc2VkIHRvIHdyYXBfc29ja2V0LgogICAgIiIiCiAgICBpZiBjYW5kaWRhdGUgaXMgTm9uZToKICAgICAgICByZXR1cm4gQ0VSVF9OT05FCgogICAgaWYgaXNpbnN0YW5jZShjYW5kaWRhdGUsIHN0cik6CiAgICAgICAgcmVzID0gZ2V0YXR0cihzc2wsIGNhbmRpZGF0ZSwgTm9uZSkKICAgICAgICBpZiByZXMgaXMgTm9uZToKICAgICAgICAgICAgcmVzID0gZ2V0YXR0cihzc2wsICdDRVJUXycgKyBjYW5kaWRhdGUpCiAgICAgICAgcmV0dXJuIHJlcwoKICAgIHJldHVybiBjYW5kaWRhdGUKCgpkZWYgcmVzb2x2ZV9zc2xfdmVyc2lvbihjYW5kaWRhdGUpOgogICAgIiIiCiAgICBsaWtlIHJlc29sdmVfY2VydF9yZXFzCiAgICAiIiIKICAgIGlmIGNhbmRpZGF0ZSBpcyBOb25lOgogICAgICAgIHJldHVybiBQUk9UT0NPTF9TU0x2MjMKCiAgICBpZiBpc2luc3RhbmNlKGNhbmRpZGF0ZSwgc3RyKToKICAgICAgICByZXMgPSBnZXRhdHRyKHNzbCwgY2FuZGlkYXRlLCBOb25lKQogICAgICAgIGlmIHJlcyBpcyBOb25lOgogICAgICAgICAgICByZXMgPSBnZXRhdHRyKHNzbCwgJ1BST1RPQ09MXycgKyBjYW5kaWRhdGUpCiAgICAgICAgcmV0dXJuIHJlcwoKICAgIHJldHVybiBjYW5kaWRhdGUKCgpkZWYgY3JlYXRlX3VybGxpYjNfY29udGV4dChzc2xfdmVyc2lvbj1Ob25lLCBjZXJ0X3JlcXM9Tm9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucz1Ob25lLCBjaXBoZXJzPU5vbmUpOgogICAgIiIiQWxsIGFyZ3VtZW50cyBoYXZlIHRoZSBzYW1lIG1lYW5pbmcgYXMgYGBzc2xfd3JhcF9zb2NrZXRgYC4KCiAgICBCeSBkZWZhdWx0LCB0aGlzIGZ1bmN0aW9uIGRvZXMgYSBsb3Qgb2YgdGhlIHNhbWUgd29yayB0aGF0CiAgICBgYHNzbC5jcmVhdGVfZGVmYXVsdF9jb250ZXh0YGAgZG9lcyBvbiBQeXRob24gMy40Ky4gSXQ6CgogICAgLSBEaXNhYmxlcyBTU0x2MiwgU1NMdjMsIGFuZCBjb21wcmVzc2lvbgogICAgLSBTZXRzIGEgcmVzdHJpY3RlZCBzZXQgb2Ygc2VydmVyIGNpcGhlcnMKCiAgICBJZiB5b3Ugd2lzaCB0byBlbmFibGUgU1NMdjMsIHlvdSBjYW4gZG86OgoKICAgICAgICBmcm9tIHVybGxpYjMudXRpbCBpbXBvcnQgc3NsXwogICAgICAgIGNvbnRleHQgPSBzc2xfLmNyZWF0ZV91cmxsaWIzX2NvbnRleHQoKQogICAgICAgIGNvbnRleHQub3B0aW9ucyAmPSB+c3NsXy5PUF9OT19TU0x2MwoKICAgIFlvdSBjYW4gZG8gdGhlIHNhbWUgdG8gZW5hYmxlIGNvbXByZXNzaW9uIChzdWJzdGl0dXRpbmcgYGBDT01QUkVTU0lPTmBgCiAgICBmb3IgYGBTU0x2M2BgIGluIHRoZSBsYXN0IGxpbmUgYWJvdmUpLgoKICAgIDpwYXJhbSBzc2xfdmVyc2lvbjoKICAgICAgICBUaGUgZGVzaXJlZCBwcm90b2NvbCB2ZXJzaW9uIHRvIHVzZS4gVGhpcyB3aWxsIGRlZmF1bHQgdG8KICAgICAgICBQUk9UT0NPTF9TU0x2MjMgd2hpY2ggd2lsbCBuZWdvdGlhdGUgdGhlIGhpZ2hlc3QgcHJvdG9jb2wgdGhhdCBib3RoCiAgICAgICAgdGhlIHNlcnZlciBhbmQgeW91ciBpbnN0YWxsYXRpb24gb2YgT3BlblNTTCBzdXBwb3J0LgogICAgOnBhcmFtIGNlcnRfcmVxczoKICAgICAgICBXaGV0aGVyIHRvIHJlcXVpcmUgdGhlIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbi4gVGhpcyBkZWZhdWx0cyB0bwogICAgICAgIGBgc3NsLkNFUlRfUkVRVUlSRURgYC4KICAgIDpwYXJhbSBvcHRpb25zOgogICAgICAgIFNwZWNpZmljIE9wZW5TU0wgb3B0aW9ucy4gVGhlc2UgZGVmYXVsdCB0byBgYHNzbC5PUF9OT19TU0x2MmBgLAogICAgICAgIGBgc3NsLk9QX05PX1NTTHYzYGAsIGBgc3NsLk9QX05PX0NPTVBSRVNTSU9OYGAuCiAgICA6cGFyYW0gY2lwaGVyczoKICAgICAgICBXaGljaCBjaXBoZXIgc3VpdGVzIHRvIGFsbG93IHRoZSBzZXJ2ZXIgdG8gc2VsZWN0LgogICAgOnJldHVybnM6CiAgICAgICAgQ29uc3RydWN0ZWQgU1NMQ29udGV4dCBvYmplY3Qgd2l0aCBzcGVjaWZpZWQgb3B0aW9ucwogICAgOnJ0eXBlOiBTU0xDb250ZXh0CiAgICAiIiIKICAgIGNvbnRleHQgPSBTU0xDb250ZXh0KHNzbF92ZXJzaW9uIG9yIHNzbC5QUk9UT0NPTF9TU0x2MjMpCgogICAgIyBTZXR0aW5nIHRoZSBkZWZhdWx0IGhlcmUsIGFzIHdlIG1heSBoYXZlIG5vIHNzbCBtb2R1bGUgb24gaW1wb3J0CiAgICBjZXJ0X3JlcXMgPSBzc2wuQ0VSVF9SRVFVSVJFRCBpZiBjZXJ0X3JlcXMgaXMgTm9uZSBlbHNlIGNlcnRfcmVxcwoKICAgIGlmIG9wdGlvbnMgaXMgTm9uZToKICAgICAgICBvcHRpb25zID0gMAogICAgICAgICMgU1NMdjIgaXMgZWFzaWx5IGJyb2tlbiBhbmQgaXMgY29uc2lkZXJlZCBoYXJtZnVsIGFuZCBkYW5nZXJvdXMKICAgICAgICBvcHRpb25zIHw9IE9QX05PX1NTTHYyCiAgICAgICAgIyBTU0x2MyBoYXMgc2V2ZXJhbCBwcm9ibGVtcyBhbmQgaXMgbm93IGRhbmdlcm91cwogICAgICAgIG9wdGlvbnMgfD0gT1BfTk9fU1NMdjMKICAgICAgICAjIERpc2FibGUgY29tcHJlc3Npb24gdG8gcHJldmVudCBDUklNRSBhdHRhY2tzIGZvciBPcGVuU1NMIDEuMCsKICAgICAgICAjIChpc3N1ZSAjMzA5KQogICAgICAgIG9wdGlvbnMgfD0gT1BfTk9fQ09NUFJFU1NJT04KCiAgICBjb250ZXh0Lm9wdGlvbnMgfD0gb3B0aW9ucwoKICAgIGlmIGdldGF0dHIoY29udGV4dCwgJ3N1cHBvcnRzX3NldF9jaXBoZXJzJywgVHJ1ZSk6ICAjIFBsYXRmb3JtLXNwZWNpZmljOiBQeXRob24gMi42CiAgICAgICAgY29udGV4dC5zZXRfY2lwaGVycyhjaXBoZXJzIG9yIERFRkFVTFRfQ0lQSEVSUykKCiAgICBjb250ZXh0LnZlcmlmeV9tb2RlID0gY2VydF9yZXFzCiAgICBpZiBnZXRhdHRyKGNvbnRleHQsICdjaGVja19ob3N0bmFtZScsIE5vbmUpIGlzIG5vdCBOb25lOiAgIyBQbGF0Zm9ybS1zcGVjaWZpYzogUHl0aG9uIDMuMgogICAgICAgICMgV2UgZG8gb3VyIG93biB2ZXJpZmljYXRpb24sIGluY2x1ZGluZyBmaW5nZXJwcmludHMgYW5kIGFsdGVybmF0aXZlCiAgICAgICAgIyBob3N0bmFtZXMuIFNvIGRpc2FibGUgaXQgaGVyZQogICAgICAgIGNvbnRleHQuY2hlY2tfaG9zdG5hbWUgPSBGYWxzZQogICAgcmV0dXJuIGNvbnRleHQKCgpkZWYgc3NsX3dyYXBfc29ja2V0KHNvY2ssIGtleWZpbGU9Tm9uZSwgY2VydGZpbGU9Tm9uZSwgY2VydF9yZXFzPU5vbmUsCiAgICAgICAgICAgICAgICAgICAgY2FfY2VydHM9Tm9uZSwgc2VydmVyX2hvc3RuYW1lPU5vbmUsCiAgICAgICAgICAgICAgICAgICAgc3NsX3ZlcnNpb249Tm9uZSwgY2lwaGVycz1Ob25lLCBzc2xfY29udGV4dD1Ob25lLAogICAgICAgICAgICAgICAgICAgIGNhX2NlcnRfZGlyPU5vbmUpOgogICAgIiIiCiAgICBBbGwgYXJndW1lbnRzIGV4Y2VwdCBmb3Igc2VydmVyX2hvc3RuYW1lLCBzc2xfY29udGV4dCwgYW5kIGNhX2NlcnRfZGlyIGhhdmUKICAgIHRoZSBzYW1lIG1lYW5pbmcgYXMgdGhleSBkbyB3aGVuIHVzaW5nIDpmdW5jOmBzc2wud3JhcF9zb2NrZXRgLgoKICAgIDpwYXJhbSBzZXJ2ZXJfaG9zdG5hbWU6CiAgICAgICAgV2hlbiBTTkkgaXMgc3VwcG9ydGVkLCB0aGUgZXhwZWN0ZWQgaG9zdG5hbWUgb2YgdGhlIGNlcnRpZmljYXRlCiAgICA6cGFyYW0gc3NsX2NvbnRleHQ6CiAgICAgICAgQSBwcmUtbWFkZSA6Y2xhc3M6YFNTTENvbnRleHRgIG9iamVjdC4gSWYgbm9uZSBpcyBwcm92aWRlZCwgb25lIHdpbGwKICAgICAgICBiZSBjcmVhdGVkIHVzaW5nIDpmdW5jOmBjcmVhdGVfdXJsbGliM19jb250ZXh0YC4KICAgIDpwYXJhbSBjaXBoZXJzOgogICAgICAgIEEgc3RyaW5nIG9mIGNpcGhlcnMgd2Ugd2lzaCB0aGUgY2xpZW50IHRvIHN1cHBvcnQuIFRoaXMgaXMgbm90CiAgICAgICAgc3VwcG9ydGVkIG9uIFB5dGhvbiAyLjYgYXMgdGhlIHNzbCBtb2R1bGUgZG9lcyBub3Qgc3VwcG9ydCBpdC4KICAgIDpwYXJhbSBjYV9jZXJ0X2RpcjoKICAgICAgICBBIGRpcmVjdG9yeSBjb250YWluaW5nIENBIGNlcnRpZmljYXRlcyBpbiBtdWx0aXBsZSBzZXBhcmF0ZSBmaWxlcywgYXMKICAgICAgICBzdXBwb3J0ZWQgYnkgT3BlblNTTCdzIC1DQXBhdGggZmxhZyBvciB0aGUgY2FwYXRoIGFyZ3VtZW50IHRvCiAgICAgICAgU1NMQ29udGV4dC5sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoKS4KICAgICIiIgogICAgY29udGV4dCA9IHNzbF9jb250ZXh0CiAgICBpZiBjb250ZXh0IGlzIE5vbmU6CiAgICAgICAgIyBOb3RlOiBUaGlzIGJyYW5jaCBvZiBjb2RlIGFuZCBhbGwgdGhlIHZhcmlhYmxlcyBpbiBpdCBhcmUgbm8gbG9uZ2VyCiAgICAgICAgIyB1c2VkIGJ5IHVybGxpYjMgaXRzZWxmLiBXZSBzaG91bGQgY29uc2lkZXIgZGVwcmVjYXRpbmcgYW5kIHJlbW92aW5nCiAgICAgICAgIyB0aGlzIGNvZGUuCiAgICAgICAgY29udGV4dCA9IGNyZWF0ZV91cmxsaWIzX2NvbnRleHQoc3NsX3ZlcnNpb24sIGNlcnRfcmVxcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaXBoZXJzPWNpcGhlcnMpCgogICAgaWYgY2FfY2VydHMgb3IgY2FfY2VydF9kaXI6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBjb250ZXh0LmxvYWRfdmVyaWZ5X2xvY2F0aW9ucyhjYV9jZXJ0cywgY2FfY2VydF9kaXIpCiAgICAgICAgZXhjZXB0IElPRXJyb3IgYXMgZTogICMgUGxhdGZvcm0tc3BlY2lmaWM6IFB5dGhvbiAyLjYsIDIuNywgMy4yCiAgICAgICAgICAgIHJhaXNlIFNTTEVycm9yKGUpCiAgICAgICAgIyBQeTMzIHJhaXNlcyBGaWxlTm90Rm91bmRFcnJvciB3aGljaCBzdWJjbGFzc2VzIE9TRXJyb3IKICAgICAgICAjIFRoZXNlIGFyZSBub3QgZXF1aXZhbGVudCB1bmxlc3Mgd2UgY2hlY2sgdGhlIGVycm5vIGF0dHJpYnV0ZQogICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6ICAjIFBsYXRmb3JtLXNwZWNpZmljOiBQeXRob24gMy4zIGFuZCBiZXlvbmQKICAgICAgICAgICAgaWYgZS5lcnJubyA9PSBlcnJuby5FTk9FTlQ6CiAgICAgICAgICAgICAgICByYWlzZSBTU0xFcnJvcihlKQogICAgICAgICAgICByYWlzZQogICAgZWxpZiBnZXRhdHRyKGNvbnRleHQsICdsb2FkX2RlZmF1bHRfY2VydHMnLCBOb25lKSBpcyBub3QgTm9uZToKICAgICAgICAjIHRyeSB0byBsb2FkIE9TIGRlZmF1bHQgY2VydHM7IHdvcmtzIHdlbGwgb24gV2luZG93cyAocmVxdWlyZSBQeXRob24zLjQrKQogICAgICAgIGNvbnRleHQubG9hZF9kZWZhdWx0X2NlcnRzKCkKCiAgICBpZiBjZXJ0ZmlsZToKICAgICAgICBjb250ZXh0LmxvYWRfY2VydF9jaGFpbihjZXJ0ZmlsZSwga2V5ZmlsZSkKICAgIGlmIEhBU19TTkk6ICAjIFBsYXRmb3JtLXNwZWNpZmljOiBPcGVuU1NMIHdpdGggZW5hYmxlZCBTTkkKICAgICAgICByZXR1cm4gY29udGV4dC53cmFwX3NvY2tldChzb2NrLCBzZXJ2ZXJfaG9zdG5hbWU9c2VydmVyX2hvc3RuYW1lKQoKICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgJ0FuIEhUVFBTIHJlcXVlc3QgaGFzIGJlZW4gbWFkZSwgYnV0IHRoZSBTTkkgKFN1YmplY3QgTmFtZSAnCiAgICAgICAgJ0luZGljYXRpb24pIGV4dGVuc2lvbiB0byBUTFMgaXMgbm90IGF2YWlsYWJsZSBvbiB0aGlzIHBsYXRmb3JtLiAnCiAgICAgICAgJ1RoaXMgbWF5IGNhdXNlIHRoZSBzZXJ2ZXIgdG8gcHJlc2VudCBhbiBpbmNvcnJlY3QgVExTICcKICAgICAgICAnY2VydGlmaWNhdGUsIHdoaWNoIGNhbiBjYXVzZSB2YWxpZGF0aW9uIGZhaWx1cmVzLiBZb3UgY2FuIHVwZ3JhZGUgdG8gJwogICAgICAgICdhIG5ld2VyIHZlcnNpb24gb2YgUHl0aG9uIHRvIHNvbHZlIHRoaXMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgJwogICAgICAgICdodHRwczovL3VybGxpYjMucmVhZHRoZWRvY3MuaW8vZW4vbGF0ZXN0L2FkdmFuY2VkLXVzYWdlLmh0bWwnCiAgICAgICAgJyNzc2wtd2FybmluZ3MnLAogICAgICAgIFNOSU1pc3NpbmdXYXJuaW5nCiAgICApCiAgICByZXR1cm4gY29udGV4dC53cmFwX3NvY2tldChzb2NrKQpQSwMEFAAAAAAAAAAhAFVSziAdJgAAHSYAADMAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL3RpbWVvdXQucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAojIFRoZSBkZWZhdWx0IHNvY2tldCB0aW1lb3V0LCB1c2VkIGJ5IGh0dHBsaWIgdG8gaW5kaWNhdGUgdGhhdCBubyB0aW1lb3V0IHdhcwojIHNwZWNpZmllZCBieSB0aGUgdXNlcgpmcm9tIHNvY2tldCBpbXBvcnQgX0dMT0JBTF9ERUZBVUxUX1RJTUVPVVQKaW1wb3J0IHRpbWUKCmZyb20gLi5leGNlcHRpb25zIGltcG9ydCBUaW1lb3V0U3RhdGVFcnJvcgoKIyBBIHNlbnRpbmVsIHZhbHVlIHRvIGluZGljYXRlIHRoYXQgbm8gdGltZW91dCB3YXMgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyIGluCiMgdXJsbGliMwpfRGVmYXVsdCA9IG9iamVjdCgpCgoKIyBVc2UgdGltZS5tb25vdG9uaWMgaWYgYXZhaWxhYmxlLgpjdXJyZW50X3RpbWUgPSBnZXRhdHRyKHRpbWUsICJtb25vdG9uaWMiLCB0aW1lLnRpbWUpCgoKY2xhc3MgVGltZW91dChvYmplY3QpOgogICAgIiIiIFRpbWVvdXQgY29uZmlndXJhdGlvbi4KCiAgICBUaW1lb3V0cyBjYW4gYmUgZGVmaW5lZCBhcyBhIGRlZmF1bHQgZm9yIGEgcG9vbDo6CgogICAgICAgIHRpbWVvdXQgPSBUaW1lb3V0KGNvbm5lY3Q9Mi4wLCByZWFkPTcuMCkKICAgICAgICBodHRwID0gUG9vbE1hbmFnZXIodGltZW91dD10aW1lb3V0KQogICAgICAgIHJlc3BvbnNlID0gaHR0cC5yZXF1ZXN0KCdHRVQnLCAnaHR0cDovL2V4YW1wbGUuY29tLycpCgogICAgT3IgcGVyLXJlcXVlc3QgKHdoaWNoIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCBmb3IgdGhlIHBvb2wpOjoKCiAgICAgICAgcmVzcG9uc2UgPSBodHRwLnJlcXVlc3QoJ0dFVCcsICdodHRwOi8vZXhhbXBsZS5jb20vJywgdGltZW91dD1UaW1lb3V0KDEwKSkKCiAgICBUaW1lb3V0cyBjYW4gYmUgZGlzYWJsZWQgYnkgc2V0dGluZyBhbGwgdGhlIHBhcmFtZXRlcnMgdG8gYGBOb25lYGA6OgoKICAgICAgICBub190aW1lb3V0ID0gVGltZW91dChjb25uZWN0PU5vbmUsIHJlYWQ9Tm9uZSkKICAgICAgICByZXNwb25zZSA9IGh0dHAucmVxdWVzdCgnR0VUJywgJ2h0dHA6Ly9leGFtcGxlLmNvbS8sIHRpbWVvdXQ9bm9fdGltZW91dCkKCgogICAgOnBhcmFtIHRvdGFsOgogICAgICAgIFRoaXMgY29tYmluZXMgdGhlIGNvbm5lY3QgYW5kIHJlYWQgdGltZW91dHMgaW50byBvbmU7IHRoZSByZWFkIHRpbWVvdXQKICAgICAgICB3aWxsIGJlIHNldCB0byB0aGUgdGltZSBsZWZ0b3ZlciBmcm9tIHRoZSBjb25uZWN0IGF0dGVtcHQuIEluIHRoZQogICAgICAgIGV2ZW50IHRoYXQgYm90aCBhIGNvbm5lY3QgdGltZW91dCBhbmQgYSB0b3RhbCBhcmUgc3BlY2lmaWVkLCBvciBhIHJlYWQKICAgICAgICB0aW1lb3V0IGFuZCBhIHRvdGFsIGFyZSBzcGVjaWZpZWQsIHRoZSBzaG9ydGVyIHRpbWVvdXQgd2lsbCBiZSBhcHBsaWVkLgoKICAgICAgICBEZWZhdWx0cyB0byBOb25lLgoKICAgIDp0eXBlIHRvdGFsOiBpbnRlZ2VyLCBmbG9hdCwgb3IgTm9uZQoKICAgIDpwYXJhbSBjb25uZWN0OgogICAgICAgIFRoZSBtYXhpbXVtIGFtb3VudCBvZiB0aW1lIHRvIHdhaXQgZm9yIGEgY29ubmVjdGlvbiBhdHRlbXB0IHRvIGEgc2VydmVyCiAgICAgICAgdG8gc3VjY2VlZC4gT21pdHRpbmcgdGhlIHBhcmFtZXRlciB3aWxsIGRlZmF1bHQgdGhlIGNvbm5lY3QgdGltZW91dCB0bwogICAgICAgIHRoZSBzeXN0ZW0gZGVmYXVsdCwgcHJvYmFibHkgYHRoZSBnbG9iYWwgZGVmYXVsdCB0aW1lb3V0IGluIHNvY2tldC5weQogICAgICAgIDxodHRwOi8vaGcucHl0aG9uLm9yZy9jcHl0aG9uL2ZpbGUvNjAzYjRkNTkzNzU4L0xpYi9zb2NrZXQucHkjbDUzNT5gXy4KICAgICAgICBOb25lIHdpbGwgc2V0IGFuIGluZmluaXRlIHRpbWVvdXQgZm9yIGNvbm5lY3Rpb24gYXR0ZW1wdHMuCgogICAgOnR5cGUgY29ubmVjdDogaW50ZWdlciwgZmxvYXQsIG9yIE5vbmUKCiAgICA6cGFyYW0gcmVhZDoKICAgICAgICBUaGUgbWF4aW11bSBhbW91bnQgb2YgdGltZSB0byB3YWl0IGJldHdlZW4gY29uc2VjdXRpdmUKICAgICAgICByZWFkIG9wZXJhdGlvbnMgZm9yIGEgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyLiBPbWl0dGluZwogICAgICAgIHRoZSBwYXJhbWV0ZXIgd2lsbCBkZWZhdWx0IHRoZSByZWFkIHRpbWVvdXQgdG8gdGhlIHN5c3RlbQogICAgICAgIGRlZmF1bHQsIHByb2JhYmx5IGB0aGUgZ2xvYmFsIGRlZmF1bHQgdGltZW91dCBpbiBzb2NrZXQucHkKICAgICAgICA8aHR0cDovL2hnLnB5dGhvbi5vcmcvY3B5dGhvbi9maWxlLzYwM2I0ZDU5Mzc1OC9MaWIvc29ja2V0LnB5I2w1MzU+YF8uCiAgICAgICAgTm9uZSB3aWxsIHNldCBhbiBpbmZpbml0ZSB0aW1lb3V0LgoKICAgIDp0eXBlIHJlYWQ6IGludGVnZXIsIGZsb2F0LCBvciBOb25lCgogICAgLi4gbm90ZTo6CgogICAgICAgIE1hbnkgZmFjdG9ycyBjYW4gYWZmZWN0IHRoZSB0b3RhbCBhbW91bnQgb2YgdGltZSBmb3IgdXJsbGliMyB0byByZXR1cm4KICAgICAgICBhbiBIVFRQIHJlc3BvbnNlLgoKICAgICAgICBGb3IgZXhhbXBsZSwgUHl0aG9uJ3MgRE5TIHJlc29sdmVyIGRvZXMgbm90IG9iZXkgdGhlIHRpbWVvdXQgc3BlY2lmaWVkCiAgICAgICAgb24gdGhlIHNvY2tldC4gT3RoZXIgZmFjdG9ycyB0aGF0IGNhbiBhZmZlY3QgdG90YWwgcmVxdWVzdCB0aW1lIGluY2x1ZGUKICAgICAgICBoaWdoIENQVSBsb2FkLCBoaWdoIHN3YXAsIHRoZSBwcm9ncmFtIHJ1bm5pbmcgYXQgYSBsb3cgcHJpb3JpdHkgbGV2ZWwsCiAgICAgICAgb3Igb3RoZXIgYmVoYXZpb3JzLgoKICAgICAgICBJbiBhZGRpdGlvbiwgdGhlIHJlYWQgYW5kIHRvdGFsIHRpbWVvdXRzIG9ubHkgbWVhc3VyZSB0aGUgdGltZSBiZXR3ZWVuCiAgICAgICAgcmVhZCBvcGVyYXRpb25zIG9uIHRoZSBzb2NrZXQgY29ubmVjdGluZyB0aGUgY2xpZW50IGFuZCB0aGUgc2VydmVyLAogICAgICAgIG5vdCB0aGUgdG90YWwgYW1vdW50IG9mIHRpbWUgZm9yIHRoZSByZXF1ZXN0IHRvIHJldHVybiBhIGNvbXBsZXRlCiAgICAgICAgcmVzcG9uc2UuIEZvciBtb3N0IHJlcXVlc3RzLCB0aGUgdGltZW91dCBpcyByYWlzZWQgYmVjYXVzZSB0aGUgc2VydmVyCiAgICAgICAgaGFzIG5vdCBzZW50IHRoZSBmaXJzdCBieXRlIGluIHRoZSBzcGVjaWZpZWQgdGltZS4gVGhpcyBpcyBub3QgYWx3YXlzCiAgICAgICAgdGhlIGNhc2U7IGlmIGEgc2VydmVyIHN0cmVhbXMgb25lIGJ5dGUgZXZlcnkgZmlmdGVlbiBzZWNvbmRzLCBhIHRpbWVvdXQKICAgICAgICBvZiAyMCBzZWNvbmRzIHdpbGwgbm90IHRyaWdnZXIsIGV2ZW4gdGhvdWdoIHRoZSByZXF1ZXN0IHdpbGwgdGFrZQogICAgICAgIHNldmVyYWwgbWludXRlcyB0byBjb21wbGV0ZS4KCiAgICAgICAgSWYgeW91ciBnb2FsIGlzIHRvIGN1dCBvZmYgYW55IHJlcXVlc3QgYWZ0ZXIgYSBzZXQgYW1vdW50IG9mIHdhbGwgY2xvY2sKICAgICAgICB0aW1lLCBjb25zaWRlciBoYXZpbmcgYSBzZWNvbmQgIndhdGNoZXIiIHRocmVhZCB0byBjdXQgb2ZmIGEgc2xvdwogICAgICAgIHJlcXVlc3QuCiAgICAiIiIKCiAgICAjOiBBIHNlbnRpbmVsIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGRlZmF1bHQgdGltZW91dCB2YWx1ZQogICAgREVGQVVMVF9USU1FT1VUID0gX0dMT0JBTF9ERUZBVUxUX1RJTUVPVVQKCiAgICBkZWYgX19pbml0X18oc2VsZiwgdG90YWw9Tm9uZSwgY29ubmVjdD1fRGVmYXVsdCwgcmVhZD1fRGVmYXVsdCk6CiAgICAgICAgc2VsZi5fY29ubmVjdCA9IHNlbGYuX3ZhbGlkYXRlX3RpbWVvdXQoY29ubmVjdCwgJ2Nvbm5lY3QnKQogICAgICAgIHNlbGYuX3JlYWQgPSBzZWxmLl92YWxpZGF0ZV90aW1lb3V0KHJlYWQsICdyZWFkJykKICAgICAgICBzZWxmLnRvdGFsID0gc2VsZi5fdmFsaWRhdGVfdGltZW91dCh0b3RhbCwgJ3RvdGFsJykKICAgICAgICBzZWxmLl9zdGFydF9jb25uZWN0ID0gTm9uZQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiAnJXMoY29ubmVjdD0lciwgcmVhZD0lciwgdG90YWw9JXIpJyAlICgKICAgICAgICAgICAgdHlwZShzZWxmKS5fX25hbWVfXywgc2VsZi5fY29ubmVjdCwgc2VsZi5fcmVhZCwgc2VsZi50b3RhbCkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfdmFsaWRhdGVfdGltZW91dChjbHMsIHZhbHVlLCBuYW1lKToKICAgICAgICAiIiIgQ2hlY2sgdGhhdCBhIHRpbWVvdXQgYXR0cmlidXRlIGlzIHZhbGlkLgoKICAgICAgICA6cGFyYW0gdmFsdWU6IFRoZSB0aW1lb3V0IHZhbHVlIHRvIHZhbGlkYXRlCiAgICAgICAgOnBhcmFtIG5hbWU6IFRoZSBuYW1lIG9mIHRoZSB0aW1lb3V0IGF0dHJpYnV0ZSB0byB2YWxpZGF0ZS4gVGhpcyBpcwogICAgICAgICAgICB1c2VkIHRvIHNwZWNpZnkgaW4gZXJyb3IgbWVzc2FnZXMuCiAgICAgICAgOnJldHVybjogVGhlIHZhbGlkYXRlZCBhbmQgY2FzdGVkIHZlcnNpb24gb2YgdGhlIGdpdmVuIHZhbHVlLgogICAgICAgIDpyYWlzZXMgVmFsdWVFcnJvcjogSWYgaXQgaXMgYSBudW1lcmljIHZhbHVlIGxlc3MgdGhhbiBvciBlcXVhbCB0bwogICAgICAgICAgICB6ZXJvLCBvciB0aGUgdHlwZSBpcyBub3QgYW4gaW50ZWdlciwgZmxvYXQsIG9yIE5vbmUuCiAgICAgICAgIiIiCiAgICAgICAgaWYgdmFsdWUgaXMgX0RlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBjbHMuREVGQVVMVF9USU1FT1VUCgogICAgICAgIGlmIHZhbHVlIGlzIE5vbmUgb3IgdmFsdWUgaXMgY2xzLkRFRkFVTFRfVElNRU9VVDoKICAgICAgICAgICAgcmV0dXJuIHZhbHVlCgogICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIGJvb2wpOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJUaW1lb3V0IGNhbm5vdCBiZSBhIGJvb2xlYW4gdmFsdWUuIEl0IG11c3QgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZSBhbiBpbnQsIGZsb2F0IG9yIE5vbmUuIikKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZsb2F0KHZhbHVlKQogICAgICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBWYWx1ZUVycm9yKToKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiVGltZW91dCB2YWx1ZSAlcyB3YXMgJXMsIGJ1dCBpdCBtdXN0IGJlIGFuICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50LCBmbG9hdCBvciBOb25lLiIgJSAobmFtZSwgdmFsdWUpKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGlmIHZhbHVlIDw9IDA6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJBdHRlbXB0ZWQgdG8gc2V0ICVzIHRpbWVvdXQgdG8gJXMsIGJ1dCB0aGUgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGltZW91dCBjYW5ub3QgYmUgc2V0IHRvIGEgdmFsdWUgbGVzcyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGFuIG9yIGVxdWFsIHRvIDAuIiAlIChuYW1lLCB2YWx1ZSkpCiAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjogICMgUHl0aG9uIDMKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiVGltZW91dCB2YWx1ZSAlcyB3YXMgJXMsIGJ1dCBpdCBtdXN0IGJlIGFuICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50LCBmbG9hdCBvciBOb25lLiIgJSAobmFtZSwgdmFsdWUpKQoKICAgICAgICByZXR1cm4gdmFsdWUKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBmcm9tX2Zsb2F0KGNscywgdGltZW91dCk6CiAgICAgICAgIiIiIENyZWF0ZSBhIG5ldyBUaW1lb3V0IGZyb20gYSBsZWdhY3kgdGltZW91dCB2YWx1ZS4KCiAgICAgICAgVGhlIHRpbWVvdXQgdmFsdWUgdXNlZCBieSBodHRwbGliLnB5IHNldHMgdGhlIHNhbWUgdGltZW91dCBvbiB0aGUKICAgICAgICBjb25uZWN0KCksIGFuZCByZWN2KCkgc29ja2V0IHJlcXVlc3RzLiBUaGlzIGNyZWF0ZXMgYSA6Y2xhc3M6YFRpbWVvdXRgCiAgICAgICAgb2JqZWN0IHRoYXQgc2V0cyB0aGUgaW5kaXZpZHVhbCB0aW1lb3V0cyB0byB0aGUgYGB0aW1lb3V0YGAgdmFsdWUKICAgICAgICBwYXNzZWQgdG8gdGhpcyBmdW5jdGlvbi4KCiAgICAgICAgOnBhcmFtIHRpbWVvdXQ6IFRoZSBsZWdhY3kgdGltZW91dCB2YWx1ZS4KICAgICAgICA6dHlwZSB0aW1lb3V0OiBpbnRlZ2VyLCBmbG9hdCwgc2VudGluZWwgZGVmYXVsdCBvYmplY3QsIG9yIE5vbmUKICAgICAgICA6cmV0dXJuOiBUaW1lb3V0IG9iamVjdAogICAgICAgIDpydHlwZTogOmNsYXNzOmBUaW1lb3V0YAogICAgICAgICIiIgogICAgICAgIHJldHVybiBUaW1lb3V0KHJlYWQ9dGltZW91dCwgY29ubmVjdD10aW1lb3V0KQoKICAgIGRlZiBjbG9uZShzZWxmKToKICAgICAgICAiIiIgQ3JlYXRlIGEgY29weSBvZiB0aGUgdGltZW91dCBvYmplY3QKCiAgICAgICAgVGltZW91dCBwcm9wZXJ0aWVzIGFyZSBzdG9yZWQgcGVyLXBvb2wgYnV0IGVhY2ggcmVxdWVzdCBuZWVkcyBhIGZyZXNoCiAgICAgICAgVGltZW91dCBvYmplY3QgdG8gZW5zdXJlIGVhY2ggb25lIGhhcyBpdHMgb3duIHN0YXJ0L3N0b3AgY29uZmlndXJlZC4KCiAgICAgICAgOnJldHVybjogYSBjb3B5IG9mIHRoZSB0aW1lb3V0IG9iamVjdAogICAgICAgIDpydHlwZTogOmNsYXNzOmBUaW1lb3V0YAogICAgICAgICIiIgogICAgICAgICMgV2UgY2FuJ3QgdXNlIGNvcHkuZGVlcGNvcHkgYmVjYXVzZSB0aGF0IHdpbGwgYWxzbyBjcmVhdGUgYSBuZXcgb2JqZWN0CiAgICAgICAgIyBmb3IgX0dMT0JBTF9ERUZBVUxUX1RJTUVPVVQsIHdoaWNoIHNvY2tldC5weSB1c2VzIGFzIGEgc2VudGluZWwgdG8KICAgICAgICAjIGRldGVjdCB0aGUgdXNlciBkZWZhdWx0LgogICAgICAgIHJldHVybiBUaW1lb3V0KGNvbm5lY3Q9c2VsZi5fY29ubmVjdCwgcmVhZD1zZWxmLl9yZWFkLAogICAgICAgICAgICAgICAgICAgICAgIHRvdGFsPXNlbGYudG90YWwpCgogICAgZGVmIHN0YXJ0X2Nvbm5lY3Qoc2VsZik6CiAgICAgICAgIiIiIFN0YXJ0IHRoZSB0aW1lb3V0IGNsb2NrLCB1c2VkIGR1cmluZyBhIGNvbm5lY3QoKSBhdHRlbXB0CgogICAgICAgIDpyYWlzZXMgdXJsbGliMy5leGNlcHRpb25zLlRpbWVvdXRTdGF0ZUVycm9yOiBpZiB5b3UgYXR0ZW1wdAogICAgICAgICAgICB0byBzdGFydCBhIHRpbWVyIHRoYXQgaGFzIGJlZW4gc3RhcnRlZCBhbHJlYWR5LgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuX3N0YXJ0X2Nvbm5lY3QgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJhaXNlIFRpbWVvdXRTdGF0ZUVycm9yKCJUaW1lb3V0IHRpbWVyIGhhcyBhbHJlYWR5IGJlZW4gc3RhcnRlZC4iKQogICAgICAgIHNlbGYuX3N0YXJ0X2Nvbm5lY3QgPSBjdXJyZW50X3RpbWUoKQogICAgICAgIHJldHVybiBzZWxmLl9zdGFydF9jb25uZWN0CgogICAgZGVmIGdldF9jb25uZWN0X2R1cmF0aW9uKHNlbGYpOgogICAgICAgICIiIiBHZXRzIHRoZSB0aW1lIGVsYXBzZWQgc2luY2UgdGhlIGNhbGwgdG8gOm1ldGg6YHN0YXJ0X2Nvbm5lY3RgLgoKICAgICAgICA6cmV0dXJuOiBFbGFwc2VkIHRpbWUuCiAgICAgICAgOnJ0eXBlOiBmbG9hdAogICAgICAgIDpyYWlzZXMgdXJsbGliMy5leGNlcHRpb25zLlRpbWVvdXRTdGF0ZUVycm9yOiBpZiB5b3UgYXR0ZW1wdAogICAgICAgICAgICB0byBnZXQgZHVyYXRpb24gZm9yIGEgdGltZXIgdGhhdCBoYXNuJ3QgYmVlbiBzdGFydGVkLgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuX3N0YXJ0X2Nvbm5lY3QgaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgVGltZW91dFN0YXRlRXJyb3IoIkNhbid0IGdldCBjb25uZWN0IGR1cmF0aW9uIGZvciB0aW1lciAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGF0IGhhcyBub3Qgc3RhcnRlZC4iKQogICAgICAgIHJldHVybiBjdXJyZW50X3RpbWUoKSAtIHNlbGYuX3N0YXJ0X2Nvbm5lY3QKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjb25uZWN0X3RpbWVvdXQoc2VsZik6CiAgICAgICAgIiIiIEdldCB0aGUgdmFsdWUgdG8gdXNlIHdoZW4gc2V0dGluZyBhIGNvbm5lY3Rpb24gdGltZW91dC4KCiAgICAgICAgVGhpcyB3aWxsIGJlIGEgcG9zaXRpdmUgZmxvYXQgb3IgaW50ZWdlciwgdGhlIHZhbHVlIE5vbmUKICAgICAgICAobmV2ZXIgdGltZW91dCksIG9yIHRoZSBkZWZhdWx0IHN5c3RlbSB0aW1lb3V0LgoKICAgICAgICA6cmV0dXJuOiBDb25uZWN0IHRpbWVvdXQuCiAgICAgICAgOnJ0eXBlOiBpbnQsIGZsb2F0LCA6YXR0cjpgVGltZW91dC5ERUZBVUxUX1RJTUVPVVRgIG9yIE5vbmUKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnRvdGFsIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9jb25uZWN0CgogICAgICAgIGlmIHNlbGYuX2Nvbm5lY3QgaXMgTm9uZSBvciBzZWxmLl9jb25uZWN0IGlzIHNlbGYuREVGQVVMVF9USU1FT1VUOgogICAgICAgICAgICByZXR1cm4gc2VsZi50b3RhbAoKICAgICAgICByZXR1cm4gbWluKHNlbGYuX2Nvbm5lY3QsIHNlbGYudG90YWwpCgogICAgQHByb3BlcnR5CiAgICBkZWYgcmVhZF90aW1lb3V0KHNlbGYpOgogICAgICAgICIiIiBHZXQgdGhlIHZhbHVlIGZvciB0aGUgcmVhZCB0aW1lb3V0LgoKICAgICAgICBUaGlzIGFzc3VtZXMgc29tZSB0aW1lIGhhcyBlbGFwc2VkIGluIHRoZSBjb25uZWN0aW9uIHRpbWVvdXQgYW5kCiAgICAgICAgY29tcHV0ZXMgdGhlIHJlYWQgdGltZW91dCBhcHByb3ByaWF0ZWx5LgoKICAgICAgICBJZiBzZWxmLnRvdGFsIGlzIHNldCwgdGhlIHJlYWQgdGltZW91dCBpcyBkZXBlbmRlbnQgb24gdGhlIGFtb3VudCBvZgogICAgICAgIHRpbWUgdGFrZW4gYnkgdGhlIGNvbm5lY3QgdGltZW91dC4gSWYgdGhlIGNvbm5lY3Rpb24gdGltZSBoYXMgbm90IGJlZW4KICAgICAgICBlc3RhYmxpc2hlZCwgYSA6ZXhjOmB+dXJsbGliMy5leGNlcHRpb25zLlRpbWVvdXRTdGF0ZUVycm9yYCB3aWxsIGJlCiAgICAgICAgcmFpc2VkLgoKICAgICAgICA6cmV0dXJuOiBWYWx1ZSB0byB1c2UgZm9yIHRoZSByZWFkIHRpbWVvdXQuCiAgICAgICAgOnJ0eXBlOiBpbnQsIGZsb2F0LCA6YXR0cjpgVGltZW91dC5ERUZBVUxUX1RJTUVPVVRgIG9yIE5vbmUKICAgICAgICA6cmFpc2VzIHVybGxpYjMuZXhjZXB0aW9ucy5UaW1lb3V0U3RhdGVFcnJvcjogSWYgOm1ldGg6YHN0YXJ0X2Nvbm5lY3RgCiAgICAgICAgICAgIGhhcyBub3QgeWV0IGJlZW4gY2FsbGVkIG9uIHRoaXMgb2JqZWN0LgogICAgICAgICIiIgogICAgICAgIGlmIChzZWxmLnRvdGFsIGlzIG5vdCBOb25lIGFuZAogICAgICAgICAgICAgICAgc2VsZi50b3RhbCBpcyBub3Qgc2VsZi5ERUZBVUxUX1RJTUVPVVQgYW5kCiAgICAgICAgICAgICAgICBzZWxmLl9yZWFkIGlzIG5vdCBOb25lIGFuZAogICAgICAgICAgICAgICAgc2VsZi5fcmVhZCBpcyBub3Qgc2VsZi5ERUZBVUxUX1RJTUVPVVQpOgogICAgICAgICAgICAjIEluIGNhc2UgdGhlIGNvbm5lY3QgdGltZW91dCBoYXMgbm90IHlldCBiZWVuIGVzdGFibGlzaGVkLgogICAgICAgICAgICBpZiBzZWxmLl9zdGFydF9jb25uZWN0IGlzIE5vbmU6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fcmVhZAogICAgICAgICAgICByZXR1cm4gbWF4KDAsIG1pbihzZWxmLnRvdGFsIC0gc2VsZi5nZXRfY29ubmVjdF9kdXJhdGlvbigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9yZWFkKSkKICAgICAgICBlbGlmIHNlbGYudG90YWwgaXMgbm90IE5vbmUgYW5kIHNlbGYudG90YWwgaXMgbm90IHNlbGYuREVGQVVMVF9USU1FT1VUOgogICAgICAgICAgICByZXR1cm4gbWF4KDAsIHNlbGYudG90YWwgLSBzZWxmLmdldF9jb25uZWN0X2R1cmF0aW9uKCkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3JlYWQKUEsDBBQAAAAAAAAAIQDDHm0RVxkAAFcZAAAvAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvdXRpbC91cmwucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydApmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBuYW1lZHR1cGxlCgpmcm9tIC4uZXhjZXB0aW9ucyBpbXBvcnQgTG9jYXRpb25QYXJzZUVycm9yCgoKdXJsX2F0dHJzID0gWydzY2hlbWUnLCAnYXV0aCcsICdob3N0JywgJ3BvcnQnLCAncGF0aCcsICdxdWVyeScsICdmcmFnbWVudCddCgojIFdlIG9ubHkgd2FudCB0byBub3JtYWxpemUgdXJscyB3aXRoIGFuIEhUVFAoUykgc2NoZW1lLgojIHVybGxpYjMgaW5mZXJzIFVSTHMgd2l0aG91dCBhIHNjaGVtZSAoTm9uZSkgdG8gYmUgaHR0cC4KTk9STUFMSVpBQkxFX1NDSEVNRVMgPSAoJ2h0dHAnLCAnaHR0cHMnLCBOb25lKQoKCmNsYXNzIFVybChuYW1lZHR1cGxlKCdVcmwnLCB1cmxfYXR0cnMpKToKICAgICIiIgogICAgRGF0YXN0cnVjdHVyZSBmb3IgcmVwcmVzZW50aW5nIGFuIEhUVFAgVVJMLiBVc2VkIGFzIGEgcmV0dXJuIHZhbHVlIGZvcgogICAgOmZ1bmM6YHBhcnNlX3VybGAuIEJvdGggdGhlIHNjaGVtZSBhbmQgaG9zdCBhcmUgbm9ybWFsaXplZCBhcyB0aGV5IGFyZQogICAgYm90aCBjYXNlLWluc2Vuc2l0aXZlIGFjY29yZGluZyB0byBSRkMgMzk4Ni4KICAgICIiIgogICAgX19zbG90c19fID0gKCkKCiAgICBkZWYgX19uZXdfXyhjbHMsIHNjaGVtZT1Ob25lLCBhdXRoPU5vbmUsIGhvc3Q9Tm9uZSwgcG9ydD1Ob25lLCBwYXRoPU5vbmUsCiAgICAgICAgICAgICAgICBxdWVyeT1Ob25lLCBmcmFnbWVudD1Ob25lKToKICAgICAgICBpZiBwYXRoIGFuZCBub3QgcGF0aC5zdGFydHN3aXRoKCcvJyk6CiAgICAgICAgICAgIHBhdGggPSAnLycgKyBwYXRoCiAgICAgICAgaWYgc2NoZW1lOgogICAgICAgICAgICBzY2hlbWUgPSBzY2hlbWUubG93ZXIoKQogICAgICAgIGlmIGhvc3QgYW5kIHNjaGVtZSBpbiBOT1JNQUxJWkFCTEVfU0NIRU1FUzoKICAgICAgICAgICAgaG9zdCA9IGhvc3QubG93ZXIoKQogICAgICAgIHJldHVybiBzdXBlcihVcmwsIGNscykuX19uZXdfXyhjbHMsIHNjaGVtZSwgYXV0aCwgaG9zdCwgcG9ydCwgcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnksIGZyYWdtZW50KQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGhvc3RuYW1lKHNlbGYpOgogICAgICAgICIiIkZvciBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSB3aXRoIHVybHBhcnNlLiBXZSdyZSBuaWNlIGxpa2UgdGhhdC4iIiIKICAgICAgICByZXR1cm4gc2VsZi5ob3N0CgogICAgQHByb3BlcnR5CiAgICBkZWYgcmVxdWVzdF91cmkoc2VsZik6CiAgICAgICAgIiIiQWJzb2x1dGUgcGF0aCBpbmNsdWRpbmcgdGhlIHF1ZXJ5IHN0cmluZy4iIiIKICAgICAgICB1cmkgPSBzZWxmLnBhdGggb3IgJy8nCgogICAgICAgIGlmIHNlbGYucXVlcnkgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHVyaSArPSAnPycgKyBzZWxmLnF1ZXJ5CgogICAgICAgIHJldHVybiB1cmkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBuZXRsb2Moc2VsZik6CiAgICAgICAgIiIiTmV0d29yayBsb2NhdGlvbiBpbmNsdWRpbmcgaG9zdCBhbmQgcG9ydCIiIgogICAgICAgIGlmIHNlbGYucG9ydDoKICAgICAgICAgICAgcmV0dXJuICclczolZCcgJSAoc2VsZi5ob3N0LCBzZWxmLnBvcnQpCiAgICAgICAgcmV0dXJuIHNlbGYuaG9zdAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHVybChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBDb252ZXJ0IHNlbGYgaW50byBhIHVybAoKICAgICAgICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBtb3JlIG9yIGxlc3Mgcm91bmQtdHJpcCB3aXRoIDpmdW5jOmAucGFyc2VfdXJsYC4gVGhlCiAgICAgICAgcmV0dXJuZWQgdXJsIG1heSBub3QgYmUgZXhhY3RseSB0aGUgc2FtZSBhcyB0aGUgdXJsIGlucHV0dGVkIHRvCiAgICAgICAgOmZ1bmM6YC5wYXJzZV91cmxgLCBidXQgaXQgc2hvdWxkIGJlIGVxdWl2YWxlbnQgYnkgdGhlIFJGQyAoZS5nLiwgdXJscwogICAgICAgIHdpdGggYSBibGFuayBwb3J0IHdpbGwgaGF2ZSA6IHJlbW92ZWQpLgoKICAgICAgICBFeGFtcGxlOiA6OgoKICAgICAgICAgICAgPj4+IFUgPSBwYXJzZV91cmwoJ2h0dHA6Ly9nb29nbGUuY29tL21haWwvJykKICAgICAgICAgICAgPj4+IFUudXJsCiAgICAgICAgICAgICdodHRwOi8vZ29vZ2xlLmNvbS9tYWlsLycKICAgICAgICAgICAgPj4+IFVybCgnaHR0cCcsICd1c2VybmFtZTpwYXNzd29yZCcsICdob3N0LmNvbScsIDgwLAogICAgICAgICAgICAuLi4gJy9wYXRoJywgJ3F1ZXJ5JywgJ2ZyYWdtZW50JykudXJsCiAgICAgICAgICAgICdodHRwOi8vdXNlcm5hbWU6cGFzc3dvcmRAaG9zdC5jb206ODAvcGF0aD9xdWVyeSNmcmFnbWVudCcKICAgICAgICAiIiIKICAgICAgICBzY2hlbWUsIGF1dGgsIGhvc3QsIHBvcnQsIHBhdGgsIHF1ZXJ5LCBmcmFnbWVudCA9IHNlbGYKICAgICAgICB1cmwgPSAnJwoKICAgICAgICAjIFdlIHVzZSAiaXMgbm90IE5vbmUiIHdlIHdhbnQgdGhpbmdzIHRvIGhhcHBlbiB3aXRoIGVtcHR5IHN0cmluZ3MgKG9yIDAgcG9ydCkKICAgICAgICBpZiBzY2hlbWUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHVybCArPSBzY2hlbWUgKyAnOi8vJwogICAgICAgIGlmIGF1dGggaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHVybCArPSBhdXRoICsgJ0AnCiAgICAgICAgaWYgaG9zdCBpcyBub3QgTm9uZToKICAgICAgICAgICAgdXJsICs9IGhvc3QKICAgICAgICBpZiBwb3J0IGlzIG5vdCBOb25lOgogICAgICAgICAgICB1cmwgKz0gJzonICsgc3RyKHBvcnQpCiAgICAgICAgaWYgcGF0aCBpcyBub3QgTm9uZToKICAgICAgICAgICAgdXJsICs9IHBhdGgKICAgICAgICBpZiBxdWVyeSBpcyBub3QgTm9uZToKICAgICAgICAgICAgdXJsICs9ICc/JyArIHF1ZXJ5CiAgICAgICAgaWYgZnJhZ21lbnQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHVybCArPSAnIycgKyBmcmFnbWVudAoKICAgICAgICByZXR1cm4gdXJsCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYudXJsCgoKZGVmIHNwbGl0X2ZpcnN0KHMsIGRlbGltcyk6CiAgICAiIiIKICAgIEdpdmVuIGEgc3RyaW5nIGFuZCBhbiBpdGVyYWJsZSBvZiBkZWxpbWl0ZXJzLCBzcGxpdCBvbiB0aGUgZmlyc3QgZm91bmQKICAgIGRlbGltaXRlci4gUmV0dXJuIHR3byBzcGxpdCBwYXJ0cyBhbmQgdGhlIG1hdGNoZWQgZGVsaW1pdGVyLgoKICAgIElmIG5vdCBmb3VuZCwgdGhlbiB0aGUgZmlyc3QgcGFydCBpcyB0aGUgZnVsbCBpbnB1dCBzdHJpbmcuCgogICAgRXhhbXBsZTo6CgogICAgICAgID4+PiBzcGxpdF9maXJzdCgnZm9vL2Jhcj9iYXonLCAnPy89JykKICAgICAgICAoJ2ZvbycsICdiYXI/YmF6JywgJy8nKQogICAgICAgID4+PiBzcGxpdF9maXJzdCgnZm9vL2Jhcj9iYXonLCAnMTIzJykKICAgICAgICAoJ2Zvby9iYXI/YmF6JywgJycsIE5vbmUpCgogICAgU2NhbGVzIGxpbmVhcmx5IHdpdGggbnVtYmVyIG9mIGRlbGltcy4gTm90IGlkZWFsIGZvciBsYXJnZSBudW1iZXIgb2YgZGVsaW1zLgogICAgIiIiCiAgICBtaW5faWR4ID0gTm9uZQogICAgbWluX2RlbGltID0gTm9uZQogICAgZm9yIGQgaW4gZGVsaW1zOgogICAgICAgIGlkeCA9IHMuZmluZChkKQogICAgICAgIGlmIGlkeCA8IDA6CiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIGlmIG1pbl9pZHggaXMgTm9uZSBvciBpZHggPCBtaW5faWR4OgogICAgICAgICAgICBtaW5faWR4ID0gaWR4CiAgICAgICAgICAgIG1pbl9kZWxpbSA9IGQKCiAgICBpZiBtaW5faWR4IGlzIE5vbmUgb3IgbWluX2lkeCA8IDA6CiAgICAgICAgcmV0dXJuIHMsICcnLCBOb25lCgogICAgcmV0dXJuIHNbOm1pbl9pZHhdLCBzW21pbl9pZHggKyAxOl0sIG1pbl9kZWxpbQoKCmRlZiBwYXJzZV91cmwodXJsKToKICAgICIiIgogICAgR2l2ZW4gYSB1cmwsIHJldHVybiBhIHBhcnNlZCA6Y2xhc3M6YC5VcmxgIG5hbWVkdHVwbGUuIEJlc3QtZWZmb3J0IGlzCiAgICBwZXJmb3JtZWQgdG8gcGFyc2UgaW5jb21wbGV0ZSB1cmxzLiBGaWVsZHMgbm90IHByb3ZpZGVkIHdpbGwgYmUgTm9uZS4KCiAgICBQYXJ0bHkgYmFja3dhcmRzLWNvbXBhdGlibGUgd2l0aCA6bW9kOmB1cmxwYXJzZWAuCgogICAgRXhhbXBsZTo6CgogICAgICAgID4+PiBwYXJzZV91cmwoJ2h0dHA6Ly9nb29nbGUuY29tL21haWwvJykKICAgICAgICBVcmwoc2NoZW1lPSdodHRwJywgaG9zdD0nZ29vZ2xlLmNvbScsIHBvcnQ9Tm9uZSwgcGF0aD0nL21haWwvJywgLi4uKQogICAgICAgID4+PiBwYXJzZV91cmwoJ2dvb2dsZS5jb206ODAnKQogICAgICAgIFVybChzY2hlbWU9Tm9uZSwgaG9zdD0nZ29vZ2xlLmNvbScsIHBvcnQ9ODAsIHBhdGg9Tm9uZSwgLi4uKQogICAgICAgID4+PiBwYXJzZV91cmwoJy9mb28/YmFyJykKICAgICAgICBVcmwoc2NoZW1lPU5vbmUsIGhvc3Q9Tm9uZSwgcG9ydD1Ob25lLCBwYXRoPScvZm9vJywgcXVlcnk9J2JhcicsIC4uLikKICAgICIiIgoKICAgICMgV2hpbGUgdGhpcyBjb2RlIGhhcyBvdmVybGFwIHdpdGggc3RkbGliJ3MgdXJscGFyc2UsIGl0IGlzIG11Y2gKICAgICMgc2ltcGxpZmllZCBmb3Igb3VyIG5lZWRzIGFuZCBsZXNzIGFubm95aW5nLgogICAgIyBBZGRpdGlvbmFsbHksIHRoaXMgaW1wbGVtZW50YXRpb25zIGRvZXMgc2lsbHkgdGhpbmdzIHRvIGJlIG9wdGltYWwKICAgICMgb24gQ1B5dGhvbi4KCiAgICBpZiBub3QgdXJsOgogICAgICAgICMgRW1wdHkKICAgICAgICByZXR1cm4gVXJsKCkKCiAgICBzY2hlbWUgPSBOb25lCiAgICBhdXRoID0gTm9uZQogICAgaG9zdCA9IE5vbmUKICAgIHBvcnQgPSBOb25lCiAgICBwYXRoID0gTm9uZQogICAgZnJhZ21lbnQgPSBOb25lCiAgICBxdWVyeSA9IE5vbmUKCiAgICAjIFNjaGVtZQogICAgaWYgJzovLycgaW4gdXJsOgogICAgICAgIHNjaGVtZSwgdXJsID0gdXJsLnNwbGl0KCc6Ly8nLCAxKQoKICAgICMgRmluZCB0aGUgZWFybGllc3QgQXV0aG9yaXR5IFRlcm1pbmF0b3IKICAgICMgKGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYjc2VjdGlvbi0zLjIpCiAgICB1cmwsIHBhdGhfLCBkZWxpbSA9IHNwbGl0X2ZpcnN0KHVybCwgWycvJywgJz8nLCAnIyddKQoKICAgIGlmIGRlbGltOgogICAgICAgICMgUmVhc3NlbWJsZSB0aGUgcGF0aAogICAgICAgIHBhdGggPSBkZWxpbSArIHBhdGhfCgogICAgIyBBdXRoCiAgICBpZiAnQCcgaW4gdXJsOgogICAgICAgICMgTGFzdCAnQCcgZGVub3RlcyBlbmQgb2YgYXV0aCBwYXJ0CiAgICAgICAgYXV0aCwgdXJsID0gdXJsLnJzcGxpdCgnQCcsIDEpCgogICAgIyBJUHY2CiAgICBpZiB1cmwgYW5kIHVybFswXSA9PSAnWyc6CiAgICAgICAgaG9zdCwgdXJsID0gdXJsLnNwbGl0KCddJywgMSkKICAgICAgICBob3N0ICs9ICddJwoKICAgICMgUG9ydAogICAgaWYgJzonIGluIHVybDoKICAgICAgICBfaG9zdCwgcG9ydCA9IHVybC5zcGxpdCgnOicsIDEpCgogICAgICAgIGlmIG5vdCBob3N0OgogICAgICAgICAgICBob3N0ID0gX2hvc3QKCiAgICAgICAgaWYgcG9ydDoKICAgICAgICAgICAgIyBJZiBnaXZlbiwgcG9ydHMgbXVzdCBiZSBpbnRlZ2Vycy4gTm8gd2hpdGVzcGFjZSwgbm8gcGx1cyBvcgogICAgICAgICAgICAjIG1pbnVzIHByZWZpeGVzLCBubyBub24taW50ZWdlciBkaWdpdHMgc3VjaCBhcyBeMiAoc3VwZXJzY3JpcHQpLgogICAgICAgICAgICBpZiBub3QgcG9ydC5pc2RpZ2l0KCk6CiAgICAgICAgICAgICAgICByYWlzZSBMb2NhdGlvblBhcnNlRXJyb3IodXJsKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBwb3J0ID0gaW50KHBvcnQpCiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAgICAgcmFpc2UgTG9jYXRpb25QYXJzZUVycm9yKHVybCkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIEJsYW5rIHBvcnRzIGFyZSBjb29sLCB0b28uIChyZmMzOTg2I3NlY3Rpb24tMy4yLjMpCiAgICAgICAgICAgIHBvcnQgPSBOb25lCgogICAgZWxpZiBub3QgaG9zdCBhbmQgdXJsOgogICAgICAgIGhvc3QgPSB1cmwKCiAgICBpZiBub3QgcGF0aDoKICAgICAgICByZXR1cm4gVXJsKHNjaGVtZSwgYXV0aCwgaG9zdCwgcG9ydCwgcGF0aCwgcXVlcnksIGZyYWdtZW50KQoKICAgICMgRnJhZ21lbnQKICAgIGlmICcjJyBpbiBwYXRoOgogICAgICAgIHBhdGgsIGZyYWdtZW50ID0gcGF0aC5zcGxpdCgnIycsIDEpCgogICAgIyBRdWVyeQogICAgaWYgJz8nIGluIHBhdGg6CiAgICAgICAgcGF0aCwgcXVlcnkgPSBwYXRoLnNwbGl0KCc/JywgMSkKCiAgICByZXR1cm4gVXJsKHNjaGVtZSwgYXV0aCwgaG9zdCwgcG9ydCwgcGF0aCwgcXVlcnksIGZyYWdtZW50KQoKCmRlZiBnZXRfaG9zdCh1cmwpOgogICAgIiIiCiAgICBEZXByZWNhdGVkLiBVc2UgOmZ1bmM6YHBhcnNlX3VybGAgaW5zdGVhZC4KICAgICIiIgogICAgcCA9IHBhcnNlX3VybCh1cmwpCiAgICByZXR1cm4gcC5zY2hlbWUgb3IgJ2h0dHAnLCBwLmhvc3RuYW1lLCBwLnBvcnQKUEsDBBQAAAAAAAAAIQC2PCP8qwUAAKsFAAAwAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvdXRpbC93YWl0LnB5ZnJvbSAuc2VsZWN0b3JzIGltcG9ydCAoCiAgICBIQVNfU0VMRUNULAogICAgRGVmYXVsdFNlbGVjdG9yLAogICAgRVZFTlRfUkVBRCwKICAgIEVWRU5UX1dSSVRFCikKCgpkZWYgX3dhaXRfZm9yX2lvX2V2ZW50cyhzb2NrcywgZXZlbnRzLCB0aW1lb3V0PU5vbmUpOgogICAgIiIiIFdhaXRzIGZvciBJTyBldmVudHMgdG8gYmUgYXZhaWxhYmxlIGZyb20gYSBsaXN0IG9mIHNvY2tldHMKICAgIG9yIG9wdGlvbmFsbHkgYSBzaW5nbGUgc29ja2V0IGlmIHBhc3NlZCBpbi4gUmV0dXJucyBhIGxpc3Qgb2YKICAgIHNvY2tldHMgdGhhdCBjYW4gYmUgaW50ZXJhY3RlZCB3aXRoIGltbWVkaWF0ZWx5LiAiIiIKICAgIGlmIG5vdCBIQVNfU0VMRUNUOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1BsYXRmb3JtIGRvZXMgbm90IGhhdmUgYSBzZWxlY3RvcicpCiAgICBpZiBub3QgaXNpbnN0YW5jZShzb2NrcywgbGlzdCk6CiAgICAgICAgIyBQcm9iYWJseSBqdXN0IGEgc2luZ2xlIHNvY2tldC4KICAgICAgICBpZiBoYXNhdHRyKHNvY2tzLCAiZmlsZW5vIik6CiAgICAgICAgICAgIHNvY2tzID0gW3NvY2tzXQogICAgICAgICMgT3RoZXJ3aXNlIGl0IG1pZ2h0IGJlIGEgbm9uLWxpc3QgaXRlcmFibGUuCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc29ja3MgPSBsaXN0KHNvY2tzKQogICAgd2l0aCBEZWZhdWx0U2VsZWN0b3IoKSBhcyBzZWxlY3RvcjoKICAgICAgICBmb3Igc29jayBpbiBzb2NrczoKICAgICAgICAgICAgc2VsZWN0b3IucmVnaXN0ZXIoc29jaywgZXZlbnRzKQogICAgICAgIHJldHVybiBba2V5WzBdLmZpbGVvYmogZm9yIGtleSBpbgogICAgICAgICAgICAgICAgc2VsZWN0b3Iuc2VsZWN0KHRpbWVvdXQpIGlmIGtleVsxXSAmIGV2ZW50c10KCgpkZWYgd2FpdF9mb3JfcmVhZChzb2NrcywgdGltZW91dD1Ob25lKToKICAgICIiIiBXYWl0cyBmb3IgcmVhZGluZyB0byBiZSBhdmFpbGFibGUgZnJvbSBhIGxpc3Qgb2Ygc29ja2V0cwogICAgb3Igb3B0aW9uYWxseSBhIHNpbmdsZSBzb2NrZXQgaWYgcGFzc2VkIGluLiBSZXR1cm5zIGEgbGlzdCBvZgogICAgc29ja2V0cyB0aGF0IGNhbiBiZSByZWFkIGZyb20gaW1tZWRpYXRlbHkuICIiIgogICAgcmV0dXJuIF93YWl0X2Zvcl9pb19ldmVudHMoc29ja3MsIEVWRU5UX1JFQUQsIHRpbWVvdXQpCgoKZGVmIHdhaXRfZm9yX3dyaXRlKHNvY2tzLCB0aW1lb3V0PU5vbmUpOgogICAgIiIiIFdhaXRzIGZvciB3cml0aW5nIHRvIGJlIGF2YWlsYWJsZSBmcm9tIGEgbGlzdCBvZiBzb2NrZXRzCiAgICBvciBvcHRpb25hbGx5IGEgc2luZ2xlIHNvY2tldCBpZiBwYXNzZWQgaW4uIFJldHVybnMgYSBsaXN0IG9mCiAgICBzb2NrZXRzIHRoYXQgY2FuIGJlIHdyaXR0ZW4gdG8gaW1tZWRpYXRlbHkuICIiIgogICAgcmV0dXJuIF93YWl0X2Zvcl9pb19ldmVudHMoc29ja3MsIEVWRU5UX1dSSVRFLCB0aW1lb3V0KQpQSwMEFAAAAAAAAAAhAG/BoThQKQAAUCkAADQAAABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3Ivd2ViZW5jb2RpbmdzL19faW5pdF9fLnB5IyBjb2Rpbmc6IHV0ZjgKIiIiCgogICAgd2ViZW5jb2RpbmdzCiAgICB+fn5+fn5+fn5+fn4KCiAgICBUaGlzIGlzIGEgUHl0aG9uIGltcGxlbWVudGF0aW9uIG9mIHRoZSBgV0hBVFdHIEVuY29kaW5nIHN0YW5kYXJkCiAgICA8aHR0cDovL2VuY29kaW5nLnNwZWMud2hhdHdnLm9yZy8+YC4gU2VlIFJFQURNRSBmb3IgZGV0YWlscy4KCiAgICA6Y29weXJpZ2h0OiBDb3B5cmlnaHQgMjAxMiBieSBTaW1vbiBTYXBpbgogICAgOmxpY2Vuc2U6IEJTRCwgc2VlIExJQ0VOU0UgZm9yIGRldGFpbHMuCgoiIiIKCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgdW5pY29kZV9saXRlcmFscwoKaW1wb3J0IGNvZGVjcwoKZnJvbSAubGFiZWxzIGltcG9ydCBMQUJFTFMKCgpWRVJTSU9OID0gJzAuNScKCgojIFNvbWUgbmFtZXMgaW4gRW5jb2RpbmcgYXJlIG5vdCB2YWxpZCBQeXRob24gYWxpYXNlcy4gUmVtYXAgdGhlc2UuClBZVEhPTl9OQU1FUyA9IHsKICAgICdpc28tODg1OS04LWknOiAnaXNvLTg4NTktOCcsCiAgICAneC1tYWMtY3lyaWxsaWMnOiAnbWFjLWN5cmlsbGljJywKICAgICdtYWNpbnRvc2gnOiAnbWFjLXJvbWFuJywKICAgICd3aW5kb3dzLTg3NCc6ICdjcDg3NCd9CgpDQUNIRSA9IHt9CgoKZGVmIGFzY2lpX2xvd2VyKHN0cmluZyk6CiAgICByIiIiVHJhbnNmb3JtIChvbmx5KSBBU0NJSSBsZXR0ZXJzIHRvIGxvd2VyIGNhc2U6IEEtWiBpcyBtYXBwZWQgdG8gYS16LgoKICAgIDpwYXJhbSBzdHJpbmc6IEFuIFVuaWNvZGUgc3RyaW5nLgogICAgOnJldHVybnM6IEEgbmV3IFVuaWNvZGUgc3RyaW5nLgoKICAgIFRoaXMgaXMgdXNlZCBmb3IgYEFTQ0lJIGNhc2UtaW5zZW5zaXRpdmUKICAgIDxodHRwOi8vZW5jb2Rpbmcuc3BlYy53aGF0d2cub3JnLyNhc2NpaS1jYXNlLWluc2Vuc2l0aXZlPmBfCiAgICBtYXRjaGluZyBvZiBlbmNvZGluZyBsYWJlbHMuCiAgICBUaGUgc2FtZSBtYXRjaGluZyBpcyBhbHNvIHVzZWQsIGFtb25nIG90aGVyIHRoaW5ncywKICAgIGZvciBgQ1NTIGtleXdvcmRzIDxodHRwOi8vZGV2LnczLm9yZy9jc3N3Zy9jc3MtdmFsdWVzLyNrZXl3b3Jkcz5gXy4KCiAgICBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIHRoZSA6bWV0aDpgfnB5OnN0ci5sb3dlcmAgbWV0aG9kIG9mIFVuaWNvZGUgc3RyaW5ncwogICAgd2hpY2ggYWxzbyBhZmZlY3Qgbm9uLUFTQ0lJIGNoYXJhY3RlcnMsCiAgICBzb21ldGltZXMgbWFwcGluZyB0aGVtIGludG8gdGhlIEFTQ0lJIHJhbmdlOgoKICAgICAgICA+Pj4ga2V5d29yZCA9IHUnQmFjXE57S0VMVklOIFNJR059Z3JvdW5kJwogICAgICAgID4+PiBhc3NlcnQga2V5d29yZC5sb3dlcigpID09IHUnYmFja2dyb3VuZCcKICAgICAgICA+Pj4gYXNzZXJ0IGFzY2lpX2xvd2VyKGtleXdvcmQpICE9IGtleXdvcmQubG93ZXIoKQogICAgICAgID4+PiBhc3NlcnQgYXNjaWlfbG93ZXIoa2V5d29yZCkgPT0gdSdiYWNcTntLRUxWSU4gU0lHTn1ncm91bmQnCgogICAgIiIiCiAgICAjIFRoaXMgdHVybnMgb3V0IHRvIGJlIGZhc3RlciB0aGFuIHVuaWNvZGUudHJhbnNsYXRlKCkKICAgIHJldHVybiBzdHJpbmcuZW5jb2RlKCd1dGY4JykubG93ZXIoKS5kZWNvZGUoJ3V0ZjgnKQoKCmRlZiBsb29rdXAobGFiZWwpOgogICAgIiIiCiAgICBMb29rIGZvciBhbiBlbmNvZGluZyBieSBpdHMgbGFiZWwuCiAgICBUaGlzIGlzIHRoZSBzcGVj4oCZcyBgZ2V0IGFuIGVuY29kaW5nCiAgICA8aHR0cDovL2VuY29kaW5nLnNwZWMud2hhdHdnLm9yZy8jY29uY2VwdC1lbmNvZGluZy1nZXQ+YF8gYWxnb3JpdGhtLgogICAgU3VwcG9ydGVkIGxhYmVscyBhcmUgbGlzdGVkIHRoZXJlLgoKICAgIDpwYXJhbSBsYWJlbDogQSBzdHJpbmcuCiAgICA6cmV0dXJuczoKICAgICAgICBBbiA6Y2xhc3M6YEVuY29kaW5nYCBvYmplY3QsIG9yIDpvYmo6YE5vbmVgIGZvciBhbiB1bmtub3duIGxhYmVsLgoKICAgICIiIgogICAgIyBPbmx5IHN0cmlwIEFTQ0lJIHdoaXRlc3BhY2U6IFUrMDAwOSwgVSswMDBBLCBVKzAwMEMsIFUrMDAwRCwgYW5kIFUrMDAyMC4KICAgIGxhYmVsID0gYXNjaWlfbG93ZXIobGFiZWwuc3RyaXAoJ1x0XG5cZlxyICcpKQogICAgbmFtZSA9IExBQkVMUy5nZXQobGFiZWwpCiAgICBpZiBuYW1lIGlzIE5vbmU6CiAgICAgICAgcmV0dXJuIE5vbmUKICAgIGVuY29kaW5nID0gQ0FDSEUuZ2V0KG5hbWUpCiAgICBpZiBlbmNvZGluZyBpcyBOb25lOgogICAgICAgIGlmIG5hbWUgPT0gJ3gtdXNlci1kZWZpbmVkJzoKICAgICAgICAgICAgZnJvbSAueF91c2VyX2RlZmluZWQgaW1wb3J0IGNvZGVjX2luZm8KICAgICAgICBlbHNlOgogICAgICAgICAgICBweXRob25fbmFtZSA9IFBZVEhPTl9OQU1FUy5nZXQobmFtZSwgbmFtZSkKICAgICAgICAgICAgIyBBbnkgcHl0aG9uX25hbWUgdmFsdWUgdGhhdCBnZXRzIHRvIGhlcmUgc2hvdWxkIGJlIHZhbGlkLgogICAgICAgICAgICBjb2RlY19pbmZvID0gY29kZWNzLmxvb2t1cChweXRob25fbmFtZSkKICAgICAgICBlbmNvZGluZyA9IEVuY29kaW5nKG5hbWUsIGNvZGVjX2luZm8pCiAgICAgICAgQ0FDSEVbbmFtZV0gPSBlbmNvZGluZwogICAgcmV0dXJuIGVuY29kaW5nCgoKZGVmIF9nZXRfZW5jb2RpbmcoZW5jb2Rpbmdfb3JfbGFiZWwpOgogICAgIiIiCiAgICBBY2NlcHQgZWl0aGVyIGFuIGVuY29kaW5nIG9iamVjdCBvciBsYWJlbC4KCiAgICA6cGFyYW0gZW5jb2Rpbmc6IEFuIDpjbGFzczpgRW5jb2RpbmdgIG9iamVjdCBvciBhIGxhYmVsIHN0cmluZy4KICAgIDpyZXR1cm5zOiBBbiA6Y2xhc3M6YEVuY29kaW5nYCBvYmplY3QuCiAgICA6cmFpc2VzOiA6ZXhjOmB+ZXhjZXB0aW9ucy5Mb29rdXBFcnJvcmAgZm9yIGFuIHVua25vd24gbGFiZWwuCgogICAgIiIiCiAgICBpZiBoYXNhdHRyKGVuY29kaW5nX29yX2xhYmVsLCAnY29kZWNfaW5mbycpOgogICAgICAgIHJldHVybiBlbmNvZGluZ19vcl9sYWJlbAoKICAgIGVuY29kaW5nID0gbG9va3VwKGVuY29kaW5nX29yX2xhYmVsKQogICAgaWYgZW5jb2RpbmcgaXMgTm9uZToKICAgICAgICByYWlzZSBMb29rdXBFcnJvcignVW5rbm93biBlbmNvZGluZyBsYWJlbDogJXInICUgZW5jb2Rpbmdfb3JfbGFiZWwpCiAgICByZXR1cm4gZW5jb2RpbmcKCgpjbGFzcyBFbmNvZGluZyhvYmplY3QpOgogICAgIiIiUmVyZXNlbnRzIGEgY2hhcmFjdGVyIGVuY29kaW5nIHN1Y2ggYXMgVVRGLTgsCiAgICB0aGF0IGNhbiBiZSB1c2VkIGZvciBkZWNvZGluZyBvciBlbmNvZGluZy4KCiAgICAuLiBhdHRyaWJ1dGU6OiBuYW1lCgogICAgICAgIENhbm9uaWNhbCBuYW1lIG9mIHRoZSBlbmNvZGluZwoKICAgIC4uIGF0dHJpYnV0ZTo6IGNvZGVjX2luZm8KCiAgICAgICAgVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZW5jb2RpbmcsCiAgICAgICAgYSBzdGRsaWIgOmNsYXNzOmB+Y29kZWNzLkNvZGVjSW5mb2Agb2JqZWN0LgogICAgICAgIFNlZSA6ZnVuYzpgY29kZWNzLnJlZ2lzdGVyYC4KCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBjb2RlY19pbmZvKToKICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCiAgICAgICAgc2VsZi5jb2RlY19pbmZvID0gY29kZWNfaW5mbwoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gJzxFbmNvZGluZyAlcz4nICUgc2VsZi5uYW1lCgoKIzogVGhlIFVURi04IGVuY29kaW5nLiBTaG91bGQgYmUgdXNlZCBmb3IgbmV3IGNvbnRlbnQgYW5kIGZvcm1hdHMuClVURjggPSBsb29rdXAoJ3V0Zi04JykKCl9VVEYxNkxFID0gbG9va3VwKCd1dGYtMTZsZScpCl9VVEYxNkJFID0gbG9va3VwKCd1dGYtMTZiZScpCgoKZGVmIGRlY29kZShpbnB1dCwgZmFsbGJhY2tfZW5jb2RpbmcsIGVycm9ycz0ncmVwbGFjZScpOgogICAgIiIiCiAgICBEZWNvZGUgYSBzaW5nbGUgc3RyaW5nLgoKICAgIDpwYXJhbSBpbnB1dDogQSBieXRlIHN0cmluZwogICAgOnBhcmFtIGZhbGxiYWNrX2VuY29kaW5nOgogICAgICAgIEFuIDpjbGFzczpgRW5jb2RpbmdgIG9iamVjdCBvciBhIGxhYmVsIHN0cmluZy4KICAgICAgICBUaGUgZW5jb2RpbmcgdG8gdXNlIGlmIDpvYmo6YGlucHV0YCBkb2VzIG5vdGUgaGF2ZSBhIEJPTS4KICAgIDpwYXJhbSBlcnJvcnM6IFR5cGUgb2YgZXJyb3IgaGFuZGxpbmcuIFNlZSA6ZnVuYzpgY29kZWNzLnJlZ2lzdGVyYC4KICAgIDpyYWlzZXM6IDpleGM6YH5leGNlcHRpb25zLkxvb2t1cEVycm9yYCBmb3IgYW4gdW5rbm93biBlbmNvZGluZyBsYWJlbC4KICAgIDpyZXR1cm46CiAgICAgICAgQSBgYChvdXRwdXQsIGVuY29kaW5nKWBgIHR1cGxlIG9mIGFuIFVuaWNvZGUgc3RyaW5nCiAgICAgICAgYW5kIGFuIDpvYmo6YEVuY29kaW5nYC4KCiAgICAiIiIKICAgICMgRmFpbCBlYXJseSBpZiBgZW5jb2RpbmdgIGlzIGFuIGludmFsaWQgbGFiZWwuCiAgICBmYWxsYmFja19lbmNvZGluZyA9IF9nZXRfZW5jb2RpbmcoZmFsbGJhY2tfZW5jb2RpbmcpCiAgICBib21fZW5jb2RpbmcsIGlucHV0ID0gX2RldGVjdF9ib20oaW5wdXQpCiAgICBlbmNvZGluZyA9IGJvbV9lbmNvZGluZyBvciBmYWxsYmFja19lbmNvZGluZwogICAgcmV0dXJuIGVuY29kaW5nLmNvZGVjX2luZm8uZGVjb2RlKGlucHV0LCBlcnJvcnMpWzBdLCBlbmNvZGluZwoKCmRlZiBfZGV0ZWN0X2JvbShpbnB1dCk6CiAgICAiIiJSZXR1cm4gKGJvbV9lbmNvZGluZywgaW5wdXQpLCB3aXRoIGFueSBCT00gcmVtb3ZlZCBmcm9tIHRoZSBpbnB1dC4iIiIKICAgIGlmIGlucHV0LnN0YXJ0c3dpdGgoYidceEZGXHhGRScpOgogICAgICAgIHJldHVybiBfVVRGMTZMRSwgaW5wdXRbMjpdCiAgICBpZiBpbnB1dC5zdGFydHN3aXRoKGInXHhGRVx4RkYnKToKICAgICAgICByZXR1cm4gX1VURjE2QkUsIGlucHV0WzI6XQogICAgaWYgaW5wdXQuc3RhcnRzd2l0aChiJ1x4RUZceEJCXHhCRicpOgogICAgICAgIHJldHVybiBVVEY4LCBpbnB1dFszOl0KICAgIHJldHVybiBOb25lLCBpbnB1dAoKCmRlZiBlbmNvZGUoaW5wdXQsIGVuY29kaW5nPVVURjgsIGVycm9ycz0nc3RyaWN0Jyk6CiAgICAiIiIKICAgIEVuY29kZSBhIHNpbmdsZSBzdHJpbmcuCgogICAgOnBhcmFtIGlucHV0OiBBbiBVbmljb2RlIHN0cmluZy4KICAgIDpwYXJhbSBlbmNvZGluZzogQW4gOmNsYXNzOmBFbmNvZGluZ2Agb2JqZWN0IG9yIGEgbGFiZWwgc3RyaW5nLgogICAgOnBhcmFtIGVycm9yczogVHlwZSBvZiBlcnJvciBoYW5kbGluZy4gU2VlIDpmdW5jOmBjb2RlY3MucmVnaXN0ZXJgLgogICAgOnJhaXNlczogOmV4YzpgfmV4Y2VwdGlvbnMuTG9va3VwRXJyb3JgIGZvciBhbiB1bmtub3duIGVuY29kaW5nIGxhYmVsLgogICAgOnJldHVybjogQSBieXRlIHN0cmluZy4KCiAgICAiIiIKICAgIHJldHVybiBfZ2V0X2VuY29kaW5nKGVuY29kaW5nKS5jb2RlY19pbmZvLmVuY29kZShpbnB1dCwgZXJyb3JzKVswXQoKCmRlZiBpdGVyX2RlY29kZShpbnB1dCwgZmFsbGJhY2tfZW5jb2RpbmcsIGVycm9ycz0ncmVwbGFjZScpOgogICAgIiIiCiAgICAiUHVsbCItYmFzZWQgZGVjb2Rlci4KCiAgICA6cGFyYW0gaW5wdXQ6CiAgICAgICAgQW4gaXRlcmFibGUgb2YgYnl0ZSBzdHJpbmdzLgoKICAgICAgICBUaGUgaW5wdXQgaXMgZmlyc3QgY29uc3VtZWQganVzdCBlbm91Z2ggdG8gZGV0ZXJtaW5lIHRoZSBlbmNvZGluZwogICAgICAgIGJhc2VkIG9uIHRoZSBwcmVjZW5zZSBvZiBhIEJPTSwKICAgICAgICB0aGVuIGNvbnN1bWVkIG9uIGRlbWFuZCB3aGVuIHRoZSByZXR1cm4gdmFsdWUgaXMuCiAgICA6cGFyYW0gZmFsbGJhY2tfZW5jb2Rpbmc6CiAgICAgICAgQW4gOmNsYXNzOmBFbmNvZGluZ2Agb2JqZWN0IG9yIGEgbGFiZWwgc3RyaW5nLgogICAgICAgIFRoZSBlbmNvZGluZyB0byB1c2UgaWYgOm9iajpgaW5wdXRgIGRvZXMgbm90ZSBoYXZlIGEgQk9NLgogICAgOnBhcmFtIGVycm9yczogVHlwZSBvZiBlcnJvciBoYW5kbGluZy4gU2VlIDpmdW5jOmBjb2RlY3MucmVnaXN0ZXJgLgogICAgOnJhaXNlczogOmV4YzpgfmV4Y2VwdGlvbnMuTG9va3VwRXJyb3JgIGZvciBhbiB1bmtub3duIGVuY29kaW5nIGxhYmVsLgogICAgOnJldHVybnM6CiAgICAgICAgQW4gYGAob3V0cHV0LCBlbmNvZGluZylgYCB0dXBsZS4KICAgICAgICA6b2JqOmBvdXRwdXRgIGlzIGFuIGl0ZXJhYmxlIG9mIFVuaWNvZGUgc3RyaW5ncywKICAgICAgICA6b2JqOmBlbmNvZGluZ2AgaXMgdGhlIDpvYmo6YEVuY29kaW5nYCB0aGF0IGlzIGJlaW5nIHVzZWQuCgogICAgIiIiCgogICAgZGVjb2RlciA9IEluY3JlbWVudGFsRGVjb2RlcihmYWxsYmFja19lbmNvZGluZywgZXJyb3JzKQogICAgZ2VuZXJhdG9yID0gX2l0ZXJfZGVjb2RlX2dlbmVyYXRvcihpbnB1dCwgZGVjb2RlcikKICAgIGVuY29kaW5nID0gbmV4dChnZW5lcmF0b3IpCiAgICByZXR1cm4gZ2VuZXJhdG9yLCBlbmNvZGluZwoKCmRlZiBfaXRlcl9kZWNvZGVfZ2VuZXJhdG9yKGlucHV0LCBkZWNvZGVyKToKICAgICIiIlJldHVybiBhIGdlbmVyYXRvciB0aGF0IGZpcnN0IHlpZWxkcyB0aGUgOm9iajpgRW5jb2RpbmdgLAogICAgdGhlbiB5aWVsZHMgb3V0cHV0IGNodWtucyBhcyBVbmljb2RlIHN0cmluZ3MuCgogICAgIiIiCiAgICBkZWNvZGUgPSBkZWNvZGVyLmRlY29kZQogICAgaW5wdXQgPSBpdGVyKGlucHV0KQogICAgZm9yIGNodW5jayBpbiBpbnB1dDoKICAgICAgICBvdXRwdXQgPSBkZWNvZGUoY2h1bmNrKQogICAgICAgIGlmIG91dHB1dDoKICAgICAgICAgICAgYXNzZXJ0IGRlY29kZXIuZW5jb2RpbmcgaXMgbm90IE5vbmUKICAgICAgICAgICAgeWllbGQgZGVjb2Rlci5lbmNvZGluZwogICAgICAgICAgICB5aWVsZCBvdXRwdXQKICAgICAgICAgICAgYnJlYWsKICAgIGVsc2U6CiAgICAgICAgIyBJbnB1dCBleGhhdXN0ZWQgd2l0aG91dCBkZXRlcm1pbmluZyB0aGUgZW5jb2RpbmcKICAgICAgICBvdXRwdXQgPSBkZWNvZGUoYicnLCBmaW5hbD1UcnVlKQogICAgICAgIGFzc2VydCBkZWNvZGVyLmVuY29kaW5nIGlzIG5vdCBOb25lCiAgICAgICAgeWllbGQgZGVjb2Rlci5lbmNvZGluZwogICAgICAgIGlmIG91dHB1dDoKICAgICAgICAgICAgeWllbGQgb3V0cHV0CiAgICAgICAgcmV0dXJuCgogICAgZm9yIGNodW5jayBpbiBpbnB1dDoKICAgICAgICBvdXRwdXQgPSBkZWNvZGUoY2h1bmNrKQogICAgICAgIGlmIG91dHB1dDoKICAgICAgICAgICAgeWllbGQgb3V0cHV0CiAgICBvdXRwdXQgPSBkZWNvZGUoYicnLCBmaW5hbD1UcnVlKQogICAgaWYgb3V0cHV0OgogICAgICAgIHlpZWxkIG91dHB1dAoKCmRlZiBpdGVyX2VuY29kZShpbnB1dCwgZW5jb2Rpbmc9VVRGOCwgZXJyb3JzPSdzdHJpY3QnKToKICAgICIiIgogICAg4oCcUHVsbOKAnS1iYXNlZCBlbmNvZGVyLgoKICAgIDpwYXJhbSBpbnB1dDogQW4gaXRlcmFibGUgb2YgVW5pY29kZSBzdHJpbmdzLgogICAgOnBhcmFtIGVuY29kaW5nOiBBbiA6Y2xhc3M6YEVuY29kaW5nYCBvYmplY3Qgb3IgYSBsYWJlbCBzdHJpbmcuCiAgICA6cGFyYW0gZXJyb3JzOiBUeXBlIG9mIGVycm9yIGhhbmRsaW5nLiBTZWUgOmZ1bmM6YGNvZGVjcy5yZWdpc3RlcmAuCiAgICA6cmFpc2VzOiA6ZXhjOmB+ZXhjZXB0aW9ucy5Mb29rdXBFcnJvcmAgZm9yIGFuIHVua25vd24gZW5jb2RpbmcgbGFiZWwuCiAgICA6cmV0dXJuczogQW4gaXRlcmFibGUgb2YgYnl0ZSBzdHJpbmdzLgoKICAgICIiIgogICAgIyBGYWlsIGVhcmx5IGlmIGBlbmNvZGluZ2AgaXMgYW4gaW52YWxpZCBsYWJlbC4KICAgIGVuY29kZSA9IEluY3JlbWVudGFsRW5jb2RlcihlbmNvZGluZywgZXJyb3JzKS5lbmNvZGUKICAgIHJldHVybiBfaXRlcl9lbmNvZGVfZ2VuZXJhdG9yKGlucHV0LCBlbmNvZGUpCgoKZGVmIF9pdGVyX2VuY29kZV9nZW5lcmF0b3IoaW5wdXQsIGVuY29kZSk6CiAgICBmb3IgY2h1bmNrIGluIGlucHV0OgogICAgICAgIG91dHB1dCA9IGVuY29kZShjaHVuY2spCiAgICAgICAgaWYgb3V0cHV0OgogICAgICAgICAgICB5aWVsZCBvdXRwdXQKICAgIG91dHB1dCA9IGVuY29kZSgnJywgZmluYWw9VHJ1ZSkKICAgIGlmIG91dHB1dDoKICAgICAgICB5aWVsZCBvdXRwdXQKCgpjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIob2JqZWN0KToKICAgICIiIgogICAg4oCcUHVzaOKAnS1iYXNlZCBkZWNvZGVyLgoKICAgIDpwYXJhbSBmYWxsYmFja19lbmNvZGluZzoKICAgICAgICBBbiA6Y2xhc3M6YEVuY29kaW5nYCBvYmplY3Qgb3IgYSBsYWJlbCBzdHJpbmcuCiAgICAgICAgVGhlIGVuY29kaW5nIHRvIHVzZSBpZiA6b2JqOmBpbnB1dGAgZG9lcyBub3RlIGhhdmUgYSBCT00uCiAgICA6cGFyYW0gZXJyb3JzOiBUeXBlIG9mIGVycm9yIGhhbmRsaW5nLiBTZWUgOmZ1bmM6YGNvZGVjcy5yZWdpc3RlcmAuCiAgICA6cmFpc2VzOiA6ZXhjOmB+ZXhjZXB0aW9ucy5Mb29rdXBFcnJvcmAgZm9yIGFuIHVua25vd24gZW5jb2RpbmcgbGFiZWwuCgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZiwgZmFsbGJhY2tfZW5jb2RpbmcsIGVycm9ycz0ncmVwbGFjZScpOgogICAgICAgICMgRmFpbCBlYXJseSBpZiBgZW5jb2RpbmdgIGlzIGFuIGludmFsaWQgbGFiZWwuCiAgICAgICAgc2VsZi5fZmFsbGJhY2tfZW5jb2RpbmcgPSBfZ2V0X2VuY29kaW5nKGZhbGxiYWNrX2VuY29kaW5nKQogICAgICAgIHNlbGYuX2Vycm9ycyA9IGVycm9ycwogICAgICAgIHNlbGYuX2J1ZmZlciA9IGInJwogICAgICAgIHNlbGYuX2RlY29kZXIgPSBOb25lCiAgICAgICAgIzogVGhlIGFjdHVhbCA6Y2xhc3M6YEVuY29kaW5nYCB0aGF0IGlzIGJlaW5nIHVzZWQsCiAgICAgICAgIzogb3IgOm9iajpgTm9uZWAgaWYgdGhhdCBpcyBub3QgZGV0ZXJtaW5lZCB5ZXQuCiAgICAgICAgIzogKEllLiBpZiB0aGVyZSBpcyBub3QgZW5vdWdoIGlucHV0IHlldCB0byBkZXRlcm1pbmUKICAgICAgICAjOiBpZiB0aGVyZSBpcyBhIEJPTS4pCiAgICAgICAgc2VsZi5lbmNvZGluZyA9IE5vbmUgICMgTm90IGtub3duIHlldC4KCiAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CiAgICAgICAgIiIiRGVjb2RlIG9uZSBjaHVuayBvZiB0aGUgaW5wdXQuCgogICAgICAgIDpwYXJhbSBpbnB1dDogQSBieXRlIHN0cmluZy4KICAgICAgICA6cGFyYW0gZmluYWw6CiAgICAgICAgICAgIEluZGljYXRlIHRoYXQgbm8gbW9yZSBpbnB1dCBpcyBhdmFpbGFibGUuCiAgICAgICAgICAgIE11c3QgYmUgOm9iajpgVHJ1ZWAgaWYgdGhpcyBpcyB0aGUgbGFzdCBjYWxsLgogICAgICAgIDpyZXR1cm5zOiBBbiBVbmljb2RlIHN0cmluZy4KCiAgICAgICAgIiIiCiAgICAgICAgZGVjb2RlciA9IHNlbGYuX2RlY29kZXIKICAgICAgICBpZiBkZWNvZGVyIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gZGVjb2RlcihpbnB1dCwgZmluYWwpCgogICAgICAgIGlucHV0ID0gc2VsZi5fYnVmZmVyICsgaW5wdXQKICAgICAgICBlbmNvZGluZywgaW5wdXQgPSBfZGV0ZWN0X2JvbShpbnB1dCkKICAgICAgICBpZiBlbmNvZGluZyBpcyBOb25lOgogICAgICAgICAgICBpZiBsZW4oaW5wdXQpIDwgMyBhbmQgbm90IGZpbmFsOiAgIyBOb3QgZW5vdWdoIGRhdGEgeWV0LgogICAgICAgICAgICAgICAgc2VsZi5fYnVmZmVyID0gaW5wdXQKICAgICAgICAgICAgICAgIHJldHVybiAnJwogICAgICAgICAgICBlbHNlOiAgIyBObyBCT00KICAgICAgICAgICAgICAgIGVuY29kaW5nID0gc2VsZi5fZmFsbGJhY2tfZW5jb2RpbmcKICAgICAgICBkZWNvZGVyID0gZW5jb2RpbmcuY29kZWNfaW5mby5pbmNyZW1lbnRhbGRlY29kZXIoc2VsZi5fZXJyb3JzKS5kZWNvZGUKICAgICAgICBzZWxmLl9kZWNvZGVyID0gZGVjb2RlcgogICAgICAgIHNlbGYuZW5jb2RpbmcgPSBlbmNvZGluZwogICAgICAgIHJldHVybiBkZWNvZGVyKGlucHV0LCBmaW5hbCkKCgpjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIob2JqZWN0KToKICAgICIiIgogICAg4oCcUHVzaOKAnS1iYXNlZCBlbmNvZGVyLgoKICAgIDpwYXJhbSBlbmNvZGluZzogQW4gOmNsYXNzOmBFbmNvZGluZ2Agb2JqZWN0IG9yIGEgbGFiZWwgc3RyaW5nLgogICAgOnBhcmFtIGVycm9yczogVHlwZSBvZiBlcnJvciBoYW5kbGluZy4gU2VlIDpmdW5jOmBjb2RlY3MucmVnaXN0ZXJgLgogICAgOnJhaXNlczogOmV4YzpgfmV4Y2VwdGlvbnMuTG9va3VwRXJyb3JgIGZvciBhbiB1bmtub3duIGVuY29kaW5nIGxhYmVsLgoKICAgIC4uIG1ldGhvZDo6IGVuY29kZShpbnB1dCwgZmluYWw9RmFsc2UpCgogICAgICAgIDpwYXJhbSBpbnB1dDogQW4gVW5pY29kZSBzdHJpbmcuCiAgICAgICAgOnBhcmFtIGZpbmFsOgogICAgICAgICAgICBJbmRpY2F0ZSB0aGF0IG5vIG1vcmUgaW5wdXQgaXMgYXZhaWxhYmxlLgogICAgICAgICAgICBNdXN0IGJlIDpvYmo6YFRydWVgIGlmIHRoaXMgaXMgdGhlIGxhc3QgY2FsbC4KICAgICAgICA6cmV0dXJuczogQSBieXRlIHN0cmluZy4KCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlbmNvZGluZz1VVEY4LCBlcnJvcnM9J3N0cmljdCcpOgogICAgICAgIGVuY29kaW5nID0gX2dldF9lbmNvZGluZyhlbmNvZGluZykKICAgICAgICBzZWxmLmVuY29kZSA9IGVuY29kaW5nLmNvZGVjX2luZm8uaW5jcmVtZW50YWxlbmNvZGVyKGVycm9ycykuZW5jb2RlClBLAwQUAAAAAAAAACEAx60IixMjAAATIwAAMgAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci93ZWJlbmNvZGluZ3MvbGFiZWxzLnB5IiIiCgogICAgd2ViZW5jb2RpbmdzLmxhYmVscwogICAgfn5+fn5+fn5+fn5+fn5+fn5+fgoKICAgIE1hcCBlbmNvZGluZyBsYWJlbHMgdG8gdGhlaXIgbmFtZS4KCiAgICA6Y29weXJpZ2h0OiBDb3B5cmlnaHQgMjAxMiBieSBTaW1vbiBTYXBpbgogICAgOmxpY2Vuc2U6IEJTRCwgc2VlIExJQ0VOU0UgZm9yIGRldGFpbHMuCgoiIiIKCiMgWFhYIERvIG5vdCBlZGl0IQojIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBta2xhYmVscy5weQoKTEFCRUxTID0gewogICAgJ3VuaWNvZGUtMS0xLXV0Zi04JzogICAndXRmLTgnLAogICAgJ3V0Zi04JzogICAgICAgICAgICAgICAndXRmLTgnLAogICAgJ3V0ZjgnOiAgICAgICAgICAgICAgICAndXRmLTgnLAogICAgJzg2Nic6ICAgICAgICAgICAgICAgICAnaWJtODY2JywKICAgICdjcDg2Nic6ICAgICAgICAgICAgICAgJ2libTg2NicsCiAgICAnY3NpYm04NjYnOiAgICAgICAgICAgICdpYm04NjYnLAogICAgJ2libTg2Nic6ICAgICAgICAgICAgICAnaWJtODY2JywKICAgICdjc2lzb2xhdGluMic6ICAgICAgICAgJ2lzby04ODU5LTInLAogICAgJ2lzby04ODU5LTInOiAgICAgICAgICAnaXNvLTg4NTktMicsCiAgICAnaXNvLWlyLTEwMSc6ICAgICAgICAgICdpc28tODg1OS0yJywKICAgICdpc284ODU5LTInOiAgICAgICAgICAgJ2lzby04ODU5LTInLAogICAgJ2lzbzg4NTkyJzogICAgICAgICAgICAnaXNvLTg4NTktMicsCiAgICAnaXNvXzg4NTktMic6ICAgICAgICAgICdpc28tODg1OS0yJywKICAgICdpc29fODg1OS0yOjE5ODcnOiAgICAgJ2lzby04ODU5LTInLAogICAgJ2wyJzogICAgICAgICAgICAgICAgICAnaXNvLTg4NTktMicsCiAgICAnbGF0aW4yJzogICAgICAgICAgICAgICdpc28tODg1OS0yJywKICAgICdjc2lzb2xhdGluMyc6ICAgICAgICAgJ2lzby04ODU5LTMnLAogICAgJ2lzby04ODU5LTMnOiAgICAgICAgICAnaXNvLTg4NTktMycsCiAgICAnaXNvLWlyLTEwOSc6ICAgICAgICAgICdpc28tODg1OS0zJywKICAgICdpc284ODU5LTMnOiAgICAgICAgICAgJ2lzby04ODU5LTMnLAogICAgJ2lzbzg4NTkzJzogICAgICAgICAgICAnaXNvLTg4NTktMycsCiAgICAnaXNvXzg4NTktMyc6ICAgICAgICAgICdpc28tODg1OS0zJywKICAgICdpc29fODg1OS0zOjE5ODgnOiAgICAgJ2lzby04ODU5LTMnLAogICAgJ2wzJzogICAgICAgICAgICAgICAgICAnaXNvLTg4NTktMycsCiAgICAnbGF0aW4zJzogICAgICAgICAgICAgICdpc28tODg1OS0zJywKICAgICdjc2lzb2xhdGluNCc6ICAgICAgICAgJ2lzby04ODU5LTQnLAogICAgJ2lzby04ODU5LTQnOiAgICAgICAgICAnaXNvLTg4NTktNCcsCiAgICAnaXNvLWlyLTExMCc6ICAgICAgICAgICdpc28tODg1OS00JywKICAgICdpc284ODU5LTQnOiAgICAgICAgICAgJ2lzby04ODU5LTQnLAogICAgJ2lzbzg4NTk0JzogICAgICAgICAgICAnaXNvLTg4NTktNCcsCiAgICAnaXNvXzg4NTktNCc6ICAgICAgICAgICdpc28tODg1OS00JywKICAgICdpc29fODg1OS00OjE5ODgnOiAgICAgJ2lzby04ODU5LTQnLAogICAgJ2w0JzogICAgICAgICAgICAgICAgICAnaXNvLTg4NTktNCcsCiAgICAnbGF0aW40JzogICAgICAgICAgICAgICdpc28tODg1OS00JywKICAgICdjc2lzb2xhdGluY3lyaWxsaWMnOiAgJ2lzby04ODU5LTUnLAogICAgJ2N5cmlsbGljJzogICAgICAgICAgICAnaXNvLTg4NTktNScsCiAgICAnaXNvLTg4NTktNSc6ICAgICAgICAgICdpc28tODg1OS01JywKICAgICdpc28taXItMTQ0JzogICAgICAgICAgJ2lzby04ODU5LTUnLAogICAgJ2lzbzg4NTktNSc6ICAgICAgICAgICAnaXNvLTg4NTktNScsCiAgICAnaXNvODg1OTUnOiAgICAgICAgICAgICdpc28tODg1OS01JywKICAgICdpc29fODg1OS01JzogICAgICAgICAgJ2lzby04ODU5LTUnLAogICAgJ2lzb184ODU5LTU6MTk4OCc6ICAgICAnaXNvLTg4NTktNScsCiAgICAnYXJhYmljJzogICAgICAgICAgICAgICdpc28tODg1OS02JywKICAgICdhc21vLTcwOCc6ICAgICAgICAgICAgJ2lzby04ODU5LTYnLAogICAgJ2NzaXNvODg1OTZlJzogICAgICAgICAnaXNvLTg4NTktNicsCiAgICAnY3Npc284ODU5NmknOiAgICAgICAgICdpc28tODg1OS02JywKICAgICdjc2lzb2xhdGluYXJhYmljJzogICAgJ2lzby04ODU5LTYnLAogICAgJ2VjbWEtMTE0JzogICAgICAgICAgICAnaXNvLTg4NTktNicsCiAgICAnaXNvLTg4NTktNic6ICAgICAgICAgICdpc28tODg1OS02JywKICAgICdpc28tODg1OS02LWUnOiAgICAgICAgJ2lzby04ODU5LTYnLAogICAgJ2lzby04ODU5LTYtaSc6ICAgICAgICAnaXNvLTg4NTktNicsCiAgICAnaXNvLWlyLTEyNyc6ICAgICAgICAgICdpc28tODg1OS02JywKICAgICdpc284ODU5LTYnOiAgICAgICAgICAgJ2lzby04ODU5LTYnLAogICAgJ2lzbzg4NTk2JzogICAgICAgICAgICAnaXNvLTg4NTktNicsCiAgICAnaXNvXzg4NTktNic6ICAgICAgICAgICdpc28tODg1OS02JywKICAgICdpc29fODg1OS02OjE5ODcnOiAgICAgJ2lzby04ODU5LTYnLAogICAgJ2NzaXNvbGF0aW5ncmVlayc6ICAgICAnaXNvLTg4NTktNycsCiAgICAnZWNtYS0xMTgnOiAgICAgICAgICAgICdpc28tODg1OS03JywKICAgICdlbG90XzkyOCc6ICAgICAgICAgICAgJ2lzby04ODU5LTcnLAogICAgJ2dyZWVrJzogICAgICAgICAgICAgICAnaXNvLTg4NTktNycsCiAgICAnZ3JlZWs4JzogICAgICAgICAgICAgICdpc28tODg1OS03JywKICAgICdpc28tODg1OS03JzogICAgICAgICAgJ2lzby04ODU5LTcnLAogICAgJ2lzby1pci0xMjYnOiAgICAgICAgICAnaXNvLTg4NTktNycsCiAgICAnaXNvODg1OS03JzogICAgICAgICAgICdpc28tODg1OS03JywKICAgICdpc284ODU5Nyc6ICAgICAgICAgICAgJ2lzby04ODU5LTcnLAogICAgJ2lzb184ODU5LTcnOiAgICAgICAgICAnaXNvLTg4NTktNycsCiAgICAnaXNvXzg4NTktNzoxOTg3JzogICAgICdpc28tODg1OS03JywKICAgICdzdW5fZXVfZ3JlZWsnOiAgICAgICAgJ2lzby04ODU5LTcnLAogICAgJ2NzaXNvODg1OThlJzogICAgICAgICAnaXNvLTg4NTktOCcsCiAgICAnY3Npc29sYXRpbmhlYnJldyc6ICAgICdpc28tODg1OS04JywKICAgICdoZWJyZXcnOiAgICAgICAgICAgICAgJ2lzby04ODU5LTgnLAogICAgJ2lzby04ODU5LTgnOiAgICAgICAgICAnaXNvLTg4NTktOCcsCiAgICAnaXNvLTg4NTktOC1lJzogICAgICAgICdpc28tODg1OS04JywKICAgICdpc28taXItMTM4JzogICAgICAgICAgJ2lzby04ODU5LTgnLAogICAgJ2lzbzg4NTktOCc6ICAgICAgICAgICAnaXNvLTg4NTktOCcsCiAgICAnaXNvODg1OTgnOiAgICAgICAgICAgICdpc28tODg1OS04JywKICAgICdpc29fODg1OS04JzogICAgICAgICAgJ2lzby04ODU5LTgnLAogICAgJ2lzb184ODU5LTg6MTk4OCc6ICAgICAnaXNvLTg4NTktOCcsCiAgICAndmlzdWFsJzogICAgICAgICAgICAgICdpc28tODg1OS04JywKICAgICdjc2lzbzg4NTk4aSc6ICAgICAgICAgJ2lzby04ODU5LTgtaScsCiAgICAnaXNvLTg4NTktOC1pJzogICAgICAgICdpc28tODg1OS04LWknLAogICAgJ2xvZ2ljYWwnOiAgICAgICAgICAgICAnaXNvLTg4NTktOC1pJywKICAgICdjc2lzb2xhdGluNic6ICAgICAgICAgJ2lzby04ODU5LTEwJywKICAgICdpc28tODg1OS0xMCc6ICAgICAgICAgJ2lzby04ODU5LTEwJywKICAgICdpc28taXItMTU3JzogICAgICAgICAgJ2lzby04ODU5LTEwJywKICAgICdpc284ODU5LTEwJzogICAgICAgICAgJ2lzby04ODU5LTEwJywKICAgICdpc284ODU5MTAnOiAgICAgICAgICAgJ2lzby04ODU5LTEwJywKICAgICdsNic6ICAgICAgICAgICAgICAgICAgJ2lzby04ODU5LTEwJywKICAgICdsYXRpbjYnOiAgICAgICAgICAgICAgJ2lzby04ODU5LTEwJywKICAgICdpc28tODg1OS0xMyc6ICAgICAgICAgJ2lzby04ODU5LTEzJywKICAgICdpc284ODU5LTEzJzogICAgICAgICAgJ2lzby04ODU5LTEzJywKICAgICdpc284ODU5MTMnOiAgICAgICAgICAgJ2lzby04ODU5LTEzJywKICAgICdpc28tODg1OS0xNCc6ICAgICAgICAgJ2lzby04ODU5LTE0JywKICAgICdpc284ODU5LTE0JzogICAgICAgICAgJ2lzby04ODU5LTE0JywKICAgICdpc284ODU5MTQnOiAgICAgICAgICAgJ2lzby04ODU5LTE0JywKICAgICdjc2lzb2xhdGluOSc6ICAgICAgICAgJ2lzby04ODU5LTE1JywKICAgICdpc28tODg1OS0xNSc6ICAgICAgICAgJ2lzby04ODU5LTE1JywKICAgICdpc284ODU5LTE1JzogICAgICAgICAgJ2lzby04ODU5LTE1JywKICAgICdpc284ODU5MTUnOiAgICAgICAgICAgJ2lzby04ODU5LTE1JywKICAgICdpc29fODg1OS0xNSc6ICAgICAgICAgJ2lzby04ODU5LTE1JywKICAgICdsOSc6ICAgICAgICAgICAgICAgICAgJ2lzby04ODU5LTE1JywKICAgICdpc28tODg1OS0xNic6ICAgICAgICAgJ2lzby04ODU5LTE2JywKICAgICdjc2tvaThyJzogICAgICAgICAgICAgJ2tvaTgtcicsCiAgICAna29pJzogICAgICAgICAgICAgICAgICdrb2k4LXInLAogICAgJ2tvaTgnOiAgICAgICAgICAgICAgICAna29pOC1yJywKICAgICdrb2k4LXInOiAgICAgICAgICAgICAgJ2tvaTgtcicsCiAgICAna29pOF9yJzogICAgICAgICAgICAgICdrb2k4LXInLAogICAgJ2tvaTgtdSc6ICAgICAgICAgICAgICAna29pOC11JywKICAgICdjc21hY2ludG9zaCc6ICAgICAgICAgJ21hY2ludG9zaCcsCiAgICAnbWFjJzogICAgICAgICAgICAgICAgICdtYWNpbnRvc2gnLAogICAgJ21hY2ludG9zaCc6ICAgICAgICAgICAnbWFjaW50b3NoJywKICAgICd4LW1hYy1yb21hbic6ICAgICAgICAgJ21hY2ludG9zaCcsCiAgICAnZG9zLTg3NCc6ICAgICAgICAgICAgICd3aW5kb3dzLTg3NCcsCiAgICAnaXNvLTg4NTktMTEnOiAgICAgICAgICd3aW5kb3dzLTg3NCcsCiAgICAnaXNvODg1OS0xMSc6ICAgICAgICAgICd3aW5kb3dzLTg3NCcsCiAgICAnaXNvODg1OTExJzogICAgICAgICAgICd3aW5kb3dzLTg3NCcsCiAgICAndGlzLTYyMCc6ICAgICAgICAgICAgICd3aW5kb3dzLTg3NCcsCiAgICAnd2luZG93cy04NzQnOiAgICAgICAgICd3aW5kb3dzLTg3NCcsCiAgICAnY3AxMjUwJzogICAgICAgICAgICAgICd3aW5kb3dzLTEyNTAnLAogICAgJ3dpbmRvd3MtMTI1MCc6ICAgICAgICAnd2luZG93cy0xMjUwJywKICAgICd4LWNwMTI1MCc6ICAgICAgICAgICAgJ3dpbmRvd3MtMTI1MCcsCiAgICAnY3AxMjUxJzogICAgICAgICAgICAgICd3aW5kb3dzLTEyNTEnLAogICAgJ3dpbmRvd3MtMTI1MSc6ICAgICAgICAnd2luZG93cy0xMjUxJywKICAgICd4LWNwMTI1MSc6ICAgICAgICAgICAgJ3dpbmRvd3MtMTI1MScsCiAgICAnYW5zaV94My40LTE5NjgnOiAgICAgICd3aW5kb3dzLTEyNTInLAogICAgJ2FzY2lpJzogICAgICAgICAgICAgICAnd2luZG93cy0xMjUyJywKICAgICdjcDEyNTInOiAgICAgICAgICAgICAgJ3dpbmRvd3MtMTI1MicsCiAgICAnY3A4MTknOiAgICAgICAgICAgICAgICd3aW5kb3dzLTEyNTInLAogICAgJ2NzaXNvbGF0aW4xJzogICAgICAgICAnd2luZG93cy0xMjUyJywKICAgICdpYm04MTknOiAgICAgICAgICAgICAgJ3dpbmRvd3MtMTI1MicsCiAgICAnaXNvLTg4NTktMSc6ICAgICAgICAgICd3aW5kb3dzLTEyNTInLAogICAgJ2lzby1pci0xMDAnOiAgICAgICAgICAnd2luZG93cy0xMjUyJywKICAgICdpc284ODU5LTEnOiAgICAgICAgICAgJ3dpbmRvd3MtMTI1MicsCiAgICAnaXNvODg1OTEnOiAgICAgICAgICAgICd3aW5kb3dzLTEyNTInLAogICAgJ2lzb184ODU5LTEnOiAgICAgICAgICAnd2luZG93cy0xMjUyJywKICAgICdpc29fODg1OS0xOjE5ODcnOiAgICAgJ3dpbmRvd3MtMTI1MicsCiAgICAnbDEnOiAgICAgICAgICAgICAgICAgICd3aW5kb3dzLTEyNTInLAogICAgJ2xhdGluMSc6ICAgICAgICAgICAgICAnd2luZG93cy0xMjUyJywKICAgICd1cy1hc2NpaSc6ICAgICAgICAgICAgJ3dpbmRvd3MtMTI1MicsCiAgICAnd2luZG93cy0xMjUyJzogICAgICAgICd3aW5kb3dzLTEyNTInLAogICAgJ3gtY3AxMjUyJzogICAgICAgICAgICAnd2luZG93cy0xMjUyJywKICAgICdjcDEyNTMnOiAgICAgICAgICAgICAgJ3dpbmRvd3MtMTI1MycsCiAgICAnd2luZG93cy0xMjUzJzogICAgICAgICd3aW5kb3dzLTEyNTMnLAogICAgJ3gtY3AxMjUzJzogICAgICAgICAgICAnd2luZG93cy0xMjUzJywKICAgICdjcDEyNTQnOiAgICAgICAgICAgICAgJ3dpbmRvd3MtMTI1NCcsCiAgICAnY3Npc29sYXRpbjUnOiAgICAgICAgICd3aW5kb3dzLTEyNTQnLAogICAgJ2lzby04ODU5LTknOiAgICAgICAgICAnd2luZG93cy0xMjU0JywKICAgICdpc28taXItMTQ4JzogICAgICAgICAgJ3dpbmRvd3MtMTI1NCcsCiAgICAnaXNvODg1OS05JzogICAgICAgICAgICd3aW5kb3dzLTEyNTQnLAogICAgJ2lzbzg4NTk5JzogICAgICAgICAgICAnd2luZG93cy0xMjU0JywKICAgICdpc29fODg1OS05JzogICAgICAgICAgJ3dpbmRvd3MtMTI1NCcsCiAgICAnaXNvXzg4NTktOToxOTg5JzogICAgICd3aW5kb3dzLTEyNTQnLAogICAgJ2w1JzogICAgICAgICAgICAgICAgICAnd2luZG93cy0xMjU0JywKICAgICdsYXRpbjUnOiAgICAgICAgICAgICAgJ3dpbmRvd3MtMTI1NCcsCiAgICAnd2luZG93cy0xMjU0JzogICAgICAgICd3aW5kb3dzLTEyNTQnLAogICAgJ3gtY3AxMjU0JzogICAgICAgICAgICAnd2luZG93cy0xMjU0JywKICAgICdjcDEyNTUnOiAgICAgICAgICAgICAgJ3dpbmRvd3MtMTI1NScsCiAgICAnd2luZG93cy0xMjU1JzogICAgICAgICd3aW5kb3dzLTEyNTUnLAogICAgJ3gtY3AxMjU1JzogICAgICAgICAgICAnd2luZG93cy0xMjU1JywKICAgICdjcDEyNTYnOiAgICAgICAgICAgICAgJ3dpbmRvd3MtMTI1NicsCiAgICAnd2luZG93cy0xMjU2JzogICAgICAgICd3aW5kb3dzLTEyNTYnLAogICAgJ3gtY3AxMjU2JzogICAgICAgICAgICAnd2luZG93cy0xMjU2JywKICAgICdjcDEyNTcnOiAgICAgICAgICAgICAgJ3dpbmRvd3MtMTI1NycsCiAgICAnd2luZG93cy0xMjU3JzogICAgICAgICd3aW5kb3dzLTEyNTcnLAogICAgJ3gtY3AxMjU3JzogICAgICAgICAgICAnd2luZG93cy0xMjU3JywKICAgICdjcDEyNTgnOiAgICAgICAgICAgICAgJ3dpbmRvd3MtMTI1OCcsCiAgICAnd2luZG93cy0xMjU4JzogICAgICAgICd3aW5kb3dzLTEyNTgnLAogICAgJ3gtY3AxMjU4JzogICAgICAgICAgICAnd2luZG93cy0xMjU4JywKICAgICd4LW1hYy1jeXJpbGxpYyc6ICAgICAgJ3gtbWFjLWN5cmlsbGljJywKICAgICd4LW1hYy11a3JhaW5pYW4nOiAgICAgJ3gtbWFjLWN5cmlsbGljJywKICAgICdjaGluZXNlJzogICAgICAgICAgICAgJ2diaycsCiAgICAnY3NnYjIzMTInOiAgICAgICAgICAgICdnYmsnLAogICAgJ2NzaXNvNThnYjIzMTI4MCc6ICAgICAnZ2JrJywKICAgICdnYjIzMTInOiAgICAgICAgICAgICAgJ2diaycsCiAgICAnZ2JfMjMxMic6ICAgICAgICAgICAgICdnYmsnLAogICAgJ2diXzIzMTItODAnOiAgICAgICAgICAnZ2JrJywKICAgICdnYmsnOiAgICAgICAgICAgICAgICAgJ2diaycsCiAgICAnaXNvLWlyLTU4JzogICAgICAgICAgICdnYmsnLAogICAgJ3gtZ2JrJzogICAgICAgICAgICAgICAnZ2JrJywKICAgICdnYjE4MDMwJzogICAgICAgICAgICAgJ2diMTgwMzAnLAogICAgJ2h6LWdiLTIzMTInOiAgICAgICAgICAnaHotZ2ItMjMxMicsCiAgICAnYmlnNSc6ICAgICAgICAgICAgICAgICdiaWc1JywKICAgICdiaWc1LWhrc2NzJzogICAgICAgICAgJ2JpZzUnLAogICAgJ2NuLWJpZzUnOiAgICAgICAgICAgICAnYmlnNScsCiAgICAnY3NiaWc1JzogICAgICAgICAgICAgICdiaWc1JywKICAgICd4LXgtYmlnNSc6ICAgICAgICAgICAgJ2JpZzUnLAogICAgJ2NzZXVjcGtkZm10amFwYW5lc2UnOiAnZXVjLWpwJywKICAgICdldWMtanAnOiAgICAgICAgICAgICAgJ2V1Yy1qcCcsCiAgICAneC1ldWMtanAnOiAgICAgICAgICAgICdldWMtanAnLAogICAgJ2NzaXNvMjAyMmpwJzogICAgICAgICAnaXNvLTIwMjItanAnLAogICAgJ2lzby0yMDIyLWpwJzogICAgICAgICAnaXNvLTIwMjItanAnLAogICAgJ2Nzc2hpZnRqaXMnOiAgICAgICAgICAnc2hpZnRfamlzJywKICAgICdtc19rYW5qaSc6ICAgICAgICAgICAgJ3NoaWZ0X2ppcycsCiAgICAnc2hpZnQtamlzJzogICAgICAgICAgICdzaGlmdF9qaXMnLAogICAgJ3NoaWZ0X2ppcyc6ICAgICAgICAgICAnc2hpZnRfamlzJywKICAgICdzamlzJzogICAgICAgICAgICAgICAgJ3NoaWZ0X2ppcycsCiAgICAnd2luZG93cy0zMWonOiAgICAgICAgICdzaGlmdF9qaXMnLAogICAgJ3gtc2ppcyc6ICAgICAgICAgICAgICAnc2hpZnRfamlzJywKICAgICdjc2V1Y2tyJzogICAgICAgICAgICAgJ2V1Yy1rcicsCiAgICAnY3Nrc2M1NjAxMTk4Nyc6ICAgICAgICdldWMta3InLAogICAgJ2V1Yy1rcic6ICAgICAgICAgICAgICAnZXVjLWtyJywKICAgICdpc28taXItMTQ5JzogICAgICAgICAgJ2V1Yy1rcicsCiAgICAna29yZWFuJzogICAgICAgICAgICAgICdldWMta3InLAogICAgJ2tzX2NfNTYwMS0xOTg3JzogICAgICAnZXVjLWtyJywKICAgICdrc19jXzU2MDEtMTk4OSc6ICAgICAgJ2V1Yy1rcicsCiAgICAna3NjNTYwMSc6ICAgICAgICAgICAgICdldWMta3InLAogICAgJ2tzY181NjAxJzogICAgICAgICAgICAnZXVjLWtyJywKICAgICd3aW5kb3dzLTk0OSc6ICAgICAgICAgJ2V1Yy1rcicsCiAgICAnY3Npc28yMDIya3InOiAgICAgICAgICdpc28tMjAyMi1rcicsCiAgICAnaXNvLTIwMjIta3InOiAgICAgICAgICdpc28tMjAyMi1rcicsCiAgICAndXRmLTE2YmUnOiAgICAgICAgICAgICd1dGYtMTZiZScsCiAgICAndXRmLTE2JzogICAgICAgICAgICAgICd1dGYtMTZsZScsCiAgICAndXRmLTE2bGUnOiAgICAgICAgICAgICd1dGYtMTZsZScsCiAgICAneC11c2VyLWRlZmluZWQnOiAgICAgICd4LXVzZXItZGVmaW5lZCcsCn0KUEsDBBQAAAAAAAAAIQBQfzEfGQUAABkFAAA0AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3dlYmVuY29kaW5ncy9ta2xhYmVscy5weSIiIgoKICAgIHdlYmVuY29kaW5ncy5ta2xhYmVscwogICAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+CgogICAgUmVnZW5hcmF0ZSB0aGUgd2ViZW5jb2RpbmdzLmxhYmVscyBtb2R1bGUuCgogICAgOmNvcHlyaWdodDogQ29weXJpZ2h0IDIwMTIgYnkgU2ltb24gU2FwaW4KICAgIDpsaWNlbnNlOiBCU0QsIHNlZSBMSUNFTlNFIGZvciBkZXRhaWxzLgoKIiIiCgppbXBvcnQganNvbgp0cnk6CiAgICBmcm9tIHVybGxpYiBpbXBvcnQgdXJsb3BlbgpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBmcm9tIHVybGxpYi5yZXF1ZXN0IGltcG9ydCB1cmxvcGVuCgoKZGVmIGFzc2VydF9sb3dlcihzdHJpbmcpOgogICAgYXNzZXJ0IHN0cmluZyA9PSBzdHJpbmcubG93ZXIoKQogICAgcmV0dXJuIHN0cmluZwoKCmRlZiBnZW5lcmF0ZSh1cmwpOgogICAgcGFydHMgPSBbJycnXAoiIiIKCiAgICB3ZWJlbmNvZGluZ3MubGFiZWxzCiAgICB+fn5+fn5+fn5+fn5+fn5+fn5+CgogICAgTWFwIGVuY29kaW5nIGxhYmVscyB0byB0aGVpciBuYW1lLgoKICAgIDpjb3B5cmlnaHQ6IENvcHlyaWdodCAyMDEyIGJ5IFNpbW9uIFNhcGluCiAgICA6bGljZW5zZTogQlNELCBzZWUgTElDRU5TRSBmb3IgZGV0YWlscy4KCiIiIgoKIyBYWFggRG8gbm90IGVkaXQhCiMgVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IG1rbGFiZWxzLnB5CgpMQUJFTFMgPSB7CicnJ10KICAgIGxhYmVscyA9IFsKICAgICAgICAocmVwcihhc3NlcnRfbG93ZXIobGFiZWwpKS5sc3RyaXAoJ3UnKSwKICAgICAgICAgcmVwcihlbmNvZGluZ1snbmFtZSddKS5sc3RyaXAoJ3UnKSkKICAgICAgICBmb3IgY2F0ZWdvcnkgaW4ganNvbi5sb2Fkcyh1cmxvcGVuKHVybCkucmVhZCgpLmRlY29kZSgnYXNjaWknKSkKICAgICAgICBmb3IgZW5jb2RpbmcgaW4gY2F0ZWdvcnlbJ2VuY29kaW5ncyddCiAgICAgICAgZm9yIGxhYmVsIGluIGVuY29kaW5nWydsYWJlbHMnXV0KICAgIG1heF9sZW4gPSBtYXgobGVuKGxhYmVsKSBmb3IgbGFiZWwsIG5hbWUgaW4gbGFiZWxzKQogICAgcGFydHMuZXh0ZW5kKAogICAgICAgICcgICAgJXM6JXMgJXMsXG4nICUgKGxhYmVsLCAnICcgKiAobWF4X2xlbiAtIGxlbihsYWJlbCkpLCBuYW1lKQogICAgICAgIGZvciBsYWJlbCwgbmFtZSBpbiBsYWJlbHMpCiAgICBwYXJ0cy5hcHBlbmQoJ30nKQogICAgcmV0dXJuICcnLmpvaW4ocGFydHMpCgoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIHByaW50KGdlbmVyYXRlKCdodHRwOi8vZW5jb2Rpbmcuc3BlYy53aGF0d2cub3JnL2VuY29kaW5ncy5qc29uJykpClBLAwQUAAAAAAAAACEAFps+HaIZAACiGQAAMQAAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci93ZWJlbmNvZGluZ3MvdGVzdHMucHkjIGNvZGluZzogdXRmOAoiIiIKCiAgICB3ZWJlbmNvZGluZ3MudGVzdHMKICAgIH5+fn5+fn5+fn5+fn5+fn5+fgoKICAgIEEgYmFzaWMgdGVzdCBzdWl0ZSBmb3IgRW5jb2RpbmcuCgogICAgOmNvcHlyaWdodDogQ29weXJpZ2h0IDIwMTIgYnkgU2ltb24gU2FwaW4KICAgIDpsaWNlbnNlOiBCU0QsIHNlZSBMSUNFTlNFIGZvciBkZXRhaWxzLgoKIiIiCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHVuaWNvZGVfbGl0ZXJhbHMKCmZyb20gLiBpbXBvcnQgKGxvb2t1cCwgTEFCRUxTLCBkZWNvZGUsIGVuY29kZSwgaXRlcl9kZWNvZGUsIGl0ZXJfZW5jb2RlLAogICAgICAgICAgICAgICBJbmNyZW1lbnRhbERlY29kZXIsIEluY3JlbWVudGFsRW5jb2RlciwgVVRGOCkKCgpkZWYgYXNzZXJ0X3JhaXNlcyhleGNlcHRpb24sIGZ1bmN0aW9uLCAqYXJncywgKiprd2FyZ3MpOgogICAgdHJ5OgogICAgICAgIGZ1bmN0aW9uKCphcmdzLCAqKmt3YXJncykKICAgIGV4Y2VwdCBleGNlcHRpb246CiAgICAgICAgcmV0dXJuCiAgICBlbHNlOiAgIyBwcmFnbWE6IG5vIGNvdmVyCiAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoJ0RpZCBub3QgcmFpc2UgJXMuJyAlIGV4Y2VwdGlvbikKCgpkZWYgdGVzdF9sYWJlbHMoKToKICAgIGFzc2VydCBsb29rdXAoJ3V0Zi04JykubmFtZSA9PSAndXRmLTgnCiAgICBhc3NlcnQgbG9va3VwKCdVdGYtOCcpLm5hbWUgPT0gJ3V0Zi04JwogICAgYXNzZXJ0IGxvb2t1cCgnVVRGLTgnKS5uYW1lID09ICd1dGYtOCcKICAgIGFzc2VydCBsb29rdXAoJ3V0ZjgnKS5uYW1lID09ICd1dGYtOCcKICAgIGFzc2VydCBsb29rdXAoJ3V0ZjgnKS5uYW1lID09ICd1dGYtOCcKICAgIGFzc2VydCBsb29rdXAoJ3V0ZjggJykubmFtZSA9PSAndXRmLTgnCiAgICBhc3NlcnQgbG9va3VwKCcgXHJcbnV0ZjhcdCcpLm5hbWUgPT0gJ3V0Zi04JwogICAgYXNzZXJ0IGxvb2t1cCgndTgnKSBpcyBOb25lICAjIFB5dGhvbiBsYWJlbC4KICAgIGFzc2VydCBsb29rdXAoJ3V0Zi04wqAnKSBpcyBOb25lICAjIE5vbi1BU0NJSSB3aGl0ZSBzcGFjZS4KCiAgICBhc3NlcnQgbG9va3VwKCdVUy1BU0NJSScpLm5hbWUgPT0gJ3dpbmRvd3MtMTI1MicKICAgIGFzc2VydCBsb29rdXAoJ2lzby04ODU5LTEnKS5uYW1lID09ICd3aW5kb3dzLTEyNTInCiAgICBhc3NlcnQgbG9va3VwKCdsYXRpbjEnKS5uYW1lID09ICd3aW5kb3dzLTEyNTInCiAgICBhc3NlcnQgbG9va3VwKCdMQVRJTjEnKS5uYW1lID09ICd3aW5kb3dzLTEyNTInCiAgICBhc3NlcnQgbG9va3VwKCdsYXRpbi0xJykgaXMgTm9uZQogICAgYXNzZXJ0IGxvb2t1cCgnTEFUxLBOMScpIGlzIE5vbmUgICMgQVNDSUktb25seSBjYXNlIGluc2Vuc2l0aXZpdHkuCgoKZGVmIHRlc3RfYWxsX2xhYmVscygpOgogICAgZm9yIGxhYmVsIGluIExBQkVMUzoKICAgICAgICBhc3NlcnQgZGVjb2RlKGInJywgbGFiZWwpID09ICgnJywgbG9va3VwKGxhYmVsKSkKICAgICAgICBhc3NlcnQgZW5jb2RlKCcnLCBsYWJlbCkgPT0gYicnCiAgICAgICAgZm9yIHJlcGVhdCBpbiBbMCwgMSwgMTJdOgogICAgICAgICAgICBvdXRwdXQsIF8gPSBpdGVyX2RlY29kZShbYicnXSAqIHJlcGVhdCwgbGFiZWwpCiAgICAgICAgICAgIGFzc2VydCBsaXN0KG91dHB1dCkgPT0gW10KICAgICAgICAgICAgYXNzZXJ0IGxpc3QoaXRlcl9lbmNvZGUoWycnXSAqIHJlcGVhdCwgbGFiZWwpKSA9PSBbXQogICAgICAgIGRlY29kZXIgPSBJbmNyZW1lbnRhbERlY29kZXIobGFiZWwpCiAgICAgICAgYXNzZXJ0IGRlY29kZXIuZGVjb2RlKGInJykgPT0gJycKICAgICAgICBhc3NlcnQgZGVjb2Rlci5kZWNvZGUoYicnLCBmaW5hbD1UcnVlKSA9PSAnJwogICAgICAgIGVuY29kZXIgPSBJbmNyZW1lbnRhbEVuY29kZXIobGFiZWwpCiAgICAgICAgYXNzZXJ0IGVuY29kZXIuZW5jb2RlKCcnKSA9PSBiJycKICAgICAgICBhc3NlcnQgZW5jb2Rlci5lbmNvZGUoJycsIGZpbmFsPVRydWUpID09IGInJwogICAgIyBBbGwgZW5jb2RpbmcgbmFtZXMgYXJlIHZhbGlkIGxhYmVscyB0b286CiAgICBmb3IgbmFtZSBpbiBzZXQoTEFCRUxTLnZhbHVlcygpKToKICAgICAgICBhc3NlcnQgbG9va3VwKG5hbWUpLm5hbWUgPT0gbmFtZQoKCmRlZiB0ZXN0X2ludmFsaWRfbGFiZWwoKToKICAgIGFzc2VydF9yYWlzZXMoTG9va3VwRXJyb3IsIGRlY29kZSwgYidceEVGXHhCQlx4QkZceGMzXHhhOScsICdpbnZhbGlkJykKICAgIGFzc2VydF9yYWlzZXMoTG9va3VwRXJyb3IsIGVuY29kZSwgJ8OpJywgJ2ludmFsaWQnKQogICAgYXNzZXJ0X3JhaXNlcyhMb29rdXBFcnJvciwgaXRlcl9kZWNvZGUsIFtdLCAnaW52YWxpZCcpCiAgICBhc3NlcnRfcmFpc2VzKExvb2t1cEVycm9yLCBpdGVyX2VuY29kZSwgW10sICdpbnZhbGlkJykKICAgIGFzc2VydF9yYWlzZXMoTG9va3VwRXJyb3IsIEluY3JlbWVudGFsRGVjb2RlciwgJ2ludmFsaWQnKQogICAgYXNzZXJ0X3JhaXNlcyhMb29rdXBFcnJvciwgSW5jcmVtZW50YWxFbmNvZGVyLCAnaW52YWxpZCcpCgoKZGVmIHRlc3RfZGVjb2RlKCk6CiAgICBhc3NlcnQgZGVjb2RlKGInXHg4MCcsICdsYXRpbjEnKSA9PSAoJ+KCrCcsIGxvb2t1cCgnbGF0aW4xJykpCiAgICBhc3NlcnQgZGVjb2RlKGInXHg4MCcsIGxvb2t1cCgnbGF0aW4xJykpID09ICgn4oKsJywgbG9va3VwKCdsYXRpbjEnKSkKICAgIGFzc2VydCBkZWNvZGUoYidceGMzXHhhOScsICd1dGY4JykgPT0gKCfDqScsIGxvb2t1cCgndXRmOCcpKQogICAgYXNzZXJ0IGRlY29kZShiJ1x4YzNceGE5JywgVVRGOCkgPT0gKCfDqScsIGxvb2t1cCgndXRmOCcpKQogICAgYXNzZXJ0IGRlY29kZShiJ1x4YzNceGE5JywgJ2FzY2lpJykgPT0gKCfDg8KpJywgbG9va3VwKCdhc2NpaScpKQogICAgYXNzZXJ0IGRlY29kZShiJ1x4RUZceEJCXHhCRlx4YzNceGE5JywgJ2FzY2lpJykgPT0gKCfDqScsIGxvb2t1cCgndXRmOCcpKSAgIyBVVEYtOCB3aXRoIEJPTQoKICAgIGFzc2VydCBkZWNvZGUoYidceEZFXHhGRlx4MDBceGU5JywgJ2FzY2lpJykgPT0gKCfDqScsIGxvb2t1cCgndXRmLTE2YmUnKSkgICMgVVRGLTE2LUJFIHdpdGggQk9NCiAgICBhc3NlcnQgZGVjb2RlKGInXHhGRlx4RkVceGU5XHgwMCcsICdhc2NpaScpID09ICgnw6knLCBsb29rdXAoJ3V0Zi0xNmxlJykpICAjIFVURi0xNi1MRSB3aXRoIEJPTQogICAgYXNzZXJ0IGRlY29kZShiJ1x4RkVceEZGXHhlOVx4MDAnLCAnYXNjaWknKSA9PSAoJ1x1ZTkwMCcsIGxvb2t1cCgndXRmLTE2YmUnKSkKICAgIGFzc2VydCBkZWNvZGUoYidceEZGXHhGRVx4MDBceGU5JywgJ2FzY2lpJykgPT0gKCdcdWU5MDAnLCBsb29rdXAoJ3V0Zi0xNmxlJykpCgogICAgYXNzZXJ0IGRlY29kZShiJ1x4MDBceGU5JywgJ1VURi0xNkJFJykgPT0gKCfDqScsIGxvb2t1cCgndXRmLTE2YmUnKSkKICAgIGFzc2VydCBkZWNvZGUoYidceGU5XHgwMCcsICdVVEYtMTZMRScpID09ICgnw6knLCBsb29rdXAoJ3V0Zi0xNmxlJykpCiAgICBhc3NlcnQgZGVjb2RlKGInXHhlOVx4MDAnLCAnVVRGLTE2JykgPT0gKCfDqScsIGxvb2t1cCgndXRmLTE2bGUnKSkKCiAgICBhc3NlcnQgZGVjb2RlKGInXHhlOVx4MDAnLCAnVVRGLTE2QkUnKSA9PSAoJ1x1ZTkwMCcsIGxvb2t1cCgndXRmLTE2YmUnKSkKICAgIGFzc2VydCBkZWNvZGUoYidceDAwXHhlOScsICdVVEYtMTZMRScpID09ICgnXHVlOTAwJywgbG9va3VwKCd1dGYtMTZsZScpKQogICAgYXNzZXJ0IGRlY29kZShiJ1x4MDBceGU5JywgJ1VURi0xNicpID09ICgnXHVlOTAwJywgbG9va3VwKCd1dGYtMTZsZScpKQoKCmRlZiB0ZXN0X2VuY29kZSgpOgogICAgYXNzZXJ0IGVuY29kZSgnw6knLCAnbGF0aW4xJykgPT0gYidceGU5JwogICAgYXNzZXJ0IGVuY29kZSgnw6knLCAndXRmOCcpID09IGInXHhjM1x4YTknCiAgICBhc3NlcnQgZW5jb2RlKCfDqScsICd1dGY4JykgPT0gYidceGMzXHhhOScKICAgIGFzc2VydCBlbmNvZGUoJ8OpJywgJ3V0Zi0xNicpID09IGInXHhlOVx4MDAnCiAgICBhc3NlcnQgZW5jb2RlKCfDqScsICd1dGYtMTZsZScpID09IGInXHhlOVx4MDAnCiAgICBhc3NlcnQgZW5jb2RlKCfDqScsICd1dGYtMTZiZScpID09IGInXHgwMFx4ZTknCgoKZGVmIHRlc3RfaXRlcl9kZWNvZGUoKToKICAgIGRlZiBpdGVyX2RlY29kZV90b19zdHJpbmcoaW5wdXQsIGZhbGxiYWNrX2VuY29kaW5nKToKICAgICAgICBvdXRwdXQsIF9lbmNvZGluZyA9IGl0ZXJfZGVjb2RlKGlucHV0LCBmYWxsYmFja19lbmNvZGluZykKICAgICAgICByZXR1cm4gJycuam9pbihvdXRwdXQpCiAgICBhc3NlcnQgaXRlcl9kZWNvZGVfdG9fc3RyaW5nKFtdLCAnbGF0aW4xJykgPT0gJycKICAgIGFzc2VydCBpdGVyX2RlY29kZV90b19zdHJpbmcoW2InJ10sICdsYXRpbjEnKSA9PSAnJwogICAgYXNzZXJ0IGl0ZXJfZGVjb2RlX3RvX3N0cmluZyhbYidceGU5J10sICdsYXRpbjEnKSA9PSAnw6knCiAgICBhc3NlcnQgaXRlcl9kZWNvZGVfdG9fc3RyaW5nKFtiJ2hlbGxvJ10sICdsYXRpbjEnKSA9PSAnaGVsbG8nCiAgICBhc3NlcnQgaXRlcl9kZWNvZGVfdG9fc3RyaW5nKFtiJ2hlJywgYidsbG8nXSwgJ2xhdGluMScpID09ICdoZWxsbycKICAgIGFzc2VydCBpdGVyX2RlY29kZV90b19zdHJpbmcoW2InaGVsbCcsIGInbyddLCAnbGF0aW4xJykgPT0gJ2hlbGxvJwogICAgYXNzZXJ0IGl0ZXJfZGVjb2RlX3RvX3N0cmluZyhbYidceGMzXHhhOSddLCAnbGF0aW4xJykgPT0gJ8ODwqknCiAgICBhc3NlcnQgaXRlcl9kZWNvZGVfdG9fc3RyaW5nKFtiJ1x4RUZceEJCXHhCRlx4YzNceGE5J10sICdsYXRpbjEnKSA9PSAnw6knCiAgICBhc3NlcnQgaXRlcl9kZWNvZGVfdG9fc3RyaW5nKFsKICAgICAgICBiJ1x4RUZceEJCXHhCRicsIGInXHhjMycsIGInXHhhOSddLCAnbGF0aW4xJykgPT0gJ8OpJwogICAgYXNzZXJ0IGl0ZXJfZGVjb2RlX3RvX3N0cmluZyhbCiAgICAgICAgYidceEVGXHhCQlx4QkYnLCBiJ2EnLCBiJ1x4YzMnXSwgJ2xhdGluMScpID09ICdhXHVGRkZEJwogICAgYXNzZXJ0IGl0ZXJfZGVjb2RlX3RvX3N0cmluZyhbCiAgICAgICAgYicnLCBiJ1x4RUYnLCBiJycsIGInJywgYidceEJCXHhCRlx4YzMnLCBiJ1x4YTknXSwgJ2xhdGluMScpID09ICfDqScKICAgIGFzc2VydCBpdGVyX2RlY29kZV90b19zdHJpbmcoW2InXHhFRlx4QkJceEJGJ10sICdsYXRpbjEnKSA9PSAnJwogICAgYXNzZXJ0IGl0ZXJfZGVjb2RlX3RvX3N0cmluZyhbYidceEVGXHhCQiddLCAnbGF0aW4xJykgPT0gJ8OvwrsnCiAgICBhc3NlcnQgaXRlcl9kZWNvZGVfdG9fc3RyaW5nKFtiJ1x4RkVceEZGXHgwMFx4ZTknXSwgJ2xhdGluMScpID09ICfDqScKICAgIGFzc2VydCBpdGVyX2RlY29kZV90b19zdHJpbmcoW2InXHhGRlx4RkVceGU5XHgwMCddLCAnbGF0aW4xJykgPT0gJ8OpJwogICAgYXNzZXJ0IGl0ZXJfZGVjb2RlX3RvX3N0cmluZyhbCiAgICAgICAgYicnLCBiJ1x4RkYnLCBiJycsIGInJywgYidceEZFXHhlOScsIGInXHgwMCddLCAnbGF0aW4xJykgPT0gJ8OpJwogICAgYXNzZXJ0IGl0ZXJfZGVjb2RlX3RvX3N0cmluZyhbCiAgICAgICAgYicnLCBiJ2hceGU5JywgYidsbG8nXSwgJ3gtdXNlci1kZWZpbmVkJykgPT0gJ2hcdUY3RTlsbG8nCgoKZGVmIHRlc3RfaXRlcl9lbmNvZGUoKToKICAgIGFzc2VydCBiJycuam9pbihpdGVyX2VuY29kZShbXSwgJ2xhdGluMScpKSA9PSBiJycKICAgIGFzc2VydCBiJycuam9pbihpdGVyX2VuY29kZShbJyddLCAnbGF0aW4xJykpID09IGInJwogICAgYXNzZXJ0IGInJy5qb2luKGl0ZXJfZW5jb2RlKFsnw6knXSwgJ2xhdGluMScpKSA9PSBiJ1x4ZTknCiAgICBhc3NlcnQgYicnLmpvaW4oaXRlcl9lbmNvZGUoWycnLCAnw6knLCAnJywgJyddLCAnbGF0aW4xJykpID09IGInXHhlOScKICAgIGFzc2VydCBiJycuam9pbihpdGVyX2VuY29kZShbJycsICfDqScsICcnLCAnJ10sICd1dGYtMTYnKSkgPT0gYidceGU5XHgwMCcKICAgIGFzc2VydCBiJycuam9pbihpdGVyX2VuY29kZShbJycsICfDqScsICcnLCAnJ10sICd1dGYtMTZsZScpKSA9PSBiJ1x4ZTlceDAwJwogICAgYXNzZXJ0IGInJy5qb2luKGl0ZXJfZW5jb2RlKFsnJywgJ8OpJywgJycsICcnXSwgJ3V0Zi0xNmJlJykpID09IGInXHgwMFx4ZTknCiAgICBhc3NlcnQgYicnLmpvaW4oaXRlcl9lbmNvZGUoWwogICAgICAgICcnLCAnaFx1RjdFOScsICcnLCAnbGxvJ10sICd4LXVzZXItZGVmaW5lZCcpKSA9PSBiJ2hceGU5bGxvJwoKCmRlZiB0ZXN0X3hfdXNlcl9kZWZpbmVkKCk6CiAgICBlbmNvZGVkID0gYicyLFx4MGNceDBiXHgxYU9ceGQ5I1x4Y2JceDBmXHhjOVx4YmJ0XHhjZlx4YThceGNhJwogICAgZGVjb2RlZCA9ICcyLFx4MGNceDBiXHgxYU9cdWY3ZDkjXHVmN2NiXHgwZlx1ZjdjOVx1ZjdiYnRcdWY3Y2ZcdWY3YThcdWY3Y2EnCiAgICBlbmNvZGVkID0gYidhYScKICAgIGRlY29kZWQgPSAnYWEnCiAgICBhc3NlcnQgZGVjb2RlKGVuY29kZWQsICd4LXVzZXItZGVmaW5lZCcpID09IChkZWNvZGVkLCBsb29rdXAoJ3gtdXNlci1kZWZpbmVkJykpCiAgICBhc3NlcnQgZW5jb2RlKGRlY29kZWQsICd4LXVzZXItZGVmaW5lZCcpID09IGVuY29kZWQKUEsDBBQAAAAAAAAAIQBIb0W+0hAAANIQAAA6AAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3dlYmVuY29kaW5ncy94X3VzZXJfZGVmaW5lZC5weSMgY29kaW5nOiB1dGY4CiIiIgoKICAgIHdlYmVuY29kaW5ncy54X3VzZXJfZGVmaW5lZAogICAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CgogICAgQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIHgtdXNlci1kZWZpbmVkIGVuY29kaW5nLgoKICAgIDpjb3B5cmlnaHQ6IENvcHlyaWdodCAyMDEyIGJ5IFNpbW9uIFNhcGluCiAgICA6bGljZW5zZTogQlNELCBzZWUgTElDRU5TRSBmb3IgZGV0YWlscy4KCiIiIgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB1bmljb2RlX2xpdGVyYWxzCgppbXBvcnQgY29kZWNzCgoKIyMjIENvZGVjIEFQSXMKCmNsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CgogICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZXJyb3JzPSdzdHJpY3QnKToKICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LCBlcnJvcnMsIGVuY29kaW5nX3RhYmxlKQoKICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGVycm9ycz0nc3RyaWN0Jyk6CiAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCwgZXJyb3JzLCBkZWNvZGluZ190YWJsZSkKCgpjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CiAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CiAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCwgc2VsZi5lcnJvcnMsIGVuY29kaW5nX3RhYmxlKVswXQoKCmNsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LCBzZWxmLmVycm9ycywgZGVjb2RpbmdfdGFibGUpWzBdCgoKY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKICAgIHBhc3MKCgpjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgogICAgcGFzcwoKCiMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQoKY29kZWNfaW5mbyA9IGNvZGVjcy5Db2RlY0luZm8oCiAgICBuYW1lPSd4LXVzZXItZGVmaW5lZCcsCiAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCiAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCiAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAogICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCiAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAopCgoKIyMjIERlY29kaW5nIFRhYmxlCgojIFB5dGhvbiAzOgojIGZvciBjIGluIHJhbmdlKDI1Nik6IHByaW50KCcgICAgJXInICUgY2hyKGMgaWYgYyA8IDEyOCBlbHNlIGMgKyAweEY3MDApKQpkZWNvZGluZ190YWJsZSA9ICgKICAgICdceDAwJwogICAgJ1x4MDEnCiAgICAnXHgwMicKICAgICdceDAzJwogICAgJ1x4MDQnCiAgICAnXHgwNScKICAgICdceDA2JwogICAgJ1x4MDcnCiAgICAnXHgwOCcKICAgICdcdCcKICAgICdcbicKICAgICdceDBiJwogICAgJ1x4MGMnCiAgICAnXHInCiAgICAnXHgwZScKICAgICdceDBmJwogICAgJ1x4MTAnCiAgICAnXHgxMScKICAgICdceDEyJwogICAgJ1x4MTMnCiAgICAnXHgxNCcKICAgICdceDE1JwogICAgJ1x4MTYnCiAgICAnXHgxNycKICAgICdceDE4JwogICAgJ1x4MTknCiAgICAnXHgxYScKICAgICdceDFiJwogICAgJ1x4MWMnCiAgICAnXHgxZCcKICAgICdceDFlJwogICAgJ1x4MWYnCiAgICAnICcKICAgICchJwogICAgJyInCiAgICAnIycKICAgICckJwogICAgJyUnCiAgICAnJicKICAgICInIgogICAgJygnCiAgICAnKScKICAgICcqJwogICAgJysnCiAgICAnLCcKICAgICctJwogICAgJy4nCiAgICAnLycKICAgICcwJwogICAgJzEnCiAgICAnMicKICAgICczJwogICAgJzQnCiAgICAnNScKICAgICc2JwogICAgJzcnCiAgICAnOCcKICAgICc5JwogICAgJzonCiAgICAnOycKICAgICc8JwogICAgJz0nCiAgICAnPicKICAgICc/JwogICAgJ0AnCiAgICAnQScKICAgICdCJwogICAgJ0MnCiAgICAnRCcKICAgICdFJwogICAgJ0YnCiAgICAnRycKICAgICdIJwogICAgJ0knCiAgICAnSicKICAgICdLJwogICAgJ0wnCiAgICAnTScKICAgICdOJwogICAgJ08nCiAgICAnUCcKICAgICdRJwogICAgJ1InCiAgICAnUycKICAgICdUJwogICAgJ1UnCiAgICAnVicKICAgICdXJwogICAgJ1gnCiAgICAnWScKICAgICdaJwogICAgJ1snCiAgICAnXFwnCiAgICAnXScKICAgICdeJwogICAgJ18nCiAgICAnYCcKICAgICdhJwogICAgJ2InCiAgICAnYycKICAgICdkJwogICAgJ2UnCiAgICAnZicKICAgICdnJwogICAgJ2gnCiAgICAnaScKICAgICdqJwogICAgJ2snCiAgICAnbCcKICAgICdtJwogICAgJ24nCiAgICAnbycKICAgICdwJwogICAgJ3EnCiAgICAncicKICAgICdzJwogICAgJ3QnCiAgICAndScKICAgICd2JwogICAgJ3cnCiAgICAneCcKICAgICd5JwogICAgJ3onCiAgICAneycKICAgICd8JwogICAgJ30nCiAgICAnficKICAgICdceDdmJwogICAgJ1x1Zjc4MCcKICAgICdcdWY3ODEnCiAgICAnXHVmNzgyJwogICAgJ1x1Zjc4MycKICAgICdcdWY3ODQnCiAgICAnXHVmNzg1JwogICAgJ1x1Zjc4NicKICAgICdcdWY3ODcnCiAgICAnXHVmNzg4JwogICAgJ1x1Zjc4OScKICAgICdcdWY3OGEnCiAgICAnXHVmNzhiJwogICAgJ1x1Zjc4YycKICAgICdcdWY3OGQnCiAgICAnXHVmNzhlJwogICAgJ1x1Zjc4ZicKICAgICdcdWY3OTAnCiAgICAnXHVmNzkxJwogICAgJ1x1Zjc5MicKICAgICdcdWY3OTMnCiAgICAnXHVmNzk0JwogICAgJ1x1Zjc5NScKICAgICdcdWY3OTYnCiAgICAnXHVmNzk3JwogICAgJ1x1Zjc5OCcKICAgICdcdWY3OTknCiAgICAnXHVmNzlhJwogICAgJ1x1Zjc5YicKICAgICdcdWY3OWMnCiAgICAnXHVmNzlkJwogICAgJ1x1Zjc5ZScKICAgICdcdWY3OWYnCiAgICAnXHVmN2EwJwogICAgJ1x1ZjdhMScKICAgICdcdWY3YTInCiAgICAnXHVmN2EzJwogICAgJ1x1ZjdhNCcKICAgICdcdWY3YTUnCiAgICAnXHVmN2E2JwogICAgJ1x1ZjdhNycKICAgICdcdWY3YTgnCiAgICAnXHVmN2E5JwogICAgJ1x1ZjdhYScKICAgICdcdWY3YWInCiAgICAnXHVmN2FjJwogICAgJ1x1ZjdhZCcKICAgICdcdWY3YWUnCiAgICAnXHVmN2FmJwogICAgJ1x1ZjdiMCcKICAgICdcdWY3YjEnCiAgICAnXHVmN2IyJwogICAgJ1x1ZjdiMycKICAgICdcdWY3YjQnCiAgICAnXHVmN2I1JwogICAgJ1x1ZjdiNicKICAgICdcdWY3YjcnCiAgICAnXHVmN2I4JwogICAgJ1x1ZjdiOScKICAgICdcdWY3YmEnCiAgICAnXHVmN2JiJwogICAgJ1x1ZjdiYycKICAgICdcdWY3YmQnCiAgICAnXHVmN2JlJwogICAgJ1x1ZjdiZicKICAgICdcdWY3YzAnCiAgICAnXHVmN2MxJwogICAgJ1x1ZjdjMicKICAgICdcdWY3YzMnCiAgICAnXHVmN2M0JwogICAgJ1x1ZjdjNScKICAgICdcdWY3YzYnCiAgICAnXHVmN2M3JwogICAgJ1x1ZjdjOCcKICAgICdcdWY3YzknCiAgICAnXHVmN2NhJwogICAgJ1x1ZjdjYicKICAgICdcdWY3Y2MnCiAgICAnXHVmN2NkJwogICAgJ1x1ZjdjZScKICAgICdcdWY3Y2YnCiAgICAnXHVmN2QwJwogICAgJ1x1ZjdkMScKICAgICdcdWY3ZDInCiAgICAnXHVmN2QzJwogICAgJ1x1ZjdkNCcKICAgICdcdWY3ZDUnCiAgICAnXHVmN2Q2JwogICAgJ1x1ZjdkNycKICAgICdcdWY3ZDgnCiAgICAnXHVmN2Q5JwogICAgJ1x1ZjdkYScKICAgICdcdWY3ZGInCiAgICAnXHVmN2RjJwogICAgJ1x1ZjdkZCcKICAgICdcdWY3ZGUnCiAgICAnXHVmN2RmJwogICAgJ1x1ZjdlMCcKICAgICdcdWY3ZTEnCiAgICAnXHVmN2UyJwogICAgJ1x1ZjdlMycKICAgICdcdWY3ZTQnCiAgICAnXHVmN2U1JwogICAgJ1x1ZjdlNicKICAgICdcdWY3ZTcnCiAgICAnXHVmN2U4JwogICAgJ1x1ZjdlOScKICAgICdcdWY3ZWEnCiAgICAnXHVmN2ViJwogICAgJ1x1ZjdlYycKICAgICdcdWY3ZWQnCiAgICAnXHVmN2VlJwogICAgJ1x1ZjdlZicKICAgICdcdWY3ZjAnCiAgICAnXHVmN2YxJwogICAgJ1x1ZjdmMicKICAgICdcdWY3ZjMnCiAgICAnXHVmN2Y0JwogICAgJ1x1ZjdmNScKICAgICdcdWY3ZjYnCiAgICAnXHVmN2Y3JwogICAgJ1x1ZjdmOCcKICAgICdcdWY3ZjknCiAgICAnXHVmN2ZhJwogICAgJ1x1ZjdmYicKICAgICdcdWY3ZmMnCiAgICAnXHVmN2ZkJwogICAgJ1x1ZjdmZScKICAgICdcdWY3ZmYnCikKCiMjIyBFbmNvZGluZyB0YWJsZQplbmNvZGluZ190YWJsZSA9IGNvZGVjcy5jaGFybWFwX2J1aWxkKGRlY29kaW5nX3RhYmxlKQpQSwMEFAAAAAAAAAAhAIIYi/WGLgAAhi4AACIAAABweXBpX19waXBfOV8wXzMvcGlwL2Jhc2Vjb21tYW5kLnB5IiIiQmFzZSBDb21tYW5kIGNsYXNzLCBhbmQgcmVsYXRlZCByb3V0aW5lcyIiIgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG9zCmltcG9ydCBzeXMKaW1wb3J0IG9wdHBhcnNlCmltcG9ydCB3YXJuaW5ncwoKZnJvbSBwaXAgaW1wb3J0IGNtZG9wdGlvbnMKZnJvbSBwaXAuaW5kZXggaW1wb3J0IFBhY2thZ2VGaW5kZXIKZnJvbSBwaXAubG9jYXRpb25zIGltcG9ydCBydW5uaW5nX3VuZGVyX3ZpcnR1YWxlbnYKZnJvbSBwaXAuZG93bmxvYWQgaW1wb3J0IFBpcFNlc3Npb24KZnJvbSBwaXAuZXhjZXB0aW9ucyBpbXBvcnQgKEJhZENvbW1hbmQsIEluc3RhbGxhdGlvbkVycm9yLCBVbmluc3RhbGxhdGlvbkVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZEVycm9yLCBQcmV2aW91c0J1aWxkRGlyRXJyb3IpCgpmcm9tIHBpcC5jb21wYXQgaW1wb3J0IGxvZ2dpbmdfZGljdENvbmZpZwpmcm9tIHBpcC5iYXNlcGFyc2VyIGltcG9ydCBDb25maWdPcHRpb25QYXJzZXIsIFVwZGF0aW5nRGVmYXVsdHNIZWxwRm9ybWF0dGVyCmZyb20gcGlwLnJlcSBpbXBvcnQgSW5zdGFsbFJlcXVpcmVtZW50LCBwYXJzZV9yZXF1aXJlbWVudHMKZnJvbSBwaXAuc3RhdHVzX2NvZGVzIGltcG9ydCAoCiAgICBTVUNDRVNTLCBFUlJPUiwgVU5LTk9XTl9FUlJPUiwgVklSVFVBTEVOVl9OT1RfRk9VTkQsCiAgICBQUkVWSU9VU19CVUlMRF9ESVJfRVJST1IsCikKZnJvbSBwaXAudXRpbHMgaW1wb3J0IGRlcHJlY2F0aW9uLCBnZXRfcHJvZywgbm9ybWFsaXplX3BhdGgKZnJvbSBwaXAudXRpbHMubG9nZ2luZyBpbXBvcnQgSW5kZW50aW5nRm9ybWF0dGVyCmZyb20gcGlwLnV0aWxzLm91dGRhdGVkIGltcG9ydCBwaXBfdmVyc2lvbl9jaGVjawoKCl9fYWxsX18gPSBbJ0NvbW1hbmQnXQoKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmNsYXNzIENvbW1hbmQob2JqZWN0KToKICAgIG5hbWUgPSBOb25lCiAgICB1c2FnZSA9IE5vbmUKICAgIGhpZGRlbiA9IEZhbHNlCiAgICBsb2dfc3RyZWFtcyA9ICgiZXh0Oi8vc3lzLnN0ZG91dCIsICJleHQ6Ly9zeXMuc3RkZXJyIikKCiAgICBkZWYgX19pbml0X18oc2VsZiwgaXNvbGF0ZWQ9RmFsc2UpOgogICAgICAgIHBhcnNlcl9rdyA9IHsKICAgICAgICAgICAgJ3VzYWdlJzogc2VsZi51c2FnZSwKICAgICAgICAgICAgJ3Byb2cnOiAnJXMgJXMnICUgKGdldF9wcm9nKCksIHNlbGYubmFtZSksCiAgICAgICAgICAgICdmb3JtYXR0ZXInOiBVcGRhdGluZ0RlZmF1bHRzSGVscEZvcm1hdHRlcigpLAogICAgICAgICAgICAnYWRkX2hlbHBfb3B0aW9uJzogRmFsc2UsCiAgICAgICAgICAgICduYW1lJzogc2VsZi5uYW1lLAogICAgICAgICAgICAnZGVzY3JpcHRpb24nOiBzZWxmLl9fZG9jX18sCiAgICAgICAgICAgICdpc29sYXRlZCc6IGlzb2xhdGVkLAogICAgICAgIH0KCiAgICAgICAgc2VsZi5wYXJzZXIgPSBDb25maWdPcHRpb25QYXJzZXIoKipwYXJzZXJfa3cpCgogICAgICAgICMgQ29tbWFuZHMgc2hvdWxkIGFkZCBvcHRpb25zIHRvIHRoaXMgb3B0aW9uIGdyb3VwCiAgICAgICAgb3B0Z3JvdXBfbmFtZSA9ICclcyBPcHRpb25zJyAlIHNlbGYubmFtZS5jYXBpdGFsaXplKCkKICAgICAgICBzZWxmLmNtZF9vcHRzID0gb3B0cGFyc2UuT3B0aW9uR3JvdXAoc2VsZi5wYXJzZXIsIG9wdGdyb3VwX25hbWUpCgogICAgICAgICMgQWRkIHRoZSBnZW5lcmFsIG9wdGlvbnMKICAgICAgICBnZW5fb3B0cyA9IGNtZG9wdGlvbnMubWFrZV9vcHRpb25fZ3JvdXAoCiAgICAgICAgICAgIGNtZG9wdGlvbnMuZ2VuZXJhbF9ncm91cCwKICAgICAgICAgICAgc2VsZi5wYXJzZXIsCiAgICAgICAgKQogICAgICAgIHNlbGYucGFyc2VyLmFkZF9vcHRpb25fZ3JvdXAoZ2VuX29wdHMpCgogICAgZGVmIF9idWlsZF9zZXNzaW9uKHNlbGYsIG9wdGlvbnMsIHJldHJpZXM9Tm9uZSwgdGltZW91dD1Ob25lKToKICAgICAgICBzZXNzaW9uID0gUGlwU2Vzc2lvbigKICAgICAgICAgICAgY2FjaGU9KAogICAgICAgICAgICAgICAgbm9ybWFsaXplX3BhdGgob3MucGF0aC5qb2luKG9wdGlvbnMuY2FjaGVfZGlyLCAiaHR0cCIpKQogICAgICAgICAgICAgICAgaWYgb3B0aW9ucy5jYWNoZV9kaXIgZWxzZSBOb25lCiAgICAgICAgICAgICksCiAgICAgICAgICAgIHJldHJpZXM9cmV0cmllcyBpZiByZXRyaWVzIGlzIG5vdCBOb25lIGVsc2Ugb3B0aW9ucy5yZXRyaWVzLAogICAgICAgICAgICBpbnNlY3VyZV9ob3N0cz1vcHRpb25zLnRydXN0ZWRfaG9zdHMsCiAgICAgICAgKQoKICAgICAgICAjIEhhbmRsZSBjdXN0b20gY2EtYnVuZGxlcyBmcm9tIHRoZSB1c2VyCiAgICAgICAgaWYgb3B0aW9ucy5jZXJ0OgogICAgICAgICAgICBzZXNzaW9uLnZlcmlmeSA9IG9wdGlvbnMuY2VydAoKICAgICAgICAjIEhhbmRsZSBTU0wgY2xpZW50IGNlcnRpZmljYXRlCiAgICAgICAgaWYgb3B0aW9ucy5jbGllbnRfY2VydDoKICAgICAgICAgICAgc2Vzc2lvbi5jZXJ0ID0gb3B0aW9ucy5jbGllbnRfY2VydAoKICAgICAgICAjIEhhbmRsZSB0aW1lb3V0cwogICAgICAgIGlmIG9wdGlvbnMudGltZW91dCBvciB0aW1lb3V0OgogICAgICAgICAgICBzZXNzaW9uLnRpbWVvdXQgPSAoCiAgICAgICAgICAgICAgICB0aW1lb3V0IGlmIHRpbWVvdXQgaXMgbm90IE5vbmUgZWxzZSBvcHRpb25zLnRpbWVvdXQKICAgICAgICAgICAgKQoKICAgICAgICAjIEhhbmRsZSBjb25maWd1cmVkIHByb3hpZXMKICAgICAgICBpZiBvcHRpb25zLnByb3h5OgogICAgICAgICAgICBzZXNzaW9uLnByb3hpZXMgPSB7CiAgICAgICAgICAgICAgICAiaHR0cCI6IG9wdGlvbnMucHJveHksCiAgICAgICAgICAgICAgICAiaHR0cHMiOiBvcHRpb25zLnByb3h5LAogICAgICAgICAgICB9CgogICAgICAgICMgRGV0ZXJtaW5lIGlmIHdlIGNhbiBwcm9tcHQgdGhlIHVzZXIgZm9yIGF1dGhlbnRpY2F0aW9uIG9yIG5vdAogICAgICAgIHNlc3Npb24uYXV0aC5wcm9tcHRpbmcgPSBub3Qgb3B0aW9ucy5ub19pbnB1dAoKICAgICAgICByZXR1cm4gc2Vzc2lvbgoKICAgIGRlZiBwYXJzZV9hcmdzKHNlbGYsIGFyZ3MpOgogICAgICAgICMgZmFjdG9yZWQgb3V0IGZvciB0ZXN0YWJpbGl0eQogICAgICAgIHJldHVybiBzZWxmLnBhcnNlci5wYXJzZV9hcmdzKGFyZ3MpCgogICAgZGVmIG1haW4oc2VsZiwgYXJncyk6CiAgICAgICAgb3B0aW9ucywgYXJncyA9IHNlbGYucGFyc2VfYXJncyhhcmdzKQoKICAgICAgICBpZiBvcHRpb25zLnF1aWV0OgogICAgICAgICAgICBpZiBvcHRpb25zLnF1aWV0ID09IDE6CiAgICAgICAgICAgICAgICBsZXZlbCA9ICJXQVJOSU5HIgogICAgICAgICAgICBpZiBvcHRpb25zLnF1aWV0ID09IDI6CiAgICAgICAgICAgICAgICBsZXZlbCA9ICJFUlJPUiIKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGxldmVsID0gIkNSSVRJQ0FMIgogICAgICAgIGVsaWYgb3B0aW9ucy52ZXJib3NlOgogICAgICAgICAgICBsZXZlbCA9ICJERUJVRyIKICAgICAgICBlbHNlOgogICAgICAgICAgICBsZXZlbCA9ICJJTkZPIgoKICAgICAgICAjIFRoZSByb290IGxvZ2dlciBzaG91bGQgbWF0Y2ggdGhlICJjb25zb2xlIiBsZXZlbCAqdW5sZXNzKiB3ZQogICAgICAgICMgc3BlY2lmaWVkICItLWxvZyIgdG8gc2VuZCBkZWJ1ZyBsb2dzIHRvIGEgZmlsZS4KICAgICAgICByb290X2xldmVsID0gbGV2ZWwKICAgICAgICBpZiBvcHRpb25zLmxvZzoKICAgICAgICAgICAgcm9vdF9sZXZlbCA9ICJERUJVRyIKCiAgICAgICAgbG9nZ2luZ19kaWN0Q29uZmlnKHsKICAgICAgICAgICAgInZlcnNpb24iOiAxLAogICAgICAgICAgICAiZGlzYWJsZV9leGlzdGluZ19sb2dnZXJzIjogRmFsc2UsCiAgICAgICAgICAgICJmaWx0ZXJzIjogewogICAgICAgICAgICAgICAgImV4Y2x1ZGVfd2FybmluZ3MiOiB7CiAgICAgICAgICAgICAgICAgICAgIigpIjogInBpcC51dGlscy5sb2dnaW5nLk1heExldmVsRmlsdGVyIiwKICAgICAgICAgICAgICAgICAgICAibGV2ZWwiOiBsb2dnaW5nLldBUk5JTkcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICAiZm9ybWF0dGVycyI6IHsKICAgICAgICAgICAgICAgICJpbmRlbnQiOiB7CiAgICAgICAgICAgICAgICAgICAgIigpIjogSW5kZW50aW5nRm9ybWF0dGVyLAogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiAiJShtZXNzYWdlKXMiLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImhhbmRsZXJzIjogewogICAgICAgICAgICAgICAgImNvbnNvbGUiOiB7CiAgICAgICAgICAgICAgICAgICAgImxldmVsIjogbGV2ZWwsCiAgICAgICAgICAgICAgICAgICAgImNsYXNzIjogInBpcC51dGlscy5sb2dnaW5nLkNvbG9yaXplZFN0cmVhbUhhbmRsZXIiLAogICAgICAgICAgICAgICAgICAgICJzdHJlYW0iOiBzZWxmLmxvZ19zdHJlYW1zWzBdLAogICAgICAgICAgICAgICAgICAgICJmaWx0ZXJzIjogWyJleGNsdWRlX3dhcm5pbmdzIl0sCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdHRlciI6ICJpbmRlbnQiLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJjb25zb2xlX2Vycm9ycyI6IHsKICAgICAgICAgICAgICAgICAgICAibGV2ZWwiOiAiV0FSTklORyIsCiAgICAgICAgICAgICAgICAgICAgImNsYXNzIjogInBpcC51dGlscy5sb2dnaW5nLkNvbG9yaXplZFN0cmVhbUhhbmRsZXIiLAogICAgICAgICAgICAgICAgICAgICJzdHJlYW0iOiBzZWxmLmxvZ19zdHJlYW1zWzFdLAogICAgICAgICAgICAgICAgICAgICJmb3JtYXR0ZXIiOiAiaW5kZW50IiwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAidXNlcl9sb2ciOiB7CiAgICAgICAgICAgICAgICAgICAgImxldmVsIjogIkRFQlVHIiwKICAgICAgICAgICAgICAgICAgICAiY2xhc3MiOiAicGlwLnV0aWxzLmxvZ2dpbmcuQmV0dGVyUm90YXRpbmdGaWxlSGFuZGxlciIsCiAgICAgICAgICAgICAgICAgICAgImZpbGVuYW1lIjogb3B0aW9ucy5sb2cgb3IgIi9kZXYvbnVsbCIsCiAgICAgICAgICAgICAgICAgICAgImRlbGF5IjogVHJ1ZSwKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0dGVyIjogImluZGVudCIsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICAicm9vdCI6IHsKICAgICAgICAgICAgICAgICJsZXZlbCI6IHJvb3RfbGV2ZWwsCiAgICAgICAgICAgICAgICAiaGFuZGxlcnMiOiBsaXN0KGZpbHRlcihOb25lLCBbCiAgICAgICAgICAgICAgICAgICAgImNvbnNvbGUiLAogICAgICAgICAgICAgICAgICAgICJjb25zb2xlX2Vycm9ycyIsCiAgICAgICAgICAgICAgICAgICAgInVzZXJfbG9nIiBpZiBvcHRpb25zLmxvZyBlbHNlIE5vbmUsCiAgICAgICAgICAgICAgICBdKSksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICMgRGlzYWJsZSBhbnkgbG9nZ2luZyBiZXNpZGVzIFdBUk5JTkcgdW5sZXNzIHdlIGhhdmUgREVCVUcgbGV2ZWwKICAgICAgICAgICAgIyBsb2dnaW5nIGVuYWJsZWQuIFRoZXNlIHVzZSBib3RoIHBpcC5fdmVuZG9yIGFuZCB0aGUgYmFyZSBuYW1lcwogICAgICAgICAgICAjIGZvciB0aGUgY2FzZSB3aGVyZSBzb21lb25lIHVuYnVuZGxlcyBvdXIgbGlicmFyaWVzLgogICAgICAgICAgICAibG9nZ2VycyI6IGRpY3QoCiAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgbmFtZSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJsZXZlbCI6ICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXQVJOSU5HIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGV2ZWwgaW4gWyJJTkZPIiwgIkVSUk9SIl0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgIkRFQlVHIgogICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiBbInBpcC5fdmVuZG9yIiwgImRpc3RsaWIiLCAicmVxdWVzdHMiLCAidXJsbGliMyJdCiAgICAgICAgICAgICksCiAgICAgICAgfSkKCiAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mb1s6Ml0gPT0gKDIsIDYpOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAgICAgIlB5dGhvbiAyLjYgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCBieSB0aGUgUHl0aG9uIGNvcmUgdGVhbSwgIgogICAgICAgICAgICAgICAgInBsZWFzZSB1cGdyYWRlIHlvdXIgUHl0aG9uLiBBIGZ1dHVyZSB2ZXJzaW9uIG9mIHBpcCB3aWxsICIKICAgICAgICAgICAgICAgICJkcm9wIHN1cHBvcnQgZm9yIFB5dGhvbiAyLjYiLAogICAgICAgICAgICAgICAgZGVwcmVjYXRpb24uUHl0aG9uMjZEZXByZWNhdGlvbldhcm5pbmcKICAgICAgICAgICAgKQoKICAgICAgICAjIFRPRE86IHRyeSB0byBnZXQgdGhlc2UgcGFzc2luZyBkb3duIGZyb20gdGhlIGNvbW1hbmQ/CiAgICAgICAgIyAgICAgIHdpdGhvdXQgcmVzb3J0aW5nIHRvIG9zLmVudmlyb24gdG8gaG9sZCB0aGVzZS4KCiAgICAgICAgaWYgb3B0aW9ucy5ub19pbnB1dDoKICAgICAgICAgICAgb3MuZW52aXJvblsnUElQX05PX0lOUFVUJ10gPSAnMScKCiAgICAgICAgaWYgb3B0aW9ucy5leGlzdHNfYWN0aW9uOgogICAgICAgICAgICBvcy5lbnZpcm9uWydQSVBfRVhJU1RTX0FDVElPTiddID0gJyAnLmpvaW4ob3B0aW9ucy5leGlzdHNfYWN0aW9uKQoKICAgICAgICBpZiBvcHRpb25zLnJlcXVpcmVfdmVudjoKICAgICAgICAgICAgIyBJZiBhIHZlbnYgaXMgcmVxdWlyZWQgY2hlY2sgaWYgaXQgY2FuIHJlYWxseSBiZSBmb3VuZAogICAgICAgICAgICBpZiBub3QgcnVubmluZ191bmRlcl92aXJ0dWFsZW52KCk6CiAgICAgICAgICAgICAgICBsb2dnZXIuY3JpdGljYWwoCiAgICAgICAgICAgICAgICAgICAgJ0NvdWxkIG5vdCBmaW5kIGFuIGFjdGl2YXRlZCB2aXJ0dWFsZW52IChyZXF1aXJlZCkuJwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgc3lzLmV4aXQoVklSVFVBTEVOVl9OT1RfRk9VTkQpCgogICAgICAgIHRyeToKICAgICAgICAgICAgc3RhdHVzID0gc2VsZi5ydW4ob3B0aW9ucywgYXJncykKICAgICAgICAgICAgIyBGSVhNRTogYWxsIGNvbW1hbmRzIHNob3VsZCByZXR1cm4gYW4gZXhpdCBzdGF0dXMKICAgICAgICAgICAgIyBhbmQgd2hlbiBpdCBpcyBkb25lLCBpc2luc3RhbmNlIGlzIG5vdCBuZWVkZWQgYW55bW9yZQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHN0YXR1cywgaW50KToKICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXMKICAgICAgICBleGNlcHQgUHJldmlvdXNCdWlsZERpckVycm9yIGFzIGV4YzoKICAgICAgICAgICAgbG9nZ2VyLmNyaXRpY2FsKHN0cihleGMpKQogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0V4Y2VwdGlvbiBpbmZvcm1hdGlvbjonLCBleGNfaW5mbz1UcnVlKQoKICAgICAgICAgICAgcmV0dXJuIFBSRVZJT1VTX0JVSUxEX0RJUl9FUlJPUgogICAgICAgIGV4Y2VwdCAoSW5zdGFsbGF0aW9uRXJyb3IsIFVuaW5zdGFsbGF0aW9uRXJyb3IsIEJhZENvbW1hbmQpIGFzIGV4YzoKICAgICAgICAgICAgbG9nZ2VyLmNyaXRpY2FsKHN0cihleGMpKQogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0V4Y2VwdGlvbiBpbmZvcm1hdGlvbjonLCBleGNfaW5mbz1UcnVlKQoKICAgICAgICAgICAgcmV0dXJuIEVSUk9SCiAgICAgICAgZXhjZXB0IENvbW1hbmRFcnJvciBhcyBleGM6CiAgICAgICAgICAgIGxvZ2dlci5jcml0aWNhbCgnRVJST1I6ICVzJywgZXhjKQogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0V4Y2VwdGlvbiBpbmZvcm1hdGlvbjonLCBleGNfaW5mbz1UcnVlKQoKICAgICAgICAgICAgcmV0dXJuIEVSUk9SCiAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgogICAgICAgICAgICBsb2dnZXIuY3JpdGljYWwoJ09wZXJhdGlvbiBjYW5jZWxsZWQgYnkgdXNlcicpCiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnRXhjZXB0aW9uIGluZm9ybWF0aW9uOicsIGV4Y19pbmZvPVRydWUpCgogICAgICAgICAgICByZXR1cm4gRVJST1IKICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgIGxvZ2dlci5jcml0aWNhbCgnRXhjZXB0aW9uOicsIGV4Y19pbmZvPVRydWUpCgogICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUgogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICMgQ2hlY2sgaWYgd2UncmUgdXNpbmcgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHBpcCBhdmFpbGFibGUKICAgICAgICAgICAgaWYgKG5vdCBvcHRpb25zLmRpc2FibGVfcGlwX3ZlcnNpb25fY2hlY2sgYW5kIG5vdAogICAgICAgICAgICAgICAgICAgIGdldGF0dHIob3B0aW9ucywgIm5vX2luZGV4IiwgRmFsc2UpKToKICAgICAgICAgICAgICAgIHdpdGggc2VsZi5fYnVpbGRfc2Vzc2lvbigKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgcmV0cmllcz0wLAogICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0PW1pbig1LCBvcHRpb25zLnRpbWVvdXQpKSBhcyBzZXNzaW9uOgogICAgICAgICAgICAgICAgICAgIHBpcF92ZXJzaW9uX2NoZWNrKHNlc3Npb24pCgogICAgICAgIHJldHVybiBTVUNDRVNTCgoKY2xhc3MgUmVxdWlyZW1lbnRDb21tYW5kKENvbW1hbmQpOgoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBwb3B1bGF0ZV9yZXF1aXJlbWVudF9zZXQocmVxdWlyZW1lbnRfc2V0LCBhcmdzLCBvcHRpb25zLCBmaW5kZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24sIG5hbWUsIHdoZWVsX2NhY2hlKToKICAgICAgICAiIiIKICAgICAgICBNYXJzaGFsIGNtZCBsaW5lIGFyZ3MgaW50byBhIHJlcXVpcmVtZW50IHNldC4KICAgICAgICAiIiIKICAgICAgICBmb3IgZmlsZW5hbWUgaW4gb3B0aW9ucy5jb25zdHJhaW50czoKICAgICAgICAgICAgZm9yIHJlcSBpbiBwYXJzZV9yZXF1aXJlbWVudHMoCiAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludD1UcnVlLCBmaW5kZXI9ZmluZGVyLCBvcHRpb25zPW9wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbj1zZXNzaW9uLCB3aGVlbF9jYWNoZT13aGVlbF9jYWNoZSk6CiAgICAgICAgICAgICAgICByZXF1aXJlbWVudF9zZXQuYWRkX3JlcXVpcmVtZW50KHJlcSkKCiAgICAgICAgZm9yIHJlcSBpbiBhcmdzOgogICAgICAgICAgICByZXF1aXJlbWVudF9zZXQuYWRkX3JlcXVpcmVtZW50KAogICAgICAgICAgICAgICAgSW5zdGFsbFJlcXVpcmVtZW50LmZyb21fbGluZSgKICAgICAgICAgICAgICAgICAgICByZXEsIE5vbmUsIGlzb2xhdGVkPW9wdGlvbnMuaXNvbGF0ZWRfbW9kZSwKICAgICAgICAgICAgICAgICAgICB3aGVlbF9jYWNoZT13aGVlbF9jYWNoZQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICApCgogICAgICAgIGZvciByZXEgaW4gb3B0aW9ucy5lZGl0YWJsZXM6CiAgICAgICAgICAgIHJlcXVpcmVtZW50X3NldC5hZGRfcmVxdWlyZW1lbnQoCiAgICAgICAgICAgICAgICBJbnN0YWxsUmVxdWlyZW1lbnQuZnJvbV9lZGl0YWJsZSgKICAgICAgICAgICAgICAgICAgICByZXEsCiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdF92Y3M9b3B0aW9ucy5kZWZhdWx0X3ZjcywKICAgICAgICAgICAgICAgICAgICBpc29sYXRlZD1vcHRpb25zLmlzb2xhdGVkX21vZGUsCiAgICAgICAgICAgICAgICAgICAgd2hlZWxfY2FjaGU9d2hlZWxfY2FjaGUKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgKQoKICAgICAgICBmb3VuZF9yZXFfaW5fZmlsZSA9IEZhbHNlCiAgICAgICAgZm9yIGZpbGVuYW1lIGluIG9wdGlvbnMucmVxdWlyZW1lbnRzOgogICAgICAgICAgICBmb3IgcmVxIGluIHBhcnNlX3JlcXVpcmVtZW50cygKICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICBmaW5kZXI9ZmluZGVyLCBvcHRpb25zPW9wdGlvbnMsIHNlc3Npb249c2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICB3aGVlbF9jYWNoZT13aGVlbF9jYWNoZSk6CiAgICAgICAgICAgICAgICBmb3VuZF9yZXFfaW5fZmlsZSA9IFRydWUKICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50X3NldC5hZGRfcmVxdWlyZW1lbnQocmVxKQogICAgICAgICMgSWYgLS1yZXF1aXJlLWhhc2hlcyB3YXMgYSBsaW5lIGluIGEgcmVxdWlyZW1lbnRzIGZpbGUsIHRlbGwKICAgICAgICAjIFJlcXVpcmVtZW50U2V0IGFib3V0IGl0OgogICAgICAgIHJlcXVpcmVtZW50X3NldC5yZXF1aXJlX2hhc2hlcyA9IG9wdGlvbnMucmVxdWlyZV9oYXNoZXMKCiAgICAgICAgaWYgbm90IChhcmdzIG9yIG9wdGlvbnMuZWRpdGFibGVzIG9yIGZvdW5kX3JlcV9pbl9maWxlKToKICAgICAgICAgICAgb3B0cyA9IHsnbmFtZSc6IG5hbWV9CiAgICAgICAgICAgIGlmIG9wdGlvbnMuZmluZF9saW5rczoKICAgICAgICAgICAgICAgIG1zZyA9ICgnWW91IG11c3QgZ2l2ZSBhdCBsZWFzdCBvbmUgcmVxdWlyZW1lbnQgdG8gJwogICAgICAgICAgICAgICAgICAgICAgICclKG5hbWUpcyAobWF5YmUgeW91IG1lYW50ICJwaXAgJShuYW1lKXMgJwogICAgICAgICAgICAgICAgICAgICAgICclKGxpbmtzKXMiPyknICUKICAgICAgICAgICAgICAgICAgICAgICBkaWN0KG9wdHMsIGxpbmtzPScgJy5qb2luKG9wdGlvbnMuZmluZF9saW5rcykpKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbXNnID0gKCdZb3UgbXVzdCBnaXZlIGF0IGxlYXN0IG9uZSByZXF1aXJlbWVudCAnCiAgICAgICAgICAgICAgICAgICAgICAgJ3RvICUobmFtZSlzIChzZWUgInBpcCBoZWxwICUobmFtZSlzIiknICUgb3B0cykKICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcobXNnKQoKICAgIGRlZiBfYnVpbGRfcGFja2FnZV9maW5kZXIoc2VsZiwgb3B0aW9ucywgc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm09Tm9uZSwgcHl0aG9uX3ZlcnNpb25zPU5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFiaT1Ob25lLCBpbXBsZW1lbnRhdGlvbj1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBDcmVhdGUgYSBwYWNrYWdlIGZpbmRlciBhcHByb3ByaWF0ZSB0byB0aGlzIHJlcXVpcmVtZW50IGNvbW1hbmQuCiAgICAgICAgIiIiCiAgICAgICAgaW5kZXhfdXJscyA9IFtvcHRpb25zLmluZGV4X3VybF0gKyBvcHRpb25zLmV4dHJhX2luZGV4X3VybHMKICAgICAgICBpZiBvcHRpb25zLm5vX2luZGV4OgogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0lnbm9yaW5nIGluZGV4ZXM6ICVzJywgJywnLmpvaW4oaW5kZXhfdXJscykpCiAgICAgICAgICAgIGluZGV4X3VybHMgPSBbXQoKICAgICAgICByZXR1cm4gUGFja2FnZUZpbmRlcigKICAgICAgICAgICAgZmluZF9saW5rcz1vcHRpb25zLmZpbmRfbGlua3MsCiAgICAgICAgICAgIGZvcm1hdF9jb250cm9sPW9wdGlvbnMuZm9ybWF0X2NvbnRyb2wsCiAgICAgICAgICAgIGluZGV4X3VybHM9aW5kZXhfdXJscywKICAgICAgICAgICAgdHJ1c3RlZF9ob3N0cz1vcHRpb25zLnRydXN0ZWRfaG9zdHMsCiAgICAgICAgICAgIGFsbG93X2FsbF9wcmVyZWxlYXNlcz1vcHRpb25zLnByZSwKICAgICAgICAgICAgcHJvY2Vzc19kZXBlbmRlbmN5X2xpbmtzPW9wdGlvbnMucHJvY2Vzc19kZXBlbmRlbmN5X2xpbmtzLAogICAgICAgICAgICBzZXNzaW9uPXNlc3Npb24sCiAgICAgICAgICAgIHBsYXRmb3JtPXBsYXRmb3JtLAogICAgICAgICAgICB2ZXJzaW9ucz1weXRob25fdmVyc2lvbnMsCiAgICAgICAgICAgIGFiaT1hYmksCiAgICAgICAgICAgIGltcGxlbWVudGF0aW9uPWltcGxlbWVudGF0aW9uLAogICAgICAgICkKUEsDBBQAAAAAAAAAIQCrq/474SgAAOEoAAAhAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9iYXNlcGFyc2VyLnB5IiIiQmFzZSBvcHRpb24gcGFyc2VyIHNldHVwIiIiCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgc3lzCmltcG9ydCBvcHRwYXJzZQppbXBvcnQgb3MKaW1wb3J0IHJlCmltcG9ydCB0ZXh0d3JhcApmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBzdHJ0b2Jvb2wKCmZyb20gcGlwLl92ZW5kb3Iuc2l4IGltcG9ydCBzdHJpbmdfdHlwZXMKZnJvbSBwaXAuX3ZlbmRvci5zaXgubW92ZXMgaW1wb3J0IGNvbmZpZ3BhcnNlcgpmcm9tIHBpcC5sb2NhdGlvbnMgaW1wb3J0ICgKICAgIGxlZ2FjeV9jb25maWdfZmlsZSwgY29uZmlnX2Jhc2VuYW1lLCBydW5uaW5nX3VuZGVyX3ZpcnR1YWxlbnYsCiAgICBzaXRlX2NvbmZpZ19maWxlcwopCmZyb20gcGlwLnV0aWxzIGltcG9ydCBhcHBkaXJzLCBnZXRfdGVybWluYWxfc2l6ZQoKCl9lbnZpcm9uX3ByZWZpeF9yZSA9IHJlLmNvbXBpbGUociJeUElQXyIsIHJlLkkpCgoKY2xhc3MgUHJldHR5SGVscEZvcm1hdHRlcihvcHRwYXJzZS5JbmRlbnRlZEhlbHBGb3JtYXR0ZXIpOgogICAgIiIiQSBwcmV0dGllci9sZXNzIHZlcmJvc2UgaGVscCBmb3JtYXR0ZXIgZm9yIG9wdHBhcnNlLiIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICMgaGVscCBwb3NpdGlvbiBtdXN0IGJlIGFsaWduZWQgd2l0aCBfX2luaXRfXy5wYXJzZW9wdHMuZGVzY3JpcHRpb24KICAgICAgICBrd2FyZ3NbJ21heF9oZWxwX3Bvc2l0aW9uJ10gPSAzMAogICAgICAgIGt3YXJnc1snaW5kZW50X2luY3JlbWVudCddID0gMQogICAgICAgIGt3YXJnc1snd2lkdGgnXSA9IGdldF90ZXJtaW5hbF9zaXplKClbMF0gLSAyCiAgICAgICAgb3B0cGFyc2UuSW5kZW50ZWRIZWxwRm9ybWF0dGVyLl9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncykKCiAgICBkZWYgZm9ybWF0X29wdGlvbl9zdHJpbmdzKHNlbGYsIG9wdGlvbik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2Zvcm1hdF9vcHRpb25fc3RyaW5ncyhvcHRpb24sICcgPCVzPicsICcsICcpCgogICAgZGVmIF9mb3JtYXRfb3B0aW9uX3N0cmluZ3Moc2VsZiwgb3B0aW9uLCBtdmFyZm10PScgPCVzPicsIG9wdHNlcD0nLCAnKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBvcHRpb24gc3RyaW5ncyBhbmQgbWV0YXZhcnMuCgogICAgICAgIDpwYXJhbSBvcHRpb246ICB0dXBsZSBvZiAoc2hvcnQgb3B0LCBsb25nIG9wdCksIGUuZzogKCctZicsICctLWZvcm1hdCcpCiAgICAgICAgOnBhcmFtIG12YXJmbXQ6IG1ldGF2YXIgZm9ybWF0IHN0cmluZyAtIGV2YWx1YXRlZCBhcyBtdmFyZm10ICUgbWV0YXZhcgogICAgICAgIDpwYXJhbSBvcHRzZXA6ICBzZXBhcmF0b3IKICAgICAgICAiIiIKICAgICAgICBvcHRzID0gW10KCiAgICAgICAgaWYgb3B0aW9uLl9zaG9ydF9vcHRzOgogICAgICAgICAgICBvcHRzLmFwcGVuZChvcHRpb24uX3Nob3J0X29wdHNbMF0pCiAgICAgICAgaWYgb3B0aW9uLl9sb25nX29wdHM6CiAgICAgICAgICAgIG9wdHMuYXBwZW5kKG9wdGlvbi5fbG9uZ19vcHRzWzBdKQogICAgICAgIGlmIGxlbihvcHRzKSA+IDE6CiAgICAgICAgICAgIG9wdHMuaW5zZXJ0KDEsIG9wdHNlcCkKCiAgICAgICAgaWYgb3B0aW9uLnRha2VzX3ZhbHVlKCk6CiAgICAgICAgICAgIG1ldGF2YXIgPSBvcHRpb24ubWV0YXZhciBvciBvcHRpb24uZGVzdC5sb3dlcigpCiAgICAgICAgICAgIG9wdHMuYXBwZW5kKG12YXJmbXQgJSBtZXRhdmFyLmxvd2VyKCkpCgogICAgICAgIHJldHVybiAnJy5qb2luKG9wdHMpCgogICAgZGVmIGZvcm1hdF9oZWFkaW5nKHNlbGYsIGhlYWRpbmcpOgogICAgICAgIGlmIGhlYWRpbmcgPT0gJ09wdGlvbnMnOgogICAgICAgICAgICByZXR1cm4gJycKICAgICAgICByZXR1cm4gaGVhZGluZyArICc6XG4nCgogICAgZGVmIGZvcm1hdF91c2FnZShzZWxmLCB1c2FnZSk6CiAgICAgICAgIiIiCiAgICAgICAgRW5zdXJlIHRoZXJlIGlzIG9ubHkgb25lIG5ld2xpbmUgYmV0d2VlbiB1c2FnZSBhbmQgdGhlIGZpcnN0IGhlYWRpbmcKICAgICAgICBpZiB0aGVyZSBpcyBubyBkZXNjcmlwdGlvbi4KICAgICAgICAiIiIKICAgICAgICBtc2cgPSAnXG5Vc2FnZTogJXNcbicgJSBzZWxmLmluZGVudF9saW5lcyh0ZXh0d3JhcC5kZWRlbnQodXNhZ2UpLCAiICAiKQogICAgICAgIHJldHVybiBtc2cKCiAgICBkZWYgZm9ybWF0X2Rlc2NyaXB0aW9uKHNlbGYsIGRlc2NyaXB0aW9uKToKICAgICAgICAjIGxlYXZlIGZ1bGwgY29udHJvbCBvdmVyIGRlc2NyaXB0aW9uIHRvIHVzCiAgICAgICAgaWYgZGVzY3JpcHRpb246CiAgICAgICAgICAgIGlmIGhhc2F0dHIoc2VsZi5wYXJzZXIsICdtYWluJyk6CiAgICAgICAgICAgICAgICBsYWJlbCA9ICdDb21tYW5kcycKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGxhYmVsID0gJ0Rlc2NyaXB0aW9uJwogICAgICAgICAgICAjIHNvbWUgZG9jIHN0cmluZ3MgaGF2ZSBpbml0aWFsIG5ld2xpbmVzLCBzb21lIGRvbid0CiAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24ubHN0cmlwKCdcbicpCiAgICAgICAgICAgICMgc29tZSBkb2Mgc3RyaW5ncyBoYXZlIGZpbmFsIG5ld2xpbmVzIGFuZCBzcGFjZXMsIHNvbWUgZG9uJ3QKICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbi5yc3RyaXAoKQogICAgICAgICAgICAjIGRlZGVudCwgdGhlbiByZWluZGVudAogICAgICAgICAgICBkZXNjcmlwdGlvbiA9IHNlbGYuaW5kZW50X2xpbmVzKHRleHR3cmFwLmRlZGVudChkZXNjcmlwdGlvbiksICIgICIpCiAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gJyVzOlxuJXNcbicgJSAobGFiZWwsIGRlc2NyaXB0aW9uKQogICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRpb24KICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gJycKCiAgICBkZWYgZm9ybWF0X2VwaWxvZyhzZWxmLCBlcGlsb2cpOgogICAgICAgICMgbGVhdmUgZnVsbCBjb250cm9sIG92ZXIgZXBpbG9nIHRvIHVzCiAgICAgICAgaWYgZXBpbG9nOgogICAgICAgICAgICByZXR1cm4gZXBpbG9nCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuICcnCgogICAgZGVmIGluZGVudF9saW5lcyhzZWxmLCB0ZXh0LCBpbmRlbnQpOgogICAgICAgIG5ld19saW5lcyA9IFtpbmRlbnQgKyBsaW5lIGZvciBsaW5lIGluIHRleHQuc3BsaXQoJ1xuJyldCiAgICAgICAgcmV0dXJuICJcbiIuam9pbihuZXdfbGluZXMpCgoKY2xhc3MgVXBkYXRpbmdEZWZhdWx0c0hlbHBGb3JtYXR0ZXIoUHJldHR5SGVscEZvcm1hdHRlcik6CiAgICAiIiJDdXN0b20gaGVscCBmb3JtYXR0ZXIgZm9yIHVzZSBpbiBDb25maWdPcHRpb25QYXJzZXIuCgogICAgVGhpcyBpcyB1cGRhdGVzIHRoZSBkZWZhdWx0cyBiZWZvcmUgZXhwYW5kaW5nIHRoZW0sIGFsbG93aW5nCiAgICB0aGVtIHRvIHNob3cgdXAgY29ycmVjdGx5IGluIHRoZSBoZWxwIGxpc3RpbmcuCiAgICAiIiIKCiAgICBkZWYgZXhwYW5kX2RlZmF1bHQoc2VsZiwgb3B0aW9uKToKICAgICAgICBpZiBzZWxmLnBhcnNlciBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5wYXJzZXIuX3VwZGF0ZV9kZWZhdWx0cyhzZWxmLnBhcnNlci5kZWZhdWx0cykKICAgICAgICByZXR1cm4gb3B0cGFyc2UuSW5kZW50ZWRIZWxwRm9ybWF0dGVyLmV4cGFuZF9kZWZhdWx0KHNlbGYsIG9wdGlvbikKCgpjbGFzcyBDdXN0b21PcHRpb25QYXJzZXIob3B0cGFyc2UuT3B0aW9uUGFyc2VyKToKCiAgICBkZWYgaW5zZXJ0X29wdGlvbl9ncm91cChzZWxmLCBpZHgsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgIiIiSW5zZXJ0IGFuIE9wdGlvbkdyb3VwIGF0IGEgZ2l2ZW4gcG9zaXRpb24uIiIiCiAgICAgICAgZ3JvdXAgPSBzZWxmLmFkZF9vcHRpb25fZ3JvdXAoKmFyZ3MsICoqa3dhcmdzKQoKICAgICAgICBzZWxmLm9wdGlvbl9ncm91cHMucG9wKCkKICAgICAgICBzZWxmLm9wdGlvbl9ncm91cHMuaW5zZXJ0KGlkeCwgZ3JvdXApCgogICAgICAgIHJldHVybiBncm91cAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIG9wdGlvbl9saXN0X2FsbChzZWxmKToKICAgICAgICAiIiJHZXQgYSBsaXN0IG9mIGFsbCBvcHRpb25zLCBpbmNsdWRpbmcgdGhvc2UgaW4gb3B0aW9uIGdyb3Vwcy4iIiIKICAgICAgICByZXMgPSBzZWxmLm9wdGlvbl9saXN0WzpdCiAgICAgICAgZm9yIGkgaW4gc2VsZi5vcHRpb25fZ3JvdXBzOgogICAgICAgICAgICByZXMuZXh0ZW5kKGkub3B0aW9uX2xpc3QpCgogICAgICAgIHJldHVybiByZXMKCgpjbGFzcyBDb25maWdPcHRpb25QYXJzZXIoQ3VzdG9tT3B0aW9uUGFyc2VyKToKICAgICIiIkN1c3RvbSBvcHRpb24gcGFyc2VyIHdoaWNoIHVwZGF0ZXMgaXRzIGRlZmF1bHRzIGJ5IGNoZWNraW5nIHRoZQogICAgY29uZmlndXJhdGlvbiBmaWxlcyBhbmQgZW52aXJvbm1lbnRhbCB2YXJpYWJsZXMiIiIKCiAgICBpc29sYXRlZCA9IEZhbHNlCgogICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgc2VsZi5jb25maWcgPSBjb25maWdwYXJzZXIuUmF3Q29uZmlnUGFyc2VyKCkKICAgICAgICBzZWxmLm5hbWUgPSBrd2FyZ3MucG9wKCduYW1lJykKICAgICAgICBzZWxmLmlzb2xhdGVkID0ga3dhcmdzLnBvcCgiaXNvbGF0ZWQiLCBGYWxzZSkKICAgICAgICBzZWxmLmZpbGVzID0gc2VsZi5nZXRfY29uZmlnX2ZpbGVzKCkKICAgICAgICBpZiBzZWxmLmZpbGVzOgogICAgICAgICAgICBzZWxmLmNvbmZpZy5yZWFkKHNlbGYuZmlsZXMpCiAgICAgICAgYXNzZXJ0IHNlbGYubmFtZQogICAgICAgIG9wdHBhcnNlLk9wdGlvblBhcnNlci5fX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpCgogICAgZGVmIGdldF9jb25maWdfZmlsZXMoc2VsZik6CiAgICAgICAgIyB0aGUgZmlsZXMgcmV0dXJuZWQgYnkgdGhpcyBtZXRob2Qgd2lsbCBiZSBwYXJzZWQgaW4gb3JkZXIgd2l0aCB0aGUKICAgICAgICAjIGZpcnN0IGZpbGVzIGxpc3RlZCBiZWluZyBvdmVycmlkZGVuIGJ5IGxhdGVyIGZpbGVzIGluIHN0YW5kYXJkCiAgICAgICAgIyBDb25maWdQYXJzZXIgZmFzaGlvbgogICAgICAgIGNvbmZpZ19maWxlID0gb3MuZW52aXJvbi5nZXQoJ1BJUF9DT05GSUdfRklMRScsIEZhbHNlKQogICAgICAgIGlmIGNvbmZpZ19maWxlID09IG9zLmRldm51bGw6CiAgICAgICAgICAgIHJldHVybiBbXQoKICAgICAgICAjIGF0IHRoZSBiYXNlIHdlIGhhdmUgYW55IHNpdGUtd2lkZSBjb25maWd1cmF0aW9uCiAgICAgICAgZmlsZXMgPSBsaXN0KHNpdGVfY29uZmlnX2ZpbGVzKQoKICAgICAgICAjIHBlci11c2VyIGNvbmZpZ3VyYXRpb24gbmV4dAogICAgICAgIGlmIG5vdCBzZWxmLmlzb2xhdGVkOgogICAgICAgICAgICBpZiBjb25maWdfZmlsZSBhbmQgb3MucGF0aC5leGlzdHMoY29uZmlnX2ZpbGUpOgogICAgICAgICAgICAgICAgZmlsZXMuYXBwZW5kKGNvbmZpZ19maWxlKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBUaGlzIGlzIHRoZSBsZWdhY3kgY29uZmlnIGZpbGUsIHdlIGNvbnNpZGVyIGl0IHRvIGJlIGEgbG93ZXIKICAgICAgICAgICAgICAgICMgcHJpb3JpdHkgdGhhbiB0aGUgbmV3IGZpbGUgbG9jYXRpb24uCiAgICAgICAgICAgICAgICBmaWxlcy5hcHBlbmQobGVnYWN5X2NvbmZpZ19maWxlKQoKICAgICAgICAgICAgICAgICMgVGhpcyBpcyB0aGUgbmV3IGNvbmZpZyBmaWxlLCB3ZSBjb25zaWRlciBpdCB0byBiZSBhIGhpZ2hlcgogICAgICAgICAgICAgICAgIyBwcmlvcml0eSB0aGFuIHRoZSBsZWdhY3kgZmlsZS4KICAgICAgICAgICAgICAgIGZpbGVzLmFwcGVuZCgKICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGRpcnMudXNlcl9jb25maWdfZGlyKCJwaXAiKSwKICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnX2Jhc2VuYW1lLAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICkKCiAgICAgICAgIyBmaW5hbGx5IHZpcnR1YWxlbnYgY29uZmlndXJhdGlvbiBmaXJzdCB0cnVtcGluZyBvdGhlcnMKICAgICAgICBpZiBydW5uaW5nX3VuZGVyX3ZpcnR1YWxlbnYoKToKICAgICAgICAgICAgdmVudl9jb25maWdfZmlsZSA9IG9zLnBhdGguam9pbigKICAgICAgICAgICAgICAgIHN5cy5wcmVmaXgsCiAgICAgICAgICAgICAgICBjb25maWdfYmFzZW5hbWUsCiAgICAgICAgICAgICkKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHModmVudl9jb25maWdfZmlsZSk6CiAgICAgICAgICAgICAgICBmaWxlcy5hcHBlbmQodmVudl9jb25maWdfZmlsZSkKCiAgICAgICAgcmV0dXJuIGZpbGVzCgogICAgZGVmIGNoZWNrX2RlZmF1bHQoc2VsZiwgb3B0aW9uLCBrZXksIHZhbCk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gb3B0aW9uLmNoZWNrX3ZhbHVlKGtleSwgdmFsKQogICAgICAgIGV4Y2VwdCBvcHRwYXJzZS5PcHRpb25WYWx1ZUVycm9yIGFzIGV4YzoKICAgICAgICAgICAgcHJpbnQoIkFuIGVycm9yIG9jY3VycmVkIGR1cmluZyBjb25maWd1cmF0aW9uOiAlcyIgJSBleGMpCiAgICAgICAgICAgIHN5cy5leGl0KDMpCgogICAgZGVmIF91cGRhdGVfZGVmYXVsdHMoc2VsZiwgZGVmYXVsdHMpOgogICAgICAgICIiIlVwZGF0ZXMgdGhlIGdpdmVuIGRlZmF1bHRzIHdpdGggdmFsdWVzIGZyb20gdGhlIGNvbmZpZyBmaWxlcyBhbmQKICAgICAgICB0aGUgZW52aXJvbi4gRG9lcyBhIGxpdHRsZSBzcGVjaWFsIGhhbmRsaW5nIGZvciBjZXJ0YWluIHR5cGVzIG9mCiAgICAgICAgb3B0aW9ucyAobGlzdHMpLiIiIgogICAgICAgICMgVGhlbiBnbyBhbmQgbG9vayBmb3IgdGhlIG90aGVyIHNvdXJjZXMgb2YgY29uZmlndXJhdGlvbjoKICAgICAgICBjb25maWcgPSB7fQogICAgICAgICMgMS4gY29uZmlnIGZpbGVzCiAgICAgICAgZm9yIHNlY3Rpb24gaW4gKCdnbG9iYWwnLCBzZWxmLm5hbWUpOgogICAgICAgICAgICBjb25maWcudXBkYXRlKAogICAgICAgICAgICAgICAgc2VsZi5ub3JtYWxpemVfa2V5cyhzZWxmLmdldF9jb25maWdfc2VjdGlvbihzZWN0aW9uKSkKICAgICAgICAgICAgKQogICAgICAgICMgMi4gZW52aXJvbm1lbnRhbCB2YXJpYWJsZXMKICAgICAgICBpZiBub3Qgc2VsZi5pc29sYXRlZDoKICAgICAgICAgICAgY29uZmlnLnVwZGF0ZShzZWxmLm5vcm1hbGl6ZV9rZXlzKHNlbGYuZ2V0X2Vudmlyb25fdmFycygpKSkKICAgICAgICAjIEFjY3VtdWxhdGUgY29tcGxleCBkZWZhdWx0IHN0YXRlLgogICAgICAgIHNlbGYudmFsdWVzID0gb3B0cGFyc2UuVmFsdWVzKHNlbGYuZGVmYXVsdHMpCiAgICAgICAgbGF0ZV9ldmFsID0gc2V0KCkKICAgICAgICAjIFRoZW4gc2V0IHRoZSBvcHRpb25zIHdpdGggdGhvc2UgdmFsdWVzCiAgICAgICAgZm9yIGtleSwgdmFsIGluIGNvbmZpZy5pdGVtcygpOgogICAgICAgICAgICAjIGlnbm9yZSBlbXB0eSB2YWx1ZXMKICAgICAgICAgICAgaWYgbm90IHZhbDoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBvcHRpb24gPSBzZWxmLmdldF9vcHRpb24oa2V5KQogICAgICAgICAgICAjIElnbm9yZSBvcHRpb25zIG5vdCBwcmVzZW50IGluIHRoaXMgcGFyc2VyLiBFLmcuIG5vbi1nbG9iYWxzIHB1dAogICAgICAgICAgICAjIGluIFtnbG9iYWxdIGJ5IHVzZXJzIHRoYXQgd2FudCB0aGVtIHRvIGFwcGx5IHRvIGFsbCBhcHBsaWNhYmxlCiAgICAgICAgICAgICMgY29tbWFuZHMuCiAgICAgICAgICAgIGlmIG9wdGlvbiBpcyBOb25lOgogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIGlmIG9wdGlvbi5hY3Rpb24gaW4gKCdzdG9yZV90cnVlJywgJ3N0b3JlX2ZhbHNlJywgJ2NvdW50Jyk6CiAgICAgICAgICAgICAgICB2YWwgPSBzdHJ0b2Jvb2wodmFsKQogICAgICAgICAgICBlbGlmIG9wdGlvbi5hY3Rpb24gPT0gJ2FwcGVuZCc6CiAgICAgICAgICAgICAgICB2YWwgPSB2YWwuc3BsaXQoKQogICAgICAgICAgICAgICAgdmFsID0gW3NlbGYuY2hlY2tfZGVmYXVsdChvcHRpb24sIGtleSwgdikgZm9yIHYgaW4gdmFsXQogICAgICAgICAgICBlbGlmIG9wdGlvbi5hY3Rpb24gPT0gJ2NhbGxiYWNrJzoKICAgICAgICAgICAgICAgIGxhdGVfZXZhbC5hZGQob3B0aW9uLmRlc3QpCiAgICAgICAgICAgICAgICBvcHRfc3RyID0gb3B0aW9uLmdldF9vcHRfc3RyaW5nKCkKICAgICAgICAgICAgICAgIHZhbCA9IG9wdGlvbi5jb252ZXJ0X3ZhbHVlKG9wdF9zdHIsIHZhbCkKICAgICAgICAgICAgICAgICMgRnJvbSB0YWtlX2FjdGlvbgogICAgICAgICAgICAgICAgYXJncyA9IG9wdGlvbi5jYWxsYmFja19hcmdzIG9yICgpCiAgICAgICAgICAgICAgICBrd2FyZ3MgPSBvcHRpb24uY2FsbGJhY2tfa3dhcmdzIG9yIHt9CiAgICAgICAgICAgICAgICBvcHRpb24uY2FsbGJhY2sob3B0aW9uLCBvcHRfc3RyLCB2YWwsIHNlbGYsICphcmdzLCAqKmt3YXJncykKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHZhbCA9IHNlbGYuY2hlY2tfZGVmYXVsdChvcHRpb24sIGtleSwgdmFsKQoKICAgICAgICAgICAgZGVmYXVsdHNbb3B0aW9uLmRlc3RdID0gdmFsCgogICAgICAgIGZvciBrZXkgaW4gbGF0ZV9ldmFsOgogICAgICAgICAgICBkZWZhdWx0c1trZXldID0gZ2V0YXR0cihzZWxmLnZhbHVlcywga2V5KQogICAgICAgIHNlbGYudmFsdWVzID0gTm9uZQogICAgICAgIHJldHVybiBkZWZhdWx0cwoKICAgIGRlZiBub3JtYWxpemVfa2V5cyhzZWxmLCBpdGVtcyk6CiAgICAgICAgIiIiUmV0dXJuIGEgY29uZmlnIGRpY3Rpb25hcnkgd2l0aCBub3JtYWxpemVkIGtleXMgcmVnYXJkbGVzcyBvZgogICAgICAgIHdoZXRoZXIgdGhlIGtleXMgd2VyZSBzcGVjaWZpZWQgaW4gZW52aXJvbm1lbnQgdmFyaWFibGVzIG9yIGluIGNvbmZpZwogICAgICAgIGZpbGVzIiIiCiAgICAgICAgbm9ybWFsaXplZCA9IHt9CiAgICAgICAgZm9yIGtleSwgdmFsIGluIGl0ZW1zOgogICAgICAgICAgICBrZXkgPSBrZXkucmVwbGFjZSgnXycsICctJykKICAgICAgICAgICAgaWYgbm90IGtleS5zdGFydHN3aXRoKCctLScpOgogICAgICAgICAgICAgICAga2V5ID0gJy0tJXMnICUga2V5ICAjIG9ubHkgcHJlZmVyIGxvbmcgb3B0cwogICAgICAgICAgICBub3JtYWxpemVkW2tleV0gPSB2YWwKICAgICAgICByZXR1cm4gbm9ybWFsaXplZAoKICAgIGRlZiBnZXRfY29uZmlnX3NlY3Rpb24oc2VsZiwgbmFtZSk6CiAgICAgICAgIiIiR2V0IGEgc2VjdGlvbiBvZiBhIGNvbmZpZ3VyYXRpb24iIiIKICAgICAgICBpZiBzZWxmLmNvbmZpZy5oYXNfc2VjdGlvbihuYW1lKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29uZmlnLml0ZW1zKG5hbWUpCiAgICAgICAgcmV0dXJuIFtdCgogICAgZGVmIGdldF9lbnZpcm9uX3ZhcnMoc2VsZik6CiAgICAgICAgIiIiUmV0dXJucyBhIGdlbmVyYXRvciB3aXRoIGFsbCBlbnZpcm9ubWVudGFsIHZhcnMgd2l0aCBwcmVmaXggUElQXyIiIgogICAgICAgIGZvciBrZXksIHZhbCBpbiBvcy5lbnZpcm9uLml0ZW1zKCk6CiAgICAgICAgICAgIGlmIF9lbnZpcm9uX3ByZWZpeF9yZS5zZWFyY2goa2V5KToKICAgICAgICAgICAgICAgIHlpZWxkIChfZW52aXJvbl9wcmVmaXhfcmUuc3ViKCIiLCBrZXkpLmxvd2VyKCksIHZhbCkKCiAgICBkZWYgZ2V0X2RlZmF1bHRfdmFsdWVzKHNlbGYpOgogICAgICAgICIiIk92ZXJyaWRpbmcgdG8gbWFrZSB1cGRhdGluZyB0aGUgZGVmYXVsdHMgYWZ0ZXIgaW5zdGFudGlhdGlvbiBvZgogICAgICAgIHRoZSBvcHRpb24gcGFyc2VyIHBvc3NpYmxlLCBfdXBkYXRlX2RlZmF1bHRzKCkgZG9lcyB0aGUgZGlydHkgd29yay4iIiIKICAgICAgICBpZiBub3Qgc2VsZi5wcm9jZXNzX2RlZmF1bHRfdmFsdWVzOgogICAgICAgICAgICAjIE9sZCwgcHJlLU9wdGlrIDEuNSBiZWhhdmlvdXIuCiAgICAgICAgICAgIHJldHVybiBvcHRwYXJzZS5WYWx1ZXMoc2VsZi5kZWZhdWx0cykKCiAgICAgICAgZGVmYXVsdHMgPSBzZWxmLl91cGRhdGVfZGVmYXVsdHMoc2VsZi5kZWZhdWx0cy5jb3B5KCkpICAjIG91cnMKICAgICAgICBmb3Igb3B0aW9uIGluIHNlbGYuX2dldF9hbGxfb3B0aW9ucygpOgogICAgICAgICAgICBkZWZhdWx0ID0gZGVmYXVsdHMuZ2V0KG9wdGlvbi5kZXN0KQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGRlZmF1bHQsIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgICAgICBvcHRfc3RyID0gb3B0aW9uLmdldF9vcHRfc3RyaW5nKCkKICAgICAgICAgICAgICAgIGRlZmF1bHRzW29wdGlvbi5kZXN0XSA9IG9wdGlvbi5jaGVja192YWx1ZShvcHRfc3RyLCBkZWZhdWx0KQogICAgICAgIHJldHVybiBvcHRwYXJzZS5WYWx1ZXMoZGVmYXVsdHMpCgogICAgZGVmIGVycm9yKHNlbGYsIG1zZyk6CiAgICAgICAgc2VsZi5wcmludF91c2FnZShzeXMuc3RkZXJyKQogICAgICAgIHNlbGYuZXhpdCgyLCAiJXNcbiIgJSBtc2cpClBLAwQUAAAAAAAAACEAS5kyIVpAAABaQAAAIQAAAHB5cGlfX3BpcF85XzBfMy9waXAvY21kb3B0aW9ucy5weSIiIgpzaGFyZWQgb3B0aW9ucyBhbmQgZ3JvdXBzCgpUaGUgcHJpbmNpcGxlIGhlcmUgaXMgdG8gZGVmaW5lIG9wdGlvbnMgb25jZSwgYnV0ICpub3QqIGluc3RhbnRpYXRlIHRoZW0KZ2xvYmFsbHkuIE9uZSByZWFzb24gYmVpbmcgdGhhdCBvcHRpb25zIHdpdGggYWN0aW9uPSdhcHBlbmQnIGNhbiBjYXJyeSBzdGF0ZQpiZXR3ZWVuIHBhcnNlcy4gcGlwIHBhcnNlcyBnZW5lcmFsIG9wdGlvbnMgdHdpY2UgaW50ZXJuYWxseSwgYW5kIHNob3VsZG4ndApwYXNzIG9uIHN0YXRlLiBUbyBiZSBjb25zaXN0ZW50LCBhbGwgb3B0aW9ucyB3aWxsIGZvbGxvdyB0aGlzIGRlc2lnbi4KCiIiIgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKZnJvbSBmdW5jdG9vbHMgaW1wb3J0IHBhcnRpYWwKZnJvbSBvcHRwYXJzZSBpbXBvcnQgT3B0aW9uR3JvdXAsIFNVUFBSRVNTX0hFTFAsIE9wdGlvbgppbXBvcnQgd2FybmluZ3MKCmZyb20gcGlwLmluZGV4IGltcG9ydCAoCiAgICBGb3JtYXRDb250cm9sLCBmbXRfY3RsX2hhbmRsZV9tdXR1YWxfZXhjbHVkZSwgZm10X2N0bF9ub19iaW5hcnksCiAgICBmbXRfY3RsX25vX3VzZV93aGVlbCkKZnJvbSBwaXAubW9kZWxzIGltcG9ydCBQeVBJCmZyb20gcGlwLmxvY2F0aW9ucyBpbXBvcnQgVVNFUl9DQUNIRV9ESVIsIHNyY19wcmVmaXgKZnJvbSBwaXAudXRpbHMuaGFzaGVzIGltcG9ydCBTVFJPTkdfSEFTSEVTCgoKZGVmIG1ha2Vfb3B0aW9uX2dyb3VwKGdyb3VwLCBwYXJzZXIpOgogICAgIiIiCiAgICBSZXR1cm4gYW4gT3B0aW9uR3JvdXAgb2JqZWN0CiAgICBncm91cCAgLS0gYXNzdW1lZCB0byBiZSBkaWN0IHdpdGggJ25hbWUnIGFuZCAnb3B0aW9ucycga2V5cwogICAgcGFyc2VyIC0tIGFuIG9wdHBhcnNlIFBhcnNlcgogICAgIiIiCiAgICBvcHRpb25fZ3JvdXAgPSBPcHRpb25Hcm91cChwYXJzZXIsIGdyb3VwWyduYW1lJ10pCiAgICBmb3Igb3B0aW9uIGluIGdyb3VwWydvcHRpb25zJ106CiAgICAgICAgb3B0aW9uX2dyb3VwLmFkZF9vcHRpb24ob3B0aW9uKCkpCiAgICByZXR1cm4gb3B0aW9uX2dyb3VwCgoKZGVmIHJlc29sdmVfd2hlZWxfbm9fdXNlX2JpbmFyeShvcHRpb25zKToKICAgIGlmIG5vdCBvcHRpb25zLnVzZV93aGVlbDoKICAgICAgICBjb250cm9sID0gb3B0aW9ucy5mb3JtYXRfY29udHJvbAogICAgICAgIGZtdF9jdGxfbm9fdXNlX3doZWVsKGNvbnRyb2wpCgoKZGVmIGNoZWNrX2luc3RhbGxfYnVpbGRfZ2xvYmFsKG9wdGlvbnMsIGNoZWNrX29wdGlvbnM9Tm9uZSk6CiAgICAiIiJEaXNhYmxlIHdoZWVscyBpZiBwZXItc2V0dXAucHkgY2FsbCBvcHRpb25zIGFyZSBzZXQuCgogICAgOnBhcmFtIG9wdGlvbnM6IFRoZSBPcHRpb25QYXJzZXIgb3B0aW9ucyB0byB1cGRhdGUuCiAgICA6cGFyYW0gY2hlY2tfb3B0aW9uczogVGhlIG9wdGlvbnMgdG8gY2hlY2ssIGlmIG5vdCBzdXBwbGllZCBkZWZhdWx0cyB0bwogICAgICAgIG9wdGlvbnMuCiAgICAiIiIKICAgIGlmIGNoZWNrX29wdGlvbnMgaXMgTm9uZToKICAgICAgICBjaGVja19vcHRpb25zID0gb3B0aW9ucwoKICAgIGRlZiBnZXRuYW1lKG4pOgogICAgICAgIHJldHVybiBnZXRhdHRyKGNoZWNrX29wdGlvbnMsIG4sIE5vbmUpCiAgICBuYW1lcyA9IFsiYnVpbGRfb3B0aW9ucyIsICJnbG9iYWxfb3B0aW9ucyIsICJpbnN0YWxsX29wdGlvbnMiXQogICAgaWYgYW55KG1hcChnZXRuYW1lLCBuYW1lcykpOgogICAgICAgIGNvbnRyb2wgPSBvcHRpb25zLmZvcm1hdF9jb250cm9sCiAgICAgICAgZm10X2N0bF9ub19iaW5hcnkoY29udHJvbCkKICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAnRGlzYWJsaW5nIGFsbCB1c2Ugb2Ygd2hlZWxzIGR1ZSB0byB0aGUgdXNlIG9mIC0tYnVpbGQtb3B0aW9ucyAnCiAgICAgICAgICAgICcvIC0tZ2xvYmFsLW9wdGlvbnMgLyAtLWluc3RhbGwtb3B0aW9ucy4nLCBzdGFja2xldmVsPTIpCgoKIyMjIyMjIyMjIyMKIyBvcHRpb25zICMKIyMjIyMjIyMjIyMKCmhlbHBfID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICctaCcsICctLWhlbHAnLAogICAgZGVzdD0naGVscCcsCiAgICBhY3Rpb249J2hlbHAnLAogICAgaGVscD0nU2hvdyBoZWxwLicpCgppc29sYXRlZF9tb2RlID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICItLWlzb2xhdGVkIiwKICAgIGRlc3Q9Imlzb2xhdGVkX21vZGUiLAogICAgYWN0aW9uPSJzdG9yZV90cnVlIiwKICAgIGRlZmF1bHQ9RmFsc2UsCiAgICBoZWxwPSgKICAgICAgICAiUnVuIHBpcCBpbiBhbiBpc29sYXRlZCBtb2RlLCBpZ25vcmluZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYW5kIHVzZXIgIgogICAgICAgICJjb25maWd1cmF0aW9uLiIKICAgICksCikKCnJlcXVpcmVfdmlydHVhbGVudiA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAjIFJ1biBvbmx5IGlmIGluc2lkZSBhIHZpcnR1YWxlbnYsIGJhaWwgaWYgbm90LgogICAgJy0tcmVxdWlyZS12aXJ0dWFsZW52JywgJy0tcmVxdWlyZS12ZW52JywKICAgIGRlc3Q9J3JlcXVpcmVfdmVudicsCiAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgZGVmYXVsdD1GYWxzZSwKICAgIGhlbHA9U1VQUFJFU1NfSEVMUCkKCnZlcmJvc2UgPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgJy12JywgJy0tdmVyYm9zZScsCiAgICBkZXN0PSd2ZXJib3NlJywKICAgIGFjdGlvbj0nY291bnQnLAogICAgZGVmYXVsdD0wLAogICAgaGVscD0nR2l2ZSBtb3JlIG91dHB1dC4gT3B0aW9uIGlzIGFkZGl0aXZlLCBhbmQgY2FuIGJlIHVzZWQgdXAgdG8gMyB0aW1lcy4nCikKCnZlcnNpb24gPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgJy1WJywgJy0tdmVyc2lvbicsCiAgICBkZXN0PSd2ZXJzaW9uJywKICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICBoZWxwPSdTaG93IHZlcnNpb24gYW5kIGV4aXQuJykKCnF1aWV0ID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICctcScsICctLXF1aWV0JywKICAgIGRlc3Q9J3F1aWV0JywKICAgIGFjdGlvbj0nY291bnQnLAogICAgZGVmYXVsdD0wLAogICAgaGVscD0oJ0dpdmUgbGVzcyBvdXRwdXQuIE9wdGlvbiBpcyBhZGRpdGl2ZSwgYW5kIGNhbiBiZSB1c2VkIHVwIHRvIDMnCiAgICAgICAgICAnIHRpbWVzIChjb3JyZXNwb25kaW5nIHRvIFdBUk5JTkcsIEVSUk9SLCBhbmQgQ1JJVElDQUwgbG9nZ2luZycKICAgICAgICAgICcgbGV2ZWxzKS4nKQopCgpsb2cgPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgIi0tbG9nIiwgIi0tbG9nLWZpbGUiLCAiLS1sb2NhbC1sb2ciLAogICAgZGVzdD0ibG9nIiwKICAgIG1ldGF2YXI9InBhdGgiLAogICAgaGVscD0iUGF0aCB0byBhIHZlcmJvc2UgYXBwZW5kaW5nIGxvZy4iCikKCm5vX2lucHV0ID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICMgRG9uJ3QgYXNrIGZvciBpbnB1dAogICAgJy0tbm8taW5wdXQnLAogICAgZGVzdD0nbm9faW5wdXQnLAogICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgIGRlZmF1bHQ9RmFsc2UsCiAgICBoZWxwPVNVUFBSRVNTX0hFTFApCgpwcm94eSA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAnLS1wcm94eScsCiAgICBkZXN0PSdwcm94eScsCiAgICB0eXBlPSdzdHInLAogICAgZGVmYXVsdD0nJywKICAgIGhlbHA9IlNwZWNpZnkgYSBwcm94eSBpbiB0aGUgZm9ybSBbdXNlcjpwYXNzd2RAXXByb3h5LnNlcnZlcjpwb3J0LiIpCgpyZXRyaWVzID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICctLXJldHJpZXMnLAogICAgZGVzdD0ncmV0cmllcycsCiAgICB0eXBlPSdpbnQnLAogICAgZGVmYXVsdD01LAogICAgaGVscD0iTWF4aW11bSBudW1iZXIgb2YgcmV0cmllcyBlYWNoIGNvbm5lY3Rpb24gc2hvdWxkIGF0dGVtcHQgIgogICAgICAgICAiKGRlZmF1bHQgJWRlZmF1bHQgdGltZXMpLiIpCgp0aW1lb3V0ID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICctLXRpbWVvdXQnLCAnLS1kZWZhdWx0LXRpbWVvdXQnLAogICAgbWV0YXZhcj0nc2VjJywKICAgIGRlc3Q9J3RpbWVvdXQnLAogICAgdHlwZT0nZmxvYXQnLAogICAgZGVmYXVsdD0xNSwKICAgIGhlbHA9J1NldCB0aGUgc29ja2V0IHRpbWVvdXQgKGRlZmF1bHQgJWRlZmF1bHQgc2Vjb25kcykuJykKCmRlZmF1bHRfdmNzID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICMgVGhlIGRlZmF1bHQgdmVyc2lvbiBjb250cm9sIHN5c3RlbSBmb3IgZWRpdGFibGVzLCBlLmcuICdzdm4nCiAgICAnLS1kZWZhdWx0LXZjcycsCiAgICBkZXN0PSdkZWZhdWx0X3ZjcycsCiAgICB0eXBlPSdzdHInLAogICAgZGVmYXVsdD0nJywKICAgIGhlbHA9U1VQUFJFU1NfSEVMUCkKCnNraXBfcmVxdWlyZW1lbnRzX3JlZ2V4ID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICMgQSByZWdleCB0byBiZSB1c2VkIHRvIHNraXAgcmVxdWlyZW1lbnRzCiAgICAnLS1za2lwLXJlcXVpcmVtZW50cy1yZWdleCcsCiAgICBkZXN0PSdza2lwX3JlcXVpcmVtZW50c19yZWdleCcsCiAgICB0eXBlPSdzdHInLAogICAgZGVmYXVsdD0nJywKICAgIGhlbHA9U1VQUFJFU1NfSEVMUCkKCgpkZWYgZXhpc3RzX2FjdGlvbigpOgogICAgcmV0dXJuIE9wdGlvbigKICAgICAgICAjIE9wdGlvbiB3aGVuIHBhdGggYWxyZWFkeSBleGlzdAogICAgICAgICctLWV4aXN0cy1hY3Rpb24nLAogICAgICAgIGRlc3Q9J2V4aXN0c19hY3Rpb24nLAogICAgICAgIHR5cGU9J2Nob2ljZScsCiAgICAgICAgY2hvaWNlcz1bJ3MnLCAnaScsICd3JywgJ2InLCAnYSddLAogICAgICAgIGRlZmF1bHQ9W10sCiAgICAgICAgYWN0aW9uPSdhcHBlbmQnLAogICAgICAgIG1ldGF2YXI9J2FjdGlvbicsCiAgICAgICAgaGVscD0iRGVmYXVsdCBhY3Rpb24gd2hlbiBhIHBhdGggYWxyZWFkeSBleGlzdHM6ICIKICAgICAgICAiKHMpd2l0Y2gsIChpKWdub3JlLCAodylpcGUsIChiKWFja3VwLCAoYSlib3J0LiIpCgoKY2VydCA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAnLS1jZXJ0JywKICAgIGRlc3Q9J2NlcnQnLAogICAgdHlwZT0nc3RyJywKICAgIG1ldGF2YXI9J3BhdGgnLAogICAgaGVscD0iUGF0aCB0byBhbHRlcm5hdGUgQ0EgYnVuZGxlLiIpCgpjbGllbnRfY2VydCA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAnLS1jbGllbnQtY2VydCcsCiAgICBkZXN0PSdjbGllbnRfY2VydCcsCiAgICB0eXBlPSdzdHInLAogICAgZGVmYXVsdD1Ob25lLAogICAgbWV0YXZhcj0ncGF0aCcsCiAgICBoZWxwPSJQYXRoIHRvIFNTTCBjbGllbnQgY2VydGlmaWNhdGUsIGEgc2luZ2xlIGZpbGUgY29udGFpbmluZyB0aGUgIgogICAgICAgICAicHJpdmF0ZSBrZXkgYW5kIHRoZSBjZXJ0aWZpY2F0ZSBpbiBQRU0gZm9ybWF0LiIpCgppbmRleF91cmwgPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgJy1pJywgJy0taW5kZXgtdXJsJywgJy0tcHlwaS11cmwnLAogICAgZGVzdD0naW5kZXhfdXJsJywKICAgIG1ldGF2YXI9J1VSTCcsCiAgICBkZWZhdWx0PVB5UEkuc2ltcGxlX3VybCwKICAgIGhlbHA9IkJhc2UgVVJMIG9mIFB5dGhvbiBQYWNrYWdlIEluZGV4IChkZWZhdWx0ICVkZWZhdWx0KS4gIgogICAgICAgICAiVGhpcyBzaG91bGQgcG9pbnQgdG8gYSByZXBvc2l0b3J5IGNvbXBsaWFudCB3aXRoIFBFUCA1MDMgIgogICAgICAgICAiKHRoZSBzaW1wbGUgcmVwb3NpdG9yeSBBUEkpIG9yIGEgbG9jYWwgZGlyZWN0b3J5IGxhaWQgb3V0ICIKICAgICAgICAgImluIHRoZSBzYW1lIGZvcm1hdC4iKQoKCmRlZiBleHRyYV9pbmRleF91cmwoKToKICAgIHJldHVybiBPcHRpb24oCiAgICAgICAgJy0tZXh0cmEtaW5kZXgtdXJsJywKICAgICAgICBkZXN0PSdleHRyYV9pbmRleF91cmxzJywKICAgICAgICBtZXRhdmFyPSdVUkwnLAogICAgICAgIGFjdGlvbj0nYXBwZW5kJywKICAgICAgICBkZWZhdWx0PVtdLAogICAgICAgIGhlbHA9IkV4dHJhIFVSTHMgb2YgcGFja2FnZSBpbmRleGVzIHRvIHVzZSBpbiBhZGRpdGlvbiB0byAiCiAgICAgICAgICAgICAiLS1pbmRleC11cmwuIFNob3VsZCBmb2xsb3cgdGhlIHNhbWUgcnVsZXMgYXMgIgogICAgICAgICAgICAgIi0taW5kZXgtdXJsLiIKICAgICkKCgpub19pbmRleCA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAnLS1uby1pbmRleCcsCiAgICBkZXN0PSdub19pbmRleCcsCiAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgZGVmYXVsdD1GYWxzZSwKICAgIGhlbHA9J0lnbm9yZSBwYWNrYWdlIGluZGV4IChvbmx5IGxvb2tpbmcgYXQgLS1maW5kLWxpbmtzIFVSTHMgaW5zdGVhZCkuJykKCgpkZWYgZmluZF9saW5rcygpOgogICAgcmV0dXJuIE9wdGlvbigKICAgICAgICAnLWYnLCAnLS1maW5kLWxpbmtzJywKICAgICAgICBkZXN0PSdmaW5kX2xpbmtzJywKICAgICAgICBhY3Rpb249J2FwcGVuZCcsCiAgICAgICAgZGVmYXVsdD1bXSwKICAgICAgICBtZXRhdmFyPSd1cmwnLAogICAgICAgIGhlbHA9IklmIGEgdXJsIG9yIHBhdGggdG8gYW4gaHRtbCBmaWxlLCB0aGVuIHBhcnNlIGZvciBsaW5rcyB0byAiCiAgICAgICAgICAgICAiYXJjaGl2ZXMuIElmIGEgbG9jYWwgcGF0aCBvciBmaWxlOi8vIHVybCB0aGF0J3MgYSBkaXJlY3RvcnksICIKICAgICAgICAgICAgICJ0aGVuIGxvb2sgZm9yIGFyY2hpdmVzIGluIHRoZSBkaXJlY3RvcnkgbGlzdGluZy4iKQoKCmRlZiBhbGxvd19leHRlcm5hbCgpOgogICAgcmV0dXJuIE9wdGlvbigKICAgICAgICAiLS1hbGxvdy1leHRlcm5hbCIsCiAgICAgICAgZGVzdD0iYWxsb3dfZXh0ZXJuYWwiLAogICAgICAgIGFjdGlvbj0iYXBwZW5kIiwKICAgICAgICBkZWZhdWx0PVtdLAogICAgICAgIG1ldGF2YXI9IlBBQ0tBR0UiLAogICAgICAgIGhlbHA9U1VQUFJFU1NfSEVMUCwKICAgICkKCgphbGxvd19hbGxfZXh0ZXJuYWwgPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgIi0tYWxsb3ctYWxsLWV4dGVybmFsIiwKICAgIGRlc3Q9ImFsbG93X2FsbF9leHRlcm5hbCIsCiAgICBhY3Rpb249InN0b3JlX3RydWUiLAogICAgZGVmYXVsdD1GYWxzZSwKICAgIGhlbHA9U1VQUFJFU1NfSEVMUCwKKQoKCmRlZiB0cnVzdGVkX2hvc3QoKToKICAgIHJldHVybiBPcHRpb24oCiAgICAgICAgIi0tdHJ1c3RlZC1ob3N0IiwKICAgICAgICBkZXN0PSJ0cnVzdGVkX2hvc3RzIiwKICAgICAgICBhY3Rpb249ImFwcGVuZCIsCiAgICAgICAgbWV0YXZhcj0iSE9TVE5BTUUiLAogICAgICAgIGRlZmF1bHQ9W10sCiAgICAgICAgaGVscD0iTWFyayB0aGlzIGhvc3QgYXMgdHJ1c3RlZCwgZXZlbiB0aG91Z2ggaXQgZG9lcyBub3QgaGF2ZSB2YWxpZCAiCiAgICAgICAgICAgICAib3IgYW55IEhUVFBTLiIsCiAgICApCgoKIyBSZW1vdmUgYWZ0ZXIgNy4wCm5vX2FsbG93X2V4dGVybmFsID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICItLW5vLWFsbG93LWV4dGVybmFsIiwKICAgIGRlc3Q9ImFsbG93X2FsbF9leHRlcm5hbCIsCiAgICBhY3Rpb249InN0b3JlX2ZhbHNlIiwKICAgIGRlZmF1bHQ9RmFsc2UsCiAgICBoZWxwPVNVUFBSRVNTX0hFTFAsCikKCgojIFJlbW92ZSAtLWFsbG93LWluc2VjdXJlIGFmdGVyIDcuMApkZWYgYWxsb3dfdW5zYWZlKCk6CiAgICByZXR1cm4gT3B0aW9uKAogICAgICAgICItLWFsbG93LXVudmVyaWZpZWQiLCAiLS1hbGxvdy1pbnNlY3VyZSIsCiAgICAgICAgZGVzdD0iYWxsb3dfdW52ZXJpZmllZCIsCiAgICAgICAgYWN0aW9uPSJhcHBlbmQiLAogICAgICAgIGRlZmF1bHQ9W10sCiAgICAgICAgbWV0YXZhcj0iUEFDS0FHRSIsCiAgICAgICAgaGVscD1TVVBQUkVTU19IRUxQLAogICAgKQoKIyBSZW1vdmUgYWZ0ZXIgNy4wCm5vX2FsbG93X3Vuc2FmZSA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAiLS1uby1hbGxvdy1pbnNlY3VyZSIsCiAgICBkZXN0PSJhbGxvd19hbGxfaW5zZWN1cmUiLAogICAgYWN0aW9uPSJzdG9yZV9mYWxzZSIsCiAgICBkZWZhdWx0PUZhbHNlLAogICAgaGVscD1TVVBQUkVTU19IRUxQCikKCiMgUmVtb3ZlIGFmdGVyIDEuNQpwcm9jZXNzX2RlcGVuZGVuY3lfbGlua3MgPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgIi0tcHJvY2Vzcy1kZXBlbmRlbmN5LWxpbmtzIiwKICAgIGRlc3Q9InByb2Nlc3NfZGVwZW5kZW5jeV9saW5rcyIsCiAgICBhY3Rpb249InN0b3JlX3RydWUiLAogICAgZGVmYXVsdD1GYWxzZSwKICAgIGhlbHA9IkVuYWJsZSB0aGUgcHJvY2Vzc2luZyBvZiBkZXBlbmRlbmN5IGxpbmtzLiIsCikKCgpkZWYgY29uc3RyYWludHMoKToKICAgIHJldHVybiBPcHRpb24oCiAgICAgICAgJy1jJywgJy0tY29uc3RyYWludCcsCiAgICAgICAgZGVzdD0nY29uc3RyYWludHMnLAogICAgICAgIGFjdGlvbj0nYXBwZW5kJywKICAgICAgICBkZWZhdWx0PVtdLAogICAgICAgIG1ldGF2YXI9J2ZpbGUnLAogICAgICAgIGhlbHA9J0NvbnN0cmFpbiB2ZXJzaW9ucyB1c2luZyB0aGUgZ2l2ZW4gY29uc3RyYWludHMgZmlsZS4gJwogICAgICAgICdUaGlzIG9wdGlvbiBjYW4gYmUgdXNlZCBtdWx0aXBsZSB0aW1lcy4nKQoKCmRlZiByZXF1aXJlbWVudHMoKToKICAgIHJldHVybiBPcHRpb24oCiAgICAgICAgJy1yJywgJy0tcmVxdWlyZW1lbnQnLAogICAgICAgIGRlc3Q9J3JlcXVpcmVtZW50cycsCiAgICAgICAgYWN0aW9uPSdhcHBlbmQnLAogICAgICAgIGRlZmF1bHQ9W10sCiAgICAgICAgbWV0YXZhcj0nZmlsZScsCiAgICAgICAgaGVscD0nSW5zdGFsbCBmcm9tIHRoZSBnaXZlbiByZXF1aXJlbWVudHMgZmlsZS4gJwogICAgICAgICdUaGlzIG9wdGlvbiBjYW4gYmUgdXNlZCBtdWx0aXBsZSB0aW1lcy4nKQoKCmRlZiBlZGl0YWJsZSgpOgogICAgcmV0dXJuIE9wdGlvbigKICAgICAgICAnLWUnLCAnLS1lZGl0YWJsZScsCiAgICAgICAgZGVzdD0nZWRpdGFibGVzJywKICAgICAgICBhY3Rpb249J2FwcGVuZCcsCiAgICAgICAgZGVmYXVsdD1bXSwKICAgICAgICBtZXRhdmFyPSdwYXRoL3VybCcsCiAgICAgICAgaGVscD0oJ0luc3RhbGwgYSBwcm9qZWN0IGluIGVkaXRhYmxlIG1vZGUgKGkuZS4gc2V0dXB0b29scyAnCiAgICAgICAgICAgICAgJyJkZXZlbG9wIG1vZGUiKSBmcm9tIGEgbG9jYWwgcHJvamVjdCBwYXRoIG9yIGEgVkNTIHVybC4nKSwKICAgICkKCnNyYyA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAnLS1zcmMnLCAnLS1zb3VyY2UnLCAnLS1zb3VyY2UtZGlyJywgJy0tc291cmNlLWRpcmVjdG9yeScsCiAgICBkZXN0PSdzcmNfZGlyJywKICAgIG1ldGF2YXI9J2RpcicsCiAgICBkZWZhdWx0PXNyY19wcmVmaXgsCiAgICBoZWxwPSdEaXJlY3RvcnkgdG8gY2hlY2sgb3V0IGVkaXRhYmxlIHByb2plY3RzIGludG8uICcKICAgICdUaGUgZGVmYXVsdCBpbiBhIHZpcnR1YWxlbnYgaXMgIjx2ZW52IHBhdGg+L3NyYyIuICcKICAgICdUaGUgZGVmYXVsdCBmb3IgZ2xvYmFsIGluc3RhbGxzIGlzICI8Y3VycmVudCBkaXI+L3NyYyIuJwopCgojIFhYWDogZGVwcmVjYXRlZCwgcmVtb3ZlIGluIDkuMAp1c2Vfd2hlZWwgPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgJy0tdXNlLXdoZWVsJywKICAgIGRlc3Q9J3VzZV93aGVlbCcsCiAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgZGVmYXVsdD1UcnVlLAogICAgaGVscD1TVVBQUkVTU19IRUxQLAopCgojIFhYWDogZGVwcmVjYXRlZCwgcmVtb3ZlIGluIDkuMApub191c2Vfd2hlZWwgPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgJy0tbm8tdXNlLXdoZWVsJywKICAgIGRlc3Q9J3VzZV93aGVlbCcsCiAgICBhY3Rpb249J3N0b3JlX2ZhbHNlJywKICAgIGRlZmF1bHQ9VHJ1ZSwKICAgIGhlbHA9KCdEbyBub3QgRmluZCBhbmQgcHJlZmVyIHdoZWVsIGFyY2hpdmVzIHdoZW4gc2VhcmNoaW5nIGluZGV4ZXMgYW5kICcKICAgICAgICAgICdmaW5kLWxpbmtzIGxvY2F0aW9ucy4gREVQUkVDQVRFRCBpbiBmYXZvdXIgb2YgLS1uby1iaW5hcnkuJyksCikKCgpkZWYgX2dldF9mb3JtYXRfY29udHJvbCh2YWx1ZXMsIG9wdGlvbik6CiAgICAiIiJHZXQgYSBmb3JtYXRfY29udHJvbCBvYmplY3QuIiIiCiAgICByZXR1cm4gZ2V0YXR0cih2YWx1ZXMsIG9wdGlvbi5kZXN0KQoKCmRlZiBfaGFuZGxlX25vX2JpbmFyeShvcHRpb24sIG9wdF9zdHIsIHZhbHVlLCBwYXJzZXIpOgogICAgZXhpc3RpbmcgPSBnZXRhdHRyKHBhcnNlci52YWx1ZXMsIG9wdGlvbi5kZXN0KQogICAgZm10X2N0bF9oYW5kbGVfbXV0dWFsX2V4Y2x1ZGUoCiAgICAgICAgdmFsdWUsIGV4aXN0aW5nLm5vX2JpbmFyeSwgZXhpc3Rpbmcub25seV9iaW5hcnkpCgoKZGVmIF9oYW5kbGVfb25seV9iaW5hcnkob3B0aW9uLCBvcHRfc3RyLCB2YWx1ZSwgcGFyc2VyKToKICAgIGV4aXN0aW5nID0gZ2V0YXR0cihwYXJzZXIudmFsdWVzLCBvcHRpb24uZGVzdCkKICAgIGZtdF9jdGxfaGFuZGxlX211dHVhbF9leGNsdWRlKAogICAgICAgIHZhbHVlLCBleGlzdGluZy5vbmx5X2JpbmFyeSwgZXhpc3Rpbmcubm9fYmluYXJ5KQoKCmRlZiBub19iaW5hcnkoKToKICAgIHJldHVybiBPcHRpb24oCiAgICAgICAgIi0tbm8tYmluYXJ5IiwgZGVzdD0iZm9ybWF0X2NvbnRyb2wiLCBhY3Rpb249ImNhbGxiYWNrIiwKICAgICAgICBjYWxsYmFjaz1faGFuZGxlX25vX2JpbmFyeSwgdHlwZT0ic3RyIiwKICAgICAgICBkZWZhdWx0PUZvcm1hdENvbnRyb2woc2V0KCksIHNldCgpKSwKICAgICAgICBoZWxwPSJEbyBub3QgdXNlIGJpbmFyeSBwYWNrYWdlcy4gQ2FuIGJlIHN1cHBsaWVkIG11bHRpcGxlIHRpbWVzLCBhbmQgIgogICAgICAgICAgICAgImVhY2ggdGltZSBhZGRzIHRvIHRoZSBleGlzdGluZyB2YWx1ZS4gQWNjZXB0cyBlaXRoZXIgOmFsbDogdG8gIgogICAgICAgICAgICAgImRpc2FibGUgYWxsIGJpbmFyeSBwYWNrYWdlcywgOm5vbmU6IHRvIGVtcHR5IHRoZSBzZXQsIG9yIG9uZSBvciAiCiAgICAgICAgICAgICAibW9yZSBwYWNrYWdlIG5hbWVzIHdpdGggY29tbWFzIGJldHdlZW4gdGhlbS4gTm90ZSB0aGF0IHNvbWUgIgogICAgICAgICAgICAgInBhY2thZ2VzIGFyZSB0cmlja3kgdG8gY29tcGlsZSBhbmQgbWF5IGZhaWwgdG8gaW5zdGFsbCB3aGVuICIKICAgICAgICAgICAgICJ0aGlzIG9wdGlvbiBpcyB1c2VkIG9uIHRoZW0uIikKCgpkZWYgb25seV9iaW5hcnkoKToKICAgIHJldHVybiBPcHRpb24oCiAgICAgICAgIi0tb25seS1iaW5hcnkiLCBkZXN0PSJmb3JtYXRfY29udHJvbCIsIGFjdGlvbj0iY2FsbGJhY2siLAogICAgICAgIGNhbGxiYWNrPV9oYW5kbGVfb25seV9iaW5hcnksIHR5cGU9InN0ciIsCiAgICAgICAgZGVmYXVsdD1Gb3JtYXRDb250cm9sKHNldCgpLCBzZXQoKSksCiAgICAgICAgaGVscD0iRG8gbm90IHVzZSBzb3VyY2UgcGFja2FnZXMuIENhbiBiZSBzdXBwbGllZCBtdWx0aXBsZSB0aW1lcywgYW5kICIKICAgICAgICAgICAgICJlYWNoIHRpbWUgYWRkcyB0byB0aGUgZXhpc3RpbmcgdmFsdWUuIEFjY2VwdHMgZWl0aGVyIDphbGw6IHRvICIKICAgICAgICAgICAgICJkaXNhYmxlIGFsbCBzb3VyY2UgcGFja2FnZXMsIDpub25lOiB0byBlbXB0eSB0aGUgc2V0LCBvciBvbmUgb3IgIgogICAgICAgICAgICAgIm1vcmUgcGFja2FnZSBuYW1lcyB3aXRoIGNvbW1hcyBiZXR3ZWVuIHRoZW0uIFBhY2thZ2VzIHdpdGhvdXQgIgogICAgICAgICAgICAgImJpbmFyeSBkaXN0cmlidXRpb25zIHdpbGwgZmFpbCB0byBpbnN0YWxsIHdoZW4gdGhpcyBvcHRpb24gaXMgIgogICAgICAgICAgICAgInVzZWQgb24gdGhlbS4iKQoKCmNhY2hlX2RpciA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAiLS1jYWNoZS1kaXIiLAogICAgZGVzdD0iY2FjaGVfZGlyIiwKICAgIGRlZmF1bHQ9VVNFUl9DQUNIRV9ESVIsCiAgICBtZXRhdmFyPSJkaXIiLAogICAgaGVscD0iU3RvcmUgdGhlIGNhY2hlIGRhdGEgaW4gPGRpcj4uIgopCgpub19jYWNoZSA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAiLS1uby1jYWNoZS1kaXIiLAogICAgZGVzdD0iY2FjaGVfZGlyIiwKICAgIGFjdGlvbj0ic3RvcmVfZmFsc2UiLAogICAgaGVscD0iRGlzYWJsZSB0aGUgY2FjaGUuIiwKKQoKbm9fZGVwcyA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAnLS1uby1kZXBzJywgJy0tbm8tZGVwZW5kZW5jaWVzJywKICAgIGRlc3Q9J2lnbm9yZV9kZXBlbmRlbmNpZXMnLAogICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgIGRlZmF1bHQ9RmFsc2UsCiAgICBoZWxwPSJEb24ndCBpbnN0YWxsIHBhY2thZ2UgZGVwZW5kZW5jaWVzLiIpCgpidWlsZF9kaXIgPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgJy1iJywgJy0tYnVpbGQnLCAnLS1idWlsZC1kaXInLCAnLS1idWlsZC1kaXJlY3RvcnknLAogICAgZGVzdD0nYnVpbGRfZGlyJywKICAgIG1ldGF2YXI9J2RpcicsCiAgICBoZWxwPSdEaXJlY3RvcnkgdG8gdW5wYWNrIHBhY2thZ2VzIGludG8gYW5kIGJ1aWxkIGluLicKKQoKaWdub3JlX3JlcXVpcmVzX3B5dGhvbiA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAnLS1pZ25vcmUtcmVxdWlyZXMtcHl0aG9uJywKICAgIGRlc3Q9J2lnbm9yZV9yZXF1aXJlc19weXRob24nLAogICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgIGhlbHA9J0lnbm9yZSB0aGUgUmVxdWlyZXMtUHl0aG9uIGluZm9ybWF0aW9uLicpCgppbnN0YWxsX29wdGlvbnMgPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgJy0taW5zdGFsbC1vcHRpb24nLAogICAgZGVzdD0naW5zdGFsbF9vcHRpb25zJywKICAgIGFjdGlvbj0nYXBwZW5kJywKICAgIG1ldGF2YXI9J29wdGlvbnMnLAogICAgaGVscD0iRXh0cmEgYXJndW1lbnRzIHRvIGJlIHN1cHBsaWVkIHRvIHRoZSBzZXR1cC5weSBpbnN0YWxsICIKICAgICAgICAgImNvbW1hbmQgKHVzZSBsaWtlIC0taW5zdGFsbC1vcHRpb249XCItLWluc3RhbGwtc2NyaXB0cz0vdXNyL2xvY2FsLyIKICAgICAgICAgImJpblwiKS4gVXNlIG11bHRpcGxlIC0taW5zdGFsbC1vcHRpb24gb3B0aW9ucyB0byBwYXNzIG11bHRpcGxlICIKICAgICAgICAgIm9wdGlvbnMgdG8gc2V0dXAucHkgaW5zdGFsbC4gSWYgeW91IGFyZSB1c2luZyBhbiBvcHRpb24gd2l0aCBhICIKICAgICAgICAgImRpcmVjdG9yeSBwYXRoLCBiZSBzdXJlIHRvIHVzZSBhYnNvbHV0ZSBwYXRoLiIpCgpnbG9iYWxfb3B0aW9ucyA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAnLS1nbG9iYWwtb3B0aW9uJywKICAgIGRlc3Q9J2dsb2JhbF9vcHRpb25zJywKICAgIGFjdGlvbj0nYXBwZW5kJywKICAgIG1ldGF2YXI9J29wdGlvbnMnLAogICAgaGVscD0iRXh0cmEgZ2xvYmFsIG9wdGlvbnMgdG8gYmUgc3VwcGxpZWQgdG8gdGhlIHNldHVwLnB5ICIKICAgICAgICAgImNhbGwgYmVmb3JlIHRoZSBpbnN0YWxsIGNvbW1hbmQuIikKCm5vX2NsZWFuID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICctLW5vLWNsZWFuJywKICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICBkZWZhdWx0PUZhbHNlLAogICAgaGVscD0iRG9uJ3QgY2xlYW4gdXAgYnVpbGQgZGlyZWN0b3JpZXMuIikKCnByZSA9IHBhcnRpYWwoCiAgICBPcHRpb24sCiAgICAnLS1wcmUnLAogICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgIGRlZmF1bHQ9RmFsc2UsCiAgICBoZWxwPSJJbmNsdWRlIHByZS1yZWxlYXNlIGFuZCBkZXZlbG9wbWVudCB2ZXJzaW9ucy4gQnkgZGVmYXVsdCwgIgogICAgICAgICAicGlwIG9ubHkgZmluZHMgc3RhYmxlIHZlcnNpb25zLiIpCgpkaXNhYmxlX3BpcF92ZXJzaW9uX2NoZWNrID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICItLWRpc2FibGUtcGlwLXZlcnNpb24tY2hlY2siLAogICAgZGVzdD0iZGlzYWJsZV9waXBfdmVyc2lvbl9jaGVjayIsCiAgICBhY3Rpb249InN0b3JlX3RydWUiLAogICAgZGVmYXVsdD1GYWxzZSwKICAgIGhlbHA9IkRvbid0IHBlcmlvZGljYWxseSBjaGVjayBQeVBJIHRvIGRldGVybWluZSB3aGV0aGVyIGEgbmV3IHZlcnNpb24gIgogICAgICAgICAib2YgcGlwIGlzIGF2YWlsYWJsZSBmb3IgZG93bmxvYWQuIEltcGxpZWQgd2l0aCAtLW5vLWluZGV4LiIpCgojIERlcHJlY2F0ZWQsIFJlbW92ZSBsYXRlcgphbHdheXNfdW56aXAgPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgJy1aJywgJy0tYWx3YXlzLXVuemlwJywKICAgIGRlc3Q9J2Fsd2F5c191bnppcCcsCiAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgaGVscD1TVVBQUkVTU19IRUxQLAopCgoKZGVmIF9tZXJnZV9oYXNoKG9wdGlvbiwgb3B0X3N0ciwgdmFsdWUsIHBhcnNlcik6CiAgICAiIiJHaXZlbiBhIHZhbHVlIHNwZWxsZWQgImFsZ286ZGlnZXN0IiwgYXBwZW5kIHRoZSBkaWdlc3QgdG8gYSBsaXN0CiAgICBwb2ludGVkIHRvIGluIGEgZGljdCBieSB0aGUgYWxnbyBuYW1lLiIiIgogICAgaWYgbm90IHBhcnNlci52YWx1ZXMuaGFzaGVzOgogICAgICAgIHBhcnNlci52YWx1ZXMuaGFzaGVzID0ge30KICAgIHRyeToKICAgICAgICBhbGdvLCBkaWdlc3QgPSB2YWx1ZS5zcGxpdCgnOicsIDEpCiAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICBwYXJzZXIuZXJyb3IoJ0FyZ3VtZW50cyB0byAlcyBtdXN0IGJlIGEgaGFzaCBuYW1lICcKICAgICAgICAgICAgICAgICAgICAgJ2ZvbGxvd2VkIGJ5IGEgdmFsdWUsIGxpa2UgLS1oYXNoPXNoYTI1NjphYmNkZS4uLicgJQogICAgICAgICAgICAgICAgICAgICBvcHRfc3RyKQogICAgaWYgYWxnbyBub3QgaW4gU1RST05HX0hBU0hFUzoKICAgICAgICBwYXJzZXIuZXJyb3IoJ0FsbG93ZWQgaGFzaCBhbGdvcml0aG1zIGZvciAlcyBhcmUgJXMuJyAlCiAgICAgICAgICAgICAgICAgICAgIChvcHRfc3RyLCAnLCAnLmpvaW4oU1RST05HX0hBU0hFUykpKQogICAgcGFyc2VyLnZhbHVlcy5oYXNoZXMuc2V0ZGVmYXVsdChhbGdvLCBbXSkuYXBwZW5kKGRpZ2VzdCkKCgpoYXNoID0gcGFydGlhbCgKICAgIE9wdGlvbiwKICAgICctLWhhc2gnLAogICAgIyBIYXNoIHZhbHVlcyBldmVudHVhbGx5IGVuZCB1cCBpbiBJbnN0YWxsUmVxdWlyZW1lbnQuaGFzaGVzIGR1ZSB0bwogICAgIyBfX2RpY3RfXyBjb3B5aW5nIGluIHByb2Nlc3NfbGluZSgpLgogICAgZGVzdD0naGFzaGVzJywKICAgIGFjdGlvbj0nY2FsbGJhY2snLAogICAgY2FsbGJhY2s9X21lcmdlX2hhc2gsCiAgICB0eXBlPSdzdHJpbmcnLAogICAgaGVscD0iVmVyaWZ5IHRoYXQgdGhlIHBhY2thZ2UncyBhcmNoaXZlIG1hdGNoZXMgdGhpcyAiCiAgICAgICAgICdoYXNoIGJlZm9yZSBpbnN0YWxsaW5nLiBFeGFtcGxlOiAtLWhhc2g9c2hhMjU2OmFiY2RlZi4uLicpCgoKcmVxdWlyZV9oYXNoZXMgPSBwYXJ0aWFsKAogICAgT3B0aW9uLAogICAgJy0tcmVxdWlyZS1oYXNoZXMnLAogICAgZGVzdD0ncmVxdWlyZV9oYXNoZXMnLAogICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgIGRlZmF1bHQ9RmFsc2UsCiAgICBoZWxwPSdSZXF1aXJlIGEgaGFzaCB0byBjaGVjayBlYWNoIHJlcXVpcmVtZW50IGFnYWluc3QsIGZvciAnCiAgICAgICAgICdyZXBlYXRhYmxlIGluc3RhbGxzLiBUaGlzIG9wdGlvbiBpcyBpbXBsaWVkIHdoZW4gYW55IHBhY2thZ2UgaW4gYSAnCiAgICAgICAgICdyZXF1aXJlbWVudHMgZmlsZSBoYXMgYSAtLWhhc2ggb3B0aW9uLicpCgoKIyMjIyMjIyMjIwojIGdyb3VwcyAjCiMjIyMjIyMjIyMKCmdlbmVyYWxfZ3JvdXAgPSB7CiAgICAnbmFtZSc6ICdHZW5lcmFsIE9wdGlvbnMnLAogICAgJ29wdGlvbnMnOiBbCiAgICAgICAgaGVscF8sCiAgICAgICAgaXNvbGF0ZWRfbW9kZSwKICAgICAgICByZXF1aXJlX3ZpcnR1YWxlbnYsCiAgICAgICAgdmVyYm9zZSwKICAgICAgICB2ZXJzaW9uLAogICAgICAgIHF1aWV0LAogICAgICAgIGxvZywKICAgICAgICBub19pbnB1dCwKICAgICAgICBwcm94eSwKICAgICAgICByZXRyaWVzLAogICAgICAgIHRpbWVvdXQsCiAgICAgICAgZGVmYXVsdF92Y3MsCiAgICAgICAgc2tpcF9yZXF1aXJlbWVudHNfcmVnZXgsCiAgICAgICAgZXhpc3RzX2FjdGlvbiwKICAgICAgICB0cnVzdGVkX2hvc3QsCiAgICAgICAgY2VydCwKICAgICAgICBjbGllbnRfY2VydCwKICAgICAgICBjYWNoZV9kaXIsCiAgICAgICAgbm9fY2FjaGUsCiAgICAgICAgZGlzYWJsZV9waXBfdmVyc2lvbl9jaGVjaywKICAgIF0KfQoKbm9uX2RlcHJlY2F0ZWRfaW5kZXhfZ3JvdXAgPSB7CiAgICAnbmFtZSc6ICdQYWNrYWdlIEluZGV4IE9wdGlvbnMnLAogICAgJ29wdGlvbnMnOiBbCiAgICAgICAgaW5kZXhfdXJsLAogICAgICAgIGV4dHJhX2luZGV4X3VybCwKICAgICAgICBub19pbmRleCwKICAgICAgICBmaW5kX2xpbmtzLAogICAgICAgIHByb2Nlc3NfZGVwZW5kZW5jeV9saW5rcywKICAgIF0KfQoKaW5kZXhfZ3JvdXAgPSB7CiAgICAnbmFtZSc6ICdQYWNrYWdlIEluZGV4IE9wdGlvbnMgKGluY2x1ZGluZyBkZXByZWNhdGVkIG9wdGlvbnMpJywKICAgICdvcHRpb25zJzogbm9uX2RlcHJlY2F0ZWRfaW5kZXhfZ3JvdXBbJ29wdGlvbnMnXSArIFsKICAgICAgICBhbGxvd19leHRlcm5hbCwKICAgICAgICBhbGxvd19hbGxfZXh0ZXJuYWwsCiAgICAgICAgbm9fYWxsb3dfZXh0ZXJuYWwsCiAgICAgICAgYWxsb3dfdW5zYWZlLAogICAgICAgIG5vX2FsbG93X3Vuc2FmZSwKICAgIF0KfQpQSwMEFAAAAAAAAAAhAJANh0PECAAAxAgAACgAAABweXBpX19waXBfOV8wXzMvcGlwL2NvbW1hbmRzL19faW5pdF9fLnB5IiIiClBhY2thZ2UgY29udGFpbmluZyBhbGwgcGlwIGNvbW1hbmRzCiIiIgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKZnJvbSBwaXAuY29tbWFuZHMuY29tcGxldGlvbiBpbXBvcnQgQ29tcGxldGlvbkNvbW1hbmQKZnJvbSBwaXAuY29tbWFuZHMuZG93bmxvYWQgaW1wb3J0IERvd25sb2FkQ29tbWFuZApmcm9tIHBpcC5jb21tYW5kcy5mcmVlemUgaW1wb3J0IEZyZWV6ZUNvbW1hbmQKZnJvbSBwaXAuY29tbWFuZHMuaGFzaCBpbXBvcnQgSGFzaENvbW1hbmQKZnJvbSBwaXAuY29tbWFuZHMuaGVscCBpbXBvcnQgSGVscENvbW1hbmQKZnJvbSBwaXAuY29tbWFuZHMubGlzdCBpbXBvcnQgTGlzdENvbW1hbmQKZnJvbSBwaXAuY29tbWFuZHMuY2hlY2sgaW1wb3J0IENoZWNrQ29tbWFuZApmcm9tIHBpcC5jb21tYW5kcy5zZWFyY2ggaW1wb3J0IFNlYXJjaENvbW1hbmQKZnJvbSBwaXAuY29tbWFuZHMuc2hvdyBpbXBvcnQgU2hvd0NvbW1hbmQKZnJvbSBwaXAuY29tbWFuZHMuaW5zdGFsbCBpbXBvcnQgSW5zdGFsbENvbW1hbmQKZnJvbSBwaXAuY29tbWFuZHMudW5pbnN0YWxsIGltcG9ydCBVbmluc3RhbGxDb21tYW5kCmZyb20gcGlwLmNvbW1hbmRzLndoZWVsIGltcG9ydCBXaGVlbENvbW1hbmQKCgpjb21tYW5kc19kaWN0ID0gewogICAgQ29tcGxldGlvbkNvbW1hbmQubmFtZTogQ29tcGxldGlvbkNvbW1hbmQsCiAgICBGcmVlemVDb21tYW5kLm5hbWU6IEZyZWV6ZUNvbW1hbmQsCiAgICBIYXNoQ29tbWFuZC5uYW1lOiBIYXNoQ29tbWFuZCwKICAgIEhlbHBDb21tYW5kLm5hbWU6IEhlbHBDb21tYW5kLAogICAgU2VhcmNoQ29tbWFuZC5uYW1lOiBTZWFyY2hDb21tYW5kLAogICAgU2hvd0NvbW1hbmQubmFtZTogU2hvd0NvbW1hbmQsCiAgICBJbnN0YWxsQ29tbWFuZC5uYW1lOiBJbnN0YWxsQ29tbWFuZCwKICAgIFVuaW5zdGFsbENvbW1hbmQubmFtZTogVW5pbnN0YWxsQ29tbWFuZCwKICAgIERvd25sb2FkQ29tbWFuZC5uYW1lOiBEb3dubG9hZENvbW1hbmQsCiAgICBMaXN0Q29tbWFuZC5uYW1lOiBMaXN0Q29tbWFuZCwKICAgIENoZWNrQ29tbWFuZC5uYW1lOiBDaGVja0NvbW1hbmQsCiAgICBXaGVlbENvbW1hbmQubmFtZTogV2hlZWxDb21tYW5kLAp9CgoKY29tbWFuZHNfb3JkZXIgPSBbCiAgICBJbnN0YWxsQ29tbWFuZCwKICAgIERvd25sb2FkQ29tbWFuZCwKICAgIFVuaW5zdGFsbENvbW1hbmQsCiAgICBGcmVlemVDb21tYW5kLAogICAgTGlzdENvbW1hbmQsCiAgICBTaG93Q29tbWFuZCwKICAgIENoZWNrQ29tbWFuZCwKICAgIFNlYXJjaENvbW1hbmQsCiAgICBXaGVlbENvbW1hbmQsCiAgICBIYXNoQ29tbWFuZCwKICAgIENvbXBsZXRpb25Db21tYW5kLAogICAgSGVscENvbW1hbmQsCl0KCgpkZWYgZ2V0X3N1bW1hcmllcyhvcmRlcmVkPVRydWUpOgogICAgIiIiWWllbGRzIHNvcnRlZCAoY29tbWFuZCBuYW1lLCBjb21tYW5kIHN1bW1hcnkpIHR1cGxlcy4iIiIKCiAgICBpZiBvcmRlcmVkOgogICAgICAgIGNtZGl0ZW1zID0gX3NvcnRfY29tbWFuZHMoY29tbWFuZHNfZGljdCwgY29tbWFuZHNfb3JkZXIpCiAgICBlbHNlOgogICAgICAgIGNtZGl0ZW1zID0gY29tbWFuZHNfZGljdC5pdGVtcygpCgogICAgZm9yIG5hbWUsIGNvbW1hbmRfY2xhc3MgaW4gY21kaXRlbXM6CiAgICAgICAgeWllbGQgKG5hbWUsIGNvbW1hbmRfY2xhc3Muc3VtbWFyeSkKCgpkZWYgZ2V0X3NpbWlsYXJfY29tbWFuZHMobmFtZSk6CiAgICAiIiJDb21tYW5kIG5hbWUgYXV0by1jb3JyZWN0LiIiIgogICAgZnJvbSBkaWZmbGliIGltcG9ydCBnZXRfY2xvc2VfbWF0Y2hlcwoKICAgIG5hbWUgPSBuYW1lLmxvd2VyKCkKCiAgICBjbG9zZV9jb21tYW5kcyA9IGdldF9jbG9zZV9tYXRjaGVzKG5hbWUsIGNvbW1hbmRzX2RpY3Qua2V5cygpKQoKICAgIGlmIGNsb3NlX2NvbW1hbmRzOgogICAgICAgIHJldHVybiBjbG9zZV9jb21tYW5kc1swXQogICAgZWxzZToKICAgICAgICByZXR1cm4gRmFsc2UKCgpkZWYgX3NvcnRfY29tbWFuZHMoY21kZGljdCwgb3JkZXIpOgogICAgZGVmIGtleWZuKGtleSk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gb3JkZXIuaW5kZXgoa2V5WzFdKQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICAjIHVub3JkZXJlZCBpdGVtcyBzaG91bGQgY29tZSBsYXN0CiAgICAgICAgICAgIHJldHVybiAweGZmCgogICAgcmV0dXJuIHNvcnRlZChjbWRkaWN0Lml0ZW1zKCksIGtleT1rZXlmbikKUEsDBBQAAAAAAAAAIQAdYTtfZgUAAGYFAAAlAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9jb21tYW5kcy9jaGVjay5weWltcG9ydCBsb2dnaW5nCgpmcm9tIHBpcC5iYXNlY29tbWFuZCBpbXBvcnQgQ29tbWFuZApmcm9tIHBpcC5vcGVyYXRpb25zLmNoZWNrIGltcG9ydCBjaGVja19yZXF1aXJlbWVudHMKZnJvbSBwaXAudXRpbHMgaW1wb3J0IGdldF9pbnN0YWxsZWRfZGlzdHJpYnV0aW9ucwoKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmNsYXNzIENoZWNrQ29tbWFuZChDb21tYW5kKToKICAgICIiIlZlcmlmeSBpbnN0YWxsZWQgcGFja2FnZXMgaGF2ZSBjb21wYXRpYmxlIGRlcGVuZGVuY2llcy4iIiIKICAgIG5hbWUgPSAnY2hlY2snCiAgICB1c2FnZSA9ICIiIgogICAgICAlcHJvZyBbb3B0aW9uc10iIiIKICAgIHN1bW1hcnkgPSAnVmVyaWZ5IGluc3RhbGxlZCBwYWNrYWdlcyBoYXZlIGNvbXBhdGlibGUgZGVwZW5kZW5jaWVzLicKCiAgICBkZWYgcnVuKHNlbGYsIG9wdGlvbnMsIGFyZ3MpOgogICAgICAgIGRpc3RzID0gZ2V0X2luc3RhbGxlZF9kaXN0cmlidXRpb25zKGxvY2FsX29ubHk9RmFsc2UsIHNraXA9KCkpCiAgICAgICAgbWlzc2luZ19yZXFzX2RpY3QsIGluY29tcGF0aWJsZV9yZXFzX2RpY3QgPSBjaGVja19yZXF1aXJlbWVudHMoZGlzdHMpCgogICAgICAgIGZvciBkaXN0IGluIGRpc3RzOgogICAgICAgICAgICBrZXkgPSAnJXM9PSVzJyAlIChkaXN0LnByb2plY3RfbmFtZSwgZGlzdC52ZXJzaW9uKQoKICAgICAgICAgICAgZm9yIHJlcXVpcmVtZW50IGluIG1pc3NpbmdfcmVxc19kaWN0LmdldChrZXksIFtdKToKICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgICAgICIlcyAlcyByZXF1aXJlcyAlcywgd2hpY2ggaXMgbm90IGluc3RhbGxlZC4iLAogICAgICAgICAgICAgICAgICAgIGRpc3QucHJvamVjdF9uYW1lLCBkaXN0LnZlcnNpb24sIHJlcXVpcmVtZW50LnByb2plY3RfbmFtZSkKCiAgICAgICAgICAgIGZvciByZXF1aXJlbWVudCwgYWN0dWFsIGluIGluY29tcGF0aWJsZV9yZXFzX2RpY3QuZ2V0KGtleSwgW10pOgogICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAgICAgIiVzICVzIGhhcyByZXF1aXJlbWVudCAlcywgYnV0IHlvdSBoYXZlICVzICVzLiIsCiAgICAgICAgICAgICAgICAgICAgZGlzdC5wcm9qZWN0X25hbWUsIGRpc3QudmVyc2lvbiwgcmVxdWlyZW1lbnQsCiAgICAgICAgICAgICAgICAgICAgYWN0dWFsLnByb2plY3RfbmFtZSwgYWN0dWFsLnZlcnNpb24pCgogICAgICAgIGlmIG1pc3NpbmdfcmVxc19kaWN0IG9yIGluY29tcGF0aWJsZV9yZXFzX2RpY3Q6CiAgICAgICAgICAgIHJldHVybiAxCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbG9nZ2VyLmluZm8oIk5vIGJyb2tlbiByZXF1aXJlbWVudHMgZm91bmQuIikKUEsDBBQAAAAAAAAAIQAwwcyzlQkAAJUJAAAqAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9jb21tYW5kcy9jb21wbGV0aW9uLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBzeXMKZnJvbSBwaXAuYmFzZWNvbW1hbmQgaW1wb3J0IENvbW1hbmQKCkJBU0VfQ09NUExFVElPTiA9ICIiIgojIHBpcCAlKHNoZWxsKXMgY29tcGxldGlvbiBzdGFydCUoc2NyaXB0KXMjIHBpcCAlKHNoZWxsKXMgY29tcGxldGlvbiBlbmQKIiIiCgpDT01QTEVUSU9OX1NDUklQVFMgPSB7CiAgICAnYmFzaCc6ICIiIgpfcGlwX2NvbXBsZXRpb24oKQp7CiAgICBDT01QUkVQTFk9KCAkKCBDT01QX1dPUkRTPSIke0NPTVBfV09SRFNbKl19IiBcXAogICAgICAgICAgICAgICAgICAgQ09NUF9DV09SRD0kQ09NUF9DV09SRCBcXAogICAgICAgICAgICAgICAgICAgUElQX0FVVE9fQ09NUExFVEU9MSAkMSApICkKfQpjb21wbGV0ZSAtbyBkZWZhdWx0IC1GIF9waXBfY29tcGxldGlvbiBwaXAKIiIiLCAnenNoJzogIiIiCmZ1bmN0aW9uIF9waXBfY29tcGxldGlvbiB7CiAgbG9jYWwgd29yZHMgY3dvcmQKICByZWFkIC1BYyB3b3JkcwogIHJlYWQgLWNuIGN3b3JkCiAgcmVwbHk9KCAkKCBDT01QX1dPUkRTPSIkd29yZHNbKl0iIFxcCiAgICAgICAgICAgICBDT01QX0NXT1JEPSQoKCBjd29yZC0xICkpIFxcCiAgICAgICAgICAgICBQSVBfQVVUT19DT01QTEVURT0xICR3b3Jkc1sxXSApICkKfQpjb21wY3RsIC1LIF9waXBfY29tcGxldGlvbiBwaXAKIiIiLCAnZmlzaCc6ICIiIgpmdW5jdGlvbiBfX2Zpc2hfY29tcGxldGVfcGlwCiAgICBzZXQgLWx4IENPTVBfV09SRFMgKGNvbW1hbmRsaW5lIC1vKSAiIgogICAgc2V0IC1seCBDT01QX0NXT1JEIChtYXRoIChjb250YWlucyAtaSAtLSAoY29tbWFuZGxpbmUgLXQpICRDT01QX1dPUkRTKS0xKQogICAgc2V0IC1seCBQSVBfQVVUT19DT01QTEVURSAxCiAgICBzdHJpbmcgc3BsaXQgXCAgLS0gKGV2YWwgJENPTVBfV09SRFNbMV0pCmVuZApjb21wbGV0ZSAtZmEgIihfX2Zpc2hfY29tcGxldGVfcGlwKSIgLWMgcGlwCiIiIn0KCgpjbGFzcyBDb21wbGV0aW9uQ29tbWFuZChDb21tYW5kKToKICAgICIiIkEgaGVscGVyIGNvbW1hbmQgdG8gYmUgdXNlZCBmb3IgY29tbWFuZCBjb21wbGV0aW9uLiIiIgogICAgbmFtZSA9ICdjb21wbGV0aW9uJwogICAgc3VtbWFyeSA9ICdBIGhlbHBlciBjb21tYW5kIHVzZWQgZm9yIGNvbW1hbmQgY29tcGxldGlvbi4nCgogICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3KToKICAgICAgICBzdXBlcihDb21wbGV0aW9uQ29tbWFuZCwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3cpCgogICAgICAgIGNtZF9vcHRzID0gc2VsZi5jbWRfb3B0cwoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLS1iYXNoJywgJy1iJywKICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV9jb25zdCcsCiAgICAgICAgICAgIGNvbnN0PSdiYXNoJywKICAgICAgICAgICAgZGVzdD0nc2hlbGwnLAogICAgICAgICAgICBoZWxwPSdFbWl0IGNvbXBsZXRpb24gY29kZSBmb3IgYmFzaCcpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy0tenNoJywgJy16JywKICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV9jb25zdCcsCiAgICAgICAgICAgIGNvbnN0PSd6c2gnLAogICAgICAgICAgICBkZXN0PSdzaGVsbCcsCiAgICAgICAgICAgIGhlbHA9J0VtaXQgY29tcGxldGlvbiBjb2RlIGZvciB6c2gnKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctLWZpc2gnLCAnLWYnLAogICAgICAgICAgICBhY3Rpb249J3N0b3JlX2NvbnN0JywKICAgICAgICAgICAgY29uc3Q9J2Zpc2gnLAogICAgICAgICAgICBkZXN0PSdzaGVsbCcsCiAgICAgICAgICAgIGhlbHA9J0VtaXQgY29tcGxldGlvbiBjb2RlIGZvciBmaXNoJykKCiAgICAgICAgc2VsZi5wYXJzZXIuaW5zZXJ0X29wdGlvbl9ncm91cCgwLCBjbWRfb3B0cykKCiAgICBkZWYgcnVuKHNlbGYsIG9wdGlvbnMsIGFyZ3MpOgogICAgICAgICIiIlByaW50cyB0aGUgY29tcGxldGlvbiBjb2RlIG9mIHRoZSBnaXZlbiBzaGVsbCIiIgogICAgICAgIHNoZWxscyA9IENPTVBMRVRJT05fU0NSSVBUUy5rZXlzKCkKICAgICAgICBzaGVsbF9vcHRpb25zID0gWyctLScgKyBzaGVsbCBmb3Igc2hlbGwgaW4gc29ydGVkKHNoZWxscyldCiAgICAgICAgaWYgb3B0aW9ucy5zaGVsbCBpbiBzaGVsbHM6CiAgICAgICAgICAgIHNjcmlwdCA9IENPTVBMRVRJT05fU0NSSVBUUy5nZXQob3B0aW9ucy5zaGVsbCwgJycpCiAgICAgICAgICAgIHByaW50KEJBU0VfQ09NUExFVElPTiAlIHsnc2NyaXB0Jzogc2NyaXB0LCAnc2hlbGwnOiBvcHRpb25zLnNoZWxsfSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKAogICAgICAgICAgICAgICAgJ0VSUk9SOiBZb3UgbXVzdCBwYXNzICVzXG4nICUgJyBvciAnLmpvaW4oc2hlbGxfb3B0aW9ucykKICAgICAgICAgICAgKQpQSwMEFAAAAAAAAAAhANkemaaCHgAAgh4AACgAAABweXBpX19waXBfOV8wXzMvcGlwL2NvbW1hbmRzL2Rvd25sb2FkLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBsb2dnaW5nCmltcG9ydCBvcwoKZnJvbSBwaXAuZXhjZXB0aW9ucyBpbXBvcnQgQ29tbWFuZEVycm9yCmZyb20gcGlwLmluZGV4IGltcG9ydCBGb3JtYXRDb250cm9sCmZyb20gcGlwLnJlcSBpbXBvcnQgUmVxdWlyZW1lbnRTZXQKZnJvbSBwaXAuYmFzZWNvbW1hbmQgaW1wb3J0IFJlcXVpcmVtZW50Q29tbWFuZApmcm9tIHBpcCBpbXBvcnQgY21kb3B0aW9ucwpmcm9tIHBpcC51dGlscyBpbXBvcnQgZW5zdXJlX2Rpciwgbm9ybWFsaXplX3BhdGgKZnJvbSBwaXAudXRpbHMuYnVpbGQgaW1wb3J0IEJ1aWxkRGlyZWN0b3J5CmZyb20gcGlwLnV0aWxzLmZpbGVzeXN0ZW0gaW1wb3J0IGNoZWNrX3BhdGhfb3duZXIKCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgpjbGFzcyBEb3dubG9hZENvbW1hbmQoUmVxdWlyZW1lbnRDb21tYW5kKToKICAgICIiIgogICAgRG93bmxvYWQgcGFja2FnZXMgZnJvbToKCiAgICAtIFB5UEkgKGFuZCBvdGhlciBpbmRleGVzKSB1c2luZyByZXF1aXJlbWVudCBzcGVjaWZpZXJzLgogICAgLSBWQ1MgcHJvamVjdCB1cmxzLgogICAgLSBMb2NhbCBwcm9qZWN0IGRpcmVjdG9yaWVzLgogICAgLSBMb2NhbCBvciByZW1vdGUgc291cmNlIGFyY2hpdmVzLgoKICAgIHBpcCBhbHNvIHN1cHBvcnRzIGRvd25sb2FkaW5nIGZyb20gInJlcXVpcmVtZW50cyBmaWxlcyIsIHdoaWNoIHByb3ZpZGUKICAgIGFuIGVhc3kgd2F5IHRvIHNwZWNpZnkgYSB3aG9sZSBlbnZpcm9ubWVudCB0byBiZSBkb3dubG9hZGVkLgogICAgIiIiCiAgICBuYW1lID0gJ2Rvd25sb2FkJwoKICAgIHVzYWdlID0gIiIiCiAgICAgICVwcm9nIFtvcHRpb25zXSA8cmVxdWlyZW1lbnQgc3BlY2lmaWVyPiBbcGFja2FnZS1pbmRleC1vcHRpb25zXSAuLi4KICAgICAgJXByb2cgW29wdGlvbnNdIC1yIDxyZXF1aXJlbWVudHMgZmlsZT4gW3BhY2thZ2UtaW5kZXgtb3B0aW9uc10gLi4uCiAgICAgICVwcm9nIFtvcHRpb25zXSBbLWVdIDx2Y3MgcHJvamVjdCB1cmw+IC4uLgogICAgICAlcHJvZyBbb3B0aW9uc10gWy1lXSA8bG9jYWwgcHJvamVjdCBwYXRoPiAuLi4KICAgICAgJXByb2cgW29wdGlvbnNdIDxhcmNoaXZlIHVybC9wYXRoPiAuLi4iIiIKCiAgICBzdW1tYXJ5ID0gJ0Rvd25sb2FkIHBhY2thZ2VzLicKCiAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3cpOgogICAgICAgIHN1cGVyKERvd25sb2FkQ29tbWFuZCwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3cpCgogICAgICAgIGNtZF9vcHRzID0gc2VsZi5jbWRfb3B0cwoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMuY29uc3RyYWludHMoKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMuZWRpdGFibGUoKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMucmVxdWlyZW1lbnRzKCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLmJ1aWxkX2RpcigpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5ub19kZXBzKCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLmdsb2JhbF9vcHRpb25zKCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLm5vX2JpbmFyeSgpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5vbmx5X2JpbmFyeSgpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5zcmMoKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMucHJlKCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLm5vX2NsZWFuKCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLnJlcXVpcmVfaGFzaGVzKCkpCgogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctZCcsICctLWRlc3QnLCAnLS1kZXN0aW5hdGlvbi1kaXInLCAnLS1kZXN0aW5hdGlvbi1kaXJlY3RvcnknLAogICAgICAgICAgICBkZXN0PSdkb3dubG9hZF9kaXInLAogICAgICAgICAgICBtZXRhdmFyPSdkaXInLAogICAgICAgICAgICBkZWZhdWx0PW9zLmN1cmRpciwKICAgICAgICAgICAgaGVscD0oIkRvd25sb2FkIHBhY2thZ2VzIGludG8gPGRpcj4uIiksCiAgICAgICAgKQoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLS1wbGF0Zm9ybScsCiAgICAgICAgICAgIGRlc3Q9J3BsYXRmb3JtJywKICAgICAgICAgICAgbWV0YXZhcj0ncGxhdGZvcm0nLAogICAgICAgICAgICBkZWZhdWx0PU5vbmUsCiAgICAgICAgICAgIGhlbHA9KCJPbmx5IGRvd25sb2FkIHdoZWVscyBjb21wYXRpYmxlIHdpdGggPHBsYXRmb3JtPi4gIgogICAgICAgICAgICAgICAgICAiRGVmYXVsdHMgdG8gdGhlIHBsYXRmb3JtIG9mIHRoZSBydW5uaW5nIHN5c3RlbS4iKSwKICAgICAgICApCgogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctLXB5dGhvbi12ZXJzaW9uJywKICAgICAgICAgICAgZGVzdD0ncHl0aG9uX3ZlcnNpb24nLAogICAgICAgICAgICBtZXRhdmFyPSdweXRob25fdmVyc2lvbicsCiAgICAgICAgICAgIGRlZmF1bHQ9Tm9uZSwKICAgICAgICAgICAgaGVscD0oIk9ubHkgZG93bmxvYWQgd2hlZWxzIGNvbXBhdGlibGUgd2l0aCBQeXRob24gIgogICAgICAgICAgICAgICAgICAiaW50ZXJwcmV0ZXIgdmVyc2lvbiA8dmVyc2lvbj4uIElmIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGhlICIKICAgICAgICAgICAgICAgICAgImN1cnJlbnQgc3lzdGVtIGludGVycHJldGVyIG1pbm9yIHZlcnNpb24gaXMgdXNlZC4gQSBtYWpvciAiCiAgICAgICAgICAgICAgICAgICJ2ZXJzaW9uIChlLmcuICcyJykgY2FuIGJlIHNwZWNpZmllZCB0byBtYXRjaCBhbGwgIgogICAgICAgICAgICAgICAgICAibWlub3IgcmV2cyBvZiB0aGF0IG1ham9yIHZlcnNpb24uICBBIG1pbm9yIHZlcnNpb24gIgogICAgICAgICAgICAgICAgICAiKGUuZy4gJzM0JykgY2FuIGFsc28gYmUgc3BlY2lmaWVkLiIpLAogICAgICAgICkKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy0taW1wbGVtZW50YXRpb24nLAogICAgICAgICAgICBkZXN0PSdpbXBsZW1lbnRhdGlvbicsCiAgICAgICAgICAgIG1ldGF2YXI9J2ltcGxlbWVudGF0aW9uJywKICAgICAgICAgICAgZGVmYXVsdD1Ob25lLAogICAgICAgICAgICBoZWxwPSgiT25seSBkb3dubG9hZCB3aGVlbHMgY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAiCiAgICAgICAgICAgICAgICAgICJpbXBsZW1lbnRhdGlvbiA8aW1wbGVtZW50YXRpb24+LCBlLmcuICdwcCcsICdqeScsICdjcCcsICIKICAgICAgICAgICAgICAgICAgIiBvciAnaXAnLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGVuIHRoZSBjdXJyZW50ICIKICAgICAgICAgICAgICAgICAgImludGVycHJldGVyIGltcGxlbWVudGF0aW9uIGlzIHVzZWQuICBVc2UgJ3B5JyB0byBmb3JjZSAiCiAgICAgICAgICAgICAgICAgICJpbXBsZW1lbnRhdGlvbi1hZ25vc3RpYyB3aGVlbHMuIiksCiAgICAgICAgKQoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLS1hYmknLAogICAgICAgICAgICBkZXN0PSdhYmknLAogICAgICAgICAgICBtZXRhdmFyPSdhYmknLAogICAgICAgICAgICBkZWZhdWx0PU5vbmUsCiAgICAgICAgICAgIGhlbHA9KCJPbmx5IGRvd25sb2FkIHdoZWVscyBjb21wYXRpYmxlIHdpdGggUHl0aG9uICIKICAgICAgICAgICAgICAgICAgImFiaSA8YWJpPiwgZS5nLiAncHlweV80MScuICBJZiBub3Qgc3BlY2lmaWVkLCB0aGVuIHRoZSAiCiAgICAgICAgICAgICAgICAgICJjdXJyZW50IGludGVycHJldGVyIGFiaSB0YWcgaXMgdXNlZC4gIEdlbmVyYWxseSAiCiAgICAgICAgICAgICAgICAgICJ5b3Ugd2lsbCBuZWVkIHRvIHNwZWNpZnkgLS1pbXBsZW1lbnRhdGlvbiwgIgogICAgICAgICAgICAgICAgICAiLS1wbGF0Zm9ybSwgYW5kIC0tcHl0aG9uLXZlcnNpb24gd2hlbiB1c2luZyAiCiAgICAgICAgICAgICAgICAgICJ0aGlzIG9wdGlvbi4iKSwKICAgICAgICApCgogICAgICAgIGluZGV4X29wdHMgPSBjbWRvcHRpb25zLm1ha2Vfb3B0aW9uX2dyb3VwKAogICAgICAgICAgICBjbWRvcHRpb25zLm5vbl9kZXByZWNhdGVkX2luZGV4X2dyb3VwLAogICAgICAgICAgICBzZWxmLnBhcnNlciwKICAgICAgICApCgogICAgICAgIHNlbGYucGFyc2VyLmluc2VydF9vcHRpb25fZ3JvdXAoMCwgaW5kZXhfb3B0cykKICAgICAgICBzZWxmLnBhcnNlci5pbnNlcnRfb3B0aW9uX2dyb3VwKDAsIGNtZF9vcHRzKQoKICAgIGRlZiBydW4oc2VsZiwgb3B0aW9ucywgYXJncyk6CiAgICAgICAgb3B0aW9ucy5pZ25vcmVfaW5zdGFsbGVkID0gVHJ1ZQoKICAgICAgICBpZiBvcHRpb25zLnB5dGhvbl92ZXJzaW9uOgogICAgICAgICAgICBweXRob25fdmVyc2lvbnMgPSBbb3B0aW9ucy5weXRob25fdmVyc2lvbl0KICAgICAgICBlbHNlOgogICAgICAgICAgICBweXRob25fdmVyc2lvbnMgPSBOb25lCgogICAgICAgIGRpc3RfcmVzdHJpY3Rpb25fc2V0ID0gYW55KFsKICAgICAgICAgICAgb3B0aW9ucy5weXRob25fdmVyc2lvbiwKICAgICAgICAgICAgb3B0aW9ucy5wbGF0Zm9ybSwKICAgICAgICAgICAgb3B0aW9ucy5hYmksCiAgICAgICAgICAgIG9wdGlvbnMuaW1wbGVtZW50YXRpb24sCiAgICAgICAgXSkKICAgICAgICBiaW5hcnlfb25seSA9IEZvcm1hdENvbnRyb2woc2V0KCksIHNldChbJzphbGw6J10pKQogICAgICAgIGlmIGRpc3RfcmVzdHJpY3Rpb25fc2V0IGFuZCBvcHRpb25zLmZvcm1hdF9jb250cm9sICE9IGJpbmFyeV9vbmx5OgogICAgICAgICAgICByYWlzZSBDb21tYW5kRXJyb3IoCiAgICAgICAgICAgICAgICAiLS1vbmx5LWJpbmFyeT06YWxsOiBtdXN0IGJlIHNldCBhbmQgLS1uby1iaW5hcnkgbXVzdCBub3QgIgogICAgICAgICAgICAgICAgImJlIHNldCAob3IgbXVzdCBiZSBzZXQgdG8gOm5vbmU6KSB3aGVuIHJlc3RyaWN0aW5nIHBsYXRmb3JtICIKICAgICAgICAgICAgICAgICJhbmQgaW50ZXJwcmV0ZXIgY29uc3RyYWludHMgdXNpbmcgLS1weXRob24tdmVyc2lvbiwgIgogICAgICAgICAgICAgICAgIi0tcGxhdGZvcm0sIC0tYWJpLCBvciAtLWltcGxlbWVudGF0aW9uLiIKICAgICAgICAgICAgKQoKICAgICAgICBvcHRpb25zLnNyY19kaXIgPSBvcy5wYXRoLmFic3BhdGgob3B0aW9ucy5zcmNfZGlyKQogICAgICAgIG9wdGlvbnMuZG93bmxvYWRfZGlyID0gbm9ybWFsaXplX3BhdGgob3B0aW9ucy5kb3dubG9hZF9kaXIpCgogICAgICAgIGVuc3VyZV9kaXIob3B0aW9ucy5kb3dubG9hZF9kaXIpCgogICAgICAgIHdpdGggc2VsZi5fYnVpbGRfc2Vzc2lvbihvcHRpb25zKSBhcyBzZXNzaW9uOgogICAgICAgICAgICBmaW5kZXIgPSBzZWxmLl9idWlsZF9wYWNrYWdlX2ZpbmRlcigKICAgICAgICAgICAgICAgIG9wdGlvbnM9b3B0aW9ucywKICAgICAgICAgICAgICAgIHNlc3Npb249c2Vzc2lvbiwKICAgICAgICAgICAgICAgIHBsYXRmb3JtPW9wdGlvbnMucGxhdGZvcm0sCiAgICAgICAgICAgICAgICBweXRob25fdmVyc2lvbnM9cHl0aG9uX3ZlcnNpb25zLAogICAgICAgICAgICAgICAgYWJpPW9wdGlvbnMuYWJpLAogICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb249b3B0aW9ucy5pbXBsZW1lbnRhdGlvbiwKICAgICAgICAgICAgKQogICAgICAgICAgICBidWlsZF9kZWxldGUgPSAobm90IChvcHRpb25zLm5vX2NsZWFuIG9yIG9wdGlvbnMuYnVpbGRfZGlyKSkKICAgICAgICAgICAgaWYgb3B0aW9ucy5jYWNoZV9kaXIgYW5kIG5vdCBjaGVja19wYXRoX293bmVyKG9wdGlvbnMuY2FjaGVfZGlyKToKICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgICAgICJUaGUgZGlyZWN0b3J5ICclcycgb3IgaXRzIHBhcmVudCBkaXJlY3RvcnkgaXMgbm90IG93bmVkICIKICAgICAgICAgICAgICAgICAgICAiYnkgdGhlIGN1cnJlbnQgdXNlciBhbmQgY2FjaGluZyB3aGVlbHMgaGFzIGJlZW4gIgogICAgICAgICAgICAgICAgICAgICJkaXNhYmxlZC4gY2hlY2sgdGhlIHBlcm1pc3Npb25zIGFuZCBvd25lciBvZiB0aGF0ICIKICAgICAgICAgICAgICAgICAgICAiZGlyZWN0b3J5LiBJZiBleGVjdXRpbmcgcGlwIHdpdGggc3VkbywgeW91IG1heSB3YW50ICIKICAgICAgICAgICAgICAgICAgICAic3VkbydzIC1IIGZsYWcuIiwKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmNhY2hlX2RpciwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIG9wdGlvbnMuY2FjaGVfZGlyID0gTm9uZQoKICAgICAgICAgICAgd2l0aCBCdWlsZERpcmVjdG9yeShvcHRpb25zLmJ1aWxkX2RpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGU9YnVpbGRfZGVsZXRlKSBhcyBidWlsZF9kaXI6CgogICAgICAgICAgICAgICAgcmVxdWlyZW1lbnRfc2V0ID0gUmVxdWlyZW1lbnRTZXQoCiAgICAgICAgICAgICAgICAgICAgYnVpbGRfZGlyPWJ1aWxkX2RpciwKICAgICAgICAgICAgICAgICAgICBzcmNfZGlyPW9wdGlvbnMuc3JjX2RpciwKICAgICAgICAgICAgICAgICAgICBkb3dubG9hZF9kaXI9b3B0aW9ucy5kb3dubG9hZF9kaXIsCiAgICAgICAgICAgICAgICAgICAgaWdub3JlX2luc3RhbGxlZD1UcnVlLAogICAgICAgICAgICAgICAgICAgIGlnbm9yZV9kZXBlbmRlbmNpZXM9b3B0aW9ucy5pZ25vcmVfZGVwZW5kZW5jaWVzLAogICAgICAgICAgICAgICAgICAgIHNlc3Npb249c2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICBpc29sYXRlZD1vcHRpb25zLmlzb2xhdGVkX21vZGUsCiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZV9oYXNoZXM9b3B0aW9ucy5yZXF1aXJlX2hhc2hlcwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgc2VsZi5wb3B1bGF0ZV9yZXF1aXJlbWVudF9zZXQoCiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnRfc2V0LAogICAgICAgICAgICAgICAgICAgIGFyZ3MsCiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucywKICAgICAgICAgICAgICAgICAgICBmaW5kZXIsCiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICBzZWxmLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgTm9uZQogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgICAgIGlmIG5vdCByZXF1aXJlbWVudF9zZXQuaGFzX3JlcXVpcmVtZW50czoKICAgICAgICAgICAgICAgICAgICByZXR1cm4KCiAgICAgICAgICAgICAgICByZXF1aXJlbWVudF9zZXQucHJlcGFyZV9maWxlcyhmaW5kZXIpCgogICAgICAgICAgICAgICAgZG93bmxvYWRlZCA9ICcgJy5qb2luKFsKICAgICAgICAgICAgICAgICAgICByZXEubmFtZSBmb3IgcmVxIGluIHJlcXVpcmVtZW50X3NldC5zdWNjZXNzZnVsbHlfZG93bmxvYWRlZAogICAgICAgICAgICAgICAgXSkKICAgICAgICAgICAgICAgIGlmIGRvd25sb2FkZWQ6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAgICAgICAgICdTdWNjZXNzZnVsbHkgZG93bmxvYWRlZCAlcycsIGRvd25sb2FkZWQKICAgICAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAgICAgIyBDbGVhbiB1cAogICAgICAgICAgICAgICAgaWYgbm90IG9wdGlvbnMubm9fY2xlYW46CiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnRfc2V0LmNsZWFudXBfZmlsZXMoKQoKICAgICAgICByZXR1cm4gcmVxdWlyZW1lbnRfc2V0ClBLAwQUAAAAAAAAACEAw/bzYBMLAAATCwAAJgAAAHB5cGlfX3BpcF85XzBfMy9waXAvY29tbWFuZHMvZnJlZXplLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBzeXMKCmltcG9ydCBwaXAKZnJvbSBwaXAuY29tcGF0IGltcG9ydCBzdGRsaWJfcGtncwpmcm9tIHBpcC5iYXNlY29tbWFuZCBpbXBvcnQgQ29tbWFuZApmcm9tIHBpcC5vcGVyYXRpb25zLmZyZWV6ZSBpbXBvcnQgZnJlZXplCmZyb20gcGlwLndoZWVsIGltcG9ydCBXaGVlbENhY2hlCgoKREVWX1BLR1MgPSAoJ3BpcCcsICdzZXR1cHRvb2xzJywgJ2Rpc3RyaWJ1dGUnLCAnd2hlZWwnKQoKCmNsYXNzIEZyZWV6ZUNvbW1hbmQoQ29tbWFuZCk6CiAgICAiIiIKICAgIE91dHB1dCBpbnN0YWxsZWQgcGFja2FnZXMgaW4gcmVxdWlyZW1lbnRzIGZvcm1hdC4KCiAgICBwYWNrYWdlcyBhcmUgbGlzdGVkIGluIGEgY2FzZS1pbnNlbnNpdGl2ZSBzb3J0ZWQgb3JkZXIuCiAgICAiIiIKICAgIG5hbWUgPSAnZnJlZXplJwogICAgdXNhZ2UgPSAiIiIKICAgICAgJXByb2cgW29wdGlvbnNdIiIiCiAgICBzdW1tYXJ5ID0gJ091dHB1dCBpbnN0YWxsZWQgcGFja2FnZXMgaW4gcmVxdWlyZW1lbnRzIGZvcm1hdC4nCiAgICBsb2dfc3RyZWFtcyA9ICgiZXh0Oi8vc3lzLnN0ZGVyciIsICJleHQ6Ly9zeXMuc3RkZXJyIikKCiAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3cpOgogICAgICAgIHN1cGVyKEZyZWV6ZUNvbW1hbmQsIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3KQoKICAgICAgICBzZWxmLmNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctcicsICctLXJlcXVpcmVtZW50JywKICAgICAgICAgICAgZGVzdD0ncmVxdWlyZW1lbnRzJywKICAgICAgICAgICAgYWN0aW9uPSdhcHBlbmQnLAogICAgICAgICAgICBkZWZhdWx0PVtdLAogICAgICAgICAgICBtZXRhdmFyPSdmaWxlJywKICAgICAgICAgICAgaGVscD0iVXNlIHRoZSBvcmRlciBpbiB0aGUgZ2l2ZW4gcmVxdWlyZW1lbnRzIGZpbGUgYW5kIGl0cyAiCiAgICAgICAgICAgICAgICAgImNvbW1lbnRzIHdoZW4gZ2VuZXJhdGluZyBvdXRwdXQuIFRoaXMgb3B0aW9uIGNhbiBiZSAiCiAgICAgICAgICAgICAgICAgInVzZWQgbXVsdGlwbGUgdGltZXMuIikKICAgICAgICBzZWxmLmNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctZicsICctLWZpbmQtbGlua3MnLAogICAgICAgICAgICBkZXN0PSdmaW5kX2xpbmtzJywKICAgICAgICAgICAgYWN0aW9uPSdhcHBlbmQnLAogICAgICAgICAgICBkZWZhdWx0PVtdLAogICAgICAgICAgICBtZXRhdmFyPSdVUkwnLAogICAgICAgICAgICBoZWxwPSdVUkwgZm9yIGZpbmRpbmcgcGFja2FnZXMsIHdoaWNoIHdpbGwgYmUgYWRkZWQgdG8gdGhlICcKICAgICAgICAgICAgICAgICAnb3V0cHV0LicpCiAgICAgICAgc2VsZi5jbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLWwnLCAnLS1sb2NhbCcsCiAgICAgICAgICAgIGRlc3Q9J2xvY2FsJywKICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgICAgICAgICAgZGVmYXVsdD1GYWxzZSwKICAgICAgICAgICAgaGVscD0nSWYgaW4gYSB2aXJ0dWFsZW52IHRoYXQgaGFzIGdsb2JhbCBhY2Nlc3MsIGRvIG5vdCBvdXRwdXQgJwogICAgICAgICAgICAgICAgICdnbG9iYWxseS1pbnN0YWxsZWQgcGFja2FnZXMuJykKICAgICAgICBzZWxmLmNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctLXVzZXInLAogICAgICAgICAgICBkZXN0PSd1c2VyJywKICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgICAgICAgICAgZGVmYXVsdD1GYWxzZSwKICAgICAgICAgICAgaGVscD0nT25seSBvdXRwdXQgcGFja2FnZXMgaW5zdGFsbGVkIGluIHVzZXItc2l0ZS4nKQogICAgICAgIHNlbGYuY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy0tYWxsJywKICAgICAgICAgICAgZGVzdD0nZnJlZXplX2FsbCcsCiAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICAgICAgICAgIGhlbHA9J0RvIG5vdCBza2lwIHRoZXNlIHBhY2thZ2VzIGluIHRoZSBvdXRwdXQ6JwogICAgICAgICAgICAgICAgICcgJXMnICUgJywgJy5qb2luKERFVl9QS0dTKSkKCiAgICAgICAgc2VsZi5wYXJzZXIuaW5zZXJ0X29wdGlvbl9ncm91cCgwLCBzZWxmLmNtZF9vcHRzKQoKICAgIGRlZiBydW4oc2VsZiwgb3B0aW9ucywgYXJncyk6CiAgICAgICAgZm9ybWF0X2NvbnRyb2wgPSBwaXAuaW5kZXguRm9ybWF0Q29udHJvbChzZXQoKSwgc2V0KCkpCiAgICAgICAgd2hlZWxfY2FjaGUgPSBXaGVlbENhY2hlKG9wdGlvbnMuY2FjaGVfZGlyLCBmb3JtYXRfY29udHJvbCkKICAgICAgICBza2lwID0gc2V0KHN0ZGxpYl9wa2dzKQogICAgICAgIGlmIG5vdCBvcHRpb25zLmZyZWV6ZV9hbGw6CiAgICAgICAgICAgIHNraXAudXBkYXRlKERFVl9QS0dTKQoKICAgICAgICBmcmVlemVfa3dhcmdzID0gZGljdCgKICAgICAgICAgICAgcmVxdWlyZW1lbnQ9b3B0aW9ucy5yZXF1aXJlbWVudHMsCiAgICAgICAgICAgIGZpbmRfbGlua3M9b3B0aW9ucy5maW5kX2xpbmtzLAogICAgICAgICAgICBsb2NhbF9vbmx5PW9wdGlvbnMubG9jYWwsCiAgICAgICAgICAgIHVzZXJfb25seT1vcHRpb25zLnVzZXIsCiAgICAgICAgICAgIHNraXBfcmVnZXg9b3B0aW9ucy5za2lwX3JlcXVpcmVtZW50c19yZWdleCwKICAgICAgICAgICAgaXNvbGF0ZWQ9b3B0aW9ucy5pc29sYXRlZF9tb2RlLAogICAgICAgICAgICB3aGVlbF9jYWNoZT13aGVlbF9jYWNoZSwKICAgICAgICAgICAgc2tpcD1za2lwKQoKICAgICAgICBmb3IgbGluZSBpbiBmcmVlemUoKipmcmVlemVfa3dhcmdzKToKICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZShsaW5lICsgJ1xuJykKUEsDBBQAAAAAAAAAIQD4ieykPQYAAD0GAAAkAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9jb21tYW5kcy9oYXNoLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBoYXNobGliCmltcG9ydCBsb2dnaW5nCmltcG9ydCBzeXMKCmZyb20gcGlwLmJhc2Vjb21tYW5kIGltcG9ydCBDb21tYW5kCmZyb20gcGlwLnN0YXR1c19jb2RlcyBpbXBvcnQgRVJST1IKZnJvbSBwaXAudXRpbHMgaW1wb3J0IHJlYWRfY2h1bmtzCmZyb20gcGlwLnV0aWxzLmhhc2hlcyBpbXBvcnQgRkFWT1JJVEVfSEFTSCwgU1RST05HX0hBU0hFUwoKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmNsYXNzIEhhc2hDb21tYW5kKENvbW1hbmQpOgogICAgIiIiCiAgICBDb21wdXRlIGEgaGFzaCBvZiBhIGxvY2FsIHBhY2thZ2UgYXJjaGl2ZS4KCiAgICBUaGVzZSBjYW4gYmUgdXNlZCB3aXRoIC0taGFzaCBpbiBhIHJlcXVpcmVtZW50cyBmaWxlIHRvIGRvIHJlcGVhdGFibGUKICAgIGluc3RhbGxzLgoKICAgICIiIgogICAgbmFtZSA9ICdoYXNoJwogICAgdXNhZ2UgPSAnJXByb2cgW29wdGlvbnNdIDxmaWxlPiAuLi4nCiAgICBzdW1tYXJ5ID0gJ0NvbXB1dGUgaGFzaGVzIG9mIHBhY2thZ2UgYXJjaGl2ZXMuJwoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprdyk6CiAgICAgICAgc3VwZXIoSGFzaENvbW1hbmQsIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3KQogICAgICAgIHNlbGYuY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy1hJywgJy0tYWxnb3JpdGhtJywKICAgICAgICAgICAgZGVzdD0nYWxnb3JpdGhtJywKICAgICAgICAgICAgY2hvaWNlcz1TVFJPTkdfSEFTSEVTLAogICAgICAgICAgICBhY3Rpb249J3N0b3JlJywKICAgICAgICAgICAgZGVmYXVsdD1GQVZPUklURV9IQVNILAogICAgICAgICAgICBoZWxwPSdUaGUgaGFzaCBhbGdvcml0aG0gdG8gdXNlOiBvbmUgb2YgJXMnICUKICAgICAgICAgICAgICAgICAnLCAnLmpvaW4oU1RST05HX0hBU0hFUykpCiAgICAgICAgc2VsZi5wYXJzZXIuaW5zZXJ0X29wdGlvbl9ncm91cCgwLCBzZWxmLmNtZF9vcHRzKQoKICAgIGRlZiBydW4oc2VsZiwgb3B0aW9ucywgYXJncyk6CiAgICAgICAgaWYgbm90IGFyZ3M6CiAgICAgICAgICAgIHNlbGYucGFyc2VyLnByaW50X3VzYWdlKHN5cy5zdGRlcnIpCiAgICAgICAgICAgIHJldHVybiBFUlJPUgoKICAgICAgICBhbGdvcml0aG0gPSBvcHRpb25zLmFsZ29yaXRobQogICAgICAgIGZvciBwYXRoIGluIGFyZ3M6CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCclczpcbi0taGFzaD0lczolcycsCiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgsIGFsZ29yaXRobSwgX2hhc2hfb2ZfZmlsZShwYXRoLCBhbGdvcml0aG0pKQoKCmRlZiBfaGFzaF9vZl9maWxlKHBhdGgsIGFsZ29yaXRobSk6CiAgICAiIiJSZXR1cm4gdGhlIGhhc2ggZGlnZXN0IG9mIGEgZmlsZS4iIiIKICAgIHdpdGggb3BlbihwYXRoLCAncmInKSBhcyBhcmNoaXZlOgogICAgICAgIGhhc2ggPSBoYXNobGliLm5ldyhhbGdvcml0aG0pCiAgICAgICAgZm9yIGNodW5rIGluIHJlYWRfY2h1bmtzKGFyY2hpdmUpOgogICAgICAgICAgICBoYXNoLnVwZGF0ZShjaHVuaykKICAgIHJldHVybiBoYXNoLmhleGRpZ2VzdCgpClBLAwQUAAAAAAAAACEAHhbQndYDAADWAwAAJAAAAHB5cGlfX3BpcF85XzBfMy9waXAvY29tbWFuZHMvaGVscC5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0Cgpmcm9tIHBpcC5iYXNlY29tbWFuZCBpbXBvcnQgQ29tbWFuZCwgU1VDQ0VTUwpmcm9tIHBpcC5leGNlcHRpb25zIGltcG9ydCBDb21tYW5kRXJyb3IKCgpjbGFzcyBIZWxwQ29tbWFuZChDb21tYW5kKToKICAgICIiIlNob3cgaGVscCBmb3IgY29tbWFuZHMiIiIKICAgIG5hbWUgPSAnaGVscCcKICAgIHVzYWdlID0gIiIiCiAgICAgICVwcm9nIDxjb21tYW5kPiIiIgogICAgc3VtbWFyeSA9ICdTaG93IGhlbHAgZm9yIGNvbW1hbmRzLicKCiAgICBkZWYgcnVuKHNlbGYsIG9wdGlvbnMsIGFyZ3MpOgogICAgICAgIGZyb20gcGlwLmNvbW1hbmRzIGltcG9ydCBjb21tYW5kc19kaWN0LCBnZXRfc2ltaWxhcl9jb21tYW5kcwoKICAgICAgICB0cnk6CiAgICAgICAgICAgICMgJ3BpcCBoZWxwJyB3aXRoIG5vIGFyZ3MgaXMgaGFuZGxlZCBieSBwaXAuX19pbml0X18ucGFyc2VvcHQoKQogICAgICAgICAgICBjbWRfbmFtZSA9IGFyZ3NbMF0gICMgdGhlIGNvbW1hbmQgd2UgbmVlZCBoZWxwIGZvcgogICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgogICAgICAgICAgICByZXR1cm4gU1VDQ0VTUwoKICAgICAgICBpZiBjbWRfbmFtZSBub3QgaW4gY29tbWFuZHNfZGljdDoKICAgICAgICAgICAgZ3Vlc3MgPSBnZXRfc2ltaWxhcl9jb21tYW5kcyhjbWRfbmFtZSkKCiAgICAgICAgICAgIG1zZyA9IFsndW5rbm93biBjb21tYW5kICIlcyInICUgY21kX25hbWVdCiAgICAgICAgICAgIGlmIGd1ZXNzOgogICAgICAgICAgICAgICAgbXNnLmFwcGVuZCgnbWF5YmUgeW91IG1lYW50ICIlcyInICUgZ3Vlc3MpCgogICAgICAgICAgICByYWlzZSBDb21tYW5kRXJyb3IoJyAtICcuam9pbihtc2cpKQoKICAgICAgICBjb21tYW5kID0gY29tbWFuZHNfZGljdFtjbWRfbmFtZV0oKQogICAgICAgIGNvbW1hbmQucGFyc2VyLnByaW50X2hlbHAoKQoKICAgICAgICByZXR1cm4gU1VDQ0VTUwpQSwMEFAAAAAAAAAAhAEslhhYERAAABEQAACcAAABweXBpX19waXBfOV8wXzMvcGlwL2NvbW1hbmRzL2luc3RhbGwucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG9wZXJhdG9yCmltcG9ydCBvcwppbXBvcnQgdGVtcGZpbGUKaW1wb3J0IHNodXRpbAppbXBvcnQgd2FybmluZ3MKdHJ5OgogICAgaW1wb3J0IHdoZWVsCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIHdoZWVsID0gTm9uZQoKZnJvbSBwaXAucmVxIGltcG9ydCBSZXF1aXJlbWVudFNldApmcm9tIHBpcC5iYXNlY29tbWFuZCBpbXBvcnQgUmVxdWlyZW1lbnRDb21tYW5kCmZyb20gcGlwLmxvY2F0aW9ucyBpbXBvcnQgdmlydHVhbGVudl9ub19nbG9iYWwsIGRpc3R1dGlsc19zY2hlbWUKZnJvbSBwaXAuZXhjZXB0aW9ucyBpbXBvcnQgKAogICAgSW5zdGFsbGF0aW9uRXJyb3IsIENvbW1hbmRFcnJvciwgUHJldmlvdXNCdWlsZERpckVycm9yLAopCmZyb20gcGlwIGltcG9ydCBjbWRvcHRpb25zCmZyb20gcGlwLnV0aWxzIGltcG9ydCBlbnN1cmVfZGlyLCBnZXRfaW5zdGFsbGVkX3ZlcnNpb24KZnJvbSBwaXAudXRpbHMuYnVpbGQgaW1wb3J0IEJ1aWxkRGlyZWN0b3J5CmZyb20gcGlwLnV0aWxzLmRlcHJlY2F0aW9uIGltcG9ydCBSZW1vdmVkSW5QaXAxMFdhcm5pbmcKZnJvbSBwaXAudXRpbHMuZmlsZXN5c3RlbSBpbXBvcnQgY2hlY2tfcGF0aF9vd25lcgpmcm9tIHBpcC53aGVlbCBpbXBvcnQgV2hlZWxDYWNoZSwgV2hlZWxCdWlsZGVyCgoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKY2xhc3MgSW5zdGFsbENvbW1hbmQoUmVxdWlyZW1lbnRDb21tYW5kKToKICAgICIiIgogICAgSW5zdGFsbCBwYWNrYWdlcyBmcm9tOgoKICAgIC0gUHlQSSAoYW5kIG90aGVyIGluZGV4ZXMpIHVzaW5nIHJlcXVpcmVtZW50IHNwZWNpZmllcnMuCiAgICAtIFZDUyBwcm9qZWN0IHVybHMuCiAgICAtIExvY2FsIHByb2plY3QgZGlyZWN0b3JpZXMuCiAgICAtIExvY2FsIG9yIHJlbW90ZSBzb3VyY2UgYXJjaGl2ZXMuCgogICAgcGlwIGFsc28gc3VwcG9ydHMgaW5zdGFsbGluZyBmcm9tICJyZXF1aXJlbWVudHMgZmlsZXMiLCB3aGljaCBwcm92aWRlCiAgICBhbiBlYXN5IHdheSB0byBzcGVjaWZ5IGEgd2hvbGUgZW52aXJvbm1lbnQgdG8gYmUgaW5zdGFsbGVkLgogICAgIiIiCiAgICBuYW1lID0gJ2luc3RhbGwnCgogICAgdXNhZ2UgPSAiIiIKICAgICAgJXByb2cgW29wdGlvbnNdIDxyZXF1aXJlbWVudCBzcGVjaWZpZXI+IFtwYWNrYWdlLWluZGV4LW9wdGlvbnNdIC4uLgogICAgICAlcHJvZyBbb3B0aW9uc10gLXIgPHJlcXVpcmVtZW50cyBmaWxlPiBbcGFja2FnZS1pbmRleC1vcHRpb25zXSAuLi4KICAgICAgJXByb2cgW29wdGlvbnNdIFstZV0gPHZjcyBwcm9qZWN0IHVybD4gLi4uCiAgICAgICVwcm9nIFtvcHRpb25zXSBbLWVdIDxsb2NhbCBwcm9qZWN0IHBhdGg+IC4uLgogICAgICAlcHJvZyBbb3B0aW9uc10gPGFyY2hpdmUgdXJsL3BhdGg+IC4uLiIiIgoKICAgIHN1bW1hcnkgPSAnSW5zdGFsbCBwYWNrYWdlcy4nCgogICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3KToKICAgICAgICBzdXBlcihJbnN0YWxsQ29tbWFuZCwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3cpCgogICAgICAgIGNtZF9vcHRzID0gc2VsZi5jbWRfb3B0cwoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMuY29uc3RyYWludHMoKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMuZWRpdGFibGUoKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMucmVxdWlyZW1lbnRzKCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLmJ1aWxkX2RpcigpKQoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLXQnLCAnLS10YXJnZXQnLAogICAgICAgICAgICBkZXN0PSd0YXJnZXRfZGlyJywKICAgICAgICAgICAgbWV0YXZhcj0nZGlyJywKICAgICAgICAgICAgZGVmYXVsdD1Ob25lLAogICAgICAgICAgICBoZWxwPSdJbnN0YWxsIHBhY2thZ2VzIGludG8gPGRpcj4uICcKICAgICAgICAgICAgICAgICAnQnkgZGVmYXVsdCB0aGlzIHdpbGwgbm90IHJlcGxhY2UgZXhpc3RpbmcgZmlsZXMvZm9sZGVycyBpbiAnCiAgICAgICAgICAgICAgICAgJzxkaXI+LiBVc2UgLS11cGdyYWRlIHRvIHJlcGxhY2UgZXhpc3RpbmcgcGFja2FnZXMgaW4gPGRpcj4gJwogICAgICAgICAgICAgICAgICd3aXRoIG5ldyB2ZXJzaW9ucy4nCiAgICAgICAgKQoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLWQnLCAnLS1kb3dubG9hZCcsICctLWRvd25sb2FkLWRpcicsICctLWRvd25sb2FkLWRpcmVjdG9yeScsCiAgICAgICAgICAgIGRlc3Q9J2Rvd25sb2FkX2RpcicsCiAgICAgICAgICAgIG1ldGF2YXI9J2RpcicsCiAgICAgICAgICAgIGRlZmF1bHQ9Tm9uZSwKICAgICAgICAgICAgaGVscD0oIkRvd25sb2FkIHBhY2thZ2VzIGludG8gPGRpcj4gaW5zdGVhZCBvZiBpbnN0YWxsaW5nIHRoZW0sICIKICAgICAgICAgICAgICAgICAgInJlZ2FyZGxlc3Mgb2Ygd2hhdCdzIGFscmVhZHkgaW5zdGFsbGVkLiIpLAogICAgICAgICkKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLnNyYygpKQoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLVUnLCAnLS11cGdyYWRlJywKICAgICAgICAgICAgZGVzdD0ndXBncmFkZScsCiAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICAgICAgICAgIGhlbHA9J1VwZ3JhZGUgYWxsIHNwZWNpZmllZCBwYWNrYWdlcyB0byB0aGUgbmV3ZXN0IGF2YWlsYWJsZSAnCiAgICAgICAgICAgICAgICAgJ3ZlcnNpb24uIFRoZSBoYW5kbGluZyBvZiBkZXBlbmRlbmNpZXMgZGVwZW5kcyBvbiB0aGUgJwogICAgICAgICAgICAgICAgICd1cGdyYWRlLXN0cmF0ZWd5IHVzZWQuJwogICAgICAgICkKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy0tdXBncmFkZS1zdHJhdGVneScsCiAgICAgICAgICAgIGRlc3Q9J3VwZ3JhZGVfc3RyYXRlZ3knLAogICAgICAgICAgICBkZWZhdWx0PSdlYWdlcicsCiAgICAgICAgICAgIGNob2ljZXM9Wydvbmx5LWlmLW5lZWRlZCcsICdlYWdlciddLAogICAgICAgICAgICBoZWxwPSdEZXRlcm1pbmVzIGhvdyBkZXBlbmRlbmN5IHVwZ3JhZGluZyBzaG91bGQgYmUgaGFuZGxlZC4gJwogICAgICAgICAgICAgICAgICciZWFnZXIiIC0gZGVwZW5kZW5jaWVzIGFyZSB1cGdyYWRlZCByZWdhcmRsZXNzIG9mICcKICAgICAgICAgICAgICAgICAnd2hldGhlciB0aGUgY3VycmVudGx5IGluc3RhbGxlZCB2ZXJzaW9uIHNhdGlzZmllcyB0aGUgJwogICAgICAgICAgICAgICAgICdyZXF1aXJlbWVudHMgb2YgdGhlIHVwZ3JhZGVkIHBhY2thZ2UocykuICcKICAgICAgICAgICAgICAgICAnIm9ubHktaWYtbmVlZGVkIiAtICBhcmUgdXBncmFkZWQgb25seSB3aGVuIHRoZXkgZG8gbm90ICcKICAgICAgICAgICAgICAgICAnc2F0aXNmeSB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoZSB1cGdyYWRlZCBwYWNrYWdlKHMpLicKICAgICAgICApCgogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctLWZvcmNlLXJlaW5zdGFsbCcsCiAgICAgICAgICAgIGRlc3Q9J2ZvcmNlX3JlaW5zdGFsbCcsCiAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICAgICAgICAgIGhlbHA9J1doZW4gdXBncmFkaW5nLCByZWluc3RhbGwgYWxsIHBhY2thZ2VzIGV2ZW4gaWYgdGhleSBhcmUgJwogICAgICAgICAgICAgICAgICdhbHJlYWR5IHVwLXRvLWRhdGUuJykKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy1JJywgJy0taWdub3JlLWluc3RhbGxlZCcsCiAgICAgICAgICAgIGRlc3Q9J2lnbm9yZV9pbnN0YWxsZWQnLAogICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgICAgICAgICBoZWxwPSdJZ25vcmUgdGhlIGluc3RhbGxlZCBwYWNrYWdlcyAocmVpbnN0YWxsaW5nIGluc3RlYWQpLicpCgogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5pZ25vcmVfcmVxdWlyZXNfcHl0aG9uKCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLm5vX2RlcHMoKSkKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLmluc3RhbGxfb3B0aW9ucygpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5nbG9iYWxfb3B0aW9ucygpKQoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLS11c2VyJywKICAgICAgICAgICAgZGVzdD0ndXNlX3VzZXJfc2l0ZScsCiAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICAgICAgICAgIGhlbHA9Ikluc3RhbGwgdG8gdGhlIFB5dGhvbiB1c2VyIGluc3RhbGwgZGlyZWN0b3J5IGZvciB5b3VyICIKICAgICAgICAgICAgICAgICAicGxhdGZvcm0uIFR5cGljYWxseSB+Ly5sb2NhbC8sIG9yICVBUFBEQVRBJVxQeXRob24gb24gIgogICAgICAgICAgICAgICAgICJXaW5kb3dzLiAoU2VlIHRoZSBQeXRob24gZG9jdW1lbnRhdGlvbiBmb3Igc2l0ZS5VU0VSX0JBU0UgIgogICAgICAgICAgICAgICAgICJmb3IgZnVsbCBkZXRhaWxzLikiKQoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLS1lZ2cnLAogICAgICAgICAgICBkZXN0PSdhc19lZ2cnLAogICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgICAgICAgICBoZWxwPSJJbnN0YWxsIHBhY2thZ2VzIGFzIGVnZ3MsIG5vdCAnZmxhdCcsIGxpa2UgcGlwIG5vcm1hbGx5ICIKICAgICAgICAgICAgICAgICAiZG9lcy4gVGhpcyBvcHRpb24gaXMgbm90IGFib3V0IGluc3RhbGxpbmcgKmZyb20qIGVnZ3MuICIKICAgICAgICAgICAgICAgICAiKFdBUk5JTkc6IEJlY2F1c2UgdGhpcyBvcHRpb24gb3ZlcnJpZGVzIHBpcCdzIG5vcm1hbCBpbnN0YWxsIgogICAgICAgICAgICAgICAgICIgbG9naWMsIHJlcXVpcmVtZW50cyBmaWxlcyBtYXkgbm90IGJlaGF2ZSBhcyBleHBlY3RlZC4pIikKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy0tcm9vdCcsCiAgICAgICAgICAgIGRlc3Q9J3Jvb3RfcGF0aCcsCiAgICAgICAgICAgIG1ldGF2YXI9J2RpcicsCiAgICAgICAgICAgIGRlZmF1bHQ9Tm9uZSwKICAgICAgICAgICAgaGVscD0iSW5zdGFsbCBldmVyeXRoaW5nIHJlbGF0aXZlIHRvIHRoaXMgYWx0ZXJuYXRlIHJvb3QgIgogICAgICAgICAgICAgICAgICJkaXJlY3RvcnkuIikKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy0tcHJlZml4JywKICAgICAgICAgICAgZGVzdD0ncHJlZml4X3BhdGgnLAogICAgICAgICAgICBtZXRhdmFyPSdkaXInLAogICAgICAgICAgICBkZWZhdWx0PU5vbmUsCiAgICAgICAgICAgIGhlbHA9Ikluc3RhbGxhdGlvbiBwcmVmaXggd2hlcmUgbGliLCBiaW4gYW5kIG90aGVyIHRvcC1sZXZlbCAiCiAgICAgICAgICAgICAgICAgImZvbGRlcnMgYXJlIHBsYWNlZCIpCgogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICItLWNvbXBpbGUiLAogICAgICAgICAgICBhY3Rpb249InN0b3JlX3RydWUiLAogICAgICAgICAgICBkZXN0PSJjb21waWxlIiwKICAgICAgICAgICAgZGVmYXVsdD1UcnVlLAogICAgICAgICAgICBoZWxwPSJDb21waWxlIHB5IGZpbGVzIHRvIHB5YyIsCiAgICAgICAgKQoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAiLS1uby1jb21waWxlIiwKICAgICAgICAgICAgYWN0aW9uPSJzdG9yZV9mYWxzZSIsCiAgICAgICAgICAgIGRlc3Q9ImNvbXBpbGUiLAogICAgICAgICAgICBoZWxwPSJEbyBub3QgY29tcGlsZSBweSBmaWxlcyB0byBweWMiLAogICAgICAgICkKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLnVzZV93aGVlbCgpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5ub191c2Vfd2hlZWwoKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMubm9fYmluYXJ5KCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLm9ubHlfYmluYXJ5KCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLnByZSgpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5ub19jbGVhbigpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5yZXF1aXJlX2hhc2hlcygpKQoKICAgICAgICBpbmRleF9vcHRzID0gY21kb3B0aW9ucy5tYWtlX29wdGlvbl9ncm91cCgKICAgICAgICAgICAgY21kb3B0aW9ucy5pbmRleF9ncm91cCwKICAgICAgICAgICAgc2VsZi5wYXJzZXIsCiAgICAgICAgKQoKICAgICAgICBzZWxmLnBhcnNlci5pbnNlcnRfb3B0aW9uX2dyb3VwKDAsIGluZGV4X29wdHMpCiAgICAgICAgc2VsZi5wYXJzZXIuaW5zZXJ0X29wdGlvbl9ncm91cCgwLCBjbWRfb3B0cykKCiAgICBkZWYgcnVuKHNlbGYsIG9wdGlvbnMsIGFyZ3MpOgogICAgICAgIGNtZG9wdGlvbnMucmVzb2x2ZV93aGVlbF9ub191c2VfYmluYXJ5KG9wdGlvbnMpCiAgICAgICAgY21kb3B0aW9ucy5jaGVja19pbnN0YWxsX2J1aWxkX2dsb2JhbChvcHRpb25zKQoKICAgICAgICBpZiBvcHRpb25zLmFzX2VnZzoKICAgICAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgICAgICItLWVnZyBoYXMgYmVlbiBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4gIgogICAgICAgICAgICAgICAgIlRoaXMgZmxhZyBpcyBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCBsYXJnZSBwYXJ0cyBvZiBwaXAsIGFuZCAiCiAgICAgICAgICAgICAgICAiYWN0dWFsbHkgdXNpbmcgaXQgaW52YWxpZGF0ZXMgcGlwJ3MgYWJpbGl0eSB0byBtYW5hZ2UgdGhlICIKICAgICAgICAgICAgICAgICJpbnN0YWxsYXRpb24gcHJvY2Vzcy4iLAogICAgICAgICAgICAgICAgUmVtb3ZlZEluUGlwMTBXYXJuaW5nLAogICAgICAgICAgICApCgogICAgICAgIGlmIG9wdGlvbnMuYWxsb3dfZXh0ZXJuYWw6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICAgICAiLS1hbGxvdy1leHRlcm5hbCBoYXMgYmVlbiBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gIgogICAgICAgICAgICAgICAgInRoZSBmdXR1cmUuIER1ZSB0byBjaGFuZ2VzIGluIHRoZSByZXBvc2l0b3J5IHByb3RvY29sLCBpdCBubyAiCiAgICAgICAgICAgICAgICAibG9uZ2VyIGhhcyBhbnkgZWZmZWN0LiIsCiAgICAgICAgICAgICAgICBSZW1vdmVkSW5QaXAxMFdhcm5pbmcsCiAgICAgICAgICAgICkKCiAgICAgICAgaWYgb3B0aW9ucy5hbGxvd19hbGxfZXh0ZXJuYWw6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICAgICAiLS1hbGxvdy1hbGwtZXh0ZXJuYWwgaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkICIKICAgICAgICAgICAgICAgICJpbiB0aGUgZnV0dXJlLiBEdWUgdG8gY2hhbmdlcyBpbiB0aGUgcmVwb3NpdG9yeSBwcm90b2NvbCwgaXQgIgogICAgICAgICAgICAgICAgIm5vIGxvbmdlciBoYXMgYW55IGVmZmVjdC4iLAogICAgICAgICAgICAgICAgUmVtb3ZlZEluUGlwMTBXYXJuaW5nLAogICAgICAgICAgICApCgogICAgICAgIGlmIG9wdGlvbnMuYWxsb3dfdW52ZXJpZmllZDoKICAgICAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgICAgICItLWFsbG93LXVudmVyaWZpZWQgaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkICIKICAgICAgICAgICAgICAgICJpbiB0aGUgZnV0dXJlLiBEdWUgdG8gY2hhbmdlcyBpbiB0aGUgcmVwb3NpdG9yeSBwcm90b2NvbCwgaXQgIgogICAgICAgICAgICAgICAgIm5vIGxvbmdlciBoYXMgYW55IGVmZmVjdC4iLAogICAgICAgICAgICAgICAgUmVtb3ZlZEluUGlwMTBXYXJuaW5nLAogICAgICAgICAgICApCgogICAgICAgIGlmIG9wdGlvbnMuZG93bmxvYWRfZGlyOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAgICAgInBpcCBpbnN0YWxsIC0tZG93bmxvYWQgaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSAiCiAgICAgICAgICAgICAgICAicmVtb3ZlZCBpbiB0aGUgZnV0dXJlLiBQaXAgbm93IGhhcyBhIGRvd25sb2FkIGNvbW1hbmQgdGhhdCAiCiAgICAgICAgICAgICAgICAic2hvdWxkIGJlIHVzZWQgaW5zdGVhZC4iLAogICAgICAgICAgICAgICAgUmVtb3ZlZEluUGlwMTBXYXJuaW5nLAogICAgICAgICAgICApCiAgICAgICAgICAgIG9wdGlvbnMuaWdub3JlX2luc3RhbGxlZCA9IFRydWUKCiAgICAgICAgaWYgb3B0aW9ucy5idWlsZF9kaXI6CiAgICAgICAgICAgIG9wdGlvbnMuYnVpbGRfZGlyID0gb3MucGF0aC5hYnNwYXRoKG9wdGlvbnMuYnVpbGRfZGlyKQoKICAgICAgICBvcHRpb25zLnNyY19kaXIgPSBvcy5wYXRoLmFic3BhdGgob3B0aW9ucy5zcmNfZGlyKQogICAgICAgIGluc3RhbGxfb3B0aW9ucyA9IG9wdGlvbnMuaW5zdGFsbF9vcHRpb25zIG9yIFtdCiAgICAgICAgaWYgb3B0aW9ucy51c2VfdXNlcl9zaXRlOgogICAgICAgICAgICBpZiBvcHRpb25zLnByZWZpeF9wYXRoOgogICAgICAgICAgICAgICAgcmFpc2UgQ29tbWFuZEVycm9yKAogICAgICAgICAgICAgICAgICAgICJDYW4gbm90IGNvbWJpbmUgJy0tdXNlcicgYW5kICctLXByZWZpeCcgYXMgdGhleSBpbXBseSAiCiAgICAgICAgICAgICAgICAgICAgImRpZmZlcmVudCBpbnN0YWxsYXRpb24gbG9jYXRpb25zIgogICAgICAgICAgICAgICAgKQogICAgICAgICAgICBpZiB2aXJ0dWFsZW52X25vX2dsb2JhbCgpOgogICAgICAgICAgICAgICAgcmFpc2UgSW5zdGFsbGF0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgIkNhbiBub3QgcGVyZm9ybSBhICctLXVzZXInIGluc3RhbGwuIFVzZXIgc2l0ZS1wYWNrYWdlcyAiCiAgICAgICAgICAgICAgICAgICAgImFyZSBub3QgdmlzaWJsZSBpbiB0aGlzIHZpcnR1YWxlbnYuIgogICAgICAgICAgICAgICAgKQogICAgICAgICAgICBpbnN0YWxsX29wdGlvbnMuYXBwZW5kKCctLXVzZXInKQogICAgICAgICAgICBpbnN0YWxsX29wdGlvbnMuYXBwZW5kKCctLXByZWZpeD0nKQoKICAgICAgICB0ZW1wX3RhcmdldF9kaXIgPSBOb25lCiAgICAgICAgaWYgb3B0aW9ucy50YXJnZXRfZGlyOgogICAgICAgICAgICBvcHRpb25zLmlnbm9yZV9pbnN0YWxsZWQgPSBUcnVlCiAgICAgICAgICAgIHRlbXBfdGFyZ2V0X2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQogICAgICAgICAgICBvcHRpb25zLnRhcmdldF9kaXIgPSBvcy5wYXRoLmFic3BhdGgob3B0aW9ucy50YXJnZXRfZGlyKQogICAgICAgICAgICBpZiAob3MucGF0aC5leGlzdHMob3B0aW9ucy50YXJnZXRfZGlyKSBhbmQgbm90CiAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5pc2RpcihvcHRpb25zLnRhcmdldF9kaXIpKToKICAgICAgICAgICAgICAgIHJhaXNlIENvbW1hbmRFcnJvcigKICAgICAgICAgICAgICAgICAgICAiVGFyZ2V0IHBhdGggZXhpc3RzIGJ1dCBpcyBub3QgYSBkaXJlY3RvcnksIHdpbGwgbm90ICIKICAgICAgICAgICAgICAgICAgICAiY29udGludWUuIgogICAgICAgICAgICAgICAgKQogICAgICAgICAgICBpbnN0YWxsX29wdGlvbnMuYXBwZW5kKCctLWhvbWU9JyArIHRlbXBfdGFyZ2V0X2RpcikKCiAgICAgICAgZ2xvYmFsX29wdGlvbnMgPSBvcHRpb25zLmdsb2JhbF9vcHRpb25zIG9yIFtdCgogICAgICAgIHdpdGggc2VsZi5fYnVpbGRfc2Vzc2lvbihvcHRpb25zKSBhcyBzZXNzaW9uOgoKICAgICAgICAgICAgZmluZGVyID0gc2VsZi5fYnVpbGRfcGFja2FnZV9maW5kZXIob3B0aW9ucywgc2Vzc2lvbikKICAgICAgICAgICAgYnVpbGRfZGVsZXRlID0gKG5vdCAob3B0aW9ucy5ub19jbGVhbiBvciBvcHRpb25zLmJ1aWxkX2RpcikpCiAgICAgICAgICAgIHdoZWVsX2NhY2hlID0gV2hlZWxDYWNoZShvcHRpb25zLmNhY2hlX2Rpciwgb3B0aW9ucy5mb3JtYXRfY29udHJvbCkKICAgICAgICAgICAgaWYgb3B0aW9ucy5jYWNoZV9kaXIgYW5kIG5vdCBjaGVja19wYXRoX293bmVyKG9wdGlvbnMuY2FjaGVfZGlyKToKICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgICAgICJUaGUgZGlyZWN0b3J5ICclcycgb3IgaXRzIHBhcmVudCBkaXJlY3RvcnkgaXMgbm90IG93bmVkICIKICAgICAgICAgICAgICAgICAgICAiYnkgdGhlIGN1cnJlbnQgdXNlciBhbmQgY2FjaGluZyB3aGVlbHMgaGFzIGJlZW4gIgogICAgICAgICAgICAgICAgICAgICJkaXNhYmxlZC4gY2hlY2sgdGhlIHBlcm1pc3Npb25zIGFuZCBvd25lciBvZiB0aGF0ICIKICAgICAgICAgICAgICAgICAgICAiZGlyZWN0b3J5LiBJZiBleGVjdXRpbmcgcGlwIHdpdGggc3VkbywgeW91IG1heSB3YW50ICIKICAgICAgICAgICAgICAgICAgICAic3VkbydzIC1IIGZsYWcuIiwKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmNhY2hlX2RpciwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIG9wdGlvbnMuY2FjaGVfZGlyID0gTm9uZQoKICAgICAgICAgICAgd2l0aCBCdWlsZERpcmVjdG9yeShvcHRpb25zLmJ1aWxkX2RpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGU9YnVpbGRfZGVsZXRlKSBhcyBidWlsZF9kaXI6CiAgICAgICAgICAgICAgICByZXF1aXJlbWVudF9zZXQgPSBSZXF1aXJlbWVudFNldCgKICAgICAgICAgICAgICAgICAgICBidWlsZF9kaXI9YnVpbGRfZGlyLAogICAgICAgICAgICAgICAgICAgIHNyY19kaXI9b3B0aW9ucy5zcmNfZGlyLAogICAgICAgICAgICAgICAgICAgIGRvd25sb2FkX2Rpcj1vcHRpb25zLmRvd25sb2FkX2RpciwKICAgICAgICAgICAgICAgICAgICB1cGdyYWRlPW9wdGlvbnMudXBncmFkZSwKICAgICAgICAgICAgICAgICAgICB1cGdyYWRlX3N0cmF0ZWd5PW9wdGlvbnMudXBncmFkZV9zdHJhdGVneSwKICAgICAgICAgICAgICAgICAgICBhc19lZ2c9b3B0aW9ucy5hc19lZ2csCiAgICAgICAgICAgICAgICAgICAgaWdub3JlX2luc3RhbGxlZD1vcHRpb25zLmlnbm9yZV9pbnN0YWxsZWQsCiAgICAgICAgICAgICAgICAgICAgaWdub3JlX2RlcGVuZGVuY2llcz1vcHRpb25zLmlnbm9yZV9kZXBlbmRlbmNpZXMsCiAgICAgICAgICAgICAgICAgICAgaWdub3JlX3JlcXVpcmVzX3B5dGhvbj1vcHRpb25zLmlnbm9yZV9yZXF1aXJlc19weXRob24sCiAgICAgICAgICAgICAgICAgICAgZm9yY2VfcmVpbnN0YWxsPW9wdGlvbnMuZm9yY2VfcmVpbnN0YWxsLAogICAgICAgICAgICAgICAgICAgIHVzZV91c2VyX3NpdGU9b3B0aW9ucy51c2VfdXNlcl9zaXRlLAogICAgICAgICAgICAgICAgICAgIHRhcmdldF9kaXI9dGVtcF90YXJnZXRfZGlyLAogICAgICAgICAgICAgICAgICAgIHNlc3Npb249c2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICBweWNvbXBpbGU9b3B0aW9ucy5jb21waWxlLAogICAgICAgICAgICAgICAgICAgIGlzb2xhdGVkPW9wdGlvbnMuaXNvbGF0ZWRfbW9kZSwKICAgICAgICAgICAgICAgICAgICB3aGVlbF9jYWNoZT13aGVlbF9jYWNoZSwKICAgICAgICAgICAgICAgICAgICByZXF1aXJlX2hhc2hlcz1vcHRpb25zLnJlcXVpcmVfaGFzaGVzLAogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgICAgIHNlbGYucG9wdWxhdGVfcmVxdWlyZW1lbnRfc2V0KAogICAgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50X3NldCwgYXJncywgb3B0aW9ucywgZmluZGVyLCBzZXNzaW9uLCBzZWxmLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgd2hlZWxfY2FjaGUKICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICAgICBpZiBub3QgcmVxdWlyZW1lbnRfc2V0Lmhhc19yZXF1aXJlbWVudHM6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmRvd25sb2FkX2RpciBvciBub3Qgd2hlZWwgb3Igbm90CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmNhY2hlX2Rpcik6CiAgICAgICAgICAgICAgICAgICAgICAgICMgb24gLWQgZG9uJ3QgZG8gY29tcGxleCB0aGluZ3MgbGlrZSBidWlsZGluZwogICAgICAgICAgICAgICAgICAgICAgICAjIHdoZWVscywgYW5kIGRvbid0IHRyeSB0byBidWlsZCB3aGVlbHMgd2hlbiB3aGVlbCBpcwogICAgICAgICAgICAgICAgICAgICAgICAjIG5vdCBpbnN0YWxsZWQuCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50X3NldC5wcmVwYXJlX2ZpbGVzKGZpbmRlcikKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAjIGJ1aWxkIHdoZWVscyBiZWZvcmUgaW5zdGFsbC4KICAgICAgICAgICAgICAgICAgICAgICAgd2IgPSBXaGVlbEJ1aWxkZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlbWVudF9zZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5kZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZF9vcHRpb25zPVtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX29wdGlvbnM9W10sCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgIyBJZ25vcmUgdGhlIHJlc3VsdDogYSBmYWlsZWQgd2hlZWwgd2lsbCBiZQogICAgICAgICAgICAgICAgICAgICAgICAjIGluc3RhbGxlZCBmcm9tIHRoZSBzZGlzdC92Y3Mgd2hhdGV2ZXIuCiAgICAgICAgICAgICAgICAgICAgICAgIHdiLmJ1aWxkKGF1dG9idWlsZGluZz1UcnVlKQoKICAgICAgICAgICAgICAgICAgICBpZiBub3Qgb3B0aW9ucy5kb3dubG9hZF9kaXI6CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50X3NldC5pbnN0YWxsKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFsbF9vcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX29wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290PW9wdGlvbnMucm9vdF9wYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4PW9wdGlvbnMucHJlZml4X3BhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlX2xpYl9sb2NhdGlvbnMgPSBnZXRfbGliX2xvY2F0aW9uX2d1ZXNzZXMoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyPW9wdGlvbnMudXNlX3VzZXJfc2l0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvbWU9dGVtcF90YXJnZXRfZGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdD1vcHRpb25zLnJvb3RfcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeD1vcHRpb25zLnByZWZpeF9wYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNvbGF0ZWQ9b3B0aW9ucy5pc29sYXRlZF9tb2RlLAogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXMgPSBzb3J0ZWQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlbWVudF9zZXQuc3VjY2Vzc2Z1bGx5X2luc3RhbGxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleT1vcGVyYXRvci5hdHRyZ2V0dGVyKCduYW1lJykpCiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zID0gW10KICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHJlcSBpbiByZXFzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbSA9IHJlcS5uYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFsbGVkX3ZlcnNpb24gPSBnZXRfaW5zdGFsbGVkX3ZlcnNpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5uYW1lLCBwb3NzaWJsZV9saWJfbG9jYXRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGluc3RhbGxlZF92ZXJzaW9uOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtICs9ICctJyArIGluc3RhbGxlZF92ZXJzaW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLmFwcGVuZChpdGVtKQogICAgICAgICAgICAgICAgICAgICAgICBpbnN0YWxsZWQgPSAnICcuam9pbihpdGVtcykKICAgICAgICAgICAgICAgICAgICAgICAgaWYgaW5zdGFsbGVkOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ1N1Y2Nlc3NmdWxseSBpbnN0YWxsZWQgJXMnLCBpbnN0YWxsZWQpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRlZCA9ICcgJy5qb2luKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5uYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgcmVxIGluIHJlcXVpcmVtZW50X3NldC5zdWNjZXNzZnVsbHlfZG93bmxvYWRlZAogICAgICAgICAgICAgICAgICAgICAgICBdKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBkb3dubG9hZGVkOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1N1Y2Nlc3NmdWxseSBkb3dubG9hZGVkICVzJywgZG93bmxvYWRlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgZXhjZXB0IFByZXZpb3VzQnVpbGREaXJFcnJvcjoKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm5vX2NsZWFuID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgICAgICMgQ2xlYW4gdXAKICAgICAgICAgICAgICAgICAgICBpZiBub3Qgb3B0aW9ucy5ub19jbGVhbjoKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnRfc2V0LmNsZWFudXBfZmlsZXMoKQoKICAgICAgICBpZiBvcHRpb25zLnRhcmdldF9kaXI6CiAgICAgICAgICAgIGVuc3VyZV9kaXIob3B0aW9ucy50YXJnZXRfZGlyKQoKICAgICAgICAgICAgIyBDaGVja2luZyBib3RoIHB1cmVsaWIgYW5kIHBsYXRsaWIgZGlyZWN0b3JpZXMgZm9yIGluc3RhbGxlZAogICAgICAgICAgICAjIHBhY2thZ2VzIHRvIGJlIG1vdmVkIHRvIHRhcmdldCBkaXJlY3RvcnkKICAgICAgICAgICAgbGliX2Rpcl9saXN0ID0gW10KCiAgICAgICAgICAgIHB1cmVsaWJfZGlyID0gZGlzdHV0aWxzX3NjaGVtZSgnJywgaG9tZT10ZW1wX3RhcmdldF9kaXIpWydwdXJlbGliJ10KICAgICAgICAgICAgcGxhdGxpYl9kaXIgPSBkaXN0dXRpbHNfc2NoZW1lKCcnLCBob21lPXRlbXBfdGFyZ2V0X2RpcilbJ3BsYXRsaWInXQoKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocHVyZWxpYl9kaXIpOgogICAgICAgICAgICAgICAgbGliX2Rpcl9saXN0LmFwcGVuZChwdXJlbGliX2RpcikKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocGxhdGxpYl9kaXIpIGFuZCBwbGF0bGliX2RpciAhPSBwdXJlbGliX2RpcjoKICAgICAgICAgICAgICAgIGxpYl9kaXJfbGlzdC5hcHBlbmQocGxhdGxpYl9kaXIpCgogICAgICAgICAgICBmb3IgbGliX2RpciBpbiBsaWJfZGlyX2xpc3Q6CiAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiBvcy5saXN0ZGlyKGxpYl9kaXIpOgogICAgICAgICAgICAgICAgICAgIHRhcmdldF9pdGVtX2RpciA9IG9zLnBhdGguam9pbihvcHRpb25zLnRhcmdldF9kaXIsIGl0ZW0pCiAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHModGFyZ2V0X2l0ZW1fZGlyKToKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IG9wdGlvbnMudXBncmFkZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUYXJnZXQgZGlyZWN0b3J5ICVzIGFscmVhZHkgZXhpc3RzLiBTcGVjaWZ5ICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLS11cGdyYWRlIHRvIGZvcmNlIHJlcGxhY2VtZW50LicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X2l0ZW1fZGlyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzbGluayh0YXJnZXRfaXRlbV9kaXIpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RhcmdldCBkaXJlY3RvcnkgJXMgYWxyZWFkeSBleGlzdHMgYW5kIGlzICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYSBsaW5rLiBQaXAgd2lsbCBub3QgYXV0b21hdGljYWxseSByZXBsYWNlICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGlua3MsIHBsZWFzZSByZW1vdmUgaWYgcmVwbGFjZW1lbnQgaXMgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkZXNpcmVkLicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X2l0ZW1fZGlyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKHRhcmdldF9pdGVtX2Rpcik6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaHV0aWwucm10cmVlKHRhcmdldF9pdGVtX2RpcikKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnJlbW92ZSh0YXJnZXRfaXRlbV9kaXIpCgogICAgICAgICAgICAgICAgICAgIHNodXRpbC5tb3ZlKAogICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4obGliX2RpciwgaXRlbSksCiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9pdGVtX2RpcgogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgc2h1dGlsLnJtdHJlZSh0ZW1wX3RhcmdldF9kaXIpCiAgICAgICAgcmV0dXJuIHJlcXVpcmVtZW50X3NldAoKCmRlZiBnZXRfbGliX2xvY2F0aW9uX2d1ZXNzZXMoKmFyZ3MsICoqa3dhcmdzKToKICAgIHNjaGVtZSA9IGRpc3R1dGlsc19zY2hlbWUoJycsICphcmdzLCAqKmt3YXJncykKICAgIHJldHVybiBbc2NoZW1lWydwdXJlbGliJ10sIHNjaGVtZVsncGxhdGxpYiddXQpQSwMEFAAAAAAAAAAhAA9LxzhpLAAAaSwAACQAAABweXBpX19waXBfOV8wXzMvcGlwL2NvbW1hbmRzL2xpc3QucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGpzb24KaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IHdhcm5pbmdzCnRyeToKICAgIGZyb20gaXRlcnRvb2xzIGltcG9ydCB6aXBfbG9uZ2VzdApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBmcm9tIGl0ZXJ0b29scyBpbXBvcnQgaXppcF9sb25nZXN0IGFzIHppcF9sb25nZXN0Cgpmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCBzaXgKCmZyb20gcGlwLmJhc2Vjb21tYW5kIGltcG9ydCBDb21tYW5kCmZyb20gcGlwLmV4Y2VwdGlvbnMgaW1wb3J0IENvbW1hbmRFcnJvcgpmcm9tIHBpcC5pbmRleCBpbXBvcnQgUGFja2FnZUZpbmRlcgpmcm9tIHBpcC51dGlscyBpbXBvcnQgKAogICAgZ2V0X2luc3RhbGxlZF9kaXN0cmlidXRpb25zLCBkaXN0X2lzX2VkaXRhYmxlKQpmcm9tIHBpcC51dGlscy5kZXByZWNhdGlvbiBpbXBvcnQgUmVtb3ZlZEluUGlwMTBXYXJuaW5nCmZyb20gcGlwLmNtZG9wdGlvbnMgaW1wb3J0IG1ha2Vfb3B0aW9uX2dyb3VwLCBpbmRleF9ncm91cAoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKY2xhc3MgTGlzdENvbW1hbmQoQ29tbWFuZCk6CiAgICAiIiIKICAgIExpc3QgaW5zdGFsbGVkIHBhY2thZ2VzLCBpbmNsdWRpbmcgZWRpdGFibGVzLgoKICAgIFBhY2thZ2VzIGFyZSBsaXN0ZWQgaW4gYSBjYXNlLWluc2Vuc2l0aXZlIHNvcnRlZCBvcmRlci4KICAgICIiIgogICAgbmFtZSA9ICdsaXN0JwogICAgdXNhZ2UgPSAiIiIKICAgICAgJXByb2cgW29wdGlvbnNdIiIiCiAgICBzdW1tYXJ5ID0gJ0xpc3QgaW5zdGFsbGVkIHBhY2thZ2VzLicKCiAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3cpOgogICAgICAgIHN1cGVyKExpc3RDb21tYW5kLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprdykKCiAgICAgICAgY21kX29wdHMgPSBzZWxmLmNtZF9vcHRzCgogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctbycsICctLW91dGRhdGVkJywKICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgICAgICAgICAgZGVmYXVsdD1GYWxzZSwKICAgICAgICAgICAgaGVscD0nTGlzdCBvdXRkYXRlZCBwYWNrYWdlcycpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy11JywgJy0tdXB0b2RhdGUnLAogICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgICAgICAgICBkZWZhdWx0PUZhbHNlLAogICAgICAgICAgICBoZWxwPSdMaXN0IHVwdG9kYXRlIHBhY2thZ2VzJykKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLWUnLCAnLS1lZGl0YWJsZScsCiAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICAgICAgICAgIGRlZmF1bHQ9RmFsc2UsCiAgICAgICAgICAgIGhlbHA9J0xpc3QgZWRpdGFibGUgcHJvamVjdHMuJykKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLWwnLCAnLS1sb2NhbCcsCiAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICAgICAgICAgIGRlZmF1bHQ9RmFsc2UsCiAgICAgICAgICAgIGhlbHA9KCdJZiBpbiBhIHZpcnR1YWxlbnYgdGhhdCBoYXMgZ2xvYmFsIGFjY2VzcywgZG8gbm90IGxpc3QgJwogICAgICAgICAgICAgICAgICAnZ2xvYmFsbHktaW5zdGFsbGVkIHBhY2thZ2VzLicpLAogICAgICAgICkKICAgICAgICBzZWxmLmNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctLXVzZXInLAogICAgICAgICAgICBkZXN0PSd1c2VyJywKICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgICAgICAgICAgZGVmYXVsdD1GYWxzZSwKICAgICAgICAgICAgaGVscD0nT25seSBvdXRwdXQgcGFja2FnZXMgaW5zdGFsbGVkIGluIHVzZXItc2l0ZS4nKQoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKAogICAgICAgICAgICAnLS1wcmUnLAogICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgICAgICAgICBkZWZhdWx0PUZhbHNlLAogICAgICAgICAgICBoZWxwPSgiSW5jbHVkZSBwcmUtcmVsZWFzZSBhbmQgZGV2ZWxvcG1lbnQgdmVyc2lvbnMuIEJ5IGRlZmF1bHQsICIKICAgICAgICAgICAgICAgICAgInBpcCBvbmx5IGZpbmRzIHN0YWJsZSB2ZXJzaW9ucy4iKSwKICAgICAgICApCgogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctLWZvcm1hdCcsCiAgICAgICAgICAgIGFjdGlvbj0nc3RvcmUnLAogICAgICAgICAgICBkZXN0PSdsaXN0X2Zvcm1hdCcsCiAgICAgICAgICAgIGNob2ljZXM9KCdsZWdhY3knLCAnY29sdW1ucycsICdmcmVlemUnLCAnanNvbicpLAogICAgICAgICAgICBoZWxwPSJTZWxlY3QgdGhlIG91dHB1dCBmb3JtYXQgYW1vbmc6IGxlZ2FjeSAoZGVmYXVsdCksIGNvbHVtbnMsICIKICAgICAgICAgICAgICAgICAiZnJlZXplIG9yIGpzb24uIiwKICAgICAgICApCgogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctLW5vdC1yZXF1aXJlZCcsCiAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICAgICAgICAgIGRlc3Q9J25vdF9yZXF1aXJlZCcsCiAgICAgICAgICAgIGhlbHA9Ikxpc3QgcGFja2FnZXMgdGhhdCBhcmUgbm90IGRlcGVuZGVuY2llcyBvZiAiCiAgICAgICAgICAgICAgICAgImluc3RhbGxlZCBwYWNrYWdlcy4iLAogICAgICAgICkKCiAgICAgICAgaW5kZXhfb3B0cyA9IG1ha2Vfb3B0aW9uX2dyb3VwKGluZGV4X2dyb3VwLCBzZWxmLnBhcnNlcikKCiAgICAgICAgc2VsZi5wYXJzZXIuaW5zZXJ0X29wdGlvbl9ncm91cCgwLCBpbmRleF9vcHRzKQogICAgICAgIHNlbGYucGFyc2VyLmluc2VydF9vcHRpb25fZ3JvdXAoMCwgY21kX29wdHMpCgogICAgZGVmIF9idWlsZF9wYWNrYWdlX2ZpbmRlcihzZWxmLCBvcHRpb25zLCBpbmRleF91cmxzLCBzZXNzaW9uKToKICAgICAgICAiIiIKICAgICAgICBDcmVhdGUgYSBwYWNrYWdlIGZpbmRlciBhcHByb3ByaWF0ZSB0byB0aGlzIGxpc3QgY29tbWFuZC4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gUGFja2FnZUZpbmRlcigKICAgICAgICAgICAgZmluZF9saW5rcz1vcHRpb25zLmZpbmRfbGlua3MsCiAgICAgICAgICAgIGluZGV4X3VybHM9aW5kZXhfdXJscywKICAgICAgICAgICAgYWxsb3dfYWxsX3ByZXJlbGVhc2VzPW9wdGlvbnMucHJlLAogICAgICAgICAgICB0cnVzdGVkX2hvc3RzPW9wdGlvbnMudHJ1c3RlZF9ob3N0cywKICAgICAgICAgICAgcHJvY2Vzc19kZXBlbmRlbmN5X2xpbmtzPW9wdGlvbnMucHJvY2Vzc19kZXBlbmRlbmN5X2xpbmtzLAogICAgICAgICAgICBzZXNzaW9uPXNlc3Npb24sCiAgICAgICAgKQoKICAgIGRlZiBydW4oc2VsZiwgb3B0aW9ucywgYXJncyk6CiAgICAgICAgaWYgb3B0aW9ucy5hbGxvd19leHRlcm5hbDoKICAgICAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgICAgICItLWFsbG93LWV4dGVybmFsIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAiCiAgICAgICAgICAgICAgICAidGhlIGZ1dHVyZS4gRHVlIHRvIGNoYW5nZXMgaW4gdGhlIHJlcG9zaXRvcnkgcHJvdG9jb2wsIGl0IG5vICIKICAgICAgICAgICAgICAgICJsb25nZXIgaGFzIGFueSBlZmZlY3QuIiwKICAgICAgICAgICAgICAgIFJlbW92ZWRJblBpcDEwV2FybmluZywKICAgICAgICAgICAgKQoKICAgICAgICBpZiBvcHRpb25zLmFsbG93X2FsbF9leHRlcm5hbDoKICAgICAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgICAgICItLWFsbG93LWFsbC1leHRlcm5hbCBoYXMgYmVlbiBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgIgogICAgICAgICAgICAgICAgImluIHRoZSBmdXR1cmUuIER1ZSB0byBjaGFuZ2VzIGluIHRoZSByZXBvc2l0b3J5IHByb3RvY29sLCBpdCAiCiAgICAgICAgICAgICAgICAibm8gbG9uZ2VyIGhhcyBhbnkgZWZmZWN0LiIsCiAgICAgICAgICAgICAgICBSZW1vdmVkSW5QaXAxMFdhcm5pbmcsCiAgICAgICAgICAgICkKCiAgICAgICAgaWYgb3B0aW9ucy5hbGxvd191bnZlcmlmaWVkOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAgICAgIi0tYWxsb3ctdW52ZXJpZmllZCBoYXMgYmVlbiBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgIgogICAgICAgICAgICAgICAgImluIHRoZSBmdXR1cmUuIER1ZSB0byBjaGFuZ2VzIGluIHRoZSByZXBvc2l0b3J5IHByb3RvY29sLCBpdCAiCiAgICAgICAgICAgICAgICAibm8gbG9uZ2VyIGhhcyBhbnkgZWZmZWN0LiIsCiAgICAgICAgICAgICAgICBSZW1vdmVkSW5QaXAxMFdhcm5pbmcsCiAgICAgICAgICAgICkKCiAgICAgICAgaWYgb3B0aW9ucy5saXN0X2Zvcm1hdCBpcyBOb25lOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAgICAgIlRoZSBkZWZhdWx0IGZvcm1hdCB3aWxsIHN3aXRjaCB0byBjb2x1bW5zIGluIHRoZSBmdXR1cmUuICIKICAgICAgICAgICAgICAgICJZb3UgY2FuIHVzZSAtLWZvcm1hdD0obGVnYWN5fGNvbHVtbnMpIChvciBkZWZpbmUgYSAiCiAgICAgICAgICAgICAgICAiZm9ybWF0PShsZWdhY3l8Y29sdW1ucykgaW4geW91ciBwaXAuY29uZiB1bmRlciB0aGUgW2xpc3RdICIKICAgICAgICAgICAgICAgICJzZWN0aW9uKSB0byBkaXNhYmxlIHRoaXMgd2FybmluZy4iLAogICAgICAgICAgICAgICAgUmVtb3ZlZEluUGlwMTBXYXJuaW5nLAogICAgICAgICAgICApCgogICAgICAgIGlmIG9wdGlvbnMub3V0ZGF0ZWQgYW5kIG9wdGlvbnMudXB0b2RhdGU6CiAgICAgICAgICAgIHJhaXNlIENvbW1hbmRFcnJvcigKICAgICAgICAgICAgICAgICJPcHRpb25zIC0tb3V0ZGF0ZWQgYW5kIC0tdXB0b2RhdGUgY2Fubm90IGJlIGNvbWJpbmVkLiIpCgogICAgICAgIHBhY2thZ2VzID0gZ2V0X2luc3RhbGxlZF9kaXN0cmlidXRpb25zKAogICAgICAgICAgICBsb2NhbF9vbmx5PW9wdGlvbnMubG9jYWwsCiAgICAgICAgICAgIHVzZXJfb25seT1vcHRpb25zLnVzZXIsCiAgICAgICAgICAgIGVkaXRhYmxlc19vbmx5PW9wdGlvbnMuZWRpdGFibGUsCiAgICAgICAgKQoKICAgICAgICBpZiBvcHRpb25zLm91dGRhdGVkOgogICAgICAgICAgICBwYWNrYWdlcyA9IHNlbGYuZ2V0X291dGRhdGVkKHBhY2thZ2VzLCBvcHRpb25zKQogICAgICAgIGVsaWYgb3B0aW9ucy51cHRvZGF0ZToKICAgICAgICAgICAgcGFja2FnZXMgPSBzZWxmLmdldF91cHRvZGF0ZShwYWNrYWdlcywgb3B0aW9ucykKCiAgICAgICAgaWYgb3B0aW9ucy5ub3RfcmVxdWlyZWQ6CiAgICAgICAgICAgIHBhY2thZ2VzID0gc2VsZi5nZXRfbm90X3JlcXVpcmVkKHBhY2thZ2VzLCBvcHRpb25zKQoKICAgICAgICBzZWxmLm91dHB1dF9wYWNrYWdlX2xpc3RpbmcocGFja2FnZXMsIG9wdGlvbnMpCgogICAgZGVmIGdldF9vdXRkYXRlZChzZWxmLCBwYWNrYWdlcywgb3B0aW9ucyk6CiAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgZGlzdCBmb3IgZGlzdCBpbiBzZWxmLml0ZXJfcGFja2FnZXNfbGF0ZXN0X2luZm9zKHBhY2thZ2VzLCBvcHRpb25zKQogICAgICAgICAgICBpZiBkaXN0LmxhdGVzdF92ZXJzaW9uID4gZGlzdC5wYXJzZWRfdmVyc2lvbgogICAgICAgIF0KCiAgICBkZWYgZ2V0X3VwdG9kYXRlKHNlbGYsIHBhY2thZ2VzLCBvcHRpb25zKToKICAgICAgICByZXR1cm4gWwogICAgICAgICAgICBkaXN0IGZvciBkaXN0IGluIHNlbGYuaXRlcl9wYWNrYWdlc19sYXRlc3RfaW5mb3MocGFja2FnZXMsIG9wdGlvbnMpCiAgICAgICAgICAgIGlmIGRpc3QubGF0ZXN0X3ZlcnNpb24gPT0gZGlzdC5wYXJzZWRfdmVyc2lvbgogICAgICAgIF0KCiAgICBkZWYgZ2V0X25vdF9yZXF1aXJlZChzZWxmLCBwYWNrYWdlcywgb3B0aW9ucyk6CiAgICAgICAgZGVwX2tleXMgPSBzZXQoKQogICAgICAgIGZvciBkaXN0IGluIHBhY2thZ2VzOgogICAgICAgICAgICBkZXBfa2V5cy51cGRhdGUocmVxdWlyZW1lbnQua2V5IGZvciByZXF1aXJlbWVudCBpbiBkaXN0LnJlcXVpcmVzKCkpCiAgICAgICAgcmV0dXJuIHNldChwa2cgZm9yIHBrZyBpbiBwYWNrYWdlcyBpZiBwa2cua2V5IG5vdCBpbiBkZXBfa2V5cykKCiAgICBkZWYgaXRlcl9wYWNrYWdlc19sYXRlc3RfaW5mb3Moc2VsZiwgcGFja2FnZXMsIG9wdGlvbnMpOgogICAgICAgIGluZGV4X3VybHMgPSBbb3B0aW9ucy5pbmRleF91cmxdICsgb3B0aW9ucy5leHRyYV9pbmRleF91cmxzCiAgICAgICAgaWYgb3B0aW9ucy5ub19pbmRleDoKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdJZ25vcmluZyBpbmRleGVzOiAlcycsICcsJy5qb2luKGluZGV4X3VybHMpKQogICAgICAgICAgICBpbmRleF91cmxzID0gW10KCiAgICAgICAgZGVwZW5kZW5jeV9saW5rcyA9IFtdCiAgICAgICAgZm9yIGRpc3QgaW4gcGFja2FnZXM6CiAgICAgICAgICAgIGlmIGRpc3QuaGFzX21ldGFkYXRhKCdkZXBlbmRlbmN5X2xpbmtzLnR4dCcpOgogICAgICAgICAgICAgICAgZGVwZW5kZW5jeV9saW5rcy5leHRlbmQoCiAgICAgICAgICAgICAgICAgICAgZGlzdC5nZXRfbWV0YWRhdGFfbGluZXMoJ2RlcGVuZGVuY3lfbGlua3MudHh0JyksCiAgICAgICAgICAgICAgICApCgogICAgICAgIHdpdGggc2VsZi5fYnVpbGRfc2Vzc2lvbihvcHRpb25zKSBhcyBzZXNzaW9uOgogICAgICAgICAgICBmaW5kZXIgPSBzZWxmLl9idWlsZF9wYWNrYWdlX2ZpbmRlcihvcHRpb25zLCBpbmRleF91cmxzLCBzZXNzaW9uKQogICAgICAgICAgICBmaW5kZXIuYWRkX2RlcGVuZGVuY3lfbGlua3MoZGVwZW5kZW5jeV9saW5rcykKCiAgICAgICAgICAgIGZvciBkaXN0IGluIHBhY2thZ2VzOgogICAgICAgICAgICAgICAgdHlwID0gJ3Vua25vd24nCiAgICAgICAgICAgICAgICBhbGxfY2FuZGlkYXRlcyA9IGZpbmRlci5maW5kX2FsbF9jYW5kaWRhdGVzKGRpc3Qua2V5KQogICAgICAgICAgICAgICAgaWYgbm90IG9wdGlvbnMucHJlOgogICAgICAgICAgICAgICAgICAgICMgUmVtb3ZlIHByZXJlbGVhc2VzCiAgICAgICAgICAgICAgICAgICAgYWxsX2NhbmRpZGF0ZXMgPSBbY2FuZGlkYXRlIGZvciBjYW5kaWRhdGUgaW4gYWxsX2NhbmRpZGF0ZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgY2FuZGlkYXRlLnZlcnNpb24uaXNfcHJlcmVsZWFzZV0KCiAgICAgICAgICAgICAgICBpZiBub3QgYWxsX2NhbmRpZGF0ZXM6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIGJlc3RfY2FuZGlkYXRlID0gbWF4KGFsbF9jYW5kaWRhdGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5PWZpbmRlci5fY2FuZGlkYXRlX3NvcnRfa2V5KQogICAgICAgICAgICAgICAgcmVtb3RlX3ZlcnNpb24gPSBiZXN0X2NhbmRpZGF0ZS52ZXJzaW9uCiAgICAgICAgICAgICAgICBpZiBiZXN0X2NhbmRpZGF0ZS5sb2NhdGlvbi5pc193aGVlbDoKICAgICAgICAgICAgICAgICAgICB0eXAgPSAnd2hlZWwnCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHR5cCA9ICdzZGlzdCcKICAgICAgICAgICAgICAgICMgVGhpcyBpcyBkaXJ0eSBidXQgbWFrZXMgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgbXVjaCBjbGVhbmVyCiAgICAgICAgICAgICAgICBkaXN0LmxhdGVzdF92ZXJzaW9uID0gcmVtb3RlX3ZlcnNpb24KICAgICAgICAgICAgICAgIGRpc3QubGF0ZXN0X2ZpbGV0eXBlID0gdHlwCiAgICAgICAgICAgICAgICB5aWVsZCBkaXN0CgogICAgZGVmIG91dHB1dF9sZWdhY3koc2VsZiwgZGlzdCk6CiAgICAgICAgaWYgZGlzdF9pc19lZGl0YWJsZShkaXN0KToKICAgICAgICAgICAgcmV0dXJuICclcyAoJXMsICVzKScgJSAoCiAgICAgICAgICAgICAgICBkaXN0LnByb2plY3RfbmFtZSwKICAgICAgICAgICAgICAgIGRpc3QudmVyc2lvbiwKICAgICAgICAgICAgICAgIGRpc3QubG9jYXRpb24sCiAgICAgICAgICAgICkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gJyVzICglcyknICUgKGRpc3QucHJvamVjdF9uYW1lLCBkaXN0LnZlcnNpb24pCgogICAgZGVmIG91dHB1dF9sZWdhY3lfbGF0ZXN0KHNlbGYsIGRpc3QpOgogICAgICAgIHJldHVybiAnJXMgLSBMYXRlc3Q6ICVzIFslc10nICUgKAogICAgICAgICAgICBzZWxmLm91dHB1dF9sZWdhY3koZGlzdCksCiAgICAgICAgICAgIGRpc3QubGF0ZXN0X3ZlcnNpb24sCiAgICAgICAgICAgIGRpc3QubGF0ZXN0X2ZpbGV0eXBlLAogICAgICAgICkKCiAgICBkZWYgb3V0cHV0X3BhY2thZ2VfbGlzdGluZyhzZWxmLCBwYWNrYWdlcywgb3B0aW9ucyk6CiAgICAgICAgcGFja2FnZXMgPSBzb3J0ZWQoCiAgICAgICAgICAgIHBhY2thZ2VzLAogICAgICAgICAgICBrZXk9bGFtYmRhIGRpc3Q6IGRpc3QucHJvamVjdF9uYW1lLmxvd2VyKCksCiAgICAgICAgKQogICAgICAgIGlmIG9wdGlvbnMubGlzdF9mb3JtYXQgPT0gJ2NvbHVtbnMnIGFuZCBwYWNrYWdlczoKICAgICAgICAgICAgZGF0YSwgaGVhZGVyID0gZm9ybWF0X2Zvcl9jb2x1bW5zKHBhY2thZ2VzLCBvcHRpb25zKQogICAgICAgICAgICBzZWxmLm91dHB1dF9wYWNrYWdlX2xpc3RpbmdfY29sdW1ucyhkYXRhLCBoZWFkZXIpCiAgICAgICAgZWxpZiBvcHRpb25zLmxpc3RfZm9ybWF0ID09ICdmcmVlemUnOgogICAgICAgICAgICBmb3IgZGlzdCBpbiBwYWNrYWdlczoKICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCIlcz09JXMiLCBkaXN0LnByb2plY3RfbmFtZSwgZGlzdC52ZXJzaW9uKQogICAgICAgIGVsaWYgb3B0aW9ucy5saXN0X2Zvcm1hdCA9PSAnanNvbic6CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGZvcm1hdF9mb3JfanNvbihwYWNrYWdlcywgb3B0aW9ucykpCiAgICAgICAgZWxzZTogICMgbGVnYWN5CiAgICAgICAgICAgIGZvciBkaXN0IGluIHBhY2thZ2VzOgogICAgICAgICAgICAgICAgaWYgb3B0aW9ucy5vdXRkYXRlZDoKICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhzZWxmLm91dHB1dF9sZWdhY3lfbGF0ZXN0KGRpc3QpKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhzZWxmLm91dHB1dF9sZWdhY3koZGlzdCkpCgogICAgZGVmIG91dHB1dF9wYWNrYWdlX2xpc3RpbmdfY29sdW1ucyhzZWxmLCBkYXRhLCBoZWFkZXIpOgogICAgICAgICMgaW5zZXJ0IHRoZSBoZWFkZXIgZmlyc3Q6IHdlIG5lZWQgdG8ga25vdyB0aGUgc2l6ZSBvZiBjb2x1bW4gbmFtZXMKICAgICAgICBpZiBsZW4oZGF0YSkgPiAwOgogICAgICAgICAgICBkYXRhLmluc2VydCgwLCBoZWFkZXIpCgogICAgICAgIHBrZ19zdHJpbmdzLCBzaXplcyA9IHRhYnVsYXRlKGRhdGEpCgogICAgICAgICMgQ3JlYXRlIGFuZCBhZGQgYSBzZXBhcmF0b3IuCiAgICAgICAgaWYgbGVuKGRhdGEpID4gMDoKICAgICAgICAgICAgcGtnX3N0cmluZ3MuaW5zZXJ0KDEsICIgIi5qb2luKG1hcChsYW1iZGEgeDogJy0nICogeCwgc2l6ZXMpKSkKCiAgICAgICAgZm9yIHZhbCBpbiBwa2dfc3RyaW5nczoKICAgICAgICAgICAgbG9nZ2VyLmluZm8odmFsKQoKCmRlZiB0YWJ1bGF0ZSh2YWxzKToKICAgICMgRnJvbSBwZm1vb3JlIG9uIEdpdEh1YjoKICAgICMgaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvcGlwL2lzc3Vlcy8zNjUxI2lzc3VlY29tbWVudC0yMTY5MzI1NjQKICAgIGFzc2VydCBsZW4odmFscykgPiAwCgogICAgc2l6ZXMgPSBbMF0gKiBtYXgobGVuKHgpIGZvciB4IGluIHZhbHMpCiAgICBmb3Igcm93IGluIHZhbHM6CiAgICAgICAgc2l6ZXMgPSBbbWF4KHMsIGxlbihzdHIoYykpKSBmb3IgcywgYyBpbiB6aXBfbG9uZ2VzdChzaXplcywgcm93KV0KCiAgICByZXN1bHQgPSBbXQogICAgZm9yIHJvdyBpbiB2YWxzOgogICAgICAgIGRpc3BsYXkgPSAiICIuam9pbihbc3RyKGMpLmxqdXN0KHMpIGlmIGMgaXMgbm90IE5vbmUgZWxzZSAnJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHMsIGMgaW4gemlwX2xvbmdlc3Qoc2l6ZXMsIHJvdyldKQogICAgICAgIHJlc3VsdC5hcHBlbmQoZGlzcGxheSkKCiAgICByZXR1cm4gcmVzdWx0LCBzaXplcwoKCmRlZiBmb3JtYXRfZm9yX2NvbHVtbnMocGtncywgb3B0aW9ucyk6CiAgICAiIiIKICAgIENvbnZlcnQgdGhlIHBhY2thZ2UgZGF0YSBpbnRvIHNvbWV0aGluZyB1c2FibGUKICAgIGJ5IG91dHB1dF9wYWNrYWdlX2xpc3RpbmdfY29sdW1ucy4KICAgICIiIgogICAgcnVubmluZ19vdXRkYXRlZCA9IG9wdGlvbnMub3V0ZGF0ZWQKICAgICMgQWRqdXN0IHRoZSBoZWFkZXIgZm9yIHRoZSBgcGlwIGxpc3QgLS1vdXRkYXRlZGAgY2FzZS4KICAgIGlmIHJ1bm5pbmdfb3V0ZGF0ZWQ6CiAgICAgICAgaGVhZGVyID0gWyJQYWNrYWdlIiwgIlZlcnNpb24iLCAiTGF0ZXN0IiwgIlR5cGUiXQogICAgZWxzZToKICAgICAgICBoZWFkZXIgPSBbIlBhY2thZ2UiLCAiVmVyc2lvbiJdCgogICAgZGF0YSA9IFtdCiAgICBpZiBhbnkoZGlzdF9pc19lZGl0YWJsZSh4KSBmb3IgeCBpbiBwa2dzKToKICAgICAgICBoZWFkZXIuYXBwZW5kKCJMb2NhdGlvbiIpCgogICAgZm9yIHByb2ogaW4gcGtnczoKICAgICAgICAjIGlmIHdlJ3JlIHdvcmtpbmcgb24gdGhlICdvdXRkYXRlZCcgbGlzdCwgc2VwYXJhdGUgb3V0IHRoZQogICAgICAgICMgbGF0ZXN0X3ZlcnNpb24gYW5kIHR5cGUKICAgICAgICByb3cgPSBbcHJvai5wcm9qZWN0X25hbWUsIHByb2oudmVyc2lvbl0KCiAgICAgICAgaWYgcnVubmluZ19vdXRkYXRlZDoKICAgICAgICAgICAgcm93LmFwcGVuZChwcm9qLmxhdGVzdF92ZXJzaW9uKQogICAgICAgICAgICByb3cuYXBwZW5kKHByb2oubGF0ZXN0X2ZpbGV0eXBlKQoKICAgICAgICBpZiBkaXN0X2lzX2VkaXRhYmxlKHByb2opOgogICAgICAgICAgICByb3cuYXBwZW5kKHByb2oubG9jYXRpb24pCgogICAgICAgIGRhdGEuYXBwZW5kKHJvdykKCiAgICByZXR1cm4gZGF0YSwgaGVhZGVyCgoKZGVmIGZvcm1hdF9mb3JfanNvbihwYWNrYWdlcywgb3B0aW9ucyk6CiAgICBkYXRhID0gW10KICAgIGZvciBkaXN0IGluIHBhY2thZ2VzOgogICAgICAgIGluZm8gPSB7CiAgICAgICAgICAgICduYW1lJzogZGlzdC5wcm9qZWN0X25hbWUsCiAgICAgICAgICAgICd2ZXJzaW9uJzogc2l4LnRleHRfdHlwZShkaXN0LnZlcnNpb24pLAogICAgICAgIH0KICAgICAgICBpZiBvcHRpb25zLm91dGRhdGVkOgogICAgICAgICAgICBpbmZvWydsYXRlc3RfdmVyc2lvbiddID0gc2l4LnRleHRfdHlwZShkaXN0LmxhdGVzdF92ZXJzaW9uKQogICAgICAgICAgICBpbmZvWydsYXRlc3RfZmlsZXR5cGUnXSA9IGRpc3QubGF0ZXN0X2ZpbGV0eXBlCiAgICAgICAgZGF0YS5hcHBlbmQoaW5mbykKICAgIHJldHVybiBqc29uLmR1bXBzKGRhdGEpClBLAwQUAAAAAAAAACEArkKE3JYRAACWEQAAJgAAAHB5cGlfX3BpcF85XzBfMy9waXAvY29tbWFuZHMvc2VhcmNoLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBsb2dnaW5nCmltcG9ydCBzeXMKaW1wb3J0IHRleHR3cmFwCgpmcm9tIHBpcC5iYXNlY29tbWFuZCBpbXBvcnQgQ29tbWFuZCwgU1VDQ0VTUwpmcm9tIHBpcC5jb21wYXQgaW1wb3J0IE9yZGVyZWREaWN0CmZyb20gcGlwLmRvd25sb2FkIGltcG9ydCBQaXBYbWxycGNUcmFuc3BvcnQKZnJvbSBwaXAubW9kZWxzIGltcG9ydCBQeVBJCmZyb20gcGlwLnV0aWxzIGltcG9ydCBnZXRfdGVybWluYWxfc2l6ZQpmcm9tIHBpcC51dGlscy5sb2dnaW5nIGltcG9ydCBpbmRlbnRfbG9nCmZyb20gcGlwLmV4Y2VwdGlvbnMgaW1wb3J0IENvbW1hbmRFcnJvcgpmcm9tIHBpcC5zdGF0dXNfY29kZXMgaW1wb3J0IE5PX01BVENIRVNfRk9VTkQKZnJvbSBwaXAuX3ZlbmRvci5wYWNrYWdpbmcudmVyc2lvbiBpbXBvcnQgcGFyc2UgYXMgcGFyc2VfdmVyc2lvbgpmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCBwa2dfcmVzb3VyY2VzCmZyb20gcGlwLl92ZW5kb3Iuc2l4Lm1vdmVzIGltcG9ydCB4bWxycGNfY2xpZW50CgoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKY2xhc3MgU2VhcmNoQ29tbWFuZChDb21tYW5kKToKICAgICIiIlNlYXJjaCBmb3IgUHlQSSBwYWNrYWdlcyB3aG9zZSBuYW1lIG9yIHN1bW1hcnkgY29udGFpbnMgPHF1ZXJ5Pi4iIiIKICAgIG5hbWUgPSAnc2VhcmNoJwogICAgdXNhZ2UgPSAiIiIKICAgICAgJXByb2cgW29wdGlvbnNdIDxxdWVyeT4iIiIKICAgIHN1bW1hcnkgPSAnU2VhcmNoIFB5UEkgZm9yIHBhY2thZ2VzLicKCiAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3cpOgogICAgICAgIHN1cGVyKFNlYXJjaENvbW1hbmQsIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3KQogICAgICAgIHNlbGYuY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy1pJywgJy0taW5kZXgnLAogICAgICAgICAgICBkZXN0PSdpbmRleCcsCiAgICAgICAgICAgIG1ldGF2YXI9J1VSTCcsCiAgICAgICAgICAgIGRlZmF1bHQ9UHlQSS5weXBpX3VybCwKICAgICAgICAgICAgaGVscD0nQmFzZSBVUkwgb2YgUHl0aG9uIFBhY2thZ2UgSW5kZXggKGRlZmF1bHQgJWRlZmF1bHQpJykKCiAgICAgICAgc2VsZi5wYXJzZXIuaW5zZXJ0X29wdGlvbl9ncm91cCgwLCBzZWxmLmNtZF9vcHRzKQoKICAgIGRlZiBydW4oc2VsZiwgb3B0aW9ucywgYXJncyk6CiAgICAgICAgaWYgbm90IGFyZ3M6CiAgICAgICAgICAgIHJhaXNlIENvbW1hbmRFcnJvcignTWlzc2luZyByZXF1aXJlZCBhcmd1bWVudCAoc2VhcmNoIHF1ZXJ5KS4nKQogICAgICAgIHF1ZXJ5ID0gYXJncwogICAgICAgIHB5cGlfaGl0cyA9IHNlbGYuc2VhcmNoKHF1ZXJ5LCBvcHRpb25zKQogICAgICAgIGhpdHMgPSB0cmFuc2Zvcm1faGl0cyhweXBpX2hpdHMpCgogICAgICAgIHRlcm1pbmFsX3dpZHRoID0gTm9uZQogICAgICAgIGlmIHN5cy5zdGRvdXQuaXNhdHR5KCk6CiAgICAgICAgICAgIHRlcm1pbmFsX3dpZHRoID0gZ2V0X3Rlcm1pbmFsX3NpemUoKVswXQoKICAgICAgICBwcmludF9yZXN1bHRzKGhpdHMsIHRlcm1pbmFsX3dpZHRoPXRlcm1pbmFsX3dpZHRoKQogICAgICAgIGlmIHB5cGlfaGl0czoKICAgICAgICAgICAgcmV0dXJuIFNVQ0NFU1MKICAgICAgICByZXR1cm4gTk9fTUFUQ0hFU19GT1VORAoKICAgIGRlZiBzZWFyY2goc2VsZiwgcXVlcnksIG9wdGlvbnMpOgogICAgICAgIGluZGV4X3VybCA9IG9wdGlvbnMuaW5kZXgKICAgICAgICB3aXRoIHNlbGYuX2J1aWxkX3Nlc3Npb24ob3B0aW9ucykgYXMgc2Vzc2lvbjoKICAgICAgICAgICAgdHJhbnNwb3J0ID0gUGlwWG1scnBjVHJhbnNwb3J0KGluZGV4X3VybCwgc2Vzc2lvbikKICAgICAgICAgICAgcHlwaSA9IHhtbHJwY19jbGllbnQuU2VydmVyUHJveHkoaW5kZXhfdXJsLCB0cmFuc3BvcnQpCiAgICAgICAgICAgIGhpdHMgPSBweXBpLnNlYXJjaCh7J25hbWUnOiBxdWVyeSwgJ3N1bW1hcnknOiBxdWVyeX0sICdvcicpCiAgICAgICAgICAgIHJldHVybiBoaXRzCgoKZGVmIHRyYW5zZm9ybV9oaXRzKGhpdHMpOgogICAgIiIiCiAgICBUaGUgbGlzdCBmcm9tIHB5cGkgaXMgcmVhbGx5IGEgbGlzdCBvZiB2ZXJzaW9ucy4gV2Ugd2FudCBhIGxpc3Qgb2YKICAgIHBhY2thZ2VzIHdpdGggdGhlIGxpc3Qgb2YgdmVyc2lvbnMgc3RvcmVkIGlubGluZS4gVGhpcyBjb252ZXJ0cyB0aGUKICAgIGxpc3QgZnJvbSBweXBpIGludG8gb25lIHdlIGNhbiB1c2UuCiAgICAiIiIKICAgIHBhY2thZ2VzID0gT3JkZXJlZERpY3QoKQogICAgZm9yIGhpdCBpbiBoaXRzOgogICAgICAgIG5hbWUgPSBoaXRbJ25hbWUnXQogICAgICAgIHN1bW1hcnkgPSBoaXRbJ3N1bW1hcnknXQogICAgICAgIHZlcnNpb24gPSBoaXRbJ3ZlcnNpb24nXQoKICAgICAgICBpZiBuYW1lIG5vdCBpbiBwYWNrYWdlcy5rZXlzKCk6CiAgICAgICAgICAgIHBhY2thZ2VzW25hbWVdID0gewogICAgICAgICAgICAgICAgJ25hbWUnOiBuYW1lLAogICAgICAgICAgICAgICAgJ3N1bW1hcnknOiBzdW1tYXJ5LAogICAgICAgICAgICAgICAgJ3ZlcnNpb25zJzogW3ZlcnNpb25dLAogICAgICAgICAgICB9CiAgICAgICAgZWxzZToKICAgICAgICAgICAgcGFja2FnZXNbbmFtZV1bJ3ZlcnNpb25zJ10uYXBwZW5kKHZlcnNpb24pCgogICAgICAgICAgICAjIGlmIHRoaXMgaXMgdGhlIGhpZ2hlc3QgdmVyc2lvbiwgcmVwbGFjZSBzdW1tYXJ5IGFuZCBzY29yZQogICAgICAgICAgICBpZiB2ZXJzaW9uID09IGhpZ2hlc3RfdmVyc2lvbihwYWNrYWdlc1tuYW1lXVsndmVyc2lvbnMnXSk6CiAgICAgICAgICAgICAgICBwYWNrYWdlc1tuYW1lXVsnc3VtbWFyeSddID0gc3VtbWFyeQoKICAgIHJldHVybiBsaXN0KHBhY2thZ2VzLnZhbHVlcygpKQoKCmRlZiBwcmludF9yZXN1bHRzKGhpdHMsIG5hbWVfY29sdW1uX3dpZHRoPU5vbmUsIHRlcm1pbmFsX3dpZHRoPU5vbmUpOgogICAgaWYgbm90IGhpdHM6CiAgICAgICAgcmV0dXJuCiAgICBpZiBuYW1lX2NvbHVtbl93aWR0aCBpcyBOb25lOgogICAgICAgIG5hbWVfY29sdW1uX3dpZHRoID0gbWF4KFsKICAgICAgICAgICAgbGVuKGhpdFsnbmFtZSddKSArIGxlbihoaXQuZ2V0KCd2ZXJzaW9ucycsIFsnLSddKVstMV0pCiAgICAgICAgICAgIGZvciBoaXQgaW4gaGl0cwogICAgICAgIF0pICsgNAoKICAgIGluc3RhbGxlZF9wYWNrYWdlcyA9IFtwLnByb2plY3RfbmFtZSBmb3IgcCBpbiBwa2dfcmVzb3VyY2VzLndvcmtpbmdfc2V0XQogICAgZm9yIGhpdCBpbiBoaXRzOgogICAgICAgIG5hbWUgPSBoaXRbJ25hbWUnXQogICAgICAgIHN1bW1hcnkgPSBoaXRbJ3N1bW1hcnknXSBvciAnJwogICAgICAgIHZlcnNpb24gPSBoaXQuZ2V0KCd2ZXJzaW9ucycsIFsnLSddKVstMV0KICAgICAgICBpZiB0ZXJtaW5hbF93aWR0aCBpcyBub3QgTm9uZToKICAgICAgICAgICAgdGFyZ2V0X3dpZHRoID0gdGVybWluYWxfd2lkdGggLSBuYW1lX2NvbHVtbl93aWR0aCAtIDUKICAgICAgICAgICAgaWYgdGFyZ2V0X3dpZHRoID4gMTA6CiAgICAgICAgICAgICAgICAjIHdyYXAgYW5kIGluZGVudCBzdW1tYXJ5IHRvIGZpdCB0ZXJtaW5hbAogICAgICAgICAgICAgICAgc3VtbWFyeSA9IHRleHR3cmFwLndyYXAoc3VtbWFyeSwgdGFyZ2V0X3dpZHRoKQogICAgICAgICAgICAgICAgc3VtbWFyeSA9ICgnXG4nICsgJyAnICogKG5hbWVfY29sdW1uX3dpZHRoICsgMykpLmpvaW4oc3VtbWFyeSkKCiAgICAgICAgbGluZSA9ICclLSpzIC0gJXMnICUgKG5hbWVfY29sdW1uX3dpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXMgKCVzKScgJSAobmFtZSwgdmVyc2lvbiksIHN1bW1hcnkpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBsb2dnZXIuaW5mbyhsaW5lKQogICAgICAgICAgICBpZiBuYW1lIGluIGluc3RhbGxlZF9wYWNrYWdlczoKICAgICAgICAgICAgICAgIGRpc3QgPSBwa2dfcmVzb3VyY2VzLmdldF9kaXN0cmlidXRpb24obmFtZSkKICAgICAgICAgICAgICAgIHdpdGggaW5kZW50X2xvZygpOgogICAgICAgICAgICAgICAgICAgIGxhdGVzdCA9IGhpZ2hlc3RfdmVyc2lvbihoaXRbJ3ZlcnNpb25zJ10pCiAgICAgICAgICAgICAgICAgICAgaWYgZGlzdC52ZXJzaW9uID09IGxhdGVzdDoKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ0lOU1RBTExFRDogJXMgKGxhdGVzdCknLCBkaXN0LnZlcnNpb24pCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ0lOU1RBTExFRDogJXMnLCBkaXN0LnZlcnNpb24pCiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdMQVRFU1Q6ICAgICVzJywgbGF0ZXN0KQogICAgICAgIGV4Y2VwdCBVbmljb2RlRW5jb2RlRXJyb3I6CiAgICAgICAgICAgIHBhc3MKCgpkZWYgaGlnaGVzdF92ZXJzaW9uKHZlcnNpb25zKToKICAgIHJldHVybiBtYXgodmVyc2lvbnMsIGtleT1wYXJzZV92ZXJzaW9uKQpQSwMEFAAAAAAAAAAhAAxTHyQDFwAAAxcAACQAAABweXBpX19waXBfOV8wXzMvcGlwL2NvbW1hbmRzL3Nob3cucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKZnJvbSBlbWFpbC5wYXJzZXIgaW1wb3J0IEZlZWRQYXJzZXIKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG9zCgpmcm9tIHBpcC5iYXNlY29tbWFuZCBpbXBvcnQgQ29tbWFuZApmcm9tIHBpcC5zdGF0dXNfY29kZXMgaW1wb3J0IFNVQ0NFU1MsIEVSUk9SCmZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IHBrZ19yZXNvdXJjZXMKZnJvbSBwaXAuX3ZlbmRvci5wYWNrYWdpbmcudXRpbHMgaW1wb3J0IGNhbm9uaWNhbGl6ZV9uYW1lCgoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKY2xhc3MgU2hvd0NvbW1hbmQoQ29tbWFuZCk6CiAgICAiIiJTaG93IGluZm9ybWF0aW9uIGFib3V0IG9uZSBvciBtb3JlIGluc3RhbGxlZCBwYWNrYWdlcy4iIiIKICAgIG5hbWUgPSAnc2hvdycKICAgIHVzYWdlID0gIiIiCiAgICAgICVwcm9nIFtvcHRpb25zXSA8cGFja2FnZT4gLi4uIiIiCiAgICBzdW1tYXJ5ID0gJ1Nob3cgaW5mb3JtYXRpb24gYWJvdXQgaW5zdGFsbGVkIHBhY2thZ2VzLicKCiAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3cpOgogICAgICAgIHN1cGVyKFNob3dDb21tYW5kLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprdykKICAgICAgICBzZWxmLmNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctZicsICctLWZpbGVzJywKICAgICAgICAgICAgZGVzdD0nZmlsZXMnLAogICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAogICAgICAgICAgICBkZWZhdWx0PUZhbHNlLAogICAgICAgICAgICBoZWxwPSdTaG93IHRoZSBmdWxsIGxpc3Qgb2YgaW5zdGFsbGVkIGZpbGVzIGZvciBlYWNoIHBhY2thZ2UuJykKCiAgICAgICAgc2VsZi5wYXJzZXIuaW5zZXJ0X29wdGlvbl9ncm91cCgwLCBzZWxmLmNtZF9vcHRzKQoKICAgIGRlZiBydW4oc2VsZiwgb3B0aW9ucywgYXJncyk6CiAgICAgICAgaWYgbm90IGFyZ3M6CiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdFUlJPUjogUGxlYXNlIHByb3ZpZGUgYSBwYWNrYWdlIG5hbWUgb3IgbmFtZXMuJykKICAgICAgICAgICAgcmV0dXJuIEVSUk9SCiAgICAgICAgcXVlcnkgPSBhcmdzCgogICAgICAgIHJlc3VsdHMgPSBzZWFyY2hfcGFja2FnZXNfaW5mbyhxdWVyeSkKICAgICAgICBpZiBub3QgcHJpbnRfcmVzdWx0cygKICAgICAgICAgICAgICAgIHJlc3VsdHMsIGxpc3RfZmlsZXM9b3B0aW9ucy5maWxlcywgdmVyYm9zZT1vcHRpb25zLnZlcmJvc2UpOgogICAgICAgICAgICByZXR1cm4gRVJST1IKICAgICAgICByZXR1cm4gU1VDQ0VTUwoKCmRlZiBzZWFyY2hfcGFja2FnZXNfaW5mbyhxdWVyeSk6CiAgICAiIiIKICAgIEdhdGhlciBkZXRhaWxzIGZyb20gaW5zdGFsbGVkIGRpc3RyaWJ1dGlvbnMuIFByaW50IGRpc3RyaWJ1dGlvbiBuYW1lLAogICAgdmVyc2lvbiwgbG9jYXRpb24sIGFuZCBpbnN0YWxsZWQgZmlsZXMuIEluc3RhbGxlZCBmaWxlcyByZXF1aXJlcyBhCiAgICBwaXAgZ2VuZXJhdGVkICdpbnN0YWxsZWQtZmlsZXMudHh0JyBpbiB0aGUgZGlzdHJpYnV0aW9ucyAnLmVnZy1pbmZvJwogICAgZGlyZWN0b3J5LgogICAgIiIiCiAgICBpbnN0YWxsZWQgPSB7fQogICAgZm9yIHAgaW4gcGtnX3Jlc291cmNlcy53b3JraW5nX3NldDoKICAgICAgICBpbnN0YWxsZWRbY2Fub25pY2FsaXplX25hbWUocC5wcm9qZWN0X25hbWUpXSA9IHAKCiAgICBxdWVyeV9uYW1lcyA9IFtjYW5vbmljYWxpemVfbmFtZShuYW1lKSBmb3IgbmFtZSBpbiBxdWVyeV0KCiAgICBmb3IgZGlzdCBpbiBbaW5zdGFsbGVkW3BrZ10gZm9yIHBrZyBpbiBxdWVyeV9uYW1lcyBpZiBwa2cgaW4gaW5zdGFsbGVkXToKICAgICAgICBwYWNrYWdlID0gewogICAgICAgICAgICAnbmFtZSc6IGRpc3QucHJvamVjdF9uYW1lLAogICAgICAgICAgICAndmVyc2lvbic6IGRpc3QudmVyc2lvbiwKICAgICAgICAgICAgJ2xvY2F0aW9uJzogZGlzdC5sb2NhdGlvbiwKICAgICAgICAgICAgJ3JlcXVpcmVzJzogW2RlcC5wcm9qZWN0X25hbWUgZm9yIGRlcCBpbiBkaXN0LnJlcXVpcmVzKCldLAogICAgICAgIH0KICAgICAgICBmaWxlX2xpc3QgPSBOb25lCiAgICAgICAgbWV0YWRhdGEgPSBOb25lCiAgICAgICAgaWYgaXNpbnN0YW5jZShkaXN0LCBwa2dfcmVzb3VyY2VzLkRpc3RJbmZvRGlzdHJpYnV0aW9uKToKICAgICAgICAgICAgIyBSRUNPUkRzIHNob3VsZCBiZSBwYXJ0IG9mIC5kaXN0LWluZm8gbWV0YWRhdGFzCiAgICAgICAgICAgIGlmIGRpc3QuaGFzX21ldGFkYXRhKCdSRUNPUkQnKToKICAgICAgICAgICAgICAgIGxpbmVzID0gZGlzdC5nZXRfbWV0YWRhdGFfbGluZXMoJ1JFQ09SRCcpCiAgICAgICAgICAgICAgICBwYXRocyA9IFtsLnNwbGl0KCcsJylbMF0gZm9yIGwgaW4gbGluZXNdCiAgICAgICAgICAgICAgICBwYXRocyA9IFtvcy5wYXRoLmpvaW4oZGlzdC5sb2NhdGlvbiwgcCkgZm9yIHAgaW4gcGF0aHNdCiAgICAgICAgICAgICAgICBmaWxlX2xpc3QgPSBbb3MucGF0aC5yZWxwYXRoKHAsIGRpc3QubG9jYXRpb24pIGZvciBwIGluIHBhdGhzXQoKICAgICAgICAgICAgaWYgZGlzdC5oYXNfbWV0YWRhdGEoJ01FVEFEQVRBJyk6CiAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IGRpc3QuZ2V0X21ldGFkYXRhKCdNRVRBREFUQScpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBPdGhlcndpc2UgdXNlIHBpcCdzIGxvZyBmb3IgLmVnZy1pbmZvJ3MKICAgICAgICAgICAgaWYgZGlzdC5oYXNfbWV0YWRhdGEoJ2luc3RhbGxlZC1maWxlcy50eHQnKToKICAgICAgICAgICAgICAgIHBhdGhzID0gZGlzdC5nZXRfbWV0YWRhdGFfbGluZXMoJ2luc3RhbGxlZC1maWxlcy50eHQnKQogICAgICAgICAgICAgICAgcGF0aHMgPSBbb3MucGF0aC5qb2luKGRpc3QuZWdnX2luZm8sIHApIGZvciBwIGluIHBhdGhzXQogICAgICAgICAgICAgICAgZmlsZV9saXN0ID0gW29zLnBhdGgucmVscGF0aChwLCBkaXN0LmxvY2F0aW9uKSBmb3IgcCBpbiBwYXRoc10KCiAgICAgICAgICAgIGlmIGRpc3QuaGFzX21ldGFkYXRhKCdQS0ctSU5GTycpOgogICAgICAgICAgICAgICAgbWV0YWRhdGEgPSBkaXN0LmdldF9tZXRhZGF0YSgnUEtHLUlORk8nKQoKICAgICAgICBpZiBkaXN0Lmhhc19tZXRhZGF0YSgnZW50cnlfcG9pbnRzLnR4dCcpOgogICAgICAgICAgICBlbnRyeV9wb2ludHMgPSBkaXN0LmdldF9tZXRhZGF0YV9saW5lcygnZW50cnlfcG9pbnRzLnR4dCcpCiAgICAgICAgICAgIHBhY2thZ2VbJ2VudHJ5X3BvaW50cyddID0gZW50cnlfcG9pbnRzCgogICAgICAgIGlmIGRpc3QuaGFzX21ldGFkYXRhKCdJTlNUQUxMRVInKToKICAgICAgICAgICAgZm9yIGxpbmUgaW4gZGlzdC5nZXRfbWV0YWRhdGFfbGluZXMoJ0lOU1RBTExFUicpOgogICAgICAgICAgICAgICAgaWYgbGluZS5zdHJpcCgpOgogICAgICAgICAgICAgICAgICAgIHBhY2thZ2VbJ2luc3RhbGxlciddID0gbGluZS5zdHJpcCgpCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgIyBAdG9kbzogU2hvdWxkIHBrZ19yZXNvdXJjZXMuRGlzdHJpYnV0aW9uIGhhdmUgYQogICAgICAgICMgYGdldF9wa2dfaW5mb2AgbWV0aG9kPwogICAgICAgIGZlZWRfcGFyc2VyID0gRmVlZFBhcnNlcigpCiAgICAgICAgZmVlZF9wYXJzZXIuZmVlZChtZXRhZGF0YSkKICAgICAgICBwa2dfaW5mb19kaWN0ID0gZmVlZF9wYXJzZXIuY2xvc2UoKQogICAgICAgIGZvciBrZXkgaW4gKCdtZXRhZGF0YS12ZXJzaW9uJywgJ3N1bW1hcnknLAogICAgICAgICAgICAgICAgICAgICdob21lLXBhZ2UnLCAnYXV0aG9yJywgJ2F1dGhvci1lbWFpbCcsICdsaWNlbnNlJyk6CiAgICAgICAgICAgIHBhY2thZ2Vba2V5XSA9IHBrZ19pbmZvX2RpY3QuZ2V0KGtleSkKCiAgICAgICAgIyBJdCBsb29rcyBsaWtlIEZlZWRQYXJzZXIgY2Fubm90IGRlYWwgd2l0aCByZXBlYXRlZCBoZWFkZXJzCiAgICAgICAgY2xhc3NpZmllcnMgPSBbXQogICAgICAgIGZvciBsaW5lIGluIG1ldGFkYXRhLnNwbGl0bGluZXMoKToKICAgICAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCdDbGFzc2lmaWVyOiAnKToKICAgICAgICAgICAgICAgIGNsYXNzaWZpZXJzLmFwcGVuZChsaW5lW2xlbignQ2xhc3NpZmllcjogJyk6XSkKICAgICAgICBwYWNrYWdlWydjbGFzc2lmaWVycyddID0gY2xhc3NpZmllcnMKCiAgICAgICAgaWYgZmlsZV9saXN0OgogICAgICAgICAgICBwYWNrYWdlWydmaWxlcyddID0gc29ydGVkKGZpbGVfbGlzdCkKICAgICAgICB5aWVsZCBwYWNrYWdlCgoKZGVmIHByaW50X3Jlc3VsdHMoZGlzdHJpYnV0aW9ucywgbGlzdF9maWxlcz1GYWxzZSwgdmVyYm9zZT1GYWxzZSk6CiAgICAiIiIKICAgIFByaW50IHRoZSBpbmZvcm1hdGlvbnMgZnJvbSBpbnN0YWxsZWQgZGlzdHJpYnV0aW9ucyBmb3VuZC4KICAgICIiIgogICAgcmVzdWx0c19wcmludGVkID0gRmFsc2UKICAgIGZvciBpLCBkaXN0IGluIGVudW1lcmF0ZShkaXN0cmlidXRpb25zKToKICAgICAgICByZXN1bHRzX3ByaW50ZWQgPSBUcnVlCiAgICAgICAgaWYgaSA+IDA6CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCItLS0iKQogICAgICAgIGxvZ2dlci5pbmZvKCJOYW1lOiAlcyIsIGRpc3QuZ2V0KCduYW1lJywgJycpKQogICAgICAgIGxvZ2dlci5pbmZvKCJWZXJzaW9uOiAlcyIsIGRpc3QuZ2V0KCd2ZXJzaW9uJywgJycpKQogICAgICAgIGxvZ2dlci5pbmZvKCJTdW1tYXJ5OiAlcyIsIGRpc3QuZ2V0KCdzdW1tYXJ5JywgJycpKQogICAgICAgIGxvZ2dlci5pbmZvKCJIb21lLXBhZ2U6ICVzIiwgZGlzdC5nZXQoJ2hvbWUtcGFnZScsICcnKSkKICAgICAgICBsb2dnZXIuaW5mbygiQXV0aG9yOiAlcyIsIGRpc3QuZ2V0KCdhdXRob3InLCAnJykpCiAgICAgICAgbG9nZ2VyLmluZm8oIkF1dGhvci1lbWFpbDogJXMiLCBkaXN0LmdldCgnYXV0aG9yLWVtYWlsJywgJycpKQogICAgICAgIGxvZ2dlci5pbmZvKCJMaWNlbnNlOiAlcyIsIGRpc3QuZ2V0KCdsaWNlbnNlJywgJycpKQogICAgICAgIGxvZ2dlci5pbmZvKCJMb2NhdGlvbjogJXMiLCBkaXN0LmdldCgnbG9jYXRpb24nLCAnJykpCiAgICAgICAgbG9nZ2VyLmluZm8oIlJlcXVpcmVzOiAlcyIsICcsICcuam9pbihkaXN0LmdldCgncmVxdWlyZXMnLCBbXSkpKQogICAgICAgIGlmIHZlcmJvc2U6CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJNZXRhZGF0YS1WZXJzaW9uOiAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3QuZ2V0KCdtZXRhZGF0YS12ZXJzaW9uJywgJycpKQogICAgICAgICAgICBsb2dnZXIuaW5mbygiSW5zdGFsbGVyOiAlcyIsIGRpc3QuZ2V0KCdpbnN0YWxsZXInLCAnJykpCiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJDbGFzc2lmaWVyczoiKQogICAgICAgICAgICBmb3IgY2xhc3NpZmllciBpbiBkaXN0LmdldCgnY2xhc3NpZmllcnMnLCBbXSk6CiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiICAlcyIsIGNsYXNzaWZpZXIpCiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJFbnRyeS1wb2ludHM6IikKICAgICAgICAgICAgZm9yIGVudHJ5IGluIGRpc3QuZ2V0KCdlbnRyeV9wb2ludHMnLCBbXSk6CiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiICAlcyIsIGVudHJ5LnN0cmlwKCkpCiAgICAgICAgaWYgbGlzdF9maWxlczoKICAgICAgICAgICAgbG9nZ2VyLmluZm8oIkZpbGVzOiIpCiAgICAgICAgICAgIGZvciBsaW5lIGluIGRpc3QuZ2V0KCdmaWxlcycsIFtdKToKICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCIgICVzIiwgbGluZS5zdHJpcCgpKQogICAgICAgICAgICBpZiAiZmlsZXMiIG5vdCBpbiBkaXN0OgogICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIkNhbm5vdCBsb2NhdGUgaW5zdGFsbGVkLWZpbGVzLnR4dCIpCiAgICByZXR1cm4gcmVzdWx0c19wcmludGVkClBLAwQUAAAAAAAAACEAq4kZP0QLAABECwAAKQAAAHB5cGlfX3BpcF85XzBfMy9waXAvY29tbWFuZHMvdW5pbnN0YWxsLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBwaXAKZnJvbSBwaXAud2hlZWwgaW1wb3J0IFdoZWVsQ2FjaGUKZnJvbSBwaXAucmVxIGltcG9ydCBJbnN0YWxsUmVxdWlyZW1lbnQsIFJlcXVpcmVtZW50U2V0LCBwYXJzZV9yZXF1aXJlbWVudHMKZnJvbSBwaXAuYmFzZWNvbW1hbmQgaW1wb3J0IENvbW1hbmQKZnJvbSBwaXAuZXhjZXB0aW9ucyBpbXBvcnQgSW5zdGFsbGF0aW9uRXJyb3IKCgpjbGFzcyBVbmluc3RhbGxDb21tYW5kKENvbW1hbmQpOgogICAgIiIiCiAgICBVbmluc3RhbGwgcGFja2FnZXMuCgogICAgcGlwIGlzIGFibGUgdG8gdW5pbnN0YWxsIG1vc3QgaW5zdGFsbGVkIHBhY2thZ2VzLiBLbm93biBleGNlcHRpb25zIGFyZToKCiAgICAtIFB1cmUgZGlzdHV0aWxzIHBhY2thZ2VzIGluc3RhbGxlZCB3aXRoIGBgcHl0aG9uIHNldHVwLnB5IGluc3RhbGxgYCwgd2hpY2gKICAgICAgbGVhdmUgYmVoaW5kIG5vIG1ldGFkYXRhIHRvIGRldGVybWluZSB3aGF0IGZpbGVzIHdlcmUgaW5zdGFsbGVkLgogICAgLSBTY3JpcHQgd3JhcHBlcnMgaW5zdGFsbGVkIGJ5IGBgcHl0aG9uIHNldHVwLnB5IGRldmVsb3BgYC4KICAgICIiIgogICAgbmFtZSA9ICd1bmluc3RhbGwnCiAgICB1c2FnZSA9ICIiIgogICAgICAlcHJvZyBbb3B0aW9uc10gPHBhY2thZ2U+IC4uLgogICAgICAlcHJvZyBbb3B0aW9uc10gLXIgPHJlcXVpcmVtZW50cyBmaWxlPiAuLi4iIiIKICAgIHN1bW1hcnkgPSAnVW5pbnN0YWxsIHBhY2thZ2VzLicKCiAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3cpOgogICAgICAgIHN1cGVyKFVuaW5zdGFsbENvbW1hbmQsIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3KQogICAgICAgIHNlbGYuY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy1yJywgJy0tcmVxdWlyZW1lbnQnLAogICAgICAgICAgICBkZXN0PSdyZXF1aXJlbWVudHMnLAogICAgICAgICAgICBhY3Rpb249J2FwcGVuZCcsCiAgICAgICAgICAgIGRlZmF1bHQ9W10sCiAgICAgICAgICAgIG1ldGF2YXI9J2ZpbGUnLAogICAgICAgICAgICBoZWxwPSdVbmluc3RhbGwgYWxsIHRoZSBwYWNrYWdlcyBsaXN0ZWQgaW4gdGhlIGdpdmVuIHJlcXVpcmVtZW50cyAnCiAgICAgICAgICAgICAgICAgJ2ZpbGUuICBUaGlzIG9wdGlvbiBjYW4gYmUgdXNlZCBtdWx0aXBsZSB0aW1lcy4nLAogICAgICAgICkKICAgICAgICBzZWxmLmNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICcteScsICctLXllcycsCiAgICAgICAgICAgIGRlc3Q9J3llcycsCiAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCiAgICAgICAgICAgIGhlbHA9IkRvbid0IGFzayBmb3IgY29uZmlybWF0aW9uIG9mIHVuaW5zdGFsbCBkZWxldGlvbnMuIikKCiAgICAgICAgc2VsZi5wYXJzZXIuaW5zZXJ0X29wdGlvbl9ncm91cCgwLCBzZWxmLmNtZF9vcHRzKQoKICAgIGRlZiBydW4oc2VsZiwgb3B0aW9ucywgYXJncyk6CiAgICAgICAgd2l0aCBzZWxmLl9idWlsZF9zZXNzaW9uKG9wdGlvbnMpIGFzIHNlc3Npb246CiAgICAgICAgICAgIGZvcm1hdF9jb250cm9sID0gcGlwLmluZGV4LkZvcm1hdENvbnRyb2woc2V0KCksIHNldCgpKQogICAgICAgICAgICB3aGVlbF9jYWNoZSA9IFdoZWVsQ2FjaGUob3B0aW9ucy5jYWNoZV9kaXIsIGZvcm1hdF9jb250cm9sKQogICAgICAgICAgICByZXF1aXJlbWVudF9zZXQgPSBSZXF1aXJlbWVudFNldCgKICAgICAgICAgICAgICAgIGJ1aWxkX2Rpcj1Ob25lLAogICAgICAgICAgICAgICAgc3JjX2Rpcj1Ob25lLAogICAgICAgICAgICAgICAgZG93bmxvYWRfZGlyPU5vbmUsCiAgICAgICAgICAgICAgICBpc29sYXRlZD1vcHRpb25zLmlzb2xhdGVkX21vZGUsCiAgICAgICAgICAgICAgICBzZXNzaW9uPXNlc3Npb24sCiAgICAgICAgICAgICAgICB3aGVlbF9jYWNoZT13aGVlbF9jYWNoZSwKICAgICAgICAgICAgKQogICAgICAgICAgICBmb3IgbmFtZSBpbiBhcmdzOgogICAgICAgICAgICAgICAgcmVxdWlyZW1lbnRfc2V0LmFkZF9yZXF1aXJlbWVudCgKICAgICAgICAgICAgICAgICAgICBJbnN0YWxsUmVxdWlyZW1lbnQuZnJvbV9saW5lKAogICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBpc29sYXRlZD1vcHRpb25zLmlzb2xhdGVkX21vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgIHdoZWVsX2NhY2hlPXdoZWVsX2NhY2hlCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICBmb3IgZmlsZW5hbWUgaW4gb3B0aW9ucy5yZXF1aXJlbWVudHM6CiAgICAgICAgICAgICAgICBmb3IgcmVxIGluIHBhcnNlX3JlcXVpcmVtZW50cygKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM9b3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbj1zZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICB3aGVlbF9jYWNoZT13aGVlbF9jYWNoZSk6CiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnRfc2V0LmFkZF9yZXF1aXJlbWVudChyZXEpCiAgICAgICAgICAgIGlmIG5vdCByZXF1aXJlbWVudF9zZXQuaGFzX3JlcXVpcmVtZW50czoKICAgICAgICAgICAgICAgIHJhaXNlIEluc3RhbGxhdGlvbkVycm9yKAogICAgICAgICAgICAgICAgICAgICdZb3UgbXVzdCBnaXZlIGF0IGxlYXN0IG9uZSByZXF1aXJlbWVudCB0byAlKG5hbWUpcyAoc2VlICcKICAgICAgICAgICAgICAgICAgICAnInBpcCBoZWxwICUobmFtZSlzIiknICUgZGljdChuYW1lPXNlbGYubmFtZSkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgcmVxdWlyZW1lbnRfc2V0LnVuaW5zdGFsbChhdXRvX2NvbmZpcm09b3B0aW9ucy55ZXMpClBLAwQUAAAAAAAAACEAlzdz5jEeAAAxHgAAJQAAAHB5cGlfX3BpcF85XzBfMy9waXAvY29tbWFuZHMvd2hlZWwucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG9zCmltcG9ydCB3YXJuaW5ncwoKZnJvbSBwaXAuYmFzZWNvbW1hbmQgaW1wb3J0IFJlcXVpcmVtZW50Q29tbWFuZApmcm9tIHBpcC5leGNlcHRpb25zIGltcG9ydCBDb21tYW5kRXJyb3IsIFByZXZpb3VzQnVpbGREaXJFcnJvcgpmcm9tIHBpcC5yZXEgaW1wb3J0IFJlcXVpcmVtZW50U2V0CmZyb20gcGlwLnV0aWxzIGltcG9ydCBpbXBvcnRfb3JfcmFpc2UKZnJvbSBwaXAudXRpbHMuYnVpbGQgaW1wb3J0IEJ1aWxkRGlyZWN0b3J5CmZyb20gcGlwLnV0aWxzLmRlcHJlY2F0aW9uIGltcG9ydCBSZW1vdmVkSW5QaXAxMFdhcm5pbmcKZnJvbSBwaXAud2hlZWwgaW1wb3J0IFdoZWVsQ2FjaGUsIFdoZWVsQnVpbGRlcgpmcm9tIHBpcCBpbXBvcnQgY21kb3B0aW9ucwoKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmNsYXNzIFdoZWVsQ29tbWFuZChSZXF1aXJlbWVudENvbW1hbmQpOgogICAgIiIiCiAgICBCdWlsZCBXaGVlbCBhcmNoaXZlcyBmb3IgeW91ciByZXF1aXJlbWVudHMgYW5kIGRlcGVuZGVuY2llcy4KCiAgICBXaGVlbCBpcyBhIGJ1aWx0LXBhY2thZ2UgZm9ybWF0LCBhbmQgb2ZmZXJzIHRoZSBhZHZhbnRhZ2Ugb2Ygbm90CiAgICByZWNvbXBpbGluZyB5b3VyIHNvZnR3YXJlIGR1cmluZyBldmVyeSBpbnN0YWxsLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgdGhlCiAgICB3aGVlbCBkb2NzOiBodHRwczovL3doZWVsLnJlYWR0aGVkb2NzLmlvL2VuL2xhdGVzdC8KCiAgICBSZXF1aXJlbWVudHM6IHNldHVwdG9vbHM+PTAuOCwgYW5kIHdoZWVsLgoKICAgICdwaXAgd2hlZWwnIHVzZXMgdGhlIGJkaXN0X3doZWVsIHNldHVwdG9vbHMgZXh0ZW5zaW9uIGZyb20gdGhlIHdoZWVsCiAgICBwYWNrYWdlIHRvIGJ1aWxkIGluZGl2aWR1YWwgd2hlZWxzLgoKICAgICIiIgoKICAgIG5hbWUgPSAnd2hlZWwnCiAgICB1c2FnZSA9ICIiIgogICAgICAlcHJvZyBbb3B0aW9uc10gPHJlcXVpcmVtZW50IHNwZWNpZmllcj4gLi4uCiAgICAgICVwcm9nIFtvcHRpb25zXSAtciA8cmVxdWlyZW1lbnRzIGZpbGU+IC4uLgogICAgICAlcHJvZyBbb3B0aW9uc10gWy1lXSA8dmNzIHByb2plY3QgdXJsPiAuLi4KICAgICAgJXByb2cgW29wdGlvbnNdIFstZV0gPGxvY2FsIHByb2plY3QgcGF0aD4gLi4uCiAgICAgICVwcm9nIFtvcHRpb25zXSA8YXJjaGl2ZSB1cmwvcGF0aD4gLi4uIiIiCgogICAgc3VtbWFyeSA9ICdCdWlsZCB3aGVlbHMgZnJvbSB5b3VyIHJlcXVpcmVtZW50cy4nCgogICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3KToKICAgICAgICBzdXBlcihXaGVlbENvbW1hbmQsIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3KQoKICAgICAgICBjbWRfb3B0cyA9IHNlbGYuY21kX29wdHMKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy13JywgJy0td2hlZWwtZGlyJywKICAgICAgICAgICAgZGVzdD0nd2hlZWxfZGlyJywKICAgICAgICAgICAgbWV0YXZhcj0nZGlyJywKICAgICAgICAgICAgZGVmYXVsdD1vcy5jdXJkaXIsCiAgICAgICAgICAgIGhlbHA9KCJCdWlsZCB3aGVlbHMgaW50byA8ZGlyPiwgd2hlcmUgdGhlIGRlZmF1bHQgaXMgdGhlICIKICAgICAgICAgICAgICAgICAgImN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuIiksCiAgICAgICAgKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy51c2Vfd2hlZWwoKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMubm9fdXNlX3doZWVsKCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLm5vX2JpbmFyeSgpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5vbmx5X2JpbmFyeSgpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oCiAgICAgICAgICAgICctLWJ1aWxkLW9wdGlvbicsCiAgICAgICAgICAgIGRlc3Q9J2J1aWxkX29wdGlvbnMnLAogICAgICAgICAgICBtZXRhdmFyPSdvcHRpb25zJywKICAgICAgICAgICAgYWN0aW9uPSdhcHBlbmQnLAogICAgICAgICAgICBoZWxwPSJFeHRyYSBhcmd1bWVudHMgdG8gYmUgc3VwcGxpZWQgdG8gJ3NldHVwLnB5IGJkaXN0X3doZWVsJy4iKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5jb25zdHJhaW50cygpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5lZGl0YWJsZSgpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5yZXF1aXJlbWVudHMoKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMuc3JjKCkpCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbihjbWRvcHRpb25zLmlnbm9yZV9yZXF1aXJlc19weXRob24oKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMubm9fZGVwcygpKQogICAgICAgIGNtZF9vcHRzLmFkZF9vcHRpb24oY21kb3B0aW9ucy5idWlsZF9kaXIoKSkKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy0tZ2xvYmFsLW9wdGlvbicsCiAgICAgICAgICAgIGRlc3Q9J2dsb2JhbF9vcHRpb25zJywKICAgICAgICAgICAgYWN0aW9uPSdhcHBlbmQnLAogICAgICAgICAgICBtZXRhdmFyPSdvcHRpb25zJywKICAgICAgICAgICAgaGVscD0iRXh0cmEgZ2xvYmFsIG9wdGlvbnMgdG8gYmUgc3VwcGxpZWQgdG8gdGhlIHNldHVwLnB5ICIKICAgICAgICAgICAgImNhbGwgYmVmb3JlIHRoZSAnYmRpc3Rfd2hlZWwnIGNvbW1hbmQuIikKCiAgICAgICAgY21kX29wdHMuYWRkX29wdGlvbigKICAgICAgICAgICAgJy0tcHJlJywKICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgICAgICAgICAgZGVmYXVsdD1GYWxzZSwKICAgICAgICAgICAgaGVscD0oIkluY2x1ZGUgcHJlLXJlbGVhc2UgYW5kIGRldmVsb3BtZW50IHZlcnNpb25zLiBCeSBkZWZhdWx0LCAiCiAgICAgICAgICAgICAgICAgICJwaXAgb25seSBmaW5kcyBzdGFibGUgdmVyc2lvbnMuIiksCiAgICAgICAgKQoKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMubm9fY2xlYW4oKSkKICAgICAgICBjbWRfb3B0cy5hZGRfb3B0aW9uKGNtZG9wdGlvbnMucmVxdWlyZV9oYXNoZXMoKSkKCiAgICAgICAgaW5kZXhfb3B0cyA9IGNtZG9wdGlvbnMubWFrZV9vcHRpb25fZ3JvdXAoCiAgICAgICAgICAgIGNtZG9wdGlvbnMuaW5kZXhfZ3JvdXAsCiAgICAgICAgICAgIHNlbGYucGFyc2VyLAogICAgICAgICkKCiAgICAgICAgc2VsZi5wYXJzZXIuaW5zZXJ0X29wdGlvbl9ncm91cCgwLCBpbmRleF9vcHRzKQogICAgICAgIHNlbGYucGFyc2VyLmluc2VydF9vcHRpb25fZ3JvdXAoMCwgY21kX29wdHMpCgogICAgZGVmIGNoZWNrX3JlcXVpcmVkX3BhY2thZ2VzKHNlbGYpOgogICAgICAgIGltcG9ydF9vcl9yYWlzZSgKICAgICAgICAgICAgJ3doZWVsLmJkaXN0X3doZWVsJywKICAgICAgICAgICAgQ29tbWFuZEVycm9yLAogICAgICAgICAgICAiJ3BpcCB3aGVlbCcgcmVxdWlyZXMgdGhlICd3aGVlbCcgcGFja2FnZS4gVG8gZml4IHRoaXMsIHJ1bjogIgogICAgICAgICAgICAicGlwIGluc3RhbGwgd2hlZWwiCiAgICAgICAgKQogICAgICAgIHBrZ19yZXNvdXJjZXMgPSBpbXBvcnRfb3JfcmFpc2UoCiAgICAgICAgICAgICdwa2dfcmVzb3VyY2VzJywKICAgICAgICAgICAgQ29tbWFuZEVycm9yLAogICAgICAgICAgICAiJ3BpcCB3aGVlbCcgcmVxdWlyZXMgc2V0dXB0b29scyA+PSAwLjggZm9yIGRpc3QtaW5mbyBzdXBwb3J0LiIKICAgICAgICAgICAgIiBUbyBmaXggdGhpcywgcnVuOiBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgc2V0dXB0b29scyIKICAgICAgICApCiAgICAgICAgaWYgbm90IGhhc2F0dHIocGtnX3Jlc291cmNlcywgJ0Rpc3RJbmZvRGlzdHJpYnV0aW9uJyk6CiAgICAgICAgICAgIHJhaXNlIENvbW1hbmRFcnJvcigKICAgICAgICAgICAgICAgICIncGlwIHdoZWVsJyByZXF1aXJlcyBzZXR1cHRvb2xzID49IDAuOCBmb3IgZGlzdC1pbmZvICIKICAgICAgICAgICAgICAgICJzdXBwb3J0LiBUbyBmaXggdGhpcywgcnVuOiBwaXAgaW5zdGFsbCAtLXVwZ3JhZGUgIgogICAgICAgICAgICAgICAgInNldHVwdG9vbHMiCiAgICAgICAgICAgICkKCiAgICBkZWYgcnVuKHNlbGYsIG9wdGlvbnMsIGFyZ3MpOgogICAgICAgIHNlbGYuY2hlY2tfcmVxdWlyZWRfcGFja2FnZXMoKQogICAgICAgIGNtZG9wdGlvbnMucmVzb2x2ZV93aGVlbF9ub191c2VfYmluYXJ5KG9wdGlvbnMpCiAgICAgICAgY21kb3B0aW9ucy5jaGVja19pbnN0YWxsX2J1aWxkX2dsb2JhbChvcHRpb25zKQoKICAgICAgICBpZiBvcHRpb25zLmFsbG93X2V4dGVybmFsOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAgICAgIi0tYWxsb3ctZXh0ZXJuYWwgaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluICIKICAgICAgICAgICAgICAgICJ0aGUgZnV0dXJlLiBEdWUgdG8gY2hhbmdlcyBpbiB0aGUgcmVwb3NpdG9yeSBwcm90b2NvbCwgaXQgbm8gIgogICAgICAgICAgICAgICAgImxvbmdlciBoYXMgYW55IGVmZmVjdC4iLAogICAgICAgICAgICAgICAgUmVtb3ZlZEluUGlwMTBXYXJuaW5nLAogICAgICAgICAgICApCgogICAgICAgIGlmIG9wdGlvbnMuYWxsb3dfYWxsX2V4dGVybmFsOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAgICAgIi0tYWxsb3ctYWxsLWV4dGVybmFsIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCAiCiAgICAgICAgICAgICAgICAiaW4gdGhlIGZ1dHVyZS4gRHVlIHRvIGNoYW5nZXMgaW4gdGhlIHJlcG9zaXRvcnkgcHJvdG9jb2wsIGl0ICIKICAgICAgICAgICAgICAgICJubyBsb25nZXIgaGFzIGFueSBlZmZlY3QuIiwKICAgICAgICAgICAgICAgIFJlbW92ZWRJblBpcDEwV2FybmluZywKICAgICAgICAgICAgKQoKICAgICAgICBpZiBvcHRpb25zLmFsbG93X3VudmVyaWZpZWQ6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICAgICAiLS1hbGxvdy11bnZlcmlmaWVkIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCAiCiAgICAgICAgICAgICAgICAiaW4gdGhlIGZ1dHVyZS4gRHVlIHRvIGNoYW5nZXMgaW4gdGhlIHJlcG9zaXRvcnkgcHJvdG9jb2wsIGl0ICIKICAgICAgICAgICAgICAgICJubyBsb25nZXIgaGFzIGFueSBlZmZlY3QuIiwKICAgICAgICAgICAgICAgIFJlbW92ZWRJblBpcDEwV2FybmluZywKICAgICAgICAgICAgKQoKICAgICAgICBpbmRleF91cmxzID0gW29wdGlvbnMuaW5kZXhfdXJsXSArIG9wdGlvbnMuZXh0cmFfaW5kZXhfdXJscwogICAgICAgIGlmIG9wdGlvbnMubm9faW5kZXg6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnSWdub3JpbmcgaW5kZXhlczogJXMnLCAnLCcuam9pbihpbmRleF91cmxzKSkKICAgICAgICAgICAgaW5kZXhfdXJscyA9IFtdCgogICAgICAgIGlmIG9wdGlvbnMuYnVpbGRfZGlyOgogICAgICAgICAgICBvcHRpb25zLmJ1aWxkX2RpciA9IG9zLnBhdGguYWJzcGF0aChvcHRpb25zLmJ1aWxkX2RpcikKCiAgICAgICAgb3B0aW9ucy5zcmNfZGlyID0gb3MucGF0aC5hYnNwYXRoKG9wdGlvbnMuc3JjX2RpcikKCiAgICAgICAgd2l0aCBzZWxmLl9idWlsZF9zZXNzaW9uKG9wdGlvbnMpIGFzIHNlc3Npb246CiAgICAgICAgICAgIGZpbmRlciA9IHNlbGYuX2J1aWxkX3BhY2thZ2VfZmluZGVyKG9wdGlvbnMsIHNlc3Npb24pCiAgICAgICAgICAgIGJ1aWxkX2RlbGV0ZSA9IChub3QgKG9wdGlvbnMubm9fY2xlYW4gb3Igb3B0aW9ucy5idWlsZF9kaXIpKQogICAgICAgICAgICB3aGVlbF9jYWNoZSA9IFdoZWVsQ2FjaGUob3B0aW9ucy5jYWNoZV9kaXIsIG9wdGlvbnMuZm9ybWF0X2NvbnRyb2wpCiAgICAgICAgICAgIHdpdGggQnVpbGREaXJlY3Rvcnkob3B0aW9ucy5idWlsZF9kaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlPWJ1aWxkX2RlbGV0ZSkgYXMgYnVpbGRfZGlyOgogICAgICAgICAgICAgICAgcmVxdWlyZW1lbnRfc2V0ID0gUmVxdWlyZW1lbnRTZXQoCiAgICAgICAgICAgICAgICAgICAgYnVpbGRfZGlyPWJ1aWxkX2RpciwKICAgICAgICAgICAgICAgICAgICBzcmNfZGlyPW9wdGlvbnMuc3JjX2RpciwKICAgICAgICAgICAgICAgICAgICBkb3dubG9hZF9kaXI9Tm9uZSwKICAgICAgICAgICAgICAgICAgICBpZ25vcmVfZGVwZW5kZW5jaWVzPW9wdGlvbnMuaWdub3JlX2RlcGVuZGVuY2llcywKICAgICAgICAgICAgICAgICAgICBpZ25vcmVfaW5zdGFsbGVkPVRydWUsCiAgICAgICAgICAgICAgICAgICAgaWdub3JlX3JlcXVpcmVzX3B5dGhvbj1vcHRpb25zLmlnbm9yZV9yZXF1aXJlc19weXRob24sCiAgICAgICAgICAgICAgICAgICAgaXNvbGF0ZWQ9b3B0aW9ucy5pc29sYXRlZF9tb2RlLAogICAgICAgICAgICAgICAgICAgIHNlc3Npb249c2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICB3aGVlbF9jYWNoZT13aGVlbF9jYWNoZSwKICAgICAgICAgICAgICAgICAgICB3aGVlbF9kb3dubG9hZF9kaXI9b3B0aW9ucy53aGVlbF9kaXIsCiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZV9oYXNoZXM9b3B0aW9ucy5yZXF1aXJlX2hhc2hlcwogICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgICAgIHNlbGYucG9wdWxhdGVfcmVxdWlyZW1lbnRfc2V0KAogICAgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50X3NldCwgYXJncywgb3B0aW9ucywgZmluZGVyLCBzZXNzaW9uLCBzZWxmLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgd2hlZWxfY2FjaGUKICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICAgICBpZiBub3QgcmVxdWlyZW1lbnRfc2V0Lmhhc19yZXF1aXJlbWVudHM6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICMgYnVpbGQgd2hlZWxzCiAgICAgICAgICAgICAgICAgICAgd2IgPSBXaGVlbEJ1aWxkZXIoCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50X3NldCwKICAgICAgICAgICAgICAgICAgICAgICAgZmluZGVyLAogICAgICAgICAgICAgICAgICAgICAgICBidWlsZF9vcHRpb25zPW9wdGlvbnMuYnVpbGRfb3B0aW9ucyBvciBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX29wdGlvbnM9b3B0aW9ucy5nbG9iYWxfb3B0aW9ucyBvciBbXSwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgaWYgbm90IHdiLmJ1aWxkKCk6CiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIENvbW1hbmRFcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gYnVpbGQgb25lIG9yIG1vcmUgd2hlZWxzIgogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBleGNlcHQgUHJldmlvdXNCdWlsZERpckVycm9yOgogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMubm9fY2xlYW4gPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICAgICAgaWYgbm90IG9wdGlvbnMubm9fY2xlYW46CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50X3NldC5jbGVhbnVwX2ZpbGVzKCkKUEsDBBQAAAAAAAAAIQCZJ6lxQBIAAEASAAAmAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9jb21wYXQvX19pbml0X18ucHkiIiJTdHVmZiB0aGF0IGRpZmZlcnMgaW4gZGlmZmVyZW50IFB5dGhvbiB2ZXJzaW9ucyBhbmQgcGxhdGZvcm0KZGlzdHJpYnV0aW9ucy4iIiIKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uCgppbXBvcnQgb3MKaW1wb3J0IHN5cwoKZnJvbSBwaXAuX3ZlbmRvci5zaXggaW1wb3J0IHRleHRfdHlwZQoKdHJ5OgogICAgZnJvbSBsb2dnaW5nLmNvbmZpZyBpbXBvcnQgZGljdENvbmZpZyBhcyBsb2dnaW5nX2RpY3RDb25maWcKZXhjZXB0IEltcG9ydEVycm9yOgogICAgZnJvbSBwaXAuY29tcGF0LmRpY3Rjb25maWcgaW1wb3J0IGRpY3RDb25maWcgYXMgbG9nZ2luZ19kaWN0Q29uZmlnCgp0cnk6CiAgICBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBPcmRlcmVkRGljdApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBmcm9tIHBpcC5fdmVuZG9yLm9yZGVyZWRkaWN0IGltcG9ydCBPcmRlcmVkRGljdAoKdHJ5OgogICAgaW1wb3J0IGlwYWRkcmVzcwpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICB0cnk6CiAgICAgICAgZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgaXBhZGRyZXNzCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgaW1wb3J0IGlwYWRkciBhcyBpcGFkZHJlc3MKICAgICAgICBpcGFkZHJlc3MuaXBfYWRkcmVzcyA9IGlwYWRkcmVzcy5JUEFkZHJlc3MKICAgICAgICBpcGFkZHJlc3MuaXBfbmV0d29yayA9IGlwYWRkcmVzcy5JUE5ldHdvcmsKCgp0cnk6CiAgICBpbXBvcnQgc3lzY29uZmlnCgogICAgZGVmIGdldF9zdGRsaWIoKToKICAgICAgICBwYXRocyA9IFsKICAgICAgICAgICAgc3lzY29uZmlnLmdldF9wYXRoKCJzdGRsaWIiKSwKICAgICAgICAgICAgc3lzY29uZmlnLmdldF9wYXRoKCJwbGF0c3RkbGliIiksCiAgICAgICAgXQogICAgICAgIHJldHVybiBzZXQoZmlsdGVyKGJvb2wsIHBhdGhzKSkKZXhjZXB0IEltcG9ydEVycm9yOgogICAgZnJvbSBkaXN0dXRpbHMgaW1wb3J0IHN5c2NvbmZpZwoKICAgIGRlZiBnZXRfc3RkbGliKCk6CiAgICAgICAgcGF0aHMgPSBbCiAgICAgICAgICAgIHN5c2NvbmZpZy5nZXRfcHl0aG9uX2xpYihzdGFuZGFyZF9saWI9VHJ1ZSksCiAgICAgICAgICAgIHN5c2NvbmZpZy5nZXRfcHl0aG9uX2xpYihzdGFuZGFyZF9saWI9VHJ1ZSwgcGxhdF9zcGVjaWZpYz1UcnVlKSwKICAgICAgICBdCiAgICAgICAgcmV0dXJuIHNldChmaWx0ZXIoYm9vbCwgcGF0aHMpKQoKCl9fYWxsX18gPSBbCiAgICAibG9nZ2luZ19kaWN0Q29uZmlnIiwgImlwYWRkcmVzcyIsICJ1c2VzX3B5Y2FjaGUiLCAiY29uc29sZV90b19zdHIiLAogICAgIm5hdGl2ZV9zdHIiLCAiZ2V0X3BhdGhfdWlkIiwgInN0ZGxpYl9wa2dzIiwgIldJTkRPV1MiLCAic2FtZWZpbGUiLAogICAgIk9yZGVyZWREaWN0IiwKXQoKCmlmIHN5cy52ZXJzaW9uX2luZm8gPj0gKDMsIDQpOgogICAgdXNlc19weWNhY2hlID0gVHJ1ZQogICAgZnJvbSBpbXBvcnRsaWIudXRpbCBpbXBvcnQgY2FjaGVfZnJvbV9zb3VyY2UKZWxzZToKICAgIGltcG9ydCBpbXAKICAgIHVzZXNfcHljYWNoZSA9IGhhc2F0dHIoaW1wLCAnY2FjaGVfZnJvbV9zb3VyY2UnKQogICAgaWYgdXNlc19weWNhY2hlOgogICAgICAgIGNhY2hlX2Zyb21fc291cmNlID0gaW1wLmNhY2hlX2Zyb21fc291cmNlCiAgICBlbHNlOgogICAgICAgIGNhY2hlX2Zyb21fc291cmNlID0gTm9uZQoKCmlmIHN5cy52ZXJzaW9uX2luZm8gPj0gKDMsKToKICAgIGRlZiBjb25zb2xlX3RvX3N0cihzKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzLmRlY29kZShzeXMuX19zdGRvdXRfXy5lbmNvZGluZykKICAgICAgICBleGNlcHQgVW5pY29kZURlY29kZUVycm9yOgogICAgICAgICAgICByZXR1cm4gcy5kZWNvZGUoJ3V0Zl84JykKCiAgICBkZWYgbmF0aXZlX3N0cihzLCByZXBsYWNlPUZhbHNlKToKICAgICAgICBpZiBpc2luc3RhbmNlKHMsIGJ5dGVzKToKICAgICAgICAgICAgcmV0dXJuIHMuZGVjb2RlKCd1dGYtOCcsICdyZXBsYWNlJyBpZiByZXBsYWNlIGVsc2UgJ3N0cmljdCcpCiAgICAgICAgcmV0dXJuIHMKCmVsc2U6CiAgICBkZWYgY29uc29sZV90b19zdHIocyk6CiAgICAgICAgcmV0dXJuIHMKCiAgICBkZWYgbmF0aXZlX3N0cihzLCByZXBsYWNlPUZhbHNlKToKICAgICAgICAjIFJlcGxhY2UgaXMgaWdub3JlZCAtLSB1bmljb2RlIHRvIFVURi04IGNhbid0IGZhaWwKICAgICAgICBpZiBpc2luc3RhbmNlKHMsIHRleHRfdHlwZSk6CiAgICAgICAgICAgIHJldHVybiBzLmVuY29kZSgndXRmLTgnKQogICAgICAgIHJldHVybiBzCgoKZGVmIHRvdGFsX3NlY29uZHModGQpOgogICAgaWYgaGFzYXR0cih0ZCwgInRvdGFsX3NlY29uZHMiKToKICAgICAgICByZXR1cm4gdGQudG90YWxfc2Vjb25kcygpCiAgICBlbHNlOgogICAgICAgIHZhbCA9IHRkLm1pY3Jvc2Vjb25kcyArICh0ZC5zZWNvbmRzICsgdGQuZGF5cyAqIDI0ICogMzYwMCkgKiAxMCAqKiA2CiAgICAgICAgcmV0dXJuIHZhbCAvIDEwICoqIDYKCgpkZWYgZ2V0X3BhdGhfdWlkKHBhdGgpOgogICAgIiIiCiAgICBSZXR1cm4gcGF0aCdzIHVpZC4KCiAgICBEb2VzIG5vdCBmb2xsb3cgc3ltbGlua3M6CiAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvcGlwL3B1bGwvOTM1I2Rpc2N1c3Npb25fcjUzMDcwMDMKCiAgICBQbGFjZWQgdGhpcyBmdW5jdGlvbiBpbiBjb21wYXQgZHVlIHRvIGRpZmZlcmVuY2VzIG9uIEFJWCBhbmQKICAgIEp5dGhvbiwgdGhhdCBzaG91bGQgZXZlbnR1YWxseSBnbyBhd2F5LgoKICAgIDpyYWlzZXMgT1NFcnJvcjogV2hlbiBwYXRoIGlzIGEgc3ltbGluayBvciBjYW4ndCBiZSByZWFkLgogICAgIiIiCiAgICBpZiBoYXNhdHRyKG9zLCAnT19OT0ZPTExPVycpOgogICAgICAgIGZkID0gb3Mub3BlbihwYXRoLCBvcy5PX1JET05MWSB8IG9zLk9fTk9GT0xMT1cpCiAgICAgICAgZmlsZV91aWQgPSBvcy5mc3RhdChmZCkuc3RfdWlkCiAgICAgICAgb3MuY2xvc2UoZmQpCiAgICBlbHNlOiAgIyBBSVggYW5kIEp5dGhvbgogICAgICAgICMgV0FSTklORzogdGltZSBvZiBjaGVjayB2dWxuZXJhYmlsaXR5LCBidXQgYmVzdCB3ZSBjYW4gZG8gdy9vIE5PRk9MTE9XCiAgICAgICAgaWYgbm90IG9zLnBhdGguaXNsaW5rKHBhdGgpOgogICAgICAgICAgICAjIG9sZGVyIHZlcnNpb25zIG9mIEp5dGhvbiBkb24ndCBoYXZlIGBvcy5mc3RhdGAKICAgICAgICAgICAgZmlsZV91aWQgPSBvcy5zdGF0KHBhdGgpLnN0X3VpZAogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgcmFpc2UgT1NFcnJvciBmb3IgcGFyaXR5IHdpdGggb3MuT19OT0ZPTExPVyBhYm92ZQogICAgICAgICAgICByYWlzZSBPU0Vycm9yKAogICAgICAgICAgICAgICAgIiVzIGlzIGEgc3ltbGluazsgV2lsbCBub3QgcmV0dXJuIHVpZCBmb3Igc3ltbGlua3MiICUgcGF0aAogICAgICAgICAgICApCiAgICByZXR1cm4gZmlsZV91aWQKCgpkZWYgZXhwYW5kdXNlcihwYXRoKToKICAgICIiIgogICAgRXhwYW5kIH4gYW5kIH51c2VyIGNvbnN0cnVjdGlvbnMuCgogICAgSW5jbHVkZXMgYSB3b3JrYXJvdW5kIGZvciBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMTQ3NjgKICAgICIiIgogICAgZXhwYW5kZWQgPSBvcy5wYXRoLmV4cGFuZHVzZXIocGF0aCkKICAgIGlmIHBhdGguc3RhcnRzd2l0aCgnfi8nKSBhbmQgZXhwYW5kZWQuc3RhcnRzd2l0aCgnLy8nKToKICAgICAgICBleHBhbmRlZCA9IGV4cGFuZGVkWzE6XQogICAgcmV0dXJuIGV4cGFuZGVkCgoKIyBwYWNrYWdlcyBpbiB0aGUgc3RkbGliIHRoYXQgbWF5IGhhdmUgaW5zdGFsbGF0aW9uIG1ldGFkYXRhLCBidXQgc2hvdWxkIG5vdCBiZQojIGNvbnNpZGVyZWQgJ2luc3RhbGxlZCcuICB0aGlzIHRoZW9yZXRpY2FsbHkgY291bGQgYmUgZGV0ZXJtaW5lZCBiYXNlZCBvbgojIGRpc3QubG9jYXRpb24gKHB5Mjc6YHN5c2NvbmZpZy5nZXRfcGF0aHMoKVsnc3RkbGliJ11gLAojIHB5MjY6c3lzY29uZmlnLmdldF9jb25maWdfdmFycygnTElCREVTVCcpKSwgYnV0IGZlYXIgcGxhdGZvcm0gdmFyaWF0aW9uIG1heQojIG1ha2UgdGhpcyBpbmVmZmVjdGl2ZSwgc28gaGFyZC1jb2RpbmcKc3RkbGliX3BrZ3MgPSAoJ3B5dGhvbicsICd3c2dpcmVmJykKaWYgc3lzLnZlcnNpb25faW5mbyA+PSAoMiwgNyk6CiAgICBzdGRsaWJfcGtncyArPSAoJ2FyZ3BhcnNlJywpCgoKIyB3aW5kb3dzIGRldGVjdGlvbiwgY292ZXJzIGNweXRob24gYW5kIGlyb25weXRob24KV0lORE9XUyA9IChzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgid2luIikgb3IKICAgICAgICAgICAoc3lzLnBsYXRmb3JtID09ICdjbGknIGFuZCBvcy5uYW1lID09ICdudCcpKQoKCmRlZiBzYW1lZmlsZShmaWxlMSwgZmlsZTIpOgogICAgIiIiUHJvdmlkZSBhbiBhbHRlcm5hdGl2ZSBmb3Igb3MucGF0aC5zYW1lZmlsZSBvbiBXaW5kb3dzL1B5dGhvbjIiIiIKICAgIGlmIGhhc2F0dHIob3MucGF0aCwgJ3NhbWVmaWxlJyk6CiAgICAgICAgcmV0dXJuIG9zLnBhdGguc2FtZWZpbGUoZmlsZTEsIGZpbGUyKQogICAgZWxzZToKICAgICAgICBwYXRoMSA9IG9zLnBhdGgubm9ybWNhc2Uob3MucGF0aC5hYnNwYXRoKGZpbGUxKSkKICAgICAgICBwYXRoMiA9IG9zLnBhdGgubm9ybWNhc2Uob3MucGF0aC5hYnNwYXRoKGZpbGUyKSkKICAgICAgICByZXR1cm4gcGF0aDEgPT0gcGF0aDIKUEsDBBQAAAAAAAAAIQCCoqWXOFoAADhaAAAoAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9jb21wYXQvZGljdGNvbmZpZy5weSMgVGhpcyBpcyBhIGNvcHkgb2YgdGhlIFB5dGhvbiBsb2dnaW5nLmNvbmZpZy5kaWN0Y29uZmlnIG1vZHVsZSwKIyByZXByb2R1Y2VkIHdpdGggcGVybWlzc2lvbi4gSXQgaXMgcHJvdmlkZWQgaGVyZSBmb3IgYmFja3dhcmRzCiMgY29tcGF0aWJpbGl0eSBmb3IgUHl0aG9uIHZlcnNpb25zIHByaW9yIHRvIDIuNy4KIwojIENvcHlyaWdodCAyMDA5LTIwMTAgYnkgVmluYXkgU2FqaXAuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiMKIyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKIyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsCiMgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAojIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgojIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgVmluYXkgU2FqaXAKIyBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24KIyBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLgojIFZJTkFZIFNBSklQIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcKIyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwKIyBWSU5BWSBTQUpJUCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IKIyBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIKIyBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVAojIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgbG9nZ2luZy5oYW5kbGVycwppbXBvcnQgcmUKaW1wb3J0IHN5cwppbXBvcnQgdHlwZXMKCmZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IHNpeAoKIyBmbGFrZTg6IG5vcWEKCklERU5USUZJRVIgPSByZS5jb21waWxlKCdeW2Etel9dW2EtejAtOV9dKiQnLCByZS5JKQoKCmRlZiB2YWxpZF9pZGVudChzKToKICAgIG0gPSBJREVOVElGSUVSLm1hdGNoKHMpCiAgICBpZiBub3QgbToKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdOb3QgYSB2YWxpZCBQeXRob24gaWRlbnRpZmllcjogJXInICUgcykKICAgIHJldHVybiBUcnVlCgojCiMgVGhpcyBmdW5jdGlvbiBpcyBkZWZpbmVkIGluIGxvZ2dpbmcgb25seSBpbiByZWNlbnQgdmVyc2lvbnMgb2YgUHl0aG9uCiMKdHJ5OgogICAgZnJvbSBsb2dnaW5nIGltcG9ydCBfY2hlY2tMZXZlbApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBkZWYgX2NoZWNrTGV2ZWwobGV2ZWwpOgogICAgICAgIGlmIGlzaW5zdGFuY2UobGV2ZWwsIGludCk6CiAgICAgICAgICAgIHJ2ID0gbGV2ZWwKICAgICAgICBlbGlmIHN0cihsZXZlbCkgPT0gbGV2ZWw6CiAgICAgICAgICAgIGlmIGxldmVsIG5vdCBpbiBsb2dnaW5nLl9sZXZlbE5hbWVzOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5rbm93biBsZXZlbDogJXInICUgbGV2ZWwpCiAgICAgICAgICAgIHJ2ID0gbG9nZ2luZy5fbGV2ZWxOYW1lc1tsZXZlbF0KICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ0xldmVsIG5vdCBhbiBpbnRlZ2VyIG9yIGEgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbGlkIHN0cmluZzogJXInICUgbGV2ZWwpCiAgICAgICAgcmV0dXJuIHJ2CgojIFRoZSBDb252ZXJ0aW5nWFhYIGNsYXNzZXMgYXJlIHdyYXBwZXJzIGFyb3VuZCBzdGFuZGFyZCBQeXRob24gY29udGFpbmVycywKIyBhbmQgdGhleSBzZXJ2ZSB0byBjb252ZXJ0IGFueSBzdWl0YWJsZSB2YWx1ZXMgaW4gdGhlIGNvbnRhaW5lci4gVGhlCiMgY29udmVyc2lvbiBjb252ZXJ0cyBiYXNlIGRpY3RzLCBsaXN0cyBhbmQgdHVwbGVzIHRvIHRoZWlyIHdyYXBwZWQKIyBlcXVpdmFsZW50cywgd2hlcmVhcyBzdHJpbmdzIHdoaWNoIG1hdGNoIGEgY29udmVyc2lvbiBmb3JtYXQgYXJlIGNvbnZlcnRlZAojIGFwcHJvcHJpYXRlbHkuCiMKIyBFYWNoIHdyYXBwZXIgc2hvdWxkIGhhdmUgYSBjb25maWd1cmF0b3IgYXR0cmlidXRlIGhvbGRpbmcgdGhlIGFjdHVhbAojIGNvbmZpZ3VyYXRvciB0byB1c2UgZm9yIGNvbnZlcnNpb24uCgoKY2xhc3MgQ29udmVydGluZ0RpY3QoZGljdCk6CiAgICAiIiJBIGNvbnZlcnRpbmcgZGljdGlvbmFyeSB3cmFwcGVyLiIiIgoKICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgogICAgICAgIHZhbHVlID0gZGljdC5fX2dldGl0ZW1fXyhzZWxmLCBrZXkpCiAgICAgICAgcmVzdWx0ID0gc2VsZi5jb25maWd1cmF0b3IuY29udmVydCh2YWx1ZSkKICAgICAgICAjIElmIHRoZSBjb252ZXJ0ZWQgdmFsdWUgaXMgZGlmZmVyZW50LCBzYXZlIGZvciBuZXh0IHRpbWUKICAgICAgICBpZiB2YWx1ZSBpcyBub3QgcmVzdWx0OgogICAgICAgICAgICBzZWxmW2tleV0gPSByZXN1bHQKICAgICAgICAgICAgaWYgdHlwZShyZXN1bHQpIGluIChDb252ZXJ0aW5nRGljdCwgQ29udmVydGluZ0xpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVydGluZ1R1cGxlKToKICAgICAgICAgICAgICAgIHJlc3VsdC5wYXJlbnQgPSBzZWxmCiAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0ga2V5CiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBnZXQoc2VsZiwga2V5LCBkZWZhdWx0PU5vbmUpOgogICAgICAgIHZhbHVlID0gZGljdC5nZXQoc2VsZiwga2V5LCBkZWZhdWx0KQogICAgICAgIHJlc3VsdCA9IHNlbGYuY29uZmlndXJhdG9yLmNvbnZlcnQodmFsdWUpCiAgICAgICAgIyBJZiB0aGUgY29udmVydGVkIHZhbHVlIGlzIGRpZmZlcmVudCwgc2F2ZSBmb3IgbmV4dCB0aW1lCiAgICAgICAgaWYgdmFsdWUgaXMgbm90IHJlc3VsdDoKICAgICAgICAgICAgc2VsZltrZXldID0gcmVzdWx0CiAgICAgICAgICAgIGlmIHR5cGUocmVzdWx0KSBpbiAoQ29udmVydGluZ0RpY3QsIENvbnZlcnRpbmdMaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnRpbmdUdXBsZSk6CiAgICAgICAgICAgICAgICByZXN1bHQucGFyZW50ID0gc2VsZgogICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IGtleQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgcG9wKHNlbGYsIGtleSwgZGVmYXVsdD1Ob25lKToKICAgICAgICB2YWx1ZSA9IGRpY3QucG9wKHNlbGYsIGtleSwgZGVmYXVsdCkKICAgICAgICByZXN1bHQgPSBzZWxmLmNvbmZpZ3VyYXRvci5jb252ZXJ0KHZhbHVlKQogICAgICAgIGlmIHZhbHVlIGlzIG5vdCByZXN1bHQ6CiAgICAgICAgICAgIGlmIHR5cGUocmVzdWx0KSBpbiAoQ29udmVydGluZ0RpY3QsIENvbnZlcnRpbmdMaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnRpbmdUdXBsZSk6CiAgICAgICAgICAgICAgICByZXN1bHQucGFyZW50ID0gc2VsZgogICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IGtleQogICAgICAgIHJldHVybiByZXN1bHQKCgpjbGFzcyBDb252ZXJ0aW5nTGlzdChsaXN0KToKICAgICIiIkEgY29udmVydGluZyBsaXN0IHdyYXBwZXIuIiIiCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKICAgICAgICB2YWx1ZSA9IGxpc3QuX19nZXRpdGVtX18oc2VsZiwga2V5KQogICAgICAgIHJlc3VsdCA9IHNlbGYuY29uZmlndXJhdG9yLmNvbnZlcnQodmFsdWUpCiAgICAgICAgIyBJZiB0aGUgY29udmVydGVkIHZhbHVlIGlzIGRpZmZlcmVudCwgc2F2ZSBmb3IgbmV4dCB0aW1lCiAgICAgICAgaWYgdmFsdWUgaXMgbm90IHJlc3VsdDoKICAgICAgICAgICAgc2VsZltrZXldID0gcmVzdWx0CiAgICAgICAgICAgIGlmIHR5cGUocmVzdWx0KSBpbiAoQ29udmVydGluZ0RpY3QsIENvbnZlcnRpbmdMaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnRpbmdUdXBsZSk6CiAgICAgICAgICAgICAgICByZXN1bHQucGFyZW50ID0gc2VsZgogICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IGtleQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgcG9wKHNlbGYsIGlkeD0tMSk6CiAgICAgICAgdmFsdWUgPSBsaXN0LnBvcChzZWxmLCBpZHgpCiAgICAgICAgcmVzdWx0ID0gc2VsZi5jb25maWd1cmF0b3IuY29udmVydCh2YWx1ZSkKICAgICAgICBpZiB2YWx1ZSBpcyBub3QgcmVzdWx0OgogICAgICAgICAgICBpZiB0eXBlKHJlc3VsdCkgaW4gKENvbnZlcnRpbmdEaWN0LCBDb252ZXJ0aW5nTGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJ0aW5nVHVwbGUpOgogICAgICAgICAgICAgICAgcmVzdWx0LnBhcmVudCA9IHNlbGYKICAgICAgICByZXR1cm4gcmVzdWx0CgoKY2xhc3MgQ29udmVydGluZ1R1cGxlKHR1cGxlKToKICAgICIiIkEgY29udmVydGluZyB0dXBsZSB3cmFwcGVyLiIiIgogICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CiAgICAgICAgdmFsdWUgPSB0dXBsZS5fX2dldGl0ZW1fXyhzZWxmLCBrZXkpCiAgICAgICAgcmVzdWx0ID0gc2VsZi5jb25maWd1cmF0b3IuY29udmVydCh2YWx1ZSkKICAgICAgICBpZiB2YWx1ZSBpcyBub3QgcmVzdWx0OgogICAgICAgICAgICBpZiB0eXBlKHJlc3VsdCkgaW4gKENvbnZlcnRpbmdEaWN0LCBDb252ZXJ0aW5nTGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJ0aW5nVHVwbGUpOgogICAgICAgICAgICAgICAgcmVzdWx0LnBhcmVudCA9IHNlbGYKICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBrZXkKICAgICAgICByZXR1cm4gcmVzdWx0CgoKY2xhc3MgQmFzZUNvbmZpZ3VyYXRvcihvYmplY3QpOgogICAgIiIiCiAgICBUaGUgY29uZmlndXJhdG9yIGJhc2UgY2xhc3Mgd2hpY2ggZGVmaW5lcyBzb21lIHVzZWZ1bCBkZWZhdWx0cy4KICAgICIiIgoKICAgIENPTlZFUlRfUEFUVEVSTiA9IHJlLmNvbXBpbGUocideKD9QPHByZWZpeD5bYS16XSspOi8vKD9QPHN1ZmZpeD4uKikkJykKCiAgICBXT1JEX1BBVFRFUk4gPSByZS5jb21waWxlKHInXlxzKihcdyspXHMqJykKICAgIERPVF9QQVRURVJOID0gcmUuY29tcGlsZShyJ15cLlxzKihcdyspXHMqJykKICAgIElOREVYX1BBVFRFUk4gPSByZS5jb21waWxlKHInXlxbXHMqKFx3KylccypcXVxzKicpCiAgICBESUdJVF9QQVRURVJOID0gcmUuY29tcGlsZShyJ15cZCskJykKCiAgICB2YWx1ZV9jb252ZXJ0ZXJzID0gewogICAgICAgICdleHQnIDogJ2V4dF9jb252ZXJ0JywKICAgICAgICAnY2ZnJyA6ICdjZmdfY29udmVydCcsCiAgICB9CgogICAgIyBXZSBtaWdodCB3YW50IHRvIHVzZSBhIGRpZmZlcmVudCBvbmUsIGUuZy4gaW1wb3J0bGliCiAgICBpbXBvcnRlciA9IF9faW1wb3J0X18KCiAgICBkZWYgX19pbml0X18oc2VsZiwgY29uZmlnKToKICAgICAgICBzZWxmLmNvbmZpZyA9IENvbnZlcnRpbmdEaWN0KGNvbmZpZykKICAgICAgICBzZWxmLmNvbmZpZy5jb25maWd1cmF0b3IgPSBzZWxmCgogICAgZGVmIHJlc29sdmUoc2VsZiwgcyk6CiAgICAgICAgIiIiCiAgICAgICAgUmVzb2x2ZSBzdHJpbmdzIHRvIG9iamVjdHMgdXNpbmcgc3RhbmRhcmQgaW1wb3J0IGFuZCBhdHRyaWJ1dGUKICAgICAgICBzeW50YXguCiAgICAgICAgIiIiCiAgICAgICAgbmFtZSA9IHMuc3BsaXQoJy4nKQogICAgICAgIHVzZWQgPSBuYW1lLnBvcCgwKQogICAgICAgIHRyeToKICAgICAgICAgICAgZm91bmQgPSBzZWxmLmltcG9ydGVyKHVzZWQpCiAgICAgICAgICAgIGZvciBmcmFnIGluIG5hbWU6CiAgICAgICAgICAgICAgICB1c2VkICs9ICcuJyArIGZyYWcKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IGdldGF0dHIoZm91bmQsIGZyYWcpCiAgICAgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5pbXBvcnRlcih1c2VkKQogICAgICAgICAgICAgICAgICAgIGZvdW5kID0gZ2V0YXR0cihmb3VuZCwgZnJhZykKICAgICAgICAgICAgcmV0dXJuIGZvdW5kCiAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICBlLCB0YiA9IHN5cy5leGNfaW5mbygpWzE6XQogICAgICAgICAgICB2ID0gVmFsdWVFcnJvcignQ2Fubm90IHJlc29sdmUgJXI6ICVzJyAlIChzLCBlKSkKICAgICAgICAgICAgdi5fX2NhdXNlX18sIHYuX190cmFjZWJhY2tfXyA9IGUsIHRiCiAgICAgICAgICAgIHJhaXNlIHYKCiAgICBkZWYgZXh0X2NvbnZlcnQoc2VsZiwgdmFsdWUpOgogICAgICAgICIiIkRlZmF1bHQgY29udmVydGVyIGZvciB0aGUgZXh0Oi8vIHByb3RvY29sLiIiIgogICAgICAgIHJldHVybiBzZWxmLnJlc29sdmUodmFsdWUpCgogICAgZGVmIGNmZ19jb252ZXJ0KHNlbGYsIHZhbHVlKToKICAgICAgICAiIiJEZWZhdWx0IGNvbnZlcnRlciBmb3IgdGhlIGNmZzovLyBwcm90b2NvbC4iIiIKICAgICAgICByZXN0ID0gdmFsdWUKICAgICAgICBtID0gc2VsZi5XT1JEX1BBVFRFUk4ubWF0Y2gocmVzdCkKICAgICAgICBpZiBtIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlVuYWJsZSB0byBjb252ZXJ0ICVyIiAlIHZhbHVlKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJlc3QgPSByZXN0W20uZW5kKCk6XQogICAgICAgICAgICBkID0gc2VsZi5jb25maWdbbS5ncm91cHMoKVswXV0KICAgICAgICAgICAgIyBwcmludCBkLCByZXN0CiAgICAgICAgICAgIHdoaWxlIHJlc3Q6CiAgICAgICAgICAgICAgICBtID0gc2VsZi5ET1RfUEFUVEVSTi5tYXRjaChyZXN0KQogICAgICAgICAgICAgICAgaWYgbToKICAgICAgICAgICAgICAgICAgICBkID0gZFttLmdyb3VwcygpWzBdXQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBtID0gc2VsZi5JTkRFWF9QQVRURVJOLm1hdGNoKHJlc3QpCiAgICAgICAgICAgICAgICAgICAgaWYgbToKICAgICAgICAgICAgICAgICAgICAgICAgaWR4ID0gbS5ncm91cHMoKVswXQogICAgICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5ESUdJVF9QQVRURVJOLm1hdGNoKGlkeCk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gZFtpZHhdCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IGludChpZHgpICAjIHRyeSBhcyBudW1iZXIgZmlyc3QgKG1vc3QgbGlrZWx5KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBkW25dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBkW2lkeF0KICAgICAgICAgICAgICAgIGlmIG06CiAgICAgICAgICAgICAgICAgICAgcmVzdCA9IHJlc3RbbS5lbmQoKTpdCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1VuYWJsZSB0byBjb252ZXJ0ICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclciBhdCAlcicgJSAodmFsdWUsIHJlc3QpKQogICAgICAgICMgcmVzdCBzaG91bGQgYmUgZW1wdHkKICAgICAgICByZXR1cm4gZAoKICAgIGRlZiBjb252ZXJ0KHNlbGYsIHZhbHVlKToKICAgICAgICAiIiIKICAgICAgICBDb252ZXJ0IHZhbHVlcyB0byBhbiBhcHByb3ByaWF0ZSB0eXBlLiBkaWN0cywgbGlzdHMgYW5kIHR1cGxlcyBhcmUKICAgICAgICByZXBsYWNlZCBieSB0aGVpciBjb252ZXJ0aW5nIGFsdGVybmF0aXZlcy4gU3RyaW5ncyBhcmUgY2hlY2tlZCB0bwogICAgICAgIHNlZSBpZiB0aGV5IGhhdmUgYSBjb252ZXJzaW9uIGZvcm1hdCBhbmQgYXJlIGNvbnZlcnRlZCBpZiB0aGV5IGRvLgogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLCBDb252ZXJ0aW5nRGljdCkgYW5kIGlzaW5zdGFuY2UodmFsdWUsIGRpY3QpOgogICAgICAgICAgICB2YWx1ZSA9IENvbnZlcnRpbmdEaWN0KHZhbHVlKQogICAgICAgICAgICB2YWx1ZS5jb25maWd1cmF0b3IgPSBzZWxmCiAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZSwgQ29udmVydGluZ0xpc3QpIGFuZCBpc2luc3RhbmNlKHZhbHVlLCBsaXN0KToKICAgICAgICAgICAgdmFsdWUgPSBDb252ZXJ0aW5nTGlzdCh2YWx1ZSkKICAgICAgICAgICAgdmFsdWUuY29uZmlndXJhdG9yID0gc2VsZgogICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsIENvbnZlcnRpbmdUdXBsZSkgYW5kXAogICAgICAgICAgICAgICAgIGlzaW5zdGFuY2UodmFsdWUsIHR1cGxlKToKICAgICAgICAgICAgdmFsdWUgPSBDb252ZXJ0aW5nVHVwbGUodmFsdWUpCiAgICAgICAgICAgIHZhbHVlLmNvbmZpZ3VyYXRvciA9IHNlbGYKICAgICAgICBlbGlmIGlzaW5zdGFuY2UodmFsdWUsIHNpeC5zdHJpbmdfdHlwZXMpOiAgIyBzdHIgZm9yIHB5M2sKICAgICAgICAgICAgbSA9IHNlbGYuQ09OVkVSVF9QQVRURVJOLm1hdGNoKHZhbHVlKQogICAgICAgICAgICBpZiBtOgogICAgICAgICAgICAgICAgZCA9IG0uZ3JvdXBkaWN0KCkKICAgICAgICAgICAgICAgIHByZWZpeCA9IGRbJ3ByZWZpeCddCiAgICAgICAgICAgICAgICBjb252ZXJ0ZXIgPSBzZWxmLnZhbHVlX2NvbnZlcnRlcnMuZ2V0KHByZWZpeCwgTm9uZSkKICAgICAgICAgICAgICAgIGlmIGNvbnZlcnRlcjoKICAgICAgICAgICAgICAgICAgICBzdWZmaXggPSBkWydzdWZmaXgnXQogICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlciA9IGdldGF0dHIoc2VsZiwgY29udmVydGVyKQogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gY29udmVydGVyKHN1ZmZpeCkKICAgICAgICByZXR1cm4gdmFsdWUKCiAgICBkZWYgY29uZmlndXJlX2N1c3RvbShzZWxmLCBjb25maWcpOgogICAgICAgICIiIkNvbmZpZ3VyZSBhbiBvYmplY3Qgd2l0aCBhIHVzZXItc3VwcGxpZWQgZmFjdG9yeS4iIiIKICAgICAgICBjID0gY29uZmlnLnBvcCgnKCknKQogICAgICAgIGlmIG5vdCBoYXNhdHRyKGMsICdfX2NhbGxfXycpIGFuZCBoYXNhdHRyKHR5cGVzLCAnQ2xhc3NUeXBlJykgYW5kIHR5cGUoYykgIT0gdHlwZXMuQ2xhc3NUeXBlOgogICAgICAgICAgICBjID0gc2VsZi5yZXNvbHZlKGMpCiAgICAgICAgcHJvcHMgPSBjb25maWcucG9wKCcuJywgTm9uZSkKICAgICAgICAjIENoZWNrIGZvciB2YWxpZCBpZGVudGlmaWVycwogICAgICAgIGt3YXJncyA9IGRpY3QoKGssIGNvbmZpZ1trXSkgZm9yIGsgaW4gY29uZmlnIGlmIHZhbGlkX2lkZW50KGspKQogICAgICAgIHJlc3VsdCA9IGMoKiprd2FyZ3MpCiAgICAgICAgaWYgcHJvcHM6CiAgICAgICAgICAgIGZvciBuYW1lLCB2YWx1ZSBpbiBwcm9wcy5pdGVtcygpOgogICAgICAgICAgICAgICAgc2V0YXR0cihyZXN1bHQsIG5hbWUsIHZhbHVlKQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgYXNfdHVwbGUoc2VsZiwgdmFsdWUpOgogICAgICAgICIiIlV0aWxpdHkgZnVuY3Rpb24gd2hpY2ggY29udmVydHMgbGlzdHMgdG8gdHVwbGVzLiIiIgogICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIGxpc3QpOgogICAgICAgICAgICB2YWx1ZSA9IHR1cGxlKHZhbHVlKQogICAgICAgIHJldHVybiB2YWx1ZQoKCmNsYXNzIERpY3RDb25maWd1cmF0b3IoQmFzZUNvbmZpZ3VyYXRvcik6CiAgICAiIiIKICAgIENvbmZpZ3VyZSBsb2dnaW5nIHVzaW5nIGEgZGljdGlvbmFyeS1saWtlIG9iamVjdCB0byBkZXNjcmliZSB0aGUKICAgIGNvbmZpZ3VyYXRpb24uCiAgICAiIiIKCiAgICBkZWYgY29uZmlndXJlKHNlbGYpOgogICAgICAgICIiIkRvIHRoZSBjb25maWd1cmF0aW9uLiIiIgoKICAgICAgICBjb25maWcgPSBzZWxmLmNvbmZpZwogICAgICAgIGlmICd2ZXJzaW9uJyBub3QgaW4gY29uZmlnOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJkaWN0aW9uYXJ5IGRvZXNuJ3Qgc3BlY2lmeSBhIHZlcnNpb24iKQogICAgICAgIGlmIGNvbmZpZ1sndmVyc2lvbiddICE9IDE6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlVuc3VwcG9ydGVkIHZlcnNpb246ICVzIiAlIGNvbmZpZ1sndmVyc2lvbiddKQogICAgICAgIGluY3JlbWVudGFsID0gY29uZmlnLnBvcCgnaW5jcmVtZW50YWwnLCBGYWxzZSkKICAgICAgICBFTVBUWV9ESUNUID0ge30KICAgICAgICBsb2dnaW5nLl9hY3F1aXJlTG9jaygpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBpZiBpbmNyZW1lbnRhbDoKICAgICAgICAgICAgICAgIGhhbmRsZXJzID0gY29uZmlnLmdldCgnaGFuZGxlcnMnLCBFTVBUWV9ESUNUKQogICAgICAgICAgICAgICAgIyBpbmNyZW1lbnRhbCBoYW5kbGVyIGNvbmZpZyBvbmx5IGlmIGhhbmRsZXIgbmFtZQogICAgICAgICAgICAgICAgIyB0aWVzIGluIHRvIGxvZ2dpbmcuX2hhbmRsZXJzIChQeXRob24gMi43KQogICAgICAgICAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mb1s6Ml0gPT0gKDIsIDcpOgogICAgICAgICAgICAgICAgICAgIGZvciBuYW1lIGluIGhhbmRsZXJzOgogICAgICAgICAgICAgICAgICAgICAgICBpZiBuYW1lIG5vdCBpbiBsb2dnaW5nLl9oYW5kbGVyczoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ05vIGhhbmRsZXIgZm91bmQgd2l0aCAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lICVyJyAgJSBuYW1lKQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIgPSBsb2dnaW5nLl9oYW5kbGVyc1tuYW1lXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJfY29uZmlnID0gaGFuZGxlcnNbbmFtZV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IGhhbmRsZXJfY29uZmlnLmdldCgnbGV2ZWwnLCBOb25lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxldmVsOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLnNldExldmVsKF9jaGVja0xldmVsKGxldmVsKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBTdGFuZGFyZEVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5hYmxlIHRvIGNvbmZpZ3VyZSBoYW5kbGVyICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclcjogJXMnICUgKG5hbWUsIGUpKQogICAgICAgICAgICAgICAgbG9nZ2VycyA9IGNvbmZpZy5nZXQoJ2xvZ2dlcnMnLCBFTVBUWV9ESUNUKQogICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4gbG9nZ2VyczoKICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29uZmlndXJlX2xvZ2dlcihuYW1lLCBsb2dnZXJzW25hbWVdLCBUcnVlKQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBTdGFuZGFyZEVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1VuYWJsZSB0byBjb25maWd1cmUgbG9nZ2VyICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXI6ICVzJyAlIChuYW1lLCBlKSkKICAgICAgICAgICAgICAgIHJvb3QgPSBjb25maWcuZ2V0KCdyb290JywgTm9uZSkKICAgICAgICAgICAgICAgIGlmIHJvb3Q6CiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbmZpZ3VyZV9yb290KHJvb3QsIFRydWUpCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFN0YW5kYXJkRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5hYmxlIHRvIGNvbmZpZ3VyZSByb290ICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbG9nZ2VyOiAlcycgJSBlKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZGlzYWJsZV9leGlzdGluZyA9IGNvbmZpZy5wb3AoJ2Rpc2FibGVfZXhpc3RpbmdfbG9nZ2VycycsIFRydWUpCgogICAgICAgICAgICAgICAgbG9nZ2luZy5faGFuZGxlcnMuY2xlYXIoKQogICAgICAgICAgICAgICAgZGVsIGxvZ2dpbmcuX2hhbmRsZXJMaXN0WzpdCgogICAgICAgICAgICAgICAgIyBEbyBmb3JtYXR0ZXJzIGZpcnN0IC0gdGhleSBkb24ndCByZWZlciB0byBhbnl0aGluZyBlbHNlCiAgICAgICAgICAgICAgICBmb3JtYXR0ZXJzID0gY29uZmlnLmdldCgnZm9ybWF0dGVycycsIEVNUFRZX0RJQ1QpCiAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiBmb3JtYXR0ZXJzOgogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVyc1tuYW1lXSA9IHNlbGYuY29uZmlndXJlX2Zvcm1hdHRlcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVyc1tuYW1lXSkKICAgICAgICAgICAgICAgICAgICBleGNlcHQgU3RhbmRhcmRFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmFibGUgdG8gY29uZmlndXJlICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9ybWF0dGVyICVyOiAlcycgJSAobmFtZSwgZSkpCiAgICAgICAgICAgICAgICAjIE5leHQsIGRvIGZpbHRlcnMgLSB0aGV5IGRvbid0IHJlZmVyIHRvIGFueXRoaW5nIGVsc2UsIGVpdGhlcgogICAgICAgICAgICAgICAgZmlsdGVycyA9IGNvbmZpZy5nZXQoJ2ZpbHRlcnMnLCBFTVBUWV9ESUNUKQogICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4gZmlsdGVyczoKICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcnNbbmFtZV0gPSBzZWxmLmNvbmZpZ3VyZV9maWx0ZXIoZmlsdGVyc1tuYW1lXSkKICAgICAgICAgICAgICAgICAgICBleGNlcHQgU3RhbmRhcmRFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmFibGUgdG8gY29uZmlndXJlICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmlsdGVyICVyOiAlcycgJSAobmFtZSwgZSkpCgogICAgICAgICAgICAgICAgIyBOZXh0LCBkbyBoYW5kbGVycyAtIHRoZXkgcmVmZXIgdG8gZm9ybWF0dGVycyBhbmQgZmlsdGVycwogICAgICAgICAgICAgICAgIyBBcyBoYW5kbGVycyBjYW4gcmVmZXIgdG8gb3RoZXIgaGFuZGxlcnMsIHNvcnQgdGhlIGtleXMKICAgICAgICAgICAgICAgICMgdG8gYWxsb3cgYSBkZXRlcm1pbmlzdGljIG9yZGVyIG9mIGNvbmZpZ3VyYXRpb24KICAgICAgICAgICAgICAgIGhhbmRsZXJzID0gY29uZmlnLmdldCgnaGFuZGxlcnMnLCBFTVBUWV9ESUNUKQogICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4gc29ydGVkKGhhbmRsZXJzKToKICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIgPSBzZWxmLmNvbmZpZ3VyZV9oYW5kbGVyKGhhbmRsZXJzW25hbWVdKQogICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLm5hbWUgPSBuYW1lCiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJzW25hbWVdID0gaGFuZGxlcgogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBTdGFuZGFyZEVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1VuYWJsZSB0byBjb25maWd1cmUgaGFuZGxlciAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVyOiAlcycgJSAobmFtZSwgZSkpCiAgICAgICAgICAgICAgICAjIE5leHQsIGRvIGxvZ2dlcnMgLSB0aGV5IHJlZmVyIHRvIGhhbmRsZXJzIGFuZCBmaWx0ZXJzCgogICAgICAgICAgICAgICAgIyB3ZSBkb24ndCB3YW50IHRvIGxvc2UgdGhlIGV4aXN0aW5nIGxvZ2dlcnMsCiAgICAgICAgICAgICAgICAjIHNpbmNlIG90aGVyIHRocmVhZHMgbWF5IGhhdmUgcG9pbnRlcnMgdG8gdGhlbS4KICAgICAgICAgICAgICAgICMgZXhpc3RpbmcgaXMgc2V0IHRvIGNvbnRhaW4gYWxsIGV4aXN0aW5nIGxvZ2dlcnMsCiAgICAgICAgICAgICAgICAjIGFuZCBhcyB3ZSBnbyB0aHJvdWdoIHRoZSBuZXcgY29uZmlndXJhdGlvbiB3ZQogICAgICAgICAgICAgICAgIyByZW1vdmUgYW55IHdoaWNoIGFyZSBjb25maWd1cmVkLiBBdCB0aGUgZW5kLAogICAgICAgICAgICAgICAgIyB3aGF0J3MgbGVmdCBpbiBleGlzdGluZyBpcyB0aGUgc2V0IG9mIGxvZ2dlcnMKICAgICAgICAgICAgICAgICMgd2hpY2ggd2VyZSBpbiB0aGUgcHJldmlvdXMgY29uZmlndXJhdGlvbiBidXQKICAgICAgICAgICAgICAgICMgd2hpY2ggYXJlIG5vdCBpbiB0aGUgbmV3IGNvbmZpZ3VyYXRpb24uCiAgICAgICAgICAgICAgICByb290ID0gbG9nZ2luZy5yb290CiAgICAgICAgICAgICAgICBleGlzdGluZyA9IGxpc3Qocm9vdC5tYW5hZ2VyLmxvZ2dlckRpY3QpCiAgICAgICAgICAgICAgICAjIFRoZSBsaXN0IG5lZWRzIHRvIGJlIHNvcnRlZCBzbyB0aGF0IHdlIGNhbgogICAgICAgICAgICAgICAgIyBhdm9pZCBkaXNhYmxpbmcgY2hpbGQgbG9nZ2VycyBvZiBleHBsaWNpdGx5CiAgICAgICAgICAgICAgICAjIG5hbWVkIGxvZ2dlcnMuIFdpdGggYSBzb3J0ZWQgbGlzdCBpdCBpcyBlYXNpZXIKICAgICAgICAgICAgICAgICMgdG8gZmluZCB0aGUgY2hpbGQgbG9nZ2Vycy4KICAgICAgICAgICAgICAgIGV4aXN0aW5nLnNvcnQoKQogICAgICAgICAgICAgICAgIyBXZSdsbCBrZWVwIHRoZSBsaXN0IG9mIGV4aXN0aW5nIGxvZ2dlcnMKICAgICAgICAgICAgICAgICMgd2hpY2ggYXJlIGNoaWxkcmVuIG9mIG5hbWVkIGxvZ2dlcnMgaGVyZS4uLgogICAgICAgICAgICAgICAgY2hpbGRfbG9nZ2VycyA9IFtdCiAgICAgICAgICAgICAgICAjIG5vdyBzZXQgdXAgdGhlIG5ldyBvbmVzLi4uCiAgICAgICAgICAgICAgICBsb2dnZXJzID0gY29uZmlnLmdldCgnbG9nZ2VycycsIEVNUFRZX0RJQ1QpCiAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiBsb2dnZXJzOgogICAgICAgICAgICAgICAgICAgIGlmIG5hbWUgaW4gZXhpc3Rpbmc6CiAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBleGlzdGluZy5pbmRleChuYW1lKQogICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXhlZCA9IG5hbWUgKyAiLiIKICAgICAgICAgICAgICAgICAgICAgICAgcGZsZW4gPSBsZW4ocHJlZml4ZWQpCiAgICAgICAgICAgICAgICAgICAgICAgIG51bV9leGlzdGluZyA9IGxlbihleGlzdGluZykKICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGkgKyAxICAjIGxvb2sgYXQgdGhlIGVudHJ5IGFmdGVyIG5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGkgPCBudW1fZXhpc3RpbmcpIGFuZFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGV4aXN0aW5nW2ldWzpwZmxlbl0gPT0gcHJlZml4ZWQpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRfbG9nZ2Vycy5hcHBlbmQoZXhpc3RpbmdbaV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gaSArIDEKICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcucmVtb3ZlKG5hbWUpCiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbmZpZ3VyZV9sb2dnZXIobmFtZSwgbG9nZ2Vyc1tuYW1lXSkKICAgICAgICAgICAgICAgICAgICBleGNlcHQgU3RhbmRhcmRFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmFibGUgdG8gY29uZmlndXJlIGxvZ2dlciAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVyOiAlcycgJSAobmFtZSwgZSkpCgogICAgICAgICAgICAgICAgIyBEaXNhYmxlIGFueSBvbGQgbG9nZ2Vycy4gVGhlcmUncyBubyBwb2ludCBkZWxldGluZwogICAgICAgICAgICAgICAgIyB0aGVtIGFzIG90aGVyIHRocmVhZHMgbWF5IGNvbnRpbnVlIHRvIGhvbGQgcmVmZXJlbmNlcwogICAgICAgICAgICAgICAgIyBhbmQgYnkgZGlzYWJsaW5nIHRoZW0sIHlvdSBzdG9wIHRoZW0gZG9pbmcgYW55IGxvZ2dpbmcuCiAgICAgICAgICAgICAgICAjIEhvd2V2ZXIsIGRvbid0IGRpc2FibGUgY2hpbGRyZW4gb2YgbmFtZWQgbG9nZ2VycywgYXMgdGhhdCdzCiAgICAgICAgICAgICAgICAjIHByb2JhYmx5IG5vdCB3aGF0IHdhcyBpbnRlbmRlZCBieSB0aGUgdXNlci4KICAgICAgICAgICAgICAgIGZvciBsb2cgaW4gZXhpc3Rpbmc6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyID0gcm9vdC5tYW5hZ2VyLmxvZ2dlckRpY3RbbG9nXQogICAgICAgICAgICAgICAgICAgIGlmIGxvZyBpbiBjaGlsZF9sb2dnZXJzOgogICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIubGV2ZWwgPSBsb2dnaW5nLk5PVFNFVAogICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaGFuZGxlcnMgPSBbXQogICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIucHJvcGFnYXRlID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgIGVsaWYgZGlzYWJsZV9leGlzdGluZzoKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRpc2FibGVkID0gVHJ1ZQoKICAgICAgICAgICAgICAgICMgQW5kIGZpbmFsbHksIGRvIHRoZSByb290IGxvZ2dlcgogICAgICAgICAgICAgICAgcm9vdCA9IGNvbmZpZy5nZXQoJ3Jvb3QnLCBOb25lKQogICAgICAgICAgICAgICAgaWYgcm9vdDoKICAgICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29uZmlndXJlX3Jvb3Qocm9vdCkKICAgICAgICAgICAgICAgICAgICBleGNlcHQgU3RhbmRhcmRFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmFibGUgdG8gY29uZmlndXJlIHJvb3QgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsb2dnZXI6ICVzJyAlIGUpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgbG9nZ2luZy5fcmVsZWFzZUxvY2soKQoKICAgIGRlZiBjb25maWd1cmVfZm9ybWF0dGVyKHNlbGYsIGNvbmZpZyk6CiAgICAgICAgIiIiQ29uZmlndXJlIGEgZm9ybWF0dGVyIGZyb20gYSBkaWN0aW9uYXJ5LiIiIgogICAgICAgIGlmICcoKScgaW4gY29uZmlnOgogICAgICAgICAgICBmYWN0b3J5ID0gY29uZmlnWycoKSddICAjIGZvciB1c2UgaW4gZXhjZXB0aW9uIGhhbmRsZXIKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5jb25maWd1cmVfY3VzdG9tKGNvbmZpZykKICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvciBhcyB0ZToKICAgICAgICAgICAgICAgIGlmICInZm9ybWF0JyIgbm90IGluIHN0cih0ZSk6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgICAgICMgTmFtZSBvZiBwYXJhbWV0ZXIgY2hhbmdlZCBmcm9tIGZtdCB0byBmb3JtYXQuCiAgICAgICAgICAgICAgICAjIFJldHJ5IHdpdGggb2xkIG5hbWUuCiAgICAgICAgICAgICAgICAjIFRoaXMgaXMgc28gdGhhdCBjb2RlIGNhbiBiZSB1c2VkIHdpdGggb2xkZXIgUHl0aG9uIHZlcnNpb25zCiAgICAgICAgICAgICAgICAjKGUuZy4gYnkgRGphbmdvKQogICAgICAgICAgICAgICAgY29uZmlnWydmbXQnXSA9IGNvbmZpZy5wb3AoJ2Zvcm1hdCcpCiAgICAgICAgICAgICAgICBjb25maWdbJygpJ10gPSBmYWN0b3J5CiAgICAgICAgICAgICAgICByZXN1bHQgPSBzZWxmLmNvbmZpZ3VyZV9jdXN0b20oY29uZmlnKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGZtdCA9IGNvbmZpZy5nZXQoJ2Zvcm1hdCcsIE5vbmUpCiAgICAgICAgICAgIGRmbXQgPSBjb25maWcuZ2V0KCdkYXRlZm10JywgTm9uZSkKICAgICAgICAgICAgcmVzdWx0ID0gbG9nZ2luZy5Gb3JtYXR0ZXIoZm10LCBkZm10KQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgY29uZmlndXJlX2ZpbHRlcihzZWxmLCBjb25maWcpOgogICAgICAgICIiIkNvbmZpZ3VyZSBhIGZpbHRlciBmcm9tIGEgZGljdGlvbmFyeS4iIiIKICAgICAgICBpZiAnKCknIGluIGNvbmZpZzoKICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5jb25maWd1cmVfY3VzdG9tKGNvbmZpZykKICAgICAgICBlbHNlOgogICAgICAgICAgICBuYW1lID0gY29uZmlnLmdldCgnbmFtZScsICcnKQogICAgICAgICAgICByZXN1bHQgPSBsb2dnaW5nLkZpbHRlcihuYW1lKQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgYWRkX2ZpbHRlcnMoc2VsZiwgZmlsdGVyZXIsIGZpbHRlcnMpOgogICAgICAgICIiIkFkZCBmaWx0ZXJzIHRvIGEgZmlsdGVyZXIgZnJvbSBhIGxpc3Qgb2YgbmFtZXMuIiIiCiAgICAgICAgZm9yIGYgaW4gZmlsdGVyczoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZmlsdGVyZXIuYWRkRmlsdGVyKHNlbGYuY29uZmlnWydmaWx0ZXJzJ11bZl0pCiAgICAgICAgICAgIGV4Y2VwdCBTdGFuZGFyZEVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmFibGUgdG8gYWRkIGZpbHRlciAlcjogJXMnICUgKGYsIGUpKQoKICAgIGRlZiBjb25maWd1cmVfaGFuZGxlcihzZWxmLCBjb25maWcpOgogICAgICAgICIiIkNvbmZpZ3VyZSBhIGhhbmRsZXIgZnJvbSBhIGRpY3Rpb25hcnkuIiIiCiAgICAgICAgZm9ybWF0dGVyID0gY29uZmlnLnBvcCgnZm9ybWF0dGVyJywgTm9uZSkKICAgICAgICBpZiBmb3JtYXR0ZXI6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGZvcm1hdHRlciA9IHNlbGYuY29uZmlnWydmb3JtYXR0ZXJzJ11bZm9ybWF0dGVyXQogICAgICAgICAgICBleGNlcHQgU3RhbmRhcmRFcnJvciBhcyBlOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5hYmxlIHRvIHNldCBmb3JtYXR0ZXIgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXI6ICVzJyAlIChmb3JtYXR0ZXIsIGUpKQogICAgICAgIGxldmVsID0gY29uZmlnLnBvcCgnbGV2ZWwnLCBOb25lKQogICAgICAgIGZpbHRlcnMgPSBjb25maWcucG9wKCdmaWx0ZXJzJywgTm9uZSkKICAgICAgICBpZiAnKCknIGluIGNvbmZpZzoKICAgICAgICAgICAgYyA9IGNvbmZpZy5wb3AoJygpJykKICAgICAgICAgICAgaWYgbm90IGhhc2F0dHIoYywgJ19fY2FsbF9fJykgYW5kIGhhc2F0dHIodHlwZXMsICdDbGFzc1R5cGUnKSBhbmQgdHlwZShjKSAhPSB0eXBlcy5DbGFzc1R5cGU6CiAgICAgICAgICAgICAgICBjID0gc2VsZi5yZXNvbHZlKGMpCiAgICAgICAgICAgIGZhY3RvcnkgPSBjCiAgICAgICAgZWxzZToKICAgICAgICAgICAga2xhc3MgPSBzZWxmLnJlc29sdmUoY29uZmlnLnBvcCgnY2xhc3MnKSkKICAgICAgICAgICAgIyBTcGVjaWFsIGNhc2UgZm9yIGhhbmRsZXIgd2hpY2ggcmVmZXJzIHRvIGFub3RoZXIgaGFuZGxlcgogICAgICAgICAgICBpZiBpc3N1YmNsYXNzKGtsYXNzLCBsb2dnaW5nLmhhbmRsZXJzLk1lbW9yeUhhbmRsZXIpIGFuZFwKICAgICAgICAgICAgICAgICd0YXJnZXQnIGluIGNvbmZpZzoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBjb25maWdbJ3RhcmdldCddID0gc2VsZi5jb25maWdbJ2hhbmRsZXJzJ11bY29uZmlnWyd0YXJnZXQnXV0KICAgICAgICAgICAgICAgIGV4Y2VwdCBTdGFuZGFyZEVycm9yIGFzIGU6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5hYmxlIHRvIHNldCB0YXJnZXQgaGFuZGxlciAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXI6ICVzJyAlIChjb25maWdbJ3RhcmdldCddLCBlKSkKICAgICAgICAgICAgZWxpZiBpc3N1YmNsYXNzKGtsYXNzLCBsb2dnaW5nLmhhbmRsZXJzLlNNVFBIYW5kbGVyKSBhbmRcCiAgICAgICAgICAgICAgICAnbWFpbGhvc3QnIGluIGNvbmZpZzoKICAgICAgICAgICAgICAgIGNvbmZpZ1snbWFpbGhvc3QnXSA9IHNlbGYuYXNfdHVwbGUoY29uZmlnWydtYWlsaG9zdCddKQogICAgICAgICAgICBlbGlmIGlzc3ViY2xhc3Moa2xhc3MsIGxvZ2dpbmcuaGFuZGxlcnMuU3lzTG9nSGFuZGxlcikgYW5kXAogICAgICAgICAgICAgICAgJ2FkZHJlc3MnIGluIGNvbmZpZzoKICAgICAgICAgICAgICAgIGNvbmZpZ1snYWRkcmVzcyddID0gc2VsZi5hc190dXBsZShjb25maWdbJ2FkZHJlc3MnXSkKICAgICAgICAgICAgZmFjdG9yeSA9IGtsYXNzCiAgICAgICAga3dhcmdzID0gZGljdCgoaywgY29uZmlnW2tdKSBmb3IgayBpbiBjb25maWcgaWYgdmFsaWRfaWRlbnQoaykpCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXN1bHQgPSBmYWN0b3J5KCoqa3dhcmdzKQogICAgICAgIGV4Y2VwdCBUeXBlRXJyb3IgYXMgdGU6CiAgICAgICAgICAgIGlmICInc3RyZWFtJyIgbm90IGluIHN0cih0ZSk6CiAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICAjIFRoZSBhcmd1bWVudCBuYW1lIGNoYW5nZWQgZnJvbSBzdHJtIHRvIHN0cmVhbQogICAgICAgICAgICAjIFJldHJ5IHdpdGggb2xkIG5hbWUuCiAgICAgICAgICAgICMgVGhpcyBpcyBzbyB0aGF0IGNvZGUgY2FuIGJlIHVzZWQgd2l0aCBvbGRlciBQeXRob24gdmVyc2lvbnMKICAgICAgICAgICAgIyhlLmcuIGJ5IERqYW5nbykKICAgICAgICAgICAga3dhcmdzWydzdHJtJ10gPSBrd2FyZ3MucG9wKCdzdHJlYW0nKQogICAgICAgICAgICByZXN1bHQgPSBmYWN0b3J5KCoqa3dhcmdzKQogICAgICAgIGlmIGZvcm1hdHRlcjoKICAgICAgICAgICAgcmVzdWx0LnNldEZvcm1hdHRlcihmb3JtYXR0ZXIpCiAgICAgICAgaWYgbGV2ZWwgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJlc3VsdC5zZXRMZXZlbChfY2hlY2tMZXZlbChsZXZlbCkpCiAgICAgICAgaWYgZmlsdGVyczoKICAgICAgICAgICAgc2VsZi5hZGRfZmlsdGVycyhyZXN1bHQsIGZpbHRlcnMpCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIGRlZiBhZGRfaGFuZGxlcnMoc2VsZiwgbG9nZ2VyLCBoYW5kbGVycyk6CiAgICAgICAgIiIiQWRkIGhhbmRsZXJzIHRvIGEgbG9nZ2VyIGZyb20gYSBsaXN0IG9mIG5hbWVzLiIiIgogICAgICAgIGZvciBoIGluIGhhbmRsZXJzOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBsb2dnZXIuYWRkSGFuZGxlcihzZWxmLmNvbmZpZ1snaGFuZGxlcnMnXVtoXSkKICAgICAgICAgICAgZXhjZXB0IFN0YW5kYXJkRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1VuYWJsZSB0byBhZGQgaGFuZGxlciAlcjogJXMnICUgKGgsIGUpKQoKICAgIGRlZiBjb21tb25fbG9nZ2VyX2NvbmZpZyhzZWxmLCBsb2dnZXIsIGNvbmZpZywgaW5jcmVtZW50YWw9RmFsc2UpOgogICAgICAgICIiIgogICAgICAgIFBlcmZvcm0gY29uZmlndXJhdGlvbiB3aGljaCBpcyBjb21tb24gdG8gcm9vdCBhbmQgbm9uLXJvb3QgbG9nZ2Vycy4KICAgICAgICAiIiIKICAgICAgICBsZXZlbCA9IGNvbmZpZy5nZXQoJ2xldmVsJywgTm9uZSkKICAgICAgICBpZiBsZXZlbCBpcyBub3QgTm9uZToKICAgICAgICAgICAgbG9nZ2VyLnNldExldmVsKF9jaGVja0xldmVsKGxldmVsKSkKICAgICAgICBpZiBub3QgaW5jcmVtZW50YWw6CiAgICAgICAgICAgICMgUmVtb3ZlIGFueSBleGlzdGluZyBoYW5kbGVycwogICAgICAgICAgICBmb3IgaCBpbiBsb2dnZXIuaGFuZGxlcnNbOl06CiAgICAgICAgICAgICAgICBsb2dnZXIucmVtb3ZlSGFuZGxlcihoKQogICAgICAgICAgICBoYW5kbGVycyA9IGNvbmZpZy5nZXQoJ2hhbmRsZXJzJywgTm9uZSkKICAgICAgICAgICAgaWYgaGFuZGxlcnM6CiAgICAgICAgICAgICAgICBzZWxmLmFkZF9oYW5kbGVycyhsb2dnZXIsIGhhbmRsZXJzKQogICAgICAgICAgICBmaWx0ZXJzID0gY29uZmlnLmdldCgnZmlsdGVycycsIE5vbmUpCiAgICAgICAgICAgIGlmIGZpbHRlcnM6CiAgICAgICAgICAgICAgICBzZWxmLmFkZF9maWx0ZXJzKGxvZ2dlciwgZmlsdGVycykKCiAgICBkZWYgY29uZmlndXJlX2xvZ2dlcihzZWxmLCBuYW1lLCBjb25maWcsIGluY3JlbWVudGFsPUZhbHNlKToKICAgICAgICAiIiJDb25maWd1cmUgYSBub24tcm9vdCBsb2dnZXIgZnJvbSBhIGRpY3Rpb25hcnkuIiIiCiAgICAgICAgbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIobmFtZSkKICAgICAgICBzZWxmLmNvbW1vbl9sb2dnZXJfY29uZmlnKGxvZ2dlciwgY29uZmlnLCBpbmNyZW1lbnRhbCkKICAgICAgICBwcm9wYWdhdGUgPSBjb25maWcuZ2V0KCdwcm9wYWdhdGUnLCBOb25lKQogICAgICAgIGlmIHByb3BhZ2F0ZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgbG9nZ2VyLnByb3BhZ2F0ZSA9IHByb3BhZ2F0ZQoKICAgIGRlZiBjb25maWd1cmVfcm9vdChzZWxmLCBjb25maWcsIGluY3JlbWVudGFsPUZhbHNlKToKICAgICAgICAiIiJDb25maWd1cmUgYSByb290IGxvZ2dlciBmcm9tIGEgZGljdGlvbmFyeS4iIiIKICAgICAgICByb290ID0gbG9nZ2luZy5nZXRMb2dnZXIoKQogICAgICAgIHNlbGYuY29tbW9uX2xvZ2dlcl9jb25maWcocm9vdCwgY29uZmlnLCBpbmNyZW1lbnRhbCkKCmRpY3RDb25maWdDbGFzcyA9IERpY3RDb25maWd1cmF0b3IKCgpkZWYgZGljdENvbmZpZyhjb25maWcpOgogICAgIiIiQ29uZmlndXJlIGxvZ2dpbmcgdXNpbmcgYSBkaWN0aW9uYXJ5LiIiIgogICAgZGljdENvbmZpZ0NsYXNzKGNvbmZpZykuY29uZmlndXJlKCkKUEsDBBQAAAAAAAAAIQD9PylRmX0AAJl9AAAfAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9kb3dubG9hZC5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgY2dpCmltcG9ydCBlbWFpbC51dGlscwppbXBvcnQgZ2V0cGFzcwppbXBvcnQganNvbgppbXBvcnQgbG9nZ2luZwppbXBvcnQgbWltZXR5cGVzCmltcG9ydCBvcwppbXBvcnQgcGxhdGZvcm0KaW1wb3J0IHJlCmltcG9ydCBzaHV0aWwKaW1wb3J0IHN5cwppbXBvcnQgdGVtcGZpbGUKCnRyeToKICAgIGltcG9ydCBzc2wgICMgbm9xYQogICAgSEFTX1RMUyA9IFRydWUKZXhjZXB0IEltcG9ydEVycm9yOgogICAgSEFTX1RMUyA9IEZhbHNlCgpmcm9tIHBpcC5fdmVuZG9yLnNpeC5tb3Zlcy51cmxsaWIgaW1wb3J0IHBhcnNlIGFzIHVybGxpYl9wYXJzZQpmcm9tIHBpcC5fdmVuZG9yLnNpeC5tb3Zlcy51cmxsaWIgaW1wb3J0IHJlcXVlc3QgYXMgdXJsbGliX3JlcXVlc3QKCmltcG9ydCBwaXAKCmZyb20gcGlwLmV4Y2VwdGlvbnMgaW1wb3J0IEluc3RhbGxhdGlvbkVycm9yLCBIYXNoTWlzbWF0Y2gKZnJvbSBwaXAubW9kZWxzIGltcG9ydCBQeVBJCmZyb20gcGlwLnV0aWxzIGltcG9ydCAoc3BsaXRleHQsIHJtdHJlZSwgZm9ybWF0X3NpemUsIGRpc3BsYXlfcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICBiYWNrdXBfZGlyLCBhc2tfcGF0aF9leGlzdHMsIHVucGFja19maWxlLAogICAgICAgICAgICAgICAgICAgICAgIEFSQ0hJVkVfRVhURU5TSU9OUywgY29uc3VtZSwgY2FsbF9zdWJwcm9jZXNzKQpmcm9tIHBpcC51dGlscy5lbmNvZGluZyBpbXBvcnQgYXV0b19kZWNvZGUKZnJvbSBwaXAudXRpbHMuZmlsZXN5c3RlbSBpbXBvcnQgY2hlY2tfcGF0aF9vd25lcgpmcm9tIHBpcC51dGlscy5sb2dnaW5nIGltcG9ydCBpbmRlbnRfbG9nCmZyb20gcGlwLnV0aWxzLnNldHVwdG9vbHNfYnVpbGQgaW1wb3J0IFNFVFVQVE9PTFNfU0hJTQpmcm9tIHBpcC51dGlscy5nbGliYyBpbXBvcnQgbGliY192ZXIKZnJvbSBwaXAudXRpbHMudWkgaW1wb3J0IERvd25sb2FkUHJvZ3Jlc3NCYXIsIERvd25sb2FkUHJvZ3Jlc3NTcGlubmVyCmZyb20gcGlwLmxvY2F0aW9ucyBpbXBvcnQgd3JpdGVfZGVsZXRlX21hcmtlcl9maWxlCmZyb20gcGlwLnZjcyBpbXBvcnQgdmNzCmZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IHJlcXVlc3RzLCBzaXgKZnJvbSBwaXAuX3ZlbmRvci5yZXF1ZXN0cy5hZGFwdGVycyBpbXBvcnQgQmFzZUFkYXB0ZXIsIEhUVFBBZGFwdGVyCmZyb20gcGlwLl92ZW5kb3IucmVxdWVzdHMuYXV0aCBpbXBvcnQgQXV0aEJhc2UsIEhUVFBCYXNpY0F1dGgKZnJvbSBwaXAuX3ZlbmRvci5yZXF1ZXN0cy5tb2RlbHMgaW1wb3J0IENPTlRFTlRfQ0hVTktfU0laRSwgUmVzcG9uc2UKZnJvbSBwaXAuX3ZlbmRvci5yZXF1ZXN0cy51dGlscyBpbXBvcnQgZ2V0X25ldHJjX2F1dGgKZnJvbSBwaXAuX3ZlbmRvci5yZXF1ZXN0cy5zdHJ1Y3R1cmVzIGltcG9ydCBDYXNlSW5zZW5zaXRpdmVEaWN0CmZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IHVybGxpYjMKZnJvbSBwaXAuX3ZlbmRvci5jYWNoZWNvbnRyb2wgaW1wb3J0IENhY2hlQ29udHJvbEFkYXB0ZXIKZnJvbSBwaXAuX3ZlbmRvci5jYWNoZWNvbnRyb2wuY2FjaGVzIGltcG9ydCBGaWxlQ2FjaGUKZnJvbSBwaXAuX3ZlbmRvci5sb2NrZmlsZSBpbXBvcnQgTG9ja0Vycm9yCmZyb20gcGlwLl92ZW5kb3Iuc2l4Lm1vdmVzIGltcG9ydCB4bWxycGNfY2xpZW50CgoKX19hbGxfXyA9IFsnZ2V0X2ZpbGVfY29udGVudCcsCiAgICAgICAgICAgJ2lzX3VybCcsICd1cmxfdG9fcGF0aCcsICdwYXRoX3RvX3VybCcsCiAgICAgICAgICAgJ2lzX2FyY2hpdmVfZmlsZScsICd1bnBhY2tfdmNzX2xpbmsnLAogICAgICAgICAgICd1bnBhY2tfZmlsZV91cmwnLCAnaXNfdmNzX3VybCcsICdpc19maWxlX3VybCcsCiAgICAgICAgICAgJ3VucGFja19odHRwX3VybCcsICd1bnBhY2tfdXJsJ10KCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgpkZWYgdXNlcl9hZ2VudCgpOgogICAgIiIiCiAgICBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB1c2VyIGFnZW50LgogICAgIiIiCiAgICBkYXRhID0gewogICAgICAgICJpbnN0YWxsZXIiOiB7Im5hbWUiOiAicGlwIiwgInZlcnNpb24iOiBwaXAuX192ZXJzaW9uX199LAogICAgICAgICJweXRob24iOiBwbGF0Zm9ybS5weXRob25fdmVyc2lvbigpLAogICAgICAgICJpbXBsZW1lbnRhdGlvbiI6IHsKICAgICAgICAgICAgIm5hbWUiOiBwbGF0Zm9ybS5weXRob25faW1wbGVtZW50YXRpb24oKSwKICAgICAgICB9LAogICAgfQoKICAgIGlmIGRhdGFbImltcGxlbWVudGF0aW9uIl1bIm5hbWUiXSA9PSAnQ1B5dGhvbic6CiAgICAgICAgZGF0YVsiaW1wbGVtZW50YXRpb24iXVsidmVyc2lvbiJdID0gcGxhdGZvcm0ucHl0aG9uX3ZlcnNpb24oKQogICAgZWxpZiBkYXRhWyJpbXBsZW1lbnRhdGlvbiJdWyJuYW1lIl0gPT0gJ1B5UHknOgogICAgICAgIGlmIHN5cy5weXB5X3ZlcnNpb25faW5mby5yZWxlYXNlbGV2ZWwgPT0gJ2ZpbmFsJzoKICAgICAgICAgICAgcHlweV92ZXJzaW9uX2luZm8gPSBzeXMucHlweV92ZXJzaW9uX2luZm9bOjNdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcHlweV92ZXJzaW9uX2luZm8gPSBzeXMucHlweV92ZXJzaW9uX2luZm8KICAgICAgICBkYXRhWyJpbXBsZW1lbnRhdGlvbiJdWyJ2ZXJzaW9uIl0gPSAiLiIuam9pbigKICAgICAgICAgICAgW3N0cih4KSBmb3IgeCBpbiBweXB5X3ZlcnNpb25faW5mb10KICAgICAgICApCiAgICBlbGlmIGRhdGFbImltcGxlbWVudGF0aW9uIl1bIm5hbWUiXSA9PSAnSnl0aG9uJzoKICAgICAgICAjIENvbXBsZXRlIEd1ZXNzCiAgICAgICAgZGF0YVsiaW1wbGVtZW50YXRpb24iXVsidmVyc2lvbiJdID0gcGxhdGZvcm0ucHl0aG9uX3ZlcnNpb24oKQogICAgZWxpZiBkYXRhWyJpbXBsZW1lbnRhdGlvbiJdWyJuYW1lIl0gPT0gJ0lyb25QeXRob24nOgogICAgICAgICMgQ29tcGxldGUgR3Vlc3MKICAgICAgICBkYXRhWyJpbXBsZW1lbnRhdGlvbiJdWyJ2ZXJzaW9uIl0gPSBwbGF0Zm9ybS5weXRob25fdmVyc2lvbigpCgogICAgaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoImxpbnV4Iik6CiAgICAgICAgZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgZGlzdHJvCiAgICAgICAgZGlzdHJvX2luZm9zID0gZGljdChmaWx0ZXIoCiAgICAgICAgICAgIGxhbWJkYSB4OiB4WzFdLAogICAgICAgICAgICB6aXAoWyJuYW1lIiwgInZlcnNpb24iLCAiaWQiXSwgZGlzdHJvLmxpbnV4X2Rpc3RyaWJ1dGlvbigpKSwKICAgICAgICApKQogICAgICAgIGxpYmMgPSBkaWN0KGZpbHRlcigKICAgICAgICAgICAgbGFtYmRhIHg6IHhbMV0sCiAgICAgICAgICAgIHppcChbImxpYiIsICJ2ZXJzaW9uIl0sIGxpYmNfdmVyKCkpLAogICAgICAgICkpCiAgICAgICAgaWYgbGliYzoKICAgICAgICAgICAgZGlzdHJvX2luZm9zWyJsaWJjIl0gPSBsaWJjCiAgICAgICAgaWYgZGlzdHJvX2luZm9zOgogICAgICAgICAgICBkYXRhWyJkaXN0cm8iXSA9IGRpc3Ryb19pbmZvcwoKICAgIGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCJkYXJ3aW4iKSBhbmQgcGxhdGZvcm0ubWFjX3ZlcigpWzBdOgogICAgICAgIGRhdGFbImRpc3RybyJdID0geyJuYW1lIjogIm1hY09TIiwgInZlcnNpb24iOiBwbGF0Zm9ybS5tYWNfdmVyKClbMF19CgogICAgaWYgcGxhdGZvcm0uc3lzdGVtKCk6CiAgICAgICAgZGF0YS5zZXRkZWZhdWx0KCJzeXN0ZW0iLCB7fSlbIm5hbWUiXSA9IHBsYXRmb3JtLnN5c3RlbSgpCgogICAgaWYgcGxhdGZvcm0ucmVsZWFzZSgpOgogICAgICAgIGRhdGEuc2V0ZGVmYXVsdCgic3lzdGVtIiwge30pWyJyZWxlYXNlIl0gPSBwbGF0Zm9ybS5yZWxlYXNlKCkKCiAgICBpZiBwbGF0Zm9ybS5tYWNoaW5lKCk6CiAgICAgICAgZGF0YVsiY3B1Il0gPSBwbGF0Zm9ybS5tYWNoaW5lKCkKCiAgICAjIFB5dGhvbiAyLjYgZG9lc24ndCBoYXZlIHNzbC5PUEVOU1NMX1ZFUlNJT04uCiAgICBpZiBIQVNfVExTIGFuZCBzeXMudmVyc2lvbl9pbmZvWzoyXSA+ICgyLCA2KToKICAgICAgICBkYXRhWyJvcGVuc3NsX3ZlcnNpb24iXSA9IHNzbC5PUEVOU1NMX1ZFUlNJT04KCiAgICByZXR1cm4gIntkYXRhW2luc3RhbGxlcl1bbmFtZV19L3tkYXRhW2luc3RhbGxlcl1bdmVyc2lvbl19IHtqc29ufSIuZm9ybWF0KAogICAgICAgIGRhdGE9ZGF0YSwKICAgICAgICBqc29uPWpzb24uZHVtcHMoZGF0YSwgc2VwYXJhdG9ycz0oIiwiLCAiOiIpLCBzb3J0X2tleXM9VHJ1ZSksCiAgICApCgoKY2xhc3MgTXVsdGlEb21haW5CYXNpY0F1dGgoQXV0aEJhc2UpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm9tcHRpbmc9VHJ1ZSk6CiAgICAgICAgc2VsZi5wcm9tcHRpbmcgPSBwcm9tcHRpbmcKICAgICAgICBzZWxmLnBhc3N3b3JkcyA9IHt9CgogICAgZGVmIF9fY2FsbF9fKHNlbGYsIHJlcSk6CiAgICAgICAgcGFyc2VkID0gdXJsbGliX3BhcnNlLnVybHBhcnNlKHJlcS51cmwpCgogICAgICAgICMgR2V0IHRoZSBuZXRsb2Mgd2l0aG91dCBhbnkgZW1iZWRkZWQgY3JlZGVudGlhbHMKICAgICAgICBuZXRsb2MgPSBwYXJzZWQubmV0bG9jLnJzcGxpdCgiQCIsIDEpWy0xXQoKICAgICAgICAjIFNldCB0aGUgdXJsIG9mIHRoZSByZXF1ZXN0IHRvIHRoZSB1cmwgd2l0aG91dCBhbnkgY3JlZGVudGlhbHMKICAgICAgICByZXEudXJsID0gdXJsbGliX3BhcnNlLnVybHVucGFyc2UocGFyc2VkWzoxXSArIChuZXRsb2MsKSArIHBhcnNlZFsyOl0pCgogICAgICAgICMgVXNlIGFueSBzdG9yZWQgY3JlZGVudGlhbHMgdGhhdCB3ZSBoYXZlIGZvciB0aGlzIG5ldGxvYwogICAgICAgIHVzZXJuYW1lLCBwYXNzd29yZCA9IHNlbGYucGFzc3dvcmRzLmdldChuZXRsb2MsIChOb25lLCBOb25lKSkKCiAgICAgICAgIyBFeHRyYWN0IGNyZWRlbnRpYWxzIGVtYmVkZGVkIGluIHRoZSB1cmwgaWYgd2UgaGF2ZSBub25lIHN0b3JlZAogICAgICAgIGlmIHVzZXJuYW1lIGlzIE5vbmU6CiAgICAgICAgICAgIHVzZXJuYW1lLCBwYXNzd29yZCA9IHNlbGYucGFyc2VfY3JlZGVudGlhbHMocGFyc2VkLm5ldGxvYykKCiAgICAgICAgIyBHZXQgY3JlZHMgZnJvbSBuZXRyYyBpZiB3ZSBzdGlsbCBkb24ndCBoYXZlIHRoZW0KICAgICAgICBpZiB1c2VybmFtZSBpcyBOb25lIGFuZCBwYXNzd29yZCBpcyBOb25lOgogICAgICAgICAgICBuZXRyY19hdXRoID0gZ2V0X25ldHJjX2F1dGgocmVxLnVybCkKICAgICAgICAgICAgdXNlcm5hbWUsIHBhc3N3b3JkID0gbmV0cmNfYXV0aCBpZiBuZXRyY19hdXRoIGVsc2UgKE5vbmUsIE5vbmUpCgogICAgICAgIGlmIHVzZXJuYW1lIG9yIHBhc3N3b3JkOgogICAgICAgICAgICAjIFN0b3JlIHRoZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQKICAgICAgICAgICAgc2VsZi5wYXNzd29yZHNbbmV0bG9jXSA9ICh1c2VybmFtZSwgcGFzc3dvcmQpCgogICAgICAgICAgICAjIFNlbmQgdGhlIGJhc2ljIGF1dGggd2l0aCB0aGlzIHJlcXVlc3QKICAgICAgICAgICAgcmVxID0gSFRUUEJhc2ljQXV0aCh1c2VybmFtZSBvciAiIiwgcGFzc3dvcmQgb3IgIiIpKHJlcSkKCiAgICAgICAgIyBBdHRhY2ggYSBob29rIHRvIGhhbmRsZSA0MDEgcmVzcG9uc2VzCiAgICAgICAgcmVxLnJlZ2lzdGVyX2hvb2soInJlc3BvbnNlIiwgc2VsZi5oYW5kbGVfNDAxKQoKICAgICAgICByZXR1cm4gcmVxCgogICAgZGVmIGhhbmRsZV80MDEoc2VsZiwgcmVzcCwgKiprd2FyZ3MpOgogICAgICAgICMgV2Ugb25seSBjYXJlIGFib3V0IDQwMSByZXNwb25zZXMsIGFueXRoaW5nIGVsc2Ugd2Ugd2FudCB0byBqdXN0CiAgICAgICAgIyAgIHBhc3MgdGhyb3VnaCB0aGUgYWN0dWFsIHJlc3BvbnNlCiAgICAgICAgaWYgcmVzcC5zdGF0dXNfY29kZSAhPSA0MDE6CiAgICAgICAgICAgIHJldHVybiByZXNwCgogICAgICAgICMgV2UgYXJlIG5vdCBhYmxlIHRvIHByb21wdCB0aGUgdXNlciBzbyBzaW1wbHkgcmV0dXJuIHRoZSByZXNwb25zZQogICAgICAgIGlmIG5vdCBzZWxmLnByb21wdGluZzoKICAgICAgICAgICAgcmV0dXJuIHJlc3AKCiAgICAgICAgcGFyc2VkID0gdXJsbGliX3BhcnNlLnVybHBhcnNlKHJlc3AudXJsKQoKICAgICAgICAjIFByb21wdCB0aGUgdXNlciBmb3IgYSBuZXcgdXNlcm5hbWUgYW5kIHBhc3N3b3JkCiAgICAgICAgdXNlcm5hbWUgPSBzaXgubW92ZXMuaW5wdXQoIlVzZXIgZm9yICVzOiAiICUgcGFyc2VkLm5ldGxvYykKICAgICAgICBwYXNzd29yZCA9IGdldHBhc3MuZ2V0cGFzcygiUGFzc3dvcmQ6ICIpCgogICAgICAgICMgU3RvcmUgdGhlIG5ldyB1c2VybmFtZSBhbmQgcGFzc3dvcmQgdG8gdXNlIGZvciBmdXR1cmUgcmVxdWVzdHMKICAgICAgICBpZiB1c2VybmFtZSBvciBwYXNzd29yZDoKICAgICAgICAgICAgc2VsZi5wYXNzd29yZHNbcGFyc2VkLm5ldGxvY10gPSAodXNlcm5hbWUsIHBhc3N3b3JkKQoKICAgICAgICAjIENvbnN1bWUgY29udGVudCBhbmQgcmVsZWFzZSB0aGUgb3JpZ2luYWwgY29ubmVjdGlvbiB0byBhbGxvdyBvdXIgbmV3CiAgICAgICAgIyAgIHJlcXVlc3QgdG8gcmV1c2UgdGhlIHNhbWUgb25lLgogICAgICAgIHJlc3AuY29udGVudAogICAgICAgIHJlc3AucmF3LnJlbGVhc2VfY29ubigpCgogICAgICAgICMgQWRkIG91ciBuZXcgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIHRvIHRoZSByZXF1ZXN0CiAgICAgICAgcmVxID0gSFRUUEJhc2ljQXV0aCh1c2VybmFtZSBvciAiIiwgcGFzc3dvcmQgb3IgIiIpKHJlc3AucmVxdWVzdCkKCiAgICAgICAgIyBTZW5kIG91ciBuZXcgcmVxdWVzdAogICAgICAgIG5ld19yZXNwID0gcmVzcC5jb25uZWN0aW9uLnNlbmQocmVxLCAqKmt3YXJncykKICAgICAgICBuZXdfcmVzcC5oaXN0b3J5LmFwcGVuZChyZXNwKQoKICAgICAgICByZXR1cm4gbmV3X3Jlc3AKCiAgICBkZWYgcGFyc2VfY3JlZGVudGlhbHMoc2VsZiwgbmV0bG9jKToKICAgICAgICBpZiAiQCIgaW4gbmV0bG9jOgogICAgICAgICAgICB1c2VyaW5mbyA9IG5ldGxvYy5yc3BsaXQoIkAiLCAxKVswXQogICAgICAgICAgICBpZiAiOiIgaW4gdXNlcmluZm86CiAgICAgICAgICAgICAgICByZXR1cm4gdXNlcmluZm8uc3BsaXQoIjoiLCAxKQogICAgICAgICAgICByZXR1cm4gdXNlcmluZm8sIE5vbmUKICAgICAgICByZXR1cm4gTm9uZSwgTm9uZQoKCmNsYXNzIExvY2FsRlNBZGFwdGVyKEJhc2VBZGFwdGVyKToKCiAgICBkZWYgc2VuZChzZWxmLCByZXF1ZXN0LCBzdHJlYW09Tm9uZSwgdGltZW91dD1Ob25lLCB2ZXJpZnk9Tm9uZSwgY2VydD1Ob25lLAogICAgICAgICAgICAgcHJveGllcz1Ob25lKToKICAgICAgICBwYXRobmFtZSA9IHVybF90b19wYXRoKHJlcXVlc3QudXJsKQoKICAgICAgICByZXNwID0gUmVzcG9uc2UoKQogICAgICAgIHJlc3Auc3RhdHVzX2NvZGUgPSAyMDAKICAgICAgICByZXNwLnVybCA9IHJlcXVlc3QudXJsCgogICAgICAgIHRyeToKICAgICAgICAgICAgc3RhdHMgPSBvcy5zdGF0KHBhdGhuYW1lKQogICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGV4YzoKICAgICAgICAgICAgcmVzcC5zdGF0dXNfY29kZSA9IDQwNAogICAgICAgICAgICByZXNwLnJhdyA9IGV4YwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG1vZGlmaWVkID0gZW1haWwudXRpbHMuZm9ybWF0ZGF0ZShzdGF0cy5zdF9tdGltZSwgdXNlZ210PVRydWUpCiAgICAgICAgICAgIGNvbnRlbnRfdHlwZSA9IG1pbWV0eXBlcy5ndWVzc190eXBlKHBhdGhuYW1lKVswXSBvciAidGV4dC9wbGFpbiIKICAgICAgICAgICAgcmVzcC5oZWFkZXJzID0gQ2FzZUluc2Vuc2l0aXZlRGljdCh7CiAgICAgICAgICAgICAgICAiQ29udGVudC1UeXBlIjogY29udGVudF90eXBlLAogICAgICAgICAgICAgICAgIkNvbnRlbnQtTGVuZ3RoIjogc3RhdHMuc3Rfc2l6ZSwKICAgICAgICAgICAgICAgICJMYXN0LU1vZGlmaWVkIjogbW9kaWZpZWQsCiAgICAgICAgICAgIH0pCgogICAgICAgICAgICByZXNwLnJhdyA9IG9wZW4ocGF0aG5hbWUsICJyYiIpCiAgICAgICAgICAgIHJlc3AuY2xvc2UgPSByZXNwLnJhdy5jbG9zZQoKICAgICAgICByZXR1cm4gcmVzcAoKICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICBwYXNzCgoKY2xhc3MgU2FmZUZpbGVDYWNoZShGaWxlQ2FjaGUpOgogICAgIiIiCiAgICBBIGZpbGUgYmFzZWQgY2FjaGUgd2hpY2ggaXMgc2FmZSB0byB1c2UgZXZlbiB3aGVuIHRoZSB0YXJnZXQgZGlyZWN0b3J5IG1heQogICAgbm90IGJlIGFjY2Vzc2libGUgb3Igd3JpdGFibGUuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICBzdXBlcihTYWZlRmlsZUNhY2hlLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpCgogICAgICAgICMgQ2hlY2sgdG8gZW5zdXJlIHRoYXQgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIG91ciBjYWNoZSBkaXJlY3RvcnkKICAgICAgICAjIGlzIG93bmVkIGJ5IHRoZSB1c2VyIGN1cnJlbnQgZXhlY3V0aW5nIHBpcC4gSWYgaXQgZG9lcyBub3QgZXhpc3QKICAgICAgICAjIHdlIHdpbGwgY2hlY2sgdGhlIHBhcmVudCBkaXJlY3RvcnkgdW50aWwgd2UgZmluZCBvbmUgdGhhdCBkb2VzIGV4aXN0LgogICAgICAgICMgSWYgaXQgaXMgbm90IG93bmVkIGJ5IHRoZSB1c2VyIGV4ZWN1dGluZyBwaXAgdGhlbiB3ZSB3aWxsIGRpc2FibGUKICAgICAgICAjIHRoZSBjYWNoZSBhbmQgbG9nIGEgd2FybmluZy4KICAgICAgICBpZiBub3QgY2hlY2tfcGF0aF9vd25lcihzZWxmLmRpcmVjdG9yeSk6CiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgIlRoZSBkaXJlY3RvcnkgJyVzJyBvciBpdHMgcGFyZW50IGRpcmVjdG9yeSBpcyBub3Qgb3duZWQgYnkgIgogICAgICAgICAgICAgICAgInRoZSBjdXJyZW50IHVzZXIgYW5kIHRoZSBjYWNoZSBoYXMgYmVlbiBkaXNhYmxlZC4gUGxlYXNlICIKICAgICAgICAgICAgICAgICJjaGVjayB0aGUgcGVybWlzc2lvbnMgYW5kIG93bmVyIG9mIHRoYXQgZGlyZWN0b3J5LiBJZiAiCiAgICAgICAgICAgICAgICAiZXhlY3V0aW5nIHBpcCB3aXRoIHN1ZG8sIHlvdSBtYXkgd2FudCBzdWRvJ3MgLUggZmxhZy4iLAogICAgICAgICAgICAgICAgc2VsZi5kaXJlY3RvcnksCiAgICAgICAgICAgICkKCiAgICAgICAgICAgICMgU2V0IG91ciBkaXJlY3RvcnkgdG8gTm9uZSB0byBkaXNhYmxlIHRoZSBDYWNoZQogICAgICAgICAgICBzZWxmLmRpcmVjdG9yeSA9IE5vbmUKCiAgICBkZWYgZ2V0KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgIyBJZiB3ZSBkb24ndCBoYXZlIGEgZGlyZWN0b3J5LCB0aGVuIHRoZSBjYWNoZSBzaG91bGQgYmUgYSBuby1vcC4KICAgICAgICBpZiBzZWxmLmRpcmVjdG9yeSBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc3VwZXIoU2FmZUZpbGVDYWNoZSwgc2VsZikuZ2V0KCphcmdzLCAqKmt3YXJncykKICAgICAgICBleGNlcHQgKExvY2tFcnJvciwgT1NFcnJvciwgSU9FcnJvcik6CiAgICAgICAgICAgICMgV2UgaW50ZW50aW9uYWxseSBzaWxlbmNlIHRoaXMgZXJyb3IsIGlmIHdlIGNhbid0IGFjY2VzcyB0aGUgY2FjaGUKICAgICAgICAgICAgIyB0aGVuIHdlIGNhbiBqdXN0IHNraXAgY2FjaGluZyBhbmQgcHJvY2VzcyB0aGUgcmVxdWVzdCBhcyBpZgogICAgICAgICAgICAjIGNhY2hpbmcgd2Fzbid0IGVuYWJsZWQuCiAgICAgICAgICAgIHBhc3MKCiAgICBkZWYgc2V0KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgIyBJZiB3ZSBkb24ndCBoYXZlIGEgZGlyZWN0b3J5LCB0aGVuIHRoZSBjYWNoZSBzaG91bGQgYmUgYSBuby1vcC4KICAgICAgICBpZiBzZWxmLmRpcmVjdG9yeSBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc3VwZXIoU2FmZUZpbGVDYWNoZSwgc2VsZikuc2V0KCphcmdzLCAqKmt3YXJncykKICAgICAgICBleGNlcHQgKExvY2tFcnJvciwgT1NFcnJvciwgSU9FcnJvcik6CiAgICAgICAgICAgICMgV2UgaW50ZW50aW9uYWxseSBzaWxlbmNlIHRoaXMgZXJyb3IsIGlmIHdlIGNhbid0IGFjY2VzcyB0aGUgY2FjaGUKICAgICAgICAgICAgIyB0aGVuIHdlIGNhbiBqdXN0IHNraXAgY2FjaGluZyBhbmQgcHJvY2VzcyB0aGUgcmVxdWVzdCBhcyBpZgogICAgICAgICAgICAjIGNhY2hpbmcgd2Fzbid0IGVuYWJsZWQuCiAgICAgICAgICAgIHBhc3MKCiAgICBkZWYgZGVsZXRlKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgIyBJZiB3ZSBkb24ndCBoYXZlIGEgZGlyZWN0b3J5LCB0aGVuIHRoZSBjYWNoZSBzaG91bGQgYmUgYSBuby1vcC4KICAgICAgICBpZiBzZWxmLmRpcmVjdG9yeSBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc3VwZXIoU2FmZUZpbGVDYWNoZSwgc2VsZikuZGVsZXRlKCphcmdzLCAqKmt3YXJncykKICAgICAgICBleGNlcHQgKExvY2tFcnJvciwgT1NFcnJvciwgSU9FcnJvcik6CiAgICAgICAgICAgICMgV2UgaW50ZW50aW9uYWxseSBzaWxlbmNlIHRoaXMgZXJyb3IsIGlmIHdlIGNhbid0IGFjY2VzcyB0aGUgY2FjaGUKICAgICAgICAgICAgIyB0aGVuIHdlIGNhbiBqdXN0IHNraXAgY2FjaGluZyBhbmQgcHJvY2VzcyB0aGUgcmVxdWVzdCBhcyBpZgogICAgICAgICAgICAjIGNhY2hpbmcgd2Fzbid0IGVuYWJsZWQuCiAgICAgICAgICAgIHBhc3MKCgpjbGFzcyBJbnNlY3VyZUhUVFBBZGFwdGVyKEhUVFBBZGFwdGVyKToKCiAgICBkZWYgY2VydF92ZXJpZnkoc2VsZiwgY29ubiwgdXJsLCB2ZXJpZnksIGNlcnQpOgogICAgICAgIGNvbm4uY2VydF9yZXFzID0gJ0NFUlRfTk9ORScKICAgICAgICBjb25uLmNhX2NlcnRzID0gTm9uZQoKCmNsYXNzIFBpcFNlc3Npb24ocmVxdWVzdHMuU2Vzc2lvbik6CgogICAgdGltZW91dCA9IE5vbmUKCiAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICByZXRyaWVzID0ga3dhcmdzLnBvcCgicmV0cmllcyIsIDApCiAgICAgICAgY2FjaGUgPSBrd2FyZ3MucG9wKCJjYWNoZSIsIE5vbmUpCiAgICAgICAgaW5zZWN1cmVfaG9zdHMgPSBrd2FyZ3MucG9wKCJpbnNlY3VyZV9ob3N0cyIsIFtdKQoKICAgICAgICBzdXBlcihQaXBTZXNzaW9uLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpCgogICAgICAgICMgQXR0YWNoIG91ciBVc2VyIEFnZW50IHRvIHRoZSByZXF1ZXN0CiAgICAgICAgc2VsZi5oZWFkZXJzWyJVc2VyLUFnZW50Il0gPSB1c2VyX2FnZW50KCkKCiAgICAgICAgIyBBdHRhY2ggb3VyIEF1dGhlbnRpY2F0aW9uIGhhbmRsZXIgdG8gdGhlIHNlc3Npb24KICAgICAgICBzZWxmLmF1dGggPSBNdWx0aURvbWFpbkJhc2ljQXV0aCgpCgogICAgICAgICMgQ3JlYXRlIG91ciB1cmxsaWIzLlJldHJ5IGluc3RhbmNlIHdoaWNoIHdpbGwgYWxsb3cgdXMgdG8gY3VzdG9taXplCiAgICAgICAgIyBob3cgd2UgaGFuZGxlIHJldHJpZXMuCiAgICAgICAgcmV0cmllcyA9IHVybGxpYjMuUmV0cnkoCiAgICAgICAgICAgICMgU2V0IHRoZSB0b3RhbCBudW1iZXIgb2YgcmV0cmllcyB0aGF0IGEgcGFydGljdWxhciByZXF1ZXN0IGNhbgogICAgICAgICAgICAjIGhhdmUuCiAgICAgICAgICAgIHRvdGFsPXJldHJpZXMsCgogICAgICAgICAgICAjIEEgNTAzIGVycm9yIGZyb20gUHlQSSB0eXBpY2FsbHkgbWVhbnMgdGhhdCB0aGUgRmFzdGx5IC0+IE9yaWdpbgogICAgICAgICAgICAjIGNvbm5lY3Rpb24gZ290IGludGVycnVwdGVkIGluIHNvbWUgd2F5LiBBIDUwMyBlcnJvciBpbiBnZW5lcmFsCiAgICAgICAgICAgICMgaXMgdHlwaWNhbGx5IGNvbnNpZGVyZWQgYSB0cmFuc2llbnQgZXJyb3Igc28gd2UnbGwgZ28gYWhlYWQgYW5kCiAgICAgICAgICAgICMgcmV0cnkgaXQuCiAgICAgICAgICAgIHN0YXR1c19mb3JjZWxpc3Q9WzUwM10sCgogICAgICAgICAgICAjIEFkZCBhIHNtYWxsIGFtb3VudCBvZiBiYWNrIG9mZiBiZXR3ZWVuIGZhaWxlZCByZXF1ZXN0cyBpbgogICAgICAgICAgICAjIG9yZGVyIHRvIHByZXZlbnQgaGFtbWVyaW5nIHRoZSBzZXJ2aWNlLgogICAgICAgICAgICBiYWNrb2ZmX2ZhY3Rvcj0wLjI1LAogICAgICAgICkKCiAgICAgICAgIyBXZSB3YW50IHRvIF9vbmx5XyBjYWNoZSByZXNwb25zZXMgb24gc2VjdXJlbHkgZmV0Y2hlZCBvcmlnaW5zLiBXZSBkbwogICAgICAgICMgdGhpcyBiZWNhdXNlIHdlIGNhbid0IHZhbGlkYXRlIHRoZSByZXNwb25zZSBvZiBhbiBpbnNlY3VyZWx5IGZldGNoZWQKICAgICAgICAjIG9yaWdpbiwgYW5kIHdlIGRvbid0IHdhbnQgc29tZW9uZSB0byBiZSBhYmxlIHRvIHBvaXNvbiB0aGUgY2FjaGUgYW5kCiAgICAgICAgIyByZXF1aXJlIG1hbnVhbCBldmljdGlvbiBmcm9tIHRoZSBjYWNoZSB0byBmaXggaXQuCiAgICAgICAgaWYgY2FjaGU6CiAgICAgICAgICAgIHNlY3VyZV9hZGFwdGVyID0gQ2FjaGVDb250cm9sQWRhcHRlcigKICAgICAgICAgICAgICAgIGNhY2hlPVNhZmVGaWxlQ2FjaGUoY2FjaGUsIHVzZV9kaXJfbG9jaz1UcnVlKSwKICAgICAgICAgICAgICAgIG1heF9yZXRyaWVzPXJldHJpZXMsCiAgICAgICAgICAgICkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWN1cmVfYWRhcHRlciA9IEhUVFBBZGFwdGVyKG1heF9yZXRyaWVzPXJldHJpZXMpCgogICAgICAgICMgT3VyIEluc2VjdXJlIEhUVFBBZGFwdGVyIGRpc2FibGVzIEhUVFBTIHZhbGlkYXRpb24uIEl0IGRvZXMgbm90CiAgICAgICAgIyBzdXBwb3J0IGNhY2hpbmcgKHNlZSBhYm92ZSkgc28gd2UnbGwgdXNlIGl0IGZvciBhbGwgaHR0cDovLyBVUkxzIGFzCiAgICAgICAgIyB3ZWxsIGFzIGFueSBodHRwczovLyBob3N0IHRoYXQgd2UndmUgbWFya2VkIGFzIGlnbm9yaW5nIFRMUyBlcnJvcnMKICAgICAgICAjIGZvci4KICAgICAgICBpbnNlY3VyZV9hZGFwdGVyID0gSW5zZWN1cmVIVFRQQWRhcHRlcihtYXhfcmV0cmllcz1yZXRyaWVzKQoKICAgICAgICBzZWxmLm1vdW50KCJodHRwczovLyIsIHNlY3VyZV9hZGFwdGVyKQogICAgICAgIHNlbGYubW91bnQoImh0dHA6Ly8iLCBpbnNlY3VyZV9hZGFwdGVyKQoKICAgICAgICAjIEVuYWJsZSBmaWxlOi8vIHVybHMKICAgICAgICBzZWxmLm1vdW50KCJmaWxlOi8vIiwgTG9jYWxGU0FkYXB0ZXIoKSkKCiAgICAgICAgIyBXZSB3YW50IHRvIHVzZSBhIG5vbi12YWxpZGF0aW5nIGFkYXB0ZXIgZm9yIGFueSByZXF1ZXN0cyB3aGljaCBhcmUKICAgICAgICAjIGRlZW1lZCBpbnNlY3VyZS4KICAgICAgICBmb3IgaG9zdCBpbiBpbnNlY3VyZV9ob3N0czoKICAgICAgICAgICAgc2VsZi5tb3VudCgiaHR0cHM6Ly97MH0vIi5mb3JtYXQoaG9zdCksIGluc2VjdXJlX2FkYXB0ZXIpCgogICAgZGVmIHJlcXVlc3Qoc2VsZiwgbWV0aG9kLCB1cmwsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgIyBBbGxvdyBzZXR0aW5nIGEgZGVmYXVsdCB0aW1lb3V0IG9uIGEgc2Vzc2lvbgogICAgICAgIGt3YXJncy5zZXRkZWZhdWx0KCJ0aW1lb3V0Iiwgc2VsZi50aW1lb3V0KQoKICAgICAgICAjIERpc3BhdGNoIHRoZSBhY3R1YWwgcmVxdWVzdAogICAgICAgIHJldHVybiBzdXBlcihQaXBTZXNzaW9uLCBzZWxmKS5yZXF1ZXN0KG1ldGhvZCwgdXJsLCAqYXJncywgKiprd2FyZ3MpCgoKZGVmIGdldF9maWxlX2NvbnRlbnQodXJsLCBjb21lc19mcm9tPU5vbmUsIHNlc3Npb249Tm9uZSk6CiAgICAiIiJHZXRzIHRoZSBjb250ZW50IG9mIGEgZmlsZTsgaXQgbWF5IGJlIGEgZmlsZW5hbWUsIGZpbGU6IFVSTCwgb3IKICAgIGh0dHA6IFVSTC4gIFJldHVybnMgKGxvY2F0aW9uLCBjb250ZW50KS4gIENvbnRlbnQgaXMgdW5pY29kZS4iIiIKICAgIGlmIHNlc3Npb24gaXMgTm9uZToKICAgICAgICByYWlzZSBUeXBlRXJyb3IoCiAgICAgICAgICAgICJnZXRfZmlsZV9jb250ZW50KCkgbWlzc2luZyAxIHJlcXVpcmVkIGtleXdvcmQgYXJndW1lbnQ6ICdzZXNzaW9uJyIKICAgICAgICApCgogICAgbWF0Y2ggPSBfc2NoZW1lX3JlLnNlYXJjaCh1cmwpCiAgICBpZiBtYXRjaDoKICAgICAgICBzY2hlbWUgPSBtYXRjaC5ncm91cCgxKS5sb3dlcigpCiAgICAgICAgaWYgKHNjaGVtZSA9PSAnZmlsZScgYW5kIGNvbWVzX2Zyb20gYW5kCiAgICAgICAgICAgICAgICBjb21lc19mcm9tLnN0YXJ0c3dpdGgoJ2h0dHAnKSk6CiAgICAgICAgICAgIHJhaXNlIEluc3RhbGxhdGlvbkVycm9yKAogICAgICAgICAgICAgICAgJ1JlcXVpcmVtZW50cyBmaWxlICVzIHJlZmVyZW5jZXMgVVJMICVzLCB3aGljaCBpcyBsb2NhbCcKICAgICAgICAgICAgICAgICUgKGNvbWVzX2Zyb20sIHVybCkpCiAgICAgICAgaWYgc2NoZW1lID09ICdmaWxlJzoKICAgICAgICAgICAgcGF0aCA9IHVybC5zcGxpdCgnOicsIDEpWzFdCiAgICAgICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoJ1xcJywgJy8nKQogICAgICAgICAgICBtYXRjaCA9IF91cmxfc2xhc2hfZHJpdmVfcmUubWF0Y2gocGF0aCkKICAgICAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgICAgICBwYXRoID0gbWF0Y2guZ3JvdXAoMSkgKyAnOicgKyBwYXRoLnNwbGl0KCd8JywgMSlbMV0KICAgICAgICAgICAgcGF0aCA9IHVybGxpYl9wYXJzZS51bnF1b3RlKHBhdGgpCiAgICAgICAgICAgIGlmIHBhdGguc3RhcnRzd2l0aCgnLycpOgogICAgICAgICAgICAgICAgcGF0aCA9ICcvJyArIHBhdGgubHN0cmlwKCcvJykKICAgICAgICAgICAgdXJsID0gcGF0aAogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgRklYTUU6IGNhdGNoIHNvbWUgZXJyb3JzCiAgICAgICAgICAgIHJlc3AgPSBzZXNzaW9uLmdldCh1cmwpCiAgICAgICAgICAgIHJlc3AucmFpc2VfZm9yX3N0YXR1cygpCiAgICAgICAgICAgIHJldHVybiByZXNwLnVybCwgcmVzcC50ZXh0CiAgICB0cnk6CiAgICAgICAgd2l0aCBvcGVuKHVybCwgJ3JiJykgYXMgZjoKICAgICAgICAgICAgY29udGVudCA9IGF1dG9fZGVjb2RlKGYucmVhZCgpKQogICAgZXhjZXB0IElPRXJyb3IgYXMgZXhjOgogICAgICAgIHJhaXNlIEluc3RhbGxhdGlvbkVycm9yKAogICAgICAgICAgICAnQ291bGQgbm90IG9wZW4gcmVxdWlyZW1lbnRzIGZpbGU6ICVzJyAlIHN0cihleGMpCiAgICAgICAgKQogICAgcmV0dXJuIHVybCwgY29udGVudAoKCl9zY2hlbWVfcmUgPSByZS5jb21waWxlKHInXihodHRwfGh0dHBzfGZpbGUpOicsIHJlLkkpCl91cmxfc2xhc2hfZHJpdmVfcmUgPSByZS5jb21waWxlKHInLyooW2Etel0pXHwnLCByZS5JKQoKCmRlZiBpc191cmwobmFtZSk6CiAgICAiIiJSZXR1cm5zIHRydWUgaWYgdGhlIG5hbWUgbG9va3MgbGlrZSBhIFVSTCIiIgogICAgaWYgJzonIG5vdCBpbiBuYW1lOgogICAgICAgIHJldHVybiBGYWxzZQogICAgc2NoZW1lID0gbmFtZS5zcGxpdCgnOicsIDEpWzBdLmxvd2VyKCkKICAgIHJldHVybiBzY2hlbWUgaW4gWydodHRwJywgJ2h0dHBzJywgJ2ZpbGUnLCAnZnRwJ10gKyB2Y3MuYWxsX3NjaGVtZXMKCgpkZWYgdXJsX3RvX3BhdGgodXJsKToKICAgICIiIgogICAgQ29udmVydCBhIGZpbGU6IFVSTCB0byBhIHBhdGguCiAgICAiIiIKICAgIGFzc2VydCB1cmwuc3RhcnRzd2l0aCgnZmlsZTonKSwgKAogICAgICAgICJZb3UgY2FuIG9ubHkgdHVybiBmaWxlOiB1cmxzIGludG8gZmlsZW5hbWVzIChub3QgJXIpIiAlIHVybCkKCiAgICBfLCBuZXRsb2MsIHBhdGgsIF8sIF8gPSB1cmxsaWJfcGFyc2UudXJsc3BsaXQodXJsKQoKICAgICMgaWYgd2UgaGF2ZSBhIFVOQyBwYXRoLCBwcmVwZW5kIFVOQyBzaGFyZSBub3RhdGlvbgogICAgaWYgbmV0bG9jOgogICAgICAgIG5ldGxvYyA9ICdcXFxcJyArIG5ldGxvYwoKICAgIHBhdGggPSB1cmxsaWJfcmVxdWVzdC51cmwycGF0aG5hbWUobmV0bG9jICsgcGF0aCkKICAgIHJldHVybiBwYXRoCgoKZGVmIHBhdGhfdG9fdXJsKHBhdGgpOgogICAgIiIiCiAgICBDb252ZXJ0IGEgcGF0aCB0byBhIGZpbGU6IFVSTC4gIFRoZSBwYXRoIHdpbGwgYmUgbWFkZSBhYnNvbHV0ZSBhbmQgaGF2ZQogICAgcXVvdGVkIHBhdGggcGFydHMuCiAgICAiIiIKICAgIHBhdGggPSBvcy5wYXRoLm5vcm1wYXRoKG9zLnBhdGguYWJzcGF0aChwYXRoKSkKICAgIHVybCA9IHVybGxpYl9wYXJzZS51cmxqb2luKCdmaWxlOicsIHVybGxpYl9yZXF1ZXN0LnBhdGhuYW1lMnVybChwYXRoKSkKICAgIHJldHVybiB1cmwKCgpkZWYgaXNfYXJjaGl2ZV9maWxlKG5hbWUpOgogICAgIiIiUmV0dXJuIFRydWUgaWYgYG5hbWVgIGlzIGEgY29uc2lkZXJlZCBhcyBhbiBhcmNoaXZlIGZpbGUuIiIiCiAgICBleHQgPSBzcGxpdGV4dChuYW1lKVsxXS5sb3dlcigpCiAgICBpZiBleHQgaW4gQVJDSElWRV9FWFRFTlNJT05TOgogICAgICAgIHJldHVybiBUcnVlCiAgICByZXR1cm4gRmFsc2UKCgpkZWYgdW5wYWNrX3Zjc19saW5rKGxpbmssIGxvY2F0aW9uKToKICAgIHZjc19iYWNrZW5kID0gX2dldF91c2VkX3Zjc19iYWNrZW5kKGxpbmspCiAgICB2Y3NfYmFja2VuZC51bnBhY2sobG9jYXRpb24pCgoKZGVmIF9nZXRfdXNlZF92Y3NfYmFja2VuZChsaW5rKToKICAgIGZvciBiYWNrZW5kIGluIHZjcy5iYWNrZW5kczoKICAgICAgICBpZiBsaW5rLnNjaGVtZSBpbiBiYWNrZW5kLnNjaGVtZXM6CiAgICAgICAgICAgIHZjc19iYWNrZW5kID0gYmFja2VuZChsaW5rLnVybCkKICAgICAgICAgICAgcmV0dXJuIHZjc19iYWNrZW5kCgoKZGVmIGlzX3Zjc191cmwobGluayk6CiAgICByZXR1cm4gYm9vbChfZ2V0X3VzZWRfdmNzX2JhY2tlbmQobGluaykpCgoKZGVmIGlzX2ZpbGVfdXJsKGxpbmspOgogICAgcmV0dXJuIGxpbmsudXJsLmxvd2VyKCkuc3RhcnRzd2l0aCgnZmlsZTonKQoKCmRlZiBpc19kaXJfdXJsKGxpbmspOgogICAgIiIiUmV0dXJuIHdoZXRoZXIgYSBmaWxlOi8vIExpbmsgcG9pbnRzIHRvIGEgZGlyZWN0b3J5LgoKICAgIGBgbGlua2BgIG11c3Qgbm90IGhhdmUgYW55IG90aGVyIHNjaGVtZSBidXQgZmlsZTovLy4gQ2FsbCBpc19maWxlX3VybCgpCiAgICBmaXJzdC4KCiAgICAiIiIKICAgIGxpbmtfcGF0aCA9IHVybF90b19wYXRoKGxpbmsudXJsX3dpdGhvdXRfZnJhZ21lbnQpCiAgICByZXR1cm4gb3MucGF0aC5pc2RpcihsaW5rX3BhdGgpCgoKZGVmIF9wcm9ncmVzc19pbmRpY2F0b3IoaXRlcmFibGUsICphcmdzLCAqKmt3YXJncyk6CiAgICByZXR1cm4gaXRlcmFibGUKCgpkZWYgX2Rvd25sb2FkX3VybChyZXNwLCBsaW5rLCBjb250ZW50X2ZpbGUsIGhhc2hlcyk6CiAgICB0cnk6CiAgICAgICAgdG90YWxfbGVuZ3RoID0gaW50KHJlc3AuaGVhZGVyc1snY29udGVudC1sZW5ndGgnXSkKICAgIGV4Y2VwdCAoVmFsdWVFcnJvciwgS2V5RXJyb3IsIFR5cGVFcnJvcik6CiAgICAgICAgdG90YWxfbGVuZ3RoID0gMAoKICAgIGNhY2hlZF9yZXNwID0gZ2V0YXR0cihyZXNwLCAiZnJvbV9jYWNoZSIsIEZhbHNlKQoKICAgIGlmIGxvZ2dlci5nZXRFZmZlY3RpdmVMZXZlbCgpID4gbG9nZ2luZy5JTkZPOgogICAgICAgIHNob3dfcHJvZ3Jlc3MgPSBGYWxzZQogICAgZWxpZiBjYWNoZWRfcmVzcDoKICAgICAgICBzaG93X3Byb2dyZXNzID0gRmFsc2UKICAgIGVsaWYgdG90YWxfbGVuZ3RoID4gKDQwICogMTAwMCk6CiAgICAgICAgc2hvd19wcm9ncmVzcyA9IFRydWUKICAgIGVsaWYgbm90IHRvdGFsX2xlbmd0aDoKICAgICAgICBzaG93X3Byb2dyZXNzID0gVHJ1ZQogICAgZWxzZToKICAgICAgICBzaG93X3Byb2dyZXNzID0gRmFsc2UKCiAgICBzaG93X3VybCA9IGxpbmsuc2hvd191cmwKCiAgICBkZWYgcmVzcF9yZWFkKGNodW5rX3NpemUpOgogICAgICAgIHRyeToKICAgICAgICAgICAgIyBTcGVjaWFsIGNhc2UgZm9yIHVybGxpYjMuCiAgICAgICAgICAgIGZvciBjaHVuayBpbiByZXNwLnJhdy5zdHJlYW0oCiAgICAgICAgICAgICAgICAgICAgY2h1bmtfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAjIFdlIHVzZSBkZWNvZGVfY29udGVudD1GYWxzZSBoZXJlIGJlY2F1c2Ugd2UgZG9uJ3QKICAgICAgICAgICAgICAgICAgICAjIHdhbnQgdXJsbGliMyB0byBtZXNzIHdpdGggdGhlIHJhdyBieXRlcyB3ZSBnZXQKICAgICAgICAgICAgICAgICAgICAjIGZyb20gdGhlIHNlcnZlci4gSWYgd2UgZGVjb21wcmVzcyBpbnNpZGUgb2YKICAgICAgICAgICAgICAgICAgICAjIHVybGxpYjMgdGhlbiB3ZSBjYW5ub3QgdmVyaWZ5IHRoZSBjaGVja3N1bQogICAgICAgICAgICAgICAgICAgICMgYmVjYXVzZSB0aGUgY2hlY2tzdW0gd2lsbCBiZSBvZiB0aGUgY29tcHJlc3NlZAogICAgICAgICAgICAgICAgICAgICMgZmlsZS4gVGhpcyBicmVha2FnZSB3aWxsIG9ubHkgb2NjdXIgaWYgdGhlCiAgICAgICAgICAgICAgICAgICAgIyBzZXJ2ZXIgYWRkcyBhIENvbnRlbnQtRW5jb2RpbmcgaGVhZGVyLCB3aGljaAogICAgICAgICAgICAgICAgICAgICMgZGVwZW5kcyBvbiBob3cgdGhlIHNlcnZlciB3YXMgY29uZmlndXJlZDoKICAgICAgICAgICAgICAgICAgICAjIC0gU29tZSBzZXJ2ZXJzIHdpbGwgbm90aWNlIHRoYXQgdGhlIGZpbGUgaXNuJ3QgYQogICAgICAgICAgICAgICAgICAgICMgICBjb21wcmVzc2libGUgZmlsZSBhbmQgd2lsbCBsZWF2ZSB0aGUgZmlsZSBhbG9uZQogICAgICAgICAgICAgICAgICAgICMgICBhbmQgd2l0aCBhbiBlbXB0eSBDb250ZW50LUVuY29kaW5nCiAgICAgICAgICAgICAgICAgICAgIyAtIFNvbWUgc2VydmVycyB3aWxsIG5vdGljZSB0aGF0IHRoZSBmaWxlIGlzCiAgICAgICAgICAgICAgICAgICAgIyAgIGFscmVhZHkgY29tcHJlc3NlZCBhbmQgd2lsbCBsZWF2ZSB0aGUgZmlsZQogICAgICAgICAgICAgICAgICAgICMgICBhbG9uZSBhbmQgd2lsbCBhZGQgYSBDb250ZW50LUVuY29kaW5nOiBnemlwCiAgICAgICAgICAgICAgICAgICAgIyAgIGhlYWRlcgogICAgICAgICAgICAgICAgICAgICMgLSBTb21lIHNlcnZlcnMgd29uJ3Qgbm90aWNlIGFueXRoaW5nIGF0IGFsbCBhbmQKICAgICAgICAgICAgICAgICAgICAjICAgd2lsbCB0YWtlIGEgZmlsZSB0aGF0J3MgYWxyZWFkeSBiZWVuIGNvbXByZXNzZWQKICAgICAgICAgICAgICAgICAgICAjICAgYW5kIGNvbXByZXNzIGl0IGFnYWluIGFuZCBzZXQgdGhlCiAgICAgICAgICAgICAgICAgICAgIyAgIENvbnRlbnQtRW5jb2Rpbmc6IGd6aXAgaGVhZGVyCiAgICAgICAgICAgICAgICAgICAgIwogICAgICAgICAgICAgICAgICAgICMgQnkgc2V0dGluZyB0aGlzIG5vdCB0byBkZWNvZGUgYXV0b21hdGljYWxseSB3ZQogICAgICAgICAgICAgICAgICAgICMgaG9wZSB0byBlbGltaW5hdGUgcHJvYmxlbXMgd2l0aCB0aGUgc2Vjb25kIGNhc2UuCiAgICAgICAgICAgICAgICAgICAgZGVjb2RlX2NvbnRlbnQ9RmFsc2UpOgogICAgICAgICAgICAgICAgeWllbGQgY2h1bmsKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgICMgU3RhbmRhcmQgZmlsZS1saWtlIG9iamVjdC4KICAgICAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgICAgIGNodW5rID0gcmVzcC5yYXcucmVhZChjaHVua19zaXplKQogICAgICAgICAgICAgICAgaWYgbm90IGNodW5rOgogICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICB5aWVsZCBjaHVuawoKICAgIGRlZiB3cml0dGVuX2NodW5rcyhjaHVua3MpOgogICAgICAgIGZvciBjaHVuayBpbiBjaHVua3M6CiAgICAgICAgICAgIGNvbnRlbnRfZmlsZS53cml0ZShjaHVuaykKICAgICAgICAgICAgeWllbGQgY2h1bmsKCiAgICBwcm9ncmVzc19pbmRpY2F0b3IgPSBfcHJvZ3Jlc3NfaW5kaWNhdG9yCgogICAgaWYgbGluay5uZXRsb2MgPT0gUHlQSS5uZXRsb2M6CiAgICAgICAgdXJsID0gc2hvd191cmwKICAgIGVsc2U6CiAgICAgICAgdXJsID0gbGluay51cmxfd2l0aG91dF9mcmFnbWVudAoKICAgIGlmIHNob3dfcHJvZ3Jlc3M6ICAjIFdlIGRvbid0IHNob3cgcHJvZ3Jlc3Mgb24gY2FjaGVkIHJlc3BvbnNlcwogICAgICAgIGlmIHRvdGFsX2xlbmd0aDoKICAgICAgICAgICAgbG9nZ2VyLmluZm8oIkRvd25sb2FkaW5nICVzICglcykiLCB1cmwsIGZvcm1hdF9zaXplKHRvdGFsX2xlbmd0aCkpCiAgICAgICAgICAgIHByb2dyZXNzX2luZGljYXRvciA9IERvd25sb2FkUHJvZ3Jlc3NCYXIobWF4PXRvdGFsX2xlbmd0aCkuaXRlcgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJEb3dubG9hZGluZyAlcyIsIHVybCkKICAgICAgICAgICAgcHJvZ3Jlc3NfaW5kaWNhdG9yID0gRG93bmxvYWRQcm9ncmVzc1NwaW5uZXIoKS5pdGVyCiAgICBlbGlmIGNhY2hlZF9yZXNwOgogICAgICAgIGxvZ2dlci5pbmZvKCJVc2luZyBjYWNoZWQgJXMiLCB1cmwpCiAgICBlbHNlOgogICAgICAgIGxvZ2dlci5pbmZvKCJEb3dubG9hZGluZyAlcyIsIHVybCkKCiAgICBsb2dnZXIuZGVidWcoJ0Rvd25sb2FkaW5nIGZyb20gVVJMICVzJywgbGluaykKCiAgICBkb3dubG9hZGVkX2NodW5rcyA9IHdyaXR0ZW5fY2h1bmtzKAogICAgICAgIHByb2dyZXNzX2luZGljYXRvcigKICAgICAgICAgICAgcmVzcF9yZWFkKENPTlRFTlRfQ0hVTktfU0laRSksCiAgICAgICAgICAgIENPTlRFTlRfQ0hVTktfU0laRQogICAgICAgICkKICAgICkKICAgIGlmIGhhc2hlczoKICAgICAgICBoYXNoZXMuY2hlY2tfYWdhaW5zdF9jaHVua3MoZG93bmxvYWRlZF9jaHVua3MpCiAgICBlbHNlOgogICAgICAgIGNvbnN1bWUoZG93bmxvYWRlZF9jaHVua3MpCgoKZGVmIF9jb3B5X2ZpbGUoZmlsZW5hbWUsIGxvY2F0aW9uLCBsaW5rKToKICAgIGNvcHkgPSBUcnVlCiAgICBkb3dubG9hZF9sb2NhdGlvbiA9IG9zLnBhdGguam9pbihsb2NhdGlvbiwgbGluay5maWxlbmFtZSkKICAgIGlmIG9zLnBhdGguZXhpc3RzKGRvd25sb2FkX2xvY2F0aW9uKToKICAgICAgICByZXNwb25zZSA9IGFza19wYXRoX2V4aXN0cygKICAgICAgICAgICAgJ1RoZSBmaWxlICVzIGV4aXN0cy4gKGkpZ25vcmUsICh3KWlwZSwgKGIpYWNrdXAsIChhKWFib3J0JyAlCiAgICAgICAgICAgIGRpc3BsYXlfcGF0aChkb3dubG9hZF9sb2NhdGlvbiksICgnaScsICd3JywgJ2InLCAnYScpKQogICAgICAgIGlmIHJlc3BvbnNlID09ICdpJzoKICAgICAgICAgICAgY29weSA9IEZhbHNlCiAgICAgICAgZWxpZiByZXNwb25zZSA9PSAndyc6CiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdEZWxldGluZyAlcycsIGRpc3BsYXlfcGF0aChkb3dubG9hZF9sb2NhdGlvbikpCiAgICAgICAgICAgIG9zLnJlbW92ZShkb3dubG9hZF9sb2NhdGlvbikKICAgICAgICBlbGlmIHJlc3BvbnNlID09ICdiJzoKICAgICAgICAgICAgZGVzdF9maWxlID0gYmFja3VwX2Rpcihkb3dubG9hZF9sb2NhdGlvbikKICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAnQmFja2luZyB1cCAlcyB0byAlcycsCiAgICAgICAgICAgICAgICBkaXNwbGF5X3BhdGgoZG93bmxvYWRfbG9jYXRpb24pLAogICAgICAgICAgICAgICAgZGlzcGxheV9wYXRoKGRlc3RfZmlsZSksCiAgICAgICAgICAgICkKICAgICAgICAgICAgc2h1dGlsLm1vdmUoZG93bmxvYWRfbG9jYXRpb24sIGRlc3RfZmlsZSkKICAgICAgICBlbGlmIHJlc3BvbnNlID09ICdhJzoKICAgICAgICAgICAgc3lzLmV4aXQoLTEpCiAgICBpZiBjb3B5OgogICAgICAgIHNodXRpbC5jb3B5KGZpbGVuYW1lLCBkb3dubG9hZF9sb2NhdGlvbikKICAgICAgICBsb2dnZXIuaW5mbygnU2F2ZWQgJXMnLCBkaXNwbGF5X3BhdGgoZG93bmxvYWRfbG9jYXRpb24pKQoKCmRlZiB1bnBhY2tfaHR0cF91cmwobGluaywgbG9jYXRpb24sIGRvd25sb2FkX2Rpcj1Ob25lLAogICAgICAgICAgICAgICAgICAgIHNlc3Npb249Tm9uZSwgaGFzaGVzPU5vbmUpOgogICAgaWYgc2Vzc2lvbiBpcyBOb25lOgogICAgICAgIHJhaXNlIFR5cGVFcnJvcigKICAgICAgICAgICAgInVucGFja19odHRwX3VybCgpIG1pc3NpbmcgMSByZXF1aXJlZCBrZXl3b3JkIGFyZ3VtZW50OiAnc2Vzc2lvbiciCiAgICAgICAgKQoKICAgIHRlbXBfZGlyID0gdGVtcGZpbGUubWtkdGVtcCgnLXVucGFjaycsICdwaXAtJykKCiAgICAjIElmIGEgZG93bmxvYWQgZGlyIGlzIHNwZWNpZmllZCwgaXMgdGhlIGZpbGUgYWxyZWFkeSBkb3dubG9hZGVkIHRoZXJlPwogICAgYWxyZWFkeV9kb3dubG9hZGVkX3BhdGggPSBOb25lCiAgICBpZiBkb3dubG9hZF9kaXI6CiAgICAgICAgYWxyZWFkeV9kb3dubG9hZGVkX3BhdGggPSBfY2hlY2tfZG93bmxvYWRfZGlyKGxpbmssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkX2RpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaGVzKQoKICAgIGlmIGFscmVhZHlfZG93bmxvYWRlZF9wYXRoOgogICAgICAgIGZyb21fcGF0aCA9IGFscmVhZHlfZG93bmxvYWRlZF9wYXRoCiAgICAgICAgY29udGVudF90eXBlID0gbWltZXR5cGVzLmd1ZXNzX3R5cGUoZnJvbV9wYXRoKVswXQogICAgZWxzZToKICAgICAgICAjIGxldCdzIGRvd25sb2FkIHRvIGEgdG1wIGRpcgogICAgICAgIGZyb21fcGF0aCwgY29udGVudF90eXBlID0gX2Rvd25sb2FkX2h0dHBfdXJsKGxpbmssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wX2RpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoZXMpCgogICAgIyB1bnBhY2sgdGhlIGFyY2hpdmUgdG8gdGhlIGJ1aWxkIGRpciBsb2NhdGlvbi4gZXZlbiB3aGVuIG9ubHkgZG93bmxvYWRpbmcKICAgICMgYXJjaGl2ZXMsIHRoZXkgaGF2ZSB0byBiZSB1bnBhY2tlZCB0byBwYXJzZSBkZXBlbmRlbmNpZXMKICAgIHVucGFja19maWxlKGZyb21fcGF0aCwgbG9jYXRpb24sIGNvbnRlbnRfdHlwZSwgbGluaykKCiAgICAjIGEgZG93bmxvYWQgZGlyIGlzIHNwZWNpZmllZDsgbGV0J3MgY29weSB0aGUgYXJjaGl2ZSB0aGVyZQogICAgaWYgZG93bmxvYWRfZGlyIGFuZCBub3QgYWxyZWFkeV9kb3dubG9hZGVkX3BhdGg6CiAgICAgICAgX2NvcHlfZmlsZShmcm9tX3BhdGgsIGRvd25sb2FkX2RpciwgbGluaykKCiAgICBpZiBub3QgYWxyZWFkeV9kb3dubG9hZGVkX3BhdGg6CiAgICAgICAgb3MudW5saW5rKGZyb21fcGF0aCkKICAgIHJtdHJlZSh0ZW1wX2RpcikKCgpkZWYgdW5wYWNrX2ZpbGVfdXJsKGxpbmssIGxvY2F0aW9uLCBkb3dubG9hZF9kaXI9Tm9uZSwgaGFzaGVzPU5vbmUpOgogICAgIiIiVW5wYWNrIGxpbmsgaW50byBsb2NhdGlvbi4KCiAgICBJZiBkb3dubG9hZF9kaXIgaXMgcHJvdmlkZWQgYW5kIGxpbmsgcG9pbnRzIHRvIGEgZmlsZSwgbWFrZSBhIGNvcHkKICAgIG9mIHRoZSBsaW5rIGZpbGUgaW5zaWRlIGRvd25sb2FkX2Rpci4KICAgICIiIgogICAgbGlua19wYXRoID0gdXJsX3RvX3BhdGgobGluay51cmxfd2l0aG91dF9mcmFnbWVudCkKCiAgICAjIElmIGl0J3MgYSB1cmwgdG8gYSBsb2NhbCBkaXJlY3RvcnkKICAgIGlmIGlzX2Rpcl91cmwobGluayk6CiAgICAgICAgaWYgb3MucGF0aC5pc2Rpcihsb2NhdGlvbik6CiAgICAgICAgICAgIHJtdHJlZShsb2NhdGlvbikKICAgICAgICBzaHV0aWwuY29weXRyZWUobGlua19wYXRoLCBsb2NhdGlvbiwgc3ltbGlua3M9VHJ1ZSkKICAgICAgICBpZiBkb3dubG9hZF9kaXI6CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdMaW5rIGlzIGEgZGlyZWN0b3J5LCBpZ25vcmluZyBkb3dubG9hZF9kaXInKQogICAgICAgIHJldHVybgoKICAgICMgSWYgLS1yZXF1aXJlLWhhc2hlcyBpcyBvZmYsIGBoYXNoZXNgIGlzIGVpdGhlciBlbXB0eSwgdGhlCiAgICAjIGxpbmsncyBlbWJlZGRlZCBoYXNoLCBvciBNaXNzaW5nSGFzaGVzOyBpdCBpcyByZXF1aXJlZCB0bwogICAgIyBtYXRjaC4gSWYgLS1yZXF1aXJlLWhhc2hlcyBpcyBvbiwgd2UgYXJlIHNhdGlzZmllZCBieSBhbnkKICAgICMgaGFzaCBpbiBgaGFzaGVzYCBtYXRjaGluZzogYSBVUkwtYmFzZWQgb3IgYW4gb3B0aW9uLWJhc2VkCiAgICAjIG9uZTsgbm8gaW50ZXJuZXQtc291cmNlZCBoYXNoIHdpbGwgYmUgaW4gYGhhc2hlc2AuCiAgICBpZiBoYXNoZXM6CiAgICAgICAgaGFzaGVzLmNoZWNrX2FnYWluc3RfcGF0aChsaW5rX3BhdGgpCgogICAgIyBJZiBhIGRvd25sb2FkIGRpciBpcyBzcGVjaWZpZWQsIGlzIHRoZSBmaWxlIGFscmVhZHkgdGhlcmUgYW5kIHZhbGlkPwogICAgYWxyZWFkeV9kb3dubG9hZGVkX3BhdGggPSBOb25lCiAgICBpZiBkb3dubG9hZF9kaXI6CiAgICAgICAgYWxyZWFkeV9kb3dubG9hZGVkX3BhdGggPSBfY2hlY2tfZG93bmxvYWRfZGlyKGxpbmssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkX2RpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaGVzKQoKICAgIGlmIGFscmVhZHlfZG93bmxvYWRlZF9wYXRoOgogICAgICAgIGZyb21fcGF0aCA9IGFscmVhZHlfZG93bmxvYWRlZF9wYXRoCiAgICBlbHNlOgogICAgICAgIGZyb21fcGF0aCA9IGxpbmtfcGF0aAoKICAgIGNvbnRlbnRfdHlwZSA9IG1pbWV0eXBlcy5ndWVzc190eXBlKGZyb21fcGF0aClbMF0KCiAgICAjIHVucGFjayB0aGUgYXJjaGl2ZSB0byB0aGUgYnVpbGQgZGlyIGxvY2F0aW9uLiBldmVuIHdoZW4gb25seSBkb3dubG9hZGluZwogICAgIyBhcmNoaXZlcywgdGhleSBoYXZlIHRvIGJlIHVucGFja2VkIHRvIHBhcnNlIGRlcGVuZGVuY2llcwogICAgdW5wYWNrX2ZpbGUoZnJvbV9wYXRoLCBsb2NhdGlvbiwgY29udGVudF90eXBlLCBsaW5rKQoKICAgICMgYSBkb3dubG9hZCBkaXIgaXMgc3BlY2lmaWVkIGFuZCBub3QgYWxyZWFkeSBkb3dubG9hZGVkCiAgICBpZiBkb3dubG9hZF9kaXIgYW5kIG5vdCBhbHJlYWR5X2Rvd25sb2FkZWRfcGF0aDoKICAgICAgICBfY29weV9maWxlKGZyb21fcGF0aCwgZG93bmxvYWRfZGlyLCBsaW5rKQoKCmRlZiBfY29weV9kaXN0X2Zyb21fZGlyKGxpbmtfcGF0aCwgbG9jYXRpb24pOgogICAgIiIiQ29weSBkaXN0cmlidXRpb24gZmlsZXMgaW4gYGxpbmtfcGF0aGAgdG8gYGxvY2F0aW9uYC4KCiAgICBJbnZva2VkIHdoZW4gdXNlciByZXF1ZXN0cyB0byBpbnN0YWxsIGEgbG9jYWwgZGlyZWN0b3J5LiBFLmcuOgoKICAgICAgICBwaXAgaW5zdGFsbCAuCiAgICAgICAgcGlwIGluc3RhbGwgfi9kZXYvZ2l0LXJlcG9zL3B5dGhvbi1wcm9tcHQtdG9vbGtpdAoKICAgICIiIgoKICAgICMgTm90ZTogVGhpcyBpcyBjdXJyZW50bHkgVkVSWSBTTE9XIGlmIHlvdSBoYXZlIGEgbG90IG9mIGRhdGEgaW4gdGhlCiAgICAjIGRpcmVjdG9yeSwgYmVjYXVzZSBpdCBjb3BpZXMgZXZlcnl0aGluZyB3aXRoIGBzaHV0aWwuY29weXRyZWVgLgogICAgIyBXaGF0IGl0IHNob3VsZCByZWFsbHkgZG8gaXMgYnVpbGQgYW4gc2Rpc3QgYW5kIGluc3RhbGwgdGhhdC4KICAgICMgU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3BpcC9pc3N1ZXMvMjE5NQoKICAgIGlmIG9zLnBhdGguaXNkaXIobG9jYXRpb24pOgogICAgICAgIHJtdHJlZShsb2NhdGlvbikKCiAgICAjIGJ1aWxkIGFuIHNkaXN0CiAgICBzZXR1cF9weSA9ICdzZXR1cC5weScKICAgIHNkaXN0X2FyZ3MgPSBbc3lzLmV4ZWN1dGFibGVdCiAgICBzZGlzdF9hcmdzLmFwcGVuZCgnLWMnKQogICAgc2Rpc3RfYXJncy5hcHBlbmQoU0VUVVBUT09MU19TSElNICUgc2V0dXBfcHkpCiAgICBzZGlzdF9hcmdzLmFwcGVuZCgnc2Rpc3QnKQogICAgc2Rpc3RfYXJncyArPSBbJy0tZGlzdC1kaXInLCBsb2NhdGlvbl0KICAgIGxvZ2dlci5pbmZvKCdSdW5uaW5nIHNldHVwLnB5IHNkaXN0IGZvciAlcycsIGxpbmtfcGF0aCkKCiAgICB3aXRoIGluZGVudF9sb2coKToKICAgICAgICBjYWxsX3N1YnByb2Nlc3Moc2Rpc3RfYXJncywgY3dkPWxpbmtfcGF0aCwgc2hvd19zdGRvdXQ9RmFsc2UpCgogICAgIyB1bnBhY2sgc2Rpc3QgaW50byBgbG9jYXRpb25gCiAgICBzZGlzdCA9IG9zLnBhdGguam9pbihsb2NhdGlvbiwgb3MubGlzdGRpcihsb2NhdGlvbilbMF0pCiAgICBsb2dnZXIuaW5mbygnVW5wYWNraW5nIHNkaXN0ICVzIGludG8gJXMnLCBzZGlzdCwgbG9jYXRpb24pCiAgICB1bnBhY2tfZmlsZShzZGlzdCwgbG9jYXRpb24sIGNvbnRlbnRfdHlwZT1Ob25lLCBsaW5rPU5vbmUpCgoKY2xhc3MgUGlwWG1scnBjVHJhbnNwb3J0KHhtbHJwY19jbGllbnQuVHJhbnNwb3J0KToKICAgICIiIlByb3ZpZGUgYSBgeG1scnBjbGliLlRyYW5zcG9ydGAgaW1wbGVtZW50YXRpb24gdmlhIGEgYFBpcFNlc3Npb25gCiAgICBvYmplY3QuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgaW5kZXhfdXJsLCBzZXNzaW9uLCB1c2VfZGF0ZXRpbWU9RmFsc2UpOgogICAgICAgIHhtbHJwY19jbGllbnQuVHJhbnNwb3J0Ll9faW5pdF9fKHNlbGYsIHVzZV9kYXRldGltZSkKICAgICAgICBpbmRleF9wYXJ0cyA9IHVybGxpYl9wYXJzZS51cmxwYXJzZShpbmRleF91cmwpCiAgICAgICAgc2VsZi5fc2NoZW1lID0gaW5kZXhfcGFydHMuc2NoZW1lCiAgICAgICAgc2VsZi5fc2Vzc2lvbiA9IHNlc3Npb24KCiAgICBkZWYgcmVxdWVzdChzZWxmLCBob3N0LCBoYW5kbGVyLCByZXF1ZXN0X2JvZHksIHZlcmJvc2U9RmFsc2UpOgogICAgICAgIHBhcnRzID0gKHNlbGYuX3NjaGVtZSwgaG9zdCwgaGFuZGxlciwgTm9uZSwgTm9uZSwgTm9uZSkKICAgICAgICB1cmwgPSB1cmxsaWJfcGFyc2UudXJsdW5wYXJzZShwYXJ0cykKICAgICAgICB0cnk6CiAgICAgICAgICAgIGhlYWRlcnMgPSB7J0NvbnRlbnQtVHlwZSc6ICd0ZXh0L3htbCd9CiAgICAgICAgICAgIHJlc3BvbnNlID0gc2VsZi5fc2Vzc2lvbi5wb3N0KHVybCwgZGF0YT1yZXF1ZXN0X2JvZHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM9aGVhZGVycywgc3RyZWFtPVRydWUpCiAgICAgICAgICAgIHJlc3BvbnNlLnJhaXNlX2Zvcl9zdGF0dXMoKQogICAgICAgICAgICBzZWxmLnZlcmJvc2UgPSB2ZXJib3NlCiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlX3Jlc3BvbnNlKHJlc3BvbnNlLnJhdykKICAgICAgICBleGNlcHQgcmVxdWVzdHMuSFRUUEVycm9yIGFzIGV4YzoKICAgICAgICAgICAgbG9nZ2VyLmNyaXRpY2FsKAogICAgICAgICAgICAgICAgIkhUVFAgZXJyb3IgJXMgd2hpbGUgZ2V0dGluZyAlcyIsCiAgICAgICAgICAgICAgICBleGMucmVzcG9uc2Uuc3RhdHVzX2NvZGUsIHVybCwKICAgICAgICAgICAgKQogICAgICAgICAgICByYWlzZQoKCmRlZiB1bnBhY2tfdXJsKGxpbmssIGxvY2F0aW9uLCBkb3dubG9hZF9kaXI9Tm9uZSwKICAgICAgICAgICAgICAgb25seV9kb3dubG9hZD1GYWxzZSwgc2Vzc2lvbj1Ob25lLCBoYXNoZXM9Tm9uZSk6CiAgICAiIiJVbnBhY2sgbGluay4KICAgICAgIElmIGxpbmsgaXMgYSBWQ1MgbGluazoKICAgICAgICAgaWYgb25seV9kb3dubG9hZCwgZXhwb3J0IGludG8gZG93bmxvYWRfZGlyIGFuZCBpZ25vcmUgbG9jYXRpb24KICAgICAgICAgIGVsc2UgdW5wYWNrIGludG8gbG9jYXRpb24KICAgICAgIGZvciBvdGhlciB0eXBlcyBvZiBsaW5rOgogICAgICAgICAtIHVucGFjayBpbnRvIGxvY2F0aW9uCiAgICAgICAgIC0gaWYgZG93bmxvYWRfZGlyLCBjb3B5IHRoZSBmaWxlIGludG8gZG93bmxvYWRfZGlyCiAgICAgICAgIC0gaWYgb25seV9kb3dubG9hZCwgbWFyayBsb2NhdGlvbiBmb3IgZGVsZXRpb24KCiAgICA6cGFyYW0gaGFzaGVzOiBBIEhhc2hlcyBvYmplY3QsIG9uZSBvZiB3aG9zZSBlbWJlZGRlZCBoYXNoZXMgbXVzdCBtYXRjaCwKICAgICAgICBvciBIYXNoTWlzbWF0Y2ggd2lsbCBiZSByYWlzZWQuIElmIHRoZSBIYXNoZXMgaXMgZW1wdHksIG5vIG1hdGNoZXMgYXJlCiAgICAgICAgcmVxdWlyZWQsIGFuZCB1bmhhc2hhYmxlIHR5cGVzIG9mIHJlcXVpcmVtZW50cyAobGlrZSBWQ1Mgb25lcywgd2hpY2gKICAgICAgICB3b3VsZCBvcmRpbmFyaWx5IHJhaXNlIEhhc2hVbnN1cHBvcnRlZCkgYXJlIGFsbG93ZWQuCiAgICAiIiIKICAgICMgbm9uLWVkaXRhYmxlIHZjcyB1cmxzCiAgICBpZiBpc192Y3NfdXJsKGxpbmspOgogICAgICAgIHVucGFja192Y3NfbGluayhsaW5rLCBsb2NhdGlvbikKCiAgICAjIGZpbGUgdXJscwogICAgZWxpZiBpc19maWxlX3VybChsaW5rKToKICAgICAgICB1bnBhY2tfZmlsZV91cmwobGluaywgbG9jYXRpb24sIGRvd25sb2FkX2RpciwgaGFzaGVzPWhhc2hlcykKCiAgICAjIGh0dHAgdXJscwogICAgZWxzZToKICAgICAgICBpZiBzZXNzaW9uIGlzIE5vbmU6CiAgICAgICAgICAgIHNlc3Npb24gPSBQaXBTZXNzaW9uKCkKCiAgICAgICAgdW5wYWNrX2h0dHBfdXJsKAogICAgICAgICAgICBsaW5rLAogICAgICAgICAgICBsb2NhdGlvbiwKICAgICAgICAgICAgZG93bmxvYWRfZGlyLAogICAgICAgICAgICBzZXNzaW9uLAogICAgICAgICAgICBoYXNoZXM9aGFzaGVzCiAgICAgICAgKQogICAgaWYgb25seV9kb3dubG9hZDoKICAgICAgICB3cml0ZV9kZWxldGVfbWFya2VyX2ZpbGUobG9jYXRpb24pCgoKZGVmIF9kb3dubG9hZF9odHRwX3VybChsaW5rLCBzZXNzaW9uLCB0ZW1wX2RpciwgaGFzaGVzKToKICAgICIiIkRvd25sb2FkIGxpbmsgdXJsIGludG8gdGVtcF9kaXIgdXNpbmcgcHJvdmlkZWQgc2Vzc2lvbiIiIgogICAgdGFyZ2V0X3VybCA9IGxpbmsudXJsLnNwbGl0KCcjJywgMSlbMF0KICAgIHRyeToKICAgICAgICByZXNwID0gc2Vzc2lvbi5nZXQoCiAgICAgICAgICAgIHRhcmdldF91cmwsCiAgICAgICAgICAgICMgV2UgdXNlIEFjY2VwdC1FbmNvZGluZzogaWRlbnRpdHkgaGVyZSBiZWNhdXNlIHJlcXVlc3RzCiAgICAgICAgICAgICMgZGVmYXVsdHMgdG8gYWNjZXB0aW5nIGNvbXByZXNzZWQgcmVzcG9uc2VzLiBUaGlzIGJyZWFrcyBpbgogICAgICAgICAgICAjIGEgdmFyaWV0eSBvZiB3YXlzIGRlcGVuZGluZyBvbiBob3cgdGhlIHNlcnZlciBpcyBjb25maWd1cmVkLgogICAgICAgICAgICAjIC0gU29tZSBzZXJ2ZXJzIHdpbGwgbm90aWNlIHRoYXQgdGhlIGZpbGUgaXNuJ3QgYSBjb21wcmVzc2libGUKICAgICAgICAgICAgIyAgIGZpbGUgYW5kIHdpbGwgbGVhdmUgdGhlIGZpbGUgYWxvbmUgYW5kIHdpdGggYW4gZW1wdHkKICAgICAgICAgICAgIyAgIENvbnRlbnQtRW5jb2RpbmcKICAgICAgICAgICAgIyAtIFNvbWUgc2VydmVycyB3aWxsIG5vdGljZSB0aGF0IHRoZSBmaWxlIGlzIGFscmVhZHkKICAgICAgICAgICAgIyAgIGNvbXByZXNzZWQgYW5kIHdpbGwgbGVhdmUgdGhlIGZpbGUgYWxvbmUgYW5kIHdpbGwgYWRkIGEKICAgICAgICAgICAgIyAgIENvbnRlbnQtRW5jb2Rpbmc6IGd6aXAgaGVhZGVyCiAgICAgICAgICAgICMgLSBTb21lIHNlcnZlcnMgd29uJ3Qgbm90aWNlIGFueXRoaW5nIGF0IGFsbCBhbmQgd2lsbCB0YWtlCiAgICAgICAgICAgICMgICBhIGZpbGUgdGhhdCdzIGFscmVhZHkgYmVlbiBjb21wcmVzc2VkIGFuZCBjb21wcmVzcyBpdCBhZ2FpbgogICAgICAgICAgICAjICAgYW5kIHNldCB0aGUgQ29udGVudC1FbmNvZGluZzogZ3ppcCBoZWFkZXIKICAgICAgICAgICAgIyBCeSBzZXR0aW5nIHRoaXMgdG8gcmVxdWVzdCBvbmx5IHRoZSBpZGVudGl0eSBlbmNvZGluZyBXZSdyZQogICAgICAgICAgICAjIGhvcGluZyB0byBlbGltaW5hdGUgdGhlIHRoaXJkIGNhc2UuIEhvcGVmdWxseSB0aGVyZSBkb2VzIG5vdAogICAgICAgICAgICAjIGV4aXN0IGEgc2VydmVyIHdoaWNoIHdoZW4gZ2l2ZW4gYSBmaWxlIHdpbGwgbm90aWNlIGl0IGlzCiAgICAgICAgICAgICMgYWxyZWFkeSBjb21wcmVzc2VkIGFuZCB0aGF0IHlvdSdyZSBub3QgYXNraW5nIGZvciBhCiAgICAgICAgICAgICMgY29tcHJlc3NlZCBmaWxlIGFuZCB3aWxsIHRoZW4gZGVjb21wcmVzcyBpdCBiZWZvcmUgc2VuZGluZwogICAgICAgICAgICAjIGJlY2F1c2UgaWYgdGhhdCdzIHRoZSBjYXNlIEkgZG9uJ3QgdGhpbmsgaXQnbGwgZXZlciBiZQogICAgICAgICAgICAjIHBvc3NpYmxlIHRvIG1ha2UgdGhpcyB3b3JrLgogICAgICAgICAgICBoZWFkZXJzPXsiQWNjZXB0LUVuY29kaW5nIjogImlkZW50aXR5In0sCiAgICAgICAgICAgIHN0cmVhbT1UcnVlLAogICAgICAgICkKICAgICAgICByZXNwLnJhaXNlX2Zvcl9zdGF0dXMoKQogICAgZXhjZXB0IHJlcXVlc3RzLkhUVFBFcnJvciBhcyBleGM6CiAgICAgICAgbG9nZ2VyLmNyaXRpY2FsKAogICAgICAgICAgICAiSFRUUCBlcnJvciAlcyB3aGlsZSBnZXR0aW5nICVzIiwgZXhjLnJlc3BvbnNlLnN0YXR1c19jb2RlLCBsaW5rLAogICAgICAgICkKICAgICAgICByYWlzZQoKICAgIGNvbnRlbnRfdHlwZSA9IHJlc3AuaGVhZGVycy5nZXQoJ2NvbnRlbnQtdHlwZScsICcnKQogICAgZmlsZW5hbWUgPSBsaW5rLmZpbGVuYW1lICAjIGZhbGxiYWNrCiAgICAjIEhhdmUgYSBsb29rIGF0IHRoZSBDb250ZW50LURpc3Bvc2l0aW9uIGhlYWRlciBmb3IgYSBiZXR0ZXIgZ3Vlc3MKICAgIGNvbnRlbnRfZGlzcG9zaXRpb24gPSByZXNwLmhlYWRlcnMuZ2V0KCdjb250ZW50LWRpc3Bvc2l0aW9uJykKICAgIGlmIGNvbnRlbnRfZGlzcG9zaXRpb246CiAgICAgICAgdHlwZSwgcGFyYW1zID0gY2dpLnBhcnNlX2hlYWRlcihjb250ZW50X2Rpc3Bvc2l0aW9uKQogICAgICAgICMgV2UgdXNlIGBgb3JgYCBoZXJlIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byB1c2UgYW4gImVtcHR5IiB2YWx1ZQogICAgICAgICMgZnJvbSB0aGUgZmlsZW5hbWUgcGFyYW0uCiAgICAgICAgZmlsZW5hbWUgPSBwYXJhbXMuZ2V0KCdmaWxlbmFtZScpIG9yIGZpbGVuYW1lCiAgICBleHQgPSBzcGxpdGV4dChmaWxlbmFtZSlbMV0KICAgIGlmIG5vdCBleHQ6CiAgICAgICAgZXh0ID0gbWltZXR5cGVzLmd1ZXNzX2V4dGVuc2lvbihjb250ZW50X3R5cGUpCiAgICAgICAgaWYgZXh0OgogICAgICAgICAgICBmaWxlbmFtZSArPSBleHQKICAgIGlmIG5vdCBleHQgYW5kIGxpbmsudXJsICE9IHJlc3AudXJsOgogICAgICAgIGV4dCA9IG9zLnBhdGguc3BsaXRleHQocmVzcC51cmwpWzFdCiAgICAgICAgaWYgZXh0OgogICAgICAgICAgICBmaWxlbmFtZSArPSBleHQKICAgIGZpbGVfcGF0aCA9IG9zLnBhdGguam9pbih0ZW1wX2RpciwgZmlsZW5hbWUpCiAgICB3aXRoIG9wZW4oZmlsZV9wYXRoLCAnd2InKSBhcyBjb250ZW50X2ZpbGU6CiAgICAgICAgX2Rvd25sb2FkX3VybChyZXNwLCBsaW5rLCBjb250ZW50X2ZpbGUsIGhhc2hlcykKICAgIHJldHVybiBmaWxlX3BhdGgsIGNvbnRlbnRfdHlwZQoKCmRlZiBfY2hlY2tfZG93bmxvYWRfZGlyKGxpbmssIGRvd25sb2FkX2RpciwgaGFzaGVzKToKICAgICIiIiBDaGVjayBkb3dubG9hZF9kaXIgZm9yIHByZXZpb3VzbHkgZG93bmxvYWRlZCBmaWxlIHdpdGggY29ycmVjdCBoYXNoCiAgICAgICAgSWYgYSBjb3JyZWN0IGZpbGUgaXMgZm91bmQgcmV0dXJuIGl0cyBwYXRoIGVsc2UgTm9uZQogICAgIiIiCiAgICBkb3dubG9hZF9wYXRoID0gb3MucGF0aC5qb2luKGRvd25sb2FkX2RpciwgbGluay5maWxlbmFtZSkKICAgIGlmIG9zLnBhdGguZXhpc3RzKGRvd25sb2FkX3BhdGgpOgogICAgICAgICMgSWYgYWxyZWFkeSBkb3dubG9hZGVkLCBkb2VzIGl0cyBoYXNoIG1hdGNoPwogICAgICAgIGxvZ2dlci5pbmZvKCdGaWxlIHdhcyBhbHJlYWR5IGRvd25sb2FkZWQgJXMnLCBkb3dubG9hZF9wYXRoKQogICAgICAgIGlmIGhhc2hlczoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaGFzaGVzLmNoZWNrX2FnYWluc3RfcGF0aChkb3dubG9hZF9wYXRoKQogICAgICAgICAgICBleGNlcHQgSGFzaE1pc21hdGNoOgogICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgJ1ByZXZpb3VzbHktZG93bmxvYWRlZCBmaWxlICVzIGhhcyBiYWQgaGFzaC4gJwogICAgICAgICAgICAgICAgICAgICdSZS1kb3dubG9hZGluZy4nLAogICAgICAgICAgICAgICAgICAgIGRvd25sb2FkX3BhdGgKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIG9zLnVubGluayhkb3dubG9hZF9wYXRoKQogICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICByZXR1cm4gZG93bmxvYWRfcGF0aAogICAgcmV0dXJuIE5vbmUKUEsDBBQAAAAAAAAAIQC+epaYuR8AALkfAAAhAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9leGNlcHRpb25zLnB5IiIiRXhjZXB0aW9ucyB1c2VkIHRocm91Z2hvdXQgcGFja2FnZSIiIgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKZnJvbSBpdGVydG9vbHMgaW1wb3J0IGNoYWluLCBncm91cGJ5LCByZXBlYXQKCmZyb20gcGlwLl92ZW5kb3Iuc2l4IGltcG9ydCBpdGVyaXRlbXMKCgpjbGFzcyBQaXBFcnJvcihFeGNlcHRpb24pOgogICAgIiIiQmFzZSBwaXAgZXhjZXB0aW9uIiIiCgoKY2xhc3MgSW5zdGFsbGF0aW9uRXJyb3IoUGlwRXJyb3IpOgogICAgIiIiR2VuZXJhbCBleGNlcHRpb24gZHVyaW5nIGluc3RhbGxhdGlvbiIiIgoKCmNsYXNzIFVuaW5zdGFsbGF0aW9uRXJyb3IoUGlwRXJyb3IpOgogICAgIiIiR2VuZXJhbCBleGNlcHRpb24gZHVyaW5nIHVuaW5zdGFsbGF0aW9uIiIiCgoKY2xhc3MgRGlzdHJpYnV0aW9uTm90Rm91bmQoSW5zdGFsbGF0aW9uRXJyb3IpOgogICAgIiIiUmFpc2VkIHdoZW4gYSBkaXN0cmlidXRpb24gY2Fubm90IGJlIGZvdW5kIHRvIHNhdGlzZnkgYSByZXF1aXJlbWVudCIiIgoKCmNsYXNzIFJlcXVpcmVtZW50c0ZpbGVQYXJzZUVycm9yKEluc3RhbGxhdGlvbkVycm9yKToKICAgICIiIlJhaXNlZCB3aGVuIGEgZ2VuZXJhbCBlcnJvciBvY2N1cnMgcGFyc2luZyBhIHJlcXVpcmVtZW50cyBmaWxlIGxpbmUuIiIiCgoKY2xhc3MgQmVzdFZlcnNpb25BbHJlYWR5SW5zdGFsbGVkKFBpcEVycm9yKToKICAgICIiIlJhaXNlZCB3aGVuIHRoZSBtb3N0IHVwLXRvLWRhdGUgdmVyc2lvbiBvZiBhIHBhY2thZ2UgaXMgYWxyZWFkeQogICAgaW5zdGFsbGVkLiIiIgoKCmNsYXNzIEJhZENvbW1hbmQoUGlwRXJyb3IpOgogICAgIiIiUmFpc2VkIHdoZW4gdmlydHVhbGVudiBvciBhIGNvbW1hbmQgaXMgbm90IGZvdW5kIiIiCgoKY2xhc3MgQ29tbWFuZEVycm9yKFBpcEVycm9yKToKICAgICIiIlJhaXNlZCB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGluIGNvbW1hbmQtbGluZSBhcmd1bWVudHMiIiIKCgpjbGFzcyBQcmV2aW91c0J1aWxkRGlyRXJyb3IoUGlwRXJyb3IpOgogICAgIiIiUmFpc2VkIHdoZW4gdGhlcmUncyBhIHByZXZpb3VzIGNvbmZsaWN0aW5nIGJ1aWxkIGRpcmVjdG9yeSIiIgoKCmNsYXNzIEludmFsaWRXaGVlbEZpbGVuYW1lKEluc3RhbGxhdGlvbkVycm9yKToKICAgICIiIkludmFsaWQgd2hlZWwgZmlsZW5hbWUuIiIiCgoKY2xhc3MgVW5zdXBwb3J0ZWRXaGVlbChJbnN0YWxsYXRpb25FcnJvcik6CiAgICAiIiJVbnN1cHBvcnRlZCB3aGVlbC4iIiIKCgpjbGFzcyBIYXNoRXJyb3JzKEluc3RhbGxhdGlvbkVycm9yKToKICAgICIiIk11bHRpcGxlIEhhc2hFcnJvciBpbnN0YW5jZXMgcm9sbGVkIGludG8gb25lIGZvciByZXBvcnRpbmciIiIKCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc2VsZi5lcnJvcnMgPSBbXQoKICAgIGRlZiBhcHBlbmQoc2VsZiwgZXJyb3IpOgogICAgICAgIHNlbGYuZXJyb3JzLmFwcGVuZChlcnJvcikKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICBsaW5lcyA9IFtdCiAgICAgICAgc2VsZi5lcnJvcnMuc29ydChrZXk9bGFtYmRhIGU6IGUub3JkZXIpCiAgICAgICAgZm9yIGNscywgZXJyb3JzX29mX2NscyBpbiBncm91cGJ5KHNlbGYuZXJyb3JzLCBsYW1iZGEgZTogZS5fX2NsYXNzX18pOgogICAgICAgICAgICBsaW5lcy5hcHBlbmQoY2xzLmhlYWQpCiAgICAgICAgICAgIGxpbmVzLmV4dGVuZChlLmJvZHkoKSBmb3IgZSBpbiBlcnJvcnNfb2ZfY2xzKQogICAgICAgIGlmIGxpbmVzOgogICAgICAgICAgICByZXR1cm4gJ1xuJy5qb2luKGxpbmVzKQoKICAgIGRlZiBfX25vbnplcm9fXyhzZWxmKToKICAgICAgICByZXR1cm4gYm9vbChzZWxmLmVycm9ycykKCiAgICBkZWYgX19ib29sX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX19ub256ZXJvX18oKQoKCmNsYXNzIEhhc2hFcnJvcihJbnN0YWxsYXRpb25FcnJvcik6CiAgICAiIiIKICAgIEEgZmFpbHVyZSB0byB2ZXJpZnkgYSBwYWNrYWdlIGFnYWluc3Qga25vd24tZ29vZCBoYXNoZXMKCiAgICA6Y3ZhciBvcmRlcjogQW4gaW50IHNvcnRpbmcgaGFzaCBleGNlcHRpb24gY2xhc3NlcyBieSBkaWZmaWN1bHR5IG9mCiAgICAgICAgcmVjb3ZlcnkgKGxvd2VyIGJlaW5nIGhhcmRlciksIHNvIHRoZSB1c2VyIGRvZXNuJ3QgYm90aGVyIGZyZXR0aW5nCiAgICAgICAgYWJvdXQgdW5waW5uZWQgcGFja2FnZXMgd2hlbiBoZSBoYXMgZGVlcGVyIGlzc3VlcywgbGlrZSBWQ1MKICAgICAgICBkZXBlbmRlbmNpZXMsIHRvIGRlYWwgd2l0aC4gQWxzbyBrZWVwcyBlcnJvciByZXBvcnRzIGluIGEKICAgICAgICBkZXRlcm1pbmlzdGljIG9yZGVyLgogICAgOmN2YXIgaGVhZDogQSBzZWN0aW9uIGhlYWRpbmcgZm9yIGRpc3BsYXkgYWJvdmUgcG90ZW50aWFsbHkgbWFueQogICAgICAgIGV4Y2VwdGlvbnMgb2YgdGhpcyBraW5kCiAgICA6aXZhciByZXE6IFRoZSBJbnN0YWxsUmVxdWlyZW1lbnQgdGhhdCB0cmlnZ2VyZWQgdGhpcyBlcnJvci4gVGhpcyBpcwogICAgICAgIHBhc3RlZCBvbiBhZnRlciB0aGUgZXhjZXB0aW9uIGlzIGluc3RhbnRpYXRlZCwgYmVjYXVzZSBpdCdzIG5vdAogICAgICAgIHR5cGljYWxseSBhdmFpbGFibGUgZWFybGllci4KCiAgICAiIiIKICAgIHJlcSA9IE5vbmUKICAgIGhlYWQgPSAnJwoKICAgIGRlZiBib2R5KHNlbGYpOgogICAgICAgICIiIlJldHVybiBhIHN1bW1hcnkgb2YgbWUgZm9yIGRpc3BsYXkgdW5kZXIgdGhlIGhlYWRpbmcuCgogICAgICAgIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgcHJpbnRzIGEgZGVzY3JpcHRpb24gb2YgdGhlCiAgICAgICAgdHJpZ2dlcmluZyByZXF1aXJlbWVudC4KCiAgICAgICAgOnBhcmFtIHJlcTogVGhlIEluc3RhbGxSZXF1aXJlbWVudCB0aGF0IHByb3Zva2VkIHRoaXMgZXJyb3IsIHdpdGgKICAgICAgICAgICAgcG9wdWxhdGVfbGluaygpIGhhdmluZyBhbHJlYWR5IGJlZW4gY2FsbGVkCgogICAgICAgICIiIgogICAgICAgIHJldHVybiAnICAgICVzJyAlIHNlbGYuX3JlcXVpcmVtZW50X25hbWUoKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiAnJXNcbiVzJyAlIChzZWxmLmhlYWQsIHNlbGYuYm9keSgpKQoKICAgIGRlZiBfcmVxdWlyZW1lbnRfbmFtZShzZWxmKToKICAgICAgICAiIiJSZXR1cm4gYSBkZXNjcmlwdGlvbiBvZiB0aGUgcmVxdWlyZW1lbnQgdGhhdCB0cmlnZ2VyZWQgbWUuCgogICAgICAgIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIGxvbmcgZGVzY3JpcHRpb24gb2YgdGhlIHJlcSwgd2l0aAogICAgICAgIGxpbmUgbnVtYmVycwoKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc3RyKHNlbGYucmVxKSBpZiBzZWxmLnJlcSBlbHNlICd1bmtub3duIHBhY2thZ2UnCgoKY2xhc3MgVmNzSGFzaFVuc3VwcG9ydGVkKEhhc2hFcnJvcik6CiAgICAiIiJBIGhhc2ggd2FzIHByb3ZpZGVkIGZvciBhIHZlcnNpb24tY29udHJvbC1zeXN0ZW0tYmFzZWQgcmVxdWlyZW1lbnQsIGJ1dAogICAgd2UgZG9uJ3QgaGF2ZSBhIG1ldGhvZCBmb3IgaGFzaGluZyB0aG9zZS4iIiIKCiAgICBvcmRlciA9IDAKICAgIGhlYWQgPSAoIkNhbid0IHZlcmlmeSBoYXNoZXMgZm9yIHRoZXNlIHJlcXVpcmVtZW50cyBiZWNhdXNlIHdlIGRvbid0ICIKICAgICAgICAgICAgImhhdmUgYSB3YXkgdG8gaGFzaCB2ZXJzaW9uIGNvbnRyb2wgcmVwb3NpdG9yaWVzOiIpCgoKY2xhc3MgRGlyZWN0b3J5VXJsSGFzaFVuc3VwcG9ydGVkKEhhc2hFcnJvcik6CiAgICAiIiJBIGhhc2ggd2FzIHByb3ZpZGVkIGZvciBhIHZlcnNpb24tY29udHJvbC1zeXN0ZW0tYmFzZWQgcmVxdWlyZW1lbnQsIGJ1dAogICAgd2UgZG9uJ3QgaGF2ZSBhIG1ldGhvZCBmb3IgaGFzaGluZyB0aG9zZS4iIiIKCiAgICBvcmRlciA9IDEKICAgIGhlYWQgPSAoIkNhbid0IHZlcmlmeSBoYXNoZXMgZm9yIHRoZXNlIGZpbGU6Ly8gcmVxdWlyZW1lbnRzIGJlY2F1c2UgdGhleSAiCiAgICAgICAgICAgICJwb2ludCB0byBkaXJlY3RvcmllczoiKQoKCmNsYXNzIEhhc2hNaXNzaW5nKEhhc2hFcnJvcik6CiAgICAiIiJBIGhhc2ggd2FzIG5lZWRlZCBmb3IgYSByZXF1aXJlbWVudCBidXQgaXMgYWJzZW50LiIiIgoKICAgIG9yZGVyID0gMgogICAgaGVhZCA9ICgnSGFzaGVzIGFyZSByZXF1aXJlZCBpbiAtLXJlcXVpcmUtaGFzaGVzIG1vZGUsIGJ1dCB0aGV5IGFyZSAnCiAgICAgICAgICAgICdtaXNzaW5nIGZyb20gc29tZSByZXF1aXJlbWVudHMuIEhlcmUgaXMgYSBsaXN0IG9mIHRob3NlICcKICAgICAgICAgICAgJ3JlcXVpcmVtZW50cyBhbG9uZyB3aXRoIHRoZSBoYXNoZXMgdGhlaXIgZG93bmxvYWRlZCBhcmNoaXZlcyAnCiAgICAgICAgICAgICdhY3R1YWxseSBoYWQuIEFkZCBsaW5lcyBsaWtlIHRoZXNlIHRvIHlvdXIgcmVxdWlyZW1lbnRzIGZpbGVzIHRvICcKICAgICAgICAgICAgJ3ByZXZlbnQgdGFtcGVyaW5nLiAoSWYgeW91IGRpZCBub3QgZW5hYmxlIC0tcmVxdWlyZS1oYXNoZXMgJwogICAgICAgICAgICAnbWFudWFsbHksIG5vdGUgdGhhdCBpdCB0dXJucyBvbiBhdXRvbWF0aWNhbGx5IHdoZW4gYW55IHBhY2thZ2UgJwogICAgICAgICAgICAnaGFzIGEgaGFzaC4pJykKCiAgICBkZWYgX19pbml0X18oc2VsZiwgZ290dGVuX2hhc2gpOgogICAgICAgICIiIgogICAgICAgIDpwYXJhbSBnb3R0ZW5faGFzaDogVGhlIGhhc2ggb2YgdGhlIChwb3NzaWJseSBtYWxpY2lvdXMpIGFyY2hpdmUgd2UKICAgICAgICAgICAganVzdCBkb3dubG9hZGVkCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5nb3R0ZW5faGFzaCA9IGdvdHRlbl9oYXNoCgogICAgZGVmIGJvZHkoc2VsZik6CiAgICAgICAgZnJvbSBwaXAudXRpbHMuaGFzaGVzIGltcG9ydCBGQVZPUklURV9IQVNIICAjIERvZGdlIGNpcmN1bGFyIGltcG9ydC4KCiAgICAgICAgcGFja2FnZSA9IE5vbmUKICAgICAgICBpZiBzZWxmLnJlcToKICAgICAgICAgICAgIyBJbiB0aGUgY2FzZSBvZiBVUkwtYmFzZWQgcmVxdWlyZW1lbnRzLCBkaXNwbGF5IHRoZSBvcmlnaW5hbCBVUkwKICAgICAgICAgICAgIyBzZWVuIGluIHRoZSByZXF1aXJlbWVudHMgZmlsZSByYXRoZXIgdGhhbiB0aGUgcGFja2FnZSBuYW1lLAogICAgICAgICAgICAjIHNvIHRoZSBvdXRwdXQgY2FuIGJlIGRpcmVjdGx5IGNvcGllZCBpbnRvIHRoZSByZXF1aXJlbWVudHMgZmlsZS4KICAgICAgICAgICAgcGFja2FnZSA9IChzZWxmLnJlcS5vcmlnaW5hbF9saW5rIGlmIHNlbGYucmVxLm9yaWdpbmFsX2xpbmsKICAgICAgICAgICAgICAgICAgICAgICAjIEluIGNhc2Ugc29tZW9uZSBmZWVkcyBzb21ldGhpbmcgZG93bnJpZ2h0IHN0dXBpZAogICAgICAgICAgICAgICAgICAgICAgICMgdG8gSW5zdGFsbFJlcXVpcmVtZW50J3MgY29uc3RydWN0b3IuCiAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBnZXRhdHRyKHNlbGYucmVxLCAncmVxJywgTm9uZSkpCiAgICAgICAgcmV0dXJuICcgICAgJXMgLS1oYXNoPSVzOiVzJyAlIChwYWNrYWdlIG9yICd1bmtub3duIHBhY2thZ2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFWT1JJVEVfSEFTSCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ290dGVuX2hhc2gpCgoKY2xhc3MgSGFzaFVucGlubmVkKEhhc2hFcnJvcik6CiAgICAiIiJBIHJlcXVpcmVtZW50IGhhZCBhIGhhc2ggc3BlY2lmaWVkIGJ1dCB3YXMgbm90IHBpbm5lZCB0byBhIHNwZWNpZmljCiAgICB2ZXJzaW9uLiIiIgoKICAgIG9yZGVyID0gMwogICAgaGVhZCA9ICgnSW4gLS1yZXF1aXJlLWhhc2hlcyBtb2RlLCBhbGwgcmVxdWlyZW1lbnRzIG11c3QgaGF2ZSB0aGVpciAnCiAgICAgICAgICAgICd2ZXJzaW9ucyBwaW5uZWQgd2l0aCA9PS4gVGhlc2UgZG8gbm90OicpCgoKY2xhc3MgSGFzaE1pc21hdGNoKEhhc2hFcnJvcik6CiAgICAiIiIKICAgIERpc3RyaWJ1dGlvbiBmaWxlIGhhc2ggdmFsdWVzIGRvbid0IG1hdGNoLgoKICAgIDppdmFyIHBhY2thZ2VfbmFtZTogVGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgdGhhdCB0cmlnZ2VyZWQgdGhlIGhhc2gKICAgICAgICBtaXNtYXRjaC4gRmVlbCBmcmVlIHRvIHdyaXRlIHRvIHRoaXMgYWZ0ZXIgdGhlIGV4Y2VwdGlvbiBpcyByYWlzZSB0bwogICAgICAgIGltcHJvdmUgaXRzIGVycm9yIG1lc3NhZ2UuCgogICAgIiIiCiAgICBvcmRlciA9IDQKICAgIGhlYWQgPSAoJ1RIRVNFIFBBQ0tBR0VTIERPIE5PVCBNQVRDSCBUSEUgSEFTSEVTIEZST00gVEhFIFJFUVVJUkVNRU5UUyAnCiAgICAgICAgICAgICdGSUxFLiBJZiB5b3UgaGF2ZSB1cGRhdGVkIHRoZSBwYWNrYWdlIHZlcnNpb25zLCBwbGVhc2UgdXBkYXRlICcKICAgICAgICAgICAgJ3RoZSBoYXNoZXMuIE90aGVyd2lzZSwgZXhhbWluZSB0aGUgcGFja2FnZSBjb250ZW50cyBjYXJlZnVsbHk7ICcKICAgICAgICAgICAgJ3NvbWVvbmUgbWF5IGhhdmUgdGFtcGVyZWQgd2l0aCB0aGVtLicpCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGFsbG93ZWQsIGdvdHMpOgogICAgICAgICIiIgogICAgICAgIDpwYXJhbSBhbGxvd2VkOiBBIGRpY3Qgb2YgYWxnb3JpdGhtIG5hbWVzIHBvaW50aW5nIHRvIGxpc3RzIG9mIGFsbG93ZWQKICAgICAgICAgICAgaGV4IGRpZ2VzdHMKICAgICAgICA6cGFyYW0gZ290czogQSBkaWN0IG9mIGFsZ29yaXRobSBuYW1lcyBwb2ludGluZyB0byBoYXNoZXMgd2UKICAgICAgICAgICAgYWN0dWFsbHkgZ290IGZyb20gdGhlIGZpbGVzIHVuZGVyIHN1c3BpY2lvbgogICAgICAgICIiIgogICAgICAgIHNlbGYuYWxsb3dlZCA9IGFsbG93ZWQKICAgICAgICBzZWxmLmdvdHMgPSBnb3RzCgogICAgZGVmIGJvZHkoc2VsZik6CiAgICAgICAgcmV0dXJuICcgICAgJXM6XG4lcycgJSAoc2VsZi5fcmVxdWlyZW1lbnRfbmFtZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2hhc2hfY29tcGFyaXNvbigpKQoKICAgIGRlZiBfaGFzaF9jb21wYXJpc29uKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBhIGNvbXBhcmlzb24gb2YgYWN0dWFsIGFuZCBleHBlY3RlZCBoYXNoIHZhbHVlcy4KCiAgICAgICAgRXhhbXBsZTo6CgogICAgICAgICAgICAgICBFeHBlY3RlZCBzaGEyNTYgYWJjZGVhYmNkZWFiY2RlYWJjZGVhYmNkZWFiY2RlYWJjZGVhYmNkZWFiY2RlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciAxMjM0NTEyMzQ1MTIzNDUxMjM0NTEyMzQ1MTIzNDUxMjM0NTEyMzQ1MTIzNDUKICAgICAgICAgICAgICAgICAgICBHb3QgICAgICAgIGJjZGVmYmNkZWZiY2RlZmJjZGVmYmNkZWZiY2RlZmJjZGVmYmNkZWZiY2RlZgoKICAgICAgICAiIiIKICAgICAgICBkZWYgaGFzaF90aGVuX29yKGhhc2hfbmFtZSk6CiAgICAgICAgICAgICMgRm9yIG5vdywgYWxsIHRoZSBkZWNlbnQgaGFzaGVzIGhhdmUgNi1jaGFyIG5hbWVzLCBzbyB3ZSBjYW4gZ2V0CiAgICAgICAgICAgICMgYXdheSB3aXRoIGhhcmQtY29kaW5nIHNwYWNlIGxpdGVyYWxzLgogICAgICAgICAgICByZXR1cm4gY2hhaW4oW2hhc2hfbmFtZV0sIHJlcGVhdCgnICAgIG9yJykpCgogICAgICAgIGxpbmVzID0gW10KICAgICAgICBmb3IgaGFzaF9uYW1lLCBleHBlY3RlZHMgaW4gaXRlcml0ZW1zKHNlbGYuYWxsb3dlZCk6CiAgICAgICAgICAgIHByZWZpeCA9IGhhc2hfdGhlbl9vcihoYXNoX25hbWUpCiAgICAgICAgICAgIGxpbmVzLmV4dGVuZCgoJyAgICAgICAgRXhwZWN0ZWQgJXMgJXMnICUgKG5leHQocHJlZml4KSwgZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZSBpbiBleHBlY3RlZHMpCiAgICAgICAgICAgIGxpbmVzLmFwcGVuZCgnICAgICAgICAgICAgIEdvdCAgICAgICAgJXNcbicgJQogICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nb3RzW2hhc2hfbmFtZV0uaGV4ZGlnZXN0KCkpCiAgICAgICAgICAgIHByZWZpeCA9ICcgICAgb3InCiAgICAgICAgcmV0dXJuICdcbicuam9pbihsaW5lcykKCgpjbGFzcyBVbnN1cHBvcnRlZFB5dGhvblZlcnNpb24oSW5zdGFsbGF0aW9uRXJyb3IpOgogICAgIiIiVW5zdXBwb3J0ZWQgcHl0aG9uIHZlcnNpb24gYWNjb3JkaW5nIHRvIFJlcXVpcmVzLVB5dGhvbiBwYWNrYWdlCiAgICBtZXRhZGF0YS4iIiIKUEsDBBQAAAAAAAAAIQA2+CX/DpwAAA6cAAAcAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9pbmRleC5weSIiIlJvdXRpbmVzIHJlbGF0ZWQgdG8gUHlQSSwgaW5kZXhlcyIiIgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IGNnaQpmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBuYW1lZHR1cGxlCmltcG9ydCBpdGVydG9vbHMKaW1wb3J0IHN5cwppbXBvcnQgb3MKaW1wb3J0IHJlCmltcG9ydCBtaW1ldHlwZXMKaW1wb3J0IHBvc2l4cGF0aAppbXBvcnQgd2FybmluZ3MKCmZyb20gcGlwLl92ZW5kb3Iuc2l4Lm1vdmVzLnVybGxpYiBpbXBvcnQgcGFyc2UgYXMgdXJsbGliX3BhcnNlCmZyb20gcGlwLl92ZW5kb3Iuc2l4Lm1vdmVzLnVybGxpYiBpbXBvcnQgcmVxdWVzdCBhcyB1cmxsaWJfcmVxdWVzdAoKZnJvbSBwaXAuY29tcGF0IGltcG9ydCBpcGFkZHJlc3MKZnJvbSBwaXAudXRpbHMgaW1wb3J0ICgKICAgIGNhY2hlZF9wcm9wZXJ0eSwgc3BsaXRleHQsIG5vcm1hbGl6ZV9wYXRoLAogICAgQVJDSElWRV9FWFRFTlNJT05TLCBTVVBQT1JURURfRVhURU5TSU9OUywKKQpmcm9tIHBpcC51dGlscy5kZXByZWNhdGlvbiBpbXBvcnQgUmVtb3ZlZEluUGlwMTBXYXJuaW5nCmZyb20gcGlwLnV0aWxzLmxvZ2dpbmcgaW1wb3J0IGluZGVudF9sb2cKZnJvbSBwaXAudXRpbHMucGFja2FnaW5nIGltcG9ydCBjaGVja19yZXF1aXJlc19weXRob24KZnJvbSBwaXAuZXhjZXB0aW9ucyBpbXBvcnQgKAogICAgRGlzdHJpYnV0aW9uTm90Rm91bmQsIEJlc3RWZXJzaW9uQWxyZWFkeUluc3RhbGxlZCwgSW52YWxpZFdoZWVsRmlsZW5hbWUsCiAgICBVbnN1cHBvcnRlZFdoZWVsLAopCmZyb20gcGlwLmRvd25sb2FkIGltcG9ydCBIQVNfVExTLCBpc191cmwsIHBhdGhfdG9fdXJsLCB1cmxfdG9fcGF0aApmcm9tIHBpcC53aGVlbCBpbXBvcnQgV2hlZWwsIHdoZWVsX2V4dApmcm9tIHBpcC5wZXA0MjV0YWdzIGltcG9ydCBnZXRfc3VwcG9ydGVkCmZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IGh0bWw1bGliLCByZXF1ZXN0cywgc2l4CmZyb20gcGlwLl92ZW5kb3IucGFja2FnaW5nLnZlcnNpb24gaW1wb3J0IHBhcnNlIGFzIHBhcnNlX3ZlcnNpb24KZnJvbSBwaXAuX3ZlbmRvci5wYWNrYWdpbmcudXRpbHMgaW1wb3J0IGNhbm9uaWNhbGl6ZV9uYW1lCmZyb20gcGlwLl92ZW5kb3IucGFja2FnaW5nIGltcG9ydCBzcGVjaWZpZXJzCmZyb20gcGlwLl92ZW5kb3IucmVxdWVzdHMuZXhjZXB0aW9ucyBpbXBvcnQgU1NMRXJyb3IKZnJvbSBwaXAuX3ZlbmRvci5kaXN0bGliLmNvbXBhdCBpbXBvcnQgdW5lc2NhcGUKCgpfX2FsbF9fID0gWydGb3JtYXRDb250cm9sJywgJ2ZtdF9jdGxfaGFuZGxlX211dHVhbF9leGNsdWRlJywgJ1BhY2thZ2VGaW5kZXInXQoKClNFQ1VSRV9PUklHSU5TID0gWwogICAgIyBwcm90b2NvbCwgaG9zdG5hbWUsIHBvcnQKICAgICMgVGFrZW4gZnJvbSBDaHJvbWUncyBsaXN0IG9mIHNlY3VyZSBvcmlnaW5zIChTZWU6IGh0dHA6Ly9iaXQubHkvMXFyeVNLQykKICAgICgiaHR0cHMiLCAiKiIsICIqIiksCiAgICAoIioiLCAibG9jYWxob3N0IiwgIioiKSwKICAgICgiKiIsICIxMjcuMC4wLjAvOCIsICIqIiksCiAgICAoIioiLCAiOjoxLzEyOCIsICIqIiksCiAgICAoImZpbGUiLCAiKiIsIE5vbmUpLAogICAgIyBzc2ggaXMgYWx3YXlzIHNlY3VyZS4KICAgICgic3NoIiwgIioiLCAiKiIpLApdCgoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKY2xhc3MgSW5zdGFsbGF0aW9uQ2FuZGlkYXRlKG9iamVjdCk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHByb2plY3QsIHZlcnNpb24sIGxvY2F0aW9uKToKICAgICAgICBzZWxmLnByb2plY3QgPSBwcm9qZWN0CiAgICAgICAgc2VsZi52ZXJzaW9uID0gcGFyc2VfdmVyc2lvbih2ZXJzaW9uKQogICAgICAgIHNlbGYubG9jYXRpb24gPSBsb2NhdGlvbgogICAgICAgIHNlbGYuX2tleSA9IChzZWxmLnByb2plY3QsIHNlbGYudmVyc2lvbiwgc2VsZi5sb2NhdGlvbikKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICI8SW5zdGFsbGF0aW9uQ2FuZGlkYXRlKHswIXJ9LCB7MSFyfSwgezIhcn0pPiIuZm9ybWF0KAogICAgICAgICAgICBzZWxmLnByb2plY3QsIHNlbGYudmVyc2lvbiwgc2VsZi5sb2NhdGlvbiwKICAgICAgICApCgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBoYXNoKHNlbGYuX2tleSkKCiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5fY29tcGFyZShvdGhlciwgbGFtYmRhIHMsIG86IHMgPCBvKQoKICAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLl9jb21wYXJlKG90aGVyLCBsYW1iZGEgcywgbzogcyA8PSBvKQoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLl9jb21wYXJlKG90aGVyLCBsYW1iZGEgcywgbzogcyA9PSBvKQoKICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLl9jb21wYXJlKG90aGVyLCBsYW1iZGEgcywgbzogcyA+PSBvKQoKICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLl9jb21wYXJlKG90aGVyLCBsYW1iZGEgcywgbzogcyA+IG8pCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2NvbXBhcmUob3RoZXIsIGxhbWJkYSBzLCBvOiBzICE9IG8pCgogICAgZGVmIF9jb21wYXJlKHNlbGYsIG90aGVyLCBtZXRob2QpOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBJbnN0YWxsYXRpb25DYW5kaWRhdGUpOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKCiAgICAgICAgcmV0dXJuIG1ldGhvZChzZWxmLl9rZXksIG90aGVyLl9rZXkpCgoKY2xhc3MgUGFja2FnZUZpbmRlcihvYmplY3QpOgogICAgIiIiVGhpcyBmaW5kcyBwYWNrYWdlcy4KCiAgICBUaGlzIGlzIG1lYW50IHRvIG1hdGNoIGVhc3lfaW5zdGFsbCdzIHRlY2huaXF1ZSBmb3IgbG9va2luZyBmb3IKICAgIHBhY2thZ2VzLCBieSByZWFkaW5nIHBhZ2VzIGFuZCBsb29raW5nIGZvciBhcHByb3ByaWF0ZSBsaW5rcy4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaW5kX2xpbmtzLCBpbmRleF91cmxzLCBhbGxvd19hbGxfcHJlcmVsZWFzZXM9RmFsc2UsCiAgICAgICAgICAgICAgICAgdHJ1c3RlZF9ob3N0cz1Ob25lLCBwcm9jZXNzX2RlcGVuZGVuY3lfbGlua3M9RmFsc2UsCiAgICAgICAgICAgICAgICAgc2Vzc2lvbj1Ob25lLCBmb3JtYXRfY29udHJvbD1Ob25lLCBwbGF0Zm9ybT1Ob25lLAogICAgICAgICAgICAgICAgIHZlcnNpb25zPU5vbmUsIGFiaT1Ob25lLCBpbXBsZW1lbnRhdGlvbj1Ob25lKToKICAgICAgICAiIiJDcmVhdGUgYSBQYWNrYWdlRmluZGVyLgoKICAgICAgICA6cGFyYW0gZm9ybWF0X2NvbnRyb2w6IEEgRm9ybWF0Q29udHJvbCBvYmplY3Qgb3IgTm9uZS4gVXNlZCB0byBjb250cm9sCiAgICAgICAgICAgIHRoZSBzZWxlY3Rpb24gb2Ygc291cmNlIHBhY2thZ2VzIC8gYmluYXJ5IHBhY2thZ2VzIHdoZW4gY29uc3VsdGluZwogICAgICAgICAgICB0aGUgaW5kZXggYW5kIGxpbmtzLgogICAgICAgIDpwYXJhbSBwbGF0Zm9ybTogQSBzdHJpbmcgb3IgTm9uZS4gSWYgTm9uZSwgc2VhcmNoZXMgZm9yIHBhY2thZ2VzCiAgICAgICAgICAgIHRoYXQgYXJlIHN1cHBvcnRlZCBieSB0aGUgY3VycmVudCBzeXN0ZW0uIE90aGVyd2lzZSwgd2lsbCBmaW5kCiAgICAgICAgICAgIHBhY2thZ2VzIHRoYXQgY2FuIGJlIGJ1aWx0IG9uIHRoZSBwbGF0Zm9ybSBwYXNzZWQgaW4uIFRoZXNlCiAgICAgICAgICAgIHBhY2thZ2VzIHdpbGwgb25seSBiZSBkb3dubG9hZGVkIGZvciBkaXN0cmlidXRpb246IHRoZXkgd2lsbAogICAgICAgICAgICBub3QgYmUgYnVpbHQgbG9jYWxseS4KICAgICAgICA6cGFyYW0gdmVyc2lvbnM6IEEgbGlzdCBvZiBzdHJpbmdzIG9yIE5vbmUuIFRoaXMgaXMgcGFzc2VkIGRpcmVjdGx5CiAgICAgICAgICAgIHRvIHBlcDQyNXRhZ3MucHkgaW4gdGhlIGdldF9zdXBwb3J0ZWQoKSBtZXRob2QuCiAgICAgICAgOnBhcmFtIGFiaTogQSBzdHJpbmcgb3IgTm9uZS4gVGhpcyBpcyBwYXNzZWQgZGlyZWN0bHkKICAgICAgICAgICAgdG8gcGVwNDI1dGFncy5weSBpbiB0aGUgZ2V0X3N1cHBvcnRlZCgpIG1ldGhvZC4KICAgICAgICA6cGFyYW0gaW1wbGVtZW50YXRpb246IEEgc3RyaW5nIG9yIE5vbmUuIFRoaXMgaXMgcGFzc2VkIGRpcmVjdGx5CiAgICAgICAgICAgIHRvIHBlcDQyNXRhZ3MucHkgaW4gdGhlIGdldF9zdXBwb3J0ZWQoKSBtZXRob2QuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2Vzc2lvbiBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoCiAgICAgICAgICAgICAgICAiUGFja2FnZUZpbmRlcigpIG1pc3NpbmcgMSByZXF1aXJlZCBrZXl3b3JkIGFyZ3VtZW50OiAiCiAgICAgICAgICAgICAgICAiJ3Nlc3Npb24nIgogICAgICAgICAgICApCgogICAgICAgICMgQnVpbGQgZmluZF9saW5rcy4gSWYgYW4gYXJndW1lbnQgc3RhcnRzIHdpdGggfiwgaXQgbWF5IGJlCiAgICAgICAgIyBhIGxvY2FsIGZpbGUgcmVsYXRpdmUgdG8gYSBob21lIGRpcmVjdG9yeS4gU28gdHJ5IG5vcm1hbGl6aW5nCiAgICAgICAgIyBpdCBhbmQgaWYgaXQgZXhpc3RzLCB1c2UgdGhlIG5vcm1hbGl6ZWQgdmVyc2lvbi4KICAgICAgICAjIFRoaXMgaXMgZGVsaWJlcmF0ZWx5IGNvbnNlcnZhdGl2ZSAtIGl0IG1pZ2h0IGJlIGZpbmUganVzdCB0bwogICAgICAgICMgYmxpbmRseSBub3JtYWxpemUgYW55dGhpbmcgc3RhcnRpbmcgd2l0aCBhIH4uLi4KICAgICAgICBzZWxmLmZpbmRfbGlua3MgPSBbXQogICAgICAgIGZvciBsaW5rIGluIGZpbmRfbGlua3M6CiAgICAgICAgICAgIGlmIGxpbmsuc3RhcnRzd2l0aCgnficpOgogICAgICAgICAgICAgICAgbmV3X2xpbmsgPSBub3JtYWxpemVfcGF0aChsaW5rKQogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMobmV3X2xpbmspOgogICAgICAgICAgICAgICAgICAgIGxpbmsgPSBuZXdfbGluawogICAgICAgICAgICBzZWxmLmZpbmRfbGlua3MuYXBwZW5kKGxpbmspCgogICAgICAgIHNlbGYuaW5kZXhfdXJscyA9IGluZGV4X3VybHMKICAgICAgICBzZWxmLmRlcGVuZGVuY3lfbGlua3MgPSBbXQoKICAgICAgICAjIFRoZXNlIGFyZSBib3JpbmcgbGlua3MgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBsb2dnZWQgc29tZWhvdzoKICAgICAgICBzZWxmLmxvZ2dlZF9saW5rcyA9IHNldCgpCgogICAgICAgIHNlbGYuZm9ybWF0X2NvbnRyb2wgPSBmb3JtYXRfY29udHJvbCBvciBGb3JtYXRDb250cm9sKHNldCgpLCBzZXQoKSkKCiAgICAgICAgIyBEb21haW5zIHRoYXQgd2Ugd29uJ3QgZW1pdCB3YXJuaW5ncyBmb3Igd2hlbiBub3QgdXNpbmcgSFRUUFMKICAgICAgICBzZWxmLnNlY3VyZV9vcmlnaW5zID0gWwogICAgICAgICAgICAoIioiLCBob3N0LCAiKiIpCiAgICAgICAgICAgIGZvciBob3N0IGluICh0cnVzdGVkX2hvc3RzIGlmIHRydXN0ZWRfaG9zdHMgZWxzZSBbXSkKICAgICAgICBdCgogICAgICAgICMgRG8gd2Ugd2FudCB0byBhbGxvdyBfYWxsXyBwcmUtcmVsZWFzZXM/CiAgICAgICAgc2VsZi5hbGxvd19hbGxfcHJlcmVsZWFzZXMgPSBhbGxvd19hbGxfcHJlcmVsZWFzZXMKCiAgICAgICAgIyBEbyB3ZSBwcm9jZXNzIGRlcGVuZGVuY3kgbGlua3M/CiAgICAgICAgc2VsZi5wcm9jZXNzX2RlcGVuZGVuY3lfbGlua3MgPSBwcm9jZXNzX2RlcGVuZGVuY3lfbGlua3MKCiAgICAgICAgIyBUaGUgU2Vzc2lvbiB3ZSdsbCB1c2UgdG8gbWFrZSByZXF1ZXN0cwogICAgICAgIHNlbGYuc2Vzc2lvbiA9IHNlc3Npb24KCiAgICAgICAgIyBUaGUgdmFsaWQgdGFncyB0byBjaGVjayBwb3RlbnRpYWwgZm91bmQgd2hlZWwgY2FuZGlkYXRlcyBhZ2FpbnN0CiAgICAgICAgc2VsZi52YWxpZF90YWdzID0gZ2V0X3N1cHBvcnRlZCgKICAgICAgICAgICAgdmVyc2lvbnM9dmVyc2lvbnMsCiAgICAgICAgICAgIHBsYXRmb3JtPXBsYXRmb3JtLAogICAgICAgICAgICBhYmk9YWJpLAogICAgICAgICAgICBpbXBsPWltcGxlbWVudGF0aW9uLAogICAgICAgICkKCiAgICAgICAgIyBJZiB3ZSBkb24ndCBoYXZlIFRMUyBlbmFibGVkLCB0aGVuIFdBUk4gaWYgYW55cGxhY2Ugd2UncmUgbG9va2luZwogICAgICAgICMgcmVsaWVzIG9uIFRMUy4KICAgICAgICBpZiBub3QgSEFTX1RMUzoKICAgICAgICAgICAgZm9yIGxpbmsgaW4gaXRlcnRvb2xzLmNoYWluKHNlbGYuaW5kZXhfdXJscywgc2VsZi5maW5kX2xpbmtzKToKICAgICAgICAgICAgICAgIHBhcnNlZCA9IHVybGxpYl9wYXJzZS51cmxwYXJzZShsaW5rKQogICAgICAgICAgICAgICAgaWYgcGFyc2VkLnNjaGVtZSA9PSAiaHR0cHMiOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAicGlwIGlzIGNvbmZpZ3VyZWQgd2l0aCBsb2NhdGlvbnMgdGhhdCByZXF1aXJlICIKICAgICAgICAgICAgICAgICAgICAgICAgIlRMUy9TU0wsIGhvd2V2ZXIgdGhlIHNzbCBtb2R1bGUgaW4gUHl0aG9uIGlzIG5vdCAiCiAgICAgICAgICAgICAgICAgICAgICAgICJhdmFpbGFibGUuIgogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICBicmVhawoKICAgIGRlZiBhZGRfZGVwZW5kZW5jeV9saW5rcyhzZWxmLCBsaW5rcyk6CiAgICAgICAgIyAjIEZJWE1FOiB0aGlzIHNob3VsZG4ndCBiZSBnbG9iYWwgbGlzdCB0aGlzLCBpdCBzaG91bGQgb25seQogICAgICAgICMgIyBhcHBseSB0byByZXF1aXJlbWVudHMgb2YgdGhlIHBhY2thZ2UgdGhhdCBzcGVjaWZpZXMgdGhlCiAgICAgICAgIyAjIGRlcGVuZGVuY3lfbGlua3MgdmFsdWUKICAgICAgICAjICMgRklYTUU6IGFsc28sIHdlIHNob3VsZCB0cmFjayBjb21lc19mcm9tIChpLmUuLCB1c2UgTGluaykKICAgICAgICBpZiBzZWxmLnByb2Nlc3NfZGVwZW5kZW5jeV9saW5rczoKICAgICAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgICAgICJEZXBlbmRlbmN5IExpbmtzIHByb2Nlc3NpbmcgaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSAiCiAgICAgICAgICAgICAgICAicmVtb3ZlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLiIsCiAgICAgICAgICAgICAgICBSZW1vdmVkSW5QaXAxMFdhcm5pbmcsCiAgICAgICAgICAgICkKICAgICAgICAgICAgc2VsZi5kZXBlbmRlbmN5X2xpbmtzLmV4dGVuZChsaW5rcykKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX3NvcnRfbG9jYXRpb25zKGxvY2F0aW9ucywgZXhwYW5kX2Rpcj1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgU29ydCBsb2NhdGlvbnMgaW50byAiZmlsZXMiIChhcmNoaXZlcykgYW5kICJ1cmxzIiwgYW5kIHJldHVybgogICAgICAgIGEgcGFpciBvZiBsaXN0cyAoZmlsZXMsdXJscykKICAgICAgICAiIiIKICAgICAgICBmaWxlcyA9IFtdCiAgICAgICAgdXJscyA9IFtdCgogICAgICAgICMgcHV0cyB0aGUgdXJsIGZvciB0aGUgZ2l2ZW4gZmlsZSBwYXRoIGludG8gdGhlIGFwcHJvcHJpYXRlIGxpc3QKICAgICAgICBkZWYgc29ydF9wYXRoKHBhdGgpOgogICAgICAgICAgICB1cmwgPSBwYXRoX3RvX3VybChwYXRoKQogICAgICAgICAgICBpZiBtaW1ldHlwZXMuZ3Vlc3NfdHlwZSh1cmwsIHN0cmljdD1GYWxzZSlbMF0gPT0gJ3RleHQvaHRtbCc6CiAgICAgICAgICAgICAgICB1cmxzLmFwcGVuZCh1cmwpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBmaWxlcy5hcHBlbmQodXJsKQoKICAgICAgICBmb3IgdXJsIGluIGxvY2F0aW9uczoKCiAgICAgICAgICAgIGlzX2xvY2FsX3BhdGggPSBvcy5wYXRoLmV4aXN0cyh1cmwpCiAgICAgICAgICAgIGlzX2ZpbGVfdXJsID0gdXJsLnN0YXJ0c3dpdGgoJ2ZpbGU6JykKCiAgICAgICAgICAgIGlmIGlzX2xvY2FsX3BhdGggb3IgaXNfZmlsZV91cmw6CiAgICAgICAgICAgICAgICBpZiBpc19sb2NhbF9wYXRoOgogICAgICAgICAgICAgICAgICAgIHBhdGggPSB1cmwKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHVybF90b19wYXRoKHVybCkKICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIocGF0aCk6CiAgICAgICAgICAgICAgICAgICAgaWYgZXhwYW5kX2RpcjoKICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGgucmVhbHBhdGgocGF0aCkKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGl0ZW0gaW4gb3MubGlzdGRpcihwYXRoKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRfcGF0aChvcy5wYXRoLmpvaW4ocGF0aCwgaXRlbSkpCiAgICAgICAgICAgICAgICAgICAgZWxpZiBpc19maWxlX3VybDoKICAgICAgICAgICAgICAgICAgICAgICAgdXJscy5hcHBlbmQodXJsKQogICAgICAgICAgICAgICAgZWxpZiBvcy5wYXRoLmlzZmlsZShwYXRoKToKICAgICAgICAgICAgICAgICAgICBzb3J0X3BhdGgocGF0aCkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgICAgICJVcmwgJyVzJyBpcyBpZ25vcmVkOiBpdCBpcyBuZWl0aGVyIGEgZmlsZSAiCiAgICAgICAgICAgICAgICAgICAgICAgICJub3IgYSBkaXJlY3RvcnkuIiwgdXJsKQogICAgICAgICAgICBlbGlmIGlzX3VybCh1cmwpOgogICAgICAgICAgICAgICAgIyBPbmx5IGFkZCB1cmwgd2l0aCBjbGVhciBzY2hlbWUKICAgICAgICAgICAgICAgIHVybHMuYXBwZW5kKHVybCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgICAgICJVcmwgJyVzJyBpcyBpZ25vcmVkLiBJdCBpcyBlaXRoZXIgYSBub24tZXhpc3RpbmcgIgogICAgICAgICAgICAgICAgICAgICJwYXRoIG9yIGxhY2tzIGEgc3BlY2lmaWMgc2NoZW1lLiIsIHVybCkKCiAgICAgICAgcmV0dXJuIGZpbGVzLCB1cmxzCgogICAgZGVmIF9jYW5kaWRhdGVfc29ydF9rZXkoc2VsZiwgY2FuZGlkYXRlKToKICAgICAgICAiIiIKICAgICAgICBGdW5jdGlvbiB1c2VkIHRvIGdlbmVyYXRlIGxpbmsgc29ydCBrZXkgZm9yIGxpbmsgdHVwbGVzLgogICAgICAgIFRoZSBncmVhdGVyIHRoZSByZXR1cm4gdmFsdWUsIHRoZSBtb3JlIHByZWZlcnJlZCBpdCBpcy4KICAgICAgICBJZiBub3QgZmluZGluZyB3aGVlbHMsIHRoZW4gc29ydGVkIGJ5IHZlcnNpb24gb25seS4KICAgICAgICBJZiBmaW5kaW5nIHdoZWVscywgdGhlbiB0aGUgc29ydCBvcmRlciBpcyBieSB2ZXJzaW9uLCB0aGVuOgogICAgICAgICAgMS4gZXhpc3RpbmcgaW5zdGFsbHMKICAgICAgICAgIDIuIHdoZWVscyBvcmRlcmVkIHZpYSBXaGVlbC5zdXBwb3J0X2luZGV4X21pbihzZWxmLnZhbGlkX3RhZ3MpCiAgICAgICAgICAzLiBzb3VyY2UgYXJjaGl2ZXMKICAgICAgICBOb3RlOiBpdCB3YXMgY29uc2lkZXJlZCB0byBlbWJlZCB0aGlzIGxvZ2ljIGludG8gdGhlIExpbmsKICAgICAgICAgICAgICBjb21wYXJpc29uIG9wZXJhdG9ycywgYnV0IHRoZW4gZGlmZmVyZW50IHNkaXN0IGxpbmtzCiAgICAgICAgICAgICAgd2l0aCB0aGUgc2FtZSB2ZXJzaW9uLCB3b3VsZCBoYXZlIHRvIGJlIGNvbnNpZGVyZWQgZXF1YWwKICAgICAgICAiIiIKICAgICAgICBzdXBwb3J0X251bSA9IGxlbihzZWxmLnZhbGlkX3RhZ3MpCiAgICAgICAgaWYgY2FuZGlkYXRlLmxvY2F0aW9uLmlzX3doZWVsOgogICAgICAgICAgICAjIGNhbiByYWlzZSBJbnZhbGlkV2hlZWxGaWxlbmFtZQogICAgICAgICAgICB3aGVlbCA9IFdoZWVsKGNhbmRpZGF0ZS5sb2NhdGlvbi5maWxlbmFtZSkKICAgICAgICAgICAgaWYgbm90IHdoZWVsLnN1cHBvcnRlZChzZWxmLnZhbGlkX3RhZ3MpOgogICAgICAgICAgICAgICAgcmFpc2UgVW5zdXBwb3J0ZWRXaGVlbCgKICAgICAgICAgICAgICAgICAgICAiJXMgaXMgbm90IGEgc3VwcG9ydGVkIHdoZWVsIGZvciB0aGlzIHBsYXRmb3JtLiBJdCAiCiAgICAgICAgICAgICAgICAgICAgImNhbid0IGJlIHNvcnRlZC4iICUgd2hlZWwuZmlsZW5hbWUKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgcHJpID0gLSh3aGVlbC5zdXBwb3J0X2luZGV4X21pbihzZWxmLnZhbGlkX3RhZ3MpKQogICAgICAgIGVsc2U6ICAjIHNkaXN0CiAgICAgICAgICAgIHByaSA9IC0oc3VwcG9ydF9udW0pCiAgICAgICAgcmV0dXJuIChjYW5kaWRhdGUudmVyc2lvbiwgcHJpKQoKICAgIGRlZiBfdmFsaWRhdGVfc2VjdXJlX29yaWdpbihzZWxmLCBsb2dnZXIsIGxvY2F0aW9uKToKICAgICAgICAjIERldGVybWluZSBpZiB0aGlzIHVybCB1c2VkIGEgc2VjdXJlIHRyYW5zcG9ydCBtZWNoYW5pc20KICAgICAgICBwYXJzZWQgPSB1cmxsaWJfcGFyc2UudXJscGFyc2Uoc3RyKGxvY2F0aW9uKSkKICAgICAgICBvcmlnaW4gPSAocGFyc2VkLnNjaGVtZSwgcGFyc2VkLmhvc3RuYW1lLCBwYXJzZWQucG9ydCkKCiAgICAgICAgIyBUaGUgcHJvdG9jb2wgdG8gdXNlIHRvIHNlZSBpZiB0aGUgcHJvdG9jb2wgbWF0Y2hlcy4KICAgICAgICAjIERvbid0IGNvdW50IHRoZSByZXBvc2l0b3J5IHR5cGUgYXMgcGFydCBvZiB0aGUgcHJvdG9jb2w6IGluCiAgICAgICAgIyBjYXNlcyBzdWNoIGFzICJnaXQrc3NoIiwgb25seSB1c2UgInNzaCIuIChJLmUuLCBPbmx5IHZlcmlmeSBhZ2FpbnN0CiAgICAgICAgIyB0aGUgbGFzdCBzY2hlbWUuKQogICAgICAgIHByb3RvY29sID0gb3JpZ2luWzBdLnJzcGxpdCgnKycsIDEpWy0xXQoKICAgICAgICAjIERldGVybWluZSBpZiBvdXIgb3JpZ2luIGlzIGEgc2VjdXJlIG9yaWdpbiBieSBsb29raW5nIHRocm91Z2ggb3VyCiAgICAgICAgIyBoYXJkY29kZWQgbGlzdCBvZiBzZWN1cmUgb3JpZ2lucywgYXMgd2VsbCBhcyBhbnkgYWRkaXRpb25hbCBvbmVzCiAgICAgICAgIyBjb25maWd1cmVkIG9uIHRoaXMgUGFja2FnZUZpbmRlciBpbnN0YW5jZS4KICAgICAgICBmb3Igc2VjdXJlX29yaWdpbiBpbiAoU0VDVVJFX09SSUdJTlMgKyBzZWxmLnNlY3VyZV9vcmlnaW5zKToKICAgICAgICAgICAgaWYgcHJvdG9jb2wgIT0gc2VjdXJlX29yaWdpblswXSBhbmQgc2VjdXJlX29yaWdpblswXSAhPSAiKiI6CiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIyBXZSBuZWVkIHRvIGRvIHRoaXMgZGVjb2RlIGRhbmNlIHRvIGVuc3VyZSB0aGF0IHdlIGhhdmUgYQogICAgICAgICAgICAgICAgIyB1bmljb2RlIG9iamVjdCwgZXZlbiBvbiBQeXRob24gMi54LgogICAgICAgICAgICAgICAgYWRkciA9IGlwYWRkcmVzcy5pcF9hZGRyZXNzKAogICAgICAgICAgICAgICAgICAgIG9yaWdpblsxXQogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgaXNpbnN0YW5jZShvcmlnaW5bMV0sIHNpeC50ZXh0X3R5cGUpIG9yCiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpblsxXSBpcyBOb25lCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIGVsc2Ugb3JpZ2luWzFdLmRlY29kZSgidXRmOCIpCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBuZXR3b3JrID0gaXBhZGRyZXNzLmlwX25ldHdvcmsoCiAgICAgICAgICAgICAgICAgICAgc2VjdXJlX29yaWdpblsxXQogICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VjdXJlX29yaWdpblsxXSwgc2l4LnRleHRfdHlwZSkKICAgICAgICAgICAgICAgICAgICBlbHNlIHNlY3VyZV9vcmlnaW5bMV0uZGVjb2RlKCJ1dGY4IikKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICAjIFdlIGRvbid0IGhhdmUgYm90aCBhIHZhbGlkIGFkZHJlc3Mgb3IgYSB2YWxpZCBuZXR3b3JrLCBzbwogICAgICAgICAgICAgICAgIyB3ZSdsbCBjaGVjayB0aGlzIG9yaWdpbiBhZ2FpbnN0IGhvc3RuYW1lcy4KICAgICAgICAgICAgICAgIGlmIChvcmlnaW5bMV0gYW5kCiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpblsxXS5sb3dlcigpICE9IHNlY3VyZV9vcmlnaW5bMV0ubG93ZXIoKSBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgc2VjdXJlX29yaWdpblsxXSAhPSAiKiIpOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIFdlIGhhdmUgYSB2YWxpZCBhZGRyZXNzIGFuZCBuZXR3b3JrLCBzbyBzZWUgaWYgdGhlIGFkZHJlc3MKICAgICAgICAgICAgICAgICMgaXMgY29udGFpbmVkIHdpdGhpbiB0aGUgbmV0d29yay4KICAgICAgICAgICAgICAgIGlmIGFkZHIgbm90IGluIG5ldHdvcms6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwb3J0IHBhdGNoZXMKICAgICAgICAgICAgaWYgKG9yaWdpblsyXSAhPSBzZWN1cmVfb3JpZ2luWzJdIGFuZAogICAgICAgICAgICAgICAgICAgIHNlY3VyZV9vcmlnaW5bMl0gIT0gIioiIGFuZAogICAgICAgICAgICAgICAgICAgIHNlY3VyZV9vcmlnaW5bMl0gaXMgbm90IE5vbmUpOgogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgICMgSWYgd2UndmUgZ290dGVuIGhlcmUsIHRoZW4gdGhpcyBvcmlnaW4gbWF0Y2hlcyB0aGUgY3VycmVudAogICAgICAgICAgICAjIHNlY3VyZSBvcmlnaW4gYW5kIHdlIHNob3VsZCByZXR1cm4gVHJ1ZQogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICAjIElmIHdlJ3ZlIGdvdHRlbiB0byB0aGlzIHBvaW50LCB0aGVuIHRoZSBvcmlnaW4gaXNuJ3Qgc2VjdXJlIGFuZCB3ZQogICAgICAgICMgd2lsbCBub3QgYWNjZXB0IGl0IGFzIGEgdmFsaWQgbG9jYXRpb24gdG8gc2VhcmNoLiBXZSB3aWxsIGhvd2V2ZXIKICAgICAgICAjIGxvZyBhIHdhcm5pbmcgdGhhdCB3ZSBhcmUgaWdub3JpbmcgaXQuCiAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICJUaGUgcmVwb3NpdG9yeSBsb2NhdGVkIGF0ICVzIGlzIG5vdCBhIHRydXN0ZWQgb3Igc2VjdXJlIGhvc3QgYW5kICIKICAgICAgICAgICAgImlzIGJlaW5nIGlnbm9yZWQuIElmIHRoaXMgcmVwb3NpdG9yeSBpcyBhdmFpbGFibGUgdmlhIEhUVFBTIGl0ICIKICAgICAgICAgICAgImlzIHJlY29tbWVuZGVkIHRvIHVzZSBIVFRQUyBpbnN0ZWFkLCBvdGhlcndpc2UgeW91IG1heSBzaWxlbmNlICIKICAgICAgICAgICAgInRoaXMgd2FybmluZyBhbmQgYWxsb3cgaXQgYW55d2F5cyB3aXRoICctLXRydXN0ZWQtaG9zdCAlcycuIiwKICAgICAgICAgICAgcGFyc2VkLmhvc3RuYW1lLAogICAgICAgICAgICBwYXJzZWQuaG9zdG5hbWUsCiAgICAgICAgKQoKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgX2dldF9pbmRleF91cmxzX2xvY2F0aW9ucyhzZWxmLCBwcm9qZWN0X25hbWUpOgogICAgICAgICIiIlJldHVybnMgdGhlIGxvY2F0aW9ucyBmb3VuZCB2aWEgc2VsZi5pbmRleF91cmxzCgogICAgICAgIENoZWNrcyB0aGUgdXJsX25hbWUgb24gdGhlIG1haW4gKGZpcnN0IGluIHRoZSBsaXN0KSBpbmRleCBhbmQKICAgICAgICB1c2UgdGhpcyB1cmxfbmFtZSB0byBwcm9kdWNlIGFsbCBsb2NhdGlvbnMKICAgICAgICAiIiIKCiAgICAgICAgZGVmIG1rdXJsX3B5cGlfdXJsKHVybCk6CiAgICAgICAgICAgIGxvYyA9IHBvc2l4cGF0aC5qb2luKAogICAgICAgICAgICAgICAgdXJsLAogICAgICAgICAgICAgICAgdXJsbGliX3BhcnNlLnF1b3RlKGNhbm9uaWNhbGl6ZV9uYW1lKHByb2plY3RfbmFtZSkpKQogICAgICAgICAgICAjIEZvciBtYXhpbXVtIGNvbXBhdGliaWxpdHkgd2l0aCBlYXN5X2luc3RhbGwsIGVuc3VyZSB0aGUgcGF0aAogICAgICAgICAgICAjIGVuZHMgaW4gYSB0cmFpbGluZyBzbGFzaC4gIEFsdGhvdWdoIHRoaXMgaXNuJ3QgaW4gdGhlIHNwZWMKICAgICAgICAgICAgIyAoYW5kIFB5UEkgY2FuIGhhbmRsZSBpdCB3aXRob3V0IHRoZSBzbGFzaCkgc29tZSBvdGhlciBpbmRleAogICAgICAgICAgICAjIGltcGxlbWVudGF0aW9ucyBtaWdodCBicmVhayBpZiB0aGV5IHJlbGllZCBvbiBlYXN5X2luc3RhbGwncwogICAgICAgICAgICAjIGJlaGF2aW9yLgogICAgICAgICAgICBpZiBub3QgbG9jLmVuZHN3aXRoKCcvJyk6CiAgICAgICAgICAgICAgICBsb2MgPSBsb2MgKyAnLycKICAgICAgICAgICAgcmV0dXJuIGxvYwoKICAgICAgICByZXR1cm4gW21rdXJsX3B5cGlfdXJsKHVybCkgZm9yIHVybCBpbiBzZWxmLmluZGV4X3VybHNdCgogICAgZGVmIGZpbmRfYWxsX2NhbmRpZGF0ZXMoc2VsZiwgcHJvamVjdF9uYW1lKToKICAgICAgICAiIiJGaW5kIGFsbCBhdmFpbGFibGUgSW5zdGFsbGF0aW9uQ2FuZGlkYXRlIGZvciBwcm9qZWN0X25hbWUKCiAgICAgICAgVGhpcyBjaGVja3MgaW5kZXhfdXJscywgZmluZF9saW5rcyBhbmQgZGVwZW5kZW5jeV9saW5rcy4KICAgICAgICBBbGwgdmVyc2lvbnMgZm91bmQgYXJlIHJldHVybmVkIGFzIGFuIEluc3RhbGxhdGlvbkNhbmRpZGF0ZSBsaXN0LgoKICAgICAgICBTZWUgX2xpbmtfcGFja2FnZV92ZXJzaW9ucyBmb3IgZGV0YWlscyBvbiB3aGljaCBmaWxlcyBhcmUgYWNjZXB0ZWQKICAgICAgICAiIiIKICAgICAgICBpbmRleF9sb2NhdGlvbnMgPSBzZWxmLl9nZXRfaW5kZXhfdXJsc19sb2NhdGlvbnMocHJvamVjdF9uYW1lKQogICAgICAgIGluZGV4X2ZpbGVfbG9jLCBpbmRleF91cmxfbG9jID0gc2VsZi5fc29ydF9sb2NhdGlvbnMoaW5kZXhfbG9jYXRpb25zKQogICAgICAgIGZsX2ZpbGVfbG9jLCBmbF91cmxfbG9jID0gc2VsZi5fc29ydF9sb2NhdGlvbnMoCiAgICAgICAgICAgIHNlbGYuZmluZF9saW5rcywgZXhwYW5kX2Rpcj1UcnVlKQogICAgICAgIGRlcF9maWxlX2xvYywgZGVwX3VybF9sb2MgPSBzZWxmLl9zb3J0X2xvY2F0aW9ucyhzZWxmLmRlcGVuZGVuY3lfbGlua3MpCgogICAgICAgIGZpbGVfbG9jYXRpb25zID0gKAogICAgICAgICAgICBMaW5rKHVybCkgZm9yIHVybCBpbiBpdGVydG9vbHMuY2hhaW4oCiAgICAgICAgICAgICAgICBpbmRleF9maWxlX2xvYywgZmxfZmlsZV9sb2MsIGRlcF9maWxlX2xvYykKICAgICAgICApCgogICAgICAgICMgV2UgdHJ1c3QgZXZlcnkgdXJsIHRoYXQgdGhlIHVzZXIgaGFzIGdpdmVuIHVzIHdoZXRoZXIgaXQgd2FzIGdpdmVuCiAgICAgICAgIyAgIHZpYSAtLWluZGV4LXVybCBvciAtLWZpbmQtbGlua3MKICAgICAgICAjIFdlIGV4cGxpY2l0bHkgZG8gbm90IHRydXN0IGxpbmtzIHRoYXQgY2FtZSBmcm9tIGRlcGVuZGVuY3lfbGlua3MKICAgICAgICAjIFdlIHdhbnQgdG8gZmlsdGVyIG91dCBhbnkgdGhpbmcgd2hpY2ggZG9lcyBub3QgaGF2ZSBhIHNlY3VyZSBvcmlnaW4uCiAgICAgICAgdXJsX2xvY2F0aW9ucyA9IFsKICAgICAgICAgICAgbGluayBmb3IgbGluayBpbiBpdGVydG9vbHMuY2hhaW4oCiAgICAgICAgICAgICAgICAoTGluayh1cmwpIGZvciB1cmwgaW4gaW5kZXhfdXJsX2xvYyksCiAgICAgICAgICAgICAgICAoTGluayh1cmwpIGZvciB1cmwgaW4gZmxfdXJsX2xvYyksCiAgICAgICAgICAgICAgICAoTGluayh1cmwpIGZvciB1cmwgaW4gZGVwX3VybF9sb2MpLAogICAgICAgICAgICApCiAgICAgICAgICAgIGlmIHNlbGYuX3ZhbGlkYXRlX3NlY3VyZV9vcmlnaW4obG9nZ2VyLCBsaW5rKQogICAgICAgIF0KCiAgICAgICAgbG9nZ2VyLmRlYnVnKCclZCBsb2NhdGlvbihzKSB0byBzZWFyY2ggZm9yIHZlcnNpb25zIG9mICVzOicsCiAgICAgICAgICAgICAgICAgICAgIGxlbih1cmxfbG9jYXRpb25zKSwgcHJvamVjdF9uYW1lKQoKICAgICAgICBmb3IgbG9jYXRpb24gaW4gdXJsX2xvY2F0aW9uczoKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCcqICVzJywgbG9jYXRpb24pCgogICAgICAgIGNhbm9uaWNhbF9uYW1lID0gY2Fub25pY2FsaXplX25hbWUocHJvamVjdF9uYW1lKQogICAgICAgIGZvcm1hdHMgPSBmbXRfY3RsX2Zvcm1hdHMoc2VsZi5mb3JtYXRfY29udHJvbCwgY2Fub25pY2FsX25hbWUpCiAgICAgICAgc2VhcmNoID0gU2VhcmNoKHByb2plY3RfbmFtZSwgY2Fub25pY2FsX25hbWUsIGZvcm1hdHMpCiAgICAgICAgZmluZF9saW5rc192ZXJzaW9ucyA9IHNlbGYuX3BhY2thZ2VfdmVyc2lvbnMoCiAgICAgICAgICAgICMgV2UgdHJ1c3QgZXZlcnkgZGlyZWN0bHkgbGlua2VkIGFyY2hpdmUgaW4gZmluZF9saW5rcwogICAgICAgICAgICAoTGluayh1cmwsICctZicpIGZvciB1cmwgaW4gc2VsZi5maW5kX2xpbmtzKSwKICAgICAgICAgICAgc2VhcmNoCiAgICAgICAgKQoKICAgICAgICBwYWdlX3ZlcnNpb25zID0gW10KICAgICAgICBmb3IgcGFnZSBpbiBzZWxmLl9nZXRfcGFnZXModXJsX2xvY2F0aW9ucywgcHJvamVjdF9uYW1lKToKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdBbmFseXppbmcgbGlua3MgZnJvbSBwYWdlICVzJywgcGFnZS51cmwpCiAgICAgICAgICAgIHdpdGggaW5kZW50X2xvZygpOgogICAgICAgICAgICAgICAgcGFnZV92ZXJzaW9ucy5leHRlbmQoCiAgICAgICAgICAgICAgICAgICAgc2VsZi5fcGFja2FnZV92ZXJzaW9ucyhwYWdlLmxpbmtzLCBzZWFyY2gpCiAgICAgICAgICAgICAgICApCgogICAgICAgIGRlcGVuZGVuY3lfdmVyc2lvbnMgPSBzZWxmLl9wYWNrYWdlX3ZlcnNpb25zKAogICAgICAgICAgICAoTGluayh1cmwpIGZvciB1cmwgaW4gc2VsZi5kZXBlbmRlbmN5X2xpbmtzKSwgc2VhcmNoCiAgICAgICAgKQogICAgICAgIGlmIGRlcGVuZGVuY3lfdmVyc2lvbnM6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygKICAgICAgICAgICAgICAgICdkZXBlbmRlbmN5X2xpbmtzIGZvdW5kOiAlcycsCiAgICAgICAgICAgICAgICAnLCAnLmpvaW4oWwogICAgICAgICAgICAgICAgICAgIHZlcnNpb24ubG9jYXRpb24udXJsIGZvciB2ZXJzaW9uIGluIGRlcGVuZGVuY3lfdmVyc2lvbnMKICAgICAgICAgICAgICAgIF0pCiAgICAgICAgICAgICkKCiAgICAgICAgZmlsZV92ZXJzaW9ucyA9IHNlbGYuX3BhY2thZ2VfdmVyc2lvbnMoZmlsZV9sb2NhdGlvbnMsIHNlYXJjaCkKICAgICAgICBpZiBmaWxlX3ZlcnNpb25zOgogICAgICAgICAgICBmaWxlX3ZlcnNpb25zLnNvcnQocmV2ZXJzZT1UcnVlKQogICAgICAgICAgICBsb2dnZXIuZGVidWcoCiAgICAgICAgICAgICAgICAnTG9jYWwgZmlsZXMgZm91bmQ6ICVzJywKICAgICAgICAgICAgICAgICcsICcuam9pbihbCiAgICAgICAgICAgICAgICAgICAgdXJsX3RvX3BhdGgoY2FuZGlkYXRlLmxvY2F0aW9uLnVybCkKICAgICAgICAgICAgICAgICAgICBmb3IgY2FuZGlkYXRlIGluIGZpbGVfdmVyc2lvbnMKICAgICAgICAgICAgICAgIF0pCiAgICAgICAgICAgICkKCiAgICAgICAgIyBUaGlzIGlzIGFuIGludGVudGlvbmFsIHByaW9yaXR5IG9yZGVyaW5nCiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgZmlsZV92ZXJzaW9ucyArIGZpbmRfbGlua3NfdmVyc2lvbnMgKyBwYWdlX3ZlcnNpb25zICsKICAgICAgICAgICAgZGVwZW5kZW5jeV92ZXJzaW9ucwogICAgICAgICkKCiAgICBkZWYgZmluZF9yZXF1aXJlbWVudChzZWxmLCByZXEsIHVwZ3JhZGUpOgogICAgICAgICIiIlRyeSB0byBmaW5kIGEgTGluayBtYXRjaGluZyByZXEKCiAgICAgICAgRXhwZWN0cyByZXEsIGFuIEluc3RhbGxSZXF1aXJlbWVudCBhbmQgdXBncmFkZSwgYSBib29sZWFuCiAgICAgICAgUmV0dXJucyBhIExpbmsgaWYgZm91bmQsCiAgICAgICAgUmFpc2VzIERpc3RyaWJ1dGlvbk5vdEZvdW5kIG9yIEJlc3RWZXJzaW9uQWxyZWFkeUluc3RhbGxlZCBvdGhlcndpc2UKICAgICAgICAiIiIKICAgICAgICBhbGxfY2FuZGlkYXRlcyA9IHNlbGYuZmluZF9hbGxfY2FuZGlkYXRlcyhyZXEubmFtZSkKCiAgICAgICAgIyBGaWx0ZXIgb3V0IGFueXRoaW5nIHdoaWNoIGRvZXNuJ3QgbWF0Y2ggb3VyIHNwZWNpZmllcgogICAgICAgIGNvbXBhdGlibGVfdmVyc2lvbnMgPSBzZXQoCiAgICAgICAgICAgIHJlcS5zcGVjaWZpZXIuZmlsdGVyKAogICAgICAgICAgICAgICAgIyBXZSB0dXJuIHRoZSB2ZXJzaW9uIG9iamVjdCBpbnRvIGEgc3RyIGhlcmUgYmVjYXVzZSBvdGhlcndpc2UKICAgICAgICAgICAgICAgICMgd2hlbiB3ZSdyZSBkZWJ1bmRsZWQgYnV0IHNldHVwdG9vbHMgaXNuJ3QsIFB5dGhvbiB3aWxsIHNlZQogICAgICAgICAgICAgICAgIyBwYWNrYWdpbmcudmVyc2lvbi5WZXJzaW9uIGFuZAogICAgICAgICAgICAgICAgIyBwa2dfcmVzb3VyY2VzLl92ZW5kb3IucGFja2FnaW5nLnZlcnNpb24uVmVyc2lvbiBhcyBkaWZmZXJlbnQKICAgICAgICAgICAgICAgICMgdHlwZXMuIFRoaXMgd2F5IHdlJ2xsIHVzZSBhIHN0ciBhcyBhIGNvbW1vbiBkYXRhIGludGVyY2hhbmdlCiAgICAgICAgICAgICAgICAjIGZvcm1hdC4gSWYgd2Ugc3RvcCB1c2luZyB0aGUgcGtnX3Jlc291cmNlcyBwcm92aWRlZCBzcGVjaWZpZXIKICAgICAgICAgICAgICAgICMgYW5kIHN0YXJ0IHVzaW5nIG91ciBvd24sIHdlIGNhbiBkcm9wIHRoZSBjYXN0IHRvIHN0cigpLgogICAgICAgICAgICAgICAgW3N0cihjLnZlcnNpb24pIGZvciBjIGluIGFsbF9jYW5kaWRhdGVzXSwKICAgICAgICAgICAgICAgIHByZXJlbGVhc2VzPSgKICAgICAgICAgICAgICAgICAgICBzZWxmLmFsbG93X2FsbF9wcmVyZWxlYXNlcwogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuYWxsb3dfYWxsX3ByZXJlbGVhc2VzIGVsc2UgTm9uZQogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKQogICAgICAgICkKICAgICAgICBhcHBsaWNhYmxlX2NhbmRpZGF0ZXMgPSBbCiAgICAgICAgICAgICMgQWdhaW4sIGNvbnZlcnRpbmcgdG8gc3RyIHRvIGRlYWwgd2l0aCBkZWJ1bmRsaW5nLgogICAgICAgICAgICBjIGZvciBjIGluIGFsbF9jYW5kaWRhdGVzIGlmIHN0cihjLnZlcnNpb24pIGluIGNvbXBhdGlibGVfdmVyc2lvbnMKICAgICAgICBdCgogICAgICAgIGlmIGFwcGxpY2FibGVfY2FuZGlkYXRlczoKICAgICAgICAgICAgYmVzdF9jYW5kaWRhdGUgPSBtYXgoYXBwbGljYWJsZV9jYW5kaWRhdGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk9c2VsZi5fY2FuZGlkYXRlX3NvcnRfa2V5KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGJlc3RfY2FuZGlkYXRlID0gTm9uZQoKICAgICAgICBpZiByZXEuc2F0aXNmaWVkX2J5IGlzIG5vdCBOb25lOgogICAgICAgICAgICBpbnN0YWxsZWRfdmVyc2lvbiA9IHBhcnNlX3ZlcnNpb24ocmVxLnNhdGlzZmllZF9ieS52ZXJzaW9uKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGluc3RhbGxlZF92ZXJzaW9uID0gTm9uZQoKICAgICAgICBpZiBpbnN0YWxsZWRfdmVyc2lvbiBpcyBOb25lIGFuZCBiZXN0X2NhbmRpZGF0ZSBpcyBOb25lOgogICAgICAgICAgICBsb2dnZXIuY3JpdGljYWwoCiAgICAgICAgICAgICAgICAnQ291bGQgbm90IGZpbmQgYSB2ZXJzaW9uIHRoYXQgc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudCAlcyAnCiAgICAgICAgICAgICAgICAnKGZyb20gdmVyc2lvbnM6ICVzKScsCiAgICAgICAgICAgICAgICByZXEsCiAgICAgICAgICAgICAgICAnLCAnLmpvaW4oCiAgICAgICAgICAgICAgICAgICAgc29ydGVkKAogICAgICAgICAgICAgICAgICAgICAgICBzZXQoc3RyKGMudmVyc2lvbikgZm9yIGMgaW4gYWxsX2NhbmRpZGF0ZXMpLAogICAgICAgICAgICAgICAgICAgICAgICBrZXk9cGFyc2VfdmVyc2lvbiwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICkKCiAgICAgICAgICAgIHJhaXNlIERpc3RyaWJ1dGlvbk5vdEZvdW5kKAogICAgICAgICAgICAgICAgJ05vIG1hdGNoaW5nIGRpc3RyaWJ1dGlvbiBmb3VuZCBmb3IgJXMnICUgcmVxCiAgICAgICAgICAgICkKCiAgICAgICAgYmVzdF9pbnN0YWxsZWQgPSBGYWxzZQogICAgICAgIGlmIGluc3RhbGxlZF92ZXJzaW9uIGFuZCAoCiAgICAgICAgICAgICAgICBiZXN0X2NhbmRpZGF0ZSBpcyBOb25lIG9yCiAgICAgICAgICAgICAgICBiZXN0X2NhbmRpZGF0ZS52ZXJzaW9uIDw9IGluc3RhbGxlZF92ZXJzaW9uKToKICAgICAgICAgICAgYmVzdF9pbnN0YWxsZWQgPSBUcnVlCgogICAgICAgIGlmIG5vdCB1cGdyYWRlIGFuZCBpbnN0YWxsZWRfdmVyc2lvbiBpcyBub3QgTm9uZToKICAgICAgICAgICAgaWYgYmVzdF9pbnN0YWxsZWQ6CiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoCiAgICAgICAgICAgICAgICAgICAgJ0V4aXN0aW5nIGluc3RhbGxlZCB2ZXJzaW9uICglcykgaXMgbW9zdCB1cC10by1kYXRlIGFuZCAnCiAgICAgICAgICAgICAgICAgICAgJ3NhdGlzZmllcyByZXF1aXJlbWVudCcsCiAgICAgICAgICAgICAgICAgICAgaW5zdGFsbGVkX3ZlcnNpb24sCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoCiAgICAgICAgICAgICAgICAgICAgJ0V4aXN0aW5nIGluc3RhbGxlZCB2ZXJzaW9uICglcykgc2F0aXNmaWVzIHJlcXVpcmVtZW50ICcKICAgICAgICAgICAgICAgICAgICAnKG1vc3QgdXAtdG8tZGF0ZSB2ZXJzaW9uIGlzICVzKScsCiAgICAgICAgICAgICAgICAgICAgaW5zdGFsbGVkX3ZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgYmVzdF9jYW5kaWRhdGUudmVyc2lvbiwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgaWYgYmVzdF9pbnN0YWxsZWQ6CiAgICAgICAgICAgICMgV2UgaGF2ZSBhbiBleGlzdGluZyB2ZXJzaW9uLCBhbmQgaXRzIHRoZSBiZXN0IHZlcnNpb24KICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKAogICAgICAgICAgICAgICAgJ0luc3RhbGxlZCB2ZXJzaW9uICglcykgaXMgbW9zdCB1cC10by1kYXRlIChwYXN0IHZlcnNpb25zOiAnCiAgICAgICAgICAgICAgICAnJXMpJywKICAgICAgICAgICAgICAgIGluc3RhbGxlZF92ZXJzaW9uLAogICAgICAgICAgICAgICAgJywgJy5qb2luKHNvcnRlZChjb21wYXRpYmxlX3ZlcnNpb25zLCBrZXk9cGFyc2VfdmVyc2lvbikpIG9yCiAgICAgICAgICAgICAgICAibm9uZSIsCiAgICAgICAgICAgICkKICAgICAgICAgICAgcmFpc2UgQmVzdFZlcnNpb25BbHJlYWR5SW5zdGFsbGVkCgogICAgICAgIGxvZ2dlci5kZWJ1ZygKICAgICAgICAgICAgJ1VzaW5nIHZlcnNpb24gJXMgKG5ld2VzdCBvZiB2ZXJzaW9uczogJXMpJywKICAgICAgICAgICAgYmVzdF9jYW5kaWRhdGUudmVyc2lvbiwKICAgICAgICAgICAgJywgJy5qb2luKHNvcnRlZChjb21wYXRpYmxlX3ZlcnNpb25zLCBrZXk9cGFyc2VfdmVyc2lvbikpCiAgICAgICAgKQogICAgICAgIHJldHVybiBiZXN0X2NhbmRpZGF0ZS5sb2NhdGlvbgoKICAgIGRlZiBfZ2V0X3BhZ2VzKHNlbGYsIGxvY2F0aW9ucywgcHJvamVjdF9uYW1lKToKICAgICAgICAiIiIKICAgICAgICBZaWVsZHMgKHBhZ2UsIHBhZ2VfdXJsKSBmcm9tIHRoZSBnaXZlbiBsb2NhdGlvbnMsIHNraXBwaW5nCiAgICAgICAgbG9jYXRpb25zIHRoYXQgaGF2ZSBlcnJvcnMuCiAgICAgICAgIiIiCiAgICAgICAgc2VlbiA9IHNldCgpCiAgICAgICAgZm9yIGxvY2F0aW9uIGluIGxvY2F0aW9uczoKICAgICAgICAgICAgaWYgbG9jYXRpb24gaW4gc2VlbjoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIHNlZW4uYWRkKGxvY2F0aW9uKQoKICAgICAgICAgICAgcGFnZSA9IHNlbGYuX2dldF9wYWdlKGxvY2F0aW9uKQogICAgICAgICAgICBpZiBwYWdlIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgeWllbGQgcGFnZQoKICAgIF9weV92ZXJzaW9uX3JlID0gcmUuY29tcGlsZShyJy1weShbMTIzXVwuP1swLTldPykkJykKCiAgICBkZWYgX3NvcnRfbGlua3Moc2VsZiwgbGlua3MpOgogICAgICAgICIiIgogICAgICAgIFJldHVybnMgZWxlbWVudHMgb2YgbGlua3MgaW4gb3JkZXIsIG5vbi1lZ2cgbGlua3MgZmlyc3QsIGVnZyBsaW5rcwogICAgICAgIHNlY29uZCwgd2hpbGUgZWxpbWluYXRpbmcgZHVwbGljYXRlcwogICAgICAgICIiIgogICAgICAgIGVnZ3MsIG5vX2VnZ3MgPSBbXSwgW10KICAgICAgICBzZWVuID0gc2V0KCkKICAgICAgICBmb3IgbGluayBpbiBsaW5rczoKICAgICAgICAgICAgaWYgbGluayBub3QgaW4gc2VlbjoKICAgICAgICAgICAgICAgIHNlZW4uYWRkKGxpbmspCiAgICAgICAgICAgICAgICBpZiBsaW5rLmVnZ19mcmFnbWVudDoKICAgICAgICAgICAgICAgICAgICBlZ2dzLmFwcGVuZChsaW5rKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBub19lZ2dzLmFwcGVuZChsaW5rKQogICAgICAgIHJldHVybiBub19lZ2dzICsgZWdncwoKICAgIGRlZiBfcGFja2FnZV92ZXJzaW9ucyhzZWxmLCBsaW5rcywgc2VhcmNoKToKICAgICAgICByZXN1bHQgPSBbXQogICAgICAgIGZvciBsaW5rIGluIHNlbGYuX3NvcnRfbGlua3MobGlua3MpOgogICAgICAgICAgICB2ID0gc2VsZi5fbGlua19wYWNrYWdlX3ZlcnNpb25zKGxpbmssIHNlYXJjaCkKICAgICAgICAgICAgaWYgdiBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQodikKICAgICAgICByZXR1cm4gcmVzdWx0CgogICAgZGVmIF9sb2dfc2tpcHBlZF9saW5rKHNlbGYsIGxpbmssIHJlYXNvbik6CiAgICAgICAgaWYgbGluayBub3QgaW4gc2VsZi5sb2dnZWRfbGlua3M6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnU2tpcHBpbmcgbGluayAlczsgJXMnLCBsaW5rLCByZWFzb24pCiAgICAgICAgICAgIHNlbGYubG9nZ2VkX2xpbmtzLmFkZChsaW5rKQoKICAgIGRlZiBfbGlua19wYWNrYWdlX3ZlcnNpb25zKHNlbGYsIGxpbmssIHNlYXJjaCk6CiAgICAgICAgIiIiUmV0dXJuIGFuIEluc3RhbGxhdGlvbkNhbmRpZGF0ZSBvciBOb25lIiIiCiAgICAgICAgdmVyc2lvbiA9IE5vbmUKICAgICAgICBpZiBsaW5rLmVnZ19mcmFnbWVudDoKICAgICAgICAgICAgZWdnX2luZm8gPSBsaW5rLmVnZ19mcmFnbWVudAogICAgICAgICAgICBleHQgPSBsaW5rLmV4dAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGVnZ19pbmZvLCBleHQgPSBsaW5rLnNwbGl0ZXh0KCkKICAgICAgICAgICAgaWYgbm90IGV4dDoKICAgICAgICAgICAgICAgIHNlbGYuX2xvZ19za2lwcGVkX2xpbmsobGluaywgJ25vdCBhIGZpbGUnKQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIGlmIGV4dCBub3QgaW4gU1VQUE9SVEVEX0VYVEVOU0lPTlM6CiAgICAgICAgICAgICAgICBzZWxmLl9sb2dfc2tpcHBlZF9saW5rKAogICAgICAgICAgICAgICAgICAgIGxpbmssICd1bnN1cHBvcnRlZCBhcmNoaXZlIGZvcm1hdDogJXMnICUgZXh0KQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIGlmICJiaW5hcnkiIG5vdCBpbiBzZWFyY2guZm9ybWF0cyBhbmQgZXh0ID09IHdoZWVsX2V4dDoKICAgICAgICAgICAgICAgIHNlbGYuX2xvZ19za2lwcGVkX2xpbmsoCiAgICAgICAgICAgICAgICAgICAgbGluaywgJ05vIGJpbmFyaWVzIHBlcm1pdHRlZCBmb3IgJXMnICUgc2VhcmNoLnN1cHBsaWVkKQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIGlmICJtYWNvc3gxMCIgaW4gbGluay5wYXRoIGFuZCBleHQgPT0gJy56aXAnOgogICAgICAgICAgICAgICAgc2VsZi5fbG9nX3NraXBwZWRfbGluayhsaW5rLCAnbWFjb3N4MTAgb25lJykKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBpZiBleHQgPT0gd2hlZWxfZXh0OgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHdoZWVsID0gV2hlZWwobGluay5maWxlbmFtZSkKICAgICAgICAgICAgICAgIGV4Y2VwdCBJbnZhbGlkV2hlZWxGaWxlbmFtZToKICAgICAgICAgICAgICAgICAgICBzZWxmLl9sb2dfc2tpcHBlZF9saW5rKGxpbmssICdpbnZhbGlkIHdoZWVsIGZpbGVuYW1lJykKICAgICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICAgIGlmIGNhbm9uaWNhbGl6ZV9uYW1lKHdoZWVsLm5hbWUpICE9IHNlYXJjaC5jYW5vbmljYWw6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fbG9nX3NraXBwZWRfbGluaygKICAgICAgICAgICAgICAgICAgICAgICAgbGluaywgJ3dyb25nIHByb2plY3QgbmFtZSAobm90ICVzKScgJSBzZWFyY2guc3VwcGxpZWQpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICAgICAgICAgaWYgbm90IHdoZWVsLnN1cHBvcnRlZChzZWxmLnZhbGlkX3RhZ3MpOgogICAgICAgICAgICAgICAgICAgIHNlbGYuX2xvZ19za2lwcGVkX2xpbmsoCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmssICdpdCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoaXMgUHl0aG9uJykKICAgICAgICAgICAgICAgICAgICByZXR1cm4KCiAgICAgICAgICAgICAgICB2ZXJzaW9uID0gd2hlZWwudmVyc2lvbgoKICAgICAgICAjIFRoaXMgc2hvdWxkIGJlIHVwIGJ5IHRoZSBzZWFyY2gub2tfYmluYXJ5IGNoZWNrLCBidXQgc2VlIGlzc3VlIDI3MDAuCiAgICAgICAgaWYgInNvdXJjZSIgbm90IGluIHNlYXJjaC5mb3JtYXRzIGFuZCBleHQgIT0gd2hlZWxfZXh0OgogICAgICAgICAgICBzZWxmLl9sb2dfc2tpcHBlZF9saW5rKAogICAgICAgICAgICAgICAgbGluaywgJ05vIHNvdXJjZXMgcGVybWl0dGVkIGZvciAlcycgJSBzZWFyY2guc3VwcGxpZWQpCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBpZiBub3QgdmVyc2lvbjoKICAgICAgICAgICAgdmVyc2lvbiA9IGVnZ19pbmZvX21hdGNoZXMoZWdnX2luZm8sIHNlYXJjaC5zdXBwbGllZCwgbGluaykKICAgICAgICBpZiB2ZXJzaW9uIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYuX2xvZ19za2lwcGVkX2xpbmsoCiAgICAgICAgICAgICAgICBsaW5rLCAnd3JvbmcgcHJvamVjdCBuYW1lIChub3QgJXMpJyAlIHNlYXJjaC5zdXBwbGllZCkKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIG1hdGNoID0gc2VsZi5fcHlfdmVyc2lvbl9yZS5zZWFyY2godmVyc2lvbikKICAgICAgICBpZiBtYXRjaDoKICAgICAgICAgICAgdmVyc2lvbiA9IHZlcnNpb25bOm1hdGNoLnN0YXJ0KCldCiAgICAgICAgICAgIHB5X3ZlcnNpb24gPSBtYXRjaC5ncm91cCgxKQogICAgICAgICAgICBpZiBweV92ZXJzaW9uICE9IHN5cy52ZXJzaW9uWzozXToKICAgICAgICAgICAgICAgIHNlbGYuX2xvZ19za2lwcGVkX2xpbmsoCiAgICAgICAgICAgICAgICAgICAgbGluaywgJ1B5dGhvbiB2ZXJzaW9uIGlzIGluY29ycmVjdCcpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICB0cnk6CiAgICAgICAgICAgIHN1cHBvcnRfdGhpc19weXRob24gPSBjaGVja19yZXF1aXJlc19weXRob24obGluay5yZXF1aXJlc19weXRob24pCiAgICAgICAgZXhjZXB0IHNwZWNpZmllcnMuSW52YWxpZFNwZWNpZmllcjoKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJQYWNrYWdlICVzIGhhcyBhbiBpbnZhbGlkIFJlcXVpcmVzLVB5dGhvbiBlbnRyeTogJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgbGluay5maWxlbmFtZSwgbGluay5yZXF1aXJlc19weXRob24pCiAgICAgICAgICAgIHN1cHBvcnRfdGhpc19weXRob24gPSBUcnVlCgogICAgICAgIGlmIG5vdCBzdXBwb3J0X3RoaXNfcHl0aG9uOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoIlRoZSBwYWNrYWdlICVzIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSBweXRob24iCiAgICAgICAgICAgICAgICAgICAgICAgICAidmVyc2lvbiBpbiB1c2UuIEFjY2VwdGFibGUgcHl0aG9uIHZlcnNpb25zIGFyZTolcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rLCBsaW5rLnJlcXVpcmVzX3B5dGhvbikKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgbG9nZ2VyLmRlYnVnKCdGb3VuZCBsaW5rICVzLCB2ZXJzaW9uOiAlcycsIGxpbmssIHZlcnNpb24pCgogICAgICAgIHJldHVybiBJbnN0YWxsYXRpb25DYW5kaWRhdGUoc2VhcmNoLnN1cHBsaWVkLCB2ZXJzaW9uLCBsaW5rKQoKICAgIGRlZiBfZ2V0X3BhZ2Uoc2VsZiwgbGluayk6CiAgICAgICAgcmV0dXJuIEhUTUxQYWdlLmdldF9wYWdlKGxpbmssIHNlc3Npb249c2VsZi5zZXNzaW9uKQoKCmRlZiBlZ2dfaW5mb19tYXRjaGVzKAogICAgICAgIGVnZ19pbmZvLCBzZWFyY2hfbmFtZSwgbGluaywKICAgICAgICBfZWdnX2luZm9fcmU9cmUuY29tcGlsZShyJyhbYS16MC05Xy5dKyktKFthLXowLTlfLiErLV0rKScsIHJlLkkpKToKICAgICIiIlB1bGwgdGhlIHZlcnNpb24gcGFydCBvdXQgb2YgYSBzdHJpbmcuCgogICAgOnBhcmFtIGVnZ19pbmZvOiBUaGUgc3RyaW5nIHRvIHBhcnNlLiBFLmcuIGZvby0yLjEKICAgIDpwYXJhbSBzZWFyY2hfbmFtZTogVGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgdGhpcyBiZWxvbmdzIHRvLiBOb25lIHRvCiAgICAgICAgaW5mZXIgdGhlIG5hbWUuIE5vdGUgdGhhdCB0aGlzIGNhbm5vdCB1bmFtYmlndW91c2x5IHBhcnNlIHN0cmluZ3MKICAgICAgICBsaWtlIGZvby0yLTIgd2hpY2ggbWlnaHQgYmUgZm9vLCAyLTIgb3IgZm9vLTIsIDIuCiAgICA6cGFyYW0gbGluazogVGhlIGxpbmsgdGhlIHN0cmluZyBjYW1lIGZyb20sIGZvciBsb2dnaW5nIG9uIGZhaWx1cmUuCiAgICAiIiIKICAgIG1hdGNoID0gX2VnZ19pbmZvX3JlLnNlYXJjaChlZ2dfaW5mbykKICAgIGlmIG5vdCBtYXRjaDoKICAgICAgICBsb2dnZXIuZGVidWcoJ0NvdWxkIG5vdCBwYXJzZSB2ZXJzaW9uIGZyb20gbGluazogJXMnLCBsaW5rKQogICAgICAgIHJldHVybiBOb25lCiAgICBpZiBzZWFyY2hfbmFtZSBpcyBOb25lOgogICAgICAgIGZ1bGxfbWF0Y2ggPSBtYXRjaC5ncm91cCgwKQogICAgICAgIHJldHVybiBmdWxsX21hdGNoW2Z1bGxfbWF0Y2guaW5kZXgoJy0nKTpdCiAgICBuYW1lID0gbWF0Y2guZ3JvdXAoMCkubG93ZXIoKQogICAgIyBUbyBtYXRjaCB0aGUgInNhZmUiIG5hbWUgdGhhdCBwa2dfcmVzb3VyY2VzIGNyZWF0ZXM6CiAgICBuYW1lID0gbmFtZS5yZXBsYWNlKCdfJywgJy0nKQogICAgIyBwcm9qZWN0IG5hbWUgYW5kIHZlcnNpb24gbXVzdCBiZSBzZXBhcmF0ZWQgYnkgYSBkYXNoCiAgICBsb29rX2ZvciA9IHNlYXJjaF9uYW1lLmxvd2VyKCkgKyAiLSIKICAgIGlmIG5hbWUuc3RhcnRzd2l0aChsb29rX2Zvcik6CiAgICAgICAgcmV0dXJuIG1hdGNoLmdyb3VwKDApW2xlbihsb29rX2Zvcik6XQogICAgZWxzZToKICAgICAgICByZXR1cm4gTm9uZQoKCmNsYXNzIEhUTUxQYWdlKG9iamVjdCk6CiAgICAiIiJSZXByZXNlbnRzIG9uZSBwYWdlLCBhbG9uZyB3aXRoIGl0cyBVUkwiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgY29udGVudCwgdXJsLCBoZWFkZXJzPU5vbmUpOgogICAgICAgICMgRGV0ZXJtaW5lIGlmIHdlIGhhdmUgYW55IGVuY29kaW5nIGluZm9ybWF0aW9uIGluIG91ciBoZWFkZXJzCiAgICAgICAgZW5jb2RpbmcgPSBOb25lCiAgICAgICAgaWYgaGVhZGVycyBhbmQgIkNvbnRlbnQtVHlwZSIgaW4gaGVhZGVyczoKICAgICAgICAgICAgY29udGVudF90eXBlLCBwYXJhbXMgPSBjZ2kucGFyc2VfaGVhZGVyKGhlYWRlcnNbIkNvbnRlbnQtVHlwZSJdKQoKICAgICAgICAgICAgaWYgImNoYXJzZXQiIGluIHBhcmFtczoKICAgICAgICAgICAgICAgIGVuY29kaW5nID0gcGFyYW1zWydjaGFyc2V0J10KCiAgICAgICAgc2VsZi5jb250ZW50ID0gY29udGVudAogICAgICAgIHNlbGYucGFyc2VkID0gaHRtbDVsaWIucGFyc2UoCiAgICAgICAgICAgIHNlbGYuY29udGVudCwKICAgICAgICAgICAgdHJhbnNwb3J0X2VuY29kaW5nPWVuY29kaW5nLAogICAgICAgICAgICBuYW1lc3BhY2VIVE1MRWxlbWVudHM9RmFsc2UsCiAgICAgICAgKQogICAgICAgIHNlbGYudXJsID0gdXJsCiAgICAgICAgc2VsZi5oZWFkZXJzID0gaGVhZGVycwoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnVybAoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGdldF9wYWdlKGNscywgbGluaywgc2tpcF9hcmNoaXZlcz1UcnVlLCBzZXNzaW9uPU5vbmUpOgogICAgICAgIGlmIHNlc3Npb24gaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKAogICAgICAgICAgICAgICAgImdldF9wYWdlKCkgbWlzc2luZyAxIHJlcXVpcmVkIGtleXdvcmQgYXJndW1lbnQ6ICdzZXNzaW9uJyIKICAgICAgICAgICAgKQoKICAgICAgICB1cmwgPSBsaW5rLnVybAogICAgICAgIHVybCA9IHVybC5zcGxpdCgnIycsIDEpWzBdCgogICAgICAgICMgQ2hlY2sgZm9yIFZDUyBzY2hlbWVzIHRoYXQgZG8gbm90IHN1cHBvcnQgbG9va3VwIGFzIHdlYiBwYWdlcy4KICAgICAgICBmcm9tIHBpcC52Y3MgaW1wb3J0IFZjc1N1cHBvcnQKICAgICAgICBmb3Igc2NoZW1lIGluIFZjc1N1cHBvcnQuc2NoZW1lczoKICAgICAgICAgICAgaWYgdXJsLmxvd2VyKCkuc3RhcnRzd2l0aChzY2hlbWUpIGFuZCB1cmxbbGVuKHNjaGVtZSldIGluICcrOic6CiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0Nhbm5vdCBsb29rIGF0ICVzIFVSTCAlcycsIHNjaGVtZSwgbGluaykKICAgICAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgIHRyeToKICAgICAgICAgICAgaWYgc2tpcF9hcmNoaXZlczoKICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gbGluay5maWxlbmFtZQogICAgICAgICAgICAgICAgZm9yIGJhZF9leHQgaW4gQVJDSElWRV9FWFRFTlNJT05TOgogICAgICAgICAgICAgICAgICAgIGlmIGZpbGVuYW1lLmVuZHN3aXRoKGJhZF9leHQpOgogICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50X3R5cGUgPSBjbHMuX2dldF9jb250ZW50X3R5cGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmwsIHNlc3Npb249c2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBjb250ZW50X3R5cGUubG93ZXIoKS5zdGFydHN3aXRoKCd0ZXh0L2h0bWwnKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NraXBwaW5nIHBhZ2UgJXMgYmVjYXVzZSBvZiBDb250ZW50LVR5cGU6ICVzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgoKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdHZXR0aW5nIHBhZ2UgJXMnLCB1cmwpCgogICAgICAgICAgICAjIFRhY2sgaW5kZXguaHRtbCBvbnRvIGZpbGU6Ly8gVVJMcyB0aGF0IHBvaW50IHRvIGRpcmVjdG9yaWVzCiAgICAgICAgICAgIChzY2hlbWUsIG5ldGxvYywgcGF0aCwgcGFyYW1zLCBxdWVyeSwgZnJhZ21lbnQpID0gXAogICAgICAgICAgICAgICAgdXJsbGliX3BhcnNlLnVybHBhcnNlKHVybCkKICAgICAgICAgICAgaWYgKHNjaGVtZSA9PSAnZmlsZScgYW5kCiAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5pc2Rpcih1cmxsaWJfcmVxdWVzdC51cmwycGF0aG5hbWUocGF0aCkpKToKICAgICAgICAgICAgICAgICMgYWRkIHRyYWlsaW5nIHNsYXNoIGlmIG5vdCBwcmVzZW50IHNvIHVybGpvaW4gZG9lc24ndCB0cmltCiAgICAgICAgICAgICAgICAjIGZpbmFsIHNlZ21lbnQKICAgICAgICAgICAgICAgIGlmIG5vdCB1cmwuZW5kc3dpdGgoJy8nKToKICAgICAgICAgICAgICAgICAgICB1cmwgKz0gJy8nCiAgICAgICAgICAgICAgICB1cmwgPSB1cmxsaWJfcGFyc2UudXJsam9pbih1cmwsICdpbmRleC5odG1sJykKICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnIGZpbGU6IFVSTCBpcyBkaXJlY3RvcnksIGdldHRpbmcgJXMnLCB1cmwpCgogICAgICAgICAgICByZXNwID0gc2Vzc2lvbi5nZXQoCiAgICAgICAgICAgICAgICB1cmwsCiAgICAgICAgICAgICAgICBoZWFkZXJzPXsKICAgICAgICAgICAgICAgICAgICAiQWNjZXB0IjogInRleHQvaHRtbCIsCiAgICAgICAgICAgICAgICAgICAgIkNhY2hlLUNvbnRyb2wiOiAibWF4LWFnZT02MDAiLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKQogICAgICAgICAgICByZXNwLnJhaXNlX2Zvcl9zdGF0dXMoKQoKICAgICAgICAgICAgIyBUaGUgY2hlY2sgZm9yIGFyY2hpdmVzIGFib3ZlIG9ubHkgd29ya3MgaWYgdGhlIHVybCBlbmRzIHdpdGgKICAgICAgICAgICAgIyBzb21ldGhpbmcgdGhhdCBsb29rcyBsaWtlIGFuIGFyY2hpdmUuIEhvd2V2ZXIgdGhhdCBpcyBub3QgYQogICAgICAgICAgICAjIHJlcXVpcmVtZW50IG9mIGFuIHVybC4gVW5sZXNzIHdlIGlzc3VlIGEgSEVBRCByZXF1ZXN0IG9uIGV2ZXJ5CiAgICAgICAgICAgICMgdXJsIHdlIGNhbm5vdCBrbm93IGFoZWFkIG9mIHRpbWUgZm9yIHN1cmUgaWYgc29tZXRoaW5nIGlzIEhUTUwKICAgICAgICAgICAgIyBvciBub3QuIEhvd2V2ZXIgd2UgY2FuIGNoZWNrIGFmdGVyIHdlJ3ZlIGRvd25sb2FkZWQgaXQuCiAgICAgICAgICAgIGNvbnRlbnRfdHlwZSA9IHJlc3AuaGVhZGVycy5nZXQoJ0NvbnRlbnQtVHlwZScsICd1bmtub3duJykKICAgICAgICAgICAgaWYgbm90IGNvbnRlbnRfdHlwZS5sb3dlcigpLnN0YXJ0c3dpdGgoInRleHQvaHRtbCIpOgogICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKAogICAgICAgICAgICAgICAgICAgICdTa2lwcGluZyBwYWdlICVzIGJlY2F1c2Ugb2YgQ29udGVudC1UeXBlOiAlcycsCiAgICAgICAgICAgICAgICAgICAgbGluaywKICAgICAgICAgICAgICAgICAgICBjb250ZW50X3R5cGUsCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICByZXR1cm4KCiAgICAgICAgICAgIGluc3QgPSBjbHMocmVzcC5jb250ZW50LCByZXNwLnVybCwgcmVzcC5oZWFkZXJzKQogICAgICAgIGV4Y2VwdCByZXF1ZXN0cy5IVFRQRXJyb3IgYXMgZXhjOgogICAgICAgICAgICBjbHMuX2hhbmRsZV9mYWlsKGxpbmssIGV4YywgdXJsKQogICAgICAgIGV4Y2VwdCBTU0xFcnJvciBhcyBleGM6CiAgICAgICAgICAgIHJlYXNvbiA9ICgiVGhlcmUgd2FzIGEgcHJvYmxlbSBjb25maXJtaW5nIHRoZSBzc2wgY2VydGlmaWNhdGU6ICIKICAgICAgICAgICAgICAgICAgICAgICIlcyIgJSBleGMpCiAgICAgICAgICAgIGNscy5faGFuZGxlX2ZhaWwobGluaywgcmVhc29uLCB1cmwsIG1ldGg9bG9nZ2VyLmluZm8pCiAgICAgICAgZXhjZXB0IHJlcXVlc3RzLkNvbm5lY3Rpb25FcnJvciBhcyBleGM6CiAgICAgICAgICAgIGNscy5faGFuZGxlX2ZhaWwobGluaywgImNvbm5lY3Rpb24gZXJyb3I6ICVzIiAlIGV4YywgdXJsKQogICAgICAgIGV4Y2VwdCByZXF1ZXN0cy5UaW1lb3V0OgogICAgICAgICAgICBjbHMuX2hhbmRsZV9mYWlsKGxpbmssICJ0aW1lZCBvdXQiLCB1cmwpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIGluc3QKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2hhbmRsZV9mYWlsKGxpbmssIHJlYXNvbiwgdXJsLCBtZXRoPU5vbmUpOgogICAgICAgIGlmIG1ldGggaXMgTm9uZToKICAgICAgICAgICAgbWV0aCA9IGxvZ2dlci5kZWJ1ZwoKICAgICAgICBtZXRoKCJDb3VsZCBub3QgZmV0Y2ggVVJMICVzOiAlcyAtIHNraXBwaW5nIiwgbGluaywgcmVhc29uKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfZ2V0X2NvbnRlbnRfdHlwZSh1cmwsIHNlc3Npb24pOgogICAgICAgICIiIkdldCB0aGUgQ29udGVudC1UeXBlIG9mIHRoZSBnaXZlbiB1cmwsIHVzaW5nIGEgSEVBRCByZXF1ZXN0IiIiCiAgICAgICAgc2NoZW1lLCBuZXRsb2MsIHBhdGgsIHF1ZXJ5LCBmcmFnbWVudCA9IHVybGxpYl9wYXJzZS51cmxzcGxpdCh1cmwpCiAgICAgICAgaWYgc2NoZW1lIG5vdCBpbiAoJ2h0dHAnLCAnaHR0cHMnKToKICAgICAgICAgICAgIyBGSVhNRTogc29tZSB3YXJuaW5nIG9yIHNvbWV0aGluZz8KICAgICAgICAgICAgIyBhc3NlcnRpb24gZXJyb3I/CiAgICAgICAgICAgIHJldHVybiAnJwoKICAgICAgICByZXNwID0gc2Vzc2lvbi5oZWFkKHVybCwgYWxsb3dfcmVkaXJlY3RzPVRydWUpCiAgICAgICAgcmVzcC5yYWlzZV9mb3Jfc3RhdHVzKCkKCiAgICAgICAgcmV0dXJuIHJlc3AuaGVhZGVycy5nZXQoIkNvbnRlbnQtVHlwZSIsICIiKQoKICAgIEBjYWNoZWRfcHJvcGVydHkKICAgIGRlZiBiYXNlX3VybChzZWxmKToKICAgICAgICBiYXNlcyA9IFsKICAgICAgICAgICAgeCBmb3IgeCBpbiBzZWxmLnBhcnNlZC5maW5kYWxsKCIuLy9iYXNlIikKICAgICAgICAgICAgaWYgeC5nZXQoImhyZWYiKSBpcyBub3QgTm9uZQogICAgICAgIF0KICAgICAgICBpZiBiYXNlcyBhbmQgYmFzZXNbMF0uZ2V0KCJocmVmIik6CiAgICAgICAgICAgIHJldHVybiBiYXNlc1swXS5nZXQoImhyZWYiKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnVybAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGxpbmtzKHNlbGYpOgogICAgICAgICIiIllpZWxkcyBhbGwgbGlua3MgaW4gdGhlIHBhZ2UiIiIKICAgICAgICBmb3IgYW5jaG9yIGluIHNlbGYucGFyc2VkLmZpbmRhbGwoIi4vL2EiKToKICAgICAgICAgICAgaWYgYW5jaG9yLmdldCgiaHJlZiIpOgogICAgICAgICAgICAgICAgaHJlZiA9IGFuY2hvci5nZXQoImhyZWYiKQogICAgICAgICAgICAgICAgdXJsID0gc2VsZi5jbGVhbl9saW5rKAogICAgICAgICAgICAgICAgICAgIHVybGxpYl9wYXJzZS51cmxqb2luKHNlbGYuYmFzZV91cmwsIGhyZWYpCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBweXJlcXVpcmUgPSBhbmNob3IuZ2V0KCdkYXRhLXJlcXVpcmVzLXB5dGhvbicpCiAgICAgICAgICAgICAgICBweXJlcXVpcmUgPSB1bmVzY2FwZShweXJlcXVpcmUpIGlmIHB5cmVxdWlyZSBlbHNlIE5vbmUKICAgICAgICAgICAgICAgIHlpZWxkIExpbmsodXJsLCBzZWxmLCByZXF1aXJlc19weXRob249cHlyZXF1aXJlKQoKICAgIF9jbGVhbl9yZSA9IHJlLmNvbXBpbGUocidbXmEtejAtOSQmKywvOjs9P0AuIyVfXFx8LV0nLCByZS5JKQoKICAgIGRlZiBjbGVhbl9saW5rKHNlbGYsIHVybCk6CiAgICAgICAgIiIiTWFrZXMgc3VyZSBhIGxpbmsgaXMgZnVsbHkgZW5jb2RlZC4gIFRoYXQgaXMsIGlmIGEgJyAnIHNob3dzIHVwIGluCiAgICAgICAgdGhlIGxpbmssIGl0IHdpbGwgYmUgcmV3cml0dGVuIHRvICUyMCAod2hpbGUgbm90IG92ZXItcXVvdGluZwogICAgICAgICUgb3Igb3RoZXIgY2hhcmFjdGVycykuIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuX2NsZWFuX3JlLnN1YigKICAgICAgICAgICAgbGFtYmRhIG1hdGNoOiAnJSUlMngnICUgb3JkKG1hdGNoLmdyb3VwKDApKSwgdXJsKQoKCmNsYXNzIExpbmsob2JqZWN0KToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgdXJsLCBjb21lc19mcm9tPU5vbmUsIHJlcXVpcmVzX3B5dGhvbj1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBPYmplY3QgcmVwcmVzZW50aW5nIGEgcGFyc2VkIGxpbmsgZnJvbSBodHRwczovL3B5cGkucHl0aG9uLm9yZy9zaW1wbGUvKgoKICAgICAgICB1cmw6CiAgICAgICAgICAgIHVybCBvZiB0aGUgcmVzb3VyY2UgcG9pbnRlZCB0byAoaHJlZiBvZiB0aGUgbGluaykKICAgICAgICBjb21lc19mcm9tOgogICAgICAgICAgICBpbnN0YW5jZSBvZiBIVE1MUGFnZSB3aGVyZSB0aGUgbGluayB3YXMgZm91bmQsIG9yIHN0cmluZy4KICAgICAgICByZXF1aXJlc19weXRob246CiAgICAgICAgICAgIFN0cmluZyBjb250YWluaW5nIHRoZSBgUmVxdWlyZXMtUHl0aG9uYCBtZXRhZGF0YSBmaWVsZCwgc3BlY2lmaWVkCiAgICAgICAgICAgIGluIFBFUCAzNDUuIFRoaXMgbWF5IGJlIHNwZWNpZmllZCBieSBhIGRhdGEtcmVxdWlyZXMtcHl0aG9uCiAgICAgICAgICAgIGF0dHJpYnV0ZSBpbiB0aGUgSFRNTCBsaW5rIHRhZywgYXMgZGVzY3JpYmVkIGluIFBFUCA1MDMuCiAgICAgICAgIiIiCgogICAgICAgICMgdXJsIGNhbiBiZSBhIFVOQyB3aW5kb3dzIHNoYXJlCiAgICAgICAgaWYgdXJsLnN0YXJ0c3dpdGgoJ1xcXFwnKToKICAgICAgICAgICAgdXJsID0gcGF0aF90b191cmwodXJsKQoKICAgICAgICBzZWxmLnVybCA9IHVybAogICAgICAgIHNlbGYuY29tZXNfZnJvbSA9IGNvbWVzX2Zyb20KICAgICAgICBzZWxmLnJlcXVpcmVzX3B5dGhvbiA9IHJlcXVpcmVzX3B5dGhvbiBpZiByZXF1aXJlc19weXRob24gZWxzZSBOb25lCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgaWYgc2VsZi5yZXF1aXJlc19weXRob246CiAgICAgICAgICAgIHJwID0gJyAocmVxdWlyZXMtcHl0aG9uOiVzKScgJSBzZWxmLnJlcXVpcmVzX3B5dGhvbgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJwID0gJycKICAgICAgICBpZiBzZWxmLmNvbWVzX2Zyb206CiAgICAgICAgICAgIHJldHVybiAnJXMgKGZyb20gJXMpJXMnICUgKHNlbGYudXJsLCBzZWxmLmNvbWVzX2Zyb20sIHJwKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzdHIoc2VsZi51cmwpCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAnPExpbmsgJXM+JyAlIHNlbGYKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgTGluayk6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogICAgICAgIHJldHVybiBzZWxmLnVybCA9PSBvdGhlci51cmwKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgTGluayk6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogICAgICAgIHJldHVybiBzZWxmLnVybCAhPSBvdGhlci51cmwKCiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgTGluayk6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAogICAgICAgIHJldHVybiBzZWxmLnVybCA8IG90aGVyLnVybAoKICAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBMaW5rKToKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCiAgICAgICAgcmV0dXJuIHNlbGYudXJsIDw9IG90aGVyLnVybAoKICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBMaW5rKToKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCiAgICAgICAgcmV0dXJuIHNlbGYudXJsID4gb3RoZXIudXJsCgogICAgZGVmIF9fZ2VfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIExpbmspOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKICAgICAgICByZXR1cm4gc2VsZi51cmwgPj0gb3RoZXIudXJsCgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBoYXNoKHNlbGYudXJsKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGZpbGVuYW1lKHNlbGYpOgogICAgICAgIF8sIG5ldGxvYywgcGF0aCwgXywgXyA9IHVybGxpYl9wYXJzZS51cmxzcGxpdChzZWxmLnVybCkKICAgICAgICBuYW1lID0gcG9zaXhwYXRoLmJhc2VuYW1lKHBhdGgucnN0cmlwKCcvJykpIG9yIG5ldGxvYwogICAgICAgIG5hbWUgPSB1cmxsaWJfcGFyc2UudW5xdW90ZShuYW1lKQogICAgICAgIGFzc2VydCBuYW1lLCAoJ1VSTCAlciBwcm9kdWNlZCBubyBmaWxlbmFtZScgJSBzZWxmLnVybCkKICAgICAgICByZXR1cm4gbmFtZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHNjaGVtZShzZWxmKToKICAgICAgICByZXR1cm4gdXJsbGliX3BhcnNlLnVybHNwbGl0KHNlbGYudXJsKVswXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIG5ldGxvYyhzZWxmKToKICAgICAgICByZXR1cm4gdXJsbGliX3BhcnNlLnVybHNwbGl0KHNlbGYudXJsKVsxXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHBhdGgoc2VsZik6CiAgICAgICAgcmV0dXJuIHVybGxpYl9wYXJzZS51bnF1b3RlKHVybGxpYl9wYXJzZS51cmxzcGxpdChzZWxmLnVybClbMl0pCgogICAgZGVmIHNwbGl0ZXh0KHNlbGYpOgogICAgICAgIHJldHVybiBzcGxpdGV4dChwb3NpeHBhdGguYmFzZW5hbWUoc2VsZi5wYXRoLnJzdHJpcCgnLycpKSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBleHQoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuc3BsaXRleHQoKVsxXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHVybF93aXRob3V0X2ZyYWdtZW50KHNlbGYpOgogICAgICAgIHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBxdWVyeSwgZnJhZ21lbnQgPSB1cmxsaWJfcGFyc2UudXJsc3BsaXQoc2VsZi51cmwpCiAgICAgICAgcmV0dXJuIHVybGxpYl9wYXJzZS51cmx1bnNwbGl0KChzY2hlbWUsIG5ldGxvYywgcGF0aCwgcXVlcnksIE5vbmUpKQoKICAgIF9lZ2dfZnJhZ21lbnRfcmUgPSByZS5jb21waWxlKHInWyMmXWVnZz0oW14mXSopJykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBlZ2dfZnJhZ21lbnQoc2VsZik6CiAgICAgICAgbWF0Y2ggPSBzZWxmLl9lZ2dfZnJhZ21lbnRfcmUuc2VhcmNoKHNlbGYudXJsKQogICAgICAgIGlmIG5vdCBtYXRjaDoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICByZXR1cm4gbWF0Y2guZ3JvdXAoMSkKCiAgICBfc3ViZGlyZWN0b3J5X2ZyYWdtZW50X3JlID0gcmUuY29tcGlsZShyJ1sjJl1zdWJkaXJlY3Rvcnk9KFteJl0qKScpCgogICAgQHByb3BlcnR5CiAgICBkZWYgc3ViZGlyZWN0b3J5X2ZyYWdtZW50KHNlbGYpOgogICAgICAgIG1hdGNoID0gc2VsZi5fc3ViZGlyZWN0b3J5X2ZyYWdtZW50X3JlLnNlYXJjaChzZWxmLnVybCkKICAgICAgICBpZiBub3QgbWF0Y2g6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcmV0dXJuIG1hdGNoLmdyb3VwKDEpCgogICAgX2hhc2hfcmUgPSByZS5jb21waWxlKAogICAgICAgIHInKHNoYTF8c2hhMjI0fHNoYTM4NHxzaGEyNTZ8c2hhNTEyfG1kNSk9KFthLWYwLTldKyknCiAgICApCgogICAgQHByb3BlcnR5CiAgICBkZWYgaGFzaChzZWxmKToKICAgICAgICBtYXRjaCA9IHNlbGYuX2hhc2hfcmUuc2VhcmNoKHNlbGYudXJsKQogICAgICAgIGlmIG1hdGNoOgogICAgICAgICAgICByZXR1cm4gbWF0Y2guZ3JvdXAoMikKICAgICAgICByZXR1cm4gTm9uZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGhhc2hfbmFtZShzZWxmKToKICAgICAgICBtYXRjaCA9IHNlbGYuX2hhc2hfcmUuc2VhcmNoKHNlbGYudXJsKQogICAgICAgIGlmIG1hdGNoOgogICAgICAgICAgICByZXR1cm4gbWF0Y2guZ3JvdXAoMSkKICAgICAgICByZXR1cm4gTm9uZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHNob3dfdXJsKHNlbGYpOgogICAgICAgIHJldHVybiBwb3NpeHBhdGguYmFzZW5hbWUoc2VsZi51cmwuc3BsaXQoJyMnLCAxKVswXS5zcGxpdCgnPycsIDEpWzBdKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX3doZWVsKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmV4dCA9PSB3aGVlbF9leHQKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc19hcnRpZmFjdChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBEZXRlcm1pbmVzIGlmIHRoaXMgcG9pbnRzIHRvIGFuIGFjdHVhbCBhcnRpZmFjdCAoZS5nLiBhIHRhcmJhbGwpIG9yIGlmCiAgICAgICAgaXQgcG9pbnRzIHRvIGFuICJhYnN0cmFjdCIgdGhpbmcgbGlrZSBhIHBhdGggb3IgYSBWQ1MgbG9jYXRpb24uCiAgICAgICAgIiIiCiAgICAgICAgZnJvbSBwaXAudmNzIGltcG9ydCB2Y3MKCiAgICAgICAgaWYgc2VsZi5zY2hlbWUgaW4gdmNzLmFsbF9zY2hlbWVzOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgcmV0dXJuIFRydWUKCgpGb3JtYXRDb250cm9sID0gbmFtZWR0dXBsZSgnRm9ybWF0Q29udHJvbCcsICdub19iaW5hcnkgb25seV9iaW5hcnknKQoiIiJUaGlzIG9iamVjdCBoYXMgdHdvIGZpZWxkcywgbm9fYmluYXJ5IGFuZCBvbmx5X2JpbmFyeS4KCklmIGEgZmllbGQgaXMgZmFsc3ksIGl0IGlzbid0IHNldC4gSWYgaXQgaXMgeyc6YWxsOid9LCBpdCBzaG91bGQgbWF0Y2ggYWxsCnBhY2thZ2VzIGV4Y2VwdCB0aG9zZSBsaXN0ZWQgaW4gdGhlIG90aGVyIGZpZWxkLiBPbmx5IG9uZSBmaWVsZCBjYW4gYmUgc2V0CnRvIHsnOmFsbDonfSBhdCBhIHRpbWUuIFRoZSByZXN0IG9mIHRoZSB0aW1lIGV4YWN0IHBhY2thZ2UgbmFtZSBtYXRjaGVzCmFyZSBsaXN0ZWQsIHdpdGggYW55IGdpdmVuIHBhY2thZ2Ugb25seSBzaG93aW5nIHVwIGluIG9uZSBmaWVsZCBhdCBhIHRpbWUuCiIiIgoKCmRlZiBmbXRfY3RsX2hhbmRsZV9tdXR1YWxfZXhjbHVkZSh2YWx1ZSwgdGFyZ2V0LCBvdGhlcik6CiAgICBuZXcgPSB2YWx1ZS5zcGxpdCgnLCcpCiAgICB3aGlsZSAnOmFsbDonIGluIG5ldzoKICAgICAgICBvdGhlci5jbGVhcigpCiAgICAgICAgdGFyZ2V0LmNsZWFyKCkKICAgICAgICB0YXJnZXQuYWRkKCc6YWxsOicpCiAgICAgICAgZGVsIG5ld1s6bmV3LmluZGV4KCc6YWxsOicpICsgMV0KICAgICAgICBpZiAnOm5vbmU6JyBub3QgaW4gbmV3OgogICAgICAgICAgICAjIFdpdGhvdXQgYSBub25lLCB3ZSB3YW50IHRvIGRpc2NhcmQgZXZlcnl0aGluZyBhcyA6YWxsOiBjb3ZlcnMgaXQKICAgICAgICAgICAgcmV0dXJuCiAgICBmb3IgbmFtZSBpbiBuZXc6CiAgICAgICAgaWYgbmFtZSA9PSAnOm5vbmU6JzoKICAgICAgICAgICAgdGFyZ2V0LmNsZWFyKCkKICAgICAgICAgICAgY29udGludWUKICAgICAgICBuYW1lID0gY2Fub25pY2FsaXplX25hbWUobmFtZSkKICAgICAgICBvdGhlci5kaXNjYXJkKG5hbWUpCiAgICAgICAgdGFyZ2V0LmFkZChuYW1lKQoKCmRlZiBmbXRfY3RsX2Zvcm1hdHMoZm10X2N0bCwgY2Fub25pY2FsX25hbWUpOgogICAgcmVzdWx0ID0gc2V0KFsiYmluYXJ5IiwgInNvdXJjZSJdKQogICAgaWYgY2Fub25pY2FsX25hbWUgaW4gZm10X2N0bC5vbmx5X2JpbmFyeToKICAgICAgICByZXN1bHQuZGlzY2FyZCgnc291cmNlJykKICAgIGVsaWYgY2Fub25pY2FsX25hbWUgaW4gZm10X2N0bC5ub19iaW5hcnk6CiAgICAgICAgcmVzdWx0LmRpc2NhcmQoJ2JpbmFyeScpCiAgICBlbGlmICc6YWxsOicgaW4gZm10X2N0bC5vbmx5X2JpbmFyeToKICAgICAgICByZXN1bHQuZGlzY2FyZCgnc291cmNlJykKICAgIGVsaWYgJzphbGw6JyBpbiBmbXRfY3RsLm5vX2JpbmFyeToKICAgICAgICByZXN1bHQuZGlzY2FyZCgnYmluYXJ5JykKICAgIHJldHVybiBmcm96ZW5zZXQocmVzdWx0KQoKCmRlZiBmbXRfY3RsX25vX2JpbmFyeShmbXRfY3RsKToKICAgIGZtdF9jdGxfaGFuZGxlX211dHVhbF9leGNsdWRlKAogICAgICAgICc6YWxsOicsIGZtdF9jdGwubm9fYmluYXJ5LCBmbXRfY3RsLm9ubHlfYmluYXJ5KQoKCmRlZiBmbXRfY3RsX25vX3VzZV93aGVlbChmbXRfY3RsKToKICAgIGZtdF9jdGxfbm9fYmluYXJ5KGZtdF9jdGwpCiAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICctLW5vLXVzZS13aGVlbCBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4gJwogICAgICAgICcgUGxlYXNlIHVzZSAtLW5vLWJpbmFyeSA6YWxsOiBpbnN0ZWFkLicsIFJlbW92ZWRJblBpcDEwV2FybmluZywKICAgICAgICBzdGFja2xldmVsPTIpCgoKU2VhcmNoID0gbmFtZWR0dXBsZSgnU2VhcmNoJywgJ3N1cHBsaWVkIGNhbm9uaWNhbCBmb3JtYXRzJykKIiIiQ2FwdHVyZSBrZXkgYXNwZWN0cyBvZiBhIHNlYXJjaC4KCjphdHRyaWJ1dGUgc3VwcGxpZWQ6IFRoZSB1c2VyIHN1cHBsaWVkIHBhY2thZ2UuCjphdHRyaWJ1dGUgY2Fub25pY2FsOiBUaGUgY2Fub25pY2FsIHBhY2thZ2UgbmFtZS4KOmF0dHJpYnV0ZSBmb3JtYXRzOiBUaGUgZm9ybWF0cyBhbGxvd2VkIGZvciB0aGlzIHBhY2thZ2UuIFNob3VsZCBiZSBhIHNldAogICAgd2l0aCAnYmluYXJ5JyBvciAnc291cmNlJyBvciBib3RoIGluIGl0LgoiIiIKUEsDBBQAAAAAAAAAIQC3D3eZ+hUAAPoVAAAgAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9sb2NhdGlvbnMucHkiIiJMb2NhdGlvbnMgd2hlcmUgd2UgbG9vayBmb3IgY29uZmlncywgaW5zdGFsbCBzdHVmZiwgZXRjIiIiCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgb3MKaW1wb3J0IG9zLnBhdGgKaW1wb3J0IHNpdGUKaW1wb3J0IHN5cwoKZnJvbSBkaXN0dXRpbHMgaW1wb3J0IHN5c2NvbmZpZwpmcm9tIGRpc3R1dGlscy5jb21tYW5kLmluc3RhbGwgaW1wb3J0IGluc3RhbGwsIFNDSEVNRV9LRVlTICAjIG5vcWEKCmZyb20gcGlwLmNvbXBhdCBpbXBvcnQgV0lORE9XUywgZXhwYW5kdXNlcgpmcm9tIHBpcC51dGlscyBpbXBvcnQgYXBwZGlycwoKCiMgQXBwbGljYXRpb24gRGlyZWN0b3JpZXMKVVNFUl9DQUNIRV9ESVIgPSBhcHBkaXJzLnVzZXJfY2FjaGVfZGlyKCJwaXAiKQoKCkRFTEVURV9NQVJLRVJfTUVTU0FHRSA9ICcnJ1wKVGhpcyBmaWxlIGlzIHBsYWNlZCBoZXJlIGJ5IHBpcCB0byBpbmRpY2F0ZSB0aGUgc291cmNlIHdhcyBwdXQKaGVyZSBieSBwaXAuCgpPbmNlIHRoaXMgcGFja2FnZSBpcyBzdWNjZXNzZnVsbHkgaW5zdGFsbGVkIHRoaXMgc291cmNlIGNvZGUgd2lsbCBiZQpkZWxldGVkICh1bmxlc3MgeW91IHJlbW92ZSB0aGlzIGZpbGUpLgonJycKUElQX0RFTEVURV9NQVJLRVJfRklMRU5BTUUgPSAncGlwLWRlbGV0ZS10aGlzLWRpcmVjdG9yeS50eHQnCgoKZGVmIHdyaXRlX2RlbGV0ZV9tYXJrZXJfZmlsZShkaXJlY3RvcnkpOgogICAgIiIiCiAgICBXcml0ZSB0aGUgcGlwIGRlbGV0ZSBtYXJrZXIgZmlsZSBpbnRvIHRoaXMgZGlyZWN0b3J5LgogICAgIiIiCiAgICBmaWxlcGF0aCA9IG9zLnBhdGguam9pbihkaXJlY3RvcnksIFBJUF9ERUxFVEVfTUFSS0VSX0ZJTEVOQU1FKQogICAgd2l0aCBvcGVuKGZpbGVwYXRoLCAndycpIGFzIG1hcmtlcl9mcDoKICAgICAgICBtYXJrZXJfZnAud3JpdGUoREVMRVRFX01BUktFUl9NRVNTQUdFKQoKCmRlZiBydW5uaW5nX3VuZGVyX3ZpcnR1YWxlbnYoKToKICAgICIiIgogICAgUmV0dXJuIFRydWUgaWYgd2UncmUgcnVubmluZyBpbnNpZGUgYSB2aXJ0dWFsZW52LCBGYWxzZSBvdGhlcndpc2UuCgogICAgIiIiCiAgICBpZiBoYXNhdHRyKHN5cywgJ3JlYWxfcHJlZml4Jyk6CiAgICAgICAgcmV0dXJuIFRydWUKICAgIGVsaWYgc3lzLnByZWZpeCAhPSBnZXRhdHRyKHN5cywgImJhc2VfcHJlZml4Iiwgc3lzLnByZWZpeCk6CiAgICAgICAgcmV0dXJuIFRydWUKCiAgICByZXR1cm4gRmFsc2UKCgpkZWYgdmlydHVhbGVudl9ub19nbG9iYWwoKToKICAgICIiIgogICAgUmV0dXJuIFRydWUgaWYgaW4gYSB2ZW52IGFuZCBubyBzeXN0ZW0gc2l0ZSBwYWNrYWdlcy4KICAgICIiIgogICAgIyB0aGlzIG1pcnJvcnMgdGhlIGxvZ2ljIGluIHZpcnR1YWxlbnYucHkgZm9yIGxvY2F0aW5nIHRoZQogICAgIyBuby1nbG9iYWwtc2l0ZS1wYWNrYWdlcy50eHQgZmlsZQogICAgc2l0ZV9tb2RfZGlyID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguYWJzcGF0aChzaXRlLl9fZmlsZV9fKSkKICAgIG5vX2dsb2JhbF9maWxlID0gb3MucGF0aC5qb2luKHNpdGVfbW9kX2RpciwgJ25vLWdsb2JhbC1zaXRlLXBhY2thZ2VzLnR4dCcpCiAgICBpZiBydW5uaW5nX3VuZGVyX3ZpcnR1YWxlbnYoKSBhbmQgb3MucGF0aC5pc2ZpbGUobm9fZ2xvYmFsX2ZpbGUpOgogICAgICAgIHJldHVybiBUcnVlCgoKaWYgcnVubmluZ191bmRlcl92aXJ0dWFsZW52KCk6CiAgICBzcmNfcHJlZml4ID0gb3MucGF0aC5qb2luKHN5cy5wcmVmaXgsICdzcmMnKQplbHNlOgogICAgIyBGSVhNRToga2VlcCBzcmMgaW4gY3dkIGZvciBub3cgKGl0IGlzIG5vdCBhIHRlbXBvcmFyeSBmb2xkZXIpCiAgICB0cnk6CiAgICAgICAgc3JjX3ByZWZpeCA9IG9zLnBhdGguam9pbihvcy5nZXRjd2QoKSwgJ3NyYycpCiAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICAjIEluIGNhc2UgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgaGFzIGJlZW4gcmVuYW1lZCBvciBkZWxldGVkCiAgICAgICAgc3lzLmV4aXQoCiAgICAgICAgICAgICJUaGUgZm9sZGVyIHlvdSBhcmUgZXhlY3V0aW5nIHBpcCBmcm9tIGNhbiBubyBsb25nZXIgYmUgZm91bmQuIgogICAgICAgICkKCiMgdW5kZXIgbWFjT1MgKyB2aXJ0dWFsZW52IHN5cy5wcmVmaXggaXMgbm90IHByb3Blcmx5IHJlc29sdmVkCiMgaXQgaXMgc29tZXRoaW5nIGxpa2UgL3BhdGgvdG8vcHl0aG9uL2Jpbi8uLgojIE5vdGU6IHVzaW5nIHJlYWxwYXRoIGR1ZSB0byB0bXAgZGlycyBvbiBPU1ggYmVpbmcgc3ltbGlua3MKc3JjX3ByZWZpeCA9IG9zLnBhdGguYWJzcGF0aChzcmNfcHJlZml4KQoKIyBGSVhNRSBkb2Vzbid0IGFjY291bnQgZm9yIHZlbnYgbGlua2VkIHRvIGdsb2JhbCBzaXRlLXBhY2thZ2VzCgpzaXRlX3BhY2thZ2VzID0gc3lzY29uZmlnLmdldF9weXRob25fbGliKCkKdXNlcl9zaXRlID0gc2l0ZS5VU0VSX1NJVEUKdXNlcl9kaXIgPSBleHBhbmR1c2VyKCd+JykKaWYgV0lORE9XUzoKICAgIGJpbl9weSA9IG9zLnBhdGguam9pbihzeXMucHJlZml4LCAnU2NyaXB0cycpCiAgICBiaW5fdXNlciA9IG9zLnBhdGguam9pbih1c2VyX3NpdGUsICdTY3JpcHRzJykKICAgICMgYnVpbGRvdXQgdXNlcyAnYmluJyBvbiBXaW5kb3dzIHRvbz8KICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhiaW5fcHkpOgogICAgICAgIGJpbl9weSA9IG9zLnBhdGguam9pbihzeXMucHJlZml4LCAnYmluJykKICAgICAgICBiaW5fdXNlciA9IG9zLnBhdGguam9pbih1c2VyX3NpdGUsICdiaW4nKQoKICAgIGNvbmZpZ19iYXNlbmFtZSA9ICdwaXAuaW5pJwoKICAgIGxlZ2FjeV9zdG9yYWdlX2RpciA9IG9zLnBhdGguam9pbih1c2VyX2RpciwgJ3BpcCcpCiAgICBsZWdhY3lfY29uZmlnX2ZpbGUgPSBvcy5wYXRoLmpvaW4oCiAgICAgICAgbGVnYWN5X3N0b3JhZ2VfZGlyLAogICAgICAgIGNvbmZpZ19iYXNlbmFtZSwKICAgICkKZWxzZToKICAgIGJpbl9weSA9IG9zLnBhdGguam9pbihzeXMucHJlZml4LCAnYmluJykKICAgIGJpbl91c2VyID0gb3MucGF0aC5qb2luKHVzZXJfc2l0ZSwgJ2JpbicpCgogICAgY29uZmlnX2Jhc2VuYW1lID0gJ3BpcC5jb25mJwoKICAgIGxlZ2FjeV9zdG9yYWdlX2RpciA9IG9zLnBhdGguam9pbih1c2VyX2RpciwgJy5waXAnKQogICAgbGVnYWN5X2NvbmZpZ19maWxlID0gb3MucGF0aC5qb2luKAogICAgICAgIGxlZ2FjeV9zdG9yYWdlX2RpciwKICAgICAgICBjb25maWdfYmFzZW5hbWUsCiAgICApCgogICAgIyBGb3JjaW5nIHRvIHVzZSAvdXNyL2xvY2FsL2JpbiBmb3Igc3RhbmRhcmQgbWFjT1MgZnJhbWV3b3JrIGluc3RhbGxzCiAgICAjIEFsc28gbG9nIHRvIH4vTGlicmFyeS9Mb2dzLyBmb3IgdXNlIHdpdGggdGhlIENvbnNvbGUuYXBwIGxvZyB2aWV3ZXIKICAgIGlmIHN5cy5wbGF0Zm9ybVs6Nl0gPT0gJ2RhcndpbicgYW5kIHN5cy5wcmVmaXhbOjE2XSA9PSAnL1N5c3RlbS9MaWJyYXJ5Lyc6CiAgICAgICAgYmluX3B5ID0gJy91c3IvbG9jYWwvYmluJwoKc2l0ZV9jb25maWdfZmlsZXMgPSBbCiAgICBvcy5wYXRoLmpvaW4ocGF0aCwgY29uZmlnX2Jhc2VuYW1lKQogICAgZm9yIHBhdGggaW4gYXBwZGlycy5zaXRlX2NvbmZpZ19kaXJzKCdwaXAnKQpdCgoKZGVmIGRpc3R1dGlsc19zY2hlbWUoZGlzdF9uYW1lLCB1c2VyPUZhbHNlLCBob21lPU5vbmUsIHJvb3Q9Tm9uZSwKICAgICAgICAgICAgICAgICAgICAgaXNvbGF0ZWQ9RmFsc2UsIHByZWZpeD1Ob25lKToKICAgICIiIgogICAgUmV0dXJuIGEgZGlzdHV0aWxzIGluc3RhbGwgc2NoZW1lCiAgICAiIiIKICAgIGZyb20gZGlzdHV0aWxzLmRpc3QgaW1wb3J0IERpc3RyaWJ1dGlvbgoKICAgIHNjaGVtZSA9IHt9CgogICAgaWYgaXNvbGF0ZWQ6CiAgICAgICAgZXh0cmFfZGlzdF9hcmdzID0geyJzY3JpcHRfYXJncyI6IFsiLS1uby11c2VyLWNmZyJdfQogICAgZWxzZToKICAgICAgICBleHRyYV9kaXN0X2FyZ3MgPSB7fQogICAgZGlzdF9hcmdzID0geyduYW1lJzogZGlzdF9uYW1lfQogICAgZGlzdF9hcmdzLnVwZGF0ZShleHRyYV9kaXN0X2FyZ3MpCgogICAgZCA9IERpc3RyaWJ1dGlvbihkaXN0X2FyZ3MpCiAgICBkLnBhcnNlX2NvbmZpZ19maWxlcygpCiAgICBpID0gZC5nZXRfY29tbWFuZF9vYmooJ2luc3RhbGwnLCBjcmVhdGU9VHJ1ZSkKICAgICMgTk9URTogc2V0dGluZyB1c2VyIG9yIGhvbWUgaGFzIHRoZSBzaWRlLWVmZmVjdCBvZiBjcmVhdGluZyB0aGUgaG9tZSBkaXIKICAgICMgb3IgdXNlciBiYXNlIGZvciBpbnN0YWxsYXRpb25zIGR1cmluZyBmaW5hbGl6ZV9vcHRpb25zKCkKICAgICMgaWRlYWxseSwgd2UnZCBwcmVmZXIgYSBzY2hlbWUgY2xhc3MgdGhhdCBoYXMgbm8gc2lkZS1lZmZlY3RzLgogICAgYXNzZXJ0IG5vdCAodXNlciBhbmQgcHJlZml4KSwgInVzZXI9ezB9IHByZWZpeD17MX0iLmZvcm1hdCh1c2VyLCBwcmVmaXgpCiAgICBpLnVzZXIgPSB1c2VyIG9yIGkudXNlcgogICAgaWYgdXNlcjoKICAgICAgICBpLnByZWZpeCA9ICIiCiAgICBpLnByZWZpeCA9IHByZWZpeCBvciBpLnByZWZpeAogICAgaS5ob21lID0gaG9tZSBvciBpLmhvbWUKICAgIGkucm9vdCA9IHJvb3Qgb3IgaS5yb290CiAgICBpLmZpbmFsaXplX29wdGlvbnMoKQogICAgZm9yIGtleSBpbiBTQ0hFTUVfS0VZUzoKICAgICAgICBzY2hlbWVba2V5XSA9IGdldGF0dHIoaSwgJ2luc3RhbGxfJyArIGtleSkKCiAgICAjIGluc3RhbGxfbGliIHNwZWNpZmllZCBpbiBzZXR1cC5jZmcgc2hvdWxkIGluc3RhbGwgKmV2ZXJ5dGhpbmcqCiAgICAjIGludG8gdGhlcmUgKGkuZS4gaXQgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGJvdGggcHVyZWxpYiBhbmQKICAgICMgcGxhdGxpYikuICBOb3RlLCBpLmluc3RhbGxfbGliIGlzICphbHdheXMqIHNldCBhZnRlcgogICAgIyBmaW5hbGl6ZV9vcHRpb25zKCk7IHdlIG9ubHkgd2FudCB0byBvdmVycmlkZSBoZXJlIGlmIHRoZSB1c2VyCiAgICAjIGhhcyBleHBsaWNpdGx5IHJlcXVlc3RlZCBpdCBoZW5jZSBnb2luZyBiYWNrIHRvIHRoZSBjb25maWcKICAgIGlmICdpbnN0YWxsX2xpYicgaW4gZC5nZXRfb3B0aW9uX2RpY3QoJ2luc3RhbGwnKToKICAgICAgICBzY2hlbWUudXBkYXRlKGRpY3QocHVyZWxpYj1pLmluc3RhbGxfbGliLCBwbGF0bGliPWkuaW5zdGFsbF9saWIpKQoKICAgIGlmIHJ1bm5pbmdfdW5kZXJfdmlydHVhbGVudigpOgogICAgICAgIHNjaGVtZVsnaGVhZGVycyddID0gb3MucGF0aC5qb2luKAogICAgICAgICAgICBzeXMucHJlZml4LAogICAgICAgICAgICAnaW5jbHVkZScsCiAgICAgICAgICAgICdzaXRlJywKICAgICAgICAgICAgJ3B5dGhvbicgKyBzeXMudmVyc2lvbls6M10sCiAgICAgICAgICAgIGRpc3RfbmFtZSwKICAgICAgICApCgogICAgICAgIGlmIHJvb3QgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHBhdGhfbm9fZHJpdmUgPSBvcy5wYXRoLnNwbGl0ZHJpdmUoCiAgICAgICAgICAgICAgICBvcy5wYXRoLmFic3BhdGgoc2NoZW1lWyJoZWFkZXJzIl0pKVsxXQogICAgICAgICAgICBzY2hlbWVbImhlYWRlcnMiXSA9IG9zLnBhdGguam9pbigKICAgICAgICAgICAgICAgIHJvb3QsCiAgICAgICAgICAgICAgICBwYXRoX25vX2RyaXZlWzE6XSwKICAgICAgICAgICAgKQoKICAgIHJldHVybiBzY2hlbWUKUEsDBBQAAAAAAAAAIQCqGme8RwAAAEcAAAAmAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9tb2RlbHMvX19pbml0X18ucHlmcm9tIHBpcC5tb2RlbHMuaW5kZXggaW1wb3J0IEluZGV4LCBQeVBJCgoKX19hbGxfXyA9IFsiSW5kZXgiLCAiUHlQSSJdClBLAwQUAAAAAAAAACEAaE4ybecBAADnAQAAIwAAAHB5cGlfX3BpcF85XzBfMy9waXAvbW9kZWxzL2luZGV4LnB5ZnJvbSBwaXAuX3ZlbmRvci5zaXgubW92ZXMudXJsbGliIGltcG9ydCBwYXJzZSBhcyB1cmxsaWJfcGFyc2UKCgpjbGFzcyBJbmRleChvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHVybCk6CiAgICAgICAgc2VsZi51cmwgPSB1cmwKICAgICAgICBzZWxmLm5ldGxvYyA9IHVybGxpYl9wYXJzZS51cmxzcGxpdCh1cmwpLm5ldGxvYwogICAgICAgIHNlbGYuc2ltcGxlX3VybCA9IHNlbGYudXJsX3RvX3BhdGgoJ3NpbXBsZScpCiAgICAgICAgc2VsZi5weXBpX3VybCA9IHNlbGYudXJsX3RvX3BhdGgoJ3B5cGknKQogICAgICAgIHNlbGYucGlwX2pzb25fdXJsID0gc2VsZi51cmxfdG9fcGF0aCgncHlwaS9waXAvanNvbicpCgogICAgZGVmIHVybF90b19wYXRoKHNlbGYsIHBhdGgpOgogICAgICAgIHJldHVybiB1cmxsaWJfcGFyc2UudXJsam9pbihzZWxmLnVybCwgcGF0aCkKCgpQeVBJID0gSW5kZXgoJ2h0dHBzOi8vcHlwaS5weXRob24ub3JnLycpClBLAwQUAAAAAAAAACEAAAAAAAAAAAAAAAAAKgAAAHB5cGlfX3BpcF85XzBfMy9waXAvb3BlcmF0aW9ucy9fX2luaXRfXy5weVBLAwQUAAAAAAAAACEAz2ViqDYGAAA2BgAAJwAAAHB5cGlfX3BpcF85XzBfMy9waXAvb3BlcmF0aW9ucy9jaGVjay5weQoKZGVmIGNoZWNrX3JlcXVpcmVtZW50cyhpbnN0YWxsZWRfZGlzdHMpOgogICAgbWlzc2luZ19yZXFzX2RpY3QgPSB7fQogICAgaW5jb21wYXRpYmxlX3JlcXNfZGljdCA9IHt9CgogICAgZm9yIGRpc3QgaW4gaW5zdGFsbGVkX2Rpc3RzOgogICAgICAgIGtleSA9ICclcz09JXMnICUgKGRpc3QucHJvamVjdF9uYW1lLCBkaXN0LnZlcnNpb24pCgogICAgICAgIG1pc3NpbmdfcmVxcyA9IGxpc3QoZ2V0X21pc3NpbmdfcmVxcyhkaXN0LCBpbnN0YWxsZWRfZGlzdHMpKQogICAgICAgIGlmIG1pc3NpbmdfcmVxczoKICAgICAgICAgICAgbWlzc2luZ19yZXFzX2RpY3Rba2V5XSA9IG1pc3NpbmdfcmVxcwoKICAgICAgICBpbmNvbXBhdGlibGVfcmVxcyA9IGxpc3QoZ2V0X2luY29tcGF0aWJsZV9yZXFzKAogICAgICAgICAgICBkaXN0LCBpbnN0YWxsZWRfZGlzdHMpKQogICAgICAgIGlmIGluY29tcGF0aWJsZV9yZXFzOgogICAgICAgICAgICBpbmNvbXBhdGlibGVfcmVxc19kaWN0W2tleV0gPSBpbmNvbXBhdGlibGVfcmVxcwoKICAgIHJldHVybiAobWlzc2luZ19yZXFzX2RpY3QsIGluY29tcGF0aWJsZV9yZXFzX2RpY3QpCgoKZGVmIGdldF9taXNzaW5nX3JlcXMoZGlzdCwgaW5zdGFsbGVkX2Rpc3RzKToKICAgICIiIlJldHVybiBhbGwgb2YgdGhlIHJlcXVpcmVtZW50cyBvZiBgZGlzdGAgdGhhdCBhcmVuJ3QgcHJlc2VudCBpbgogICAgYGluc3RhbGxlZF9kaXN0c2AuCgogICAgIiIiCiAgICBpbnN0YWxsZWRfbmFtZXMgPSBzZXQoZC5wcm9qZWN0X25hbWUubG93ZXIoKSBmb3IgZCBpbiBpbnN0YWxsZWRfZGlzdHMpCiAgICBtaXNzaW5nX3JlcXVpcmVtZW50cyA9IHNldCgpCgogICAgZm9yIHJlcXVpcmVtZW50IGluIGRpc3QucmVxdWlyZXMoKToKICAgICAgICBpZiByZXF1aXJlbWVudC5wcm9qZWN0X25hbWUubG93ZXIoKSBub3QgaW4gaW5zdGFsbGVkX25hbWVzOgogICAgICAgICAgICBtaXNzaW5nX3JlcXVpcmVtZW50cy5hZGQocmVxdWlyZW1lbnQpCiAgICAgICAgICAgIHlpZWxkIHJlcXVpcmVtZW50CgoKZGVmIGdldF9pbmNvbXBhdGlibGVfcmVxcyhkaXN0LCBpbnN0YWxsZWRfZGlzdHMpOgogICAgIiIiUmV0dXJuIGFsbCBvZiB0aGUgcmVxdWlyZW1lbnRzIG9mIGBkaXN0YCB0aGF0IGFyZSBwcmVzZW50IGluCiAgICBgaW5zdGFsbGVkX2Rpc3RzYCwgYnV0IGhhdmUgaW5jb21wYXRpYmxlIHZlcnNpb25zLgoKICAgICIiIgogICAgaW5zdGFsbGVkX2Rpc3RzX2J5X25hbWUgPSB7fQogICAgZm9yIGluc3RhbGxlZF9kaXN0IGluIGluc3RhbGxlZF9kaXN0czoKICAgICAgICBpbnN0YWxsZWRfZGlzdHNfYnlfbmFtZVtpbnN0YWxsZWRfZGlzdC5wcm9qZWN0X25hbWVdID0gaW5zdGFsbGVkX2Rpc3QKCiAgICBmb3IgcmVxdWlyZW1lbnQgaW4gZGlzdC5yZXF1aXJlcygpOgogICAgICAgIHByZXNlbnRfZGlzdCA9IGluc3RhbGxlZF9kaXN0c19ieV9uYW1lLmdldChyZXF1aXJlbWVudC5wcm9qZWN0X25hbWUpCgogICAgICAgIGlmIHByZXNlbnRfZGlzdCBhbmQgcHJlc2VudF9kaXN0IG5vdCBpbiByZXF1aXJlbWVudDoKICAgICAgICAgICAgeWllbGQgKHJlcXVpcmVtZW50LCBwcmVzZW50X2Rpc3QpClBLAwQUAAAAAAAAACEA+SIzM0oUAABKFAAAKAAAAHB5cGlfX3BpcF85XzBfMy9waXAvb3BlcmF0aW9ucy9mcmVlemUucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IHJlCgppbXBvcnQgcGlwCmZyb20gcGlwLnJlcSBpbXBvcnQgSW5zdGFsbFJlcXVpcmVtZW50CmZyb20gcGlwLnJlcS5yZXFfZmlsZSBpbXBvcnQgQ09NTUVOVF9SRQpmcm9tIHBpcC51dGlscyBpbXBvcnQgZ2V0X2luc3RhbGxlZF9kaXN0cmlidXRpb25zCmZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IHBrZ19yZXNvdXJjZXMKZnJvbSBwaXAuX3ZlbmRvci5wYWNrYWdpbmcudXRpbHMgaW1wb3J0IGNhbm9uaWNhbGl6ZV9uYW1lCmZyb20gcGlwLl92ZW5kb3IucGtnX3Jlc291cmNlcyBpbXBvcnQgUmVxdWlyZW1lbnRQYXJzZUVycm9yCgoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKZGVmIGZyZWV6ZSgKICAgICAgICByZXF1aXJlbWVudD1Ob25lLAogICAgICAgIGZpbmRfbGlua3M9Tm9uZSwgbG9jYWxfb25seT1Ob25lLCB1c2VyX29ubHk9Tm9uZSwgc2tpcF9yZWdleD1Ob25lLAogICAgICAgIGRlZmF1bHRfdmNzPU5vbmUsCiAgICAgICAgaXNvbGF0ZWQ9RmFsc2UsCiAgICAgICAgd2hlZWxfY2FjaGU9Tm9uZSwKICAgICAgICBza2lwPSgpKToKICAgIGZpbmRfbGlua3MgPSBmaW5kX2xpbmtzIG9yIFtdCiAgICBza2lwX21hdGNoID0gTm9uZQoKICAgIGlmIHNraXBfcmVnZXg6CiAgICAgICAgc2tpcF9tYXRjaCA9IHJlLmNvbXBpbGUoc2tpcF9yZWdleCkuc2VhcmNoCgogICAgZGVwZW5kZW5jeV9saW5rcyA9IFtdCgogICAgZm9yIGRpc3QgaW4gcGtnX3Jlc291cmNlcy53b3JraW5nX3NldDoKICAgICAgICBpZiBkaXN0Lmhhc19tZXRhZGF0YSgnZGVwZW5kZW5jeV9saW5rcy50eHQnKToKICAgICAgICAgICAgZGVwZW5kZW5jeV9saW5rcy5leHRlbmQoCiAgICAgICAgICAgICAgICBkaXN0LmdldF9tZXRhZGF0YV9saW5lcygnZGVwZW5kZW5jeV9saW5rcy50eHQnKQogICAgICAgICAgICApCiAgICBmb3IgbGluayBpbiBmaW5kX2xpbmtzOgogICAgICAgIGlmICcjZWdnPScgaW4gbGluazoKICAgICAgICAgICAgZGVwZW5kZW5jeV9saW5rcy5hcHBlbmQobGluaykKICAgIGZvciBsaW5rIGluIGZpbmRfbGlua3M6CiAgICAgICAgeWllbGQgJy1mICVzJyAlIGxpbmsKICAgIGluc3RhbGxhdGlvbnMgPSB7fQogICAgZm9yIGRpc3QgaW4gZ2V0X2luc3RhbGxlZF9kaXN0cmlidXRpb25zKGxvY2FsX29ubHk9bG9jYWxfb25seSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwPSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJfb25seT11c2VyX29ubHkpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmVxID0gcGlwLkZyb3plblJlcXVpcmVtZW50LmZyb21fZGlzdCgKICAgICAgICAgICAgICAgIGRpc3QsCiAgICAgICAgICAgICAgICBkZXBlbmRlbmN5X2xpbmtzCiAgICAgICAgICAgICkKICAgICAgICBleGNlcHQgUmVxdWlyZW1lbnRQYXJzZUVycm9yOgogICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICJDb3VsZCBub3QgcGFyc2UgcmVxdWlyZW1lbnQ6ICVzIiwKICAgICAgICAgICAgICAgIGRpc3QucHJvamVjdF9uYW1lCiAgICAgICAgICAgICkKICAgICAgICAgICAgY29udGludWUKICAgICAgICBpbnN0YWxsYXRpb25zW3JlcS5uYW1lXSA9IHJlcQoKICAgIGlmIHJlcXVpcmVtZW50OgogICAgICAgICMgdGhlIG9wdGlvbnMgdGhhdCBkb24ndCBnZXQgdHVybmVkIGludG8gYW4gSW5zdGFsbFJlcXVpcmVtZW50CiAgICAgICAgIyBzaG91bGQgb25seSBiZSBlbWl0dGVkIG9uY2UsIGV2ZW4gaWYgdGhlIHNhbWUgb3B0aW9uIGlzIGluIG11bHRpcGxlCiAgICAgICAgIyByZXF1aXJlbWVudHMgZmlsZXMsIHNvIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiB3aGF0IGhhcyBiZWVuIGVtaXR0ZWQKICAgICAgICAjIHNvIHRoYXQgd2UgZG9uJ3QgZW1pdCBpdCBhZ2FpbiBpZiBpdCdzIHNlZW4gYWdhaW4KICAgICAgICBlbWl0dGVkX29wdGlvbnMgPSBzZXQoKQogICAgICAgIGZvciByZXFfZmlsZV9wYXRoIGluIHJlcXVpcmVtZW50OgogICAgICAgICAgICB3aXRoIG9wZW4ocmVxX2ZpbGVfcGF0aCkgYXMgcmVxX2ZpbGU6CiAgICAgICAgICAgICAgICBmb3IgbGluZSBpbiByZXFfZmlsZToKICAgICAgICAgICAgICAgICAgICBpZiAobm90IGxpbmUuc3RyaXAoKSBvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZS5zdHJpcCgpLnN0YXJ0c3dpdGgoJyMnKSBvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNraXBfbWF0Y2ggYW5kIHNraXBfbWF0Y2gobGluZSkpIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLnN0YXJ0c3dpdGgoKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctcicsICctLXJlcXVpcmVtZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLVonLCAnLS1hbHdheXMtdW56aXAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctZicsICctLWZpbmQtbGlua3MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctaScsICctLWluZGV4LXVybCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy0tcHJlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLS10cnVzdGVkLWhvc3QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctLXByb2Nlc3MtZGVwZW5kZW5jeS1saW5rcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy0tZXh0cmEtaW5kZXgtdXJsJykpKToKICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUucnN0cmlwKCkKICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGluZSBub3QgaW4gZW1pdHRlZF9vcHRpb25zOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdHRlZF9vcHRpb25zLmFkZChsaW5lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgbGluZQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoJy1lJykgb3IgbGluZS5zdGFydHN3aXRoKCctLWVkaXRhYmxlJyk6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgnLWUnKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lWzI6XS5zdHJpcCgpCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZVtsZW4oJy0tZWRpdGFibGUnKTpdLnN0cmlwKCkubHN0cmlwKCc9JykKICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9yZXEgPSBJbnN0YWxsUmVxdWlyZW1lbnQuZnJvbV9lZGl0YWJsZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0X3Zjcz1kZWZhdWx0X3ZjcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzb2xhdGVkPWlzb2xhdGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlZWxfY2FjaGU9d2hlZWxfY2FjaGUsCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBsaW5lX3JlcSA9IEluc3RhbGxSZXF1aXJlbWVudC5mcm9tX2xpbmUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01NRU5UX1JFLnN1YignJywgbGluZSkuc3RyaXAoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzb2xhdGVkPWlzb2xhdGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlZWxfY2FjaGU9d2hlZWxfY2FjaGUsCiAgICAgICAgICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICAgICAgICAgaWYgbm90IGxpbmVfcmVxLm5hbWU6CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNraXBwaW5nIGxpbmUgaW4gcmVxdWlyZW1lbnQgZmlsZSBbJXNdIGJlY2F1c2UgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0J3Mgbm90IGNsZWFyIHdoYXQgaXQgd291bGQgaW5zdGFsbDogJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxX2ZpbGVfcGF0aCwgbGluZS5zdHJpcCgpLAogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgKGFkZCAjZWdnPVBhY2thZ2VOYW1lIHRvIHRoZSBVUkwgdG8gYXZvaWQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHRoaXMgd2FybmluZykiCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICBlbGlmIGxpbmVfcmVxLm5hbWUgbm90IGluIGluc3RhbGxhdGlvbnM6CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlcXVpcmVtZW50IGZpbGUgWyVzXSBjb250YWlucyAlcywgYnV0IHRoYXQgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2UgaXMgbm90IGluc3RhbGxlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXFfZmlsZV9wYXRoLCBDT01NRU5UX1JFLnN1YignJywgbGluZSkuc3RyaXAoKSwKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHN0cihpbnN0YWxsYXRpb25zW2xpbmVfcmVxLm5hbWVdKS5yc3RyaXAoKQogICAgICAgICAgICAgICAgICAgICAgICBkZWwgaW5zdGFsbGF0aW9uc1tsaW5lX3JlcS5uYW1lXQoKICAgICAgICB5aWVsZCgKICAgICAgICAgICAgJyMjIFRoZSBmb2xsb3dpbmcgcmVxdWlyZW1lbnRzIHdlcmUgYWRkZWQgYnkgJwogICAgICAgICAgICAncGlwIGZyZWV6ZTonCiAgICAgICAgKQogICAgZm9yIGluc3RhbGxhdGlvbiBpbiBzb3J0ZWQoCiAgICAgICAgICAgIGluc3RhbGxhdGlvbnMudmFsdWVzKCksIGtleT1sYW1iZGEgeDogeC5uYW1lLmxvd2VyKCkpOgogICAgICAgIGlmIGNhbm9uaWNhbGl6ZV9uYW1lKGluc3RhbGxhdGlvbi5uYW1lKSBub3QgaW4gc2tpcDoKICAgICAgICAgICAgeWllbGQgc3RyKGluc3RhbGxhdGlvbikucnN0cmlwKCkKUEsDBBQAAAAAAAAAIQD6KIS15CoAAOQqAAAhAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9wZXA0MjV0YWdzLnB5IiIiR2VuZXJhdGUgYW5kIHdvcmsgd2l0aCBQRVAgNDI1IENvbXBhdGliaWxpdHkgVGFncy4iIiIKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCByZQppbXBvcnQgc3lzCmltcG9ydCB3YXJuaW5ncwppbXBvcnQgcGxhdGZvcm0KaW1wb3J0IGxvZ2dpbmcKCnRyeToKICAgIGltcG9ydCBzeXNjb25maWcKZXhjZXB0IEltcG9ydEVycm9yOiAgIyBwcmFnbWEgbm9jb3ZlcgogICAgIyBQeXRob24gPCAyLjcKICAgIGltcG9ydCBkaXN0dXRpbHMuc3lzY29uZmlnIGFzIHN5c2NvbmZpZwppbXBvcnQgZGlzdHV0aWxzLnV0aWwKCmZyb20gcGlwLmNvbXBhdCBpbXBvcnQgT3JkZXJlZERpY3QKaW1wb3J0IHBpcC51dGlscy5nbGliYwoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgpfb3N4X2FyY2hfcGF0ID0gcmUuY29tcGlsZShyJyguKylfKFxkKylfKFxkKylfKC4rKScpCgoKZGVmIGdldF9jb25maWdfdmFyKHZhcik6CiAgICB0cnk6CiAgICAgICAgcmV0dXJuIHN5c2NvbmZpZy5nZXRfY29uZmlnX3Zhcih2YXIpCiAgICBleGNlcHQgSU9FcnJvciBhcyBlOiAgIyBJc3N1ZSAjMTA3NAogICAgICAgIHdhcm5pbmdzLndhcm4oInswfSIuZm9ybWF0KGUpLCBSdW50aW1lV2FybmluZykKICAgICAgICByZXR1cm4gTm9uZQoKCmRlZiBnZXRfYWJicl9pbXBsKCk6CiAgICAiIiJSZXR1cm4gYWJicmV2aWF0ZWQgaW1wbGVtZW50YXRpb24gbmFtZS4iIiIKICAgIGlmIGhhc2F0dHIoc3lzLCAncHlweV92ZXJzaW9uX2luZm8nKToKICAgICAgICBweWltcGwgPSAncHAnCiAgICBlbGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdqYXZhJyk6CiAgICAgICAgcHlpbXBsID0gJ2p5JwogICAgZWxpZiBzeXMucGxhdGZvcm0gPT0gJ2NsaSc6CiAgICAgICAgcHlpbXBsID0gJ2lwJwogICAgZWxzZToKICAgICAgICBweWltcGwgPSAnY3AnCiAgICByZXR1cm4gcHlpbXBsCgoKZGVmIGdldF9pbXBsX3ZlcigpOgogICAgIiIiUmV0dXJuIGltcGxlbWVudGF0aW9uIHZlcnNpb24uIiIiCiAgICBpbXBsX3ZlciA9IGdldF9jb25maWdfdmFyKCJweV92ZXJzaW9uX25vZG90IikKICAgIGlmIG5vdCBpbXBsX3ZlciBvciBnZXRfYWJicl9pbXBsKCkgPT0gJ3BwJzoKICAgICAgICBpbXBsX3ZlciA9ICcnLmpvaW4obWFwKHN0ciwgZ2V0X2ltcGxfdmVyc2lvbl9pbmZvKCkpKQogICAgcmV0dXJuIGltcGxfdmVyCgoKZGVmIGdldF9pbXBsX3ZlcnNpb25faW5mbygpOgogICAgIiIiUmV0dXJuIHN5cy52ZXJzaW9uX2luZm8tbGlrZSB0dXBsZSBmb3IgdXNlIGluIGRlY3JlbWVudGluZyB0aGUgbWlub3IKICAgIHZlcnNpb24uIiIiCiAgICBpZiBnZXRfYWJicl9pbXBsKCkgPT0gJ3BwJzoKICAgICAgICAjIGFzIHBlciBodHRwczovL2dpdGh1Yi5jb20vcHlwYS9waXAvaXNzdWVzLzI4ODIKICAgICAgICByZXR1cm4gKHN5cy52ZXJzaW9uX2luZm9bMF0sIHN5cy5weXB5X3ZlcnNpb25faW5mby5tYWpvciwKICAgICAgICAgICAgICAgIHN5cy5weXB5X3ZlcnNpb25faW5mby5taW5vcikKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIHN5cy52ZXJzaW9uX2luZm9bMF0sIHN5cy52ZXJzaW9uX2luZm9bMV0KCgpkZWYgZ2V0X2ltcGxfdGFnKCk6CiAgICAiIiIKICAgIFJldHVybnMgdGhlIFRhZyBmb3IgdGhpcyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbi4KICAgICIiIgogICAgcmV0dXJuICJ7MH17MX0iLmZvcm1hdChnZXRfYWJicl9pbXBsKCksIGdldF9pbXBsX3ZlcigpKQoKCmRlZiBnZXRfZmxhZyh2YXIsIGZhbGxiYWNrLCBleHBlY3RlZD1UcnVlLCB3YXJuPVRydWUpOgogICAgIiIiVXNlIGEgZmFsbGJhY2sgbWV0aG9kIGZvciBkZXRlcm1pbmluZyBTT0FCSSBmbGFncyBpZiB0aGUgbmVlZGVkIGNvbmZpZwogICAgdmFyIGlzIHVuc2V0IG9yIHVuYXZhaWxhYmxlLiIiIgogICAgdmFsID0gZ2V0X2NvbmZpZ192YXIodmFyKQogICAgaWYgdmFsIGlzIE5vbmU6CiAgICAgICAgaWYgd2FybjoKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJDb25maWcgdmFyaWFibGUgJyVzJyBpcyB1bnNldCwgUHl0aG9uIEFCSSB0YWcgbWF5ICIKICAgICAgICAgICAgICAgICAgICAgICAgICJiZSBpbmNvcnJlY3QiLCB2YXIpCiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCkKICAgIHJldHVybiB2YWwgPT0gZXhwZWN0ZWQKCgpkZWYgZ2V0X2FiaV90YWcoKToKICAgICIiIlJldHVybiB0aGUgQUJJIHRhZyBiYXNlZCBvbiBTT0FCSSAoaWYgYXZhaWxhYmxlKSBvciBlbXVsYXRlIFNPQUJJCiAgICAoQ1B5dGhvbiAyLCBQeVB5KS4iIiIKICAgIHNvYWJpID0gZ2V0X2NvbmZpZ192YXIoJ1NPQUJJJykKICAgIGltcGwgPSBnZXRfYWJicl9pbXBsKCkKICAgIGlmIG5vdCBzb2FiaSBhbmQgaW1wbCBpbiAoJ2NwJywgJ3BwJykgYW5kIGhhc2F0dHIoc3lzLCAnbWF4dW5pY29kZScpOgogICAgICAgIGQgPSAnJwogICAgICAgIG0gPSAnJwogICAgICAgIHUgPSAnJwogICAgICAgIGlmIGdldF9mbGFnKCdQeV9ERUJVRycsCiAgICAgICAgICAgICAgICAgICAgbGFtYmRhOiBoYXNhdHRyKHN5cywgJ2dldHRvdGFscmVmY291bnQnKSwKICAgICAgICAgICAgICAgICAgICB3YXJuPShpbXBsID09ICdjcCcpKToKICAgICAgICAgICAgZCA9ICdkJwogICAgICAgIGlmIGdldF9mbGFnKCdXSVRIX1BZTUFMTE9DJywKICAgICAgICAgICAgICAgICAgICBsYW1iZGE6IGltcGwgPT0gJ2NwJywKICAgICAgICAgICAgICAgICAgICB3YXJuPShpbXBsID09ICdjcCcpKToKICAgICAgICAgICAgbSA9ICdtJwogICAgICAgIGlmIGdldF9mbGFnKCdQeV9VTklDT0RFX1NJWkUnLAogICAgICAgICAgICAgICAgICAgIGxhbWJkYTogc3lzLm1heHVuaWNvZGUgPT0gMHgxMGZmZmYsCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQ9NCwKICAgICAgICAgICAgICAgICAgICB3YXJuPShpbXBsID09ICdjcCcgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnZlcnNpb25faW5mbyA8ICgzLCAzKSkpIFwKICAgICAgICAgICAgICAgIGFuZCBzeXMudmVyc2lvbl9pbmZvIDwgKDMsIDMpOgogICAgICAgICAgICB1ID0gJ3UnCiAgICAgICAgYWJpID0gJyVzJXMlcyVzJXMnICUgKGltcGwsIGdldF9pbXBsX3ZlcigpLCBkLCBtLCB1KQogICAgZWxpZiBzb2FiaSBhbmQgc29hYmkuc3RhcnRzd2l0aCgnY3B5dGhvbi0nKToKICAgICAgICBhYmkgPSAnY3AnICsgc29hYmkuc3BsaXQoJy0nKVsxXQogICAgZWxpZiBzb2FiaToKICAgICAgICBhYmkgPSBzb2FiaS5yZXBsYWNlKCcuJywgJ18nKS5yZXBsYWNlKCctJywgJ18nKQogICAgZWxzZToKICAgICAgICBhYmkgPSBOb25lCiAgICByZXR1cm4gYWJpCgoKZGVmIF9pc19ydW5uaW5nXzMyYml0KCk6CiAgICByZXR1cm4gc3lzLm1heHNpemUgPT0gMjE0NzQ4MzY0NwoKCmRlZiBnZXRfcGxhdGZvcm0oKToKICAgICIiIlJldHVybiBvdXIgcGxhdGZvcm0gbmFtZSAnd2luMzInLCAnbGludXhfeDg2XzY0JyIiIgogICAgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nOgogICAgICAgICMgZGlzdHV0aWxzLnV0aWwuZ2V0X3BsYXRmb3JtKCkgcmV0dXJucyB0aGUgcmVsZWFzZSBiYXNlZCBvbiB0aGUgdmFsdWUKICAgICAgICAjIG9mIE1BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVCBvbiB3aGljaCBQeXRob24gd2FzIGJ1aWx0LCB3aGljaCBtYXkKICAgICAgICAjIGJlIHNpZ25pZmljYW50bHkgb2xkZXIgdGhhbiB0aGUgdXNlcidzIGN1cnJlbnQgbWFjaGluZS4KICAgICAgICByZWxlYXNlLCBfLCBtYWNoaW5lID0gcGxhdGZvcm0ubWFjX3ZlcigpCiAgICAgICAgc3BsaXRfdmVyID0gcmVsZWFzZS5zcGxpdCgnLicpCgogICAgICAgIGlmIG1hY2hpbmUgPT0gIng4Nl82NCIgYW5kIF9pc19ydW5uaW5nXzMyYml0KCk6CiAgICAgICAgICAgIG1hY2hpbmUgPSAiaTM4NiIKICAgICAgICBlbGlmIG1hY2hpbmUgPT0gInBwYzY0IiBhbmQgX2lzX3J1bm5pbmdfMzJiaXQoKToKICAgICAgICAgICAgbWFjaGluZSA9ICJwcGMiCgogICAgICAgIHJldHVybiAnbWFjb3N4X3swfV97MX1fezJ9Jy5mb3JtYXQoc3BsaXRfdmVyWzBdLCBzcGxpdF92ZXJbMV0sIG1hY2hpbmUpCgogICAgIyBYWFggcmVtb3ZlIGRpc3R1dGlscyBkZXBlbmRlbmN5CiAgICByZXN1bHQgPSBkaXN0dXRpbHMudXRpbC5nZXRfcGxhdGZvcm0oKS5yZXBsYWNlKCcuJywgJ18nKS5yZXBsYWNlKCctJywgJ18nKQogICAgaWYgcmVzdWx0ID09ICJsaW51eF94ODZfNjQiIGFuZCBfaXNfcnVubmluZ18zMmJpdCgpOgogICAgICAgICMgMzIgYml0IFB5dGhvbiBwcm9ncmFtIChydW5uaW5nIG9uIGEgNjQgYml0IExpbnV4KTogcGlwIHNob3VsZCBvbmx5CiAgICAgICAgIyBpbnN0YWxsIGFuZCBydW4gMzIgYml0IGNvbXBpbGVkIGV4dGVuc2lvbnMgaW4gdGhhdCBjYXNlLgogICAgICAgIHJlc3VsdCA9ICJsaW51eF9pNjg2IgoKICAgIHJldHVybiByZXN1bHQKCgpkZWYgaXNfbWFueWxpbnV4MV9jb21wYXRpYmxlKCk6CiAgICAjIE9ubHkgTGludXgsIGFuZCBvbmx5IHg4Ni02NCAvIGk2ODYKICAgIGlmIGdldF9wbGF0Zm9ybSgpIG5vdCBpbiAoImxpbnV4X3g4Nl82NCIsICJsaW51eF9pNjg2Iik6CiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgIyBDaGVjayBmb3IgcHJlc2VuY2Ugb2YgX21hbnlsaW51eCBtb2R1bGUKICAgIHRyeToKICAgICAgICBpbXBvcnQgX21hbnlsaW51eAogICAgICAgIHJldHVybiBib29sKF9tYW55bGludXgubWFueWxpbnV4MV9jb21wYXRpYmxlKQogICAgZXhjZXB0IChJbXBvcnRFcnJvciwgQXR0cmlidXRlRXJyb3IpOgogICAgICAgICMgRmFsbCB0aHJvdWdoIHRvIGhldXJpc3RpYyBjaGVjayBiZWxvdwogICAgICAgIHBhc3MKCiAgICAjIENoZWNrIGdsaWJjIHZlcnNpb24uIENlbnRPUyA1IHVzZXMgZ2xpYmMgMi41LgogICAgcmV0dXJuIHBpcC51dGlscy5nbGliYy5oYXZlX2NvbXBhdGlibGVfZ2xpYmMoMiwgNSkKCgpkZWYgZ2V0X2Rhcndpbl9hcmNoZXMobWFqb3IsIG1pbm9yLCBtYWNoaW5lKToKICAgICIiIlJldHVybiBhIGxpc3Qgb2Ygc3VwcG9ydGVkIGFyY2hlcyAoaW5jbHVkaW5nIGdyb3VwIGFyY2hlcykgZm9yCiAgICB0aGUgZ2l2ZW4gbWFqb3IsIG1pbm9yIGFuZCBtYWNoaW5lIGFyY2hpdGVjdHVyZSBvZiBhbiBtYWNPUyBtYWNoaW5lLgogICAgIiIiCiAgICBhcmNoZXMgPSBbXQoKICAgIGRlZiBfc3VwcG9ydHNfYXJjaChtYWpvciwgbWlub3IsIGFyY2gpOgogICAgICAgICMgTG9va2luZyBhdCB0aGUgYXBwbGljYXRpb24gc3VwcG9ydCBmb3IgbWFjT1MgdmVyc2lvbnMgaW4gdGhlIGNoYXJ0CiAgICAgICAgIyBwcm92aWRlZCBieSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9PU19YI1ZlcnNpb25zIGl0IGFwcGVhcnMKICAgICAgICAjIG91ciB0aW1lbGluZSBsb29rcyByb3VnaGx5IGxpa2U6CiAgICAgICAgIwogICAgICAgICMgMTAuMCAtIEludHJvZHVjZXMgcHBjIHN1cHBvcnQuCiAgICAgICAgIyAxMC40IC0gSW50cm9kdWNlcyBwcGM2NCwgaTM4NiwgYW5kIHg4Nl82NCBzdXBwb3J0LCBob3dldmVyIHRoZSBwcGM2NAogICAgICAgICMgICAgICAgIGFuZCB4ODZfNjQgc3VwcG9ydCBpcyBDTEkgb25seSwgYW5kIGNhbm5vdCBiZSB1c2VkIGZvciBHVUkKICAgICAgICAjICAgICAgICBhcHBsaWNhdGlvbnMuCiAgICAgICAgIyAxMC41IC0gRXh0ZW5kcyBwcGM2NCBhbmQgeDg2XzY0IHN1cHBvcnQgdG8gY292ZXIgR1VJIGFwcGxpY2F0aW9ucy4KICAgICAgICAjIDEwLjYgLSBEcm9wcyBzdXBwb3J0IGZvciBwcGM2NAogICAgICAgICMgMTAuNyAtIERyb3BzIHN1cHBvcnQgZm9yIHBwYwogICAgICAgICMKICAgICAgICAjIEdpdmVuIHRoYXQgd2UgZG8gbm90IGtub3cgaWYgd2UncmUgaW5zdGFsbGluZyBhIENMSSBvciBhIEdVSQogICAgICAgICMgYXBwbGljYXRpb24sIHdlIG11c3QgYmUgY29uc2VydmF0aXZlIGFuZCBhc3N1bWUgaXQgbWlnaHQgYmUgYSBHVUkKICAgICAgICAjIGFwcGxpY2F0aW9uIGFuZCBiZWhhdmUgYXMgaWYgcHBjNjQgYW5kIHg4Nl82NCBzdXBwb3J0IGRpZCBub3Qgb2NjdXIKICAgICAgICAjIHVudGlsIDEwLjUuCiAgICAgICAgIwogICAgICAgICMgTm90ZTogVGhlIGFib3ZlIGluZm9ybWF0aW9uIGlzIHRha2VuIGZyb20gdGhlICJBcHBsaWNhdGlvbiBzdXBwb3J0IgogICAgICAgICMgICAgICAgY29sdW1uIGluIHRoZSBjaGFydCBub3QgdGhlICJQcm9jZXNzb3Igc3VwcG9ydCIgc2luY2UgSSBiZWxpZXZlCiAgICAgICAgIyAgICAgICB0aGF0IHdlIGNhcmUgYWJvdXQgd2hhdCBpbnN0cnVjdGlvbiBzZXRzIGFuIGFwcGxpY2F0aW9uIGNhbiB1c2UKICAgICAgICAjICAgICAgIG5vdCB3aGljaCBwcm9jZXNzb3JzIHRoZSBPUyBzdXBwb3J0cy4KICAgICAgICBpZiBhcmNoID09ICdwcGMnOgogICAgICAgICAgICByZXR1cm4gKG1ham9yLCBtaW5vcikgPD0gKDEwLCA1KQogICAgICAgIGlmIGFyY2ggPT0gJ3BwYzY0JzoKICAgICAgICAgICAgcmV0dXJuIChtYWpvciwgbWlub3IpID09ICgxMCwgNSkKICAgICAgICBpZiBhcmNoID09ICdpMzg2JzoKICAgICAgICAgICAgcmV0dXJuIChtYWpvciwgbWlub3IpID49ICgxMCwgNCkKICAgICAgICBpZiBhcmNoID09ICd4ODZfNjQnOgogICAgICAgICAgICByZXR1cm4gKG1ham9yLCBtaW5vcikgPj0gKDEwLCA1KQogICAgICAgIGlmIGFyY2ggaW4gZ3JvdXBzOgogICAgICAgICAgICBmb3IgZ2FyY2ggaW4gZ3JvdXBzW2FyY2hdOgogICAgICAgICAgICAgICAgaWYgX3N1cHBvcnRzX2FyY2gobWFqb3IsIG1pbm9yLCBnYXJjaCk6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBncm91cHMgPSBPcmRlcmVkRGljdChbCiAgICAgICAgKCJmYXQiLCAoImkzODYiLCAicHBjIikpLAogICAgICAgICgiaW50ZWwiLCAoIng4Nl82NCIsICJpMzg2IikpLAogICAgICAgICgiZmF0NjQiLCAoIng4Nl82NCIsICJwcGM2NCIpKSwKICAgICAgICAoImZhdDMyIiwgKCJ4ODZfNjQiLCAiaTM4NiIsICJwcGMiKSksCiAgICBdKQoKICAgIGlmIF9zdXBwb3J0c19hcmNoKG1ham9yLCBtaW5vciwgbWFjaGluZSk6CiAgICAgICAgYXJjaGVzLmFwcGVuZChtYWNoaW5lKQoKICAgIGZvciBnYXJjaCBpbiBncm91cHM6CiAgICAgICAgaWYgbWFjaGluZSBpbiBncm91cHNbZ2FyY2hdIGFuZCBfc3VwcG9ydHNfYXJjaChtYWpvciwgbWlub3IsIGdhcmNoKToKICAgICAgICAgICAgYXJjaGVzLmFwcGVuZChnYXJjaCkKCiAgICBhcmNoZXMuYXBwZW5kKCd1bml2ZXJzYWwnKQoKICAgIHJldHVybiBhcmNoZXMKCgpkZWYgZ2V0X3N1cHBvcnRlZCh2ZXJzaW9ucz1Ob25lLCBub2FyY2g9RmFsc2UsIHBsYXRmb3JtPU5vbmUsCiAgICAgICAgICAgICAgICAgIGltcGw9Tm9uZSwgYWJpPU5vbmUpOgogICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBzdXBwb3J0ZWQgdGFncyBmb3IgZWFjaCB2ZXJzaW9uIHNwZWNpZmllZCBpbgogICAgYHZlcnNpb25zYC4KCiAgICA6cGFyYW0gdmVyc2lvbnM6IGEgbGlzdCBvZiBzdHJpbmcgdmVyc2lvbnMsIG9mIHRoZSBmb3JtIFsiMzMiLCAiMzIiXSwKICAgICAgICBvciBOb25lLiBUaGUgZmlyc3QgdmVyc2lvbiB3aWxsIGJlIGFzc3VtZWQgdG8gc3VwcG9ydCBvdXIgQUJJLgogICAgOnBhcmFtIHBsYXRmb3JtOiBzcGVjaWZ5IHRoZSBleGFjdCBwbGF0Zm9ybSB5b3Ugd2FudCB2YWxpZAogICAgICAgIHRhZ3MgZm9yLCBvciBOb25lLiBJZiBOb25lLCB1c2UgdGhlIGxvY2FsIHN5c3RlbSBwbGF0Zm9ybS4KICAgIDpwYXJhbSBpbXBsOiBzcGVjaWZ5IHRoZSBleGFjdCBpbXBsZW1lbnRhdGlvbiB5b3Ugd2FudCB2YWxpZAogICAgICAgIHRhZ3MgZm9yLCBvciBOb25lLiBJZiBOb25lLCB1c2UgdGhlIGxvY2FsIGludGVycHJldGVyIGltcGwuCiAgICA6cGFyYW0gYWJpOiBzcGVjaWZ5IHRoZSBleGFjdCBhYmkgeW91IHdhbnQgdmFsaWQKICAgICAgICB0YWdzIGZvciwgb3IgTm9uZS4gSWYgTm9uZSwgdXNlIHRoZSBsb2NhbCBpbnRlcnByZXRlciBhYmkuCiAgICAiIiIKICAgIHN1cHBvcnRlZCA9IFtdCgogICAgIyBWZXJzaW9ucyBtdXN0IGJlIGdpdmVuIHdpdGggcmVzcGVjdCB0byB0aGUgcHJlZmVyZW5jZQogICAgaWYgdmVyc2lvbnMgaXMgTm9uZToKICAgICAgICB2ZXJzaW9ucyA9IFtdCiAgICAgICAgdmVyc2lvbl9pbmZvID0gZ2V0X2ltcGxfdmVyc2lvbl9pbmZvKCkKICAgICAgICBtYWpvciA9IHZlcnNpb25faW5mb1s6LTFdCiAgICAgICAgIyBTdXBwb3J0IGFsbCBwcmV2aW91cyBtaW5vciBQeXRob24gdmVyc2lvbnMuCiAgICAgICAgZm9yIG1pbm9yIGluIHJhbmdlKHZlcnNpb25faW5mb1stMV0sIC0xLCAtMSk6CiAgICAgICAgICAgIHZlcnNpb25zLmFwcGVuZCgnJy5qb2luKG1hcChzdHIsIG1ham9yICsgKG1pbm9yLCkpKSkKCiAgICBpbXBsID0gaW1wbCBvciBnZXRfYWJicl9pbXBsKCkKCiAgICBhYmlzID0gW10KCiAgICBhYmkgPSBhYmkgb3IgZ2V0X2FiaV90YWcoKQogICAgaWYgYWJpOgogICAgICAgIGFiaXNbMDowXSA9IFthYmldCgogICAgYWJpM3MgPSBzZXQoKQogICAgaW1wb3J0IGltcAogICAgZm9yIHN1ZmZpeCBpbiBpbXAuZ2V0X3N1ZmZpeGVzKCk6CiAgICAgICAgaWYgc3VmZml4WzBdLnN0YXJ0c3dpdGgoJy5hYmknKToKICAgICAgICAgICAgYWJpM3MuYWRkKHN1ZmZpeFswXS5zcGxpdCgnLicsIDIpWzFdKQoKICAgIGFiaXMuZXh0ZW5kKHNvcnRlZChsaXN0KGFiaTNzKSkpCgogICAgYWJpcy5hcHBlbmQoJ25vbmUnKQoKICAgIGlmIG5vdCBub2FyY2g6CiAgICAgICAgYXJjaCA9IHBsYXRmb3JtIG9yIGdldF9wbGF0Zm9ybSgpCiAgICAgICAgaWYgYXJjaC5zdGFydHN3aXRoKCdtYWNvc3gnKToKICAgICAgICAgICAgIyBzdXBwb3J0IG1hY29zeC0xMC42LWludGVsIG9uIG1hY29zeC0xMC45LXg4Nl82NAogICAgICAgICAgICBtYXRjaCA9IF9vc3hfYXJjaF9wYXQubWF0Y2goYXJjaCkKICAgICAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgICAgICBuYW1lLCBtYWpvciwgbWlub3IsIGFjdHVhbF9hcmNoID0gbWF0Y2guZ3JvdXBzKCkKICAgICAgICAgICAgICAgIHRwbCA9ICd7MH1fezF9XyVpXyVzJy5mb3JtYXQobmFtZSwgbWFqb3IpCiAgICAgICAgICAgICAgICBhcmNoZXMgPSBbXQogICAgICAgICAgICAgICAgZm9yIG0gaW4gcmV2ZXJzZWQocmFuZ2UoaW50KG1pbm9yKSArIDEpKToKICAgICAgICAgICAgICAgICAgICBmb3IgYSBpbiBnZXRfZGFyd2luX2FyY2hlcyhpbnQobWFqb3IpLCBtLCBhY3R1YWxfYXJjaCk6CiAgICAgICAgICAgICAgICAgICAgICAgIGFyY2hlcy5hcHBlbmQodHBsICUgKG0sIGEpKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBhcmNoIHBhdHRlcm4gZGlkbid0IG1hdGNoICg/ISkKICAgICAgICAgICAgICAgIGFyY2hlcyA9IFthcmNoXQogICAgICAgIGVsaWYgcGxhdGZvcm0gaXMgTm9uZSBhbmQgaXNfbWFueWxpbnV4MV9jb21wYXRpYmxlKCk6CiAgICAgICAgICAgIGFyY2hlcyA9IFthcmNoLnJlcGxhY2UoJ2xpbnV4JywgJ21hbnlsaW51eDEnKSwgYXJjaF0KICAgICAgICBlbHNlOgogICAgICAgICAgICBhcmNoZXMgPSBbYXJjaF0KCiAgICAgICAgIyBDdXJyZW50IHZlcnNpb24sIGN1cnJlbnQgQVBJIChidWlsdCBzcGVjaWZpY2FsbHkgZm9yIG91ciBQeXRob24pOgogICAgICAgIGZvciBhYmkgaW4gYWJpczoKICAgICAgICAgICAgZm9yIGFyY2ggaW4gYXJjaGVzOgogICAgICAgICAgICAgICAgc3VwcG9ydGVkLmFwcGVuZCgoJyVzJXMnICUgKGltcGwsIHZlcnNpb25zWzBdKSwgYWJpLCBhcmNoKSkKCiAgICAgICAgIyBhYmkzIG1vZHVsZXMgY29tcGF0aWJsZSB3aXRoIG9sZGVyIHZlcnNpb24gb2YgUHl0aG9uCiAgICAgICAgZm9yIHZlcnNpb24gaW4gdmVyc2lvbnNbMTpdOgogICAgICAgICAgICAjIGFiaTMgd2FzIGludHJvZHVjZWQgaW4gUHl0aG9uIDMuMgogICAgICAgICAgICBpZiB2ZXJzaW9uIGluICgnMzEnLCAnMzAnKToKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgIGZvciBhYmkgaW4gYWJpM3M6ICAgIyBlbXB0eSBzZXQgaWYgbm90IFB5dGhvbiAzCiAgICAgICAgICAgICAgICBmb3IgYXJjaCBpbiBhcmNoZXM6CiAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkLmFwcGVuZCgoIiVzJXMiICUgKGltcGwsIHZlcnNpb24pLCBhYmksIGFyY2gpKQoKICAgICAgICAjIEhhcyBiaW5hcmllcywgZG9lcyBub3QgdXNlIHRoZSBQeXRob24gQVBJOgogICAgICAgIGZvciBhcmNoIGluIGFyY2hlczoKICAgICAgICAgICAgc3VwcG9ydGVkLmFwcGVuZCgoJ3B5JXMnICUgKHZlcnNpb25zWzBdWzBdKSwgJ25vbmUnLCBhcmNoKSkKCiAgICAjIE5vIGFiaSAvIGFyY2gsIGJ1dCByZXF1aXJlcyBvdXIgaW1wbGVtZW50YXRpb246CiAgICBzdXBwb3J0ZWQuYXBwZW5kKCgnJXMlcycgJSAoaW1wbCwgdmVyc2lvbnNbMF0pLCAnbm9uZScsICdhbnknKSkKICAgICMgVGFnZ2VkIHNwZWNpZmljYWxseSBhcyBiZWluZyBjcm9zcy12ZXJzaW9uIGNvbXBhdGlibGUKICAgICMgKHdpdGgganVzdCB0aGUgbWFqb3IgdmVyc2lvbiBzcGVjaWZpZWQpCiAgICBzdXBwb3J0ZWQuYXBwZW5kKCgnJXMlcycgJSAoaW1wbCwgdmVyc2lvbnNbMF1bMF0pLCAnbm9uZScsICdhbnknKSkKCiAgICAjIE5vIGFiaSAvIGFyY2gsIGdlbmVyaWMgUHl0aG9uCiAgICBmb3IgaSwgdmVyc2lvbiBpbiBlbnVtZXJhdGUodmVyc2lvbnMpOgogICAgICAgIHN1cHBvcnRlZC5hcHBlbmQoKCdweSVzJyAlICh2ZXJzaW9uLCksICdub25lJywgJ2FueScpKQogICAgICAgIGlmIGkgPT0gMDoKICAgICAgICAgICAgc3VwcG9ydGVkLmFwcGVuZCgoJ3B5JXMnICUgKHZlcnNpb25bMF0pLCAnbm9uZScsICdhbnknKSkKCiAgICByZXR1cm4gc3VwcG9ydGVkCgpzdXBwb3J0ZWRfdGFncyA9IGdldF9zdXBwb3J0ZWQoKQpzdXBwb3J0ZWRfdGFnc19ub2FyY2ggPSBnZXRfc3VwcG9ydGVkKG5vYXJjaD1UcnVlKQoKaW1wbGVtZW50YXRpb25fdGFnID0gZ2V0X2ltcGxfdGFnKCkKUEsDBBQAAAAAAAAAIQBcadIZFAEAABQBAAAjAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9yZXEvX19pbml0X18ucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKZnJvbSAucmVxX2luc3RhbGwgaW1wb3J0IEluc3RhbGxSZXF1aXJlbWVudApmcm9tIC5yZXFfc2V0IGltcG9ydCBSZXF1aXJlbWVudFNldCwgUmVxdWlyZW1lbnRzCmZyb20gLnJlcV9maWxlIGltcG9ydCBwYXJzZV9yZXF1aXJlbWVudHMKCl9fYWxsX18gPSBbCiAgICAiUmVxdWlyZW1lbnRTZXQiLCAiUmVxdWlyZW1lbnRzIiwgIkluc3RhbGxSZXF1aXJlbWVudCIsCiAgICAicGFyc2VfcmVxdWlyZW1lbnRzIiwKXQpQSwMEFAAAAAAAAAAhABzgjAqWLgAAli4AACMAAABweXBpX19waXBfOV8wXzMvcGlwL3JlcS9yZXFfZmlsZS5weSIiIgpSZXF1aXJlbWVudHMgZmlsZSBwYXJzaW5nCiIiIgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBvcwppbXBvcnQgcmUKaW1wb3J0IHNobGV4CmltcG9ydCBzeXMKaW1wb3J0IG9wdHBhcnNlCmltcG9ydCB3YXJuaW5ncwoKZnJvbSBwaXAuX3ZlbmRvci5zaXgubW92ZXMudXJsbGliIGltcG9ydCBwYXJzZSBhcyB1cmxsaWJfcGFyc2UKZnJvbSBwaXAuX3ZlbmRvci5zaXgubW92ZXMgaW1wb3J0IGZpbHRlcmZhbHNlCgppbXBvcnQgcGlwCmZyb20gcGlwLmRvd25sb2FkIGltcG9ydCBnZXRfZmlsZV9jb250ZW50CmZyb20gcGlwLnJlcS5yZXFfaW5zdGFsbCBpbXBvcnQgSW5zdGFsbFJlcXVpcmVtZW50CmZyb20gcGlwLmV4Y2VwdGlvbnMgaW1wb3J0IChSZXF1aXJlbWVudHNGaWxlUGFyc2VFcnJvcikKZnJvbSBwaXAudXRpbHMuZGVwcmVjYXRpb24gaW1wb3J0IFJlbW92ZWRJblBpcDEwV2FybmluZwpmcm9tIHBpcCBpbXBvcnQgY21kb3B0aW9ucwoKX19hbGxfXyA9IFsncGFyc2VfcmVxdWlyZW1lbnRzJ10KClNDSEVNRV9SRSA9IHJlLmNvbXBpbGUocideKGh0dHB8aHR0cHN8ZmlsZSk6JywgcmUuSSkKQ09NTUVOVF9SRSA9IHJlLmNvbXBpbGUocicoXnxccykrIy4qJCcpCgpTVVBQT1JURURfT1BUSU9OUyA9IFsKICAgIGNtZG9wdGlvbnMuY29uc3RyYWludHMsCiAgICBjbWRvcHRpb25zLmVkaXRhYmxlLAogICAgY21kb3B0aW9ucy5yZXF1aXJlbWVudHMsCiAgICBjbWRvcHRpb25zLm5vX2luZGV4LAogICAgY21kb3B0aW9ucy5pbmRleF91cmwsCiAgICBjbWRvcHRpb25zLmZpbmRfbGlua3MsCiAgICBjbWRvcHRpb25zLmV4dHJhX2luZGV4X3VybCwKICAgIGNtZG9wdGlvbnMuYWxsb3dfZXh0ZXJuYWwsCiAgICBjbWRvcHRpb25zLmFsbG93X2FsbF9leHRlcm5hbCwKICAgIGNtZG9wdGlvbnMubm9fYWxsb3dfZXh0ZXJuYWwsCiAgICBjbWRvcHRpb25zLmFsbG93X3Vuc2FmZSwKICAgIGNtZG9wdGlvbnMubm9fYWxsb3dfdW5zYWZlLAogICAgY21kb3B0aW9ucy51c2Vfd2hlZWwsCiAgICBjbWRvcHRpb25zLm5vX3VzZV93aGVlbCwKICAgIGNtZG9wdGlvbnMuYWx3YXlzX3VuemlwLAogICAgY21kb3B0aW9ucy5ub19iaW5hcnksCiAgICBjbWRvcHRpb25zLm9ubHlfYmluYXJ5LAogICAgY21kb3B0aW9ucy5wcmUsCiAgICBjbWRvcHRpb25zLnByb2Nlc3NfZGVwZW5kZW5jeV9saW5rcywKICAgIGNtZG9wdGlvbnMudHJ1c3RlZF9ob3N0LAogICAgY21kb3B0aW9ucy5yZXF1aXJlX2hhc2hlcywKXQoKIyBvcHRpb25zIHRvIGJlIHBhc3NlZCB0byByZXF1aXJlbWVudHMKU1VQUE9SVEVEX09QVElPTlNfUkVRID0gWwogICAgY21kb3B0aW9ucy5pbnN0YWxsX29wdGlvbnMsCiAgICBjbWRvcHRpb25zLmdsb2JhbF9vcHRpb25zLAogICAgY21kb3B0aW9ucy5oYXNoLApdCgojIHRoZSAnZGVzdCcgc3RyaW5nIHZhbHVlcwpTVVBQT1JURURfT1BUSU9OU19SRVFfREVTVCA9IFtvKCkuZGVzdCBmb3IgbyBpbiBTVVBQT1JURURfT1BUSU9OU19SRVFdCgoKZGVmIHBhcnNlX3JlcXVpcmVtZW50cyhmaWxlbmFtZSwgZmluZGVyPU5vbmUsIGNvbWVzX2Zyb209Tm9uZSwgb3B0aW9ucz1Ob25lLAogICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb249Tm9uZSwgY29uc3RyYWludD1GYWxzZSwgd2hlZWxfY2FjaGU9Tm9uZSk6CiAgICAiIiJQYXJzZSBhIHJlcXVpcmVtZW50cyBmaWxlIGFuZCB5aWVsZCBJbnN0YWxsUmVxdWlyZW1lbnQgaW5zdGFuY2VzLgoKICAgIDpwYXJhbSBmaWxlbmFtZTogICAgUGF0aCBvciB1cmwgb2YgcmVxdWlyZW1lbnRzIGZpbGUuCiAgICA6cGFyYW0gZmluZGVyOiAgICAgIEluc3RhbmNlIG9mIHBpcC5pbmRleC5QYWNrYWdlRmluZGVyLgogICAgOnBhcmFtIGNvbWVzX2Zyb206ICBPcmlnaW4gZGVzY3JpcHRpb24gb2YgcmVxdWlyZW1lbnRzLgogICAgOnBhcmFtIG9wdGlvbnM6ICAgICBjbGkgb3B0aW9ucy4KICAgIDpwYXJhbSBzZXNzaW9uOiAgICAgSW5zdGFuY2Ugb2YgcGlwLmRvd25sb2FkLlBpcFNlc3Npb24uCiAgICA6cGFyYW0gY29uc3RyYWludDogIElmIHRydWUsIHBhcnNpbmcgYSBjb25zdHJhaW50IGZpbGUgcmF0aGVyIHRoYW4KICAgICAgICByZXF1aXJlbWVudHMgZmlsZS4KICAgIDpwYXJhbSB3aGVlbF9jYWNoZTogSW5zdGFuY2Ugb2YgcGlwLndoZWVsLldoZWVsQ2FjaGUKICAgICIiIgogICAgaWYgc2Vzc2lvbiBpcyBOb25lOgogICAgICAgIHJhaXNlIFR5cGVFcnJvcigKICAgICAgICAgICAgInBhcnNlX3JlcXVpcmVtZW50cygpIG1pc3NpbmcgMSByZXF1aXJlZCBrZXl3b3JkIGFyZ3VtZW50OiAiCiAgICAgICAgICAgICInc2Vzc2lvbiciCiAgICAgICAgKQoKICAgIF8sIGNvbnRlbnQgPSBnZXRfZmlsZV9jb250ZW50KAogICAgICAgIGZpbGVuYW1lLCBjb21lc19mcm9tPWNvbWVzX2Zyb20sIHNlc3Npb249c2Vzc2lvbgogICAgKQoKICAgIGxpbmVzX2VudW0gPSBwcmVwcm9jZXNzKGNvbnRlbnQsIG9wdGlvbnMpCgogICAgZm9yIGxpbmVfbnVtYmVyLCBsaW5lIGluIGxpbmVzX2VudW06CiAgICAgICAgcmVxX2l0ZXIgPSBwcm9jZXNzX2xpbmUobGluZSwgZmlsZW5hbWUsIGxpbmVfbnVtYmVyLCBmaW5kZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tZXNfZnJvbSwgb3B0aW9ucywgc2Vzc2lvbiwgd2hlZWxfY2FjaGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludD1jb25zdHJhaW50KQogICAgICAgIGZvciByZXEgaW4gcmVxX2l0ZXI6CiAgICAgICAgICAgIHlpZWxkIHJlcQoKCmRlZiBwcmVwcm9jZXNzKGNvbnRlbnQsIG9wdGlvbnMpOgogICAgIiIiU3BsaXQsIGZpbHRlciwgYW5kIGpvaW4gbGluZXMsIGFuZCByZXR1cm4gYSBsaW5lIGl0ZXJhdG9yCgogICAgOnBhcmFtIGNvbnRlbnQ6IHRoZSBjb250ZW50IG9mIHRoZSByZXF1aXJlbWVudHMgZmlsZQogICAgOnBhcmFtIG9wdGlvbnM6IGNsaSBvcHRpb25zCiAgICAiIiIKICAgIGxpbmVzX2VudW0gPSBlbnVtZXJhdGUoY29udGVudC5zcGxpdGxpbmVzKCksIHN0YXJ0PTEpCiAgICBsaW5lc19lbnVtID0gam9pbl9saW5lcyhsaW5lc19lbnVtKQogICAgbGluZXNfZW51bSA9IGlnbm9yZV9jb21tZW50cyhsaW5lc19lbnVtKQogICAgbGluZXNfZW51bSA9IHNraXBfcmVnZXgobGluZXNfZW51bSwgb3B0aW9ucykKICAgIHJldHVybiBsaW5lc19lbnVtCgoKZGVmIHByb2Nlc3NfbGluZShsaW5lLCBmaWxlbmFtZSwgbGluZV9udW1iZXIsIGZpbmRlcj1Ob25lLCBjb21lc19mcm9tPU5vbmUsCiAgICAgICAgICAgICAgICAgb3B0aW9ucz1Ob25lLCBzZXNzaW9uPU5vbmUsIHdoZWVsX2NhY2hlPU5vbmUsCiAgICAgICAgICAgICAgICAgY29uc3RyYWludD1GYWxzZSk6CiAgICAiIiJQcm9jZXNzIGEgc2luZ2xlIHJlcXVpcmVtZW50cyBsaW5lOyBUaGlzIGNhbiByZXN1bHQgaW4gY3JlYXRpbmcveWllbGRpbmcKICAgIHJlcXVpcmVtZW50cywgb3IgdXBkYXRpbmcgdGhlIGZpbmRlci4KCiAgICBGb3IgbGluZXMgdGhhdCBjb250YWluIHJlcXVpcmVtZW50cywgdGhlIG9ubHkgb3B0aW9ucyB0aGF0IGhhdmUgYW4gZWZmZWN0CiAgICBhcmUgZnJvbSBTVVBQT1JURURfT1BUSU9OU19SRVEsIGFuZCB0aGV5IGFyZSBzY29wZWQgdG8gdGhlCiAgICByZXF1aXJlbWVudC4gT3RoZXIgb3B0aW9ucyBmcm9tIFNVUFBPUlRFRF9PUFRJT05TIG1heSBiZSBwcmVzZW50LCBidXQgYXJlCiAgICBpZ25vcmVkLgoKICAgIEZvciBsaW5lcyB0aGF0IGRvIG5vdCBjb250YWluIHJlcXVpcmVtZW50cywgdGhlIG9ubHkgb3B0aW9ucyB0aGF0IGhhdmUgYW4KICAgIGVmZmVjdCBhcmUgZnJvbSBTVVBQT1JURURfT1BUSU9OUy4gT3B0aW9ucyBmcm9tIFNVUFBPUlRFRF9PUFRJT05TX1JFUSBtYXkKICAgIGJlIHByZXNlbnQsIGJ1dCBhcmUgaWdub3JlZC4gVGhlc2UgbGluZXMgbWF5IGNvbnRhaW4gbXVsdGlwbGUgb3B0aW9ucwogICAgKGFsdGhvdWdoIG91ciBkb2NzIGltcGx5IG9ubHkgb25lIGlzIHN1cHBvcnRlZCksIGFuZCBhbGwgb3VyIHBhcnNlZCBhbmQKICAgIGFmZmVjdCB0aGUgZmluZGVyLgoKICAgIDpwYXJhbSBjb25zdHJhaW50OiBJZiBUcnVlLCBwYXJzaW5nIGEgY29uc3RyYWludHMgZmlsZS4KICAgIDpwYXJhbSBvcHRpb25zOiBPcHRpb25QYXJzZXIgb3B0aW9ucyB0aGF0IHdlIG1heSB1cGRhdGUKICAgICIiIgogICAgcGFyc2VyID0gYnVpbGRfcGFyc2VyKCkKICAgIGRlZmF1bHRzID0gcGFyc2VyLmdldF9kZWZhdWx0X3ZhbHVlcygpCiAgICBkZWZhdWx0cy5pbmRleF91cmwgPSBOb25lCiAgICBpZiBmaW5kZXI6CiAgICAgICAgIyBgZmluZGVyLmZvcm1hdF9jb250cm9sYCB3aWxsIGJlIHVwZGF0ZWQgZHVyaW5nIHBhcnNpbmcKICAgICAgICBkZWZhdWx0cy5mb3JtYXRfY29udHJvbCA9IGZpbmRlci5mb3JtYXRfY29udHJvbAogICAgYXJnc19zdHIsIG9wdGlvbnNfc3RyID0gYnJlYWtfYXJnc19vcHRpb25zKGxpbmUpCiAgICBpZiBzeXMudmVyc2lvbl9pbmZvIDwgKDIsIDcsIDMpOgogICAgICAgICMgUHJpb3IgdG8gMi43LjMsIHNobGV4IGNhbm5vdCBkZWFsIHdpdGggdW5pY29kZSBlbnRyaWVzCiAgICAgICAgb3B0aW9uc19zdHIgPSBvcHRpb25zX3N0ci5lbmNvZGUoJ3V0ZjgnKQogICAgb3B0cywgXyA9IHBhcnNlci5wYXJzZV9hcmdzKHNobGV4LnNwbGl0KG9wdGlvbnNfc3RyKSwgZGVmYXVsdHMpCgogICAgIyBwcmVzZXJ2ZSBmb3IgdGhlIG5lc3RlZCBjb2RlIHBhdGgKICAgIGxpbmVfY29tZXNfZnJvbSA9ICclcyAlcyAobGluZSAlcyknICUgKAogICAgICAgICctYycgaWYgY29uc3RyYWludCBlbHNlICctcicsIGZpbGVuYW1lLCBsaW5lX251bWJlcikKCiAgICAjIHlpZWxkIGEgbGluZSByZXF1aXJlbWVudAogICAgaWYgYXJnc19zdHI6CiAgICAgICAgaXNvbGF0ZWQgPSBvcHRpb25zLmlzb2xhdGVkX21vZGUgaWYgb3B0aW9ucyBlbHNlIEZhbHNlCiAgICAgICAgaWYgb3B0aW9uczoKICAgICAgICAgICAgY21kb3B0aW9ucy5jaGVja19pbnN0YWxsX2J1aWxkX2dsb2JhbChvcHRpb25zLCBvcHRzKQogICAgICAgICMgZ2V0IHRoZSBvcHRpb25zIHRoYXQgYXBwbHkgdG8gcmVxdWlyZW1lbnRzCiAgICAgICAgcmVxX29wdGlvbnMgPSB7fQogICAgICAgIGZvciBkZXN0IGluIFNVUFBPUlRFRF9PUFRJT05TX1JFUV9ERVNUOgogICAgICAgICAgICBpZiBkZXN0IGluIG9wdHMuX19kaWN0X18gYW5kIG9wdHMuX19kaWN0X19bZGVzdF06CiAgICAgICAgICAgICAgICByZXFfb3B0aW9uc1tkZXN0XSA9IG9wdHMuX19kaWN0X19bZGVzdF0KICAgICAgICB5aWVsZCBJbnN0YWxsUmVxdWlyZW1lbnQuZnJvbV9saW5lKAogICAgICAgICAgICBhcmdzX3N0ciwgbGluZV9jb21lc19mcm9tLCBjb25zdHJhaW50PWNvbnN0cmFpbnQsCiAgICAgICAgICAgIGlzb2xhdGVkPWlzb2xhdGVkLCBvcHRpb25zPXJlcV9vcHRpb25zLCB3aGVlbF9jYWNoZT13aGVlbF9jYWNoZQogICAgICAgICkKCiAgICAjIHlpZWxkIGFuIGVkaXRhYmxlIHJlcXVpcmVtZW50CiAgICBlbGlmIG9wdHMuZWRpdGFibGVzOgogICAgICAgIGlzb2xhdGVkID0gb3B0aW9ucy5pc29sYXRlZF9tb2RlIGlmIG9wdGlvbnMgZWxzZSBGYWxzZQogICAgICAgIGRlZmF1bHRfdmNzID0gb3B0aW9ucy5kZWZhdWx0X3ZjcyBpZiBvcHRpb25zIGVsc2UgTm9uZQogICAgICAgIHlpZWxkIEluc3RhbGxSZXF1aXJlbWVudC5mcm9tX2VkaXRhYmxlKAogICAgICAgICAgICBvcHRzLmVkaXRhYmxlc1swXSwgY29tZXNfZnJvbT1saW5lX2NvbWVzX2Zyb20sCiAgICAgICAgICAgIGNvbnN0cmFpbnQ9Y29uc3RyYWludCwgZGVmYXVsdF92Y3M9ZGVmYXVsdF92Y3MsIGlzb2xhdGVkPWlzb2xhdGVkLAogICAgICAgICAgICB3aGVlbF9jYWNoZT13aGVlbF9jYWNoZQogICAgICAgICkKCiAgICAjIHBhcnNlIGEgbmVzdGVkIHJlcXVpcmVtZW50cyBmaWxlCiAgICBlbGlmIG9wdHMucmVxdWlyZW1lbnRzIG9yIG9wdHMuY29uc3RyYWludHM6CiAgICAgICAgaWYgb3B0cy5yZXF1aXJlbWVudHM6CiAgICAgICAgICAgIHJlcV9wYXRoID0gb3B0cy5yZXF1aXJlbWVudHNbMF0KICAgICAgICAgICAgbmVzdGVkX2NvbnN0cmFpbnQgPSBGYWxzZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJlcV9wYXRoID0gb3B0cy5jb25zdHJhaW50c1swXQogICAgICAgICAgICBuZXN0ZWRfY29uc3RyYWludCA9IFRydWUKICAgICAgICAjIG9yaWdpbmFsIGZpbGUgaXMgb3ZlciBodHRwCiAgICAgICAgaWYgU0NIRU1FX1JFLnNlYXJjaChmaWxlbmFtZSk6CiAgICAgICAgICAgICMgZG8gYSB1cmwgam9pbiBzbyByZWxhdGl2ZSBwYXRocyB3b3JrCiAgICAgICAgICAgIHJlcV9wYXRoID0gdXJsbGliX3BhcnNlLnVybGpvaW4oZmlsZW5hbWUsIHJlcV9wYXRoKQogICAgICAgICMgb3JpZ2luYWwgZmlsZSBhbmQgbmVzdGVkIGZpbGUgYXJlIHBhdGhzCiAgICAgICAgZWxpZiBub3QgU0NIRU1FX1JFLnNlYXJjaChyZXFfcGF0aCk6CiAgICAgICAgICAgICMgZG8gYSBqb2luIHNvIHJlbGF0aXZlIHBhdGhzIHdvcmsKICAgICAgICAgICAgcmVxX3BhdGggPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKGZpbGVuYW1lKSwgcmVxX3BhdGgpCiAgICAgICAgIyBUT0RPOiBXaHkgbm90IHVzZSBgY29tZXNfZnJvbT0nLXIge30gKGxpbmUge30pJ2AgaGVyZSBhcyB3ZWxsPwogICAgICAgIHBhcnNlciA9IHBhcnNlX3JlcXVpcmVtZW50cygKICAgICAgICAgICAgcmVxX3BhdGgsIGZpbmRlciwgY29tZXNfZnJvbSwgb3B0aW9ucywgc2Vzc2lvbiwKICAgICAgICAgICAgY29uc3RyYWludD1uZXN0ZWRfY29uc3RyYWludCwgd2hlZWxfY2FjaGU9d2hlZWxfY2FjaGUKICAgICAgICApCiAgICAgICAgZm9yIHJlcSBpbiBwYXJzZXI6CiAgICAgICAgICAgIHlpZWxkIHJlcQoKICAgICMgcGVyY29sYXRlIGhhc2gtY2hlY2tpbmcgb3B0aW9uIHVwd2FyZAogICAgZWxpZiBvcHRzLnJlcXVpcmVfaGFzaGVzOgogICAgICAgIG9wdGlvbnMucmVxdWlyZV9oYXNoZXMgPSBvcHRzLnJlcXVpcmVfaGFzaGVzCgogICAgIyBzZXQgZmluZGVyIG9wdGlvbnMKICAgIGVsaWYgZmluZGVyOgogICAgICAgIGlmIG9wdHMuYWxsb3dfZXh0ZXJuYWw6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICAgICAiLS1hbGxvdy1leHRlcm5hbCBoYXMgYmVlbiBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gIgogICAgICAgICAgICAgICAgInRoZSBmdXR1cmUuIER1ZSB0byBjaGFuZ2VzIGluIHRoZSByZXBvc2l0b3J5IHByb3RvY29sLCBpdCBubyAiCiAgICAgICAgICAgICAgICAibG9uZ2VyIGhhcyBhbnkgZWZmZWN0LiIsCiAgICAgICAgICAgICAgICBSZW1vdmVkSW5QaXAxMFdhcm5pbmcsCiAgICAgICAgICAgICkKCiAgICAgICAgaWYgb3B0cy5hbGxvd19hbGxfZXh0ZXJuYWw6CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCiAgICAgICAgICAgICAgICAiLS1hbGxvdy1hbGwtZXh0ZXJuYWwgaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkICIKICAgICAgICAgICAgICAgICJpbiB0aGUgZnV0dXJlLiBEdWUgdG8gY2hhbmdlcyBpbiB0aGUgcmVwb3NpdG9yeSBwcm90b2NvbCwgaXQgIgogICAgICAgICAgICAgICAgIm5vIGxvbmdlciBoYXMgYW55IGVmZmVjdC4iLAogICAgICAgICAgICAgICAgUmVtb3ZlZEluUGlwMTBXYXJuaW5nLAogICAgICAgICAgICApCgogICAgICAgIGlmIG9wdHMuYWxsb3dfdW52ZXJpZmllZDoKICAgICAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgICAgICItLWFsbG93LXVudmVyaWZpZWQgaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkICIKICAgICAgICAgICAgICAgICJpbiB0aGUgZnV0dXJlLiBEdWUgdG8gY2hhbmdlcyBpbiB0aGUgcmVwb3NpdG9yeSBwcm90b2NvbCwgaXQgIgogICAgICAgICAgICAgICAgIm5vIGxvbmdlciBoYXMgYW55IGVmZmVjdC4iLAogICAgICAgICAgICAgICAgUmVtb3ZlZEluUGlwMTBXYXJuaW5nLAogICAgICAgICAgICApCgogICAgICAgIGlmIG9wdHMuaW5kZXhfdXJsOgogICAgICAgICAgICBmaW5kZXIuaW5kZXhfdXJscyA9IFtvcHRzLmluZGV4X3VybF0KICAgICAgICBpZiBvcHRzLnVzZV93aGVlbCBpcyBGYWxzZToKICAgICAgICAgICAgZmluZGVyLnVzZV93aGVlbCA9IEZhbHNlCiAgICAgICAgICAgIHBpcC5pbmRleC5mbXRfY3RsX25vX3VzZV93aGVlbChmaW5kZXIuZm9ybWF0X2NvbnRyb2wpCiAgICAgICAgaWYgb3B0cy5ub19pbmRleCBpcyBUcnVlOgogICAgICAgICAgICBmaW5kZXIuaW5kZXhfdXJscyA9IFtdCiAgICAgICAgaWYgb3B0cy5leHRyYV9pbmRleF91cmxzOgogICAgICAgICAgICBmaW5kZXIuaW5kZXhfdXJscy5leHRlbmQob3B0cy5leHRyYV9pbmRleF91cmxzKQogICAgICAgIGlmIG9wdHMuZmluZF9saW5rczoKICAgICAgICAgICAgIyBGSVhNRTogaXQgd291bGQgYmUgbmljZSB0byBrZWVwIHRyYWNrIG9mIHRoZSBzb3VyY2UKICAgICAgICAgICAgIyBvZiB0aGUgZmluZF9saW5rczogc3VwcG9ydCBhIGZpbmQtbGlua3MgbG9jYWwgcGF0aAogICAgICAgICAgICAjIHJlbGF0aXZlIHRvIGEgcmVxdWlyZW1lbnRzIGZpbGUuCiAgICAgICAgICAgIHZhbHVlID0gb3B0cy5maW5kX2xpbmtzWzBdCiAgICAgICAgICAgIHJlcV9kaXIgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5hYnNwYXRoKGZpbGVuYW1lKSkKICAgICAgICAgICAgcmVsYXRpdmVfdG9fcmVxc19maWxlID0gb3MucGF0aC5qb2luKHJlcV9kaXIsIHZhbHVlKQogICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhyZWxhdGl2ZV90b19yZXFzX2ZpbGUpOgogICAgICAgICAgICAgICAgdmFsdWUgPSByZWxhdGl2ZV90b19yZXFzX2ZpbGUKICAgICAgICAgICAgZmluZGVyLmZpbmRfbGlua3MuYXBwZW5kKHZhbHVlKQogICAgICAgIGlmIG9wdHMucHJlOgogICAgICAgICAgICBmaW5kZXIuYWxsb3dfYWxsX3ByZXJlbGVhc2VzID0gVHJ1ZQogICAgICAgIGlmIG9wdHMucHJvY2Vzc19kZXBlbmRlbmN5X2xpbmtzOgogICAgICAgICAgICBmaW5kZXIucHJvY2Vzc19kZXBlbmRlbmN5X2xpbmtzID0gVHJ1ZQogICAgICAgIGlmIG9wdHMudHJ1c3RlZF9ob3N0czoKICAgICAgICAgICAgZmluZGVyLnNlY3VyZV9vcmlnaW5zLmV4dGVuZCgKICAgICAgICAgICAgICAgICgiKiIsIGhvc3QsICIqIikgZm9yIGhvc3QgaW4gb3B0cy50cnVzdGVkX2hvc3RzKQoKCmRlZiBicmVha19hcmdzX29wdGlvbnMobGluZSk6CiAgICAiIiJCcmVhayB1cCB0aGUgbGluZSBpbnRvIGFuIGFyZ3MgYW5kIG9wdGlvbnMgc3RyaW5nLiAgV2Ugb25seSB3YW50IHRvIHNobGV4CiAgICAoYW5kIHRoZW4gb3B0cGFyc2UpIHRoZSBvcHRpb25zLCBub3QgdGhlIGFyZ3MuICBhcmdzIGNhbiBjb250YWluIG1hcmtlcnMKICAgIHdoaWNoIGFyZSBjb3JydXB0ZWQgYnkgc2hsZXguCiAgICAiIiIKICAgIHRva2VucyA9IGxpbmUuc3BsaXQoJyAnKQogICAgYXJncyA9IFtdCiAgICBvcHRpb25zID0gdG9rZW5zWzpdCiAgICBmb3IgdG9rZW4gaW4gdG9rZW5zOgogICAgICAgIGlmIHRva2VuLnN0YXJ0c3dpdGgoJy0nKSBvciB0b2tlbi5zdGFydHN3aXRoKCctLScpOgogICAgICAgICAgICBicmVhawogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGFyZ3MuYXBwZW5kKHRva2VuKQogICAgICAgICAgICBvcHRpb25zLnBvcCgwKQogICAgcmV0dXJuICcgJy5qb2luKGFyZ3MpLCAnICcuam9pbihvcHRpb25zKQoKCmRlZiBidWlsZF9wYXJzZXIoKToKICAgICIiIgogICAgUmV0dXJuIGEgcGFyc2VyIGZvciBwYXJzaW5nIHJlcXVpcmVtZW50IGxpbmVzCiAgICAiIiIKICAgIHBhcnNlciA9IG9wdHBhcnNlLk9wdGlvblBhcnNlcihhZGRfaGVscF9vcHRpb249RmFsc2UpCgogICAgb3B0aW9uX2ZhY3RvcmllcyA9IFNVUFBPUlRFRF9PUFRJT05TICsgU1VQUE9SVEVEX09QVElPTlNfUkVRCiAgICBmb3Igb3B0aW9uX2ZhY3RvcnkgaW4gb3B0aW9uX2ZhY3RvcmllczoKICAgICAgICBvcHRpb24gPSBvcHRpb25fZmFjdG9yeSgpCiAgICAgICAgcGFyc2VyLmFkZF9vcHRpb24ob3B0aW9uKQoKICAgICMgQnkgZGVmYXVsdCBvcHRwYXJzZSBzeXMuZXhpdHMgb24gcGFyc2luZyBlcnJvcnMuIFdlIHdhbnQgdG8gd3JhcAogICAgIyB0aGF0IGluIG91ciBvd24gZXhjZXB0aW9uLgogICAgZGVmIHBhcnNlcl9leGl0KHNlbGYsIG1zZyk6CiAgICAgICAgcmFpc2UgUmVxdWlyZW1lbnRzRmlsZVBhcnNlRXJyb3IobXNnKQogICAgcGFyc2VyLmV4aXQgPSBwYXJzZXJfZXhpdAoKICAgIHJldHVybiBwYXJzZXIKCgpkZWYgam9pbl9saW5lcyhsaW5lc19lbnVtKToKICAgICIiIkpvaW5zIGEgbGluZSBlbmRpbmcgaW4gJ1wnIHdpdGggdGhlIHByZXZpb3VzIGxpbmUgKGV4Y2VwdCB3aGVuIGZvbGxvd2luZwogICAgY29tbWVudHMpLiAgVGhlIGpvaW5lZCBsaW5lIHRha2VzIG9uIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgbGluZS4KICAgICIiIgogICAgcHJpbWFyeV9saW5lX251bWJlciA9IE5vbmUKICAgIG5ld19saW5lID0gW10KICAgIGZvciBsaW5lX251bWJlciwgbGluZSBpbiBsaW5lc19lbnVtOgogICAgICAgIGlmIG5vdCBsaW5lLmVuZHN3aXRoKCdcXCcpIG9yIENPTU1FTlRfUkUubWF0Y2gobGluZSk6CiAgICAgICAgICAgIGlmIENPTU1FTlRfUkUubWF0Y2gobGluZSk6CiAgICAgICAgICAgICAgICAjIHRoaXMgZW5zdXJlcyBjb21tZW50cyBhcmUgYWx3YXlzIG1hdGNoZWQgbGF0ZXIKICAgICAgICAgICAgICAgIGxpbmUgPSAnICcgKyBsaW5lCiAgICAgICAgICAgIGlmIG5ld19saW5lOgogICAgICAgICAgICAgICAgbmV3X2xpbmUuYXBwZW5kKGxpbmUpCiAgICAgICAgICAgICAgICB5aWVsZCBwcmltYXJ5X2xpbmVfbnVtYmVyLCAnJy5qb2luKG5ld19saW5lKQogICAgICAgICAgICAgICAgbmV3X2xpbmUgPSBbXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgeWllbGQgbGluZV9udW1iZXIsIGxpbmUKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBub3QgbmV3X2xpbmU6CiAgICAgICAgICAgICAgICBwcmltYXJ5X2xpbmVfbnVtYmVyID0gbGluZV9udW1iZXIKICAgICAgICAgICAgbmV3X2xpbmUuYXBwZW5kKGxpbmUuc3RyaXAoJ1xcJykpCgogICAgIyBsYXN0IGxpbmUgY29udGFpbnMgXAogICAgaWYgbmV3X2xpbmU6CiAgICAgICAgeWllbGQgcHJpbWFyeV9saW5lX251bWJlciwgJycuam9pbihuZXdfbGluZSkKCiAgICAjIFRPRE86IGhhbmRsZSBzcGFjZSBhZnRlciAnXCcuCgoKZGVmIGlnbm9yZV9jb21tZW50cyhsaW5lc19lbnVtKToKICAgICIiIgogICAgU3RyaXBzIGNvbW1lbnRzIGFuZCBmaWx0ZXIgZW1wdHkgbGluZXMuCiAgICAiIiIKICAgIGZvciBsaW5lX251bWJlciwgbGluZSBpbiBsaW5lc19lbnVtOgogICAgICAgIGxpbmUgPSBDT01NRU5UX1JFLnN1YignJywgbGluZSkKICAgICAgICBsaW5lID0gbGluZS5zdHJpcCgpCiAgICAgICAgaWYgbGluZToKICAgICAgICAgICAgeWllbGQgbGluZV9udW1iZXIsIGxpbmUKCgpkZWYgc2tpcF9yZWdleChsaW5lc19lbnVtLCBvcHRpb25zKToKICAgICIiIgogICAgU2tpcCBsaW5lcyB0aGF0IG1hdGNoICctLXNraXAtcmVxdWlyZW1lbnRzLXJlZ2V4JyBwYXR0ZXJuCgogICAgTm90ZTogdGhlIHJlZ2V4IHBhdHRlcm4gaXMgb25seSBidWlsdCBvbmNlCiAgICAiIiIKICAgIHNraXBfcmVnZXggPSBvcHRpb25zLnNraXBfcmVxdWlyZW1lbnRzX3JlZ2V4IGlmIG9wdGlvbnMgZWxzZSBOb25lCiAgICBpZiBza2lwX3JlZ2V4OgogICAgICAgIHBhdHRlcm4gPSByZS5jb21waWxlKHNraXBfcmVnZXgpCiAgICAgICAgbGluZXNfZW51bSA9IGZpbHRlcmZhbHNlKAogICAgICAgICAgICBsYW1iZGEgZTogcGF0dGVybi5zZWFyY2goZVsxXSksCiAgICAgICAgICAgIGxpbmVzX2VudW0pCiAgICByZXR1cm4gbGluZXNfZW51bQpQSwMEFAAAAAAAAAAhAIFtVcOXtQAAl7UAACYAAABweXBpX19waXBfOV8wXzMvcGlwL3JlcS9yZXFfaW5zdGFsbC5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgbG9nZ2luZwppbXBvcnQgb3MKaW1wb3J0IHJlCmltcG9ydCBzaHV0aWwKaW1wb3J0IHN5cwppbXBvcnQgdGVtcGZpbGUKaW1wb3J0IHRyYWNlYmFjawppbXBvcnQgd2FybmluZ3MKaW1wb3J0IHppcGZpbGUKCmZyb20gZGlzdHV0aWxzIGltcG9ydCBzeXNjb25maWcKZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgY2hhbmdlX3Jvb3QKZnJvbSBlbWFpbC5wYXJzZXIgaW1wb3J0IEZlZWRQYXJzZXIKCmZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IHBrZ19yZXNvdXJjZXMsIHNpeApmcm9tIHBpcC5fdmVuZG9yLnBhY2thZ2luZyBpbXBvcnQgc3BlY2lmaWVycwpmcm9tIHBpcC5fdmVuZG9yLnBhY2thZ2luZy5tYXJrZXJzIGltcG9ydCBNYXJrZXIKZnJvbSBwaXAuX3ZlbmRvci5wYWNrYWdpbmcucmVxdWlyZW1lbnRzIGltcG9ydCBJbnZhbGlkUmVxdWlyZW1lbnQsIFJlcXVpcmVtZW50CmZyb20gcGlwLl92ZW5kb3IucGFja2FnaW5nLnV0aWxzIGltcG9ydCBjYW5vbmljYWxpemVfbmFtZQpmcm9tIHBpcC5fdmVuZG9yLnBhY2thZ2luZy52ZXJzaW9uIGltcG9ydCBWZXJzaW9uLCBwYXJzZSBhcyBwYXJzZV92ZXJzaW9uCmZyb20gcGlwLl92ZW5kb3Iuc2l4Lm1vdmVzIGltcG9ydCBjb25maWdwYXJzZXIKCmltcG9ydCBwaXAud2hlZWwKCmZyb20gcGlwLmNvbXBhdCBpbXBvcnQgbmF0aXZlX3N0ciwgZ2V0X3N0ZGxpYiwgV0lORE9XUwpmcm9tIHBpcC5kb3dubG9hZCBpbXBvcnQgaXNfdXJsLCB1cmxfdG9fcGF0aCwgcGF0aF90b191cmwsIGlzX2FyY2hpdmVfZmlsZQpmcm9tIHBpcC5leGNlcHRpb25zIGltcG9ydCAoCiAgICBJbnN0YWxsYXRpb25FcnJvciwgVW5pbnN0YWxsYXRpb25FcnJvciwKKQpmcm9tIHBpcC5sb2NhdGlvbnMgaW1wb3J0ICgKICAgIGJpbl9weSwgcnVubmluZ191bmRlcl92aXJ0dWFsZW52LCBQSVBfREVMRVRFX01BUktFUl9GSUxFTkFNRSwgYmluX3VzZXIsCikKZnJvbSBwaXAudXRpbHMgaW1wb3J0ICgKICAgIGRpc3BsYXlfcGF0aCwgcm10cmVlLCBhc2tfcGF0aF9leGlzdHMsIGJhY2t1cF9kaXIsIGlzX2luc3RhbGxhYmxlX2RpciwKICAgIGRpc3RfaW5fdXNlcnNpdGUsIGRpc3RfaW5fc2l0ZV9wYWNrYWdlcywgZWdnX2xpbmtfcGF0aCwKICAgIGNhbGxfc3VicHJvY2VzcywgcmVhZF90ZXh0X2ZpbGUsIEZha2VGaWxlLCBfbWFrZV9idWlsZF9kaXIsIGVuc3VyZV9kaXIsCiAgICBnZXRfaW5zdGFsbGVkX3ZlcnNpb24sIG5vcm1hbGl6ZV9wYXRoLCBkaXN0X2lzX2xvY2FsLAopCgpmcm9tIHBpcC51dGlscy5oYXNoZXMgaW1wb3J0IEhhc2hlcwpmcm9tIHBpcC51dGlscy5kZXByZWNhdGlvbiBpbXBvcnQgUmVtb3ZlZEluUGlwMTBXYXJuaW5nCmZyb20gcGlwLnV0aWxzLmxvZ2dpbmcgaW1wb3J0IGluZGVudF9sb2cKZnJvbSBwaXAudXRpbHMuc2V0dXB0b29sc19idWlsZCBpbXBvcnQgU0VUVVBUT09MU19TSElNCmZyb20gcGlwLnV0aWxzLnVpIGltcG9ydCBvcGVuX3NwaW5uZXIKZnJvbSBwaXAucmVxLnJlcV91bmluc3RhbGwgaW1wb3J0IFVuaW5zdGFsbFBhdGhTZXQKZnJvbSBwaXAudmNzIGltcG9ydCB2Y3MKZnJvbSBwaXAud2hlZWwgaW1wb3J0IG1vdmVfd2hlZWxfZmlsZXMsIFdoZWVsCgoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgpvcGVyYXRvcnMgPSBzcGVjaWZpZXJzLlNwZWNpZmllci5fb3BlcmF0b3JzLmtleXMoKQoKCmRlZiBfc3RyaXBfZXh0cmFzKHBhdGgpOgogICAgbSA9IHJlLm1hdGNoKHInXiguKykoXFtbXlxdXStcXSkkJywgcGF0aCkKICAgIGV4dHJhcyA9IE5vbmUKICAgIGlmIG06CiAgICAgICAgcGF0aF9ub19leHRyYXMgPSBtLmdyb3VwKDEpCiAgICAgICAgZXh0cmFzID0gbS5ncm91cCgyKQogICAgZWxzZToKICAgICAgICBwYXRoX25vX2V4dHJhcyA9IHBhdGgKCiAgICByZXR1cm4gcGF0aF9ub19leHRyYXMsIGV4dHJhcwoKCmRlZiBfc2FmZV9leHRyYXMoZXh0cmFzKToKICAgIHJldHVybiBzZXQocGtnX3Jlc291cmNlcy5zYWZlX2V4dHJhKGV4dHJhKSBmb3IgZXh0cmEgaW4gZXh0cmFzKQoKCmNsYXNzIEluc3RhbGxSZXF1aXJlbWVudChvYmplY3QpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCByZXEsIGNvbWVzX2Zyb20sIHNvdXJjZV9kaXI9Tm9uZSwgZWRpdGFibGU9RmFsc2UsCiAgICAgICAgICAgICAgICAgbGluaz1Ob25lLCBhc19lZ2c9RmFsc2UsIHVwZGF0ZT1UcnVlLAogICAgICAgICAgICAgICAgIHB5Y29tcGlsZT1UcnVlLCBtYXJrZXJzPU5vbmUsIGlzb2xhdGVkPUZhbHNlLCBvcHRpb25zPU5vbmUsCiAgICAgICAgICAgICAgICAgd2hlZWxfY2FjaGU9Tm9uZSwgY29uc3RyYWludD1GYWxzZSk6CiAgICAgICAgc2VsZi5leHRyYXMgPSAoKQogICAgICAgIGlmIGlzaW5zdGFuY2UocmVxLCBzaXguc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmVxID0gUmVxdWlyZW1lbnQocmVxKQogICAgICAgICAgICBleGNlcHQgSW52YWxpZFJlcXVpcmVtZW50OgogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5zZXAgaW4gcmVxOgogICAgICAgICAgICAgICAgICAgIGFkZF9tc2cgPSAiSXQgbG9va3MgbGlrZSBhIHBhdGguIERvZXMgaXQgZXhpc3QgPyIKICAgICAgICAgICAgICAgIGVsaWYgJz0nIGluIHJlcSBhbmQgbm90IGFueShvcCBpbiByZXEgZm9yIG9wIGluIG9wZXJhdG9ycyk6CiAgICAgICAgICAgICAgICAgICAgYWRkX21zZyA9ICI9IGlzIG5vdCBhIHZhbGlkIG9wZXJhdG9yLiBEaWQgeW91IG1lYW4gPT0gPyIKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgYWRkX21zZyA9IHRyYWNlYmFjay5mb3JtYXRfZXhjKCkKICAgICAgICAgICAgICAgIHJhaXNlIEluc3RhbGxhdGlvbkVycm9yKAogICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHJlcXVpcmVtZW50OiAnJXMnXG4lcyIgJSAocmVxLCBhZGRfbXNnKSkKICAgICAgICAgICAgc2VsZi5leHRyYXMgPSBfc2FmZV9leHRyYXMocmVxLmV4dHJhcykKCiAgICAgICAgc2VsZi5yZXEgPSByZXEKICAgICAgICBzZWxmLmNvbWVzX2Zyb20gPSBjb21lc19mcm9tCiAgICAgICAgc2VsZi5jb25zdHJhaW50ID0gY29uc3RyYWludAogICAgICAgIHNlbGYuc291cmNlX2RpciA9IHNvdXJjZV9kaXIKICAgICAgICBzZWxmLmVkaXRhYmxlID0gZWRpdGFibGUKCiAgICAgICAgc2VsZi5fd2hlZWxfY2FjaGUgPSB3aGVlbF9jYWNoZQogICAgICAgIHNlbGYubGluayA9IHNlbGYub3JpZ2luYWxfbGluayA9IGxpbmsKICAgICAgICBzZWxmLmFzX2VnZyA9IGFzX2VnZwogICAgICAgIGlmIG1hcmtlcnMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYubWFya2VycyA9IG1hcmtlcnMKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLm1hcmtlcnMgPSByZXEgYW5kIHJlcS5tYXJrZXIKICAgICAgICBzZWxmLl9lZ2dfaW5mb19wYXRoID0gTm9uZQogICAgICAgICMgVGhpcyBob2xkcyB0aGUgcGtnX3Jlc291cmNlcy5EaXN0cmlidXRpb24gb2JqZWN0IGlmIHRoaXMgcmVxdWlyZW1lbnQKICAgICAgICAjIGlzIGFscmVhZHkgYXZhaWxhYmxlOgogICAgICAgIHNlbGYuc2F0aXNmaWVkX2J5ID0gTm9uZQogICAgICAgICMgVGhpcyBob2xkIHRoZSBwa2dfcmVzb3VyY2VzLkRpc3RyaWJ1dGlvbiBvYmplY3QgaWYgdGhpcyByZXF1aXJlbWVudAogICAgICAgICMgY29uZmxpY3RzIHdpdGggYW5vdGhlciBpbnN0YWxsZWQgZGlzdHJpYnV0aW9uOgogICAgICAgIHNlbGYuY29uZmxpY3RzX3dpdGggPSBOb25lCiAgICAgICAgIyBUZW1wb3JhcnkgYnVpbGQgbG9jYXRpb24KICAgICAgICBzZWxmLl90ZW1wX2J1aWxkX2RpciA9IE5vbmUKICAgICAgICAjIFVzZWQgdG8gc3RvcmUgdGhlIGdsb2JhbCBkaXJlY3Rvcnkgd2hlcmUgdGhlIF90ZW1wX2J1aWxkX2RpciBzaG91bGQKICAgICAgICAjIGhhdmUgYmVlbiBjcmVhdGVkLiBDZiBfY29ycmVjdF9idWlsZF9sb2NhdGlvbiBtZXRob2QuCiAgICAgICAgc2VsZi5faWRlYWxfYnVpbGRfZGlyID0gTm9uZQogICAgICAgICMgVHJ1ZSBpZiB0aGUgZWRpdGFibGUgc2hvdWxkIGJlIHVwZGF0ZWQ6CiAgICAgICAgc2VsZi51cGRhdGUgPSB1cGRhdGUKICAgICAgICAjIFNldCB0byBUcnVlIGFmdGVyIHN1Y2Nlc3NmdWwgaW5zdGFsbGF0aW9uCiAgICAgICAgc2VsZi5pbnN0YWxsX3N1Y2NlZWRlZCA9IE5vbmUKICAgICAgICAjIFVuaW5zdGFsbFBhdGhTZXQgb2YgdW5pbnN0YWxsZWQgZGlzdHJpYnV0aW9uIChmb3IgcG9zc2libGUgcm9sbGJhY2spCiAgICAgICAgc2VsZi51bmluc3RhbGxlZCA9IE5vbmUKICAgICAgICAjIFNldCBUcnVlIGlmIGEgbGVnaXRpbWF0ZSBkby1ub3RoaW5nLW9uLXVuaW5zdGFsbCBoYXMgaGFwcGVuZWQgLSBlLmcuCiAgICAgICAgIyBzeXN0ZW0gc2l0ZSBwYWNrYWdlcywgc3RkbGliIHBhY2thZ2VzLgogICAgICAgIHNlbGYubm90aGluZ190b191bmluc3RhbGwgPSBGYWxzZQogICAgICAgIHNlbGYudXNlX3VzZXJfc2l0ZSA9IEZhbHNlCiAgICAgICAgc2VsZi50YXJnZXRfZGlyID0gTm9uZQogICAgICAgIHNlbGYub3B0aW9ucyA9IG9wdGlvbnMgaWYgb3B0aW9ucyBlbHNlIHt9CiAgICAgICAgc2VsZi5weWNvbXBpbGUgPSBweWNvbXBpbGUKICAgICAgICAjIFNldCB0byBUcnVlIGFmdGVyIHN1Y2Nlc3NmdWwgcHJlcGFyYXRpb24gb2YgdGhpcyByZXF1aXJlbWVudAogICAgICAgIHNlbGYucHJlcGFyZWQgPSBGYWxzZQoKICAgICAgICBzZWxmLmlzb2xhdGVkID0gaXNvbGF0ZWQKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBmcm9tX2VkaXRhYmxlKGNscywgZWRpdGFibGVfcmVxLCBjb21lc19mcm9tPU5vbmUsIGRlZmF1bHRfdmNzPU5vbmUsCiAgICAgICAgICAgICAgICAgICAgICBpc29sYXRlZD1GYWxzZSwgb3B0aW9ucz1Ob25lLCB3aGVlbF9jYWNoZT1Ob25lLAogICAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludD1GYWxzZSk6CiAgICAgICAgZnJvbSBwaXAuaW5kZXggaW1wb3J0IExpbmsKCiAgICAgICAgbmFtZSwgdXJsLCBleHRyYXNfb3ZlcnJpZGUgPSBwYXJzZV9lZGl0YWJsZSgKICAgICAgICAgICAgZWRpdGFibGVfcmVxLCBkZWZhdWx0X3ZjcykKICAgICAgICBpZiB1cmwuc3RhcnRzd2l0aCgnZmlsZTonKToKICAgICAgICAgICAgc291cmNlX2RpciA9IHVybF90b19wYXRoKHVybCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzb3VyY2VfZGlyID0gTm9uZQoKICAgICAgICByZXMgPSBjbHMobmFtZSwgY29tZXNfZnJvbSwgc291cmNlX2Rpcj1zb3VyY2VfZGlyLAogICAgICAgICAgICAgICAgICBlZGl0YWJsZT1UcnVlLAogICAgICAgICAgICAgICAgICBsaW5rPUxpbmsodXJsKSwKICAgICAgICAgICAgICAgICAgY29uc3RyYWludD1jb25zdHJhaW50LAogICAgICAgICAgICAgICAgICBpc29sYXRlZD1pc29sYXRlZCwKICAgICAgICAgICAgICAgICAgb3B0aW9ucz1vcHRpb25zIGlmIG9wdGlvbnMgZWxzZSB7fSwKICAgICAgICAgICAgICAgICAgd2hlZWxfY2FjaGU9d2hlZWxfY2FjaGUpCgogICAgICAgIGlmIGV4dHJhc19vdmVycmlkZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmVzLmV4dHJhcyA9IF9zYWZlX2V4dHJhcyhleHRyYXNfb3ZlcnJpZGUpCgogICAgICAgIHJldHVybiByZXMKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBmcm9tX2xpbmUoCiAgICAgICAgICAgIGNscywgbmFtZSwgY29tZXNfZnJvbT1Ob25lLCBpc29sYXRlZD1GYWxzZSwgb3B0aW9ucz1Ob25lLAogICAgICAgICAgICB3aGVlbF9jYWNoZT1Ob25lLCBjb25zdHJhaW50PUZhbHNlKToKICAgICAgICAiIiJDcmVhdGVzIGFuIEluc3RhbGxSZXF1aXJlbWVudCBmcm9tIGEgbmFtZSwgd2hpY2ggbWlnaHQgYmUgYQogICAgICAgIHJlcXVpcmVtZW50LCBkaXJlY3RvcnkgY29udGFpbmluZyAnc2V0dXAucHknLCBmaWxlbmFtZSwgb3IgVVJMLgogICAgICAgICIiIgogICAgICAgIGZyb20gcGlwLmluZGV4IGltcG9ydCBMaW5rCgogICAgICAgIGlmIGlzX3VybChuYW1lKToKICAgICAgICAgICAgbWFya2VyX3NlcCA9ICc7ICcKICAgICAgICBlbHNlOgogICAgICAgICAgICBtYXJrZXJfc2VwID0gJzsnCiAgICAgICAgaWYgbWFya2VyX3NlcCBpbiBuYW1lOgogICAgICAgICAgICBuYW1lLCBtYXJrZXJzID0gbmFtZS5zcGxpdChtYXJrZXJfc2VwLCAxKQogICAgICAgICAgICBtYXJrZXJzID0gbWFya2Vycy5zdHJpcCgpCiAgICAgICAgICAgIGlmIG5vdCBtYXJrZXJzOgogICAgICAgICAgICAgICAgbWFya2VycyA9IE5vbmUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIG1hcmtlcnMgPSBNYXJrZXIobWFya2VycykKICAgICAgICBlbHNlOgogICAgICAgICAgICBtYXJrZXJzID0gTm9uZQogICAgICAgIG5hbWUgPSBuYW1lLnN0cmlwKCkKICAgICAgICByZXEgPSBOb25lCiAgICAgICAgcGF0aCA9IG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5hYnNwYXRoKG5hbWUpKQogICAgICAgIGxpbmsgPSBOb25lCiAgICAgICAgZXh0cmFzID0gTm9uZQoKICAgICAgICBpZiBpc191cmwobmFtZSk6CiAgICAgICAgICAgIGxpbmsgPSBMaW5rKG5hbWUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcCwgZXh0cmFzID0gX3N0cmlwX2V4dHJhcyhwYXRoKQogICAgICAgICAgICBpZiAob3MucGF0aC5pc2RpcihwKSBhbmQKICAgICAgICAgICAgICAgICAgICAob3MucGF0aC5zZXAgaW4gbmFtZSBvciBuYW1lLnN0YXJ0c3dpdGgoJy4nKSkpOgoKICAgICAgICAgICAgICAgIGlmIG5vdCBpc19pbnN0YWxsYWJsZV9kaXIocCk6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgSW5zdGFsbGF0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgICJEaXJlY3RvcnkgJXIgaXMgbm90IGluc3RhbGxhYmxlLiBGaWxlICdzZXR1cC5weScgIgogICAgICAgICAgICAgICAgICAgICAgICAibm90IGZvdW5kLiIgJSBuYW1lCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgbGluayA9IExpbmsocGF0aF90b191cmwocCkpCiAgICAgICAgICAgIGVsaWYgaXNfYXJjaGl2ZV9maWxlKHApOgogICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguaXNmaWxlKHApOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAnUmVxdWlyZW1lbnQgJXIgbG9va3MgbGlrZSBhIGZpbGVuYW1lLCBidXQgdGhlICcKICAgICAgICAgICAgICAgICAgICAgICAgJ2ZpbGUgZG9lcyBub3QgZXhpc3QnLAogICAgICAgICAgICAgICAgICAgICAgICBuYW1lCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgbGluayA9IExpbmsocGF0aF90b191cmwocCkpCgogICAgICAgICMgaXQncyBhIGxvY2FsIGZpbGUsIGRpciwgb3IgdXJsCiAgICAgICAgaWYgbGluazoKICAgICAgICAgICAgIyBIYW5kbGUgcmVsYXRpdmUgZmlsZSBVUkxzCiAgICAgICAgICAgIGlmIGxpbmsuc2NoZW1lID09ICdmaWxlJyBhbmQgcmUuc2VhcmNoKHInXC5cLi8nLCBsaW5rLnVybCk6CiAgICAgICAgICAgICAgICBsaW5rID0gTGluaygKICAgICAgICAgICAgICAgICAgICBwYXRoX3RvX3VybChvcy5wYXRoLm5vcm1wYXRoKG9zLnBhdGguYWJzcGF0aChsaW5rLnBhdGgpKSkpCiAgICAgICAgICAgICMgd2hlZWwgZmlsZQogICAgICAgICAgICBpZiBsaW5rLmlzX3doZWVsOgogICAgICAgICAgICAgICAgd2hlZWwgPSBXaGVlbChsaW5rLmZpbGVuYW1lKSAgIyBjYW4gcmFpc2UgSW52YWxpZFdoZWVsRmlsZW5hbWUKICAgICAgICAgICAgICAgIHJlcSA9ICIlcz09JXMiICUgKHdoZWVsLm5hbWUsIHdoZWVsLnZlcnNpb24pCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIHNldCB0aGUgcmVxIHRvIHRoZSBlZ2cgZnJhZ21lbnQuICB3aGVuIGl0J3Mgbm90IHRoZXJlLCB0aGlzCiAgICAgICAgICAgICAgICAjIHdpbGwgYmVjb21lIGFuICd1bm5hbWVkJyByZXF1aXJlbWVudAogICAgICAgICAgICAgICAgcmVxID0gbGluay5lZ2dfZnJhZ21lbnQKCiAgICAgICAgIyBhIHJlcXVpcmVtZW50IHNwZWNpZmllcgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJlcSA9IG5hbWUKCiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgaWYgb3B0aW9ucyBlbHNlIHt9CiAgICAgICAgcmVzID0gY2xzKHJlcSwgY29tZXNfZnJvbSwgbGluaz1saW5rLCBtYXJrZXJzPW1hcmtlcnMsCiAgICAgICAgICAgICAgICAgIGlzb2xhdGVkPWlzb2xhdGVkLCBvcHRpb25zPW9wdGlvbnMsCiAgICAgICAgICAgICAgICAgIHdoZWVsX2NhY2hlPXdoZWVsX2NhY2hlLCBjb25zdHJhaW50PWNvbnN0cmFpbnQpCgogICAgICAgIGlmIGV4dHJhczoKICAgICAgICAgICAgcmVzLmV4dHJhcyA9IF9zYWZlX2V4dHJhcygKICAgICAgICAgICAgICAgIFJlcXVpcmVtZW50KCdwbGFjZWhvbGRlcicgKyBleHRyYXMpLmV4dHJhcykKCiAgICAgICAgcmV0dXJuIHJlcwoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIGlmIHNlbGYucmVxOgogICAgICAgICAgICBzID0gc3RyKHNlbGYucmVxKQogICAgICAgICAgICBpZiBzZWxmLmxpbms6CiAgICAgICAgICAgICAgICBzICs9ICcgZnJvbSAlcycgJSBzZWxmLmxpbmsudXJsCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcyA9IHNlbGYubGluay51cmwgaWYgc2VsZi5saW5rIGVsc2UgTm9uZQogICAgICAgIGlmIHNlbGYuc2F0aXNmaWVkX2J5IGlzIG5vdCBOb25lOgogICAgICAgICAgICBzICs9ICcgaW4gJXMnICUgZGlzcGxheV9wYXRoKHNlbGYuc2F0aXNmaWVkX2J5LmxvY2F0aW9uKQogICAgICAgIGlmIHNlbGYuY29tZXNfZnJvbToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLmNvbWVzX2Zyb20sIHNpeC5zdHJpbmdfdHlwZXMpOgogICAgICAgICAgICAgICAgY29tZXNfZnJvbSA9IHNlbGYuY29tZXNfZnJvbQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgY29tZXNfZnJvbSA9IHNlbGYuY29tZXNfZnJvbS5mcm9tX3BhdGgoKQogICAgICAgICAgICBpZiBjb21lc19mcm9tOgogICAgICAgICAgICAgICAgcyArPSAnIChmcm9tICVzKScgJSBjb21lc19mcm9tCiAgICAgICAgcmV0dXJuIHMKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICc8JXMgb2JqZWN0OiAlcyBlZGl0YWJsZT0lcj4nICUgKAogICAgICAgICAgICBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc3RyKHNlbGYpLCBzZWxmLmVkaXRhYmxlKQoKICAgIGRlZiBwb3B1bGF0ZV9saW5rKHNlbGYsIGZpbmRlciwgdXBncmFkZSwgcmVxdWlyZV9oYXNoZXMpOgogICAgICAgICIiIkVuc3VyZSB0aGF0IGlmIGEgbGluayBjYW4gYmUgZm91bmQgZm9yIHRoaXMsIHRoYXQgaXQgaXMgZm91bmQuCgogICAgICAgIE5vdGUgdGhhdCBzZWxmLmxpbmsgbWF5IHN0aWxsIGJlIE5vbmUgLSBpZiBVcGdyYWRlIGlzIEZhbHNlIGFuZCB0aGUKICAgICAgICByZXF1aXJlbWVudCBpcyBhbHJlYWR5IGluc3RhbGxlZC4KCiAgICAgICAgSWYgcmVxdWlyZV9oYXNoZXMgaXMgVHJ1ZSwgZG9uJ3QgdXNlIHRoZSB3aGVlbCBjYWNoZSwgYmVjYXVzZSBjYWNoZWQKICAgICAgICB3aGVlbHMsIGFsd2F5cyBidWlsdCBsb2NhbGx5LCBoYXZlIGRpZmZlcmVudCBoYXNoZXMgdGhhbiB0aGUgZmlsZXMKICAgICAgICBkb3dubG9hZGVkIGZyb20gdGhlIGluZGV4IHNlcnZlciBhbmQgdGh1cyB0aHJvdyBmYWxzZSBoYXNoIG1pc21hdGNoZXMuCiAgICAgICAgRnVydGhlcm1vcmUsIGNhY2hlZCB3aGVlbHMgYXQgcHJlc2VudCBoYXZlIHVuZGV0ZXJtaW5pc3RpYyBjb250ZW50cyBkdWUKICAgICAgICB0byBmaWxlIG1vZGlmaWNhdGlvbiB0aW1lcy4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLmxpbmsgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5saW5rID0gZmluZGVyLmZpbmRfcmVxdWlyZW1lbnQoc2VsZiwgdXBncmFkZSkKICAgICAgICBpZiBzZWxmLl93aGVlbF9jYWNoZSBpcyBub3QgTm9uZSBhbmQgbm90IHJlcXVpcmVfaGFzaGVzOgogICAgICAgICAgICBvbGRfbGluayA9IHNlbGYubGluawogICAgICAgICAgICBzZWxmLmxpbmsgPSBzZWxmLl93aGVlbF9jYWNoZS5jYWNoZWRfd2hlZWwoc2VsZi5saW5rLCBzZWxmLm5hbWUpCiAgICAgICAgICAgIGlmIG9sZF9saW5rICE9IHNlbGYubGluazoKICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnVXNpbmcgY2FjaGVkIHdoZWVsIGxpbms6ICVzJywgc2VsZi5saW5rKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHNwZWNpZmllcihzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5yZXEuc3BlY2lmaWVyCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfcGlubmVkKHNlbGYpOgogICAgICAgICIiIlJldHVybiB3aGV0aGVyIEkgYW0gcGlubmVkIHRvIGFuIGV4YWN0IHZlcnNpb24uCgogICAgICAgIEZvciBleGFtcGxlLCBzb21lLXBhY2thZ2U9PTEuMiBpcyBwaW5uZWQ7IHNvbWUtcGFja2FnZT4xLjIgaXMgbm90LgogICAgICAgICIiIgogICAgICAgIHNwZWNpZmllcnMgPSBzZWxmLnNwZWNpZmllcgogICAgICAgIHJldHVybiAobGVuKHNwZWNpZmllcnMpID09IDEgYW5kCiAgICAgICAgICAgICAgICBuZXh0KGl0ZXIoc3BlY2lmaWVycykpLm9wZXJhdG9yIGluICgnPT0nLCAnPT09JykpCgogICAgZGVmIGZyb21fcGF0aChzZWxmKToKICAgICAgICBpZiBzZWxmLnJlcSBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHMgPSBzdHIoc2VsZi5yZXEpCiAgICAgICAgaWYgc2VsZi5jb21lc19mcm9tOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuY29tZXNfZnJvbSwgc2l4LnN0cmluZ190eXBlcyk6CiAgICAgICAgICAgICAgICBjb21lc19mcm9tID0gc2VsZi5jb21lc19mcm9tCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBjb21lc19mcm9tID0gc2VsZi5jb21lc19mcm9tLmZyb21fcGF0aCgpCiAgICAgICAgICAgIGlmIGNvbWVzX2Zyb206CiAgICAgICAgICAgICAgICBzICs9ICctPicgKyBjb21lc19mcm9tCiAgICAgICAgcmV0dXJuIHMKCiAgICBkZWYgYnVpbGRfbG9jYXRpb24oc2VsZiwgYnVpbGRfZGlyKToKICAgICAgICBpZiBzZWxmLl90ZW1wX2J1aWxkX2RpciBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RlbXBfYnVpbGRfZGlyCiAgICAgICAgaWYgc2VsZi5yZXEgaXMgTm9uZToKICAgICAgICAgICAgIyBmb3IgcmVxdWlyZW1lbnQgdmlhIGEgcGF0aCB0byBhIGRpcmVjdG9yeTogdGhlIG5hbWUgb2YgdGhlCiAgICAgICAgICAgICMgcGFja2FnZSBpcyBub3QgYXZhaWxhYmxlIHlldCBzbyB3ZSBjcmVhdGUgYSB0ZW1wIGRpcmVjdG9yeQogICAgICAgICAgICAjIE9uY2UgcnVuX2VnZ19pbmZvIHdpbGwgaGF2ZSBydW4sIHdlJ2xsIGJlIGFibGUKICAgICAgICAgICAgIyB0byBmaXggaXQgdmlhIF9jb3JyZWN0X2J1aWxkX2xvY2F0aW9uCiAgICAgICAgICAgICMgU29tZSBzeXN0ZW1zIGhhdmUgL3RtcCBhcyBhIHN5bWxpbmsgd2hpY2ggY29uZnVzZXMgY3VzdG9tCiAgICAgICAgICAgICMgYnVpbGRzIChzdWNoIGFzIG51bXB5KS4gVGh1cywgd2UgZW5zdXJlIHRoYXQgdGhlIHJlYWwgcGF0aAogICAgICAgICAgICAjIGlzIHJldHVybmVkLgogICAgICAgICAgICBzZWxmLl90ZW1wX2J1aWxkX2RpciA9IG9zLnBhdGgucmVhbHBhdGgoCiAgICAgICAgICAgICAgICB0ZW1wZmlsZS5ta2R0ZW1wKCctYnVpbGQnLCAncGlwLScpCiAgICAgICAgICAgICkKICAgICAgICAgICAgc2VsZi5faWRlYWxfYnVpbGRfZGlyID0gYnVpbGRfZGlyCiAgICAgICAgICAgIHJldHVybiBzZWxmLl90ZW1wX2J1aWxkX2RpcgogICAgICAgIGlmIHNlbGYuZWRpdGFibGU6CiAgICAgICAgICAgIG5hbWUgPSBzZWxmLm5hbWUubG93ZXIoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG5hbWUgPSBzZWxmLm5hbWUKICAgICAgICAjIEZJWE1FOiBJcyB0aGVyZSBhIGJldHRlciBwbGFjZSB0byBjcmVhdGUgdGhlIGJ1aWxkX2Rpcj8gKGhnIGFuZCBienIKICAgICAgICAjIG5lZWQgdGhpcykKICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoYnVpbGRfZGlyKToKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdDcmVhdGluZyBkaXJlY3RvcnkgJXMnLCBidWlsZF9kaXIpCiAgICAgICAgICAgIF9tYWtlX2J1aWxkX2RpcihidWlsZF9kaXIpCiAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihidWlsZF9kaXIsIG5hbWUpCgogICAgZGVmIF9jb3JyZWN0X2J1aWxkX2xvY2F0aW9uKHNlbGYpOgogICAgICAgICIiIk1vdmUgc2VsZi5fdGVtcF9idWlsZF9kaXIgdG8gc2VsZi5faWRlYWxfYnVpbGRfZGlyL3NlbGYucmVxLm5hbWUKCiAgICAgICAgRm9yIHNvbWUgcmVxdWlyZW1lbnRzIChlLmcuIGEgcGF0aCB0byBhIGRpcmVjdG9yeSksIHRoZSBuYW1lIG9mIHRoZQogICAgICAgIHBhY2thZ2UgaXMgbm90IGF2YWlsYWJsZSB1bnRpbCB3ZSBydW4gZWdnX2luZm8sIHNvIHRoZSBidWlsZF9sb2NhdGlvbgogICAgICAgIHdpbGwgcmV0dXJuIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBhbmQgc3RvcmUgdGhlIF9pZGVhbF9idWlsZF9kaXIuCgogICAgICAgIFRoaXMgaXMgb25seSBjYWxsZWQgYnkgc2VsZi5lZ2dfaW5mb19wYXRoIHRvIGZpeCB0aGUgdGVtcG9yYXJ5IGJ1aWxkCiAgICAgICAgZGlyZWN0b3J5LgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuc291cmNlX2RpciBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgYXNzZXJ0IHNlbGYucmVxIGlzIG5vdCBOb25lCiAgICAgICAgYXNzZXJ0IHNlbGYuX3RlbXBfYnVpbGRfZGlyCiAgICAgICAgYXNzZXJ0IHNlbGYuX2lkZWFsX2J1aWxkX2RpcgogICAgICAgIG9sZF9sb2NhdGlvbiA9IHNlbGYuX3RlbXBfYnVpbGRfZGlyCiAgICAgICAgc2VsZi5fdGVtcF9idWlsZF9kaXIgPSBOb25lCiAgICAgICAgbmV3X2xvY2F0aW9uID0gc2VsZi5idWlsZF9sb2NhdGlvbihzZWxmLl9pZGVhbF9idWlsZF9kaXIpCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMobmV3X2xvY2F0aW9uKToKICAgICAgICAgICAgcmFpc2UgSW5zdGFsbGF0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAnQSBwYWNrYWdlIGFscmVhZHkgZXhpc3RzIGluICVzOyBwbGVhc2UgcmVtb3ZlIGl0IHRvIGNvbnRpbnVlJwogICAgICAgICAgICAgICAgJSBkaXNwbGF5X3BhdGgobmV3X2xvY2F0aW9uKSkKICAgICAgICBsb2dnZXIuZGVidWcoCiAgICAgICAgICAgICdNb3ZpbmcgcGFja2FnZSAlcyBmcm9tICVzIHRvIG5ldyBsb2NhdGlvbiAlcycsCiAgICAgICAgICAgIHNlbGYsIGRpc3BsYXlfcGF0aChvbGRfbG9jYXRpb24pLCBkaXNwbGF5X3BhdGgobmV3X2xvY2F0aW9uKSwKICAgICAgICApCiAgICAgICAgc2h1dGlsLm1vdmUob2xkX2xvY2F0aW9uLCBuZXdfbG9jYXRpb24pCiAgICAgICAgc2VsZi5fdGVtcF9idWlsZF9kaXIgPSBuZXdfbG9jYXRpb24KICAgICAgICBzZWxmLl9pZGVhbF9idWlsZF9kaXIgPSBOb25lCiAgICAgICAgc2VsZi5zb3VyY2VfZGlyID0gbmV3X2xvY2F0aW9uCiAgICAgICAgc2VsZi5fZWdnX2luZm9fcGF0aCA9IE5vbmUKCiAgICBAcHJvcGVydHkKICAgIGRlZiBuYW1lKHNlbGYpOgogICAgICAgIGlmIHNlbGYucmVxIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcmV0dXJuIG5hdGl2ZV9zdHIocGtnX3Jlc291cmNlcy5zYWZlX25hbWUoc2VsZi5yZXEubmFtZSkpCgogICAgQHByb3BlcnR5CiAgICBkZWYgc2V0dXBfcHlfZGlyKHNlbGYpOgogICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgIHNlbGYuc291cmNlX2RpciwKICAgICAgICAgICAgc2VsZi5saW5rIGFuZCBzZWxmLmxpbmsuc3ViZGlyZWN0b3J5X2ZyYWdtZW50IG9yICcnKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHNldHVwX3B5KHNlbGYpOgogICAgICAgIGFzc2VydCBzZWxmLnNvdXJjZV9kaXIsICJObyBzb3VyY2UgZGlyIGZvciAlcyIgJSBzZWxmCiAgICAgICAgdHJ5OgogICAgICAgICAgICBpbXBvcnQgc2V0dXB0b29scyAgIyBub3FhCiAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICBpZiBnZXRfaW5zdGFsbGVkX3ZlcnNpb24oJ3NldHVwdG9vbHMnKSBpcyBOb25lOgogICAgICAgICAgICAgICAgYWRkX21zZyA9ICJQbGVhc2UgaW5zdGFsbCBzZXR1cHRvb2xzLiIKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGFkZF9tc2cgPSB0cmFjZWJhY2suZm9ybWF0X2V4YygpCiAgICAgICAgICAgICMgU2V0dXB0b29scyBpcyBub3QgYXZhaWxhYmxlCiAgICAgICAgICAgIHJhaXNlIEluc3RhbGxhdGlvbkVycm9yKAogICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBpbXBvcnQgc2V0dXB0b29scyB3aGljaCBpcyByZXF1aXJlZCB0byAiCiAgICAgICAgICAgICAgICAiaW5zdGFsbCBmcm9tIGEgc291cmNlIGRpc3RyaWJ1dGlvbi5cbiVzIiAlIGFkZF9tc2cKICAgICAgICAgICAgKQoKICAgICAgICBzZXR1cF9weSA9IG9zLnBhdGguam9pbihzZWxmLnNldHVwX3B5X2RpciwgJ3NldHVwLnB5JykKCiAgICAgICAgIyBQeXRob24yIF9fZmlsZV9fIHNob3VsZCBub3QgYmUgdW5pY29kZQogICAgICAgIGlmIHNpeC5QWTIgYW5kIGlzaW5zdGFuY2Uoc2V0dXBfcHksIHNpeC50ZXh0X3R5cGUpOgogICAgICAgICAgICBzZXR1cF9weSA9IHNldHVwX3B5LmVuY29kZShzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkpCgogICAgICAgIHJldHVybiBzZXR1cF9weQoKICAgIGRlZiBydW5fZWdnX2luZm8oc2VsZik6CiAgICAgICAgYXNzZXJ0IHNlbGYuc291cmNlX2RpcgogICAgICAgIGlmIHNlbGYubmFtZToKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKAogICAgICAgICAgICAgICAgJ1J1bm5pbmcgc2V0dXAucHkgKHBhdGg6JXMpIGVnZ19pbmZvIGZvciBwYWNrYWdlICVzJywKICAgICAgICAgICAgICAgIHNlbGYuc2V0dXBfcHksIHNlbGYubmFtZSwKICAgICAgICAgICAgKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygKICAgICAgICAgICAgICAgICdSdW5uaW5nIHNldHVwLnB5IChwYXRoOiVzKSBlZ2dfaW5mbyBmb3IgcGFja2FnZSBmcm9tICVzJywKICAgICAgICAgICAgICAgIHNlbGYuc2V0dXBfcHksIHNlbGYubGluaywKICAgICAgICAgICAgKQoKICAgICAgICB3aXRoIGluZGVudF9sb2coKToKICAgICAgICAgICAgc2NyaXB0ID0gU0VUVVBUT09MU19TSElNICUgc2VsZi5zZXR1cF9weQogICAgICAgICAgICBiYXNlX2NtZCA9IFtzeXMuZXhlY3V0YWJsZSwgJy1jJywgc2NyaXB0XQogICAgICAgICAgICBpZiBzZWxmLmlzb2xhdGVkOgogICAgICAgICAgICAgICAgYmFzZV9jbWQgKz0gWyItLW5vLXVzZXItY2ZnIl0KICAgICAgICAgICAgZWdnX2luZm9fY21kID0gYmFzZV9jbWQgKyBbJ2VnZ19pbmZvJ10KICAgICAgICAgICAgIyBXZSBjYW4ndCBwdXQgdGhlIC5lZ2ctaW5mbyBmaWxlcyBhdCB0aGUgcm9vdCwgYmVjYXVzZSB0aGVuIHRoZQogICAgICAgICAgICAjIHNvdXJjZSBjb2RlIHdpbGwgYmUgbWlzdGFrZW4gZm9yIGFuIGluc3RhbGxlZCBlZ2csIGNhdXNpbmcKICAgICAgICAgICAgIyBwcm9ibGVtcwogICAgICAgICAgICBpZiBzZWxmLmVkaXRhYmxlOgogICAgICAgICAgICAgICAgZWdnX2Jhc2Vfb3B0aW9uID0gW10KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGVnZ19pbmZvX2RpciA9IG9zLnBhdGguam9pbihzZWxmLnNldHVwX3B5X2RpciwgJ3BpcC1lZ2ctaW5mbycpCiAgICAgICAgICAgICAgICBlbnN1cmVfZGlyKGVnZ19pbmZvX2RpcikKICAgICAgICAgICAgICAgIGVnZ19iYXNlX29wdGlvbiA9IFsnLS1lZ2ctYmFzZScsICdwaXAtZWdnLWluZm8nXQogICAgICAgICAgICBjYWxsX3N1YnByb2Nlc3MoCiAgICAgICAgICAgICAgICBlZ2dfaW5mb19jbWQgKyBlZ2dfYmFzZV9vcHRpb24sCiAgICAgICAgICAgICAgICBjd2Q9c2VsZi5zZXR1cF9weV9kaXIsCiAgICAgICAgICAgICAgICBzaG93X3N0ZG91dD1GYWxzZSwKICAgICAgICAgICAgICAgIGNvbW1hbmRfZGVzYz0ncHl0aG9uIHNldHVwLnB5IGVnZ19pbmZvJykKCiAgICAgICAgaWYgbm90IHNlbGYucmVxOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHBhcnNlX3ZlcnNpb24oc2VsZi5wa2dfaW5mbygpWyJWZXJzaW9uIl0pLCBWZXJzaW9uKToKICAgICAgICAgICAgICAgIG9wID0gIj09IgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgb3AgPSAiPT09IgogICAgICAgICAgICBzZWxmLnJlcSA9IFJlcXVpcmVtZW50KAogICAgICAgICAgICAgICAgIiIuam9pbihbCiAgICAgICAgICAgICAgICAgICAgc2VsZi5wa2dfaW5mbygpWyJOYW1lIl0sCiAgICAgICAgICAgICAgICAgICAgb3AsCiAgICAgICAgICAgICAgICAgICAgc2VsZi5wa2dfaW5mbygpWyJWZXJzaW9uIl0sCiAgICAgICAgICAgICAgICBdKQogICAgICAgICAgICApCiAgICAgICAgICAgIHNlbGYuX2NvcnJlY3RfYnVpbGRfbG9jYXRpb24oKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG1ldGFkYXRhX25hbWUgPSBjYW5vbmljYWxpemVfbmFtZShzZWxmLnBrZ19pbmZvKClbIk5hbWUiXSkKICAgICAgICAgICAgaWYgY2Fub25pY2FsaXplX25hbWUoc2VsZi5yZXEubmFtZSkgIT0gbWV0YWRhdGFfbmFtZToKICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgICAgICdSdW5uaW5nIHNldHVwLnB5IChwYXRoOiVzKSBlZ2dfaW5mbyBmb3IgcGFja2FnZSAlcyAnCiAgICAgICAgICAgICAgICAgICAgJ3Byb2R1Y2VkIG1ldGFkYXRhIGZvciBwcm9qZWN0IG5hbWUgJXMuIEZpeCB5b3VyICcKICAgICAgICAgICAgICAgICAgICAnI2VnZz0lcyBmcmFnbWVudHMuJywKICAgICAgICAgICAgICAgICAgICBzZWxmLnNldHVwX3B5LCBzZWxmLm5hbWUsIG1ldGFkYXRhX25hbWUsIHNlbGYubmFtZQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgc2VsZi5yZXEgPSBSZXF1aXJlbWVudChtZXRhZGF0YV9uYW1lKQoKICAgIGRlZiBlZ2dfaW5mb19kYXRhKHNlbGYsIGZpbGVuYW1lKToKICAgICAgICBpZiBzZWxmLnNhdGlzZmllZF9ieSBpcyBub3QgTm9uZToKICAgICAgICAgICAgaWYgbm90IHNlbGYuc2F0aXNmaWVkX2J5Lmhhc19tZXRhZGF0YShmaWxlbmFtZSk6CiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgICAgICByZXR1cm4gc2VsZi5zYXRpc2ZpZWRfYnkuZ2V0X21ldGFkYXRhKGZpbGVuYW1lKQogICAgICAgIGFzc2VydCBzZWxmLnNvdXJjZV9kaXIKICAgICAgICBmaWxlbmFtZSA9IHNlbGYuZWdnX2luZm9fcGF0aChmaWxlbmFtZSkKICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZmlsZW5hbWUpOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIGRhdGEgPSByZWFkX3RleHRfZmlsZShmaWxlbmFtZSkKICAgICAgICByZXR1cm4gZGF0YQoKICAgIGRlZiBlZ2dfaW5mb19wYXRoKHNlbGYsIGZpbGVuYW1lKToKICAgICAgICBpZiBzZWxmLl9lZ2dfaW5mb19wYXRoIGlzIE5vbmU6CiAgICAgICAgICAgIGlmIHNlbGYuZWRpdGFibGU6CiAgICAgICAgICAgICAgICBiYXNlID0gc2VsZi5zb3VyY2VfZGlyCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBiYXNlID0gb3MucGF0aC5qb2luKHNlbGYuc2V0dXBfcHlfZGlyLCAncGlwLWVnZy1pbmZvJykKICAgICAgICAgICAgZmlsZW5hbWVzID0gb3MubGlzdGRpcihiYXNlKQogICAgICAgICAgICBpZiBzZWxmLmVkaXRhYmxlOgogICAgICAgICAgICAgICAgZmlsZW5hbWVzID0gW10KICAgICAgICAgICAgICAgIGZvciByb290LCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKGJhc2UpOgogICAgICAgICAgICAgICAgICAgIGZvciBkaXIgaW4gdmNzLmRpcm5hbWVzOgogICAgICAgICAgICAgICAgICAgICAgICBpZiBkaXIgaW4gZGlyczoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcnMucmVtb3ZlKGRpcikKICAgICAgICAgICAgICAgICAgICAjIEl0ZXJhdGUgb3ZlciBhIGNvcHkgb2YgYGBkaXJzYGAsIHNpbmNlIG11dGF0aW5nCiAgICAgICAgICAgICAgICAgICAgIyBhIGxpc3Qgd2hpbGUgaXRlcmF0aW5nIG92ZXIgaXQgY2FuIGNhdXNlIHRyb3VibGUuCiAgICAgICAgICAgICAgICAgICAgIyAoU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3BpcC9wdWxsLzQ2Mi4pCiAgICAgICAgICAgICAgICAgICAgZm9yIGRpciBpbiBsaXN0KGRpcnMpOgogICAgICAgICAgICAgICAgICAgICAgICAjIERvbid0IHNlYXJjaCBpbiBhbnl0aGluZyB0aGF0IGxvb2tzIGxpa2UgYSB2aXJ0dWFsZW52CiAgICAgICAgICAgICAgICAgICAgICAgICMgZW52aXJvbm1lbnQKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGgubGV4aXN0cygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHJvb3QsIGRpciwgJ2JpbicsICdweXRob24nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmV4aXN0cygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdCwgZGlyLCAnU2NyaXB0cycsICdQeXRob24uZXhlJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJzLnJlbW92ZShkaXIpCiAgICAgICAgICAgICAgICAgICAgICAgICMgQWxzbyBkb24ndCBzZWFyY2ggdGhyb3VnaCB0ZXN0cwogICAgICAgICAgICAgICAgICAgICAgICBlbGlmIGRpciA9PSAndGVzdCcgb3IgZGlyID09ICd0ZXN0cyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJzLnJlbW92ZShkaXIpCiAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVzLmV4dGVuZChbb3MucGF0aC5qb2luKHJvb3QsIGRpcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBkaXIgaW4gZGlyc10pCiAgICAgICAgICAgICAgICBmaWxlbmFtZXMgPSBbZiBmb3IgZiBpbiBmaWxlbmFtZXMgaWYgZi5lbmRzd2l0aCgnLmVnZy1pbmZvJyldCgogICAgICAgICAgICBpZiBub3QgZmlsZW5hbWVzOgogICAgICAgICAgICAgICAgcmFpc2UgSW5zdGFsbGF0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgJ05vIGZpbGVzL2RpcmVjdG9yaWVzIGluICVzIChmcm9tICVzKScgJSAoYmFzZSwgZmlsZW5hbWUpCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIGFzc2VydCBmaWxlbmFtZXMsIFwKICAgICAgICAgICAgICAgICJObyBmaWxlcy9kaXJlY3RvcmllcyBpbiAlcyAoZnJvbSAlcykiICUgKGJhc2UsIGZpbGVuYW1lKQoKICAgICAgICAgICAgIyBpZiB3ZSBoYXZlIG1vcmUgdGhhbiBvbmUgbWF0Y2gsIHdlIHBpY2sgdGhlIHRvcGxldmVsIG9uZS4gIFRoaXMKICAgICAgICAgICAgIyBjYW4gZWFzaWx5IGJlIHRoZSBjYXNlIGlmIHRoZXJlIGlzIGEgZGlzdCBmb2xkZXIgd2hpY2ggY29udGFpbnMKICAgICAgICAgICAgIyBhbiBleHRyYWN0ZWQgdGFyYmFsbCBmb3IgdGVzdGluZyBwdXJwb3Nlcy4KICAgICAgICAgICAgaWYgbGVuKGZpbGVuYW1lcykgPiAxOgogICAgICAgICAgICAgICAgZmlsZW5hbWVzLnNvcnQoCiAgICAgICAgICAgICAgICAgICAga2V5PWxhbWJkYSB4OiB4LmNvdW50KG9zLnBhdGguc2VwKSArCiAgICAgICAgICAgICAgICAgICAgKG9zLnBhdGguYWx0c2VwIGFuZCB4LmNvdW50KG9zLnBhdGguYWx0c2VwKSBvciAwKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICBzZWxmLl9lZ2dfaW5mb19wYXRoID0gb3MucGF0aC5qb2luKGJhc2UsIGZpbGVuYW1lc1swXSkKICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKHNlbGYuX2VnZ19pbmZvX3BhdGgsIGZpbGVuYW1lKQoKICAgIGRlZiBwa2dfaW5mbyhzZWxmKToKICAgICAgICBwID0gRmVlZFBhcnNlcigpCiAgICAgICAgZGF0YSA9IHNlbGYuZWdnX2luZm9fZGF0YSgnUEtHLUlORk8nKQogICAgICAgIGlmIG5vdCBkYXRhOgogICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICdObyBQS0ctSU5GTyBmaWxlIGZvdW5kIGluICVzJywKICAgICAgICAgICAgICAgIGRpc3BsYXlfcGF0aChzZWxmLmVnZ19pbmZvX3BhdGgoJ1BLRy1JTkZPJykpLAogICAgICAgICAgICApCiAgICAgICAgcC5mZWVkKGRhdGEgb3IgJycpCiAgICAgICAgcmV0dXJuIHAuY2xvc2UoKQoKICAgIF9yZXF1aXJlbWVudHNfc2VjdGlvbl9yZSA9IHJlLmNvbXBpbGUocidcWyguKj8pXF0nKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGluc3RhbGxlZF92ZXJzaW9uKHNlbGYpOgogICAgICAgIHJldHVybiBnZXRfaW5zdGFsbGVkX3ZlcnNpb24oc2VsZi5uYW1lKQoKICAgIGRlZiBhc3NlcnRfc291cmNlX21hdGNoZXNfdmVyc2lvbihzZWxmKToKICAgICAgICBhc3NlcnQgc2VsZi5zb3VyY2VfZGlyCiAgICAgICAgdmVyc2lvbiA9IHNlbGYucGtnX2luZm8oKVsndmVyc2lvbiddCiAgICAgICAgaWYgc2VsZi5yZXEuc3BlY2lmaWVyIGFuZCB2ZXJzaW9uIG5vdCBpbiBzZWxmLnJlcS5zcGVjaWZpZXI6CiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgJ1JlcXVlc3RlZCAlcywgYnV0IGluc3RhbGxpbmcgdmVyc2lvbiAlcycsCiAgICAgICAgICAgICAgICBzZWxmLAogICAgICAgICAgICAgICAgc2VsZi5pbnN0YWxsZWRfdmVyc2lvbiwKICAgICAgICAgICAgKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygKICAgICAgICAgICAgICAgICdTb3VyY2UgaW4gJXMgaGFzIHZlcnNpb24gJXMsIHdoaWNoIHNhdGlzZmllcyByZXF1aXJlbWVudCAlcycsCiAgICAgICAgICAgICAgICBkaXNwbGF5X3BhdGgoc2VsZi5zb3VyY2VfZGlyKSwKICAgICAgICAgICAgICAgIHZlcnNpb24sCiAgICAgICAgICAgICAgICBzZWxmLAogICAgICAgICAgICApCgogICAgZGVmIHVwZGF0ZV9lZGl0YWJsZShzZWxmLCBvYnRhaW49VHJ1ZSk6CiAgICAgICAgaWYgbm90IHNlbGYubGluazoKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKAogICAgICAgICAgICAgICAgIkNhbm5vdCB1cGRhdGUgcmVwb3NpdG9yeSBhdCAlczsgcmVwb3NpdG9yeSBsb2NhdGlvbiBpcyAiCiAgICAgICAgICAgICAgICAidW5rbm93biIsCiAgICAgICAgICAgICAgICBzZWxmLnNvdXJjZV9kaXIsCiAgICAgICAgICAgICkKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgYXNzZXJ0IHNlbGYuZWRpdGFibGUKICAgICAgICBhc3NlcnQgc2VsZi5zb3VyY2VfZGlyCiAgICAgICAgaWYgc2VsZi5saW5rLnNjaGVtZSA9PSAnZmlsZSc6CiAgICAgICAgICAgICMgU3RhdGljIHBhdGhzIGRvbid0IGdldCB1cGRhdGVkCiAgICAgICAgICAgIHJldHVybgogICAgICAgIGFzc2VydCAnKycgaW4gc2VsZi5saW5rLnVybCwgImJhZCB1cmw6ICVyIiAlIHNlbGYubGluay51cmwKICAgICAgICBpZiBub3Qgc2VsZi51cGRhdGU6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHZjX3R5cGUsIHVybCA9IHNlbGYubGluay51cmwuc3BsaXQoJysnLCAxKQogICAgICAgIGJhY2tlbmQgPSB2Y3MuZ2V0X2JhY2tlbmQodmNfdHlwZSkKICAgICAgICBpZiBiYWNrZW5kOgogICAgICAgICAgICB2Y3NfYmFja2VuZCA9IGJhY2tlbmQoc2VsZi5saW5rLnVybCkKICAgICAgICAgICAgaWYgb2J0YWluOgogICAgICAgICAgICAgICAgdmNzX2JhY2tlbmQub2J0YWluKHNlbGYuc291cmNlX2RpcikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHZjc19iYWNrZW5kLmV4cG9ydChzZWxmLnNvdXJjZV9kaXIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYXNzZXJ0IDAsICgKICAgICAgICAgICAgICAgICdVbmV4cGVjdGVkIHZlcnNpb24gY29udHJvbCB0eXBlIChpbiAlcyk6ICVzJwogICAgICAgICAgICAgICAgJSAoc2VsZi5saW5rLCB2Y190eXBlKSkKCiAgICBkZWYgdW5pbnN0YWxsKHNlbGYsIGF1dG9fY29uZmlybT1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgVW5pbnN0YWxsIHRoZSBkaXN0cmlidXRpb24gY3VycmVudGx5IHNhdGlzZnlpbmcgdGhpcyByZXF1aXJlbWVudC4KCiAgICAgICAgUHJvbXB0cyBiZWZvcmUgcmVtb3Zpbmcgb3IgbW9kaWZ5aW5nIGZpbGVzIHVubGVzcwogICAgICAgIGBgYXV0b19jb25maXJtYGAgaXMgVHJ1ZS4KCiAgICAgICAgUmVmdXNlcyB0byBkZWxldGUgb3IgbW9kaWZ5IGZpbGVzIG91dHNpZGUgb2YgYGBzeXMucHJlZml4YGAgLQogICAgICAgIHRodXMgdW5pbnN0YWxsYXRpb24gd2l0aGluIGEgdmlydHVhbCBlbnZpcm9ubWVudCBjYW4gb25seQogICAgICAgIG1vZGlmeSB0aGF0IHZpcnR1YWwgZW52aXJvbm1lbnQsIGV2ZW4gaWYgdGhlIHZpcnR1YWxlbnYgaXMKICAgICAgICBsaW5rZWQgdG8gZ2xvYmFsIHNpdGUtcGFja2FnZXMuCgogICAgICAgICIiIgogICAgICAgIGlmIG5vdCBzZWxmLmNoZWNrX2lmX2V4aXN0cygpOgogICAgICAgICAgICByYWlzZSBVbmluc3RhbGxhdGlvbkVycm9yKAogICAgICAgICAgICAgICAgIkNhbm5vdCB1bmluc3RhbGwgcmVxdWlyZW1lbnQgJXMsIG5vdCBpbnN0YWxsZWQiICUgKHNlbGYubmFtZSwpCiAgICAgICAgICAgICkKICAgICAgICBkaXN0ID0gc2VsZi5zYXRpc2ZpZWRfYnkgb3Igc2VsZi5jb25mbGljdHNfd2l0aAoKICAgICAgICBkaXN0X3BhdGggPSBub3JtYWxpemVfcGF0aChkaXN0LmxvY2F0aW9uKQogICAgICAgIGlmIG5vdCBkaXN0X2lzX2xvY2FsKGRpc3QpOgogICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICJOb3QgdW5pbnN0YWxsaW5nICVzIGF0ICVzLCBvdXRzaWRlIGVudmlyb25tZW50ICVzIiwKICAgICAgICAgICAgICAgIGRpc3Qua2V5LAogICAgICAgICAgICAgICAgZGlzdF9wYXRoLAogICAgICAgICAgICAgICAgc3lzLnByZWZpeCwKICAgICAgICAgICAgKQogICAgICAgICAgICBzZWxmLm5vdGhpbmdfdG9fdW5pbnN0YWxsID0gVHJ1ZQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgaWYgZGlzdF9wYXRoIGluIGdldF9zdGRsaWIoKToKICAgICAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAiTm90IHVuaW5zdGFsbGluZyAlcyBhdCAlcywgYXMgaXQgaXMgaW4gdGhlIHN0YW5kYXJkIGxpYnJhcnkuIiwKICAgICAgICAgICAgICAgIGRpc3Qua2V5LAogICAgICAgICAgICAgICAgZGlzdF9wYXRoLAogICAgICAgICAgICApCiAgICAgICAgICAgIHNlbGYubm90aGluZ190b191bmluc3RhbGwgPSBUcnVlCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBwYXRoc190b19yZW1vdmUgPSBVbmluc3RhbGxQYXRoU2V0KGRpc3QpCiAgICAgICAgZGV2ZWxvcF9lZ2dfbGluayA9IGVnZ19saW5rX3BhdGgoZGlzdCkKICAgICAgICBkZXZlbG9wX2VnZ19saW5rX2VnZ19pbmZvID0gJ3swfS5lZ2ctaW5mbycuZm9ybWF0KAogICAgICAgICAgICBwa2dfcmVzb3VyY2VzLnRvX2ZpbGVuYW1lKGRpc3QucHJvamVjdF9uYW1lKSkKICAgICAgICBlZ2dfaW5mb19leGlzdHMgPSBkaXN0LmVnZ19pbmZvIGFuZCBvcy5wYXRoLmV4aXN0cyhkaXN0LmVnZ19pbmZvKQogICAgICAgICMgU3BlY2lhbCBjYXNlIGZvciBkaXN0dXRpbHMgaW5zdGFsbGVkIHBhY2thZ2UKICAgICAgICBkaXN0dXRpbHNfZWdnX2luZm8gPSBnZXRhdHRyKGRpc3QuX3Byb3ZpZGVyLCAncGF0aCcsIE5vbmUpCgogICAgICAgICMgVW5pbnN0YWxsIGNhc2VzIG9yZGVyIGRvIG1hdHRlciBhcyBpbiB0aGUgY2FzZSBvZiAyIGluc3RhbGxzIG9mIHRoZQogICAgICAgICMgc2FtZSBwYWNrYWdlLCBwaXAgbmVlZHMgdG8gdW5pbnN0YWxsIHRoZSBjdXJyZW50bHkgZGV0ZWN0ZWQgdmVyc2lvbgogICAgICAgIGlmIChlZ2dfaW5mb19leGlzdHMgYW5kIGRpc3QuZWdnX2luZm8uZW5kc3dpdGgoJy5lZ2ctaW5mbycpIGFuZAogICAgICAgICAgICAgICAgbm90IGRpc3QuZWdnX2luZm8uZW5kc3dpdGgoZGV2ZWxvcF9lZ2dfbGlua19lZ2dfaW5mbykpOgogICAgICAgICAgICAjIGlmIGRpc3QuZWdnX2luZm8uZW5kc3dpdGgoZGV2ZWxvcF9lZ2dfbGlua19lZ2dfaW5mbyksIHdlCiAgICAgICAgICAgICMgYXJlIGluIGZhY3QgaW4gdGhlIGRldmVsb3BfZWdnX2xpbmsgY2FzZQogICAgICAgICAgICBwYXRoc190b19yZW1vdmUuYWRkKGRpc3QuZWdnX2luZm8pCiAgICAgICAgICAgIGlmIGRpc3QuaGFzX21ldGFkYXRhKCdpbnN0YWxsZWQtZmlsZXMudHh0Jyk6CiAgICAgICAgICAgICAgICBmb3IgaW5zdGFsbGVkX2ZpbGUgaW4gZGlzdC5nZXRfbWV0YWRhdGEoCiAgICAgICAgICAgICAgICAgICAgICAgICdpbnN0YWxsZWQtZmlsZXMudHh0Jykuc3BsaXRsaW5lcygpOgogICAgICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLm5vcm1wYXRoKAogICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oZGlzdC5lZ2dfaW5mbywgaW5zdGFsbGVkX2ZpbGUpCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHBhdGhzX3RvX3JlbW92ZS5hZGQocGF0aCkKICAgICAgICAgICAgIyBGSVhNRTogbmVlZCBhIHRlc3QgZm9yIHRoaXMgZWxpZiBibG9jawogICAgICAgICAgICAjIG9jY3VycyB3aXRoIC0tc2luZ2xlLXZlcnNpb24tZXh0ZXJuYWxseS1tYW5hZ2VkLy0tcmVjb3JkIG91dHNpZGUKICAgICAgICAgICAgIyBvZiBwaXAKICAgICAgICAgICAgZWxpZiBkaXN0Lmhhc19tZXRhZGF0YSgndG9wX2xldmVsLnR4dCcpOgogICAgICAgICAgICAgICAgaWYgZGlzdC5oYXNfbWV0YWRhdGEoJ25hbWVzcGFjZV9wYWNrYWdlcy50eHQnKToKICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VzID0gZGlzdC5nZXRfbWV0YWRhdGEoJ25hbWVzcGFjZV9wYWNrYWdlcy50eHQnKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VzID0gW10KICAgICAgICAgICAgICAgIGZvciB0b3BfbGV2ZWxfcGtnIGluIFsKICAgICAgICAgICAgICAgICAgICAgICAgcCBmb3IgcAogICAgICAgICAgICAgICAgICAgICAgICBpbiBkaXN0LmdldF9tZXRhZGF0YSgndG9wX2xldmVsLnR4dCcpLnNwbGl0bGluZXMoKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBwIGFuZCBwIG5vdCBpbiBuYW1lc3BhY2VzXToKICAgICAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKGRpc3QubG9jYXRpb24sIHRvcF9sZXZlbF9wa2cpCiAgICAgICAgICAgICAgICAgICAgcGF0aHNfdG9fcmVtb3ZlLmFkZChwYXRoKQogICAgICAgICAgICAgICAgICAgIHBhdGhzX3RvX3JlbW92ZS5hZGQocGF0aCArICcucHknKQogICAgICAgICAgICAgICAgICAgIHBhdGhzX3RvX3JlbW92ZS5hZGQocGF0aCArICcucHljJykKICAgICAgICAgICAgICAgICAgICBwYXRoc190b19yZW1vdmUuYWRkKHBhdGggKyAnLnB5bycpCgogICAgICAgIGVsaWYgZGlzdHV0aWxzX2VnZ19pbmZvOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAgICAgIlVuaW5zdGFsbGluZyBhIGRpc3R1dGlscyBpbnN0YWxsZWQgcHJvamVjdCAoezB9KSBoYXMgYmVlbiAiCiAgICAgICAgICAgICAgICAiZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24uIFRoaXMgaXMgIgogICAgICAgICAgICAgICAgImR1ZSB0byB0aGUgZmFjdCB0aGF0IHVuaW5zdGFsbGluZyBhIGRpc3R1dGlscyBwcm9qZWN0IHdpbGwgIgogICAgICAgICAgICAgICAgIm9ubHkgcGFydGlhbGx5IHVuaW5zdGFsbCB0aGUgcHJvamVjdC4iLmZvcm1hdChzZWxmLm5hbWUpLAogICAgICAgICAgICAgICAgUmVtb3ZlZEluUGlwMTBXYXJuaW5nLAogICAgICAgICAgICApCiAgICAgICAgICAgIHBhdGhzX3RvX3JlbW92ZS5hZGQoZGlzdHV0aWxzX2VnZ19pbmZvKQoKICAgICAgICBlbGlmIGRpc3QubG9jYXRpb24uZW5kc3dpdGgoJy5lZ2cnKToKICAgICAgICAgICAgIyBwYWNrYWdlIGluc3RhbGxlZCBieSBlYXN5X2luc3RhbGwKICAgICAgICAgICAgIyBXZSBjYW5ub3QgbWF0Y2ggb24gZGlzdC5lZ2dfbmFtZSBiZWNhdXNlIGl0IGNhbiBzbGlnaHRseSB2YXJ5CiAgICAgICAgICAgICMgaS5lLiBzZXR1cHRvb2xzLTAuNmMxMS1weTIuNi5lZ2cgdnMgc2V0dXB0b29scy0wLjZyYzExLXB5Mi42LmVnZwogICAgICAgICAgICBwYXRoc190b19yZW1vdmUuYWRkKGRpc3QubG9jYXRpb24pCiAgICAgICAgICAgIGVhc3lfaW5zdGFsbF9lZ2cgPSBvcy5wYXRoLnNwbGl0KGRpc3QubG9jYXRpb24pWzFdCiAgICAgICAgICAgIGVhc3lfaW5zdGFsbF9wdGggPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKGRpc3QubG9jYXRpb24pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlYXN5LWluc3RhbGwucHRoJykKICAgICAgICAgICAgcGF0aHNfdG9fcmVtb3ZlLmFkZF9wdGgoZWFzeV9pbnN0YWxsX3B0aCwgJy4vJyArIGVhc3lfaW5zdGFsbF9lZ2cpCgogICAgICAgIGVsaWYgZWdnX2luZm9fZXhpc3RzIGFuZCBkaXN0LmVnZ19pbmZvLmVuZHN3aXRoKCcuZGlzdC1pbmZvJyk6CiAgICAgICAgICAgIGZvciBwYXRoIGluIHBpcC53aGVlbC51bmluc3RhbGxhdGlvbl9wYXRocyhkaXN0KToKICAgICAgICAgICAgICAgIHBhdGhzX3RvX3JlbW92ZS5hZGQocGF0aCkKCiAgICAgICAgZWxpZiBkZXZlbG9wX2VnZ19saW5rOgogICAgICAgICAgICAjIGRldmVsb3AgZWdnCiAgICAgICAgICAgIHdpdGggb3BlbihkZXZlbG9wX2VnZ19saW5rLCAncicpIGFzIGZoOgogICAgICAgICAgICAgICAgbGlua19wb2ludGVyID0gb3MucGF0aC5ub3JtY2FzZShmaC5yZWFkbGluZSgpLnN0cmlwKCkpCiAgICAgICAgICAgIGFzc2VydCAobGlua19wb2ludGVyID09IGRpc3QubG9jYXRpb24pLCAoCiAgICAgICAgICAgICAgICAnRWdnLWxpbmsgJXMgZG9lcyBub3QgbWF0Y2ggaW5zdGFsbGVkIGxvY2F0aW9uIG9mICVzICcKICAgICAgICAgICAgICAgICcoYXQgJXMpJyAlIChsaW5rX3BvaW50ZXIsIHNlbGYubmFtZSwgZGlzdC5sb2NhdGlvbikKICAgICAgICAgICAgKQogICAgICAgICAgICBwYXRoc190b19yZW1vdmUuYWRkKGRldmVsb3BfZWdnX2xpbmspCiAgICAgICAgICAgIGVhc3lfaW5zdGFsbF9wdGggPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKGRldmVsb3BfZWdnX2xpbmspLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlYXN5LWluc3RhbGwucHRoJykKICAgICAgICAgICAgcGF0aHNfdG9fcmVtb3ZlLmFkZF9wdGgoZWFzeV9pbnN0YWxsX3B0aCwgZGlzdC5sb2NhdGlvbikKCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKAogICAgICAgICAgICAgICAgJ05vdCBzdXJlIGhvdyB0byB1bmluc3RhbGw6ICVzIC0gQ2hlY2s6ICVzJywKICAgICAgICAgICAgICAgIGRpc3QsIGRpc3QubG9jYXRpb24pCgogICAgICAgICMgZmluZCBkaXN0dXRpbHMgc2NyaXB0cz0gc2NyaXB0cwogICAgICAgIGlmIGRpc3QuaGFzX21ldGFkYXRhKCdzY3JpcHRzJykgYW5kIGRpc3QubWV0YWRhdGFfaXNkaXIoJ3NjcmlwdHMnKToKICAgICAgICAgICAgZm9yIHNjcmlwdCBpbiBkaXN0Lm1ldGFkYXRhX2xpc3RkaXIoJ3NjcmlwdHMnKToKICAgICAgICAgICAgICAgIGlmIGRpc3RfaW5fdXNlcnNpdGUoZGlzdCk6CiAgICAgICAgICAgICAgICAgICAgYmluX2RpciA9IGJpbl91c2VyCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGJpbl9kaXIgPSBiaW5fcHkKICAgICAgICAgICAgICAgIHBhdGhzX3RvX3JlbW92ZS5hZGQob3MucGF0aC5qb2luKGJpbl9kaXIsIHNjcmlwdCkpCiAgICAgICAgICAgICAgICBpZiBXSU5ET1dTOgogICAgICAgICAgICAgICAgICAgIHBhdGhzX3RvX3JlbW92ZS5hZGQob3MucGF0aC5qb2luKGJpbl9kaXIsIHNjcmlwdCkgKyAnLmJhdCcpCgogICAgICAgICMgZmluZCBjb25zb2xlX3NjcmlwdHMKICAgICAgICBpZiBkaXN0Lmhhc19tZXRhZGF0YSgnZW50cnlfcG9pbnRzLnR4dCcpOgogICAgICAgICAgICBpZiBzaXguUFkyOgogICAgICAgICAgICAgICAgb3B0aW9ucyA9IHt9CiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBvcHRpb25zID0geyJkZWxpbWl0ZXJzIjogKCc9JywgKX0KICAgICAgICAgICAgY29uZmlnID0gY29uZmlncGFyc2VyLlNhZmVDb25maWdQYXJzZXIoKipvcHRpb25zKQogICAgICAgICAgICBjb25maWcucmVhZGZwKAogICAgICAgICAgICAgICAgRmFrZUZpbGUoZGlzdC5nZXRfbWV0YWRhdGFfbGluZXMoJ2VudHJ5X3BvaW50cy50eHQnKSkKICAgICAgICAgICAgKQogICAgICAgICAgICBpZiBjb25maWcuaGFzX3NlY3Rpb24oJ2NvbnNvbGVfc2NyaXB0cycpOgogICAgICAgICAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIGNvbmZpZy5pdGVtcygnY29uc29sZV9zY3JpcHRzJyk6CiAgICAgICAgICAgICAgICAgICAgaWYgZGlzdF9pbl91c2Vyc2l0ZShkaXN0KToKICAgICAgICAgICAgICAgICAgICAgICAgYmluX2RpciA9IGJpbl91c2VyCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgYmluX2RpciA9IGJpbl9weQogICAgICAgICAgICAgICAgICAgIHBhdGhzX3RvX3JlbW92ZS5hZGQob3MucGF0aC5qb2luKGJpbl9kaXIsIG5hbWUpKQogICAgICAgICAgICAgICAgICAgIGlmIFdJTkRPV1M6CiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhzX3RvX3JlbW92ZS5hZGQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oYmluX2RpciwgbmFtZSkgKyAnLmV4ZScKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICBwYXRoc190b19yZW1vdmUuYWRkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKGJpbl9kaXIsIG5hbWUpICsgJy5leGUubWFuaWZlc3QnCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgcGF0aHNfdG9fcmVtb3ZlLmFkZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihiaW5fZGlyLCBuYW1lKSArICctc2NyaXB0LnB5JwogICAgICAgICAgICAgICAgICAgICAgICApCgogICAgICAgIHBhdGhzX3RvX3JlbW92ZS5yZW1vdmUoYXV0b19jb25maXJtKQogICAgICAgIHNlbGYudW5pbnN0YWxsZWQgPSBwYXRoc190b19yZW1vdmUKCiAgICBkZWYgcm9sbGJhY2tfdW5pbnN0YWxsKHNlbGYpOgogICAgICAgIGlmIHNlbGYudW5pbnN0YWxsZWQ6CiAgICAgICAgICAgIHNlbGYudW5pbnN0YWxsZWQucm9sbGJhY2soKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGxvZ2dlci5lcnJvcigKICAgICAgICAgICAgICAgICJDYW4ndCByb2xsYmFjayAlcywgbm90aGluZyB1bmluc3RhbGxlZC4iLCBzZWxmLm5hbWUsCiAgICAgICAgICAgICkKCiAgICBkZWYgY29tbWl0X3VuaW5zdGFsbChzZWxmKToKICAgICAgICBpZiBzZWxmLnVuaW5zdGFsbGVkOgogICAgICAgICAgICBzZWxmLnVuaW5zdGFsbGVkLmNvbW1pdCgpCiAgICAgICAgZWxpZiBub3Qgc2VsZi5ub3RoaW5nX3RvX3VuaW5zdGFsbDoKICAgICAgICAgICAgbG9nZ2VyLmVycm9yKAogICAgICAgICAgICAgICAgIkNhbid0IGNvbW1pdCAlcywgbm90aGluZyB1bmluc3RhbGxlZC4iLCBzZWxmLm5hbWUsCiAgICAgICAgICAgICkKCiAgICBkZWYgYXJjaGl2ZShzZWxmLCBidWlsZF9kaXIpOgogICAgICAgIGFzc2VydCBzZWxmLnNvdXJjZV9kaXIKICAgICAgICBjcmVhdGVfYXJjaGl2ZSA9IFRydWUKICAgICAgICBhcmNoaXZlX25hbWUgPSAnJXMtJXMuemlwJyAlIChzZWxmLm5hbWUsIHNlbGYucGtnX2luZm8oKVsidmVyc2lvbiJdKQogICAgICAgIGFyY2hpdmVfcGF0aCA9IG9zLnBhdGguam9pbihidWlsZF9kaXIsIGFyY2hpdmVfbmFtZSkKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhhcmNoaXZlX3BhdGgpOgogICAgICAgICAgICByZXNwb25zZSA9IGFza19wYXRoX2V4aXN0cygKICAgICAgICAgICAgICAgICdUaGUgZmlsZSAlcyBleGlzdHMuIChpKWdub3JlLCAodylpcGUsIChiKWFja3VwLCAoYSlib3J0ICcgJQogICAgICAgICAgICAgICAgZGlzcGxheV9wYXRoKGFyY2hpdmVfcGF0aCksICgnaScsICd3JywgJ2InLCAnYScpKQogICAgICAgICAgICBpZiByZXNwb25zZSA9PSAnaSc6CiAgICAgICAgICAgICAgICBjcmVhdGVfYXJjaGl2ZSA9IEZhbHNlCiAgICAgICAgICAgIGVsaWYgcmVzcG9uc2UgPT0gJ3cnOgogICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ0RlbGV0aW5nICVzJywgZGlzcGxheV9wYXRoKGFyY2hpdmVfcGF0aCkpCiAgICAgICAgICAgICAgICBvcy5yZW1vdmUoYXJjaGl2ZV9wYXRoKQogICAgICAgICAgICBlbGlmIHJlc3BvbnNlID09ICdiJzoKICAgICAgICAgICAgICAgIGRlc3RfZmlsZSA9IGJhY2t1cF9kaXIoYXJjaGl2ZV9wYXRoKQogICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgJ0JhY2tpbmcgdXAgJXMgdG8gJXMnLAogICAgICAgICAgICAgICAgICAgIGRpc3BsYXlfcGF0aChhcmNoaXZlX3BhdGgpLAogICAgICAgICAgICAgICAgICAgIGRpc3BsYXlfcGF0aChkZXN0X2ZpbGUpLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgc2h1dGlsLm1vdmUoYXJjaGl2ZV9wYXRoLCBkZXN0X2ZpbGUpCiAgICAgICAgICAgIGVsaWYgcmVzcG9uc2UgPT0gJ2EnOgogICAgICAgICAgICAgICAgc3lzLmV4aXQoLTEpCiAgICAgICAgaWYgY3JlYXRlX2FyY2hpdmU6CiAgICAgICAgICAgIHppcCA9IHppcGZpbGUuWmlwRmlsZSgKICAgICAgICAgICAgICAgIGFyY2hpdmVfcGF0aCwgJ3cnLCB6aXBmaWxlLlpJUF9ERUZMQVRFRCwKICAgICAgICAgICAgICAgIGFsbG93WmlwNjQ9VHJ1ZQogICAgICAgICAgICApCiAgICAgICAgICAgIGRpciA9IG9zLnBhdGgubm9ybWNhc2Uob3MucGF0aC5hYnNwYXRoKHNlbGYuc2V0dXBfcHlfZGlyKSkKICAgICAgICAgICAgZm9yIGRpcnBhdGgsIGRpcm5hbWVzLCBmaWxlbmFtZXMgaW4gb3Mud2FsayhkaXIpOgogICAgICAgICAgICAgICAgaWYgJ3BpcC1lZ2ctaW5mbycgaW4gZGlybmFtZXM6CiAgICAgICAgICAgICAgICAgICAgZGlybmFtZXMucmVtb3ZlKCdwaXAtZWdnLWluZm8nKQogICAgICAgICAgICAgICAgZm9yIGRpcm5hbWUgaW4gZGlybmFtZXM6CiAgICAgICAgICAgICAgICAgICAgZGlybmFtZSA9IG9zLnBhdGguam9pbihkaXJwYXRoLCBkaXJuYW1lKQogICAgICAgICAgICAgICAgICAgIG5hbWUgPSBzZWxmLl9jbGVhbl96aXBfbmFtZShkaXJuYW1lLCBkaXIpCiAgICAgICAgICAgICAgICAgICAgemlwZGlyID0gemlwZmlsZS5aaXBJbmZvKHNlbGYubmFtZSArICcvJyArIG5hbWUgKyAnLycpCiAgICAgICAgICAgICAgICAgICAgemlwZGlyLmV4dGVybmFsX2F0dHIgPSAweDFFRCA8PCAxNiAgIyAwbzc1NQogICAgICAgICAgICAgICAgICAgIHppcC53cml0ZXN0cih6aXBkaXIsICcnKQogICAgICAgICAgICAgICAgZm9yIGZpbGVuYW1lIGluIGZpbGVuYW1lczoKICAgICAgICAgICAgICAgICAgICBpZiBmaWxlbmFtZSA9PSBQSVBfREVMRVRFX01BUktFUl9GSUxFTkFNRToKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbihkaXJwYXRoLCBmaWxlbmFtZSkKICAgICAgICAgICAgICAgICAgICBuYW1lID0gc2VsZi5fY2xlYW5femlwX25hbWUoZmlsZW5hbWUsIGRpcikKICAgICAgICAgICAgICAgICAgICB6aXAud3JpdGUoZmlsZW5hbWUsIHNlbGYubmFtZSArICcvJyArIG5hbWUpCiAgICAgICAgICAgIHppcC5jbG9zZSgpCiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdTYXZlZCAlcycsIGRpc3BsYXlfcGF0aChhcmNoaXZlX3BhdGgpKQoKICAgIGRlZiBfY2xlYW5femlwX25hbWUoc2VsZiwgbmFtZSwgcHJlZml4KToKICAgICAgICBhc3NlcnQgbmFtZS5zdGFydHN3aXRoKHByZWZpeCArIG9zLnBhdGguc2VwKSwgKAogICAgICAgICAgICAibmFtZSAlciBkb2Vzbid0IHN0YXJ0IHdpdGggcHJlZml4ICVyIiAlIChuYW1lLCBwcmVmaXgpCiAgICAgICAgKQogICAgICAgIG5hbWUgPSBuYW1lW2xlbihwcmVmaXgpICsgMTpdCiAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZShvcy5wYXRoLnNlcCwgJy8nKQogICAgICAgIHJldHVybiBuYW1lCgogICAgZGVmIG1hdGNoX21hcmtlcnMoc2VsZiwgZXh0cmFzX3JlcXVlc3RlZD1Ob25lKToKICAgICAgICBpZiBub3QgZXh0cmFzX3JlcXVlc3RlZDoKICAgICAgICAgICAgIyBQcm92aWRlIGFuIGV4dHJhIHRvIHNhZmVseSBldmFsdWF0ZSB0aGUgbWFya2VycwogICAgICAgICAgICAjIHdpdGhvdXQgbWF0Y2hpbmcgYW55IGV4dHJhCiAgICAgICAgICAgIGV4dHJhc19yZXF1ZXN0ZWQgPSAoJycsKQogICAgICAgIGlmIHNlbGYubWFya2VycyBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIGFueSgKICAgICAgICAgICAgICAgIHNlbGYubWFya2Vycy5ldmFsdWF0ZSh7J2V4dHJhJzogZXh0cmF9KQogICAgICAgICAgICAgICAgZm9yIGV4dHJhIGluIGV4dHJhc19yZXF1ZXN0ZWQpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgaW5zdGFsbChzZWxmLCBpbnN0YWxsX29wdGlvbnMsIGdsb2JhbF9vcHRpb25zPVtdLCByb290PU5vbmUsCiAgICAgICAgICAgICAgICBwcmVmaXg9Tm9uZSk6CiAgICAgICAgaWYgc2VsZi5lZGl0YWJsZToKICAgICAgICAgICAgc2VsZi5pbnN0YWxsX2VkaXRhYmxlKAogICAgICAgICAgICAgICAgaW5zdGFsbF9vcHRpb25zLCBnbG9iYWxfb3B0aW9ucywgcHJlZml4PXByZWZpeCkKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgaWYgc2VsZi5pc193aGVlbDoKICAgICAgICAgICAgdmVyc2lvbiA9IHBpcC53aGVlbC53aGVlbF92ZXJzaW9uKHNlbGYuc291cmNlX2RpcikKICAgICAgICAgICAgcGlwLndoZWVsLmNoZWNrX2NvbXBhdGliaWxpdHkodmVyc2lvbiwgc2VsZi5uYW1lKQoKICAgICAgICAgICAgc2VsZi5tb3ZlX3doZWVsX2ZpbGVzKHNlbGYuc291cmNlX2Rpciwgcm9vdD1yb290LCBwcmVmaXg9cHJlZml4KQogICAgICAgICAgICBzZWxmLmluc3RhbGxfc3VjY2VlZGVkID0gVHJ1ZQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyBFeHRlbmQgdGhlIGxpc3Qgb2YgZ2xvYmFsIGFuZCBpbnN0YWxsIG9wdGlvbnMgcGFzc2VkIG9uIHRvCiAgICAgICAgIyB0aGUgc2V0dXAucHkgY2FsbCB3aXRoIHRoZSBvbmVzIGZyb20gdGhlIHJlcXVpcmVtZW50cyBmaWxlLgogICAgICAgICMgT3B0aW9ucyBzcGVjaWZpZWQgaW4gcmVxdWlyZW1lbnRzIGZpbGUgb3ZlcnJpZGUgdGhvc2UKICAgICAgICAjIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLCBzaW5jZSB0aGUgbGFzdCBvcHRpb24gZ2l2ZW4KICAgICAgICAjIHRvIHNldHVwLnB5IGlzIHRoZSBvbmUgdGhhdCBpcyB1c2VkLgogICAgICAgIGdsb2JhbF9vcHRpb25zICs9IHNlbGYub3B0aW9ucy5nZXQoJ2dsb2JhbF9vcHRpb25zJywgW10pCiAgICAgICAgaW5zdGFsbF9vcHRpb25zICs9IHNlbGYub3B0aW9ucy5nZXQoJ2luc3RhbGxfb3B0aW9ucycsIFtdKQoKICAgICAgICBpZiBzZWxmLmlzb2xhdGVkOgogICAgICAgICAgICBnbG9iYWxfb3B0aW9ucyA9IGxpc3QoZ2xvYmFsX29wdGlvbnMpICsgWyItLW5vLXVzZXItY2ZnIl0KCiAgICAgICAgdGVtcF9sb2NhdGlvbiA9IHRlbXBmaWxlLm1rZHRlbXAoJy1yZWNvcmQnLCAncGlwLScpCiAgICAgICAgcmVjb3JkX2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKHRlbXBfbG9jYXRpb24sICdpbnN0YWxsLXJlY29yZC50eHQnKQogICAgICAgIHRyeToKICAgICAgICAgICAgaW5zdGFsbF9hcmdzID0gc2VsZi5nZXRfaW5zdGFsbF9hcmdzKAogICAgICAgICAgICAgICAgZ2xvYmFsX29wdGlvbnMsIHJlY29yZF9maWxlbmFtZSwgcm9vdCwgcHJlZml4KQogICAgICAgICAgICBtc2cgPSAnUnVubmluZyBzZXR1cC5weSBpbnN0YWxsIGZvciAlcycgJSAoc2VsZi5uYW1lLCkKICAgICAgICAgICAgd2l0aCBvcGVuX3NwaW5uZXIobXNnKSBhcyBzcGlubmVyOgogICAgICAgICAgICAgICAgd2l0aCBpbmRlbnRfbG9nKCk6CiAgICAgICAgICAgICAgICAgICAgY2FsbF9zdWJwcm9jZXNzKAogICAgICAgICAgICAgICAgICAgICAgICBpbnN0YWxsX2FyZ3MgKyBpbnN0YWxsX29wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgIGN3ZD1zZWxmLnNldHVwX3B5X2RpciwKICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19zdGRvdXQ9RmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgIHNwaW5uZXI9c3Bpbm5lciwKICAgICAgICAgICAgICAgICAgICApCgogICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocmVjb3JkX2ZpbGVuYW1lKToKICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnUmVjb3JkIGZpbGUgJXMgbm90IGZvdW5kJywgcmVjb3JkX2ZpbGVuYW1lKQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIHNlbGYuaW5zdGFsbF9zdWNjZWVkZWQgPSBUcnVlCiAgICAgICAgICAgIGlmIHNlbGYuYXNfZWdnOgogICAgICAgICAgICAgICAgIyB0aGVyZSdzIG5vIC0tYWx3YXlzLXVuemlwIG9wdGlvbiB3ZSBjYW4gcGFzcyB0byBpbnN0YWxsCiAgICAgICAgICAgICAgICAjIGNvbW1hbmQgc28gd2UgdW5hYmxlIHRvIHNhdmUgdGhlIGluc3RhbGxlZC1maWxlcy50eHQKICAgICAgICAgICAgICAgIHJldHVybgoKICAgICAgICAgICAgZGVmIHByZXBlbmRfcm9vdChwYXRoKToKICAgICAgICAgICAgICAgIGlmIHJvb3QgaXMgTm9uZSBvciBub3Qgb3MucGF0aC5pc2FicyhwYXRoKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGF0aAogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2hhbmdlX3Jvb3Qocm9vdCwgcGF0aCkKCiAgICAgICAgICAgIHdpdGggb3BlbihyZWNvcmRfZmlsZW5hbWUpIGFzIGY6CiAgICAgICAgICAgICAgICBmb3IgbGluZSBpbiBmOgogICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeSA9IG9zLnBhdGguZGlybmFtZShsaW5lKQogICAgICAgICAgICAgICAgICAgIGlmIGRpcmVjdG9yeS5lbmRzd2l0aCgnLmVnZy1pbmZvJyk6CiAgICAgICAgICAgICAgICAgICAgICAgIGVnZ19pbmZvX2RpciA9IHByZXBlbmRfcm9vdChkaXJlY3RvcnkpCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAnQ291bGQgbm90IGZpbmQgLmVnZy1pbmZvIGRpcmVjdG9yeSBpbiBpbnN0YWxsIHJlY29yZCcKICAgICAgICAgICAgICAgICAgICAgICAgJyBmb3IgJXMnLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAjIEZJWE1FOiBwdXQgdGhlIHJlY29yZCBzb21ld2hlcmUKICAgICAgICAgICAgICAgICAgICAjIEZJWE1FOiBzaG91bGQgdGhpcyBiZSBhbiBlcnJvcj8KICAgICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgbmV3X2xpbmVzID0gW10KICAgICAgICAgICAgd2l0aCBvcGVuKHJlY29yZF9maWxlbmFtZSkgYXMgZjoKICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIGY6CiAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBsaW5lLnN0cmlwKCkKICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGZpbGVuYW1lKToKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgKz0gb3MucGF0aC5zZXAKICAgICAgICAgICAgICAgICAgICBuZXdfbGluZXMuYXBwZW5kKAogICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLnJlbHBhdGgoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVwZW5kX3Jvb3QoZmlsZW5hbWUpLCBlZ2dfaW5mb19kaXIpCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICBpbnN0X2ZpbGVzX3BhdGggPSBvcy5wYXRoLmpvaW4oZWdnX2luZm9fZGlyLCAnaW5zdGFsbGVkLWZpbGVzLnR4dCcpCiAgICAgICAgICAgIHdpdGggb3BlbihpbnN0X2ZpbGVzX3BhdGgsICd3JykgYXMgZjoKICAgICAgICAgICAgICAgIGYud3JpdGUoJ1xuJy5qb2luKG5ld19saW5lcykgKyAnXG4nKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHJlY29yZF9maWxlbmFtZSk6CiAgICAgICAgICAgICAgICBvcy5yZW1vdmUocmVjb3JkX2ZpbGVuYW1lKQogICAgICAgICAgICBybXRyZWUodGVtcF9sb2NhdGlvbikKCiAgICBkZWYgZW5zdXJlX2hhc19zb3VyY2VfZGlyKHNlbGYsIHBhcmVudF9kaXIpOgogICAgICAgICIiIkVuc3VyZSB0aGF0IGEgc291cmNlX2RpciBpcyBzZXQuCgogICAgICAgIFRoaXMgd2lsbCBjcmVhdGUgYSB0ZW1wb3JhcnkgYnVpbGQgZGlyIGlmIHRoZSBuYW1lIG9mIHRoZSByZXF1aXJlbWVudAogICAgICAgIGlzbid0IGtub3duIHlldC4KCiAgICAgICAgOnBhcmFtIHBhcmVudF9kaXI6IFRoZSBpZGVhbCBwaXAgcGFyZW50X2RpciBmb3IgdGhlIHNvdXJjZV9kaXIuCiAgICAgICAgICAgIEdlbmVyYWxseSBzcmNfZGlyIGZvciBlZGl0YWJsZXMgYW5kIGJ1aWxkX2RpciBmb3Igc2Rpc3RzLgogICAgICAgIDpyZXR1cm46IHNlbGYuc291cmNlX2RpcgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuc291cmNlX2RpciBpcyBOb25lOgogICAgICAgICAgICBzZWxmLnNvdXJjZV9kaXIgPSBzZWxmLmJ1aWxkX2xvY2F0aW9uKHBhcmVudF9kaXIpCiAgICAgICAgcmV0dXJuIHNlbGYuc291cmNlX2RpcgoKICAgIGRlZiBnZXRfaW5zdGFsbF9hcmdzKHNlbGYsIGdsb2JhbF9vcHRpb25zLCByZWNvcmRfZmlsZW5hbWUsIHJvb3QsIHByZWZpeCk6CiAgICAgICAgaW5zdGFsbF9hcmdzID0gW3N5cy5leGVjdXRhYmxlLCAiLXUiXQogICAgICAgIGluc3RhbGxfYXJncy5hcHBlbmQoJy1jJykKICAgICAgICBpbnN0YWxsX2FyZ3MuYXBwZW5kKFNFVFVQVE9PTFNfU0hJTSAlIHNlbGYuc2V0dXBfcHkpCiAgICAgICAgaW5zdGFsbF9hcmdzICs9IGxpc3QoZ2xvYmFsX29wdGlvbnMpICsgXAogICAgICAgICAgICBbJ2luc3RhbGwnLCAnLS1yZWNvcmQnLCByZWNvcmRfZmlsZW5hbWVdCgogICAgICAgIGlmIG5vdCBzZWxmLmFzX2VnZzoKICAgICAgICAgICAgaW5zdGFsbF9hcmdzICs9IFsnLS1zaW5nbGUtdmVyc2lvbi1leHRlcm5hbGx5LW1hbmFnZWQnXQoKICAgICAgICBpZiByb290IGlzIG5vdCBOb25lOgogICAgICAgICAgICBpbnN0YWxsX2FyZ3MgKz0gWyctLXJvb3QnLCByb290XQogICAgICAgIGlmIHByZWZpeCBpcyBub3QgTm9uZToKICAgICAgICAgICAgaW5zdGFsbF9hcmdzICs9IFsnLS1wcmVmaXgnLCBwcmVmaXhdCgogICAgICAgIGlmIHNlbGYucHljb21waWxlOgogICAgICAgICAgICBpbnN0YWxsX2FyZ3MgKz0gWyItLWNvbXBpbGUiXQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGluc3RhbGxfYXJncyArPSBbIi0tbm8tY29tcGlsZSJdCgogICAgICAgIGlmIHJ1bm5pbmdfdW5kZXJfdmlydHVhbGVudigpOgogICAgICAgICAgICBweV92ZXJfc3RyID0gJ3B5dGhvbicgKyBzeXNjb25maWcuZ2V0X3B5dGhvbl92ZXJzaW9uKCkKICAgICAgICAgICAgaW5zdGFsbF9hcmdzICs9IFsnLS1pbnN0YWxsLWhlYWRlcnMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihzeXMucHJlZml4LCAnaW5jbHVkZScsICdzaXRlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHlfdmVyX3N0ciwgc2VsZi5uYW1lKV0KCiAgICAgICAgcmV0dXJuIGluc3RhbGxfYXJncwoKICAgIGRlZiByZW1vdmVfdGVtcG9yYXJ5X3NvdXJjZShzZWxmKToKICAgICAgICAiIiJSZW1vdmUgdGhlIHNvdXJjZSBmaWxlcyBmcm9tIHRoaXMgcmVxdWlyZW1lbnQsIGlmIHRoZXkgYXJlIG1hcmtlZAogICAgICAgIGZvciBkZWxldGlvbiIiIgogICAgICAgIGlmIHNlbGYuc291cmNlX2RpciBhbmQgb3MucGF0aC5leGlzdHMoCiAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oc2VsZi5zb3VyY2VfZGlyLCBQSVBfREVMRVRFX01BUktFUl9GSUxFTkFNRSkpOgogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1JlbW92aW5nIHNvdXJjZSBpbiAlcycsIHNlbGYuc291cmNlX2RpcikKICAgICAgICAgICAgcm10cmVlKHNlbGYuc291cmNlX2RpcikKICAgICAgICBzZWxmLnNvdXJjZV9kaXIgPSBOb25lCiAgICAgICAgaWYgc2VsZi5fdGVtcF9idWlsZF9kaXIgYW5kIG9zLnBhdGguZXhpc3RzKHNlbGYuX3RlbXBfYnVpbGRfZGlyKToKICAgICAgICAgICAgcm10cmVlKHNlbGYuX3RlbXBfYnVpbGRfZGlyKQogICAgICAgIHNlbGYuX3RlbXBfYnVpbGRfZGlyID0gTm9uZQoKICAgIGRlZiBpbnN0YWxsX2VkaXRhYmxlKHNlbGYsIGluc3RhbGxfb3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbF9vcHRpb25zPSgpLCBwcmVmaXg9Tm9uZSk6CiAgICAgICAgbG9nZ2VyLmluZm8oJ1J1bm5pbmcgc2V0dXAucHkgZGV2ZWxvcCBmb3IgJXMnLCBzZWxmLm5hbWUpCgogICAgICAgIGlmIHNlbGYuaXNvbGF0ZWQ6CiAgICAgICAgICAgIGdsb2JhbF9vcHRpb25zID0gbGlzdChnbG9iYWxfb3B0aW9ucykgKyBbIi0tbm8tdXNlci1jZmciXQoKICAgICAgICBpZiBwcmVmaXg6CiAgICAgICAgICAgIHByZWZpeF9wYXJhbSA9IFsnLS1wcmVmaXg9ezB9Jy5mb3JtYXQocHJlZml4KV0KICAgICAgICAgICAgaW5zdGFsbF9vcHRpb25zID0gbGlzdChpbnN0YWxsX29wdGlvbnMpICsgcHJlZml4X3BhcmFtCgogICAgICAgIHdpdGggaW5kZW50X2xvZygpOgogICAgICAgICAgICAjIEZJWE1FOiBzaG91bGQgd2UgZG8gLS1pbnN0YWxsLWhlYWRlcnMgaGVyZSB0b28/CiAgICAgICAgICAgIGNhbGxfc3VicHJvY2VzcygKICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICBzeXMuZXhlY3V0YWJsZSwKICAgICAgICAgICAgICAgICAgICAnLWMnLAogICAgICAgICAgICAgICAgICAgIFNFVFVQVE9PTFNfU0hJTSAlIHNlbGYuc2V0dXBfcHkKICAgICAgICAgICAgICAgIF0gKwogICAgICAgICAgICAgICAgbGlzdChnbG9iYWxfb3B0aW9ucykgKwogICAgICAgICAgICAgICAgWydkZXZlbG9wJywgJy0tbm8tZGVwcyddICsKICAgICAgICAgICAgICAgIGxpc3QoaW5zdGFsbF9vcHRpb25zKSwKCiAgICAgICAgICAgICAgICBjd2Q9c2VsZi5zZXR1cF9weV9kaXIsCiAgICAgICAgICAgICAgICBzaG93X3N0ZG91dD1GYWxzZSkKCiAgICAgICAgc2VsZi5pbnN0YWxsX3N1Y2NlZWRlZCA9IFRydWUKCiAgICBkZWYgY2hlY2tfaWZfZXhpc3RzKHNlbGYpOgogICAgICAgICIiIkZpbmQgYW4gaW5zdGFsbGVkIGRpc3RyaWJ1dGlvbiB0aGF0IHNhdGlzZmllcyBvciBjb25mbGljdHMKICAgICAgICB3aXRoIHRoaXMgcmVxdWlyZW1lbnQsIGFuZCBzZXQgc2VsZi5zYXRpc2ZpZWRfYnkgb3IKICAgICAgICBzZWxmLmNvbmZsaWN0c193aXRoIGFwcHJvcHJpYXRlbHkuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi5yZXEgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIGdldF9kaXN0cmlidXRpb24oKSB3aWxsIHJlc29sdmUgdGhlIGVudGlyZSBsaXN0IG9mIHJlcXVpcmVtZW50cwogICAgICAgICAgICAjIGFueXdheSwgYW5kIHdlJ3ZlIGFscmVhZHkgZGV0ZXJtaW5lZCB0aGF0IHdlIG5lZWQgdGhlIHJlcXVpcmVtZW50CiAgICAgICAgICAgICMgaW4gcXVlc3Rpb24sIHNvIHN0cmlwIHRoZSBtYXJrZXIgc28gdGhhdCB3ZSBkb24ndCB0cnkgdG8KICAgICAgICAgICAgIyBldmFsdWF0ZSBpdC4KICAgICAgICAgICAgbm9fbWFya2VyID0gUmVxdWlyZW1lbnQoc3RyKHNlbGYucmVxKSkKICAgICAgICAgICAgbm9fbWFya2VyLm1hcmtlciA9IE5vbmUKICAgICAgICAgICAgc2VsZi5zYXRpc2ZpZWRfYnkgPSBwa2dfcmVzb3VyY2VzLmdldF9kaXN0cmlidXRpb24oc3RyKG5vX21hcmtlcikpCiAgICAgICAgICAgIGlmIHNlbGYuZWRpdGFibGUgYW5kIHNlbGYuc2F0aXNmaWVkX2J5OgogICAgICAgICAgICAgICAgc2VsZi5jb25mbGljdHNfd2l0aCA9IHNlbGYuc2F0aXNmaWVkX2J5CiAgICAgICAgICAgICAgICAjIHdoZW4gaW5zdGFsbGluZyBlZGl0YWJsZXMsIG5vdGhpbmcgcHJlLWV4aXN0aW5nIHNob3VsZCBldmVyCiAgICAgICAgICAgICAgICAjIHNhdGlzZnkKICAgICAgICAgICAgICAgIHNlbGYuc2F0aXNmaWVkX2J5ID0gTm9uZQogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBleGNlcHQgcGtnX3Jlc291cmNlcy5EaXN0cmlidXRpb25Ob3RGb3VuZDoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgZXhjZXB0IHBrZ19yZXNvdXJjZXMuVmVyc2lvbkNvbmZsaWN0OgogICAgICAgICAgICBleGlzdGluZ19kaXN0ID0gcGtnX3Jlc291cmNlcy5nZXRfZGlzdHJpYnV0aW9uKAogICAgICAgICAgICAgICAgc2VsZi5yZXEubmFtZQogICAgICAgICAgICApCiAgICAgICAgICAgIGlmIHNlbGYudXNlX3VzZXJfc2l0ZToKICAgICAgICAgICAgICAgIGlmIGRpc3RfaW5fdXNlcnNpdGUoZXhpc3RpbmdfZGlzdCk6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5jb25mbGljdHNfd2l0aCA9IGV4aXN0aW5nX2Rpc3QKICAgICAgICAgICAgICAgIGVsaWYgKHJ1bm5pbmdfdW5kZXJfdmlydHVhbGVudigpIGFuZAogICAgICAgICAgICAgICAgICAgICAgICBkaXN0X2luX3NpdGVfcGFja2FnZXMoZXhpc3RpbmdfZGlzdCkpOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIEluc3RhbGxhdGlvbkVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICAiV2lsbCBub3QgaW5zdGFsbCB0byB0aGUgdXNlciBzaXRlIGJlY2F1c2UgaXQgd2lsbCAiCiAgICAgICAgICAgICAgICAgICAgICAgICJsYWNrIHN5cy5wYXRoIHByZWNlZGVuY2UgdG8gJXMgaW4gJXMiICUKICAgICAgICAgICAgICAgICAgICAgICAgKGV4aXN0aW5nX2Rpc3QucHJvamVjdF9uYW1lLCBleGlzdGluZ19kaXN0LmxvY2F0aW9uKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuY29uZmxpY3RzX3dpdGggPSBleGlzdGluZ19kaXN0CiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBAcHJvcGVydHkKICAgIGRlZiBpc193aGVlbChzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5saW5rIGFuZCBzZWxmLmxpbmsuaXNfd2hlZWwKCiAgICBkZWYgbW92ZV93aGVlbF9maWxlcyhzZWxmLCB3aGVlbGRpciwgcm9vdD1Ob25lLCBwcmVmaXg9Tm9uZSk6CiAgICAgICAgbW92ZV93aGVlbF9maWxlcygKICAgICAgICAgICAgc2VsZi5uYW1lLCBzZWxmLnJlcSwgd2hlZWxkaXIsCiAgICAgICAgICAgIHVzZXI9c2VsZi51c2VfdXNlcl9zaXRlLAogICAgICAgICAgICBob21lPXNlbGYudGFyZ2V0X2RpciwKICAgICAgICAgICAgcm9vdD1yb290LAogICAgICAgICAgICBwcmVmaXg9cHJlZml4LAogICAgICAgICAgICBweWNvbXBpbGU9c2VsZi5weWNvbXBpbGUsCiAgICAgICAgICAgIGlzb2xhdGVkPXNlbGYuaXNvbGF0ZWQsCiAgICAgICAgKQoKICAgIGRlZiBnZXRfZGlzdChzZWxmKToKICAgICAgICAiIiJSZXR1cm4gYSBwa2dfcmVzb3VyY2VzLkRpc3RyaWJ1dGlvbiBidWlsdCBmcm9tIHNlbGYuZWdnX2luZm9fcGF0aCIiIgogICAgICAgIGVnZ19pbmZvID0gc2VsZi5lZ2dfaW5mb19wYXRoKCcnKS5yc3RyaXAoJy8nKQogICAgICAgIGJhc2VfZGlyID0gb3MucGF0aC5kaXJuYW1lKGVnZ19pbmZvKQogICAgICAgIG1ldGFkYXRhID0gcGtnX3Jlc291cmNlcy5QYXRoTWV0YWRhdGEoYmFzZV9kaXIsIGVnZ19pbmZvKQogICAgICAgIGRpc3RfbmFtZSA9IG9zLnBhdGguc3BsaXRleHQob3MucGF0aC5iYXNlbmFtZShlZ2dfaW5mbykpWzBdCiAgICAgICAgcmV0dXJuIHBrZ19yZXNvdXJjZXMuRGlzdHJpYnV0aW9uKAogICAgICAgICAgICBvcy5wYXRoLmRpcm5hbWUoZWdnX2luZm8pLAogICAgICAgICAgICBwcm9qZWN0X25hbWU9ZGlzdF9uYW1lLAogICAgICAgICAgICBtZXRhZGF0YT1tZXRhZGF0YSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBoYXNfaGFzaF9vcHRpb25zKHNlbGYpOgogICAgICAgICIiIlJldHVybiB3aGV0aGVyIGFueSBrbm93bi1nb29kIGhhc2hlcyBhcmUgc3BlY2lmaWVkIGFzIG9wdGlvbnMuCgogICAgICAgIFRoZXNlIGFjdGl2YXRlIC0tcmVxdWlyZS1oYXNoZXMgbW9kZTsgaGFzaGVzIHNwZWNpZmllZCBhcyBwYXJ0IG9mIGEKICAgICAgICBVUkwgZG8gbm90LgoKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gYm9vbChzZWxmLm9wdGlvbnMuZ2V0KCdoYXNoZXMnLCB7fSkpCgogICAgZGVmIGhhc2hlcyhzZWxmLCB0cnVzdF9pbnRlcm5ldD1UcnVlKToKICAgICAgICAiIiJSZXR1cm4gYSBoYXNoLWNvbXBhcmVyIHRoYXQgY29uc2lkZXJzIG15IG9wdGlvbi0gYW5kIFVSTC1iYXNlZAogICAgICAgIGhhc2hlcyB0byBiZSBrbm93bi1nb29kLgoKICAgICAgICBIYXNoZXMgaW4gVVJMcy0tb25lcyBlbWJlZGRlZCBpbiB0aGUgcmVxdWlyZW1lbnRzIGZpbGUsIG5vdCBvbmVzCiAgICAgICAgZG93bmxvYWRlZCBmcm9tIGFuIGluZGV4IHNlcnZlci0tYXJlIGFsbW9zdCBwZWVycyB3aXRoIG9uZXMgZnJvbQogICAgICAgIGZsYWdzLiBUaGV5IHNhdGlzZnkgLS1yZXF1aXJlLWhhc2hlcyAod2hldGhlciBpdCB3YXMgaW1wbGljaXRseSBvcgogICAgICAgIGV4cGxpY2l0bHkgYWN0aXZhdGVkKSBidXQgZG8gbm90IGFjdGl2YXRlIGl0LiBtZDUgYW5kIHNoYTIyNCBhcmUgbm90CiAgICAgICAgYWxsb3dlZCBpbiBmbGFncywgd2hpY2ggc2hvdWxkIG51ZGdlIHBlb3BsZSB0b3dhcmQgZ29vZCBhbGdvcy4gV2UKICAgICAgICBhbHdheXMgT1IgYWxsIGhhc2hlcyB0b2dldGhlciwgZXZlbiBvbmVzIGZyb20gVVJMcy4KCiAgICAgICAgOnBhcmFtIHRydXN0X2ludGVybmV0OiBXaGV0aGVyIHRvIHRydXN0IFVSTC1iYXNlZCAoI21kNT0uLi4pIGhhc2hlcwogICAgICAgICAgICBkb3dubG9hZGVkIGZyb20gdGhlIGludGVybmV0LCBhcyBieSBwb3B1bGF0ZV9saW5rKCkKCiAgICAgICAgIiIiCiAgICAgICAgZ29vZF9oYXNoZXMgPSBzZWxmLm9wdGlvbnMuZ2V0KCdoYXNoZXMnLCB7fSkuY29weSgpCiAgICAgICAgbGluayA9IHNlbGYubGluayBpZiB0cnVzdF9pbnRlcm5ldCBlbHNlIHNlbGYub3JpZ2luYWxfbGluawogICAgICAgIGlmIGxpbmsgYW5kIGxpbmsuaGFzaDoKICAgICAgICAgICAgZ29vZF9oYXNoZXMuc2V0ZGVmYXVsdChsaW5rLmhhc2hfbmFtZSwgW10pLmFwcGVuZChsaW5rLmhhc2gpCiAgICAgICAgcmV0dXJuIEhhc2hlcyhnb29kX2hhc2hlcykKCgpkZWYgX3N0cmlwX3Bvc3RmaXgocmVxKToKICAgICIiIgogICAgICAgIFN0cmlwIHJlcSBwb3N0Zml4ICggLWRldiwgMC4yLCBldGMgKQogICAgIiIiCiAgICAjIEZJWE1FOiB1c2UgcGFja2FnZV90b19yZXF1aXJlbWVudD8KICAgIG1hdGNoID0gcmUuc2VhcmNoKHInXiguKj8pKD86LWRldnwtXGQuKikkJywgcmVxKQogICAgaWYgbWF0Y2g6CiAgICAgICAgIyBTdHJpcCBvZmYgLWRldiwgLTAuMiwgZXRjLgogICAgICAgIHJlcSA9IG1hdGNoLmdyb3VwKDEpCiAgICByZXR1cm4gcmVxCgoKZGVmIHBhcnNlX2VkaXRhYmxlKGVkaXRhYmxlX3JlcSwgZGVmYXVsdF92Y3M9Tm9uZSk6CiAgICAiIiJQYXJzZXMgYW4gZWRpdGFibGUgcmVxdWlyZW1lbnQgaW50bzoKICAgICAgICAtIGEgcmVxdWlyZW1lbnQgbmFtZQogICAgICAgIC0gYW4gVVJMCiAgICAgICAgLSBleHRyYXMKICAgICAgICAtIGVkaXRhYmxlIG9wdGlvbnMKICAgIEFjY2VwdGVkIHJlcXVpcmVtZW50czoKICAgICAgICBzdm4raHR0cDovL2JsYWhibGFoQHJldiNlZ2c9Rm9vYmFyW2Jhel0mc3ViZGlyZWN0b3J5PXZlcnNpb25fc3ViZGlyCiAgICAgICAgLltzb21lX2V4dHJhXQogICAgIiIiCgogICAgZnJvbSBwaXAuaW5kZXggaW1wb3J0IExpbmsKCiAgICB1cmwgPSBlZGl0YWJsZV9yZXEKICAgIGV4dHJhcyA9IE5vbmUKCiAgICAjIElmIGEgZmlsZSBwYXRoIGlzIHNwZWNpZmllZCB3aXRoIGV4dHJhcywgc3RyaXAgb2ZmIHRoZSBleHRyYXMuCiAgICBtID0gcmUubWF0Y2gocideKC4rKShcW1teXF1dK1xdKSQnLCB1cmwpCiAgICBpZiBtOgogICAgICAgIHVybF9ub19leHRyYXMgPSBtLmdyb3VwKDEpCiAgICAgICAgZXh0cmFzID0gbS5ncm91cCgyKQogICAgZWxzZToKICAgICAgICB1cmxfbm9fZXh0cmFzID0gdXJsCgogICAgaWYgb3MucGF0aC5pc2Rpcih1cmxfbm9fZXh0cmFzKToKICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKHVybF9ub19leHRyYXMsICdzZXR1cC5weScpKToKICAgICAgICAgICAgcmFpc2UgSW5zdGFsbGF0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAiRGlyZWN0b3J5ICVyIGlzIG5vdCBpbnN0YWxsYWJsZS4gRmlsZSAnc2V0dXAucHknIG5vdCBmb3VuZC4iICUKICAgICAgICAgICAgICAgIHVybF9ub19leHRyYXMKICAgICAgICAgICAgKQogICAgICAgICMgVHJlYXRpbmcgaXQgYXMgY29kZSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gY2hlY2tlZCBvdXQKICAgICAgICB1cmxfbm9fZXh0cmFzID0gcGF0aF90b191cmwodXJsX25vX2V4dHJhcykKCiAgICBpZiB1cmxfbm9fZXh0cmFzLmxvd2VyKCkuc3RhcnRzd2l0aCgnZmlsZTonKToKICAgICAgICBwYWNrYWdlX25hbWUgPSBMaW5rKHVybF9ub19leHRyYXMpLmVnZ19mcmFnbWVudAogICAgICAgIGlmIGV4dHJhczoKICAgICAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgICAgIHBhY2thZ2VfbmFtZSwKICAgICAgICAgICAgICAgIHVybF9ub19leHRyYXMsCiAgICAgICAgICAgICAgICBSZXF1aXJlbWVudCgicGxhY2Vob2xkZXIiICsgZXh0cmFzLmxvd2VyKCkpLmV4dHJhcywKICAgICAgICAgICAgKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBwYWNrYWdlX25hbWUsIHVybF9ub19leHRyYXMsIE5vbmUKCiAgICBmb3IgdmVyc2lvbl9jb250cm9sIGluIHZjczoKICAgICAgICBpZiB1cmwubG93ZXIoKS5zdGFydHN3aXRoKCclczonICUgdmVyc2lvbl9jb250cm9sKToKICAgICAgICAgICAgdXJsID0gJyVzKyVzJyAlICh2ZXJzaW9uX2NvbnRyb2wsIHVybCkKICAgICAgICAgICAgYnJlYWsKCiAgICBpZiAnKycgbm90IGluIHVybDoKICAgICAgICBpZiBkZWZhdWx0X3ZjczoKICAgICAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgICAgICItLWRlZmF1bHQtdmNzIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiAiCiAgICAgICAgICAgICAgICAidGhlIGZ1dHVyZS4iLAogICAgICAgICAgICAgICAgUmVtb3ZlZEluUGlwMTBXYXJuaW5nLAogICAgICAgICAgICApCiAgICAgICAgICAgIHVybCA9IGRlZmF1bHRfdmNzICsgJysnICsgdXJsCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgSW5zdGFsbGF0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAnJXMgc2hvdWxkIGVpdGhlciBiZSBhIHBhdGggdG8gYSBsb2NhbCBwcm9qZWN0IG9yIGEgVkNTIHVybCAnCiAgICAgICAgICAgICAgICAnYmVnaW5uaW5nIHdpdGggc3ZuKywgZ2l0KywgaGcrLCBvciBienIrJyAlCiAgICAgICAgICAgICAgICBlZGl0YWJsZV9yZXEKICAgICAgICAgICAgKQoKICAgIHZjX3R5cGUgPSB1cmwuc3BsaXQoJysnLCAxKVswXS5sb3dlcigpCgogICAgaWYgbm90IHZjcy5nZXRfYmFja2VuZCh2Y190eXBlKToKICAgICAgICBlcnJvcl9tZXNzYWdlID0gJ0ZvciAtLWVkaXRhYmxlPSVzIG9ubHkgJyAlIGVkaXRhYmxlX3JlcSArIFwKICAgICAgICAgICAgJywgJy5qb2luKFtiYWNrZW5kLm5hbWUgKyAnK1VSTCcgZm9yIGJhY2tlbmQgaW4gdmNzLmJhY2tlbmRzXSkgKyBcCiAgICAgICAgICAgICcgaXMgY3VycmVudGx5IHN1cHBvcnRlZCcKICAgICAgICByYWlzZSBJbnN0YWxsYXRpb25FcnJvcihlcnJvcl9tZXNzYWdlKQoKICAgIHBhY2thZ2VfbmFtZSA9IExpbmsodXJsKS5lZ2dfZnJhZ21lbnQKICAgIGlmIG5vdCBwYWNrYWdlX25hbWU6CiAgICAgICAgcmFpc2UgSW5zdGFsbGF0aW9uRXJyb3IoCiAgICAgICAgICAgICJDb3VsZCBub3QgZGV0ZWN0IHJlcXVpcmVtZW50IG5hbWUsIHBsZWFzZSBzcGVjaWZ5IG9uZSB3aXRoICNlZ2c9IgogICAgICAgICkKICAgIGlmIG5vdCBwYWNrYWdlX25hbWU6CiAgICAgICAgcmFpc2UgSW5zdGFsbGF0aW9uRXJyb3IoCiAgICAgICAgICAgICctLWVkaXRhYmxlPSVzIGlzIG5vdCB0aGUgcmlnaHQgZm9ybWF0OyBpdCBtdXN0IGhhdmUgJwogICAgICAgICAgICAnI2VnZz1QYWNrYWdlJyAlIGVkaXRhYmxlX3JlcQogICAgICAgICkKICAgIHJldHVybiBfc3RyaXBfcG9zdGZpeChwYWNrYWdlX25hbWUpLCB1cmwsIE5vbmUKUEsDBBQAAAAAAAAAIQAS3ZJ2noYAAJ6GAAAiAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9yZXEvcmVxX3NldC5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0Cgpmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZWZhdWx0ZGljdApmcm9tIGl0ZXJ0b29scyBpbXBvcnQgY2hhaW4KaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG9zCgpmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCBwa2dfcmVzb3VyY2VzCmZyb20gcGlwLl92ZW5kb3IgaW1wb3J0IHJlcXVlc3RzCgpmcm9tIHBpcC5jb21wYXQgaW1wb3J0IGV4cGFuZHVzZXIKZnJvbSBwaXAuZG93bmxvYWQgaW1wb3J0IChpc19maWxlX3VybCwgaXNfZGlyX3VybCwgaXNfdmNzX3VybCwgdXJsX3RvX3BhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdW5wYWNrX3VybCkKZnJvbSBwaXAuZXhjZXB0aW9ucyBpbXBvcnQgKEluc3RhbGxhdGlvbkVycm9yLCBCZXN0VmVyc2lvbkFscmVhZHlJbnN0YWxsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXN0cmlidXRpb25Ob3RGb3VuZCwgUHJldmlvdXNCdWlsZERpckVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzaEVycm9yLCBIYXNoRXJyb3JzLCBIYXNoVW5waW5uZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXJlY3RvcnlVcmxIYXNoVW5zdXBwb3J0ZWQsIFZjc0hhc2hVbnN1cHBvcnRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuc3VwcG9ydGVkUHl0aG9uVmVyc2lvbikKZnJvbSBwaXAucmVxLnJlcV9pbnN0YWxsIGltcG9ydCBJbnN0YWxsUmVxdWlyZW1lbnQKZnJvbSBwaXAudXRpbHMgaW1wb3J0ICgKICAgIGRpc3BsYXlfcGF0aCwgZGlzdF9pbl91c2Vyc2l0ZSwgZW5zdXJlX2Rpciwgbm9ybWFsaXplX3BhdGgpCmZyb20gcGlwLnV0aWxzLmhhc2hlcyBpbXBvcnQgTWlzc2luZ0hhc2hlcwpmcm9tIHBpcC51dGlscy5sb2dnaW5nIGltcG9ydCBpbmRlbnRfbG9nCmZyb20gcGlwLnV0aWxzLnBhY2thZ2luZyBpbXBvcnQgY2hlY2tfZGlzdF9yZXF1aXJlc19weXRob24KZnJvbSBwaXAudmNzIGltcG9ydCB2Y3MKZnJvbSBwaXAud2hlZWwgaW1wb3J0IFdoZWVsCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgpjbGFzcyBSZXF1aXJlbWVudHMob2JqZWN0KToKCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc2VsZi5fa2V5cyA9IFtdCiAgICAgICAgc2VsZi5fZGljdCA9IHt9CgogICAgZGVmIGtleXMoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2tleXMKCiAgICBkZWYgdmFsdWVzKHNlbGYpOgogICAgICAgIHJldHVybiBbc2VsZi5fZGljdFtrZXldIGZvciBrZXkgaW4gc2VsZi5fa2V5c10KCiAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGl0ZW0pOgogICAgICAgIHJldHVybiBpdGVtIGluIHNlbGYuX2tleXMKCiAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSk6CiAgICAgICAgaWYga2V5IG5vdCBpbiBzZWxmLl9rZXlzOgogICAgICAgICAgICBzZWxmLl9rZXlzLmFwcGVuZChrZXkpCiAgICAgICAgc2VsZi5fZGljdFtrZXldID0gdmFsdWUKCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKICAgICAgICByZXR1cm4gc2VsZi5fZGljdFtrZXldCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHZhbHVlcyA9IFsnJXM6ICVzJyAlIChyZXByKGspLCByZXByKHNlbGZba10pKSBmb3IgayBpbiBzZWxmLmtleXMoKV0KICAgICAgICByZXR1cm4gJ1JlcXVpcmVtZW50cyh7JXN9KScgJSAnLCAnLmpvaW4odmFsdWVzKQoKCmNsYXNzIERpc3RBYnN0cmFjdGlvbihvYmplY3QpOgogICAgIiIiQWJzdHJhY3RzIG91dCB0aGUgd2hlZWwgdnMgbm9uLXdoZWVsIHByZXBhcmVfZmlsZXMgbG9naWMuCgogICAgVGhlIHJlcXVpcmVtZW50cyBmb3IgYW55dGhpbmcgaW5zdGFsbGFibGUgYXJlIGFzIGZvbGxvd3M6CiAgICAgLSB3ZSBtdXN0IGJlIGFibGUgdG8gZGV0ZXJtaW5lIHRoZSByZXF1aXJlbWVudCBuYW1lCiAgICAgICAob3Igd2UgY2FuJ3QgY29ycmVjdGx5IGhhbmRsZSB0aGUgbm9uLXVwZ3JhZGUgY2FzZSkuCiAgICAgLSB3ZSBtdXN0IGJlIGFibGUgdG8gZ2VuZXJhdGUgYSBsaXN0IG9mIHJ1bi10aW1lIGRlcGVuZGVuY2llcwogICAgICAgd2l0aG91dCBpbnN0YWxsaW5nIGFueSBhZGRpdGlvbmFsIHBhY2thZ2VzIChvciB3ZSB3b3VsZAogICAgICAgaGF2ZSB0byBlaXRoZXIgYnVybiB0aW1lIGJ5IGRvaW5nIHRlbXBvcmFyeSBpc29sYXRlZCBpbnN0YWxscwogICAgICAgb3IgYWx0ZXJuYXRpdmVseSB2aW9sYXRlIHBpcHMgJ2Rvbid0IHN0YXJ0IGluc3RhbGxpbmcgdW5sZXNzCiAgICAgICBhbGwgcmVxdWlyZW1lbnRzIGFyZSBhdmFpbGFibGUnIHJ1bGUgLSBuZWl0aGVyIG9mIHdoaWNoIGFyZQogICAgICAgZGVzaXJhYmxlKS4KICAgICAtIGZvciBwYWNrYWdlcyB3aXRoIHNldHVwIHJlcXVpcmVtZW50cywgd2UgbXVzdCBhbHNvIGJlIGFibGUKICAgICAgIHRvIGRldGVybWluZSB0aGVpciByZXF1aXJlbWVudHMgd2l0aG91dCBpbnN0YWxsaW5nIGFkZGl0aW9uYWwKICAgICAgIHBhY2thZ2VzIChmb3IgdGhlIHNhbWUgcmVhc29uIGFzIHJ1bi10aW1lIGRlcGVuZGVuY2llcykKICAgICAtIHdlIG11c3QgYmUgYWJsZSB0byBjcmVhdGUgYSBEaXN0cmlidXRpb24gb2JqZWN0IGV4cG9zaW5nIHRoZQogICAgICAgYWJvdmUgbWV0YWRhdGEuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgcmVxX3RvX2luc3RhbGwpOgogICAgICAgIHNlbGYucmVxX3RvX2luc3RhbGwgPSByZXFfdG9faW5zdGFsbAoKICAgIGRlZiBkaXN0KHNlbGYsIGZpbmRlcik6CiAgICAgICAgIiIiUmV0dXJuIGEgc2V0dXB0b29scyBEaXN0IG9iamVjdC4iIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKHNlbGYuZGlzdCkKCiAgICBkZWYgcHJlcF9mb3JfZGlzdChzZWxmKToKICAgICAgICAiIiJFbnN1cmUgdGhhdCB3ZSBjYW4gZ2V0IGEgRGlzdCBmb3IgdGhpcyByZXF1aXJlbWVudC4iIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKHNlbGYuZGlzdCkKCgpkZWYgbWFrZV9hYnN0cmFjdF9kaXN0KHJlcV90b19pbnN0YWxsKToKICAgICIiIkZhY3RvcnkgdG8gbWFrZSBhbiBhYnN0cmFjdCBkaXN0IG9iamVjdC4KCiAgICBQcmVjb25kaXRpb25zOiBFaXRoZXIgYW4gZWRpdGFibGUgcmVxIHdpdGggYSBzb3VyY2VfZGlyLCBvciBzYXRpc2ZpZWRfYnkgb3IKICAgIGEgd2hlZWwgbGluaywgb3IgYSBub24tZWRpdGFibGUgcmVxIHdpdGggYSBzb3VyY2VfZGlyLgoKICAgIDpyZXR1cm46IEEgY29uY3JldGUgRGlzdEFic3RyYWN0aW9uLgogICAgIiIiCiAgICBpZiByZXFfdG9faW5zdGFsbC5lZGl0YWJsZToKICAgICAgICByZXR1cm4gSXNTRGlzdChyZXFfdG9faW5zdGFsbCkKICAgIGVsaWYgcmVxX3RvX2luc3RhbGwubGluayBhbmQgcmVxX3RvX2luc3RhbGwubGluay5pc193aGVlbDoKICAgICAgICByZXR1cm4gSXNXaGVlbChyZXFfdG9faW5zdGFsbCkKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIElzU0Rpc3QocmVxX3RvX2luc3RhbGwpCgoKY2xhc3MgSXNXaGVlbChEaXN0QWJzdHJhY3Rpb24pOgoKICAgIGRlZiBkaXN0KHNlbGYsIGZpbmRlcik6CiAgICAgICAgcmV0dXJuIGxpc3QocGtnX3Jlc291cmNlcy5maW5kX2Rpc3RyaWJ1dGlvbnMoCiAgICAgICAgICAgIHNlbGYucmVxX3RvX2luc3RhbGwuc291cmNlX2RpcikpWzBdCgogICAgZGVmIHByZXBfZm9yX2Rpc3Qoc2VsZik6CiAgICAgICAgIyBGSVhNRTpodHRwczovL2dpdGh1Yi5jb20vcHlwYS9waXAvaXNzdWVzLzExMTIKICAgICAgICBwYXNzCgoKY2xhc3MgSXNTRGlzdChEaXN0QWJzdHJhY3Rpb24pOgoKICAgIGRlZiBkaXN0KHNlbGYsIGZpbmRlcik6CiAgICAgICAgZGlzdCA9IHNlbGYucmVxX3RvX2luc3RhbGwuZ2V0X2Rpc3QoKQogICAgICAgICMgRklYTUU6IHNob3VsZG4ndCBiZSBnbG9iYWxseSBhZGRlZDoKICAgICAgICBpZiBkaXN0Lmhhc19tZXRhZGF0YSgnZGVwZW5kZW5jeV9saW5rcy50eHQnKToKICAgICAgICAgICAgZmluZGVyLmFkZF9kZXBlbmRlbmN5X2xpbmtzKAogICAgICAgICAgICAgICAgZGlzdC5nZXRfbWV0YWRhdGFfbGluZXMoJ2RlcGVuZGVuY3lfbGlua3MudHh0JykKICAgICAgICAgICAgKQogICAgICAgIHJldHVybiBkaXN0CgogICAgZGVmIHByZXBfZm9yX2Rpc3Qoc2VsZik6CiAgICAgICAgc2VsZi5yZXFfdG9faW5zdGFsbC5ydW5fZWdnX2luZm8oKQogICAgICAgIHNlbGYucmVxX3RvX2luc3RhbGwuYXNzZXJ0X3NvdXJjZV9tYXRjaGVzX3ZlcnNpb24oKQoKCmNsYXNzIEluc3RhbGxlZChEaXN0QWJzdHJhY3Rpb24pOgoKICAgIGRlZiBkaXN0KHNlbGYsIGZpbmRlcik6CiAgICAgICAgcmV0dXJuIHNlbGYucmVxX3RvX2luc3RhbGwuc2F0aXNmaWVkX2J5CgogICAgZGVmIHByZXBfZm9yX2Rpc3Qoc2VsZik6CiAgICAgICAgcGFzcwoKCmNsYXNzIFJlcXVpcmVtZW50U2V0KG9iamVjdCk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGJ1aWxkX2Rpciwgc3JjX2RpciwgZG93bmxvYWRfZGlyLCB1cGdyYWRlPUZhbHNlLAogICAgICAgICAgICAgICAgIHVwZ3JhZGVfc3RyYXRlZ3k9Tm9uZSwgaWdub3JlX2luc3RhbGxlZD1GYWxzZSwgYXNfZWdnPUZhbHNlLAogICAgICAgICAgICAgICAgIHRhcmdldF9kaXI9Tm9uZSwgaWdub3JlX2RlcGVuZGVuY2llcz1GYWxzZSwKICAgICAgICAgICAgICAgICBmb3JjZV9yZWluc3RhbGw9RmFsc2UsIHVzZV91c2VyX3NpdGU9RmFsc2UsIHNlc3Npb249Tm9uZSwKICAgICAgICAgICAgICAgICBweWNvbXBpbGU9VHJ1ZSwgaXNvbGF0ZWQ9RmFsc2UsIHdoZWVsX2Rvd25sb2FkX2Rpcj1Ob25lLAogICAgICAgICAgICAgICAgIHdoZWVsX2NhY2hlPU5vbmUsIHJlcXVpcmVfaGFzaGVzPUZhbHNlLAogICAgICAgICAgICAgICAgIGlnbm9yZV9yZXF1aXJlc19weXRob249RmFsc2UpOgogICAgICAgICIiIkNyZWF0ZSBhIFJlcXVpcmVtZW50U2V0LgoKICAgICAgICA6cGFyYW0gd2hlZWxfZG93bmxvYWRfZGlyOiBXaGVyZSBzdGlsbC1wYWNrZWQgLndobCBmaWxlcyBzaG91bGQgYmUKICAgICAgICAgICAgd3JpdHRlbiB0by4gSWYgTm9uZSB0aGV5IGFyZSB3cml0dGVuIHRvIHRoZSBkb3dubG9hZF9kaXIgcGFyYW1ldGVyLgogICAgICAgICAgICBTZXBhcmF0ZSB0byBkb3dubG9hZF9kaXIgdG8gcGVybWl0IG9ubHkga2VlcGluZyB3aGVlbCBhcmNoaXZlcyBmb3IKICAgICAgICAgICAgcGlwIHdoZWVsLgogICAgICAgIDpwYXJhbSBkb3dubG9hZF9kaXI6IFdoZXJlIHN0aWxsIHBhY2tlZCBhcmNoaXZlcyBzaG91bGQgYmUgd3JpdHRlbiB0by4KICAgICAgICAgICAgSWYgTm9uZSB0aGV5IGFyZSBub3Qgc2F2ZWQsIGFuZCBhcmUgZGVsZXRlZCBpbW1lZGlhdGVseSBhZnRlcgogICAgICAgICAgICB1bnBhY2tpbmcuCiAgICAgICAgOnBhcmFtIHdoZWVsX2NhY2hlOiBUaGUgcGlwIHdoZWVsIGNhY2hlLCBmb3IgcGFzc2luZyB0bwogICAgICAgICAgICBJbnN0YWxsUmVxdWlyZW1lbnQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2Vzc2lvbiBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoCiAgICAgICAgICAgICAgICAiUmVxdWlyZW1lbnRTZXQoKSBtaXNzaW5nIDEgcmVxdWlyZWQga2V5d29yZCBhcmd1bWVudDogIgogICAgICAgICAgICAgICAgIidzZXNzaW9uJyIKICAgICAgICAgICAgKQoKICAgICAgICBzZWxmLmJ1aWxkX2RpciA9IGJ1aWxkX2RpcgogICAgICAgIHNlbGYuc3JjX2RpciA9IHNyY19kaXIKICAgICAgICAjIFhYWDogZG93bmxvYWRfZGlyIGFuZCB3aGVlbF9kb3dubG9hZF9kaXIgb3ZlcmxhcCBzZW1hbnRpY2FsbHkgYW5kIG1heQogICAgICAgICMgYmUgY29tYmluZWQgaWYgd2UncmUgd2lsbGluZyB0byBoYXZlIG5vbi13aGVlbCBhcmNoaXZlcyBwcmVzZW50IGluCiAgICAgICAgIyB0aGUgd2hlZWxob3VzZSBvdXRwdXQgYnkgJ3BpcCB3aGVlbCcuCiAgICAgICAgc2VsZi5kb3dubG9hZF9kaXIgPSBkb3dubG9hZF9kaXIKICAgICAgICBzZWxmLnVwZ3JhZGUgPSB1cGdyYWRlCiAgICAgICAgc2VsZi51cGdyYWRlX3N0cmF0ZWd5ID0gdXBncmFkZV9zdHJhdGVneQogICAgICAgIHNlbGYuaWdub3JlX2luc3RhbGxlZCA9IGlnbm9yZV9pbnN0YWxsZWQKICAgICAgICBzZWxmLmZvcmNlX3JlaW5zdGFsbCA9IGZvcmNlX3JlaW5zdGFsbAogICAgICAgIHNlbGYucmVxdWlyZW1lbnRzID0gUmVxdWlyZW1lbnRzKCkKICAgICAgICAjIE1hcHBpbmcgb2YgYWxpYXM6IHJlYWxfbmFtZQogICAgICAgIHNlbGYucmVxdWlyZW1lbnRfYWxpYXNlcyA9IHt9CiAgICAgICAgc2VsZi51bm5hbWVkX3JlcXVpcmVtZW50cyA9IFtdCiAgICAgICAgc2VsZi5pZ25vcmVfZGVwZW5kZW5jaWVzID0gaWdub3JlX2RlcGVuZGVuY2llcwogICAgICAgIHNlbGYuaWdub3JlX3JlcXVpcmVzX3B5dGhvbiA9IGlnbm9yZV9yZXF1aXJlc19weXRob24KICAgICAgICBzZWxmLnN1Y2Nlc3NmdWxseV9kb3dubG9hZGVkID0gW10KICAgICAgICBzZWxmLnN1Y2Nlc3NmdWxseV9pbnN0YWxsZWQgPSBbXQogICAgICAgIHNlbGYucmVxc190b19jbGVhbnVwID0gW10KICAgICAgICBzZWxmLmFzX2VnZyA9IGFzX2VnZwogICAgICAgIHNlbGYudXNlX3VzZXJfc2l0ZSA9IHVzZV91c2VyX3NpdGUKICAgICAgICBzZWxmLnRhcmdldF9kaXIgPSB0YXJnZXRfZGlyICAjIHNldCBmcm9tIC0tdGFyZ2V0IG9wdGlvbgogICAgICAgIHNlbGYuc2Vzc2lvbiA9IHNlc3Npb24KICAgICAgICBzZWxmLnB5Y29tcGlsZSA9IHB5Y29tcGlsZQogICAgICAgIHNlbGYuaXNvbGF0ZWQgPSBpc29sYXRlZAogICAgICAgIGlmIHdoZWVsX2Rvd25sb2FkX2RpcjoKICAgICAgICAgICAgd2hlZWxfZG93bmxvYWRfZGlyID0gbm9ybWFsaXplX3BhdGgod2hlZWxfZG93bmxvYWRfZGlyKQogICAgICAgIHNlbGYud2hlZWxfZG93bmxvYWRfZGlyID0gd2hlZWxfZG93bmxvYWRfZGlyCiAgICAgICAgc2VsZi5fd2hlZWxfY2FjaGUgPSB3aGVlbF9jYWNoZQogICAgICAgIHNlbGYucmVxdWlyZV9oYXNoZXMgPSByZXF1aXJlX2hhc2hlcwogICAgICAgICMgTWFwcyBmcm9tIGluc3RhbGxfcmVxIC0+IGRlcGVuZGVuY2llc19vZl9pbnN0YWxsX3JlcQogICAgICAgIHNlbGYuX2RlcGVuZGVuY2llcyA9IGRlZmF1bHRkaWN0KGxpc3QpCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmVxcyA9IFtyZXEgZm9yIHJlcSBpbiBzZWxmLnJlcXVpcmVtZW50cy52YWx1ZXMoKQogICAgICAgICAgICAgICAgaWYgbm90IHJlcS5jb21lc19mcm9tXQogICAgICAgIHJlcXMuc29ydChrZXk9bGFtYmRhIHJlcTogcmVxLm5hbWUubG93ZXIoKSkKICAgICAgICByZXR1cm4gJyAnLmpvaW4oW3N0cihyZXEucmVxKSBmb3IgcmVxIGluIHJlcXNdKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXFzID0gW3JlcSBmb3IgcmVxIGluIHNlbGYucmVxdWlyZW1lbnRzLnZhbHVlcygpXQogICAgICAgIHJlcXMuc29ydChrZXk9bGFtYmRhIHJlcTogcmVxLm5hbWUubG93ZXIoKSkKICAgICAgICByZXFzX3N0ciA9ICcsICcuam9pbihbc3RyKHJlcS5yZXEpIGZvciByZXEgaW4gcmVxc10pCiAgICAgICAgcmV0dXJuICgnPCVzIG9iamVjdDsgJWQgcmVxdWlyZW1lbnQocyk6ICVzPicKICAgICAgICAgICAgICAgICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBsZW4ocmVxcyksIHJlcXNfc3RyKSkKCiAgICBkZWYgYWRkX3JlcXVpcmVtZW50KHNlbGYsIGluc3RhbGxfcmVxLCBwYXJlbnRfcmVxX25hbWU9Tm9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFzX3JlcXVlc3RlZD1Ob25lKToKICAgICAgICAiIiJBZGQgaW5zdGFsbF9yZXEgYXMgYSByZXF1aXJlbWVudCB0byBpbnN0YWxsLgoKICAgICAgICA6cGFyYW0gcGFyZW50X3JlcV9uYW1lOiBUaGUgbmFtZSBvZiB0aGUgcmVxdWlyZW1lbnQgdGhhdCBuZWVkZWQgdGhpcwogICAgICAgICAgICBhZGRlZC4gVGhlIG5hbWUgaXMgdXNlZCBiZWNhdXNlIHdoZW4gbXVsdGlwbGUgdW5uYW1lZCByZXF1aXJlbWVudHMKICAgICAgICAgICAgcmVzb2x2ZSB0byB0aGUgc2FtZSBuYW1lLCB3ZSBjb3VsZCBvdGhlcndpc2UgZW5kIHVwIHdpdGggZGVwZW5kZW5jeQogICAgICAgICAgICBsaW5rcyB0aGF0IHBvaW50IG91dHNpZGUgdGhlIFJlcXVpcmVtZW50cyBzZXQuIHBhcmVudF9yZXEgbXVzdAogICAgICAgICAgICBhbHJlYWR5IGJlIGFkZGVkLiBOb3RlIHRoYXQgTm9uZSBpbXBsaWVzIHRoYXQgdGhpcyBpcyBhIHVzZXIKICAgICAgICAgICAgc3VwcGxpZWQgcmVxdWlyZW1lbnQsIHZzIGFuIGluZmVycmVkIG9uZS4KICAgICAgICA6cGFyYW0gZXh0cmFzX3JlcXVlc3RlZDogYW4gaXRlcmFibGUgb2YgZXh0cmFzIHVzZWQgdG8gZXZhbHVhdGUgdGhlCiAgICAgICAgICAgIGVudmlyb25lbWVudCBtYXJrZXJzLgogICAgICAgIDpyZXR1cm46IEFkZGl0aW9uYWwgcmVxdWlyZW1lbnRzIHRvIHNjYW4uIFRoYXQgaXMgZWl0aGVyIFtdIGlmCiAgICAgICAgICAgIHRoZSByZXF1aXJlbWVudCBpcyBub3QgYXBwbGljYWJsZSwgb3IgW2luc3RhbGxfcmVxXSBpZiB0aGUKICAgICAgICAgICAgcmVxdWlyZW1lbnQgaXMgYXBwbGljYWJsZSBhbmQgaGFzIGp1c3QgYmVlbiBhZGRlZC4KICAgICAgICAiIiIKICAgICAgICBuYW1lID0gaW5zdGFsbF9yZXEubmFtZQogICAgICAgIGlmIG5vdCBpbnN0YWxsX3JlcS5tYXRjaF9tYXJrZXJzKGV4dHJhc19yZXF1ZXN0ZWQpOgogICAgICAgICAgICBsb2dnZXIud2FybmluZygiSWdub3JpbmcgJXM6IG1hcmtlcnMgJyVzJyBkb24ndCBtYXRjaCB5b3VyICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgImVudmlyb25tZW50IiwgaW5zdGFsbF9yZXEubmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFsbF9yZXEubWFya2VycykKICAgICAgICAgICAgcmV0dXJuIFtdCgogICAgICAgICMgVGhpcyBjaGVjayBoYXMgdG8gY29tZSBhZnRlciB3ZSBmaWx0ZXIgcmVxdWlyZW1lbnRzIHdpdGggdGhlCiAgICAgICAgIyBlbnZpcm9ubWVudCBtYXJrZXJzLgogICAgICAgIGlmIGluc3RhbGxfcmVxLmxpbmsgYW5kIGluc3RhbGxfcmVxLmxpbmsuaXNfd2hlZWw6CiAgICAgICAgICAgIHdoZWVsID0gV2hlZWwoaW5zdGFsbF9yZXEubGluay5maWxlbmFtZSkKICAgICAgICAgICAgaWYgbm90IHdoZWVsLnN1cHBvcnRlZCgpOgogICAgICAgICAgICAgICAgcmFpc2UgSW5zdGFsbGF0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgIiVzIGlzIG5vdCBhIHN1cHBvcnRlZCB3aGVlbCBvbiB0aGlzIHBsYXRmb3JtLiIgJQogICAgICAgICAgICAgICAgICAgIHdoZWVsLmZpbGVuYW1lCiAgICAgICAgICAgICAgICApCgogICAgICAgIGluc3RhbGxfcmVxLmFzX2VnZyA9IHNlbGYuYXNfZWdnCiAgICAgICAgaW5zdGFsbF9yZXEudXNlX3VzZXJfc2l0ZSA9IHNlbGYudXNlX3VzZXJfc2l0ZQogICAgICAgIGluc3RhbGxfcmVxLnRhcmdldF9kaXIgPSBzZWxmLnRhcmdldF9kaXIKICAgICAgICBpbnN0YWxsX3JlcS5weWNvbXBpbGUgPSBzZWxmLnB5Y29tcGlsZQogICAgICAgIGluc3RhbGxfcmVxLmlzX2RpcmVjdCA9IChwYXJlbnRfcmVxX25hbWUgaXMgTm9uZSkKCiAgICAgICAgaWYgbm90IG5hbWU6CiAgICAgICAgICAgICMgdXJsIG9yIHBhdGggcmVxdWlyZW1lbnQgdy9vIGFuIGVnZyBmcmFnbWVudAogICAgICAgICAgICBzZWxmLnVubmFtZWRfcmVxdWlyZW1lbnRzLmFwcGVuZChpbnN0YWxsX3JlcSkKICAgICAgICAgICAgcmV0dXJuIFtpbnN0YWxsX3JlcV0KICAgICAgICBlbHNlOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBleGlzdGluZ19yZXEgPSBzZWxmLmdldF9yZXF1aXJlbWVudChuYW1lKQogICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICAgICBleGlzdGluZ19yZXEgPSBOb25lCiAgICAgICAgICAgIGlmIChwYXJlbnRfcmVxX25hbWUgaXMgTm9uZSBhbmQgZXhpc3RpbmdfcmVxIGFuZCBub3QKICAgICAgICAgICAgICAgICAgICBleGlzdGluZ19yZXEuY29uc3RyYWludCBhbmQKICAgICAgICAgICAgICAgICAgICBleGlzdGluZ19yZXEuZXh0cmFzID09IGluc3RhbGxfcmVxLmV4dHJhcyBhbmQgbm90CiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdfcmVxLnJlcS5zcGVjaWZpZXIgPT0gaW5zdGFsbF9yZXEucmVxLnNwZWNpZmllcik6CiAgICAgICAgICAgICAgICByYWlzZSBJbnN0YWxsYXRpb25FcnJvcigKICAgICAgICAgICAgICAgICAgICAnRG91YmxlIHJlcXVpcmVtZW50IGdpdmVuOiAlcyAoYWxyZWFkeSBpbiAlcywgbmFtZT0lciknCiAgICAgICAgICAgICAgICAgICAgJSAoaW5zdGFsbF9yZXEsIGV4aXN0aW5nX3JlcSwgbmFtZSkpCiAgICAgICAgICAgIGlmIG5vdCBleGlzdGluZ19yZXE6CiAgICAgICAgICAgICAgICAjIEFkZCByZXF1aXJlbWVudAogICAgICAgICAgICAgICAgc2VsZi5yZXF1aXJlbWVudHNbbmFtZV0gPSBpbnN0YWxsX3JlcQogICAgICAgICAgICAgICAgIyBGSVhNRTogd2hhdCBhYm91dCBvdGhlciBub3JtYWxpemF0aW9ucz8gIEUuZy4sIF8gdnMuIC0/CiAgICAgICAgICAgICAgICBpZiBuYW1lLmxvd2VyKCkgIT0gbmFtZToKICAgICAgICAgICAgICAgICAgICBzZWxmLnJlcXVpcmVtZW50X2FsaWFzZXNbbmFtZS5sb3dlcigpXSA9IG5hbWUKICAgICAgICAgICAgICAgIHJlc3VsdCA9IFtpbnN0YWxsX3JlcV0KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgQXNzdW1lIHRoZXJlJ3Mgbm8gbmVlZCB0byBzY2FuLCBhbmQgdGhhdCB3ZSd2ZSBhbHJlYWR5CiAgICAgICAgICAgICAgICAjIGVuY291bnRlcmVkIHRoaXMgZm9yIHNjYW5uaW5nLgogICAgICAgICAgICAgICAgcmVzdWx0ID0gW10KICAgICAgICAgICAgICAgIGlmIG5vdCBpbnN0YWxsX3JlcS5jb25zdHJhaW50IGFuZCBleGlzdGluZ19yZXEuY29uc3RyYWludDoKICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdGFsbF9yZXEubGluayBhbmQgbm90IChleGlzdGluZ19yZXEubGluayBhbmQKICAgICAgICAgICAgICAgICAgICAgICBpbnN0YWxsX3JlcS5saW5rLnBhdGggPT0gZXhpc3RpbmdfcmVxLmxpbmsucGF0aCkpOgogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlcXNfdG9fY2xlYW51cC5hcHBlbmQoaW5zdGFsbF9yZXEpCiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEluc3RhbGxhdGlvbkVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBzYXRpc2Z5IGNvbnN0cmFpbnRzIGZvciAnJXMnOiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5zdGFsbGF0aW9uIGZyb20gcGF0aCBvciB1cmwgY2Fubm90IGJlICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb25zdHJhaW5lZCB0byBhIHZlcnNpb24iICUgbmFtZSkKICAgICAgICAgICAgICAgICAgICAjIElmIHdlJ3JlIG5vdyBpbnN0YWxsaW5nIGEgY29uc3RyYWludCwgbWFyayB0aGUgZXhpc3RpbmcKICAgICAgICAgICAgICAgICAgICAjIG9iamVjdCBmb3IgcmVhbCBpbnN0YWxsYXRpb24uCiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdfcmVxLmNvbnN0cmFpbnQgPSBGYWxzZQogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nX3JlcS5leHRyYXMgPSB0dXBsZSgKICAgICAgICAgICAgICAgICAgICAgICAgc29ydGVkKHNldChleGlzdGluZ19yZXEuZXh0cmFzKS51bmlvbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldChpbnN0YWxsX3JlcS5leHRyYXMpKSkpCiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJTZXR0aW5nICVzIGV4dHJhcyB0bzogJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ19yZXEsIGV4aXN0aW5nX3JlcS5leHRyYXMpCiAgICAgICAgICAgICAgICAgICAgIyBBbmQgbm93IHdlIG5lZWQgdG8gc2NhbiB0aGlzLgogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFtleGlzdGluZ19yZXFdCiAgICAgICAgICAgICAgICAjIENhbm9uaWNhbGlzZSB0byB0aGUgYWxyZWFkeS1hZGRlZCBvYmplY3QgZm9yIHRoZSBiYWNrcmVmCiAgICAgICAgICAgICAgICAjIGNoZWNrIGJlbG93LgogICAgICAgICAgICAgICAgaW5zdGFsbF9yZXEgPSBleGlzdGluZ19yZXEKICAgICAgICAgICAgaWYgcGFyZW50X3JlcV9uYW1lOgogICAgICAgICAgICAgICAgcGFyZW50X3JlcSA9IHNlbGYuZ2V0X3JlcXVpcmVtZW50KHBhcmVudF9yZXFfbmFtZSkKICAgICAgICAgICAgICAgIHNlbGYuX2RlcGVuZGVuY2llc1twYXJlbnRfcmVxXS5hcHBlbmQoaW5zdGFsbF9yZXEpCiAgICAgICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgaGFzX3JlcXVpcmVtZW50KHNlbGYsIHByb2plY3RfbmFtZSk6CiAgICAgICAgbmFtZSA9IHByb2plY3RfbmFtZS5sb3dlcigpCiAgICAgICAgaWYgKG5hbWUgaW4gc2VsZi5yZXF1aXJlbWVudHMgYW5kCiAgICAgICAgICAgbm90IHNlbGYucmVxdWlyZW1lbnRzW25hbWVdLmNvbnN0cmFpbnQgb3IKICAgICAgICAgICBuYW1lIGluIHNlbGYucmVxdWlyZW1lbnRfYWxpYXNlcyBhbmQKICAgICAgICAgICBub3Qgc2VsZi5yZXF1aXJlbWVudHNbc2VsZi5yZXF1aXJlbWVudF9hbGlhc2VzW25hbWVdXS5jb25zdHJhaW50KToKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBAcHJvcGVydHkKICAgIGRlZiBoYXNfcmVxdWlyZW1lbnRzKHNlbGYpOgogICAgICAgIHJldHVybiBsaXN0KHJlcSBmb3IgcmVxIGluIHNlbGYucmVxdWlyZW1lbnRzLnZhbHVlcygpIGlmIG5vdAogICAgICAgICAgICAgICAgICAgIHJlcS5jb25zdHJhaW50KSBvciBzZWxmLnVubmFtZWRfcmVxdWlyZW1lbnRzCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfZG93bmxvYWQoc2VsZik6CiAgICAgICAgaWYgc2VsZi5kb3dubG9hZF9kaXI6CiAgICAgICAgICAgIHNlbGYuZG93bmxvYWRfZGlyID0gZXhwYW5kdXNlcihzZWxmLmRvd25sb2FkX2RpcikKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc2VsZi5kb3dubG9hZF9kaXIpOgogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGxvZ2dlci5jcml0aWNhbCgnQ291bGQgbm90IGZpbmQgZG93bmxvYWQgZGlyZWN0b3J5JykKICAgICAgICAgICAgICAgIHJhaXNlIEluc3RhbGxhdGlvbkVycm9yKAogICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZmluZCBvciBhY2Nlc3MgZG93bmxvYWQgZGlyZWN0b3J5ICclcyciCiAgICAgICAgICAgICAgICAgICAgJSBkaXNwbGF5X3BhdGgoc2VsZi5kb3dubG9hZF9kaXIpKQogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBnZXRfcmVxdWlyZW1lbnQoc2VsZiwgcHJvamVjdF9uYW1lKToKICAgICAgICBmb3IgbmFtZSBpbiBwcm9qZWN0X25hbWUsIHByb2plY3RfbmFtZS5sb3dlcigpOgogICAgICAgICAgICBpZiBuYW1lIGluIHNlbGYucmVxdWlyZW1lbnRzOgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYucmVxdWlyZW1lbnRzW25hbWVdCiAgICAgICAgICAgIGlmIG5hbWUgaW4gc2VsZi5yZXF1aXJlbWVudF9hbGlhc2VzOgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYucmVxdWlyZW1lbnRzW3NlbGYucmVxdWlyZW1lbnRfYWxpYXNlc1tuYW1lXV0KICAgICAgICByYWlzZSBLZXlFcnJvcigiTm8gcHJvamVjdCB3aXRoIHRoZSBuYW1lICVyIiAlIHByb2plY3RfbmFtZSkKCiAgICBkZWYgdW5pbnN0YWxsKHNlbGYsIGF1dG9fY29uZmlybT1GYWxzZSk6CiAgICAgICAgZm9yIHJlcSBpbiBzZWxmLnJlcXVpcmVtZW50cy52YWx1ZXMoKToKICAgICAgICAgICAgaWYgcmVxLmNvbnN0cmFpbnQ6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICByZXEudW5pbnN0YWxsKGF1dG9fY29uZmlybT1hdXRvX2NvbmZpcm0pCiAgICAgICAgICAgIHJlcS5jb21taXRfdW5pbnN0YWxsKCkKCiAgICBkZWYgcHJlcGFyZV9maWxlcyhzZWxmLCBmaW5kZXIpOgogICAgICAgICIiIgogICAgICAgIFByZXBhcmUgcHJvY2Vzcy4gQ3JlYXRlIHRlbXAgZGlyZWN0b3JpZXMsIGRvd25sb2FkIGFuZC9vciB1bnBhY2sgZmlsZXMuCiAgICAgICAgIiIiCiAgICAgICAgIyBtYWtlIHRoZSB3aGVlbGhvdXNlCiAgICAgICAgaWYgc2VsZi53aGVlbF9kb3dubG9hZF9kaXI6CiAgICAgICAgICAgIGVuc3VyZV9kaXIoc2VsZi53aGVlbF9kb3dubG9hZF9kaXIpCgogICAgICAgICMgSWYgYW55IHRvcC1sZXZlbCByZXF1aXJlbWVudCBoYXMgYSBoYXNoIHNwZWNpZmllZCwgZW50ZXIKICAgICAgICAjIGhhc2gtY2hlY2tpbmcgbW9kZSwgd2hpY2ggcmVxdWlyZXMgaGFzaGVzIGZyb20gYWxsLgogICAgICAgIHJvb3RfcmVxcyA9IHNlbGYudW5uYW1lZF9yZXF1aXJlbWVudHMgKyBzZWxmLnJlcXVpcmVtZW50cy52YWx1ZXMoKQogICAgICAgIHJlcXVpcmVfaGFzaGVzID0gKHNlbGYucmVxdWlyZV9oYXNoZXMgb3IKICAgICAgICAgICAgICAgICAgICAgICAgICBhbnkocmVxLmhhc19oYXNoX29wdGlvbnMgZm9yIHJlcSBpbiByb290X3JlcXMpKQogICAgICAgIGlmIHJlcXVpcmVfaGFzaGVzIGFuZCBzZWxmLmFzX2VnZzoKICAgICAgICAgICAgcmFpc2UgSW5zdGFsbGF0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAnLS1lZ2cgaXMgbm90IGFsbG93ZWQgd2l0aCAtLXJlcXVpcmUtaGFzaGVzIG1vZGUsIHNpbmNlIGl0ICcKICAgICAgICAgICAgICAgICdkZWxlZ2F0ZXMgZGVwZW5kZW5jeSByZXNvbHV0aW9uIHRvIHNldHVwdG9vbHMgYW5kIGNvdWxkIHRodXMgJwogICAgICAgICAgICAgICAgJ3Jlc3VsdCBpbiBpbnN0YWxsYXRpb24gb2YgdW5oYXNoZWQgcGFja2FnZXMuJykKCiAgICAgICAgIyBBY3R1YWxseSBwcmVwYXJlIHRoZSBmaWxlcywgYW5kIGNvbGxlY3QgYW55IGV4Y2VwdGlvbnMuIE1vc3QgaGFzaAogICAgICAgICMgZXhjZXB0aW9ucyBjYW5ub3QgYmUgY2hlY2tlZCBhaGVhZCBvZiB0aW1lLCBiZWNhdXNlCiAgICAgICAgIyByZXEucG9wdWxhdGVfbGluaygpIG5lZWRzIHRvIGJlIGNhbGxlZCBiZWZvcmUgd2UgY2FuIG1ha2UgZGVjaXNpb25zCiAgICAgICAgIyBiYXNlZCBvbiBsaW5rIHR5cGUuCiAgICAgICAgZGlzY292ZXJlZF9yZXFzID0gW10KICAgICAgICBoYXNoX2Vycm9ycyA9IEhhc2hFcnJvcnMoKQogICAgICAgIGZvciByZXEgaW4gY2hhaW4ocm9vdF9yZXFzLCBkaXNjb3ZlcmVkX3JlcXMpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBkaXNjb3ZlcmVkX3JlcXMuZXh0ZW5kKHNlbGYuX3ByZXBhcmVfZmlsZSgKICAgICAgICAgICAgICAgICAgICBmaW5kZXIsCiAgICAgICAgICAgICAgICAgICAgcmVxLAogICAgICAgICAgICAgICAgICAgIHJlcXVpcmVfaGFzaGVzPXJlcXVpcmVfaGFzaGVzLAogICAgICAgICAgICAgICAgICAgIGlnbm9yZV9kZXBlbmRlbmNpZXM9c2VsZi5pZ25vcmVfZGVwZW5kZW5jaWVzKSkKICAgICAgICAgICAgZXhjZXB0IEhhc2hFcnJvciBhcyBleGM6CiAgICAgICAgICAgICAgICBleGMucmVxID0gcmVxCiAgICAgICAgICAgICAgICBoYXNoX2Vycm9ycy5hcHBlbmQoZXhjKQoKICAgICAgICBpZiBoYXNoX2Vycm9yczoKICAgICAgICAgICAgcmFpc2UgaGFzaF9lcnJvcnMKCiAgICBkZWYgX2lzX3VwZ3JhZGVfYWxsb3dlZChzZWxmLCByZXEpOgogICAgICAgIHJldHVybiBzZWxmLnVwZ3JhZGUgYW5kICgKICAgICAgICAgICAgc2VsZi51cGdyYWRlX3N0cmF0ZWd5ID09ICJlYWdlciIgb3IgKAogICAgICAgICAgICAgICAgc2VsZi51cGdyYWRlX3N0cmF0ZWd5ID09ICJvbmx5LWlmLW5lZWRlZCIgYW5kIHJlcS5pc19kaXJlY3QKICAgICAgICAgICAgKQogICAgICAgICkKCiAgICBkZWYgX2NoZWNrX3NraXBfaW5zdGFsbGVkKHNlbGYsIHJlcV90b19pbnN0YWxsLCBmaW5kZXIpOgogICAgICAgICIiIkNoZWNrIGlmIHJlcV90b19pbnN0YWxsIHNob3VsZCBiZSBza2lwcGVkLgoKICAgICAgICBUaGlzIHdpbGwgY2hlY2sgaWYgdGhlIHJlcSBpcyBpbnN0YWxsZWQsIGFuZCB3aGV0aGVyIHdlIHNob3VsZCB1cGdyYWRlCiAgICAgICAgb3IgcmVpbnN0YWxsIGl0LCB0YWtpbmcgaW50byBhY2NvdW50IGFsbCB0aGUgcmVsZXZhbnQgdXNlciBvcHRpb25zLgoKICAgICAgICBBZnRlciBjYWxsaW5nIHRoaXMgcmVxX3RvX2luc3RhbGwgd2lsbCBvbmx5IGhhdmUgc2F0aXNmaWVkX2J5IHNldCB0bwogICAgICAgIE5vbmUgaWYgdGhlIHJlcV90b19pbnN0YWxsIGlzIHRvIGJlIHVwZ3JhZGVkL3JlaW5zdGFsbGVkIGV0Yy4gQW55CiAgICAgICAgb3RoZXIgdmFsdWUgd2lsbCBiZSBhIGRpc3QgcmVjb3JkaW5nIHRoZSBjdXJyZW50IHRoaW5nIGluc3RhbGxlZCB0aGF0CiAgICAgICAgc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudC4KCiAgICAgICAgTm90ZSB0aGF0IGZvciB2Y3MgdXJscyBhbmQgdGhlIGxpa2Ugd2UgY2FuJ3QgYXNzZXNzIHNraXBwaW5nIGluIHRoaXMKICAgICAgICByb3V0aW5lIC0gd2Ugc2ltcGx5IGlkZW50aWZ5IHRoYXQgd2UgbmVlZCB0byBwdWxsIHRoZSB0aGluZyBkb3duLAogICAgICAgIHRoZW4gbGF0ZXIgb24gaXQgaXMgcHVsbGVkIGRvd24gYW5kIGludHJvc3BlY3RlZCB0byBhc3Nlc3MgdXBncmFkZS8KICAgICAgICByZWluc3RhbGxzIGV0Yy4KCiAgICAgICAgOnJldHVybjogQSB0ZXh0IHJlYXNvbiBmb3Igd2h5IGl0IHdhcyBza2lwcGVkLCBvciBOb25lLgogICAgICAgICIiIgogICAgICAgICMgQ2hlY2sgd2hldGhlciB0byB1cGdyYWRlL3JlaW5zdGFsbCB0aGlzIHJlcSBvciBub3QuCiAgICAgICAgcmVxX3RvX2luc3RhbGwuY2hlY2tfaWZfZXhpc3RzKCkKICAgICAgICBpZiByZXFfdG9faW5zdGFsbC5zYXRpc2ZpZWRfYnk6CiAgICAgICAgICAgIHVwZ3JhZGVfYWxsb3dlZCA9IHNlbGYuX2lzX3VwZ3JhZGVfYWxsb3dlZChyZXFfdG9faW5zdGFsbCkKCiAgICAgICAgICAgICMgSXMgdGhlIGJlc3QgdmVyc2lvbiBpcyBpbnN0YWxsZWQuCiAgICAgICAgICAgIGJlc3RfaW5zdGFsbGVkID0gRmFsc2UKCiAgICAgICAgICAgIGlmIHVwZ3JhZGVfYWxsb3dlZDoKICAgICAgICAgICAgICAgICMgRm9yIGxpbmsgYmFzZWQgcmVxdWlyZW1lbnRzIHdlIGhhdmUgdG8gcHVsbCB0aGUKICAgICAgICAgICAgICAgICMgdHJlZSBkb3duIGFuZCBpbnNwZWN0IHRvIGFzc2VzcyB0aGUgdmVyc2lvbiAjLCBzbwogICAgICAgICAgICAgICAgIyBpdHMgaGFuZGxlZCB3YXkgZG93bi4KICAgICAgICAgICAgICAgIGlmIG5vdCAoc2VsZi5mb3JjZV9yZWluc3RhbGwgb3IgcmVxX3RvX2luc3RhbGwubGluayk6CiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICBmaW5kZXIuZmluZF9yZXF1aXJlbWVudCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcV90b19pbnN0YWxsLCB1cGdyYWRlX2FsbG93ZWQpCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEJlc3RWZXJzaW9uQWxyZWFkeUluc3RhbGxlZDoKICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF9pbnN0YWxsZWQgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IERpc3RyaWJ1dGlvbk5vdEZvdW5kOgogICAgICAgICAgICAgICAgICAgICAgICAjIE5vIGRpc3RyaWJ1dGlvbiBmb3VuZCwgc28gd2Ugc3F1YXNoIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAjIGVycm9yIC0gaXQgd2lsbCBiZSByYWlzZWQgbGF0ZXIgd2hlbiB3ZQogICAgICAgICAgICAgICAgICAgICAgICAjIHJlLXRyeSBsYXRlciB0byBkbyB0aGUgaW5zdGFsbC4KICAgICAgICAgICAgICAgICAgICAgICAgIyBXaHkgZG9uJ3Qgd2UganVzdCByYWlzZSBoZXJlPwogICAgICAgICAgICAgICAgICAgICAgICBwYXNzCgogICAgICAgICAgICAgICAgaWYgbm90IGJlc3RfaW5zdGFsbGVkOgogICAgICAgICAgICAgICAgICAgICMgZG9uJ3QgdW5pbnN0YWxsIGNvbmZsaWN0IGlmIHVzZXIgaW5zdGFsbCBhbmQKICAgICAgICAgICAgICAgICAgICAjIGNvbmZsaWN0IGlzIG5vdCB1c2VyIGluc3RhbGwKICAgICAgICAgICAgICAgICAgICBpZiBub3QgKHNlbGYudXNlX3VzZXJfc2l0ZSBhbmQgbm90CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0X2luX3VzZXJzaXRlKHJlcV90b19pbnN0YWxsLnNhdGlzZmllZF9ieSkpOgogICAgICAgICAgICAgICAgICAgICAgICByZXFfdG9faW5zdGFsbC5jb25mbGljdHNfd2l0aCA9IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcV90b19pbnN0YWxsLnNhdGlzZmllZF9ieQogICAgICAgICAgICAgICAgICAgIHJlcV90b19pbnN0YWxsLnNhdGlzZmllZF9ieSA9IE5vbmUKCiAgICAgICAgICAgICMgRmlndXJlIG91dCBhIG5pY2UgbWVzc2FnZSB0byBzYXkgd2h5IHdlJ3JlIHNraXBwaW5nIHRoaXMuCiAgICAgICAgICAgIGlmIGJlc3RfaW5zdGFsbGVkOgogICAgICAgICAgICAgICAgc2tpcF9yZWFzb24gPSAnYWxyZWFkeSB1cC10by1kYXRlJwogICAgICAgICAgICBlbGlmIHNlbGYudXBncmFkZV9zdHJhdGVneSA9PSAib25seS1pZi1uZWVkZWQiOgogICAgICAgICAgICAgICAgc2tpcF9yZWFzb24gPSAnbm90IHVwZ3JhZGVkIGFzIG5vdCBkaXJlY3RseSByZXF1aXJlZCcKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNraXBfcmVhc29uID0gJ2FscmVhZHkgc2F0aXNmaWVkJwoKICAgICAgICAgICAgcmV0dXJuIHNraXBfcmVhc29uCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBkZWYgX3ByZXBhcmVfZmlsZShzZWxmLAogICAgICAgICAgICAgICAgICAgICAgZmluZGVyLAogICAgICAgICAgICAgICAgICAgICAgcmVxX3RvX2luc3RhbGwsCiAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlX2hhc2hlcz1GYWxzZSwKICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZV9kZXBlbmRlbmNpZXM9RmFsc2UpOgogICAgICAgICIiIlByZXBhcmUgYSBzaW5nbGUgcmVxdWlyZW1lbnRzIGZpbGUuCgogICAgICAgIDpyZXR1cm46IEEgbGlzdCBvZiBhZGRpdGlvbmFsIEluc3RhbGxSZXF1aXJlbWVudHMgdG8gYWxzbyBpbnN0YWxsLgogICAgICAgICIiIgogICAgICAgICMgVGVsbCB1c2VyIHdoYXQgd2UgYXJlIGRvaW5nIGZvciB0aGlzIHJlcXVpcmVtZW50OgogICAgICAgICMgb2J0YWluIChlZGl0YWJsZSksIHNraXBwaW5nLCBwcm9jZXNzaW5nIChsb2NhbCB1cmwpLCBjb2xsZWN0aW5nCiAgICAgICAgIyAocmVtb3RlIHVybCBvciBwYWNrYWdlIG5hbWUpCiAgICAgICAgaWYgcmVxX3RvX2luc3RhbGwuY29uc3RyYWludCBvciByZXFfdG9faW5zdGFsbC5wcmVwYXJlZDoKICAgICAgICAgICAgcmV0dXJuIFtdCgogICAgICAgIHJlcV90b19pbnN0YWxsLnByZXBhcmVkID0gVHJ1ZQoKICAgICAgICAjICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIwogICAgICAgICMgIyBwcmludCBsb2cgbWVzc2FnZXMgIyAjCiAgICAgICAgIyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICMKICAgICAgICBpZiByZXFfdG9faW5zdGFsbC5lZGl0YWJsZToKICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ09idGFpbmluZyAlcycsIHJlcV90b19pbnN0YWxsKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgc2F0aXNmaWVkX2J5IGlzIG9ubHkgZXZhbHVhdGVkIGJ5IGNhbGxpbmcgX2NoZWNrX3NraXBfaW5zdGFsbGVkLAogICAgICAgICAgICAjIHNvIGl0IG11c3QgYmUgTm9uZSBoZXJlLgogICAgICAgICAgICBhc3NlcnQgcmVxX3RvX2luc3RhbGwuc2F0aXNmaWVkX2J5IGlzIE5vbmUKICAgICAgICAgICAgaWYgbm90IHNlbGYuaWdub3JlX2luc3RhbGxlZDoKICAgICAgICAgICAgICAgIHNraXBfcmVhc29uID0gc2VsZi5fY2hlY2tfc2tpcF9pbnN0YWxsZWQoCiAgICAgICAgICAgICAgICAgICAgcmVxX3RvX2luc3RhbGwsIGZpbmRlcikKCiAgICAgICAgICAgIGlmIHJlcV90b19pbnN0YWxsLnNhdGlzZmllZF9ieToKICAgICAgICAgICAgICAgIGFzc2VydCBza2lwX3JlYXNvbiBpcyBub3QgTm9uZSwgKAogICAgICAgICAgICAgICAgICAgICdfY2hlY2tfc2tpcF9pbnN0YWxsZWQgcmV0dXJuZWQgTm9uZSBidXQgJwogICAgICAgICAgICAgICAgICAgICdyZXFfdG9faW5zdGFsbC5zYXRpc2ZpZWRfYnkgaXMgc2V0IHRvICVyJwogICAgICAgICAgICAgICAgICAgICUgKHJlcV90b19pbnN0YWxsLnNhdGlzZmllZF9ieSwpKQogICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAgICAgJ1JlcXVpcmVtZW50ICVzOiAlcycsIHNraXBfcmVhc29uLAogICAgICAgICAgICAgICAgICAgIHJlcV90b19pbnN0YWxsKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaWYgKHJlcV90b19pbnN0YWxsLmxpbmsgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcV90b19pbnN0YWxsLmxpbmsuc2NoZW1lID09ICdmaWxlJyk6CiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHVybF90b19wYXRoKHJlcV90b19pbnN0YWxsLmxpbmsudXJsKQogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdQcm9jZXNzaW5nICVzJywgZGlzcGxheV9wYXRoKHBhdGgpKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygnQ29sbGVjdGluZyAlcycsIHJlcV90b19pbnN0YWxsKQoKICAgICAgICB3aXRoIGluZGVudF9sb2coKToKICAgICAgICAgICAgIyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAjCiAgICAgICAgICAgICMgIyB2Y3MgdXBkYXRlIG9yIHVucGFjayBhcmNoaXZlICMgIwogICAgICAgICAgICAjICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICMKICAgICAgICAgICAgaWYgcmVxX3RvX2luc3RhbGwuZWRpdGFibGU6CiAgICAgICAgICAgICAgICBpZiByZXF1aXJlX2hhc2hlczoKICAgICAgICAgICAgICAgICAgICByYWlzZSBJbnN0YWxsYXRpb25FcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgJ1RoZSBlZGl0YWJsZSByZXF1aXJlbWVudCAlcyBjYW5ub3QgYmUgaW5zdGFsbGVkIHdoZW4gJwogICAgICAgICAgICAgICAgICAgICAgICAncmVxdWlyaW5nIGhhc2hlcywgYmVjYXVzZSB0aGVyZSBpcyBubyBzaW5nbGUgZmlsZSB0byAnCiAgICAgICAgICAgICAgICAgICAgICAgICdoYXNoLicgJSByZXFfdG9faW5zdGFsbCkKICAgICAgICAgICAgICAgIHJlcV90b19pbnN0YWxsLmVuc3VyZV9oYXNfc291cmNlX2RpcihzZWxmLnNyY19kaXIpCiAgICAgICAgICAgICAgICByZXFfdG9faW5zdGFsbC51cGRhdGVfZWRpdGFibGUobm90IHNlbGYuaXNfZG93bmxvYWQpCiAgICAgICAgICAgICAgICBhYnN0cmFjdF9kaXN0ID0gbWFrZV9hYnN0cmFjdF9kaXN0KHJlcV90b19pbnN0YWxsKQogICAgICAgICAgICAgICAgYWJzdHJhY3RfZGlzdC5wcmVwX2Zvcl9kaXN0KCkKICAgICAgICAgICAgICAgIGlmIHNlbGYuaXNfZG93bmxvYWQ6CiAgICAgICAgICAgICAgICAgICAgcmVxX3RvX2luc3RhbGwuYXJjaGl2ZShzZWxmLmRvd25sb2FkX2RpcikKICAgICAgICAgICAgICAgIHJlcV90b19pbnN0YWxsLmNoZWNrX2lmX2V4aXN0cygpCiAgICAgICAgICAgIGVsaWYgcmVxX3RvX2luc3RhbGwuc2F0aXNmaWVkX2J5OgogICAgICAgICAgICAgICAgaWYgcmVxdWlyZV9oYXNoZXM6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKAogICAgICAgICAgICAgICAgICAgICAgICAnU2luY2UgaXQgaXMgYWxyZWFkeSBpbnN0YWxsZWQsIHdlIGFyZSB0cnVzdGluZyB0aGlzICcKICAgICAgICAgICAgICAgICAgICAgICAgJ3BhY2thZ2Ugd2l0aG91dCBjaGVja2luZyBpdHMgaGFzaC4gVG8gZW5zdXJlIGEgJwogICAgICAgICAgICAgICAgICAgICAgICAnY29tcGxldGVseSByZXBlYXRhYmxlIGVudmlyb25tZW50LCBpbnN0YWxsIGludG8gYW4gJwogICAgICAgICAgICAgICAgICAgICAgICAnZW1wdHkgdmlydHVhbGVudi4nKQogICAgICAgICAgICAgICAgYWJzdHJhY3RfZGlzdCA9IEluc3RhbGxlZChyZXFfdG9faW5zdGFsbCkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgQEAgaWYgZmlsZXN5c3RlbSBwYWNrYWdlcyBhcmUgbm90IG1hcmtlZAogICAgICAgICAgICAgICAgIyBlZGl0YWJsZSBpbiBhIHJlcSwgYSBub24gZGV0ZXJtaW5pc3RpYyBlcnJvcgogICAgICAgICAgICAgICAgIyBvY2N1cnMgd2hlbiB0aGUgc2NyaXB0IGF0dGVtcHRzIHRvIHVucGFjayB0aGUKICAgICAgICAgICAgICAgICMgYnVpbGQgZGlyZWN0b3J5CiAgICAgICAgICAgICAgICByZXFfdG9faW5zdGFsbC5lbnN1cmVfaGFzX3NvdXJjZV9kaXIoc2VsZi5idWlsZF9kaXIpCiAgICAgICAgICAgICAgICAjIElmIGEgY2hlY2tvdXQgZXhpc3RzLCBpdCdzIHVud2lzZSB0byBrZWVwIGdvaW5nLiAgdmVyc2lvbgogICAgICAgICAgICAgICAgIyBpbmNvbnNpc3RlbmNpZXMgYXJlIGxvZ2dlZCBsYXRlciwgYnV0IGRvIG5vdCBmYWlsIHRoZQogICAgICAgICAgICAgICAgIyBpbnN0YWxsYXRpb24uCiAgICAgICAgICAgICAgICAjIEZJWE1FOiB0aGlzIHdvbid0IHVwZ3JhZGUgd2hlbiB0aGVyZSdzIGFuIGV4aXN0aW5nCiAgICAgICAgICAgICAgICAjIHBhY2thZ2UgdW5wYWNrZWQgaW4gYHJlcV90b19pbnN0YWxsLnNvdXJjZV9kaXJgCiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cygKICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHJlcV90b19pbnN0YWxsLnNvdXJjZV9kaXIsICdzZXR1cC5weScpKToKICAgICAgICAgICAgICAgICAgICByYWlzZSBQcmV2aW91c0J1aWxkRGlyRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgICJwaXAgY2FuJ3QgcHJvY2VlZCB3aXRoIHJlcXVpcmVtZW50cyAnJXMnIGR1ZSB0byBhIgogICAgICAgICAgICAgICAgICAgICAgICAiIHByZS1leGlzdGluZyBidWlsZCBkaXJlY3RvcnkgKCVzKS4gVGhpcyBpcyAiCiAgICAgICAgICAgICAgICAgICAgICAgICJsaWtlbHkgZHVlIHRvIGEgcHJldmlvdXMgaW5zdGFsbGF0aW9uIHRoYXQgZmFpbGVkIgogICAgICAgICAgICAgICAgICAgICAgICAiLiBwaXAgaXMgYmVpbmcgcmVzcG9uc2libGUgYW5kIG5vdCBhc3N1bWluZyBpdCAiCiAgICAgICAgICAgICAgICAgICAgICAgICJjYW4gZGVsZXRlIHRoaXMuIFBsZWFzZSBkZWxldGUgaXQgYW5kIHRyeSBhZ2Fpbi4iCiAgICAgICAgICAgICAgICAgICAgICAgICUgKHJlcV90b19pbnN0YWxsLCByZXFfdG9faW5zdGFsbC5zb3VyY2VfZGlyKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHJlcV90b19pbnN0YWxsLnBvcHVsYXRlX2xpbmsoCiAgICAgICAgICAgICAgICAgICAgZmluZGVyLAogICAgICAgICAgICAgICAgICAgIHNlbGYuX2lzX3VwZ3JhZGVfYWxsb3dlZChyZXFfdG9faW5zdGFsbCksCiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZV9oYXNoZXMKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICMgV2UgY2FuJ3QgaGl0IHRoaXMgc3BvdCBhbmQgaGF2ZSBwb3B1bGF0ZV9saW5rIHJldHVybiBOb25lLgogICAgICAgICAgICAgICAgIyByZXFfdG9faW5zdGFsbC5zYXRpc2ZpZWRfYnkgaXMgTm9uZSBoZXJlIChiZWNhdXNlIHdlJ3JlCiAgICAgICAgICAgICAgICAjIGd1YXJkZWQpIGFuZCB1cGdyYWRlIGhhcyBubyBpbXBhY3QgZXhjZXB0IHdoZW4gc2F0aXNmaWVkX2J5CiAgICAgICAgICAgICAgICAjIGlzIG5vdCBOb25lLgogICAgICAgICAgICAgICAgIyBUaGVuIGluc2lkZSBmaW5kX3JlcXVpcmVtZW50IGV4aXN0aW5nX2FwcGxpY2FibGUgLT4gRmFsc2UKICAgICAgICAgICAgICAgICMgSWYgbm8gbmV3IHZlcnNpb25zIGFyZSBmb3VuZCwgRGlzdHJpYnV0aW9uTm90Rm91bmQgaXMgcmFpc2VkLAogICAgICAgICAgICAgICAgIyBvdGhlcndpc2UgYSByZXN1bHQgaXMgZ3VhcmFudGVlZC4KICAgICAgICAgICAgICAgIGFzc2VydCByZXFfdG9faW5zdGFsbC5saW5rCiAgICAgICAgICAgICAgICBsaW5rID0gcmVxX3RvX2luc3RhbGwubGluawoKICAgICAgICAgICAgICAgICMgTm93IHRoYXQgd2UgaGF2ZSB0aGUgcmVhbCBsaW5rLCB3ZSBjYW4gdGVsbCB3aGF0IGtpbmQgb2YKICAgICAgICAgICAgICAgICMgcmVxdWlyZW1lbnRzIHdlIGhhdmUgYW5kIHJhaXNlIHNvbWUgbW9yZSBpbmZvcm1hdGl2ZSBlcnJvcnMKICAgICAgICAgICAgICAgICMgdGhhbiBvdGhlcndpc2UuIChGb3IgZXhhbXBsZSwgd2UgY2FuIHJhaXNlIFZjc0hhc2hVbnN1cHBvcnRlZAogICAgICAgICAgICAgICAgIyBmb3IgYSBWQ1MgVVJMIHJhdGhlciB0aGFuIEhhc2hNaXNzaW5nLikKICAgICAgICAgICAgICAgIGlmIHJlcXVpcmVfaGFzaGVzOgogICAgICAgICAgICAgICAgICAgICMgV2UgY291bGQgY2hlY2sgdGhlc2UgZmlyc3QgMiBjb25kaXRpb25zIGluc2lkZQogICAgICAgICAgICAgICAgICAgICMgdW5wYWNrX3VybCBhbmQgc2F2ZSByZXBldGl0aW9uIG9mIGNvbmRpdGlvbnMsIGJ1dCB0aGVuCiAgICAgICAgICAgICAgICAgICAgIyB3ZSB3b3VsZCByZXBvcnQgbGVzcy11c2VmdWwgZXJyb3IgbWVzc2FnZXMgZm9yCiAgICAgICAgICAgICAgICAgICAgIyB1bmhhc2hhYmxlIHJlcXVpcmVtZW50cywgY29tcGxhaW5pbmcgdGhhdCB0aGVyZSdzIG5vCiAgICAgICAgICAgICAgICAgICAgIyBoYXNoIHByb3ZpZGVkLgogICAgICAgICAgICAgICAgICAgIGlmIGlzX3Zjc191cmwobGluayk6CiAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZjc0hhc2hVbnN1cHBvcnRlZCgpCiAgICAgICAgICAgICAgICAgICAgZWxpZiBpc19maWxlX3VybChsaW5rKSBhbmQgaXNfZGlyX3VybChsaW5rKToKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgRGlyZWN0b3J5VXJsSGFzaFVuc3VwcG9ydGVkKCkKICAgICAgICAgICAgICAgICAgICBpZiAobm90IHJlcV90b19pbnN0YWxsLm9yaWdpbmFsX2xpbmsgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgcmVxX3RvX2luc3RhbGwuaXNfcGlubmVkKToKICAgICAgICAgICAgICAgICAgICAgICAgIyBVbnBpbm5lZCBwYWNrYWdlcyBhcmUgYXNraW5nIGZvciB0cm91YmxlIHdoZW4gYSBuZXcKICAgICAgICAgICAgICAgICAgICAgICAgIyB2ZXJzaW9uIGlzIHVwbG9hZGVkLiBUaGlzIGlzbid0IGEgc2VjdXJpdHkgY2hlY2ssIGJ1dAogICAgICAgICAgICAgICAgICAgICAgICAjIGl0IHNhdmVzIHVzZXJzIGEgc3VycHJpc2luZyBoYXNoIG1pc21hdGNoIGluIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAjIGZ1dHVyZS4KICAgICAgICAgICAgICAgICAgICAgICAgIwogICAgICAgICAgICAgICAgICAgICAgICAjIGZpbGU6Ly8vIFVSTHMgYXJlbid0IHBpbm5hYmxlLCBzbyBkb24ndCBjb21wbGFpbgogICAgICAgICAgICAgICAgICAgICAgICAjIGFib3V0IHRoZW0gbm90IGJlaW5nIHBpbm5lZC4KICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgSGFzaFVucGlubmVkKCkKICAgICAgICAgICAgICAgIGhhc2hlcyA9IHJlcV90b19pbnN0YWxsLmhhc2hlcygKICAgICAgICAgICAgICAgICAgICB0cnVzdF9pbnRlcm5ldD1ub3QgcmVxdWlyZV9oYXNoZXMpCiAgICAgICAgICAgICAgICBpZiByZXF1aXJlX2hhc2hlcyBhbmQgbm90IGhhc2hlczoKICAgICAgICAgICAgICAgICAgICAjIEtub3duLWdvb2QgaGFzaGVzIGFyZSBtaXNzaW5nIGZvciB0aGlzIHJlcXVpcmVtZW50LCBzbwogICAgICAgICAgICAgICAgICAgICMgc2hpbSBpdCB3aXRoIGEgZmFjYWRlIG9iamVjdCB0aGF0IHdpbGwgcHJvdm9rZSBoYXNoCiAgICAgICAgICAgICAgICAgICAgIyBjb21wdXRhdGlvbiBhbmQgdGhlbiByYWlzZSBhIEhhc2hNaXNzaW5nIGV4Y2VwdGlvbgogICAgICAgICAgICAgICAgICAgICMgc2hvd2luZyB0aGUgdXNlciB3aGF0IHRoZSBoYXNoIHNob3VsZCBiZS4KICAgICAgICAgICAgICAgICAgICBoYXNoZXMgPSBNaXNzaW5nSGFzaGVzKCkKCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRfZGlyID0gc2VsZi5kb3dubG9hZF9kaXIKICAgICAgICAgICAgICAgICAgICAjIFdlIGFsd2F5cyBkZWxldGUgdW5wYWNrZWQgc2Rpc3RzIGFmdGVyIHBpcCByYW4uCiAgICAgICAgICAgICAgICAgICAgYXV0b2RlbGV0ZV91bnBhY2tlZCA9IFRydWUKICAgICAgICAgICAgICAgICAgICBpZiByZXFfdG9faW5zdGFsbC5saW5rLmlzX3doZWVsIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBzZWxmLndoZWVsX2Rvd25sb2FkX2RpcjoKICAgICAgICAgICAgICAgICAgICAgICAgIyB3aGVuIGRvaW5nICdwaXAgd2hlZWxgIHdlIGRvd25sb2FkIHdoZWVscyB0byBhCiAgICAgICAgICAgICAgICAgICAgICAgICMgZGVkaWNhdGVkIGRpci4KICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRfZGlyID0gc2VsZi53aGVlbF9kb3dubG9hZF9kaXIKICAgICAgICAgICAgICAgICAgICBpZiByZXFfdG9faW5zdGFsbC5saW5rLmlzX3doZWVsOgogICAgICAgICAgICAgICAgICAgICAgICBpZiBkb3dubG9hZF9kaXI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFdoZW4gZG93bmxvYWRpbmcsIHdlIG9ubHkgdW5wYWNrIHdoZWVscyB0byBnZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbWV0YWRhdGEuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvZGVsZXRlX3VucGFja2VkID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBXaGVuIGluc3RhbGxpbmcgYSB3aGVlbCwgd2UgdXNlIHRoZSB1bnBhY2tlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB3aGVlbC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9kZWxldGVfdW5wYWNrZWQgPSBGYWxzZQogICAgICAgICAgICAgICAgICAgIHVucGFja191cmwoCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcV90b19pbnN0YWxsLmxpbmssIHJlcV90b19pbnN0YWxsLnNvdXJjZV9kaXIsCiAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkX2RpciwgYXV0b2RlbGV0ZV91bnBhY2tlZCwKICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbj1zZWxmLnNlc3Npb24sIGhhc2hlcz1oYXNoZXMpCiAgICAgICAgICAgICAgICBleGNlcHQgcmVxdWVzdHMuSFRUUEVycm9yIGFzIGV4YzoKICAgICAgICAgICAgICAgICAgICBsb2dnZXIuY3JpdGljYWwoCiAgICAgICAgICAgICAgICAgICAgICAgICdDb3VsZCBub3QgaW5zdGFsbCByZXF1aXJlbWVudCAlcyBiZWNhdXNlICcKICAgICAgICAgICAgICAgICAgICAgICAgJ29mIGVycm9yICVzJywKICAgICAgICAgICAgICAgICAgICAgICAgcmVxX3RvX2luc3RhbGwsCiAgICAgICAgICAgICAgICAgICAgICAgIGV4YywKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgcmFpc2UgSW5zdGFsbGF0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgICdDb3VsZCBub3QgaW5zdGFsbCByZXF1aXJlbWVudCAlcyBiZWNhdXNlICcKICAgICAgICAgICAgICAgICAgICAgICAgJ29mIEhUVFAgZXJyb3IgJXMgZm9yIFVSTCAlcycgJQogICAgICAgICAgICAgICAgICAgICAgICAocmVxX3RvX2luc3RhbGwsIGV4YywgcmVxX3RvX2luc3RhbGwubGluaykKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBhYnN0cmFjdF9kaXN0ID0gbWFrZV9hYnN0cmFjdF9kaXN0KHJlcV90b19pbnN0YWxsKQogICAgICAgICAgICAgICAgYWJzdHJhY3RfZGlzdC5wcmVwX2Zvcl9kaXN0KCkKICAgICAgICAgICAgICAgIGlmIHNlbGYuaXNfZG93bmxvYWQ6CiAgICAgICAgICAgICAgICAgICAgIyBNYWtlIGEgLnppcCBvZiB0aGUgc291cmNlX2RpciB3ZSBhbHJlYWR5IGNyZWF0ZWQuCiAgICAgICAgICAgICAgICAgICAgaWYgcmVxX3RvX2luc3RhbGwubGluay5zY2hlbWUgaW4gdmNzLmFsbF9zY2hlbWVzOgogICAgICAgICAgICAgICAgICAgICAgICByZXFfdG9faW5zdGFsbC5hcmNoaXZlKHNlbGYuZG93bmxvYWRfZGlyKQogICAgICAgICAgICAgICAgIyByZXFfdG9faW5zdGFsbC5yZXEgaXMgb25seSBhdmFpbCBhZnRlciB1bnBhY2sgZm9yIFVSTAogICAgICAgICAgICAgICAgIyBwa2dzIHJlcGVhdCBjaGVja19pZl9leGlzdHMgdG8gdW5pbnN0YWxsLW9uLXVwZ3JhZGUKICAgICAgICAgICAgICAgICMgKCMxNCkKICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmlnbm9yZV9pbnN0YWxsZWQ6CiAgICAgICAgICAgICAgICAgICAgcmVxX3RvX2luc3RhbGwuY2hlY2tfaWZfZXhpc3RzKCkKICAgICAgICAgICAgICAgIGlmIHJlcV90b19pbnN0YWxsLnNhdGlzZmllZF9ieToKICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnVwZ3JhZGUgb3Igc2VsZi5pZ25vcmVfaW5zdGFsbGVkOgogICAgICAgICAgICAgICAgICAgICAgICAjIGRvbid0IHVuaW5zdGFsbCBjb25mbGljdCBpZiB1c2VyIGluc3RhbGwgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICMgY29uZmxpY3QgaXMgbm90IHVzZXIgaW5zdGFsbAogICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgKHNlbGYudXNlX3VzZXJfc2l0ZSBhbmQgbm90CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdF9pbl91c2Vyc2l0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxX3RvX2luc3RhbGwuc2F0aXNmaWVkX2J5KSk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXFfdG9faW5zdGFsbC5jb25mbGljdHNfd2l0aCA9IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXFfdG9faW5zdGFsbC5zYXRpc2ZpZWRfYnkKICAgICAgICAgICAgICAgICAgICAgICAgcmVxX3RvX2luc3RhbGwuc2F0aXNmaWVkX2J5ID0gTm9uZQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1JlcXVpcmVtZW50IGFscmVhZHkgc2F0aXNmaWVkICh1c2UgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJy0tdXBncmFkZSB0byB1cGdyYWRlKTogJXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxX3RvX2luc3RhbGwsCiAgICAgICAgICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAjCiAgICAgICAgICAgICMgIyBwYXJzZSBkZXBlbmRlbmNpZXMgIyAjCiAgICAgICAgICAgICMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAjCiAgICAgICAgICAgIGRpc3QgPSBhYnN0cmFjdF9kaXN0LmRpc3QoZmluZGVyKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBjaGVja19kaXN0X3JlcXVpcmVzX3B5dGhvbihkaXN0KQogICAgICAgICAgICBleGNlcHQgVW5zdXBwb3J0ZWRQeXRob25WZXJzaW9uIGFzIGU6CiAgICAgICAgICAgICAgICBpZiBzZWxmLmlnbm9yZV9yZXF1aXJlc19weXRob246CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoZS5hcmdzWzBdKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICByZXFfdG9faW5zdGFsbC5yZW1vdmVfdGVtcG9yYXJ5X3NvdXJjZSgpCiAgICAgICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgbW9yZV9yZXFzID0gW10KCiAgICAgICAgICAgIGRlZiBhZGRfcmVxKHN1YnJlcSwgZXh0cmFzX3JlcXVlc3RlZCk6CiAgICAgICAgICAgICAgICBzdWJfaW5zdGFsbF9yZXEgPSBJbnN0YWxsUmVxdWlyZW1lbnQoCiAgICAgICAgICAgICAgICAgICAgc3RyKHN1YnJlcSksCiAgICAgICAgICAgICAgICAgICAgcmVxX3RvX2luc3RhbGwsCiAgICAgICAgICAgICAgICAgICAgaXNvbGF0ZWQ9c2VsZi5pc29sYXRlZCwKICAgICAgICAgICAgICAgICAgICB3aGVlbF9jYWNoZT1zZWxmLl93aGVlbF9jYWNoZSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIG1vcmVfcmVxcy5leHRlbmQoc2VsZi5hZGRfcmVxdWlyZW1lbnQoCiAgICAgICAgICAgICAgICAgICAgc3ViX2luc3RhbGxfcmVxLCByZXFfdG9faW5zdGFsbC5uYW1lLAogICAgICAgICAgICAgICAgICAgIGV4dHJhc19yZXF1ZXN0ZWQ9ZXh0cmFzX3JlcXVlc3RlZCkpCgogICAgICAgICAgICAjIFdlIGFkZCByZXFfdG9faW5zdGFsbCBiZWZvcmUgaXRzIGRlcGVuZGVuY2llcywgc28gdGhhdCB3ZQogICAgICAgICAgICAjIGNhbiByZWZlciB0byBpdCB3aGVuIGFkZGluZyBkZXBlbmRlbmNpZXMuCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLmhhc19yZXF1aXJlbWVudChyZXFfdG9faW5zdGFsbC5uYW1lKToKICAgICAgICAgICAgICAgICMgJ3VubmFtZWQnIHJlcXVpcmVtZW50cyB3aWxsIGdldCBhZGRlZCBoZXJlCiAgICAgICAgICAgICAgICBzZWxmLmFkZF9yZXF1aXJlbWVudChyZXFfdG9faW5zdGFsbCwgTm9uZSkKCiAgICAgICAgICAgIGlmIG5vdCBpZ25vcmVfZGVwZW5kZW5jaWVzOgogICAgICAgICAgICAgICAgaWYgKHJlcV90b19pbnN0YWxsLmV4dHJhcyk6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKAogICAgICAgICAgICAgICAgICAgICAgICAiSW5zdGFsbGluZyBleHRyYSByZXF1aXJlbWVudHM6ICVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgJywnLmpvaW4ocmVxX3RvX2luc3RhbGwuZXh0cmFzKSwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBtaXNzaW5nX3JlcXVlc3RlZCA9IHNvcnRlZCgKICAgICAgICAgICAgICAgICAgICBzZXQocmVxX3RvX2luc3RhbGwuZXh0cmFzKSAtIHNldChkaXN0LmV4dHJhcykKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGZvciBtaXNzaW5nIGluIG1pc3NpbmdfcmVxdWVzdGVkOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAnJXMgZG9lcyBub3QgcHJvdmlkZSB0aGUgZXh0cmEgXCclc1wnJywKICAgICAgICAgICAgICAgICAgICAgICAgZGlzdCwgbWlzc2luZwogICAgICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICAgICBhdmFpbGFibGVfcmVxdWVzdGVkID0gc29ydGVkKAogICAgICAgICAgICAgICAgICAgIHNldChkaXN0LmV4dHJhcykgJiBzZXQocmVxX3RvX2luc3RhbGwuZXh0cmFzKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgZm9yIHN1YnJlcSBpbiBkaXN0LnJlcXVpcmVzKGF2YWlsYWJsZV9yZXF1ZXN0ZWQpOgogICAgICAgICAgICAgICAgICAgIGFkZF9yZXEoc3VicmVxLCBleHRyYXNfcmVxdWVzdGVkPWF2YWlsYWJsZV9yZXF1ZXN0ZWQpCgogICAgICAgICAgICAjIGNsZWFudXAgdG1wIHNyYwogICAgICAgICAgICBzZWxmLnJlcXNfdG9fY2xlYW51cC5hcHBlbmQocmVxX3RvX2luc3RhbGwpCgogICAgICAgICAgICBpZiBub3QgcmVxX3RvX2luc3RhbGwuZWRpdGFibGUgYW5kIG5vdCByZXFfdG9faW5zdGFsbC5zYXRpc2ZpZWRfYnk6CiAgICAgICAgICAgICAgICAjIFhYWDogLS1uby1pbnN0YWxsIGxlYWRzIHRoaXMgdG8gcmVwb3J0ICdTdWNjZXNzZnVsbHkKICAgICAgICAgICAgICAgICMgZG93bmxvYWRlZCcgZm9yIG9ubHkgbm9uLWVkaXRhYmxlIHJlcXMsIGV2ZW4gdGhvdWdoIHdlIHRvb2sKICAgICAgICAgICAgICAgICMgYWN0aW9uIG9uIHRoZW0uCiAgICAgICAgICAgICAgICBzZWxmLnN1Y2Nlc3NmdWxseV9kb3dubG9hZGVkLmFwcGVuZChyZXFfdG9faW5zdGFsbCkKCiAgICAgICAgcmV0dXJuIG1vcmVfcmVxcwoKICAgIGRlZiBjbGVhbnVwX2ZpbGVzKHNlbGYpOgogICAgICAgICIiIkNsZWFuIHVwIGZpbGVzLCByZW1vdmUgYnVpbGRzLiIiIgogICAgICAgIGxvZ2dlci5kZWJ1ZygnQ2xlYW5pbmcgdXAuLi4nKQogICAgICAgIHdpdGggaW5kZW50X2xvZygpOgogICAgICAgICAgICBmb3IgcmVxIGluIHNlbGYucmVxc190b19jbGVhbnVwOgogICAgICAgICAgICAgICAgcmVxLnJlbW92ZV90ZW1wb3Jhcnlfc291cmNlKCkKCiAgICBkZWYgX3RvX2luc3RhbGwoc2VsZik6CiAgICAgICAgIiIiQ3JlYXRlIHRoZSBpbnN0YWxsYXRpb24gb3JkZXIuCgogICAgICAgIFRoZSBpbnN0YWxsYXRpb24gb3JkZXIgaXMgdG9wb2xvZ2ljYWwgLSByZXF1aXJlbWVudHMgYXJlIGluc3RhbGxlZAogICAgICAgIGJlZm9yZSB0aGUgcmVxdWlyaW5nIHRoaW5nLiBXZSBicmVhayBjeWNsZXMgYXQgYW4gYXJiaXRyYXJ5IHBvaW50LAogICAgICAgIGFuZCBtYWtlIG5vIG90aGVyIGd1YXJhbnRlZXMuCiAgICAgICAgIiIiCiAgICAgICAgIyBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggd2UgbWF5IGNoYW5nZSBhdCBhbnkgcG9pbnQKICAgICAgICAjIGluc3RhbGxzIHRoZSB1c2VyIHNwZWNpZmllZCB0aGluZ3MgaW4gdGhlIG9yZGVyIGdpdmVuLCBleGNlcHQgd2hlbgogICAgICAgICMgZGVwZW5kZW5jaWVzIG11c3QgY29tZSBlYXJsaWVyIHRvIGFjaGlldmUgdG9wb2xvZ2ljYWwgb3JkZXIuCiAgICAgICAgb3JkZXIgPSBbXQogICAgICAgIG9yZGVyZWRfcmVxcyA9IHNldCgpCgogICAgICAgIGRlZiBzY2hlZHVsZShyZXEpOgogICAgICAgICAgICBpZiByZXEuc2F0aXNmaWVkX2J5IG9yIHJlcSBpbiBvcmRlcmVkX3JlcXM6CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgaWYgcmVxLmNvbnN0cmFpbnQ6CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgb3JkZXJlZF9yZXFzLmFkZChyZXEpCiAgICAgICAgICAgIGZvciBkZXAgaW4gc2VsZi5fZGVwZW5kZW5jaWVzW3JlcV06CiAgICAgICAgICAgICAgICBzY2hlZHVsZShkZXApCiAgICAgICAgICAgIG9yZGVyLmFwcGVuZChyZXEpCiAgICAgICAgZm9yIGluc3RhbGxfcmVxIGluIHNlbGYucmVxdWlyZW1lbnRzLnZhbHVlcygpOgogICAgICAgICAgICBzY2hlZHVsZShpbnN0YWxsX3JlcSkKICAgICAgICByZXR1cm4gb3JkZXIKCiAgICBkZWYgaW5zdGFsbChzZWxmLCBpbnN0YWxsX29wdGlvbnMsIGdsb2JhbF9vcHRpb25zPSgpLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICIiIgogICAgICAgIEluc3RhbGwgZXZlcnl0aGluZyBpbiB0aGlzIHNldCAoYWZ0ZXIgaGF2aW5nIGRvd25sb2FkZWQgYW5kIHVucGFja2VkCiAgICAgICAgdGhlIHBhY2thZ2VzKQogICAgICAgICIiIgogICAgICAgIHRvX2luc3RhbGwgPSBzZWxmLl90b19pbnN0YWxsKCkKCiAgICAgICAgaWYgdG9faW5zdGFsbDoKICAgICAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAnSW5zdGFsbGluZyBjb2xsZWN0ZWQgcGFja2FnZXM6ICVzJywKICAgICAgICAgICAgICAgICcsICcuam9pbihbcmVxLm5hbWUgZm9yIHJlcSBpbiB0b19pbnN0YWxsXSksCiAgICAgICAgICAgICkKCiAgICAgICAgd2l0aCBpbmRlbnRfbG9nKCk6CiAgICAgICAgICAgIGZvciByZXF1aXJlbWVudCBpbiB0b19pbnN0YWxsOgogICAgICAgICAgICAgICAgaWYgcmVxdWlyZW1lbnQuY29uZmxpY3RzX3dpdGg6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAgICAgICAgICdGb3VuZCBleGlzdGluZyBpbnN0YWxsYXRpb246ICVzJywKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnQuY29uZmxpY3RzX3dpdGgsCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHdpdGggaW5kZW50X2xvZygpOgogICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlbWVudC51bmluc3RhbGwoYXV0b19jb25maXJtPVRydWUpCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnQuaW5zdGFsbCgKICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFsbF9vcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfb3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgKmFyZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICoqa3dhcmdzCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgZXhjZXB0OgogICAgICAgICAgICAgICAgICAgICMgaWYgaW5zdGFsbCBkaWQgbm90IHN1Y2NlZWQsIHJvbGxiYWNrIHByZXZpb3VzIHVuaW5zdGFsbAogICAgICAgICAgICAgICAgICAgIGlmIChyZXF1aXJlbWVudC5jb25mbGljdHNfd2l0aCBhbmQgbm90CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlbWVudC5pbnN0YWxsX3N1Y2NlZWRlZCk6CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50LnJvbGxiYWNrX3VuaW5zdGFsbCgpCiAgICAgICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVtZW50LmNvbmZsaWN0c193aXRoIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnQuaW5zdGFsbF9zdWNjZWVkZWQpOgogICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlbWVudC5jb21taXRfdW5pbnN0YWxsKCkKICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50LnJlbW92ZV90ZW1wb3Jhcnlfc291cmNlKCkKCiAgICAgICAgc2VsZi5zdWNjZXNzZnVsbHlfaW5zdGFsbGVkID0gdG9faW5zdGFsbApQSwMEFAAAAAAAAAAhAAVGxHDxGgAA8RoAACgAAABweXBpX19waXBfOV8wXzMvcGlwL3JlcS9yZXFfdW5pbnN0YWxsLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBsb2dnaW5nCmltcG9ydCBvcwppbXBvcnQgdGVtcGZpbGUKCmZyb20gcGlwLmNvbXBhdCBpbXBvcnQgdXNlc19weWNhY2hlLCBXSU5ET1dTLCBjYWNoZV9mcm9tX3NvdXJjZQpmcm9tIHBpcC5leGNlcHRpb25zIGltcG9ydCBVbmluc3RhbGxhdGlvbkVycm9yCmZyb20gcGlwLnV0aWxzIGltcG9ydCBybXRyZWUsIGFzaywgaXNfbG9jYWwsIHJlbmFtZXMsIG5vcm1hbGl6ZV9wYXRoCmZyb20gcGlwLnV0aWxzLmxvZ2dpbmcgaW1wb3J0IGluZGVudF9sb2cKCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgpjbGFzcyBVbmluc3RhbGxQYXRoU2V0KG9iamVjdCk6CiAgICAiIiJBIHNldCBvZiBmaWxlIHBhdGhzIHRvIGJlIHJlbW92ZWQgaW4gdGhlIHVuaW5zdGFsbGF0aW9uIG9mIGEKICAgIHJlcXVpcmVtZW50LiIiIgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGRpc3QpOgogICAgICAgIHNlbGYucGF0aHMgPSBzZXQoKQogICAgICAgIHNlbGYuX3JlZnVzZSA9IHNldCgpCiAgICAgICAgc2VsZi5wdGggPSB7fQogICAgICAgIHNlbGYuZGlzdCA9IGRpc3QKICAgICAgICBzZWxmLnNhdmVfZGlyID0gTm9uZQogICAgICAgIHNlbGYuX21vdmVkX3BhdGhzID0gW10KCiAgICBkZWYgX3Blcm1pdHRlZChzZWxmLCBwYXRoKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gVHJ1ZSBpZiB0aGUgZ2l2ZW4gcGF0aCBpcyBvbmUgd2UgYXJlIHBlcm1pdHRlZCB0bwogICAgICAgIHJlbW92ZS9tb2RpZnksIEZhbHNlIG90aGVyd2lzZS4KCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGlzX2xvY2FsKHBhdGgpCgogICAgZGVmIGFkZChzZWxmLCBwYXRoKToKICAgICAgICBoZWFkLCB0YWlsID0gb3MucGF0aC5zcGxpdChwYXRoKQoKICAgICAgICAjIHdlIG5vcm1hbGl6ZSB0aGUgaGVhZCB0byByZXNvbHZlIHBhcmVudCBkaXJlY3Rvcnkgc3ltbGlua3MsIGJ1dCBub3QKICAgICAgICAjIHRoZSB0YWlsLCBzaW5jZSB3ZSBvbmx5IHdhbnQgdG8gdW5pbnN0YWxsIHN5bWxpbmtzLCBub3QgdGhlaXIgdGFyZ2V0cwogICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4obm9ybWFsaXplX3BhdGgoaGVhZCksIG9zLnBhdGgubm9ybWNhc2UodGFpbCkpCgogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhwYXRoKToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgaWYgc2VsZi5fcGVybWl0dGVkKHBhdGgpOgogICAgICAgICAgICBzZWxmLnBhdGhzLmFkZChwYXRoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuX3JlZnVzZS5hZGQocGF0aCkKCiAgICAgICAgIyBfX3B5Y2FjaGVfXyBmaWxlcyBjYW4gc2hvdyB1cCBhZnRlciAnaW5zdGFsbGVkLWZpbGVzLnR4dCcgaXMgY3JlYXRlZCwKICAgICAgICAjIGR1ZSB0byBpbXBvcnRzCiAgICAgICAgaWYgb3MucGF0aC5zcGxpdGV4dChwYXRoKVsxXSA9PSAnLnB5JyBhbmQgdXNlc19weWNhY2hlOgogICAgICAgICAgICBzZWxmLmFkZChjYWNoZV9mcm9tX3NvdXJjZShwYXRoKSkKCiAgICBkZWYgYWRkX3B0aChzZWxmLCBwdGhfZmlsZSwgZW50cnkpOgogICAgICAgIHB0aF9maWxlID0gbm9ybWFsaXplX3BhdGgocHRoX2ZpbGUpCiAgICAgICAgaWYgc2VsZi5fcGVybWl0dGVkKHB0aF9maWxlKToKICAgICAgICAgICAgaWYgcHRoX2ZpbGUgbm90IGluIHNlbGYucHRoOgogICAgICAgICAgICAgICAgc2VsZi5wdGhbcHRoX2ZpbGVdID0gVW5pbnN0YWxsUHRoRW50cmllcyhwdGhfZmlsZSkKICAgICAgICAgICAgc2VsZi5wdGhbcHRoX2ZpbGVdLmFkZChlbnRyeSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLl9yZWZ1c2UuYWRkKHB0aF9maWxlKQoKICAgIGRlZiBjb21wYWN0KHNlbGYsIHBhdGhzKToKICAgICAgICAiIiJDb21wYWN0IGEgcGF0aCBzZXQgdG8gY29udGFpbiB0aGUgbWluaW1hbCBudW1iZXIgb2YgcGF0aHMKICAgICAgICBuZWNlc3NhcnkgdG8gY29udGFpbiBhbGwgcGF0aHMgaW4gdGhlIHNldC4gSWYgL2EvcGF0aC8gYW5kCiAgICAgICAgL2EvcGF0aC90by9hL2ZpbGUudHh0IGFyZSBib3RoIGluIHRoZSBzZXQsIGxlYXZlIG9ubHkgdGhlCiAgICAgICAgc2hvcnRlciBwYXRoLiIiIgogICAgICAgIHNob3J0X3BhdGhzID0gc2V0KCkKICAgICAgICBmb3IgcGF0aCBpbiBzb3J0ZWQocGF0aHMsIGtleT1sZW4pOgogICAgICAgICAgICBpZiBub3QgYW55KFsKICAgICAgICAgICAgICAgICAgICAocGF0aC5zdGFydHN3aXRoKHNob3J0cGF0aCkgYW5kCiAgICAgICAgICAgICAgICAgICAgIHBhdGhbbGVuKHNob3J0cGF0aC5yc3RyaXAob3MucGF0aC5zZXApKV0gPT0gb3MucGF0aC5zZXApCiAgICAgICAgICAgICAgICAgICAgZm9yIHNob3J0cGF0aCBpbiBzaG9ydF9wYXRoc10pOgogICAgICAgICAgICAgICAgc2hvcnRfcGF0aHMuYWRkKHBhdGgpCiAgICAgICAgcmV0dXJuIHNob3J0X3BhdGhzCgogICAgZGVmIF9zdGFzaChzZWxmLCBwYXRoKToKICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKAogICAgICAgICAgICBzZWxmLnNhdmVfZGlyLCBvcy5wYXRoLnNwbGl0ZHJpdmUocGF0aClbMV0ubHN0cmlwKG9zLnBhdGguc2VwKSkKCiAgICBkZWYgcmVtb3ZlKHNlbGYsIGF1dG9fY29uZmlybT1GYWxzZSk6CiAgICAgICAgIiIiUmVtb3ZlIHBhdGhzIGluIGBgc2VsZi5wYXRoc2BgIHdpdGggY29uZmlybWF0aW9uICh1bmxlc3MKICAgICAgICBgYGF1dG9fY29uZmlybWBgIGlzIFRydWUpLiIiIgogICAgICAgIGlmIG5vdCBzZWxmLnBhdGhzOgogICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICJDYW4ndCB1bmluc3RhbGwgJyVzJy4gTm8gZmlsZXMgd2VyZSBmb3VuZCB0byB1bmluc3RhbGwuIiwKICAgICAgICAgICAgICAgIHNlbGYuZGlzdC5wcm9qZWN0X25hbWUsCiAgICAgICAgICAgICkKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICdVbmluc3RhbGxpbmcgJXMtJXM6JywKICAgICAgICAgICAgc2VsZi5kaXN0LnByb2plY3RfbmFtZSwgc2VsZi5kaXN0LnZlcnNpb24KICAgICAgICApCgogICAgICAgIHdpdGggaW5kZW50X2xvZygpOgogICAgICAgICAgICBwYXRocyA9IHNvcnRlZChzZWxmLmNvbXBhY3Qoc2VsZi5wYXRocykpCgogICAgICAgICAgICBpZiBhdXRvX2NvbmZpcm06CiAgICAgICAgICAgICAgICByZXNwb25zZSA9ICd5JwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZm9yIHBhdGggaW4gcGF0aHM6CiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8ocGF0aCkKICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gYXNrKCdQcm9jZWVkICh5L24pPyAnLCAoJ3knLCAnbicpKQogICAgICAgICAgICBpZiBzZWxmLl9yZWZ1c2U6CiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygnTm90IHJlbW92aW5nIG9yIG1vZGlmeWluZyAob3V0c2lkZSBvZiBwcmVmaXgpOicpCiAgICAgICAgICAgICAgICBmb3IgcGF0aCBpbiBzZWxmLmNvbXBhY3Qoc2VsZi5fcmVmdXNlKToKICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhwYXRoKQogICAgICAgICAgICBpZiByZXNwb25zZSA9PSAneSc6CiAgICAgICAgICAgICAgICBzZWxmLnNhdmVfZGlyID0gdGVtcGZpbGUubWtkdGVtcChzdWZmaXg9Jy11bmluc3RhbGwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4PSdwaXAtJykKICAgICAgICAgICAgICAgIGZvciBwYXRoIGluIHBhdGhzOgogICAgICAgICAgICAgICAgICAgIG5ld19wYXRoID0gc2VsZi5fc3Rhc2gocGF0aCkKICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1JlbW92aW5nIGZpbGUgb3IgZGlyZWN0b3J5ICVzJywgcGF0aCkKICAgICAgICAgICAgICAgICAgICBzZWxmLl9tb3ZlZF9wYXRocy5hcHBlbmQocGF0aCkKICAgICAgICAgICAgICAgICAgICByZW5hbWVzKHBhdGgsIG5ld19wYXRoKQogICAgICAgICAgICAgICAgZm9yIHB0aCBpbiBzZWxmLnB0aC52YWx1ZXMoKToKICAgICAgICAgICAgICAgICAgICBwdGgucmVtb3ZlKCkKICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgICAgICdTdWNjZXNzZnVsbHkgdW5pbnN0YWxsZWQgJXMtJXMnLAogICAgICAgICAgICAgICAgICAgIHNlbGYuZGlzdC5wcm9qZWN0X25hbWUsIHNlbGYuZGlzdC52ZXJzaW9uCiAgICAgICAgICAgICAgICApCgogICAgZGVmIHJvbGxiYWNrKHNlbGYpOgogICAgICAgICIiIlJvbGxiYWNrIHRoZSBjaGFuZ2VzIHByZXZpb3VzbHkgbWFkZSBieSByZW1vdmUoKS4iIiIKICAgICAgICBpZiBzZWxmLnNhdmVfZGlyIGlzIE5vbmU6CiAgICAgICAgICAgIGxvZ2dlci5lcnJvcigKICAgICAgICAgICAgICAgICJDYW4ndCByb2xsIGJhY2sgJXM7IHdhcyBub3QgdW5pbnN0YWxsZWQiLAogICAgICAgICAgICAgICAgc2VsZi5kaXN0LnByb2plY3RfbmFtZSwKICAgICAgICAgICAgKQogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICBsb2dnZXIuaW5mbygnUm9sbGluZyBiYWNrIHVuaW5zdGFsbCBvZiAlcycsIHNlbGYuZGlzdC5wcm9qZWN0X25hbWUpCiAgICAgICAgZm9yIHBhdGggaW4gc2VsZi5fbW92ZWRfcGF0aHM6CiAgICAgICAgICAgIHRtcF9wYXRoID0gc2VsZi5fc3Rhc2gocGF0aCkKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdSZXBsYWNpbmcgJXMnLCBwYXRoKQogICAgICAgICAgICByZW5hbWVzKHRtcF9wYXRoLCBwYXRoKQogICAgICAgIGZvciBwdGggaW4gc2VsZi5wdGgudmFsdWVzKCk6CiAgICAgICAgICAgIHB0aC5yb2xsYmFjaygpCgogICAgZGVmIGNvbW1pdChzZWxmKToKICAgICAgICAiIiJSZW1vdmUgdGVtcG9yYXJ5IHNhdmUgZGlyOiByb2xsYmFjayB3aWxsIG5vIGxvbmdlciBiZSBwb3NzaWJsZS4iIiIKICAgICAgICBpZiBzZWxmLnNhdmVfZGlyIGlzIG5vdCBOb25lOgogICAgICAgICAgICBybXRyZWUoc2VsZi5zYXZlX2RpcikKICAgICAgICAgICAgc2VsZi5zYXZlX2RpciA9IE5vbmUKICAgICAgICAgICAgc2VsZi5fbW92ZWRfcGF0aHMgPSBbXQoKCmNsYXNzIFVuaW5zdGFsbFB0aEVudHJpZXMob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwdGhfZmlsZSk6CiAgICAgICAgaWYgbm90IG9zLnBhdGguaXNmaWxlKHB0aF9maWxlKToKICAgICAgICAgICAgcmFpc2UgVW5pbnN0YWxsYXRpb25FcnJvcigKICAgICAgICAgICAgICAgICJDYW5ub3QgcmVtb3ZlIGVudHJpZXMgZnJvbSBub25leGlzdGVudCBmaWxlICVzIiAlIHB0aF9maWxlCiAgICAgICAgICAgICkKICAgICAgICBzZWxmLmZpbGUgPSBwdGhfZmlsZQogICAgICAgIHNlbGYuZW50cmllcyA9IHNldCgpCiAgICAgICAgc2VsZi5fc2F2ZWRfbGluZXMgPSBOb25lCgogICAgZGVmIGFkZChzZWxmLCBlbnRyeSk6CiAgICAgICAgZW50cnkgPSBvcy5wYXRoLm5vcm1jYXNlKGVudHJ5KQogICAgICAgICMgT24gV2luZG93cywgb3MucGF0aC5ub3JtY2FzZSBjb252ZXJ0cyB0aGUgZW50cnkgdG8gdXNlCiAgICAgICAgIyBiYWNrc2xhc2hlcy4gIFRoaXMgaXMgY29ycmVjdCBmb3IgZW50cmllcyB0aGF0IGRlc2NyaWJlIGFic29sdXRlCiAgICAgICAgIyBwYXRocyBvdXRzaWRlIG9mIHNpdGUtcGFja2FnZXMsIGJ1dCBhbGwgdGhlIG90aGVycyB1c2UgZm9yd2FyZAogICAgICAgICMgc2xhc2hlcy4KICAgICAgICBpZiBXSU5ET1dTIGFuZCBub3Qgb3MucGF0aC5zcGxpdGRyaXZlKGVudHJ5KVswXToKICAgICAgICAgICAgZW50cnkgPSBlbnRyeS5yZXBsYWNlKCdcXCcsICcvJykKICAgICAgICBzZWxmLmVudHJpZXMuYWRkKGVudHJ5KQoKICAgIGRlZiByZW1vdmUoc2VsZik6CiAgICAgICAgbG9nZ2VyLmRlYnVnKCdSZW1vdmluZyBwdGggZW50cmllcyBmcm9tICVzOicsIHNlbGYuZmlsZSkKICAgICAgICB3aXRoIG9wZW4oc2VsZi5maWxlLCAncmInKSBhcyBmaDoKICAgICAgICAgICAgIyB3aW5kb3dzIHVzZXMgJ1xyXG4nIHdpdGggcHkzaywgYnV0IHVzZXMgJ1xuJyB3aXRoIHB5Mi54CiAgICAgICAgICAgIGxpbmVzID0gZmgucmVhZGxpbmVzKCkKICAgICAgICAgICAgc2VsZi5fc2F2ZWRfbGluZXMgPSBsaW5lcwogICAgICAgIGlmIGFueShiJ1xyXG4nIGluIGxpbmUgZm9yIGxpbmUgaW4gbGluZXMpOgogICAgICAgICAgICBlbmRsaW5lID0gJ1xyXG4nCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZW5kbGluZSA9ICdcbicKICAgICAgICBmb3IgZW50cnkgaW4gc2VsZi5lbnRyaWVzOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1JlbW92aW5nIGVudHJ5OiAlcycsIGVudHJ5KQogICAgICAgICAgICAgICAgbGluZXMucmVtb3ZlKChlbnRyeSArIGVuZGxpbmUpLmVuY29kZSgidXRmLTgiKSkKICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgd2l0aCBvcGVuKHNlbGYuZmlsZSwgJ3diJykgYXMgZmg6CiAgICAgICAgICAgIGZoLndyaXRlbGluZXMobGluZXMpCgogICAgZGVmIHJvbGxiYWNrKHNlbGYpOgogICAgICAgIGlmIHNlbGYuX3NhdmVkX2xpbmVzIGlzIE5vbmU6CiAgICAgICAgICAgIGxvZ2dlci5lcnJvcigKICAgICAgICAgICAgICAgICdDYW5ub3Qgcm9sbCBiYWNrIGNoYW5nZXMgdG8gJXMsIG5vbmUgd2VyZSBtYWRlJywgc2VsZi5maWxlCiAgICAgICAgICAgICkKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgbG9nZ2VyLmRlYnVnKCdSb2xsaW5nICVzIGJhY2sgdG8gcHJldmlvdXMgc3RhdGUnLCBzZWxmLmZpbGUpCiAgICAgICAgd2l0aCBvcGVuKHNlbGYuZmlsZSwgJ3diJykgYXMgZmg6CiAgICAgICAgICAgIGZoLndyaXRlbGluZXMoc2VsZi5fc2F2ZWRfbGluZXMpCiAgICAgICAgcmV0dXJuIFRydWUKUEsDBBQAAAAAAAAAIQDbrHf2nAAAAJwAAAAjAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC9zdGF0dXNfY29kZXMucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKU1VDQ0VTUyA9IDAKRVJST1IgPSAxClVOS05PV05fRVJST1IgPSAyClZJUlRVQUxFTlZfTk9UX0ZPVU5EID0gMwpQUkVWSU9VU19CVUlMRF9ESVJfRVJST1IgPSA0Ck5PX01BVENIRVNfRk9VTkQgPSAyMwpQSwMEFAAAAAAAAAAhAOBatL4zagAAM2oAACUAAABweXBpX19waXBfOV8wXzMvcGlwL3V0aWxzL19faW5pdF9fLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmZyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlCmltcG9ydCBjb250ZXh0bGliCmltcG9ydCBlcnJubwppbXBvcnQgaW8KaW1wb3J0IGxvY2FsZQojIHdlIGhhdmUgYSBzdWJtb2R1bGUgbmFtZWQgJ2xvZ2dpbmcnIHdoaWNoIHdvdWxkIHNoYWRvdyB0aGlzIGlmIHdlIHVzZWQgdGhlCiMgcmVndWxhciBuYW1lOgppbXBvcnQgbG9nZ2luZyBhcyBzdGRfbG9nZ2luZwppbXBvcnQgcmUKaW1wb3J0IG9zCmltcG9ydCBwb3NpeHBhdGgKaW1wb3J0IHNodXRpbAppbXBvcnQgc3RhdAppbXBvcnQgc3VicHJvY2VzcwppbXBvcnQgc3lzCmltcG9ydCB0YXJmaWxlCmltcG9ydCB6aXBmaWxlCgpmcm9tIHBpcC5leGNlcHRpb25zIGltcG9ydCBJbnN0YWxsYXRpb25FcnJvcgpmcm9tIHBpcC5jb21wYXQgaW1wb3J0IGNvbnNvbGVfdG9fc3RyLCBleHBhbmR1c2VyLCBzdGRsaWJfcGtncwpmcm9tIHBpcC5sb2NhdGlvbnMgaW1wb3J0ICgKICAgIHNpdGVfcGFja2FnZXMsIHVzZXJfc2l0ZSwgcnVubmluZ191bmRlcl92aXJ0dWFsZW52LCB2aXJ0dWFsZW52X25vX2dsb2JhbCwKICAgIHdyaXRlX2RlbGV0ZV9tYXJrZXJfZmlsZSwKKQpmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCBwa2dfcmVzb3VyY2VzCmZyb20gcGlwLl92ZW5kb3Iuc2l4Lm1vdmVzIGltcG9ydCBpbnB1dApmcm9tIHBpcC5fdmVuZG9yLnNpeCBpbXBvcnQgUFkyCmZyb20gcGlwLl92ZW5kb3IucmV0cnlpbmcgaW1wb3J0IHJldHJ5CgppZiBQWTI6CiAgICBmcm9tIGlvIGltcG9ydCBCeXRlc0lPIGFzIFN0cmluZ0lPCmVsc2U6CiAgICBmcm9tIGlvIGltcG9ydCBTdHJpbmdJTwoKX19hbGxfXyA9IFsncm10cmVlJywgJ2Rpc3BsYXlfcGF0aCcsICdiYWNrdXBfZGlyJywKICAgICAgICAgICAnYXNrJywgJ3NwbGl0ZXh0JywKICAgICAgICAgICAnZm9ybWF0X3NpemUnLCAnaXNfaW5zdGFsbGFibGVfZGlyJywKICAgICAgICAgICAnaXNfc3ZuX3BhZ2UnLCAnZmlsZV9jb250ZW50cycsCiAgICAgICAgICAgJ3NwbGl0X2xlYWRpbmdfZGlyJywgJ2hhc19sZWFkaW5nX2RpcicsCiAgICAgICAgICAgJ25vcm1hbGl6ZV9wYXRoJywKICAgICAgICAgICAncmVuYW1lcycsICdnZXRfdGVybWluYWxfc2l6ZScsICdnZXRfcHJvZycsCiAgICAgICAgICAgJ3VuemlwX2ZpbGUnLCAndW50YXJfZmlsZScsICd1bnBhY2tfZmlsZScsICdjYWxsX3N1YnByb2Nlc3MnLAogICAgICAgICAgICdjYXB0dXJlZF9zdGRvdXQnLCAnZW5zdXJlX2RpcicsCiAgICAgICAgICAgJ0FSQ0hJVkVfRVhURU5TSU9OUycsICdTVVBQT1JURURfRVhURU5TSU9OUycsCiAgICAgICAgICAgJ2dldF9pbnN0YWxsZWRfdmVyc2lvbiddCgoKbG9nZ2VyID0gc3RkX2xvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKQloyX0VYVEVOU0lPTlMgPSAoJy50YXIuYnoyJywgJy50YnonKQpYWl9FWFRFTlNJT05TID0gKCcudGFyLnh6JywgJy50eHonLCAnLnRseicsICcudGFyLmx6JywgJy50YXIubHptYScpClpJUF9FWFRFTlNJT05TID0gKCcuemlwJywgJy53aGwnKQpUQVJfRVhURU5TSU9OUyA9ICgnLnRhci5neicsICcudGd6JywgJy50YXInKQpBUkNISVZFX0VYVEVOU0lPTlMgPSAoCiAgICBaSVBfRVhURU5TSU9OUyArIEJaMl9FWFRFTlNJT05TICsgVEFSX0VYVEVOU0lPTlMgKyBYWl9FWFRFTlNJT05TKQpTVVBQT1JURURfRVhURU5TSU9OUyA9IFpJUF9FWFRFTlNJT05TICsgVEFSX0VYVEVOU0lPTlMKdHJ5OgogICAgaW1wb3J0IGJ6MiAgIyBub3FhCiAgICBTVVBQT1JURURfRVhURU5TSU9OUyArPSBCWjJfRVhURU5TSU9OUwpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBsb2dnZXIuZGVidWcoJ2J6MiBtb2R1bGUgaXMgbm90IGF2YWlsYWJsZScpCgp0cnk6CiAgICAjIE9ubHkgZm9yIFB5dGhvbiAzLjMrCiAgICBpbXBvcnQgbHptYSAgIyBub3FhCiAgICBTVVBQT1JURURfRVhURU5TSU9OUyArPSBYWl9FWFRFTlNJT05TCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGxvZ2dlci5kZWJ1ZygnbHptYSBtb2R1bGUgaXMgbm90IGF2YWlsYWJsZScpCgoKZGVmIGltcG9ydF9vcl9yYWlzZShwa2dfb3JfbW9kdWxlX3N0cmluZywgRXhjZXB0aW9uVHlwZSwgKmFyZ3MsICoqa3dhcmdzKToKICAgIHRyeToKICAgICAgICByZXR1cm4gX19pbXBvcnRfXyhwa2dfb3JfbW9kdWxlX3N0cmluZykKICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICByYWlzZSBFeGNlcHRpb25UeXBlKCphcmdzLCAqKmt3YXJncykKCgpkZWYgZW5zdXJlX2RpcihwYXRoKToKICAgICIiIm9zLnBhdGgubWFrZWRpcnMgd2l0aG91dCBFRVhJU1QuIiIiCiAgICB0cnk6CiAgICAgICAgb3MubWFrZWRpcnMocGF0aCkKICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6CiAgICAgICAgaWYgZS5lcnJubyAhPSBlcnJuby5FRVhJU1Q6CiAgICAgICAgICAgIHJhaXNlCgoKZGVmIGdldF9wcm9nKCk6CiAgICB0cnk6CiAgICAgICAgaWYgb3MucGF0aC5iYXNlbmFtZShzeXMuYXJndlswXSkgaW4gKCdfX21haW5fXy5weScsICctYycpOgogICAgICAgICAgICByZXR1cm4gIiVzIC1tIHBpcCIgJSBzeXMuZXhlY3V0YWJsZQogICAgZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgVHlwZUVycm9yLCBJbmRleEVycm9yKToKICAgICAgICBwYXNzCiAgICByZXR1cm4gJ3BpcCcKCgojIFJldHJ5IGV2ZXJ5IGhhbGYgc2Vjb25kIGZvciB1cCB0byAzIHNlY29uZHMKQHJldHJ5KHN0b3BfbWF4X2RlbGF5PTMwMDAsIHdhaXRfZml4ZWQ9NTAwKQpkZWYgcm10cmVlKGRpciwgaWdub3JlX2Vycm9ycz1GYWxzZSk6CiAgICBzaHV0aWwucm10cmVlKGRpciwgaWdub3JlX2Vycm9ycz1pZ25vcmVfZXJyb3JzLAogICAgICAgICAgICAgICAgICBvbmVycm9yPXJtdHJlZV9lcnJvcmhhbmRsZXIpCgoKZGVmIHJtdHJlZV9lcnJvcmhhbmRsZXIoZnVuYywgcGF0aCwgZXhjX2luZm8pOgogICAgIiIiT24gV2luZG93cywgdGhlIGZpbGVzIGluIC5zdm4gYXJlIHJlYWQtb25seSwgc28gd2hlbiBybXRyZWUoKSB0cmllcyB0bwogICAgcmVtb3ZlIHRoZW0sIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uICBXZSBjYXRjaCB0aGF0IGhlcmUsIHJlbW92ZSB0aGUKICAgIHJlYWQtb25seSBhdHRyaWJ1dGUsIGFuZCBob3BlZnVsbHkgY29udGludWUgd2l0aG91dCBwcm9ibGVtcy4iIiIKICAgICMgaWYgZmlsZSB0eXBlIGN1cnJlbnRseSByZWFkIG9ubHkKICAgIGlmIG9zLnN0YXQocGF0aCkuc3RfbW9kZSAmIHN0YXQuU19JUkVBRDoKICAgICAgICAjIGNvbnZlcnQgdG8gcmVhZC93cml0ZQogICAgICAgIG9zLmNobW9kKHBhdGgsIHN0YXQuU19JV1JJVEUpCiAgICAgICAgIyB1c2UgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIHRvIHJlcGVhdCB0aGUgb3BlcmF0aW9uCiAgICAgICAgZnVuYyhwYXRoKQogICAgICAgIHJldHVybgogICAgZWxzZToKICAgICAgICByYWlzZQoKCmRlZiBkaXNwbGF5X3BhdGgocGF0aCk6CiAgICAiIiJHaXZlcyB0aGUgZGlzcGxheSB2YWx1ZSBmb3IgYSBnaXZlbiBwYXRoLCBtYWtpbmcgaXQgcmVsYXRpdmUgdG8gY3dkCiAgICBpZiBwb3NzaWJsZS4iIiIKICAgIHBhdGggPSBvcy5wYXRoLm5vcm1jYXNlKG9zLnBhdGguYWJzcGF0aChwYXRoKSkKICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMjoKICAgICAgICBwYXRoID0gcGF0aC5kZWNvZGUoc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpLCAncmVwbGFjZScpCiAgICAgICAgcGF0aCA9IHBhdGguZW5jb2RlKHN5cy5nZXRkZWZhdWx0ZW5jb2RpbmcoKSwgJ3JlcGxhY2UnKQogICAgaWYgcGF0aC5zdGFydHN3aXRoKG9zLmdldGN3ZCgpICsgb3MucGF0aC5zZXApOgogICAgICAgIHBhdGggPSAnLicgKyBwYXRoW2xlbihvcy5nZXRjd2QoKSk6XQogICAgcmV0dXJuIHBhdGgKCgpkZWYgYmFja3VwX2RpcihkaXIsIGV4dD0nLmJhaycpOgogICAgIiIiRmlndXJlIG91dCB0aGUgbmFtZSBvZiBhIGRpcmVjdG9yeSB0byBiYWNrIHVwIHRoZSBnaXZlbiBkaXIgdG8KICAgIChhZGRpbmcgLmJhaywgLmJhazIsIGV0YykiIiIKICAgIG4gPSAxCiAgICBleHRlbnNpb24gPSBleHQKICAgIHdoaWxlIG9zLnBhdGguZXhpc3RzKGRpciArIGV4dGVuc2lvbik6CiAgICAgICAgbiArPSAxCiAgICAgICAgZXh0ZW5zaW9uID0gZXh0ICsgc3RyKG4pCiAgICByZXR1cm4gZGlyICsgZXh0ZW5zaW9uCgoKZGVmIGFza19wYXRoX2V4aXN0cyhtZXNzYWdlLCBvcHRpb25zKToKICAgIGZvciBhY3Rpb24gaW4gb3MuZW52aXJvbi5nZXQoJ1BJUF9FWElTVFNfQUNUSU9OJywgJycpLnNwbGl0KCk6CiAgICAgICAgaWYgYWN0aW9uIGluIG9wdGlvbnM6CiAgICAgICAgICAgIHJldHVybiBhY3Rpb24KICAgIHJldHVybiBhc2sobWVzc2FnZSwgb3B0aW9ucykKCgpkZWYgYXNrKG1lc3NhZ2UsIG9wdGlvbnMpOgogICAgIiIiQXNrIHRoZSBtZXNzYWdlIGludGVyYWN0aXZlbHksIHdpdGggdGhlIGdpdmVuIHBvc3NpYmxlIHJlc3BvbnNlcyIiIgogICAgd2hpbGUgMToKICAgICAgICBpZiBvcy5lbnZpcm9uLmdldCgnUElQX05PX0lOUFVUJyk6CiAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICdObyBpbnB1dCB3YXMgZXhwZWN0ZWQgKCRQSVBfTk9fSU5QVVQgc2V0KTsgcXVlc3Rpb246ICVzJyAlCiAgICAgICAgICAgICAgICBtZXNzYWdlCiAgICAgICAgICAgICkKICAgICAgICByZXNwb25zZSA9IGlucHV0KG1lc3NhZ2UpCiAgICAgICAgcmVzcG9uc2UgPSByZXNwb25zZS5zdHJpcCgpLmxvd2VyKCkKICAgICAgICBpZiByZXNwb25zZSBub3QgaW4gb3B0aW9uczoKICAgICAgICAgICAgcHJpbnQoCiAgICAgICAgICAgICAgICAnWW91ciByZXNwb25zZSAoJXIpIHdhcyBub3Qgb25lIG9mIHRoZSBleHBlY3RlZCByZXNwb25zZXM6ICcKICAgICAgICAgICAgICAgICclcycgJSAocmVzcG9uc2UsICcsICcuam9pbihvcHRpb25zKSkKICAgICAgICAgICAgKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiByZXNwb25zZQoKCmRlZiBmb3JtYXRfc2l6ZShieXRlcyk6CiAgICBpZiBieXRlcyA+IDEwMDAgKiAxMDAwOgogICAgICAgIHJldHVybiAnJS4xZk1CJyAlIChieXRlcyAvIDEwMDAuMCAvIDEwMDApCiAgICBlbGlmIGJ5dGVzID4gMTAgKiAxMDAwOgogICAgICAgIHJldHVybiAnJWlrQicgJSAoYnl0ZXMgLyAxMDAwKQogICAgZWxpZiBieXRlcyA+IDEwMDA6CiAgICAgICAgcmV0dXJuICclLjFma0InICUgKGJ5dGVzIC8gMTAwMC4wKQogICAgZWxzZToKICAgICAgICByZXR1cm4gJyVpYnl0ZXMnICUgYnl0ZXMKCgpkZWYgaXNfaW5zdGFsbGFibGVfZGlyKHBhdGgpOgogICAgIiIiUmV0dXJuIFRydWUgaWYgYHBhdGhgIGlzIGEgZGlyZWN0b3J5IGNvbnRhaW5pbmcgYSBzZXR1cC5weSBmaWxlLiIiIgogICAgaWYgbm90IG9zLnBhdGguaXNkaXIocGF0aCk6CiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICBzZXR1cF9weSA9IG9zLnBhdGguam9pbihwYXRoLCAnc2V0dXAucHknKQogICAgaWYgb3MucGF0aC5pc2ZpbGUoc2V0dXBfcHkpOgogICAgICAgIHJldHVybiBUcnVlCiAgICByZXR1cm4gRmFsc2UKCgpkZWYgaXNfc3ZuX3BhZ2UoaHRtbCk6CiAgICAiIiIKICAgIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGFnZSBhcHBlYXJzIHRvIGJlIHRoZSBpbmRleCBwYWdlIG9mIGFuIHN2biByZXBvc2l0b3J5CiAgICAiIiIKICAgIHJldHVybiAocmUuc2VhcmNoKHInPHRpdGxlPltePF0qUmV2aXNpb24gXGQrOicsIGh0bWwpIGFuZAogICAgICAgICAgICByZS5zZWFyY2gocidQb3dlcmVkIGJ5ICg/OjxhW14+XSo/Pik/U3VidmVyc2lvbicsIGh0bWwsIHJlLkkpKQoKCmRlZiBmaWxlX2NvbnRlbnRzKGZpbGVuYW1lKToKICAgIHdpdGggb3BlbihmaWxlbmFtZSwgJ3JiJykgYXMgZnA6CiAgICAgICAgcmV0dXJuIGZwLnJlYWQoKS5kZWNvZGUoJ3V0Zi04JykKCgpkZWYgcmVhZF9jaHVua3MoZmlsZSwgc2l6ZT1pby5ERUZBVUxUX0JVRkZFUl9TSVpFKToKICAgICIiIllpZWxkIHBpZWNlcyBvZiBkYXRhIGZyb20gYSBmaWxlLWxpa2Ugb2JqZWN0IHVudGlsIEVPRi4iIiIKICAgIHdoaWxlIFRydWU6CiAgICAgICAgY2h1bmsgPSBmaWxlLnJlYWQoc2l6ZSkKICAgICAgICBpZiBub3QgY2h1bms6CiAgICAgICAgICAgIGJyZWFrCiAgICAgICAgeWllbGQgY2h1bmsKCgpkZWYgc3BsaXRfbGVhZGluZ19kaXIocGF0aCk6CiAgICBwYXRoID0gcGF0aC5sc3RyaXAoJy8nKS5sc3RyaXAoJ1xcJykKICAgIGlmICcvJyBpbiBwYXRoIGFuZCAoKCdcXCcgaW4gcGF0aCBhbmQgcGF0aC5maW5kKCcvJykgPCBwYXRoLmZpbmQoJ1xcJykpIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICdcXCcgbm90IGluIHBhdGgpOgogICAgICAgIHJldHVybiBwYXRoLnNwbGl0KCcvJywgMSkKICAgIGVsaWYgJ1xcJyBpbiBwYXRoOgogICAgICAgIHJldHVybiBwYXRoLnNwbGl0KCdcXCcsIDEpCiAgICBlbHNlOgogICAgICAgIHJldHVybiBwYXRoLCAnJwoKCmRlZiBoYXNfbGVhZGluZ19kaXIocGF0aHMpOgogICAgIiIiUmV0dXJucyB0cnVlIGlmIGFsbCB0aGUgcGF0aHMgaGF2ZSB0aGUgc2FtZSBsZWFkaW5nIHBhdGggbmFtZQogICAgKGkuZS4sIGV2ZXJ5dGhpbmcgaXMgaW4gb25lIHN1YmRpcmVjdG9yeSBpbiBhbiBhcmNoaXZlKSIiIgogICAgY29tbW9uX3ByZWZpeCA9IE5vbmUKICAgIGZvciBwYXRoIGluIHBhdGhzOgogICAgICAgIHByZWZpeCwgcmVzdCA9IHNwbGl0X2xlYWRpbmdfZGlyKHBhdGgpCiAgICAgICAgaWYgbm90IHByZWZpeDoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgZWxpZiBjb21tb25fcHJlZml4IGlzIE5vbmU6CiAgICAgICAgICAgIGNvbW1vbl9wcmVmaXggPSBwcmVmaXgKICAgICAgICBlbGlmIHByZWZpeCAhPSBjb21tb25fcHJlZml4OgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgIHJldHVybiBUcnVlCgoKZGVmIG5vcm1hbGl6ZV9wYXRoKHBhdGgsIHJlc29sdmVfc3ltbGlua3M9VHJ1ZSk6CiAgICAiIiIKICAgIENvbnZlcnQgYSBwYXRoIHRvIGl0cyBjYW5vbmljYWwsIGNhc2Utbm9ybWFsaXplZCwgYWJzb2x1dGUgdmVyc2lvbi4KCiAgICAiIiIKICAgIHBhdGggPSBleHBhbmR1c2VyKHBhdGgpCiAgICBpZiByZXNvbHZlX3N5bWxpbmtzOgogICAgICAgIHBhdGggPSBvcy5wYXRoLnJlYWxwYXRoKHBhdGgpCiAgICBlbHNlOgogICAgICAgIHBhdGggPSBvcy5wYXRoLmFic3BhdGgocGF0aCkKICAgIHJldHVybiBvcy5wYXRoLm5vcm1jYXNlKHBhdGgpCgoKZGVmIHNwbGl0ZXh0KHBhdGgpOgogICAgIiIiTGlrZSBvcy5wYXRoLnNwbGl0ZXh0LCBidXQgdGFrZSBvZmYgLnRhciB0b28iIiIKICAgIGJhc2UsIGV4dCA9IHBvc2l4cGF0aC5zcGxpdGV4dChwYXRoKQogICAgaWYgYmFzZS5sb3dlcigpLmVuZHN3aXRoKCcudGFyJyk6CiAgICAgICAgZXh0ID0gYmFzZVstNDpdICsgZXh0CiAgICAgICAgYmFzZSA9IGJhc2VbOi00XQogICAgcmV0dXJuIGJhc2UsIGV4dAoKCmRlZiByZW5hbWVzKG9sZCwgbmV3KToKICAgICIiIkxpa2Ugb3MucmVuYW1lcygpLCBidXQgaGFuZGxlcyByZW5hbWluZyBhY3Jvc3MgZGV2aWNlcy4iIiIKICAgICMgSW1wbGVtZW50YXRpb24gYm9ycm93ZWQgZnJvbSBvcy5yZW5hbWVzKCkuCiAgICBoZWFkLCB0YWlsID0gb3MucGF0aC5zcGxpdChuZXcpCiAgICBpZiBoZWFkIGFuZCB0YWlsIGFuZCBub3Qgb3MucGF0aC5leGlzdHMoaGVhZCk6CiAgICAgICAgb3MubWFrZWRpcnMoaGVhZCkKCiAgICBzaHV0aWwubW92ZShvbGQsIG5ldykKCiAgICBoZWFkLCB0YWlsID0gb3MucGF0aC5zcGxpdChvbGQpCiAgICBpZiBoZWFkIGFuZCB0YWlsOgogICAgICAgIHRyeToKICAgICAgICAgICAgb3MucmVtb3ZlZGlycyhoZWFkKQogICAgICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgICAgICBwYXNzCgoKZGVmIGlzX2xvY2FsKHBhdGgpOgogICAgIiIiCiAgICBSZXR1cm4gVHJ1ZSBpZiBwYXRoIGlzIHdpdGhpbiBzeXMucHJlZml4LCBpZiB3ZSdyZSBydW5uaW5nIGluIGEgdmlydHVhbGVudi4KCiAgICBJZiB3ZSdyZSBub3QgaW4gYSB2aXJ0dWFsZW52LCBhbGwgcGF0aHMgYXJlIGNvbnNpZGVyZWQgImxvY2FsLiIKCiAgICAiIiIKICAgIGlmIG5vdCBydW5uaW5nX3VuZGVyX3ZpcnR1YWxlbnYoKToKICAgICAgICByZXR1cm4gVHJ1ZQogICAgcmV0dXJuIG5vcm1hbGl6ZV9wYXRoKHBhdGgpLnN0YXJ0c3dpdGgobm9ybWFsaXplX3BhdGgoc3lzLnByZWZpeCkpCgoKZGVmIGRpc3RfaXNfbG9jYWwoZGlzdCk6CiAgICAiIiIKICAgIFJldHVybiBUcnVlIGlmIGdpdmVuIERpc3RyaWJ1dGlvbiBvYmplY3QgaXMgaW5zdGFsbGVkIGxvY2FsbHkKICAgIChpLmUuIHdpdGhpbiBjdXJyZW50IHZpcnR1YWxlbnYpLgoKICAgIEFsd2F5cyBUcnVlIGlmIHdlJ3JlIG5vdCBpbiBhIHZpcnR1YWxlbnYuCgogICAgIiIiCiAgICByZXR1cm4gaXNfbG9jYWwoZGlzdF9sb2NhdGlvbihkaXN0KSkKCgpkZWYgZGlzdF9pbl91c2Vyc2l0ZShkaXN0KToKICAgICIiIgogICAgUmV0dXJuIFRydWUgaWYgZ2l2ZW4gRGlzdHJpYnV0aW9uIGlzIGluc3RhbGxlZCBpbiB1c2VyIHNpdGUuCiAgICAiIiIKICAgIG5vcm1fcGF0aCA9IG5vcm1hbGl6ZV9wYXRoKGRpc3RfbG9jYXRpb24oZGlzdCkpCiAgICByZXR1cm4gbm9ybV9wYXRoLnN0YXJ0c3dpdGgobm9ybWFsaXplX3BhdGgodXNlcl9zaXRlKSkKCgpkZWYgZGlzdF9pbl9zaXRlX3BhY2thZ2VzKGRpc3QpOgogICAgIiIiCiAgICBSZXR1cm4gVHJ1ZSBpZiBnaXZlbiBEaXN0cmlidXRpb24gaXMgaW5zdGFsbGVkIGluCiAgICBkaXN0dXRpbHMuc3lzY29uZmlnLmdldF9weXRob25fbGliKCkuCiAgICAiIiIKICAgIHJldHVybiBub3JtYWxpemVfcGF0aCgKICAgICAgICBkaXN0X2xvY2F0aW9uKGRpc3QpCiAgICApLnN0YXJ0c3dpdGgobm9ybWFsaXplX3BhdGgoc2l0ZV9wYWNrYWdlcykpCgoKZGVmIGRpc3RfaXNfZWRpdGFibGUoZGlzdCk6CiAgICAiIiJJcyBkaXN0cmlidXRpb24gYW4gZWRpdGFibGUgaW5zdGFsbD8iIiIKICAgIGZvciBwYXRoX2l0ZW0gaW4gc3lzLnBhdGg6CiAgICAgICAgZWdnX2xpbmsgPSBvcy5wYXRoLmpvaW4ocGF0aF9pdGVtLCBkaXN0LnByb2plY3RfbmFtZSArICcuZWdnLWxpbmsnKQogICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGVnZ19saW5rKToKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgIHJldHVybiBGYWxzZQoKCmRlZiBnZXRfaW5zdGFsbGVkX2Rpc3RyaWJ1dGlvbnMobG9jYWxfb25seT1UcnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXA9c3RkbGliX3BrZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZV9lZGl0YWJsZXM9VHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGl0YWJsZXNfb25seT1GYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyX29ubHk9RmFsc2UpOgogICAgIiIiCiAgICBSZXR1cm4gYSBsaXN0IG9mIGluc3RhbGxlZCBEaXN0cmlidXRpb24gb2JqZWN0cy4KCiAgICBJZiBgYGxvY2FsX29ubHlgYCBpcyBUcnVlIChkZWZhdWx0KSwgb25seSByZXR1cm4gaW5zdGFsbGF0aW9ucwogICAgbG9jYWwgdG8gdGhlIGN1cnJlbnQgdmlydHVhbGVudiwgaWYgaW4gYSB2aXJ0dWFsZW52LgoKICAgIGBgc2tpcGBgIGFyZ3VtZW50IGlzIGFuIGl0ZXJhYmxlIG9mIGxvd2VyLWNhc2UgcHJvamVjdCBuYW1lcyB0bwogICAgaWdub3JlOyBkZWZhdWx0cyB0byBzdGRsaWJfcGtncwoKICAgIElmIGBgZWRpdGFibGVzYGAgaXMgRmFsc2UsIGRvbid0IHJlcG9ydCBlZGl0YWJsZXMuCgogICAgSWYgYGBlZGl0YWJsZXNfb25seWBgIGlzIFRydWUgLCBvbmx5IHJlcG9ydCBlZGl0YWJsZXMuCgogICAgSWYgYGB1c2VyX29ubHlgYCBpcyBUcnVlICwgb25seSByZXBvcnQgaW5zdGFsbGF0aW9ucyBpbiB0aGUgdXNlcgogICAgc2l0ZSBkaXJlY3RvcnkuCgogICAgIiIiCiAgICBpZiBsb2NhbF9vbmx5OgogICAgICAgIGxvY2FsX3Rlc3QgPSBkaXN0X2lzX2xvY2FsCiAgICBlbHNlOgogICAgICAgIGRlZiBsb2NhbF90ZXN0KGQpOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGlmIGluY2x1ZGVfZWRpdGFibGVzOgogICAgICAgIGRlZiBlZGl0YWJsZV90ZXN0KGQpOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgZWxzZToKICAgICAgICBkZWYgZWRpdGFibGVfdGVzdChkKToKICAgICAgICAgICAgcmV0dXJuIG5vdCBkaXN0X2lzX2VkaXRhYmxlKGQpCgogICAgaWYgZWRpdGFibGVzX29ubHk6CiAgICAgICAgZGVmIGVkaXRhYmxlc19vbmx5X3Rlc3QoZCk6CiAgICAgICAgICAgIHJldHVybiBkaXN0X2lzX2VkaXRhYmxlKGQpCiAgICBlbHNlOgogICAgICAgIGRlZiBlZGl0YWJsZXNfb25seV90ZXN0KGQpOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGlmIHVzZXJfb25seToKICAgICAgICB1c2VyX3Rlc3QgPSBkaXN0X2luX3VzZXJzaXRlCiAgICBlbHNlOgogICAgICAgIGRlZiB1c2VyX3Rlc3QoZCk6CiAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgcmV0dXJuIFtkIGZvciBkIGluIHBrZ19yZXNvdXJjZXMud29ya2luZ19zZXQKICAgICAgICAgICAgaWYgbG9jYWxfdGVzdChkKSBhbmQKICAgICAgICAgICAgZC5rZXkgbm90IGluIHNraXAgYW5kCiAgICAgICAgICAgIGVkaXRhYmxlX3Rlc3QoZCkgYW5kCiAgICAgICAgICAgIGVkaXRhYmxlc19vbmx5X3Rlc3QoZCkgYW5kCiAgICAgICAgICAgIHVzZXJfdGVzdChkKQogICAgICAgICAgICBdCgoKZGVmIGVnZ19saW5rX3BhdGgoZGlzdCk6CiAgICAiIiIKICAgIFJldHVybiB0aGUgcGF0aCBmb3IgdGhlIC5lZ2ctbGluayBmaWxlIGlmIGl0IGV4aXN0cywgb3RoZXJ3aXNlLCBOb25lLgoKICAgIFRoZXJlJ3MgMyBzY2VuYXJpb3M6CiAgICAxKSBub3QgaW4gYSB2aXJ0dWFsZW52CiAgICAgICB0cnkgdG8gZmluZCBpbiBzaXRlLlVTRVJfU0lURSwgdGhlbiBzaXRlX3BhY2thZ2VzCiAgICAyKSBpbiBhIG5vLWdsb2JhbCB2aXJ0dWFsZW52CiAgICAgICB0cnkgdG8gZmluZCBpbiBzaXRlX3BhY2thZ2VzCiAgICAzKSBpbiBhIHllcy1nbG9iYWwgdmlydHVhbGVudgogICAgICAgdHJ5IHRvIGZpbmQgaW4gc2l0ZV9wYWNrYWdlcywgdGhlbiBzaXRlLlVTRVJfU0lURQogICAgICAgKGRvbid0IGxvb2sgaW4gZ2xvYmFsIGxvY2F0aW9uKQoKICAgIEZvciAjMSBhbmQgIzMsIHRoZXJlIGNvdWxkIGJlIG9kZCBjYXNlcywgd2hlcmUgdGhlcmUncyBhbiBlZ2ctbGluayBpbiAyCiAgICBsb2NhdGlvbnMuCgogICAgVGhpcyBtZXRob2Qgd2lsbCBqdXN0IHJldHVybiB0aGUgZmlyc3Qgb25lIGZvdW5kLgogICAgIiIiCiAgICBzaXRlcyA9IFtdCiAgICBpZiBydW5uaW5nX3VuZGVyX3ZpcnR1YWxlbnYoKToKICAgICAgICBpZiB2aXJ0dWFsZW52X25vX2dsb2JhbCgpOgogICAgICAgICAgICBzaXRlcy5hcHBlbmQoc2l0ZV9wYWNrYWdlcykKICAgICAgICBlbHNlOgogICAgICAgICAgICBzaXRlcy5hcHBlbmQoc2l0ZV9wYWNrYWdlcykKICAgICAgICAgICAgaWYgdXNlcl9zaXRlOgogICAgICAgICAgICAgICAgc2l0ZXMuYXBwZW5kKHVzZXJfc2l0ZSkKICAgIGVsc2U6CiAgICAgICAgaWYgdXNlcl9zaXRlOgogICAgICAgICAgICBzaXRlcy5hcHBlbmQodXNlcl9zaXRlKQogICAgICAgIHNpdGVzLmFwcGVuZChzaXRlX3BhY2thZ2VzKQoKICAgIGZvciBzaXRlIGluIHNpdGVzOgogICAgICAgIGVnZ2xpbmsgPSBvcy5wYXRoLmpvaW4oc2l0ZSwgZGlzdC5wcm9qZWN0X25hbWUpICsgJy5lZ2ctbGluaycKICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShlZ2dsaW5rKToKICAgICAgICAgICAgcmV0dXJuIGVnZ2xpbmsKCgpkZWYgZGlzdF9sb2NhdGlvbihkaXN0KToKICAgICIiIgogICAgR2V0IHRoZSBzaXRlLXBhY2thZ2VzIGxvY2F0aW9uIG9mIHRoaXMgZGlzdHJpYnV0aW9uLiBHZW5lcmFsbHkKICAgIHRoaXMgaXMgZGlzdC5sb2NhdGlvbiwgZXhjZXB0IGluIHRoZSBjYXNlIG9mIGRldmVsb3AtaW5zdGFsbGVkCiAgICBwYWNrYWdlcywgd2hlcmUgZGlzdC5sb2NhdGlvbiBpcyB0aGUgc291cmNlIGNvZGUgbG9jYXRpb24sIGFuZCB3ZQogICAgd2FudCB0byBrbm93IHdoZXJlIHRoZSBlZ2ctbGluayBmaWxlIGlzLgoKICAgICIiIgogICAgZWdnX2xpbmsgPSBlZ2dfbGlua19wYXRoKGRpc3QpCiAgICBpZiBlZ2dfbGluazoKICAgICAgICByZXR1cm4gZWdnX2xpbmsKICAgIHJldHVybiBkaXN0LmxvY2F0aW9uCgoKZGVmIGdldF90ZXJtaW5hbF9zaXplKCk6CiAgICAiIiJSZXR1cm5zIGEgdHVwbGUgKHgsIHkpIHJlcHJlc2VudGluZyB0aGUgd2lkdGgoeCkgYW5kIHRoZSBoZWlnaHQoeCkKICAgIGluIGNoYXJhY3RlcnMgb2YgdGhlIHRlcm1pbmFsIHdpbmRvdy4iIiIKICAgIGRlZiBpb2N0bF9HV0lOU1ooZmQpOgogICAgICAgIHRyeToKICAgICAgICAgICAgaW1wb3J0IGZjbnRsCiAgICAgICAgICAgIGltcG9ydCB0ZXJtaW9zCiAgICAgICAgICAgIGltcG9ydCBzdHJ1Y3QKICAgICAgICAgICAgY3IgPSBzdHJ1Y3QudW5wYWNrKAogICAgICAgICAgICAgICAgJ2hoJywKICAgICAgICAgICAgICAgIGZjbnRsLmlvY3RsKGZkLCB0ZXJtaW9zLlRJT0NHV0lOU1osICcxMjM0JykKICAgICAgICAgICAgKQogICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICBpZiBjciA9PSAoMCwgMCk6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcmV0dXJuIGNyCiAgICBjciA9IGlvY3RsX0dXSU5TWigwKSBvciBpb2N0bF9HV0lOU1ooMSkgb3IgaW9jdGxfR1dJTlNaKDIpCiAgICBpZiBub3QgY3I6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBmZCA9IG9zLm9wZW4ob3MuY3Rlcm1pZCgpLCBvcy5PX1JET05MWSkKICAgICAgICAgICAgY3IgPSBpb2N0bF9HV0lOU1ooZmQpCiAgICAgICAgICAgIG9zLmNsb3NlKGZkKQogICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgcGFzcwogICAgaWYgbm90IGNyOgogICAgICAgIGNyID0gKG9zLmVudmlyb24uZ2V0KCdMSU5FUycsIDI1KSwgb3MuZW52aXJvbi5nZXQoJ0NPTFVNTlMnLCA4MCkpCiAgICByZXR1cm4gaW50KGNyWzFdKSwgaW50KGNyWzBdKQoKCmRlZiBjdXJyZW50X3VtYXNrKCk6CiAgICAiIiJHZXQgdGhlIGN1cnJlbnQgdW1hc2sgd2hpY2ggaW52b2x2ZXMgaGF2aW5nIHRvIHNldCBpdCB0ZW1wb3JhcmlseS4iIiIKICAgIG1hc2sgPSBvcy51bWFzaygwKQogICAgb3MudW1hc2sobWFzaykKICAgIHJldHVybiBtYXNrCgoKZGVmIHVuemlwX2ZpbGUoZmlsZW5hbWUsIGxvY2F0aW9uLCBmbGF0dGVuPVRydWUpOgogICAgIiIiCiAgICBVbnppcCB0aGUgZmlsZSAod2l0aCBwYXRoIGBmaWxlbmFtZWApIHRvIHRoZSBkZXN0aW5hdGlvbiBgbG9jYXRpb25gLiAgQWxsCiAgICBmaWxlcyBhcmUgd3JpdHRlbiBiYXNlZCBvbiBzeXN0ZW0gZGVmYXVsdHMgYW5kIHVtYXNrIChpLmUuIHBlcm1pc3Npb25zIGFyZQogICAgbm90IHByZXNlcnZlZCksIGV4Y2VwdCB0aGF0IHJlZ3VsYXIgZmlsZSBtZW1iZXJzIHdpdGggYW55IGV4ZWN1dGUKICAgIHBlcm1pc3Npb25zICh1c2VyLCBncm91cCwgb3Igd29ybGQpIGhhdmUgImNobW9kICt4IiBhcHBsaWVkIGFmdGVyIGJlaW5nCiAgICB3cml0dGVuLiBOb3RlIHRoYXQgZm9yIHdpbmRvd3MsIGFueSBleGVjdXRlIGNoYW5nZXMgdXNpbmcgb3MuY2htb2QgYXJlCiAgICBuby1vcHMgcGVyIHRoZSBweXRob24gZG9jcy4KICAgICIiIgogICAgZW5zdXJlX2Rpcihsb2NhdGlvbikKICAgIHppcGZwID0gb3BlbihmaWxlbmFtZSwgJ3JiJykKICAgIHRyeToKICAgICAgICB6aXAgPSB6aXBmaWxlLlppcEZpbGUoemlwZnAsIGFsbG93WmlwNjQ9VHJ1ZSkKICAgICAgICBsZWFkaW5nID0gaGFzX2xlYWRpbmdfZGlyKHppcC5uYW1lbGlzdCgpKSBhbmQgZmxhdHRlbgogICAgICAgIGZvciBpbmZvIGluIHppcC5pbmZvbGlzdCgpOgogICAgICAgICAgICBuYW1lID0gaW5mby5maWxlbmFtZQogICAgICAgICAgICBkYXRhID0gemlwLnJlYWQobmFtZSkKICAgICAgICAgICAgZm4gPSBuYW1lCiAgICAgICAgICAgIGlmIGxlYWRpbmc6CiAgICAgICAgICAgICAgICBmbiA9IHNwbGl0X2xlYWRpbmdfZGlyKG5hbWUpWzFdCiAgICAgICAgICAgIGZuID0gb3MucGF0aC5qb2luKGxvY2F0aW9uLCBmbikKICAgICAgICAgICAgZGlyID0gb3MucGF0aC5kaXJuYW1lKGZuKQogICAgICAgICAgICBpZiBmbi5lbmRzd2l0aCgnLycpIG9yIGZuLmVuZHN3aXRoKCdcXCcpOgogICAgICAgICAgICAgICAgIyBBIGRpcmVjdG9yeQogICAgICAgICAgICAgICAgZW5zdXJlX2RpcihmbikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGVuc3VyZV9kaXIoZGlyKQogICAgICAgICAgICAgICAgZnAgPSBvcGVuKGZuLCAnd2InKQogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGZwLndyaXRlKGRhdGEpCiAgICAgICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgICAgIGZwLmNsb3NlKCkKICAgICAgICAgICAgICAgICAgICBtb2RlID0gaW5mby5leHRlcm5hbF9hdHRyID4+IDE2CiAgICAgICAgICAgICAgICAgICAgIyBpZiBtb2RlIGFuZCByZWd1bGFyIGZpbGUgYW5kIGFueSBleGVjdXRlIHBlcm1pc3Npb25zIGZvcgogICAgICAgICAgICAgICAgICAgICMgdXNlci9ncm91cC93b3JsZD8KICAgICAgICAgICAgICAgICAgICBpZiBtb2RlIGFuZCBzdGF0LlNfSVNSRUcobW9kZSkgYW5kIG1vZGUgJiAwbzExMToKICAgICAgICAgICAgICAgICAgICAgICAgIyBtYWtlIGRlc3QgZmlsZSBoYXZlIGV4ZWN1dGUgZm9yIHVzZXIvZ3JvdXAvd29ybGQKICAgICAgICAgICAgICAgICAgICAgICAgIyAoY2htb2QgK3gpIG5vLW9wIG9uIHdpbmRvd3MgcGVyIHB5dGhvbiBkb2NzCiAgICAgICAgICAgICAgICAgICAgICAgIG9zLmNobW9kKGZuLCAoMG83NzcgLSBjdXJyZW50X3VtYXNrKCkgfCAwbzExMSkpCiAgICBmaW5hbGx5OgogICAgICAgIHppcGZwLmNsb3NlKCkKCgpkZWYgdW50YXJfZmlsZShmaWxlbmFtZSwgbG9jYXRpb24pOgogICAgIiIiCiAgICBVbnRhciB0aGUgZmlsZSAod2l0aCBwYXRoIGBmaWxlbmFtZWApIHRvIHRoZSBkZXN0aW5hdGlvbiBgbG9jYXRpb25gLgogICAgQWxsIGZpbGVzIGFyZSB3cml0dGVuIGJhc2VkIG9uIHN5c3RlbSBkZWZhdWx0cyBhbmQgdW1hc2sgKGkuZS4gcGVybWlzc2lvbnMKICAgIGFyZSBub3QgcHJlc2VydmVkKSwgZXhjZXB0IHRoYXQgcmVndWxhciBmaWxlIG1lbWJlcnMgd2l0aCBhbnkgZXhlY3V0ZQogICAgcGVybWlzc2lvbnMgKHVzZXIsIGdyb3VwLCBvciB3b3JsZCkgaGF2ZSAiY2htb2QgK3giIGFwcGxpZWQgYWZ0ZXIgYmVpbmcKICAgIHdyaXR0ZW4uICBOb3RlIHRoYXQgZm9yIHdpbmRvd3MsIGFueSBleGVjdXRlIGNoYW5nZXMgdXNpbmcgb3MuY2htb2QgYXJlCiAgICBuby1vcHMgcGVyIHRoZSBweXRob24gZG9jcy4KICAgICIiIgogICAgZW5zdXJlX2Rpcihsb2NhdGlvbikKICAgIGlmIGZpbGVuYW1lLmxvd2VyKCkuZW5kc3dpdGgoJy5neicpIG9yIGZpbGVuYW1lLmxvd2VyKCkuZW5kc3dpdGgoJy50Z3onKToKICAgICAgICBtb2RlID0gJ3I6Z3onCiAgICBlbGlmIGZpbGVuYW1lLmxvd2VyKCkuZW5kc3dpdGgoQloyX0VYVEVOU0lPTlMpOgogICAgICAgIG1vZGUgPSAncjpiejInCiAgICBlbGlmIGZpbGVuYW1lLmxvd2VyKCkuZW5kc3dpdGgoWFpfRVhURU5TSU9OUyk6CiAgICAgICAgbW9kZSA9ICdyOnh6JwogICAgZWxpZiBmaWxlbmFtZS5sb3dlcigpLmVuZHN3aXRoKCcudGFyJyk6CiAgICAgICAgbW9kZSA9ICdyJwogICAgZWxzZToKICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgJ0Nhbm5vdCBkZXRlcm1pbmUgY29tcHJlc3Npb24gdHlwZSBmb3IgZmlsZSAlcycsIGZpbGVuYW1lLAogICAgICAgICkKICAgICAgICBtb2RlID0gJ3I6KicKICAgIHRhciA9IHRhcmZpbGUub3BlbihmaWxlbmFtZSwgbW9kZSkKICAgIHRyeToKICAgICAgICAjIG5vdGU6IHB5dGhvbjw9Mi41IGRvZXNuJ3Qgc2VlbSB0byBrbm93IGFib3V0IHBheCBoZWFkZXJzLCBmaWx0ZXIgdGhlbQogICAgICAgIGxlYWRpbmcgPSBoYXNfbGVhZGluZ19kaXIoWwogICAgICAgICAgICBtZW1iZXIubmFtZSBmb3IgbWVtYmVyIGluIHRhci5nZXRtZW1iZXJzKCkKICAgICAgICAgICAgaWYgbWVtYmVyLm5hbWUgIT0gJ3BheF9nbG9iYWxfaGVhZGVyJwogICAgICAgIF0pCiAgICAgICAgZm9yIG1lbWJlciBpbiB0YXIuZ2V0bWVtYmVycygpOgogICAgICAgICAgICBmbiA9IG1lbWJlci5uYW1lCiAgICAgICAgICAgIGlmIGZuID09ICdwYXhfZ2xvYmFsX2hlYWRlcic6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBsZWFkaW5nOgogICAgICAgICAgICAgICAgZm4gPSBzcGxpdF9sZWFkaW5nX2RpcihmbilbMV0KICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihsb2NhdGlvbiwgZm4pCiAgICAgICAgICAgIGlmIG1lbWJlci5pc2RpcigpOgogICAgICAgICAgICAgICAgZW5zdXJlX2RpcihwYXRoKQogICAgICAgICAgICBlbGlmIG1lbWJlci5pc3N5bSgpOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHRhci5fZXh0cmFjdF9tZW1iZXIobWVtYmVyLCBwYXRoKQogICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGM6CiAgICAgICAgICAgICAgICAgICAgIyBTb21lIGNvcnJ1cHQgdGFyIGZpbGVzIHNlZW0gdG8gcHJvZHVjZSB0aGlzCiAgICAgICAgICAgICAgICAgICAgIyAoc3BlY2lmaWNhbGx5IGJhZCBzeW1saW5rcykKICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICAgICAgICAgJ0luIHRoZSB0YXIgZmlsZSAlcyB0aGUgbWVtYmVyICVzIGlzIGludmFsaWQ6ICVzJywKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUsIG1lbWJlci5uYW1lLCBleGMsCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgZnAgPSB0YXIuZXh0cmFjdGZpbGUobWVtYmVyKQogICAgICAgICAgICAgICAgZXhjZXB0IChLZXlFcnJvciwgQXR0cmlidXRlRXJyb3IpIGFzIGV4YzoKICAgICAgICAgICAgICAgICAgICAjIFNvbWUgY29ycnVwdCB0YXIgZmlsZXMgc2VlbSB0byBwcm9kdWNlIHRoaXMKICAgICAgICAgICAgICAgICAgICAjIChzcGVjaWZpY2FsbHkgYmFkIHN5bWxpbmtzKQogICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAnSW4gdGhlIHRhciBmaWxlICVzIHRoZSBtZW1iZXIgJXMgaXMgaW52YWxpZDogJXMnLAogICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwgbWVtYmVyLm5hbWUsIGV4YywKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIGVuc3VyZV9kaXIob3MucGF0aC5kaXJuYW1lKHBhdGgpKQogICAgICAgICAgICAgICAgd2l0aCBvcGVuKHBhdGgsICd3YicpIGFzIGRlc3RmcDoKICAgICAgICAgICAgICAgICAgICBzaHV0aWwuY29weWZpbGVvYmooZnAsIGRlc3RmcCkKICAgICAgICAgICAgICAgIGZwLmNsb3NlKCkKICAgICAgICAgICAgICAgICMgVXBkYXRlIHRoZSB0aW1lc3RhbXAgKHVzZWZ1bCBmb3IgY3l0aG9uIGNvbXBpbGVkIGZpbGVzKQogICAgICAgICAgICAgICAgdGFyLnV0aW1lKG1lbWJlciwgcGF0aCkKICAgICAgICAgICAgICAgICMgbWVtYmVyIGhhdmUgYW55IGV4ZWN1dGUgcGVybWlzc2lvbnMgZm9yIHVzZXIvZ3JvdXAvd29ybGQ/CiAgICAgICAgICAgICAgICBpZiBtZW1iZXIubW9kZSAmIDBvMTExOgogICAgICAgICAgICAgICAgICAgICMgbWFrZSBkZXN0IGZpbGUgaGF2ZSBleGVjdXRlIGZvciB1c2VyL2dyb3VwL3dvcmxkCiAgICAgICAgICAgICAgICAgICAgIyBuby1vcCBvbiB3aW5kb3dzIHBlciBweXRob24gZG9jcwogICAgICAgICAgICAgICAgICAgIG9zLmNobW9kKHBhdGgsICgwbzc3NyAtIGN1cnJlbnRfdW1hc2soKSB8IDBvMTExKSkKICAgIGZpbmFsbHk6CiAgICAgICAgdGFyLmNsb3NlKCkKCgpkZWYgdW5wYWNrX2ZpbGUoZmlsZW5hbWUsIGxvY2F0aW9uLCBjb250ZW50X3R5cGUsIGxpbmspOgogICAgZmlsZW5hbWUgPSBvcy5wYXRoLnJlYWxwYXRoKGZpbGVuYW1lKQogICAgaWYgKGNvbnRlbnRfdHlwZSA9PSAnYXBwbGljYXRpb24vemlwJyBvcgogICAgICAgICAgICBmaWxlbmFtZS5sb3dlcigpLmVuZHN3aXRoKFpJUF9FWFRFTlNJT05TKSBvcgogICAgICAgICAgICB6aXBmaWxlLmlzX3ppcGZpbGUoZmlsZW5hbWUpKToKICAgICAgICB1bnppcF9maWxlKAogICAgICAgICAgICBmaWxlbmFtZSwKICAgICAgICAgICAgbG9jYXRpb24sCiAgICAgICAgICAgIGZsYXR0ZW49bm90IGZpbGVuYW1lLmVuZHN3aXRoKCcud2hsJykKICAgICAgICApCiAgICBlbGlmIChjb250ZW50X3R5cGUgPT0gJ2FwcGxpY2F0aW9uL3gtZ3ppcCcgb3IKICAgICAgICAgICAgdGFyZmlsZS5pc190YXJmaWxlKGZpbGVuYW1lKSBvcgogICAgICAgICAgICBmaWxlbmFtZS5sb3dlcigpLmVuZHN3aXRoKAogICAgICAgICAgICAgICAgVEFSX0VYVEVOU0lPTlMgKyBCWjJfRVhURU5TSU9OUyArIFhaX0VYVEVOU0lPTlMpKToKICAgICAgICB1bnRhcl9maWxlKGZpbGVuYW1lLCBsb2NhdGlvbikKICAgIGVsaWYgKGNvbnRlbnRfdHlwZSBhbmQgY29udGVudF90eXBlLnN0YXJ0c3dpdGgoJ3RleHQvaHRtbCcpIGFuZAogICAgICAgICAgICBpc19zdm5fcGFnZShmaWxlX2NvbnRlbnRzKGZpbGVuYW1lKSkpOgogICAgICAgICMgV2UgZG9uJ3QgcmVhbGx5IGNhcmUgYWJvdXQgdGhpcwogICAgICAgIGZyb20gcGlwLnZjcy5zdWJ2ZXJzaW9uIGltcG9ydCBTdWJ2ZXJzaW9uCiAgICAgICAgU3VidmVyc2lvbignc3ZuKycgKyBsaW5rLnVybCkudW5wYWNrKGxvY2F0aW9uKQogICAgZWxzZToKICAgICAgICAjIEZJWE1FOiBoYW5kbGU/CiAgICAgICAgIyBGSVhNRTogbWFnaWMgc2lnbmF0dXJlcz8KICAgICAgICBsb2dnZXIuY3JpdGljYWwoCiAgICAgICAgICAgICdDYW5ub3QgdW5wYWNrIGZpbGUgJXMgKGRvd25sb2FkZWQgZnJvbSAlcywgY29udGVudC10eXBlOiAlcyk7ICcKICAgICAgICAgICAgJ2Nhbm5vdCBkZXRlY3QgYXJjaGl2ZSBmb3JtYXQnLAogICAgICAgICAgICBmaWxlbmFtZSwgbG9jYXRpb24sIGNvbnRlbnRfdHlwZSwKICAgICAgICApCiAgICAgICAgcmFpc2UgSW5zdGFsbGF0aW9uRXJyb3IoCiAgICAgICAgICAgICdDYW5ub3QgZGV0ZXJtaW5lIGFyY2hpdmUgZm9ybWF0IG9mICVzJyAlIGxvY2F0aW9uCiAgICAgICAgKQoKCmRlZiBjYWxsX3N1YnByb2Nlc3MoY21kLCBzaG93X3N0ZG91dD1UcnVlLCBjd2Q9Tm9uZSwKICAgICAgICAgICAgICAgICAgICBvbl9yZXR1cm5jb2RlPSdyYWlzZScsCiAgICAgICAgICAgICAgICAgICAgY29tbWFuZF9kZXNjPU5vbmUsCiAgICAgICAgICAgICAgICAgICAgZXh0cmFfZW52aXJvbj1Ob25lLCBzcGlubmVyPU5vbmUpOgogICAgIyBUaGlzIGZ1bmN0aW9uJ3MgaGFuZGxpbmcgb2Ygc3VicHJvY2VzcyBvdXRwdXQgaXMgY29uZnVzaW5nIGFuZCBJCiAgICAjIHByZXZpb3VzbHkgYnJva2UgaXQgdGVycmlibHksIHNvIGFzIHBlbmFuY2UgSSB3aWxsIHdyaXRlIGEgbG9uZyBjb21tZW50CiAgICAjIGV4cGxhaW5pbmcgdGhpbmdzLgogICAgIwogICAgIyBUaGUgb2J2aW91cyB0aGluZyB0aGF0IGFmZmVjdHMgb3V0cHV0IGlzIHRoZSBzaG93X3N0ZG91dD0KICAgICMga3dhcmcuIHNob3dfc3Rkb3V0PVRydWUgbWVhbnMsIGxldCB0aGUgc3VicHJvY2VzcyB3cml0ZSBkaXJlY3RseSB0byBvdXIKICAgICMgc3Rkb3V0LiBFdmVuIHRob3VnaCBpdCBpcyBub21pbmFsbHkgdGhlIGRlZmF1bHQsIGl0IGlzIGFsbW9zdCBuZXZlciB1c2VkCiAgICAjIGluc2lkZSBwaXAgKGFuZCBzaG91bGQgbm90IGJlIHVzZWQgaW4gbmV3IGNvZGUgd2l0aG91dCBhIHZlcnkgZ29vZAogICAgIyByZWFzb24pOyBhcyBvZiAyMDE2LTAyLTIyIGl0IGlzIG9ubHkgdXNlZCBpbiBhIGZldyBwbGFjZXMgaW5zaWRlIHRoZSBWQ1MKICAgICMgd3JhcHBlciBjb2RlLiBJZGVhbGx5IHdlIHNob3VsZCBnZXQgcmlkIG9mIGl0IGVudGlyZWx5LCBiZWNhdXNlIGl0CiAgICAjIGNyZWF0ZXMgYSBsb3Qgb2YgY29tcGxleGl0eSBoZXJlIGZvciBhIHJhcmVseSB1c2VkIGZlYXR1cmUuCiAgICAjCiAgICAjIE1vc3QgcGxhY2VzIGluIHBpcCBzZXQgc2hvd19zdGRvdXQ9RmFsc2UuIFdoYXQgdGhpcyBtZWFucyBpczoKICAgICMgLSBXZSBjb25uZWN0IHRoZSBjaGlsZCBzdGRvdXQgdG8gYSBwaXBlLCB3aGljaCB3ZSByZWFkLgogICAgIyAtIEJ5IGRlZmF1bHQsIHdlIGhpZGUgdGhlIG91dHB1dCBidXQgc2hvdyBhIHNwaW5uZXIgLS0gdW5sZXNzIHRoZQogICAgIyAgIHN1YnByb2Nlc3MgZXhpdHMgd2l0aCBhbiBlcnJvciwgaW4gd2hpY2ggY2FzZSB3ZSBzaG93IHRoZSBvdXRwdXQuCiAgICAjIC0gSWYgdGhlIC0tdmVyYm9zZSBvcHRpb24gd2FzIHBhc3NlZCAoPSBsb2dsZXZlbCBpcyBERUJVRyksIHRoZW4gd2Ugc2hvdwogICAgIyAgIHRoZSBvdXRwdXQgdW5jb25kaXRpb25hbGx5LiAoQnV0IGluIHRoaXMgY2FzZSB3ZSBkb24ndCB3YW50IHRvIHNob3cKICAgICMgICB0aGUgb3V0cHV0IGEgc2Vjb25kIHRpbWUgaWYgaXQgdHVybnMgb3V0IHRoYXQgdGhlcmUgd2FzIGFuIGVycm9yLikKICAgICMKICAgICMgc3RkZXJyIGlzIGFsd2F5cyBtZXJnZWQgd2l0aCBzdGRvdXQgKGV2ZW4gaWYgc2hvd19zdGRvdXQ9VHJ1ZSkuCiAgICBpZiBzaG93X3N0ZG91dDoKICAgICAgICBzdGRvdXQgPSBOb25lCiAgICBlbHNlOgogICAgICAgIHN0ZG91dCA9IHN1YnByb2Nlc3MuUElQRQogICAgaWYgY29tbWFuZF9kZXNjIGlzIE5vbmU6CiAgICAgICAgY21kX3BhcnRzID0gW10KICAgICAgICBmb3IgcGFydCBpbiBjbWQ6CiAgICAgICAgICAgIGlmICcgJyBpbiBwYXJ0IG9yICdcbicgaW4gcGFydCBvciAnIicgaW4gcGFydCBvciAiJyIgaW4gcGFydDoKICAgICAgICAgICAgICAgIHBhcnQgPSAnIiVzIicgJSBwYXJ0LnJlcGxhY2UoJyInLCAnXFwiJykKICAgICAgICAgICAgY21kX3BhcnRzLmFwcGVuZChwYXJ0KQogICAgICAgIGNvbW1hbmRfZGVzYyA9ICcgJy5qb2luKGNtZF9wYXJ0cykKICAgIGxvZ2dlci5kZWJ1ZygiUnVubmluZyBjb21tYW5kICVzIiwgY29tbWFuZF9kZXNjKQogICAgZW52ID0gb3MuZW52aXJvbi5jb3B5KCkKICAgIGlmIGV4dHJhX2Vudmlyb246CiAgICAgICAgZW52LnVwZGF0ZShleHRyYV9lbnZpcm9uKQogICAgdHJ5OgogICAgICAgIHByb2MgPSBzdWJwcm9jZXNzLlBvcGVuKAogICAgICAgICAgICBjbWQsIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VVCwgc3RkaW49Tm9uZSwgc3Rkb3V0PXN0ZG91dCwKICAgICAgICAgICAgY3dkPWN3ZCwgZW52PWVudikKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXhjOgogICAgICAgIGxvZ2dlci5jcml0aWNhbCgKICAgICAgICAgICAgIkVycm9yICVzIHdoaWxlIGV4ZWN1dGluZyBjb21tYW5kICVzIiwgZXhjLCBjb21tYW5kX2Rlc2MsCiAgICAgICAgKQogICAgICAgIHJhaXNlCiAgICBpZiBzdGRvdXQgaXMgbm90IE5vbmU6CiAgICAgICAgYWxsX291dHB1dCA9IFtdCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgbGluZSA9IGNvbnNvbGVfdG9fc3RyKHByb2Muc3Rkb3V0LnJlYWRsaW5lKCkpCiAgICAgICAgICAgIGlmIG5vdCBsaW5lOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgbGluZSA9IGxpbmUucnN0cmlwKCkKICAgICAgICAgICAgYWxsX291dHB1dC5hcHBlbmQobGluZSArICdcbicpCiAgICAgICAgICAgIGlmIGxvZ2dlci5nZXRFZmZlY3RpdmVMZXZlbCgpIDw9IHN0ZF9sb2dnaW5nLkRFQlVHOgogICAgICAgICAgICAgICAgIyBTaG93IHRoZSBsaW5lIGltbWVkaWF0ZWx5CiAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcobGluZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgVXBkYXRlIHRoZSBzcGlubmVyCiAgICAgICAgICAgICAgICBpZiBzcGlubmVyIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgIHNwaW5uZXIuc3BpbigpCiAgICBwcm9jLndhaXQoKQogICAgaWYgc3Bpbm5lciBpcyBub3QgTm9uZToKICAgICAgICBpZiBwcm9jLnJldHVybmNvZGU6CiAgICAgICAgICAgIHNwaW5uZXIuZmluaXNoKCJlcnJvciIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc3Bpbm5lci5maW5pc2goImRvbmUiKQogICAgaWYgcHJvYy5yZXR1cm5jb2RlOgogICAgICAgIGlmIG9uX3JldHVybmNvZGUgPT0gJ3JhaXNlJzoKICAgICAgICAgICAgaWYgKGxvZ2dlci5nZXRFZmZlY3RpdmVMZXZlbCgpID4gc3RkX2xvZ2dpbmcuREVCVUcgYW5kCiAgICAgICAgICAgICAgICAgICAgbm90IHNob3dfc3Rkb3V0KToKICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgICAgICdDb21wbGV0ZSBvdXRwdXQgZnJvbSBjb21tYW5kICVzOicsIGNvbW1hbmRfZGVzYywKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgICAgICcnLmpvaW4oYWxsX291dHB1dCkgKwogICAgICAgICAgICAgICAgICAgICdcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHJhaXNlIEluc3RhbGxhdGlvbkVycm9yKAogICAgICAgICAgICAgICAgJ0NvbW1hbmQgIiVzIiBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICVzIGluICVzJwogICAgICAgICAgICAgICAgJSAoY29tbWFuZF9kZXNjLCBwcm9jLnJldHVybmNvZGUsIGN3ZCkpCiAgICAgICAgZWxpZiBvbl9yZXR1cm5jb2RlID09ICd3YXJuJzoKICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAnQ29tbWFuZCAiJXMiIGhhZCBlcnJvciBjb2RlICVzIGluICVzJywKICAgICAgICAgICAgICAgIGNvbW1hbmRfZGVzYywgcHJvYy5yZXR1cm5jb2RlLCBjd2QsCiAgICAgICAgICAgICkKICAgICAgICBlbGlmIG9uX3JldHVybmNvZGUgPT0gJ2lnbm9yZSc6CiAgICAgICAgICAgIHBhc3MKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdJbnZhbGlkIHZhbHVlOiBvbl9yZXR1cm5jb2RlPSVzJyAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwcihvbl9yZXR1cm5jb2RlKSkKICAgIGlmIG5vdCBzaG93X3N0ZG91dDoKICAgICAgICByZXR1cm4gJycuam9pbihhbGxfb3V0cHV0KQoKCmRlZiByZWFkX3RleHRfZmlsZShmaWxlbmFtZSk6CiAgICAiIiJSZXR1cm4gdGhlIGNvbnRlbnRzIG9mICpmaWxlbmFtZSouCgogICAgVHJ5IHRvIGRlY29kZSB0aGUgZmlsZSBjb250ZW50cyB3aXRoIHV0Zi04LCB0aGUgcHJlZmVycmVkIHN5c3RlbSBlbmNvZGluZwogICAgKGUuZy4sIGNwMTI1MiBvbiBzb21lIFdpbmRvd3MgbWFjaGluZXMpLCBhbmQgbGF0aW4xLCBpbiB0aGF0IG9yZGVyLgogICAgRGVjb2RpbmcgYSBieXRlIHN0cmluZyB3aXRoIGxhdGluMSB3aWxsIG5ldmVyIHJhaXNlIGFuIGVycm9yLiBJbiB0aGUgd29yc3QKICAgIGNhc2UsIHRoZSByZXR1cm5lZCBzdHJpbmcgd2lsbCBjb250YWluIHNvbWUgZ2FyYmFnZSBjaGFyYWN0ZXJzLgoKICAgICIiIgogICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAncmInKSBhcyBmcDoKICAgICAgICBkYXRhID0gZnAucmVhZCgpCgogICAgZW5jb2RpbmdzID0gWyd1dGYtOCcsIGxvY2FsZS5nZXRwcmVmZXJyZWRlbmNvZGluZyhGYWxzZSksICdsYXRpbjEnXQogICAgZm9yIGVuYyBpbiBlbmNvZGluZ3M6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBkYXRhID0gZGF0YS5kZWNvZGUoZW5jKQogICAgICAgIGV4Y2VwdCBVbmljb2RlRGVjb2RlRXJyb3I6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgYnJlYWsKCiAgICBhc3NlcnQgdHlwZShkYXRhKSAhPSBieXRlcyAgIyBMYXRpbjEgc2hvdWxkIGhhdmUgd29ya2VkLgogICAgcmV0dXJuIGRhdGEKCgpkZWYgX21ha2VfYnVpbGRfZGlyKGJ1aWxkX2Rpcik6CiAgICBvcy5tYWtlZGlycyhidWlsZF9kaXIpCiAgICB3cml0ZV9kZWxldGVfbWFya2VyX2ZpbGUoYnVpbGRfZGlyKQoKCmNsYXNzIEZha2VGaWxlKG9iamVjdCk6CiAgICAiIiJXcmFwIGEgbGlzdCBvZiBsaW5lcyBpbiBhbiBvYmplY3Qgd2l0aCByZWFkbGluZSgpIHRvIG1ha2UKICAgIENvbmZpZ1BhcnNlciBoYXBweS4iIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsaW5lcyk6CiAgICAgICAgc2VsZi5fZ2VuID0gKGwgZm9yIGwgaW4gbGluZXMpCgogICAgZGVmIHJlYWRsaW5lKHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmV0dXJuIG5leHQoc2VsZi5fZ2VuKQogICAgICAgICAgICBleGNlcHQgTmFtZUVycm9yOgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2dlbi5uZXh0KCkKICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKICAgICAgICAgICAgcmV0dXJuICcnCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9nZW4KCgpjbGFzcyBTdHJlYW1XcmFwcGVyKFN0cmluZ0lPKToKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBmcm9tX3N0cmVhbShjbHMsIG9yaWdfc3RyZWFtKToKICAgICAgICBjbHMub3JpZ19zdHJlYW0gPSBvcmlnX3N0cmVhbQogICAgICAgIHJldHVybiBjbHMoKQoKICAgICMgY29tcGlsZWFsbC5jb21waWxlX2RpcigpIG5lZWRzIHN0ZG91dC5lbmNvZGluZyB0byBwcmludCB0byBzdGRvdXQKICAgIEBwcm9wZXJ0eQogICAgZGVmIGVuY29kaW5nKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLm9yaWdfc3RyZWFtLmVuY29kaW5nCgoKQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKZGVmIGNhcHR1cmVkX291dHB1dChzdHJlYW1fbmFtZSk6CiAgICAiIiJSZXR1cm4gYSBjb250ZXh0IG1hbmFnZXIgdXNlZCBieSBjYXB0dXJlZF9zdGRvdXQvc3RkaW4vc3RkZXJyCiAgICB0aGF0IHRlbXBvcmFyaWx5IHJlcGxhY2VzIHRoZSBzeXMgc3RyZWFtICpzdHJlYW1fbmFtZSogd2l0aCBhIFN0cmluZ0lPLgoKICAgIFRha2VuIGZyb20gTGliL3N1cHBvcnQvX19pbml0X18ucHkgaW4gdGhlIENQeXRob24gcmVwby4KICAgICIiIgogICAgb3JpZ19zdGRvdXQgPSBnZXRhdHRyKHN5cywgc3RyZWFtX25hbWUpCiAgICBzZXRhdHRyKHN5cywgc3RyZWFtX25hbWUsIFN0cmVhbVdyYXBwZXIuZnJvbV9zdHJlYW0ob3JpZ19zdGRvdXQpKQogICAgdHJ5OgogICAgICAgIHlpZWxkIGdldGF0dHIoc3lzLCBzdHJlYW1fbmFtZSkKICAgIGZpbmFsbHk6CiAgICAgICAgc2V0YXR0cihzeXMsIHN0cmVhbV9uYW1lLCBvcmlnX3N0ZG91dCkKCgpkZWYgY2FwdHVyZWRfc3Rkb3V0KCk6CiAgICAiIiJDYXB0dXJlIHRoZSBvdXRwdXQgb2Ygc3lzLnN0ZG91dDoKCiAgICAgICB3aXRoIGNhcHR1cmVkX3N0ZG91dCgpIGFzIHN0ZG91dDoKICAgICAgICAgICBwcmludCgnaGVsbG8nKQogICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGRvdXQuZ2V0dmFsdWUoKSwgJ2hlbGxvXG4nKQoKICAgIFRha2VuIGZyb20gTGliL3N1cHBvcnQvX19pbml0X18ucHkgaW4gdGhlIENQeXRob24gcmVwby4KICAgICIiIgogICAgcmV0dXJuIGNhcHR1cmVkX291dHB1dCgnc3Rkb3V0JykKCgpjbGFzcyBjYWNoZWRfcHJvcGVydHkob2JqZWN0KToKICAgICIiIkEgcHJvcGVydHkgdGhhdCBpcyBvbmx5IGNvbXB1dGVkIG9uY2UgcGVyIGluc3RhbmNlIGFuZCB0aGVuIHJlcGxhY2VzCiAgICAgICBpdHNlbGYgd2l0aCBhbiBvcmRpbmFyeSBhdHRyaWJ1dGUuIERlbGV0aW5nIHRoZSBhdHRyaWJ1dGUgcmVzZXRzIHRoZQogICAgICAgcHJvcGVydHkuCgogICAgICAgU291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vYm90dGxlcHkvYm90dGxlL2Jsb2IvMC4xMS41L2JvdHRsZS5weSNMMTc1CiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgZnVuYyk6CiAgICAgICAgc2VsZi5fX2RvY19fID0gZ2V0YXR0cihmdW5jLCAnX19kb2NfXycpCiAgICAgICAgc2VsZi5mdW5jID0gZnVuYwoKICAgIGRlZiBfX2dldF9fKHNlbGYsIG9iaiwgY2xzKToKICAgICAgICBpZiBvYmogaXMgTm9uZToKICAgICAgICAgICAgIyBXZSdyZSBiZWluZyBhY2Nlc3NlZCBmcm9tIHRoZSBjbGFzcyBpdHNlbGYsIG5vdCBmcm9tIGFuIG9iamVjdAogICAgICAgICAgICByZXR1cm4gc2VsZgogICAgICAgIHZhbHVlID0gb2JqLl9fZGljdF9fW3NlbGYuZnVuYy5fX25hbWVfX10gPSBzZWxmLmZ1bmMob2JqKQogICAgICAgIHJldHVybiB2YWx1ZQoKCmRlZiBnZXRfaW5zdGFsbGVkX3ZlcnNpb24oZGlzdF9uYW1lLCBsb29rdXBfZGlycz1Ob25lKToKICAgICIiIkdldCB0aGUgaW5zdGFsbGVkIHZlcnNpb24gb2YgZGlzdF9uYW1lIGF2b2lkaW5nIHBrZ19yZXNvdXJjZXMgY2FjaGUiIiIKICAgICMgQ3JlYXRlIGEgcmVxdWlyZW1lbnQgdGhhdCB3ZSdsbCBsb29rIGZvciBpbnNpZGUgb2Ygc2V0dXB0b29scy4KICAgIHJlcSA9IHBrZ19yZXNvdXJjZXMuUmVxdWlyZW1lbnQucGFyc2UoZGlzdF9uYW1lKQoKICAgICMgV2Ugd2FudCB0byBhdm9pZCBoYXZpbmcgdGhpcyBjYWNoZWQsIHNvIHdlIG5lZWQgdG8gY29uc3RydWN0IGEgbmV3CiAgICAjIHdvcmtpbmcgc2V0IGVhY2ggdGltZS4KICAgIGlmIGxvb2t1cF9kaXJzIGlzIE5vbmU6CiAgICAgICAgd29ya2luZ19zZXQgPSBwa2dfcmVzb3VyY2VzLldvcmtpbmdTZXQoKQogICAgZWxzZToKICAgICAgICB3b3JraW5nX3NldCA9IHBrZ19yZXNvdXJjZXMuV29ya2luZ1NldChsb29rdXBfZGlycykKCiAgICAjIEdldCB0aGUgaW5zdGFsbGVkIGRpc3RyaWJ1dGlvbiBmcm9tIG91ciB3b3JraW5nIHNldAogICAgZGlzdCA9IHdvcmtpbmdfc2V0LmZpbmQocmVxKQoKICAgICMgQ2hlY2sgdG8gc2VlIGlmIHdlIGdvdCBhbiBpbnN0YWxsZWQgZGlzdHJpYnV0aW9uIG9yIG5vdCwgaWYgd2UgZGlkCiAgICAjIHdlIHdhbnQgdG8gcmV0dXJuIGl0J3MgdmVyc2lvbi4KICAgIHJldHVybiBkaXN0LnZlcnNpb24gaWYgZGlzdCBlbHNlIE5vbmUKCgpkZWYgY29uc3VtZShpdGVyYXRvcik6CiAgICAiIiJDb25zdW1lIGFuIGl0ZXJhYmxlIGF0IEMgc3BlZWQuIiIiCiAgICBkZXF1ZShpdGVyYXRvciwgbWF4bGVuPTApClBLAwQUAAAAAAAAACEANQreO2siAABrIgAAJAAAAHB5cGlfX3BpcF85XzBfMy9waXAvdXRpbHMvYXBwZGlycy5weSIiIgpUaGlzIGNvZGUgd2FzIHRha2VuIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL0FjdGl2ZVN0YXRlL2FwcGRpcnMgYW5kIG1vZGlmaWVkCnRvIHN1aXQgb3VyIHB1cnBvc2VzLgoiIiIKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBvcwppbXBvcnQgc3lzCgpmcm9tIHBpcC5jb21wYXQgaW1wb3J0IFdJTkRPV1MsIGV4cGFuZHVzZXIKZnJvbSBwaXAuX3ZlbmRvci5zaXggaW1wb3J0IFBZMiwgdGV4dF90eXBlCgoKZGVmIHVzZXJfY2FjaGVfZGlyKGFwcG5hbWUpOgogICAgciIiIgogICAgUmV0dXJuIGZ1bGwgcGF0aCB0byB0aGUgdXNlci1zcGVjaWZpYyBjYWNoZSBkaXIgZm9yIHRoaXMgYXBwbGljYXRpb24uCgogICAgICAgICJhcHBuYW1lIiBpcyB0aGUgbmFtZSBvZiBhcHBsaWNhdGlvbi4KCiAgICBUeXBpY2FsIHVzZXIgY2FjaGUgZGlyZWN0b3JpZXMgYXJlOgogICAgICAgIG1hY09TOiAgICAgIH4vTGlicmFyeS9DYWNoZXMvPEFwcE5hbWU+CiAgICAgICAgVW5peDogICAgICAgfi8uY2FjaGUvPEFwcE5hbWU+IChYREcgZGVmYXVsdCkKICAgICAgICBXaW5kb3dzOiAgICBDOlxVc2Vyc1w8dXNlcm5hbWU+XEFwcERhdGFcTG9jYWxcPEFwcE5hbWU+XENhY2hlCgogICAgT24gV2luZG93cyB0aGUgb25seSBzdWdnZXN0aW9uIGluIHRoZSBNU0ROIGRvY3MgaXMgdGhhdCBsb2NhbCBzZXR0aW5ncyBnbwogICAgaW4gdGhlIGBDU0lETF9MT0NBTF9BUFBEQVRBYCBkaXJlY3RvcnkuIFRoaXMgaXMgaWRlbnRpY2FsIHRvIHRoZQogICAgbm9uLXJvYW1pbmcgYXBwIGRhdGEgZGlyICh0aGUgZGVmYXVsdCByZXR1cm5lZCBieSBgdXNlcl9kYXRhX2RpcmApLiBBcHBzCiAgICB0eXBpY2FsbHkgcHV0IGNhY2hlIGRhdGEgc29tZXdoZXJlICp1bmRlciogdGhlIGdpdmVuIGRpciBoZXJlLiBTb21lCiAgICBleGFtcGxlczoKICAgICAgICAuLi5cTW96aWxsYVxGaXJlZm94XFByb2ZpbGVzXDxQcm9maWxlTmFtZT5cQ2FjaGUKICAgICAgICAuLi5cQWNtZVxTdXBlckFwcFxDYWNoZVwxLjAKCiAgICBPUElOSU9OOiBUaGlzIGZ1bmN0aW9uIGFwcGVuZHMgIkNhY2hlIiB0byB0aGUgYENTSURMX0xPQ0FMX0FQUERBVEFgIHZhbHVlLgogICAgIiIiCiAgICBpZiBXSU5ET1dTOgogICAgICAgICMgR2V0IHRoZSBiYXNlIHBhdGgKICAgICAgICBwYXRoID0gb3MucGF0aC5ub3JtcGF0aChfZ2V0X3dpbl9mb2xkZXIoIkNTSURMX0xPQ0FMX0FQUERBVEEiKSkKCiAgICAgICAgIyBXaGVuIHVzaW5nIFB5dGhvbiAyLCByZXR1cm4gcGF0aHMgYXMgYnl0ZXMgb24gV2luZG93cyBsaWtlIHdlIGRvIG9uCiAgICAgICAgIyBvdGhlciBvcGVyYXRpbmcgc3lzdGVtcy4gU2VlIGhlbHBlciBmdW5jdGlvbiBkb2NzIGZvciBtb3JlIGRldGFpbHMuCiAgICAgICAgaWYgUFkyIGFuZCBpc2luc3RhbmNlKHBhdGgsIHRleHRfdHlwZSk6CiAgICAgICAgICAgIHBhdGggPSBfd2luX3BhdGhfdG9fYnl0ZXMocGF0aCkKCiAgICAgICAgIyBBZGQgb3VyIGFwcCBuYW1lIGFuZCBDYWNoZSBkaXJlY3RvcnkgdG8gaXQKICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcG5hbWUsICJDYWNoZSIpCiAgICBlbGlmIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIjoKICAgICAgICAjIEdldCB0aGUgYmFzZSBwYXRoCiAgICAgICAgcGF0aCA9IGV4cGFuZHVzZXIoIn4vTGlicmFyeS9DYWNoZXMiKQoKICAgICAgICAjIEFkZCBvdXIgYXBwIG5hbWUgdG8gaXQKICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIGFwcG5hbWUpCiAgICBlbHNlOgogICAgICAgICMgR2V0IHRoZSBiYXNlIHBhdGgKICAgICAgICBwYXRoID0gb3MuZ2V0ZW52KCJYREdfQ0FDSEVfSE9NRSIsIGV4cGFuZHVzZXIoIn4vLmNhY2hlIikpCgogICAgICAgICMgQWRkIG91ciBhcHAgbmFtZSB0byBpdAogICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwbmFtZSkKCiAgICByZXR1cm4gcGF0aAoKCmRlZiB1c2VyX2RhdGFfZGlyKGFwcG5hbWUsIHJvYW1pbmc9RmFsc2UpOgogICAgIiIiCiAgICBSZXR1cm4gZnVsbCBwYXRoIHRvIHRoZSB1c2VyLXNwZWNpZmljIGRhdGEgZGlyIGZvciB0aGlzIGFwcGxpY2F0aW9uLgoKICAgICAgICAiYXBwbmFtZSIgaXMgdGhlIG5hbWUgb2YgYXBwbGljYXRpb24uCiAgICAgICAgICAgIElmIE5vbmUsIGp1c3QgdGhlIHN5c3RlbSBkaXJlY3RvcnkgaXMgcmV0dXJuZWQuCiAgICAgICAgInJvYW1pbmciIChib29sZWFuLCBkZWZhdWx0IEZhbHNlKSBjYW4gYmUgc2V0IFRydWUgdG8gdXNlIHRoZSBXaW5kb3dzCiAgICAgICAgICAgIHJvYW1pbmcgYXBwZGF0YSBkaXJlY3RvcnkuIFRoYXQgbWVhbnMgdGhhdCBmb3IgdXNlcnMgb24gYSBXaW5kb3dzCiAgICAgICAgICAgIG5ldHdvcmsgc2V0dXAgZm9yIHJvYW1pbmcgcHJvZmlsZXMsIHRoaXMgdXNlciBkYXRhIHdpbGwgYmUKICAgICAgICAgICAgc3luYydkIG9uIGxvZ2luLiBTZWUKICAgICAgICAgICAgPGh0dHA6Ly90ZWNobmV0Lm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9jYzc2NjQ4OShXUy4xMCkuYXNweD4KICAgICAgICAgICAgZm9yIGEgZGlzY3Vzc2lvbiBvZiBpc3N1ZXMuCgogICAgVHlwaWNhbCB1c2VyIGRhdGEgZGlyZWN0b3JpZXMgYXJlOgogICAgICAgIG1hY09TOiAgICAgICAgICAgICAgICAgIH4vTGlicmFyeS9BcHBsaWNhdGlvbiBTdXBwb3J0LzxBcHBOYW1lPgogICAgICAgIFVuaXg6ICAgICAgICAgICAgICAgICAgIH4vLmxvY2FsL3NoYXJlLzxBcHBOYW1lPiAgICAjIG9yIGluCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFhER19EQVRBX0hPTUUsIGlmIGRlZmluZWQKICAgICAgICBXaW4gWFAgKG5vdCByb2FtaW5nKTogICBDOlxEb2N1bWVudHMgYW5kIFNldHRpbmdzXDx1c2VybmFtZT5cIC4uLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLkFwcGxpY2F0aW9uIERhdGFcPEFwcE5hbWU+CiAgICAgICAgV2luIFhQIChyb2FtaW5nKTogICAgICAgQzpcRG9jdW1lbnRzIGFuZCBTZXR0aW5nc1w8dXNlcm5hbWU+XExvY2FsIC4uLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLlNldHRpbmdzXEFwcGxpY2F0aW9uIERhdGFcPEFwcE5hbWU+CiAgICAgICAgV2luIDcgIChub3Qgcm9hbWluZyk6ICAgQzpcXFVzZXJzXDx1c2VybmFtZT5cQXBwRGF0YVxMb2NhbFw8QXBwTmFtZT4KICAgICAgICBXaW4gNyAgKHJvYW1pbmcpOiAgICAgICBDOlxcVXNlcnNcPHVzZXJuYW1lPlxBcHBEYXRhXFJvYW1pbmdcPEFwcE5hbWU+CgogICAgRm9yIFVuaXgsIHdlIGZvbGxvdyB0aGUgWERHIHNwZWMgYW5kIHN1cHBvcnQgJFhER19EQVRBX0hPTUUuCiAgICBUaGF0IG1lYW5zLCBieSBkZWZhdWx0ICJ+Ly5sb2NhbC9zaGFyZS88QXBwTmFtZT4iLgogICAgIiIiCiAgICBpZiBXSU5ET1dTOgogICAgICAgIGNvbnN0ID0gcm9hbWluZyBhbmQgIkNTSURMX0FQUERBVEEiIG9yICJDU0lETF9MT0NBTF9BUFBEQVRBIgogICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5ub3JtcGF0aChfZ2V0X3dpbl9mb2xkZXIoY29uc3QpKSwgYXBwbmFtZSkKICAgIGVsaWYgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iOgogICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgIGV4cGFuZHVzZXIoJ34vTGlicmFyeS9BcHBsaWNhdGlvbiBTdXBwb3J0LycpLAogICAgICAgICAgICBhcHBuYW1lLAogICAgICAgICkKICAgIGVsc2U6CiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbigKICAgICAgICAgICAgb3MuZ2V0ZW52KCdYREdfREFUQV9IT01FJywgZXhwYW5kdXNlcigifi8ubG9jYWwvc2hhcmUiKSksCiAgICAgICAgICAgIGFwcG5hbWUsCiAgICAgICAgKQoKICAgIHJldHVybiBwYXRoCgoKZGVmIHVzZXJfY29uZmlnX2RpcihhcHBuYW1lLCByb2FtaW5nPVRydWUpOgogICAgIiIiUmV0dXJuIGZ1bGwgcGF0aCB0byB0aGUgdXNlci1zcGVjaWZpYyBjb25maWcgZGlyIGZvciB0aGlzIGFwcGxpY2F0aW9uLgoKICAgICAgICAiYXBwbmFtZSIgaXMgdGhlIG5hbWUgb2YgYXBwbGljYXRpb24uCiAgICAgICAgICAgIElmIE5vbmUsIGp1c3QgdGhlIHN5c3RlbSBkaXJlY3RvcnkgaXMgcmV0dXJuZWQuCiAgICAgICAgInJvYW1pbmciIChib29sZWFuLCBkZWZhdWx0IFRydWUpIGNhbiBiZSBzZXQgRmFsc2UgdG8gbm90IHVzZSB0aGUKICAgICAgICAgICAgV2luZG93cyByb2FtaW5nIGFwcGRhdGEgZGlyZWN0b3J5LiBUaGF0IG1lYW5zIHRoYXQgZm9yIHVzZXJzIG9uIGEKICAgICAgICAgICAgV2luZG93cyBuZXR3b3JrIHNldHVwIGZvciByb2FtaW5nIHByb2ZpbGVzLCB0aGlzIHVzZXIgZGF0YSB3aWxsIGJlCiAgICAgICAgICAgIHN5bmMnZCBvbiBsb2dpbi4gU2VlCiAgICAgICAgICAgIDxodHRwOi8vdGVjaG5ldC5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvY2M3NjY0ODkoV1MuMTApLmFzcHg+CiAgICAgICAgICAgIGZvciBhIGRpc2N1c3Npb24gb2YgaXNzdWVzLgoKICAgIFR5cGljYWwgdXNlciBkYXRhIGRpcmVjdG9yaWVzIGFyZToKICAgICAgICBtYWNPUzogICAgICAgICAgICAgICAgICBzYW1lIGFzIHVzZXJfZGF0YV9kaXIKICAgICAgICBVbml4OiAgICAgICAgICAgICAgICAgICB+Ly5jb25maWcvPEFwcE5hbWU+CiAgICAgICAgV2luICo6ICAgICAgICAgICAgICAgICAgc2FtZSBhcyB1c2VyX2RhdGFfZGlyCgogICAgRm9yIFVuaXgsIHdlIGZvbGxvdyB0aGUgWERHIHNwZWMgYW5kIHN1cHBvcnQgJFhER19DT05GSUdfSE9NRS4KICAgIFRoYXQgbWVhbnMsIGJ5IGRlZmF1bHQgIn4vLmNvbmZpZy88QXBwTmFtZT4iLgogICAgIiIiCiAgICBpZiBXSU5ET1dTOgogICAgICAgIHBhdGggPSB1c2VyX2RhdGFfZGlyKGFwcG5hbWUsIHJvYW1pbmc9cm9hbWluZykKICAgIGVsaWYgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iOgogICAgICAgIHBhdGggPSB1c2VyX2RhdGFfZGlyKGFwcG5hbWUpCiAgICBlbHNlOgogICAgICAgIHBhdGggPSBvcy5nZXRlbnYoJ1hER19DT05GSUdfSE9NRScsIGV4cGFuZHVzZXIoIn4vLmNvbmZpZyIpKQogICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgYXBwbmFtZSkKCiAgICByZXR1cm4gcGF0aAoKCiMgZm9yIHRoZSBkaXNjdXNzaW9uIHJlZ2FyZGluZyBzaXRlX2NvbmZpZ19kaXJzIGxvY2F0aW9ucwojIHNlZSA8aHR0cHM6Ly9naXRodWIuY29tL3B5cGEvcGlwL2lzc3Vlcy8xNzMzPgpkZWYgc2l0ZV9jb25maWdfZGlycyhhcHBuYW1lKToKICAgICIiIlJldHVybiBhIGxpc3Qgb2YgcG90ZW50aWFsIHVzZXItc2hhcmVkIGNvbmZpZyBkaXJzIGZvciB0aGlzIGFwcGxpY2F0aW9uLgoKICAgICAgICAiYXBwbmFtZSIgaXMgdGhlIG5hbWUgb2YgYXBwbGljYXRpb24uCgogICAgVHlwaWNhbCB1c2VyIGNvbmZpZyBkaXJlY3RvcmllcyBhcmU6CiAgICAgICAgbWFjT1M6ICAgICAgL0xpYnJhcnkvQXBwbGljYXRpb24gU3VwcG9ydC88QXBwTmFtZT4vCiAgICAgICAgVW5peDogICAgICAgL2V0YyBvciAkWERHX0NPTkZJR19ESVJTW2ldLzxBcHBOYW1lPi8gZm9yIGVhY2ggdmFsdWUgaW4KICAgICAgICAgICAgICAgICAgICAkWERHX0NPTkZJR19ESVJTCiAgICAgICAgV2luIFhQOiAgICAgQzpcRG9jdW1lbnRzIGFuZCBTZXR0aW5nc1xBbGwgVXNlcnNcQXBwbGljYXRpb24gLi4uCiAgICAgICAgICAgICAgICAgICAgLi4uRGF0YVw8QXBwTmFtZT5cCiAgICAgICAgVmlzdGE6ICAgICAgKEZhaWwhICJDOlxQcm9ncmFtRGF0YSIgaXMgYSBoaWRkZW4gKnN5c3RlbSogZGlyZWN0b3J5CiAgICAgICAgICAgICAgICAgICAgb24gVmlzdGEuKQogICAgICAgIFdpbiA3OiAgICAgIEhpZGRlbiwgYnV0IHdyaXRlYWJsZSBvbiBXaW4gNzoKICAgICAgICAgICAgICAgICAgICBDOlxQcm9ncmFtRGF0YVw8QXBwTmFtZT5cCiAgICAiIiIKICAgIGlmIFdJTkRPV1M6CiAgICAgICAgcGF0aCA9IG9zLnBhdGgubm9ybXBhdGgoX2dldF93aW5fZm9sZGVyKCJDU0lETF9DT01NT05fQVBQREFUQSIpKQogICAgICAgIHBhdGhsaXN0ID0gW29zLnBhdGguam9pbihwYXRoLCBhcHBuYW1lKV0KICAgIGVsaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nOgogICAgICAgIHBhdGhsaXN0ID0gW29zLnBhdGguam9pbignL0xpYnJhcnkvQXBwbGljYXRpb24gU3VwcG9ydCcsIGFwcG5hbWUpXQogICAgZWxzZToKICAgICAgICAjIHRyeSBsb29raW5nIGluICRYREdfQ09ORklHX0RJUlMKICAgICAgICB4ZGdfY29uZmlnX2RpcnMgPSBvcy5nZXRlbnYoJ1hER19DT05GSUdfRElSUycsICcvZXRjL3hkZycpCiAgICAgICAgaWYgeGRnX2NvbmZpZ19kaXJzOgogICAgICAgICAgICBwYXRobGlzdCA9IFsKICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihleHBhbmR1c2VyKHgpLCBhcHBuYW1lKQogICAgICAgICAgICAgICAgZm9yIHggaW4geGRnX2NvbmZpZ19kaXJzLnNwbGl0KG9zLnBhdGhzZXApCiAgICAgICAgICAgIF0KICAgICAgICBlbHNlOgogICAgICAgICAgICBwYXRobGlzdCA9IFtdCgogICAgICAgICMgYWx3YXlzIGxvb2sgaW4gL2V0YyBkaXJlY3RseSBhcyB3ZWxsCiAgICAgICAgcGF0aGxpc3QuYXBwZW5kKCcvZXRjJykKCiAgICByZXR1cm4gcGF0aGxpc3QKCgojIC0tIFdpbmRvd3Mgc3VwcG9ydCBmdW5jdGlvbnMgLS0KCmRlZiBfZ2V0X3dpbl9mb2xkZXJfZnJvbV9yZWdpc3RyeShjc2lkbF9uYW1lKToKICAgICIiIgogICAgVGhpcyBpcyBhIGZhbGxiYWNrIHRlY2huaXF1ZSBhdCBiZXN0LiBJJ20gbm90IHN1cmUgaWYgdXNpbmcgdGhlCiAgICByZWdpc3RyeSBmb3IgdGhpcyBndWFyYW50ZWVzIHVzIHRoZSBjb3JyZWN0IGFuc3dlciBmb3IgYWxsIENTSURMXyoKICAgIG5hbWVzLgogICAgIiIiCiAgICBpbXBvcnQgX3dpbnJlZwoKICAgIHNoZWxsX2ZvbGRlcl9uYW1lID0gewogICAgICAgICJDU0lETF9BUFBEQVRBIjogIkFwcERhdGEiLAogICAgICAgICJDU0lETF9DT01NT05fQVBQREFUQSI6ICJDb21tb24gQXBwRGF0YSIsCiAgICAgICAgIkNTSURMX0xPQ0FMX0FQUERBVEEiOiAiTG9jYWwgQXBwRGF0YSIsCiAgICB9W2NzaWRsX25hbWVdCgogICAga2V5ID0gX3dpbnJlZy5PcGVuS2V5KAogICAgICAgIF93aW5yZWcuSEtFWV9DVVJSRU5UX1VTRVIsCiAgICAgICAgciJTb2Z0d2FyZVxNaWNyb3NvZnRcV2luZG93c1xDdXJyZW50VmVyc2lvblxFeHBsb3JlclxTaGVsbCBGb2xkZXJzIgogICAgKQogICAgZGlyZWN0b3J5LCBfdHlwZSA9IF93aW5yZWcuUXVlcnlWYWx1ZUV4KGtleSwgc2hlbGxfZm9sZGVyX25hbWUpCiAgICByZXR1cm4gZGlyZWN0b3J5CgoKZGVmIF9nZXRfd2luX2ZvbGRlcl93aXRoX2N0eXBlcyhjc2lkbF9uYW1lKToKICAgIGNzaWRsX2NvbnN0ID0gewogICAgICAgICJDU0lETF9BUFBEQVRBIjogMjYsCiAgICAgICAgIkNTSURMX0NPTU1PTl9BUFBEQVRBIjogMzUsCiAgICAgICAgIkNTSURMX0xPQ0FMX0FQUERBVEEiOiAyOCwKICAgIH1bY3NpZGxfbmFtZV0KCiAgICBidWYgPSBjdHlwZXMuY3JlYXRlX3VuaWNvZGVfYnVmZmVyKDEwMjQpCiAgICBjdHlwZXMud2luZGxsLnNoZWxsMzIuU0hHZXRGb2xkZXJQYXRoVyhOb25lLCBjc2lkbF9jb25zdCwgTm9uZSwgMCwgYnVmKQoKICAgICMgRG93bmdyYWRlIHRvIHNob3J0IHBhdGggbmFtZSBpZiBoYXZlIGhpZ2hiaXQgY2hhcnMuIFNlZQogICAgIyA8aHR0cDovL2J1Z3MuYWN0aXZlc3RhdGUuY29tL3Nob3dfYnVnLmNnaT9pZD04NTA5OT4uCiAgICBoYXNfaGlnaF9jaGFyID0gRmFsc2UKICAgIGZvciBjIGluIGJ1ZjoKICAgICAgICBpZiBvcmQoYykgPiAyNTU6CiAgICAgICAgICAgIGhhc19oaWdoX2NoYXIgPSBUcnVlCiAgICAgICAgICAgIGJyZWFrCiAgICBpZiBoYXNfaGlnaF9jaGFyOgogICAgICAgIGJ1ZjIgPSBjdHlwZXMuY3JlYXRlX3VuaWNvZGVfYnVmZmVyKDEwMjQpCiAgICAgICAgaWYgY3R5cGVzLndpbmRsbC5rZXJuZWwzMi5HZXRTaG9ydFBhdGhOYW1lVyhidWYudmFsdWUsIGJ1ZjIsIDEwMjQpOgogICAgICAgICAgICBidWYgPSBidWYyCgogICAgcmV0dXJuIGJ1Zi52YWx1ZQoKaWYgV0lORE9XUzoKICAgIHRyeToKICAgICAgICBpbXBvcnQgY3R5cGVzCiAgICAgICAgX2dldF93aW5fZm9sZGVyID0gX2dldF93aW5fZm9sZGVyX3dpdGhfY3R5cGVzCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgX2dldF93aW5fZm9sZGVyID0gX2dldF93aW5fZm9sZGVyX2Zyb21fcmVnaXN0cnkKCgpkZWYgX3dpbl9wYXRoX3RvX2J5dGVzKHBhdGgpOgogICAgIiIiRW5jb2RlIFdpbmRvd3MgcGF0aHMgdG8gYnl0ZXMuIE9ubHkgdXNlZCBvbiBQeXRob24gMi4KCiAgICBNb3RpdmF0aW9uIGlzIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBvdGhlciBvcGVyYXRpbmcgc3lzdGVtcyB3aGVyZSBwYXRocwogICAgYXJlIGFsc28gcmV0dXJuZWQgYXMgYnl0ZXMuIFRoaXMgYXZvaWRzIHByb2JsZW1zIG1peGluZyBieXRlcyBhbmQgVW5pY29kZQogICAgZWxzZXdoZXJlIGluIHRoZSBjb2RlYmFzZS4gRm9yIG1vcmUgZGV0YWlscyBhbmQgZGlzY3Vzc2lvbiBzZWUKICAgIDxodHRwczovL2dpdGh1Yi5jb20vcHlwYS9waXAvaXNzdWVzLzM0NjM+LgoKICAgIElmIGVuY29kaW5nIHVzaW5nIEFTQ0lJIGFuZCBNQkNTIGZhaWxzLCByZXR1cm4gdGhlIG9yaWdpbmFsIFVuaWNvZGUgcGF0aC4KICAgICIiIgogICAgZm9yIGVuY29kaW5nIGluICgnQVNDSUknLCAnTUJDUycpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHBhdGguZW5jb2RlKGVuY29kaW5nKQogICAgICAgIGV4Y2VwdCAoVW5pY29kZUVuY29kZUVycm9yLCBMb29rdXBFcnJvcik6CiAgICAgICAgICAgIHBhc3MKICAgIHJldHVybiBwYXRoClBLAwQUAAAAAAAAACEAzQxNLiAFAAAgBQAAIgAAAHB5cGlfX3BpcF85XzBfMy9waXAvdXRpbHMvYnVpbGQucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IG9zLnBhdGgKaW1wb3J0IHRlbXBmaWxlCgpmcm9tIHBpcC51dGlscyBpbXBvcnQgcm10cmVlCgoKY2xhc3MgQnVpbGREaXJlY3Rvcnkob2JqZWN0KToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZT1Ob25lLCBkZWxldGU9Tm9uZSk6CiAgICAgICAgIyBJZiB3ZSB3ZXJlIG5vdCBnaXZlbiBhbiBleHBsaWNpdCBkaXJlY3RvcnksIGFuZCB3ZSB3ZXJlIG5vdCBnaXZlbiBhbgogICAgICAgICMgZXhwbGljaXQgZGVsZXRlIG9wdGlvbiwgdGhlbiB3ZSdsbCBkZWZhdWx0IHRvIGRlbGV0aW5nLgogICAgICAgIGlmIG5hbWUgaXMgTm9uZSBhbmQgZGVsZXRlIGlzIE5vbmU6CiAgICAgICAgICAgIGRlbGV0ZSA9IFRydWUKCiAgICAgICAgaWYgbmFtZSBpcyBOb25lOgogICAgICAgICAgICAjIFdlIHJlYWxwYXRoIGhlcmUgYmVjYXVzZSBzb21lIHN5c3RlbXMgaGF2ZSB0aGVpciBkZWZhdWx0IHRtcGRpcgogICAgICAgICAgICAjIHN5bWxpbmtlZCB0byBhbm90aGVyIGRpcmVjdG9yeS4gIFRoaXMgdGVuZHMgdG8gY29uZnVzZSBidWlsZAogICAgICAgICAgICAjIHNjcmlwdHMsIHNvIHdlIGNhbm9uaWNhbGl6ZSB0aGUgcGF0aCBieSB0cmF2ZXJzaW5nIHBvdGVudGlhbAogICAgICAgICAgICAjIHN5bWxpbmtzIGhlcmUuCiAgICAgICAgICAgIG5hbWUgPSBvcy5wYXRoLnJlYWxwYXRoKHRlbXBmaWxlLm1rZHRlbXAocHJlZml4PSJwaXAtYnVpbGQtIikpCiAgICAgICAgICAgICMgSWYgd2Ugd2VyZSBub3QgZ2l2ZW4gYW4gZXhwbGljaXQgZGlyZWN0b3J5LCBhbmQgd2Ugd2VyZSBub3QgZ2l2ZW4KICAgICAgICAgICAgIyBhbiBleHBsaWNpdCBkZWxldGUgb3B0aW9uLCB0aGVuIHdlJ2xsIGRlZmF1bHQgdG8gZGVsZXRpbmcuCiAgICAgICAgICAgIGlmIGRlbGV0ZSBpcyBOb25lOgogICAgICAgICAgICAgICAgZGVsZXRlID0gVHJ1ZQoKICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCiAgICAgICAgc2VsZi5kZWxldGUgPSBkZWxldGUKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICI8e30geyFyfT4iLmZvcm1hdChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc2VsZi5uYW1lKQoKICAgIGRlZiBfX2VudGVyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYubmFtZQoKICAgIGRlZiBfX2V4aXRfXyhzZWxmLCBleGMsIHZhbHVlLCB0Yik6CiAgICAgICAgc2VsZi5jbGVhbnVwKCkKCiAgICBkZWYgY2xlYW51cChzZWxmKToKICAgICAgICBpZiBzZWxmLmRlbGV0ZToKICAgICAgICAgICAgcm10cmVlKHNlbGYubmFtZSkKUEsDBBQAAAAAAAAAIQBxHmokuAgAALgIAAAoAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC91dGlscy9kZXByZWNhdGlvbi5weSIiIgpBIG1vZHVsZSB0aGF0IGltcGxlbWVudHMgdG9vbGluZyB0byBlbmFibGUgZWFzeSB3YXJuaW5ncyBhYm91dCBkZXByZWNhdGlvbnMuCiIiIgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IHdhcm5pbmdzCgoKY2xhc3MgUGlwRGVwcmVjYXRpb25XYXJuaW5nKFdhcm5pbmcpOgogICAgcGFzcwoKCmNsYXNzIFBlbmRpbmcob2JqZWN0KToKICAgIHBhc3MKCgpjbGFzcyBSZW1vdmVkSW5QaXAxMFdhcm5pbmcoUGlwRGVwcmVjYXRpb25XYXJuaW5nKToKICAgIHBhc3MKCgpjbGFzcyBSZW1vdmVkSW5QaXAxMVdhcm5pbmcoUGlwRGVwcmVjYXRpb25XYXJuaW5nLCBQZW5kaW5nKToKICAgIHBhc3MKCgpjbGFzcyBQeXRob24yNkRlcHJlY2F0aW9uV2FybmluZyhQaXBEZXByZWNhdGlvbldhcm5pbmcpOgogICAgcGFzcwoKCiMgV2FybmluZ3MgPC0+IExvZ2dpbmcgSW50ZWdyYXRpb24KCgpfd2FybmluZ3Nfc2hvd3dhcm5pbmcgPSBOb25lCgoKZGVmIF9zaG93d2FybmluZyhtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubywgZmlsZT1Ob25lLCBsaW5lPU5vbmUpOgogICAgaWYgZmlsZSBpcyBub3QgTm9uZToKICAgICAgICBpZiBfd2FybmluZ3Nfc2hvd3dhcm5pbmcgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIF93YXJuaW5nc19zaG93d2FybmluZygKICAgICAgICAgICAgICAgIG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwgbGluZW5vLCBmaWxlLCBsaW5lLAogICAgICAgICAgICApCiAgICBlbHNlOgogICAgICAgIGlmIGlzc3ViY2xhc3MoY2F0ZWdvcnksIFBpcERlcHJlY2F0aW9uV2FybmluZyk6CiAgICAgICAgICAgICMgV2UgdXNlIGEgc3BlY2lhbGx5IG5hbWVkIGxvZ2dlciB3aGljaCB3aWxsIGhhbmRsZSBhbGwgb2YgdGhlCiAgICAgICAgICAgICMgZGVwcmVjYXRpb24gbWVzc2FnZXMgZm9yIHBpcC4KICAgICAgICAgICAgbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoInBpcC5kZXByZWNhdGlvbnMiKQoKICAgICAgICAgICAgIyBUaGlzIGlzIHB1cnBvc2VseSB1c2luZyB0aGUgJSBmb3JtYXR0ZXIgaGVyZSBpbnN0ZWFkIG9mIGxldHRpbmcKICAgICAgICAgICAgIyB0aGUgbG9nZ2luZyBtb2R1bGUgaGFuZGxlIHRoZSBpbnRlcnBvbGF0aW9uLiBUaGlzIGlzIGJlY2F1c2Ugd2UKICAgICAgICAgICAgIyB3YW50IGl0IHRvIGFwcGVhciBhcyBpZiBzb21lb25lIHR5cGVkIHRoaXMgZW50aXJlIG1lc3NhZ2Ugb3V0LgogICAgICAgICAgICBsb2dfbWVzc2FnZSA9ICJERVBSRUNBVElPTjogJXMiICUgbWVzc2FnZQoKICAgICAgICAgICAgIyBQaXBEZXByZWNhdGlvbldhcm5pbmdzIHRoYXQgYXJlIFBlbmRpbmcgc3RpbGwgaGF2ZSBhdCBsZWFzdCAyCiAgICAgICAgICAgICMgdmVyc2lvbnMgdG8gZ28gdW50aWwgdGhleSBhcmUgcmVtb3ZlZCBzbyB0aGV5IGNhbiBqdXN0IGJlCiAgICAgICAgICAgICMgd2FybmluZ3MuICBPdGhlcndpc2UsIHRoZXkgd2lsbCBiZSByZW1vdmVkIGluIHRoZSB2ZXJ5IG5leHQKICAgICAgICAgICAgIyB2ZXJzaW9uIG9mIHBpcC4gV2Ugd2FudCB0aGVzZSB0byBiZSBtb3JlIG9idmlvdXMgc28gd2UgdXNlIHRoZQogICAgICAgICAgICAjIEVSUk9SIGxvZ2dpbmcgbGV2ZWwuCiAgICAgICAgICAgIGlmIGlzc3ViY2xhc3MoY2F0ZWdvcnksIFBlbmRpbmcpOgogICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcobG9nX21lc3NhZ2UpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IobG9nX21lc3NhZ2UpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgX3dhcm5pbmdzX3Nob3d3YXJuaW5nKAogICAgICAgICAgICAgICAgbWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLCBsaW5lbm8sIGZpbGUsIGxpbmUsCiAgICAgICAgICAgICkKCgpkZWYgaW5zdGFsbF93YXJuaW5nX2xvZ2dlcigpOgogICAgIyBFbmFibGUgb3VyIERlcHJlY2F0aW9uIFdhcm5pbmdzCiAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoImRlZmF1bHQiLCBQaXBEZXByZWNhdGlvbldhcm5pbmcsIGFwcGVuZD1UcnVlKQoKICAgIGdsb2JhbCBfd2FybmluZ3Nfc2hvd3dhcm5pbmcKCiAgICBpZiBfd2FybmluZ3Nfc2hvd3dhcm5pbmcgaXMgTm9uZToKICAgICAgICBfd2FybmluZ3Nfc2hvd3dhcm5pbmcgPSB3YXJuaW5ncy5zaG93d2FybmluZwogICAgICAgIHdhcm5pbmdzLnNob3d3YXJuaW5nID0gX3Nob3d3YXJuaW5nClBLAwQUAAAAAAAAACEAvVo/sMsDAADLAwAAJQAAAHB5cGlfX3BpcF85XzBfMy9waXAvdXRpbHMvZW5jb2RpbmcucHlpbXBvcnQgY29kZWNzCmltcG9ydCBsb2NhbGUKaW1wb3J0IHJlCgoKQk9NUyA9IFsKICAgIChjb2RlY3MuQk9NX1VURjgsICd1dGY4JyksCiAgICAoY29kZWNzLkJPTV9VVEYxNiwgJ3V0ZjE2JyksCiAgICAoY29kZWNzLkJPTV9VVEYxNl9CRSwgJ3V0ZjE2LWJlJyksCiAgICAoY29kZWNzLkJPTV9VVEYxNl9MRSwgJ3V0ZjE2LWxlJyksCiAgICAoY29kZWNzLkJPTV9VVEYzMiwgJ3V0ZjMyJyksCiAgICAoY29kZWNzLkJPTV9VVEYzMl9CRSwgJ3V0ZjMyLWJlJyksCiAgICAoY29kZWNzLkJPTV9VVEYzMl9MRSwgJ3V0ZjMyLWxlJyksCl0KCkVOQ09ESU5HX1JFID0gcmUuY29tcGlsZShiJ2NvZGluZ1s6PV1ccyooWy1cdy5dKyknKQoKCmRlZiBhdXRvX2RlY29kZShkYXRhKToKICAgICIiIkNoZWNrIGEgYnl0ZXMgc3RyaW5nIGZvciBhIEJPTSB0byBjb3JyZWN0bHkgZGV0ZWN0IHRoZSBlbmNvZGluZwoKICAgIEZhbGxiYWNrIHRvIGxvY2FsZS5nZXRwcmVmZXJyZWRlbmNvZGluZyhGYWxzZSkgbGlrZSBvcGVuKCkgb24gUHl0aG9uMyIiIgogICAgZm9yIGJvbSwgZW5jb2RpbmcgaW4gQk9NUzoKICAgICAgICBpZiBkYXRhLnN0YXJ0c3dpdGgoYm9tKToKICAgICAgICAgICAgcmV0dXJuIGRhdGFbbGVuKGJvbSk6XS5kZWNvZGUoZW5jb2RpbmcpCiAgICAjIExldHMgY2hlY2sgdGhlIGZpcnN0IHR3byBsaW5lcyBhcyBpbiBQRVAyNjMKICAgIGZvciBsaW5lIGluIGRhdGEuc3BsaXQoYidcbicpWzoyXToKICAgICAgICBpZiBsaW5lWzA6MV0gPT0gYicjJyBhbmQgRU5DT0RJTkdfUkUuc2VhcmNoKGxpbmUpOgogICAgICAgICAgICBlbmNvZGluZyA9IEVOQ09ESU5HX1JFLnNlYXJjaChsaW5lKS5ncm91cHMoKVswXS5kZWNvZGUoJ2FzY2lpJykKICAgICAgICAgICAgcmV0dXJuIGRhdGEuZGVjb2RlKGVuY29kaW5nKQogICAgcmV0dXJuIGRhdGEuZGVjb2RlKGxvY2FsZS5nZXRwcmVmZXJyZWRlbmNvZGluZyhGYWxzZSkpClBLAwQUAAAAAAAAACEA8kPtwIMDAACDAwAAJwAAAHB5cGlfX3BpcF85XzBfMy9waXAvdXRpbHMvZmlsZXN5c3RlbS5weWltcG9ydCBvcwppbXBvcnQgb3MucGF0aAoKZnJvbSBwaXAuY29tcGF0IGltcG9ydCBnZXRfcGF0aF91aWQKCgpkZWYgY2hlY2tfcGF0aF9vd25lcihwYXRoKToKICAgICMgSWYgd2UgZG9uJ3QgaGF2ZSBhIHdheSB0byBjaGVjayB0aGUgZWZmZWN0aXZlIHVpZCBvZiB0aGlzIHByb2Nlc3MsIHRoZW4KICAgICMgd2UnbGwganVzdCBhc3N1bWUgdGhhdCB3ZSBvd24gdGhlIGRpcmVjdG9yeS4KICAgIGlmIG5vdCBoYXNhdHRyKG9zLCAiZ2V0ZXVpZCIpOgogICAgICAgIHJldHVybiBUcnVlCgogICAgcHJldmlvdXMgPSBOb25lCiAgICB3aGlsZSBwYXRoICE9IHByZXZpb3VzOgogICAgICAgIGlmIG9zLnBhdGgubGV4aXN0cyhwYXRoKToKICAgICAgICAgICAgIyBDaGVjayBpZiBwYXRoIGlzIHdyaXRhYmxlIGJ5IGN1cnJlbnQgdXNlci4KICAgICAgICAgICAgaWYgb3MuZ2V0ZXVpZCgpID09IDA6CiAgICAgICAgICAgICAgICAjIFNwZWNpYWwgaGFuZGxpbmcgZm9yIHJvb3QgdXNlciBpbiBvcmRlciB0byBoYW5kbGUgcHJvcGVybHkKICAgICAgICAgICAgICAgICMgY2FzZXMgd2hlcmUgdXNlcnMgdXNlIHN1ZG8gd2l0aG91dCAtSCBmbGFnLgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIHBhdGhfdWlkID0gZ2V0X3BhdGhfdWlkKHBhdGgpCiAgICAgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgICAgICAgIHJldHVybiBwYXRoX3VpZCA9PSAwCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gb3MuYWNjZXNzKHBhdGgsIG9zLldfT0spCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcHJldmlvdXMsIHBhdGggPSBwYXRoLCBvcy5wYXRoLmRpcm5hbWUocGF0aCkKUEsDBBQAAAAAAAAAIQAgNwV0ewsAAHsLAAAiAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC91dGlscy9nbGliYy5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgcmUKaW1wb3J0IGN0eXBlcwppbXBvcnQgcGxhdGZvcm0KaW1wb3J0IHdhcm5pbmdzCgoKZGVmIGdsaWJjX3ZlcnNpb25fc3RyaW5nKCk6CiAgICAiUmV0dXJucyBnbGliYyB2ZXJzaW9uIHN0cmluZywgb3IgTm9uZSBpZiBub3QgdXNpbmcgZ2xpYmMuIgoKICAgICMgY3R5cGVzLkNETEwoTm9uZSkgaW50ZXJuYWxseSBjYWxscyBkbG9wZW4oTlVMTCksIGFuZCBhcyB0aGUgZGxvcGVuCiAgICAjIG1hbnBhZ2Ugc2F5cywgIklmIGZpbGVuYW1lIGlzIE5VTEwsIHRoZW4gdGhlIHJldHVybmVkIGhhbmRsZSBpcyBmb3IgdGhlCiAgICAjIG1haW4gcHJvZ3JhbSIuIFRoaXMgd2F5IHdlIGNhbiBsZXQgdGhlIGxpbmtlciBkbyB0aGUgd29yayB0byBmaWd1cmUgb3V0CiAgICAjIHdoaWNoIGxpYmMgb3VyIHByb2Nlc3MgaXMgYWN0dWFsbHkgdXNpbmcuCiAgICBwcm9jZXNzX25hbWVzcGFjZSA9IGN0eXBlcy5DRExMKE5vbmUpCiAgICB0cnk6CiAgICAgICAgZ251X2dldF9saWJjX3ZlcnNpb24gPSBwcm9jZXNzX25hbWVzcGFjZS5nbnVfZ2V0X2xpYmNfdmVyc2lvbgogICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICMgU3ltYm9sIGRvZXNuJ3QgZXhpc3QgLT4gdGhlcmVmb3JlLCB3ZSBhcmUgbm90IGxpbmtlZCB0bwogICAgICAgICMgZ2xpYmMuCiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAjIENhbGwgZ251X2dldF9saWJjX3ZlcnNpb24sIHdoaWNoIHJldHVybnMgYSBzdHJpbmcgbGlrZSAiMi41IgogICAgZ251X2dldF9saWJjX3ZlcnNpb24ucmVzdHlwZSA9IGN0eXBlcy5jX2NoYXJfcAogICAgdmVyc2lvbl9zdHIgPSBnbnVfZ2V0X2xpYmNfdmVyc2lvbigpCiAgICAjIHB5MiAvIHB5MyBjb21wYXRpYmlsaXR5OgogICAgaWYgbm90IGlzaW5zdGFuY2UodmVyc2lvbl9zdHIsIHN0cik6CiAgICAgICAgdmVyc2lvbl9zdHIgPSB2ZXJzaW9uX3N0ci5kZWNvZGUoImFzY2lpIikKCiAgICByZXR1cm4gdmVyc2lvbl9zdHIKCgojIFNlcGFyYXRlZCBvdXQgZnJvbSBoYXZlX2NvbXBhdGlibGVfZ2xpYmMgZm9yIGVhc2llciB1bml0IHRlc3RpbmcKZGVmIGNoZWNrX2dsaWJjX3ZlcnNpb24odmVyc2lvbl9zdHIsIHJlcXVpcmVkX21ham9yLCBtaW5pbXVtX21pbm9yKToKICAgICMgUGFyc2Ugc3RyaW5nIGFuZCBjaGVjayBhZ2FpbnN0IHJlcXVlc3RlZCB2ZXJzaW9uLgogICAgIwogICAgIyBXZSB1c2UgYSByZWdleHAgaW5zdGVhZCBvZiBzdHIuc3BsaXQgYmVjYXVzZSB3ZSB3YW50IHRvIGRpc2NhcmQgYW55CiAgICAjIHJhbmRvbSBqdW5rIHRoYXQgbWlnaHQgY29tZSBhZnRlciB0aGUgbWlub3IgdmVyc2lvbiAtLSB0aGlzIG1pZ2h0IGhhcHBlbgogICAgIyBpbiBwYXRjaGVkL2ZvcmtlZCB2ZXJzaW9ucyBvZiBnbGliYyAoZS5nLiBMaW5hcm8ncyB2ZXJzaW9uIG9mIGdsaWJjCiAgICAjIHVzZXMgdmVyc2lvbiBzdHJpbmdzIGxpa2UgIjIuMjAtMjAxNC4xMSIpLiBTZWUgZ2gtMzU4OC4KICAgIG0gPSByZS5tYXRjaChyIig/UDxtYWpvcj5bMC05XSspXC4oP1A8bWlub3I+WzAtOV0rKSIsIHZlcnNpb25fc3RyKQogICAgaWYgbm90IG06CiAgICAgICAgd2FybmluZ3Mud2FybigiRXhwZWN0ZWQgZ2xpYmMgdmVyc2lvbiB3aXRoIDIgY29tcG9uZW50cyBtYWpvci5taW5vciwiCiAgICAgICAgICAgICAgICAgICAgICAiIGdvdDogJXMiICUgdmVyc2lvbl9zdHIsIFJ1bnRpbWVXYXJuaW5nKQogICAgICAgIHJldHVybiBGYWxzZQogICAgcmV0dXJuIChpbnQobS5ncm91cCgibWFqb3IiKSkgPT0gcmVxdWlyZWRfbWFqb3IgYW5kCiAgICAgICAgICAgIGludChtLmdyb3VwKCJtaW5vciIpKSA+PSBtaW5pbXVtX21pbm9yKQoKCmRlZiBoYXZlX2NvbXBhdGlibGVfZ2xpYmMocmVxdWlyZWRfbWFqb3IsIG1pbmltdW1fbWlub3IpOgogICAgdmVyc2lvbl9zdHIgPSBnbGliY192ZXJzaW9uX3N0cmluZygpCiAgICBpZiB2ZXJzaW9uX3N0ciBpcyBOb25lOgogICAgICAgIHJldHVybiBGYWxzZQogICAgcmV0dXJuIGNoZWNrX2dsaWJjX3ZlcnNpb24odmVyc2lvbl9zdHIsIHJlcXVpcmVkX21ham9yLCBtaW5pbXVtX21pbm9yKQoKCiMgcGxhdGZvcm0ubGliY192ZXIgcmVndWxhcmx5IHJldHVybnMgY29tcGxldGVseSBub25zZW5zaWNhbCBnbGliYwojIHZlcnNpb25zLiBFLmcuIG9uIG15IGNvbXB1dGVyLCBwbGF0Zm9ybSBzYXlzOgojCiMgICB+JCBweXRob24yLjcgLWMgJ2ltcG9ydCBwbGF0Zm9ybTsgcHJpbnQocGxhdGZvcm0ubGliY192ZXIoKSknCiMgICAoJ2dsaWJjJywgJzIuNycpCiMgICB+JCBweXRob24zLjUgLWMgJ2ltcG9ydCBwbGF0Zm9ybTsgcHJpbnQocGxhdGZvcm0ubGliY192ZXIoKSknCiMgICAoJ2dsaWJjJywgJzIuOScpCiMKIyBCdXQgdGhlIHRydXRoIGlzOgojCiMgICB+JCBsZGQgLS12ZXJzaW9uCiMgICBsZGQgKERlYmlhbiBHTElCQyAyLjIyLTExKSAyLjIyCiMKIyBUaGlzIGlzIHVuZm9ydHVuYXRlLCBiZWNhdXNlIGl0IG1lYW5zIHRoYXQgdGhlIGxpbmVoYXVsIGRhdGEgb24gbGliYwojIHZlcnNpb25zIHRoYXQgd2FzIGdlbmVyYXRlZCBieSBwaXAgOC4xLjIgYW5kIGVhcmxpZXIgaXMgdXNlbGVzcyBhbmQKIyBtaXNsZWFkaW5nLiBTb2x1dGlvbjogaW5zdGVhZCBvZiB1c2luZyBwbGF0Zm9ybSwgdXNlIG91ciBjb2RlIHRoYXQgYWN0dWFsbHkKIyB3b3Jrcy4KZGVmIGxpYmNfdmVyKCk6CiAgICBnbGliY192ZXJzaW9uID0gZ2xpYmNfdmVyc2lvbl9zdHJpbmcoKQogICAgaWYgZ2xpYmNfdmVyc2lvbiBpcyBOb25lOgogICAgICAgICMgRm9yIG5vbi1nbGliYyBwbGF0Zm9ybXMsIGZhbGwgYmFjayBvbiBwbGF0Zm9ybS5saWJjX3ZlcgogICAgICAgIHJldHVybiBwbGF0Zm9ybS5saWJjX3ZlcigpCiAgICBlbHNlOgogICAgICAgIHJldHVybiAoImdsaWJjIiwgZ2xpYmNfdmVyc2lvbikKUEsDBBQAAAAAAAAAIQCpNOkEMgsAADILAAAjAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC91dGlscy9oYXNoZXMucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGhhc2hsaWIKCmZyb20gcGlwLmV4Y2VwdGlvbnMgaW1wb3J0IEhhc2hNaXNtYXRjaCwgSGFzaE1pc3NpbmcsIEluc3RhbGxhdGlvbkVycm9yCmZyb20gcGlwLnV0aWxzIGltcG9ydCByZWFkX2NodW5rcwpmcm9tIHBpcC5fdmVuZG9yLnNpeCBpbXBvcnQgaXRlcml0ZW1zLCBpdGVya2V5cywgaXRlcnZhbHVlcwoKCiMgVGhlIHJlY29tbWVuZGVkIGhhc2ggYWxnbyBvZiB0aGUgbW9tZW50LiBDaGFuZ2UgdGhpcyB3aGVuZXZlciB0aGUgc3RhdGUgb2YKIyB0aGUgYXJ0IGNoYW5nZXM7IGl0IHdvbid0IGh1cnQgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KRkFWT1JJVEVfSEFTSCA9ICdzaGEyNTYnCgoKIyBOYW1lcyBvZiBoYXNobGliIGFsZ29yaXRobXMgYWxsb3dlZCBieSB0aGUgLS1oYXNoIG9wdGlvbiBhbmQgYGBwaXAgaGFzaGBgCiMgQ3VycmVudGx5LCB0aG9zZSBhcmUgdGhlIG9uZXMgYXQgbGVhc3QgYXMgY29sbGlzaW9uLXJlc2lzdGFudCBhcyBzaGEyNTYuClNUUk9OR19IQVNIRVMgPSBbJ3NoYTI1NicsICdzaGEzODQnLCAnc2hhNTEyJ10KCgpjbGFzcyBIYXNoZXMob2JqZWN0KToKICAgICIiIkEgd3JhcHBlciB0aGF0IGJ1aWxkcyBtdWx0aXBsZSBoYXNoZXMgYXQgb25jZSBhbmQgY2hlY2tzIHRoZW0gYWdhaW5zdAogICAga25vd24tZ29vZCB2YWx1ZXMKCiAgICAiIiIKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBoYXNoZXM9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgOnBhcmFtIGhhc2hlczogQSBkaWN0IG9mIGFsZ29yaXRobSBuYW1lcyBwb2ludGluZyB0byBsaXN0cyBvZiBhbGxvd2VkCiAgICAgICAgICAgIGhleCBkaWdlc3RzCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5fYWxsb3dlZCA9IHt9IGlmIGhhc2hlcyBpcyBOb25lIGVsc2UgaGFzaGVzCgogICAgZGVmIGNoZWNrX2FnYWluc3RfY2h1bmtzKHNlbGYsIGNodW5rcyk6CiAgICAgICAgIiIiQ2hlY2sgZ29vZCBoYXNoZXMgYWdhaW5zdCBvbmVzIGJ1aWx0IGZyb20gaXRlcmFibGUgb2YgY2h1bmtzIG9mCiAgICAgICAgZGF0YS4KCiAgICAgICAgUmFpc2UgSGFzaE1pc21hdGNoIGlmIG5vbmUgbWF0Y2guCgogICAgICAgICIiIgogICAgICAgIGdvdHMgPSB7fQogICAgICAgIGZvciBoYXNoX25hbWUgaW4gaXRlcmtleXMoc2VsZi5fYWxsb3dlZCk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGdvdHNbaGFzaF9uYW1lXSA9IGhhc2hsaWIubmV3KGhhc2hfbmFtZSkKICAgICAgICAgICAgZXhjZXB0IChWYWx1ZUVycm9yLCBUeXBlRXJyb3IpOgogICAgICAgICAgICAgICAgcmFpc2UgSW5zdGFsbGF0aW9uRXJyb3IoJ1Vua25vd24gaGFzaCBuYW1lOiAlcycgJSBoYXNoX25hbWUpCgogICAgICAgIGZvciBjaHVuayBpbiBjaHVua3M6CiAgICAgICAgICAgIGZvciBoYXNoIGluIGl0ZXJ2YWx1ZXMoZ290cyk6CiAgICAgICAgICAgICAgICBoYXNoLnVwZGF0ZShjaHVuaykKCiAgICAgICAgZm9yIGhhc2hfbmFtZSwgZ290IGluIGl0ZXJpdGVtcyhnb3RzKToKICAgICAgICAgICAgaWYgZ290LmhleGRpZ2VzdCgpIGluIHNlbGYuX2FsbG93ZWRbaGFzaF9uYW1lXToKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgIHNlbGYuX3JhaXNlKGdvdHMpCgogICAgZGVmIF9yYWlzZShzZWxmLCBnb3RzKToKICAgICAgICByYWlzZSBIYXNoTWlzbWF0Y2goc2VsZi5fYWxsb3dlZCwgZ290cykKCiAgICBkZWYgY2hlY2tfYWdhaW5zdF9maWxlKHNlbGYsIGZpbGUpOgogICAgICAgICIiIkNoZWNrIGdvb2QgaGFzaGVzIGFnYWluc3QgYSBmaWxlLWxpa2Ugb2JqZWN0CgogICAgICAgIFJhaXNlIEhhc2hNaXNtYXRjaCBpZiBub25lIG1hdGNoLgoKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5jaGVja19hZ2FpbnN0X2NodW5rcyhyZWFkX2NodW5rcyhmaWxlKSkKCiAgICBkZWYgY2hlY2tfYWdhaW5zdF9wYXRoKHNlbGYsIHBhdGgpOgogICAgICAgIHdpdGggb3BlbihwYXRoLCAncmInKSBhcyBmaWxlOgogICAgICAgICAgICByZXR1cm4gc2VsZi5jaGVja19hZ2FpbnN0X2ZpbGUoZmlsZSkKCiAgICBkZWYgX19ub256ZXJvX18oc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIHdoZXRoZXIgSSBrbm93IGFueSBrbm93bi1nb29kIGhhc2hlcy4iIiIKICAgICAgICByZXR1cm4gYm9vbChzZWxmLl9hbGxvd2VkKQoKICAgIGRlZiBfX2Jvb2xfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fX25vbnplcm9fXygpCgoKY2xhc3MgTWlzc2luZ0hhc2hlcyhIYXNoZXMpOgogICAgIiIiQSB3b3JrYWxpa2UgZm9yIEhhc2hlcyB1c2VkIHdoZW4gd2UncmUgbWlzc2luZyBhIGhhc2ggZm9yIGEgcmVxdWlyZW1lbnQKCiAgICBJdCBjb21wdXRlcyB0aGUgYWN0dWFsIGhhc2ggb2YgdGhlIHJlcXVpcmVtZW50IGFuZCByYWlzZXMgYSBIYXNoTWlzc2luZwogICAgZXhjZXB0aW9uIHNob3dpbmcgaXQgdG8gdGhlIHVzZXIuCgogICAgIiIiCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgIiIiRG9uJ3Qgb2ZmZXIgdGhlIGBgaGFzaGVzYGAga3dhcmcuIiIiCiAgICAgICAgIyBQYXNzIG91ciBmYXZvcml0ZSBoYXNoIGluIHRvIGdlbmVyYXRlIGEgImdvdHRlbiBoYXNoIi4gV2l0aCB0aGUKICAgICAgICAjIGVtcHR5IGxpc3QsIGl0IHdpbGwgbmV2ZXIgbWF0Y2gsIHNvIGFuIGVycm9yIHdpbGwgYWx3YXlzIHJhaXNlLgogICAgICAgIHN1cGVyKE1pc3NpbmdIYXNoZXMsIHNlbGYpLl9faW5pdF9fKGhhc2hlcz17RkFWT1JJVEVfSEFTSDogW119KQoKICAgIGRlZiBfcmFpc2Uoc2VsZiwgZ290cyk6CiAgICAgICAgcmFpc2UgSGFzaE1pc3NpbmcoZ290c1tGQVZPUklURV9IQVNIXS5oZXhkaWdlc3QoKSkKUEsDBBQAAAAAAAAAIQBnJtd4/wwAAP8MAAAkAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC91dGlscy9sb2dnaW5nLnB5ZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBjb250ZXh0bGliCmltcG9ydCBsb2dnaW5nCmltcG9ydCBsb2dnaW5nLmhhbmRsZXJzCmltcG9ydCBvcwoKdHJ5OgogICAgaW1wb3J0IHRocmVhZGluZwpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBpbXBvcnQgZHVtbXlfdGhyZWFkaW5nIGFzIHRocmVhZGluZwoKZnJvbSBwaXAuY29tcGF0IGltcG9ydCBXSU5ET1dTCmZyb20gcGlwLnV0aWxzIGltcG9ydCBlbnN1cmVfZGlyCgp0cnk6CiAgICBmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCBjb2xvcmFtYQojIExvdHMgb2YgZGlmZmVyZW50IGVycm9ycyBjYW4gY29tZSBmcm9tIHRoaXMsIGluY2x1ZGluZyBTeXN0ZW1FcnJvciBhbmQKIyBJbXBvcnRFcnJvci4KZXhjZXB0IEV4Y2VwdGlvbjoKICAgIGNvbG9yYW1hID0gTm9uZQoKCl9sb2dfc3RhdGUgPSB0aHJlYWRpbmcubG9jYWwoKQpfbG9nX3N0YXRlLmluZGVudGF0aW9uID0gMAoKCkBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCmRlZiBpbmRlbnRfbG9nKG51bT0yKToKICAgICIiIgogICAgQSBjb250ZXh0IG1hbmFnZXIgd2hpY2ggd2lsbCBjYXVzZSB0aGUgbG9nIG91dHB1dCB0byBiZSBpbmRlbnRlZCBmb3IgYW55CiAgICBsb2cgbWVzc2FnZXMgZW1pdHRlZCBpbnNpZGUgaXQuCiAgICAiIiIKICAgIF9sb2dfc3RhdGUuaW5kZW50YXRpb24gKz0gbnVtCiAgICB0cnk6CiAgICAgICAgeWllbGQKICAgIGZpbmFsbHk6CiAgICAgICAgX2xvZ19zdGF0ZS5pbmRlbnRhdGlvbiAtPSBudW0KCgpkZWYgZ2V0X2luZGVudGF0aW9uKCk6CiAgICByZXR1cm4gZ2V0YXR0cihfbG9nX3N0YXRlLCAnaW5kZW50YXRpb24nLCAwKQoKCmNsYXNzIEluZGVudGluZ0Zvcm1hdHRlcihsb2dnaW5nLkZvcm1hdHRlcik6CgogICAgZGVmIGZvcm1hdChzZWxmLCByZWNvcmQpOgogICAgICAgICIiIgogICAgICAgIENhbGxzIHRoZSBzdGFuZGFyZCBmb3JtYXR0ZXIsIGJ1dCB3aWxsIGluZGVudCBhbGwgb2YgdGhlIGxvZyBtZXNzYWdlcwogICAgICAgIGJ5IG91ciBjdXJyZW50IGluZGVudGF0aW9uIGxldmVsLgogICAgICAgICIiIgogICAgICAgIGZvcm1hdHRlZCA9IGxvZ2dpbmcuRm9ybWF0dGVyLmZvcm1hdChzZWxmLCByZWNvcmQpCiAgICAgICAgZm9ybWF0dGVkID0gIiIuam9pbihbCiAgICAgICAgICAgICgiICIgKiBnZXRfaW5kZW50YXRpb24oKSkgKyBsaW5lCiAgICAgICAgICAgIGZvciBsaW5lIGluIGZvcm1hdHRlZC5zcGxpdGxpbmVzKFRydWUpCiAgICAgICAgXSkKICAgICAgICByZXR1cm4gZm9ybWF0dGVkCgoKZGVmIF9jb2xvcl93cmFwKCpjb2xvcnMpOgogICAgZGVmIHdyYXBwZWQoaW5wKToKICAgICAgICByZXR1cm4gIiIuam9pbihsaXN0KGNvbG9ycykgKyBbaW5wLCBjb2xvcmFtYS5TdHlsZS5SRVNFVF9BTExdKQogICAgcmV0dXJuIHdyYXBwZWQKCgpjbGFzcyBDb2xvcml6ZWRTdHJlYW1IYW5kbGVyKGxvZ2dpbmcuU3RyZWFtSGFuZGxlcik6CgogICAgIyBEb24ndCBidWlsZCB1cCBhIGxpc3Qgb2YgY29sb3JzIGlmIHdlIGRvbid0IGhhdmUgY29sb3JhbWEKICAgIGlmIGNvbG9yYW1hOgogICAgICAgIENPTE9SUyA9IFsKICAgICAgICAgICAgIyBUaGlzIG5lZWRzIHRvIGJlIGluIG9yZGVyIGZyb20gaGlnaGVzdCBsb2dnaW5nIGxldmVsIHRvIGxvd2VzdC4KICAgICAgICAgICAgKGxvZ2dpbmcuRVJST1IsIF9jb2xvcl93cmFwKGNvbG9yYW1hLkZvcmUuUkVEKSksCiAgICAgICAgICAgIChsb2dnaW5nLldBUk5JTkcsIF9jb2xvcl93cmFwKGNvbG9yYW1hLkZvcmUuWUVMTE9XKSksCiAgICAgICAgXQogICAgZWxzZToKICAgICAgICBDT0xPUlMgPSBbXQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW09Tm9uZSk6CiAgICAgICAgbG9nZ2luZy5TdHJlYW1IYW5kbGVyLl9faW5pdF9fKHNlbGYsIHN0cmVhbSkKCiAgICAgICAgaWYgV0lORE9XUyBhbmQgY29sb3JhbWE6CiAgICAgICAgICAgIHNlbGYuc3RyZWFtID0gY29sb3JhbWEuQW5zaVRvV2luMzIoc2VsZi5zdHJlYW0pCgogICAgZGVmIHNob3VsZF9jb2xvcihzZWxmKToKICAgICAgICAjIERvbid0IGNvbG9yaXplIHRoaW5ncyBpZiB3ZSBkbyBub3QgaGF2ZSBjb2xvcmFtYQogICAgICAgIGlmIG5vdCBjb2xvcmFtYToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIHJlYWxfc3RyZWFtID0gKAogICAgICAgICAgICBzZWxmLnN0cmVhbSBpZiBub3QgaXNpbnN0YW5jZShzZWxmLnN0cmVhbSwgY29sb3JhbWEuQW5zaVRvV2luMzIpCiAgICAgICAgICAgIGVsc2Ugc2VsZi5zdHJlYW0ud3JhcHBlZAogICAgICAgICkKCiAgICAgICAgIyBJZiB0aGUgc3RyZWFtIGlzIGEgdHR5IHdlIHNob3VsZCBjb2xvciBpdAogICAgICAgIGlmIGhhc2F0dHIocmVhbF9zdHJlYW0sICJpc2F0dHkiKSBhbmQgcmVhbF9zdHJlYW0uaXNhdHR5KCk6CiAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgICAgICMgSWYgd2UgaGF2ZSBhbiBBU05JIHRlcm0gd2Ugc2hvdWxkIGNvbG9yIGl0CiAgICAgICAgaWYgb3MuZW52aXJvbi5nZXQoIlRFUk0iKSA9PSAiQU5TSSI6CiAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgICAgICMgSWYgYW55dGhpbmcgZWxzZSB3ZSBzaG91bGQgbm90IGNvbG9yIGl0CiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIGZvcm1hdChzZWxmLCByZWNvcmQpOgogICAgICAgIG1zZyA9IGxvZ2dpbmcuU3RyZWFtSGFuZGxlci5mb3JtYXQoc2VsZiwgcmVjb3JkKQoKICAgICAgICBpZiBzZWxmLnNob3VsZF9jb2xvcigpOgogICAgICAgICAgICBmb3IgbGV2ZWwsIGNvbG9yIGluIHNlbGYuQ09MT1JTOgogICAgICAgICAgICAgICAgaWYgcmVjb3JkLmxldmVsbm8gPj0gbGV2ZWw6CiAgICAgICAgICAgICAgICAgICAgbXNnID0gY29sb3IobXNnKQogICAgICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgIHJldHVybiBtc2cKCgpjbGFzcyBCZXR0ZXJSb3RhdGluZ0ZpbGVIYW5kbGVyKGxvZ2dpbmcuaGFuZGxlcnMuUm90YXRpbmdGaWxlSGFuZGxlcik6CgogICAgZGVmIF9vcGVuKHNlbGYpOgogICAgICAgIGVuc3VyZV9kaXIob3MucGF0aC5kaXJuYW1lKHNlbGYuYmFzZUZpbGVuYW1lKSkKICAgICAgICByZXR1cm4gbG9nZ2luZy5oYW5kbGVycy5Sb3RhdGluZ0ZpbGVIYW5kbGVyLl9vcGVuKHNlbGYpCgoKY2xhc3MgTWF4TGV2ZWxGaWx0ZXIobG9nZ2luZy5GaWx0ZXIpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsZXZlbCk6CiAgICAgICAgc2VsZi5sZXZlbCA9IGxldmVsCgogICAgZGVmIGZpbHRlcihzZWxmLCByZWNvcmQpOgogICAgICAgIHJldHVybiByZWNvcmQubGV2ZWxubyA8IHNlbGYubGV2ZWwKUEsDBBQAAAAAAAAAIQBIVNjqTxUAAE8VAAAlAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC91dGlscy9vdXRkYXRlZC5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgZGF0ZXRpbWUKaW1wb3J0IGpzb24KaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG9zLnBhdGgKaW1wb3J0IHN5cwoKZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgbG9ja2ZpbGUKZnJvbSBwaXAuX3ZlbmRvci5wYWNrYWdpbmcgaW1wb3J0IHZlcnNpb24gYXMgcGFja2FnaW5nX3ZlcnNpb24KCmZyb20gcGlwLmNvbXBhdCBpbXBvcnQgdG90YWxfc2Vjb25kcywgV0lORE9XUwpmcm9tIHBpcC5tb2RlbHMgaW1wb3J0IFB5UEkKZnJvbSBwaXAubG9jYXRpb25zIGltcG9ydCBVU0VSX0NBQ0hFX0RJUiwgcnVubmluZ191bmRlcl92aXJ0dWFsZW52CmZyb20gcGlwLnV0aWxzIGltcG9ydCBlbnN1cmVfZGlyLCBnZXRfaW5zdGFsbGVkX3ZlcnNpb24KZnJvbSBwaXAudXRpbHMuZmlsZXN5c3RlbSBpbXBvcnQgY2hlY2tfcGF0aF9vd25lcgoKClNFTEZDSEVDS19EQVRFX0ZNVCA9ICIlWS0lbS0lZFQlSDolTTolU1oiCgoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKY2xhc3MgVmlydHVhbGVudlNlbGZDaGVja1N0YXRlKG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc2VsZi5zdGF0ZWZpbGVfcGF0aCA9IG9zLnBhdGguam9pbihzeXMucHJlZml4LCAicGlwLXNlbGZjaGVjay5qc29uIikKCiAgICAgICAgIyBMb2FkIHRoZSBleGlzdGluZyBzdGF0ZQogICAgICAgIHRyeToKICAgICAgICAgICAgd2l0aCBvcGVuKHNlbGYuc3RhdGVmaWxlX3BhdGgpIGFzIHN0YXRlZmlsZToKICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBqc29uLmxvYWQoc3RhdGVmaWxlKQogICAgICAgIGV4Y2VwdCAoSU9FcnJvciwgVmFsdWVFcnJvcik6CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSB7fQoKICAgIGRlZiBzYXZlKHNlbGYsIHB5cGlfdmVyc2lvbiwgY3VycmVudF90aW1lKToKICAgICAgICAjIEF0dGVtcHQgdG8gd3JpdGUgb3V0IG91ciB2ZXJzaW9uIGNoZWNrIGZpbGUKICAgICAgICB3aXRoIG9wZW4oc2VsZi5zdGF0ZWZpbGVfcGF0aCwgInciKSBhcyBzdGF0ZWZpbGU6CiAgICAgICAgICAgIGpzb24uZHVtcCgKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibGFzdF9jaGVjayI6IGN1cnJlbnRfdGltZS5zdHJmdGltZShTRUxGQ0hFQ0tfREFURV9GTVQpLAogICAgICAgICAgICAgICAgICAgICJweXBpX3ZlcnNpb24iOiBweXBpX3ZlcnNpb24sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgc3RhdGVmaWxlLAogICAgICAgICAgICAgICAgc29ydF9rZXlzPVRydWUsCiAgICAgICAgICAgICAgICBzZXBhcmF0b3JzPSgiLCIsICI6IikKICAgICAgICAgICAgKQoKCmNsYXNzIEdsb2JhbFNlbGZDaGVja1N0YXRlKG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc2VsZi5zdGF0ZWZpbGVfcGF0aCA9IG9zLnBhdGguam9pbihVU0VSX0NBQ0hFX0RJUiwgInNlbGZjaGVjay5qc29uIikKCiAgICAgICAgIyBMb2FkIHRoZSBleGlzdGluZyBzdGF0ZQogICAgICAgIHRyeToKICAgICAgICAgICAgd2l0aCBvcGVuKHNlbGYuc3RhdGVmaWxlX3BhdGgpIGFzIHN0YXRlZmlsZToKICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBqc29uLmxvYWQoc3RhdGVmaWxlKVtzeXMucHJlZml4XQogICAgICAgIGV4Y2VwdCAoSU9FcnJvciwgVmFsdWVFcnJvciwgS2V5RXJyb3IpOgogICAgICAgICAgICBzZWxmLnN0YXRlID0ge30KCiAgICBkZWYgc2F2ZShzZWxmLCBweXBpX3ZlcnNpb24sIGN1cnJlbnRfdGltZSk6CiAgICAgICAgIyBDaGVjayB0byBtYWtlIHN1cmUgdGhhdCB3ZSBvd24gdGhlIGRpcmVjdG9yeQogICAgICAgIGlmIG5vdCBjaGVja19wYXRoX293bmVyKG9zLnBhdGguZGlybmFtZShzZWxmLnN0YXRlZmlsZV9wYXRoKSk6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIE5vdyB0aGF0IHdlJ3ZlIGVuc3VyZWQgdGhlIGRpcmVjdG9yeSBpcyBvd25lZCBieSB0aGlzIHVzZXIsIHdlJ2xsIGdvCiAgICAgICAgIyBhaGVhZCBhbmQgbWFrZSBzdXJlIHRoYXQgYWxsIG91ciBkaXJlY3RvcmllcyBhcmUgY3JlYXRlZC4KICAgICAgICBlbnN1cmVfZGlyKG9zLnBhdGguZGlybmFtZShzZWxmLnN0YXRlZmlsZV9wYXRoKSkKCiAgICAgICAgIyBBdHRlbXB0IHRvIHdyaXRlIG91dCBvdXIgdmVyc2lvbiBjaGVjayBmaWxlCiAgICAgICAgd2l0aCBsb2NrZmlsZS5Mb2NrRmlsZShzZWxmLnN0YXRlZmlsZV9wYXRoKToKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc2VsZi5zdGF0ZWZpbGVfcGF0aCk6CiAgICAgICAgICAgICAgICB3aXRoIG9wZW4oc2VsZi5zdGF0ZWZpbGVfcGF0aCkgYXMgc3RhdGVmaWxlOgogICAgICAgICAgICAgICAgICAgIHN0YXRlID0ganNvbi5sb2FkKHN0YXRlZmlsZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHN0YXRlID0ge30KCiAgICAgICAgICAgIHN0YXRlW3N5cy5wcmVmaXhdID0gewogICAgICAgICAgICAgICAgImxhc3RfY2hlY2siOiBjdXJyZW50X3RpbWUuc3RyZnRpbWUoU0VMRkNIRUNLX0RBVEVfRk1UKSwKICAgICAgICAgICAgICAgICJweXBpX3ZlcnNpb24iOiBweXBpX3ZlcnNpb24sCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHdpdGggb3BlbihzZWxmLnN0YXRlZmlsZV9wYXRoLCAidyIpIGFzIHN0YXRlZmlsZToKICAgICAgICAgICAgICAgIGpzb24uZHVtcChzdGF0ZSwgc3RhdGVmaWxlLCBzb3J0X2tleXM9VHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBzZXBhcmF0b3JzPSgiLCIsICI6IikpCgoKZGVmIGxvYWRfc2VsZmNoZWNrX3N0YXRlZmlsZSgpOgogICAgaWYgcnVubmluZ191bmRlcl92aXJ0dWFsZW52KCk6CiAgICAgICAgcmV0dXJuIFZpcnR1YWxlbnZTZWxmQ2hlY2tTdGF0ZSgpCiAgICBlbHNlOgogICAgICAgIHJldHVybiBHbG9iYWxTZWxmQ2hlY2tTdGF0ZSgpCgoKZGVmIHBpcF92ZXJzaW9uX2NoZWNrKHNlc3Npb24pOgogICAgIiIiQ2hlY2sgZm9yIGFuIHVwZGF0ZSBmb3IgcGlwLgoKICAgIExpbWl0IHRoZSBmcmVxdWVuY3kgb2YgY2hlY2tzIHRvIG9uY2UgcGVyIHdlZWsuIFN0YXRlIGlzIHN0b3JlZCBlaXRoZXIgaW4KICAgIHRoZSBhY3RpdmUgdmlydHVhbGVudiBvciBpbiB0aGUgdXNlcidzIFVTRVJfQ0FDSEVfRElSIGtleWVkIG9mZiB0aGUgcHJlZml4CiAgICBvZiB0aGUgcGlwIHNjcmlwdCBwYXRoLgogICAgIiIiCiAgICBpbnN0YWxsZWRfdmVyc2lvbiA9IGdldF9pbnN0YWxsZWRfdmVyc2lvbigicGlwIikKICAgIGlmIGluc3RhbGxlZF92ZXJzaW9uIGlzIE5vbmU6CiAgICAgICAgcmV0dXJuCgogICAgcGlwX3ZlcnNpb24gPSBwYWNrYWdpbmdfdmVyc2lvbi5wYXJzZShpbnN0YWxsZWRfdmVyc2lvbikKICAgIHB5cGlfdmVyc2lvbiA9IE5vbmUKCiAgICB0cnk6CiAgICAgICAgc3RhdGUgPSBsb2FkX3NlbGZjaGVja19zdGF0ZWZpbGUoKQoKICAgICAgICBjdXJyZW50X3RpbWUgPSBkYXRldGltZS5kYXRldGltZS51dGNub3coKQogICAgICAgICMgRGV0ZXJtaW5lIGlmIHdlIG5lZWQgdG8gcmVmcmVzaCB0aGUgc3RhdGUKICAgICAgICBpZiAibGFzdF9jaGVjayIgaW4gc3RhdGUuc3RhdGUgYW5kICJweXBpX3ZlcnNpb24iIGluIHN0YXRlLnN0YXRlOgogICAgICAgICAgICBsYXN0X2NoZWNrID0gZGF0ZXRpbWUuZGF0ZXRpbWUuc3RycHRpbWUoCiAgICAgICAgICAgICAgICBzdGF0ZS5zdGF0ZVsibGFzdF9jaGVjayJdLAogICAgICAgICAgICAgICAgU0VMRkNIRUNLX0RBVEVfRk1UCiAgICAgICAgICAgICkKICAgICAgICAgICAgaWYgdG90YWxfc2Vjb25kcyhjdXJyZW50X3RpbWUgLSBsYXN0X2NoZWNrKSA8IDcgKiAyNCAqIDYwICogNjA6CiAgICAgICAgICAgICAgICBweXBpX3ZlcnNpb24gPSBzdGF0ZS5zdGF0ZVsicHlwaV92ZXJzaW9uIl0KCiAgICAgICAgIyBSZWZyZXNoIHRoZSB2ZXJzaW9uIGlmIHdlIG5lZWQgdG8gb3IganVzdCBzZWUgaWYgd2UgbmVlZCB0byB3YXJuCiAgICAgICAgaWYgcHlwaV92ZXJzaW9uIGlzIE5vbmU6CiAgICAgICAgICAgIHJlc3AgPSBzZXNzaW9uLmdldCgKICAgICAgICAgICAgICAgIFB5UEkucGlwX2pzb25fdXJsLAogICAgICAgICAgICAgICAgaGVhZGVycz17IkFjY2VwdCI6ICJhcHBsaWNhdGlvbi9qc29uIn0sCiAgICAgICAgICAgICkKICAgICAgICAgICAgcmVzcC5yYWlzZV9mb3Jfc3RhdHVzKCkKICAgICAgICAgICAgcHlwaV92ZXJzaW9uID0gWwogICAgICAgICAgICAgICAgdiBmb3IgdiBpbiBzb3J0ZWQoCiAgICAgICAgICAgICAgICAgICAgbGlzdChyZXNwLmpzb24oKVsicmVsZWFzZXMiXSksCiAgICAgICAgICAgICAgICAgICAga2V5PXBhY2thZ2luZ192ZXJzaW9uLnBhcnNlLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgaWYgbm90IHBhY2thZ2luZ192ZXJzaW9uLnBhcnNlKHYpLmlzX3ByZXJlbGVhc2UKICAgICAgICAgICAgXVstMV0KCiAgICAgICAgICAgICMgc2F2ZSB0aGF0IHdlJ3ZlIHBlcmZvcm1lZCBhIGNoZWNrCiAgICAgICAgICAgIHN0YXRlLnNhdmUocHlwaV92ZXJzaW9uLCBjdXJyZW50X3RpbWUpCgogICAgICAgIHJlbW90ZV92ZXJzaW9uID0gcGFja2FnaW5nX3ZlcnNpb24ucGFyc2UocHlwaV92ZXJzaW9uKQoKICAgICAgICAjIERldGVybWluZSBpZiBvdXIgcHlwaV92ZXJzaW9uIGlzIG9sZGVyCiAgICAgICAgaWYgKHBpcF92ZXJzaW9uIDwgcmVtb3RlX3ZlcnNpb24gYW5kCiAgICAgICAgICAgICAgICBwaXBfdmVyc2lvbi5iYXNlX3ZlcnNpb24gIT0gcmVtb3RlX3ZlcnNpb24uYmFzZV92ZXJzaW9uKToKICAgICAgICAgICAgIyBBZHZpc2UgInB5dGhvbiAtbSBwaXAiIG9uIFdpbmRvd3MgdG8gYXZvaWQgaXNzdWVzCiAgICAgICAgICAgICMgd2l0aCBvdmVyd3JpdGluZyBwaXAuZXhlLgogICAgICAgICAgICBpZiBXSU5ET1dTOgogICAgICAgICAgICAgICAgcGlwX2NtZCA9ICJweXRob24gLW0gcGlwIgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcGlwX2NtZCA9ICJwaXAiCiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgIllvdSBhcmUgdXNpbmcgcGlwIHZlcnNpb24gJXMsIGhvd2V2ZXIgdmVyc2lvbiAlcyBpcyAiCiAgICAgICAgICAgICAgICAiYXZhaWxhYmxlLlxuWW91IHNob3VsZCBjb25zaWRlciB1cGdyYWRpbmcgdmlhIHRoZSAiCiAgICAgICAgICAgICAgICAiJyVzIGluc3RhbGwgLS11cGdyYWRlIHBpcCcgY29tbWFuZC4iLAogICAgICAgICAgICAgICAgcGlwX3ZlcnNpb24sIHB5cGlfdmVyc2lvbiwgcGlwX2NtZAogICAgICAgICAgICApCgogICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICBsb2dnZXIuZGVidWcoCiAgICAgICAgICAgICJUaGVyZSB3YXMgYW4gZXJyb3IgY2hlY2tpbmcgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHBpcCIsCiAgICAgICAgICAgIGV4Y19pbmZvPVRydWUsCiAgICAgICAgKQpQSwMEFAAAAAAAAAAhAA3mkrggCAAAIAgAACYAAABweXBpX19waXBfOV8wXzMvcGlwL3V0aWxzL3BhY2thZ2luZy5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0Cgpmcm9tIGVtYWlsLnBhcnNlciBpbXBvcnQgRmVlZFBhcnNlcgoKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IHN5cwoKZnJvbSBwaXAuX3ZlbmRvci5wYWNrYWdpbmcgaW1wb3J0IHNwZWNpZmllcnMKZnJvbSBwaXAuX3ZlbmRvci5wYWNrYWdpbmcgaW1wb3J0IHZlcnNpb24KZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgcGtnX3Jlc291cmNlcwoKZnJvbSBwaXAgaW1wb3J0IGV4Y2VwdGlvbnMKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmRlZiBjaGVja19yZXF1aXJlc19weXRob24ocmVxdWlyZXNfcHl0aG9uKToKICAgICIiIgogICAgQ2hlY2sgaWYgdGhlIHB5dGhvbiB2ZXJzaW9uIGluIHVzZSBtYXRjaCB0aGUgYHJlcXVpcmVzX3B5dGhvbmAgc3BlY2lmaWVyLgoKICAgIFJldHVybnMgYFRydWVgIGlmIHRoZSB2ZXJzaW9uIG9mIHB5dGhvbiBpbiB1c2UgbWF0Y2hlcyB0aGUgcmVxdWlyZW1lbnQuCiAgICBSZXR1cm5zIGBGYWxzZWAgaWYgdGhlIHZlcnNpb24gb2YgcHl0aG9uIGluIHVzZSBkb2VzIG5vdCBtYXRjaGVzIHRoZQogICAgcmVxdWlyZW1lbnQuCgogICAgUmFpc2VzIGFuIEludmFsaWRTcGVjaWZpZXIgaWYgYHJlcXVpcmVzX3B5dGhvbmAgaGF2ZSBhbiBpbnZhbGlkIGZvcm1hdC4KICAgICIiIgogICAgaWYgcmVxdWlyZXNfcHl0aG9uIGlzIE5vbmU6CiAgICAgICAgIyBUaGUgcGFja2FnZSBwcm92aWRlcyBubyBpbmZvcm1hdGlvbgogICAgICAgIHJldHVybiBUcnVlCiAgICByZXF1aXJlc19weXRob25fc3BlY2lmaWVyID0gc3BlY2lmaWVycy5TcGVjaWZpZXJTZXQocmVxdWlyZXNfcHl0aG9uKQoKICAgICMgV2Ugb25seSB1c2UgbWFqb3IubWlub3IubWljcm8KICAgIHB5dGhvbl92ZXJzaW9uID0gdmVyc2lvbi5wYXJzZSgnLicuam9pbihtYXAoc3RyLCBzeXMudmVyc2lvbl9pbmZvWzozXSkpKQogICAgcmV0dXJuIHB5dGhvbl92ZXJzaW9uIGluIHJlcXVpcmVzX3B5dGhvbl9zcGVjaWZpZXIKCgpkZWYgZ2V0X21ldGFkYXRhKGRpc3QpOgogICAgaWYgKGlzaW5zdGFuY2UoZGlzdCwgcGtnX3Jlc291cmNlcy5EaXN0SW5mb0Rpc3RyaWJ1dGlvbikgYW5kCiAgICAgICAgICAgIGRpc3QuaGFzX21ldGFkYXRhKCdNRVRBREFUQScpKToKICAgICAgICByZXR1cm4gZGlzdC5nZXRfbWV0YWRhdGEoJ01FVEFEQVRBJykKICAgIGVsaWYgZGlzdC5oYXNfbWV0YWRhdGEoJ1BLRy1JTkZPJyk6CiAgICAgICAgcmV0dXJuIGRpc3QuZ2V0X21ldGFkYXRhKCdQS0ctSU5GTycpCgoKZGVmIGNoZWNrX2Rpc3RfcmVxdWlyZXNfcHl0aG9uKGRpc3QpOgogICAgbWV0YWRhdGEgPSBnZXRfbWV0YWRhdGEoZGlzdCkKICAgIGZlZWRfcGFyc2VyID0gRmVlZFBhcnNlcigpCiAgICBmZWVkX3BhcnNlci5mZWVkKG1ldGFkYXRhKQogICAgcGtnX2luZm9fZGljdCA9IGZlZWRfcGFyc2VyLmNsb3NlKCkKICAgIHJlcXVpcmVzX3B5dGhvbiA9IHBrZ19pbmZvX2RpY3QuZ2V0KCdSZXF1aXJlcy1QeXRob24nKQogICAgdHJ5OgogICAgICAgIGlmIG5vdCBjaGVja19yZXF1aXJlc19weXRob24ocmVxdWlyZXNfcHl0aG9uKToKICAgICAgICAgICAgcmFpc2UgZXhjZXB0aW9ucy5VbnN1cHBvcnRlZFB5dGhvblZlcnNpb24oCiAgICAgICAgICAgICAgICAiJXMgcmVxdWlyZXMgUHl0aG9uICclcycgYnV0IHRoZSBydW5uaW5nIFB5dGhvbiBpcyAlcyIgJSAoCiAgICAgICAgICAgICAgICAgICAgZGlzdC5wcm9qZWN0X25hbWUsCiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZXNfcHl0aG9uLAogICAgICAgICAgICAgICAgICAgICcuJy5qb2luKG1hcChzdHIsIHN5cy52ZXJzaW9uX2luZm9bOjNdKSksKQogICAgICAgICAgICApCiAgICBleGNlcHQgc3BlY2lmaWVycy5JbnZhbGlkU3BlY2lmaWVyIGFzIGU6CiAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICJQYWNrYWdlICVzIGhhcyBhbiBpbnZhbGlkIFJlcXVpcmVzLVB5dGhvbiBlbnRyeSAlcyAtICVzIiAlICgKICAgICAgICAgICAgICAgIGRpc3QucHJvamVjdF9uYW1lLCByZXF1aXJlc19weXRob24sIGUpKQogICAgICAgIHJldHVybgpQSwMEFAAAAAAAAAAhABai8koWAQAAFgEAAC0AAABweXBpX19waXBfOV8wXzMvcGlwL3V0aWxzL3NldHVwdG9vbHNfYnVpbGQucHkjIFNoaW0gdG8gd3JhcCBzZXR1cC5weSBpbnZvY2F0aW9uIHdpdGggc2V0dXB0b29scwpTRVRVUFRPT0xTX1NISU0gPSAoCiAgICAiaW1wb3J0IHNldHVwdG9vbHMsIHRva2VuaXplO19fZmlsZV9fPSVyOyIKICAgICJmPWdldGF0dHIodG9rZW5pemUsICdvcGVuJywgb3BlbikoX19maWxlX18pOyIKICAgICJjb2RlPWYucmVhZCgpLnJlcGxhY2UoJ1xcclxcbicsICdcXG4nKTsiCiAgICAiZi5jbG9zZSgpOyIKICAgICJleGVjKGNvbXBpbGUoY29kZSwgX19maWxlX18sICdleGVjJykpIgopClBLAwQUAAAAAAAAACEA5eKQlU0tAABNLQAAHwAAAHB5cGlfX3BpcF85XzBfMy9waXAvdXRpbHMvdWkucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydApmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uCgppbXBvcnQgaXRlcnRvb2xzCmltcG9ydCBzeXMKZnJvbSBzaWduYWwgaW1wb3J0IHNpZ25hbCwgU0lHSU5ULCBkZWZhdWx0X2ludF9oYW5kbGVyCmltcG9ydCB0aW1lCmltcG9ydCBjb250ZXh0bGliCmltcG9ydCBsb2dnaW5nCgpmcm9tIHBpcC5jb21wYXQgaW1wb3J0IFdJTkRPV1MKZnJvbSBwaXAudXRpbHMgaW1wb3J0IGZvcm1hdF9zaXplCmZyb20gcGlwLnV0aWxzLmxvZ2dpbmcgaW1wb3J0IGdldF9pbmRlbnRhdGlvbgpmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCBzaXgKZnJvbSBwaXAuX3ZlbmRvci5wcm9ncmVzcy5iYXIgaW1wb3J0IEJhciwgSW5jcmVtZW50YWxCYXIKZnJvbSBwaXAuX3ZlbmRvci5wcm9ncmVzcy5oZWxwZXJzIGltcG9ydCAoV3JpdGVsbk1peGluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBISURFX0NVUlNPUiwgU0hPV19DVVJTT1IpCmZyb20gcGlwLl92ZW5kb3IucHJvZ3Jlc3Muc3Bpbm5lciBpbXBvcnQgU3Bpbm5lcgoKdHJ5OgogICAgZnJvbSBwaXAuX3ZlbmRvciBpbXBvcnQgY29sb3JhbWEKIyBMb3RzIG9mIGRpZmZlcmVudCBlcnJvcnMgY2FuIGNvbWUgZnJvbSB0aGlzLCBpbmNsdWRpbmcgU3lzdGVtRXJyb3IgYW5kCiMgSW1wb3J0RXJyb3IuCmV4Y2VwdCBFeGNlcHRpb246CiAgICBjb2xvcmFtYSA9IE5vbmUKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmRlZiBfc2VsZWN0X3Byb2dyZXNzX2NsYXNzKHByZWZlcnJlZCwgZmFsbGJhY2spOgogICAgZW5jb2RpbmcgPSBnZXRhdHRyKHByZWZlcnJlZC5maWxlLCAiZW5jb2RpbmciLCBOb25lKQoKICAgICMgSWYgd2UgZG9uJ3Qga25vdyB3aGF0IGVuY29kaW5nIHRoaXMgZmlsZSBpcyBpbiwgdGhlbiB3ZSdsbCBqdXN0IGFzc3VtZQogICAgIyB0aGF0IGl0IGRvZXNuJ3Qgc3VwcG9ydCB1bmljb2RlIGFuZCB1c2UgdGhlIEFTQ0lJIGJhci4KICAgIGlmIG5vdCBlbmNvZGluZzoKICAgICAgICByZXR1cm4gZmFsbGJhY2sKCiAgICAjIENvbGxlY3QgYWxsIG9mIHRoZSBwb3NzaWJsZSBjaGFyYWN0ZXJzIHdlIHdhbnQgdG8gdXNlIHdpdGggdGhlIHByZWZlcnJlZAogICAgIyBiYXIuCiAgICBjaGFyYWN0ZXJzID0gWwogICAgICAgIGdldGF0dHIocHJlZmVycmVkLCAiZW1wdHlfZmlsbCIsIHNpeC50ZXh0X3R5cGUoKSksCiAgICAgICAgZ2V0YXR0cihwcmVmZXJyZWQsICJmaWxsIiwgc2l4LnRleHRfdHlwZSgpKSwKICAgIF0KICAgIGNoYXJhY3RlcnMgKz0gbGlzdChnZXRhdHRyKHByZWZlcnJlZCwgInBoYXNlcyIsIFtdKSkKCiAgICAjIFRyeSB0byBkZWNvZGUgdGhlIGNoYXJhY3RlcnMgd2UncmUgdXNpbmcgZm9yIHRoZSBiYXIgdXNpbmcgdGhlIGVuY29kaW5nCiAgICAjIG9mIHRoZSBnaXZlbiBmaWxlLCBpZiB0aGlzIHdvcmtzIHRoZW4gd2UnbGwgYXNzdW1lIHRoYXQgd2UgY2FuIHVzZSB0aGUKICAgICMgZmFuY2llciBiYXIgYW5kIGlmIG5vdCB3ZSdsbCBmYWxsIGJhY2sgdG8gdGhlIHBsYWludGV4dCBiYXIuCiAgICB0cnk6CiAgICAgICAgc2l4LnRleHRfdHlwZSgpLmpvaW4oY2hhcmFjdGVycykuZW5jb2RlKGVuY29kaW5nKQogICAgZXhjZXB0IFVuaWNvZGVFbmNvZGVFcnJvcjoKICAgICAgICByZXR1cm4gZmFsbGJhY2sKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIHByZWZlcnJlZAoKCl9CYXNlQmFyID0gX3NlbGVjdF9wcm9ncmVzc19jbGFzcyhJbmNyZW1lbnRhbEJhciwgQmFyKQoKCmNsYXNzIEludGVycnVwdGlibGVNaXhpbihvYmplY3QpOgogICAgIiIiCiAgICBIZWxwZXIgdG8gZW5zdXJlIHRoYXQgc2VsZi5maW5pc2goKSBnZXRzIGNhbGxlZCBvbiBrZXlib2FyZCBpbnRlcnJ1cHQuCgogICAgVGhpcyBhbGxvd3MgZG93bmxvYWRzIHRvIGJlIGludGVycnVwdGVkIHdpdGhvdXQgbGVhdmluZyB0ZW1wb3Jhcnkgc3RhdGUKICAgIChsaWtlIGhpZGRlbiBjdXJzb3JzKSBiZWhpbmQuCgogICAgVGhpcyBjbGFzcyBpcyBzaW1pbGFyIHRvIHRoZSBwcm9ncmVzcyBsaWJyYXJ5J3MgZXhpc3RpbmcgU2lnSW50TWl4aW4KICAgIGhlbHBlciwgYnV0IGFzIG9mIHZlcnNpb24gMS4yLCB0aGF0IGhlbHBlciBoYXMgdGhlIGZvbGxvd2luZyBwcm9ibGVtczoKCiAgICAxLiBJdCBjYWxscyBzeXMuZXhpdCgpLgogICAgMi4gSXQgZGlzY2FyZHMgdGhlIGV4aXN0aW5nIFNJR0lOVCBoYW5kbGVyIGNvbXBsZXRlbHkuCiAgICAzLiBJdCBsZWF2ZXMgaXRzIG93biBoYW5kbGVyIGluIHBsYWNlIGV2ZW4gYWZ0ZXIgYW4gdW5pbnRlcnJ1cHRlZCBmaW5pc2gsCiAgICAgICB3aGljaCB3aWxsIGhhdmUgdW5leHBlY3RlZCBkZWxheWVkIGVmZmVjdHMgaWYgdGhlIHVzZXIgdHJpZ2dlcnMgYW4KICAgICAgIHVucmVsYXRlZCBrZXlib2FyZCBpbnRlcnJ1cHQgc29tZSB0aW1lIGFmdGVyIGEgcHJvZ3Jlc3MtZGlzcGxheWluZwogICAgICAgZG93bmxvYWQgaGFzIGFscmVhZHkgY29tcGxldGVkLCBmb3IgZXhhbXBsZS4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICIiIgogICAgICAgIFNhdmUgdGhlIG9yaWdpbmFsIFNJR0lOVCBoYW5kbGVyIGZvciBsYXRlci4KICAgICAgICAiIiIKICAgICAgICBzdXBlcihJbnRlcnJ1cHRpYmxlTWl4aW4sIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3YXJncykKCiAgICAgICAgc2VsZi5vcmlnaW5hbF9oYW5kbGVyID0gc2lnbmFsKFNJR0lOVCwgc2VsZi5oYW5kbGVfc2lnaW50KQoKICAgICAgICAjIElmIHNpZ25hbCgpIHJldHVybnMgTm9uZSwgdGhlIHByZXZpb3VzIGhhbmRsZXIgd2FzIG5vdCBpbnN0YWxsZWQgZnJvbQogICAgICAgICMgUHl0aG9uLCBhbmQgd2UgY2Fubm90IHJlc3RvcmUgaXQuIFRoaXMgcHJvYmFibHkgc2hvdWxkIG5vdCBoYXBwZW4sCiAgICAgICAgIyBidXQgaWYgaXQgZG9lcywgd2UgbXVzdCByZXN0b3JlIHNvbWV0aGluZyBzZW5zaWJsZSBpbnN0ZWFkLCBhdCBsZWFzdC4KICAgICAgICAjIFRoZSBsZWFzdCBiYWQgb3B0aW9uIHNob3VsZCBiZSBQeXRob24ncyBkZWZhdWx0IFNJR0lOVCBoYW5kbGVyLCB3aGljaAogICAgICAgICMganVzdCByYWlzZXMgS2V5Ym9hcmRJbnRlcnJ1cHQuCiAgICAgICAgaWYgc2VsZi5vcmlnaW5hbF9oYW5kbGVyIGlzIE5vbmU6CiAgICAgICAgICAgIHNlbGYub3JpZ2luYWxfaGFuZGxlciA9IGRlZmF1bHRfaW50X2hhbmRsZXIKCiAgICBkZWYgZmluaXNoKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJlc3RvcmUgdGhlIG9yaWdpbmFsIFNJR0lOVCBoYW5kbGVyIGFmdGVyIGZpbmlzaGluZy4KCiAgICAgICAgVGhpcyBzaG91bGQgaGFwcGVuIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgcHJvZ3Jlc3MgZGlzcGxheSBmaW5pc2hlcwogICAgICAgIG5vcm1hbGx5LCBvciBnZXRzIGludGVycnVwdGVkLgogICAgICAgICIiIgogICAgICAgIHN1cGVyKEludGVycnVwdGlibGVNaXhpbiwgc2VsZikuZmluaXNoKCkKICAgICAgICBzaWduYWwoU0lHSU5ULCBzZWxmLm9yaWdpbmFsX2hhbmRsZXIpCgogICAgZGVmIGhhbmRsZV9zaWdpbnQoc2VsZiwgc2lnbnVtLCBmcmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgQ2FsbCBzZWxmLmZpbmlzaCgpIGJlZm9yZSBkZWxlZ2F0aW5nIHRvIHRoZSBvcmlnaW5hbCBTSUdJTlQgaGFuZGxlci4KCiAgICAgICAgVGhpcyBoYW5kbGVyIHNob3VsZCBvbmx5IGJlIGluIHBsYWNlIHdoaWxlIHRoZSBwcm9ncmVzcyBkaXNwbGF5IGlzCiAgICAgICAgYWN0aXZlLgogICAgICAgICIiIgogICAgICAgIHNlbGYuZmluaXNoKCkKICAgICAgICBzZWxmLm9yaWdpbmFsX2hhbmRsZXIoc2lnbnVtLCBmcmFtZSkKCgpjbGFzcyBEb3dubG9hZFByb2dyZXNzTWl4aW4ob2JqZWN0KToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICBzdXBlcihEb3dubG9hZFByb2dyZXNzTWl4aW4sIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3YXJncykKICAgICAgICBzZWxmLm1lc3NhZ2UgPSAoIiAiICogKGdldF9pbmRlbnRhdGlvbigpICsgMikpICsgc2VsZi5tZXNzYWdlCgogICAgQHByb3BlcnR5CiAgICBkZWYgZG93bmxvYWRlZChzZWxmKToKICAgICAgICByZXR1cm4gZm9ybWF0X3NpemUoc2VsZi5pbmRleCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBkb3dubG9hZF9zcGVlZChzZWxmKToKICAgICAgICAjIEF2b2lkIHplcm8gZGl2aXNpb24gZXJyb3JzLi4uCiAgICAgICAgaWYgc2VsZi5hdmcgPT0gMC4wOgogICAgICAgICAgICByZXR1cm4gIi4uLiIKICAgICAgICByZXR1cm4gZm9ybWF0X3NpemUoMSAvIHNlbGYuYXZnKSArICIvcyIKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwcmV0dHlfZXRhKHNlbGYpOgogICAgICAgIGlmIHNlbGYuZXRhOgogICAgICAgICAgICByZXR1cm4gImV0YSAlcyIgJSBzZWxmLmV0YV90ZAogICAgICAgIHJldHVybiAiIgoKICAgIGRlZiBpdGVyKHNlbGYsIGl0LCBuPTEpOgogICAgICAgIGZvciB4IGluIGl0OgogICAgICAgICAgICB5aWVsZCB4CiAgICAgICAgICAgIHNlbGYubmV4dChuKQogICAgICAgIHNlbGYuZmluaXNoKCkKCgpjbGFzcyBXaW5kb3dzTWl4aW4ob2JqZWN0KToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAjIFRoZSBXaW5kb3dzIHRlcm1pbmFsIGRvZXMgbm90IHN1cHBvcnQgdGhlIGhpZGUvc2hvdyBjdXJzb3IgQU5TSSBjb2RlcwogICAgICAgICMgZXZlbiB3aXRoIGNvbG9yYW1hLiBTbyB3ZSdsbCBlbnN1cmUgdGhhdCBoaWRlX2N1cnNvciBpcyBGYWxzZSBvbgogICAgICAgICMgV2luZG93cy4KICAgICAgICAjIFRoaXMgY2FsbCBuZWRzIHRvIGdvIGJlZm9yZSB0aGUgc3VwZXIoKSBjYWxsLCBzbyB0aGF0IGhpZGVfY3Vyc29yCiAgICAgICAgIyBpcyBzZXQgaW4gdGltZS4gVGhlIGJhc2UgcHJvZ3Jlc3MgYmFyIGNsYXNzIHdyaXRlcyB0aGUgImhpZGUgY3Vyc29yIgogICAgICAgICMgY29kZSB0byB0aGUgdGVybWluYWwgaW4gaXRzIGluaXQsIHNvIGlmIHdlIGRvbid0IHNldCB0aGlzIHNvb24KICAgICAgICAjIGVub3VnaCwgd2UgZ2V0IGEgImhpZGUiIHdpdGggbm8gY29ycmVzcG9uZGluZyAic2hvdyIuLi4KICAgICAgICBpZiBXSU5ET1dTIGFuZCBzZWxmLmhpZGVfY3Vyc29yOgogICAgICAgICAgICBzZWxmLmhpZGVfY3Vyc29yID0gRmFsc2UKCiAgICAgICAgc3VwZXIoV2luZG93c01peGluLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpCgogICAgICAgICMgQ2hlY2sgaWYgd2UgYXJlIHJ1bm5pbmcgb24gV2luZG93cyBhbmQgd2UgaGF2ZSB0aGUgY29sb3JhbWEgbW9kdWxlLAogICAgICAgICMgaWYgd2UgZG8gdGhlbiB3cmFwIG91ciBmaWxlIHdpdGggaXQuCiAgICAgICAgaWYgV0lORE9XUyBhbmQgY29sb3JhbWE6CiAgICAgICAgICAgIHNlbGYuZmlsZSA9IGNvbG9yYW1hLkFuc2lUb1dpbjMyKHNlbGYuZmlsZSkKICAgICAgICAgICAgIyBUaGUgcHJvZ3Jlc3MgY29kZSBleHBlY3RzIHRvIGJlIGFibGUgdG8gY2FsbCBzZWxmLmZpbGUuaXNhdHR5KCkKICAgICAgICAgICAgIyBidXQgdGhlIGNvbG9yYW1hLkFuc2lUb1dpbjMyKCkgb2JqZWN0IGRvZXNuJ3QgaGF2ZSB0aGF0LCBzbyB3ZSdsbAogICAgICAgICAgICAjIGFkZCBpdC4KICAgICAgICAgICAgc2VsZi5maWxlLmlzYXR0eSA9IGxhbWJkYTogc2VsZi5maWxlLndyYXBwZWQuaXNhdHR5KCkKICAgICAgICAgICAgIyBUaGUgcHJvZ3Jlc3MgY29kZSBleHBlY3RzIHRvIGJlIGFibGUgdG8gY2FsbCBzZWxmLmZpbGUuZmx1c2goKQogICAgICAgICAgICAjIGJ1dCB0aGUgY29sb3JhbWEuQW5zaVRvV2luMzIoKSBvYmplY3QgZG9lc24ndCBoYXZlIHRoYXQsIHNvIHdlJ2xsCiAgICAgICAgICAgICMgYWRkIGl0LgogICAgICAgICAgICBzZWxmLmZpbGUuZmx1c2ggPSBsYW1iZGE6IHNlbGYuZmlsZS53cmFwcGVkLmZsdXNoKCkKCgpjbGFzcyBEb3dubG9hZFByb2dyZXNzQmFyKFdpbmRvd3NNaXhpbiwgSW50ZXJydXB0aWJsZU1peGluLAogICAgICAgICAgICAgICAgICAgICAgICAgIERvd25sb2FkUHJvZ3Jlc3NNaXhpbiwgX0Jhc2VCYXIpOgoKICAgIGZpbGUgPSBzeXMuc3Rkb3V0CiAgICBtZXNzYWdlID0gIiUocGVyY2VudClkJSUiCiAgICBzdWZmaXggPSAiJShkb3dubG9hZGVkKXMgJShkb3dubG9hZF9zcGVlZClzICUocHJldHR5X2V0YSlzIgoKCmNsYXNzIERvd25sb2FkUHJvZ3Jlc3NTcGlubmVyKFdpbmRvd3NNaXhpbiwgSW50ZXJydXB0aWJsZU1peGluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb3dubG9hZFByb2dyZXNzTWl4aW4sIFdyaXRlbG5NaXhpbiwgU3Bpbm5lcik6CgogICAgZmlsZSA9IHN5cy5zdGRvdXQKICAgIHN1ZmZpeCA9ICIlKGRvd25sb2FkZWQpcyAlKGRvd25sb2FkX3NwZWVkKXMiCgogICAgZGVmIG5leHRfcGhhc2Uoc2VsZik6CiAgICAgICAgaWYgbm90IGhhc2F0dHIoc2VsZiwgIl9waGFzZXIiKToKICAgICAgICAgICAgc2VsZi5fcGhhc2VyID0gaXRlcnRvb2xzLmN5Y2xlKHNlbGYucGhhc2VzKQogICAgICAgIHJldHVybiBuZXh0KHNlbGYuX3BoYXNlcikKCiAgICBkZWYgdXBkYXRlKHNlbGYpOgogICAgICAgIG1lc3NhZ2UgPSBzZWxmLm1lc3NhZ2UgJSBzZWxmCiAgICAgICAgcGhhc2UgPSBzZWxmLm5leHRfcGhhc2UoKQogICAgICAgIHN1ZmZpeCA9IHNlbGYuc3VmZml4ICUgc2VsZgogICAgICAgIGxpbmUgPSAnJy5qb2luKFsKICAgICAgICAgICAgbWVzc2FnZSwKICAgICAgICAgICAgIiAiIGlmIG1lc3NhZ2UgZWxzZSAiIiwKICAgICAgICAgICAgcGhhc2UsCiAgICAgICAgICAgICIgIiBpZiBzdWZmaXggZWxzZSAiIiwKICAgICAgICAgICAgc3VmZml4LAogICAgICAgIF0pCgogICAgICAgIHNlbGYud3JpdGVsbihsaW5lKQoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBHZW5lcmljICJzb21ldGhpbmcgaXMgaGFwcGVuaW5nIiBzcGlubmVycwojCiMgV2UgZG9uJ3QgZXZlbiB0cnkgdXNpbmcgcHJvZ3Jlc3Muc3Bpbm5lci5TcGlubmVyIGhlcmUgYmVjYXVzZSBpdCdzIGFjdHVhbGx5CiMgc2ltcGxlciB0byByZWltcGxlbWVudCBmcm9tIHNjcmF0Y2ggdGhhbiB0byBjb2VyY2UgdGhlaXIgY29kZSBpbnRvIGRvaW5nCiMgd2hhdCB3ZSBuZWVkLgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgpkZWYgaGlkZGVuX2N1cnNvcihmaWxlKToKICAgICMgVGhlIFdpbmRvd3MgdGVybWluYWwgZG9lcyBub3Qgc3VwcG9ydCB0aGUgaGlkZS9zaG93IGN1cnNvciBBTlNJIGNvZGVzLAogICAgIyBldmVuIHZpYSBjb2xvcmFtYS4gU28gZG9uJ3QgZXZlbiB0cnkuCiAgICBpZiBXSU5ET1dTOgogICAgICAgIHlpZWxkCiAgICAjIFdlIGRvbid0IHdhbnQgdG8gY2x1dHRlciB0aGUgb3V0cHV0IHdpdGggY29udHJvbCBjaGFyYWN0ZXJzIGlmIHdlJ3JlCiAgICAjIHdyaXRpbmcgdG8gYSBmaWxlLCBvciBpZiB0aGUgdXNlciBpcyBydW5uaW5nIHdpdGggLS1xdWlldC4KICAgICMgU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3BpcC9pc3N1ZXMvMzQxOAogICAgZWxpZiBub3QgZmlsZS5pc2F0dHkoKSBvciBsb2dnZXIuZ2V0RWZmZWN0aXZlTGV2ZWwoKSA+IGxvZ2dpbmcuSU5GTzoKICAgICAgICB5aWVsZAogICAgZWxzZToKICAgICAgICBmaWxlLndyaXRlKEhJREVfQ1VSU09SKQogICAgICAgIHRyeToKICAgICAgICAgICAgeWllbGQKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBmaWxlLndyaXRlKFNIT1dfQ1VSU09SKQoKCmNsYXNzIFJhdGVMaW1pdGVyKG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgbWluX3VwZGF0ZV9pbnRlcnZhbF9zZWNvbmRzKToKICAgICAgICBzZWxmLl9taW5fdXBkYXRlX2ludGVydmFsX3NlY29uZHMgPSBtaW5fdXBkYXRlX2ludGVydmFsX3NlY29uZHMKICAgICAgICBzZWxmLl9sYXN0X3VwZGF0ZSA9IDAKCiAgICBkZWYgcmVhZHkoc2VsZik6CiAgICAgICAgbm93ID0gdGltZS50aW1lKCkKICAgICAgICBkZWx0YSA9IG5vdyAtIHNlbGYuX2xhc3RfdXBkYXRlCiAgICAgICAgcmV0dXJuIGRlbHRhID49IHNlbGYuX21pbl91cGRhdGVfaW50ZXJ2YWxfc2Vjb25kcwoKICAgIGRlZiByZXNldChzZWxmKToKICAgICAgICBzZWxmLl9sYXN0X3VwZGF0ZSA9IHRpbWUudGltZSgpCgoKY2xhc3MgSW50ZXJhY3RpdmVTcGlubmVyKG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgbWVzc2FnZSwgZmlsZT1Ob25lLCBzcGluX2NoYXJzPSItXFx8LyIsCiAgICAgICAgICAgICAgICAgIyBFbXBpcmljYWxseSwgOCB1cGRhdGVzL3NlY29uZCBsb29rcyBuaWNlCiAgICAgICAgICAgICAgICAgbWluX3VwZGF0ZV9pbnRlcnZhbF9zZWNvbmRzPTAuMTI1KToKICAgICAgICBzZWxmLl9tZXNzYWdlID0gbWVzc2FnZQogICAgICAgIGlmIGZpbGUgaXMgTm9uZToKICAgICAgICAgICAgZmlsZSA9IHN5cy5zdGRvdXQKICAgICAgICBzZWxmLl9maWxlID0gZmlsZQogICAgICAgIHNlbGYuX3JhdGVfbGltaXRlciA9IFJhdGVMaW1pdGVyKG1pbl91cGRhdGVfaW50ZXJ2YWxfc2Vjb25kcykKICAgICAgICBzZWxmLl9maW5pc2hlZCA9IEZhbHNlCgogICAgICAgIHNlbGYuX3NwaW5fY3ljbGUgPSBpdGVydG9vbHMuY3ljbGUoc3Bpbl9jaGFycykKCiAgICAgICAgc2VsZi5fZmlsZS53cml0ZSgiICIgKiBnZXRfaW5kZW50YXRpb24oKSArIHNlbGYuX21lc3NhZ2UgKyAiIC4uLiAiKQogICAgICAgIHNlbGYuX3dpZHRoID0gMAoKICAgIGRlZiBfd3JpdGUoc2VsZiwgc3RhdHVzKToKICAgICAgICBhc3NlcnQgbm90IHNlbGYuX2ZpbmlzaGVkCiAgICAgICAgIyBFcmFzZSB3aGF0IHdlIHdyb3RlIGJlZm9yZSBieSBiYWNrc3BhY2luZyB0byB0aGUgYmVnaW5uaW5nLCB3cml0aW5nCiAgICAgICAgIyBzcGFjZXMgdG8gb3ZlcndyaXRlIHRoZSBvbGQgdGV4dCwgYW5kIHRoZW4gYmFja3NwYWNpbmcgYWdhaW4KICAgICAgICBiYWNrdXAgPSAiXGIiICogc2VsZi5fd2lkdGgKICAgICAgICBzZWxmLl9maWxlLndyaXRlKGJhY2t1cCArICIgIiAqIHNlbGYuX3dpZHRoICsgYmFja3VwKQogICAgICAgICMgTm93IHdlIGhhdmUgYSBibGFuayBzbGF0ZSB0byBhZGQgb3VyIHN0YXR1cwogICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoc3RhdHVzKQogICAgICAgIHNlbGYuX3dpZHRoID0gbGVuKHN0YXR1cykKICAgICAgICBzZWxmLl9maWxlLmZsdXNoKCkKICAgICAgICBzZWxmLl9yYXRlX2xpbWl0ZXIucmVzZXQoKQoKICAgIGRlZiBzcGluKHNlbGYpOgogICAgICAgIGlmIHNlbGYuX2ZpbmlzaGVkOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBpZiBub3Qgc2VsZi5fcmF0ZV9saW1pdGVyLnJlYWR5KCk6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHNlbGYuX3dyaXRlKG5leHQoc2VsZi5fc3Bpbl9jeWNsZSkpCgogICAgZGVmIGZpbmlzaChzZWxmLCBmaW5hbF9zdGF0dXMpOgogICAgICAgIGlmIHNlbGYuX2ZpbmlzaGVkOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBzZWxmLl93cml0ZShmaW5hbF9zdGF0dXMpCiAgICAgICAgc2VsZi5fZmlsZS53cml0ZSgiXG4iKQogICAgICAgIHNlbGYuX2ZpbGUuZmx1c2goKQogICAgICAgIHNlbGYuX2ZpbmlzaGVkID0gVHJ1ZQoKCiMgVXNlZCBmb3IgZHVtYiB0ZXJtaW5hbHMsIG5vbi1pbnRlcmFjdGl2ZSBpbnN0YWxscyAobm8gdHR5KSwgZXRjLgojIFdlIHN0aWxsIHByaW50IHVwZGF0ZXMgb2NjYXNpb25hbGx5IChvbmNlIGV2ZXJ5IDYwIHNlY29uZHMgYnkgZGVmYXVsdCkgdG8KIyBhY3QgYXMgYSBrZWVwLWFsaXZlIGZvciBzeXN0ZW1zIGxpa2UgVHJhdmlzLUNJIHRoYXQgdGFrZSBsYWNrLW9mLW91dHB1dCBhcwojIGFuIGluZGljYXRpb24gdGhhdCBhIHRhc2sgaGFzIGZyb3plbi4KY2xhc3MgTm9uSW50ZXJhY3RpdmVTcGlubmVyKG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgbWVzc2FnZSwgbWluX3VwZGF0ZV9pbnRlcnZhbF9zZWNvbmRzPTYwKToKICAgICAgICBzZWxmLl9tZXNzYWdlID0gbWVzc2FnZQogICAgICAgIHNlbGYuX2ZpbmlzaGVkID0gRmFsc2UKICAgICAgICBzZWxmLl9yYXRlX2xpbWl0ZXIgPSBSYXRlTGltaXRlcihtaW5fdXBkYXRlX2ludGVydmFsX3NlY29uZHMpCiAgICAgICAgc2VsZi5fdXBkYXRlKCJzdGFydGVkIikKCiAgICBkZWYgX3VwZGF0ZShzZWxmLCBzdGF0dXMpOgogICAgICAgIGFzc2VydCBub3Qgc2VsZi5fZmluaXNoZWQKICAgICAgICBzZWxmLl9yYXRlX2xpbWl0ZXIucmVzZXQoKQogICAgICAgIGxvZ2dlci5pbmZvKCIlczogJXMiLCBzZWxmLl9tZXNzYWdlLCBzdGF0dXMpCgogICAgZGVmIHNwaW4oc2VsZik6CiAgICAgICAgaWYgc2VsZi5fZmluaXNoZWQ6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGlmIG5vdCBzZWxmLl9yYXRlX2xpbWl0ZXIucmVhZHkoKToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2VsZi5fdXBkYXRlKCJzdGlsbCBydW5uaW5nLi4uIikKCiAgICBkZWYgZmluaXNoKHNlbGYsIGZpbmFsX3N0YXR1cyk6CiAgICAgICAgaWYgc2VsZi5fZmluaXNoZWQ6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHNlbGYuX3VwZGF0ZSgiZmluaXNoZWQgd2l0aCBzdGF0dXMgJyVzJyIgJSAoZmluYWxfc3RhdHVzLCkpCiAgICAgICAgc2VsZi5fZmluaXNoZWQgPSBUcnVlCgoKQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKZGVmIG9wZW5fc3Bpbm5lcihtZXNzYWdlKToKICAgICMgSW50ZXJhY3RpdmUgc3Bpbm5lciBnb2VzIGRpcmVjdGx5IHRvIHN5cy5zdGRvdXQgcmF0aGVyIHRoYW4gYmVpbmcgcm91dGVkCiAgICAjIHRocm91Z2ggdGhlIGxvZ2dpbmcgc3lzdGVtLCBidXQgaXQgYWN0cyBsaWtlIGl0IGhhcyBsZXZlbCBJTkZPLAogICAgIyBpLmUuIGl0J3Mgb25seSBkaXNwbGF5ZWQgaWYgd2UncmUgYXQgbGV2ZWwgSU5GTyBvciBiZXR0ZXIuCiAgICAjIE5vbi1pbnRlcmFjdGl2ZSBzcGlubmVyIGdvZXMgdGhyb3VnaCB0aGUgbG9nZ2luZyBzeXN0ZW0sIHNvIGl0IGlzIGFsd2F5cwogICAgIyBpbiBzeW5jIHdpdGggbG9nZ2luZyBjb25maWd1cmF0aW9uLgogICAgaWYgc3lzLnN0ZG91dC5pc2F0dHkoKSBhbmQgbG9nZ2VyLmdldEVmZmVjdGl2ZUxldmVsKCkgPD0gbG9nZ2luZy5JTkZPOgogICAgICAgIHNwaW5uZXIgPSBJbnRlcmFjdGl2ZVNwaW5uZXIobWVzc2FnZSkKICAgIGVsc2U6CiAgICAgICAgc3Bpbm5lciA9IE5vbkludGVyYWN0aXZlU3Bpbm5lcihtZXNzYWdlKQogICAgdHJ5OgogICAgICAgIHdpdGggaGlkZGVuX2N1cnNvcihzeXMuc3Rkb3V0KToKICAgICAgICAgICAgeWllbGQgc3Bpbm5lcgogICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgogICAgICAgIHNwaW5uZXIuZmluaXNoKCJjYW5jZWxlZCIpCiAgICAgICAgcmFpc2UKICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgc3Bpbm5lci5maW5pc2goImVycm9yIikKICAgICAgICByYWlzZQogICAgZWxzZToKICAgICAgICBzcGlubmVyLmZpbmlzaCgiZG9uZSIpClBLAwQUAAAAAAAAACEAyFbFS1YwAABWMAAAIwAAAHB5cGlfX3BpcF85XzBfMy9waXAvdmNzL19faW5pdF9fLnB5IiIiSGFuZGxlcyBhbGwgVkNTICh2ZXJzaW9uIGNvbnRyb2wpIHN1cHBvcnQiIiIKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBlcnJubwppbXBvcnQgbG9nZ2luZwppbXBvcnQgb3MKaW1wb3J0IHNodXRpbAppbXBvcnQgc3lzCgpmcm9tIHBpcC5fdmVuZG9yLnNpeC5tb3Zlcy51cmxsaWIgaW1wb3J0IHBhcnNlIGFzIHVybGxpYl9wYXJzZQoKZnJvbSBwaXAuZXhjZXB0aW9ucyBpbXBvcnQgQmFkQ29tbWFuZApmcm9tIHBpcC51dGlscyBpbXBvcnQgKGRpc3BsYXlfcGF0aCwgYmFja3VwX2RpciwgY2FsbF9zdWJwcm9jZXNzLAogICAgICAgICAgICAgICAgICAgICAgIHJtdHJlZSwgYXNrX3BhdGhfZXhpc3RzKQoKCl9fYWxsX18gPSBbJ3ZjcycsICdnZXRfc3JjX3JlcXVpcmVtZW50J10KCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgpjbGFzcyBWY3NTdXBwb3J0KG9iamVjdCk6CiAgICBfcmVnaXN0cnkgPSB7fQogICAgc2NoZW1lcyA9IFsnc3NoJywgJ2dpdCcsICdoZycsICdienInLCAnc2Z0cCcsICdzdm4nXQoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAjIFJlZ2lzdGVyIG1vcmUgc2NoZW1lcyB3aXRoIHVybHBhcnNlIGZvciB2YXJpb3VzIHZlcnNpb24gY29udHJvbAogICAgICAgICMgc3lzdGVtcwogICAgICAgIHVybGxpYl9wYXJzZS51c2VzX25ldGxvYy5leHRlbmQoc2VsZi5zY2hlbWVzKQogICAgICAgICMgUHl0aG9uID49IDIuNy40LCAzLjMgZG9lc24ndCBoYXZlIHVzZXNfZnJhZ21lbnQKICAgICAgICBpZiBnZXRhdHRyKHVybGxpYl9wYXJzZSwgJ3VzZXNfZnJhZ21lbnQnLCBOb25lKToKICAgICAgICAgICAgdXJsbGliX3BhcnNlLnVzZXNfZnJhZ21lbnQuZXh0ZW5kKHNlbGYuc2NoZW1lcykKICAgICAgICBzdXBlcihWY3NTdXBwb3J0LCBzZWxmKS5fX2luaXRfXygpCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl9yZWdpc3RyeS5fX2l0ZXJfXygpCgogICAgQHByb3BlcnR5CiAgICBkZWYgYmFja2VuZHMoc2VsZik6CiAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5fcmVnaXN0cnkudmFsdWVzKCkpCgogICAgQHByb3BlcnR5CiAgICBkZWYgZGlybmFtZXMoc2VsZik6CiAgICAgICAgcmV0dXJuIFtiYWNrZW5kLmRpcm5hbWUgZm9yIGJhY2tlbmQgaW4gc2VsZi5iYWNrZW5kc10KCiAgICBAcHJvcGVydHkKICAgIGRlZiBhbGxfc2NoZW1lcyhzZWxmKToKICAgICAgICBzY2hlbWVzID0gW10KICAgICAgICBmb3IgYmFja2VuZCBpbiBzZWxmLmJhY2tlbmRzOgogICAgICAgICAgICBzY2hlbWVzLmV4dGVuZChiYWNrZW5kLnNjaGVtZXMpCiAgICAgICAgcmV0dXJuIHNjaGVtZXMKCiAgICBkZWYgcmVnaXN0ZXIoc2VsZiwgY2xzKToKICAgICAgICBpZiBub3QgaGFzYXR0cihjbHMsICduYW1lJyk6CiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdDYW5ub3QgcmVnaXN0ZXIgVkNTICVzJywgY2xzLl9fbmFtZV9fKQogICAgICAgICAgICByZXR1cm4KICAgICAgICBpZiBjbHMubmFtZSBub3QgaW4gc2VsZi5fcmVnaXN0cnk6CiAgICAgICAgICAgIHNlbGYuX3JlZ2lzdHJ5W2Nscy5uYW1lXSA9IGNscwogICAgICAgICAgICBsb2dnZXIuZGVidWcoJ1JlZ2lzdGVyZWQgVkNTIGJhY2tlbmQ6ICVzJywgY2xzLm5hbWUpCgogICAgZGVmIHVucmVnaXN0ZXIoc2VsZiwgY2xzPU5vbmUsIG5hbWU9Tm9uZSk6CiAgICAgICAgaWYgbmFtZSBpbiBzZWxmLl9yZWdpc3RyeToKICAgICAgICAgICAgZGVsIHNlbGYuX3JlZ2lzdHJ5W25hbWVdCiAgICAgICAgZWxpZiBjbHMgaW4gc2VsZi5fcmVnaXN0cnkudmFsdWVzKCk6CiAgICAgICAgICAgIGRlbCBzZWxmLl9yZWdpc3RyeVtjbHMubmFtZV0KICAgICAgICBlbHNlOgogICAgICAgICAgICBsb2dnZXIud2FybmluZygnQ2Fubm90IHVucmVnaXN0ZXIgYmVjYXVzZSBubyBjbGFzcyBvciBuYW1lIGdpdmVuJykKCiAgICBkZWYgZ2V0X2JhY2tlbmRfbmFtZShzZWxmLCBsb2NhdGlvbik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSB2ZXJzaW9uIGNvbnRyb2wgYmFja2VuZCBpZiBmb3VuZCBhdCBnaXZlbgogICAgICAgIGxvY2F0aW9uLCBlLmcuIHZjcy5nZXRfYmFja2VuZF9uYW1lKCcvcGF0aC90by92Y3MvY2hlY2tvdXQnKQogICAgICAgICIiIgogICAgICAgIGZvciB2Y190eXBlIGluIHNlbGYuX3JlZ2lzdHJ5LnZhbHVlcygpOgogICAgICAgICAgICBpZiB2Y190eXBlLmNvbnRyb2xzX2xvY2F0aW9uKGxvY2F0aW9uKToKICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnRGV0ZXJtaW5lIHRoYXQgJXMgdXNlcyBWQ1M6ICVzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiwgdmNfdHlwZS5uYW1lKQogICAgICAgICAgICAgICAgcmV0dXJuIHZjX3R5cGUubmFtZQogICAgICAgIHJldHVybiBOb25lCgogICAgZGVmIGdldF9iYWNrZW5kKHNlbGYsIG5hbWUpOgogICAgICAgIG5hbWUgPSBuYW1lLmxvd2VyKCkKICAgICAgICBpZiBuYW1lIGluIHNlbGYuX3JlZ2lzdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5fcmVnaXN0cnlbbmFtZV0KCiAgICBkZWYgZ2V0X2JhY2tlbmRfZnJvbV9sb2NhdGlvbihzZWxmLCBsb2NhdGlvbik6CiAgICAgICAgdmNfdHlwZSA9IHNlbGYuZ2V0X2JhY2tlbmRfbmFtZShsb2NhdGlvbikKICAgICAgICBpZiB2Y190eXBlOgogICAgICAgICAgICByZXR1cm4gc2VsZi5nZXRfYmFja2VuZCh2Y190eXBlKQogICAgICAgIHJldHVybiBOb25lCgoKdmNzID0gVmNzU3VwcG9ydCgpCgoKY2xhc3MgVmVyc2lvbkNvbnRyb2wob2JqZWN0KToKICAgIG5hbWUgPSAnJwogICAgZGlybmFtZSA9ICcnCiAgICAjIExpc3Qgb2Ygc3VwcG9ydGVkIHNjaGVtZXMgZm9yIHRoaXMgVmVyc2lvbiBDb250cm9sCiAgICBzY2hlbWVzID0gKCkKCiAgICBkZWYgX19pbml0X18oc2VsZiwgdXJsPU5vbmUsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgc2VsZi51cmwgPSB1cmwKICAgICAgICBzdXBlcihWZXJzaW9uQ29udHJvbCwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3dhcmdzKQoKICAgIGRlZiBfaXNfbG9jYWxfcmVwb3NpdG9yeShzZWxmLCByZXBvKToKICAgICAgICAiIiIKICAgICAgICAgICBwb3NpeCBhYnNvbHV0ZSBwYXRocyBzdGFydCB3aXRoIG9zLnBhdGguc2VwLAogICAgICAgICAgIHdpbjMyIG9uZXMgc3RhcnQgd2l0aCBkcml2ZSAobGlrZSBjOlxcZm9sZGVyKQogICAgICAgICIiIgogICAgICAgIGRyaXZlLCB0YWlsID0gb3MucGF0aC5zcGxpdGRyaXZlKHJlcG8pCiAgICAgICAgcmV0dXJuIHJlcG8uc3RhcnRzd2l0aChvcy5wYXRoLnNlcCkgb3IgZHJpdmUKCiAgICAjIFNlZSBpc3N1ZSAjMTA4MyBmb3Igd2h5IHRoaXMgbWV0aG9kIHdhcyBpbnRyb2R1Y2VkOgogICAgIyBodHRwczovL2dpdGh1Yi5jb20vcHlwYS9waXAvaXNzdWVzLzEwODMKICAgIGRlZiB0cmFuc2xhdGVfZWdnX3N1cm5hbWUoc2VsZiwgc3VybmFtZSk6CiAgICAgICAgIyBGb3IgZXhhbXBsZSwgRGphbmdvIGhhcyBicmFuY2hlcyBvZiB0aGUgZm9ybSAic3RhYmxlLzEuNy54Ii4KICAgICAgICByZXR1cm4gc3VybmFtZS5yZXBsYWNlKCcvJywgJ18nKQoKICAgIGRlZiBleHBvcnQoc2VsZiwgbG9jYXRpb24pOgogICAgICAgICIiIgogICAgICAgIEV4cG9ydCB0aGUgcmVwb3NpdG9yeSBhdCB0aGUgdXJsIHRvIHRoZSBkZXN0aW5hdGlvbiBsb2NhdGlvbgogICAgICAgIGkuZS4gb25seSBkb3dubG9hZCB0aGUgZmlsZXMsIHdpdGhvdXQgdmNzIGluZm9ybWF0aW9ucwogICAgICAgICIiIgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKCiAgICBkZWYgZ2V0X3VybF9yZXYoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJucyB0aGUgY29ycmVjdCByZXBvc2l0b3J5IFVSTCBhbmQgcmV2aXNpb24gYnkgcGFyc2luZyB0aGUgZ2l2ZW4KICAgICAgICByZXBvc2l0b3J5IFVSTAogICAgICAgICIiIgogICAgICAgIGVycm9yX21lc3NhZ2UgPSAoCiAgICAgICAgICAgICJTb3JyeSwgJyVzJyBpcyBhIG1hbGZvcm1lZCBWQ1MgdXJsLiAiCiAgICAgICAgICAgICJUaGUgZm9ybWF0IGlzIDx2Y3M+Kzxwcm90b2NvbD46Ly88dXJsPiwgIgogICAgICAgICAgICAiZS5nLiBzdm4raHR0cDovL215cmVwby9zdm4vTXlBcHAjZWdnPU15QXBwIgogICAgICAgICkKICAgICAgICBhc3NlcnQgJysnIGluIHNlbGYudXJsLCBlcnJvcl9tZXNzYWdlICUgc2VsZi51cmwKICAgICAgICB1cmwgPSBzZWxmLnVybC5zcGxpdCgnKycsIDEpWzFdCiAgICAgICAgc2NoZW1lLCBuZXRsb2MsIHBhdGgsIHF1ZXJ5LCBmcmFnID0gdXJsbGliX3BhcnNlLnVybHNwbGl0KHVybCkKICAgICAgICByZXYgPSBOb25lCiAgICAgICAgaWYgJ0AnIGluIHBhdGg6CiAgICAgICAgICAgIHBhdGgsIHJldiA9IHBhdGgucnNwbGl0KCdAJywgMSkKICAgICAgICB1cmwgPSB1cmxsaWJfcGFyc2UudXJsdW5zcGxpdCgoc2NoZW1lLCBuZXRsb2MsIHBhdGgsIHF1ZXJ5LCAnJykpCiAgICAgICAgcmV0dXJuIHVybCwgcmV2CgogICAgZGVmIGdldF9pbmZvKHNlbGYsIGxvY2F0aW9uKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm5zICh1cmwsIHJldmlzaW9uKSwgd2hlcmUgYm90aCBhcmUgc3RyaW5ncwogICAgICAgICIiIgogICAgICAgIGFzc2VydCBub3QgbG9jYXRpb24ucnN0cmlwKCcvJykuZW5kc3dpdGgoc2VsZi5kaXJuYW1lKSwgXAogICAgICAgICAgICAnQmFkIGRpcmVjdG9yeTogJXMnICUgbG9jYXRpb24KICAgICAgICByZXR1cm4gc2VsZi5nZXRfdXJsKGxvY2F0aW9uKSwgc2VsZi5nZXRfcmV2aXNpb24obG9jYXRpb24pCgogICAgZGVmIG5vcm1hbGl6ZV91cmwoc2VsZiwgdXJsKToKICAgICAgICAiIiIKICAgICAgICBOb3JtYWxpemUgYSBVUkwgZm9yIGNvbXBhcmlzb24gYnkgdW5xdW90aW5nIGl0IGFuZCByZW1vdmluZyBhbnkKICAgICAgICB0cmFpbGluZyBzbGFzaC4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gdXJsbGliX3BhcnNlLnVucXVvdGUodXJsKS5yc3RyaXAoJy8nKQoKICAgIGRlZiBjb21wYXJlX3VybHMoc2VsZiwgdXJsMSwgdXJsMik6CiAgICAgICAgIiIiCiAgICAgICAgQ29tcGFyZSB0d28gcmVwbyBVUkxzIGZvciBpZGVudGl0eSwgaWdub3JpbmcgaW5jaWRlbnRhbCBkaWZmZXJlbmNlcy4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gKHNlbGYubm9ybWFsaXplX3VybCh1cmwxKSA9PSBzZWxmLm5vcm1hbGl6ZV91cmwodXJsMikpCgogICAgZGVmIG9idGFpbihzZWxmLCBkZXN0KToKICAgICAgICAiIiIKICAgICAgICBDYWxsZWQgd2hlbiBpbnN0YWxsaW5nIG9yIHVwZGF0aW5nIGFuIGVkaXRhYmxlIHBhY2thZ2UsIHRha2VzIHRoZQogICAgICAgIHNvdXJjZSBwYXRoIG9mIHRoZSBjaGVja291dC4KICAgICAgICAiIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCgogICAgZGVmIHN3aXRjaChzZWxmLCBkZXN0LCB1cmwsIHJldl9vcHRpb25zKToKICAgICAgICAiIiIKICAgICAgICBTd2l0Y2ggdGhlIHJlcG8gYXQgYGBkZXN0YGAgdG8gcG9pbnQgdG8gYGBVUkxgYC4KICAgICAgICAiIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCgogICAgZGVmIHVwZGF0ZShzZWxmLCBkZXN0LCByZXZfb3B0aW9ucyk6CiAgICAgICAgIiIiCiAgICAgICAgVXBkYXRlIGFuIGFscmVhZHktZXhpc3RpbmcgcmVwbyB0byB0aGUgZ2l2ZW4gYGByZXZfb3B0aW9uc2BgLgogICAgICAgICIiIgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKCiAgICBkZWYgY2hlY2tfdmVyc2lvbihzZWxmLCBkZXN0LCByZXZfb3B0aW9ucyk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIFRydWUgaWYgdGhlIHZlcnNpb24gaXMgaWRlbnRpY2FsIHRvIHdoYXQgZXhpc3RzIGFuZAogICAgICAgIGRvZXNuJ3QgbmVlZCB0byBiZSB1cGRhdGVkLgogICAgICAgICIiIgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKCiAgICBkZWYgY2hlY2tfZGVzdGluYXRpb24oc2VsZiwgZGVzdCwgdXJsLCByZXZfb3B0aW9ucywgcmV2X2Rpc3BsYXkpOgogICAgICAgICIiIgogICAgICAgIFByZXBhcmUgYSBsb2NhdGlvbiB0byByZWNlaXZlIGEgY2hlY2tvdXQvY2xvbmUuCgogICAgICAgIFJldHVybiBUcnVlIGlmIHRoZSBsb2NhdGlvbiBpcyByZWFkeSBmb3IgKGFuZCByZXF1aXJlcykgYQogICAgICAgIGNoZWNrb3V0L2Nsb25lLCBGYWxzZSBvdGhlcndpc2UuCiAgICAgICAgIiIiCiAgICAgICAgY2hlY2tvdXQgPSBUcnVlCiAgICAgICAgcHJvbXB0ID0gRmFsc2UKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhkZXN0KToKICAgICAgICAgICAgY2hlY2tvdXQgPSBGYWxzZQogICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4oZGVzdCwgc2VsZi5kaXJuYW1lKSk6CiAgICAgICAgICAgICAgICBleGlzdGluZ191cmwgPSBzZWxmLmdldF91cmwoZGVzdCkKICAgICAgICAgICAgICAgIGlmIHNlbGYuY29tcGFyZV91cmxzKGV4aXN0aW5nX3VybCwgdXJsKToKICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoCiAgICAgICAgICAgICAgICAgICAgICAgICclcyBpbiAlcyBleGlzdHMsIGFuZCBoYXMgY29ycmVjdCBVUkwgKCVzKScsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVwb19uYW1lLnRpdGxlKCksCiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlfcGF0aChkZXN0KSwKICAgICAgICAgICAgICAgICAgICAgICAgdXJsLAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5jaGVja192ZXJzaW9uKGRlc3QsIHJldl9vcHRpb25zKToKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVXBkYXRpbmcgJXMgJXMlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X3BhdGgoZGVzdCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlcG9fbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldl9kaXNwbGF5LAogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlKGRlc3QsIHJldl9vcHRpb25zKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NraXBwaW5nIGJlY2F1c2UgYWxyZWFkeSB1cC10by1kYXRlLicpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgICAgICAgICAnJXMgJXMgaW4gJXMgZXhpc3RzIHdpdGggVVJMICVzJywKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlcG9fbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheV9wYXRoKGRlc3QpLAogICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ191cmwsCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHByb21wdCA9ICgnKHMpd2l0Y2gsIChpKWdub3JlLCAodylpcGUsIChiKWFja3VwICcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgncycsICdpJywgJ3cnLCAnYicpKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgJ0RpcmVjdG9yeSAlcyBhbHJlYWR5IGV4aXN0cywgYW5kIGlzIG5vdCBhICVzICVzLicsCiAgICAgICAgICAgICAgICAgICAgZGVzdCwKICAgICAgICAgICAgICAgICAgICBzZWxmLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXBvX25hbWUsCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBwcm9tcHQgPSAoJyhpKWdub3JlLCAodylpcGUsIChiKWFja3VwICcsICgnaScsICd3JywgJ2InKSkKICAgICAgICBpZiBwcm9tcHQ6CiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgJ1RoZSBwbGFuIGlzIHRvIGluc3RhbGwgdGhlICVzIHJlcG9zaXRvcnkgJXMnLAogICAgICAgICAgICAgICAgc2VsZi5uYW1lLAogICAgICAgICAgICAgICAgdXJsLAogICAgICAgICAgICApCiAgICAgICAgICAgIHJlc3BvbnNlID0gYXNrX3BhdGhfZXhpc3RzKCdXaGF0IHRvIGRvPyAgJXMnICUgcHJvbXB0WzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9tcHRbMV0pCgogICAgICAgICAgICBpZiByZXNwb25zZSA9PSAncyc6CiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICAgICAnU3dpdGNoaW5nICVzICVzIHRvICVzJXMnLAogICAgICAgICAgICAgICAgICAgIHNlbGYucmVwb19uYW1lLAogICAgICAgICAgICAgICAgICAgIGRpc3BsYXlfcGF0aChkZXN0KSwKICAgICAgICAgICAgICAgICAgICB1cmwsCiAgICAgICAgICAgICAgICAgICAgcmV2X2Rpc3BsYXksCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBzZWxmLnN3aXRjaChkZXN0LCB1cmwsIHJldl9vcHRpb25zKQogICAgICAgICAgICBlbGlmIHJlc3BvbnNlID09ICdpJzoKICAgICAgICAgICAgICAgICMgZG8gbm90aGluZwogICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICBlbGlmIHJlc3BvbnNlID09ICd3JzoKICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdEZWxldGluZyAlcycsIGRpc3BsYXlfcGF0aChkZXN0KSkKICAgICAgICAgICAgICAgIHJtdHJlZShkZXN0KQogICAgICAgICAgICAgICAgY2hlY2tvdXQgPSBUcnVlCiAgICAgICAgICAgIGVsaWYgcmVzcG9uc2UgPT0gJ2InOgogICAgICAgICAgICAgICAgZGVzdF9kaXIgPSBiYWNrdXBfZGlyKGRlc3QpCiAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICAgICAnQmFja2luZyB1cCAlcyB0byAlcycsIGRpc3BsYXlfcGF0aChkZXN0KSwgZGVzdF9kaXIsCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBzaHV0aWwubW92ZShkZXN0LCBkZXN0X2RpcikKICAgICAgICAgICAgICAgIGNoZWNrb3V0ID0gVHJ1ZQogICAgICAgICAgICBlbGlmIHJlc3BvbnNlID09ICdhJzoKICAgICAgICAgICAgICAgIHN5cy5leGl0KC0xKQogICAgICAgIHJldHVybiBjaGVja291dAoKICAgIGRlZiB1bnBhY2soc2VsZiwgbG9jYXRpb24pOgogICAgICAgICIiIgogICAgICAgIENsZWFuIHVwIGN1cnJlbnQgbG9jYXRpb24gYW5kIGRvd25sb2FkIHRoZSB1cmwgcmVwb3NpdG9yeQogICAgICAgIChhbmQgdmNzIGluZm9zKSBpbnRvIGxvY2F0aW9uCiAgICAgICAgIiIiCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMobG9jYXRpb24pOgogICAgICAgICAgICBybXRyZWUobG9jYXRpb24pCiAgICAgICAgc2VsZi5vYnRhaW4obG9jYXRpb24pCgogICAgZGVmIGdldF9zcmNfcmVxdWlyZW1lbnQoc2VsZiwgZGlzdCwgbG9jYXRpb24pOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHJlcXVpcmVtZW50IG5lZWRlZCB0bwogICAgICAgIHJlZG93bmxvYWQgdGhlIGZpbGVzIGN1cnJlbnRseSBwcmVzZW50IGluIGxvY2F0aW9uLCBzb21ldGhpbmcKICAgICAgICBsaWtlOgogICAgICAgICAge3JlcG9zaXRvcnlfdXJsfUB7cmV2aXNpb259I2VnZz17cHJvamVjdF9uYW1lfS17dmVyc2lvbl9pZGVudGlmaWVyfQogICAgICAgICIiIgogICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKCiAgICBkZWYgZ2V0X3VybChzZWxmLCBsb2NhdGlvbik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIHRoZSB1cmwgdXNlZCBhdCBsb2NhdGlvbgogICAgICAgIFVzZWQgaW4gZ2V0X2luZm8gb3IgY2hlY2tfZGVzdGluYXRpb24KICAgICAgICAiIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCgogICAgZGVmIGdldF9yZXZpc2lvbihzZWxmLCBsb2NhdGlvbik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIHRoZSBjdXJyZW50IHJldmlzaW9uIG9mIHRoZSBmaWxlcyBhdCBsb2NhdGlvbgogICAgICAgIFVzZWQgaW4gZ2V0X2luZm8KICAgICAgICAiIiIKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCgogICAgZGVmIHJ1bl9jb21tYW5kKHNlbGYsIGNtZCwgc2hvd19zdGRvdXQ9VHJ1ZSwgY3dkPU5vbmUsCiAgICAgICAgICAgICAgICAgICAgb25fcmV0dXJuY29kZT0ncmFpc2UnLAogICAgICAgICAgICAgICAgICAgIGNvbW1hbmRfZGVzYz1Ob25lLAogICAgICAgICAgICAgICAgICAgIGV4dHJhX2Vudmlyb249Tm9uZSwgc3Bpbm5lcj1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBSdW4gYSBWQ1Mgc3ViY29tbWFuZAogICAgICAgIFRoaXMgaXMgc2ltcGx5IGEgd3JhcHBlciBhcm91bmQgY2FsbF9zdWJwcm9jZXNzIHRoYXQgYWRkcyB0aGUgVkNTCiAgICAgICAgY29tbWFuZCBuYW1lLCBhbmQgY2hlY2tzIHRoYXQgdGhlIFZDUyBpcyBhdmFpbGFibGUKICAgICAgICAiIiIKICAgICAgICBjbWQgPSBbc2VsZi5uYW1lXSArIGNtZAogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIGNhbGxfc3VicHJvY2VzcyhjbWQsIHNob3dfc3Rkb3V0LCBjd2QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25fcmV0dXJuY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kX2Rlc2MsIGV4dHJhX2Vudmlyb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbm5lcikKICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBlOgogICAgICAgICAgICAjIGVycm5vLkVOT0VOVCA9IG5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKICAgICAgICAgICAgIyBJbiBvdGhlciB3b3JkcywgdGhlIFZDUyBleGVjdXRhYmxlIGlzbid0IGF2YWlsYWJsZQogICAgICAgICAgICBpZiBlLmVycm5vID09IGVycm5vLkVOT0VOVDoKICAgICAgICAgICAgICAgIHJhaXNlIEJhZENvbW1hbmQoJ0Nhbm5vdCBmaW5kIGNvbW1hbmQgJXInICUgc2VsZi5uYW1lKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmFpc2UgICMgcmUtcmFpc2UgZXhjZXB0aW9uIGlmIGEgZGlmZmVyZW50IGVycm9yIG9jY3VycmVkCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgY29udHJvbHNfbG9jYXRpb24oY2xzLCBsb2NhdGlvbik6CiAgICAgICAgIiIiCiAgICAgICAgQ2hlY2sgaWYgYSBsb2NhdGlvbiBpcyBjb250cm9sbGVkIGJ5IHRoZSB2Y3MuCiAgICAgICAgSXQgaXMgbWVhbnQgdG8gYmUgb3ZlcnJpZGRlbiB0byBpbXBsZW1lbnQgc21hcnRlciBkZXRlY3Rpb24KICAgICAgICBtZWNoYW5pc21zIGZvciBzcGVjaWZpYyB2Y3MuCiAgICAgICAgIiIiCiAgICAgICAgbG9nZ2VyLmRlYnVnKCdDaGVja2luZyBpbiAlcyBmb3IgJXMgKCVzKS4uLicsCiAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLCBjbHMuZGlybmFtZSwgY2xzLm5hbWUpCiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihsb2NhdGlvbiwgY2xzLmRpcm5hbWUpCiAgICAgICAgcmV0dXJuIG9zLnBhdGguZXhpc3RzKHBhdGgpCgoKZGVmIGdldF9zcmNfcmVxdWlyZW1lbnQoZGlzdCwgbG9jYXRpb24pOgogICAgdmVyc2lvbl9jb250cm9sID0gdmNzLmdldF9iYWNrZW5kX2Zyb21fbG9jYXRpb24obG9jYXRpb24pCiAgICBpZiB2ZXJzaW9uX2NvbnRyb2w6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gdmVyc2lvbl9jb250cm9sKCkuZ2V0X3NyY19yZXF1aXJlbWVudChkaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbikKICAgICAgICBleGNlcHQgQmFkQ29tbWFuZDoKICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAnY2Fubm90IGRldGVybWluZSB2ZXJzaW9uIG9mIGVkaXRhYmxlIHNvdXJjZSBpbiAlcyAnCiAgICAgICAgICAgICAgICAnKCVzIGNvbW1hbmQgbm90IGZvdW5kIGluIHBhdGgpJywKICAgICAgICAgICAgICAgIGxvY2F0aW9uLAogICAgICAgICAgICAgICAgdmVyc2lvbl9jb250cm9sLm5hbWUsCiAgICAgICAgICAgICkKICAgICAgICAgICAgcmV0dXJuIGRpc3QuYXNfcmVxdWlyZW1lbnQoKQogICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgJ2Nhbm5vdCBkZXRlcm1pbmUgdmVyc2lvbiBvZiBlZGl0YWJsZSBzb3VyY2UgaW4gJXMgKGlzIG5vdCBTVk4gJwogICAgICAgICdjaGVja291dCwgR2l0IGNsb25lLCBNZXJjdXJpYWwgY2xvbmUgb3IgQmF6YWFyIGJyYW5jaCknLAogICAgICAgIGxvY2F0aW9uLAogICAgKQogICAgcmV0dXJuIGRpc3QuYXNfcmVxdWlyZW1lbnQoKQpQSwMEFAAAAAAAAAAhAPvAzMXbDgAA2w4AACEAAABweXBpX19waXBfOV8wXzMvcGlwL3Zjcy9iYXphYXIucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG9zCmltcG9ydCB0ZW1wZmlsZQoKIyBUT0RPOiBHZXQgdGhpcyBpbnRvIHNpeC5tb3Zlcy51cmxsaWIucGFyc2UKdHJ5OgogICAgZnJvbSB1cmxsaWIgaW1wb3J0IHBhcnNlIGFzIHVybGxpYl9wYXJzZQpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBpbXBvcnQgdXJscGFyc2UgYXMgdXJsbGliX3BhcnNlCgpmcm9tIHBpcC51dGlscyBpbXBvcnQgcm10cmVlLCBkaXNwbGF5X3BhdGgKZnJvbSBwaXAudmNzIGltcG9ydCB2Y3MsIFZlcnNpb25Db250cm9sCmZyb20gcGlwLmRvd25sb2FkIGltcG9ydCBwYXRoX3RvX3VybAoKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmNsYXNzIEJhemFhcihWZXJzaW9uQ29udHJvbCk6CiAgICBuYW1lID0gJ2J6cicKICAgIGRpcm5hbWUgPSAnLmJ6cicKICAgIHJlcG9fbmFtZSA9ICdicmFuY2gnCiAgICBzY2hlbWVzID0gKAogICAgICAgICdienInLCAnYnpyK2h0dHAnLCAnYnpyK2h0dHBzJywgJ2J6citzc2gnLCAnYnpyK3NmdHAnLCAnYnpyK2Z0cCcsCiAgICAgICAgJ2J6citscCcsCiAgICApCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHVybD1Ob25lLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgIHN1cGVyKEJhemFhciwgc2VsZikuX19pbml0X18odXJsLCAqYXJncywgKiprd2FyZ3MpCiAgICAgICAgIyBQeXRob24gPj0gMi43LjQsIDMuMyBkb2Vzbid0IGhhdmUgdXNlc19mcmFnbWVudCBvciBub25faGllcmFyY2hpY2FsCiAgICAgICAgIyBSZWdpc3RlciBscCBidXQgZG8gbm90IGV4cG9zZSBhcyBhIHNjaGVtZSB0byBzdXBwb3J0IGJ6citscC4KICAgICAgICBpZiBnZXRhdHRyKHVybGxpYl9wYXJzZSwgJ3VzZXNfZnJhZ21lbnQnLCBOb25lKToKICAgICAgICAgICAgdXJsbGliX3BhcnNlLnVzZXNfZnJhZ21lbnQuZXh0ZW5kKFsnbHAnXSkKICAgICAgICAgICAgdXJsbGliX3BhcnNlLm5vbl9oaWVyYXJjaGljYWwuZXh0ZW5kKFsnbHAnXSkKCiAgICBkZWYgZXhwb3J0KHNlbGYsIGxvY2F0aW9uKToKICAgICAgICAiIiIKICAgICAgICBFeHBvcnQgdGhlIEJhemFhciByZXBvc2l0b3J5IGF0IHRoZSB1cmwgdG8gdGhlIGRlc3RpbmF0aW9uIGxvY2F0aW9uCiAgICAgICAgIiIiCiAgICAgICAgdGVtcF9kaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCctZXhwb3J0JywgJ3BpcC0nKQogICAgICAgIHNlbGYudW5wYWNrKHRlbXBfZGlyKQogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGxvY2F0aW9uKToKICAgICAgICAgICAgIyBSZW1vdmUgdGhlIGxvY2F0aW9uIHRvIG1ha2Ugc3VyZSBCYXphYXIgY2FuIGV4cG9ydCBpdCBjb3JyZWN0bHkKICAgICAgICAgICAgcm10cmVlKGxvY2F0aW9uKQogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZChbJ2V4cG9ydCcsIGxvY2F0aW9uXSwgY3dkPXRlbXBfZGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfc3Rkb3V0PUZhbHNlKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIHJtdHJlZSh0ZW1wX2RpcikKCiAgICBkZWYgc3dpdGNoKHNlbGYsIGRlc3QsIHVybCwgcmV2X29wdGlvbnMpOgogICAgICAgIHNlbGYucnVuX2NvbW1hbmQoWydzd2l0Y2gnLCB1cmxdLCBjd2Q9ZGVzdCkKCiAgICBkZWYgdXBkYXRlKHNlbGYsIGRlc3QsIHJldl9vcHRpb25zKToKICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKFsncHVsbCcsICctcSddICsgcmV2X29wdGlvbnMsIGN3ZD1kZXN0KQoKICAgIGRlZiBvYnRhaW4oc2VsZiwgZGVzdCk6CiAgICAgICAgdXJsLCByZXYgPSBzZWxmLmdldF91cmxfcmV2KCkKICAgICAgICBpZiByZXY6CiAgICAgICAgICAgIHJldl9vcHRpb25zID0gWyctcicsIHJldl0KICAgICAgICAgICAgcmV2X2Rpc3BsYXkgPSAnICh0byByZXZpc2lvbiAlcyknICUgcmV2CiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV2X29wdGlvbnMgPSBbXQogICAgICAgICAgICByZXZfZGlzcGxheSA9ICcnCiAgICAgICAgaWYgc2VsZi5jaGVja19kZXN0aW5hdGlvbihkZXN0LCB1cmwsIHJldl9vcHRpb25zLCByZXZfZGlzcGxheSk6CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgJ0NoZWNraW5nIG91dCAlcyVzIHRvICVzJywKICAgICAgICAgICAgICAgIHVybCwKICAgICAgICAgICAgICAgIHJldl9kaXNwbGF5LAogICAgICAgICAgICAgICAgZGlzcGxheV9wYXRoKGRlc3QpLAogICAgICAgICAgICApCiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoWydicmFuY2gnLCAnLXEnXSArIHJldl9vcHRpb25zICsgW3VybCwgZGVzdF0pCgogICAgZGVmIGdldF91cmxfcmV2KHNlbGYpOgogICAgICAgICMgaG90Zml4IHRoZSBVUkwgc2NoZW1lIGFmdGVyIHJlbW92aW5nIGJ6cisgZnJvbSBienIrc3NoOi8vIHJlYWRkIGl0CiAgICAgICAgdXJsLCByZXYgPSBzdXBlcihCYXphYXIsIHNlbGYpLmdldF91cmxfcmV2KCkKICAgICAgICBpZiB1cmwuc3RhcnRzd2l0aCgnc3NoOi8vJyk6CiAgICAgICAgICAgIHVybCA9ICdienIrJyArIHVybAogICAgICAgIHJldHVybiB1cmwsIHJldgoKICAgIGRlZiBnZXRfdXJsKHNlbGYsIGxvY2F0aW9uKToKICAgICAgICB1cmxzID0gc2VsZi5ydW5fY29tbWFuZChbJ2luZm8nXSwgc2hvd19zdGRvdXQ9RmFsc2UsIGN3ZD1sb2NhdGlvbikKICAgICAgICBmb3IgbGluZSBpbiB1cmxzLnNwbGl0bGluZXMoKToKICAgICAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQogICAgICAgICAgICBmb3IgeCBpbiAoJ2NoZWNrb3V0IG9mIGJyYW5jaDogJywKICAgICAgICAgICAgICAgICAgICAgICdwYXJlbnQgYnJhbmNoOiAnKToKICAgICAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCh4KToKICAgICAgICAgICAgICAgICAgICByZXBvID0gbGluZS5zcGxpdCh4KVsxXQogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuX2lzX2xvY2FsX3JlcG9zaXRvcnkocmVwbyk6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXRoX3RvX3VybChyZXBvKQogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXBvCiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBkZWYgZ2V0X3JldmlzaW9uKHNlbGYsIGxvY2F0aW9uKToKICAgICAgICByZXZpc2lvbiA9IHNlbGYucnVuX2NvbW1hbmQoCiAgICAgICAgICAgIFsncmV2bm8nXSwgc2hvd19zdGRvdXQ9RmFsc2UsIGN3ZD1sb2NhdGlvbikKICAgICAgICByZXR1cm4gcmV2aXNpb24uc3BsaXRsaW5lcygpWy0xXQoKICAgIGRlZiBnZXRfc3JjX3JlcXVpcmVtZW50KHNlbGYsIGRpc3QsIGxvY2F0aW9uKToKICAgICAgICByZXBvID0gc2VsZi5nZXRfdXJsKGxvY2F0aW9uKQogICAgICAgIGlmIG5vdCByZXBvOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIGlmIG5vdCByZXBvLmxvd2VyKCkuc3RhcnRzd2l0aCgnYnpyOicpOgogICAgICAgICAgICByZXBvID0gJ2J6cisnICsgcmVwbwogICAgICAgIGVnZ19wcm9qZWN0X25hbWUgPSBkaXN0LmVnZ19uYW1lKCkuc3BsaXQoJy0nLCAxKVswXQogICAgICAgIGN1cnJlbnRfcmV2ID0gc2VsZi5nZXRfcmV2aXNpb24obG9jYXRpb24pCiAgICAgICAgcmV0dXJuICclc0AlcyNlZ2c9JXMnICUgKHJlcG8sIGN1cnJlbnRfcmV2LCBlZ2dfcHJvamVjdF9uYW1lKQoKICAgIGRlZiBjaGVja192ZXJzaW9uKHNlbGYsIGRlc3QsIHJldl9vcHRpb25zKToKICAgICAgICAiIiJBbHdheXMgYXNzdW1lIHRoZSB2ZXJzaW9ucyBkb24ndCBtYXRjaCIiIgogICAgICAgIHJldHVybiBGYWxzZQoKCnZjcy5yZWdpc3RlcihCYXphYXIpClBLAwQUAAAAAAAAACEAKL7eML0rAAC9KwAAHgAAAHB5cGlfX3BpcF85XzBfMy9waXAvdmNzL2dpdC5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgbG9nZ2luZwppbXBvcnQgdGVtcGZpbGUKaW1wb3J0IG9zLnBhdGgKCmZyb20gcGlwLmNvbXBhdCBpbXBvcnQgc2FtZWZpbGUKZnJvbSBwaXAuZXhjZXB0aW9ucyBpbXBvcnQgQmFkQ29tbWFuZApmcm9tIHBpcC5fdmVuZG9yLnNpeC5tb3Zlcy51cmxsaWIgaW1wb3J0IHBhcnNlIGFzIHVybGxpYl9wYXJzZQpmcm9tIHBpcC5fdmVuZG9yLnNpeC5tb3Zlcy51cmxsaWIgaW1wb3J0IHJlcXVlc3QgYXMgdXJsbGliX3JlcXVlc3QKZnJvbSBwaXAuX3ZlbmRvci5wYWNrYWdpbmcudmVyc2lvbiBpbXBvcnQgcGFyc2UgYXMgcGFyc2VfdmVyc2lvbgoKZnJvbSBwaXAudXRpbHMgaW1wb3J0IGRpc3BsYXlfcGF0aCwgcm10cmVlCmZyb20gcGlwLnZjcyBpbXBvcnQgdmNzLCBWZXJzaW9uQ29udHJvbAoKCnVybHNwbGl0ID0gdXJsbGliX3BhcnNlLnVybHNwbGl0CnVybHVuc3BsaXQgPSB1cmxsaWJfcGFyc2UudXJsdW5zcGxpdAoKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmNsYXNzIEdpdChWZXJzaW9uQ29udHJvbCk6CiAgICBuYW1lID0gJ2dpdCcKICAgIGRpcm5hbWUgPSAnLmdpdCcKICAgIHJlcG9fbmFtZSA9ICdjbG9uZScKICAgIHNjaGVtZXMgPSAoCiAgICAgICAgJ2dpdCcsICdnaXQraHR0cCcsICdnaXQraHR0cHMnLCAnZ2l0K3NzaCcsICdnaXQrZ2l0JywgJ2dpdCtmaWxlJywKICAgICkKCiAgICBkZWYgX19pbml0X18oc2VsZiwgdXJsPU5vbmUsICphcmdzLCAqKmt3YXJncyk6CgogICAgICAgICMgV29ya3MgYXJvdW5kIGFuIGFwcGFyZW50IEdpdCBidWcKICAgICAgICAjIChzZWUgaHR0cDovL2FydGljbGUuZ21hbmUub3JnL2dtYW5lLmNvbXAudmVyc2lvbi1jb250cm9sLmdpdC8xNDY1MDApCiAgICAgICAgaWYgdXJsOgogICAgICAgICAgICBzY2hlbWUsIG5ldGxvYywgcGF0aCwgcXVlcnksIGZyYWdtZW50ID0gdXJsc3BsaXQodXJsKQogICAgICAgICAgICBpZiBzY2hlbWUuZW5kc3dpdGgoJ2ZpbGUnKToKICAgICAgICAgICAgICAgIGluaXRpYWxfc2xhc2hlcyA9IHBhdGhbOi1sZW4ocGF0aC5sc3RyaXAoJy8nKSldCiAgICAgICAgICAgICAgICBuZXdwYXRoID0gKAogICAgICAgICAgICAgICAgICAgIGluaXRpYWxfc2xhc2hlcyArCiAgICAgICAgICAgICAgICAgICAgdXJsbGliX3JlcXVlc3QudXJsMnBhdGhuYW1lKHBhdGgpCiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoJ1xcJywgJy8nKS5sc3RyaXAoJy8nKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgdXJsID0gdXJsdW5zcGxpdCgoc2NoZW1lLCBuZXRsb2MsIG5ld3BhdGgsIHF1ZXJ5LCBmcmFnbWVudCkpCiAgICAgICAgICAgICAgICBhZnRlcl9wbHVzID0gc2NoZW1lLmZpbmQoJysnKSArIDEKICAgICAgICAgICAgICAgIHVybCA9IHNjaGVtZVs6YWZ0ZXJfcGx1c10gKyB1cmx1bnNwbGl0KAogICAgICAgICAgICAgICAgICAgIChzY2hlbWVbYWZ0ZXJfcGx1czpdLCBuZXRsb2MsIG5ld3BhdGgsIHF1ZXJ5LCBmcmFnbWVudCksCiAgICAgICAgICAgICAgICApCgogICAgICAgIHN1cGVyKEdpdCwgc2VsZikuX19pbml0X18odXJsLCAqYXJncywgKiprd2FyZ3MpCgogICAgZGVmIGdldF9naXRfdmVyc2lvbihzZWxmKToKICAgICAgICBWRVJTSU9OX1BGWCA9ICdnaXQgdmVyc2lvbiAnCiAgICAgICAgdmVyc2lvbiA9IHNlbGYucnVuX2NvbW1hbmQoWyd2ZXJzaW9uJ10sIHNob3dfc3Rkb3V0PUZhbHNlKQogICAgICAgIGlmIHZlcnNpb24uc3RhcnRzd2l0aChWRVJTSU9OX1BGWCk6CiAgICAgICAgICAgIHZlcnNpb24gPSB2ZXJzaW9uW2xlbihWRVJTSU9OX1BGWCk6XQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHZlcnNpb24gPSAnJwogICAgICAgICMgZ2V0IGZpcnN0IDMgcG9zaXRpb25zIG9mIHRoZSBnaXQgdmVyc2lvbiBiZWNhc3VlCiAgICAgICAgIyBvbiB3aW5kb3dzIGl0IGlzIHgueS56LndpbmRvd3MudCwgYW5kIHRoaXMgcGFyc2VzIGFzCiAgICAgICAgIyBMZWdhY3lWZXJzaW9uIHdoaWNoIGFsd2F5cyBzbWFsbGVyIHRoYW4gYSBWZXJzaW9uLgogICAgICAgIHZlcnNpb24gPSAnLicuam9pbih2ZXJzaW9uLnNwbGl0KCcuJylbOjNdKQogICAgICAgIHJldHVybiBwYXJzZV92ZXJzaW9uKHZlcnNpb24pCgogICAgZGVmIGV4cG9ydChzZWxmLCBsb2NhdGlvbik6CiAgICAgICAgIiIiRXhwb3J0IHRoZSBHaXQgcmVwb3NpdG9yeSBhdCB0aGUgdXJsIHRvIHRoZSBkZXN0aW5hdGlvbiBsb2NhdGlvbiIiIgogICAgICAgIHRlbXBfZGlyID0gdGVtcGZpbGUubWtkdGVtcCgnLWV4cG9ydCcsICdwaXAtJykKICAgICAgICBzZWxmLnVucGFjayh0ZW1wX2RpcikKICAgICAgICB0cnk6CiAgICAgICAgICAgIGlmIG5vdCBsb2NhdGlvbi5lbmRzd2l0aCgnLycpOgogICAgICAgICAgICAgICAgbG9jYXRpb24gPSBsb2NhdGlvbiArICcvJwogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKAogICAgICAgICAgICAgICAgWydjaGVja291dC1pbmRleCcsICctYScsICctZicsICctLXByZWZpeCcsIGxvY2F0aW9uXSwKICAgICAgICAgICAgICAgIHNob3dfc3Rkb3V0PUZhbHNlLCBjd2Q9dGVtcF9kaXIpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgcm10cmVlKHRlbXBfZGlyKQoKICAgIGRlZiBjaGVja19yZXZfb3B0aW9ucyhzZWxmLCByZXYsIGRlc3QsIHJldl9vcHRpb25zKToKICAgICAgICAiIiJDaGVjayB0aGUgcmV2aXNpb24gb3B0aW9ucyBiZWZvcmUgY2hlY2tvdXQgdG8gY29tcGVuc2F0ZSB0aGF0IHRhZ3MKICAgICAgICBhbmQgYnJhbmNoZXMgbWF5IG5lZWQgb3JpZ2luLyBhcyBhIHByZWZpeC4KICAgICAgICBSZXR1cm5zIHRoZSBTSEExIG9mIHRoZSBicmFuY2ggb3IgdGFnIGlmIGZvdW5kLgogICAgICAgICIiIgogICAgICAgIHJldmlzaW9ucyA9IHNlbGYuZ2V0X3Nob3J0X3JlZnMoZGVzdCkKCiAgICAgICAgb3JpZ2luX3JldiA9ICdvcmlnaW4vJXMnICUgcmV2CiAgICAgICAgaWYgb3JpZ2luX3JldiBpbiByZXZpc2lvbnM6CiAgICAgICAgICAgICMgcmVtb3RlIGJyYW5jaAogICAgICAgICAgICByZXR1cm4gW3JldmlzaW9uc1tvcmlnaW5fcmV2XV0KICAgICAgICBlbGlmIHJldiBpbiByZXZpc2lvbnM6CiAgICAgICAgICAgICMgYSBsb2NhbCB0YWcgb3IgYnJhbmNoIG5hbWUKICAgICAgICAgICAgcmV0dXJuIFtyZXZpc2lvbnNbcmV2XV0KICAgICAgICBlbHNlOgogICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZmluZCBhIHRhZyBvciBicmFuY2ggJyVzJywgYXNzdW1pbmcgY29tbWl0LiIsIHJldiwKICAgICAgICAgICAgKQogICAgICAgICAgICByZXR1cm4gcmV2X29wdGlvbnMKCiAgICBkZWYgY2hlY2tfdmVyc2lvbihzZWxmLCBkZXN0LCByZXZfb3B0aW9ucyk6CiAgICAgICAgIiIiCiAgICAgICAgQ29tcGFyZSB0aGUgY3VycmVudCBzaGEgdG8gdGhlIHJlZi4gcmVmIG1heSBiZSBhIGJyYW5jaCBvciB0YWcgbmFtZSwKICAgICAgICBidXQgY3VycmVudCByZXYgd2lsbCBhbHdheXMgcG9pbnQgdG8gYSBzaGEuIFRoaXMgbWVhbnMgdGhhdCBhIGJyYW5jaAogICAgICAgIG9yIHRhZyB3aWxsIG5ldmVyIGNvbXBhcmUgYXMgVHJ1ZS4gU28gdGhpcyB1bHRpbWF0ZWx5IG9ubHkgbWF0Y2hlcwogICAgICAgIGFnYWluc3QgZXhhY3Qgc2hhcy4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5nZXRfcmV2aXNpb24oZGVzdCkuc3RhcnRzd2l0aChyZXZfb3B0aW9uc1swXSkKCiAgICBkZWYgc3dpdGNoKHNlbGYsIGRlc3QsIHVybCwgcmV2X29wdGlvbnMpOgogICAgICAgIHNlbGYucnVuX2NvbW1hbmQoWydjb25maWcnLCAncmVtb3RlLm9yaWdpbi51cmwnLCB1cmxdLCBjd2Q9ZGVzdCkKICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKFsnY2hlY2tvdXQnLCAnLXEnXSArIHJldl9vcHRpb25zLCBjd2Q9ZGVzdCkKCiAgICAgICAgc2VsZi51cGRhdGVfc3VibW9kdWxlcyhkZXN0KQoKICAgIGRlZiB1cGRhdGUoc2VsZiwgZGVzdCwgcmV2X29wdGlvbnMpOgogICAgICAgICMgRmlyc3QgZmV0Y2ggY2hhbmdlcyBmcm9tIHRoZSBkZWZhdWx0IHJlbW90ZQogICAgICAgIGlmIHNlbGYuZ2V0X2dpdF92ZXJzaW9uKCkgPj0gcGFyc2VfdmVyc2lvbignMS45LjAnKToKICAgICAgICAgICAgIyBmZXRjaCB0YWdzIGluIGFkZGl0aW9uIHRvIGV2ZXJ5dGhpbmcgZWxzZQogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKFsnZmV0Y2gnLCAnLXEnLCAnLS10YWdzJ10sIGN3ZD1kZXN0KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoWydmZXRjaCcsICctcSddLCBjd2Q9ZGVzdCkKICAgICAgICAjIFRoZW4gcmVzZXQgdG8gd2FudGVkIHJldmlzaW9uIChtYXliZSBldmVuIG9yaWdpbi9tYXN0ZXIpCiAgICAgICAgaWYgcmV2X29wdGlvbnM6CiAgICAgICAgICAgIHJldl9vcHRpb25zID0gc2VsZi5jaGVja19yZXZfb3B0aW9ucygKICAgICAgICAgICAgICAgIHJldl9vcHRpb25zWzBdLCBkZXN0LCByZXZfb3B0aW9ucywKICAgICAgICAgICAgKQogICAgICAgIHNlbGYucnVuX2NvbW1hbmQoWydyZXNldCcsICctLWhhcmQnLCAnLXEnXSArIHJldl9vcHRpb25zLCBjd2Q9ZGVzdCkKICAgICAgICAjOiB1cGRhdGUgc3VibW9kdWxlcwogICAgICAgIHNlbGYudXBkYXRlX3N1Ym1vZHVsZXMoZGVzdCkKCiAgICBkZWYgb2J0YWluKHNlbGYsIGRlc3QpOgogICAgICAgIHVybCwgcmV2ID0gc2VsZi5nZXRfdXJsX3JldigpCiAgICAgICAgaWYgcmV2OgogICAgICAgICAgICByZXZfb3B0aW9ucyA9IFtyZXZdCiAgICAgICAgICAgIHJldl9kaXNwbGF5ID0gJyAodG8gJXMpJyAlIHJldgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldl9vcHRpb25zID0gWydvcmlnaW4vbWFzdGVyJ10KICAgICAgICAgICAgcmV2X2Rpc3BsYXkgPSAnJwogICAgICAgIGlmIHNlbGYuY2hlY2tfZGVzdGluYXRpb24oZGVzdCwgdXJsLCByZXZfb3B0aW9ucywgcmV2X2Rpc3BsYXkpOgogICAgICAgICAgICBsb2dnZXIuaW5mbygKICAgICAgICAgICAgICAgICdDbG9uaW5nICVzJXMgdG8gJXMnLCB1cmwsIHJldl9kaXNwbGF5LCBkaXNwbGF5X3BhdGgoZGVzdCksCiAgICAgICAgICAgICkKICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZChbJ2Nsb25lJywgJy1xJywgdXJsLCBkZXN0XSkKCiAgICAgICAgICAgIGlmIHJldjoKICAgICAgICAgICAgICAgIHJldl9vcHRpb25zID0gc2VsZi5jaGVja19yZXZfb3B0aW9ucyhyZXYsIGRlc3QsIHJldl9vcHRpb25zKQogICAgICAgICAgICAgICAgIyBPbmx5IGRvIGEgY2hlY2tvdXQgaWYgcmV2X29wdGlvbnMgZGlmZmVycyBmcm9tIEhFQUQKICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmNoZWNrX3ZlcnNpb24oZGVzdCwgcmV2X29wdGlvbnMpOgogICAgICAgICAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoCiAgICAgICAgICAgICAgICAgICAgICAgIFsnY2hlY2tvdXQnLCAnLXEnXSArIHJldl9vcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICBjd2Q9ZGVzdCwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICM6IHJlcG8gbWF5IGNvbnRhaW4gc3VibW9kdWxlcwogICAgICAgICAgICBzZWxmLnVwZGF0ZV9zdWJtb2R1bGVzKGRlc3QpCgogICAgZGVmIGdldF91cmwoc2VsZiwgbG9jYXRpb24pOgogICAgICAgICIiIlJldHVybiBVUkwgb2YgdGhlIGZpcnN0IHJlbW90ZSBlbmNvdW50ZXJlZC4iIiIKICAgICAgICByZW1vdGVzID0gc2VsZi5ydW5fY29tbWFuZCgKICAgICAgICAgICAgWydjb25maWcnLCAnLS1nZXQtcmVnZXhwJywgJ3JlbW90ZVwuLipcLnVybCddLAogICAgICAgICAgICBzaG93X3N0ZG91dD1GYWxzZSwgY3dkPWxvY2F0aW9uKQogICAgICAgIHJlbW90ZXMgPSByZW1vdGVzLnNwbGl0bGluZXMoKQogICAgICAgIGZvdW5kX3JlbW90ZSA9IHJlbW90ZXNbMF0KICAgICAgICBmb3IgcmVtb3RlIGluIHJlbW90ZXM6CiAgICAgICAgICAgIGlmIHJlbW90ZS5zdGFydHN3aXRoKCdyZW1vdGUub3JpZ2luLnVybCAnKToKICAgICAgICAgICAgICAgIGZvdW5kX3JlbW90ZSA9IHJlbW90ZQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICB1cmwgPSBmb3VuZF9yZW1vdGUuc3BsaXQoJyAnKVsxXQogICAgICAgIHJldHVybiB1cmwuc3RyaXAoKQoKICAgIGRlZiBnZXRfcmV2aXNpb24oc2VsZiwgbG9jYXRpb24pOgogICAgICAgIGN1cnJlbnRfcmV2ID0gc2VsZi5ydW5fY29tbWFuZCgKICAgICAgICAgICAgWydyZXYtcGFyc2UnLCAnSEVBRCddLCBzaG93X3N0ZG91dD1GYWxzZSwgY3dkPWxvY2F0aW9uKQogICAgICAgIHJldHVybiBjdXJyZW50X3Jldi5zdHJpcCgpCgogICAgZGVmIGdldF9mdWxsX3JlZnMoc2VsZiwgbG9jYXRpb24pOgogICAgICAgICIiIllpZWxkcyB0dXBsZXMgb2YgKGNvbW1pdCwgcmVmKSBmb3IgYnJhbmNoZXMgYW5kIHRhZ3MiIiIKICAgICAgICBvdXRwdXQgPSBzZWxmLnJ1bl9jb21tYW5kKFsnc2hvdy1yZWYnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfc3Rkb3V0PUZhbHNlLCBjd2Q9bG9jYXRpb24pCiAgICAgICAgZm9yIGxpbmUgaW4gb3V0cHV0LnN0cmlwKCkuc3BsaXRsaW5lcygpOgogICAgICAgICAgICBjb21taXQsIHJlZiA9IGxpbmUuc3BsaXQoJyAnLCAxKQogICAgICAgICAgICB5aWVsZCBjb21taXQuc3RyaXAoKSwgcmVmLnN0cmlwKCkKCiAgICBkZWYgaXNfcmVmX3JlbW90ZShzZWxmLCByZWYpOgogICAgICAgIHJldHVybiByZWYuc3RhcnRzd2l0aCgncmVmcy9yZW1vdGVzLycpCgogICAgZGVmIGlzX3JlZl9icmFuY2goc2VsZiwgcmVmKToKICAgICAgICByZXR1cm4gcmVmLnN0YXJ0c3dpdGgoJ3JlZnMvaGVhZHMvJykKCiAgICBkZWYgaXNfcmVmX3RhZyhzZWxmLCByZWYpOgogICAgICAgIHJldHVybiByZWYuc3RhcnRzd2l0aCgncmVmcy90YWdzLycpCgogICAgZGVmIGlzX3JlZl9jb21taXQoc2VsZiwgcmVmKToKICAgICAgICAiIiJBIHJlZiBpcyBhIGNvbW1pdCBzaGEgaWYgaXQgaXMgbm90IGFueXRoaW5nIGVsc2UiIiIKICAgICAgICByZXR1cm4gbm90IGFueSgoCiAgICAgICAgICAgIHNlbGYuaXNfcmVmX3JlbW90ZShyZWYpLAogICAgICAgICAgICBzZWxmLmlzX3JlZl9icmFuY2gocmVmKSwKICAgICAgICAgICAgc2VsZi5pc19yZWZfdGFnKHJlZiksCiAgICAgICAgKSkKCiAgICAjIFNob3VsZCBkZXByZWNhdGUgYGdldF9yZWZzYCBzaW5jZSBpdCdzIGFtYmlndW91cwogICAgZGVmIGdldF9yZWZzKHNlbGYsIGxvY2F0aW9uKToKICAgICAgICByZXR1cm4gc2VsZi5nZXRfc2hvcnRfcmVmcyhsb2NhdGlvbikKCiAgICBkZWYgZ2V0X3Nob3J0X3JlZnMoc2VsZiwgbG9jYXRpb24pOgogICAgICAgICIiIlJldHVybiBtYXAgb2YgbmFtZWQgcmVmcyAoYnJhbmNoZXMgb3IgdGFncykgdG8gY29tbWl0IGhhc2hlcy4iIiIKICAgICAgICBydiA9IHt9CiAgICAgICAgZm9yIGNvbW1pdCwgcmVmIGluIHNlbGYuZ2V0X2Z1bGxfcmVmcyhsb2NhdGlvbik6CiAgICAgICAgICAgIHJlZl9uYW1lID0gTm9uZQogICAgICAgICAgICBpZiBzZWxmLmlzX3JlZl9yZW1vdGUocmVmKToKICAgICAgICAgICAgICAgIHJlZl9uYW1lID0gcmVmW2xlbigncmVmcy9yZW1vdGVzLycpOl0KICAgICAgICAgICAgZWxpZiBzZWxmLmlzX3JlZl9icmFuY2gocmVmKToKICAgICAgICAgICAgICAgIHJlZl9uYW1lID0gcmVmW2xlbigncmVmcy9oZWFkcy8nKTpdCiAgICAgICAgICAgIGVsaWYgc2VsZi5pc19yZWZfdGFnKHJlZik6CiAgICAgICAgICAgICAgICByZWZfbmFtZSA9IHJlZltsZW4oJ3JlZnMvdGFncy8nKTpdCiAgICAgICAgICAgIGlmIHJlZl9uYW1lIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgcnZbcmVmX25hbWVdID0gY29tbWl0CiAgICAgICAgcmV0dXJuIHJ2CgogICAgZGVmIF9nZXRfc3ViZGlyZWN0b3J5KHNlbGYsIGxvY2F0aW9uKToKICAgICAgICAiIiJSZXR1cm4gdGhlIHJlbGF0aXZlIHBhdGggb2Ygc2V0dXAucHkgdG8gdGhlIGdpdCByZXBvIHJvb3QuIiIiCiAgICAgICAgIyBmaW5kIHRoZSByZXBvIHJvb3QKICAgICAgICBnaXRfZGlyID0gc2VsZi5ydW5fY29tbWFuZChbJ3Jldi1wYXJzZScsICctLWdpdC1kaXInXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93X3N0ZG91dD1GYWxzZSwgY3dkPWxvY2F0aW9uKS5zdHJpcCgpCiAgICAgICAgaWYgbm90IG9zLnBhdGguaXNhYnMoZ2l0X2Rpcik6CiAgICAgICAgICAgIGdpdF9kaXIgPSBvcy5wYXRoLmpvaW4obG9jYXRpb24sIGdpdF9kaXIpCiAgICAgICAgcm9vdF9kaXIgPSBvcy5wYXRoLmpvaW4oZ2l0X2RpciwgJy4uJykKICAgICAgICAjIGZpbmQgc2V0dXAucHkKICAgICAgICBvcmlnX2xvY2F0aW9uID0gbG9jYXRpb24KICAgICAgICB3aGlsZSBub3Qgb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKGxvY2F0aW9uLCAnc2V0dXAucHknKSk6CiAgICAgICAgICAgIGxhc3RfbG9jYXRpb24gPSBsb2NhdGlvbgogICAgICAgICAgICBsb2NhdGlvbiA9IG9zLnBhdGguZGlybmFtZShsb2NhdGlvbikKICAgICAgICAgICAgaWYgbG9jYXRpb24gPT0gbGFzdF9sb2NhdGlvbjoKICAgICAgICAgICAgICAgICMgV2UndmUgdHJhdmVyc2VkIHVwIHRvIHRoZSByb290IG9mIHRoZSBmaWxlc3lzdGVtIHdpdGhvdXQKICAgICAgICAgICAgICAgICMgZmluZGluZyBzZXR1cC5weQogICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBmaW5kIHNldHVwLnB5IGZvciBkaXJlY3RvcnkgJXMgKHRyaWVkIGFsbCAiCiAgICAgICAgICAgICAgICAgICAgInBhcmVudCBkaXJlY3RvcmllcykiLAogICAgICAgICAgICAgICAgICAgIG9yaWdfbG9jYXRpb24sCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgICMgcmVsYXRpdmUgcGF0aCBvZiBzZXR1cC5weSB0byByZXBvIHJvb3QKICAgICAgICBpZiBzYW1lZmlsZShyb290X2RpciwgbG9jYXRpb24pOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHJldHVybiBvcy5wYXRoLnJlbHBhdGgobG9jYXRpb24sIHJvb3RfZGlyKQoKICAgIGRlZiBnZXRfc3JjX3JlcXVpcmVtZW50KHNlbGYsIGRpc3QsIGxvY2F0aW9uKToKICAgICAgICByZXBvID0gc2VsZi5nZXRfdXJsKGxvY2F0aW9uKQogICAgICAgIGlmIG5vdCByZXBvLmxvd2VyKCkuc3RhcnRzd2l0aCgnZ2l0OicpOgogICAgICAgICAgICByZXBvID0gJ2dpdCsnICsgcmVwbwogICAgICAgIGVnZ19wcm9qZWN0X25hbWUgPSBkaXN0LmVnZ19uYW1lKCkuc3BsaXQoJy0nLCAxKVswXQogICAgICAgIGlmIG5vdCByZXBvOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIGN1cnJlbnRfcmV2ID0gc2VsZi5nZXRfcmV2aXNpb24obG9jYXRpb24pCiAgICAgICAgcmVxID0gJyVzQCVzI2VnZz0lcycgJSAocmVwbywgY3VycmVudF9yZXYsIGVnZ19wcm9qZWN0X25hbWUpCiAgICAgICAgc3ViZGlyZWN0b3J5ID0gc2VsZi5fZ2V0X3N1YmRpcmVjdG9yeShsb2NhdGlvbikKICAgICAgICBpZiBzdWJkaXJlY3Rvcnk6CiAgICAgICAgICAgIHJlcSArPSAnJnN1YmRpcmVjdG9yeT0nICsgc3ViZGlyZWN0b3J5CiAgICAgICAgcmV0dXJuIHJlcQoKICAgIGRlZiBnZXRfdXJsX3JldihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBQcmVmaXhlcyBzdHViIFVSTHMgbGlrZSAndXNlckBob3N0bmFtZTp1c2VyL3JlcG8uZ2l0JyB3aXRoICdzc2g6Ly8nLgogICAgICAgIFRoYXQncyByZXF1aXJlZCBiZWNhdXNlIGFsdGhvdWdoIHRoZXkgdXNlIFNTSCB0aGV5IHNvbWV0aW1lcyBkb2Vzbid0CiAgICAgICAgd29yayB3aXRoIGEgc3NoOi8vIHNjaGVtZSAoZS5nLiBHaXRodWIpLiBCdXQgd2UgbmVlZCBhIHNjaGVtZSBmb3IKICAgICAgICBwYXJzaW5nLiBIZW5jZSB3ZSByZW1vdmUgaXQgYWdhaW4gYWZ0ZXJ3YXJkcyBhbmQgcmV0dXJuIGl0IGFzIGEgc3R1Yi4KICAgICAgICAiIiIKICAgICAgICBpZiAnOi8vJyBub3QgaW4gc2VsZi51cmw6CiAgICAgICAgICAgIGFzc2VydCAnZmlsZTonIG5vdCBpbiBzZWxmLnVybAogICAgICAgICAgICBzZWxmLnVybCA9IHNlbGYudXJsLnJlcGxhY2UoJ2dpdCsnLCAnZ2l0K3NzaDovLycpCiAgICAgICAgICAgIHVybCwgcmV2ID0gc3VwZXIoR2l0LCBzZWxmKS5nZXRfdXJsX3JldigpCiAgICAgICAgICAgIHVybCA9IHVybC5yZXBsYWNlKCdzc2g6Ly8nLCAnJykKICAgICAgICBlbHNlOgogICAgICAgICAgICB1cmwsIHJldiA9IHN1cGVyKEdpdCwgc2VsZikuZ2V0X3VybF9yZXYoKQoKICAgICAgICByZXR1cm4gdXJsLCByZXYKCiAgICBkZWYgdXBkYXRlX3N1Ym1vZHVsZXMoc2VsZiwgbG9jYXRpb24pOgogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4obG9jYXRpb24sICcuZ2l0bW9kdWxlcycpKToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgKICAgICAgICAgICAgWydzdWJtb2R1bGUnLCAndXBkYXRlJywgJy0taW5pdCcsICctLXJlY3Vyc2l2ZScsICctcSddLAogICAgICAgICAgICBjd2Q9bG9jYXRpb24sCiAgICAgICAgKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGNvbnRyb2xzX2xvY2F0aW9uKGNscywgbG9jYXRpb24pOgogICAgICAgIGlmIHN1cGVyKEdpdCwgY2xzKS5jb250cm9sc19sb2NhdGlvbihsb2NhdGlvbik6CiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgdHJ5OgogICAgICAgICAgICByID0gY2xzKCkucnVuX2NvbW1hbmQoWydyZXYtcGFyc2UnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN3ZD1sb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfc3Rkb3V0PUZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25fcmV0dXJuY29kZT0naWdub3JlJykKICAgICAgICAgICAgcmV0dXJuIG5vdCByCiAgICAgICAgZXhjZXB0IEJhZENvbW1hbmQ6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiY291bGQgbm90IGRldGVybWluZSBpZiAlcyBpcyB1bmRlciBnaXQgY29udHJvbCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAiYmVjYXVzZSBnaXQgaXMgbm90IGF2YWlsYWJsZSIsIGxvY2F0aW9uKQogICAgICAgICAgICByZXR1cm4gRmFsc2UKCgp2Y3MucmVnaXN0ZXIoR2l0KQpQSwMEFAAAAAAAAAAhAHliah2QDQAAkA0AACQAAABweXBpX19waXBfOV8wXzMvcGlwL3Zjcy9tZXJjdXJpYWwucHlmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG9zCmltcG9ydCB0ZW1wZmlsZQoKZnJvbSBwaXAudXRpbHMgaW1wb3J0IGRpc3BsYXlfcGF0aCwgcm10cmVlCmZyb20gcGlwLnZjcyBpbXBvcnQgdmNzLCBWZXJzaW9uQ29udHJvbApmcm9tIHBpcC5kb3dubG9hZCBpbXBvcnQgcGF0aF90b191cmwKZnJvbSBwaXAuX3ZlbmRvci5zaXgubW92ZXMgaW1wb3J0IGNvbmZpZ3BhcnNlcgoKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQoKCmNsYXNzIE1lcmN1cmlhbChWZXJzaW9uQ29udHJvbCk6CiAgICBuYW1lID0gJ2hnJwogICAgZGlybmFtZSA9ICcuaGcnCiAgICByZXBvX25hbWUgPSAnY2xvbmUnCiAgICBzY2hlbWVzID0gKCdoZycsICdoZytodHRwJywgJ2hnK2h0dHBzJywgJ2hnK3NzaCcsICdoZytzdGF0aWMtaHR0cCcpCgogICAgZGVmIGV4cG9ydChzZWxmLCBsb2NhdGlvbik6CiAgICAgICAgIiIiRXhwb3J0IHRoZSBIZyByZXBvc2l0b3J5IGF0IHRoZSB1cmwgdG8gdGhlIGRlc3RpbmF0aW9uIGxvY2F0aW9uIiIiCiAgICAgICAgdGVtcF9kaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCctZXhwb3J0JywgJ3BpcC0nKQogICAgICAgIHNlbGYudW5wYWNrKHRlbXBfZGlyKQogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgKICAgICAgICAgICAgICAgIFsnYXJjaGl2ZScsIGxvY2F0aW9uXSwgc2hvd19zdGRvdXQ9RmFsc2UsIGN3ZD10ZW1wX2RpcikKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBybXRyZWUodGVtcF9kaXIpCgogICAgZGVmIHN3aXRjaChzZWxmLCBkZXN0LCB1cmwsIHJldl9vcHRpb25zKToKICAgICAgICByZXBvX2NvbmZpZyA9IG9zLnBhdGguam9pbihkZXN0LCBzZWxmLmRpcm5hbWUsICdoZ3JjJykKICAgICAgICBjb25maWcgPSBjb25maWdwYXJzZXIuU2FmZUNvbmZpZ1BhcnNlcigpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBjb25maWcucmVhZChyZXBvX2NvbmZpZykKICAgICAgICAgICAgY29uZmlnLnNldCgncGF0aHMnLCAnZGVmYXVsdCcsIHVybCkKICAgICAgICAgICAgd2l0aCBvcGVuKHJlcG9fY29uZmlnLCAndycpIGFzIGNvbmZpZ19maWxlOgogICAgICAgICAgICAgICAgY29uZmlnLndyaXRlKGNvbmZpZ19maWxlKQogICAgICAgIGV4Y2VwdCAoT1NFcnJvciwgY29uZmlncGFyc2VyLk5vU2VjdGlvbkVycm9yKSBhcyBleGM6CiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgJ0NvdWxkIG5vdCBzd2l0Y2ggTWVyY3VyaWFsIHJlcG9zaXRvcnkgdG8gJXM6ICVzJywgdXJsLCBleGMsCiAgICAgICAgICAgICkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKFsndXBkYXRlJywgJy1xJ10gKyByZXZfb3B0aW9ucywgY3dkPWRlc3QpCgogICAgZGVmIHVwZGF0ZShzZWxmLCBkZXN0LCByZXZfb3B0aW9ucyk6CiAgICAgICAgc2VsZi5ydW5fY29tbWFuZChbJ3B1bGwnLCAnLXEnXSwgY3dkPWRlc3QpCiAgICAgICAgc2VsZi5ydW5fY29tbWFuZChbJ3VwZGF0ZScsICctcSddICsgcmV2X29wdGlvbnMsIGN3ZD1kZXN0KQoKICAgIGRlZiBvYnRhaW4oc2VsZiwgZGVzdCk6CiAgICAgICAgdXJsLCByZXYgPSBzZWxmLmdldF91cmxfcmV2KCkKICAgICAgICBpZiByZXY6CiAgICAgICAgICAgIHJldl9vcHRpb25zID0gW3Jldl0KICAgICAgICAgICAgcmV2X2Rpc3BsYXkgPSAnICh0byByZXZpc2lvbiAlcyknICUgcmV2CiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV2X29wdGlvbnMgPSBbXQogICAgICAgICAgICByZXZfZGlzcGxheSA9ICcnCiAgICAgICAgaWYgc2VsZi5jaGVja19kZXN0aW5hdGlvbihkZXN0LCB1cmwsIHJldl9vcHRpb25zLCByZXZfZGlzcGxheSk6CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgJ0Nsb25pbmcgaGcgJXMlcyB0byAlcycsCiAgICAgICAgICAgICAgICB1cmwsCiAgICAgICAgICAgICAgICByZXZfZGlzcGxheSwKICAgICAgICAgICAgICAgIGRpc3BsYXlfcGF0aChkZXN0KSwKICAgICAgICAgICAgKQogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKFsnY2xvbmUnLCAnLS1ub3VwZGF0ZScsICctcScsIHVybCwgZGVzdF0pCiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoWyd1cGRhdGUnLCAnLXEnXSArIHJldl9vcHRpb25zLCBjd2Q9ZGVzdCkKCiAgICBkZWYgZ2V0X3VybChzZWxmLCBsb2NhdGlvbik6CiAgICAgICAgdXJsID0gc2VsZi5ydW5fY29tbWFuZCgKICAgICAgICAgICAgWydzaG93Y29uZmlnJywgJ3BhdGhzLmRlZmF1bHQnXSwKICAgICAgICAgICAgc2hvd19zdGRvdXQ9RmFsc2UsIGN3ZD1sb2NhdGlvbikuc3RyaXAoKQogICAgICAgIGlmIHNlbGYuX2lzX2xvY2FsX3JlcG9zaXRvcnkodXJsKToKICAgICAgICAgICAgdXJsID0gcGF0aF90b191cmwodXJsKQogICAgICAgIHJldHVybiB1cmwuc3RyaXAoKQoKICAgIGRlZiBnZXRfcmV2aXNpb24oc2VsZiwgbG9jYXRpb24pOgogICAgICAgIGN1cnJlbnRfcmV2aXNpb24gPSBzZWxmLnJ1bl9jb21tYW5kKAogICAgICAgICAgICBbJ3BhcmVudHMnLCAnLS10ZW1wbGF0ZT17cmV2fSddLAogICAgICAgICAgICBzaG93X3N0ZG91dD1GYWxzZSwgY3dkPWxvY2F0aW9uKS5zdHJpcCgpCiAgICAgICAgcmV0dXJuIGN1cnJlbnRfcmV2aXNpb24KCiAgICBkZWYgZ2V0X3JldmlzaW9uX2hhc2goc2VsZiwgbG9jYXRpb24pOgogICAgICAgIGN1cnJlbnRfcmV2X2hhc2ggPSBzZWxmLnJ1bl9jb21tYW5kKAogICAgICAgICAgICBbJ3BhcmVudHMnLCAnLS10ZW1wbGF0ZT17bm9kZX0nXSwKICAgICAgICAgICAgc2hvd19zdGRvdXQ9RmFsc2UsIGN3ZD1sb2NhdGlvbikuc3RyaXAoKQogICAgICAgIHJldHVybiBjdXJyZW50X3Jldl9oYXNoCgogICAgZGVmIGdldF9zcmNfcmVxdWlyZW1lbnQoc2VsZiwgZGlzdCwgbG9jYXRpb24pOgogICAgICAgIHJlcG8gPSBzZWxmLmdldF91cmwobG9jYXRpb24pCiAgICAgICAgaWYgbm90IHJlcG8ubG93ZXIoKS5zdGFydHN3aXRoKCdoZzonKToKICAgICAgICAgICAgcmVwbyA9ICdoZysnICsgcmVwbwogICAgICAgIGVnZ19wcm9qZWN0X25hbWUgPSBkaXN0LmVnZ19uYW1lKCkuc3BsaXQoJy0nLCAxKVswXQogICAgICAgIGlmIG5vdCByZXBvOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIGN1cnJlbnRfcmV2X2hhc2ggPSBzZWxmLmdldF9yZXZpc2lvbl9oYXNoKGxvY2F0aW9uKQogICAgICAgIHJldHVybiAnJXNAJXMjZWdnPSVzJyAlIChyZXBvLCBjdXJyZW50X3Jldl9oYXNoLCBlZ2dfcHJvamVjdF9uYW1lKQoKICAgIGRlZiBjaGVja192ZXJzaW9uKHNlbGYsIGRlc3QsIHJldl9vcHRpb25zKToKICAgICAgICAiIiJBbHdheXMgYXNzdW1lIHRoZSB2ZXJzaW9ucyBkb24ndCBtYXRjaCIiIgogICAgICAgIHJldHVybiBGYWxzZQoKdmNzLnJlZ2lzdGVyKE1lcmN1cmlhbCkKUEsDBBQAAAAAAAAAIQBuNJVBhiQAAIYkAAAlAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC92Y3Mvc3VidmVyc2lvbi5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgbG9nZ2luZwppbXBvcnQgb3MKaW1wb3J0IHJlCgpmcm9tIHBpcC5fdmVuZG9yLnNpeC5tb3Zlcy51cmxsaWIgaW1wb3J0IHBhcnNlIGFzIHVybGxpYl9wYXJzZQoKZnJvbSBwaXAuaW5kZXggaW1wb3J0IExpbmsKZnJvbSBwaXAudXRpbHMgaW1wb3J0IHJtdHJlZSwgZGlzcGxheV9wYXRoCmZyb20gcGlwLnV0aWxzLmxvZ2dpbmcgaW1wb3J0IGluZGVudF9sb2cKZnJvbSBwaXAudmNzIGltcG9ydCB2Y3MsIFZlcnNpb25Db250cm9sCgpfc3ZuX3htbF91cmxfcmUgPSByZS5jb21waWxlKCd1cmw9IihbXiJdKykiJykKX3N2bl9yZXZfcmUgPSByZS5jb21waWxlKCdjb21taXR0ZWQtcmV2PSIoXGQrKSInKQpfc3ZuX3VybF9yZSA9IHJlLmNvbXBpbGUocidVUkw6ICguKyknKQpfc3ZuX3JldmlzaW9uX3JlID0gcmUuY29tcGlsZShyJ1JldmlzaW9uOiAoLispJykKX3N2bl9pbmZvX3htbF9yZXZfcmUgPSByZS5jb21waWxlKHInXHMqcmV2aXNpb249IihcZCspIicpCl9zdm5faW5mb194bWxfdXJsX3JlID0gcmUuY29tcGlsZShyJzx1cmw+KC4qKTwvdXJsPicpCgoKbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoX19uYW1lX18pCgoKY2xhc3MgU3VidmVyc2lvbihWZXJzaW9uQ29udHJvbCk6CiAgICBuYW1lID0gJ3N2bicKICAgIGRpcm5hbWUgPSAnLnN2bicKICAgIHJlcG9fbmFtZSA9ICdjaGVja291dCcKICAgIHNjaGVtZXMgPSAoJ3N2bicsICdzdm4rc3NoJywgJ3N2bitodHRwJywgJ3N2bitodHRwcycsICdzdm4rc3ZuJykKCiAgICBkZWYgZ2V0X2luZm8oc2VsZiwgbG9jYXRpb24pOgogICAgICAgICIiIlJldHVybnMgKHVybCwgcmV2aXNpb24pLCB3aGVyZSBib3RoIGFyZSBzdHJpbmdzIiIiCiAgICAgICAgYXNzZXJ0IG5vdCBsb2NhdGlvbi5yc3RyaXAoJy8nKS5lbmRzd2l0aChzZWxmLmRpcm5hbWUpLCBcCiAgICAgICAgICAgICdCYWQgZGlyZWN0b3J5OiAlcycgJSBsb2NhdGlvbgogICAgICAgIG91dHB1dCA9IHNlbGYucnVuX2NvbW1hbmQoCiAgICAgICAgICAgIFsnaW5mbycsIGxvY2F0aW9uXSwKICAgICAgICAgICAgc2hvd19zdGRvdXQ9RmFsc2UsCiAgICAgICAgICAgIGV4dHJhX2Vudmlyb249eydMQU5HJzogJ0MnfSwKICAgICAgICApCiAgICAgICAgbWF0Y2ggPSBfc3ZuX3VybF9yZS5zZWFyY2gob3V0cHV0KQogICAgICAgIGlmIG5vdCBtYXRjaDoKICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCiAgICAgICAgICAgICAgICAnQ2Fubm90IGRldGVybWluZSBVUkwgb2Ygc3ZuIGNoZWNrb3V0ICVzJywKICAgICAgICAgICAgICAgIGRpc3BsYXlfcGF0aChsb2NhdGlvbiksCiAgICAgICAgICAgICkKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdPdXRwdXQgdGhhdCBjYW5ub3QgYmUgcGFyc2VkOiBcbiVzJywgb3V0cHV0KQogICAgICAgICAgICByZXR1cm4gTm9uZSwgTm9uZQogICAgICAgIHVybCA9IG1hdGNoLmdyb3VwKDEpLnN0cmlwKCkKICAgICAgICBtYXRjaCA9IF9zdm5fcmV2aXNpb25fcmUuc2VhcmNoKG91dHB1dCkKICAgICAgICBpZiBub3QgbWF0Y2g6CiAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgJ0Nhbm5vdCBkZXRlcm1pbmUgcmV2aXNpb24gb2Ygc3ZuIGNoZWNrb3V0ICVzJywKICAgICAgICAgICAgICAgIGRpc3BsYXlfcGF0aChsb2NhdGlvbiksCiAgICAgICAgICAgICkKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCdPdXRwdXQgdGhhdCBjYW5ub3QgYmUgcGFyc2VkOiBcbiVzJywgb3V0cHV0KQogICAgICAgICAgICByZXR1cm4gdXJsLCBOb25lCiAgICAgICAgcmV0dXJuIHVybCwgbWF0Y2guZ3JvdXAoMSkKCiAgICBkZWYgZXhwb3J0KHNlbGYsIGxvY2F0aW9uKToKICAgICAgICAiIiJFeHBvcnQgdGhlIHN2biByZXBvc2l0b3J5IGF0IHRoZSB1cmwgdG8gdGhlIGRlc3RpbmF0aW9uIGxvY2F0aW9uIiIiCiAgICAgICAgdXJsLCByZXYgPSBzZWxmLmdldF91cmxfcmV2KCkKICAgICAgICByZXZfb3B0aW9ucyA9IGdldF9yZXZfb3B0aW9ucyh1cmwsIHJldikKICAgICAgICB1cmwgPSBzZWxmLnJlbW92ZV9hdXRoX2Zyb21fdXJsKHVybCkKICAgICAgICBsb2dnZXIuaW5mbygnRXhwb3J0aW5nIHN2biByZXBvc2l0b3J5ICVzIHRvICVzJywgdXJsLCBsb2NhdGlvbikKICAgICAgICB3aXRoIGluZGVudF9sb2coKToKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMobG9jYXRpb24pOgogICAgICAgICAgICAgICAgIyBTdWJ2ZXJzaW9uIGRvZXNuJ3QgbGlrZSB0byBjaGVjayBvdXQgb3ZlciBhbiBleGlzdGluZwogICAgICAgICAgICAgICAgIyBkaXJlY3RvcnkgLS1mb3JjZSBmaXhlcyB0aGlzLCBidXQgd2FzIG9ubHkgYWRkZWQgaW4gc3ZuIDEuNQogICAgICAgICAgICAgICAgcm10cmVlKGxvY2F0aW9uKQogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKAogICAgICAgICAgICAgICAgWydleHBvcnQnXSArIHJldl9vcHRpb25zICsgW3VybCwgbG9jYXRpb25dLAogICAgICAgICAgICAgICAgc2hvd19zdGRvdXQ9RmFsc2UpCgogICAgZGVmIHN3aXRjaChzZWxmLCBkZXN0LCB1cmwsIHJldl9vcHRpb25zKToKICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKFsnc3dpdGNoJ10gKyByZXZfb3B0aW9ucyArIFt1cmwsIGRlc3RdKQoKICAgIGRlZiB1cGRhdGUoc2VsZiwgZGVzdCwgcmV2X29wdGlvbnMpOgogICAgICAgIHNlbGYucnVuX2NvbW1hbmQoWyd1cGRhdGUnXSArIHJldl9vcHRpb25zICsgW2Rlc3RdKQoKICAgIGRlZiBvYnRhaW4oc2VsZiwgZGVzdCk6CiAgICAgICAgdXJsLCByZXYgPSBzZWxmLmdldF91cmxfcmV2KCkKICAgICAgICByZXZfb3B0aW9ucyA9IGdldF9yZXZfb3B0aW9ucyh1cmwsIHJldikKICAgICAgICB1cmwgPSBzZWxmLnJlbW92ZV9hdXRoX2Zyb21fdXJsKHVybCkKICAgICAgICBpZiByZXY6CiAgICAgICAgICAgIHJldl9kaXNwbGF5ID0gJyAodG8gcmV2aXNpb24gJXMpJyAlIHJldgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldl9kaXNwbGF5ID0gJycKICAgICAgICBpZiBzZWxmLmNoZWNrX2Rlc3RpbmF0aW9uKGRlc3QsIHVybCwgcmV2X29wdGlvbnMsIHJldl9kaXNwbGF5KToKICAgICAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAnQ2hlY2tpbmcgb3V0ICVzJXMgdG8gJXMnLAogICAgICAgICAgICAgICAgdXJsLAogICAgICAgICAgICAgICAgcmV2X2Rpc3BsYXksCiAgICAgICAgICAgICAgICBkaXNwbGF5X3BhdGgoZGVzdCksCiAgICAgICAgICAgICkKICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZChbJ2NoZWNrb3V0JywgJy1xJ10gKyByZXZfb3B0aW9ucyArIFt1cmwsIGRlc3RdKQoKICAgIGRlZiBnZXRfbG9jYXRpb24oc2VsZiwgZGlzdCwgZGVwZW5kZW5jeV9saW5rcyk6CiAgICAgICAgZm9yIHVybCBpbiBkZXBlbmRlbmN5X2xpbmtzOgogICAgICAgICAgICBlZ2dfZnJhZ21lbnQgPSBMaW5rKHVybCkuZWdnX2ZyYWdtZW50CiAgICAgICAgICAgIGlmIG5vdCBlZ2dfZnJhZ21lbnQ6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiAnLScgaW4gZWdnX2ZyYWdtZW50OgogICAgICAgICAgICAgICAgIyBGSVhNRTogd2lsbCB0aGlzIHdvcmsgd2hlbiBhIHBhY2thZ2UgaGFzIC0gaW4gdGhlIG5hbWU/CiAgICAgICAgICAgICAgICBrZXkgPSAnLScuam9pbihlZ2dfZnJhZ21lbnQuc3BsaXQoJy0nKVs6LTFdKS5sb3dlcigpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBrZXkgPSBlZ2dfZnJhZ21lbnQKICAgICAgICAgICAgaWYga2V5ID09IGRpc3Qua2V5OgogICAgICAgICAgICAgICAgcmV0dXJuIHVybC5zcGxpdCgnIycsIDEpWzBdCiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBkZWYgZ2V0X3JldmlzaW9uKHNlbGYsIGxvY2F0aW9uKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gdGhlIG1heGltdW0gcmV2aXNpb24gZm9yIGFsbCBmaWxlcyB1bmRlciBhIGdpdmVuIGxvY2F0aW9uCiAgICAgICAgIiIiCiAgICAgICAgIyBOb3RlOiB0YWtlbiBmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbwogICAgICAgIHJldmlzaW9uID0gMAoKICAgICAgICBmb3IgYmFzZSwgZGlycywgZmlsZXMgaW4gb3Mud2Fsayhsb2NhdGlvbik6CiAgICAgICAgICAgIGlmIHNlbGYuZGlybmFtZSBub3QgaW4gZGlyczoKICAgICAgICAgICAgICAgIGRpcnNbOl0gPSBbXQogICAgICAgICAgICAgICAgY29udGludWUgICAgIyBubyBzZW5zZSB3YWxraW5nIHVuY29udHJvbGxlZCBzdWJkaXJzCiAgICAgICAgICAgIGRpcnMucmVtb3ZlKHNlbGYuZGlybmFtZSkKICAgICAgICAgICAgZW50cmllc19mbiA9IG9zLnBhdGguam9pbihiYXNlLCBzZWxmLmRpcm5hbWUsICdlbnRyaWVzJykKICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGVudHJpZXNfZm4pOgogICAgICAgICAgICAgICAgIyBGSVhNRTogc2hvdWxkIHdlIHdhcm4/CiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgZGlydXJsLCBsb2NhbHJldiA9IHNlbGYuX2dldF9zdm5fdXJsX3JldihiYXNlKQoKICAgICAgICAgICAgaWYgYmFzZSA9PSBsb2NhdGlvbjoKICAgICAgICAgICAgICAgIGJhc2VfdXJsID0gZGlydXJsICsgJy8nICAgIyBzYXZlIHRoZSByb290IHVybAogICAgICAgICAgICBlbGlmIG5vdCBkaXJ1cmwgb3Igbm90IGRpcnVybC5zdGFydHN3aXRoKGJhc2VfdXJsKToKICAgICAgICAgICAgICAgIGRpcnNbOl0gPSBbXQogICAgICAgICAgICAgICAgY29udGludWUgICAgIyBub3QgcGFydCBvZiB0aGUgc2FtZSBzdm4gdHJlZSwgc2tpcCBpdAogICAgICAgICAgICByZXZpc2lvbiA9IG1heChyZXZpc2lvbiwgbG9jYWxyZXYpCiAgICAgICAgcmV0dXJuIHJldmlzaW9uCgogICAgZGVmIGdldF91cmxfcmV2KHNlbGYpOgogICAgICAgICMgaG90Zml4IHRoZSBVUkwgc2NoZW1lIGFmdGVyIHJlbW92aW5nIHN2bisgZnJvbSBzdm4rc3NoOi8vIHJlYWRkIGl0CiAgICAgICAgdXJsLCByZXYgPSBzdXBlcihTdWJ2ZXJzaW9uLCBzZWxmKS5nZXRfdXJsX3JldigpCiAgICAgICAgaWYgdXJsLnN0YXJ0c3dpdGgoJ3NzaDovLycpOgogICAgICAgICAgICB1cmwgPSAnc3ZuKycgKyB1cmwKICAgICAgICByZXR1cm4gdXJsLCByZXYKCiAgICBkZWYgZ2V0X3VybChzZWxmLCBsb2NhdGlvbik6CiAgICAgICAgIyBJbiBjYXNlcyB3aGVyZSB0aGUgc291cmNlIGlzIGluIGEgc3ViZGlyZWN0b3J5LCBub3QgYWxvbmdzaWRlCiAgICAgICAgIyBzZXR1cC5weSB3ZSBoYXZlIHRvIGxvb2sgdXAgaW4gdGhlIGxvY2F0aW9uIHVudGlsIHdlIGZpbmQgYSByZWFsCiAgICAgICAgIyBzZXR1cC5weQogICAgICAgIG9yaWdfbG9jYXRpb24gPSBsb2NhdGlvbgogICAgICAgIHdoaWxlIG5vdCBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4obG9jYXRpb24sICdzZXR1cC5weScpKToKICAgICAgICAgICAgbGFzdF9sb2NhdGlvbiA9IGxvY2F0aW9uCiAgICAgICAgICAgIGxvY2F0aW9uID0gb3MucGF0aC5kaXJuYW1lKGxvY2F0aW9uKQogICAgICAgICAgICBpZiBsb2NhdGlvbiA9PSBsYXN0X2xvY2F0aW9uOgogICAgICAgICAgICAgICAgIyBXZSd2ZSB0cmF2ZXJzZWQgdXAgdG8gdGhlIHJvb3Qgb2YgdGhlIGZpbGVzeXN0ZW0gd2l0aG91dAogICAgICAgICAgICAgICAgIyBmaW5kaW5nIHNldHVwLnB5CiAgICAgICAgICAgICAgICBsb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGZpbmQgc2V0dXAucHkgZm9yIGRpcmVjdG9yeSAlcyAodHJpZWQgYWxsICIKICAgICAgICAgICAgICAgICAgICAicGFyZW50IGRpcmVjdG9yaWVzKSIsCiAgICAgICAgICAgICAgICAgICAgb3JpZ19sb2NhdGlvbiwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgIHJldHVybiBzZWxmLl9nZXRfc3ZuX3VybF9yZXYobG9jYXRpb24pWzBdCgogICAgZGVmIF9nZXRfc3ZuX3VybF9yZXYoc2VsZiwgbG9jYXRpb24pOgogICAgICAgIGZyb20gcGlwLmV4Y2VwdGlvbnMgaW1wb3J0IEluc3RhbGxhdGlvbkVycm9yCgogICAgICAgIGVudHJpZXNfcGF0aCA9IG9zLnBhdGguam9pbihsb2NhdGlvbiwgc2VsZi5kaXJuYW1lLCAnZW50cmllcycpCiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZW50cmllc19wYXRoKToKICAgICAgICAgICAgd2l0aCBvcGVuKGVudHJpZXNfcGF0aCkgYXMgZjoKICAgICAgICAgICAgICAgIGRhdGEgPSBmLnJlYWQoKQogICAgICAgIGVsc2U6ICAjIHN1YnZlcnNpb24gPj0gMS43IGRvZXMgbm90IGhhdmUgdGhlICdlbnRyaWVzJyBmaWxlCiAgICAgICAgICAgIGRhdGEgPSAnJwoKICAgICAgICBpZiAoZGF0YS5zdGFydHN3aXRoKCc4Jykgb3IKICAgICAgICAgICAgICAgIGRhdGEuc3RhcnRzd2l0aCgnOScpIG9yCiAgICAgICAgICAgICAgICBkYXRhLnN0YXJ0c3dpdGgoJzEwJykpOgogICAgICAgICAgICBkYXRhID0gbGlzdChtYXAoc3RyLnNwbGl0bGluZXMsIGRhdGEuc3BsaXQoJ1xuXHgwY1xuJykpKQogICAgICAgICAgICBkZWwgZGF0YVswXVswXSAgIyBnZXQgcmlkIG9mIHRoZSAnOCcKICAgICAgICAgICAgdXJsID0gZGF0YVswXVszXQogICAgICAgICAgICByZXZzID0gW2ludChkWzldKSBmb3IgZCBpbiBkYXRhIGlmIGxlbihkKSA+IDkgYW5kIGRbOV1dICsgWzBdCiAgICAgICAgZWxpZiBkYXRhLnN0YXJ0c3dpdGgoJzw/eG1sJyk6CiAgICAgICAgICAgIG1hdGNoID0gX3N2bl94bWxfdXJsX3JlLnNlYXJjaChkYXRhKQogICAgICAgICAgICBpZiBub3QgbWF0Y2g6CiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdCYWRseSBmb3JtYXR0ZWQgZGF0YTogJXInICUgZGF0YSkKICAgICAgICAgICAgdXJsID0gbWF0Y2guZ3JvdXAoMSkgICAgIyBnZXQgcmVwb3NpdG9yeSBVUkwKICAgICAgICAgICAgcmV2cyA9IFtpbnQobS5ncm91cCgxKSkgZm9yIG0gaW4gX3N2bl9yZXZfcmUuZmluZGl0ZXIoZGF0YSldICsgWzBdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIyBzdWJ2ZXJzaW9uID49IDEuNwogICAgICAgICAgICAgICAgeG1sID0gc2VsZi5ydW5fY29tbWFuZCgKICAgICAgICAgICAgICAgICAgICBbJ2luZm8nLCAnLS14bWwnLCBsb2NhdGlvbl0sCiAgICAgICAgICAgICAgICAgICAgc2hvd19zdGRvdXQ9RmFsc2UsCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB1cmwgPSBfc3ZuX2luZm9feG1sX3VybF9yZS5zZWFyY2goeG1sKS5ncm91cCgxKQogICAgICAgICAgICAgICAgcmV2cyA9IFsKICAgICAgICAgICAgICAgICAgICBpbnQobS5ncm91cCgxKSkgZm9yIG0gaW4gX3N2bl9pbmZvX3htbF9yZXZfcmUuZmluZGl0ZXIoeG1sKQogICAgICAgICAgICAgICAgXQogICAgICAgICAgICBleGNlcHQgSW5zdGFsbGF0aW9uRXJyb3I6CiAgICAgICAgICAgICAgICB1cmwsIHJldnMgPSBOb25lLCBbXQoKICAgICAgICBpZiByZXZzOgogICAgICAgICAgICByZXYgPSBtYXgocmV2cykKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXYgPSAwCgogICAgICAgIHJldHVybiB1cmwsIHJldgoKICAgIGRlZiBnZXRfc3JjX3JlcXVpcmVtZW50KHNlbGYsIGRpc3QsIGxvY2F0aW9uKToKICAgICAgICByZXBvID0gc2VsZi5nZXRfdXJsKGxvY2F0aW9uKQogICAgICAgIGlmIHJlcG8gaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICAjIEZJWE1FOiB3aHkgbm90IHByb2plY3QgbmFtZT8KICAgICAgICBlZ2dfcHJvamVjdF9uYW1lID0gZGlzdC5lZ2dfbmFtZSgpLnNwbGl0KCctJywgMSlbMF0KICAgICAgICByZXYgPSBzZWxmLmdldF9yZXZpc2lvbihsb2NhdGlvbikKICAgICAgICByZXR1cm4gJ3N2bislc0AlcyNlZ2c9JXMnICUgKHJlcG8sIHJldiwgZWdnX3Byb2plY3RfbmFtZSkKCiAgICBkZWYgY2hlY2tfdmVyc2lvbihzZWxmLCBkZXN0LCByZXZfb3B0aW9ucyk6CiAgICAgICAgIiIiQWx3YXlzIGFzc3VtZSB0aGUgdmVyc2lvbnMgZG9uJ3QgbWF0Y2giIiIKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgcmVtb3ZlX2F1dGhfZnJvbV91cmwodXJsKToKICAgICAgICAjIFJldHVybiBhIGNvcHkgb2YgdXJsIHdpdGggJ3VzZXJuYW1lOnBhc3N3b3JkQCcgcmVtb3ZlZC4KICAgICAgICAjIHVzZXJuYW1lL3Bhc3MgcGFyYW1zIGFyZSBwYXNzZWQgdG8gc3VidmVyc2lvbiB0aHJvdWdoIGZsYWdzCiAgICAgICAgIyBhbmQgYXJlIG5vdCByZWNvZ25pemVkIGluIHRoZSB1cmwuCgogICAgICAgICMgcGFyc2VkIHVybAogICAgICAgIHB1cmwgPSB1cmxsaWJfcGFyc2UudXJsc3BsaXQodXJsKQogICAgICAgIHN0cmlwcGVkX25ldGxvYyA9IFwKICAgICAgICAgICAgcHVybC5uZXRsb2Muc3BsaXQoJ0AnKVstMV0KCiAgICAgICAgIyBzdHJpcHBlZCB1cmwKICAgICAgICB1cmxfcGllY2VzID0gKAogICAgICAgICAgICBwdXJsLnNjaGVtZSwgc3RyaXBwZWRfbmV0bG9jLCBwdXJsLnBhdGgsIHB1cmwucXVlcnksIHB1cmwuZnJhZ21lbnQKICAgICAgICApCiAgICAgICAgc3VybCA9IHVybGxpYl9wYXJzZS51cmx1bnNwbGl0KHVybF9waWVjZXMpCiAgICAgICAgcmV0dXJuIHN1cmwKCgpkZWYgZ2V0X3Jldl9vcHRpb25zKHVybCwgcmV2KToKICAgIGlmIHJldjoKICAgICAgICByZXZfb3B0aW9ucyA9IFsnLXInLCByZXZdCiAgICBlbHNlOgogICAgICAgIHJldl9vcHRpb25zID0gW10KCiAgICByID0gdXJsbGliX3BhcnNlLnVybHNwbGl0KHVybCkKICAgIGlmIGhhc2F0dHIociwgJ3VzZXJuYW1lJyk6CiAgICAgICAgIyA+PSBQeXRob24tMi41CiAgICAgICAgdXNlcm5hbWUsIHBhc3N3b3JkID0gci51c2VybmFtZSwgci5wYXNzd29yZAogICAgZWxzZToKICAgICAgICBuZXRsb2MgPSByWzFdCiAgICAgICAgaWYgJ0AnIGluIG5ldGxvYzoKICAgICAgICAgICAgYXV0aCA9IG5ldGxvYy5zcGxpdCgnQCcpWzBdCiAgICAgICAgICAgIGlmICc6JyBpbiBhdXRoOgogICAgICAgICAgICAgICAgdXNlcm5hbWUsIHBhc3N3b3JkID0gYXV0aC5zcGxpdCgnOicsIDEpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB1c2VybmFtZSwgcGFzc3dvcmQgPSBhdXRoLCBOb25lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdXNlcm5hbWUsIHBhc3N3b3JkID0gTm9uZSwgTm9uZQoKICAgIGlmIHVzZXJuYW1lOgogICAgICAgIHJldl9vcHRpb25zICs9IFsnLS11c2VybmFtZScsIHVzZXJuYW1lXQogICAgaWYgcGFzc3dvcmQ6CiAgICAgICAgcmV2X29wdGlvbnMgKz0gWyctLXBhc3N3b3JkJywgcGFzc3dvcmRdCiAgICByZXR1cm4gcmV2X29wdGlvbnMKCgp2Y3MucmVnaXN0ZXIoU3VidmVyc2lvbikKUEsDBBQAAAAAAAAAIQB9mSA7Cn0AAAp9AAAcAAAAcHlwaV9fcGlwXzlfMF8zL3BpcC93aGVlbC5weSIiIgpTdXBwb3J0IGZvciBpbnN0YWxsaW5nIGFuZCBidWlsZGluZyB0aGUgIndoZWVsIiBiaW5hcnkgcGFja2FnZSBmb3JtYXQuCiIiIgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAoKaW1wb3J0IGNvbXBpbGVhbGwKaW1wb3J0IGNzdgppbXBvcnQgZXJybm8KaW1wb3J0IGZ1bmN0b29scwppbXBvcnQgaGFzaGxpYgppbXBvcnQgbG9nZ2luZwppbXBvcnQgb3MKaW1wb3J0IG9zLnBhdGgKaW1wb3J0IHJlCmltcG9ydCBzaHV0aWwKaW1wb3J0IHN0YXQKaW1wb3J0IHN5cwppbXBvcnQgdGVtcGZpbGUKaW1wb3J0IHdhcm5pbmdzCgpmcm9tIGJhc2U2NCBpbXBvcnQgdXJsc2FmZV9iNjRlbmNvZGUKZnJvbSBlbWFpbC5wYXJzZXIgaW1wb3J0IFBhcnNlcgoKZnJvbSBwaXAuX3ZlbmRvci5zaXggaW1wb3J0IFN0cmluZ0lPCgppbXBvcnQgcGlwCmZyb20gcGlwLmNvbXBhdCBpbXBvcnQgZXhwYW5kdXNlcgpmcm9tIHBpcC5kb3dubG9hZCBpbXBvcnQgcGF0aF90b191cmwsIHVucGFja191cmwKZnJvbSBwaXAuZXhjZXB0aW9ucyBpbXBvcnQgKAogICAgSW5zdGFsbGF0aW9uRXJyb3IsIEludmFsaWRXaGVlbEZpbGVuYW1lLCBVbnN1cHBvcnRlZFdoZWVsKQpmcm9tIHBpcC5sb2NhdGlvbnMgaW1wb3J0IGRpc3R1dGlsc19zY2hlbWUsIFBJUF9ERUxFVEVfTUFSS0VSX0ZJTEVOQU1FCmZyb20gcGlwIGltcG9ydCBwZXA0MjV0YWdzCmZyb20gcGlwLnV0aWxzIGltcG9ydCAoCiAgICBjYWxsX3N1YnByb2Nlc3MsIGVuc3VyZV9kaXIsIGNhcHR1cmVkX3N0ZG91dCwgcm10cmVlLCByZWFkX2NodW5rcywKKQpmcm9tIHBpcC51dGlscy51aSBpbXBvcnQgb3Blbl9zcGlubmVyCmZyb20gcGlwLnV0aWxzLmxvZ2dpbmcgaW1wb3J0IGluZGVudF9sb2cKZnJvbSBwaXAudXRpbHMuc2V0dXB0b29sc19idWlsZCBpbXBvcnQgU0VUVVBUT09MU19TSElNCmZyb20gcGlwLl92ZW5kb3IuZGlzdGxpYi5zY3JpcHRzIGltcG9ydCBTY3JpcHRNYWtlcgpmcm9tIHBpcC5fdmVuZG9yIGltcG9ydCBwa2dfcmVzb3VyY2VzCmZyb20gcGlwLl92ZW5kb3IucGFja2FnaW5nLnV0aWxzIGltcG9ydCBjYW5vbmljYWxpemVfbmFtZQpmcm9tIHBpcC5fdmVuZG9yLnNpeC5tb3ZlcyBpbXBvcnQgY29uZmlncGFyc2VyCgoKd2hlZWxfZXh0ID0gJy53aGwnCgpWRVJTSU9OX0NPTVBBVElCTEUgPSAoMSwgMCkKCgpsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgpjbGFzcyBXaGVlbENhY2hlKG9iamVjdCk6CiAgICAiIiJBIGNhY2hlIG9mIHdoZWVscyBmb3IgZnV0dXJlIGluc3RhbGxzLiIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjYWNoZV9kaXIsIGZvcm1hdF9jb250cm9sKToKICAgICAgICAiIiJDcmVhdGUgYSB3aGVlbCBjYWNoZS4KCiAgICAgICAgOnBhcmFtIGNhY2hlX2RpcjogVGhlIHJvb3Qgb2YgdGhlIGNhY2hlLgogICAgICAgIDpwYXJhbSBmb3JtYXRfY29udHJvbDogQSBwaXAuaW5kZXguRm9ybWF0Q29udHJvbCBvYmplY3QgdG8gbGltaXQKICAgICAgICAgICAgYmluYXJpZXMgYmVpbmcgcmVhZCBmcm9tIHRoZSBjYWNoZS4KICAgICAgICAiIiIKICAgICAgICBzZWxmLl9jYWNoZV9kaXIgPSBleHBhbmR1c2VyKGNhY2hlX2RpcikgaWYgY2FjaGVfZGlyIGVsc2UgTm9uZQogICAgICAgIHNlbGYuX2Zvcm1hdF9jb250cm9sID0gZm9ybWF0X2NvbnRyb2wKCiAgICBkZWYgY2FjaGVkX3doZWVsKHNlbGYsIGxpbmssIHBhY2thZ2VfbmFtZSk6CiAgICAgICAgcmV0dXJuIGNhY2hlZF93aGVlbCgKICAgICAgICAgICAgc2VsZi5fY2FjaGVfZGlyLCBsaW5rLCBzZWxmLl9mb3JtYXRfY29udHJvbCwgcGFja2FnZV9uYW1lKQoKCmRlZiBfY2FjaGVfZm9yX2xpbmsoY2FjaGVfZGlyLCBsaW5rKToKICAgICIiIgogICAgUmV0dXJuIGEgZGlyZWN0b3J5IHRvIHN0b3JlIGNhY2hlZCB3aGVlbHMgaW4gZm9yIGxpbmsuCgogICAgQmVjYXVzZSB0aGVyZSBhcmUgTSB3aGVlbHMgZm9yIGFueSBvbmUgc2Rpc3QsIHdlIHByb3ZpZGUgYSBkaXJlY3RvcnkKICAgIHRvIGNhY2hlIHRoZW0gaW4sIGFuZCB0aGVuIGNvbnN1bHQgdGhhdCBkaXJlY3Rvcnkgd2hlbiBsb29raW5nIHVwCiAgICBjYWNoZSBoaXRzLgoKICAgIFdlIG9ubHkgaW5zZXJ0IHRoaW5ncyBpbnRvIHRoZSBjYWNoZSBpZiB0aGV5IGhhdmUgcGxhdXNpYmxlIHZlcnNpb24KICAgIG51bWJlcnMsIHNvIHRoYXQgd2UgZG9uJ3QgY29udGFtaW5hdGUgdGhlIGNhY2hlIHdpdGggdGhpbmdzIHRoYXQgd2VyZSBub3QKICAgIHVuaXF1ZS4gRS5nLiAuL3BhY2thZ2UgbWlnaHQgaGF2ZSBkb3plbnMgb2YgaW5zdGFsbHMgZG9uZSBmb3IgaXQgYW5kIGJ1aWxkCiAgICBhIHZlcnNpb24gb2YgMC4wLi4uYW5kIGlmIHdlIGJ1aWx0IGFuZCBjYWNoZWQgYSB3aGVlbCwgd2UnZCBlbmQgdXAgdXNpbmcKICAgIHRoZSBzYW1lIHdoZWVsIGV2ZW4gaWYgdGhlIHNvdXJjZSBoYXMgYmVlbiBlZGl0ZWQuCgogICAgOnBhcmFtIGNhY2hlX2RpcjogVGhlIGNhY2hlX2RpciBiZWluZyB1c2VkIGJ5IHBpcC4KICAgIDpwYXJhbSBsaW5rOiBUaGUgbGluayBvZiB0aGUgc2Rpc3QgZm9yIHdoaWNoIHRoaXMgd2lsbCBjYWNoZSB3aGVlbHMuCiAgICAiIiIKCiAgICAjIFdlIHdhbnQgdG8gZ2VuZXJhdGUgYW4gdXJsIHRvIHVzZSBhcyBvdXIgY2FjaGUga2V5LCB3ZSBkb24ndCB3YW50IHRvIGp1c3QKICAgICMgcmUtdXNlIHRoZSBVUkwgYmVjYXVzZSBpdCBtaWdodCBoYXZlIG90aGVyIGl0ZW1zIGluIHRoZSBmcmFnbWVudCBhbmQgd2UKICAgICMgZG9uJ3QgY2FyZSBhYm91dCB0aG9zZS4KICAgIGtleV9wYXJ0cyA9IFtsaW5rLnVybF93aXRob3V0X2ZyYWdtZW50XQogICAgaWYgbGluay5oYXNoX25hbWUgaXMgbm90IE5vbmUgYW5kIGxpbmsuaGFzaCBpcyBub3QgTm9uZToKICAgICAgICBrZXlfcGFydHMuYXBwZW5kKCI9Ii5qb2luKFtsaW5rLmhhc2hfbmFtZSwgbGluay5oYXNoXSkpCiAgICBrZXlfdXJsID0gIiMiLmpvaW4oa2V5X3BhcnRzKQoKICAgICMgRW5jb2RlIG91ciBrZXkgdXJsIHdpdGggc2hhMjI0LCB3ZSdsbCB1c2UgdGhpcyBiZWNhdXNlIGl0IGhhcyBzaW1pbGFyCiAgICAjIHNlY3VyaXR5IHByb3BlcnRpZXMgdG8gc2hhMjU2LCBidXQgd2l0aCBhIHNob3J0ZXIgdG90YWwgb3V0cHV0IChhbmQgdGh1cwogICAgIyBsZXNzIHNlY3VyZSkuIEhvd2V2ZXIgdGhlIGRpZmZlcmVuY2VzIGRvbid0IG1ha2UgYSBsb3Qgb2YgZGlmZmVyZW5jZSBmb3IKICAgICMgb3VyIHVzZSBjYXNlIGhlcmUuCiAgICBoYXNoZWQgPSBoYXNobGliLnNoYTIyNChrZXlfdXJsLmVuY29kZSgpKS5oZXhkaWdlc3QoKQoKICAgICMgV2Ugd2FudCB0byBuZXN0IHRoZSBkaXJlY3RvcmllcyBzb21lIHRvIHByZXZlbnQgaGF2aW5nIGEgdG9uIG9mIHRvcCBsZXZlbAogICAgIyBkaXJlY3RvcmllcyB3aGVyZSB3ZSBtaWdodCBydW4gb3V0IG9mIHN1YiBkaXJlY3RvcmllcyBvbiBzb21lIEZTLgogICAgcGFydHMgPSBbaGFzaGVkWzoyXSwgaGFzaGVkWzI6NF0sIGhhc2hlZFs0OjZdLCBoYXNoZWRbNjpdXQoKICAgICMgSW5zaWRlIG9mIHRoZSBiYXNlIGxvY2F0aW9uIGZvciBjYWNoZWQgd2hlZWxzLCBleHBhbmQgb3VyIHBhcnRzIGFuZCBqb2luCiAgICAjIHRoZW0gYWxsIHRvZ2V0aGVyLgogICAgcmV0dXJuIG9zLnBhdGguam9pbihjYWNoZV9kaXIsICJ3aGVlbHMiLCAqcGFydHMpCgoKZGVmIGNhY2hlZF93aGVlbChjYWNoZV9kaXIsIGxpbmssIGZvcm1hdF9jb250cm9sLCBwYWNrYWdlX25hbWUpOgogICAgaWYgbm90IGNhY2hlX2RpcjoKICAgICAgICByZXR1cm4gbGluawogICAgaWYgbm90IGxpbms6CiAgICAgICAgcmV0dXJuIGxpbmsKICAgIGlmIGxpbmsuaXNfd2hlZWw6CiAgICAgICAgcmV0dXJuIGxpbmsKICAgIGlmIG5vdCBsaW5rLmlzX2FydGlmYWN0OgogICAgICAgIHJldHVybiBsaW5rCiAgICBpZiBub3QgcGFja2FnZV9uYW1lOgogICAgICAgIHJldHVybiBsaW5rCiAgICBjYW5vbmljYWxfbmFtZSA9IGNhbm9uaWNhbGl6ZV9uYW1lKHBhY2thZ2VfbmFtZSkKICAgIGZvcm1hdHMgPSBwaXAuaW5kZXguZm10X2N0bF9mb3JtYXRzKGZvcm1hdF9jb250cm9sLCBjYW5vbmljYWxfbmFtZSkKICAgIGlmICJiaW5hcnkiIG5vdCBpbiBmb3JtYXRzOgogICAgICAgIHJldHVybiBsaW5rCiAgICByb290ID0gX2NhY2hlX2Zvcl9saW5rKGNhY2hlX2RpciwgbGluaykKICAgIHRyeToKICAgICAgICB3aGVlbF9uYW1lcyA9IG9zLmxpc3RkaXIocm9vdCkKICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6CiAgICAgICAgaWYgZS5lcnJubyBpbiAoZXJybm8uRU5PRU5ULCBlcnJuby5FTk9URElSKToKICAgICAgICAgICAgcmV0dXJuIGxpbmsKICAgICAgICByYWlzZQogICAgY2FuZGlkYXRlcyA9IFtdCiAgICBmb3Igd2hlZWxfbmFtZSBpbiB3aGVlbF9uYW1lczoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHdoZWVsID0gV2hlZWwod2hlZWxfbmFtZSkKICAgICAgICBleGNlcHQgSW52YWxpZFdoZWVsRmlsZW5hbWU6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgaWYgbm90IHdoZWVsLnN1cHBvcnRlZCgpOgogICAgICAgICAgICAjIEJ1aWx0IGZvciBhIGRpZmZlcmVudCBweXRob24vYXJjaC9ldGMKICAgICAgICAgICAgY29udGludWUKICAgICAgICBjYW5kaWRhdGVzLmFwcGVuZCgod2hlZWwuc3VwcG9ydF9pbmRleF9taW4oKSwgd2hlZWxfbmFtZSkpCiAgICBpZiBub3QgY2FuZGlkYXRlczoKICAgICAgICByZXR1cm4gbGluawogICAgY2FuZGlkYXRlcy5zb3J0KCkKICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocm9vdCwgY2FuZGlkYXRlc1swXVsxXSkKICAgIHJldHVybiBwaXAuaW5kZXguTGluayhwYXRoX3RvX3VybChwYXRoKSkKCgpkZWYgcmVoYXNoKHBhdGgsIGFsZ289J3NoYTI1NicsIGJsb2Nrc2l6ZT0xIDw8IDIwKToKICAgICIiIlJldHVybiAoaGFzaCwgbGVuZ3RoKSBmb3IgcGF0aCB1c2luZyBoYXNobGliLm5ldyhhbGdvKSIiIgogICAgaCA9IGhhc2hsaWIubmV3KGFsZ28pCiAgICBsZW5ndGggPSAwCiAgICB3aXRoIG9wZW4ocGF0aCwgJ3JiJykgYXMgZjoKICAgICAgICBmb3IgYmxvY2sgaW4gcmVhZF9jaHVua3MoZiwgc2l6ZT1ibG9ja3NpemUpOgogICAgICAgICAgICBsZW5ndGggKz0gbGVuKGJsb2NrKQogICAgICAgICAgICBoLnVwZGF0ZShibG9jaykKICAgIGRpZ2VzdCA9ICdzaGEyNTY9JyArIHVybHNhZmVfYjY0ZW5jb2RlKAogICAgICAgIGguZGlnZXN0KCkKICAgICkuZGVjb2RlKCdsYXRpbjEnKS5yc3RyaXAoJz0nKQogICAgcmV0dXJuIChkaWdlc3QsIGxlbmd0aCkKCgpkZWYgb3Blbl9mb3JfY3N2KG5hbWUsIG1vZGUpOgogICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA8IDM6CiAgICAgICAgbmwgPSB7fQogICAgICAgIGJpbiA9ICdiJwogICAgZWxzZToKICAgICAgICBubCA9IHsnbmV3bGluZSc6ICcnfQogICAgICAgIGJpbiA9ICcnCiAgICByZXR1cm4gb3BlbihuYW1lLCBtb2RlICsgYmluLCAqKm5sKQoKCmRlZiBmaXhfc2NyaXB0KHBhdGgpOgogICAgIiIiUmVwbGFjZSAjIXB5dGhvbiB3aXRoICMhL3BhdGgvdG8vcHl0aG9uCiAgICBSZXR1cm4gVHJ1ZSBpZiBmaWxlIHdhcyBjaGFuZ2VkLiIiIgogICAgIyBYWFggUkVDT1JEIGhhc2hlcyB3aWxsIG5lZWQgdG8gYmUgdXBkYXRlZAogICAgaWYgb3MucGF0aC5pc2ZpbGUocGF0aCk6CiAgICAgICAgd2l0aCBvcGVuKHBhdGgsICdyYicpIGFzIHNjcmlwdDoKICAgICAgICAgICAgZmlyc3RsaW5lID0gc2NyaXB0LnJlYWRsaW5lKCkKICAgICAgICAgICAgaWYgbm90IGZpcnN0bGluZS5zdGFydHN3aXRoKGInIyFweXRob24nKToKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgICAgICBleGVuYW1lID0gc3lzLmV4ZWN1dGFibGUuZW5jb2RlKHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKSkKICAgICAgICAgICAgZmlyc3RsaW5lID0gYicjIScgKyBleGVuYW1lICsgb3MubGluZXNlcC5lbmNvZGUoImFzY2lpIikKICAgICAgICAgICAgcmVzdCA9IHNjcmlwdC5yZWFkKCkKICAgICAgICB3aXRoIG9wZW4ocGF0aCwgJ3diJykgYXMgc2NyaXB0OgogICAgICAgICAgICBzY3JpcHQud3JpdGUoZmlyc3RsaW5lKQogICAgICAgICAgICBzY3JpcHQud3JpdGUocmVzdCkKICAgICAgICByZXR1cm4gVHJ1ZQoKZGlzdF9pbmZvX3JlID0gcmUuY29tcGlsZShyIiIiXig/UDxuYW1ldmVyPig/UDxuYW1lPi4rPykoLSg/UDx2ZXI+XGQuKz8pKT8pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXC5kaXN0LWluZm8kIiIiLCByZS5WRVJCT1NFKQoKCmRlZiByb290X2lzX3B1cmVsaWIobmFtZSwgd2hlZWxkaXIpOgogICAgIiIiCiAgICBSZXR1cm4gVHJ1ZSBpZiB0aGUgZXh0cmFjdGVkIHdoZWVsIGluIHdoZWVsZGlyIHNob3VsZCBnbyBpbnRvIHB1cmVsaWIuCiAgICAiIiIKICAgIG5hbWVfZm9sZGVkID0gbmFtZS5yZXBsYWNlKCItIiwgIl8iKQogICAgZm9yIGl0ZW0gaW4gb3MubGlzdGRpcih3aGVlbGRpcik6CiAgICAgICAgbWF0Y2ggPSBkaXN0X2luZm9fcmUubWF0Y2goaXRlbSkKICAgICAgICBpZiBtYXRjaCBhbmQgbWF0Y2guZ3JvdXAoJ25hbWUnKSA9PSBuYW1lX2ZvbGRlZDoKICAgICAgICAgICAgd2l0aCBvcGVuKG9zLnBhdGguam9pbih3aGVlbGRpciwgaXRlbSwgJ1dIRUVMJykpIGFzIHdoZWVsOgogICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gd2hlZWw6CiAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUubG93ZXIoKS5yc3RyaXAoKQogICAgICAgICAgICAgICAgICAgIGlmIGxpbmUgPT0gInJvb3QtaXMtcHVyZWxpYjogdHJ1ZSI6CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICByZXR1cm4gRmFsc2UKCgpkZWYgZ2V0X2VudHJ5cG9pbnRzKGZpbGVuYW1lKToKICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhmaWxlbmFtZSk6CiAgICAgICAgcmV0dXJuIHt9LCB7fQoKICAgICMgVGhpcyBpcyBkb25lIGJlY2F1c2UgeW91IGNhbiBwYXNzIGEgc3RyaW5nIHRvIGVudHJ5X3BvaW50cyB3cmFwcGVycyB3aGljaAogICAgIyBtZWFucyB0aGF0IHRoZXkgbWF5IG9yIG1heSBub3QgYmUgdmFsaWQgSU5JIGZpbGVzLiBUaGUgYXR0ZW1wdCBoZXJlIGlzIHRvCiAgICAjIHN0cmlwIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgaW4gb3JkZXIgdG8gbWFrZSB0aGVtIHZhbGlkIElOSQogICAgIyBmaWxlcy4KICAgIHdpdGggb3BlbihmaWxlbmFtZSkgYXMgZnA6CiAgICAgICAgZGF0YSA9IFN0cmluZ0lPKCkKICAgICAgICBmb3IgbGluZSBpbiBmcDoKICAgICAgICAgICAgZGF0YS53cml0ZShsaW5lLnN0cmlwKCkpCiAgICAgICAgICAgIGRhdGEud3JpdGUoIlxuIikKICAgICAgICBkYXRhLnNlZWsoMCkKCiAgICBjcCA9IGNvbmZpZ3BhcnNlci5SYXdDb25maWdQYXJzZXIoKQogICAgY3Aub3B0aW9ueGZvcm0gPSBsYW1iZGEgb3B0aW9uOiBvcHRpb24KICAgIGNwLnJlYWRmcChkYXRhKQoKICAgIGNvbnNvbGUgPSB7fQogICAgZ3VpID0ge30KICAgIGlmIGNwLmhhc19zZWN0aW9uKCdjb25zb2xlX3NjcmlwdHMnKToKICAgICAgICBjb25zb2xlID0gZGljdChjcC5pdGVtcygnY29uc29sZV9zY3JpcHRzJykpCiAgICBpZiBjcC5oYXNfc2VjdGlvbignZ3VpX3NjcmlwdHMnKToKICAgICAgICBndWkgPSBkaWN0KGNwLml0ZW1zKCdndWlfc2NyaXB0cycpKQogICAgcmV0dXJuIGNvbnNvbGUsIGd1aQoKCmRlZiBtb3ZlX3doZWVsX2ZpbGVzKG5hbWUsIHJlcSwgd2hlZWxkaXIsIHVzZXI9RmFsc2UsIGhvbWU9Tm9uZSwgcm9vdD1Ob25lLAogICAgICAgICAgICAgICAgICAgICBweWNvbXBpbGU9VHJ1ZSwgc2NoZW1lPU5vbmUsIGlzb2xhdGVkPUZhbHNlLCBwcmVmaXg9Tm9uZSk6CiAgICAiIiJJbnN0YWxsIGEgd2hlZWwiIiIKCiAgICBpZiBub3Qgc2NoZW1lOgogICAgICAgIHNjaGVtZSA9IGRpc3R1dGlsc19zY2hlbWUoCiAgICAgICAgICAgIG5hbWUsIHVzZXI9dXNlciwgaG9tZT1ob21lLCByb290PXJvb3QsIGlzb2xhdGVkPWlzb2xhdGVkLAogICAgICAgICAgICBwcmVmaXg9cHJlZml4LAogICAgICAgICkKCiAgICBpZiByb290X2lzX3B1cmVsaWIobmFtZSwgd2hlZWxkaXIpOgogICAgICAgIGxpYl9kaXIgPSBzY2hlbWVbJ3B1cmVsaWInXQogICAgZWxzZToKICAgICAgICBsaWJfZGlyID0gc2NoZW1lWydwbGF0bGliJ10KCiAgICBpbmZvX2RpciA9IFtdCiAgICBkYXRhX2RpcnMgPSBbXQogICAgc291cmNlID0gd2hlZWxkaXIucnN0cmlwKG9zLnBhdGguc2VwKSArIG9zLnBhdGguc2VwCgogICAgIyBSZWNvcmQgZGV0YWlscyBvZiB0aGUgZmlsZXMgbW92ZWQKICAgICMgICBpbnN0YWxsZWQgPSBmaWxlcyBjb3BpZWQgZnJvbSB0aGUgd2hlZWwgdG8gdGhlIGRlc3RpbmF0aW9uCiAgICAjICAgY2hhbmdlZCA9IGZpbGVzIGNoYW5nZWQgd2hpbGUgaW5zdGFsbGluZyAoc2NyaXB0cyAjISBsaW5lIHR5cGljYWxseSkKICAgICMgICBnZW5lcmF0ZWQgPSBmaWxlcyBuZXdseSBnZW5lcmF0ZWQgZHVyaW5nIHRoZSBpbnN0YWxsIChzY3JpcHQgd3JhcHBlcnMpCiAgICBpbnN0YWxsZWQgPSB7fQogICAgY2hhbmdlZCA9IHNldCgpCiAgICBnZW5lcmF0ZWQgPSBbXQoKICAgICMgQ29tcGlsZSBhbGwgb2YgdGhlIHB5YyBmaWxlcyB0aGF0IHdlJ3JlIGdvaW5nIHRvIGJlIGluc3RhbGxpbmcKICAgIGlmIHB5Y29tcGlsZToKICAgICAgICB3aXRoIGNhcHR1cmVkX3N0ZG91dCgpIGFzIHN0ZG91dDoKICAgICAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgogICAgICAgICAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoJ2lnbm9yZScpCiAgICAgICAgICAgICAgICBjb21waWxlYWxsLmNvbXBpbGVfZGlyKHNvdXJjZSwgZm9yY2U9VHJ1ZSwgcXVpZXQ9VHJ1ZSkKICAgICAgICBsb2dnZXIuZGVidWcoc3Rkb3V0LmdldHZhbHVlKCkpCgogICAgZGVmIG5vcm1wYXRoKHNyYywgcCk6CiAgICAgICAgcmV0dXJuIG9zLnBhdGgucmVscGF0aChzcmMsIHApLnJlcGxhY2Uob3MucGF0aC5zZXAsICcvJykKCiAgICBkZWYgcmVjb3JkX2luc3RhbGxlZChzcmNmaWxlLCBkZXN0ZmlsZSwgbW9kaWZpZWQ9RmFsc2UpOgogICAgICAgICIiIk1hcCBhcmNoaXZlIFJFQ09SRCBwYXRocyB0byBpbnN0YWxsYXRpb24gUkVDT1JEIHBhdGhzLiIiIgogICAgICAgIG9sZHBhdGggPSBub3JtcGF0aChzcmNmaWxlLCB3aGVlbGRpcikKICAgICAgICBuZXdwYXRoID0gbm9ybXBhdGgoZGVzdGZpbGUsIGxpYl9kaXIpCiAgICAgICAgaW5zdGFsbGVkW29sZHBhdGhdID0gbmV3cGF0aAogICAgICAgIGlmIG1vZGlmaWVkOgogICAgICAgICAgICBjaGFuZ2VkLmFkZChkZXN0ZmlsZSkKCiAgICBkZWYgY2xvYmJlcihzb3VyY2UsIGRlc3QsIGlzX2Jhc2UsIGZpeGVyPU5vbmUsIGZpbHRlcj1Ob25lKToKICAgICAgICBlbnN1cmVfZGlyKGRlc3QpICAjIGNvbW1vbiBmb3IgdGhlICdpbmNsdWRlJyBwYXRoCgogICAgICAgIGZvciBkaXIsIHN1YmRpcnMsIGZpbGVzIGluIG9zLndhbGsoc291cmNlKToKICAgICAgICAgICAgYmFzZWRpciA9IGRpcltsZW4oc291cmNlKTpdLmxzdHJpcChvcy5wYXRoLnNlcCkKICAgICAgICAgICAgZGVzdGRpciA9IG9zLnBhdGguam9pbihkZXN0LCBiYXNlZGlyKQogICAgICAgICAgICBpZiBpc19iYXNlIGFuZCBiYXNlZGlyLnNwbGl0KG9zLnBhdGguc2VwLCAxKVswXS5lbmRzd2l0aCgnLmRhdGEnKToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGZvciBzIGluIHN1YmRpcnM6CiAgICAgICAgICAgICAgICBkZXN0c3ViZGlyID0gb3MucGF0aC5qb2luKGRlc3QsIGJhc2VkaXIsIHMpCiAgICAgICAgICAgICAgICBpZiBpc19iYXNlIGFuZCBiYXNlZGlyID09ICcnIGFuZCBkZXN0c3ViZGlyLmVuZHN3aXRoKCcuZGF0YScpOgogICAgICAgICAgICAgICAgICAgIGRhdGFfZGlycy5hcHBlbmQocykKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgZWxpZiAoaXNfYmFzZSBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgcy5lbmRzd2l0aCgnLmRpc3QtaW5mbycpIGFuZAogICAgICAgICAgICAgICAgICAgICAgICBjYW5vbmljYWxpemVfbmFtZShzKS5zdGFydHN3aXRoKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Fub25pY2FsaXplX25hbWUocmVxLm5hbWUpKSk6CiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IG5vdCBpbmZvX2RpciwgKCdNdWx0aXBsZSAuZGlzdC1pbmZvIGRpcmVjdG9yaWVzOiAnICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdHN1YmRpciArICcsICcgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLCAnLmpvaW4oaW5mb19kaXIpKQogICAgICAgICAgICAgICAgICAgIGluZm9fZGlyLmFwcGVuZChkZXN0c3ViZGlyKQogICAgICAgICAgICBmb3IgZiBpbiBmaWxlczoKICAgICAgICAgICAgICAgICMgU2tpcCB1bndhbnRlZCBmaWxlcwogICAgICAgICAgICAgICAgaWYgZmlsdGVyIGFuZCBmaWx0ZXIoZik6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIHNyY2ZpbGUgPSBvcy5wYXRoLmpvaW4oZGlyLCBmKQogICAgICAgICAgICAgICAgZGVzdGZpbGUgPSBvcy5wYXRoLmpvaW4oZGVzdCwgYmFzZWRpciwgZikKICAgICAgICAgICAgICAgICMgZGlyZWN0b3J5IGNyZWF0aW9uIGlzIGxhenkgYW5kIGFmdGVyIHRoZSBmaWxlIGZpbHRlcmluZyBhYm92ZQogICAgICAgICAgICAgICAgIyB0byBlbnN1cmUgd2UgZG9uJ3QgaW5zdGFsbCBlbXB0eSBkaXJzOyBlbXB0eSBkaXJzIGNhbid0IGJlCiAgICAgICAgICAgICAgICAjIHVuaW5zdGFsbGVkLgogICAgICAgICAgICAgICAgZW5zdXJlX2RpcihkZXN0ZGlyKQoKICAgICAgICAgICAgICAgICMgV2UgdXNlIGNvcHlmaWxlIChub3QgbW92ZSwgY29weSwgb3IgY29weTIpIHRvIGJlIGV4dHJhIHN1cmUKICAgICAgICAgICAgICAgICMgdGhhdCB3ZSBhcmUgbm90IG1vdmluZyBkaXJlY3RvcmllcyBvdmVyIChjb3B5ZmlsZSBmYWlscyBmb3IKICAgICAgICAgICAgICAgICMgZGlyZWN0b3JpZXMpIGFzIHdlbGwgYXMgdG8gZW5zdXJlIHRoYXQgd2UgYXJlIG5vdCBjb3B5aW5nCiAgICAgICAgICAgICAgICAjIG92ZXIgYW55IG1ldGFkYXRhIGJlY2F1c2Ugd2Ugd2FudCBtb3JlIGNvbnRyb2wgb3ZlciB3aGF0CiAgICAgICAgICAgICAgICAjIG1ldGFkYXRhIHdlIGFjdHVhbGx5IGNvcHkgb3Zlci4KICAgICAgICAgICAgICAgIHNodXRpbC5jb3B5ZmlsZShzcmNmaWxlLCBkZXN0ZmlsZSkKCiAgICAgICAgICAgICAgICAjIENvcHkgb3ZlciB0aGUgbWV0YWRhdGEgZm9yIHRoZSBmaWxlLCBjdXJyZW50bHkgdGhpcyBvbmx5CiAgICAgICAgICAgICAgICAjIGluY2x1ZGVzIHRoZSBhdGltZSBhbmQgbXRpbWUuCiAgICAgICAgICAgICAgICBzdCA9IG9zLnN0YXQoc3JjZmlsZSkKICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIob3MsICJ1dGltZSIpOgogICAgICAgICAgICAgICAgICAgIG9zLnV0aW1lKGRlc3RmaWxlLCAoc3Quc3RfYXRpbWUsIHN0LnN0X210aW1lKSkKCiAgICAgICAgICAgICAgICAjIElmIG91ciBmaWxlIGlzIGV4ZWN1dGFibGUsIHRoZW4gbWFrZSBvdXIgZGVzdGluYXRpb24gZmlsZQogICAgICAgICAgICAgICAgIyBleGVjdXRhYmxlLgogICAgICAgICAgICAgICAgaWYgb3MuYWNjZXNzKHNyY2ZpbGUsIG9zLlhfT0spOgogICAgICAgICAgICAgICAgICAgIHN0ID0gb3Muc3RhdChzcmNmaWxlKQogICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zID0gKAogICAgICAgICAgICAgICAgICAgICAgICBzdC5zdF9tb2RlIHwgc3RhdC5TX0lYVVNSIHwgc3RhdC5TX0lYR1JQIHwgc3RhdC5TX0lYT1RICiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIG9zLmNobW9kKGRlc3RmaWxlLCBwZXJtaXNzaW9ucykKCiAgICAgICAgICAgICAgICBjaGFuZ2VkID0gRmFsc2UKICAgICAgICAgICAgICAgIGlmIGZpeGVyOgogICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSBmaXhlcihkZXN0ZmlsZSkKICAgICAgICAgICAgICAgIHJlY29yZF9pbnN0YWxsZWQoc3JjZmlsZSwgZGVzdGZpbGUsIGNoYW5nZWQpCgogICAgY2xvYmJlcihzb3VyY2UsIGxpYl9kaXIsIFRydWUpCgogICAgYXNzZXJ0IGluZm9fZGlyLCAiJXMgLmRpc3QtaW5mbyBkaXJlY3Rvcnkgbm90IGZvdW5kIiAlIHJlcQoKICAgICMgR2V0IHRoZSBkZWZpbmVkIGVudHJ5IHBvaW50cwogICAgZXBfZmlsZSA9IG9zLnBhdGguam9pbihpbmZvX2RpclswXSwgJ2VudHJ5X3BvaW50cy50eHQnKQogICAgY29uc29sZSwgZ3VpID0gZ2V0X2VudHJ5cG9pbnRzKGVwX2ZpbGUpCgogICAgZGVmIGlzX2VudHJ5cG9pbnRfd3JhcHBlcihuYW1lKToKICAgICAgICAjIEVQLCBFUC5leGUgYW5kIEVQLXNjcmlwdC5weSBhcmUgc2NyaXB0cyBnZW5lcmF0ZWQgZm9yCiAgICAgICAgIyBlbnRyeSBwb2ludCBFUCBieSBzZXR1cHRvb2xzCiAgICAgICAgaWYgbmFtZS5sb3dlcigpLmVuZHN3aXRoKCcuZXhlJyk6CiAgICAgICAgICAgIG1hdGNobmFtZSA9IG5hbWVbOi00XQogICAgICAgIGVsaWYgbmFtZS5sb3dlcigpLmVuZHN3aXRoKCctc2NyaXB0LnB5Jyk6CiAgICAgICAgICAgIG1hdGNobmFtZSA9IG5hbWVbOi0xMF0KICAgICAgICBlbGlmIG5hbWUubG93ZXIoKS5lbmRzd2l0aCgiLnB5YSIpOgogICAgICAgICAgICBtYXRjaG5hbWUgPSBuYW1lWzotNF0KICAgICAgICBlbHNlOgogICAgICAgICAgICBtYXRjaG5hbWUgPSBuYW1lCiAgICAgICAgIyBJZ25vcmUgc2V0dXB0b29scy1nZW5lcmF0ZWQgc2NyaXB0cwogICAgICAgIHJldHVybiAobWF0Y2huYW1lIGluIGNvbnNvbGUgb3IgbWF0Y2huYW1lIGluIGd1aSkKCiAgICBmb3IgZGF0YWRpciBpbiBkYXRhX2RpcnM6CiAgICAgICAgZml4ZXIgPSBOb25lCiAgICAgICAgZmlsdGVyID0gTm9uZQogICAgICAgIGZvciBzdWJkaXIgaW4gb3MubGlzdGRpcihvcy5wYXRoLmpvaW4od2hlZWxkaXIsIGRhdGFkaXIpKToKICAgICAgICAgICAgZml4ZXIgPSBOb25lCiAgICAgICAgICAgIGlmIHN1YmRpciA9PSAnc2NyaXB0cyc6CiAgICAgICAgICAgICAgICBmaXhlciA9IGZpeF9zY3JpcHQKICAgICAgICAgICAgICAgIGZpbHRlciA9IGlzX2VudHJ5cG9pbnRfd3JhcHBlcgogICAgICAgICAgICBzb3VyY2UgPSBvcy5wYXRoLmpvaW4od2hlZWxkaXIsIGRhdGFkaXIsIHN1YmRpcikKICAgICAgICAgICAgZGVzdCA9IHNjaGVtZVtzdWJkaXJdCiAgICAgICAgICAgIGNsb2JiZXIoc291cmNlLCBkZXN0LCBGYWxzZSwgZml4ZXI9Zml4ZXIsIGZpbHRlcj1maWx0ZXIpCgogICAgbWFrZXIgPSBTY3JpcHRNYWtlcihOb25lLCBzY2hlbWVbJ3NjcmlwdHMnXSkKCiAgICAjIEVuc3VyZSBvbGQgc2NyaXB0cyBhcmUgb3ZlcndyaXR0ZW4uCiAgICAjIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcHlwYS9waXAvaXNzdWVzLzE4MDAKICAgIG1ha2VyLmNsb2JiZXIgPSBUcnVlCgogICAgIyBFbnN1cmUgd2UgZG9uJ3QgZ2VuZXJhdGUgYW55IHZhcmlhbnRzIGZvciBzY3JpcHRzIGJlY2F1c2UgdGhpcyBpcyBhbG1vc3QKICAgICMgbmV2ZXIgd2hhdCBzb21lYm9keSB3YW50cy4KICAgICMgU2VlIGh0dHBzOi8vYml0YnVja2V0Lm9yZy9weXBhL2Rpc3RsaWIvaXNzdWUvMzUvCiAgICBtYWtlci52YXJpYW50cyA9IHNldCgoJycsICkpCgogICAgIyBUaGlzIGlzIHJlcXVpcmVkIGJlY2F1c2Ugb3RoZXJ3aXNlIGRpc3RsaWIgY3JlYXRlcyBzY3JpcHRzIHRoYXQgYXJlIG5vdAogICAgIyBleGVjdXRhYmxlLgogICAgIyBTZWUgaHR0cHM6Ly9iaXRidWNrZXQub3JnL3B5cGEvZGlzdGxpYi9pc3N1ZS8zMi8KICAgIG1ha2VyLnNldF9tb2RlID0gVHJ1ZQoKICAgICMgU2ltcGxpZnkgdGhlIHNjcmlwdCBhbmQgZml4IHRoZSBmYWN0IHRoYXQgdGhlIGRlZmF1bHQgc2NyaXB0IHN3YWxsb3dzCiAgICAjIGV2ZXJ5IHNpbmdsZSBzdGFjayB0cmFjZS4KICAgICMgU2VlIGh0dHBzOi8vYml0YnVja2V0Lm9yZy9weXBhL2Rpc3RsaWIvaXNzdWUvMzQvCiAgICAjIFNlZSBodHRwczovL2JpdGJ1Y2tldC5vcmcvcHlwYS9kaXN0bGliL2lzc3VlLzMzLwogICAgZGVmIF9nZXRfc2NyaXB0X3RleHQoZW50cnkpOgogICAgICAgIGlmIGVudHJ5LnN1ZmZpeCBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBJbnN0YWxsYXRpb25FcnJvcigKICAgICAgICAgICAgICAgICJJbnZhbGlkIHNjcmlwdCBlbnRyeSBwb2ludDogJXMgZm9yIHJlcTogJXMgLSBBIGNhbGxhYmxlICIKICAgICAgICAgICAgICAgICJzdWZmaXggaXMgcmVxdWlyZWQuIENmIGh0dHBzOi8vcGFja2FnaW5nLnB5dGhvbi5vcmcvZW4vIgogICAgICAgICAgICAgICAgImxhdGVzdC9kaXN0cmlidXRpbmcuaHRtbCNjb25zb2xlLXNjcmlwdHMgZm9yIG1vcmUgIgogICAgICAgICAgICAgICAgImluZm9ybWF0aW9uLiIgJSAoZW50cnksIHJlcSkKICAgICAgICAgICAgKQogICAgICAgIHJldHVybiBtYWtlci5zY3JpcHRfdGVtcGxhdGUgJSB7CiAgICAgICAgICAgICJtb2R1bGUiOiBlbnRyeS5wcmVmaXgsCiAgICAgICAgICAgICJpbXBvcnRfbmFtZSI6IGVudHJ5LnN1ZmZpeC5zcGxpdCgiLiIpWzBdLAogICAgICAgICAgICAiZnVuYyI6IGVudHJ5LnN1ZmZpeCwKICAgICAgICB9CgogICAgbWFrZXIuX2dldF9zY3JpcHRfdGV4dCA9IF9nZXRfc2NyaXB0X3RleHQKICAgIG1ha2VyLnNjcmlwdF90ZW1wbGF0ZSA9ICIiIiMgLSotIGNvZGluZzogdXRmLTggLSotCmltcG9ydCByZQppbXBvcnQgc3lzCgpmcm9tICUobW9kdWxlKXMgaW1wb3J0ICUoaW1wb3J0X25hbWUpcwoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIHN5cy5hcmd2WzBdID0gcmUuc3ViKHInKC1zY3JpcHRcLnB5dz98XC5leGUpPyQnLCAnJywgc3lzLmFyZ3ZbMF0pCiAgICBzeXMuZXhpdCglKGZ1bmMpcygpKQoiIiIKCiAgICAjIFNwZWNpYWwgY2FzZSBwaXAgYW5kIHNldHVwdG9vbHMgdG8gZ2VuZXJhdGUgdmVyc2lvbmVkIHdyYXBwZXJzCiAgICAjCiAgICAjIFRoZSBpc3N1ZSBpcyB0aGF0IHNvbWUgcHJvamVjdHMgKHNwZWNpZmljYWxseSwgcGlwIGFuZCBzZXR1cHRvb2xzKSB1c2UKICAgICMgY29kZSBpbiBzZXR1cC5weSB0byBjcmVhdGUgInZlcnNpb25lZCIgZW50cnkgcG9pbnRzIC0gcGlwMi43IG9uIFB5dGhvbgogICAgIyAyLjcsIHBpcDMuMyBvbiBQeXRob24gMy4zLCBldGMuIEJ1dCB0aGVzZSBlbnRyeSBwb2ludHMgYXJlIGJha2VkIGludG8KICAgICMgdGhlIHdoZWVsIG1ldGFkYXRhIGF0IGJ1aWxkIHRpbWUsIGFuZCBzbyBpZiB0aGUgd2hlZWwgaXMgaW5zdGFsbGVkIHdpdGgKICAgICMgYSAqZGlmZmVyZW50KiB2ZXJzaW9uIG9mIFB5dGhvbiB0aGUgZW50cnkgcG9pbnRzIHdpbGwgYmUgd3JvbmcuIFRoZQogICAgIyBjb3JyZWN0IGZpeCBmb3IgdGhpcyBpcyB0byBlbmhhbmNlIHRoZSBtZXRhZGF0YSB0byBiZSBhYmxlIHRvIGRlc2NyaWJlCiAgICAjIHN1Y2ggdmVyc2lvbmVkIGVudHJ5IHBvaW50cywgYnV0IHRoYXQgd29uJ3QgaGFwcGVuIHRpbGwgTWV0YWRhdGEgMi4wIGlzCiAgICAjIGF2YWlsYWJsZS4KICAgICMgSW4gdGhlIG1lYW50aW1lLCBwcm9qZWN0cyB1c2luZyB2ZXJzaW9uZWQgZW50cnkgcG9pbnRzIHdpbGwgZWl0aGVyIGhhdmUKICAgICMgaW5jb3JyZWN0IHZlcnNpb25lZCBlbnRyeSBwb2ludHMsIG9yIHRoZXkgd2lsbCBub3QgYmUgYWJsZSB0byBkaXN0cmlidXRlCiAgICAjICJ1bml2ZXJzYWwiIHdoZWVscyAoaS5lLiwgdGhleSB3aWxsIG5lZWQgYSB3aGVlbCBwZXIgUHl0aG9uIHZlcnNpb24pLgogICAgIwogICAgIyBCZWNhdXNlIHNldHVwdG9vbHMgYW5kIHBpcCBhcmUgYnVuZGxlZCB3aXRoIF9lbnN1cmVwaXAgYW5kIHZpcnR1YWxlbnYsCiAgICAjIHdlIG5lZWQgdG8gdXNlIHVuaXZlcnNhbCB3aGVlbHMuIFNvLCBhcyBhIHN0b3BnYXAgdW50aWwgTWV0YWRhdGEgMi4wLCB3ZQogICAgIyBvdmVycmlkZSB0aGUgdmVyc2lvbmVkIGVudHJ5IHBvaW50cyBpbiB0aGUgd2hlZWwgYW5kIGdlbmVyYXRlIHRoZQogICAgIyBjb3JyZWN0IG9uZXMuIFRoaXMgY29kZSBpcyBwdXJlbHkgYSBzaG9ydC10ZXJtIG1lYXN1cmUgdW50aWwgTWV0YWRhdGEgMi4wCiAgICAjIGlzIGF2YWlsYWJsZS4KICAgICMKICAgICMgVG8gYWRkIHRoZSBsZXZlbCBvZiBoYWNrIGluIHRoaXMgc2VjdGlvbiBvZiBjb2RlLCBpbiBvcmRlciB0byBzdXBwb3J0CiAgICAjIGVuc3VyZXBpcCB0aGlzIGNvZGUgd2lsbCBsb29rIGZvciBhbiBgYEVOU1VSRVBJUF9PUFRJT05TYGAgZW52aXJvbm1lbnQKICAgICMgdmFyaWFibGUgd2hpY2ggd2lsbCBjb250cm9sIHdoaWNoIHZlcnNpb24gc2NyaXB0cyBnZXQgaW5zdGFsbGVkLgogICAgIwogICAgIyBFTlNVUkVQSVBfT1BUSU9OUz1hbHRpbnN0YWxsCiAgICAjICAgLSBPbmx5IHBpcFguWSBhbmQgZWFzeV9pbnN0YWxsLVguWSB3aWxsIGJlIGdlbmVyYXRlZCBhbmQgaW5zdGFsbGVkCiAgICAjIEVOU1VSRVBJUF9PUFRJT05TPWluc3RhbGwKICAgICMgICAtIHBpcFguWSwgcGlwWCwgZWFzeV9pbnN0YWxsLVguWSB3aWxsIGJlIGdlbmVyYXRlZCBhbmQgaW5zdGFsbGVkLiBOb3RlCiAgICAjICAgICB0aGF0IHRoaXMgb3B0aW9uIGlzIHRlY2huaWNhbGx5IGlmIEVOU1VSRVBJUF9PUFRJT05TIGlzIHNldCBhbmQgaXMKICAgICMgICAgIG5vdCBhbHRpbnN0YWxsCiAgICAjIERFRkFVTFQKICAgICMgICAtIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGluc3RhbGwgcGlwLCBwaXBYLCBwaXBYLlksIGVhc3lfaW5zdGFsbAogICAgIyAgICAgYW5kIGVhc3lfaW5zdGFsbC1YLlkuCiAgICBwaXBfc2NyaXB0ID0gY29uc29sZS5wb3AoJ3BpcCcsIE5vbmUpCiAgICBpZiBwaXBfc2NyaXB0OgogICAgICAgIGlmICJFTlNVUkVQSVBfT1BUSU9OUyIgbm90IGluIG9zLmVudmlyb246CiAgICAgICAgICAgIHNwZWMgPSAncGlwID0gJyArIHBpcF9zY3JpcHQKICAgICAgICAgICAgZ2VuZXJhdGVkLmV4dGVuZChtYWtlci5tYWtlKHNwZWMpKQoKICAgICAgICBpZiBvcy5lbnZpcm9uLmdldCgiRU5TVVJFUElQX09QVElPTlMiLCAiIikgIT0gImFsdGluc3RhbGwiOgogICAgICAgICAgICBzcGVjID0gJ3BpcCVzID0gJXMnICUgKHN5cy52ZXJzaW9uWzoxXSwgcGlwX3NjcmlwdCkKICAgICAgICAgICAgZ2VuZXJhdGVkLmV4dGVuZChtYWtlci5tYWtlKHNwZWMpKQoKICAgICAgICBzcGVjID0gJ3BpcCVzID0gJXMnICUgKHN5cy52ZXJzaW9uWzozXSwgcGlwX3NjcmlwdCkKICAgICAgICBnZW5lcmF0ZWQuZXh0ZW5kKG1ha2VyLm1ha2Uoc3BlYykpCiAgICAgICAgIyBEZWxldGUgYW55IG90aGVyIHZlcnNpb25lZCBwaXAgZW50cnkgcG9pbnRzCiAgICAgICAgcGlwX2VwID0gW2sgZm9yIGsgaW4gY29uc29sZSBpZiByZS5tYXRjaChyJ3BpcChcZChcLlxkKT8pPyQnLCBrKV0KICAgICAgICBmb3IgayBpbiBwaXBfZXA6CiAgICAgICAgICAgIGRlbCBjb25zb2xlW2tdCiAgICBlYXN5X2luc3RhbGxfc2NyaXB0ID0gY29uc29sZS5wb3AoJ2Vhc3lfaW5zdGFsbCcsIE5vbmUpCiAgICBpZiBlYXN5X2luc3RhbGxfc2NyaXB0OgogICAgICAgIGlmICJFTlNVUkVQSVBfT1BUSU9OUyIgbm90IGluIG9zLmVudmlyb246CiAgICAgICAgICAgIHNwZWMgPSAnZWFzeV9pbnN0YWxsID0gJyArIGVhc3lfaW5zdGFsbF9zY3JpcHQKICAgICAgICAgICAgZ2VuZXJhdGVkLmV4dGVuZChtYWtlci5tYWtlKHNwZWMpKQoKICAgICAgICBzcGVjID0gJ2Vhc3lfaW5zdGFsbC0lcyA9ICVzJyAlIChzeXMudmVyc2lvbls6M10sIGVhc3lfaW5zdGFsbF9zY3JpcHQpCiAgICAgICAgZ2VuZXJhdGVkLmV4dGVuZChtYWtlci5tYWtlKHNwZWMpKQogICAgICAgICMgRGVsZXRlIGFueSBvdGhlciB2ZXJzaW9uZWQgZWFzeV9pbnN0YWxsIGVudHJ5IHBvaW50cwogICAgICAgIGVhc3lfaW5zdGFsbF9lcCA9IFsKICAgICAgICAgICAgayBmb3IgayBpbiBjb25zb2xlIGlmIHJlLm1hdGNoKHInZWFzeV9pbnN0YWxsKC1cZFwuXGQpPyQnLCBrKQogICAgICAgIF0KICAgICAgICBmb3IgayBpbiBlYXN5X2luc3RhbGxfZXA6CiAgICAgICAgICAgIGRlbCBjb25zb2xlW2tdCgogICAgIyBHZW5lcmF0ZSB0aGUgY29uc29sZSBhbmQgR1VJIGVudHJ5IHBvaW50cyBzcGVjaWZpZWQgaW4gdGhlIHdoZWVsCiAgICBpZiBsZW4oY29uc29sZSkgPiAwOgogICAgICAgIGdlbmVyYXRlZC5leHRlbmQoCiAgICAgICAgICAgIG1ha2VyLm1ha2VfbXVsdGlwbGUoWyclcyA9ICVzJyAlIGt2IGZvciBrdiBpbiBjb25zb2xlLml0ZW1zKCldKQogICAgICAgICkKICAgIGlmIGxlbihndWkpID4gMDoKICAgICAgICBnZW5lcmF0ZWQuZXh0ZW5kKAogICAgICAgICAgICBtYWtlci5tYWtlX211bHRpcGxlKAogICAgICAgICAgICAgICAgWyclcyA9ICVzJyAlIGt2IGZvciBrdiBpbiBndWkuaXRlbXMoKV0sCiAgICAgICAgICAgICAgICB7J2d1aSc6IFRydWV9CiAgICAgICAgICAgICkKICAgICAgICApCgogICAgIyBSZWNvcmQgcGlwIGFzIHRoZSBpbnN0YWxsZXIKICAgIGluc3RhbGxlciA9IG9zLnBhdGguam9pbihpbmZvX2RpclswXSwgJ0lOU1RBTExFUicpCiAgICB0ZW1wX2luc3RhbGxlciA9IG9zLnBhdGguam9pbihpbmZvX2RpclswXSwgJ0lOU1RBTExFUi5waXAnKQogICAgd2l0aCBvcGVuKHRlbXBfaW5zdGFsbGVyLCAnd2InKSBhcyBpbnN0YWxsZXJfZmlsZToKICAgICAgICBpbnN0YWxsZXJfZmlsZS53cml0ZShiJ3BpcFxuJykKICAgIHNodXRpbC5tb3ZlKHRlbXBfaW5zdGFsbGVyLCBpbnN0YWxsZXIpCiAgICBnZW5lcmF0ZWQuYXBwZW5kKGluc3RhbGxlcikKCiAgICAjIFJlY29yZCBkZXRhaWxzIG9mIGFsbCBmaWxlcyBpbnN0YWxsZWQKICAgIHJlY29yZCA9IG9zLnBhdGguam9pbihpbmZvX2RpclswXSwgJ1JFQ09SRCcpCiAgICB0ZW1wX3JlY29yZCA9IG9zLnBhdGguam9pbihpbmZvX2RpclswXSwgJ1JFQ09SRC5waXAnKQogICAgd2l0aCBvcGVuX2Zvcl9jc3YocmVjb3JkLCAncicpIGFzIHJlY29yZF9pbjoKICAgICAgICB3aXRoIG9wZW5fZm9yX2Nzdih0ZW1wX3JlY29yZCwgJ3crJykgYXMgcmVjb3JkX291dDoKICAgICAgICAgICAgcmVhZGVyID0gY3N2LnJlYWRlcihyZWNvcmRfaW4pCiAgICAgICAgICAgIHdyaXRlciA9IGNzdi53cml0ZXIocmVjb3JkX291dCkKICAgICAgICAgICAgZm9yIHJvdyBpbiByZWFkZXI6CiAgICAgICAgICAgICAgICByb3dbMF0gPSBpbnN0YWxsZWQucG9wKHJvd1swXSwgcm93WzBdKQogICAgICAgICAgICAgICAgaWYgcm93WzBdIGluIGNoYW5nZWQ6CiAgICAgICAgICAgICAgICAgICAgcm93WzFdLCByb3dbMl0gPSByZWhhc2gocm93WzBdKQogICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlcm93KHJvdykKICAgICAgICAgICAgZm9yIGYgaW4gZ2VuZXJhdGVkOgogICAgICAgICAgICAgICAgaCwgbCA9IHJlaGFzaChmKQogICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlcm93KChub3JtcGF0aChmLCBsaWJfZGlyKSwgaCwgbCkpCiAgICAgICAgICAgIGZvciBmIGluIGluc3RhbGxlZDoKICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZXJvdygoaW5zdGFsbGVkW2ZdLCAnJywgJycpKQogICAgc2h1dGlsLm1vdmUodGVtcF9yZWNvcmQsIHJlY29yZCkKCgpkZWYgX3VuaXF1ZShmbik6CiAgICBAZnVuY3Rvb2xzLndyYXBzKGZuKQogICAgZGVmIHVuaXF1ZSgqYXJncywgKiprdyk6CiAgICAgICAgc2VlbiA9IHNldCgpCiAgICAgICAgZm9yIGl0ZW0gaW4gZm4oKmFyZ3MsICoqa3cpOgogICAgICAgICAgICBpZiBpdGVtIG5vdCBpbiBzZWVuOgogICAgICAgICAgICAgICAgc2Vlbi5hZGQoaXRlbSkKICAgICAgICAgICAgICAgIHlpZWxkIGl0ZW0KICAgIHJldHVybiB1bmlxdWUKCgojIFRPRE86IHRoaXMgZ29lcyBzb21ld2hlcmUgYmVzaWRlcyB0aGUgd2hlZWwgbW9kdWxlCkBfdW5pcXVlCmRlZiB1bmluc3RhbGxhdGlvbl9wYXRocyhkaXN0KToKICAgICIiIgogICAgWWllbGQgYWxsIHRoZSB1bmluc3RhbGxhdGlvbiBwYXRocyBmb3IgZGlzdCBiYXNlZCBvbiBSRUNPUkQtd2l0aG91dC0ucHljCgogICAgWWllbGQgcGF0aHMgdG8gYWxsIHRoZSBmaWxlcyBpbiBSRUNPUkQuIEZvciBlYWNoIC5weSBmaWxlIGluIFJFQ09SRCwgYWRkCiAgICB0aGUgLnB5YyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuCgogICAgVW5pbnN0YWxsUGF0aFNldC5hZGQoKSB0YWtlcyBjYXJlIG9mIHRoZSBfX3B5Y2FjaGVfXyAucHljLgogICAgIiIiCiAgICBmcm9tIHBpcC51dGlscyBpbXBvcnQgRmFrZUZpbGUgICMgY2lyY3VsYXIgaW1wb3J0CiAgICByID0gY3N2LnJlYWRlcihGYWtlRmlsZShkaXN0LmdldF9tZXRhZGF0YV9saW5lcygnUkVDT1JEJykpKQogICAgZm9yIHJvdyBpbiByOgogICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oZGlzdC5sb2NhdGlvbiwgcm93WzBdKQogICAgICAgIHlpZWxkIHBhdGgKICAgICAgICBpZiBwYXRoLmVuZHN3aXRoKCcucHknKToKICAgICAgICAgICAgZG4sIGZuID0gb3MucGF0aC5zcGxpdChwYXRoKQogICAgICAgICAgICBiYXNlID0gZm5bOi0zXQogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKGRuLCBiYXNlICsgJy5weWMnKQogICAgICAgICAgICB5aWVsZCBwYXRoCgoKZGVmIHdoZWVsX3ZlcnNpb24oc291cmNlX2Rpcik6CiAgICAiIiIKICAgIFJldHVybiB0aGUgV2hlZWwtVmVyc2lvbiBvZiBhbiBleHRyYWN0ZWQgd2hlZWwsIGlmIHBvc3NpYmxlLgoKICAgIE90aGVyd2lzZSwgcmV0dXJuIEZhbHNlIGlmIHdlIGNvdWxkbid0IHBhcnNlIC8gZXh0cmFjdCBpdC4KICAgICIiIgogICAgdHJ5OgogICAgICAgIGRpc3QgPSBbZCBmb3IgZCBpbiBwa2dfcmVzb3VyY2VzLmZpbmRfb25fcGF0aChOb25lLCBzb3VyY2VfZGlyKV1bMF0KCiAgICAgICAgd2hlZWxfZGF0YSA9IGRpc3QuZ2V0X21ldGFkYXRhKCdXSEVFTCcpCiAgICAgICAgd2hlZWxfZGF0YSA9IFBhcnNlcigpLnBhcnNlc3RyKHdoZWVsX2RhdGEpCgogICAgICAgIHZlcnNpb24gPSB3aGVlbF9kYXRhWydXaGVlbC1WZXJzaW9uJ10uc3RyaXAoKQogICAgICAgIHZlcnNpb24gPSB0dXBsZShtYXAoaW50LCB2ZXJzaW9uLnNwbGl0KCcuJykpKQogICAgICAgIHJldHVybiB2ZXJzaW9uCiAgICBleGNlcHQ6CiAgICAgICAgcmV0dXJuIEZhbHNlCgoKZGVmIGNoZWNrX2NvbXBhdGliaWxpdHkodmVyc2lvbiwgbmFtZSk6CiAgICAiIiIKICAgIFJhaXNlcyBlcnJvcnMgb3Igd2FybnMgaWYgY2FsbGVkIHdpdGggYW4gaW5jb21wYXRpYmxlIFdoZWVsLVZlcnNpb24uCgogICAgUGlwIHNob3VsZCByZWZ1c2UgdG8gaW5zdGFsbCBhIFdoZWVsLVZlcnNpb24gdGhhdCdzIGEgbWFqb3Igc2VyaWVzCiAgICBhaGVhZCBvZiB3aGF0IGl0J3MgY29tcGF0aWJsZSB3aXRoIChlLmcgMi4wID4gMS4xKTsgYW5kIHdhcm4gd2hlbgogICAgaW5zdGFsbGluZyBhIHZlcnNpb24gb25seSBtaW5vciB2ZXJzaW9uIGFoZWFkIChlLmcgMS4yID4gMS4xKS4KCiAgICB2ZXJzaW9uOiBhIDItdHVwbGUgcmVwcmVzZW50aW5nIGEgV2hlZWwtVmVyc2lvbiAoTWFqb3IsIE1pbm9yKQogICAgbmFtZTogbmFtZSBvZiB3aGVlbCBvciBwYWNrYWdlIHRvIHJhaXNlIGV4Y2VwdGlvbiBhYm91dAoKICAgIDpyYWlzZXMgVW5zdXBwb3J0ZWRXaGVlbDogd2hlbiBhbiBpbmNvbXBhdGlibGUgV2hlZWwtVmVyc2lvbiBpcyBnaXZlbgogICAgIiIiCiAgICBpZiBub3QgdmVyc2lvbjoKICAgICAgICByYWlzZSBVbnN1cHBvcnRlZFdoZWVsKAogICAgICAgICAgICAiJXMgaXMgaW4gYW4gdW5zdXBwb3J0ZWQgb3IgaW52YWxpZCB3aGVlbCIgJSBuYW1lCiAgICAgICAgKQogICAgaWYgdmVyc2lvblswXSA+IFZFUlNJT05fQ09NUEFUSUJMRVswXToKICAgICAgICByYWlzZSBVbnN1cHBvcnRlZFdoZWVsKAogICAgICAgICAgICAiJXMncyBXaGVlbC1WZXJzaW9uICglcykgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGlzIHZlcnNpb24gIgogICAgICAgICAgICAib2YgcGlwIiAlIChuYW1lLCAnLicuam9pbihtYXAoc3RyLCB2ZXJzaW9uKSkpCiAgICAgICAgKQogICAgZWxpZiB2ZXJzaW9uID4gVkVSU0lPTl9DT01QQVRJQkxFOgogICAgICAgIGxvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAnSW5zdGFsbGluZyBmcm9tIGEgbmV3ZXIgV2hlZWwtVmVyc2lvbiAoJXMpJywKICAgICAgICAgICAgJy4nLmpvaW4obWFwKHN0ciwgdmVyc2lvbikpLAogICAgICAgICkKCgpjbGFzcyBXaGVlbChvYmplY3QpOgogICAgIiIiQSB3aGVlbCBmaWxlIiIiCgogICAgIyBUT0RPOiBtYXliZSBtb3ZlIHRoZSBpbnN0YWxsIGNvZGUgaW50byB0aGlzIGNsYXNzCgogICAgd2hlZWxfZmlsZV9yZSA9IHJlLmNvbXBpbGUoCiAgICAgICAgciIiIl4oP1A8bmFtZXZlcj4oP1A8bmFtZT4uKz8pLSg/UDx2ZXI+XGQuKj8pKQogICAgICAgICgoLSg/UDxidWlsZD5cZC4qPykpPy0oP1A8cHl2ZXI+Lis/KS0oP1A8YWJpPi4rPyktKD9QPHBsYXQ+Lis/KQogICAgICAgIFwud2hsfFwuZGlzdC1pbmZvKSQiIiIsCiAgICAgICAgcmUuVkVSQk9TRQogICAgKQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlbmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgOnJhaXNlcyBJbnZhbGlkV2hlZWxGaWxlbmFtZTogd2hlbiB0aGUgZmlsZW5hbWUgaXMgaW52YWxpZCBmb3IgYSB3aGVlbAogICAgICAgICIiIgogICAgICAgIHdoZWVsX2luZm8gPSBzZWxmLndoZWVsX2ZpbGVfcmUubWF0Y2goZmlsZW5hbWUpCiAgICAgICAgaWYgbm90IHdoZWVsX2luZm86CiAgICAgICAgICAgIHJhaXNlIEludmFsaWRXaGVlbEZpbGVuYW1lKAogICAgICAgICAgICAgICAgIiVzIGlzIG5vdCBhIHZhbGlkIHdoZWVsIGZpbGVuYW1lLiIgJSBmaWxlbmFtZQogICAgICAgICAgICApCiAgICAgICAgc2VsZi5maWxlbmFtZSA9IGZpbGVuYW1lCiAgICAgICAgc2VsZi5uYW1lID0gd2hlZWxfaW5mby5ncm91cCgnbmFtZScpLnJlcGxhY2UoJ18nLCAnLScpCiAgICAgICAgIyB3ZSdsbCBhc3N1bWUgIl8iIG1lYW5zICItIiBkdWUgdG8gd2hlZWwgbmFtaW5nIHNjaGVtZQogICAgICAgICMgKGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3BpcC9pc3N1ZXMvMTE1MCkKICAgICAgICBzZWxmLnZlcnNpb24gPSB3aGVlbF9pbmZvLmdyb3VwKCd2ZXInKS5yZXBsYWNlKCdfJywgJy0nKQogICAgICAgIHNlbGYucHl2ZXJzaW9ucyA9IHdoZWVsX2luZm8uZ3JvdXAoJ3B5dmVyJykuc3BsaXQoJy4nKQogICAgICAgIHNlbGYuYWJpcyA9IHdoZWVsX2luZm8uZ3JvdXAoJ2FiaScpLnNwbGl0KCcuJykKICAgICAgICBzZWxmLnBsYXRzID0gd2hlZWxfaW5mby5ncm91cCgncGxhdCcpLnNwbGl0KCcuJykKCiAgICAgICAgIyBBbGwgdGhlIHRhZyBjb21iaW5hdGlvbnMgZnJvbSB0aGlzIGZpbGUKICAgICAgICBzZWxmLmZpbGVfdGFncyA9IHNldCgKICAgICAgICAgICAgKHgsIHksIHopIGZvciB4IGluIHNlbGYucHl2ZXJzaW9ucwogICAgICAgICAgICBmb3IgeSBpbiBzZWxmLmFiaXMgZm9yIHogaW4gc2VsZi5wbGF0cwogICAgICAgICkKCiAgICBkZWYgc3VwcG9ydF9pbmRleF9taW4oc2VsZiwgdGFncz1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gdGhlIGxvd2VzdCBpbmRleCB0aGF0IG9uZSBvZiB0aGUgd2hlZWwncyBmaWxlX3RhZyBjb21iaW5hdGlvbnMKICAgICAgICBhY2hpZXZlcyBpbiB0aGUgc3VwcG9ydGVkX3RhZ3MgbGlzdCBlLmcuIGlmIHRoZXJlIGFyZSA4IHN1cHBvcnRlZCB0YWdzLAogICAgICAgIGFuZCBvbmUgb2YgdGhlIGZpbGUgdGFncyBpcyBmaXJzdCBpbiB0aGUgbGlzdCwgdGhlbiByZXR1cm4gMC4gIFJldHVybnMKICAgICAgICBOb25lIGlzIHRoZSB3aGVlbCBpcyBub3Qgc3VwcG9ydGVkLgogICAgICAgICIiIgogICAgICAgIGlmIHRhZ3MgaXMgTm9uZTogICMgZm9yIG1vY2sKICAgICAgICAgICAgdGFncyA9IHBlcDQyNXRhZ3Muc3VwcG9ydGVkX3RhZ3MKICAgICAgICBpbmRleGVzID0gW3RhZ3MuaW5kZXgoYykgZm9yIGMgaW4gc2VsZi5maWxlX3RhZ3MgaWYgYyBpbiB0YWdzXQogICAgICAgIHJldHVybiBtaW4oaW5kZXhlcykgaWYgaW5kZXhlcyBlbHNlIE5vbmUKCiAgICBkZWYgc3VwcG9ydGVkKHNlbGYsIHRhZ3M9Tm9uZSk6CiAgICAgICAgIiIiSXMgdGhpcyB3aGVlbCBzdXBwb3J0ZWQgb24gdGhpcyBzeXN0ZW0/IiIiCiAgICAgICAgaWYgdGFncyBpcyBOb25lOiAgIyBmb3IgbW9jawogICAgICAgICAgICB0YWdzID0gcGVwNDI1dGFncy5zdXBwb3J0ZWRfdGFncwogICAgICAgIHJldHVybiBib29sKHNldCh0YWdzKS5pbnRlcnNlY3Rpb24oc2VsZi5maWxlX3RhZ3MpKQoKCmNsYXNzIFdoZWVsQnVpbGRlcihvYmplY3QpOgogICAgIiIiQnVpbGQgd2hlZWxzIGZyb20gYSBSZXF1aXJlbWVudFNldC4iIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgcmVxdWlyZW1lbnRfc2V0LCBmaW5kZXIsIGJ1aWxkX29wdGlvbnM9Tm9uZSwKICAgICAgICAgICAgICAgICBnbG9iYWxfb3B0aW9ucz1Ob25lKToKICAgICAgICBzZWxmLnJlcXVpcmVtZW50X3NldCA9IHJlcXVpcmVtZW50X3NldAogICAgICAgIHNlbGYuZmluZGVyID0gZmluZGVyCiAgICAgICAgc2VsZi5fY2FjaGVfcm9vdCA9IHJlcXVpcmVtZW50X3NldC5fd2hlZWxfY2FjaGUuX2NhY2hlX2RpcgogICAgICAgIHNlbGYuX3doZWVsX2RpciA9IHJlcXVpcmVtZW50X3NldC53aGVlbF9kb3dubG9hZF9kaXIKICAgICAgICBzZWxmLmJ1aWxkX29wdGlvbnMgPSBidWlsZF9vcHRpb25zIG9yIFtdCiAgICAgICAgc2VsZi5nbG9iYWxfb3B0aW9ucyA9IGdsb2JhbF9vcHRpb25zIG9yIFtdCgogICAgZGVmIF9idWlsZF9vbmUoc2VsZiwgcmVxLCBvdXRwdXRfZGlyLCBweXRob25fdGFnPU5vbmUpOgogICAgICAgICIiIkJ1aWxkIG9uZSB3aGVlbC4KCiAgICAgICAgOnJldHVybjogVGhlIGZpbGVuYW1lIG9mIHRoZSBidWlsdCB3aGVlbCwgb3IgTm9uZSBpZiB0aGUgYnVpbGQgZmFpbGVkLgogICAgICAgICIiIgogICAgICAgIHRlbXBkID0gdGVtcGZpbGUubWtkdGVtcCgncGlwLXdoZWVsLScpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBpZiBzZWxmLl9fYnVpbGRfb25lKHJlcSwgdGVtcGQsIHB5dGhvbl90YWc9cHl0aG9uX3RhZyk6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgd2hlZWxfbmFtZSA9IG9zLmxpc3RkaXIodGVtcGQpWzBdCiAgICAgICAgICAgICAgICAgICAgd2hlZWxfcGF0aCA9IG9zLnBhdGguam9pbihvdXRwdXRfZGlyLCB3aGVlbF9uYW1lKQogICAgICAgICAgICAgICAgICAgIHNodXRpbC5tb3ZlKG9zLnBhdGguam9pbih0ZW1wZCwgd2hlZWxfbmFtZSksIHdoZWVsX3BhdGgpCiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ1N0b3JlZCBpbiBkaXJlY3Rvcnk6ICVzJywgb3V0cHV0X2RpcikKICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2hlZWxfcGF0aAogICAgICAgICAgICAgICAgZXhjZXB0OgogICAgICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgIyBJZ25vcmUgcmV0dXJuLCB3ZSBjYW4ndCBkbyBhbnl0aGluZyBlbHNlIHVzZWZ1bC4KICAgICAgICAgICAgc2VsZi5fY2xlYW5fb25lKHJlcSkKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBybXRyZWUodGVtcGQpCgogICAgZGVmIF9iYXNlX3NldHVwX2FyZ3Moc2VsZiwgcmVxKToKICAgICAgICByZXR1cm4gWwogICAgICAgICAgICBzeXMuZXhlY3V0YWJsZSwgIi11IiwgJy1jJywKICAgICAgICAgICAgU0VUVVBUT09MU19TSElNICUgcmVxLnNldHVwX3B5CiAgICAgICAgXSArIGxpc3Qoc2VsZi5nbG9iYWxfb3B0aW9ucykKCiAgICBkZWYgX19idWlsZF9vbmUoc2VsZiwgcmVxLCB0ZW1wZCwgcHl0aG9uX3RhZz1Ob25lKToKICAgICAgICBiYXNlX2FyZ3MgPSBzZWxmLl9iYXNlX3NldHVwX2FyZ3MocmVxKQoKICAgICAgICBzcGluX21lc3NhZ2UgPSAnUnVubmluZyBzZXR1cC5weSBiZGlzdF93aGVlbCBmb3IgJXMnICUgKHJlcS5uYW1lLCkKICAgICAgICB3aXRoIG9wZW5fc3Bpbm5lcihzcGluX21lc3NhZ2UpIGFzIHNwaW5uZXI6CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnRGVzdGluYXRpb24gZGlyZWN0b3J5OiAlcycsIHRlbXBkKQogICAgICAgICAgICB3aGVlbF9hcmdzID0gYmFzZV9hcmdzICsgWydiZGlzdF93aGVlbCcsICctZCcsIHRlbXBkXSBcCiAgICAgICAgICAgICAgICArIHNlbGYuYnVpbGRfb3B0aW9ucwoKICAgICAgICAgICAgaWYgcHl0aG9uX3RhZyBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHdoZWVsX2FyZ3MgKz0gWyItLXB5dGhvbi10YWciLCBweXRob25fdGFnXQoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgY2FsbF9zdWJwcm9jZXNzKHdoZWVsX2FyZ3MsIGN3ZD1yZXEuc2V0dXBfcHlfZGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfc3Rkb3V0PUZhbHNlLCBzcGlubmVyPXNwaW5uZXIpCiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgICAgICBzcGlubmVyLmZpbmlzaCgiZXJyb3IiKQogICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgYnVpbGRpbmcgd2hlZWwgZm9yICVzJywgcmVxLm5hbWUpCiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgX2NsZWFuX29uZShzZWxmLCByZXEpOgogICAgICAgIGJhc2VfYXJncyA9IHNlbGYuX2Jhc2Vfc2V0dXBfYXJncyhyZXEpCgogICAgICAgIGxvZ2dlci5pbmZvKCdSdW5uaW5nIHNldHVwLnB5IGNsZWFuIGZvciAlcycsIHJlcS5uYW1lKQogICAgICAgIGNsZWFuX2FyZ3MgPSBiYXNlX2FyZ3MgKyBbJ2NsZWFuJywgJy0tYWxsJ10KICAgICAgICB0cnk6CiAgICAgICAgICAgIGNhbGxfc3VicHJvY2VzcyhjbGVhbl9hcmdzLCBjd2Q9cmVxLnNvdXJjZV9kaXIsIHNob3dfc3Rkb3V0PUZhbHNlKQogICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgY2xlYW5pbmcgYnVpbGQgZGlyIGZvciAlcycsIHJlcS5uYW1lKQogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBkZWYgYnVpbGQoc2VsZiwgYXV0b2J1aWxkaW5nPUZhbHNlKToKICAgICAgICAiIiJCdWlsZCB3aGVlbHMuCgogICAgICAgIDpwYXJhbSB1bnBhY2s6IElmIFRydWUsIHJlcGxhY2UgdGhlIHNkaXN0IHdlIGJ1aWx0IGZyb20gd2l0aCB0aGUKICAgICAgICAgICAgbmV3bHkgYnVpbHQgd2hlZWwsIGluIHByZXBhcmF0aW9uIGZvciBpbnN0YWxsYXRpb24uCiAgICAgICAgOnJldHVybjogVHJ1ZSBpZiBhbGwgdGhlIHdoZWVscyBidWlsdCBjb3JyZWN0bHkuCiAgICAgICAgIiIiCiAgICAgICAgYXNzZXJ0IHNlbGYuX3doZWVsX2RpciBvciAoYXV0b2J1aWxkaW5nIGFuZCBzZWxmLl9jYWNoZV9yb290KQogICAgICAgICMgdW5wYWNrIHNkaXN0cyBhbmQgY29uc3RydWN0cyByZXEgc2V0CiAgICAgICAgc2VsZi5yZXF1aXJlbWVudF9zZXQucHJlcGFyZV9maWxlcyhzZWxmLmZpbmRlcikKCiAgICAgICAgcmVxc2V0ID0gc2VsZi5yZXF1aXJlbWVudF9zZXQucmVxdWlyZW1lbnRzLnZhbHVlcygpCgogICAgICAgIGJ1aWxkc2V0ID0gW10KICAgICAgICBmb3IgcmVxIGluIHJlcXNldDoKICAgICAgICAgICAgaWYgcmVxLmNvbnN0cmFpbnQ6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiByZXEuaXNfd2hlZWw6CiAgICAgICAgICAgICAgICBpZiBub3QgYXV0b2J1aWxkaW5nOgogICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgICAgICAgICAnU2tpcHBpbmcgJXMsIGR1ZSB0byBhbHJlYWR5IGJlaW5nIHdoZWVsLicsIHJlcS5uYW1lKQogICAgICAgICAgICBlbGlmIGF1dG9idWlsZGluZyBhbmQgcmVxLmVkaXRhYmxlOgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICBlbGlmIGF1dG9idWlsZGluZyBhbmQgcmVxLmxpbmsgYW5kIG5vdCByZXEubGluay5pc19hcnRpZmFjdDoKICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgZWxpZiBhdXRvYnVpbGRpbmcgYW5kIG5vdCByZXEuc291cmNlX2RpcjoKICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlmIGF1dG9idWlsZGluZzoKICAgICAgICAgICAgICAgICAgICBsaW5rID0gcmVxLmxpbmsKICAgICAgICAgICAgICAgICAgICBiYXNlLCBleHQgPSBsaW5rLnNwbGl0ZXh0KCkKICAgICAgICAgICAgICAgICAgICBpZiBwaXAuaW5kZXguZWdnX2luZm9fbWF0Y2hlcyhiYXNlLCBOb25lLCBsaW5rKSBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgICAgICAjIERvZXNuJ3QgbG9vayBsaWtlIGEgcGFja2FnZSAtIGRvbid0IGF1dG9idWlsZCBhIHdoZWVsCiAgICAgICAgICAgICAgICAgICAgICAgICMgYmVjYXVzZSB3ZSdsbCBoYXZlIG5vIHdheSB0byBsb29rdXAgdGhlIHJlc3VsdCBzYW5lbHkKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICAgICBpZiAiYmluYXJ5IiBub3QgaW4gcGlwLmluZGV4LmZtdF9jdGxfZm9ybWF0cygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmluZGVyLmZvcm1hdF9jb250cm9sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Fub25pY2FsaXplX25hbWUocmVxLm5hbWUpKToKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2tpcHBpbmcgYmRpc3Rfd2hlZWwgZm9yICVzLCBkdWUgdG8gYmluYXJpZXMgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlaW5nIGRpc2FibGVkIGZvciBpdC4iLCByZXEubmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIGJ1aWxkc2V0LmFwcGVuZChyZXEpCgogICAgICAgIGlmIG5vdCBidWlsZHNldDoKICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICAgICAgIyBCdWlsZCB0aGUgd2hlZWxzLgogICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAnQnVpbGRpbmcgd2hlZWxzIGZvciBjb2xsZWN0ZWQgcGFja2FnZXM6ICVzJywKICAgICAgICAgICAgJywgJy5qb2luKFtyZXEubmFtZSBmb3IgcmVxIGluIGJ1aWxkc2V0XSksCiAgICAgICAgKQogICAgICAgIHdpdGggaW5kZW50X2xvZygpOgogICAgICAgICAgICBidWlsZF9zdWNjZXNzLCBidWlsZF9mYWlsdXJlID0gW10sIFtdCiAgICAgICAgICAgIGZvciByZXEgaW4gYnVpbGRzZXQ6CiAgICAgICAgICAgICAgICBweXRob25fdGFnID0gTm9uZQogICAgICAgICAgICAgICAgaWYgYXV0b2J1aWxkaW5nOgogICAgICAgICAgICAgICAgICAgIHB5dGhvbl90YWcgPSBwZXA0MjV0YWdzLmltcGxlbWVudGF0aW9uX3RhZwogICAgICAgICAgICAgICAgICAgIG91dHB1dF9kaXIgPSBfY2FjaGVfZm9yX2xpbmsoc2VsZi5fY2FjaGVfcm9vdCwgcmVxLmxpbmspCiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICBlbnN1cmVfZGlyKG91dHB1dF9kaXIpCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZToKICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoIkJ1aWxkaW5nIHdoZWVsIGZvciAlcyBmYWlsZWQ6ICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxLm5hbWUsIGUpCiAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkX2ZhaWx1cmUuYXBwZW5kKHJlcSkKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2RpciA9IHNlbGYuX3doZWVsX2RpcgogICAgICAgICAgICAgICAgd2hlZWxfZmlsZSA9IHNlbGYuX2J1aWxkX29uZSgKICAgICAgICAgICAgICAgICAgICByZXEsIG91dHB1dF9kaXIsCiAgICAgICAgICAgICAgICAgICAgcHl0aG9uX3RhZz1weXRob25fdGFnLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgaWYgd2hlZWxfZmlsZToKICAgICAgICAgICAgICAgICAgICBidWlsZF9zdWNjZXNzLmFwcGVuZChyZXEpCiAgICAgICAgICAgICAgICAgICAgaWYgYXV0b2J1aWxkaW5nOgogICAgICAgICAgICAgICAgICAgICAgICAjIFhYWDogVGhpcyBpcyBtaWxkbHkgZHVwbGljYXRpdmUgd2l0aCBwcmVwYXJlX2ZpbGVzLAogICAgICAgICAgICAgICAgICAgICAgICAjIGJ1dCBub3QgY2xvc2UgZW5vdWdoIHRvIHB1bGwgb3V0IHRvIGEgc2luZ2xlIGNvbW1vbgogICAgICAgICAgICAgICAgICAgICAgICAjIG1ldGhvZC4KICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgY29kZSBiZWxvdyBhc3N1bWVzIHRlbXBvcmFyeSBzb3VyY2UgZGlycyAtCiAgICAgICAgICAgICAgICAgICAgICAgICMgcHJldmVudCBpdCBkb2luZyBiYWQgdGhpbmdzLgogICAgICAgICAgICAgICAgICAgICAgICBpZiByZXEuc291cmNlX2RpciBhbmQgbm90IG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXEuc291cmNlX2RpciwgUElQX0RFTEVURV9NQVJLRVJfRklMRU5BTUUpKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYWQgc291cmNlIGRpciAtIG1pc3NpbmcgbWFya2VyIikKICAgICAgICAgICAgICAgICAgICAgICAgIyBEZWxldGUgdGhlIHNvdXJjZSB3ZSBidWlsdCB0aGUgd2hlZWwgZnJvbQogICAgICAgICAgICAgICAgICAgICAgICByZXEucmVtb3ZlX3RlbXBvcmFyeV9zb3VyY2UoKQogICAgICAgICAgICAgICAgICAgICAgICAjIHNldCB0aGUgYnVpbGQgZGlyZWN0b3J5IGFnYWluIC0gbmFtZSBpcyBrbm93biBmcm9tCiAgICAgICAgICAgICAgICAgICAgICAgICMgdGhlIHdvcmsgcHJlcGFyZV9maWxlcyBkaWQuCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5zb3VyY2VfZGlyID0gcmVxLmJ1aWxkX2xvY2F0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXF1aXJlbWVudF9zZXQuYnVpbGRfZGlyKQogICAgICAgICAgICAgICAgICAgICAgICAjIFVwZGF0ZSB0aGUgbGluayBmb3IgdGhpcy4KICAgICAgICAgICAgICAgICAgICAgICAgcmVxLmxpbmsgPSBwaXAuaW5kZXguTGluaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhfdG9fdXJsKHdoZWVsX2ZpbGUpKQogICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgcmVxLmxpbmsuaXNfd2hlZWwKICAgICAgICAgICAgICAgICAgICAgICAgIyBleHRyYWN0IHRoZSB3aGVlbCBpbnRvIHRoZSBkaXIKICAgICAgICAgICAgICAgICAgICAgICAgdW5wYWNrX3VybCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5saW5rLCByZXEuc291cmNlX2RpciwgTm9uZSwgRmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uPXNlbGYucmVxdWlyZW1lbnRfc2V0LnNlc3Npb24pCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGJ1aWxkX2ZhaWx1cmUuYXBwZW5kKHJlcSkKCiAgICAgICAgIyBub3RpZnkgc3VjY2Vzcy9mYWlsdXJlCiAgICAgICAgaWYgYnVpbGRfc3VjY2VzczoKICAgICAgICAgICAgbG9nZ2VyLmluZm8oCiAgICAgICAgICAgICAgICAnU3VjY2Vzc2Z1bGx5IGJ1aWx0ICVzJywKICAgICAgICAgICAgICAgICcgJy5qb2luKFtyZXEubmFtZSBmb3IgcmVxIGluIGJ1aWxkX3N1Y2Nlc3NdKSwKICAgICAgICAgICAgKQogICAgICAgIGlmIGJ1aWxkX2ZhaWx1cmU6CiAgICAgICAgICAgIGxvZ2dlci5pbmZvKAogICAgICAgICAgICAgICAgJ0ZhaWxlZCB0byBidWlsZCAlcycsCiAgICAgICAgICAgICAgICAnICcuam9pbihbcmVxLm5hbWUgZm9yIHJlcSBpbiBidWlsZF9mYWlsdXJlXSksCiAgICAgICAgICAgICkKICAgICAgICAjIFJldHVybiBUcnVlIGlmIGFsbCBidWlsZHMgd2VyZSBzdWNjZXNzZnVsCiAgICAgICAgcmV0dXJuIGxlbihidWlsZF9mYWlsdXJlKSA9PSAwClBLAwQUAAAAAAAAACEAAAAAAAAAAAAAAAAAIwAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L19faW5pdF9fLnB5UEsDBBQAAAAAAAAAIQBcT7pFfgAAAH4AAAAnAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvZWFzeV9pbnN0YWxsLnB5IiIiUnVuIHRoZSBFYXN5SW5zdGFsbCBjb21tYW5kIiIiCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQuZWFzeV9pbnN0YWxsIGltcG9ydCBtYWluCiAgICBtYWluKCkKUEsDBBQAAAAAAAAAIQAXRJ4pB54BAAeeAQAxAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9fX2luaXRfXy5weSMgY29kaW5nOiB1dGYtOAoiIiIKUGFja2FnZSByZXNvdXJjZSBBUEkKLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkEgcmVzb3VyY2UgaXMgYSBsb2dpY2FsIGZpbGUgY29udGFpbmVkIHdpdGhpbiBhIHBhY2thZ2UsIG9yIGEgbG9naWNhbApzdWJkaXJlY3RvcnkgdGhlcmVvZi4gIFRoZSBwYWNrYWdlIHJlc291cmNlIEFQSSBleHBlY3RzIHJlc291cmNlIG5hbWVzCnRvIGhhdmUgdGhlaXIgcGF0aCBwYXJ0cyBzZXBhcmF0ZWQgd2l0aCBgYC9gYCwgKm5vdCogd2hhdGV2ZXIgdGhlIGxvY2FsCnBhdGggc2VwYXJhdG9yIGlzLiAgRG8gbm90IHVzZSBvcy5wYXRoIG9wZXJhdGlvbnMgdG8gbWFuaXB1bGF0ZSByZXNvdXJjZQpuYW1lcyBiZWluZyBwYXNzZWQgaW50byB0aGUgQVBJLgoKVGhlIHBhY2thZ2UgcmVzb3VyY2UgQVBJIGlzIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCBub3JtYWwgZmlsZXN5c3RlbSBwYWNrYWdlcywKLmVnZyBmaWxlcywgYW5kIHVucGFja2VkIC5lZ2cgZmlsZXMuICBJdCBjYW4gYWxzbyB3b3JrIGluIGEgbGltaXRlZCB3YXkgd2l0aAouemlwIGZpbGVzIGFuZCB3aXRoIGN1c3RvbSBQRVAgMzAyIGxvYWRlcnMgdGhhdCBzdXBwb3J0IHRoZSBgYGdldF9kYXRhKClgYAptZXRob2QuCiIiIgoKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBzeXMKaW1wb3J0IG9zCmltcG9ydCBpbwppbXBvcnQgdGltZQppbXBvcnQgcmUKaW1wb3J0IHR5cGVzCmltcG9ydCB6aXBmaWxlCmltcG9ydCB6aXBpbXBvcnQKaW1wb3J0IHdhcm5pbmdzCmltcG9ydCBzdGF0CmltcG9ydCBmdW5jdG9vbHMKaW1wb3J0IHBrZ3V0aWwKaW1wb3J0IG9wZXJhdG9yCmltcG9ydCBwbGF0Zm9ybQppbXBvcnQgY29sbGVjdGlvbnMKaW1wb3J0IHBsaXN0bGliCmltcG9ydCBlbWFpbC5wYXJzZXIKaW1wb3J0IGVycm5vCmltcG9ydCB0ZW1wZmlsZQppbXBvcnQgdGV4dHdyYXAKaW1wb3J0IGl0ZXJ0b29scwppbXBvcnQgaW5zcGVjdApmcm9tIHBrZ3V0aWwgaW1wb3J0IGdldF9pbXBvcnRlcgoKdHJ5OgogICAgaW1wb3J0IF9pbXAKZXhjZXB0IEltcG9ydEVycm9yOgogICAgIyBQeXRob24gMy4yIGNvbXBhdGliaWxpdHkKICAgIGltcG9ydCBpbXAgYXMgX2ltcAoKZnJvbSBwa2dfcmVzb3VyY2VzLmV4dGVybiBpbXBvcnQgc2l4CmZyb20gcGtnX3Jlc291cmNlcy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCB1cmxsaWIsIG1hcCwgZmlsdGVyCgojIGNhcHR1cmUgdGhlc2UgdG8gYnlwYXNzIHNhbmRib3hpbmcKZnJvbSBvcyBpbXBvcnQgdXRpbWUKdHJ5OgogICAgZnJvbSBvcyBpbXBvcnQgbWtkaXIsIHJlbmFtZSwgdW5saW5rCiAgICBXUklURV9TVVBQT1JUID0gVHJ1ZQpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAjIG5vIHdyaXRlIHN1cHBvcnQsIHByb2JhYmx5IHVuZGVyIEdBRQogICAgV1JJVEVfU1VQUE9SVCA9IEZhbHNlCgpmcm9tIG9zIGltcG9ydCBvcGVuIGFzIG9zX29wZW4KZnJvbSBvcy5wYXRoIGltcG9ydCBpc2Rpciwgc3BsaXQKCnRyeToKICAgIGltcG9ydCBpbXBvcnRsaWIubWFjaGluZXJ5IGFzIGltcG9ydGxpYl9tYWNoaW5lcnkKICAgICMgYWNjZXNzIGF0dHJpYnV0ZSB0byBmb3JjZSBpbXBvcnQgdW5kZXIgZGVsYXllZCBpbXBvcnQgbWVjaGFuaXNtcy4KICAgIGltcG9ydGxpYl9tYWNoaW5lcnkuX19uYW1lX18KZXhjZXB0IEltcG9ydEVycm9yOgogICAgaW1wb3J0bGliX21hY2hpbmVyeSA9IE5vbmUKCmZyb20gLiBpbXBvcnQgcHkzMWNvbXBhdApmcm9tIHBrZ19yZXNvdXJjZXMuZXh0ZXJuIGltcG9ydCBhcHBkaXJzCmZyb20gcGtnX3Jlc291cmNlcy5leHRlcm4gaW1wb3J0IHBhY2thZ2luZwpfX2ltcG9ydF9fKCdwa2dfcmVzb3VyY2VzLmV4dGVybi5wYWNrYWdpbmcudmVyc2lvbicpCl9faW1wb3J0X18oJ3BrZ19yZXNvdXJjZXMuZXh0ZXJuLnBhY2thZ2luZy5zcGVjaWZpZXJzJykKX19pbXBvcnRfXygncGtnX3Jlc291cmNlcy5leHRlcm4ucGFja2FnaW5nLnJlcXVpcmVtZW50cycpCl9faW1wb3J0X18oJ3BrZ19yZXNvdXJjZXMuZXh0ZXJuLnBhY2thZ2luZy5tYXJrZXJzJykKCgppZiAoMywgMCkgPCBzeXMudmVyc2lvbl9pbmZvIDwgKDMsIDMpOgogICAgcmFpc2UgUnVudGltZUVycm9yKCJQeXRob24gMy4zIG9yIGxhdGVyIGlzIHJlcXVpcmVkIikKCmlmIHNpeC5QWTI6CiAgICAjIFRob3NlIGJ1aWx0aW4gZXhjZXB0aW9ucyBhcmUgb25seSBkZWZpbmVkIGluIFB5dGhvbiAzCiAgICBQZXJtaXNzaW9uRXJyb3IgPSBOb25lCiAgICBOb3RBRGlyZWN0b3J5RXJyb3IgPSBOb25lCgojIGRlY2xhcmUgc29tZSBnbG9iYWxzIHRoYXQgd2lsbCBiZSBkZWZpbmVkIGxhdGVyIHRvCiMgc2F0aXNmeSB0aGUgbGludGVycy4KcmVxdWlyZSA9IE5vbmUKd29ya2luZ19zZXQgPSBOb25lCgoKY2xhc3MgUEVQNDQwV2FybmluZyhSdW50aW1lV2FybmluZyk6CiAgICAiIiIKICAgIFVzZWQgd2hlbiB0aGVyZSBpcyBhbiBpc3N1ZSB3aXRoIGEgdmVyc2lvbiBvciBzcGVjaWZpZXIgbm90IGNvbXBseWluZyB3aXRoCiAgICBQRVAgNDQwLgogICAgIiIiCgoKY2xhc3MgX1NldHVwdG9vbHNWZXJzaW9uTWl4aW4ob2JqZWN0KToKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gc3VwZXIoX1NldHVwdG9vbHNWZXJzaW9uTWl4aW4sIHNlbGYpLl9faGFzaF9fKCkKCiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCB0dXBsZSk6CiAgICAgICAgICAgIHJldHVybiB0dXBsZShzZWxmKSA8IG90aGVyCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHN1cGVyKF9TZXR1cHRvb2xzVmVyc2lvbk1peGluLCBzZWxmKS5fX2x0X18ob3RoZXIpCgogICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdHVwbGUpOgogICAgICAgICAgICByZXR1cm4gdHVwbGUoc2VsZikgPD0gb3RoZXIKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc3VwZXIoX1NldHVwdG9vbHNWZXJzaW9uTWl4aW4sIHNlbGYpLl9fbGVfXyhvdGhlcikKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCB0dXBsZSk6CiAgICAgICAgICAgIHJldHVybiB0dXBsZShzZWxmKSA9PSBvdGhlcgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzdXBlcihfU2V0dXB0b29sc1ZlcnNpb25NaXhpbiwgc2VsZikuX19lcV9fKG90aGVyKQoKICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHR1cGxlKToKICAgICAgICAgICAgcmV0dXJuIHR1cGxlKHNlbGYpID49IG90aGVyCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHN1cGVyKF9TZXR1cHRvb2xzVmVyc2lvbk1peGluLCBzZWxmKS5fX2dlX18ob3RoZXIpCgogICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgdHVwbGUpOgogICAgICAgICAgICByZXR1cm4gdHVwbGUoc2VsZikgPiBvdGhlcgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzdXBlcihfU2V0dXB0b29sc1ZlcnNpb25NaXhpbiwgc2VsZikuX19ndF9fKG90aGVyKQoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHR1cGxlKToKICAgICAgICAgICAgcmV0dXJuIHR1cGxlKHNlbGYpICE9IG90aGVyCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHN1cGVyKF9TZXR1cHRvb2xzVmVyc2lvbk1peGluLCBzZWxmKS5fX25lX18ob3RoZXIpCgogICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CiAgICAgICAgcmV0dXJuIHR1cGxlKHNlbGYpW2tleV0KCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgY29tcG9uZW50X3JlID0gcmUuY29tcGlsZShyJyhcZCsgfCBbYS16XSsgfCBcLnwgLSknLCByZS5WRVJCT1NFKQogICAgICAgIHJlcGxhY2UgPSB7CiAgICAgICAgICAgICdwcmUnOiAnYycsCiAgICAgICAgICAgICdwcmV2aWV3JzogJ2MnLAogICAgICAgICAgICAnLSc6ICdmaW5hbC0nLAogICAgICAgICAgICAncmMnOiAnYycsCiAgICAgICAgICAgICdkZXYnOiAnQCcsCiAgICAgICAgfS5nZXQKCiAgICAgICAgZGVmIF9wYXJzZV92ZXJzaW9uX3BhcnRzKHMpOgogICAgICAgICAgICBmb3IgcGFydCBpbiBjb21wb25lbnRfcmUuc3BsaXQocyk6CiAgICAgICAgICAgICAgICBwYXJ0ID0gcmVwbGFjZShwYXJ0LCBwYXJ0KQogICAgICAgICAgICAgICAgaWYgbm90IHBhcnQgb3IgcGFydCA9PSAnLic6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIGlmIHBhcnRbOjFdIGluICcwMTIzNDU2Nzg5JzoKICAgICAgICAgICAgICAgICAgICAjIHBhZCBmb3IgbnVtZXJpYyBjb21wYXJpc29uCiAgICAgICAgICAgICAgICAgICAgeWllbGQgcGFydC56ZmlsbCg4KQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICB5aWVsZCAnKicgKyBwYXJ0CgogICAgICAgICAgICAjIGVuc3VyZSB0aGF0IGFscGhhL2JldGEvY2FuZGlkYXRlIGFyZSBiZWZvcmUgZmluYWwKICAgICAgICAgICAgeWllbGQgJypmaW5hbCcKCiAgICAgICAgZGVmIG9sZF9wYXJzZV92ZXJzaW9uKHMpOgogICAgICAgICAgICBwYXJ0cyA9IFtdCiAgICAgICAgICAgIGZvciBwYXJ0IGluIF9wYXJzZV92ZXJzaW9uX3BhcnRzKHMubG93ZXIoKSk6CiAgICAgICAgICAgICAgICBpZiBwYXJ0LnN0YXJ0c3dpdGgoJyonKToKICAgICAgICAgICAgICAgICAgICAjIHJlbW92ZSAnLScgYmVmb3JlIGEgcHJlcmVsZWFzZSB0YWcKICAgICAgICAgICAgICAgICAgICBpZiBwYXJ0IDwgJypmaW5hbCc6CiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIHBhcnRzIGFuZCBwYXJ0c1stMV0gPT0gJypmaW5hbC0nOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydHMucG9wKCkKICAgICAgICAgICAgICAgICAgICAjIHJlbW92ZSB0cmFpbGluZyB6ZXJvcyBmcm9tIGVhY2ggc2VyaWVzIG9mIG51bWVyaWMgcGFydHMKICAgICAgICAgICAgICAgICAgICB3aGlsZSBwYXJ0cyBhbmQgcGFydHNbLTFdID09ICcwMDAwMDAwMCc6CiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzLnBvcCgpCiAgICAgICAgICAgICAgICBwYXJ0cy5hcHBlbmQocGFydCkKICAgICAgICAgICAgcmV0dXJuIHR1cGxlKHBhcnRzKQoKICAgICAgICAjIFdhcm4gZm9yIHVzZSBvZiB0aGlzIGZ1bmN0aW9uCiAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgIllvdSBoYXZlIGl0ZXJhdGVkIG92ZXIgdGhlIHJlc3VsdCBvZiAiCiAgICAgICAgICAgICJwa2dfcmVzb3VyY2VzLnBhcnNlX3ZlcnNpb24uIFRoaXMgaXMgYSBsZWdhY3kgYmVoYXZpb3Igd2hpY2ggaXMgIgogICAgICAgICAgICAiaW5jb25zaXN0ZW50IHdpdGggdGhlIG5ldyB2ZXJzaW9uIGNsYXNzIGludHJvZHVjZWQgaW4gc2V0dXB0b29scyAiCiAgICAgICAgICAgICI4LjAuIEluIG1vc3QgY2FzZXMsIGNvbnZlcnNpb24gdG8gYSB0dXBsZSBpcyB1bm5lY2Vzc2FyeS4gRm9yICIKICAgICAgICAgICAgImNvbXBhcmlzb24gb2YgdmVyc2lvbnMsIHNvcnQgdGhlIFZlcnNpb24gaW5zdGFuY2VzIGRpcmVjdGx5LiBJZiAiCiAgICAgICAgICAgICJ5b3UgaGF2ZSBhbm90aGVyIHVzZSBjYXNlIHJlcXVpcmluZyB0aGUgdHVwbGUsIHBsZWFzZSBmaWxlIGEgIgogICAgICAgICAgICAiYnVnIHdpdGggdGhlIHNldHVwdG9vbHMgcHJvamVjdCBkZXNjcmliaW5nIHRoYXQgbmVlZC4iLAogICAgICAgICAgICBSdW50aW1lV2FybmluZywKICAgICAgICAgICAgc3RhY2tsZXZlbD0xLAogICAgICAgICkKCiAgICAgICAgZm9yIHBhcnQgaW4gb2xkX3BhcnNlX3ZlcnNpb24oc3RyKHNlbGYpKToKICAgICAgICAgICAgeWllbGQgcGFydAoKCmNsYXNzIFNldHVwdG9vbHNWZXJzaW9uKF9TZXR1cHRvb2xzVmVyc2lvbk1peGluLCBwYWNrYWdpbmcudmVyc2lvbi5WZXJzaW9uKToKICAgIHBhc3MKCgpjbGFzcyBTZXR1cHRvb2xzTGVnYWN5VmVyc2lvbihfU2V0dXB0b29sc1ZlcnNpb25NaXhpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnaW5nLnZlcnNpb24uTGVnYWN5VmVyc2lvbik6CiAgICBwYXNzCgoKZGVmIHBhcnNlX3ZlcnNpb24odik6CiAgICB0cnk6CiAgICAgICAgcmV0dXJuIFNldHVwdG9vbHNWZXJzaW9uKHYpCiAgICBleGNlcHQgcGFja2FnaW5nLnZlcnNpb24uSW52YWxpZFZlcnNpb246CiAgICAgICAgcmV0dXJuIFNldHVwdG9vbHNMZWdhY3lWZXJzaW9uKHYpCgoKX3N0YXRlX3ZhcnMgPSB7fQoKCmRlZiBfZGVjbGFyZV9zdGF0ZSh2YXJ0eXBlLCAqKmt3KToKICAgIGdsb2JhbHMoKS51cGRhdGUoa3cpCiAgICBfc3RhdGVfdmFycy51cGRhdGUoZGljdC5mcm9ta2V5cyhrdywgdmFydHlwZSkpCgoKZGVmIF9fZ2V0c3RhdGVfXygpOgogICAgc3RhdGUgPSB7fQogICAgZyA9IGdsb2JhbHMoKQogICAgZm9yIGssIHYgaW4gX3N0YXRlX3ZhcnMuaXRlbXMoKToKICAgICAgICBzdGF0ZVtrXSA9IGdbJ19zZ2V0XycgKyB2XShnW2tdKQogICAgcmV0dXJuIHN0YXRlCgoKZGVmIF9fc2V0c3RhdGVfXyhzdGF0ZSk6CiAgICBnID0gZ2xvYmFscygpCiAgICBmb3IgaywgdiBpbiBzdGF0ZS5pdGVtcygpOgogICAgICAgIGdbJ19zc2V0XycgKyBfc3RhdGVfdmFyc1trXV0oaywgZ1trXSwgdikKICAgIHJldHVybiBzdGF0ZQoKCmRlZiBfc2dldF9kaWN0KHZhbCk6CiAgICByZXR1cm4gdmFsLmNvcHkoKQoKCmRlZiBfc3NldF9kaWN0KGtleSwgb2IsIHN0YXRlKToKICAgIG9iLmNsZWFyKCkKICAgIG9iLnVwZGF0ZShzdGF0ZSkKCgpkZWYgX3NnZXRfb2JqZWN0KHZhbCk6CiAgICByZXR1cm4gdmFsLl9fZ2V0c3RhdGVfXygpCgoKZGVmIF9zc2V0X29iamVjdChrZXksIG9iLCBzdGF0ZSk6CiAgICBvYi5fX3NldHN0YXRlX18oc3RhdGUpCgoKX3NnZXRfbm9uZSA9IF9zc2V0X25vbmUgPSBsYW1iZGEgKmFyZ3M6IE5vbmUKCgpkZWYgZ2V0X3N1cHBvcnRlZF9wbGF0Zm9ybSgpOgogICAgIiIiUmV0dXJuIHRoaXMgcGxhdGZvcm0ncyBtYXhpbXVtIGNvbXBhdGlibGUgdmVyc2lvbi4KCiAgICBkaXN0dXRpbHMudXRpbC5nZXRfcGxhdGZvcm0oKSBub3JtYWxseSByZXBvcnRzIHRoZSBtaW5pbXVtIHZlcnNpb24KICAgIG9mIE1hYyBPUyBYIHRoYXQgd291bGQgYmUgcmVxdWlyZWQgdG8gKnVzZSogZXh0ZW5zaW9ucyBwcm9kdWNlZCBieQogICAgZGlzdHV0aWxzLiAgQnV0IHdoYXQgd2Ugd2FudCB3aGVuIGNoZWNraW5nIGNvbXBhdGliaWxpdHkgaXMgdG8ga25vdyB0aGUKICAgIHZlcnNpb24gb2YgTWFjIE9TIFggdGhhdCB3ZSBhcmUgKnJ1bm5pbmcqLiAgVG8gYWxsb3cgdXNhZ2Ugb2YgcGFja2FnZXMgdGhhdAogICAgZXhwbGljaXRseSByZXF1aXJlIGEgbmV3ZXIgdmVyc2lvbiBvZiBNYWMgT1MgWCwgd2UgbXVzdCBhbHNvIGtub3cgdGhlCiAgICBjdXJyZW50IHZlcnNpb24gb2YgdGhlIE9TLgoKICAgIElmIHRoaXMgY29uZGl0aW9uIG9jY3VycyBmb3IgYW55IG90aGVyIHBsYXRmb3JtIHdpdGggYSB2ZXJzaW9uIGluIGl0cwogICAgcGxhdGZvcm0gc3RyaW5ncywgdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgZXh0ZW5kZWQgYWNjb3JkaW5nbHkuCiAgICAiIiIKICAgIHBsYXQgPSBnZXRfYnVpbGRfcGxhdGZvcm0oKQogICAgbSA9IG1hY29zVmVyc2lvblN0cmluZy5tYXRjaChwbGF0KQogICAgaWYgbSBpcyBub3QgTm9uZSBhbmQgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iOgogICAgICAgIHRyeToKICAgICAgICAgICAgcGxhdCA9ICdtYWNvc3gtJXMtJXMnICUgKCcuJy5qb2luKF9tYWNvc3hfdmVycygpWzoyXSksIG0uZ3JvdXAoMykpCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICMgbm90IE1hYyBPUyBYCiAgICAgICAgICAgIHBhc3MKICAgIHJldHVybiBwbGF0CgoKX19hbGxfXyA9IFsKICAgICMgQmFzaWMgcmVzb3VyY2UgYWNjZXNzIGFuZCBkaXN0cmlidXRpb24vZW50cnkgcG9pbnQgZGlzY292ZXJ5CiAgICAncmVxdWlyZScsICdydW5fc2NyaXB0JywgJ2dldF9wcm92aWRlcicsICdnZXRfZGlzdHJpYnV0aW9uJywKICAgICdsb2FkX2VudHJ5X3BvaW50JywgJ2dldF9lbnRyeV9tYXAnLCAnZ2V0X2VudHJ5X2luZm8nLAogICAgJ2l0ZXJfZW50cnlfcG9pbnRzJywKICAgICdyZXNvdXJjZV9zdHJpbmcnLCAncmVzb3VyY2Vfc3RyZWFtJywgJ3Jlc291cmNlX2ZpbGVuYW1lJywKICAgICdyZXNvdXJjZV9saXN0ZGlyJywgJ3Jlc291cmNlX2V4aXN0cycsICdyZXNvdXJjZV9pc2RpcicsCgogICAgIyBFbnZpcm9ubWVudGFsIGNvbnRyb2wKICAgICdkZWNsYXJlX25hbWVzcGFjZScsICd3b3JraW5nX3NldCcsICdhZGRfYWN0aXZhdGlvbl9saXN0ZW5lcicsCiAgICAnZmluZF9kaXN0cmlidXRpb25zJywgJ3NldF9leHRyYWN0aW9uX3BhdGgnLCAnY2xlYW51cF9yZXNvdXJjZXMnLAogICAgJ2dldF9kZWZhdWx0X2NhY2hlJywKCiAgICAjIFByaW1hcnkgaW1wbGVtZW50YXRpb24gY2xhc3NlcwogICAgJ0Vudmlyb25tZW50JywgJ1dvcmtpbmdTZXQnLCAnUmVzb3VyY2VNYW5hZ2VyJywKICAgICdEaXN0cmlidXRpb24nLCAnUmVxdWlyZW1lbnQnLCAnRW50cnlQb2ludCcsCgogICAgIyBFeGNlcHRpb25zCiAgICAnUmVzb2x1dGlvbkVycm9yJywgJ1ZlcnNpb25Db25mbGljdCcsICdEaXN0cmlidXRpb25Ob3RGb3VuZCcsCiAgICAnVW5rbm93bkV4dHJhJywgJ0V4dHJhY3Rpb25FcnJvcicsCgogICAgIyBXYXJuaW5ncwogICAgJ1BFUDQ0MFdhcm5pbmcnLAoKICAgICMgUGFyc2luZyBmdW5jdGlvbnMgYW5kIHN0cmluZyB1dGlsaXRpZXMKICAgICdwYXJzZV9yZXF1aXJlbWVudHMnLCAncGFyc2VfdmVyc2lvbicsICdzYWZlX25hbWUnLCAnc2FmZV92ZXJzaW9uJywKICAgICdnZXRfcGxhdGZvcm0nLCAnY29tcGF0aWJsZV9wbGF0Zm9ybXMnLCAneWllbGRfbGluZXMnLCAnc3BsaXRfc2VjdGlvbnMnLAogICAgJ3NhZmVfZXh0cmEnLCAndG9fZmlsZW5hbWUnLCAnaW52YWxpZF9tYXJrZXInLCAnZXZhbHVhdGVfbWFya2VyJywKCiAgICAjIGZpbGVzeXN0ZW0gdXRpbGl0aWVzCiAgICAnZW5zdXJlX2RpcmVjdG9yeScsICdub3JtYWxpemVfcGF0aCcsCgogICAgIyBEaXN0cmlidXRpb24gInByZWNlZGVuY2UiIGNvbnN0YW50cwogICAgJ0VHR19ESVNUJywgJ0JJTkFSWV9ESVNUJywgJ1NPVVJDRV9ESVNUJywgJ0NIRUNLT1VUX0RJU1QnLCAnREVWRUxPUF9ESVNUJywKCiAgICAjICJQcm92aWRlciIgaW50ZXJmYWNlcywgaW1wbGVtZW50YXRpb25zLCBhbmQgcmVnaXN0cmF0aW9uL2xvb2t1cCBBUElzCiAgICAnSU1ldGFkYXRhUHJvdmlkZXInLCAnSVJlc291cmNlUHJvdmlkZXInLCAnRmlsZU1ldGFkYXRhJywKICAgICdQYXRoTWV0YWRhdGEnLCAnRWdnTWV0YWRhdGEnLCAnRW1wdHlQcm92aWRlcicsICdlbXB0eV9wcm92aWRlcicsCiAgICAnTnVsbFByb3ZpZGVyJywgJ0VnZ1Byb3ZpZGVyJywgJ0RlZmF1bHRQcm92aWRlcicsICdaaXBQcm92aWRlcicsCiAgICAncmVnaXN0ZXJfZmluZGVyJywgJ3JlZ2lzdGVyX25hbWVzcGFjZV9oYW5kbGVyJywgJ3JlZ2lzdGVyX2xvYWRlcl90eXBlJywKICAgICdmaXh1cF9uYW1lc3BhY2VfcGFja2FnZXMnLCAnZ2V0X2ltcG9ydGVyJywKCiAgICAjIERlcHJlY2F0ZWQvYmFja3dhcmQgY29tcGF0aWJpbGl0eSBvbmx5CiAgICAncnVuX21haW4nLCAnQXZhaWxhYmxlRGlzdHJpYnV0aW9ucycsCl0KCgpjbGFzcyBSZXNvbHV0aW9uRXJyb3IoRXhjZXB0aW9uKToKICAgICIiIkFic3RyYWN0IGJhc2UgZm9yIGRlcGVuZGVuY3kgcmVzb2x1dGlvbiBlcnJvcnMiIiIKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fICsgcmVwcihzZWxmLmFyZ3MpCgoKY2xhc3MgVmVyc2lvbkNvbmZsaWN0KFJlc29sdXRpb25FcnJvcik6CiAgICAiIiIKICAgIEFuIGFscmVhZHktaW5zdGFsbGVkIHZlcnNpb24gY29uZmxpY3RzIHdpdGggdGhlIHJlcXVlc3RlZCB2ZXJzaW9uLgoKICAgIFNob3VsZCBiZSBpbml0aWFsaXplZCB3aXRoIHRoZSBpbnN0YWxsZWQgRGlzdHJpYnV0aW9uIGFuZCB0aGUgcmVxdWVzdGVkCiAgICBSZXF1aXJlbWVudC4KICAgICIiIgoKICAgIF90ZW1wbGF0ZSA9ICJ7c2VsZi5kaXN0fSBpcyBpbnN0YWxsZWQgYnV0IHtzZWxmLnJlcX0gaXMgcmVxdWlyZWQiCgogICAgQHByb3BlcnR5CiAgICBkZWYgZGlzdChzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5hcmdzWzBdCgogICAgQHByb3BlcnR5CiAgICBkZWYgcmVxKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmFyZ3NbMV0KCiAgICBkZWYgcmVwb3J0KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl90ZW1wbGF0ZS5mb3JtYXQoKipsb2NhbHMoKSkKCiAgICBkZWYgd2l0aF9jb250ZXh0KHNlbGYsIHJlcXVpcmVkX2J5KToKICAgICAgICAiIiIKICAgICAgICBJZiByZXF1aXJlZF9ieSBpcyBub24tZW1wdHksIHJldHVybiBhIHZlcnNpb24gb2Ygc2VsZiB0aGF0IGlzIGEKICAgICAgICBDb250ZXh0dWFsVmVyc2lvbkNvbmZsaWN0LgogICAgICAgICIiIgogICAgICAgIGlmIG5vdCByZXF1aXJlZF9ieToKICAgICAgICAgICAgcmV0dXJuIHNlbGYKICAgICAgICBhcmdzID0gc2VsZi5hcmdzICsgKHJlcXVpcmVkX2J5LCkKICAgICAgICByZXR1cm4gQ29udGV4dHVhbFZlcnNpb25Db25mbGljdCgqYXJncykKCgpjbGFzcyBDb250ZXh0dWFsVmVyc2lvbkNvbmZsaWN0KFZlcnNpb25Db25mbGljdCk6CiAgICAiIiIKICAgIEEgVmVyc2lvbkNvbmZsaWN0IHRoYXQgYWNjZXB0cyBhIHRoaXJkIHBhcmFtZXRlciwgdGhlIHNldCBvZiB0aGUKICAgIHJlcXVpcmVtZW50cyB0aGF0IHJlcXVpcmVkIHRoZSBpbnN0YWxsZWQgRGlzdHJpYnV0aW9uLgogICAgIiIiCgogICAgX3RlbXBsYXRlID0gVmVyc2lvbkNvbmZsaWN0Ll90ZW1wbGF0ZSArICcgYnkge3NlbGYucmVxdWlyZWRfYnl9JwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHJlcXVpcmVkX2J5KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmFyZ3NbMl0KCgpjbGFzcyBEaXN0cmlidXRpb25Ob3RGb3VuZChSZXNvbHV0aW9uRXJyb3IpOgogICAgIiIiQSByZXF1ZXN0ZWQgZGlzdHJpYnV0aW9uIHdhcyBub3QgZm91bmQiIiIKCiAgICBfdGVtcGxhdGUgPSAoIlRoZSAne3NlbGYucmVxfScgZGlzdHJpYnV0aW9uIHdhcyBub3QgZm91bmQgIgogICAgICAgICAgICAgICAgICJhbmQgaXMgcmVxdWlyZWQgYnkge3NlbGYucmVxdWlyZXJzX3N0cn0iKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHJlcShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5hcmdzWzBdCgogICAgQHByb3BlcnR5CiAgICBkZWYgcmVxdWlyZXJzKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmFyZ3NbMV0KCiAgICBAcHJvcGVydHkKICAgIGRlZiByZXF1aXJlcnNfc3RyKHNlbGYpOgogICAgICAgIGlmIG5vdCBzZWxmLnJlcXVpcmVyczoKICAgICAgICAgICAgcmV0dXJuICd0aGUgYXBwbGljYXRpb24nCiAgICAgICAgcmV0dXJuICcsICcuam9pbihzZWxmLnJlcXVpcmVycykKCiAgICBkZWYgcmVwb3J0KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl90ZW1wbGF0ZS5mb3JtYXQoKipsb2NhbHMoKSkKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5yZXBvcnQoKQoKCmNsYXNzIFVua25vd25FeHRyYShSZXNvbHV0aW9uRXJyb3IpOgogICAgIiIiRGlzdHJpYnV0aW9uIGRvZXNuJ3QgaGF2ZSBhbiAiZXh0cmEgZmVhdHVyZSIgb2YgdGhlIGdpdmVuIG5hbWUiIiIKCgpfcHJvdmlkZXJfZmFjdG9yaWVzID0ge30KClBZX01BSk9SID0gc3lzLnZlcnNpb25bOjNdCkVHR19ESVNUID0gMwpCSU5BUllfRElTVCA9IDIKU09VUkNFX0RJU1QgPSAxCkNIRUNLT1VUX0RJU1QgPSAwCkRFVkVMT1BfRElTVCA9IC0xCgoKZGVmIHJlZ2lzdGVyX2xvYWRlcl90eXBlKGxvYWRlcl90eXBlLCBwcm92aWRlcl9mYWN0b3J5KToKICAgICIiIlJlZ2lzdGVyIGBwcm92aWRlcl9mYWN0b3J5YCB0byBtYWtlIHByb3ZpZGVycyBmb3IgYGxvYWRlcl90eXBlYAoKICAgIGBsb2FkZXJfdHlwZWAgaXMgdGhlIHR5cGUgb3IgY2xhc3Mgb2YgYSBQRVAgMzAyIGBgbW9kdWxlLl9fbG9hZGVyX19gYCwKICAgIGFuZCBgcHJvdmlkZXJfZmFjdG9yeWAgaXMgYSBmdW5jdGlvbiB0aGF0LCBwYXNzZWQgYSAqbW9kdWxlKiBvYmplY3QsCiAgICByZXR1cm5zIGFuIGBgSVJlc291cmNlUHJvdmlkZXJgYCBmb3IgdGhhdCBtb2R1bGUuCiAgICAiIiIKICAgIF9wcm92aWRlcl9mYWN0b3JpZXNbbG9hZGVyX3R5cGVdID0gcHJvdmlkZXJfZmFjdG9yeQoKCmRlZiBnZXRfcHJvdmlkZXIobW9kdWxlT3JSZXEpOgogICAgIiIiUmV0dXJuIGFuIElSZXNvdXJjZVByb3ZpZGVyIGZvciB0aGUgbmFtZWQgbW9kdWxlIG9yIHJlcXVpcmVtZW50IiIiCiAgICBpZiBpc2luc3RhbmNlKG1vZHVsZU9yUmVxLCBSZXF1aXJlbWVudCk6CiAgICAgICAgcmV0dXJuIHdvcmtpbmdfc2V0LmZpbmQobW9kdWxlT3JSZXEpIG9yIHJlcXVpcmUoc3RyKG1vZHVsZU9yUmVxKSlbMF0KICAgIHRyeToKICAgICAgICBtb2R1bGUgPSBzeXMubW9kdWxlc1ttb2R1bGVPclJlcV0KICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICBfX2ltcG9ydF9fKG1vZHVsZU9yUmVxKQogICAgICAgIG1vZHVsZSA9IHN5cy5tb2R1bGVzW21vZHVsZU9yUmVxXQogICAgbG9hZGVyID0gZ2V0YXR0cihtb2R1bGUsICdfX2xvYWRlcl9fJywgTm9uZSkKICAgIHJldHVybiBfZmluZF9hZGFwdGVyKF9wcm92aWRlcl9mYWN0b3JpZXMsIGxvYWRlcikobW9kdWxlKQoKCmRlZiBfbWFjb3N4X3ZlcnMoX2NhY2hlPVtdKToKICAgIGlmIG5vdCBfY2FjaGU6CiAgICAgICAgdmVyc2lvbiA9IHBsYXRmb3JtLm1hY192ZXIoKVswXQogICAgICAgICMgZmFsbGJhY2sgZm9yIE1hY1BvcnRzCiAgICAgICAgaWYgdmVyc2lvbiA9PSAnJzoKICAgICAgICAgICAgcGxpc3QgPSAnL1N5c3RlbS9MaWJyYXJ5L0NvcmVTZXJ2aWNlcy9TeXN0ZW1WZXJzaW9uLnBsaXN0JwogICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhwbGlzdCk6CiAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKHBsaXN0bGliLCAncmVhZFBsaXN0Jyk6CiAgICAgICAgICAgICAgICAgICAgcGxpc3RfY29udGVudCA9IHBsaXN0bGliLnJlYWRQbGlzdChwbGlzdCkKICAgICAgICAgICAgICAgICAgICBpZiAnUHJvZHVjdFZlcnNpb24nIGluIHBsaXN0X2NvbnRlbnQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gPSBwbGlzdF9jb250ZW50WydQcm9kdWN0VmVyc2lvbiddCgogICAgICAgIF9jYWNoZS5hcHBlbmQodmVyc2lvbi5zcGxpdCgnLicpKQogICAgcmV0dXJuIF9jYWNoZVswXQoKCmRlZiBfbWFjb3N4X2FyY2gobWFjaGluZSk6CiAgICByZXR1cm4geydQb3dlclBDJzogJ3BwYycsICdQb3dlcl9NYWNpbnRvc2gnOiAncHBjJ30uZ2V0KG1hY2hpbmUsIG1hY2hpbmUpCgoKZGVmIGdldF9idWlsZF9wbGF0Zm9ybSgpOgogICAgIiIiUmV0dXJuIHRoaXMgcGxhdGZvcm0ncyBzdHJpbmcgZm9yIHBsYXRmb3JtLXNwZWNpZmljIGRpc3RyaWJ1dGlvbnMKCiAgICBYWFggQ3VycmVudGx5IHRoaXMgaXMgdGhlIHNhbWUgYXMgYGBkaXN0dXRpbHMudXRpbC5nZXRfcGxhdGZvcm0oKWBgLCBidXQgaXQKICAgIG5lZWRzIHNvbWUgaGFja3MgZm9yIExpbnV4IGFuZCBNYWMgT1MgWC4KICAgICIiIgogICAgdHJ5OgogICAgICAgICMgUHl0aG9uIDIuNyBvciA+PTMuMgogICAgICAgIGZyb20gc3lzY29uZmlnIGltcG9ydCBnZXRfcGxhdGZvcm0KICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICBmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBnZXRfcGxhdGZvcm0KCiAgICBwbGF0ID0gZ2V0X3BsYXRmb3JtKCkKICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIiBhbmQgbm90IHBsYXQuc3RhcnRzd2l0aCgnbWFjb3N4LScpOgogICAgICAgIHRyeToKICAgICAgICAgICAgdmVyc2lvbiA9IF9tYWNvc3hfdmVycygpCiAgICAgICAgICAgIG1hY2hpbmUgPSBvcy51bmFtZSgpWzRdLnJlcGxhY2UoIiAiLCAiXyIpCiAgICAgICAgICAgIHJldHVybiAibWFjb3N4LSVkLiVkLSVzIiAlICgKICAgICAgICAgICAgICAgIGludCh2ZXJzaW9uWzBdKSwgaW50KHZlcnNpb25bMV0pLAogICAgICAgICAgICAgICAgX21hY29zeF9hcmNoKG1hY2hpbmUpLAogICAgICAgICAgICApCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICMgaWYgc29tZW9uZSBpcyBydW5uaW5nIGEgbm9uLU1hYyBkYXJ3aW4gc3lzdGVtLCB0aGlzIHdpbGwgZmFsbAogICAgICAgICAgICAjIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KICAgICAgICAgICAgcGFzcwogICAgcmV0dXJuIHBsYXQKCgptYWNvc1ZlcnNpb25TdHJpbmcgPSByZS5jb21waWxlKHIibWFjb3N4LShcZCspXC4oXGQrKS0oLiopIikKZGFyd2luVmVyc2lvblN0cmluZyA9IHJlLmNvbXBpbGUociJkYXJ3aW4tKFxkKylcLihcZCspXC4oXGQrKS0oLiopIikKIyBYWFggYmFja3dhcmQgY29tcGF0CmdldF9wbGF0Zm9ybSA9IGdldF9idWlsZF9wbGF0Zm9ybQoKCmRlZiBjb21wYXRpYmxlX3BsYXRmb3Jtcyhwcm92aWRlZCwgcmVxdWlyZWQpOgogICAgIiIiQ2FuIGNvZGUgZm9yIHRoZSBgcHJvdmlkZWRgIHBsYXRmb3JtIHJ1biBvbiB0aGUgYHJlcXVpcmVkYCBwbGF0Zm9ybT8KCiAgICBSZXR1cm5zIHRydWUgaWYgZWl0aGVyIHBsYXRmb3JtIGlzIGBgTm9uZWBgLCBvciB0aGUgcGxhdGZvcm1zIGFyZSBlcXVhbC4KCiAgICBYWFggTmVlZHMgY29tcGF0aWJpbGl0eSBjaGVja3MgZm9yIExpbnV4IGFuZCBvdGhlciB1bml4eSBPU2VzLgogICAgIiIiCiAgICBpZiBwcm92aWRlZCBpcyBOb25lIG9yIHJlcXVpcmVkIGlzIE5vbmUgb3IgcHJvdmlkZWQgPT0gcmVxdWlyZWQ6CiAgICAgICAgIyBlYXN5IGNhc2UKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICMgTWFjIE9TIFggc3BlY2lhbCBjYXNlcwogICAgcmVxTWFjID0gbWFjb3NWZXJzaW9uU3RyaW5nLm1hdGNoKHJlcXVpcmVkKQogICAgaWYgcmVxTWFjOgogICAgICAgIHByb3ZNYWMgPSBtYWNvc1ZlcnNpb25TdHJpbmcubWF0Y2gocHJvdmlkZWQpCgogICAgICAgICMgaXMgdGhpcyBhIE1hYyBwYWNrYWdlPwogICAgICAgIGlmIG5vdCBwcm92TWFjOgogICAgICAgICAgICAjIHRoaXMgaXMgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIHBhY2thZ2VzIGJ1aWx0IGJlZm9yZQogICAgICAgICAgICAjIHNldHVwdG9vbHMgMC42LiBBbGwgcGFja2FnZXMgYnVpbHQgYWZ0ZXIgdGhpcyBwb2ludCB3aWxsCiAgICAgICAgICAgICMgdXNlIHRoZSBuZXcgbWFjb3N4IGRlc2lnbmF0aW9uLgogICAgICAgICAgICBwcm92RGFyd2luID0gZGFyd2luVmVyc2lvblN0cmluZy5tYXRjaChwcm92aWRlZCkKICAgICAgICAgICAgaWYgcHJvdkRhcndpbjoKICAgICAgICAgICAgICAgIGR2ZXJzaW9uID0gaW50KHByb3ZEYXJ3aW4uZ3JvdXAoMSkpCiAgICAgICAgICAgICAgICBtYWNvc3ZlcnNpb24gPSAiJXMuJXMiICUgKHJlcU1hYy5ncm91cCgxKSwgcmVxTWFjLmdyb3VwKDIpKQogICAgICAgICAgICAgICAgaWYgZHZlcnNpb24gPT0gNyBhbmQgbWFjb3N2ZXJzaW9uID49ICIxMC4zIiBvciBcCiAgICAgICAgICAgICAgICAgICAgICAgIGR2ZXJzaW9uID09IDggYW5kIG1hY29zdmVyc2lvbiA+PSAiMTAuNCI6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICAgICAgIyBlZ2cgaXNuJ3QgbWFjb3N4IG9yIGxlZ2FjeSBkYXJ3aW4KICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgYXJlIHRoZXkgdGhlIHNhbWUgbWFqb3IgdmVyc2lvbiBhbmQgbWFjaGluZSB0eXBlPwogICAgICAgIGlmIHByb3ZNYWMuZ3JvdXAoMSkgIT0gcmVxTWFjLmdyb3VwKDEpIG9yIFwKICAgICAgICAgICAgICAgIHByb3ZNYWMuZ3JvdXAoMykgIT0gcmVxTWFjLmdyb3VwKDMpOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBpcyB0aGUgcmVxdWlyZWQgT1MgbWFqb3IgdXBkYXRlID49IHRoZSBwcm92aWRlZCBvbmU/CiAgICAgICAgaWYgaW50KHByb3ZNYWMuZ3JvdXAoMikpID4gaW50KHJlcU1hYy5ncm91cCgyKSk6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICMgWFhYIExpbnV4IGFuZCBvdGhlciBwbGF0Zm9ybXMnIHNwZWNpYWwgY2FzZXMgc2hvdWxkIGdvIGhlcmUKICAgIHJldHVybiBGYWxzZQoKCmRlZiBydW5fc2NyaXB0KGRpc3Rfc3BlYywgc2NyaXB0X25hbWUpOgogICAgIiIiTG9jYXRlIGRpc3RyaWJ1dGlvbiBgZGlzdF9zcGVjYCBhbmQgcnVuIGl0cyBgc2NyaXB0X25hbWVgIHNjcmlwdCIiIgogICAgbnMgPSBzeXMuX2dldGZyYW1lKDEpLmZfZ2xvYmFscwogICAgbmFtZSA9IG5zWydfX25hbWVfXyddCiAgICBucy5jbGVhcigpCiAgICBuc1snX19uYW1lX18nXSA9IG5hbWUKICAgIHJlcXVpcmUoZGlzdF9zcGVjKVswXS5ydW5fc2NyaXB0KHNjcmlwdF9uYW1lLCBucykKCgojIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKcnVuX21haW4gPSBydW5fc2NyaXB0CgoKZGVmIGdldF9kaXN0cmlidXRpb24oZGlzdCk6CiAgICAiIiJSZXR1cm4gYSBjdXJyZW50IGRpc3RyaWJ1dGlvbiBvYmplY3QgZm9yIGEgUmVxdWlyZW1lbnQgb3Igc3RyaW5nIiIiCiAgICBpZiBpc2luc3RhbmNlKGRpc3QsIHNpeC5zdHJpbmdfdHlwZXMpOgogICAgICAgIGRpc3QgPSBSZXF1aXJlbWVudC5wYXJzZShkaXN0KQogICAgaWYgaXNpbnN0YW5jZShkaXN0LCBSZXF1aXJlbWVudCk6CiAgICAgICAgZGlzdCA9IGdldF9wcm92aWRlcihkaXN0KQogICAgaWYgbm90IGlzaW5zdGFuY2UoZGlzdCwgRGlzdHJpYnV0aW9uKToKICAgICAgICByYWlzZSBUeXBlRXJyb3IoIkV4cGVjdGVkIHN0cmluZywgUmVxdWlyZW1lbnQsIG9yIERpc3RyaWJ1dGlvbiIsIGRpc3QpCiAgICByZXR1cm4gZGlzdAoKCmRlZiBsb2FkX2VudHJ5X3BvaW50KGRpc3QsIGdyb3VwLCBuYW1lKToKICAgICIiIlJldHVybiBgbmFtZWAgZW50cnkgcG9pbnQgb2YgYGdyb3VwYCBmb3IgYGRpc3RgIG9yIHJhaXNlIEltcG9ydEVycm9yIiIiCiAgICByZXR1cm4gZ2V0X2Rpc3RyaWJ1dGlvbihkaXN0KS5sb2FkX2VudHJ5X3BvaW50KGdyb3VwLCBuYW1lKQoKCmRlZiBnZXRfZW50cnlfbWFwKGRpc3QsIGdyb3VwPU5vbmUpOgogICAgIiIiUmV0dXJuIHRoZSBlbnRyeSBwb2ludCBtYXAgZm9yIGBncm91cGAsIG9yIHRoZSBmdWxsIGVudHJ5IG1hcCIiIgogICAgcmV0dXJuIGdldF9kaXN0cmlidXRpb24oZGlzdCkuZ2V0X2VudHJ5X21hcChncm91cCkKCgpkZWYgZ2V0X2VudHJ5X2luZm8oZGlzdCwgZ3JvdXAsIG5hbWUpOgogICAgIiIiUmV0dXJuIHRoZSBFbnRyeVBvaW50IG9iamVjdCBmb3IgYGdyb3VwYCtgbmFtZWAsIG9yIGBgTm9uZWBgIiIiCiAgICByZXR1cm4gZ2V0X2Rpc3RyaWJ1dGlvbihkaXN0KS5nZXRfZW50cnlfaW5mbyhncm91cCwgbmFtZSkKCgpjbGFzcyBJTWV0YWRhdGFQcm92aWRlcjoKICAgIGRlZiBoYXNfbWV0YWRhdGEobmFtZSk6CiAgICAgICAgIiIiRG9lcyB0aGUgcGFja2FnZSdzIGRpc3RyaWJ1dGlvbiBjb250YWluIHRoZSBuYW1lZCBtZXRhZGF0YT8iIiIKCiAgICBkZWYgZ2V0X21ldGFkYXRhKG5hbWUpOgogICAgICAgICIiIlRoZSBuYW1lZCBtZXRhZGF0YSByZXNvdXJjZSBhcyBhIHN0cmluZyIiIgoKICAgIGRlZiBnZXRfbWV0YWRhdGFfbGluZXMobmFtZSk6CiAgICAgICAgIiIiWWllbGQgbmFtZWQgbWV0YWRhdGEgcmVzb3VyY2UgYXMgbGlzdCBvZiBub24tYmxhbmsgbm9uLWNvbW1lbnQgbGluZXMKCiAgICAgICBMZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIGlzIHN0cmlwcGVkIGZyb20gZWFjaCBsaW5lLCBhbmQgbGluZXMKICAgICAgIHdpdGggYGAjYGAgYXMgdGhlIGZpcnN0IG5vbi1ibGFuayBjaGFyYWN0ZXIgYXJlIG9taXR0ZWQuIiIiCgogICAgZGVmIG1ldGFkYXRhX2lzZGlyKG5hbWUpOgogICAgICAgICIiIklzIHRoZSBuYW1lZCBtZXRhZGF0YSBhIGRpcmVjdG9yeT8gIChsaWtlIGBgb3MucGF0aC5pc2RpcigpYGApIiIiCgogICAgZGVmIG1ldGFkYXRhX2xpc3RkaXIobmFtZSk6CiAgICAgICAgIiIiTGlzdCBvZiBtZXRhZGF0YSBuYW1lcyBpbiB0aGUgZGlyZWN0b3J5IChsaWtlIGBgb3MubGlzdGRpcigpYGApIiIiCgogICAgZGVmIHJ1bl9zY3JpcHQoc2NyaXB0X25hbWUsIG5hbWVzcGFjZSk6CiAgICAgICAgIiIiRXhlY3V0ZSB0aGUgbmFtZWQgc2NyaXB0IGluIHRoZSBzdXBwbGllZCBuYW1lc3BhY2UgZGljdGlvbmFyeSIiIgoKCmNsYXNzIElSZXNvdXJjZVByb3ZpZGVyKElNZXRhZGF0YVByb3ZpZGVyKToKICAgICIiIkFuIG9iamVjdCB0aGF0IHByb3ZpZGVzIGFjY2VzcyB0byBwYWNrYWdlIHJlc291cmNlcyIiIgoKICAgIGRlZiBnZXRfcmVzb3VyY2VfZmlsZW5hbWUobWFuYWdlciwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIGEgdHJ1ZSBmaWxlc3lzdGVtIHBhdGggZm9yIGByZXNvdXJjZV9uYW1lYAoKICAgICAgICBgbWFuYWdlcmAgbXVzdCBiZSBhbiBgYElSZXNvdXJjZU1hbmFnZXJgYCIiIgoKICAgIGRlZiBnZXRfcmVzb3VyY2Vfc3RyZWFtKG1hbmFnZXIsIHJlc291cmNlX25hbWUpOgogICAgICAgICIiIlJldHVybiBhIHJlYWRhYmxlIGZpbGUtbGlrZSBvYmplY3QgZm9yIGByZXNvdXJjZV9uYW1lYAoKICAgICAgICBgbWFuYWdlcmAgbXVzdCBiZSBhbiBgYElSZXNvdXJjZU1hbmFnZXJgYCIiIgoKICAgIGRlZiBnZXRfcmVzb3VyY2Vfc3RyaW5nKG1hbmFnZXIsIHJlc291cmNlX25hbWUpOgogICAgICAgICIiIlJldHVybiBhIHN0cmluZyBjb250YWluaW5nIHRoZSBjb250ZW50cyBvZiBgcmVzb3VyY2VfbmFtZWAKCiAgICAgICAgYG1hbmFnZXJgIG11c3QgYmUgYW4gYGBJUmVzb3VyY2VNYW5hZ2VyYGAiIiIKCiAgICBkZWYgaGFzX3Jlc291cmNlKHJlc291cmNlX25hbWUpOgogICAgICAgICIiIkRvZXMgdGhlIHBhY2thZ2UgY29udGFpbiB0aGUgbmFtZWQgcmVzb3VyY2U/IiIiCgogICAgZGVmIHJlc291cmNlX2lzZGlyKHJlc291cmNlX25hbWUpOgogICAgICAgICIiIklzIHRoZSBuYW1lZCByZXNvdXJjZSBhIGRpcmVjdG9yeT8gIChsaWtlIGBgb3MucGF0aC5pc2RpcigpYGApIiIiCgogICAgZGVmIHJlc291cmNlX2xpc3RkaXIocmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiTGlzdCBvZiByZXNvdXJjZSBuYW1lcyBpbiB0aGUgZGlyZWN0b3J5IChsaWtlIGBgb3MubGlzdGRpcigpYGApIiIiCgoKY2xhc3MgV29ya2luZ1NldChvYmplY3QpOgogICAgIiIiQSBjb2xsZWN0aW9uIG9mIGFjdGl2ZSBkaXN0cmlidXRpb25zIG9uIHN5cy5wYXRoIChvciBhIHNpbWlsYXIgbGlzdCkiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgZW50cmllcz1Ob25lKToKICAgICAgICAiIiJDcmVhdGUgd29ya2luZyBzZXQgZnJvbSBsaXN0IG9mIHBhdGggZW50cmllcyAoZGVmYXVsdD1zeXMucGF0aCkiIiIKICAgICAgICBzZWxmLmVudHJpZXMgPSBbXQogICAgICAgIHNlbGYuZW50cnlfa2V5cyA9IHt9CiAgICAgICAgc2VsZi5ieV9rZXkgPSB7fQogICAgICAgIHNlbGYuY2FsbGJhY2tzID0gW10KCiAgICAgICAgaWYgZW50cmllcyBpcyBOb25lOgogICAgICAgICAgICBlbnRyaWVzID0gc3lzLnBhdGgKCiAgICAgICAgZm9yIGVudHJ5IGluIGVudHJpZXM6CiAgICAgICAgICAgIHNlbGYuYWRkX2VudHJ5KGVudHJ5KQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9idWlsZF9tYXN0ZXIoY2xzKToKICAgICAgICAiIiIKICAgICAgICBQcmVwYXJlIHRoZSBtYXN0ZXIgd29ya2luZyBzZXQuCiAgICAgICAgIiIiCiAgICAgICAgd3MgPSBjbHMoKQogICAgICAgIHRyeToKICAgICAgICAgICAgZnJvbSBfX21haW5fXyBpbXBvcnQgX19yZXF1aXJlc19fCiAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgICAgICAjIFRoZSBtYWluIHByb2dyYW0gZG9lcyBub3QgbGlzdCBhbnkgcmVxdWlyZW1lbnRzCiAgICAgICAgICAgIHJldHVybiB3cwoKICAgICAgICAjIGVuc3VyZSB0aGUgcmVxdWlyZW1lbnRzIGFyZSBtZXQKICAgICAgICB0cnk6CiAgICAgICAgICAgIHdzLnJlcXVpcmUoX19yZXF1aXJlc19fKQogICAgICAgIGV4Y2VwdCBWZXJzaW9uQ29uZmxpY3Q6CiAgICAgICAgICAgIHJldHVybiBjbHMuX2J1aWxkX2Zyb21fcmVxdWlyZW1lbnRzKF9fcmVxdWlyZXNfXykKCiAgICAgICAgcmV0dXJuIHdzCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX2J1aWxkX2Zyb21fcmVxdWlyZW1lbnRzKGNscywgcmVxX3NwZWMpOgogICAgICAgICIiIgogICAgICAgIEJ1aWxkIGEgd29ya2luZyBzZXQgZnJvbSBhIHJlcXVpcmVtZW50IHNwZWMuIFJld3JpdGVzIHN5cy5wYXRoLgogICAgICAgICIiIgogICAgICAgICMgdHJ5IGl0IHdpdGhvdXQgZGVmYXVsdHMgYWxyZWFkeSBvbiBzeXMucGF0aAogICAgICAgICMgYnkgc3RhcnRpbmcgd2l0aCBhbiBlbXB0eSBwYXRoCiAgICAgICAgd3MgPSBjbHMoW10pCiAgICAgICAgcmVxcyA9IHBhcnNlX3JlcXVpcmVtZW50cyhyZXFfc3BlYykKICAgICAgICBkaXN0cyA9IHdzLnJlc29sdmUocmVxcywgRW52aXJvbm1lbnQoKSkKICAgICAgICBmb3IgZGlzdCBpbiBkaXN0czoKICAgICAgICAgICAgd3MuYWRkKGRpc3QpCgogICAgICAgICMgYWRkIGFueSBtaXNzaW5nIGVudHJpZXMgZnJvbSBzeXMucGF0aAogICAgICAgIGZvciBlbnRyeSBpbiBzeXMucGF0aDoKICAgICAgICAgICAgaWYgZW50cnkgbm90IGluIHdzLmVudHJpZXM6CiAgICAgICAgICAgICAgICB3cy5hZGRfZW50cnkoZW50cnkpCgogICAgICAgICMgdGhlbiBjb3B5IGJhY2sgdG8gc3lzLnBhdGgKICAgICAgICBzeXMucGF0aFs6XSA9IHdzLmVudHJpZXMKICAgICAgICByZXR1cm4gd3MKCiAgICBkZWYgYWRkX2VudHJ5KHNlbGYsIGVudHJ5KToKICAgICAgICAiIiJBZGQgYSBwYXRoIGl0ZW0gdG8gYGAuZW50cmllc2BgLCBmaW5kaW5nIGFueSBkaXN0cmlidXRpb25zIG9uIGl0CgogICAgICAgIGBgZmluZF9kaXN0cmlidXRpb25zKGVudHJ5LCBUcnVlKWBgIGlzIHVzZWQgdG8gZmluZCBkaXN0cmlidXRpb25zCiAgICAgICAgY29ycmVzcG9uZGluZyB0byB0aGUgcGF0aCBlbnRyeSwgYW5kIHRoZXkgYXJlIGFkZGVkLiAgYGVudHJ5YCBpcwogICAgICAgIGFsd2F5cyBhcHBlbmRlZCB0byBgYC5lbnRyaWVzYGAsIGV2ZW4gaWYgaXQgaXMgYWxyZWFkeSBwcmVzZW50LgogICAgICAgIChUaGlzIGlzIGJlY2F1c2UgYGBzeXMucGF0aGBgIGNhbiBjb250YWluIHRoZSBzYW1lIHZhbHVlIG1vcmUgdGhhbgogICAgICAgIG9uY2UsIGFuZCB0aGUgYGAuZW50cmllc2BgIG9mIHRoZSBgYHN5cy5wYXRoYGAgV29ya2luZ1NldCBzaG91bGQgYWx3YXlzCiAgICAgICAgZXF1YWwgYGBzeXMucGF0aGBgLikKICAgICAgICAiIiIKICAgICAgICBzZWxmLmVudHJ5X2tleXMuc2V0ZGVmYXVsdChlbnRyeSwgW10pCiAgICAgICAgc2VsZi5lbnRyaWVzLmFwcGVuZChlbnRyeSkKICAgICAgICBmb3IgZGlzdCBpbiBmaW5kX2Rpc3RyaWJ1dGlvbnMoZW50cnksIFRydWUpOgogICAgICAgICAgICBzZWxmLmFkZChkaXN0LCBlbnRyeSwgRmFsc2UpCgogICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBkaXN0KToKICAgICAgICAiIiJUcnVlIGlmIGBkaXN0YCBpcyB0aGUgYWN0aXZlIGRpc3RyaWJ1dGlvbiBmb3IgaXRzIHByb2plY3QiIiIKICAgICAgICByZXR1cm4gc2VsZi5ieV9rZXkuZ2V0KGRpc3Qua2V5KSA9PSBkaXN0CgogICAgZGVmIGZpbmQoc2VsZiwgcmVxKToKICAgICAgICAiIiJGaW5kIGEgZGlzdHJpYnV0aW9uIG1hdGNoaW5nIHJlcXVpcmVtZW50IGByZXFgCgogICAgICAgIElmIHRoZXJlIGlzIGFuIGFjdGl2ZSBkaXN0cmlidXRpb24gZm9yIHRoZSByZXF1ZXN0ZWQgcHJvamVjdCwgdGhpcwogICAgICAgIHJldHVybnMgaXQgYXMgbG9uZyBhcyBpdCBtZWV0cyB0aGUgdmVyc2lvbiByZXF1aXJlbWVudCBzcGVjaWZpZWQgYnkKICAgICAgICBgcmVxYC4gIEJ1dCwgaWYgdGhlcmUgaXMgYW4gYWN0aXZlIGRpc3RyaWJ1dGlvbiBmb3IgdGhlIHByb2plY3QgYW5kIGl0CiAgICAgICAgZG9lcyAqbm90KiBtZWV0IHRoZSBgcmVxYCByZXF1aXJlbWVudCwgYGBWZXJzaW9uQ29uZmxpY3RgYCBpcyByYWlzZWQuCiAgICAgICAgSWYgdGhlcmUgaXMgbm8gYWN0aXZlIGRpc3RyaWJ1dGlvbiBmb3IgdGhlIHJlcXVlc3RlZCBwcm9qZWN0LCBgYE5vbmVgYAogICAgICAgIGlzIHJldHVybmVkLgogICAgICAgICIiIgogICAgICAgIGRpc3QgPSBzZWxmLmJ5X2tleS5nZXQocmVxLmtleSkKICAgICAgICBpZiBkaXN0IGlzIG5vdCBOb25lIGFuZCBkaXN0IG5vdCBpbiByZXE6CiAgICAgICAgICAgICMgWFhYIGFkZCBtb3JlIGluZm8KICAgICAgICAgICAgcmFpc2UgVmVyc2lvbkNvbmZsaWN0KGRpc3QsIHJlcSkKICAgICAgICByZXR1cm4gZGlzdAoKICAgIGRlZiBpdGVyX2VudHJ5X3BvaW50cyhzZWxmLCBncm91cCwgbmFtZT1Ob25lKToKICAgICAgICAiIiJZaWVsZCBlbnRyeSBwb2ludCBvYmplY3RzIGZyb20gYGdyb3VwYCBtYXRjaGluZyBgbmFtZWAKCiAgICAgICAgSWYgYG5hbWVgIGlzIE5vbmUsIHlpZWxkcyBhbGwgZW50cnkgcG9pbnRzIGluIGBncm91cGAgZnJvbSBhbGwKICAgICAgICBkaXN0cmlidXRpb25zIGluIHRoZSB3b3JraW5nIHNldCwgb3RoZXJ3aXNlIG9ubHkgb25lcyBtYXRjaGluZwogICAgICAgIGJvdGggYGdyb3VwYCBhbmQgYG5hbWVgIGFyZSB5aWVsZGVkIChpbiBkaXN0cmlidXRpb24gb3JkZXIpLgogICAgICAgICIiIgogICAgICAgIGZvciBkaXN0IGluIHNlbGY6CiAgICAgICAgICAgIGVudHJpZXMgPSBkaXN0LmdldF9lbnRyeV9tYXAoZ3JvdXApCiAgICAgICAgICAgIGlmIG5hbWUgaXMgTm9uZToKICAgICAgICAgICAgICAgIGZvciBlcCBpbiBlbnRyaWVzLnZhbHVlcygpOgogICAgICAgICAgICAgICAgICAgIHlpZWxkIGVwCiAgICAgICAgICAgIGVsaWYgbmFtZSBpbiBlbnRyaWVzOgogICAgICAgICAgICAgICAgeWllbGQgZW50cmllc1tuYW1lXQoKICAgIGRlZiBydW5fc2NyaXB0KHNlbGYsIHJlcXVpcmVzLCBzY3JpcHRfbmFtZSk6CiAgICAgICAgIiIiTG9jYXRlIGRpc3RyaWJ1dGlvbiBmb3IgYHJlcXVpcmVzYCBhbmQgcnVuIGBzY3JpcHRfbmFtZWAgc2NyaXB0IiIiCiAgICAgICAgbnMgPSBzeXMuX2dldGZyYW1lKDEpLmZfZ2xvYmFscwogICAgICAgIG5hbWUgPSBuc1snX19uYW1lX18nXQogICAgICAgIG5zLmNsZWFyKCkKICAgICAgICBuc1snX19uYW1lX18nXSA9IG5hbWUKICAgICAgICBzZWxmLnJlcXVpcmUocmVxdWlyZXMpWzBdLnJ1bl9zY3JpcHQoc2NyaXB0X25hbWUsIG5zKQoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICAiIiJZaWVsZCBkaXN0cmlidXRpb25zIGZvciBub24tZHVwbGljYXRlIHByb2plY3RzIGluIHRoZSB3b3JraW5nIHNldAoKICAgICAgICBUaGUgeWllbGQgb3JkZXIgaXMgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBpdGVtcycgcGF0aCBlbnRyaWVzIHdlcmUKICAgICAgICBhZGRlZCB0byB0aGUgd29ya2luZyBzZXQuCiAgICAgICAgIiIiCiAgICAgICAgc2VlbiA9IHt9CiAgICAgICAgZm9yIGl0ZW0gaW4gc2VsZi5lbnRyaWVzOgogICAgICAgICAgICBpZiBpdGVtIG5vdCBpbiBzZWxmLmVudHJ5X2tleXM6CiAgICAgICAgICAgICAgICAjIHdvcmthcm91bmQgYSBjYWNoZSBpc3N1ZQogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIGZvciBrZXkgaW4gc2VsZi5lbnRyeV9rZXlzW2l0ZW1dOgogICAgICAgICAgICAgICAgaWYga2V5IG5vdCBpbiBzZWVuOgogICAgICAgICAgICAgICAgICAgIHNlZW5ba2V5XSA9IDEKICAgICAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLmJ5X2tleVtrZXldCgogICAgZGVmIGFkZChzZWxmLCBkaXN0LCBlbnRyeT1Ob25lLCBpbnNlcnQ9VHJ1ZSwgcmVwbGFjZT1GYWxzZSk6CiAgICAgICAgIiIiQWRkIGBkaXN0YCB0byB3b3JraW5nIHNldCwgYXNzb2NpYXRlZCB3aXRoIGBlbnRyeWAKCiAgICAgICAgSWYgYGVudHJ5YCBpcyB1bnNwZWNpZmllZCwgaXQgZGVmYXVsdHMgdG8gdGhlIGBgLmxvY2F0aW9uYGAgb2YgYGRpc3RgLgogICAgICAgIE9uIGV4aXQgZnJvbSB0aGlzIHJvdXRpbmUsIGBlbnRyeWAgaXMgYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGUgd29ya2luZwogICAgICAgIHNldCdzIGBgLmVudHJpZXNgYCAoaWYgaXQgd2Fzbid0IGFscmVhZHkgcHJlc2VudCkuCgogICAgICAgIGBkaXN0YCBpcyBvbmx5IGFkZGVkIHRvIHRoZSB3b3JraW5nIHNldCBpZiBpdCdzIGZvciBhIHByb2plY3QgdGhhdAogICAgICAgIGRvZXNuJ3QgYWxyZWFkeSBoYXZlIGEgZGlzdHJpYnV0aW9uIGluIHRoZSBzZXQsIHVubGVzcyBgcmVwbGFjZT1UcnVlYC4KICAgICAgICBJZiBpdCdzIGFkZGVkLCBhbnkgY2FsbGJhY2tzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgYGBzdWJzY3JpYmUoKWBgIG1ldGhvZAogICAgICAgIHdpbGwgYmUgY2FsbGVkLgogICAgICAgICIiIgogICAgICAgIGlmIGluc2VydDoKICAgICAgICAgICAgZGlzdC5pbnNlcnRfb24oc2VsZi5lbnRyaWVzLCBlbnRyeSwgcmVwbGFjZT1yZXBsYWNlKQoKICAgICAgICBpZiBlbnRyeSBpcyBOb25lOgogICAgICAgICAgICBlbnRyeSA9IGRpc3QubG9jYXRpb24KICAgICAgICBrZXlzID0gc2VsZi5lbnRyeV9rZXlzLnNldGRlZmF1bHQoZW50cnksIFtdKQogICAgICAgIGtleXMyID0gc2VsZi5lbnRyeV9rZXlzLnNldGRlZmF1bHQoZGlzdC5sb2NhdGlvbiwgW10pCiAgICAgICAgaWYgbm90IHJlcGxhY2UgYW5kIGRpc3Qua2V5IGluIHNlbGYuYnlfa2V5OgogICAgICAgICAgICAjIGlnbm9yZSBoaWRkZW4gZGlzdHJvcwogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgc2VsZi5ieV9rZXlbZGlzdC5rZXldID0gZGlzdAogICAgICAgIGlmIGRpc3Qua2V5IG5vdCBpbiBrZXlzOgogICAgICAgICAgICBrZXlzLmFwcGVuZChkaXN0LmtleSkKICAgICAgICBpZiBkaXN0LmtleSBub3QgaW4ga2V5czI6CiAgICAgICAgICAgIGtleXMyLmFwcGVuZChkaXN0LmtleSkKICAgICAgICBzZWxmLl9hZGRlZF9uZXcoZGlzdCkKCiAgICBkZWYgcmVzb2x2ZShzZWxmLCByZXF1aXJlbWVudHMsIGVudj1Ob25lLCBpbnN0YWxsZXI9Tm9uZSwKICAgICAgICAgICAgICAgIHJlcGxhY2VfY29uZmxpY3Rpbmc9RmFsc2UsIGV4dHJhcz1Ob25lKToKICAgICAgICAiIiJMaXN0IGFsbCBkaXN0cmlidXRpb25zIG5lZWRlZCB0byAocmVjdXJzaXZlbHkpIG1lZXQgYHJlcXVpcmVtZW50c2AKCiAgICAgICAgYHJlcXVpcmVtZW50c2AgbXVzdCBiZSBhIHNlcXVlbmNlIG9mIGBgUmVxdWlyZW1lbnRgYCBvYmplY3RzLiAgYGVudmAsCiAgICAgICAgaWYgc3VwcGxpZWQsIHNob3VsZCBiZSBhbiBgYEVudmlyb25tZW50YGAgaW5zdGFuY2UuICBJZgogICAgICAgIG5vdCBzdXBwbGllZCwgaXQgZGVmYXVsdHMgdG8gYWxsIGRpc3RyaWJ1dGlvbnMgYXZhaWxhYmxlIHdpdGhpbiBhbnkKICAgICAgICBlbnRyeSBvciBkaXN0cmlidXRpb24gaW4gdGhlIHdvcmtpbmcgc2V0LiAgYGluc3RhbGxlcmAsIGlmIHN1cHBsaWVkLAogICAgICAgIHdpbGwgYmUgaW52b2tlZCB3aXRoIGVhY2ggcmVxdWlyZW1lbnQgdGhhdCBjYW5ub3QgYmUgbWV0IGJ5IGFuCiAgICAgICAgYWxyZWFkeS1pbnN0YWxsZWQgZGlzdHJpYnV0aW9uOyBpdCBzaG91bGQgcmV0dXJuIGEgYGBEaXN0cmlidXRpb25gYCBvcgogICAgICAgIGBgTm9uZWBgLgoKICAgICAgICBVbmxlc3MgYHJlcGxhY2VfY29uZmxpY3Rpbmc9VHJ1ZWAsIHJhaXNlcyBhIFZlcnNpb25Db25mbGljdCBleGNlcHRpb24KICAgICAgICBpZgogICAgICAgIGFueSByZXF1aXJlbWVudHMgYXJlIGZvdW5kIG9uIHRoZSBwYXRoIHRoYXQgaGF2ZSB0aGUgY29ycmVjdCBuYW1lIGJ1dAogICAgICAgIHRoZSB3cm9uZyB2ZXJzaW9uLiAgT3RoZXJ3aXNlLCBpZiBhbiBgaW5zdGFsbGVyYCBpcyBzdXBwbGllZCBpdCB3aWxsIGJlCiAgICAgICAgaW52b2tlZCB0byBvYnRhaW4gdGhlIGNvcnJlY3QgdmVyc2lvbiBvZiB0aGUgcmVxdWlyZW1lbnQgYW5kIGFjdGl2YXRlCiAgICAgICAgaXQuCgogICAgICAgIGBleHRyYXNgIGlzIGEgbGlzdCBvZiB0aGUgZXh0cmFzIHRvIGJlIHVzZWQgd2l0aCB0aGVzZSByZXF1aXJlbWVudHMuCiAgICAgICAgVGhpcyBpcyBpbXBvcnRhbnQgYmVjYXVzZSBleHRyYSByZXF1aXJlbWVudHMgbWF5IGxvb2sgbGlrZSBgbXlfcmVxOwogICAgICAgIGV4dHJhID0gIm15X2V4dHJhImAsIHdoaWNoIHdvdWxkIG90aGVyd2lzZSBiZSBpbnRlcnByZXRlZCBhcyBhIHB1cmVseQogICAgICAgIG9wdGlvbmFsIHJlcXVpcmVtZW50LiAgSW5zdGVhZCwgd2Ugd2FudCB0byBiZSBhYmxlIHRvIGFzc2VydCB0aGF0IHRoZXNlCiAgICAgICAgcmVxdWlyZW1lbnRzIGFyZSB0cnVseSByZXF1aXJlZC4KICAgICAgICAiIiIKCiAgICAgICAgIyBzZXQgdXAgdGhlIHN0YWNrCiAgICAgICAgcmVxdWlyZW1lbnRzID0gbGlzdChyZXF1aXJlbWVudHMpWzo6LTFdCiAgICAgICAgIyBzZXQgb2YgcHJvY2Vzc2VkIHJlcXVpcmVtZW50cwogICAgICAgIHByb2Nlc3NlZCA9IHt9CiAgICAgICAgIyBrZXkgLT4gZGlzdAogICAgICAgIGJlc3QgPSB7fQogICAgICAgIHRvX2FjdGl2YXRlID0gW10KCiAgICAgICAgcmVxX2V4dHJhcyA9IF9SZXFFeHRyYXMoKQoKICAgICAgICAjIE1hcHBpbmcgb2YgcmVxdWlyZW1lbnQgdG8gc2V0IG9mIGRpc3RyaWJ1dGlvbnMgdGhhdCByZXF1aXJlZCBpdDsKICAgICAgICAjIHVzZWZ1bCBmb3IgcmVwb3J0aW5nIGluZm8gYWJvdXQgY29uZmxpY3RzLgogICAgICAgIHJlcXVpcmVkX2J5ID0gY29sbGVjdGlvbnMuZGVmYXVsdGRpY3Qoc2V0KQoKICAgICAgICB3aGlsZSByZXF1aXJlbWVudHM6CiAgICAgICAgICAgICMgcHJvY2VzcyBkZXBlbmRlbmNpZXMgYnJlYWR0aC1maXJzdAogICAgICAgICAgICByZXEgPSByZXF1aXJlbWVudHMucG9wKDApCiAgICAgICAgICAgIGlmIHJlcSBpbiBwcm9jZXNzZWQ6CiAgICAgICAgICAgICAgICAjIElnbm9yZSBjeWNsaWMgb3IgcmVkdW5kYW50IGRlcGVuZGVuY2llcwogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgIGlmIG5vdCByZXFfZXh0cmFzLm1hcmtlcnNfcGFzcyhyZXEsIGV4dHJhcyk6CiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgZGlzdCA9IGJlc3QuZ2V0KHJlcS5rZXkpCiAgICAgICAgICAgIGlmIGRpc3QgaXMgTm9uZToKICAgICAgICAgICAgICAgICMgRmluZCB0aGUgYmVzdCBkaXN0cmlidXRpb24gYW5kIGFkZCBpdCB0byB0aGUgbWFwCiAgICAgICAgICAgICAgICBkaXN0ID0gc2VsZi5ieV9rZXkuZ2V0KHJlcS5rZXkpCiAgICAgICAgICAgICAgICBpZiBkaXN0IGlzIE5vbmUgb3IgKGRpc3Qgbm90IGluIHJlcSBhbmQgcmVwbGFjZV9jb25mbGljdGluZyk6CiAgICAgICAgICAgICAgICAgICAgd3MgPSBzZWxmCiAgICAgICAgICAgICAgICAgICAgaWYgZW52IGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGRpc3QgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudiA9IEVudmlyb25tZW50KHNlbGYuZW50cmllcykKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVXNlIGFuIGVtcHR5IGVudmlyb25tZW50IGFuZCB3b3JraW5nc2V0IHRvIGF2b2lkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFueSBmdXJ0aGVyIGNvbmZsaWN0cyB3aXRoIHRoZSBjb25mbGljdGluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBkaXN0cmlidXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudiA9IEVudmlyb25tZW50KFtdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgd3MgPSBXb3JraW5nU2V0KFtdKQogICAgICAgICAgICAgICAgICAgIGRpc3QgPSBiZXN0W3JlcS5rZXldID0gZW52LmJlc3RfbWF0Y2goCiAgICAgICAgICAgICAgICAgICAgICAgIHJlcSwgd3MsIGluc3RhbGxlciwKICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZV9jb25mbGljdGluZz1yZXBsYWNlX2NvbmZsaWN0aW5nCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIGlmIGRpc3QgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZXJzID0gcmVxdWlyZWRfYnkuZ2V0KHJlcSwgTm9uZSkKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHJpYnV0aW9uTm90Rm91bmQocmVxLCByZXF1aXJlcnMpCiAgICAgICAgICAgICAgICB0b19hY3RpdmF0ZS5hcHBlbmQoZGlzdCkKICAgICAgICAgICAgaWYgZGlzdCBub3QgaW4gcmVxOgogICAgICAgICAgICAgICAgIyBPb3BzLCB0aGUgImJlc3QiIHNvIGZhciBjb25mbGljdHMgd2l0aCBhIGRlcGVuZGVuY3kKICAgICAgICAgICAgICAgIGRlcGVuZGVudF9yZXEgPSByZXF1aXJlZF9ieVtyZXFdCiAgICAgICAgICAgICAgICByYWlzZSBWZXJzaW9uQ29uZmxpY3QoZGlzdCwgcmVxKS53aXRoX2NvbnRleHQoZGVwZW5kZW50X3JlcSkKCiAgICAgICAgICAgICMgcHVzaCB0aGUgbmV3IHJlcXVpcmVtZW50cyBvbnRvIHRoZSBzdGFjawogICAgICAgICAgICBuZXdfcmVxdWlyZW1lbnRzID0gZGlzdC5yZXF1aXJlcyhyZXEuZXh0cmFzKVs6Oi0xXQogICAgICAgICAgICByZXF1aXJlbWVudHMuZXh0ZW5kKG5ld19yZXF1aXJlbWVudHMpCgogICAgICAgICAgICAjIFJlZ2lzdGVyIHRoZSBuZXcgcmVxdWlyZW1lbnRzIG5lZWRlZCBieSByZXEKICAgICAgICAgICAgZm9yIG5ld19yZXF1aXJlbWVudCBpbiBuZXdfcmVxdWlyZW1lbnRzOgogICAgICAgICAgICAgICAgcmVxdWlyZWRfYnlbbmV3X3JlcXVpcmVtZW50XS5hZGQocmVxLnByb2plY3RfbmFtZSkKICAgICAgICAgICAgICAgIHJlcV9leHRyYXNbbmV3X3JlcXVpcmVtZW50XSA9IHJlcS5leHRyYXMKCiAgICAgICAgICAgIHByb2Nlc3NlZFtyZXFdID0gVHJ1ZQoKICAgICAgICAjIHJldHVybiBsaXN0IG9mIGRpc3Ryb3MgdG8gYWN0aXZhdGUKICAgICAgICByZXR1cm4gdG9fYWN0aXZhdGUKCiAgICBkZWYgZmluZF9wbHVnaW5zKAogICAgICAgICAgICBzZWxmLCBwbHVnaW5fZW52LCBmdWxsX2Vudj1Ob25lLCBpbnN0YWxsZXI9Tm9uZSwgZmFsbGJhY2s9VHJ1ZSk6CiAgICAgICAgIiIiRmluZCBhbGwgYWN0aXZhdGFibGUgZGlzdHJpYnV0aW9ucyBpbiBgcGx1Z2luX2VudmAKCiAgICAgICAgRXhhbXBsZSB1c2FnZTo6CgogICAgICAgICAgICBkaXN0cmlidXRpb25zLCBlcnJvcnMgPSB3b3JraW5nX3NldC5maW5kX3BsdWdpbnMoCiAgICAgICAgICAgICAgICBFbnZpcm9ubWVudChwbHVnaW5fZGlybGlzdCkKICAgICAgICAgICAgKQogICAgICAgICAgICAjIGFkZCBwbHVnaW5zK2xpYnMgdG8gc3lzLnBhdGgKICAgICAgICAgICAgbWFwKHdvcmtpbmdfc2V0LmFkZCwgZGlzdHJpYnV0aW9ucykKICAgICAgICAgICAgIyBkaXNwbGF5IGVycm9ycwogICAgICAgICAgICBwcmludCgnQ291bGQgbm90IGxvYWQnLCBlcnJvcnMpCgogICAgICAgIFRoZSBgcGx1Z2luX2VudmAgc2hvdWxkIGJlIGFuIGBgRW52aXJvbm1lbnRgYCBpbnN0YW5jZSB0aGF0IGNvbnRhaW5zCiAgICAgICAgb25seSBkaXN0cmlidXRpb25zIHRoYXQgYXJlIGluIHRoZSBwcm9qZWN0J3MgInBsdWdpbiBkaXJlY3RvcnkiIG9yCiAgICAgICAgZGlyZWN0b3JpZXMuIFRoZSBgZnVsbF9lbnZgLCBpZiBzdXBwbGllZCwgc2hvdWxkIGJlIGFuIGBgRW52aXJvbm1lbnRgYAogICAgICAgIGNvbnRhaW5zIGFsbCBjdXJyZW50bHktYXZhaWxhYmxlIGRpc3RyaWJ1dGlvbnMuICBJZiBgZnVsbF9lbnZgIGlzIG5vdAogICAgICAgIHN1cHBsaWVkLCBvbmUgaXMgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gdGhlIGBgV29ya2luZ1NldGBgIHRoaXMKICAgICAgICBtZXRob2QgaXMgY2FsbGVkIG9uLCB3aGljaCB3aWxsIHR5cGljYWxseSBtZWFuIHRoYXQgZXZlcnkgZGlyZWN0b3J5IG9uCiAgICAgICAgYGBzeXMucGF0aGBgIHdpbGwgYmUgc2Nhbm5lZCBmb3IgZGlzdHJpYnV0aW9ucy4KCiAgICAgICAgYGluc3RhbGxlcmAgaXMgYSBzdGFuZGFyZCBpbnN0YWxsZXIgY2FsbGJhY2sgYXMgdXNlZCBieSB0aGUKICAgICAgICBgYHJlc29sdmUoKWBgIG1ldGhvZC4gVGhlIGBmYWxsYmFja2AgZmxhZyBpbmRpY2F0ZXMgd2hldGhlciB3ZSBzaG91bGQKICAgICAgICBhdHRlbXB0IHRvIHJlc29sdmUgb2xkZXIgdmVyc2lvbnMgb2YgYSBwbHVnaW4gaWYgdGhlIG5ld2VzdCB2ZXJzaW9uCiAgICAgICAgY2Fubm90IGJlIHJlc29sdmVkLgoKICAgICAgICBUaGlzIG1ldGhvZCByZXR1cm5zIGEgMi10dXBsZTogKGBkaXN0cmlidXRpb25zYCwgYGVycm9yX2luZm9gKSwgd2hlcmUKICAgICAgICBgZGlzdHJpYnV0aW9uc2AgaXMgYSBsaXN0IG9mIHRoZSBkaXN0cmlidXRpb25zIGZvdW5kIGluIGBwbHVnaW5fZW52YAogICAgICAgIHRoYXQgd2VyZSBsb2FkYWJsZSwgYWxvbmcgd2l0aCBhbnkgb3RoZXIgZGlzdHJpYnV0aW9ucyB0aGF0IGFyZSBuZWVkZWQKICAgICAgICB0byByZXNvbHZlIHRoZWlyIGRlcGVuZGVuY2llcy4gIGBlcnJvcl9pbmZvYCBpcyBhIGRpY3Rpb25hcnkgbWFwcGluZwogICAgICAgIHVubG9hZGFibGUgcGx1Z2luIGRpc3RyaWJ1dGlvbnMgdG8gYW4gZXhjZXB0aW9uIGluc3RhbmNlIGRlc2NyaWJpbmcgdGhlCiAgICAgICAgZXJyb3IgdGhhdCBvY2N1cnJlZC4gVXN1YWxseSB0aGlzIHdpbGwgYmUgYSBgYERpc3RyaWJ1dGlvbk5vdEZvdW5kYGAgb3IKICAgICAgICBgYFZlcnNpb25Db25mbGljdGBgIGluc3RhbmNlLgogICAgICAgICIiIgoKICAgICAgICBwbHVnaW5fcHJvamVjdHMgPSBsaXN0KHBsdWdpbl9lbnYpCiAgICAgICAgIyBzY2FuIHByb2plY3QgbmFtZXMgaW4gYWxwaGFiZXRpYyBvcmRlcgogICAgICAgIHBsdWdpbl9wcm9qZWN0cy5zb3J0KCkKCiAgICAgICAgZXJyb3JfaW5mbyA9IHt9CiAgICAgICAgZGlzdHJpYnV0aW9ucyA9IHt9CgogICAgICAgIGlmIGZ1bGxfZW52IGlzIE5vbmU6CiAgICAgICAgICAgIGVudiA9IEVudmlyb25tZW50KHNlbGYuZW50cmllcykKICAgICAgICAgICAgZW52ICs9IHBsdWdpbl9lbnYKICAgICAgICBlbHNlOgogICAgICAgICAgICBlbnYgPSBmdWxsX2VudiArIHBsdWdpbl9lbnYKCiAgICAgICAgc2hhZG93X3NldCA9IHNlbGYuX19jbGFzc19fKFtdKQogICAgICAgICMgcHV0IGFsbCBvdXIgZW50cmllcyBpbiBzaGFkb3dfc2V0CiAgICAgICAgbGlzdChtYXAoc2hhZG93X3NldC5hZGQsIHNlbGYpKQoKICAgICAgICBmb3IgcHJvamVjdF9uYW1lIGluIHBsdWdpbl9wcm9qZWN0czoKCiAgICAgICAgICAgIGZvciBkaXN0IGluIHBsdWdpbl9lbnZbcHJvamVjdF9uYW1lXToKCiAgICAgICAgICAgICAgICByZXEgPSBbZGlzdC5hc19yZXF1aXJlbWVudCgpXQoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICByZXNvbHZlZXMgPSBzaGFkb3dfc2V0LnJlc29sdmUocmVxLCBlbnYsIGluc3RhbGxlcikKCiAgICAgICAgICAgICAgICBleGNlcHQgUmVzb2x1dGlvbkVycm9yIGFzIHY6CiAgICAgICAgICAgICAgICAgICAgIyBzYXZlIGVycm9yIGluZm8KICAgICAgICAgICAgICAgICAgICBlcnJvcl9pbmZvW2Rpc3RdID0gdgogICAgICAgICAgICAgICAgICAgIGlmIGZhbGxiYWNrOgogICAgICAgICAgICAgICAgICAgICAgICAjIHRyeSB0aGUgbmV4dCBvbGRlciB2ZXJzaW9uIG9mIHByb2plY3QKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAjIGdpdmUgdXAgb24gdGhpcyBwcm9qZWN0LCBrZWVwIGdvaW5nCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCgogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBsaXN0KG1hcChzaGFkb3dfc2V0LmFkZCwgcmVzb2x2ZWVzKSkKICAgICAgICAgICAgICAgICAgICBkaXN0cmlidXRpb25zLnVwZGF0ZShkaWN0LmZyb21rZXlzKHJlc29sdmVlcykpCgogICAgICAgICAgICAgICAgICAgICMgc3VjY2Vzcywgbm8gbmVlZCB0byB0cnkgYW55IG1vcmUgdmVyc2lvbnMgb2YgdGhpcyBwcm9qZWN0CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgZGlzdHJpYnV0aW9ucyA9IGxpc3QoZGlzdHJpYnV0aW9ucykKICAgICAgICBkaXN0cmlidXRpb25zLnNvcnQoKQoKICAgICAgICByZXR1cm4gZGlzdHJpYnV0aW9ucywgZXJyb3JfaW5mbwoKICAgIGRlZiByZXF1aXJlKHNlbGYsICpyZXF1aXJlbWVudHMpOgogICAgICAgICIiIkVuc3VyZSB0aGF0IGRpc3RyaWJ1dGlvbnMgbWF0Y2hpbmcgYHJlcXVpcmVtZW50c2AgYXJlIGFjdGl2YXRlZAoKICAgICAgICBgcmVxdWlyZW1lbnRzYCBtdXN0IGJlIGEgc3RyaW5nIG9yIGEgKHBvc3NpYmx5LW5lc3RlZCkgc2VxdWVuY2UKICAgICAgICB0aGVyZW9mLCBzcGVjaWZ5aW5nIHRoZSBkaXN0cmlidXRpb25zIGFuZCB2ZXJzaW9ucyByZXF1aXJlZC4gIFRoZQogICAgICAgIHJldHVybiB2YWx1ZSBpcyBhIHNlcXVlbmNlIG9mIHRoZSBkaXN0cmlidXRpb25zIHRoYXQgbmVlZGVkIHRvIGJlCiAgICAgICAgYWN0aXZhdGVkIHRvIGZ1bGZpbGwgdGhlIHJlcXVpcmVtZW50czsgYWxsIHJlbGV2YW50IGRpc3RyaWJ1dGlvbnMgYXJlCiAgICAgICAgaW5jbHVkZWQsIGV2ZW4gaWYgdGhleSB3ZXJlIGFscmVhZHkgYWN0aXZhdGVkIGluIHRoaXMgd29ya2luZyBzZXQuCiAgICAgICAgIiIiCiAgICAgICAgbmVlZGVkID0gc2VsZi5yZXNvbHZlKHBhcnNlX3JlcXVpcmVtZW50cyhyZXF1aXJlbWVudHMpKQoKICAgICAgICBmb3IgZGlzdCBpbiBuZWVkZWQ6CiAgICAgICAgICAgIHNlbGYuYWRkKGRpc3QpCgogICAgICAgIHJldHVybiBuZWVkZWQKCiAgICBkZWYgc3Vic2NyaWJlKHNlbGYsIGNhbGxiYWNrLCBleGlzdGluZz1UcnVlKToKICAgICAgICAiIiJJbnZva2UgYGNhbGxiYWNrYCBmb3IgYWxsIGRpc3RyaWJ1dGlvbnMKCiAgICAgICAgSWYgYGV4aXN0aW5nPVRydWVgIChkZWZhdWx0KSwKICAgICAgICBjYWxsIG9uIGFsbCBleGlzdGluZyBvbmVzLCBhcyB3ZWxsLgogICAgICAgICIiIgogICAgICAgIGlmIGNhbGxiYWNrIGluIHNlbGYuY2FsbGJhY2tzOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBzZWxmLmNhbGxiYWNrcy5hcHBlbmQoY2FsbGJhY2spCiAgICAgICAgaWYgbm90IGV4aXN0aW5nOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBmb3IgZGlzdCBpbiBzZWxmOgogICAgICAgICAgICBjYWxsYmFjayhkaXN0KQoKICAgIGRlZiBfYWRkZWRfbmV3KHNlbGYsIGRpc3QpOgogICAgICAgIGZvciBjYWxsYmFjayBpbiBzZWxmLmNhbGxiYWNrczoKICAgICAgICAgICAgY2FsbGJhY2soZGlzdCkKCiAgICBkZWYgX19nZXRzdGF0ZV9fKHNlbGYpOgogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgIHNlbGYuZW50cmllc1s6XSwgc2VsZi5lbnRyeV9rZXlzLmNvcHkoKSwgc2VsZi5ieV9rZXkuY29weSgpLAogICAgICAgICAgICBzZWxmLmNhbGxiYWNrc1s6XQogICAgICAgICkKCiAgICBkZWYgX19zZXRzdGF0ZV9fKHNlbGYsIGVfa19iX2MpOgogICAgICAgIGVudHJpZXMsIGtleXMsIGJ5X2tleSwgY2FsbGJhY2tzID0gZV9rX2JfYwogICAgICAgIHNlbGYuZW50cmllcyA9IGVudHJpZXNbOl0KICAgICAgICBzZWxmLmVudHJ5X2tleXMgPSBrZXlzLmNvcHkoKQogICAgICAgIHNlbGYuYnlfa2V5ID0gYnlfa2V5LmNvcHkoKQogICAgICAgIHNlbGYuY2FsbGJhY2tzID0gY2FsbGJhY2tzWzpdCgoKY2xhc3MgX1JlcUV4dHJhcyhkaWN0KToKICAgICIiIgogICAgTWFwIGVhY2ggcmVxdWlyZW1lbnQgdG8gdGhlIGV4dHJhcyB0aGF0IGRlbWFuZGVkIGl0LgogICAgIiIiCgogICAgZGVmIG1hcmtlcnNfcGFzcyhzZWxmLCByZXEsIGV4dHJhcz1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBFdmFsdWF0ZSBtYXJrZXJzIGZvciByZXEgYWdhaW5zdCBlYWNoIGV4dHJhIHRoYXQKICAgICAgICBkZW1hbmRlZCBpdC4KCiAgICAgICAgUmV0dXJuIEZhbHNlIGlmIHRoZSByZXEgaGFzIGEgbWFya2VyIGFuZCBmYWlscwogICAgICAgIGV2YWx1YXRpb24uIE90aGVyd2lzZSwgcmV0dXJuIFRydWUuCiAgICAgICAgIiIiCiAgICAgICAgZXh0cmFfZXZhbHMgPSAoCiAgICAgICAgICAgIHJlcS5tYXJrZXIuZXZhbHVhdGUoeydleHRyYSc6IGV4dHJhfSkKICAgICAgICAgICAgZm9yIGV4dHJhIGluIHNlbGYuZ2V0KHJlcSwgKCkpICsgKGV4dHJhcyBvciAoTm9uZSwpKQogICAgICAgICkKICAgICAgICByZXR1cm4gbm90IHJlcS5tYXJrZXIgb3IgYW55KGV4dHJhX2V2YWxzKQoKCmNsYXNzIEVudmlyb25tZW50KG9iamVjdCk6CiAgICAiIiJTZWFyY2hhYmxlIHNuYXBzaG90IG9mIGRpc3RyaWJ1dGlvbnMgb24gYSBzZWFyY2ggcGF0aCIiIgoKICAgIGRlZiBfX2luaXRfXygKICAgICAgICAgICAgc2VsZiwgc2VhcmNoX3BhdGg9Tm9uZSwgcGxhdGZvcm09Z2V0X3N1cHBvcnRlZF9wbGF0Zm9ybSgpLAogICAgICAgICAgICBweXRob249UFlfTUFKT1IpOgogICAgICAgICIiIlNuYXBzaG90IGRpc3RyaWJ1dGlvbnMgYXZhaWxhYmxlIG9uIGEgc2VhcmNoIHBhdGgKCiAgICAgICAgQW55IGRpc3RyaWJ1dGlvbnMgZm91bmQgb24gYHNlYXJjaF9wYXRoYCBhcmUgYWRkZWQgdG8gdGhlIGVudmlyb25tZW50LgogICAgICAgIGBzZWFyY2hfcGF0aGAgc2hvdWxkIGJlIGEgc2VxdWVuY2Ugb2YgYGBzeXMucGF0aGBgIGl0ZW1zLiAgSWYgbm90CiAgICAgICAgc3VwcGxpZWQsIGBgc3lzLnBhdGhgYCBpcyB1c2VkLgoKICAgICAgICBgcGxhdGZvcm1gIGlzIGFuIG9wdGlvbmFsIHN0cmluZyBzcGVjaWZ5aW5nIHRoZSBuYW1lIG9mIHRoZSBwbGF0Zm9ybQogICAgICAgIHRoYXQgcGxhdGZvcm0tc3BlY2lmaWMgZGlzdHJpYnV0aW9ucyBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aC4gIElmCiAgICAgICAgdW5zcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHBsYXRmb3JtLiAgYHB5dGhvbmAgaXMgYW4KICAgICAgICBvcHRpb25hbCBzdHJpbmcgbmFtaW5nIHRoZSBkZXNpcmVkIHZlcnNpb24gb2YgUHl0aG9uIChlLmcuIGBgJzMuMydgYCk7CiAgICAgICAgaXQgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgdmVyc2lvbi4KCiAgICAgICAgWW91IG1heSBleHBsaWNpdGx5IHNldCBgcGxhdGZvcm1gIChhbmQvb3IgYHB5dGhvbmApIHRvIGBgTm9uZWBgIGlmIHlvdQogICAgICAgIHdpc2ggdG8gbWFwICphbGwqIGRpc3RyaWJ1dGlvbnMsIG5vdCBqdXN0IHRob3NlIGNvbXBhdGlibGUgd2l0aCB0aGUKICAgICAgICBydW5uaW5nIHBsYXRmb3JtIG9yIFB5dGhvbiB2ZXJzaW9uLgogICAgICAgICIiIgogICAgICAgIHNlbGYuX2Rpc3RtYXAgPSB7fQogICAgICAgIHNlbGYucGxhdGZvcm0gPSBwbGF0Zm9ybQogICAgICAgIHNlbGYucHl0aG9uID0gcHl0aG9uCiAgICAgICAgc2VsZi5zY2FuKHNlYXJjaF9wYXRoKQoKICAgIGRlZiBjYW5fYWRkKHNlbGYsIGRpc3QpOgogICAgICAgICIiIklzIGRpc3RyaWJ1dGlvbiBgZGlzdGAgYWNjZXB0YWJsZSBmb3IgdGhpcyBlbnZpcm9ubWVudD8KCiAgICAgICAgVGhlIGRpc3RyaWJ1dGlvbiBtdXN0IG1hdGNoIHRoZSBwbGF0Zm9ybSBhbmQgcHl0aG9uIHZlcnNpb24KICAgICAgICByZXF1aXJlbWVudHMgc3BlY2lmaWVkIHdoZW4gdGhpcyBlbnZpcm9ubWVudCB3YXMgY3JlYXRlZCwgb3IgRmFsc2UKICAgICAgICBpcyByZXR1cm5lZC4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gKHNlbGYucHl0aG9uIGlzIE5vbmUgb3IgZGlzdC5weV92ZXJzaW9uIGlzIE5vbmUKICAgICAgICAgICAgb3IgZGlzdC5weV92ZXJzaW9uID09IHNlbGYucHl0aG9uKSBcCiAgICAgICAgICAgIGFuZCBjb21wYXRpYmxlX3BsYXRmb3JtcyhkaXN0LnBsYXRmb3JtLCBzZWxmLnBsYXRmb3JtKQoKICAgIGRlZiByZW1vdmUoc2VsZiwgZGlzdCk6CiAgICAgICAgIiIiUmVtb3ZlIGBkaXN0YCBmcm9tIHRoZSBlbnZpcm9ubWVudCIiIgogICAgICAgIHNlbGYuX2Rpc3RtYXBbZGlzdC5rZXldLnJlbW92ZShkaXN0KQoKICAgIGRlZiBzY2FuKHNlbGYsIHNlYXJjaF9wYXRoPU5vbmUpOgogICAgICAgICIiIlNjYW4gYHNlYXJjaF9wYXRoYCBmb3IgZGlzdHJpYnV0aW9ucyB1c2FibGUgaW4gdGhpcyBlbnZpcm9ubWVudAoKICAgICAgICBBbnkgZGlzdHJpYnV0aW9ucyBmb3VuZCBhcmUgYWRkZWQgdG8gdGhlIGVudmlyb25tZW50LgogICAgICAgIGBzZWFyY2hfcGF0aGAgc2hvdWxkIGJlIGEgc2VxdWVuY2Ugb2YgYGBzeXMucGF0aGBgIGl0ZW1zLiAgSWYgbm90CiAgICAgICAgc3VwcGxpZWQsIGBgc3lzLnBhdGhgYCBpcyB1c2VkLiAgT25seSBkaXN0cmlidXRpb25zIGNvbmZvcm1pbmcgdG8KICAgICAgICB0aGUgcGxhdGZvcm0vcHl0aG9uIHZlcnNpb24gZGVmaW5lZCBhdCBpbml0aWFsaXphdGlvbiBhcmUgYWRkZWQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VhcmNoX3BhdGggaXMgTm9uZToKICAgICAgICAgICAgc2VhcmNoX3BhdGggPSBzeXMucGF0aAoKICAgICAgICBmb3IgaXRlbSBpbiBzZWFyY2hfcGF0aDoKICAgICAgICAgICAgZm9yIGRpc3QgaW4gZmluZF9kaXN0cmlidXRpb25zKGl0ZW0pOgogICAgICAgICAgICAgICAgc2VsZi5hZGQoZGlzdCkKCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgcHJvamVjdF9uYW1lKToKICAgICAgICAiIiJSZXR1cm4gYSBuZXdlc3QtdG8tb2xkZXN0IGxpc3Qgb2YgZGlzdHJpYnV0aW9ucyBmb3IgYHByb2plY3RfbmFtZWAKCiAgICAgICAgVXNlcyBjYXNlLWluc2Vuc2l0aXZlIGBwcm9qZWN0X25hbWVgIGNvbXBhcmlzb24sIGFzc3VtaW5nIGFsbCB0aGUKICAgICAgICBwcm9qZWN0J3MgZGlzdHJpYnV0aW9ucyB1c2UgdGhlaXIgcHJvamVjdCdzIG5hbWUgY29udmVydGVkIHRvIGFsbAogICAgICAgIGxvd2VyY2FzZSBhcyB0aGVpciBrZXkuCgogICAgICAgICIiIgogICAgICAgIGRpc3RyaWJ1dGlvbl9rZXkgPSBwcm9qZWN0X25hbWUubG93ZXIoKQogICAgICAgIHJldHVybiBzZWxmLl9kaXN0bWFwLmdldChkaXN0cmlidXRpb25fa2V5LCBbXSkKCiAgICBkZWYgYWRkKHNlbGYsIGRpc3QpOgogICAgICAgICIiIkFkZCBgZGlzdGAgaWYgd2UgYGBjYW5fYWRkKClgYCBpdCBhbmQgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWRkZWQKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLmNhbl9hZGQoZGlzdCkgYW5kIGRpc3QuaGFzX3ZlcnNpb24oKToKICAgICAgICAgICAgZGlzdHMgPSBzZWxmLl9kaXN0bWFwLnNldGRlZmF1bHQoZGlzdC5rZXksIFtdKQogICAgICAgICAgICBpZiBkaXN0IG5vdCBpbiBkaXN0czoKICAgICAgICAgICAgICAgIGRpc3RzLmFwcGVuZChkaXN0KQogICAgICAgICAgICAgICAgZGlzdHMuc29ydChrZXk9b3BlcmF0b3IuYXR0cmdldHRlcignaGFzaGNtcCcpLCByZXZlcnNlPVRydWUpCgogICAgZGVmIGJlc3RfbWF0Y2goCiAgICAgICAgICAgIHNlbGYsIHJlcSwgd29ya2luZ19zZXQsIGluc3RhbGxlcj1Ob25lLCByZXBsYWNlX2NvbmZsaWN0aW5nPUZhbHNlKToKICAgICAgICAiIiJGaW5kIGRpc3RyaWJ1dGlvbiBiZXN0IG1hdGNoaW5nIGByZXFgIGFuZCB1c2FibGUgb24gYHdvcmtpbmdfc2V0YAoKICAgICAgICBUaGlzIGNhbGxzIHRoZSBgYGZpbmQocmVxKWBgIG1ldGhvZCBvZiB0aGUgYHdvcmtpbmdfc2V0YCB0byBzZWUgaWYgYQogICAgICAgIHN1aXRhYmxlIGRpc3RyaWJ1dGlvbiBpcyBhbHJlYWR5IGFjdGl2ZS4gIChUaGlzIG1heSByYWlzZQogICAgICAgIGBgVmVyc2lvbkNvbmZsaWN0YGAgaWYgYW4gdW5zdWl0YWJsZSB2ZXJzaW9uIG9mIHRoZSBwcm9qZWN0IGlzIGFscmVhZHkKICAgICAgICBhY3RpdmUgaW4gdGhlIHNwZWNpZmllZCBgd29ya2luZ19zZXRgLikgIElmIGEgc3VpdGFibGUgZGlzdHJpYnV0aW9uCiAgICAgICAgaXNuJ3QgYWN0aXZlLCB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBuZXdlc3QgZGlzdHJpYnV0aW9uIGluIHRoZQogICAgICAgIGVudmlyb25tZW50IHRoYXQgbWVldHMgdGhlIGBgUmVxdWlyZW1lbnRgYCBpbiBgcmVxYC4gIElmIG5vIHN1aXRhYmxlCiAgICAgICAgZGlzdHJpYnV0aW9uIGlzIGZvdW5kLCBhbmQgYGluc3RhbGxlcmAgaXMgc3VwcGxpZWQsIHRoZW4gdGhlIHJlc3VsdCBvZgogICAgICAgIGNhbGxpbmcgdGhlIGVudmlyb25tZW50J3MgYGBvYnRhaW4ocmVxLCBpbnN0YWxsZXIpYGAgbWV0aG9kIHdpbGwgYmUKICAgICAgICByZXR1cm5lZC4KICAgICAgICAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIGRpc3QgPSB3b3JraW5nX3NldC5maW5kKHJlcSkKICAgICAgICBleGNlcHQgVmVyc2lvbkNvbmZsaWN0OgogICAgICAgICAgICBpZiBub3QgcmVwbGFjZV9jb25mbGljdGluZzoKICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgIGRpc3QgPSBOb25lCiAgICAgICAgaWYgZGlzdCBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIGRpc3QKICAgICAgICBmb3IgZGlzdCBpbiBzZWxmW3JlcS5rZXldOgogICAgICAgICAgICBpZiBkaXN0IGluIHJlcToKICAgICAgICAgICAgICAgIHJldHVybiBkaXN0CiAgICAgICAgIyB0cnkgdG8gZG93bmxvYWQvaW5zdGFsbAogICAgICAgIHJldHVybiBzZWxmLm9idGFpbihyZXEsIGluc3RhbGxlcikKCiAgICBkZWYgb2J0YWluKHNlbGYsIHJlcXVpcmVtZW50LCBpbnN0YWxsZXI9Tm9uZSk6CiAgICAgICAgIiIiT2J0YWluIGEgZGlzdHJpYnV0aW9uIG1hdGNoaW5nIGByZXF1aXJlbWVudGAgKGUuZy4gdmlhIGRvd25sb2FkKQoKICAgICAgICBPYnRhaW4gYSBkaXN0cm8gdGhhdCBtYXRjaGVzIHJlcXVpcmVtZW50IChlLmcuIHZpYSBkb3dubG9hZCkuICBJbiB0aGUKICAgICAgICBiYXNlIGBgRW52aXJvbm1lbnRgYCBjbGFzcywgdGhpcyByb3V0aW5lIGp1c3QgcmV0dXJucwogICAgICAgIGBgaW5zdGFsbGVyKHJlcXVpcmVtZW50KWBgLCB1bmxlc3MgYGluc3RhbGxlcmAgaXMgTm9uZSwgaW4gd2hpY2ggY2FzZQogICAgICAgIE5vbmUgaXMgcmV0dXJuZWQgaW5zdGVhZC4gIFRoaXMgbWV0aG9kIGlzIGEgaG9vayB0aGF0IGFsbG93cyBzdWJjbGFzc2VzCiAgICAgICAgdG8gYXR0ZW1wdCBvdGhlciB3YXlzIG9mIG9idGFpbmluZyBhIGRpc3RyaWJ1dGlvbiBiZWZvcmUgZmFsbGluZyBiYWNrCiAgICAgICAgdG8gdGhlIGBpbnN0YWxsZXJgIGFyZ3VtZW50LiIiIgogICAgICAgIGlmIGluc3RhbGxlciBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIGluc3RhbGxlcihyZXF1aXJlbWVudCkKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgIiIiWWllbGQgdGhlIHVuaXF1ZSBwcm9qZWN0IG5hbWVzIG9mIHRoZSBhdmFpbGFibGUgZGlzdHJpYnV0aW9ucyIiIgogICAgICAgIGZvciBrZXkgaW4gc2VsZi5fZGlzdG1hcC5rZXlzKCk6CiAgICAgICAgICAgIGlmIHNlbGZba2V5XToKICAgICAgICAgICAgICAgIHlpZWxkIGtleQoKICAgIGRlZiBfX2lhZGRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgIiIiSW4tcGxhY2UgYWRkaXRpb24gb2YgYSBkaXN0cmlidXRpb24gb3IgZW52aXJvbm1lbnQiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBEaXN0cmlidXRpb24pOgogICAgICAgICAgICBzZWxmLmFkZChvdGhlcikKICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob3RoZXIsIEVudmlyb25tZW50KToKICAgICAgICAgICAgZm9yIHByb2plY3QgaW4gb3RoZXI6CiAgICAgICAgICAgICAgICBmb3IgZGlzdCBpbiBvdGhlcltwcm9qZWN0XToKICAgICAgICAgICAgICAgICAgICBzZWxmLmFkZChkaXN0KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiQ2FuJ3QgYWRkICVyIHRvIGVudmlyb25tZW50IiAlIChvdGhlciwpKQogICAgICAgIHJldHVybiBzZWxmCgogICAgZGVmIF9fYWRkX18oc2VsZiwgb3RoZXIpOgogICAgICAgICIiIkFkZCBhbiBlbnZpcm9ubWVudCBvciBkaXN0cmlidXRpb24gdG8gYW4gZW52aXJvbm1lbnQiIiIKICAgICAgICBuZXcgPSBzZWxmLl9fY2xhc3NfXyhbXSwgcGxhdGZvcm09Tm9uZSwgcHl0aG9uPU5vbmUpCiAgICAgICAgZm9yIGVudiBpbiBzZWxmLCBvdGhlcjoKICAgICAgICAgICAgbmV3ICs9IGVudgogICAgICAgIHJldHVybiBuZXcKCgojIFhYWCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CkF2YWlsYWJsZURpc3RyaWJ1dGlvbnMgPSBFbnZpcm9ubWVudAoKCmNsYXNzIEV4dHJhY3Rpb25FcnJvcihSdW50aW1lRXJyb3IpOgogICAgIiIiQW4gZXJyb3Igb2NjdXJyZWQgZXh0cmFjdGluZyBhIHJlc291cmNlCgogICAgVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSBhdmFpbGFibGUgZnJvbSBpbnN0YW5jZXMgb2YgdGhpcyBleGNlcHRpb246CgogICAgbWFuYWdlcgogICAgICAgIFRoZSByZXNvdXJjZSBtYW5hZ2VyIHRoYXQgcmFpc2VkIHRoaXMgZXhjZXB0aW9uCgogICAgY2FjaGVfcGF0aAogICAgICAgIFRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgcmVzb3VyY2UgZXh0cmFjdGlvbgoKICAgIG9yaWdpbmFsX2Vycm9yCiAgICAgICAgVGhlIGV4Y2VwdGlvbiBpbnN0YW5jZSB0aGF0IGNhdXNlZCBleHRyYWN0aW9uIHRvIGZhaWwKICAgICIiIgoKCmNsYXNzIFJlc291cmNlTWFuYWdlcjoKICAgICIiIk1hbmFnZSByZXNvdXJjZSBleHRyYWN0aW9uIGFuZCBwYWNrYWdlcyIiIgogICAgZXh0cmFjdGlvbl9wYXRoID0gTm9uZQoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLmNhY2hlZF9maWxlcyA9IHt9CgogICAgZGVmIHJlc291cmNlX2V4aXN0cyhzZWxmLCBwYWNrYWdlX29yX3JlcXVpcmVtZW50LCByZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJEb2VzIHRoZSBuYW1lZCByZXNvdXJjZSBleGlzdD8iIiIKICAgICAgICByZXR1cm4gZ2V0X3Byb3ZpZGVyKHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQpLmhhc19yZXNvdXJjZShyZXNvdXJjZV9uYW1lKQoKICAgIGRlZiByZXNvdXJjZV9pc2RpcihzZWxmLCBwYWNrYWdlX29yX3JlcXVpcmVtZW50LCByZXNvdXJjZV9uYW1lKToKICAgICAgICAiIiJJcyB0aGUgbmFtZWQgcmVzb3VyY2UgYW4gZXhpc3RpbmcgZGlyZWN0b3J5PyIiIgogICAgICAgIHJldHVybiBnZXRfcHJvdmlkZXIocGFja2FnZV9vcl9yZXF1aXJlbWVudCkucmVzb3VyY2VfaXNkaXIoCiAgICAgICAgICAgIHJlc291cmNlX25hbWUKICAgICAgICApCgogICAgZGVmIHJlc291cmNlX2ZpbGVuYW1lKHNlbGYsIHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQsIHJlc291cmNlX25hbWUpOgogICAgICAgICIiIlJldHVybiBhIHRydWUgZmlsZXN5c3RlbSBwYXRoIGZvciBzcGVjaWZpZWQgcmVzb3VyY2UiIiIKICAgICAgICByZXR1cm4gZ2V0X3Byb3ZpZGVyKHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQpLmdldF9yZXNvdXJjZV9maWxlbmFtZSgKICAgICAgICAgICAgc2VsZiwgcmVzb3VyY2VfbmFtZQogICAgICAgICkKCiAgICBkZWYgcmVzb3VyY2Vfc3RyZWFtKHNlbGYsIHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQsIHJlc291cmNlX25hbWUpOgogICAgICAgICIiIlJldHVybiBhIHJlYWRhYmxlIGZpbGUtbGlrZSBvYmplY3QgZm9yIHNwZWNpZmllZCByZXNvdXJjZSIiIgogICAgICAgIHJldHVybiBnZXRfcHJvdmlkZXIocGFja2FnZV9vcl9yZXF1aXJlbWVudCkuZ2V0X3Jlc291cmNlX3N0cmVhbSgKICAgICAgICAgICAgc2VsZiwgcmVzb3VyY2VfbmFtZQogICAgICAgICkKCiAgICBkZWYgcmVzb3VyY2Vfc3RyaW5nKHNlbGYsIHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQsIHJlc291cmNlX25hbWUpOgogICAgICAgICIiIlJldHVybiBzcGVjaWZpZWQgcmVzb3VyY2UgYXMgYSBzdHJpbmciIiIKICAgICAgICByZXR1cm4gZ2V0X3Byb3ZpZGVyKHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQpLmdldF9yZXNvdXJjZV9zdHJpbmcoCiAgICAgICAgICAgIHNlbGYsIHJlc291cmNlX25hbWUKICAgICAgICApCgogICAgZGVmIHJlc291cmNlX2xpc3RkaXIoc2VsZiwgcGFja2FnZV9vcl9yZXF1aXJlbWVudCwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgIiIiTGlzdCB0aGUgY29udGVudHMgb2YgdGhlIG5hbWVkIHJlc291cmNlIGRpcmVjdG9yeSIiIgogICAgICAgIHJldHVybiBnZXRfcHJvdmlkZXIocGFja2FnZV9vcl9yZXF1aXJlbWVudCkucmVzb3VyY2VfbGlzdGRpcigKICAgICAgICAgICAgcmVzb3VyY2VfbmFtZQogICAgICAgICkKCiAgICBkZWYgZXh0cmFjdGlvbl9lcnJvcihzZWxmKToKICAgICAgICAiIiJHaXZlIGFuIGVycm9yIG1lc3NhZ2UgZm9yIHByb2JsZW1zIGV4dHJhY3RpbmcgZmlsZShzKSIiIgoKICAgICAgICBvbGRfZXhjID0gc3lzLmV4Y19pbmZvKClbMV0KICAgICAgICBjYWNoZV9wYXRoID0gc2VsZi5leHRyYWN0aW9uX3BhdGggb3IgZ2V0X2RlZmF1bHRfY2FjaGUoKQoKICAgICAgICB0bXBsID0gdGV4dHdyYXAuZGVkZW50KCIiIgogICAgICAgICAgICBDYW4ndCBleHRyYWN0IGZpbGUocykgdG8gZWdnIGNhY2hlCgogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGVycm9yIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byBleHRyYWN0IGZpbGUocykKICAgICAgICAgICAgdG8gdGhlIFB5dGhvbiBlZ2cgY2FjaGU6CgogICAgICAgICAgICAgIHtvbGRfZXhjfQoKICAgICAgICAgICAgVGhlIFB5dGhvbiBlZ2cgY2FjaGUgZGlyZWN0b3J5IGlzIGN1cnJlbnRseSBzZXQgdG86CgogICAgICAgICAgICAgIHtjYWNoZV9wYXRofQoKICAgICAgICAgICAgUGVyaGFwcyB5b3VyIGFjY291bnQgZG9lcyBub3QgaGF2ZSB3cml0ZSBhY2Nlc3MgdG8gdGhpcyBkaXJlY3Rvcnk/CiAgICAgICAgICAgIFlvdSBjYW4gY2hhbmdlIHRoZSBjYWNoZSBkaXJlY3RvcnkgYnkgc2V0dGluZyB0aGUgUFlUSE9OX0VHR19DQUNIRQogICAgICAgICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBwb2ludCB0byBhbiBhY2Nlc3NpYmxlIGRpcmVjdG9yeS4KICAgICAgICAgICAgIiIiKS5sc3RyaXAoKQogICAgICAgIGVyciA9IEV4dHJhY3Rpb25FcnJvcih0bXBsLmZvcm1hdCgqKmxvY2FscygpKSkKICAgICAgICBlcnIubWFuYWdlciA9IHNlbGYKICAgICAgICBlcnIuY2FjaGVfcGF0aCA9IGNhY2hlX3BhdGgKICAgICAgICBlcnIub3JpZ2luYWxfZXJyb3IgPSBvbGRfZXhjCiAgICAgICAgcmFpc2UgZXJyCgogICAgZGVmIGdldF9jYWNoZV9wYXRoKHNlbGYsIGFyY2hpdmVfbmFtZSwgbmFtZXM9KCkpOgogICAgICAgICIiIlJldHVybiBhYnNvbHV0ZSBsb2NhdGlvbiBpbiBjYWNoZSBmb3IgYGFyY2hpdmVfbmFtZWAgYW5kIGBuYW1lc2AKCiAgICAgICAgVGhlIHBhcmVudCBkaXJlY3Rvcnkgb2YgdGhlIHJlc3VsdGluZyBwYXRoIHdpbGwgYmUgY3JlYXRlZCBpZiBpdCBkb2VzCiAgICAgICAgbm90IGFscmVhZHkgZXhpc3QuICBgYXJjaGl2ZV9uYW1lYCBzaG91bGQgYmUgdGhlIGJhc2UgZmlsZW5hbWUgb2YgdGhlCiAgICAgICAgZW5jbG9zaW5nIGVnZyAod2hpY2ggbWF5IG5vdCBiZSB0aGUgbmFtZSBvZiB0aGUgZW5jbG9zaW5nIHppcGZpbGUhKSwKICAgICAgICBpbmNsdWRpbmcgaXRzICIuZWdnIiBleHRlbnNpb24uICBgbmFtZXNgLCBpZiBwcm92aWRlZCwgc2hvdWxkIGJlIGEKICAgICAgICBzZXF1ZW5jZSBvZiBwYXRoIG5hbWUgcGFydHMgInVuZGVyIiB0aGUgZWdnJ3MgZXh0cmFjdGlvbiBsb2NhdGlvbi4KCiAgICAgICAgVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJ5IHJlc291cmNlIHByb3ZpZGVycyB0aGF0IG5lZWQgdG8KICAgICAgICBvYnRhaW4gYW4gZXh0cmFjdGlvbiBsb2NhdGlvbiwgYW5kIG9ubHkgZm9yIG5hbWVzIHRoZXkgaW50ZW5kIHRvCiAgICAgICAgZXh0cmFjdCwgYXMgaXQgdHJhY2tzIHRoZSBnZW5lcmF0ZWQgbmFtZXMgZm9yIHBvc3NpYmxlIGNsZWFudXAgbGF0ZXIuCiAgICAgICAgIiIiCiAgICAgICAgZXh0cmFjdF9wYXRoID0gc2VsZi5leHRyYWN0aW9uX3BhdGggb3IgZ2V0X2RlZmF1bHRfY2FjaGUoKQogICAgICAgIHRhcmdldF9wYXRoID0gb3MucGF0aC5qb2luKGV4dHJhY3RfcGF0aCwgYXJjaGl2ZV9uYW1lICsgJy10bXAnLCAqbmFtZXMpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBfYnlwYXNzX2Vuc3VyZV9kaXJlY3RvcnkodGFyZ2V0X3BhdGgpCiAgICAgICAgZXhjZXB0OgogICAgICAgICAgICBzZWxmLmV4dHJhY3Rpb25fZXJyb3IoKQoKICAgICAgICBzZWxmLl93YXJuX3Vuc2FmZV9leHRyYWN0aW9uX3BhdGgoZXh0cmFjdF9wYXRoKQoKICAgICAgICBzZWxmLmNhY2hlZF9maWxlc1t0YXJnZXRfcGF0aF0gPSAxCiAgICAgICAgcmV0dXJuIHRhcmdldF9wYXRoCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF93YXJuX3Vuc2FmZV9leHRyYWN0aW9uX3BhdGgocGF0aCk6CiAgICAgICAgIiIiCiAgICAgICAgSWYgdGhlIGRlZmF1bHQgZXh0cmFjdGlvbiBwYXRoIGlzIG92ZXJyaWRkZW4gYW5kIHNldCB0byBhbiBpbnNlY3VyZQogICAgICAgIGxvY2F0aW9uLCBzdWNoIGFzIC90bXAsIGl0IG9wZW5zIHVwIGFuIG9wcG9ydHVuaXR5IGZvciBhbiBhdHRhY2tlciB0bwogICAgICAgIHJlcGxhY2UgYW4gZXh0cmFjdGVkIGZpbGUgd2l0aCBhbiB1bmF1dGhvcml6ZWQgcGF5bG9hZC4gV2FybiB0aGUgdXNlcgogICAgICAgIGlmIGEga25vd24gaW5zZWN1cmUgbG9jYXRpb24gaXMgdXNlZC4KCiAgICAgICAgU2VlIERpc3RyaWJ1dGUgIzM3NSBmb3IgbW9yZSBkZXRhaWxzLgogICAgICAgICIiIgogICAgICAgIGlmIG9zLm5hbWUgPT0gJ250JyBhbmQgbm90IHBhdGguc3RhcnRzd2l0aChvcy5lbnZpcm9uWyd3aW5kaXInXSk6CiAgICAgICAgICAgICMgT24gV2luZG93cywgcGVybWlzc2lvbnMgYXJlIGdlbmVyYWxseSByZXN0cmljdGl2ZSBieSBkZWZhdWx0CiAgICAgICAgICAgICMgIGFuZCB0ZW1wIGRpcmVjdG9yaWVzIGFyZSBub3Qgd3JpdGFibGUgYnkgb3RoZXIgdXNlcnMsIHNvCiAgICAgICAgICAgICMgIGJ5cGFzcyB0aGUgd2FybmluZy4KICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgbW9kZSA9IG9zLnN0YXQocGF0aCkuc3RfbW9kZQogICAgICAgIGlmIG1vZGUgJiBzdGF0LlNfSVdPVEggb3IgbW9kZSAmIHN0YXQuU19JV0dSUDoKICAgICAgICAgICAgbXNnID0gKAogICAgICAgICAgICAgICAgIiVzIGlzIHdyaXRhYmxlIGJ5IGdyb3VwL290aGVycyBhbmQgdnVsbmVyYWJsZSB0byBhdHRhY2sgIgogICAgICAgICAgICAgICAgIndoZW4gIgogICAgICAgICAgICAgICAgInVzZWQgd2l0aCBnZXRfcmVzb3VyY2VfZmlsZW5hbWUuIENvbnNpZGVyIGEgbW9yZSBzZWN1cmUgIgogICAgICAgICAgICAgICAgImxvY2F0aW9uIChzZXQgd2l0aCAuc2V0X2V4dHJhY3Rpb25fcGF0aCBvciB0aGUgIgogICAgICAgICAgICAgICAgIlBZVEhPTl9FR0dfQ0FDSEUgZW52aXJvbm1lbnQgdmFyaWFibGUpLiIgJSBwYXRoCiAgICAgICAgICAgICkKICAgICAgICAgICAgd2FybmluZ3Mud2Fybihtc2csIFVzZXJXYXJuaW5nKQoKICAgIGRlZiBwb3N0cHJvY2VzcyhzZWxmLCB0ZW1wbmFtZSwgZmlsZW5hbWUpOgogICAgICAgICIiIlBlcmZvcm0gYW55IHBsYXRmb3JtLXNwZWNpZmljIHBvc3Rwcm9jZXNzaW5nIG9mIGB0ZW1wbmFtZWAKCiAgICAgICAgVGhpcyBpcyB3aGVyZSBNYWMgaGVhZGVyIHJld3JpdGVzIHNob3VsZCBiZSBkb25lOyBvdGhlciBwbGF0Zm9ybXMgZG9uJ3QKICAgICAgICBoYXZlIGFueXRoaW5nIHNwZWNpYWwgdGhleSBzaG91bGQgZG8uCgogICAgICAgIFJlc291cmNlIHByb3ZpZGVycyBzaG91bGQgY2FsbCB0aGlzIG1ldGhvZCBPTkxZIGFmdGVyIHN1Y2Nlc3NmdWxseQogICAgICAgIGV4dHJhY3RpbmcgYSBjb21wcmVzc2VkIHJlc291cmNlLiAgVGhleSBtdXN0IE5PVCBjYWxsIGl0IG9uIHJlc291cmNlcwogICAgICAgIHRoYXQgYXJlIGFscmVhZHkgaW4gdGhlIGZpbGVzeXN0ZW0uCgogICAgICAgIGB0ZW1wbmFtZWAgaXMgdGhlIGN1cnJlbnQgKHRlbXBvcmFyeSkgbmFtZSBvZiB0aGUgZmlsZSwgYW5kIGBmaWxlbmFtZWAKICAgICAgICBpcyB0aGUgbmFtZSBpdCB3aWxsIGJlIHJlbmFtZWQgdG8gYnkgdGhlIGNhbGxlciBhZnRlciB0aGlzIHJvdXRpbmUKICAgICAgICByZXR1cm5zLgogICAgICAgICIiIgoKICAgICAgICBpZiBvcy5uYW1lID09ICdwb3NpeCc6CiAgICAgICAgICAgICMgTWFrZSB0aGUgcmVzb3VyY2UgZXhlY3V0YWJsZQogICAgICAgICAgICBtb2RlID0gKChvcy5zdGF0KHRlbXBuYW1lKS5zdF9tb2RlKSB8IDBvNTU1KSAmIDBvNzc3NwogICAgICAgICAgICBvcy5jaG1vZCh0ZW1wbmFtZSwgbW9kZSkKCiAgICBkZWYgc2V0X2V4dHJhY3Rpb25fcGF0aChzZWxmLCBwYXRoKToKICAgICAgICAiIiJTZXQgdGhlIGJhc2UgcGF0aCB3aGVyZSByZXNvdXJjZXMgd2lsbCBiZSBleHRyYWN0ZWQgdG8sIGlmIG5lZWRlZC4KCiAgICAgICAgSWYgeW91IGRvIG5vdCBjYWxsIHRoaXMgcm91dGluZSBiZWZvcmUgYW55IGV4dHJhY3Rpb25zIHRha2UgcGxhY2UsIHRoZQogICAgICAgIHBhdGggZGVmYXVsdHMgdG8gdGhlIHJldHVybiB2YWx1ZSBvZiBgYGdldF9kZWZhdWx0X2NhY2hlKClgYC4gIChXaGljaAogICAgICAgIGlzIGJhc2VkIG9uIHRoZSBgYFBZVEhPTl9FR0dfQ0FDSEVgYCBlbnZpcm9ubWVudCB2YXJpYWJsZSwgd2l0aCB2YXJpb3VzCiAgICAgICAgcGxhdGZvcm0tc3BlY2lmaWMgZmFsbGJhY2tzLiAgU2VlIHRoYXQgcm91dGluZSdzIGRvY3VtZW50YXRpb24gZm9yIG1vcmUKICAgICAgICBkZXRhaWxzLikKCiAgICAgICAgUmVzb3VyY2VzIGFyZSBleHRyYWN0ZWQgdG8gc3ViZGlyZWN0b3JpZXMgb2YgdGhpcyBwYXRoIGJhc2VkIHVwb24KICAgICAgICBpbmZvcm1hdGlvbiBnaXZlbiBieSB0aGUgYGBJUmVzb3VyY2VQcm92aWRlcmBgLiAgWW91IG1heSBzZXQgdGhpcyB0byBhCiAgICAgICAgdGVtcG9yYXJ5IGRpcmVjdG9yeSwgYnV0IHRoZW4geW91IG11c3QgY2FsbCBgYGNsZWFudXBfcmVzb3VyY2VzKClgYCB0bwogICAgICAgIGRlbGV0ZSB0aGUgZXh0cmFjdGVkIGZpbGVzIHdoZW4gZG9uZS4gIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0CiAgICAgICAgYGBjbGVhbnVwX3Jlc291cmNlcygpYGAgd2lsbCBiZSBhYmxlIHRvIHJlbW92ZSBhbGwgZXh0cmFjdGVkIGZpbGVzLgoKICAgICAgICAoTm90ZTogeW91IG1heSBub3QgY2hhbmdlIHRoZSBleHRyYWN0aW9uIHBhdGggZm9yIGEgZ2l2ZW4gcmVzb3VyY2UKICAgICAgICBtYW5hZ2VyIG9uY2UgcmVzb3VyY2VzIGhhdmUgYmVlbiBleHRyYWN0ZWQsIHVubGVzcyB5b3UgZmlyc3QgY2FsbAogICAgICAgIGBgY2xlYW51cF9yZXNvdXJjZXMoKWBgLikKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLmNhY2hlZF9maWxlczoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAgICAgICAgICJDYW4ndCBjaGFuZ2UgZXh0cmFjdGlvbiBwYXRoLCBmaWxlcyBhbHJlYWR5IGV4dHJhY3RlZCIKICAgICAgICAgICAgKQoKICAgICAgICBzZWxmLmV4dHJhY3Rpb25fcGF0aCA9IHBhdGgKCiAgICBkZWYgY2xlYW51cF9yZXNvdXJjZXMoc2VsZiwgZm9yY2U9RmFsc2UpOgogICAgICAgICIiIgogICAgICAgIERlbGV0ZSBhbGwgZXh0cmFjdGVkIHJlc291cmNlIGZpbGVzIGFuZCBkaXJlY3RvcmllcywgcmV0dXJuaW5nIGEgbGlzdAogICAgICAgIG9mIHRoZSBmaWxlIGFuZCBkaXJlY3RvcnkgbmFtZXMgdGhhdCBjb3VsZCBub3QgYmUgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQuCiAgICAgICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBoYXZlIGFueSBjb25jdXJyZW5jeSBwcm90ZWN0aW9uLCBzbyBpdCBzaG91bGQKICAgICAgICBnZW5lcmFsbHkgb25seSBiZSBjYWxsZWQgd2hlbiB0aGUgZXh0cmFjdGlvbiBwYXRoIGlzIGEgdGVtcG9yYXJ5CiAgICAgICAgZGlyZWN0b3J5IGV4Y2x1c2l2ZSB0byBhIHNpbmdsZSBwcm9jZXNzLiAgVGhpcyBtZXRob2QgaXMgbm90CiAgICAgICAgYXV0b21hdGljYWxseSBjYWxsZWQ7IHlvdSBtdXN0IGNhbGwgaXQgZXhwbGljaXRseSBvciByZWdpc3RlciBpdCBhcyBhbgogICAgICAgIGBgYXRleGl0YGAgZnVuY3Rpb24gaWYgeW91IHdpc2ggdG8gZW5zdXJlIGNsZWFudXAgb2YgYSB0ZW1wb3JhcnkKICAgICAgICBkaXJlY3RvcnkgdXNlZCBmb3IgZXh0cmFjdGlvbnMuCiAgICAgICAgIiIiCiAgICAgICAgIyBYWFgKCgpkZWYgZ2V0X2RlZmF1bHRfY2FjaGUoKToKICAgICIiIgogICAgUmV0dXJuIHRoZSBgYFBZVEhPTl9FR0dfQ0FDSEVgYCBlbnZpcm9ubWVudCB2YXJpYWJsZQogICAgb3IgYSBwbGF0Zm9ybS1yZWxldmFudCB1c2VyIGNhY2hlIGRpciBmb3IgYW4gYXBwCiAgICBuYW1lZCAiUHl0aG9uLUVnZ3MiLgogICAgIiIiCiAgICByZXR1cm4gKAogICAgICAgIG9zLmVudmlyb24uZ2V0KCdQWVRIT05fRUdHX0NBQ0hFJykKICAgICAgICBvciBhcHBkaXJzLnVzZXJfY2FjaGVfZGlyKGFwcG5hbWU9J1B5dGhvbi1FZ2dzJykKICAgICkKCgpkZWYgc2FmZV9uYW1lKG5hbWUpOgogICAgIiIiQ29udmVydCBhbiBhcmJpdHJhcnkgc3RyaW5nIHRvIGEgc3RhbmRhcmQgZGlzdHJpYnV0aW9uIG5hbWUKCiAgICBBbnkgcnVucyBvZiBub24tYWxwaGFudW1lcmljLy4gY2hhcmFjdGVycyBhcmUgcmVwbGFjZWQgd2l0aCBhIHNpbmdsZSAnLScuCiAgICAiIiIKICAgIHJldHVybiByZS5zdWIoJ1teQS1aYS16MC05Ll0rJywgJy0nLCBuYW1lKQoKCmRlZiBzYWZlX3ZlcnNpb24odmVyc2lvbik6CiAgICAiIiIKICAgIENvbnZlcnQgYW4gYXJiaXRyYXJ5IHN0cmluZyB0byBhIHN0YW5kYXJkIHZlcnNpb24gc3RyaW5nCiAgICAiIiIKICAgIHRyeToKICAgICAgICAjIG5vcm1hbGl6ZSB0aGUgdmVyc2lvbgogICAgICAgIHJldHVybiBzdHIocGFja2FnaW5nLnZlcnNpb24uVmVyc2lvbih2ZXJzaW9uKSkKICAgIGV4Y2VwdCBwYWNrYWdpbmcudmVyc2lvbi5JbnZhbGlkVmVyc2lvbjoKICAgICAgICB2ZXJzaW9uID0gdmVyc2lvbi5yZXBsYWNlKCcgJywgJy4nKQogICAgICAgIHJldHVybiByZS5zdWIoJ1teQS1aYS16MC05Ll0rJywgJy0nLCB2ZXJzaW9uKQoKCmRlZiBzYWZlX2V4dHJhKGV4dHJhKToKICAgICIiIkNvbnZlcnQgYW4gYXJiaXRyYXJ5IHN0cmluZyB0byBhIHN0YW5kYXJkICdleHRyYScgbmFtZQoKICAgIEFueSBydW5zIG9mIG5vbi1hbHBoYW51bWVyaWMgY2hhcmFjdGVycyBhcmUgcmVwbGFjZWQgd2l0aCBhIHNpbmdsZSAnXycsCiAgICBhbmQgdGhlIHJlc3VsdCBpcyBhbHdheXMgbG93ZXJjYXNlZC4KICAgICIiIgogICAgcmV0dXJuIHJlLnN1YignW15BLVphLXowLTkuLV0rJywgJ18nLCBleHRyYSkubG93ZXIoKQoKCmRlZiB0b19maWxlbmFtZShuYW1lKToKICAgICIiIkNvbnZlcnQgYSBwcm9qZWN0IG9yIHZlcnNpb24gbmFtZSB0byBpdHMgZmlsZW5hbWUtZXNjYXBlZCBmb3JtCgogICAgQW55ICctJyBjaGFyYWN0ZXJzIGFyZSBjdXJyZW50bHkgcmVwbGFjZWQgd2l0aCAnXycuCiAgICAiIiIKICAgIHJldHVybiBuYW1lLnJlcGxhY2UoJy0nLCAnXycpCgoKZGVmIGludmFsaWRfbWFya2VyKHRleHQpOgogICAgIiIiCiAgICBWYWxpZGF0ZSB0ZXh0IGFzIGEgUEVQIDUwOCBlbnZpcm9ubWVudCBtYXJrZXI7IHJldHVybiBhbiBleGNlcHRpb24KICAgIGlmIGludmFsaWQgb3IgRmFsc2Ugb3RoZXJ3aXNlLgogICAgIiIiCiAgICB0cnk6CiAgICAgICAgZXZhbHVhdGVfbWFya2VyKHRleHQpCiAgICBleGNlcHQgU3ludGF4RXJyb3IgYXMgZToKICAgICAgICBlLmZpbGVuYW1lID0gTm9uZQogICAgICAgIGUubGluZW5vID0gTm9uZQogICAgICAgIHJldHVybiBlCiAgICByZXR1cm4gRmFsc2UKCgpkZWYgZXZhbHVhdGVfbWFya2VyKHRleHQsIGV4dHJhPU5vbmUpOgogICAgIiIiCiAgICBFdmFsdWF0ZSBhIFBFUCA1MDggZW52aXJvbm1lbnQgbWFya2VyLgogICAgUmV0dXJuIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHRoZSBtYXJrZXIgcmVzdWx0IGluIHRoaXMgZW52aXJvbm1lbnQuCiAgICBSYWlzZSBTeW50YXhFcnJvciBpZiBtYXJrZXIgaXMgaW52YWxpZC4KCiAgICBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgdGhlICdweXBhcnNpbmcnIG1vZHVsZS4KICAgICIiIgogICAgdHJ5OgogICAgICAgIG1hcmtlciA9IHBhY2thZ2luZy5tYXJrZXJzLk1hcmtlcih0ZXh0KQogICAgICAgIHJldHVybiBtYXJrZXIuZXZhbHVhdGUoKQogICAgZXhjZXB0IHBhY2thZ2luZy5tYXJrZXJzLkludmFsaWRNYXJrZXIgYXMgZToKICAgICAgICByYWlzZSBTeW50YXhFcnJvcihlKQoKCmNsYXNzIE51bGxQcm92aWRlcjoKICAgICIiIlRyeSB0byBpbXBsZW1lbnQgcmVzb3VyY2VzIGFuZCBtZXRhZGF0YSBmb3IgYXJiaXRyYXJ5IFBFUCAzMDIgbG9hZGVycyIiIgoKICAgIGVnZ19uYW1lID0gTm9uZQogICAgZWdnX2luZm8gPSBOb25lCiAgICBsb2FkZXIgPSBOb25lCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1vZHVsZSk6CiAgICAgICAgc2VsZi5sb2FkZXIgPSBnZXRhdHRyKG1vZHVsZSwgJ19fbG9hZGVyX18nLCBOb25lKQogICAgICAgIHNlbGYubW9kdWxlX3BhdGggPSBvcy5wYXRoLmRpcm5hbWUoZ2V0YXR0cihtb2R1bGUsICdfX2ZpbGVfXycsICcnKSkKCiAgICBkZWYgZ2V0X3Jlc291cmNlX2ZpbGVuYW1lKHNlbGYsIG1hbmFnZXIsIHJlc291cmNlX25hbWUpOgogICAgICAgIHJldHVybiBzZWxmLl9mbihzZWxmLm1vZHVsZV9wYXRoLCByZXNvdXJjZV9uYW1lKQoKICAgIGRlZiBnZXRfcmVzb3VyY2Vfc3RyZWFtKHNlbGYsIG1hbmFnZXIsIHJlc291cmNlX25hbWUpOgogICAgICAgIHJldHVybiBpby5CeXRlc0lPKHNlbGYuZ2V0X3Jlc291cmNlX3N0cmluZyhtYW5hZ2VyLCByZXNvdXJjZV9uYW1lKSkKCiAgICBkZWYgZ2V0X3Jlc291cmNlX3N0cmluZyhzZWxmLCBtYW5hZ2VyLCByZXNvdXJjZV9uYW1lKToKICAgICAgICByZXR1cm4gc2VsZi5fZ2V0KHNlbGYuX2ZuKHNlbGYubW9kdWxlX3BhdGgsIHJlc291cmNlX25hbWUpKQoKICAgIGRlZiBoYXNfcmVzb3VyY2Uoc2VsZiwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuX2hhcyhzZWxmLl9mbihzZWxmLm1vZHVsZV9wYXRoLCByZXNvdXJjZV9uYW1lKSkKCiAgICBkZWYgaGFzX21ldGFkYXRhKHNlbGYsIG5hbWUpOgogICAgICAgIHJldHVybiBzZWxmLmVnZ19pbmZvIGFuZCBzZWxmLl9oYXMoc2VsZi5fZm4oc2VsZi5lZ2dfaW5mbywgbmFtZSkpCgogICAgZGVmIGdldF9tZXRhZGF0YShzZWxmLCBuYW1lKToKICAgICAgICBpZiBub3Qgc2VsZi5lZ2dfaW5mbzoKICAgICAgICAgICAgcmV0dXJuICIiCiAgICAgICAgdmFsdWUgPSBzZWxmLl9nZXQoc2VsZi5fZm4oc2VsZi5lZ2dfaW5mbywgbmFtZSkpCiAgICAgICAgcmV0dXJuIHZhbHVlLmRlY29kZSgndXRmLTgnKSBpZiBzaXguUFkzIGVsc2UgdmFsdWUKCiAgICBkZWYgZ2V0X21ldGFkYXRhX2xpbmVzKHNlbGYsIG5hbWUpOgogICAgICAgIHJldHVybiB5aWVsZF9saW5lcyhzZWxmLmdldF9tZXRhZGF0YShuYW1lKSkKCiAgICBkZWYgcmVzb3VyY2VfaXNkaXIoc2VsZiwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuX2lzZGlyKHNlbGYuX2ZuKHNlbGYubW9kdWxlX3BhdGgsIHJlc291cmNlX25hbWUpKQoKICAgIGRlZiBtZXRhZGF0YV9pc2RpcihzZWxmLCBuYW1lKToKICAgICAgICByZXR1cm4gc2VsZi5lZ2dfaW5mbyBhbmQgc2VsZi5faXNkaXIoc2VsZi5fZm4oc2VsZi5lZ2dfaW5mbywgbmFtZSkpCgogICAgZGVmIHJlc291cmNlX2xpc3RkaXIoc2VsZiwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuX2xpc3RkaXIoc2VsZi5fZm4oc2VsZi5tb2R1bGVfcGF0aCwgcmVzb3VyY2VfbmFtZSkpCgogICAgZGVmIG1ldGFkYXRhX2xpc3RkaXIoc2VsZiwgbmFtZSk6CiAgICAgICAgaWYgc2VsZi5lZ2dfaW5mbzoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2xpc3RkaXIoc2VsZi5fZm4oc2VsZi5lZ2dfaW5mbywgbmFtZSkpCiAgICAgICAgcmV0dXJuIFtdCgogICAgZGVmIHJ1bl9zY3JpcHQoc2VsZiwgc2NyaXB0X25hbWUsIG5hbWVzcGFjZSk6CiAgICAgICAgc2NyaXB0ID0gJ3NjcmlwdHMvJyArIHNjcmlwdF9uYW1lCiAgICAgICAgaWYgbm90IHNlbGYuaGFzX21ldGFkYXRhKHNjcmlwdCk6CiAgICAgICAgICAgIHJhaXNlIFJlc29sdXRpb25FcnJvcigKICAgICAgICAgICAgICAgICJTY3JpcHQge3NjcmlwdCFyfSBub3QgZm91bmQgaW4gbWV0YWRhdGEgYXQge3NlbGYuZWdnX2luZm8hcn0iCiAgICAgICAgICAgICAgICAuZm9ybWF0KCoqbG9jYWxzKCkpLAogICAgICAgICAgICApCiAgICAgICAgc2NyaXB0X3RleHQgPSBzZWxmLmdldF9tZXRhZGF0YShzY3JpcHQpLnJlcGxhY2UoJ1xyXG4nLCAnXG4nKQogICAgICAgIHNjcmlwdF90ZXh0ID0gc2NyaXB0X3RleHQucmVwbGFjZSgnXHInLCAnXG4nKQogICAgICAgIHNjcmlwdF9maWxlbmFtZSA9IHNlbGYuX2ZuKHNlbGYuZWdnX2luZm8sIHNjcmlwdCkKICAgICAgICBuYW1lc3BhY2VbJ19fZmlsZV9fJ10gPSBzY3JpcHRfZmlsZW5hbWUKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzY3JpcHRfZmlsZW5hbWUpOgogICAgICAgICAgICBzb3VyY2UgPSBvcGVuKHNjcmlwdF9maWxlbmFtZSkucmVhZCgpCiAgICAgICAgICAgIGNvZGUgPSBjb21waWxlKHNvdXJjZSwgc2NyaXB0X2ZpbGVuYW1lLCAnZXhlYycpCiAgICAgICAgICAgIGV4ZWMoY29kZSwgbmFtZXNwYWNlLCBuYW1lc3BhY2UpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZnJvbSBsaW5lY2FjaGUgaW1wb3J0IGNhY2hlCiAgICAgICAgICAgIGNhY2hlW3NjcmlwdF9maWxlbmFtZV0gPSAoCiAgICAgICAgICAgICAgICBsZW4oc2NyaXB0X3RleHQpLCAwLCBzY3JpcHRfdGV4dC5zcGxpdCgnXG4nKSwgc2NyaXB0X2ZpbGVuYW1lCiAgICAgICAgICAgICkKICAgICAgICAgICAgc2NyaXB0X2NvZGUgPSBjb21waWxlKHNjcmlwdF90ZXh0LCBzY3JpcHRfZmlsZW5hbWUsICdleGVjJykKICAgICAgICAgICAgZXhlYyhzY3JpcHRfY29kZSwgbmFtZXNwYWNlLCBuYW1lc3BhY2UpCgogICAgZGVmIF9oYXMoc2VsZiwgcGF0aCk6CiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigKICAgICAgICAgICAgIkNhbid0IHBlcmZvcm0gdGhpcyBvcGVyYXRpb24gZm9yIHVucmVnaXN0ZXJlZCBsb2FkZXIgdHlwZSIKICAgICAgICApCgogICAgZGVmIF9pc2RpcihzZWxmLCBwYXRoKToKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKAogICAgICAgICAgICAiQ2FuJ3QgcGVyZm9ybSB0aGlzIG9wZXJhdGlvbiBmb3IgdW5yZWdpc3RlcmVkIGxvYWRlciB0eXBlIgogICAgICAgICkKCiAgICBkZWYgX2xpc3RkaXIoc2VsZiwgcGF0aCk6CiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigKICAgICAgICAgICAgIkNhbid0IHBlcmZvcm0gdGhpcyBvcGVyYXRpb24gZm9yIHVucmVnaXN0ZXJlZCBsb2FkZXIgdHlwZSIKICAgICAgICApCgogICAgZGVmIF9mbihzZWxmLCBiYXNlLCByZXNvdXJjZV9uYW1lKToKICAgICAgICBpZiByZXNvdXJjZV9uYW1lOgogICAgICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKGJhc2UsICpyZXNvdXJjZV9uYW1lLnNwbGl0KCcvJykpCiAgICAgICAgcmV0dXJuIGJhc2UKCiAgICBkZWYgX2dldChzZWxmLCBwYXRoKToKICAgICAgICBpZiBoYXNhdHRyKHNlbGYubG9hZGVyLCAnZ2V0X2RhdGEnKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYubG9hZGVyLmdldF9kYXRhKHBhdGgpCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigKICAgICAgICAgICAgIkNhbid0IHBlcmZvcm0gdGhpcyBvcGVyYXRpb24gZm9yIGxvYWRlcnMgd2l0aG91dCAnZ2V0X2RhdGEoKSciCiAgICAgICAgKQoKCnJlZ2lzdGVyX2xvYWRlcl90eXBlKG9iamVjdCwgTnVsbFByb3ZpZGVyKQoKCmNsYXNzIEVnZ1Byb3ZpZGVyKE51bGxQcm92aWRlcik6CiAgICAiIiJQcm92aWRlciBiYXNlZCBvbiBhIHZpcnR1YWwgZmlsZXN5c3RlbSIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtb2R1bGUpOgogICAgICAgIE51bGxQcm92aWRlci5fX2luaXRfXyhzZWxmLCBtb2R1bGUpCiAgICAgICAgc2VsZi5fc2V0dXBfcHJlZml4KCkKCiAgICBkZWYgX3NldHVwX3ByZWZpeChzZWxmKToKICAgICAgICAjIHdlIGFzc3VtZSBoZXJlIHRoYXQgb3VyIG1ldGFkYXRhIG1heSBiZSBuZXN0ZWQgaW5zaWRlIGEgImJhc2tldCIKICAgICAgICAjIG9mIG11bHRpcGxlIGVnZ3M7IHRoYXQncyB3aHkgd2UgdXNlIG1vZHVsZV9wYXRoIGluc3RlYWQgb2YgLmFyY2hpdmUKICAgICAgICBwYXRoID0gc2VsZi5tb2R1bGVfcGF0aAogICAgICAgIG9sZCA9IE5vbmUKICAgICAgICB3aGlsZSBwYXRoICE9IG9sZDoKICAgICAgICAgICAgaWYgX2lzX2VnZ19wYXRoKHBhdGgpOgogICAgICAgICAgICAgICAgc2VsZi5lZ2dfbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUocGF0aCkKICAgICAgICAgICAgICAgIHNlbGYuZWdnX2luZm8gPSBvcy5wYXRoLmpvaW4ocGF0aCwgJ0VHRy1JTkZPJykKICAgICAgICAgICAgICAgIHNlbGYuZWdnX3Jvb3QgPSBwYXRoCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBvbGQgPSBwYXRoCiAgICAgICAgICAgIHBhdGgsIGJhc2UgPSBvcy5wYXRoLnNwbGl0KHBhdGgpCgoKY2xhc3MgRGVmYXVsdFByb3ZpZGVyKEVnZ1Byb3ZpZGVyKToKICAgICIiIlByb3ZpZGVzIGFjY2VzcyB0byBwYWNrYWdlIHJlc291cmNlcyBpbiB0aGUgZmlsZXN5c3RlbSIiIgoKICAgIGRlZiBfaGFzKHNlbGYsIHBhdGgpOgogICAgICAgIHJldHVybiBvcy5wYXRoLmV4aXN0cyhwYXRoKQoKICAgIGRlZiBfaXNkaXIoc2VsZiwgcGF0aCk6CiAgICAgICAgcmV0dXJuIG9zLnBhdGguaXNkaXIocGF0aCkKCiAgICBkZWYgX2xpc3RkaXIoc2VsZiwgcGF0aCk6CiAgICAgICAgcmV0dXJuIG9zLmxpc3RkaXIocGF0aCkKCiAgICBkZWYgZ2V0X3Jlc291cmNlX3N0cmVhbShzZWxmLCBtYW5hZ2VyLCByZXNvdXJjZV9uYW1lKToKICAgICAgICByZXR1cm4gb3BlbihzZWxmLl9mbihzZWxmLm1vZHVsZV9wYXRoLCByZXNvdXJjZV9uYW1lKSwgJ3JiJykKCiAgICBkZWYgX2dldChzZWxmLCBwYXRoKToKICAgICAgICB3aXRoIG9wZW4ocGF0aCwgJ3JiJykgYXMgc3RyZWFtOgogICAgICAgICAgICByZXR1cm4gc3RyZWFtLnJlYWQoKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9yZWdpc3RlcihjbHMpOgogICAgICAgIGxvYWRlcl9jbHMgPSBnZXRhdHRyKAogICAgICAgICAgICBpbXBvcnRsaWJfbWFjaGluZXJ5LAogICAgICAgICAgICAnU291cmNlRmlsZUxvYWRlcicsCiAgICAgICAgICAgIHR5cGUoTm9uZSksCiAgICAgICAgKQogICAgICAgIHJlZ2lzdGVyX2xvYWRlcl90eXBlKGxvYWRlcl9jbHMsIGNscykKCgpEZWZhdWx0UHJvdmlkZXIuX3JlZ2lzdGVyKCkKCgpjbGFzcyBFbXB0eVByb3ZpZGVyKE51bGxQcm92aWRlcik6CiAgICAiIiJQcm92aWRlciB0aGF0IHJldHVybnMgbm90aGluZyBmb3IgYWxsIHJlcXVlc3RzIiIiCgogICAgX2lzZGlyID0gX2hhcyA9IGxhbWJkYSBzZWxmLCBwYXRoOiBGYWxzZQogICAgX2dldCA9IGxhbWJkYSBzZWxmLCBwYXRoOiAnJwogICAgX2xpc3RkaXIgPSBsYW1iZGEgc2VsZiwgcGF0aDogW10KICAgIG1vZHVsZV9wYXRoID0gTm9uZQoKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBwYXNzCgoKZW1wdHlfcHJvdmlkZXIgPSBFbXB0eVByb3ZpZGVyKCkKCgpjbGFzcyBaaXBNYW5pZmVzdHMoZGljdCk6CiAgICAiIiIKICAgIHppcCBtYW5pZmVzdCBidWlsZGVyCiAgICAiIiIKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBidWlsZChjbHMsIHBhdGgpOgogICAgICAgICIiIgogICAgICAgIEJ1aWxkIGEgZGljdGlvbmFyeSBzaW1pbGFyIHRvIHRoZSB6aXBpbXBvcnQgZGlyZWN0b3J5CiAgICAgICAgY2FjaGVzLCBleGNlcHQgaW5zdGVhZCBvZiB0dXBsZXMsIHN0b3JlIFppcEluZm8gb2JqZWN0cy4KCiAgICAgICAgVXNlIGEgcGxhdGZvcm0tc3BlY2lmaWMgcGF0aCBzZXBhcmF0b3IgKG9zLnNlcCkgZm9yIHRoZSBwYXRoIGtleXMKICAgICAgICBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHB5cHkgb24gV2luZG93cy4KICAgICAgICAiIiIKICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShwYXRoKSBhcyB6ZmlsZToKICAgICAgICAgICAgaXRlbXMgPSAoCiAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgbmFtZS5yZXBsYWNlKCcvJywgb3Muc2VwKSwKICAgICAgICAgICAgICAgICAgICB6ZmlsZS5nZXRpbmZvKG5hbWUpLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4gemZpbGUubmFtZWxpc3QoKQogICAgICAgICAgICApCiAgICAgICAgICAgIHJldHVybiBkaWN0KGl0ZW1zKQoKICAgIGxvYWQgPSBidWlsZAoKCmNsYXNzIE1lbW9pemVkWmlwTWFuaWZlc3RzKFppcE1hbmlmZXN0cyk6CiAgICAiIiIKICAgIE1lbW9pemVkIHppcGZpbGUgbWFuaWZlc3RzLgogICAgIiIiCiAgICBtYW5pZmVzdF9tb2QgPSBjb2xsZWN0aW9ucy5uYW1lZHR1cGxlKCdtYW5pZmVzdF9tb2QnLCAnbWFuaWZlc3QgbXRpbWUnKQoKICAgIGRlZiBsb2FkKHNlbGYsIHBhdGgpOgogICAgICAgICIiIgogICAgICAgIExvYWQgYSBtYW5pZmVzdCBhdCBwYXRoIG9yIHJldHVybiBhIHN1aXRhYmxlIG1hbmlmZXN0IGFscmVhZHkgbG9hZGVkLgogICAgICAgICIiIgogICAgICAgIHBhdGggPSBvcy5wYXRoLm5vcm1wYXRoKHBhdGgpCiAgICAgICAgbXRpbWUgPSBvcy5zdGF0KHBhdGgpLnN0X210aW1lCgogICAgICAgIGlmIHBhdGggbm90IGluIHNlbGYgb3Igc2VsZltwYXRoXS5tdGltZSAhPSBtdGltZToKICAgICAgICAgICAgbWFuaWZlc3QgPSBzZWxmLmJ1aWxkKHBhdGgpCiAgICAgICAgICAgIHNlbGZbcGF0aF0gPSBzZWxmLm1hbmlmZXN0X21vZChtYW5pZmVzdCwgbXRpbWUpCgogICAgICAgIHJldHVybiBzZWxmW3BhdGhdLm1hbmlmZXN0CgoKY2xhc3MgWmlwUHJvdmlkZXIoRWdnUHJvdmlkZXIpOgogICAgIiIiUmVzb3VyY2Ugc3VwcG9ydCBmb3IgemlwcyBhbmQgZWdncyIiIgoKICAgIGVhZ2VycyA9IE5vbmUKICAgIF96aXBfbWFuaWZlc3RzID0gTWVtb2l6ZWRaaXBNYW5pZmVzdHMoKQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtb2R1bGUpOgogICAgICAgIEVnZ1Byb3ZpZGVyLl9faW5pdF9fKHNlbGYsIG1vZHVsZSkKICAgICAgICBzZWxmLnppcF9wcmUgPSBzZWxmLmxvYWRlci5hcmNoaXZlICsgb3Muc2VwCgogICAgZGVmIF96aXBpbmZvX25hbWUoc2VsZiwgZnNwYXRoKToKICAgICAgICAjIENvbnZlcnQgYSB2aXJ0dWFsIGZpbGVuYW1lIChmdWxsIHBhdGggdG8gZmlsZSkgaW50byBhIHppcGZpbGUgc3VicGF0aAogICAgICAgICMgdXNhYmxlIHdpdGggdGhlIHppcGltcG9ydCBkaXJlY3RvcnkgY2FjaGUgZm9yIG91ciB0YXJnZXQgYXJjaGl2ZQogICAgICAgIGlmIGZzcGF0aC5zdGFydHN3aXRoKHNlbGYuemlwX3ByZSk6CiAgICAgICAgICAgIHJldHVybiBmc3BhdGhbbGVuKHNlbGYuemlwX3ByZSk6XQogICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKAogICAgICAgICAgICAiJXMgaXMgbm90IGEgc3VicGF0aCBvZiAlcyIgJSAoZnNwYXRoLCBzZWxmLnppcF9wcmUpCiAgICAgICAgKQoKICAgIGRlZiBfcGFydHMoc2VsZiwgemlwX3BhdGgpOgogICAgICAgICMgQ29udmVydCBhIHppcGZpbGUgc3VicGF0aCBpbnRvIGFuIGVnZy1yZWxhdGl2ZSBwYXRoIHBhcnQgbGlzdC4KICAgICAgICAjIHBzZXVkby1mcyBwYXRoCiAgICAgICAgZnNwYXRoID0gc2VsZi56aXBfcHJlICsgemlwX3BhdGgKICAgICAgICBpZiBmc3BhdGguc3RhcnRzd2l0aChzZWxmLmVnZ19yb290ICsgb3Muc2VwKToKICAgICAgICAgICAgcmV0dXJuIGZzcGF0aFtsZW4oc2VsZi5lZ2dfcm9vdCkgKyAxOl0uc3BsaXQob3Muc2VwKQogICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKAogICAgICAgICAgICAiJXMgaXMgbm90IGEgc3VicGF0aCBvZiAlcyIgJSAoZnNwYXRoLCBzZWxmLmVnZ19yb290KQogICAgICAgICkKCiAgICBAcHJvcGVydHkKICAgIGRlZiB6aXBpbmZvKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLl96aXBfbWFuaWZlc3RzLmxvYWQoc2VsZi5sb2FkZXIuYXJjaGl2ZSkKCiAgICBkZWYgZ2V0X3Jlc291cmNlX2ZpbGVuYW1lKHNlbGYsIG1hbmFnZXIsIHJlc291cmNlX25hbWUpOgogICAgICAgIGlmIG5vdCBzZWxmLmVnZ19uYW1lOgogICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKAogICAgICAgICAgICAgICAgInJlc291cmNlX2ZpbGVuYW1lKCkgb25seSBzdXBwb3J0ZWQgZm9yIC5lZ2csIG5vdCAuemlwIgogICAgICAgICAgICApCiAgICAgICAgIyBubyBuZWVkIHRvIGxvY2sgZm9yIGV4dHJhY3Rpb24sIHNpbmNlIHdlIHVzZSB0ZW1wIG5hbWVzCiAgICAgICAgemlwX3BhdGggPSBzZWxmLl9yZXNvdXJjZV90b196aXAocmVzb3VyY2VfbmFtZSkKICAgICAgICBlYWdlcnMgPSBzZWxmLl9nZXRfZWFnZXJfcmVzb3VyY2VzKCkKICAgICAgICBpZiAnLycuam9pbihzZWxmLl9wYXJ0cyh6aXBfcGF0aCkpIGluIGVhZ2VyczoKICAgICAgICAgICAgZm9yIG5hbWUgaW4gZWFnZXJzOgogICAgICAgICAgICAgICAgc2VsZi5fZXh0cmFjdF9yZXNvdXJjZShtYW5hZ2VyLCBzZWxmLl9lYWdlcl90b196aXAobmFtZSkpCiAgICAgICAgcmV0dXJuIHNlbGYuX2V4dHJhY3RfcmVzb3VyY2UobWFuYWdlciwgemlwX3BhdGgpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9nZXRfZGF0ZV9hbmRfc2l6ZSh6aXBfc3RhdCk6CiAgICAgICAgc2l6ZSA9IHppcF9zdGF0LmZpbGVfc2l6ZQogICAgICAgICMgeW1kaG1zK3dkYXksIHlkYXksIGRzdAogICAgICAgIGRhdGVfdGltZSA9IHppcF9zdGF0LmRhdGVfdGltZSArICgwLCAwLCAtMSkKICAgICAgICAjIDE5ODAgb2Zmc2V0IGFscmVhZHkgZG9uZQogICAgICAgIHRpbWVzdGFtcCA9IHRpbWUubWt0aW1lKGRhdGVfdGltZSkKICAgICAgICByZXR1cm4gdGltZXN0YW1wLCBzaXplCgogICAgZGVmIF9leHRyYWN0X3Jlc291cmNlKHNlbGYsIG1hbmFnZXIsIHppcF9wYXRoKToKCiAgICAgICAgaWYgemlwX3BhdGggaW4gc2VsZi5faW5kZXgoKToKICAgICAgICAgICAgZm9yIG5hbWUgaW4gc2VsZi5faW5kZXgoKVt6aXBfcGF0aF06CiAgICAgICAgICAgICAgICBsYXN0ID0gc2VsZi5fZXh0cmFjdF9yZXNvdXJjZSgKICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyLCBvcy5wYXRoLmpvaW4oemlwX3BhdGgsIG5hbWUpCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICMgcmV0dXJuIHRoZSBleHRyYWN0ZWQgZGlyZWN0b3J5IG5hbWUKICAgICAgICAgICAgcmV0dXJuIG9zLnBhdGguZGlybmFtZShsYXN0KQoKICAgICAgICB0aW1lc3RhbXAsIHNpemUgPSBzZWxmLl9nZXRfZGF0ZV9hbmRfc2l6ZShzZWxmLnppcGluZm9bemlwX3BhdGhdKQoKICAgICAgICBpZiBub3QgV1JJVEVfU1VQUE9SVDoKICAgICAgICAgICAgcmFpc2UgSU9FcnJvcignIm9zLnJlbmFtZSIgYW5kICJvcy51bmxpbmsiIGFyZSBub3Qgc3VwcG9ydGVkICcKICAgICAgICAgICAgICAgICAgICAgICAgICAnb24gdGhpcyBwbGF0Zm9ybScpCiAgICAgICAgdHJ5OgoKICAgICAgICAgICAgcmVhbF9wYXRoID0gbWFuYWdlci5nZXRfY2FjaGVfcGF0aCgKICAgICAgICAgICAgICAgIHNlbGYuZWdnX25hbWUsIHNlbGYuX3BhcnRzKHppcF9wYXRoKQogICAgICAgICAgICApCgogICAgICAgICAgICBpZiBzZWxmLl9pc19jdXJyZW50KHJlYWxfcGF0aCwgemlwX3BhdGgpOgogICAgICAgICAgICAgICAgcmV0dXJuIHJlYWxfcGF0aAoKICAgICAgICAgICAgb3V0ZiwgdG1wbmFtID0gX21rc3RlbXAoCiAgICAgICAgICAgICAgICAiLiRleHRyYWN0IiwKICAgICAgICAgICAgICAgIGRpcj1vcy5wYXRoLmRpcm5hbWUocmVhbF9wYXRoKSwKICAgICAgICAgICAgKQogICAgICAgICAgICBvcy53cml0ZShvdXRmLCBzZWxmLmxvYWRlci5nZXRfZGF0YSh6aXBfcGF0aCkpCiAgICAgICAgICAgIG9zLmNsb3NlKG91dGYpCiAgICAgICAgICAgIHV0aW1lKHRtcG5hbSwgKHRpbWVzdGFtcCwgdGltZXN0YW1wKSkKICAgICAgICAgICAgbWFuYWdlci5wb3N0cHJvY2Vzcyh0bXBuYW0sIHJlYWxfcGF0aCkKCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJlbmFtZSh0bXBuYW0sIHJlYWxfcGF0aCkKCiAgICAgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKHJlYWxfcGF0aCk6CiAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5faXNfY3VycmVudChyZWFsX3BhdGgsIHppcF9wYXRoKToKICAgICAgICAgICAgICAgICAgICAgICAgIyB0aGUgZmlsZSBiZWNhbWUgY3VycmVudCBzaW5jZSBpdCB3YXMgY2hlY2tlZCBhYm92ZSwKICAgICAgICAgICAgICAgICAgICAgICAgIyAgc28gcHJvY2VlZC4KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWxfcGF0aAogICAgICAgICAgICAgICAgICAgICMgV2luZG93cywgZGVsIG9sZCBmaWxlIGFuZCByZXRyeQogICAgICAgICAgICAgICAgICAgIGVsaWYgb3MubmFtZSA9PSAnbnQnOgogICAgICAgICAgICAgICAgICAgICAgICB1bmxpbmsocmVhbF9wYXRoKQogICAgICAgICAgICAgICAgICAgICAgICByZW5hbWUodG1wbmFtLCByZWFsX3BhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFsX3BhdGgKICAgICAgICAgICAgICAgIHJhaXNlCgogICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKICAgICAgICAgICAgIyByZXBvcnQgYSB1c2VyLWZyaWVuZGx5IGVycm9yCiAgICAgICAgICAgIG1hbmFnZXIuZXh0cmFjdGlvbl9lcnJvcigpCgogICAgICAgIHJldHVybiByZWFsX3BhdGgKCiAgICBkZWYgX2lzX2N1cnJlbnQoc2VsZiwgZmlsZV9wYXRoLCB6aXBfcGF0aCk6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIFRydWUgaWYgdGhlIGZpbGVfcGF0aCBpcyBjdXJyZW50IGZvciB0aGlzIHppcF9wYXRoCiAgICAgICAgIiIiCiAgICAgICAgdGltZXN0YW1wLCBzaXplID0gc2VsZi5fZ2V0X2RhdGVfYW5kX3NpemUoc2VsZi56aXBpbmZvW3ppcF9wYXRoXSkKICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2ZpbGUoZmlsZV9wYXRoKToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgc3RhdCA9IG9zLnN0YXQoZmlsZV9wYXRoKQogICAgICAgIGlmIHN0YXQuc3Rfc2l6ZSAhPSBzaXplIG9yIHN0YXQuc3RfbXRpbWUgIT0gdGltZXN0YW1wOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAjIGNoZWNrIHRoYXQgdGhlIGNvbnRlbnRzIG1hdGNoCiAgICAgICAgemlwX2NvbnRlbnRzID0gc2VsZi5sb2FkZXIuZ2V0X2RhdGEoemlwX3BhdGgpCiAgICAgICAgd2l0aCBvcGVuKGZpbGVfcGF0aCwgJ3JiJykgYXMgZjoKICAgICAgICAgICAgZmlsZV9jb250ZW50cyA9IGYucmVhZCgpCiAgICAgICAgcmV0dXJuIHppcF9jb250ZW50cyA9PSBmaWxlX2NvbnRlbnRzCgogICAgZGVmIF9nZXRfZWFnZXJfcmVzb3VyY2VzKHNlbGYpOgogICAgICAgIGlmIHNlbGYuZWFnZXJzIGlzIE5vbmU6CiAgICAgICAgICAgIGVhZ2VycyA9IFtdCiAgICAgICAgICAgIGZvciBuYW1lIGluICgnbmF0aXZlX2xpYnMudHh0JywgJ2VhZ2VyX3Jlc291cmNlcy50eHQnKToKICAgICAgICAgICAgICAgIGlmIHNlbGYuaGFzX21ldGFkYXRhKG5hbWUpOgogICAgICAgICAgICAgICAgICAgIGVhZ2Vycy5leHRlbmQoc2VsZi5nZXRfbWV0YWRhdGFfbGluZXMobmFtZSkpCiAgICAgICAgICAgIHNlbGYuZWFnZXJzID0gZWFnZXJzCiAgICAgICAgcmV0dXJuIHNlbGYuZWFnZXJzCgogICAgZGVmIF9pbmRleChzZWxmKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9kaXJpbmRleAogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgaW5kID0ge30KICAgICAgICAgICAgZm9yIHBhdGggaW4gc2VsZi56aXBpbmZvOgogICAgICAgICAgICAgICAgcGFydHMgPSBwYXRoLnNwbGl0KG9zLnNlcCkKICAgICAgICAgICAgICAgIHdoaWxlIHBhcnRzOgogICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IG9zLnNlcC5qb2luKHBhcnRzWzotMV0pCiAgICAgICAgICAgICAgICAgICAgaWYgcGFyZW50IGluIGluZDoKICAgICAgICAgICAgICAgICAgICAgICAgaW5kW3BhcmVudF0uYXBwZW5kKHBhcnRzWy0xXSkKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBpbmRbcGFyZW50XSA9IFtwYXJ0cy5wb3AoKV0KICAgICAgICAgICAgc2VsZi5fZGlyaW5kZXggPSBpbmQKICAgICAgICAgICAgcmV0dXJuIGluZAoKICAgIGRlZiBfaGFzKHNlbGYsIGZzcGF0aCk6CiAgICAgICAgemlwX3BhdGggPSBzZWxmLl96aXBpbmZvX25hbWUoZnNwYXRoKQogICAgICAgIHJldHVybiB6aXBfcGF0aCBpbiBzZWxmLnppcGluZm8gb3IgemlwX3BhdGggaW4gc2VsZi5faW5kZXgoKQoKICAgIGRlZiBfaXNkaXIoc2VsZiwgZnNwYXRoKToKICAgICAgICByZXR1cm4gc2VsZi5femlwaW5mb19uYW1lKGZzcGF0aCkgaW4gc2VsZi5faW5kZXgoKQoKICAgIGRlZiBfbGlzdGRpcihzZWxmLCBmc3BhdGgpOgogICAgICAgIHJldHVybiBsaXN0KHNlbGYuX2luZGV4KCkuZ2V0KHNlbGYuX3ppcGluZm9fbmFtZShmc3BhdGgpLCAoKSkpCgogICAgZGVmIF9lYWdlcl90b196aXAoc2VsZiwgcmVzb3VyY2VfbmFtZSk6CiAgICAgICAgcmV0dXJuIHNlbGYuX3ppcGluZm9fbmFtZShzZWxmLl9mbihzZWxmLmVnZ19yb290LCByZXNvdXJjZV9uYW1lKSkKCiAgICBkZWYgX3Jlc291cmNlX3RvX3ppcChzZWxmLCByZXNvdXJjZV9uYW1lKToKICAgICAgICByZXR1cm4gc2VsZi5femlwaW5mb19uYW1lKHNlbGYuX2ZuKHNlbGYubW9kdWxlX3BhdGgsIHJlc291cmNlX25hbWUpKQoKCnJlZ2lzdGVyX2xvYWRlcl90eXBlKHppcGltcG9ydC56aXBpbXBvcnRlciwgWmlwUHJvdmlkZXIpCgoKY2xhc3MgRmlsZU1ldGFkYXRhKEVtcHR5UHJvdmlkZXIpOgogICAgIiIiTWV0YWRhdGEgaGFuZGxlciBmb3Igc3RhbmRhbG9uZSBQS0ctSU5GTyBmaWxlcwoKICAgIFVzYWdlOjoKCiAgICAgICAgbWV0YWRhdGEgPSBGaWxlTWV0YWRhdGEoIi9wYXRoL3RvL1BLRy1JTkZPIikKCiAgICBUaGlzIHByb3ZpZGVyIHJlamVjdHMgYWxsIGRhdGEgYW5kIG1ldGFkYXRhIHJlcXVlc3RzIGV4Y2VwdCBmb3IgUEtHLUlORk8sCiAgICB3aGljaCBpcyB0cmVhdGVkIGFzIGV4aXN0aW5nLCBhbmQgd2lsbCBiZSB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUgYXQKICAgIHRoZSBwcm92aWRlZCBsb2NhdGlvbi4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoKToKICAgICAgICBzZWxmLnBhdGggPSBwYXRoCgogICAgZGVmIGhhc19tZXRhZGF0YShzZWxmLCBuYW1lKToKICAgICAgICByZXR1cm4gbmFtZSA9PSAnUEtHLUlORk8nIGFuZCBvcy5wYXRoLmlzZmlsZShzZWxmLnBhdGgpCgogICAgZGVmIGdldF9tZXRhZGF0YShzZWxmLCBuYW1lKToKICAgICAgICBpZiBuYW1lICE9ICdQS0ctSU5GTyc6CiAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCJObyBtZXRhZGF0YSBleGNlcHQgUEtHLUlORk8gaXMgYXZhaWxhYmxlIikKCiAgICAgICAgd2l0aCBpby5vcGVuKHNlbGYucGF0aCwgZW5jb2Rpbmc9J3V0Zi04JywgZXJyb3JzPSJyZXBsYWNlIikgYXMgZjoKICAgICAgICAgICAgbWV0YWRhdGEgPSBmLnJlYWQoKQogICAgICAgIHNlbGYuX3dhcm5fb25fcmVwbGFjZW1lbnQobWV0YWRhdGEpCiAgICAgICAgcmV0dXJuIG1ldGFkYXRhCgogICAgZGVmIF93YXJuX29uX3JlcGxhY2VtZW50KHNlbGYsIG1ldGFkYXRhKToKICAgICAgICAjIFB5dGhvbiAyLjcgY29tcGF0IGZvcjogcmVwbGFjZW1lbnRfY2hhciA9ICfvv70nCiAgICAgICAgcmVwbGFjZW1lbnRfY2hhciA9IGInXHhlZlx4YmZceGJkJy5kZWNvZGUoJ3V0Zi04JykKICAgICAgICBpZiByZXBsYWNlbWVudF9jaGFyIGluIG1ldGFkYXRhOgogICAgICAgICAgICB0bXBsID0gIntzZWxmLnBhdGh9IGNvdWxkIG5vdCBiZSBwcm9wZXJseSBkZWNvZGVkIGluIFVURi04IgogICAgICAgICAgICBtc2cgPSB0bXBsLmZvcm1hdCgqKmxvY2FscygpKQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKG1zZykKCiAgICBkZWYgZ2V0X21ldGFkYXRhX2xpbmVzKHNlbGYsIG5hbWUpOgogICAgICAgIHJldHVybiB5aWVsZF9saW5lcyhzZWxmLmdldF9tZXRhZGF0YShuYW1lKSkKCgpjbGFzcyBQYXRoTWV0YWRhdGEoRGVmYXVsdFByb3ZpZGVyKToKICAgICIiIk1ldGFkYXRhIHByb3ZpZGVyIGZvciBlZ2cgZGlyZWN0b3JpZXMKCiAgICBVc2FnZTo6CgogICAgICAgICMgRGV2ZWxvcG1lbnQgZWdnczoKCiAgICAgICAgZWdnX2luZm8gPSAiL3BhdGgvdG8vUGFja2FnZU5hbWUuZWdnLWluZm8iCiAgICAgICAgYmFzZV9kaXIgPSBvcy5wYXRoLmRpcm5hbWUoZWdnX2luZm8pCiAgICAgICAgbWV0YWRhdGEgPSBQYXRoTWV0YWRhdGEoYmFzZV9kaXIsIGVnZ19pbmZvKQogICAgICAgIGRpc3RfbmFtZSA9IG9zLnBhdGguc3BsaXRleHQob3MucGF0aC5iYXNlbmFtZShlZ2dfaW5mbykpWzBdCiAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbihiYXNlZGlyLCBwcm9qZWN0X25hbWU9ZGlzdF9uYW1lLCBtZXRhZGF0YT1tZXRhZGF0YSkKCiAgICAgICAgIyBVbnBhY2tlZCBlZ2cgZGlyZWN0b3JpZXM6CgogICAgICAgIGVnZ19wYXRoID0gIi9wYXRoL3RvL1BhY2thZ2VOYW1lLXZlci1weXZlci1ldGMuZWdnIgogICAgICAgIG1ldGFkYXRhID0gUGF0aE1ldGFkYXRhKGVnZ19wYXRoLCBvcy5wYXRoLmpvaW4oZWdnX3BhdGgsJ0VHRy1JTkZPJykpCiAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbi5mcm9tX2ZpbGVuYW1lKGVnZ19wYXRoLCBtZXRhZGF0YT1tZXRhZGF0YSkKICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoLCBlZ2dfaW5mbyk6CiAgICAgICAgc2VsZi5tb2R1bGVfcGF0aCA9IHBhdGgKICAgICAgICBzZWxmLmVnZ19pbmZvID0gZWdnX2luZm8KCgpjbGFzcyBFZ2dNZXRhZGF0YShaaXBQcm92aWRlcik6CiAgICAiIiJNZXRhZGF0YSBwcm92aWRlciBmb3IgLmVnZyBmaWxlcyIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpbXBvcnRlcik6CiAgICAgICAgIiIiQ3JlYXRlIGEgbWV0YWRhdGEgcHJvdmlkZXIgZnJvbSBhIHppcGltcG9ydGVyIiIiCgogICAgICAgIHNlbGYuemlwX3ByZSA9IGltcG9ydGVyLmFyY2hpdmUgKyBvcy5zZXAKICAgICAgICBzZWxmLmxvYWRlciA9IGltcG9ydGVyCiAgICAgICAgaWYgaW1wb3J0ZXIucHJlZml4OgogICAgICAgICAgICBzZWxmLm1vZHVsZV9wYXRoID0gb3MucGF0aC5qb2luKGltcG9ydGVyLmFyY2hpdmUsIGltcG9ydGVyLnByZWZpeCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLm1vZHVsZV9wYXRoID0gaW1wb3J0ZXIuYXJjaGl2ZQogICAgICAgIHNlbGYuX3NldHVwX3ByZWZpeCgpCgoKX2RlY2xhcmVfc3RhdGUoJ2RpY3QnLCBfZGlzdHJpYnV0aW9uX2ZpbmRlcnM9e30pCgoKZGVmIHJlZ2lzdGVyX2ZpbmRlcihpbXBvcnRlcl90eXBlLCBkaXN0cmlidXRpb25fZmluZGVyKToKICAgICIiIlJlZ2lzdGVyIGBkaXN0cmlidXRpb25fZmluZGVyYCB0byBmaW5kIGRpc3RyaWJ1dGlvbnMgaW4gc3lzLnBhdGggaXRlbXMKCiAgICBgaW1wb3J0ZXJfdHlwZWAgaXMgdGhlIHR5cGUgb3IgY2xhc3Mgb2YgYSBQRVAgMzAyICJJbXBvcnRlciIgKHN5cy5wYXRoIGl0ZW0KICAgIGhhbmRsZXIpLCBhbmQgYGRpc3RyaWJ1dGlvbl9maW5kZXJgIGlzIGEgY2FsbGFibGUgdGhhdCwgcGFzc2VkIGEgcGF0aAogICAgaXRlbSBhbmQgdGhlIGltcG9ydGVyIGluc3RhbmNlLCB5aWVsZHMgYGBEaXN0cmlidXRpb25gYCBpbnN0YW5jZXMgZm91bmQgb24KICAgIHRoYXQgcGF0aCBpdGVtLiAgU2VlIGBgcGtnX3Jlc291cmNlcy5maW5kX29uX3BhdGhgYCBmb3IgYW4gZXhhbXBsZS4iIiIKICAgIF9kaXN0cmlidXRpb25fZmluZGVyc1tpbXBvcnRlcl90eXBlXSA9IGRpc3RyaWJ1dGlvbl9maW5kZXIKCgpkZWYgZmluZF9kaXN0cmlidXRpb25zKHBhdGhfaXRlbSwgb25seT1GYWxzZSk6CiAgICAiIiJZaWVsZCBkaXN0cmlidXRpb25zIGFjY2Vzc2libGUgdmlhIGBwYXRoX2l0ZW1gIiIiCiAgICBpbXBvcnRlciA9IGdldF9pbXBvcnRlcihwYXRoX2l0ZW0pCiAgICBmaW5kZXIgPSBfZmluZF9hZGFwdGVyKF9kaXN0cmlidXRpb25fZmluZGVycywgaW1wb3J0ZXIpCiAgICByZXR1cm4gZmluZGVyKGltcG9ydGVyLCBwYXRoX2l0ZW0sIG9ubHkpCgoKZGVmIGZpbmRfZWdnc19pbl96aXAoaW1wb3J0ZXIsIHBhdGhfaXRlbSwgb25seT1GYWxzZSk6CiAgICAiIiIKICAgIEZpbmQgZWdncyBpbiB6aXAgZmlsZXM7IHBvc3NpYmx5IG11bHRpcGxlIG5lc3RlZCBlZ2dzLgogICAgIiIiCiAgICBpZiBpbXBvcnRlci5hcmNoaXZlLmVuZHN3aXRoKCcud2hsJyk6CiAgICAgICAgIyB3aGVlbHMgYXJlIG5vdCBzdXBwb3J0ZWQgd2l0aCB0aGlzIGZpbmRlcgogICAgICAgICMgdGhleSBkb24ndCBoYXZlIFBLRy1JTkZPIG1ldGFkYXRhLCBhbmQgd29uJ3QgZXZlciBjb250YWluIGVnZ3MKICAgICAgICByZXR1cm4KICAgIG1ldGFkYXRhID0gRWdnTWV0YWRhdGEoaW1wb3J0ZXIpCiAgICBpZiBtZXRhZGF0YS5oYXNfbWV0YWRhdGEoJ1BLRy1JTkZPJyk6CiAgICAgICAgeWllbGQgRGlzdHJpYnV0aW9uLmZyb21fZmlsZW5hbWUocGF0aF9pdGVtLCBtZXRhZGF0YT1tZXRhZGF0YSkKICAgIGlmIG9ubHk6CiAgICAgICAgIyBkb24ndCB5aWVsZCBuZXN0ZWQgZGlzdHJvcwogICAgICAgIHJldHVybgogICAgZm9yIHN1Yml0ZW0gaW4gbWV0YWRhdGEucmVzb3VyY2VfbGlzdGRpcignLycpOgogICAgICAgIGlmIF9pc19lZ2dfcGF0aChzdWJpdGVtKToKICAgICAgICAgICAgc3VicGF0aCA9IG9zLnBhdGguam9pbihwYXRoX2l0ZW0sIHN1Yml0ZW0pCiAgICAgICAgICAgIGRpc3RzID0gZmluZF9lZ2dzX2luX3ppcCh6aXBpbXBvcnQuemlwaW1wb3J0ZXIoc3VicGF0aCksIHN1YnBhdGgpCiAgICAgICAgICAgIGZvciBkaXN0IGluIGRpc3RzOgogICAgICAgICAgICAgICAgeWllbGQgZGlzdAogICAgICAgIGVsaWYgc3ViaXRlbS5sb3dlcigpLmVuZHN3aXRoKCcuZGlzdC1pbmZvJyk6CiAgICAgICAgICAgIHN1YnBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aF9pdGVtLCBzdWJpdGVtKQogICAgICAgICAgICBzdWJtZXRhID0gRWdnTWV0YWRhdGEoemlwaW1wb3J0LnppcGltcG9ydGVyKHN1YnBhdGgpKQogICAgICAgICAgICBzdWJtZXRhLmVnZ19pbmZvID0gc3VicGF0aAogICAgICAgICAgICB5aWVsZCBEaXN0cmlidXRpb24uZnJvbV9sb2NhdGlvbihwYXRoX2l0ZW0sIHN1Yml0ZW0sIHN1Ym1ldGEpCgoKcmVnaXN0ZXJfZmluZGVyKHppcGltcG9ydC56aXBpbXBvcnRlciwgZmluZF9lZ2dzX2luX3ppcCkKCgpkZWYgZmluZF9ub3RoaW5nKGltcG9ydGVyLCBwYXRoX2l0ZW0sIG9ubHk9RmFsc2UpOgogICAgcmV0dXJuICgpCgoKcmVnaXN0ZXJfZmluZGVyKG9iamVjdCwgZmluZF9ub3RoaW5nKQoKCmRlZiBfYnlfdmVyc2lvbl9kZXNjZW5kaW5nKG5hbWVzKToKICAgICIiIgogICAgR2l2ZW4gYSBsaXN0IG9mIGZpbGVuYW1lcywgcmV0dXJuIHRoZW0gaW4gZGVzY2VuZGluZyBvcmRlcgogICAgYnkgdmVyc2lvbiBudW1iZXIuCgogICAgPj4+IG5hbWVzID0gJ2JhcicsICdmb28nLCAnUHl0aG9uLTIuNy4xMC5lZ2cnLCAnUHl0aG9uLTIuNy4yLmVnZycKICAgID4+PiBfYnlfdmVyc2lvbl9kZXNjZW5kaW5nKG5hbWVzKQogICAgWydQeXRob24tMi43LjEwLmVnZycsICdQeXRob24tMi43LjIuZWdnJywgJ2ZvbycsICdiYXInXQogICAgPj4+IG5hbWVzID0gJ1NldHVwdG9vbHMtMS4yLjNiMS5lZ2cnLCAnU2V0dXB0b29scy0xLjIuMy5lZ2cnCiAgICA+Pj4gX2J5X3ZlcnNpb25fZGVzY2VuZGluZyhuYW1lcykKICAgIFsnU2V0dXB0b29scy0xLjIuMy5lZ2cnLCAnU2V0dXB0b29scy0xLjIuM2IxLmVnZyddCiAgICA+Pj4gbmFtZXMgPSAnU2V0dXB0b29scy0xLjIuM2IxLmVnZycsICdTZXR1cHRvb2xzLTEuMi4zLnBvc3QxLmVnZycKICAgID4+PiBfYnlfdmVyc2lvbl9kZXNjZW5kaW5nKG5hbWVzKQogICAgWydTZXR1cHRvb2xzLTEuMi4zLnBvc3QxLmVnZycsICdTZXR1cHRvb2xzLTEuMi4zYjEuZWdnJ10KICAgICIiIgogICAgZGVmIF9ieV92ZXJzaW9uKG5hbWUpOgogICAgICAgICIiIgogICAgICAgIFBhcnNlIGVhY2ggY29tcG9uZW50IG9mIHRoZSBmaWxlbmFtZQogICAgICAgICIiIgogICAgICAgIG5hbWUsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQobmFtZSkKICAgICAgICBwYXJ0cyA9IGl0ZXJ0b29scy5jaGFpbihuYW1lLnNwbGl0KCctJyksIFtleHRdKQogICAgICAgIHJldHVybiBbcGFja2FnaW5nLnZlcnNpb24ucGFyc2UocGFydCkgZm9yIHBhcnQgaW4gcGFydHNdCgogICAgcmV0dXJuIHNvcnRlZChuYW1lcywga2V5PV9ieV92ZXJzaW9uLCByZXZlcnNlPVRydWUpCgoKZGVmIGZpbmRfb25fcGF0aChpbXBvcnRlciwgcGF0aF9pdGVtLCBvbmx5PUZhbHNlKToKICAgICIiIllpZWxkIGRpc3RyaWJ1dGlvbnMgYWNjZXNzaWJsZSBvbiBhIHN5cy5wYXRoIGRpcmVjdG9yeSIiIgogICAgcGF0aF9pdGVtID0gX25vcm1hbGl6ZV9jYWNoZWQocGF0aF9pdGVtKQoKICAgIGlmIF9pc191bnBhY2tlZF9lZ2cocGF0aF9pdGVtKToKICAgICAgICB5aWVsZCBEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZSgKICAgICAgICAgICAgcGF0aF9pdGVtLCBtZXRhZGF0YT1QYXRoTWV0YWRhdGEoCiAgICAgICAgICAgICAgICBwYXRoX2l0ZW0sIG9zLnBhdGguam9pbihwYXRoX2l0ZW0sICdFR0ctSU5GTycpCiAgICAgICAgICAgICkKICAgICAgICApCiAgICAgICAgcmV0dXJuCgogICAgZW50cmllcyA9IHNhZmVfbGlzdGRpcihwYXRoX2l0ZW0pCgogICAgIyBmb3IgcGVyZm9ybWFuY2UsIGJlZm9yZSBzb3J0aW5nIGJ5IHZlcnNpb24sCiAgICAjIHNjcmVlbiBlbnRyaWVzIGZvciBvbmx5IHRob3NlIHRoYXQgd2lsbCB5aWVsZAogICAgIyBkaXN0cmlidXRpb25zCiAgICBmaWx0ZXJlZCA9ICgKICAgICAgICBlbnRyeQogICAgICAgIGZvciBlbnRyeSBpbiBlbnRyaWVzCiAgICAgICAgaWYgZGlzdF9mYWN0b3J5KHBhdGhfaXRlbSwgZW50cnksIG9ubHkpCiAgICApCgogICAgIyBzY2FuIGZvciAuZWdnIGFuZCAuZWdnLWluZm8gaW4gZGlyZWN0b3J5CiAgICBwYXRoX2l0ZW1fZW50cmllcyA9IF9ieV92ZXJzaW9uX2Rlc2NlbmRpbmcoZmlsdGVyZWQpCiAgICBmb3IgZW50cnkgaW4gcGF0aF9pdGVtX2VudHJpZXM6CiAgICAgICAgZnVsbHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aF9pdGVtLCBlbnRyeSkKICAgICAgICBmYWN0b3J5ID0gZGlzdF9mYWN0b3J5KHBhdGhfaXRlbSwgZW50cnksIG9ubHkpCiAgICAgICAgZm9yIGRpc3QgaW4gZmFjdG9yeShmdWxscGF0aCk6CiAgICAgICAgICAgIHlpZWxkIGRpc3QKCgpkZWYgZGlzdF9mYWN0b3J5KHBhdGhfaXRlbSwgZW50cnksIG9ubHkpOgogICAgIiIiCiAgICBSZXR1cm4gYSBkaXN0X2ZhY3RvcnkgZm9yIGEgcGF0aF9pdGVtIGFuZCBlbnRyeQogICAgIiIiCiAgICBsb3dlciA9IGVudHJ5Lmxvd2VyKCkKICAgIGlzX21ldGEgPSBhbnkobWFwKGxvd2VyLmVuZHN3aXRoLCAoJy5lZ2ctaW5mbycsICcuZGlzdC1pbmZvJykpKQogICAgcmV0dXJuICgKICAgICAgICBkaXN0cmlidXRpb25zX2Zyb21fbWV0YWRhdGEKICAgICAgICBpZiBpc19tZXRhIGVsc2UKICAgICAgICBmaW5kX2Rpc3RyaWJ1dGlvbnMKICAgICAgICBpZiBub3Qgb25seSBhbmQgX2lzX2VnZ19wYXRoKGVudHJ5KSBlbHNlCiAgICAgICAgcmVzb2x2ZV9lZ2dfbGluawogICAgICAgIGlmIG5vdCBvbmx5IGFuZCBsb3dlci5lbmRzd2l0aCgnLmVnZy1saW5rJykgZWxzZQogICAgICAgIE5vRGlzdHMoKQogICAgKQoKCmNsYXNzIE5vRGlzdHM6CiAgICAiIiIKICAgID4+PiBib29sKE5vRGlzdHMoKSkKICAgIEZhbHNlCgogICAgPj4+IGxpc3QoTm9EaXN0cygpKCdhbnl0aGluZycpKQogICAgW10KICAgICIiIgogICAgZGVmIF9fYm9vbF9fKHNlbGYpOgogICAgICAgIHJldHVybiBGYWxzZQogICAgaWYgc2l4LlBZMjoKICAgICAgICBfX25vbnplcm9fXyA9IF9fYm9vbF9fCgogICAgZGVmIF9fY2FsbF9fKHNlbGYsIGZ1bGxwYXRoKToKICAgICAgICByZXR1cm4gaXRlcigoKSkKCgpkZWYgc2FmZV9saXN0ZGlyKHBhdGgpOgogICAgIiIiCiAgICBBdHRlbXB0IHRvIGxpc3QgY29udGVudHMgb2YgcGF0aCwgYnV0IHN1cHByZXNzIHNvbWUgZXhjZXB0aW9ucy4KICAgICIiIgogICAgdHJ5OgogICAgICAgIHJldHVybiBvcy5saXN0ZGlyKHBhdGgpCiAgICBleGNlcHQgKFBlcm1pc3Npb25FcnJvciwgTm90QURpcmVjdG9yeUVycm9yKToKICAgICAgICBwYXNzCiAgICBleGNlcHQgT1NFcnJvciBhcyBlOgogICAgICAgICMgSWdub3JlIHRoZSBkaXJlY3RvcnkgaWYgZG9lcyBub3QgZXhpc3QsIG5vdCBhIGRpcmVjdG9yeSBvcgogICAgICAgICMgcGVybWlzc2lvbiBkZW5pZWQKICAgICAgICBpZ25vcmFibGUgPSAoCiAgICAgICAgICAgIGUuZXJybm8gaW4gKGVycm5vLkVOT1RESVIsIGVycm5vLkVBQ0NFUywgZXJybm8uRU5PRU5UKQogICAgICAgICAgICAjIFB5dGhvbiAyIG9uIFdpbmRvd3MgbmVlZHMgdG8gYmUgaGFuZGxlZCB0aGlzIHdheSA6KAogICAgICAgICAgICBvciBnZXRhdHRyKGUsICJ3aW5lcnJvciIsIE5vbmUpID09IDI2NwogICAgICAgICkKICAgICAgICBpZiBub3QgaWdub3JhYmxlOgogICAgICAgICAgICByYWlzZQogICAgcmV0dXJuICgpCgoKZGVmIGRpc3RyaWJ1dGlvbnNfZnJvbV9tZXRhZGF0YShwYXRoKToKICAgIHJvb3QgPSBvcy5wYXRoLmRpcm5hbWUocGF0aCkKICAgIGlmIG9zLnBhdGguaXNkaXIocGF0aCk6CiAgICAgICAgaWYgbGVuKG9zLmxpc3RkaXIocGF0aCkpID09IDA6CiAgICAgICAgICAgICMgZW1wdHkgbWV0YWRhdGEgZGlyOyBza2lwCiAgICAgICAgICAgIHJldHVybgogICAgICAgIG1ldGFkYXRhID0gUGF0aE1ldGFkYXRhKHJvb3QsIHBhdGgpCiAgICBlbHNlOgogICAgICAgIG1ldGFkYXRhID0gRmlsZU1ldGFkYXRhKHBhdGgpCiAgICBlbnRyeSA9IG9zLnBhdGguYmFzZW5hbWUocGF0aCkKICAgIHlpZWxkIERpc3RyaWJ1dGlvbi5mcm9tX2xvY2F0aW9uKAogICAgICAgIHJvb3QsIGVudHJ5LCBtZXRhZGF0YSwgcHJlY2VkZW5jZT1ERVZFTE9QX0RJU1QsCiAgICApCgoKZGVmIG5vbl9lbXB0eV9saW5lcyhwYXRoKToKICAgICIiIgogICAgWWllbGQgbm9uLWVtcHR5IGxpbmVzIGZyb20gZmlsZSBhdCBwYXRoCiAgICAiIiIKICAgIHdpdGggb3BlbihwYXRoKSBhcyBmOgogICAgICAgIGZvciBsaW5lIGluIGY6CiAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKICAgICAgICAgICAgaWYgbGluZToKICAgICAgICAgICAgICAgIHlpZWxkIGxpbmUKCgpkZWYgcmVzb2x2ZV9lZ2dfbGluayhwYXRoKToKICAgICIiIgogICAgR2l2ZW4gYSBwYXRoIHRvIGFuIC5lZ2ctbGluaywgcmVzb2x2ZSBkaXN0cmlidXRpb25zCiAgICBwcmVzZW50IGluIHRoZSByZWZlcmVuY2VkIHBhdGguCiAgICAiIiIKICAgIHJlZmVyZW5jZWRfcGF0aHMgPSBub25fZW1wdHlfbGluZXMocGF0aCkKICAgIHJlc29sdmVkX3BhdGhzID0gKAogICAgICAgIG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUocGF0aCksIHJlZikKICAgICAgICBmb3IgcmVmIGluIHJlZmVyZW5jZWRfcGF0aHMKICAgICkKICAgIGRpc3RfZ3JvdXBzID0gbWFwKGZpbmRfZGlzdHJpYnV0aW9ucywgcmVzb2x2ZWRfcGF0aHMpCiAgICByZXR1cm4gbmV4dChkaXN0X2dyb3VwcywgKCkpCgoKcmVnaXN0ZXJfZmluZGVyKHBrZ3V0aWwuSW1wSW1wb3J0ZXIsIGZpbmRfb25fcGF0aCkKCmlmIGhhc2F0dHIoaW1wb3J0bGliX21hY2hpbmVyeSwgJ0ZpbGVGaW5kZXInKToKICAgIHJlZ2lzdGVyX2ZpbmRlcihpbXBvcnRsaWJfbWFjaGluZXJ5LkZpbGVGaW5kZXIsIGZpbmRfb25fcGF0aCkKCl9kZWNsYXJlX3N0YXRlKCdkaWN0JywgX25hbWVzcGFjZV9oYW5kbGVycz17fSkKX2RlY2xhcmVfc3RhdGUoJ2RpY3QnLCBfbmFtZXNwYWNlX3BhY2thZ2VzPXt9KQoKCmRlZiByZWdpc3Rlcl9uYW1lc3BhY2VfaGFuZGxlcihpbXBvcnRlcl90eXBlLCBuYW1lc3BhY2VfaGFuZGxlcik6CiAgICAiIiJSZWdpc3RlciBgbmFtZXNwYWNlX2hhbmRsZXJgIHRvIGRlY2xhcmUgbmFtZXNwYWNlIHBhY2thZ2VzCgogICAgYGltcG9ydGVyX3R5cGVgIGlzIHRoZSB0eXBlIG9yIGNsYXNzIG9mIGEgUEVQIDMwMiAiSW1wb3J0ZXIiIChzeXMucGF0aCBpdGVtCiAgICBoYW5kbGVyKSwgYW5kIGBuYW1lc3BhY2VfaGFuZGxlcmAgaXMgYSBjYWxsYWJsZSBsaWtlIHRoaXM6OgoKICAgICAgICBkZWYgbmFtZXNwYWNlX2hhbmRsZXIoaW1wb3J0ZXIsIHBhdGhfZW50cnksIG1vZHVsZU5hbWUsIG1vZHVsZSk6CiAgICAgICAgICAgICMgcmV0dXJuIGEgcGF0aF9lbnRyeSB0byB1c2UgZm9yIGNoaWxkIHBhY2thZ2VzCgogICAgTmFtZXNwYWNlIGhhbmRsZXJzIGFyZSBvbmx5IGNhbGxlZCBpZiB0aGUgaW1wb3J0ZXIgb2JqZWN0IGhhcyBhbHJlYWR5CiAgICBhZ3JlZWQgdGhhdCBpdCBjYW4gaGFuZGxlIHRoZSByZWxldmFudCBwYXRoIGl0ZW0sIGFuZCB0aGV5IHNob3VsZCBvbmx5CiAgICByZXR1cm4gYSBzdWJwYXRoIGlmIHRoZSBtb2R1bGUgX19wYXRoX18gZG9lcyBub3QgYWxyZWFkeSBjb250YWluIGFuCiAgICBlcXVpdmFsZW50IHN1YnBhdGguICBGb3IgYW4gZXhhbXBsZSBuYW1lc3BhY2UgaGFuZGxlciwgc2VlCiAgICBgYHBrZ19yZXNvdXJjZXMuZmlsZV9uc19oYW5kbGVyYGAuCiAgICAiIiIKICAgIF9uYW1lc3BhY2VfaGFuZGxlcnNbaW1wb3J0ZXJfdHlwZV0gPSBuYW1lc3BhY2VfaGFuZGxlcgoKCmRlZiBfaGFuZGxlX25zKHBhY2thZ2VOYW1lLCBwYXRoX2l0ZW0pOgogICAgIiIiRW5zdXJlIHRoYXQgbmFtZWQgcGFja2FnZSBpbmNsdWRlcyBhIHN1YnBhdGggb2YgcGF0aF9pdGVtIChpZiBuZWVkZWQpIiIiCgogICAgaW1wb3J0ZXIgPSBnZXRfaW1wb3J0ZXIocGF0aF9pdGVtKQogICAgaWYgaW1wb3J0ZXIgaXMgTm9uZToKICAgICAgICByZXR1cm4gTm9uZQogICAgbG9hZGVyID0gaW1wb3J0ZXIuZmluZF9tb2R1bGUocGFja2FnZU5hbWUpCiAgICBpZiBsb2FkZXIgaXMgTm9uZToKICAgICAgICByZXR1cm4gTm9uZQogICAgbW9kdWxlID0gc3lzLm1vZHVsZXMuZ2V0KHBhY2thZ2VOYW1lKQogICAgaWYgbW9kdWxlIGlzIE5vbmU6CiAgICAgICAgbW9kdWxlID0gc3lzLm1vZHVsZXNbcGFja2FnZU5hbWVdID0gdHlwZXMuTW9kdWxlVHlwZShwYWNrYWdlTmFtZSkKICAgICAgICBtb2R1bGUuX19wYXRoX18gPSBbXQogICAgICAgIF9zZXRfcGFyZW50X25zKHBhY2thZ2VOYW1lKQogICAgZWxpZiBub3QgaGFzYXR0cihtb2R1bGUsICdfX3BhdGhfXycpOgogICAgICAgIHJhaXNlIFR5cGVFcnJvcigiTm90IGEgcGFja2FnZToiLCBwYWNrYWdlTmFtZSkKICAgIGhhbmRsZXIgPSBfZmluZF9hZGFwdGVyKF9uYW1lc3BhY2VfaGFuZGxlcnMsIGltcG9ydGVyKQogICAgc3VicGF0aCA9IGhhbmRsZXIoaW1wb3J0ZXIsIHBhdGhfaXRlbSwgcGFja2FnZU5hbWUsIG1vZHVsZSkKICAgIGlmIHN1YnBhdGggaXMgbm90IE5vbmU6CiAgICAgICAgcGF0aCA9IG1vZHVsZS5fX3BhdGhfXwogICAgICAgIHBhdGguYXBwZW5kKHN1YnBhdGgpCiAgICAgICAgbG9hZGVyLmxvYWRfbW9kdWxlKHBhY2thZ2VOYW1lKQogICAgICAgIF9yZWJ1aWxkX21vZF9wYXRoKHBhdGgsIHBhY2thZ2VOYW1lLCBtb2R1bGUpCiAgICByZXR1cm4gc3VicGF0aAoKCmRlZiBfcmVidWlsZF9tb2RfcGF0aChvcmlnX3BhdGgsIHBhY2thZ2VfbmFtZSwgbW9kdWxlKToKICAgICIiIgogICAgUmVidWlsZCBtb2R1bGUuX19wYXRoX18gZW5zdXJpbmcgdGhhdCBhbGwgZW50cmllcyBhcmUgb3JkZXJlZAogICAgY29ycmVzcG9uZGluZyB0byB0aGVpciBzeXMucGF0aCBvcmRlcgogICAgIiIiCiAgICBzeXNfcGF0aCA9IFtfbm9ybWFsaXplX2NhY2hlZChwKSBmb3IgcCBpbiBzeXMucGF0aF0KCiAgICBkZWYgc2FmZV9zeXNfcGF0aF9pbmRleChlbnRyeSk6CiAgICAgICAgIiIiCiAgICAgICAgV29ya2Fyb3VuZCBmb3IgIzUyMCBhbmQgIzUxMy4KICAgICAgICAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzeXNfcGF0aC5pbmRleChlbnRyeSkKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgcmV0dXJuIGZsb2F0KCdpbmYnKQoKICAgIGRlZiBwb3NpdGlvbl9pbl9zeXNfcGF0aChwYXRoKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gdGhlIG9yZGluYWwgb2YgdGhlIHBhdGggYmFzZWQgb24gaXRzIHBvc2l0aW9uIGluIHN5cy5wYXRoCiAgICAgICAgIiIiCiAgICAgICAgcGF0aF9wYXJ0cyA9IHBhdGguc3BsaXQob3Muc2VwKQogICAgICAgIG1vZHVsZV9wYXJ0cyA9IHBhY2thZ2VfbmFtZS5jb3VudCgnLicpICsgMQogICAgICAgIHBhcnRzID0gcGF0aF9wYXJ0c1s6LW1vZHVsZV9wYXJ0c10KICAgICAgICByZXR1cm4gc2FmZV9zeXNfcGF0aF9pbmRleChfbm9ybWFsaXplX2NhY2hlZChvcy5zZXAuam9pbihwYXJ0cykpKQoKICAgIGlmIG5vdCBpc2luc3RhbmNlKG9yaWdfcGF0aCwgbGlzdCk6CiAgICAgICAgIyBJcyB0aGlzIGJlaGF2aW9yIHVzZWZ1bCB3aGVuIG1vZHVsZS5fX3BhdGhfXyBpcyBub3QgYSBsaXN0PwogICAgICAgIHJldHVybgoKICAgIG9yaWdfcGF0aC5zb3J0KGtleT1wb3NpdGlvbl9pbl9zeXNfcGF0aCkKICAgIG1vZHVsZS5fX3BhdGhfX1s6XSA9IFtfbm9ybWFsaXplX2NhY2hlZChwKSBmb3IgcCBpbiBvcmlnX3BhdGhdCgoKZGVmIGRlY2xhcmVfbmFtZXNwYWNlKHBhY2thZ2VOYW1lKToKICAgICIiIkRlY2xhcmUgdGhhdCBwYWNrYWdlICdwYWNrYWdlTmFtZScgaXMgYSBuYW1lc3BhY2UgcGFja2FnZSIiIgoKICAgIF9pbXAuYWNxdWlyZV9sb2NrKCkKICAgIHRyeToKICAgICAgICBpZiBwYWNrYWdlTmFtZSBpbiBfbmFtZXNwYWNlX3BhY2thZ2VzOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgcGF0aCwgcGFyZW50ID0gc3lzLnBhdGgsIE5vbmUKICAgICAgICBpZiAnLicgaW4gcGFja2FnZU5hbWU6CiAgICAgICAgICAgIHBhcmVudCA9ICcuJy5qb2luKHBhY2thZ2VOYW1lLnNwbGl0KCcuJylbOi0xXSkKICAgICAgICAgICAgZGVjbGFyZV9uYW1lc3BhY2UocGFyZW50KQogICAgICAgICAgICBpZiBwYXJlbnQgbm90IGluIF9uYW1lc3BhY2VfcGFja2FnZXM6CiAgICAgICAgICAgICAgICBfX2ltcG9ydF9fKHBhcmVudCkKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcGF0aCA9IHN5cy5tb2R1bGVzW3BhcmVudF0uX19wYXRoX18KICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJOb3QgYSBwYWNrYWdlOiIsIHBhcmVudCkKCiAgICAgICAgIyBUcmFjayB3aGF0IHBhY2thZ2VzIGFyZSBuYW1lc3BhY2VzLCBzbyB3aGVuIG5ldyBwYXRoIGl0ZW1zIGFyZSBhZGRlZCwKICAgICAgICAjIHRoZXkgY2FuIGJlIHVwZGF0ZWQKICAgICAgICBfbmFtZXNwYWNlX3BhY2thZ2VzLnNldGRlZmF1bHQocGFyZW50LCBbXSkuYXBwZW5kKHBhY2thZ2VOYW1lKQogICAgICAgIF9uYW1lc3BhY2VfcGFja2FnZXMuc2V0ZGVmYXVsdChwYWNrYWdlTmFtZSwgW10pCgogICAgICAgIGZvciBwYXRoX2l0ZW0gaW4gcGF0aDoKICAgICAgICAgICAgIyBFbnN1cmUgYWxsIHRoZSBwYXJlbnQncyBwYXRoIGl0ZW1zIGFyZSByZWZsZWN0ZWQgaW4gdGhlIGNoaWxkLAogICAgICAgICAgICAjIGlmIHRoZXkgYXBwbHkKICAgICAgICAgICAgX2hhbmRsZV9ucyhwYWNrYWdlTmFtZSwgcGF0aF9pdGVtKQoKICAgIGZpbmFsbHk6CiAgICAgICAgX2ltcC5yZWxlYXNlX2xvY2soKQoKCmRlZiBmaXh1cF9uYW1lc3BhY2VfcGFja2FnZXMocGF0aF9pdGVtLCBwYXJlbnQ9Tm9uZSk6CiAgICAiIiJFbnN1cmUgdGhhdCBwcmV2aW91c2x5LWRlY2xhcmVkIG5hbWVzcGFjZSBwYWNrYWdlcyBpbmNsdWRlIHBhdGhfaXRlbSIiIgogICAgX2ltcC5hY3F1aXJlX2xvY2soKQogICAgdHJ5OgogICAgICAgIGZvciBwYWNrYWdlIGluIF9uYW1lc3BhY2VfcGFja2FnZXMuZ2V0KHBhcmVudCwgKCkpOgogICAgICAgICAgICBzdWJwYXRoID0gX2hhbmRsZV9ucyhwYWNrYWdlLCBwYXRoX2l0ZW0pCiAgICAgICAgICAgIGlmIHN1YnBhdGg6CiAgICAgICAgICAgICAgICBmaXh1cF9uYW1lc3BhY2VfcGFja2FnZXMoc3VicGF0aCwgcGFja2FnZSkKICAgIGZpbmFsbHk6CiAgICAgICAgX2ltcC5yZWxlYXNlX2xvY2soKQoKCmRlZiBmaWxlX25zX2hhbmRsZXIoaW1wb3J0ZXIsIHBhdGhfaXRlbSwgcGFja2FnZU5hbWUsIG1vZHVsZSk6CiAgICAiIiJDb21wdXRlIGFuIG5zLXBhY2thZ2Ugc3VicGF0aCBmb3IgYSBmaWxlc3lzdGVtIG9yIHppcGZpbGUgaW1wb3J0ZXIiIiIKCiAgICBzdWJwYXRoID0gb3MucGF0aC5qb2luKHBhdGhfaXRlbSwgcGFja2FnZU5hbWUuc3BsaXQoJy4nKVstMV0pCiAgICBub3JtYWxpemVkID0gX25vcm1hbGl6ZV9jYWNoZWQoc3VicGF0aCkKICAgIGZvciBpdGVtIGluIG1vZHVsZS5fX3BhdGhfXzoKICAgICAgICBpZiBfbm9ybWFsaXplX2NhY2hlZChpdGVtKSA9PSBub3JtYWxpemVkOgogICAgICAgICAgICBicmVhawogICAgZWxzZToKICAgICAgICAjIE9ubHkgcmV0dXJuIHRoZSBwYXRoIGlmIGl0J3Mgbm90IGFscmVhZHkgdGhlcmUKICAgICAgICByZXR1cm4gc3VicGF0aAoKCnJlZ2lzdGVyX25hbWVzcGFjZV9oYW5kbGVyKHBrZ3V0aWwuSW1wSW1wb3J0ZXIsIGZpbGVfbnNfaGFuZGxlcikKcmVnaXN0ZXJfbmFtZXNwYWNlX2hhbmRsZXIoemlwaW1wb3J0LnppcGltcG9ydGVyLCBmaWxlX25zX2hhbmRsZXIpCgppZiBoYXNhdHRyKGltcG9ydGxpYl9tYWNoaW5lcnksICdGaWxlRmluZGVyJyk6CiAgICByZWdpc3Rlcl9uYW1lc3BhY2VfaGFuZGxlcihpbXBvcnRsaWJfbWFjaGluZXJ5LkZpbGVGaW5kZXIsIGZpbGVfbnNfaGFuZGxlcikKCgpkZWYgbnVsbF9uc19oYW5kbGVyKGltcG9ydGVyLCBwYXRoX2l0ZW0sIHBhY2thZ2VOYW1lLCBtb2R1bGUpOgogICAgcmV0dXJuIE5vbmUKCgpyZWdpc3Rlcl9uYW1lc3BhY2VfaGFuZGxlcihvYmplY3QsIG51bGxfbnNfaGFuZGxlcikKCgpkZWYgbm9ybWFsaXplX3BhdGgoZmlsZW5hbWUpOgogICAgIiIiTm9ybWFsaXplIGEgZmlsZS9kaXIgbmFtZSBmb3IgY29tcGFyaXNvbiBwdXJwb3NlcyIiIgogICAgcmV0dXJuIG9zLnBhdGgubm9ybWNhc2Uob3MucGF0aC5yZWFscGF0aChmaWxlbmFtZSkpCgoKZGVmIF9ub3JtYWxpemVfY2FjaGVkKGZpbGVuYW1lLCBfY2FjaGU9e30pOgogICAgdHJ5OgogICAgICAgIHJldHVybiBfY2FjaGVbZmlsZW5hbWVdCiAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgX2NhY2hlW2ZpbGVuYW1lXSA9IHJlc3VsdCA9IG5vcm1hbGl6ZV9wYXRoKGZpbGVuYW1lKQogICAgICAgIHJldHVybiByZXN1bHQKCgpkZWYgX2lzX2VnZ19wYXRoKHBhdGgpOgogICAgIiIiCiAgICBEZXRlcm1pbmUgaWYgZ2l2ZW4gcGF0aCBhcHBlYXJzIHRvIGJlIGFuIGVnZy4KICAgICIiIgogICAgcmV0dXJuIHBhdGgubG93ZXIoKS5lbmRzd2l0aCgnLmVnZycpCgoKZGVmIF9pc191bnBhY2tlZF9lZ2cocGF0aCk6CiAgICAiIiIKICAgIERldGVybWluZSBpZiBnaXZlbiBwYXRoIGFwcGVhcnMgdG8gYmUgYW4gdW5wYWNrZWQgZWdnLgogICAgIiIiCiAgICByZXR1cm4gKAogICAgICAgIF9pc19lZ2dfcGF0aChwYXRoKSBhbmQKICAgICAgICBvcy5wYXRoLmlzZmlsZShvcy5wYXRoLmpvaW4ocGF0aCwgJ0VHRy1JTkZPJywgJ1BLRy1JTkZPJykpCiAgICApCgoKZGVmIF9zZXRfcGFyZW50X25zKHBhY2thZ2VOYW1lKToKICAgIHBhcnRzID0gcGFja2FnZU5hbWUuc3BsaXQoJy4nKQogICAgbmFtZSA9IHBhcnRzLnBvcCgpCiAgICBpZiBwYXJ0czoKICAgICAgICBwYXJlbnQgPSAnLicuam9pbihwYXJ0cykKICAgICAgICBzZXRhdHRyKHN5cy5tb2R1bGVzW3BhcmVudF0sIG5hbWUsIHN5cy5tb2R1bGVzW3BhY2thZ2VOYW1lXSkKCgpkZWYgeWllbGRfbGluZXMoc3Rycyk6CiAgICAiIiJZaWVsZCBub24tZW1wdHkvbm9uLWNvbW1lbnQgbGluZXMgb2YgYSBzdHJpbmcgb3Igc2VxdWVuY2UiIiIKICAgIGlmIGlzaW5zdGFuY2Uoc3Rycywgc2l4LnN0cmluZ190eXBlcyk6CiAgICAgICAgZm9yIHMgaW4gc3Rycy5zcGxpdGxpbmVzKCk6CiAgICAgICAgICAgIHMgPSBzLnN0cmlwKCkKICAgICAgICAgICAgIyBza2lwIGJsYW5rIGxpbmVzL2NvbW1lbnRzCiAgICAgICAgICAgIGlmIHMgYW5kIG5vdCBzLnN0YXJ0c3dpdGgoJyMnKToKICAgICAgICAgICAgICAgIHlpZWxkIHMKICAgIGVsc2U6CiAgICAgICAgZm9yIHNzIGluIHN0cnM6CiAgICAgICAgICAgIGZvciBzIGluIHlpZWxkX2xpbmVzKHNzKToKICAgICAgICAgICAgICAgIHlpZWxkIHMKCgpNT0RVTEUgPSByZS5jb21waWxlKHIiXHcrKFwuXHcrKSokIikubWF0Y2gKRUdHX05BTUUgPSByZS5jb21waWxlKAogICAgciIiIgogICAgKD9QPG5hbWU+W14tXSspICgKICAgICAgICAtKD9QPHZlcj5bXi1dKykgKAogICAgICAgICAgICAtcHkoP1A8cHl2ZXI+W14tXSspICgKICAgICAgICAgICAgICAgIC0oP1A8cGxhdD4uKykKICAgICAgICAgICAgKT8KICAgICAgICApPwogICAgKT8KICAgICIiIiwKICAgIHJlLlZFUkJPU0UgfCByZS5JR05PUkVDQVNFLAopLm1hdGNoCgoKY2xhc3MgRW50cnlQb2ludChvYmplY3QpOgogICAgIiIiT2JqZWN0IHJlcHJlc2VudGluZyBhbiBhZHZlcnRpc2VkIGltcG9ydGFibGUgb2JqZWN0IiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIG1vZHVsZV9uYW1lLCBhdHRycz0oKSwgZXh0cmFzPSgpLCBkaXN0PU5vbmUpOgogICAgICAgIGlmIG5vdCBNT0RVTEUobW9kdWxlX25hbWUpOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJbnZhbGlkIG1vZHVsZSBuYW1lIiwgbW9kdWxlX25hbWUpCiAgICAgICAgc2VsZi5uYW1lID0gbmFtZQogICAgICAgIHNlbGYubW9kdWxlX25hbWUgPSBtb2R1bGVfbmFtZQogICAgICAgIHNlbGYuYXR0cnMgPSB0dXBsZShhdHRycykKICAgICAgICBzZWxmLmV4dHJhcyA9IHR1cGxlKGV4dHJhcykKICAgICAgICBzZWxmLmRpc3QgPSBkaXN0CgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcyA9ICIlcyA9ICVzIiAlIChzZWxmLm5hbWUsIHNlbGYubW9kdWxlX25hbWUpCiAgICAgICAgaWYgc2VsZi5hdHRyczoKICAgICAgICAgICAgcyArPSAnOicgKyAnLicuam9pbihzZWxmLmF0dHJzKQogICAgICAgIGlmIHNlbGYuZXh0cmFzOgogICAgICAgICAgICBzICs9ICcgWyVzXScgJSAnLCcuam9pbihzZWxmLmV4dHJhcykKICAgICAgICByZXR1cm4gcwoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIkVudHJ5UG9pbnQucGFyc2UoJXIpIiAlIHN0cihzZWxmKQoKICAgIGRlZiBsb2FkKHNlbGYsIHJlcXVpcmU9VHJ1ZSwgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAiIiIKICAgICAgICBSZXF1aXJlIHBhY2thZ2VzIGZvciB0aGlzIEVudHJ5UG9pbnQsIHRoZW4gcmVzb2x2ZSBpdC4KICAgICAgICAiIiIKICAgICAgICBpZiBub3QgcmVxdWlyZSBvciBhcmdzIG9yIGt3YXJnczoKICAgICAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgICAgICJQYXJhbWV0ZXJzIHRvIGxvYWQgYXJlIGRlcHJlY2F0ZWQuICBDYWxsIC5yZXNvbHZlIGFuZCAiCiAgICAgICAgICAgICAgICAiLnJlcXVpcmUgc2VwYXJhdGVseS4iLAogICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLAogICAgICAgICAgICAgICAgc3RhY2tsZXZlbD0yLAogICAgICAgICAgICApCiAgICAgICAgaWYgcmVxdWlyZToKICAgICAgICAgICAgc2VsZi5yZXF1aXJlKCphcmdzLCAqKmt3YXJncykKICAgICAgICByZXR1cm4gc2VsZi5yZXNvbHZlKCkKCiAgICBkZWYgcmVzb2x2ZShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXNvbHZlIHRoZSBlbnRyeSBwb2ludCBmcm9tIGl0cyBtb2R1bGUgYW5kIGF0dHJzLgogICAgICAgICIiIgogICAgICAgIG1vZHVsZSA9IF9faW1wb3J0X18oc2VsZi5tb2R1bGVfbmFtZSwgZnJvbWxpc3Q9WydfX25hbWVfXyddLCBsZXZlbD0wKQogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0b29scy5yZWR1Y2UoZ2V0YXR0ciwgc2VsZi5hdHRycywgbW9kdWxlKQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvciBhcyBleGM6CiAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKHN0cihleGMpKQoKICAgIGRlZiByZXF1aXJlKHNlbGYsIGVudj1Ob25lLCBpbnN0YWxsZXI9Tm9uZSk6CiAgICAgICAgaWYgc2VsZi5leHRyYXMgYW5kIG5vdCBzZWxmLmRpc3Q6CiAgICAgICAgICAgIHJhaXNlIFVua25vd25FeHRyYSgiQ2FuJ3QgcmVxdWlyZSgpIHdpdGhvdXQgYSBkaXN0cmlidXRpb24iLCBzZWxmKQoKICAgICAgICAjIEdldCB0aGUgcmVxdWlyZW1lbnRzIGZvciB0aGlzIGVudHJ5IHBvaW50IHdpdGggYWxsIGl0cyBleHRyYXMgYW5kCiAgICAgICAgIyB0aGVuIHJlc29sdmUgdGhlbS4gV2UgaGF2ZSB0byBwYXNzIGBleHRyYXNgIGFsb25nIHdoZW4gcmVzb2x2aW5nIHNvCiAgICAgICAgIyB0aGF0IHRoZSB3b3JraW5nIHNldCBrbm93cyB3aGF0IGV4dHJhcyB3ZSB3YW50LiBPdGhlcndpc2UsIGZvcgogICAgICAgICMgZGlzdC1pbmZvIGRpc3RyaWJ1dGlvbnMsIHRoZSB3b3JraW5nIHNldCB3aWxsIGFzc3VtZSB0aGF0IHRoZQogICAgICAgICMgcmVxdWlyZW1lbnRzIGZvciB0aGF0IGV4dHJhIGFyZSBwdXJlbHkgb3B0aW9uYWwgYW5kIHNraXAgb3ZlciB0aGVtLgogICAgICAgIHJlcXMgPSBzZWxmLmRpc3QucmVxdWlyZXMoc2VsZi5leHRyYXMpCiAgICAgICAgaXRlbXMgPSB3b3JraW5nX3NldC5yZXNvbHZlKHJlcXMsIGVudiwgaW5zdGFsbGVyLCBleHRyYXM9c2VsZi5leHRyYXMpCiAgICAgICAgbGlzdChtYXAod29ya2luZ19zZXQuYWRkLCBpdGVtcykpCgogICAgcGF0dGVybiA9IHJlLmNvbXBpbGUoCiAgICAgICAgcidccyonCiAgICAgICAgcicoP1A8bmFtZT4uKz8pXHMqJwogICAgICAgIHInPVxzKicKICAgICAgICByJyg/UDxtb2R1bGU+W1x3Ll0rKVxzKicKICAgICAgICByJyg6XHMqKD9QPGF0dHI+W1x3Ll0rKSk/XHMqJwogICAgICAgIHInKD9QPGV4dHJhcz5cWy4qXF0pP1xzKiQnCiAgICApCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgcGFyc2UoY2xzLCBzcmMsIGRpc3Q9Tm9uZSk6CiAgICAgICAgIiIiUGFyc2UgYSBzaW5nbGUgZW50cnkgcG9pbnQgZnJvbSBzdHJpbmcgYHNyY2AKCiAgICAgICAgRW50cnkgcG9pbnQgc3ludGF4IGZvbGxvd3MgdGhlIGZvcm06OgoKICAgICAgICAgICAgbmFtZSA9IHNvbWUubW9kdWxlOnNvbWUuYXR0ciBbZXh0cmExLCBleHRyYTJdCgogICAgICAgIFRoZSBlbnRyeSBuYW1lIGFuZCBtb2R1bGUgbmFtZSBhcmUgcmVxdWlyZWQsIGJ1dCB0aGUgYGA6YXR0cnNgYCBhbmQKICAgICAgICBgYFtleHRyYXNdYGAgcGFydHMgYXJlIG9wdGlvbmFsCiAgICAgICAgIiIiCiAgICAgICAgbSA9IGNscy5wYXR0ZXJuLm1hdGNoKHNyYykKICAgICAgICBpZiBub3QgbToKICAgICAgICAgICAgbXNnID0gIkVudHJ5UG9pbnQgbXVzdCBiZSBpbiAnbmFtZT1tb2R1bGU6YXR0cnMgW2V4dHJhc10nIGZvcm1hdCIKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihtc2csIHNyYykKICAgICAgICByZXMgPSBtLmdyb3VwZGljdCgpCiAgICAgICAgZXh0cmFzID0gY2xzLl9wYXJzZV9leHRyYXMocmVzWydleHRyYXMnXSkKICAgICAgICBhdHRycyA9IHJlc1snYXR0ciddLnNwbGl0KCcuJykgaWYgcmVzWydhdHRyJ10gZWxzZSAoKQogICAgICAgIHJldHVybiBjbHMocmVzWyduYW1lJ10sIHJlc1snbW9kdWxlJ10sIGF0dHJzLCBleHRyYXMsIGRpc3QpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX3BhcnNlX2V4dHJhcyhjbHMsIGV4dHJhc19zcGVjKToKICAgICAgICBpZiBub3QgZXh0cmFzX3NwZWM6CiAgICAgICAgICAgIHJldHVybiAoKQogICAgICAgIHJlcSA9IFJlcXVpcmVtZW50LnBhcnNlKCd4JyArIGV4dHJhc19zcGVjKQogICAgICAgIGlmIHJlcS5zcGVjczoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigpCiAgICAgICAgcmV0dXJuIHJlcS5leHRyYXMKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBwYXJzZV9ncm91cChjbHMsIGdyb3VwLCBsaW5lcywgZGlzdD1Ob25lKToKICAgICAgICAiIiJQYXJzZSBhbiBlbnRyeSBwb2ludCBncm91cCIiIgogICAgICAgIGlmIG5vdCBNT0RVTEUoZ3JvdXApOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJbnZhbGlkIGdyb3VwIG5hbWUiLCBncm91cCkKICAgICAgICB0aGlzID0ge30KICAgICAgICBmb3IgbGluZSBpbiB5aWVsZF9saW5lcyhsaW5lcyk6CiAgICAgICAgICAgIGVwID0gY2xzLnBhcnNlKGxpbmUsIGRpc3QpCiAgICAgICAgICAgIGlmIGVwLm5hbWUgaW4gdGhpczoKICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkR1cGxpY2F0ZSBlbnRyeSBwb2ludCIsIGdyb3VwLCBlcC5uYW1lKQogICAgICAgICAgICB0aGlzW2VwLm5hbWVdID0gZXAKICAgICAgICByZXR1cm4gdGhpcwoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIHBhcnNlX21hcChjbHMsIGRhdGEsIGRpc3Q9Tm9uZSk6CiAgICAgICAgIiIiUGFyc2UgYSBtYXAgb2YgZW50cnkgcG9pbnQgZ3JvdXBzIiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZShkYXRhLCBkaWN0KToKICAgICAgICAgICAgZGF0YSA9IGRhdGEuaXRlbXMoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGRhdGEgPSBzcGxpdF9zZWN0aW9ucyhkYXRhKQogICAgICAgIG1hcHMgPSB7fQogICAgICAgIGZvciBncm91cCwgbGluZXMgaW4gZGF0YToKICAgICAgICAgICAgaWYgZ3JvdXAgaXMgTm9uZToKICAgICAgICAgICAgICAgIGlmIG5vdCBsaW5lczoKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiRW50cnkgcG9pbnRzIG11c3QgYmUgbGlzdGVkIGluIGdyb3VwcyIpCiAgICAgICAgICAgIGdyb3VwID0gZ3JvdXAuc3RyaXAoKQogICAgICAgICAgICBpZiBncm91cCBpbiBtYXBzOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiRHVwbGljYXRlIGdyb3VwIG5hbWUiLCBncm91cCkKICAgICAgICAgICAgbWFwc1tncm91cF0gPSBjbHMucGFyc2VfZ3JvdXAoZ3JvdXAsIGxpbmVzLCBkaXN0KQogICAgICAgIHJldHVybiBtYXBzCgoKZGVmIF9yZW1vdmVfbWQ1X2ZyYWdtZW50KGxvY2F0aW9uKToKICAgIGlmIG5vdCBsb2NhdGlvbjoKICAgICAgICByZXR1cm4gJycKICAgIHBhcnNlZCA9IHVybGxpYi5wYXJzZS51cmxwYXJzZShsb2NhdGlvbikKICAgIGlmIHBhcnNlZFstMV0uc3RhcnRzd2l0aCgnbWQ1PScpOgogICAgICAgIHJldHVybiB1cmxsaWIucGFyc2UudXJsdW5wYXJzZShwYXJzZWRbOi0xXSArICgnJywpKQogICAgcmV0dXJuIGxvY2F0aW9uCgoKZGVmIF92ZXJzaW9uX2Zyb21fZmlsZShsaW5lcyk6CiAgICAiIiIKICAgIEdpdmVuIGFuIGl0ZXJhYmxlIG9mIGxpbmVzIGZyb20gYSBNZXRhZGF0YSBmaWxlLCByZXR1cm4KICAgIHRoZSB2YWx1ZSBvZiB0aGUgVmVyc2lvbiBmaWVsZCwgaWYgcHJlc2VudCwgb3IgTm9uZSBvdGhlcndpc2UuCiAgICAiIiIKICAgIGlzX3ZlcnNpb25fbGluZSA9IGxhbWJkYSBsaW5lOiBsaW5lLmxvd2VyKCkuc3RhcnRzd2l0aCgndmVyc2lvbjonKQogICAgdmVyc2lvbl9saW5lcyA9IGZpbHRlcihpc192ZXJzaW9uX2xpbmUsIGxpbmVzKQogICAgbGluZSA9IG5leHQoaXRlcih2ZXJzaW9uX2xpbmVzKSwgJycpCiAgICBfLCBfLCB2YWx1ZSA9IGxpbmUucGFydGl0aW9uKCc6JykKICAgIHJldHVybiBzYWZlX3ZlcnNpb24odmFsdWUuc3RyaXAoKSkgb3IgTm9uZQoKCmNsYXNzIERpc3RyaWJ1dGlvbihvYmplY3QpOgogICAgIiIiV3JhcCBhbiBhY3R1YWwgb3IgcG90ZW50aWFsIHN5cy5wYXRoIGVudHJ5IHcvbWV0YWRhdGEiIiIKICAgIFBLR19JTkZPID0gJ1BLRy1JTkZPJwoKICAgIGRlZiBfX2luaXRfXygKICAgICAgICAgICAgc2VsZiwgbG9jYXRpb249Tm9uZSwgbWV0YWRhdGE9Tm9uZSwgcHJvamVjdF9uYW1lPU5vbmUsCiAgICAgICAgICAgIHZlcnNpb249Tm9uZSwgcHlfdmVyc2lvbj1QWV9NQUpPUiwgcGxhdGZvcm09Tm9uZSwKICAgICAgICAgICAgcHJlY2VkZW5jZT1FR0dfRElTVCk6CiAgICAgICAgc2VsZi5wcm9qZWN0X25hbWUgPSBzYWZlX25hbWUocHJvamVjdF9uYW1lIG9yICdVbmtub3duJykKICAgICAgICBpZiB2ZXJzaW9uIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzZWxmLl92ZXJzaW9uID0gc2FmZV92ZXJzaW9uKHZlcnNpb24pCiAgICAgICAgc2VsZi5weV92ZXJzaW9uID0gcHlfdmVyc2lvbgogICAgICAgIHNlbGYucGxhdGZvcm0gPSBwbGF0Zm9ybQogICAgICAgIHNlbGYubG9jYXRpb24gPSBsb2NhdGlvbgogICAgICAgIHNlbGYucHJlY2VkZW5jZSA9IHByZWNlZGVuY2UKICAgICAgICBzZWxmLl9wcm92aWRlciA9IG1ldGFkYXRhIG9yIGVtcHR5X3Byb3ZpZGVyCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZnJvbV9sb2NhdGlvbihjbHMsIGxvY2F0aW9uLCBiYXNlbmFtZSwgbWV0YWRhdGE9Tm9uZSwgKiprdyk6CiAgICAgICAgcHJvamVjdF9uYW1lLCB2ZXJzaW9uLCBweV92ZXJzaW9uLCBwbGF0Zm9ybSA9IFtOb25lXSAqIDQKICAgICAgICBiYXNlbmFtZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChiYXNlbmFtZSkKICAgICAgICBpZiBleHQubG93ZXIoKSBpbiBfZGlzdHJpYnV0aW9uSW1wbDoKICAgICAgICAgICAgY2xzID0gX2Rpc3RyaWJ1dGlvbkltcGxbZXh0Lmxvd2VyKCldCgogICAgICAgICAgICBtYXRjaCA9IEVHR19OQU1FKGJhc2VuYW1lKQogICAgICAgICAgICBpZiBtYXRjaDoKICAgICAgICAgICAgICAgIHByb2plY3RfbmFtZSwgdmVyc2lvbiwgcHlfdmVyc2lvbiwgcGxhdGZvcm0gPSBtYXRjaC5ncm91cCgKICAgICAgICAgICAgICAgICAgICAnbmFtZScsICd2ZXInLCAncHl2ZXInLCAncGxhdCcKICAgICAgICAgICAgICAgICkKICAgICAgICByZXR1cm4gY2xzKAogICAgICAgICAgICBsb2NhdGlvbiwgbWV0YWRhdGEsIHByb2plY3RfbmFtZT1wcm9qZWN0X25hbWUsIHZlcnNpb249dmVyc2lvbiwKICAgICAgICAgICAgcHlfdmVyc2lvbj1weV92ZXJzaW9uLCBwbGF0Zm9ybT1wbGF0Zm9ybSwgKiprdwogICAgICAgICkuX3JlbG9hZF92ZXJzaW9uKCkKCiAgICBkZWYgX3JlbG9hZF92ZXJzaW9uKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmCgogICAgQHByb3BlcnR5CiAgICBkZWYgaGFzaGNtcChzZWxmKToKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICBzZWxmLnBhcnNlZF92ZXJzaW9uLAogICAgICAgICAgICBzZWxmLnByZWNlZGVuY2UsCiAgICAgICAgICAgIHNlbGYua2V5LAogICAgICAgICAgICBfcmVtb3ZlX21kNV9mcmFnbWVudChzZWxmLmxvY2F0aW9uKSwKICAgICAgICAgICAgc2VsZi5weV92ZXJzaW9uIG9yICcnLAogICAgICAgICAgICBzZWxmLnBsYXRmb3JtIG9yICcnLAogICAgICAgICkKCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGhhc2goc2VsZi5oYXNoY21wKQoKICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLmhhc2hjbXAgPCBvdGhlci5oYXNoY21wCgogICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuaGFzaGNtcCA8PSBvdGhlci5oYXNoY21wCgogICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuaGFzaGNtcCA+IG90aGVyLmhhc2hjbXAKCiAgICBkZWYgX19nZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5oYXNoY21wID49IG90aGVyLmhhc2hjbXAKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pOgogICAgICAgICAgICAjIEl0J3Mgbm90IGEgRGlzdHJpYnV0aW9uLCBzbyB0aGV5IGFyZSBub3QgZXF1YWwKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgcmV0dXJuIHNlbGYuaGFzaGNtcCA9PSBvdGhlci5oYXNoY21wCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIG5vdCBzZWxmID09IG90aGVyCgogICAgIyBUaGVzZSBwcm9wZXJ0aWVzIGhhdmUgdG8gYmUgbGF6eSBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gbG9hZCBhbnkKICAgICMgbWV0YWRhdGEgdW50aWwvdW5sZXNzIGl0J3MgYWN0dWFsbHkgbmVlZGVkLiAgKGkuZS4sIHNvbWUgZGlzdHJpYnV0aW9ucwogICAgIyBtYXkgbm90IGtub3cgdGhlaXIgbmFtZSBvciB2ZXJzaW9uIHdpdGhvdXQgbG9hZGluZyBQS0ctSU5GTykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBrZXkoc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5fa2V5CiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBzZWxmLl9rZXkgPSBrZXkgPSBzZWxmLnByb2plY3RfbmFtZS5sb3dlcigpCiAgICAgICAgICAgIHJldHVybiBrZXkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwYXJzZWRfdmVyc2lvbihzZWxmKToKICAgICAgICBpZiBub3QgaGFzYXR0cihzZWxmLCAiX3BhcnNlZF92ZXJzaW9uIik6CiAgICAgICAgICAgIHNlbGYuX3BhcnNlZF92ZXJzaW9uID0gcGFyc2VfdmVyc2lvbihzZWxmLnZlcnNpb24pCgogICAgICAgIHJldHVybiBzZWxmLl9wYXJzZWRfdmVyc2lvbgoKICAgIGRlZiBfd2Fybl9sZWdhY3lfdmVyc2lvbihzZWxmKToKICAgICAgICBMViA9IHBhY2thZ2luZy52ZXJzaW9uLkxlZ2FjeVZlcnNpb24KICAgICAgICBpc19sZWdhY3kgPSBpc2luc3RhbmNlKHNlbGYuX3BhcnNlZF92ZXJzaW9uLCBMVikKICAgICAgICBpZiBub3QgaXNfbGVnYWN5OgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyBXaGlsZSBhbiBlbXB0eSB2ZXJzaW9uIGlzIHRlY2huaWNhbGx5IGEgbGVnYWN5IHZlcnNpb24gYW5kCiAgICAgICAgIyBpcyBub3QgYSB2YWxpZCBQRVAgNDQwIHZlcnNpb24sIGl0J3MgYWxzbyB1bmxpa2VseSB0bwogICAgICAgICMgYWN0dWFsbHkgY29tZSBmcm9tIHNvbWVvbmUgYW5kIGluc3RlYWQgaXQgaXMgbW9yZSBsaWtlbHkgdGhhdAogICAgICAgICMgaXQgY29tZXMgZnJvbSBzZXR1cHRvb2xzIGF0dGVtcHRpbmcgdG8gcGFyc2UgYSBmaWxlbmFtZSBhbmQKICAgICAgICAjIGluY2x1ZGluZyBpdCBpbiB0aGUgbGlzdC4gU28gZm9yIHRoYXQgd2UnbGwgZ2F0ZSB0aGlzIHdhcm5pbmcKICAgICAgICAjIG9uIGlmIHRoZSB2ZXJzaW9uIGlzIGFueXRoaW5nIGF0IGFsbCBvciBub3QuCiAgICAgICAgaWYgbm90IHNlbGYudmVyc2lvbjoKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHRtcGwgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiCiAgICAgICAgICAgICd7cHJvamVjdF9uYW1lfSAoe3ZlcnNpb259KScgaXMgYmVpbmcgcGFyc2VkIGFzIGEgbGVnYWN5LAogICAgICAgICAgICBub24gUEVQIDQ0MCwKICAgICAgICAgICAgdmVyc2lvbi4gWW91IG1heSBmaW5kIG9kZCBiZWhhdmlvciBhbmQgc29ydCBvcmRlci4KICAgICAgICAgICAgSW4gcGFydGljdWxhciBpdCB3aWxsIGJlIHNvcnRlZCBhcyBsZXNzIHRoYW4gMC4wLiBJdAogICAgICAgICAgICBpcyByZWNvbW1lbmRlZCB0byBtaWdyYXRlIHRvIFBFUCA0NDAgY29tcGF0aWJsZQogICAgICAgICAgICB2ZXJzaW9ucy4KICAgICAgICAgICAgIiIiKS5zdHJpcCgpLnJlcGxhY2UoJ1xuJywgJyAnKQoKICAgICAgICB3YXJuaW5ncy53YXJuKHRtcGwuZm9ybWF0KCoqdmFycyhzZWxmKSksIFBFUDQ0MFdhcm5pbmcpCgogICAgQHByb3BlcnR5CiAgICBkZWYgdmVyc2lvbihzZWxmKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl92ZXJzaW9uCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICB2ZXJzaW9uID0gX3ZlcnNpb25fZnJvbV9maWxlKHNlbGYuX2dldF9tZXRhZGF0YShzZWxmLlBLR19JTkZPKSkKICAgICAgICAgICAgaWYgdmVyc2lvbiBpcyBOb25lOgogICAgICAgICAgICAgICAgdG1wbCA9ICJNaXNzaW5nICdWZXJzaW9uOicgaGVhZGVyIGFuZC9vciAlcyBmaWxlIgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcih0bXBsICUgc2VsZi5QS0dfSU5GTywgc2VsZikKICAgICAgICAgICAgcmV0dXJuIHZlcnNpb24KCiAgICBAcHJvcGVydHkKICAgIGRlZiBfZGVwX21hcChzZWxmKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9fZGVwX21hcAogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgZG0gPSBzZWxmLl9fZGVwX21hcCA9IHtOb25lOiBbXX0KICAgICAgICAgICAgZm9yIG5hbWUgaW4gJ3JlcXVpcmVzLnR4dCcsICdkZXBlbmRzLnR4dCc6CiAgICAgICAgICAgICAgICBmb3IgZXh0cmEsIHJlcXMgaW4gc3BsaXRfc2VjdGlvbnMoc2VsZi5fZ2V0X21ldGFkYXRhKG5hbWUpKToKICAgICAgICAgICAgICAgICAgICBpZiBleHRyYToKICAgICAgICAgICAgICAgICAgICAgICAgaWYgJzonIGluIGV4dHJhOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmEsIG1hcmtlciA9IGV4dHJhLnNwbGl0KCc6JywgMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGludmFsaWRfbWFya2VyKG1hcmtlcik6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBYWFggd2FybgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXMgPSBbXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiBub3QgZXZhbHVhdGVfbWFya2VyKG1hcmtlcik6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxcyA9IFtdCiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhID0gc2FmZV9leHRyYShleHRyYSkgb3IgTm9uZQogICAgICAgICAgICAgICAgICAgIGRtLnNldGRlZmF1bHQoZXh0cmEsIFtdKS5leHRlbmQocGFyc2VfcmVxdWlyZW1lbnRzKHJlcXMpKQogICAgICAgICAgICByZXR1cm4gZG0KCiAgICBkZWYgcmVxdWlyZXMoc2VsZiwgZXh0cmFzPSgpKToKICAgICAgICAiIiJMaXN0IG9mIFJlcXVpcmVtZW50cyBuZWVkZWQgZm9yIHRoaXMgZGlzdHJvIGlmIGBleHRyYXNgIGFyZSB1c2VkIiIiCiAgICAgICAgZG0gPSBzZWxmLl9kZXBfbWFwCiAgICAgICAgZGVwcyA9IFtdCiAgICAgICAgZGVwcy5leHRlbmQoZG0uZ2V0KE5vbmUsICgpKSkKICAgICAgICBmb3IgZXh0IGluIGV4dHJhczoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZGVwcy5leHRlbmQoZG1bc2FmZV9leHRyYShleHQpXSkKICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICAgICAgcmFpc2UgVW5rbm93bkV4dHJhKAogICAgICAgICAgICAgICAgICAgICIlcyBoYXMgbm8gc3VjaCBleHRyYSBmZWF0dXJlICVyIiAlIChzZWxmLCBleHQpCiAgICAgICAgICAgICAgICApCiAgICAgICAgcmV0dXJuIGRlcHMKCiAgICBkZWYgX2dldF9tZXRhZGF0YShzZWxmLCBuYW1lKToKICAgICAgICBpZiBzZWxmLmhhc19tZXRhZGF0YShuYW1lKToKICAgICAgICAgICAgZm9yIGxpbmUgaW4gc2VsZi5nZXRfbWV0YWRhdGFfbGluZXMobmFtZSk6CiAgICAgICAgICAgICAgICB5aWVsZCBsaW5lCgogICAgZGVmIGFjdGl2YXRlKHNlbGYsIHBhdGg9Tm9uZSwgcmVwbGFjZT1GYWxzZSk6CiAgICAgICAgIiIiRW5zdXJlIGRpc3RyaWJ1dGlvbiBpcyBpbXBvcnRhYmxlIG9uIGBwYXRoYCAoZGVmYXVsdD1zeXMucGF0aCkiIiIKICAgICAgICBpZiBwYXRoIGlzIE5vbmU6CiAgICAgICAgICAgIHBhdGggPSBzeXMucGF0aAogICAgICAgIHNlbGYuaW5zZXJ0X29uKHBhdGgsIHJlcGxhY2U9cmVwbGFjZSkKICAgICAgICBpZiBwYXRoIGlzIHN5cy5wYXRoOgogICAgICAgICAgICBmaXh1cF9uYW1lc3BhY2VfcGFja2FnZXMoc2VsZi5sb2NhdGlvbikKICAgICAgICAgICAgZm9yIHBrZyBpbiBzZWxmLl9nZXRfbWV0YWRhdGEoJ25hbWVzcGFjZV9wYWNrYWdlcy50eHQnKToKICAgICAgICAgICAgICAgIGlmIHBrZyBpbiBzeXMubW9kdWxlczoKICAgICAgICAgICAgICAgICAgICBkZWNsYXJlX25hbWVzcGFjZShwa2cpCgogICAgZGVmIGVnZ19uYW1lKHNlbGYpOgogICAgICAgICIiIlJldHVybiB3aGF0IHRoaXMgZGlzdHJpYnV0aW9uJ3Mgc3RhbmRhcmQgLmVnZyBmaWxlbmFtZSBzaG91bGQgYmUiIiIKICAgICAgICBmaWxlbmFtZSA9ICIlcy0lcy1weSVzIiAlICgKICAgICAgICAgICAgdG9fZmlsZW5hbWUoc2VsZi5wcm9qZWN0X25hbWUpLCB0b19maWxlbmFtZShzZWxmLnZlcnNpb24pLAogICAgICAgICAgICBzZWxmLnB5X3ZlcnNpb24gb3IgUFlfTUFKT1IKICAgICAgICApCgogICAgICAgIGlmIHNlbGYucGxhdGZvcm06CiAgICAgICAgICAgIGZpbGVuYW1lICs9ICctJyArIHNlbGYucGxhdGZvcm0KICAgICAgICByZXR1cm4gZmlsZW5hbWUKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgaWYgc2VsZi5sb2NhdGlvbjoKICAgICAgICAgICAgcmV0dXJuICIlcyAoJXMpIiAlIChzZWxmLCBzZWxmLmxvY2F0aW9uKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBzdHIoc2VsZikKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHZlcnNpb24gPSBnZXRhdHRyKHNlbGYsICd2ZXJzaW9uJywgTm9uZSkKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgdmVyc2lvbiA9IE5vbmUKICAgICAgICB2ZXJzaW9uID0gdmVyc2lvbiBvciAiW3Vua25vd24gdmVyc2lvbl0iCiAgICAgICAgcmV0dXJuICIlcyAlcyIgJSAoc2VsZi5wcm9qZWN0X25hbWUsIHZlcnNpb24pCgogICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIGF0dHIpOgogICAgICAgICIiIkRlbGVnYXRlIGFsbCB1bnJlY29nbml6ZWQgcHVibGljIGF0dHJpYnV0ZXMgdG8gLm1ldGFkYXRhIHByb3ZpZGVyIiIiCiAgICAgICAgaWYgYXR0ci5zdGFydHN3aXRoKCdfJyk6CiAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKGF0dHIpCiAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZi5fcHJvdmlkZXIsIGF0dHIpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZnJvbV9maWxlbmFtZShjbHMsIGZpbGVuYW1lLCBtZXRhZGF0YT1Ob25lLCAqKmt3KToKICAgICAgICByZXR1cm4gY2xzLmZyb21fbG9jYXRpb24oCiAgICAgICAgICAgIF9ub3JtYWxpemVfY2FjaGVkKGZpbGVuYW1lKSwgb3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSksIG1ldGFkYXRhLAogICAgICAgICAgICAqKmt3CiAgICAgICAgKQoKICAgIGRlZiBhc19yZXF1aXJlbWVudChzZWxmKToKICAgICAgICAiIiJSZXR1cm4gYSBgYFJlcXVpcmVtZW50YGAgdGhhdCBtYXRjaGVzIHRoaXMgZGlzdHJpYnV0aW9uIGV4YWN0bHkiIiIKICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYucGFyc2VkX3ZlcnNpb24sIHBhY2thZ2luZy52ZXJzaW9uLlZlcnNpb24pOgogICAgICAgICAgICBzcGVjID0gIiVzPT0lcyIgJSAoc2VsZi5wcm9qZWN0X25hbWUsIHNlbGYucGFyc2VkX3ZlcnNpb24pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc3BlYyA9ICIlcz09PSVzIiAlIChzZWxmLnByb2plY3RfbmFtZSwgc2VsZi5wYXJzZWRfdmVyc2lvbikKCiAgICAgICAgcmV0dXJuIFJlcXVpcmVtZW50LnBhcnNlKHNwZWMpCgogICAgZGVmIGxvYWRfZW50cnlfcG9pbnQoc2VsZiwgZ3JvdXAsIG5hbWUpOgogICAgICAgICIiIlJldHVybiB0aGUgYG5hbWVgIGVudHJ5IHBvaW50IG9mIGBncm91cGAgb3IgcmFpc2UgSW1wb3J0RXJyb3IiIiIKICAgICAgICBlcCA9IHNlbGYuZ2V0X2VudHJ5X2luZm8oZ3JvdXAsIG5hbWUpCiAgICAgICAgaWYgZXAgaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoIkVudHJ5IHBvaW50ICVyIG5vdCBmb3VuZCIgJSAoKGdyb3VwLCBuYW1lKSwpKQogICAgICAgIHJldHVybiBlcC5sb2FkKCkKCiAgICBkZWYgZ2V0X2VudHJ5X21hcChzZWxmLCBncm91cD1Ob25lKToKICAgICAgICAiIiJSZXR1cm4gdGhlIGVudHJ5IHBvaW50IG1hcCBmb3IgYGdyb3VwYCwgb3IgdGhlIGZ1bGwgZW50cnkgbWFwIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICBlcF9tYXAgPSBzZWxmLl9lcF9tYXAKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIGVwX21hcCA9IHNlbGYuX2VwX21hcCA9IEVudHJ5UG9pbnQucGFyc2VfbWFwKAogICAgICAgICAgICAgICAgc2VsZi5fZ2V0X21ldGFkYXRhKCdlbnRyeV9wb2ludHMudHh0JyksIHNlbGYKICAgICAgICAgICAgKQogICAgICAgIGlmIGdyb3VwIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gZXBfbWFwLmdldChncm91cCwge30pCiAgICAgICAgcmV0dXJuIGVwX21hcAoKICAgIGRlZiBnZXRfZW50cnlfaW5mbyhzZWxmLCBncm91cCwgbmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIHRoZSBFbnRyeVBvaW50IG9iamVjdCBmb3IgYGdyb3VwYCtgbmFtZWAsIG9yIGBgTm9uZWBgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuZ2V0X2VudHJ5X21hcChncm91cCkuZ2V0KG5hbWUpCgogICAgZGVmIGluc2VydF9vbihzZWxmLCBwYXRoLCBsb2M9Tm9uZSwgcmVwbGFjZT1GYWxzZSk6CiAgICAgICAgIiIiRW5zdXJlIHNlbGYubG9jYXRpb24gaXMgb24gcGF0aAoKICAgICAgICBJZiByZXBsYWNlPUZhbHNlIChkZWZhdWx0KToKICAgICAgICAgICAgLSBJZiBsb2NhdGlvbiBpcyBhbHJlYWR5IGluIHBhdGggYW55d2hlcmUsIGRvIG5vdGhpbmcuCiAgICAgICAgICAgIC0gRWxzZToKICAgICAgICAgICAgICAtIElmIGl0J3MgYW4gZWdnIGFuZCBpdHMgcGFyZW50IGRpcmVjdG9yeSBpcyBvbiBwYXRoLAogICAgICAgICAgICAgICAgaW5zZXJ0IGp1c3QgYWhlYWQgb2YgdGhlIHBhcmVudC4KICAgICAgICAgICAgICAtIEVsc2U6IGFkZCB0byB0aGUgZW5kIG9mIHBhdGguCiAgICAgICAgSWYgcmVwbGFjZT1UcnVlOgogICAgICAgICAgICAtIElmIGxvY2F0aW9uIGlzIGFscmVhZHkgb24gcGF0aCBhbnl3aGVyZSAobm90IGVnZ3MpCiAgICAgICAgICAgICAgb3IgaGlnaGVyIHByaW9yaXR5IHRoYW4gaXRzIHBhcmVudCAoZWdncykKICAgICAgICAgICAgICBkbyBub3RoaW5nLgogICAgICAgICAgICAtIEVsc2U6CiAgICAgICAgICAgICAgLSBJZiBpdCdzIGFuIGVnZyBhbmQgaXRzIHBhcmVudCBkaXJlY3RvcnkgaXMgb24gcGF0aCwKICAgICAgICAgICAgICAgIGluc2VydCBqdXN0IGFoZWFkIG9mIHRoZSBwYXJlbnQsCiAgICAgICAgICAgICAgICByZW1vdmluZyBhbnkgbG93ZXItcHJpb3JpdHkgZW50cmllcy4KICAgICAgICAgICAgICAtIEVsc2U6IGFkZCBpdCB0byB0aGUgZnJvbnQgb2YgcGF0aC4KICAgICAgICAiIiIKCiAgICAgICAgbG9jID0gbG9jIG9yIHNlbGYubG9jYXRpb24KICAgICAgICBpZiBub3QgbG9jOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgbmxvYyA9IF9ub3JtYWxpemVfY2FjaGVkKGxvYykKICAgICAgICBiZGlyID0gb3MucGF0aC5kaXJuYW1lKG5sb2MpCiAgICAgICAgbnBhdGggPSBbKHAgYW5kIF9ub3JtYWxpemVfY2FjaGVkKHApIG9yIHApIGZvciBwIGluIHBhdGhdCgogICAgICAgIGZvciBwLCBpdGVtIGluIGVudW1lcmF0ZShucGF0aCk6CiAgICAgICAgICAgIGlmIGl0ZW0gPT0gbmxvYzoKICAgICAgICAgICAgICAgIGlmIHJlcGxhY2U6CiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIyBkb24ndCBtb2RpZnkgcGF0aCAoZXZlbiByZW1vdmluZyBkdXBsaWNhdGVzKSBpZgogICAgICAgICAgICAgICAgICAgICMgZm91bmQgYW5kIG5vdCByZXBsYWNlCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIGVsaWYgaXRlbSA9PSBiZGlyIGFuZCBzZWxmLnByZWNlZGVuY2UgPT0gRUdHX0RJU1Q6CiAgICAgICAgICAgICAgICAjIGlmIGl0J3MgYW4gLmVnZywgZ2l2ZSBpdCBwcmVjZWRlbmNlIG92ZXIgaXRzIGRpcmVjdG9yeQogICAgICAgICAgICAgICAgIyBVTkxFU1MgaXQncyBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gc3lzLnBhdGggYW5kIHJlcGxhY2U9RmFsc2UKICAgICAgICAgICAgICAgIGlmIChub3QgcmVwbGFjZSkgYW5kIG5sb2MgaW4gbnBhdGhbcDpdOgogICAgICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgICAgaWYgcGF0aCBpcyBzeXMucGF0aDoKICAgICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrX3ZlcnNpb25fY29uZmxpY3QoKQogICAgICAgICAgICAgICAgcGF0aC5pbnNlcnQocCwgbG9jKQogICAgICAgICAgICAgICAgbnBhdGguaW5zZXJ0KHAsIG5sb2MpCiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIHBhdGggaXMgc3lzLnBhdGg6CiAgICAgICAgICAgICAgICBzZWxmLmNoZWNrX3ZlcnNpb25fY29uZmxpY3QoKQogICAgICAgICAgICBpZiByZXBsYWNlOgogICAgICAgICAgICAgICAgcGF0aC5pbnNlcnQoMCwgbG9jKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcGF0aC5hcHBlbmQobG9jKQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyBwIGlzIHRoZSBzcG90IHdoZXJlIHdlIGZvdW5kIG9yIGluc2VydGVkIGxvYzsgbm93IHJlbW92ZSBkdXBsaWNhdGVzCiAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgbnAgPSBucGF0aC5pbmRleChubG9jLCBwICsgMSkKICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgZGVsIG5wYXRoW25wXSwgcGF0aFtucF0KICAgICAgICAgICAgICAgICMgaGEhCiAgICAgICAgICAgICAgICBwID0gbnAKCiAgICAgICAgcmV0dXJuCgogICAgZGVmIGNoZWNrX3ZlcnNpb25fY29uZmxpY3Qoc2VsZik6CiAgICAgICAgaWYgc2VsZi5rZXkgPT0gJ3NldHVwdG9vbHMnOgogICAgICAgICAgICAjIGlnbm9yZSB0aGUgaW5ldml0YWJsZSBzZXR1cHRvb2xzIHNlbGYtY29uZmxpY3RzICA6KAogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgbnNwID0gZGljdC5mcm9ta2V5cyhzZWxmLl9nZXRfbWV0YWRhdGEoJ25hbWVzcGFjZV9wYWNrYWdlcy50eHQnKSkKICAgICAgICBsb2MgPSBub3JtYWxpemVfcGF0aChzZWxmLmxvY2F0aW9uKQogICAgICAgIGZvciBtb2RuYW1lIGluIHNlbGYuX2dldF9tZXRhZGF0YSgndG9wX2xldmVsLnR4dCcpOgogICAgICAgICAgICBpZiAobW9kbmFtZSBub3QgaW4gc3lzLm1vZHVsZXMgb3IgbW9kbmFtZSBpbiBuc3AKICAgICAgICAgICAgICAgICAgICBvciBtb2RuYW1lIGluIF9uYW1lc3BhY2VfcGFja2FnZXMpOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaWYgbW9kbmFtZSBpbiAoJ3BrZ19yZXNvdXJjZXMnLCAnc2V0dXB0b29scycsICdzaXRlJyk6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBmbiA9IGdldGF0dHIoc3lzLm1vZHVsZXNbbW9kbmFtZV0sICdfX2ZpbGVfXycsIE5vbmUpCiAgICAgICAgICAgIGlmIGZuIGFuZCAobm9ybWFsaXplX3BhdGgoZm4pLnN0YXJ0c3dpdGgobG9jKSBvcgogICAgICAgICAgICAgICAgICAgICAgIGZuLnN0YXJ0c3dpdGgoc2VsZi5sb2NhdGlvbikpOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgaXNzdWVfd2FybmluZygKICAgICAgICAgICAgICAgICJNb2R1bGUgJXMgd2FzIGFscmVhZHkgaW1wb3J0ZWQgZnJvbSAlcywgYnV0ICVzIGlzIGJlaW5nIGFkZGVkIgogICAgICAgICAgICAgICAgIiB0byBzeXMucGF0aCIgJSAobW9kbmFtZSwgZm4sIHNlbGYubG9jYXRpb24pLAogICAgICAgICAgICApCgogICAgZGVmIGhhc192ZXJzaW9uKHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi52ZXJzaW9uCiAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgIGlzc3VlX3dhcm5pbmcoIlVuYnVpbHQgZWdnIGZvciAiICsgcmVwcihzZWxmKSkKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgY2xvbmUoc2VsZiwgKiprdyk6CiAgICAgICAgIiIiQ29weSB0aGlzIGRpc3RyaWJ1dGlvbiwgc3Vic3RpdHV0aW5nIGluIGFueSBjaGFuZ2VkIGtleXdvcmQgYXJncyIiIgogICAgICAgIG5hbWVzID0gJ3Byb2plY3RfbmFtZSB2ZXJzaW9uIHB5X3ZlcnNpb24gcGxhdGZvcm0gbG9jYXRpb24gcHJlY2VkZW5jZScKICAgICAgICBmb3IgYXR0ciBpbiBuYW1lcy5zcGxpdCgpOgogICAgICAgICAgICBrdy5zZXRkZWZhdWx0KGF0dHIsIGdldGF0dHIoc2VsZiwgYXR0ciwgTm9uZSkpCiAgICAgICAga3cuc2V0ZGVmYXVsdCgnbWV0YWRhdGEnLCBzZWxmLl9wcm92aWRlcikKICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oKiprdykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBleHRyYXMoc2VsZik6CiAgICAgICAgcmV0dXJuIFtkZXAgZm9yIGRlcCBpbiBzZWxmLl9kZXBfbWFwIGlmIGRlcF0KCgpjbGFzcyBFZ2dJbmZvRGlzdHJpYnV0aW9uKERpc3RyaWJ1dGlvbik6CiAgICBkZWYgX3JlbG9hZF92ZXJzaW9uKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFBhY2thZ2VzIGluc3RhbGxlZCBieSBkaXN0dXRpbHMgKGUuZy4gbnVtcHkgb3Igc2NpcHkpLAogICAgICAgIHdoaWNoIHVzZXMgYW4gb2xkIHNhZmVfdmVyc2lvbiwgYW5kIHNvCiAgICAgICAgdGhlaXIgdmVyc2lvbiBudW1iZXJzIGNhbiBnZXQgbWFuZ2xlZCB3aGVuCiAgICAgICAgY29udmVydGVkIHRvIGZpbGVuYW1lcyAoZS5nLiwgMS4xMS4wLmRldjArMjMyOWVhZSB0bwogICAgICAgIDEuMTEuMC5kZXYwXzIzMjllYWUpLiBUaGVzZSBkaXN0cmlidXRpb25zIHdpbGwgbm90IGJlCiAgICAgICAgcGFyc2VkIHByb3Blcmx5CiAgICAgICAgZG93bnN0cmVhbSBieSBEaXN0cmlidXRpb24gYW5kIHNhZmVfdmVyc2lvbiwgc28KICAgICAgICB0YWtlIGFuIGV4dHJhIHN0ZXAgYW5kIHRyeSB0byBnZXQgdGhlIHZlcnNpb24gbnVtYmVyIGZyb20KICAgICAgICB0aGUgbWV0YWRhdGEgZmlsZSBpdHNlbGYgaW5zdGVhZCBvZiB0aGUgZmlsZW5hbWUuCiAgICAgICAgIiIiCiAgICAgICAgbWRfdmVyc2lvbiA9IF92ZXJzaW9uX2Zyb21fZmlsZShzZWxmLl9nZXRfbWV0YWRhdGEoc2VsZi5QS0dfSU5GTykpCiAgICAgICAgaWYgbWRfdmVyc2lvbjoKICAgICAgICAgICAgc2VsZi5fdmVyc2lvbiA9IG1kX3ZlcnNpb24KICAgICAgICByZXR1cm4gc2VsZgoKCmNsYXNzIERpc3RJbmZvRGlzdHJpYnV0aW9uKERpc3RyaWJ1dGlvbik6CiAgICAiIiIKICAgIFdyYXAgYW4gYWN0dWFsIG9yIHBvdGVudGlhbCBzeXMucGF0aCBlbnRyeQogICAgdy9tZXRhZGF0YSwgLmRpc3QtaW5mbyBzdHlsZS4KICAgICIiIgogICAgUEtHX0lORk8gPSAnTUVUQURBVEEnCiAgICBFUUVRID0gcmUuY29tcGlsZShyIihbXCgsXSlccyooXGQuKj8pXHMqKFssXCldKSIpCgogICAgQHByb3BlcnR5CiAgICBkZWYgX3BhcnNlZF9wa2dfaW5mbyhzZWxmKToKICAgICAgICAiIiJQYXJzZSBhbmQgY2FjaGUgbWV0YWRhdGEiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9wa2dfaW5mbwogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgbWV0YWRhdGEgPSBzZWxmLmdldF9tZXRhZGF0YShzZWxmLlBLR19JTkZPKQogICAgICAgICAgICBzZWxmLl9wa2dfaW5mbyA9IGVtYWlsLnBhcnNlci5QYXJzZXIoKS5wYXJzZXN0cihtZXRhZGF0YSkKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3BrZ19pbmZvCgogICAgQHByb3BlcnR5CiAgICBkZWYgX2RlcF9tYXAoc2VsZik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gc2VsZi5fX2RlcF9tYXAKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgIHNlbGYuX19kZXBfbWFwID0gc2VsZi5fY29tcHV0ZV9kZXBlbmRlbmNpZXMoKQogICAgICAgICAgICByZXR1cm4gc2VsZi5fX2RlcF9tYXAKCiAgICBkZWYgX2NvbXB1dGVfZGVwZW5kZW5jaWVzKHNlbGYpOgogICAgICAgICIiIlJlY29tcHV0ZSB0aGlzIGRpc3RyaWJ1dGlvbidzIGRlcGVuZGVuY2llcy4iIiIKICAgICAgICBkbSA9IHNlbGYuX19kZXBfbWFwID0ge05vbmU6IFtdfQoKICAgICAgICByZXFzID0gW10KICAgICAgICAjIEluY2x1ZGluZyBhbnkgY29uZGl0aW9uIGV4cHJlc3Npb25zCiAgICAgICAgZm9yIHJlcSBpbiBzZWxmLl9wYXJzZWRfcGtnX2luZm8uZ2V0X2FsbCgnUmVxdWlyZXMtRGlzdCcpIG9yIFtdOgogICAgICAgICAgICByZXFzLmV4dGVuZChwYXJzZV9yZXF1aXJlbWVudHMocmVxKSkKCiAgICAgICAgZGVmIHJlcXNfZm9yX2V4dHJhKGV4dHJhKToKICAgICAgICAgICAgZm9yIHJlcSBpbiByZXFzOgogICAgICAgICAgICAgICAgaWYgbm90IHJlcS5tYXJrZXIgb3IgcmVxLm1hcmtlci5ldmFsdWF0ZSh7J2V4dHJhJzogZXh0cmF9KToKICAgICAgICAgICAgICAgICAgICB5aWVsZCByZXEKCiAgICAgICAgY29tbW9uID0gZnJvemVuc2V0KHJlcXNfZm9yX2V4dHJhKE5vbmUpKQogICAgICAgIGRtW05vbmVdLmV4dGVuZChjb21tb24pCgogICAgICAgIGZvciBleHRyYSBpbiBzZWxmLl9wYXJzZWRfcGtnX2luZm8uZ2V0X2FsbCgnUHJvdmlkZXMtRXh0cmEnKSBvciBbXToKICAgICAgICAgICAgc19leHRyYSA9IHNhZmVfZXh0cmEoZXh0cmEuc3RyaXAoKSkKICAgICAgICAgICAgZG1bc19leHRyYV0gPSBsaXN0KGZyb3plbnNldChyZXFzX2Zvcl9leHRyYShleHRyYSkpIC0gY29tbW9uKQoKICAgICAgICByZXR1cm4gZG0KCgpfZGlzdHJpYnV0aW9uSW1wbCA9IHsKICAgICcuZWdnJzogRGlzdHJpYnV0aW9uLAogICAgJy5lZ2ctaW5mbyc6IEVnZ0luZm9EaXN0cmlidXRpb24sCiAgICAnLmRpc3QtaW5mbyc6IERpc3RJbmZvRGlzdHJpYnV0aW9uLAp9CgoKZGVmIGlzc3VlX3dhcm5pbmcoKmFyZ3MsICoqa3cpOgogICAgbGV2ZWwgPSAxCiAgICBnID0gZ2xvYmFscygpCiAgICB0cnk6CiAgICAgICAgIyBmaW5kIHRoZSBmaXJzdCBzdGFjayBmcmFtZSB0aGF0IGlzICpub3QqIGNvZGUgaW4KICAgICAgICAjIHRoZSBwa2dfcmVzb3VyY2VzIG1vZHVsZSwgdG8gdXNlIGZvciB0aGUgd2FybmluZwogICAgICAgIHdoaWxlIHN5cy5fZ2V0ZnJhbWUobGV2ZWwpLmZfZ2xvYmFscyBpcyBnOgogICAgICAgICAgICBsZXZlbCArPSAxCiAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICBwYXNzCiAgICB3YXJuaW5ncy53YXJuKHN0YWNrbGV2ZWw9bGV2ZWwgKyAxLCAqYXJncywgKiprdykKCgpjbGFzcyBSZXF1aXJlbWVudFBhcnNlRXJyb3IoVmFsdWVFcnJvcik6CiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gJyAnLmpvaW4oc2VsZi5hcmdzKQoKCmRlZiBwYXJzZV9yZXF1aXJlbWVudHMoc3Rycyk6CiAgICAiIiJZaWVsZCBgYFJlcXVpcmVtZW50YGAgb2JqZWN0cyBmb3IgZWFjaCBzcGVjaWZpY2F0aW9uIGluIGBzdHJzYAoKICAgIGBzdHJzYCBtdXN0IGJlIGEgc3RyaW5nLCBvciBhIChwb3NzaWJseS1uZXN0ZWQpIGl0ZXJhYmxlIHRoZXJlb2YuCiAgICAiIiIKICAgICMgY3JlYXRlIGEgc3RlcHBhYmxlIGl0ZXJhdG9yLCBzbyB3ZSBjYW4gaGFuZGxlIFwtY29udGludWF0aW9ucwogICAgbGluZXMgPSBpdGVyKHlpZWxkX2xpbmVzKHN0cnMpKQoKICAgIGZvciBsaW5lIGluIGxpbmVzOgogICAgICAgICMgRHJvcCBjb21tZW50cyAtLSBhIGhhc2ggd2l0aG91dCBhIHNwYWNlIG1heSBiZSBpbiBhIFVSTC4KICAgICAgICBpZiAnICMnIGluIGxpbmU6CiAgICAgICAgICAgIGxpbmUgPSBsaW5lWzpsaW5lLmZpbmQoJyAjJyldCiAgICAgICAgIyBJZiB0aGVyZSBpcyBhIGxpbmUgY29udGludWF0aW9uLCBkcm9wIGl0LCBhbmQgYXBwZW5kIHRoZSBuZXh0IGxpbmUuCiAgICAgICAgaWYgbGluZS5lbmRzd2l0aCgnXFwnKToKICAgICAgICAgICAgbGluZSA9IGxpbmVbOi0yXS5zdHJpcCgpCiAgICAgICAgICAgIGxpbmUgKz0gbmV4dChsaW5lcykKICAgICAgICB5aWVsZCBSZXF1aXJlbWVudChsaW5lKQoKCmNsYXNzIFJlcXVpcmVtZW50KHBhY2thZ2luZy5yZXF1aXJlbWVudHMuUmVxdWlyZW1lbnQpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHJlcXVpcmVtZW50X3N0cmluZyk6CiAgICAgICAgIiIiRE8gTk9UIENBTEwgVEhJUyBVTkRPQ1VNRU5URUQgTUVUSE9EOyB1c2UgUmVxdWlyZW1lbnQucGFyc2UoKSEiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIHN1cGVyKFJlcXVpcmVtZW50LCBzZWxmKS5fX2luaXRfXyhyZXF1aXJlbWVudF9zdHJpbmcpCiAgICAgICAgZXhjZXB0IHBhY2thZ2luZy5yZXF1aXJlbWVudHMuSW52YWxpZFJlcXVpcmVtZW50IGFzIGU6CiAgICAgICAgICAgIHJhaXNlIFJlcXVpcmVtZW50UGFyc2VFcnJvcihzdHIoZSkpCiAgICAgICAgc2VsZi51bnNhZmVfbmFtZSA9IHNlbGYubmFtZQogICAgICAgIHByb2plY3RfbmFtZSA9IHNhZmVfbmFtZShzZWxmLm5hbWUpCiAgICAgICAgc2VsZi5wcm9qZWN0X25hbWUsIHNlbGYua2V5ID0gcHJvamVjdF9uYW1lLCBwcm9qZWN0X25hbWUubG93ZXIoKQogICAgICAgIHNlbGYuc3BlY3MgPSBbCiAgICAgICAgICAgIChzcGVjLm9wZXJhdG9yLCBzcGVjLnZlcnNpb24pIGZvciBzcGVjIGluIHNlbGYuc3BlY2lmaWVyXQogICAgICAgIHNlbGYuZXh0cmFzID0gdHVwbGUobWFwKHNhZmVfZXh0cmEsIHNlbGYuZXh0cmFzKSkKICAgICAgICBzZWxmLmhhc2hDbXAgPSAoCiAgICAgICAgICAgIHNlbGYua2V5LAogICAgICAgICAgICBzZWxmLnNwZWNpZmllciwKICAgICAgICAgICAgZnJvemVuc2V0KHNlbGYuZXh0cmFzKSwKICAgICAgICAgICAgc3RyKHNlbGYubWFya2VyKSBpZiBzZWxmLm1hcmtlciBlbHNlIE5vbmUsCiAgICAgICAgKQogICAgICAgIHNlbGYuX19oYXNoID0gaGFzaChzZWxmLmhhc2hDbXApCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgaXNpbnN0YW5jZShvdGhlciwgUmVxdWlyZW1lbnQpIGFuZAogICAgICAgICAgICBzZWxmLmhhc2hDbXAgPT0gb3RoZXIuaGFzaENtcAogICAgICAgICkKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gbm90IHNlbGYgPT0gb3RoZXIKCiAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGl0ZW0pOgogICAgICAgIGlmIGlzaW5zdGFuY2UoaXRlbSwgRGlzdHJpYnV0aW9uKToKICAgICAgICAgICAgaWYgaXRlbS5rZXkgIT0gc2VsZi5rZXk6CiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgICAgIGl0ZW0gPSBpdGVtLnZlcnNpb24KCiAgICAgICAgIyBBbGxvdyBwcmVyZWxlYXNlcyBhbHdheXMgaW4gb3JkZXIgdG8gbWF0Y2ggdGhlIHByZXZpb3VzIGJlaGF2aW9yIG9mCiAgICAgICAgIyB0aGlzIG1ldGhvZC4gSW4gdGhlIGZ1dHVyZSB0aGlzIHNob3VsZCBiZSBzbWFydGVyIGFuZCBmb2xsb3cgUEVQIDQ0MAogICAgICAgICMgbW9yZSBhY2N1cmF0ZWx5LgogICAgICAgIHJldHVybiBzZWxmLnNwZWNpZmllci5jb250YWlucyhpdGVtLCBwcmVyZWxlYXNlcz1UcnVlKQoKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fX2hhc2gKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICJSZXF1aXJlbWVudC5wYXJzZSglcikiICUgc3RyKHNlbGYpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIHBhcnNlKHMpOgogICAgICAgIHJlcSwgPSBwYXJzZV9yZXF1aXJlbWVudHMocykKICAgICAgICByZXR1cm4gcmVxCgoKZGVmIF9hbHdheXNfb2JqZWN0KGNsYXNzZXMpOgogICAgIiIiCiAgICBFbnN1cmUgb2JqZWN0IGFwcGVhcnMgaW4gdGhlIG1ybyBldmVuCiAgICBmb3Igb2xkLXN0eWxlIGNsYXNzZXMuCiAgICAiIiIKICAgIGlmIG9iamVjdCBub3QgaW4gY2xhc3NlczoKICAgICAgICByZXR1cm4gY2xhc3NlcyArIChvYmplY3QsKQogICAgcmV0dXJuIGNsYXNzZXMKCgpkZWYgX2ZpbmRfYWRhcHRlcihyZWdpc3RyeSwgb2IpOgogICAgIiIiUmV0dXJuIGFuIGFkYXB0ZXIgZmFjdG9yeSBmb3IgYG9iYCBmcm9tIGByZWdpc3RyeWAiIiIKICAgIHR5cGVzID0gX2Fsd2F5c19vYmplY3QoaW5zcGVjdC5nZXRtcm8oZ2V0YXR0cihvYiwgJ19fY2xhc3NfXycsIHR5cGUob2IpKSkpCiAgICBmb3IgdCBpbiB0eXBlczoKICAgICAgICBpZiB0IGluIHJlZ2lzdHJ5OgogICAgICAgICAgICByZXR1cm4gcmVnaXN0cnlbdF0KCgpkZWYgZW5zdXJlX2RpcmVjdG9yeShwYXRoKToKICAgICIiIkVuc3VyZSB0aGF0IHRoZSBwYXJlbnQgZGlyZWN0b3J5IG9mIGBwYXRoYCBleGlzdHMiIiIKICAgIGRpcm5hbWUgPSBvcy5wYXRoLmRpcm5hbWUocGF0aCkKICAgIHB5MzFjb21wYXQubWFrZWRpcnMoZGlybmFtZSwgZXhpc3Rfb2s9VHJ1ZSkKCgpkZWYgX2J5cGFzc19lbnN1cmVfZGlyZWN0b3J5KHBhdGgpOgogICAgIiIiU2FuZGJveC1ieXBhc3NpbmcgdmVyc2lvbiBvZiBlbnN1cmVfZGlyZWN0b3J5KCkiIiIKICAgIGlmIG5vdCBXUklURV9TVVBQT1JUOgogICAgICAgIHJhaXNlIElPRXJyb3IoJyJvcy5ta2RpciIgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtLicpCiAgICBkaXJuYW1lLCBmaWxlbmFtZSA9IHNwbGl0KHBhdGgpCiAgICBpZiBkaXJuYW1lIGFuZCBmaWxlbmFtZSBhbmQgbm90IGlzZGlyKGRpcm5hbWUpOgogICAgICAgIF9ieXBhc3NfZW5zdXJlX2RpcmVjdG9yeShkaXJuYW1lKQogICAgICAgIG1rZGlyKGRpcm5hbWUsIDBvNzU1KQoKCmRlZiBzcGxpdF9zZWN0aW9ucyhzKToKICAgICIiIlNwbGl0IGEgc3RyaW5nIG9yIGl0ZXJhYmxlIHRoZXJlb2YgaW50byAoc2VjdGlvbiwgY29udGVudCkgcGFpcnMKCiAgICBFYWNoIGBgc2VjdGlvbmBgIGlzIGEgc3RyaXBwZWQgdmVyc2lvbiBvZiB0aGUgc2VjdGlvbiBoZWFkZXIgKCJbc2VjdGlvbl0iKQogICAgYW5kIGVhY2ggYGBjb250ZW50YGAgaXMgYSBsaXN0IG9mIHN0cmlwcGVkIGxpbmVzIGV4Y2x1ZGluZyBibGFuayBsaW5lcyBhbmQKICAgIGNvbW1lbnQtb25seSBsaW5lcy4gIElmIHRoZXJlIGFyZSBhbnkgc3VjaCBsaW5lcyBiZWZvcmUgdGhlIGZpcnN0IHNlY3Rpb24KICAgIGhlYWRlciwgdGhleSdyZSByZXR1cm5lZCBpbiBhIGZpcnN0IGBgc2VjdGlvbmBgIG9mIGBgTm9uZWBgLgogICAgIiIiCiAgICBzZWN0aW9uID0gTm9uZQogICAgY29udGVudCA9IFtdCiAgICBmb3IgbGluZSBpbiB5aWVsZF9saW5lcyhzKToKICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoIlsiKToKICAgICAgICAgICAgaWYgbGluZS5lbmRzd2l0aCgiXSIpOgogICAgICAgICAgICAgICAgaWYgc2VjdGlvbiBvciBjb250ZW50OgogICAgICAgICAgICAgICAgICAgIHlpZWxkIHNlY3Rpb24sIGNvbnRlbnQKICAgICAgICAgICAgICAgIHNlY3Rpb24gPSBsaW5lWzE6LTFdLnN0cmlwKCkKICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBbXQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSW52YWxpZCBzZWN0aW9uIGhlYWRpbmciLCBsaW5lKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGNvbnRlbnQuYXBwZW5kKGxpbmUpCgogICAgIyB3cmFwIHVwIGxhc3Qgc2VnbWVudAogICAgeWllbGQgc2VjdGlvbiwgY29udGVudAoKCmRlZiBfbWtzdGVtcCgqYXJncywgKiprdyk6CiAgICBvbGRfb3BlbiA9IG9zLm9wZW4KICAgIHRyeToKICAgICAgICAjIHRlbXBvcmFyaWx5IGJ5cGFzcyBzYW5kYm94aW5nCiAgICAgICAgb3Mub3BlbiA9IG9zX29wZW4KICAgICAgICByZXR1cm4gdGVtcGZpbGUubWtzdGVtcCgqYXJncywgKiprdykKICAgIGZpbmFsbHk6CiAgICAgICAgIyBhbmQgdGhlbiBwdXQgaXQgYmFjawogICAgICAgIG9zLm9wZW4gPSBvbGRfb3BlbgoKCiMgU2lsZW5jZSB0aGUgUEVQNDQwV2FybmluZyBieSBkZWZhdWx0LCBzbyB0aGF0IGVuZCB1c2VycyBkb24ndCBnZXQgaGl0IGJ5IGl0CiMgcmFuZG9tbHkganVzdCBiZWNhdXNlIHRoZXkgdXNlIHBrZ19yZXNvdXJjZXMuIFdlIHdhbnQgdG8gYXBwZW5kIHRoZSBydWxlCiMgYmVjYXVzZSB3ZSB3YW50IGVhcmxpZXIgdXNlcyBvZiBmaWx0ZXJ3YXJuaW5ncyB0byB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aGlzCiMgb25lLgp3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwgY2F0ZWdvcnk9UEVQNDQwV2FybmluZywgYXBwZW5kPVRydWUpCgoKIyBmcm9tIGphcmFjby5mdW5jdG9vbHMgMS4zCmRlZiBfY2FsbF9hc2lkZShmLCAqYXJncywgKiprd2FyZ3MpOgogICAgZigqYXJncywgKiprd2FyZ3MpCiAgICByZXR1cm4gZgoKCkBfY2FsbF9hc2lkZQpkZWYgX2luaXRpYWxpemUoZz1nbG9iYWxzKCkpOgogICAgIlNldCB1cCBnbG9iYWwgcmVzb3VyY2UgbWFuYWdlciAoZGVsaWJlcmF0ZWx5IG5vdCBzdGF0ZS1zYXZlZCkiCiAgICBtYW5hZ2VyID0gUmVzb3VyY2VNYW5hZ2VyKCkKICAgIGdbJ19tYW5hZ2VyJ10gPSBtYW5hZ2VyCiAgICBnLnVwZGF0ZSgKICAgICAgICAobmFtZSwgZ2V0YXR0cihtYW5hZ2VyLCBuYW1lKSkKICAgICAgICBmb3IgbmFtZSBpbiBkaXIobWFuYWdlcikKICAgICAgICBpZiBub3QgbmFtZS5zdGFydHN3aXRoKCdfJykKICAgICkKCgpAX2NhbGxfYXNpZGUKZGVmIF9pbml0aWFsaXplX21hc3Rlcl93b3JraW5nX3NldCgpOgogICAgIiIiCiAgICBQcmVwYXJlIHRoZSBtYXN0ZXIgd29ya2luZyBzZXQgYW5kIG1ha2UgdGhlIGBgcmVxdWlyZSgpYGAKICAgIEFQSSBhdmFpbGFibGUuCgogICAgVGhpcyBmdW5jdGlvbiBoYXMgZXhwbGljaXQgZWZmZWN0cyBvbiB0aGUgZ2xvYmFsIHN0YXRlCiAgICBvZiBwa2dfcmVzb3VyY2VzLiBJdCBpcyBpbnRlbmRlZCB0byBiZSBpbnZva2VkIG9uY2UgYXQKICAgIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGlzIG1vZHVsZS4KCiAgICBJbnZvY2F0aW9uIGJ5IG90aGVyIHBhY2thZ2VzIGlzIHVuc3VwcG9ydGVkIGFuZCBkb25lCiAgICBhdCB0aGVpciBvd24gcmlzay4KICAgICIiIgogICAgd29ya2luZ19zZXQgPSBXb3JraW5nU2V0Ll9idWlsZF9tYXN0ZXIoKQogICAgX2RlY2xhcmVfc3RhdGUoJ29iamVjdCcsIHdvcmtpbmdfc2V0PXdvcmtpbmdfc2V0KQoKICAgIHJlcXVpcmUgPSB3b3JraW5nX3NldC5yZXF1aXJlCiAgICBpdGVyX2VudHJ5X3BvaW50cyA9IHdvcmtpbmdfc2V0Lml0ZXJfZW50cnlfcG9pbnRzCiAgICBhZGRfYWN0aXZhdGlvbl9saXN0ZW5lciA9IHdvcmtpbmdfc2V0LnN1YnNjcmliZQogICAgcnVuX3NjcmlwdCA9IHdvcmtpbmdfc2V0LnJ1bl9zY3JpcHQKICAgICMgYmFja3dhcmQgY29tcGF0aWJpbGl0eQogICAgcnVuX21haW4gPSBydW5fc2NyaXB0CiAgICAjIEFjdGl2YXRlIGFsbCBkaXN0cmlidXRpb25zIGFscmVhZHkgb24gc3lzLnBhdGggd2l0aCByZXBsYWNlPUZhbHNlIGFuZAogICAgIyBlbnN1cmUgdGhhdCBhbGwgZGlzdHJpYnV0aW9ucyBhZGRlZCB0byB0aGUgd29ya2luZyBzZXQgaW4gdGhlIGZ1dHVyZQogICAgIyAoZS5nLiBieSBjYWxsaW5nIGBgcmVxdWlyZSgpYGApIHdpbGwgZ2V0IGFjdGl2YXRlZCBhcyB3ZWxsLAogICAgIyB3aXRoIGhpZ2hlciBwcmlvcml0eSAocmVwbGFjZT1UcnVlKS4KICAgIHR1cGxlKAogICAgICAgIGRpc3QuYWN0aXZhdGUocmVwbGFjZT1GYWxzZSkKICAgICAgICBmb3IgZGlzdCBpbiB3b3JraW5nX3NldAogICAgKQogICAgYWRkX2FjdGl2YXRpb25fbGlzdGVuZXIoCiAgICAgICAgbGFtYmRhIGRpc3Q6IGRpc3QuYWN0aXZhdGUocmVwbGFjZT1UcnVlKSwKICAgICAgICBleGlzdGluZz1GYWxzZSwKICAgICkKICAgIHdvcmtpbmdfc2V0LmVudHJpZXMgPSBbXQogICAgIyBtYXRjaCBvcmRlcgogICAgbGlzdChtYXAod29ya2luZ19zZXQuYWRkX2VudHJ5LCBzeXMucGF0aCkpCiAgICBnbG9iYWxzKCkudXBkYXRlKGxvY2FscygpKQpQSwMEFAAAAAAAAAAhAAAAAAAAAAAAAAAAADkAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvX19pbml0X18ucHlQSwMEFAAAAAAAAAAhAEOrsCZmVwAAZlcAADgAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvYXBwZGlycy5weSMhL3Vzci9iaW4vZW52IHB5dGhvbgojIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQojIENvcHlyaWdodCAoYykgMjAwNS0yMDEwIEFjdGl2ZVN0YXRlIFNvZnR3YXJlIEluYy4KIyBDb3B5cmlnaHQgKGMpIDIwMTMgRWRkeSBQZXRyaciZb3IKCiIiIlV0aWxpdGllcyBmb3IgZGV0ZXJtaW5pbmcgYXBwbGljYXRpb24tc3BlY2lmaWMgZGlycy4KClNlZSA8aHR0cDovL2dpdGh1Yi5jb20vQWN0aXZlU3RhdGUvYXBwZGlycz4gZm9yIGRldGFpbHMgYW5kIHVzYWdlLgoiIiIKIyBEZXYgTm90ZXM6CiMgLSBNU0ROIG9uIHdoZXJlIHRvIHN0b3JlIGFwcCBkYXRhIGZpbGVzOgojICAgaHR0cDovL3N1cHBvcnQubWljcm9zb2Z0LmNvbS9kZWZhdWx0LmFzcHg/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+LgogICAgaGFzX2hpZ2hfY2hhciA9IEZhbHNlCiAgICBmb3IgYyBpbiBkaXI6CiAgICAgICAgaWYgb3JkKGMpID4gMjU1OgogICAgICAgICAgICBoYXNfaGlnaF9jaGFyID0gVHJ1ZQogICAgICAgICAgICBicmVhawogICAgaWYgaGFzX2hpZ2hfY2hhcjoKICAgICAgICBidWYgPSBhcnJheS56ZXJvcygnYycsIGJ1Zl9zaXplKQogICAgICAgIGtlcm5lbCA9IHdpbjMyLktlcm5lbDMyLklOU1RBTkNFCiAgICAgICAgaWYga2VybmFsLkdldFNob3J0UGF0aE5hbWUoZGlyLCBidWYsIGJ1Zl9zaXplKToKICAgICAgICAgICAgZGlyID0gam5hLk5hdGl2ZS50b1N0cmluZyhidWYudG9zdHJpbmcoKSkucnN0cmlwKCJcMCIpCgogICAgcmV0dXJuIGRpcgoKaWYgc3lzdGVtID09ICJ3aW4zMiI6CiAgICB0cnk6CiAgICAgICAgaW1wb3J0IHdpbjMyY29tLnNoZWxsCiAgICAgICAgX2dldF93aW5fZm9sZGVyID0gX2dldF93aW5fZm9sZGVyX3dpdGhfcHl3aW4zMgogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIHRyeToKICAgICAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IHdpbmRsbAogICAgICAgICAgICBfZ2V0X3dpbl9mb2xkZXIgPSBfZ2V0X3dpbl9mb2xkZXJfd2l0aF9jdHlwZXMKICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIGltcG9ydCBjb20uc3VuLmpuYQogICAgICAgICAgICAgICAgX2dldF93aW5fZm9sZGVyID0gX2dldF93aW5fZm9sZGVyX3dpdGhfam5hCiAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgICAgICAgIF9nZXRfd2luX2ZvbGRlciA9IF9nZXRfd2luX2ZvbGRlcl9mcm9tX3JlZ2lzdHJ5CgoKIy0tLS0gc2VsZiB0ZXN0IGNvZGUKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICBhcHBuYW1lID0gIk15QXBwIgogICAgYXBwYXV0aG9yID0gIk15Q29tcGFueSIKCiAgICBwcm9wcyA9ICgidXNlcl9kYXRhX2RpciIsICJzaXRlX2RhdGFfZGlyIiwKICAgICAgICAgICAgICJ1c2VyX2NvbmZpZ19kaXIiLCAic2l0ZV9jb25maWdfZGlyIiwKICAgICAgICAgICAgICJ1c2VyX2NhY2hlX2RpciIsICJ1c2VyX2xvZ19kaXIiKQoKICAgIHByaW50KCItLSBhcHAgZGlycyAod2l0aCBvcHRpb25hbCAndmVyc2lvbicpIikKICAgIGRpcnMgPSBBcHBEaXJzKGFwcG5hbWUsIGFwcGF1dGhvciwgdmVyc2lvbj0iMS4wIikKICAgIGZvciBwcm9wIGluIHByb3BzOgogICAgICAgIHByaW50KCIlczogJXMiICUgKHByb3AsIGdldGF0dHIoZGlycywgcHJvcCkpKQoKICAgIHByaW50KCJcbi0tIGFwcCBkaXJzICh3aXRob3V0IG9wdGlvbmFsICd2ZXJzaW9uJykiKQogICAgZGlycyA9IEFwcERpcnMoYXBwbmFtZSwgYXBwYXV0aG9yKQogICAgZm9yIHByb3AgaW4gcHJvcHM6CiAgICAgICAgcHJpbnQoIiVzOiAlcyIgJSAocHJvcCwgZ2V0YXR0cihkaXJzLCBwcm9wKSkpCgogICAgcHJpbnQoIlxuLS0gYXBwIGRpcnMgKHdpdGhvdXQgb3B0aW9uYWwgJ2FwcGF1dGhvcicpIikKICAgIGRpcnMgPSBBcHBEaXJzKGFwcG5hbWUpCiAgICBmb3IgcHJvcCBpbiBwcm9wczoKICAgICAgICBwcmludCgiJXM6ICVzIiAlIChwcm9wLCBnZXRhdHRyKGRpcnMsIHByb3ApKSkKCiAgICBwcmludCgiXG4tLSBhcHAgZGlycyAod2l0aCBkaXNhYmxlZCAnYXBwYXV0aG9yJykiKQogICAgZGlycyA9IEFwcERpcnMoYXBwbmFtZSwgYXBwYXV0aG9yPUZhbHNlKQogICAgZm9yIHByb3AgaW4gcHJvcHM6CiAgICAgICAgcHJpbnQoIiVzOiAlcyIgJSAocHJvcCwgZ2V0YXR0cihkaXJzLCBwcm9wKSkpClBLAwQUAAAAAAAAACEAPClYxtACAADQAgAARAAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvX19hYm91dF9fLnB5IyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uCiMgMi4wLCBhbmQgdGhlIEJTRCBMaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHJlcG9zaXRvcnkKIyBmb3IgY29tcGxldGUgZGV0YWlscy4KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCBwcmludF9mdW5jdGlvbgoKX19hbGxfXyA9IFsKICAgICJfX3RpdGxlX18iLCAiX19zdW1tYXJ5X18iLCAiX191cmlfXyIsICJfX3ZlcnNpb25fXyIsICJfX2F1dGhvcl9fIiwKICAgICJfX2VtYWlsX18iLCAiX19saWNlbnNlX18iLCAiX19jb3B5cmlnaHRfXyIsCl0KCl9fdGl0bGVfXyA9ICJwYWNrYWdpbmciCl9fc3VtbWFyeV9fID0gIkNvcmUgdXRpbGl0aWVzIGZvciBQeXRob24gcGFja2FnZXMiCl9fdXJpX18gPSAiaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvcGFja2FnaW5nIgoKX192ZXJzaW9uX18gPSAiMTYuOCIKCl9fYXV0aG9yX18gPSAiRG9uYWxkIFN0dWZmdCBhbmQgaW5kaXZpZHVhbCBjb250cmlidXRvcnMiCl9fZW1haWxfXyA9ICJkb25hbGRAc3R1ZmZ0LmlvIgoKX19saWNlbnNlX18gPSAiQlNEIG9yIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCIKX19jb3B5cmlnaHRfXyA9ICJDb3B5cmlnaHQgMjAxNC0yMDE2ICVzIiAlIF9fYXV0aG9yX18KUEsDBBQAAAAAAAAAIQCBdpbKAQIAAAECAABDAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9fX2luaXRfXy5weSMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbgojIDIuMCwgYW5kIHRoZSBCU0QgTGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyByZXBvc2l0b3J5CiMgZm9yIGNvbXBsZXRlIGRldGFpbHMuCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgcHJpbnRfZnVuY3Rpb24KCmZyb20gLl9fYWJvdXRfXyBpbXBvcnQgKAogICAgX19hdXRob3JfXywgX19jb3B5cmlnaHRfXywgX19lbWFpbF9fLCBfX2xpY2Vuc2VfXywgX19zdW1tYXJ5X18sIF9fdGl0bGVfXywKICAgIF9fdXJpX18sIF9fdmVyc2lvbl9fCikKCl9fYWxsX18gPSBbCiAgICAiX190aXRsZV9fIiwgIl9fc3VtbWFyeV9fIiwgIl9fdXJpX18iLCAiX192ZXJzaW9uX18iLCAiX19hdXRob3JfXyIsCiAgICAiX19lbWFpbF9fIiwgIl9fbGljZW5zZV9fIiwgIl9fY29weXJpZ2h0X18iLApdClBLAwQUAAAAAAAAACEA5mlK41wDAABcAwAAQgAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvX2NvbXBhdC5weSMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbgojIDIuMCwgYW5kIHRoZSBCU0QgTGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyByZXBvc2l0b3J5CiMgZm9yIGNvbXBsZXRlIGRldGFpbHMuCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgcHJpbnRfZnVuY3Rpb24KCmltcG9ydCBzeXMKCgpQWTIgPSBzeXMudmVyc2lvbl9pbmZvWzBdID09IDIKUFkzID0gc3lzLnZlcnNpb25faW5mb1swXSA9PSAzCgojIGZsYWtlODogbm9xYQoKaWYgUFkzOgogICAgc3RyaW5nX3R5cGVzID0gc3RyLAplbHNlOgogICAgc3RyaW5nX3R5cGVzID0gYmFzZXN0cmluZywKCgpkZWYgd2l0aF9tZXRhY2xhc3MobWV0YSwgKmJhc2VzKToKICAgICIiIgogICAgQ3JlYXRlIGEgYmFzZSBjbGFzcyB3aXRoIGEgbWV0YWNsYXNzLgogICAgIiIiCiAgICAjIFRoaXMgcmVxdWlyZXMgYSBiaXQgb2YgZXhwbGFuYXRpb246IHRoZSBiYXNpYyBpZGVhIGlzIHRvIG1ha2UgYSBkdW1teQogICAgIyBtZXRhY2xhc3MgZm9yIG9uZSBsZXZlbCBvZiBjbGFzcyBpbnN0YW50aWF0aW9uIHRoYXQgcmVwbGFjZXMgaXRzZWxmIHdpdGgKICAgICMgdGhlIGFjdHVhbCBtZXRhY2xhc3MuCiAgICBjbGFzcyBtZXRhY2xhc3MobWV0YSk6CiAgICAgICAgZGVmIF9fbmV3X18oY2xzLCBuYW1lLCB0aGlzX2Jhc2VzLCBkKToKICAgICAgICAgICAgcmV0dXJuIG1ldGEobmFtZSwgYmFzZXMsIGQpCiAgICByZXR1cm4gdHlwZS5fX25ld19fKG1ldGFjbGFzcywgJ3RlbXBvcmFyeV9jbGFzcycsICgpLCB7fSkKUEsDBBQAAAAAAAAAIQD6/aQSiAUAAIgFAABGAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9fc3RydWN0dXJlcy5weSMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbgojIDIuMCwgYW5kIHRoZSBCU0QgTGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyByZXBvc2l0b3J5CiMgZm9yIGNvbXBsZXRlIGRldGFpbHMuCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgcHJpbnRfZnVuY3Rpb24KCgpjbGFzcyBJbmZpbml0eShvYmplY3QpOgoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIkluZmluaXR5IgoKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gaGFzaChyZXByKHNlbGYpKQoKICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXykKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gbm90IGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKQoKICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIF9fZ2VfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgX19uZWdfXyhzZWxmKToKICAgICAgICByZXR1cm4gTmVnYXRpdmVJbmZpbml0eQoKSW5maW5pdHkgPSBJbmZpbml0eSgpCgoKY2xhc3MgTmVnYXRpdmVJbmZpbml0eShvYmplY3QpOgoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIi1JbmZpbml0eSIKCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgcmV0dXJuIGhhc2gocmVwcihzZWxmKSkKCiAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKQoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBub3QgaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pCgogICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIF9fZ2VfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIF9fbmVnX18oc2VsZik6CiAgICAgICAgcmV0dXJuIEluZmluaXR5CgpOZWdhdGl2ZUluZmluaXR5ID0gTmVnYXRpdmVJbmZpbml0eSgpClBLAwQUAAAAAAAAACEAMPgT3DggAAA4IAAAQgAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvbWFya2Vycy5weSMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbgojIDIuMCwgYW5kIHRoZSBCU0QgTGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyByZXBvc2l0b3J5CiMgZm9yIGNvbXBsZXRlIGRldGFpbHMuCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgcHJpbnRfZnVuY3Rpb24KCmltcG9ydCBvcGVyYXRvcgppbXBvcnQgb3MKaW1wb3J0IHBsYXRmb3JtCmltcG9ydCBzeXMKCmZyb20gcGtnX3Jlc291cmNlcy5leHRlcm4ucHlwYXJzaW5nIGltcG9ydCBQYXJzZUV4Y2VwdGlvbiwgUGFyc2VSZXN1bHRzLCBzdHJpbmdTdGFydCwgc3RyaW5nRW5kCmZyb20gcGtnX3Jlc291cmNlcy5leHRlcm4ucHlwYXJzaW5nIGltcG9ydCBaZXJvT3JNb3JlLCBHcm91cCwgRm9yd2FyZCwgUXVvdGVkU3RyaW5nCmZyb20gcGtnX3Jlc291cmNlcy5leHRlcm4ucHlwYXJzaW5nIGltcG9ydCBMaXRlcmFsIGFzIEwgICMgbm9xYQoKZnJvbSAuX2NvbXBhdCBpbXBvcnQgc3RyaW5nX3R5cGVzCmZyb20gLnNwZWNpZmllcnMgaW1wb3J0IFNwZWNpZmllciwgSW52YWxpZFNwZWNpZmllcgoKCl9fYWxsX18gPSBbCiAgICAiSW52YWxpZE1hcmtlciIsICJVbmRlZmluZWRDb21wYXJpc29uIiwgIlVuZGVmaW5lZEVudmlyb25tZW50TmFtZSIsCiAgICAiTWFya2VyIiwgImRlZmF1bHRfZW52aXJvbm1lbnQiLApdCgoKY2xhc3MgSW52YWxpZE1hcmtlcihWYWx1ZUVycm9yKToKICAgICIiIgogICAgQW4gaW52YWxpZCBtYXJrZXIgd2FzIGZvdW5kLCB1c2VycyBzaG91bGQgcmVmZXIgdG8gUEVQIDUwOC4KICAgICIiIgoKCmNsYXNzIFVuZGVmaW5lZENvbXBhcmlzb24oVmFsdWVFcnJvcik6CiAgICAiIiIKICAgIEFuIGludmFsaWQgb3BlcmF0aW9uIHdhcyBhdHRlbXB0ZWQgb24gYSB2YWx1ZSB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCBpdC4KICAgICIiIgoKCmNsYXNzIFVuZGVmaW5lZEVudmlyb25tZW50TmFtZShWYWx1ZUVycm9yKToKICAgICIiIgogICAgQSBuYW1lIHdhcyBhdHRlbXB0ZWQgdG8gYmUgdXNlZCB0aGF0IGRvZXMgbm90IGV4aXN0IGluc2lkZSBvZiB0aGUKICAgIGVudmlyb25tZW50LgogICAgIiIiCgoKY2xhc3MgTm9kZShvYmplY3QpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSk6CiAgICAgICAgc2VsZi52YWx1ZSA9IHZhbHVlCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHN0cihzZWxmLnZhbHVlKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIjx7MH0oezEhcn0pPiIuZm9ybWF0KHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzdHIoc2VsZikpCgogICAgZGVmIHNlcmlhbGl6ZShzZWxmKToKICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCgoKY2xhc3MgVmFyaWFibGUoTm9kZSk6CgogICAgZGVmIHNlcmlhbGl6ZShzZWxmKToKICAgICAgICByZXR1cm4gc3RyKHNlbGYpCgoKY2xhc3MgVmFsdWUoTm9kZSk6CgogICAgZGVmIHNlcmlhbGl6ZShzZWxmKToKICAgICAgICByZXR1cm4gJyJ7MH0iJy5mb3JtYXQoc2VsZikKCgpjbGFzcyBPcChOb2RlKToKCiAgICBkZWYgc2VyaWFsaXplKHNlbGYpOgogICAgICAgIHJldHVybiBzdHIoc2VsZikKCgpWQVJJQUJMRSA9ICgKICAgIEwoImltcGxlbWVudGF0aW9uX3ZlcnNpb24iKSB8CiAgICBMKCJwbGF0Zm9ybV9weXRob25faW1wbGVtZW50YXRpb24iKSB8CiAgICBMKCJpbXBsZW1lbnRhdGlvbl9uYW1lIikgfAogICAgTCgicHl0aG9uX2Z1bGxfdmVyc2lvbiIpIHwKICAgIEwoInBsYXRmb3JtX3JlbGVhc2UiKSB8CiAgICBMKCJwbGF0Zm9ybV92ZXJzaW9uIikgfAogICAgTCgicGxhdGZvcm1fbWFjaGluZSIpIHwKICAgIEwoInBsYXRmb3JtX3N5c3RlbSIpIHwKICAgIEwoInB5dGhvbl92ZXJzaW9uIikgfAogICAgTCgic3lzX3BsYXRmb3JtIikgfAogICAgTCgib3NfbmFtZSIpIHwKICAgIEwoIm9zLm5hbWUiKSB8ICAjIFBFUC0zNDUKICAgIEwoInN5cy5wbGF0Zm9ybSIpIHwgICMgUEVQLTM0NQogICAgTCgicGxhdGZvcm0udmVyc2lvbiIpIHwgICMgUEVQLTM0NQogICAgTCgicGxhdGZvcm0ubWFjaGluZSIpIHwgICMgUEVQLTM0NQogICAgTCgicGxhdGZvcm0ucHl0aG9uX2ltcGxlbWVudGF0aW9uIikgfCAgIyBQRVAtMzQ1CiAgICBMKCJweXRob25faW1wbGVtZW50YXRpb24iKSB8ICAjIHVuZG9jdW1lbnRlZCBzZXR1cHRvb2xzIGxlZ2FjeQogICAgTCgiZXh0cmEiKQopCkFMSUFTRVMgPSB7CiAgICAnb3MubmFtZSc6ICdvc19uYW1lJywKICAgICdzeXMucGxhdGZvcm0nOiAnc3lzX3BsYXRmb3JtJywKICAgICdwbGF0Zm9ybS52ZXJzaW9uJzogJ3BsYXRmb3JtX3ZlcnNpb24nLAogICAgJ3BsYXRmb3JtLm1hY2hpbmUnOiAncGxhdGZvcm1fbWFjaGluZScsCiAgICAncGxhdGZvcm0ucHl0aG9uX2ltcGxlbWVudGF0aW9uJzogJ3BsYXRmb3JtX3B5dGhvbl9pbXBsZW1lbnRhdGlvbicsCiAgICAncHl0aG9uX2ltcGxlbWVudGF0aW9uJzogJ3BsYXRmb3JtX3B5dGhvbl9pbXBsZW1lbnRhdGlvbicKfQpWQVJJQUJMRS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcywgbCwgdDogVmFyaWFibGUoQUxJQVNFUy5nZXQodFswXSwgdFswXSkpKQoKVkVSU0lPTl9DTVAgPSAoCiAgICBMKCI9PT0iKSB8CiAgICBMKCI9PSIpIHwKICAgIEwoIj49IikgfAogICAgTCgiPD0iKSB8CiAgICBMKCIhPSIpIHwKICAgIEwoIn49IikgfAogICAgTCgiPiIpIHwKICAgIEwoIjwiKQopCgpNQVJLRVJfT1AgPSBWRVJTSU9OX0NNUCB8IEwoIm5vdCBpbiIpIHwgTCgiaW4iKQpNQVJLRVJfT1Auc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsIGwsIHQ6IE9wKHRbMF0pKQoKTUFSS0VSX1ZBTFVFID0gUXVvdGVkU3RyaW5nKCInIikgfCBRdW90ZWRTdHJpbmcoJyInKQpNQVJLRVJfVkFMVUUuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsIGwsIHQ6IFZhbHVlKHRbMF0pKQoKQk9PTE9QID0gTCgiYW5kIikgfCBMKCJvciIpCgpNQVJLRVJfVkFSID0gVkFSSUFCTEUgfCBNQVJLRVJfVkFMVUUKCk1BUktFUl9JVEVNID0gR3JvdXAoTUFSS0VSX1ZBUiArIE1BUktFUl9PUCArIE1BUktFUl9WQVIpCk1BUktFUl9JVEVNLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLCBsLCB0OiB0dXBsZSh0WzBdKSkKCkxQQVJFTiA9IEwoIigiKS5zdXBwcmVzcygpClJQQVJFTiA9IEwoIikiKS5zdXBwcmVzcygpCgpNQVJLRVJfRVhQUiA9IEZvcndhcmQoKQpNQVJLRVJfQVRPTSA9IE1BUktFUl9JVEVNIHwgR3JvdXAoTFBBUkVOICsgTUFSS0VSX0VYUFIgKyBSUEFSRU4pCk1BUktFUl9FWFBSIDw8IE1BUktFUl9BVE9NICsgWmVyb09yTW9yZShCT09MT1AgKyBNQVJLRVJfRVhQUikKCk1BUktFUiA9IHN0cmluZ1N0YXJ0ICsgTUFSS0VSX0VYUFIgKyBzdHJpbmdFbmQKCgpkZWYgX2NvZXJjZV9wYXJzZV9yZXN1bHQocmVzdWx0cyk6CiAgICBpZiBpc2luc3RhbmNlKHJlc3VsdHMsIFBhcnNlUmVzdWx0cyk6CiAgICAgICAgcmV0dXJuIFtfY29lcmNlX3BhcnNlX3Jlc3VsdChpKSBmb3IgaSBpbiByZXN1bHRzXQogICAgZWxzZToKICAgICAgICByZXR1cm4gcmVzdWx0cwoKCmRlZiBfZm9ybWF0X21hcmtlcihtYXJrZXIsIGZpcnN0PVRydWUpOgogICAgYXNzZXJ0IGlzaW5zdGFuY2UobWFya2VyLCAobGlzdCwgdHVwbGUsIHN0cmluZ190eXBlcykpCgogICAgIyBTb21ldGltZXMgd2UgaGF2ZSBhIHN0cnVjdHVyZSBsaWtlIFtbLi4uXV0gd2hpY2ggaXMgYSBzaW5nbGUgaXRlbSBsaXN0CiAgICAjIHdoZXJlIHRoZSBzaW5nbGUgaXRlbSBpcyBpdHNlbGYgaXQncyBvd24gbGlzdC4gSW4gdGhhdCBjYXNlIHdlIHdhbnQgc2tpcAogICAgIyB0aGUgcmVzdCBvZiB0aGlzIGZ1bmN0aW9uIHNvIHRoYXQgd2UgZG9uJ3QgZ2V0IGV4dHJhbmVvdXMgKCkgb24gdGhlCiAgICAjIG91dHNpZGUuCiAgICBpZiAoaXNpbnN0YW5jZShtYXJrZXIsIGxpc3QpIGFuZCBsZW4obWFya2VyKSA9PSAxIGFuZAogICAgICAgICAgICBpc2luc3RhbmNlKG1hcmtlclswXSwgKGxpc3QsIHR1cGxlKSkpOgogICAgICAgIHJldHVybiBfZm9ybWF0X21hcmtlcihtYXJrZXJbMF0pCgogICAgaWYgaXNpbnN0YW5jZShtYXJrZXIsIGxpc3QpOgogICAgICAgIGlubmVyID0gKF9mb3JtYXRfbWFya2VyKG0sIGZpcnN0PUZhbHNlKSBmb3IgbSBpbiBtYXJrZXIpCiAgICAgICAgaWYgZmlyc3Q6CiAgICAgICAgICAgIHJldHVybiAiICIuam9pbihpbm5lcikKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gIigiICsgIiAiLmpvaW4oaW5uZXIpICsgIikiCiAgICBlbGlmIGlzaW5zdGFuY2UobWFya2VyLCB0dXBsZSk6CiAgICAgICAgcmV0dXJuICIgIi5qb2luKFttLnNlcmlhbGl6ZSgpIGZvciBtIGluIG1hcmtlcl0pCiAgICBlbHNlOgogICAgICAgIHJldHVybiBtYXJrZXIKCgpfb3BlcmF0b3JzID0gewogICAgImluIjogbGFtYmRhIGxocywgcmhzOiBsaHMgaW4gcmhzLAogICAgIm5vdCBpbiI6IGxhbWJkYSBsaHMsIHJoczogbGhzIG5vdCBpbiByaHMsCiAgICAiPCI6IG9wZXJhdG9yLmx0LAogICAgIjw9Ijogb3BlcmF0b3IubGUsCiAgICAiPT0iOiBvcGVyYXRvci5lcSwKICAgICIhPSI6IG9wZXJhdG9yLm5lLAogICAgIj49Ijogb3BlcmF0b3IuZ2UsCiAgICAiPiI6IG9wZXJhdG9yLmd0LAp9CgoKZGVmIF9ldmFsX29wKGxocywgb3AsIHJocyk6CiAgICB0cnk6CiAgICAgICAgc3BlYyA9IFNwZWNpZmllcigiIi5qb2luKFtvcC5zZXJpYWxpemUoKSwgcmhzXSkpCiAgICBleGNlcHQgSW52YWxpZFNwZWNpZmllcjoKICAgICAgICBwYXNzCiAgICBlbHNlOgogICAgICAgIHJldHVybiBzcGVjLmNvbnRhaW5zKGxocykKCiAgICBvcGVyID0gX29wZXJhdG9ycy5nZXQob3Auc2VyaWFsaXplKCkpCiAgICBpZiBvcGVyIGlzIE5vbmU6CiAgICAgICAgcmFpc2UgVW5kZWZpbmVkQ29tcGFyaXNvbigKICAgICAgICAgICAgIlVuZGVmaW5lZCB7MCFyfSBvbiB7MSFyfSBhbmQgezIhcn0uIi5mb3JtYXQob3AsIGxocywgcmhzKQogICAgICAgICkKCiAgICByZXR1cm4gb3BlcihsaHMsIHJocykKCgpfdW5kZWZpbmVkID0gb2JqZWN0KCkKCgpkZWYgX2dldF9lbnYoZW52aXJvbm1lbnQsIG5hbWUpOgogICAgdmFsdWUgPSBlbnZpcm9ubWVudC5nZXQobmFtZSwgX3VuZGVmaW5lZCkKCiAgICBpZiB2YWx1ZSBpcyBfdW5kZWZpbmVkOgogICAgICAgIHJhaXNlIFVuZGVmaW5lZEVudmlyb25tZW50TmFtZSgKICAgICAgICAgICAgInswIXJ9IGRvZXMgbm90IGV4aXN0IGluIGV2YWx1YXRpb24gZW52aXJvbm1lbnQuIi5mb3JtYXQobmFtZSkKICAgICAgICApCgogICAgcmV0dXJuIHZhbHVlCgoKZGVmIF9ldmFsdWF0ZV9tYXJrZXJzKG1hcmtlcnMsIGVudmlyb25tZW50KToKICAgIGdyb3VwcyA9IFtbXV0KCiAgICBmb3IgbWFya2VyIGluIG1hcmtlcnM6CiAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UobWFya2VyLCAobGlzdCwgdHVwbGUsIHN0cmluZ190eXBlcykpCgogICAgICAgIGlmIGlzaW5zdGFuY2UobWFya2VyLCBsaXN0KToKICAgICAgICAgICAgZ3JvdXBzWy0xXS5hcHBlbmQoX2V2YWx1YXRlX21hcmtlcnMobWFya2VyLCBlbnZpcm9ubWVudCkpCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKG1hcmtlciwgdHVwbGUpOgogICAgICAgICAgICBsaHMsIG9wLCByaHMgPSBtYXJrZXIKCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UobGhzLCBWYXJpYWJsZSk6CiAgICAgICAgICAgICAgICBsaHNfdmFsdWUgPSBfZ2V0X2VudihlbnZpcm9ubWVudCwgbGhzLnZhbHVlKQogICAgICAgICAgICAgICAgcmhzX3ZhbHVlID0gcmhzLnZhbHVlCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBsaHNfdmFsdWUgPSBsaHMudmFsdWUKICAgICAgICAgICAgICAgIHJoc192YWx1ZSA9IF9nZXRfZW52KGVudmlyb25tZW50LCByaHMudmFsdWUpCgogICAgICAgICAgICBncm91cHNbLTFdLmFwcGVuZChfZXZhbF9vcChsaHNfdmFsdWUsIG9wLCByaHNfdmFsdWUpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGFzc2VydCBtYXJrZXIgaW4gWyJhbmQiLCAib3IiXQogICAgICAgICAgICBpZiBtYXJrZXIgPT0gIm9yIjoKICAgICAgICAgICAgICAgIGdyb3Vwcy5hcHBlbmQoW10pCgogICAgcmV0dXJuIGFueShhbGwoaXRlbSkgZm9yIGl0ZW0gaW4gZ3JvdXBzKQoKCmRlZiBmb3JtYXRfZnVsbF92ZXJzaW9uKGluZm8pOgogICAgdmVyc2lvbiA9ICd7MC5tYWpvcn0uezAubWlub3J9LnswLm1pY3JvfScuZm9ybWF0KGluZm8pCiAgICBraW5kID0gaW5mby5yZWxlYXNlbGV2ZWwKICAgIGlmIGtpbmQgIT0gJ2ZpbmFsJzoKICAgICAgICB2ZXJzaW9uICs9IGtpbmRbMF0gKyBzdHIoaW5mby5zZXJpYWwpCiAgICByZXR1cm4gdmVyc2lvbgoKCmRlZiBkZWZhdWx0X2Vudmlyb25tZW50KCk6CiAgICBpZiBoYXNhdHRyKHN5cywgJ2ltcGxlbWVudGF0aW9uJyk6CiAgICAgICAgaXZlciA9IGZvcm1hdF9mdWxsX3ZlcnNpb24oc3lzLmltcGxlbWVudGF0aW9uLnZlcnNpb24pCiAgICAgICAgaW1wbGVtZW50YXRpb25fbmFtZSA9IHN5cy5pbXBsZW1lbnRhdGlvbi5uYW1lCiAgICBlbHNlOgogICAgICAgIGl2ZXIgPSAnMCcKICAgICAgICBpbXBsZW1lbnRhdGlvbl9uYW1lID0gJycKCiAgICByZXR1cm4gewogICAgICAgICJpbXBsZW1lbnRhdGlvbl9uYW1lIjogaW1wbGVtZW50YXRpb25fbmFtZSwKICAgICAgICAiaW1wbGVtZW50YXRpb25fdmVyc2lvbiI6IGl2ZXIsCiAgICAgICAgIm9zX25hbWUiOiBvcy5uYW1lLAogICAgICAgICJwbGF0Zm9ybV9tYWNoaW5lIjogcGxhdGZvcm0ubWFjaGluZSgpLAogICAgICAgICJwbGF0Zm9ybV9yZWxlYXNlIjogcGxhdGZvcm0ucmVsZWFzZSgpLAogICAgICAgICJwbGF0Zm9ybV9zeXN0ZW0iOiBwbGF0Zm9ybS5zeXN0ZW0oKSwKICAgICAgICAicGxhdGZvcm1fdmVyc2lvbiI6IHBsYXRmb3JtLnZlcnNpb24oKSwKICAgICAgICAicHl0aG9uX2Z1bGxfdmVyc2lvbiI6IHBsYXRmb3JtLnB5dGhvbl92ZXJzaW9uKCksCiAgICAgICAgInBsYXRmb3JtX3B5dGhvbl9pbXBsZW1lbnRhdGlvbiI6IHBsYXRmb3JtLnB5dGhvbl9pbXBsZW1lbnRhdGlvbigpLAogICAgICAgICJweXRob25fdmVyc2lvbiI6IHBsYXRmb3JtLnB5dGhvbl92ZXJzaW9uKClbOjNdLAogICAgICAgICJzeXNfcGxhdGZvcm0iOiBzeXMucGxhdGZvcm0sCiAgICB9CgoKY2xhc3MgTWFya2VyKG9iamVjdCk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hcmtlcik6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLl9tYXJrZXJzID0gX2NvZXJjZV9wYXJzZV9yZXN1bHQoTUFSS0VSLnBhcnNlU3RyaW5nKG1hcmtlcikpCiAgICAgICAgZXhjZXB0IFBhcnNlRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIGVycl9zdHIgPSAiSW52YWxpZCBtYXJrZXI6IHswIXJ9LCBwYXJzZSBlcnJvciBhdCB7MSFyfSIuZm9ybWF0KAogICAgICAgICAgICAgICAgbWFya2VyLCBtYXJrZXJbZS5sb2M6ZS5sb2MgKyA4XSkKICAgICAgICAgICAgcmFpc2UgSW52YWxpZE1hcmtlcihlcnJfc3RyKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiBfZm9ybWF0X21hcmtlcihzZWxmLl9tYXJrZXJzKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIjxNYXJrZXIoezAhcn0pPiIuZm9ybWF0KHN0cihzZWxmKSkKCiAgICBkZWYgZXZhbHVhdGUoc2VsZiwgZW52aXJvbm1lbnQ9Tm9uZSk6CiAgICAgICAgIiIiRXZhbHVhdGUgYSBtYXJrZXIuCgogICAgICAgIFJldHVybiB0aGUgYm9vbGVhbiBmcm9tIGV2YWx1YXRpbmcgdGhlIGdpdmVuIG1hcmtlciBhZ2FpbnN0IHRoZQogICAgICAgIGVudmlyb25tZW50LiBlbnZpcm9ubWVudCBpcyBhbiBvcHRpb25hbCBhcmd1bWVudCB0byBvdmVycmlkZSBhbGwgb3IKICAgICAgICBwYXJ0IG9mIHRoZSBkZXRlcm1pbmVkIGVudmlyb25tZW50LgoKICAgICAgICBUaGUgZW52aXJvbm1lbnQgaXMgZGV0ZXJtaW5lZCBmcm9tIHRoZSBjdXJyZW50IFB5dGhvbiBwcm9jZXNzLgogICAgICAgICIiIgogICAgICAgIGN1cnJlbnRfZW52aXJvbm1lbnQgPSBkZWZhdWx0X2Vudmlyb25tZW50KCkKICAgICAgICBpZiBlbnZpcm9ubWVudCBpcyBub3QgTm9uZToKICAgICAgICAgICAgY3VycmVudF9lbnZpcm9ubWVudC51cGRhdGUoZW52aXJvbm1lbnQpCgogICAgICAgIHJldHVybiBfZXZhbHVhdGVfbWFya2VycyhzZWxmLl9tYXJrZXJzLCBjdXJyZW50X2Vudmlyb25tZW50KQpQSwMEFAAAAAAAAAAhAKWGHdsDEQAAAxEAAEcAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL3JlcXVpcmVtZW50cy5weSMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbgojIDIuMCwgYW5kIHRoZSBCU0QgTGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyByZXBvc2l0b3J5CiMgZm9yIGNvbXBsZXRlIGRldGFpbHMuCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgcHJpbnRfZnVuY3Rpb24KCmltcG9ydCBzdHJpbmcKaW1wb3J0IHJlCgpmcm9tIHBrZ19yZXNvdXJjZXMuZXh0ZXJuLnB5cGFyc2luZyBpbXBvcnQgc3RyaW5nU3RhcnQsIHN0cmluZ0VuZCwgb3JpZ2luYWxUZXh0Rm9yLCBQYXJzZUV4Y2VwdGlvbgpmcm9tIHBrZ19yZXNvdXJjZXMuZXh0ZXJuLnB5cGFyc2luZyBpbXBvcnQgWmVyb09yTW9yZSwgV29yZCwgT3B0aW9uYWwsIFJlZ2V4LCBDb21iaW5lCmZyb20gcGtnX3Jlc291cmNlcy5leHRlcm4ucHlwYXJzaW5nIGltcG9ydCBMaXRlcmFsIGFzIEwgICMgbm9xYQpmcm9tIHBrZ19yZXNvdXJjZXMuZXh0ZXJuLnNpeC5tb3Zlcy51cmxsaWIgaW1wb3J0IHBhcnNlIGFzIHVybHBhcnNlCgpmcm9tIC5tYXJrZXJzIGltcG9ydCBNQVJLRVJfRVhQUiwgTWFya2VyCmZyb20gLnNwZWNpZmllcnMgaW1wb3J0IExlZ2FjeVNwZWNpZmllciwgU3BlY2lmaWVyLCBTcGVjaWZpZXJTZXQKCgpjbGFzcyBJbnZhbGlkUmVxdWlyZW1lbnQoVmFsdWVFcnJvcik6CiAgICAiIiIKICAgIEFuIGludmFsaWQgcmVxdWlyZW1lbnQgd2FzIGZvdW5kLCB1c2VycyBzaG91bGQgcmVmZXIgdG8gUEVQIDUwOC4KICAgICIiIgoKCkFMUEhBTlVNID0gV29yZChzdHJpbmcuYXNjaWlfbGV0dGVycyArIHN0cmluZy5kaWdpdHMpCgpMQlJBQ0tFVCA9IEwoIlsiKS5zdXBwcmVzcygpClJCUkFDS0VUID0gTCgiXSIpLnN1cHByZXNzKCkKTFBBUkVOID0gTCgiKCIpLnN1cHByZXNzKCkKUlBBUkVOID0gTCgiKSIpLnN1cHByZXNzKCkKQ09NTUEgPSBMKCIsIikuc3VwcHJlc3MoKQpTRU1JQ09MT04gPSBMKCI7Iikuc3VwcHJlc3MoKQpBVCA9IEwoIkAiKS5zdXBwcmVzcygpCgpQVU5DVFVBVElPTiA9IFdvcmQoIi1fLiIpCklERU5USUZJRVJfRU5EID0gQUxQSEFOVU0gfCAoWmVyb09yTW9yZShQVU5DVFVBVElPTikgKyBBTFBIQU5VTSkKSURFTlRJRklFUiA9IENvbWJpbmUoQUxQSEFOVU0gKyBaZXJvT3JNb3JlKElERU5USUZJRVJfRU5EKSkKCk5BTUUgPSBJREVOVElGSUVSKCJuYW1lIikKRVhUUkEgPSBJREVOVElGSUVSCgpVUkkgPSBSZWdleChyJ1teIF0rJykoInVybCIpClVSTCA9IChBVCArIFVSSSkKCkVYVFJBU19MSVNUID0gRVhUUkEgKyBaZXJvT3JNb3JlKENPTU1BICsgRVhUUkEpCkVYVFJBUyA9IChMQlJBQ0tFVCArIE9wdGlvbmFsKEVYVFJBU19MSVNUKSArIFJCUkFDS0VUKSgiZXh0cmFzIikKClZFUlNJT05fUEVQNDQwID0gUmVnZXgoU3BlY2lmaWVyLl9yZWdleF9zdHIsIHJlLlZFUkJPU0UgfCByZS5JR05PUkVDQVNFKQpWRVJTSU9OX0xFR0FDWSA9IFJlZ2V4KExlZ2FjeVNwZWNpZmllci5fcmVnZXhfc3RyLCByZS5WRVJCT1NFIHwgcmUuSUdOT1JFQ0FTRSkKClZFUlNJT05fT05FID0gVkVSU0lPTl9QRVA0NDAgXiBWRVJTSU9OX0xFR0FDWQpWRVJTSU9OX01BTlkgPSBDb21iaW5lKFZFUlNJT05fT05FICsgWmVyb09yTW9yZShDT01NQSArIFZFUlNJT05fT05FKSwKICAgICAgICAgICAgICAgICAgICAgICBqb2luU3RyaW5nPSIsIiwgYWRqYWNlbnQ9RmFsc2UpKCJfcmF3X3NwZWMiKQpfVkVSU0lPTl9TUEVDID0gT3B0aW9uYWwoKChMUEFSRU4gKyBWRVJTSU9OX01BTlkgKyBSUEFSRU4pIHwgVkVSU0lPTl9NQU5ZKSkKX1ZFUlNJT05fU1BFQy5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcywgbCwgdDogdC5fcmF3X3NwZWMgb3IgJycpCgpWRVJTSU9OX1NQRUMgPSBvcmlnaW5hbFRleHRGb3IoX1ZFUlNJT05fU1BFQykoInNwZWNpZmllciIpClZFUlNJT05fU1BFQy5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcywgbCwgdDogdFsxXSkKCk1BUktFUl9FWFBSID0gb3JpZ2luYWxUZXh0Rm9yKE1BUktFUl9FWFBSKCkpKCJtYXJrZXIiKQpNQVJLRVJfRVhQUi5zZXRQYXJzZUFjdGlvbigKICAgIGxhbWJkYSBzLCBsLCB0OiBNYXJrZXIoc1t0Ll9vcmlnaW5hbF9zdGFydDp0Ll9vcmlnaW5hbF9lbmRdKQopCk1BUktFUl9TRVBFUkFUT1IgPSBTRU1JQ09MT04KTUFSS0VSID0gTUFSS0VSX1NFUEVSQVRPUiArIE1BUktFUl9FWFBSCgpWRVJTSU9OX0FORF9NQVJLRVIgPSBWRVJTSU9OX1NQRUMgKyBPcHRpb25hbChNQVJLRVIpClVSTF9BTkRfTUFSS0VSID0gVVJMICsgT3B0aW9uYWwoTUFSS0VSKQoKTkFNRURfUkVRVUlSRU1FTlQgPSBcCiAgICBOQU1FICsgT3B0aW9uYWwoRVhUUkFTKSArIChVUkxfQU5EX01BUktFUiB8IFZFUlNJT05fQU5EX01BUktFUikKClJFUVVJUkVNRU5UID0gc3RyaW5nU3RhcnQgKyBOQU1FRF9SRVFVSVJFTUVOVCArIHN0cmluZ0VuZAoKCmNsYXNzIFJlcXVpcmVtZW50KG9iamVjdCk6CiAgICAiIiJQYXJzZSBhIHJlcXVpcmVtZW50LgoKICAgIFBhcnNlIGEgZ2l2ZW4gcmVxdWlyZW1lbnQgc3RyaW5nIGludG8gaXRzIHBhcnRzLCBzdWNoIGFzIG5hbWUsIHNwZWNpZmllciwKICAgIFVSTCwgYW5kIGV4dHJhcy4gUmFpc2VzIEludmFsaWRSZXF1aXJlbWVudCBvbiBhIGJhZGx5LWZvcm1lZCByZXF1aXJlbWVudAogICAgc3RyaW5nLgogICAgIiIiCgogICAgIyBUT0RPOiBDYW4gd2UgdGVzdCB3aGV0aGVyIHNvbWV0aGluZyBpcyBjb250YWluZWQgd2l0aGluIGEgcmVxdWlyZW1lbnQ/CiAgICAjICAgICAgIElmIHNvIGhvdyBkbyB3ZSBkbyB0aGF0PyBEbyB3ZSBuZWVkIHRvIHRlc3QgYWdhaW5zdCB0aGUgX25hbWVfIG9mCiAgICAjICAgICAgIHRoZSB0aGluZyBhcyB3ZWxsIGFzIHRoZSB2ZXJzaW9uPyBXaGF0IGFib3V0IHRoZSBtYXJrZXJzPwogICAgIyBUT0RPOiBDYW4gd2Ugbm9ybWFsaXplIHRoZSBuYW1lIGFuZCBleHRyYSBuYW1lPwoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCByZXF1aXJlbWVudF9zdHJpbmcpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmVxID0gUkVRVUlSRU1FTlQucGFyc2VTdHJpbmcocmVxdWlyZW1lbnRfc3RyaW5nKQogICAgICAgIGV4Y2VwdCBQYXJzZUV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICByYWlzZSBJbnZhbGlkUmVxdWlyZW1lbnQoCiAgICAgICAgICAgICAgICAiSW52YWxpZCByZXF1aXJlbWVudCwgcGFyc2UgZXJyb3IgYXQgXCJ7MCFyfVwiIi5mb3JtYXQoCiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnRfc3RyaW5nW2UubG9jOmUubG9jICsgOF0pKQoKICAgICAgICBzZWxmLm5hbWUgPSByZXEubmFtZQogICAgICAgIGlmIHJlcS51cmw6CiAgICAgICAgICAgIHBhcnNlZF91cmwgPSB1cmxwYXJzZS51cmxwYXJzZShyZXEudXJsKQogICAgICAgICAgICBpZiBub3QgKHBhcnNlZF91cmwuc2NoZW1lIGFuZCBwYXJzZWRfdXJsLm5ldGxvYykgb3IgKAogICAgICAgICAgICAgICAgICAgIG5vdCBwYXJzZWRfdXJsLnNjaGVtZSBhbmQgbm90IHBhcnNlZF91cmwubmV0bG9jKToKICAgICAgICAgICAgICAgIHJhaXNlIEludmFsaWRSZXF1aXJlbWVudCgiSW52YWxpZCBVUkwgZ2l2ZW4iKQogICAgICAgICAgICBzZWxmLnVybCA9IHJlcS51cmwKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLnVybCA9IE5vbmUKICAgICAgICBzZWxmLmV4dHJhcyA9IHNldChyZXEuZXh0cmFzLmFzTGlzdCgpIGlmIHJlcS5leHRyYXMgZWxzZSBbXSkKICAgICAgICBzZWxmLnNwZWNpZmllciA9IFNwZWNpZmllclNldChyZXEuc3BlY2lmaWVyKQogICAgICAgIHNlbGYubWFya2VyID0gcmVxLm1hcmtlciBpZiByZXEubWFya2VyIGVsc2UgTm9uZQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHBhcnRzID0gW3NlbGYubmFtZV0KCiAgICAgICAgaWYgc2VsZi5leHRyYXM6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgiW3swfV0iLmZvcm1hdCgiLCIuam9pbihzb3J0ZWQoc2VsZi5leHRyYXMpKSkpCgogICAgICAgIGlmIHNlbGYuc3BlY2lmaWVyOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoc3RyKHNlbGYuc3BlY2lmaWVyKSkKCiAgICAgICAgaWYgc2VsZi51cmw6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgiQCB7MH0iLmZvcm1hdChzZWxmLnVybCkpCgogICAgICAgIGlmIHNlbGYubWFya2VyOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoIjsgezB9Ii5mb3JtYXQoc2VsZi5tYXJrZXIpKQoKICAgICAgICByZXR1cm4gIiIuam9pbihwYXJ0cykKCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICI8UmVxdWlyZW1lbnQoezAhcn0pPiIuZm9ybWF0KHN0cihzZWxmKSkKUEsDBBQAAAAAAAAAIQB8RYOMeW0AAHltAABFAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy9zcGVjaWZpZXJzLnB5IyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uCiMgMi4wLCBhbmQgdGhlIEJTRCBMaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHJlcG9zaXRvcnkKIyBmb3IgY29tcGxldGUgZGV0YWlscy4KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCBwcmludF9mdW5jdGlvbgoKaW1wb3J0IGFiYwppbXBvcnQgZnVuY3Rvb2xzCmltcG9ydCBpdGVydG9vbHMKaW1wb3J0IHJlCgpmcm9tIC5fY29tcGF0IGltcG9ydCBzdHJpbmdfdHlwZXMsIHdpdGhfbWV0YWNsYXNzCmZyb20gLnZlcnNpb24gaW1wb3J0IFZlcnNpb24sIExlZ2FjeVZlcnNpb24sIHBhcnNlCgoKY2xhc3MgSW52YWxpZFNwZWNpZmllcihWYWx1ZUVycm9yKToKICAgICIiIgogICAgQW4gaW52YWxpZCBzcGVjaWZpZXIgd2FzIGZvdW5kLCB1c2VycyBzaG91bGQgcmVmZXIgdG8gUEVQIDQ0MC4KICAgICIiIgoKCmNsYXNzIEJhc2VTcGVjaWZpZXIod2l0aF9tZXRhY2xhc3MoYWJjLkFCQ01ldGEsIG9iamVjdCkpOgoKICAgIEBhYmMuYWJzdHJhY3RtZXRob2QKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybnMgdGhlIHN0ciByZXByZXNlbnRhdGlvbiBvZiB0aGlzIFNwZWNpZmllciBsaWtlIG9iamVjdC4gVGhpcwogICAgICAgIHNob3VsZCBiZSByZXByZXNlbnRhdGl2ZSBvZiB0aGUgU3BlY2lmaWVyIGl0c2VsZi4KICAgICAgICAiIiIKCiAgICBAYWJjLmFic3RyYWN0bWV0aG9kCiAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJucyBhIGhhc2ggdmFsdWUgZm9yIHRoaXMgU3BlY2lmaWVyIGxpa2Ugb2JqZWN0LgogICAgICAgICIiIgoKICAgIEBhYmMuYWJzdHJhY3RtZXRob2QKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgICIiIgogICAgICAgIFJldHVybnMgYSBib29sZWFuIHJlcHJlc2VudGluZyB3aGV0aGVyIG9yIG5vdCB0aGUgdHdvIFNwZWNpZmllciBsaWtlCiAgICAgICAgb2JqZWN0cyBhcmUgZXF1YWwuCiAgICAgICAgIiIiCgogICAgQGFiYy5hYnN0cmFjdG1ldGhvZAogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJucyBhIGJvb2xlYW4gcmVwcmVzZW50aW5nIHdoZXRoZXIgb3Igbm90IHRoZSB0d28gU3BlY2lmaWVyIGxpa2UKICAgICAgICBvYmplY3RzIGFyZSBub3QgZXF1YWwuCiAgICAgICAgIiIiCgogICAgQGFiYy5hYnN0cmFjdHByb3BlcnR5CiAgICBkZWYgcHJlcmVsZWFzZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJucyB3aGV0aGVyIG9yIG5vdCBwcmUtcmVsZWFzZXMgYXMgYSB3aG9sZSBhcmUgYWxsb3dlZCBieSB0aGlzCiAgICAgICAgc3BlY2lmaWVyLgogICAgICAgICIiIgoKICAgIEBwcmVyZWxlYXNlcy5zZXR0ZXIKICAgIGRlZiBwcmVyZWxlYXNlcyhzZWxmLCB2YWx1ZSk6CiAgICAgICAgIiIiCiAgICAgICAgU2V0cyB3aGV0aGVyIG9yIG5vdCBwcmUtcmVsZWFzZXMgYXMgYSB3aG9sZSBhcmUgYWxsb3dlZCBieSB0aGlzCiAgICAgICAgc3BlY2lmaWVyLgogICAgICAgICIiIgoKICAgIEBhYmMuYWJzdHJhY3RtZXRob2QKICAgIGRlZiBjb250YWlucyhzZWxmLCBpdGVtLCBwcmVyZWxlYXNlcz1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBEZXRlcm1pbmVzIGlmIHRoZSBnaXZlbiBpdGVtIGlzIGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBzcGVjaWZpZXIuCiAgICAgICAgIiIiCgogICAgQGFiYy5hYnN0cmFjdG1ldGhvZAogICAgZGVmIGZpbHRlcihzZWxmLCBpdGVyYWJsZSwgcHJlcmVsZWFzZXM9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgVGFrZXMgYW4gaXRlcmFibGUgb2YgaXRlbXMgYW5kIGZpbHRlcnMgdGhlbSBzbyB0aGF0IG9ubHkgaXRlbXMgd2hpY2gKICAgICAgICBhcmUgY29udGFpbmVkIHdpdGhpbiB0aGlzIHNwZWNpZmllciBhcmUgYWxsb3dlZCBpbiBpdC4KICAgICAgICAiIiIKCgpjbGFzcyBfSW5kaXZpZHVhbFNwZWNpZmllcihCYXNlU3BlY2lmaWVyKToKCiAgICBfb3BlcmF0b3JzID0ge30KCiAgICBkZWYgX19pbml0X18oc2VsZiwgc3BlYz0iIiwgcHJlcmVsZWFzZXM9Tm9uZSk6CiAgICAgICAgbWF0Y2ggPSBzZWxmLl9yZWdleC5zZWFyY2goc3BlYykKICAgICAgICBpZiBub3QgbWF0Y2g6CiAgICAgICAgICAgIHJhaXNlIEludmFsaWRTcGVjaWZpZXIoIkludmFsaWQgc3BlY2lmaWVyOiAnezB9JyIuZm9ybWF0KHNwZWMpKQoKICAgICAgICBzZWxmLl9zcGVjID0gKAogICAgICAgICAgICBtYXRjaC5ncm91cCgib3BlcmF0b3IiKS5zdHJpcCgpLAogICAgICAgICAgICBtYXRjaC5ncm91cCgidmVyc2lvbiIpLnN0cmlwKCksCiAgICAgICAgKQoKICAgICAgICAjIFN0b3JlIHdoZXRoZXIgb3Igbm90IHRoaXMgU3BlY2lmaWVyIHNob3VsZCBhY2NlcHQgcHJlcmVsZWFzZXMKICAgICAgICBzZWxmLl9wcmVyZWxlYXNlcyA9IHByZXJlbGVhc2VzCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHByZSA9ICgKICAgICAgICAgICAgIiwgcHJlcmVsZWFzZXM9ezAhcn0iLmZvcm1hdChzZWxmLnByZXJlbGVhc2VzKQogICAgICAgICAgICBpZiBzZWxmLl9wcmVyZWxlYXNlcyBpcyBub3QgTm9uZQogICAgICAgICAgICBlbHNlICIiCiAgICAgICAgKQoKICAgICAgICByZXR1cm4gIjx7MH0oezEhcn17Mn0pPiIuZm9ybWF0KAogICAgICAgICAgICBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywKICAgICAgICAgICAgc3RyKHNlbGYpLAogICAgICAgICAgICBwcmUsCiAgICAgICAgKQoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiezB9ezF9Ii5mb3JtYXQoKnNlbGYuX3NwZWMpCgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBoYXNoKHNlbGYuX3NwZWMpCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgb3RoZXIgPSBzZWxmLl9fY2xhc3NfXyhvdGhlcikKICAgICAgICAgICAgZXhjZXB0IEludmFsaWRTcGVjaWZpZXI6CiAgICAgICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXyk6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAoKICAgICAgICByZXR1cm4gc2VsZi5fc3BlYyA9PSBvdGhlci5fc3BlYwoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIG90aGVyID0gc2VsZi5fX2NsYXNzX18ob3RoZXIpCiAgICAgICAgICAgIGV4Y2VwdCBJbnZhbGlkU3BlY2lmaWVyOgogICAgICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCiAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKCiAgICAgICAgcmV0dXJuIHNlbGYuX3NwZWMgIT0gb3RoZXIuX3NwZWMKCiAgICBkZWYgX2dldF9vcGVyYXRvcihzZWxmLCBvcCk6CiAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZiwgIl9jb21wYXJlX3swfSIuZm9ybWF0KHNlbGYuX29wZXJhdG9yc1tvcF0pKQoKICAgIGRlZiBfY29lcmNlX3ZlcnNpb24oc2VsZiwgdmVyc2lvbik6CiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmVyc2lvbiwgKExlZ2FjeVZlcnNpb24sIFZlcnNpb24pKToKICAgICAgICAgICAgdmVyc2lvbiA9IHBhcnNlKHZlcnNpb24pCiAgICAgICAgcmV0dXJuIHZlcnNpb24KCiAgICBAcHJvcGVydHkKICAgIGRlZiBvcGVyYXRvcihzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fc3BlY1swXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHZlcnNpb24oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3NwZWNbMV0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBwcmVyZWxlYXNlcyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fcHJlcmVsZWFzZXMKCiAgICBAcHJlcmVsZWFzZXMuc2V0dGVyCiAgICBkZWYgcHJlcmVsZWFzZXMoc2VsZiwgdmFsdWUpOgogICAgICAgIHNlbGYuX3ByZXJlbGVhc2VzID0gdmFsdWUKCiAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGl0ZW0pOgogICAgICAgIHJldHVybiBzZWxmLmNvbnRhaW5zKGl0ZW0pCgogICAgZGVmIGNvbnRhaW5zKHNlbGYsIGl0ZW0sIHByZXJlbGVhc2VzPU5vbmUpOgogICAgICAgICMgRGV0ZXJtaW5lIGlmIHByZXJlbGVhc2VzIGFyZSB0byBiZSBhbGxvd2VkIG9yIG5vdC4KICAgICAgICBpZiBwcmVyZWxlYXNlcyBpcyBOb25lOgogICAgICAgICAgICBwcmVyZWxlYXNlcyA9IHNlbGYucHJlcmVsZWFzZXMKCiAgICAgICAgIyBOb3JtYWxpemUgaXRlbSB0byBhIFZlcnNpb24gb3IgTGVnYWN5VmVyc2lvbiwgdGhpcyBhbGxvd3MgdXMgdG8gaGF2ZQogICAgICAgICMgYSBzaG9ydGN1dCBmb3IgYGAiMi4wIiBpbiBTcGVjaWZpZXIoIj49MiIpCiAgICAgICAgaXRlbSA9IHNlbGYuX2NvZXJjZV92ZXJzaW9uKGl0ZW0pCgogICAgICAgICMgRGV0ZXJtaW5lIGlmIHdlIHNob3VsZCBiZSBzdXBwb3J0aW5nIHByZXJlbGVhc2VzIGluIHRoaXMgc3BlY2lmaWVyCiAgICAgICAgIyBvciBub3QsIGlmIHdlIGRvIG5vdCBzdXBwb3J0IHByZXJlbGVhc2VzIHRoYW4gd2UgY2FuIHNob3J0IGNpcmN1aXQKICAgICAgICAjIGxvZ2ljIGlmIHRoaXMgdmVyc2lvbiBpcyBhIHByZXJlbGVhc2VzLgogICAgICAgIGlmIGl0ZW0uaXNfcHJlcmVsZWFzZSBhbmQgbm90IHByZXJlbGVhc2VzOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBBY3R1YWxseSBkbyB0aGUgY29tcGFyaXNvbiB0byBkZXRlcm1pbmUgaWYgdGhpcyBpdGVtIGlzIGNvbnRhaW5lZAogICAgICAgICMgd2l0aGluIHRoaXMgU3BlY2lmaWVyIG9yIG5vdC4KICAgICAgICByZXR1cm4gc2VsZi5fZ2V0X29wZXJhdG9yKHNlbGYub3BlcmF0b3IpKGl0ZW0sIHNlbGYudmVyc2lvbikKCiAgICBkZWYgZmlsdGVyKHNlbGYsIGl0ZXJhYmxlLCBwcmVyZWxlYXNlcz1Ob25lKToKICAgICAgICB5aWVsZGVkID0gRmFsc2UKICAgICAgICBmb3VuZF9wcmVyZWxlYXNlcyA9IFtdCgogICAgICAgIGt3ID0geyJwcmVyZWxlYXNlcyI6IHByZXJlbGVhc2VzIGlmIHByZXJlbGVhc2VzIGlzIG5vdCBOb25lIGVsc2UgVHJ1ZX0KCiAgICAgICAgIyBBdHRlbXB0IHRvIGl0ZXJhdGUgb3ZlciBhbGwgdGhlIHZhbHVlcyBpbiB0aGUgaXRlcmFibGUgYW5kIGlmIGFueSBvZgogICAgICAgICMgdGhlbSBtYXRjaCwgeWllbGQgdGhlbS4KICAgICAgICBmb3IgdmVyc2lvbiBpbiBpdGVyYWJsZToKICAgICAgICAgICAgcGFyc2VkX3ZlcnNpb24gPSBzZWxmLl9jb2VyY2VfdmVyc2lvbih2ZXJzaW9uKQoKICAgICAgICAgICAgaWYgc2VsZi5jb250YWlucyhwYXJzZWRfdmVyc2lvbiwgKiprdyk6CiAgICAgICAgICAgICAgICAjIElmIG91ciB2ZXJzaW9uIGlzIGEgcHJlcmVsZWFzZSwgYW5kIHdlIHdlcmUgbm90IHNldCB0byBhbGxvdwogICAgICAgICAgICAgICAgIyBwcmVyZWxlYXNlcywgdGhlbiB3ZSdsbCBzdG9yZSBpdCBmb3IgbGF0ZXIgaW5jYXNlIG5vdGhpbmcKICAgICAgICAgICAgICAgICMgZWxzZSBtYXRjaGVzIHRoaXMgc3BlY2lmaWVyLgogICAgICAgICAgICAgICAgaWYgKHBhcnNlZF92ZXJzaW9uLmlzX3ByZXJlbGVhc2UgYW5kIG5vdAogICAgICAgICAgICAgICAgICAgICAgICAocHJlcmVsZWFzZXMgb3Igc2VsZi5wcmVyZWxlYXNlcykpOgogICAgICAgICAgICAgICAgICAgIGZvdW5kX3ByZXJlbGVhc2VzLmFwcGVuZCh2ZXJzaW9uKQogICAgICAgICAgICAgICAgIyBFaXRoZXIgdGhpcyBpcyBub3QgYSBwcmVyZWxlYXNlLCBvciB3ZSBzaG91bGQgaGF2ZSBiZWVuCiAgICAgICAgICAgICAgICAjIGFjY2VwdGluZyBwcmVyZWxlYXNlcyBmcm9tIHRoZSBiZWdpbmluZy4KICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgeWllbGRlZCA9IFRydWUKICAgICAgICAgICAgICAgICAgICB5aWVsZCB2ZXJzaW9uCgogICAgICAgICMgTm93IHRoYXQgd2UndmUgaXRlcmF0ZWQgb3ZlciBldmVyeXRoaW5nLCBkZXRlcm1pbmUgaWYgd2UndmUgeWllbGRlZAogICAgICAgICMgYW55IHZhbHVlcywgYW5kIGlmIHdlIGhhdmUgbm90IGFuZCB3ZSBoYXZlIGFueSBwcmVyZWxlYXNlcyBzdG9yZWQgdXAKICAgICAgICAjIHRoZW4gd2Ugd2lsbCBnbyBhaGVhZCBhbmQgeWllbGQgdGhlIHByZXJlbGVhc2VzLgogICAgICAgIGlmIG5vdCB5aWVsZGVkIGFuZCBmb3VuZF9wcmVyZWxlYXNlczoKICAgICAgICAgICAgZm9yIHZlcnNpb24gaW4gZm91bmRfcHJlcmVsZWFzZXM6CiAgICAgICAgICAgICAgICB5aWVsZCB2ZXJzaW9uCgoKY2xhc3MgTGVnYWN5U3BlY2lmaWVyKF9JbmRpdmlkdWFsU3BlY2lmaWVyKToKCiAgICBfcmVnZXhfc3RyID0gKAogICAgICAgIHIiIiIKICAgICAgICAoP1A8b3BlcmF0b3I+KD09fCE9fDw9fD49fDx8PikpCiAgICAgICAgXHMqCiAgICAgICAgKD9QPHZlcnNpb24+CiAgICAgICAgICAgIFteLDtccyldKiAjIFNpbmNlIHRoaXMgaXMgYSAibGVnYWN5IiBzcGVjaWZpZXIsIGFuZCB0aGUgdmVyc2lvbgogICAgICAgICAgICAgICAgICAgICAgIyBzdHJpbmcgY2FuIGJlIGp1c3QgYWJvdXQgYW55dGhpbmcsIHdlIG1hdGNoIGV2ZXJ5dGhpbmcKICAgICAgICAgICAgICAgICAgICAgICMgZXhjZXB0IGZvciB3aGl0ZXNwYWNlLCBhIHNlbWktY29sb24gZm9yIG1hcmtlciBzdXBwb3J0LAogICAgICAgICAgICAgICAgICAgICAgIyBhIGNsb3NpbmcgcGFyZW4gc2luY2UgdmVyc2lvbnMgY2FuIGJlIGVuY2xvc2VkIGluCiAgICAgICAgICAgICAgICAgICAgICAjIHRoZW0sIGFuZCBhIGNvbW1hIHNpbmNlIGl0J3MgYSB2ZXJzaW9uIHNlcGFyYXRvci4KICAgICAgICApCiAgICAgICAgIiIiCiAgICApCgogICAgX3JlZ2V4ID0gcmUuY29tcGlsZSgKICAgICAgICByIl5ccyoiICsgX3JlZ2V4X3N0ciArIHIiXHMqJCIsIHJlLlZFUkJPU0UgfCByZS5JR05PUkVDQVNFKQoKICAgIF9vcGVyYXRvcnMgPSB7CiAgICAgICAgIj09IjogImVxdWFsIiwKICAgICAgICAiIT0iOiAibm90X2VxdWFsIiwKICAgICAgICAiPD0iOiAibGVzc190aGFuX2VxdWFsIiwKICAgICAgICAiPj0iOiAiZ3JlYXRlcl90aGFuX2VxdWFsIiwKICAgICAgICAiPCI6ICJsZXNzX3RoYW4iLAogICAgICAgICI+IjogImdyZWF0ZXJfdGhhbiIsCiAgICB9CgogICAgZGVmIF9jb2VyY2VfdmVyc2lvbihzZWxmLCB2ZXJzaW9uKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2ZXJzaW9uLCBMZWdhY3lWZXJzaW9uKToKICAgICAgICAgICAgdmVyc2lvbiA9IExlZ2FjeVZlcnNpb24oc3RyKHZlcnNpb24pKQogICAgICAgIHJldHVybiB2ZXJzaW9uCgogICAgZGVmIF9jb21wYXJlX2VxdWFsKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICByZXR1cm4gcHJvc3BlY3RpdmUgPT0gc2VsZi5fY29lcmNlX3ZlcnNpb24oc3BlYykKCiAgICBkZWYgX2NvbXBhcmVfbm90X2VxdWFsKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICByZXR1cm4gcHJvc3BlY3RpdmUgIT0gc2VsZi5fY29lcmNlX3ZlcnNpb24oc3BlYykKCiAgICBkZWYgX2NvbXBhcmVfbGVzc190aGFuX2VxdWFsKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICByZXR1cm4gcHJvc3BlY3RpdmUgPD0gc2VsZi5fY29lcmNlX3ZlcnNpb24oc3BlYykKCiAgICBkZWYgX2NvbXBhcmVfZ3JlYXRlcl90aGFuX2VxdWFsKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICByZXR1cm4gcHJvc3BlY3RpdmUgPj0gc2VsZi5fY29lcmNlX3ZlcnNpb24oc3BlYykKCiAgICBkZWYgX2NvbXBhcmVfbGVzc190aGFuKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICByZXR1cm4gcHJvc3BlY3RpdmUgPCBzZWxmLl9jb2VyY2VfdmVyc2lvbihzcGVjKQoKICAgIGRlZiBfY29tcGFyZV9ncmVhdGVyX3RoYW4oc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgIHJldHVybiBwcm9zcGVjdGl2ZSA+IHNlbGYuX2NvZXJjZV92ZXJzaW9uKHNwZWMpCgoKZGVmIF9yZXF1aXJlX3ZlcnNpb25fY29tcGFyZShmbik6CiAgICBAZnVuY3Rvb2xzLndyYXBzKGZuKQogICAgZGVmIHdyYXBwZWQoc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHByb3NwZWN0aXZlLCBWZXJzaW9uKToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgcmV0dXJuIGZuKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKQogICAgcmV0dXJuIHdyYXBwZWQKCgpjbGFzcyBTcGVjaWZpZXIoX0luZGl2aWR1YWxTcGVjaWZpZXIpOgoKICAgIF9yZWdleF9zdHIgPSAoCiAgICAgICAgciIiIgogICAgICAgICg/UDxvcGVyYXRvcj4ofj18PT18IT18PD18Pj18PHw+fD09PSkpCiAgICAgICAgKD9QPHZlcnNpb24+CiAgICAgICAgICAgICg/OgogICAgICAgICAgICAgICAgIyBUaGUgaWRlbnRpdHkgb3BlcmF0b3JzIGFsbG93IGZvciBhbiBlc2NhcGUgaGF0Y2ggdGhhdCB3aWxsCiAgICAgICAgICAgICAgICAjIGRvIGFuIGV4YWN0IHN0cmluZyBtYXRjaCBvZiB0aGUgdmVyc2lvbiB5b3Ugd2lzaCB0byBpbnN0YWxsLgogICAgICAgICAgICAgICAgIyBUaGlzIHdpbGwgbm90IGJlIHBhcnNlZCBieSBQRVAgNDQwIGFuZCB3ZSBjYW5ub3QgZGV0ZXJtaW5lCiAgICAgICAgICAgICAgICAjIGFueSBzZW1hbnRpYyBtZWFuaW5nIGZyb20gaXQuIFRoaXMgb3BlcmF0b3IgaXMgZGlzY291cmFnZWQKICAgICAgICAgICAgICAgICMgYnV0IGluY2x1ZGVkIGVudGlyZWx5IGFzIGFuIGVzY2FwZSBoYXRjaC4KICAgICAgICAgICAgICAgICg/PD09PT0pICAjIE9ubHkgbWF0Y2ggZm9yIHRoZSBpZGVudGl0eSBvcGVyYXRvcgogICAgICAgICAgICAgICAgXHMqCiAgICAgICAgICAgICAgICBbXlxzXSogICAgIyBXZSBqdXN0IG1hdGNoIGV2ZXJ5dGhpbmcsIGV4Y2VwdCBmb3Igd2hpdGVzcGFjZQogICAgICAgICAgICAgICAgICAgICAgICAgICMgc2luY2Ugd2UgYXJlIG9ubHkgdGVzdGluZyBmb3Igc3RyaWN0IGlkZW50aXR5LgogICAgICAgICAgICApCiAgICAgICAgICAgIHwKICAgICAgICAgICAgKD86CiAgICAgICAgICAgICAgICAjIFRoZSAobm9uKWVxdWFsaXR5IG9wZXJhdG9ycyBhbGxvdyBmb3Igd2lsZCBjYXJkIGFuZCBsb2NhbAogICAgICAgICAgICAgICAgIyB2ZXJzaW9ucyB0byBiZSBzcGVjaWZpZWQgc28gd2UgaGF2ZSB0byBkZWZpbmUgdGhlc2UgdHdvCiAgICAgICAgICAgICAgICAjIG9wZXJhdG9ycyBzZXBhcmF0ZWx5IHRvIGVuYWJsZSB0aGF0LgogICAgICAgICAgICAgICAgKD88PT09fCE9KSAgICAgICAgICAgICMgT25seSBtYXRjaCBmb3IgZXF1YWxzIGFuZCBub3QgZXF1YWxzCgogICAgICAgICAgICAgICAgXHMqCiAgICAgICAgICAgICAgICB2PwogICAgICAgICAgICAgICAgKD86WzAtOV0rISk/ICAgICAgICAgICMgZXBvY2gKICAgICAgICAgICAgICAgIFswLTldKyg/OlwuWzAtOV0rKSogICAjIHJlbGVhc2UKICAgICAgICAgICAgICAgICg/OiAgICAgICAgICAgICAgICAgICAjIHByZSByZWxlYXNlCiAgICAgICAgICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAgICAgICAgIChhfGJ8Y3xyY3xhbHBoYXxiZXRhfHByZXxwcmV2aWV3KQogICAgICAgICAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgICAgICAgICBbMC05XSoKICAgICAgICAgICAgICAgICk/CiAgICAgICAgICAgICAgICAoPzogICAgICAgICAgICAgICAgICAgIyBwb3N0IHJlbGVhc2UKICAgICAgICAgICAgICAgICAgICAoPzotWzAtOV0rKXwoPzpbLV9cLl0/KHBvc3R8cmV2fHIpWy1fXC5dP1swLTldKikKICAgICAgICAgICAgICAgICk/CgogICAgICAgICAgICAgICAgIyBZb3UgY2Fubm90IHVzZSBhIHdpbGQgY2FyZCBhbmQgYSBkZXYgb3IgbG9jYWwgdmVyc2lvbgogICAgICAgICAgICAgICAgIyB0b2dldGhlciBzbyBncm91cCB0aGVtIHdpdGggYSB8IGFuZCBtYWtlIHRoZW0gb3B0aW9uYWwuCiAgICAgICAgICAgICAgICAoPzoKICAgICAgICAgICAgICAgICAgICAoPzpbLV9cLl0/ZGV2Wy1fXC5dP1swLTldKik/ICAgICAgICAgIyBkZXYgcmVsZWFzZQogICAgICAgICAgICAgICAgICAgICg/OlwrW2EtejAtOV0rKD86Wy1fXC5dW2EtejAtOV0rKSopPyAjIGxvY2FsCiAgICAgICAgICAgICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgIFwuXCogICMgV2lsZCBjYXJkIHN5bnRheCBvZiAuKgogICAgICAgICAgICAgICAgKT8KICAgICAgICAgICAgKQogICAgICAgICAgICB8CiAgICAgICAgICAgICg/OgogICAgICAgICAgICAgICAgIyBUaGUgY29tcGF0aWJsZSBvcGVyYXRvciByZXF1aXJlcyBhdCBsZWFzdCB0d28gZGlnaXRzIGluIHRoZQogICAgICAgICAgICAgICAgIyByZWxlYXNlIHNlZ21lbnQuCiAgICAgICAgICAgICAgICAoPzw9fj0pICAgICAgICAgICAgICAgIyBPbmx5IG1hdGNoIGZvciB0aGUgY29tcGF0aWJsZSBvcGVyYXRvcgoKICAgICAgICAgICAgICAgIFxzKgogICAgICAgICAgICAgICAgdj8KICAgICAgICAgICAgICAgICg/OlswLTldKyEpPyAgICAgICAgICAjIGVwb2NoCiAgICAgICAgICAgICAgICBbMC05XSsoPzpcLlswLTldKykrICAgIyByZWxlYXNlICAoV2UgaGF2ZSBhICsgaW5zdGVhZCBvZiBhICopCiAgICAgICAgICAgICAgICAoPzogICAgICAgICAgICAgICAgICAgIyBwcmUgcmVsZWFzZQogICAgICAgICAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgICAgICAgICAoYXxifGN8cmN8YWxwaGF8YmV0YXxwcmV8cHJldmlldykKICAgICAgICAgICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICAgICAgICAgWzAtOV0qCiAgICAgICAgICAgICAgICApPwogICAgICAgICAgICAgICAgKD86ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHBvc3QgcmVsZWFzZQogICAgICAgICAgICAgICAgICAgICg/Oi1bMC05XSspfCg/OlstX1wuXT8ocG9zdHxyZXZ8cilbLV9cLl0/WzAtOV0qKQogICAgICAgICAgICAgICAgKT8KICAgICAgICAgICAgICAgICg/OlstX1wuXT9kZXZbLV9cLl0/WzAtOV0qKT8gICAgICAgICAgIyBkZXYgcmVsZWFzZQogICAgICAgICAgICApCiAgICAgICAgICAgIHwKICAgICAgICAgICAgKD86CiAgICAgICAgICAgICAgICAjIEFsbCBvdGhlciBvcGVyYXRvcnMgb25seSBhbGxvdyBhIHN1YiBzZXQgb2Ygd2hhdCB0aGUKICAgICAgICAgICAgICAgICMgKG5vbillcXVhbGl0eSBvcGVyYXRvcnMgZG8uIFNwZWNpZmljYWxseSB0aGV5IGRvIG5vdCBhbGxvdwogICAgICAgICAgICAgICAgIyBsb2NhbCB2ZXJzaW9ucyB0byBiZSBzcGVjaWZpZWQgbm9yIGRvIHRoZXkgYWxsb3cgdGhlIHByZWZpeAogICAgICAgICAgICAgICAgIyBtYXRjaGluZyB3aWxkIGNhcmRzLgogICAgICAgICAgICAgICAgKD88IT09fCE9fH49KSAgICAgICAgICMgV2UgaGF2ZSBzcGVjaWFsIGNhc2VzIGZvciB0aGVzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb3BlcmF0b3JzIHNvIHdlIHdhbnQgdG8gbWFrZSBzdXJlIHRoZXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGRvbid0IG1hdGNoIGhlcmUuCgogICAgICAgICAgICAgICAgXHMqCiAgICAgICAgICAgICAgICB2PwogICAgICAgICAgICAgICAgKD86WzAtOV0rISk/ICAgICAgICAgICMgZXBvY2gKICAgICAgICAgICAgICAgIFswLTldKyg/OlwuWzAtOV0rKSogICAjIHJlbGVhc2UKICAgICAgICAgICAgICAgICg/OiAgICAgICAgICAgICAgICAgICAjIHByZSByZWxlYXNlCiAgICAgICAgICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAgICAgICAgIChhfGJ8Y3xyY3xhbHBoYXxiZXRhfHByZXxwcmV2aWV3KQogICAgICAgICAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgICAgICAgICBbMC05XSoKICAgICAgICAgICAgICAgICk/CiAgICAgICAgICAgICAgICAoPzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcG9zdCByZWxlYXNlCiAgICAgICAgICAgICAgICAgICAgKD86LVswLTldKyl8KD86Wy1fXC5dPyhwb3N0fHJldnxyKVstX1wuXT9bMC05XSopCiAgICAgICAgICAgICAgICApPwogICAgICAgICAgICAgICAgKD86Wy1fXC5dP2RldlstX1wuXT9bMC05XSopPyAgICAgICAgICAjIGRldiByZWxlYXNlCiAgICAgICAgICAgICkKICAgICAgICApCiAgICAgICAgIiIiCiAgICApCgogICAgX3JlZ2V4ID0gcmUuY29tcGlsZSgKICAgICAgICByIl5ccyoiICsgX3JlZ2V4X3N0ciArIHIiXHMqJCIsIHJlLlZFUkJPU0UgfCByZS5JR05PUkVDQVNFKQoKICAgIF9vcGVyYXRvcnMgPSB7CiAgICAgICAgIn49IjogImNvbXBhdGlibGUiLAogICAgICAgICI9PSI6ICJlcXVhbCIsCiAgICAgICAgIiE9IjogIm5vdF9lcXVhbCIsCiAgICAgICAgIjw9IjogImxlc3NfdGhhbl9lcXVhbCIsCiAgICAgICAgIj49IjogImdyZWF0ZXJfdGhhbl9lcXVhbCIsCiAgICAgICAgIjwiOiAibGVzc190aGFuIiwKICAgICAgICAiPiI6ICJncmVhdGVyX3RoYW4iLAogICAgICAgICI9PT0iOiAiYXJiaXRyYXJ5IiwKICAgIH0KCiAgICBAX3JlcXVpcmVfdmVyc2lvbl9jb21wYXJlCiAgICBkZWYgX2NvbXBhcmVfY29tcGF0aWJsZShzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgIyBDb21wYXRpYmxlIHJlbGVhc2VzIGhhdmUgYW4gZXF1aXZhbGVudCBjb21iaW5hdGlvbiBvZiA+PSBhbmQgPT0uIFRoYXQKICAgICAgICAjIGlzIHRoYXQgfj0yLjIgaXMgZXF1aXZhbGVudCB0byA+PTIuMiw9PTIuKi4gVGhpcyBhbGxvd3MgdXMgdG8KICAgICAgICAjIGltcGxlbWVudCB0aGlzIGluIHRlcm1zIG9mIHRoZSBvdGhlciBzcGVjaWZpZXJzIGluc3RlYWQgb2YKICAgICAgICAjIGltcGxlbWVudGluZyBpdCBvdXJzZWx2ZXMuIFRoZSBvbmx5IHRoaW5nIHdlIG5lZWQgdG8gZG8gaXMgY29uc3RydWN0CiAgICAgICAgIyB0aGUgb3RoZXIgc3BlY2lmaWVycy4KCiAgICAgICAgIyBXZSB3YW50IGV2ZXJ5dGhpbmcgYnV0IHRoZSBsYXN0IGl0ZW0gaW4gdGhlIHZlcnNpb24sIGJ1dCB3ZSB3YW50IHRvCiAgICAgICAgIyBpZ25vcmUgcG9zdCBhbmQgZGV2IHJlbGVhc2VzIGFuZCB3ZSB3YW50IHRvIHRyZWF0IHRoZSBwcmUtcmVsZWFzZSBhcwogICAgICAgICMgaXQncyBvd24gc2VwYXJhdGUgc2VnbWVudC4KICAgICAgICBwcmVmaXggPSAiLiIuam9pbigKICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAgIGl0ZXJ0b29scy50YWtld2hpbGUoCiAgICAgICAgICAgICAgICAgICAgbGFtYmRhIHg6IChub3QgeC5zdGFydHN3aXRoKCJwb3N0IikgYW5kIG5vdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeC5zdGFydHN3aXRoKCJkZXYiKSksCiAgICAgICAgICAgICAgICAgICAgX3ZlcnNpb25fc3BsaXQoc3BlYyksCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIClbOi0xXQogICAgICAgICkKCiAgICAgICAgIyBBZGQgdGhlIHByZWZpeCBub3RhdGlvbiB0byB0aGUgZW5kIG9mIG91ciBzdHJpbmcKICAgICAgICBwcmVmaXggKz0gIi4qIgoKICAgICAgICByZXR1cm4gKHNlbGYuX2dldF9vcGVyYXRvcigiPj0iKShwcm9zcGVjdGl2ZSwgc3BlYykgYW5kCiAgICAgICAgICAgICAgICBzZWxmLl9nZXRfb3BlcmF0b3IoIj09IikocHJvc3BlY3RpdmUsIHByZWZpeCkpCgogICAgQF9yZXF1aXJlX3ZlcnNpb25fY29tcGFyZQogICAgZGVmIF9jb21wYXJlX2VxdWFsKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICAjIFdlIG5lZWQgc3BlY2lhbCBsb2dpYyB0byBoYW5kbGUgcHJlZml4IG1hdGNoaW5nCiAgICAgICAgaWYgc3BlYy5lbmRzd2l0aCgiLioiKToKICAgICAgICAgICAgIyBJbiB0aGUgY2FzZSBvZiBwcmVmaXggbWF0Y2hpbmcgd2Ugd2FudCB0byBpZ25vcmUgbG9jYWwgc2VnbWVudC4KICAgICAgICAgICAgcHJvc3BlY3RpdmUgPSBWZXJzaW9uKHByb3NwZWN0aXZlLnB1YmxpYykKICAgICAgICAgICAgIyBTcGxpdCB0aGUgc3BlYyBvdXQgYnkgZG90cywgYW5kIHByZXRlbmQgdGhhdCB0aGVyZSBpcyBhbiBpbXBsaWNpdAogICAgICAgICAgICAjIGRvdCBpbiBiZXR3ZWVuIGEgcmVsZWFzZSBzZWdtZW50IGFuZCBhIHByZS1yZWxlYXNlIHNlZ21lbnQuCiAgICAgICAgICAgIHNwZWMgPSBfdmVyc2lvbl9zcGxpdChzcGVjWzotMl0pICAjIFJlbW92ZSB0aGUgdHJhaWxpbmcgLioKCiAgICAgICAgICAgICMgU3BsaXQgdGhlIHByb3NwZWN0aXZlIHZlcnNpb24gb3V0IGJ5IGRvdHMsIGFuZCBwcmV0ZW5kIHRoYXQgdGhlcmUKICAgICAgICAgICAgIyBpcyBhbiBpbXBsaWNpdCBkb3QgaW4gYmV0d2VlbiBhIHJlbGVhc2Ugc2VnbWVudCBhbmQgYSBwcmUtcmVsZWFzZQogICAgICAgICAgICAjIHNlZ21lbnQuCiAgICAgICAgICAgIHByb3NwZWN0aXZlID0gX3ZlcnNpb25fc3BsaXQoc3RyKHByb3NwZWN0aXZlKSkKCiAgICAgICAgICAgICMgU2hvcnRlbiB0aGUgcHJvc3BlY3RpdmUgdmVyc2lvbiB0byBiZSB0aGUgc2FtZSBsZW5ndGggYXMgdGhlIHNwZWMKICAgICAgICAgICAgIyBzbyB0aGF0IHdlIGNhbiBkZXRlcm1pbmUgaWYgdGhlIHNwZWNpZmllciBpcyBhIHByZWZpeCBvZiB0aGUKICAgICAgICAgICAgIyBwcm9zcGVjdGl2ZSB2ZXJzaW9uIG9yIG5vdC4KICAgICAgICAgICAgcHJvc3BlY3RpdmUgPSBwcm9zcGVjdGl2ZVs6bGVuKHNwZWMpXQoKICAgICAgICAgICAgIyBQYWQgb3V0IG91ciB0d28gc2lkZXMgd2l0aCB6ZXJvcyBzbyB0aGF0IHRoZXkgYm90aCBlcXVhbCB0aGUgc2FtZQogICAgICAgICAgICAjIGxlbmd0aC4KICAgICAgICAgICAgc3BlYywgcHJvc3BlY3RpdmUgPSBfcGFkX3ZlcnNpb24oc3BlYywgcHJvc3BlY3RpdmUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBDb252ZXJ0IG91ciBzcGVjIHN0cmluZyBpbnRvIGEgVmVyc2lvbgogICAgICAgICAgICBzcGVjID0gVmVyc2lvbihzcGVjKQoKICAgICAgICAgICAgIyBJZiB0aGUgc3BlY2lmaWVyIGRvZXMgbm90IGhhdmUgYSBsb2NhbCBzZWdtZW50LCB0aGVuIHdlIHdhbnQgdG8KICAgICAgICAgICAgIyBhY3QgYXMgaWYgdGhlIHByb3NwZWN0aXZlIHZlcnNpb24gYWxzbyBkb2VzIG5vdCBoYXZlIGEgbG9jYWwKICAgICAgICAgICAgIyBzZWdtZW50LgogICAgICAgICAgICBpZiBub3Qgc3BlYy5sb2NhbDoKICAgICAgICAgICAgICAgIHByb3NwZWN0aXZlID0gVmVyc2lvbihwcm9zcGVjdGl2ZS5wdWJsaWMpCgogICAgICAgIHJldHVybiBwcm9zcGVjdGl2ZSA9PSBzcGVjCgogICAgQF9yZXF1aXJlX3ZlcnNpb25fY29tcGFyZQogICAgZGVmIF9jb21wYXJlX25vdF9lcXVhbChzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgcmV0dXJuIG5vdCBzZWxmLl9jb21wYXJlX2VxdWFsKHByb3NwZWN0aXZlLCBzcGVjKQoKICAgIEBfcmVxdWlyZV92ZXJzaW9uX2NvbXBhcmUKICAgIGRlZiBfY29tcGFyZV9sZXNzX3RoYW5fZXF1YWwoc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgIHJldHVybiBwcm9zcGVjdGl2ZSA8PSBWZXJzaW9uKHNwZWMpCgogICAgQF9yZXF1aXJlX3ZlcnNpb25fY29tcGFyZQogICAgZGVmIF9jb21wYXJlX2dyZWF0ZXJfdGhhbl9lcXVhbChzZWxmLCBwcm9zcGVjdGl2ZSwgc3BlYyk6CiAgICAgICAgcmV0dXJuIHByb3NwZWN0aXZlID49IFZlcnNpb24oc3BlYykKCiAgICBAX3JlcXVpcmVfdmVyc2lvbl9jb21wYXJlCiAgICBkZWYgX2NvbXBhcmVfbGVzc190aGFuKHNlbGYsIHByb3NwZWN0aXZlLCBzcGVjKToKICAgICAgICAjIENvbnZlcnQgb3VyIHNwZWMgdG8gYSBWZXJzaW9uIGluc3RhbmNlLCBzaW5jZSB3ZSdsbCB3YW50IHRvIHdvcmsgd2l0aAogICAgICAgICMgaXQgYXMgYSB2ZXJzaW9uLgogICAgICAgIHNwZWMgPSBWZXJzaW9uKHNwZWMpCgogICAgICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoZSBwcm9zcGVjdGl2ZSB2ZXJzaW9uIGlzIGxlc3MgdGhhbiB0aGUgc3BlYwogICAgICAgICMgdmVyc2lvbi4gSWYgaXQncyBub3Qgd2UgY2FuIHNob3J0IGNpcmN1aXQgYW5kIGp1c3QgcmV0dXJuIEZhbHNlIG5vdwogICAgICAgICMgaW5zdGVhZCBvZiBkb2luZyBleHRyYSB1bm5lZWRlZCB3b3JrLgogICAgICAgIGlmIG5vdCBwcm9zcGVjdGl2ZSA8IHNwZWM6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIFRoaXMgc3BlY2lhbCBjYXNlIGlzIGhlcmUgc28gdGhhdCwgdW5sZXNzIHRoZSBzcGVjaWZpZXIgaXRzZWxmCiAgICAgICAgIyBpbmNsdWRlcyBpcyBhIHByZS1yZWxlYXNlIHZlcnNpb24sIHRoYXQgd2UgZG8gbm90IGFjY2VwdCBwcmUtcmVsZWFzZQogICAgICAgICMgdmVyc2lvbnMgZm9yIHRoZSB2ZXJzaW9uIG1lbnRpb25lZCBpbiB0aGUgc3BlY2lmaWVyIChlLmcuIDwzLjEgc2hvdWxkCiAgICAgICAgIyBub3QgbWF0Y2ggMy4xLmRldjAsIGJ1dCBzaG91bGQgbWF0Y2ggMy4wLmRldjApLgogICAgICAgIGlmIG5vdCBzcGVjLmlzX3ByZXJlbGVhc2UgYW5kIHByb3NwZWN0aXZlLmlzX3ByZXJlbGVhc2U6CiAgICAgICAgICAgIGlmIFZlcnNpb24ocHJvc3BlY3RpdmUuYmFzZV92ZXJzaW9uKSA9PSBWZXJzaW9uKHNwZWMuYmFzZV92ZXJzaW9uKToKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIElmIHdlJ3ZlIGdvdHRlbiB0byBoZXJlLCBpdCBtZWFucyB0aGF0IHByb3NwZWN0aXZlIHZlcnNpb24gaXMgYm90aAogICAgICAgICMgbGVzcyB0aGFuIHRoZSBzcGVjIHZlcnNpb24gKmFuZCogaXQncyBub3QgYSBwcmUtcmVsZWFzZSBvZiB0aGUgc2FtZQogICAgICAgICMgdmVyc2lvbiBpbiB0aGUgc3BlYy4KICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIEBfcmVxdWlyZV92ZXJzaW9uX2NvbXBhcmUKICAgIGRlZiBfY29tcGFyZV9ncmVhdGVyX3RoYW4oc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgICMgQ29udmVydCBvdXIgc3BlYyB0byBhIFZlcnNpb24gaW5zdGFuY2UsIHNpbmNlIHdlJ2xsIHdhbnQgdG8gd29yayB3aXRoCiAgICAgICAgIyBpdCBhcyBhIHZlcnNpb24uCiAgICAgICAgc3BlYyA9IFZlcnNpb24oc3BlYykKCiAgICAgICAgIyBDaGVjayB0byBzZWUgaWYgdGhlIHByb3NwZWN0aXZlIHZlcnNpb24gaXMgZ3JlYXRlciB0aGFuIHRoZSBzcGVjCiAgICAgICAgIyB2ZXJzaW9uLiBJZiBpdCdzIG5vdCB3ZSBjYW4gc2hvcnQgY2lyY3VpdCBhbmQganVzdCByZXR1cm4gRmFsc2Ugbm93CiAgICAgICAgIyBpbnN0ZWFkIG9mIGRvaW5nIGV4dHJhIHVubmVlZGVkIHdvcmsuCiAgICAgICAgaWYgbm90IHByb3NwZWN0aXZlID4gc3BlYzoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgVGhpcyBzcGVjaWFsIGNhc2UgaXMgaGVyZSBzbyB0aGF0LCB1bmxlc3MgdGhlIHNwZWNpZmllciBpdHNlbGYKICAgICAgICAjIGluY2x1ZGVzIGlzIGEgcG9zdC1yZWxlYXNlIHZlcnNpb24sIHRoYXQgd2UgZG8gbm90IGFjY2VwdAogICAgICAgICMgcG9zdC1yZWxlYXNlIHZlcnNpb25zIGZvciB0aGUgdmVyc2lvbiBtZW50aW9uZWQgaW4gdGhlIHNwZWNpZmllcgogICAgICAgICMgKGUuZy4gPjMuMSBzaG91bGQgbm90IG1hdGNoIDMuMC5wb3N0MCwgYnV0IHNob3VsZCBtYXRjaCAzLjIucG9zdDApLgogICAgICAgIGlmIG5vdCBzcGVjLmlzX3Bvc3RyZWxlYXNlIGFuZCBwcm9zcGVjdGl2ZS5pc19wb3N0cmVsZWFzZToKICAgICAgICAgICAgaWYgVmVyc2lvbihwcm9zcGVjdGl2ZS5iYXNlX3ZlcnNpb24pID09IFZlcnNpb24oc3BlYy5iYXNlX3ZlcnNpb24pOgogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICMgRW5zdXJlIHRoYXQgd2UgZG8gbm90IGFsbG93IGEgbG9jYWwgdmVyc2lvbiBvZiB0aGUgdmVyc2lvbiBtZW50aW9uZWQKICAgICAgICAjIGluIHRoZSBzcGVjaWZpZXIsIHdoaWNoIGlzIHRlY2hpbmNhbGx5IGdyZWF0ZXIgdGhhbiwgdG8gbWF0Y2guCiAgICAgICAgaWYgcHJvc3BlY3RpdmUubG9jYWwgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGlmIFZlcnNpb24ocHJvc3BlY3RpdmUuYmFzZV92ZXJzaW9uKSA9PSBWZXJzaW9uKHNwZWMuYmFzZV92ZXJzaW9uKToKICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIElmIHdlJ3ZlIGdvdHRlbiB0byBoZXJlLCBpdCBtZWFucyB0aGF0IHByb3NwZWN0aXZlIHZlcnNpb24gaXMgYm90aAogICAgICAgICMgZ3JlYXRlciB0aGFuIHRoZSBzcGVjIHZlcnNpb24gKmFuZCogaXQncyBub3QgYSBwcmUtcmVsZWFzZSBvZiB0aGUKICAgICAgICAjIHNhbWUgdmVyc2lvbiBpbiB0aGUgc3BlYy4KICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIGRlZiBfY29tcGFyZV9hcmJpdHJhcnkoc2VsZiwgcHJvc3BlY3RpdmUsIHNwZWMpOgogICAgICAgIHJldHVybiBzdHIocHJvc3BlY3RpdmUpLmxvd2VyKCkgPT0gc3RyKHNwZWMpLmxvd2VyKCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwcmVyZWxlYXNlcyhzZWxmKToKICAgICAgICAjIElmIHRoZXJlIGlzIGFuIGV4cGxpY2l0IHByZXJlbGVhc2VzIHNldCBmb3IgdGhpcywgdGhlbiB3ZSdsbCBqdXN0CiAgICAgICAgIyBibGluZGx5IHVzZSB0aGF0LgogICAgICAgIGlmIHNlbGYuX3ByZXJlbGVhc2VzIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fcHJlcmVsZWFzZXMKCiAgICAgICAgIyBMb29rIGF0IGFsbCBvZiBvdXIgc3BlY2lmaWVycyBhbmQgZGV0ZXJtaW5lIGlmIHRoZXkgYXJlIGluY2x1c2l2ZQogICAgICAgICMgb3BlcmF0b3JzLCBhbmQgaWYgdGhleSBhcmUgaWYgdGhleSBhcmUgaW5jbHVkaW5nIGFuIGV4cGxpY2l0CiAgICAgICAgIyBwcmVyZWxlYXNlLgogICAgICAgIG9wZXJhdG9yLCB2ZXJzaW9uID0gc2VsZi5fc3BlYwogICAgICAgIGlmIG9wZXJhdG9yIGluIFsiPT0iLCAiPj0iLCAiPD0iLCAifj0iLCAiPT09Il06CiAgICAgICAgICAgICMgVGhlID09IHNwZWNpZmllciBjYW4gaW5jbHVkZSBhIHRyYWlsaW5nIC4qLCBpZiBpdCBkb2VzIHdlCiAgICAgICAgICAgICMgd2FudCB0byByZW1vdmUgYmVmb3JlIHBhcnNpbmcuCiAgICAgICAgICAgIGlmIG9wZXJhdG9yID09ICI9PSIgYW5kIHZlcnNpb24uZW5kc3dpdGgoIi4qIik6CiAgICAgICAgICAgICAgICB2ZXJzaW9uID0gdmVyc2lvbls6LTJdCgogICAgICAgICAgICAjIFBhcnNlIHRoZSB2ZXJzaW9uLCBhbmQgaWYgaXQgaXMgYSBwcmUtcmVsZWFzZSB0aGFuIHRoaXMKICAgICAgICAgICAgIyBzcGVjaWZpZXIgYWxsb3dzIHByZS1yZWxlYXNlcy4KICAgICAgICAgICAgaWYgcGFyc2UodmVyc2lvbikuaXNfcHJlcmVsZWFzZToKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCgogICAgICAgIHJldHVybiBGYWxzZQoKICAgIEBwcmVyZWxlYXNlcy5zZXR0ZXIKICAgIGRlZiBwcmVyZWxlYXNlcyhzZWxmLCB2YWx1ZSk6CiAgICAgICAgc2VsZi5fcHJlcmVsZWFzZXMgPSB2YWx1ZQoKCl9wcmVmaXhfcmVnZXggPSByZS5jb21waWxlKHIiXihbMC05XSspKCg/OmF8YnxjfHJjKVswLTldKykkIikKCgpkZWYgX3ZlcnNpb25fc3BsaXQodmVyc2lvbik6CiAgICByZXN1bHQgPSBbXQogICAgZm9yIGl0ZW0gaW4gdmVyc2lvbi5zcGxpdCgiLiIpOgogICAgICAgIG1hdGNoID0gX3ByZWZpeF9yZWdleC5zZWFyY2goaXRlbSkKICAgICAgICBpZiBtYXRjaDoKICAgICAgICAgICAgcmVzdWx0LmV4dGVuZChtYXRjaC5ncm91cHMoKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXN1bHQuYXBwZW5kKGl0ZW0pCiAgICByZXR1cm4gcmVzdWx0CgoKZGVmIF9wYWRfdmVyc2lvbihsZWZ0LCByaWdodCk6CiAgICBsZWZ0X3NwbGl0LCByaWdodF9zcGxpdCA9IFtdLCBbXQoKICAgICMgR2V0IHRoZSByZWxlYXNlIHNlZ21lbnQgb2Ygb3VyIHZlcnNpb25zCiAgICBsZWZ0X3NwbGl0LmFwcGVuZChsaXN0KGl0ZXJ0b29scy50YWtld2hpbGUobGFtYmRhIHg6IHguaXNkaWdpdCgpLCBsZWZ0KSkpCiAgICByaWdodF9zcGxpdC5hcHBlbmQobGlzdChpdGVydG9vbHMudGFrZXdoaWxlKGxhbWJkYSB4OiB4LmlzZGlnaXQoKSwgcmlnaHQpKSkKCiAgICAjIEdldCB0aGUgcmVzdCBvZiBvdXIgdmVyc2lvbnMKICAgIGxlZnRfc3BsaXQuYXBwZW5kKGxlZnRbbGVuKGxlZnRfc3BsaXRbMF0pOl0pCiAgICByaWdodF9zcGxpdC5hcHBlbmQocmlnaHRbbGVuKHJpZ2h0X3NwbGl0WzBdKTpdKQoKICAgICMgSW5zZXJ0IG91ciBwYWRkaW5nCiAgICBsZWZ0X3NwbGl0Lmluc2VydCgKICAgICAgICAxLAogICAgICAgIFsiMCJdICogbWF4KDAsIGxlbihyaWdodF9zcGxpdFswXSkgLSBsZW4obGVmdF9zcGxpdFswXSkpLAogICAgKQogICAgcmlnaHRfc3BsaXQuaW5zZXJ0KAogICAgICAgIDEsCiAgICAgICAgWyIwIl0gKiBtYXgoMCwgbGVuKGxlZnRfc3BsaXRbMF0pIC0gbGVuKHJpZ2h0X3NwbGl0WzBdKSksCiAgICApCgogICAgcmV0dXJuICgKICAgICAgICBsaXN0KGl0ZXJ0b29scy5jaGFpbigqbGVmdF9zcGxpdCkpLAogICAgICAgIGxpc3QoaXRlcnRvb2xzLmNoYWluKCpyaWdodF9zcGxpdCkpLAogICAgKQoKCmNsYXNzIFNwZWNpZmllclNldChCYXNlU3BlY2lmaWVyKToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgc3BlY2lmaWVycz0iIiwgcHJlcmVsZWFzZXM9Tm9uZSk6CiAgICAgICAgIyBTcGxpdCBvbiAsIHRvIGJyZWFrIGVhY2ggaW5kaWRpdnVhbCBzcGVjaWZpZXIgaW50byBpdCdzIG93biBpdGVtLCBhbmQKICAgICAgICAjIHN0cmlwIGVhY2ggaXRlbSB0byByZW1vdmUgbGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlLgogICAgICAgIHNwZWNpZmllcnMgPSBbcy5zdHJpcCgpIGZvciBzIGluIHNwZWNpZmllcnMuc3BsaXQoIiwiKSBpZiBzLnN0cmlwKCldCgogICAgICAgICMgUGFyc2VkIGVhY2ggaW5kaXZpZHVhbCBzcGVjaWZpZXIsIGF0dGVtcHRpbmcgZmlyc3QgdG8gbWFrZSBpdCBhCiAgICAgICAgIyBTcGVjaWZpZXIgYW5kIGZhbGxpbmcgYmFjayB0byBhIExlZ2FjeVNwZWNpZmllci4KICAgICAgICBwYXJzZWQgPSBzZXQoKQogICAgICAgIGZvciBzcGVjaWZpZXIgaW4gc3BlY2lmaWVyczoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcGFyc2VkLmFkZChTcGVjaWZpZXIoc3BlY2lmaWVyKSkKICAgICAgICAgICAgZXhjZXB0IEludmFsaWRTcGVjaWZpZXI6CiAgICAgICAgICAgICAgICBwYXJzZWQuYWRkKExlZ2FjeVNwZWNpZmllcihzcGVjaWZpZXIpKQoKICAgICAgICAjIFR1cm4gb3VyIHBhcnNlZCBzcGVjaWZpZXJzIGludG8gYSBmcm96ZW4gc2V0IGFuZCBzYXZlIHRoZW0gZm9yIGxhdGVyLgogICAgICAgIHNlbGYuX3NwZWNzID0gZnJvemVuc2V0KHBhcnNlZCkKCiAgICAgICAgIyBTdG9yZSBvdXIgcHJlcmVsZWFzZXMgdmFsdWUgc28gd2UgY2FuIHVzZSBpdCBsYXRlciB0byBkZXRlcm1pbmUgaWYKICAgICAgICAjIHdlIGFjY2VwdCBwcmVyZWxlYXNlcyBvciBub3QuCiAgICAgICAgc2VsZi5fcHJlcmVsZWFzZXMgPSBwcmVyZWxlYXNlcwoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICBwcmUgPSAoCiAgICAgICAgICAgICIsIHByZXJlbGVhc2VzPXswIXJ9Ii5mb3JtYXQoc2VsZi5wcmVyZWxlYXNlcykKICAgICAgICAgICAgaWYgc2VsZi5fcHJlcmVsZWFzZXMgaXMgbm90IE5vbmUKICAgICAgICAgICAgZWxzZSAiIgogICAgICAgICkKCiAgICAgICAgcmV0dXJuICI8U3BlY2lmaWVyU2V0KHswIXJ9ezF9KT4iLmZvcm1hdChzdHIoc2VsZiksIHByZSkKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gIiwiLmpvaW4oc29ydGVkKHN0cihzKSBmb3IgcyBpbiBzZWxmLl9zcGVjcykpCgogICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgICAgIHJldHVybiBoYXNoKHNlbGYuX3NwZWNzKQoKICAgIGRlZiBfX2FuZF9fKHNlbGYsIG90aGVyKToKICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBzdHJpbmdfdHlwZXMpOgogICAgICAgICAgICBvdGhlciA9IFNwZWNpZmllclNldChvdGhlcikKICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBTcGVjaWZpZXJTZXQpOgogICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKCiAgICAgICAgc3BlY2lmaWVyID0gU3BlY2lmaWVyU2V0KCkKICAgICAgICBzcGVjaWZpZXIuX3NwZWNzID0gZnJvemVuc2V0KHNlbGYuX3NwZWNzIHwgb3RoZXIuX3NwZWNzKQoKICAgICAgICBpZiBzZWxmLl9wcmVyZWxlYXNlcyBpcyBOb25lIGFuZCBvdGhlci5fcHJlcmVsZWFzZXMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNwZWNpZmllci5fcHJlcmVsZWFzZXMgPSBvdGhlci5fcHJlcmVsZWFzZXMKICAgICAgICBlbGlmIHNlbGYuX3ByZXJlbGVhc2VzIGlzIG5vdCBOb25lIGFuZCBvdGhlci5fcHJlcmVsZWFzZXMgaXMgTm9uZToKICAgICAgICAgICAgc3BlY2lmaWVyLl9wcmVyZWxlYXNlcyA9IHNlbGYuX3ByZXJlbGVhc2VzCiAgICAgICAgZWxpZiBzZWxmLl9wcmVyZWxlYXNlcyA9PSBvdGhlci5fcHJlcmVsZWFzZXM6CiAgICAgICAgICAgIHNwZWNpZmllci5fcHJlcmVsZWFzZXMgPSBzZWxmLl9wcmVyZWxlYXNlcwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCiAgICAgICAgICAgICAgICAiQ2Fubm90IGNvbWJpbmUgU3BlY2lmaWVyU2V0cyB3aXRoIFRydWUgYW5kIEZhbHNlIHByZXJlbGVhc2UgIgogICAgICAgICAgICAgICAgIm92ZXJyaWRlcy4iCiAgICAgICAgICAgICkKCiAgICAgICAgcmV0dXJuIHNwZWNpZmllcgoKICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgIG90aGVyID0gU3BlY2lmaWVyU2V0KG90aGVyKQogICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdGhlciwgX0luZGl2aWR1YWxTcGVjaWZpZXIpOgogICAgICAgICAgICBvdGhlciA9IFNwZWNpZmllclNldChzdHIob3RoZXIpKQogICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIFNwZWNpZmllclNldCk6CiAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAoKICAgICAgICByZXR1cm4gc2VsZi5fc3BlY3MgPT0gb3RoZXIuX3NwZWNzCgogICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgb3RoZXIgPSBTcGVjaWZpZXJTZXQob3RoZXIpCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKG90aGVyLCBfSW5kaXZpZHVhbFNwZWNpZmllcik6CiAgICAgICAgICAgIG90aGVyID0gU3BlY2lmaWVyU2V0KHN0cihvdGhlcikpCiAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgU3BlY2lmaWVyU2V0KToKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCgogICAgICAgIHJldHVybiBzZWxmLl9zcGVjcyAhPSBvdGhlci5fc3BlY3MKCiAgICBkZWYgX19sZW5fXyhzZWxmKToKICAgICAgICByZXR1cm4gbGVuKHNlbGYuX3NwZWNzKQoKICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICByZXR1cm4gaXRlcihzZWxmLl9zcGVjcykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwcmVyZWxlYXNlcyhzZWxmKToKICAgICAgICAjIElmIHdlIGhhdmUgYmVlbiBnaXZlbiBhbiBleHBsaWNpdCBwcmVyZWxlYXNlIG1vZGlmaWVyLCB0aGVuIHdlJ2xsCiAgICAgICAgIyBwYXNzIHRoYXQgdGhyb3VnaCBoZXJlLgogICAgICAgIGlmIHNlbGYuX3ByZXJlbGVhc2VzIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fcHJlcmVsZWFzZXMKCiAgICAgICAgIyBJZiB3ZSBkb24ndCBoYXZlIGFueSBzcGVjaWZpZXJzLCBhbmQgd2UgZG9uJ3QgaGF2ZSBhIGZvcmNlZCB2YWx1ZSwKICAgICAgICAjIHRoZW4gd2UnbGwganVzdCByZXR1cm4gTm9uZSBzaW5jZSB3ZSBkb24ndCBrbm93IGlmIHRoaXMgc2hvdWxkIGhhdmUKICAgICAgICAjIHByZS1yZWxlYXNlcyBvciBub3QuCiAgICAgICAgaWYgbm90IHNlbGYuX3NwZWNzOgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICAjIE90aGVyd2lzZSB3ZSdsbCBzZWUgaWYgYW55IG9mIHRoZSBnaXZlbiBzcGVjaWZpZXJzIGFjY2VwdAogICAgICAgICMgcHJlcmVsZWFzZXMsIGlmIGFueSBvZiB0aGVtIGRvIHdlJ2xsIHJldHVybiBUcnVlLCBvdGhlcndpc2UgRmFsc2UuCiAgICAgICAgcmV0dXJuIGFueShzLnByZXJlbGVhc2VzIGZvciBzIGluIHNlbGYuX3NwZWNzKQoKICAgIEBwcmVyZWxlYXNlcy5zZXR0ZXIKICAgIGRlZiBwcmVyZWxlYXNlcyhzZWxmLCB2YWx1ZSk6CiAgICAgICAgc2VsZi5fcHJlcmVsZWFzZXMgPSB2YWx1ZQoKICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgaXRlbSk6CiAgICAgICAgcmV0dXJuIHNlbGYuY29udGFpbnMoaXRlbSkKCiAgICBkZWYgY29udGFpbnMoc2VsZiwgaXRlbSwgcHJlcmVsZWFzZXM9Tm9uZSk6CiAgICAgICAgIyBFbnN1cmUgdGhhdCBvdXIgaXRlbSBpcyBhIFZlcnNpb24gb3IgTGVnYWN5VmVyc2lvbiBpbnN0YW5jZS4KICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShpdGVtLCAoTGVnYWN5VmVyc2lvbiwgVmVyc2lvbikpOgogICAgICAgICAgICBpdGVtID0gcGFyc2UoaXRlbSkKCiAgICAgICAgIyBEZXRlcm1pbmUgaWYgd2UncmUgZm9yY2luZyBhIHByZXJlbGVhc2Ugb3Igbm90LCBpZiB3ZSdyZSBub3QgZm9yY2luZwogICAgICAgICMgb25lIGZvciB0aGlzIHBhcnRpY3VsYXIgZmlsdGVyIGNhbGwsIHRoZW4gd2UnbGwgdXNlIHdoYXRldmVyIHRoZQogICAgICAgICMgU3BlY2lmaWVyU2V0IHRoaW5rcyBmb3Igd2hldGhlciBvciBub3Qgd2Ugc2hvdWxkIHN1cHBvcnQgcHJlcmVsZWFzZXMuCiAgICAgICAgaWYgcHJlcmVsZWFzZXMgaXMgTm9uZToKICAgICAgICAgICAgcHJlcmVsZWFzZXMgPSBzZWxmLnByZXJlbGVhc2VzCgogICAgICAgICMgV2UgY2FuIGRldGVybWluZSBpZiB3ZSdyZSBnb2luZyB0byBhbGxvdyBwcmUtcmVsZWFzZXMgYnkgbG9va2luZyB0bwogICAgICAgICMgc2VlIGlmIGFueSBvZiB0aGUgdW5kZXJseWluZyBpdGVtcyBzdXBwb3J0cyB0aGVtLiBJZiBub25lIG9mIHRoZW0gZG8KICAgICAgICAjIGFuZCB0aGlzIGl0ZW0gaXMgYSBwcmUtcmVsZWFzZSB0aGVuIHdlIGRvIG5vdCBhbGxvdyBpdCBhbmQgd2UgY2FuCiAgICAgICAgIyBzaG9ydCBjaXJjdWl0IHRoYXQgaGVyZS4KICAgICAgICAjIE5vdGU6IFRoaXMgbWVhbnMgdGhhdCAxLjAuZGV2MSB3b3VsZCBub3QgYmUgY29udGFpbmVkIGluIHNvbWV0aGluZwogICAgICAgICMgICAgICAgbGlrZSA+PTEuMC5kZXZhYmMgaG93ZXZlciBpdCB3b3VsZCBiZSBpbiA+PTEuMC5kZWJhYmMsPjAuMC5kZXYwCiAgICAgICAgaWYgbm90IHByZXJlbGVhc2VzIGFuZCBpdGVtLmlzX3ByZXJlbGVhc2U6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQoKICAgICAgICAjIFdlIHNpbXBseSBkaXNwYXRjaCB0byB0aGUgdW5kZXJseWluZyBzcGVjcyBoZXJlIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZQogICAgICAgICMgZ2l2ZW4gdmVyc2lvbiBpcyBjb250YWluZWQgd2l0aGluIGFsbCBvZiB0aGVtLgogICAgICAgICMgTm90ZTogVGhpcyB1c2Ugb2YgYWxsKCkgaGVyZSBtZWFucyB0aGF0IGFuIGVtcHR5IHNldCBvZiBzcGVjaWZpZXJzCiAgICAgICAgIyAgICAgICB3aWxsIGFsd2F5cyByZXR1cm4gVHJ1ZSwgdGhpcyBpcyBhbiBleHBsaWNpdCBkZXNpZ24gZGVjaXNpb24uCiAgICAgICAgcmV0dXJuIGFsbCgKICAgICAgICAgICAgcy5jb250YWlucyhpdGVtLCBwcmVyZWxlYXNlcz1wcmVyZWxlYXNlcykKICAgICAgICAgICAgZm9yIHMgaW4gc2VsZi5fc3BlY3MKICAgICAgICApCgogICAgZGVmIGZpbHRlcihzZWxmLCBpdGVyYWJsZSwgcHJlcmVsZWFzZXM9Tm9uZSk6CiAgICAgICAgIyBEZXRlcm1pbmUgaWYgd2UncmUgZm9yY2luZyBhIHByZXJlbGVhc2Ugb3Igbm90LCBpZiB3ZSdyZSBub3QgZm9yY2luZwogICAgICAgICMgb25lIGZvciB0aGlzIHBhcnRpY3VsYXIgZmlsdGVyIGNhbGwsIHRoZW4gd2UnbGwgdXNlIHdoYXRldmVyIHRoZQogICAgICAgICMgU3BlY2lmaWVyU2V0IHRoaW5rcyBmb3Igd2hldGhlciBvciBub3Qgd2Ugc2hvdWxkIHN1cHBvcnQgcHJlcmVsZWFzZXMuCiAgICAgICAgaWYgcHJlcmVsZWFzZXMgaXMgTm9uZToKICAgICAgICAgICAgcHJlcmVsZWFzZXMgPSBzZWxmLnByZXJlbGVhc2VzCgogICAgICAgICMgSWYgd2UgaGF2ZSBhbnkgc3BlY2lmaWVycywgdGhlbiB3ZSB3YW50IHRvIHdyYXAgb3VyIGl0ZXJhYmxlIGluIHRoZQogICAgICAgICMgZmlsdGVyIG1ldGhvZCBmb3IgZWFjaCBvbmUsIHRoaXMgd2lsbCBhY3QgYXMgYSBsb2dpY2FsIEFORCBhbW9uZ3N0CiAgICAgICAgIyBlYWNoIHNwZWNpZmllci4KICAgICAgICBpZiBzZWxmLl9zcGVjczoKICAgICAgICAgICAgZm9yIHNwZWMgaW4gc2VsZi5fc3BlY3M6CiAgICAgICAgICAgICAgICBpdGVyYWJsZSA9IHNwZWMuZmlsdGVyKGl0ZXJhYmxlLCBwcmVyZWxlYXNlcz1ib29sKHByZXJlbGVhc2VzKSkKICAgICAgICAgICAgcmV0dXJuIGl0ZXJhYmxlCiAgICAgICAgIyBJZiB3ZSBkbyBub3QgaGF2ZSBhbnkgc3BlY2lmaWVycywgdGhlbiB3ZSBuZWVkIHRvIGhhdmUgYSByb3VnaCBmaWx0ZXIKICAgICAgICAjIHdoaWNoIHdpbGwgZmlsdGVyIG91dCBhbnkgcHJlLXJlbGVhc2VzLCB1bmxlc3MgdGhlcmUgYXJlIG5vIGZpbmFsCiAgICAgICAgIyByZWxlYXNlcywgYW5kIHdoaWNoIHdpbGwgZmlsdGVyIG91dCBMZWdhY3lWZXJzaW9uIGluIGdlbmVyYWwuCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZmlsdGVyZWQgPSBbXQogICAgICAgICAgICBmb3VuZF9wcmVyZWxlYXNlcyA9IFtdCgogICAgICAgICAgICBmb3IgaXRlbSBpbiBpdGVyYWJsZToKICAgICAgICAgICAgICAgICMgRW5zdXJlIHRoYXQgd2Ugc29tZSBraW5kIG9mIFZlcnNpb24gY2xhc3MgZm9yIHRoaXMgaXRlbS4KICAgICAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGl0ZW0sIChMZWdhY3lWZXJzaW9uLCBWZXJzaW9uKSk6CiAgICAgICAgICAgICAgICAgICAgcGFyc2VkX3ZlcnNpb24gPSBwYXJzZShpdGVtKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBwYXJzZWRfdmVyc2lvbiA9IGl0ZW0KCiAgICAgICAgICAgICAgICAjIEZpbHRlciBvdXQgYW55IGl0ZW0gd2hpY2ggaXMgcGFyc2VkIGFzIGEgTGVnYWN5VmVyc2lvbgogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShwYXJzZWRfdmVyc2lvbiwgTGVnYWN5VmVyc2lvbik6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgICAgICAjIFN0b3JlIGFueSBpdGVtIHdoaWNoIGlzIGEgcHJlLXJlbGVhc2UgZm9yIGxhdGVyIHVubGVzcyB3ZSd2ZQogICAgICAgICAgICAgICAgIyBhbHJlYWR5IGZvdW5kIGEgZmluYWwgdmVyc2lvbiBvciB3ZSBhcmUgYWNjZXB0aW5nIHByZXJlbGVhc2VzCiAgICAgICAgICAgICAgICBpZiBwYXJzZWRfdmVyc2lvbi5pc19wcmVyZWxlYXNlIGFuZCBub3QgcHJlcmVsZWFzZXM6CiAgICAgICAgICAgICAgICAgICAgaWYgbm90IGZpbHRlcmVkOgogICAgICAgICAgICAgICAgICAgICAgICBmb3VuZF9wcmVyZWxlYXNlcy5hcHBlbmQoaXRlbSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWQuYXBwZW5kKGl0ZW0pCgogICAgICAgICAgICAjIElmIHdlJ3ZlIGZvdW5kIG5vIGl0ZW1zIGV4Y2VwdCBmb3IgcHJlLXJlbGVhc2VzLCB0aGVuIHdlJ2xsIGdvCiAgICAgICAgICAgICMgYWhlYWQgYW5kIHVzZSB0aGUgcHJlLXJlbGVhc2VzCiAgICAgICAgICAgIGlmIG5vdCBmaWx0ZXJlZCBhbmQgZm91bmRfcHJlcmVsZWFzZXMgYW5kIHByZXJlbGVhc2VzIGlzIE5vbmU6CiAgICAgICAgICAgICAgICByZXR1cm4gZm91bmRfcHJlcmVsZWFzZXMKCiAgICAgICAgICAgIHJldHVybiBmaWx0ZXJlZApQSwMEFAAAAAAAAAAhAMXqJw+lAQAApQEAAEAAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL3V0aWxzLnB5IyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uCiMgMi4wLCBhbmQgdGhlIEJTRCBMaWNlbnNlLiBTZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHJlcG9zaXRvcnkKIyBmb3IgY29tcGxldGUgZGV0YWlscy4KZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQsIGRpdmlzaW9uLCBwcmludF9mdW5jdGlvbgoKaW1wb3J0IHJlCgoKX2Nhbm9uaWNhbGl6ZV9yZWdleCA9IHJlLmNvbXBpbGUociJbLV8uXSsiKQoKCmRlZiBjYW5vbmljYWxpemVfbmFtZShuYW1lKToKICAgICMgVGhpcyBpcyB0YWtlbiBmcm9tIFBFUCA1MDMuCiAgICByZXR1cm4gX2Nhbm9uaWNhbGl6ZV9yZWdleC5zdWIoIi0iLCBuYW1lKS5sb3dlcigpClBLAwQUAAAAAAAAACEADu/GoSQtAAAkLQAAQgAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvdmVyc2lvbi5weSMgVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbgojIDIuMCwgYW5kIHRoZSBCU0QgTGljZW5zZS4gU2VlIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyByZXBvc2l0b3J5CiMgZm9yIGNvbXBsZXRlIGRldGFpbHMuCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCBkaXZpc2lvbiwgcHJpbnRfZnVuY3Rpb24KCmltcG9ydCBjb2xsZWN0aW9ucwppbXBvcnQgaXRlcnRvb2xzCmltcG9ydCByZQoKZnJvbSAuX3N0cnVjdHVyZXMgaW1wb3J0IEluZmluaXR5CgoKX19hbGxfXyA9IFsKICAgICJwYXJzZSIsICJWZXJzaW9uIiwgIkxlZ2FjeVZlcnNpb24iLCAiSW52YWxpZFZlcnNpb24iLCAiVkVSU0lPTl9QQVRURVJOIgpdCgoKX1ZlcnNpb24gPSBjb2xsZWN0aW9ucy5uYW1lZHR1cGxlKAogICAgIl9WZXJzaW9uIiwKICAgIFsiZXBvY2giLCAicmVsZWFzZSIsICJkZXYiLCAicHJlIiwgInBvc3QiLCAibG9jYWwiXSwKKQoKCmRlZiBwYXJzZSh2ZXJzaW9uKToKICAgICIiIgogICAgUGFyc2UgdGhlIGdpdmVuIHZlcnNpb24gc3RyaW5nIGFuZCByZXR1cm4gZWl0aGVyIGEgOmNsYXNzOmBWZXJzaW9uYCBvYmplY3QKICAgIG9yIGEgOmNsYXNzOmBMZWdhY3lWZXJzaW9uYCBvYmplY3QgZGVwZW5kaW5nIG9uIGlmIHRoZSBnaXZlbiB2ZXJzaW9uIGlzCiAgICBhIHZhbGlkIFBFUCA0NDAgdmVyc2lvbiBvciBhIGxlZ2FjeSB2ZXJzaW9uLgogICAgIiIiCiAgICB0cnk6CiAgICAgICAgcmV0dXJuIFZlcnNpb24odmVyc2lvbikKICAgIGV4Y2VwdCBJbnZhbGlkVmVyc2lvbjoKICAgICAgICByZXR1cm4gTGVnYWN5VmVyc2lvbih2ZXJzaW9uKQoKCmNsYXNzIEludmFsaWRWZXJzaW9uKFZhbHVlRXJyb3IpOgogICAgIiIiCiAgICBBbiBpbnZhbGlkIHZlcnNpb24gd2FzIGZvdW5kLCB1c2VycyBzaG91bGQgcmVmZXIgdG8gUEVQIDQ0MC4KICAgICIiIgoKCmNsYXNzIF9CYXNlVmVyc2lvbihvYmplY3QpOgoKICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKICAgICAgICByZXR1cm4gaGFzaChzZWxmLl9rZXkpCgogICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuX2NvbXBhcmUob3RoZXIsIGxhbWJkYSBzLCBvOiBzIDwgbykKCiAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5fY29tcGFyZShvdGhlciwgbGFtYmRhIHMsIG86IHMgPD0gbykKCiAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5fY29tcGFyZShvdGhlciwgbGFtYmRhIHMsIG86IHMgPT0gbykKCiAgICBkZWYgX19nZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5fY29tcGFyZShvdGhlciwgbGFtYmRhIHMsIG86IHMgPj0gbykKCiAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5fY29tcGFyZShvdGhlciwgbGFtYmRhIHMsIG86IHMgPiBvKQoKICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBzZWxmLl9jb21wYXJlKG90aGVyLCBsYW1iZGEgcywgbzogcyAhPSBvKQoKICAgIGRlZiBfY29tcGFyZShzZWxmLCBvdGhlciwgbWV0aG9kKToKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgX0Jhc2VWZXJzaW9uKToKICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCgogICAgICAgIHJldHVybiBtZXRob2Qoc2VsZi5fa2V5LCBvdGhlci5fa2V5KQoKCmNsYXNzIExlZ2FjeVZlcnNpb24oX0Jhc2VWZXJzaW9uKToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgdmVyc2lvbik6CiAgICAgICAgc2VsZi5fdmVyc2lvbiA9IHN0cih2ZXJzaW9uKQogICAgICAgIHNlbGYuX2tleSA9IF9sZWdhY3lfY21wa2V5KHNlbGYuX3ZlcnNpb24pCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3ZlcnNpb24KCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgcmV0dXJuICI8TGVnYWN5VmVyc2lvbih7MH0pPiIuZm9ybWF0KHJlcHIoc3RyKHNlbGYpKSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwdWJsaWMoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3ZlcnNpb24KCiAgICBAcHJvcGVydHkKICAgIGRlZiBiYXNlX3ZlcnNpb24oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3ZlcnNpb24KCiAgICBAcHJvcGVydHkKICAgIGRlZiBsb2NhbChzZWxmKToKICAgICAgICByZXR1cm4gTm9uZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX3ByZXJlbGVhc2Uoc2VsZik6CiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfcG9zdHJlbGVhc2Uoc2VsZik6CiAgICAgICAgcmV0dXJuIEZhbHNlCgoKX2xlZ2FjeV92ZXJzaW9uX2NvbXBvbmVudF9yZSA9IHJlLmNvbXBpbGUoCiAgICByIihcZCsgfCBbYS16XSsgfCBcLnwgLSkiLCByZS5WRVJCT1NFLAopCgpfbGVnYWN5X3ZlcnNpb25fcmVwbGFjZW1lbnRfbWFwID0gewogICAgInByZSI6ICJjIiwgInByZXZpZXciOiAiYyIsICItIjogImZpbmFsLSIsICJyYyI6ICJjIiwgImRldiI6ICJAIiwKfQoKCmRlZiBfcGFyc2VfdmVyc2lvbl9wYXJ0cyhzKToKICAgIGZvciBwYXJ0IGluIF9sZWdhY3lfdmVyc2lvbl9jb21wb25lbnRfcmUuc3BsaXQocyk6CiAgICAgICAgcGFydCA9IF9sZWdhY3lfdmVyc2lvbl9yZXBsYWNlbWVudF9tYXAuZ2V0KHBhcnQsIHBhcnQpCgogICAgICAgIGlmIG5vdCBwYXJ0IG9yIHBhcnQgPT0gIi4iOgogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICBpZiBwYXJ0WzoxXSBpbiAiMDEyMzQ1Njc4OSI6CiAgICAgICAgICAgICMgcGFkIGZvciBudW1lcmljIGNvbXBhcmlzb24KICAgICAgICAgICAgeWllbGQgcGFydC56ZmlsbCg4KQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHlpZWxkICIqIiArIHBhcnQKCiAgICAjIGVuc3VyZSB0aGF0IGFscGhhL2JldGEvY2FuZGlkYXRlIGFyZSBiZWZvcmUgZmluYWwKICAgIHlpZWxkICIqZmluYWwiCgoKZGVmIF9sZWdhY3lfY21wa2V5KHZlcnNpb24pOgogICAgIyBXZSBoYXJkY29kZSBhbiBlcG9jaCBvZiAtMSBoZXJlLiBBIFBFUCA0NDAgdmVyc2lvbiBjYW4gb25seSBoYXZlIGEgZXBvY2gKICAgICMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAuIFRoaXMgd2lsbCBlZmZlY3RpdmVseSBwdXQgdGhlIExlZ2FjeVZlcnNpb24sCiAgICAjIHdoaWNoIHVzZXMgdGhlIGRlZmFjdG8gc3RhbmRhcmQgb3JpZ2luYWxseSBpbXBsZW1lbnRlZCBieSBzZXR1cHRvb2xzLAogICAgIyBhcyBiZWZvcmUgYWxsIFBFUCA0NDAgdmVyc2lvbnMuCiAgICBlcG9jaCA9IC0xCgogICAgIyBUaGlzIHNjaGVtZSBpcyB0YWtlbiBmcm9tIHBrZ19yZXNvdXJjZXMucGFyc2VfdmVyc2lvbiBzZXR1cHRvb2xzIHByaW9yIHRvCiAgICAjIGl0J3MgYWRvcHRpb24gb2YgdGhlIHBhY2thZ2luZyBsaWJyYXJ5LgogICAgcGFydHMgPSBbXQogICAgZm9yIHBhcnQgaW4gX3BhcnNlX3ZlcnNpb25fcGFydHModmVyc2lvbi5sb3dlcigpKToKICAgICAgICBpZiBwYXJ0LnN0YXJ0c3dpdGgoIioiKToKICAgICAgICAgICAgIyByZW1vdmUgIi0iIGJlZm9yZSBhIHByZXJlbGVhc2UgdGFnCiAgICAgICAgICAgIGlmIHBhcnQgPCAiKmZpbmFsIjoKICAgICAgICAgICAgICAgIHdoaWxlIHBhcnRzIGFuZCBwYXJ0c1stMV0gPT0gIipmaW5hbC0iOgogICAgICAgICAgICAgICAgICAgIHBhcnRzLnBvcCgpCgogICAgICAgICAgICAjIHJlbW92ZSB0cmFpbGluZyB6ZXJvcyBmcm9tIGVhY2ggc2VyaWVzIG9mIG51bWVyaWMgcGFydHMKICAgICAgICAgICAgd2hpbGUgcGFydHMgYW5kIHBhcnRzWy0xXSA9PSAiMDAwMDAwMDAiOgogICAgICAgICAgICAgICAgcGFydHMucG9wKCkKCiAgICAgICAgcGFydHMuYXBwZW5kKHBhcnQpCiAgICBwYXJ0cyA9IHR1cGxlKHBhcnRzKQoKICAgIHJldHVybiBlcG9jaCwgcGFydHMKCiMgRGVsaWJlcmF0ZWx5IG5vdCBhbmNob3JlZCB0byB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgc3RyaW5nLCB0byBtYWtlIGl0CiMgZWFzaWVyIGZvciAzcmQgcGFydHkgY29kZSB0byByZXVzZQpWRVJTSU9OX1BBVFRFUk4gPSByIiIiCiAgICB2PwogICAgKD86CiAgICAgICAgKD86KD9QPGVwb2NoPlswLTldKykhKT8gICAgICAgICAgICAgICAgICAgICAgICAgICAjIGVwb2NoCiAgICAgICAgKD9QPHJlbGVhc2U+WzAtOV0rKD86XC5bMC05XSspKikgICAgICAgICAgICAgICAgICAjIHJlbGVhc2Ugc2VnbWVudAogICAgICAgICg/UDxwcmU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwcmUtcmVsZWFzZQogICAgICAgICAgICBbLV9cLl0/CiAgICAgICAgICAgICg/UDxwcmVfbD4oYXxifGN8cmN8YWxwaGF8YmV0YXxwcmV8cHJldmlldykpCiAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgKD9QPHByZV9uPlswLTldKyk/CiAgICAgICAgKT8KICAgICAgICAoP1A8cG9zdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcG9zdCByZWxlYXNlCiAgICAgICAgICAgICg/Oi0oP1A8cG9zdF9uMT5bMC05XSspKQogICAgICAgICAgICB8CiAgICAgICAgICAgICg/OgogICAgICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAgICAgKD9QPHBvc3RfbD5wb3N0fHJldnxyKQogICAgICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAgICAgKD9QPHBvc3RfbjI+WzAtOV0rKT8KICAgICAgICAgICAgKQogICAgICAgICk/CiAgICAgICAgKD9QPGRldj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGRldiByZWxlYXNlCiAgICAgICAgICAgIFstX1wuXT8KICAgICAgICAgICAgKD9QPGRldl9sPmRldikKICAgICAgICAgICAgWy1fXC5dPwogICAgICAgICAgICAoP1A8ZGV2X24+WzAtOV0rKT8KICAgICAgICApPwogICAgKQogICAgKD86XCsoP1A8bG9jYWw+W2EtejAtOV0rKD86Wy1fXC5dW2EtejAtOV0rKSopKT8gICAgICAgIyBsb2NhbCB2ZXJzaW9uCiIiIgoKCmNsYXNzIFZlcnNpb24oX0Jhc2VWZXJzaW9uKToKCiAgICBfcmVnZXggPSByZS5jb21waWxlKAogICAgICAgIHIiXlxzKiIgKyBWRVJTSU9OX1BBVFRFUk4gKyByIlxzKiQiLAogICAgICAgIHJlLlZFUkJPU0UgfCByZS5JR05PUkVDQVNFLAogICAgKQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2ZXJzaW9uKToKICAgICAgICAjIFZhbGlkYXRlIHRoZSB2ZXJzaW9uIGFuZCBwYXJzZSBpdCBpbnRvIHBpZWNlcwogICAgICAgIG1hdGNoID0gc2VsZi5fcmVnZXguc2VhcmNoKHZlcnNpb24pCiAgICAgICAgaWYgbm90IG1hdGNoOgogICAgICAgICAgICByYWlzZSBJbnZhbGlkVmVyc2lvbigiSW52YWxpZCB2ZXJzaW9uOiAnezB9JyIuZm9ybWF0KHZlcnNpb24pKQoKICAgICAgICAjIFN0b3JlIHRoZSBwYXJzZWQgb3V0IHBpZWNlcyBvZiB0aGUgdmVyc2lvbgogICAgICAgIHNlbGYuX3ZlcnNpb24gPSBfVmVyc2lvbigKICAgICAgICAgICAgZXBvY2g9aW50KG1hdGNoLmdyb3VwKCJlcG9jaCIpKSBpZiBtYXRjaC5ncm91cCgiZXBvY2giKSBlbHNlIDAsCiAgICAgICAgICAgIHJlbGVhc2U9dHVwbGUoaW50KGkpIGZvciBpIGluIG1hdGNoLmdyb3VwKCJyZWxlYXNlIikuc3BsaXQoIi4iKSksCiAgICAgICAgICAgIHByZT1fcGFyc2VfbGV0dGVyX3ZlcnNpb24oCiAgICAgICAgICAgICAgICBtYXRjaC5ncm91cCgicHJlX2wiKSwKICAgICAgICAgICAgICAgIG1hdGNoLmdyb3VwKCJwcmVfbiIpLAogICAgICAgICAgICApLAogICAgICAgICAgICBwb3N0PV9wYXJzZV9sZXR0ZXJfdmVyc2lvbigKICAgICAgICAgICAgICAgIG1hdGNoLmdyb3VwKCJwb3N0X2wiKSwKICAgICAgICAgICAgICAgIG1hdGNoLmdyb3VwKCJwb3N0X24xIikgb3IgbWF0Y2guZ3JvdXAoInBvc3RfbjIiKSwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgZGV2PV9wYXJzZV9sZXR0ZXJfdmVyc2lvbigKICAgICAgICAgICAgICAgIG1hdGNoLmdyb3VwKCJkZXZfbCIpLAogICAgICAgICAgICAgICAgbWF0Y2guZ3JvdXAoImRldl9uIiksCiAgICAgICAgICAgICksCiAgICAgICAgICAgIGxvY2FsPV9wYXJzZV9sb2NhbF92ZXJzaW9uKG1hdGNoLmdyb3VwKCJsb2NhbCIpKSwKICAgICAgICApCgogICAgICAgICMgR2VuZXJhdGUgYSBrZXkgd2hpY2ggd2lsbCBiZSB1c2VkIGZvciBzb3J0aW5nCiAgICAgICAgc2VsZi5fa2V5ID0gX2NtcGtleSgKICAgICAgICAgICAgc2VsZi5fdmVyc2lvbi5lcG9jaCwKICAgICAgICAgICAgc2VsZi5fdmVyc2lvbi5yZWxlYXNlLAogICAgICAgICAgICBzZWxmLl92ZXJzaW9uLnByZSwKICAgICAgICAgICAgc2VsZi5fdmVyc2lvbi5wb3N0LAogICAgICAgICAgICBzZWxmLl92ZXJzaW9uLmRldiwKICAgICAgICAgICAgc2VsZi5fdmVyc2lvbi5sb2NhbCwKICAgICAgICApCgogICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiPFZlcnNpb24oezB9KT4iLmZvcm1hdChyZXByKHN0cihzZWxmKSkpCgogICAgZGVmIF9fc3RyX18oc2VsZik6CiAgICAgICAgcGFydHMgPSBbXQoKICAgICAgICAjIEVwb2NoCiAgICAgICAgaWYgc2VsZi5fdmVyc2lvbi5lcG9jaCAhPSAwOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoInswfSEiLmZvcm1hdChzZWxmLl92ZXJzaW9uLmVwb2NoKSkKCiAgICAgICAgIyBSZWxlYXNlIHNlZ21lbnQKICAgICAgICBwYXJ0cy5hcHBlbmQoIi4iLmpvaW4oc3RyKHgpIGZvciB4IGluIHNlbGYuX3ZlcnNpb24ucmVsZWFzZSkpCgogICAgICAgICMgUHJlLXJlbGVhc2UKICAgICAgICBpZiBzZWxmLl92ZXJzaW9uLnByZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCIiLmpvaW4oc3RyKHgpIGZvciB4IGluIHNlbGYuX3ZlcnNpb24ucHJlKSkKCiAgICAgICAgIyBQb3N0LXJlbGVhc2UKICAgICAgICBpZiBzZWxmLl92ZXJzaW9uLnBvc3QgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgiLnBvc3R7MH0iLmZvcm1hdChzZWxmLl92ZXJzaW9uLnBvc3RbMV0pKQoKICAgICAgICAjIERldmVsb3BtZW50IHJlbGVhc2UKICAgICAgICBpZiBzZWxmLl92ZXJzaW9uLmRldiBpcyBub3QgTm9uZToKICAgICAgICAgICAgcGFydHMuYXBwZW5kKCIuZGV2ezB9Ii5mb3JtYXQoc2VsZi5fdmVyc2lvbi5kZXZbMV0pKQoKICAgICAgICAjIExvY2FsIHZlcnNpb24gc2VnbWVudAogICAgICAgIGlmIHNlbGYuX3ZlcnNpb24ubG9jYWwgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgKICAgICAgICAgICAgICAgICIrezB9Ii5mb3JtYXQoIi4iLmpvaW4oc3RyKHgpIGZvciB4IGluIHNlbGYuX3ZlcnNpb24ubG9jYWwpKQogICAgICAgICAgICApCgogICAgICAgIHJldHVybiAiIi5qb2luKHBhcnRzKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHB1YmxpYyhzZWxmKToKICAgICAgICByZXR1cm4gc3RyKHNlbGYpLnNwbGl0KCIrIiwgMSlbMF0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBiYXNlX3ZlcnNpb24oc2VsZik6CiAgICAgICAgcGFydHMgPSBbXQoKICAgICAgICAjIEVwb2NoCiAgICAgICAgaWYgc2VsZi5fdmVyc2lvbi5lcG9jaCAhPSAwOgogICAgICAgICAgICBwYXJ0cy5hcHBlbmQoInswfSEiLmZvcm1hdChzZWxmLl92ZXJzaW9uLmVwb2NoKSkKCiAgICAgICAgIyBSZWxlYXNlIHNlZ21lbnQKICAgICAgICBwYXJ0cy5hcHBlbmQoIi4iLmpvaW4oc3RyKHgpIGZvciB4IGluIHNlbGYuX3ZlcnNpb24ucmVsZWFzZSkpCgogICAgICAgIHJldHVybiAiIi5qb2luKHBhcnRzKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGxvY2FsKHNlbGYpOgogICAgICAgIHZlcnNpb25fc3RyaW5nID0gc3RyKHNlbGYpCiAgICAgICAgaWYgIisiIGluIHZlcnNpb25fc3RyaW5nOgogICAgICAgICAgICByZXR1cm4gdmVyc2lvbl9zdHJpbmcuc3BsaXQoIisiLCAxKVsxXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGlzX3ByZXJlbGVhc2Uoc2VsZik6CiAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fdmVyc2lvbi5kZXYgb3Igc2VsZi5fdmVyc2lvbi5wcmUpCgogICAgQHByb3BlcnR5CiAgICBkZWYgaXNfcG9zdHJlbGVhc2Uoc2VsZik6CiAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fdmVyc2lvbi5wb3N0KQoKCmRlZiBfcGFyc2VfbGV0dGVyX3ZlcnNpb24obGV0dGVyLCBudW1iZXIpOgogICAgaWYgbGV0dGVyOgogICAgICAgICMgV2UgY29uc2lkZXIgdGhlcmUgdG8gYmUgYW4gaW1wbGljaXQgMCBpbiBhIHByZS1yZWxlYXNlIGlmIHRoZXJlIGlzCiAgICAgICAgIyBub3QgYSBudW1lcmFsIGFzc29jaWF0ZWQgd2l0aCBpdC4KICAgICAgICBpZiBudW1iZXIgaXMgTm9uZToKICAgICAgICAgICAgbnVtYmVyID0gMAoKICAgICAgICAjIFdlIG5vcm1hbGl6ZSBhbnkgbGV0dGVycyB0byB0aGVpciBsb3dlciBjYXNlIGZvcm0KICAgICAgICBsZXR0ZXIgPSBsZXR0ZXIubG93ZXIoKQoKICAgICAgICAjIFdlIGNvbnNpZGVyIHNvbWUgd29yZHMgdG8gYmUgYWx0ZXJuYXRlIHNwZWxsaW5ncyBvZiBvdGhlciB3b3JkcyBhbmQKICAgICAgICAjIGluIHRob3NlIGNhc2VzIHdlIHdhbnQgdG8gbm9ybWFsaXplIHRoZSBzcGVsbGluZ3MgdG8gb3VyIHByZWZlcnJlZAogICAgICAgICMgc3BlbGxpbmcuCiAgICAgICAgaWYgbGV0dGVyID09ICJhbHBoYSI6CiAgICAgICAgICAgIGxldHRlciA9ICJhIgogICAgICAgIGVsaWYgbGV0dGVyID09ICJiZXRhIjoKICAgICAgICAgICAgbGV0dGVyID0gImIiCiAgICAgICAgZWxpZiBsZXR0ZXIgaW4gWyJjIiwgInByZSIsICJwcmV2aWV3Il06CiAgICAgICAgICAgIGxldHRlciA9ICJyYyIKICAgICAgICBlbGlmIGxldHRlciBpbiBbInJldiIsICJyIl06CiAgICAgICAgICAgIGxldHRlciA9ICJwb3N0IgoKICAgICAgICByZXR1cm4gbGV0dGVyLCBpbnQobnVtYmVyKQogICAgaWYgbm90IGxldHRlciBhbmQgbnVtYmVyOgogICAgICAgICMgV2UgYXNzdW1lIGlmIHdlIGFyZSBnaXZlbiBhIG51bWJlciwgYnV0IHdlIGFyZSBub3QgZ2l2ZW4gYSBsZXR0ZXIKICAgICAgICAjIHRoZW4gdGhpcyBpcyB1c2luZyB0aGUgaW1wbGljaXQgcG9zdCByZWxlYXNlIHN5bnRheCAoZS5nLiAxLjAtMSkKICAgICAgICBsZXR0ZXIgPSAicG9zdCIKCiAgICAgICAgcmV0dXJuIGxldHRlciwgaW50KG51bWJlcikKCgpfbG9jYWxfdmVyc2lvbl9zZXBlcmF0b3JzID0gcmUuY29tcGlsZShyIltcLl8tXSIpCgoKZGVmIF9wYXJzZV9sb2NhbF92ZXJzaW9uKGxvY2FsKToKICAgICIiIgogICAgVGFrZXMgYSBzdHJpbmcgbGlrZSBhYmMuMS50d2VsdmUgYW5kIHR1cm5zIGl0IGludG8gKCJhYmMiLCAxLCAidHdlbHZlIikuCiAgICAiIiIKICAgIGlmIGxvY2FsIGlzIG5vdCBOb25lOgogICAgICAgIHJldHVybiB0dXBsZSgKICAgICAgICAgICAgcGFydC5sb3dlcigpIGlmIG5vdCBwYXJ0LmlzZGlnaXQoKSBlbHNlIGludChwYXJ0KQogICAgICAgICAgICBmb3IgcGFydCBpbiBfbG9jYWxfdmVyc2lvbl9zZXBlcmF0b3JzLnNwbGl0KGxvY2FsKQogICAgICAgICkKCgpkZWYgX2NtcGtleShlcG9jaCwgcmVsZWFzZSwgcHJlLCBwb3N0LCBkZXYsIGxvY2FsKToKICAgICMgV2hlbiB3ZSBjb21wYXJlIGEgcmVsZWFzZSB2ZXJzaW9uLCB3ZSB3YW50IHRvIGNvbXBhcmUgaXQgd2l0aCBhbGwgb2YgdGhlCiAgICAjIHRyYWlsaW5nIHplcm9zIHJlbW92ZWQuIFNvIHdlJ2xsIHVzZSBhIHJldmVyc2UgdGhlIGxpc3QsIGRyb3AgYWxsIHRoZSBub3cKICAgICMgbGVhZGluZyB6ZXJvcyB1bnRpbCB3ZSBjb21lIHRvIHNvbWV0aGluZyBub24gemVybywgdGhlbiB0YWtlIHRoZSByZXN0CiAgICAjIHJlLXJldmVyc2UgaXQgYmFjayBpbnRvIHRoZSBjb3JyZWN0IG9yZGVyIGFuZCBtYWtlIGl0IGEgdHVwbGUgYW5kIHVzZQogICAgIyB0aGF0IGZvciBvdXIgc29ydGluZyBrZXkuCiAgICByZWxlYXNlID0gdHVwbGUoCiAgICAgICAgcmV2ZXJzZWQobGlzdCgKICAgICAgICAgICAgaXRlcnRvb2xzLmRyb3B3aGlsZSgKICAgICAgICAgICAgICAgIGxhbWJkYSB4OiB4ID09IDAsCiAgICAgICAgICAgICAgICByZXZlcnNlZChyZWxlYXNlKSwKICAgICAgICAgICAgKQogICAgICAgICkpCiAgICApCgogICAgIyBXZSBuZWVkIHRvICJ0cmljayIgdGhlIHNvcnRpbmcgYWxnb3JpdGhtIHRvIHB1dCAxLjAuZGV2MCBiZWZvcmUgMS4wYTAuCiAgICAjIFdlJ2xsIGRvIHRoaXMgYnkgYWJ1c2luZyB0aGUgcHJlIHNlZ21lbnQsIGJ1dCB3ZSBfb25seV8gd2FudCB0byBkbyB0aGlzCiAgICAjIGlmIHRoZXJlIGlzIG5vdCBhIHByZSBvciBhIHBvc3Qgc2VnbWVudC4gSWYgd2UgaGF2ZSBvbmUgb2YgdGhvc2UgdGhlbgogICAgIyB0aGUgbm9ybWFsIHNvcnRpbmcgcnVsZXMgd2lsbCBoYW5kbGUgdGhpcyBjYXNlIGNvcnJlY3RseS4KICAgIGlmIHByZSBpcyBOb25lIGFuZCBwb3N0IGlzIE5vbmUgYW5kIGRldiBpcyBub3QgTm9uZToKICAgICAgICBwcmUgPSAtSW5maW5pdHkKICAgICMgVmVyc2lvbnMgd2l0aG91dCBhIHByZS1yZWxlYXNlIChleGNlcHQgYXMgbm90ZWQgYWJvdmUpIHNob3VsZCBzb3J0IGFmdGVyCiAgICAjIHRob3NlIHdpdGggb25lLgogICAgZWxpZiBwcmUgaXMgTm9uZToKICAgICAgICBwcmUgPSBJbmZpbml0eQoKICAgICMgVmVyc2lvbnMgd2l0aG91dCBhIHBvc3Qgc2VnbWVudCBzaG91bGQgc29ydCBiZWZvcmUgdGhvc2Ugd2l0aCBvbmUuCiAgICBpZiBwb3N0IGlzIE5vbmU6CiAgICAgICAgcG9zdCA9IC1JbmZpbml0eQoKICAgICMgVmVyc2lvbnMgd2l0aG91dCBhIGRldmVsb3BtZW50IHNlZ21lbnQgc2hvdWxkIHNvcnQgYWZ0ZXIgdGhvc2Ugd2l0aCBvbmUuCiAgICBpZiBkZXYgaXMgTm9uZToKICAgICAgICBkZXYgPSBJbmZpbml0eQoKICAgIGlmIGxvY2FsIGlzIE5vbmU6CiAgICAgICAgIyBWZXJzaW9ucyB3aXRob3V0IGEgbG9jYWwgc2VnbWVudCBzaG91bGQgc29ydCBiZWZvcmUgdGhvc2Ugd2l0aCBvbmUuCiAgICAgICAgbG9jYWwgPSAtSW5maW5pdHkKICAgIGVsc2U6CiAgICAgICAgIyBWZXJzaW9ucyB3aXRoIGEgbG9jYWwgc2VnbWVudCBuZWVkIHRoYXQgc2VnbWVudCBwYXJzZWQgdG8gaW1wbGVtZW50CiAgICAgICAgIyB0aGUgc29ydGluZyBydWxlcyBpbiBQRVA0NDAuCiAgICAgICAgIyAtIEFscGhhIG51bWVyaWMgc2VnbWVudHMgc29ydCBiZWZvcmUgbnVtZXJpYyBzZWdtZW50cwogICAgICAgICMgLSBBbHBoYSBudW1lcmljIHNlZ21lbnRzIHNvcnQgbGV4aWNvZ3JhcGhpY2FsbHkKICAgICAgICAjIC0gTnVtZXJpYyBzZWdtZW50cyBzb3J0IG51bWVyaWNhbGx5CiAgICAgICAgIyAtIFNob3J0ZXIgdmVyc2lvbnMgc29ydCBiZWZvcmUgbG9uZ2VyIHZlcnNpb25zIHdoZW4gdGhlIHByZWZpeGVzCiAgICAgICAgIyAgIG1hdGNoIGV4YWN0bHkKICAgICAgICBsb2NhbCA9IHR1cGxlKAogICAgICAgICAgICAoaSwgIiIpIGlmIGlzaW5zdGFuY2UoaSwgaW50KSBlbHNlICgtSW5maW5pdHksIGkpCiAgICAgICAgICAgIGZvciBpIGluIGxvY2FsCiAgICAgICAgKQoKICAgIHJldHVybiBlcG9jaCwgcmVsZWFzZSwgcHJlLCBwb3N0LCBkZXYsIGxvY2FsClBLAwQUAAAAAAAAACEAeCgUw+uBAwDrgQMAOgAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9weXBhcnNpbmcucHkjIG1vZHVsZSBweXBhcnNpbmcucHkNCiMNCiMgQ29weXJpZ2h0IChjKSAyMDAzLTIwMTYgIFBhdWwgVC4gTWNHdWlyZQ0KIw0KIyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcNCiMgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlDQojICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcNCiMgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLA0KIyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8NCiMgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvDQojIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCiMNCiMgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUNCiMgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuDQojDQojIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELA0KIyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YNCiMgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULg0KIyBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQ0KIyBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULA0KIyBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQ0KIyBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4NCiMNCg0KX19kb2NfXyA9IFwNCiIiIg0KcHlwYXJzaW5nIG1vZHVsZSAtIENsYXNzZXMgYW5kIG1ldGhvZHMgdG8gZGVmaW5lIGFuZCBleGVjdXRlIHBhcnNpbmcgZ3JhbW1hcnMNCg0KVGhlIHB5cGFyc2luZyBtb2R1bGUgaXMgYW4gYWx0ZXJuYXRpdmUgYXBwcm9hY2ggdG8gY3JlYXRpbmcgYW5kIGV4ZWN1dGluZyBzaW1wbGUgZ3JhbW1hcnMsDQp2cy4gdGhlIHRyYWRpdGlvbmFsIGxleC95YWNjIGFwcHJvYWNoLCBvciB0aGUgdXNlIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMuICBXaXRoIHB5cGFyc2luZywgeW91DQpkb24ndCBuZWVkIHRvIGxlYXJuIGEgbmV3IHN5bnRheCBmb3IgZGVmaW5pbmcgZ3JhbW1hcnMgb3IgbWF0Y2hpbmcgZXhwcmVzc2lvbnMgLSB0aGUgcGFyc2luZyBtb2R1bGUNCnByb3ZpZGVzIGEgbGlicmFyeSBvZiBjbGFzc2VzIHRoYXQgeW91IHVzZSB0byBjb25zdHJ1Y3QgdGhlIGdyYW1tYXIgZGlyZWN0bHkgaW4gUHl0aG9uLg0KDQpIZXJlIGlzIGEgcHJvZ3JhbSB0byBwYXJzZSAiSGVsbG8sIFdvcmxkISIgKG9yIGFueSBncmVldGluZyBvZiB0aGUgZm9ybSANCkN7IjxzYWx1dGF0aW9uPiwgPGFkZHJlc3NlZT4hIn0pLCBidWlsdCB1cCB1c2luZyBMe1dvcmR9LCBMe0xpdGVyYWx9LCBhbmQgTHtBbmR9IGVsZW1lbnRzIA0KKEx7JysnPFBhcnNlckVsZW1lbnQuX19hZGRfXz59IG9wZXJhdG9yIGdpdmVzIEx7QW5kfSBleHByZXNzaW9ucywgc3RyaW5ncyBhcmUgYXV0by1jb252ZXJ0ZWQgdG8NCkx7TGl0ZXJhbH0gZXhwcmVzc2lvbnMpOjoNCg0KICAgIGZyb20gcHlwYXJzaW5nIGltcG9ydCBXb3JkLCBhbHBoYXMNCg0KICAgICMgZGVmaW5lIGdyYW1tYXIgb2YgYSBncmVldGluZw0KICAgIGdyZWV0ID0gV29yZChhbHBoYXMpICsgIiwiICsgV29yZChhbHBoYXMpICsgIiEiDQoNCiAgICBoZWxsbyA9ICJIZWxsbywgV29ybGQhIg0KICAgIHByaW50IChoZWxsbywgIi0+IiwgZ3JlZXQucGFyc2VTdHJpbmcoaGVsbG8pKQ0KDQpUaGUgcHJvZ3JhbSBvdXRwdXRzIHRoZSBmb2xsb3dpbmc6Og0KDQogICAgSGVsbG8sIFdvcmxkISAtPiBbJ0hlbGxvJywgJywnLCAnV29ybGQnLCAnISddDQoNClRoZSBQeXRob24gcmVwcmVzZW50YXRpb24gb2YgdGhlIGdyYW1tYXIgaXMgcXVpdGUgcmVhZGFibGUsIG93aW5nIHRvIHRoZSBzZWxmLWV4cGxhbmF0b3J5DQpjbGFzcyBuYW1lcywgYW5kIHRoZSB1c2Ugb2YgJysnLCAnfCcgYW5kICdeJyBvcGVyYXRvcnMuDQoNClRoZSBMe1BhcnNlUmVzdWx0c30gb2JqZWN0IHJldHVybmVkIGZyb20gTHtQYXJzZXJFbGVtZW50LnBhcnNlU3RyaW5nPFBhcnNlckVsZW1lbnQucGFyc2VTdHJpbmc+fSBjYW4gYmUgYWNjZXNzZWQgYXMgYSBuZXN0ZWQgbGlzdCwgYSBkaWN0aW9uYXJ5LCBvciBhbg0Kb2JqZWN0IHdpdGggbmFtZWQgYXR0cmlidXRlcy4NCg0KVGhlIHB5cGFyc2luZyBtb2R1bGUgaGFuZGxlcyBzb21lIG9mIHRoZSBwcm9ibGVtcyB0aGF0IGFyZSB0eXBpY2FsbHkgdmV4aW5nIHdoZW4gd3JpdGluZyB0ZXh0IHBhcnNlcnM6DQogLSBleHRyYSBvciBtaXNzaW5nIHdoaXRlc3BhY2UgKHRoZSBhYm92ZSBwcm9ncmFtIHdpbGwgYWxzbyBoYW5kbGUgIkhlbGxvLFdvcmxkISIsICJIZWxsbyAgLCAgV29ybGQgICEiLCBldGMuKQ0KIC0gcXVvdGVkIHN0cmluZ3MNCiAtIGVtYmVkZGVkIGNvbW1lbnRzDQoiIiINCg0KX192ZXJzaW9uX18gPSAiMi4xLjEwIg0KX192ZXJzaW9uVGltZV9fID0gIjA3IE9jdCAyMDE2IDAxOjMxIFVUQyINCl9fYXV0aG9yX18gPSAiUGF1bCBNY0d1aXJlIDxwdG1jZ0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+Ig0KDQppbXBvcnQgc3RyaW5nDQpmcm9tIHdlYWtyZWYgaW1wb3J0IHJlZiBhcyB3a3JlZg0KaW1wb3J0IGNvcHkNCmltcG9ydCBzeXMNCmltcG9ydCB3YXJuaW5ncw0KaW1wb3J0IHJlDQppbXBvcnQgc3JlX2NvbnN0YW50cw0KaW1wb3J0IGNvbGxlY3Rpb25zDQppbXBvcnQgcHByaW50DQppbXBvcnQgdHJhY2ViYWNrDQppbXBvcnQgdHlwZXMNCmZyb20gZGF0ZXRpbWUgaW1wb3J0IGRhdGV0aW1lDQoNCnRyeToNCiAgICBmcm9tIF90aHJlYWQgaW1wb3J0IFJMb2NrDQpleGNlcHQgSW1wb3J0RXJyb3I6DQogICAgZnJvbSB0aHJlYWRpbmcgaW1wb3J0IFJMb2NrDQoNCnRyeToNCiAgICBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBPcmRlcmVkRGljdCBhcyBfT3JkZXJlZERpY3QNCmV4Y2VwdCBJbXBvcnRFcnJvcjoNCiAgICB0cnk6DQogICAgICAgIGZyb20gb3JkZXJlZGRpY3QgaW1wb3J0IE9yZGVyZWREaWN0IGFzIF9PcmRlcmVkRGljdA0KICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoNCiAgICAgICAgX09yZGVyZWREaWN0ID0gTm9uZQ0KDQojfiBzeXMuc3RkZXJyLndyaXRlKCAidGVzdGluZyBweXBhcnNpbmcgbW9kdWxlLCB2ZXJzaW9uICVzLCAlc1xuIiAlIChfX3ZlcnNpb25fXyxfX3ZlcnNpb25UaW1lX18gKSApDQoNCl9fYWxsX18gPSBbDQonQW5kJywgJ0Nhc2VsZXNzS2V5d29yZCcsICdDYXNlbGVzc0xpdGVyYWwnLCAnQ2hhcnNOb3RJbicsICdDb21iaW5lJywgJ0RpY3QnLCAnRWFjaCcsICdFbXB0eScsDQonRm9sbG93ZWRCeScsICdGb3J3YXJkJywgJ0dvVG9Db2x1bW4nLCAnR3JvdXAnLCAnS2V5d29yZCcsICdMaW5lRW5kJywgJ0xpbmVTdGFydCcsICdMaXRlcmFsJywNCidNYXRjaEZpcnN0JywgJ05vTWF0Y2gnLCAnTm90QW55JywgJ09uZU9yTW9yZScsICdPbmx5T25jZScsICdPcHRpb25hbCcsICdPcicsDQonUGFyc2VCYXNlRXhjZXB0aW9uJywgJ1BhcnNlRWxlbWVudEVuaGFuY2UnLCAnUGFyc2VFeGNlcHRpb24nLCAnUGFyc2VFeHByZXNzaW9uJywgJ1BhcnNlRmF0YWxFeGNlcHRpb24nLA0KJ1BhcnNlUmVzdWx0cycsICdQYXJzZVN5bnRheEV4Y2VwdGlvbicsICdQYXJzZXJFbGVtZW50JywgJ1F1b3RlZFN0cmluZycsICdSZWN1cnNpdmVHcmFtbWFyRXhjZXB0aW9uJywNCidSZWdleCcsICdTa2lwVG8nLCAnU3RyaW5nRW5kJywgJ1N0cmluZ1N0YXJ0JywgJ1N1cHByZXNzJywgJ1Rva2VuJywgJ1Rva2VuQ29udmVydGVyJywgDQonV2hpdGUnLCAnV29yZCcsICdXb3JkRW5kJywgJ1dvcmRTdGFydCcsICdaZXJvT3JNb3JlJywNCidhbHBoYW51bXMnLCAnYWxwaGFzJywgJ2FscGhhczhiaXQnLCAnYW55Q2xvc2VUYWcnLCAnYW55T3BlblRhZycsICdjU3R5bGVDb21tZW50JywgJ2NvbCcsDQonY29tbWFTZXBhcmF0ZWRMaXN0JywgJ2NvbW1vbkhUTUxFbnRpdHknLCAnY291bnRlZEFycmF5JywgJ2NwcFN0eWxlQ29tbWVudCcsICdkYmxRdW90ZWRTdHJpbmcnLA0KJ2RibFNsYXNoQ29tbWVudCcsICdkZWxpbWl0ZWRMaXN0JywgJ2RpY3RPZicsICdkb3duY2FzZVRva2VucycsICdlbXB0eScsICdoZXhudW1zJywNCidodG1sQ29tbWVudCcsICdqYXZhU3R5bGVDb21tZW50JywgJ2xpbmUnLCAnbGluZUVuZCcsICdsaW5lU3RhcnQnLCAnbGluZW5vJywNCidtYWtlSFRNTFRhZ3MnLCAnbWFrZVhNTFRhZ3MnLCAnbWF0Y2hPbmx5QXRDb2wnLCAnbWF0Y2hQcmV2aW91c0V4cHInLCAnbWF0Y2hQcmV2aW91c0xpdGVyYWwnLA0KJ25lc3RlZEV4cHInLCAnbnVsbERlYnVnQWN0aW9uJywgJ251bXMnLCAnb25lT2YnLCAnb3BBc3NvYycsICdvcGVyYXRvclByZWNlZGVuY2UnLCAncHJpbnRhYmxlcycsDQoncHVuYzhiaXQnLCAncHl0aG9uU3R5bGVDb21tZW50JywgJ3F1b3RlZFN0cmluZycsICdyZW1vdmVRdW90ZXMnLCAncmVwbGFjZUhUTUxFbnRpdHknLCANCidyZXBsYWNlV2l0aCcsICdyZXN0T2ZMaW5lJywgJ3NnbFF1b3RlZFN0cmluZycsICdzcmFuZ2UnLCAnc3RyaW5nRW5kJywNCidzdHJpbmdTdGFydCcsICd0cmFjZVBhcnNlQWN0aW9uJywgJ3VuaWNvZGVTdHJpbmcnLCAndXBjYXNlVG9rZW5zJywgJ3dpdGhBdHRyaWJ1dGUnLA0KJ2luZGVudGVkQmxvY2snLCAnb3JpZ2luYWxUZXh0Rm9yJywgJ3VuZ3JvdXAnLCAnaW5maXhOb3RhdGlvbicsJ2xvY2F0ZWRFeHByJywgJ3dpdGhDbGFzcycsDQonQ2xvc2VNYXRjaCcsICd0b2tlbk1hcCcsICdweXBhcnNpbmdfY29tbW9uJywNCl0NCg0Kc3lzdGVtX3ZlcnNpb24gPSB0dXBsZShzeXMudmVyc2lvbl9pbmZvKVs6M10NClBZXzMgPSBzeXN0ZW1fdmVyc2lvblswXSA9PSAzDQppZiBQWV8zOg0KICAgIF9NQVhfSU5UID0gc3lzLm1heHNpemUNCiAgICBiYXNlc3RyaW5nID0gc3RyDQogICAgdW5pY2hyID0gY2hyDQogICAgX3VzdHIgPSBzdHINCg0KICAgICMgYnVpbGQgbGlzdCBvZiBzaW5nbGUgYXJnIGJ1aWx0aW5zLCB0aGF0IGNhbiBiZSB1c2VkIGFzIHBhcnNlIGFjdGlvbnMNCiAgICBzaW5nbGVBcmdCdWlsdGlucyA9IFtzdW0sIGxlbiwgc29ydGVkLCByZXZlcnNlZCwgbGlzdCwgdHVwbGUsIHNldCwgYW55LCBhbGwsIG1pbiwgbWF4XQ0KDQplbHNlOg0KICAgIF9NQVhfSU5UID0gc3lzLm1heGludA0KICAgIHJhbmdlID0geHJhbmdlDQoNCiAgICBkZWYgX3VzdHIob2JqKToNCiAgICAgICAgIiIiRHJvcC1pbiByZXBsYWNlbWVudCBmb3Igc3RyKG9iaikgdGhhdCB0cmllcyB0byBiZSBVbmljb2RlIGZyaWVuZGx5LiBJdCBmaXJzdCB0cmllcw0KICAgICAgICAgICBzdHIob2JqKS4gSWYgdGhhdCBmYWlscyB3aXRoIGEgVW5pY29kZUVuY29kZUVycm9yLCB0aGVuIGl0IHRyaWVzIHVuaWNvZGUob2JqKS4gSXQNCiAgICAgICAgICAgdGhlbiA8IHJldHVybnMgdGhlIHVuaWNvZGUgb2JqZWN0IHwgZW5jb2RlcyBpdCB3aXRoIHRoZSBkZWZhdWx0IGVuY29kaW5nIHwgLi4uID4uDQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKG9iaix1bmljb2RlKToNCiAgICAgICAgICAgIHJldHVybiBvYmoNCg0KICAgICAgICB0cnk6DQogICAgICAgICAgICAjIElmIHRoaXMgd29ya3MsIHRoZW4gX3VzdHIob2JqKSBoYXMgdGhlIHNhbWUgYmVoYXZpb3VyIGFzIHN0cihvYmopLCBzbw0KICAgICAgICAgICAgIyBpdCB3b24ndCBicmVhayBhbnkgZXhpc3RpbmcgY29kZS4NCiAgICAgICAgICAgIHJldHVybiBzdHIob2JqKQ0KDQogICAgICAgIGV4Y2VwdCBVbmljb2RlRW5jb2RlRXJyb3I6DQogICAgICAgICAgICAjIEVsc2UgZW5jb2RlIGl0DQogICAgICAgICAgICByZXQgPSB1bmljb2RlKG9iaikuZW5jb2RlKHN5cy5nZXRkZWZhdWx0ZW5jb2RpbmcoKSwgJ3htbGNoYXJyZWZyZXBsYWNlJykNCiAgICAgICAgICAgIHhtbGNoYXJyZWYgPSBSZWdleCgnJiNcZCs7JykNCiAgICAgICAgICAgIHhtbGNoYXJyZWYuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHQ6ICdcXHUnICsgaGV4KGludCh0WzBdWzI6LTFdKSlbMjpdKQ0KICAgICAgICAgICAgcmV0dXJuIHhtbGNoYXJyZWYudHJhbnNmb3JtU3RyaW5nKHJldCkNCg0KICAgICMgYnVpbGQgbGlzdCBvZiBzaW5nbGUgYXJnIGJ1aWx0aW5zLCB0b2xlcmFudCBvZiBQeXRob24gdmVyc2lvbiwgdGhhdCBjYW4gYmUgdXNlZCBhcyBwYXJzZSBhY3Rpb25zDQogICAgc2luZ2xlQXJnQnVpbHRpbnMgPSBbXQ0KICAgIGltcG9ydCBfX2J1aWx0aW5fXw0KICAgIGZvciBmbmFtZSBpbiAic3VtIGxlbiBzb3J0ZWQgcmV2ZXJzZWQgbGlzdCB0dXBsZSBzZXQgYW55IGFsbCBtaW4gbWF4Ii5zcGxpdCgpOg0KICAgICAgICB0cnk6DQogICAgICAgICAgICBzaW5nbGVBcmdCdWlsdGlucy5hcHBlbmQoZ2V0YXR0cihfX2J1aWx0aW5fXyxmbmFtZSkpDQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoNCiAgICAgICAgICAgIGNvbnRpbnVlDQogICAgICAgICAgICANCl9nZW5lcmF0b3JUeXBlID0gdHlwZSgoeSBmb3IgeSBpbiByYW5nZSgxKSkpDQogDQpkZWYgX3htbF9lc2NhcGUoZGF0YSk6DQogICAgIiIiRXNjYXBlICYsIDwsID4sICIsICcsIGV0Yy4gaW4gYSBzdHJpbmcgb2YgZGF0YS4iIiINCg0KICAgICMgYW1wZXJzYW5kIG11c3QgYmUgcmVwbGFjZWQgZmlyc3QNCiAgICBmcm9tX3N5bWJvbHMgPSAnJj48IlwnJw0KICAgIHRvX3N5bWJvbHMgPSAoJyYnK3MrJzsnIGZvciBzIGluICJhbXAgZ3QgbHQgcXVvdCBhcG9zIi5zcGxpdCgpKQ0KICAgIGZvciBmcm9tXyx0b18gaW4gemlwKGZyb21fc3ltYm9scywgdG9fc3ltYm9scyk6DQogICAgICAgIGRhdGEgPSBkYXRhLnJlcGxhY2UoZnJvbV8sIHRvXykNCiAgICByZXR1cm4gZGF0YQ0KDQpjbGFzcyBfQ29uc3RhbnRzKG9iamVjdCk6DQogICAgcGFzcw0KDQphbHBoYXMgICAgID0gc3RyaW5nLmFzY2lpX3VwcGVyY2FzZSArIHN0cmluZy5hc2NpaV9sb3dlcmNhc2UNCm51bXMgICAgICAgPSAiMDEyMzQ1Njc4OSINCmhleG51bXMgICAgPSBudW1zICsgIkFCQ0RFRmFiY2RlZiINCmFscGhhbnVtcyAgPSBhbHBoYXMgKyBudW1zDQpfYnNsYXNoICAgID0gY2hyKDkyKQ0KcHJpbnRhYmxlcyA9ICIiLmpvaW4oYyBmb3IgYyBpbiBzdHJpbmcucHJpbnRhYmxlIGlmIGMgbm90IGluIHN0cmluZy53aGl0ZXNwYWNlKQ0KDQpjbGFzcyBQYXJzZUJhc2VFeGNlcHRpb24oRXhjZXB0aW9uKToNCiAgICAiIiJiYXNlIGV4Y2VwdGlvbiBjbGFzcyBmb3IgYWxsIHBhcnNpbmcgcnVudGltZSBleGNlcHRpb25zIiIiDQogICAgIyBQZXJmb3JtYW5jZSB0dW5pbmc6IHdlIGNvbnN0cnVjdCBhICpsb3QqIG9mIHRoZXNlLCBzbyBrZWVwIHRoaXMNCiAgICAjIGNvbnN0cnVjdG9yIGFzIHNtYWxsIGFuZCBmYXN0IGFzIHBvc3NpYmxlDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBwc3RyLCBsb2M9MCwgbXNnPU5vbmUsIGVsZW09Tm9uZSApOg0KICAgICAgICBzZWxmLmxvYyA9IGxvYw0KICAgICAgICBpZiBtc2cgaXMgTm9uZToNCiAgICAgICAgICAgIHNlbGYubXNnID0gcHN0cg0KICAgICAgICAgICAgc2VsZi5wc3RyID0gIiINCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYubXNnID0gbXNnDQogICAgICAgICAgICBzZWxmLnBzdHIgPSBwc3RyDQogICAgICAgIHNlbGYucGFyc2VyRWxlbWVudCA9IGVsZW0NCiAgICAgICAgc2VsZi5hcmdzID0gKHBzdHIsIGxvYywgbXNnKQ0KDQogICAgQGNsYXNzbWV0aG9kDQogICAgZGVmIF9mcm9tX2V4Y2VwdGlvbihjbHMsIHBlKToNCiAgICAgICAgIiIiDQogICAgICAgIGludGVybmFsIGZhY3RvcnkgbWV0aG9kIHRvIHNpbXBsaWZ5IGNyZWF0aW5nIG9uZSB0eXBlIG9mIFBhcnNlRXhjZXB0aW9uIA0KICAgICAgICBmcm9tIGFub3RoZXIgLSBhdm9pZHMgaGF2aW5nIF9faW5pdF9fIHNpZ25hdHVyZSBjb25mbGljdHMgYW1vbmcgc3ViY2xhc3Nlcw0KICAgICAgICAiIiINCiAgICAgICAgcmV0dXJuIGNscyhwZS5wc3RyLCBwZS5sb2MsIHBlLm1zZywgcGUucGFyc2VyRWxlbWVudCkNCg0KICAgIGRlZiBfX2dldGF0dHJfXyggc2VsZiwgYW5hbWUgKToNCiAgICAgICAgIiIic3VwcG9ydGVkIGF0dHJpYnV0ZXMgYnkgbmFtZSBhcmU6DQogICAgICAgICAgICAtIGxpbmVubyAtIHJldHVybnMgdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBleGNlcHRpb24gdGV4dA0KICAgICAgICAgICAgLSBjb2wgLSByZXR1cm5zIHRoZSBjb2x1bW4gbnVtYmVyIG9mIHRoZSBleGNlcHRpb24gdGV4dA0KICAgICAgICAgICAgLSBsaW5lIC0gcmV0dXJucyB0aGUgbGluZSBjb250YWluaW5nIHRoZSBleGNlcHRpb24gdGV4dA0KICAgICAgICAiIiINCiAgICAgICAgaWYoIGFuYW1lID09ICJsaW5lbm8iICk6DQogICAgICAgICAgICByZXR1cm4gbGluZW5vKCBzZWxmLmxvYywgc2VsZi5wc3RyICkNCiAgICAgICAgZWxpZiggYW5hbWUgaW4gKCJjb2wiLCAiY29sdW1uIikgKToNCiAgICAgICAgICAgIHJldHVybiBjb2woIHNlbGYubG9jLCBzZWxmLnBzdHIgKQ0KICAgICAgICBlbGlmKCBhbmFtZSA9PSAibGluZSIgKToNCiAgICAgICAgICAgIHJldHVybiBsaW5lKCBzZWxmLmxvYywgc2VsZi5wc3RyICkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKGFuYW1lKQ0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgcmV0dXJuICIlcyAoYXQgY2hhciAlZCksIChsaW5lOiVkLCBjb2w6JWQpIiAlIFwNCiAgICAgICAgICAgICAgICAoIHNlbGYubXNnLCBzZWxmLmxvYywgc2VsZi5saW5lbm8sIHNlbGYuY29sdW1uICkNCiAgICBkZWYgX19yZXByX18oIHNlbGYgKToNCiAgICAgICAgcmV0dXJuIF91c3RyKHNlbGYpDQogICAgZGVmIG1hcmtJbnB1dGxpbmUoIHNlbGYsIG1hcmtlclN0cmluZyA9ICI+ITwiICk6DQogICAgICAgICIiIkV4dHJhY3RzIHRoZSBleGNlcHRpb24gbGluZSBmcm9tIHRoZSBpbnB1dCBzdHJpbmcsIGFuZCBtYXJrcw0KICAgICAgICAgICB0aGUgbG9jYXRpb24gb2YgdGhlIGV4Y2VwdGlvbiB3aXRoIGEgc3BlY2lhbCBzeW1ib2wuDQogICAgICAgICIiIg0KICAgICAgICBsaW5lX3N0ciA9IHNlbGYubGluZQ0KICAgICAgICBsaW5lX2NvbHVtbiA9IHNlbGYuY29sdW1uIC0gMQ0KICAgICAgICBpZiBtYXJrZXJTdHJpbmc6DQogICAgICAgICAgICBsaW5lX3N0ciA9ICIiLmpvaW4oKGxpbmVfc3RyWzpsaW5lX2NvbHVtbl0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlclN0cmluZywgbGluZV9zdHJbbGluZV9jb2x1bW46XSkpDQogICAgICAgIHJldHVybiBsaW5lX3N0ci5zdHJpcCgpDQogICAgZGVmIF9fZGlyX18oc2VsZik6DQogICAgICAgIHJldHVybiAibGluZW5vIGNvbCBsaW5lIi5zcGxpdCgpICsgZGlyKHR5cGUoc2VsZikpDQoNCmNsYXNzIFBhcnNlRXhjZXB0aW9uKFBhcnNlQmFzZUV4Y2VwdGlvbik6DQogICAgIiIiDQogICAgRXhjZXB0aW9uIHRocm93biB3aGVuIHBhcnNlIGV4cHJlc3Npb25zIGRvbid0IG1hdGNoIGNsYXNzOw0KICAgIHN1cHBvcnRlZCBhdHRyaWJ1dGVzIGJ5IG5hbWUgYXJlOg0KICAgICAtIGxpbmVubyAtIHJldHVybnMgdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBleGNlcHRpb24gdGV4dA0KICAgICAtIGNvbCAtIHJldHVybnMgdGhlIGNvbHVtbiBudW1iZXIgb2YgdGhlIGV4Y2VwdGlvbiB0ZXh0DQogICAgIC0gbGluZSAtIHJldHVybnMgdGhlIGxpbmUgY29udGFpbmluZyB0aGUgZXhjZXB0aW9uIHRleHQNCiAgICAgICAgDQogICAgRXhhbXBsZTo6DQogICAgICAgIHRyeToNCiAgICAgICAgICAgIFdvcmQobnVtcykuc2V0TmFtZSgiaW50ZWdlciIpLnBhcnNlU3RyaW5nKCJBQkMiKQ0KICAgICAgICBleGNlcHQgUGFyc2VFeGNlcHRpb24gYXMgcGU6DQogICAgICAgICAgICBwcmludChwZSkNCiAgICAgICAgICAgIHByaW50KCJjb2x1bW46IHt9Ii5mb3JtYXQocGUuY29sKSkNCiAgICAgICAgICAgIA0KICAgIHByaW50czo6DQogICAgICAgRXhwZWN0ZWQgaW50ZWdlciAoYXQgY2hhciAwKSwgKGxpbmU6MSwgY29sOjEpDQogICAgICAgIGNvbHVtbjogMQ0KICAgICIiIg0KICAgIHBhc3MNCg0KY2xhc3MgUGFyc2VGYXRhbEV4Y2VwdGlvbihQYXJzZUJhc2VFeGNlcHRpb24pOg0KICAgICIiInVzZXItdGhyb3dhYmxlIGV4Y2VwdGlvbiB0aHJvd24gd2hlbiBpbmNvbnNpc3RlbnQgcGFyc2UgY29udGVudA0KICAgICAgIGlzIGZvdW5kOyBzdG9wcyBhbGwgcGFyc2luZyBpbW1lZGlhdGVseSIiIg0KICAgIHBhc3MNCg0KY2xhc3MgUGFyc2VTeW50YXhFeGNlcHRpb24oUGFyc2VGYXRhbEV4Y2VwdGlvbik6DQogICAgIiIianVzdCBsaWtlIEx7UGFyc2VGYXRhbEV4Y2VwdGlvbn0sIGJ1dCB0aHJvd24gaW50ZXJuYWxseSB3aGVuIGFuDQogICAgICAgTHtFcnJvclN0b3A8QW5kLl9FcnJvclN0b3A+fSAoJy0nIG9wZXJhdG9yKSBpbmRpY2F0ZXMgdGhhdCBwYXJzaW5nIGlzIHRvIHN0b3AgDQogICAgICAgaW1tZWRpYXRlbHkgYmVjYXVzZSBhbiB1bmJhY2t0cmFja2FibGUgc3ludGF4IGVycm9yIGhhcyBiZWVuIGZvdW5kIiIiDQogICAgcGFzcw0KDQojfiBjbGFzcyBSZXBhcnNlRXhjZXB0aW9uKFBhcnNlQmFzZUV4Y2VwdGlvbik6DQogICAgI34gIiIiRXhwZXJpbWVudGFsIGNsYXNzIC0gcGFyc2UgYWN0aW9ucyBjYW4gcmFpc2UgdGhpcyBleGNlcHRpb24gdG8gY2F1c2UNCiAgICAgICAjfiBweXBhcnNpbmcgdG8gcmVwYXJzZSB0aGUgaW5wdXQgc3RyaW5nOg0KICAgICAgICAjfiAtIHdpdGggYSBtb2RpZmllZCBpbnB1dCBzdHJpbmcsIGFuZC9vcg0KICAgICAgICAjfiAtIHdpdGggYSBtb2RpZmllZCBzdGFydCBsb2NhdGlvbg0KICAgICAgICN+IFNldCB0aGUgdmFsdWVzIG9mIHRoZSBSZXBhcnNlRXhjZXB0aW9uIGluIHRoZSBjb25zdHJ1Y3RvciwgYW5kIHJhaXNlIHRoZQ0KICAgICAgICN+IGV4Y2VwdGlvbiBpbiBhIHBhcnNlIGFjdGlvbiB0byBjYXVzZSBweXBhcnNpbmcgdG8gdXNlIHRoZSBuZXcgc3RyaW5nL2xvY2F0aW9uLg0KICAgICAgICN+IFNldHRpbmcgdGhlIHZhbHVlcyBhcyBOb25lIGNhdXNlcyBubyBjaGFuZ2UgdG8gYmUgbWFkZS4NCiAgICAgICAjfiAiIiINCiAgICAjfiBkZWYgX19pbml0Xyggc2VsZiwgbmV3c3RyaW5nLCByZXN0YXJ0TG9jICk6DQogICAgICAgICN+IHNlbGYubmV3UGFyc2VUZXh0ID0gbmV3c3RyaW5nDQogICAgICAgICN+IHNlbGYucmVwYXJzZUxvYyA9IHJlc3RhcnRMb2MNCg0KY2xhc3MgUmVjdXJzaXZlR3JhbW1hckV4Y2VwdGlvbihFeGNlcHRpb24pOg0KICAgICIiImV4Y2VwdGlvbiB0aHJvd24gYnkgTHtQYXJzZXJFbGVtZW50LnZhbGlkYXRlfSBpZiB0aGUgZ3JhbW1hciBjb3VsZCBiZSBpbXByb3Blcmx5IHJlY3Vyc2l2ZSIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgcGFyc2VFbGVtZW50TGlzdCApOg0KICAgICAgICBzZWxmLnBhcnNlRWxlbWVudFRyYWNlID0gcGFyc2VFbGVtZW50TGlzdA0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgcmV0dXJuICJSZWN1cnNpdmVHcmFtbWFyRXhjZXB0aW9uOiAlcyIgJSBzZWxmLnBhcnNlRWxlbWVudFRyYWNlDQoNCmNsYXNzIF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KG9iamVjdCk6DQogICAgZGVmIF9faW5pdF9fKHNlbGYscDEscDIpOg0KICAgICAgICBzZWxmLnR1cCA9IChwMSxwMikNCiAgICBkZWYgX19nZXRpdGVtX18oc2VsZixpKToNCiAgICAgICAgcmV0dXJuIHNlbGYudHVwW2ldDQogICAgZGVmIF9fcmVwcl9fKHNlbGYpOg0KICAgICAgICByZXR1cm4gcmVwcihzZWxmLnR1cFswXSkNCiAgICBkZWYgc2V0T2Zmc2V0KHNlbGYsaSk6DQogICAgICAgIHNlbGYudHVwID0gKHNlbGYudHVwWzBdLGkpDQoNCmNsYXNzIFBhcnNlUmVzdWx0cyhvYmplY3QpOg0KICAgICIiIg0KICAgIFN0cnVjdHVyZWQgcGFyc2UgcmVzdWx0cywgdG8gcHJvdmlkZSBtdWx0aXBsZSBtZWFucyBvZiBhY2Nlc3MgdG8gdGhlIHBhcnNlZCBkYXRhOg0KICAgICAgIC0gYXMgYSBsaXN0IChDe2xlbihyZXN1bHRzKX0pDQogICAgICAgLSBieSBsaXN0IGluZGV4IChDe3Jlc3VsdHNbMF0sIHJlc3VsdHNbMV19LCBldGMuKQ0KICAgICAgIC0gYnkgYXR0cmlidXRlIChDe3Jlc3VsdHMuPHJlc3VsdHNOYW1lPn0gLSBzZWUgTHtQYXJzZXJFbGVtZW50LnNldFJlc3VsdHNOYW1lfSkNCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQ0KICAgICAgICBkYXRlX3N0ciA9IChpbnRlZ2VyLnNldFJlc3VsdHNOYW1lKCJ5ZWFyIikgKyAnLycgDQogICAgICAgICAgICAgICAgICAgICAgICArIGludGVnZXIuc2V0UmVzdWx0c05hbWUoIm1vbnRoIikgKyAnLycgDQogICAgICAgICAgICAgICAgICAgICAgICArIGludGVnZXIuc2V0UmVzdWx0c05hbWUoImRheSIpKQ0KICAgICAgICAjIGVxdWl2YWxlbnQgZm9ybToNCiAgICAgICAgIyBkYXRlX3N0ciA9IGludGVnZXIoInllYXIiKSArICcvJyArIGludGVnZXIoIm1vbnRoIikgKyAnLycgKyBpbnRlZ2VyKCJkYXkiKQ0KDQogICAgICAgICMgcGFyc2VTdHJpbmcgcmV0dXJucyBhIFBhcnNlUmVzdWx0cyBvYmplY3QNCiAgICAgICAgcmVzdWx0ID0gZGF0ZV9zdHIucGFyc2VTdHJpbmcoIjE5OTkvMTIvMzEiKQ0KDQogICAgICAgIGRlZiB0ZXN0KHMsIGZuPXJlcHIpOg0KICAgICAgICAgICAgcHJpbnQoIiVzIC0+ICVzIiAlIChzLCBmbihldmFsKHMpKSkpDQogICAgICAgIHRlc3QoImxpc3QocmVzdWx0KSIpDQogICAgICAgIHRlc3QoInJlc3VsdFswXSIpDQogICAgICAgIHRlc3QoInJlc3VsdFsnbW9udGgnXSIpDQogICAgICAgIHRlc3QoInJlc3VsdC5kYXkiKQ0KICAgICAgICB0ZXN0KCInbW9udGgnIGluIHJlc3VsdCIpDQogICAgICAgIHRlc3QoIidtaW51dGVzJyBpbiByZXN1bHQiKQ0KICAgICAgICB0ZXN0KCJyZXN1bHQuZHVtcCgpIiwgc3RyKQ0KICAgIHByaW50czo6DQogICAgICAgIGxpc3QocmVzdWx0KSAtPiBbJzE5OTknLCAnLycsICcxMicsICcvJywgJzMxJ10NCiAgICAgICAgcmVzdWx0WzBdIC0+ICcxOTk5Jw0KICAgICAgICByZXN1bHRbJ21vbnRoJ10gLT4gJzEyJw0KICAgICAgICByZXN1bHQuZGF5IC0+ICczMScNCiAgICAgICAgJ21vbnRoJyBpbiByZXN1bHQgLT4gVHJ1ZQ0KICAgICAgICAnbWludXRlcycgaW4gcmVzdWx0IC0+IEZhbHNlDQogICAgICAgIHJlc3VsdC5kdW1wKCkgLT4gWycxOTk5JywgJy8nLCAnMTInLCAnLycsICczMSddDQogICAgICAgIC0gZGF5OiAzMQ0KICAgICAgICAtIG1vbnRoOiAxMg0KICAgICAgICAtIHllYXI6IDE5OTkNCiAgICAiIiINCiAgICBkZWYgX19uZXdfXyhjbHMsIHRva2xpc3Q9Tm9uZSwgbmFtZT1Ob25lLCBhc0xpc3Q9VHJ1ZSwgbW9kYWw9VHJ1ZSApOg0KICAgICAgICBpZiBpc2luc3RhbmNlKHRva2xpc3QsIGNscyk6DQogICAgICAgICAgICByZXR1cm4gdG9rbGlzdA0KICAgICAgICByZXRvYmogPSBvYmplY3QuX19uZXdfXyhjbHMpDQogICAgICAgIHJldG9iai5fX2RvaW5pdCA9IFRydWUNCiAgICAgICAgcmV0dXJuIHJldG9iag0KDQogICAgIyBQZXJmb3JtYW5jZSB0dW5pbmc6IHdlIGNvbnN0cnVjdCBhICpsb3QqIG9mIHRoZXNlLCBzbyBrZWVwIHRoaXMNCiAgICAjIGNvbnN0cnVjdG9yIGFzIHNtYWxsIGFuZCBmYXN0IGFzIHBvc3NpYmxlDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCB0b2tsaXN0PU5vbmUsIG5hbWU9Tm9uZSwgYXNMaXN0PVRydWUsIG1vZGFsPVRydWUsIGlzaW5zdGFuY2U9aXNpbnN0YW5jZSApOg0KICAgICAgICBpZiBzZWxmLl9fZG9pbml0Og0KICAgICAgICAgICAgc2VsZi5fX2RvaW5pdCA9IEZhbHNlDQogICAgICAgICAgICBzZWxmLl9fbmFtZSA9IE5vbmUNCiAgICAgICAgICAgIHNlbGYuX19wYXJlbnQgPSBOb25lDQogICAgICAgICAgICBzZWxmLl9fYWNjdW1OYW1lcyA9IHt9DQogICAgICAgICAgICBzZWxmLl9fYXNMaXN0ID0gYXNMaXN0DQogICAgICAgICAgICBzZWxmLl9fbW9kYWwgPSBtb2RhbA0KICAgICAgICAgICAgaWYgdG9rbGlzdCBpcyBOb25lOg0KICAgICAgICAgICAgICAgIHRva2xpc3QgPSBbXQ0KICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh0b2tsaXN0LCBsaXN0KToNCiAgICAgICAgICAgICAgICBzZWxmLl9fdG9rbGlzdCA9IHRva2xpc3RbOl0NCiAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh0b2tsaXN0LCBfZ2VuZXJhdG9yVHlwZSk6DQogICAgICAgICAgICAgICAgc2VsZi5fX3Rva2xpc3QgPSBsaXN0KHRva2xpc3QpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHNlbGYuX190b2tsaXN0ID0gW3Rva2xpc3RdDQogICAgICAgICAgICBzZWxmLl9fdG9rZGljdCA9IGRpY3QoKQ0KDQogICAgICAgIGlmIG5hbWUgaXMgbm90IE5vbmUgYW5kIG5hbWU6DQogICAgICAgICAgICBpZiBub3QgbW9kYWw6DQogICAgICAgICAgICAgICAgc2VsZi5fX2FjY3VtTmFtZXNbbmFtZV0gPSAwDQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKG5hbWUsaW50KToNCiAgICAgICAgICAgICAgICBuYW1lID0gX3VzdHIobmFtZSkgIyB3aWxsIGFsd2F5cyByZXR1cm4gYSBzdHIsIGJ1dCB1c2UgX3VzdHIgZm9yIGNvbnNpc3RlbmN5DQogICAgICAgICAgICBzZWxmLl9fbmFtZSA9IG5hbWUNCiAgICAgICAgICAgIGlmIG5vdCAoaXNpbnN0YW5jZSh0b2tsaXN0LCAodHlwZShOb25lKSwgYmFzZXN0cmluZywgbGlzdCkpIGFuZCB0b2tsaXN0IGluIChOb25lLCcnLFtdKSk6DQogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh0b2tsaXN0LGJhc2VzdHJpbmcpOg0KICAgICAgICAgICAgICAgICAgICB0b2tsaXN0ID0gWyB0b2tsaXN0IF0NCiAgICAgICAgICAgICAgICBpZiBhc0xpc3Q6DQogICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodG9rbGlzdCxQYXJzZVJlc3VsdHMpOg0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZltuYW1lXSA9IF9QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KHRva2xpc3QuY29weSgpLDApDQogICAgICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmW25hbWVdID0gX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQoUGFyc2VSZXN1bHRzKHRva2xpc3RbMF0pLDApDQogICAgICAgICAgICAgICAgICAgIHNlbGZbbmFtZV0uX19uYW1lID0gbmFtZQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGZbbmFtZV0gPSB0b2tsaXN0WzBdDQogICAgICAgICAgICAgICAgICAgIGV4Y2VwdCAoS2V5RXJyb3IsVHlwZUVycm9yLEluZGV4RXJyb3IpOg0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZltuYW1lXSA9IHRva2xpc3QNCg0KICAgIGRlZiBfX2dldGl0ZW1fXyggc2VsZiwgaSApOg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBpLCAoaW50LHNsaWNlKSApOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYuX190b2tsaXN0W2ldDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBpZiBpIG5vdCBpbiBzZWxmLl9fYWNjdW1OYW1lczoNCiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fX3Rva2RpY3RbaV1bLTFdWzBdDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJldHVybiBQYXJzZVJlc3VsdHMoWyB2WzBdIGZvciB2IGluIHNlbGYuX190b2tkaWN0W2ldIF0pDQoNCiAgICBkZWYgX19zZXRpdGVtX18oIHNlbGYsIGssIHYsIGlzaW5zdGFuY2U9aXNpbnN0YW5jZSApOg0KICAgICAgICBpZiBpc2luc3RhbmNlKHYsX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQpOg0KICAgICAgICAgICAgc2VsZi5fX3Rva2RpY3Rba10gPSBzZWxmLl9fdG9rZGljdC5nZXQoayxsaXN0KCkpICsgW3ZdDQogICAgICAgICAgICBzdWIgPSB2WzBdDQogICAgICAgIGVsaWYgaXNpbnN0YW5jZShrLChpbnQsc2xpY2UpKToNCiAgICAgICAgICAgIHNlbGYuX190b2tsaXN0W2tdID0gdg0KICAgICAgICAgICAgc3ViID0gdg0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5fX3Rva2RpY3Rba10gPSBzZWxmLl9fdG9rZGljdC5nZXQoayxsaXN0KCkpICsgW19QYXJzZVJlc3VsdHNXaXRoT2Zmc2V0KHYsMCldDQogICAgICAgICAgICBzdWIgPSB2DQogICAgICAgIGlmIGlzaW5zdGFuY2Uoc3ViLFBhcnNlUmVzdWx0cyk6DQogICAgICAgICAgICBzdWIuX19wYXJlbnQgPSB3a3JlZihzZWxmKQ0KDQogICAgZGVmIF9fZGVsaXRlbV9fKCBzZWxmLCBpICk6DQogICAgICAgIGlmIGlzaW5zdGFuY2UoaSwoaW50LHNsaWNlKSk6DQogICAgICAgICAgICBteWxlbiA9IGxlbiggc2VsZi5fX3Rva2xpc3QgKQ0KICAgICAgICAgICAgZGVsIHNlbGYuX190b2tsaXN0W2ldDQoNCiAgICAgICAgICAgICMgY29udmVydCBpbnQgdG8gc2xpY2UNCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoaSwgaW50KToNCiAgICAgICAgICAgICAgICBpZiBpIDwgMDoNCiAgICAgICAgICAgICAgICAgICAgaSArPSBteWxlbg0KICAgICAgICAgICAgICAgIGkgPSBzbGljZShpLCBpKzEpDQogICAgICAgICAgICAjIGdldCByZW1vdmVkIGluZGljZXMNCiAgICAgICAgICAgIHJlbW92ZWQgPSBsaXN0KHJhbmdlKCppLmluZGljZXMobXlsZW4pKSkNCiAgICAgICAgICAgIHJlbW92ZWQucmV2ZXJzZSgpDQogICAgICAgICAgICAjIGZpeHVwIGluZGljZXMgaW4gdG9rZW4gZGljdGlvbmFyeQ0KICAgICAgICAgICAgZm9yIG5hbWUsb2NjdXJyZW5jZXMgaW4gc2VsZi5fX3Rva2RpY3QuaXRlbXMoKToNCiAgICAgICAgICAgICAgICBmb3IgaiBpbiByZW1vdmVkOg0KICAgICAgICAgICAgICAgICAgICBmb3IgaywgKHZhbHVlLCBwb3NpdGlvbikgaW4gZW51bWVyYXRlKG9jY3VycmVuY2VzKToNCiAgICAgICAgICAgICAgICAgICAgICAgIG9jY3VycmVuY2VzW2tdID0gX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQodmFsdWUsIHBvc2l0aW9uIC0gKHBvc2l0aW9uID4gaikpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBkZWwgc2VsZi5fX3Rva2RpY3RbaV0NCg0KICAgIGRlZiBfX2NvbnRhaW5zX18oIHNlbGYsIGsgKToNCiAgICAgICAgcmV0dXJuIGsgaW4gc2VsZi5fX3Rva2RpY3QNCg0KICAgIGRlZiBfX2xlbl9fKCBzZWxmICk6IHJldHVybiBsZW4oIHNlbGYuX190b2tsaXN0ICkNCiAgICBkZWYgX19ib29sX18oc2VsZik6IHJldHVybiAoIG5vdCBub3Qgc2VsZi5fX3Rva2xpc3QgKQ0KICAgIF9fbm9uemVyb19fID0gX19ib29sX18NCiAgICBkZWYgX19pdGVyX18oIHNlbGYgKTogcmV0dXJuIGl0ZXIoIHNlbGYuX190b2tsaXN0ICkNCiAgICBkZWYgX19yZXZlcnNlZF9fKCBzZWxmICk6IHJldHVybiBpdGVyKCBzZWxmLl9fdG9rbGlzdFs6Oi0xXSApDQogICAgZGVmIF9pdGVya2V5cyggc2VsZiApOg0KICAgICAgICBpZiBoYXNhdHRyKHNlbGYuX190b2tkaWN0LCAiaXRlcmtleXMiKToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLl9fdG9rZGljdC5pdGVya2V5cygpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByZXR1cm4gaXRlcihzZWxmLl9fdG9rZGljdCkNCg0KICAgIGRlZiBfaXRlcnZhbHVlcyggc2VsZiApOg0KICAgICAgICByZXR1cm4gKHNlbGZba10gZm9yIGsgaW4gc2VsZi5faXRlcmtleXMoKSkNCiAgICAgICAgICAgIA0KICAgIGRlZiBfaXRlcml0ZW1zKCBzZWxmICk6DQogICAgICAgIHJldHVybiAoKGssIHNlbGZba10pIGZvciBrIGluIHNlbGYuX2l0ZXJrZXlzKCkpDQoNCiAgICBpZiBQWV8zOg0KICAgICAgICBrZXlzID0gX2l0ZXJrZXlzICAgICAgIA0KICAgICAgICAiIiJSZXR1cm5zIGFuIGl0ZXJhdG9yIG9mIGFsbCBuYW1lZCByZXN1bHQga2V5cyAoUHl0aG9uIDMueCBvbmx5KS4iIiINCg0KICAgICAgICB2YWx1ZXMgPSBfaXRlcnZhbHVlcw0KICAgICAgICAiIiJSZXR1cm5zIGFuIGl0ZXJhdG9yIG9mIGFsbCBuYW1lZCByZXN1bHQgdmFsdWVzIChQeXRob24gMy54IG9ubHkpLiIiIg0KDQogICAgICAgIGl0ZW1zID0gX2l0ZXJpdGVtcw0KICAgICAgICAiIiJSZXR1cm5zIGFuIGl0ZXJhdG9yIG9mIGFsbCBuYW1lZCByZXN1bHQga2V5LXZhbHVlIHR1cGxlcyAoUHl0aG9uIDMueCBvbmx5KS4iIiINCg0KICAgIGVsc2U6DQogICAgICAgIGl0ZXJrZXlzID0gX2l0ZXJrZXlzDQogICAgICAgICIiIlJldHVybnMgYW4gaXRlcmF0b3Igb2YgYWxsIG5hbWVkIHJlc3VsdCBrZXlzIChQeXRob24gMi54IG9ubHkpLiIiIg0KDQogICAgICAgIGl0ZXJ2YWx1ZXMgPSBfaXRlcnZhbHVlcw0KICAgICAgICAiIiJSZXR1cm5zIGFuIGl0ZXJhdG9yIG9mIGFsbCBuYW1lZCByZXN1bHQgdmFsdWVzIChQeXRob24gMi54IG9ubHkpLiIiIg0KDQogICAgICAgIGl0ZXJpdGVtcyA9IF9pdGVyaXRlbXMNCiAgICAgICAgIiIiUmV0dXJucyBhbiBpdGVyYXRvciBvZiBhbGwgbmFtZWQgcmVzdWx0IGtleS12YWx1ZSB0dXBsZXMgKFB5dGhvbiAyLnggb25seSkuIiIiDQoNCiAgICAgICAgZGVmIGtleXMoIHNlbGYgKToNCiAgICAgICAgICAgICIiIlJldHVybnMgYWxsIG5hbWVkIHJlc3VsdCBrZXlzIChhcyBhIGxpc3QgaW4gUHl0aG9uIDIueCwgYXMgYW4gaXRlcmF0b3IgaW4gUHl0aG9uIDMueCkuIiIiDQogICAgICAgICAgICByZXR1cm4gbGlzdChzZWxmLml0ZXJrZXlzKCkpDQoNCiAgICAgICAgZGVmIHZhbHVlcyggc2VsZiApOg0KICAgICAgICAgICAgIiIiUmV0dXJucyBhbGwgbmFtZWQgcmVzdWx0IHZhbHVlcyAoYXMgYSBsaXN0IGluIFB5dGhvbiAyLngsIGFzIGFuIGl0ZXJhdG9yIGluIFB5dGhvbiAzLngpLiIiIg0KICAgICAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5pdGVydmFsdWVzKCkpDQogICAgICAgICAgICAgICAgDQogICAgICAgIGRlZiBpdGVtcyggc2VsZiApOg0KICAgICAgICAgICAgIiIiUmV0dXJucyBhbGwgbmFtZWQgcmVzdWx0IGtleS12YWx1ZXMgKGFzIGEgbGlzdCBvZiB0dXBsZXMgaW4gUHl0aG9uIDIueCwgYXMgYW4gaXRlcmF0b3IgaW4gUHl0aG9uIDMueCkuIiIiDQogICAgICAgICAgICByZXR1cm4gbGlzdChzZWxmLml0ZXJpdGVtcygpKQ0KDQogICAgZGVmIGhhc2tleXMoIHNlbGYgKToNCiAgICAgICAgIiIiU2luY2Uga2V5cygpIHJldHVybnMgYW4gaXRlcmF0b3IsIHRoaXMgbWV0aG9kIGlzIGhlbHBmdWwgaW4gYnlwYXNzaW5nDQogICAgICAgICAgIGNvZGUgdGhhdCBsb29rcyBmb3IgdGhlIGV4aXN0ZW5jZSBvZiBhbnkgZGVmaW5lZCByZXN1bHRzIG5hbWVzLiIiIg0KICAgICAgICByZXR1cm4gYm9vbChzZWxmLl9fdG9rZGljdCkNCiAgICAgICAgDQogICAgZGVmIHBvcCggc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToNCiAgICAgICAgIiIiDQogICAgICAgIFJlbW92ZXMgYW5kIHJldHVybnMgaXRlbSBhdCBzcGVjaWZpZWQgaW5kZXggKGRlZmF1bHQ9Q3tsYXN0fSkuDQogICAgICAgIFN1cHBvcnRzIGJvdGggQ3tsaXN0fSBhbmQgQ3tkaWN0fSBzZW1hbnRpY3MgZm9yIEN7cG9wKCl9LiBJZiBwYXNzZWQgbm8NCiAgICAgICAgYXJndW1lbnQgb3IgYW4gaW50ZWdlciBhcmd1bWVudCwgaXQgd2lsbCB1c2UgQ3tsaXN0fSBzZW1hbnRpY3MNCiAgICAgICAgYW5kIHBvcCB0b2tlbnMgZnJvbSB0aGUgbGlzdCBvZiBwYXJzZWQgdG9rZW5zLiBJZiBwYXNzZWQgYSANCiAgICAgICAgbm9uLWludGVnZXIgYXJndW1lbnQgKG1vc3QgbGlrZWx5IGEgc3RyaW5nKSwgaXQgd2lsbCB1c2UgQ3tkaWN0fQ0KICAgICAgICBzZW1hbnRpY3MgYW5kIHBvcCB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBmcm9tIGFueSBkZWZpbmVkIA0KICAgICAgICByZXN1bHRzIG5hbWVzLiBBIHNlY29uZCBkZWZhdWx0IHJldHVybiB2YWx1ZSBhcmd1bWVudCBpcyANCiAgICAgICAgc3VwcG9ydGVkLCBqdXN0IGFzIGluIEN7ZGljdC5wb3AoKX0uDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBkZWYgcmVtb3ZlX2ZpcnN0KHRva2Vucyk6DQogICAgICAgICAgICAgICAgdG9rZW5zLnBvcCgwKQ0KICAgICAgICAgICAgcHJpbnQoT25lT3JNb3JlKFdvcmQobnVtcykpLnBhcnNlU3RyaW5nKCIwIDEyMyAzMjEiKSkgIyAtPiBbJzAnLCAnMTIzJywgJzMyMSddDQogICAgICAgICAgICBwcmludChPbmVPck1vcmUoV29yZChudW1zKSkuYWRkUGFyc2VBY3Rpb24ocmVtb3ZlX2ZpcnN0KS5wYXJzZVN0cmluZygiMCAxMjMgMzIxIikpICMgLT4gWycxMjMnLCAnMzIxJ10NCg0KICAgICAgICAgICAgbGFiZWwgPSBXb3JkKGFscGhhcykNCiAgICAgICAgICAgIHBhdHQgPSBsYWJlbCgiTEFCRUwiKSArIE9uZU9yTW9yZShXb3JkKG51bXMpKQ0KICAgICAgICAgICAgcHJpbnQocGF0dC5wYXJzZVN0cmluZygiQUFCIDEyMyAzMjEiKS5kdW1wKCkpDQoNCiAgICAgICAgICAgICMgVXNlIHBvcCgpIGluIGEgcGFyc2UgYWN0aW9uIHRvIHJlbW92ZSBuYW1lZCByZXN1bHQgKG5vdGUgdGhhdCBjb3JyZXNwb25kaW5nIHZhbHVlIGlzIG5vdA0KICAgICAgICAgICAgIyByZW1vdmVkIGZyb20gbGlzdCBmb3JtIG9mIHJlc3VsdHMpDQogICAgICAgICAgICBkZWYgcmVtb3ZlX0xBQkVMKHRva2Vucyk6DQogICAgICAgICAgICAgICAgdG9rZW5zLnBvcCgiTEFCRUwiKQ0KICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbnMNCiAgICAgICAgICAgIHBhdHQuYWRkUGFyc2VBY3Rpb24ocmVtb3ZlX0xBQkVMKQ0KICAgICAgICAgICAgcHJpbnQocGF0dC5wYXJzZVN0cmluZygiQUFCIDEyMyAzMjEiKS5kdW1wKCkpDQogICAgICAgIHByaW50czo6DQogICAgICAgICAgICBbJ0FBQicsICcxMjMnLCAnMzIxJ10NCiAgICAgICAgICAgIC0gTEFCRUw6IEFBQg0KDQogICAgICAgICAgICBbJ0FBQicsICcxMjMnLCAnMzIxJ10NCiAgICAgICAgIiIiDQogICAgICAgIGlmIG5vdCBhcmdzOg0KICAgICAgICAgICAgYXJncyA9IFstMV0NCiAgICAgICAgZm9yIGssdiBpbiBrd2FyZ3MuaXRlbXMoKToNCiAgICAgICAgICAgIGlmIGsgPT0gJ2RlZmF1bHQnOg0KICAgICAgICAgICAgICAgIGFyZ3MgPSAoYXJnc1swXSwgdikNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJwb3AoKSBnb3QgYW4gdW5leHBlY3RlZCBrZXl3b3JkIGFyZ3VtZW50ICclcyciICUgaykNCiAgICAgICAgaWYgKGlzaW5zdGFuY2UoYXJnc1swXSwgaW50KSBvciANCiAgICAgICAgICAgICAgICAgICAgICAgIGxlbihhcmdzKSA9PSAxIG9yIA0KICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1swXSBpbiBzZWxmKToNCiAgICAgICAgICAgIGluZGV4ID0gYXJnc1swXQ0KICAgICAgICAgICAgcmV0ID0gc2VsZltpbmRleF0NCiAgICAgICAgICAgIGRlbCBzZWxmW2luZGV4XQ0KICAgICAgICAgICAgcmV0dXJuIHJldA0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgZGVmYXVsdHZhbHVlID0gYXJnc1sxXQ0KICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHR2YWx1ZQ0KDQogICAgZGVmIGdldChzZWxmLCBrZXksIGRlZmF1bHRWYWx1ZT1Ob25lKToNCiAgICAgICAgIiIiDQogICAgICAgIFJldHVybnMgbmFtZWQgcmVzdWx0IG1hdGNoaW5nIHRoZSBnaXZlbiBrZXksIG9yIGlmIHRoZXJlIGlzIG5vDQogICAgICAgIHN1Y2ggbmFtZSwgdGhlbiByZXR1cm5zIHRoZSBnaXZlbiBDe2RlZmF1bHRWYWx1ZX0gb3IgQ3tOb25lfSBpZiBubw0KICAgICAgICBDe2RlZmF1bHRWYWx1ZX0gaXMgc3BlY2lmaWVkLg0KDQogICAgICAgIFNpbWlsYXIgdG8gQ3tkaWN0LmdldCgpfS4NCiAgICAgICAgDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykNCiAgICAgICAgICAgIGRhdGVfc3RyID0gaW50ZWdlcigieWVhciIpICsgJy8nICsgaW50ZWdlcigibW9udGgiKSArICcvJyArIGludGVnZXIoImRheSIpICAgICAgICAgICANCg0KICAgICAgICAgICAgcmVzdWx0ID0gZGF0ZV9zdHIucGFyc2VTdHJpbmcoIjE5OTkvMTIvMzEiKQ0KICAgICAgICAgICAgcHJpbnQocmVzdWx0LmdldCgieWVhciIpKSAjIC0+ICcxOTk5Jw0KICAgICAgICAgICAgcHJpbnQocmVzdWx0LmdldCgiaG91ciIsICJub3Qgc3BlY2lmaWVkIikpICMgLT4gJ25vdCBzcGVjaWZpZWQnDQogICAgICAgICAgICBwcmludChyZXN1bHQuZ2V0KCJob3VyIikpICMgLT4gTm9uZQ0KICAgICAgICAiIiINCiAgICAgICAgaWYga2V5IGluIHNlbGY6DQogICAgICAgICAgICByZXR1cm4gc2VsZltrZXldDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlDQoNCiAgICBkZWYgaW5zZXJ0KCBzZWxmLCBpbmRleCwgaW5zU3RyICk6DQogICAgICAgICIiIg0KICAgICAgICBJbnNlcnRzIG5ldyBlbGVtZW50IGF0IGxvY2F0aW9uIGluZGV4IGluIHRoZSBsaXN0IG9mIHBhcnNlZCB0b2tlbnMuDQogICAgICAgIA0KICAgICAgICBTaW1pbGFyIHRvIEN7bGlzdC5pbnNlcnQoKX0uDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBwcmludChPbmVPck1vcmUoV29yZChudW1zKSkucGFyc2VTdHJpbmcoIjAgMTIzIDMyMSIpKSAjIC0+IFsnMCcsICcxMjMnLCAnMzIxJ10NCg0KICAgICAgICAgICAgIyB1c2UgYSBwYXJzZSBhY3Rpb24gdG8gaW5zZXJ0IHRoZSBwYXJzZSBsb2NhdGlvbiBpbiB0aGUgZnJvbnQgb2YgdGhlIHBhcnNlZCByZXN1bHRzDQogICAgICAgICAgICBkZWYgaW5zZXJ0X2xvY24obG9jbiwgdG9rZW5zKToNCiAgICAgICAgICAgICAgICB0b2tlbnMuaW5zZXJ0KDAsIGxvY24pDQogICAgICAgICAgICBwcmludChPbmVPck1vcmUoV29yZChudW1zKSkuYWRkUGFyc2VBY3Rpb24oaW5zZXJ0X2xvY24pLnBhcnNlU3RyaW5nKCIwIDEyMyAzMjEiKSkgIyAtPiBbMCwgJzAnLCAnMTIzJywgJzMyMSddDQogICAgICAgICIiIg0KICAgICAgICBzZWxmLl9fdG9rbGlzdC5pbnNlcnQoaW5kZXgsIGluc1N0cikNCiAgICAgICAgIyBmaXh1cCBpbmRpY2VzIGluIHRva2VuIGRpY3Rpb25hcnkNCiAgICAgICAgZm9yIG5hbWUsb2NjdXJyZW5jZXMgaW4gc2VsZi5fX3Rva2RpY3QuaXRlbXMoKToNCiAgICAgICAgICAgIGZvciBrLCAodmFsdWUsIHBvc2l0aW9uKSBpbiBlbnVtZXJhdGUob2NjdXJyZW5jZXMpOg0KICAgICAgICAgICAgICAgIG9jY3VycmVuY2VzW2tdID0gX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQodmFsdWUsIHBvc2l0aW9uICsgKHBvc2l0aW9uID4gaW5kZXgpKQ0KDQogICAgZGVmIGFwcGVuZCggc2VsZiwgaXRlbSApOg0KICAgICAgICAiIiINCiAgICAgICAgQWRkIHNpbmdsZSBlbGVtZW50IHRvIGVuZCBvZiBQYXJzZVJlc3VsdHMgbGlzdCBvZiBlbGVtZW50cy4NCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIHByaW50KE9uZU9yTW9yZShXb3JkKG51bXMpKS5wYXJzZVN0cmluZygiMCAxMjMgMzIxIikpICMgLT4gWycwJywgJzEyMycsICczMjEnXQ0KICAgICAgICAgICAgDQogICAgICAgICAgICAjIHVzZSBhIHBhcnNlIGFjdGlvbiB0byBjb21wdXRlIHRoZSBzdW0gb2YgdGhlIHBhcnNlZCBpbnRlZ2VycywgYW5kIGFkZCBpdCB0byB0aGUgZW5kDQogICAgICAgICAgICBkZWYgYXBwZW5kX3N1bSh0b2tlbnMpOg0KICAgICAgICAgICAgICAgIHRva2Vucy5hcHBlbmQoc3VtKG1hcChpbnQsIHRva2VucykpKQ0KICAgICAgICAgICAgcHJpbnQoT25lT3JNb3JlKFdvcmQobnVtcykpLmFkZFBhcnNlQWN0aW9uKGFwcGVuZF9zdW0pLnBhcnNlU3RyaW5nKCIwIDEyMyAzMjEiKSkgIyAtPiBbJzAnLCAnMTIzJywgJzMyMScsIDQ0NF0NCiAgICAgICAgIiIiDQogICAgICAgIHNlbGYuX190b2tsaXN0LmFwcGVuZChpdGVtKQ0KDQogICAgZGVmIGV4dGVuZCggc2VsZiwgaXRlbXNlcSApOg0KICAgICAgICAiIiINCiAgICAgICAgQWRkIHNlcXVlbmNlIG9mIGVsZW1lbnRzIHRvIGVuZCBvZiBQYXJzZVJlc3VsdHMgbGlzdCBvZiBlbGVtZW50cy4NCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIHBhdHQgPSBPbmVPck1vcmUoV29yZChhbHBoYXMpKQ0KICAgICAgICAgICAgDQogICAgICAgICAgICAjIHVzZSBhIHBhcnNlIGFjdGlvbiB0byBhcHBlbmQgdGhlIHJldmVyc2Ugb2YgdGhlIG1hdGNoZWQgc3RyaW5ncywgdG8gbWFrZSBhIHBhbGluZHJvbWUNCiAgICAgICAgICAgIGRlZiBtYWtlX3BhbGluZHJvbWUodG9rZW5zKToNCiAgICAgICAgICAgICAgICB0b2tlbnMuZXh0ZW5kKHJldmVyc2VkKFt0Wzo6LTFdIGZvciB0IGluIHRva2Vuc10pKQ0KICAgICAgICAgICAgICAgIHJldHVybiAnJy5qb2luKHRva2VucykNCiAgICAgICAgICAgIHByaW50KHBhdHQuYWRkUGFyc2VBY3Rpb24obWFrZV9wYWxpbmRyb21lKS5wYXJzZVN0cmluZygibHNrZGogc2Rsa2pmIGxrc2QiKSkgIyAtPiAnbHNrZGpzZGxramZsa3NkZHNrbGZqa2xkc2pka3NsJw0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZShpdGVtc2VxLCBQYXJzZVJlc3VsdHMpOg0KICAgICAgICAgICAgc2VsZiArPSBpdGVtc2VxDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLl9fdG9rbGlzdC5leHRlbmQoaXRlbXNlcSkNCg0KICAgIGRlZiBjbGVhciggc2VsZiApOg0KICAgICAgICAiIiINCiAgICAgICAgQ2xlYXIgYWxsIGVsZW1lbnRzIGFuZCByZXN1bHRzIG5hbWVzLg0KICAgICAgICAiIiINCiAgICAgICAgZGVsIHNlbGYuX190b2tsaXN0WzpdDQogICAgICAgIHNlbGYuX190b2tkaWN0LmNsZWFyKCkNCg0KICAgIGRlZiBfX2dldGF0dHJfXyggc2VsZiwgbmFtZSApOg0KICAgICAgICB0cnk6DQogICAgICAgICAgICByZXR1cm4gc2VsZltuYW1lXQ0KICAgICAgICBleGNlcHQgS2V5RXJyb3I6DQogICAgICAgICAgICByZXR1cm4gIiINCiAgICAgICAgICAgIA0KICAgICAgICBpZiBuYW1lIGluIHNlbGYuX190b2tkaWN0Og0KICAgICAgICAgICAgaWYgbmFtZSBub3QgaW4gc2VsZi5fX2FjY3VtTmFtZXM6DQogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX190b2tkaWN0W25hbWVdWy0xXVswXQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByZXR1cm4gUGFyc2VSZXN1bHRzKFsgdlswXSBmb3IgdiBpbiBzZWxmLl9fdG9rZGljdFtuYW1lXSBdKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmV0dXJuICIiDQoNCiAgICBkZWYgX19hZGRfXyggc2VsZiwgb3RoZXIgKToNCiAgICAgICAgcmV0ID0gc2VsZi5jb3B5KCkNCiAgICAgICAgcmV0ICs9IG90aGVyDQogICAgICAgIHJldHVybiByZXQNCg0KICAgIGRlZiBfX2lhZGRfXyggc2VsZiwgb3RoZXIgKToNCiAgICAgICAgaWYgb3RoZXIuX190b2tkaWN0Og0KICAgICAgICAgICAgb2Zmc2V0ID0gbGVuKHNlbGYuX190b2tsaXN0KQ0KICAgICAgICAgICAgYWRkb2Zmc2V0ID0gbGFtYmRhIGE6IG9mZnNldCBpZiBhPDAgZWxzZSBhK29mZnNldA0KICAgICAgICAgICAgb3RoZXJpdGVtcyA9IG90aGVyLl9fdG9rZGljdC5pdGVtcygpDQogICAgICAgICAgICBvdGhlcmRpY3RpdGVtcyA9IFsoaywgX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQodlswXSxhZGRvZmZzZXQodlsxXSkpICkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrLHZsaXN0KSBpbiBvdGhlcml0ZW1zIGZvciB2IGluIHZsaXN0XQ0KICAgICAgICAgICAgZm9yIGssdiBpbiBvdGhlcmRpY3RpdGVtczoNCiAgICAgICAgICAgICAgICBzZWxmW2tdID0gdg0KICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodlswXSxQYXJzZVJlc3VsdHMpOg0KICAgICAgICAgICAgICAgICAgICB2WzBdLl9fcGFyZW50ID0gd2tyZWYoc2VsZikNCiAgICAgICAgICAgIA0KICAgICAgICBzZWxmLl9fdG9rbGlzdCArPSBvdGhlci5fX3Rva2xpc3QNCiAgICAgICAgc2VsZi5fX2FjY3VtTmFtZXMudXBkYXRlKCBvdGhlci5fX2FjY3VtTmFtZXMgKQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIF9fcmFkZF9fKHNlbGYsIG90aGVyKToNCiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlcixpbnQpIGFuZCBvdGhlciA9PSAwOg0KICAgICAgICAgICAgIyB1c2VmdWwgZm9yIG1lcmdpbmcgbWFueSBQYXJzZVJlc3VsdHMgdXNpbmcgc3VtKCkgYnVpbHRpbg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29weSgpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICAjIHRoaXMgbWF5IHJhaXNlIGEgVHlwZUVycm9yIC0gc28gYmUgaXQNCiAgICAgICAgICAgIHJldHVybiBvdGhlciArIHNlbGYNCiAgICAgICAgDQogICAgZGVmIF9fcmVwcl9fKCBzZWxmICk6DQogICAgICAgIHJldHVybiAiKCVzLCAlcykiICUgKCByZXByKCBzZWxmLl9fdG9rbGlzdCApLCByZXByKCBzZWxmLl9fdG9rZGljdCApICkNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIHJldHVybiAnWycgKyAnLCAnLmpvaW4oX3VzdHIoaSkgaWYgaXNpbnN0YW5jZShpLCBQYXJzZVJlc3VsdHMpIGVsc2UgcmVwcihpKSBmb3IgaSBpbiBzZWxmLl9fdG9rbGlzdCkgKyAnXScNCg0KICAgIGRlZiBfYXNTdHJpbmdMaXN0KCBzZWxmLCBzZXA9JycgKToNCiAgICAgICAgb3V0ID0gW10NCiAgICAgICAgZm9yIGl0ZW0gaW4gc2VsZi5fX3Rva2xpc3Q6DQogICAgICAgICAgICBpZiBvdXQgYW5kIHNlcDoNCiAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKHNlcCkNCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoIGl0ZW0sIFBhcnNlUmVzdWx0cyApOg0KICAgICAgICAgICAgICAgIG91dCArPSBpdGVtLl9hc1N0cmluZ0xpc3QoKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCBfdXN0cihpdGVtKSApDQogICAgICAgIHJldHVybiBvdXQNCg0KICAgIGRlZiBhc0xpc3QoIHNlbGYgKToNCiAgICAgICAgIiIiDQogICAgICAgIFJldHVybnMgdGhlIHBhcnNlIHJlc3VsdHMgYXMgYSBuZXN0ZWQgbGlzdCBvZiBtYXRjaGluZyB0b2tlbnMsIGFsbCBjb252ZXJ0ZWQgdG8gc3RyaW5ncy4NCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIHBhdHQgPSBPbmVPck1vcmUoV29yZChhbHBoYXMpKQ0KICAgICAgICAgICAgcmVzdWx0ID0gcGF0dC5wYXJzZVN0cmluZygic2xka2ogbHNka2ogc2xka2oiKQ0KICAgICAgICAgICAgIyBldmVuIHRob3VnaCB0aGUgcmVzdWx0IHByaW50cyBpbiBzdHJpbmctbGlrZSBmb3JtLCBpdCBpcyBhY3R1YWxseSBhIHB5cGFyc2luZyBQYXJzZVJlc3VsdHMNCiAgICAgICAgICAgIHByaW50KHR5cGUocmVzdWx0KSwgcmVzdWx0KSAjIC0+IDxjbGFzcyAncHlwYXJzaW5nLlBhcnNlUmVzdWx0cyc+IFsnc2xka2onLCAnbHNka2onLCAnc2xka2onXQ0KICAgICAgICAgICAgDQogICAgICAgICAgICAjIFVzZSBhc0xpc3QoKSB0byBjcmVhdGUgYW4gYWN0dWFsIGxpc3QNCiAgICAgICAgICAgIHJlc3VsdF9saXN0ID0gcmVzdWx0LmFzTGlzdCgpDQogICAgICAgICAgICBwcmludCh0eXBlKHJlc3VsdF9saXN0KSwgcmVzdWx0X2xpc3QpICMgLT4gPGNsYXNzICdsaXN0Jz4gWydzbGRraicsICdsc2RraicsICdzbGRraiddDQogICAgICAgICIiIg0KICAgICAgICByZXR1cm4gW3Jlcy5hc0xpc3QoKSBpZiBpc2luc3RhbmNlKHJlcyxQYXJzZVJlc3VsdHMpIGVsc2UgcmVzIGZvciByZXMgaW4gc2VsZi5fX3Rva2xpc3RdDQoNCiAgICBkZWYgYXNEaWN0KCBzZWxmICk6DQogICAgICAgICIiIg0KICAgICAgICBSZXR1cm5zIHRoZSBuYW1lZCBwYXJzZSByZXN1bHRzIGFzIGEgbmVzdGVkIGRpY3Rpb25hcnkuDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQ0KICAgICAgICAgICAgZGF0ZV9zdHIgPSBpbnRlZ2VyKCJ5ZWFyIikgKyAnLycgKyBpbnRlZ2VyKCJtb250aCIpICsgJy8nICsgaW50ZWdlcigiZGF5IikNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgcmVzdWx0ID0gZGF0ZV9zdHIucGFyc2VTdHJpbmcoJzEyLzMxLzE5OTknKQ0KICAgICAgICAgICAgcHJpbnQodHlwZShyZXN1bHQpLCByZXByKHJlc3VsdCkpICMgLT4gPGNsYXNzICdweXBhcnNpbmcuUGFyc2VSZXN1bHRzJz4gKFsnMTInLCAnLycsICczMScsICcvJywgJzE5OTknXSwgeydkYXknOiBbKCcxOTk5JywgNCldLCAneWVhcic6IFsoJzEyJywgMCldLCAnbW9udGgnOiBbKCczMScsIDIpXX0pDQogICAgICAgICAgICANCiAgICAgICAgICAgIHJlc3VsdF9kaWN0ID0gcmVzdWx0LmFzRGljdCgpDQogICAgICAgICAgICBwcmludCh0eXBlKHJlc3VsdF9kaWN0KSwgcmVwcihyZXN1bHRfZGljdCkpICMgLT4gPGNsYXNzICdkaWN0Jz4geydkYXknOiAnMTk5OScsICd5ZWFyJzogJzEyJywgJ21vbnRoJzogJzMxJ30NCg0KICAgICAgICAgICAgIyBldmVuIHRob3VnaCBhIFBhcnNlUmVzdWx0cyBzdXBwb3J0cyBkaWN0LWxpa2UgYWNjZXNzLCBzb21ldGltZSB5b3UganVzdCBuZWVkIHRvIGhhdmUgYSBkaWN0DQogICAgICAgICAgICBpbXBvcnQganNvbg0KICAgICAgICAgICAgcHJpbnQoanNvbi5kdW1wcyhyZXN1bHQpKSAjIC0+IEV4Y2VwdGlvbjogVHlwZUVycm9yOiAuLi4gaXMgbm90IEpTT04gc2VyaWFsaXphYmxlDQogICAgICAgICAgICBwcmludChqc29uLmR1bXBzKHJlc3VsdC5hc0RpY3QoKSkpICMgLT4geyJtb250aCI6ICIzMSIsICJkYXkiOiAiMTk5OSIsICJ5ZWFyIjogIjEyIn0NCiAgICAgICAgIiIiDQogICAgICAgIGlmIFBZXzM6DQogICAgICAgICAgICBpdGVtX2ZuID0gc2VsZi5pdGVtcw0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgaXRlbV9mbiA9IHNlbGYuaXRlcml0ZW1zDQogICAgICAgICAgICANCiAgICAgICAgZGVmIHRvSXRlbShvYmopOg0KICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShvYmosIFBhcnNlUmVzdWx0cyk6DQogICAgICAgICAgICAgICAgaWYgb2JqLmhhc2tleXMoKToNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iai5hc0RpY3QoKQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBbdG9JdGVtKHYpIGZvciB2IGluIG9ial0NCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmV0dXJuIG9iag0KICAgICAgICAgICAgICAgIA0KICAgICAgICByZXR1cm4gZGljdCgoayx0b0l0ZW0odikpIGZvciBrLHYgaW4gaXRlbV9mbigpKQ0KDQogICAgZGVmIGNvcHkoIHNlbGYgKToNCiAgICAgICAgIiIiDQogICAgICAgIFJldHVybnMgYSBuZXcgY29weSBvZiBhIEN7UGFyc2VSZXN1bHRzfSBvYmplY3QuDQogICAgICAgICIiIg0KICAgICAgICByZXQgPSBQYXJzZVJlc3VsdHMoIHNlbGYuX190b2tsaXN0ICkNCiAgICAgICAgcmV0Ll9fdG9rZGljdCA9IHNlbGYuX190b2tkaWN0LmNvcHkoKQ0KICAgICAgICByZXQuX19wYXJlbnQgPSBzZWxmLl9fcGFyZW50DQogICAgICAgIHJldC5fX2FjY3VtTmFtZXMudXBkYXRlKCBzZWxmLl9fYWNjdW1OYW1lcyApDQogICAgICAgIHJldC5fX25hbWUgPSBzZWxmLl9fbmFtZQ0KICAgICAgICByZXR1cm4gcmV0DQoNCiAgICBkZWYgYXNYTUwoIHNlbGYsIGRvY3RhZz1Ob25lLCBuYW1lZEl0ZW1zT25seT1GYWxzZSwgaW5kZW50PSIiLCBmb3JtYXR0ZWQ9VHJ1ZSApOg0KICAgICAgICAiIiINCiAgICAgICAgKERlcHJlY2F0ZWQpIFJldHVybnMgdGhlIHBhcnNlIHJlc3VsdHMgYXMgWE1MLiBUYWdzIGFyZSBjcmVhdGVkIGZvciB0b2tlbnMgYW5kIGxpc3RzIHRoYXQgaGF2ZSBkZWZpbmVkIHJlc3VsdHMgbmFtZXMuDQogICAgICAgICIiIg0KICAgICAgICBubCA9ICJcbiINCiAgICAgICAgb3V0ID0gW10NCiAgICAgICAgbmFtZWRJdGVtcyA9IGRpY3QoKHZbMV0saykgZm9yIChrLHZsaXN0KSBpbiBzZWxmLl9fdG9rZGljdC5pdGVtcygpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdiBpbiB2bGlzdCkNCiAgICAgICAgbmV4dExldmVsSW5kZW50ID0gaW5kZW50ICsgIiAgIg0KDQogICAgICAgICMgY29sbGFwc2Ugb3V0IGluZGVudHMgaWYgZm9ybWF0dGluZyBpcyBub3QgZGVzaXJlZA0KICAgICAgICBpZiBub3QgZm9ybWF0dGVkOg0KICAgICAgICAgICAgaW5kZW50ID0gIiINCiAgICAgICAgICAgIG5leHRMZXZlbEluZGVudCA9ICIiDQogICAgICAgICAgICBubCA9ICIiDQoNCiAgICAgICAgc2VsZlRhZyA9IE5vbmUNCiAgICAgICAgaWYgZG9jdGFnIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgc2VsZlRhZyA9IGRvY3RhZw0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgaWYgc2VsZi5fX25hbWU6DQogICAgICAgICAgICAgICAgc2VsZlRhZyA9IHNlbGYuX19uYW1lDQoNCiAgICAgICAgaWYgbm90IHNlbGZUYWc6DQogICAgICAgICAgICBpZiBuYW1lZEl0ZW1zT25seToNCiAgICAgICAgICAgICAgICByZXR1cm4gIiINCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgc2VsZlRhZyA9ICJJVEVNIg0KDQogICAgICAgIG91dCArPSBbIG5sLCBpbmRlbnQsICI8Iiwgc2VsZlRhZywgIj4iIF0NCg0KICAgICAgICBmb3IgaSxyZXMgaW4gZW51bWVyYXRlKHNlbGYuX190b2tsaXN0KToNCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UocmVzLFBhcnNlUmVzdWx0cyk6DQogICAgICAgICAgICAgICAgaWYgaSBpbiBuYW1lZEl0ZW1zOg0KICAgICAgICAgICAgICAgICAgICBvdXQgKz0gWyByZXMuYXNYTUwobmFtZWRJdGVtc1tpXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lZEl0ZW1zT25seSBhbmQgZG9jdGFnIGlzIE5vbmUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dExldmVsSW5kZW50LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZCldDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgb3V0ICs9IFsgcmVzLmFzWE1MKE5vbmUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZWRJdGVtc09ubHkgYW5kIGRvY3RhZyBpcyBOb25lLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRMZXZlbEluZGVudCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWQpXQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAjIGluZGl2aWR1YWwgdG9rZW4sIHNlZSBpZiB0aGVyZSBpcyBhIG5hbWUgZm9yIGl0DQogICAgICAgICAgICAgICAgcmVzVGFnID0gTm9uZQ0KICAgICAgICAgICAgICAgIGlmIGkgaW4gbmFtZWRJdGVtczoNCiAgICAgICAgICAgICAgICAgICAgcmVzVGFnID0gbmFtZWRJdGVtc1tpXQ0KICAgICAgICAgICAgICAgIGlmIG5vdCByZXNUYWc6DQogICAgICAgICAgICAgICAgICAgIGlmIG5hbWVkSXRlbXNPbmx5Og0KICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUNCiAgICAgICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgICAgIHJlc1RhZyA9ICJJVEVNIg0KICAgICAgICAgICAgICAgIHhtbEJvZHlUZXh0ID0gX3htbF9lc2NhcGUoX3VzdHIocmVzKSkNCiAgICAgICAgICAgICAgICBvdXQgKz0gWyBubCwgbmV4dExldmVsSW5kZW50LCAiPCIsIHJlc1RhZywgIj4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sQm9keVRleHQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC8iLCByZXNUYWcsICI+IiBdDQoNCiAgICAgICAgb3V0ICs9IFsgbmwsIGluZGVudCwgIjwvIiwgc2VsZlRhZywgIj4iIF0NCiAgICAgICAgcmV0dXJuICIiLmpvaW4ob3V0KQ0KDQogICAgZGVmIF9fbG9va3VwKHNlbGYsc3ViKToNCiAgICAgICAgZm9yIGssdmxpc3QgaW4gc2VsZi5fX3Rva2RpY3QuaXRlbXMoKToNCiAgICAgICAgICAgIGZvciB2LGxvYyBpbiB2bGlzdDoNCiAgICAgICAgICAgICAgICBpZiBzdWIgaXMgdjoNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGsNCiAgICAgICAgcmV0dXJuIE5vbmUNCg0KICAgIGRlZiBnZXROYW1lKHNlbGYpOg0KICAgICAgICAiIiINCiAgICAgICAgUmV0dXJucyB0aGUgcmVzdWx0cyBuYW1lIGZvciB0aGlzIHRva2VuIGV4cHJlc3Npb24uIFVzZWZ1bCB3aGVuIHNldmVyYWwgDQogICAgICAgIGRpZmZlcmVudCBleHByZXNzaW9ucyBtaWdodCBtYXRjaCBhdCBhIHBhcnRpY3VsYXIgbG9jYXRpb24uDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQ0KICAgICAgICAgICAgc3NuX2V4cHIgPSBSZWdleChyIlxkXGRcZC1cZFxkLVxkXGRcZFxkIikNCiAgICAgICAgICAgIGhvdXNlX251bWJlcl9leHByID0gU3VwcHJlc3MoJyMnKSArIFdvcmQobnVtcywgYWxwaGFudW1zKQ0KICAgICAgICAgICAgdXNlcl9kYXRhID0gKEdyb3VwKGhvdXNlX251bWJlcl9leHByKSgiaG91c2VfbnVtYmVyIikgDQogICAgICAgICAgICAgICAgICAgICAgICB8IEdyb3VwKHNzbl9leHByKSgic3NuIikNCiAgICAgICAgICAgICAgICAgICAgICAgIHwgR3JvdXAoaW50ZWdlcikoImFnZSIpKQ0KICAgICAgICAgICAgdXNlcl9pbmZvID0gT25lT3JNb3JlKHVzZXJfZGF0YSkNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgcmVzdWx0ID0gdXNlcl9pbmZvLnBhcnNlU3RyaW5nKCIyMiAxMTEtMjItMzMzMyAjMjIxQiIpDQogICAgICAgICAgICBmb3IgaXRlbSBpbiByZXN1bHQ6DQogICAgICAgICAgICAgICAgcHJpbnQoaXRlbS5nZXROYW1lKCksICc6JywgaXRlbVswXSkNCiAgICAgICAgcHJpbnRzOjoNCiAgICAgICAgICAgIGFnZSA6IDIyDQogICAgICAgICAgICBzc24gOiAxMTEtMjItMzMzMw0KICAgICAgICAgICAgaG91c2VfbnVtYmVyIDogMjIxQg0KICAgICAgICAiIiINCiAgICAgICAgaWYgc2VsZi5fX25hbWU6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5fX25hbWUNCiAgICAgICAgZWxpZiBzZWxmLl9fcGFyZW50Og0KICAgICAgICAgICAgcGFyID0gc2VsZi5fX3BhcmVudCgpDQogICAgICAgICAgICBpZiBwYXI6DQogICAgICAgICAgICAgICAgcmV0dXJuIHBhci5fX2xvb2t1cChzZWxmKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQ0KICAgICAgICBlbGlmIChsZW4oc2VsZikgPT0gMSBhbmQNCiAgICAgICAgICAgICAgIGxlbihzZWxmLl9fdG9rZGljdCkgPT0gMSBhbmQNCiAgICAgICAgICAgICAgIG5leHQoaXRlcihzZWxmLl9fdG9rZGljdC52YWx1ZXMoKSkpWzBdWzFdIGluICgwLC0xKSk6DQogICAgICAgICAgICByZXR1cm4gbmV4dChpdGVyKHNlbGYuX190b2tkaWN0LmtleXMoKSkpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByZXR1cm4gTm9uZQ0KDQogICAgZGVmIGR1bXAoc2VsZiwgaW5kZW50PScnLCBkZXB0aD0wLCBmdWxsPVRydWUpOg0KICAgICAgICAiIiINCiAgICAgICAgRGlhZ25vc3RpYyBtZXRob2QgZm9yIGxpc3Rpbmcgb3V0IHRoZSBjb250ZW50cyBvZiBhIEN7UGFyc2VSZXN1bHRzfS4NCiAgICAgICAgQWNjZXB0cyBhbiBvcHRpb25hbCBDe2luZGVudH0gYXJndW1lbnQgc28gdGhhdCB0aGlzIHN0cmluZyBjYW4gYmUgZW1iZWRkZWQNCiAgICAgICAgaW4gYSBuZXN0ZWQgZGlzcGxheSBvZiBvdGhlciBkYXRhLg0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykNCiAgICAgICAgICAgIGRhdGVfc3RyID0gaW50ZWdlcigieWVhciIpICsgJy8nICsgaW50ZWdlcigibW9udGgiKSArICcvJyArIGludGVnZXIoImRheSIpDQogICAgICAgICAgICANCiAgICAgICAgICAgIHJlc3VsdCA9IGRhdGVfc3RyLnBhcnNlU3RyaW5nKCcxMi8zMS8xOTk5JykNCiAgICAgICAgICAgIHByaW50KHJlc3VsdC5kdW1wKCkpDQogICAgICAgIHByaW50czo6DQogICAgICAgICAgICBbJzEyJywgJy8nLCAnMzEnLCAnLycsICcxOTk5J10NCiAgICAgICAgICAgIC0gZGF5OiAxOTk5DQogICAgICAgICAgICAtIG1vbnRoOiAzMQ0KICAgICAgICAgICAgLSB5ZWFyOiAxMg0KICAgICAgICAiIiINCiAgICAgICAgb3V0ID0gW10NCiAgICAgICAgTkwgPSAnXG4nDQogICAgICAgIG91dC5hcHBlbmQoIGluZGVudCtfdXN0cihzZWxmLmFzTGlzdCgpKSApDQogICAgICAgIGlmIGZ1bGw6DQogICAgICAgICAgICBpZiBzZWxmLmhhc2tleXMoKToNCiAgICAgICAgICAgICAgICBpdGVtcyA9IHNvcnRlZCgoc3RyKGspLCB2KSBmb3Igayx2IGluIHNlbGYuaXRlbXMoKSkNCiAgICAgICAgICAgICAgICBmb3Igayx2IGluIGl0ZW1zOg0KICAgICAgICAgICAgICAgICAgICBpZiBvdXQ6DQogICAgICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKE5MKQ0KICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCAiJXMlcy0gJXM6ICIgJSAoaW5kZW50LCgnICAnKmRlcHRoKSwgaykgKQ0KICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHYsUGFyc2VSZXN1bHRzKToNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHY6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCggdi5kdW1wKGluZGVudCxkZXB0aCsxKSApDQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoX3VzdHIodikpDQogICAgICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKHJlcHIodikpDQogICAgICAgICAgICBlbGlmIGFueShpc2luc3RhbmNlKHZ2LFBhcnNlUmVzdWx0cykgZm9yIHZ2IGluIHNlbGYpOg0KICAgICAgICAgICAgICAgIHYgPSBzZWxmDQogICAgICAgICAgICAgICAgZm9yIGksdnYgaW4gZW51bWVyYXRlKHYpOg0KICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZ2LFBhcnNlUmVzdWx0cyk6DQogICAgICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCJcbiVzJXNbJWRdOlxuJXMlcyVzIiAlIChpbmRlbnQsKCcgICcqKGRlcHRoKSksaSxpbmRlbnQsKCcgICcqKGRlcHRoKzEpKSx2di5kdW1wKGluZGVudCxkZXB0aCsxKSApKQ0KICAgICAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgiXG4lcyVzWyVkXTpcbiVzJXMlcyIgJSAoaW5kZW50LCgnICAnKihkZXB0aCkpLGksaW5kZW50LCgnICAnKihkZXB0aCsxKSksX3VzdHIodnYpKSkNCiAgICAgICAgICAgIA0KICAgICAgICByZXR1cm4gIiIuam9pbihvdXQpDQoNCiAgICBkZWYgcHByaW50KHNlbGYsICphcmdzLCAqKmt3YXJncyk6DQogICAgICAgICIiIg0KICAgICAgICBQcmV0dHktcHJpbnRlciBmb3IgcGFyc2VkIHJlc3VsdHMgYXMgYSBsaXN0LCB1c2luZyB0aGUgQ3twcHJpbnR9IG1vZHVsZS4NCiAgICAgICAgQWNjZXB0cyBhZGRpdGlvbmFsIHBvc2l0aW9uYWwgb3Iga2V5d29yZCBhcmdzIGFzIGRlZmluZWQgZm9yIHRoZSANCiAgICAgICAgQ3twcHJpbnQucHByaW50fSBtZXRob2QuIChVe2h0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvMy9saWJyYXJ5L3BwcmludC5odG1sI3BwcmludC5wcHJpbnR9KQ0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgaWRlbnQgPSBXb3JkKGFscGhhcywgYWxwaGFudW1zKQ0KICAgICAgICAgICAgbnVtID0gV29yZChudW1zKQ0KICAgICAgICAgICAgZnVuYyA9IEZvcndhcmQoKQ0KICAgICAgICAgICAgdGVybSA9IGlkZW50IHwgbnVtIHwgR3JvdXAoJygnICsgZnVuYyArICcpJykNCiAgICAgICAgICAgIGZ1bmMgPDw9IGlkZW50ICsgR3JvdXAoT3B0aW9uYWwoZGVsaW1pdGVkTGlzdCh0ZXJtKSkpDQogICAgICAgICAgICByZXN1bHQgPSBmdW5jLnBhcnNlU3RyaW5nKCJmbmEgYSxiLChmbmIgYyxkLDIwMCksMTAwIikNCiAgICAgICAgICAgIHJlc3VsdC5wcHJpbnQod2lkdGg9NDApDQogICAgICAgIHByaW50czo6DQogICAgICAgICAgICBbJ2ZuYScsDQogICAgICAgICAgICAgWydhJywNCiAgICAgICAgICAgICAgJ2InLA0KICAgICAgICAgICAgICBbJygnLCAnZm5iJywgWydjJywgJ2QnLCAnMjAwJ10sICcpJ10sDQogICAgICAgICAgICAgICcxMDAnXV0NCiAgICAgICAgIiIiDQogICAgICAgIHBwcmludC5wcHJpbnQoc2VsZi5hc0xpc3QoKSwgKmFyZ3MsICoqa3dhcmdzKQ0KDQogICAgIyBhZGQgc3VwcG9ydCBmb3IgcGlja2xlIHByb3RvY29sDQogICAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToNCiAgICAgICAgcmV0dXJuICggc2VsZi5fX3Rva2xpc3QsDQogICAgICAgICAgICAgICAgICggc2VsZi5fX3Rva2RpY3QuY29weSgpLA0KICAgICAgICAgICAgICAgICAgIHNlbGYuX19wYXJlbnQgaXMgbm90IE5vbmUgYW5kIHNlbGYuX19wYXJlbnQoKSBvciBOb25lLA0KICAgICAgICAgICAgICAgICAgIHNlbGYuX19hY2N1bU5hbWVzLA0KICAgICAgICAgICAgICAgICAgIHNlbGYuX19uYW1lICkgKQ0KDQogICAgZGVmIF9fc2V0c3RhdGVfXyhzZWxmLHN0YXRlKToNCiAgICAgICAgc2VsZi5fX3Rva2xpc3QgPSBzdGF0ZVswXQ0KICAgICAgICAoc2VsZi5fX3Rva2RpY3QsDQogICAgICAgICBwYXIsDQogICAgICAgICBpbkFjY3VtTmFtZXMsDQogICAgICAgICBzZWxmLl9fbmFtZSkgPSBzdGF0ZVsxXQ0KICAgICAgICBzZWxmLl9fYWNjdW1OYW1lcyA9IHt9DQogICAgICAgIHNlbGYuX19hY2N1bU5hbWVzLnVwZGF0ZShpbkFjY3VtTmFtZXMpDQogICAgICAgIGlmIHBhciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgIHNlbGYuX19wYXJlbnQgPSB3a3JlZihwYXIpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLl9fcGFyZW50ID0gTm9uZQ0KDQogICAgZGVmIF9fZ2V0bmV3YXJnc19fKHNlbGYpOg0KICAgICAgICByZXR1cm4gc2VsZi5fX3Rva2xpc3QsIHNlbGYuX19uYW1lLCBzZWxmLl9fYXNMaXN0LCBzZWxmLl9fbW9kYWwNCg0KICAgIGRlZiBfX2Rpcl9fKHNlbGYpOg0KICAgICAgICByZXR1cm4gKGRpcih0eXBlKHNlbGYpKSArIGxpc3Qoc2VsZi5rZXlzKCkpKQ0KDQpjb2xsZWN0aW9ucy5NdXRhYmxlTWFwcGluZy5yZWdpc3RlcihQYXJzZVJlc3VsdHMpDQoNCmRlZiBjb2wgKGxvYyxzdHJnKToNCiAgICAiIiJSZXR1cm5zIGN1cnJlbnQgY29sdW1uIHdpdGhpbiBhIHN0cmluZywgY291bnRpbmcgbmV3bGluZXMgYXMgbGluZSBzZXBhcmF0b3JzLg0KICAgVGhlIGZpcnN0IGNvbHVtbiBpcyBudW1iZXIgMS4NCg0KICAgTm90ZTogdGhlIGRlZmF1bHQgcGFyc2luZyBiZWhhdmlvciBpcyB0byBleHBhbmQgdGFicyBpbiB0aGUgaW5wdXQgc3RyaW5nDQogICBiZWZvcmUgc3RhcnRpbmcgdGhlIHBhcnNpbmcgcHJvY2Vzcy4gIFNlZSBMe0l7UGFyc2VyRWxlbWVudC5wYXJzZVN0cmluZ308UGFyc2VyRWxlbWVudC5wYXJzZVN0cmluZz59IGZvciBtb3JlIGluZm9ybWF0aW9uDQogICBvbiBwYXJzaW5nIHN0cmluZ3MgY29udGFpbmluZyBDezxUQUI+fXMsIGFuZCBzdWdnZXN0ZWQgbWV0aG9kcyB0byBtYWludGFpbiBhDQogICBjb25zaXN0ZW50IHZpZXcgb2YgdGhlIHBhcnNlZCBzdHJpbmcsIHRoZSBwYXJzZSBsb2NhdGlvbiwgYW5kIGxpbmUgYW5kIGNvbHVtbg0KICAgcG9zaXRpb25zIHdpdGhpbiB0aGUgcGFyc2VkIHN0cmluZy4NCiAgICIiIg0KICAgIHMgPSBzdHJnDQogICAgcmV0dXJuIDEgaWYgMDxsb2M8bGVuKHMpIGFuZCBzW2xvYy0xXSA9PSAnXG4nIGVsc2UgbG9jIC0gcy5yZmluZCgiXG4iLCAwLCBsb2MpDQoNCmRlZiBsaW5lbm8obG9jLHN0cmcpOg0KICAgICIiIlJldHVybnMgY3VycmVudCBsaW5lIG51bWJlciB3aXRoaW4gYSBzdHJpbmcsIGNvdW50aW5nIG5ld2xpbmVzIGFzIGxpbmUgc2VwYXJhdG9ycy4NCiAgIFRoZSBmaXJzdCBsaW5lIGlzIG51bWJlciAxLg0KDQogICBOb3RlOiB0aGUgZGVmYXVsdCBwYXJzaW5nIGJlaGF2aW9yIGlzIHRvIGV4cGFuZCB0YWJzIGluIHRoZSBpbnB1dCBzdHJpbmcNCiAgIGJlZm9yZSBzdGFydGluZyB0aGUgcGFyc2luZyBwcm9jZXNzLiAgU2VlIEx7SXtQYXJzZXJFbGVtZW50LnBhcnNlU3RyaW5nfTxQYXJzZXJFbGVtZW50LnBhcnNlU3RyaW5nPn0gZm9yIG1vcmUgaW5mb3JtYXRpb24NCiAgIG9uIHBhcnNpbmcgc3RyaW5ncyBjb250YWluaW5nIEN7PFRBQj59cywgYW5kIHN1Z2dlc3RlZCBtZXRob2RzIHRvIG1haW50YWluIGENCiAgIGNvbnNpc3RlbnQgdmlldyBvZiB0aGUgcGFyc2VkIHN0cmluZywgdGhlIHBhcnNlIGxvY2F0aW9uLCBhbmQgbGluZSBhbmQgY29sdW1uDQogICBwb3NpdGlvbnMgd2l0aGluIHRoZSBwYXJzZWQgc3RyaW5nLg0KICAgIiIiDQogICAgcmV0dXJuIHN0cmcuY291bnQoIlxuIiwwLGxvYykgKyAxDQoNCmRlZiBsaW5lKCBsb2MsIHN0cmcgKToNCiAgICAiIiJSZXR1cm5zIHRoZSBsaW5lIG9mIHRleHQgY29udGFpbmluZyBsb2Mgd2l0aGluIGEgc3RyaW5nLCBjb3VudGluZyBuZXdsaW5lcyBhcyBsaW5lIHNlcGFyYXRvcnMuDQogICAgICAgIiIiDQogICAgbGFzdENSID0gc3RyZy5yZmluZCgiXG4iLCAwLCBsb2MpDQogICAgbmV4dENSID0gc3RyZy5maW5kKCJcbiIsIGxvYykNCiAgICBpZiBuZXh0Q1IgPj0gMDoNCiAgICAgICAgcmV0dXJuIHN0cmdbbGFzdENSKzE6bmV4dENSXQ0KICAgIGVsc2U6DQogICAgICAgIHJldHVybiBzdHJnW2xhc3RDUisxOl0NCg0KZGVmIF9kZWZhdWx0U3RhcnREZWJ1Z0FjdGlvbiggaW5zdHJpbmcsIGxvYywgZXhwciApOg0KICAgIHByaW50ICgoIk1hdGNoICIgKyBfdXN0cihleHByKSArICIgYXQgbG9jICIgKyBfdXN0cihsb2MpICsgIiglZCwlZCkiICUgKCBsaW5lbm8obG9jLGluc3RyaW5nKSwgY29sKGxvYyxpbnN0cmluZykgKSkpDQoNCmRlZiBfZGVmYXVsdFN1Y2Nlc3NEZWJ1Z0FjdGlvbiggaW5zdHJpbmcsIHN0YXJ0bG9jLCBlbmRsb2MsIGV4cHIsIHRva3MgKToNCiAgICBwcmludCAoIk1hdGNoZWQgIiArIF91c3RyKGV4cHIpICsgIiAtPiAiICsgc3RyKHRva3MuYXNMaXN0KCkpKQ0KDQpkZWYgX2RlZmF1bHRFeGNlcHRpb25EZWJ1Z0FjdGlvbiggaW5zdHJpbmcsIGxvYywgZXhwciwgZXhjICk6DQogICAgcHJpbnQgKCJFeGNlcHRpb24gcmFpc2VkOiIgKyBfdXN0cihleGMpKQ0KDQpkZWYgbnVsbERlYnVnQWN0aW9uKCphcmdzKToNCiAgICAiIiInRG8tbm90aGluZycgZGVidWcgYWN0aW9uLCB0byBzdXBwcmVzcyBkZWJ1Z2dpbmcgb3V0cHV0IGR1cmluZyBwYXJzaW5nLiIiIg0KICAgIHBhc3MNCg0KIyBPbmx5IHdvcmtzIG9uIFB5dGhvbiAzLnggLSBub25sb2NhbCBpcyB0b3hpYyB0byBQeXRob24gMiBpbnN0YWxscw0KI34gJ2RlY29yYXRvciB0byB0cmltIGZ1bmN0aW9uIGNhbGxzIHRvIG1hdGNoIHRoZSBhcml0eSBvZiB0aGUgdGFyZ2V0Jw0KI34gZGVmIF90cmltX2FyaXR5KGZ1bmMsIG1heGFyZ3M9Myk6DQogICAgI34gaWYgZnVuYyBpbiBzaW5nbGVBcmdCdWlsdGluczoNCiAgICAgICAgI34gcmV0dXJuIGxhbWJkYSBzLGwsdDogZnVuYyh0KQ0KICAgICN+IGxpbWl0ID0gMA0KICAgICN+IGZvdW5kQXJpdHkgPSBGYWxzZQ0KICAgICN+IGRlZiB3cmFwcGVyKCphcmdzKToNCiAgICAgICAgI34gbm9ubG9jYWwgbGltaXQsZm91bmRBcml0eQ0KICAgICAgICAjfiB3aGlsZSAxOg0KICAgICAgICAgICAgI34gdHJ5Og0KICAgICAgICAgICAgICAgICN+IHJldCA9IGZ1bmMoKmFyZ3NbbGltaXQ6XSkNCiAgICAgICAgICAgICAgICAjfiBmb3VuZEFyaXR5ID0gVHJ1ZQ0KICAgICAgICAgICAgICAgICN+IHJldHVybiByZXQNCiAgICAgICAgICAgICN+IGV4Y2VwdCBUeXBlRXJyb3I6DQogICAgICAgICAgICAgICAgI34gaWYgbGltaXQgPT0gbWF4YXJncyBvciBmb3VuZEFyaXR5Og0KICAgICAgICAgICAgICAgICAgICAjfiByYWlzZQ0KICAgICAgICAgICAgICAgICN+IGxpbWl0ICs9IDENCiAgICAgICAgICAgICAgICAjfiBjb250aW51ZQ0KICAgICN+IHJldHVybiB3cmFwcGVyDQoNCiMgdGhpcyB2ZXJzaW9uIGlzIFB5dGhvbiAyLngtMy54IGNyb3NzLWNvbXBhdGlibGUNCidkZWNvcmF0b3IgdG8gdHJpbSBmdW5jdGlvbiBjYWxscyB0byBtYXRjaCB0aGUgYXJpdHkgb2YgdGhlIHRhcmdldCcNCmRlZiBfdHJpbV9hcml0eShmdW5jLCBtYXhhcmdzPTIpOg0KICAgIGlmIGZ1bmMgaW4gc2luZ2xlQXJnQnVpbHRpbnM6DQogICAgICAgIHJldHVybiBsYW1iZGEgcyxsLHQ6IGZ1bmModCkNCiAgICBsaW1pdCA9IFswXQ0KICAgIGZvdW5kQXJpdHkgPSBbRmFsc2VdDQogICAgDQogICAgIyB0cmFjZWJhY2sgcmV0dXJuIGRhdGEgc3RydWN0dXJlIGNoYW5nZWQgaW4gUHkzLjUgLSBub3JtYWxpemUgYmFjayB0byBwbGFpbiB0dXBsZXMNCiAgICBpZiBzeXN0ZW1fdmVyc2lvbls6Ml0gPj0gKDMsNSk6DQogICAgICAgIGRlZiBleHRyYWN0X3N0YWNrKGxpbWl0PTApOg0KICAgICAgICAgICAgIyBzcGVjaWFsIGhhbmRsaW5nIGZvciBQeXRob24gMy41LjAgLSBleHRyYSBkZWVwIGNhbGwgc3RhY2sgYnkgMQ0KICAgICAgICAgICAgb2Zmc2V0ID0gLTMgaWYgc3lzdGVtX3ZlcnNpb24gPT0gKDMsNSwwKSBlbHNlIC0yDQogICAgICAgICAgICBmcmFtZV9zdW1tYXJ5ID0gdHJhY2ViYWNrLmV4dHJhY3Rfc3RhY2sobGltaXQ9LW9mZnNldCtsaW1pdC0xKVtvZmZzZXRdDQogICAgICAgICAgICByZXR1cm4gWyhmcmFtZV9zdW1tYXJ5LmZpbGVuYW1lLCBmcmFtZV9zdW1tYXJ5LmxpbmVubyldDQogICAgICAgIGRlZiBleHRyYWN0X3RiKHRiLCBsaW1pdD0wKToNCiAgICAgICAgICAgIGZyYW1lcyA9IHRyYWNlYmFjay5leHRyYWN0X3RiKHRiLCBsaW1pdD1saW1pdCkNCiAgICAgICAgICAgIGZyYW1lX3N1bW1hcnkgPSBmcmFtZXNbLTFdDQogICAgICAgICAgICByZXR1cm4gWyhmcmFtZV9zdW1tYXJ5LmZpbGVuYW1lLCBmcmFtZV9zdW1tYXJ5LmxpbmVubyldDQogICAgZWxzZToNCiAgICAgICAgZXh0cmFjdF9zdGFjayA9IHRyYWNlYmFjay5leHRyYWN0X3N0YWNrDQogICAgICAgIGV4dHJhY3RfdGIgPSB0cmFjZWJhY2suZXh0cmFjdF90Yg0KICAgIA0KICAgICMgc3ludGhlc2l6ZSB3aGF0IHdvdWxkIGJlIHJldHVybmVkIGJ5IHRyYWNlYmFjay5leHRyYWN0X3N0YWNrIGF0IHRoZSBjYWxsIHRvIA0KICAgICMgdXNlcidzIHBhcnNlIGFjdGlvbiAnZnVuYycsIHNvIHRoYXQgd2UgZG9uJ3QgaW5jdXIgY2FsbCBwZW5hbHR5IGF0IHBhcnNlIHRpbWUNCiAgICANCiAgICBMSU5FX0RJRkYgPSA2DQogICAgIyBJRiBBTlkgQ09ERSBDSEFOR0VTLCBFVkVOIEpVU1QgQ09NTUVOVFMgT1IgQkxBTksgTElORVMsIEJFVFdFRU4gVEhFIE5FWFQgTElORSBBTkQgDQogICAgIyBUSEUgQ0FMTCBUTyBGVU5DIElOU0lERSBXUkFQUEVSLCBMSU5FX0RJRkYgTVVTVCBCRSBNT0RJRklFRCEhISENCiAgICB0aGlzX2xpbmUgPSBleHRyYWN0X3N0YWNrKGxpbWl0PTIpWy0xXQ0KICAgIHBhX2NhbGxfbGluZV9zeW50aCA9ICh0aGlzX2xpbmVbMF0sIHRoaXNfbGluZVsxXStMSU5FX0RJRkYpDQoNCiAgICBkZWYgd3JhcHBlcigqYXJncyk6DQogICAgICAgIHdoaWxlIDE6DQogICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgcmV0ID0gZnVuYygqYXJnc1tsaW1pdFswXTpdKQ0KICAgICAgICAgICAgICAgIGZvdW5kQXJpdHlbMF0gPSBUcnVlDQogICAgICAgICAgICAgICAgcmV0dXJuIHJldA0KICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoNCiAgICAgICAgICAgICAgICAjIHJlLXJhaXNlIFR5cGVFcnJvcnMgaWYgdGhleSBkaWQgbm90IGNvbWUgZnJvbSBvdXIgYXJpdHkgdGVzdGluZw0KICAgICAgICAgICAgICAgIGlmIGZvdW5kQXJpdHlbMF06DQogICAgICAgICAgICAgICAgICAgIHJhaXNlDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICAgICAgdGIgPSBzeXMuZXhjX2luZm8oKVstMV0NCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBleHRyYWN0X3RiKHRiLCBsaW1pdD0yKVstMV1bOjJdID09IHBhX2NhbGxfbGluZV9zeW50aDoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZQ0KICAgICAgICAgICAgICAgICAgICBmaW5hbGx5Og0KICAgICAgICAgICAgICAgICAgICAgICAgZGVsIHRiDQoNCiAgICAgICAgICAgICAgICBpZiBsaW1pdFswXSA8PSBtYXhhcmdzOg0KICAgICAgICAgICAgICAgICAgICBsaW1pdFswXSArPSAxDQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlDQogICAgICAgICAgICAgICAgcmFpc2UNCg0KICAgICMgY29weSBmdW5jIG5hbWUgdG8gd3JhcHBlciBmb3Igc2Vuc2libGUgZGVidWcgb3V0cHV0DQogICAgZnVuY19uYW1lID0gIjxwYXJzZSBhY3Rpb24+Ig0KICAgIHRyeToNCiAgICAgICAgZnVuY19uYW1lID0gZ2V0YXR0cihmdW5jLCAnX19uYW1lX18nLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRhdHRyKGZ1bmMsICdfX2NsYXNzX18nKS5fX25hbWVfXykNCiAgICBleGNlcHQgRXhjZXB0aW9uOg0KICAgICAgICBmdW5jX25hbWUgPSBzdHIoZnVuYykNCiAgICB3cmFwcGVyLl9fbmFtZV9fID0gZnVuY19uYW1lDQoNCiAgICByZXR1cm4gd3JhcHBlcg0KDQpjbGFzcyBQYXJzZXJFbGVtZW50KG9iamVjdCk6DQogICAgIiIiQWJzdHJhY3QgYmFzZSBsZXZlbCBwYXJzZXIgZWxlbWVudCBjbGFzcy4iIiINCiAgICBERUZBVUxUX1dISVRFX0NIQVJTID0gIiBcblx0XHIiDQogICAgdmVyYm9zZV9zdGFja3RyYWNlID0gRmFsc2UNCg0KICAgIEBzdGF0aWNtZXRob2QNCiAgICBkZWYgc2V0RGVmYXVsdFdoaXRlc3BhY2VDaGFycyggY2hhcnMgKToNCiAgICAgICAgciIiIg0KICAgICAgICBPdmVycmlkZXMgdGhlIGRlZmF1bHQgd2hpdGVzcGFjZSBjaGFycw0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgIyBkZWZhdWx0IHdoaXRlc3BhY2UgY2hhcnMgYXJlIHNwYWNlLCA8VEFCPiBhbmQgbmV3bGluZQ0KICAgICAgICAgICAgT25lT3JNb3JlKFdvcmQoYWxwaGFzKSkucGFyc2VTdHJpbmcoImFiYyBkZWZcbmdoaSBqa2wiKSAgIyAtPiBbJ2FiYycsICdkZWYnLCAnZ2hpJywgJ2prbCddDQogICAgICAgICAgICANCiAgICAgICAgICAgICMgY2hhbmdlIHRvIGp1c3QgdHJlYXQgbmV3bGluZSBhcyBzaWduaWZpY2FudA0KICAgICAgICAgICAgUGFyc2VyRWxlbWVudC5zZXREZWZhdWx0V2hpdGVzcGFjZUNoYXJzKCIgXHQiKQ0KICAgICAgICAgICAgT25lT3JNb3JlKFdvcmQoYWxwaGFzKSkucGFyc2VTdHJpbmcoImFiYyBkZWZcbmdoaSBqa2wiKSAgIyAtPiBbJ2FiYycsICdkZWYnXQ0KICAgICAgICAiIiINCiAgICAgICAgUGFyc2VyRWxlbWVudC5ERUZBVUxUX1dISVRFX0NIQVJTID0gY2hhcnMNCg0KICAgIEBzdGF0aWNtZXRob2QNCiAgICBkZWYgaW5saW5lTGl0ZXJhbHNVc2luZyhjbHMpOg0KICAgICAgICAiIiINCiAgICAgICAgU2V0IGNsYXNzIHRvIGJlIHVzZWQgZm9yIGluY2x1c2lvbiBvZiBzdHJpbmcgbGl0ZXJhbHMgaW50byBhIHBhcnNlci4NCiAgICAgICAgDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgIyBkZWZhdWx0IGxpdGVyYWwgY2xhc3MgdXNlZCBpcyBMaXRlcmFsDQogICAgICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKQ0KICAgICAgICAgICAgZGF0ZV9zdHIgPSBpbnRlZ2VyKCJ5ZWFyIikgKyAnLycgKyBpbnRlZ2VyKCJtb250aCIpICsgJy8nICsgaW50ZWdlcigiZGF5IikgICAgICAgICAgIA0KDQogICAgICAgICAgICBkYXRlX3N0ci5wYXJzZVN0cmluZygiMTk5OS8xMi8zMSIpICAjIC0+IFsnMTk5OScsICcvJywgJzEyJywgJy8nLCAnMzEnXQ0KDQoNCiAgICAgICAgICAgICMgY2hhbmdlIHRvIFN1cHByZXNzDQogICAgICAgICAgICBQYXJzZXJFbGVtZW50LmlubGluZUxpdGVyYWxzVXNpbmcoU3VwcHJlc3MpDQogICAgICAgICAgICBkYXRlX3N0ciA9IGludGVnZXIoInllYXIiKSArICcvJyArIGludGVnZXIoIm1vbnRoIikgKyAnLycgKyBpbnRlZ2VyKCJkYXkiKSAgICAgICAgICAgDQoNCiAgICAgICAgICAgIGRhdGVfc3RyLnBhcnNlU3RyaW5nKCIxOTk5LzEyLzMxIikgICMgLT4gWycxOTk5JywgJzEyJywgJzMxJ10NCiAgICAgICAgIiIiDQogICAgICAgIFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyA9IGNscw0KDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBzYXZlbGlzdD1GYWxzZSApOg0KICAgICAgICBzZWxmLnBhcnNlQWN0aW9uID0gbGlzdCgpDQogICAgICAgIHNlbGYuZmFpbEFjdGlvbiA9IE5vbmUNCiAgICAgICAgI34gc2VsZi5uYW1lID0gIjx1bmtub3duPiIgICMgZG9uJ3QgZGVmaW5lIHNlbGYubmFtZSwgbGV0IHN1YmNsYXNzZXMgdHJ5L2V4Y2VwdCB1cGNhbGwNCiAgICAgICAgc2VsZi5zdHJSZXByID0gTm9uZQ0KICAgICAgICBzZWxmLnJlc3VsdHNOYW1lID0gTm9uZQ0KICAgICAgICBzZWxmLnNhdmVBc0xpc3QgPSBzYXZlbGlzdA0KICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gVHJ1ZQ0KICAgICAgICBzZWxmLndoaXRlQ2hhcnMgPSBQYXJzZXJFbGVtZW50LkRFRkFVTFRfV0hJVEVfQ0hBUlMNCiAgICAgICAgc2VsZi5jb3B5RGVmYXVsdFdoaXRlQ2hhcnMgPSBUcnVlDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBGYWxzZSAjIHVzZWQgd2hlbiBjaGVja2luZyBmb3IgbGVmdC1yZWN1cnNpb24NCiAgICAgICAgc2VsZi5rZWVwVGFicyA9IEZhbHNlDQogICAgICAgIHNlbGYuaWdub3JlRXhwcnMgPSBsaXN0KCkNCiAgICAgICAgc2VsZi5kZWJ1ZyA9IEZhbHNlDQogICAgICAgIHNlbGYuc3RyZWFtbGluZWQgPSBGYWxzZQ0KICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBUcnVlICMgdXNlZCB0byBvcHRpbWl6ZSBleGNlcHRpb24gaGFuZGxpbmcgZm9yIHN1YmNsYXNzZXMgdGhhdCBkb24ndCBhZHZhbmNlIHBhcnNlIGluZGV4DQogICAgICAgIHNlbGYuZXJybXNnID0gIiINCiAgICAgICAgc2VsZi5tb2RhbFJlc3VsdHMgPSBUcnVlICMgdXNlZCB0byBtYXJrIHJlc3VsdHMgbmFtZXMgYXMgbW9kYWwgKHJlcG9ydCBvbmx5IGxhc3QpIG9yIGN1bXVsYXRpdmUgKGxpc3QgYWxsKQ0KICAgICAgICBzZWxmLmRlYnVnQWN0aW9ucyA9ICggTm9uZSwgTm9uZSwgTm9uZSApICNjdXN0b20gZGVidWcgYWN0aW9ucw0KICAgICAgICBzZWxmLnJlID0gTm9uZQ0KICAgICAgICBzZWxmLmNhbGxQcmVwYXJzZSA9IFRydWUgIyB1c2VkIHRvIGF2b2lkIHJlZHVuZGFudCBjYWxscyB0byBwcmVQYXJzZQ0KICAgICAgICBzZWxmLmNhbGxEdXJpbmdUcnkgPSBGYWxzZQ0KDQogICAgZGVmIGNvcHkoIHNlbGYgKToNCiAgICAgICAgIiIiDQogICAgICAgIE1ha2UgYSBjb3B5IG9mIHRoaXMgQ3tQYXJzZXJFbGVtZW50fS4gIFVzZWZ1bCBmb3IgZGVmaW5pbmcgZGlmZmVyZW50IHBhcnNlIGFjdGlvbnMNCiAgICAgICAgZm9yIHRoZSBzYW1lIHBhcnNpbmcgcGF0dGVybiwgdXNpbmcgY29waWVzIG9mIHRoZSBvcmlnaW5hbCBwYXJzZSBlbGVtZW50Lg0KICAgICAgICANCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdG9rczogaW50KHRva3NbMF0pKQ0KICAgICAgICAgICAgaW50ZWdlcksgPSBpbnRlZ2VyLmNvcHkoKS5hZGRQYXJzZUFjdGlvbihsYW1iZGEgdG9rczogdG9rc1swXSoxMDI0KSArIFN1cHByZXNzKCJLIikNCiAgICAgICAgICAgIGludGVnZXJNID0gaW50ZWdlci5jb3B5KCkuYWRkUGFyc2VBY3Rpb24obGFtYmRhIHRva3M6IHRva3NbMF0qMTAyNCoxMDI0KSArIFN1cHByZXNzKCJNIikNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgcHJpbnQoT25lT3JNb3JlKGludGVnZXJLIHwgaW50ZWdlck0gfCBpbnRlZ2VyKS5wYXJzZVN0cmluZygiNUsgMTAwIDY0MEsgMjU2TSIpKQ0KICAgICAgICBwcmludHM6Og0KICAgICAgICAgICAgWzUxMjAsIDEwMCwgNjU1MzYwLCAyNjg0MzU0NTZdDQogICAgICAgIEVxdWl2YWxlbnQgZm9ybSBvZiBDe2V4cHIuY29weSgpfSBpcyBqdXN0IEN7ZXhwcigpfTo6DQogICAgICAgICAgICBpbnRlZ2VyTSA9IGludGVnZXIoKS5hZGRQYXJzZUFjdGlvbihsYW1iZGEgdG9rczogdG9rc1swXSoxMDI0KjEwMjQpICsgU3VwcHJlc3MoIk0iKQ0KICAgICAgICAiIiINCiAgICAgICAgY3B5ID0gY29weS5jb3B5KCBzZWxmICkNCiAgICAgICAgY3B5LnBhcnNlQWN0aW9uID0gc2VsZi5wYXJzZUFjdGlvbls6XQ0KICAgICAgICBjcHkuaWdub3JlRXhwcnMgPSBzZWxmLmlnbm9yZUV4cHJzWzpdDQogICAgICAgIGlmIHNlbGYuY29weURlZmF1bHRXaGl0ZUNoYXJzOg0KICAgICAgICAgICAgY3B5LndoaXRlQ2hhcnMgPSBQYXJzZXJFbGVtZW50LkRFRkFVTFRfV0hJVEVfQ0hBUlMNCiAgICAgICAgcmV0dXJuIGNweQ0KDQogICAgZGVmIHNldE5hbWUoIHNlbGYsIG5hbWUgKToNCiAgICAgICAgIiIiDQogICAgICAgIERlZmluZSBuYW1lIGZvciB0aGlzIGV4cHJlc3Npb24sIG1ha2VzIGRlYnVnZ2luZyBhbmQgZXhjZXB0aW9uIG1lc3NhZ2VzIGNsZWFyZXIuDQogICAgICAgIA0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIFdvcmQobnVtcykucGFyc2VTdHJpbmcoIkFCQyIpICAjIC0+IEV4Y2VwdGlvbjogRXhwZWN0ZWQgVzooMDEyMy4uLikgKGF0IGNoYXIgMCksIChsaW5lOjEsIGNvbDoxKQ0KICAgICAgICAgICAgV29yZChudW1zKS5zZXROYW1lKCJpbnRlZ2VyIikucGFyc2VTdHJpbmcoIkFCQyIpICAjIC0+IEV4Y2VwdGlvbjogRXhwZWN0ZWQgaW50ZWdlciAoYXQgY2hhciAwKSwgKGxpbmU6MSwgY29sOjEpDQogICAgICAgICIiIg0KICAgICAgICBzZWxmLm5hbWUgPSBuYW1lDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBzZWxmLm5hbWUNCiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJleGNlcHRpb24iKToNCiAgICAgICAgICAgIHNlbGYuZXhjZXB0aW9uLm1zZyA9IHNlbGYuZXJybXNnDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgc2V0UmVzdWx0c05hbWUoIHNlbGYsIG5hbWUsIGxpc3RBbGxNYXRjaGVzPUZhbHNlICk6DQogICAgICAgICIiIg0KICAgICAgICBEZWZpbmUgbmFtZSBmb3IgcmVmZXJlbmNpbmcgbWF0Y2hpbmcgdG9rZW5zIGFzIGEgbmVzdGVkIGF0dHJpYnV0ZQ0KICAgICAgICBvZiB0aGUgcmV0dXJuZWQgcGFyc2UgcmVzdWx0cy4NCiAgICAgICAgTk9URTogdGhpcyByZXR1cm5zIGEgKmNvcHkqIG9mIHRoZSBvcmlnaW5hbCBDe1BhcnNlckVsZW1lbnR9IG9iamVjdDsNCiAgICAgICAgdGhpcyBpcyBzbyB0aGF0IHRoZSBjbGllbnQgY2FuIGRlZmluZSBhIGJhc2ljIGVsZW1lbnQsIHN1Y2ggYXMgYW4NCiAgICAgICAgaW50ZWdlciwgYW5kIHJlZmVyZW5jZSBpdCBpbiBtdWx0aXBsZSBwbGFjZXMgd2l0aCBkaWZmZXJlbnQgbmFtZXMuDQoNCiAgICAgICAgWW91IGNhbiBhbHNvIHNldCByZXN1bHRzIG5hbWVzIHVzaW5nIHRoZSBhYmJyZXZpYXRlZCBzeW50YXgsDQogICAgICAgIEN7ZXhwcigibmFtZSIpfSBpbiBwbGFjZSBvZiBDe2V4cHIuc2V0UmVzdWx0c05hbWUoIm5hbWUiKX0gLSANCiAgICAgICAgc2VlIEx7SXtfX2NhbGxfX308X19jYWxsX18+fS4NCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGRhdGVfc3RyID0gKGludGVnZXIuc2V0UmVzdWx0c05hbWUoInllYXIiKSArICcvJyANCiAgICAgICAgICAgICAgICAgICAgICAgICsgaW50ZWdlci5zZXRSZXN1bHRzTmFtZSgibW9udGgiKSArICcvJyANCiAgICAgICAgICAgICAgICAgICAgICAgICsgaW50ZWdlci5zZXRSZXN1bHRzTmFtZSgiZGF5IikpDQoNCiAgICAgICAgICAgICMgZXF1aXZhbGVudCBmb3JtOg0KICAgICAgICAgICAgZGF0ZV9zdHIgPSBpbnRlZ2VyKCJ5ZWFyIikgKyAnLycgKyBpbnRlZ2VyKCJtb250aCIpICsgJy8nICsgaW50ZWdlcigiZGF5IikNCiAgICAgICAgIiIiDQogICAgICAgIG5ld3NlbGYgPSBzZWxmLmNvcHkoKQ0KICAgICAgICBpZiBuYW1lLmVuZHN3aXRoKCIqIik6DQogICAgICAgICAgICBuYW1lID0gbmFtZVs6LTFdDQogICAgICAgICAgICBsaXN0QWxsTWF0Y2hlcz1UcnVlDQogICAgICAgIG5ld3NlbGYucmVzdWx0c05hbWUgPSBuYW1lDQogICAgICAgIG5ld3NlbGYubW9kYWxSZXN1bHRzID0gbm90IGxpc3RBbGxNYXRjaGVzDQogICAgICAgIHJldHVybiBuZXdzZWxmDQoNCiAgICBkZWYgc2V0QnJlYWsoc2VsZixicmVha0ZsYWcgPSBUcnVlKToNCiAgICAgICAgIiIiTWV0aG9kIHRvIGludm9rZSB0aGUgUHl0aG9uIHBkYiBkZWJ1Z2dlciB3aGVuIHRoaXMgZWxlbWVudCBpcw0KICAgICAgICAgICBhYm91dCB0byBiZSBwYXJzZWQuIFNldCBDe2JyZWFrRmxhZ30gdG8gVHJ1ZSB0byBlbmFibGUsIEZhbHNlIHRvDQogICAgICAgICAgIGRpc2FibGUuDQogICAgICAgICIiIg0KICAgICAgICBpZiBicmVha0ZsYWc6DQogICAgICAgICAgICBfcGFyc2VNZXRob2QgPSBzZWxmLl9wYXJzZQ0KICAgICAgICAgICAgZGVmIGJyZWFrZXIoaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUsIGNhbGxQcmVQYXJzZT1UcnVlKToNCiAgICAgICAgICAgICAgICBpbXBvcnQgcGRiDQogICAgICAgICAgICAgICAgcGRiLnNldF90cmFjZSgpDQogICAgICAgICAgICAgICAgcmV0dXJuIF9wYXJzZU1ldGhvZCggaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zLCBjYWxsUHJlUGFyc2UgKQ0KICAgICAgICAgICAgYnJlYWtlci5fb3JpZ2luYWxQYXJzZU1ldGhvZCA9IF9wYXJzZU1ldGhvZA0KICAgICAgICAgICAgc2VsZi5fcGFyc2UgPSBicmVha2VyDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBpZiBoYXNhdHRyKHNlbGYuX3BhcnNlLCJfb3JpZ2luYWxQYXJzZU1ldGhvZCIpOg0KICAgICAgICAgICAgICAgIHNlbGYuX3BhcnNlID0gc2VsZi5fcGFyc2UuX29yaWdpbmFsUGFyc2VNZXRob2QNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBzZXRQYXJzZUFjdGlvbiggc2VsZiwgKmZucywgKiprd2FyZ3MgKToNCiAgICAgICAgIiIiDQogICAgICAgIERlZmluZSBhY3Rpb24gdG8gcGVyZm9ybSB3aGVuIHN1Y2Nlc3NmdWxseSBtYXRjaGluZyBwYXJzZSBlbGVtZW50IGRlZmluaXRpb24uDQogICAgICAgIFBhcnNlIGFjdGlvbiBmbiBpcyBhIGNhbGxhYmxlIG1ldGhvZCB3aXRoIDAtMyBhcmd1bWVudHMsIGNhbGxlZCBhcyBDe2ZuKHMsbG9jLHRva3MpfSwNCiAgICAgICAgQ3tmbihsb2MsdG9rcyl9LCBDe2ZuKHRva3MpfSwgb3IganVzdCBDe2ZuKCl9LCB3aGVyZToNCiAgICAgICAgIC0gcyAgID0gdGhlIG9yaWdpbmFsIHN0cmluZyBiZWluZyBwYXJzZWQgKHNlZSBub3RlIGJlbG93KQ0KICAgICAgICAgLSBsb2MgPSB0aGUgbG9jYXRpb24gb2YgdGhlIG1hdGNoaW5nIHN1YnN0cmluZw0KICAgICAgICAgLSB0b2tzID0gYSBsaXN0IG9mIHRoZSBtYXRjaGVkIHRva2VucywgcGFja2FnZWQgYXMgYSBDe0x7UGFyc2VSZXN1bHRzfX0gb2JqZWN0DQogICAgICAgIElmIHRoZSBmdW5jdGlvbnMgaW4gZm5zIG1vZGlmeSB0aGUgdG9rZW5zLCB0aGV5IGNhbiByZXR1cm4gdGhlbSBhcyB0aGUgcmV0dXJuDQogICAgICAgIHZhbHVlIGZyb20gZm4sIGFuZCB0aGUgbW9kaWZpZWQgbGlzdCBvZiB0b2tlbnMgd2lsbCByZXBsYWNlIHRoZSBvcmlnaW5hbC4NCiAgICAgICAgT3RoZXJ3aXNlLCBmbiBkb2VzIG5vdCBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUuDQoNCiAgICAgICAgT3B0aW9uYWwga2V5d29yZCBhcmd1bWVudHM6DQogICAgICAgICAtIGNhbGxEdXJpbmdUcnkgPSAoZGVmYXVsdD1De0ZhbHNlfSkgaW5kaWNhdGUgaWYgcGFyc2UgYWN0aW9uIHNob3VsZCBiZSBydW4gZHVyaW5nIGxvb2thaGVhZHMgYW5kIGFsdGVybmF0ZSB0ZXN0aW5nDQoNCiAgICAgICAgTm90ZTogdGhlIGRlZmF1bHQgcGFyc2luZyBiZWhhdmlvciBpcyB0byBleHBhbmQgdGFicyBpbiB0aGUgaW5wdXQgc3RyaW5nDQogICAgICAgIGJlZm9yZSBzdGFydGluZyB0aGUgcGFyc2luZyBwcm9jZXNzLiAgU2VlIEx7SXtwYXJzZVN0cmluZ308cGFyc2VTdHJpbmc+fSBmb3IgbW9yZSBpbmZvcm1hdGlvbg0KICAgICAgICBvbiBwYXJzaW5nIHN0cmluZ3MgY29udGFpbmluZyBDezxUQUI+fXMsIGFuZCBzdWdnZXN0ZWQgbWV0aG9kcyB0byBtYWludGFpbiBhDQogICAgICAgIGNvbnNpc3RlbnQgdmlldyBvZiB0aGUgcGFyc2VkIHN0cmluZywgdGhlIHBhcnNlIGxvY2F0aW9uLCBhbmQgbGluZSBhbmQgY29sdW1uDQogICAgICAgIHBvc2l0aW9ucyB3aXRoaW4gdGhlIHBhcnNlZCBzdHJpbmcuDQogICAgICAgIA0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpDQogICAgICAgICAgICBkYXRlX3N0ciA9IGludGVnZXIgKyAnLycgKyBpbnRlZ2VyICsgJy8nICsgaW50ZWdlcg0KDQogICAgICAgICAgICBkYXRlX3N0ci5wYXJzZVN0cmluZygiMTk5OS8xMi8zMSIpICAjIC0+IFsnMTk5OScsICcvJywgJzEyJywgJy8nLCAnMzEnXQ0KDQogICAgICAgICAgICAjIHVzZSBwYXJzZSBhY3Rpb24gdG8gY29udmVydCB0byBpbnRzIGF0IHBhcnNlIHRpbWUNCiAgICAgICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0b2tzOiBpbnQodG9rc1swXSkpDQogICAgICAgICAgICBkYXRlX3N0ciA9IGludGVnZXIgKyAnLycgKyBpbnRlZ2VyICsgJy8nICsgaW50ZWdlcg0KDQogICAgICAgICAgICAjIG5vdGUgdGhhdCBpbnRlZ2VyIGZpZWxkcyBhcmUgbm93IGludHMsIG5vdCBzdHJpbmdzDQogICAgICAgICAgICBkYXRlX3N0ci5wYXJzZVN0cmluZygiMTk5OS8xMi8zMSIpICAjIC0+IFsxOTk5LCAnLycsIDEyLCAnLycsIDMxXQ0KICAgICAgICAiIiINCiAgICAgICAgc2VsZi5wYXJzZUFjdGlvbiA9IGxpc3QobWFwKF90cmltX2FyaXR5LCBsaXN0KGZucykpKQ0KICAgICAgICBzZWxmLmNhbGxEdXJpbmdUcnkgPSBrd2FyZ3MuZ2V0KCJjYWxsRHVyaW5nVHJ5IiwgRmFsc2UpDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgYWRkUGFyc2VBY3Rpb24oIHNlbGYsICpmbnMsICoqa3dhcmdzICk6DQogICAgICAgICIiIg0KICAgICAgICBBZGQgcGFyc2UgYWN0aW9uIHRvIGV4cHJlc3Npb24ncyBsaXN0IG9mIHBhcnNlIGFjdGlvbnMuIFNlZSBMe0l7c2V0UGFyc2VBY3Rpb259PHNldFBhcnNlQWN0aW9uPn0uDQogICAgICAgIA0KICAgICAgICBTZWUgZXhhbXBsZXMgaW4gTHtJe2NvcHl9PGNvcHk+fS4NCiAgICAgICAgIiIiDQogICAgICAgIHNlbGYucGFyc2VBY3Rpb24gKz0gbGlzdChtYXAoX3RyaW1fYXJpdHksIGxpc3QoZm5zKSkpDQogICAgICAgIHNlbGYuY2FsbER1cmluZ1RyeSA9IHNlbGYuY2FsbER1cmluZ1RyeSBvciBrd2FyZ3MuZ2V0KCJjYWxsRHVyaW5nVHJ5IiwgRmFsc2UpDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgYWRkQ29uZGl0aW9uKHNlbGYsICpmbnMsICoqa3dhcmdzKToNCiAgICAgICAgIiIiQWRkIGEgYm9vbGVhbiBwcmVkaWNhdGUgZnVuY3Rpb24gdG8gZXhwcmVzc2lvbidzIGxpc3Qgb2YgcGFyc2UgYWN0aW9ucy4gU2VlIA0KICAgICAgICBMe0l7c2V0UGFyc2VBY3Rpb259PHNldFBhcnNlQWN0aW9uPn0gZm9yIGZ1bmN0aW9uIGNhbGwgc2lnbmF0dXJlcy4gVW5saWtlIEN7c2V0UGFyc2VBY3Rpb259LCANCiAgICAgICAgZnVuY3Rpb25zIHBhc3NlZCB0byBDe2FkZENvbmRpdGlvbn0gbmVlZCB0byByZXR1cm4gYm9vbGVhbiBzdWNjZXNzL2ZhaWwgb2YgdGhlIGNvbmRpdGlvbi4NCg0KICAgICAgICBPcHRpb25hbCBrZXl3b3JkIGFyZ3VtZW50czoNCiAgICAgICAgIC0gbWVzc2FnZSA9IGRlZmluZSBhIGN1c3RvbSBtZXNzYWdlIHRvIGJlIHVzZWQgaW4gdGhlIHJhaXNlZCBleGNlcHRpb24NCiAgICAgICAgIC0gZmF0YWwgICA9IGlmIFRydWUsIHdpbGwgcmFpc2UgUGFyc2VGYXRhbEV4Y2VwdGlvbiB0byBzdG9wIHBhcnNpbmcgaW1tZWRpYXRlbHk7IG90aGVyd2lzZSB3aWxsIHJhaXNlIFBhcnNlRXhjZXB0aW9uDQogICAgICAgICANCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBpbnRlZ2VyID0gV29yZChudW1zKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdG9rczogaW50KHRva3NbMF0pKQ0KICAgICAgICAgICAgeWVhcl9pbnQgPSBpbnRlZ2VyLmNvcHkoKQ0KICAgICAgICAgICAgeWVhcl9pbnQuYWRkQ29uZGl0aW9uKGxhbWJkYSB0b2tzOiB0b2tzWzBdID49IDIwMDAsIG1lc3NhZ2U9Ik9ubHkgc3VwcG9ydCB5ZWFycyAyMDAwIGFuZCBsYXRlciIpDQogICAgICAgICAgICBkYXRlX3N0ciA9IHllYXJfaW50ICsgJy8nICsgaW50ZWdlciArICcvJyArIGludGVnZXINCg0KICAgICAgICAgICAgcmVzdWx0ID0gZGF0ZV9zdHIucGFyc2VTdHJpbmcoIjE5OTkvMTIvMzEiKSAgIyAtPiBFeGNlcHRpb246IE9ubHkgc3VwcG9ydCB5ZWFycyAyMDAwIGFuZCBsYXRlciAoYXQgY2hhciAwKSwgKGxpbmU6MSwgY29sOjEpDQogICAgICAgICIiIg0KICAgICAgICBtc2cgPSBrd2FyZ3MuZ2V0KCJtZXNzYWdlIiwgImZhaWxlZCB1c2VyLWRlZmluZWQgY29uZGl0aW9uIikNCiAgICAgICAgZXhjX3R5cGUgPSBQYXJzZUZhdGFsRXhjZXB0aW9uIGlmIGt3YXJncy5nZXQoImZhdGFsIiwgRmFsc2UpIGVsc2UgUGFyc2VFeGNlcHRpb24NCiAgICAgICAgZm9yIGZuIGluIGZuczoNCiAgICAgICAgICAgIGRlZiBwYShzLGwsdCk6DQogICAgICAgICAgICAgICAgaWYgbm90IGJvb2woX3RyaW1fYXJpdHkoZm4pKHMsbCx0KSk6DQogICAgICAgICAgICAgICAgICAgIHJhaXNlIGV4Y190eXBlKHMsbCxtc2cpDQogICAgICAgICAgICBzZWxmLnBhcnNlQWN0aW9uLmFwcGVuZChwYSkNCiAgICAgICAgc2VsZi5jYWxsRHVyaW5nVHJ5ID0gc2VsZi5jYWxsRHVyaW5nVHJ5IG9yIGt3YXJncy5nZXQoImNhbGxEdXJpbmdUcnkiLCBGYWxzZSkNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBzZXRGYWlsQWN0aW9uKCBzZWxmLCBmbiApOg0KICAgICAgICAiIiJEZWZpbmUgYWN0aW9uIHRvIHBlcmZvcm0gaWYgcGFyc2luZyBmYWlscyBhdCB0aGlzIGV4cHJlc3Npb24uDQogICAgICAgICAgIEZhaWwgYWN0b24gZm4gaXMgYSBjYWxsYWJsZSBmdW5jdGlvbiB0aGF0IHRha2VzIHRoZSBhcmd1bWVudHMNCiAgICAgICAgICAgQ3tmbihzLGxvYyxleHByLGVycil9IHdoZXJlOg0KICAgICAgICAgICAgLSBzID0gc3RyaW5nIGJlaW5nIHBhcnNlZA0KICAgICAgICAgICAgLSBsb2MgPSBsb2NhdGlvbiB3aGVyZSBleHByZXNzaW9uIG1hdGNoIHdhcyBhdHRlbXB0ZWQgYW5kIGZhaWxlZA0KICAgICAgICAgICAgLSBleHByID0gdGhlIHBhcnNlIGV4cHJlc3Npb24gdGhhdCBmYWlsZWQNCiAgICAgICAgICAgIC0gZXJyID0gdGhlIGV4Y2VwdGlvbiB0aHJvd24NCiAgICAgICAgICAgVGhlIGZ1bmN0aW9uIHJldHVybnMgbm8gdmFsdWUuICBJdCBtYXkgdGhyb3cgQ3tMe1BhcnNlRmF0YWxFeGNlcHRpb259fQ0KICAgICAgICAgICBpZiBpdCBpcyBkZXNpcmVkIHRvIHN0b3AgcGFyc2luZyBpbW1lZGlhdGVseS4iIiINCiAgICAgICAgc2VsZi5mYWlsQWN0aW9uID0gZm4NCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBfc2tpcElnbm9yYWJsZXMoIHNlbGYsIGluc3RyaW5nLCBsb2MgKToNCiAgICAgICAgZXhwcnNGb3VuZCA9IFRydWUNCiAgICAgICAgd2hpbGUgZXhwcnNGb3VuZDoNCiAgICAgICAgICAgIGV4cHJzRm91bmQgPSBGYWxzZQ0KICAgICAgICAgICAgZm9yIGUgaW4gc2VsZi5pZ25vcmVFeHByczoNCiAgICAgICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgIHdoaWxlIDE6DQogICAgICAgICAgICAgICAgICAgICAgICBsb2MsZHVtbXkgPSBlLl9wYXJzZSggaW5zdHJpbmcsIGxvYyApDQogICAgICAgICAgICAgICAgICAgICAgICBleHByc0ZvdW5kID0gVHJ1ZQ0KICAgICAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUV4Y2VwdGlvbjoNCiAgICAgICAgICAgICAgICAgICAgcGFzcw0KICAgICAgICByZXR1cm4gbG9jDQoNCiAgICBkZWYgcHJlUGFyc2UoIHNlbGYsIGluc3RyaW5nLCBsb2MgKToNCiAgICAgICAgaWYgc2VsZi5pZ25vcmVFeHByczoNCiAgICAgICAgICAgIGxvYyA9IHNlbGYuX3NraXBJZ25vcmFibGVzKCBpbnN0cmluZywgbG9jICkNCg0KICAgICAgICBpZiBzZWxmLnNraXBXaGl0ZXNwYWNlOg0KICAgICAgICAgICAgd3QgPSBzZWxmLndoaXRlQ2hhcnMNCiAgICAgICAgICAgIGluc3RybGVuID0gbGVuKGluc3RyaW5nKQ0KICAgICAgICAgICAgd2hpbGUgbG9jIDwgaW5zdHJsZW4gYW5kIGluc3RyaW5nW2xvY10gaW4gd3Q6DQogICAgICAgICAgICAgICAgbG9jICs9IDENCg0KICAgICAgICByZXR1cm4gbG9jDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICByZXR1cm4gbG9jLCBbXQ0KDQogICAgZGVmIHBvc3RQYXJzZSggc2VsZiwgaW5zdHJpbmcsIGxvYywgdG9rZW5saXN0ICk6DQogICAgICAgIHJldHVybiB0b2tlbmxpc3QNCg0KICAgICN+IEBwcm9maWxlDQogICAgZGVmIF9wYXJzZU5vQ2FjaGUoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlLCBjYWxsUHJlUGFyc2U9VHJ1ZSApOg0KICAgICAgICBkZWJ1Z2dpbmcgPSAoIHNlbGYuZGVidWcgKSAjYW5kIGRvQWN0aW9ucyApDQoNCiAgICAgICAgaWYgZGVidWdnaW5nIG9yIHNlbGYuZmFpbEFjdGlvbjoNCiAgICAgICAgICAgICN+IHByaW50ICgiTWF0Y2giLHNlbGYsImF0IGxvYyIsbG9jLCIoJWQsJWQpIiAlICggbGluZW5vKGxvYyxpbnN0cmluZyksIGNvbChsb2MsaW5zdHJpbmcpICkpDQogICAgICAgICAgICBpZiAoc2VsZi5kZWJ1Z0FjdGlvbnNbMF0gKToNCiAgICAgICAgICAgICAgICBzZWxmLmRlYnVnQWN0aW9uc1swXSggaW5zdHJpbmcsIGxvYywgc2VsZiApDQogICAgICAgICAgICBpZiBjYWxsUHJlUGFyc2UgYW5kIHNlbGYuY2FsbFByZXBhcnNlOg0KICAgICAgICAgICAgICAgIHByZWxvYyA9IHNlbGYucHJlUGFyc2UoIGluc3RyaW5nLCBsb2MgKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBwcmVsb2MgPSBsb2MNCiAgICAgICAgICAgIHRva2Vuc1N0YXJ0ID0gcHJlbG9jDQogICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICBsb2MsdG9rZW5zID0gc2VsZi5wYXJzZUltcGwoIGluc3RyaW5nLCBwcmVsb2MsIGRvQWN0aW9ucyApDQogICAgICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6DQogICAgICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKCBpbnN0cmluZywgbGVuKGluc3RyaW5nKSwgc2VsZi5lcnJtc2csIHNlbGYgKQ0KICAgICAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBlcnI6DQogICAgICAgICAgICAgICAgI34gcHJpbnQgKCJFeGNlcHRpb24gcmFpc2VkOiIsIGVycikNCiAgICAgICAgICAgICAgICBpZiBzZWxmLmRlYnVnQWN0aW9uc1syXToNCiAgICAgICAgICAgICAgICAgICAgc2VsZi5kZWJ1Z0FjdGlvbnNbMl0oIGluc3RyaW5nLCB0b2tlbnNTdGFydCwgc2VsZiwgZXJyICkNCiAgICAgICAgICAgICAgICBpZiBzZWxmLmZhaWxBY3Rpb246DQogICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbEFjdGlvbiggaW5zdHJpbmcsIHRva2Vuc1N0YXJ0LCBzZWxmLCBlcnIgKQ0KICAgICAgICAgICAgICAgIHJhaXNlDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBpZiBjYWxsUHJlUGFyc2UgYW5kIHNlbGYuY2FsbFByZXBhcnNlOg0KICAgICAgICAgICAgICAgIHByZWxvYyA9IHNlbGYucHJlUGFyc2UoIGluc3RyaW5nLCBsb2MgKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBwcmVsb2MgPSBsb2MNCiAgICAgICAgICAgIHRva2Vuc1N0YXJ0ID0gcHJlbG9jDQogICAgICAgICAgICBpZiBzZWxmLm1heUluZGV4RXJyb3Igb3IgbG9jID49IGxlbihpbnN0cmluZyk6DQogICAgICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgICAgICBsb2MsdG9rZW5zID0gc2VsZi5wYXJzZUltcGwoIGluc3RyaW5nLCBwcmVsb2MsIGRvQWN0aW9ucyApDQogICAgICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6DQogICAgICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKCBpbnN0cmluZywgbGVuKGluc3RyaW5nKSwgc2VsZi5lcnJtc2csIHNlbGYgKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBsb2MsdG9rZW5zID0gc2VsZi5wYXJzZUltcGwoIGluc3RyaW5nLCBwcmVsb2MsIGRvQWN0aW9ucyApDQoNCiAgICAgICAgdG9rZW5zID0gc2VsZi5wb3N0UGFyc2UoIGluc3RyaW5nLCBsb2MsIHRva2VucyApDQoNCiAgICAgICAgcmV0VG9rZW5zID0gUGFyc2VSZXN1bHRzKCB0b2tlbnMsIHNlbGYucmVzdWx0c05hbWUsIGFzTGlzdD1zZWxmLnNhdmVBc0xpc3QsIG1vZGFsPXNlbGYubW9kYWxSZXN1bHRzICkNCiAgICAgICAgaWYgc2VsZi5wYXJzZUFjdGlvbiBhbmQgKGRvQWN0aW9ucyBvciBzZWxmLmNhbGxEdXJpbmdUcnkpOg0KICAgICAgICAgICAgaWYgZGVidWdnaW5nOg0KICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgZm9yIGZuIGluIHNlbGYucGFyc2VBY3Rpb246DQogICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMgPSBmbiggaW5zdHJpbmcsIHRva2Vuc1N0YXJ0LCByZXRUb2tlbnMgKQ0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgdG9rZW5zIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFRva2VucyA9IFBhcnNlUmVzdWx0cyggdG9rZW5zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXN1bHRzTmFtZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzTGlzdD1zZWxmLnNhdmVBc0xpc3QgYW5kIGlzaW5zdGFuY2UodG9rZW5zLChQYXJzZVJlc3VsdHMsbGlzdCkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kYWw9c2VsZi5tb2RhbFJlc3VsdHMgKQ0KICAgICAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgZXJyOg0KICAgICAgICAgICAgICAgICAgICAjfiBwcmludCAiRXhjZXB0aW9uIHJhaXNlZCBpbiB1c2VyIHBhcnNlIGFjdGlvbjoiLCBlcnINCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZGVidWdBY3Rpb25zWzJdICk6DQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRlYnVnQWN0aW9uc1syXSggaW5zdHJpbmcsIHRva2Vuc1N0YXJ0LCBzZWxmLCBlcnIgKQ0KICAgICAgICAgICAgICAgICAgICByYWlzZQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBmb3IgZm4gaW4gc2VsZi5wYXJzZUFjdGlvbjoNCiAgICAgICAgICAgICAgICAgICAgdG9rZW5zID0gZm4oIGluc3RyaW5nLCB0b2tlbnNTdGFydCwgcmV0VG9rZW5zICkNCiAgICAgICAgICAgICAgICAgICAgaWYgdG9rZW5zIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0VG9rZW5zID0gUGFyc2VSZXN1bHRzKCB0b2tlbnMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVzdWx0c05hbWUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzTGlzdD1zZWxmLnNhdmVBc0xpc3QgYW5kIGlzaW5zdGFuY2UodG9rZW5zLChQYXJzZVJlc3VsdHMsbGlzdCkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RhbD1zZWxmLm1vZGFsUmVzdWx0cyApDQoNCiAgICAgICAgaWYgZGVidWdnaW5nOg0KICAgICAgICAgICAgI34gcHJpbnQgKCJNYXRjaGVkIixzZWxmLCItPiIscmV0VG9rZW5zLmFzTGlzdCgpKQ0KICAgICAgICAgICAgaWYgKHNlbGYuZGVidWdBY3Rpb25zWzFdICk6DQogICAgICAgICAgICAgICAgc2VsZi5kZWJ1Z0FjdGlvbnNbMV0oIGluc3RyaW5nLCB0b2tlbnNTdGFydCwgbG9jLCBzZWxmLCByZXRUb2tlbnMgKQ0KDQogICAgICAgIHJldHVybiBsb2MsIHJldFRva2Vucw0KDQogICAgZGVmIHRyeVBhcnNlKCBzZWxmLCBpbnN0cmluZywgbG9jICk6DQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLl9wYXJzZSggaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPUZhbHNlIClbMF0NCiAgICAgICAgZXhjZXB0IFBhcnNlRmF0YWxFeGNlcHRpb246DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbiggaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQogICAgDQogICAgZGVmIGNhblBhcnNlTmV4dChzZWxmLCBpbnN0cmluZywgbG9jKToNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgc2VsZi50cnlQYXJzZShpbnN0cmluZywgbG9jKQ0KICAgICAgICBleGNlcHQgKFBhcnNlRXhjZXB0aW9uLCBJbmRleEVycm9yKToNCiAgICAgICAgICAgIHJldHVybiBGYWxzZQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmV0dXJuIFRydWUNCg0KICAgIGNsYXNzIF9VbmJvdW5kZWRDYWNoZShvYmplY3QpOg0KICAgICAgICBkZWYgX19pbml0X18oc2VsZik6DQogICAgICAgICAgICBjYWNoZSA9IHt9DQogICAgICAgICAgICBzZWxmLm5vdF9pbl9jYWNoZSA9IG5vdF9pbl9jYWNoZSA9IG9iamVjdCgpDQoNCiAgICAgICAgICAgIGRlZiBnZXQoc2VsZiwga2V5KToNCiAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGUuZ2V0KGtleSwgbm90X2luX2NhY2hlKQ0KDQogICAgICAgICAgICBkZWYgc2V0KHNlbGYsIGtleSwgdmFsdWUpOg0KICAgICAgICAgICAgICAgIGNhY2hlW2tleV0gPSB2YWx1ZQ0KDQogICAgICAgICAgICBkZWYgY2xlYXIoc2VsZik6DQogICAgICAgICAgICAgICAgY2FjaGUuY2xlYXIoKQ0KDQogICAgICAgICAgICBzZWxmLmdldCA9IHR5cGVzLk1ldGhvZFR5cGUoZ2V0LCBzZWxmKQ0KICAgICAgICAgICAgc2VsZi5zZXQgPSB0eXBlcy5NZXRob2RUeXBlKHNldCwgc2VsZikNCiAgICAgICAgICAgIHNlbGYuY2xlYXIgPSB0eXBlcy5NZXRob2RUeXBlKGNsZWFyLCBzZWxmKQ0KDQogICAgaWYgX09yZGVyZWREaWN0IGlzIG5vdCBOb25lOg0KICAgICAgICBjbGFzcyBfRmlmb0NhY2hlKG9iamVjdCk6DQogICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgc2l6ZSk6DQogICAgICAgICAgICAgICAgc2VsZi5ub3RfaW5fY2FjaGUgPSBub3RfaW5fY2FjaGUgPSBvYmplY3QoKQ0KDQogICAgICAgICAgICAgICAgY2FjaGUgPSBfT3JkZXJlZERpY3QoKQ0KDQogICAgICAgICAgICAgICAgZGVmIGdldChzZWxmLCBrZXkpOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGUuZ2V0KGtleSwgbm90X2luX2NhY2hlKQ0KDQogICAgICAgICAgICAgICAgZGVmIHNldChzZWxmLCBrZXksIHZhbHVlKToNCiAgICAgICAgICAgICAgICAgICAgY2FjaGVba2V5XSA9IHZhbHVlDQogICAgICAgICAgICAgICAgICAgIGlmIGxlbihjYWNoZSkgPiBzaXplOg0KICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUucG9waXRlbShGYWxzZSkNCg0KICAgICAgICAgICAgICAgIGRlZiBjbGVhcihzZWxmKToNCiAgICAgICAgICAgICAgICAgICAgY2FjaGUuY2xlYXIoKQ0KDQogICAgICAgICAgICAgICAgc2VsZi5nZXQgPSB0eXBlcy5NZXRob2RUeXBlKGdldCwgc2VsZikNCiAgICAgICAgICAgICAgICBzZWxmLnNldCA9IHR5cGVzLk1ldGhvZFR5cGUoc2V0LCBzZWxmKQ0KICAgICAgICAgICAgICAgIHNlbGYuY2xlYXIgPSB0eXBlcy5NZXRob2RUeXBlKGNsZWFyLCBzZWxmKQ0KDQogICAgZWxzZToNCiAgICAgICAgY2xhc3MgX0ZpZm9DYWNoZShvYmplY3QpOg0KICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNpemUpOg0KICAgICAgICAgICAgICAgIHNlbGYubm90X2luX2NhY2hlID0gbm90X2luX2NhY2hlID0gb2JqZWN0KCkNCg0KICAgICAgICAgICAgICAgIGNhY2hlID0ge30NCiAgICAgICAgICAgICAgICBrZXlfZmlmbyA9IGNvbGxlY3Rpb25zLmRlcXVlKFtdLCBzaXplKQ0KDQogICAgICAgICAgICAgICAgZGVmIGdldChzZWxmLCBrZXkpOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGUuZ2V0KGtleSwgbm90X2luX2NhY2hlKQ0KDQogICAgICAgICAgICAgICAgZGVmIHNldChzZWxmLCBrZXksIHZhbHVlKToNCiAgICAgICAgICAgICAgICAgICAgY2FjaGVba2V5XSA9IHZhbHVlDQogICAgICAgICAgICAgICAgICAgIGlmIGxlbihjYWNoZSkgPiBzaXplOg0KICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUucG9wKGtleV9maWZvLnBvcGxlZnQoKSwgTm9uZSkNCiAgICAgICAgICAgICAgICAgICAga2V5X2ZpZm8uYXBwZW5kKGtleSkNCg0KICAgICAgICAgICAgICAgIGRlZiBjbGVhcihzZWxmKToNCiAgICAgICAgICAgICAgICAgICAgY2FjaGUuY2xlYXIoKQ0KICAgICAgICAgICAgICAgICAgICBrZXlfZmlmby5jbGVhcigpDQoNCiAgICAgICAgICAgICAgICBzZWxmLmdldCA9IHR5cGVzLk1ldGhvZFR5cGUoZ2V0LCBzZWxmKQ0KICAgICAgICAgICAgICAgIHNlbGYuc2V0ID0gdHlwZXMuTWV0aG9kVHlwZShzZXQsIHNlbGYpDQogICAgICAgICAgICAgICAgc2VsZi5jbGVhciA9IHR5cGVzLk1ldGhvZFR5cGUoY2xlYXIsIHNlbGYpDQoNCiAgICAjIGFyZ3VtZW50IGNhY2hlIGZvciBvcHRpbWl6aW5nIHJlcGVhdGVkIGNhbGxzIHdoZW4gYmFja3RyYWNraW5nIHRocm91Z2ggcmVjdXJzaXZlIGV4cHJlc3Npb25zDQogICAgcGFja3JhdF9jYWNoZSA9IHt9ICMgdGhpcyBpcyBzZXQgbGF0ZXIgYnkgZW5hYmxlZFBhY2tyYXQoKTsgdGhpcyBpcyBoZXJlIHNvIHRoYXQgcmVzZXRDYWNoZSgpIGRvZXNuJ3QgZmFpbA0KICAgIHBhY2tyYXRfY2FjaGVfbG9jayA9IFJMb2NrKCkNCiAgICBwYWNrcmF0X2NhY2hlX3N0YXRzID0gWzAsIDBdDQoNCiAgICAjIHRoaXMgbWV0aG9kIGdldHMgcmVwZWF0ZWRseSBjYWxsZWQgZHVyaW5nIGJhY2t0cmFja2luZyB3aXRoIHRoZSBzYW1lIGFyZ3VtZW50cyAtDQogICAgIyB3ZSBjYW4gY2FjaGUgdGhlc2UgYXJndW1lbnRzIGFuZCBzYXZlIG91cnNlbHZlcyB0aGUgdHJvdWJsZSBvZiByZS1wYXJzaW5nIHRoZSBjb250YWluZWQgZXhwcmVzc2lvbg0KICAgIGRlZiBfcGFyc2VDYWNoZSggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUsIGNhbGxQcmVQYXJzZT1UcnVlICk6DQogICAgICAgIEhJVCwgTUlTUyA9IDAsIDENCiAgICAgICAgbG9va3VwID0gKHNlbGYsIGluc3RyaW5nLCBsb2MsIGNhbGxQcmVQYXJzZSwgZG9BY3Rpb25zKQ0KICAgICAgICB3aXRoIFBhcnNlckVsZW1lbnQucGFja3JhdF9jYWNoZV9sb2NrOg0KICAgICAgICAgICAgY2FjaGUgPSBQYXJzZXJFbGVtZW50LnBhY2tyYXRfY2FjaGUNCiAgICAgICAgICAgIHZhbHVlID0gY2FjaGUuZ2V0KGxvb2t1cCkNCiAgICAgICAgICAgIGlmIHZhbHVlIGlzIGNhY2hlLm5vdF9pbl9jYWNoZToNCiAgICAgICAgICAgICAgICBQYXJzZXJFbGVtZW50LnBhY2tyYXRfY2FjaGVfc3RhdHNbTUlTU10gKz0gMQ0KICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxmLl9wYXJzZU5vQ2FjaGUoaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zLCBjYWxsUHJlUGFyc2UpDQogICAgICAgICAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBwZToNCiAgICAgICAgICAgICAgICAgICAgIyBjYWNoZSBhIGNvcHkgb2YgdGhlIGV4Y2VwdGlvbiwgd2l0aG91dCB0aGUgdHJhY2ViYWNrDQogICAgICAgICAgICAgICAgICAgIGNhY2hlLnNldChsb29rdXAsIHBlLl9fY2xhc3NfXygqcGUuYXJncykpDQogICAgICAgICAgICAgICAgICAgIHJhaXNlDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgY2FjaGUuc2V0KGxvb2t1cCwgKHZhbHVlWzBdLCB2YWx1ZVsxXS5jb3B5KCkpKQ0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgUGFyc2VyRWxlbWVudC5wYWNrcmF0X2NhY2hlX3N0YXRzW0hJVF0gKz0gMQ0KICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIEV4Y2VwdGlvbik6DQogICAgICAgICAgICAgICAgICAgIHJhaXNlIHZhbHVlDQogICAgICAgICAgICAgICAgcmV0dXJuICh2YWx1ZVswXSwgdmFsdWVbMV0uY29weSgpKQ0KDQogICAgX3BhcnNlID0gX3BhcnNlTm9DYWNoZQ0KDQogICAgQHN0YXRpY21ldGhvZA0KICAgIGRlZiByZXNldENhY2hlKCk6DQogICAgICAgIFBhcnNlckVsZW1lbnQucGFja3JhdF9jYWNoZS5jbGVhcigpDQogICAgICAgIFBhcnNlckVsZW1lbnQucGFja3JhdF9jYWNoZV9zdGF0c1s6XSA9IFswXSAqIGxlbihQYXJzZXJFbGVtZW50LnBhY2tyYXRfY2FjaGVfc3RhdHMpDQoNCiAgICBfcGFja3JhdEVuYWJsZWQgPSBGYWxzZQ0KICAgIEBzdGF0aWNtZXRob2QNCiAgICBkZWYgZW5hYmxlUGFja3JhdChjYWNoZV9zaXplX2xpbWl0PTEyOCk6DQogICAgICAgICIiIkVuYWJsZXMgInBhY2tyYXQiIHBhcnNpbmcsIHdoaWNoIGFkZHMgbWVtb2l6aW5nIHRvIHRoZSBwYXJzaW5nIGxvZ2ljLg0KICAgICAgICAgICBSZXBlYXRlZCBwYXJzZSBhdHRlbXB0cyBhdCB0aGUgc2FtZSBzdHJpbmcgbG9jYXRpb24gKHdoaWNoIGhhcHBlbnMNCiAgICAgICAgICAgb2Z0ZW4gaW4gbWFueSBjb21wbGV4IGdyYW1tYXJzKSBjYW4gaW1tZWRpYXRlbHkgcmV0dXJuIGEgY2FjaGVkIHZhbHVlLA0KICAgICAgICAgICBpbnN0ZWFkIG9mIHJlLWV4ZWN1dGluZyBwYXJzaW5nL3ZhbGlkYXRpbmcgY29kZS4gIE1lbW9pemluZyBpcyBkb25lIG9mDQogICAgICAgICAgIGJvdGggdmFsaWQgcmVzdWx0cyBhbmQgcGFyc2luZyBleGNlcHRpb25zLg0KICAgICAgICAgICANCiAgICAgICAgICAgUGFyYW1ldGVyczoNCiAgICAgICAgICAgIC0gY2FjaGVfc2l6ZV9saW1pdCAtIChkZWZhdWx0PUN7MTI4fSkgLSBpZiBhbiBpbnRlZ2VyIHZhbHVlIGlzIHByb3ZpZGVkDQogICAgICAgICAgICAgIHdpbGwgbGltaXQgdGhlIHNpemUgb2YgdGhlIHBhY2tyYXQgY2FjaGU7IGlmIE5vbmUgaXMgcGFzc2VkLCB0aGVuDQogICAgICAgICAgICAgIHRoZSBjYWNoZSBzaXplIHdpbGwgYmUgdW5ib3VuZGVkOyBpZiAwIGlzIHBhc3NlZCwgdGhlIGNhY2hlIHdpbGwNCiAgICAgICAgICAgICAgYmUgZWZmZWN0aXZlbHkgZGlzYWJsZWQuDQogICAgICAgICAgICANCiAgICAgICAgICAgVGhpcyBzcGVlZHVwIG1heSBicmVhayBleGlzdGluZyBwcm9ncmFtcyB0aGF0IHVzZSBwYXJzZSBhY3Rpb25zIHRoYXQNCiAgICAgICAgICAgaGF2ZSBzaWRlLWVmZmVjdHMuICBGb3IgdGhpcyByZWFzb24sIHBhY2tyYXQgcGFyc2luZyBpcyBkaXNhYmxlZCB3aGVuDQogICAgICAgICAgIHlvdSBmaXJzdCBpbXBvcnQgcHlwYXJzaW5nLiAgVG8gYWN0aXZhdGUgdGhlIHBhY2tyYXQgZmVhdHVyZSwgeW91cg0KICAgICAgICAgICBwcm9ncmFtIG11c3QgY2FsbCB0aGUgY2xhc3MgbWV0aG9kIEN7UGFyc2VyRWxlbWVudC5lbmFibGVQYWNrcmF0KCl9LiAgSWYNCiAgICAgICAgICAgeW91ciBwcm9ncmFtIHVzZXMgQ3twc3ljb30gdG8gImNvbXBpbGUgYXMgeW91IGdvIiwgeW91IG11c3QgY2FsbA0KICAgICAgICAgICBDe2VuYWJsZVBhY2tyYXR9IGJlZm9yZSBjYWxsaW5nIEN7cHN5Y28uZnVsbCgpfS4gIElmIHlvdSBkbyBub3QgZG8gdGhpcywNCiAgICAgICAgICAgUHl0aG9uIHdpbGwgY3Jhc2guICBGb3IgYmVzdCByZXN1bHRzLCBjYWxsIEN7ZW5hYmxlUGFja3JhdCgpfSBpbW1lZGlhdGVseQ0KICAgICAgICAgICBhZnRlciBpbXBvcnRpbmcgcHlwYXJzaW5nLg0KICAgICAgICAgICANCiAgICAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICAgICBpbXBvcnQgcHlwYXJzaW5nDQogICAgICAgICAgICAgICBweXBhcnNpbmcuUGFyc2VyRWxlbWVudC5lbmFibGVQYWNrcmF0KCkNCiAgICAgICAgIiIiDQogICAgICAgIGlmIG5vdCBQYXJzZXJFbGVtZW50Ll9wYWNrcmF0RW5hYmxlZDoNCiAgICAgICAgICAgIFBhcnNlckVsZW1lbnQuX3BhY2tyYXRFbmFibGVkID0gVHJ1ZQ0KICAgICAgICAgICAgaWYgY2FjaGVfc2l6ZV9saW1pdCBpcyBOb25lOg0KICAgICAgICAgICAgICAgIFBhcnNlckVsZW1lbnQucGFja3JhdF9jYWNoZSA9IFBhcnNlckVsZW1lbnQuX1VuYm91bmRlZENhY2hlKCkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgUGFyc2VyRWxlbWVudC5wYWNrcmF0X2NhY2hlID0gUGFyc2VyRWxlbWVudC5fRmlmb0NhY2hlKGNhY2hlX3NpemVfbGltaXQpDQogICAgICAgICAgICBQYXJzZXJFbGVtZW50Ll9wYXJzZSA9IFBhcnNlckVsZW1lbnQuX3BhcnNlQ2FjaGUNCg0KICAgIGRlZiBwYXJzZVN0cmluZyggc2VsZiwgaW5zdHJpbmcsIHBhcnNlQWxsPUZhbHNlICk6DQogICAgICAgICIiIg0KICAgICAgICBFeGVjdXRlIHRoZSBwYXJzZSBleHByZXNzaW9uIHdpdGggdGhlIGdpdmVuIHN0cmluZy4NCiAgICAgICAgVGhpcyBpcyB0aGUgbWFpbiBpbnRlcmZhY2UgdG8gdGhlIGNsaWVudCBjb2RlLCBvbmNlIHRoZSBjb21wbGV0ZQ0KICAgICAgICBleHByZXNzaW9uIGhhcyBiZWVuIGJ1aWx0Lg0KDQogICAgICAgIElmIHlvdSB3YW50IHRoZSBncmFtbWFyIHRvIHJlcXVpcmUgdGhhdCB0aGUgZW50aXJlIGlucHV0IHN0cmluZyBiZQ0KICAgICAgICBzdWNjZXNzZnVsbHkgcGFyc2VkLCB0aGVuIHNldCBDe3BhcnNlQWxsfSB0byBUcnVlIChlcXVpdmFsZW50IHRvIGVuZGluZw0KICAgICAgICB0aGUgZ3JhbW1hciB3aXRoIEN7THtTdHJpbmdFbmQoKX19KS4NCg0KICAgICAgICBOb3RlOiBDe3BhcnNlU3RyaW5nfSBpbXBsaWNpdGx5IGNhbGxzIEN7ZXhwYW5kdGFicygpfSBvbiB0aGUgaW5wdXQgc3RyaW5nLA0KICAgICAgICBpbiBvcmRlciB0byByZXBvcnQgcHJvcGVyIGNvbHVtbiBudW1iZXJzIGluIHBhcnNlIGFjdGlvbnMuDQogICAgICAgIElmIHRoZSBpbnB1dCBzdHJpbmcgY29udGFpbnMgdGFicyBhbmQNCiAgICAgICAgdGhlIGdyYW1tYXIgdXNlcyBwYXJzZSBhY3Rpb25zIHRoYXQgdXNlIHRoZSBDe2xvY30gYXJndW1lbnQgdG8gaW5kZXggaW50byB0aGUNCiAgICAgICAgc3RyaW5nIGJlaW5nIHBhcnNlZCwgeW91IGNhbiBlbnN1cmUgeW91IGhhdmUgYSBjb25zaXN0ZW50IHZpZXcgb2YgdGhlIGlucHV0DQogICAgICAgIHN0cmluZyBieToNCiAgICAgICAgIC0gY2FsbGluZyBDe3BhcnNlV2l0aFRhYnN9IG9uIHlvdXIgZ3JhbW1hciBiZWZvcmUgY2FsbGluZyBDe3BhcnNlU3RyaW5nfQ0KICAgICAgICAgICAoc2VlIEx7SXtwYXJzZVdpdGhUYWJzfTxwYXJzZVdpdGhUYWJzPn0pDQogICAgICAgICAtIGRlZmluZSB5b3VyIHBhcnNlIGFjdGlvbiB1c2luZyB0aGUgZnVsbCBDeyhzLGxvYyx0b2tzKX0gc2lnbmF0dXJlLCBhbmQNCiAgICAgICAgICAgcmVmZXJlbmNlIHRoZSBpbnB1dCBzdHJpbmcgdXNpbmcgdGhlIHBhcnNlIGFjdGlvbidzIEN7c30gYXJndW1lbnQNCiAgICAgICAgIC0gZXhwbGljdGx5IGV4cGFuZCB0aGUgdGFicyBpbiB5b3VyIGlucHV0IHN0cmluZyBiZWZvcmUgY2FsbGluZw0KICAgICAgICAgICBDe3BhcnNlU3RyaW5nfQ0KICAgICAgICANCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBXb3JkKCdhJykucGFyc2VTdHJpbmcoJ2FhYWFhYmFhYScpICAjIC0+IFsnYWFhYWEnXQ0KICAgICAgICAgICAgV29yZCgnYScpLnBhcnNlU3RyaW5nKCdhYWFhYWJhYWEnLCBwYXJzZUFsbD1UcnVlKSAgIyAtPiBFeGNlcHRpb246IEV4cGVjdGVkIGVuZCBvZiB0ZXh0DQogICAgICAgICIiIg0KICAgICAgICBQYXJzZXJFbGVtZW50LnJlc2V0Q2FjaGUoKQ0KICAgICAgICBpZiBub3Qgc2VsZi5zdHJlYW1saW5lZDoNCiAgICAgICAgICAgIHNlbGYuc3RyZWFtbGluZSgpDQogICAgICAgICAgICAjfiBzZWxmLnNhdmVBc0xpc3QgPSBUcnVlDQogICAgICAgIGZvciBlIGluIHNlbGYuaWdub3JlRXhwcnM6DQogICAgICAgICAgICBlLnN0cmVhbWxpbmUoKQ0KICAgICAgICBpZiBub3Qgc2VsZi5rZWVwVGFiczoNCiAgICAgICAgICAgIGluc3RyaW5nID0gaW5zdHJpbmcuZXhwYW5kdGFicygpDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIGxvYywgdG9rZW5zID0gc2VsZi5fcGFyc2UoIGluc3RyaW5nLCAwICkNCiAgICAgICAgICAgIGlmIHBhcnNlQWxsOg0KICAgICAgICAgICAgICAgIGxvYyA9IHNlbGYucHJlUGFyc2UoIGluc3RyaW5nLCBsb2MgKQ0KICAgICAgICAgICAgICAgIHNlID0gRW1wdHkoKSArIFN0cmluZ0VuZCgpDQogICAgICAgICAgICAgICAgc2UuX3BhcnNlKCBpbnN0cmluZywgbG9jICkNCiAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBleGM6DQogICAgICAgICAgICBpZiBQYXJzZXJFbGVtZW50LnZlcmJvc2Vfc3RhY2t0cmFjZToNCiAgICAgICAgICAgICAgICByYWlzZQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAjIGNhdGNoIGFuZCByZS1yYWlzZSBleGNlcHRpb24gZnJvbSBoZXJlLCBjbGVhcnMgb3V0IHB5cGFyc2luZyBpbnRlcm5hbCBzdGFjayB0cmFjZQ0KICAgICAgICAgICAgICAgIHJhaXNlIGV4Yw0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmV0dXJuIHRva2Vucw0KDQogICAgZGVmIHNjYW5TdHJpbmcoIHNlbGYsIGluc3RyaW5nLCBtYXhNYXRjaGVzPV9NQVhfSU5ULCBvdmVybGFwPUZhbHNlICk6DQogICAgICAgICIiIg0KICAgICAgICBTY2FuIHRoZSBpbnB1dCBzdHJpbmcgZm9yIGV4cHJlc3Npb24gbWF0Y2hlcy4gIEVhY2ggbWF0Y2ggd2lsbCByZXR1cm4gdGhlDQogICAgICAgIG1hdGNoaW5nIHRva2Vucywgc3RhcnQgbG9jYXRpb24sIGFuZCBlbmQgbG9jYXRpb24uICBNYXkgYmUgY2FsbGVkIHdpdGggb3B0aW9uYWwNCiAgICAgICAgQ3ttYXhNYXRjaGVzfSBhcmd1bWVudCwgdG8gY2xpcCBzY2FubmluZyBhZnRlciAnbicgbWF0Y2hlcyBhcmUgZm91bmQuICBJZg0KICAgICAgICBDe292ZXJsYXB9IGlzIHNwZWNpZmllZCwgdGhlbiBvdmVybGFwcGluZyBtYXRjaGVzIHdpbGwgYmUgcmVwb3J0ZWQuDQoNCiAgICAgICAgTm90ZSB0aGF0IHRoZSBzdGFydCBhbmQgZW5kIGxvY2F0aW9ucyBhcmUgcmVwb3J0ZWQgcmVsYXRpdmUgdG8gdGhlIHN0cmluZw0KICAgICAgICBiZWluZyBwYXJzZWQuICBTZWUgTHtJe3BhcnNlU3RyaW5nfTxwYXJzZVN0cmluZz59IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHBhcnNpbmcNCiAgICAgICAgc3RyaW5ncyB3aXRoIGVtYmVkZGVkIHRhYnMuDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBzb3VyY2UgPSAic2xkamYxMjNsc2RqamtmMzQ1c2xka2pmODc5bGtqc2ZkOTg3Ig0KICAgICAgICAgICAgcHJpbnQoc291cmNlKQ0KICAgICAgICAgICAgZm9yIHRva2VucyxzdGFydCxlbmQgaW4gV29yZChhbHBoYXMpLnNjYW5TdHJpbmcoc291cmNlKToNCiAgICAgICAgICAgICAgICBwcmludCgnICcqc3RhcnQgKyAnXicqKGVuZC1zdGFydCkpDQogICAgICAgICAgICAgICAgcHJpbnQoJyAnKnN0YXJ0ICsgdG9rZW5zWzBdKQ0KICAgICAgICANCiAgICAgICAgcHJpbnRzOjoNCiAgICAgICAgDQogICAgICAgICAgICBzbGRqZjEyM2xzZGpqa2YzNDVzbGRramY4Nzlsa2pzZmQ5ODcNCiAgICAgICAgICAgIF5eXl5eDQogICAgICAgICAgICBzbGRqZg0KICAgICAgICAgICAgICAgICAgICBeXl5eXl5eDQogICAgICAgICAgICAgICAgICAgIGxzZGpqa2YNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xka2pmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxranNmZA0KICAgICAgICAiIiINCiAgICAgICAgaWYgbm90IHNlbGYuc3RyZWFtbGluZWQ6DQogICAgICAgICAgICBzZWxmLnN0cmVhbWxpbmUoKQ0KICAgICAgICBmb3IgZSBpbiBzZWxmLmlnbm9yZUV4cHJzOg0KICAgICAgICAgICAgZS5zdHJlYW1saW5lKCkNCg0KICAgICAgICBpZiBub3Qgc2VsZi5rZWVwVGFiczoNCiAgICAgICAgICAgIGluc3RyaW5nID0gX3VzdHIoaW5zdHJpbmcpLmV4cGFuZHRhYnMoKQ0KICAgICAgICBpbnN0cmxlbiA9IGxlbihpbnN0cmluZykNCiAgICAgICAgbG9jID0gMA0KICAgICAgICBwcmVwYXJzZUZuID0gc2VsZi5wcmVQYXJzZQ0KICAgICAgICBwYXJzZUZuID0gc2VsZi5fcGFyc2UNCiAgICAgICAgUGFyc2VyRWxlbWVudC5yZXNldENhY2hlKCkNCiAgICAgICAgbWF0Y2hlcyA9IDANCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgd2hpbGUgbG9jIDw9IGluc3RybGVuIGFuZCBtYXRjaGVzIDwgbWF4TWF0Y2hlczoNCiAgICAgICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgIHByZWxvYyA9IHByZXBhcnNlRm4oIGluc3RyaW5nLCBsb2MgKQ0KICAgICAgICAgICAgICAgICAgICBuZXh0TG9jLHRva2VucyA9IHBhcnNlRm4oIGluc3RyaW5nLCBwcmVsb2MsIGNhbGxQcmVQYXJzZT1GYWxzZSApDQogICAgICAgICAgICAgICAgZXhjZXB0IFBhcnNlRXhjZXB0aW9uOg0KICAgICAgICAgICAgICAgICAgICBsb2MgPSBwcmVsb2MrMQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIGlmIG5leHRMb2MgPiBsb2M6DQogICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzICs9IDENCiAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHRva2VucywgcHJlbG9jLCBuZXh0TG9jDQogICAgICAgICAgICAgICAgICAgICAgICBpZiBvdmVybGFwOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRsb2MgPSBwcmVwYXJzZUZuKCBpbnN0cmluZywgbG9jICkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBuZXh0bG9jID4gbG9jOg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2MgPSBuZXh0TG9jDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jICs9IDENCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jID0gbmV4dExvYw0KICAgICAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICAgICAgbG9jID0gcHJlbG9jKzENCiAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbiBhcyBleGM6DQogICAgICAgICAgICBpZiBQYXJzZXJFbGVtZW50LnZlcmJvc2Vfc3RhY2t0cmFjZToNCiAgICAgICAgICAgICAgICByYWlzZQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAjIGNhdGNoIGFuZCByZS1yYWlzZSBleGNlcHRpb24gZnJvbSBoZXJlLCBjbGVhcnMgb3V0IHB5cGFyc2luZyBpbnRlcm5hbCBzdGFjayB0cmFjZQ0KICAgICAgICAgICAgICAgIHJhaXNlIGV4Yw0KDQogICAgZGVmIHRyYW5zZm9ybVN0cmluZyggc2VsZiwgaW5zdHJpbmcgKToNCiAgICAgICAgIiIiDQogICAgICAgIEV4dGVuc2lvbiB0byBDe0x7c2NhblN0cmluZ319LCB0byBtb2RpZnkgbWF0Y2hpbmcgdGV4dCB3aXRoIG1vZGlmaWVkIHRva2VucyB0aGF0IG1heQ0KICAgICAgICBiZSByZXR1cm5lZCBmcm9tIGEgcGFyc2UgYWN0aW9uLiAgVG8gdXNlIEN7dHJhbnNmb3JtU3RyaW5nfSwgZGVmaW5lIGEgZ3JhbW1hciBhbmQNCiAgICAgICAgYXR0YWNoIGEgcGFyc2UgYWN0aW9uIHRvIGl0IHRoYXQgbW9kaWZpZXMgdGhlIHJldHVybmVkIHRva2VuIGxpc3QuDQogICAgICAgIEludm9raW5nIEN7dHJhbnNmb3JtU3RyaW5nKCl9IG9uIGEgdGFyZ2V0IHN0cmluZyB3aWxsIHRoZW4gc2NhbiBmb3IgbWF0Y2hlcywNCiAgICAgICAgYW5kIHJlcGxhY2UgdGhlIG1hdGNoZWQgdGV4dCBwYXR0ZXJucyBhY2NvcmRpbmcgdG8gdGhlIGxvZ2ljIGluIHRoZSBwYXJzZQ0KICAgICAgICBhY3Rpb24uICBDe3RyYW5zZm9ybVN0cmluZygpfSByZXR1cm5zIHRoZSByZXN1bHRpbmcgdHJhbnNmb3JtZWQgc3RyaW5nLg0KICAgICAgICANCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICB3ZCA9IFdvcmQoYWxwaGFzKQ0KICAgICAgICAgICAgd2Quc2V0UGFyc2VBY3Rpb24obGFtYmRhIHRva3M6IHRva3NbMF0udGl0bGUoKSkNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgcHJpbnQod2QudHJhbnNmb3JtU3RyaW5nKCJub3cgaXMgdGhlIHdpbnRlciBvZiBvdXIgZGlzY29udGVudCBtYWRlIGdsb3Jpb3VzIHN1bW1lciBieSB0aGlzIHN1biBvZiB5b3JrLiIpKQ0KICAgICAgICBQcmludHM6Og0KICAgICAgICAgICAgTm93IElzIFRoZSBXaW50ZXIgT2YgT3VyIERpc2NvbnRlbnQgTWFkZSBHbG9yaW91cyBTdW1tZXIgQnkgVGhpcyBTdW4gT2YgWW9yay4NCiAgICAgICAgIiIiDQogICAgICAgIG91dCA9IFtdDQogICAgICAgIGxhc3RFID0gMA0KICAgICAgICAjIGZvcmNlIHByZXNlcnZhdGlvbiBvZiA8VEFCPnMsIHRvIG1pbmltaXplIHVud2FudGVkIHRyYW5zZm9ybWF0aW9uIG9mIHN0cmluZywgYW5kIHRvDQogICAgICAgICMga2VlcCBzdHJpbmcgbG9jcyBzdHJhaWdodCBiZXR3ZWVuIHRyYW5zZm9ybVN0cmluZyBhbmQgc2NhblN0cmluZw0KICAgICAgICBzZWxmLmtlZXBUYWJzID0gVHJ1ZQ0KICAgICAgICB0cnk6DQogICAgICAgICAgICBmb3IgdCxzLGUgaW4gc2VsZi5zY2FuU3RyaW5nKCBpbnN0cmluZyApOg0KICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIGluc3RyaW5nW2xhc3RFOnNdICkNCiAgICAgICAgICAgICAgICBpZiB0Og0KICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHQsUGFyc2VSZXN1bHRzKToNCiAgICAgICAgICAgICAgICAgICAgICAgIG91dCArPSB0LmFzTGlzdCgpDQogICAgICAgICAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh0LGxpc3QpOg0KICAgICAgICAgICAgICAgICAgICAgICAgb3V0ICs9IHQNCiAgICAgICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQodCkNCiAgICAgICAgICAgICAgICBsYXN0RSA9IGUNCiAgICAgICAgICAgIG91dC5hcHBlbmQoaW5zdHJpbmdbbGFzdEU6XSkNCiAgICAgICAgICAgIG91dCA9IFtvIGZvciBvIGluIG91dCBpZiBvXQ0KICAgICAgICAgICAgcmV0dXJuICIiLmpvaW4obWFwKF91c3RyLF9mbGF0dGVuKG91dCkpKQ0KICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIGV4YzoNCiAgICAgICAgICAgIGlmIFBhcnNlckVsZW1lbnQudmVyYm9zZV9zdGFja3RyYWNlOg0KICAgICAgICAgICAgICAgIHJhaXNlDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICMgY2F0Y2ggYW5kIHJlLXJhaXNlIGV4Y2VwdGlvbiBmcm9tIGhlcmUsIGNsZWFycyBvdXQgcHlwYXJzaW5nIGludGVybmFsIHN0YWNrIHRyYWNlDQogICAgICAgICAgICAgICAgcmFpc2UgZXhjDQoNCiAgICBkZWYgc2VhcmNoU3RyaW5nKCBzZWxmLCBpbnN0cmluZywgbWF4TWF0Y2hlcz1fTUFYX0lOVCApOg0KICAgICAgICAiIiINCiAgICAgICAgQW5vdGhlciBleHRlbnNpb24gdG8gQ3tMe3NjYW5TdHJpbmd9fSwgc2ltcGxpZnlpbmcgdGhlIGFjY2VzcyB0byB0aGUgdG9rZW5zIGZvdW5kDQogICAgICAgIHRvIG1hdGNoIHRoZSBnaXZlbiBwYXJzZSBleHByZXNzaW9uLiAgTWF5IGJlIGNhbGxlZCB3aXRoIG9wdGlvbmFsDQogICAgICAgIEN7bWF4TWF0Y2hlc30gYXJndW1lbnQsIHRvIGNsaXAgc2VhcmNoaW5nIGFmdGVyICduJyBtYXRjaGVzIGFyZSBmb3VuZC4NCiAgICAgICAgDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgIyBhIGNhcGl0YWxpemVkIHdvcmQgc3RhcnRzIHdpdGggYW4gdXBwZXJjYXNlIGxldHRlciwgZm9sbG93ZWQgYnkgemVybyBvciBtb3JlIGxvd2VyY2FzZSBsZXR0ZXJzDQogICAgICAgICAgICBjYXBfd29yZCA9IFdvcmQoYWxwaGFzLnVwcGVyKCksIGFscGhhcy5sb3dlcigpKQ0KICAgICAgICAgICAgDQogICAgICAgICAgICBwcmludChjYXBfd29yZC5zZWFyY2hTdHJpbmcoIk1vcmUgdGhhbiBJcm9uLCBtb3JlIHRoYW4gTGVhZCwgbW9yZSB0aGFuIEdvbGQgSSBuZWVkIEVsZWN0cmljaXR5IikpDQogICAgICAgIHByaW50czo6DQogICAgICAgICAgICBbJ01vcmUnLCAnSXJvbicsICdMZWFkJywgJ0dvbGQnLCAnSSddDQogICAgICAgICIiIg0KICAgICAgICB0cnk6DQogICAgICAgICAgICByZXR1cm4gUGFyc2VSZXN1bHRzKFsgdCBmb3IgdCxzLGUgaW4gc2VsZi5zY2FuU3RyaW5nKCBpbnN0cmluZywgbWF4TWF0Y2hlcyApIF0pDQogICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgZXhjOg0KICAgICAgICAgICAgaWYgUGFyc2VyRWxlbWVudC52ZXJib3NlX3N0YWNrdHJhY2U6DQogICAgICAgICAgICAgICAgcmFpc2UNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgIyBjYXRjaCBhbmQgcmUtcmFpc2UgZXhjZXB0aW9uIGZyb20gaGVyZSwgY2xlYXJzIG91dCBweXBhcnNpbmcgaW50ZXJuYWwgc3RhY2sgdHJhY2UNCiAgICAgICAgICAgICAgICByYWlzZSBleGMNCg0KICAgIGRlZiBzcGxpdChzZWxmLCBpbnN0cmluZywgbWF4c3BsaXQ9X01BWF9JTlQsIGluY2x1ZGVTZXBhcmF0b3JzPUZhbHNlKToNCiAgICAgICAgIiIiDQogICAgICAgIEdlbmVyYXRvciBtZXRob2QgdG8gc3BsaXQgYSBzdHJpbmcgdXNpbmcgdGhlIGdpdmVuIGV4cHJlc3Npb24gYXMgYSBzZXBhcmF0b3IuDQogICAgICAgIE1heSBiZSBjYWxsZWQgd2l0aCBvcHRpb25hbCBDe21heHNwbGl0fSBhcmd1bWVudCwgdG8gbGltaXQgdGhlIG51bWJlciBvZiBzcGxpdHM7DQogICAgICAgIGFuZCB0aGUgb3B0aW9uYWwgQ3tpbmNsdWRlU2VwYXJhdG9yc30gYXJndW1lbnQgKGRlZmF1bHQ9Q3tGYWxzZX0pLCBpZiB0aGUgc2VwYXJhdGluZw0KICAgICAgICBtYXRjaGluZyB0ZXh0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgc3BsaXQgcmVzdWx0cy4NCiAgICAgICAgDQogICAgICAgIEV4YW1wbGU6OiAgICAgICAgDQogICAgICAgICAgICBwdW5jID0gb25lT2YobGlzdCgiLiw7Oi8tIT8iKSkNCiAgICAgICAgICAgIHByaW50KGxpc3QocHVuYy5zcGxpdCgiVGhpcywgdGhpcz8sIHRoaXMgc2VudGVuY2UsIGlzIGJhZGx5IHB1bmN0dWF0ZWQhIikpKQ0KICAgICAgICBwcmludHM6Og0KICAgICAgICAgICAgWydUaGlzJywgJyB0aGlzJywgJycsICcgdGhpcyBzZW50ZW5jZScsICcgaXMgYmFkbHkgcHVuY3R1YXRlZCcsICcnXQ0KICAgICAgICAiIiINCiAgICAgICAgc3BsaXRzID0gMA0KICAgICAgICBsYXN0ID0gMA0KICAgICAgICBmb3IgdCxzLGUgaW4gc2VsZi5zY2FuU3RyaW5nKGluc3RyaW5nLCBtYXhNYXRjaGVzPW1heHNwbGl0KToNCiAgICAgICAgICAgIHlpZWxkIGluc3RyaW5nW2xhc3Q6c10NCiAgICAgICAgICAgIGlmIGluY2x1ZGVTZXBhcmF0b3JzOg0KICAgICAgICAgICAgICAgIHlpZWxkIHRbMF0NCiAgICAgICAgICAgIGxhc3QgPSBlDQogICAgICAgIHlpZWxkIGluc3RyaW5nW2xhc3Q6XQ0KDQogICAgZGVmIF9fYWRkX18oc2VsZiwgb3RoZXIgKToNCiAgICAgICAgIiIiDQogICAgICAgIEltcGxlbWVudGF0aW9uIG9mICsgb3BlcmF0b3IgLSByZXR1cm5zIEN7THtBbmR9fS4gQWRkaW5nIHN0cmluZ3MgdG8gYSBQYXJzZXJFbGVtZW50DQogICAgICAgIGNvbnZlcnRzIHRoZW0gdG8gTHtMaXRlcmFsfXMgYnkgZGVmYXVsdC4NCiAgICAgICAgDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgZ3JlZXQgPSBXb3JkKGFscGhhcykgKyAiLCIgKyBXb3JkKGFscGhhcykgKyAiISINCiAgICAgICAgICAgIGhlbGxvID0gIkhlbGxvLCBXb3JsZCEiDQogICAgICAgICAgICBwcmludCAoaGVsbG8sICItPiIsIGdyZWV0LnBhcnNlU3RyaW5nKGhlbGxvKSkNCiAgICAgICAgUHJpbnRzOjoNCiAgICAgICAgICAgIEhlbGxvLCBXb3JsZCEgLT4gWydIZWxsbycsICcsJywgJ1dvcmxkJywgJyEnXQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApDQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwNCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgcmV0dXJuIE5vbmUNCiAgICAgICAgcmV0dXJuIEFuZCggWyBzZWxmLCBvdGhlciBdICkNCg0KICAgIGRlZiBfX3JhZGRfXyhzZWxmLCBvdGhlciApOg0KICAgICAgICAiIiINCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgKyBvcGVyYXRvciB3aGVuIGxlZnQgb3BlcmFuZCBpcyBub3QgYSBDe0x7UGFyc2VyRWxlbWVudH19DQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkNCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoIG90aGVyLCBQYXJzZXJFbGVtZW50ICk6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLA0KICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgICAgICAgICByZXR1cm4gTm9uZQ0KICAgICAgICByZXR1cm4gb3RoZXIgKyBzZWxmDQoNCiAgICBkZWYgX19zdWJfXyhzZWxmLCBvdGhlcik6DQogICAgICAgICIiIg0KICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiAtIG9wZXJhdG9yLCByZXR1cm5zIEN7THtBbmR9fSB3aXRoIGVycm9yIHN0b3ANCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQ0KICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksDQogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgIHJldHVybiBOb25lDQogICAgICAgIHJldHVybiBBbmQoIFsgc2VsZiwgQW5kLl9FcnJvclN0b3AoKSwgb3RoZXIgXSApDQoNCiAgICBkZWYgX19yc3ViX18oc2VsZiwgb3RoZXIgKToNCiAgICAgICAgIiIiDQogICAgICAgIEltcGxlbWVudGF0aW9uIG9mIC0gb3BlcmF0b3Igd2hlbiBsZWZ0IG9wZXJhbmQgaXMgbm90IGEgQ3tMe1BhcnNlckVsZW1lbnR9fQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApDQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwNCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgcmV0dXJuIE5vbmUNCiAgICAgICAgcmV0dXJuIG90aGVyIC0gc2VsZg0KDQogICAgZGVmIF9fbXVsX18oc2VsZixvdGhlcik6DQogICAgICAgICIiIg0KICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiAqIG9wZXJhdG9yLCBhbGxvd3MgdXNlIG9mIEN7ZXhwciAqIDN9IGluIHBsYWNlIG9mDQogICAgICAgIEN7ZXhwciArIGV4cHIgKyBleHByfS4gIEV4cHJlc3Npb25zIG1heSBhbHNvIG1lIG11bHRpcGxpZWQgYnkgYSAyLWludGVnZXINCiAgICAgICAgdHVwbGUsIHNpbWlsYXIgdG8gQ3t7bWluLG1heH19IG11bHRpcGxpZXJzIGluIHJlZ3VsYXIgZXhwcmVzc2lvbnMuICBUdXBsZXMNCiAgICAgICAgbWF5IGFsc28gaW5jbHVkZSBDe05vbmV9IGFzIGluOg0KICAgICAgICAgLSBDe2V4cHIqKG4sTm9uZSl9IG9yIEN7ZXhwcioobiwpfSBpcyBlcXVpdmFsZW50DQogICAgICAgICAgICAgIHRvIEN7ZXhwcipuICsgTHtaZXJvT3JNb3JlfShleHByKX0NCiAgICAgICAgICAgICAgKHJlYWQgYXMgImF0IGxlYXN0IG4gaW5zdGFuY2VzIG9mIEN7ZXhwcn0iKQ0KICAgICAgICAgLSBDe2V4cHIqKE5vbmUsbil9IGlzIGVxdWl2YWxlbnQgdG8gQ3tleHByKigwLG4pfQ0KICAgICAgICAgICAgICAocmVhZCBhcyAiMCB0byBuIGluc3RhbmNlcyBvZiBDe2V4cHJ9IikNCiAgICAgICAgIC0gQ3tleHByKihOb25lLE5vbmUpfSBpcyBlcXVpdmFsZW50IHRvIEN7THtaZXJvT3JNb3JlfShleHByKX0NCiAgICAgICAgIC0gQ3tleHByKigxLE5vbmUpfSBpcyBlcXVpdmFsZW50IHRvIEN7THtPbmVPck1vcmV9KGV4cHIpfQ0KDQogICAgICAgIE5vdGUgdGhhdCBDe2V4cHIqKE5vbmUsbil9IGRvZXMgbm90IHJhaXNlIGFuIGV4Y2VwdGlvbiBpZg0KICAgICAgICBtb3JlIHRoYW4gbiBleHBycyBleGlzdCBpbiB0aGUgaW5wdXQgc3RyZWFtOyB0aGF0IGlzLA0KICAgICAgICBDe2V4cHIqKE5vbmUsbil9IGRvZXMgbm90IGVuZm9yY2UgYSBtYXhpbXVtIG51bWJlciBvZiBleHByDQogICAgICAgIG9jY3VycmVuY2VzLiAgSWYgdGhpcyBiZWhhdmlvciBpcyBkZXNpcmVkLCB0aGVuIHdyaXRlDQogICAgICAgIEN7ZXhwciooTm9uZSxuKSArIH5leHByfQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlcixpbnQpOg0KICAgICAgICAgICAgbWluRWxlbWVudHMsIG9wdEVsZW1lbnRzID0gb3RoZXIsMA0KICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob3RoZXIsdHVwbGUpOg0KICAgICAgICAgICAgb3RoZXIgPSAob3RoZXIgKyAoTm9uZSwgTm9uZSkpWzoyXQ0KICAgICAgICAgICAgaWYgb3RoZXJbMF0gaXMgTm9uZToNCiAgICAgICAgICAgICAgICBvdGhlciA9ICgwLCBvdGhlclsxXSkNCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXJbMF0saW50KSBhbmQgb3RoZXJbMV0gaXMgTm9uZToNCiAgICAgICAgICAgICAgICBpZiBvdGhlclswXSA9PSAwOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gWmVyb09yTW9yZShzZWxmKQ0KICAgICAgICAgICAgICAgIGlmIG90aGVyWzBdID09IDE6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBPbmVPck1vcmUoc2VsZikNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZipvdGhlclswXSArIFplcm9Pck1vcmUoc2VsZikNCiAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdGhlclswXSxpbnQpIGFuZCBpc2luc3RhbmNlKG90aGVyWzFdLGludCk6DQogICAgICAgICAgICAgICAgbWluRWxlbWVudHMsIG9wdEVsZW1lbnRzID0gb3RoZXINCiAgICAgICAgICAgICAgICBvcHRFbGVtZW50cyAtPSBtaW5FbGVtZW50cw0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImNhbm5vdCBtdWx0aXBseSAnUGFyc2VyRWxlbWVudCcgYW5kICgnJXMnLCclcycpIG9iamVjdHMiLCB0eXBlKG90aGVyWzBdKSx0eXBlKG90aGVyWzFdKSkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiY2Fubm90IG11bHRpcGx5ICdQYXJzZXJFbGVtZW50JyBhbmQgJyVzJyBvYmplY3RzIiwgdHlwZShvdGhlcikpDQoNCiAgICAgICAgaWYgbWluRWxlbWVudHMgPCAwOg0KICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiY2Fubm90IG11bHRpcGx5IFBhcnNlckVsZW1lbnQgYnkgbmVnYXRpdmUgdmFsdWUiKQ0KICAgICAgICBpZiBvcHRFbGVtZW50cyA8IDA6DQogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJzZWNvbmQgdHVwbGUgdmFsdWUgbXVzdCBiZSBncmVhdGVyIG9yIGVxdWFsIHRvIGZpcnN0IHR1cGxlIHZhbHVlIikNCiAgICAgICAgaWYgbWluRWxlbWVudHMgPT0gb3B0RWxlbWVudHMgPT0gMDoNCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImNhbm5vdCBtdWx0aXBseSBQYXJzZXJFbGVtZW50IGJ5IDAgb3IgKDAsMCkiKQ0KDQogICAgICAgIGlmIChvcHRFbGVtZW50cyk6DQogICAgICAgICAgICBkZWYgbWFrZU9wdGlvbmFsTGlzdChuKToNCiAgICAgICAgICAgICAgICBpZiBuPjE6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBPcHRpb25hbChzZWxmICsgbWFrZU9wdGlvbmFsTGlzdChuLTEpKQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBPcHRpb25hbChzZWxmKQ0KICAgICAgICAgICAgaWYgbWluRWxlbWVudHM6DQogICAgICAgICAgICAgICAgaWYgbWluRWxlbWVudHMgPT0gMToNCiAgICAgICAgICAgICAgICAgICAgcmV0ID0gc2VsZiArIG1ha2VPcHRpb25hbExpc3Qob3B0RWxlbWVudHMpDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgcmV0ID0gQW5kKFtzZWxmXSptaW5FbGVtZW50cykgKyBtYWtlT3B0aW9uYWxMaXN0KG9wdEVsZW1lbnRzKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByZXQgPSBtYWtlT3B0aW9uYWxMaXN0KG9wdEVsZW1lbnRzKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgaWYgbWluRWxlbWVudHMgPT0gMToNCiAgICAgICAgICAgICAgICByZXQgPSBzZWxmDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJldCA9IEFuZChbc2VsZl0qbWluRWxlbWVudHMpDQogICAgICAgIHJldHVybiByZXQNCg0KICAgIGRlZiBfX3JtdWxfXyhzZWxmLCBvdGhlcik6DQogICAgICAgIHJldHVybiBzZWxmLl9fbXVsX18ob3RoZXIpDQoNCiAgICBkZWYgX19vcl9fKHNlbGYsIG90aGVyICk6DQogICAgICAgICIiIg0KICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiB8IG9wZXJhdG9yIC0gcmV0dXJucyBDe0x7TWF0Y2hGaXJzdH19DQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkNCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoIG90aGVyLCBQYXJzZXJFbGVtZW50ICk6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLA0KICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgICAgICAgICByZXR1cm4gTm9uZQ0KICAgICAgICByZXR1cm4gTWF0Y2hGaXJzdCggWyBzZWxmLCBvdGhlciBdICkNCg0KICAgIGRlZiBfX3Jvcl9fKHNlbGYsIG90aGVyICk6DQogICAgICAgICIiIg0KICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiB8IG9wZXJhdG9yIHdoZW4gbGVmdCBvcGVyYW5kIGlzIG5vdCBhIEN7THtQYXJzZXJFbGVtZW50fX0NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQ0KICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksDQogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgIHJldHVybiBOb25lDQogICAgICAgIHJldHVybiBvdGhlciB8IHNlbGYNCg0KICAgIGRlZiBfX3hvcl9fKHNlbGYsIG90aGVyICk6DQogICAgICAgICIiIg0KICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiBeIG9wZXJhdG9yIC0gcmV0dXJucyBDe0x7T3J9fQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApDQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKCBvdGhlciwgUGFyc2VyRWxlbWVudCApOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQ2Fubm90IGNvbWJpbmUgZWxlbWVudCBvZiB0eXBlICVzIHdpdGggUGFyc2VyRWxlbWVudCIgJSB0eXBlKG90aGVyKSwNCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgcmV0dXJuIE5vbmUNCiAgICAgICAgcmV0dXJuIE9yKCBbIHNlbGYsIG90aGVyIF0gKQ0KDQogICAgZGVmIF9fcnhvcl9fKHNlbGYsIG90aGVyICk6DQogICAgICAgICIiIg0KICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiBeIG9wZXJhdG9yIHdoZW4gbGVmdCBvcGVyYW5kIGlzIG5vdCBhIEN7THtQYXJzZXJFbGVtZW50fX0NCiAgICAgICAgIiIiDQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyggb3RoZXIgKQ0KICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSggb3RoZXIsIFBhcnNlckVsZW1lbnQgKToNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNhbm5vdCBjb21iaW5lIGVsZW1lbnQgb2YgdHlwZSAlcyB3aXRoIFBhcnNlckVsZW1lbnQiICUgdHlwZShvdGhlciksDQogICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgICAgIHJldHVybiBOb25lDQogICAgICAgIHJldHVybiBvdGhlciBeIHNlbGYNCg0KICAgIGRlZiBfX2FuZF9fKHNlbGYsIG90aGVyICk6DQogICAgICAgICIiIg0KICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiAmIG9wZXJhdG9yIC0gcmV0dXJucyBDe0x7RWFjaH19DQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkNCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoIG90aGVyLCBQYXJzZXJFbGVtZW50ICk6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLA0KICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgICAgICAgICByZXR1cm4gTm9uZQ0KICAgICAgICByZXR1cm4gRWFjaCggWyBzZWxmLCBvdGhlciBdICkNCg0KICAgIGRlZiBfX3JhbmRfXyhzZWxmLCBvdGhlciApOg0KICAgICAgICAiIiINCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgJiBvcGVyYXRvciB3aGVuIGxlZnQgb3BlcmFuZCBpcyBub3QgYSBDe0x7UGFyc2VyRWxlbWVudH19DQogICAgICAgICIiIg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkNCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoIG90aGVyLCBQYXJzZXJFbGVtZW50ICk6DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDYW5ub3QgY29tYmluZSBlbGVtZW50IG9mIHR5cGUgJXMgd2l0aCBQYXJzZXJFbGVtZW50IiAlIHR5cGUob3RoZXIpLA0KICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgICAgICAgICByZXR1cm4gTm9uZQ0KICAgICAgICByZXR1cm4gb3RoZXIgJiBzZWxmDQoNCiAgICBkZWYgX19pbnZlcnRfXyggc2VsZiApOg0KICAgICAgICAiIiINCiAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgfiBvcGVyYXRvciAtIHJldHVybnMgQ3tMe05vdEFueX19DQogICAgICAgICIiIg0KICAgICAgICByZXR1cm4gTm90QW55KCBzZWxmICkNCg0KICAgIGRlZiBfX2NhbGxfXyhzZWxmLCBuYW1lPU5vbmUpOg0KICAgICAgICAiIiINCiAgICAgICAgU2hvcnRjdXQgZm9yIEN7THtzZXRSZXN1bHRzTmFtZX19LCB3aXRoIEN7bGlzdEFsbE1hdGNoZXM9RmFsc2V9Lg0KICAgICAgICANCiAgICAgICAgSWYgQ3tuYW1lfSBpcyBnaXZlbiB3aXRoIGEgdHJhaWxpbmcgQ3snKid9IGNoYXJhY3RlciwgdGhlbiBDe2xpc3RBbGxNYXRjaGVzfSB3aWxsIGJlDQogICAgICAgIHBhc3NlZCBhcyBDe1RydWV9Lg0KICAgICAgICAgICANCiAgICAgICAgSWYgQ3tuYW1lfSBpcyBvbWl0dGVkLCBzYW1lIGFzIGNhbGxpbmcgQ3tMe2NvcHl9fS4NCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgICMgdGhlc2UgYXJlIGVxdWl2YWxlbnQNCiAgICAgICAgICAgIHVzZXJkYXRhID0gV29yZChhbHBoYXMpLnNldFJlc3VsdHNOYW1lKCJuYW1lIikgKyBXb3JkKG51bXMrIi0iKS5zZXRSZXN1bHRzTmFtZSgic29jc2Vjbm8iKQ0KICAgICAgICAgICAgdXNlcmRhdGEgPSBXb3JkKGFscGhhcykoIm5hbWUiKSArIFdvcmQobnVtcysiLSIpKCJzb2NzZWNubyIpICAgICAgICAgICAgIA0KICAgICAgICAiIiINCiAgICAgICAgaWYgbmFtZSBpcyBub3QgTm9uZToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLnNldFJlc3VsdHNOYW1lKG5hbWUpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5jb3B5KCkNCg0KICAgIGRlZiBzdXBwcmVzcyggc2VsZiApOg0KICAgICAgICAiIiINCiAgICAgICAgU3VwcHJlc3NlcyB0aGUgb3V0cHV0IG9mIHRoaXMgQ3tQYXJzZXJFbGVtZW50fTsgdXNlZnVsIHRvIGtlZXAgcHVuY3R1YXRpb24gZnJvbQ0KICAgICAgICBjbHV0dGVyaW5nIHVwIHJldHVybmVkIG91dHB1dC4NCiAgICAgICAgIiIiDQogICAgICAgIHJldHVybiBTdXBwcmVzcyggc2VsZiApDQoNCiAgICBkZWYgbGVhdmVXaGl0ZXNwYWNlKCBzZWxmICk6DQogICAgICAgICIiIg0KICAgICAgICBEaXNhYmxlcyB0aGUgc2tpcHBpbmcgb2Ygd2hpdGVzcGFjZSBiZWZvcmUgbWF0Y2hpbmcgdGhlIGNoYXJhY3RlcnMgaW4gdGhlDQogICAgICAgIEN7UGFyc2VyRWxlbWVudH0ncyBkZWZpbmVkIHBhdHRlcm4uICBUaGlzIGlzIG5vcm1hbGx5IG9ubHkgdXNlZCBpbnRlcm5hbGx5IGJ5DQogICAgICAgIHRoZSBweXBhcnNpbmcgbW9kdWxlLCBidXQgbWF5IGJlIG5lZWRlZCBpbiBzb21lIHdoaXRlc3BhY2Utc2Vuc2l0aXZlIGdyYW1tYXJzLg0KICAgICAgICAiIiINCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IEZhbHNlDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgc2V0V2hpdGVzcGFjZUNoYXJzKCBzZWxmLCBjaGFycyApOg0KICAgICAgICAiIiINCiAgICAgICAgT3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHdoaXRlc3BhY2UgY2hhcnMNCiAgICAgICAgIiIiDQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBUcnVlDQogICAgICAgIHNlbGYud2hpdGVDaGFycyA9IGNoYXJzDQogICAgICAgIHNlbGYuY29weURlZmF1bHRXaGl0ZUNoYXJzID0gRmFsc2UNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBwYXJzZVdpdGhUYWJzKCBzZWxmICk6DQogICAgICAgICIiIg0KICAgICAgICBPdmVycmlkZXMgZGVmYXVsdCBiZWhhdmlvciB0byBleHBhbmQgQ3s8VEFCPn1zIHRvIHNwYWNlcyBiZWZvcmUgcGFyc2luZyB0aGUgaW5wdXQgc3RyaW5nLg0KICAgICAgICBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgQ3twYXJzZVN0cmluZ30gd2hlbiB0aGUgaW5wdXQgZ3JhbW1hciBjb250YWlucyBlbGVtZW50cyB0aGF0DQogICAgICAgIG1hdGNoIEN7PFRBQj59IGNoYXJhY3RlcnMuDQogICAgICAgICIiIg0KICAgICAgICBzZWxmLmtlZXBUYWJzID0gVHJ1ZQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIGlnbm9yZSggc2VsZiwgb3RoZXIgKToNCiAgICAgICAgIiIiDQogICAgICAgIERlZmluZSBleHByZXNzaW9uIHRvIGJlIGlnbm9yZWQgKGUuZy4sIGNvbW1lbnRzKSB3aGlsZSBkb2luZyBwYXR0ZXJuDQogICAgICAgIG1hdGNoaW5nOyBtYXkgYmUgY2FsbGVkIHJlcGVhdGVkbHksIHRvIGRlZmluZSBtdWx0aXBsZSBjb21tZW50IG9yIG90aGVyDQogICAgICAgIGlnbm9yYWJsZSBwYXR0ZXJucy4NCiAgICAgICAgDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgcGF0dCA9IE9uZU9yTW9yZShXb3JkKGFscGhhcykpDQogICAgICAgICAgICBwYXR0LnBhcnNlU3RyaW5nKCdhYmxhaiAvKiBjb21tZW50ICovIGxza2pkJykgIyAtPiBbJ2FibGFqJ10NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgcGF0dC5pZ25vcmUoY1N0eWxlQ29tbWVudCkNCiAgICAgICAgICAgIHBhdHQucGFyc2VTdHJpbmcoJ2FibGFqIC8qIGNvbW1lbnQgKi8gbHNramQnKSAjIC0+IFsnYWJsYWonLCAnbHNramQnXQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgYmFzZXN0cmluZyk6DQogICAgICAgICAgICBvdGhlciA9IFN1cHByZXNzKG90aGVyKQ0KDQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBTdXBwcmVzcyApOg0KICAgICAgICAgICAgaWYgb3RoZXIgbm90IGluIHNlbGYuaWdub3JlRXhwcnM6DQogICAgICAgICAgICAgICAgc2VsZi5pZ25vcmVFeHBycy5hcHBlbmQob3RoZXIpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLmlnbm9yZUV4cHJzLmFwcGVuZCggU3VwcHJlc3MoIG90aGVyLmNvcHkoKSApICkNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBzZXREZWJ1Z0FjdGlvbnMoIHNlbGYsIHN0YXJ0QWN0aW9uLCBzdWNjZXNzQWN0aW9uLCBleGNlcHRpb25BY3Rpb24gKToNCiAgICAgICAgIiIiDQogICAgICAgIEVuYWJsZSBkaXNwbGF5IG9mIGRlYnVnZ2luZyBtZXNzYWdlcyB3aGlsZSBkb2luZyBwYXR0ZXJuIG1hdGNoaW5nLg0KICAgICAgICAiIiINCiAgICAgICAgc2VsZi5kZWJ1Z0FjdGlvbnMgPSAoc3RhcnRBY3Rpb24gb3IgX2RlZmF1bHRTdGFydERlYnVnQWN0aW9uLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzQWN0aW9uIG9yIF9kZWZhdWx0U3VjY2Vzc0RlYnVnQWN0aW9uLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25BY3Rpb24gb3IgX2RlZmF1bHRFeGNlcHRpb25EZWJ1Z0FjdGlvbikNCiAgICAgICAgc2VsZi5kZWJ1ZyA9IFRydWUNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBzZXREZWJ1Zyggc2VsZiwgZmxhZz1UcnVlICk6DQogICAgICAgICIiIg0KICAgICAgICBFbmFibGUgZGlzcGxheSBvZiBkZWJ1Z2dpbmcgbWVzc2FnZXMgd2hpbGUgZG9pbmcgcGF0dGVybiBtYXRjaGluZy4NCiAgICAgICAgU2V0IEN7ZmxhZ30gdG8gVHJ1ZSB0byBlbmFibGUsIEZhbHNlIHRvIGRpc2FibGUuDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICB3ZCA9IFdvcmQoYWxwaGFzKS5zZXROYW1lKCJhbHBoYXdvcmQiKQ0KICAgICAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykuc2V0TmFtZSgibnVtd29yZCIpDQogICAgICAgICAgICB0ZXJtID0gd2QgfCBpbnRlZ2VyDQogICAgICAgICAgICANCiAgICAgICAgICAgICMgdHVybiBvbiBkZWJ1Z2dpbmcgZm9yIHdkDQogICAgICAgICAgICB3ZC5zZXREZWJ1ZygpDQoNCiAgICAgICAgICAgIE9uZU9yTW9yZSh0ZXJtKS5wYXJzZVN0cmluZygiYWJjIDEyMyB4eXogODkwIikNCiAgICAgICAgDQogICAgICAgIHByaW50czo6DQogICAgICAgICAgICBNYXRjaCBhbHBoYXdvcmQgYXQgbG9jIDAoMSwxKQ0KICAgICAgICAgICAgTWF0Y2hlZCBhbHBoYXdvcmQgLT4gWydhYmMnXQ0KICAgICAgICAgICAgTWF0Y2ggYWxwaGF3b3JkIGF0IGxvYyAzKDEsNCkNCiAgICAgICAgICAgIEV4Y2VwdGlvbiByYWlzZWQ6RXhwZWN0ZWQgYWxwaGF3b3JkIChhdCBjaGFyIDQpLCAobGluZToxLCBjb2w6NSkNCiAgICAgICAgICAgIE1hdGNoIGFscGhhd29yZCBhdCBsb2MgNygxLDgpDQogICAgICAgICAgICBNYXRjaGVkIGFscGhhd29yZCAtPiBbJ3h5eiddDQogICAgICAgICAgICBNYXRjaCBhbHBoYXdvcmQgYXQgbG9jIDExKDEsMTIpDQogICAgICAgICAgICBFeGNlcHRpb24gcmFpc2VkOkV4cGVjdGVkIGFscGhhd29yZCAoYXQgY2hhciAxMiksIChsaW5lOjEsIGNvbDoxMykNCiAgICAgICAgICAgIE1hdGNoIGFscGhhd29yZCBhdCBsb2MgMTUoMSwxNikNCiAgICAgICAgICAgIEV4Y2VwdGlvbiByYWlzZWQ6RXhwZWN0ZWQgYWxwaGF3b3JkIChhdCBjaGFyIDE1KSwgKGxpbmU6MSwgY29sOjE2KQ0KDQogICAgICAgIFRoZSBvdXRwdXQgc2hvd24gaXMgdGhhdCBwcm9kdWNlZCBieSB0aGUgZGVmYXVsdCBkZWJ1ZyBhY3Rpb25zIC0gY3VzdG9tIGRlYnVnIGFjdGlvbnMgY2FuIGJlDQogICAgICAgIHNwZWNpZmllZCB1c2luZyBMe3NldERlYnVnQWN0aW9uc30uIFByaW9yIHRvIGF0dGVtcHRpbmcNCiAgICAgICAgdG8gbWF0Y2ggdGhlIEN7d2R9IGV4cHJlc3Npb24sIHRoZSBkZWJ1Z2dpbmcgbWVzc2FnZSBDeyJNYXRjaCA8ZXhwcm5hbWU+IGF0IGxvYyA8bj4oPGxpbmU+LDxjb2w+KSJ9DQogICAgICAgIGlzIHNob3duLiBUaGVuIGlmIHRoZSBwYXJzZSBzdWNjZWVkcywgYSBDeyJNYXRjaGVkIn0gbWVzc2FnZSBpcyBzaG93biwgb3IgYW4gQ3siRXhjZXB0aW9uIHJhaXNlZCJ9DQogICAgICAgIG1lc3NhZ2UgaXMgc2hvd24uIEFsc28gbm90ZSB0aGUgdXNlIG9mIEx7c2V0TmFtZX0gdG8gYXNzaWduIGEgaHVtYW4tcmVhZGFibGUgbmFtZSB0byB0aGUgZXhwcmVzc2lvbiwNCiAgICAgICAgd2hpY2ggbWFrZXMgZGVidWdnaW5nIGFuZCBleGNlcHRpb24gbWVzc2FnZXMgZWFzaWVyIHRvIHVuZGVyc3RhbmQgLSBmb3IgaW5zdGFuY2UsIHRoZSBkZWZhdWx0DQogICAgICAgIG5hbWUgY3JlYXRlZCBmb3IgdGhlIEN7V29yZH0gZXhwcmVzc2lvbiB3aXRob3V0IGNhbGxpbmcgQ3tzZXROYW1lfSBpcyBDeyJXOihBQkNELi4uKSJ9Lg0KICAgICAgICAiIiINCiAgICAgICAgaWYgZmxhZzoNCiAgICAgICAgICAgIHNlbGYuc2V0RGVidWdBY3Rpb25zKCBfZGVmYXVsdFN0YXJ0RGVidWdBY3Rpb24sIF9kZWZhdWx0U3VjY2Vzc0RlYnVnQWN0aW9uLCBfZGVmYXVsdEV4Y2VwdGlvbkRlYnVnQWN0aW9uICkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYuZGVidWcgPSBGYWxzZQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgcmV0dXJuIHNlbGYubmFtZQ0KDQogICAgZGVmIF9fcmVwcl9fKCBzZWxmICk6DQogICAgICAgIHJldHVybiBfdXN0cihzZWxmKQ0KDQogICAgZGVmIHN0cmVhbWxpbmUoIHNlbGYgKToNCiAgICAgICAgc2VsZi5zdHJlYW1saW5lZCA9IFRydWUNCiAgICAgICAgc2VsZi5zdHJSZXByID0gTm9uZQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIGNoZWNrUmVjdXJzaW9uKCBzZWxmLCBwYXJzZUVsZW1lbnRMaXN0ICk6DQogICAgICAgIHBhc3MNCg0KICAgIGRlZiB2YWxpZGF0ZSggc2VsZiwgdmFsaWRhdGVUcmFjZT1bXSApOg0KICAgICAgICAiIiINCiAgICAgICAgQ2hlY2sgZGVmaW5lZCBleHByZXNzaW9ucyBmb3IgdmFsaWQgc3RydWN0dXJlLCBjaGVjayBmb3IgaW5maW5pdGUgcmVjdXJzaXZlIGRlZmluaXRpb25zLg0KICAgICAgICAiIiINCiAgICAgICAgc2VsZi5jaGVja1JlY3Vyc2lvbiggW10gKQ0KDQogICAgZGVmIHBhcnNlRmlsZSggc2VsZiwgZmlsZV9vcl9maWxlbmFtZSwgcGFyc2VBbGw9RmFsc2UgKToNCiAgICAgICAgIiIiDQogICAgICAgIEV4ZWN1dGUgdGhlIHBhcnNlIGV4cHJlc3Npb24gb24gdGhlIGdpdmVuIGZpbGUgb3IgZmlsZW5hbWUuDQogICAgICAgIElmIGEgZmlsZW5hbWUgaXMgc3BlY2lmaWVkIChpbnN0ZWFkIG9mIGEgZmlsZSBvYmplY3QpLA0KICAgICAgICB0aGUgZW50aXJlIGZpbGUgaXMgb3BlbmVkLCByZWFkLCBhbmQgY2xvc2VkIGJlZm9yZSBwYXJzaW5nLg0KICAgICAgICAiIiINCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgZmlsZV9jb250ZW50cyA9IGZpbGVfb3JfZmlsZW5hbWUucmVhZCgpDQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoNCiAgICAgICAgICAgIHdpdGggb3BlbihmaWxlX29yX2ZpbGVuYW1lLCAiciIpIGFzIGY6DQogICAgICAgICAgICAgICAgZmlsZV9jb250ZW50cyA9IGYucmVhZCgpDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlU3RyaW5nKGZpbGVfY29udGVudHMsIHBhcnNlQWxsKQ0KICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIGV4YzoNCiAgICAgICAgICAgIGlmIFBhcnNlckVsZW1lbnQudmVyYm9zZV9zdGFja3RyYWNlOg0KICAgICAgICAgICAgICAgIHJhaXNlDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICMgY2F0Y2ggYW5kIHJlLXJhaXNlIGV4Y2VwdGlvbiBmcm9tIGhlcmUsIGNsZWFycyBvdXQgcHlwYXJzaW5nIGludGVybmFsIHN0YWNrIHRyYWNlDQogICAgICAgICAgICAgICAgcmFpc2UgZXhjDQoNCiAgICBkZWYgX19lcV9fKHNlbGYsb3RoZXIpOg0KICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBQYXJzZXJFbGVtZW50KToNCiAgICAgICAgICAgIHJldHVybiBzZWxmIGlzIG90aGVyIG9yIHZhcnMoc2VsZikgPT0gdmFycyhvdGhlcikNCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKG90aGVyLCBiYXNlc3RyaW5nKToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLm1hdGNoZXMob3RoZXIpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByZXR1cm4gc3VwZXIoUGFyc2VyRWxlbWVudCxzZWxmKT09b3RoZXINCg0KICAgIGRlZiBfX25lX18oc2VsZixvdGhlcik6DQogICAgICAgIHJldHVybiBub3QgKHNlbGYgPT0gb3RoZXIpDQoNCiAgICBkZWYgX19oYXNoX18oc2VsZik6DQogICAgICAgIHJldHVybiBoYXNoKGlkKHNlbGYpKQ0KDQogICAgZGVmIF9fcmVxX18oc2VsZixvdGhlcik6DQogICAgICAgIHJldHVybiBzZWxmID09IG90aGVyDQoNCiAgICBkZWYgX19ybmVfXyhzZWxmLG90aGVyKToNCiAgICAgICAgcmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikNCg0KICAgIGRlZiBtYXRjaGVzKHNlbGYsIHRlc3RTdHJpbmcsIHBhcnNlQWxsPVRydWUpOg0KICAgICAgICAiIiINCiAgICAgICAgTWV0aG9kIGZvciBxdWljayB0ZXN0aW5nIG9mIGEgcGFyc2VyIGFnYWluc3QgYSB0ZXN0IHN0cmluZy4gR29vZCBmb3Igc2ltcGxlIA0KICAgICAgICBpbmxpbmUgbWljcm90ZXN0cyBvZiBzdWIgZXhwcmVzc2lvbnMgd2hpbGUgYnVpbGRpbmcgdXAgbGFyZ2VyIHBhcnNlci4NCiAgICAgICAgICAgDQogICAgICAgIFBhcmFtZXRlcnM6DQogICAgICAgICAtIHRlc3RTdHJpbmcgLSB0byB0ZXN0IGFnYWluc3QgdGhpcyBleHByZXNzaW9uIGZvciBhIG1hdGNoDQogICAgICAgICAtIHBhcnNlQWxsIC0gKGRlZmF1bHQ9Q3tUcnVlfSkgLSBmbGFnIHRvIHBhc3MgdG8gQ3tMe3BhcnNlU3RyaW5nfX0gd2hlbiBydW5uaW5nIHRlc3RzDQogICAgICAgICAgICANCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBleHByID0gV29yZChudW1zKQ0KICAgICAgICAgICAgYXNzZXJ0IGV4cHIubWF0Y2hlcygiMTAwIikNCiAgICAgICAgIiIiDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHNlbGYucGFyc2VTdHJpbmcoX3VzdHIodGVzdFN0cmluZyksIHBhcnNlQWxsPXBhcnNlQWxsKQ0KICAgICAgICAgICAgcmV0dXJuIFRydWUNCiAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbjoNCiAgICAgICAgICAgIHJldHVybiBGYWxzZQ0KICAgICAgICAgICAgICAgIA0KICAgIGRlZiBydW5UZXN0cyhzZWxmLCB0ZXN0cywgcGFyc2VBbGw9VHJ1ZSwgY29tbWVudD0nIycsIGZ1bGxEdW1wPVRydWUsIHByaW50UmVzdWx0cz1UcnVlLCBmYWlsdXJlVGVzdHM9RmFsc2UpOg0KICAgICAgICAiIiINCiAgICAgICAgRXhlY3V0ZSB0aGUgcGFyc2UgZXhwcmVzc2lvbiBvbiBhIHNlcmllcyBvZiB0ZXN0IHN0cmluZ3MsIHNob3dpbmcgZWFjaA0KICAgICAgICB0ZXN0LCB0aGUgcGFyc2VkIHJlc3VsdHMgb3Igd2hlcmUgdGhlIHBhcnNlIGZhaWxlZC4gUXVpY2sgYW5kIGVhc3kgd2F5IHRvDQogICAgICAgIHJ1biBhIHBhcnNlIGV4cHJlc3Npb24gYWdhaW5zdCBhIGxpc3Qgb2Ygc2FtcGxlIHN0cmluZ3MuDQogICAgICAgICAgIA0KICAgICAgICBQYXJhbWV0ZXJzOg0KICAgICAgICAgLSB0ZXN0cyAtIGEgbGlzdCBvZiBzZXBhcmF0ZSB0ZXN0IHN0cmluZ3MsIG9yIGEgbXVsdGlsaW5lIHN0cmluZyBvZiB0ZXN0IHN0cmluZ3MNCiAgICAgICAgIC0gcGFyc2VBbGwgLSAoZGVmYXVsdD1De1RydWV9KSAtIGZsYWcgdG8gcGFzcyB0byBDe0x7cGFyc2VTdHJpbmd9fSB3aGVuIHJ1bm5pbmcgdGVzdHMgICAgICAgICAgIA0KICAgICAgICAgLSBjb21tZW50IC0gKGRlZmF1bHQ9Q3snIyd9KSAtIGV4cHJlc3Npb24gZm9yIGluZGljYXRpbmcgZW1iZWRkZWQgY29tbWVudHMgaW4gdGhlIHRlc3QgDQogICAgICAgICAgICAgIHN0cmluZzsgcGFzcyBOb25lIHRvIGRpc2FibGUgY29tbWVudCBmaWx0ZXJpbmcNCiAgICAgICAgIC0gZnVsbER1bXAgLSAoZGVmYXVsdD1De1RydWV9KSAtIGR1bXAgcmVzdWx0cyBhcyBsaXN0IGZvbGxvd2VkIGJ5IHJlc3VsdHMgbmFtZXMgaW4gbmVzdGVkIG91dGxpbmU7DQogICAgICAgICAgICAgIGlmIEZhbHNlLCBvbmx5IGR1bXAgbmVzdGVkIGxpc3QNCiAgICAgICAgIC0gcHJpbnRSZXN1bHRzIC0gKGRlZmF1bHQ9Q3tUcnVlfSkgcHJpbnRzIHRlc3Qgb3V0cHV0IHRvIHN0ZG91dA0KICAgICAgICAgLSBmYWlsdXJlVGVzdHMgLSAoZGVmYXVsdD1De0ZhbHNlfSkgaW5kaWNhdGVzIGlmIHRoZXNlIHRlc3RzIGFyZSBleHBlY3RlZCB0byBmYWlsIHBhcnNpbmcNCg0KICAgICAgICBSZXR1cm5zOiBhIChzdWNjZXNzLCByZXN1bHRzKSB0dXBsZSwgd2hlcmUgc3VjY2VzcyBpbmRpY2F0ZXMgdGhhdCBhbGwgdGVzdHMgc3VjY2VlZGVkDQogICAgICAgIChvciBmYWlsZWQgaWYgQ3tmYWlsdXJlVGVzdHN9IGlzIFRydWUpLCBhbmQgdGhlIHJlc3VsdHMgY29udGFpbiBhIGxpc3Qgb2YgbGluZXMgb2YgZWFjaCANCiAgICAgICAgdGVzdCdzIG91dHB1dA0KICAgICAgICANCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBudW1iZXJfZXhwciA9IHB5cGFyc2luZ19jb21tb24ubnVtYmVyLmNvcHkoKQ0KDQogICAgICAgICAgICByZXN1bHQgPSBudW1iZXJfZXhwci5ydW5UZXN0cygnJycNCiAgICAgICAgICAgICAgICAjIHVuc2lnbmVkIGludGVnZXINCiAgICAgICAgICAgICAgICAxMDANCiAgICAgICAgICAgICAgICAjIG5lZ2F0aXZlIGludGVnZXINCiAgICAgICAgICAgICAgICAtMTAwDQogICAgICAgICAgICAgICAgIyBmbG9hdCB3aXRoIHNjaWVudGlmaWMgbm90YXRpb24NCiAgICAgICAgICAgICAgICA2LjAyZTIzDQogICAgICAgICAgICAgICAgIyBpbnRlZ2VyIHdpdGggc2NpZW50aWZpYyBub3RhdGlvbg0KICAgICAgICAgICAgICAgIDFlLTEyDQogICAgICAgICAgICAgICAgJycnKQ0KICAgICAgICAgICAgcHJpbnQoIlN1Y2Nlc3MiIGlmIHJlc3VsdFswXSBlbHNlICJGYWlsZWQhIikNCg0KICAgICAgICAgICAgcmVzdWx0ID0gbnVtYmVyX2V4cHIucnVuVGVzdHMoJycnDQogICAgICAgICAgICAgICAgIyBzdHJheSBjaGFyYWN0ZXINCiAgICAgICAgICAgICAgICAxMDBaDQogICAgICAgICAgICAgICAgIyBtaXNzaW5nIGxlYWRpbmcgZGlnaXQgYmVmb3JlICcuJw0KICAgICAgICAgICAgICAgIC0uMTAwDQogICAgICAgICAgICAgICAgIyB0b28gbWFueSAnLicNCiAgICAgICAgICAgICAgICAzLjE0LjE1OQ0KICAgICAgICAgICAgICAgICcnJywgZmFpbHVyZVRlc3RzPVRydWUpDQogICAgICAgICAgICBwcmludCgiU3VjY2VzcyIgaWYgcmVzdWx0WzBdIGVsc2UgIkZhaWxlZCEiKQ0KICAgICAgICBwcmludHM6Og0KICAgICAgICAgICAgIyB1bnNpZ25lZCBpbnRlZ2VyDQogICAgICAgICAgICAxMDANCiAgICAgICAgICAgIFsxMDBdDQoNCiAgICAgICAgICAgICMgbmVnYXRpdmUgaW50ZWdlcg0KICAgICAgICAgICAgLTEwMA0KICAgICAgICAgICAgWy0xMDBdDQoNCiAgICAgICAgICAgICMgZmxvYXQgd2l0aCBzY2llbnRpZmljIG5vdGF0aW9uDQogICAgICAgICAgICA2LjAyZTIzDQogICAgICAgICAgICBbNi4wMmUrMjNdDQoNCiAgICAgICAgICAgICMgaW50ZWdlciB3aXRoIHNjaWVudGlmaWMgbm90YXRpb24NCiAgICAgICAgICAgIDFlLTEyDQogICAgICAgICAgICBbMWUtMTJdDQoNCiAgICAgICAgICAgIFN1Y2Nlc3MNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgIyBzdHJheSBjaGFyYWN0ZXINCiAgICAgICAgICAgIDEwMFoNCiAgICAgICAgICAgICAgIF4NCiAgICAgICAgICAgIEZBSUw6IEV4cGVjdGVkIGVuZCBvZiB0ZXh0IChhdCBjaGFyIDMpLCAobGluZToxLCBjb2w6NCkNCg0KICAgICAgICAgICAgIyBtaXNzaW5nIGxlYWRpbmcgZGlnaXQgYmVmb3JlICcuJw0KICAgICAgICAgICAgLS4xMDANCiAgICAgICAgICAgIF4NCiAgICAgICAgICAgIEZBSUw6IEV4cGVjdGVkIHtyZWFsIG51bWJlciB3aXRoIHNjaWVudGlmaWMgbm90YXRpb24gfCByZWFsIG51bWJlciB8IHNpZ25lZCBpbnRlZ2VyfSAoYXQgY2hhciAwKSwgKGxpbmU6MSwgY29sOjEpDQoNCiAgICAgICAgICAgICMgdG9vIG1hbnkgJy4nDQogICAgICAgICAgICAzLjE0LjE1OQ0KICAgICAgICAgICAgICAgIF4NCiAgICAgICAgICAgIEZBSUw6IEV4cGVjdGVkIGVuZCBvZiB0ZXh0IChhdCBjaGFyIDQpLCAobGluZToxLCBjb2w6NSkNCg0KICAgICAgICAgICAgU3VjY2Vzcw0KDQogICAgICAgIEVhY2ggdGVzdCBzdHJpbmcgbXVzdCBiZSBvbiBhIHNpbmdsZSBsaW5lLiBJZiB5b3Ugd2FudCB0byB0ZXN0IGEgc3RyaW5nIHRoYXQgc3BhbnMgbXVsdGlwbGUNCiAgICAgICAgbGluZXMsIGNyZWF0ZSBhIHRlc3QgbGlrZSB0aGlzOjoNCg0KICAgICAgICAgICAgZXhwci5ydW5UZXN0KHIidGhpcyBpcyBhIHRlc3RcXG4gb2Ygc3RyaW5ncyB0aGF0IHNwYW5zIFxcbiAzIGxpbmVzIikNCiAgICAgICAgDQogICAgICAgIChOb3RlIHRoYXQgdGhpcyBpcyBhIHJhdyBzdHJpbmcgbGl0ZXJhbCwgeW91IG11c3QgaW5jbHVkZSB0aGUgbGVhZGluZyAncicuKQ0KICAgICAgICAiIiINCiAgICAgICAgaWYgaXNpbnN0YW5jZSh0ZXN0cywgYmFzZXN0cmluZyk6DQogICAgICAgICAgICB0ZXN0cyA9IGxpc3QobWFwKHN0ci5zdHJpcCwgdGVzdHMucnN0cmlwKCkuc3BsaXRsaW5lcygpKSkNCiAgICAgICAgaWYgaXNpbnN0YW5jZShjb21tZW50LCBiYXNlc3RyaW5nKToNCiAgICAgICAgICAgIGNvbW1lbnQgPSBMaXRlcmFsKGNvbW1lbnQpDQogICAgICAgIGFsbFJlc3VsdHMgPSBbXQ0KICAgICAgICBjb21tZW50cyA9IFtdDQogICAgICAgIHN1Y2Nlc3MgPSBUcnVlDQogICAgICAgIGZvciB0IGluIHRlc3RzOg0KICAgICAgICAgICAgaWYgY29tbWVudCBpcyBub3QgTm9uZSBhbmQgY29tbWVudC5tYXRjaGVzKHQsIEZhbHNlKSBvciBjb21tZW50cyBhbmQgbm90IHQ6DQogICAgICAgICAgICAgICAgY29tbWVudHMuYXBwZW5kKHQpDQogICAgICAgICAgICAgICAgY29udGludWUNCiAgICAgICAgICAgIGlmIG5vdCB0Og0KICAgICAgICAgICAgICAgIGNvbnRpbnVlDQogICAgICAgICAgICBvdXQgPSBbJ1xuJy5qb2luKGNvbW1lbnRzKSwgdF0NCiAgICAgICAgICAgIGNvbW1lbnRzID0gW10NCiAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICB0ID0gdC5yZXBsYWNlKHInXG4nLCdcbicpDQogICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5wYXJzZVN0cmluZyh0LCBwYXJzZUFsbD1wYXJzZUFsbCkNCiAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKHJlc3VsdC5kdW1wKGZ1bGw9ZnVsbER1bXApKQ0KICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBzdWNjZXNzIGFuZCBub3QgZmFpbHVyZVRlc3RzDQogICAgICAgICAgICBleGNlcHQgUGFyc2VCYXNlRXhjZXB0aW9uIGFzIHBlOg0KICAgICAgICAgICAgICAgIGZhdGFsID0gIihGQVRBTCkiIGlmIGlzaW5zdGFuY2UocGUsIFBhcnNlRmF0YWxFeGNlcHRpb24pIGVsc2UgIiINCiAgICAgICAgICAgICAgICBpZiAnXG4nIGluIHQ6DQogICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQobGluZShwZS5sb2MsIHQpKQ0KICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCcgJyooY29sKHBlLmxvYyx0KS0xKSArICdeJyArIGZhdGFsKQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoJyAnKnBlLmxvYyArICdeJyArIGZhdGFsKQ0KICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIkZBSUw6ICIgKyBzdHIocGUpKQ0KICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBzdWNjZXNzIGFuZCBmYWlsdXJlVGVzdHMNCiAgICAgICAgICAgICAgICByZXN1bHQgPSBwZQ0KICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGM6DQogICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgiRkFJTC1FWENFUFRJT046ICIgKyBzdHIoZXhjKSkNCiAgICAgICAgICAgICAgICBzdWNjZXNzID0gc3VjY2VzcyBhbmQgZmFpbHVyZVRlc3RzDQogICAgICAgICAgICAgICAgcmVzdWx0ID0gZXhjDQoNCiAgICAgICAgICAgIGlmIHByaW50UmVzdWx0czoNCiAgICAgICAgICAgICAgICBpZiBmdWxsRHVtcDoNCiAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgnJykNCiAgICAgICAgICAgICAgICBwcmludCgnXG4nLmpvaW4ob3V0KSkNCg0KICAgICAgICAgICAgYWxsUmVzdWx0cy5hcHBlbmQoKHQsIHJlc3VsdCkpDQogICAgICAgIA0KICAgICAgICByZXR1cm4gc3VjY2VzcywgYWxsUmVzdWx0cw0KDQogICAgICAgIA0KY2xhc3MgVG9rZW4oUGFyc2VyRWxlbWVudCk6DQogICAgIiIiDQogICAgQWJzdHJhY3QgQ3tQYXJzZXJFbGVtZW50fSBzdWJjbGFzcywgZm9yIGRlZmluaW5nIGF0b21pYyBtYXRjaGluZyBwYXR0ZXJucy4NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYgKToNCiAgICAgICAgc3VwZXIoVG9rZW4sc2VsZikuX19pbml0X18oIHNhdmVsaXN0PUZhbHNlICkNCg0KDQpjbGFzcyBFbXB0eShUb2tlbik6DQogICAgIiIiDQogICAgQW4gZW1wdHkgdG9rZW4sIHdpbGwgYWx3YXlzIG1hdGNoLg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiApOg0KICAgICAgICBzdXBlcihFbXB0eSxzZWxmKS5fX2luaXRfXygpDQogICAgICAgIHNlbGYubmFtZSA9ICJFbXB0eSINCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUNCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UNCg0KDQpjbGFzcyBOb01hdGNoKFRva2VuKToNCiAgICAiIiINCiAgICBBIHRva2VuIHRoYXQgd2lsbCBuZXZlciBtYXRjaC4NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYgKToNCiAgICAgICAgc3VwZXIoTm9NYXRjaCxzZWxmKS5fX2luaXRfXygpDQogICAgICAgIHNlbGYubmFtZSA9ICJOb01hdGNoIg0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQ0KICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJVbm1hdGNoYWJsZSB0b2tlbiINCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQoNCmNsYXNzIExpdGVyYWwoVG9rZW4pOg0KICAgICIiIg0KICAgIFRva2VuIHRvIGV4YWN0bHkgbWF0Y2ggYSBzcGVjaWZpZWQgc3RyaW5nLg0KICAgIA0KICAgIEV4YW1wbGU6Og0KICAgICAgICBMaXRlcmFsKCdibGFoJykucGFyc2VTdHJpbmcoJ2JsYWgnKSAgIyAtPiBbJ2JsYWgnXQ0KICAgICAgICBMaXRlcmFsKCdibGFoJykucGFyc2VTdHJpbmcoJ2JsYWhmb29ibGFoJykgICMgLT4gWydibGFoJ10NCiAgICAgICAgTGl0ZXJhbCgnYmxhaCcpLnBhcnNlU3RyaW5nKCdibGEnKSAgIyAtPiBFeGNlcHRpb246IEV4cGVjdGVkICJibGFoIg0KICAgIA0KICAgIEZvciBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoaW5nLCB1c2UgTHtDYXNlbGVzc0xpdGVyYWx9Lg0KICAgIA0KICAgIEZvciBrZXl3b3JkIG1hdGNoaW5nIChmb3JjZSB3b3JkIGJyZWFrIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIG1hdGNoZWQgc3RyaW5nKSwNCiAgICB1c2UgTHtLZXl3b3JkfSBvciBMe0Nhc2VsZXNzS2V5d29yZH0uDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBtYXRjaFN0cmluZyApOg0KICAgICAgICBzdXBlcihMaXRlcmFsLHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgc2VsZi5tYXRjaCA9IG1hdGNoU3RyaW5nDQogICAgICAgIHNlbGYubWF0Y2hMZW4gPSBsZW4obWF0Y2hTdHJpbmcpDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHNlbGYuZmlyc3RNYXRjaENoYXIgPSBtYXRjaFN0cmluZ1swXQ0KICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIm51bGwgc3RyaW5nIHBhc3NlZCB0byBMaXRlcmFsOyB1c2UgRW1wdHkoKSBpbnN0ZWFkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgICAgICAgICBzZWxmLl9fY2xhc3NfXyA9IEVtcHR5DQogICAgICAgIHNlbGYubmFtZSA9ICciJXMiJyAlIF91c3RyKHNlbGYubWF0Y2gpDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICIgKyBzZWxmLm5hbWUNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IEZhbHNlDQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlDQoNCiAgICAjIFBlcmZvcm1hbmNlIHR1bmluZzogdGhpcyByb3V0aW5lIGdldHMgY2FsbGVkIGEgKmxvdCoNCiAgICAjIGlmIHRoaXMgaXMgYSBzaW5nbGUgY2hhcmFjdGVyIG1hdGNoIHN0cmluZyAgYW5kIHRoZSBmaXJzdCBjaGFyYWN0ZXIgbWF0Y2hlcywNCiAgICAjIHNob3J0LWNpcmN1aXQgYXMgcXVpY2tseSBhcyBwb3NzaWJsZSwgYW5kIGF2b2lkIGNhbGxpbmcgc3RhcnRzd2l0aA0KICAgICN+IEBwcm9maWxlDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgKGluc3RyaW5nW2xvY10gPT0gc2VsZi5maXJzdE1hdGNoQ2hhciBhbmQNCiAgICAgICAgICAgIChzZWxmLm1hdGNoTGVuPT0xIG9yIGluc3RyaW5nLnN0YXJ0c3dpdGgoc2VsZi5tYXRjaCxsb2MpKSApOg0KICAgICAgICAgICAgcmV0dXJuIGxvYytzZWxmLm1hdGNoTGVuLCBzZWxmLm1hdGNoDQogICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KX0wgPSBMaXRlcmFsDQpQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MgPSBMaXRlcmFsDQoNCmNsYXNzIEtleXdvcmQoVG9rZW4pOg0KICAgICIiIg0KICAgIFRva2VuIHRvIGV4YWN0bHkgbWF0Y2ggYSBzcGVjaWZpZWQgc3RyaW5nIGFzIGEga2V5d29yZCwgdGhhdCBpcywgaXQgbXVzdCBiZQ0KICAgIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGEgbm9uLWtleXdvcmQgY2hhcmFjdGVyLiAgQ29tcGFyZSB3aXRoIEN7THtMaXRlcmFsfX06DQogICAgIC0gQ3tMaXRlcmFsKCJpZiIpfSB3aWxsIG1hdGNoIHRoZSBsZWFkaW5nIEN7J2lmJ30gaW4gQ3snaWZBbmRPbmx5SWYnfS4NCiAgICAgLSBDe0tleXdvcmQoImlmIil9IHdpbGwgbm90OyBpdCB3aWxsIG9ubHkgbWF0Y2ggdGhlIGxlYWRpbmcgQ3snaWYnfSBpbiBDeydpZiB4PTEnfSwgb3IgQ3snaWYoeT09MiknfQ0KICAgIEFjY2VwdHMgdHdvIG9wdGlvbmFsIGNvbnN0cnVjdG9yIGFyZ3VtZW50cyBpbiBhZGRpdGlvbiB0byB0aGUga2V5d29yZCBzdHJpbmc6DQogICAgIC0gQ3tpZGVudENoYXJzfSBpcyBhIHN0cmluZyBvZiBjaGFyYWN0ZXJzIHRoYXQgd291bGQgYmUgdmFsaWQgaWRlbnRpZmllciBjaGFyYWN0ZXJzLA0KICAgICAgICAgIGRlZmF1bHRpbmcgdG8gYWxsIGFscGhhbnVtZXJpY3MgKyAiXyIgYW5kICIkIg0KICAgICAtIEN7Y2FzZWxlc3N9IGFsbG93cyBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoaW5nLCBkZWZhdWx0IGlzIEN7RmFsc2V9Lg0KICAgICAgIA0KICAgIEV4YW1wbGU6Og0KICAgICAgICBLZXl3b3JkKCJzdGFydCIpLnBhcnNlU3RyaW5nKCJzdGFydCIpICAjIC0+IFsnc3RhcnQnXQ0KICAgICAgICBLZXl3b3JkKCJzdGFydCIpLnBhcnNlU3RyaW5nKCJzdGFydGluZyIpICAjIC0+IEV4Y2VwdGlvbg0KDQogICAgRm9yIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2hpbmcsIHVzZSBMe0Nhc2VsZXNzS2V5d29yZH0uDQogICAgIiIiDQogICAgREVGQVVMVF9LRVlXT1JEX0NIQVJTID0gYWxwaGFudW1zKyJfJCINCg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgbWF0Y2hTdHJpbmcsIGlkZW50Q2hhcnM9Tm9uZSwgY2FzZWxlc3M9RmFsc2UgKToNCiAgICAgICAgc3VwZXIoS2V5d29yZCxzZWxmKS5fX2luaXRfXygpDQogICAgICAgIGlmIGlkZW50Q2hhcnMgaXMgTm9uZToNCiAgICAgICAgICAgIGlkZW50Q2hhcnMgPSBLZXl3b3JkLkRFRkFVTFRfS0VZV09SRF9DSEFSUw0KICAgICAgICBzZWxmLm1hdGNoID0gbWF0Y2hTdHJpbmcNCiAgICAgICAgc2VsZi5tYXRjaExlbiA9IGxlbihtYXRjaFN0cmluZykNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgc2VsZi5maXJzdE1hdGNoQ2hhciA9IG1hdGNoU3RyaW5nWzBdDQogICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOg0KICAgICAgICAgICAgd2FybmluZ3Mud2FybigibnVsbCBzdHJpbmcgcGFzc2VkIHRvIEtleXdvcmQ7IHVzZSBFbXB0eSgpIGluc3RlYWQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICAgICAgc2VsZi5uYW1lID0gJyIlcyInICUgc2VsZi5tYXRjaA0KICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAiICsgc2VsZi5uYW1lDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBGYWxzZQ0KICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQ0KICAgICAgICBzZWxmLmNhc2VsZXNzID0gY2FzZWxlc3MNCiAgICAgICAgaWYgY2FzZWxlc3M6DQogICAgICAgICAgICBzZWxmLmNhc2VsZXNzbWF0Y2ggPSBtYXRjaFN0cmluZy51cHBlcigpDQogICAgICAgICAgICBpZGVudENoYXJzID0gaWRlbnRDaGFycy51cHBlcigpDQogICAgICAgIHNlbGYuaWRlbnRDaGFycyA9IHNldChpZGVudENoYXJzKQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgc2VsZi5jYXNlbGVzczoNCiAgICAgICAgICAgIGlmICggKGluc3RyaW5nWyBsb2M6bG9jK3NlbGYubWF0Y2hMZW4gXS51cHBlcigpID09IHNlbGYuY2FzZWxlc3NtYXRjaCkgYW5kDQogICAgICAgICAgICAgICAgIChsb2MgPj0gbGVuKGluc3RyaW5nKS1zZWxmLm1hdGNoTGVuIG9yIGluc3RyaW5nW2xvYytzZWxmLm1hdGNoTGVuXS51cHBlcigpIG5vdCBpbiBzZWxmLmlkZW50Q2hhcnMpIGFuZA0KICAgICAgICAgICAgICAgICAobG9jID09IDAgb3IgaW5zdHJpbmdbbG9jLTFdLnVwcGVyKCkgbm90IGluIHNlbGYuaWRlbnRDaGFycykgKToNCiAgICAgICAgICAgICAgICByZXR1cm4gbG9jK3NlbGYubWF0Y2hMZW4sIHNlbGYubWF0Y2gNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIGlmIChpbnN0cmluZ1tsb2NdID09IHNlbGYuZmlyc3RNYXRjaENoYXIgYW5kDQogICAgICAgICAgICAgICAgKHNlbGYubWF0Y2hMZW49PTEgb3IgaW5zdHJpbmcuc3RhcnRzd2l0aChzZWxmLm1hdGNoLGxvYykpIGFuZA0KICAgICAgICAgICAgICAgIChsb2MgPj0gbGVuKGluc3RyaW5nKS1zZWxmLm1hdGNoTGVuIG9yIGluc3RyaW5nW2xvYytzZWxmLm1hdGNoTGVuXSBub3QgaW4gc2VsZi5pZGVudENoYXJzKSBhbmQNCiAgICAgICAgICAgICAgICAobG9jID09IDAgb3IgaW5zdHJpbmdbbG9jLTFdIG5vdCBpbiBzZWxmLmlkZW50Q2hhcnMpICk6DQogICAgICAgICAgICAgICAgcmV0dXJuIGxvYytzZWxmLm1hdGNoTGVuLCBzZWxmLm1hdGNoDQogICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQogICAgZGVmIGNvcHkoc2VsZik6DQogICAgICAgIGMgPSBzdXBlcihLZXl3b3JkLHNlbGYpLmNvcHkoKQ0KICAgICAgICBjLmlkZW50Q2hhcnMgPSBLZXl3b3JkLkRFRkFVTFRfS0VZV09SRF9DSEFSUw0KICAgICAgICByZXR1cm4gYw0KDQogICAgQHN0YXRpY21ldGhvZA0KICAgIGRlZiBzZXREZWZhdWx0S2V5d29yZENoYXJzKCBjaGFycyApOg0KICAgICAgICAiIiJPdmVycmlkZXMgdGhlIGRlZmF1bHQgS2V5d29yZCBjaGFycw0KICAgICAgICAiIiINCiAgICAgICAgS2V5d29yZC5ERUZBVUxUX0tFWVdPUkRfQ0hBUlMgPSBjaGFycw0KDQpjbGFzcyBDYXNlbGVzc0xpdGVyYWwoTGl0ZXJhbCk6DQogICAgIiIiDQogICAgVG9rZW4gdG8gbWF0Y2ggYSBzcGVjaWZpZWQgc3RyaW5nLCBpZ25vcmluZyBjYXNlIG9mIGxldHRlcnMuDQogICAgTm90ZTogdGhlIG1hdGNoZWQgcmVzdWx0cyB3aWxsIGFsd2F5cyBiZSBpbiB0aGUgY2FzZSBvZiB0aGUgZ2l2ZW4NCiAgICBtYXRjaCBzdHJpbmcsIE5PVCB0aGUgY2FzZSBvZiB0aGUgaW5wdXQgdGV4dC4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBPbmVPck1vcmUoQ2FzZWxlc3NMaXRlcmFsKCJDTUQiKSkucGFyc2VTdHJpbmcoImNtZCBDTUQgQ21kMTAiKSAjIC0+IFsnQ01EJywgJ0NNRCcsICdDTUQnXQ0KICAgICAgICANCiAgICAoQ29udHJhc3Qgd2l0aCBleGFtcGxlIGZvciBMe0Nhc2VsZXNzS2V5d29yZH0uKQ0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgbWF0Y2hTdHJpbmcgKToNCiAgICAgICAgc3VwZXIoQ2FzZWxlc3NMaXRlcmFsLHNlbGYpLl9faW5pdF9fKCBtYXRjaFN0cmluZy51cHBlcigpICkNCiAgICAgICAgIyBQcmVzZXJ2ZSB0aGUgZGVmaW5pbmcgbGl0ZXJhbC4NCiAgICAgICAgc2VsZi5yZXR1cm5TdHJpbmcgPSBtYXRjaFN0cmluZw0KICAgICAgICBzZWxmLm5hbWUgPSAiJyVzJyIgJSBzZWxmLnJldHVyblN0cmluZw0KICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAiICsgc2VsZi5uYW1lDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiBpbnN0cmluZ1sgbG9jOmxvYytzZWxmLm1hdGNoTGVuIF0udXBwZXIoKSA9PSBzZWxmLm1hdGNoOg0KICAgICAgICAgICAgcmV0dXJuIGxvYytzZWxmLm1hdGNoTGVuLCBzZWxmLnJldHVyblN0cmluZw0KICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KY2xhc3MgQ2FzZWxlc3NLZXl3b3JkKEtleXdvcmQpOg0KICAgICIiIg0KICAgIENhc2VsZXNzIHZlcnNpb24gb2YgTHtLZXl3b3JkfS4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBPbmVPck1vcmUoQ2FzZWxlc3NLZXl3b3JkKCJDTUQiKSkucGFyc2VTdHJpbmcoImNtZCBDTUQgQ21kMTAiKSAjIC0+IFsnQ01EJywgJ0NNRCddDQogICAgICAgIA0KICAgIChDb250cmFzdCB3aXRoIGV4YW1wbGUgZm9yIEx7Q2FzZWxlc3NMaXRlcmFsfS4pDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBtYXRjaFN0cmluZywgaWRlbnRDaGFycz1Ob25lICk6DQogICAgICAgIHN1cGVyKENhc2VsZXNzS2V5d29yZCxzZWxmKS5fX2luaXRfXyggbWF0Y2hTdHJpbmcsIGlkZW50Q2hhcnMsIGNhc2VsZXNzPVRydWUgKQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgKCAoaW5zdHJpbmdbIGxvYzpsb2Mrc2VsZi5tYXRjaExlbiBdLnVwcGVyKCkgPT0gc2VsZi5jYXNlbGVzc21hdGNoKSBhbmQNCiAgICAgICAgICAgICAobG9jID49IGxlbihpbnN0cmluZyktc2VsZi5tYXRjaExlbiBvciBpbnN0cmluZ1tsb2Mrc2VsZi5tYXRjaExlbl0udXBwZXIoKSBub3QgaW4gc2VsZi5pZGVudENoYXJzKSApOg0KICAgICAgICAgICAgcmV0dXJuIGxvYytzZWxmLm1hdGNoTGVuLCBzZWxmLm1hdGNoDQogICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQpjbGFzcyBDbG9zZU1hdGNoKFRva2VuKToNCiAgICAiIiINCiAgICBBIHZhcmlhdGlvbiBvbiBMe0xpdGVyYWx9IHdoaWNoIG1hdGNoZXMgImNsb3NlIiBtYXRjaGVzLCB0aGF0IGlzLCANCiAgICBzdHJpbmdzIHdpdGggYXQgbW9zdCAnbicgbWlzbWF0Y2hpbmcgY2hhcmFjdGVycy4gQ3tDbG9zZU1hdGNofSB0YWtlcyBwYXJhbWV0ZXJzOg0KICAgICAtIEN7bWF0Y2hfc3RyaW5nfSAtIHN0cmluZyB0byBiZSBtYXRjaGVkDQogICAgIC0gQ3ttYXhNaXNtYXRjaGVzfSAtIChDe2RlZmF1bHQ9MX0pIG1heGltdW0gbnVtYmVyIG9mIG1pc21hdGNoZXMgYWxsb3dlZCB0byBjb3VudCBhcyBhIG1hdGNoDQogICAgDQogICAgVGhlIHJlc3VsdHMgZnJvbSBhIHN1Y2Nlc3NmdWwgcGFyc2Ugd2lsbCBjb250YWluIHRoZSBtYXRjaGVkIHRleHQgZnJvbSB0aGUgaW5wdXQgc3RyaW5nIGFuZCB0aGUgZm9sbG93aW5nIG5hbWVkIHJlc3VsdHM6DQogICAgIC0gQ3ttaXNtYXRjaGVzfSAtIGEgbGlzdCBvZiB0aGUgcG9zaXRpb25zIHdpdGhpbiB0aGUgbWF0Y2hfc3RyaW5nIHdoZXJlIG1pc21hdGNoZXMgd2VyZSBmb3VuZA0KICAgICAtIEN7b3JpZ2luYWx9IC0gdGhlIG9yaWdpbmFsIG1hdGNoX3N0cmluZyB1c2VkIHRvIGNvbXBhcmUgYWdhaW5zdCB0aGUgaW5wdXQgc3RyaW5nDQogICAgDQogICAgSWYgQ3ttaXNtYXRjaGVzfSBpcyBhbiBlbXB0eSBsaXN0LCB0aGVuIHRoZSBtYXRjaCB3YXMgYW4gZXhhY3QgbWF0Y2guDQogICAgDQogICAgRXhhbXBsZTo6DQogICAgICAgIHBhdHQgPSBDbG9zZU1hdGNoKCJBVENBVENHQUFUR0dBIikNCiAgICAgICAgcGF0dC5wYXJzZVN0cmluZygiQVRDQVRDR0FBWEdHQSIpICMgLT4gKFsnQVRDQVRDR0FBWEdHQSddLCB7J21pc21hdGNoZXMnOiBbWzldXSwgJ29yaWdpbmFsJzogWydBVENBVENHQUFUR0dBJ119KQ0KICAgICAgICBwYXR0LnBhcnNlU3RyaW5nKCJBVENBWENHQUFYR0dBIikgIyAtPiBFeGNlcHRpb246IEV4cGVjdGVkICdBVENBVENHQUFUR0dBJyAod2l0aCB1cCB0byAxIG1pc21hdGNoZXMpIChhdCBjaGFyIDApLCAobGluZToxLCBjb2w6MSkNCg0KICAgICAgICAjIGV4YWN0IG1hdGNoDQogICAgICAgIHBhdHQucGFyc2VTdHJpbmcoIkFUQ0FUQ0dBQVRHR0EiKSAjIC0+IChbJ0FUQ0FUQ0dBQVRHR0EnXSwgeydtaXNtYXRjaGVzJzogW1tdXSwgJ29yaWdpbmFsJzogWydBVENBVENHQUFUR0dBJ119KQ0KDQogICAgICAgICMgY2xvc2UgbWF0Y2ggYWxsb3dpbmcgdXAgdG8gMiBtaXNtYXRjaGVzDQogICAgICAgIHBhdHQgPSBDbG9zZU1hdGNoKCJBVENBVENHQUFUR0dBIiwgbWF4TWlzbWF0Y2hlcz0yKQ0KICAgICAgICBwYXR0LnBhcnNlU3RyaW5nKCJBVENBWENHQUFYR0dBIikgIyAtPiAoWydBVENBWENHQUFYR0dBJ10sIHsnbWlzbWF0Y2hlcyc6IFtbNCwgOV1dLCAnb3JpZ2luYWwnOiBbJ0FUQ0FUQ0dBQVRHR0EnXX0pDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hdGNoX3N0cmluZywgbWF4TWlzbWF0Y2hlcz0xKToNCiAgICAgICAgc3VwZXIoQ2xvc2VNYXRjaCxzZWxmKS5fX2luaXRfXygpDQogICAgICAgIHNlbGYubmFtZSA9IG1hdGNoX3N0cmluZw0KICAgICAgICBzZWxmLm1hdGNoX3N0cmluZyA9IG1hdGNoX3N0cmluZw0KICAgICAgICBzZWxmLm1heE1pc21hdGNoZXMgPSBtYXhNaXNtYXRjaGVzDQogICAgICAgIHNlbGYuZXJybXNnID0gIkV4cGVjdGVkICVyICh3aXRoIHVwIHRvICVkIG1pc21hdGNoZXMpIiAlIChzZWxmLm1hdGNoX3N0cmluZywgc2VsZi5tYXhNaXNtYXRjaGVzKQ0KICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQ0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gRmFsc2UNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIHN0YXJ0ID0gbG9jDQogICAgICAgIGluc3RybGVuID0gbGVuKGluc3RyaW5nKQ0KICAgICAgICBtYXhsb2MgPSBzdGFydCArIGxlbihzZWxmLm1hdGNoX3N0cmluZykNCg0KICAgICAgICBpZiBtYXhsb2MgPD0gaW5zdHJsZW46DQogICAgICAgICAgICBtYXRjaF9zdHJpbmcgPSBzZWxmLm1hdGNoX3N0cmluZw0KICAgICAgICAgICAgbWF0Y2hfc3RyaW5nbG9jID0gMA0KICAgICAgICAgICAgbWlzbWF0Y2hlcyA9IFtdDQogICAgICAgICAgICBtYXhNaXNtYXRjaGVzID0gc2VsZi5tYXhNaXNtYXRjaGVzDQoNCiAgICAgICAgICAgIGZvciBtYXRjaF9zdHJpbmdsb2Msc19tIGluIGVudW1lcmF0ZSh6aXAoaW5zdHJpbmdbbG9jOm1heGxvY10sIHNlbGYubWF0Y2hfc3RyaW5nKSk6DQogICAgICAgICAgICAgICAgc3JjLG1hdCA9IHNfbQ0KICAgICAgICAgICAgICAgIGlmIHNyYyAhPSBtYXQ6DQogICAgICAgICAgICAgICAgICAgIG1pc21hdGNoZXMuYXBwZW5kKG1hdGNoX3N0cmluZ2xvYykNCiAgICAgICAgICAgICAgICAgICAgaWYgbGVuKG1pc21hdGNoZXMpID4gbWF4TWlzbWF0Y2hlczoNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIGxvYyA9IG1hdGNoX3N0cmluZ2xvYyArIDENCiAgICAgICAgICAgICAgICByZXN1bHRzID0gUGFyc2VSZXN1bHRzKFtpbnN0cmluZ1tzdGFydDpsb2NdXSkNCiAgICAgICAgICAgICAgICByZXN1bHRzWydvcmlnaW5hbCddID0gc2VsZi5tYXRjaF9zdHJpbmcNCiAgICAgICAgICAgICAgICByZXN1bHRzWydtaXNtYXRjaGVzJ10gPSBtaXNtYXRjaGVzDQogICAgICAgICAgICAgICAgcmV0dXJuIGxvYywgcmVzdWx0cw0KDQogICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQoNCmNsYXNzIFdvcmQoVG9rZW4pOg0KICAgICIiIg0KICAgIFRva2VuIGZvciBtYXRjaGluZyB3b3JkcyBjb21wb3NlZCBvZiBhbGxvd2VkIGNoYXJhY3RlciBzZXRzLg0KICAgIERlZmluZWQgd2l0aCBzdHJpbmcgY29udGFpbmluZyBhbGwgYWxsb3dlZCBpbml0aWFsIGNoYXJhY3RlcnMsDQogICAgYW4gb3B0aW9uYWwgc3RyaW5nIGNvbnRhaW5pbmcgYWxsb3dlZCBib2R5IGNoYXJhY3RlcnMgKGlmIG9taXR0ZWQsDQogICAgZGVmYXVsdHMgdG8gdGhlIGluaXRpYWwgY2hhcmFjdGVyIHNldCksIGFuZCBhbiBvcHRpb25hbCBtaW5pbXVtLA0KICAgIG1heGltdW0sIGFuZC9vciBleGFjdCBsZW5ndGguICBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgQ3ttaW59IGlzIDEgKGENCiAgICBtaW5pbXVtIHZhbHVlIDwgMSBpcyBub3QgdmFsaWQpOyB0aGUgZGVmYXVsdCB2YWx1ZXMgZm9yIEN7bWF4fSBhbmQgQ3tleGFjdH0NCiAgICBhcmUgMCwgbWVhbmluZyBubyBtYXhpbXVtIG9yIGV4YWN0IGxlbmd0aCByZXN0cmljdGlvbi4gQW4gb3B0aW9uYWwNCiAgICBDe2V4Y2x1ZGVDaGFyc30gcGFyYW1ldGVyIGNhbiBsaXN0IGNoYXJhY3RlcnMgdGhhdCBtaWdodCBiZSBmb3VuZCBpbiANCiAgICB0aGUgaW5wdXQgQ3tib2R5Q2hhcnN9IHN0cmluZzsgdXNlZnVsIHRvIGRlZmluZSBhIHdvcmQgb2YgYWxsIHByaW50YWJsZXMNCiAgICBleGNlcHQgZm9yIG9uZSBvciB0d28gY2hhcmFjdGVycywgZm9yIGluc3RhbmNlLg0KICAgIA0KICAgIEx7c3JhbmdlfSBpcyB1c2VmdWwgZm9yIGRlZmluaW5nIGN1c3RvbSBjaGFyYWN0ZXIgc2V0IHN0cmluZ3MgZm9yIGRlZmluaW5nIA0KICAgIEN7V29yZH0gZXhwcmVzc2lvbnMsIHVzaW5nIHJhbmdlIG5vdGF0aW9uIGZyb20gcmVndWxhciBleHByZXNzaW9uIGNoYXJhY3RlciBzZXRzLg0KICAgIA0KICAgIEEgY29tbW9uIG1pc3Rha2UgaXMgdG8gdXNlIEN7V29yZH0gdG8gbWF0Y2ggYSBzcGVjaWZpYyBsaXRlcmFsIHN0cmluZywgYXMgaW4gDQogICAgQ3tXb3JkKCJBZGRyZXNzIil9LiBSZW1lbWJlciB0aGF0IEN7V29yZH0gdXNlcyB0aGUgc3RyaW5nIGFyZ3VtZW50IHRvIGRlZmluZQ0KICAgIEl7c2V0c30gb2YgbWF0Y2hhYmxlIGNoYXJhY3RlcnMuIFRoaXMgZXhwcmVzc2lvbiB3b3VsZCBtYXRjaCAiQWRkIiwgIkFBQSIsDQogICAgImRBcmVkIiwgb3IgYW55IG90aGVyIHdvcmQgbWFkZSB1cCBvZiB0aGUgY2hhcmFjdGVycyAnQScsICdkJywgJ3InLCAnZScsIGFuZCAncycuDQogICAgVG8gbWF0Y2ggYW4gZXhhY3QgbGl0ZXJhbCBzdHJpbmcsIHVzZSBMe0xpdGVyYWx9IG9yIEx7S2V5d29yZH0uDQoNCiAgICBweXBhcnNpbmcgaW5jbHVkZXMgaGVscGVyIHN0cmluZ3MgZm9yIGJ1aWxkaW5nIFdvcmRzOg0KICAgICAtIEx7YWxwaGFzfQ0KICAgICAtIEx7bnVtc30NCiAgICAgLSBMe2FscGhhbnVtc30NCiAgICAgLSBMe2hleG51bXN9DQogICAgIC0gTHthbHBoYXM4Yml0fSAoYWxwaGFiZXRpYyBjaGFyYWN0ZXJzIGluIEFTQ0lJIHJhbmdlIDEyOC0yNTUgLSBhY2NlbnRlZCwgdGlsZGVkLCB1bWxhdXRlZCwgZXRjLikNCiAgICAgLSBMe3B1bmM4Yml0fSAobm9uLWFscGhhYmV0aWMgY2hhcmFjdGVycyBpbiBBU0NJSSByYW5nZSAxMjgtMjU1IC0gY3VycmVuY3ksIHN5bWJvbHMsIHN1cGVyc2NyaXB0cywgZGlhY3JpdGljYWxzLCBldGMuKQ0KICAgICAtIEx7cHJpbnRhYmxlc30gKGFueSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIpDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgIyBhIHdvcmQgY29tcG9zZWQgb2YgZGlnaXRzDQogICAgICAgIGludGVnZXIgPSBXb3JkKG51bXMpICMgZXF1aXZhbGVudCB0byBXb3JkKCIwMTIzNDU2Nzg5Iikgb3IgV29yZChzcmFuZ2UoIjAtOSIpKQ0KICAgICAgICANCiAgICAgICAgIyBhIHdvcmQgd2l0aCBhIGxlYWRpbmcgY2FwaXRhbCwgYW5kIHplcm8gb3IgbW9yZSBsb3dlcmNhc2UNCiAgICAgICAgY2FwaXRhbF93b3JkID0gV29yZChhbHBoYXMudXBwZXIoKSwgYWxwaGFzLmxvd2VyKCkpDQoNCiAgICAgICAgIyBob3N0bmFtZXMgYXJlIGFscGhhbnVtZXJpYywgd2l0aCBsZWFkaW5nIGFscGhhLCBhbmQgJy0nDQogICAgICAgIGhvc3RuYW1lID0gV29yZChhbHBoYXMsIGFscGhhbnVtcysnLScpDQogICAgICAgIA0KICAgICAgICAjIHJvbWFuIG51bWVyYWwgKG5vdCBhIHN0cmljdCBwYXJzZXIsIGFjY2VwdHMgaW52YWxpZCBtaXggb2YgY2hhcmFjdGVycykNCiAgICAgICAgcm9tYW4gPSBXb3JkKCJJVlhMQ0RNIikNCiAgICAgICAgDQogICAgICAgICMgYW55IHN0cmluZyBvZiBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXJzLCBleGNlcHQgZm9yICcsJw0KICAgICAgICBjc3ZfdmFsdWUgPSBXb3JkKHByaW50YWJsZXMsIGV4Y2x1ZGVDaGFycz0iLCIpDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBpbml0Q2hhcnMsIGJvZHlDaGFycz1Ob25lLCBtaW49MSwgbWF4PTAsIGV4YWN0PTAsIGFzS2V5d29yZD1GYWxzZSwgZXhjbHVkZUNoYXJzPU5vbmUgKToNCiAgICAgICAgc3VwZXIoV29yZCxzZWxmKS5fX2luaXRfXygpDQogICAgICAgIGlmIGV4Y2x1ZGVDaGFyczoNCiAgICAgICAgICAgIGluaXRDaGFycyA9ICcnLmpvaW4oYyBmb3IgYyBpbiBpbml0Q2hhcnMgaWYgYyBub3QgaW4gZXhjbHVkZUNoYXJzKQ0KICAgICAgICAgICAgaWYgYm9keUNoYXJzOg0KICAgICAgICAgICAgICAgIGJvZHlDaGFycyA9ICcnLmpvaW4oYyBmb3IgYyBpbiBib2R5Q2hhcnMgaWYgYyBub3QgaW4gZXhjbHVkZUNoYXJzKQ0KICAgICAgICBzZWxmLmluaXRDaGFyc09yaWcgPSBpbml0Q2hhcnMNCiAgICAgICAgc2VsZi5pbml0Q2hhcnMgPSBzZXQoaW5pdENoYXJzKQ0KICAgICAgICBpZiBib2R5Q2hhcnMgOg0KICAgICAgICAgICAgc2VsZi5ib2R5Q2hhcnNPcmlnID0gYm9keUNoYXJzDQogICAgICAgICAgICBzZWxmLmJvZHlDaGFycyA9IHNldChib2R5Q2hhcnMpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLmJvZHlDaGFyc09yaWcgPSBpbml0Q2hhcnMNCiAgICAgICAgICAgIHNlbGYuYm9keUNoYXJzID0gc2V0KGluaXRDaGFycykNCg0KICAgICAgICBzZWxmLm1heFNwZWNpZmllZCA9IG1heCA+IDANCg0KICAgICAgICBpZiBtaW4gPCAxOg0KICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiY2Fubm90IHNwZWNpZnkgYSBtaW5pbXVtIGxlbmd0aCA8IDE7IHVzZSBPcHRpb25hbChXb3JkKCkpIGlmIHplcm8tbGVuZ3RoIHdvcmQgaXMgcGVybWl0dGVkIikNCg0KICAgICAgICBzZWxmLm1pbkxlbiA9IG1pbg0KDQogICAgICAgIGlmIG1heCA+IDA6DQogICAgICAgICAgICBzZWxmLm1heExlbiA9IG1heA0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc2VsZi5tYXhMZW4gPSBfTUFYX0lOVA0KDQogICAgICAgIGlmIGV4YWN0ID4gMDoNCiAgICAgICAgICAgIHNlbGYubWF4TGVuID0gZXhhY3QNCiAgICAgICAgICAgIHNlbGYubWluTGVuID0gZXhhY3QNCg0KICAgICAgICBzZWxmLm5hbWUgPSBfdXN0cihzZWxmKQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAiICsgc2VsZi5uYW1lDQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlDQogICAgICAgIHNlbGYuYXNLZXl3b3JkID0gYXNLZXl3b3JkDQoNCiAgICAgICAgaWYgJyAnIG5vdCBpbiBzZWxmLmluaXRDaGFyc09yaWcrc2VsZi5ib2R5Q2hhcnNPcmlnIGFuZCAobWluPT0xIGFuZCBtYXg9PTAgYW5kIGV4YWN0PT0wKToNCiAgICAgICAgICAgIGlmIHNlbGYuYm9keUNoYXJzT3JpZyA9PSBzZWxmLmluaXRDaGFyc09yaWc6DQogICAgICAgICAgICAgICAgc2VsZi5yZVN0cmluZyA9ICJbJXNdKyIgJSBfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKHNlbGYuaW5pdENoYXJzT3JpZykNCiAgICAgICAgICAgIGVsaWYgbGVuKHNlbGYuaW5pdENoYXJzT3JpZykgPT0gMToNCiAgICAgICAgICAgICAgICBzZWxmLnJlU3RyaW5nID0gIiVzWyVzXSoiICUgXA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmUuZXNjYXBlKHNlbGYuaW5pdENoYXJzT3JpZyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoc2VsZi5ib2R5Q2hhcnNPcmlnKSwpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHNlbGYucmVTdHJpbmcgPSAiWyVzXVslc10qIiAlIFwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoc2VsZi5pbml0Q2hhcnNPcmlnKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2VzY2FwZVJlZ2V4UmFuZ2VDaGFycyhzZWxmLmJvZHlDaGFyc09yaWcpLCkNCiAgICAgICAgICAgIGlmIHNlbGYuYXNLZXl3b3JkOg0KICAgICAgICAgICAgICAgIHNlbGYucmVTdHJpbmcgPSByIlxiIitzZWxmLnJlU3RyaW5nK3IiXGIiDQogICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgc2VsZi5yZSA9IHJlLmNvbXBpbGUoIHNlbGYucmVTdHJpbmcgKQ0KICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoNCiAgICAgICAgICAgICAgICBzZWxmLnJlID0gTm9uZQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgc2VsZi5yZToNCiAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYucmUubWF0Y2goaW5zdHJpbmcsbG9jKQ0KICAgICAgICAgICAgaWYgbm90IHJlc3VsdDoNCiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KICAgICAgICAgICAgbG9jID0gcmVzdWx0LmVuZCgpDQogICAgICAgICAgICByZXR1cm4gbG9jLCByZXN1bHQuZ3JvdXAoKQ0KDQogICAgICAgIGlmIG5vdChpbnN0cmluZ1sgbG9jIF0gaW4gc2VsZi5pbml0Q2hhcnMpOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCiAgICAgICAgc3RhcnQgPSBsb2MNCiAgICAgICAgbG9jICs9IDENCiAgICAgICAgaW5zdHJsZW4gPSBsZW4oaW5zdHJpbmcpDQogICAgICAgIGJvZHljaGFycyA9IHNlbGYuYm9keUNoYXJzDQogICAgICAgIG1heGxvYyA9IHN0YXJ0ICsgc2VsZi5tYXhMZW4NCiAgICAgICAgbWF4bG9jID0gbWluKCBtYXhsb2MsIGluc3RybGVuICkNCiAgICAgICAgd2hpbGUgbG9jIDwgbWF4bG9jIGFuZCBpbnN0cmluZ1tsb2NdIGluIGJvZHljaGFyczoNCiAgICAgICAgICAgIGxvYyArPSAxDQoNCiAgICAgICAgdGhyb3dFeGNlcHRpb24gPSBGYWxzZQ0KICAgICAgICBpZiBsb2MgLSBzdGFydCA8IHNlbGYubWluTGVuOg0KICAgICAgICAgICAgdGhyb3dFeGNlcHRpb24gPSBUcnVlDQogICAgICAgIGlmIHNlbGYubWF4U3BlY2lmaWVkIGFuZCBsb2MgPCBpbnN0cmxlbiBhbmQgaW5zdHJpbmdbbG9jXSBpbiBib2R5Y2hhcnM6DQogICAgICAgICAgICB0aHJvd0V4Y2VwdGlvbiA9IFRydWUNCiAgICAgICAgaWYgc2VsZi5hc0tleXdvcmQ6DQogICAgICAgICAgICBpZiAoc3RhcnQ+MCBhbmQgaW5zdHJpbmdbc3RhcnQtMV0gaW4gYm9keWNoYXJzKSBvciAobG9jPGluc3RybGVuIGFuZCBpbnN0cmluZ1tsb2NdIGluIGJvZHljaGFycyk6DQogICAgICAgICAgICAgICAgdGhyb3dFeGNlcHRpb24gPSBUcnVlDQoNCiAgICAgICAgaWYgdGhyb3dFeGNlcHRpb246DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KICAgICAgICByZXR1cm4gbG9jLCBpbnN0cmluZ1tzdGFydDpsb2NdDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICB0cnk6DQogICAgICAgICAgICByZXR1cm4gc3VwZXIoV29yZCxzZWxmKS5fX3N0cl9fKCkNCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoNCiAgICAgICAgICAgIHBhc3MNCg0KDQogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOg0KDQogICAgICAgICAgICBkZWYgY2hhcnNBc1N0cihzKToNCiAgICAgICAgICAgICAgICBpZiBsZW4ocyk+NDoNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNbOjRdKyIuLi4iDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMNCg0KICAgICAgICAgICAgaWYgKCBzZWxmLmluaXRDaGFyc09yaWcgIT0gc2VsZi5ib2R5Q2hhcnNPcmlnICk6DQogICAgICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gIlc6KCVzLCVzKSIgJSAoIGNoYXJzQXNTdHIoc2VsZi5pbml0Q2hhcnNPcmlnKSwgY2hhcnNBc1N0cihzZWxmLmJvZHlDaGFyc09yaWcpICkNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gIlc6KCVzKSIgJSBjaGFyc0FzU3RyKHNlbGYuaW5pdENoYXJzT3JpZykNCg0KICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByDQoNCg0KY2xhc3MgUmVnZXgoVG9rZW4pOg0KICAgICIiIg0KICAgIFRva2VuIGZvciBtYXRjaGluZyBzdHJpbmdzIHRoYXQgbWF0Y2ggYSBnaXZlbiByZWd1bGFyIGV4cHJlc3Npb24uDQogICAgRGVmaW5lZCB3aXRoIHN0cmluZyBzcGVjaWZ5aW5nIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gaW4gYSBmb3JtIHJlY29nbml6ZWQgYnkgdGhlIGluYnVpbHQgUHl0aG9uIHJlIG1vZHVsZS4NCiAgICBJZiB0aGUgZ2l2ZW4gcmVnZXggY29udGFpbnMgbmFtZWQgZ3JvdXBzIChkZWZpbmVkIHVzaW5nIEN7KD9QPG5hbWU+Li4uKX0pLCB0aGVzZSB3aWxsIGJlIHByZXNlcnZlZCBhcyANCiAgICBuYW1lZCBwYXJzZSByZXN1bHRzLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIHJlYWxudW0gPSBSZWdleChyIlsrLV0/XGQrXC5cZCoiKQ0KICAgICAgICBkYXRlID0gUmVnZXgocicoP1A8eWVhcj5cZHs0fSktKD9QPG1vbnRoPlxkXGQ/KS0oP1A8ZGF5PlxkXGQ/KScpDQogICAgICAgICMgcmVmOiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzI2NzM5OS9ob3ctZG8teW91LW1hdGNoLW9ubHktdmFsaWQtcm9tYW4tbnVtZXJhbHMtd2l0aC1hLXJlZ3VsYXItZXhwcmVzc2lvbg0KICAgICAgICByb21hbiA9IFJlZ2V4KHIiTXswLDR9KENNfENEfEQ/Q3swLDN9KShYQ3xYTHxMP1h7MCwzfSkoSVh8SVZ8Vj9JezAsM30pIikNCiAgICAiIiINCiAgICBjb21waWxlZFJFdHlwZSA9IHR5cGUocmUuY29tcGlsZSgiW0EtWl0iKSkNCiAgICBkZWYgX19pbml0X18oIHNlbGYsIHBhdHRlcm4sIGZsYWdzPTApOg0KICAgICAgICAiIiJUaGUgcGFyYW1ldGVycyBDe3BhdHRlcm59IGFuZCBDe2ZsYWdzfSBhcmUgcGFzc2VkIHRvIHRoZSBDe3JlLmNvbXBpbGUoKX0gZnVuY3Rpb24gYXMtaXMuIFNlZSB0aGUgUHl0aG9uIEN7cmV9IG1vZHVsZSBmb3IgYW4gZXhwbGFuYXRpb24gb2YgdGhlIGFjY2VwdGFibGUgcGF0dGVybnMgYW5kIGZsYWdzLiIiIg0KICAgICAgICBzdXBlcihSZWdleCxzZWxmKS5fX2luaXRfXygpDQoNCiAgICAgICAgaWYgaXNpbnN0YW5jZShwYXR0ZXJuLCBiYXNlc3RyaW5nKToNCiAgICAgICAgICAgIGlmIG5vdCBwYXR0ZXJuOg0KICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIm51bGwgc3RyaW5nIHBhc3NlZCB0byBSZWdleDsgdXNlIEVtcHR5KCkgaW5zdGVhZCIsDQogICAgICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQoNCiAgICAgICAgICAgIHNlbGYucGF0dGVybiA9IHBhdHRlcm4NCiAgICAgICAgICAgIHNlbGYuZmxhZ3MgPSBmbGFncw0KDQogICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgc2VsZi5yZSA9IHJlLmNvbXBpbGUoc2VsZi5wYXR0ZXJuLCBzZWxmLmZsYWdzKQ0KICAgICAgICAgICAgICAgIHNlbGYucmVTdHJpbmcgPSBzZWxmLnBhdHRlcm4NCiAgICAgICAgICAgIGV4Y2VwdCBzcmVfY29uc3RhbnRzLmVycm9yOg0KICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oImludmFsaWQgcGF0dGVybiAoJXMpIHBhc3NlZCB0byBSZWdleCIgJSBwYXR0ZXJuLA0KICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nLCBzdGFja2xldmVsPTIpDQogICAgICAgICAgICAgICAgcmFpc2UNCg0KICAgICAgICBlbGlmIGlzaW5zdGFuY2UocGF0dGVybiwgUmVnZXguY29tcGlsZWRSRXR5cGUpOg0KICAgICAgICAgICAgc2VsZi5yZSA9IHBhdHRlcm4NCiAgICAgICAgICAgIHNlbGYucGF0dGVybiA9IFwNCiAgICAgICAgICAgIHNlbGYucmVTdHJpbmcgPSBzdHIocGF0dGVybikNCiAgICAgICAgICAgIHNlbGYuZmxhZ3MgPSBmbGFncw0KICAgICAgICAgICAgDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJSZWdleCBtYXkgb25seSBiZSBjb25zdHJ1Y3RlZCB3aXRoIGEgc3RyaW5nIG9yIGEgY29tcGlsZWQgUkUgb2JqZWN0IikNCg0KICAgICAgICBzZWxmLm5hbWUgPSBfdXN0cihzZWxmKQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAiICsgc2VsZi5uYW1lDQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICByZXN1bHQgPSBzZWxmLnJlLm1hdGNoKGluc3RyaW5nLGxvYykNCiAgICAgICAgaWYgbm90IHJlc3VsdDoNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQogICAgICAgIGxvYyA9IHJlc3VsdC5lbmQoKQ0KICAgICAgICBkID0gcmVzdWx0Lmdyb3VwZGljdCgpDQogICAgICAgIHJldCA9IFBhcnNlUmVzdWx0cyhyZXN1bHQuZ3JvdXAoKSkNCiAgICAgICAgaWYgZDoNCiAgICAgICAgICAgIGZvciBrIGluIGQ6DQogICAgICAgICAgICAgICAgcmV0W2tdID0gZFtrXQ0KICAgICAgICByZXR1cm4gbG9jLHJldA0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgcmV0dXJuIHN1cGVyKFJlZ2V4LHNlbGYpLl9fc3RyX18oKQ0KICAgICAgICBleGNlcHQgRXhjZXB0aW9uOg0KICAgICAgICAgICAgcGFzcw0KDQogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOg0KICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gIlJlOiglcykiICUgcmVwcihzZWxmLnBhdHRlcm4pDQoNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQoNCmNsYXNzIFF1b3RlZFN0cmluZyhUb2tlbik6DQogICAgciIiIg0KICAgIFRva2VuIGZvciBtYXRjaGluZyBzdHJpbmdzIHRoYXQgYXJlIGRlbGltaXRlZCBieSBxdW90aW5nIGNoYXJhY3RlcnMuDQogICAgDQogICAgRGVmaW5lZCB3aXRoIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoNCiAgICAgICAgLSBxdW90ZUNoYXIgLSBzdHJpbmcgb2Ygb25lIG9yIG1vcmUgY2hhcmFjdGVycyBkZWZpbmluZyB0aGUgcXVvdGUgZGVsaW1pdGluZyBzdHJpbmcNCiAgICAgICAgLSBlc2NDaGFyIC0gY2hhcmFjdGVyIHRvIGVzY2FwZSBxdW90ZXMsIHR5cGljYWxseSBiYWNrc2xhc2ggKGRlZmF1bHQ9Q3tOb25lfSkNCiAgICAgICAgLSBlc2NRdW90ZSAtIHNwZWNpYWwgcXVvdGUgc2VxdWVuY2UgdG8gZXNjYXBlIGFuIGVtYmVkZGVkIHF1b3RlIHN0cmluZyAoc3VjaCBhcyBTUUwncyAiIiB0byBlc2NhcGUgYW4gZW1iZWRkZWQgIikgKGRlZmF1bHQ9Q3tOb25lfSkNCiAgICAgICAgLSBtdWx0aWxpbmUgLSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBxdW90ZXMgY2FuIHNwYW4gbXVsdGlwbGUgbGluZXMgKGRlZmF1bHQ9Q3tGYWxzZX0pDQogICAgICAgIC0gdW5xdW90ZVJlc3VsdHMgLSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgbWF0Y2hlZCB0ZXh0IHNob3VsZCBiZSB1bnF1b3RlZCAoZGVmYXVsdD1De1RydWV9KQ0KICAgICAgICAtIGVuZFF1b3RlQ2hhciAtIHN0cmluZyBvZiBvbmUgb3IgbW9yZSBjaGFyYWN0ZXJzIGRlZmluaW5nIHRoZSBlbmQgb2YgdGhlIHF1b3RlIGRlbGltaXRlZCBzdHJpbmcgKGRlZmF1bHQ9Q3tOb25lfSA9PiBzYW1lIGFzIHF1b3RlQ2hhcikNCiAgICAgICAgLSBjb252ZXJ0V2hpdGVzcGFjZUVzY2FwZXMgLSBjb252ZXJ0IGVzY2FwZWQgd2hpdGVzcGFjZSAoQ3snXHQnfSwgQ3snXG4nfSwgZXRjLikgdG8gYWN0dWFsIHdoaXRlc3BhY2UgKGRlZmF1bHQ9Q3tUcnVlfSkNCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBxcyA9IFF1b3RlZFN0cmluZygnIicpDQogICAgICAgIHByaW50KHFzLnNlYXJjaFN0cmluZygnbHNqZGYgIlRoaXMgaXMgdGhlIHF1b3RlIiBzbGRqZicpKQ0KICAgICAgICBjb21wbGV4X3FzID0gUXVvdGVkU3RyaW5nKCd7eycsIGVuZFF1b3RlQ2hhcj0nfX0nKQ0KICAgICAgICBwcmludChjb21wbGV4X3FzLnNlYXJjaFN0cmluZygnbHNqZGYge3tUaGlzIGlzIHRoZSAicXVvdGUifX0gc2xkamYnKSkNCiAgICAgICAgc3FsX3FzID0gUXVvdGVkU3RyaW5nKCciJywgZXNjUXVvdGU9JyIiJykNCiAgICAgICAgcHJpbnQoc3FsX3FzLnNlYXJjaFN0cmluZygnbHNqZGYgIlRoaXMgaXMgdGhlIHF1b3RlIHdpdGggIiJlbWJlZGRlZCIiIHF1b3RlcyIgc2xkamYnKSkNCiAgICBwcmludHM6Og0KICAgICAgICBbWydUaGlzIGlzIHRoZSBxdW90ZSddXQ0KICAgICAgICBbWydUaGlzIGlzIHRoZSAicXVvdGUiJ11dDQogICAgICAgIFtbJ1RoaXMgaXMgdGhlIHF1b3RlIHdpdGggImVtYmVkZGVkIiBxdW90ZXMnXV0NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIHF1b3RlQ2hhciwgZXNjQ2hhcj1Ob25lLCBlc2NRdW90ZT1Ob25lLCBtdWx0aWxpbmU9RmFsc2UsIHVucXVvdGVSZXN1bHRzPVRydWUsIGVuZFF1b3RlQ2hhcj1Ob25lLCBjb252ZXJ0V2hpdGVzcGFjZUVzY2FwZXM9VHJ1ZSk6DQogICAgICAgIHN1cGVyKFF1b3RlZFN0cmluZyxzZWxmKS5fX2luaXRfXygpDQoNCiAgICAgICAgIyByZW1vdmUgd2hpdGUgc3BhY2UgZnJvbSBxdW90ZSBjaGFycyAtIHdvbnQgd29yayBhbnl3YXkNCiAgICAgICAgcXVvdGVDaGFyID0gcXVvdGVDaGFyLnN0cmlwKCkNCiAgICAgICAgaWYgbm90IHF1b3RlQ2hhcjoNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oInF1b3RlQ2hhciBjYW5ub3QgYmUgdGhlIGVtcHR5IHN0cmluZyIsU3ludGF4V2FybmluZyxzdGFja2xldmVsPTIpDQogICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvcigpDQoNCiAgICAgICAgaWYgZW5kUXVvdGVDaGFyIGlzIE5vbmU6DQogICAgICAgICAgICBlbmRRdW90ZUNoYXIgPSBxdW90ZUNoYXINCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIGVuZFF1b3RlQ2hhciA9IGVuZFF1b3RlQ2hhci5zdHJpcCgpDQogICAgICAgICAgICBpZiBub3QgZW5kUXVvdGVDaGFyOg0KICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oImVuZFF1b3RlQ2hhciBjYW5ub3QgYmUgdGhlIGVtcHR5IHN0cmluZyIsU3ludGF4V2FybmluZyxzdGFja2xldmVsPTIpDQogICAgICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IoKQ0KDQogICAgICAgIHNlbGYucXVvdGVDaGFyID0gcXVvdGVDaGFyDQogICAgICAgIHNlbGYucXVvdGVDaGFyTGVuID0gbGVuKHF1b3RlQ2hhcikNCiAgICAgICAgc2VsZi5maXJzdFF1b3RlQ2hhciA9IHF1b3RlQ2hhclswXQ0KICAgICAgICBzZWxmLmVuZFF1b3RlQ2hhciA9IGVuZFF1b3RlQ2hhcg0KICAgICAgICBzZWxmLmVuZFF1b3RlQ2hhckxlbiA9IGxlbihlbmRRdW90ZUNoYXIpDQogICAgICAgIHNlbGYuZXNjQ2hhciA9IGVzY0NoYXINCiAgICAgICAgc2VsZi5lc2NRdW90ZSA9IGVzY1F1b3RlDQogICAgICAgIHNlbGYudW5xdW90ZVJlc3VsdHMgPSB1bnF1b3RlUmVzdWx0cw0KICAgICAgICBzZWxmLmNvbnZlcnRXaGl0ZXNwYWNlRXNjYXBlcyA9IGNvbnZlcnRXaGl0ZXNwYWNlRXNjYXBlcw0KDQogICAgICAgIGlmIG11bHRpbGluZToNCiAgICAgICAgICAgIHNlbGYuZmxhZ3MgPSByZS5NVUxUSUxJTkUgfCByZS5ET1RBTEwNCiAgICAgICAgICAgIHNlbGYucGF0dGVybiA9IHInJXMoPzpbXiVzJXNdJyAlIFwNCiAgICAgICAgICAgICAgICAoIHJlLmVzY2FwZShzZWxmLnF1b3RlQ2hhciksDQogICAgICAgICAgICAgICAgICBfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKHNlbGYuZW5kUXVvdGVDaGFyWzBdKSwNCiAgICAgICAgICAgICAgICAgIChlc2NDaGFyIGlzIG5vdCBOb25lIGFuZCBfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKGVzY0NoYXIpIG9yICcnKSApDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLmZsYWdzID0gMA0KICAgICAgICAgICAgc2VsZi5wYXR0ZXJuID0gciclcyg/OlteJXNcblxyJXNdJyAlIFwNCiAgICAgICAgICAgICAgICAoIHJlLmVzY2FwZShzZWxmLnF1b3RlQ2hhciksDQogICAgICAgICAgICAgICAgICBfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKHNlbGYuZW5kUXVvdGVDaGFyWzBdKSwNCiAgICAgICAgICAgICAgICAgIChlc2NDaGFyIGlzIG5vdCBOb25lIGFuZCBfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKGVzY0NoYXIpIG9yICcnKSApDQogICAgICAgIGlmIGxlbihzZWxmLmVuZFF1b3RlQ2hhcikgPiAxOg0KICAgICAgICAgICAgc2VsZi5wYXR0ZXJuICs9ICgNCiAgICAgICAgICAgICAgICAnfCg/OicgKyAnKXwoPzonLmpvaW4oIiVzW14lc10iICUgKHJlLmVzY2FwZShzZWxmLmVuZFF1b3RlQ2hhcls6aV0pLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZXNjYXBlUmVnZXhSYW5nZUNoYXJzKHNlbGYuZW5kUXVvdGVDaGFyW2ldKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLmVuZFF1b3RlQ2hhciktMSwwLC0xKSkgKyAnKScNCiAgICAgICAgICAgICAgICApDQogICAgICAgIGlmIGVzY1F1b3RlOg0KICAgICAgICAgICAgc2VsZi5wYXR0ZXJuICs9IChyJ3woPzolcyknICUgcmUuZXNjYXBlKGVzY1F1b3RlKSkNCiAgICAgICAgaWYgZXNjQ2hhcjoNCiAgICAgICAgICAgIHNlbGYucGF0dGVybiArPSAocid8KD86JXMuKScgJSByZS5lc2NhcGUoZXNjQ2hhcikpDQogICAgICAgICAgICBzZWxmLmVzY0NoYXJSZXBsYWNlUGF0dGVybiA9IHJlLmVzY2FwZShzZWxmLmVzY0NoYXIpKyIoLikiDQogICAgICAgIHNlbGYucGF0dGVybiArPSAocicpKiVzJyAlIHJlLmVzY2FwZShzZWxmLmVuZFF1b3RlQ2hhcikpDQoNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgc2VsZi5yZSA9IHJlLmNvbXBpbGUoc2VsZi5wYXR0ZXJuLCBzZWxmLmZsYWdzKQ0KICAgICAgICAgICAgc2VsZi5yZVN0cmluZyA9IHNlbGYucGF0dGVybg0KICAgICAgICBleGNlcHQgc3JlX2NvbnN0YW50cy5lcnJvcjoNCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oImludmFsaWQgcGF0dGVybiAoJXMpIHBhc3NlZCB0byBSZWdleCIgJSBzZWxmLnBhdHRlcm4sDQogICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KICAgICAgICAgICAgcmFpc2UNCg0KICAgICAgICBzZWxmLm5hbWUgPSBfdXN0cihzZWxmKQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAiICsgc2VsZi5uYW1lDQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICByZXN1bHQgPSBpbnN0cmluZ1tsb2NdID09IHNlbGYuZmlyc3RRdW90ZUNoYXIgYW5kIHNlbGYucmUubWF0Y2goaW5zdHJpbmcsbG9jKSBvciBOb25lDQogICAgICAgIGlmIG5vdCByZXN1bHQ6DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KICAgICAgICBsb2MgPSByZXN1bHQuZW5kKCkNCiAgICAgICAgcmV0ID0gcmVzdWx0Lmdyb3VwKCkNCg0KICAgICAgICBpZiBzZWxmLnVucXVvdGVSZXN1bHRzOg0KDQogICAgICAgICAgICAjIHN0cmlwIG9mZiBxdW90ZXMNCiAgICAgICAgICAgIHJldCA9IHJldFtzZWxmLnF1b3RlQ2hhckxlbjotc2VsZi5lbmRRdW90ZUNoYXJMZW5dDQoNCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UocmV0LGJhc2VzdHJpbmcpOg0KICAgICAgICAgICAgICAgICMgcmVwbGFjZSBlc2NhcGVkIHdoaXRlc3BhY2UNCiAgICAgICAgICAgICAgICBpZiAnXFwnIGluIHJldCBhbmQgc2VsZi5jb252ZXJ0V2hpdGVzcGFjZUVzY2FwZXM6DQogICAgICAgICAgICAgICAgICAgIHdzX21hcCA9IHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHInXHQnIDogJ1x0JywNCiAgICAgICAgICAgICAgICAgICAgICAgIHInXG4nIDogJ1xuJywNCiAgICAgICAgICAgICAgICAgICAgICAgIHInXGYnIDogJ1xmJywNCiAgICAgICAgICAgICAgICAgICAgICAgIHInXHInIDogJ1xyJywNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBmb3Igd3NsaXQsd3NjaGFyIGluIHdzX21hcC5pdGVtcygpOg0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gcmV0LnJlcGxhY2Uod3NsaXQsIHdzY2hhcikNCg0KICAgICAgICAgICAgICAgICMgcmVwbGFjZSBlc2NhcGVkIGNoYXJhY3RlcnMNCiAgICAgICAgICAgICAgICBpZiBzZWxmLmVzY0NoYXI6DQogICAgICAgICAgICAgICAgICAgIHJldCA9IHJlLnN1YihzZWxmLmVzY0NoYXJSZXBsYWNlUGF0dGVybiwiXGc8MT4iLHJldCkNCg0KICAgICAgICAgICAgICAgICMgcmVwbGFjZSBlc2NhcGVkIHF1b3Rlcw0KICAgICAgICAgICAgICAgIGlmIHNlbGYuZXNjUXVvdGU6DQogICAgICAgICAgICAgICAgICAgIHJldCA9IHJldC5yZXBsYWNlKHNlbGYuZXNjUXVvdGUsIHNlbGYuZW5kUXVvdGVDaGFyKQ0KDQogICAgICAgIHJldHVybiBsb2MsIHJldA0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgcmV0dXJuIHN1cGVyKFF1b3RlZFN0cmluZyxzZWxmKS5fX3N0cl9fKCkNCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoNCiAgICAgICAgICAgIHBhc3MNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToNCiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJxdW90ZWQgc3RyaW5nLCBzdGFydGluZyB3aXRoICVzIGVuZGluZyB3aXRoICVzIiAlIChzZWxmLnF1b3RlQ2hhciwgc2VsZi5lbmRRdW90ZUNoYXIpDQoNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQoNCmNsYXNzIENoYXJzTm90SW4oVG9rZW4pOg0KICAgICIiIg0KICAgIFRva2VuIGZvciBtYXRjaGluZyB3b3JkcyBjb21wb3NlZCBvZiBjaGFyYWN0ZXJzIEl7bm90fSBpbiBhIGdpdmVuIHNldCAod2lsbA0KICAgIGluY2x1ZGUgd2hpdGVzcGFjZSBpbiBtYXRjaGVkIGNoYXJhY3RlcnMgaWYgbm90IGxpc3RlZCBpbiB0aGUgcHJvdmlkZWQgZXhjbHVzaW9uIHNldCAtIHNlZSBleGFtcGxlKS4NCiAgICBEZWZpbmVkIHdpdGggc3RyaW5nIGNvbnRhaW5pbmcgYWxsIGRpc2FsbG93ZWQgY2hhcmFjdGVycywgYW5kIGFuIG9wdGlvbmFsDQogICAgbWluaW11bSwgbWF4aW11bSwgYW5kL29yIGV4YWN0IGxlbmd0aC4gIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBDe21pbn0gaXMgMSAoYQ0KICAgIG1pbmltdW0gdmFsdWUgPCAxIGlzIG5vdCB2YWxpZCk7IHRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgQ3ttYXh9IGFuZCBDe2V4YWN0fQ0KICAgIGFyZSAwLCBtZWFuaW5nIG5vIG1heGltdW0gb3IgZXhhY3QgbGVuZ3RoIHJlc3RyaWN0aW9uLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgICMgZGVmaW5lIGEgY29tbWEtc2VwYXJhdGVkLXZhbHVlIGFzIGFueXRoaW5nIHRoYXQgaXMgbm90IGEgJywnDQogICAgICAgIGNzdl92YWx1ZSA9IENoYXJzTm90SW4oJywnKQ0KICAgICAgICBwcmludChkZWxpbWl0ZWRMaXN0KGNzdl92YWx1ZSkucGFyc2VTdHJpbmcoImRrbHMsbHNka2pmLHMxMiAzNCxAISMsMjEzIikpDQogICAgcHJpbnRzOjoNCiAgICAgICAgWydka2xzJywgJ2xzZGtqZicsICdzMTIgMzQnLCAnQCEjJywgJzIxMyddDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBub3RDaGFycywgbWluPTEsIG1heD0wLCBleGFjdD0wICk6DQogICAgICAgIHN1cGVyKENoYXJzTm90SW4sc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gRmFsc2UNCiAgICAgICAgc2VsZi5ub3RDaGFycyA9IG5vdENoYXJzDQoNCiAgICAgICAgaWYgbWluIDwgMToNCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImNhbm5vdCBzcGVjaWZ5IGEgbWluaW11bSBsZW5ndGggPCAxOyB1c2UgT3B0aW9uYWwoQ2hhcnNOb3RJbigpKSBpZiB6ZXJvLWxlbmd0aCBjaGFyIGdyb3VwIGlzIHBlcm1pdHRlZCIpDQoNCiAgICAgICAgc2VsZi5taW5MZW4gPSBtaW4NCg0KICAgICAgICBpZiBtYXggPiAwOg0KICAgICAgICAgICAgc2VsZi5tYXhMZW4gPSBtYXgNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYubWF4TGVuID0gX01BWF9JTlQNCg0KICAgICAgICBpZiBleGFjdCA+IDA6DQogICAgICAgICAgICBzZWxmLm1heExlbiA9IGV4YWN0DQogICAgICAgICAgICBzZWxmLm1pbkxlbiA9IGV4YWN0DQoNCiAgICAgICAgc2VsZi5uYW1lID0gX3VzdHIoc2VsZikNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgIiArIHNlbGYubmFtZQ0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gKCBzZWxmLm1pbkxlbiA9PSAwICkNCiAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gRmFsc2UNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIGluc3RyaW5nW2xvY10gaW4gc2VsZi5ub3RDaGFyczoNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQogICAgICAgIHN0YXJ0ID0gbG9jDQogICAgICAgIGxvYyArPSAxDQogICAgICAgIG5vdGNoYXJzID0gc2VsZi5ub3RDaGFycw0KICAgICAgICBtYXhsZW4gPSBtaW4oIHN0YXJ0K3NlbGYubWF4TGVuLCBsZW4oaW5zdHJpbmcpICkNCiAgICAgICAgd2hpbGUgbG9jIDwgbWF4bGVuIGFuZCBcDQogICAgICAgICAgICAgIChpbnN0cmluZ1tsb2NdIG5vdCBpbiBub3RjaGFycyk6DQogICAgICAgICAgICBsb2MgKz0gMQ0KDQogICAgICAgIGlmIGxvYyAtIHN0YXJ0IDwgc2VsZi5taW5MZW46DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KICAgICAgICByZXR1cm4gbG9jLCBpbnN0cmluZ1tzdGFydDpsb2NdDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICB0cnk6DQogICAgICAgICAgICByZXR1cm4gc3VwZXIoQ2hhcnNOb3RJbiwgc2VsZikuX19zdHJfXygpDQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246DQogICAgICAgICAgICBwYXNzDQoNCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6DQogICAgICAgICAgICBpZiBsZW4oc2VsZi5ub3RDaGFycykgPiA0Og0KICAgICAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICIhVzooJXMuLi4pIiAlIHNlbGYubm90Q2hhcnNbOjRdDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICIhVzooJXMpIiAlIHNlbGYubm90Q2hhcnMNCg0KICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByDQoNCmNsYXNzIFdoaXRlKFRva2VuKToNCiAgICAiIiINCiAgICBTcGVjaWFsIG1hdGNoaW5nIGNsYXNzIGZvciBtYXRjaGluZyB3aGl0ZXNwYWNlLiAgTm9ybWFsbHksIHdoaXRlc3BhY2UgaXMgaWdub3JlZA0KICAgIGJ5IHB5cGFyc2luZyBncmFtbWFycy4gIFRoaXMgY2xhc3MgaXMgaW5jbHVkZWQgd2hlbiBzb21lIHdoaXRlc3BhY2Ugc3RydWN0dXJlcw0KICAgIGFyZSBzaWduaWZpY2FudC4gIERlZmluZSB3aXRoIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHdoaXRlc3BhY2UgY2hhcmFjdGVycyB0byBiZQ0KICAgIG1hdGNoZWQ7IGRlZmF1bHQgaXMgQ3siIFxcdFxcclxcbiJ9LiAgQWxzbyB0YWtlcyBvcHRpb25hbCBDe21pbn0sIEN7bWF4fSwgYW5kIEN7ZXhhY3R9IGFyZ3VtZW50cywNCiAgICBhcyBkZWZpbmVkIGZvciB0aGUgQ3tMe1dvcmR9fSBjbGFzcy4NCiAgICAiIiINCiAgICB3aGl0ZVN0cnMgPSB7DQogICAgICAgICIgIiA6ICI8U1BDPiIsDQogICAgICAgICJcdCI6ICI8VEFCPiIsDQogICAgICAgICJcbiI6ICI8TEY+IiwNCiAgICAgICAgIlxyIjogIjxDUj4iLA0KICAgICAgICAiXGYiOiAiPEZGPiIsDQogICAgICAgIH0NCiAgICBkZWYgX19pbml0X18oc2VsZiwgd3M9IiBcdFxyXG4iLCBtaW49MSwgbWF4PTAsIGV4YWN0PTApOg0KICAgICAgICBzdXBlcihXaGl0ZSxzZWxmKS5fX2luaXRfXygpDQogICAgICAgIHNlbGYubWF0Y2hXaGl0ZSA9IHdzDQogICAgICAgIHNlbGYuc2V0V2hpdGVzcGFjZUNoYXJzKCAiIi5qb2luKGMgZm9yIGMgaW4gc2VsZi53aGl0ZUNoYXJzIGlmIGMgbm90IGluIHNlbGYubWF0Y2hXaGl0ZSkgKQ0KICAgICAgICAjfiBzZWxmLmxlYXZlV2hpdGVzcGFjZSgpDQogICAgICAgIHNlbGYubmFtZSA9ICgiIi5qb2luKFdoaXRlLndoaXRlU3Ryc1tjXSBmb3IgYyBpbiBzZWxmLm1hdGNoV2hpdGUpKQ0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAiICsgc2VsZi5uYW1lDQoNCiAgICAgICAgc2VsZi5taW5MZW4gPSBtaW4NCg0KICAgICAgICBpZiBtYXggPiAwOg0KICAgICAgICAgICAgc2VsZi5tYXhMZW4gPSBtYXgNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYubWF4TGVuID0gX01BWF9JTlQNCg0KICAgICAgICBpZiBleGFjdCA+IDA6DQogICAgICAgICAgICBzZWxmLm1heExlbiA9IGV4YWN0DQogICAgICAgICAgICBzZWxmLm1pbkxlbiA9IGV4YWN0DQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiBub3QoaW5zdHJpbmdbIGxvYyBdIGluIHNlbGYubWF0Y2hXaGl0ZSk6DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCiAgICAgICAgc3RhcnQgPSBsb2MNCiAgICAgICAgbG9jICs9IDENCiAgICAgICAgbWF4bG9jID0gc3RhcnQgKyBzZWxmLm1heExlbg0KICAgICAgICBtYXhsb2MgPSBtaW4oIG1heGxvYywgbGVuKGluc3RyaW5nKSApDQogICAgICAgIHdoaWxlIGxvYyA8IG1heGxvYyBhbmQgaW5zdHJpbmdbbG9jXSBpbiBzZWxmLm1hdGNoV2hpdGU6DQogICAgICAgICAgICBsb2MgKz0gMQ0KDQogICAgICAgIGlmIGxvYyAtIHN0YXJ0IDwgc2VsZi5taW5MZW46DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KICAgICAgICByZXR1cm4gbG9jLCBpbnN0cmluZ1tzdGFydDpsb2NdDQoNCg0KY2xhc3MgX1Bvc2l0aW9uVG9rZW4oVG9rZW4pOg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiApOg0KICAgICAgICBzdXBlcihfUG9zaXRpb25Ub2tlbixzZWxmKS5fX2luaXRfXygpDQogICAgICAgIHNlbGYubmFtZT1zZWxmLl9fY2xhc3NfXy5fX25hbWVfXw0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQ0KICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBGYWxzZQ0KDQpjbGFzcyBHb1RvQ29sdW1uKF9Qb3NpdGlvblRva2VuKToNCiAgICAiIiINCiAgICBUb2tlbiB0byBhZHZhbmNlIHRvIGEgc3BlY2lmaWMgY29sdW1uIG9mIGlucHV0IHRleHQ7IHVzZWZ1bCBmb3IgdGFidWxhciByZXBvcnQgc2NyYXBpbmcuDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBjb2xubyApOg0KICAgICAgICBzdXBlcihHb1RvQ29sdW1uLHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgc2VsZi5jb2wgPSBjb2xubw0KDQogICAgZGVmIHByZVBhcnNlKCBzZWxmLCBpbnN0cmluZywgbG9jICk6DQogICAgICAgIGlmIGNvbChsb2MsaW5zdHJpbmcpICE9IHNlbGYuY29sOg0KICAgICAgICAgICAgaW5zdHJsZW4gPSBsZW4oaW5zdHJpbmcpDQogICAgICAgICAgICBpZiBzZWxmLmlnbm9yZUV4cHJzOg0KICAgICAgICAgICAgICAgIGxvYyA9IHNlbGYuX3NraXBJZ25vcmFibGVzKCBpbnN0cmluZywgbG9jICkNCiAgICAgICAgICAgIHdoaWxlIGxvYyA8IGluc3RybGVuIGFuZCBpbnN0cmluZ1tsb2NdLmlzc3BhY2UoKSBhbmQgY29sKCBsb2MsIGluc3RyaW5nICkgIT0gc2VsZi5jb2wgOg0KICAgICAgICAgICAgICAgIGxvYyArPSAxDQogICAgICAgIHJldHVybiBsb2MNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIHRoaXNjb2wgPSBjb2woIGxvYywgaW5zdHJpbmcgKQ0KICAgICAgICBpZiB0aGlzY29sID4gc2VsZi5jb2w6DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbiggaW5zdHJpbmcsIGxvYywgIlRleHQgbm90IGluIGV4cGVjdGVkIGNvbHVtbiIsIHNlbGYgKQ0KICAgICAgICBuZXdsb2MgPSBsb2MgKyBzZWxmLmNvbCAtIHRoaXNjb2wNCiAgICAgICAgcmV0ID0gaW5zdHJpbmdbIGxvYzogbmV3bG9jIF0NCiAgICAgICAgcmV0dXJuIG5ld2xvYywgcmV0DQoNCg0KY2xhc3MgTGluZVN0YXJ0KF9Qb3NpdGlvblRva2VuKToNCiAgICAiIiINCiAgICBNYXRjaGVzIGlmIGN1cnJlbnQgcG9zaXRpb24gaXMgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUgd2l0aGluIHRoZSBwYXJzZSBzdHJpbmcNCiAgICANCiAgICBFeGFtcGxlOjoNCiAgICANCiAgICAgICAgdGVzdCA9ICcnJ1wNCiAgICAgICAgQUFBIHRoaXMgbGluZQ0KICAgICAgICBBQUEgYW5kIHRoaXMgbGluZQ0KICAgICAgICAgIEFBQSBidXQgbm90IHRoaXMgb25lDQogICAgICAgIEIgQUFBIGFuZCBkZWZpbml0ZWx5IG5vdCB0aGlzIG9uZQ0KICAgICAgICAnJycNCg0KICAgICAgICBmb3IgdCBpbiAoTGluZVN0YXJ0KCkgKyAnQUFBJyArIHJlc3RPZkxpbmUpLnNlYXJjaFN0cmluZyh0ZXN0KToNCiAgICAgICAgICAgIHByaW50KHQpDQogICAgDQogICAgUHJpbnRzOjoNCiAgICAgICAgWydBQUEnLCAnIHRoaXMgbGluZSddDQogICAgICAgIFsnQUFBJywgJyBhbmQgdGhpcyBsaW5lJ10gICAgDQoNCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYgKToNCiAgICAgICAgc3VwZXIoTGluZVN0YXJ0LHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgc3RhcnQgb2YgbGluZSINCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIGNvbChsb2MsIGluc3RyaW5nKSA9PSAxOg0KICAgICAgICAgICAgcmV0dXJuIGxvYywgW10NCiAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQoNCmNsYXNzIExpbmVFbmQoX1Bvc2l0aW9uVG9rZW4pOg0KICAgICIiIg0KICAgIE1hdGNoZXMgaWYgY3VycmVudCBwb3NpdGlvbiBpcyBhdCB0aGUgZW5kIG9mIGEgbGluZSB3aXRoaW4gdGhlIHBhcnNlIHN0cmluZw0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiApOg0KICAgICAgICBzdXBlcihMaW5lRW5kLHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgc2VsZi5zZXRXaGl0ZXNwYWNlQ2hhcnMoIFBhcnNlckVsZW1lbnQuREVGQVVMVF9XSElURV9DSEFSUy5yZXBsYWNlKCJcbiIsIiIpICkNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRXhwZWN0ZWQgZW5kIG9mIGxpbmUiDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBpZiBsb2M8bGVuKGluc3RyaW5nKToNCiAgICAgICAgICAgIGlmIGluc3RyaW5nW2xvY10gPT0gIlxuIjoNCiAgICAgICAgICAgICAgICByZXR1cm4gbG9jKzEsICJcbiINCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQogICAgICAgIGVsaWYgbG9jID09IGxlbihpbnN0cmluZyk6DQogICAgICAgICAgICByZXR1cm4gbG9jKzEsIFtdDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KY2xhc3MgU3RyaW5nU3RhcnQoX1Bvc2l0aW9uVG9rZW4pOg0KICAgICIiIg0KICAgIE1hdGNoZXMgaWYgY3VycmVudCBwb3NpdGlvbiBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYXJzZSBzdHJpbmcNCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYgKToNCiAgICAgICAgc3VwZXIoU3RyaW5nU3RhcnQsc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCBzdGFydCBvZiB0ZXh0Ig0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgbG9jICE9IDA6DQogICAgICAgICAgICAjIHNlZSBpZiBlbnRpcmUgc3RyaW5nIHVwIHRvIGhlcmUgaXMganVzdCB3aGl0ZXNwYWNlIGFuZCBpZ25vcmVhYmxlcw0KICAgICAgICAgICAgaWYgbG9jICE9IHNlbGYucHJlUGFyc2UoIGluc3RyaW5nLCAwICk6DQogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQogICAgICAgIHJldHVybiBsb2MsIFtdDQoNCmNsYXNzIFN0cmluZ0VuZChfUG9zaXRpb25Ub2tlbik6DQogICAgIiIiDQogICAgTWF0Y2hlcyBpZiBjdXJyZW50IHBvc2l0aW9uIGlzIGF0IHRoZSBlbmQgb2YgdGhlIHBhcnNlIHN0cmluZw0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiApOg0KICAgICAgICBzdXBlcihTdHJpbmdFbmQsc2VsZikuX19pbml0X18oKQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCBlbmQgb2YgdGV4dCINCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIGxvYyA8IGxlbihpbnN0cmluZyk6DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCiAgICAgICAgZWxpZiBsb2MgPT0gbGVuKGluc3RyaW5nKToNCiAgICAgICAgICAgIHJldHVybiBsb2MrMSwgW10NCiAgICAgICAgZWxpZiBsb2MgPiBsZW4oaW5zdHJpbmcpOg0KICAgICAgICAgICAgcmV0dXJuIGxvYywgW10NCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KDQpjbGFzcyBXb3JkU3RhcnQoX1Bvc2l0aW9uVG9rZW4pOg0KICAgICIiIg0KICAgIE1hdGNoZXMgaWYgdGhlIGN1cnJlbnQgcG9zaXRpb24gaXMgYXQgdGhlIGJlZ2lubmluZyBvZiBhIFdvcmQsIGFuZA0KICAgIGlzIG5vdCBwcmVjZWRlZCBieSBhbnkgY2hhcmFjdGVyIGluIGEgZ2l2ZW4gc2V0IG9mIEN7d29yZENoYXJzfQ0KICAgIChkZWZhdWx0PUN7cHJpbnRhYmxlc30pLiBUbyBlbXVsYXRlIHRoZSBDe1xifSBiZWhhdmlvciBvZiByZWd1bGFyIGV4cHJlc3Npb25zLA0KICAgIHVzZSBDe1dvcmRTdGFydChhbHBoYW51bXMpfS4gQ3tXb3JkU3RhcnR9IHdpbGwgYWxzbyBtYXRjaCBhdCB0aGUgYmVnaW5uaW5nIG9mDQogICAgdGhlIHN0cmluZyBiZWluZyBwYXJzZWQsIG9yIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3b3JkQ2hhcnMgPSBwcmludGFibGVzKToNCiAgICAgICAgc3VwZXIoV29yZFN0YXJ0LHNlbGYpLl9faW5pdF9fKCkNCiAgICAgICAgc2VsZi53b3JkQ2hhcnMgPSBzZXQod29yZENoYXJzKQ0KICAgICAgICBzZWxmLmVycm1zZyA9ICJOb3QgYXQgdGhlIHN0YXJ0IG9mIGEgd29yZCINCg0KICAgIGRlZiBwYXJzZUltcGwoc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgbG9jICE9IDA6DQogICAgICAgICAgICBpZiAoaW5zdHJpbmdbbG9jLTFdIGluIHNlbGYud29yZENoYXJzIG9yDQogICAgICAgICAgICAgICAgaW5zdHJpbmdbbG9jXSBub3QgaW4gc2VsZi53b3JkQ2hhcnMpOg0KICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KICAgICAgICByZXR1cm4gbG9jLCBbXQ0KDQpjbGFzcyBXb3JkRW5kKF9Qb3NpdGlvblRva2VuKToNCiAgICAiIiINCiAgICBNYXRjaGVzIGlmIHRoZSBjdXJyZW50IHBvc2l0aW9uIGlzIGF0IHRoZSBlbmQgb2YgYSBXb3JkLCBhbmQNCiAgICBpcyBub3QgZm9sbG93ZWQgYnkgYW55IGNoYXJhY3RlciBpbiBhIGdpdmVuIHNldCBvZiBDe3dvcmRDaGFyc30NCiAgICAoZGVmYXVsdD1De3ByaW50YWJsZXN9KS4gVG8gZW11bGF0ZSB0aGUgQ3tcYn0gYmVoYXZpb3Igb2YgcmVndWxhciBleHByZXNzaW9ucywNCiAgICB1c2UgQ3tXb3JkRW5kKGFscGhhbnVtcyl9LiBDe1dvcmRFbmR9IHdpbGwgYWxzbyBtYXRjaCBhdCB0aGUgZW5kIG9mDQogICAgdGhlIHN0cmluZyBiZWluZyBwYXJzZWQsIG9yIGF0IHRoZSBlbmQgb2YgYSBsaW5lLg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3b3JkQ2hhcnMgPSBwcmludGFibGVzKToNCiAgICAgICAgc3VwZXIoV29yZEVuZCxzZWxmKS5fX2luaXRfXygpDQogICAgICAgIHNlbGYud29yZENoYXJzID0gc2V0KHdvcmRDaGFycykNCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IEZhbHNlDQogICAgICAgIHNlbGYuZXJybXNnID0gIk5vdCBhdCB0aGUgZW5kIG9mIGEgd29yZCINCg0KICAgIGRlZiBwYXJzZUltcGwoc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaW5zdHJsZW4gPSBsZW4oaW5zdHJpbmcpDQogICAgICAgIGlmIGluc3RybGVuPjAgYW5kIGxvYzxpbnN0cmxlbjoNCiAgICAgICAgICAgIGlmIChpbnN0cmluZ1tsb2NdIGluIHNlbGYud29yZENoYXJzIG9yDQogICAgICAgICAgICAgICAgaW5zdHJpbmdbbG9jLTFdIG5vdCBpbiBzZWxmLndvcmRDaGFycyk6DQogICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsIGxvYywgc2VsZi5lcnJtc2csIHNlbGYpDQogICAgICAgIHJldHVybiBsb2MsIFtdDQoNCg0KY2xhc3MgUGFyc2VFeHByZXNzaW9uKFBhcnNlckVsZW1lbnQpOg0KICAgICIiIg0KICAgIEFic3RyYWN0IHN1YmNsYXNzIG9mIFBhcnNlckVsZW1lbnQsIGZvciBjb21iaW5pbmcgYW5kIHBvc3QtcHJvY2Vzc2luZyBwYXJzZWQgdG9rZW5zLg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwcnMsIHNhdmVsaXN0ID0gRmFsc2UgKToNCiAgICAgICAgc3VwZXIoUGFyc2VFeHByZXNzaW9uLHNlbGYpLl9faW5pdF9fKHNhdmVsaXN0KQ0KICAgICAgICBpZiBpc2luc3RhbmNlKCBleHBycywgX2dlbmVyYXRvclR5cGUgKToNCiAgICAgICAgICAgIGV4cHJzID0gbGlzdChleHBycykNCg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBleHBycywgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgc2VsZi5leHBycyA9IFsgUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBleHBycyApIF0NCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKCBleHBycywgY29sbGVjdGlvbnMuSXRlcmFibGUgKToNCiAgICAgICAgICAgIGV4cHJzID0gbGlzdChleHBycykNCiAgICAgICAgICAgICMgaWYgc2VxdWVuY2Ugb2Ygc3RyaW5ncyBwcm92aWRlZCwgd3JhcCB3aXRoIExpdGVyYWwNCiAgICAgICAgICAgIGlmIGFsbChpc2luc3RhbmNlKGV4cHIsIGJhc2VzdHJpbmcpIGZvciBleHByIGluIGV4cHJzKToNCiAgICAgICAgICAgICAgICBleHBycyA9IG1hcChQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MsIGV4cHJzKQ0KICAgICAgICAgICAgc2VsZi5leHBycyA9IGxpc3QoZXhwcnMpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgc2VsZi5leHBycyA9IGxpc3QoIGV4cHJzICkNCiAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6DQogICAgICAgICAgICAgICAgc2VsZi5leHBycyA9IFsgZXhwcnMgXQ0KICAgICAgICBzZWxmLmNhbGxQcmVwYXJzZSA9IEZhbHNlDQoNCiAgICBkZWYgX19nZXRpdGVtX18oIHNlbGYsIGkgKToNCiAgICAgICAgcmV0dXJuIHNlbGYuZXhwcnNbaV0NCg0KICAgIGRlZiBhcHBlbmQoIHNlbGYsIG90aGVyICk6DQogICAgICAgIHNlbGYuZXhwcnMuYXBwZW5kKCBvdGhlciApDQogICAgICAgIHNlbGYuc3RyUmVwciA9IE5vbmUNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBsZWF2ZVdoaXRlc3BhY2UoIHNlbGYgKToNCiAgICAgICAgIiIiRXh0ZW5kcyBDe2xlYXZlV2hpdGVzcGFjZX0gZGVmaW5lZCBpbiBiYXNlIGNsYXNzLCBhbmQgYWxzbyBpbnZva2VzIEN7bGVhdmVXaGl0ZXNwYWNlfSBvbg0KICAgICAgICAgICBhbGwgY29udGFpbmVkIGV4cHJlc3Npb25zLiIiIg0KICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gRmFsc2UNCiAgICAgICAgc2VsZi5leHBycyA9IFsgZS5jb3B5KCkgZm9yIGUgaW4gc2VsZi5leHBycyBdDQogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6DQogICAgICAgICAgICBlLmxlYXZlV2hpdGVzcGFjZSgpDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgaWdub3JlKCBzZWxmLCBvdGhlciApOg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgU3VwcHJlc3MgKToNCiAgICAgICAgICAgIGlmIG90aGVyIG5vdCBpbiBzZWxmLmlnbm9yZUV4cHJzOg0KICAgICAgICAgICAgICAgIHN1cGVyKCBQYXJzZUV4cHJlc3Npb24sIHNlbGYpLmlnbm9yZSggb3RoZXIgKQ0KICAgICAgICAgICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6DQogICAgICAgICAgICAgICAgICAgIGUuaWdub3JlKCBzZWxmLmlnbm9yZUV4cHJzWy0xXSApDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzdXBlciggUGFyc2VFeHByZXNzaW9uLCBzZWxmKS5pZ25vcmUoIG90aGVyICkNCiAgICAgICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6DQogICAgICAgICAgICAgICAgZS5pZ25vcmUoIHNlbGYuaWdub3JlRXhwcnNbLTFdICkNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHJldHVybiBzdXBlcihQYXJzZUV4cHJlc3Npb24sc2VsZikuX19zdHJfXygpDQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246DQogICAgICAgICAgICBwYXNzDQoNCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6DQogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAiJXM6KCVzKSIgJSAoIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBfdXN0cihzZWxmLmV4cHJzKSApDQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHINCg0KICAgIGRlZiBzdHJlYW1saW5lKCBzZWxmICk6DQogICAgICAgIHN1cGVyKFBhcnNlRXhwcmVzc2lvbixzZWxmKS5zdHJlYW1saW5lKCkNCg0KICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOg0KICAgICAgICAgICAgZS5zdHJlYW1saW5lKCkNCg0KICAgICAgICAjIGNvbGxhcHNlIG5lc3RlZCBBbmQncyBvZiB0aGUgZm9ybSBBbmQoIEFuZCggQW5kKCBhLGIpLCBjKSwgZCkgdG8gQW5kKCBhLGIsYyxkICkNCiAgICAgICAgIyBidXQgb25seSBpZiB0aGVyZSBhcmUgbm8gcGFyc2UgYWN0aW9ucyBvciByZXN1bHRzTmFtZXMgb24gdGhlIG5lc3RlZCBBbmQncw0KICAgICAgICAjIChsaWtld2lzZSBmb3IgT3IncyBhbmQgTWF0Y2hGaXJzdCdzKQ0KICAgICAgICBpZiAoIGxlbihzZWxmLmV4cHJzKSA9PSAyICk6DQogICAgICAgICAgICBvdGhlciA9IHNlbGYuZXhwcnNbMF0NCiAgICAgICAgICAgIGlmICggaXNpbnN0YW5jZSggb3RoZXIsIHNlbGYuX19jbGFzc19fICkgYW5kDQogICAgICAgICAgICAgICAgICBub3Qob3RoZXIucGFyc2VBY3Rpb24pIGFuZA0KICAgICAgICAgICAgICAgICAgb3RoZXIucmVzdWx0c05hbWUgaXMgTm9uZSBhbmQNCiAgICAgICAgICAgICAgICAgIG5vdCBvdGhlci5kZWJ1ZyApOg0KICAgICAgICAgICAgICAgIHNlbGYuZXhwcnMgPSBvdGhlci5leHByc1s6XSArIFsgc2VsZi5leHByc1sxXSBdDQogICAgICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gTm9uZQ0KICAgICAgICAgICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgfD0gb3RoZXIubWF5UmV0dXJuRW1wdHkNCiAgICAgICAgICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgIHw9IG90aGVyLm1heUluZGV4RXJyb3INCg0KICAgICAgICAgICAgb3RoZXIgPSBzZWxmLmV4cHJzWy0xXQ0KICAgICAgICAgICAgaWYgKCBpc2luc3RhbmNlKCBvdGhlciwgc2VsZi5fX2NsYXNzX18gKSBhbmQNCiAgICAgICAgICAgICAgICAgIG5vdChvdGhlci5wYXJzZUFjdGlvbikgYW5kDQogICAgICAgICAgICAgICAgICBvdGhlci5yZXN1bHRzTmFtZSBpcyBOb25lIGFuZA0KICAgICAgICAgICAgICAgICAgbm90IG90aGVyLmRlYnVnICk6DQogICAgICAgICAgICAgICAgc2VsZi5leHBycyA9IHNlbGYuZXhwcnNbOi0xXSArIG90aGVyLmV4cHJzWzpdDQogICAgICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gTm9uZQ0KICAgICAgICAgICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgfD0gb3RoZXIubWF5UmV0dXJuRW1wdHkNCiAgICAgICAgICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgIHw9IG90aGVyLm1heUluZGV4RXJyb3INCg0KICAgICAgICBzZWxmLmVycm1zZyA9ICJFeHBlY3RlZCAiICsgX3VzdHIoc2VsZikNCiAgICAgICAgDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgc2V0UmVzdWx0c05hbWUoIHNlbGYsIG5hbWUsIGxpc3RBbGxNYXRjaGVzPUZhbHNlICk6DQogICAgICAgIHJldCA9IHN1cGVyKFBhcnNlRXhwcmVzc2lvbixzZWxmKS5zZXRSZXN1bHRzTmFtZShuYW1lLGxpc3RBbGxNYXRjaGVzKQ0KICAgICAgICByZXR1cm4gcmV0DQoNCiAgICBkZWYgdmFsaWRhdGUoIHNlbGYsIHZhbGlkYXRlVHJhY2U9W10gKToNCiAgICAgICAgdG1wID0gdmFsaWRhdGVUcmFjZVs6XStbc2VsZl0NCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoNCiAgICAgICAgICAgIGUudmFsaWRhdGUodG1wKQ0KICAgICAgICBzZWxmLmNoZWNrUmVjdXJzaW9uKCBbXSApDQogICAgICAgIA0KICAgIGRlZiBjb3B5KHNlbGYpOg0KICAgICAgICByZXQgPSBzdXBlcihQYXJzZUV4cHJlc3Npb24sc2VsZikuY29weSgpDQogICAgICAgIHJldC5leHBycyA9IFtlLmNvcHkoKSBmb3IgZSBpbiBzZWxmLmV4cHJzXQ0KICAgICAgICByZXR1cm4gcmV0DQoNCmNsYXNzIEFuZChQYXJzZUV4cHJlc3Npb24pOg0KICAgICIiIg0KICAgIFJlcXVpcmVzIGFsbCBnaXZlbiBDe1BhcnNlRXhwcmVzc2lvbn1zIHRvIGJlIGZvdW5kIGluIHRoZSBnaXZlbiBvcmRlci4NCiAgICBFeHByZXNzaW9ucyBtYXkgYmUgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UuDQogICAgTWF5IGJlIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBDeycrJ30gb3BlcmF0b3IuDQogICAgTWF5IGFsc28gYmUgY29uc3RydWN0ZWQgdXNpbmcgdGhlIEN7Jy0nfSBvcGVyYXRvciwgd2hpY2ggd2lsbCBzdXBwcmVzcyBiYWNrdHJhY2tpbmcuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykNCiAgICAgICAgbmFtZV9leHByID0gT25lT3JNb3JlKFdvcmQoYWxwaGFzKSkNCg0KICAgICAgICBleHByID0gQW5kKFtpbnRlZ2VyKCJpZCIpLG5hbWVfZXhwcigibmFtZSIpLGludGVnZXIoImFnZSIpXSkNCiAgICAgICAgIyBtb3JlIGVhc2lseSB3cml0dGVuIGFzOg0KICAgICAgICBleHByID0gaW50ZWdlcigiaWQiKSArIG5hbWVfZXhwcigibmFtZSIpICsgaW50ZWdlcigiYWdlIikNCiAgICAiIiINCg0KICAgIGNsYXNzIF9FcnJvclN0b3AoRW1wdHkpOg0KICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToNCiAgICAgICAgICAgIHN1cGVyKEFuZC5fRXJyb3JTdG9wLHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3YXJncykNCiAgICAgICAgICAgIHNlbGYubmFtZSA9ICctJw0KICAgICAgICAgICAgc2VsZi5sZWF2ZVdoaXRlc3BhY2UoKQ0KDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHBycywgc2F2ZWxpc3QgPSBUcnVlICk6DQogICAgICAgIHN1cGVyKEFuZCxzZWxmKS5fX2luaXRfXyhleHBycywgc2F2ZWxpc3QpDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBhbGwoZS5tYXlSZXR1cm5FbXB0eSBmb3IgZSBpbiBzZWxmLmV4cHJzKQ0KICAgICAgICBzZWxmLnNldFdoaXRlc3BhY2VDaGFycyggc2VsZi5leHByc1swXS53aGl0ZUNoYXJzICkNCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IHNlbGYuZXhwcnNbMF0uc2tpcFdoaXRlc3BhY2UNCiAgICAgICAgc2VsZi5jYWxsUHJlcGFyc2UgPSBUcnVlDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICAjIHBhc3MgRmFsc2UgYXMgbGFzdCBhcmcgdG8gX3BhcnNlIGZvciBmaXJzdCBlbGVtZW50LCBzaW5jZSB3ZSBhbHJlYWR5DQogICAgICAgICMgcHJlLXBhcnNlZCB0aGUgc3RyaW5nIGFzIHBhcnQgb2Ygb3VyIEFuZCBwcmUtcGFyc2luZw0KICAgICAgICBsb2MsIHJlc3VsdGxpc3QgPSBzZWxmLmV4cHJzWzBdLl9wYXJzZSggaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zLCBjYWxsUHJlUGFyc2U9RmFsc2UgKQ0KICAgICAgICBlcnJvclN0b3AgPSBGYWxzZQ0KICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzWzE6XToNCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZSwgQW5kLl9FcnJvclN0b3ApOg0KICAgICAgICAgICAgICAgIGVycm9yU3RvcCA9IFRydWUNCiAgICAgICAgICAgICAgICBjb250aW51ZQ0KICAgICAgICAgICAgaWYgZXJyb3JTdG9wOg0KICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgbG9jLCBleHBydG9rZW5zID0gZS5fcGFyc2UoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucyApDQogICAgICAgICAgICAgICAgZXhjZXB0IFBhcnNlU3ludGF4RXhjZXB0aW9uOg0KICAgICAgICAgICAgICAgICAgICByYWlzZQ0KICAgICAgICAgICAgICAgIGV4Y2VwdCBQYXJzZUJhc2VFeGNlcHRpb24gYXMgcGU6DQogICAgICAgICAgICAgICAgICAgIHBlLl9fdHJhY2ViYWNrX18gPSBOb25lDQogICAgICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlU3ludGF4RXhjZXB0aW9uLl9mcm9tX2V4Y2VwdGlvbihwZSkNCiAgICAgICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoNCiAgICAgICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VTeW50YXhFeGNlcHRpb24oaW5zdHJpbmcsIGxlbihpbnN0cmluZyksIHNlbGYuZXJybXNnLCBzZWxmKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBsb2MsIGV4cHJ0b2tlbnMgPSBlLl9wYXJzZSggaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zICkNCiAgICAgICAgICAgIGlmIGV4cHJ0b2tlbnMgb3IgZXhwcnRva2Vucy5oYXNrZXlzKCk6DQogICAgICAgICAgICAgICAgcmVzdWx0bGlzdCArPSBleHBydG9rZW5zDQogICAgICAgIHJldHVybiBsb2MsIHJlc3VsdGxpc3QNCg0KICAgIGRlZiBfX2lhZGRfXyhzZWxmLCBvdGhlciApOg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkNCiAgICAgICAgcmV0dXJuIHNlbGYuYXBwZW5kKCBvdGhlciApICNBbmQoIFsgc2VsZiwgb3RoZXIgXSApDQoNCiAgICBkZWYgY2hlY2tSZWN1cnNpb24oIHNlbGYsIHBhcnNlRWxlbWVudExpc3QgKToNCiAgICAgICAgc3ViUmVjQ2hlY2tMaXN0ID0gcGFyc2VFbGVtZW50TGlzdFs6XSArIFsgc2VsZiBdDQogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6DQogICAgICAgICAgICBlLmNoZWNrUmVjdXJzaW9uKCBzdWJSZWNDaGVja0xpc3QgKQ0KICAgICAgICAgICAgaWYgbm90IGUubWF5UmV0dXJuRW1wdHk6DQogICAgICAgICAgICAgICAgYnJlYWsNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwibmFtZSIpOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQ0KDQogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOg0KICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gInsiICsgIiAiLmpvaW4oX3VzdHIoZSkgZm9yIGUgaW4gc2VsZi5leHBycykgKyAifSINCg0KICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByDQoNCg0KY2xhc3MgT3IoUGFyc2VFeHByZXNzaW9uKToNCiAgICAiIiINCiAgICBSZXF1aXJlcyB0aGF0IGF0IGxlYXN0IG9uZSBDe1BhcnNlRXhwcmVzc2lvbn0gaXMgZm91bmQuDQogICAgSWYgdHdvIGV4cHJlc3Npb25zIG1hdGNoLCB0aGUgZXhwcmVzc2lvbiB0aGF0IG1hdGNoZXMgdGhlIGxvbmdlc3Qgc3RyaW5nIHdpbGwgYmUgdXNlZC4NCiAgICBNYXkgYmUgY29uc3RydWN0ZWQgdXNpbmcgdGhlIEN7J14nfSBvcGVyYXRvci4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICAjIGNvbnN0cnVjdCBPciB1c2luZyAnXicgb3BlcmF0b3INCiAgICAgICAgDQogICAgICAgIG51bWJlciA9IFdvcmQobnVtcykgXiBDb21iaW5lKFdvcmQobnVtcykgKyAnLicgKyBXb3JkKG51bXMpKQ0KICAgICAgICBwcmludChudW1iZXIuc2VhcmNoU3RyaW5nKCIxMjMgMy4xNDE2IDc4OSIpKQ0KICAgIHByaW50czo6DQogICAgICAgIFtbJzEyMyddLCBbJzMuMTQxNiddLCBbJzc4OSddXQ0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwcnMsIHNhdmVsaXN0ID0gRmFsc2UgKToNCiAgICAgICAgc3VwZXIoT3Isc2VsZikuX19pbml0X18oZXhwcnMsIHNhdmVsaXN0KQ0KICAgICAgICBpZiBzZWxmLmV4cHJzOg0KICAgICAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IGFueShlLm1heVJldHVybkVtcHR5IGZvciBlIGluIHNlbGYuZXhwcnMpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgbWF4RXhjTG9jID0gLTENCiAgICAgICAgbWF4RXhjZXB0aW9uID0gTm9uZQ0KICAgICAgICBtYXRjaGVzID0gW10NCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoNCiAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICBsb2MyID0gZS50cnlQYXJzZSggaW5zdHJpbmcsIGxvYyApDQogICAgICAgICAgICBleGNlcHQgUGFyc2VFeGNlcHRpb24gYXMgZXJyOg0KICAgICAgICAgICAgICAgIGVyci5fX3RyYWNlYmFja19fID0gTm9uZQ0KICAgICAgICAgICAgICAgIGlmIGVyci5sb2MgPiBtYXhFeGNMb2M6DQogICAgICAgICAgICAgICAgICAgIG1heEV4Y2VwdGlvbiA9IGVycg0KICAgICAgICAgICAgICAgICAgICBtYXhFeGNMb2MgPSBlcnIubG9jDQogICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoNCiAgICAgICAgICAgICAgICBpZiBsZW4oaW5zdHJpbmcpID4gbWF4RXhjTG9jOg0KICAgICAgICAgICAgICAgICAgICBtYXhFeGNlcHRpb24gPSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZyxsZW4oaW5zdHJpbmcpLGUuZXJybXNnLHNlbGYpDQogICAgICAgICAgICAgICAgICAgIG1heEV4Y0xvYyA9IGxlbihpbnN0cmluZykNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgIyBzYXZlIG1hdGNoIGFtb25nIGFsbCBtYXRjaGVzLCB0byByZXRyeSBsb25nZXN0IHRvIHNob3J0ZXN0DQogICAgICAgICAgICAgICAgbWF0Y2hlcy5hcHBlbmQoKGxvYzIsIGUpKQ0KDQogICAgICAgIGlmIG1hdGNoZXM6DQogICAgICAgICAgICBtYXRjaGVzLnNvcnQoa2V5PWxhbWJkYSB4OiAteFswXSkNCiAgICAgICAgICAgIGZvciBfLGUgaW4gbWF0Y2hlczoNCiAgICAgICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBlLl9wYXJzZSggaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zICkNCiAgICAgICAgICAgICAgICBleGNlcHQgUGFyc2VFeGNlcHRpb24gYXMgZXJyOg0KICAgICAgICAgICAgICAgICAgICBlcnIuX190cmFjZWJhY2tfXyA9IE5vbmUNCiAgICAgICAgICAgICAgICAgICAgaWYgZXJyLmxvYyA+IG1heEV4Y0xvYzoNCiAgICAgICAgICAgICAgICAgICAgICAgIG1heEV4Y2VwdGlvbiA9IGVycg0KICAgICAgICAgICAgICAgICAgICAgICAgbWF4RXhjTG9jID0gZXJyLmxvYw0KDQogICAgICAgIGlmIG1heEV4Y2VwdGlvbiBpcyBub3QgTm9uZToNCiAgICAgICAgICAgIG1heEV4Y2VwdGlvbi5tc2cgPSBzZWxmLmVycm1zZw0KICAgICAgICAgICAgcmFpc2UgbWF4RXhjZXB0aW9uDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCAibm8gZGVmaW5lZCBhbHRlcm5hdGl2ZXMgdG8gbWF0Y2giLCBzZWxmKQ0KDQoNCiAgICBkZWYgX19peG9yX18oc2VsZiwgb3RoZXIgKToNCiAgICAgICAgaWYgaXNpbnN0YW5jZSggb3RoZXIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIG90aGVyID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKCBvdGhlciApDQogICAgICAgIHJldHVybiBzZWxmLmFwcGVuZCggb3RoZXIgKSAjT3IoIFsgc2VsZiwgb3RoZXIgXSApDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIm5hbWUiKToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToNCiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJ7IiArICIgXiAiLmpvaW4oX3VzdHIoZSkgZm9yIGUgaW4gc2VsZi5leHBycykgKyAifSINCg0KICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByDQoNCiAgICBkZWYgY2hlY2tSZWN1cnNpb24oIHNlbGYsIHBhcnNlRWxlbWVudExpc3QgKToNCiAgICAgICAgc3ViUmVjQ2hlY2tMaXN0ID0gcGFyc2VFbGVtZW50TGlzdFs6XSArIFsgc2VsZiBdDQogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6DQogICAgICAgICAgICBlLmNoZWNrUmVjdXJzaW9uKCBzdWJSZWNDaGVja0xpc3QgKQ0KDQoNCmNsYXNzIE1hdGNoRmlyc3QoUGFyc2VFeHByZXNzaW9uKToNCiAgICAiIiINCiAgICBSZXF1aXJlcyB0aGF0IGF0IGxlYXN0IG9uZSBDe1BhcnNlRXhwcmVzc2lvbn0gaXMgZm91bmQuDQogICAgSWYgdHdvIGV4cHJlc3Npb25zIG1hdGNoLCB0aGUgZmlyc3Qgb25lIGxpc3RlZCBpcyB0aGUgb25lIHRoYXQgd2lsbCBtYXRjaC4NCiAgICBNYXkgYmUgY29uc3RydWN0ZWQgdXNpbmcgdGhlIEN7J3wnfSBvcGVyYXRvci4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICAjIGNvbnN0cnVjdCBNYXRjaEZpcnN0IHVzaW5nICd8JyBvcGVyYXRvcg0KICAgICAgICANCiAgICAgICAgIyB3YXRjaCB0aGUgb3JkZXIgb2YgZXhwcmVzc2lvbnMgdG8gbWF0Y2gNCiAgICAgICAgbnVtYmVyID0gV29yZChudW1zKSB8IENvbWJpbmUoV29yZChudW1zKSArICcuJyArIFdvcmQobnVtcykpDQogICAgICAgIHByaW50KG51bWJlci5zZWFyY2hTdHJpbmcoIjEyMyAzLjE0MTYgNzg5IikpICMgIEZhaWwhIC0+IFtbJzEyMyddLCBbJzMnXSwgWycxNDE2J10sIFsnNzg5J11dDQoNCiAgICAgICAgIyBwdXQgbW9yZSBzZWxlY3RpdmUgZXhwcmVzc2lvbiBmaXJzdA0KICAgICAgICBudW1iZXIgPSBDb21iaW5lKFdvcmQobnVtcykgKyAnLicgKyBXb3JkKG51bXMpKSB8IFdvcmQobnVtcykNCiAgICAgICAgcHJpbnQobnVtYmVyLnNlYXJjaFN0cmluZygiMTIzIDMuMTQxNiA3ODkiKSkgIyAgQmV0dGVyIC0+IFtbJzEyMyddLCBbJzMuMTQxNiddLCBbJzc4OSddXQ0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwcnMsIHNhdmVsaXN0ID0gRmFsc2UgKToNCiAgICAgICAgc3VwZXIoTWF0Y2hGaXJzdCxzZWxmKS5fX2luaXRfXyhleHBycywgc2F2ZWxpc3QpDQogICAgICAgIGlmIHNlbGYuZXhwcnM6DQogICAgICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gYW55KGUubWF5UmV0dXJuRW1wdHkgZm9yIGUgaW4gc2VsZi5leHBycykNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlDQoNCiAgICBkZWYgcGFyc2VJbXBsKCBzZWxmLCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnM9VHJ1ZSApOg0KICAgICAgICBtYXhFeGNMb2MgPSAtMQ0KICAgICAgICBtYXhFeGNlcHRpb24gPSBOb25lDQogICAgICAgIGZvciBlIGluIHNlbGYuZXhwcnM6DQogICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgcmV0ID0gZS5fcGFyc2UoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucyApDQogICAgICAgICAgICAgICAgcmV0dXJuIHJldA0KICAgICAgICAgICAgZXhjZXB0IFBhcnNlRXhjZXB0aW9uIGFzIGVycjoNCiAgICAgICAgICAgICAgICBpZiBlcnIubG9jID4gbWF4RXhjTG9jOg0KICAgICAgICAgICAgICAgICAgICBtYXhFeGNlcHRpb24gPSBlcnINCiAgICAgICAgICAgICAgICAgICAgbWF4RXhjTG9jID0gZXJyLmxvYw0KICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6DQogICAgICAgICAgICAgICAgaWYgbGVuKGluc3RyaW5nKSA+IG1heEV4Y0xvYzoNCiAgICAgICAgICAgICAgICAgICAgbWF4RXhjZXB0aW9uID0gUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsbGVuKGluc3RyaW5nKSxlLmVycm1zZyxzZWxmKQ0KICAgICAgICAgICAgICAgICAgICBtYXhFeGNMb2MgPSBsZW4oaW5zdHJpbmcpDQoNCiAgICAgICAgIyBvbmx5IGdvdCBoZXJlIGlmIG5vIGV4cHJlc3Npb24gbWF0Y2hlZCwgcmFpc2UgZXhjZXB0aW9uIGZvciBtYXRjaCB0aGF0IG1hZGUgaXQgdGhlIGZ1cnRoZXN0DQogICAgICAgIGVsc2U6DQogICAgICAgICAgICBpZiBtYXhFeGNlcHRpb24gaXMgbm90IE5vbmU6DQogICAgICAgICAgICAgICAgbWF4RXhjZXB0aW9uLm1zZyA9IHNlbGYuZXJybXNnDQogICAgICAgICAgICAgICAgcmFpc2UgbWF4RXhjZXB0aW9uDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsICJubyBkZWZpbmVkIGFsdGVybmF0aXZlcyB0byBtYXRjaCIsIHNlbGYpDQoNCiAgICBkZWYgX19pb3JfXyhzZWxmLCBvdGhlciApOg0KICAgICAgICBpZiBpc2luc3RhbmNlKCBvdGhlciwgYmFzZXN0cmluZyApOg0KICAgICAgICAgICAgb3RoZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoIG90aGVyICkNCiAgICAgICAgcmV0dXJuIHNlbGYuYXBwZW5kKCBvdGhlciApICNNYXRjaEZpcnN0KCBbIHNlbGYsIG90aGVyIF0gKQ0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJuYW1lIik6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lDQoNCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6DQogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAieyIgKyAiIHwgIi5qb2luKF91c3RyKGUpIGZvciBlIGluIHNlbGYuZXhwcnMpICsgIn0iDQoNCiAgICAgICAgcmV0dXJuIHNlbGYuc3RyUmVwcg0KDQogICAgZGVmIGNoZWNrUmVjdXJzaW9uKCBzZWxmLCBwYXJzZUVsZW1lbnRMaXN0ICk6DQogICAgICAgIHN1YlJlY0NoZWNrTGlzdCA9IHBhcnNlRWxlbWVudExpc3RbOl0gKyBbIHNlbGYgXQ0KICAgICAgICBmb3IgZSBpbiBzZWxmLmV4cHJzOg0KICAgICAgICAgICAgZS5jaGVja1JlY3Vyc2lvbiggc3ViUmVjQ2hlY2tMaXN0ICkNCg0KDQpjbGFzcyBFYWNoKFBhcnNlRXhwcmVzc2lvbik6DQogICAgIiIiDQogICAgUmVxdWlyZXMgYWxsIGdpdmVuIEN7UGFyc2VFeHByZXNzaW9ufXMgdG8gYmUgZm91bmQsIGJ1dCBpbiBhbnkgb3JkZXIuDQogICAgRXhwcmVzc2lvbnMgbWF5IGJlIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlLg0KICAgIE1heSBiZSBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgQ3snJid9IG9wZXJhdG9yLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIGNvbG9yID0gb25lT2YoIlJFRCBPUkFOR0UgWUVMTE9XIEdSRUVOIEJMVUUgUFVSUExFIEJMQUNLIFdISVRFIEJST1dOIikNCiAgICAgICAgc2hhcGVfdHlwZSA9IG9uZU9mKCJTUVVBUkUgQ0lSQ0xFIFRSSUFOR0xFIFNUQVIgSEVYQUdPTiBPQ1RBR09OIikNCiAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykNCiAgICAgICAgc2hhcGVfYXR0ciA9ICJzaGFwZToiICsgc2hhcGVfdHlwZSgic2hhcGUiKQ0KICAgICAgICBwb3NuX2F0dHIgPSAicG9zbjoiICsgR3JvdXAoaW50ZWdlcigieCIpICsgJywnICsgaW50ZWdlcigieSIpKSgicG9zbiIpDQogICAgICAgIGNvbG9yX2F0dHIgPSAiY29sb3I6IiArIGNvbG9yKCJjb2xvciIpDQogICAgICAgIHNpemVfYXR0ciA9ICJzaXplOiIgKyBpbnRlZ2VyKCJzaXplIikNCg0KICAgICAgICAjIHVzZSBFYWNoICh1c2luZyBvcGVyYXRvciAnJicpIHRvIGFjY2VwdCBhdHRyaWJ1dGVzIGluIGFueSBvcmRlciANCiAgICAgICAgIyAoc2hhcGUgYW5kIHBvc24gYXJlIHJlcXVpcmVkLCBjb2xvciBhbmQgc2l6ZSBhcmUgb3B0aW9uYWwpDQogICAgICAgIHNoYXBlX3NwZWMgPSBzaGFwZV9hdHRyICYgcG9zbl9hdHRyICYgT3B0aW9uYWwoY29sb3JfYXR0cikgJiBPcHRpb25hbChzaXplX2F0dHIpDQoNCiAgICAgICAgc2hhcGVfc3BlYy5ydW5UZXN0cygnJycNCiAgICAgICAgICAgIHNoYXBlOiBTUVVBUkUgY29sb3I6IEJMQUNLIHBvc246IDEwMCwgMTIwDQogICAgICAgICAgICBzaGFwZTogQ0lSQ0xFIHNpemU6IDUwIGNvbG9yOiBCTFVFIHBvc246IDUwLDgwDQogICAgICAgICAgICBjb2xvcjpHUkVFTiBzaXplOjIwIHNoYXBlOlRSSUFOR0xFIHBvc246MjAsNDANCiAgICAgICAgICAgICcnJw0KICAgICAgICAgICAgKQ0KICAgIHByaW50czo6DQogICAgICAgIHNoYXBlOiBTUVVBUkUgY29sb3I6IEJMQUNLIHBvc246IDEwMCwgMTIwDQogICAgICAgIFsnc2hhcGU6JywgJ1NRVUFSRScsICdjb2xvcjonLCAnQkxBQ0snLCAncG9zbjonLCBbJzEwMCcsICcsJywgJzEyMCddXQ0KICAgICAgICAtIGNvbG9yOiBCTEFDSw0KICAgICAgICAtIHBvc246IFsnMTAwJywgJywnLCAnMTIwJ10NCiAgICAgICAgICAtIHg6IDEwMA0KICAgICAgICAgIC0geTogMTIwDQogICAgICAgIC0gc2hhcGU6IFNRVUFSRQ0KDQoNCiAgICAgICAgc2hhcGU6IENJUkNMRSBzaXplOiA1MCBjb2xvcjogQkxVRSBwb3NuOiA1MCw4MA0KICAgICAgICBbJ3NoYXBlOicsICdDSVJDTEUnLCAnc2l6ZTonLCAnNTAnLCAnY29sb3I6JywgJ0JMVUUnLCAncG9zbjonLCBbJzUwJywgJywnLCAnODAnXV0NCiAgICAgICAgLSBjb2xvcjogQkxVRQ0KICAgICAgICAtIHBvc246IFsnNTAnLCAnLCcsICc4MCddDQogICAgICAgICAgLSB4OiA1MA0KICAgICAgICAgIC0geTogODANCiAgICAgICAgLSBzaGFwZTogQ0lSQ0xFDQogICAgICAgIC0gc2l6ZTogNTANCg0KDQogICAgICAgIGNvbG9yOiBHUkVFTiBzaXplOiAyMCBzaGFwZTogVFJJQU5HTEUgcG9zbjogMjAsNDANCiAgICAgICAgWydjb2xvcjonLCAnR1JFRU4nLCAnc2l6ZTonLCAnMjAnLCAnc2hhcGU6JywgJ1RSSUFOR0xFJywgJ3Bvc246JywgWycyMCcsICcsJywgJzQwJ11dDQogICAgICAgIC0gY29sb3I6IEdSRUVODQogICAgICAgIC0gcG9zbjogWycyMCcsICcsJywgJzQwJ10NCiAgICAgICAgICAtIHg6IDIwDQogICAgICAgICAgLSB5OiA0MA0KICAgICAgICAtIHNoYXBlOiBUUklBTkdMRQ0KICAgICAgICAtIHNpemU6IDIwDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHBycywgc2F2ZWxpc3QgPSBUcnVlICk6DQogICAgICAgIHN1cGVyKEVhY2gsc2VsZikuX19pbml0X18oZXhwcnMsIHNhdmVsaXN0KQ0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gYWxsKGUubWF5UmV0dXJuRW1wdHkgZm9yIGUgaW4gc2VsZi5leHBycykNCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IFRydWUNCiAgICAgICAgc2VsZi5pbml0RXhwckdyb3VwcyA9IFRydWUNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIGlmIHNlbGYuaW5pdEV4cHJHcm91cHM6DQogICAgICAgICAgICBzZWxmLm9wdDFtYXAgPSBkaWN0KChpZChlLmV4cHIpLGUpIGZvciBlIGluIHNlbGYuZXhwcnMgaWYgaXNpbnN0YW5jZShlLE9wdGlvbmFsKSkNCiAgICAgICAgICAgIG9wdDEgPSBbIGUuZXhwciBmb3IgZSBpbiBzZWxmLmV4cHJzIGlmIGlzaW5zdGFuY2UoZSxPcHRpb25hbCkgXQ0KICAgICAgICAgICAgb3B0MiA9IFsgZSBmb3IgZSBpbiBzZWxmLmV4cHJzIGlmIGUubWF5UmV0dXJuRW1wdHkgYW5kIG5vdCBpc2luc3RhbmNlKGUsT3B0aW9uYWwpXQ0KICAgICAgICAgICAgc2VsZi5vcHRpb25hbHMgPSBvcHQxICsgb3B0Mg0KICAgICAgICAgICAgc2VsZi5tdWx0aW9wdGlvbmFscyA9IFsgZS5leHByIGZvciBlIGluIHNlbGYuZXhwcnMgaWYgaXNpbnN0YW5jZShlLFplcm9Pck1vcmUpIF0NCiAgICAgICAgICAgIHNlbGYubXVsdGlyZXF1aXJlZCA9IFsgZS5leHByIGZvciBlIGluIHNlbGYuZXhwcnMgaWYgaXNpbnN0YW5jZShlLE9uZU9yTW9yZSkgXQ0KICAgICAgICAgICAgc2VsZi5yZXF1aXJlZCA9IFsgZSBmb3IgZSBpbiBzZWxmLmV4cHJzIGlmIG5vdCBpc2luc3RhbmNlKGUsKE9wdGlvbmFsLFplcm9Pck1vcmUsT25lT3JNb3JlKSkgXQ0KICAgICAgICAgICAgc2VsZi5yZXF1aXJlZCArPSBzZWxmLm11bHRpcmVxdWlyZWQNCiAgICAgICAgICAgIHNlbGYuaW5pdEV4cHJHcm91cHMgPSBGYWxzZQ0KICAgICAgICB0bXBMb2MgPSBsb2MNCiAgICAgICAgdG1wUmVxZCA9IHNlbGYucmVxdWlyZWRbOl0NCiAgICAgICAgdG1wT3B0ICA9IHNlbGYub3B0aW9uYWxzWzpdDQogICAgICAgIG1hdGNoT3JkZXIgPSBbXQ0KDQogICAgICAgIGtlZXBNYXRjaGluZyA9IFRydWUNCiAgICAgICAgd2hpbGUga2VlcE1hdGNoaW5nOg0KICAgICAgICAgICAgdG1wRXhwcnMgPSB0bXBSZXFkICsgdG1wT3B0ICsgc2VsZi5tdWx0aW9wdGlvbmFscyArIHNlbGYubXVsdGlyZXF1aXJlZA0KICAgICAgICAgICAgZmFpbGVkID0gW10NCiAgICAgICAgICAgIGZvciBlIGluIHRtcEV4cHJzOg0KICAgICAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICAgICAgdG1wTG9jID0gZS50cnlQYXJzZSggaW5zdHJpbmcsIHRtcExvYyApDQogICAgICAgICAgICAgICAgZXhjZXB0IFBhcnNlRXhjZXB0aW9uOg0KICAgICAgICAgICAgICAgICAgICBmYWlsZWQuYXBwZW5kKGUpDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgbWF0Y2hPcmRlci5hcHBlbmQoc2VsZi5vcHQxbWFwLmdldChpZChlKSxlKSkNCiAgICAgICAgICAgICAgICAgICAgaWYgZSBpbiB0bXBSZXFkOg0KICAgICAgICAgICAgICAgICAgICAgICAgdG1wUmVxZC5yZW1vdmUoZSkNCiAgICAgICAgICAgICAgICAgICAgZWxpZiBlIGluIHRtcE9wdDoNCiAgICAgICAgICAgICAgICAgICAgICAgIHRtcE9wdC5yZW1vdmUoZSkNCiAgICAgICAgICAgIGlmIGxlbihmYWlsZWQpID09IGxlbih0bXBFeHBycyk6DQogICAgICAgICAgICAgICAga2VlcE1hdGNoaW5nID0gRmFsc2UNCg0KICAgICAgICBpZiB0bXBSZXFkOg0KICAgICAgICAgICAgbWlzc2luZyA9ICIsICIuam9pbihfdXN0cihlKSBmb3IgZSBpbiB0bXBSZXFkKQ0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oaW5zdHJpbmcsbG9jLCJNaXNzaW5nIG9uZSBvciBtb3JlIHJlcXVpcmVkIGVsZW1lbnRzICglcykiICUgbWlzc2luZyApDQoNCiAgICAgICAgIyBhZGQgYW55IHVubWF0Y2hlZCBPcHRpb25hbHMsIGluIGNhc2UgdGhleSBoYXZlIGRlZmF1bHQgdmFsdWVzIGRlZmluZWQNCiAgICAgICAgbWF0Y2hPcmRlciArPSBbZSBmb3IgZSBpbiBzZWxmLmV4cHJzIGlmIGlzaW5zdGFuY2UoZSxPcHRpb25hbCkgYW5kIGUuZXhwciBpbiB0bXBPcHRdDQoNCiAgICAgICAgcmVzdWx0bGlzdCA9IFtdDQogICAgICAgIGZvciBlIGluIG1hdGNoT3JkZXI6DQogICAgICAgICAgICBsb2MscmVzdWx0cyA9IGUuX3BhcnNlKGluc3RyaW5nLGxvYyxkb0FjdGlvbnMpDQogICAgICAgICAgICByZXN1bHRsaXN0LmFwcGVuZChyZXN1bHRzKQ0KDQogICAgICAgIGZpbmFsUmVzdWx0cyA9IHN1bShyZXN1bHRsaXN0LCBQYXJzZVJlc3VsdHMoW10pKQ0KICAgICAgICByZXR1cm4gbG9jLCBmaW5hbFJlc3VsdHMNCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwibmFtZSIpOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQ0KDQogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOg0KICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gInsiICsgIiAmICIuam9pbihfdXN0cihlKSBmb3IgZSBpbiBzZWxmLmV4cHJzKSArICJ9Ig0KDQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHINCg0KICAgIGRlZiBjaGVja1JlY3Vyc2lvbiggc2VsZiwgcGFyc2VFbGVtZW50TGlzdCApOg0KICAgICAgICBzdWJSZWNDaGVja0xpc3QgPSBwYXJzZUVsZW1lbnRMaXN0WzpdICsgWyBzZWxmIF0NCiAgICAgICAgZm9yIGUgaW4gc2VsZi5leHByczoNCiAgICAgICAgICAgIGUuY2hlY2tSZWN1cnNpb24oIHN1YlJlY0NoZWNrTGlzdCApDQoNCg0KY2xhc3MgUGFyc2VFbGVtZW50RW5oYW5jZShQYXJzZXJFbGVtZW50KToNCiAgICAiIiINCiAgICBBYnN0cmFjdCBzdWJjbGFzcyBvZiBDe1BhcnNlckVsZW1lbnR9LCBmb3IgY29tYmluaW5nIGFuZCBwb3N0LXByb2Nlc3NpbmcgcGFyc2VkIHRva2Vucy4NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHIsIHNhdmVsaXN0PUZhbHNlICk6DQogICAgICAgIHN1cGVyKFBhcnNlRWxlbWVudEVuaGFuY2Usc2VsZikuX19pbml0X18oc2F2ZWxpc3QpDQogICAgICAgIGlmIGlzaW5zdGFuY2UoIGV4cHIsIGJhc2VzdHJpbmcgKToNCiAgICAgICAgICAgIGlmIGlzc3ViY2xhc3MoUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzLCBUb2tlbik6DQogICAgICAgICAgICAgICAgZXhwciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyhleHByKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBleHByID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKExpdGVyYWwoZXhwcikpDQogICAgICAgIHNlbGYuZXhwciA9IGV4cHINCiAgICAgICAgc2VsZi5zdHJSZXByID0gTm9uZQ0KICAgICAgICBpZiBleHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgc2VsZi5tYXlJbmRleEVycm9yID0gZXhwci5tYXlJbmRleEVycm9yDQogICAgICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gZXhwci5tYXlSZXR1cm5FbXB0eQ0KICAgICAgICAgICAgc2VsZi5zZXRXaGl0ZXNwYWNlQ2hhcnMoIGV4cHIud2hpdGVDaGFycyApDQogICAgICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gZXhwci5za2lwV2hpdGVzcGFjZQ0KICAgICAgICAgICAgc2VsZi5zYXZlQXNMaXN0ID0gZXhwci5zYXZlQXNMaXN0DQogICAgICAgICAgICBzZWxmLmNhbGxQcmVwYXJzZSA9IGV4cHIuY2FsbFByZXBhcnNlDQogICAgICAgICAgICBzZWxmLmlnbm9yZUV4cHJzLmV4dGVuZChleHByLmlnbm9yZUV4cHJzKQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYuZXhwci5fcGFyc2UoIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucywgY2FsbFByZVBhcnNlPUZhbHNlICkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKCIiLGxvYyxzZWxmLmVycm1zZyxzZWxmKQ0KDQogICAgZGVmIGxlYXZlV2hpdGVzcGFjZSggc2VsZiApOg0KICAgICAgICBzZWxmLnNraXBXaGl0ZXNwYWNlID0gRmFsc2UNCiAgICAgICAgc2VsZi5leHByID0gc2VsZi5leHByLmNvcHkoKQ0KICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICBzZWxmLmV4cHIubGVhdmVXaGl0ZXNwYWNlKCkNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBpZ25vcmUoIHNlbGYsIG90aGVyICk6DQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBTdXBwcmVzcyApOg0KICAgICAgICAgICAgaWYgb3RoZXIgbm90IGluIHNlbGYuaWdub3JlRXhwcnM6DQogICAgICAgICAgICAgICAgc3VwZXIoIFBhcnNlRWxlbWVudEVuaGFuY2UsIHNlbGYpLmlnbm9yZSggb3RoZXIgKQ0KICAgICAgICAgICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICAgICAgc2VsZi5leHByLmlnbm9yZSggc2VsZi5pZ25vcmVFeHByc1stMV0gKQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgc3VwZXIoIFBhcnNlRWxlbWVudEVuaGFuY2UsIHNlbGYpLmlnbm9yZSggb3RoZXIgKQ0KICAgICAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgICAgIHNlbGYuZXhwci5pZ25vcmUoIHNlbGYuaWdub3JlRXhwcnNbLTFdICkNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBzdHJlYW1saW5lKCBzZWxmICk6DQogICAgICAgIHN1cGVyKFBhcnNlRWxlbWVudEVuaGFuY2Usc2VsZikuc3RyZWFtbGluZSgpDQogICAgICAgIGlmIHNlbGYuZXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgIHNlbGYuZXhwci5zdHJlYW1saW5lKCkNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBjaGVja1JlY3Vyc2lvbiggc2VsZiwgcGFyc2VFbGVtZW50TGlzdCApOg0KICAgICAgICBpZiBzZWxmIGluIHBhcnNlRWxlbWVudExpc3Q6DQogICAgICAgICAgICByYWlzZSBSZWN1cnNpdmVHcmFtbWFyRXhjZXB0aW9uKCBwYXJzZUVsZW1lbnRMaXN0K1tzZWxmXSApDQogICAgICAgIHN1YlJlY0NoZWNrTGlzdCA9IHBhcnNlRWxlbWVudExpc3RbOl0gKyBbIHNlbGYgXQ0KICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICBzZWxmLmV4cHIuY2hlY2tSZWN1cnNpb24oIHN1YlJlY0NoZWNrTGlzdCApDQoNCiAgICBkZWYgdmFsaWRhdGUoIHNlbGYsIHZhbGlkYXRlVHJhY2U9W10gKToNCiAgICAgICAgdG1wID0gdmFsaWRhdGVUcmFjZVs6XStbc2VsZl0NCiAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgc2VsZi5leHByLnZhbGlkYXRlKHRtcCkNCiAgICAgICAgc2VsZi5jaGVja1JlY3Vyc2lvbiggW10gKQ0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgcmV0dXJuIHN1cGVyKFBhcnNlRWxlbWVudEVuaGFuY2Usc2VsZikuX19zdHJfXygpDQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246DQogICAgICAgICAgICBwYXNzDQoNCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmUgYW5kIHNlbGYuZXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICIlczooJXMpIiAlICggc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIF91c3RyKHNlbGYuZXhwcikgKQ0KICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByDQoNCg0KY2xhc3MgRm9sbG93ZWRCeShQYXJzZUVsZW1lbnRFbmhhbmNlKToNCiAgICAiIiINCiAgICBMb29rYWhlYWQgbWF0Y2hpbmcgb2YgdGhlIGdpdmVuIHBhcnNlIGV4cHJlc3Npb24uICBDe0ZvbGxvd2VkQnl9DQogICAgZG9lcyBJe25vdH0gYWR2YW5jZSB0aGUgcGFyc2luZyBwb3NpdGlvbiB3aXRoaW4gdGhlIGlucHV0IHN0cmluZywgaXQgb25seQ0KICAgIHZlcmlmaWVzIHRoYXQgdGhlIHNwZWNpZmllZCBwYXJzZSBleHByZXNzaW9uIG1hdGNoZXMgYXQgdGhlIGN1cnJlbnQNCiAgICBwb3NpdGlvbi4gIEN7Rm9sbG93ZWRCeX0gYWx3YXlzIHJldHVybnMgYSBudWxsIHRva2VuIGxpc3QuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgIyB1c2UgRm9sbG93ZWRCeSB0byBtYXRjaCBhIGxhYmVsIG9ubHkgaWYgaXQgaXMgZm9sbG93ZWQgYnkgYSAnOicNCiAgICAgICAgZGF0YV93b3JkID0gV29yZChhbHBoYXMpDQogICAgICAgIGxhYmVsID0gZGF0YV93b3JkICsgRm9sbG93ZWRCeSgnOicpDQogICAgICAgIGF0dHJfZXhwciA9IEdyb3VwKGxhYmVsICsgU3VwcHJlc3MoJzonKSArIE9uZU9yTW9yZShkYXRhX3dvcmQsIHN0b3BPbj1sYWJlbCkuc2V0UGFyc2VBY3Rpb24oJyAnLmpvaW4pKQ0KICAgICAgICANCiAgICAgICAgT25lT3JNb3JlKGF0dHJfZXhwcikucGFyc2VTdHJpbmcoInNoYXBlOiBTUVVBUkUgY29sb3I6IEJMQUNLIHBvc246IHVwcGVyIGxlZnQiKS5wcHJpbnQoKQ0KICAgIHByaW50czo6DQogICAgICAgIFtbJ3NoYXBlJywgJ1NRVUFSRSddLCBbJ2NvbG9yJywgJ0JMQUNLJ10sIFsncG9zbicsICd1cHBlciBsZWZ0J11dDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByICk6DQogICAgICAgIHN1cGVyKEZvbGxvd2VkQnksc2VsZikuX19pbml0X18oZXhwcikNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIHNlbGYuZXhwci50cnlQYXJzZSggaW5zdHJpbmcsIGxvYyApDQogICAgICAgIHJldHVybiBsb2MsIFtdDQoNCg0KY2xhc3MgTm90QW55KFBhcnNlRWxlbWVudEVuaGFuY2UpOg0KICAgICIiIg0KICAgIExvb2thaGVhZCB0byBkaXNhbGxvdyBtYXRjaGluZyB3aXRoIHRoZSBnaXZlbiBwYXJzZSBleHByZXNzaW9uLiAgQ3tOb3RBbnl9DQogICAgZG9lcyBJe25vdH0gYWR2YW5jZSB0aGUgcGFyc2luZyBwb3NpdGlvbiB3aXRoaW4gdGhlIGlucHV0IHN0cmluZywgaXQgb25seQ0KICAgIHZlcmlmaWVzIHRoYXQgdGhlIHNwZWNpZmllZCBwYXJzZSBleHByZXNzaW9uIGRvZXMgSXtub3R9IG1hdGNoIGF0IHRoZSBjdXJyZW50DQogICAgcG9zaXRpb24uICBBbHNvLCBDe05vdEFueX0gZG9lcyBJe25vdH0gc2tpcCBvdmVyIGxlYWRpbmcgd2hpdGVzcGFjZS4gQ3tOb3RBbnl9DQogICAgYWx3YXlzIHJldHVybnMgYSBudWxsIHRva2VuIGxpc3QuICBNYXkgYmUgY29uc3RydWN0ZWQgdXNpbmcgdGhlICd+JyBvcGVyYXRvci4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICANCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHIgKToNCiAgICAgICAgc3VwZXIoTm90QW55LHNlbGYpLl9faW5pdF9fKGV4cHIpDQogICAgICAgICN+IHNlbGYubGVhdmVXaGl0ZXNwYWNlKCkNCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IEZhbHNlICAjIGRvIE5PVCB1c2Ugc2VsZi5sZWF2ZVdoaXRlc3BhY2UoKSwgZG9uJ3Qgd2FudCB0byBwcm9wYWdhdGUgdG8gZXhwcnMNCiAgICAgICAgc2VsZi5tYXlSZXR1cm5FbXB0eSA9IFRydWUNCiAgICAgICAgc2VsZi5lcnJtc2cgPSAiRm91bmQgdW53YW50ZWQgdG9rZW4sICIrX3VzdHIoc2VsZi5leHByKQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgaWYgc2VsZi5leHByLmNhblBhcnNlTmV4dChpbnN0cmluZywgbG9jKToNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKGluc3RyaW5nLCBsb2MsIHNlbGYuZXJybXNnLCBzZWxmKQ0KICAgICAgICByZXR1cm4gbG9jLCBbXQ0KDQogICAgZGVmIF9fc3RyX18oIHNlbGYgKToNCiAgICAgICAgaWYgaGFzYXR0cihzZWxmLCJuYW1lIik6DQogICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lDQoNCiAgICAgICAgaWYgc2VsZi5zdHJSZXByIGlzIE5vbmU6DQogICAgICAgICAgICBzZWxmLnN0clJlcHIgPSAifnsiICsgX3VzdHIoc2VsZi5leHByKSArICJ9Ig0KDQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHINCg0KY2xhc3MgX011bHRpcGxlTWF0Y2goUGFyc2VFbGVtZW50RW5oYW5jZSk6DQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByLCBzdG9wT249Tm9uZSk6DQogICAgICAgIHN1cGVyKF9NdWx0aXBsZU1hdGNoLCBzZWxmKS5fX2luaXRfXyhleHByKQ0KICAgICAgICBzZWxmLnNhdmVBc0xpc3QgPSBUcnVlDQogICAgICAgIGVuZGVyID0gc3RvcE9uDQogICAgICAgIGlmIGlzaW5zdGFuY2UoZW5kZXIsIGJhc2VzdHJpbmcpOg0KICAgICAgICAgICAgZW5kZXIgPSBQYXJzZXJFbGVtZW50Ll9saXRlcmFsU3RyaW5nQ2xhc3MoZW5kZXIpDQogICAgICAgIHNlbGYubm90X2VuZGVyID0gfmVuZGVyIGlmIGVuZGVyIGlzIG5vdCBOb25lIGVsc2UgTm9uZQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgc2VsZl9leHByX3BhcnNlID0gc2VsZi5leHByLl9wYXJzZQ0KICAgICAgICBzZWxmX3NraXBfaWdub3JhYmxlcyA9IHNlbGYuX3NraXBJZ25vcmFibGVzDQogICAgICAgIGNoZWNrX2VuZGVyID0gc2VsZi5ub3RfZW5kZXIgaXMgbm90IE5vbmUNCiAgICAgICAgaWYgY2hlY2tfZW5kZXI6DQogICAgICAgICAgICB0cnlfbm90X2VuZGVyID0gc2VsZi5ub3RfZW5kZXIudHJ5UGFyc2UNCiAgICAgICAgDQogICAgICAgICMgbXVzdCBiZSBhdCBsZWFzdCBvbmUgKGJ1dCBmaXJzdCBzZWUgaWYgd2UgYXJlIHRoZSBzdG9wT24gc2VudGluZWw7DQogICAgICAgICMgaWYgc28sIGZhaWwpDQogICAgICAgIGlmIGNoZWNrX2VuZGVyOg0KICAgICAgICAgICAgdHJ5X25vdF9lbmRlcihpbnN0cmluZywgbG9jKQ0KICAgICAgICBsb2MsIHRva2VucyA9IHNlbGZfZXhwcl9wYXJzZSggaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zLCBjYWxsUHJlUGFyc2U9RmFsc2UgKQ0KICAgICAgICB0cnk6DQogICAgICAgICAgICBoYXNJZ25vcmVFeHBycyA9IChub3Qgbm90IHNlbGYuaWdub3JlRXhwcnMpDQogICAgICAgICAgICB3aGlsZSAxOg0KICAgICAgICAgICAgICAgIGlmIGNoZWNrX2VuZGVyOg0KICAgICAgICAgICAgICAgICAgICB0cnlfbm90X2VuZGVyKGluc3RyaW5nLCBsb2MpDQogICAgICAgICAgICAgICAgaWYgaGFzSWdub3JlRXhwcnM6DQogICAgICAgICAgICAgICAgICAgIHByZWxvYyA9IHNlbGZfc2tpcF9pZ25vcmFibGVzKCBpbnN0cmluZywgbG9jICkNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICBwcmVsb2MgPSBsb2MNCiAgICAgICAgICAgICAgICBsb2MsIHRtcHRva2VucyA9IHNlbGZfZXhwcl9wYXJzZSggaW5zdHJpbmcsIHByZWxvYywgZG9BY3Rpb25zICkNCiAgICAgICAgICAgICAgICBpZiB0bXB0b2tlbnMgb3IgdG1wdG9rZW5zLmhhc2tleXMoKToNCiAgICAgICAgICAgICAgICAgICAgdG9rZW5zICs9IHRtcHRva2Vucw0KICAgICAgICBleGNlcHQgKFBhcnNlRXhjZXB0aW9uLEluZGV4RXJyb3IpOg0KICAgICAgICAgICAgcGFzcw0KDQogICAgICAgIHJldHVybiBsb2MsIHRva2Vucw0KICAgICAgICANCmNsYXNzIE9uZU9yTW9yZShfTXVsdGlwbGVNYXRjaCk6DQogICAgIiIiDQogICAgUmVwZXRpdGlvbiBvZiBvbmUgb3IgbW9yZSBvZiB0aGUgZ2l2ZW4gZXhwcmVzc2lvbi4NCiAgICANCiAgICBQYXJhbWV0ZXJzOg0KICAgICAtIGV4cHIgLSBleHByZXNzaW9uIHRoYXQgbXVzdCBtYXRjaCBvbmUgb3IgbW9yZSB0aW1lcw0KICAgICAtIHN0b3BPbiAtIChkZWZhdWx0PUN7Tm9uZX0pIC0gZXhwcmVzc2lvbiBmb3IgYSB0ZXJtaW5hdGluZyBzZW50aW5lbA0KICAgICAgICAgIChvbmx5IHJlcXVpcmVkIGlmIHRoZSBzZW50aW5lbCB3b3VsZCBvcmRpbmFyaWx5IG1hdGNoIHRoZSByZXBldGl0aW9uIA0KICAgICAgICAgIGV4cHJlc3Npb24pICAgICAgICAgIA0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIGRhdGFfd29yZCA9IFdvcmQoYWxwaGFzKQ0KICAgICAgICBsYWJlbCA9IGRhdGFfd29yZCArIEZvbGxvd2VkQnkoJzonKQ0KICAgICAgICBhdHRyX2V4cHIgPSBHcm91cChsYWJlbCArIFN1cHByZXNzKCc6JykgKyBPbmVPck1vcmUoZGF0YV93b3JkKS5zZXRQYXJzZUFjdGlvbignICcuam9pbikpDQoNCiAgICAgICAgdGV4dCA9ICJzaGFwZTogU1FVQVJFIHBvc246IHVwcGVyIGxlZnQgY29sb3I6IEJMQUNLIg0KICAgICAgICBPbmVPck1vcmUoYXR0cl9leHByKS5wYXJzZVN0cmluZyh0ZXh0KS5wcHJpbnQoKSAgIyBGYWlsISByZWFkICdjb2xvcicgYXMgZGF0YSBpbnN0ZWFkIG9mIG5leHQgbGFiZWwgLT4gW1snc2hhcGUnLCAnU1FVQVJFIGNvbG9yJ11dDQoNCiAgICAgICAgIyB1c2Ugc3RvcE9uIGF0dHJpYnV0ZSBmb3IgT25lT3JNb3JlIHRvIGF2b2lkIHJlYWRpbmcgbGFiZWwgc3RyaW5nIGFzIHBhcnQgb2YgdGhlIGRhdGENCiAgICAgICAgYXR0cl9leHByID0gR3JvdXAobGFiZWwgKyBTdXBwcmVzcygnOicpICsgT25lT3JNb3JlKGRhdGFfd29yZCwgc3RvcE9uPWxhYmVsKS5zZXRQYXJzZUFjdGlvbignICcuam9pbikpDQogICAgICAgIE9uZU9yTW9yZShhdHRyX2V4cHIpLnBhcnNlU3RyaW5nKHRleHQpLnBwcmludCgpICMgQmV0dGVyIC0+IFtbJ3NoYXBlJywgJ1NRVUFSRSddLCBbJ3Bvc24nLCAndXBwZXIgbGVmdCddLCBbJ2NvbG9yJywgJ0JMQUNLJ11dDQogICAgICAgIA0KICAgICAgICAjIGNvdWxkIGFsc28gYmUgd3JpdHRlbiBhcw0KICAgICAgICAoYXR0cl9leHByICogKDEsKSkucGFyc2VTdHJpbmcodGV4dCkucHByaW50KCkNCiAgICAiIiINCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwibmFtZSIpOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQ0KDQogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOg0KICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gInsiICsgX3VzdHIoc2VsZi5leHByKSArICJ9Li4uIg0KDQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHINCg0KY2xhc3MgWmVyb09yTW9yZShfTXVsdGlwbGVNYXRjaCk6DQogICAgIiIiDQogICAgT3B0aW9uYWwgcmVwZXRpdGlvbiBvZiB6ZXJvIG9yIG1vcmUgb2YgdGhlIGdpdmVuIGV4cHJlc3Npb24uDQogICAgDQogICAgUGFyYW1ldGVyczoNCiAgICAgLSBleHByIC0gZXhwcmVzc2lvbiB0aGF0IG11c3QgbWF0Y2ggemVybyBvciBtb3JlIHRpbWVzDQogICAgIC0gc3RvcE9uIC0gKGRlZmF1bHQ9Q3tOb25lfSkgLSBleHByZXNzaW9uIGZvciBhIHRlcm1pbmF0aW5nIHNlbnRpbmVsDQogICAgICAgICAgKG9ubHkgcmVxdWlyZWQgaWYgdGhlIHNlbnRpbmVsIHdvdWxkIG9yZGluYXJpbHkgbWF0Y2ggdGhlIHJlcGV0aXRpb24gDQogICAgICAgICAgZXhwcmVzc2lvbikgICAgICAgICAgDQoNCiAgICBFeGFtcGxlOiBzaW1pbGFyIHRvIEx7T25lT3JNb3JlfQ0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciwgc3RvcE9uPU5vbmUpOg0KICAgICAgICBzdXBlcihaZXJvT3JNb3JlLHNlbGYpLl9faW5pdF9fKGV4cHIsIHN0b3BPbj1zdG9wT24pDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlDQogICAgICAgIA0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHJldHVybiBzdXBlcihaZXJvT3JNb3JlLCBzZWxmKS5wYXJzZUltcGwoaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zKQ0KICAgICAgICBleGNlcHQgKFBhcnNlRXhjZXB0aW9uLEluZGV4RXJyb3IpOg0KICAgICAgICAgICAgcmV0dXJuIGxvYywgW10NCg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwibmFtZSIpOg0KICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQ0KDQogICAgICAgIGlmIHNlbGYuc3RyUmVwciBpcyBOb25lOg0KICAgICAgICAgICAgc2VsZi5zdHJSZXByID0gIlsiICsgX3VzdHIoc2VsZi5leHByKSArICJdLi4uIg0KDQogICAgICAgIHJldHVybiBzZWxmLnN0clJlcHINCg0KY2xhc3MgX051bGxUb2tlbihvYmplY3QpOg0KICAgIGRlZiBfX2Jvb2xfXyhzZWxmKToNCiAgICAgICAgcmV0dXJuIEZhbHNlDQogICAgX19ub256ZXJvX18gPSBfX2Jvb2xfXw0KICAgIGRlZiBfX3N0cl9fKHNlbGYpOg0KICAgICAgICByZXR1cm4gIiINCg0KX29wdGlvbmFsTm90TWF0Y2hlZCA9IF9OdWxsVG9rZW4oKQ0KY2xhc3MgT3B0aW9uYWwoUGFyc2VFbGVtZW50RW5oYW5jZSk6DQogICAgIiIiDQogICAgT3B0aW9uYWwgbWF0Y2hpbmcgb2YgdGhlIGdpdmVuIGV4cHJlc3Npb24uDQoNCiAgICBQYXJhbWV0ZXJzOg0KICAgICAtIGV4cHIgLSBleHByZXNzaW9uIHRoYXQgbXVzdCBtYXRjaCB6ZXJvIG9yIG1vcmUgdGltZXMNCiAgICAgLSBkZWZhdWx0IChvcHRpb25hbCkgLSB2YWx1ZSB0byBiZSByZXR1cm5lZCBpZiB0aGUgb3B0aW9uYWwgZXhwcmVzc2lvbiBpcyBub3QgZm91bmQuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgIyBVUyBwb3N0YWwgY29kZSBjYW4gYmUgYSA1LWRpZ2l0IHppcCwgcGx1cyBvcHRpb25hbCA0LWRpZ2l0IHF1YWxpZmllcg0KICAgICAgICB6aXAgPSBDb21iaW5lKFdvcmQobnVtcywgZXhhY3Q9NSkgKyBPcHRpb25hbCgnLScgKyBXb3JkKG51bXMsIGV4YWN0PTQpKSkNCiAgICAgICAgemlwLnJ1blRlc3RzKCcnJw0KICAgICAgICAgICAgIyB0cmFkaXRpb25hbCBaSVAgY29kZQ0KICAgICAgICAgICAgMTIzNDUNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgIyBaSVArNCBmb3JtDQogICAgICAgICAgICAxMjEwMS0wMDAxDQogICAgICAgICAgICANCiAgICAgICAgICAgICMgaW52YWxpZCBaSVANCiAgICAgICAgICAgIDk4NzY1LQ0KICAgICAgICAgICAgJycnKQ0KICAgIHByaW50czo6DQogICAgICAgICMgdHJhZGl0aW9uYWwgWklQIGNvZGUNCiAgICAgICAgMTIzNDUNCiAgICAgICAgWycxMjM0NSddDQoNCiAgICAgICAgIyBaSVArNCBmb3JtDQogICAgICAgIDEyMTAxLTAwMDENCiAgICAgICAgWycxMjEwMS0wMDAxJ10NCg0KICAgICAgICAjIGludmFsaWQgWklQDQogICAgICAgIDk4NzY1LQ0KICAgICAgICAgICAgIF4NCiAgICAgICAgRkFJTDogRXhwZWN0ZWQgZW5kIG9mIHRleHQgKGF0IGNoYXIgNSksIChsaW5lOjEsIGNvbDo2KQ0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciwgZGVmYXVsdD1fb3B0aW9uYWxOb3RNYXRjaGVkICk6DQogICAgICAgIHN1cGVyKE9wdGlvbmFsLHNlbGYpLl9faW5pdF9fKCBleHByLCBzYXZlbGlzdD1GYWxzZSApDQogICAgICAgIHNlbGYuc2F2ZUFzTGlzdCA9IHNlbGYuZXhwci5zYXZlQXNMaXN0DQogICAgICAgIHNlbGYuZGVmYXVsdFZhbHVlID0gZGVmYXVsdA0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gVHJ1ZQ0KDQogICAgZGVmIHBhcnNlSW1wbCggc2VsZiwgaW5zdHJpbmcsIGxvYywgZG9BY3Rpb25zPVRydWUgKToNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgbG9jLCB0b2tlbnMgPSBzZWxmLmV4cHIuX3BhcnNlKCBpbnN0cmluZywgbG9jLCBkb0FjdGlvbnMsIGNhbGxQcmVQYXJzZT1GYWxzZSApDQogICAgICAgIGV4Y2VwdCAoUGFyc2VFeGNlcHRpb24sSW5kZXhFcnJvcik6DQogICAgICAgICAgICBpZiBzZWxmLmRlZmF1bHRWYWx1ZSBpcyBub3QgX29wdGlvbmFsTm90TWF0Y2hlZDoNCiAgICAgICAgICAgICAgICBpZiBzZWxmLmV4cHIucmVzdWx0c05hbWU6DQogICAgICAgICAgICAgICAgICAgIHRva2VucyA9IFBhcnNlUmVzdWx0cyhbIHNlbGYuZGVmYXVsdFZhbHVlIF0pDQogICAgICAgICAgICAgICAgICAgIHRva2Vuc1tzZWxmLmV4cHIucmVzdWx0c05hbWVdID0gc2VsZi5kZWZhdWx0VmFsdWUNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICB0b2tlbnMgPSBbIHNlbGYuZGVmYXVsdFZhbHVlIF0NCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgdG9rZW5zID0gW10NCiAgICAgICAgcmV0dXJuIGxvYywgdG9rZW5zDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIm5hbWUiKToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUNCg0KICAgICAgICBpZiBzZWxmLnN0clJlcHIgaXMgTm9uZToNCiAgICAgICAgICAgIHNlbGYuc3RyUmVwciA9ICJbIiArIF91c3RyKHNlbGYuZXhwcikgKyAiXSINCg0KICAgICAgICByZXR1cm4gc2VsZi5zdHJSZXByDQoNCmNsYXNzIFNraXBUbyhQYXJzZUVsZW1lbnRFbmhhbmNlKToNCiAgICAiIiINCiAgICBUb2tlbiBmb3Igc2tpcHBpbmcgb3ZlciBhbGwgdW5kZWZpbmVkIHRleHQgdW50aWwgdGhlIG1hdGNoZWQgZXhwcmVzc2lvbiBpcyBmb3VuZC4NCg0KICAgIFBhcmFtZXRlcnM6DQogICAgIC0gZXhwciAtIHRhcmdldCBleHByZXNzaW9uIG1hcmtpbmcgdGhlIGVuZCBvZiB0aGUgZGF0YSB0byBiZSBza2lwcGVkDQogICAgIC0gaW5jbHVkZSAtIChkZWZhdWx0PUN7RmFsc2V9KSBpZiBUcnVlLCB0aGUgdGFyZ2V0IGV4cHJlc3Npb24gaXMgYWxzbyBwYXJzZWQgDQogICAgICAgICAgKHRoZSBza2lwcGVkIHRleHQgYW5kIHRhcmdldCBleHByZXNzaW9uIGFyZSByZXR1cm5lZCBhcyBhIDItZWxlbWVudCBsaXN0KS4NCiAgICAgLSBpZ25vcmUgLSAoZGVmYXVsdD1De05vbmV9KSB1c2VkIHRvIGRlZmluZSBncmFtbWFycyAodHlwaWNhbGx5IHF1b3RlZCBzdHJpbmdzIGFuZCANCiAgICAgICAgICBjb21tZW50cykgdGhhdCBtaWdodCBjb250YWluIGZhbHNlIG1hdGNoZXMgdG8gdGhlIHRhcmdldCBleHByZXNzaW9uDQogICAgIC0gZmFpbE9uIC0gKGRlZmF1bHQ9Q3tOb25lfSkgZGVmaW5lIGV4cHJlc3Npb25zIHRoYXQgYXJlIG5vdCBhbGxvd2VkIHRvIGJlIA0KICAgICAgICAgIGluY2x1ZGVkIGluIHRoZSBza2lwcGVkIHRlc3Q7IGlmIGZvdW5kIGJlZm9yZSB0aGUgdGFyZ2V0IGV4cHJlc3Npb24gaXMgZm91bmQsIA0KICAgICAgICAgIHRoZSBTa2lwVG8gaXMgbm90IGEgbWF0Y2gNCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICByZXBvcnQgPSAnJycNCiAgICAgICAgICAgIE91dHN0YW5kaW5nIElzc3VlcyBSZXBvcnQgLSAxIEphbiAyMDAwDQoNCiAgICAgICAgICAgICAgICMgfCBTZXZlcml0eSB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIERheXMgT3Blbg0KICAgICAgICAgICAgLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tDQogICAgICAgICAgICAgMTAxIHwgQ3JpdGljYWwgfCBJbnRlcm1pdHRlbnQgc3lzdGVtIGNyYXNoICAgICAgICAgICAgICAgICB8ICAgICAgICAgIDYNCiAgICAgICAgICAgICAgOTQgfCBDb3NtZXRpYyB8IFNwZWxsaW5nIGVycm9yIG9uIExvZ2luICgnbG9nfG4nKSAgICAgICAgIHwgICAgICAgICAxNA0KICAgICAgICAgICAgICA3OSB8IE1pbm9yICAgIHwgU3lzdGVtIHNsb3cgd2hlbiBydW5uaW5nIHRvbyBtYW55IHJlcG9ydHMgfCAgICAgICAgIDQ3DQogICAgICAgICAgICAnJycNCiAgICAgICAgaW50ZWdlciA9IFdvcmQobnVtcykNCiAgICAgICAgU0VQID0gU3VwcHJlc3MoJ3wnKQ0KICAgICAgICAjIHVzZSBTa2lwVG8gdG8gc2ltcGx5IG1hdGNoIGV2ZXJ5dGhpbmcgdXAgdW50aWwgdGhlIG5leHQgU0VQDQogICAgICAgICMgLSBpZ25vcmUgcXVvdGVkIHN0cmluZ3MsIHNvIHRoYXQgYSAnfCcgY2hhcmFjdGVyIGluc2lkZSBhIHF1b3RlZCBzdHJpbmcgZG9lcyBub3QgbWF0Y2gNCiAgICAgICAgIyAtIHBhcnNlIGFjdGlvbiB3aWxsIGNhbGwgdG9rZW4uc3RyaXAoKSBmb3IgZWFjaCBtYXRjaGVkIHRva2VuLCBpLmUuLCB0aGUgZGVzY3JpcHRpb24gYm9keQ0KICAgICAgICBzdHJpbmdfZGF0YSA9IFNraXBUbyhTRVAsIGlnbm9yZT1xdW90ZWRTdHJpbmcpDQogICAgICAgIHN0cmluZ19kYXRhLnNldFBhcnNlQWN0aW9uKHRva2VuTWFwKHN0ci5zdHJpcCkpDQogICAgICAgIHRpY2tldF9leHByID0gKGludGVnZXIoImlzc3VlX251bSIpICsgU0VQIA0KICAgICAgICAgICAgICAgICAgICAgICsgc3RyaW5nX2RhdGEoInNldiIpICsgU0VQIA0KICAgICAgICAgICAgICAgICAgICAgICsgc3RyaW5nX2RhdGEoImRlc2MiKSArIFNFUCANCiAgICAgICAgICAgICAgICAgICAgICArIGludGVnZXIoImRheXNfb3BlbiIpKQ0KICAgICAgICANCiAgICAgICAgZm9yIHRrdCBpbiB0aWNrZXRfZXhwci5zZWFyY2hTdHJpbmcocmVwb3J0KToNCiAgICAgICAgICAgIHByaW50IHRrdC5kdW1wKCkNCiAgICBwcmludHM6Og0KICAgICAgICBbJzEwMScsICdDcml0aWNhbCcsICdJbnRlcm1pdHRlbnQgc3lzdGVtIGNyYXNoJywgJzYnXQ0KICAgICAgICAtIGRheXNfb3BlbjogNg0KICAgICAgICAtIGRlc2M6IEludGVybWl0dGVudCBzeXN0ZW0gY3Jhc2gNCiAgICAgICAgLSBpc3N1ZV9udW06IDEwMQ0KICAgICAgICAtIHNldjogQ3JpdGljYWwNCiAgICAgICAgWyc5NCcsICdDb3NtZXRpYycsICJTcGVsbGluZyBlcnJvciBvbiBMb2dpbiAoJ2xvZ3xuJykiLCAnMTQnXQ0KICAgICAgICAtIGRheXNfb3BlbjogMTQNCiAgICAgICAgLSBkZXNjOiBTcGVsbGluZyBlcnJvciBvbiBMb2dpbiAoJ2xvZ3xuJykNCiAgICAgICAgLSBpc3N1ZV9udW06IDk0DQogICAgICAgIC0gc2V2OiBDb3NtZXRpYw0KICAgICAgICBbJzc5JywgJ01pbm9yJywgJ1N5c3RlbSBzbG93IHdoZW4gcnVubmluZyB0b28gbWFueSByZXBvcnRzJywgJzQ3J10NCiAgICAgICAgLSBkYXlzX29wZW46IDQ3DQogICAgICAgIC0gZGVzYzogU3lzdGVtIHNsb3cgd2hlbiBydW5uaW5nIHRvbyBtYW55IHJlcG9ydHMNCiAgICAgICAgLSBpc3N1ZV9udW06IDc5DQogICAgICAgIC0gc2V2OiBNaW5vcg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgb3RoZXIsIGluY2x1ZGU9RmFsc2UsIGlnbm9yZT1Ob25lLCBmYWlsT249Tm9uZSApOg0KICAgICAgICBzdXBlciggU2tpcFRvLCBzZWxmICkuX19pbml0X18oIG90aGVyICkNCiAgICAgICAgc2VsZi5pZ25vcmVFeHByID0gaWdub3JlDQogICAgICAgIHNlbGYubWF5UmV0dXJuRW1wdHkgPSBUcnVlDQogICAgICAgIHNlbGYubWF5SW5kZXhFcnJvciA9IEZhbHNlDQogICAgICAgIHNlbGYuaW5jbHVkZU1hdGNoID0gaW5jbHVkZQ0KICAgICAgICBzZWxmLmFzTGlzdCA9IEZhbHNlDQogICAgICAgIGlmIGlzaW5zdGFuY2UoZmFpbE9uLCBiYXNlc3RyaW5nKToNCiAgICAgICAgICAgIHNlbGYuZmFpbE9uID0gUGFyc2VyRWxlbWVudC5fbGl0ZXJhbFN0cmluZ0NsYXNzKGZhaWxPbikNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHNlbGYuZmFpbE9uID0gZmFpbE9uDQogICAgICAgIHNlbGYuZXJybXNnID0gIk5vIG1hdGNoIGZvdW5kIGZvciAiK191c3RyKHNlbGYuZXhwcikNCg0KICAgIGRlZiBwYXJzZUltcGwoIHNlbGYsIGluc3RyaW5nLCBsb2MsIGRvQWN0aW9ucz1UcnVlICk6DQogICAgICAgIHN0YXJ0bG9jID0gbG9jDQogICAgICAgIGluc3RybGVuID0gbGVuKGluc3RyaW5nKQ0KICAgICAgICBleHByID0gc2VsZi5leHByDQogICAgICAgIGV4cHJfcGFyc2UgPSBzZWxmLmV4cHIuX3BhcnNlDQogICAgICAgIHNlbGZfZmFpbE9uX2NhblBhcnNlTmV4dCA9IHNlbGYuZmFpbE9uLmNhblBhcnNlTmV4dCBpZiBzZWxmLmZhaWxPbiBpcyBub3QgTm9uZSBlbHNlIE5vbmUNCiAgICAgICAgc2VsZl9pZ25vcmVFeHByX3RyeVBhcnNlID0gc2VsZi5pZ25vcmVFeHByLnRyeVBhcnNlIGlmIHNlbGYuaWdub3JlRXhwciBpcyBub3QgTm9uZSBlbHNlIE5vbmUNCiAgICAgICAgDQogICAgICAgIHRtcGxvYyA9IGxvYw0KICAgICAgICB3aGlsZSB0bXBsb2MgPD0gaW5zdHJsZW46DQogICAgICAgICAgICBpZiBzZWxmX2ZhaWxPbl9jYW5QYXJzZU5leHQgaXMgbm90IE5vbmU6DQogICAgICAgICAgICAgICAgIyBicmVhayBpZiBmYWlsT24gZXhwcmVzc2lvbiBtYXRjaGVzDQogICAgICAgICAgICAgICAgaWYgc2VsZl9mYWlsT25fY2FuUGFyc2VOZXh0KGluc3RyaW5nLCB0bXBsb2MpOg0KICAgICAgICAgICAgICAgICAgICBicmVhaw0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIGlmIHNlbGZfaWdub3JlRXhwcl90cnlQYXJzZSBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICAjIGFkdmFuY2UgcGFzdCBpZ25vcmUgZXhwcmVzc2lvbnMNCiAgICAgICAgICAgICAgICB3aGlsZSAxOg0KICAgICAgICAgICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgICAgICAgICB0bXBsb2MgPSBzZWxmX2lnbm9yZUV4cHJfdHJ5UGFyc2UoaW5zdHJpbmcsIHRtcGxvYykNCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFBhcnNlQmFzZUV4Y2VwdGlvbjoNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrDQogICAgICAgICAgICANCiAgICAgICAgICAgIHRyeToNCiAgICAgICAgICAgICAgICBleHByX3BhcnNlKGluc3RyaW5nLCB0bXBsb2MsIGRvQWN0aW9ucz1GYWxzZSwgY2FsbFByZVBhcnNlPUZhbHNlKQ0KICAgICAgICAgICAgZXhjZXB0IChQYXJzZUV4Y2VwdGlvbiwgSW5kZXhFcnJvcik6DQogICAgICAgICAgICAgICAgIyBubyBtYXRjaCwgYWR2YW5jZSBsb2MgaW4gc3RyaW5nDQogICAgICAgICAgICAgICAgdG1wbG9jICs9IDENCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgIyBtYXRjaGVkIHNraXB0byBleHByLCBkb25lDQogICAgICAgICAgICAgICAgYnJlYWsNCg0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgIyByYW4gb2ZmIHRoZSBlbmQgb2YgdGhlIGlucHV0IHN0cmluZyB3aXRob3V0IG1hdGNoaW5nIHNraXB0byBleHByLCBmYWlsDQogICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihpbnN0cmluZywgbG9jLCBzZWxmLmVycm1zZywgc2VsZikNCg0KICAgICAgICAjIGJ1aWxkIHVwIHJldHVybiB2YWx1ZXMNCiAgICAgICAgbG9jID0gdG1wbG9jDQogICAgICAgIHNraXB0ZXh0ID0gaW5zdHJpbmdbc3RhcnRsb2M6bG9jXQ0KICAgICAgICBza2lwcmVzdWx0ID0gUGFyc2VSZXN1bHRzKHNraXB0ZXh0KQ0KICAgICAgICANCiAgICAgICAgaWYgc2VsZi5pbmNsdWRlTWF0Y2g6DQogICAgICAgICAgICBsb2MsIG1hdCA9IGV4cHJfcGFyc2UoaW5zdHJpbmcsbG9jLGRvQWN0aW9ucyxjYWxsUHJlUGFyc2U9RmFsc2UpDQogICAgICAgICAgICBza2lwcmVzdWx0ICs9IG1hdA0KDQogICAgICAgIHJldHVybiBsb2MsIHNraXByZXN1bHQNCg0KY2xhc3MgRm9yd2FyZChQYXJzZUVsZW1lbnRFbmhhbmNlKToNCiAgICAiIiINCiAgICBGb3J3YXJkIGRlY2xhcmF0aW9uIG9mIGFuIGV4cHJlc3Npb24gdG8gYmUgZGVmaW5lZCBsYXRlciAtDQogICAgdXNlZCBmb3IgcmVjdXJzaXZlIGdyYW1tYXJzLCBzdWNoIGFzIGFsZ2VicmFpYyBpbmZpeCBub3RhdGlvbi4NCiAgICBXaGVuIHRoZSBleHByZXNzaW9uIGlzIGtub3duLCBpdCBpcyBhc3NpZ25lZCB0byB0aGUgQ3tGb3J3YXJkfSB2YXJpYWJsZSB1c2luZyB0aGUgJzw8JyBvcGVyYXRvci4NCg0KICAgIE5vdGU6IHRha2UgY2FyZSB3aGVuIGFzc2lnbmluZyB0byBDe0ZvcndhcmR9IG5vdCB0byBvdmVybG9vayBwcmVjZWRlbmNlIG9mIG9wZXJhdG9ycy4NCiAgICBTcGVjaWZpY2FsbHksICd8JyBoYXMgYSBsb3dlciBwcmVjZWRlbmNlIHRoYW4gJzw8Jywgc28gdGhhdDo6DQogICAgICAgIGZ3ZEV4cHIgPDwgYSB8IGIgfCBjDQogICAgd2lsbCBhY3R1YWxseSBiZSBldmFsdWF0ZWQgYXM6Og0KICAgICAgICAoZndkRXhwciA8PCBhKSB8IGIgfCBjDQogICAgdGhlcmVieSBsZWF2aW5nIGIgYW5kIGMgb3V0IGFzIHBhcnNlYWJsZSBhbHRlcm5hdGl2ZXMuICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHlvdQ0KICAgIGV4cGxpY2l0bHkgZ3JvdXAgdGhlIHZhbHVlcyBpbnNlcnRlZCBpbnRvIHRoZSBDe0ZvcndhcmR9OjoNCiAgICAgICAgZndkRXhwciA8PCAoYSB8IGIgfCBjKQ0KICAgIENvbnZlcnRpbmcgdG8gdXNlIHRoZSAnPDw9JyBvcGVyYXRvciBpbnN0ZWFkIHdpbGwgYXZvaWQgdGhpcyBwcm9ibGVtLg0KDQogICAgU2VlIEx7UGFyc2VSZXN1bHRzLnBwcmludH0gZm9yIGFuIGV4YW1wbGUgb2YgYSByZWN1cnNpdmUgcGFyc2VyIGNyZWF0ZWQgdXNpbmcNCiAgICBDe0ZvcndhcmR9Lg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgb3RoZXI9Tm9uZSApOg0KICAgICAgICBzdXBlcihGb3J3YXJkLHNlbGYpLl9faW5pdF9fKCBvdGhlciwgc2F2ZWxpc3Q9RmFsc2UgKQ0KDQogICAgZGVmIF9fbHNoaWZ0X18oIHNlbGYsIG90aGVyICk6DQogICAgICAgIGlmIGlzaW5zdGFuY2UoIG90aGVyLCBiYXNlc3RyaW5nICk6DQogICAgICAgICAgICBvdGhlciA9IFBhcnNlckVsZW1lbnQuX2xpdGVyYWxTdHJpbmdDbGFzcyhvdGhlcikNCiAgICAgICAgc2VsZi5leHByID0gb3RoZXINCiAgICAgICAgc2VsZi5zdHJSZXByID0gTm9uZQ0KICAgICAgICBzZWxmLm1heUluZGV4RXJyb3IgPSBzZWxmLmV4cHIubWF5SW5kZXhFcnJvcg0KICAgICAgICBzZWxmLm1heVJldHVybkVtcHR5ID0gc2VsZi5leHByLm1heVJldHVybkVtcHR5DQogICAgICAgIHNlbGYuc2V0V2hpdGVzcGFjZUNoYXJzKCBzZWxmLmV4cHIud2hpdGVDaGFycyApDQogICAgICAgIHNlbGYuc2tpcFdoaXRlc3BhY2UgPSBzZWxmLmV4cHIuc2tpcFdoaXRlc3BhY2UNCiAgICAgICAgc2VsZi5zYXZlQXNMaXN0ID0gc2VsZi5leHByLnNhdmVBc0xpc3QNCiAgICAgICAgc2VsZi5pZ25vcmVFeHBycy5leHRlbmQoc2VsZi5leHByLmlnbm9yZUV4cHJzKQ0KICAgICAgICByZXR1cm4gc2VsZg0KICAgICAgICANCiAgICBkZWYgX19pbHNoaWZ0X18oc2VsZiwgb3RoZXIpOg0KICAgICAgICByZXR1cm4gc2VsZiA8PCBvdGhlcg0KICAgIA0KICAgIGRlZiBsZWF2ZVdoaXRlc3BhY2UoIHNlbGYgKToNCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IEZhbHNlDQogICAgICAgIHJldHVybiBzZWxmDQoNCiAgICBkZWYgc3RyZWFtbGluZSggc2VsZiApOg0KICAgICAgICBpZiBub3Qgc2VsZi5zdHJlYW1saW5lZDoNCiAgICAgICAgICAgIHNlbGYuc3RyZWFtbGluZWQgPSBUcnVlDQogICAgICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICAgICAgc2VsZi5leHByLnN0cmVhbWxpbmUoKQ0KICAgICAgICByZXR1cm4gc2VsZg0KDQogICAgZGVmIHZhbGlkYXRlKCBzZWxmLCB2YWxpZGF0ZVRyYWNlPVtdICk6DQogICAgICAgIGlmIHNlbGYgbm90IGluIHZhbGlkYXRlVHJhY2U6DQogICAgICAgICAgICB0bXAgPSB2YWxpZGF0ZVRyYWNlWzpdK1tzZWxmXQ0KICAgICAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgICAgIHNlbGYuZXhwci52YWxpZGF0ZSh0bXApDQogICAgICAgIHNlbGYuY2hlY2tSZWN1cnNpb24oW10pDQoNCiAgICBkZWYgX19zdHJfXyggc2VsZiApOg0KICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIm5hbWUiKToNCiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUNCiAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fICsgIjogLi4uIg0KDQogICAgICAgICMgc3R1YmJlZCBvdXQgZm9yIG5vdyAtIGNyZWF0ZXMgYXdmdWwgbWVtb3J5IGFuZCBwZXJmIGlzc3Vlcw0KICAgICAgICBzZWxmLl9yZXZlcnRDbGFzcyA9IHNlbGYuX19jbGFzc19fDQogICAgICAgIHNlbGYuX19jbGFzc19fID0gX0ZvcndhcmROb1JlY3Vyc2UNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgaWYgc2VsZi5leHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgICAgIHJldFN0cmluZyA9IF91c3RyKHNlbGYuZXhwcikNCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgcmV0U3RyaW5nID0gIk5vbmUiDQogICAgICAgIGZpbmFsbHk6DQogICAgICAgICAgICBzZWxmLl9fY2xhc3NfXyA9IHNlbGYuX3JldmVydENsYXNzDQogICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXyArICI6ICIgKyByZXRTdHJpbmcNCg0KICAgIGRlZiBjb3B5KHNlbGYpOg0KICAgICAgICBpZiBzZWxmLmV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICByZXR1cm4gc3VwZXIoRm9yd2FyZCxzZWxmKS5jb3B5KCkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJldCA9IEZvcndhcmQoKQ0KICAgICAgICAgICAgcmV0IDw8PSBzZWxmDQogICAgICAgICAgICByZXR1cm4gcmV0DQoNCmNsYXNzIF9Gb3J3YXJkTm9SZWN1cnNlKEZvcndhcmQpOg0KICAgIGRlZiBfX3N0cl9fKCBzZWxmICk6DQogICAgICAgIHJldHVybiAiLi4uIg0KDQpjbGFzcyBUb2tlbkNvbnZlcnRlcihQYXJzZUVsZW1lbnRFbmhhbmNlKToNCiAgICAiIiINCiAgICBBYnN0cmFjdCBzdWJjbGFzcyBvZiBDe1BhcnNlRXhwcmVzc2lvbn0sIGZvciBjb252ZXJ0aW5nIHBhcnNlZCByZXN1bHRzLg0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciwgc2F2ZWxpc3Q9RmFsc2UgKToNCiAgICAgICAgc3VwZXIoVG9rZW5Db252ZXJ0ZXIsc2VsZikuX19pbml0X18oIGV4cHIgKSMsIHNhdmVsaXN0ICkNCiAgICAgICAgc2VsZi5zYXZlQXNMaXN0ID0gRmFsc2UNCg0KY2xhc3MgQ29tYmluZShUb2tlbkNvbnZlcnRlcik6DQogICAgIiIiDQogICAgQ29udmVydGVyIHRvIGNvbmNhdGVuYXRlIGFsbCBtYXRjaGluZyB0b2tlbnMgdG8gYSBzaW5nbGUgc3RyaW5nLg0KICAgIEJ5IGRlZmF1bHQsIHRoZSBtYXRjaGluZyBwYXR0ZXJucyBtdXN0IGFsc28gYmUgY29udGlndW91cyBpbiB0aGUgaW5wdXQgc3RyaW5nOw0KICAgIHRoaXMgY2FuIGJlIGRpc2FibGVkIGJ5IHNwZWNpZnlpbmcgQ3snYWRqYWNlbnQ9RmFsc2UnfSBpbiB0aGUgY29uc3RydWN0b3IuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgcmVhbCA9IFdvcmQobnVtcykgKyAnLicgKyBXb3JkKG51bXMpDQogICAgICAgIHByaW50KHJlYWwucGFyc2VTdHJpbmcoJzMuMTQxNicpKSAjIC0+IFsnMycsICcuJywgJzE0MTYnXQ0KICAgICAgICAjIHdpbGwgYWxzbyBlcnJvbmVvdXNseSBtYXRjaCB0aGUgZm9sbG93aW5nDQogICAgICAgIHByaW50KHJlYWwucGFyc2VTdHJpbmcoJzMuIDE0MTYnKSkgIyAtPiBbJzMnLCAnLicsICcxNDE2J10NCg0KICAgICAgICByZWFsID0gQ29tYmluZShXb3JkKG51bXMpICsgJy4nICsgV29yZChudW1zKSkNCiAgICAgICAgcHJpbnQocmVhbC5wYXJzZVN0cmluZygnMy4xNDE2JykpICMgLT4gWyczLjE0MTYnXQ0KICAgICAgICAjIG5vIG1hdGNoIHdoZW4gdGhlcmUgYXJlIGludGVybmFsIHNwYWNlcw0KICAgICAgICBwcmludChyZWFsLnBhcnNlU3RyaW5nKCczLiAxNDE2JykpICMgLT4gRXhjZXB0aW9uOiBFeHBlY3RlZCBXOigwMTIzLi4uKQ0KICAgICIiIg0KICAgIGRlZiBfX2luaXRfXyggc2VsZiwgZXhwciwgam9pblN0cmluZz0iIiwgYWRqYWNlbnQ9VHJ1ZSApOg0KICAgICAgICBzdXBlcihDb21iaW5lLHNlbGYpLl9faW5pdF9fKCBleHByICkNCiAgICAgICAgIyBzdXBwcmVzcyB3aGl0ZXNwYWNlLXN0cmlwcGluZyBpbiBjb250YWluZWQgcGFyc2UgZXhwcmVzc2lvbnMsIGJ1dCByZS1lbmFibGUgaXQgb24gdGhlIENvbWJpbmUgaXRzZWxmDQogICAgICAgIGlmIGFkamFjZW50Og0KICAgICAgICAgICAgc2VsZi5sZWF2ZVdoaXRlc3BhY2UoKQ0KICAgICAgICBzZWxmLmFkamFjZW50ID0gYWRqYWNlbnQNCiAgICAgICAgc2VsZi5za2lwV2hpdGVzcGFjZSA9IFRydWUNCiAgICAgICAgc2VsZi5qb2luU3RyaW5nID0gam9pblN0cmluZw0KICAgICAgICBzZWxmLmNhbGxQcmVwYXJzZSA9IFRydWUNCg0KICAgIGRlZiBpZ25vcmUoIHNlbGYsIG90aGVyICk6DQogICAgICAgIGlmIHNlbGYuYWRqYWNlbnQ6DQogICAgICAgICAgICBQYXJzZXJFbGVtZW50Lmlnbm9yZShzZWxmLCBvdGhlcikNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHN1cGVyKCBDb21iaW5lLCBzZWxmKS5pZ25vcmUoIG90aGVyICkNCiAgICAgICAgcmV0dXJuIHNlbGYNCg0KICAgIGRlZiBwb3N0UGFyc2UoIHNlbGYsIGluc3RyaW5nLCBsb2MsIHRva2VubGlzdCApOg0KICAgICAgICByZXRUb2tzID0gdG9rZW5saXN0LmNvcHkoKQ0KICAgICAgICBkZWwgcmV0VG9rc1s6XQ0KICAgICAgICByZXRUb2tzICs9IFBhcnNlUmVzdWx0cyhbICIiLmpvaW4odG9rZW5saXN0Ll9hc1N0cmluZ0xpc3Qoc2VsZi5qb2luU3RyaW5nKSkgXSwgbW9kYWw9c2VsZi5tb2RhbFJlc3VsdHMpDQoNCiAgICAgICAgaWYgc2VsZi5yZXN1bHRzTmFtZSBhbmQgcmV0VG9rcy5oYXNrZXlzKCk6DQogICAgICAgICAgICByZXR1cm4gWyByZXRUb2tzIF0NCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJldHVybiByZXRUb2tzDQoNCmNsYXNzIEdyb3VwKFRva2VuQ29udmVydGVyKToNCiAgICAiIiINCiAgICBDb252ZXJ0ZXIgdG8gcmV0dXJuIHRoZSBtYXRjaGVkIHRva2VucyBhcyBhIGxpc3QgLSB1c2VmdWwgZm9yIHJldHVybmluZyB0b2tlbnMgb2YgQ3tMe1plcm9Pck1vcmV9fSBhbmQgQ3tMe09uZU9yTW9yZX19IGV4cHJlc3Npb25zLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIGlkZW50ID0gV29yZChhbHBoYXMpDQogICAgICAgIG51bSA9IFdvcmQobnVtcykNCiAgICAgICAgdGVybSA9IGlkZW50IHwgbnVtDQogICAgICAgIGZ1bmMgPSBpZGVudCArIE9wdGlvbmFsKGRlbGltaXRlZExpc3QodGVybSkpDQogICAgICAgIHByaW50KGZ1bmMucGFyc2VTdHJpbmcoImZuIGEsYiwxMDAiKSkgICMgLT4gWydmbicsICdhJywgJ2InLCAnMTAwJ10NCg0KICAgICAgICBmdW5jID0gaWRlbnQgKyBHcm91cChPcHRpb25hbChkZWxpbWl0ZWRMaXN0KHRlcm0pKSkNCiAgICAgICAgcHJpbnQoZnVuYy5wYXJzZVN0cmluZygiZm4gYSxiLDEwMCIpKSAgIyAtPiBbJ2ZuJywgWydhJywgJ2InLCAnMTAwJ11dDQogICAgIiIiDQogICAgZGVmIF9faW5pdF9fKCBzZWxmLCBleHByICk6DQogICAgICAgIHN1cGVyKEdyb3VwLHNlbGYpLl9faW5pdF9fKCBleHByICkNCiAgICAgICAgc2VsZi5zYXZlQXNMaXN0ID0gVHJ1ZQ0KDQogICAgZGVmIHBvc3RQYXJzZSggc2VsZiwgaW5zdHJpbmcsIGxvYywgdG9rZW5saXN0ICk6DQogICAgICAgIHJldHVybiBbIHRva2VubGlzdCBdDQoNCmNsYXNzIERpY3QoVG9rZW5Db252ZXJ0ZXIpOg0KICAgICIiIg0KICAgIENvbnZlcnRlciB0byByZXR1cm4gYSByZXBldGl0aXZlIGV4cHJlc3Npb24gYXMgYSBsaXN0LCBidXQgYWxzbyBhcyBhIGRpY3Rpb25hcnkuDQogICAgRWFjaCBlbGVtZW50IGNhbiBhbHNvIGJlIHJlZmVyZW5jZWQgdXNpbmcgdGhlIGZpcnN0IHRva2VuIGluIHRoZSBleHByZXNzaW9uIGFzIGl0cyBrZXkuDQogICAgVXNlZnVsIGZvciB0YWJ1bGFyIHJlcG9ydCBzY3JhcGluZyB3aGVuIHRoZSBmaXJzdCBjb2x1bW4gY2FuIGJlIHVzZWQgYXMgYSBpdGVtIGtleS4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBkYXRhX3dvcmQgPSBXb3JkKGFscGhhcykNCiAgICAgICAgbGFiZWwgPSBkYXRhX3dvcmQgKyBGb2xsb3dlZEJ5KCc6JykNCiAgICAgICAgYXR0cl9leHByID0gR3JvdXAobGFiZWwgKyBTdXBwcmVzcygnOicpICsgT25lT3JNb3JlKGRhdGFfd29yZCkuc2V0UGFyc2VBY3Rpb24oJyAnLmpvaW4pKQ0KDQogICAgICAgIHRleHQgPSAic2hhcGU6IFNRVUFSRSBwb3NuOiB1cHBlciBsZWZ0IGNvbG9yOiBsaWdodCBibHVlIHRleHR1cmU6IGJ1cmxhcCINCiAgICAgICAgYXR0cl9leHByID0gKGxhYmVsICsgU3VwcHJlc3MoJzonKSArIE9uZU9yTW9yZShkYXRhX3dvcmQsIHN0b3BPbj1sYWJlbCkuc2V0UGFyc2VBY3Rpb24oJyAnLmpvaW4pKQ0KICAgICAgICANCiAgICAgICAgIyBwcmludCBhdHRyaWJ1dGVzIGFzIHBsYWluIGdyb3Vwcw0KICAgICAgICBwcmludChPbmVPck1vcmUoYXR0cl9leHByKS5wYXJzZVN0cmluZyh0ZXh0KS5kdW1wKCkpDQogICAgICAgIA0KICAgICAgICAjIGluc3RlYWQgb2YgT25lT3JNb3JlKGV4cHIpLCBwYXJzZSB1c2luZyBEaWN0KE9uZU9yTW9yZShHcm91cChleHByKSkpIC0gRGljdCB3aWxsIGF1dG8tYXNzaWduIG5hbWVzDQogICAgICAgIHJlc3VsdCA9IERpY3QoT25lT3JNb3JlKEdyb3VwKGF0dHJfZXhwcikpKS5wYXJzZVN0cmluZyh0ZXh0KQ0KICAgICAgICBwcmludChyZXN1bHQuZHVtcCgpKQ0KICAgICAgICANCiAgICAgICAgIyBhY2Nlc3MgbmFtZWQgZmllbGRzIGFzIGRpY3QgZW50cmllcywgb3Igb3V0cHV0IGFzIGRpY3QNCiAgICAgICAgcHJpbnQocmVzdWx0WydzaGFwZSddKSAgICAgICAgDQogICAgICAgIHByaW50KHJlc3VsdC5hc0RpY3QoKSkNCiAgICBwcmludHM6Og0KICAgICAgICBbJ3NoYXBlJywgJ1NRVUFSRScsICdwb3NuJywgJ3VwcGVyIGxlZnQnLCAnY29sb3InLCAnbGlnaHQgYmx1ZScsICd0ZXh0dXJlJywgJ2J1cmxhcCddDQoNCiAgICAgICAgW1snc2hhcGUnLCAnU1FVQVJFJ10sIFsncG9zbicsICd1cHBlciBsZWZ0J10sIFsnY29sb3InLCAnbGlnaHQgYmx1ZSddLCBbJ3RleHR1cmUnLCAnYnVybGFwJ11dDQogICAgICAgIC0gY29sb3I6IGxpZ2h0IGJsdWUNCiAgICAgICAgLSBwb3NuOiB1cHBlciBsZWZ0DQogICAgICAgIC0gc2hhcGU6IFNRVUFSRQ0KICAgICAgICAtIHRleHR1cmU6IGJ1cmxhcA0KICAgICAgICBTUVVBUkUNCiAgICAgICAgeydjb2xvcic6ICdsaWdodCBibHVlJywgJ3Bvc24nOiAndXBwZXIgbGVmdCcsICd0ZXh0dXJlJzogJ2J1cmxhcCcsICdzaGFwZSc6ICdTUVVBUkUnfQ0KICAgIFNlZSBtb3JlIGV4YW1wbGVzIGF0IEx7UGFyc2VSZXN1bHRzfSBvZiBhY2Nlc3NpbmcgZmllbGRzIGJ5IHJlc3VsdHMgbmFtZS4NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oIHNlbGYsIGV4cHIgKToNCiAgICAgICAgc3VwZXIoRGljdCxzZWxmKS5fX2luaXRfXyggZXhwciApDQogICAgICAgIHNlbGYuc2F2ZUFzTGlzdCA9IFRydWUNCg0KICAgIGRlZiBwb3N0UGFyc2UoIHNlbGYsIGluc3RyaW5nLCBsb2MsIHRva2VubGlzdCApOg0KICAgICAgICBmb3IgaSx0b2sgaW4gZW51bWVyYXRlKHRva2VubGlzdCk6DQogICAgICAgICAgICBpZiBsZW4odG9rKSA9PSAwOg0KICAgICAgICAgICAgICAgIGNvbnRpbnVlDQogICAgICAgICAgICBpa2V5ID0gdG9rWzBdDQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGlrZXksaW50KToNCiAgICAgICAgICAgICAgICBpa2V5ID0gX3VzdHIodG9rWzBdKS5zdHJpcCgpDQogICAgICAgICAgICBpZiBsZW4odG9rKT09MToNCiAgICAgICAgICAgICAgICB0b2tlbmxpc3RbaWtleV0gPSBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldCgiIixpKQ0KICAgICAgICAgICAgZWxpZiBsZW4odG9rKT09MiBhbmQgbm90IGlzaW5zdGFuY2UodG9rWzFdLFBhcnNlUmVzdWx0cyk6DQogICAgICAgICAgICAgICAgdG9rZW5saXN0W2lrZXldID0gX1BhcnNlUmVzdWx0c1dpdGhPZmZzZXQodG9rWzFdLGkpDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIGRpY3R2YWx1ZSA9IHRvay5jb3B5KCkgI1BhcnNlUmVzdWx0cyhpKQ0KICAgICAgICAgICAgICAgIGRlbCBkaWN0dmFsdWVbMF0NCiAgICAgICAgICAgICAgICBpZiBsZW4oZGljdHZhbHVlKSE9IDEgb3IgKGlzaW5zdGFuY2UoZGljdHZhbHVlLFBhcnNlUmVzdWx0cykgYW5kIGRpY3R2YWx1ZS5oYXNrZXlzKCkpOg0KICAgICAgICAgICAgICAgICAgICB0b2tlbmxpc3RbaWtleV0gPSBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldChkaWN0dmFsdWUsaSkNCiAgICAgICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgICAgICB0b2tlbmxpc3RbaWtleV0gPSBfUGFyc2VSZXN1bHRzV2l0aE9mZnNldChkaWN0dmFsdWVbMF0saSkNCg0KICAgICAgICBpZiBzZWxmLnJlc3VsdHNOYW1lOg0KICAgICAgICAgICAgcmV0dXJuIFsgdG9rZW5saXN0IF0NCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJldHVybiB0b2tlbmxpc3QNCg0KDQpjbGFzcyBTdXBwcmVzcyhUb2tlbkNvbnZlcnRlcik6DQogICAgIiIiDQogICAgQ29udmVydGVyIGZvciBpZ25vcmluZyB0aGUgcmVzdWx0cyBvZiBhIHBhcnNlZCBleHByZXNzaW9uLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIHNvdXJjZSA9ICJhLCBiLCBjLGQiDQogICAgICAgIHdkID0gV29yZChhbHBoYXMpDQogICAgICAgIHdkX2xpc3QxID0gd2QgKyBaZXJvT3JNb3JlKCcsJyArIHdkKQ0KICAgICAgICBwcmludCh3ZF9saXN0MS5wYXJzZVN0cmluZyhzb3VyY2UpKQ0KDQogICAgICAgICMgb2Z0ZW4sIGRlbGltaXRlcnMgdGhhdCBhcmUgdXNlZnVsIGR1cmluZyBwYXJzaW5nIGFyZSBqdXN0IGluIHRoZQ0KICAgICAgICAjIHdheSBhZnRlcndhcmQgLSB1c2UgU3VwcHJlc3MgdG8ga2VlcCB0aGVtIG91dCBvZiB0aGUgcGFyc2VkIG91dHB1dA0KICAgICAgICB3ZF9saXN0MiA9IHdkICsgWmVyb09yTW9yZShTdXBwcmVzcygnLCcpICsgd2QpDQogICAgICAgIHByaW50KHdkX2xpc3QyLnBhcnNlU3RyaW5nKHNvdXJjZSkpDQogICAgcHJpbnRzOjoNCiAgICAgICAgWydhJywgJywnLCAnYicsICcsJywgJ2MnLCAnLCcsICdkJ10NCiAgICAgICAgWydhJywgJ2InLCAnYycsICdkJ10NCiAgICAoU2VlIGFsc28gTHtkZWxpbWl0ZWRMaXN0fS4pDQogICAgIiIiDQogICAgZGVmIHBvc3RQYXJzZSggc2VsZiwgaW5zdHJpbmcsIGxvYywgdG9rZW5saXN0ICk6DQogICAgICAgIHJldHVybiBbXQ0KDQogICAgZGVmIHN1cHByZXNzKCBzZWxmICk6DQogICAgICAgIHJldHVybiBzZWxmDQoNCg0KY2xhc3MgT25seU9uY2Uob2JqZWN0KToNCiAgICAiIiINCiAgICBXcmFwcGVyIGZvciBwYXJzZSBhY3Rpb25zLCB0byBlbnN1cmUgdGhleSBhcmUgb25seSBjYWxsZWQgb25jZS4NCiAgICAiIiINCiAgICBkZWYgX19pbml0X18oc2VsZiwgbWV0aG9kQ2FsbCk6DQogICAgICAgIHNlbGYuY2FsbGFibGUgPSBfdHJpbV9hcml0eShtZXRob2RDYWxsKQ0KICAgICAgICBzZWxmLmNhbGxlZCA9IEZhbHNlDQogICAgZGVmIF9fY2FsbF9fKHNlbGYscyxsLHQpOg0KICAgICAgICBpZiBub3Qgc2VsZi5jYWxsZWQ6DQogICAgICAgICAgICByZXN1bHRzID0gc2VsZi5jYWxsYWJsZShzLGwsdCkNCiAgICAgICAgICAgIHNlbGYuY2FsbGVkID0gVHJ1ZQ0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHMNCiAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24ocyxsLCIiKQ0KICAgIGRlZiByZXNldChzZWxmKToNCiAgICAgICAgc2VsZi5jYWxsZWQgPSBGYWxzZQ0KDQpkZWYgdHJhY2VQYXJzZUFjdGlvbihmKToNCiAgICAiIiINCiAgICBEZWNvcmF0b3IgZm9yIGRlYnVnZ2luZyBwYXJzZSBhY3Rpb25zLiANCiAgICANCiAgICBXaGVuIHRoZSBwYXJzZSBhY3Rpb24gaXMgY2FsbGVkLCB0aGlzIGRlY29yYXRvciB3aWxsIHByaW50IEN7Ij4+IGVudGVyaW5nIEl7bWV0aG9kLW5hbWV9KGxpbmU6SXtjdXJyZW50X3NvdXJjZV9saW5lfSwgSXtwYXJzZV9sb2NhdGlvbn0sIEl7bWF0Y2hlZF90b2tlbnN9KSIufQ0KICAgIFdoZW4gdGhlIHBhcnNlIGFjdGlvbiBjb21wbGV0ZXMsIHRoZSBkZWNvcmF0b3Igd2lsbCBwcmludCBDeyI8PCJ9IGZvbGxvd2VkIGJ5IHRoZSByZXR1cm5lZCB2YWx1ZSwgb3IgYW55IGV4Y2VwdGlvbiB0aGF0IHRoZSBwYXJzZSBhY3Rpb24gcmFpc2VkLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIHdkID0gV29yZChhbHBoYXMpDQoNCiAgICAgICAgQHRyYWNlUGFyc2VBY3Rpb24NCiAgICAgICAgZGVmIHJlbW92ZV9kdXBsaWNhdGVfY2hhcnModG9rZW5zKToNCiAgICAgICAgICAgIHJldHVybiAnJy5qb2luKHNvcnRlZChzZXQoJycuam9pbih0b2tlbnMpKSkNCg0KICAgICAgICB3ZHMgPSBPbmVPck1vcmUod2QpLnNldFBhcnNlQWN0aW9uKHJlbW92ZV9kdXBsaWNhdGVfY2hhcnMpDQogICAgICAgIHByaW50KHdkcy5wYXJzZVN0cmluZygic2xrZGpzIHNsZCBzbGRkIHNkbGYgc2RsamYiKSkNCiAgICBwcmludHM6Og0KICAgICAgICA+PmVudGVyaW5nIHJlbW92ZV9kdXBsaWNhdGVfY2hhcnMobGluZTogJ3Nsa2RqcyBzbGQgc2xkZCBzZGxmIHNkbGpmJywgMCwgKFsnc2xrZGpzJywgJ3NsZCcsICdzbGRkJywgJ3NkbGYnLCAnc2RsamYnXSwge30pKQ0KICAgICAgICA8PGxlYXZpbmcgcmVtb3ZlX2R1cGxpY2F0ZV9jaGFycyAocmV0OiAnZGZqa2xzJykNCiAgICAgICAgWydkZmprbHMnXQ0KICAgICIiIg0KICAgIGYgPSBfdHJpbV9hcml0eShmKQ0KICAgIGRlZiB6KCpwYUFyZ3MpOg0KICAgICAgICB0aGlzRnVuYyA9IGYuX19uYW1lX18NCiAgICAgICAgcyxsLHQgPSBwYUFyZ3NbLTM6XQ0KICAgICAgICBpZiBsZW4ocGFBcmdzKT4zOg0KICAgICAgICAgICAgdGhpc0Z1bmMgPSBwYUFyZ3NbMF0uX19jbGFzc19fLl9fbmFtZV9fICsgJy4nICsgdGhpc0Z1bmMNCiAgICAgICAgc3lzLnN0ZGVyci53cml0ZSggIj4+ZW50ZXJpbmcgJXMobGluZTogJyVzJywgJWQsICVyKVxuIiAlICh0aGlzRnVuYyxsaW5lKGwscyksbCx0KSApDQogICAgICAgIHRyeToNCiAgICAgICAgICAgIHJldCA9IGYoKnBhQXJncykNCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleGM6DQogICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCAiPDxsZWF2aW5nICVzIChleGNlcHRpb246ICVzKVxuIiAlICh0aGlzRnVuYyxleGMpICkNCiAgICAgICAgICAgIHJhaXNlDQogICAgICAgIHN5cy5zdGRlcnIud3JpdGUoICI8PGxlYXZpbmcgJXMgKHJldDogJXIpXG4iICUgKHRoaXNGdW5jLHJldCkgKQ0KICAgICAgICByZXR1cm4gcmV0DQogICAgdHJ5Og0KICAgICAgICB6Ll9fbmFtZV9fID0gZi5fX25hbWVfXw0KICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoNCiAgICAgICAgcGFzcw0KICAgIHJldHVybiB6DQoNCiMNCiMgZ2xvYmFsIGhlbHBlcnMNCiMNCmRlZiBkZWxpbWl0ZWRMaXN0KCBleHByLCBkZWxpbT0iLCIsIGNvbWJpbmU9RmFsc2UgKToNCiAgICAiIiINCiAgICBIZWxwZXIgdG8gZGVmaW5lIGEgZGVsaW1pdGVkIGxpc3Qgb2YgZXhwcmVzc2lvbnMgLSB0aGUgZGVsaW1pdGVyIGRlZmF1bHRzIHRvICcsJy4NCiAgICBCeSBkZWZhdWx0LCB0aGUgbGlzdCBlbGVtZW50cyBhbmQgZGVsaW1pdGVycyBjYW4gaGF2ZSBpbnRlcnZlbmluZyB3aGl0ZXNwYWNlLCBhbmQNCiAgICBjb21tZW50cywgYnV0IHRoaXMgY2FuIGJlIG92ZXJyaWRkZW4gYnkgcGFzc2luZyBDe2NvbWJpbmU9VHJ1ZX0gaW4gdGhlIGNvbnN0cnVjdG9yLg0KICAgIElmIEN7Y29tYmluZX0gaXMgc2V0IHRvIEN7VHJ1ZX0sIHRoZSBtYXRjaGluZyB0b2tlbnMgYXJlIHJldHVybmVkIGFzIGEgc2luZ2xlIHRva2VuDQogICAgc3RyaW5nLCB3aXRoIHRoZSBkZWxpbWl0ZXJzIGluY2x1ZGVkOyBvdGhlcndpc2UsIHRoZSBtYXRjaGluZyB0b2tlbnMgYXJlIHJldHVybmVkDQogICAgYXMgYSBsaXN0IG9mIHRva2Vucywgd2l0aCB0aGUgZGVsaW1pdGVycyBzdXBwcmVzc2VkLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIGRlbGltaXRlZExpc3QoV29yZChhbHBoYXMpKS5wYXJzZVN0cmluZygiYWEsYmIsY2MiKSAjIC0+IFsnYWEnLCAnYmInLCAnY2MnXQ0KICAgICAgICBkZWxpbWl0ZWRMaXN0KFdvcmQoaGV4bnVtcyksIGRlbGltPSc6JywgY29tYmluZT1UcnVlKS5wYXJzZVN0cmluZygiQUE6QkI6Q0M6REQ6RUUiKSAjIC0+IFsnQUE6QkI6Q0M6REQ6RUUnXQ0KICAgICIiIg0KICAgIGRsTmFtZSA9IF91c3RyKGV4cHIpKyIgWyIrX3VzdHIoZGVsaW0pKyIgIitfdXN0cihleHByKSsiXS4uLiINCiAgICBpZiBjb21iaW5lOg0KICAgICAgICByZXR1cm4gQ29tYmluZSggZXhwciArIFplcm9Pck1vcmUoIGRlbGltICsgZXhwciApICkuc2V0TmFtZShkbE5hbWUpDQogICAgZWxzZToNCiAgICAgICAgcmV0dXJuICggZXhwciArIFplcm9Pck1vcmUoIFN1cHByZXNzKCBkZWxpbSApICsgZXhwciApICkuc2V0TmFtZShkbE5hbWUpDQoNCmRlZiBjb3VudGVkQXJyYXkoIGV4cHIsIGludEV4cHI9Tm9uZSApOg0KICAgICIiIg0KICAgIEhlbHBlciB0byBkZWZpbmUgYSBjb3VudGVkIGxpc3Qgb2YgZXhwcmVzc2lvbnMuDQogICAgVGhpcyBoZWxwZXIgZGVmaW5lcyBhIHBhdHRlcm4gb2YgdGhlIGZvcm06Og0KICAgICAgICBpbnRlZ2VyIGV4cHIgZXhwciBleHByLi4uDQogICAgd2hlcmUgdGhlIGxlYWRpbmcgaW50ZWdlciB0ZWxscyBob3cgbWFueSBleHByIGV4cHJlc3Npb25zIGZvbGxvdy4NCiAgICBUaGUgbWF0Y2hlZCB0b2tlbnMgcmV0dXJucyB0aGUgYXJyYXkgb2YgZXhwciB0b2tlbnMgYXMgYSBsaXN0IC0gdGhlIGxlYWRpbmcgY291bnQgdG9rZW4gaXMgc3VwcHJlc3NlZC4NCiAgICANCiAgICBJZiBDe2ludEV4cHJ9IGlzIHNwZWNpZmllZCwgaXQgc2hvdWxkIGJlIGEgcHlwYXJzaW5nIGV4cHJlc3Npb24gdGhhdCBwcm9kdWNlcyBhbiBpbnRlZ2VyIHZhbHVlLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIGNvdW50ZWRBcnJheShXb3JkKGFscGhhcykpLnBhcnNlU3RyaW5nKCcyIGFiIGNkIGVmJykgICMgLT4gWydhYicsICdjZCddDQoNCiAgICAgICAgIyBpbiB0aGlzIHBhcnNlciwgdGhlIGxlYWRpbmcgaW50ZWdlciB2YWx1ZSBpcyBnaXZlbiBpbiBiaW5hcnksDQogICAgICAgICMgJzEwJyBpbmRpY2F0aW5nIHRoYXQgMiB2YWx1ZXMgYXJlIGluIHRoZSBhcnJheQ0KICAgICAgICBiaW5hcnlDb25zdGFudCA9IFdvcmQoJzAxJykuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHQ6IGludCh0WzBdLCAyKSkNCiAgICAgICAgY291bnRlZEFycmF5KFdvcmQoYWxwaGFzKSwgaW50RXhwcj1iaW5hcnlDb25zdGFudCkucGFyc2VTdHJpbmcoJzEwIGFiIGNkIGVmJykgICMgLT4gWydhYicsICdjZCddDQogICAgIiIiDQogICAgYXJyYXlFeHByID0gRm9yd2FyZCgpDQogICAgZGVmIGNvdW50RmllbGRQYXJzZUFjdGlvbihzLGwsdCk6DQogICAgICAgIG4gPSB0WzBdDQogICAgICAgIGFycmF5RXhwciA8PCAobiBhbmQgR3JvdXAoQW5kKFtleHByXSpuKSkgb3IgR3JvdXAoZW1wdHkpKQ0KICAgICAgICByZXR1cm4gW10NCiAgICBpZiBpbnRFeHByIGlzIE5vbmU6DQogICAgICAgIGludEV4cHIgPSBXb3JkKG51bXMpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSB0OmludCh0WzBdKSkNCiAgICBlbHNlOg0KICAgICAgICBpbnRFeHByID0gaW50RXhwci5jb3B5KCkNCiAgICBpbnRFeHByLnNldE5hbWUoImFycmF5TGVuIikNCiAgICBpbnRFeHByLmFkZFBhcnNlQWN0aW9uKGNvdW50RmllbGRQYXJzZUFjdGlvbiwgY2FsbER1cmluZ1RyeT1UcnVlKQ0KICAgIHJldHVybiAoIGludEV4cHIgKyBhcnJheUV4cHIgKS5zZXROYW1lKCcobGVuKSAnICsgX3VzdHIoZXhwcikgKyAnLi4uJykNCg0KZGVmIF9mbGF0dGVuKEwpOg0KICAgIHJldCA9IFtdDQogICAgZm9yIGkgaW4gTDoNCiAgICAgICAgaWYgaXNpbnN0YW5jZShpLGxpc3QpOg0KICAgICAgICAgICAgcmV0LmV4dGVuZChfZmxhdHRlbihpKSkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJldC5hcHBlbmQoaSkNCiAgICByZXR1cm4gcmV0DQoNCmRlZiBtYXRjaFByZXZpb3VzTGl0ZXJhbChleHByKToNCiAgICAiIiINCiAgICBIZWxwZXIgdG8gZGVmaW5lIGFuIGV4cHJlc3Npb24gdGhhdCBpcyBpbmRpcmVjdGx5IGRlZmluZWQgZnJvbQ0KICAgIHRoZSB0b2tlbnMgbWF0Y2hlZCBpbiBhIHByZXZpb3VzIGV4cHJlc3Npb24sIHRoYXQgaXMsIGl0IGxvb2tzDQogICAgZm9yIGEgJ3JlcGVhdCcgb2YgYSBwcmV2aW91cyBleHByZXNzaW9uLiAgRm9yIGV4YW1wbGU6Og0KICAgICAgICBmaXJzdCA9IFdvcmQobnVtcykNCiAgICAgICAgc2Vjb25kID0gbWF0Y2hQcmV2aW91c0xpdGVyYWwoZmlyc3QpDQogICAgICAgIG1hdGNoRXhwciA9IGZpcnN0ICsgIjoiICsgc2Vjb25kDQogICAgd2lsbCBtYXRjaCBDeyIxOjEifSwgYnV0IG5vdCBDeyIxOjIifS4gIEJlY2F1c2UgdGhpcyBtYXRjaGVzIGENCiAgICBwcmV2aW91cyBsaXRlcmFsLCB3aWxsIGFsc28gbWF0Y2ggdGhlIGxlYWRpbmcgQ3siMToxIn0gaW4gQ3siMToxMCJ9Lg0KICAgIElmIHRoaXMgaXMgbm90IGRlc2lyZWQsIHVzZSBDe21hdGNoUHJldmlvdXNFeHByfS4NCiAgICBEbyBJe25vdH0gdXNlIHdpdGggcGFja3JhdCBwYXJzaW5nIGVuYWJsZWQuDQogICAgIiIiDQogICAgcmVwID0gRm9yd2FyZCgpDQogICAgZGVmIGNvcHlUb2tlblRvUmVwZWF0ZXIocyxsLHQpOg0KICAgICAgICBpZiB0Og0KICAgICAgICAgICAgaWYgbGVuKHQpID09IDE6DQogICAgICAgICAgICAgICAgcmVwIDw8IHRbMF0NCiAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgIyBmbGF0dGVuIHQgdG9rZW5zDQogICAgICAgICAgICAgICAgdGZsYXQgPSBfZmxhdHRlbih0LmFzTGlzdCgpKQ0KICAgICAgICAgICAgICAgIHJlcCA8PCBBbmQoTGl0ZXJhbCh0dCkgZm9yIHR0IGluIHRmbGF0KQ0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgcmVwIDw8IEVtcHR5KCkNCiAgICBleHByLmFkZFBhcnNlQWN0aW9uKGNvcHlUb2tlblRvUmVwZWF0ZXIsIGNhbGxEdXJpbmdUcnk9VHJ1ZSkNCiAgICByZXAuc2V0TmFtZSgnKHByZXYpICcgKyBfdXN0cihleHByKSkNCiAgICByZXR1cm4gcmVwDQoNCmRlZiBtYXRjaFByZXZpb3VzRXhwcihleHByKToNCiAgICAiIiINCiAgICBIZWxwZXIgdG8gZGVmaW5lIGFuIGV4cHJlc3Npb24gdGhhdCBpcyBpbmRpcmVjdGx5IGRlZmluZWQgZnJvbQ0KICAgIHRoZSB0b2tlbnMgbWF0Y2hlZCBpbiBhIHByZXZpb3VzIGV4cHJlc3Npb24sIHRoYXQgaXMsIGl0IGxvb2tzDQogICAgZm9yIGEgJ3JlcGVhdCcgb2YgYSBwcmV2aW91cyBleHByZXNzaW9uLiAgRm9yIGV4YW1wbGU6Og0KICAgICAgICBmaXJzdCA9IFdvcmQobnVtcykNCiAgICAgICAgc2Vjb25kID0gbWF0Y2hQcmV2aW91c0V4cHIoZmlyc3QpDQogICAgICAgIG1hdGNoRXhwciA9IGZpcnN0ICsgIjoiICsgc2Vjb25kDQogICAgd2lsbCBtYXRjaCBDeyIxOjEifSwgYnV0IG5vdCBDeyIxOjIifS4gIEJlY2F1c2UgdGhpcyBtYXRjaGVzIGJ5DQogICAgZXhwcmVzc2lvbnMsIHdpbGwgSXtub3R9IG1hdGNoIHRoZSBsZWFkaW5nIEN7IjE6MSJ9IGluIEN7IjE6MTAifTsNCiAgICB0aGUgZXhwcmVzc2lvbnMgYXJlIGV2YWx1YXRlZCBmaXJzdCwgYW5kIHRoZW4gY29tcGFyZWQsIHNvDQogICAgQ3siMSJ9IGlzIGNvbXBhcmVkIHdpdGggQ3siMTAifS4NCiAgICBEbyBJe25vdH0gdXNlIHdpdGggcGFja3JhdCBwYXJzaW5nIGVuYWJsZWQuDQogICAgIiIiDQogICAgcmVwID0gRm9yd2FyZCgpDQogICAgZTIgPSBleHByLmNvcHkoKQ0KICAgIHJlcCA8PD0gZTINCiAgICBkZWYgY29weVRva2VuVG9SZXBlYXRlcihzLGwsdCk6DQogICAgICAgIG1hdGNoVG9rZW5zID0gX2ZsYXR0ZW4odC5hc0xpc3QoKSkNCiAgICAgICAgZGVmIG11c3RNYXRjaFRoZXNlVG9rZW5zKHMsbCx0KToNCiAgICAgICAgICAgIHRoZXNlVG9rZW5zID0gX2ZsYXR0ZW4odC5hc0xpc3QoKSkNCiAgICAgICAgICAgIGlmICB0aGVzZVRva2VucyAhPSBtYXRjaFRva2VuczoNCiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbigiIiwwLCIiKQ0KICAgICAgICByZXAuc2V0UGFyc2VBY3Rpb24oIG11c3RNYXRjaFRoZXNlVG9rZW5zLCBjYWxsRHVyaW5nVHJ5PVRydWUgKQ0KICAgIGV4cHIuYWRkUGFyc2VBY3Rpb24oY29weVRva2VuVG9SZXBlYXRlciwgY2FsbER1cmluZ1RyeT1UcnVlKQ0KICAgIHJlcC5zZXROYW1lKCcocHJldikgJyArIF91c3RyKGV4cHIpKQ0KICAgIHJldHVybiByZXANCg0KZGVmIF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMocyk6DQogICAgI34gIGVzY2FwZSB0aGVzZSBjaGFyczogXi1dDQogICAgZm9yIGMgaW4gciJcXi1dIjoNCiAgICAgICAgcyA9IHMucmVwbGFjZShjLF9ic2xhc2grYykNCiAgICBzID0gcy5yZXBsYWNlKCJcbiIsciJcbiIpDQogICAgcyA9IHMucmVwbGFjZSgiXHQiLHIiXHQiKQ0KICAgIHJldHVybiBfdXN0cihzKQ0KDQpkZWYgb25lT2YoIHN0cnMsIGNhc2VsZXNzPUZhbHNlLCB1c2VSZWdleD1UcnVlICk6DQogICAgIiIiDQogICAgSGVscGVyIHRvIHF1aWNrbHkgZGVmaW5lIGEgc2V0IG9mIGFsdGVybmF0aXZlIExpdGVyYWxzLCBhbmQgbWFrZXMgc3VyZSB0byBkbw0KICAgIGxvbmdlc3QtZmlyc3QgdGVzdGluZyB3aGVuIHRoZXJlIGlzIGEgY29uZmxpY3QsIHJlZ2FyZGxlc3Mgb2YgdGhlIGlucHV0IG9yZGVyLA0KICAgIGJ1dCByZXR1cm5zIGEgQ3tMe01hdGNoRmlyc3R9fSBmb3IgYmVzdCBwZXJmb3JtYW5jZS4NCg0KICAgIFBhcmFtZXRlcnM6DQogICAgIC0gc3RycyAtIGEgc3RyaW5nIG9mIHNwYWNlLWRlbGltaXRlZCBsaXRlcmFscywgb3IgYSBjb2xsZWN0aW9uIG9mIHN0cmluZyBsaXRlcmFscw0KICAgICAtIGNhc2VsZXNzIC0gKGRlZmF1bHQ9Q3tGYWxzZX0pIC0gdHJlYXQgYWxsIGxpdGVyYWxzIGFzIGNhc2VsZXNzDQogICAgIC0gdXNlUmVnZXggLSAoZGVmYXVsdD1De1RydWV9KSAtIGFzIGFuIG9wdGltaXphdGlvbiwgd2lsbCBnZW5lcmF0ZSBhIFJlZ2V4DQogICAgICAgICAgb2JqZWN0OyBvdGhlcndpc2UsIHdpbGwgZ2VuZXJhdGUgYSBDe01hdGNoRmlyc3R9IG9iamVjdCAoaWYgQ3tjYXNlbGVzcz1UcnVlfSwgb3INCiAgICAgICAgICBpZiBjcmVhdGluZyBhIEN7UmVnZXh9IHJhaXNlcyBhbiBleGNlcHRpb24pDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgY29tcF9vcGVyID0gb25lT2YoIjwgPSA+IDw9ID49ICE9IikNCiAgICAgICAgdmFyID0gV29yZChhbHBoYXMpDQogICAgICAgIG51bWJlciA9IFdvcmQobnVtcykNCiAgICAgICAgdGVybSA9IHZhciB8IG51bWJlcg0KICAgICAgICBjb21wYXJpc29uX2V4cHIgPSB0ZXJtICsgY29tcF9vcGVyICsgdGVybQ0KICAgICAgICBwcmludChjb21wYXJpc29uX2V4cHIuc2VhcmNoU3RyaW5nKCJCID0gMTIgIEFBPTIzIEI8PUFBIEFBPjEyIikpDQogICAgcHJpbnRzOjoNCiAgICAgICAgW1snQicsICc9JywgJzEyJ10sIFsnQUEnLCAnPScsICcyMyddLCBbJ0InLCAnPD0nLCAnQUEnXSwgWydBQScsICc+JywgJzEyJ11dDQogICAgIiIiDQogICAgaWYgY2FzZWxlc3M6DQogICAgICAgIGlzZXF1YWwgPSAoIGxhbWJkYSBhLGI6IGEudXBwZXIoKSA9PSBiLnVwcGVyKCkgKQ0KICAgICAgICBtYXNrcyA9ICggbGFtYmRhIGEsYjogYi51cHBlcigpLnN0YXJ0c3dpdGgoYS51cHBlcigpKSApDQogICAgICAgIHBhcnNlRWxlbWVudENsYXNzID0gQ2FzZWxlc3NMaXRlcmFsDQogICAgZWxzZToNCiAgICAgICAgaXNlcXVhbCA9ICggbGFtYmRhIGEsYjogYSA9PSBiICkNCiAgICAgICAgbWFza3MgPSAoIGxhbWJkYSBhLGI6IGIuc3RhcnRzd2l0aChhKSApDQogICAgICAgIHBhcnNlRWxlbWVudENsYXNzID0gTGl0ZXJhbA0KDQogICAgc3ltYm9scyA9IFtdDQogICAgaWYgaXNpbnN0YW5jZShzdHJzLGJhc2VzdHJpbmcpOg0KICAgICAgICBzeW1ib2xzID0gc3Rycy5zcGxpdCgpDQogICAgZWxpZiBpc2luc3RhbmNlKHN0cnMsIGNvbGxlY3Rpb25zLkl0ZXJhYmxlKToNCiAgICAgICAgc3ltYm9scyA9IGxpc3Qoc3RycykNCiAgICBlbHNlOg0KICAgICAgICB3YXJuaW5ncy53YXJuKCJJbnZhbGlkIGFyZ3VtZW50IHRvIG9uZU9mLCBleHBlY3RlZCBzdHJpbmcgb3IgaXRlcmFibGUiLA0KICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcsIHN0YWNrbGV2ZWw9MikNCiAgICBpZiBub3Qgc3ltYm9sczoNCiAgICAgICAgcmV0dXJuIE5vTWF0Y2goKQ0KDQogICAgaSA9IDANCiAgICB3aGlsZSBpIDwgbGVuKHN5bWJvbHMpLTE6DQogICAgICAgIGN1ciA9IHN5bWJvbHNbaV0NCiAgICAgICAgZm9yIGosb3RoZXIgaW4gZW51bWVyYXRlKHN5bWJvbHNbaSsxOl0pOg0KICAgICAgICAgICAgaWYgKCBpc2VxdWFsKG90aGVyLCBjdXIpICk6DQogICAgICAgICAgICAgICAgZGVsIHN5bWJvbHNbaStqKzFdDQogICAgICAgICAgICAgICAgYnJlYWsNCiAgICAgICAgICAgIGVsaWYgKCBtYXNrcyhjdXIsIG90aGVyKSApOg0KICAgICAgICAgICAgICAgIGRlbCBzeW1ib2xzW2kraisxXQ0KICAgICAgICAgICAgICAgIHN5bWJvbHMuaW5zZXJ0KGksb3RoZXIpDQogICAgICAgICAgICAgICAgY3VyID0gb3RoZXINCiAgICAgICAgICAgICAgICBicmVhaw0KICAgICAgICBlbHNlOg0KICAgICAgICAgICAgaSArPSAxDQoNCiAgICBpZiBub3QgY2FzZWxlc3MgYW5kIHVzZVJlZ2V4Og0KICAgICAgICAjfiBwcmludCAoc3RycywiLT4iLCAifCIuam9pbiggWyBfZXNjYXBlUmVnZXhDaGFycyhzeW0pIGZvciBzeW0gaW4gc3ltYm9sc10gKSkNCiAgICAgICAgdHJ5Og0KICAgICAgICAgICAgaWYgbGVuKHN5bWJvbHMpPT1sZW4oIiIuam9pbihzeW1ib2xzKSk6DQogICAgICAgICAgICAgICAgcmV0dXJuIFJlZ2V4KCAiWyVzXSIgJSAiIi5qb2luKF9lc2NhcGVSZWdleFJhbmdlQ2hhcnMoc3ltKSBmb3Igc3ltIGluIHN5bWJvbHMpICkuc2V0TmFtZSgnIHwgJy5qb2luKHN5bWJvbHMpKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByZXR1cm4gUmVnZXgoICJ8Ii5qb2luKHJlLmVzY2FwZShzeW0pIGZvciBzeW0gaW4gc3ltYm9scykgKS5zZXROYW1lKCcgfCAnLmpvaW4oc3ltYm9scykpDQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246DQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJFeGNlcHRpb24gY3JlYXRpbmcgUmVnZXggZm9yIG9uZU9mLCBidWlsZGluZyBNYXRjaEZpcnN0IiwNCiAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZywgc3RhY2tsZXZlbD0yKQ0KDQoNCiAgICAjIGxhc3QgcmVzb3J0LCBqdXN0IHVzZSBNYXRjaEZpcnN0DQogICAgcmV0dXJuIE1hdGNoRmlyc3QocGFyc2VFbGVtZW50Q2xhc3Moc3ltKSBmb3Igc3ltIGluIHN5bWJvbHMpLnNldE5hbWUoJyB8ICcuam9pbihzeW1ib2xzKSkNCg0KZGVmIGRpY3RPZigga2V5LCB2YWx1ZSApOg0KICAgICIiIg0KICAgIEhlbHBlciB0byBlYXNpbHkgYW5kIGNsZWFybHkgZGVmaW5lIGEgZGljdGlvbmFyeSBieSBzcGVjaWZ5aW5nIHRoZSByZXNwZWN0aXZlIHBhdHRlcm5zDQogICAgZm9yIHRoZSBrZXkgYW5kIHZhbHVlLiAgVGFrZXMgY2FyZSBvZiBkZWZpbmluZyB0aGUgQ3tMe0RpY3R9fSwgQ3tMe1plcm9Pck1vcmV9fSwgYW5kIEN7THtHcm91cH19IHRva2Vucw0KICAgIGluIHRoZSBwcm9wZXIgb3JkZXIuICBUaGUga2V5IHBhdHRlcm4gY2FuIGluY2x1ZGUgZGVsaW1pdGluZyBtYXJrZXJzIG9yIHB1bmN0dWF0aW9uLA0KICAgIGFzIGxvbmcgYXMgdGhleSBhcmUgc3VwcHJlc3NlZCwgdGhlcmVieSBsZWF2aW5nIHRoZSBzaWduaWZpY2FudCBrZXkgdGV4dC4gIFRoZSB2YWx1ZQ0KICAgIHBhdHRlcm4gY2FuIGluY2x1ZGUgbmFtZWQgcmVzdWx0cywgc28gdGhhdCB0aGUgQ3tEaWN0fSByZXN1bHRzIGNhbiBpbmNsdWRlIG5hbWVkIHRva2VuDQogICAgZmllbGRzLg0KDQogICAgRXhhbXBsZTo6DQogICAgICAgIHRleHQgPSAic2hhcGU6IFNRVUFSRSBwb3NuOiB1cHBlciBsZWZ0IGNvbG9yOiBsaWdodCBibHVlIHRleHR1cmU6IGJ1cmxhcCINCiAgICAgICAgYXR0cl9leHByID0gKGxhYmVsICsgU3VwcHJlc3MoJzonKSArIE9uZU9yTW9yZShkYXRhX3dvcmQsIHN0b3BPbj1sYWJlbCkuc2V0UGFyc2VBY3Rpb24oJyAnLmpvaW4pKQ0KICAgICAgICBwcmludChPbmVPck1vcmUoYXR0cl9leHByKS5wYXJzZVN0cmluZyh0ZXh0KS5kdW1wKCkpDQogICAgICAgIA0KICAgICAgICBhdHRyX2xhYmVsID0gbGFiZWwNCiAgICAgICAgYXR0cl92YWx1ZSA9IFN1cHByZXNzKCc6JykgKyBPbmVPck1vcmUoZGF0YV93b3JkLCBzdG9wT249bGFiZWwpLnNldFBhcnNlQWN0aW9uKCcgJy5qb2luKQ0KDQogICAgICAgICMgc2ltaWxhciB0byBEaWN0LCBidXQgc2ltcGxlciBjYWxsIGZvcm1hdA0KICAgICAgICByZXN1bHQgPSBkaWN0T2YoYXR0cl9sYWJlbCwgYXR0cl92YWx1ZSkucGFyc2VTdHJpbmcodGV4dCkNCiAgICAgICAgcHJpbnQocmVzdWx0LmR1bXAoKSkNCiAgICAgICAgcHJpbnQocmVzdWx0WydzaGFwZSddKQ0KICAgICAgICBwcmludChyZXN1bHQuc2hhcGUpICAjIG9iamVjdCBhdHRyaWJ1dGUgYWNjZXNzIHdvcmtzIHRvbw0KICAgICAgICBwcmludChyZXN1bHQuYXNEaWN0KCkpDQogICAgcHJpbnRzOjoNCiAgICAgICAgW1snc2hhcGUnLCAnU1FVQVJFJ10sIFsncG9zbicsICd1cHBlciBsZWZ0J10sIFsnY29sb3InLCAnbGlnaHQgYmx1ZSddLCBbJ3RleHR1cmUnLCAnYnVybGFwJ11dDQogICAgICAgIC0gY29sb3I6IGxpZ2h0IGJsdWUNCiAgICAgICAgLSBwb3NuOiB1cHBlciBsZWZ0DQogICAgICAgIC0gc2hhcGU6IFNRVUFSRQ0KICAgICAgICAtIHRleHR1cmU6IGJ1cmxhcA0KICAgICAgICBTUVVBUkUNCiAgICAgICAgU1FVQVJFDQogICAgICAgIHsnY29sb3InOiAnbGlnaHQgYmx1ZScsICdzaGFwZSc6ICdTUVVBUkUnLCAncG9zbic6ICd1cHBlciBsZWZ0JywgJ3RleHR1cmUnOiAnYnVybGFwJ30NCiAgICAiIiINCiAgICByZXR1cm4gRGljdCggWmVyb09yTW9yZSggR3JvdXAgKCBrZXkgKyB2YWx1ZSApICkgKQ0KDQpkZWYgb3JpZ2luYWxUZXh0Rm9yKGV4cHIsIGFzU3RyaW5nPVRydWUpOg0KICAgICIiIg0KICAgIEhlbHBlciB0byByZXR1cm4gdGhlIG9yaWdpbmFsLCB1bnRva2VuaXplZCB0ZXh0IGZvciBhIGdpdmVuIGV4cHJlc3Npb24uICBVc2VmdWwgdG8NCiAgICByZXN0b3JlIHRoZSBwYXJzZWQgZmllbGRzIG9mIGFuIEhUTUwgc3RhcnQgdGFnIGludG8gdGhlIHJhdyB0YWcgdGV4dCBpdHNlbGYsIG9yIHRvDQogICAgcmV2ZXJ0IHNlcGFyYXRlIHRva2VucyB3aXRoIGludGVydmVuaW5nIHdoaXRlc3BhY2UgYmFjayB0byB0aGUgb3JpZ2luYWwgbWF0Y2hpbmcNCiAgICBpbnB1dCB0ZXh0LiBCeSBkZWZhdWx0LCByZXR1cm5zIGFzdHJpbmcgY29udGFpbmluZyB0aGUgb3JpZ2luYWwgcGFyc2VkIHRleHQuICANCiAgICAgICANCiAgICBJZiB0aGUgb3B0aW9uYWwgQ3thc1N0cmluZ30gYXJndW1lbnQgaXMgcGFzc2VkIGFzIEN7RmFsc2V9LCB0aGVuIHRoZSByZXR1cm4gdmFsdWUgaXMgYSANCiAgICBDe0x7UGFyc2VSZXN1bHRzfX0gY29udGFpbmluZyBhbnkgcmVzdWx0cyBuYW1lcyB0aGF0IHdlcmUgb3JpZ2luYWxseSBtYXRjaGVkLCBhbmQgYSANCiAgICBzaW5nbGUgdG9rZW4gY29udGFpbmluZyB0aGUgb3JpZ2luYWwgbWF0Y2hlZCB0ZXh0IGZyb20gdGhlIGlucHV0IHN0cmluZy4gIFNvIGlmIA0KICAgIHRoZSBleHByZXNzaW9uIHBhc3NlZCB0byBDe0x7b3JpZ2luYWxUZXh0Rm9yfX0gY29udGFpbnMgZXhwcmVzc2lvbnMgd2l0aCBkZWZpbmVkDQogICAgcmVzdWx0cyBuYW1lcywgeW91IG11c3Qgc2V0IEN7YXNTdHJpbmd9IHRvIEN7RmFsc2V9IGlmIHlvdSB3YW50IHRvIHByZXNlcnZlIHRob3NlDQogICAgcmVzdWx0cyBuYW1lIHZhbHVlcy4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBzcmMgPSAidGhpcyBpcyB0ZXN0IDxiPiBib2xkIDxpPnRleHQ8L2k+IDwvYj4gbm9ybWFsIHRleHQgIg0KICAgICAgICBmb3IgdGFnIGluICgiYiIsImkiKToNCiAgICAgICAgICAgIG9wZW5lcixjbG9zZXIgPSBtYWtlSFRNTFRhZ3ModGFnKQ0KICAgICAgICAgICAgcGF0dCA9IG9yaWdpbmFsVGV4dEZvcihvcGVuZXIgKyBTa2lwVG8oY2xvc2VyKSArIGNsb3NlcikNCiAgICAgICAgICAgIHByaW50KHBhdHQuc2VhcmNoU3RyaW5nKHNyYylbMF0pDQogICAgcHJpbnRzOjoNCiAgICAgICAgWyc8Yj4gYm9sZCA8aT50ZXh0PC9pPiA8L2I+J10NCiAgICAgICAgWyc8aT50ZXh0PC9pPiddDQogICAgIiIiDQogICAgbG9jTWFya2VyID0gRW1wdHkoKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcyxsb2MsdDogbG9jKQ0KICAgIGVuZGxvY01hcmtlciA9IGxvY01hcmtlci5jb3B5KCkNCiAgICBlbmRsb2NNYXJrZXIuY2FsbFByZXBhcnNlID0gRmFsc2UNCiAgICBtYXRjaEV4cHIgPSBsb2NNYXJrZXIoIl9vcmlnaW5hbF9zdGFydCIpICsgZXhwciArIGVuZGxvY01hcmtlcigiX29yaWdpbmFsX2VuZCIpDQogICAgaWYgYXNTdHJpbmc6DQogICAgICAgIGV4dHJhY3RUZXh0ID0gbGFtYmRhIHMsbCx0OiBzW3QuX29yaWdpbmFsX3N0YXJ0OnQuX29yaWdpbmFsX2VuZF0NCiAgICBlbHNlOg0KICAgICAgICBkZWYgZXh0cmFjdFRleHQocyxsLHQpOg0KICAgICAgICAgICAgdFs6XSA9IFtzW3QucG9wKCdfb3JpZ2luYWxfc3RhcnQnKTp0LnBvcCgnX29yaWdpbmFsX2VuZCcpXV0NCiAgICBtYXRjaEV4cHIuc2V0UGFyc2VBY3Rpb24oZXh0cmFjdFRleHQpDQogICAgbWF0Y2hFeHByLmlnbm9yZUV4cHJzID0gZXhwci5pZ25vcmVFeHBycw0KICAgIHJldHVybiBtYXRjaEV4cHINCg0KZGVmIHVuZ3JvdXAoZXhwcik6IA0KICAgICIiIg0KICAgIEhlbHBlciB0byB1bmRvIHB5cGFyc2luZydzIGRlZmF1bHQgZ3JvdXBpbmcgb2YgQW5kIGV4cHJlc3Npb25zLCBldmVuDQogICAgaWYgYWxsIGJ1dCBvbmUgYXJlIG5vbi1lbXB0eS4NCiAgICAiIiINCiAgICByZXR1cm4gVG9rZW5Db252ZXJ0ZXIoZXhwcikuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHQ6dFswXSkNCg0KZGVmIGxvY2F0ZWRFeHByKGV4cHIpOg0KICAgICIiIg0KICAgIEhlbHBlciB0byBkZWNvcmF0ZSBhIHJldHVybmVkIHRva2VuIHdpdGggaXRzIHN0YXJ0aW5nIGFuZCBlbmRpbmcgbG9jYXRpb25zIGluIHRoZSBpbnB1dCBzdHJpbmcuDQogICAgVGhpcyBoZWxwZXIgYWRkcyB0aGUgZm9sbG93aW5nIHJlc3VsdHMgbmFtZXM6DQogICAgIC0gbG9jbl9zdGFydCA9IGxvY2F0aW9uIHdoZXJlIG1hdGNoZWQgZXhwcmVzc2lvbiBiZWdpbnMNCiAgICAgLSBsb2NuX2VuZCA9IGxvY2F0aW9uIHdoZXJlIG1hdGNoZWQgZXhwcmVzc2lvbiBlbmRzDQogICAgIC0gdmFsdWUgPSB0aGUgYWN0dWFsIHBhcnNlZCByZXN1bHRzDQoNCiAgICBCZSBjYXJlZnVsIGlmIHRoZSBpbnB1dCB0ZXh0IGNvbnRhaW5zIEN7PFRBQj59IGNoYXJhY3RlcnMsIHlvdSBtYXkgd2FudCB0byBjYWxsDQogICAgQ3tMe1BhcnNlckVsZW1lbnQucGFyc2VXaXRoVGFic319DQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgd2QgPSBXb3JkKGFscGhhcykNCiAgICAgICAgZm9yIG1hdGNoIGluIGxvY2F0ZWRFeHByKHdkKS5zZWFyY2hTdHJpbmcoImxqc2RmMTIzbGtzZGpqZjEyM2xra2pqMTIyMiIpOg0KICAgICAgICAgICAgcHJpbnQobWF0Y2gpDQogICAgcHJpbnRzOjoNCiAgICAgICAgW1swLCAnbGpzZGYnLCA1XV0NCiAgICAgICAgW1s4LCAnbGtzZGpqZicsIDE1XV0NCiAgICAgICAgW1sxOCwgJ2xra2pqJywgMjNdXQ0KICAgICIiIg0KICAgIGxvY2F0b3IgPSBFbXB0eSgpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLGwsdDogbCkNCiAgICByZXR1cm4gR3JvdXAobG9jYXRvcigibG9jbl9zdGFydCIpICsgZXhwcigidmFsdWUiKSArIGxvY2F0b3IuY29weSgpLmxlYXZlV2hpdGVzcGFjZSgpKCJsb2NuX2VuZCIpKQ0KDQoNCiMgY29udmVuaWVuY2UgY29uc3RhbnRzIGZvciBwb3NpdGlvbmFsIGV4cHJlc3Npb25zDQplbXB0eSAgICAgICA9IEVtcHR5KCkuc2V0TmFtZSgiZW1wdHkiKQ0KbGluZVN0YXJ0ICAgPSBMaW5lU3RhcnQoKS5zZXROYW1lKCJsaW5lU3RhcnQiKQ0KbGluZUVuZCAgICAgPSBMaW5lRW5kKCkuc2V0TmFtZSgibGluZUVuZCIpDQpzdHJpbmdTdGFydCA9IFN0cmluZ1N0YXJ0KCkuc2V0TmFtZSgic3RyaW5nU3RhcnQiKQ0Kc3RyaW5nRW5kICAgPSBTdHJpbmdFbmQoKS5zZXROYW1lKCJzdHJpbmdFbmQiKQ0KDQpfZXNjYXBlZFB1bmMgPSBXb3JkKCBfYnNsYXNoLCByIlxbXS0qLiQrXj8oKX4gIiwgZXhhY3Q9MiApLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLGwsdDp0WzBdWzFdKQ0KX2VzY2FwZWRIZXhDaGFyID0gUmVnZXgociJcXDA/W3hYXVswLTlhLWZBLUZdKyIpLnNldFBhcnNlQWN0aW9uKGxhbWJkYSBzLGwsdDp1bmljaHIoaW50KHRbMF0ubHN0cmlwKHInXDB4JyksMTYpKSkNCl9lc2NhcGVkT2N0Q2hhciA9IFJlZ2V4KHIiXFwwWzAtN10rIikuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHMsbCx0OnVuaWNocihpbnQodFswXVsxOl0sOCkpKQ0KX3NpbmdsZUNoYXIgPSBfZXNjYXBlZFB1bmMgfCBfZXNjYXBlZEhleENoYXIgfCBfZXNjYXBlZE9jdENoYXIgfCBXb3JkKHByaW50YWJsZXMsIGV4Y2x1ZGVDaGFycz1yJ1xdJywgZXhhY3Q9MSkgfCBSZWdleChyIlx3IiwgcmUuVU5JQ09ERSkNCl9jaGFyUmFuZ2UgPSBHcm91cChfc2luZ2xlQ2hhciArIFN1cHByZXNzKCItIikgKyBfc2luZ2xlQ2hhcikNCl9yZUJyYWNrZXRFeHByID0gTGl0ZXJhbCgiWyIpICsgT3B0aW9uYWwoIl4iKS5zZXRSZXN1bHRzTmFtZSgibmVnYXRlIikgKyBHcm91cCggT25lT3JNb3JlKCBfY2hhclJhbmdlIHwgX3NpbmdsZUNoYXIgKSApLnNldFJlc3VsdHNOYW1lKCJib2R5IikgKyAiXSINCg0KZGVmIHNyYW5nZShzKToNCiAgICByIiIiDQogICAgSGVscGVyIHRvIGVhc2lseSBkZWZpbmUgc3RyaW5nIHJhbmdlcyBmb3IgdXNlIGluIFdvcmQgY29uc3RydWN0aW9uLiAgQm9ycm93cw0KICAgIHN5bnRheCBmcm9tIHJlZ2V4cCAnW10nIHN0cmluZyByYW5nZSBkZWZpbml0aW9uczo6DQogICAgICAgIHNyYW5nZSgiWzAtOV0iKSAgIC0+ICIwMTIzNDU2Nzg5Ig0KICAgICAgICBzcmFuZ2UoIlthLXpdIikgICAtPiAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiDQogICAgICAgIHNyYW5nZSgiW2EteiRfXSIpIC0+ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiRfIg0KICAgIFRoZSBpbnB1dCBzdHJpbmcgbXVzdCBiZSBlbmNsb3NlZCBpbiBbXSdzLCBhbmQgdGhlIHJldHVybmVkIHN0cmluZyBpcyB0aGUgZXhwYW5kZWQNCiAgICBjaGFyYWN0ZXIgc2V0IGpvaW5lZCBpbnRvIGEgc2luZ2xlIHN0cmluZy4NCiAgICBUaGUgdmFsdWVzIGVuY2xvc2VkIGluIHRoZSBbXSdzIG1heSBiZToNCiAgICAgLSBhIHNpbmdsZSBjaGFyYWN0ZXINCiAgICAgLSBhbiBlc2NhcGVkIGNoYXJhY3RlciB3aXRoIGEgbGVhZGluZyBiYWNrc2xhc2ggKHN1Y2ggYXMgQ3tcLX0gb3IgQ3tcXX0pDQogICAgIC0gYW4gZXNjYXBlZCBoZXggY2hhcmFjdGVyIHdpdGggYSBsZWFkaW5nIEN7J1x4J30gKEN7XHgyMX0sIHdoaWNoIGlzIGEgQ3snISd9IGNoYXJhY3RlcikgDQogICAgICAgICAoQ3tcMHgjI30gaXMgYWxzbyBzdXBwb3J0ZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5KSANCiAgICAgLSBhbiBlc2NhcGVkIG9jdGFsIGNoYXJhY3RlciB3aXRoIGEgbGVhZGluZyBDeydcMCd9IChDe1wwNDF9LCB3aGljaCBpcyBhIEN7JyEnfSBjaGFyYWN0ZXIpDQogICAgIC0gYSByYW5nZSBvZiBhbnkgb2YgdGhlIGFib3ZlLCBzZXBhcmF0ZWQgYnkgYSBkYXNoIChDeydhLXonfSwgZXRjLikNCiAgICAgLSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGFib3ZlIChDeydhZWlvdXknfSwgQ3snYS16QS1aMC05XyQnfSwgZXRjLikNCiAgICAiIiINCiAgICBfZXhwYW5kZWQgPSBsYW1iZGEgcDogcCBpZiBub3QgaXNpbnN0YW5jZShwLFBhcnNlUmVzdWx0cykgZWxzZSAnJy5qb2luKHVuaWNocihjKSBmb3IgYyBpbiByYW5nZShvcmQocFswXSksb3JkKHBbMV0pKzEpKQ0KICAgIHRyeToNCiAgICAgICAgcmV0dXJuICIiLmpvaW4oX2V4cGFuZGVkKHBhcnQpIGZvciBwYXJ0IGluIF9yZUJyYWNrZXRFeHByLnBhcnNlU3RyaW5nKHMpLmJvZHkpDQogICAgZXhjZXB0IEV4Y2VwdGlvbjoNCiAgICAgICAgcmV0dXJuICIiDQoNCmRlZiBtYXRjaE9ubHlBdENvbChuKToNCiAgICAiIiINCiAgICBIZWxwZXIgbWV0aG9kIGZvciBkZWZpbmluZyBwYXJzZSBhY3Rpb25zIHRoYXQgcmVxdWlyZSBtYXRjaGluZyBhdCBhIHNwZWNpZmljDQogICAgY29sdW1uIGluIHRoZSBpbnB1dCB0ZXh0Lg0KICAgICIiIg0KICAgIGRlZiB2ZXJpZnlDb2woc3RyZyxsb2NuLHRva3MpOg0KICAgICAgICBpZiBjb2wobG9jbixzdHJnKSAhPSBuOg0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24oc3RyZyxsb2NuLCJtYXRjaGVkIHRva2VuIG5vdCBhdCBjb2x1bW4gJWQiICUgbikNCiAgICByZXR1cm4gdmVyaWZ5Q29sDQoNCmRlZiByZXBsYWNlV2l0aChyZXBsU3RyKToNCiAgICAiIiINCiAgICBIZWxwZXIgbWV0aG9kIGZvciBjb21tb24gcGFyc2UgYWN0aW9ucyB0aGF0IHNpbXBseSByZXR1cm4gYSBsaXRlcmFsIHZhbHVlLiAgRXNwZWNpYWxseQ0KICAgIHVzZWZ1bCB3aGVuIHVzZWQgd2l0aCBDe0x7dHJhbnNmb3JtU3RyaW5nPFBhcnNlckVsZW1lbnQudHJhbnNmb3JtU3RyaW5nPn0oKX0uDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgbnVtID0gV29yZChudW1zKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdG9rczogaW50KHRva3NbMF0pKQ0KICAgICAgICBuYSA9IG9uZU9mKCJOL0EgTkEiKS5zZXRQYXJzZUFjdGlvbihyZXBsYWNlV2l0aChtYXRoLm5hbikpDQogICAgICAgIHRlcm0gPSBuYSB8IG51bQ0KICAgICAgICANCiAgICAgICAgT25lT3JNb3JlKHRlcm0pLnBhcnNlU3RyaW5nKCIzMjQgMjM0IE4vQSAyMzQiKSAjIC0+IFszMjQsIDIzNCwgbmFuLCAyMzRdDQogICAgIiIiDQogICAgcmV0dXJuIGxhbWJkYSBzLGwsdDogW3JlcGxTdHJdDQoNCmRlZiByZW1vdmVRdW90ZXMocyxsLHQpOg0KICAgICIiIg0KICAgIEhlbHBlciBwYXJzZSBhY3Rpb24gZm9yIHJlbW92aW5nIHF1b3RhdGlvbiBtYXJrcyBmcm9tIHBhcnNlZCBxdW90ZWQgc3RyaW5ncy4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICAjIGJ5IGRlZmF1bHQsIHF1b3RhdGlvbiBtYXJrcyBhcmUgaW5jbHVkZWQgaW4gcGFyc2VkIHJlc3VsdHMNCiAgICAgICAgcXVvdGVkU3RyaW5nLnBhcnNlU3RyaW5nKCInTm93IGlzIHRoZSBXaW50ZXIgb2Ygb3VyIERpc2NvbnRlbnQnIikgIyAtPiBbIidOb3cgaXMgdGhlIFdpbnRlciBvZiBvdXIgRGlzY29udGVudCciXQ0KDQogICAgICAgICMgdXNlIHJlbW92ZVF1b3RlcyB0byBzdHJpcCBxdW90YXRpb24gbWFya3MgZnJvbSBwYXJzZWQgcmVzdWx0cw0KICAgICAgICBxdW90ZWRTdHJpbmcuc2V0UGFyc2VBY3Rpb24ocmVtb3ZlUXVvdGVzKQ0KICAgICAgICBxdW90ZWRTdHJpbmcucGFyc2VTdHJpbmcoIidOb3cgaXMgdGhlIFdpbnRlciBvZiBvdXIgRGlzY29udGVudCciKSAjIC0+IFsiTm93IGlzIHRoZSBXaW50ZXIgb2Ygb3VyIERpc2NvbnRlbnQiXQ0KICAgICIiIg0KICAgIHJldHVybiB0WzBdWzE6LTFdDQoNCmRlZiB0b2tlbk1hcChmdW5jLCAqYXJncyk6DQogICAgIiIiDQogICAgSGVscGVyIHRvIGRlZmluZSBhIHBhcnNlIGFjdGlvbiBieSBtYXBwaW5nIGEgZnVuY3Rpb24gdG8gYWxsIGVsZW1lbnRzIG9mIGEgUGFyc2VSZXN1bHRzIGxpc3QuSWYgYW55IGFkZGl0aW9uYWwgDQogICAgYXJncyBhcmUgcGFzc2VkLCB0aGV5IGFyZSBmb3J3YXJkZWQgdG8gdGhlIGdpdmVuIGZ1bmN0aW9uIGFzIGFkZGl0aW9uYWwgYXJndW1lbnRzIGFmdGVyDQogICAgdGhlIHRva2VuLCBhcyBpbiBDe2hleF9pbnRlZ2VyID0gV29yZChoZXhudW1zKS5zZXRQYXJzZUFjdGlvbih0b2tlbk1hcChpbnQsIDE2KSl9LCB3aGljaCB3aWxsIGNvbnZlcnQgdGhlDQogICAgcGFyc2VkIGRhdGEgdG8gYW4gaW50ZWdlciB1c2luZyBiYXNlIDE2Lg0KDQogICAgRXhhbXBsZSAoY29tcGFyZSB0aGUgbGFzdCB0byBleGFtcGxlIGluIEx7UGFyc2VyRWxlbWVudC50cmFuc2Zvcm1TdHJpbmd9OjoNCiAgICAgICAgaGV4X2ludHMgPSBPbmVPck1vcmUoV29yZChoZXhudW1zKSkuc2V0UGFyc2VBY3Rpb24odG9rZW5NYXAoaW50LCAxNikpDQogICAgICAgIGhleF9pbnRzLnJ1blRlc3RzKCcnJw0KICAgICAgICAgICAgMDAgMTEgMjIgYWEgRkYgMGEgMGQgMWENCiAgICAgICAgICAgICcnJykNCiAgICAgICAgDQogICAgICAgIHVwcGVyd29yZCA9IFdvcmQoYWxwaGFzKS5zZXRQYXJzZUFjdGlvbih0b2tlbk1hcChzdHIudXBwZXIpKQ0KICAgICAgICBPbmVPck1vcmUodXBwZXJ3b3JkKS5ydW5UZXN0cygnJycNCiAgICAgICAgICAgIG15IGtpbmdkb20gZm9yIGEgaG9yc2UNCiAgICAgICAgICAgICcnJykNCg0KICAgICAgICB3ZCA9IFdvcmQoYWxwaGFzKS5zZXRQYXJzZUFjdGlvbih0b2tlbk1hcChzdHIudGl0bGUpKQ0KICAgICAgICBPbmVPck1vcmUod2QpLnNldFBhcnNlQWN0aW9uKCcgJy5qb2luKS5ydW5UZXN0cygnJycNCiAgICAgICAgICAgIG5vdyBpcyB0aGUgd2ludGVyIG9mIG91ciBkaXNjb250ZW50IG1hZGUgZ2xvcmlvdXMgc3VtbWVyIGJ5IHRoaXMgc3VuIG9mIHlvcmsNCiAgICAgICAgICAgICcnJykNCiAgICBwcmludHM6Og0KICAgICAgICAwMCAxMSAyMiBhYSBGRiAwYSAwZCAxYQ0KICAgICAgICBbMCwgMTcsIDM0LCAxNzAsIDI1NSwgMTAsIDEzLCAyNl0NCg0KICAgICAgICBteSBraW5nZG9tIGZvciBhIGhvcnNlDQogICAgICAgIFsnTVknLCAnS0lOR0RPTScsICdGT1InLCAnQScsICdIT1JTRSddDQoNCiAgICAgICAgbm93IGlzIHRoZSB3aW50ZXIgb2Ygb3VyIGRpc2NvbnRlbnQgbWFkZSBnbG9yaW91cyBzdW1tZXIgYnkgdGhpcyBzdW4gb2YgeW9yaw0KICAgICAgICBbJ05vdyBJcyBUaGUgV2ludGVyIE9mIE91ciBEaXNjb250ZW50IE1hZGUgR2xvcmlvdXMgU3VtbWVyIEJ5IFRoaXMgU3VuIE9mIFlvcmsnXQ0KICAgICIiIg0KICAgIGRlZiBwYShzLGwsdCk6DQogICAgICAgIHJldHVybiBbZnVuYyh0b2tuLCAqYXJncykgZm9yIHRva24gaW4gdF0NCg0KICAgIHRyeToNCiAgICAgICAgZnVuY19uYW1lID0gZ2V0YXR0cihmdW5jLCAnX19uYW1lX18nLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRhdHRyKGZ1bmMsICdfX2NsYXNzX18nKS5fX25hbWVfXykNCiAgICBleGNlcHQgRXhjZXB0aW9uOg0KICAgICAgICBmdW5jX25hbWUgPSBzdHIoZnVuYykNCiAgICBwYS5fX25hbWVfXyA9IGZ1bmNfbmFtZQ0KDQogICAgcmV0dXJuIHBhDQoNCnVwY2FzZVRva2VucyA9IHRva2VuTWFwKGxhbWJkYSB0OiBfdXN0cih0KS51cHBlcigpKQ0KIiIiKERlcHJlY2F0ZWQpIEhlbHBlciBwYXJzZSBhY3Rpb24gdG8gY29udmVydCB0b2tlbnMgdG8gdXBwZXIgY2FzZS4gRGVwcmVjYXRlZCBpbiBmYXZvciBvZiBMe3B5cGFyc2luZ19jb21tb24udXBjYXNlVG9rZW5zfSIiIg0KDQpkb3duY2FzZVRva2VucyA9IHRva2VuTWFwKGxhbWJkYSB0OiBfdXN0cih0KS5sb3dlcigpKQ0KIiIiKERlcHJlY2F0ZWQpIEhlbHBlciBwYXJzZSBhY3Rpb24gdG8gY29udmVydCB0b2tlbnMgdG8gbG93ZXIgY2FzZS4gRGVwcmVjYXRlZCBpbiBmYXZvciBvZiBMe3B5cGFyc2luZ19jb21tb24uZG93bmNhc2VUb2tlbnN9IiIiDQogICAgDQpkZWYgX21ha2VUYWdzKHRhZ1N0ciwgeG1sKToNCiAgICAiIiJJbnRlcm5hbCBoZWxwZXIgdG8gY29uc3RydWN0IG9wZW5pbmcgYW5kIGNsb3NpbmcgdGFnIGV4cHJlc3Npb25zLCBnaXZlbiBhIHRhZyBuYW1lIiIiDQogICAgaWYgaXNpbnN0YW5jZSh0YWdTdHIsYmFzZXN0cmluZyk6DQogICAgICAgIHJlc25hbWUgPSB0YWdTdHINCiAgICAgICAgdGFnU3RyID0gS2V5d29yZCh0YWdTdHIsIGNhc2VsZXNzPW5vdCB4bWwpDQogICAgZWxzZToNCiAgICAgICAgcmVzbmFtZSA9IHRhZ1N0ci5uYW1lDQoNCiAgICB0YWdBdHRyTmFtZSA9IFdvcmQoYWxwaGFzLGFscGhhbnVtcysiXy06IikNCiAgICBpZiAoeG1sKToNCiAgICAgICAgdGFnQXR0clZhbHVlID0gZGJsUXVvdGVkU3RyaW5nLmNvcHkoKS5zZXRQYXJzZUFjdGlvbiggcmVtb3ZlUXVvdGVzICkNCiAgICAgICAgb3BlblRhZyA9IFN1cHByZXNzKCI8IikgKyB0YWdTdHIoInRhZyIpICsgXA0KICAgICAgICAgICAgICAgIERpY3QoWmVyb09yTW9yZShHcm91cCggdGFnQXR0ck5hbWUgKyBTdXBwcmVzcygiPSIpICsgdGFnQXR0clZhbHVlICkpKSArIFwNCiAgICAgICAgICAgICAgICBPcHRpb25hbCgiLyIsZGVmYXVsdD1bRmFsc2VdKS5zZXRSZXN1bHRzTmFtZSgiZW1wdHkiKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcyxsLHQ6dFswXT09Jy8nKSArIFN1cHByZXNzKCI+IikNCiAgICBlbHNlOg0KICAgICAgICBwcmludGFibGVzTGVzc1JBYnJhY2sgPSAiIi5qb2luKGMgZm9yIGMgaW4gcHJpbnRhYmxlcyBpZiBjIG5vdCBpbiAiPiIpDQogICAgICAgIHRhZ0F0dHJWYWx1ZSA9IHF1b3RlZFN0cmluZy5jb3B5KCkuc2V0UGFyc2VBY3Rpb24oIHJlbW92ZVF1b3RlcyApIHwgV29yZChwcmludGFibGVzTGVzc1JBYnJhY2spDQogICAgICAgIG9wZW5UYWcgPSBTdXBwcmVzcygiPCIpICsgdGFnU3RyKCJ0YWciKSArIFwNCiAgICAgICAgICAgICAgICBEaWN0KFplcm9Pck1vcmUoR3JvdXAoIHRhZ0F0dHJOYW1lLnNldFBhcnNlQWN0aW9uKGRvd25jYXNlVG9rZW5zKSArIFwNCiAgICAgICAgICAgICAgICBPcHRpb25hbCggU3VwcHJlc3MoIj0iKSArIHRhZ0F0dHJWYWx1ZSApICkpKSArIFwNCiAgICAgICAgICAgICAgICBPcHRpb25hbCgiLyIsZGVmYXVsdD1bRmFsc2VdKS5zZXRSZXN1bHRzTmFtZSgiZW1wdHkiKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgcyxsLHQ6dFswXT09Jy8nKSArIFN1cHByZXNzKCI+IikNCiAgICBjbG9zZVRhZyA9IENvbWJpbmUoX0woIjwvIikgKyB0YWdTdHIgKyAiPiIpDQoNCiAgICBvcGVuVGFnID0gb3BlblRhZy5zZXRSZXN1bHRzTmFtZSgic3RhcnQiKyIiLmpvaW4ocmVzbmFtZS5yZXBsYWNlKCI6IiwiICIpLnRpdGxlKCkuc3BsaXQoKSkpLnNldE5hbWUoIjwlcz4iICUgcmVzbmFtZSkNCiAgICBjbG9zZVRhZyA9IGNsb3NlVGFnLnNldFJlc3VsdHNOYW1lKCJlbmQiKyIiLmpvaW4ocmVzbmFtZS5yZXBsYWNlKCI6IiwiICIpLnRpdGxlKCkuc3BsaXQoKSkpLnNldE5hbWUoIjwvJXM+IiAlIHJlc25hbWUpDQogICAgb3BlblRhZy50YWcgPSByZXNuYW1lDQogICAgY2xvc2VUYWcudGFnID0gcmVzbmFtZQ0KICAgIHJldHVybiBvcGVuVGFnLCBjbG9zZVRhZw0KDQpkZWYgbWFrZUhUTUxUYWdzKHRhZ1N0cik6DQogICAgIiIiDQogICAgSGVscGVyIHRvIGNvbnN0cnVjdCBvcGVuaW5nIGFuZCBjbG9zaW5nIHRhZyBleHByZXNzaW9ucyBmb3IgSFRNTCwgZ2l2ZW4gYSB0YWcgbmFtZS4gTWF0Y2hlcw0KICAgIHRhZ3MgaW4gZWl0aGVyIHVwcGVyIG9yIGxvd2VyIGNhc2UsIGF0dHJpYnV0ZXMgd2l0aCBuYW1lc3BhY2VzIGFuZCB3aXRoIHF1b3RlZCBvciB1bnF1b3RlZCB2YWx1ZXMuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgdGV4dCA9ICc8dGQ+TW9yZSBpbmZvIGF0IHRoZSA8YSBocmVmPSJodHRwOi8vcHlwYXJzaW5nLndpa2lzcGFjZXMuY29tIj5weXBhcnNpbmc8L2E+IHdpa2kgcGFnZTwvdGQ+Jw0KICAgICAgICAjIG1ha2VIVE1MVGFncyByZXR1cm5zIHB5cGFyc2luZyBleHByZXNzaW9ucyBmb3IgdGhlIG9wZW5pbmcgYW5kIGNsb3NpbmcgdGFncyBhcyBhIDItdHVwbGUNCiAgICAgICAgYSxhX2VuZCA9IG1ha2VIVE1MVGFncygiQSIpDQogICAgICAgIGxpbmtfZXhwciA9IGEgKyBTa2lwVG8oYV9lbmQpKCJsaW5rX3RleHQiKSArIGFfZW5kDQogICAgICAgIA0KICAgICAgICBmb3IgbGluayBpbiBsaW5rX2V4cHIuc2VhcmNoU3RyaW5nKHRleHQpOg0KICAgICAgICAgICAgIyBhdHRyaWJ1dGVzIGluIHRoZSA8QT4gdGFnIChsaWtlICJocmVmIiBzaG93biBoZXJlKSBhcmUgYWxzbyBhY2Nlc3NpYmxlIGFzIG5hbWVkIHJlc3VsdHMNCiAgICAgICAgICAgIHByaW50KGxpbmsubGlua190ZXh0LCAnLT4nLCBsaW5rLmhyZWYpDQogICAgcHJpbnRzOjoNCiAgICAgICAgcHlwYXJzaW5nIC0+IGh0dHA6Ly9weXBhcnNpbmcud2lraXNwYWNlcy5jb20NCiAgICAiIiINCiAgICByZXR1cm4gX21ha2VUYWdzKCB0YWdTdHIsIEZhbHNlICkNCg0KZGVmIG1ha2VYTUxUYWdzKHRhZ1N0cik6DQogICAgIiIiDQogICAgSGVscGVyIHRvIGNvbnN0cnVjdCBvcGVuaW5nIGFuZCBjbG9zaW5nIHRhZyBleHByZXNzaW9ucyBmb3IgWE1MLCBnaXZlbiBhIHRhZyBuYW1lLiBNYXRjaGVzDQogICAgdGFncyBvbmx5IGluIHRoZSBnaXZlbiB1cHBlci9sb3dlciBjYXNlLg0KDQogICAgRXhhbXBsZTogc2ltaWxhciB0byBMe21ha2VIVE1MVGFnc30NCiAgICAiIiINCiAgICByZXR1cm4gX21ha2VUYWdzKCB0YWdTdHIsIFRydWUgKQ0KDQpkZWYgd2l0aEF0dHJpYnV0ZSgqYXJncywqKmF0dHJEaWN0KToNCiAgICAiIiINCiAgICBIZWxwZXIgdG8gY3JlYXRlIGEgdmFsaWRhdGluZyBwYXJzZSBhY3Rpb24gdG8gYmUgdXNlZCB3aXRoIHN0YXJ0IHRhZ3MgY3JlYXRlZA0KICAgIHdpdGggQ3tMe21ha2VYTUxUYWdzfX0gb3IgQ3tMe21ha2VIVE1MVGFnc319LiBVc2UgQ3t3aXRoQXR0cmlidXRlfSB0byBxdWFsaWZ5IGEgc3RhcnRpbmcgdGFnDQogICAgd2l0aCBhIHJlcXVpcmVkIGF0dHJpYnV0ZSB2YWx1ZSwgdG8gYXZvaWQgZmFsc2UgbWF0Y2hlcyBvbiBjb21tb24gdGFncyBzdWNoIGFzDQogICAgQ3s8VEQ+fSBvciBDezxESVY+fS4NCg0KICAgIENhbGwgQ3t3aXRoQXR0cmlidXRlfSB3aXRoIGEgc2VyaWVzIG9mIGF0dHJpYnV0ZSBuYW1lcyBhbmQgdmFsdWVzLiBTcGVjaWZ5IHRoZSBsaXN0DQogICAgb2YgZmlsdGVyIGF0dHJpYnV0ZXMgbmFtZXMgYW5kIHZhbHVlcyBhczoNCiAgICAgLSBrZXl3b3JkIGFyZ3VtZW50cywgYXMgaW4gQ3soYWxpZ249InJpZ2h0Iil9LCBvcg0KICAgICAtIGFzIGFuIGV4cGxpY2l0IGRpY3Qgd2l0aCBDeyoqfSBvcGVyYXRvciwgd2hlbiBhbiBhdHRyaWJ1dGUgbmFtZSBpcyBhbHNvIGEgUHl0aG9uDQogICAgICAgICAgcmVzZXJ2ZWQgd29yZCwgYXMgaW4gQ3sqKnsiY2xhc3MiOiJDdXN0b21lciIsICJhbGlnbiI6InJpZ2h0In19DQogICAgIC0gYSBsaXN0IG9mIG5hbWUtdmFsdWUgdHVwbGVzLCBhcyBpbiAoICgibnMxOmNsYXNzIiwgIkN1c3RvbWVyIiksICgibnMyOmFsaWduIiwicmlnaHQiKSApDQogICAgRm9yIGF0dHJpYnV0ZSBuYW1lcyB3aXRoIGEgbmFtZXNwYWNlIHByZWZpeCwgeW91IG11c3QgdXNlIHRoZSBzZWNvbmQgZm9ybS4gIEF0dHJpYnV0ZQ0KICAgIG5hbWVzIGFyZSBtYXRjaGVkIGluc2Vuc2l0aXZlIHRvIHVwcGVyL2xvd2VyIGNhc2UuDQogICAgICAgDQogICAgSWYganVzdCB0ZXN0aW5nIGZvciBDe2NsYXNzfSAod2l0aCBvciB3aXRob3V0IGEgbmFtZXNwYWNlKSwgdXNlIEN7THt3aXRoQ2xhc3N9fS4NCg0KICAgIFRvIHZlcmlmeSB0aGF0IHRoZSBhdHRyaWJ1dGUgZXhpc3RzLCBidXQgd2l0aG91dCBzcGVjaWZ5aW5nIGEgdmFsdWUsIHBhc3MNCiAgICBDe3dpdGhBdHRyaWJ1dGUuQU5ZX1ZBTFVFfSBhcyB0aGUgdmFsdWUuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgaHRtbCA9ICcnJw0KICAgICAgICAgICAgPGRpdj4NCiAgICAgICAgICAgIFNvbWUgdGV4dA0KICAgICAgICAgICAgPGRpdiB0eXBlPSJncmlkIj4xIDQgMCAxIDA8L2Rpdj4NCiAgICAgICAgICAgIDxkaXYgdHlwZT0iZ3JhcGgiPjEsMyAyLDMgMSwxPC9kaXY+DQogICAgICAgICAgICA8ZGl2PnRoaXMgaGFzIG5vIHR5cGU8L2Rpdj4NCiAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgIA0KICAgICAgICAnJycNCiAgICAgICAgZGl2LGRpdl9lbmQgPSBtYWtlSFRNTFRhZ3MoImRpdiIpDQoNCiAgICAgICAgIyBvbmx5IG1hdGNoIGRpdiB0YWcgaGF2aW5nIGEgdHlwZSBhdHRyaWJ1dGUgd2l0aCB2YWx1ZSAiZ3JpZCINCiAgICAgICAgZGl2X2dyaWQgPSBkaXYoKS5zZXRQYXJzZUFjdGlvbih3aXRoQXR0cmlidXRlKHR5cGU9ImdyaWQiKSkNCiAgICAgICAgZ3JpZF9leHByID0gZGl2X2dyaWQgKyBTa2lwVG8oZGl2IHwgZGl2X2VuZCkoImJvZHkiKQ0KICAgICAgICBmb3IgZ3JpZF9oZWFkZXIgaW4gZ3JpZF9leHByLnNlYXJjaFN0cmluZyhodG1sKToNCiAgICAgICAgICAgIHByaW50KGdyaWRfaGVhZGVyLmJvZHkpDQogICAgICAgIA0KICAgICAgICAjIGNvbnN0cnVjdCBhIG1hdGNoIHdpdGggYW55IGRpdiB0YWcgaGF2aW5nIGEgdHlwZSBhdHRyaWJ1dGUsIHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlDQogICAgICAgIGRpdl9hbnlfdHlwZSA9IGRpdigpLnNldFBhcnNlQWN0aW9uKHdpdGhBdHRyaWJ1dGUodHlwZT13aXRoQXR0cmlidXRlLkFOWV9WQUxVRSkpDQogICAgICAgIGRpdl9leHByID0gZGl2X2FueV90eXBlICsgU2tpcFRvKGRpdiB8IGRpdl9lbmQpKCJib2R5IikNCiAgICAgICAgZm9yIGRpdl9oZWFkZXIgaW4gZGl2X2V4cHIuc2VhcmNoU3RyaW5nKGh0bWwpOg0KICAgICAgICAgICAgcHJpbnQoZGl2X2hlYWRlci5ib2R5KQ0KICAgIHByaW50czo6DQogICAgICAgIDEgNCAwIDEgMA0KDQogICAgICAgIDEgNCAwIDEgMA0KICAgICAgICAxLDMgMiwzIDEsMQ0KICAgICIiIg0KICAgIGlmIGFyZ3M6DQogICAgICAgIGF0dHJzID0gYXJnc1s6XQ0KICAgIGVsc2U6DQogICAgICAgIGF0dHJzID0gYXR0ckRpY3QuaXRlbXMoKQ0KICAgIGF0dHJzID0gWyhrLHYpIGZvciBrLHYgaW4gYXR0cnNdDQogICAgZGVmIHBhKHMsbCx0b2tlbnMpOg0KICAgICAgICBmb3IgYXR0ck5hbWUsYXR0clZhbHVlIGluIGF0dHJzOg0KICAgICAgICAgICAgaWYgYXR0ck5hbWUgbm90IGluIHRva2VuczoNCiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihzLGwsIm5vIG1hdGNoaW5nIGF0dHJpYnV0ZSAiICsgYXR0ck5hbWUpDQogICAgICAgICAgICBpZiBhdHRyVmFsdWUgIT0gd2l0aEF0dHJpYnV0ZS5BTllfVkFMVUUgYW5kIHRva2Vuc1thdHRyTmFtZV0gIT0gYXR0clZhbHVlOg0KICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKHMsbCwiYXR0cmlidXRlICclcycgaGFzIHZhbHVlICclcycsIG11c3QgYmUgJyVzJyIgJQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXR0ck5hbWUsIHRva2Vuc1thdHRyTmFtZV0sIGF0dHJWYWx1ZSkpDQogICAgcmV0dXJuIHBhDQp3aXRoQXR0cmlidXRlLkFOWV9WQUxVRSA9IG9iamVjdCgpDQoNCmRlZiB3aXRoQ2xhc3MoY2xhc3NuYW1lLCBuYW1lc3BhY2U9JycpOg0KICAgICIiIg0KICAgIFNpbXBsaWZpZWQgdmVyc2lvbiBvZiBDe0x7d2l0aEF0dHJpYnV0ZX19IHdoZW4gbWF0Y2hpbmcgb24gYSBkaXYgY2xhc3MgLSBtYWRlDQogICAgZGlmZmljdWx0IGJlY2F1c2UgQ3tjbGFzc30gaXMgYSByZXNlcnZlZCB3b3JkIGluIFB5dGhvbi4NCg0KICAgIEV4YW1wbGU6Og0KICAgICAgICBodG1sID0gJycnDQogICAgICAgICAgICA8ZGl2Pg0KICAgICAgICAgICAgU29tZSB0ZXh0DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJncmlkIj4xIDQgMCAxIDA8L2Rpdj4NCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImdyYXBoIj4xLDMgMiwzIDEsMTwvZGl2Pg0KICAgICAgICAgICAgPGRpdj50aGlzICZsdDtkaXYmZ3Q7IGhhcyBubyBjbGFzczwvZGl2Pg0KICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgDQogICAgICAgICcnJw0KICAgICAgICBkaXYsZGl2X2VuZCA9IG1ha2VIVE1MVGFncygiZGl2IikNCiAgICAgICAgZGl2X2dyaWQgPSBkaXYoKS5zZXRQYXJzZUFjdGlvbih3aXRoQ2xhc3MoImdyaWQiKSkNCiAgICAgICAgDQogICAgICAgIGdyaWRfZXhwciA9IGRpdl9ncmlkICsgU2tpcFRvKGRpdiB8IGRpdl9lbmQpKCJib2R5IikNCiAgICAgICAgZm9yIGdyaWRfaGVhZGVyIGluIGdyaWRfZXhwci5zZWFyY2hTdHJpbmcoaHRtbCk6DQogICAgICAgICAgICBwcmludChncmlkX2hlYWRlci5ib2R5KQ0KICAgICAgICANCiAgICAgICAgZGl2X2FueV90eXBlID0gZGl2KCkuc2V0UGFyc2VBY3Rpb24od2l0aENsYXNzKHdpdGhBdHRyaWJ1dGUuQU5ZX1ZBTFVFKSkNCiAgICAgICAgZGl2X2V4cHIgPSBkaXZfYW55X3R5cGUgKyBTa2lwVG8oZGl2IHwgZGl2X2VuZCkoImJvZHkiKQ0KICAgICAgICBmb3IgZGl2X2hlYWRlciBpbiBkaXZfZXhwci5zZWFyY2hTdHJpbmcoaHRtbCk6DQogICAgICAgICAgICBwcmludChkaXZfaGVhZGVyLmJvZHkpDQogICAgcHJpbnRzOjoNCiAgICAgICAgMSA0IDAgMSAwDQoNCiAgICAgICAgMSA0IDAgMSAwDQogICAgICAgIDEsMyAyLDMgMSwxDQogICAgIiIiDQogICAgY2xhc3NhdHRyID0gIiVzOmNsYXNzIiAlIG5hbWVzcGFjZSBpZiBuYW1lc3BhY2UgZWxzZSAiY2xhc3MiDQogICAgcmV0dXJuIHdpdGhBdHRyaWJ1dGUoKip7Y2xhc3NhdHRyIDogY2xhc3NuYW1lfSkgICAgICAgIA0KDQpvcEFzc29jID0gX0NvbnN0YW50cygpDQpvcEFzc29jLkxFRlQgPSBvYmplY3QoKQ0Kb3BBc3NvYy5SSUdIVCA9IG9iamVjdCgpDQoNCmRlZiBpbmZpeE5vdGF0aW9uKCBiYXNlRXhwciwgb3BMaXN0LCBscGFyPVN1cHByZXNzKCcoJyksIHJwYXI9U3VwcHJlc3MoJyknKSApOg0KICAgICIiIg0KICAgIEhlbHBlciBtZXRob2QgZm9yIGNvbnN0cnVjdGluZyBncmFtbWFycyBvZiBleHByZXNzaW9ucyBtYWRlIHVwIG9mDQogICAgb3BlcmF0b3JzIHdvcmtpbmcgaW4gYSBwcmVjZWRlbmNlIGhpZXJhcmNoeS4gIE9wZXJhdG9ycyBtYXkgYmUgdW5hcnkgb3INCiAgICBiaW5hcnksIGxlZnQtIG9yIHJpZ2h0LWFzc29jaWF0aXZlLiAgUGFyc2UgYWN0aW9ucyBjYW4gYWxzbyBiZSBhdHRhY2hlZA0KICAgIHRvIG9wZXJhdG9yIGV4cHJlc3Npb25zLiBUaGUgZ2VuZXJhdGVkIHBhcnNlciB3aWxsIGFsc28gcmVjb2duaXplIHRoZSB1c2UgDQogICAgb2YgcGFyZW50aGVzZXMgdG8gb3ZlcnJpZGUgb3BlcmF0b3IgcHJlY2VkZW5jZXMgKHNlZSBleGFtcGxlIGJlbG93KS4NCiAgICANCiAgICBOb3RlOiBpZiB5b3UgZGVmaW5lIGEgZGVlcCBvcGVyYXRvciBsaXN0LCB5b3UgbWF5IHNlZSBwZXJmb3JtYW5jZSBpc3N1ZXMNCiAgICB3aGVuIHVzaW5nIGluZml4Tm90YXRpb24uIFNlZSBMe1BhcnNlckVsZW1lbnQuZW5hYmxlUGFja3JhdH0gZm9yIGENCiAgICBtZWNoYW5pc20gdG8gcG90ZW50aWFsbHkgaW1wcm92ZSB5b3VyIHBhcnNlciBwZXJmb3JtYW5jZS4NCg0KICAgIFBhcmFtZXRlcnM6DQogICAgIC0gYmFzZUV4cHIgLSBleHByZXNzaW9uIHJlcHJlc2VudGluZyB0aGUgbW9zdCBiYXNpYyBlbGVtZW50IGZvciB0aGUgbmVzdGVkDQogICAgIC0gb3BMaXN0IC0gbGlzdCBvZiB0dXBsZXMsIG9uZSBmb3IgZWFjaCBvcGVyYXRvciBwcmVjZWRlbmNlIGxldmVsIGluIHRoZQ0KICAgICAgZXhwcmVzc2lvbiBncmFtbWFyOyBlYWNoIHR1cGxlIGlzIG9mIHRoZSBmb3JtDQogICAgICAob3BFeHByLCBudW1UZXJtcywgcmlnaHRMZWZ0QXNzb2MsIHBhcnNlQWN0aW9uKSwgd2hlcmU6DQogICAgICAgLSBvcEV4cHIgaXMgdGhlIHB5cGFyc2luZyBleHByZXNzaW9uIGZvciB0aGUgb3BlcmF0b3I7DQogICAgICAgICAgbWF5IGFsc28gYmUgYSBzdHJpbmcsIHdoaWNoIHdpbGwgYmUgY29udmVydGVkIHRvIGEgTGl0ZXJhbDsNCiAgICAgICAgICBpZiBudW1UZXJtcyBpcyAzLCBvcEV4cHIgaXMgYSB0dXBsZSBvZiB0d28gZXhwcmVzc2lvbnMsIGZvciB0aGUNCiAgICAgICAgICB0d28gb3BlcmF0b3JzIHNlcGFyYXRpbmcgdGhlIDMgdGVybXMNCiAgICAgICAtIG51bVRlcm1zIGlzIHRoZSBudW1iZXIgb2YgdGVybXMgZm9yIHRoaXMgb3BlcmF0b3IgKG11c3QNCiAgICAgICAgICBiZSAxLCAyLCBvciAzKQ0KICAgICAgIC0gcmlnaHRMZWZ0QXNzb2MgaXMgdGhlIGluZGljYXRvciB3aGV0aGVyIHRoZSBvcGVyYXRvciBpcw0KICAgICAgICAgIHJpZ2h0IG9yIGxlZnQgYXNzb2NpYXRpdmUsIHVzaW5nIHRoZSBweXBhcnNpbmctZGVmaW5lZA0KICAgICAgICAgIGNvbnN0YW50cyBDe29wQXNzb2MuUklHSFR9IGFuZCBDe29wQXNzb2MuTEVGVH0uDQogICAgICAgLSBwYXJzZUFjdGlvbiBpcyB0aGUgcGFyc2UgYWN0aW9uIHRvIGJlIGFzc29jaWF0ZWQgd2l0aA0KICAgICAgICAgIGV4cHJlc3Npb25zIG1hdGNoaW5nIHRoaXMgb3BlcmF0b3IgZXhwcmVzc2lvbiAodGhlDQogICAgICAgICAgcGFyc2UgYWN0aW9uIHR1cGxlIG1lbWJlciBtYXkgYmUgb21pdHRlZCkNCiAgICAgLSBscGFyIC0gZXhwcmVzc2lvbiBmb3IgbWF0Y2hpbmcgbGVmdC1wYXJlbnRoZXNlcyAoZGVmYXVsdD1De1N1cHByZXNzKCcoJyl9KQ0KICAgICAtIHJwYXIgLSBleHByZXNzaW9uIGZvciBtYXRjaGluZyByaWdodC1wYXJlbnRoZXNlcyAoZGVmYXVsdD1De1N1cHByZXNzKCcpJyl9KQ0KDQogICAgRXhhbXBsZTo6DQogICAgICAgICMgc2ltcGxlIGV4YW1wbGUgb2YgZm91ci1mdW5jdGlvbiBhcml0aG1ldGljIHdpdGggaW50cyBhbmQgdmFyaWFibGUgbmFtZXMNCiAgICAgICAgaW50ZWdlciA9IHB5cGFyc2luZ19jb21tb24uc2lnbmVkX2ludGVnZXINCiAgICAgICAgdmFybmFtZSA9IHB5cGFyc2luZ19jb21tb24uaWRlbnRpZmllciANCiAgICAgICAgDQogICAgICAgIGFyaXRoX2V4cHIgPSBpbmZpeE5vdGF0aW9uKGludGVnZXIgfCB2YXJuYW1lLA0KICAgICAgICAgICAgWw0KICAgICAgICAgICAgKCctJywgMSwgb3BBc3NvYy5SSUdIVCksDQogICAgICAgICAgICAob25lT2YoJyogLycpLCAyLCBvcEFzc29jLkxFRlQpLA0KICAgICAgICAgICAgKG9uZU9mKCcrIC0nKSwgMiwgb3BBc3NvYy5MRUZUKSwNCiAgICAgICAgICAgIF0pDQogICAgICAgIA0KICAgICAgICBhcml0aF9leHByLnJ1blRlc3RzKCcnJw0KICAgICAgICAgICAgNSszKjYNCiAgICAgICAgICAgICg1KzMpKjYNCiAgICAgICAgICAgIC0yLS0xMQ0KICAgICAgICAgICAgJycnLCBmdWxsRHVtcD1GYWxzZSkNCiAgICBwcmludHM6Og0KICAgICAgICA1KzMqNg0KICAgICAgICBbWzUsICcrJywgWzMsICcqJywgNl1dXQ0KDQogICAgICAgICg1KzMpKjYNCiAgICAgICAgW1tbNSwgJysnLCAzXSwgJyonLCA2XV0NCg0KICAgICAgICAtMi0tMTENCiAgICAgICAgW1tbJy0nLCAyXSwgJy0nLCBbJy0nLCAxMV1dXQ0KICAgICIiIg0KICAgIHJldCA9IEZvcndhcmQoKQ0KICAgIGxhc3RFeHByID0gYmFzZUV4cHIgfCAoIGxwYXIgKyByZXQgKyBycGFyICkNCiAgICBmb3IgaSxvcGVyRGVmIGluIGVudW1lcmF0ZShvcExpc3QpOg0KICAgICAgICBvcEV4cHIsYXJpdHkscmlnaHRMZWZ0QXNzb2MscGEgPSAob3BlckRlZiArIChOb25lLCkpWzo0XQ0KICAgICAgICB0ZXJtTmFtZSA9ICIlcyB0ZXJtIiAlIG9wRXhwciBpZiBhcml0eSA8IDMgZWxzZSAiJXMlcyB0ZXJtIiAlIG9wRXhwcg0KICAgICAgICBpZiBhcml0eSA9PSAzOg0KICAgICAgICAgICAgaWYgb3BFeHByIGlzIE5vbmUgb3IgbGVuKG9wRXhwcikgIT0gMjoNCiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJpZiBudW10ZXJtcz0zLCBvcEV4cHIgbXVzdCBiZSBhIHR1cGxlIG9yIGxpc3Qgb2YgdHdvIGV4cHJlc3Npb25zIikNCiAgICAgICAgICAgIG9wRXhwcjEsIG9wRXhwcjIgPSBvcEV4cHINCiAgICAgICAgdGhpc0V4cHIgPSBGb3J3YXJkKCkuc2V0TmFtZSh0ZXJtTmFtZSkNCiAgICAgICAgaWYgcmlnaHRMZWZ0QXNzb2MgPT0gb3BBc3NvYy5MRUZUOg0KICAgICAgICAgICAgaWYgYXJpdHkgPT0gMToNCiAgICAgICAgICAgICAgICBtYXRjaEV4cHIgPSBGb2xsb3dlZEJ5KGxhc3RFeHByICsgb3BFeHByKSArIEdyb3VwKCBsYXN0RXhwciArIE9uZU9yTW9yZSggb3BFeHByICkgKQ0KICAgICAgICAgICAgZWxpZiBhcml0eSA9PSAyOg0KICAgICAgICAgICAgICAgIGlmIG9wRXhwciBpcyBub3QgTm9uZToNCiAgICAgICAgICAgICAgICAgICAgbWF0Y2hFeHByID0gRm9sbG93ZWRCeShsYXN0RXhwciArIG9wRXhwciArIGxhc3RFeHByKSArIEdyb3VwKCBsYXN0RXhwciArIE9uZU9yTW9yZSggb3BFeHByICsgbGFzdEV4cHIgKSApDQogICAgICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICAgICAgbWF0Y2hFeHByID0gRm9sbG93ZWRCeShsYXN0RXhwcitsYXN0RXhwcikgKyBHcm91cCggbGFzdEV4cHIgKyBPbmVPck1vcmUobGFzdEV4cHIpICkNCiAgICAgICAgICAgIGVsaWYgYXJpdHkgPT0gMzoNCiAgICAgICAgICAgICAgICBtYXRjaEV4cHIgPSBGb2xsb3dlZEJ5KGxhc3RFeHByICsgb3BFeHByMSArIGxhc3RFeHByICsgb3BFeHByMiArIGxhc3RFeHByKSArIFwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cCggbGFzdEV4cHIgKyBvcEV4cHIxICsgbGFzdEV4cHIgKyBvcEV4cHIyICsgbGFzdEV4cHIgKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJvcGVyYXRvciBtdXN0IGJlIHVuYXJ5ICgxKSwgYmluYXJ5ICgyKSwgb3IgdGVybmFyeSAoMykiKQ0KICAgICAgICBlbGlmIHJpZ2h0TGVmdEFzc29jID09IG9wQXNzb2MuUklHSFQ6DQogICAgICAgICAgICBpZiBhcml0eSA9PSAxOg0KICAgICAgICAgICAgICAgICMgdHJ5IHRvIGF2b2lkIExSIHdpdGggdGhpcyBleHRyYSB0ZXN0DQogICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3BFeHByLCBPcHRpb25hbCk6DQogICAgICAgICAgICAgICAgICAgIG9wRXhwciA9IE9wdGlvbmFsKG9wRXhwcikNCiAgICAgICAgICAgICAgICBtYXRjaEV4cHIgPSBGb2xsb3dlZEJ5KG9wRXhwci5leHByICsgdGhpc0V4cHIpICsgR3JvdXAoIG9wRXhwciArIHRoaXNFeHByICkNCiAgICAgICAgICAgIGVsaWYgYXJpdHkgPT0gMjoNCiAgICAgICAgICAgICAgICBpZiBvcEV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICAgICAgICAgIG1hdGNoRXhwciA9IEZvbGxvd2VkQnkobGFzdEV4cHIgKyBvcEV4cHIgKyB0aGlzRXhwcikgKyBHcm91cCggbGFzdEV4cHIgKyBPbmVPck1vcmUoIG9wRXhwciArIHRoaXNFeHByICkgKQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIG1hdGNoRXhwciA9IEZvbGxvd2VkQnkobGFzdEV4cHIgKyB0aGlzRXhwcikgKyBHcm91cCggbGFzdEV4cHIgKyBPbmVPck1vcmUoIHRoaXNFeHByICkgKQ0KICAgICAgICAgICAgZWxpZiBhcml0eSA9PSAzOg0KICAgICAgICAgICAgICAgIG1hdGNoRXhwciA9IEZvbGxvd2VkQnkobGFzdEV4cHIgKyBvcEV4cHIxICsgdGhpc0V4cHIgKyBvcEV4cHIyICsgdGhpc0V4cHIpICsgXA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwKCBsYXN0RXhwciArIG9wRXhwcjEgKyB0aGlzRXhwciArIG9wRXhwcjIgKyB0aGlzRXhwciApDQogICAgICAgICAgICBlbHNlOg0KICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm9wZXJhdG9yIG11c3QgYmUgdW5hcnkgKDEpLCBiaW5hcnkgKDIpLCBvciB0ZXJuYXJ5ICgzKSIpDQogICAgICAgIGVsc2U6DQogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJvcGVyYXRvciBtdXN0IGluZGljYXRlIHJpZ2h0IG9yIGxlZnQgYXNzb2NpYXRpdml0eSIpDQogICAgICAgIGlmIHBhOg0KICAgICAgICAgICAgbWF0Y2hFeHByLnNldFBhcnNlQWN0aW9uKCBwYSApDQogICAgICAgIHRoaXNFeHByIDw8PSAoIG1hdGNoRXhwci5zZXROYW1lKHRlcm1OYW1lKSB8IGxhc3RFeHByICkNCiAgICAgICAgbGFzdEV4cHIgPSB0aGlzRXhwcg0KICAgIHJldCA8PD0gbGFzdEV4cHINCiAgICByZXR1cm4gcmV0DQoNCm9wZXJhdG9yUHJlY2VkZW5jZSA9IGluZml4Tm90YXRpb24NCiIiIihEZXByZWNhdGVkKSBGb3JtZXIgbmFtZSBvZiBDe0x7aW5maXhOb3RhdGlvbn19LCB3aWxsIGJlIGRyb3BwZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS4iIiINCg0KZGJsUXVvdGVkU3RyaW5nID0gQ29tYmluZShSZWdleChyJyIoPzpbXiJcblxyXFxdfCg/OiIiKXwoPzpcXCg/OlteeF18eFswLTlhLWZBLUZdKykpKSonKSsnIicpLnNldE5hbWUoInN0cmluZyBlbmNsb3NlZCBpbiBkb3VibGUgcXVvdGVzIikNCnNnbFF1b3RlZFN0cmluZyA9IENvbWJpbmUoUmVnZXgociInKD86W14nXG5cclxcXXwoPzonJyl8KD86XFwoPzpbXnhdfHhbMC05YS1mQS1GXSspKSkqIikrIiciKS5zZXROYW1lKCJzdHJpbmcgZW5jbG9zZWQgaW4gc2luZ2xlIHF1b3RlcyIpDQpxdW90ZWRTdHJpbmcgPSBDb21iaW5lKFJlZ2V4KHInIig/OlteIlxuXHJcXF18KD86IiIpfCg/OlxcKD86W154XXx4WzAtOWEtZkEtRl0rKSkpKicpKyciJ3wNCiAgICAgICAgICAgICAgICAgICAgICAgUmVnZXgociInKD86W14nXG5cclxcXXwoPzonJyl8KD86XFwoPzpbXnhdfHhbMC05YS1mQS1GXSspKSkqIikrIiciKS5zZXROYW1lKCJxdW90ZWRTdHJpbmcgdXNpbmcgc2luZ2xlIG9yIGRvdWJsZSBxdW90ZXMiKQ0KdW5pY29kZVN0cmluZyA9IENvbWJpbmUoX0woJ3UnKSArIHF1b3RlZFN0cmluZy5jb3B5KCkpLnNldE5hbWUoInVuaWNvZGUgc3RyaW5nIGxpdGVyYWwiKQ0KDQpkZWYgbmVzdGVkRXhwcihvcGVuZXI9IigiLCBjbG9zZXI9IikiLCBjb250ZW50PU5vbmUsIGlnbm9yZUV4cHI9cXVvdGVkU3RyaW5nLmNvcHkoKSk6DQogICAgIiIiDQogICAgSGVscGVyIG1ldGhvZCBmb3IgZGVmaW5pbmcgbmVzdGVkIGxpc3RzIGVuY2xvc2VkIGluIG9wZW5pbmcgYW5kIGNsb3NpbmcNCiAgICBkZWxpbWl0ZXJzICgiKCIgYW5kICIpIiBhcmUgdGhlIGRlZmF1bHQpLg0KDQogICAgUGFyYW1ldGVyczoNCiAgICAgLSBvcGVuZXIgLSBvcGVuaW5nIGNoYXJhY3RlciBmb3IgYSBuZXN0ZWQgbGlzdCAoZGVmYXVsdD1DeyIoIn0pOyBjYW4gYWxzbyBiZSBhIHB5cGFyc2luZyBleHByZXNzaW9uDQogICAgIC0gY2xvc2VyIC0gY2xvc2luZyBjaGFyYWN0ZXIgZm9yIGEgbmVzdGVkIGxpc3QgKGRlZmF1bHQ9Q3siKSJ9KTsgY2FuIGFsc28gYmUgYSBweXBhcnNpbmcgZXhwcmVzc2lvbg0KICAgICAtIGNvbnRlbnQgLSBleHByZXNzaW9uIGZvciBpdGVtcyB3aXRoaW4gdGhlIG5lc3RlZCBsaXN0cyAoZGVmYXVsdD1De05vbmV9KQ0KICAgICAtIGlnbm9yZUV4cHIgLSBleHByZXNzaW9uIGZvciBpZ25vcmluZyBvcGVuaW5nIGFuZCBjbG9zaW5nIGRlbGltaXRlcnMgKGRlZmF1bHQ9Q3txdW90ZWRTdHJpbmd9KQ0KDQogICAgSWYgYW4gZXhwcmVzc2lvbiBpcyBub3QgcHJvdmlkZWQgZm9yIHRoZSBjb250ZW50IGFyZ3VtZW50LCB0aGUgbmVzdGVkDQogICAgZXhwcmVzc2lvbiB3aWxsIGNhcHR1cmUgYWxsIHdoaXRlc3BhY2UtZGVsaW1pdGVkIGNvbnRlbnQgYmV0d2VlbiBkZWxpbWl0ZXJzDQogICAgYXMgYSBsaXN0IG9mIHNlcGFyYXRlIHZhbHVlcy4NCg0KICAgIFVzZSB0aGUgQ3tpZ25vcmVFeHByfSBhcmd1bWVudCB0byBkZWZpbmUgZXhwcmVzc2lvbnMgdGhhdCBtYXkgY29udGFpbg0KICAgIG9wZW5pbmcgb3IgY2xvc2luZyBjaGFyYWN0ZXJzIHRoYXQgc2hvdWxkIG5vdCBiZSB0cmVhdGVkIGFzIG9wZW5pbmcNCiAgICBvciBjbG9zaW5nIGNoYXJhY3RlcnMgZm9yIG5lc3RpbmcsIHN1Y2ggYXMgcXVvdGVkU3RyaW5nIG9yIGEgY29tbWVudA0KICAgIGV4cHJlc3Npb24uICBTcGVjaWZ5IG11bHRpcGxlIGV4cHJlc3Npb25zIHVzaW5nIGFuIEN7THtPcn19IG9yIEN7THtNYXRjaEZpcnN0fX0uDQogICAgVGhlIGRlZmF1bHQgaXMgTHtxdW90ZWRTdHJpbmd9LCBidXQgaWYgbm8gZXhwcmVzc2lvbnMgYXJlIHRvIGJlIGlnbm9yZWQsDQogICAgdGhlbiBwYXNzIEN7Tm9uZX0gZm9yIHRoaXMgYXJndW1lbnQuDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgZGF0YV90eXBlID0gb25lT2YoInZvaWQgaW50IHNob3J0IGxvbmcgY2hhciBmbG9hdCBkb3VibGUiKQ0KICAgICAgICBkZWNsX2RhdGFfdHlwZSA9IENvbWJpbmUoZGF0YV90eXBlICsgT3B0aW9uYWwoV29yZCgnKicpKSkNCiAgICAgICAgaWRlbnQgPSBXb3JkKGFscGhhcysnXycsIGFscGhhbnVtcysnXycpDQogICAgICAgIG51bWJlciA9IHB5cGFyc2luZ19jb21tb24ubnVtYmVyDQogICAgICAgIGFyZyA9IEdyb3VwKGRlY2xfZGF0YV90eXBlICsgaWRlbnQpDQogICAgICAgIExQQVIsUlBBUiA9IG1hcChTdXBwcmVzcywgIigpIikNCg0KICAgICAgICBjb2RlX2JvZHkgPSBuZXN0ZWRFeHByKCd7JywgJ30nLCBpZ25vcmVFeHByPShxdW90ZWRTdHJpbmcgfCBjU3R5bGVDb21tZW50KSkNCg0KICAgICAgICBjX2Z1bmN0aW9uID0gKGRlY2xfZGF0YV90eXBlKCJ0eXBlIikgDQogICAgICAgICAgICAgICAgICAgICAgKyBpZGVudCgibmFtZSIpDQogICAgICAgICAgICAgICAgICAgICAgKyBMUEFSICsgT3B0aW9uYWwoZGVsaW1pdGVkTGlzdChhcmcpLCBbXSkoImFyZ3MiKSArIFJQQVIgDQogICAgICAgICAgICAgICAgICAgICAgKyBjb2RlX2JvZHkoImJvZHkiKSkNCiAgICAgICAgY19mdW5jdGlvbi5pZ25vcmUoY1N0eWxlQ29tbWVudCkNCiAgICAgICAgDQogICAgICAgIHNvdXJjZV9jb2RlID0gJycnDQogICAgICAgICAgICBpbnQgaXNfb2RkKGludCB4KSB7IA0KICAgICAgICAgICAgICAgIHJldHVybiAoeCUyKTsgDQogICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICBpbnQgZGVjX3RvX2hleChjaGFyIGhjaGFyKSB7IA0KICAgICAgICAgICAgICAgIGlmIChoY2hhciA+PSAnMCcgJiYgaGNoYXIgPD0gJzknKSB7IA0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG9yZChoY2hhciktb3JkKCcwJykpOyANCiAgICAgICAgICAgICAgICB9IGVsc2UgeyANCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgxMCtvcmQoaGNoYXIpLW9yZCgnQScpKTsNCiAgICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgfQ0KICAgICAgICAnJycNCiAgICAgICAgZm9yIGZ1bmMgaW4gY19mdW5jdGlvbi5zZWFyY2hTdHJpbmcoc291cmNlX2NvZGUpOg0KICAgICAgICAgICAgcHJpbnQoIiUobmFtZSlzICglKHR5cGUpcykgYXJnczogJShhcmdzKXMiICUgZnVuYykNCg0KICAgIHByaW50czo6DQogICAgICAgIGlzX29kZCAoaW50KSBhcmdzOiBbWydpbnQnLCAneCddXQ0KICAgICAgICBkZWNfdG9faGV4IChpbnQpIGFyZ3M6IFtbJ2NoYXInLCAnaGNoYXInXV0NCiAgICAiIiINCiAgICBpZiBvcGVuZXIgPT0gY2xvc2VyOg0KICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJvcGVuaW5nIGFuZCBjbG9zaW5nIHN0cmluZ3MgY2Fubm90IGJlIHRoZSBzYW1lIikNCiAgICBpZiBjb250ZW50IGlzIE5vbmU6DQogICAgICAgIGlmIGlzaW5zdGFuY2Uob3BlbmVyLGJhc2VzdHJpbmcpIGFuZCBpc2luc3RhbmNlKGNsb3NlcixiYXNlc3RyaW5nKToNCiAgICAgICAgICAgIGlmIGxlbihvcGVuZXIpID09IDEgYW5kIGxlbihjbG9zZXIpPT0xOg0KICAgICAgICAgICAgICAgIGlmIGlnbm9yZUV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSAoQ29tYmluZShPbmVPck1vcmUofmlnbm9yZUV4cHIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnNOb3RJbihvcGVuZXIrY2xvc2VyK1BhcnNlckVsZW1lbnQuREVGQVVMVF9XSElURV9DSEFSUyxleGFjdD0xKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdDp0WzBdLnN0cmlwKCkpKQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSAoZW1wdHkuY29weSgpK0NoYXJzTm90SW4ob3BlbmVyK2Nsb3NlcitQYXJzZXJFbGVtZW50LkRFRkFVTFRfV0hJVEVfQ0hBUlMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdDp0WzBdLnN0cmlwKCkpKQ0KICAgICAgICAgICAgZWxzZToNCiAgICAgICAgICAgICAgICBpZiBpZ25vcmVFeHByIGlzIG5vdCBOb25lOg0KICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gKENvbWJpbmUoT25lT3JNb3JlKH5pZ25vcmVFeHByICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+TGl0ZXJhbChvcGVuZXIpICsgfkxpdGVyYWwoY2xvc2VyKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyc05vdEluKFBhcnNlckVsZW1lbnQuREVGQVVMVF9XSElURV9DSEFSUyxleGFjdD0xKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5zZXRQYXJzZUFjdGlvbihsYW1iZGEgdDp0WzBdLnN0cmlwKCkpKQ0KICAgICAgICAgICAgICAgIGVsc2U6DQogICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSAoQ29tYmluZShPbmVPck1vcmUofkxpdGVyYWwob3BlbmVyKSArIH5MaXRlcmFsKGNsb3NlcikgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnNOb3RJbihQYXJzZXJFbGVtZW50LkRFRkFVTFRfV0hJVEVfQ0hBUlMsZXhhY3Q9MSkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkuc2V0UGFyc2VBY3Rpb24obGFtYmRhIHQ6dFswXS5zdHJpcCgpKSkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm9wZW5pbmcgYW5kIGNsb3NpbmcgYXJndW1lbnRzIG11c3QgYmUgc3RyaW5ncyBpZiBubyBjb250ZW50IGV4cHJlc3Npb24gaXMgZ2l2ZW4iKQ0KICAgIHJldCA9IEZvcndhcmQoKQ0KICAgIGlmIGlnbm9yZUV4cHIgaXMgbm90IE5vbmU6DQogICAgICAgIHJldCA8PD0gR3JvdXAoIFN1cHByZXNzKG9wZW5lcikgKyBaZXJvT3JNb3JlKCBpZ25vcmVFeHByIHwgcmV0IHwgY29udGVudCApICsgU3VwcHJlc3MoY2xvc2VyKSApDQogICAgZWxzZToNCiAgICAgICAgcmV0IDw8PSBHcm91cCggU3VwcHJlc3Mob3BlbmVyKSArIFplcm9Pck1vcmUoIHJldCB8IGNvbnRlbnQgKSAgKyBTdXBwcmVzcyhjbG9zZXIpICkNCiAgICByZXQuc2V0TmFtZSgnbmVzdGVkICVzJXMgZXhwcmVzc2lvbicgJSAob3BlbmVyLGNsb3NlcikpDQogICAgcmV0dXJuIHJldA0KDQpkZWYgaW5kZW50ZWRCbG9jayhibG9ja1N0YXRlbWVudEV4cHIsIGluZGVudFN0YWNrLCBpbmRlbnQ9VHJ1ZSk6DQogICAgIiIiDQogICAgSGVscGVyIG1ldGhvZCBmb3IgZGVmaW5pbmcgc3BhY2UtZGVsaW1pdGVkIGluZGVudGF0aW9uIGJsb2Nrcywgc3VjaCBhcw0KICAgIHRob3NlIHVzZWQgdG8gZGVmaW5lIGJsb2NrIHN0YXRlbWVudHMgaW4gUHl0aG9uIHNvdXJjZSBjb2RlLg0KDQogICAgUGFyYW1ldGVyczoNCiAgICAgLSBibG9ja1N0YXRlbWVudEV4cHIgLSBleHByZXNzaW9uIGRlZmluaW5nIHN5bnRheCBvZiBzdGF0ZW1lbnQgdGhhdA0KICAgICAgICAgICAgaXMgcmVwZWF0ZWQgd2l0aGluIHRoZSBpbmRlbnRlZCBibG9jaw0KICAgICAtIGluZGVudFN0YWNrIC0gbGlzdCBjcmVhdGVkIGJ5IGNhbGxlciB0byBtYW5hZ2UgaW5kZW50YXRpb24gc3RhY2sNCiAgICAgICAgICAgIChtdWx0aXBsZSBzdGF0ZW1lbnRXaXRoSW5kZW50ZWRCbG9jayBleHByZXNzaW9ucyB3aXRoaW4gYSBzaW5nbGUgZ3JhbW1hcg0KICAgICAgICAgICAgc2hvdWxkIHNoYXJlIGEgY29tbW9uIGluZGVudFN0YWNrKQ0KICAgICAtIGluZGVudCAtIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGJsb2NrIG11c3QgYmUgaW5kZW50ZWQgYmV5b25kIHRoZQ0KICAgICAgICAgICAgdGhlIGN1cnJlbnQgbGV2ZWw7IHNldCB0byBGYWxzZSBmb3IgYmxvY2sgb2YgbGVmdC1tb3N0IHN0YXRlbWVudHMNCiAgICAgICAgICAgIChkZWZhdWx0PUN7VHJ1ZX0pDQoNCiAgICBBIHZhbGlkIGJsb2NrIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgQ3tibG9ja1N0YXRlbWVudH0uDQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgZGF0YSA9ICcnJw0KICAgICAgICBkZWYgQSh6KToNCiAgICAgICAgICBBMQ0KICAgICAgICAgIEIgPSAxMDANCiAgICAgICAgICBHID0gQTINCiAgICAgICAgICBBMg0KICAgICAgICAgIEEzDQogICAgICAgIEINCiAgICAgICAgZGVmIEJCKGEsYixjKToNCiAgICAgICAgICBCQjENCiAgICAgICAgICBkZWYgQkJBKCk6DQogICAgICAgICAgICBiYmExDQogICAgICAgICAgICBiYmEyDQogICAgICAgICAgICBiYmEzDQogICAgICAgIEMNCiAgICAgICAgRA0KICAgICAgICBkZWYgc3BhbSh4LHkpOg0KICAgICAgICAgICAgIGRlZiBlZ2dzKHopOg0KICAgICAgICAgICAgICAgICBwYXNzDQogICAgICAgICcnJw0KDQoNCiAgICAgICAgaW5kZW50U3RhY2sgPSBbMV0NCiAgICAgICAgc3RtdCA9IEZvcndhcmQoKQ0KDQogICAgICAgIGlkZW50aWZpZXIgPSBXb3JkKGFscGhhcywgYWxwaGFudW1zKQ0KICAgICAgICBmdW5jRGVjbCA9ICgiZGVmIiArIGlkZW50aWZpZXIgKyBHcm91cCggIigiICsgT3B0aW9uYWwoIGRlbGltaXRlZExpc3QoaWRlbnRpZmllcikgKSArICIpIiApICsgIjoiKQ0KICAgICAgICBmdW5jX2JvZHkgPSBpbmRlbnRlZEJsb2NrKHN0bXQsIGluZGVudFN0YWNrKQ0KICAgICAgICBmdW5jRGVmID0gR3JvdXAoIGZ1bmNEZWNsICsgZnVuY19ib2R5ICkNCg0KICAgICAgICBydmFsdWUgPSBGb3J3YXJkKCkNCiAgICAgICAgZnVuY0NhbGwgPSBHcm91cChpZGVudGlmaWVyICsgIigiICsgT3B0aW9uYWwoZGVsaW1pdGVkTGlzdChydmFsdWUpKSArICIpIikNCiAgICAgICAgcnZhbHVlIDw8IChmdW5jQ2FsbCB8IGlkZW50aWZpZXIgfCBXb3JkKG51bXMpKQ0KICAgICAgICBhc3NpZ25tZW50ID0gR3JvdXAoaWRlbnRpZmllciArICI9IiArIHJ2YWx1ZSkNCiAgICAgICAgc3RtdCA8PCAoIGZ1bmNEZWYgfCBhc3NpZ25tZW50IHwgaWRlbnRpZmllciApDQoNCiAgICAgICAgbW9kdWxlX2JvZHkgPSBPbmVPck1vcmUoc3RtdCkNCg0KICAgICAgICBwYXJzZVRyZWUgPSBtb2R1bGVfYm9keS5wYXJzZVN0cmluZyhkYXRhKQ0KICAgICAgICBwYXJzZVRyZWUucHByaW50KCkNCiAgICBwcmludHM6Og0KICAgICAgICBbWydkZWYnLA0KICAgICAgICAgICdBJywNCiAgICAgICAgICBbJygnLCAneicsICcpJ10sDQogICAgICAgICAgJzonLA0KICAgICAgICAgIFtbJ0ExJ10sIFtbJ0InLCAnPScsICcxMDAnXV0sIFtbJ0cnLCAnPScsICdBMiddXSwgWydBMiddLCBbJ0EzJ11dXSwNCiAgICAgICAgICdCJywNCiAgICAgICAgIFsnZGVmJywNCiAgICAgICAgICAnQkInLA0KICAgICAgICAgIFsnKCcsICdhJywgJ2InLCAnYycsICcpJ10sDQogICAgICAgICAgJzonLA0KICAgICAgICAgIFtbJ0JCMSddLCBbWydkZWYnLCAnQkJBJywgWycoJywgJyknXSwgJzonLCBbWydiYmExJ10sIFsnYmJhMiddLCBbJ2JiYTMnXV1dXV1dLA0KICAgICAgICAgJ0MnLA0KICAgICAgICAgJ0QnLA0KICAgICAgICAgWydkZWYnLA0KICAgICAgICAgICdzcGFtJywNCiAgICAgICAgICBbJygnLCAneCcsICd5JywgJyknXSwNCiAgICAgICAgICAnOicsDQogICAgICAgICAgW1tbJ2RlZicsICdlZ2dzJywgWycoJywgJ3onLCAnKSddLCAnOicsIFtbJ3Bhc3MnXV1dXV1dXSANCiAgICAiIiINCiAgICBkZWYgY2hlY2tQZWVySW5kZW50KHMsbCx0KToNCiAgICAgICAgaWYgbCA+PSBsZW4ocyk6IHJldHVybg0KICAgICAgICBjdXJDb2wgPSBjb2wobCxzKQ0KICAgICAgICBpZiBjdXJDb2wgIT0gaW5kZW50U3RhY2tbLTFdOg0KICAgICAgICAgICAgaWYgY3VyQ29sID4gaW5kZW50U3RhY2tbLTFdOg0KICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRmF0YWxFeGNlcHRpb24ocyxsLCJpbGxlZ2FsIG5lc3RpbmciKQ0KICAgICAgICAgICAgcmFpc2UgUGFyc2VFeGNlcHRpb24ocyxsLCJub3QgYSBwZWVyIGVudHJ5IikNCg0KICAgIGRlZiBjaGVja1N1YkluZGVudChzLGwsdCk6DQogICAgICAgIGN1ckNvbCA9IGNvbChsLHMpDQogICAgICAgIGlmIGN1ckNvbCA+IGluZGVudFN0YWNrWy0xXToNCiAgICAgICAgICAgIGluZGVudFN0YWNrLmFwcGVuZCggY3VyQ29sICkNCiAgICAgICAgZWxzZToNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKHMsbCwibm90IGEgc3ViZW50cnkiKQ0KDQogICAgZGVmIGNoZWNrVW5pbmRlbnQocyxsLHQpOg0KICAgICAgICBpZiBsID49IGxlbihzKTogcmV0dXJuDQogICAgICAgIGN1ckNvbCA9IGNvbChsLHMpDQogICAgICAgIGlmIG5vdChpbmRlbnRTdGFjayBhbmQgY3VyQ29sIDwgaW5kZW50U3RhY2tbLTFdIGFuZCBjdXJDb2wgPD0gaW5kZW50U3RhY2tbLTJdKToNCiAgICAgICAgICAgIHJhaXNlIFBhcnNlRXhjZXB0aW9uKHMsbCwibm90IGFuIHVuaW5kZW50IikNCiAgICAgICAgaW5kZW50U3RhY2sucG9wKCkNCg0KICAgIE5MID0gT25lT3JNb3JlKExpbmVFbmQoKS5zZXRXaGl0ZXNwYWNlQ2hhcnMoIlx0ICIpLnN1cHByZXNzKCkpDQogICAgSU5ERU5UID0gKEVtcHR5KCkgKyBFbXB0eSgpLnNldFBhcnNlQWN0aW9uKGNoZWNrU3ViSW5kZW50KSkuc2V0TmFtZSgnSU5ERU5UJykNCiAgICBQRUVSICAgPSBFbXB0eSgpLnNldFBhcnNlQWN0aW9uKGNoZWNrUGVlckluZGVudCkuc2V0TmFtZSgnJykNCiAgICBVTkRFTlQgPSBFbXB0eSgpLnNldFBhcnNlQWN0aW9uKGNoZWNrVW5pbmRlbnQpLnNldE5hbWUoJ1VOSU5ERU5UJykNCiAgICBpZiBpbmRlbnQ6DQogICAgICAgIHNtRXhwciA9IEdyb3VwKCBPcHRpb25hbChOTCkgKw0KICAgICAgICAgICAgI34gRm9sbG93ZWRCeShibG9ja1N0YXRlbWVudEV4cHIpICsNCiAgICAgICAgICAgIElOREVOVCArIChPbmVPck1vcmUoIFBFRVIgKyBHcm91cChibG9ja1N0YXRlbWVudEV4cHIpICsgT3B0aW9uYWwoTkwpICkpICsgVU5ERU5UKQ0KICAgIGVsc2U6DQogICAgICAgIHNtRXhwciA9IEdyb3VwKCBPcHRpb25hbChOTCkgKw0KICAgICAgICAgICAgKE9uZU9yTW9yZSggUEVFUiArIEdyb3VwKGJsb2NrU3RhdGVtZW50RXhwcikgKyBPcHRpb25hbChOTCkgKSkgKQ0KICAgIGJsb2NrU3RhdGVtZW50RXhwci5pZ25vcmUoX2JzbGFzaCArIExpbmVFbmQoKSkNCiAgICByZXR1cm4gc21FeHByLnNldE5hbWUoJ2luZGVudGVkIGJsb2NrJykNCg0KYWxwaGFzOGJpdCA9IHNyYW5nZShyIltcMHhjMC1cMHhkNlwweGQ4LVwweGY2XDB4ZjgtXDB4ZmZdIikNCnB1bmM4Yml0ID0gc3JhbmdlKHIiW1wweGExLVwweGJmXDB4ZDdcMHhmN10iKQ0KDQphbnlPcGVuVGFnLGFueUNsb3NlVGFnID0gbWFrZUhUTUxUYWdzKFdvcmQoYWxwaGFzLGFscGhhbnVtcysiXzoiKS5zZXROYW1lKCdhbnkgdGFnJykpDQpfaHRtbEVudGl0eU1hcCA9IGRpY3QoemlwKCJndCBsdCBhbXAgbmJzcCBxdW90IGFwb3MiLnNwbGl0KCksJz48JiAiXCcnKSkNCmNvbW1vbkhUTUxFbnRpdHkgPSBSZWdleCgnJig/UDxlbnRpdHk+JyArICd8Jy5qb2luKF9odG1sRW50aXR5TWFwLmtleXMoKSkgKyIpOyIpLnNldE5hbWUoImNvbW1vbiBIVE1MIGVudGl0eSIpDQpkZWYgcmVwbGFjZUhUTUxFbnRpdHkodCk6DQogICAgIiIiSGVscGVyIHBhcnNlciBhY3Rpb24gdG8gcmVwbGFjZSBjb21tb24gSFRNTCBlbnRpdGllcyB3aXRoIHRoZWlyIHNwZWNpYWwgY2hhcmFjdGVycyIiIg0KICAgIHJldHVybiBfaHRtbEVudGl0eU1hcC5nZXQodC5lbnRpdHkpDQoNCiMgaXQncyBlYXN5IHRvIGdldCB0aGVzZSBjb21tZW50IHN0cnVjdHVyZXMgd3JvbmcgLSB0aGV5J3JlIHZlcnkgY29tbW9uLCBzbyBtYXkgYXMgd2VsbCBtYWtlIHRoZW0gYXZhaWxhYmxlDQpjU3R5bGVDb21tZW50ID0gQ29tYmluZShSZWdleChyIi9cKig/OlteKl18XCooPyEvKSkqIikgKyAnKi8nKS5zZXROYW1lKCJDIHN0eWxlIGNvbW1lbnQiKQ0KIkNvbW1lbnQgb2YgdGhlIGZvcm0gQ3svKiAuLi4gKi99Ig0KDQpodG1sQ29tbWVudCA9IFJlZ2V4KHIiPCEtLVtcc1xTXSo/LS0+Iikuc2V0TmFtZSgiSFRNTCBjb21tZW50IikNCiJDb21tZW50IG9mIHRoZSBmb3JtIEN7PCEtLSAuLi4gLS0+fSINCg0KcmVzdE9mTGluZSA9IFJlZ2V4KHIiLioiKS5sZWF2ZVdoaXRlc3BhY2UoKS5zZXROYW1lKCJyZXN0IG9mIGxpbmUiKQ0KZGJsU2xhc2hDb21tZW50ID0gUmVnZXgociIvLyg/OlxcXG58W15cbl0pKiIpLnNldE5hbWUoIi8vIGNvbW1lbnQiKQ0KIkNvbW1lbnQgb2YgdGhlIGZvcm0gQ3svLyAuLi4gKHRvIGVuZCBvZiBsaW5lKX0iDQoNCmNwcFN0eWxlQ29tbWVudCA9IENvbWJpbmUoUmVnZXgociIvXCooPzpbXipdfFwqKD8hLykpKiIpICsgJyovJ3wgZGJsU2xhc2hDb21tZW50KS5zZXROYW1lKCJDKysgc3R5bGUgY29tbWVudCIpDQoiQ29tbWVudCBvZiBlaXRoZXIgZm9ybSBDe0x7Y1N0eWxlQ29tbWVudH19IG9yIEN7THtkYmxTbGFzaENvbW1lbnR9fSINCg0KamF2YVN0eWxlQ29tbWVudCA9IGNwcFN0eWxlQ29tbWVudA0KIlNhbWUgYXMgQ3tMe2NwcFN0eWxlQ29tbWVudH19Ig0KDQpweXRob25TdHlsZUNvbW1lbnQgPSBSZWdleChyIiMuKiIpLnNldE5hbWUoIlB5dGhvbiBzdHlsZSBjb21tZW50IikNCiJDb21tZW50IG9mIHRoZSBmb3JtIEN7IyAuLi4gKHRvIGVuZCBvZiBsaW5lKX0iDQoNCl9jb21tYXNlcGl0ZW0gPSBDb21iaW5lKE9uZU9yTW9yZShXb3JkKHByaW50YWJsZXMsIGV4Y2x1ZGVDaGFycz0nLCcpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbCggV29yZCgiIFx0IikgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+TGl0ZXJhbCgiLCIpICsgfkxpbmVFbmQoKSApICkgKS5zdHJlYW1saW5lKCkuc2V0TmFtZSgiY29tbWFJdGVtIikNCmNvbW1hU2VwYXJhdGVkTGlzdCA9IGRlbGltaXRlZExpc3QoIE9wdGlvbmFsKCBxdW90ZWRTdHJpbmcuY29weSgpIHwgX2NvbW1hc2VwaXRlbSwgZGVmYXVsdD0iIikgKS5zZXROYW1lKCJjb21tYVNlcGFyYXRlZExpc3QiKQ0KIiIiKERlcHJlY2F0ZWQpIFByZWRlZmluZWQgZXhwcmVzc2lvbiBvZiAxIG9yIG1vcmUgcHJpbnRhYmxlIHdvcmRzIG9yIHF1b3RlZCBzdHJpbmdzLCBzZXBhcmF0ZWQgYnkgY29tbWFzLg0KICAgVGhpcyBleHByZXNzaW9uIGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgTHtweXBhcnNpbmdfY29tbW9uLmNvbW1hX3NlcGFyYXRlZF9saXN0fS4iIiINCg0KIyBzb21lIG90aGVyIHVzZWZ1bCBleHByZXNzaW9ucyAtIHVzaW5nIGxvd2VyLWNhc2UgY2xhc3MgbmFtZSBzaW5jZSB3ZSBhcmUgcmVhbGx5IHVzaW5nIHRoaXMgYXMgYSBuYW1lc3BhY2UNCmNsYXNzIHB5cGFyc2luZ19jb21tb246DQogICAgIiIiDQogICAgSGVyZSBhcmUgc29tZSBjb21tb24gbG93LWxldmVsIGV4cHJlc3Npb25zIHRoYXQgbWF5IGJlIHVzZWZ1bCBpbiBqdW1wLXN0YXJ0aW5nIHBhcnNlciBkZXZlbG9wbWVudDoNCiAgICAgLSBudW1lcmljIGZvcm1zIChMe2ludGVnZXJzPGludGVnZXI+fSwgTHtyZWFsczxyZWFsPn0sIEx7c2NpZW50aWZpYyBub3RhdGlvbjxzY2lfcmVhbD59KQ0KICAgICAtIGNvbW1vbiBMe3Byb2dyYW1taW5nIGlkZW50aWZpZXJzPGlkZW50aWZpZXI+fQ0KICAgICAtIG5ldHdvcmsgYWRkcmVzc2VzIChMe01BQzxtYWNfYWRkcmVzcz59LCBMe0lQdjQ8aXB2NF9hZGRyZXNzPn0sIEx7SVB2NjxpcHY2X2FkZHJlc3M+fSkNCiAgICAgLSBJU084NjAxIEx7ZGF0ZXM8aXNvODYwMV9kYXRlPn0gYW5kIEx7ZGF0ZXRpbWU8aXNvODYwMV9kYXRldGltZT59DQogICAgIC0gTHtVVUlEPHV1aWQ+fQ0KICAgICAtIEx7Y29tbWEtc2VwYXJhdGVkIGxpc3Q8Y29tbWFfc2VwYXJhdGVkX2xpc3Q+fQ0KICAgIFBhcnNlIGFjdGlvbnM6DQogICAgIC0gQ3tMe2NvbnZlcnRUb0ludGVnZXJ9fQ0KICAgICAtIEN7THtjb252ZXJ0VG9GbG9hdH19DQogICAgIC0gQ3tMe2NvbnZlcnRUb0RhdGV9fQ0KICAgICAtIEN7THtjb252ZXJ0VG9EYXRldGltZX19DQogICAgIC0gQ3tMe3N0cmlwSFRNTFRhZ3N9fQ0KICAgICAtIEN7THt1cGNhc2VUb2tlbnN9fQ0KICAgICAtIEN7THtkb3duY2FzZVRva2Vuc319DQoNCiAgICBFeGFtcGxlOjoNCiAgICAgICAgcHlwYXJzaW5nX2NvbW1vbi5udW1iZXIucnVuVGVzdHMoJycnDQogICAgICAgICAgICAjIGFueSBpbnQgb3IgcmVhbCBudW1iZXIsIHJldHVybmVkIGFzIHRoZSBhcHByb3ByaWF0ZSB0eXBlDQogICAgICAgICAgICAxMDANCiAgICAgICAgICAgIC0xMDANCiAgICAgICAgICAgICsxMDANCiAgICAgICAgICAgIDMuMTQxNTkNCiAgICAgICAgICAgIDYuMDJlMjMNCiAgICAgICAgICAgIDFlLTEyDQogICAgICAgICAgICAnJycpDQoNCiAgICAgICAgcHlwYXJzaW5nX2NvbW1vbi5mbnVtYmVyLnJ1blRlc3RzKCcnJw0KICAgICAgICAgICAgIyBhbnkgaW50IG9yIHJlYWwgbnVtYmVyLCByZXR1cm5lZCBhcyBmbG9hdA0KICAgICAgICAgICAgMTAwDQogICAgICAgICAgICAtMTAwDQogICAgICAgICAgICArMTAwDQogICAgICAgICAgICAzLjE0MTU5DQogICAgICAgICAgICA2LjAyZTIzDQogICAgICAgICAgICAxZS0xMg0KICAgICAgICAgICAgJycnKQ0KDQogICAgICAgIHB5cGFyc2luZ19jb21tb24uaGV4X2ludGVnZXIucnVuVGVzdHMoJycnDQogICAgICAgICAgICAjIGhleCBudW1iZXJzDQogICAgICAgICAgICAxMDANCiAgICAgICAgICAgIEZGDQogICAgICAgICAgICAnJycpDQoNCiAgICAgICAgcHlwYXJzaW5nX2NvbW1vbi5mcmFjdGlvbi5ydW5UZXN0cygnJycNCiAgICAgICAgICAgICMgZnJhY3Rpb25zDQogICAgICAgICAgICAxLzINCiAgICAgICAgICAgIC0zLzQNCiAgICAgICAgICAgICcnJykNCg0KICAgICAgICBweXBhcnNpbmdfY29tbW9uLm1peGVkX2ludGVnZXIucnVuVGVzdHMoJycnDQogICAgICAgICAgICAjIG1peGVkIGZyYWN0aW9ucw0KICAgICAgICAgICAgMQ0KICAgICAgICAgICAgMS8yDQogICAgICAgICAgICAtMy80DQogICAgICAgICAgICAxLTMvNA0KICAgICAgICAgICAgJycnKQ0KDQogICAgICAgIGltcG9ydCB1dWlkDQogICAgICAgIHB5cGFyc2luZ19jb21tb24udXVpZC5zZXRQYXJzZUFjdGlvbih0b2tlbk1hcCh1dWlkLlVVSUQpKQ0KICAgICAgICBweXBhcnNpbmdfY29tbW9uLnV1aWQucnVuVGVzdHMoJycnDQogICAgICAgICAgICAjIHV1aWQNCiAgICAgICAgICAgIDEyMzQ1Njc4LTEyMzQtNTY3OC0xMjM0LTU2NzgxMjM0NTY3OA0KICAgICAgICAgICAgJycnKQ0KICAgIHByaW50czo6DQogICAgICAgICMgYW55IGludCBvciByZWFsIG51bWJlciwgcmV0dXJuZWQgYXMgdGhlIGFwcHJvcHJpYXRlIHR5cGUNCiAgICAgICAgMTAwDQogICAgICAgIFsxMDBdDQoNCiAgICAgICAgLTEwMA0KICAgICAgICBbLTEwMF0NCg0KICAgICAgICArMTAwDQogICAgICAgIFsxMDBdDQoNCiAgICAgICAgMy4xNDE1OQ0KICAgICAgICBbMy4xNDE1OV0NCg0KICAgICAgICA2LjAyZTIzDQogICAgICAgIFs2LjAyZSsyM10NCg0KICAgICAgICAxZS0xMg0KICAgICAgICBbMWUtMTJdDQoNCiAgICAgICAgIyBhbnkgaW50IG9yIHJlYWwgbnVtYmVyLCByZXR1cm5lZCBhcyBmbG9hdA0KICAgICAgICAxMDANCiAgICAgICAgWzEwMC4wXQ0KDQogICAgICAgIC0xMDANCiAgICAgICAgWy0xMDAuMF0NCg0KICAgICAgICArMTAwDQogICAgICAgIFsxMDAuMF0NCg0KICAgICAgICAzLjE0MTU5DQogICAgICAgIFszLjE0MTU5XQ0KDQogICAgICAgIDYuMDJlMjMNCiAgICAgICAgWzYuMDJlKzIzXQ0KDQogICAgICAgIDFlLTEyDQogICAgICAgIFsxZS0xMl0NCg0KICAgICAgICAjIGhleCBudW1iZXJzDQogICAgICAgIDEwMA0KICAgICAgICBbMjU2XQ0KDQogICAgICAgIEZGDQogICAgICAgIFsyNTVdDQoNCiAgICAgICAgIyBmcmFjdGlvbnMNCiAgICAgICAgMS8yDQogICAgICAgIFswLjVdDQoNCiAgICAgICAgLTMvNA0KICAgICAgICBbLTAuNzVdDQoNCiAgICAgICAgIyBtaXhlZCBmcmFjdGlvbnMNCiAgICAgICAgMQ0KICAgICAgICBbMV0NCg0KICAgICAgICAxLzINCiAgICAgICAgWzAuNV0NCg0KICAgICAgICAtMy80DQogICAgICAgIFstMC43NV0NCg0KICAgICAgICAxLTMvNA0KICAgICAgICBbMS43NV0NCg0KICAgICAgICAjIHV1aWQNCiAgICAgICAgMTIzNDU2NzgtMTIzNC01Njc4LTEyMzQtNTY3ODEyMzQ1Njc4DQogICAgICAgIFtVVUlEKCcxMjM0NTY3OC0xMjM0LTU2NzgtMTIzNC01Njc4MTIzNDU2NzgnKV0NCiAgICAiIiINCg0KICAgIGNvbnZlcnRUb0ludGVnZXIgPSB0b2tlbk1hcChpbnQpDQogICAgIiIiDQogICAgUGFyc2UgYWN0aW9uIGZvciBjb252ZXJ0aW5nIHBhcnNlZCBpbnRlZ2VycyB0byBQeXRob24gaW50DQogICAgIiIiDQoNCiAgICBjb252ZXJ0VG9GbG9hdCA9IHRva2VuTWFwKGZsb2F0KQ0KICAgICIiIg0KICAgIFBhcnNlIGFjdGlvbiBmb3IgY29udmVydGluZyBwYXJzZWQgbnVtYmVycyB0byBQeXRob24gZmxvYXQNCiAgICAiIiINCg0KICAgIGludGVnZXIgPSBXb3JkKG51bXMpLnNldE5hbWUoImludGVnZXIiKS5zZXRQYXJzZUFjdGlvbihjb252ZXJ0VG9JbnRlZ2VyKQ0KICAgICIiImV4cHJlc3Npb24gdGhhdCBwYXJzZXMgYW4gdW5zaWduZWQgaW50ZWdlciwgcmV0dXJucyBhbiBpbnQiIiINCg0KICAgIGhleF9pbnRlZ2VyID0gV29yZChoZXhudW1zKS5zZXROYW1lKCJoZXggaW50ZWdlciIpLnNldFBhcnNlQWN0aW9uKHRva2VuTWFwKGludCwxNikpDQogICAgIiIiZXhwcmVzc2lvbiB0aGF0IHBhcnNlcyBhIGhleGFkZWNpbWFsIGludGVnZXIsIHJldHVybnMgYW4gaW50IiIiDQoNCiAgICBzaWduZWRfaW50ZWdlciA9IFJlZ2V4KHInWystXT9cZCsnKS5zZXROYW1lKCJzaWduZWQgaW50ZWdlciIpLnNldFBhcnNlQWN0aW9uKGNvbnZlcnRUb0ludGVnZXIpDQogICAgIiIiZXhwcmVzc2lvbiB0aGF0IHBhcnNlcyBhbiBpbnRlZ2VyIHdpdGggb3B0aW9uYWwgbGVhZGluZyBzaWduLCByZXR1cm5zIGFuIGludCIiIg0KDQogICAgZnJhY3Rpb24gPSAoc2lnbmVkX2ludGVnZXIoKS5zZXRQYXJzZUFjdGlvbihjb252ZXJ0VG9GbG9hdCkgKyAnLycgKyBzaWduZWRfaW50ZWdlcigpLnNldFBhcnNlQWN0aW9uKGNvbnZlcnRUb0Zsb2F0KSkuc2V0TmFtZSgiZnJhY3Rpb24iKQ0KICAgICIiImZyYWN0aW9uYWwgZXhwcmVzc2lvbiBvZiBhbiBpbnRlZ2VyIGRpdmlkZWQgYnkgYW4gaW50ZWdlciwgcmV0dXJucyBhIGZsb2F0IiIiDQogICAgZnJhY3Rpb24uYWRkUGFyc2VBY3Rpb24obGFtYmRhIHQ6IHRbMF0vdFstMV0pDQoNCiAgICBtaXhlZF9pbnRlZ2VyID0gKGZyYWN0aW9uIHwgc2lnbmVkX2ludGVnZXIgKyBPcHRpb25hbChPcHRpb25hbCgnLScpLnN1cHByZXNzKCkgKyBmcmFjdGlvbikpLnNldE5hbWUoImZyYWN0aW9uIG9yIG1peGVkIGludGVnZXItZnJhY3Rpb24iKQ0KICAgICIiIm1peGVkIGludGVnZXIgb2YgdGhlIGZvcm0gJ2ludGVnZXIgLSBmcmFjdGlvbicsIHdpdGggb3B0aW9uYWwgbGVhZGluZyBpbnRlZ2VyLCByZXR1cm5zIGZsb2F0IiIiDQogICAgbWl4ZWRfaW50ZWdlci5hZGRQYXJzZUFjdGlvbihzdW0pDQoNCiAgICByZWFsID0gUmVnZXgocidbKy1dP1xkK1wuXGQqJykuc2V0TmFtZSgicmVhbCBudW1iZXIiKS5zZXRQYXJzZUFjdGlvbihjb252ZXJ0VG9GbG9hdCkNCiAgICAiIiJleHByZXNzaW9uIHRoYXQgcGFyc2VzIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGFuZCByZXR1cm5zIGEgZmxvYXQiIiINCg0KICAgIHNjaV9yZWFsID0gUmVnZXgocidbKy1dP1xkKyhbZUVdWystXT9cZCt8XC5cZCooW2VFXVsrLV0/XGQrKT8pJykuc2V0TmFtZSgicmVhbCBudW1iZXIgd2l0aCBzY2llbnRpZmljIG5vdGF0aW9uIikuc2V0UGFyc2VBY3Rpb24oY29udmVydFRvRmxvYXQpDQogICAgIiIiZXhwcmVzc2lvbiB0aGF0IHBhcnNlcyBhIGZsb2F0aW5nIHBvaW50IG51bWJlciB3aXRoIG9wdGlvbmFsIHNjaWVudGlmaWMgbm90YXRpb24gYW5kIHJldHVybnMgYSBmbG9hdCIiIg0KDQogICAgIyBzdHJlYW1saW5pbmcgdGhpcyBleHByZXNzaW9uIG1ha2VzIHRoZSBkb2NzIG5pY2VyLWxvb2tpbmcNCiAgICBudW1iZXIgPSAoc2NpX3JlYWwgfCByZWFsIHwgc2lnbmVkX2ludGVnZXIpLnN0cmVhbWxpbmUoKQ0KICAgICIiImFueSBudW1lcmljIGV4cHJlc3Npb24sIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgUHl0aG9uIHR5cGUiIiINCg0KICAgIGZudW1iZXIgPSBSZWdleChyJ1srLV0/XGQrXC4/XGQqKFtlRV1bKy1dP1xkKyk/Jykuc2V0TmFtZSgiZm51bWJlciIpLnNldFBhcnNlQWN0aW9uKGNvbnZlcnRUb0Zsb2F0KQ0KICAgICIiImFueSBpbnQgb3IgcmVhbCBudW1iZXIsIHJldHVybmVkIGFzIGZsb2F0IiIiDQogICAgDQogICAgaWRlbnRpZmllciA9IFdvcmQoYWxwaGFzKydfJywgYWxwaGFudW1zKydfJykuc2V0TmFtZSgiaWRlbnRpZmllciIpDQogICAgIiIidHlwaWNhbCBjb2RlIGlkZW50aWZpZXIgKGxlYWRpbmcgYWxwaGEgb3IgJ18nLCBmb2xsb3dlZCBieSAwIG9yIG1vcmUgYWxwaGFzLCBudW1zLCBvciAnXycpIiIiDQogICAgDQogICAgaXB2NF9hZGRyZXNzID0gUmVnZXgocicoMjVbMC01XXwyWzAtNF1bMC05XXwxP1swLTldezEsMn0pKFwuKDI1WzAtNV18MlswLTRdWzAtOV18MT9bMC05XXsxLDJ9KSl7M30nKS5zZXROYW1lKCJJUHY0IGFkZHJlc3MiKQ0KICAgICJJUHY0IGFkZHJlc3MgKEN7MC4wLjAuMCAtIDI1NS4yNTUuMjU1LjI1NX0pIg0KDQogICAgX2lwdjZfcGFydCA9IFJlZ2V4KHInWzAtOWEtZkEtRl17MSw0fScpLnNldE5hbWUoImhleF9pbnRlZ2VyIikNCiAgICBfZnVsbF9pcHY2X2FkZHJlc3MgPSAoX2lwdjZfcGFydCArICgnOicgKyBfaXB2Nl9wYXJ0KSo3KS5zZXROYW1lKCJmdWxsIElQdjYgYWRkcmVzcyIpDQogICAgX3Nob3J0X2lwdjZfYWRkcmVzcyA9IChPcHRpb25hbChfaXB2Nl9wYXJ0ICsgKCc6JyArIF9pcHY2X3BhcnQpKigwLDYpKSArICI6OiIgKyBPcHRpb25hbChfaXB2Nl9wYXJ0ICsgKCc6JyArIF9pcHY2X3BhcnQpKigwLDYpKSkuc2V0TmFtZSgic2hvcnQgSVB2NiBhZGRyZXNzIikNCiAgICBfc2hvcnRfaXB2Nl9hZGRyZXNzLmFkZENvbmRpdGlvbihsYW1iZGEgdDogc3VtKDEgZm9yIHR0IGluIHQgaWYgcHlwYXJzaW5nX2NvbW1vbi5faXB2Nl9wYXJ0Lm1hdGNoZXModHQpKSA8IDgpDQogICAgX21peGVkX2lwdjZfYWRkcmVzcyA9ICgiOjpmZmZmOiIgKyBpcHY0X2FkZHJlc3MpLnNldE5hbWUoIm1peGVkIElQdjYgYWRkcmVzcyIpDQogICAgaXB2Nl9hZGRyZXNzID0gQ29tYmluZSgoX2Z1bGxfaXB2Nl9hZGRyZXNzIHwgX21peGVkX2lwdjZfYWRkcmVzcyB8IF9zaG9ydF9pcHY2X2FkZHJlc3MpLnNldE5hbWUoIklQdjYgYWRkcmVzcyIpKS5zZXROYW1lKCJJUHY2IGFkZHJlc3MiKQ0KICAgICJJUHY2IGFkZHJlc3MgKGxvbmcsIHNob3J0LCBvciBtaXhlZCBmb3JtKSINCiAgICANCiAgICBtYWNfYWRkcmVzcyA9IFJlZ2V4KHInWzAtOWEtZkEtRl17Mn0oWzouLV0pWzAtOWEtZkEtRl17Mn0oPzpcMVswLTlhLWZBLUZdezJ9KXs0fScpLnNldE5hbWUoIk1BQyBhZGRyZXNzIikNCiAgICAiTUFDIGFkZHJlc3MgeHg6eHg6eHg6eHg6eHggKG1heSBhbHNvIGhhdmUgJy0nIG9yICcuJyBkZWxpbWl0ZXJzKSINCg0KICAgIEBzdGF0aWNtZXRob2QNCiAgICBkZWYgY29udmVydFRvRGF0ZShmbXQ9IiVZLSVtLSVkIik6DQogICAgICAgICIiIg0KICAgICAgICBIZWxwZXIgdG8gY3JlYXRlIGEgcGFyc2UgYWN0aW9uIGZvciBjb252ZXJ0aW5nIHBhcnNlZCBkYXRlIHN0cmluZyB0byBQeXRob24gZGF0ZXRpbWUuZGF0ZQ0KDQogICAgICAgIFBhcmFtcyAtDQogICAgICAgICAtIGZtdCAtIGZvcm1hdCB0byBiZSBwYXNzZWQgdG8gZGF0ZXRpbWUuc3RycHRpbWUgKGRlZmF1bHQ9Q3siJVktJW0tJWQifSkNCg0KICAgICAgICBFeGFtcGxlOjoNCiAgICAgICAgICAgIGRhdGVfZXhwciA9IHB5cGFyc2luZ19jb21tb24uaXNvODYwMV9kYXRlLmNvcHkoKQ0KICAgICAgICAgICAgZGF0ZV9leHByLnNldFBhcnNlQWN0aW9uKHB5cGFyc2luZ19jb21tb24uY29udmVydFRvRGF0ZSgpKQ0KICAgICAgICAgICAgcHJpbnQoZGF0ZV9leHByLnBhcnNlU3RyaW5nKCIxOTk5LTEyLTMxIikpDQogICAgICAgIHByaW50czo6DQogICAgICAgICAgICBbZGF0ZXRpbWUuZGF0ZSgxOTk5LCAxMiwgMzEpXQ0KICAgICAgICAiIiINCiAgICAgICAgZGVmIGN2dF9mbihzLGwsdCk6DQogICAgICAgICAgICB0cnk6DQogICAgICAgICAgICAgICAgcmV0dXJuIGRhdGV0aW1lLnN0cnB0aW1lKHRbMF0sIGZtdCkuZGF0ZSgpDQogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvciBhcyB2ZToNCiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihzLCBsLCBzdHIodmUpKQ0KICAgICAgICByZXR1cm4gY3Z0X2ZuDQoNCiAgICBAc3RhdGljbWV0aG9kDQogICAgZGVmIGNvbnZlcnRUb0RhdGV0aW1lKGZtdD0iJVktJW0tJWRUJUg6JU06JVMuJWYiKToNCiAgICAgICAgIiIiDQogICAgICAgIEhlbHBlciB0byBjcmVhdGUgYSBwYXJzZSBhY3Rpb24gZm9yIGNvbnZlcnRpbmcgcGFyc2VkIGRhdGV0aW1lIHN0cmluZyB0byBQeXRob24gZGF0ZXRpbWUuZGF0ZXRpbWUNCg0KICAgICAgICBQYXJhbXMgLQ0KICAgICAgICAgLSBmbXQgLSBmb3JtYXQgdG8gYmUgcGFzc2VkIHRvIGRhdGV0aW1lLnN0cnB0aW1lIChkZWZhdWx0PUN7IiVZLSVtLSVkVCVIOiVNOiVTLiVmIn0pDQoNCiAgICAgICAgRXhhbXBsZTo6DQogICAgICAgICAgICBkdF9leHByID0gcHlwYXJzaW5nX2NvbW1vbi5pc284NjAxX2RhdGV0aW1lLmNvcHkoKQ0KICAgICAgICAgICAgZHRfZXhwci5zZXRQYXJzZUFjdGlvbihweXBhcnNpbmdfY29tbW9uLmNvbnZlcnRUb0RhdGV0aW1lKCkpDQogICAgICAgICAgICBwcmludChkdF9leHByLnBhcnNlU3RyaW5nKCIxOTk5LTEyLTMxVDIzOjU5OjU5Ljk5OSIpKQ0KICAgICAgICBwcmludHM6Og0KICAgICAgICAgICAgW2RhdGV0aW1lLmRhdGV0aW1lKDE5OTksIDEyLCAzMSwgMjMsIDU5LCA1OSwgOTk5MDAwKV0NCiAgICAgICAgIiIiDQogICAgICAgIGRlZiBjdnRfZm4ocyxsLHQpOg0KICAgICAgICAgICAgdHJ5Og0KICAgICAgICAgICAgICAgIHJldHVybiBkYXRldGltZS5zdHJwdGltZSh0WzBdLCBmbXQpDQogICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvciBhcyB2ZToNCiAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUV4Y2VwdGlvbihzLCBsLCBzdHIodmUpKQ0KICAgICAgICByZXR1cm4gY3Z0X2ZuDQoNCiAgICBpc284NjAxX2RhdGUgPSBSZWdleChyJyg/UDx5ZWFyPlxkezR9KSg/Oi0oP1A8bW9udGg+XGRcZCkoPzotKD9QPGRheT5cZFxkKSk/KT8nKS5zZXROYW1lKCJJU084NjAxIGRhdGUiKQ0KICAgICJJU084NjAxIGRhdGUgKEN7eXl5eS1tbS1kZH0pIg0KDQogICAgaXNvODYwMV9kYXRldGltZSA9IFJlZ2V4KHInKD9QPHllYXI+XGR7NH0pLSg/UDxtb250aD5cZFxkKS0oP1A8ZGF5PlxkXGQpW1QgXSg/UDxob3VyPlxkXGQpOig/UDxtaW51dGU+XGRcZCkoOig/UDxzZWNvbmQ+XGRcZChcLlxkKik/KT8pPyg/UDx0ej5afFsrLV1cZFxkOj9cZFxkKT8nKS5zZXROYW1lKCJJU084NjAxIGRhdGV0aW1lIikNCiAgICAiSVNPODYwMSBkYXRldGltZSAoQ3t5eXl5LW1tLWRkVGhoOm1tOnNzLnMoWnwrLTAwOjAwKX0pIC0gdHJhaWxpbmcgc2Vjb25kcywgbWlsbGlzZWNvbmRzLCBhbmQgdGltZXpvbmUgb3B0aW9uYWw7IGFjY2VwdHMgc2VwYXJhdGluZyBDeydUJ30gb3IgQ3snICd9Ig0KDQogICAgdXVpZCA9IFJlZ2V4KHInWzAtOWEtZkEtRl17OH0oLVswLTlhLWZBLUZdezR9KXszfS1bMC05YS1mQS1GXXsxMn0nKS5zZXROYW1lKCJVVUlEIikNCiAgICAiVVVJRCAoQ3t4eHh4eHh4eC14eHh4LXh4eHgteHh4eC14eHh4eHh4eHh4eHh9KSINCg0KICAgIF9odG1sX3N0cmlwcGVyID0gYW55T3BlblRhZy5zdXBwcmVzcygpIHwgYW55Q2xvc2VUYWcuc3VwcHJlc3MoKQ0KICAgIEBzdGF0aWNtZXRob2QNCiAgICBkZWYgc3RyaXBIVE1MVGFncyhzLCBsLCB0b2tlbnMpOg0KICAgICAgICAiIiINCiAgICAgICAgUGFyc2UgYWN0aW9uIHRvIHJlbW92ZSBIVE1MIHRhZ3MgZnJvbSB3ZWIgcGFnZSBIVE1MIHNvdXJjZQ0KDQogICAgICAgIEV4YW1wbGU6Og0KICAgICAgICAgICAgIyBzdHJpcCBIVE1MIGxpbmtzIGZyb20gbm9ybWFsIHRleHQgDQogICAgICAgICAgICB0ZXh0ID0gJzx0ZD5Nb3JlIGluZm8gYXQgdGhlIDxhIGhyZWY9Imh0dHA6Ly9weXBhcnNpbmcud2lraXNwYWNlcy5jb20iPnB5cGFyc2luZzwvYT4gd2lraSBwYWdlPC90ZD4nDQogICAgICAgICAgICB0ZCx0ZF9lbmQgPSBtYWtlSFRNTFRhZ3MoIlREIikNCiAgICAgICAgICAgIHRhYmxlX3RleHQgPSB0ZCArIFNraXBUbyh0ZF9lbmQpLnNldFBhcnNlQWN0aW9uKHB5cGFyc2luZ19jb21tb24uc3RyaXBIVE1MVGFncykoImJvZHkiKSArIHRkX2VuZA0KICAgICAgICAgICAgDQogICAgICAgICAgICBwcmludCh0YWJsZV90ZXh0LnBhcnNlU3RyaW5nKHRleHQpLmJvZHkpICMgLT4gJ01vcmUgaW5mbyBhdCB0aGUgcHlwYXJzaW5nIHdpa2kgcGFnZScNCiAgICAgICAgIiIiDQogICAgICAgIHJldHVybiBweXBhcnNpbmdfY29tbW9uLl9odG1sX3N0cmlwcGVyLnRyYW5zZm9ybVN0cmluZyh0b2tlbnNbMF0pDQoNCiAgICBfY29tbWFzZXBpdGVtID0gQ29tYmluZShPbmVPck1vcmUofkxpdGVyYWwoIiwiKSArIH5MaW5lRW5kKCkgKyBXb3JkKHByaW50YWJsZXMsIGV4Y2x1ZGVDaGFycz0nLCcpIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgT3B0aW9uYWwoIFdoaXRlKCIgXHQiKSApICkgKS5zdHJlYW1saW5lKCkuc2V0TmFtZSgiY29tbWFJdGVtIikNCiAgICBjb21tYV9zZXBhcmF0ZWRfbGlzdCA9IGRlbGltaXRlZExpc3QoIE9wdGlvbmFsKCBxdW90ZWRTdHJpbmcuY29weSgpIHwgX2NvbW1hc2VwaXRlbSwgZGVmYXVsdD0iIikgKS5zZXROYW1lKCJjb21tYSBzZXBhcmF0ZWQgbGlzdCIpDQogICAgIiIiUHJlZGVmaW5lZCBleHByZXNzaW9uIG9mIDEgb3IgbW9yZSBwcmludGFibGUgd29yZHMgb3IgcXVvdGVkIHN0cmluZ3MsIHNlcGFyYXRlZCBieSBjb21tYXMuIiIiDQoNCiAgICB1cGNhc2VUb2tlbnMgPSBzdGF0aWNtZXRob2QodG9rZW5NYXAobGFtYmRhIHQ6IF91c3RyKHQpLnVwcGVyKCkpKQ0KICAgICIiIlBhcnNlIGFjdGlvbiB0byBjb252ZXJ0IHRva2VucyB0byB1cHBlciBjYXNlLiIiIg0KDQogICAgZG93bmNhc2VUb2tlbnMgPSBzdGF0aWNtZXRob2QodG9rZW5NYXAobGFtYmRhIHQ6IF91c3RyKHQpLmxvd2VyKCkpKQ0KICAgICIiIlBhcnNlIGFjdGlvbiB0byBjb252ZXJ0IHRva2VucyB0byBsb3dlciBjYXNlLiIiIg0KDQoNCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6DQoNCiAgICBzZWxlY3RUb2tlbiAgICA9IENhc2VsZXNzTGl0ZXJhbCgic2VsZWN0IikNCiAgICBmcm9tVG9rZW4gICAgICA9IENhc2VsZXNzTGl0ZXJhbCgiZnJvbSIpDQoNCiAgICBpZGVudCAgICAgICAgICA9IFdvcmQoYWxwaGFzLCBhbHBoYW51bXMgKyAiXyQiKQ0KDQogICAgY29sdW1uTmFtZSAgICAgPSBkZWxpbWl0ZWRMaXN0KGlkZW50LCAiLiIsIGNvbWJpbmU9VHJ1ZSkuc2V0UGFyc2VBY3Rpb24odXBjYXNlVG9rZW5zKQ0KICAgIGNvbHVtbk5hbWVMaXN0ID0gR3JvdXAoZGVsaW1pdGVkTGlzdChjb2x1bW5OYW1lKSkuc2V0TmFtZSgiY29sdW1ucyIpDQogICAgY29sdW1uU3BlYyAgICAgPSAoJyonIHwgY29sdW1uTmFtZUxpc3QpDQoNCiAgICB0YWJsZU5hbWUgICAgICA9IGRlbGltaXRlZExpc3QoaWRlbnQsICIuIiwgY29tYmluZT1UcnVlKS5zZXRQYXJzZUFjdGlvbih1cGNhc2VUb2tlbnMpDQogICAgdGFibGVOYW1lTGlzdCAgPSBHcm91cChkZWxpbWl0ZWRMaXN0KHRhYmxlTmFtZSkpLnNldE5hbWUoInRhYmxlcyIpDQogICAgDQogICAgc2ltcGxlU1FMICAgICAgPSBzZWxlY3RUb2tlbigiY29tbWFuZCIpICsgY29sdW1uU3BlYygiY29sdW1ucyIpICsgZnJvbVRva2VuICsgdGFibGVOYW1lTGlzdCgidGFibGVzIikNCg0KICAgICMgZGVtbyBydW5UZXN0cyBtZXRob2QsIGluY2x1ZGluZyBlbWJlZGRlZCBjb21tZW50cyBpbiB0ZXN0IHN0cmluZw0KICAgIHNpbXBsZVNRTC5ydW5UZXN0cygiIiINCiAgICAgICAgIyAnKicgYXMgY29sdW1uIGxpc3QgYW5kIGRvdHRlZCB0YWJsZSBuYW1lDQogICAgICAgIHNlbGVjdCAqIGZyb20gU1lTLlhZWlpZDQoNCiAgICAgICAgIyBjYXNlbGVzcyBtYXRjaCBvbiAiU0VMRUNUIiwgYW5kIGNhc3RzIGJhY2sgdG8gInNlbGVjdCINCiAgICAgICAgU0VMRUNUICogZnJvbSBYWVpaWSwgQUJDDQoNCiAgICAgICAgIyBsaXN0IG9mIGNvbHVtbiBuYW1lcywgYW5kIG1peGVkIGNhc2UgU0VMRUNUIGtleXdvcmQNCiAgICAgICAgU2VsZWN0IEFBLEJCLENDIGZyb20gU3lzLmR1YWwNCg0KICAgICAgICAjIG11bHRpcGxlIHRhYmxlcw0KICAgICAgICBTZWxlY3QgQSwgQiwgQyBmcm9tIFN5cy5kdWFsLCBUYWJsZTINCg0KICAgICAgICAjIGludmFsaWQgU0VMRUNUIGtleXdvcmQgLSBzaG91bGQgZmFpbA0KICAgICAgICBYZWxlY3QgQSwgQiwgQyBmcm9tIFN5cy5kdWFsDQoNCiAgICAgICAgIyBpbmNvbXBsZXRlIGNvbW1hbmQgLSBzaG91bGQgZmFpbA0KICAgICAgICBTZWxlY3QNCg0KICAgICAgICAjIGludmFsaWQgY29sdW1uIG5hbWUgLSBzaG91bGQgZmFpbA0KICAgICAgICBTZWxlY3QgXl5eIGZyb3ggU3lzLmR1YWwNCg0KICAgICAgICAiIiIpDQoNCiAgICBweXBhcnNpbmdfY29tbW9uLm51bWJlci5ydW5UZXN0cygiIiINCiAgICAgICAgMTAwDQogICAgICAgIC0xMDANCiAgICAgICAgKzEwMA0KICAgICAgICAzLjE0MTU5DQogICAgICAgIDYuMDJlMjMNCiAgICAgICAgMWUtMTINCiAgICAgICAgIiIiKQ0KDQogICAgIyBhbnkgaW50IG9yIHJlYWwgbnVtYmVyLCByZXR1cm5lZCBhcyBmbG9hdA0KICAgIHB5cGFyc2luZ19jb21tb24uZm51bWJlci5ydW5UZXN0cygiIiINCiAgICAgICAgMTAwDQogICAgICAgIC0xMDANCiAgICAgICAgKzEwMA0KICAgICAgICAzLjE0MTU5DQogICAgICAgIDYuMDJlMjMNCiAgICAgICAgMWUtMTINCiAgICAgICAgIiIiKQ0KDQogICAgcHlwYXJzaW5nX2NvbW1vbi5oZXhfaW50ZWdlci5ydW5UZXN0cygiIiINCiAgICAgICAgMTAwDQogICAgICAgIEZGDQogICAgICAgICIiIikNCg0KICAgIGltcG9ydCB1dWlkDQogICAgcHlwYXJzaW5nX2NvbW1vbi51dWlkLnNldFBhcnNlQWN0aW9uKHRva2VuTWFwKHV1aWQuVVVJRCkpDQogICAgcHlwYXJzaW5nX2NvbW1vbi51dWlkLnJ1blRlc3RzKCIiIg0KICAgICAgICAxMjM0NTY3OC0xMjM0LTU2NzgtMTIzNC01Njc4MTIzNDU2NzgNCiAgICAgICAgIiIiKQ0KUEsDBBQAAAAAAAAAIQCZWE1aknUAAJJ1AAA0AAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3NpeC5weSIiIlV0aWxpdGllcyBmb3Igd3JpdGluZyBjb2RlIHRoYXQgcnVucyBvbiBQeXRob24gMiBhbmQgMyIiIgoKIyBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxNSBCZW5qYW1pbiBQZXRlcnNvbgojCiMgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQojIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCiMgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwojIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKIyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKIyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgojCiMgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCiMgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KIwojIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCiMgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCiMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCiMgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgojIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCiMgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKIyBTT0ZUV0FSRS4KCmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgZnVuY3Rvb2xzCmltcG9ydCBpdGVydG9vbHMKaW1wb3J0IG9wZXJhdG9yCmltcG9ydCBzeXMKaW1wb3J0IHR5cGVzCgpfX2F1dGhvcl9fID0gIkJlbmphbWluIFBldGVyc29uIDxiZW5qYW1pbkBweXRob24ub3JnPiIKX192ZXJzaW9uX18gPSAiMS4xMC4wIgoKCiMgVXNlZnVsIGZvciB2ZXJ5IGNvYXJzZSB2ZXJzaW9uIGRpZmZlcmVudGlhdGlvbi4KUFkyID0gc3lzLnZlcnNpb25faW5mb1swXSA9PSAyClBZMyA9IHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMwpQWTM0ID0gc3lzLnZlcnNpb25faW5mb1swOjJdID49ICgzLCA0KQoKaWYgUFkzOgogICAgc3RyaW5nX3R5cGVzID0gc3RyLAogICAgaW50ZWdlcl90eXBlcyA9IGludCwKICAgIGNsYXNzX3R5cGVzID0gdHlwZSwKICAgIHRleHRfdHlwZSA9IHN0cgogICAgYmluYXJ5X3R5cGUgPSBieXRlcwoKICAgIE1BWFNJWkUgPSBzeXMubWF4c2l6ZQplbHNlOgogICAgc3RyaW5nX3R5cGVzID0gYmFzZXN0cmluZywKICAgIGludGVnZXJfdHlwZXMgPSAoaW50LCBsb25nKQogICAgY2xhc3NfdHlwZXMgPSAodHlwZSwgdHlwZXMuQ2xhc3NUeXBlKQogICAgdGV4dF90eXBlID0gdW5pY29kZQogICAgYmluYXJ5X3R5cGUgPSBzdHIKCiAgICBpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgiamF2YSIpOgogICAgICAgICMgSnl0aG9uIGFsd2F5cyB1c2VzIDMyIGJpdHMuCiAgICAgICAgTUFYU0laRSA9IGludCgoMSA8PCAzMSkgLSAxKQogICAgZWxzZToKICAgICAgICAjIEl0J3MgcG9zc2libGUgdG8gaGF2ZSBzaXplb2YobG9uZykgIT0gc2l6ZW9mKFB5X3NzaXplX3QpLgogICAgICAgIGNsYXNzIFgob2JqZWN0KToKCiAgICAgICAgICAgIGRlZiBfX2xlbl9fKHNlbGYpOgogICAgICAgICAgICAgICAgcmV0dXJuIDEgPDwgMzEKICAgICAgICB0cnk6CiAgICAgICAgICAgIGxlbihYKCkpCiAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CiAgICAgICAgICAgICMgMzItYml0CiAgICAgICAgICAgIE1BWFNJWkUgPSBpbnQoKDEgPDwgMzEpIC0gMSkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIDY0LWJpdAogICAgICAgICAgICBNQVhTSVpFID0gaW50KCgxIDw8IDYzKSAtIDEpCiAgICAgICAgZGVsIFgKCgpkZWYgX2FkZF9kb2MoZnVuYywgZG9jKToKICAgICIiIkFkZCBkb2N1bWVudGF0aW9uIHRvIGEgZnVuY3Rpb24uIiIiCiAgICBmdW5jLl9fZG9jX18gPSBkb2MKCgpkZWYgX2ltcG9ydF9tb2R1bGUobmFtZSk6CiAgICAiIiJJbXBvcnQgbW9kdWxlLCByZXR1cm5pbmcgdGhlIG1vZHVsZSBhZnRlciB0aGUgbGFzdCBkb3QuIiIiCiAgICBfX2ltcG9ydF9fKG5hbWUpCiAgICByZXR1cm4gc3lzLm1vZHVsZXNbbmFtZV0KCgpjbGFzcyBfTGF6eURlc2NyKG9iamVjdCk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUpOgogICAgICAgIHNlbGYubmFtZSA9IG5hbWUKCiAgICBkZWYgX19nZXRfXyhzZWxmLCBvYmosIHRwKToKICAgICAgICByZXN1bHQgPSBzZWxmLl9yZXNvbHZlKCkKICAgICAgICBzZXRhdHRyKG9iaiwgc2VsZi5uYW1lLCByZXN1bHQpICAjIEludm9rZXMgX19zZXRfXy4KICAgICAgICB0cnk6CiAgICAgICAgICAgICMgVGhpcyBpcyBhIGJpdCB1Z2x5LCBidXQgaXQgYXZvaWRzIHJ1bm5pbmcgdGhpcyBhZ2FpbiBieQogICAgICAgICAgICAjIHJlbW92aW5nIHRoaXMgZGVzY3JpcHRvci4KICAgICAgICAgICAgZGVsYXR0cihvYmouX19jbGFzc19fLCBzZWxmLm5hbWUpCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICBwYXNzCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKCmNsYXNzIE1vdmVkTW9kdWxlKF9MYXp5RGVzY3IpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBvbGQsIG5ldz1Ob25lKToKICAgICAgICBzdXBlcihNb3ZlZE1vZHVsZSwgc2VsZikuX19pbml0X18obmFtZSkKICAgICAgICBpZiBQWTM6CiAgICAgICAgICAgIGlmIG5ldyBpcyBOb25lOgogICAgICAgICAgICAgICAgbmV3ID0gbmFtZQogICAgICAgICAgICBzZWxmLm1vZCA9IG5ldwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYubW9kID0gb2xkCgogICAgZGVmIF9yZXNvbHZlKHNlbGYpOgogICAgICAgIHJldHVybiBfaW1wb3J0X21vZHVsZShzZWxmLm1vZCkKCiAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgYXR0cik6CiAgICAgICAgX21vZHVsZSA9IHNlbGYuX3Jlc29sdmUoKQogICAgICAgIHZhbHVlID0gZ2V0YXR0cihfbW9kdWxlLCBhdHRyKQogICAgICAgIHNldGF0dHIoc2VsZiwgYXR0ciwgdmFsdWUpCiAgICAgICAgcmV0dXJuIHZhbHVlCgoKY2xhc3MgX0xhenlNb2R1bGUodHlwZXMuTW9kdWxlVHlwZSk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUpOgogICAgICAgIHN1cGVyKF9MYXp5TW9kdWxlLCBzZWxmKS5fX2luaXRfXyhuYW1lKQogICAgICAgIHNlbGYuX19kb2NfXyA9IHNlbGYuX19jbGFzc19fLl9fZG9jX18KCiAgICBkZWYgX19kaXJfXyhzZWxmKToKICAgICAgICBhdHRycyA9IFsiX19kb2NfXyIsICJfX25hbWVfXyJdCiAgICAgICAgYXR0cnMgKz0gW2F0dHIubmFtZSBmb3IgYXR0ciBpbiBzZWxmLl9tb3ZlZF9hdHRyaWJ1dGVzXQogICAgICAgIHJldHVybiBhdHRycwoKICAgICMgU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcwogICAgX21vdmVkX2F0dHJpYnV0ZXMgPSBbXQoKCmNsYXNzIE1vdmVkQXR0cmlidXRlKF9MYXp5RGVzY3IpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBvbGRfbW9kLCBuZXdfbW9kLCBvbGRfYXR0cj1Ob25lLCBuZXdfYXR0cj1Ob25lKToKICAgICAgICBzdXBlcihNb3ZlZEF0dHJpYnV0ZSwgc2VsZikuX19pbml0X18obmFtZSkKICAgICAgICBpZiBQWTM6CiAgICAgICAgICAgIGlmIG5ld19tb2QgaXMgTm9uZToKICAgICAgICAgICAgICAgIG5ld19tb2QgPSBuYW1lCiAgICAgICAgICAgIHNlbGYubW9kID0gbmV3X21vZAogICAgICAgICAgICBpZiBuZXdfYXR0ciBpcyBOb25lOgogICAgICAgICAgICAgICAgaWYgb2xkX2F0dHIgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICBuZXdfYXR0ciA9IG5hbWUKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgbmV3X2F0dHIgPSBvbGRfYXR0cgogICAgICAgICAgICBzZWxmLmF0dHIgPSBuZXdfYXR0cgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYubW9kID0gb2xkX21vZAogICAgICAgICAgICBpZiBvbGRfYXR0ciBpcyBOb25lOgogICAgICAgICAgICAgICAgb2xkX2F0dHIgPSBuYW1lCiAgICAgICAgICAgIHNlbGYuYXR0ciA9IG9sZF9hdHRyCgogICAgZGVmIF9yZXNvbHZlKHNlbGYpOgogICAgICAgIG1vZHVsZSA9IF9pbXBvcnRfbW9kdWxlKHNlbGYubW9kKQogICAgICAgIHJldHVybiBnZXRhdHRyKG1vZHVsZSwgc2VsZi5hdHRyKQoKCmNsYXNzIF9TaXhNZXRhUGF0aEltcG9ydGVyKG9iamVjdCk6CgogICAgIiIiCiAgICBBIG1ldGEgcGF0aCBpbXBvcnRlciB0byBpbXBvcnQgc2l4Lm1vdmVzIGFuZCBpdHMgc3VibW9kdWxlcy4KCiAgICBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBQRVAzMDIgZmluZGVyIGFuZCBsb2FkZXIuIEl0IHNob3VsZCBiZSBjb21wYXRpYmxlCiAgICB3aXRoIFB5dGhvbiAyLjUgYW5kIGFsbCBleGlzdGluZyB2ZXJzaW9ucyBvZiBQeXRob24zCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgc2l4X21vZHVsZV9uYW1lKToKICAgICAgICBzZWxmLm5hbWUgPSBzaXhfbW9kdWxlX25hbWUKICAgICAgICBzZWxmLmtub3duX21vZHVsZXMgPSB7fQoKICAgIGRlZiBfYWRkX21vZHVsZShzZWxmLCBtb2QsICpmdWxsbmFtZXMpOgogICAgICAgIGZvciBmdWxsbmFtZSBpbiBmdWxsbmFtZXM6CiAgICAgICAgICAgIHNlbGYua25vd25fbW9kdWxlc1tzZWxmLm5hbWUgKyAiLiIgKyBmdWxsbmFtZV0gPSBtb2QKCiAgICBkZWYgX2dldF9tb2R1bGUoc2VsZiwgZnVsbG5hbWUpOgogICAgICAgIHJldHVybiBzZWxmLmtub3duX21vZHVsZXNbc2VsZi5uYW1lICsgIi4iICsgZnVsbG5hbWVdCgogICAgZGVmIGZpbmRfbW9kdWxlKHNlbGYsIGZ1bGxuYW1lLCBwYXRoPU5vbmUpOgogICAgICAgIGlmIGZ1bGxuYW1lIGluIHNlbGYua25vd25fbW9kdWxlczoKICAgICAgICAgICAgcmV0dXJuIHNlbGYKICAgICAgICByZXR1cm4gTm9uZQoKICAgIGRlZiBfX2dldF9tb2R1bGUoc2VsZiwgZnVsbG5hbWUpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYua25vd25fbW9kdWxlc1tmdWxsbmFtZV0KICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCJUaGlzIGxvYWRlciBkb2VzIG5vdCBrbm93IG1vZHVsZSAiICsgZnVsbG5hbWUpCgogICAgZGVmIGxvYWRfbW9kdWxlKHNlbGYsIGZ1bGxuYW1lKToKICAgICAgICB0cnk6CiAgICAgICAgICAgICMgaW4gY2FzZSBvZiBhIHJlbG9hZAogICAgICAgICAgICByZXR1cm4gc3lzLm1vZHVsZXNbZnVsbG5hbWVdCiAgICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgICBwYXNzCiAgICAgICAgbW9kID0gc2VsZi5fX2dldF9tb2R1bGUoZnVsbG5hbWUpCiAgICAgICAgaWYgaXNpbnN0YW5jZShtb2QsIE1vdmVkTW9kdWxlKToKICAgICAgICAgICAgbW9kID0gbW9kLl9yZXNvbHZlKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBtb2QuX19sb2FkZXJfXyA9IHNlbGYKICAgICAgICBzeXMubW9kdWxlc1tmdWxsbmFtZV0gPSBtb2QKICAgICAgICByZXR1cm4gbW9kCgogICAgZGVmIGlzX3BhY2thZ2Uoc2VsZiwgZnVsbG5hbWUpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiB0cnVlLCBpZiB0aGUgbmFtZWQgbW9kdWxlIGlzIGEgcGFja2FnZS4KCiAgICAgICAgV2UgbmVlZCB0aGlzIG1ldGhvZCB0byBnZXQgY29ycmVjdCBzcGVjIG9iamVjdHMgd2l0aAogICAgICAgIFB5dGhvbiAzLjQgKHNlZSBQRVA0NTEpCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGhhc2F0dHIoc2VsZi5fX2dldF9tb2R1bGUoZnVsbG5hbWUpLCAiX19wYXRoX18iKQoKICAgIGRlZiBnZXRfY29kZShzZWxmLCBmdWxsbmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIE5vbmUKCiAgICAgICAgUmVxdWlyZWQsIGlmIGlzX3BhY2thZ2UgaXMgaW1wbGVtZW50ZWQiIiIKICAgICAgICBzZWxmLl9fZ2V0X21vZHVsZShmdWxsbmFtZSkgICMgZXZlbnR1YWxseSByYWlzZXMgSW1wb3J0RXJyb3IKICAgICAgICByZXR1cm4gTm9uZQogICAgZ2V0X3NvdXJjZSA9IGdldF9jb2RlICAjIHNhbWUgYXMgZ2V0X2NvZGUKCl9pbXBvcnRlciA9IF9TaXhNZXRhUGF0aEltcG9ydGVyKF9fbmFtZV9fKQoKCmNsYXNzIF9Nb3ZlZEl0ZW1zKF9MYXp5TW9kdWxlKToKCiAgICAiIiJMYXp5IGxvYWRpbmcgb2YgbW92ZWQgb2JqZWN0cyIiIgogICAgX19wYXRoX18gPSBbXSAgIyBtYXJrIGFzIHBhY2thZ2UKCgpfbW92ZWRfYXR0cmlidXRlcyA9IFsKICAgIE1vdmVkQXR0cmlidXRlKCJjU3RyaW5nSU8iLCAiY1N0cmluZ0lPIiwgImlvIiwgIlN0cmluZ0lPIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiZmlsdGVyIiwgIml0ZXJ0b29scyIsICJidWlsdGlucyIsICJpZmlsdGVyIiwgImZpbHRlciIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImZpbHRlcmZhbHNlIiwgIml0ZXJ0b29scyIsICJpdGVydG9vbHMiLCAiaWZpbHRlcmZhbHNlIiwgImZpbHRlcmZhbHNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiaW5wdXQiLCAiX19idWlsdGluX18iLCAiYnVpbHRpbnMiLCAicmF3X2lucHV0IiwgImlucHV0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiaW50ZXJuIiwgIl9fYnVpbHRpbl9fIiwgInN5cyIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIm1hcCIsICJpdGVydG9vbHMiLCAiYnVpbHRpbnMiLCAiaW1hcCIsICJtYXAiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJnZXRjd2QiLCAib3MiLCAib3MiLCAiZ2V0Y3dkdSIsICJnZXRjd2QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJnZXRjd2RiIiwgIm9zIiwgIm9zIiwgImdldGN3ZCIsICJnZXRjd2RiIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicmFuZ2UiLCAiX19idWlsdGluX18iLCAiYnVpbHRpbnMiLCAieHJhbmdlIiwgInJhbmdlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicmVsb2FkX21vZHVsZSIsICJfX2J1aWx0aW5fXyIsICJpbXBvcnRsaWIiIGlmIFBZMzQgZWxzZSAiaW1wIiwgInJlbG9hZCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInJlZHVjZSIsICJfX2J1aWx0aW5fXyIsICJmdW5jdG9vbHMiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJzaGxleF9xdW90ZSIsICJwaXBlcyIsICJzaGxleCIsICJxdW90ZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlN0cmluZ0lPIiwgIlN0cmluZ0lPIiwgImlvIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiVXNlckRpY3QiLCAiVXNlckRpY3QiLCAiY29sbGVjdGlvbnMiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJVc2VyTGlzdCIsICJVc2VyTGlzdCIsICJjb2xsZWN0aW9ucyIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlVzZXJTdHJpbmciLCAiVXNlclN0cmluZyIsICJjb2xsZWN0aW9ucyIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInhyYW5nZSIsICJfX2J1aWx0aW5fXyIsICJidWlsdGlucyIsICJ4cmFuZ2UiLCAicmFuZ2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ6aXAiLCAiaXRlcnRvb2xzIiwgImJ1aWx0aW5zIiwgIml6aXAiLCAiemlwIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiemlwX2xvbmdlc3QiLCAiaXRlcnRvb2xzIiwgIml0ZXJ0b29scyIsICJpemlwX2xvbmdlc3QiLCAiemlwX2xvbmdlc3QiKSwKICAgIE1vdmVkTW9kdWxlKCJidWlsdGlucyIsICJfX2J1aWx0aW5fXyIpLAogICAgTW92ZWRNb2R1bGUoImNvbmZpZ3BhcnNlciIsICJDb25maWdQYXJzZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJjb3B5cmVnIiwgImNvcHlfcmVnIiksCiAgICBNb3ZlZE1vZHVsZSgiZGJtX2dudSIsICJnZGJtIiwgImRibS5nbnUiKSwKICAgIE1vdmVkTW9kdWxlKCJfZHVtbXlfdGhyZWFkIiwgImR1bW15X3RocmVhZCIsICJfZHVtbXlfdGhyZWFkIiksCiAgICBNb3ZlZE1vZHVsZSgiaHR0cF9jb29raWVqYXIiLCAiY29va2llbGliIiwgImh0dHAuY29va2llamFyIiksCiAgICBNb3ZlZE1vZHVsZSgiaHR0cF9jb29raWVzIiwgIkNvb2tpZSIsICJodHRwLmNvb2tpZXMiKSwKICAgIE1vdmVkTW9kdWxlKCJodG1sX2VudGl0aWVzIiwgImh0bWxlbnRpdHlkZWZzIiwgImh0bWwuZW50aXRpZXMiKSwKICAgIE1vdmVkTW9kdWxlKCJodG1sX3BhcnNlciIsICJIVE1MUGFyc2VyIiwgImh0bWwucGFyc2VyIiksCiAgICBNb3ZlZE1vZHVsZSgiaHR0cF9jbGllbnQiLCAiaHR0cGxpYiIsICJodHRwLmNsaWVudCIpLAogICAgTW92ZWRNb2R1bGUoImVtYWlsX21pbWVfbXVsdGlwYXJ0IiwgImVtYWlsLk1JTUVNdWx0aXBhcnQiLCAiZW1haWwubWltZS5tdWx0aXBhcnQiKSwKICAgIE1vdmVkTW9kdWxlKCJlbWFpbF9taW1lX25vbm11bHRpcGFydCIsICJlbWFpbC5NSU1FTm9uTXVsdGlwYXJ0IiwgImVtYWlsLm1pbWUubm9ubXVsdGlwYXJ0IiksCiAgICBNb3ZlZE1vZHVsZSgiZW1haWxfbWltZV90ZXh0IiwgImVtYWlsLk1JTUVUZXh0IiwgImVtYWlsLm1pbWUudGV4dCIpLAogICAgTW92ZWRNb2R1bGUoImVtYWlsX21pbWVfYmFzZSIsICJlbWFpbC5NSU1FQmFzZSIsICJlbWFpbC5taW1lLmJhc2UiKSwKICAgIE1vdmVkTW9kdWxlKCJCYXNlSFRUUFNlcnZlciIsICJCYXNlSFRUUFNlcnZlciIsICJodHRwLnNlcnZlciIpLAogICAgTW92ZWRNb2R1bGUoIkNHSUhUVFBTZXJ2ZXIiLCAiQ0dJSFRUUFNlcnZlciIsICJodHRwLnNlcnZlciIpLAogICAgTW92ZWRNb2R1bGUoIlNpbXBsZUhUVFBTZXJ2ZXIiLCAiU2ltcGxlSFRUUFNlcnZlciIsICJodHRwLnNlcnZlciIpLAogICAgTW92ZWRNb2R1bGUoImNQaWNrbGUiLCAiY1BpY2tsZSIsICJwaWNrbGUiKSwKICAgIE1vdmVkTW9kdWxlKCJxdWV1ZSIsICJRdWV1ZSIpLAogICAgTW92ZWRNb2R1bGUoInJlcHJsaWIiLCAicmVwciIpLAogICAgTW92ZWRNb2R1bGUoInNvY2tldHNlcnZlciIsICJTb2NrZXRTZXJ2ZXIiKSwKICAgIE1vdmVkTW9kdWxlKCJfdGhyZWFkIiwgInRocmVhZCIsICJfdGhyZWFkIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlciIsICJUa2ludGVyIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9kaWFsb2ciLCAiRGlhbG9nIiwgInRraW50ZXIuZGlhbG9nIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9maWxlZGlhbG9nIiwgIkZpbGVEaWFsb2ciLCAidGtpbnRlci5maWxlZGlhbG9nIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9zY3JvbGxlZHRleHQiLCAiU2Nyb2xsZWRUZXh0IiwgInRraW50ZXIuc2Nyb2xsZWR0ZXh0IiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9zaW1wbGVkaWFsb2ciLCAiU2ltcGxlRGlhbG9nIiwgInRraW50ZXIuc2ltcGxlZGlhbG9nIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl90aXgiLCAiVGl4IiwgInRraW50ZXIudGl4IiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl90dGsiLCAidHRrIiwgInRraW50ZXIudHRrIiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl9jb25zdGFudHMiLCAiVGtjb25zdGFudHMiLCAidGtpbnRlci5jb25zdGFudHMiKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX2RuZCIsICJUa2RuZCIsICJ0a2ludGVyLmRuZCIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfY29sb3JjaG9vc2VyIiwgInRrQ29sb3JDaG9vc2VyIiwKICAgICAgICAgICAgICAgICJ0a2ludGVyLmNvbG9yY2hvb3NlciIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfY29tbW9uZGlhbG9nIiwgInRrQ29tbW9uRGlhbG9nIiwKICAgICAgICAgICAgICAgICJ0a2ludGVyLmNvbW1vbmRpYWxvZyIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfdGtmaWxlZGlhbG9nIiwgInRrRmlsZURpYWxvZyIsICJ0a2ludGVyLmZpbGVkaWFsb2ciKSwKICAgIE1vdmVkTW9kdWxlKCJ0a2ludGVyX2ZvbnQiLCAidGtGb250IiwgInRraW50ZXIuZm9udCIpLAogICAgTW92ZWRNb2R1bGUoInRraW50ZXJfbWVzc2FnZWJveCIsICJ0a01lc3NhZ2VCb3giLCAidGtpbnRlci5tZXNzYWdlYm94IiksCiAgICBNb3ZlZE1vZHVsZSgidGtpbnRlcl90a3NpbXBsZWRpYWxvZyIsICJ0a1NpbXBsZURpYWxvZyIsCiAgICAgICAgICAgICAgICAidGtpbnRlci5zaW1wbGVkaWFsb2ciKSwKICAgIE1vdmVkTW9kdWxlKCJ1cmxsaWJfcGFyc2UiLCBfX25hbWVfXyArICIubW92ZXMudXJsbGliX3BhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRNb2R1bGUoInVybGxpYl9lcnJvciIsIF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWJfZXJyb3IiLCAidXJsbGliLmVycm9yIiksCiAgICBNb3ZlZE1vZHVsZSgidXJsbGliIiwgX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYiIsIF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWIiKSwKICAgIE1vdmVkTW9kdWxlKCJ1cmxsaWJfcm9ib3RwYXJzZXIiLCAicm9ib3RwYXJzZXIiLCAidXJsbGliLnJvYm90cGFyc2VyIiksCiAgICBNb3ZlZE1vZHVsZSgieG1scnBjX2NsaWVudCIsICJ4bWxycGNsaWIiLCAieG1scnBjLmNsaWVudCIpLAogICAgTW92ZWRNb2R1bGUoInhtbHJwY19zZXJ2ZXIiLCAiU2ltcGxlWE1MUlBDU2VydmVyIiwgInhtbHJwYy5zZXJ2ZXIiKSwKXQojIEFkZCB3aW5kb3dzIHNwZWNpZmljIG1vZHVsZXMuCmlmIHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiOgogICAgX21vdmVkX2F0dHJpYnV0ZXMgKz0gWwogICAgICAgIE1vdmVkTW9kdWxlKCJ3aW5yZWciLCAiX3dpbnJlZyIpLAogICAgXQoKZm9yIGF0dHIgaW4gX21vdmVkX2F0dHJpYnV0ZXM6CiAgICBzZXRhdHRyKF9Nb3ZlZEl0ZW1zLCBhdHRyLm5hbWUsIGF0dHIpCiAgICBpZiBpc2luc3RhbmNlKGF0dHIsIE1vdmVkTW9kdWxlKToKICAgICAgICBfaW1wb3J0ZXIuX2FkZF9tb2R1bGUoYXR0ciwgIm1vdmVzLiIgKyBhdHRyLm5hbWUpCmRlbCBhdHRyCgpfTW92ZWRJdGVtcy5fbW92ZWRfYXR0cmlidXRlcyA9IF9tb3ZlZF9hdHRyaWJ1dGVzCgptb3ZlcyA9IF9Nb3ZlZEl0ZW1zKF9fbmFtZV9fICsgIi5tb3ZlcyIpCl9pbXBvcnRlci5fYWRkX21vZHVsZShtb3ZlcywgIm1vdmVzIikKCgpjbGFzcyBNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9wYXJzZShfTGF6eU1vZHVsZSk6CgogICAgIiIiTGF6eSBsb2FkaW5nIG9mIG1vdmVkIG9iamVjdHMgaW4gc2l4Lm1vdmVzLnVybGxpYl9wYXJzZSIiIgoKCl91cmxsaWJfcGFyc2VfbW92ZWRfYXR0cmlidXRlcyA9IFsKICAgIE1vdmVkQXR0cmlidXRlKCJQYXJzZVJlc3VsdCIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJTcGxpdFJlc3VsdCIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJwYXJzZV9xcyIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJwYXJzZV9xc2wiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsZGVmcmFnIiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybGpvaW4iLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJscGFyc2UiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsc3BsaXQiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsdW5wYXJzZSIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1cmx1bnNwbGl0IiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInF1b3RlIiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJxdW90ZV9wbHVzIiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1bnF1b3RlIiwgInVybGxpYiIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1bnF1b3RlX3BsdXMiLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybGVuY29kZSIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgic3BsaXRxdWVyeSIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgic3BsaXR0YWciLCAidXJsbGliIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInNwbGl0dXNlciIsICJ1cmxsaWIiLCAidXJsbGliLnBhcnNlIiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXNlc19mcmFnbWVudCIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1c2VzX25ldGxvYyIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1c2VzX3BhcmFtcyIsICJ1cmxwYXJzZSIsICJ1cmxsaWIucGFyc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJ1c2VzX3F1ZXJ5IiwgInVybHBhcnNlIiwgInVybGxpYi5wYXJzZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVzZXNfcmVsYXRpdmUiLCAidXJscGFyc2UiLCAidXJsbGliLnBhcnNlIiksCl0KZm9yIGF0dHIgaW4gX3VybGxpYl9wYXJzZV9tb3ZlZF9hdHRyaWJ1dGVzOgogICAgc2V0YXR0cihNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9wYXJzZSwgYXR0ci5uYW1lLCBhdHRyKQpkZWwgYXR0cgoKTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcGFyc2UuX21vdmVkX2F0dHJpYnV0ZXMgPSBfdXJsbGliX3BhcnNlX21vdmVkX2F0dHJpYnV0ZXMKCl9pbXBvcnRlci5fYWRkX21vZHVsZShNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9wYXJzZShfX25hbWVfXyArICIubW92ZXMudXJsbGliX3BhcnNlIiksCiAgICAgICAgICAgICAgICAgICAgICAibW92ZXMudXJsbGliX3BhcnNlIiwgIm1vdmVzLnVybGxpYi5wYXJzZSIpCgoKY2xhc3MgTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfZXJyb3IoX0xhenlNb2R1bGUpOgoKICAgICIiIkxhenkgbG9hZGluZyBvZiBtb3ZlZCBvYmplY3RzIGluIHNpeC5tb3Zlcy51cmxsaWJfZXJyb3IiIiIKCgpfdXJsbGliX2Vycm9yX21vdmVkX2F0dHJpYnV0ZXMgPSBbCiAgICBNb3ZlZEF0dHJpYnV0ZSgiVVJMRXJyb3IiLCAidXJsbGliMiIsICJ1cmxsaWIuZXJyb3IiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQRXJyb3IiLCAidXJsbGliMiIsICJ1cmxsaWIuZXJyb3IiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJDb250ZW50VG9vU2hvcnRFcnJvciIsICJ1cmxsaWIiLCAidXJsbGliLmVycm9yIiksCl0KZm9yIGF0dHIgaW4gX3VybGxpYl9lcnJvcl9tb3ZlZF9hdHRyaWJ1dGVzOgogICAgc2V0YXR0cihNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9lcnJvciwgYXR0ci5uYW1lLCBhdHRyKQpkZWwgYXR0cgoKTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfZXJyb3IuX21vdmVkX2F0dHJpYnV0ZXMgPSBfdXJsbGliX2Vycm9yX21vdmVkX2F0dHJpYnV0ZXMKCl9pbXBvcnRlci5fYWRkX21vZHVsZShNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9lcnJvcihfX25hbWVfXyArICIubW92ZXMudXJsbGliLmVycm9yIiksCiAgICAgICAgICAgICAgICAgICAgICAibW92ZXMudXJsbGliX2Vycm9yIiwgIm1vdmVzLnVybGxpYi5lcnJvciIpCgoKY2xhc3MgTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcmVxdWVzdChfTGF6eU1vZHVsZSk6CgogICAgIiIiTGF6eSBsb2FkaW5nIG9mIG1vdmVkIG9iamVjdHMgaW4gc2l4Lm1vdmVzLnVybGxpYl9yZXF1ZXN0IiIiCgoKX3VybGxpYl9yZXF1ZXN0X21vdmVkX2F0dHJpYnV0ZXMgPSBbCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsb3BlbiIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiaW5zdGFsbF9vcGVuZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImJ1aWxkX29wZW5lciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicGF0aG5hbWUydXJsIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoInVybDJwYXRobmFtZSIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJnZXRwcm94aWVzIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIlJlcXVlc3QiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIk9wZW5lckRpcmVjdG9yIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQRGVmYXVsdEVycm9ySGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUFJlZGlyZWN0SGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUENvb2tpZVByb2Nlc3NvciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiUHJveHlIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJCYXNlSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUFBhc3N3b3JkTWdyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJIVFRQUGFzc3dvcmRNZ3JXaXRoRGVmYXVsdFJlYWxtIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJBYnN0cmFjdEJhc2ljQXV0aEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBCYXNpY0F1dGhIYW5kbGVyIiwgInVybGxpYjIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJQcm94eUJhc2ljQXV0aEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkFic3RyYWN0RGlnZXN0QXV0aEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBEaWdlc3RBdXRoSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiUHJveHlEaWdlc3RBdXRoSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiSFRUUEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBTSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiRmlsZUhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkZUUEhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkNhY2hlRlRQSGFuZGxlciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiVW5rbm93bkhhbmRsZXIiLCAidXJsbGliMiIsICJ1cmxsaWIucmVxdWVzdCIpLAogICAgTW92ZWRBdHRyaWJ1dGUoIkhUVFBFcnJvclByb2Nlc3NvciIsICJ1cmxsaWIyIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJscmV0cmlldmUiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgidXJsY2xlYW51cCIsICJ1cmxsaWIiLCAidXJsbGliLnJlcXVlc3QiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJVUkxvcGVuZXIiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgiRmFuY3lVUkxvcGVuZXIiLCAidXJsbGliIiwgInVybGxpYi5yZXF1ZXN0IiksCiAgICBNb3ZlZEF0dHJpYnV0ZSgicHJveHlfYnlwYXNzIiwgInVybGxpYiIsICJ1cmxsaWIucmVxdWVzdCIpLApdCmZvciBhdHRyIGluIF91cmxsaWJfcmVxdWVzdF9tb3ZlZF9hdHRyaWJ1dGVzOgogICAgc2V0YXR0cihNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXF1ZXN0LCBhdHRyLm5hbWUsIGF0dHIpCmRlbCBhdHRyCgpNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXF1ZXN0Ll9tb3ZlZF9hdHRyaWJ1dGVzID0gX3VybGxpYl9yZXF1ZXN0X21vdmVkX2F0dHJpYnV0ZXMKCl9pbXBvcnRlci5fYWRkX21vZHVsZShNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXF1ZXN0KF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWIucmVxdWVzdCIpLAogICAgICAgICAgICAgICAgICAgICAgIm1vdmVzLnVybGxpYl9yZXF1ZXN0IiwgIm1vdmVzLnVybGxpYi5yZXF1ZXN0IikKCgpjbGFzcyBNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yZXNwb25zZShfTGF6eU1vZHVsZSk6CgogICAgIiIiTGF6eSBsb2FkaW5nIG9mIG1vdmVkIG9iamVjdHMgaW4gc2l4Lm1vdmVzLnVybGxpYl9yZXNwb25zZSIiIgoKCl91cmxsaWJfcmVzcG9uc2VfbW92ZWRfYXR0cmlidXRlcyA9IFsKICAgIE1vdmVkQXR0cmlidXRlKCJhZGRiYXNlIiwgInVybGxpYiIsICJ1cmxsaWIucmVzcG9uc2UiKSwKICAgIE1vdmVkQXR0cmlidXRlKCJhZGRjbG9zZWhvb2siLCAidXJsbGliIiwgInVybGxpYi5yZXNwb25zZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImFkZGluZm8iLCAidXJsbGliIiwgInVybGxpYi5yZXNwb25zZSIpLAogICAgTW92ZWRBdHRyaWJ1dGUoImFkZGluZm91cmwiLCAidXJsbGliIiwgInVybGxpYi5yZXNwb25zZSIpLApdCmZvciBhdHRyIGluIF91cmxsaWJfcmVzcG9uc2VfbW92ZWRfYXR0cmlidXRlczoKICAgIHNldGF0dHIoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcmVzcG9uc2UsIGF0dHIubmFtZSwgYXR0cikKZGVsIGF0dHIKCk1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3Jlc3BvbnNlLl9tb3ZlZF9hdHRyaWJ1dGVzID0gX3VybGxpYl9yZXNwb25zZV9tb3ZlZF9hdHRyaWJ1dGVzCgpfaW1wb3J0ZXIuX2FkZF9tb2R1bGUoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWJfcmVzcG9uc2UoX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYi5yZXNwb25zZSIpLAogICAgICAgICAgICAgICAgICAgICAgIm1vdmVzLnVybGxpYl9yZXNwb25zZSIsICJtb3Zlcy51cmxsaWIucmVzcG9uc2UiKQoKCmNsYXNzIE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JvYm90cGFyc2VyKF9MYXp5TW9kdWxlKToKCiAgICAiIiJMYXp5IGxvYWRpbmcgb2YgbW92ZWQgb2JqZWN0cyBpbiBzaXgubW92ZXMudXJsbGliX3JvYm90cGFyc2VyIiIiCgoKX3VybGxpYl9yb2JvdHBhcnNlcl9tb3ZlZF9hdHRyaWJ1dGVzID0gWwogICAgTW92ZWRBdHRyaWJ1dGUoIlJvYm90RmlsZVBhcnNlciIsICJyb2JvdHBhcnNlciIsICJ1cmxsaWIucm9ib3RwYXJzZXIiKSwKXQpmb3IgYXR0ciBpbiBfdXJsbGliX3JvYm90cGFyc2VyX21vdmVkX2F0dHJpYnV0ZXM6CiAgICBzZXRhdHRyKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JvYm90cGFyc2VyLCBhdHRyLm5hbWUsIGF0dHIpCmRlbCBhdHRyCgpNb2R1bGVfc2l4X21vdmVzX3VybGxpYl9yb2JvdHBhcnNlci5fbW92ZWRfYXR0cmlidXRlcyA9IF91cmxsaWJfcm9ib3RwYXJzZXJfbW92ZWRfYXR0cmlidXRlcwoKX2ltcG9ydGVyLl9hZGRfbW9kdWxlKE1vZHVsZV9zaXhfbW92ZXNfdXJsbGliX3JvYm90cGFyc2VyKF9fbmFtZV9fICsgIi5tb3Zlcy51cmxsaWIucm9ib3RwYXJzZXIiKSwKICAgICAgICAgICAgICAgICAgICAgICJtb3Zlcy51cmxsaWJfcm9ib3RwYXJzZXIiLCAibW92ZXMudXJsbGliLnJvYm90cGFyc2VyIikKCgpjbGFzcyBNb2R1bGVfc2l4X21vdmVzX3VybGxpYih0eXBlcy5Nb2R1bGVUeXBlKToKCiAgICAiIiJDcmVhdGUgYSBzaXgubW92ZXMudXJsbGliIG5hbWVzcGFjZSB0aGF0IHJlc2VtYmxlcyB0aGUgUHl0aG9uIDMgbmFtZXNwYWNlIiIiCiAgICBfX3BhdGhfXyA9IFtdICAjIG1hcmsgYXMgcGFja2FnZQogICAgcGFyc2UgPSBfaW1wb3J0ZXIuX2dldF9tb2R1bGUoIm1vdmVzLnVybGxpYl9wYXJzZSIpCiAgICBlcnJvciA9IF9pbXBvcnRlci5fZ2V0X21vZHVsZSgibW92ZXMudXJsbGliX2Vycm9yIikKICAgIHJlcXVlc3QgPSBfaW1wb3J0ZXIuX2dldF9tb2R1bGUoIm1vdmVzLnVybGxpYl9yZXF1ZXN0IikKICAgIHJlc3BvbnNlID0gX2ltcG9ydGVyLl9nZXRfbW9kdWxlKCJtb3Zlcy51cmxsaWJfcmVzcG9uc2UiKQogICAgcm9ib3RwYXJzZXIgPSBfaW1wb3J0ZXIuX2dldF9tb2R1bGUoIm1vdmVzLnVybGxpYl9yb2JvdHBhcnNlciIpCgogICAgZGVmIF9fZGlyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIFsncGFyc2UnLCAnZXJyb3InLCAncmVxdWVzdCcsICdyZXNwb25zZScsICdyb2JvdHBhcnNlciddCgpfaW1wb3J0ZXIuX2FkZF9tb2R1bGUoTW9kdWxlX3NpeF9tb3Zlc191cmxsaWIoX19uYW1lX18gKyAiLm1vdmVzLnVybGxpYiIpLAogICAgICAgICAgICAgICAgICAgICAgIm1vdmVzLnVybGxpYiIpCgoKZGVmIGFkZF9tb3ZlKG1vdmUpOgogICAgIiIiQWRkIGFuIGl0ZW0gdG8gc2l4Lm1vdmVzLiIiIgogICAgc2V0YXR0cihfTW92ZWRJdGVtcywgbW92ZS5uYW1lLCBtb3ZlKQoKCmRlZiByZW1vdmVfbW92ZShuYW1lKToKICAgICIiIlJlbW92ZSBpdGVtIGZyb20gc2l4Lm1vdmVzLiIiIgogICAgdHJ5OgogICAgICAgIGRlbGF0dHIoX01vdmVkSXRlbXMsIG5hbWUpCiAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBkZWwgbW92ZXMuX19kaWN0X19bbmFtZV0KICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKCJubyBzdWNoIG1vdmUsICVyIiAlIChuYW1lLCkpCgoKaWYgUFkzOgogICAgX21ldGhfZnVuYyA9ICJfX2Z1bmNfXyIKICAgIF9tZXRoX3NlbGYgPSAiX19zZWxmX18iCgogICAgX2Z1bmNfY2xvc3VyZSA9ICJfX2Nsb3N1cmVfXyIKICAgIF9mdW5jX2NvZGUgPSAiX19jb2RlX18iCiAgICBfZnVuY19kZWZhdWx0cyA9ICJfX2RlZmF1bHRzX18iCiAgICBfZnVuY19nbG9iYWxzID0gIl9fZ2xvYmFsc19fIgplbHNlOgogICAgX21ldGhfZnVuYyA9ICJpbV9mdW5jIgogICAgX21ldGhfc2VsZiA9ICJpbV9zZWxmIgoKICAgIF9mdW5jX2Nsb3N1cmUgPSAiZnVuY19jbG9zdXJlIgogICAgX2Z1bmNfY29kZSA9ICJmdW5jX2NvZGUiCiAgICBfZnVuY19kZWZhdWx0cyA9ICJmdW5jX2RlZmF1bHRzIgogICAgX2Z1bmNfZ2xvYmFscyA9ICJmdW5jX2dsb2JhbHMiCgoKdHJ5OgogICAgYWR2YW5jZV9pdGVyYXRvciA9IG5leHQKZXhjZXB0IE5hbWVFcnJvcjoKICAgIGRlZiBhZHZhbmNlX2l0ZXJhdG9yKGl0KToKICAgICAgICByZXR1cm4gaXQubmV4dCgpCm5leHQgPSBhZHZhbmNlX2l0ZXJhdG9yCgoKdHJ5OgogICAgY2FsbGFibGUgPSBjYWxsYWJsZQpleGNlcHQgTmFtZUVycm9yOgogICAgZGVmIGNhbGxhYmxlKG9iaik6CiAgICAgICAgcmV0dXJuIGFueSgiX19jYWxsX18iIGluIGtsYXNzLl9fZGljdF9fIGZvciBrbGFzcyBpbiB0eXBlKG9iaikuX19tcm9fXykKCgppZiBQWTM6CiAgICBkZWYgZ2V0X3VuYm91bmRfZnVuY3Rpb24odW5ib3VuZCk6CiAgICAgICAgcmV0dXJuIHVuYm91bmQKCiAgICBjcmVhdGVfYm91bmRfbWV0aG9kID0gdHlwZXMuTWV0aG9kVHlwZQoKICAgIGRlZiBjcmVhdGVfdW5ib3VuZF9tZXRob2QoZnVuYywgY2xzKToKICAgICAgICByZXR1cm4gZnVuYwoKICAgIEl0ZXJhdG9yID0gb2JqZWN0CmVsc2U6CiAgICBkZWYgZ2V0X3VuYm91bmRfZnVuY3Rpb24odW5ib3VuZCk6CiAgICAgICAgcmV0dXJuIHVuYm91bmQuaW1fZnVuYwoKICAgIGRlZiBjcmVhdGVfYm91bmRfbWV0aG9kKGZ1bmMsIG9iaik6CiAgICAgICAgcmV0dXJuIHR5cGVzLk1ldGhvZFR5cGUoZnVuYywgb2JqLCBvYmouX19jbGFzc19fKQoKICAgIGRlZiBjcmVhdGVfdW5ib3VuZF9tZXRob2QoZnVuYywgY2xzKToKICAgICAgICByZXR1cm4gdHlwZXMuTWV0aG9kVHlwZShmdW5jLCBOb25lLCBjbHMpCgogICAgY2xhc3MgSXRlcmF0b3Iob2JqZWN0KToKCiAgICAgICAgZGVmIG5leHQoc2VsZik6CiAgICAgICAgICAgIHJldHVybiB0eXBlKHNlbGYpLl9fbmV4dF9fKHNlbGYpCgogICAgY2FsbGFibGUgPSBjYWxsYWJsZQpfYWRkX2RvYyhnZXRfdW5ib3VuZF9mdW5jdGlvbiwKICAgICAgICAgIiIiR2V0IHRoZSBmdW5jdGlvbiBvdXQgb2YgYSBwb3NzaWJseSB1bmJvdW5kIGZ1bmN0aW9uIiIiKQoKCmdldF9tZXRob2RfZnVuY3Rpb24gPSBvcGVyYXRvci5hdHRyZ2V0dGVyKF9tZXRoX2Z1bmMpCmdldF9tZXRob2Rfc2VsZiA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoX21ldGhfc2VsZikKZ2V0X2Z1bmN0aW9uX2Nsb3N1cmUgPSBvcGVyYXRvci5hdHRyZ2V0dGVyKF9mdW5jX2Nsb3N1cmUpCmdldF9mdW5jdGlvbl9jb2RlID0gb3BlcmF0b3IuYXR0cmdldHRlcihfZnVuY19jb2RlKQpnZXRfZnVuY3Rpb25fZGVmYXVsdHMgPSBvcGVyYXRvci5hdHRyZ2V0dGVyKF9mdW5jX2RlZmF1bHRzKQpnZXRfZnVuY3Rpb25fZ2xvYmFscyA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoX2Z1bmNfZ2xvYmFscykKCgppZiBQWTM6CiAgICBkZWYgaXRlcmtleXMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGl0ZXIoZC5rZXlzKCoqa3cpKQoKICAgIGRlZiBpdGVydmFsdWVzKGQsICoqa3cpOgogICAgICAgIHJldHVybiBpdGVyKGQudmFsdWVzKCoqa3cpKQoKICAgIGRlZiBpdGVyaXRlbXMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGl0ZXIoZC5pdGVtcygqKmt3KSkKCiAgICBkZWYgaXRlcmxpc3RzKGQsICoqa3cpOgogICAgICAgIHJldHVybiBpdGVyKGQubGlzdHMoKiprdykpCgogICAgdmlld2tleXMgPSBvcGVyYXRvci5tZXRob2RjYWxsZXIoImtleXMiKQoKICAgIHZpZXd2YWx1ZXMgPSBvcGVyYXRvci5tZXRob2RjYWxsZXIoInZhbHVlcyIpCgogICAgdmlld2l0ZW1zID0gb3BlcmF0b3IubWV0aG9kY2FsbGVyKCJpdGVtcyIpCmVsc2U6CiAgICBkZWYgaXRlcmtleXMoZCwgKiprdyk6CiAgICAgICAgcmV0dXJuIGQuaXRlcmtleXMoKiprdykKCiAgICBkZWYgaXRlcnZhbHVlcyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gZC5pdGVydmFsdWVzKCoqa3cpCgogICAgZGVmIGl0ZXJpdGVtcyhkLCAqKmt3KToKICAgICAgICByZXR1cm4gZC5pdGVyaXRlbXMoKiprdykKCiAgICBkZWYgaXRlcmxpc3RzKGQsICoqa3cpOgogICAgICAgIHJldHVybiBkLml0ZXJsaXN0cygqKmt3KQoKICAgIHZpZXdrZXlzID0gb3BlcmF0b3IubWV0aG9kY2FsbGVyKCJ2aWV3a2V5cyIpCgogICAgdmlld3ZhbHVlcyA9IG9wZXJhdG9yLm1ldGhvZGNhbGxlcigidmlld3ZhbHVlcyIpCgogICAgdmlld2l0ZW1zID0gb3BlcmF0b3IubWV0aG9kY2FsbGVyKCJ2aWV3aXRlbXMiKQoKX2FkZF9kb2MoaXRlcmtleXMsICJSZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUga2V5cyBvZiBhIGRpY3Rpb25hcnkuIikKX2FkZF9kb2MoaXRlcnZhbHVlcywgIlJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSB2YWx1ZXMgb2YgYSBkaWN0aW9uYXJ5LiIpCl9hZGRfZG9jKGl0ZXJpdGVtcywKICAgICAgICAgIlJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSAoa2V5LCB2YWx1ZSkgcGFpcnMgb2YgYSBkaWN0aW9uYXJ5LiIpCl9hZGRfZG9jKGl0ZXJsaXN0cywKICAgICAgICAgIlJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSAoa2V5LCBbdmFsdWVzXSkgcGFpcnMgb2YgYSBkaWN0aW9uYXJ5LiIpCgoKaWYgUFkzOgogICAgZGVmIGIocyk6CiAgICAgICAgcmV0dXJuIHMuZW5jb2RlKCJsYXRpbi0xIikKCiAgICBkZWYgdShzKToKICAgICAgICByZXR1cm4gcwogICAgdW5pY2hyID0gY2hyCiAgICBpbXBvcnQgc3RydWN0CiAgICBpbnQyYnl0ZSA9IHN0cnVjdC5TdHJ1Y3QoIj5CIikucGFjawogICAgZGVsIHN0cnVjdAogICAgYnl0ZTJpbnQgPSBvcGVyYXRvci5pdGVtZ2V0dGVyKDApCiAgICBpbmRleGJ5dGVzID0gb3BlcmF0b3IuZ2V0aXRlbQogICAgaXRlcmJ5dGVzID0gaXRlcgogICAgaW1wb3J0IGlvCiAgICBTdHJpbmdJTyA9IGlvLlN0cmluZ0lPCiAgICBCeXRlc0lPID0gaW8uQnl0ZXNJTwogICAgX2Fzc2VydENvdW50RXF1YWwgPSAiYXNzZXJ0Q291bnRFcXVhbCIKICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMV0gPD0gMToKICAgICAgICBfYXNzZXJ0UmFpc2VzUmVnZXggPSAiYXNzZXJ0UmFpc2VzUmVnZXhwIgogICAgICAgIF9hc3NlcnRSZWdleCA9ICJhc3NlcnRSZWdleHBNYXRjaGVzIgogICAgZWxzZToKICAgICAgICBfYXNzZXJ0UmFpc2VzUmVnZXggPSAiYXNzZXJ0UmFpc2VzUmVnZXgiCiAgICAgICAgX2Fzc2VydFJlZ2V4ID0gImFzc2VydFJlZ2V4IgplbHNlOgogICAgZGVmIGIocyk6CiAgICAgICAgcmV0dXJuIHMKICAgICMgV29ya2Fyb3VuZCBmb3Igc3RhbmRhbG9uZSBiYWNrc2xhc2gKCiAgICBkZWYgdShzKToKICAgICAgICByZXR1cm4gdW5pY29kZShzLnJlcGxhY2UocidcXCcsIHInXFxcXCcpLCAidW5pY29kZV9lc2NhcGUiKQogICAgdW5pY2hyID0gdW5pY2hyCiAgICBpbnQyYnl0ZSA9IGNocgoKICAgIGRlZiBieXRlMmludChicyk6CiAgICAgICAgcmV0dXJuIG9yZChic1swXSkKCiAgICBkZWYgaW5kZXhieXRlcyhidWYsIGkpOgogICAgICAgIHJldHVybiBvcmQoYnVmW2ldKQogICAgaXRlcmJ5dGVzID0gZnVuY3Rvb2xzLnBhcnRpYWwoaXRlcnRvb2xzLmltYXAsIG9yZCkKICAgIGltcG9ydCBTdHJpbmdJTwogICAgU3RyaW5nSU8gPSBCeXRlc0lPID0gU3RyaW5nSU8uU3RyaW5nSU8KICAgIF9hc3NlcnRDb3VudEVxdWFsID0gImFzc2VydEl0ZW1zRXF1YWwiCiAgICBfYXNzZXJ0UmFpc2VzUmVnZXggPSAiYXNzZXJ0UmFpc2VzUmVnZXhwIgogICAgX2Fzc2VydFJlZ2V4ID0gImFzc2VydFJlZ2V4cE1hdGNoZXMiCl9hZGRfZG9jKGIsICIiIkJ5dGUgbGl0ZXJhbCIiIikKX2FkZF9kb2ModSwgIiIiVGV4dCBsaXRlcmFsIiIiKQoKCmRlZiBhc3NlcnRDb3VudEVxdWFsKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICByZXR1cm4gZ2V0YXR0cihzZWxmLCBfYXNzZXJ0Q291bnRFcXVhbCkoKmFyZ3MsICoqa3dhcmdzKQoKCmRlZiBhc3NlcnRSYWlzZXNSZWdleChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgcmV0dXJuIGdldGF0dHIoc2VsZiwgX2Fzc2VydFJhaXNlc1JlZ2V4KSgqYXJncywgKiprd2FyZ3MpCgoKZGVmIGFzc2VydFJlZ2V4KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICByZXR1cm4gZ2V0YXR0cihzZWxmLCBfYXNzZXJ0UmVnZXgpKCphcmdzLCAqKmt3YXJncykKCgppZiBQWTM6CiAgICBleGVjXyA9IGdldGF0dHIobW92ZXMuYnVpbHRpbnMsICJleGVjIikKCiAgICBkZWYgcmVyYWlzZSh0cCwgdmFsdWUsIHRiPU5vbmUpOgogICAgICAgIGlmIHZhbHVlIGlzIE5vbmU6CiAgICAgICAgICAgIHZhbHVlID0gdHAoKQogICAgICAgIGlmIHZhbHVlLl9fdHJhY2ViYWNrX18gaXMgbm90IHRiOgogICAgICAgICAgICByYWlzZSB2YWx1ZS53aXRoX3RyYWNlYmFjayh0YikKICAgICAgICByYWlzZSB2YWx1ZQoKZWxzZToKICAgIGRlZiBleGVjXyhfY29kZV8sIF9nbG9ic189Tm9uZSwgX2xvY3NfPU5vbmUpOgogICAgICAgICIiIkV4ZWN1dGUgY29kZSBpbiBhIG5hbWVzcGFjZS4iIiIKICAgICAgICBpZiBfZ2xvYnNfIGlzIE5vbmU6CiAgICAgICAgICAgIGZyYW1lID0gc3lzLl9nZXRmcmFtZSgxKQogICAgICAgICAgICBfZ2xvYnNfID0gZnJhbWUuZl9nbG9iYWxzCiAgICAgICAgICAgIGlmIF9sb2NzXyBpcyBOb25lOgogICAgICAgICAgICAgICAgX2xvY3NfID0gZnJhbWUuZl9sb2NhbHMKICAgICAgICAgICAgZGVsIGZyYW1lCiAgICAgICAgZWxpZiBfbG9jc18gaXMgTm9uZToKICAgICAgICAgICAgX2xvY3NfID0gX2dsb2JzXwogICAgICAgIGV4ZWMoIiIiZXhlYyBfY29kZV8gaW4gX2dsb2JzXywgX2xvY3NfIiIiKQoKICAgIGV4ZWNfKCIiImRlZiByZXJhaXNlKHRwLCB2YWx1ZSwgdGI9Tm9uZSk6CiAgICByYWlzZSB0cCwgdmFsdWUsIHRiCiIiIikKCgppZiBzeXMudmVyc2lvbl9pbmZvWzoyXSA9PSAoMywgMik6CiAgICBleGVjXygiIiJkZWYgcmFpc2VfZnJvbSh2YWx1ZSwgZnJvbV92YWx1ZSk6CiAgICBpZiBmcm9tX3ZhbHVlIGlzIE5vbmU6CiAgICAgICAgcmFpc2UgdmFsdWUKICAgIHJhaXNlIHZhbHVlIGZyb20gZnJvbV92YWx1ZQoiIiIpCmVsaWYgc3lzLnZlcnNpb25faW5mb1s6Ml0gPiAoMywgMik6CiAgICBleGVjXygiIiJkZWYgcmFpc2VfZnJvbSh2YWx1ZSwgZnJvbV92YWx1ZSk6CiAgICByYWlzZSB2YWx1ZSBmcm9tIGZyb21fdmFsdWUKIiIiKQplbHNlOgogICAgZGVmIHJhaXNlX2Zyb20odmFsdWUsIGZyb21fdmFsdWUpOgogICAgICAgIHJhaXNlIHZhbHVlCgoKcHJpbnRfID0gZ2V0YXR0cihtb3Zlcy5idWlsdGlucywgInByaW50IiwgTm9uZSkKaWYgcHJpbnRfIGlzIE5vbmU6CiAgICBkZWYgcHJpbnRfKCphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgIiIiVGhlIG5ldy1zdHlsZSBwcmludCBmdW5jdGlvbiBmb3IgUHl0aG9uIDIuNCBhbmQgMi41LiIiIgogICAgICAgIGZwID0ga3dhcmdzLnBvcCgiZmlsZSIsIHN5cy5zdGRvdXQpCiAgICAgICAgaWYgZnAgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGRlZiB3cml0ZShkYXRhKToKICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZGF0YSwgYmFzZXN0cmluZyk6CiAgICAgICAgICAgICAgICBkYXRhID0gc3RyKGRhdGEpCiAgICAgICAgICAgICMgSWYgdGhlIGZpbGUgaGFzIGFuIGVuY29kaW5nLCBlbmNvZGUgdW5pY29kZSB3aXRoIGl0LgogICAgICAgICAgICBpZiAoaXNpbnN0YW5jZShmcCwgZmlsZSkgYW5kCiAgICAgICAgICAgICAgICAgICAgaXNpbnN0YW5jZShkYXRhLCB1bmljb2RlKSBhbmQKICAgICAgICAgICAgICAgICAgICBmcC5lbmNvZGluZyBpcyBub3QgTm9uZSk6CiAgICAgICAgICAgICAgICBlcnJvcnMgPSBnZXRhdHRyKGZwLCAiZXJyb3JzIiwgTm9uZSkKICAgICAgICAgICAgICAgIGlmIGVycm9ycyBpcyBOb25lOgogICAgICAgICAgICAgICAgICAgIGVycm9ycyA9ICJzdHJpY3QiCiAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5lbmNvZGUoZnAuZW5jb2RpbmcsIGVycm9ycykKICAgICAgICAgICAgZnAud3JpdGUoZGF0YSkKICAgICAgICB3YW50X3VuaWNvZGUgPSBGYWxzZQogICAgICAgIHNlcCA9IGt3YXJncy5wb3AoInNlcCIsIE5vbmUpCiAgICAgICAgaWYgc2VwIGlzIG5vdCBOb25lOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNlcCwgdW5pY29kZSk6CiAgICAgICAgICAgICAgICB3YW50X3VuaWNvZGUgPSBUcnVlCiAgICAgICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2Uoc2VwLCBzdHIpOgogICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJzZXAgbXVzdCBiZSBOb25lIG9yIGEgc3RyaW5nIikKICAgICAgICBlbmQgPSBrd2FyZ3MucG9wKCJlbmQiLCBOb25lKQogICAgICAgIGlmIGVuZCBpcyBub3QgTm9uZToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShlbmQsIHVuaWNvZGUpOgogICAgICAgICAgICAgICAgd2FudF91bmljb2RlID0gVHJ1ZQogICAgICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKGVuZCwgc3RyKToKICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiZW5kIG11c3QgYmUgTm9uZSBvciBhIHN0cmluZyIpCiAgICAgICAgaWYga3dhcmdzOgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImludmFsaWQga2V5d29yZCBhcmd1bWVudHMgdG8gcHJpbnQoKSIpCiAgICAgICAgaWYgbm90IHdhbnRfdW5pY29kZToKICAgICAgICAgICAgZm9yIGFyZyBpbiBhcmdzOgogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShhcmcsIHVuaWNvZGUpOgogICAgICAgICAgICAgICAgICAgIHdhbnRfdW5pY29kZSA9IFRydWUKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGlmIHdhbnRfdW5pY29kZToKICAgICAgICAgICAgbmV3bGluZSA9IHVuaWNvZGUoIlxuIikKICAgICAgICAgICAgc3BhY2UgPSB1bmljb2RlKCIgIikKICAgICAgICBlbHNlOgogICAgICAgICAgICBuZXdsaW5lID0gIlxuIgogICAgICAgICAgICBzcGFjZSA9ICIgIgogICAgICAgIGlmIHNlcCBpcyBOb25lOgogICAgICAgICAgICBzZXAgPSBzcGFjZQogICAgICAgIGlmIGVuZCBpcyBOb25lOgogICAgICAgICAgICBlbmQgPSBuZXdsaW5lCiAgICAgICAgZm9yIGksIGFyZyBpbiBlbnVtZXJhdGUoYXJncyk6CiAgICAgICAgICAgIGlmIGk6CiAgICAgICAgICAgICAgICB3cml0ZShzZXApCiAgICAgICAgICAgIHdyaXRlKGFyZykKICAgICAgICB3cml0ZShlbmQpCmlmIHN5cy52ZXJzaW9uX2luZm9bOjJdIDwgKDMsIDMpOgogICAgX3ByaW50ID0gcHJpbnRfCgogICAgZGVmIHByaW50XygqYXJncywgKiprd2FyZ3MpOgogICAgICAgIGZwID0ga3dhcmdzLmdldCgiZmlsZSIsIHN5cy5zdGRvdXQpCiAgICAgICAgZmx1c2ggPSBrd2FyZ3MucG9wKCJmbHVzaCIsIEZhbHNlKQogICAgICAgIF9wcmludCgqYXJncywgKiprd2FyZ3MpCiAgICAgICAgaWYgZmx1c2ggYW5kIGZwIGlzIG5vdCBOb25lOgogICAgICAgICAgICBmcC5mbHVzaCgpCgpfYWRkX2RvYyhyZXJhaXNlLCAiIiJSZXJhaXNlIGFuIGV4Y2VwdGlvbi4iIiIpCgppZiBzeXMudmVyc2lvbl9pbmZvWzA6Ml0gPCAoMywgNCk6CiAgICBkZWYgd3JhcHMod3JhcHBlZCwgYXNzaWduZWQ9ZnVuY3Rvb2xzLldSQVBQRVJfQVNTSUdOTUVOVFMsCiAgICAgICAgICAgICAgdXBkYXRlZD1mdW5jdG9vbHMuV1JBUFBFUl9VUERBVEVTKToKICAgICAgICBkZWYgd3JhcHBlcihmKToKICAgICAgICAgICAgZiA9IGZ1bmN0b29scy53cmFwcyh3cmFwcGVkLCBhc3NpZ25lZCwgdXBkYXRlZCkoZikKICAgICAgICAgICAgZi5fX3dyYXBwZWRfXyA9IHdyYXBwZWQKICAgICAgICAgICAgcmV0dXJuIGYKICAgICAgICByZXR1cm4gd3JhcHBlcgplbHNlOgogICAgd3JhcHMgPSBmdW5jdG9vbHMud3JhcHMKCgpkZWYgd2l0aF9tZXRhY2xhc3MobWV0YSwgKmJhc2VzKToKICAgICIiIkNyZWF0ZSBhIGJhc2UgY2xhc3Mgd2l0aCBhIG1ldGFjbGFzcy4iIiIKICAgICMgVGhpcyByZXF1aXJlcyBhIGJpdCBvZiBleHBsYW5hdGlvbjogdGhlIGJhc2ljIGlkZWEgaXMgdG8gbWFrZSBhIGR1bW15CiAgICAjIG1ldGFjbGFzcyBmb3Igb25lIGxldmVsIG9mIGNsYXNzIGluc3RhbnRpYXRpb24gdGhhdCByZXBsYWNlcyBpdHNlbGYgd2l0aAogICAgIyB0aGUgYWN0dWFsIG1ldGFjbGFzcy4KICAgIGNsYXNzIG1ldGFjbGFzcyhtZXRhKToKCiAgICAgICAgZGVmIF9fbmV3X18oY2xzLCBuYW1lLCB0aGlzX2Jhc2VzLCBkKToKICAgICAgICAgICAgcmV0dXJuIG1ldGEobmFtZSwgYmFzZXMsIGQpCiAgICByZXR1cm4gdHlwZS5fX25ld19fKG1ldGFjbGFzcywgJ3RlbXBvcmFyeV9jbGFzcycsICgpLCB7fSkKCgpkZWYgYWRkX21ldGFjbGFzcyhtZXRhY2xhc3MpOgogICAgIiIiQ2xhc3MgZGVjb3JhdG9yIGZvciBjcmVhdGluZyBhIGNsYXNzIHdpdGggYSBtZXRhY2xhc3MuIiIiCiAgICBkZWYgd3JhcHBlcihjbHMpOgogICAgICAgIG9yaWdfdmFycyA9IGNscy5fX2RpY3RfXy5jb3B5KCkKICAgICAgICBzbG90cyA9IG9yaWdfdmFycy5nZXQoJ19fc2xvdHNfXycpCiAgICAgICAgaWYgc2xvdHMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2xvdHMsIHN0cik6CiAgICAgICAgICAgICAgICBzbG90cyA9IFtzbG90c10KICAgICAgICAgICAgZm9yIHNsb3RzX3ZhciBpbiBzbG90czoKICAgICAgICAgICAgICAgIG9yaWdfdmFycy5wb3Aoc2xvdHNfdmFyKQogICAgICAgIG9yaWdfdmFycy5wb3AoJ19fZGljdF9fJywgTm9uZSkKICAgICAgICBvcmlnX3ZhcnMucG9wKCdfX3dlYWtyZWZfXycsIE5vbmUpCiAgICAgICAgcmV0dXJuIG1ldGFjbGFzcyhjbHMuX19uYW1lX18sIGNscy5fX2Jhc2VzX18sIG9yaWdfdmFycykKICAgIHJldHVybiB3cmFwcGVyCgoKZGVmIHB5dGhvbl8yX3VuaWNvZGVfY29tcGF0aWJsZShrbGFzcyk6CiAgICAiIiIKICAgIEEgZGVjb3JhdG9yIHRoYXQgZGVmaW5lcyBfX3VuaWNvZGVfXyBhbmQgX19zdHJfXyBtZXRob2RzIHVuZGVyIFB5dGhvbiAyLgogICAgVW5kZXIgUHl0aG9uIDMgaXQgZG9lcyBub3RoaW5nLgoKICAgIFRvIHN1cHBvcnQgUHl0aG9uIDIgYW5kIDMgd2l0aCBhIHNpbmdsZSBjb2RlIGJhc2UsIGRlZmluZSBhIF9fc3RyX18gbWV0aG9kCiAgICByZXR1cm5pbmcgdGV4dCBhbmQgYXBwbHkgdGhpcyBkZWNvcmF0b3IgdG8gdGhlIGNsYXNzLgogICAgIiIiCiAgICBpZiBQWTI6CiAgICAgICAgaWYgJ19fc3RyX18nIG5vdCBpbiBrbGFzcy5fX2RpY3RfXzoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiQHB5dGhvbl8yX3VuaWNvZGVfY29tcGF0aWJsZSBjYW5ub3QgYmUgYXBwbGllZCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvICVzIGJlY2F1c2UgaXQgZG9lc24ndCBkZWZpbmUgX19zdHJfXygpLiIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtsYXNzLl9fbmFtZV9fKQogICAgICAgIGtsYXNzLl9fdW5pY29kZV9fID0ga2xhc3MuX19zdHJfXwogICAgICAgIGtsYXNzLl9fc3RyX18gPSBsYW1iZGEgc2VsZjogc2VsZi5fX3VuaWNvZGVfXygpLmVuY29kZSgndXRmLTgnKQogICAgcmV0dXJuIGtsYXNzCgoKIyBDb21wbGV0ZSB0aGUgbW92ZXMgaW1wbGVtZW50YXRpb24uCiMgVGhpcyBjb2RlIGlzIGF0IHRoZSBlbmQgb2YgdGhpcyBtb2R1bGUgdG8gc3BlZWQgdXAgbW9kdWxlIGxvYWRpbmcuCiMgVHVybiB0aGlzIG1vZHVsZSBpbnRvIGEgcGFja2FnZS4KX19wYXRoX18gPSBbXSAgIyByZXF1aXJlZCBmb3IgUEVQIDMwMiBhbmQgUEVQIDQ1MQpfX3BhY2thZ2VfXyA9IF9fbmFtZV9fICAjIHNlZSBQRVAgMzY2IEBSZXNlcnZlZEFzc2lnbm1lbnQKaWYgZ2xvYmFscygpLmdldCgiX19zcGVjX18iKSBpcyBub3QgTm9uZToKICAgIF9fc3BlY19fLnN1Ym1vZHVsZV9zZWFyY2hfbG9jYXRpb25zID0gW10gICMgUEVQIDQ1MSBAVW5kZWZpbmVkVmFyaWFibGUKIyBSZW1vdmUgb3RoZXIgc2l4IG1ldGEgcGF0aCBpbXBvcnRlcnMsIHNpbmNlIHRoZXkgY2F1c2UgcHJvYmxlbXMuIFRoaXMgY2FuCiMgaGFwcGVuIGlmIHNpeCBpcyByZW1vdmVkIGZyb20gc3lzLm1vZHVsZXMgYW5kIHRoZW4gcmVsb2FkZWQuIChTZXR1cHRvb2xzIGRvZXMKIyB0aGlzIGZvciBzb21lIHJlYXNvbi4pCmlmIHN5cy5tZXRhX3BhdGg6CiAgICBmb3IgaSwgaW1wb3J0ZXIgaW4gZW51bWVyYXRlKHN5cy5tZXRhX3BhdGgpOgogICAgICAgICMgSGVyZSdzIHNvbWUgcmVhbCBuYXN0aW5lc3M6IEFub3RoZXIgImluc3RhbmNlIiBvZiB0aGUgc2l4IG1vZHVsZSBtaWdodAogICAgICAgICMgYmUgZmxvYXRpbmcgYXJvdW5kLiBUaGVyZWZvcmUsIHdlIGNhbid0IHVzZSBpc2luc3RhbmNlKCkgdG8gY2hlY2sgZm9yCiAgICAgICAgIyB0aGUgc2l4IG1ldGEgcGF0aCBpbXBvcnRlciwgc2luY2UgdGhlIG90aGVyIHNpeCBpbnN0YW5jZSB3aWxsIGhhdmUKICAgICAgICAjIGluc2VydGVkIGFuIGltcG9ydGVyIHdpdGggZGlmZmVyZW50IGNsYXNzLgogICAgICAgIGlmICh0eXBlKGltcG9ydGVyKS5fX25hbWVfXyA9PSAiX1NpeE1ldGFQYXRoSW1wb3J0ZXIiIGFuZAogICAgICAgICAgICAgICAgaW1wb3J0ZXIubmFtZSA9PSBfX25hbWVfXyk6CiAgICAgICAgICAgIGRlbCBzeXMubWV0YV9wYXRoW2ldCiAgICAgICAgICAgIGJyZWFrCiAgICBkZWwgaSwgaW1wb3J0ZXIKIyBGaW5hbGx5LCBhZGQgdGhlIGltcG9ydGVyIHRvIHRoZSBtZXRhIHBhdGggaW1wb3J0IGhvb2suCnN5cy5tZXRhX3BhdGguYXBwZW5kKF9pbXBvcnRlcikKUEsDBBQAAAAAAAAAIQB12PF5twkAALcJAAA4AAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9leHRlcm4vX19pbml0X18ucHlpbXBvcnQgc3lzCgoKY2xhc3MgVmVuZG9ySW1wb3J0ZXI6CiAgICAiIiIKICAgIEEgUEVQIDMwMiBtZXRhIHBhdGggaW1wb3J0ZXIgZm9yIGZpbmRpbmcgb3B0aW9uYWxseS12ZW5kb3JlZAogICAgb3Igb3RoZXJ3aXNlIG5hdHVyYWxseS1pbnN0YWxsZWQgcGFja2FnZXMgZnJvbSByb290X25hbWUuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgcm9vdF9uYW1lLCB2ZW5kb3JlZF9uYW1lcz0oKSwgdmVuZG9yX3BrZz1Ob25lKToKICAgICAgICBzZWxmLnJvb3RfbmFtZSA9IHJvb3RfbmFtZQogICAgICAgIHNlbGYudmVuZG9yZWRfbmFtZXMgPSBzZXQodmVuZG9yZWRfbmFtZXMpCiAgICAgICAgc2VsZi52ZW5kb3JfcGtnID0gdmVuZG9yX3BrZyBvciByb290X25hbWUucmVwbGFjZSgnZXh0ZXJuJywgJ192ZW5kb3InKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHNlYXJjaF9wYXRoKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFNlYXJjaCBmaXJzdCB0aGUgdmVuZG9yIHBhY2thZ2UgdGhlbiBhcyBhIG5hdHVyYWwgcGFja2FnZS4KICAgICAgICAiIiIKICAgICAgICB5aWVsZCBzZWxmLnZlbmRvcl9wa2cgKyAnLicKICAgICAgICB5aWVsZCAnJwoKICAgIGRlZiBmaW5kX21vZHVsZShzZWxmLCBmdWxsbmFtZSwgcGF0aD1Ob25lKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gc2VsZiB3aGVuIGZ1bGxuYW1lIHN0YXJ0cyB3aXRoIHJvb3RfbmFtZSBhbmQgdGhlCiAgICAgICAgdGFyZ2V0IG1vZHVsZSBpcyBvbmUgdmVuZG9yZWQgdGhyb3VnaCB0aGlzIGltcG9ydGVyLgogICAgICAgICIiIgogICAgICAgIHJvb3QsIGJhc2UsIHRhcmdldCA9IGZ1bGxuYW1lLnBhcnRpdGlvbihzZWxmLnJvb3RfbmFtZSArICcuJykKICAgICAgICBpZiByb290OgogICAgICAgICAgICByZXR1cm4KICAgICAgICBpZiBub3QgYW55KG1hcCh0YXJnZXQuc3RhcnRzd2l0aCwgc2VsZi52ZW5kb3JlZF9uYW1lcykpOgogICAgICAgICAgICByZXR1cm4KICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBsb2FkX21vZHVsZShzZWxmLCBmdWxsbmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgSXRlcmF0ZSBvdmVyIHRoZSBzZWFyY2ggcGF0aCB0byBsb2NhdGUgYW5kIGxvYWQgZnVsbG5hbWUuCiAgICAgICAgIiIiCiAgICAgICAgcm9vdCwgYmFzZSwgdGFyZ2V0ID0gZnVsbG5hbWUucGFydGl0aW9uKHNlbGYucm9vdF9uYW1lICsgJy4nKQogICAgICAgIGZvciBwcmVmaXggaW4gc2VsZi5zZWFyY2hfcGF0aDoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgZXh0YW50ID0gcHJlZml4ICsgdGFyZ2V0CiAgICAgICAgICAgICAgICBfX2ltcG9ydF9fKGV4dGFudCkKICAgICAgICAgICAgICAgIG1vZCA9IHN5cy5tb2R1bGVzW2V4dGFudF0KICAgICAgICAgICAgICAgIHN5cy5tb2R1bGVzW2Z1bGxuYW1lXSA9IG1vZAogICAgICAgICAgICAgICAgIyBteXN0ZXJpb3VzIGhhY2s6CiAgICAgICAgICAgICAgICAjIFJlbW92ZSB0aGUgcmVmZXJlbmNlIHRvIHRoZSBleHRhbnQgcGFja2FnZS9tb2R1bGUKICAgICAgICAgICAgICAgICMgb24gbGF0ZXIgUHl0aG9uIHZlcnNpb25zIHRvIGNhdXNlIHJlbGF0aXZlIGltcG9ydHMKICAgICAgICAgICAgICAgICMgaW4gdGhlIHZlbmRvciBwYWNrYWdlIHRvIHJlc29sdmUgdGhlIHNhbWUgbW9kdWxlcwogICAgICAgICAgICAgICAgIyBhcyB0aG9zZSBnb2luZyB0aHJvdWdoIHRoaXMgaW1wb3J0ZXIuCiAgICAgICAgICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvID4gKDMsIDMpOgogICAgICAgICAgICAgICAgICAgIGRlbCBzeXMubW9kdWxlc1tleHRhbnRdCiAgICAgICAgICAgICAgICByZXR1cm4gbW9kCiAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigKICAgICAgICAgICAgICAgICJUaGUgJ3t0YXJnZXR9JyBwYWNrYWdlIGlzIHJlcXVpcmVkOyAiCiAgICAgICAgICAgICAgICAibm9ybWFsbHkgdGhpcyBpcyBidW5kbGVkIHdpdGggdGhpcyBwYWNrYWdlIHNvIGlmIHlvdSBnZXQgIgogICAgICAgICAgICAgICAgInRoaXMgd2FybmluZywgY29uc3VsdCB0aGUgcGFja2FnZXIgb2YgeW91ciAiCiAgICAgICAgICAgICAgICAiZGlzdHJpYnV0aW9uLiIuZm9ybWF0KCoqbG9jYWxzKCkpCiAgICAgICAgICAgICkKCiAgICBkZWYgaW5zdGFsbChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBJbnN0YWxsIHRoaXMgaW1wb3J0ZXIgaW50byBzeXMubWV0YV9wYXRoIGlmIG5vdCBhbHJlYWR5IHByZXNlbnQuCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZiBub3QgaW4gc3lzLm1ldGFfcGF0aDoKICAgICAgICAgICAgc3lzLm1ldGFfcGF0aC5hcHBlbmQoc2VsZikKCgpuYW1lcyA9ICdwYWNrYWdpbmcnLCAncHlwYXJzaW5nJywgJ3NpeCcsICdhcHBkaXJzJwpWZW5kb3JJbXBvcnRlcihfX25hbWVfXywgbmFtZXMpLmluc3RhbGwoKQpQSwMEFAAAAAAAAAAhAMdHfTJYAgAAWAIAADMAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL3B5MzFjb21wYXQucHlpbXBvcnQgb3MKaW1wb3J0IGVycm5vCmltcG9ydCBzeXMKCgpkZWYgX21ha2VkaXJzXzMxKHBhdGgsIGV4aXN0X29rPUZhbHNlKToKICAgIHRyeToKICAgICAgICBvcy5tYWtlZGlycyhwYXRoKQogICAgZXhjZXB0IE9TRXJyb3IgYXMgZXhjOgogICAgICAgIGlmIG5vdCBleGlzdF9vayBvciBleGMuZXJybm8gIT0gZXJybm8uRUVYSVNUOgogICAgICAgICAgICByYWlzZQoKCiMgcmVseSBvbiBjb21wYXRpYmlsaXR5IGJlaGF2aW9yIHVudGlsIG1vZGUgY29uc2lkZXJhdGlvbnMKIyAgYW5kIGV4aXN0c19vayBjb25zaWRlcmF0aW9ucyBhcmUgZGlzZW50YW5nbGVkLgojIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcHlwYS9zZXR1cHRvb2xzL3B1bGwvMTA4MyNpc3N1ZWNvbW1lbnQtMzE1MTY4NjYzCm5lZWRzX21ha2VkaXJzID0gKAogICAgc3lzLnZlcnNpb25faW5mbyA8ICgzLCAyLCA1KSBvcgogICAgKDMsIDMpIDw9IHN5cy52ZXJzaW9uX2luZm8gPCAoMywgMywgNikgb3IKICAgICgzLCA0KSA8PSBzeXMudmVyc2lvbl9pbmZvIDwgKDMsIDQsIDEpCikKbWFrZWRpcnMgPSBfbWFrZWRpcnNfMzEgaWYgbmVlZHNfbWFrZWRpcnMgZWxzZSBvcy5tYWtlZGlycwpQSwMEFAAAAAAAAAAhAH/UulyOBQAAjgUAAEMAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzLTM4LjIuNC5kaXN0LWluZm8vREVTQ1JJUFRJT04ucnN0Li4gaW1hZ2U6OiBodHRwczovL2ltZy5zaGllbGRzLmlvL3B5cGkvdi9zZXR1cHRvb2xzLnN2ZwogICA6dGFyZ2V0OiBodHRwczovL3B5cGkub3JnL3Byb2plY3Qvc2V0dXB0b29scwoKLi4gaW1hZ2U6OiBodHRwczovL3JlYWR0aGVkb2NzLm9yZy9wcm9qZWN0cy9zZXR1cHRvb2xzL2JhZGdlLz92ZXJzaW9uPWxhdGVzdAogICAgOnRhcmdldDogaHR0cHM6Ly9zZXR1cHRvb2xzLnJlYWR0aGVkb2NzLmlvCgouLiBpbWFnZTo6IGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vdHJhdmlzL3B5cGEvc2V0dXB0b29scy9tYXN0ZXIuc3ZnP2xhYmVsPUxpbnV4JTIwYnVpbGQlMjAlNDAlMjBUcmF2aXMlMjBDSQogICA6dGFyZ2V0OiBodHRwczovL3RyYXZpcy1jaS5vcmcvcHlwYS9zZXR1cHRvb2xzCgouLiBpbWFnZTo6IGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYXBwdmV5b3IvY2kvamFyYWNvL3NldHVwdG9vbHMvbWFzdGVyLnN2Zz9sYWJlbD1XaW5kb3dzJTIwYnVpbGQlMjAlNDAlMjBBcHB2ZXlvcgogICA6dGFyZ2V0OiBodHRwczovL2NpLmFwcHZleW9yLmNvbS9wcm9qZWN0L2phcmFjby9zZXR1cHRvb2xzL2JyYW5jaC9tYXN0ZXIKCi4uIGltYWdlOjogaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9weXBpL3B5dmVyc2lvbnMvc2V0dXB0b29scy5zdmcKClNlZSB0aGUgYEluc3RhbGxhdGlvbiBJbnN0cnVjdGlvbnMKPGh0dHBzOi8vcGFja2FnaW5nLnB5dGhvbi5vcmcvaW5zdGFsbGluZy8+YF8gaW4gdGhlIFB5dGhvbiBQYWNrYWdpbmcKVXNlcidzIEd1aWRlIGZvciBpbnN0cnVjdGlvbnMgb24gaW5zdGFsbGluZywgdXBncmFkaW5nLCBhbmQgdW5pbnN0YWxsaW5nClNldHVwdG9vbHMuCgpUaGUgcHJvamVjdCBpcyBgbWFpbnRhaW5lZCBhdCBHaXRIdWIgPGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3NldHVwdG9vbHM+YF8uCgpRdWVzdGlvbnMgYW5kIGNvbW1lbnRzIHNob3VsZCBiZSBkaXJlY3RlZCB0byB0aGUgYGRpc3R1dGlscy1zaWcKbWFpbGluZyBsaXN0IDxodHRwOi8vbWFpbC5weXRob24ub3JnL3BpcGVybWFpbC9kaXN0dXRpbHMtc2lnLz5gXy4KQnVnIHJlcG9ydHMgYW5kIGVzcGVjaWFsbHkgdGVzdGVkIHBhdGNoZXMgbWF5IGJlCnN1Ym1pdHRlZCBkaXJlY3RseSB0byB0aGUgYGJ1ZyB0cmFja2VyCjxodHRwczovL2dpdGh1Yi5jb20vcHlwYS9zZXR1cHRvb2xzL2lzc3Vlcz5gXy4KCgpDb2RlIG9mIENvbmR1Y3QKLS0tLS0tLS0tLS0tLS0tCgpFdmVyeW9uZSBpbnRlcmFjdGluZyBpbiB0aGUgc2V0dXB0b29scyBwcm9qZWN0J3MgY29kZWJhc2VzLCBpc3N1ZSB0cmFja2VycywKY2hhdCByb29tcywgYW5kIG1haWxpbmcgbGlzdHMgaXMgZXhwZWN0ZWQgdG8gZm9sbG93IHRoZQpgUHlQQSBDb2RlIG9mIENvbmR1Y3QgPGh0dHBzOi8vd3d3LnB5cGEuaW8vZW4vbGF0ZXN0L2NvZGUtb2YtY29uZHVjdC8+YF8uCgoKUEsDBBQAAAAAAAAAIQBQ16sHNgQAADYEAAA/AAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL0xJQ0VOU0UudHh0Q29weXJpZ2h0IChDKSAyMDE2IEphc29uIFIgQ29vbWJzIDxqYXJhY29AamFyYWNvLmNvbT4KClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bwp1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcwpvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8Kc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKU09GVFdBUkUuClBLAwQUAAAAAAAAACEA8QyQ/+4KAADuCgAAPAAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMtMzguMi40LmRpc3QtaW5mby9NRVRBREFUQU1ldGFkYXRhLVZlcnNpb246IDIuMApOYW1lOiBzZXR1cHRvb2xzClZlcnNpb246IDM4LjIuNApTdW1tYXJ5OiBFYXNpbHkgZG93bmxvYWQsIGJ1aWxkLCBpbnN0YWxsLCB1cGdyYWRlLCBhbmQgdW5pbnN0YWxsIFB5dGhvbiBwYWNrYWdlcwpIb21lLXBhZ2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3NldHVwdG9vbHMKQXV0aG9yOiBQeXRob24gUGFja2FnaW5nIEF1dGhvcml0eQpBdXRob3ItZW1haWw6IGRpc3R1dGlscy1zaWdAcHl0aG9uLm9yZwpMaWNlbnNlOiBVTktOT1dOCkRlc2NyaXB0aW9uLUNvbnRlbnQtVHlwZTogdGV4dC94LXJzdDsgY2hhcnNldD1VVEYtOApLZXl3b3JkczogQ1BBTiBQeVBJIGRpc3R1dGlscyBlZ2dzIHBhY2thZ2UgbWFuYWdlbWVudApQbGF0Zm9ybTogVU5LTk9XTgpDbGFzc2lmaWVyOiBEZXZlbG9wbWVudCBTdGF0dXMgOjogNSAtIFByb2R1Y3Rpb24vU3RhYmxlCkNsYXNzaWZpZXI6IEludGVuZGVkIEF1ZGllbmNlIDo6IERldmVsb3BlcnMKQ2xhc3NpZmllcjogTGljZW5zZSA6OiBPU0kgQXBwcm92ZWQgOjogTUlUIExpY2Vuc2UKQ2xhc3NpZmllcjogT3BlcmF0aW5nIFN5c3RlbSA6OiBPUyBJbmRlcGVuZGVudApDbGFzc2lmaWVyOiBQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMgpDbGFzc2lmaWVyOiBQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMi43CkNsYXNzaWZpZXI6IFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzCkNsYXNzaWZpZXI6IFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjMKQ2xhc3NpZmllcjogUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuNApDbGFzc2lmaWVyOiBQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy41CkNsYXNzaWZpZXI6IFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjYKQ2xhc3NpZmllcjogVG9waWMgOjogU29mdHdhcmUgRGV2ZWxvcG1lbnQgOjogTGlicmFyaWVzIDo6IFB5dGhvbiBNb2R1bGVzCkNsYXNzaWZpZXI6IFRvcGljIDo6IFN5c3RlbSA6OiBBcmNoaXZpbmcgOjogUGFja2FnaW5nCkNsYXNzaWZpZXI6IFRvcGljIDo6IFN5c3RlbSA6OiBTeXN0ZW1zIEFkbWluaXN0cmF0aW9uCkNsYXNzaWZpZXI6IFRvcGljIDo6IFV0aWxpdGllcwpSZXF1aXJlcy1QeXRob246ID49Mi43LCE9My4wLiosIT0zLjEuKiwhPTMuMi4qClByb3ZpZGVzLUV4dHJhOiBjZXJ0cwpSZXF1aXJlcy1EaXN0OiBjZXJ0aWZpICg9PTIwMTYuOS4yNik7IGV4dHJhID09ICdjZXJ0cycKUHJvdmlkZXMtRXh0cmE6IHNzbApSZXF1aXJlcy1EaXN0OiB3aW5jZXJ0c3RvcmUgKD09MC4yKTsgc3lzX3BsYXRmb3JtPT0nd2luMzInIGFuZCBleHRyYSA9PSAnc3NsJwoKLi4gaW1hZ2U6OiBodHRwczovL2ltZy5zaGllbGRzLmlvL3B5cGkvdi9zZXR1cHRvb2xzLnN2ZwogICA6dGFyZ2V0OiBodHRwczovL3B5cGkub3JnL3Byb2plY3Qvc2V0dXB0b29scwoKLi4gaW1hZ2U6OiBodHRwczovL3JlYWR0aGVkb2NzLm9yZy9wcm9qZWN0cy9zZXR1cHRvb2xzL2JhZGdlLz92ZXJzaW9uPWxhdGVzdAogICAgOnRhcmdldDogaHR0cHM6Ly9zZXR1cHRvb2xzLnJlYWR0aGVkb2NzLmlvCgouLiBpbWFnZTo6IGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vdHJhdmlzL3B5cGEvc2V0dXB0b29scy9tYXN0ZXIuc3ZnP2xhYmVsPUxpbnV4JTIwYnVpbGQlMjAlNDAlMjBUcmF2aXMlMjBDSQogICA6dGFyZ2V0OiBodHRwczovL3RyYXZpcy1jaS5vcmcvcHlwYS9zZXR1cHRvb2xzCgouLiBpbWFnZTo6IGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYXBwdmV5b3IvY2kvamFyYWNvL3NldHVwdG9vbHMvbWFzdGVyLnN2Zz9sYWJlbD1XaW5kb3dzJTIwYnVpbGQlMjAlNDAlMjBBcHB2ZXlvcgogICA6dGFyZ2V0OiBodHRwczovL2NpLmFwcHZleW9yLmNvbS9wcm9qZWN0L2phcmFjby9zZXR1cHRvb2xzL2JyYW5jaC9tYXN0ZXIKCi4uIGltYWdlOjogaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9weXBpL3B5dmVyc2lvbnMvc2V0dXB0b29scy5zdmcKClNlZSB0aGUgYEluc3RhbGxhdGlvbiBJbnN0cnVjdGlvbnMKPGh0dHBzOi8vcGFja2FnaW5nLnB5dGhvbi5vcmcvaW5zdGFsbGluZy8+YF8gaW4gdGhlIFB5dGhvbiBQYWNrYWdpbmcKVXNlcidzIEd1aWRlIGZvciBpbnN0cnVjdGlvbnMgb24gaW5zdGFsbGluZywgdXBncmFkaW5nLCBhbmQgdW5pbnN0YWxsaW5nClNldHVwdG9vbHMuCgpUaGUgcHJvamVjdCBpcyBgbWFpbnRhaW5lZCBhdCBHaXRIdWIgPGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3NldHVwdG9vbHM+YF8uCgpRdWVzdGlvbnMgYW5kIGNvbW1lbnRzIHNob3VsZCBiZSBkaXJlY3RlZCB0byB0aGUgYGRpc3R1dGlscy1zaWcKbWFpbGluZyBsaXN0IDxodHRwOi8vbWFpbC5weXRob24ub3JnL3BpcGVybWFpbC9kaXN0dXRpbHMtc2lnLz5gXy4KQnVnIHJlcG9ydHMgYW5kIGVzcGVjaWFsbHkgdGVzdGVkIHBhdGNoZXMgbWF5IGJlCnN1Ym1pdHRlZCBkaXJlY3RseSB0byB0aGUgYGJ1ZyB0cmFja2VyCjxodHRwczovL2dpdGh1Yi5jb20vcHlwYS9zZXR1cHRvb2xzL2lzc3Vlcz5gXy4KCgpDb2RlIG9mIENvbmR1Y3QKLS0tLS0tLS0tLS0tLS0tCgpFdmVyeW9uZSBpbnRlcmFjdGluZyBpbiB0aGUgc2V0dXB0b29scyBwcm9qZWN0J3MgY29kZWJhc2VzLCBpc3N1ZSB0cmFja2VycywKY2hhdCByb29tcywgYW5kIG1haWxpbmcgbGlzdHMgaXMgZXhwZWN0ZWQgdG8gZm9sbG93IHRoZQpgUHlQQSBDb2RlIG9mIENvbmR1Y3QgPGh0dHBzOi8vd3d3LnB5cGEuaW8vZW4vbGF0ZXN0L2NvZGUtb2YtY29uZHVjdC8+YF8uCgoKUEsDBBQAAAAAAAAAIQBcrCangx4AAIMeAAA6AAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL1JFQ09SRGVhc3lfaW5zdGFsbC5weSxzaGEyNTY9TURDOXZ0NUF4RHNYWDVxY0tsQnoyVG5XNlRwdXZfQW9ibmZoQ0o5WDNQTSwxMjYNCnBrZ19yZXNvdXJjZXMvX19pbml0X18ucHksc2hhMjU2PTRRWTE1UDhjU19PQXpiWEl5dG1idkdrbnZYN3ZkaWlvbUc0WWhiUVJaQ0ksMTA1OTkxDQpwa2dfcmVzb3VyY2VzL3B5MzFjb21wYXQucHksc2hhMjU2PS15c1Zxb3hMZXRBbkw5NHVNMGtIa29tS1FUQzFKWkxOMlpVanFVaE1lS0UsNjAwDQpwa2dfcmVzb3VyY2VzL192ZW5kb3IvX19pbml0X18ucHksc2hhMjU2PTQ3REVRcGo4SEJTYS1fVEltVy01SkNldVFlUmttNU5NcEpXWkczaFN1RlUsMA0KcGtnX3Jlc291cmNlcy9fdmVuZG9yL2FwcGRpcnMucHksc2hhMjU2PXRnR2FMMG00Sm8yVmV1R2ZvT09pZkx2N2E3b1VFSnUybjF2Umtxb1B3LTAsMjIzNzQNCnBrZ19yZXNvdXJjZXMvX3ZlbmRvci9weXBhcnNpbmcucHksc2hhMjU2PVBpZmVMWTMtV2hJY0JWekx0djBVNFRfcHdEdFBydUJoQkNrZzV2THFhMjgsMjI5ODY3DQpwa2dfcmVzb3VyY2VzL192ZW5kb3Ivc2l4LnB5LHNoYTI1Nj1BNmhkSlpWakkzdF9nZWViWjlCelV2d1JySVhvMGxmd3pRbE0yTGNLeWFzLDMwMDk4DQpwa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL19fYWJvdXRfXy5weSxzaGEyNTY9emtjQ1BUTl82VGNMVzBOcmxnMDE3Ni1SMVFRX1dWUFRtOHN6MVI0LUhqTSw3MjANCnBrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvX19pbml0X18ucHksc2hhMjU2PV92TmFjNVRyendzcnpiT0ZJYkYtNWNIcWNfWTJhUFQyRDd6cklSMDZCT28sNTEzDQpwa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL19jb21wYXQucHksc2hhMjU2PVZpX0EwckFRZUhiVS1hOVgwdHQxeVFtOVJxa2dRYkRTeHpSdzhXbFU5a0EsODYwDQpwa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL19zdHJ1Y3R1cmVzLnB5LHNoYTI1Nj1SSW1FQ0o0Y193VGxhVFlZd1pZTEhFaWViRE1hQUptSzFvUEFSaHcxVDVvLDE0MTYNCnBrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvbWFya2Vycy5weSxzaGEyNTY9dUVjQkJ0R3Z6cWx0Z25BcnFiOWM0UnJjSW5YZXpETG9zMTR6YkJIaFdKbyw4MjQ4DQpwa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL3JlcXVpcmVtZW50cy5weSxzaGEyNTY9U2lrTDJVeW5ic1QwcXRZOWx0cW5nbmRoYV9zZm8wdzZYR0ZoQWhvU29hUSw0MzU1DQpwa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL3NwZWNpZmllcnMucHksc2hhMjU2PVNBTVJlcnpPM2ZLMklrRlpDYVprdXdaYUxfRUdxSE5PejRwbmk0dmhuTjAsMjgwMjUNCnBrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvdXRpbHMucHksc2hhMjU2PTNtNld2UG02Tk54RThya1RHbW4wcjc1Ql9HWlNHZzdpa2FmeEhzQk4xV0EsNDIxDQpwa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL3ZlcnNpb24ucHksc2hhMjU2PU93R254WWZyMmdoTnpZeDU5cVdJQmtySzNTbkI2bi1aZmQxWGFMcG5uTTAsMTE1NTYNCnBrZ19yZXNvdXJjZXMvZXh0ZXJuL19faW5pdF9fLnB5LHNoYTI1Nj1KVXRsSEh2bHhIU051QjRwV3FOamN4N242a0ctZndYZzdxbUoyek5KbElZLDI0ODcNCnNldHVwdG9vbHMvX19pbml0X18ucHksc2hhMjU2PVdXSWRDYkZKblo5ZlpvYVdETl94MXZEQV9Sa20tU2MxNWlLdlB0SVlLRnMsNTcwMA0Kc2V0dXB0b29scy9hcmNoaXZlX3V0aWwucHksc2hhMjU2PWt3OEliX2xLakNjblBLTmJTN2g4SHp0UlZLMGQ1UmFjVTNyX0tSZFZubU0sNjU5Mg0Kc2V0dXB0b29scy9idWlsZF9tZXRhLnB5LHNoYTI1Nj1GbGxhS1RyMXZTSnlpVWVSalZKRVptZUVhUnpoWXVlTmxpbXRjd2FKYmE4LDU2NzENCnNldHVwdG9vbHMvY2xpLTMyLmV4ZSxzaGEyNTY9ZGZFdW92TU5uQTJITGEzalJmTVBWaTV0azRSN2FsQ2JwVHZ1eHRDeXcwWSw2NTUzNg0Kc2V0dXB0b29scy9jbGktNjQuZXhlLHNoYTI1Nj1LTEFCdTVweXJub2tKQ3Y2c2tqWFo2R3NYZXlZSEdjcU9VVDNvSEkzWHBvLDc0NzUyDQpzZXR1cHRvb2xzL2NsaS5leGUsc2hhMjU2PWRmRXVvdk1ObkEySExhM2pSZk1QVmk1dGs0UjdhbENicFR2dXh0Q3l3MFksNjU1MzYNCnNldHVwdG9vbHMvY29uZmlnLnB5LHNoYTI1Nj1aVENnQUMxOG00eFh4dWZsbGZHeGktWEh2Rmc2Z2pfakdwaXNSanAwS0N3LDE2MzA1DQpzZXR1cHRvb2xzL2RlcF91dGlsLnB5LHNoYTI1Nj1mZ2l4dkMxUjdzSDNyMTNrdHlmN04wRkFMb3FFWEwxY0Jhcm1OcFNFb1dnLDkzNQ0Kc2V0dXB0b29scy9kZXBlbmRzLnB5LHNoYTI1Nj1oQzhRSURjTTNWRHBSWHZSVkE2T2ZMOUFhUWZ4dmh4SGNOX3c2c0F5TnE4LDU4MzcNCnNldHVwdG9vbHMvZGlzdC5weSxzaGEyNTY9bHg1RXJybjduYWxfX3d1SC05WUlwR0ZGWkdOWW5zaGNFTURadEhCUHByayw0MDMzNg0Kc2V0dXB0b29scy9leHRlbnNpb24ucHksc2hhMjU2PXVjNm5ISS1NeHdtTkNOUGJVaUJueWJTeXFocEpxamJodk9RLWVtZHZ0X0UsMTcyOQ0Kc2V0dXB0b29scy9nbGliYy5weSxzaGEyNTY9WDY0VnZHUEwyQWJVUkt3WVJzV0pPWFhHQVlPaUZfdjJxaXhlVGtBVUx1VSwzMTQ2DQpzZXR1cHRvb2xzL2dsb2IucHksc2hhMjU2PVktZnB2OHdkSFp6djlEUENhR0FDcE1TQldKNmFtcV8xZTBSX2k4X2VsNHcsNTIwNw0Kc2V0dXB0b29scy9ndWktMzIuZXhlLHNoYTI1Nj1YQnIwYkhNQTZIcHoyczlzOUJ6amwtUHdYZmE5bkg0aWUwckZuNFYya1dBLDY1NTM2DQpzZXR1cHRvb2xzL2d1aS02NC5leGUsc2hhMjU2PWFZS01oWDFJSkxuNFVMSGdXWDBzRTB5UkVVdDZCM1RFSGZfak93NnlOeUUsNzUyNjQNCnNldHVwdG9vbHMvZ3VpLmV4ZSxzaGEyNTY9WEJyMGJITUE2SHB6MnM5czlCempsLVB3WGZhOW5INGllMHJGbjRWMmtXQSw2NTUzNg0Kc2V0dXB0b29scy9sYXVuY2gucHksc2hhMjU2PXNkN2Vqd2hCb2NDRHhfd0c5cklzME9hWjhIdG1tRlU4WkM2SVJfUzBMdmcsNzg3DQpzZXR1cHRvb2xzL2xpYjJ0bzNfZXgucHksc2hhMjU2PXQ1ZTEyaGJSMnBpOVY0ZXpXRFRCNEpNLUFJU1VuR09rbWNuWUhlazN4amcsMjAxMw0Kc2V0dXB0b29scy9tb25rZXkucHksc2hhMjU2PXpaR1RIN3AweGVYUUtMbUV3SlRQSUU0bTVtN2ZKZUhvQXN4eXY1TThlX0UsNTc4OQ0Kc2V0dXB0b29scy9tc3ZjLnB5LHNoYTI1Nj1BRWJXTkxKMHBUdUhKU2tRdUJaRVQ2d3JfZDIteUdHUGtkSENNZElLV0I0LDQwODg0DQpzZXR1cHRvb2xzL25hbWVzcGFjZXMucHksc2hhMjU2PUYwTnJidjhLQ1QyT3JPN3J3YTAzb200TjRHWktBbG5jZS1yci1jZ0RRYTgsMzE5OQ0Kc2V0dXB0b29scy9wYWNrYWdlX2luZGV4LnB5LHNoYTI1Nj1CN2c3TnBDWWtfYkVqamVxQm0zTmJxQmtiSmhoLW1ucmVzM2wxVjJoZGx3LDQwNTA3DQpzZXR1cHRvb2xzL3BlcDQyNXRhZ3MucHksc2hhMjU2PU51R014MWdHaWY3eDZpWWVtaDBMZmdCcl9GWkY1R0ZPUkliZ21NZFU4SjQsMTA4ODINCnNldHVwdG9vbHMvcHkyN2NvbXBhdC5weSxzaGEyNTY9M213eFJNRGs1UTVPMXJTWE9FUmJRRFhoRnF3REpoaFVpdGZNV19xcFVDbyw1MzYNCnNldHVwdG9vbHMvcHkzMWNvbXBhdC5weSxzaGEyNTY9WHVVMUhDc0dFXzN6R3ZCUkloWXcyaUItSWhDRks0LVB4d19qTWlxZE5WaywxMTkyDQpzZXR1cHRvb2xzL3B5MzNjb21wYXQucHksc2hhMjU2PVc4X0pGWnI4V1FiSlRfNy1KRldqY182bEhHdG9NSy00cENySEl3azVKTjAsOTk4DQpzZXR1cHRvb2xzL3B5MzZjb21wYXQucHksc2hhMjU2PVZVRFd4bXU1cnQ0UUhsR1RSdEFGdTZXNWp2Zkw2V0JqZURBemVvQnkwT00sMjg5MQ0Kc2V0dXB0b29scy9zYW5kYm94LnB5LHNoYTI1Nj05VWJ3ZkVMNVFZNDM2b01JMUx0RldvaGhvWi1VendIdkd5WmpVSF9xaGt3LDE0Mjc2DQpzZXR1cHRvb2xzL3NjcmlwdCAoZGV2KS50bXBsLHNoYTI1Nj1mN01SMTdkVGt6YXFrQ01TVnNleU9DTVZyUFZTTWRtVFFzYUI4Y1p6ZnVJLDIwMQ0Kc2V0dXB0b29scy9zY3JpcHQudG1wbCxzaGEyNTY9V0dUdDVwaWV6TzI3Yy1EYng2bDVRNFQzRmYyMEE1ejc4NzJodjNhQWhZWSwxMzgNCnNldHVwdG9vbHMvc2l0ZS1wYXRjaC5weSxzaGEyNTY9QlZ0NnlJckRNWEpvZmxBNUo2REpJY3NKVWZXX1hFZVZoT3plbFRURkRQNCwyMzA3DQpzZXR1cHRvb2xzL3NzbF9zdXBwb3J0LnB5LHNoYTI1Nj1ZQkRKc0NaalNwNjJDV2p4bVNra2U5a245cmhISGoyNUN1czZ6aEpSVzNjLDg0OTINCnNldHVwdG9vbHMvdW5pY29kZV91dGlscy5weSxzaGEyNTY9Tk9pWl81aEQ3MkE2dy00d1ZqOGF3SEZNM241MUttdzFJY192eDE1WEZxdyw5OTYNCnNldHVwdG9vbHMvdmVyc2lvbi5weSxzaGEyNTY9b2dfY3VaUWIwUUk2dWtLWkZmWldQbHIxSGdKQlBQbjJ2TzJtX2JJOVpURSwxNDQNCnNldHVwdG9vbHMvd2hlZWwucHksc2hhMjU2PTZxWThUdE9fWUpzMmNqOUp0ZmlHUWRsdk5ZVTJUWERaTmstMkt2ZUJKYmMsNzIzMw0Kc2V0dXB0b29scy93aW5kb3dzX3N1cHBvcnQucHksc2hhMjU2PTVHcmZxU1AyLWRMR0pvWlRxMmc2ZENLa3lReHhhMm41SVFpWGxKQ29ZRUUsNzE0DQpzZXR1cHRvb2xzL2NvbW1hbmQvX19pbml0X18ucHksc2hhMjU2PU5XekowQTFCRWVuZ1pwVmVxVXlXTE5tMmJrNFAzRjRpTDVRVUVySHk3a0EsNTk0DQpzZXR1cHRvb2xzL2NvbW1hbmQvYWxpYXMucHksc2hhMjU2PUtqcEUwc3pfU0RJSHYzZnBaY0lRSy1zQ2tKei1TckM2R211ZzZiOU5rYzgsMjQyNg0Kc2V0dXB0b29scy9jb21tYW5kL2JkaXN0X2VnZy5weSxzaGEyNTY9ZGg4OFc4cE1IVUpQSGxMVC1YblB2eXlEY21NZkViSTJqSzFFM3cxRUhLYywxODAxMQ0Kc2V0dXB0b29scy9jb21tYW5kL2JkaXN0X3JwbS5weSxzaGEyNTY9QjdsMFRuekNHYi0wbkxsbTZyUzAwaldMa29qQVN3Vm1kaFcydzVRel9BaywxNTA4DQpzZXR1cHRvb2xzL2NvbW1hbmQvYmRpc3Rfd2luaW5zdC5weSxzaGEyNTY9XzZkejNscEIxdFkyMDBMeEtQTE03cWd3VENjZU9NZ2FXRkYtalcyLXBtMCw2MzcNCnNldHVwdG9vbHMvY29tbWFuZC9idWlsZF9jbGliLnB5LHNoYTI1Nj1iUTlhQnItNVpTTy05ZkdzR3NETHowbW5uRnRlSFVabmZ0VkxraHZIRHEwLDQ0ODQNCnNldHVwdG9vbHMvY29tbWFuZC9idWlsZF9leHQucHksc2hhMjU2PWRPODlqLUlDMGRBalN0eTFzU1p4dmkwTFNka1BHUl9aUFhGdUFBRkRaajQsMTMwNDkNCnNldHVwdG9vbHMvY29tbWFuZC9idWlsZF9weS5weSxzaGEyNTY9eVd5WWFhUzlGM285SmJJY3puMDY0QTVnMUM1X1VpS1JEeEdhVHFZYnRMRSw5NTk2DQpzZXR1cHRvb2xzL2NvbW1hbmQvZGV2ZWxvcC5weSxzaGEyNTY9d0tiT3cyX3FVdmNEdGkybFptdHhiRG1ZYjU0eUFBaWJFeHpYSXZUb3otQSw4MDQ2DQpzZXR1cHRvb2xzL2NvbW1hbmQvZGlzdF9pbmZvLnB5LHNoYTI1Nj01dDZrT2ZyZGdBTFQtUDNvZ3NzNlBGOWstTGV5ZXN1ZXljdWszZFV5Wm5JLDk2MA0Kc2V0dXB0b29scy9jb21tYW5kL2Vhc3lfaW5zdGFsbC5weSxzaGEyNTY9WUFJc1Voem13X3NodnZvRFA4RWVzRFMyeGJGSDd0RDRNdVlFOFgzeDZZYyw4NzEyNQ0Kc2V0dXB0b29scy9jb21tYW5kL2VnZ19pbmZvLnB5LHNoYTI1Nj1ETFI1X1hyLWdScXhRd0pjeVZDa1VyZlZaWnJpTXVRU1dvUUdKM1hMN1Q4LDI0OTQ0DQpzZXR1cHRvb2xzL2NvbW1hbmQvaW5zdGFsbC5weSxzaGEyNTY9YTBFWnBMX0E4NjZLRWRoaWNUR2J1eURfVFlsMXN5a2Z6ZHJyaS16YXpUNCw0NjgzDQpzZXR1cHRvb2xzL2NvbW1hbmQvaW5zdGFsbF9lZ2dfaW5mby5weSxzaGEyNTY9Yk1nZUllUmlYelE0REFHUFYxMzI4a2Nqd1FqSGpPV1U0Rm5nQVdMVjc4USwyMjAzDQpzZXR1cHRvb2xzL2NvbW1hbmQvaW5zdGFsbF9saWIucHksc2hhMjU2PTExbXhmMENoMTJOc3VZd1M4UEh3WEJSdnloNjcxUUFNNGNUUmg3ZXB6RzAsMzg0MA0Kc2V0dXB0b29scy9jb21tYW5kL2luc3RhbGxfc2NyaXB0cy5weSxzaGEyNTY9VUQwckVaNjg2MW1UWWhJZHpjc3FLblVsOFBvem9jWFdsOVZCUTFWVFduYywyNDM5DQpzZXR1cHRvb2xzL2NvbW1hbmQvbGF1bmNoZXIgbWFuaWZlc3QueG1sLHNoYTI1Nj14bExialdyQjAxdEtDMC1obFZrT0traVNQYnpNbWwyZU9QdEpfdWNDbmJFLDYyOA0Kc2V0dXB0b29scy9jb21tYW5kL3B5MzZjb21wYXQucHksc2hhMjU2PVN6alpjT3hGN3pkRlVUNDdadjJuN0FNM0g4a29EeXNfME9wUy1uOWdJZmMsNDk4Ng0Kc2V0dXB0b29scy9jb21tYW5kL3JlZ2lzdGVyLnB5LHNoYTI1Nj1iSGxNbTFxbUJiU2RhaFRPVDh3NlVoQS1FZ2VRSXo3cDZjRC1xT2F1YWlJLDI3MA0Kc2V0dXB0b29scy9jb21tYW5kL3JvdGF0ZS5weSxzaGEyNTY9Y281QzFFa0k3UDBHR1Q2VHF6LVQyU0lqMkxCSlRaWFlFTHBtYW82ZDRLUSwyMTY0DQpzZXR1cHRvb2xzL2NvbW1hbmQvc2F2ZW9wdHMucHksc2hhMjU2PXphN1FDQmNRaW1LS3JpV2NvQ2NiaHhQalV6MzBnU0I3NHp1VEw0N3hwUDQsNjU4DQpzZXR1cHRvb2xzL2NvbW1hbmQvc2Rpc3QucHksc2hhMjU2PW9iRFRlMkJtV3QyUGxuRlBaWmg3ZTBMV3ZlbUVzYkNDTzlNemhyVFpqbTgsNjcxMQ0Kc2V0dXB0b29scy9jb21tYW5kL3NldG9wdC5weSxzaGEyNTY9TlRXRHl4LWdqREYtdHhmNGRPNTc3czdMT3pIVm9LUjBNcTMzckZ4YVJyOCw1MDg1DQpzZXR1cHRvb2xzL2NvbW1hbmQvdGVzdC5weSxzaGEyNTY9TWVCQWNYVWVQR2pQS3FqejR6dlRySGF0THZOc2psUEZjYWd0M1huRllkayw5MjE0DQpzZXR1cHRvb2xzL2NvbW1hbmQvdXBsb2FkLnB5LHNoYTI1Nj1pMWdmSXRaM25RT241RktYYjh0TEMyS2Q3ZUtDOGxXTzRiZEU2TnFHcEU0LDExNzINCnNldHVwdG9vbHMvY29tbWFuZC91cGxvYWRfZG9jcy5weSxzaGEyNTY9b1hpR3BsTV9jVUtMd0U0Q1dXdzk4UnpDdWZBdTh0QmhNQzk3R2VnRmNtcyw3MzExDQpzZXR1cHRvb2xzL2V4dGVybi9fX2luaXRfXy5weSxzaGEyNTY9WnRDTFlROEpUdE90bTdTWW94ZWtady1VelkzVFI1MFNSSVVhZXFyMlJPaywxMzENCnNldHVwdG9vbHMtMzguMi40LmRpc3QtaW5mby9ERVNDUklQVElPTi5yc3Qsc2hhMjU2PUl0M2EzR1JqVDU3MDFtcWhycE1jTHlXX1lTMkRva3YtWDh6V29UYU1SZTAsMTQyMg0Kc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL0xJQ0VOU0UudHh0LHNoYTI1Nj13eW82dzVXdll5SHYwb3ZuUFFhZ0R3MjJxNGg5SENIVV9zUmhLTklGYlZvLDEwNzgNCnNldHVwdG9vbHMtMzguMi40LmRpc3QtaW5mby9NRVRBREFUQSxzaGEyNTY9V0xncGJVWDFvTzVvR2U3NHdlY1JSTC1udGxOY2pqT0V3VWRRa2pOUU56SSwyNzk4DQpzZXR1cHRvb2xzLTM4LjIuNC5kaXN0LWluZm8vUkVDT1JELCwNCnNldHVwdG9vbHMtMzguMi40LmRpc3QtaW5mby9XSEVFTCxzaGEyNTY9a2RzTi01T0pBWklpSE4taU80UmhsODJLeVMwYkRXZjR1QndNYmtOYWZyOCwxMTANCnNldHVwdG9vbHMtMzguMi40LmRpc3QtaW5mby9kZXBlbmRlbmN5X2xpbmtzLnR4dCxzaGEyNTY9SGxrQ0Zrb0s1VGJaNUVNTGJMS1loTGNZX0UzMWtCV0Q4VHFXMkVnbWF0USwyMzkNCnNldHVwdG9vbHMtMzguMi40LmRpc3QtaW5mby9lbnRyeV9wb2ludHMudHh0LHNoYTI1Nj1qQnFDWURsVmpsX19zallGR1hvMUpRR0lNQVlGSkUtcHJZV1V0bk1aRWV3LDI5OTANCnNldHVwdG9vbHMtMzguMi40LmRpc3QtaW5mby9tZXRhZGF0YS5qc29uLHNoYTI1Nj14ZDBfTmdNTy1hVEotd3NNNmR0NmRnUVdleEl2dmZDenVPMGtSRDdNWjVrLDQ5MDENCnNldHVwdG9vbHMtMzguMi40LmRpc3QtaW5mby90b3BfbGV2ZWwudHh0LHNoYTI1Nj0ySFVYVlZ3QTRQZmYxeGdURnIzR3NUWFhLYVBhTzZ2bEc2b05KXzR1NFRnLDM4DQpzZXR1cHRvb2xzLTM4LjIuNC5kaXN0LWluZm8vemlwLXNhZmUsc2hhMjU2PUFicEhHY2dMYi1rUnNKR253RkVrdGs3dXpwWk9DY0JZNzQtWUJkcktWR3MsMQ0KUEsDBBQAAAAAAAAAIQD23dK+bgAAAG4AAAA5AAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL1dIRUVMV2hlZWwtVmVyc2lvbjogMS4wCkdlbmVyYXRvcjogYmRpc3Rfd2hlZWwgKDAuMzAuMCkKUm9vdC1Jcy1QdXJlbGliOiB0cnVlClRhZzogcHkyLW5vbmUtYW55ClRhZzogcHkzLW5vbmUtYW55CgpQSwMEFAAAAAAAAAAhADfZX93vAAAA7wAAAEgAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzLTM4LjIuNC5kaXN0LWluZm8vZGVwZW5kZW5jeV9saW5rcy50eHRodHRwczovL2ZpbGVzLnB5dGhvbmhvc3RlZC5vcmcvcGFja2FnZXMvc291cmNlL2MvY2VydGlmaS9jZXJ0aWZpLTIwMTYuOS4yNi50YXIuZ3ojbWQ1PWJhYTgxZTk1MWEyOTk1ODU2MzY4OWQ4NjhlZjEwNjRkCmh0dHBzOi8vZmlsZXMucHl0aG9uaG9zdGVkLm9yZy9wYWNrYWdlcy9zb3VyY2Uvdy93aW5jZXJ0c3RvcmUvd2luY2VydHN0b3JlLTAuMi56aXAjbWQ1PWFlNzI4ZjJmMDA3MTg1NjQ4ZDBjN2E4Njc5YjM2MWUyClBLAwQUAAAAAAAAACEA0TWOjq4LAACuCwAARAAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMtMzguMi40LmRpc3QtaW5mby9lbnRyeV9wb2ludHMudHh0W2NvbnNvbGVfc2NyaXB0c10KZWFzeV9pbnN0YWxsID0gc2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbDptYWluCmVhc3lfaW5zdGFsbC0zLjYgPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWFzeV9pbnN0YWxsOm1haW4KCltkaXN0dXRpbHMuY29tbWFuZHNdCmFsaWFzID0gc2V0dXB0b29scy5jb21tYW5kLmFsaWFzOmFsaWFzCmJkaXN0X2VnZyA9IHNldHVwdG9vbHMuY29tbWFuZC5iZGlzdF9lZ2c6YmRpc3RfZWdnCmJkaXN0X3JwbSA9IHNldHVwdG9vbHMuY29tbWFuZC5iZGlzdF9ycG06YmRpc3RfcnBtCmJkaXN0X3dpbmluc3QgPSBzZXR1cHRvb2xzLmNvbW1hbmQuYmRpc3Rfd2luaW5zdDpiZGlzdF93aW5pbnN0CmJ1aWxkX2NsaWIgPSBzZXR1cHRvb2xzLmNvbW1hbmQuYnVpbGRfY2xpYjpidWlsZF9jbGliCmJ1aWxkX2V4dCA9IHNldHVwdG9vbHMuY29tbWFuZC5idWlsZF9leHQ6YnVpbGRfZXh0CmJ1aWxkX3B5ID0gc2V0dXB0b29scy5jb21tYW5kLmJ1aWxkX3B5OmJ1aWxkX3B5CmRldmVsb3AgPSBzZXR1cHRvb2xzLmNvbW1hbmQuZGV2ZWxvcDpkZXZlbG9wCmRpc3RfaW5mbyA9IHNldHVwdG9vbHMuY29tbWFuZC5kaXN0X2luZm86ZGlzdF9pbmZvCmVhc3lfaW5zdGFsbCA9IHNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGw6ZWFzeV9pbnN0YWxsCmVnZ19pbmZvID0gc2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvOmVnZ19pbmZvCmluc3RhbGwgPSBzZXR1cHRvb2xzLmNvbW1hbmQuaW5zdGFsbDppbnN0YWxsCmluc3RhbGxfZWdnX2luZm8gPSBzZXR1cHRvb2xzLmNvbW1hbmQuaW5zdGFsbF9lZ2dfaW5mbzppbnN0YWxsX2VnZ19pbmZvCmluc3RhbGxfbGliID0gc2V0dXB0b29scy5jb21tYW5kLmluc3RhbGxfbGliOmluc3RhbGxfbGliCmluc3RhbGxfc2NyaXB0cyA9IHNldHVwdG9vbHMuY29tbWFuZC5pbnN0YWxsX3NjcmlwdHM6aW5zdGFsbF9zY3JpcHRzCnJlZ2lzdGVyID0gc2V0dXB0b29scy5jb21tYW5kLnJlZ2lzdGVyOnJlZ2lzdGVyCnJvdGF0ZSA9IHNldHVwdG9vbHMuY29tbWFuZC5yb3RhdGU6cm90YXRlCnNhdmVvcHRzID0gc2V0dXB0b29scy5jb21tYW5kLnNhdmVvcHRzOnNhdmVvcHRzCnNkaXN0ID0gc2V0dXB0b29scy5jb21tYW5kLnNkaXN0OnNkaXN0CnNldG9wdCA9IHNldHVwdG9vbHMuY29tbWFuZC5zZXRvcHQ6c2V0b3B0CnRlc3QgPSBzZXR1cHRvb2xzLmNvbW1hbmQudGVzdDp0ZXN0CnVwbG9hZCA9IHNldHVwdG9vbHMuY29tbWFuZC51cGxvYWQ6dXBsb2FkCnVwbG9hZF9kb2NzID0gc2V0dXB0b29scy5jb21tYW5kLnVwbG9hZF9kb2NzOnVwbG9hZF9kb2NzCgpbZGlzdHV0aWxzLnNldHVwX2tleXdvcmRzXQpjb252ZXJ0XzJ0bzNfZG9jdGVzdHMgPSBzZXR1cHRvb2xzLmRpc3Q6YXNzZXJ0X3N0cmluZ19saXN0CmRlcGVuZGVuY3lfbGlua3MgPSBzZXR1cHRvb2xzLmRpc3Q6YXNzZXJ0X3N0cmluZ19saXN0CmVhZ2VyX3Jlc291cmNlcyA9IHNldHVwdG9vbHMuZGlzdDphc3NlcnRfc3RyaW5nX2xpc3QKZW50cnlfcG9pbnRzID0gc2V0dXB0b29scy5kaXN0OmNoZWNrX2VudHJ5X3BvaW50cwpleGNsdWRlX3BhY2thZ2VfZGF0YSA9IHNldHVwdG9vbHMuZGlzdDpjaGVja19wYWNrYWdlX2RhdGEKZXh0cmFzX3JlcXVpcmUgPSBzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfZXh0cmFzCmluY2x1ZGVfcGFja2FnZV9kYXRhID0gc2V0dXB0b29scy5kaXN0OmFzc2VydF9ib29sCmluc3RhbGxfcmVxdWlyZXMgPSBzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfcmVxdWlyZW1lbnRzCm5hbWVzcGFjZV9wYWNrYWdlcyA9IHNldHVwdG9vbHMuZGlzdDpjaGVja19uc3AKcGFja2FnZV9kYXRhID0gc2V0dXB0b29scy5kaXN0OmNoZWNrX3BhY2thZ2VfZGF0YQpwYWNrYWdlcyA9IHNldHVwdG9vbHMuZGlzdDpjaGVja19wYWNrYWdlcwpweXRob25fcmVxdWlyZXMgPSBzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfc3BlY2lmaWVyCnNldHVwX3JlcXVpcmVzID0gc2V0dXB0b29scy5kaXN0OmNoZWNrX3JlcXVpcmVtZW50cwp0ZXN0X2xvYWRlciA9IHNldHVwdG9vbHMuZGlzdDpjaGVja19pbXBvcnRhYmxlCnRlc3RfcnVubmVyID0gc2V0dXB0b29scy5kaXN0OmNoZWNrX2ltcG9ydGFibGUKdGVzdF9zdWl0ZSA9IHNldHVwdG9vbHMuZGlzdDpjaGVja190ZXN0X3N1aXRlCnRlc3RzX3JlcXVpcmUgPSBzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfcmVxdWlyZW1lbnRzCnVzZV8ydG8zID0gc2V0dXB0b29scy5kaXN0OmFzc2VydF9ib29sCnVzZV8ydG8zX2V4Y2x1ZGVfZml4ZXJzID0gc2V0dXB0b29scy5kaXN0OmFzc2VydF9zdHJpbmdfbGlzdAp1c2VfMnRvM19maXhlcnMgPSBzZXR1cHRvb2xzLmRpc3Q6YXNzZXJ0X3N0cmluZ19saXN0CnppcF9zYWZlID0gc2V0dXB0b29scy5kaXN0OmFzc2VydF9ib29sCgpbZWdnX2luZm8ud3JpdGVyc10KUEtHLUlORk8gPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86d3JpdGVfcGtnX2luZm8KZGVwZW5kZW5jeV9saW5rcy50eHQgPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86b3ZlcndyaXRlX2FyZwpkZXBlbmRzLnR4dCA9IHNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbzp3YXJuX2RlcGVuZHNfb2Jzb2xldGUKZWFnZXJfcmVzb3VyY2VzLnR4dCA9IHNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbzpvdmVyd3JpdGVfYXJnCmVudHJ5X3BvaW50cy50eHQgPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86d3JpdGVfZW50cmllcwpuYW1lc3BhY2VfcGFja2FnZXMudHh0ID0gc2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvOm92ZXJ3cml0ZV9hcmcKcmVxdWlyZXMudHh0ID0gc2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvOndyaXRlX3JlcXVpcmVtZW50cwp0b3BfbGV2ZWwudHh0ID0gc2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvOndyaXRlX3RvcGxldmVsX25hbWVzCgpbc2V0dXB0b29scy5pbnN0YWxsYXRpb25dCmVnZ3NlY3V0YWJsZSA9IHNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGw6Ym9vdHN0cmFwCgpQSwMEFAAAAAAAAAAhAPvWIPUlEwAAJRMAAEEAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzLTM4LjIuNC5kaXN0LWluZm8vbWV0YWRhdGEuanNvbnsiY2xhc3NpZmllcnMiOiBbIkRldmVsb3BtZW50IFN0YXR1cyA6OiA1IC0gUHJvZHVjdGlvbi9TdGFibGUiLCAiSW50ZW5kZWQgQXVkaWVuY2UgOjogRGV2ZWxvcGVycyIsICJMaWNlbnNlIDo6IE9TSSBBcHByb3ZlZCA6OiBNSVQgTGljZW5zZSIsICJPcGVyYXRpbmcgU3lzdGVtIDo6IE9TIEluZGVwZW5kZW50IiwgIlByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAyIiwgIlByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAyLjciLCAiUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMiLCAiUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuMyIsICJQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy40IiwgIlByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjUiLCAiUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuNiIsICJUb3BpYyA6OiBTb2Z0d2FyZSBEZXZlbG9wbWVudCA6OiBMaWJyYXJpZXMgOjogUHl0aG9uIE1vZHVsZXMiLCAiVG9waWMgOjogU3lzdGVtIDo6IEFyY2hpdmluZyA6OiBQYWNrYWdpbmciLCAiVG9waWMgOjogU3lzdGVtIDo6IFN5c3RlbXMgQWRtaW5pc3RyYXRpb24iLCAiVG9waWMgOjogVXRpbGl0aWVzIl0sICJkZXNjcmlwdGlvbl9jb250ZW50X3R5cGUiOiAidGV4dC94LXJzdDsgY2hhcnNldD1VVEYtOCIsICJleHRlbnNpb25zIjogeyJweXRob24uY29tbWFuZHMiOiB7IndyYXBfY29uc29sZSI6IHsiZWFzeV9pbnN0YWxsIjogInNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGw6bWFpbiIsICJlYXN5X2luc3RhbGwtMy42IjogInNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGw6bWFpbiJ9fSwgInB5dGhvbi5kZXRhaWxzIjogeyJjb250YWN0cyI6IFt7ImVtYWlsIjogImRpc3R1dGlscy1zaWdAcHl0aG9uLm9yZyIsICJuYW1lIjogIlB5dGhvbiBQYWNrYWdpbmcgQXV0aG9yaXR5IiwgInJvbGUiOiAiYXV0aG9yIn1dLCAiZG9jdW1lbnRfbmFtZXMiOiB7ImRlc2NyaXB0aW9uIjogIkRFU0NSSVBUSU9OLnJzdCIsICJsaWNlbnNlIjogIkxJQ0VOU0UudHh0In0sICJwcm9qZWN0X3VybHMiOiB7IkhvbWUiOiAiaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvc2V0dXB0b29scyJ9fSwgInB5dGhvbi5leHBvcnRzIjogeyJjb25zb2xlX3NjcmlwdHMiOiB7ImVhc3lfaW5zdGFsbCI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuZWFzeV9pbnN0YWxsOm1haW4iLCAiZWFzeV9pbnN0YWxsLTMuNiI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuZWFzeV9pbnN0YWxsOm1haW4ifSwgImRpc3R1dGlscy5jb21tYW5kcyI6IHsiYWxpYXMiOiAic2V0dXB0b29scy5jb21tYW5kLmFsaWFzOmFsaWFzIiwgImJkaXN0X2VnZyI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuYmRpc3RfZWdnOmJkaXN0X2VnZyIsICJiZGlzdF9ycG0iOiAic2V0dXB0b29scy5jb21tYW5kLmJkaXN0X3JwbTpiZGlzdF9ycG0iLCAiYmRpc3Rfd2luaW5zdCI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuYmRpc3Rfd2luaW5zdDpiZGlzdF93aW5pbnN0IiwgImJ1aWxkX2NsaWIiOiAic2V0dXB0b29scy5jb21tYW5kLmJ1aWxkX2NsaWI6YnVpbGRfY2xpYiIsICJidWlsZF9leHQiOiAic2V0dXB0b29scy5jb21tYW5kLmJ1aWxkX2V4dDpidWlsZF9leHQiLCAiYnVpbGRfcHkiOiAic2V0dXB0b29scy5jb21tYW5kLmJ1aWxkX3B5OmJ1aWxkX3B5IiwgImRldmVsb3AiOiAic2V0dXB0b29scy5jb21tYW5kLmRldmVsb3A6ZGV2ZWxvcCIsICJkaXN0X2luZm8iOiAic2V0dXB0b29scy5jb21tYW5kLmRpc3RfaW5mbzpkaXN0X2luZm8iLCAiZWFzeV9pbnN0YWxsIjogInNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGw6ZWFzeV9pbnN0YWxsIiwgImVnZ19pbmZvIjogInNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbzplZ2dfaW5mbyIsICJpbnN0YWxsIjogInNldHVwdG9vbHMuY29tbWFuZC5pbnN0YWxsOmluc3RhbGwiLCAiaW5zdGFsbF9lZ2dfaW5mbyI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuaW5zdGFsbF9lZ2dfaW5mbzppbnN0YWxsX2VnZ19pbmZvIiwgImluc3RhbGxfbGliIjogInNldHVwdG9vbHMuY29tbWFuZC5pbnN0YWxsX2xpYjppbnN0YWxsX2xpYiIsICJpbnN0YWxsX3NjcmlwdHMiOiAic2V0dXB0b29scy5jb21tYW5kLmluc3RhbGxfc2NyaXB0czppbnN0YWxsX3NjcmlwdHMiLCAicmVnaXN0ZXIiOiAic2V0dXB0b29scy5jb21tYW5kLnJlZ2lzdGVyOnJlZ2lzdGVyIiwgInJvdGF0ZSI6ICJzZXR1cHRvb2xzLmNvbW1hbmQucm90YXRlOnJvdGF0ZSIsICJzYXZlb3B0cyI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuc2F2ZW9wdHM6c2F2ZW9wdHMiLCAic2Rpc3QiOiAic2V0dXB0b29scy5jb21tYW5kLnNkaXN0OnNkaXN0IiwgInNldG9wdCI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuc2V0b3B0OnNldG9wdCIsICJ0ZXN0IjogInNldHVwdG9vbHMuY29tbWFuZC50ZXN0OnRlc3QiLCAidXBsb2FkIjogInNldHVwdG9vbHMuY29tbWFuZC51cGxvYWQ6dXBsb2FkIiwgInVwbG9hZF9kb2NzIjogInNldHVwdG9vbHMuY29tbWFuZC51cGxvYWRfZG9jczp1cGxvYWRfZG9jcyJ9LCAiZGlzdHV0aWxzLnNldHVwX2tleXdvcmRzIjogeyJjb252ZXJ0XzJ0bzNfZG9jdGVzdHMiOiAic2V0dXB0b29scy5kaXN0OmFzc2VydF9zdHJpbmdfbGlzdCIsICJkZXBlbmRlbmN5X2xpbmtzIjogInNldHVwdG9vbHMuZGlzdDphc3NlcnRfc3RyaW5nX2xpc3QiLCAiZWFnZXJfcmVzb3VyY2VzIjogInNldHVwdG9vbHMuZGlzdDphc3NlcnRfc3RyaW5nX2xpc3QiLCAiZW50cnlfcG9pbnRzIjogInNldHVwdG9vbHMuZGlzdDpjaGVja19lbnRyeV9wb2ludHMiLCAiZXhjbHVkZV9wYWNrYWdlX2RhdGEiOiAic2V0dXB0b29scy5kaXN0OmNoZWNrX3BhY2thZ2VfZGF0YSIsICJleHRyYXNfcmVxdWlyZSI6ICJzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfZXh0cmFzIiwgImluY2x1ZGVfcGFja2FnZV9kYXRhIjogInNldHVwdG9vbHMuZGlzdDphc3NlcnRfYm9vbCIsICJpbnN0YWxsX3JlcXVpcmVzIjogInNldHVwdG9vbHMuZGlzdDpjaGVja19yZXF1aXJlbWVudHMiLCAibmFtZXNwYWNlX3BhY2thZ2VzIjogInNldHVwdG9vbHMuZGlzdDpjaGVja19uc3AiLCAicGFja2FnZV9kYXRhIjogInNldHVwdG9vbHMuZGlzdDpjaGVja19wYWNrYWdlX2RhdGEiLCAicGFja2FnZXMiOiAic2V0dXB0b29scy5kaXN0OmNoZWNrX3BhY2thZ2VzIiwgInB5dGhvbl9yZXF1aXJlcyI6ICJzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfc3BlY2lmaWVyIiwgInNldHVwX3JlcXVpcmVzIjogInNldHVwdG9vbHMuZGlzdDpjaGVja19yZXF1aXJlbWVudHMiLCAidGVzdF9sb2FkZXIiOiAic2V0dXB0b29scy5kaXN0OmNoZWNrX2ltcG9ydGFibGUiLCAidGVzdF9ydW5uZXIiOiAic2V0dXB0b29scy5kaXN0OmNoZWNrX2ltcG9ydGFibGUiLCAidGVzdF9zdWl0ZSI6ICJzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfdGVzdF9zdWl0ZSIsICJ0ZXN0c19yZXF1aXJlIjogInNldHVwdG9vbHMuZGlzdDpjaGVja19yZXF1aXJlbWVudHMiLCAidXNlXzJ0bzMiOiAic2V0dXB0b29scy5kaXN0OmFzc2VydF9ib29sIiwgInVzZV8ydG8zX2V4Y2x1ZGVfZml4ZXJzIjogInNldHVwdG9vbHMuZGlzdDphc3NlcnRfc3RyaW5nX2xpc3QiLCAidXNlXzJ0bzNfZml4ZXJzIjogInNldHVwdG9vbHMuZGlzdDphc3NlcnRfc3RyaW5nX2xpc3QiLCAiemlwX3NhZmUiOiAic2V0dXB0b29scy5kaXN0OmFzc2VydF9ib29sIn0sICJlZ2dfaW5mby53cml0ZXJzIjogeyJQS0ctSU5GTyI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86d3JpdGVfcGtnX2luZm8iLCAiZGVwZW5kZW5jeV9saW5rcy50eHQiOiAic2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvOm92ZXJ3cml0ZV9hcmciLCAiZGVwZW5kcy50eHQiOiAic2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvOndhcm5fZGVwZW5kc19vYnNvbGV0ZSIsICJlYWdlcl9yZXNvdXJjZXMudHh0IjogInNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbzpvdmVyd3JpdGVfYXJnIiwgImVudHJ5X3BvaW50cy50eHQiOiAic2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvOndyaXRlX2VudHJpZXMiLCAibmFtZXNwYWNlX3BhY2thZ2VzLnR4dCI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86b3ZlcndyaXRlX2FyZyIsICJyZXF1aXJlcy50eHQiOiAic2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvOndyaXRlX3JlcXVpcmVtZW50cyIsICJ0b3BfbGV2ZWwudHh0IjogInNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbzp3cml0ZV90b3BsZXZlbF9uYW1lcyJ9LCAic2V0dXB0b29scy5pbnN0YWxsYXRpb24iOiB7ImVnZ3NlY3V0YWJsZSI6ICJzZXR1cHRvb2xzLmNvbW1hbmQuZWFzeV9pbnN0YWxsOmJvb3RzdHJhcCJ9fX0sICJleHRyYXMiOiBbImNlcnRzIiwgInNzbCJdLCAiZ2VuZXJhdG9yIjogImJkaXN0X3doZWVsICgwLjMwLjApIiwgImtleXdvcmRzIjogWyJDUEFOIiwgIlB5UEkiLCAiZGlzdHV0aWxzIiwgImVnZ3MiLCAicGFja2FnZSIsICJtYW5hZ2VtZW50Il0sICJtZXRhZGF0YV92ZXJzaW9uIjogIjIuMCIsICJuYW1lIjogInNldHVwdG9vbHMiLCAicmVxdWlyZXNfcHl0aG9uIjogIj49Mi43LCE9My4wLiosIT0zLjEuKiwhPTMuMi4qIiwgInJ1bl9yZXF1aXJlcyI6IFt7ImV4dHJhIjogImNlcnRzIiwgInJlcXVpcmVzIjogWyJjZXJ0aWZpICg9PTIwMTYuOS4yNikiXX0sIHsiZW52aXJvbm1lbnQiOiAic3lzX3BsYXRmb3JtPT0nd2luMzInIiwgImV4dHJhIjogInNzbCIsICJyZXF1aXJlcyI6IFsid2luY2VydHN0b3JlICg9PTAuMikiXX1dLCAic3VtbWFyeSI6ICJFYXNpbHkgZG93bmxvYWQsIGJ1aWxkLCBpbnN0YWxsLCB1cGdyYWRlLCBhbmQgdW5pbnN0YWxsIFB5dGhvbiBwYWNrYWdlcyIsICJ2ZXJzaW9uIjogIjM4LjIuNCJ9UEsDBBQAAAAAAAAAIQAwXAGRJgAAACYAAABBAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL3RvcF9sZXZlbC50eHRlYXN5X2luc3RhbGwKcGtnX3Jlc291cmNlcwpzZXR1cHRvb2xzClBLAwQUAAAAAAAAACEAkwbXMgEAAAABAAAAPAAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMtMzguMi40LmRpc3QtaW5mby96aXAtc2FmZQpQSwMEFAAAAAAAAAAhACMLSgNEFgAARBYAAC4AAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL19faW5pdF9fLnB5IiIiRXh0ZW5zaW9ucyB0byB0aGUgJ2Rpc3R1dGlscycgZm9yIGxhcmdlIG9yIGNvbXBsZXggZGlzdHJpYnV0aW9ucyIiIgoKaW1wb3J0IG9zCmltcG9ydCBmdW5jdG9vbHMKaW1wb3J0IGRpc3R1dGlscy5jb3JlCmltcG9ydCBkaXN0dXRpbHMuZmlsZWxpc3QKZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgY29udmVydF9wYXRoCmZyb20gZm5tYXRjaCBpbXBvcnQgZm5tYXRjaGNhc2UKCmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCBmaWx0ZXIsIG1hcAoKaW1wb3J0IHNldHVwdG9vbHMudmVyc2lvbgpmcm9tIHNldHVwdG9vbHMuZXh0ZW5zaW9uIGltcG9ydCBFeHRlbnNpb24KZnJvbSBzZXR1cHRvb2xzLmRpc3QgaW1wb3J0IERpc3RyaWJ1dGlvbiwgRmVhdHVyZQpmcm9tIHNldHVwdG9vbHMuZGVwZW5kcyBpbXBvcnQgUmVxdWlyZQpmcm9tIC4gaW1wb3J0IG1vbmtleQoKX19hbGxfXyA9IFsKICAgICdzZXR1cCcsICdEaXN0cmlidXRpb24nLCAnRmVhdHVyZScsICdDb21tYW5kJywgJ0V4dGVuc2lvbicsICdSZXF1aXJlJywKICAgICdmaW5kX3BhY2thZ2VzJywKXQoKX192ZXJzaW9uX18gPSBzZXR1cHRvb2xzLnZlcnNpb24uX192ZXJzaW9uX18KCmJvb3RzdHJhcF9pbnN0YWxsX2Zyb20gPSBOb25lCgojIElmIHdlIHJ1biAydG8zIG9uIC5weSBmaWxlcywgc2hvdWxkIHdlIGFsc28gY29udmVydCBkb2NzdHJpbmdzPwojIERlZmF1bHQ6IHllczsgYXNzdW1lIHRoYXQgd2UgY2FuIGRldGVjdCBkb2N0ZXN0cyByZWxpYWJseQpydW5fMnRvM19vbl9kb2N0ZXN0cyA9IFRydWUKIyBTdGFuZGFyZCBwYWNrYWdlIG5hbWVzIGZvciBmaXhlciBwYWNrYWdlcwpsaWIydG8zX2ZpeGVyX3BhY2thZ2VzID0gWydsaWIydG8zLmZpeGVzJ10KCgpjbGFzcyBQYWNrYWdlRmluZGVyKG9iamVjdCk6CiAgICAiIiIKICAgIEdlbmVyYXRlIGEgbGlzdCBvZiBhbGwgUHl0aG9uIHBhY2thZ2VzIGZvdW5kIHdpdGhpbiBhIGRpcmVjdG9yeQogICAgIiIiCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZmluZChjbHMsIHdoZXJlPScuJywgZXhjbHVkZT0oKSwgaW5jbHVkZT0oJyonLCkpOgogICAgICAgICIiIlJldHVybiBhIGxpc3QgYWxsIFB5dGhvbiBwYWNrYWdlcyBmb3VuZCB3aXRoaW4gZGlyZWN0b3J5ICd3aGVyZScKCiAgICAgICAgJ3doZXJlJyBpcyB0aGUgcm9vdCBkaXJlY3Rvcnkgd2hpY2ggd2lsbCBiZSBzZWFyY2hlZCBmb3IgcGFja2FnZXMuICBJdAogICAgICAgIHNob3VsZCBiZSBzdXBwbGllZCBhcyBhICJjcm9zcy1wbGF0Zm9ybSIgKGkuZS4gVVJMLXN0eWxlKSBwYXRoOyBpdCB3aWxsCiAgICAgICAgYmUgY29udmVydGVkIHRvIHRoZSBhcHByb3ByaWF0ZSBsb2NhbCBwYXRoIHN5bnRheC4KCiAgICAgICAgJ2V4Y2x1ZGUnIGlzIGEgc2VxdWVuY2Ugb2YgcGFja2FnZSBuYW1lcyB0byBleGNsdWRlOyAnKicgY2FuIGJlIHVzZWQKICAgICAgICBhcyBhIHdpbGRjYXJkIGluIHRoZSBuYW1lcywgc3VjaCB0aGF0ICdmb28uKicgd2lsbCBleGNsdWRlIGFsbAogICAgICAgIHN1YnBhY2thZ2VzIG9mICdmb28nIChidXQgbm90ICdmb28nIGl0c2VsZikuCgogICAgICAgICdpbmNsdWRlJyBpcyBhIHNlcXVlbmNlIG9mIHBhY2thZ2UgbmFtZXMgdG8gaW5jbHVkZS4gIElmIGl0J3MKICAgICAgICBzcGVjaWZpZWQsIG9ubHkgdGhlIG5hbWVkIHBhY2thZ2VzIHdpbGwgYmUgaW5jbHVkZWQuICBJZiBpdCdzIG5vdAogICAgICAgIHNwZWNpZmllZCwgYWxsIGZvdW5kIHBhY2thZ2VzIHdpbGwgYmUgaW5jbHVkZWQuICAnaW5jbHVkZScgY2FuIGNvbnRhaW4KICAgICAgICBzaGVsbCBzdHlsZSB3aWxkY2FyZCBwYXR0ZXJucyBqdXN0IGxpa2UgJ2V4Y2x1ZGUnLgogICAgICAgICIiIgoKICAgICAgICByZXR1cm4gbGlzdChjbHMuX2ZpbmRfcGFja2FnZXNfaXRlcigKICAgICAgICAgICAgY29udmVydF9wYXRoKHdoZXJlKSwKICAgICAgICAgICAgY2xzLl9idWlsZF9maWx0ZXIoJ2V6X3NldHVwJywgJypfX3B5Y2FjaGVfXycsICpleGNsdWRlKSwKICAgICAgICAgICAgY2xzLl9idWlsZF9maWx0ZXIoKmluY2x1ZGUpKSkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfZmluZF9wYWNrYWdlc19pdGVyKGNscywgd2hlcmUsIGV4Y2x1ZGUsIGluY2x1ZGUpOgogICAgICAgICIiIgogICAgICAgIEFsbCB0aGUgcGFja2FnZXMgZm91bmQgaW4gJ3doZXJlJyB0aGF0IHBhc3MgdGhlICdpbmNsdWRlJyBmaWx0ZXIsIGJ1dAogICAgICAgIG5vdCB0aGUgJ2V4Y2x1ZGUnIGZpbHRlci4KICAgICAgICAiIiIKICAgICAgICBmb3Igcm9vdCwgZGlycywgZmlsZXMgaW4gb3Mud2Fsayh3aGVyZSwgZm9sbG93bGlua3M9VHJ1ZSk6CiAgICAgICAgICAgICMgQ29weSBkaXJzIHRvIGl0ZXJhdGUgb3ZlciBpdCwgdGhlbiBlbXB0eSBkaXJzLgogICAgICAgICAgICBhbGxfZGlycyA9IGRpcnNbOl0KICAgICAgICAgICAgZGlyc1s6XSA9IFtdCgogICAgICAgICAgICBmb3IgZGlyIGluIGFsbF9kaXJzOgogICAgICAgICAgICAgICAgZnVsbF9wYXRoID0gb3MucGF0aC5qb2luKHJvb3QsIGRpcikKICAgICAgICAgICAgICAgIHJlbF9wYXRoID0gb3MucGF0aC5yZWxwYXRoKGZ1bGxfcGF0aCwgd2hlcmUpCiAgICAgICAgICAgICAgICBwYWNrYWdlID0gcmVsX3BhdGgucmVwbGFjZShvcy5wYXRoLnNlcCwgJy4nKQoKICAgICAgICAgICAgICAgICMgU2tpcCBkaXJlY3RvcnkgdHJlZXMgdGhhdCBhcmUgbm90IHZhbGlkIHBhY2thZ2VzCiAgICAgICAgICAgICAgICBpZiAoJy4nIGluIGRpciBvciBub3QgY2xzLl9sb29rc19saWtlX3BhY2thZ2UoZnVsbF9wYXRoKSk6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgICAgICAjIFNob3VsZCB0aGlzIHBhY2thZ2UgYmUgaW5jbHVkZWQ/CiAgICAgICAgICAgICAgICBpZiBpbmNsdWRlKHBhY2thZ2UpIGFuZCBub3QgZXhjbHVkZShwYWNrYWdlKToKICAgICAgICAgICAgICAgICAgICB5aWVsZCBwYWNrYWdlCgogICAgICAgICAgICAgICAgIyBLZWVwIHNlYXJjaGluZyBzdWJkaXJlY3RvcmllcywgYXMgdGhlcmUgbWF5IGJlIG1vcmUgcGFja2FnZXMKICAgICAgICAgICAgICAgICMgZG93biB0aGVyZSwgZXZlbiBpZiB0aGUgcGFyZW50IHdhcyBleGNsdWRlZC4KICAgICAgICAgICAgICAgIGRpcnMuYXBwZW5kKGRpcikKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2xvb2tzX2xpa2VfcGFja2FnZShwYXRoKToKICAgICAgICAiIiJEb2VzIGEgZGlyZWN0b3J5IGxvb2sgbGlrZSBhIHBhY2thZ2U/IiIiCiAgICAgICAgcmV0dXJuIG9zLnBhdGguaXNmaWxlKG9zLnBhdGguam9pbihwYXRoLCAnX19pbml0X18ucHknKSkKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2J1aWxkX2ZpbHRlcigqcGF0dGVybnMpOgogICAgICAgICIiIgogICAgICAgIEdpdmVuIGEgbGlzdCBvZiBwYXR0ZXJucywgcmV0dXJuIGEgY2FsbGFibGUgdGhhdCB3aWxsIGJlIHRydWUgb25seSBpZgogICAgICAgIHRoZSBpbnB1dCBtYXRjaGVzIGF0IGxlYXN0IG9uZSBvZiB0aGUgcGF0dGVybnMuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGxhbWJkYSBuYW1lOiBhbnkoZm5tYXRjaGNhc2UobmFtZSwgcGF0PXBhdCkgZm9yIHBhdCBpbiBwYXR0ZXJucykKCgpjbGFzcyBQRVA0MjBQYWNrYWdlRmluZGVyKFBhY2thZ2VGaW5kZXIpOgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9sb29rc19saWtlX3BhY2thZ2UocGF0aCk6CiAgICAgICAgcmV0dXJuIFRydWUKCgpmaW5kX3BhY2thZ2VzID0gUGFja2FnZUZpbmRlci5maW5kCgoKZGVmIF9pbnN0YWxsX3NldHVwX3JlcXVpcmVzKGF0dHJzKToKICAgICMgTm90ZTogZG8gbm90IHVzZSBgc2V0dXB0b29scy5EaXN0cmlidXRpb25gIGRpcmVjdGx5LCBhcwogICAgIyBvdXIgUEVQIDUxNyBiYWNrZW5kIHBhdGNoIGBkaXN0dXRpbHMuY29yZS5EaXN0cmlidXRpb25gLgogICAgZGlzdCA9IGRpc3R1dGlscy5jb3JlLkRpc3RyaWJ1dGlvbihkaWN0KAogICAgICAgIChrLCB2KSBmb3IgaywgdiBpbiBhdHRycy5pdGVtcygpCiAgICAgICAgaWYgayBpbiAoJ2RlcGVuZGVuY3lfbGlua3MnLCAnc2V0dXBfcmVxdWlyZXMnKQogICAgKSkKICAgICMgSG9ub3Igc2V0dXAuY2ZnJ3Mgb3B0aW9ucy4KICAgIGRpc3QucGFyc2VfY29uZmlnX2ZpbGVzKGlnbm9yZV9vcHRpb25fZXJyb3JzPVRydWUpCiAgICBpZiBkaXN0LnNldHVwX3JlcXVpcmVzOgogICAgICAgIGRpc3QuZmV0Y2hfYnVpbGRfZWdncyhkaXN0LnNldHVwX3JlcXVpcmVzKQoKCmRlZiBzZXR1cCgqKmF0dHJzKToKICAgICMgTWFrZSBzdXJlIHdlIGhhdmUgYW55IHJlcXVpcmVtZW50cyBuZWVkZWQgdG8gaW50ZXJwcmV0ICdhdHRycycuCiAgICBfaW5zdGFsbF9zZXR1cF9yZXF1aXJlcyhhdHRycykKICAgIHJldHVybiBkaXN0dXRpbHMuY29yZS5zZXR1cCgqKmF0dHJzKQoKc2V0dXAuX19kb2NfXyA9IGRpc3R1dGlscy5jb3JlLnNldHVwLl9fZG9jX18KCgpfQ29tbWFuZCA9IG1vbmtleS5nZXRfdW5wYXRjaGVkKGRpc3R1dGlscy5jb3JlLkNvbW1hbmQpCgoKY2xhc3MgQ29tbWFuZChfQ29tbWFuZCk6CiAgICBfX2RvY19fID0gX0NvbW1hbmQuX19kb2NfXwoKICAgIGNvbW1hbmRfY29uc3VtZXNfYXJndW1lbnRzID0gRmFsc2UKCiAgICBkZWYgX19pbml0X18oc2VsZiwgZGlzdCwgKiprdyk6CiAgICAgICAgIiIiCiAgICAgICAgQ29uc3RydWN0IHRoZSBjb21tYW5kIGZvciBkaXN0LCB1cGRhdGluZwogICAgICAgIHZhcnMoc2VsZikgd2l0aCBhbnkga2V5d29yZCBwYXJhbWV0ZXJzLgogICAgICAgICIiIgogICAgICAgIF9Db21tYW5kLl9faW5pdF9fKHNlbGYsIGRpc3QpCiAgICAgICAgdmFycyhzZWxmKS51cGRhdGUoa3cpCgogICAgZGVmIHJlaW5pdGlhbGl6ZV9jb21tYW5kKHNlbGYsIGNvbW1hbmQsIHJlaW5pdF9zdWJjb21tYW5kcz0wLCAqKmt3KToKICAgICAgICBjbWQgPSBfQ29tbWFuZC5yZWluaXRpYWxpemVfY29tbWFuZChzZWxmLCBjb21tYW5kLCByZWluaXRfc3ViY29tbWFuZHMpCiAgICAgICAgdmFycyhjbWQpLnVwZGF0ZShrdykKICAgICAgICByZXR1cm4gY21kCgoKZGVmIF9maW5kX2FsbF9zaW1wbGUocGF0aCk6CiAgICAiIiIKICAgIEZpbmQgYWxsIGZpbGVzIHVuZGVyICdwYXRoJwogICAgIiIiCiAgICByZXN1bHRzID0gKAogICAgICAgIG9zLnBhdGguam9pbihiYXNlLCBmaWxlKQogICAgICAgIGZvciBiYXNlLCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKHBhdGgsIGZvbGxvd2xpbmtzPVRydWUpCiAgICAgICAgZm9yIGZpbGUgaW4gZmlsZXMKICAgICkKICAgIHJldHVybiBmaWx0ZXIob3MucGF0aC5pc2ZpbGUsIHJlc3VsdHMpCgoKZGVmIGZpbmRhbGwoZGlyPW9zLmN1cmRpcik6CiAgICAiIiIKICAgIEZpbmQgYWxsIGZpbGVzIHVuZGVyICdkaXInIGFuZCByZXR1cm4gdGhlIGxpc3Qgb2YgZnVsbCBmaWxlbmFtZXMuCiAgICBVbmxlc3MgZGlyIGlzICcuJywgcmV0dXJuIGZ1bGwgZmlsZW5hbWVzIHdpdGggZGlyIHByZXBlbmRlZC4KICAgICIiIgogICAgZmlsZXMgPSBfZmluZF9hbGxfc2ltcGxlKGRpcikKICAgIGlmIGRpciA9PSBvcy5jdXJkaXI6CiAgICAgICAgbWFrZV9yZWwgPSBmdW5jdG9vbHMucGFydGlhbChvcy5wYXRoLnJlbHBhdGgsIHN0YXJ0PWRpcikKICAgICAgICBmaWxlcyA9IG1hcChtYWtlX3JlbCwgZmlsZXMpCiAgICByZXR1cm4gbGlzdChmaWxlcykKCgptb25rZXkucGF0Y2hfYWxsKCkKUEsDBBQAAAAAAAAAIQClh2VRwBkAAMAZAAAyAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9hcmNoaXZlX3V0aWwucHkiIiJVdGlsaXRpZXMgZm9yIGV4dHJhY3RpbmcgY29tbW9uIGFyY2hpdmUgZm9ybWF0cyIiIgoKaW1wb3J0IHppcGZpbGUKaW1wb3J0IHRhcmZpbGUKaW1wb3J0IG9zCmltcG9ydCBzaHV0aWwKaW1wb3J0IHBvc2l4cGF0aAppbXBvcnQgY29udGV4dGxpYgpmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0Vycm9yCgpmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IGVuc3VyZV9kaXJlY3RvcnkKCl9fYWxsX18gPSBbCiAgICAidW5wYWNrX2FyY2hpdmUiLCAidW5wYWNrX3ppcGZpbGUiLCAidW5wYWNrX3RhcmZpbGUiLCAiZGVmYXVsdF9maWx0ZXIiLAogICAgIlVucmVjb2duaXplZEZvcm1hdCIsICJleHRyYWN0aW9uX2RyaXZlcnMiLCAidW5wYWNrX2RpcmVjdG9yeSIsCl0KCgpjbGFzcyBVbnJlY29nbml6ZWRGb3JtYXQoRGlzdHV0aWxzRXJyb3IpOgogICAgIiIiQ291bGRuJ3QgcmVjb2duaXplIHRoZSBhcmNoaXZlIHR5cGUiIiIKCgpkZWYgZGVmYXVsdF9maWx0ZXIoc3JjLCBkc3QpOgogICAgIiIiVGhlIGRlZmF1bHQgcHJvZ3Jlc3MvZmlsdGVyIGNhbGxiYWNrOyByZXR1cm5zIFRydWUgZm9yIGFsbCBmaWxlcyIiIgogICAgcmV0dXJuIGRzdAoKCmRlZiB1bnBhY2tfYXJjaGl2ZShmaWxlbmFtZSwgZXh0cmFjdF9kaXIsIHByb2dyZXNzX2ZpbHRlcj1kZWZhdWx0X2ZpbHRlciwKICAgICAgICBkcml2ZXJzPU5vbmUpOgogICAgIiIiVW5wYWNrIGBmaWxlbmFtZWAgdG8gYGV4dHJhY3RfZGlyYCwgb3IgcmFpc2UgYGBVbnJlY29nbml6ZWRGb3JtYXRgYAoKICAgIGBwcm9ncmVzc19maWx0ZXJgIGlzIGEgZnVuY3Rpb24gdGFraW5nIHR3byBhcmd1bWVudHM6IGEgc291cmNlIHBhdGgKICAgIGludGVybmFsIHRvIHRoZSBhcmNoaXZlICgnLyctc2VwYXJhdGVkKSwgYW5kIGEgZmlsZXN5c3RlbSBwYXRoIHdoZXJlIGl0CiAgICB3aWxsIGJlIGV4dHJhY3RlZC4gIFRoZSBjYWxsYmFjayBtdXN0IHJldHVybiB0aGUgZGVzaXJlZCBleHRyYWN0IHBhdGgKICAgICh3aGljaCBtYXkgYmUgdGhlIHNhbWUgYXMgdGhlIG9uZSBwYXNzZWQgaW4pLCBvciBlbHNlIGBgTm9uZWBgIHRvIHNraXAKICAgIHRoYXQgZmlsZSBvciBkaXJlY3RvcnkuICBUaGUgY2FsbGJhY2sgY2FuIHRodXMgYmUgdXNlZCB0byByZXBvcnQgb24gdGhlCiAgICBwcm9ncmVzcyBvZiB0aGUgZXh0cmFjdGlvbiwgYXMgd2VsbCBhcyB0byBmaWx0ZXIgdGhlIGl0ZW1zIGV4dHJhY3RlZCBvcgogICAgYWx0ZXIgdGhlaXIgZXh0cmFjdGlvbiBwYXRocy4KCiAgICBgZHJpdmVyc2AsIGlmIHN1cHBsaWVkLCBtdXN0IGJlIGEgbm9uLWVtcHR5IHNlcXVlbmNlIG9mIGZ1bmN0aW9ucyB3aXRoIHRoZQogICAgc2FtZSBzaWduYXR1cmUgYXMgdGhpcyBmdW5jdGlvbiAobWludXMgdGhlIGBkcml2ZXJzYCBhcmd1bWVudCksIHRoYXQgcmFpc2UKICAgIGBgVW5yZWNvZ25pemVkRm9ybWF0YGAgaWYgdGhleSBkbyBub3Qgc3VwcG9ydCBleHRyYWN0aW5nIHRoZSBkZXNpZ25hdGVkCiAgICBhcmNoaXZlIHR5cGUuICBUaGUgYGRyaXZlcnNgIGFyZSB0cmllZCBpbiBzZXF1ZW5jZSB1bnRpbCBvbmUgaXMgZm91bmQgdGhhdAogICAgZG9lcyBub3QgcmFpc2UgYW4gZXJyb3IsIG9yIHVudGlsIGFsbCBhcmUgZXhoYXVzdGVkIChpbiB3aGljaCBjYXNlCiAgICBgYFVucmVjb2duaXplZEZvcm1hdGBgIGlzIHJhaXNlZCkuICBJZiB5b3UgZG8gbm90IHN1cHBseSBhIHNlcXVlbmNlIG9mCiAgICBkcml2ZXJzLCB0aGUgbW9kdWxlJ3MgYGBleHRyYWN0aW9uX2RyaXZlcnNgYCBjb25zdGFudCB3aWxsIGJlIHVzZWQsIHdoaWNoCiAgICBtZWFucyB0aGF0IGBgdW5wYWNrX3ppcGZpbGVgYCBhbmQgYGB1bnBhY2tfdGFyZmlsZWBgIHdpbGwgYmUgdHJpZWQsIGluIHRoYXQKICAgIG9yZGVyLgogICAgIiIiCiAgICBmb3IgZHJpdmVyIGluIGRyaXZlcnMgb3IgZXh0cmFjdGlvbl9kcml2ZXJzOgogICAgICAgIHRyeToKICAgICAgICAgICAgZHJpdmVyKGZpbGVuYW1lLCBleHRyYWN0X2RpciwgcHJvZ3Jlc3NfZmlsdGVyKQogICAgICAgIGV4Y2VwdCBVbnJlY29nbml6ZWRGb3JtYXQ6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuCiAgICBlbHNlOgogICAgICAgIHJhaXNlIFVucmVjb2duaXplZEZvcm1hdCgKICAgICAgICAgICAgIk5vdCBhIHJlY29nbml6ZWQgYXJjaGl2ZSB0eXBlOiAlcyIgJSBmaWxlbmFtZQogICAgICAgICkKCgpkZWYgdW5wYWNrX2RpcmVjdG9yeShmaWxlbmFtZSwgZXh0cmFjdF9kaXIsIHByb2dyZXNzX2ZpbHRlcj1kZWZhdWx0X2ZpbHRlcik6CiAgICAiIiIiVW5wYWNrIiBhIGRpcmVjdG9yeSwgdXNpbmcgdGhlIHNhbWUgaW50ZXJmYWNlIGFzIGZvciBhcmNoaXZlcwoKICAgIFJhaXNlcyBgYFVucmVjb2duaXplZEZvcm1hdGBgIGlmIGBmaWxlbmFtZWAgaXMgbm90IGEgZGlyZWN0b3J5CiAgICAiIiIKICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGZpbGVuYW1lKToKICAgICAgICByYWlzZSBVbnJlY29nbml6ZWRGb3JtYXQoIiVzIGlzIG5vdCBhIGRpcmVjdG9yeSIgJSBmaWxlbmFtZSkKCiAgICBwYXRocyA9IHsKICAgICAgICBmaWxlbmFtZTogKCcnLCBleHRyYWN0X2RpciksCiAgICB9CiAgICBmb3IgYmFzZSwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhmaWxlbmFtZSk6CiAgICAgICAgc3JjLCBkc3QgPSBwYXRoc1tiYXNlXQogICAgICAgIGZvciBkIGluIGRpcnM6CiAgICAgICAgICAgIHBhdGhzW29zLnBhdGguam9pbihiYXNlLCBkKV0gPSBzcmMgKyBkICsgJy8nLCBvcy5wYXRoLmpvaW4oZHN0LCBkKQogICAgICAgIGZvciBmIGluIGZpbGVzOgogICAgICAgICAgICB0YXJnZXQgPSBvcy5wYXRoLmpvaW4oZHN0LCBmKQogICAgICAgICAgICB0YXJnZXQgPSBwcm9ncmVzc19maWx0ZXIoc3JjICsgZiwgdGFyZ2V0KQogICAgICAgICAgICBpZiBub3QgdGFyZ2V0OgogICAgICAgICAgICAgICAgIyBza2lwIG5vbi1maWxlcwogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgZW5zdXJlX2RpcmVjdG9yeSh0YXJnZXQpCiAgICAgICAgICAgIGYgPSBvcy5wYXRoLmpvaW4oYmFzZSwgZikKICAgICAgICAgICAgc2h1dGlsLmNvcHlmaWxlKGYsIHRhcmdldCkKICAgICAgICAgICAgc2h1dGlsLmNvcHlzdGF0KGYsIHRhcmdldCkKCgpkZWYgdW5wYWNrX3ppcGZpbGUoZmlsZW5hbWUsIGV4dHJhY3RfZGlyLCBwcm9ncmVzc19maWx0ZXI9ZGVmYXVsdF9maWx0ZXIpOgogICAgIiIiVW5wYWNrIHppcCBgZmlsZW5hbWVgIHRvIGBleHRyYWN0X2RpcmAKCiAgICBSYWlzZXMgYGBVbnJlY29nbml6ZWRGb3JtYXRgYCBpZiBgZmlsZW5hbWVgIGlzIG5vdCBhIHppcGZpbGUgKGFzIGRldGVybWluZWQKICAgIGJ5IGBgemlwZmlsZS5pc196aXBmaWxlKClgYCkuICBTZWUgYGB1bnBhY2tfYXJjaGl2ZSgpYGAgZm9yIGFuIGV4cGxhbmF0aW9uCiAgICBvZiB0aGUgYHByb2dyZXNzX2ZpbHRlcmAgYXJndW1lbnQuCiAgICAiIiIKCiAgICBpZiBub3QgemlwZmlsZS5pc196aXBmaWxlKGZpbGVuYW1lKToKICAgICAgICByYWlzZSBVbnJlY29nbml6ZWRGb3JtYXQoIiVzIGlzIG5vdCBhIHppcCBmaWxlIiAlIChmaWxlbmFtZSwpKQoKICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGZpbGVuYW1lKSBhcyB6OgogICAgICAgIGZvciBpbmZvIGluIHouaW5mb2xpc3QoKToKICAgICAgICAgICAgbmFtZSA9IGluZm8uZmlsZW5hbWUKCiAgICAgICAgICAgICMgZG9uJ3QgZXh0cmFjdCBhYnNvbHV0ZSBwYXRocyBvciBvbmVzIHdpdGggLi4gaW4gdGhlbQogICAgICAgICAgICBpZiBuYW1lLnN0YXJ0c3dpdGgoJy8nKSBvciAnLi4nIGluIG5hbWUuc3BsaXQoJy8nKToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICB0YXJnZXQgPSBvcy5wYXRoLmpvaW4oZXh0cmFjdF9kaXIsICpuYW1lLnNwbGl0KCcvJykpCiAgICAgICAgICAgIHRhcmdldCA9IHByb2dyZXNzX2ZpbHRlcihuYW1lLCB0YXJnZXQpCiAgICAgICAgICAgIGlmIG5vdCB0YXJnZXQ6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBuYW1lLmVuZHN3aXRoKCcvJyk6CiAgICAgICAgICAgICAgICAjIGRpcmVjdG9yeQogICAgICAgICAgICAgICAgZW5zdXJlX2RpcmVjdG9yeSh0YXJnZXQpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIGZpbGUKICAgICAgICAgICAgICAgIGVuc3VyZV9kaXJlY3RvcnkodGFyZ2V0KQogICAgICAgICAgICAgICAgZGF0YSA9IHoucmVhZChpbmZvLmZpbGVuYW1lKQogICAgICAgICAgICAgICAgd2l0aCBvcGVuKHRhcmdldCwgJ3diJykgYXMgZjoKICAgICAgICAgICAgICAgICAgICBmLndyaXRlKGRhdGEpCiAgICAgICAgICAgIHVuaXhfYXR0cmlidXRlcyA9IGluZm8uZXh0ZXJuYWxfYXR0ciA+PiAxNgogICAgICAgICAgICBpZiB1bml4X2F0dHJpYnV0ZXM6CiAgICAgICAgICAgICAgICBvcy5jaG1vZCh0YXJnZXQsIHVuaXhfYXR0cmlidXRlcykKCgpkZWYgdW5wYWNrX3RhcmZpbGUoZmlsZW5hbWUsIGV4dHJhY3RfZGlyLCBwcm9ncmVzc19maWx0ZXI9ZGVmYXVsdF9maWx0ZXIpOgogICAgIiIiVW5wYWNrIHRhci90YXIuZ3ovdGFyLmJ6MiBgZmlsZW5hbWVgIHRvIGBleHRyYWN0X2RpcmAKCiAgICBSYWlzZXMgYGBVbnJlY29nbml6ZWRGb3JtYXRgYCBpZiBgZmlsZW5hbWVgIGlzIG5vdCBhIHRhcmZpbGUgKGFzIGRldGVybWluZWQKICAgIGJ5IGBgdGFyZmlsZS5vcGVuKClgYCkuICBTZWUgYGB1bnBhY2tfYXJjaGl2ZSgpYGAgZm9yIGFuIGV4cGxhbmF0aW9uCiAgICBvZiB0aGUgYHByb2dyZXNzX2ZpbHRlcmAgYXJndW1lbnQuCiAgICAiIiIKICAgIHRyeToKICAgICAgICB0YXJvYmogPSB0YXJmaWxlLm9wZW4oZmlsZW5hbWUpCiAgICBleGNlcHQgdGFyZmlsZS5UYXJFcnJvcjoKICAgICAgICByYWlzZSBVbnJlY29nbml6ZWRGb3JtYXQoCiAgICAgICAgICAgICIlcyBpcyBub3QgYSBjb21wcmVzc2VkIG9yIHVuY29tcHJlc3NlZCB0YXIgZmlsZSIgJSAoZmlsZW5hbWUsKQogICAgICAgICkKICAgIHdpdGggY29udGV4dGxpYi5jbG9zaW5nKHRhcm9iaik6CiAgICAgICAgIyBkb24ndCBkbyBhbnkgY2hvd25pbmchCiAgICAgICAgdGFyb2JqLmNob3duID0gbGFtYmRhICphcmdzOiBOb25lCiAgICAgICAgZm9yIG1lbWJlciBpbiB0YXJvYmo6CiAgICAgICAgICAgIG5hbWUgPSBtZW1iZXIubmFtZQogICAgICAgICAgICAjIGRvbid0IGV4dHJhY3QgYWJzb2x1dGUgcGF0aHMgb3Igb25lcyB3aXRoIC4uIGluIHRoZW0KICAgICAgICAgICAgaWYgbm90IG5hbWUuc3RhcnRzd2l0aCgnLycpIGFuZCAnLi4nIG5vdCBpbiBuYW1lLnNwbGl0KCcvJyk6CiAgICAgICAgICAgICAgICBwcmVsaW1fZHN0ID0gb3MucGF0aC5qb2luKGV4dHJhY3RfZGlyLCAqbmFtZS5zcGxpdCgnLycpKQoKICAgICAgICAgICAgICAgICMgcmVzb2x2ZSBhbnkgbGlua3MgYW5kIHRvIGV4dHJhY3QgdGhlIGxpbmsgdGFyZ2V0cyBhcyBub3JtYWwKICAgICAgICAgICAgICAgICMgZmlsZXMKICAgICAgICAgICAgICAgIHdoaWxlIG1lbWJlciBpcyBub3QgTm9uZSBhbmQgKG1lbWJlci5pc2xuaygpIG9yIG1lbWJlci5pc3N5bSgpKToKICAgICAgICAgICAgICAgICAgICBsaW5rcGF0aCA9IG1lbWJlci5saW5rbmFtZQogICAgICAgICAgICAgICAgICAgIGlmIG1lbWJlci5pc3N5bSgpOgogICAgICAgICAgICAgICAgICAgICAgICBiYXNlID0gcG9zaXhwYXRoLmRpcm5hbWUobWVtYmVyLm5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtwYXRoID0gcG9zaXhwYXRoLmpvaW4oYmFzZSwgbGlua3BhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtwYXRoID0gcG9zaXhwYXRoLm5vcm1wYXRoKGxpbmtwYXRoKQogICAgICAgICAgICAgICAgICAgIG1lbWJlciA9IHRhcm9iai5fZ2V0bWVtYmVyKGxpbmtwYXRoKQoKICAgICAgICAgICAgICAgIGlmIG1lbWJlciBpcyBub3QgTm9uZSBhbmQgKG1lbWJlci5pc2ZpbGUoKSBvciBtZW1iZXIuaXNkaXIoKSk6CiAgICAgICAgICAgICAgICAgICAgZmluYWxfZHN0ID0gcHJvZ3Jlc3NfZmlsdGVyKG5hbWUsIHByZWxpbV9kc3QpCiAgICAgICAgICAgICAgICAgICAgaWYgZmluYWxfZHN0OgogICAgICAgICAgICAgICAgICAgICAgICBpZiBmaW5hbF9kc3QuZW5kc3dpdGgob3Muc2VwKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsX2RzdCA9IGZpbmFsX2RzdFs6LTFdCiAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgWFhYIFVnaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyb2JqLl9leHRyYWN0X21lbWJlcihtZW1iZXIsIGZpbmFsX2RzdCkKICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IHRhcmZpbGUuRXh0cmFjdEVycm9yOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBjaG93bi9jaG1vZC9ta2ZpZm8vbWtub2RlL21ha2VkZXYgZmFpbGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgcmV0dXJuIFRydWUKCgpleHRyYWN0aW9uX2RyaXZlcnMgPSB1bnBhY2tfZGlyZWN0b3J5LCB1bnBhY2tfemlwZmlsZSwgdW5wYWNrX3RhcmZpbGUKUEsDBBQAAAAAAAAAIQAf4j0cJxYAACcWAAAwAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9idWlsZF9tZXRhLnB5IiIiQSBQRVAgNTE3IGludGVyZmFjZSB0byBzZXR1cHRvb2xzCgpQcmV2aW91c2x5LCB3aGVuIGEgdXNlciBvciBhIGNvbW1hbmQgbGluZSB0b29sIChsZXQncyBjYWxsIGl0IGEgImZyb250ZW5kIikKbmVlZGVkIHRvIG1ha2UgYSByZXF1ZXN0IG9mIHNldHVwdG9vbHMgdG8gdGFrZSBhIGNlcnRhaW4gYWN0aW9uLCBmb3IKZXhhbXBsZSwgZ2VuZXJhdGluZyBhIGxpc3Qgb2YgaW5zdGFsbGF0aW9uIHJlcXVpcmVtZW50cywgdGhlIGZyb250ZW5kIHdvdWxkCndvdWxkIGNhbGwgInNldHVwLnB5IGVnZ19pbmZvIiBvciAic2V0dXAucHkgYmRpc3Rfd2hlZWwiIG9uIHRoZSBjb21tYW5kIGxpbmUuCgpQRVAgNTE3IGRlZmluZXMgYSBkaWZmZXJlbnQgbWV0aG9kIG9mIGludGVyZmFjaW5nIHdpdGggc2V0dXB0b29scy4gUmF0aGVyCnRoYW4gY2FsbGluZyAic2V0dXAucHkiIGRpcmVjdGx5LCB0aGUgZnJvbnRlbmQgc2hvdWxkOgoKICAxLiBTZXQgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHRvIHRoZSBkaXJlY3Rvcnkgd2l0aCBhIHNldHVwLnB5IGZpbGUKICAyLiBJbXBvcnQgdGhpcyBtb2R1bGUgaW50byBhIHNhZmUgcHl0aG9uIGludGVycHJldGVyIChvbmUgaW4gd2hpY2gKICAgICBzZXR1cHRvb2xzIGNhbiBwb3RlbnRpYWxseSBzZXQgZ2xvYmFsIHZhcmlhYmxlcyBvciBjcmFzaCBoYXJkKS4KICAzLiBDYWxsIG9uZSBvZiB0aGUgZnVuY3Rpb25zIGRlZmluZWQgaW4gUEVQIDUxNy4KCldoYXQgZWFjaCBmdW5jdGlvbiBkb2VzIGlzIGRlZmluZWQgaW4gUEVQIDUxNy4gSG93ZXZlciwgaGVyZSBpcyBhICJjYXN1YWwiCmRlZmluaXRpb24gb2YgdGhlIGZ1bmN0aW9ucyAodGhpcyBkZWZpbml0aW9uIHNob3VsZCBub3QgYmUgcmVsaWVkIG9uIGZvcgpidWcgcmVwb3J0cyBvciBBUEkgc3RhYmlsaXR5KToKCiAgLSBgYnVpbGRfd2hlZWxgOiBidWlsZCBhIHdoZWVsIGluIHRoZSBmb2xkZXIgYW5kIHJldHVybiB0aGUgYmFzZW5hbWUKICAtIGBnZXRfcmVxdWlyZXNfZm9yX2J1aWxkX3doZWVsYDogZ2V0IHRoZSBgc2V0dXBfcmVxdWlyZXNgIHRvIGJ1aWxkCiAgLSBgcHJlcGFyZV9tZXRhZGF0YV9mb3JfYnVpbGRfd2hlZWxgOiBnZXQgdGhlIGBpbnN0YWxsX3JlcXVpcmVzYAogIC0gYGJ1aWxkX3NkaXN0YDogYnVpbGQgYW4gc2Rpc3QgaW4gdGhlIGZvbGRlciBhbmQgcmV0dXJuIHRoZSBiYXNlbmFtZQogIC0gYGdldF9yZXF1aXJlc19mb3JfYnVpbGRfc2Rpc3RgOiBnZXQgdGhlIGBzZXR1cF9yZXF1aXJlc2AgdG8gYnVpbGQKCkFnYWluLCB0aGlzIGlzIG5vdCBhIGZvcm1hbCBkZWZpbml0aW9uISBKdXN0IGEgInRhc3RlIiBvZiB0aGUgbW9kdWxlLgoiIiIKCmltcG9ydCBvcwppbXBvcnQgc3lzCmltcG9ydCB0b2tlbml6ZQppbXBvcnQgc2h1dGlsCmltcG9ydCBjb250ZXh0bGliCgppbXBvcnQgc2V0dXB0b29scwppbXBvcnQgZGlzdHV0aWxzCgoKY2xhc3MgU2V0dXBSZXF1aXJlbWVudHNFcnJvcihCYXNlRXhjZXB0aW9uKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzcGVjaWZpZXJzKToKICAgICAgICBzZWxmLnNwZWNpZmllcnMgPSBzcGVjaWZpZXJzCgoKY2xhc3MgRGlzdHJpYnV0aW9uKHNldHVwdG9vbHMuZGlzdC5EaXN0cmlidXRpb24pOgogICAgZGVmIGZldGNoX2J1aWxkX2VnZ3Moc2VsZiwgc3BlY2lmaWVycyk6CiAgICAgICAgcmFpc2UgU2V0dXBSZXF1aXJlbWVudHNFcnJvcihzcGVjaWZpZXJzKQoKICAgIEBjbGFzc21ldGhvZAogICAgQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKICAgIGRlZiBwYXRjaChjbHMpOgogICAgICAgICIiIgogICAgICAgIFJlcGxhY2UKICAgICAgICBkaXN0dXRpbHMuZGlzdC5EaXN0cmlidXRpb24gd2l0aCB0aGlzIGNsYXNzCiAgICAgICAgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGlzIGNvbnRleHQuCiAgICAgICAgIiIiCiAgICAgICAgb3JpZyA9IGRpc3R1dGlscy5jb3JlLkRpc3RyaWJ1dGlvbgogICAgICAgIGRpc3R1dGlscy5jb3JlLkRpc3RyaWJ1dGlvbiA9IGNscwogICAgICAgIHRyeToKICAgICAgICAgICAgeWllbGQKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBkaXN0dXRpbHMuY29yZS5EaXN0cmlidXRpb24gPSBvcmlnCgoKZGVmIF9ydW5fc2V0dXAoc2V0dXBfc2NyaXB0PSdzZXR1cC5weScpOgogICAgIyBOb3RlIHRoYXQgd2UgY2FuIHJldXNlIG91ciBidWlsZCBkaXJlY3RvcnkgYmV0d2VlbiBjYWxscwogICAgIyBDb3JyZWN0bmVzcyBjb21lcyBmaXJzdCwgdGhlbiBvcHRpbWl6YXRpb24gbGF0ZXIKICAgIF9fZmlsZV9fID0gc2V0dXBfc2NyaXB0CiAgICBfX25hbWVfXyA9ICdfX21haW5fXycKICAgIGYgPSBnZXRhdHRyKHRva2VuaXplLCAnb3BlbicsIG9wZW4pKF9fZmlsZV9fKQogICAgY29kZSA9IGYucmVhZCgpLnJlcGxhY2UoJ1xcclxcbicsICdcXG4nKQogICAgZi5jbG9zZSgpCiAgICBleGVjKGNvbXBpbGUoY29kZSwgX19maWxlX18sICdleGVjJyksIGxvY2FscygpKQoKCmRlZiBfZml4X2NvbmZpZyhjb25maWdfc2V0dGluZ3MpOgogICAgY29uZmlnX3NldHRpbmdzID0gY29uZmlnX3NldHRpbmdzIG9yIHt9CiAgICBjb25maWdfc2V0dGluZ3Muc2V0ZGVmYXVsdCgnLS1nbG9iYWwtb3B0aW9uJywgW10pCiAgICByZXR1cm4gY29uZmlnX3NldHRpbmdzCgoKZGVmIF9nZXRfYnVpbGRfcmVxdWlyZXMoY29uZmlnX3NldHRpbmdzKToKICAgIGNvbmZpZ19zZXR0aW5ncyA9IF9maXhfY29uZmlnKGNvbmZpZ19zZXR0aW5ncykKICAgIHJlcXVpcmVtZW50cyA9IFsnc2V0dXB0b29scycsICd3aGVlbCddCgogICAgc3lzLmFyZ3YgPSBzeXMuYXJndls6MV0gKyBbJ2VnZ19pbmZvJ10gKyBcCiAgICAgICAgY29uZmlnX3NldHRpbmdzWyItLWdsb2JhbC1vcHRpb24iXQogICAgdHJ5OgogICAgICAgIHdpdGggRGlzdHJpYnV0aW9uLnBhdGNoKCk6CiAgICAgICAgICAgIF9ydW5fc2V0dXAoKQogICAgZXhjZXB0IFNldHVwUmVxdWlyZW1lbnRzRXJyb3IgYXMgZToKICAgICAgICByZXF1aXJlbWVudHMgKz0gZS5zcGVjaWZpZXJzCgogICAgcmV0dXJuIHJlcXVpcmVtZW50cwoKCmRlZiBfZ2V0X2ltbWVkaWF0ZV9zdWJkaXJlY3RvcmllcyhhX2Rpcik6CiAgICByZXR1cm4gW25hbWUgZm9yIG5hbWUgaW4gb3MubGlzdGRpcihhX2RpcikKICAgICAgICAgICAgaWYgb3MucGF0aC5pc2Rpcihvcy5wYXRoLmpvaW4oYV9kaXIsIG5hbWUpKV0KCgpkZWYgZ2V0X3JlcXVpcmVzX2Zvcl9idWlsZF93aGVlbChjb25maWdfc2V0dGluZ3M9Tm9uZSk6CiAgICBjb25maWdfc2V0dGluZ3MgPSBfZml4X2NvbmZpZyhjb25maWdfc2V0dGluZ3MpCiAgICByZXR1cm4gX2dldF9idWlsZF9yZXF1aXJlcyhjb25maWdfc2V0dGluZ3MpCgoKZGVmIGdldF9yZXF1aXJlc19mb3JfYnVpbGRfc2Rpc3QoY29uZmlnX3NldHRpbmdzPU5vbmUpOgogICAgY29uZmlnX3NldHRpbmdzID0gX2ZpeF9jb25maWcoY29uZmlnX3NldHRpbmdzKQogICAgcmV0dXJuIF9nZXRfYnVpbGRfcmVxdWlyZXMoY29uZmlnX3NldHRpbmdzKQoKCmRlZiBwcmVwYXJlX21ldGFkYXRhX2Zvcl9idWlsZF93aGVlbChtZXRhZGF0YV9kaXJlY3RvcnksIGNvbmZpZ19zZXR0aW5ncz1Ob25lKToKICAgIHN5cy5hcmd2ID0gc3lzLmFyZ3ZbOjFdICsgWydkaXN0X2luZm8nLCAnLS1lZ2ctYmFzZScsIG1ldGFkYXRhX2RpcmVjdG9yeV0KICAgIF9ydW5fc2V0dXAoKQogICAgCiAgICBkaXN0X2luZm9fZGlyZWN0b3J5ID0gbWV0YWRhdGFfZGlyZWN0b3J5CiAgICB3aGlsZSBUcnVlOiAgICAKICAgICAgICBkaXN0X2luZm9zID0gW2YgZm9yIGYgaW4gb3MubGlzdGRpcihkaXN0X2luZm9fZGlyZWN0b3J5KQogICAgICAgICAgICAgICAgICAgICAgaWYgZi5lbmRzd2l0aCgnLmRpc3QtaW5mbycpXQoKICAgICAgICBpZiBsZW4oZGlzdF9pbmZvcykgPT0gMCBhbmQgXAogICAgICAgICAgICAgICAgbGVuKF9nZXRfaW1tZWRpYXRlX3N1YmRpcmVjdG9yaWVzKGRpc3RfaW5mb19kaXJlY3RvcnkpKSA9PSAxOgogICAgICAgICAgICBkaXN0X2luZm9fZGlyZWN0b3J5ID0gb3MucGF0aC5qb2luKAogICAgICAgICAgICAgICAgZGlzdF9pbmZvX2RpcmVjdG9yeSwgb3MubGlzdGRpcihkaXN0X2luZm9fZGlyZWN0b3J5KVswXSkKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgYXNzZXJ0IGxlbihkaXN0X2luZm9zKSA9PSAxCiAgICAgICAgYnJlYWsKCiAgICAjIFBFUCA1MTcgcmVxdWlyZXMgdGhhdCB0aGUgLmRpc3QtaW5mbyBkaXJlY3RvcnkgYmUgcGxhY2VkIGluIHRoZQogICAgIyBtZXRhZGF0YV9kaXJlY3RvcnkuIFRvIGNvbXBseSwgd2UgTVVTVCBjb3B5IHRoZSBkaXJlY3RvcnkgdG8gdGhlIHJvb3QKICAgIGlmIGRpc3RfaW5mb19kaXJlY3RvcnkgIT0gbWV0YWRhdGFfZGlyZWN0b3J5OgogICAgICAgIHNodXRpbC5tb3ZlKAogICAgICAgICAgICBvcy5wYXRoLmpvaW4oZGlzdF9pbmZvX2RpcmVjdG9yeSwgZGlzdF9pbmZvc1swXSksCiAgICAgICAgICAgIG1ldGFkYXRhX2RpcmVjdG9yeSkKICAgICAgICBzaHV0aWwucm10cmVlKGRpc3RfaW5mb19kaXJlY3RvcnksIGlnbm9yZV9lcnJvcnM9VHJ1ZSkKCiAgICByZXR1cm4gZGlzdF9pbmZvc1swXQoKCmRlZiBidWlsZF93aGVlbCh3aGVlbF9kaXJlY3RvcnksIGNvbmZpZ19zZXR0aW5ncz1Ob25lLAogICAgICAgICAgICAgICAgbWV0YWRhdGFfZGlyZWN0b3J5PU5vbmUpOgogICAgY29uZmlnX3NldHRpbmdzID0gX2ZpeF9jb25maWcoY29uZmlnX3NldHRpbmdzKQogICAgd2hlZWxfZGlyZWN0b3J5ID0gb3MucGF0aC5hYnNwYXRoKHdoZWVsX2RpcmVjdG9yeSkKICAgIHN5cy5hcmd2ID0gc3lzLmFyZ3ZbOjFdICsgWydiZGlzdF93aGVlbCddICsgXAogICAgICAgIGNvbmZpZ19zZXR0aW5nc1siLS1nbG9iYWwtb3B0aW9uIl0KICAgIF9ydW5fc2V0dXAoKQogICAgaWYgd2hlZWxfZGlyZWN0b3J5ICE9ICdkaXN0JzoKICAgICAgICBzaHV0aWwucm10cmVlKHdoZWVsX2RpcmVjdG9yeSkKICAgICAgICBzaHV0aWwuY29weXRyZWUoJ2Rpc3QnLCB3aGVlbF9kaXJlY3RvcnkpCgogICAgd2hlZWxzID0gW2YgZm9yIGYgaW4gb3MubGlzdGRpcih3aGVlbF9kaXJlY3RvcnkpCiAgICAgICAgICAgICAgaWYgZi5lbmRzd2l0aCgnLndobCcpXQoKICAgIGFzc2VydCBsZW4od2hlZWxzKSA9PSAxCiAgICByZXR1cm4gd2hlZWxzWzBdCgoKZGVmIGJ1aWxkX3NkaXN0KHNkaXN0X2RpcmVjdG9yeSwgY29uZmlnX3NldHRpbmdzPU5vbmUpOgogICAgY29uZmlnX3NldHRpbmdzID0gX2ZpeF9jb25maWcoY29uZmlnX3NldHRpbmdzKQogICAgc2Rpc3RfZGlyZWN0b3J5ID0gb3MucGF0aC5hYnNwYXRoKHNkaXN0X2RpcmVjdG9yeSkKICAgIHN5cy5hcmd2ID0gc3lzLmFyZ3ZbOjFdICsgWydzZGlzdCddICsgXAogICAgICAgIGNvbmZpZ19zZXR0aW5nc1siLS1nbG9iYWwtb3B0aW9uIl0KICAgIF9ydW5fc2V0dXAoKQogICAgaWYgc2Rpc3RfZGlyZWN0b3J5ICE9ICdkaXN0JzoKICAgICAgICBzaHV0aWwucm10cmVlKHNkaXN0X2RpcmVjdG9yeSkKICAgICAgICBzaHV0aWwuY29weXRyZWUoJ2Rpc3QnLCBzZGlzdF9kaXJlY3RvcnkpCgogICAgc2Rpc3RzID0gW2YgZm9yIGYgaW4gb3MubGlzdGRpcihzZGlzdF9kaXJlY3RvcnkpCiAgICAgICAgICAgICAgaWYgZi5lbmRzd2l0aCgnLnRhci5neicpXQoKICAgIGFzc2VydCBsZW4oc2Rpc3RzKSA9PSAxCiAgICByZXR1cm4gc2Rpc3RzWzBdClBLAwQUAAAAAAAAACEA9YZ6aQAAAQAAAAEALQAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY2xpLTMyLmV4ZU1akAADAAAABAAAAP//AAC4AAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAOH7oOALQJzSG4AUzNIVRoaXMgcHJvZ3JhbSBjYW5ub3QgYmUgcnVuIGluIERPUyBtb2RlLg0NCiQAAAAAAAAAWVP+ah0ykDkdMpA5HTKQ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PFh3EQ++wg++gFjiQACD4A8z9usEM/YzwA++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+EFAIAAKOgKkEA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AADrBou1KOX//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//3UU6Ba3///HAAkAAADoHrf//4kw6z//tUDl///oIrf//1nrMYu1KOX//4sG9kQHBEB0D4uFNOX//4A4GnUEM8DrJOjWtv//xwAcAAAA6N62//+DIACDyP/rDIuFOOX//yuFMOX//19bi038M81e6Gie///Jw2oQaOj3QADo6Lb//4tFCIP4/nUb6KK2//+DIADoh7b//8cACQAAAIPI/+mdAAAAM/87x3wIOwWQKkEAciHoebb//4k46F+2///HAAkAAABXV1dXV+jntf//g8QU68mLyMH5BY0cjaAqQQCL8IPmH8HmBosLD75MMQSD4QF0v1DoOSQAAFmJffyLA/ZEMAQBdBb/dRD/dQz/dQjoLvj//4PEDIlF5OsW6Py1///HAAkAAADoBLb//4k4g03k/8dF/P7////oCQAAAItF5Ohotv//w/91COiDJAAAWcNqEGgI+EAA6Ay2//+LRQiD+P51E+iztf//xwAJAAAAg8j/6aoAAAAz2zvDfAg7BZAqQQByGuiStf//xwAJAAAAU1NTU1PoGrX//4PEFOvQi8jB+QWNPI2gKkEAi/CD5h/B5gaLDw++TA4Eg+EBdMZQ6GwjAABZiV38iwf2RAYEAXQx/3UI6OAiAABZUP8V5OBAAIXAdQv/FVzgQACJReTrA4ld5Dld5HQZ6DG1//+LTeSJCOgUtf//xwAJAAAAg03k/8dF/P7////oCQAAAItF5OiHtf//w/91COiiIwAAWcOL/1WL7IPsEFMz2zldCHUc6Na0//9TU1NTU8cAFgAAAOhetP//g8QUM8DralaLdQw783Ua6LK0//9TU1NTU8cAFgAAAOg6tP//g8QU6wU5dQhyBDPA6z7/dRCNTfDoVpz//4tN9I1G/zlZCHQcSDlFCHcKD7YQ9kQKHQR18IvOK8iD4QEr8U6Lxjhd/HQHi034g2Fw/V5bycOL/1WL7GoA/3UM/3UI6FX///+DxAxdw4v/VYvsg+wUUzPbVot1CDldFHUQO/N1EDldDHUQM8Dp5wEAADvzdAU5XQx3HugJtP//ahZeU1NTU1OJMOiSs///g8QUi8bpwAEAADldFHUEiB7ryVeLfRA7+3UeiB7o2LP//2oWXlNTU1NTiTDoYbP//4PEFOkoAQAA/3UYjU3s6IOb//+LRfA5WAh1Ff91FFf/dQxW6KMKAACDxBDpTAEAAIN9FP+LVQyLxnUPig+ICEBHOst0H0p18+saig+ICEBHOst0CEp0Bf9NFHXuOV0UdQOIGEA70w+FyAAAADgfdAaDfRQBdTWNeP+Jffw7/nIejUXsUItF/A+2AFDoML///1lZhcB0CP9N/Dl1/HPii8crRfyoAQ+FwwAAAIN9FP91WotFDIP4AXY6jXwG/ol9FDv+ciGNRexQi0UUD7YAUOjsvv//WVmFwHQI/00UOXUUc+KLRQyLzytNFPbBAXQEiB/rBIhcBv84Xfh0B4tF9INgcP1qUFjpjQAAAIge6Ley//9qIl5TU1NTU4kw6ECy//+DxBQ4Xfh0B4tF9INgcP2Lxutki8grzoP5AnxNjXj+iX0UO/5yHo1F7FCLRRQPtgBQ6Gm+//9ZWYXAdAj/TRQ5dRRz4ovHK0UUqAF0HIgf6FSy//+LyGoqWIkBOF34dBeLTfSDYXD96w44Xfh0B4tF9INgcP0zwF9eW8nDi/9Vi+yLRQiFwHQSg+gIgTjd3QAAdQdQ6Hi1//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/3X4U1fowJL//4PEDP91+Ff/dRT/dfT/dQz/dQj/1olF+DvDdQQz9usl/3UcjUX4/3UYUFf/dSD/dezojR8AAIvwiXXwg8QY994b9iN1+Ffojfz//1nrGv91HP91GP91FP91EP91DP91CP8V6OBAAIvwOV30dAn/dfTo+LH//1mLRfA7w3QMOUUYdAdQ6OWx//9Zi8aNZeBfXluLTfwzzegnlv//ycOL/1WL7IPsEP91CI1N8Oghlv///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+jekP//g8QMV1P/dRD/dQxqAf91GP/WhcB0Ef91FFBT/3UI/xX44EAAiUX4U+jJ+v//i0X4Wet1M/Y5XRx1CIsHi0AUiUUcOV0YdQiLB4tABIlFGP91HOhBHQAAWYP4/3UEM8DrRztFGHQeU1ONTRBR/3UMUP91GOhpHQAAi/CDxBg783TciXUM/3UU/3UQ/3UM/3UI/3Uc/xX04EAAi/g783QHVujmr///WYvHjWXsX15bi038M83oKJT//8nDi/9Vi+yD7BD/dQiNTfDoIpT///91JI1N8P91IP91HP91GP91FP91EP91DOgW/v//g8QcgH38AHQHi034g2Fw/cnDi/9Vi+xWi3UIhfYPhIEBAAD/dgTodq////92COhur////3YM6Gav////dhDoXq////92FOhWr////3YY6E6v////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+KCogIQEI6y3QeT3Xz6xmKCogIQEI6y3QI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bGUgJXMKAAAAIyFweXRob24uZXhlAAAAACMhAABDYW5ub3Qgb3BlbiAlcwoALXNjcmlwdC5weQAAQ29yRXhpdFByb2Nlc3MAAG0AcwBjAG8AcgBlAGUALgBkAGwAbAAAACgAbgB1AGwAbAApAAAAAAAobnVsbCkAAAAAAAAGAAAGAAEAABAAAwYABgIQBEVFRQUFBQUFNTAAUAAAAAAoIDhQWAcIADcwMFdQBwAAICAIAAAAAAhgaGBgYGAAAHhweHh4eAgHCAAABwAICAgAAAgACAAHCAAAAKghQQAAIkEAAAAAAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn8APQAAAEVuY29kZVBvaW50ZXIAAABLAEUAUgBOAEUATAAzADIALgBEAEwATAAAAAAARGVjb2RlUG9pbnRlcgAAAEZsc0ZyZWUARmxzU2V0VmFsdWUARmxzR2V0VmFsdWUARmxzQWxsb2MAAAAAcnVudGltZSBlcnJvciAAAA0KAABUTE9TUyBlcnJvcg0KAAAAU0lORyBlcnJvcg0KAAAAAERPTUFJTiBlcnJvcg0KAABSNjAzNA0KQW4gYXBwbGljYXRpb24gaGFzIG1hZGUgYW4gYXR0ZW1wdCB0byBsb2FkIHRoZSBDIHJ1bnRpbWUgbGlicmFyeSBpbmNvcnJlY3RseS4KUGxlYXNlIGNvbnRhY3QgdGhlIGFwcGxpY2F0aW9uJ3Mgc3VwcG9ydCB0ZWFtIGZvciBtb3JlIGluZm9ybWF0aW9uLg0KAAAAAAAAUjYwMzMNCi0gQXR0ZW1wdCB0byB1c2UgTVNJTCBjb2RlIGZyb20gdGhpcyBhc3NlbWJseSBkdXJpbmcgbmF0aXZlIGNvZGUgaW5pdGlhbGl6YXRpb24KVGhpcyBpbmRpY2F0ZXMgYSBidWcgaW4geW91ciBhcHBsaWNhdGlvbi4gSXQgaXMgbW9zdCBsaWtlbHkgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIGFuIE1TSUwtY29tcGlsZWQgKC9jbHIpIGZ1bmN0aW9uIGZyb20gYSBuYXRpdmUgY29uc3RydWN0b3Igb3IgZnJvbSBEbGxNYWluLg0KAABSNjAzMg0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBsb2NhbGUgaW5mb3JtYXRpb24NCgAAAAAAAFI2MDMxDQotIEF0dGVtcHQgdG8gaW5pdGlhbGl6ZSB0aGUgQ1JUIG1vcmUgdGhhbiBvbmNlLgpUaGlzIGluZGljYXRlcyBhIGJ1ZyBpbiB5b3VyIGFwcGxpY2F0aW9uLg0KAABSNjAzMA0KLSBDUlQgbm90IGluaXRpYWxpemVkDQoAAFI2MDI4DQotIHVuYWJsZSB0byBpbml0aWFsaXplIGhlYXANCgAAAABSNjAyNw0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBsb3dpbyBpbml0aWFsaXphdGlvbg0KAAAAAFI2MDI2DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIHN0ZGlvIGluaXRpYWxpemF0aW9uDQoAAAAAUjYwMjUNCi0gcHVyZSB2aXJ0dWFsIGZ1bmN0aW9uIGNhbGwNCgAAAFI2MDI0DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIF9vbmV4aXQvYXRleGl0IHRhYmxlDQoAAAAAUjYwMTkNCi0gdW5hYmxlIHRvIG9wZW4gY29uc29sZSBkZXZpY2UNCgAAAABSNjAxOA0KLSB1bmV4cGVjdGVkIGhlYXAgZXJyb3INCgAAAABSNjAxNw0KLSB1bmV4cGVjdGVkIG11bHRpdGhyZWFkIGxvY2sgZXJyb3INCgAAAABSNjAxNg0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciB0aHJlYWQgZGF0YQ0KAA0KVGhpcyBhcHBsaWNhdGlvbiBoYXMgcmVxdWVzdGVkIHRoZSBSdW50aW1lIHRvIHRlcm1pbmF0ZSBpdCBpbiBhbiB1bnVzdWFsIHdheS4KUGxlYXNlIGNvbnRhY3QgdGhlIGFwcGxpY2F0aW9uJ3Mgc3VwcG9ydCB0ZWFtIGZvciBtb3JlIGluZm9ybWF0aW9uLg0KAAAAUjYwMDkNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgZW52aXJvbm1lbnQNCgBSNjAwOA0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBhcmd1bWVudHMNCgAAAFI2MDAyDQotIGZs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AFR1ZQBNb24AU3VuAEdldFByb2Nlc3NXaW5kb3dTdGF0aW9uAEdldFVzZXJPYmplY3RJbmZvcm1hdGlvbkEAAABHZXRMYXN0QWN0aXZlUG9wdXAAAEdldEFjdGl2ZVdpbmRvdwBNZXNzYWdlQm94QQBVU0VSMzIuRExMAABTdW5Nb25UdWVXZWRUaHVGcmlTYXQAAABKYW5GZWJNYXJBcHJNYXlKdW5KdWxBdWdTZXBPY3ROb3ZEZWMAAAAAQ09OT1VUJAAuY29tAAAAAC5leGUAAAAALmJhdAAAAAAuY21kAAAAAC5cAABTeXN0ZW1Sb290AAAAAAAASAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgBJBAND0QAADAAAA0DcAACBpAAAQmQAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+////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/////gAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAABYAAAACAAAAAgAAAAMAAAACAAAABAAAABgAAAAFAAAADQAAAAYAAAAJAAAABwAAAAwAAAAIAAAADAAAAAkAAAAMAAAACgAAAAcAAAALAAAACAAAAAwAAAAWAAAADQAAABYAAAAPAAAAAgAAABAAAAANAAAAEQAAABIAAAASAAAAAgAAACEAAAANAAAANQAAAAIAAABBAAAADQAAAEMAAAACAAAAUAAAABEAAABSAAAADQAAAFMAAAANAAAAVwAAABYAAABZAAAACwAAAGwAAAANAAAAbQAAACAAAABwAAAAHAAAAHIAAAAJAAAABgAAABYAAACAAAAACgAAAIEAAAAKAAAAggAAAAkAAACDAAAAFgAAAIQAAAANAAAAkQAAACkAAACeAAAADQAAAKEAAAACAAAApAAAAAsAAACnAAAADQAAALcAAAARAAAAzgAAAAIAAADXAAAACwAAABgHAAAMAAAADAAAAAgAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAAAAAAAAAgICAgICAgICAgICAgICAgICAgICAgICAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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2EyLVArQSIPpQEwPw0kYTA/DURBMi0wKCEyLFAr/yEwPw0kITA/DEXWqSYHoABAAAEmB+AAQAAAPg3H////wgAwkAOm6/v//SIXJD4TgAQAAU0iD7CBIi9lIi0kI6JKy//9Ii0sQ6Imy//9Ii0sY6ICy//9Ii0sg6Hey//9Ii0so6G6y//9Ii0sw6GWy//9IiwvoXbL//0iLS0DoVLL//0iLS0joS7L//0iLS1DoQrL//0iLS1joObL//0iLS2DoMLL//0iLS2joJ7L//0iLSzjoHrL//0iLS3DoFbL//0iLS3joDLL//0iLi4AAAADoALL//0iLi4gAAADo9LH//0iLi5AAAADo6LH//0iLi5gAAADo3LH//0iLi6AAAADo0LH//0iLi6gAAADoxLH//0iLi7AAAADouLH//0iLi7gAAADorLH//0iLi8AAAADooLH//0iLi8gAAADolLH//0iLi9AAAADoiLH//0iLi9gAAADofLH//0iLi+AAAADocLH//0iLi+gAAADoZLH//0iLi/AAAADoWLH//0iLi/gAAADoTLH//0iLiwABAADoQLH//0iLiwgBAADoNLH//0iLixABAADoKLH//0iLixgBAADoHLH//0iLiyABAADoELH//0iLiygBAADoBLH//0iLizABAADo+LD//0iLizgBAADo7LD//0iLi0ABAADo4LD//0iLi0gBAADo1LD//0iLi1ABAADoyLD//0iDxCBbw8zMSIXJdEJTSIPsIEiL2UiLCUg7DQmhAAB0BeiisP//SItLCEg7Df+gAAB0BeiQsP//SItLEEg7DfWgAAB0Beh+sP//SIPEIFvDSIXJD4SLAAAAU0iD7CBIi9lIi0kYSDsN1KAAAHQF6FWw//9Ii0sgSDsNyqAAAHQF6EOw//9Ii0soSDsNwKAAAHQF6DGw//9Ii0swSDsNtqAAAHQF6B+w//9Ii0s4SDsNrKAAAHQF6A2w//9Ii0tASDsNoqAAAHQF6Puv//9Ii0tISDsNmKAAAHQF6Omv//9Ig8QgW8PMzMxAU0iD7DBMi8lIhcl0DUiF0nQITYXAdSxEiAHoOK3//7sWAAAASINkJCAARTPJRTPAM9IzyYkY6Eys//+Lw0iDxDBbw4A5AHQJSP/BSIPqAXXySIXSdQVBiBHrv0GKAEn/wIgBSP/BhMB0BkiD6gF1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AAgABwgAAAAAAAAAEDgBQAEAAACwOAFAAQAAAAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn8APQAAAAAAAABydW50aW1lIGVycm9yIAAADQoAAAAAAABUTE9TUyBlcnJvcg0KAAAAU0lORyBlcnJvcg0KAAAAAERPTUFJTiBlcnJvcg0KAABSNjAzNA0KQW4gYXBwbGljYXRpb24gaGFzIG1hZGUgYW4gYXR0ZW1wdCB0byBsb2FkIHRoZSBDIHJ1bnRpbWUgbGlicmFyeSBpbmNvcnJlY3RseS4KUGxlYXNlIGNvbnRhY3QgdGhlIGFwcGxpY2F0aW9uJ3Mgc3VwcG9ydCB0ZWFtIGZvciBtb3JlIGluZm9ybWF0aW9uLg0KAAAAAAAAUjYwMzMNCi0gQXR0ZW1wdCB0byB1c2UgTVNJTCBjb2RlIGZyb20gdGhpcyBhc3NlbWJseSBkdXJpbmcgbmF0aXZlIGNvZGUgaW5pdGlhbGl6YXRpb24KVGhpcyBpbmRpY2F0ZXMgYSBidWcgaW4geW91ciBhcHBsaWNhdGlvbi4gSXQgaXMgbW9zdCBsaWtlbHkgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIGFuIE1TSUwtY29tcGlsZWQgKC9jbHIpIGZ1bmN0aW9uIGZyb20gYSBuYXRpdmUgY29uc3RydWN0b3Igb3IgZnJvbSBEbGxNYWluLg0KAABSNjAzMg0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBsb2NhbGUgaW5mb3JtYXRpb24NCgAAAAAAAFI2MDMxDQotIEF0dGVtcHQgdG8gaW5pdGlhbGl6ZSB0aGUgQ1JUIG1vcmUgdGhhbiBvbmNlLgpUaGlzIGluZGljYXRlcyBhIGJ1ZyBpbiB5b3VyIGFwcGxpY2F0aW9uLg0KAAAAAAAAUjYwMzANCi0gQ1JUIG5vdCBpbml0aWFsaXplZA0KAABSNjAyOA0KLSB1bmFibGUgdG8gaW5pdGlhbGl6ZSBoZWFwDQoAAAAAUjYwMjcNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgbG93aW8gaW5pdGlhbGl6YXRpb24NCgAAAABSNjAyNg0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBzdGRpbyBpbml0aWFsaXphdGlvbg0KAAAAAFI2MDI1DQotIHB1cmUgdmlydHVhbCBmdW5jdGlvbiBjYWxsDQoAAABSNjAyNA0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBfb25leGl0L2F0ZXhpdCB0YWJsZQ0KAAAAAFI2MDE5DQotIHVuYWJsZSB0byBvcGVuIGNvbnNvbGUgZGV2aWNlDQoAAAAAAAAAAFI2MDE4DQotIHVuZXhwZWN0ZWQgaGVhcCBlcnJvcg0KAAAAAAAAAABSNjAxNw0KLSB1bmV4cGVjdGVkIG11bHRpdGhyZWFkIGxvY2sgZXJyb3INCgAAAABSNjAxNg0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciB0aHJlYWQgZGF0YQ0KAAAAAAAAAAAAAAAAAA0KVGhpcyBhcHBsaWNhdGlvbiBoYXMgcmVxdWVzdGVkIHRoZSBSdW50aW1lIHRvIHRlcm1pbmF0ZSBpdCBpbiBhbiB1bnVzdWFsIHdheS4KUGxlYXNlIGNvbnRhY3QgdGhlIGFwcGxpY2F0aW9uJ3Mgc3VwcG9ydCB0ZWFtIGZvciBtb3JlIGluZm9ybWF0aW9uLg0KAAAAUjYwMDkNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgZW52aXJvbm1lbnQNCgAAAAAAUjYwMDgNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgYXJndW1lbnRzDQoAAAAAAAAAUjYwMDINCi0gZmxvYXRpbmcgcG9pbnQgc3VwcG9ydCBub3QgbG9hZGVkDQoAAAAATWljcm9zb2Z0IFZpc3VhbCBDKysgUnVudGltZSBMaWJyYXJ5AAAAAAoKAAAuLi4APHByb2dyYW0gbmFtZSB1bmtub3duPgAAUnVudGltZSBFcnJvciEKClByb2dyYW06IAAAAAAAAAAFAADACwAAAAAAAAAAAAAAHQAAwAQAAAAAAAAAAAAAAJYAAMAEAAAAAAAAAAAAAACNAADACAAAAAAAAAAAAAAAjgAAwAgAAAAAAAAAAAAAAI8AAMAIAAAAAAAAAAAAAACQAADACAAAAAAAAAAAAAAAkQAAwAgAAAAAAAAAAAAAAJIAAMAIAAAAAAAAAAAAAACTAADACAAAAAAAAAAAAAAABoCAhoCBgAAAEAOGgIaCgBQFBUVFRYWFhQUAADAwgFCAiAAIACgnOFBXgAAHADcwMFBQiAAAACAogIiAgAAAAGBoYGhoaAgIB3hwcHdwcAgIAAAIAAgABwgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAIAAgACAAIAAgACAAIAAgACgAKAAoACgAKAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABIABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAIQAhACEAIQAhACEAIQAhACEAIQAEAAQABAAEAAQABAAEACBAIEAgQCBAIEAgQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAEAAQABAAEAAQABAAggCCAIIAggCCAIIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABAAEAAQABAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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b25zb2xlQ3RybEhhbmRsZXIA9QFHZXRNb2R1bGVGaWxlTmFtZUEAANsARW50ZXJDcml0aWNhbFNlY3Rpb24AAO4CTGVhdmVDcml0aWNhbFNlY3Rpb24AAPoBR2V0TW9kdWxlSGFuZGxlVwAALwRTbGVlcAAiAkdldFByb2NBZGRyZXNzAAAGAUV4aXRQcm9jZXNzAHEBR2V0Q29tbWFuZExpbmVBAJ4DUnRsVW53aW5kRXgA9ANTZXRIYW5kbGVDb3VudAAAPgJHZXRTdGRIYW5kbGUAANkBR2V0RmlsZVR5cGUAPAJHZXRTdGFydHVwSW5mb0EAwABEZWxldGVDcml0aWNhbFNlY3Rpb24AOwRUZXJtaW5hdGVQcm9jZXNzAACrAUdldEN1cnJlbnRQcm9jZXNzAEwEVW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyAAAjBFNldFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcgDQAklzRGVidWdnZXJQcmVzZW50AJ8DUnRsVmlydHVhbFVud2luZAAAmANSdGxMb29rdXBGdW5jdGlvbkVudHJ5AACRA1J0bENhcHR1cmVDb250ZXh0AOcBR2V0TGFzdEVycm9yAACmAkhlYXBGcmVlAACiAkhlYXBBbGxvYwBdAUdldENQSW5mbwBUAUdldEFDUAAAFAJHZXRPRU1DUAAA2gJJc1ZhbGlkQ29kZVBhZ2UA1wBFbmNvZGVQb2ludGVyALkARGVjb2RlUG9pbnRlcgBAAUZsc0dldFZhbHVlAEEBRmxzU2V0VmFsdWUAPwFGbHNGcmVlAPgDU2V0TGFzdEVycm9yAACvAUdldEN1cnJlbnRUaHJlYWRJZAAAPgFGbHNBbGxvYwAAmwRXcml0ZUZpbGUA8AJMb2FkTGlicmFyeUEAALoCSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbkFuZFNwaW5Db3VudABMAUZyZWVFbnZpcm9ubWVudFN0cmluZ3NBAMEBR2V0RW52aXJvbm1lbnRTdHJpbmdzAE0BRnJlZUVudmlyb25tZW50U3RyaW5nc1cAiARXaWRlQ2hhclRvTXVsdGlCeXRlAMMBR2V0RW52aXJvbm1lbnRTdHJpbmdzVwAAqgJIZWFwU2V0SW5mb3JtYXRpb24AAKQCSGVhcENyZWF0ZQAAUwNRdWVyeVBlcmZvcm1hbmNlQ291bnRlcgBqAkdldFRpY2tDb3VudAAArAFHZXRDdXJyZW50UHJvY2Vzc0lkAFMCR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUAqQJIZWFwUmVBbGxvYwCFAUdldENvbnNvbGVDUAAAlwFHZXRDb25zb2xlTW9kZQAAQwFGbHVzaEZpbGVCdWZmZXJzAADgAkxDTWFwU3RyaW5nQQAAGQNNdWx0aUJ5dGVUb1dpZGVDaGFyAOICTENNYXBTdHJpbmdXAABAAkdldFN0cmluZ1R5cGVBAABDAkdldFN0cmluZ1R5cGVXAADpAUdldExvY2FsZUluZm9BAADsA1NldEZpbGVQb2ludGVyAACrAkhlYXBTaXplAABEAENsb3NlSGFuZGxlAJAEV3JpdGVDb25zb2xlQQCbAUdldENvbnNvbGVPdXRwdXRDUAAAmgRXcml0ZUNvbnNvbGVXAAoEU2V0U3RkSGFuZGxlAAB6AENyZWF0ZUZpbGVBAFMAQ29tcGFyZVN0cmluZ0EAAFYAQ29tcGFyZVN0cmluZ1cAAN0DU2V0RW52aXJvbm1lbnRWYXJpYWJsZUEAS0VSTkVMMzIuZGxsAABoA1JlYWRGaWxlAADaA1NldEVuZE9mRmlsZQAAJgJHZXRQcm9jZXNzSGVhcAAAywFHZXRGaWxlQXR0cmlidXRlc0EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOBFAUABAAAAAAAAAAAAAADgRQFAAQAAAAEBAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADKi3y2ZKwAAzV0g0mbU//9MKQBAAQAAAAEAAAAAAAAAAPQAQAEAAADw8wBAAQAAAP//////////gAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAWAAAAAgAAAAIAAAADAAAAAgAAAAQAAAAYAAAABQAAAA0AAAAGAAAACQAAAAcAAAAMAAAACAAAAAwAAAAJAAAADAAAAAoAAAAHAAAACwAAAAgAAAAMAAAAFgAAAA0AAAAWAAAADwAAAAIAAAAQAAAADQAAABEAAAASAAAAEgAAAAIAAAAhAAAADQAAADUAAAACAAAAQQAAAA0AAABDAAAAAgAAAFAAAAARAAAAUgAAAA0AAABTAAAADQAAAFcAAAAWAAAAWQAAAAsAAABsAAAADQAAAG0AAAAgAAAAcAAAABwAAAByAAAACQAAAAYAAAAWAAAAgAAAAAoAAACBAAAACgAAAIIAAAAJAAAAgwAAABYAAACEAAAADQAAAJEAAAApAAAAngAAAA0AAAChAAAAAgAAAKQAAAALAAAApwAAAA0AAAC3AAAAEQAAAM4AAAACAAAA1wAAAAsAAAAYBwAADAAAAAwAAAAIAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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/f//hNIPhB8KAABDg73Y/f//AImdxP3//w+MCwoAAIrCLCA8WHcRD77CD76AWOJAAIPgDzP26wQz9jPAD76EwXjiQABqB8H4BFmJhZT9//87wQ+HrQkAAP8khd8yQACDjej9////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///opDwAAFmFwIqF7/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//UOjnOgAAg8QQhcB0H8eFwP3//wEAAADrE4pH/IiF9P3//8eF4P3//wEAAACNhfT9//+JheT9///pNQQAAIsHg8cEib3c/f//O8Z0O4tIBDvOdDT3hfD9//8ACAAAD78AiY3k/f//dBSZK8LR+MeFyP3//wEAAADp8AMAAIm1yP3//+nlAwAAoZASQQCJheT9//9Q6F44AABZ6c4DAACD+HAPj/sBAAAPhOMBAACD+GUPjLwDAACD+GcPjjT+//+D+Gl0cYP4bnQog/hvD4WgAwAA9oXw/f//gMeF4P3//wgAAAB0YYGN8P3//wACAADrVYs3g8cEib3c/f//6Nc3AACFwA+EL/r///aF8P3//yB0DGaLhdj9//9miQbrCIuF2P3//4kGx4XA/f//AQAAAOmmBAAAg43w/f//QMeF4P3//woAAACLjfD9///3wQCAAAAPhKkBAACLB4tXBIPHCOnVAQAAdRGA+md1ZceF6P3//wEAAADrWTmF6P3//34GiYXo/f//gb3o/f//owAAAH4/i7Xo/f//gcZdAQAAVugeCwAAipXv/f//WYmFvP3//4XAdBCJheT9//+JtaD9//+L2OsKx4Xo/f//owAAADP2iweDxwiJhYj9//+LR/yJhYz9//+NhaT9//9Q/7WQ/f//D77C/7Xo/f//ib3c/f//UP+1oP3//42FiP3//1NQ/zVYHEEA6D0gAABZ/9CLvfD9//+DxByB54AAAAB0IDm16P3//3UYjYWk/f//UFP/NWQcQQDoDiAAAFn/0FlZgL3v/f//Z3UcO/51GI2FpP3//1BT/zVgHEEA6OkfAABZ/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//mVJQU1fogDcAAIPBMIP5OYmdoP3//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//RlBG6IE1AACDxBCFwHUoOYWY/f//dCD/tZj9//+Nhdj9//+NTfTo8fT//4O9oP3//wBZdbXrHION2P3////rE4uN5P3//1CNhdj9///oyvT//1mDvdj9//8AfBv2hfD9//8EdBJXU2ogjYXY/f//6IL0//+DxAyDvbz9//8AdBP/tbz9///oBAgAAIOlvP3//wBZi53E/f//igOIhe/9//+EwHQTi42U/f//i73c/f//itDp4fX//4C9sP3//wB0CouFrP3//4NgcP2Lhdj9//+LTfxfXjPNW+gG7P//ycOQ6ipAAOsoQAAbKUAAeSlAAMUpQADQKUAAFipAAEQrQABqVGhQ9UAA6GUEAAAz/4l9/I1FnFD/FUDg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AACLhTTl//+JjUDl//+E2w+FygAAAImFPOX//zlNEA+GIAMAAOsGi7Uo5f//i4085f//g6VE5f//ACuNNOX//42FSOX//ztNEHM5i5U85f///4U85f//ihJBgPoKdRD/hTDl///GAA1A/4VE5f//iBBA/4VE5f//gb1E5f///xMAAHLCi9iNhUjl//8r2GoAjYUs5f//UFONhUjl//9Qiwb/NAf/FZjgQACFwA+EQgIAAIuFLOX//wGFOOX//zvDD4w6AgAAi4U85f//K4U05f//O0UQD4JM////6SACAACJhUTl//+A+wIPhdEAAAA5TRAPhk0CAADrBou1KOX//4uNROX//4OlPOX//wArjTTl//+NhUjl//87TRBzRouVROX//4OFROX//wIPtxJBQWaD+gp1FoOFMOX//wJqDVtmiRhAQIOFPOX//wKDhTzl//8CZokQQECBvTzl///+EwAAcrWL2I2FSOX//yvYagCNhSzl//9QU42FSOX//1CLBv80B/8VmOBAAIXAD4RiAQAAi4Us5f//AYU45f//O8MPjFoBAACLhUTl//8rhTTl//87RRAPgj/////pQAEAADlNEA+GfAEAAIuNROX//4OlPOX//wArjTTl//9qAo2FSPn//147TRBzPIuVROX//w+3EgG1ROX//wPOZoP6CnUOag1bZokYA8YBtTzl//8BtTzl//9miRADxoG9POX//6gGAAByvzP2VlZoVQ0AAI2N8Ov//1GNjUj5//8rwZkrwtH4UIvBUFZo6f0AAP8VsOBAAIvYO94PhJcAAABqAI2FLOX//1CLwyvGUI2ENfDr//9Qi4Uo5f//iwD/NAf/FZjgQACFwHQMA7Us5f//O95/y+sM/xVc4EAAiYVA5f//O95/XIuFROX//yuFNOX//4mFOOX//ztFEA+CCv///+s/agCNjSzl//9R/3UQ/7U05f///zD/FZjgQACFwHQVi4Us5f//g6VA5f//AImFOOX//+sM/xVc4EAAiYVA5f//g7045f//AHVsg71A5f//AHQtagVeObVA5f//dRToFrf//8cACQAAAOget///iTDrP/+1QOX//+git///Wesxi7Uo5f//iwb2RAcEQHQPi4U05f//gDgadQQzwOsk6Na2///HABwAAADo3rb//4MgAIPI/+sMi4U45f//K4Uw5f//X1uL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ycOL/1WL7FaLdQiF9g+EgQEAAP92BOh2r////3YI6G6v////dgzoZq////92EOher////3YU6Fav////dhjoTq////826Eev////diDoP6////92JOg3r////3Yo6C+v////dizoJ6////92MOgfr////3Y06Bev////dhzoD6////92OOgHr////3Y86P+u//+DxED/dkDo9K7///92ROjsrv///3ZI6OSu////dkzo3K7///92UOjUrv///3ZU6Myu////dljoxK7///92XOi8rv///3Zg6LSu////dmTorK7///92aOikrv///3Zs6Jyu////dnDolK7///92dOiMrv///3Z46ISu////dnzofK7//4PEQP+2gAAAAOhurv///7aEAAAA6GOu////togAAADoWK7///+2jAAAAOhNrv///7aQAAAA6EKu////tpQAAADoN67///+2mAAAAOgsrv///7acAAAA6CGu////tqAAAADoFq7///+2pAAAAOgLrv///7aoAAAA6ACu//+DxCxeXcOL/1WL7FaLdQiF9nQ1iwY7BUgdQQB0B1Do3a3//1mLRgQ7BUwdQQB0B1Doy63//1mLdgg7NVAdQQB0B1boua3//1leXcOL/1WL7FaLdQiF9nR+i0YMOwVUHUEAdAdQ6Jet//9Zi0YQOwVYHUEAdAdQ6IWt//9Zi0YUOwVcHUEAdAdQ6HOt//9Zi0YYOwVgHUEAdAdQ6GGt//9Zi0YcOwVkHUEAdAdQ6E+t//9Zi0YgOwVoHUEAdAdQ6D2t//9Zi3YkOzVsHUEAdAdW6Cut//9ZXl3Di/9Vi+yLRQhTM9tWVzvDdAeLfQw7+3cb6KGp//9qFl6JMFNTU1NT6Cqp//+DxBSLxus8i3UQO/N1BIgY69qL0DgadARCT3X4O/t07ooOiApCRjrLdANPdfM7+3UQiBjoWqn//2oiWYkIi/HrtTPAX15bXcPMzMzMzMxVi+xWM8BQUFBQUFBQUItVDI1JAIoCCsB0CYPCAQ+rBCTr8Yt1CIPJ/41JAIPBAYoGCsB0CYPGAQ+jBCRz7ovBg8QgXsnDi/9Vi+xTVot1CDPbVzldFHUQO/N1EDldDHUSM8BfXltdwzvzdAeLfQw7+3cb6Myo//9qFl6JMFNTU1NT6FWo//+DxBSLxuvVOV0UdQSIHuvKi1UQO9N1BIge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ZWMgJXMAAABDYW5ub3QgZmluZCBQeXRob24gZXhlY3V0YWJsZSAlcwoAAAAjIXB5dGhvbi5leGUAAAAAIyEAAENhbm5vdCBvcGVuICVzCgAtc2NyaXB0LnB5AABDb3JFeGl0UHJvY2VzcwAAbQBzAGMAbwByAGUAZQAuAGQAbABsAAAAKABuAHUAbABsACkAAAAAAChudWxsKQAAAAAAAAYAAAYAAQAAEAADBgAGAhAERUVFBQUFBQU1MABQAAAAACggOFBYBwgANzAwV1AHAAAgIAgAAAAACGBoYGBgYAAAeHB4eHh4CAcIAAAHAAgICAAACAAIAAcIAAAAqCFBAAAiQQAAAAAAAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+fwA9AAAARW5jb2RlUG9pbnRlcgAAAEsARQBSAE4ARQBMADMAMgAuAEQATABMAAAAAABEZWNvZGVQb2ludGVyAAAARmxzRnJlZQBGbHNTZXRWYWx1ZQBGbHNHZXRWYWx1ZQBGbHNBbGxvYwAAAABydW50aW1lIGVycm9yIAAADQoAAFRMT1NTIGVycm9yDQoAAABTSU5HIGVycm9yDQoAAAAARE9NQUlOIGVycm9yDQoAAFI2MDM0DQpBbiBhcHBsaWNhdGlvbiBoYXMgbWFkZSBhbiBhdHRlbXB0IHRvIGxvYWQgdGhlIEMgcnVudGltZSBsaWJyYXJ5IGluY29ycmVjdGx5LgpQbGVhc2UgY29udGFjdCB0aGUgYXBwbGljYXRpb24ncyBzdXBwb3J0IHRlYW0gZm9yIG1vcmUgaW5mb3JtYXRpb24uDQoAAAAAAABSNjAzMw0KLSBBdHRlbXB0IHRvIHVzZSBNU0lMIGNvZGUgZnJvbSB0aGlzIGFzc2VtYmx5IGR1cmluZyBuYXRpdmUgY29kZSBpbml0aWFsaXphdGlvbgpUaGlzIGluZGljYXRlcyBhIGJ1ZyBpbiB5b3VyIGFwcGxpY2F0aW9uLiBJdCBpcyBtb3N0IGxpa2VseSB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgYW4gTVNJTC1jb21waWxlZCAoL2NscikgZnVuY3Rpb24gZnJvbSBhIG5hdGl2ZSBjb25zdHJ1Y3RvciBvciBmcm9tIERsbE1haW4uDQoAAFI2MDMyDQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGxvY2FsZSBpbmZvcm1hdGlvbg0KAAAAAAAAUjYwMzENCi0gQXR0ZW1wdCB0byBpbml0aWFsaXplIHRoZSBDUlQgbW9yZSB0aGFuIG9uY2UuClRoaXMgaW5kaWNhdGVzIGEgYnVnIGluIHlvdXIgYXBwbGljYXRpb24uDQoAAFI2MDMwDQotIENSVCBub3QgaW5pdGlhbGl6ZWQNCgAAUjYwMjgNCi0gdW5hYmxlIHRvIGluaXRpYWxpemUgaGVhcA0KAAAAAFI2MDI3DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGxvd2lvIGluaXRpYWxpemF0aW9uDQoAAAAAUjYwMjYNCi0gbm90IGVub3VnaCBzcGFjZSBmb3Igc3RkaW8gaW5pdGlhbGl6YXRpb24NCgAAAABSNjAyNQ0KLSBwdXJlIHZpcnR1YWwgZnVuY3Rpb24gY2FsbA0KAAAAUjYwMjQNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgX29uZXhpdC9hdGV4aXQgdGFibGUNCgAAAABSNjAxOQ0KLSB1bmFibGUgdG8gb3BlbiBjb25zb2xlIGRldmljZQ0KAAAAAFI2MDE4DQotIHVuZXhwZWN0ZWQgaGVhcCBlcnJvcg0KAAAAAFI2MDE3DQotIHVuZXhwZWN0ZWQgbXVsdGl0aHJlYWQgbG9jayBlcnJvcg0KAAAAAFI2MDE2DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIHRocmVhZCBkYXRhDQoADQpUaGlzIGFwcGxpY2F0aW9uIGhhcyByZXF1ZXN0ZWQgdGhlIFJ1bnRpbWUgdG8gdGVybWluYXRlIGl0IGluIGFuIHVudXN1YWwgd2F5LgpQbGVhc2UgY29udGFjdCB0aGUgYXBwbGljYXRpb24ncyBzdXBwb3J0IHRlYW0gZm9yIG1vcmUgaW5mb3JtYXRpb24uDQoAAABSNjAwOQ0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBlbnZpcm9ubWVudA0KAFI2MDA4DQotIG5vdCBlbm91Z2gg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ZGF5AE1vbmRheQAAU3VuZGF5AABTYXQARnJpAFRodQBXZWQAVHVlAE1vbgBTdW4AR2V0UHJvY2Vzc1dpbmRvd1N0YXRpb24AR2V0VXNlck9iamVjdEluZm9ybWF0aW9uQQAAAEdldExhc3RBY3RpdmVQb3B1cAAAR2V0QWN0aXZlV2luZG93AE1lc3NhZ2VCb3hBAFVTRVIzMi5ETEwAAFN1bk1vblR1ZVdlZFRodUZyaVNhdAAAAEphbkZlYk1hckFwck1heUp1bkp1bEF1Z1NlcE9jdE5vdkRlYwAAAABDT05PVVQkAC5jb20AAAAALmV4ZQAAAAAuYmF0AAAAAC5jbWQAAAAALlwAAFN5c3RlbVJvb3QAAAAAAABIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAEkEA0PRAAAMAAADQNwAAIGkAABCZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAANcYQAAAAAAA/v///wAAAADI////AAAAAP7///8AAAAAvCNAAAAAAAD+////AAAAAMz///8AAAAA/v///6klQAC9JUAAAAAAAP7///8AAAAAjP///wAAAAD+////PDVAAEA1QAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAA4zpAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAACxO0AAAAAAAP7///8AAAAAzP///wAAAAD+////AAAAADs9QAAAAAAAAAAAAAc9QAD+////AAAAANT///8AAAAA/v///wAAAADAPkAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAPM/QAAAAAAA/v///wAAAADU////AAAAAP7///8dQUAAOUFAAAAAAAD+////AAAAANT///8AAAAA/v///wAAAAAtR0AAAAAAAP7///8AAAAAzP///wAAAAD+////AAAAAPtKQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAa05AAAAAAAD+////AAAAANT///8AAAAA/v///wAAAACtUEAA/v///wAAAAC8UEAA/v///wAAAADY////AAAAAP7///8AAAAAb1JAAP7///8AAAAAe1JAAP7///8AAAAA1P///wAAAAD+////AAAAADVZQAAAAAAA/v///wAAAADY////AAAAAP7////bWkAA71pAAAAAAAD+////AAAAANj///8AAAAA/v///y1bQAAxW0AAAAAAAP7///8AAAAAwP///wAAAAD+////AAAAAIheQAAAAAAA/v///wAAAADQ////AAAAAP7///8YX0AAL19AAAAAAAD+////AAAAANT///8AAAAA/v///wAAAAApakAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAADpsQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAPnlAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAABOgUAAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAC+CQAAAAAAA/v///wAAAADM////AAAAAP7///8AAAAAJJVAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAAC9l0AAAAAAAP7///8AAAAA0P///wAAAAD+////AAAAAFShQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAy6VAAAAAAAD+////AAAAAMj///8AAAAA/v///wAAAACRp0AAAAAAAAAAAADNpkAA/v///wAAAADQ////AAAAAP7///8AAAAATK5AAAAAAAD+////AAAAAND///8AAAAA/v///wAAAABowkAAAAAAAP7///8AAAAAzP///wAAAAD+////AAAAAAvKQABU+QAAAAAAAAAAAAAOAAEAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlPoAALD6AADG+gAA3PoAAO76AAAG+wAAHPsAADT7AABM+wAAYPsAAGj7AAB6+wAAiPsAAJr7AACs+wAAvPsAAMr7AADc+wAA9PsAAAj8AAAc/AAAOPwAAFb8AABq/AAAevwAAIb8AACS/AAAnvwAALb8AADO/AAA2PwAAOT8AAD2/AAABP0AABD9AAAe/QAAKP0AADj9AABO/QAAWv0AAGr9AACS/QAArP0AAMT9AADe/QAA9P0AAA7+AAAc/gAAKv4AAET+AABU/gAAav4AAIT+AACQ/gAAnv4AAK7+AAC+/gAA0P4AAOT+AAD0/gAACv8AABr/AAAs/wAAPv8AAFD/AABi/wAAbv8AAHz/AACM/wAAov8AALL/AADC/wAA0P8AAOL/AAD0/wAAHAABACgAAQA4AAEASgABAAAAAABSAUdlbmVyYXRlQ29uc29sZUN0cmxFdmVudAAAxgFHZXRFeGl0Q29kZVByb2Nlc3MAAG4EV2FpdEZvclNpbmdsZU9iamVjdACVAENyZWF0ZVByb2Nlc3NBAACvA1NldENvbnNvbGVDdHJsSGFuZGxlcgD1AUdldE1vZHVsZUZpbGVOYW1lQQAA2gBFbnRlckNyaXRpY2FsU2VjdGlvbgAA9AJMZWF2ZUNyaXRpY2FsU2VjdGlvbgAA+gFHZXRNb2R1bGVIYW5kbGVXAAArBFNsZWVwACICR2V0UHJvY0FkZHJlc3MAAAUBRXhpdFByb2Nlc3MAcAFHZXRDb21tYW5kTGluZUEA8ANTZXRIYW5kbGVDb3VudAAAPgJHZXRTdGRIYW5kbGUAANgBR2V0RmlsZVR5cGUAPAJHZXRTdGFydHVwSW5mb0EAvwBEZWxldGVDcml0aWNhbFNlY3Rpb24ANwRUZXJtaW5hdGVQcm9jZXNzAACqAUdldEN1cnJlbnRQcm9jZXNzAEgEVW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyAAAfBFNldFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcgDWAklzRGVidWdnZXJQcmVzZW50AOcBR2V0TGFzdEVycm9yAACmAkhlYXBGcmVlAACiAkhlYXBBbGxvYwBcAUdldENQSW5mbwDFAkludGVybG9ja2VkSW5jcmVtZW50AADBAkludGVybG9ja2VkRGVjcmVtZW50AABTAUdldEFDUAAAFAJHZXRPRU1DUAAA4AJJc1ZhbGlkQ29kZVBhZ2UAPgRUbHNHZXRWYWx1ZQA8BFRsc0FsbG9jAAA/BFRsc1NldFZhbHVlAD0EVGxzRnJlZQD0A1NldExhc3RFcnJvcgAArgFHZXRDdXJyZW50VGhyZWFkSWQAAJcEV3JpdGVGaWxlAPYCTG9hZExpYnJhcnlBAAC6AkluaXRpYWxpemVDcml0aWNhbFNlY3Rpb25BbmRTcGluQ291bnQASwFGcmVlRW52aXJvbm1lbnRTdHJpbmdzQQDAAUdldEVudmlyb25tZW50U3RyaW5ncwBMAUZyZWVFbnZpcm9ubWVudFN0cmluZ3NXAIQEV2lkZUNoYXJUb011bHRpQnl0ZQDCAUdldEVudmlyb25tZW50U3RyaW5nc1cAAKQCSGVhcENyZWF0ZQAAYQRWaXJ0dWFsRnJlZQBZA1F1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyAGoCR2V0VGlja0NvdW50AACrAUdldEN1cnJlbnRQcm9jZXNzSWQAUwJHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZQCaA1J0bFVud2luZACpAkhlYXBSZUFsbG9jAF4EVmlydHVhbEFsbG9jAACEAUdldENvbnNvbGVDUAAAlgFHZXRDb25zb2xlTW9kZQAAQgFGbHVzaEZpbGVCdWZmZXJzAADmAkxDTWFwU3RyaW5nQQAAHwNNdWx0aUJ5dGVUb1dpZGVDaGFyAOgCTENNYXBTdHJpbmdXAABAAkdldFN0cmluZ1R5cGVBAABDAkdldFN0cmluZ1R5cGVXAADpAUdldExvY2FsZUluZm9BAADnA1NldEZpbGVQb2ludGVyAACrAkhlYXBTaXplAABEAENsb3NlSGFuZGxlAIwEV3JpdGVDb25zb2xlQQCaAUdldENvbnNvbGVPdXRwdXRDUAAAlgRXcml0ZUNvbnNvbGVXAAYEU2V0U3RkSGFuZGxlAAB5AENyZWF0ZUZpbGVBAFMAQ29tcGFyZVN0cmluZ0EAAFYAQ29tcGFyZVN0cmluZ1cAANgDU2V0RW52aXJvbm1lbnRWYXJpYWJsZUEAS0VSTkVMMzIuZGxsAABuA1JlYWRGaWxlAADVA1NldEVuZE9mRmlsZQAAJgJHZXRQcm9jZXNzSGVhcAAAygFHZXRGaWxlQXR0cmlidXRlc0EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwCtBAAAAAADAK0EAAQEAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE7mQLuxGb9E6iNAAAEAAABs4kAAXOJAAP////+ACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAFgAAAAIAAAACAAAAAwAAAAIAAAAEAAAAGAAAAAUAAAANAAAABgAAAAkAAAAHAAAADAAAAAgAAAAMAAAACQAAAAwAAAAKAAAABwAAAAsAAAAIAAAADAAAABYAAAANAAAAFgAAAA8AAAACAAAAEAAAAA0AAAARAAAAEgAAABIAAAACAAAAIQAAAA0AAAA1AAAAAgAAAEEAAAANAAAAQwAAAAIAAABQAAAAEQAAAFIAAAANAAAAUwAAAA0AAABXAAAAFgAAAFkAAAALAAAAbAAAAA0AAABtAAAAIAAAAHAAAAAcAAAAcgAAAAkAAAAGAAAAFgAAAIAAAAAKAAAAgQAAAAoAAACCAAAACQAAAIMAAAAWAAAAhAAAAA0AAACRAAAAKQAAAJ4AAAANAAAAoQAAAAIAAACkAAAACwAAAKcAAAANAAAAtwAAABEAAADOAAAAAgAAANcAAAALAAAAGAcAAAwAAAAMAAAACAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAAAAAAAACAgICAgICAgICAgICAgICAgICAgICAgICAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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LCAndGVzdCcsICdpbnN0YWxsX2VnZ19pbmZvJywgJ2luc3RhbGxfc2NyaXB0cycsCiAgICAncmVnaXN0ZXInLCAnYmRpc3Rfd2luaW5zdCcsICd1cGxvYWRfZG9jcycsICd1cGxvYWQnLCAnYnVpbGRfY2xpYicsCiAgICAnZGlzdF9pbmZvJywKXQoKZnJvbSBkaXN0dXRpbHMuY29tbWFuZC5iZGlzdCBpbXBvcnQgYmRpc3QKaW1wb3J0IHN5cwoKZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQgaW1wb3J0IGluc3RhbGxfc2NyaXB0cwoKaWYgJ2VnZycgbm90IGluIGJkaXN0LmZvcm1hdF9jb21tYW5kczoKICAgIGJkaXN0LmZvcm1hdF9jb21tYW5kWydlZ2cnXSA9ICgnYmRpc3RfZWdnJywgIlB5dGhvbiAuZWdnIGZpbGUiKQogICAgYmRpc3QuZm9ybWF0X2NvbW1hbmRzLmFwcGVuZCgnZWdnJykKCmRlbCBiZGlzdCwgc3lzClBLAwQUAAAAAAAAACEAUPgj8noJAAB6CQAAMwAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9hbGlhcy5weWZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzT3B0aW9uRXJyb3IKCmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCBtYXAKCmZyb20gc2V0dXB0b29scy5jb21tYW5kLnNldG9wdCBpbXBvcnQgZWRpdF9jb25maWcsIG9wdGlvbl9iYXNlLCBjb25maWdfZmlsZQoKCmRlZiBzaHF1b3RlKGFyZyk6CiAgICAiIiJRdW90ZSBhbiBhcmd1bWVudCBmb3IgbGF0ZXIgcGFyc2luZyBieSBzaGxleC5zcGxpdCgpIiIiCiAgICBmb3IgYyBpbiAnIicsICInIiwgIlxcIiwgIiMiOgogICAgICAgIGlmIGMgaW4gYXJnOgogICAgICAgICAgICByZXR1cm4gcmVwcihhcmcpCiAgICBpZiBhcmcuc3BsaXQoKSAhPSBbYXJnXToKICAgICAgICByZXR1cm4gcmVwcihhcmcpCiAgICByZXR1cm4gYXJnCgoKY2xhc3MgYWxpYXMob3B0aW9uX2Jhc2UpOgogICAgIiIiRGVmaW5lIGEgc2hvcnRjdXQgdGhhdCBpbnZva2VzIG9uZSBvciBtb3JlIGNvbW1hbmRzIiIiCgogICAgZGVzY3JpcHRpb24gPSAiZGVmaW5lIGEgc2hvcnRjdXQgdG8gaW52b2tlIG9uZSBvciBtb3JlIGNvbW1hbmRzIgogICAgY29tbWFuZF9jb25zdW1lc19hcmd1bWVudHMgPSBUcnVlCgogICAgdXNlcl9vcHRpb25zID0gWwogICAgICAgICgncmVtb3ZlJywgJ3InLCAncmVtb3ZlICh1bnNldCkgdGhlIGFsaWFzJyksCiAgICBdICsgb3B0aW9uX2Jhc2UudXNlcl9vcHRpb25zCgogICAgYm9vbGVhbl9vcHRpb25zID0gb3B0aW9uX2Jhc2UuYm9vbGVhbl9vcHRpb25zICsgWydyZW1vdmUnXQoKICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgb3B0aW9uX2Jhc2UuaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpCiAgICAgICAgc2VsZi5hcmdzID0gTm9uZQogICAgICAgIHNlbGYucmVtb3ZlID0gTm9uZQoKICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIG9wdGlvbl9iYXNlLmZpbmFsaXplX29wdGlvbnMoc2VsZikKICAgICAgICBpZiBzZWxmLnJlbW92ZSBhbmQgbGVuKHNlbGYuYXJncykgIT0gMToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAiTXVzdCBzcGVjaWZ5IGV4YWN0bHkgb25lIGFyZ3VtZW50ICh0aGUgYWxpYXMgbmFtZSkgd2hlbiAiCiAgICAgICAgICAgICAgICAidXNpbmcgLS1yZW1vdmUiCiAgICAgICAgICAgICkKCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgIGFsaWFzZXMgPSBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfb3B0aW9uX2RpY3QoJ2FsaWFzZXMnKQoKICAgICAgICBpZiBub3Qgc2VsZi5hcmdzOgogICAgICAgICAgICBwcmludCgiQ29tbWFuZCBBbGlhc2VzIikKICAgICAgICAgICAgcHJpbnQoIi0tLS0tLS0tLS0tLS0tLSIpCiAgICAgICAgICAgIGZvciBhbGlhcyBpbiBhbGlhc2VzOgogICAgICAgICAgICAgICAgcHJpbnQoInNldHVwLnB5IGFsaWFzIiwgZm9ybWF0X2FsaWFzKGFsaWFzLCBhbGlhc2VzKSkKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGVsaWYgbGVuKHNlbGYuYXJncykgPT0gMToKICAgICAgICAgICAgYWxpYXMsID0gc2VsZi5hcmdzCiAgICAgICAgICAgIGlmIHNlbGYucmVtb3ZlOgogICAgICAgICAgICAgICAgY29tbWFuZCA9IE5vbmUKICAgICAgICAgICAgZWxpZiBhbGlhcyBpbiBhbGlhc2VzOgogICAgICAgICAgICAgICAgcHJpbnQoInNldHVwLnB5IGFsaWFzIiwgZm9ybWF0X2FsaWFzKGFsaWFzLCBhbGlhc2VzKSkKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcHJpbnQoIk5vIGFsaWFzIGRlZmluaXRpb24gZm91bmQgZm9yICVyIiAlIGFsaWFzKQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYWxpYXMgPSBzZWxmLmFyZ3NbMF0KICAgICAgICAgICAgY29tbWFuZCA9ICcgJy5qb2luKG1hcChzaHF1b3RlLCBzZWxmLmFyZ3NbMTpdKSkKCiAgICAgICAgZWRpdF9jb25maWcoc2VsZi5maWxlbmFtZSwgeydhbGlhc2VzJzoge2FsaWFzOiBjb21tYW5kfX0sIHNlbGYuZHJ5X3J1bikKCgpkZWYgZm9ybWF0X2FsaWFzKG5hbWUsIGFsaWFzZXMpOgogICAgc291cmNlLCBjb21tYW5kID0gYWxpYXNlc1tuYW1lXQogICAgaWYgc291cmNlID09IGNvbmZpZ19maWxlKCdnbG9iYWwnKToKICAgICAgICBzb3VyY2UgPSAnLS1nbG9iYWwtY29uZmlnICcKICAgIGVsaWYgc291cmNlID09IGNvbmZpZ19maWxlKCd1c2VyJyk6CiAgICAgICAgc291cmNlID0gJy0tdXNlci1jb25maWcgJwogICAgZWxpZiBzb3VyY2UgPT0gY29uZmlnX2ZpbGUoJ2xvY2FsJyk6CiAgICAgICAgc291cmNlID0gJycKICAgIGVsc2U6CiAgICAgICAgc291cmNlID0gJy0tZmlsZW5hbWU9JXInICUgc291cmNlCiAgICByZXR1cm4gc291cmNlICsgbmFtZSArICcgJyArIGNvbW1hbmQKUEsDBBQAAAAAAAAAIQBJzCuhW0YAAFtGAAA3AAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL2JkaXN0X2VnZy5weSIiInNldHVwdG9vbHMuY29tbWFuZC5iZGlzdF9lZ2cKCkJ1aWxkIC5lZ2cgZGlzdHJpYnV0aW9ucyIiIgoKZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNTZXR1cEVycm9yCmZyb20gZGlzdHV0aWxzLmRpcl91dGlsIGltcG9ydCByZW1vdmVfdHJlZSwgbWtwYXRoCmZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKZnJvbSB0eXBlcyBpbXBvcnQgQ29kZVR5cGUKaW1wb3J0IHN5cwppbXBvcnQgb3MKaW1wb3J0IHJlCmltcG9ydCB0ZXh0d3JhcAppbXBvcnQgbWFyc2hhbAoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybiBpbXBvcnQgc2l4Cgpmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IGdldF9idWlsZF9wbGF0Zm9ybSwgRGlzdHJpYnV0aW9uLCBlbnN1cmVfZGlyZWN0b3J5CmZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgRW50cnlQb2ludApmcm9tIHNldHVwdG9vbHMuZXh0ZW5zaW9uIGltcG9ydCBMaWJyYXJ5CmZyb20gc2V0dXB0b29scyBpbXBvcnQgQ29tbWFuZAoKdHJ5OgogICAgIyBQeXRob24gMi43IG9yID49My4yCiAgICBmcm9tIHN5c2NvbmZpZyBpbXBvcnQgZ2V0X3BhdGgsIGdldF9weXRob25fdmVyc2lvbgoKICAgIGRlZiBfZ2V0X3B1cmVsaWIoKToKICAgICAgICByZXR1cm4gZ2V0X3BhdGgoInB1cmVsaWIiKQpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBmcm9tIGRpc3R1dGlscy5zeXNjb25maWcgaW1wb3J0IGdldF9weXRob25fbGliLCBnZXRfcHl0aG9uX3ZlcnNpb24KCiAgICBkZWYgX2dldF9wdXJlbGliKCk6CiAgICAgICAgcmV0dXJuIGdldF9weXRob25fbGliKEZhbHNlKQoKCmRlZiBzdHJpcF9tb2R1bGUoZmlsZW5hbWUpOgogICAgaWYgJy4nIGluIGZpbGVuYW1lOgogICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5zcGxpdGV4dChmaWxlbmFtZSlbMF0KICAgIGlmIGZpbGVuYW1lLmVuZHN3aXRoKCdtb2R1bGUnKToKICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lWzotNl0KICAgIHJldHVybiBmaWxlbmFtZQoKZGVmIHNvcnRlZF93YWxrKGRpcik6CiAgICAiIiJEbyBvcy53YWxrIGluIGEgcmVwcm9kdWNpYmxlIHdheSwKICAgIGluZGVwZW5kZW50IG9mIGluZGV0ZXJtaW5pc3RpYyBmaWxlc3lzdGVtIHJlYWRkaXIgb3JkZXIKICAgICIiIgogICAgZm9yIGJhc2UsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsoZGlyKToKICAgICAgICBkaXJzLnNvcnQoKQogICAgICAgIGZpbGVzLnNvcnQoKQogICAgICAgIHlpZWxkIGJhc2UsIGRpcnMsIGZpbGVzCgpkZWYgd3JpdGVfc3R1YihyZXNvdXJjZSwgcHlmaWxlKToKICAgIF9zdHViX3RlbXBsYXRlID0gdGV4dHdyYXAuZGVkZW50KCIiIgogICAgICAgIGRlZiBfX2Jvb3RzdHJhcF9fKCk6CiAgICAgICAgICAgIGdsb2JhbCBfX2Jvb3RzdHJhcF9fLCBfX2xvYWRlcl9fLCBfX2ZpbGVfXwogICAgICAgICAgICBpbXBvcnQgc3lzLCBwa2dfcmVzb3VyY2VzLCBpbXAKICAgICAgICAgICAgX19maWxlX18gPSBwa2dfcmVzb3VyY2VzLnJlc291cmNlX2ZpbGVuYW1lKF9fbmFtZV9fLCAlcikKICAgICAgICAgICAgX19sb2FkZXJfXyA9IE5vbmU7IGRlbCBfX2Jvb3RzdHJhcF9fLCBfX2xvYWRlcl9fCiAgICAgICAgICAgIGltcC5sb2FkX2R5bmFtaWMoX19uYW1lX18sX19maWxlX18pCiAgICAgICAgX19ib290c3RyYXBfXygpCiAgICAgICAgIiIiKS5sc3RyaXAoKQogICAgd2l0aCBvcGVuKHB5ZmlsZSwgJ3cnKSBhcyBmOgogICAgICAgIGYud3JpdGUoX3N0dWJfdGVtcGxhdGUgJSByZXNvdXJjZSkKCgpjbGFzcyBiZGlzdF9lZ2coQ29tbWFuZCk6CiAgICBkZXNjcmlwdGlvbiA9ICJjcmVhdGUgYW4gXCJlZ2dcIiBkaXN0cmlidXRpb24iCgogICAgdXNlcl9vcHRpb25zID0gWwogICAgICAgICgnYmRpc3QtZGlyPScsICdiJywKICAgICAgICAgInRlbXBvcmFyeSBkaXJlY3RvcnkgZm9yIGNyZWF0aW5nIHRoZSBkaXN0cmlidXRpb24iKSwKICAgICAgICAoJ3BsYXQtbmFtZT0nLCAncCcsICJwbGF0Zm9ybSBuYW1lIHRvIGVtYmVkIGluIGdlbmVyYXRlZCBmaWxlbmFtZXMgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIihkZWZhdWx0OiAlcykiICUgZ2V0X2J1aWxkX3BsYXRmb3JtKCkpLAogICAgICAgICgnZXhjbHVkZS1zb3VyY2UtZmlsZXMnLCBOb25lLAogICAgICAgICAicmVtb3ZlIGFsbCAucHkgZmlsZXMgZnJvbSB0aGUgZ2VuZXJhdGVkIGVnZyIpLAogICAgICAgICgna2VlcC10ZW1wJywgJ2snLAogICAgICAgICAia2VlcCB0aGUgcHNldWRvLWluc3RhbGxhdGlvbiB0cmVlIGFyb3VuZCBhZnRlciAiICsKICAgICAgICAgImNyZWF0aW5nIHRoZSBkaXN0cmlidXRpb24gYXJjaGl2ZSIpLAogICAgICAgICgnZGlzdC1kaXI9JywgJ2QnLAogICAgICAgICAiZGlyZWN0b3J5IHRvIHB1dCBmaW5hbCBidWlsdCBkaXN0cmlidXRpb25zIGluIiksCiAgICAgICAgKCdza2lwLWJ1aWxkJywgTm9uZSwKICAgICAgICAgInNraXAgcmVidWlsZGluZyBldmVyeXRoaW5nIChmb3IgdGVzdGluZy9kZWJ1Z2dpbmcpIiksCiAgICBdCgogICAgYm9vbGVhbl9vcHRpb25zID0gWwogICAgICAgICdrZWVwLXRlbXAnLCAnc2tpcC1idWlsZCcsICdleGNsdWRlLXNvdXJjZS1maWxlcycKICAgIF0KCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIHNlbGYuYmRpc3RfZGlyID0gTm9uZQogICAgICAgIHNlbGYucGxhdF9uYW1lID0gTm9uZQogICAgICAgIHNlbGYua2VlcF90ZW1wID0gMAogICAgICAgIHNlbGYuZGlzdF9kaXIgPSBOb25lCiAgICAgICAgc2VsZi5za2lwX2J1aWxkID0gMAogICAgICAgIHNlbGYuZWdnX291dHB1dCA9IE5vbmUKICAgICAgICBzZWxmLmV4Y2x1ZGVfc291cmNlX2ZpbGVzID0gTm9uZQoKICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIGVpX2NtZCA9IHNlbGYuZWlfY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoImVnZ19pbmZvIikKICAgICAgICBzZWxmLmVnZ19pbmZvID0gZWlfY21kLmVnZ19pbmZvCgogICAgICAgIGlmIHNlbGYuYmRpc3RfZGlyIGlzIE5vbmU6CiAgICAgICAgICAgIGJkaXN0X2Jhc2UgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYmRpc3QnKS5iZGlzdF9iYXNlCiAgICAgICAgICAgIHNlbGYuYmRpc3RfZGlyID0gb3MucGF0aC5qb2luKGJkaXN0X2Jhc2UsICdlZ2cnKQoKICAgICAgICBpZiBzZWxmLnBsYXRfbmFtZSBpcyBOb25lOgogICAgICAgICAgICBzZWxmLnBsYXRfbmFtZSA9IGdldF9idWlsZF9wbGF0Zm9ybSgpCgogICAgICAgIHNlbGYuc2V0X3VuZGVmaW5lZF9vcHRpb25zKCdiZGlzdCcsICgnZGlzdF9kaXInLCAnZGlzdF9kaXInKSkKCiAgICAgICAgaWYgc2VsZi5lZ2dfb3V0cHV0IGlzIE5vbmU6CgogICAgICAgICAgICAjIENvbXB1dGUgZmlsZW5hbWUgb2YgdGhlIG91dHB1dCBlZ2cKICAgICAgICAgICAgYmFzZW5hbWUgPSBEaXN0cmlidXRpb24oCiAgICAgICAgICAgICAgICBOb25lLCBOb25lLCBlaV9jbWQuZWdnX25hbWUsIGVpX2NtZC5lZ2dfdmVyc2lvbiwKICAgICAgICAgICAgICAgIGdldF9weXRob25fdmVyc2lvbigpLAogICAgICAgICAgICAgICAgc2VsZi5kaXN0cmlidXRpb24uaGFzX2V4dF9tb2R1bGVzKCkgYW5kIHNlbGYucGxhdF9uYW1lCiAgICAgICAgICAgICkuZWdnX25hbWUoKQoKICAgICAgICAgICAgc2VsZi5lZ2dfb3V0cHV0ID0gb3MucGF0aC5qb2luKHNlbGYuZGlzdF9kaXIsIGJhc2VuYW1lICsgJy5lZ2cnKQoKICAgIGRlZiBkb19pbnN0YWxsX2RhdGEoc2VsZik6CiAgICAgICAgIyBIYWNrIGZvciBwYWNrYWdlcyB0aGF0IGluc3RhbGwgZGF0YSB0byBpbnN0YWxsJ3MgLS1pbnN0YWxsLWxpYgogICAgICAgIHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdpbnN0YWxsJykuaW5zdGFsbF9saWIgPSBzZWxmLmJkaXN0X2RpcgoKICAgICAgICBzaXRlX3BhY2thZ2VzID0gb3MucGF0aC5ub3JtY2FzZShvcy5wYXRoLnJlYWxwYXRoKF9nZXRfcHVyZWxpYigpKSkKICAgICAgICBvbGQsIHNlbGYuZGlzdHJpYnV0aW9uLmRhdGFfZmlsZXMgPSBzZWxmLmRpc3RyaWJ1dGlvbi5kYXRhX2ZpbGVzLCBbXQoKICAgICAgICBmb3IgaXRlbSBpbiBvbGQ6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoaXRlbSwgdHVwbGUpIGFuZCBsZW4oaXRlbSkgPT0gMjoKICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNhYnMoaXRlbVswXSk6CiAgICAgICAgICAgICAgICAgICAgcmVhbHBhdGggPSBvcy5wYXRoLnJlYWxwYXRoKGl0ZW1bMF0pCiAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZCA9IG9zLnBhdGgubm9ybWNhc2UocmVhbHBhdGgpCiAgICAgICAgICAgICAgICAgICAgaWYgbm9ybWFsaXplZCA9PSBzaXRlX3BhY2thZ2VzIG9yIG5vcm1hbGl6ZWQuc3RhcnRzd2l0aCgKICAgICAgICAgICAgICAgICAgICAgICAgc2l0ZV9wYWNrYWdlcyArIG9zLnNlcAogICAgICAgICAgICAgICAgICAgICk6CiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0gPSByZWFscGF0aFtsZW4oc2l0ZV9wYWNrYWdlcykgKyAxOl0sIGl0ZW1bMV0KICAgICAgICAgICAgICAgICAgICAgICAgIyBYWFggZWxzZTogcmFpc2UgPz8/CiAgICAgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uLmRhdGFfZmlsZXMuYXBwZW5kKGl0ZW0pCgogICAgICAgIHRyeToKICAgICAgICAgICAgbG9nLmluZm8oImluc3RhbGxpbmcgcGFja2FnZSBkYXRhIHRvICVzIiwgc2VsZi5iZGlzdF9kaXIpCiAgICAgICAgICAgIHNlbGYuY2FsbF9jb21tYW5kKCdpbnN0YWxsX2RhdGEnLCBmb3JjZT0wLCByb290PU5vbmUpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgc2VsZi5kaXN0cmlidXRpb24uZGF0YV9maWxlcyA9IG9sZAoKICAgIGRlZiBnZXRfb3V0cHV0cyhzZWxmKToKICAgICAgICByZXR1cm4gW3NlbGYuZWdnX291dHB1dF0KCiAgICBkZWYgY2FsbF9jb21tYW5kKHNlbGYsIGNtZG5hbWUsICoqa3cpOgogICAgICAgICIiIkludm9rZSByZWluaXRpYWxpemVkIGNvbW1hbmQgYGNtZG5hbWVgIHdpdGgga2V5d29yZCBhcmdzIiIiCiAgICAgICAgZm9yIGRpcm5hbWUgaW4gSU5TVEFMTF9ESVJFQ1RPUllfQVRUUlM6CiAgICAgICAgICAgIGt3LnNldGRlZmF1bHQoZGlybmFtZSwgc2VsZi5iZGlzdF9kaXIpCiAgICAgICAga3cuc2V0ZGVmYXVsdCgnc2tpcF9idWlsZCcsIHNlbGYuc2tpcF9idWlsZCkKICAgICAgICBrdy5zZXRkZWZhdWx0KCdkcnlfcnVuJywgc2VsZi5kcnlfcnVuKQogICAgICAgIGNtZCA9IHNlbGYucmVpbml0aWFsaXplX2NvbW1hbmQoY21kbmFtZSwgKiprdykKICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKGNtZG5hbWUpCiAgICAgICAgcmV0dXJuIGNtZAoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIyBHZW5lcmF0ZSBtZXRhZGF0YSBmaXJzdAogICAgICAgIHNlbGYucnVuX2NvbW1hbmQoImVnZ19pbmZvIikKICAgICAgICAjIFdlIHJ1biBpbnN0YWxsX2xpYiBiZWZvcmUgaW5zdGFsbF9kYXRhLCBiZWNhdXNlIHNvbWUgZGF0YSBoYWNrcwogICAgICAgICMgcHVsbCB0aGVpciBkYXRhIHBhdGggZnJvbSB0aGUgaW5zdGFsbF9saWIgY29tbWFuZC4KICAgICAgICBsb2cuaW5mbygiaW5zdGFsbGluZyBsaWJyYXJ5IGNvZGUgdG8gJXMiLCBzZWxmLmJkaXN0X2RpcikKICAgICAgICBpbnN0Y21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2luc3RhbGwnKQogICAgICAgIG9sZF9yb290ID0gaW5zdGNtZC5yb290CiAgICAgICAgaW5zdGNtZC5yb290ID0gTm9uZQogICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLmhhc19jX2xpYnJhcmllcygpIGFuZCBub3Qgc2VsZi5za2lwX2J1aWxkOgogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdidWlsZF9jbGliJykKICAgICAgICBjbWQgPSBzZWxmLmNhbGxfY29tbWFuZCgnaW5zdGFsbF9saWInLCB3YXJuX2Rpcj0wKQogICAgICAgIGluc3RjbWQucm9vdCA9IG9sZF9yb290CgogICAgICAgIGFsbF9vdXRwdXRzLCBleHRfb3V0cHV0cyA9IHNlbGYuZ2V0X2V4dF9vdXRwdXRzKCkKICAgICAgICBzZWxmLnN0dWJzID0gW10KICAgICAgICB0b19jb21waWxlID0gW10KICAgICAgICBmb3IgKHAsIGV4dF9uYW1lKSBpbiBlbnVtZXJhdGUoZXh0X291dHB1dHMpOgogICAgICAgICAgICBmaWxlbmFtZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChleHRfbmFtZSkKICAgICAgICAgICAgcHlmaWxlID0gb3MucGF0aC5qb2luKHNlbGYuYmRpc3RfZGlyLCBzdHJpcF9tb2R1bGUoZmlsZW5hbWUpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcucHknKQogICAgICAgICAgICBzZWxmLnN0dWJzLmFwcGVuZChweWZpbGUpCiAgICAgICAgICAgIGxvZy5pbmZvKCJjcmVhdGluZyBzdHViIGxvYWRlciBmb3IgJXMiLCBleHRfbmFtZSkKICAgICAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgICAgIHdyaXRlX3N0dWIob3MucGF0aC5iYXNlbmFtZShleHRfbmFtZSksIHB5ZmlsZSkKICAgICAgICAgICAgdG9fY29tcGlsZS5hcHBlbmQocHlmaWxlKQogICAgICAgICAgICBleHRfb3V0cHV0c1twXSA9IGV4dF9uYW1lLnJlcGxhY2Uob3Muc2VwLCAnLycpCgogICAgICAgIGlmIHRvX2NvbXBpbGU6CiAgICAgICAgICAgIGNtZC5ieXRlX2NvbXBpbGUodG9fY29tcGlsZSkKICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5kYXRhX2ZpbGVzOgogICAgICAgICAgICBzZWxmLmRvX2luc3RhbGxfZGF0YSgpCgogICAgICAgICMgTWFrZSB0aGUgRUdHLUlORk8gZGlyZWN0b3J5CiAgICAgICAgYXJjaGl2ZV9yb290ID0gc2VsZi5iZGlzdF9kaXIKICAgICAgICBlZ2dfaW5mbyA9IG9zLnBhdGguam9pbihhcmNoaXZlX3Jvb3QsICdFR0ctSU5GTycpCiAgICAgICAgc2VsZi5ta3BhdGgoZWdnX2luZm8pCiAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24uc2NyaXB0czoKICAgICAgICAgICAgc2NyaXB0X2RpciA9IG9zLnBhdGguam9pbihlZ2dfaW5mbywgJ3NjcmlwdHMnKQogICAgICAgICAgICBsb2cuaW5mbygiaW5zdGFsbGluZyBzY3JpcHRzIHRvICVzIiwgc2NyaXB0X2RpcikKICAgICAgICAgICAgc2VsZi5jYWxsX2NvbW1hbmQoJ2luc3RhbGxfc2NyaXB0cycsIGluc3RhbGxfZGlyPXNjcmlwdF9kaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vX2VwPTEpCgogICAgICAgIHNlbGYuY29weV9tZXRhZGF0YV90byhlZ2dfaW5mbykKICAgICAgICBuYXRpdmVfbGlicyA9IG9zLnBhdGguam9pbihlZ2dfaW5mbywgIm5hdGl2ZV9saWJzLnR4dCIpCiAgICAgICAgaWYgYWxsX291dHB1dHM6CiAgICAgICAgICAgIGxvZy5pbmZvKCJ3cml0aW5nICVzIiwgbmF0aXZlX2xpYnMpCiAgICAgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgICAgICBlbnN1cmVfZGlyZWN0b3J5KG5hdGl2ZV9saWJzKQogICAgICAgICAgICAgICAgbGlic19maWxlID0gb3BlbihuYXRpdmVfbGlicywgJ3d0JykKICAgICAgICAgICAgICAgIGxpYnNfZmlsZS53cml0ZSgnXG4nLmpvaW4oYWxsX291dHB1dHMpKQogICAgICAgICAgICAgICAgbGlic19maWxlLndyaXRlKCdcbicpCiAgICAgICAgICAgICAgICBsaWJzX2ZpbGUuY2xvc2UoKQogICAgICAgIGVsaWYgb3MucGF0aC5pc2ZpbGUobmF0aXZlX2xpYnMpOgogICAgICAgICAgICBsb2cuaW5mbygicmVtb3ZpbmcgJXMiLCBuYXRpdmVfbGlicykKICAgICAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgICAgIG9zLnVubGluayhuYXRpdmVfbGlicykKCiAgICAgICAgd3JpdGVfc2FmZXR5X2ZsYWcoCiAgICAgICAgICAgIG9zLnBhdGguam9pbihhcmNoaXZlX3Jvb3QsICdFR0ctSU5GTycpLCBzZWxmLnppcF9zYWZlKCkKICAgICAgICApCgogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihzZWxmLmVnZ19pbmZvLCAnZGVwZW5kcy50eHQnKSk6CiAgICAgICAgICAgIGxvZy53YXJuKAogICAgICAgICAgICAgICAgIldBUk5JTkc6ICdkZXBlbmRzLnR4dCcgd2lsbCBub3QgYmUgdXNlZCBieSBzZXR1cHRvb2xzIDAuNiFcbiIKICAgICAgICAgICAgICAgICJVc2UgdGhlIGluc3RhbGxfcmVxdWlyZXMvZXh0cmFzX3JlcXVpcmUgc2V0dXAoKSBhcmdzIGluc3RlYWQuIgogICAgICAgICAgICApCgogICAgICAgIGlmIHNlbGYuZXhjbHVkZV9zb3VyY2VfZmlsZXM6CiAgICAgICAgICAgIHNlbGYuemFwX3B5ZmlsZXMoKQoKICAgICAgICAjIE1ha2UgdGhlIGFyY2hpdmUKICAgICAgICBtYWtlX3ppcGZpbGUoc2VsZi5lZ2dfb3V0cHV0LCBhcmNoaXZlX3Jvb3QsIHZlcmJvc2U9c2VsZi52ZXJib3NlLAogICAgICAgICAgICAgICAgICAgICBkcnlfcnVuPXNlbGYuZHJ5X3J1biwgbW9kZT1zZWxmLmdlbl9oZWFkZXIoKSkKICAgICAgICBpZiBub3Qgc2VsZi5rZWVwX3RlbXA6CiAgICAgICAgICAgIHJlbW92ZV90cmVlKHNlbGYuYmRpc3RfZGlyLCBkcnlfcnVuPXNlbGYuZHJ5X3J1bikKCiAgICAgICAgIyBBZGQgdG8gJ0Rpc3RyaWJ1dGlvbi5kaXN0X2ZpbGVzJyBzbyB0aGF0IHRoZSAidXBsb2FkIiBjb21tYW5kIHdvcmtzCiAgICAgICAgZ2V0YXR0cihzZWxmLmRpc3RyaWJ1dGlvbiwgJ2Rpc3RfZmlsZXMnLCBbXSkuYXBwZW5kKAogICAgICAgICAgICAoJ2JkaXN0X2VnZycsIGdldF9weXRob25fdmVyc2lvbigpLCBzZWxmLmVnZ19vdXRwdXQpKQoKICAgIGRlZiB6YXBfcHlmaWxlcyhzZWxmKToKICAgICAgICBsb2cuaW5mbygiUmVtb3ZpbmcgLnB5IGZpbGVzIGZyb20gdGVtcG9yYXJ5IGRpcmVjdG9yeSIpCiAgICAgICAgZm9yIGJhc2UsIGRpcnMsIGZpbGVzIGluIHdhbGtfZWdnKHNlbGYuYmRpc3RfZGlyKToKICAgICAgICAgICAgZm9yIG5hbWUgaW4gZmlsZXM6CiAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKGJhc2UsIG5hbWUpCgogICAgICAgICAgICAgICAgaWYgbmFtZS5lbmRzd2l0aCgnLnB5Jyk6CiAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJEZWxldGluZyAlcyIsIHBhdGgpCiAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKHBhdGgpCgogICAgICAgICAgICAgICAgaWYgYmFzZS5lbmRzd2l0aCgnX19weWNhY2hlX18nKToKICAgICAgICAgICAgICAgICAgICBwYXRoX29sZCA9IHBhdGgKCiAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9IHInKD9QPG5hbWU+LispXC4oP1A8bWFnaWM+W14uXSspXC5weWMnCiAgICAgICAgICAgICAgICAgICAgbSA9IHJlLm1hdGNoKHBhdHRlcm4sIG5hbWUpCiAgICAgICAgICAgICAgICAgICAgcGF0aF9uZXcgPSBvcy5wYXRoLmpvaW4oYmFzZSwgb3MucGFyZGlyLCBtLmdyb3VwKCduYW1lJykgKyAnLnB5YycpCiAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oIlJlbmFtaW5nIGZpbGUgZnJvbSBbJXNdIHRvIFslc10iICUgKHBhdGhfb2xkLCBwYXRoX25ldykpCiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICBvcy5yZW1vdmUocGF0aF9uZXcpCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgICAgICAgICBvcy5yZW5hbWUocGF0aF9vbGQsIHBhdGhfbmV3KQoKCiAgICBkZWYgemlwX3NhZmUoc2VsZik6CiAgICAgICAgc2FmZSA9IGdldGF0dHIoc2VsZi5kaXN0cmlidXRpb24sICd6aXBfc2FmZScsIE5vbmUpCiAgICAgICAgaWYgc2FmZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIHNhZmUKICAgICAgICBsb2cud2FybigiemlwX3NhZmUgZmxhZyBub3Qgc2V0OyBhbmFseXppbmcgYXJjaGl2ZSBjb250ZW50cy4uLiIpCiAgICAgICAgcmV0dXJuIGFuYWx5emVfZWdnKHNlbGYuYmRpc3RfZGlyLCBzZWxmLnN0dWJzKQoKICAgIGRlZiBnZW5faGVhZGVyKHNlbGYpOgogICAgICAgIGVwbSA9IEVudHJ5UG9pbnQucGFyc2VfbWFwKHNlbGYuZGlzdHJpYnV0aW9uLmVudHJ5X3BvaW50cyBvciAnJykKICAgICAgICBlcCA9IGVwbS5nZXQoJ3NldHVwdG9vbHMuaW5zdGFsbGF0aW9uJywge30pLmdldCgnZWdnc2VjdXRhYmxlJykKICAgICAgICBpZiBlcCBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4gJ3cnICAjIG5vdCBhbiBlZ2dzZWN1dGFibGUsIGRvIGl0IHRoZSB1c3VhbCB3YXkuCgogICAgICAgIGlmIG5vdCBlcC5hdHRycyBvciBlcC5leHRyYXM6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgICAgICAgICAiZWdnc2VjdXRhYmxlIGVudHJ5IHBvaW50ICglcikgY2Fubm90IGhhdmUgJ2V4dHJhcycgIgogICAgICAgICAgICAgICAgIm9yIHJlZmVyIHRvIGEgbW9kdWxlIiAlIChlcCwpCiAgICAgICAgICAgICkKCiAgICAgICAgcHl2ZXIgPSBzeXMudmVyc2lvbls6M10KICAgICAgICBwa2cgPSBlcC5tb2R1bGVfbmFtZQogICAgICAgIGZ1bGwgPSAnLicuam9pbihlcC5hdHRycykKICAgICAgICBiYXNlID0gZXAuYXR0cnNbMF0KICAgICAgICBiYXNlbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoc2VsZi5lZ2dfb3V0cHV0KQoKICAgICAgICBoZWFkZXIgPSAoCiAgICAgICAgICAgICIjIS9iaW4vc2hcbiIKICAgICAgICAgICAgJ2lmIFsgYGJhc2VuYW1lICQwYCA9ICIlKGJhc2VuYW1lKXMiIF1cbicKICAgICAgICAgICAgJ3RoZW4gZXhlYyBweXRob24lKHB5dmVyKXMgLWMgIicKICAgICAgICAgICAgImltcG9ydCBzeXMsIG9zOyBzeXMucGF0aC5pbnNlcnQoMCwgb3MucGF0aC5hYnNwYXRoKCckMCcpKTsgIgogICAgICAgICAgICAiZnJvbSAlKHBrZylzIGltcG9ydCAlKGJhc2Upczsgc3lzLmV4aXQoJShmdWxsKXMoKSkiCiAgICAgICAgICAgICciICIkQCJcbicKICAgICAgICAgICAgJ2Vsc2VcbicKICAgICAgICAgICAgJyAgZWNobyAkMCBpcyBub3QgdGhlIGNvcnJlY3QgbmFtZSBmb3IgdGhpcyBlZ2cgZmlsZS5cbicKICAgICAgICAgICAgJyAgZWNobyBQbGVhc2UgcmVuYW1lIGl0IGJhY2sgdG8gJShiYXNlbmFtZSlzIGFuZCB0cnkgYWdhaW4uXG4nCiAgICAgICAgICAgICcgIGV4ZWMgZmFsc2VcbicKICAgICAgICAgICAgJ2ZpXG4nCiAgICAgICAgKSAlIGxvY2FscygpCgogICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgIG1rcGF0aChvcy5wYXRoLmRpcm5hbWUoc2VsZi5lZ2dfb3V0cHV0KSwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCiAgICAgICAgICAgIGYgPSBvcGVuKHNlbGYuZWdnX291dHB1dCwgJ3cnKQogICAgICAgICAgICBmLndyaXRlKGhlYWRlcikKICAgICAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgcmV0dXJuICdhJwoKICAgIGRlZiBjb3B5X21ldGFkYXRhX3RvKHNlbGYsIHRhcmdldF9kaXIpOgogICAgICAgICJDb3B5IG1ldGFkYXRhIChlZ2cgaW5mbykgdG8gdGhlIHRhcmdldF9kaXIiCiAgICAgICAgIyBub3JtYWxpemUgdGhlIHBhdGggKHNvIHRoYXQgYSBmb3J3YXJkLXNsYXNoIGluIGVnZ19pbmZvIHdpbGwKICAgICAgICAjIG1hdGNoIHVzaW5nIHN0YXJ0c3dpdGggYmVsb3cpCiAgICAgICAgbm9ybV9lZ2dfaW5mbyA9IG9zLnBhdGgubm9ybXBhdGgoc2VsZi5lZ2dfaW5mbykKICAgICAgICBwcmVmaXggPSBvcy5wYXRoLmpvaW4obm9ybV9lZ2dfaW5mbywgJycpCiAgICAgICAgZm9yIHBhdGggaW4gc2VsZi5laV9jbWQuZmlsZWxpc3QuZmlsZXM6CiAgICAgICAgICAgIGlmIHBhdGguc3RhcnRzd2l0aChwcmVmaXgpOgogICAgICAgICAgICAgICAgdGFyZ2V0ID0gb3MucGF0aC5qb2luKHRhcmdldF9kaXIsIHBhdGhbbGVuKHByZWZpeCk6XSkKICAgICAgICAgICAgICAgIGVuc3VyZV9kaXJlY3RvcnkodGFyZ2V0KQogICAgICAgICAgICAgICAgc2VsZi5jb3B5X2ZpbGUocGF0aCwgdGFyZ2V0KQoKICAgIGRlZiBnZXRfZXh0X291dHB1dHMoc2VsZik6CiAgICAgICAgIiIiR2V0IGEgbGlzdCBvZiByZWxhdGl2ZSBwYXRocyB0byBDIGV4dGVuc2lvbnMgaW4gdGhlIG91dHB1dCBkaXN0cm8iIiIKCiAgICAgICAgYWxsX291dHB1dHMgPSBbXQogICAgICAgIGV4dF9vdXRwdXRzID0gW10KCiAgICAgICAgcGF0aHMgPSB7c2VsZi5iZGlzdF9kaXI6ICcnfQogICAgICAgIGZvciBiYXNlLCBkaXJzLCBmaWxlcyBpbiBzb3J0ZWRfd2FsayhzZWxmLmJkaXN0X2Rpcik6CiAgICAgICAgICAgIGZvciBmaWxlbmFtZSBpbiBmaWxlczoKICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguc3BsaXRleHQoZmlsZW5hbWUpWzFdLmxvd2VyKCkgaW4gTkFUSVZFX0VYVEVOU0lPTlM6CiAgICAgICAgICAgICAgICAgICAgYWxsX291dHB1dHMuYXBwZW5kKHBhdGhzW2Jhc2VdICsgZmlsZW5hbWUpCiAgICAgICAgICAgIGZvciBmaWxlbmFtZSBpbiBkaXJzOgogICAgICAgICAgICAgICAgcGF0aHNbb3MucGF0aC5qb2luKGJhc2UsIGZpbGVuYW1lKV0gPSAocGF0aHNbYmFzZV0gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgKyAnLycpCgogICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLmhhc19leHRfbW9kdWxlcygpOgogICAgICAgICAgICBidWlsZF9jbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGRfZXh0JykKICAgICAgICAgICAgZm9yIGV4dCBpbiBidWlsZF9jbWQuZXh0ZW5zaW9uczoKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXh0LCBMaWJyYXJ5KToKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgZnVsbG5hbWUgPSBidWlsZF9jbWQuZ2V0X2V4dF9mdWxsbmFtZShleHQubmFtZSkKICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gYnVpbGRfY21kLmdldF9leHRfZmlsZW5hbWUoZnVsbG5hbWUpCiAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSkuc3RhcnRzd2l0aCgnZGwtJyk6CiAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKHNlbGYuYmRpc3RfZGlyLCBmaWxlbmFtZSkpOgogICAgICAgICAgICAgICAgICAgICAgICBleHRfb3V0cHV0cy5hcHBlbmQoZmlsZW5hbWUpCgogICAgICAgIHJldHVybiBhbGxfb3V0cHV0cywgZXh0X291dHB1dHMKCgpOQVRJVkVfRVhURU5TSU9OUyA9IGRpY3QuZnJvbWtleXMoJy5kbGwgLnNvIC5keWxpYiAucHlkJy5zcGxpdCgpKQoKCmRlZiB3YWxrX2VnZyhlZ2dfZGlyKToKICAgICIiIldhbGsgYW4gdW5wYWNrZWQgZWdnJ3MgY29udGVudHMsIHNraXBwaW5nIHRoZSBtZXRhZGF0YSBkaXJlY3RvcnkiIiIKICAgIHdhbGtlciA9IHNvcnRlZF93YWxrKGVnZ19kaXIpCiAgICBiYXNlLCBkaXJzLCBmaWxlcyA9IG5leHQod2Fsa2VyKQogICAgaWYgJ0VHRy1JTkZPJyBpbiBkaXJzOgogICAgICAgIGRpcnMucmVtb3ZlKCdFR0ctSU5GTycpCiAgICB5aWVsZCBiYXNlLCBkaXJzLCBmaWxlcwogICAgZm9yIGJkZiBpbiB3YWxrZXI6CiAgICAgICAgeWllbGQgYmRmCgoKZGVmIGFuYWx5emVfZWdnKGVnZ19kaXIsIHN0dWJzKToKICAgICMgY2hlY2sgZm9yIGV4aXN0aW5nIGZsYWcgaW4gRUdHLUlORk8KICAgIGZvciBmbGFnLCBmbiBpbiBzYWZldHlfZmxhZ3MuaXRlbXMoKToKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4oZWdnX2RpciwgJ0VHRy1JTkZPJywgZm4pKToKICAgICAgICAgICAgcmV0dXJuIGZsYWcKICAgIGlmIG5vdCBjYW5fc2NhbigpOgogICAgICAgIHJldHVybiBGYWxzZQogICAgc2FmZSA9IFRydWUKICAgIGZvciBiYXNlLCBkaXJzLCBmaWxlcyBpbiB3YWxrX2VnZyhlZ2dfZGlyKToKICAgICAgICBmb3IgbmFtZSBpbiBmaWxlczoKICAgICAgICAgICAgaWYgbmFtZS5lbmRzd2l0aCgnLnB5Jykgb3IgbmFtZS5lbmRzd2l0aCgnLnB5dycpOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgZWxpZiBuYW1lLmVuZHN3aXRoKCcucHljJykgb3IgbmFtZS5lbmRzd2l0aCgnLnB5bycpOgogICAgICAgICAgICAgICAgIyBhbHdheXMgc2NhbiwgZXZlbiBpZiB3ZSBhbHJlYWR5IGtub3cgd2UncmUgbm90IHNhZmUKICAgICAgICAgICAgICAgIHNhZmUgPSBzY2FuX21vZHVsZShlZ2dfZGlyLCBiYXNlLCBuYW1lLCBzdHVicykgYW5kIHNhZmUKICAgIHJldHVybiBzYWZlCgoKZGVmIHdyaXRlX3NhZmV0eV9mbGFnKGVnZ19kaXIsIHNhZmUpOgogICAgIyBXcml0ZSBvciByZW1vdmUgemlwIHNhZmV0eSBmbGFnIGZpbGUocykKICAgIGZvciBmbGFnLCBmbiBpbiBzYWZldHlfZmxhZ3MuaXRlbXMoKToKICAgICAgICBmbiA9IG9zLnBhdGguam9pbihlZ2dfZGlyLCBmbikKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhmbik6CiAgICAgICAgICAgIGlmIHNhZmUgaXMgTm9uZSBvciBib29sKHNhZmUpICE9IGZsYWc6CiAgICAgICAgICAgICAgICBvcy51bmxpbmsoZm4pCiAgICAgICAgZWxpZiBzYWZlIGlzIG5vdCBOb25lIGFuZCBib29sKHNhZmUpID09IGZsYWc6CiAgICAgICAgICAgIGYgPSBvcGVuKGZuLCAnd3QnKQogICAgICAgICAgICBmLndyaXRlKCdcbicpCiAgICAgICAgICAgIGYuY2xvc2UoKQoKCnNhZmV0eV9mbGFncyA9IHsKICAgIFRydWU6ICd6aXAtc2FmZScsCiAgICBGYWxzZTogJ25vdC16aXAtc2FmZScsCn0KCgpkZWYgc2Nhbl9tb2R1bGUoZWdnX2RpciwgYmFzZSwgbmFtZSwgc3R1YnMpOgogICAgIiIiQ2hlY2sgd2hldGhlciBtb2R1bGUgcG9zc2libHkgdXNlcyB1bnNhZmUtZm9yLXppcGZpbGUgc3R1ZmYiIiIKCiAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbihiYXNlLCBuYW1lKQogICAgaWYgZmlsZW5hbWVbOi0xXSBpbiBzdHViczoKICAgICAgICByZXR1cm4gVHJ1ZSAgIyBFeHRlbnNpb24gbW9kdWxlCiAgICBwa2cgPSBiYXNlW2xlbihlZ2dfZGlyKSArIDE6XS5yZXBsYWNlKG9zLnNlcCwgJy4nKQogICAgbW9kdWxlID0gcGtnICsgKHBrZyBhbmQgJy4nIG9yICcnKSArIG9zLnBhdGguc3BsaXRleHQobmFtZSlbMF0KICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMywgMyk6CiAgICAgICAgc2tpcCA9IDggICMgc2tpcCBtYWdpYyAmIGRhdGUKICAgIGVsc2U6CiAgICAgICAgc2tpcCA9IDEyICAjIHNraXAgbWFnaWMgJiBkYXRlICYgZmlsZSBzaXplCiAgICBmID0gb3BlbihmaWxlbmFtZSwgJ3JiJykKICAgIGYucmVhZChza2lwKQogICAgY29kZSA9IG1hcnNoYWwubG9hZChmKQogICAgZi5jbG9zZSgpCiAgICBzYWZlID0gVHJ1ZQogICAgc3ltYm9scyA9IGRpY3QuZnJvbWtleXMoaXRlcl9zeW1ib2xzKGNvZGUpKQogICAgZm9yIGJhZCBpbiBbJ19fZmlsZV9fJywgJ19fcGF0aF9fJ106CiAgICAgICAgaWYgYmFkIGluIHN5bWJvbHM6CiAgICAgICAgICAgIGxvZy53YXJuKCIlczogbW9kdWxlIHJlZmVyZW5jZXMgJXMiLCBtb2R1bGUsIGJhZCkKICAgICAgICAgICAgc2FmZSA9IEZhbHNlCiAgICBpZiAnaW5zcGVjdCcgaW4gc3ltYm9sczoKICAgICAgICBmb3IgYmFkIGluIFsKICAgICAgICAgICAgJ2dldHNvdXJjZScsICdnZXRhYnNmaWxlJywgJ2dldHNvdXJjZWZpbGUnLCAnZ2V0ZmlsZScKICAgICAgICAgICAgJ2dldHNvdXJjZWxpbmVzJywgJ2ZpbmRzb3VyY2UnLCAnZ2V0Y29tbWVudHMnLCAnZ2V0ZnJhbWVpbmZvJywKICAgICAgICAgICAgJ2dldGlubmVyZnJhbWVzJywgJ2dldG91dGVyZnJhbWVzJywgJ3N0YWNrJywgJ3RyYWNlJwogICAgICAgIF06CiAgICAgICAgICAgIGlmIGJhZCBpbiBzeW1ib2xzOgogICAgICAgICAgICAgICAgbG9nLndhcm4oIiVzOiBtb2R1bGUgTUFZIGJlIHVzaW5nIGluc3BlY3QuJXMiLCBtb2R1bGUsIGJhZCkKICAgICAgICAgICAgICAgIHNhZmUgPSBGYWxzZQogICAgcmV0dXJuIHNhZmUKCgpkZWYgaXRlcl9zeW1ib2xzKGNvZGUpOgogICAgIiIiWWllbGQgbmFtZXMgYW5kIHN0cmluZ3MgdXNlZCBieSBgY29kZWAgYW5kIGl0cyBuZXN0ZWQgY29kZSBvYmplY3RzIiIiCiAgICBmb3IgbmFtZSBpbiBjb2RlLmNvX25hbWVzOgogICAgICAgIHlpZWxkIG5hbWUKICAgIGZvciBjb25zdCBpbiBjb2RlLmNvX2NvbnN0czoKICAgICAgICBpZiBpc2luc3RhbmNlKGNvbnN0LCBzaXguc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgeWllbGQgY29uc3QKICAgICAgICBlbGlmIGlzaW5zdGFuY2UoY29uc3QsIENvZGVUeXBlKToKICAgICAgICAgICAgZm9yIG5hbWUgaW4gaXRlcl9zeW1ib2xzKGNvbnN0KToKICAgICAgICAgICAgICAgIHlpZWxkIG5hbWUKCgpkZWYgY2FuX3NjYW4oKToKICAgIGlmIG5vdCBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnamF2YScpIGFuZCBzeXMucGxhdGZvcm0gIT0gJ2NsaSc6CiAgICAgICAgIyBDUHl0aG9uLCBQeVB5LCBldGMuCiAgICAgICAgcmV0dXJuIFRydWUKICAgIGxvZy53YXJuKCJVbmFibGUgdG8gYW5hbHl6ZSBjb21waWxlZCBjb2RlIG9uIHRoaXMgcGxhdGZvcm0uIikKICAgIGxvZy53YXJuKCJQbGVhc2UgYXNrIHRoZSBhdXRob3IgdG8gaW5jbHVkZSBhICd6aXBfc2FmZSciCiAgICAgICAgICAgICAiIHNldHRpbmcgKGVpdGhlciBUcnVlIG9yIEZhbHNlKSBpbiB0aGUgcGFja2FnZSdzIHNldHVwLnB5IikKCgojIEF0dHJpYnV0ZSBuYW1lcyBvZiBvcHRpb25zIGZvciBjb21tYW5kcyB0aGF0IG1pZ2h0IG5lZWQgdG8gYmUgY29udmluY2VkIHRvCiMgaW5zdGFsbCB0byB0aGUgZWdnIGJ1aWxkIGRpcmVjdG9yeQoKSU5TVEFMTF9ESVJFQ1RPUllfQVRUUlMgPSBbCiAgICAnaW5zdGFsbF9saWInLCAnaW5zdGFsbF9kaXInLCAnaW5zdGFsbF9kYXRhJywgJ2luc3RhbGxfYmFzZScKXQoKCmRlZiBtYWtlX3ppcGZpbGUoemlwX2ZpbGVuYW1lLCBiYXNlX2RpciwgdmVyYm9zZT0wLCBkcnlfcnVuPTAsIGNvbXByZXNzPVRydWUsCiAgICAgICAgICAgICAgICAgbW9kZT0ndycpOgogICAgIiIiQ3JlYXRlIGEgemlwIGZpbGUgZnJvbSBhbGwgdGhlIGZpbGVzIHVuZGVyICdiYXNlX2RpcicuICBUaGUgb3V0cHV0CiAgICB6aXAgZmlsZSB3aWxsIGJlIG5hbWVkICdiYXNlX2RpcicgKyAiLnppcCIuICBVc2VzIGVpdGhlciB0aGUgInppcGZpbGUiCiAgICBQeXRob24gbW9kdWxlIChpZiBhdmFpbGFibGUpIG9yIHRoZSBJbmZvWklQICJ6aXAiIHV0aWxpdHkgKGlmIGluc3RhbGxlZAogICAgYW5kIGZvdW5kIG9uIHRoZSBkZWZhdWx0IHNlYXJjaCBwYXRoKS4gIElmIG5laXRoZXIgdG9vbCBpcyBhdmFpbGFibGUsCiAgICByYWlzZXMgRGlzdHV0aWxzRXhlY0Vycm9yLiAgUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgb3V0cHV0IHppcCBmaWxlLgogICAgIiIiCiAgICBpbXBvcnQgemlwZmlsZQoKICAgIG1rcGF0aChvcy5wYXRoLmRpcm5hbWUoemlwX2ZpbGVuYW1lKSwgZHJ5X3J1bj1kcnlfcnVuKQogICAgbG9nLmluZm8oImNyZWF0aW5nICclcycgYW5kIGFkZGluZyAnJXMnIHRvIGl0IiwgemlwX2ZpbGVuYW1lLCBiYXNlX2RpcikKCiAgICBkZWYgdmlzaXQoeiwgZGlybmFtZSwgbmFtZXMpOgogICAgICAgIGZvciBuYW1lIGluIG5hbWVzOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLmpvaW4oZGlybmFtZSwgbmFtZSkpCiAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKHBhdGgpOgogICAgICAgICAgICAgICAgcCA9IHBhdGhbbGVuKGJhc2VfZGlyKSArIDE6XQogICAgICAgICAgICAgICAgaWYgbm90IGRyeV9ydW46CiAgICAgICAgICAgICAgICAgICAgei53cml0ZShwYXRoLCBwKQogICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJhZGRpbmcgJyVzJyIsIHApCgogICAgY29tcHJlc3Npb24gPSB6aXBmaWxlLlpJUF9ERUZMQVRFRCBpZiBjb21wcmVzcyBlbHNlIHppcGZpbGUuWklQX1NUT1JFRAogICAgaWYgbm90IGRyeV9ydW46CiAgICAgICAgeiA9IHppcGZpbGUuWmlwRmlsZSh6aXBfZmlsZW5hbWUsIG1vZGUsIGNvbXByZXNzaW9uPWNvbXByZXNzaW9uKQogICAgICAgIGZvciBkaXJuYW1lLCBkaXJzLCBmaWxlcyBpbiBzb3J0ZWRfd2FsayhiYXNlX2Rpcik6CiAgICAgICAgICAgIHZpc2l0KHosIGRpcm5hbWUsIGZpbGVzKQogICAgICAgIHouY2xvc2UoKQogICAgZWxzZToKICAgICAgICBmb3IgZGlybmFtZSwgZGlycywgZmlsZXMgaW4gc29ydGVkX3dhbGsoYmFzZV9kaXIpOgogICAgICAgICAgICB2aXNpdChOb25lLCBkaXJuYW1lLCBmaWxlcykKICAgIHJldHVybiB6aXBfZmlsZW5hbWUKUEsDBBQAAAAAAAAAIQDr0nQW5AUAAOQFAAA3AAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL2JkaXN0X3JwbS5weWltcG9ydCBkaXN0dXRpbHMuY29tbWFuZC5iZGlzdF9ycG0gYXMgb3JpZwoKCmNsYXNzIGJkaXN0X3JwbShvcmlnLmJkaXN0X3JwbSk6CiAgICAiIiIKICAgIE92ZXJyaWRlIHRoZSBkZWZhdWx0IGJkaXN0X3JwbSBiZWhhdmlvciB0byBkbyB0aGUgZm9sbG93aW5nOgoKICAgIDEuIFJ1biBlZ2dfaW5mbyB0byBlbnN1cmUgdGhlIG5hbWUgYW5kIHZlcnNpb24gYXJlIHByb3Blcmx5IGNhbGN1bGF0ZWQuCiAgICAyLiBBbHdheXMgcnVuICdpbnN0YWxsJyB1c2luZyAtLXNpbmdsZS12ZXJzaW9uLWV4dGVybmFsbHktbWFuYWdlZCB0bwogICAgICAgZGlzYWJsZSBlZ2dzIGluIFJQTSBkaXN0cmlidXRpb25zLgogICAgMy4gUmVwbGFjZSBkYXNoIHdpdGggdW5kZXJzY29yZSBpbiB0aGUgdmVyc2lvbiBudW1iZXJzIGZvciBiZXR0ZXIgUlBNCiAgICAgICBjb21wYXRpYmlsaXR5LgogICAgIiIiCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICAjIGVuc3VyZSBkaXN0cm8gbmFtZSBpcyB1cC10by1kYXRlCiAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnZWdnX2luZm8nKQoKICAgICAgICBvcmlnLmJkaXN0X3JwbS5ydW4oc2VsZikKCiAgICBkZWYgX21ha2Vfc3BlY19maWxlKHNlbGYpOgogICAgICAgIHZlcnNpb24gPSBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfdmVyc2lvbigpCiAgICAgICAgcnBtdmVyc2lvbiA9IHZlcnNpb24ucmVwbGFjZSgnLScsICdfJykKICAgICAgICBzcGVjID0gb3JpZy5iZGlzdF9ycG0uX21ha2Vfc3BlY19maWxlKHNlbGYpCiAgICAgICAgbGluZTIzID0gJyVkZWZpbmUgdmVyc2lvbiAnICsgdmVyc2lvbgogICAgICAgIGxpbmUyNCA9ICclZGVmaW5lIHZlcnNpb24gJyArIHJwbXZlcnNpb24KICAgICAgICBzcGVjID0gWwogICAgICAgICAgICBsaW5lLnJlcGxhY2UoCiAgICAgICAgICAgICAgICAiU291cmNlMDogJXtuYW1lfS0le3ZlcnNpb259LnRhciIsCiAgICAgICAgICAgICAgICAiU291cmNlMDogJXtuYW1lfS0le3VubWFuZ2xlZF92ZXJzaW9ufS50YXIiCiAgICAgICAgICAgICkucmVwbGFjZSgKICAgICAgICAgICAgICAgICJzZXR1cC5weSBpbnN0YWxsICIsCiAgICAgICAgICAgICAgICAic2V0dXAucHkgaW5zdGFsbCAtLXNpbmdsZS12ZXJzaW9uLWV4dGVybmFsbHktbWFuYWdlZCAiCiAgICAgICAgICAgICkucmVwbGFjZSgKICAgICAgICAgICAgICAgICIlc2V0dXAiLAogICAgICAgICAgICAgICAgIiVzZXR1cCAtbiAle25hbWV9LSV7dW5tYW5nbGVkX3ZlcnNpb259IgogICAgICAgICAgICApLnJlcGxhY2UobGluZTIzLCBsaW5lMjQpCiAgICAgICAgICAgIGZvciBsaW5lIGluIHNwZWMKICAgICAgICBdCiAgICAgICAgaW5zZXJ0X2xvYyA9IHNwZWMuaW5kZXgobGluZTI0KSArIDEKICAgICAgICB1bm1hbmdsZWRfdmVyc2lvbiA9ICIlZGVmaW5lIHVubWFuZ2xlZF92ZXJzaW9uICIgKyB2ZXJzaW9uCiAgICAgICAgc3BlYy5pbnNlcnQoaW5zZXJ0X2xvYywgdW5tYW5nbGVkX3ZlcnNpb24pCiAgICAgICAgcmV0dXJuIHNwZWMKUEsDBBQAAAAAAAAAIQAgjHUUfQIAAH0CAAA7AAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL2JkaXN0X3dpbmluc3QucHlpbXBvcnQgZGlzdHV0aWxzLmNvbW1hbmQuYmRpc3Rfd2luaW5zdCBhcyBvcmlnCgoKY2xhc3MgYmRpc3Rfd2luaW5zdChvcmlnLmJkaXN0X3dpbmluc3QpOgogICAgZGVmIHJlaW5pdGlhbGl6ZV9jb21tYW5kKHNlbGYsIGNvbW1hbmQsIHJlaW5pdF9zdWJjb21tYW5kcz0wKToKICAgICAgICAiIiIKICAgICAgICBTdXBwbGVtZW50IHJlaW5pdGlhbGl6ZV9jb21tYW5kIHRvIHdvcmsgYXJvdW5kCiAgICAgICAgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTIwODE5CiAgICAgICAgIiIiCiAgICAgICAgY21kID0gc2VsZi5kaXN0cmlidXRpb24ucmVpbml0aWFsaXplX2NvbW1hbmQoCiAgICAgICAgICAgIGNvbW1hbmQsIHJlaW5pdF9zdWJjb21tYW5kcykKICAgICAgICBpZiBjb21tYW5kIGluICgnaW5zdGFsbCcsICdpbnN0YWxsX2xpYicpOgogICAgICAgICAgICBjbWQuaW5zdGFsbF9saWIgPSBOb25lCiAgICAgICAgcmV0dXJuIGNtZAoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgc2VsZi5faXNfcnVubmluZyA9IFRydWUKICAgICAgICB0cnk6CiAgICAgICAgICAgIG9yaWcuYmRpc3Rfd2luaW5zdC5ydW4oc2VsZikKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBzZWxmLl9pc19ydW5uaW5nID0gRmFsc2UKUEsDBBQAAAAAAAAAIQAnGo0bhBEAAIQRAAA4AAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL2J1aWxkX2NsaWIucHlpbXBvcnQgZGlzdHV0aWxzLmNvbW1hbmQuYnVpbGRfY2xpYiBhcyBvcmlnCmZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzU2V0dXBFcnJvcgpmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCmZyb20gc2V0dXB0b29scy5kZXBfdXRpbCBpbXBvcnQgbmV3ZXJfcGFpcndpc2VfZ3JvdXAKCgpjbGFzcyBidWlsZF9jbGliKG9yaWcuYnVpbGRfY2xpYik6CiAgICAiIiIKICAgIE92ZXJyaWRlIHRoZSBkZWZhdWx0IGJ1aWxkX2NsaWIgYmVoYXZpb3VyIHRvIGRvIHRoZSBmb2xsb3dpbmc6CgogICAgMS4gSW1wbGVtZW50IGEgcnVkaW1lbnRhcnkgdGltZXN0YW1wLWJhc2VkIGRlcGVuZGVuY3kgc3lzdGVtCiAgICAgICBzbyAnY29tcGlsZSgpJyBkb2Vzbid0IHJ1biBldmVyeSB0aW1lLgogICAgMi4gQWRkIG1vcmUga2V5cyB0byB0aGUgJ2J1aWxkX2luZm8nIGRpY3Rpb25hcnk6CiAgICAgICAgKiBvYmpfZGVwcyAtIHNwZWNpZnkgZGVwZW5kZW5jaWVzIGZvciBlYWNoIG9iamVjdCBjb21waWxlZC4KICAgICAgICAgICAgICAgICAgICAgdGhpcyBzaG91bGQgYmUgYSBkaWN0aW9uYXJ5IG1hcHBpbmcgYSBrZXkKICAgICAgICAgICAgICAgICAgICAgd2l0aCB0aGUgc291cmNlIGZpbGVuYW1lIHRvIGEgbGlzdCBvZgogICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXMuIFVzZSBhbiBlbXB0eSBzdHJpbmcgZm9yIGdsb2JhbAogICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXMuCiAgICAgICAgKiBjZmxhZ3MgICAtIHNwZWNpZnkgYSBsaXN0IG9mIGFkZGl0aW9uYWwgZmxhZ3MgdG8gcGFzcyB0bwogICAgICAgICAgICAgICAgICAgICB0aGUgY29tcGlsZXIuCiAgICAiIiIKCiAgICBkZWYgYnVpbGRfbGlicmFyaWVzKHNlbGYsIGxpYnJhcmllcyk6CiAgICAgICAgZm9yIChsaWJfbmFtZSwgYnVpbGRfaW5mbykgaW4gbGlicmFyaWVzOgogICAgICAgICAgICBzb3VyY2VzID0gYnVpbGRfaW5mby5nZXQoJ3NvdXJjZXMnKQogICAgICAgICAgICBpZiBzb3VyY2VzIGlzIE5vbmUgb3Igbm90IGlzaW5zdGFuY2Uoc291cmNlcywgKGxpc3QsIHR1cGxlKSk6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICJpbiAnbGlicmFyaWVzJyBvcHRpb24gKGxpYnJhcnkgJyVzJyksICIKICAgICAgICAgICAgICAgICAgICAgICAiJ3NvdXJjZXMnIG11c3QgYmUgcHJlc2VudCBhbmQgbXVzdCBiZSAiCiAgICAgICAgICAgICAgICAgICAgICAgImEgbGlzdCBvZiBzb3VyY2UgZmlsZW5hbWVzIiAlIGxpYl9uYW1lKQogICAgICAgICAgICBzb3VyY2VzID0gbGlzdChzb3VyY2VzKQoKICAgICAgICAgICAgbG9nLmluZm8oImJ1aWxkaW5nICclcycgbGlicmFyeSIsIGxpYl9uYW1lKQoKICAgICAgICAgICAgIyBNYWtlIHN1cmUgZXZlcnl0aGluZyBpcyB0aGUgY29ycmVjdCB0eXBlLgogICAgICAgICAgICAjIG9ial9kZXBzIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkgb2Yga2V5cyBhcyBzb3VyY2VzCiAgICAgICAgICAgICMgYW5kIGEgbGlzdC90dXBsZSBvZiBmaWxlcyB0aGF0IGFyZSBpdHMgZGVwZW5kZW5jaWVzLgogICAgICAgICAgICBvYmpfZGVwcyA9IGJ1aWxkX2luZm8uZ2V0KCdvYmpfZGVwcycsIGRpY3QoKSkKICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob2JqX2RlcHMsIGRpY3QpOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAiaW4gJ2xpYnJhcmllcycgb3B0aW9uIChsaWJyYXJ5ICclcycpLCAiCiAgICAgICAgICAgICAgICAgICAgICAgIidvYmpfZGVwcycgbXVzdCBiZSBhIGRpY3Rpb25hcnkgb2YgIgogICAgICAgICAgICAgICAgICAgICAgICJ0eXBlICdzb3VyY2U6IGxpc3QnIiAlIGxpYl9uYW1lKQogICAgICAgICAgICBkZXBlbmRlbmNpZXMgPSBbXQoKICAgICAgICAgICAgIyBHZXQgdGhlIGdsb2JhbCBkZXBlbmRlbmNpZXMgdGhhdCBhcmUgc3BlY2lmaWVkIGJ5IHRoZSAnJyBrZXkuCiAgICAgICAgICAgICMgVGhlc2Ugd2lsbCBnbyBpbnRvIGV2ZXJ5IHNvdXJjZSdzIGRlcGVuZGVuY3kgbGlzdC4KICAgICAgICAgICAgZ2xvYmFsX2RlcHMgPSBvYmpfZGVwcy5nZXQoJycsIGxpc3QoKSkKICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZ2xvYmFsX2RlcHMsIChsaXN0LCB0dXBsZSkpOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAiaW4gJ2xpYnJhcmllcycgb3B0aW9uIChsaWJyYXJ5ICclcycpLCAiCiAgICAgICAgICAgICAgICAgICAgICAgIidvYmpfZGVwcycgbXVzdCBiZSBhIGRpY3Rpb25hcnkgb2YgIgogICAgICAgICAgICAgICAgICAgICAgICJ0eXBlICdzb3VyY2U6IGxpc3QnIiAlIGxpYl9uYW1lKQoKICAgICAgICAgICAgIyBCdWlsZCB0aGUgbGlzdCB0byBiZSB1c2VkIGJ5IG5ld2VyX3BhaXJ3aXNlX2dyb3VwCiAgICAgICAgICAgICMgZWFjaCBzb3VyY2Ugd2lsbCBiZSBhdXRvLWFkZGVkIHRvIGl0cyBkZXBlbmRlbmNpZXMuCiAgICAgICAgICAgIGZvciBzb3VyY2UgaW4gc291cmNlczoKICAgICAgICAgICAgICAgIHNyY19kZXBzID0gW3NvdXJjZV0KICAgICAgICAgICAgICAgIHNyY19kZXBzLmV4dGVuZChnbG9iYWxfZGVwcykKICAgICAgICAgICAgICAgIGV4dHJhX2RlcHMgPSBvYmpfZGVwcy5nZXQoc291cmNlLCBsaXN0KCkpCiAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShleHRyYV9kZXBzLCAobGlzdCwgdHVwbGUpKToKICAgICAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gJ2xpYnJhcmllcycgb3B0aW9uIChsaWJyYXJ5ICclcycpLCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICInb2JqX2RlcHMnIG11c3QgYmUgYSBkaWN0aW9uYXJ5IG9mICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUgJ3NvdXJjZTogbGlzdCciICUgbGliX25hbWUpCiAgICAgICAgICAgICAgICBzcmNfZGVwcy5leHRlbmQoZXh0cmFfZGVwcykKICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llcy5hcHBlbmQoc3JjX2RlcHMpCgogICAgICAgICAgICBleHBlY3RlZF9vYmplY3RzID0gc2VsZi5jb21waWxlci5vYmplY3RfZmlsZW5hbWVzKAogICAgICAgICAgICAgICAgICAgIHNvdXJjZXMsCiAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2Rpcj1zZWxmLmJ1aWxkX3RlbXAKICAgICAgICAgICAgICAgICAgICApCgogICAgICAgICAgICBpZiBuZXdlcl9wYWlyd2lzZV9ncm91cChkZXBlbmRlbmNpZXMsIGV4cGVjdGVkX29iamVjdHMpICE9IChbXSwgW10pOgogICAgICAgICAgICAgICAgIyBGaXJzdCwgY29tcGlsZSB0aGUgc291cmNlIGNvZGUgdG8gb2JqZWN0IGZpbGVzIGluIHRoZSBsaWJyYXJ5CiAgICAgICAgICAgICAgICAjIGRpcmVjdG9yeS4gIChUaGlzIHNob3VsZCBwcm9iYWJseSBjaGFuZ2UgdG8gcHV0dGluZyBvYmplY3QKICAgICAgICAgICAgICAgICMgZmlsZXMgaW4gYSB0ZW1wb3JhcnkgYnVpbGQgZGlyZWN0b3J5LikKICAgICAgICAgICAgICAgIG1hY3JvcyA9IGJ1aWxkX2luZm8uZ2V0KCdtYWNyb3MnKQogICAgICAgICAgICAgICAgaW5jbHVkZV9kaXJzID0gYnVpbGRfaW5mby5nZXQoJ2luY2x1ZGVfZGlycycpCiAgICAgICAgICAgICAgICBjZmxhZ3MgPSBidWlsZF9pbmZvLmdldCgnY2ZsYWdzJykKICAgICAgICAgICAgICAgIG9iamVjdHMgPSBzZWxmLmNvbXBpbGVyLmNvbXBpbGUoCiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXMsCiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9kaXI9c2VsZi5idWlsZF90ZW1wLAogICAgICAgICAgICAgICAgICAgICAgICBtYWNyb3M9bWFjcm9zLAogICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlX2RpcnM9aW5jbHVkZV9kaXJzLAogICAgICAgICAgICAgICAgICAgICAgICBleHRyYV9wb3N0YXJncz1jZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnPXNlbGYuZGVidWcKICAgICAgICAgICAgICAgICAgICAgICAgKQoKICAgICAgICAgICAgIyBOb3cgImxpbmsiIHRoZSBvYmplY3QgZmlsZXMgdG9nZXRoZXIgaW50byBhIHN0YXRpYyBsaWJyYXJ5LgogICAgICAgICAgICAjIChPbiBVbml4IGF0IGxlYXN0LCB0aGlzIGlzbid0IHJlYWxseSBsaW5raW5nIC0tIGl0IGp1c3QKICAgICAgICAgICAgIyBidWlsZHMgYW4gYXJjaGl2ZS4gIFdoYXRldmVyLikKICAgICAgICAgICAgc2VsZi5jb21waWxlci5jcmVhdGVfc3RhdGljX2xpYigKICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9vYmplY3RzLAogICAgICAgICAgICAgICAgICAgIGxpYl9uYW1lLAogICAgICAgICAgICAgICAgICAgIG91dHB1dF9kaXI9c2VsZi5idWlsZF9jbGliLAogICAgICAgICAgICAgICAgICAgIGRlYnVnPXNlbGYuZGVidWcKICAgICAgICAgICAgICAgICAgICApClBLAwQUAAAAAAAAACEAkaVp5/kyAAD5MgAANwAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9idWlsZF9leHQucHlpbXBvcnQgb3MKaW1wb3J0IHN5cwppbXBvcnQgaXRlcnRvb2xzCmltcG9ydCBpbXAKZnJvbSBkaXN0dXRpbHMuY29tbWFuZC5idWlsZF9leHQgaW1wb3J0IGJ1aWxkX2V4dCBhcyBfZHVfYnVpbGRfZXh0CmZyb20gZGlzdHV0aWxzLmZpbGVfdXRpbCBpbXBvcnQgY29weV9maWxlCmZyb20gZGlzdHV0aWxzLmNjb21waWxlciBpbXBvcnQgbmV3X2NvbXBpbGVyCmZyb20gZGlzdHV0aWxzLnN5c2NvbmZpZyBpbXBvcnQgY3VzdG9taXplX2NvbXBpbGVyLCBnZXRfY29uZmlnX3Zhcgpmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0Vycm9yCmZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKCmZyb20gc2V0dXB0b29scy5leHRlbnNpb24gaW1wb3J0IExpYnJhcnkKZnJvbSBzZXR1cHRvb2xzLmV4dGVybiBpbXBvcnQgc2l4Cgp0cnk6CiAgICAjIEF0dGVtcHQgdG8gdXNlIEN5dGhvbiBmb3IgYnVpbGRpbmcgZXh0ZW5zaW9ucywgaWYgYXZhaWxhYmxlCiAgICBmcm9tIEN5dGhvbi5EaXN0dXRpbHMuYnVpbGRfZXh0IGltcG9ydCBidWlsZF9leHQgYXMgX2J1aWxkX2V4dApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBfYnVpbGRfZXh0ID0gX2R1X2J1aWxkX2V4dAoKIyBtYWtlIHN1cmUgX2NvbmZpZ192YXJzIGlzIGluaXRpYWxpemVkCmdldF9jb25maWdfdmFyKCJMRFNIQVJFRCIpCmZyb20gZGlzdHV0aWxzLnN5c2NvbmZpZyBpbXBvcnQgX2NvbmZpZ192YXJzIGFzIF9DT05GSUdfVkFSUwoKCmRlZiBfY3VzdG9taXplX2NvbXBpbGVyX2Zvcl9zaGxpYihjb21waWxlcik6CiAgICBpZiBzeXMucGxhdGZvcm0gPT0gImRhcndpbiI6CiAgICAgICAgIyBidWlsZGluZyAuZHlsaWIgcmVxdWlyZXMgYWRkaXRpb25hbCBjb21waWxlciBmbGFncyBvbiBPU1g7IGhlcmUgd2UKICAgICAgICAjIHRlbXBvcmFyaWx5IHN1YnN0aXR1dGUgdGhlIHB5Y29uZmlnLmggdmFyaWFibGVzIHNvIHRoYXQgZGlzdHV0aWxzJwogICAgICAgICMgJ2N1c3RvbWl6ZV9jb21waWxlcicgdXNlcyB0aGVtIGJlZm9yZSB3ZSBidWlsZCB0aGUgc2hhcmVkIGxpYnJhcmllcy4KICAgICAgICB0bXAgPSBfQ09ORklHX1ZBUlMuY29weSgpCiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIFhYWCBIZWxwISAgSSBkb24ndCBoYXZlIGFueSBpZGVhIHdoZXRoZXIgdGhlc2UgYXJlIHJpZ2h0Li4uCiAgICAgICAgICAgIF9DT05GSUdfVkFSU1snTERTSEFSRUQnXSA9ICgKICAgICAgICAgICAgICAgICJnY2MgLVdsLC14IC1keW5hbWljbGliIC11bmRlZmluZWQgZHluYW1pY19sb29rdXAiKQogICAgICAgICAgICBfQ09ORklHX1ZBUlNbJ0NDU0hBUkVEJ10gPSAiIC1keW5hbWljbGliIgogICAgICAgICAgICBfQ09ORklHX1ZBUlNbJ1NPJ10gPSAiLmR5bGliIgogICAgICAgICAgICBjdXN0b21pemVfY29tcGlsZXIoY29tcGlsZXIpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgX0NPTkZJR19WQVJTLmNsZWFyKCkKICAgICAgICAgICAgX0NPTkZJR19WQVJTLnVwZGF0ZSh0bXApCiAgICBlbHNlOgogICAgICAgIGN1c3RvbWl6ZV9jb21waWxlcihjb21waWxlcikKCgpoYXZlX3J0bGQgPSBGYWxzZQp1c2Vfc3R1YnMgPSBGYWxzZQpsaWJ0eXBlID0gJ3NoYXJlZCcKCmlmIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIjoKICAgIHVzZV9zdHVicyA9IFRydWUKZWxpZiBvcy5uYW1lICE9ICdudCc6CiAgICB0cnk6CiAgICAgICAgaW1wb3J0IGRsCiAgICAgICAgdXNlX3N0dWJzID0gaGF2ZV9ydGxkID0gaGFzYXR0cihkbCwgJ1JUTERfTk9XJykKICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICBwYXNzCgppZl9kbCA9IGxhbWJkYSBzOiBzIGlmIGhhdmVfcnRsZCBlbHNlICcnCgoKZGVmIGdldF9hYmkzX3N1ZmZpeCgpOgogICAgIiIiUmV0dXJuIHRoZSBmaWxlIGV4dGVuc2lvbiBmb3IgYW4gYWJpMy1jb21wbGlhbnQgRXh0ZW5zaW9uKCkiIiIKICAgIGZvciBzdWZmaXgsIF8sIF8gaW4gKHMgZm9yIHMgaW4gaW1wLmdldF9zdWZmaXhlcygpIGlmIHNbMl0gPT0gaW1wLkNfRVhURU5TSU9OKToKICAgICAgICBpZiAnLmFiaTMnIGluIHN1ZmZpeDogICMgVW5peAogICAgICAgICAgICByZXR1cm4gc3VmZml4CiAgICAgICAgZWxpZiBzdWZmaXggPT0gJy5weWQnOiAgIyBXaW5kb3dzCiAgICAgICAgICAgIHJldHVybiBzdWZmaXgKCgpjbGFzcyBidWlsZF9leHQoX2J1aWxkX2V4dCk6CiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgICIiIkJ1aWxkIGV4dGVuc2lvbnMgaW4gYnVpbGQgZGlyZWN0b3J5LCB0aGVuIGNvcHkgaWYgLS1pbnBsYWNlIiIiCiAgICAgICAgb2xkX2lucGxhY2UsIHNlbGYuaW5wbGFjZSA9IHNlbGYuaW5wbGFjZSwgMAogICAgICAgIF9idWlsZF9leHQucnVuKHNlbGYpCiAgICAgICAgc2VsZi5pbnBsYWNlID0gb2xkX2lucGxhY2UKICAgICAgICBpZiBvbGRfaW5wbGFjZToKICAgICAgICAgICAgc2VsZi5jb3B5X2V4dGVuc2lvbnNfdG9fc291cmNlKCkKCiAgICBkZWYgY29weV9leHRlbnNpb25zX3RvX3NvdXJjZShzZWxmKToKICAgICAgICBidWlsZF9weSA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZF9weScpCiAgICAgICAgZm9yIGV4dCBpbiBzZWxmLmV4dGVuc2lvbnM6CiAgICAgICAgICAgIGZ1bGxuYW1lID0gc2VsZi5nZXRfZXh0X2Z1bGxuYW1lKGV4dC5uYW1lKQogICAgICAgICAgICBmaWxlbmFtZSA9IHNlbGYuZ2V0X2V4dF9maWxlbmFtZShmdWxsbmFtZSkKICAgICAgICAgICAgbW9kcGF0aCA9IGZ1bGxuYW1lLnNwbGl0KCcuJykKICAgICAgICAgICAgcGFja2FnZSA9ICcuJy5qb2luKG1vZHBhdGhbOi0xXSkKICAgICAgICAgICAgcGFja2FnZV9kaXIgPSBidWlsZF9weS5nZXRfcGFja2FnZV9kaXIocGFja2FnZSkKICAgICAgICAgICAgZGVzdF9maWxlbmFtZSA9IG9zLnBhdGguam9pbihwYWNrYWdlX2RpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKSkKICAgICAgICAgICAgc3JjX2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKHNlbGYuYnVpbGRfbGliLCBmaWxlbmFtZSkKCiAgICAgICAgICAgICMgQWx3YXlzIGNvcHksIGV2ZW4gaWYgc291cmNlIGlzIG9sZGVyIHRoYW4gZGVzdGluYXRpb24sIHRvIGVuc3VyZQogICAgICAgICAgICAjIHRoYXQgdGhlIHJpZ2h0IGV4dGVuc2lvbnMgZm9yIHRoZSBjdXJyZW50IFB5dGhvbi9wbGF0Zm9ybSBhcmUKICAgICAgICAgICAgIyB1c2VkLgogICAgICAgICAgICBjb3B5X2ZpbGUoCiAgICAgICAgICAgICAgICBzcmNfZmlsZW5hbWUsIGRlc3RfZmlsZW5hbWUsIHZlcmJvc2U9c2VsZi52ZXJib3NlLAogICAgICAgICAgICAgICAgZHJ5X3J1bj1zZWxmLmRyeV9ydW4KICAgICAgICAgICAgKQogICAgICAgICAgICBpZiBleHQuX25lZWRzX3N0dWI6CiAgICAgICAgICAgICAgICBzZWxmLndyaXRlX3N0dWIocGFja2FnZV9kaXIgb3Igb3MuY3VyZGlyLCBleHQsIFRydWUpCgogICAgZGVmIGdldF9leHRfZmlsZW5hbWUoc2VsZiwgZnVsbG5hbWUpOgogICAgICAgIGZpbGVuYW1lID0gX2J1aWxkX2V4dC5nZXRfZXh0X2ZpbGVuYW1lKHNlbGYsIGZ1bGxuYW1lKQogICAgICAgIGlmIGZ1bGxuYW1lIGluIHNlbGYuZXh0X21hcDoKICAgICAgICAgICAgZXh0ID0gc2VsZi5leHRfbWFwW2Z1bGxuYW1lXQogICAgICAgICAgICB1c2VfYWJpMyA9ICgKICAgICAgICAgICAgICAgIHNpeC5QWTMKICAgICAgICAgICAgICAgIGFuZCBnZXRhdHRyKGV4dCwgJ3B5X2xpbWl0ZWRfYXBpJykKICAgICAgICAgICAgICAgIGFuZCBnZXRfYWJpM19zdWZmaXgoKQogICAgICAgICAgICApCiAgICAgICAgICAgIGlmIHVzZV9hYmkzOgogICAgICAgICAgICAgICAgc29fZXh0ID0gX2dldF9jb25maWdfdmFyXzgzNygnRVhUX1NVRkZJWCcpCiAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lWzotbGVuKHNvX2V4dCldCiAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lICsgZ2V0X2FiaTNfc3VmZml4KCkKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShleHQsIExpYnJhcnkpOgogICAgICAgICAgICAgICAgZm4sIGV4dCA9IG9zLnBhdGguc3BsaXRleHQoZmlsZW5hbWUpCiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5zaGxpYl9jb21waWxlci5saWJyYXJ5X2ZpbGVuYW1lKGZuLCBsaWJ0eXBlKQogICAgICAgICAgICBlbGlmIHVzZV9zdHVicyBhbmQgZXh0Ll9saW5rc190b19keW5hbWljOgogICAgICAgICAgICAgICAgZCwgZm4gPSBvcy5wYXRoLnNwbGl0KGZpbGVuYW1lKQogICAgICAgICAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihkLCAnZGwtJyArIGZuKQogICAgICAgIHJldHVybiBmaWxlbmFtZQoKICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgX2J1aWxkX2V4dC5pbml0aWFsaXplX29wdGlvbnMoc2VsZikKICAgICAgICBzZWxmLnNobGliX2NvbXBpbGVyID0gTm9uZQogICAgICAgIHNlbGYuc2hsaWJzID0gW10KICAgICAgICBzZWxmLmV4dF9tYXAgPSB7fQoKICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIF9idWlsZF9leHQuZmluYWxpemVfb3B0aW9ucyhzZWxmKQogICAgICAgIHNlbGYuZXh0ZW5zaW9ucyA9IHNlbGYuZXh0ZW5zaW9ucyBvciBbXQogICAgICAgIHNlbGYuY2hlY2tfZXh0ZW5zaW9uc19saXN0KHNlbGYuZXh0ZW5zaW9ucykKICAgICAgICBzZWxmLnNobGlicyA9IFtleHQgZm9yIGV4dCBpbiBzZWxmLmV4dGVuc2lvbnMKICAgICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV4dCwgTGlicmFyeSldCiAgICAgICAgaWYgc2VsZi5zaGxpYnM6CiAgICAgICAgICAgIHNlbGYuc2V0dXBfc2hsaWJfY29tcGlsZXIoKQogICAgICAgIGZvciBleHQgaW4gc2VsZi5leHRlbnNpb25zOgogICAgICAgICAgICBleHQuX2Z1bGxfbmFtZSA9IHNlbGYuZ2V0X2V4dF9mdWxsbmFtZShleHQubmFtZSkKICAgICAgICBmb3IgZXh0IGluIHNlbGYuZXh0ZW5zaW9uczoKICAgICAgICAgICAgZnVsbG5hbWUgPSBleHQuX2Z1bGxfbmFtZQogICAgICAgICAgICBzZWxmLmV4dF9tYXBbZnVsbG5hbWVdID0gZXh0CgogICAgICAgICAgICAjIGRpc3R1dGlscyAzLjEgd2lsbCBhbHNvIGFzayBmb3IgbW9kdWxlIG5hbWVzCiAgICAgICAgICAgICMgWFhYIHdoYXQgdG8gZG8gd2l0aCBjb25mbGljdHM/CiAgICAgICAgICAgIHNlbGYuZXh0X21hcFtmdWxsbmFtZS5zcGxpdCgnLicpWy0xXV0gPSBleHQKCiAgICAgICAgICAgIGx0ZCA9IHNlbGYuc2hsaWJzIGFuZCBzZWxmLmxpbmtzX3RvX2R5bmFtaWMoZXh0KSBvciBGYWxzZQogICAgICAgICAgICBucyA9IGx0ZCBhbmQgdXNlX3N0dWJzIGFuZCBub3QgaXNpbnN0YW5jZShleHQsIExpYnJhcnkpCiAgICAgICAgICAgIGV4dC5fbGlua3NfdG9fZHluYW1pYyA9IGx0ZAogICAgICAgICAgICBleHQuX25lZWRzX3N0dWIgPSBucwogICAgICAgICAgICBmaWxlbmFtZSA9IGV4dC5fZmlsZV9uYW1lID0gc2VsZi5nZXRfZXh0X2ZpbGVuYW1lKGZ1bGxuYW1lKQogICAgICAgICAgICBsaWJkaXIgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5qb2luKHNlbGYuYnVpbGRfbGliLCBmaWxlbmFtZSkpCiAgICAgICAgICAgIGlmIGx0ZCBhbmQgbGliZGlyIG5vdCBpbiBleHQubGlicmFyeV9kaXJzOgogICAgICAgICAgICAgICAgZXh0LmxpYnJhcnlfZGlycy5hcHBlbmQobGliZGlyKQogICAgICAgICAgICBpZiBsdGQgYW5kIHVzZV9zdHVicyBhbmQgb3MuY3VyZGlyIG5vdCBpbiBleHQucnVudGltZV9saWJyYXJ5X2RpcnM6CiAgICAgICAgICAgICAgICBleHQucnVudGltZV9saWJyYXJ5X2RpcnMuYXBwZW5kKG9zLmN1cmRpcikKCiAgICBkZWYgc2V0dXBfc2hsaWJfY29tcGlsZXIoc2VsZik6CiAgICAgICAgY29tcGlsZXIgPSBzZWxmLnNobGliX2NvbXBpbGVyID0gbmV3X2NvbXBpbGVyKAogICAgICAgICAgICBjb21waWxlcj1zZWxmLmNvbXBpbGVyLCBkcnlfcnVuPXNlbGYuZHJ5X3J1biwgZm9yY2U9c2VsZi5mb3JjZQogICAgICAgICkKICAgICAgICBfY3VzdG9taXplX2NvbXBpbGVyX2Zvcl9zaGxpYihjb21waWxlcikKCiAgICAgICAgaWYgc2VsZi5pbmNsdWRlX2RpcnMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGNvbXBpbGVyLnNldF9pbmNsdWRlX2RpcnMoc2VsZi5pbmNsdWRlX2RpcnMpCiAgICAgICAgaWYgc2VsZi5kZWZpbmUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICMgJ2RlZmluZScgb3B0aW9uIGlzIGEgbGlzdCBvZiAobmFtZSx2YWx1ZSkgdHVwbGVzCiAgICAgICAgICAgIGZvciAobmFtZSwgdmFsdWUpIGluIHNlbGYuZGVmaW5lOgogICAgICAgICAgICAgICAgY29tcGlsZXIuZGVmaW5lX21hY3JvKG5hbWUsIHZhbHVlKQogICAgICAgIGlmIHNlbGYudW5kZWYgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGZvciBtYWNybyBpbiBzZWxmLnVuZGVmOgogICAgICAgICAgICAgICAgY29tcGlsZXIudW5kZWZpbmVfbWFjcm8obWFjcm8pCiAgICAgICAgaWYgc2VsZi5saWJyYXJpZXMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGNvbXBpbGVyLnNldF9saWJyYXJpZXMoc2VsZi5saWJyYXJpZXMpCiAgICAgICAgaWYgc2VsZi5saWJyYXJ5X2RpcnMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGNvbXBpbGVyLnNldF9saWJyYXJ5X2RpcnMoc2VsZi5saWJyYXJ5X2RpcnMpCiAgICAgICAgaWYgc2VsZi5ycGF0aCBpcyBub3QgTm9uZToKICAgICAgICAgICAgY29tcGlsZXIuc2V0X3J1bnRpbWVfbGlicmFyeV9kaXJzKHNlbGYucnBhdGgpCiAgICAgICAgaWYgc2VsZi5saW5rX29iamVjdHMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGNvbXBpbGVyLnNldF9saW5rX29iamVjdHMoc2VsZi5saW5rX29iamVjdHMpCgogICAgICAgICMgaGFjayBzbyBkaXN0dXRpbHMnIGJ1aWxkX2V4dGVuc2lvbigpIGJ1aWxkcyBhIGxpYnJhcnkgaW5zdGVhZAogICAgICAgIGNvbXBpbGVyLmxpbmtfc2hhcmVkX29iamVjdCA9IGxpbmtfc2hhcmVkX29iamVjdC5fX2dldF9fKGNvbXBpbGVyKQoKICAgIGRlZiBnZXRfZXhwb3J0X3N5bWJvbHMoc2VsZiwgZXh0KToKICAgICAgICBpZiBpc2luc3RhbmNlKGV4dCwgTGlicmFyeSk6CiAgICAgICAgICAgIHJldHVybiBleHQuZXhwb3J0X3N5bWJvbHMKICAgICAgICByZXR1cm4gX2J1aWxkX2V4dC5nZXRfZXhwb3J0X3N5bWJvbHMoc2VsZiwgZXh0KQoKICAgIGRlZiBidWlsZF9leHRlbnNpb24oc2VsZiwgZXh0KToKICAgICAgICBleHQuX2NvbnZlcnRfcHl4X3NvdXJjZXNfdG9fbGFuZygpCiAgICAgICAgX2NvbXBpbGVyID0gc2VsZi5jb21waWxlcgogICAgICAgIHRyeToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShleHQsIExpYnJhcnkpOgogICAgICAgICAgICAgICAgc2VsZi5jb21waWxlciA9IHNlbGYuc2hsaWJfY29tcGlsZXIKICAgICAgICAgICAgX2J1aWxkX2V4dC5idWlsZF9leHRlbnNpb24oc2VsZiwgZXh0KQogICAgICAgICAgICBpZiBleHQuX25lZWRzX3N0dWI6CiAgICAgICAgICAgICAgICBjbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGRfcHknKS5idWlsZF9saWIKICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfc3R1YihjbWQsIGV4dCkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBzZWxmLmNvbXBpbGVyID0gX2NvbXBpbGVyCgogICAgZGVmIGxpbmtzX3RvX2R5bmFtaWMoc2VsZiwgZXh0KToKICAgICAgICAiIiJSZXR1cm4gdHJ1ZSBpZiAnZXh0JyBsaW5rcyB0byBhIGR5bmFtaWMgbGliIGluIHRoZSBzYW1lIHBhY2thZ2UiIiIKICAgICAgICAjIFhYWCB0aGlzIHNob3VsZCBjaGVjayB0byBlbnN1cmUgdGhlIGxpYiBpcyBhY3R1YWxseSBiZWluZyBidWlsdAogICAgICAgICMgWFhYIGFzIGR5bmFtaWMsIGFuZCBub3QganVzdCB1c2luZyBhIGxvY2FsbHktZm91bmQgdmVyc2lvbiBvciBhCiAgICAgICAgIyBYWFggc3RhdGljLWNvbXBpbGVkIHZlcnNpb24KICAgICAgICBsaWJuYW1lcyA9IGRpY3QuZnJvbWtleXMoW2xpYi5fZnVsbF9uYW1lIGZvciBsaWIgaW4gc2VsZi5zaGxpYnNdKQogICAgICAgIHBrZyA9ICcuJy5qb2luKGV4dC5fZnVsbF9uYW1lLnNwbGl0KCcuJylbOi0xXSArIFsnJ10pCiAgICAgICAgcmV0dXJuIGFueShwa2cgKyBsaWJuYW1lIGluIGxpYm5hbWVzIGZvciBsaWJuYW1lIGluIGV4dC5saWJyYXJpZXMpCgogICAgZGVmIGdldF9vdXRwdXRzKHNlbGYpOgogICAgICAgIHJldHVybiBfYnVpbGRfZXh0LmdldF9vdXRwdXRzKHNlbGYpICsgc2VsZi5fX2dldF9zdHVic19vdXRwdXRzKCkKCiAgICBkZWYgX19nZXRfc3R1YnNfb3V0cHV0cyhzZWxmKToKICAgICAgICAjIGFzc2VtYmxlIHRoZSBiYXNlIG5hbWUgZm9yIGVhY2ggZXh0ZW5zaW9uIHRoYXQgbmVlZHMgYSBzdHViCiAgICAgICAgbnNfZXh0X2Jhc2VzID0gKAogICAgICAgICAgICBvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF9saWIsICpleHQuX2Z1bGxfbmFtZS5zcGxpdCgnLicpKQogICAgICAgICAgICBmb3IgZXh0IGluIHNlbGYuZXh0ZW5zaW9ucwogICAgICAgICAgICBpZiBleHQuX25lZWRzX3N0dWIKICAgICAgICApCiAgICAgICAgIyBwYWlyIGVhY2ggYmFzZSB3aXRoIHRoZSBleHRlbnNpb24KICAgICAgICBwYWlycyA9IGl0ZXJ0b29scy5wcm9kdWN0KG5zX2V4dF9iYXNlcywgc2VsZi5fX2dldF9vdXRwdXRfZXh0ZW5zaW9ucygpKQogICAgICAgIHJldHVybiBsaXN0KGJhc2UgKyBmbmV4dCBmb3IgYmFzZSwgZm5leHQgaW4gcGFpcnMpCgogICAgZGVmIF9fZ2V0X291dHB1dF9leHRlbnNpb25zKHNlbGYpOgogICAgICAgIHlpZWxkICcucHknCiAgICAgICAgeWllbGQgJy5weWMnCiAgICAgICAgaWYgc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkX3B5Jykub3B0aW1pemU6CiAgICAgICAgICAgIHlpZWxkICcucHlvJwoKICAgIGRlZiB3cml0ZV9zdHViKHNlbGYsIG91dHB1dF9kaXIsIGV4dCwgY29tcGlsZT1GYWxzZSk6CiAgICAgICAgbG9nLmluZm8oIndyaXRpbmcgc3R1YiBsb2FkZXIgZm9yICVzIHRvICVzIiwgZXh0Ll9mdWxsX25hbWUsCiAgICAgICAgICAgICAgICAgb3V0cHV0X2RpcikKICAgICAgICBzdHViX2ZpbGUgPSAob3MucGF0aC5qb2luKG91dHB1dF9kaXIsICpleHQuX2Z1bGxfbmFtZS5zcGxpdCgnLicpKSArCiAgICAgICAgICAgICAgICAgICAgICcucHknKQogICAgICAgIGlmIGNvbXBpbGUgYW5kIG9zLnBhdGguZXhpc3RzKHN0dWJfZmlsZSk6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKHN0dWJfZmlsZSArICIgYWxyZWFkeSBleGlzdHMhIFBsZWFzZSBkZWxldGUuIikKICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICBmID0gb3BlbihzdHViX2ZpbGUsICd3JykKICAgICAgICAgICAgZi53cml0ZSgKICAgICAgICAgICAgICAgICdcbicuam9pbihbCiAgICAgICAgICAgICAgICAgICAgImRlZiBfX2Jvb3RzdHJhcF9fKCk6IiwKICAgICAgICAgICAgICAgICAgICAiICAgZ2xvYmFsIF9fYm9vdHN0cmFwX18sIF9fZmlsZV9fLCBfX2xvYWRlcl9fIiwKICAgICAgICAgICAgICAgICAgICAiICAgaW1wb3J0IHN5cywgb3MsIHBrZ19yZXNvdXJjZXMsIGltcCIgKyBpZl9kbCgiLCBkbCIpLAogICAgICAgICAgICAgICAgICAgICIgICBfX2ZpbGVfXyA9IHBrZ19yZXNvdXJjZXMucmVzb3VyY2VfZmlsZW5hbWUiCiAgICAgICAgICAgICAgICAgICAgIihfX25hbWVfXywlcikiCiAgICAgICAgICAgICAgICAgICAgJSBvcy5wYXRoLmJhc2VuYW1lKGV4dC5fZmlsZV9uYW1lKSwKICAgICAgICAgICAgICAgICAgICAiICAgZGVsIF9fYm9vdHN0cmFwX18iLAogICAgICAgICAgICAgICAgICAgICIgICBpZiAnX19sb2FkZXJfXycgaW4gZ2xvYmFscygpOiIsCiAgICAgICAgICAgICAgICAgICAgIiAgICAgICBkZWwgX19sb2FkZXJfXyIsCiAgICAgICAgICAgICAgICAgICAgaWZfZGwoIiAgIG9sZF9mbGFncyA9IHN5cy5nZXRkbG9wZW5mbGFncygpIiksCiAgICAgICAgICAgICAgICAgICAgIiAgIG9sZF9kaXIgPSBvcy5nZXRjd2QoKSIsCiAgICAgICAgICAgICAgICAgICAgIiAgIHRyeToiLAogICAgICAgICAgICAgICAgICAgICIgICAgIG9zLmNoZGlyKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpIiwKICAgICAgICAgICAgICAgICAgICBpZl9kbCgiICAgICBzeXMuc2V0ZGxvcGVuZmxhZ3MoZGwuUlRMRF9OT1cpIiksCiAgICAgICAgICAgICAgICAgICAgIiAgICAgaW1wLmxvYWRfZHluYW1pYyhfX25hbWVfXyxfX2ZpbGVfXykiLAogICAgICAgICAgICAgICAgICAgICIgICBmaW5hbGx5OiIsCiAgICAgICAgICAgICAgICAgICAgaWZfZGwoIiAgICAgc3lzLnNldGRsb3BlbmZsYWdzKG9sZF9mbGFncykiKSwKICAgICAgICAgICAgICAgICAgICAiICAgICBvcy5jaGRpcihvbGRfZGlyKSIsCiAgICAgICAgICAgICAgICAgICAgIl9fYm9vdHN0cmFwX18oKSIsCiAgICAgICAgICAgICAgICAgICAgIiIgICMgdGVybWluYWwgXG4KICAgICAgICAgICAgICAgIF0pCiAgICAgICAgICAgICkKICAgICAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgaWYgY29tcGlsZToKICAgICAgICAgICAgZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgYnl0ZV9jb21waWxlCgogICAgICAgICAgICBieXRlX2NvbXBpbGUoW3N0dWJfZmlsZV0sIG9wdGltaXplPTAsCiAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZT1UcnVlLCBkcnlfcnVuPXNlbGYuZHJ5X3J1bikKICAgICAgICAgICAgb3B0aW1pemUgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnaW5zdGFsbF9saWInKS5vcHRpbWl6ZQogICAgICAgICAgICBpZiBvcHRpbWl6ZSA+IDA6CiAgICAgICAgICAgICAgICBieXRlX2NvbXBpbGUoW3N0dWJfZmlsZV0sIG9wdGltaXplPW9wdGltaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlPVRydWUsIGRyeV9ydW49c2VsZi5kcnlfcnVuKQogICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzdHViX2ZpbGUpIGFuZCBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICAgICAgb3MudW5saW5rKHN0dWJfZmlsZSkKCgppZiB1c2Vfc3R1YnMgb3Igb3MubmFtZSA9PSAnbnQnOgogICAgIyBCdWlsZCBzaGFyZWQgbGlicmFyaWVzCiAgICAjCiAgICBkZWYgbGlua19zaGFyZWRfb2JqZWN0KAogICAgICAgICAgICBzZWxmLCBvYmplY3RzLCBvdXRwdXRfbGlibmFtZSwgb3V0cHV0X2Rpcj1Ob25lLCBsaWJyYXJpZXM9Tm9uZSwKICAgICAgICAgICAgbGlicmFyeV9kaXJzPU5vbmUsIHJ1bnRpbWVfbGlicmFyeV9kaXJzPU5vbmUsIGV4cG9ydF9zeW1ib2xzPU5vbmUsCiAgICAgICAgICAgIGRlYnVnPTAsIGV4dHJhX3ByZWFyZ3M9Tm9uZSwgZXh0cmFfcG9zdGFyZ3M9Tm9uZSwgYnVpbGRfdGVtcD1Ob25lLAogICAgICAgICAgICB0YXJnZXRfbGFuZz1Ob25lKToKICAgICAgICBzZWxmLmxpbmsoCiAgICAgICAgICAgIHNlbGYuU0hBUkVEX0xJQlJBUlksIG9iamVjdHMsIG91dHB1dF9saWJuYW1lLAogICAgICAgICAgICBvdXRwdXRfZGlyLCBsaWJyYXJpZXMsIGxpYnJhcnlfZGlycywgcnVudGltZV9saWJyYXJ5X2RpcnMsCiAgICAgICAgICAgIGV4cG9ydF9zeW1ib2xzLCBkZWJ1ZywgZXh0cmFfcHJlYXJncywgZXh0cmFfcG9zdGFyZ3MsCiAgICAgICAgICAgIGJ1aWxkX3RlbXAsIHRhcmdldF9sYW5nCiAgICAgICAgKQplbHNlOgogICAgIyBCdWlsZCBzdGF0aWMgbGlicmFyaWVzIGV2ZXJ5d2hlcmUgZWxzZQogICAgbGlidHlwZSA9ICdzdGF0aWMnCgogICAgZGVmIGxpbmtfc2hhcmVkX29iamVjdCgKICAgICAgICAgICAgc2VsZiwgb2JqZWN0cywgb3V0cHV0X2xpYm5hbWUsIG91dHB1dF9kaXI9Tm9uZSwgbGlicmFyaWVzPU5vbmUsCiAgICAgICAgICAgIGxpYnJhcnlfZGlycz1Ob25lLCBydW50aW1lX2xpYnJhcnlfZGlycz1Ob25lLCBleHBvcnRfc3ltYm9scz1Ob25lLAogICAgICAgICAgICBkZWJ1Zz0wLCBleHRyYV9wcmVhcmdzPU5vbmUsIGV4dHJhX3Bvc3RhcmdzPU5vbmUsIGJ1aWxkX3RlbXA9Tm9uZSwKICAgICAgICAgICAgdGFyZ2V0X2xhbmc9Tm9uZSk6CiAgICAgICAgIyBYWFggd2UgbmVlZCB0byBlaXRoZXIgZGlzYWxsb3cgdGhlc2UgYXR0cnMgb24gTGlicmFyeSBpbnN0YW5jZXMsCiAgICAgICAgIyBvciB3YXJuL2Fib3J0IGhlcmUgaWYgc2V0LCBvciBzb21ldGhpbmcuLi4KICAgICAgICAjIGxpYnJhcmllcz1Ob25lLCBsaWJyYXJ5X2RpcnM9Tm9uZSwgcnVudGltZV9saWJyYXJ5X2RpcnM9Tm9uZSwKICAgICAgICAjIGV4cG9ydF9zeW1ib2xzPU5vbmUsIGV4dHJhX3ByZWFyZ3M9Tm9uZSwgZXh0cmFfcG9zdGFyZ3M9Tm9uZSwKICAgICAgICAjIGJ1aWxkX3RlbXA9Tm9uZQoKICAgICAgICBhc3NlcnQgb3V0cHV0X2RpciBpcyBOb25lICAjIGRpc3R1dGlscyBidWlsZF9leHQgZG9lc24ndCBwYXNzIHRoaXMKICAgICAgICBvdXRwdXRfZGlyLCBmaWxlbmFtZSA9IG9zLnBhdGguc3BsaXQob3V0cHV0X2xpYm5hbWUpCiAgICAgICAgYmFzZW5hbWUsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQoZmlsZW5hbWUpCiAgICAgICAgaWYgc2VsZi5saWJyYXJ5X2ZpbGVuYW1lKCJ4Iikuc3RhcnRzd2l0aCgnbGliJyk6CiAgICAgICAgICAgICMgc3RyaXAgJ2xpYicgcHJlZml4OyB0aGlzIGlzIGtsdWRneSBpZiBzb21lIHBsYXRmb3JtIHVzZXMKICAgICAgICAgICAgIyBhIGRpZmZlcmVudCBwcmVmaXgKICAgICAgICAgICAgYmFzZW5hbWUgPSBiYXNlbmFtZVszOl0KCiAgICAgICAgc2VsZi5jcmVhdGVfc3RhdGljX2xpYigKICAgICAgICAgICAgb2JqZWN0cywgYmFzZW5hbWUsIG91dHB1dF9kaXIsIGRlYnVnLCB0YXJnZXRfbGFuZwogICAgICAgICkKCgpkZWYgX2dldF9jb25maWdfdmFyXzgzNyhuYW1lKToKICAgICIiIgogICAgSW4gaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvc2V0dXB0b29scy9wdWxsLzgzNywgd2UgZGlzY292ZXJlZAogICAgUHl0aG9uIDMuMy4wIGV4cG9zZXMgdGhlIGV4dGVuc2lvbiBzdWZmaXggdW5kZXIgdGhlIG5hbWUgJ1NPJy4KICAgICIiIgogICAgaWYgc3lzLnZlcnNpb25faW5mbyA8ICgzLCAzLCAxKToKICAgICAgICBuYW1lID0gJ1NPJwogICAgcmV0dXJuIGdldF9jb25maWdfdmFyKG5hbWUpClBLAwQUAAAAAAAAACEAQEZC3HwlAAB8JQAANgAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9idWlsZF9weS5weWZyb20gZ2xvYiBpbXBvcnQgZ2xvYgpmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBjb252ZXJ0X3BhdGgKaW1wb3J0IGRpc3R1dGlscy5jb21tYW5kLmJ1aWxkX3B5IGFzIG9yaWcKaW1wb3J0IG9zCmltcG9ydCBmbm1hdGNoCmltcG9ydCB0ZXh0d3JhcAppbXBvcnQgaW8KaW1wb3J0IGRpc3R1dGlscy5lcnJvcnMKaW1wb3J0IGl0ZXJ0b29scwoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybiBpbXBvcnQgc2l4CmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCBtYXAsIGZpbHRlciwgZmlsdGVyZmFsc2UKCnRyeToKICAgIGZyb20gc2V0dXB0b29scy5saWIydG8zX2V4IGltcG9ydCBNaXhpbjJ0bzMKZXhjZXB0IEltcG9ydEVycm9yOgoKICAgIGNsYXNzIE1peGluMnRvMzoKICAgICAgICBkZWYgcnVuXzJ0bzMoc2VsZiwgZmlsZXMsIGRvY3Rlc3RzPVRydWUpOgogICAgICAgICAgICAiZG8gbm90aGluZyIKCgpjbGFzcyBidWlsZF9weShvcmlnLmJ1aWxkX3B5LCBNaXhpbjJ0bzMpOgogICAgIiIiRW5oYW5jZWQgJ2J1aWxkX3B5JyBjb21tYW5kIHRoYXQgaW5jbHVkZXMgZGF0YSBmaWxlcyB3aXRoIHBhY2thZ2VzCgogICAgVGhlIGRhdGEgZmlsZXMgYXJlIHNwZWNpZmllZCB2aWEgYSAncGFja2FnZV9kYXRhJyBhcmd1bWVudCB0byAnc2V0dXAoKScuCiAgICBTZWUgJ3NldHVwdG9vbHMuZGlzdC5EaXN0cmlidXRpb24nIGZvciBtb3JlIGRldGFpbHMuCgogICAgQWxzbywgdGhpcyB2ZXJzaW9uIG9mIHRoZSAnYnVpbGRfcHknIGNvbW1hbmQgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IGJvdGgKICAgICdweV9tb2R1bGVzJyBhbmQgJ3BhY2thZ2VzJyBpbiB0aGUgc2FtZSBzZXR1cCBvcGVyYXRpb24uCiAgICAiIiIKCiAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBvcmlnLmJ1aWxkX3B5LmZpbmFsaXplX29wdGlvbnMoc2VsZikKICAgICAgICBzZWxmLnBhY2thZ2VfZGF0YSA9IHNlbGYuZGlzdHJpYnV0aW9uLnBhY2thZ2VfZGF0YQogICAgICAgIHNlbGYuZXhjbHVkZV9wYWNrYWdlX2RhdGEgPSAoc2VsZi5kaXN0cmlidXRpb24uZXhjbHVkZV9wYWNrYWdlX2RhdGEgb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt9KQogICAgICAgIGlmICdkYXRhX2ZpbGVzJyBpbiBzZWxmLl9fZGljdF9fOgogICAgICAgICAgICBkZWwgc2VsZi5fX2RpY3RfX1snZGF0YV9maWxlcyddCiAgICAgICAgc2VsZi5fX3VwZGF0ZWRfZmlsZXMgPSBbXQogICAgICAgIHNlbGYuX19kb2N0ZXN0c18ydG8zID0gW10KCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgICIiIkJ1aWxkIG1vZHVsZXMsIHBhY2thZ2VzLCBhbmQgY29weSBkYXRhIGZpbGVzIHRvIGJ1aWxkIGRpcmVjdG9yeSIiIgogICAgICAgIGlmIG5vdCBzZWxmLnB5X21vZHVsZXMgYW5kIG5vdCBzZWxmLnBhY2thZ2VzOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgaWYgc2VsZi5weV9tb2R1bGVzOgogICAgICAgICAgICBzZWxmLmJ1aWxkX21vZHVsZXMoKQoKICAgICAgICBpZiBzZWxmLnBhY2thZ2VzOgogICAgICAgICAgICBzZWxmLmJ1aWxkX3BhY2thZ2VzKCkKICAgICAgICAgICAgc2VsZi5idWlsZF9wYWNrYWdlX2RhdGEoKQoKICAgICAgICBzZWxmLnJ1bl8ydG8zKHNlbGYuX191cGRhdGVkX2ZpbGVzLCBGYWxzZSkKICAgICAgICBzZWxmLnJ1bl8ydG8zKHNlbGYuX191cGRhdGVkX2ZpbGVzLCBUcnVlKQogICAgICAgIHNlbGYucnVuXzJ0bzMoc2VsZi5fX2RvY3Rlc3RzXzJ0bzMsIFRydWUpCgogICAgICAgICMgT25seSBjb21waWxlIGFjdHVhbCAucHkgZmlsZXMsIHVzaW5nIG91ciBiYXNlIGNsYXNzJyBpZGVhIG9mIHdoYXQgb3VyCiAgICAgICAgIyBvdXRwdXQgZmlsZXMgYXJlLgogICAgICAgIHNlbGYuYnl0ZV9jb21waWxlKG9yaWcuYnVpbGRfcHkuZ2V0X291dHB1dHMoc2VsZiwgaW5jbHVkZV9ieXRlY29kZT0wKSkKCiAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgYXR0cik6CiAgICAgICAgImxhemlseSBjb21wdXRlIGRhdGEgZmlsZXMiCiAgICAgICAgaWYgYXR0ciA9PSAnZGF0YV9maWxlcyc6CiAgICAgICAgICAgIHNlbGYuZGF0YV9maWxlcyA9IHNlbGYuX2dldF9kYXRhX2ZpbGVzKCkKICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGF0YV9maWxlcwogICAgICAgIHJldHVybiBvcmlnLmJ1aWxkX3B5Ll9fZ2V0YXR0cl9fKHNlbGYsIGF0dHIpCgogICAgZGVmIGJ1aWxkX21vZHVsZShzZWxmLCBtb2R1bGUsIG1vZHVsZV9maWxlLCBwYWNrYWdlKToKICAgICAgICBpZiBzaXguUFkyIGFuZCBpc2luc3RhbmNlKHBhY2thZ2UsIHNpeC5zdHJpbmdfdHlwZXMpOgogICAgICAgICAgICAjIGF2b2lkIGVycm9ycyBvbiBQeXRob24gMiB3aGVuIHVuaWNvZGUgaXMgcGFzc2VkICgjMTkwKQogICAgICAgICAgICBwYWNrYWdlID0gcGFja2FnZS5zcGxpdCgnLicpCiAgICAgICAgb3V0ZmlsZSwgY29waWVkID0gb3JpZy5idWlsZF9weS5idWlsZF9tb2R1bGUoc2VsZiwgbW9kdWxlLCBtb2R1bGVfZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlKQogICAgICAgIGlmIGNvcGllZDoKICAgICAgICAgICAgc2VsZi5fX3VwZGF0ZWRfZmlsZXMuYXBwZW5kKG91dGZpbGUpCiAgICAgICAgcmV0dXJuIG91dGZpbGUsIGNvcGllZAoKICAgIGRlZiBfZ2V0X2RhdGFfZmlsZXMoc2VsZik6CiAgICAgICAgIiIiR2VuZXJhdGUgbGlzdCBvZiAnKHBhY2thZ2Usc3JjX2RpcixidWlsZF9kaXIsZmlsZW5hbWVzKScgdHVwbGVzIiIiCiAgICAgICAgc2VsZi5hbmFseXplX21hbmlmZXN0KCkKICAgICAgICByZXR1cm4gbGlzdChtYXAoc2VsZi5fZ2V0X3BrZ19kYXRhX2ZpbGVzLCBzZWxmLnBhY2thZ2VzIG9yICgpKSkKCiAgICBkZWYgX2dldF9wa2dfZGF0YV9maWxlcyhzZWxmLCBwYWNrYWdlKToKICAgICAgICAjIExvY2F0ZSBwYWNrYWdlIHNvdXJjZSBkaXJlY3RvcnkKICAgICAgICBzcmNfZGlyID0gc2VsZi5nZXRfcGFja2FnZV9kaXIocGFja2FnZSkKCiAgICAgICAgIyBDb21wdXRlIHBhY2thZ2UgYnVpbGQgZGlyZWN0b3J5CiAgICAgICAgYnVpbGRfZGlyID0gb3MucGF0aC5qb2luKCooW3NlbGYuYnVpbGRfbGliXSArIHBhY2thZ2Uuc3BsaXQoJy4nKSkpCgogICAgICAgICMgU3RyaXAgZGlyZWN0b3J5IGZyb20gZ2xvYmJlZCBmaWxlbmFtZXMKICAgICAgICBmaWxlbmFtZXMgPSBbCiAgICAgICAgICAgIG9zLnBhdGgucmVscGF0aChmaWxlLCBzcmNfZGlyKQogICAgICAgICAgICBmb3IgZmlsZSBpbiBzZWxmLmZpbmRfZGF0YV9maWxlcyhwYWNrYWdlLCBzcmNfZGlyKQogICAgICAgIF0KICAgICAgICByZXR1cm4gcGFja2FnZSwgc3JjX2RpciwgYnVpbGRfZGlyLCBmaWxlbmFtZXMKCiAgICBkZWYgZmluZF9kYXRhX2ZpbGVzKHNlbGYsIHBhY2thZ2UsIHNyY19kaXIpOgogICAgICAgICIiIlJldHVybiBmaWxlbmFtZXMgZm9yIHBhY2thZ2UncyBkYXRhIGZpbGVzIGluICdzcmNfZGlyJyIiIgogICAgICAgIHBhdHRlcm5zID0gc2VsZi5fZ2V0X3BsYXRmb3JtX3BhdHRlcm5zKAogICAgICAgICAgICBzZWxmLnBhY2thZ2VfZGF0YSwKICAgICAgICAgICAgcGFja2FnZSwKICAgICAgICAgICAgc3JjX2RpciwKICAgICAgICApCiAgICAgICAgZ2xvYnNfZXhwYW5kZWQgPSBtYXAoZ2xvYiwgcGF0dGVybnMpCiAgICAgICAgIyBmbGF0dGVuIHRoZSBleHBhbmRlZCBnbG9icyBpbnRvIGFuIGl0ZXJhYmxlIG9mIG1hdGNoZXMKICAgICAgICBnbG9ic19tYXRjaGVzID0gaXRlcnRvb2xzLmNoYWluLmZyb21faXRlcmFibGUoZ2xvYnNfZXhwYW5kZWQpCiAgICAgICAgZ2xvYl9maWxlcyA9IGZpbHRlcihvcy5wYXRoLmlzZmlsZSwgZ2xvYnNfbWF0Y2hlcykKICAgICAgICBmaWxlcyA9IGl0ZXJ0b29scy5jaGFpbigKICAgICAgICAgICAgc2VsZi5tYW5pZmVzdF9maWxlcy5nZXQocGFja2FnZSwgW10pLAogICAgICAgICAgICBnbG9iX2ZpbGVzLAogICAgICAgICkKICAgICAgICByZXR1cm4gc2VsZi5leGNsdWRlX2RhdGFfZmlsZXMocGFja2FnZSwgc3JjX2RpciwgZmlsZXMpCgogICAgZGVmIGJ1aWxkX3BhY2thZ2VfZGF0YShzZWxmKToKICAgICAgICAiIiJDb3B5IGRhdGEgZmlsZXMgaW50byBidWlsZCBkaXJlY3RvcnkiIiIKICAgICAgICBmb3IgcGFja2FnZSwgc3JjX2RpciwgYnVpbGRfZGlyLCBmaWxlbmFtZXMgaW4gc2VsZi5kYXRhX2ZpbGVzOgogICAgICAgICAgICBmb3IgZmlsZW5hbWUgaW4gZmlsZW5hbWVzOgogICAgICAgICAgICAgICAgdGFyZ2V0ID0gb3MucGF0aC5qb2luKGJ1aWxkX2RpciwgZmlsZW5hbWUpCiAgICAgICAgICAgICAgICBzZWxmLm1rcGF0aChvcy5wYXRoLmRpcm5hbWUodGFyZ2V0KSkKICAgICAgICAgICAgICAgIHNyY2ZpbGUgPSBvcy5wYXRoLmpvaW4oc3JjX2RpciwgZmlsZW5hbWUpCiAgICAgICAgICAgICAgICBvdXRmLCBjb3BpZWQgPSBzZWxmLmNvcHlfZmlsZShzcmNmaWxlLCB0YXJnZXQpCiAgICAgICAgICAgICAgICBzcmNmaWxlID0gb3MucGF0aC5hYnNwYXRoKHNyY2ZpbGUpCiAgICAgICAgICAgICAgICBpZiAoY29waWVkIGFuZAogICAgICAgICAgICAgICAgICAgICAgICBzcmNmaWxlIGluIHNlbGYuZGlzdHJpYnV0aW9uLmNvbnZlcnRfMnRvM19kb2N0ZXN0cyk6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5fX2RvY3Rlc3RzXzJ0bzMuYXBwZW5kKG91dGYpCgogICAgZGVmIGFuYWx5emVfbWFuaWZlc3Qoc2VsZik6CiAgICAgICAgc2VsZi5tYW5pZmVzdF9maWxlcyA9IG1mID0ge30KICAgICAgICBpZiBub3Qgc2VsZi5kaXN0cmlidXRpb24uaW5jbHVkZV9wYWNrYWdlX2RhdGE6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHNyY19kaXJzID0ge30KICAgICAgICBmb3IgcGFja2FnZSBpbiBzZWxmLnBhY2thZ2VzIG9yICgpOgogICAgICAgICAgICAjIExvY2F0ZSBwYWNrYWdlIHNvdXJjZSBkaXJlY3RvcnkKICAgICAgICAgICAgc3JjX2RpcnNbYXNzZXJ0X3JlbGF0aXZlKHNlbGYuZ2V0X3BhY2thZ2VfZGlyKHBhY2thZ2UpKV0gPSBwYWNrYWdlCgogICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2VnZ19pbmZvJykKICAgICAgICBlaV9jbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnZWdnX2luZm8nKQogICAgICAgIGZvciBwYXRoIGluIGVpX2NtZC5maWxlbGlzdC5maWxlczoKICAgICAgICAgICAgZCwgZiA9IG9zLnBhdGguc3BsaXQoYXNzZXJ0X3JlbGF0aXZlKHBhdGgpKQogICAgICAgICAgICBwcmV2ID0gTm9uZQogICAgICAgICAgICBvbGRmID0gZgogICAgICAgICAgICB3aGlsZSBkIGFuZCBkICE9IHByZXYgYW5kIGQgbm90IGluIHNyY19kaXJzOgogICAgICAgICAgICAgICAgcHJldiA9IGQKICAgICAgICAgICAgICAgIGQsIGRmID0gb3MucGF0aC5zcGxpdChkKQogICAgICAgICAgICAgICAgZiA9IG9zLnBhdGguam9pbihkZiwgZikKICAgICAgICAgICAgaWYgZCBpbiBzcmNfZGlyczoKICAgICAgICAgICAgICAgIGlmIHBhdGguZW5kc3dpdGgoJy5weScpIGFuZCBmID09IG9sZGY6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUgICMgaXQncyBhIG1vZHVsZSwgbm90IGRhdGEKICAgICAgICAgICAgICAgIG1mLnNldGRlZmF1bHQoc3JjX2RpcnNbZF0sIFtdKS5hcHBlbmQocGF0aCkKCiAgICBkZWYgZ2V0X2RhdGFfZmlsZXMoc2VsZik6CiAgICAgICAgcGFzcyAgIyBMYXppbHkgY29tcHV0ZSBkYXRhIGZpbGVzIGluIF9nZXRfZGF0YV9maWxlcygpIGZ1bmN0aW9uLgoKICAgIGRlZiBjaGVja19wYWNrYWdlKHNlbGYsIHBhY2thZ2UsIHBhY2thZ2VfZGlyKToKICAgICAgICAiIiJDaGVjayBuYW1lc3BhY2UgcGFja2FnZXMnIF9faW5pdF9fIGZvciBkZWNsYXJlX25hbWVzcGFjZSIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFja2FnZXNfY2hlY2tlZFtwYWNrYWdlXQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgcGFzcwoKICAgICAgICBpbml0X3B5ID0gb3JpZy5idWlsZF9weS5jaGVja19wYWNrYWdlKHNlbGYsIHBhY2thZ2UsIHBhY2thZ2VfZGlyKQogICAgICAgIHNlbGYucGFja2FnZXNfY2hlY2tlZFtwYWNrYWdlXSA9IGluaXRfcHkKCiAgICAgICAgaWYgbm90IGluaXRfcHkgb3Igbm90IHNlbGYuZGlzdHJpYnV0aW9uLm5hbWVzcGFjZV9wYWNrYWdlczoKICAgICAgICAgICAgcmV0dXJuIGluaXRfcHkKCiAgICAgICAgZm9yIHBrZyBpbiBzZWxmLmRpc3RyaWJ1dGlvbi5uYW1lc3BhY2VfcGFja2FnZXM6CiAgICAgICAgICAgIGlmIHBrZyA9PSBwYWNrYWdlIG9yIHBrZy5zdGFydHN3aXRoKHBhY2thZ2UgKyAnLicpOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gaW5pdF9weQoKICAgICAgICB3aXRoIGlvLm9wZW4oaW5pdF9weSwgJ3JiJykgYXMgZjoKICAgICAgICAgICAgY29udGVudHMgPSBmLnJlYWQoKQogICAgICAgIGlmIGInZGVjbGFyZV9uYW1lc3BhY2UnIG5vdCBpbiBjb250ZW50czoKICAgICAgICAgICAgcmFpc2UgZGlzdHV0aWxzLmVycm9ycy5EaXN0dXRpbHNFcnJvcigKICAgICAgICAgICAgICAgICJOYW1lc3BhY2UgcGFja2FnZSBwcm9ibGVtOiAlcyBpcyBhIG5hbWVzcGFjZSBwYWNrYWdlLCBidXQgIgogICAgICAgICAgICAgICAgIml0c1xuX19pbml0X18ucHkgZG9lcyBub3QgY2FsbCBkZWNsYXJlX25hbWVzcGFjZSgpISBQbGVhc2UgIgogICAgICAgICAgICAgICAgJ2ZpeCBpdC5cbihTZWUgdGhlIHNldHVwdG9vbHMgbWFudWFsIHVuZGVyICcKICAgICAgICAgICAgICAgICciTmFtZXNwYWNlIFBhY2thZ2VzIiBmb3IgZGV0YWlscy4pXG4iJyAlIChwYWNrYWdlLCkKICAgICAgICAgICAgKQogICAgICAgIHJldHVybiBpbml0X3B5CgogICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBzZWxmLnBhY2thZ2VzX2NoZWNrZWQgPSB7fQogICAgICAgIG9yaWcuYnVpbGRfcHkuaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpCgogICAgZGVmIGdldF9wYWNrYWdlX2RpcihzZWxmLCBwYWNrYWdlKToKICAgICAgICByZXMgPSBvcmlnLmJ1aWxkX3B5LmdldF9wYWNrYWdlX2RpcihzZWxmLCBwYWNrYWdlKQogICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLnNyY19yb290IGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKHNlbGYuZGlzdHJpYnV0aW9uLnNyY19yb290LCByZXMpCiAgICAgICAgcmV0dXJuIHJlcwoKICAgIGRlZiBleGNsdWRlX2RhdGFfZmlsZXMoc2VsZiwgcGFja2FnZSwgc3JjX2RpciwgZmlsZXMpOgogICAgICAgICIiIkZpbHRlciBmaWxlbmFtZXMgZm9yIHBhY2thZ2UncyBkYXRhIGZpbGVzIGluICdzcmNfZGlyJyIiIgogICAgICAgIGZpbGVzID0gbGlzdChmaWxlcykKICAgICAgICBwYXR0ZXJucyA9IHNlbGYuX2dldF9wbGF0Zm9ybV9wYXR0ZXJucygKICAgICAgICAgICAgc2VsZi5leGNsdWRlX3BhY2thZ2VfZGF0YSwKICAgICAgICAgICAgcGFja2FnZSwKICAgICAgICAgICAgc3JjX2RpciwKICAgICAgICApCiAgICAgICAgbWF0Y2hfZ3JvdXBzID0gKAogICAgICAgICAgICBmbm1hdGNoLmZpbHRlcihmaWxlcywgcGF0dGVybikKICAgICAgICAgICAgZm9yIHBhdHRlcm4gaW4gcGF0dGVybnMKICAgICAgICApCiAgICAgICAgIyBmbGF0dGVuIHRoZSBncm91cHMgb2YgbWF0Y2hlcyBpbnRvIGFuIGl0ZXJhYmxlIG9mIG1hdGNoZXMKICAgICAgICBtYXRjaGVzID0gaXRlcnRvb2xzLmNoYWluLmZyb21faXRlcmFibGUobWF0Y2hfZ3JvdXBzKQogICAgICAgIGJhZCA9IHNldChtYXRjaGVzKQogICAgICAgIGtlZXBlcnMgPSAoCiAgICAgICAgICAgIGZuCiAgICAgICAgICAgIGZvciBmbiBpbiBmaWxlcwogICAgICAgICAgICBpZiBmbiBub3QgaW4gYmFkCiAgICAgICAgKQogICAgICAgICMgZGl0Y2ggZHVwZXMKICAgICAgICByZXR1cm4gbGlzdChfdW5pcXVlX2V2ZXJzZWVuKGtlZXBlcnMpKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfZ2V0X3BsYXRmb3JtX3BhdHRlcm5zKHNwZWMsIHBhY2thZ2UsIHNyY19kaXIpOgogICAgICAgICIiIgogICAgICAgIHlpZWxkIHBsYXRmb3JtLXNwZWNpZmljIHBhdGggcGF0dGVybnMgKHN1aXRhYmxlIGZvciBnbG9iCiAgICAgICAgb3IgZm5fbWF0Y2gpIGZyb20gYSBnbG9iLWJhc2VkIHNwZWMgKHN1Y2ggYXMKICAgICAgICBzZWxmLnBhY2thZ2VfZGF0YSBvciBzZWxmLmV4Y2x1ZGVfcGFja2FnZV9kYXRhKQogICAgICAgIG1hdGNoaW5nIHBhY2thZ2UgaW4gc3JjX2Rpci4KICAgICAgICAiIiIKICAgICAgICByYXdfcGF0dGVybnMgPSBpdGVydG9vbHMuY2hhaW4oCiAgICAgICAgICAgIHNwZWMuZ2V0KCcnLCBbXSksCiAgICAgICAgICAgIHNwZWMuZ2V0KHBhY2thZ2UsIFtdKSwKICAgICAgICApCiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgIyBFYWNoIHBhdHRlcm4gaGFzIHRvIGJlIGNvbnZlcnRlZCB0byBhIHBsYXRmb3JtLXNwZWNpZmljIHBhdGgKICAgICAgICAgICAgb3MucGF0aC5qb2luKHNyY19kaXIsIGNvbnZlcnRfcGF0aChwYXR0ZXJuKSkKICAgICAgICAgICAgZm9yIHBhdHRlcm4gaW4gcmF3X3BhdHRlcm5zCiAgICAgICAgKQoKCiMgZnJvbSBQeXRob24gZG9jcwpkZWYgX3VuaXF1ZV9ldmVyc2VlbihpdGVyYWJsZSwga2V5PU5vbmUpOgogICAgIkxpc3QgdW5pcXVlIGVsZW1lbnRzLCBwcmVzZXJ2aW5nIG9yZGVyLiBSZW1lbWJlciBhbGwgZWxlbWVudHMgZXZlciBzZWVuLiIKICAgICMgdW5pcXVlX2V2ZXJzZWVuKCdBQUFBQkJCQ0NEQUFCQkInKSAtLT4gQSBCIEMgRAogICAgIyB1bmlxdWVfZXZlcnNlZW4oJ0FCQkNjQUQnLCBzdHIubG93ZXIpIC0tPiBBIEIgQyBECiAgICBzZWVuID0gc2V0KCkKICAgIHNlZW5fYWRkID0gc2Vlbi5hZGQKICAgIGlmIGtleSBpcyBOb25lOgogICAgICAgIGZvciBlbGVtZW50IGluIGZpbHRlcmZhbHNlKHNlZW4uX19jb250YWluc19fLCBpdGVyYWJsZSk6CiAgICAgICAgICAgIHNlZW5fYWRkKGVsZW1lbnQpCiAgICAgICAgICAgIHlpZWxkIGVsZW1lbnQKICAgIGVsc2U6CiAgICAgICAgZm9yIGVsZW1lbnQgaW4gaXRlcmFibGU6CiAgICAgICAgICAgIGsgPSBrZXkoZWxlbWVudCkKICAgICAgICAgICAgaWYgayBub3QgaW4gc2VlbjoKICAgICAgICAgICAgICAgIHNlZW5fYWRkKGspCiAgICAgICAgICAgICAgICB5aWVsZCBlbGVtZW50CgoKZGVmIGFzc2VydF9yZWxhdGl2ZShwYXRoKToKICAgIGlmIG5vdCBvcy5wYXRoLmlzYWJzKHBhdGgpOgogICAgICAgIHJldHVybiBwYXRoCiAgICBmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc1NldHVwRXJyb3IKCiAgICBtc2cgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiCiAgICAgICAgRXJyb3I6IHNldHVwIHNjcmlwdCBzcGVjaWZpZXMgYW4gYWJzb2x1dGUgcGF0aDoKCiAgICAgICAgICAgICVzCgogICAgICAgIHNldHVwKCkgYXJndW1lbnRzIG11c3QgKmFsd2F5cyogYmUgLy1zZXBhcmF0ZWQgcGF0aHMgcmVsYXRpdmUgdG8gdGhlCiAgICAgICAgc2V0dXAucHkgZGlyZWN0b3J5LCAqbmV2ZXIqIGFic29sdXRlIHBhdGhzLgogICAgICAgICIiIikubHN0cmlwKCkgJSBwYXRoCiAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKG1zZykKUEsDBBQAAAAAAAAAIQBAXDv/bh8AAG4fAAA1AAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL2RldmVsb3AucHlmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBjb252ZXJ0X3BhdGgKZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwpmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0Vycm9yLCBEaXN0dXRpbHNPcHRpb25FcnJvcgppbXBvcnQgb3MKaW1wb3J0IGdsb2IKaW1wb3J0IGlvCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuIGltcG9ydCBzaXgKCmZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgRGlzdHJpYnV0aW9uLCBQYXRoTWV0YWRhdGEsIG5vcm1hbGl6ZV9wYXRoCmZyb20gc2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbCBpbXBvcnQgZWFzeV9pbnN0YWxsCmZyb20gc2V0dXB0b29scyBpbXBvcnQgbmFtZXNwYWNlcwppbXBvcnQgc2V0dXB0b29scwoKCmNsYXNzIGRldmVsb3AobmFtZXNwYWNlcy5EZXZlbG9wSW5zdGFsbGVyLCBlYXN5X2luc3RhbGwpOgogICAgIiIiU2V0IHVwIHBhY2thZ2UgZm9yIGRldmVsb3BtZW50IiIiCgogICAgZGVzY3JpcHRpb24gPSAiaW5zdGFsbCBwYWNrYWdlIGluICdkZXZlbG9wbWVudCBtb2RlJyIKCiAgICB1c2VyX29wdGlvbnMgPSBlYXN5X2luc3RhbGwudXNlcl9vcHRpb25zICsgWwogICAgICAgICgidW5pbnN0YWxsIiwgInUiLCAiVW5pbnN0YWxsIHRoaXMgc291cmNlIHBhY2thZ2UiKSwKICAgICAgICAoImVnZy1wYXRoPSIsIE5vbmUsICJTZXQgdGhlIHBhdGggdG8gYmUgdXNlZCBpbiB0aGUgLmVnZy1saW5rIGZpbGUiKSwKICAgIF0KCiAgICBib29sZWFuX29wdGlvbnMgPSBlYXN5X2luc3RhbGwuYm9vbGVhbl9vcHRpb25zICsgWyd1bmluc3RhbGwnXQoKICAgIGNvbW1hbmRfY29uc3VtZXNfYXJndW1lbnRzID0gRmFsc2UgICMgb3ZlcnJpZGUgYmFzZQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgaWYgc2VsZi51bmluc3RhbGw6CiAgICAgICAgICAgIHNlbGYubXVsdGlfdmVyc2lvbiA9IFRydWUKICAgICAgICAgICAgc2VsZi51bmluc3RhbGxfbGluaygpCiAgICAgICAgICAgIHNlbGYudW5pbnN0YWxsX25hbWVzcGFjZXMoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYuaW5zdGFsbF9mb3JfZGV2ZWxvcG1lbnQoKQogICAgICAgIHNlbGYud2Fybl9kZXByZWNhdGVkX29wdGlvbnMoKQoKICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgc2VsZi51bmluc3RhbGwgPSBOb25lCiAgICAgICAgc2VsZi5lZ2dfcGF0aCA9IE5vbmUKICAgICAgICBlYXN5X2luc3RhbGwuaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpCiAgICAgICAgc2VsZi5zZXR1cF9wYXRoID0gTm9uZQogICAgICAgIHNlbGYuYWx3YXlzX2NvcHlfZnJvbSA9ICcuJyAgIyBhbHdheXMgY29weSBlZ2dzIGluc3RhbGxlZCBpbiBjdXJkaXIKCiAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBlaSA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCJlZ2dfaW5mbyIpCiAgICAgICAgaWYgZWkuYnJva2VuX2VnZ19pbmZvOgogICAgICAgICAgICB0ZW1wbGF0ZSA9ICJQbGVhc2UgcmVuYW1lICVyIHRvICVyIGJlZm9yZSB1c2luZyAnZGV2ZWxvcCciCiAgICAgICAgICAgIGFyZ3MgPSBlaS5lZ2dfaW5mbywgZWkuYnJva2VuX2VnZ19pbmZvCiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKHRlbXBsYXRlICUgYXJncykKICAgICAgICBzZWxmLmFyZ3MgPSBbZWkuZWdnX25hbWVdCgogICAgICAgIGVhc3lfaW5zdGFsbC5maW5hbGl6ZV9vcHRpb25zKHNlbGYpCiAgICAgICAgc2VsZi5leHBhbmRfYmFzZWRpcnMoKQogICAgICAgIHNlbGYuZXhwYW5kX2RpcnMoKQogICAgICAgICMgcGljayB1cCBzZXR1cC1kaXIgLmVnZyBmaWxlcyBvbmx5OiBubyAuZWdnLWluZm8KICAgICAgICBzZWxmLnBhY2thZ2VfaW5kZXguc2NhbihnbG9iLmdsb2IoJyouZWdnJykpCgogICAgICAgIGVnZ19saW5rX2ZuID0gZWkuZWdnX25hbWUgKyAnLmVnZy1saW5rJwogICAgICAgIHNlbGYuZWdnX2xpbmsgPSBvcy5wYXRoLmpvaW4oc2VsZi5pbnN0YWxsX2RpciwgZWdnX2xpbmtfZm4pCiAgICAgICAgc2VsZi5lZ2dfYmFzZSA9IGVpLmVnZ19iYXNlCiAgICAgICAgaWYgc2VsZi5lZ2dfcGF0aCBpcyBOb25lOgogICAgICAgICAgICBzZWxmLmVnZ19wYXRoID0gb3MucGF0aC5hYnNwYXRoKGVpLmVnZ19iYXNlKQoKICAgICAgICB0YXJnZXQgPSBub3JtYWxpemVfcGF0aChzZWxmLmVnZ19iYXNlKQogICAgICAgIGVnZ19wYXRoID0gbm9ybWFsaXplX3BhdGgob3MucGF0aC5qb2luKHNlbGYuaW5zdGFsbF9kaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lZ2dfcGF0aCkpCiAgICAgICAgaWYgZWdnX3BhdGggIT0gdGFyZ2V0OgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigKICAgICAgICAgICAgICAgICItLWVnZy1wYXRoIG11c3QgYmUgYSByZWxhdGl2ZSBwYXRoIGZyb20gdGhlIGluc3RhbGwiCiAgICAgICAgICAgICAgICAiIGRpcmVjdG9yeSB0byAiICsgdGFyZ2V0CiAgICAgICAgICAgICkKCiAgICAgICAgIyBNYWtlIGEgZGlzdHJpYnV0aW9uIGZvciB0aGUgcGFja2FnZSdzIHNvdXJjZQogICAgICAgIHNlbGYuZGlzdCA9IERpc3RyaWJ1dGlvbigKICAgICAgICAgICAgdGFyZ2V0LAogICAgICAgICAgICBQYXRoTWV0YWRhdGEodGFyZ2V0LCBvcy5wYXRoLmFic3BhdGgoZWkuZWdnX2luZm8pKSwKICAgICAgICAgICAgcHJvamVjdF9uYW1lPWVpLmVnZ19uYW1lCiAgICAgICAgKQoKICAgICAgICBzZWxmLnNldHVwX3BhdGggPSBzZWxmLl9yZXNvbHZlX3NldHVwX3BhdGgoCiAgICAgICAgICAgIHNlbGYuZWdnX2Jhc2UsCiAgICAgICAgICAgIHNlbGYuaW5zdGFsbF9kaXIsCiAgICAgICAgICAgIHNlbGYuZWdnX3BhdGgsCiAgICAgICAgKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfcmVzb2x2ZV9zZXR1cF9wYXRoKGVnZ19iYXNlLCBpbnN0YWxsX2RpciwgZWdnX3BhdGgpOgogICAgICAgICIiIgogICAgICAgIEdlbmVyYXRlIGEgcGF0aCBmcm9tIGVnZ19iYXNlIGJhY2sgdG8gJy4nIHdoZXJlIHRoZQogICAgICAgIHNldHVwIHNjcmlwdCByZXNpZGVzIGFuZCBlbnN1cmUgdGhhdCBwYXRoIHBvaW50cyB0byB0aGUKICAgICAgICBzZXR1cCBwYXRoIGZyb20gJGluc3RhbGxfZGlyLyRlZ2dfcGF0aC4KICAgICAgICAiIiIKICAgICAgICBwYXRoX3RvX3NldHVwID0gZWdnX2Jhc2UucmVwbGFjZShvcy5zZXAsICcvJykucnN0cmlwKCcvJykKICAgICAgICBpZiBwYXRoX3RvX3NldHVwICE9IG9zLmN1cmRpcjoKICAgICAgICAgICAgcGF0aF90b19zZXR1cCA9ICcuLi8nICogKHBhdGhfdG9fc2V0dXAuY291bnQoJy8nKSArIDEpCiAgICAgICAgcmVzb2x2ZWQgPSBub3JtYWxpemVfcGF0aCgKICAgICAgICAgICAgb3MucGF0aC5qb2luKGluc3RhbGxfZGlyLCBlZ2dfcGF0aCwgcGF0aF90b19zZXR1cCkKICAgICAgICApCiAgICAgICAgaWYgcmVzb2x2ZWQgIT0gbm9ybWFsaXplX3BhdGgob3MuY3VyZGlyKToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICAiQ2FuJ3QgZ2V0IGEgY29uc2lzdGVudCBwYXRoIHRvIHNldHVwIHNjcmlwdCBmcm9tIgogICAgICAgICAgICAgICAgIiBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IiwgcmVzb2x2ZWQsIG5vcm1hbGl6ZV9wYXRoKG9zLmN1cmRpcikpCiAgICAgICAgcmV0dXJuIHBhdGhfdG9fc2V0dXAKCiAgICBkZWYgaW5zdGFsbF9mb3JfZGV2ZWxvcG1lbnQoc2VsZik6CiAgICAgICAgaWYgc2l4LlBZMyBhbmQgZ2V0YXR0cihzZWxmLmRpc3RyaWJ1dGlvbiwgJ3VzZV8ydG8zJywgRmFsc2UpOgogICAgICAgICAgICAjIElmIHdlIHJ1biAydG8zIHdlIGNhbiBub3QgZG8gdGhpcyBpbnBsYWNlOgoKICAgICAgICAgICAgIyBFbnN1cmUgbWV0YWRhdGEgaXMgdXAtdG8tZGF0ZQogICAgICAgICAgICBzZWxmLnJlaW5pdGlhbGl6ZV9jb21tYW5kKCdidWlsZF9weScsIGlucGxhY2U9MCkKICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnYnVpbGRfcHknKQogICAgICAgICAgICBicHlfY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoImJ1aWxkX3B5IikKICAgICAgICAgICAgYnVpbGRfcGF0aCA9IG5vcm1hbGl6ZV9wYXRoKGJweV9jbWQuYnVpbGRfbGliKQoKICAgICAgICAgICAgIyBCdWlsZCBleHRlbnNpb25zCiAgICAgICAgICAgIHNlbGYucmVpbml0aWFsaXplX2NvbW1hbmQoJ2VnZ19pbmZvJywgZWdnX2Jhc2U9YnVpbGRfcGF0aCkKICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnZWdnX2luZm8nKQoKICAgICAgICAgICAgc2VsZi5yZWluaXRpYWxpemVfY29tbWFuZCgnYnVpbGRfZXh0JywgaW5wbGFjZT0wKQogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdidWlsZF9leHQnKQoKICAgICAgICAgICAgIyBGaXh1cCBlZ2ctbGluayBhbmQgZWFzeS1pbnN0YWxsLnB0aAogICAgICAgICAgICBlaV9jbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgiZWdnX2luZm8iKQogICAgICAgICAgICBzZWxmLmVnZ19wYXRoID0gYnVpbGRfcGF0aAogICAgICAgICAgICBzZWxmLmRpc3QubG9jYXRpb24gPSBidWlsZF9wYXRoCiAgICAgICAgICAgICMgWFhYCiAgICAgICAgICAgIHNlbGYuZGlzdC5fcHJvdmlkZXIgPSBQYXRoTWV0YWRhdGEoYnVpbGRfcGF0aCwgZWlfY21kLmVnZ19pbmZvKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgV2l0aG91dCAydG8zIGlucGxhY2Ugd29ya3MgZmluZToKICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnZWdnX2luZm8nKQoKICAgICAgICAgICAgIyBCdWlsZCBleHRlbnNpb25zIGluLXBsYWNlCiAgICAgICAgICAgIHNlbGYucmVpbml0aWFsaXplX2NvbW1hbmQoJ2J1aWxkX2V4dCcsIGlucGxhY2U9MSkKICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnYnVpbGRfZXh0JykKCiAgICAgICAgc2VsZi5pbnN0YWxsX3NpdGVfcHkoKSAgIyBlbnN1cmUgdGhhdCB0YXJnZXQgZGlyIGlzIHNpdGUtc2FmZQogICAgICAgIGlmIHNldHVwdG9vbHMuYm9vdHN0cmFwX2luc3RhbGxfZnJvbToKICAgICAgICAgICAgc2VsZi5lYXN5X2luc3RhbGwoc2V0dXB0b29scy5ib290c3RyYXBfaW5zdGFsbF9mcm9tKQogICAgICAgICAgICBzZXR1cHRvb2xzLmJvb3RzdHJhcF9pbnN0YWxsX2Zyb20gPSBOb25lCgogICAgICAgIHNlbGYuaW5zdGFsbF9uYW1lc3BhY2VzKCkKCiAgICAgICAgIyBjcmVhdGUgYW4gLmVnZy1saW5rIGluIHRoZSBpbnN0YWxsYXRpb24gZGlyLCBwb2ludGluZyB0byBvdXIgZWdnCiAgICAgICAgbG9nLmluZm8oIkNyZWF0aW5nICVzIChsaW5rIHRvICVzKSIsIHNlbGYuZWdnX2xpbmssIHNlbGYuZWdnX2Jhc2UpCiAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgd2l0aCBvcGVuKHNlbGYuZWdnX2xpbmssICJ3IikgYXMgZjoKICAgICAgICAgICAgICAgIGYud3JpdGUoc2VsZi5lZ2dfcGF0aCArICJcbiIgKyBzZWxmLnNldHVwX3BhdGgpCiAgICAgICAgIyBwb3N0cHJvY2VzcyB0aGUgaW5zdGFsbGVkIGRpc3RybywgZml4aW5nIHVwIC5wdGgsIGluc3RhbGxpbmcgc2NyaXB0cywKICAgICAgICAjIGFuZCBoYW5kbGluZyByZXF1aXJlbWVudHMKICAgICAgICBzZWxmLnByb2Nlc3NfZGlzdHJpYnV0aW9uKE5vbmUsIHNlbGYuZGlzdCwgbm90IHNlbGYubm9fZGVwcykKCiAgICBkZWYgdW5pbnN0YWxsX2xpbmsoc2VsZik6CiAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc2VsZi5lZ2dfbGluayk6CiAgICAgICAgICAgIGxvZy5pbmZvKCJSZW1vdmluZyAlcyAobGluayB0byAlcykiLCBzZWxmLmVnZ19saW5rLCBzZWxmLmVnZ19iYXNlKQogICAgICAgICAgICBlZ2dfbGlua19maWxlID0gb3BlbihzZWxmLmVnZ19saW5rKQogICAgICAgICAgICBjb250ZW50cyA9IFtsaW5lLnJzdHJpcCgpIGZvciBsaW5lIGluIGVnZ19saW5rX2ZpbGVdCiAgICAgICAgICAgIGVnZ19saW5rX2ZpbGUuY2xvc2UoKQogICAgICAgICAgICBpZiBjb250ZW50cyBub3QgaW4gKFtzZWxmLmVnZ19wYXRoXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZi5lZ2dfcGF0aCwgc2VsZi5zZXR1cF9wYXRoXSk6CiAgICAgICAgICAgICAgICBsb2cud2FybigiTGluayBwb2ludHMgdG8gJXM6IHVuaW5zdGFsbCBhYm9ydGVkIiwgY29udGVudHMpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgICAgIG9zLnVubGluayhzZWxmLmVnZ19saW5rKQogICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgIHNlbGYudXBkYXRlX3B0aChzZWxmLmRpc3QpICAjIHJlbW92ZSBhbnkgLnB0aCBsaW5rIHRvIHVzCiAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24uc2NyaXB0czoKICAgICAgICAgICAgIyBYWFggc2hvdWxkIGFsc28gY2hlY2sgZm9yIGVudHJ5IHBvaW50IHNjcmlwdHMhCiAgICAgICAgICAgIGxvZy53YXJuKCJOb3RlOiB5b3UgbXVzdCB1bmluc3RhbGwgb3IgcmVwbGFjZSBzY3JpcHRzIG1hbnVhbGx5ISIpCgogICAgZGVmIGluc3RhbGxfZWdnX3NjcmlwdHMoc2VsZiwgZGlzdCk6CiAgICAgICAgaWYgZGlzdCBpcyBub3Qgc2VsZi5kaXN0OgogICAgICAgICAgICAjIEluc3RhbGxpbmcgYSBkZXBlbmRlbmN5LCBzbyBmYWxsIGJhY2sgdG8gbm9ybWFsIGJlaGF2aW9yCiAgICAgICAgICAgIHJldHVybiBlYXN5X2luc3RhbGwuaW5zdGFsbF9lZ2dfc2NyaXB0cyhzZWxmLCBkaXN0KQoKICAgICAgICAjIGNyZWF0ZSB3cmFwcGVyIHNjcmlwdHMgaW4gdGhlIHNjcmlwdCBkaXIsIHBvaW50aW5nIHRvIGRpc3Quc2NyaXB0cwoKICAgICAgICAjIG5ldy1zdHlsZS4uLgogICAgICAgIHNlbGYuaW5zdGFsbF93cmFwcGVyX3NjcmlwdHMoZGlzdCkKCiAgICAgICAgIyAuLi5hbmQgb2xkLXN0eWxlCiAgICAgICAgZm9yIHNjcmlwdF9uYW1lIGluIHNlbGYuZGlzdHJpYnV0aW9uLnNjcmlwdHMgb3IgW106CiAgICAgICAgICAgIHNjcmlwdF9wYXRoID0gb3MucGF0aC5hYnNwYXRoKGNvbnZlcnRfcGF0aChzY3JpcHRfbmFtZSkpCiAgICAgICAgICAgIHNjcmlwdF9uYW1lID0gb3MucGF0aC5iYXNlbmFtZShzY3JpcHRfcGF0aCkKICAgICAgICAgICAgd2l0aCBpby5vcGVuKHNjcmlwdF9wYXRoKSBhcyBzdHJtOgogICAgICAgICAgICAgICAgc2NyaXB0X3RleHQgPSBzdHJtLnJlYWQoKQogICAgICAgICAgICBzZWxmLmluc3RhbGxfc2NyaXB0KGRpc3QsIHNjcmlwdF9uYW1lLCBzY3JpcHRfdGV4dCwgc2NyaXB0X3BhdGgpCgogICAgZGVmIGluc3RhbGxfd3JhcHBlcl9zY3JpcHRzKHNlbGYsIGRpc3QpOgogICAgICAgIGRpc3QgPSBWZXJzaW9ubGVzc1JlcXVpcmVtZW50KGRpc3QpCiAgICAgICAgcmV0dXJuIGVhc3lfaW5zdGFsbC5pbnN0YWxsX3dyYXBwZXJfc2NyaXB0cyhzZWxmLCBkaXN0KQoKCmNsYXNzIFZlcnNpb25sZXNzUmVxdWlyZW1lbnQob2JqZWN0KToKICAgICIiIgogICAgQWRhcHQgYSBwa2dfcmVzb3VyY2VzLkRpc3RyaWJ1dGlvbiB0byBzaW1wbHkgcmV0dXJuIHRoZSBwcm9qZWN0CiAgICBuYW1lIGFzIHRoZSAncmVxdWlyZW1lbnQnIHNvIHRoYXQgc2NyaXB0cyB3aWxsIHdvcmsgYWNyb3NzCiAgICBtdWx0aXBsZSB2ZXJzaW9ucy4KCiAgICA+Pj4gZGlzdCA9IERpc3RyaWJ1dGlvbihwcm9qZWN0X25hbWU9J2ZvbycsIHZlcnNpb249JzEuMCcpCiAgICA+Pj4gc3RyKGRpc3QuYXNfcmVxdWlyZW1lbnQoKSkKICAgICdmb289PTEuMCcKICAgID4+PiBhZGFwdGVkX2Rpc3QgPSBWZXJzaW9ubGVzc1JlcXVpcmVtZW50KGRpc3QpCiAgICA+Pj4gc3RyKGFkYXB0ZWRfZGlzdC5hc19yZXF1aXJlbWVudCgpKQogICAgJ2ZvbycKICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkaXN0KToKICAgICAgICBzZWxmLl9fZGlzdCA9IGRpc3QKCiAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6CiAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZi5fX2Rpc3QsIG5hbWUpCgogICAgZGVmIGFzX3JlcXVpcmVtZW50KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLnByb2plY3RfbmFtZQpQSwMEFAAAAAAAAAAhAP/o9pHAAwAAwAMAADcAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvZGlzdF9pbmZvLnB5IiIiCkNyZWF0ZSBhIGRpc3RfaW5mbyBkaXJlY3RvcnkKQXMgZGVmaW5lZCBpbiB0aGUgd2hlZWwgc3BlY2lmaWNhdGlvbgoiIiIKCmltcG9ydCBvcwoKZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgQ29tbWFuZApmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCgoKY2xhc3MgZGlzdF9pbmZvKENvbW1hbmQpOgoKICAgIGRlc2NyaXB0aW9uID0gJ2NyZWF0ZSBhIC5kaXN0LWluZm8gZGlyZWN0b3J5JwoKICAgIHVzZXJfb3B0aW9ucyA9IFsKICAgICAgICAoJ2VnZy1iYXNlPScsICdlJywgImRpcmVjdG9yeSBjb250YWluaW5nIC5lZ2ctaW5mbyBkaXJlY3RvcmllcyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAoZGVmYXVsdDogdG9wIG9mIHRoZSBzb3VyY2UgdHJlZSkiKSwKICAgIF0KCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIHNlbGYuZWdnX2Jhc2UgPSBOb25lCgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgcGFzcwoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgZWdnX2luZm8gPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnZWdnX2luZm8nKQogICAgICAgIGVnZ19pbmZvLmVnZ19iYXNlID0gc2VsZi5lZ2dfYmFzZQogICAgICAgIGVnZ19pbmZvLmZpbmFsaXplX29wdGlvbnMoKQogICAgICAgIGVnZ19pbmZvLnJ1bigpCiAgICAgICAgZGlzdF9pbmZvX2RpciA9IGVnZ19pbmZvLmVnZ19pbmZvWzotbGVuKCcuZWdnLWluZm8nKV0gKyAnLmRpc3QtaW5mbycKICAgICAgICBsb2cuaW5mbygiY3JlYXRpbmcgJ3t9JyIuZm9ybWF0KG9zLnBhdGguYWJzcGF0aChkaXN0X2luZm9fZGlyKSkpCgogICAgICAgIGJkaXN0X3doZWVsID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2JkaXN0X3doZWVsJykKICAgICAgICBiZGlzdF93aGVlbC5lZ2cyZGlzdChlZ2dfaW5mby5lZ2dfaW5mbywgZGlzdF9pbmZvX2RpcikKUEsDBBQAAAAAAAAAIQCrdBLpVVQBAFVUAQA6AAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL2Vhc3lfaW5zdGFsbC5weSMhL3Vzci9iaW4vZW52IHB5dGhvbgoiIiIKRWFzeSBJbnN0YWxsCi0tLS0tLS0tLS0tLQoKQSB0b29sIGZvciBkb2luZyBhdXRvbWF0aWMgZG93bmxvYWQvZXh0cmFjdC9idWlsZCBvZiBkaXN0dXRpbHMtYmFzZWQgUHl0aG9uCnBhY2thZ2VzLiAgRm9yIGRldGFpbGVkIGRvY3VtZW50YXRpb24sIHNlZSB0aGUgYWNjb21wYW55aW5nIEVhc3lJbnN0YWxsLnR4dApmaWxlLCBvciB2aXNpdCB0aGUgYEVhc3lJbnN0YWxsIGhvbWUgcGFnZWBfXy4KCl9fIGh0dHBzOi8vc2V0dXB0b29scy5yZWFkdGhlZG9jcy5pby9lbi9sYXRlc3QvZWFzeV9pbnN0YWxsLmh0bWwKCiIiIgoKZnJvbSBnbG9iIGltcG9ydCBnbG9iCmZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGdldF9wbGF0Zm9ybQpmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBjb252ZXJ0X3BhdGgsIHN1YnN0X3ZhcnMKZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCAoCiAgICBEaXN0dXRpbHNBcmdFcnJvciwgRGlzdHV0aWxzT3B0aW9uRXJyb3IsCiAgICBEaXN0dXRpbHNFcnJvciwgRGlzdHV0aWxzUGxhdGZvcm1FcnJvciwKKQpmcm9tIGRpc3R1dGlscy5jb21tYW5kLmluc3RhbGwgaW1wb3J0IElOU1RBTExfU0NIRU1FUywgU0NIRU1FX0tFWVMKZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZywgZGlyX3V0aWwKZnJvbSBkaXN0dXRpbHMuY29tbWFuZC5idWlsZF9zY3JpcHRzIGltcG9ydCBmaXJzdF9saW5lX3JlCmZyb20gZGlzdHV0aWxzLnNwYXduIGltcG9ydCBmaW5kX2V4ZWN1dGFibGUKaW1wb3J0IHN5cwppbXBvcnQgb3MKaW1wb3J0IHppcGltcG9ydAppbXBvcnQgc2h1dGlsCmltcG9ydCB0ZW1wZmlsZQppbXBvcnQgemlwZmlsZQppbXBvcnQgcmUKaW1wb3J0IHN0YXQKaW1wb3J0IHJhbmRvbQppbXBvcnQgdGV4dHdyYXAKaW1wb3J0IHdhcm5pbmdzCmltcG9ydCBzaXRlCmltcG9ydCBzdHJ1Y3QKaW1wb3J0IGNvbnRleHRsaWIKaW1wb3J0IHN1YnByb2Nlc3MKaW1wb3J0IHNobGV4CmltcG9ydCBpbwoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybiBpbXBvcnQgc2l4CmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCBjb25maWdwYXJzZXIsIG1hcAoKZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBDb21tYW5kCmZyb20gc2V0dXB0b29scy5zYW5kYm94IGltcG9ydCBydW5fc2V0dXAKZnJvbSBzZXR1cHRvb2xzLnB5MzFjb21wYXQgaW1wb3J0IGdldF9wYXRoLCBnZXRfY29uZmlnX3ZhcnMKZnJvbSBzZXR1cHRvb2xzLnB5Mjdjb21wYXQgaW1wb3J0IHJtdHJlZV9zYWZlCmZyb20gc2V0dXB0b29scy5jb21tYW5kIGltcG9ydCBzZXRvcHQKZnJvbSBzZXR1cHRvb2xzLmFyY2hpdmVfdXRpbCBpbXBvcnQgdW5wYWNrX2FyY2hpdmUKZnJvbSBzZXR1cHRvb2xzLnBhY2thZ2VfaW5kZXggaW1wb3J0ICgKICAgIFBhY2thZ2VJbmRleCwgcGFyc2VfcmVxdWlyZW1lbnRfYXJnLCBVUkxfU0NIRU1FLAopCmZyb20gc2V0dXB0b29scy5jb21tYW5kIGltcG9ydCBiZGlzdF9lZ2csIGVnZ19pbmZvCmZyb20gc2V0dXB0b29scy53aGVlbCBpbXBvcnQgV2hlZWwKZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCAoCiAgICB5aWVsZF9saW5lcywgbm9ybWFsaXplX3BhdGgsIHJlc291cmNlX3N0cmluZywgZW5zdXJlX2RpcmVjdG9yeSwKICAgIGdldF9kaXN0cmlidXRpb24sIGZpbmRfZGlzdHJpYnV0aW9ucywgRW52aXJvbm1lbnQsIFJlcXVpcmVtZW50LAogICAgRGlzdHJpYnV0aW9uLCBQYXRoTWV0YWRhdGEsIEVnZ01ldGFkYXRhLCBXb3JraW5nU2V0LCBEaXN0cmlidXRpb25Ob3RGb3VuZCwKICAgIFZlcnNpb25Db25mbGljdCwgREVWRUxPUF9ESVNULAopCmltcG9ydCBwa2dfcmVzb3VyY2VzLnB5MzFjb21wYXQKCiMgVHVybiBvbiBQRVA0NDBXYXJuaW5ncwp3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiZGVmYXVsdCIsIGNhdGVnb3J5PXBrZ19yZXNvdXJjZXMuUEVQNDQwV2FybmluZykKCl9fYWxsX18gPSBbCiAgICAnc2FtZWZpbGUnLCAnZWFzeV9pbnN0YWxsJywgJ1B0aERpc3RyaWJ1dGlvbnMnLCAnZXh0cmFjdF93aW5pbnN0X2NmZycsCiAgICAnbWFpbicsICdnZXRfZXhlX3ByZWZpeGVzJywKXQoKCmRlZiBpc182NGJpdCgpOgogICAgcmV0dXJuIHN0cnVjdC5jYWxjc2l6ZSgiUCIpID09IDgKCgpkZWYgc2FtZWZpbGUocDEsIHAyKToKICAgICIiIgogICAgRGV0ZXJtaW5lIGlmIHR3byBwYXRocyByZWZlcmVuY2UgdGhlIHNhbWUgZmlsZS4KCiAgICBBdWdtZW50cyBvcy5wYXRoLnNhbWVmaWxlIHRvIHdvcmsgb24gV2luZG93cyBhbmQKICAgIHN1cHByZXNzZXMgZXJyb3JzIGlmIHRoZSBwYXRoIGRvZXNuJ3QgZXhpc3QuCiAgICAiIiIKICAgIGJvdGhfZXhpc3QgPSBvcy5wYXRoLmV4aXN0cyhwMSkgYW5kIG9zLnBhdGguZXhpc3RzKHAyKQogICAgdXNlX3NhbWVmaWxlID0gaGFzYXR0cihvcy5wYXRoLCAnc2FtZWZpbGUnKSBhbmQgYm90aF9leGlzdAogICAgaWYgdXNlX3NhbWVmaWxlOgogICAgICAgIHJldHVybiBvcy5wYXRoLnNhbWVmaWxlKHAxLCBwMikKICAgIG5vcm1fcDEgPSBvcy5wYXRoLm5vcm1wYXRoKG9zLnBhdGgubm9ybWNhc2UocDEpKQogICAgbm9ybV9wMiA9IG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5ub3JtY2FzZShwMikpCiAgICByZXR1cm4gbm9ybV9wMSA9PSBub3JtX3AyCgoKaWYgc2l4LlBZMjoKCiAgICBkZWYgX3RvX2FzY2lpKHMpOgogICAgICAgIHJldHVybiBzCgogICAgZGVmIGlzYXNjaWkocyk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBzaXgudGV4dF90eXBlKHMsICdhc2NpaScpCiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgZXhjZXB0IFVuaWNvZGVFcnJvcjoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCmVsc2U6CgogICAgZGVmIF90b19hc2NpaShzKToKICAgICAgICByZXR1cm4gcy5lbmNvZGUoJ2FzY2lpJykKCiAgICBkZWYgaXNhc2NpaShzKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHMuZW5jb2RlKCdhc2NpaScpCiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgZXhjZXB0IFVuaWNvZGVFcnJvcjoKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgoKX29uZV9saW5lciA9IGxhbWJkYSB0ZXh0OiB0ZXh0d3JhcC5kZWRlbnQodGV4dCkuc3RyaXAoKS5yZXBsYWNlKCdcbicsICc7ICcpCgoKY2xhc3MgZWFzeV9pbnN0YWxsKENvbW1hbmQpOgogICAgIiIiTWFuYWdlIGEgZG93bmxvYWQvYnVpbGQvaW5zdGFsbCBwcm9jZXNzIiIiCiAgICBkZXNjcmlwdGlvbiA9ICJGaW5kL2dldC9pbnN0YWxsIFB5dGhvbiBwYWNrYWdlcyIKICAgIGNvbW1hbmRfY29uc3VtZXNfYXJndW1lbnRzID0gVHJ1ZQoKICAgIHVzZXJfb3B0aW9ucyA9IFsKICAgICAgICAoJ3ByZWZpeD0nLCBOb25lLCAiaW5zdGFsbGF0aW9uIHByZWZpeCIpLAogICAgICAgICgiemlwLW9rIiwgInoiLCAiaW5zdGFsbCBwYWNrYWdlIGFzIGEgemlwZmlsZSIpLAogICAgICAgICgibXVsdGktdmVyc2lvbiIsICJtIiwgIm1ha2UgYXBwcyBoYXZlIHRvIHJlcXVpcmUoKSBhIHZlcnNpb24iKSwKICAgICAgICAoInVwZ3JhZGUiLCAiVSIsICJmb3JjZSB1cGdyYWRlIChzZWFyY2hlcyBQeVBJIGZvciBsYXRlc3QgdmVyc2lvbnMpIiksCiAgICAgICAgKCJpbnN0YWxsLWRpcj0iLCAiZCIsICJpbnN0YWxsIHBhY2thZ2UgdG8gRElSIiksCiAgICAgICAgKCJzY3JpcHQtZGlyPSIsICJzIiwgImluc3RhbGwgc2NyaXB0cyB0byBESVIiKSwKICAgICAgICAoImV4Y2x1ZGUtc2NyaXB0cyIsICJ4IiwgIkRvbid0IGluc3RhbGwgc2NyaXB0cyIpLAogICAgICAgICgiYWx3YXlzLWNvcHkiLCAiYSIsICJDb3B5IGFsbCBuZWVkZWQgcGFja2FnZXMgdG8gaW5zdGFsbCBkaXIiKSwKICAgICAgICAoImluZGV4LXVybD0iLCAiaSIsICJiYXNlIFVSTCBvZiBQeXRob24gUGFja2FnZSBJbmRleCIpLAogICAgICAgICgiZmluZC1saW5rcz0iLCAiZiIsICJhZGRpdGlvbmFsIFVSTChzKSB0byBzZWFyY2ggZm9yIHBhY2thZ2VzIiksCiAgICAgICAgKCJidWlsZC1kaXJlY3Rvcnk9IiwgImIiLAogICAgICAgICAiZG93bmxvYWQvZXh0cmFjdC9idWlsZCBpbiBESVI7IGtlZXAgdGhlIHJlc3VsdHMiKSwKICAgICAgICAoJ29wdGltaXplPScsICdPJywKICAgICAgICAgImFsc28gY29tcGlsZSB3aXRoIG9wdGltaXphdGlvbjogLU8xIGZvciBcInB5dGhvbiAtT1wiLCAiCiAgICAgICAgICItTzIgZm9yIFwicHl0aG9uIC1PT1wiLCBhbmQgLU8wIHRvIGRpc2FibGUgW2RlZmF1bHQ6IC1PMF0iKSwKICAgICAgICAoJ3JlY29yZD0nLCBOb25lLAogICAgICAgICAiZmlsZW5hbWUgaW4gd2hpY2ggdG8gcmVjb3JkIGxpc3Qgb2YgaW5zdGFsbGVkIGZpbGVzIiksCiAgICAgICAgKCdhbHdheXMtdW56aXAnLCAnWicsICJkb24ndCBpbnN0YWxsIGFzIGEgemlwZmlsZSwgbm8gbWF0dGVyIHdoYXQiKSwKICAgICAgICAoJ3NpdGUtZGlycz0nLCAnUycsICJsaXN0IG9mIGRpcmVjdG9yaWVzIHdoZXJlIC5wdGggZmlsZXMgd29yayIpLAogICAgICAgICgnZWRpdGFibGUnLCAnZScsICJJbnN0YWxsIHNwZWNpZmllZCBwYWNrYWdlcyBpbiBlZGl0YWJsZSBmb3JtIiksCiAgICAgICAgKCduby1kZXBzJywgJ04nLCAiZG9uJ3QgaW5zdGFsbCBkZXBlbmRlbmNpZXMiKSwKICAgICAgICAoJ2FsbG93LWhvc3RzPScsICdIJywgInBhdHRlcm4ocykgdGhhdCBob3N0bmFtZXMgbXVzdCBtYXRjaCIpLAogICAgICAgICgnbG9jYWwtc25hcHNob3RzLW9rJywgJ2wnLAogICAgICAgICAiYWxsb3cgYnVpbGRpbmcgZWdncyBmcm9tIGxvY2FsIGNoZWNrb3V0cyIpLAogICAgICAgICgndmVyc2lvbicsIE5vbmUsICJwcmludCB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCBleGl0IiksCiAgICAgICAgKCduby1maW5kLWxpbmtzJywgTm9uZSwKICAgICAgICAgIkRvbid0IGxvYWQgZmluZC1saW5rcyBkZWZpbmVkIGluIHBhY2thZ2VzIGJlaW5nIGluc3RhbGxlZCIpCiAgICBdCiAgICBib29sZWFuX29wdGlvbnMgPSBbCiAgICAgICAgJ3ppcC1vaycsICdtdWx0aS12ZXJzaW9uJywgJ2V4Y2x1ZGUtc2NyaXB0cycsICd1cGdyYWRlJywgJ2Fsd2F5cy1jb3B5JywKICAgICAgICAnZWRpdGFibGUnLAogICAgICAgICduby1kZXBzJywgJ2xvY2FsLXNuYXBzaG90cy1vaycsICd2ZXJzaW9uJwogICAgXQoKICAgIGlmIHNpdGUuRU5BQkxFX1VTRVJfU0lURToKICAgICAgICBoZWxwX21zZyA9ICJpbnN0YWxsIGluIHVzZXIgc2l0ZS1wYWNrYWdlICclcyciICUgc2l0ZS5VU0VSX1NJVEUKICAgICAgICB1c2VyX29wdGlvbnMuYXBwZW5kKCgndXNlcicsIE5vbmUsIGhlbHBfbXNnKSkKICAgICAgICBib29sZWFuX29wdGlvbnMuYXBwZW5kKCd1c2VyJykKCiAgICBuZWdhdGl2ZV9vcHQgPSB7J2Fsd2F5cy11bnppcCc6ICd6aXAtb2snfQogICAgY3JlYXRlX2luZGV4ID0gUGFja2FnZUluZGV4CgogICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICAjIHRoZSAtLXVzZXIgb3B0aW9uIHNlZW1zIHRvIGJlIGFuIG9wdC1pbiBvbmUsCiAgICAgICAgIyBzbyB0aGUgZGVmYXVsdCBzaG91bGQgYmUgRmFsc2UuCiAgICAgICAgc2VsZi51c2VyID0gMAogICAgICAgIHNlbGYuemlwX29rID0gc2VsZi5sb2NhbF9zbmFwc2hvdHNfb2sgPSBOb25lCiAgICAgICAgc2VsZi5pbnN0YWxsX2RpciA9IHNlbGYuc2NyaXB0X2RpciA9IHNlbGYuZXhjbHVkZV9zY3JpcHRzID0gTm9uZQogICAgICAgIHNlbGYuaW5kZXhfdXJsID0gTm9uZQogICAgICAgIHNlbGYuZmluZF9saW5rcyA9IE5vbmUKICAgICAgICBzZWxmLmJ1aWxkX2RpcmVjdG9yeSA9IE5vbmUKICAgICAgICBzZWxmLmFyZ3MgPSBOb25lCiAgICAgICAgc2VsZi5vcHRpbWl6ZSA9IHNlbGYucmVjb3JkID0gTm9uZQogICAgICAgIHNlbGYudXBncmFkZSA9IHNlbGYuYWx3YXlzX2NvcHkgPSBzZWxmLm11bHRpX3ZlcnNpb24gPSBOb25lCiAgICAgICAgc2VsZi5lZGl0YWJsZSA9IHNlbGYubm9fZGVwcyA9IHNlbGYuYWxsb3dfaG9zdHMgPSBOb25lCiAgICAgICAgc2VsZi5yb290ID0gc2VsZi5wcmVmaXggPSBzZWxmLm5vX3JlcG9ydCA9IE5vbmUKICAgICAgICBzZWxmLnZlcnNpb24gPSBOb25lCiAgICAgICAgc2VsZi5pbnN0YWxsX3B1cmVsaWIgPSBOb25lICAjIGZvciBwdXJlIG1vZHVsZSBkaXN0cmlidXRpb25zCiAgICAgICAgc2VsZi5pbnN0YWxsX3BsYXRsaWIgPSBOb25lICAjIG5vbi1wdXJlIChkaXN0cyB3LyBleHRlbnNpb25zKQogICAgICAgIHNlbGYuaW5zdGFsbF9oZWFkZXJzID0gTm9uZSAgIyBmb3IgQy9DKysgaGVhZGVycwogICAgICAgIHNlbGYuaW5zdGFsbF9saWIgPSBOb25lICAjIHNldCB0byBlaXRoZXIgcHVyZWxpYiBvciBwbGF0bGliCiAgICAgICAgc2VsZi5pbnN0YWxsX3NjcmlwdHMgPSBOb25lCiAgICAgICAgc2VsZi5pbnN0YWxsX2RhdGEgPSBOb25lCiAgICAgICAgc2VsZi5pbnN0YWxsX2Jhc2UgPSBOb25lCiAgICAgICAgc2VsZi5pbnN0YWxsX3BsYXRiYXNlID0gTm9uZQogICAgICAgIGlmIHNpdGUuRU5BQkxFX1VTRVJfU0lURToKICAgICAgICAgICAgc2VsZi5pbnN0YWxsX3VzZXJiYXNlID0gc2l0ZS5VU0VSX0JBU0UKICAgICAgICAgICAgc2VsZi5pbnN0YWxsX3VzZXJzaXRlID0gc2l0ZS5VU0VSX1NJVEUKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmluc3RhbGxfdXNlcmJhc2UgPSBOb25lCiAgICAgICAgICAgIHNlbGYuaW5zdGFsbF91c2Vyc2l0ZSA9IE5vbmUKICAgICAgICBzZWxmLm5vX2ZpbmRfbGlua3MgPSBOb25lCgogICAgICAgICMgT3B0aW9ucyBub3Qgc3BlY2lmaWFibGUgdmlhIGNvbW1hbmQgbGluZQogICAgICAgIHNlbGYucGFja2FnZV9pbmRleCA9IE5vbmUKICAgICAgICBzZWxmLnB0aF9maWxlID0gc2VsZi5hbHdheXNfY29weV9mcm9tID0gTm9uZQogICAgICAgIHNlbGYuc2l0ZV9kaXJzID0gTm9uZQogICAgICAgIHNlbGYuaW5zdGFsbGVkX3Byb2plY3RzID0ge30KICAgICAgICBzZWxmLnNpdGVweV9pbnN0YWxsZWQgPSBGYWxzZQogICAgICAgICMgQWx3YXlzIHJlYWQgZWFzeV9pbnN0YWxsIG9wdGlvbnMsIGV2ZW4gaWYgd2UgYXJlIHN1YmNsYXNzZWQsIG9yIGhhdmUKICAgICAgICAjIGFuIGluZGVwZW5kZW50IGluc3RhbmNlIGNyZWF0ZWQuICBUaGlzIGVuc3VyZXMgdGhhdCBkZWZhdWx0cyB3aWxsCiAgICAgICAgIyBhbHdheXMgY29tZSBmcm9tIHRoZSBzdGFuZGFyZCBjb25maWd1cmF0aW9uIGZpbGUocyknICJlYXN5X2luc3RhbGwiCiAgICAgICAgIyBzZWN0aW9uLCBldmVuIGlmIHRoaXMgaXMgYSAiZGV2ZWxvcCIgb3IgImluc3RhbGwiIGNvbW1hbmQsIG9yIHNvbWUKICAgICAgICAjIG90aGVyIGVtYmVkZGluZy4KICAgICAgICBzZWxmLl9kcnlfcnVuID0gTm9uZQogICAgICAgIHNlbGYudmVyYm9zZSA9IHNlbGYuZGlzdHJpYnV0aW9uLnZlcmJvc2UKICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbi5fc2V0X2NvbW1hbmRfb3B0aW9ucygKICAgICAgICAgICAgc2VsZiwgc2VsZi5kaXN0cmlidXRpb24uZ2V0X29wdGlvbl9kaWN0KCdlYXN5X2luc3RhbGwnKQogICAgICAgICkKCiAgICBkZWYgZGVsZXRlX2Jsb2NrZXJzKHNlbGYsIGJsb2NrZXJzKToKICAgICAgICBleHRhbnRfYmxvY2tlcnMgPSAoCiAgICAgICAgICAgIGZpbGVuYW1lIGZvciBmaWxlbmFtZSBpbiBibG9ja2VycwogICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhmaWxlbmFtZSkgb3Igb3MucGF0aC5pc2xpbmsoZmlsZW5hbWUpCiAgICAgICAgKQogICAgICAgIGxpc3QobWFwKHNlbGYuX2RlbGV0ZV9wYXRoLCBleHRhbnRfYmxvY2tlcnMpKQoKICAgIGRlZiBfZGVsZXRlX3BhdGgoc2VsZiwgcGF0aCk6CiAgICAgICAgbG9nLmluZm8oIkRlbGV0aW5nICVzIiwgcGF0aCkKICAgICAgICBpZiBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBpc190cmVlID0gb3MucGF0aC5pc2RpcihwYXRoKSBhbmQgbm90IG9zLnBhdGguaXNsaW5rKHBhdGgpCiAgICAgICAgcmVtb3ZlciA9IHJtdHJlZSBpZiBpc190cmVlIGVsc2Ugb3MudW5saW5rCiAgICAgICAgcmVtb3ZlcihwYXRoKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfcmVuZGVyX3ZlcnNpb24oKToKICAgICAgICAiIiIKICAgICAgICBSZW5kZXIgdGhlIFNldHVwdG9vbHMgdmVyc2lvbiBhbmQgaW5zdGFsbGF0aW9uIGRldGFpbHMsIHRoZW4gZXhpdC4KICAgICAgICAiIiIKICAgICAgICB2ZXIgPSBzeXMudmVyc2lvbls6M10KICAgICAgICBkaXN0ID0gZ2V0X2Rpc3RyaWJ1dGlvbignc2V0dXB0b29scycpCiAgICAgICAgdG1wbCA9ICdzZXR1cHRvb2xzIHtkaXN0LnZlcnNpb259IGZyb20ge2Rpc3QubG9jYXRpb259IChQeXRob24ge3Zlcn0pJwogICAgICAgIHByaW50KHRtcGwuZm9ybWF0KCoqbG9jYWxzKCkpKQogICAgICAgIHJhaXNlIFN5c3RlbUV4aXQoKQoKICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIHNlbGYudmVyc2lvbiBhbmQgc2VsZi5fcmVuZGVyX3ZlcnNpb24oKQoKICAgICAgICBweV92ZXJzaW9uID0gc3lzLnZlcnNpb24uc3BsaXQoKVswXQogICAgICAgIHByZWZpeCwgZXhlY19wcmVmaXggPSBnZXRfY29uZmlnX3ZhcnMoJ3ByZWZpeCcsICdleGVjX3ByZWZpeCcpCgogICAgICAgIHNlbGYuY29uZmlnX3ZhcnMgPSB7CiAgICAgICAgICAgICdkaXN0X25hbWUnOiBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfbmFtZSgpLAogICAgICAgICAgICAnZGlzdF92ZXJzaW9uJzogc2VsZi5kaXN0cmlidXRpb24uZ2V0X3ZlcnNpb24oKSwKICAgICAgICAgICAgJ2Rpc3RfZnVsbG5hbWUnOiBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfZnVsbG5hbWUoKSwKICAgICAgICAgICAgJ3B5X3ZlcnNpb24nOiBweV92ZXJzaW9uLAogICAgICAgICAgICAncHlfdmVyc2lvbl9zaG9ydCc6IHB5X3ZlcnNpb25bMDozXSwKICAgICAgICAgICAgJ3B5X3ZlcnNpb25fbm9kb3QnOiBweV92ZXJzaW9uWzBdICsgcHlfdmVyc2lvblsyXSwKICAgICAgICAgICAgJ3N5c19wcmVmaXgnOiBwcmVmaXgsCiAgICAgICAgICAgICdwcmVmaXgnOiBwcmVmaXgsCiAgICAgICAgICAgICdzeXNfZXhlY19wcmVmaXgnOiBleGVjX3ByZWZpeCwKICAgICAgICAgICAgJ2V4ZWNfcHJlZml4JzogZXhlY19wcmVmaXgsCiAgICAgICAgICAgICMgT25seSBweXRob24gMy4yKyBoYXMgYWJpZmxhZ3MKICAgICAgICAgICAgJ2FiaWZsYWdzJzogZ2V0YXR0cihzeXMsICdhYmlmbGFncycsICcnKSwKICAgICAgICB9CgogICAgICAgIGlmIHNpdGUuRU5BQkxFX1VTRVJfU0lURToKICAgICAgICAgICAgc2VsZi5jb25maWdfdmFyc1sndXNlcmJhc2UnXSA9IHNlbGYuaW5zdGFsbF91c2VyYmFzZQogICAgICAgICAgICBzZWxmLmNvbmZpZ192YXJzWyd1c2Vyc2l0ZSddID0gc2VsZi5pbnN0YWxsX3VzZXJzaXRlCgogICAgICAgIHNlbGYuX2ZpeF9pbnN0YWxsX2Rpcl9mb3JfdXNlcl9zaXRlKCkKCiAgICAgICAgc2VsZi5leHBhbmRfYmFzZWRpcnMoKQogICAgICAgIHNlbGYuZXhwYW5kX2RpcnMoKQoKICAgICAgICBzZWxmLl9leHBhbmQoCiAgICAgICAgICAgICdpbnN0YWxsX2RpcicsICdzY3JpcHRfZGlyJywgJ2J1aWxkX2RpcmVjdG9yeScsCiAgICAgICAgICAgICdzaXRlX2RpcnMnLAogICAgICAgICkKICAgICAgICAjIElmIGEgbm9uLWRlZmF1bHQgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSB3YXMgc3BlY2lmaWVkLCBkZWZhdWx0IHRoZQogICAgICAgICMgc2NyaXB0IGRpcmVjdG9yeSB0byBtYXRjaCBpdC4KICAgICAgICBpZiBzZWxmLnNjcmlwdF9kaXIgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5zY3JpcHRfZGlyID0gc2VsZi5pbnN0YWxsX2RpcgoKICAgICAgICBpZiBzZWxmLm5vX2ZpbmRfbGlua3MgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5ub19maW5kX2xpbmtzID0gRmFsc2UKCiAgICAgICAgIyBMZXQgaW5zdGFsbF9kaXIgZ2V0IHNldCBieSBpbnN0YWxsX2xpYiBjb21tYW5kLCB3aGljaCBpbiB0dXJuCiAgICAgICAgIyBnZXRzIGl0cyBpbmZvIGZyb20gdGhlIGluc3RhbGwgY29tbWFuZCwgYW5kIHRha2VzIGludG8gYWNjb3VudAogICAgICAgICMgLS1wcmVmaXggYW5kIC0taG9tZSBhbmQgYWxsIHRoYXQgb3RoZXIgY3J1ZC4KICAgICAgICBzZWxmLnNldF91bmRlZmluZWRfb3B0aW9ucygKICAgICAgICAgICAgJ2luc3RhbGxfbGliJywgKCdpbnN0YWxsX2RpcicsICdpbnN0YWxsX2RpcicpCiAgICAgICAgKQogICAgICAgICMgTGlrZXdpc2UsIHNldCBkZWZhdWx0IHNjcmlwdF9kaXIgZnJvbSAnaW5zdGFsbF9zY3JpcHRzLmluc3RhbGxfZGlyJwogICAgICAgIHNlbGYuc2V0X3VuZGVmaW5lZF9vcHRpb25zKAogICAgICAgICAgICAnaW5zdGFsbF9zY3JpcHRzJywgKCdpbnN0YWxsX2RpcicsICdzY3JpcHRfZGlyJykKICAgICAgICApCgogICAgICAgIGlmIHNlbGYudXNlciBhbmQgc2VsZi5pbnN0YWxsX3B1cmVsaWI6CiAgICAgICAgICAgIHNlbGYuaW5zdGFsbF9kaXIgPSBzZWxmLmluc3RhbGxfcHVyZWxpYgogICAgICAgICAgICBzZWxmLnNjcmlwdF9kaXIgPSBzZWxmLmluc3RhbGxfc2NyaXB0cwogICAgICAgICMgZGVmYXVsdCAtLXJlY29yZCBmcm9tIHRoZSBpbnN0YWxsIGNvbW1hbmQKICAgICAgICBzZWxmLnNldF91bmRlZmluZWRfb3B0aW9ucygnaW5zdGFsbCcsICgncmVjb3JkJywgJ3JlY29yZCcpKQogICAgICAgICMgU2hvdWxkIHRoaXMgYmUgbW92ZWQgdG8gdGhlIGlmIHN0YXRlbWVudCBiZWxvdz8gSXQncyBub3QgdXNlZAogICAgICAgICMgZWxzZXdoZXJlCiAgICAgICAgbm9ybXBhdGggPSBtYXAobm9ybWFsaXplX3BhdGgsIHN5cy5wYXRoKQogICAgICAgIHNlbGYuYWxsX3NpdGVfZGlycyA9IGdldF9zaXRlX2RpcnMoKQogICAgICAgIGlmIHNlbGYuc2l0ZV9kaXJzIGlzIG5vdCBOb25lOgogICAgICAgICAgICBzaXRlX2RpcnMgPSBbCiAgICAgICAgICAgICAgICBvcy5wYXRoLmV4cGFuZHVzZXIocy5zdHJpcCgpKSBmb3IgcyBpbgogICAgICAgICAgICAgICAgc2VsZi5zaXRlX2RpcnMuc3BsaXQoJywnKQogICAgICAgICAgICBdCiAgICAgICAgICAgIGZvciBkIGluIHNpdGVfZGlyczoKICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGQpOgogICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCIlcyAoaW4gLS1zaXRlLWRpcnMpIGRvZXMgbm90IGV4aXN0IiwgZCkKICAgICAgICAgICAgICAgIGVsaWYgbm9ybWFsaXplX3BhdGgoZCkgbm90IGluIG5vcm1wYXRoOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBkICsgIiAoaW4gLS1zaXRlLWRpcnMpIGlzIG5vdCBvbiBzeXMucGF0aCIKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHNlbGYuYWxsX3NpdGVfZGlycy5hcHBlbmQobm9ybWFsaXplX3BhdGgoZCkpCiAgICAgICAgaWYgbm90IHNlbGYuZWRpdGFibGU6CiAgICAgICAgICAgIHNlbGYuY2hlY2tfc2l0ZV9kaXIoKQogICAgICAgIHNlbGYuaW5kZXhfdXJsID0gc2VsZi5pbmRleF91cmwgb3IgImh0dHBzOi8vcHlwaS5weXRob24ub3JnL3NpbXBsZSIKICAgICAgICBzZWxmLnNoYWRvd19wYXRoID0gc2VsZi5hbGxfc2l0ZV9kaXJzWzpdCiAgICAgICAgZm9yIHBhdGhfaXRlbSBpbiBzZWxmLmluc3RhbGxfZGlyLCBub3JtYWxpemVfcGF0aChzZWxmLnNjcmlwdF9kaXIpOgogICAgICAgICAgICBpZiBwYXRoX2l0ZW0gbm90IGluIHNlbGYuc2hhZG93X3BhdGg6CiAgICAgICAgICAgICAgICBzZWxmLnNoYWRvd19wYXRoLmluc2VydCgwLCBwYXRoX2l0ZW0pCgogICAgICAgIGlmIHNlbGYuYWxsb3dfaG9zdHMgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGhvc3RzID0gW3Muc3RyaXAoKSBmb3IgcyBpbiBzZWxmLmFsbG93X2hvc3RzLnNwbGl0KCcsJyldCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaG9zdHMgPSBbJyonXQogICAgICAgIGlmIHNlbGYucGFja2FnZV9pbmRleCBpcyBOb25lOgogICAgICAgICAgICBzZWxmLnBhY2thZ2VfaW5kZXggPSBzZWxmLmNyZWF0ZV9pbmRleCgKICAgICAgICAgICAgICAgIHNlbGYuaW5kZXhfdXJsLCBzZWFyY2hfcGF0aD1zZWxmLnNoYWRvd19wYXRoLCBob3N0cz1ob3N0cywKICAgICAgICAgICAgKQogICAgICAgIHNlbGYubG9jYWxfaW5kZXggPSBFbnZpcm9ubWVudChzZWxmLnNoYWRvd19wYXRoICsgc3lzLnBhdGgpCgogICAgICAgIGlmIHNlbGYuZmluZF9saW5rcyBpcyBub3QgTm9uZToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLmZpbmRfbGlua3MsIHNpeC5zdHJpbmdfdHlwZXMpOgogICAgICAgICAgICAgICAgc2VsZi5maW5kX2xpbmtzID0gc2VsZi5maW5kX2xpbmtzLnNwbGl0KCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmZpbmRfbGlua3MgPSBbXQogICAgICAgIGlmIHNlbGYubG9jYWxfc25hcHNob3RzX29rOgogICAgICAgICAgICBzZWxmLnBhY2thZ2VfaW5kZXguc2Nhbl9lZ2dfbGlua3Moc2VsZi5zaGFkb3dfcGF0aCArIHN5cy5wYXRoKQogICAgICAgIGlmIG5vdCBzZWxmLm5vX2ZpbmRfbGlua3M6CiAgICAgICAgICAgIHNlbGYucGFja2FnZV9pbmRleC5hZGRfZmluZF9saW5rcyhzZWxmLmZpbmRfbGlua3MpCiAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoJ2luc3RhbGxfbGliJywgKCdvcHRpbWl6ZScsICdvcHRpbWl6ZScpKQogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHNlbGYub3B0aW1pemUsIGludCk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHNlbGYub3B0aW1pemUgPSBpbnQoc2VsZi5vcHRpbWl6ZSkKICAgICAgICAgICAgICAgIGlmIG5vdCAoMCA8PSBzZWxmLm9wdGltaXplIDw9IDIpOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IKICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigiLS1vcHRpbWl6ZSBtdXN0IGJlIDAsIDEsIG9yIDIiKQoKICAgICAgICBpZiBzZWxmLmVkaXRhYmxlIGFuZCBub3Qgc2VsZi5idWlsZF9kaXJlY3Rvcnk6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0FyZ0Vycm9yKAogICAgICAgICAgICAgICAgIk11c3Qgc3BlY2lmeSBhIGJ1aWxkIGRpcmVjdG9yeSAoLWIpIHdoZW4gdXNpbmcgLS1lZGl0YWJsZSIKICAgICAgICAgICAgKQogICAgICAgIGlmIG5vdCBzZWxmLmFyZ3M6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0FyZ0Vycm9yKAogICAgICAgICAgICAgICAgIk5vIHVybHMsIGZpbGVuYW1lcywgb3IgcmVxdWlyZW1lbnRzIHNwZWNpZmllZCAoc2VlIC0taGVscCkiKQoKICAgICAgICBzZWxmLm91dHB1dHMgPSBbXQoKICAgIGRlZiBfZml4X2luc3RhbGxfZGlyX2Zvcl91c2VyX3NpdGUoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgRml4IHRoZSBpbnN0YWxsX2RpciBpZiAiLS11c2VyIiB3YXMgdXNlZC4KICAgICAgICAiIiIKICAgICAgICBpZiBub3Qgc2VsZi51c2VyIG9yIG5vdCBzaXRlLkVOQUJMRV9VU0VSX1NJVEU6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBzZWxmLmNyZWF0ZV9ob21lX3BhdGgoKQogICAgICAgIGlmIHNlbGYuaW5zdGFsbF91c2VyYmFzZSBpcyBOb25lOgogICAgICAgICAgICBtc2cgPSAiVXNlciBiYXNlIGRpcmVjdG9yeSBpcyBub3Qgc3BlY2lmaWVkIgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yKG1zZykKICAgICAgICBzZWxmLmluc3RhbGxfYmFzZSA9IHNlbGYuaW5zdGFsbF9wbGF0YmFzZSA9IHNlbGYuaW5zdGFsbF91c2VyYmFzZQogICAgICAgIHNjaGVtZV9uYW1lID0gb3MubmFtZS5yZXBsYWNlKCdwb3NpeCcsICd1bml4JykgKyAnX3VzZXInCiAgICAgICAgc2VsZi5zZWxlY3Rfc2NoZW1lKHNjaGVtZV9uYW1lKQoKICAgIGRlZiBfZXhwYW5kX2F0dHJzKHNlbGYsIGF0dHJzKToKICAgICAgICBmb3IgYXR0ciBpbiBhdHRyczoKICAgICAgICAgICAgdmFsID0gZ2V0YXR0cihzZWxmLCBhdHRyKQogICAgICAgICAgICBpZiB2YWwgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICBpZiBvcy5uYW1lID09ICdwb3NpeCcgb3Igb3MubmFtZSA9PSAnbnQnOgogICAgICAgICAgICAgICAgICAgIHZhbCA9IG9zLnBhdGguZXhwYW5kdXNlcih2YWwpCiAgICAgICAgICAgICAgICB2YWwgPSBzdWJzdF92YXJzKHZhbCwgc2VsZi5jb25maWdfdmFycykKICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgYXR0ciwgdmFsKQoKICAgIGRlZiBleHBhbmRfYmFzZWRpcnMoc2VsZik6CiAgICAgICAgIiIiQ2FsbHMgYG9zLnBhdGguZXhwYW5kdXNlcmAgb24gaW5zdGFsbF9iYXNlLCBpbnN0YWxsX3BsYXRiYXNlIGFuZAogICAgICAgIHJvb3QuIiIiCiAgICAgICAgc2VsZi5fZXhwYW5kX2F0dHJzKFsnaW5zdGFsbF9iYXNlJywgJ2luc3RhbGxfcGxhdGJhc2UnLCAncm9vdCddKQoKICAgIGRlZiBleHBhbmRfZGlycyhzZWxmKToKICAgICAgICAiIiJDYWxscyBgb3MucGF0aC5leHBhbmR1c2VyYCBvbiBpbnN0YWxsIGRpcnMuIiIiCiAgICAgICAgZGlycyA9IFsKICAgICAgICAgICAgJ2luc3RhbGxfcHVyZWxpYicsCiAgICAgICAgICAgICdpbnN0YWxsX3BsYXRsaWInLAogICAgICAgICAgICAnaW5zdGFsbF9saWInLAogICAgICAgICAgICAnaW5zdGFsbF9oZWFkZXJzJywKICAgICAgICAgICAgJ2luc3RhbGxfc2NyaXB0cycsCiAgICAgICAgICAgICdpbnN0YWxsX2RhdGEnLAogICAgICAgIF0KICAgICAgICBzZWxmLl9leHBhbmRfYXR0cnMoZGlycykKCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgIGlmIHNlbGYudmVyYm9zZSAhPSBzZWxmLmRpc3RyaWJ1dGlvbi52ZXJib3NlOgogICAgICAgICAgICBsb2cuc2V0X3ZlcmJvc2l0eShzZWxmLnZlcmJvc2UpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBmb3Igc3BlYyBpbiBzZWxmLmFyZ3M6CiAgICAgICAgICAgICAgICBzZWxmLmVhc3lfaW5zdGFsbChzcGVjLCBub3Qgc2VsZi5ub19kZXBzKQogICAgICAgICAgICBpZiBzZWxmLnJlY29yZDoKICAgICAgICAgICAgICAgIG91dHB1dHMgPSBzZWxmLm91dHB1dHMKICAgICAgICAgICAgICAgIGlmIHNlbGYucm9vdDogICMgc3RyaXAgYW55IHBhY2thZ2UgcHJlZml4CiAgICAgICAgICAgICAgICAgICAgcm9vdF9sZW4gPSBsZW4oc2VsZi5yb290KQogICAgICAgICAgICAgICAgICAgIGZvciBjb3VudGVyIGluIHJhbmdlKGxlbihvdXRwdXRzKSk6CiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dHNbY291bnRlcl0gPSBvdXRwdXRzW2NvdW50ZXJdW3Jvb3RfbGVuOl0KICAgICAgICAgICAgICAgIGZyb20gZGlzdHV0aWxzIGltcG9ydCBmaWxlX3V0aWwKCiAgICAgICAgICAgICAgICBzZWxmLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAgICAgZmlsZV91dGlsLndyaXRlX2ZpbGUsIChzZWxmLnJlY29yZCwgb3V0cHV0cyksCiAgICAgICAgICAgICAgICAgICAgIndyaXRpbmcgbGlzdCBvZiBpbnN0YWxsZWQgZmlsZXMgdG8gJyVzJyIgJQogICAgICAgICAgICAgICAgICAgIHNlbGYucmVjb3JkCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHNlbGYud2Fybl9kZXByZWNhdGVkX29wdGlvbnMoKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGxvZy5zZXRfdmVyYm9zaXR5KHNlbGYuZGlzdHJpYnV0aW9uLnZlcmJvc2UpCgogICAgZGVmIHBzZXVkb190ZW1wbmFtZShzZWxmKToKICAgICAgICAiIiJSZXR1cm4gYSBwc2V1ZG8tdGVtcG5hbWUgYmFzZSBpbiB0aGUgaW5zdGFsbCBkaXJlY3RvcnkuCiAgICAgICAgVGhpcyBjb2RlIGlzIGludGVudGlvbmFsbHkgbmFpdmU7IGlmIGEgbWFsaWNpb3VzIHBhcnR5IGNhbiB3cml0ZSB0bwogICAgICAgIHRoZSB0YXJnZXQgZGlyZWN0b3J5IHlvdSdyZSBhbHJlYWR5IGluIGRlZXAgZG9vZG9vLgogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgcGlkID0gb3MuZ2V0cGlkKCkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBwaWQgPSByYW5kb20ucmFuZGludCgwLCBzeXMubWF4c2l6ZSkKICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKHNlbGYuaW5zdGFsbF9kaXIsICJ0ZXN0LWVhc3ktaW5zdGFsbC0lcyIgJSBwaWQpCgogICAgZGVmIHdhcm5fZGVwcmVjYXRlZF9vcHRpb25zKHNlbGYpOgogICAgICAgIHBhc3MKCiAgICBkZWYgY2hlY2tfc2l0ZV9kaXIoc2VsZik6CiAgICAgICAgIiIiVmVyaWZ5IHRoYXQgc2VsZi5pbnN0YWxsX2RpciBpcyAucHRoLWNhcGFibGUgZGlyLCBpZiBuZWVkZWQiIiIKCiAgICAgICAgaW5zdGRpciA9IG5vcm1hbGl6ZV9wYXRoKHNlbGYuaW5zdGFsbF9kaXIpCiAgICAgICAgcHRoX2ZpbGUgPSBvcy5wYXRoLmpvaW4oaW5zdGRpciwgJ2Vhc3ktaW5zdGFsbC5wdGgnKQoKICAgICAgICAjIElzIGl0IGEgY29uZmlndXJlZCwgUFlUSE9OUEFUSCwgaW1wbGljaXQsIG9yIGV4cGxpY2l0IHNpdGUgZGlyPwogICAgICAgIGlzX3NpdGVfZGlyID0gaW5zdGRpciBpbiBzZWxmLmFsbF9zaXRlX2RpcnMKCiAgICAgICAgaWYgbm90IGlzX3NpdGVfZGlyIGFuZCBub3Qgc2VsZi5tdWx0aV92ZXJzaW9uOgogICAgICAgICAgICAjIE5vPyAgVGhlbiBkaXJlY3RseSB0ZXN0IHdoZXRoZXIgaXQgZG9lcyAucHRoIGZpbGUgcHJvY2Vzc2luZwogICAgICAgICAgICBpc19zaXRlX2RpciA9IHNlbGYuY2hlY2tfcHRoX3Byb2Nlc3NpbmcoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgbWFrZSBzdXJlIHdlIGNhbiB3cml0ZSB0byB0YXJnZXQgZGlyCiAgICAgICAgICAgIHRlc3RmaWxlID0gc2VsZi5wc2V1ZG9fdGVtcG5hbWUoKSArICcud3JpdGUtdGVzdCcKICAgICAgICAgICAgdGVzdF9leGlzdHMgPSBvcy5wYXRoLmV4aXN0cyh0ZXN0ZmlsZSkKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaWYgdGVzdF9leGlzdHM6CiAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKHRlc3RmaWxlKQogICAgICAgICAgICAgICAgb3Blbih0ZXN0ZmlsZSwgJ3cnKS5jbG9zZSgpCiAgICAgICAgICAgICAgICBvcy51bmxpbmsodGVzdGZpbGUpCiAgICAgICAgICAgIGV4Y2VwdCAoT1NFcnJvciwgSU9FcnJvcik6CiAgICAgICAgICAgICAgICBzZWxmLmNhbnRfd3JpdGVfdG9fdGFyZ2V0KCkKCiAgICAgICAgaWYgbm90IGlzX3NpdGVfZGlyIGFuZCBub3Qgc2VsZi5tdWx0aV92ZXJzaW9uOgogICAgICAgICAgICAjIENhbid0IGluc3RhbGwgbm9uLW11bHRpIHRvIG5vbi1zaXRlIGRpcgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcihzZWxmLm5vX2RlZmF1bHRfdmVyc2lvbl9tc2coKSkKCiAgICAgICAgaWYgaXNfc2l0ZV9kaXI6CiAgICAgICAgICAgIGlmIHNlbGYucHRoX2ZpbGUgaXMgTm9uZToKICAgICAgICAgICAgICAgIHNlbGYucHRoX2ZpbGUgPSBQdGhEaXN0cmlidXRpb25zKHB0aF9maWxlLCBzZWxmLmFsbF9zaXRlX2RpcnMpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5wdGhfZmlsZSA9IE5vbmUKCiAgICAgICAgaWYgaW5zdGRpciBub3QgaW4gbWFwKG5vcm1hbGl6ZV9wYXRoLCBfcHl0aG9ucGF0aCgpKToKICAgICAgICAgICAgIyBvbmx5IFBZVEhPTlBBVEggZGlycyBuZWVkIGEgc2l0ZS5weSwgc28gcHJldGVuZCBpdCdzIHRoZXJlCiAgICAgICAgICAgIHNlbGYuc2l0ZXB5X2luc3RhbGxlZCA9IFRydWUKICAgICAgICBlbGlmIHNlbGYubXVsdGlfdmVyc2lvbiBhbmQgbm90IG9zLnBhdGguZXhpc3RzKHB0aF9maWxlKToKICAgICAgICAgICAgc2VsZi5zaXRlcHlfaW5zdGFsbGVkID0gVHJ1ZSAgIyBkb24ndCBuZWVkIHNpdGUucHkgaW4gdGhpcyBjYXNlCiAgICAgICAgICAgIHNlbGYucHRoX2ZpbGUgPSBOb25lICAjIGFuZCBkb24ndCBjcmVhdGUgYSAucHRoIGZpbGUKICAgICAgICBzZWxmLmluc3RhbGxfZGlyID0gaW5zdGRpcgoKICAgIF9fY2FudF93cml0ZV9tc2cgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiCiAgICAgICAgY2FuJ3QgY3JlYXRlIG9yIHJlbW92ZSBmaWxlcyBpbiBpbnN0YWxsIGRpcmVjdG9yeQoKICAgICAgICBUaGUgZm9sbG93aW5nIGVycm9yIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byBhZGQgb3IgcmVtb3ZlIGZpbGVzIGluIHRoZQogICAgICAgIGluc3RhbGxhdGlvbiBkaXJlY3Rvcnk6CgogICAgICAgICAgICAlcwoKICAgICAgICBUaGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSB5b3Ugc3BlY2lmaWVkICh2aWEgLS1pbnN0YWxsLWRpciwgLS1wcmVmaXgsIG9yCiAgICAgICAgdGhlIGRpc3R1dGlscyBkZWZhdWx0IHNldHRpbmcpIHdhczoKCiAgICAgICAgICAgICVzCiAgICAgICAgIiIiKS5sc3RyaXAoKQoKICAgIF9fbm90X2V4aXN0c19pZCA9IHRleHR3cmFwLmRlZGVudCgiIiIKICAgICAgICBUaGlzIGRpcmVjdG9yeSBkb2VzIG5vdCBjdXJyZW50bHkgZXhpc3QuICBQbGVhc2UgY3JlYXRlIGl0IGFuZCB0cnkgYWdhaW4sIG9yCiAgICAgICAgY2hvb3NlIGEgZGlmZmVyZW50IGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgKHVzaW5nIHRoZSAtZCBvciAtLWluc3RhbGwtZGlyCiAgICAgICAgb3B0aW9uKS4KICAgICAgICAiIiIpLmxzdHJpcCgpCgogICAgX19hY2Nlc3NfbXNnID0gdGV4dHdyYXAuZGVkZW50KCIiIgogICAgICAgIFBlcmhhcHMgeW91ciBhY2NvdW50IGRvZXMgbm90IGhhdmUgd3JpdGUgYWNjZXNzIHRvIHRoaXMgZGlyZWN0b3J5PyAgSWYgdGhlCiAgICAgICAgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBpcyBhIHN5c3RlbS1vd25lZCBkaXJlY3RvcnksIHlvdSBtYXkgbmVlZCB0byBzaWduIGluCiAgICAgICAgYXMgdGhlIGFkbWluaXN0cmF0b3Igb3IgInJvb3QiIGFjY291bnQuICBJZiB5b3UgZG8gbm90IGhhdmUgYWRtaW5pc3RyYXRpdmUKICAgICAgICBhY2Nlc3MgdG8gdGhpcyBtYWNoaW5lLCB5b3UgbWF5IHdpc2ggdG8gY2hvb3NlIGEgZGlmZmVyZW50IGluc3RhbGxhdGlvbgogICAgICAgIGRpcmVjdG9yeSwgcHJlZmVyYWJseSBvbmUgdGhhdCBpcyBsaXN0ZWQgaW4geW91ciBQWVRIT05QQVRIIGVudmlyb25tZW50CiAgICAgICAgdmFyaWFibGUuCgogICAgICAgIEZvciBpbmZvcm1hdGlvbiBvbiBvdGhlciBvcHRpb25zLCB5b3UgbWF5IHdpc2ggdG8gY29uc3VsdCB0aGUKICAgICAgICBkb2N1bWVudGF0aW9uIGF0OgoKICAgICAgICAgIGh0dHBzOi8vc2V0dXB0b29scy5yZWFkdGhlZG9jcy5pby9lbi9sYXRlc3QvZWFzeV9pbnN0YWxsLmh0bWwKCiAgICAgICAgUGxlYXNlIG1ha2UgdGhlIGFwcHJvcHJpYXRlIGNoYW5nZXMgZm9yIHlvdXIgc3lzdGVtIGFuZCB0cnkgYWdhaW4uCiAgICAgICAgIiIiKS5sc3RyaXAoKQoKICAgIGRlZiBjYW50X3dyaXRlX3RvX3RhcmdldChzZWxmKToKICAgICAgICBtc2cgPSBzZWxmLl9fY2FudF93cml0ZV9tc2cgJSAoc3lzLmV4Y19pbmZvKClbMV0sIHNlbGYuaW5zdGFsbF9kaXIsKQoKICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc2VsZi5pbnN0YWxsX2Rpcik6CiAgICAgICAgICAgIG1zZyArPSAnXG4nICsgc2VsZi5fX25vdF9leGlzdHNfaWQKICAgICAgICBlbHNlOgogICAgICAgICAgICBtc2cgKz0gJ1xuJyArIHNlbGYuX19hY2Nlc3NfbXNnCiAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IobXNnKQoKICAgIGRlZiBjaGVja19wdGhfcHJvY2Vzc2luZyhzZWxmKToKICAgICAgICAiIiJFbXBpcmljYWxseSB2ZXJpZnkgd2hldGhlciAucHRoIGZpbGVzIGFyZSBzdXBwb3J0ZWQgaW4gaW5zdC4gZGlyIiIiCiAgICAgICAgaW5zdGRpciA9IHNlbGYuaW5zdGFsbF9kaXIKICAgICAgICBsb2cuaW5mbygiQ2hlY2tpbmcgLnB0aCBmaWxlIHN1cHBvcnQgaW4gJXMiLCBpbnN0ZGlyKQogICAgICAgIHB0aF9maWxlID0gc2VsZi5wc2V1ZG9fdGVtcG5hbWUoKSArICIucHRoIgogICAgICAgIG9rX2ZpbGUgPSBwdGhfZmlsZSArICcub2snCiAgICAgICAgb2tfZXhpc3RzID0gb3MucGF0aC5leGlzdHMob2tfZmlsZSkKICAgICAgICB0bXBsID0gX29uZV9saW5lcigiIiIKICAgICAgICAgICAgaW1wb3J0IG9zCiAgICAgICAgICAgIGYgPSBvcGVuKHtva19maWxlIXJ9LCAndycpCiAgICAgICAgICAgIGYud3JpdGUoJ09LJykKICAgICAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgICAgICIiIikgKyAnXG4nCiAgICAgICAgdHJ5OgogICAgICAgICAgICBpZiBva19leGlzdHM6CiAgICAgICAgICAgICAgICBvcy51bmxpbmsob2tfZmlsZSkKICAgICAgICAgICAgZGlybmFtZSA9IG9zLnBhdGguZGlybmFtZShva19maWxlKQogICAgICAgICAgICBwa2dfcmVzb3VyY2VzLnB5MzFjb21wYXQubWFrZWRpcnMoZGlybmFtZSwgZXhpc3Rfb2s9VHJ1ZSkKICAgICAgICAgICAgZiA9IG9wZW4ocHRoX2ZpbGUsICd3JykKICAgICAgICBleGNlcHQgKE9TRXJyb3IsIElPRXJyb3IpOgogICAgICAgICAgICBzZWxmLmNhbnRfd3JpdGVfdG9fdGFyZ2V0KCkKICAgICAgICBlbHNlOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBmLndyaXRlKHRtcGwuZm9ybWF0KCoqbG9jYWxzKCkpKQogICAgICAgICAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgICAgICAgICBmID0gTm9uZQogICAgICAgICAgICAgICAgZXhlY3V0YWJsZSA9IHN5cy5leGVjdXRhYmxlCiAgICAgICAgICAgICAgICBpZiBvcy5uYW1lID09ICdudCc6CiAgICAgICAgICAgICAgICAgICAgZGlybmFtZSwgYmFzZW5hbWUgPSBvcy5wYXRoLnNwbGl0KGV4ZWN1dGFibGUpCiAgICAgICAgICAgICAgICAgICAgYWx0ID0gb3MucGF0aC5qb2luKGRpcm5hbWUsICdweXRob253LmV4ZScpCiAgICAgICAgICAgICAgICAgICAgdXNlX2FsdCA9ICgKICAgICAgICAgICAgICAgICAgICAgICAgYmFzZW5hbWUubG93ZXIoKSA9PSAncHl0aG9uLmV4ZScgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguZXhpc3RzKGFsdCkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgaWYgdXNlX2FsdDoKICAgICAgICAgICAgICAgICAgICAgICAgIyB1c2UgcHl0aG9udy5leGUgdG8gYXZvaWQgb3BlbmluZyBhIGNvbnNvbGUgd2luZG93CiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGFibGUgPSBhbHQKCiAgICAgICAgICAgICAgICBmcm9tIGRpc3R1dGlscy5zcGF3biBpbXBvcnQgc3Bhd24KCiAgICAgICAgICAgICAgICBzcGF3bihbZXhlY3V0YWJsZSwgJy1FJywgJy1jJywgJ3Bhc3MnXSwgMCkKCiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhva19maWxlKToKICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygKICAgICAgICAgICAgICAgICAgICAgICAgIlRFU1QgUEFTU0VEOiAlcyBhcHBlYXJzIHRvIHN1cHBvcnQgLnB0aCBmaWxlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgIGluc3RkaXIKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgIGlmIGY6CiAgICAgICAgICAgICAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhva19maWxlKToKICAgICAgICAgICAgICAgICAgICBvcy51bmxpbmsob2tfZmlsZSkKICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHB0aF9maWxlKToKICAgICAgICAgICAgICAgICAgICBvcy51bmxpbmsocHRoX2ZpbGUpCiAgICAgICAgaWYgbm90IHNlbGYubXVsdGlfdmVyc2lvbjoKICAgICAgICAgICAgbG9nLndhcm4oIlRFU1QgRkFJTEVEOiAlcyBkb2VzIE5PVCBzdXBwb3J0IC5wdGggZmlsZXMiLCBpbnN0ZGlyKQogICAgICAgIHJldHVybiBGYWxzZQoKICAgIGRlZiBpbnN0YWxsX2VnZ19zY3JpcHRzKHNlbGYsIGRpc3QpOgogICAgICAgICIiIldyaXRlIGFsbCB0aGUgc2NyaXB0cyBmb3IgYGRpc3RgLCB1bmxlc3Mgc2NyaXB0cyBhcmUgZXhjbHVkZWQiIiIKICAgICAgICBpZiBub3Qgc2VsZi5leGNsdWRlX3NjcmlwdHMgYW5kIGRpc3QubWV0YWRhdGFfaXNkaXIoJ3NjcmlwdHMnKToKICAgICAgICAgICAgZm9yIHNjcmlwdF9uYW1lIGluIGRpc3QubWV0YWRhdGFfbGlzdGRpcignc2NyaXB0cycpOgogICAgICAgICAgICAgICAgaWYgZGlzdC5tZXRhZGF0YV9pc2Rpcignc2NyaXB0cy8nICsgc2NyaXB0X25hbWUpOgogICAgICAgICAgICAgICAgICAgICMgVGhlICJzY3JpcHQiIGlzIGEgZGlyZWN0b3J5LCBsaWtlbHkgYSBQeXRob24gMwogICAgICAgICAgICAgICAgICAgICMgX19weWNhY2hlX18gZGlyZWN0b3J5LCBzbyBza2lwIGl0LgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBzZWxmLmluc3RhbGxfc2NyaXB0KAogICAgICAgICAgICAgICAgICAgIGRpc3QsIHNjcmlwdF9uYW1lLAogICAgICAgICAgICAgICAgICAgIGRpc3QuZ2V0X21ldGFkYXRhKCdzY3JpcHRzLycgKyBzY3JpcHRfbmFtZSkKICAgICAgICAgICAgICAgICkKICAgICAgICBzZWxmLmluc3RhbGxfd3JhcHBlcl9zY3JpcHRzKGRpc3QpCgogICAgZGVmIGFkZF9vdXRwdXQoc2VsZiwgcGF0aCk6CiAgICAgICAgaWYgb3MucGF0aC5pc2RpcihwYXRoKToKICAgICAgICAgICAgZm9yIGJhc2UsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsocGF0aCk6CiAgICAgICAgICAgICAgICBmb3IgZmlsZW5hbWUgaW4gZmlsZXM6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5vdXRwdXRzLmFwcGVuZChvcy5wYXRoLmpvaW4oYmFzZSwgZmlsZW5hbWUpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYub3V0cHV0cy5hcHBlbmQocGF0aCkKCiAgICBkZWYgbm90X2VkaXRhYmxlKHNlbGYsIHNwZWMpOgogICAgICAgIGlmIHNlbGYuZWRpdGFibGU6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0FyZ0Vycm9yKAogICAgICAgICAgICAgICAgIkludmFsaWQgYXJndW1lbnQgJXI6IHlvdSBjYW4ndCB1c2UgZmlsZW5hbWVzIG9yIFVSTHMgIgogICAgICAgICAgICAgICAgIndpdGggLS1lZGl0YWJsZSAoZXhjZXB0IHZpYSB0aGUgLS1maW5kLWxpbmtzIG9wdGlvbikuIgogICAgICAgICAgICAgICAgJSAoc3BlYywpCiAgICAgICAgICAgICkKCiAgICBkZWYgY2hlY2tfZWRpdGFibGUoc2VsZiwgc3BlYyk6CiAgICAgICAgaWYgbm90IHNlbGYuZWRpdGFibGU6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF9kaXJlY3RvcnksIHNwZWMua2V5KSk6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0FyZ0Vycm9yKAogICAgICAgICAgICAgICAgIiVyIGFscmVhZHkgZXhpc3RzIGluICVzOyBjYW4ndCBkbyBhIGNoZWNrb3V0IHRoZXJlIiAlCiAgICAgICAgICAgICAgICAoc3BlYy5rZXksIHNlbGYuYnVpbGRfZGlyZWN0b3J5KQogICAgICAgICAgICApCgogICAgQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKICAgIGRlZiBfdG1wZGlyKHNlbGYpOgogICAgICAgIHRtcGRpciA9IHRlbXBmaWxlLm1rZHRlbXAocHJlZml4PXNpeC51KCJlYXN5X2luc3RhbGwtIikpCiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIGNhc3QgdG8gc3RyIGFzIHdvcmthcm91bmQgZm9yICM3MDkgYW5kICM3MTAgYW5kICM3MTIKICAgICAgICAgICAgeWllbGQgc3RyKHRtcGRpcikKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBvcy5wYXRoLmV4aXN0cyh0bXBkaXIpIGFuZCBybXRyZWUocm10cmVlX3NhZmUodG1wZGlyKSkKCiAgICBkZWYgZWFzeV9pbnN0YWxsKHNlbGYsIHNwZWMsIGRlcHM9RmFsc2UpOgogICAgICAgIGlmIG5vdCBzZWxmLmVkaXRhYmxlOgogICAgICAgICAgICBzZWxmLmluc3RhbGxfc2l0ZV9weSgpCgogICAgICAgIHdpdGggc2VsZi5fdG1wZGlyKCkgYXMgdG1wZGlyOgogICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzcGVjLCBSZXF1aXJlbWVudCk6CiAgICAgICAgICAgICAgICBpZiBVUkxfU0NIRU1FKHNwZWMpOgogICAgICAgICAgICAgICAgICAgICMgSXQncyBhIHVybCwgZG93bmxvYWQgaXQgdG8gdG1wZGlyIGFuZCBwcm9jZXNzCiAgICAgICAgICAgICAgICAgICAgc2VsZi5ub3RfZWRpdGFibGUoc3BlYykKICAgICAgICAgICAgICAgICAgICBkbCA9IHNlbGYucGFja2FnZV9pbmRleC5kb3dubG9hZChzcGVjLCB0bXBkaXIpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuaW5zdGFsbF9pdGVtKE5vbmUsIGRsLCB0bXBkaXIsIGRlcHMsIFRydWUpCgogICAgICAgICAgICAgICAgZWxpZiBvcy5wYXRoLmV4aXN0cyhzcGVjKToKICAgICAgICAgICAgICAgICAgICAjIEV4aXN0aW5nIGZpbGUgb3IgZGlyZWN0b3J5LCBqdXN0IHByb2Nlc3MgaXQgZGlyZWN0bHkKICAgICAgICAgICAgICAgICAgICBzZWxmLm5vdF9lZGl0YWJsZShzcGVjKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmluc3RhbGxfaXRlbShOb25lLCBzcGVjLCB0bXBkaXIsIGRlcHMsIFRydWUpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIHNwZWMgPSBwYXJzZV9yZXF1aXJlbWVudF9hcmcoc3BlYykKCiAgICAgICAgICAgIHNlbGYuY2hlY2tfZWRpdGFibGUoc3BlYykKICAgICAgICAgICAgZGlzdCA9IHNlbGYucGFja2FnZV9pbmRleC5mZXRjaF9kaXN0cmlidXRpb24oCiAgICAgICAgICAgICAgICBzcGVjLCB0bXBkaXIsIHNlbGYudXBncmFkZSwgc2VsZi5lZGl0YWJsZSwKICAgICAgICAgICAgICAgIG5vdCBzZWxmLmFsd2F5c19jb3B5LCBzZWxmLmxvY2FsX2luZGV4CiAgICAgICAgICAgICkKICAgICAgICAgICAgaWYgZGlzdCBpcyBOb25lOgogICAgICAgICAgICAgICAgbXNnID0gIkNvdWxkIG5vdCBmaW5kIHN1aXRhYmxlIGRpc3RyaWJ1dGlvbiBmb3IgJXIiICUgc3BlYwogICAgICAgICAgICAgICAgaWYgc2VsZi5hbHdheXNfY29weToKICAgICAgICAgICAgICAgICAgICBtc2cgKz0gIiAoLS1hbHdheXMtY29weSBza2lwcyBzeXN0ZW0gYW5kIGRldmVsb3BtZW50IGVnZ3MpIgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IobXNnKQogICAgICAgICAgICBlbGlmIGRpc3QucHJlY2VkZW5jZSA9PSBERVZFTE9QX0RJU1Q6CiAgICAgICAgICAgICAgICAjIC5lZ2ctaW5mbyBkaXN0cyBkb24ndCBuZWVkIGluc3RhbGxpbmcsIGp1c3QgcHJvY2VzcyBkZXBzCiAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3NfZGlzdHJpYnV0aW9uKHNwZWMsIGRpc3QsIGRlcHMsICJVc2luZyIpCiAgICAgICAgICAgICAgICByZXR1cm4gZGlzdAogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuaW5zdGFsbF9pdGVtKHNwZWMsIGRpc3QubG9jYXRpb24sIHRtcGRpciwgZGVwcykKCiAgICBkZWYgaW5zdGFsbF9pdGVtKHNlbGYsIHNwZWMsIGRvd25sb2FkLCB0bXBkaXIsIGRlcHMsIGluc3RhbGxfbmVlZGVkPUZhbHNlKToKCiAgICAgICAgIyBJbnN0YWxsYXRpb24gaXMgYWxzbyBuZWVkZWQgaWYgZmlsZSBpbiB0bXBkaXIgb3IgaXMgbm90IGFuIGVnZwogICAgICAgIGluc3RhbGxfbmVlZGVkID0gaW5zdGFsbF9uZWVkZWQgb3Igc2VsZi5hbHdheXNfY29weQogICAgICAgIGluc3RhbGxfbmVlZGVkID0gaW5zdGFsbF9uZWVkZWQgb3Igb3MucGF0aC5kaXJuYW1lKGRvd25sb2FkKSA9PSB0bXBkaXIKICAgICAgICBpbnN0YWxsX25lZWRlZCA9IGluc3RhbGxfbmVlZGVkIG9yIG5vdCBkb3dubG9hZC5lbmRzd2l0aCgnLmVnZycpCiAgICAgICAgaW5zdGFsbF9uZWVkZWQgPSBpbnN0YWxsX25lZWRlZCBvciAoCiAgICAgICAgICAgIHNlbGYuYWx3YXlzX2NvcHlfZnJvbSBpcyBub3QgTm9uZSBhbmQKICAgICAgICAgICAgb3MucGF0aC5kaXJuYW1lKG5vcm1hbGl6ZV9wYXRoKGRvd25sb2FkKSkgPT0KICAgICAgICAgICAgbm9ybWFsaXplX3BhdGgoc2VsZi5hbHdheXNfY29weV9mcm9tKQogICAgICAgICkKCiAgICAgICAgaWYgc3BlYyBhbmQgbm90IGluc3RhbGxfbmVlZGVkOgogICAgICAgICAgICAjIGF0IHRoaXMgcG9pbnQsIHdlIGtub3cgaXQncyBhIGxvY2FsIC5lZ2csIHdlIGp1c3QgZG9uJ3Qga25vdyBpZgogICAgICAgICAgICAjIGl0J3MgYWxyZWFkeSBpbnN0YWxsZWQuCiAgICAgICAgICAgIGZvciBkaXN0IGluIHNlbGYubG9jYWxfaW5kZXhbc3BlYy5wcm9qZWN0X25hbWVdOgogICAgICAgICAgICAgICAgaWYgZGlzdC5sb2NhdGlvbiA9PSBkb3dubG9hZDoKICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaW5zdGFsbF9uZWVkZWQgPSBUcnVlICAjIGl0J3Mgbm90IGluIHRoZSBsb2NhbCBpbmRleAoKICAgICAgICBsb2cuaW5mbygiUHJvY2Vzc2luZyAlcyIsIG9zLnBhdGguYmFzZW5hbWUoZG93bmxvYWQpKQoKICAgICAgICBpZiBpbnN0YWxsX25lZWRlZDoKICAgICAgICAgICAgZGlzdHMgPSBzZWxmLmluc3RhbGxfZWdncyhzcGVjLCBkb3dubG9hZCwgdG1wZGlyKQogICAgICAgICAgICBmb3IgZGlzdCBpbiBkaXN0czoKICAgICAgICAgICAgICAgIHNlbGYucHJvY2Vzc19kaXN0cmlidXRpb24oc3BlYywgZGlzdCwgZGVwcykKICAgICAgICBlbHNlOgogICAgICAgICAgICBkaXN0cyA9IFtzZWxmLmVnZ19kaXN0cmlidXRpb24oZG93bmxvYWQpXQogICAgICAgICAgICBzZWxmLnByb2Nlc3NfZGlzdHJpYnV0aW9uKHNwZWMsIGRpc3RzWzBdLCBkZXBzLCAiVXNpbmciKQoKICAgICAgICBpZiBzcGVjIGlzIG5vdCBOb25lOgogICAgICAgICAgICBmb3IgZGlzdCBpbiBkaXN0czoKICAgICAgICAgICAgICAgIGlmIGRpc3QgaW4gc3BlYzoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGlzdAoKICAgIGRlZiBzZWxlY3Rfc2NoZW1lKHNlbGYsIG5hbWUpOgogICAgICAgICIiIlNldHMgdGhlIGluc3RhbGwgZGlyZWN0b3JpZXMgYnkgYXBwbHlpbmcgdGhlIGluc3RhbGwgc2NoZW1lcy4iIiIKICAgICAgICAjIGl0J3MgdGhlIGNhbGxlcidzIHByb2JsZW0gaWYgdGhleSBzdXBwbHkgYSBiYWQgbmFtZSEKICAgICAgICBzY2hlbWUgPSBJTlNUQUxMX1NDSEVNRVNbbmFtZV0KICAgICAgICBmb3Iga2V5IGluIFNDSEVNRV9LRVlTOgogICAgICAgICAgICBhdHRybmFtZSA9ICdpbnN0YWxsXycgKyBrZXkKICAgICAgICAgICAgaWYgZ2V0YXR0cihzZWxmLCBhdHRybmFtZSkgaXMgTm9uZToKICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgYXR0cm5hbWUsIHNjaGVtZVtrZXldKQoKICAgIGRlZiBwcm9jZXNzX2Rpc3RyaWJ1dGlvbihzZWxmLCByZXF1aXJlbWVudCwgZGlzdCwgZGVwcz1UcnVlLCAqaW5mbyk6CiAgICAgICAgc2VsZi51cGRhdGVfcHRoKGRpc3QpCiAgICAgICAgc2VsZi5wYWNrYWdlX2luZGV4LmFkZChkaXN0KQogICAgICAgIGlmIGRpc3QgaW4gc2VsZi5sb2NhbF9pbmRleFtkaXN0LmtleV06CiAgICAgICAgICAgIHNlbGYubG9jYWxfaW5kZXgucmVtb3ZlKGRpc3QpCiAgICAgICAgc2VsZi5sb2NhbF9pbmRleC5hZGQoZGlzdCkKICAgICAgICBzZWxmLmluc3RhbGxfZWdnX3NjcmlwdHMoZGlzdCkKICAgICAgICBzZWxmLmluc3RhbGxlZF9wcm9qZWN0c1tkaXN0LmtleV0gPSBkaXN0CiAgICAgICAgbG9nLmluZm8oc2VsZi5pbnN0YWxsYXRpb25fcmVwb3J0KHJlcXVpcmVtZW50LCBkaXN0LCAqaW5mbykpCiAgICAgICAgaWYgKGRpc3QuaGFzX21ldGFkYXRhKCdkZXBlbmRlbmN5X2xpbmtzLnR4dCcpIGFuZAogICAgICAgICAgICAgICAgbm90IHNlbGYubm9fZmluZF9saW5rcyk6CiAgICAgICAgICAgIHNlbGYucGFja2FnZV9pbmRleC5hZGRfZmluZF9saW5rcygKICAgICAgICAgICAgICAgIGRpc3QuZ2V0X21ldGFkYXRhX2xpbmVzKCdkZXBlbmRlbmN5X2xpbmtzLnR4dCcpCiAgICAgICAgICAgICkKICAgICAgICBpZiBub3QgZGVwcyBhbmQgbm90IHNlbGYuYWx3YXlzX2NvcHk6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGVsaWYgcmVxdWlyZW1lbnQgaXMgbm90IE5vbmUgYW5kIGRpc3Qua2V5ICE9IHJlcXVpcmVtZW50LmtleToKICAgICAgICAgICAgbG9nLndhcm4oIlNraXBwaW5nIGRlcGVuZGVuY2llcyBmb3IgJXMiLCBkaXN0KQogICAgICAgICAgICByZXR1cm4gICMgWFhYIHRoaXMgaXMgbm90IHRoZSBkaXN0cmlidXRpb24gd2Ugd2VyZSBsb29raW5nIGZvcgogICAgICAgIGVsaWYgcmVxdWlyZW1lbnQgaXMgTm9uZSBvciBkaXN0IG5vdCBpbiByZXF1aXJlbWVudDoKICAgICAgICAgICAgIyBpZiB3ZSB3b3VuZCB1cCB3aXRoIGEgZGlmZmVyZW50IHZlcnNpb24sIHJlc29sdmUgd2hhdCB3ZSd2ZSBnb3QKICAgICAgICAgICAgZGlzdHJlcSA9IGRpc3QuYXNfcmVxdWlyZW1lbnQoKQogICAgICAgICAgICByZXF1aXJlbWVudCA9IFJlcXVpcmVtZW50KHN0cihkaXN0cmVxKSkKICAgICAgICBsb2cuaW5mbygiUHJvY2Vzc2luZyBkZXBlbmRlbmNpZXMgZm9yICVzIiwgcmVxdWlyZW1lbnQpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBkaXN0cm9zID0gV29ya2luZ1NldChbXSkucmVzb2x2ZSgKICAgICAgICAgICAgICAgIFtyZXF1aXJlbWVudF0sIHNlbGYubG9jYWxfaW5kZXgsIHNlbGYuZWFzeV9pbnN0YWxsCiAgICAgICAgICAgICkKICAgICAgICBleGNlcHQgRGlzdHJpYnV0aW9uTm90Rm91bmQgYXMgZToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3Ioc3RyKGUpKQogICAgICAgIGV4Y2VwdCBWZXJzaW9uQ29uZmxpY3QgYXMgZToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoZS5yZXBvcnQoKSkKICAgICAgICBpZiBzZWxmLmFsd2F5c19jb3B5IG9yIHNlbGYuYWx3YXlzX2NvcHlfZnJvbToKICAgICAgICAgICAgIyBGb3JjZSBhbGwgdGhlIHJlbGV2YW50IGRpc3Ryb3MgdG8gYmUgY29waWVkIG9yIGFjdGl2YXRlZAogICAgICAgICAgICBmb3IgZGlzdCBpbiBkaXN0cm9zOgogICAgICAgICAgICAgICAgaWYgZGlzdC5rZXkgbm90IGluIHNlbGYuaW5zdGFsbGVkX3Byb2plY3RzOgogICAgICAgICAgICAgICAgICAgIHNlbGYuZWFzeV9pbnN0YWxsKGRpc3QuYXNfcmVxdWlyZW1lbnQoKSkKICAgICAgICBsb2cuaW5mbygiRmluaXNoZWQgcHJvY2Vzc2luZyBkZXBlbmRlbmNpZXMgZm9yICVzIiwgcmVxdWlyZW1lbnQpCgogICAgZGVmIHNob3VsZF91bnppcChzZWxmLCBkaXN0KToKICAgICAgICBpZiBzZWxmLnppcF9vayBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIG5vdCBzZWxmLnppcF9vawogICAgICAgIGlmIGRpc3QuaGFzX21ldGFkYXRhKCdub3QtemlwLXNhZmUnKToKICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICBpZiBub3QgZGlzdC5oYXNfbWV0YWRhdGEoJ3ppcC1zYWZlJyk6CiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgZGVmIG1heWJlX21vdmUoc2VsZiwgc3BlYywgZGlzdF9maWxlbmFtZSwgc2V0dXBfYmFzZSk6CiAgICAgICAgZHN0ID0gb3MucGF0aC5qb2luKHNlbGYuYnVpbGRfZGlyZWN0b3J5LCBzcGVjLmtleSkKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhkc3QpOgogICAgICAgICAgICBtc2cgPSAoCiAgICAgICAgICAgICAgICAiJXIgYWxyZWFkeSBleGlzdHMgaW4gJXM7IGJ1aWxkIGRpcmVjdG9yeSAlcyB3aWxsIG5vdCBiZSBrZXB0IgogICAgICAgICAgICApCiAgICAgICAgICAgIGxvZy53YXJuKG1zZywgc3BlYy5rZXksIHNlbGYuYnVpbGRfZGlyZWN0b3J5LCBzZXR1cF9iYXNlKQogICAgICAgICAgICByZXR1cm4gc2V0dXBfYmFzZQogICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZGlzdF9maWxlbmFtZSk6CiAgICAgICAgICAgIHNldHVwX2Jhc2UgPSBkaXN0X2ZpbGVuYW1lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgb3MucGF0aC5kaXJuYW1lKGRpc3RfZmlsZW5hbWUpID09IHNldHVwX2Jhc2U6CiAgICAgICAgICAgICAgICBvcy51bmxpbmsoZGlzdF9maWxlbmFtZSkgICMgZ2V0IGl0IG91dCBvZiB0aGUgdG1wIGRpcgogICAgICAgICAgICBjb250ZW50cyA9IG9zLmxpc3RkaXIoc2V0dXBfYmFzZSkKICAgICAgICAgICAgaWYgbGVuKGNvbnRlbnRzKSA9PSAxOgogICAgICAgICAgICAgICAgZGlzdF9maWxlbmFtZSA9IG9zLnBhdGguam9pbihzZXR1cF9iYXNlLCBjb250ZW50c1swXSkKICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZGlzdF9maWxlbmFtZSk6CiAgICAgICAgICAgICAgICAgICAgIyBpZiB0aGUgb25seSB0aGluZyB0aGVyZSBpcyBhIGRpcmVjdG9yeSwgbW92ZSBpdCBpbnN0ZWFkCiAgICAgICAgICAgICAgICAgICAgc2V0dXBfYmFzZSA9IGRpc3RfZmlsZW5hbWUKICAgICAgICBlbnN1cmVfZGlyZWN0b3J5KGRzdCkKICAgICAgICBzaHV0aWwubW92ZShzZXR1cF9iYXNlLCBkc3QpCiAgICAgICAgcmV0dXJuIGRzdAoKICAgIGRlZiBpbnN0YWxsX3dyYXBwZXJfc2NyaXB0cyhzZWxmLCBkaXN0KToKICAgICAgICBpZiBzZWxmLmV4Y2x1ZGVfc2NyaXB0czoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgZm9yIGFyZ3MgaW4gU2NyaXB0V3JpdGVyLmJlc3QoKS5nZXRfYXJncyhkaXN0KToKICAgICAgICAgICAgc2VsZi53cml0ZV9zY3JpcHQoKmFyZ3MpCgogICAgZGVmIGluc3RhbGxfc2NyaXB0KHNlbGYsIGRpc3QsIHNjcmlwdF9uYW1lLCBzY3JpcHRfdGV4dCwgZGV2X3BhdGg9Tm9uZSk6CiAgICAgICAgIiIiR2VuZXJhdGUgYSBsZWdhY3kgc2NyaXB0IHdyYXBwZXIgYW5kIGluc3RhbGwgaXQiIiIKICAgICAgICBzcGVjID0gc3RyKGRpc3QuYXNfcmVxdWlyZW1lbnQoKSkKICAgICAgICBpc19zY3JpcHQgPSBpc19weXRob25fc2NyaXB0KHNjcmlwdF90ZXh0LCBzY3JpcHRfbmFtZSkKCiAgICAgICAgaWYgaXNfc2NyaXB0OgogICAgICAgICAgICBib2R5ID0gc2VsZi5fbG9hZF90ZW1wbGF0ZShkZXZfcGF0aCkgJSBsb2NhbHMoKQogICAgICAgICAgICBzY3JpcHRfdGV4dCA9IFNjcmlwdFdyaXRlci5nZXRfaGVhZGVyKHNjcmlwdF90ZXh0KSArIGJvZHkKICAgICAgICBzZWxmLndyaXRlX3NjcmlwdChzY3JpcHRfbmFtZSwgX3RvX2FzY2lpKHNjcmlwdF90ZXh0KSwgJ2InKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfbG9hZF90ZW1wbGF0ZShkZXZfcGF0aCk6CiAgICAgICAgIiIiCiAgICAgICAgVGhlcmUgYXJlIGEgY291cGxlIG9mIHRlbXBsYXRlIHNjcmlwdHMgaW4gdGhlIHBhY2thZ2UuIFRoaXMKICAgICAgICBmdW5jdGlvbiBsb2FkcyBvbmUgb2YgdGhlbSBhbmQgcHJlcGFyZXMgaXQgZm9yIHVzZS4KICAgICAgICAiIiIKICAgICAgICAjIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcHlwYS9zZXR1cHRvb2xzL2lzc3Vlcy8xMzQgZm9yIGluZm8KICAgICAgICAjIG9uIHNjcmlwdCBmaWxlIG5hbWluZyBhbmQgZG93bnN0cmVhbSBpc3N1ZXMgd2l0aCBTVlI0CiAgICAgICAgbmFtZSA9ICdzY3JpcHQudG1wbCcKICAgICAgICBpZiBkZXZfcGF0aDoKICAgICAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgnLnRtcGwnLCAnIChkZXYpLnRtcGwnKQoKICAgICAgICByYXdfYnl0ZXMgPSByZXNvdXJjZV9zdHJpbmcoJ3NldHVwdG9vbHMnLCBuYW1lKQogICAgICAgIHJldHVybiByYXdfYnl0ZXMuZGVjb2RlKCd1dGYtOCcpCgogICAgZGVmIHdyaXRlX3NjcmlwdChzZWxmLCBzY3JpcHRfbmFtZSwgY29udGVudHMsIG1vZGU9InQiLCBibG9ja2Vycz0oKSk6CiAgICAgICAgIiIiV3JpdGUgYW4gZXhlY3V0YWJsZSBmaWxlIHRvIHRoZSBzY3JpcHRzIGRpcmVjdG9yeSIiIgogICAgICAgIHNlbGYuZGVsZXRlX2Jsb2NrZXJzKCAgIyBjbGVhbiB1cCBvbGQgLnB5Ly5weXcgdy9vIGEgc2NyaXB0CiAgICAgICAgICAgIFtvcy5wYXRoLmpvaW4oc2VsZi5zY3JpcHRfZGlyLCB4KSBmb3IgeCBpbiBibG9ja2Vyc10KICAgICAgICApCiAgICAgICAgbG9nLmluZm8oIkluc3RhbGxpbmcgJXMgc2NyaXB0IHRvICVzIiwgc2NyaXB0X25hbWUsIHNlbGYuc2NyaXB0X2RpcikKICAgICAgICB0YXJnZXQgPSBvcy5wYXRoLmpvaW4oc2VsZi5zY3JpcHRfZGlyLCBzY3JpcHRfbmFtZSkKICAgICAgICBzZWxmLmFkZF9vdXRwdXQodGFyZ2V0KQoKICAgICAgICBtYXNrID0gY3VycmVudF91bWFzaygpCiAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgZW5zdXJlX2RpcmVjdG9yeSh0YXJnZXQpCiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHRhcmdldCk6CiAgICAgICAgICAgICAgICBvcy51bmxpbmsodGFyZ2V0KQogICAgICAgICAgICB3aXRoIG9wZW4odGFyZ2V0LCAidyIgKyBtb2RlKSBhcyBmOgogICAgICAgICAgICAgICAgZi53cml0ZShjb250ZW50cykKICAgICAgICAgICAgY2htb2QodGFyZ2V0LCAwbzc3NyAtIG1hc2spCgogICAgZGVmIGluc3RhbGxfZWdncyhzZWxmLCBzcGVjLCBkaXN0X2ZpbGVuYW1lLCB0bXBkaXIpOgogICAgICAgICMgLmVnZyBkaXJzIG9yIGZpbGVzIGFyZSBhbHJlYWR5IGJ1aWx0LCBzbyBqdXN0IHJldHVybiB0aGVtCiAgICAgICAgaWYgZGlzdF9maWxlbmFtZS5sb3dlcigpLmVuZHN3aXRoKCcuZWdnJyk6CiAgICAgICAgICAgIHJldHVybiBbc2VsZi5pbnN0YWxsX2VnZyhkaXN0X2ZpbGVuYW1lLCB0bXBkaXIpXQogICAgICAgIGVsaWYgZGlzdF9maWxlbmFtZS5sb3dlcigpLmVuZHN3aXRoKCcuZXhlJyk6CiAgICAgICAgICAgIHJldHVybiBbc2VsZi5pbnN0YWxsX2V4ZShkaXN0X2ZpbGVuYW1lLCB0bXBkaXIpXQogICAgICAgIGVsaWYgZGlzdF9maWxlbmFtZS5sb3dlcigpLmVuZHN3aXRoKCcud2hsJyk6CiAgICAgICAgICAgIHJldHVybiBbc2VsZi5pbnN0YWxsX3doZWVsKGRpc3RfZmlsZW5hbWUsIHRtcGRpcildCgogICAgICAgICMgQW55dGhpbmcgZWxzZSwgdHJ5IHRvIGV4dHJhY3QgYW5kIGJ1aWxkCiAgICAgICAgc2V0dXBfYmFzZSA9IHRtcGRpcgogICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGRpc3RfZmlsZW5hbWUpIGFuZCBub3QgZGlzdF9maWxlbmFtZS5lbmRzd2l0aCgnLnB5Jyk6CiAgICAgICAgICAgIHVucGFja19hcmNoaXZlKGRpc3RfZmlsZW5hbWUsIHRtcGRpciwgc2VsZi51bnBhY2tfcHJvZ3Jlc3MpCiAgICAgICAgZWxpZiBvcy5wYXRoLmlzZGlyKGRpc3RfZmlsZW5hbWUpOgogICAgICAgICAgICBzZXR1cF9iYXNlID0gb3MucGF0aC5hYnNwYXRoKGRpc3RfZmlsZW5hbWUpCgogICAgICAgIGlmIChzZXR1cF9iYXNlLnN0YXJ0c3dpdGgodG1wZGlyKSAgIyBzb21ldGhpbmcgd2UgZG93bmxvYWRlZAogICAgICAgICAgICAgICAgYW5kIHNlbGYuYnVpbGRfZGlyZWN0b3J5IGFuZCBzcGVjIGlzIG5vdCBOb25lKToKICAgICAgICAgICAgc2V0dXBfYmFzZSA9IHNlbGYubWF5YmVfbW92ZShzcGVjLCBkaXN0X2ZpbGVuYW1lLCBzZXR1cF9iYXNlKQoKICAgICAgICAjIEZpbmQgdGhlIHNldHVwLnB5IGZpbGUKICAgICAgICBzZXR1cF9zY3JpcHQgPSBvcy5wYXRoLmpvaW4oc2V0dXBfYmFzZSwgJ3NldHVwLnB5JykKCiAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNldHVwX3NjcmlwdCk6CiAgICAgICAgICAgIHNldHVwcyA9IGdsb2Iob3MucGF0aC5qb2luKHNldHVwX2Jhc2UsICcqJywgJ3NldHVwLnB5JykpCiAgICAgICAgICAgIGlmIG5vdCBzZXR1cHM6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigKICAgICAgICAgICAgICAgICAgICAiQ291bGRuJ3QgZmluZCBhIHNldHVwIHNjcmlwdCBpbiAlcyIgJQogICAgICAgICAgICAgICAgICAgIG9zLnBhdGguYWJzcGF0aChkaXN0X2ZpbGVuYW1lKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICBpZiBsZW4oc2V0dXBzKSA+IDE6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigKICAgICAgICAgICAgICAgICAgICAiTXVsdGlwbGUgc2V0dXAgc2NyaXB0cyBpbiAlcyIgJQogICAgICAgICAgICAgICAgICAgIG9zLnBhdGguYWJzcGF0aChkaXN0X2ZpbGVuYW1lKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICBzZXR1cF9zY3JpcHQgPSBzZXR1cHNbMF0KCiAgICAgICAgIyBOb3cgcnVuIGl0LCBhbmQgcmV0dXJuIHRoZSByZXN1bHQKICAgICAgICBpZiBzZWxmLmVkaXRhYmxlOgogICAgICAgICAgICBsb2cuaW5mbyhzZWxmLnJlcG9ydF9lZGl0YWJsZShzcGVjLCBzZXR1cF9zY3JpcHQpKQogICAgICAgICAgICByZXR1cm4gW10KICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gc2VsZi5idWlsZF9hbmRfaW5zdGFsbChzZXR1cF9zY3JpcHQsIHNldHVwX2Jhc2UpCgogICAgZGVmIGVnZ19kaXN0cmlidXRpb24oc2VsZiwgZWdnX3BhdGgpOgogICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZWdnX3BhdGgpOgogICAgICAgICAgICBtZXRhZGF0YSA9IFBhdGhNZXRhZGF0YShlZ2dfcGF0aCwgb3MucGF0aC5qb2luKGVnZ19wYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFR0ctSU5GTycpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG1ldGFkYXRhID0gRWdnTWV0YWRhdGEoemlwaW1wb3J0LnppcGltcG9ydGVyKGVnZ19wYXRoKSkKICAgICAgICByZXR1cm4gRGlzdHJpYnV0aW9uLmZyb21fZmlsZW5hbWUoZWdnX3BhdGgsIG1ldGFkYXRhPW1ldGFkYXRhKQoKICAgIGRlZiBpbnN0YWxsX2VnZyhzZWxmLCBlZ2dfcGF0aCwgdG1wZGlyKToKICAgICAgICBkZXN0aW5hdGlvbiA9IG9zLnBhdGguam9pbigKICAgICAgICAgICAgc2VsZi5pbnN0YWxsX2RpciwKICAgICAgICAgICAgb3MucGF0aC5iYXNlbmFtZShlZ2dfcGF0aCksCiAgICAgICAgKQogICAgICAgIGRlc3RpbmF0aW9uID0gb3MucGF0aC5hYnNwYXRoKGRlc3RpbmF0aW9uKQogICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgIGVuc3VyZV9kaXJlY3RvcnkoZGVzdGluYXRpb24pCgogICAgICAgIGRpc3QgPSBzZWxmLmVnZ19kaXN0cmlidXRpb24oZWdnX3BhdGgpCiAgICAgICAgaWYgbm90IHNhbWVmaWxlKGVnZ19wYXRoLCBkZXN0aW5hdGlvbik6CiAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZGVzdGluYXRpb24pIGFuZCBub3Qgb3MucGF0aC5pc2xpbmsoZGVzdGluYXRpb24pOgogICAgICAgICAgICAgICAgZGlyX3V0aWwucmVtb3ZlX3RyZWUoZGVzdGluYXRpb24sIGRyeV9ydW49c2VsZi5kcnlfcnVuKQogICAgICAgICAgICBlbGlmIG9zLnBhdGguZXhpc3RzKGRlc3RpbmF0aW9uKToKICAgICAgICAgICAgICAgIHNlbGYuZXhlY3V0ZSgKICAgICAgICAgICAgICAgICAgICBvcy51bmxpbmssCiAgICAgICAgICAgICAgICAgICAgKGRlc3RpbmF0aW9uLCksCiAgICAgICAgICAgICAgICAgICAgIlJlbW92aW5nICIgKyBkZXN0aW5hdGlvbiwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgbmV3X2Rpc3RfaXNfemlwcGVkID0gRmFsc2UKICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZWdnX3BhdGgpOgogICAgICAgICAgICAgICAgICAgIGlmIGVnZ19wYXRoLnN0YXJ0c3dpdGgodG1wZGlyKToKICAgICAgICAgICAgICAgICAgICAgICAgZiwgbSA9IHNodXRpbC5tb3ZlLCAiTW92aW5nIgogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGYsIG0gPSBzaHV0aWwuY29weXRyZWUsICJDb3B5aW5nIgogICAgICAgICAgICAgICAgZWxpZiBzZWxmLnNob3VsZF91bnppcChkaXN0KToKICAgICAgICAgICAgICAgICAgICBzZWxmLm1rcGF0aChkZXN0aW5hdGlvbikKICAgICAgICAgICAgICAgICAgICBmLCBtID0gc2VsZi51bnBhY2tfYW5kX2NvbXBpbGUsICJFeHRyYWN0aW5nIgogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBuZXdfZGlzdF9pc196aXBwZWQgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgaWYgZWdnX3BhdGguc3RhcnRzd2l0aCh0bXBkaXIpOgogICAgICAgICAgICAgICAgICAgICAgICBmLCBtID0gc2h1dGlsLm1vdmUsICJNb3ZpbmciCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgZiwgbSA9IHNodXRpbC5jb3B5MiwgIkNvcHlpbmciCiAgICAgICAgICAgICAgICBzZWxmLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICAgICAgZiwKICAgICAgICAgICAgICAgICAgICAoZWdnX3BhdGgsIGRlc3RpbmF0aW9uKSwKICAgICAgICAgICAgICAgICAgICAobSArICIgJXMgdG8gJXMiKSAlICgKICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5iYXNlbmFtZShlZ2dfcGF0aCksCiAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguZGlybmFtZShkZXN0aW5hdGlvbikKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgdXBkYXRlX2Rpc3RfY2FjaGVzKAogICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uLAogICAgICAgICAgICAgICAgICAgIGZpeF96aXBpbXBvcnRlcl9jYWNoZXM9bmV3X2Rpc3RfaXNfemlwcGVkLAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgdXBkYXRlX2Rpc3RfY2FjaGVzKGRlc3RpbmF0aW9uLCBmaXhfemlwaW1wb3J0ZXJfY2FjaGVzPUZhbHNlKQogICAgICAgICAgICAgICAgcmFpc2UKCiAgICAgICAgc2VsZi5hZGRfb3V0cHV0KGRlc3RpbmF0aW9uKQogICAgICAgIHJldHVybiBzZWxmLmVnZ19kaXN0cmlidXRpb24oZGVzdGluYXRpb24pCgogICAgZGVmIGluc3RhbGxfZXhlKHNlbGYsIGRpc3RfZmlsZW5hbWUsIHRtcGRpcik6CiAgICAgICAgIyBTZWUgaWYgaXQncyB2YWxpZCwgZ2V0IGRhdGEKICAgICAgICBjZmcgPSBleHRyYWN0X3dpbmluc3RfY2ZnKGRpc3RfZmlsZW5hbWUpCiAgICAgICAgaWYgY2ZnIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKAogICAgICAgICAgICAgICAgIiVzIGlzIG5vdCBhIHZhbGlkIGRpc3R1dGlscyBXaW5kb3dzIC5leGUiICUgZGlzdF9maWxlbmFtZQogICAgICAgICAgICApCiAgICAgICAgIyBDcmVhdGUgYSBkdW1teSBkaXN0cmlidXRpb24gb2JqZWN0IHVudGlsIHdlIGJ1aWxkIHRoZSByZWFsIGRpc3RybwogICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oCiAgICAgICAgICAgIE5vbmUsCiAgICAgICAgICAgIHByb2plY3RfbmFtZT1jZmcuZ2V0KCdtZXRhZGF0YScsICduYW1lJyksCiAgICAgICAgICAgIHZlcnNpb249Y2ZnLmdldCgnbWV0YWRhdGEnLCAndmVyc2lvbicpLCBwbGF0Zm9ybT1nZXRfcGxhdGZvcm0oKSwKICAgICAgICApCgogICAgICAgICMgQ29udmVydCB0aGUgLmV4ZSB0byBhbiB1bnBhY2tlZCBlZ2cKICAgICAgICBlZ2dfcGF0aCA9IG9zLnBhdGguam9pbih0bXBkaXIsIGRpc3QuZWdnX25hbWUoKSArICcuZWdnJykKICAgICAgICBkaXN0LmxvY2F0aW9uID0gZWdnX3BhdGgKICAgICAgICBlZ2dfdG1wID0gZWdnX3BhdGggKyAnLnRtcCcKICAgICAgICBfZWdnX2luZm8gPSBvcy5wYXRoLmpvaW4oZWdnX3RtcCwgJ0VHRy1JTkZPJykKICAgICAgICBwa2dfaW5mID0gb3MucGF0aC5qb2luKF9lZ2dfaW5mbywgJ1BLRy1JTkZPJykKICAgICAgICBlbnN1cmVfZGlyZWN0b3J5KHBrZ19pbmYpICAjIG1ha2Ugc3VyZSBFR0ctSU5GTyBkaXIgZXhpc3RzCiAgICAgICAgZGlzdC5fcHJvdmlkZXIgPSBQYXRoTWV0YWRhdGEoZWdnX3RtcCwgX2VnZ19pbmZvKSAgIyBYWFgKICAgICAgICBzZWxmLmV4ZV90b19lZ2coZGlzdF9maWxlbmFtZSwgZWdnX3RtcCkKCiAgICAgICAgIyBXcml0ZSBFR0ctSU5GTy9QS0ctSU5GTwogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhwa2dfaW5mKToKICAgICAgICAgICAgZiA9IG9wZW4ocGtnX2luZiwgJ3cnKQogICAgICAgICAgICBmLndyaXRlKCdNZXRhZGF0YS1WZXJzaW9uOiAxLjBcbicpCiAgICAgICAgICAgIGZvciBrLCB2IGluIGNmZy5pdGVtcygnbWV0YWRhdGEnKToKICAgICAgICAgICAgICAgIGlmIGsgIT0gJ3RhcmdldF92ZXJzaW9uJzoKICAgICAgICAgICAgICAgICAgICBmLndyaXRlKCclczogJXNcbicgJSAoay5yZXBsYWNlKCdfJywgJy0nKS50aXRsZSgpLCB2KSkKICAgICAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgc2NyaXB0X2RpciA9IG9zLnBhdGguam9pbihfZWdnX2luZm8sICdzY3JpcHRzJykKICAgICAgICAjIGRlbGV0ZSBlbnRyeS1wb2ludCBzY3JpcHRzIHRvIGF2b2lkIGR1cGluZwogICAgICAgIHNlbGYuZGVsZXRlX2Jsb2NrZXJzKFsKICAgICAgICAgICAgb3MucGF0aC5qb2luKHNjcmlwdF9kaXIsIGFyZ3NbMF0pCiAgICAgICAgICAgIGZvciBhcmdzIGluIFNjcmlwdFdyaXRlci5nZXRfYXJncyhkaXN0KQogICAgICAgIF0pCiAgICAgICAgIyBCdWlsZCAuZWdnIGZpbGUgZnJvbSB0bXBkaXIKICAgICAgICBiZGlzdF9lZ2cubWFrZV96aXBmaWxlKAogICAgICAgICAgICBlZ2dfcGF0aCwgZWdnX3RtcCwgdmVyYm9zZT1zZWxmLnZlcmJvc2UsIGRyeV9ydW49c2VsZi5kcnlfcnVuLAogICAgICAgICkKICAgICAgICAjIGluc3RhbGwgdGhlIC5lZ2cKICAgICAgICByZXR1cm4gc2VsZi5pbnN0YWxsX2VnZyhlZ2dfcGF0aCwgdG1wZGlyKQoKICAgIGRlZiBleGVfdG9fZWdnKHNlbGYsIGRpc3RfZmlsZW5hbWUsIGVnZ190bXApOgogICAgICAgICIiIkV4dHJhY3QgYSBiZGlzdF93aW5pbnN0IHRvIHRoZSBkaXJlY3RvcmllcyBhbiBlZ2cgd291bGQgdXNlIiIiCiAgICAgICAgIyBDaGVjayBmb3IgLnB0aCBmaWxlIGFuZCBzZXQgdXAgcHJlZml4IHRyYW5zbGF0aW9ucwogICAgICAgIHByZWZpeGVzID0gZ2V0X2V4ZV9wcmVmaXhlcyhkaXN0X2ZpbGVuYW1lKQogICAgICAgIHRvX2NvbXBpbGUgPSBbXQogICAgICAgIG5hdGl2ZV9saWJzID0gW10KICAgICAgICB0b3BfbGV2ZWwgPSB7fQoKICAgICAgICBkZWYgcHJvY2VzcyhzcmMsIGRzdCk6CiAgICAgICAgICAgIHMgPSBzcmMubG93ZXIoKQogICAgICAgICAgICBmb3Igb2xkLCBuZXcgaW4gcHJlZml4ZXM6CiAgICAgICAgICAgICAgICBpZiBzLnN0YXJ0c3dpdGgob2xkKToKICAgICAgICAgICAgICAgICAgICBzcmMgPSBuZXcgKyBzcmNbbGVuKG9sZCk6XQogICAgICAgICAgICAgICAgICAgIHBhcnRzID0gc3JjLnNwbGl0KCcvJykKICAgICAgICAgICAgICAgICAgICBkc3QgPSBvcy5wYXRoLmpvaW4oZWdnX3RtcCwgKnBhcnRzKQogICAgICAgICAgICAgICAgICAgIGRsID0gZHN0Lmxvd2VyKCkKICAgICAgICAgICAgICAgICAgICBpZiBkbC5lbmRzd2l0aCgnLnB5ZCcpIG9yIGRsLmVuZHN3aXRoKCcuZGxsJyk6CiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzWy0xXSA9IGJkaXN0X2VnZy5zdHJpcF9tb2R1bGUocGFydHNbLTFdKQogICAgICAgICAgICAgICAgICAgICAgICB0b3BfbGV2ZWxbb3MucGF0aC5zcGxpdGV4dChwYXJ0c1swXSlbMF1dID0gMQogICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfbGlicy5hcHBlbmQoc3JjKQogICAgICAgICAgICAgICAgICAgIGVsaWYgZGwuZW5kc3dpdGgoJy5weScpIGFuZCBvbGQgIT0gJ1NDUklQVFMvJzoKICAgICAgICAgICAgICAgICAgICAgICAgdG9wX2xldmVsW29zLnBhdGguc3BsaXRleHQocGFydHNbMF0pWzBdXSA9IDEKICAgICAgICAgICAgICAgICAgICAgICAgdG9fY29tcGlsZS5hcHBlbmQoZHN0KQogICAgICAgICAgICAgICAgICAgIHJldHVybiBkc3QKICAgICAgICAgICAgaWYgbm90IHNyYy5lbmRzd2l0aCgnLnB0aCcpOgogICAgICAgICAgICAgICAgbG9nLndhcm4oIldBUk5JTkc6IGNhbid0IHByb2Nlc3MgJXMiLCBzcmMpCiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgICMgZXh0cmFjdCwgdHJhY2tpbmcgLnB5ZC8uZGxsLT5uYXRpdmVfbGlicyBhbmQgLnB5IC0+IHRvX2NvbXBpbGUKICAgICAgICB1bnBhY2tfYXJjaGl2ZShkaXN0X2ZpbGVuYW1lLCBlZ2dfdG1wLCBwcm9jZXNzKQogICAgICAgIHN0dWJzID0gW10KICAgICAgICBmb3IgcmVzIGluIG5hdGl2ZV9saWJzOgogICAgICAgICAgICBpZiByZXMubG93ZXIoKS5lbmRzd2l0aCgnLnB5ZCcpOiAgIyBjcmVhdGUgc3R1YnMgZm9yIC5weWQncwogICAgICAgICAgICAgICAgcGFydHMgPSByZXMuc3BsaXQoJy8nKQogICAgICAgICAgICAgICAgcmVzb3VyY2UgPSBwYXJ0c1stMV0KICAgICAgICAgICAgICAgIHBhcnRzWy0xXSA9IGJkaXN0X2VnZy5zdHJpcF9tb2R1bGUocGFydHNbLTFdKSArICcucHknCiAgICAgICAgICAgICAgICBweWZpbGUgPSBvcy5wYXRoLmpvaW4oZWdnX3RtcCwgKnBhcnRzKQogICAgICAgICAgICAgICAgdG9fY29tcGlsZS5hcHBlbmQocHlmaWxlKQogICAgICAgICAgICAgICAgc3R1YnMuYXBwZW5kKHB5ZmlsZSkKICAgICAgICAgICAgICAgIGJkaXN0X2VnZy53cml0ZV9zdHViKHJlc291cmNlLCBweWZpbGUpCiAgICAgICAgc2VsZi5ieXRlX2NvbXBpbGUodG9fY29tcGlsZSkgICMgY29tcGlsZSAucHkncwogICAgICAgIGJkaXN0X2VnZy53cml0ZV9zYWZldHlfZmxhZygKICAgICAgICAgICAgb3MucGF0aC5qb2luKGVnZ190bXAsICdFR0ctSU5GTycpLAogICAgICAgICAgICBiZGlzdF9lZ2cuYW5hbHl6ZV9lZ2coZWdnX3RtcCwgc3R1YnMpKSAgIyB3cml0ZSB6aXAtc2FmZXR5IGZsYWcKCiAgICAgICAgZm9yIG5hbWUgaW4gJ3RvcF9sZXZlbCcsICduYXRpdmVfbGlicyc6CiAgICAgICAgICAgIGlmIGxvY2FscygpW25hbWVdOgogICAgICAgICAgICAgICAgdHh0ID0gb3MucGF0aC5qb2luKGVnZ190bXAsICdFR0ctSU5GTycsIG5hbWUgKyAnLnR4dCcpCiAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHModHh0KToKICAgICAgICAgICAgICAgICAgICBmID0gb3Blbih0eHQsICd3JykKICAgICAgICAgICAgICAgICAgICBmLndyaXRlKCdcbicuam9pbihsb2NhbHMoKVtuYW1lXSkgKyAnXG4nKQogICAgICAgICAgICAgICAgICAgIGYuY2xvc2UoKQoKICAgIGRlZiBpbnN0YWxsX3doZWVsKHNlbGYsIHdoZWVsX3BhdGgsIHRtcGRpcik6CiAgICAgICAgd2hlZWwgPSBXaGVlbCh3aGVlbF9wYXRoKQogICAgICAgIGFzc2VydCB3aGVlbC5pc19jb21wYXRpYmxlKCkKICAgICAgICBkZXN0aW5hdGlvbiA9IG9zLnBhdGguam9pbihzZWxmLmluc3RhbGxfZGlyLCB3aGVlbC5lZ2dfbmFtZSgpKQogICAgICAgIGRlc3RpbmF0aW9uID0gb3MucGF0aC5hYnNwYXRoKGRlc3RpbmF0aW9uKQogICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgIGVuc3VyZV9kaXJlY3RvcnkoZGVzdGluYXRpb24pCiAgICAgICAgaWYgb3MucGF0aC5pc2RpcihkZXN0aW5hdGlvbikgYW5kIG5vdCBvcy5wYXRoLmlzbGluayhkZXN0aW5hdGlvbik6CiAgICAgICAgICAgIGRpcl91dGlsLnJlbW92ZV90cmVlKGRlc3RpbmF0aW9uLCBkcnlfcnVuPXNlbGYuZHJ5X3J1bikKICAgICAgICBlbGlmIG9zLnBhdGguZXhpc3RzKGRlc3RpbmF0aW9uKToKICAgICAgICAgICAgc2VsZi5leGVjdXRlKAogICAgICAgICAgICAgICAgb3MudW5saW5rLAogICAgICAgICAgICAgICAgKGRlc3RpbmF0aW9uLCksCiAgICAgICAgICAgICAgICAiUmVtb3ZpbmcgIiArIGRlc3RpbmF0aW9uLAogICAgICAgICAgICApCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLmV4ZWN1dGUoCiAgICAgICAgICAgICAgICB3aGVlbC5pbnN0YWxsX2FzX2VnZywKICAgICAgICAgICAgICAgIChkZXN0aW5hdGlvbiwpLAogICAgICAgICAgICAgICAgKCJJbnN0YWxsaW5nICVzIHRvICVzIikgJSAoCiAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5iYXNlbmFtZSh3aGVlbF9wYXRoKSwKICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmRpcm5hbWUoZGVzdGluYXRpb24pCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgdXBkYXRlX2Rpc3RfY2FjaGVzKGRlc3RpbmF0aW9uLCBmaXhfemlwaW1wb3J0ZXJfY2FjaGVzPUZhbHNlKQogICAgICAgIHNlbGYuYWRkX291dHB1dChkZXN0aW5hdGlvbikKICAgICAgICByZXR1cm4gc2VsZi5lZ2dfZGlzdHJpYnV0aW9uKGRlc3RpbmF0aW9uKQoKICAgIF9fbXZfd2FybmluZyA9IHRleHR3cmFwLmRlZGVudCgiIiIKICAgICAgICBCZWNhdXNlIHRoaXMgZGlzdHJpYnV0aW9uIHdhcyBpbnN0YWxsZWQgLS1tdWx0aS12ZXJzaW9uLCBiZWZvcmUgeW91IGNhbgogICAgICAgIGltcG9ydCBtb2R1bGVzIGZyb20gdGhpcyBwYWNrYWdlIGluIGFuIGFwcGxpY2F0aW9uLCB5b3Ugd2lsbCBuZWVkIHRvCiAgICAgICAgJ2ltcG9ydCBwa2dfcmVzb3VyY2VzJyBhbmQgdGhlbiB1c2UgYSAncmVxdWlyZSgpJyBjYWxsIHNpbWlsYXIgdG8gb25lIG9mCiAgICAgICAgdGhlc2UgZXhhbXBsZXMsIGluIG9yZGVyIHRvIHNlbGVjdCB0aGUgZGVzaXJlZCB2ZXJzaW9uOgoKICAgICAgICAgICAgcGtnX3Jlc291cmNlcy5yZXF1aXJlKCIlKG5hbWUpcyIpICAjIGxhdGVzdCBpbnN0YWxsZWQgdmVyc2lvbgogICAgICAgICAgICBwa2dfcmVzb3VyY2VzLnJlcXVpcmUoIiUobmFtZSlzPT0lKHZlcnNpb24pcyIpICAjIHRoaXMgZXhhY3QgdmVyc2lvbgogICAgICAgICAgICBwa2dfcmVzb3VyY2VzLnJlcXVpcmUoIiUobmFtZSlzPj0lKHZlcnNpb24pcyIpICAjIHRoaXMgdmVyc2lvbiBvciBoaWdoZXIKICAgICAgICAiIiIpLmxzdHJpcCgpCgogICAgX19pZF93YXJuaW5nID0gdGV4dHdyYXAuZGVkZW50KCIiIgogICAgICAgIE5vdGUgYWxzbyB0aGF0IHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IG11c3QgYmUgb24gc3lzLnBhdGggYXQgcnVudGltZSBmb3IKICAgICAgICB0aGlzIHRvIHdvcmsuICAoZS5nLiBieSBiZWluZyB0aGUgYXBwbGljYXRpb24ncyBzY3JpcHQgZGlyZWN0b3J5LCBieSBiZWluZyBvbgogICAgICAgIFBZVEhPTlBBVEgsIG9yIGJ5IGJlaW5nIGFkZGVkIHRvIHN5cy5wYXRoIGJ5IHlvdXIgY29kZS4pCiAgICAgICAgIiIiKQoKICAgIGRlZiBpbnN0YWxsYXRpb25fcmVwb3J0KHNlbGYsIHJlcSwgZGlzdCwgd2hhdD0iSW5zdGFsbGVkIik6CiAgICAgICAgIiIiSGVscGZ1bCBpbnN0YWxsYXRpb24gbWVzc2FnZSBmb3IgZGlzcGxheSB0byBwYWNrYWdlIHVzZXJzIiIiCiAgICAgICAgbXNnID0gIlxuJSh3aGF0KXMgJShlZ2dsb2MpcyUoZXh0cmFzKXMiCiAgICAgICAgaWYgc2VsZi5tdWx0aV92ZXJzaW9uIGFuZCBub3Qgc2VsZi5ub19yZXBvcnQ6CiAgICAgICAgICAgIG1zZyArPSAnXG4nICsgc2VsZi5fX212X3dhcm5pbmcKICAgICAgICAgICAgaWYgc2VsZi5pbnN0YWxsX2RpciBub3QgaW4gbWFwKG5vcm1hbGl6ZV9wYXRoLCBzeXMucGF0aCk6CiAgICAgICAgICAgICAgICBtc2cgKz0gJ1xuJyArIHNlbGYuX19pZF93YXJuaW5nCgogICAgICAgIGVnZ2xvYyA9IGRpc3QubG9jYXRpb24KICAgICAgICBuYW1lID0gZGlzdC5wcm9qZWN0X25hbWUKICAgICAgICB2ZXJzaW9uID0gZGlzdC52ZXJzaW9uCiAgICAgICAgZXh0cmFzID0gJycgICMgVE9ETzogc2VsZi5yZXBvcnRfZXh0cmFzKHJlcSwgZGlzdCkKICAgICAgICByZXR1cm4gbXNnICUgbG9jYWxzKCkKCiAgICBfX2VkaXRhYmxlX21zZyA9IHRleHR3cmFwLmRlZGVudCgiIiIKICAgICAgICBFeHRyYWN0ZWQgZWRpdGFibGUgdmVyc2lvbiBvZiAlKHNwZWMpcyB0byAlKGRpcm5hbWUpcwoKICAgICAgICBJZiBpdCB1c2VzIHNldHVwdG9vbHMgaW4gaXRzIHNldHVwIHNjcmlwdCwgeW91IGNhbiBhY3RpdmF0ZSBpdCBpbgogICAgICAgICJkZXZlbG9wbWVudCIgbW9kZSBieSBnb2luZyB0byB0aGF0IGRpcmVjdG9yeSBhbmQgcnVubmluZzo6CgogICAgICAgICAgICAlKHB5dGhvbilzIHNldHVwLnB5IGRldmVsb3AKCiAgICAgICAgU2VlIHRoZSBzZXR1cHRvb2xzIGRvY3VtZW50YXRpb24gZm9yIHRoZSAiZGV2ZWxvcCIgY29tbWFuZCBmb3IgbW9yZSBpbmZvLgogICAgICAgICIiIikubHN0cmlwKCkKCiAgICBkZWYgcmVwb3J0X2VkaXRhYmxlKHNlbGYsIHNwZWMsIHNldHVwX3NjcmlwdCk6CiAgICAgICAgZGlybmFtZSA9IG9zLnBhdGguZGlybmFtZShzZXR1cF9zY3JpcHQpCiAgICAgICAgcHl0aG9uID0gc3lzLmV4ZWN1dGFibGUKICAgICAgICByZXR1cm4gJ1xuJyArIHNlbGYuX19lZGl0YWJsZV9tc2cgJSBsb2NhbHMoKQoKICAgIGRlZiBydW5fc2V0dXAoc2VsZiwgc2V0dXBfc2NyaXB0LCBzZXR1cF9iYXNlLCBhcmdzKToKICAgICAgICBzeXMubW9kdWxlcy5zZXRkZWZhdWx0KCdkaXN0dXRpbHMuY29tbWFuZC5iZGlzdF9lZ2cnLCBiZGlzdF9lZ2cpCiAgICAgICAgc3lzLm1vZHVsZXMuc2V0ZGVmYXVsdCgnZGlzdHV0aWxzLmNvbW1hbmQuZWdnX2luZm8nLCBlZ2dfaW5mbykKCiAgICAgICAgYXJncyA9IGxpc3QoYXJncykKICAgICAgICBpZiBzZWxmLnZlcmJvc2UgPiAyOgogICAgICAgICAgICB2ID0gJ3YnICogKHNlbGYudmVyYm9zZSAtIDEpCiAgICAgICAgICAgIGFyZ3MuaW5zZXJ0KDAsICctJyArIHYpCiAgICAgICAgZWxpZiBzZWxmLnZlcmJvc2UgPCAyOgogICAgICAgICAgICBhcmdzLmluc2VydCgwLCAnLXEnKQogICAgICAgIGlmIHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgYXJncy5pbnNlcnQoMCwgJy1uJykKICAgICAgICBsb2cuaW5mbygKICAgICAgICAgICAgIlJ1bm5pbmcgJXMgJXMiLCBzZXR1cF9zY3JpcHRbbGVuKHNldHVwX2Jhc2UpICsgMTpdLCAnICcuam9pbihhcmdzKQogICAgICAgICkKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJ1bl9zZXR1cChzZXR1cF9zY3JpcHQsIGFyZ3MpCiAgICAgICAgZXhjZXB0IFN5c3RlbUV4aXQgYXMgdjoKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoIlNldHVwIHNjcmlwdCBleGl0ZWQgd2l0aCAlcyIgJSAodi5hcmdzWzBdLCkpCgogICAgZGVmIGJ1aWxkX2FuZF9pbnN0YWxsKHNlbGYsIHNldHVwX3NjcmlwdCwgc2V0dXBfYmFzZSk6CiAgICAgICAgYXJncyA9IFsnYmRpc3RfZWdnJywgJy0tZGlzdC1kaXInXQoKICAgICAgICBkaXN0X2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoCiAgICAgICAgICAgIHByZWZpeD0nZWdnLWRpc3QtdG1wLScsIGRpcj1vcy5wYXRoLmRpcm5hbWUoc2V0dXBfc2NyaXB0KQogICAgICAgICkKICAgICAgICB0cnk6CiAgICAgICAgICAgIHNlbGYuX3NldF9mZXRjaGVyX29wdGlvbnMob3MucGF0aC5kaXJuYW1lKHNldHVwX3NjcmlwdCkpCiAgICAgICAgICAgIGFyZ3MuYXBwZW5kKGRpc3RfZGlyKQoKICAgICAgICAgICAgc2VsZi5ydW5fc2V0dXAoc2V0dXBfc2NyaXB0LCBzZXR1cF9iYXNlLCBhcmdzKQogICAgICAgICAgICBhbGxfZWdncyA9IEVudmlyb25tZW50KFtkaXN0X2Rpcl0pCiAgICAgICAgICAgIGVnZ3MgPSBbXQogICAgICAgICAgICBmb3Iga2V5IGluIGFsbF9lZ2dzOgogICAgICAgICAgICAgICAgZm9yIGRpc3QgaW4gYWxsX2VnZ3Nba2V5XToKICAgICAgICAgICAgICAgICAgICBlZ2dzLmFwcGVuZChzZWxmLmluc3RhbGxfZWdnKGRpc3QubG9jYXRpb24sIHNldHVwX2Jhc2UpKQogICAgICAgICAgICBpZiBub3QgZWdncyBhbmQgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgICAgIGxvZy53YXJuKCJObyBlZ2dzIGZvdW5kIGluICVzIChzZXR1cCBzY3JpcHQgcHJvYmxlbT8pIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RfZGlyKQogICAgICAgICAgICByZXR1cm4gZWdncwogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIHJtdHJlZShkaXN0X2RpcikKICAgICAgICAgICAgbG9nLnNldF92ZXJib3NpdHkoc2VsZi52ZXJib3NlKSAgIyByZXN0b3JlIG91ciBsb2cgdmVyYm9zaXR5CgogICAgZGVmIF9zZXRfZmV0Y2hlcl9vcHRpb25zKHNlbGYsIGJhc2UpOgogICAgICAgICIiIgogICAgICAgIFdoZW4gZWFzeV9pbnN0YWxsIGlzIGFib3V0IHRvIHJ1biBiZGlzdF9lZ2cgb24gYSBzb3VyY2UgZGlzdCwgdGhhdAogICAgICAgIHNvdXJjZSBkaXN0IG1pZ2h0IGhhdmUgJ3NldHVwX3JlcXVpcmVzJyBkaXJlY3RpdmVzLCByZXF1aXJpbmcKICAgICAgICBhZGRpdGlvbmFsIGZldGNoaW5nLiBFbnN1cmUgdGhlIGZldGNoZXIgb3B0aW9ucyBnaXZlbiB0byBlYXN5X2luc3RhbGwKICAgICAgICBhcmUgYXZhaWxhYmxlIHRvIHRoYXQgY29tbWFuZCBhcyB3ZWxsLgogICAgICAgICIiIgogICAgICAgICMgZmluZCB0aGUgZmV0Y2ggb3B0aW9ucyBmcm9tIGVhc3lfaW5zdGFsbCBhbmQgd3JpdGUgdGhlbSBvdXQKICAgICAgICAjIHRvIHRoZSBzZXR1cC5jZmcgZmlsZS4KICAgICAgICBlaV9vcHRzID0gc2VsZi5kaXN0cmlidXRpb24uZ2V0X29wdGlvbl9kaWN0KCdlYXN5X2luc3RhbGwnKS5jb3B5KCkKICAgICAgICBmZXRjaF9kaXJlY3RpdmVzID0gKAogICAgICAgICAgICAnZmluZF9saW5rcycsICdzaXRlX2RpcnMnLCAnaW5kZXhfdXJsJywgJ29wdGltaXplJywKICAgICAgICAgICAgJ3NpdGVfZGlycycsICdhbGxvd19ob3N0cycsCiAgICAgICAgKQogICAgICAgIGZldGNoX29wdGlvbnMgPSB7fQogICAgICAgIGZvciBrZXksIHZhbCBpbiBlaV9vcHRzLml0ZW1zKCk6CiAgICAgICAgICAgIGlmIGtleSBub3QgaW4gZmV0Y2hfZGlyZWN0aXZlczoKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGZldGNoX29wdGlvbnNba2V5LnJlcGxhY2UoJ18nLCAnLScpXSA9IHZhbFsxXQogICAgICAgICMgY3JlYXRlIGEgc2V0dGluZ3MgZGljdGlvbmFyeSBzdWl0YWJsZSBmb3IgYGVkaXRfY29uZmlnYAogICAgICAgIHNldHRpbmdzID0gZGljdChlYXN5X2luc3RhbGw9ZmV0Y2hfb3B0aW9ucykKICAgICAgICBjZmdfZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oYmFzZSwgJ3NldHVwLmNmZycpCiAgICAgICAgc2V0b3B0LmVkaXRfY29uZmlnKGNmZ19maWxlbmFtZSwgc2V0dGluZ3MpCgogICAgZGVmIHVwZGF0ZV9wdGgoc2VsZiwgZGlzdCk6CiAgICAgICAgaWYgc2VsZi5wdGhfZmlsZSBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgZm9yIGQgaW4gc2VsZi5wdGhfZmlsZVtkaXN0LmtleV06ICAjIGRyb3Agb2xkIGVudHJpZXMKICAgICAgICAgICAgaWYgc2VsZi5tdWx0aV92ZXJzaW9uIG9yIGQubG9jYXRpb24gIT0gZGlzdC5sb2NhdGlvbjoKICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJSZW1vdmluZyAlcyBmcm9tIGVhc3ktaW5zdGFsbC5wdGggZmlsZSIsIGQpCiAgICAgICAgICAgICAgICBzZWxmLnB0aF9maWxlLnJlbW92ZShkKQogICAgICAgICAgICAgICAgaWYgZC5sb2NhdGlvbiBpbiBzZWxmLnNoYWRvd19wYXRoOgogICAgICAgICAgICAgICAgICAgIHNlbGYuc2hhZG93X3BhdGgucmVtb3ZlKGQubG9jYXRpb24pCgogICAgICAgIGlmIG5vdCBzZWxmLm11bHRpX3ZlcnNpb246CiAgICAgICAgICAgIGlmIGRpc3QubG9jYXRpb24gaW4gc2VsZi5wdGhfZmlsZS5wYXRoczoKICAgICAgICAgICAgICAgIGxvZy5pbmZvKAogICAgICAgICAgICAgICAgICAgICIlcyBpcyBhbHJlYWR5IHRoZSBhY3RpdmUgdmVyc2lvbiBpbiBlYXN5LWluc3RhbGwucHRoIiwKICAgICAgICAgICAgICAgICAgICBkaXN0LAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgbG9nLmluZm8oIkFkZGluZyAlcyB0byBlYXN5LWluc3RhbGwucHRoIGZpbGUiLCBkaXN0KQogICAgICAgICAgICAgICAgc2VsZi5wdGhfZmlsZS5hZGQoZGlzdCkgICMgYWRkIG5ldyBlbnRyeQogICAgICAgICAgICAgICAgaWYgZGlzdC5sb2NhdGlvbiBub3QgaW4gc2VsZi5zaGFkb3dfcGF0aDoKICAgICAgICAgICAgICAgICAgICBzZWxmLnNoYWRvd19wYXRoLmFwcGVuZChkaXN0LmxvY2F0aW9uKQoKICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgoKICAgICAgICAgICAgc2VsZi5wdGhfZmlsZS5zYXZlKCkKCiAgICAgICAgICAgIGlmIGRpc3Qua2V5ID09ICdzZXR1cHRvb2xzJzoKICAgICAgICAgICAgICAgICMgRW5zdXJlIHRoYXQgc2V0dXB0b29scyBpdHNlbGYgbmV2ZXIgYmVjb21lcyB1bmF2YWlsYWJsZSEKICAgICAgICAgICAgICAgICMgWFhYIHNob3VsZCB0aGlzIGNoZWNrIGZvciBsYXRlc3QgdmVyc2lvbj8KICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5qb2luKHNlbGYuaW5zdGFsbF9kaXIsICdzZXR1cHRvb2xzLnB0aCcpCiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzbGluayhmaWxlbmFtZSk6CiAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKGZpbGVuYW1lKQogICAgICAgICAgICAgICAgZiA9IG9wZW4oZmlsZW5hbWUsICd3dCcpCiAgICAgICAgICAgICAgICBmLndyaXRlKHNlbGYucHRoX2ZpbGUubWFrZV9yZWxhdGl2ZShkaXN0LmxvY2F0aW9uKSArICdcbicpCiAgICAgICAgICAgICAgICBmLmNsb3NlKCkKCiAgICBkZWYgdW5wYWNrX3Byb2dyZXNzKHNlbGYsIHNyYywgZHN0KToKICAgICAgICAjIFByb2dyZXNzIGZpbHRlciBmb3IgdW5wYWNraW5nCiAgICAgICAgbG9nLmRlYnVnKCJVbnBhY2tpbmcgJXMgdG8gJXMiLCBzcmMsIGRzdCkKICAgICAgICByZXR1cm4gZHN0ICAjIG9ubHkgdW5wYWNrLWFuZC1jb21waWxlIHNraXBzIGZpbGVzIGZvciBkcnkgcnVuCgogICAgZGVmIHVucGFja19hbmRfY29tcGlsZShzZWxmLCBlZ2dfcGF0aCwgZGVzdGluYXRpb24pOgogICAgICAgIHRvX2NvbXBpbGUgPSBbXQogICAgICAgIHRvX2NobW9kID0gW10KCiAgICAgICAgZGVmIHBmKHNyYywgZHN0KToKICAgICAgICAgICAgaWYgZHN0LmVuZHN3aXRoKCcucHknKSBhbmQgbm90IHNyYy5zdGFydHN3aXRoKCdFR0ctSU5GTy8nKToKICAgICAgICAgICAgICAgIHRvX2NvbXBpbGUuYXBwZW5kKGRzdCkKICAgICAgICAgICAgZWxpZiBkc3QuZW5kc3dpdGgoJy5kbGwnKSBvciBkc3QuZW5kc3dpdGgoJy5zbycpOgogICAgICAgICAgICAgICAgdG9fY2htb2QuYXBwZW5kKGRzdCkKICAgICAgICAgICAgc2VsZi51bnBhY2tfcHJvZ3Jlc3Moc3JjLCBkc3QpCiAgICAgICAgICAgIHJldHVybiBub3Qgc2VsZi5kcnlfcnVuIGFuZCBkc3Qgb3IgTm9uZQoKICAgICAgICB1bnBhY2tfYXJjaGl2ZShlZ2dfcGF0aCwgZGVzdGluYXRpb24sIHBmKQogICAgICAgIHNlbGYuYnl0ZV9jb21waWxlKHRvX2NvbXBpbGUpCiAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgZm9yIGYgaW4gdG9fY2htb2Q6CiAgICAgICAgICAgICAgICBtb2RlID0gKChvcy5zdGF0KGYpW3N0YXQuU1RfTU9ERV0pIHwgMG81NTUpICYgMG83NzU1CiAgICAgICAgICAgICAgICBjaG1vZChmLCBtb2RlKQoKICAgIGRlZiBieXRlX2NvbXBpbGUoc2VsZiwgdG9fY29tcGlsZSk6CiAgICAgICAgaWYgc3lzLmRvbnRfd3JpdGVfYnl0ZWNvZGU6CiAgICAgICAgICAgIHNlbGYud2FybignYnl0ZS1jb21waWxpbmcgaXMgZGlzYWJsZWQsIHNraXBwaW5nLicpCiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBieXRlX2NvbXBpbGUKCiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIHRyeSB0byBtYWtlIHRoZSBieXRlIGNvbXBpbGUgbWVzc2FnZXMgcXVpZXRlcgogICAgICAgICAgICBsb2cuc2V0X3ZlcmJvc2l0eShzZWxmLnZlcmJvc2UgLSAxKQoKICAgICAgICAgICAgYnl0ZV9jb21waWxlKHRvX2NvbXBpbGUsIG9wdGltaXplPTAsIGZvcmNlPTEsIGRyeV9ydW49c2VsZi5kcnlfcnVuKQogICAgICAgICAgICBpZiBzZWxmLm9wdGltaXplOgogICAgICAgICAgICAgICAgYnl0ZV9jb21waWxlKAogICAgICAgICAgICAgICAgICAgIHRvX2NvbXBpbGUsIG9wdGltaXplPXNlbGYub3B0aW1pemUsIGZvcmNlPTEsCiAgICAgICAgICAgICAgICAgICAgZHJ5X3J1bj1zZWxmLmRyeV9ydW4sCiAgICAgICAgICAgICAgICApCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgbG9nLnNldF92ZXJib3NpdHkoc2VsZi52ZXJib3NlKSAgIyByZXN0b3JlIG9yaWdpbmFsIHZlcmJvc2l0eQoKICAgIF9fbm9fZGVmYXVsdF9tc2cgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiCiAgICAgICAgYmFkIGluc3RhbGwgZGlyZWN0b3J5IG9yIFBZVEhPTlBBVEgKCiAgICAgICAgWW91IGFyZSBhdHRlbXB0aW5nIHRvIGluc3RhbGwgYSBwYWNrYWdlIHRvIGEgZGlyZWN0b3J5IHRoYXQgaXMgbm90CiAgICAgICAgb24gUFlUSE9OUEFUSCBhbmQgd2hpY2ggUHl0aG9uIGRvZXMgbm90IHJlYWQgIi5wdGgiIGZpbGVzIGZyb20uICBUaGUKICAgICAgICBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IHlvdSBzcGVjaWZpZWQgKHZpYSAtLWluc3RhbGwtZGlyLCAtLXByZWZpeCwgb3IKICAgICAgICB0aGUgZGlzdHV0aWxzIGRlZmF1bHQgc2V0dGluZykgd2FzOgoKICAgICAgICAgICAgJXMKCiAgICAgICAgYW5kIHlvdXIgUFlUSE9OUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBjdXJyZW50bHkgY29udGFpbnM6CgogICAgICAgICAgICAlcgoKICAgICAgICBIZXJlIGFyZSBzb21lIG9mIHlvdXIgb3B0aW9ucyBmb3IgY29ycmVjdGluZyB0aGUgcHJvYmxlbToKCiAgICAgICAgKiBZb3UgY2FuIGNob29zZSBhIGRpZmZlcmVudCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LCBpLmUuLCBvbmUgdGhhdCBpcwogICAgICAgICAgb24gUFlUSE9OUEFUSCBvciBzdXBwb3J0cyAucHRoIGZpbGVzCgogICAgICAgICogWW91IGNhbiBhZGQgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgdG8gdGhlIFBZVEhPTlBBVEggZW52aXJvbm1lbnQKICAgICAgICAgIHZhcmlhYmxlLiAgKEl0IG11c3QgdGhlbiBhbHNvIGJlIG9uIFBZVEhPTlBBVEggd2hlbmV2ZXIgeW91IHJ1bgogICAgICAgICAgUHl0aG9uIGFuZCB3YW50IHRvIHVzZSB0aGUgcGFja2FnZShzKSB5b3UgYXJlIGluc3RhbGxpbmcuKQoKICAgICAgICAqIFlvdSBjYW4gc2V0IHVwIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IHRvIHN1cHBvcnQgIi5wdGgiIGZpbGVzIGJ5CiAgICAgICAgICB1c2luZyBvbmUgb2YgdGhlIGFwcHJvYWNoZXMgZGVzY3JpYmVkIGhlcmU6CgogICAgICAgICAgaHR0cHM6Ly9zZXR1cHRvb2xzLnJlYWR0aGVkb2NzLmlvL2VuL2xhdGVzdC9lYXN5X2luc3RhbGwuaHRtbCNjdXN0b20taW5zdGFsbGF0aW9uLWxvY2F0aW9ucwoKCiAgICAgICAgUGxlYXNlIG1ha2UgdGhlIGFwcHJvcHJpYXRlIGNoYW5nZXMgZm9yIHlvdXIgc3lzdGVtIGFuZCB0cnkgYWdhaW4uIiIiKS5sc3RyaXAoKQoKICAgIGRlZiBub19kZWZhdWx0X3ZlcnNpb25fbXNnKHNlbGYpOgogICAgICAgIHRlbXBsYXRlID0gc2VsZi5fX25vX2RlZmF1bHRfbXNnCiAgICAgICAgcmV0dXJuIHRlbXBsYXRlICUgKHNlbGYuaW5zdGFsbF9kaXIsIG9zLmVudmlyb24uZ2V0KCdQWVRIT05QQVRIJywgJycpKQoKICAgIGRlZiBpbnN0YWxsX3NpdGVfcHkoc2VsZik6CiAgICAgICAgIiIiTWFrZSBzdXJlIHRoZXJlJ3MgYSBzaXRlLnB5IGluIHRoZSB0YXJnZXQgZGlyLCBpZiBuZWVkZWQiIiIKCiAgICAgICAgaWYgc2VsZi5zaXRlcHlfaW5zdGFsbGVkOgogICAgICAgICAgICByZXR1cm4gICMgYWxyZWFkeSBkaWQgaXQsIG9yIGRvbid0IG5lZWQgdG8KCiAgICAgICAgc2l0ZXB5ID0gb3MucGF0aC5qb2luKHNlbGYuaW5zdGFsbF9kaXIsICJzaXRlLnB5IikKICAgICAgICBzb3VyY2UgPSByZXNvdXJjZV9zdHJpbmcoInNldHVwdG9vbHMiLCAic2l0ZS1wYXRjaC5weSIpCiAgICAgICAgc291cmNlID0gc291cmNlLmRlY29kZSgndXRmLTgnKQogICAgICAgIGN1cnJlbnQgPSAiIgoKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzaXRlcHkpOgogICAgICAgICAgICBsb2cuZGVidWcoIkNoZWNraW5nIGV4aXN0aW5nIHNpdGUucHkgaW4gJXMiLCBzZWxmLmluc3RhbGxfZGlyKQogICAgICAgICAgICB3aXRoIGlvLm9wZW4oc2l0ZXB5KSBhcyBzdHJtOgogICAgICAgICAgICAgICAgY3VycmVudCA9IHN0cm0ucmVhZCgpCgogICAgICAgICAgICBpZiBub3QgY3VycmVudC5zdGFydHN3aXRoKCdkZWYgX19ib290KCk6Jyk6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigKICAgICAgICAgICAgICAgICAgICAiJXMgaXMgbm90IGEgc2V0dXB0b29scy1nZW5lcmF0ZWQgc2l0ZS5weTsgcGxlYXNlIgogICAgICAgICAgICAgICAgICAgICIgcmVtb3ZlIGl0LiIgJSBzaXRlcHkKICAgICAgICAgICAgICAgICkKCiAgICAgICAgaWYgY3VycmVudCAhPSBzb3VyY2U6CiAgICAgICAgICAgIGxvZy5pbmZvKCJDcmVhdGluZyAlcyIsIHNpdGVweSkKICAgICAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgICAgIGVuc3VyZV9kaXJlY3Rvcnkoc2l0ZXB5KQogICAgICAgICAgICAgICAgd2l0aCBpby5vcGVuKHNpdGVweSwgJ3cnLCBlbmNvZGluZz0ndXRmLTgnKSBhcyBzdHJtOgogICAgICAgICAgICAgICAgICAgIHN0cm0ud3JpdGUoc291cmNlKQogICAgICAgICAgICBzZWxmLmJ5dGVfY29tcGlsZShbc2l0ZXB5XSkKCiAgICAgICAgc2VsZi5zaXRlcHlfaW5zdGFsbGVkID0gVHJ1ZQoKICAgIGRlZiBjcmVhdGVfaG9tZV9wYXRoKHNlbGYpOgogICAgICAgICIiIkNyZWF0ZSBkaXJlY3RvcmllcyB1bmRlciB+LiIiIgogICAgICAgIGlmIG5vdCBzZWxmLnVzZXI6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGhvbWUgPSBjb252ZXJ0X3BhdGgob3MucGF0aC5leHBhbmR1c2VyKCJ+IikpCiAgICAgICAgZm9yIG5hbWUsIHBhdGggaW4gc2l4Lml0ZXJpdGVtcyhzZWxmLmNvbmZpZ192YXJzKToKICAgICAgICAgICAgaWYgcGF0aC5zdGFydHN3aXRoKGhvbWUpIGFuZCBub3Qgb3MucGF0aC5pc2RpcihwYXRoKToKICAgICAgICAgICAgICAgIHNlbGYuZGVidWdfcHJpbnQoIm9zLm1ha2VkaXJzKCclcycsIDBvNzAwKSIgJSBwYXRoKQogICAgICAgICAgICAgICAgb3MubWFrZWRpcnMocGF0aCwgMG83MDApCgogICAgSU5TVEFMTF9TQ0hFTUVTID0gZGljdCgKICAgICAgICBwb3NpeD1kaWN0KAogICAgICAgICAgICBpbnN0YWxsX2Rpcj0nJGJhc2UvbGliL3B5dGhvbiRweV92ZXJzaW9uX3Nob3J0L3NpdGUtcGFja2FnZXMnLAogICAgICAgICAgICBzY3JpcHRfZGlyPSckYmFzZS9iaW4nLAogICAgICAgICksCiAgICApCgogICAgREVGQVVMVF9TQ0hFTUUgPSBkaWN0KAogICAgICAgIGluc3RhbGxfZGlyPSckYmFzZS9MaWIvc2l0ZS1wYWNrYWdlcycsCiAgICAgICAgc2NyaXB0X2Rpcj0nJGJhc2UvU2NyaXB0cycsCiAgICApCgogICAgZGVmIF9leHBhbmQoc2VsZiwgKmF0dHJzKToKICAgICAgICBjb25maWdfdmFycyA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdpbnN0YWxsJykuY29uZmlnX3ZhcnMKCiAgICAgICAgaWYgc2VsZi5wcmVmaXg6CiAgICAgICAgICAgICMgU2V0IGRlZmF1bHQgaW5zdGFsbF9kaXIvc2NyaXB0cyBmcm9tIC0tcHJlZml4CiAgICAgICAgICAgIGNvbmZpZ192YXJzID0gY29uZmlnX3ZhcnMuY29weSgpCiAgICAgICAgICAgIGNvbmZpZ192YXJzWydiYXNlJ10gPSBzZWxmLnByZWZpeAogICAgICAgICAgICBzY2hlbWUgPSBzZWxmLklOU1RBTExfU0NIRU1FUy5nZXQob3MubmFtZSwgc2VsZi5ERUZBVUxUX1NDSEVNRSkKICAgICAgICAgICAgZm9yIGF0dHIsIHZhbCBpbiBzY2hlbWUuaXRlbXMoKToKICAgICAgICAgICAgICAgIGlmIGdldGF0dHIoc2VsZiwgYXR0ciwgTm9uZSkgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGF0dHIsIHZhbCkKCiAgICAgICAgZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgc3Vic3RfdmFycwoKICAgICAgICBmb3IgYXR0ciBpbiBhdHRyczoKICAgICAgICAgICAgdmFsID0gZ2V0YXR0cihzZWxmLCBhdHRyKQogICAgICAgICAgICBpZiB2YWwgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICB2YWwgPSBzdWJzdF92YXJzKHZhbCwgY29uZmlnX3ZhcnMpCiAgICAgICAgICAgICAgICBpZiBvcy5uYW1lID09ICdwb3NpeCc6CiAgICAgICAgICAgICAgICAgICAgdmFsID0gb3MucGF0aC5leHBhbmR1c2VyKHZhbCkKICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgYXR0ciwgdmFsKQoKCmRlZiBfcHl0aG9ucGF0aCgpOgogICAgaXRlbXMgPSBvcy5lbnZpcm9uLmdldCgnUFlUSE9OUEFUSCcsICcnKS5zcGxpdChvcy5wYXRoc2VwKQogICAgcmV0dXJuIGZpbHRlcihOb25lLCBpdGVtcykKCgpkZWYgZ2V0X3NpdGVfZGlycygpOgogICAgIiIiCiAgICBSZXR1cm4gYSBsaXN0IG9mICdzaXRlJyBkaXJzCiAgICAiIiIKCiAgICBzaXRlZGlycyA9IFtdCgogICAgIyBzdGFydCB3aXRoIFBZVEhPTlBBVEgKICAgIHNpdGVkaXJzLmV4dGVuZChfcHl0aG9ucGF0aCgpKQoKICAgIHByZWZpeGVzID0gW3N5cy5wcmVmaXhdCiAgICBpZiBzeXMuZXhlY19wcmVmaXggIT0gc3lzLnByZWZpeDoKICAgICAgICBwcmVmaXhlcy5hcHBlbmQoc3lzLmV4ZWNfcHJlZml4KQogICAgZm9yIHByZWZpeCBpbiBwcmVmaXhlczoKICAgICAgICBpZiBwcmVmaXg6CiAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSBpbiAoJ29zMmVteCcsICdyaXNjb3MnKToKICAgICAgICAgICAgICAgIHNpdGVkaXJzLmFwcGVuZChvcy5wYXRoLmpvaW4ocHJlZml4LCAiTGliIiwgInNpdGUtcGFja2FnZXMiKSkKICAgICAgICAgICAgZWxpZiBvcy5zZXAgPT0gJy8nOgogICAgICAgICAgICAgICAgc2l0ZWRpcnMuZXh0ZW5kKFsKICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgImxpYiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJweXRob24iICsgc3lzLnZlcnNpb25bOjNdLAogICAgICAgICAgICAgICAgICAgICAgICAic2l0ZS1wYWNrYWdlcyIsCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4ocHJlZml4LCAibGliIiwgInNpdGUtcHl0aG9uIiksCiAgICAgICAgICAgICAgICBdKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2l0ZWRpcnMuZXh0ZW5kKFsKICAgICAgICAgICAgICAgICAgICBwcmVmaXgsCiAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHByZWZpeCwgImxpYiIsICJzaXRlLXBhY2thZ2VzIiksCiAgICAgICAgICAgICAgICBdKQogICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6CiAgICAgICAgICAgICAgICAjIGZvciBmcmFtZXdvcmsgYnVpbGRzICpvbmx5KiB3ZSBhZGQgdGhlIHN0YW5kYXJkIEFwcGxlCiAgICAgICAgICAgICAgICAjIGxvY2F0aW9ucy4gQ3VycmVudGx5IG9ubHkgcGVyLXVzZXIsIGJ1dCAvTGlicmFyeSBhbmQKICAgICAgICAgICAgICAgICMgL05ldHdvcmsvTGlicmFyeSBjb3VsZCBiZSBhZGRlZCB0b28KICAgICAgICAgICAgICAgIGlmICdQeXRob24uZnJhbWV3b3JrJyBpbiBwcmVmaXg6CiAgICAgICAgICAgICAgICAgICAgaG9tZSA9IG9zLmVudmlyb24uZ2V0KCdIT01FJykKICAgICAgICAgICAgICAgICAgICBpZiBob21lOgogICAgICAgICAgICAgICAgICAgICAgICBob21lX3NwID0gb3MucGF0aC5qb2luKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9tZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMaWJyYXJ5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQeXRob24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnZlcnNpb25bOjNdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NpdGUtcGFja2FnZXMnLAogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIHNpdGVkaXJzLmFwcGVuZChob21lX3NwKQogICAgbGliX3BhdGhzID0gZ2V0X3BhdGgoJ3B1cmVsaWInKSwgZ2V0X3BhdGgoJ3BsYXRsaWInKQogICAgZm9yIHNpdGVfbGliIGluIGxpYl9wYXRoczoKICAgICAgICBpZiBzaXRlX2xpYiBub3QgaW4gc2l0ZWRpcnM6CiAgICAgICAgICAgIHNpdGVkaXJzLmFwcGVuZChzaXRlX2xpYikKCiAgICBpZiBzaXRlLkVOQUJMRV9VU0VSX1NJVEU6CiAgICAgICAgc2l0ZWRpcnMuYXBwZW5kKHNpdGUuVVNFUl9TSVRFKQoKICAgIHRyeToKICAgICAgICBzaXRlZGlycy5leHRlbmQoc2l0ZS5nZXRzaXRlcGFja2FnZXMoKSkKICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICBwYXNzCgogICAgc2l0ZWRpcnMgPSBsaXN0KG1hcChub3JtYWxpemVfcGF0aCwgc2l0ZWRpcnMpKQoKICAgIHJldHVybiBzaXRlZGlycwoKCmRlZiBleHBhbmRfcGF0aHMoaW5wdXRzKToKICAgICIiIllpZWxkIHN5cy5wYXRoIGRpcmVjdG9yaWVzIHRoYXQgbWlnaHQgY29udGFpbiAib2xkLXN0eWxlIiBwYWNrYWdlcyIiIgoKICAgIHNlZW4gPSB7fQoKICAgIGZvciBkaXJuYW1lIGluIGlucHV0czoKICAgICAgICBkaXJuYW1lID0gbm9ybWFsaXplX3BhdGgoZGlybmFtZSkKICAgICAgICBpZiBkaXJuYW1lIGluIHNlZW46CiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIHNlZW5bZGlybmFtZV0gPSAxCiAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIoZGlybmFtZSk6CiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIGZpbGVzID0gb3MubGlzdGRpcihkaXJuYW1lKQogICAgICAgIHlpZWxkIGRpcm5hbWUsIGZpbGVzCgogICAgICAgIGZvciBuYW1lIGluIGZpbGVzOgogICAgICAgICAgICBpZiBub3QgbmFtZS5lbmRzd2l0aCgnLnB0aCcpOgogICAgICAgICAgICAgICAgIyBXZSBvbmx5IGNhcmUgYWJvdXQgdGhlIC5wdGggZmlsZXMKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGlmIG5hbWUgaW4gKCdlYXN5LWluc3RhbGwucHRoJywgJ3NldHVwdG9vbHMucHRoJyk6CiAgICAgICAgICAgICAgICAjIElnbm9yZSAucHRoIGZpbGVzIHRoYXQgd2UgY29udHJvbAogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgICMgUmVhZCB0aGUgLnB0aCBmaWxlCiAgICAgICAgICAgIGYgPSBvcGVuKG9zLnBhdGguam9pbihkaXJuYW1lLCBuYW1lKSkKICAgICAgICAgICAgbGluZXMgPSBsaXN0KHlpZWxkX2xpbmVzKGYpKQogICAgICAgICAgICBmLmNsb3NlKCkKCiAgICAgICAgICAgICMgWWllbGQgZXhpc3Rpbmcgbm9uLWR1cGUsIG5vbi1pbXBvcnQgZGlyZWN0b3J5IGxpbmVzIGZyb20gaXQKICAgICAgICAgICAgZm9yIGxpbmUgaW4gbGluZXM6CiAgICAgICAgICAgICAgICBpZiBub3QgbGluZS5zdGFydHN3aXRoKCJpbXBvcnQiKToKICAgICAgICAgICAgICAgICAgICBsaW5lID0gbm9ybWFsaXplX3BhdGgobGluZS5yc3RyaXAoKSkKICAgICAgICAgICAgICAgICAgICBpZiBsaW5lIG5vdCBpbiBzZWVuOgogICAgICAgICAgICAgICAgICAgICAgICBzZWVuW2xpbmVdID0gMQogICAgICAgICAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihsaW5lKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGxpbmUsIG9zLmxpc3RkaXIobGluZSkKCgpkZWYgZXh0cmFjdF93aW5pbnN0X2NmZyhkaXN0X2ZpbGVuYW1lKToKICAgICIiIkV4dHJhY3QgY29uZmlndXJhdGlvbiBkYXRhIGZyb20gYSBiZGlzdF93aW5pbnN0IC5leGUKCiAgICBSZXR1cm5zIGEgY29uZmlncGFyc2VyLlJhd0NvbmZpZ1BhcnNlciwgb3IgTm9uZQogICAgIiIiCiAgICBmID0gb3BlbihkaXN0X2ZpbGVuYW1lLCAncmInKQogICAgdHJ5OgogICAgICAgIGVuZHJlYyA9IHppcGZpbGUuX0VuZFJlY0RhdGEoZikKICAgICAgICBpZiBlbmRyZWMgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgcHJlcGVuZGVkID0gKGVuZHJlY1s5XSAtIGVuZHJlY1s1XSkgLSBlbmRyZWNbNl0KICAgICAgICBpZiBwcmVwZW5kZWQgPCAxMjogICMgbm8gd2luaW5zdCBkYXRhIGhlcmUKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICBmLnNlZWsocHJlcGVuZGVkIC0gMTIpCgogICAgICAgIHRhZywgY2ZnbGVuLCBibWxlbiA9IHN0cnVjdC51bnBhY2soIjxpaWkiLCBmLnJlYWQoMTIpKQogICAgICAgIGlmIHRhZyBub3QgaW4gKDB4MTIzNDU2N0EsIDB4MTIzNDU2N0IpOgogICAgICAgICAgICByZXR1cm4gTm9uZSAgIyBub3QgYSB2YWxpZCB0YWcKCiAgICAgICAgZi5zZWVrKHByZXBlbmRlZCAtICgxMiArIGNmZ2xlbikpCiAgICAgICAgaW5pdCA9IHsndmVyc2lvbic6ICcnLCAndGFyZ2V0X3ZlcnNpb24nOiAnJ30KICAgICAgICBjZmcgPSBjb25maWdwYXJzZXIuUmF3Q29uZmlnUGFyc2VyKGluaXQpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBwYXJ0ID0gZi5yZWFkKGNmZ2xlbikKICAgICAgICAgICAgIyBSZWFkIHVwIHRvIHRoZSBmaXJzdCBudWxsIGJ5dGUuCiAgICAgICAgICAgIGNvbmZpZyA9IHBhcnQuc3BsaXQoYidcMCcsIDEpWzBdCiAgICAgICAgICAgICMgTm93IHRoZSBjb25maWcgaXMgaW4gYnl0ZXMsIGJ1dCBmb3IgUmF3Q29uZmlnUGFyc2VyLCBpdCBzaG91bGQKICAgICAgICAgICAgIyAgYmUgdGV4dCwgc28gZGVjb2RlIGl0LgogICAgICAgICAgICBjb25maWcgPSBjb25maWcuZGVjb2RlKHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKSkKICAgICAgICAgICAgY2ZnLnJlYWRmcChzaXguU3RyaW5nSU8oY29uZmlnKSkKICAgICAgICBleGNlcHQgY29uZmlncGFyc2VyLkVycm9yOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIGlmIG5vdCBjZmcuaGFzX3NlY3Rpb24oJ21ldGFkYXRhJykgb3Igbm90IGNmZy5oYXNfc2VjdGlvbignU2V0dXAnKToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICByZXR1cm4gY2ZnCgogICAgZmluYWxseToKICAgICAgICBmLmNsb3NlKCkKCgpkZWYgZ2V0X2V4ZV9wcmVmaXhlcyhleGVfZmlsZW5hbWUpOgogICAgIiIiR2V0IGV4ZS0+ZWdnIHBhdGggdHJhbnNsYXRpb25zIGZvciBhIGdpdmVuIC5leGUgZmlsZSIiIgoKICAgIHByZWZpeGVzID0gWwogICAgICAgICgnUFVSRUxJQi8nLCAnJyksCiAgICAgICAgKCdQTEFUTElCL3B5d2luMzJfc3lzdGVtMzInLCAnJyksCiAgICAgICAgKCdQTEFUTElCLycsICcnKSwKICAgICAgICAoJ1NDUklQVFMvJywgJ0VHRy1JTkZPL3NjcmlwdHMvJyksCiAgICAgICAgKCdEQVRBL2xpYi9zaXRlLXBhY2thZ2VzJywgJycpLAogICAgXQogICAgeiA9IHppcGZpbGUuWmlwRmlsZShleGVfZmlsZW5hbWUpCiAgICB0cnk6CiAgICAgICAgZm9yIGluZm8gaW4gei5pbmZvbGlzdCgpOgogICAgICAgICAgICBuYW1lID0gaW5mby5maWxlbmFtZQogICAgICAgICAgICBwYXJ0cyA9IG5hbWUuc3BsaXQoJy8nKQogICAgICAgICAgICBpZiBsZW4ocGFydHMpID09IDMgYW5kIHBhcnRzWzJdID09ICdQS0ctSU5GTyc6CiAgICAgICAgICAgICAgICBpZiBwYXJ0c1sxXS5lbmRzd2l0aCgnLmVnZy1pbmZvJyk6CiAgICAgICAgICAgICAgICAgICAgcHJlZml4ZXMuaW5zZXJ0KDAsICgnLycuam9pbihwYXJ0c1s6Ml0pLCAnRUdHLUlORk8vJykpCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgaWYgbGVuKHBhcnRzKSAhPSAyIG9yIG5vdCBuYW1lLmVuZHN3aXRoKCcucHRoJyk6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBuYW1lLmVuZHN3aXRoKCctbnNwa2cucHRoJyk6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBwYXJ0c1swXS51cHBlcigpIGluICgnUFVSRUxJQicsICdQTEFUTElCJyk6CiAgICAgICAgICAgICAgICBjb250ZW50cyA9IHoucmVhZChuYW1lKQogICAgICAgICAgICAgICAgaWYgc2l4LlBZMzoKICAgICAgICAgICAgICAgICAgICBjb250ZW50cyA9IGNvbnRlbnRzLmRlY29kZSgpCiAgICAgICAgICAgICAgICBmb3IgcHRoIGluIHlpZWxkX2xpbmVzKGNvbnRlbnRzKToKICAgICAgICAgICAgICAgICAgICBwdGggPSBwdGguc3RyaXAoKS5yZXBsYWNlKCdcXCcsICcvJykKICAgICAgICAgICAgICAgICAgICBpZiBub3QgcHRoLnN0YXJ0c3dpdGgoJ2ltcG9ydCcpOgogICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXhlcy5hcHBlbmQoKCgnJXMvJXMvJyAlIChwYXJ0c1swXSwgcHRoKSksICcnKSkKICAgIGZpbmFsbHk6CiAgICAgICAgei5jbG9zZSgpCiAgICBwcmVmaXhlcyA9IFsoeC5sb3dlcigpLCB5KSBmb3IgeCwgeSBpbiBwcmVmaXhlc10KICAgIHByZWZpeGVzLnNvcnQoKQogICAgcHJlZml4ZXMucmV2ZXJzZSgpCiAgICByZXR1cm4gcHJlZml4ZXMKCgpjbGFzcyBQdGhEaXN0cmlidXRpb25zKEVudmlyb25tZW50KToKICAgICIiIkEgLnB0aCBmaWxlIHdpdGggRGlzdHJpYnV0aW9uIHBhdGhzIGluIGl0IiIiCgogICAgZGlydHkgPSBGYWxzZQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlbmFtZSwgc2l0ZWRpcnM9KCkpOgogICAgICAgIHNlbGYuZmlsZW5hbWUgPSBmaWxlbmFtZQogICAgICAgIHNlbGYuc2l0ZWRpcnMgPSBsaXN0KG1hcChub3JtYWxpemVfcGF0aCwgc2l0ZWRpcnMpKQogICAgICAgIHNlbGYuYmFzZWRpciA9IG5vcm1hbGl6ZV9wYXRoKG9zLnBhdGguZGlybmFtZShzZWxmLmZpbGVuYW1lKSkKICAgICAgICBzZWxmLl9sb2FkKCkKICAgICAgICBFbnZpcm9ubWVudC5fX2luaXRfXyhzZWxmLCBbXSwgTm9uZSwgTm9uZSkKICAgICAgICBmb3IgcGF0aCBpbiB5aWVsZF9saW5lcyhzZWxmLnBhdGhzKToKICAgICAgICAgICAgbGlzdChtYXAoc2VsZi5hZGQsIGZpbmRfZGlzdHJpYnV0aW9ucyhwYXRoLCBUcnVlKSkpCgogICAgZGVmIF9sb2FkKHNlbGYpOgogICAgICAgIHNlbGYucGF0aHMgPSBbXQogICAgICAgIHNhd19pbXBvcnQgPSBGYWxzZQogICAgICAgIHNlZW4gPSBkaWN0LmZyb21rZXlzKHNlbGYuc2l0ZWRpcnMpCiAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoc2VsZi5maWxlbmFtZSk6CiAgICAgICAgICAgIGYgPSBvcGVuKHNlbGYuZmlsZW5hbWUsICdydCcpCiAgICAgICAgICAgIGZvciBsaW5lIGluIGY6CiAgICAgICAgICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoJ2ltcG9ydCcpOgogICAgICAgICAgICAgICAgICAgIHNhd19pbXBvcnQgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIHBhdGggPSBsaW5lLnJzdHJpcCgpCiAgICAgICAgICAgICAgICBzZWxmLnBhdGhzLmFwcGVuZChwYXRoKQogICAgICAgICAgICAgICAgaWYgbm90IHBhdGguc3RyaXAoKSBvciBwYXRoLnN0cmlwKCkuc3RhcnRzd2l0aCgnIycpOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAjIHNraXAgbm9uLWV4aXN0ZW50IHBhdGhzLCBpbiBjYXNlIHNvbWVib2R5IGRlbGV0ZWQgYSBwYWNrYWdlCiAgICAgICAgICAgICAgICAjIG1hbnVhbGx5LCBhbmQgZHVwbGljYXRlIHBhdGhzIGFzIHdlbGwKICAgICAgICAgICAgICAgIHBhdGggPSBzZWxmLnBhdGhzWy0xXSA9IG5vcm1hbGl6ZV9wYXRoKAogICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihzZWxmLmJhc2VkaXIsIHBhdGgpCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocGF0aCkgb3IgcGF0aCBpbiBzZWVuOgogICAgICAgICAgICAgICAgICAgIHNlbGYucGF0aHMucG9wKCkgICMgc2tpcCBpdAogICAgICAgICAgICAgICAgICAgIHNlbGYuZGlydHkgPSBUcnVlICAjIHdlIGNsZWFuZWQgdXAsIHNvIHdlJ3JlIGRpcnR5IG5vdyA6KQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBzZWVuW3BhdGhdID0gMQogICAgICAgICAgICBmLmNsb3NlKCkKCiAgICAgICAgaWYgc2VsZi5wYXRocyBhbmQgbm90IHNhd19pbXBvcnQ6CiAgICAgICAgICAgIHNlbGYuZGlydHkgPSBUcnVlICAjIGVuc3VyZSBhbnl0aGluZyB3ZSB0b3VjaCBoYXMgaW1wb3J0IHdyYXBwZXJzCiAgICAgICAgd2hpbGUgc2VsZi5wYXRocyBhbmQgbm90IHNlbGYucGF0aHNbLTFdLnN0cmlwKCk6CiAgICAgICAgICAgIHNlbGYucGF0aHMucG9wKCkKCiAgICBkZWYgc2F2ZShzZWxmKToKICAgICAgICAiIiJXcml0ZSBjaGFuZ2VkIC5wdGggZmlsZSBiYWNrIHRvIGRpc2siIiIKICAgICAgICBpZiBub3Qgc2VsZi5kaXJ0eToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHJlbF9wYXRocyA9IGxpc3QobWFwKHNlbGYubWFrZV9yZWxhdGl2ZSwgc2VsZi5wYXRocykpCiAgICAgICAgaWYgcmVsX3BhdGhzOgogICAgICAgICAgICBsb2cuZGVidWcoIlNhdmluZyAlcyIsIHNlbGYuZmlsZW5hbWUpCiAgICAgICAgICAgIGxpbmVzID0gc2VsZi5fd3JhcF9saW5lcyhyZWxfcGF0aHMpCiAgICAgICAgICAgIGRhdGEgPSAnXG4nLmpvaW4obGluZXMpICsgJ1xuJwoKICAgICAgICAgICAgaWYgb3MucGF0aC5pc2xpbmsoc2VsZi5maWxlbmFtZSk6CiAgICAgICAgICAgICAgICBvcy51bmxpbmsoc2VsZi5maWxlbmFtZSkKICAgICAgICAgICAgd2l0aCBvcGVuKHNlbGYuZmlsZW5hbWUsICd3dCcpIGFzIGY6CiAgICAgICAgICAgICAgICBmLndyaXRlKGRhdGEpCgogICAgICAgIGVsaWYgb3MucGF0aC5leGlzdHMoc2VsZi5maWxlbmFtZSk6CiAgICAgICAgICAgIGxvZy5kZWJ1ZygiRGVsZXRpbmcgZW1wdHkgJXMiLCBzZWxmLmZpbGVuYW1lKQogICAgICAgICAgICBvcy51bmxpbmsoc2VsZi5maWxlbmFtZSkKCiAgICAgICAgc2VsZi5kaXJ0eSA9IEZhbHNlCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF93cmFwX2xpbmVzKGxpbmVzKToKICAgICAgICByZXR1cm4gbGluZXMKCiAgICBkZWYgYWRkKHNlbGYsIGRpc3QpOgogICAgICAgICIiIkFkZCBgZGlzdGAgdG8gdGhlIGRpc3RyaWJ1dGlvbiBtYXAiIiIKICAgICAgICBuZXdfcGF0aCA9ICgKICAgICAgICAgICAgZGlzdC5sb2NhdGlvbiBub3QgaW4gc2VsZi5wYXRocyBhbmQgKAogICAgICAgICAgICAgICAgZGlzdC5sb2NhdGlvbiBub3QgaW4gc2VsZi5zaXRlZGlycyBvcgogICAgICAgICAgICAgICAgIyBhY2NvdW50IGZvciAnLicgYmVpbmcgaW4gUFlUSE9OUEFUSAogICAgICAgICAgICAgICAgZGlzdC5sb2NhdGlvbiA9PSBvcy5nZXRjd2QoKQogICAgICAgICAgICApCiAgICAgICAgKQogICAgICAgIGlmIG5ld19wYXRoOgogICAgICAgICAgICBzZWxmLnBhdGhzLmFwcGVuZChkaXN0LmxvY2F0aW9uKQogICAgICAgICAgICBzZWxmLmRpcnR5ID0gVHJ1ZQogICAgICAgIEVudmlyb25tZW50LmFkZChzZWxmLCBkaXN0KQoKICAgIGRlZiByZW1vdmUoc2VsZiwgZGlzdCk6CiAgICAgICAgIiIiUmVtb3ZlIGBkaXN0YCBmcm9tIHRoZSBkaXN0cmlidXRpb24gbWFwIiIiCiAgICAgICAgd2hpbGUgZGlzdC5sb2NhdGlvbiBpbiBzZWxmLnBhdGhzOgogICAgICAgICAgICBzZWxmLnBhdGhzLnJlbW92ZShkaXN0LmxvY2F0aW9uKQogICAgICAgICAgICBzZWxmLmRpcnR5ID0gVHJ1ZQogICAgICAgIEVudmlyb25tZW50LnJlbW92ZShzZWxmLCBkaXN0KQoKICAgIGRlZiBtYWtlX3JlbGF0aXZlKHNlbGYsIHBhdGgpOgogICAgICAgIG5wYXRoLCBsYXN0ID0gb3MucGF0aC5zcGxpdChub3JtYWxpemVfcGF0aChwYXRoKSkKICAgICAgICBiYXNlbGVuID0gbGVuKHNlbGYuYmFzZWRpcikKICAgICAgICBwYXJ0cyA9IFtsYXN0XQogICAgICAgIHNlcCA9IG9zLmFsdHNlcCA9PSAnLycgYW5kICcvJyBvciBvcy5zZXAKICAgICAgICB3aGlsZSBsZW4obnBhdGgpID49IGJhc2VsZW46CiAgICAgICAgICAgIGlmIG5wYXRoID09IHNlbGYuYmFzZWRpcjoKICAgICAgICAgICAgICAgIHBhcnRzLmFwcGVuZChvcy5jdXJkaXIpCiAgICAgICAgICAgICAgICBwYXJ0cy5yZXZlcnNlKCkKICAgICAgICAgICAgICAgIHJldHVybiBzZXAuam9pbihwYXJ0cykKICAgICAgICAgICAgbnBhdGgsIGxhc3QgPSBvcy5wYXRoLnNwbGl0KG5wYXRoKQogICAgICAgICAgICBwYXJ0cy5hcHBlbmQobGFzdCkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gcGF0aAoKCmNsYXNzIFJld3JpdGVQdGhEaXN0cmlidXRpb25zKFB0aERpc3RyaWJ1dGlvbnMpOgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX3dyYXBfbGluZXMoY2xzLCBsaW5lcyk6CiAgICAgICAgeWllbGQgY2xzLnByZWx1ZGUKICAgICAgICBmb3IgbGluZSBpbiBsaW5lczoKICAgICAgICAgICAgeWllbGQgbGluZQogICAgICAgIHlpZWxkIGNscy5wb3N0bHVkZQoKICAgIHByZWx1ZGUgPSBfb25lX2xpbmVyKCIiIgogICAgICAgIGltcG9ydCBzeXMKICAgICAgICBzeXMuX19wbGVuID0gbGVuKHN5cy5wYXRoKQogICAgICAgICIiIikKICAgIHBvc3RsdWRlID0gX29uZV9saW5lcigiIiIKICAgICAgICBpbXBvcnQgc3lzCiAgICAgICAgbmV3ID0gc3lzLnBhdGhbc3lzLl9fcGxlbjpdCiAgICAgICAgZGVsIHN5cy5wYXRoW3N5cy5fX3BsZW46XQogICAgICAgIHAgPSBnZXRhdHRyKHN5cywgJ19fZWdnaW5zZXJ0JywgMCkKICAgICAgICBzeXMucGF0aFtwOnBdID0gbmV3CiAgICAgICAgc3lzLl9fZWdnaW5zZXJ0ID0gcCArIGxlbihuZXcpCiAgICAgICAgIiIiKQoKCmlmIG9zLmVudmlyb24uZ2V0KCdTRVRVUFRPT0xTX1NZU19QQVRIX1RFQ0hOSVFVRScsICdyYXcnKSA9PSAncmV3cml0ZSc6CiAgICBQdGhEaXN0cmlidXRpb25zID0gUmV3cml0ZVB0aERpc3RyaWJ1dGlvbnMKCgpkZWYgX2ZpcnN0X2xpbmVfcmUoKToKICAgICIiIgogICAgUmV0dXJuIGEgcmVndWxhciBleHByZXNzaW9uIGJhc2VkIG9uIGZpcnN0X2xpbmVfcmUgc3VpdGFibGUgZm9yIG1hdGNoaW5nCiAgICBzdHJpbmdzLgogICAgIiIiCiAgICBpZiBpc2luc3RhbmNlKGZpcnN0X2xpbmVfcmUucGF0dGVybiwgc3RyKToKICAgICAgICByZXR1cm4gZmlyc3RfbGluZV9yZQoKICAgICMgZmlyc3RfbGluZV9yZSBpbiBQeXRob24gPj0zLjEuNCBhbmQgPj0zLjIuMSBpcyBhIGJ5dGVzIHBhdHRlcm4uCiAgICByZXR1cm4gcmUuY29tcGlsZShmaXJzdF9saW5lX3JlLnBhdHRlcm4uZGVjb2RlKCkpCgoKZGVmIGF1dG9fY2htb2QoZnVuYywgYXJnLCBleGMpOgogICAgaWYgZnVuYyBpbiBbb3MudW5saW5rLCBvcy5yZW1vdmVdIGFuZCBvcy5uYW1lID09ICdudCc6CiAgICAgICAgY2htb2QoYXJnLCBzdGF0LlNfSVdSSVRFKQogICAgICAgIHJldHVybiBmdW5jKGFyZykKICAgIGV0LCBldiwgXyA9IHN5cy5leGNfaW5mbygpCiAgICBzaXgucmVyYWlzZShldCwgKGV2WzBdLCBldlsxXSArICgiICVzICVzIiAlIChmdW5jLCBhcmcpKSkpCgoKZGVmIHVwZGF0ZV9kaXN0X2NhY2hlcyhkaXN0X3BhdGgsIGZpeF96aXBpbXBvcnRlcl9jYWNoZXMpOgogICAgIiIiCiAgICBGaXggYW55IGdsb2JhbGx5IGNhY2hlZCBgZGlzdF9wYXRoYCByZWxhdGVkIGRhdGEKCiAgICBgZGlzdF9wYXRoYCBzaG91bGQgYmUgYSBwYXRoIG9mIGEgbmV3bHkgaW5zdGFsbGVkIGVnZyBkaXN0cmlidXRpb24gKHppcHBlZAogICAgb3IgdW56aXBwZWQpLgoKICAgIHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlIGNvbnRhaW5zIGZpbmRlciBvYmplY3RzIHRoYXQgaGF2ZSBiZWVuIGNhY2hlZCB3aGVuCiAgICBpbXBvcnRpbmcgZGF0YSBmcm9tIHRoZSBvcmlnaW5hbCBkaXN0cmlidXRpb24uIEFueSBzdWNoIGZpbmRlcnMgbmVlZCB0byBiZQogICAgY2xlYXJlZCBzaW5jZSB0aGUgcmVwbGFjZW1lbnQgZGlzdHJpYnV0aW9uIG1pZ2h0IGJlIHBhY2thZ2VkIGRpZmZlcmVudGx5LAogICAgZS5nLiBhIHppcHBlZCBlZ2cgZGlzdHJpYnV0aW9uIG1pZ2h0IGdldCByZXBsYWNlZCB3aXRoIGFuIHVuemlwcGVkIGVnZwogICAgZm9sZGVyIG9yIHZpY2UgdmVyc2EuIEhhdmluZyB0aGUgb2xkIGZpbmRlcnMgY2FjaGVkIG1heSB0aGVuIGNhdXNlIFB5dGhvbgogICAgdG8gYXR0ZW1wdCBsb2FkaW5nIG1vZHVsZXMgZnJvbSB0aGUgcmVwbGFjZW1lbnQgZGlzdHJpYnV0aW9uIHVzaW5nIGFuCiAgICBpbmNvcnJlY3QgbG9hZGVyLgoKICAgIHppcGltcG9ydC56aXBpbXBvcnRlciBvYmplY3RzIGFyZSBQeXRob24gbG9hZGVycyBjaGFyZ2VkIHdpdGggaW1wb3J0aW5nCiAgICBkYXRhIHBhY2thZ2VkIGluc2lkZSB6aXAgYXJjaGl2ZXMuIElmIHN0YWxlIGxvYWRlcnMgcmVmZXJlbmNpbmcgdGhlCiAgICBvcmlnaW5hbCBkaXN0cmlidXRpb24sIGFyZSBsZWZ0IGJlaGluZCwgdGhleSBjYW4gZmFpbCB0byBsb2FkIG1vZHVsZXMgZnJvbQogICAgdGhlIHJlcGxhY2VtZW50IGRpc3RyaWJ1dGlvbi4gRS5nLiBpZiBhbiBvbGQgemlwaW1wb3J0LnppcGltcG9ydGVyIGluc3RhbmNlCiAgICBpcyB1c2VkIHRvIGxvYWQgZGF0YSBmcm9tIGEgbmV3IHppcHBlZCBlZ2cgYXJjaGl2ZSwgaXQgbWF5IGNhdXNlIHRoZQogICAgb3BlcmF0aW9uIHRvIGF0dGVtcHQgdG8gbG9jYXRlIHRoZSByZXF1ZXN0ZWQgZGF0YSBpbiB0aGUgd3JvbmcgbG9jYXRpb24gLQogICAgb25lIGluZGljYXRlZCBieSB0aGUgb3JpZ2luYWwgZGlzdHJpYnV0aW9uJ3MgemlwIGFyY2hpdmUgZGlyZWN0b3J5CiAgICBpbmZvcm1hdGlvbi4gU3VjaCBhbiBvcGVyYXRpb24gbWF5IHRoZW4gZmFpbCBvdXRyaWdodCwgZS5nLiByZXBvcnQgaGF2aW5nCiAgICByZWFkIGEgJ2JhZCBsb2NhbCBmaWxlIGhlYWRlcicsIG9yIGV2ZW4gd29yc2UsIGl0IG1heSBmYWlsIHNpbGVudGx5ICYKICAgIHJldHVybiBpbnZhbGlkIGRhdGEuCgogICAgemlwaW1wb3J0Ll96aXBfZGlyZWN0b3J5X2NhY2hlIGNvbnRhaW5zIGNhY2hlZCB6aXAgYXJjaGl2ZSBkaXJlY3RvcnkKICAgIGluZm9ybWF0aW9uIGZvciBhbGwgZXhpc3RpbmcgemlwaW1wb3J0LnppcGltcG9ydGVyIGluc3RhbmNlcyBhbmQgYWxsIHN1Y2gKICAgIGluc3RhbmNlcyBjb25uZWN0ZWQgdG8gdGhlIHNhbWUgYXJjaGl2ZSBzaGFyZSB0aGUgc2FtZSBjYWNoZWQgZGlyZWN0b3J5CiAgICBpbmZvcm1hdGlvbi4KCiAgICBJZiBhc2tlZCwgYW5kIHRoZSB1bmRlcmx5aW5nIFB5dGhvbiBpbXBsZW1lbnRhdGlvbiBhbGxvd3MgaXQsIHdlIGNhbiBmaXgKICAgIGFsbCBleGlzdGluZyB6aXBpbXBvcnQuemlwaW1wb3J0ZXIgaW5zdGFuY2VzIGluc3RlYWQgb2YgaGF2aW5nIHRvIHRyYWNrCiAgICB0aGVtIGRvd24gYW5kIHJlbW92ZSB0aGVtIG9uZSBieSBvbmUsIGJ5IHVwZGF0aW5nIHRoZWlyIHNoYXJlZCBjYWNoZWQgemlwCiAgICBhcmNoaXZlIGRpcmVjdG9yeSBpbmZvcm1hdGlvbi4gVGhpcywgb2YgY291cnNlLCBhc3N1bWVzIHRoYXQgdGhlCiAgICByZXBsYWNlbWVudCBkaXN0cmlidXRpb24gaXMgcGFja2FnZWQgYXMgYSB6aXBwZWQgZWdnLgoKICAgIElmIG5vdCBhc2tlZCB0byBmaXggZXhpc3RpbmcgemlwaW1wb3J0LnppcGltcG9ydGVyIGluc3RhbmNlcywgd2Ugc3RpbGwgZG8KICAgIG91ciBiZXN0IHRvIGNsZWFyIGFueSByZW1haW5pbmcgemlwaW1wb3J0LnppcGltcG9ydGVyIHJlbGF0ZWQgY2FjaGVkIGRhdGEKICAgIHRoYXQgbWlnaHQgc29tZWhvdyBsYXRlciBnZXQgdXNlZCB3aGVuIGF0dGVtcHRpbmcgdG8gbG9hZCBkYXRhIGZyb20gdGhlIG5ldwogICAgZGlzdHJpYnV0aW9uIGFuZCB0aHVzIGNhdXNlIHN1Y2ggbG9hZCBvcGVyYXRpb25zIHRvIGZhaWwuIE5vdGUgdGhhdCB3aGVuCiAgICB0cmFja2luZyBkb3duIHN1Y2ggcmVtYWluaW5nIHN0YWxlIGRhdGEsIHdlIGNhbiBub3QgY2F0Y2ggZXZlcnkgY29uY2VpdmFibGUKICAgIHVzYWdlIGZyb20gaGVyZSwgYW5kIHdlIGNsZWFyIG9ubHkgdGhvc2UgdGhhdCB3ZSBrbm93IG9mIGFuZCBoYXZlIGZvdW5kIHRvCiAgICBjYXVzZSBwcm9ibGVtcyBpZiBsZWZ0IGFsaXZlLiBBbnkgcmVtYWluaW5nIGNhY2hlcyBzaG91bGQgYmUgdXBkYXRlZCBieQogICAgd2hvbWV2ZXIgaXMgaW4gY2hhcmdlIG9mIG1haW50YWluaW5nIHRoZW0sIGkuZS4gdGhleSBzaG91bGQgYmUgcmVhZHkgdG8KICAgIGhhbmRsZSB1cyByZXBsYWNpbmcgdGhlaXIgemlwIGFyY2hpdmVzIHdpdGggbmV3IGRpc3RyaWJ1dGlvbnMgYXQgcnVudGltZS4KCiAgICAiIiIKICAgICMgVGhlcmUgYXJlIHNldmVyYWwgb3RoZXIga25vd24gc291cmNlcyBvZiBzdGFsZSB6aXBpbXBvcnQuemlwaW1wb3J0ZXIKICAgICMgaW5zdGFuY2VzIHRoYXQgd2UgZG8gbm90IGNsZWFyIGhlcmUsIGJ1dCBtaWdodCBpZiBldmVyIGdpdmVuIGEgcmVhc29uIHRvCiAgICAjIGRvIHNvOgogICAgIyAqIEdsb2JhbCBzZXR1cHRvb2xzIHBrZ19yZXNvdXJjZXMud29ya2luZ19zZXQgKGEuay5hLiAnbWFzdGVyIHdvcmtpbmcKICAgICMgc2V0JykgbWF5IGNvbnRhaW4gZGlzdHJpYnV0aW9ucyB3aGljaCBtYXkgaW4gdHVybiBjb250YWluIHRoZWlyCiAgICAjICAgemlwaW1wb3J0LnppcGltcG9ydGVyIGxvYWRlcnMuCiAgICAjICogU2V2ZXJhbCB6aXBpbXBvcnQuemlwaW1wb3J0ZXIgbG9hZGVycyBoZWxkIGJ5IGxvY2FsIHZhcmlhYmxlcyBmdXJ0aGVyCiAgICAjICAgdXAgdGhlIGZ1bmN0aW9uIGNhbGwgc3RhY2sgd2hlbiBydW5uaW5nIHRoZSBzZXR1cHRvb2xzIGluc3RhbGxhdGlvbi4KICAgICMgKiBBbHJlYWR5IGxvYWRlZCBtb2R1bGVzIG1heSBoYXZlIHRoZWlyIF9fbG9hZGVyX18gYXR0cmlidXRlIHNldCB0byB0aGUKICAgICMgICBleGFjdCBsb2FkZXIgaW5zdGFuY2UgdXNlZCB3aGVuIGltcG9ydGluZyB0aGVtLiBQeXRob24gMy40IGRvY3Mgc3RhdGUKICAgICMgICB0aGF0IHRoaXMgaW5mb3JtYXRpb24gaXMgaW50ZW5kZWQgbW9zdGx5IGZvciBpbnRyb3NwZWN0aW9uIGFuZCBzbyBpcwogICAgIyAgIG5vdCBleHBlY3RlZCB0byBjYXVzZSB1cyBwcm9ibGVtcy4KICAgIG5vcm1hbGl6ZWRfcGF0aCA9IG5vcm1hbGl6ZV9wYXRoKGRpc3RfcGF0aCkKICAgIF91bmNhY2hlKG5vcm1hbGl6ZWRfcGF0aCwgc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGUpCiAgICBpZiBmaXhfemlwaW1wb3J0ZXJfY2FjaGVzOgogICAgICAgIF9yZXBsYWNlX3ppcF9kaXJlY3RvcnlfY2FjaGVfZGF0YShub3JtYWxpemVkX3BhdGgpCiAgICBlbHNlOgogICAgICAgICMgSGVyZSwgZXZlbiB0aG91Z2ggd2UgZG8gbm90IHdhbnQgdG8gZml4IGV4aXN0aW5nIGFuZCBub3cgc3RhbGUKICAgICAgICAjIHppcGltcG9ydGVyIGNhY2hlIGluZm9ybWF0aW9uLCB3ZSBzdGlsbCB3YW50IHRvIHJlbW92ZSBpdC4gUmVsYXRlZCB0bwogICAgICAgICMgUHl0aG9uJ3MgemlwIGFyY2hpdmUgZGlyZWN0b3J5IGluZm9ybWF0aW9uIGNhY2hlLCB3ZSBjbGVhciBlYWNoIG9mCiAgICAgICAgIyBpdHMgc3RhbGUgZW50cmllcyBpbiB0d28gcGhhc2VzOgogICAgICAgICMgICAxLiBDbGVhciB0aGUgZW50cnkgc28gYXR0ZW1wdGluZyB0byBhY2Nlc3MgemlwIGFyY2hpdmUgaW5mb3JtYXRpb24KICAgICAgICAjICAgICAgdmlhIGFueSBleGlzdGluZyBzdGFsZSB6aXBpbXBvcnQuemlwaW1wb3J0ZXIgaW5zdGFuY2VzIGZhaWxzLgogICAgICAgICMgICAyLiBSZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIGNhY2hlIHNvIGFueSBuZXdseSBjb25zdHJ1Y3RlZAogICAgICAgICMgICAgICB6aXBpbXBvcnQuemlwaW1wb3J0ZXIgaW5zdGFuY2VzIGRvIG5vdCBlbmQgdXAgdXNpbmcgb2xkIHN0YWxlCiAgICAgICAgIyAgICAgIHppcCBhcmNoaXZlIGRpcmVjdG9yeSBpbmZvcm1hdGlvbi4KICAgICAgICAjIFRoaXMgd2hvbGUgc3RhbGUgZGF0YSByZW1vdmFsIHN0ZXAgZG9lcyBub3Qgc2VlbSBzdHJpY3RseSBuZWNlc3NhcnksCiAgICAgICAgIyBidXQgaGFzIGJlZW4gbGVmdCBpbiBiZWNhdXNlIGl0IHdhcyBkb25lIGJlZm9yZSB3ZSBzdGFydGVkIHJlcGxhY2luZwogICAgICAgICMgdGhlIHppcCBhcmNoaXZlIGRpcmVjdG9yeSBpbmZvcm1hdGlvbiBjYWNoZSBjb250ZW50IGlmIHBvc3NpYmxlLCBhbmQKICAgICAgICAjIHRoZXJlIGFyZSBubyByZWxldmFudCB1bml0IHRlc3RzIHRoYXQgd2UgY2FuIGRlcGVuZCBvbiB0byB0ZWxsIHVzIGlmCiAgICAgICAgIyB0aGlzIGlzIHJlYWxseSBuZWVkZWQuCiAgICAgICAgX3JlbW92ZV9hbmRfY2xlYXJfemlwX2RpcmVjdG9yeV9jYWNoZV9kYXRhKG5vcm1hbGl6ZWRfcGF0aCkKCgpkZWYgX2NvbGxlY3RfemlwaW1wb3J0ZXJfY2FjaGVfZW50cmllcyhub3JtYWxpemVkX3BhdGgsIGNhY2hlKToKICAgICIiIgogICAgUmV0dXJuIHppcGltcG9ydGVyIGNhY2hlIGVudHJ5IGtleXMgcmVsYXRlZCB0byBhIGdpdmVuIG5vcm1hbGl6ZWQgcGF0aC4KCiAgICBBbHRlcm5hdGl2ZSBwYXRoIHNwZWxsaW5ncyAoZS5nLiB0aG9zZSB1c2luZyBkaWZmZXJlbnQgY2hhcmFjdGVyIGNhc2Ugb3IKICAgIHRob3NlIHVzaW5nIGFsdGVybmF0aXZlIHBhdGggc2VwYXJhdG9ycykgcmVsYXRlZCB0byB0aGUgc2FtZSBwYXRoIGFyZQogICAgaW5jbHVkZWQuIEFueSBzdWItcGF0aCBlbnRyaWVzIGFyZSBpbmNsdWRlZCBhcyB3ZWxsLCBpLmUuIHRob3NlCiAgICBjb3JyZXNwb25kaW5nIHRvIHppcCBhcmNoaXZlcyBlbWJlZGRlZCBpbiBvdGhlciB6aXAgYXJjaGl2ZXMuCgogICAgIiIiCiAgICByZXN1bHQgPSBbXQogICAgcHJlZml4X2xlbiA9IGxlbihub3JtYWxpemVkX3BhdGgpCiAgICBmb3IgcCBpbiBjYWNoZToKICAgICAgICBucCA9IG5vcm1hbGl6ZV9wYXRoKHApCiAgICAgICAgaWYgKG5wLnN0YXJ0c3dpdGgobm9ybWFsaXplZF9wYXRoKSBhbmQKICAgICAgICAgICAgICAgIG5wW3ByZWZpeF9sZW46cHJlZml4X2xlbiArIDFdIGluIChvcy5zZXAsICcnKSk6CiAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQocCkKICAgIHJldHVybiByZXN1bHQKCgpkZWYgX3VwZGF0ZV96aXBpbXBvcnRlcl9jYWNoZShub3JtYWxpemVkX3BhdGgsIGNhY2hlLCB1cGRhdGVyPU5vbmUpOgogICAgIiIiCiAgICBVcGRhdGUgemlwaW1wb3J0ZXIgY2FjaGUgZGF0YSBmb3IgYSBnaXZlbiBub3JtYWxpemVkIHBhdGguCgogICAgQW55IHN1Yi1wYXRoIGVudHJpZXMgYXJlIHByb2Nlc3NlZCBhcyB3ZWxsLCBpLmUuIHRob3NlIGNvcnJlc3BvbmRpbmcgdG8gemlwCiAgICBhcmNoaXZlcyBlbWJlZGRlZCBpbiBvdGhlciB6aXAgYXJjaGl2ZXMuCgogICAgR2l2ZW4gdXBkYXRlciBpcyBhIGNhbGxhYmxlIHRha2luZyBhIGNhY2hlIGVudHJ5IGtleSBhbmQgdGhlIG9yaWdpbmFsIGVudHJ5CiAgICAoYWZ0ZXIgYWxyZWFkeSByZW1vdmluZyB0aGUgZW50cnkgZnJvbSB0aGUgY2FjaGUpLCBhbmQgZXhwZWN0ZWQgdG8gdXBkYXRlCiAgICB0aGUgZW50cnkgYW5kIHBvc3NpYmx5IHJldHVybiBhIG5ldyBvbmUgdG8gYmUgaW5zZXJ0ZWQgaW4gaXRzIHBsYWNlLgogICAgUmV0dXJuaW5nIE5vbmUgaW5kaWNhdGVzIHRoYXQgdGhlIGVudHJ5IHNob3VsZCBub3QgYmUgcmVwbGFjZWQgd2l0aCBhIG5ldwogICAgb25lLiBJZiBubyB1cGRhdGVyIGlzIGdpdmVuLCB0aGUgY2FjaGUgZW50cmllcyBhcmUgc2ltcGx5IHJlbW92ZWQgd2l0aG91dAogICAgYW55IGFkZGl0aW9uYWwgcHJvY2Vzc2luZywgdGhlIHNhbWUgYXMgaWYgdGhlIHVwZGF0ZXIgc2ltcGx5IHJldHVybmVkIE5vbmUuCgogICAgIiIiCiAgICBmb3IgcCBpbiBfY29sbGVjdF96aXBpbXBvcnRlcl9jYWNoZV9lbnRyaWVzKG5vcm1hbGl6ZWRfcGF0aCwgY2FjaGUpOgogICAgICAgICMgTi5CLiBweXB5J3MgY3VzdG9tIHppcGltcG9ydC5femlwX2RpcmVjdG9yeV9jYWNoZSBpbXBsZW1lbnRhdGlvbiBkb2VzCiAgICAgICAgIyBub3Qgc3VwcG9ydCB0aGUgY29tcGxldGUgZGljdCBpbnRlcmZhY2U6CiAgICAgICAgIyAqIERvZXMgbm90IHN1cHBvcnQgaXRlbSBhc3NpZ25tZW50LCB0aHVzIG5vdCBhbGxvd2luZyB0aGlzIGZ1bmN0aW9uCiAgICAgICAgIyAgICB0byBiZSB1c2VkIG9ubHkgZm9yIHJlbW92aW5nIGV4aXN0aW5nIGNhY2hlIGVudHJpZXMuCiAgICAgICAgIyAgKiBEb2VzIG5vdCBzdXBwb3J0IHRoZSBkaWN0LnBvcCgpIG1ldGhvZCwgZm9yY2luZyB1cyB0byB1c2UgdGhlCiAgICAgICAgIyAgICBnZXQvZGVsIHBhdHRlcm5zIGluc3RlYWQuIEZvciBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uIHNlZSB0aGUKICAgICAgICAjICAgIGZvbGxvd2luZyBsaW5rczoKICAgICAgICAjICAgICAgaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvc2V0dXB0b29scy9pc3N1ZXMvMjAyI2lzc3VlY29tbWVudC0yMDI5MTM0MjAKICAgICAgICAjICAgICAgaHR0cDovL2JpdC5seS8yaDlpdEpYCiAgICAgICAgb2xkX2VudHJ5ID0gY2FjaGVbcF0KICAgICAgICBkZWwgY2FjaGVbcF0KICAgICAgICBuZXdfZW50cnkgPSB1cGRhdGVyIGFuZCB1cGRhdGVyKHAsIG9sZF9lbnRyeSkKICAgICAgICBpZiBuZXdfZW50cnkgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGNhY2hlW3BdID0gbmV3X2VudHJ5CgoKZGVmIF91bmNhY2hlKG5vcm1hbGl6ZWRfcGF0aCwgY2FjaGUpOgogICAgX3VwZGF0ZV96aXBpbXBvcnRlcl9jYWNoZShub3JtYWxpemVkX3BhdGgsIGNhY2hlKQoKCmRlZiBfcmVtb3ZlX2FuZF9jbGVhcl96aXBfZGlyZWN0b3J5X2NhY2hlX2RhdGEobm9ybWFsaXplZF9wYXRoKToKICAgIGRlZiBjbGVhcl9hbmRfcmVtb3ZlX2NhY2hlZF96aXBfYXJjaGl2ZV9kaXJlY3RvcnlfZGF0YShwYXRoLCBvbGRfZW50cnkpOgogICAgICAgIG9sZF9lbnRyeS5jbGVhcigpCgogICAgX3VwZGF0ZV96aXBpbXBvcnRlcl9jYWNoZSgKICAgICAgICBub3JtYWxpemVkX3BhdGgsIHppcGltcG9ydC5femlwX2RpcmVjdG9yeV9jYWNoZSwKICAgICAgICB1cGRhdGVyPWNsZWFyX2FuZF9yZW1vdmVfY2FjaGVkX3ppcF9hcmNoaXZlX2RpcmVjdG9yeV9kYXRhKQoKCiMgUHlQeSBQeXRob24gaW1wbGVtZW50YXRpb24gZG9lcyBub3QgYWxsb3cgZGlyZWN0bHkgd3JpdGluZyB0byB0aGUKIyB6aXBpbXBvcnQuX3ppcF9kaXJlY3RvcnlfY2FjaGUgYW5kIHNvIHByZXZlbnRzIHVzIGZyb20gYXR0ZW1wdGluZyB0byBjb3JyZWN0CiMgaXRzIGNvbnRlbnQuIFRoZSBiZXN0IHdlIGNhbiBkbyB0aGVyZSBpcyBjbGVhciB0aGUgcHJvYmxlbWF0aWMgY2FjaGUgY29udGVudAojIGFuZCBoYXZlIFB5UHkgcmVwb3B1bGF0ZSBpdCBhcyBuZWVkZWQuIFRoZSBkb3duc2lkZSBpcyB0aGF0IGlmIHRoZXJlIGFyZSBhbnkKIyBzdGFsZSB6aXBpbXBvcnQuemlwaW1wb3J0ZXIgaW5zdGFuY2VzIGxheWluZyBhcm91bmQsIGF0dGVtcHRpbmcgdG8gdXNlIHRoZW0KIyB3aWxsIGZhaWwgZHVlIHRvIG5vdCBoYXZpbmcgaXRzIHppcCBhcmNoaXZlIGRpcmVjdG9yeSBpbmZvcm1hdGlvbiBhdmFpbGFibGUKIyBpbnN0ZWFkIG9mIGJlaW5nIGF1dG9tYXRpY2FsbHkgY29ycmVjdGVkIHRvIHVzZSB0aGUgbmV3IGNvcnJlY3QgemlwIGFyY2hpdmUKIyBkaXJlY3RvcnkgaW5mb3JtYXRpb24uCmlmICdfX3B5cHlfXycgaW4gc3lzLmJ1aWx0aW5fbW9kdWxlX25hbWVzOgogICAgX3JlcGxhY2VfemlwX2RpcmVjdG9yeV9jYWNoZV9kYXRhID0gXAogICAgICAgIF9yZW1vdmVfYW5kX2NsZWFyX3ppcF9kaXJlY3RvcnlfY2FjaGVfZGF0YQplbHNlOgoKICAgIGRlZiBfcmVwbGFjZV96aXBfZGlyZWN0b3J5X2NhY2hlX2RhdGEobm9ybWFsaXplZF9wYXRoKToKICAgICAgICBkZWYgcmVwbGFjZV9jYWNoZWRfemlwX2FyY2hpdmVfZGlyZWN0b3J5X2RhdGEocGF0aCwgb2xkX2VudHJ5KToKICAgICAgICAgICAgIyBOLkIuIEluIHRoZW9yeSwgd2UgY291bGQgbG9hZCB0aGUgemlwIGRpcmVjdG9yeSBpbmZvcm1hdGlvbiBqdXN0CiAgICAgICAgICAgICMgb25jZSBmb3IgYWxsIHVwZGF0ZWQgcGF0aCBzcGVsbGluZ3MsIGFuZCB0aGVuIGNvcHkgaXQgbG9jYWxseSBhbmQKICAgICAgICAgICAgIyB1cGRhdGUgaXRzIGNvbnRhaW5lZCBwYXRoIHN0cmluZ3MgdG8gY29udGFpbiB0aGUgY29ycmVjdAogICAgICAgICAgICAjIHNwZWxsaW5nLCBidXQgdGhhdCBzZWVtcyBsaWtlIGEgd2F5IHRvbyBpbnZhc2l2ZSBtb3ZlICh0aGlzIGNhY2hlCiAgICAgICAgICAgICMgc3RydWN0dXJlIGlzIG5vdCBvZmZpY2lhbGx5IGRvY3VtZW50ZWQgYW55d2hlcmUgYW5kIGNvdWxkIGluCiAgICAgICAgICAgICMgdGhlb3J5IGNoYW5nZSB3aXRoIG5ldyBQeXRob24gcmVsZWFzZXMpIGZvciBubyBzaWduaWZpY2FudAogICAgICAgICAgICAjIGJlbmVmaXQuCiAgICAgICAgICAgIG9sZF9lbnRyeS5jbGVhcigpCiAgICAgICAgICAgIHppcGltcG9ydC56aXBpbXBvcnRlcihwYXRoKQogICAgICAgICAgICBvbGRfZW50cnkudXBkYXRlKHppcGltcG9ydC5femlwX2RpcmVjdG9yeV9jYWNoZVtwYXRoXSkKICAgICAgICAgICAgcmV0dXJuIG9sZF9lbnRyeQoKICAgICAgICBfdXBkYXRlX3ppcGltcG9ydGVyX2NhY2hlKAogICAgICAgICAgICBub3JtYWxpemVkX3BhdGgsIHppcGltcG9ydC5femlwX2RpcmVjdG9yeV9jYWNoZSwKICAgICAgICAgICAgdXBkYXRlcj1yZXBsYWNlX2NhY2hlZF96aXBfYXJjaGl2ZV9kaXJlY3RvcnlfZGF0YSkKCgpkZWYgaXNfcHl0aG9uKHRleHQsIGZpbGVuYW1lPSc8c3RyaW5nPicpOgogICAgIklzIHRoaXMgc3RyaW5nIGEgdmFsaWQgUHl0aG9uIHNjcmlwdD8iCiAgICB0cnk6CiAgICAgICAgY29tcGlsZSh0ZXh0LCBmaWxlbmFtZSwgJ2V4ZWMnKQogICAgZXhjZXB0IChTeW50YXhFcnJvciwgVHlwZUVycm9yKToKICAgICAgICByZXR1cm4gRmFsc2UKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIFRydWUKCgpkZWYgaXNfc2goZXhlY3V0YWJsZSk6CiAgICAiIiJEZXRlcm1pbmUgaWYgdGhlIHNwZWNpZmllZCBleGVjdXRhYmxlIGlzIGEgLnNoIChjb250YWlucyBhICMhIGxpbmUpIiIiCiAgICB0cnk6CiAgICAgICAgd2l0aCBpby5vcGVuKGV4ZWN1dGFibGUsIGVuY29kaW5nPSdsYXRpbi0xJykgYXMgZnA6CiAgICAgICAgICAgIG1hZ2ljID0gZnAucmVhZCgyKQogICAgZXhjZXB0IChPU0Vycm9yLCBJT0Vycm9yKToKICAgICAgICByZXR1cm4gZXhlY3V0YWJsZQogICAgcmV0dXJuIG1hZ2ljID09ICcjIScKCgpkZWYgbnRfcXVvdGVfYXJnKGFyZyk6CiAgICAiIiJRdW90ZSBhIGNvbW1hbmQgbGluZSBhcmd1bWVudCBhY2NvcmRpbmcgdG8gV2luZG93cyBwYXJzaW5nIHJ1bGVzIiIiCiAgICByZXR1cm4gc3VicHJvY2Vzcy5saXN0MmNtZGxpbmUoW2FyZ10pCgoKZGVmIGlzX3B5dGhvbl9zY3JpcHQoc2NyaXB0X3RleHQsIGZpbGVuYW1lKToKICAgICIiIklzIHRoaXMgdGV4dCwgYXMgYSB3aG9sZSwgYSBQeXRob24gc2NyaXB0PyAoYXMgb3Bwb3NlZCB0byBzaGVsbC9iYXQvZXRjLgogICAgIiIiCiAgICBpZiBmaWxlbmFtZS5lbmRzd2l0aCgnLnB5Jykgb3IgZmlsZW5hbWUuZW5kc3dpdGgoJy5weXcnKToKICAgICAgICByZXR1cm4gVHJ1ZSAgIyBleHRlbnNpb24gc2F5cyBpdCdzIFB5dGhvbgogICAgaWYgaXNfcHl0aG9uKHNjcmlwdF90ZXh0LCBmaWxlbmFtZSk6CiAgICAgICAgcmV0dXJuIFRydWUgICMgaXQncyBzeW50YWN0aWNhbGx5IHZhbGlkIFB5dGhvbgogICAgaWYgc2NyaXB0X3RleHQuc3RhcnRzd2l0aCgnIyEnKToKICAgICAgICAjIEl0IGJlZ2lucyB3aXRoIGEgJyMhJyBsaW5lLCBzbyBjaGVjayBpZiAncHl0aG9uJyBpcyBpbiBpdCBzb21ld2hlcmUKICAgICAgICByZXR1cm4gJ3B5dGhvbicgaW4gc2NyaXB0X3RleHQuc3BsaXRsaW5lcygpWzBdLmxvd2VyKCkKCiAgICByZXR1cm4gRmFsc2UgICMgTm90IGFueSBQeXRob24gSSBjYW4gcmVjb2duaXplCgoKdHJ5OgogICAgZnJvbSBvcyBpbXBvcnQgY2htb2QgYXMgX2NobW9kCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICMgSnl0aG9uIGNvbXBhdGliaWxpdHkKICAgIGRlZiBfY2htb2QoKmFyZ3MpOgogICAgICAgIHBhc3MKCgpkZWYgY2htb2QocGF0aCwgbW9kZSk6CiAgICBsb2cuZGVidWcoImNoYW5naW5nIG1vZGUgb2YgJXMgdG8gJW8iLCBwYXRoLCBtb2RlKQogICAgdHJ5OgogICAgICAgIF9jaG1vZChwYXRoLCBtb2RlKQogICAgZXhjZXB0IG9zLmVycm9yIGFzIGU6CiAgICAgICAgbG9nLmRlYnVnKCJjaG1vZCBmYWlsZWQ6ICVzIiwgZSkKCgpjbGFzcyBDb21tYW5kU3BlYyhsaXN0KToKICAgICIiIgogICAgQSBjb21tYW5kIHNwZWMgZm9yIGEgIyEgaGVhZGVyLCBzcGVjaWZpZWQgYXMgYSBsaXN0IG9mIGFyZ3VtZW50cyBha2luIHRvCiAgICB0aG9zZSBwYXNzZWQgdG8gUG9wZW4uCiAgICAiIiIKCiAgICBvcHRpb25zID0gW10KICAgIHNwbGl0X2FyZ3MgPSBkaWN0KCkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBiZXN0KGNscyk6CiAgICAgICAgIiIiCiAgICAgICAgQ2hvb3NlIHRoZSBiZXN0IENvbW1hbmRTcGVjIGNsYXNzIGJhc2VkIG9uIGVudmlyb25tZW50YWwgY29uZGl0aW9ucy4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gY2xzCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgX3N5c19leGVjdXRhYmxlKGNscyk6CiAgICAgICAgX2RlZmF1bHQgPSBvcy5wYXRoLm5vcm1wYXRoKHN5cy5leGVjdXRhYmxlKQogICAgICAgIHJldHVybiBvcy5lbnZpcm9uLmdldCgnX19QWVZFTlZfTEFVTkNIRVJfXycsIF9kZWZhdWx0KQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGZyb21fcGFyYW0oY2xzLCBwYXJhbSk6CiAgICAgICAgIiIiCiAgICAgICAgQ29uc3RydWN0IGEgQ29tbWFuZFNwZWMgZnJvbSBhIHBhcmFtZXRlciB0byBidWlsZF9zY3JpcHRzLCB3aGljaCBtYXkKICAgICAgICBiZSBOb25lLgogICAgICAgICIiIgogICAgICAgIGlmIGlzaW5zdGFuY2UocGFyYW0sIGNscyk6CiAgICAgICAgICAgIHJldHVybiBwYXJhbQogICAgICAgIGlmIGlzaW5zdGFuY2UocGFyYW0sIGxpc3QpOgogICAgICAgICAgICByZXR1cm4gY2xzKHBhcmFtKQogICAgICAgIGlmIHBhcmFtIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiBjbHMuZnJvbV9lbnZpcm9ubWVudCgpCiAgICAgICAgIyBvdGhlcndpc2UsIGFzc3VtZSBpdCdzIGEgc3RyaW5nLgogICAgICAgIHJldHVybiBjbHMuZnJvbV9zdHJpbmcocGFyYW0pCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZnJvbV9lbnZpcm9ubWVudChjbHMpOgogICAgICAgIHJldHVybiBjbHMoW2Nscy5fc3lzX2V4ZWN1dGFibGUoKV0pCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZnJvbV9zdHJpbmcoY2xzLCBzdHJpbmcpOgogICAgICAgICIiIgogICAgICAgIENvbnN0cnVjdCBhIGNvbW1hbmQgc3BlYyBmcm9tIGEgc2ltcGxlIHN0cmluZyByZXByZXNlbnRpbmcgYSBjb21tYW5kCiAgICAgICAgbGluZSBwYXJzZWFibGUgYnkgc2hsZXguc3BsaXQuCiAgICAgICAgIiIiCiAgICAgICAgaXRlbXMgPSBzaGxleC5zcGxpdChzdHJpbmcsICoqY2xzLnNwbGl0X2FyZ3MpCiAgICAgICAgcmV0dXJuIGNscyhpdGVtcykKCiAgICBkZWYgaW5zdGFsbF9vcHRpb25zKHNlbGYsIHNjcmlwdF90ZXh0KToKICAgICAgICBzZWxmLm9wdGlvbnMgPSBzaGxleC5zcGxpdChzZWxmLl9leHRyYWN0X29wdGlvbnMoc2NyaXB0X3RleHQpKQogICAgICAgIGNtZGxpbmUgPSBzdWJwcm9jZXNzLmxpc3QyY21kbGluZShzZWxmKQogICAgICAgIGlmIG5vdCBpc2FzY2lpKGNtZGxpbmUpOgogICAgICAgICAgICBzZWxmLm9wdGlvbnNbOjBdID0gWycteCddCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9leHRyYWN0X29wdGlvbnMob3JpZ19zY3JpcHQpOgogICAgICAgICIiIgogICAgICAgIEV4dHJhY3QgYW55IG9wdGlvbnMgZnJvbSB0aGUgZmlyc3QgbGluZSBvZiB0aGUgc2NyaXB0LgogICAgICAgICIiIgogICAgICAgIGZpcnN0ID0gKG9yaWdfc2NyaXB0ICsgJ1xuJykuc3BsaXRsaW5lcygpWzBdCiAgICAgICAgbWF0Y2ggPSBfZmlyc3RfbGluZV9yZSgpLm1hdGNoKGZpcnN0KQogICAgICAgIG9wdGlvbnMgPSBtYXRjaC5ncm91cCgxKSBvciAnJyBpZiBtYXRjaCBlbHNlICcnCiAgICAgICAgcmV0dXJuIG9wdGlvbnMuc3RyaXAoKQoKICAgIGRlZiBhc19oZWFkZXIoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYuX3JlbmRlcihzZWxmICsgbGlzdChzZWxmLm9wdGlvbnMpKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfc3RyaXBfcXVvdGVzKGl0ZW0pOgogICAgICAgIF9RVU9URVMgPSAnIlwnJwogICAgICAgIGZvciBxIGluIF9RVU9URVM6CiAgICAgICAgICAgIGlmIGl0ZW0uc3RhcnRzd2l0aChxKSBhbmQgaXRlbS5lbmRzd2l0aChxKToKICAgICAgICAgICAgICAgIHJldHVybiBpdGVtWzE6LTFdCiAgICAgICAgcmV0dXJuIGl0ZW0KCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX3JlbmRlcihpdGVtcyk6CiAgICAgICAgY21kbGluZSA9IHN1YnByb2Nlc3MubGlzdDJjbWRsaW5lKAogICAgICAgICAgICBDb21tYW5kU3BlYy5fc3RyaXBfcXVvdGVzKGl0ZW0uc3RyaXAoKSkgZm9yIGl0ZW0gaW4gaXRlbXMpCiAgICAgICAgcmV0dXJuICcjIScgKyBjbWRsaW5lICsgJ1xuJwoKCiMgRm9yIHBiciBjb21wYXQ7IHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uLgpzeXNfZXhlY3V0YWJsZSA9IENvbW1hbmRTcGVjLl9zeXNfZXhlY3V0YWJsZSgpCgoKY2xhc3MgV2luZG93c0NvbW1hbmRTcGVjKENvbW1hbmRTcGVjKToKICAgIHNwbGl0X2FyZ3MgPSBkaWN0KHBvc2l4PUZhbHNlKQoKCmNsYXNzIFNjcmlwdFdyaXRlcihvYmplY3QpOgogICAgIiIiCiAgICBFbmNhcHN1bGF0ZXMgYmVoYXZpb3IgYXJvdW5kIHdyaXRpbmcgZW50cnkgcG9pbnQgc2NyaXB0cyBmb3IgY29uc29sZSBhbmQKICAgIGd1aSBhcHBzLgogICAgIiIiCgogICAgdGVtcGxhdGUgPSB0ZXh0d3JhcC5kZWRlbnQociIiIgogICAgICAgICMgRUFTWS1JTlNUQUxMLUVOVFJZLVNDUklQVDogJShzcGVjKXIsJShncm91cClyLCUobmFtZSlyCiAgICAgICAgX19yZXF1aXJlc19fID0gJShzcGVjKXIKICAgICAgICBpbXBvcnQgcmUKICAgICAgICBpbXBvcnQgc3lzCiAgICAgICAgZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCBsb2FkX2VudHJ5X3BvaW50CgogICAgICAgIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgICAgICAgIHN5cy5hcmd2WzBdID0gcmUuc3ViKHInKC1zY3JpcHRcLnB5dz98XC5leGUpPyQnLCAnJywgc3lzLmFyZ3ZbMF0pCiAgICAgICAgICAgIHN5cy5leGl0KAogICAgICAgICAgICAgICAgbG9hZF9lbnRyeV9wb2ludCglKHNwZWMpciwgJShncm91cClyLCAlKG5hbWUpcikoKQogICAgICAgICAgICApCiAgICAiIiIpLmxzdHJpcCgpCgogICAgY29tbWFuZF9zcGVjX2NsYXNzID0gQ29tbWFuZFNwZWMKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBnZXRfc2NyaXB0X2FyZ3MoY2xzLCBkaXN0LCBleGVjdXRhYmxlPU5vbmUsIHdpbmluc3Q9RmFsc2UpOgogICAgICAgICMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKICAgICAgICB3YXJuaW5ncy53YXJuKCJVc2UgZ2V0X2FyZ3MiLCBEZXByZWNhdGlvbldhcm5pbmcpCiAgICAgICAgd3JpdGVyID0gKFdpbmRvd3NTY3JpcHRXcml0ZXIgaWYgd2luaW5zdCBlbHNlIFNjcmlwdFdyaXRlcikuYmVzdCgpCiAgICAgICAgaGVhZGVyID0gY2xzLmdldF9zY3JpcHRfaGVhZGVyKCIiLCBleGVjdXRhYmxlLCB3aW5pbnN0KQogICAgICAgIHJldHVybiB3cml0ZXIuZ2V0X2FyZ3MoZGlzdCwgaGVhZGVyKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGdldF9zY3JpcHRfaGVhZGVyKGNscywgc2NyaXB0X3RleHQsIGV4ZWN1dGFibGU9Tm9uZSwgd2luaW5zdD1GYWxzZSk6CiAgICAgICAgIyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQogICAgICAgIHdhcm5pbmdzLndhcm4oIlVzZSBnZXRfaGVhZGVyIiwgRGVwcmVjYXRpb25XYXJuaW5nKQogICAgICAgIGlmIHdpbmluc3Q6CiAgICAgICAgICAgIGV4ZWN1dGFibGUgPSAicHl0aG9uLmV4ZSIKICAgICAgICBjbWQgPSBjbHMuY29tbWFuZF9zcGVjX2NsYXNzLmJlc3QoKS5mcm9tX3BhcmFtKGV4ZWN1dGFibGUpCiAgICAgICAgY21kLmluc3RhbGxfb3B0aW9ucyhzY3JpcHRfdGV4dCkKICAgICAgICByZXR1cm4gY21kLmFzX2hlYWRlcigpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZ2V0X2FyZ3MoY2xzLCBkaXN0LCBoZWFkZXI9Tm9uZSk6CiAgICAgICAgIiIiCiAgICAgICAgWWllbGQgd3JpdGVfc2NyaXB0KCkgYXJndW1lbnQgdHVwbGVzIGZvciBhIGRpc3RyaWJ1dGlvbidzCiAgICAgICAgY29uc29sZV9zY3JpcHRzIGFuZCBndWlfc2NyaXB0cyBlbnRyeSBwb2ludHMuCiAgICAgICAgIiIiCiAgICAgICAgaWYgaGVhZGVyIGlzIE5vbmU6CiAgICAgICAgICAgIGhlYWRlciA9IGNscy5nZXRfaGVhZGVyKCkKICAgICAgICBzcGVjID0gc3RyKGRpc3QuYXNfcmVxdWlyZW1lbnQoKSkKICAgICAgICBmb3IgdHlwZV8gaW4gJ2NvbnNvbGUnLCAnZ3VpJzoKICAgICAgICAgICAgZ3JvdXAgPSB0eXBlXyArICdfc2NyaXB0cycKICAgICAgICAgICAgZm9yIG5hbWUsIGVwIGluIGRpc3QuZ2V0X2VudHJ5X21hcChncm91cCkuaXRlbXMoKToKICAgICAgICAgICAgICAgIGNscy5fZW5zdXJlX3NhZmVfbmFtZShuYW1lKQogICAgICAgICAgICAgICAgc2NyaXB0X3RleHQgPSBjbHMudGVtcGxhdGUgJSBsb2NhbHMoKQogICAgICAgICAgICAgICAgYXJncyA9IGNscy5fZ2V0X3NjcmlwdF9hcmdzKHR5cGVfLCBuYW1lLCBoZWFkZXIsIHNjcmlwdF90ZXh0KQogICAgICAgICAgICAgICAgZm9yIHJlcyBpbiBhcmdzOgogICAgICAgICAgICAgICAgICAgIHlpZWxkIHJlcwoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfZW5zdXJlX3NhZmVfbmFtZShuYW1lKToKICAgICAgICAiIiIKICAgICAgICBQcmV2ZW50IHBhdGhzIGluICpfc2NyaXB0cyBlbnRyeSBwb2ludCBuYW1lcy4KICAgICAgICAiIiIKICAgICAgICBoYXNfcGF0aF9zZXAgPSByZS5zZWFyY2gocidbXFwvXScsIG5hbWUpCiAgICAgICAgaWYgaGFzX3BhdGhfc2VwOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJQYXRoIHNlcGFyYXRvcnMgbm90IGFsbG93ZWQgaW4gc2NyaXB0IG5hbWVzIikKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBnZXRfd3JpdGVyKGNscywgZm9yY2Vfd2luZG93cyk6CiAgICAgICAgIyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQogICAgICAgIHdhcm5pbmdzLndhcm4oIlVzZSBiZXN0IiwgRGVwcmVjYXRpb25XYXJuaW5nKQogICAgICAgIHJldHVybiBXaW5kb3dzU2NyaXB0V3JpdGVyLmJlc3QoKSBpZiBmb3JjZV93aW5kb3dzIGVsc2UgY2xzLmJlc3QoKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGJlc3QoY2xzKToKICAgICAgICAiIiIKICAgICAgICBTZWxlY3QgdGhlIGJlc3QgU2NyaXB0V3JpdGVyIGZvciB0aGlzIGVudmlyb25tZW50LgogICAgICAgICIiIgogICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInIG9yIChvcy5uYW1lID09ICdqYXZhJyBhbmQgb3MuX25hbWUgPT0gJ250Jyk6CiAgICAgICAgICAgIHJldHVybiBXaW5kb3dzU2NyaXB0V3JpdGVyLmJlc3QoKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBjbHMKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfZ2V0X3NjcmlwdF9hcmdzKGNscywgdHlwZV8sIG5hbWUsIGhlYWRlciwgc2NyaXB0X3RleHQpOgogICAgICAgICMgU2ltcGx5IHdyaXRlIHRoZSBzdHViIHdpdGggbm8gZXh0ZW5zaW9uLgogICAgICAgIHlpZWxkIChuYW1lLCBoZWFkZXIgKyBzY3JpcHRfdGV4dCkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBnZXRfaGVhZGVyKGNscywgc2NyaXB0X3RleHQ9IiIsIGV4ZWN1dGFibGU9Tm9uZSk6CiAgICAgICAgIiIiQ3JlYXRlIGEgIyEgbGluZSwgZ2V0dGluZyBvcHRpb25zIChpZiBhbnkpIGZyb20gc2NyaXB0X3RleHQiIiIKICAgICAgICBjbWQgPSBjbHMuY29tbWFuZF9zcGVjX2NsYXNzLmJlc3QoKS5mcm9tX3BhcmFtKGV4ZWN1dGFibGUpCiAgICAgICAgY21kLmluc3RhbGxfb3B0aW9ucyhzY3JpcHRfdGV4dCkKICAgICAgICByZXR1cm4gY21kLmFzX2hlYWRlcigpCgoKY2xhc3MgV2luZG93c1NjcmlwdFdyaXRlcihTY3JpcHRXcml0ZXIpOgogICAgY29tbWFuZF9zcGVjX2NsYXNzID0gV2luZG93c0NvbW1hbmRTcGVjCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgZ2V0X3dyaXRlcihjbHMpOgogICAgICAgICMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKICAgICAgICB3YXJuaW5ncy53YXJuKCJVc2UgYmVzdCIsIERlcHJlY2F0aW9uV2FybmluZykKICAgICAgICByZXR1cm4gY2xzLmJlc3QoKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGJlc3QoY2xzKToKICAgICAgICAiIiIKICAgICAgICBTZWxlY3QgdGhlIGJlc3QgU2NyaXB0V3JpdGVyIHN1aXRhYmxlIGZvciBXaW5kb3dzCiAgICAgICAgIiIiCiAgICAgICAgd3JpdGVyX2xvb2t1cCA9IGRpY3QoCiAgICAgICAgICAgIGV4ZWN1dGFibGU9V2luZG93c0V4ZWN1dGFibGVMYXVuY2hlcldyaXRlciwKICAgICAgICAgICAgbmF0dXJhbD1jbHMsCiAgICAgICAgKQogICAgICAgICMgZm9yIGNvbXBhdGliaWxpdHksIHVzZSB0aGUgZXhlY3V0YWJsZSBsYXVuY2hlciBieSBkZWZhdWx0CiAgICAgICAgbGF1bmNoZXIgPSBvcy5lbnZpcm9uLmdldCgnU0VUVVBUT09MU19MQVVOQ0hFUicsICdleGVjdXRhYmxlJykKICAgICAgICByZXR1cm4gd3JpdGVyX2xvb2t1cFtsYXVuY2hlcl0KCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfZ2V0X3NjcmlwdF9hcmdzKGNscywgdHlwZV8sIG5hbWUsIGhlYWRlciwgc2NyaXB0X3RleHQpOgogICAgICAgICJGb3IgV2luZG93cywgYWRkIGEgLnB5IGV4dGVuc2lvbiIKICAgICAgICBleHQgPSBkaWN0KGNvbnNvbGU9Jy5weWEnLCBndWk9Jy5weXcnKVt0eXBlX10KICAgICAgICBpZiBleHQgbm90IGluIG9zLmVudmlyb25bJ1BBVEhFWFQnXS5sb3dlcigpLnNwbGl0KCc7Jyk6CiAgICAgICAgICAgIG1zZyA9ICgKICAgICAgICAgICAgICAgICJ7ZXh0fSBub3QgbGlzdGVkIGluIFBBVEhFWFQ7IHNjcmlwdHMgd2lsbCBub3QgYmUgIgogICAgICAgICAgICAgICAgInJlY29nbml6ZWQgYXMgZXhlY3V0YWJsZXMuIgogICAgICAgICAgICApLmZvcm1hdCgqKmxvY2FscygpKQogICAgICAgICAgICB3YXJuaW5ncy53YXJuKG1zZywgVXNlcldhcm5pbmcpCiAgICAgICAgb2xkID0gWycucHlhJywgJy5weScsICctc2NyaXB0LnB5JywgJy5weWMnLCAnLnB5bycsICcucHl3JywgJy5leGUnXQogICAgICAgIG9sZC5yZW1vdmUoZXh0KQogICAgICAgIGhlYWRlciA9IGNscy5fYWRqdXN0X2hlYWRlcih0eXBlXywgaGVhZGVyKQogICAgICAgIGJsb2NrZXJzID0gW25hbWUgKyB4IGZvciB4IGluIG9sZF0KICAgICAgICB5aWVsZCBuYW1lICsgZXh0LCBoZWFkZXIgKyBzY3JpcHRfdGV4dCwgJ3QnLCBibG9ja2VycwoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9hZGp1c3RfaGVhZGVyKGNscywgdHlwZV8sIG9yaWdfaGVhZGVyKToKICAgICAgICAiIiIKICAgICAgICBNYWtlIHN1cmUgJ3B5dGhvbncnIGlzIHVzZWQgZm9yIGd1aSBhbmQgYW5kICdweXRob24nIGlzIHVzZWQgZm9yCiAgICAgICAgY29uc29sZSAocmVnYXJkbGVzcyBvZiB3aGF0IHN5cy5leGVjdXRhYmxlIGlzKS4KICAgICAgICAiIiIKICAgICAgICBwYXR0ZXJuID0gJ3B5dGhvbncuZXhlJwogICAgICAgIHJlcGwgPSAncHl0aG9uLmV4ZScKICAgICAgICBpZiB0eXBlXyA9PSAnZ3VpJzoKICAgICAgICAgICAgcGF0dGVybiwgcmVwbCA9IHJlcGwsIHBhdHRlcm4KICAgICAgICBwYXR0ZXJuX29iID0gcmUuY29tcGlsZShyZS5lc2NhcGUocGF0dGVybiksIHJlLklHTk9SRUNBU0UpCiAgICAgICAgbmV3X2hlYWRlciA9IHBhdHRlcm5fb2Iuc3ViKHN0cmluZz1vcmlnX2hlYWRlciwgcmVwbD1yZXBsKQogICAgICAgIHJldHVybiBuZXdfaGVhZGVyIGlmIGNscy5fdXNlX2hlYWRlcihuZXdfaGVhZGVyKSBlbHNlIG9yaWdfaGVhZGVyCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF91c2VfaGVhZGVyKG5ld19oZWFkZXIpOgogICAgICAgICIiIgogICAgICAgIFNob3VsZCBfYWRqdXN0X2hlYWRlciB1c2UgdGhlIHJlcGxhY2VkIGhlYWRlcj8KCiAgICAgICAgT24gbm9uLXdpbmRvd3Mgc3lzdGVtcywgYWx3YXlzIHVzZS4gT24KICAgICAgICBXaW5kb3dzIHN5c3RlbXMsIG9ubHkgdXNlIHRoZSByZXBsYWNlZCBoZWFkZXIgaWYgaXQgcmVzb2x2ZXMKICAgICAgICB0byBhbiBleGVjdXRhYmxlIG9uIHRoZSBzeXN0ZW0uCiAgICAgICAgIiIiCiAgICAgICAgY2xlYW5faGVhZGVyID0gbmV3X2hlYWRlclsyOi0xXS5zdHJpcCgnIicpCiAgICAgICAgcmV0dXJuIHN5cy5wbGF0Zm9ybSAhPSAnd2luMzInIG9yIGZpbmRfZXhlY3V0YWJsZShjbGVhbl9oZWFkZXIpCgoKY2xhc3MgV2luZG93c0V4ZWN1dGFibGVMYXVuY2hlcldyaXRlcihXaW5kb3dzU2NyaXB0V3JpdGVyKToKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9nZXRfc2NyaXB0X2FyZ3MoY2xzLCB0eXBlXywgbmFtZSwgaGVhZGVyLCBzY3JpcHRfdGV4dCk6CiAgICAgICAgIiIiCiAgICAgICAgRm9yIFdpbmRvd3MsIGFkZCBhIC5weSBleHRlbnNpb24gYW5kIGFuIC5leGUgbGF1bmNoZXIKICAgICAgICAiIiIKICAgICAgICBpZiB0eXBlXyA9PSAnZ3VpJzoKICAgICAgICAgICAgbGF1bmNoZXJfdHlwZSA9ICdndWknCiAgICAgICAgICAgIGV4dCA9ICctc2NyaXB0LnB5dycKICAgICAgICAgICAgb2xkID0gWycucHl3J10KICAgICAgICBlbHNlOgogICAgICAgICAgICBsYXVuY2hlcl90eXBlID0gJ2NsaScKICAgICAgICAgICAgZXh0ID0gJy1zY3JpcHQucHknCiAgICAgICAgICAgIG9sZCA9IFsnLnB5JywgJy5weWMnLCAnLnB5byddCiAgICAgICAgaGRyID0gY2xzLl9hZGp1c3RfaGVhZGVyKHR5cGVfLCBoZWFkZXIpCiAgICAgICAgYmxvY2tlcnMgPSBbbmFtZSArIHggZm9yIHggaW4gb2xkXQogICAgICAgIHlpZWxkIChuYW1lICsgZXh0LCBoZHIgKyBzY3JpcHRfdGV4dCwgJ3QnLCBibG9ja2VycykKICAgICAgICB5aWVsZCAoCiAgICAgICAgICAgIG5hbWUgKyAnLmV4ZScsIGdldF93aW5fbGF1bmNoZXIobGF1bmNoZXJfdHlwZSksCiAgICAgICAgICAgICdiJyAgIyB3cml0ZSBpbiBiaW5hcnkgbW9kZQogICAgICAgICkKICAgICAgICBpZiBub3QgaXNfNjRiaXQoKToKICAgICAgICAgICAgIyBpbnN0YWxsIGEgbWFuaWZlc3QgZm9yIHRoZSBsYXVuY2hlciB0byBwcmV2ZW50IFdpbmRvd3MKICAgICAgICAgICAgIyBmcm9tIGRldGVjdGluZyBpdCBhcyBhbiBpbnN0YWxsZXIgKHdoaWNoIGl0IHdpbGwgZm9yCiAgICAgICAgICAgICMgIGxhdW5jaGVycyBsaWtlIGVhc3lfaW5zdGFsbC5leGUpLiBDb25zaWRlciBvbmx5CiAgICAgICAgICAgICMgIGFkZGluZyBhIG1hbmlmZXN0IGZvciBsYXVuY2hlcnMgZGV0ZWN0ZWQgYXMgaW5zdGFsbGVycy4KICAgICAgICAgICAgIyAgU2VlIERpc3RyaWJ1dGUgIzE0MyBmb3IgZGV0YWlscy4KICAgICAgICAgICAgbV9uYW1lID0gbmFtZSArICcuZXhlLm1hbmlmZXN0JwogICAgICAgICAgICB5aWVsZCAobV9uYW1lLCBsb2FkX2xhdW5jaGVyX21hbmlmZXN0KG5hbWUpLCAndCcpCgoKIyBmb3IgYmFja3dhcmQtY29tcGF0aWJpbGl0eQpnZXRfc2NyaXB0X2FyZ3MgPSBTY3JpcHRXcml0ZXIuZ2V0X3NjcmlwdF9hcmdzCmdldF9zY3JpcHRfaGVhZGVyID0gU2NyaXB0V3JpdGVyLmdldF9zY3JpcHRfaGVhZGVyCgoKZGVmIGdldF93aW5fbGF1bmNoZXIodHlwZSk6CiAgICAiIiIKICAgIExvYWQgdGhlIFdpbmRvd3MgbGF1bmNoZXIgKGV4ZWN1dGFibGUpIHN1aXRhYmxlIGZvciBsYXVuY2hpbmcgYSBzY3JpcHQuCgogICAgYHR5cGVgIHNob3VsZCBiZSBlaXRoZXIgJ2NsaScgb3IgJ2d1aScKCiAgICBSZXR1cm5zIHRoZSBleGVjdXRhYmxlIGFzIGEgYnl0ZSBzdHJpbmcuCiAgICAiIiIKICAgIGxhdW5jaGVyX2ZuID0gJyVzLmV4ZScgJSB0eXBlCiAgICBpZiBpc182NGJpdCgpOgogICAgICAgIGxhdW5jaGVyX2ZuID0gbGF1bmNoZXJfZm4ucmVwbGFjZSgiLiIsICItNjQuIikKICAgIGVsc2U6CiAgICAgICAgbGF1bmNoZXJfZm4gPSBsYXVuY2hlcl9mbi5yZXBsYWNlKCIuIiwgIi0zMi4iKQogICAgcmV0dXJuIHJlc291cmNlX3N0cmluZygnc2V0dXB0b29scycsIGxhdW5jaGVyX2ZuKQoKCmRlZiBsb2FkX2xhdW5jaGVyX21hbmlmZXN0KG5hbWUpOgogICAgbWFuaWZlc3QgPSBwa2dfcmVzb3VyY2VzLnJlc291cmNlX3N0cmluZyhfX25hbWVfXywgJ2xhdW5jaGVyIG1hbmlmZXN0LnhtbCcpCiAgICBpZiBzaXguUFkyOgogICAgICAgIHJldHVybiBtYW5pZmVzdCAlIHZhcnMoKQogICAgZWxzZToKICAgICAgICByZXR1cm4gbWFuaWZlc3QuZGVjb2RlKCd1dGYtOCcpICUgdmFycygpCgoKZGVmIHJtdHJlZShwYXRoLCBpZ25vcmVfZXJyb3JzPUZhbHNlLCBvbmVycm9yPWF1dG9fY2htb2QpOgogICAgcmV0dXJuIHNodXRpbC5ybXRyZWUocGF0aCwgaWdub3JlX2Vycm9ycywgb25lcnJvcikKCgpkZWYgY3VycmVudF91bWFzaygpOgogICAgdG1wID0gb3MudW1hc2soMG8wMjIpCiAgICBvcy51bWFzayh0bXApCiAgICByZXR1cm4gdG1wCgoKZGVmIGJvb3RzdHJhcCgpOgogICAgIyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHNldHVwdG9vbHMqLmVnZyBpcyBydW4gdXNpbmcgL2Jpbi9zaAogICAgaW1wb3J0IHNldHVwdG9vbHMKCiAgICBhcmd2MCA9IG9zLnBhdGguZGlybmFtZShzZXR1cHRvb2xzLl9fcGF0aF9fWzBdKQogICAgc3lzLmFyZ3ZbMF0gPSBhcmd2MAogICAgc3lzLmFyZ3YuYXBwZW5kKGFyZ3YwKQogICAgbWFpbigpCgoKZGVmIG1haW4oYXJndj1Ob25lLCAqKmt3KToKICAgIGZyb20gc2V0dXB0b29scyBpbXBvcnQgc2V0dXAKICAgIGZyb20gc2V0dXB0b29scy5kaXN0IGltcG9ydCBEaXN0cmlidXRpb24KCiAgICBjbGFzcyBEaXN0cmlidXRpb25XaXRob3V0SGVscENvbW1hbmRzKERpc3RyaWJ1dGlvbik6CiAgICAgICAgY29tbW9uX3VzYWdlID0gIiIKCiAgICAgICAgZGVmIF9zaG93X2hlbHAoc2VsZiwgKmFyZ3MsICoqa3cpOgogICAgICAgICAgICB3aXRoIF9wYXRjaF91c2FnZSgpOgogICAgICAgICAgICAgICAgRGlzdHJpYnV0aW9uLl9zaG93X2hlbHAoc2VsZiwgKmFyZ3MsICoqa3cpCgogICAgaWYgYXJndiBpcyBOb25lOgogICAgICAgIGFyZ3YgPSBzeXMuYXJndlsxOl0KCiAgICB3aXRoIF9wYXRjaF91c2FnZSgpOgogICAgICAgIHNldHVwKAogICAgICAgICAgICBzY3JpcHRfYXJncz1bJy1xJywgJ2Vhc3lfaW5zdGFsbCcsICctdiddICsgYXJndiwKICAgICAgICAgICAgc2NyaXB0X25hbWU9c3lzLmFyZ3ZbMF0gb3IgJ2Vhc3lfaW5zdGFsbCcsCiAgICAgICAgICAgIGRpc3RjbGFzcz1EaXN0cmlidXRpb25XaXRob3V0SGVscENvbW1hbmRzLAogICAgICAgICAgICAqKmt3CiAgICAgICAgKQoKCkBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCmRlZiBfcGF0Y2hfdXNhZ2UoKToKICAgIGltcG9ydCBkaXN0dXRpbHMuY29yZQogICAgVVNBR0UgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiCiAgICAgICAgdXNhZ2U6ICUoc2NyaXB0KXMgW29wdGlvbnNdIHJlcXVpcmVtZW50X29yX3VybCAuLi4KICAgICAgICAgICBvcjogJShzY3JpcHQpcyAtLWhlbHAKICAgICAgICAiIiIpLmxzdHJpcCgpCgogICAgZGVmIGdlbl91c2FnZShzY3JpcHRfbmFtZSk6CiAgICAgICAgcmV0dXJuIFVTQUdFICUgZGljdCgKICAgICAgICAgICAgc2NyaXB0PW9zLnBhdGguYmFzZW5hbWUoc2NyaXB0X25hbWUpLAogICAgICAgICkKCiAgICBzYXZlZCA9IGRpc3R1dGlscy5jb3JlLmdlbl91c2FnZQogICAgZGlzdHV0aWxzLmNvcmUuZ2VuX3VzYWdlID0gZ2VuX3VzYWdlCiAgICB0cnk6CiAgICAgICAgeWllbGQKICAgIGZpbmFsbHk6CiAgICAgICAgZGlzdHV0aWxzLmNvcmUuZ2VuX3VzYWdlID0gc2F2ZWQKUEsDBBQAAAAAAAAAIQBOLHJCcGEAAHBhAAA2AAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL2VnZ19pbmZvLnB5IiIic2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvCgpDcmVhdGUgYSBkaXN0cmlidXRpb24ncyAuZWdnLWluZm8gZGlyZWN0b3J5IGFuZCBjb250ZW50cyIiIgoKZnJvbSBkaXN0dXRpbHMuZmlsZWxpc3QgaW1wb3J0IEZpbGVMaXN0IGFzIF9GaWxlTGlzdApmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0ludGVybmFsRXJyb3IKZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgY29udmVydF9wYXRoCmZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKaW1wb3J0IGRpc3R1dGlscy5lcnJvcnMKaW1wb3J0IGRpc3R1dGlscy5maWxlbGlzdAppbXBvcnQgb3MKaW1wb3J0IHJlCmltcG9ydCBzeXMKaW1wb3J0IGlvCmltcG9ydCB3YXJuaW5ncwppbXBvcnQgdGltZQppbXBvcnQgY29sbGVjdGlvbnMKCmZyb20gc2V0dXB0b29scy5leHRlcm4gaW1wb3J0IHNpeApmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeC5tb3ZlcyBpbXBvcnQgbWFwCgpmcm9tIHNldHVwdG9vbHMgaW1wb3J0IENvbW1hbmQKZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQuc2Rpc3QgaW1wb3J0IHNkaXN0CmZyb20gc2V0dXB0b29scy5jb21tYW5kLnNkaXN0IGltcG9ydCB3YWxrX3JldmN0cmwKZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQuc2V0b3B0IGltcG9ydCBlZGl0X2NvbmZpZwpmcm9tIHNldHVwdG9vbHMuY29tbWFuZCBpbXBvcnQgYmRpc3RfZWdnCmZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgKAogICAgcGFyc2VfcmVxdWlyZW1lbnRzLCBzYWZlX25hbWUsIHBhcnNlX3ZlcnNpb24sCiAgICBzYWZlX3ZlcnNpb24sIHlpZWxkX2xpbmVzLCBFbnRyeVBvaW50LCBpdGVyX2VudHJ5X3BvaW50cywgdG9fZmlsZW5hbWUpCmltcG9ydCBzZXR1cHRvb2xzLnVuaWNvZGVfdXRpbHMgYXMgdW5pY29kZV91dGlscwpmcm9tIHNldHVwdG9vbHMuZ2xvYiBpbXBvcnQgZ2xvYgoKZnJvbSBwa2dfcmVzb3VyY2VzLmV4dGVybiBpbXBvcnQgcGFja2FnaW5nCgoKZGVmIHRyYW5zbGF0ZV9wYXR0ZXJuKGdsb2IpOgogICAgIiIiCiAgICBUcmFuc2xhdGUgYSBmaWxlIHBhdGggZ2xvYiBsaWtlICcqLnR4dCcgaW4gdG8gYSByZWd1bGFyIGV4cHJlc3Npb24uCiAgICBUaGlzIGRpZmZlcnMgZnJvbSBmbm1hdGNoLnRyYW5zbGF0ZSB3aGljaCBhbGxvd3Mgd2lsZGNhcmRzIHRvIG1hdGNoCiAgICBkaXJlY3Rvcnkgc2VwYXJhdG9ycy4gSXQgYWxzbyBrbm93cyBhYm91dCAnKiovJyB3aGljaCBtYXRjaGVzIGFueSBudW1iZXIgb2YKICAgIGRpcmVjdG9yaWVzLgogICAgIiIiCiAgICBwYXQgPSAnJwoKICAgICMgVGhpcyB3aWxsIHNwbGl0IG9uICcvJyB3aXRoaW4gW2NoYXJhY3RlciBjbGFzc2VzXS4gVGhpcyBpcyBkZWxpYmVyYXRlLgogICAgY2h1bmtzID0gZ2xvYi5zcGxpdChvcy5wYXRoLnNlcCkKCiAgICBzZXAgPSByZS5lc2NhcGUob3Muc2VwKQogICAgdmFsaWRfY2hhciA9ICdbXiVzXScgJSAoc2VwLCkKCiAgICBmb3IgYywgY2h1bmsgaW4gZW51bWVyYXRlKGNodW5rcyk6CiAgICAgICAgbGFzdF9jaHVuayA9IGMgPT0gbGVuKGNodW5rcykgLSAxCgogICAgICAgICMgQ2h1bmtzIHRoYXQgYXJlIGEgbGl0ZXJhbCAqKiBhcmUgZ2xvYnN0YXJzLiBUaGV5IG1hdGNoIGFueXRoaW5nLgogICAgICAgIGlmIGNodW5rID09ICcqKic6CiAgICAgICAgICAgIGlmIGxhc3RfY2h1bms6CiAgICAgICAgICAgICAgICAjIE1hdGNoIGFueXRoaW5nIGlmIHRoaXMgaXMgdGhlIGxhc3QgY29tcG9uZW50CiAgICAgICAgICAgICAgICBwYXQgKz0gJy4qJwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBNYXRjaCAnKG5hbWUvKSonCiAgICAgICAgICAgICAgICBwYXQgKz0gJyg/OiVzKyVzKSonICUgKHZhbGlkX2NoYXIsIHNlcCkKICAgICAgICAgICAgY29udGludWUgICMgQnJlYWsgaGVyZSBhcyB0aGUgd2hvbGUgcGF0aCBjb21wb25lbnQgaGFzIGJlZW4gaGFuZGxlZAoKICAgICAgICAjIEZpbmQgYW55IHNwZWNpYWwgY2hhcmFjdGVycyBpbiB0aGUgcmVtYWluZGVyCiAgICAgICAgaSA9IDAKICAgICAgICBjaHVua19sZW4gPSBsZW4oY2h1bmspCiAgICAgICAgd2hpbGUgaSA8IGNodW5rX2xlbjoKICAgICAgICAgICAgY2hhciA9IGNodW5rW2ldCiAgICAgICAgICAgIGlmIGNoYXIgPT0gJyonOgogICAgICAgICAgICAgICAgIyBNYXRjaCBhbnkgbnVtYmVyIG9mIG5hbWUgY2hhcmFjdGVycwogICAgICAgICAgICAgICAgcGF0ICs9IHZhbGlkX2NoYXIgKyAnKicKICAgICAgICAgICAgZWxpZiBjaGFyID09ICc/JzoKICAgICAgICAgICAgICAgICMgTWF0Y2ggYSBuYW1lIGNoYXJhY3RlcgogICAgICAgICAgICAgICAgcGF0ICs9IHZhbGlkX2NoYXIKICAgICAgICAgICAgZWxpZiBjaGFyID09ICdbJzoKICAgICAgICAgICAgICAgICMgQ2hhcmFjdGVyIGNsYXNzCiAgICAgICAgICAgICAgICBpbm5lcl9pID0gaSArIDEKICAgICAgICAgICAgICAgICMgU2tpcCBpbml0aWFsICEvXSBjaGFycwogICAgICAgICAgICAgICAgaWYgaW5uZXJfaSA8IGNodW5rX2xlbiBhbmQgY2h1bmtbaW5uZXJfaV0gPT0gJyEnOgogICAgICAgICAgICAgICAgICAgIGlubmVyX2kgPSBpbm5lcl9pICsgMQogICAgICAgICAgICAgICAgaWYgaW5uZXJfaSA8IGNodW5rX2xlbiBhbmQgY2h1bmtbaW5uZXJfaV0gPT0gJ10nOgogICAgICAgICAgICAgICAgICAgIGlubmVyX2kgPSBpbm5lcl9pICsgMQoKICAgICAgICAgICAgICAgICMgTG9vcCB0aWxsIHRoZSBjbG9zaW5nIF0gaXMgZm91bmQKICAgICAgICAgICAgICAgIHdoaWxlIGlubmVyX2kgPCBjaHVua19sZW4gYW5kIGNodW5rW2lubmVyX2ldICE9ICddJzoKICAgICAgICAgICAgICAgICAgICBpbm5lcl9pID0gaW5uZXJfaSArIDEKCiAgICAgICAgICAgICAgICBpZiBpbm5lcl9pID49IGNodW5rX2xlbjoKICAgICAgICAgICAgICAgICAgICAjIEdvdCB0byB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgd2l0aG91dCBmaW5kaW5nIGEgY2xvc2luZyBdCiAgICAgICAgICAgICAgICAgICAgIyBEbyBub3QgdHJlYXQgdGhpcyBhcyBhIG1hdGNoaW5nIGdyb3VwLCBidXQgYXMgYSBsaXRlcmFsIFsKICAgICAgICAgICAgICAgICAgICBwYXQgKz0gcmUuZXNjYXBlKGNoYXIpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICMgR3JhYiB0aGUgaW5zaWRlcyBvZiB0aGUgW2JyYWNrZXRzXQogICAgICAgICAgICAgICAgICAgIGlubmVyID0gY2h1bmtbaSArIDE6aW5uZXJfaV0KICAgICAgICAgICAgICAgICAgICBjaGFyX2NsYXNzID0gJycKCiAgICAgICAgICAgICAgICAgICAgIyBDbGFzcyBuZWdhdGlvbgogICAgICAgICAgICAgICAgICAgIGlmIGlubmVyWzBdID09ICchJzoKICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl9jbGFzcyA9ICdeJwogICAgICAgICAgICAgICAgICAgICAgICBpbm5lciA9IGlubmVyWzE6XQoKICAgICAgICAgICAgICAgICAgICBjaGFyX2NsYXNzICs9IHJlLmVzY2FwZShpbm5lcikKICAgICAgICAgICAgICAgICAgICBwYXQgKz0gJ1slc10nICUgKGNoYXJfY2xhc3MsKQoKICAgICAgICAgICAgICAgICAgICAjIFNraXAgdG8gdGhlIGVuZCBdCiAgICAgICAgICAgICAgICAgICAgaSA9IGlubmVyX2kKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHBhdCArPSByZS5lc2NhcGUoY2hhcikKICAgICAgICAgICAgaSArPSAxCgogICAgICAgICMgSm9pbiBlYWNoIGNodW5rIHdpdGggdGhlIGRpciBzZXBhcmF0b3IKICAgICAgICBpZiBub3QgbGFzdF9jaHVuazoKICAgICAgICAgICAgcGF0ICs9IHNlcAoKICAgIHBhdCArPSByJ1xaJwogICAgcmV0dXJuIHJlLmNvbXBpbGUocGF0LCBmbGFncz1yZS5NVUxUSUxJTkV8cmUuRE9UQUxMKQoKCmNsYXNzIGVnZ19pbmZvKENvbW1hbmQpOgogICAgZGVzY3JpcHRpb24gPSAiY3JlYXRlIGEgZGlzdHJpYnV0aW9uJ3MgLmVnZy1pbmZvIGRpcmVjdG9yeSIKCiAgICB1c2VyX29wdGlvbnMgPSBbCiAgICAgICAgKCdlZ2ctYmFzZT0nLCAnZScsICJkaXJlY3RvcnkgY29udGFpbmluZyAuZWdnLWluZm8gZGlyZWN0b3JpZXMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKGRlZmF1bHQ6IHRvcCBvZiB0aGUgc291cmNlIHRyZWUpIiksCiAgICAgICAgKCd0YWctZGF0ZScsICdkJywgIkFkZCBkYXRlIHN0YW1wIChlLmcuIDIwMDUwNTI4KSB0byB2ZXJzaW9uIG51bWJlciIpLAogICAgICAgICgndGFnLWJ1aWxkPScsICdiJywgIlNwZWNpZnkgZXhwbGljaXQgdGFnIHRvIGFkZCB0byB2ZXJzaW9uIG51bWJlciIpLAogICAgICAgICgnbm8tZGF0ZScsICdEJywgIkRvbid0IGluY2x1ZGUgZGF0ZSBzdGFtcCBbZGVmYXVsdF0iKSwKICAgIF0KCiAgICBib29sZWFuX29wdGlvbnMgPSBbJ3RhZy1kYXRlJ10KICAgIG5lZ2F0aXZlX29wdCA9IHsKICAgICAgICAnbm8tZGF0ZSc6ICd0YWctZGF0ZScsCiAgICB9CgogICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBzZWxmLmVnZ19uYW1lID0gTm9uZQogICAgICAgIHNlbGYuZWdnX3ZlcnNpb24gPSBOb25lCiAgICAgICAgc2VsZi5lZ2dfYmFzZSA9IE5vbmUKICAgICAgICBzZWxmLmVnZ19pbmZvID0gTm9uZQogICAgICAgIHNlbGYudGFnX2J1aWxkID0gTm9uZQogICAgICAgIHNlbGYudGFnX2RhdGUgPSAwCiAgICAgICAgc2VsZi5icm9rZW5fZWdnX2luZm8gPSBGYWxzZQogICAgICAgIHNlbGYudnRhZ3MgPSBOb25lCgogICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAgICAjIGFsbG93IHRoZSAndGFnX3N2bl9yZXZpc2lvbicgdG8gYmUgZGV0ZWN0ZWQgYW5kCiAgICAjIHNldCwgc3VwcG9ydGluZyBzZGlzdHMgYnVpbHQgb24gb2xkZXIgU2V0dXB0b29scy4KICAgIEBwcm9wZXJ0eQogICAgZGVmIHRhZ19zdm5fcmV2aXNpb24oc2VsZik6CiAgICAgICAgcGFzcwoKICAgIEB0YWdfc3ZuX3JldmlzaW9uLnNldHRlcgogICAgZGVmIHRhZ19zdm5fcmV2aXNpb24oc2VsZiwgdmFsdWUpOgogICAgICAgIHBhc3MKICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKICAgIGRlZiBzYXZlX3ZlcnNpb25faW5mbyhzZWxmLCBmaWxlbmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgTWF0ZXJpYWxpemUgdGhlIHZhbHVlIG9mIGRhdGUgaW50byB0aGUKICAgICAgICBidWlsZCB0YWcuIEluc3RhbGwgYnVpbGQga2V5cyBpbiBhIGRldGVybWluaXN0aWMgb3JkZXIKICAgICAgICB0byBhdm9pZCBhcmJpdHJhcnkgcmVvcmRlcmluZyBvbiBzdWJzZXF1ZW50IGJ1aWxkcy4KICAgICAgICAiIiIKICAgICAgICBlZ2dfaW5mbyA9IGNvbGxlY3Rpb25zLk9yZGVyZWREaWN0KCkKICAgICAgICAjIGZvbGxvdyB0aGUgb3JkZXIgdGhlc2Uga2V5cyB3b3VsZCBoYXZlIGJlZW4gYWRkZWQKICAgICAgICAjIHdoZW4gUFlUSE9OSEFTSFNFRUQ9MAogICAgICAgIGVnZ19pbmZvWyd0YWdfYnVpbGQnXSA9IHNlbGYudGFncygpCiAgICAgICAgZWdnX2luZm9bJ3RhZ19kYXRlJ10gPSAwCiAgICAgICAgZWRpdF9jb25maWcoZmlsZW5hbWUsIGRpY3QoZWdnX2luZm89ZWdnX2luZm8pKQoKICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIHNlbGYuZWdnX25hbWUgPSBzYWZlX25hbWUoc2VsZi5kaXN0cmlidXRpb24uZ2V0X25hbWUoKSkKICAgICAgICBzZWxmLnZ0YWdzID0gc2VsZi50YWdzKCkKICAgICAgICBzZWxmLmVnZ192ZXJzaW9uID0gc2VsZi50YWdnZWRfdmVyc2lvbigpCgogICAgICAgIHBhcnNlZF92ZXJzaW9uID0gcGFyc2VfdmVyc2lvbihzZWxmLmVnZ192ZXJzaW9uKQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGlzX3ZlcnNpb24gPSBpc2luc3RhbmNlKHBhcnNlZF92ZXJzaW9uLCBwYWNrYWdpbmcudmVyc2lvbi5WZXJzaW9uKQogICAgICAgICAgICBzcGVjID0gKAogICAgICAgICAgICAgICAgIiVzPT0lcyIgaWYgaXNfdmVyc2lvbiBlbHNlICIlcz09PSVzIgogICAgICAgICAgICApCiAgICAgICAgICAgIGxpc3QoCiAgICAgICAgICAgICAgICBwYXJzZV9yZXF1aXJlbWVudHMoc3BlYyAlIChzZWxmLmVnZ19uYW1lLCBzZWxmLmVnZ192ZXJzaW9uKSkKICAgICAgICAgICAgKQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICByYWlzZSBkaXN0dXRpbHMuZXJyb3JzLkRpc3R1dGlsc09wdGlvbkVycm9yKAogICAgICAgICAgICAgICAgIkludmFsaWQgZGlzdHJpYnV0aW9uIG5hbWUgb3IgdmVyc2lvbiBzeW50YXg6ICVzLSVzIiAlCiAgICAgICAgICAgICAgICAoc2VsZi5lZ2dfbmFtZSwgc2VsZi5lZ2dfdmVyc2lvbikKICAgICAgICAgICAgKQoKICAgICAgICBpZiBzZWxmLmVnZ19iYXNlIGlzIE5vbmU6CiAgICAgICAgICAgIGRpcnMgPSBzZWxmLmRpc3RyaWJ1dGlvbi5wYWNrYWdlX2RpcgogICAgICAgICAgICBzZWxmLmVnZ19iYXNlID0gKGRpcnMgb3Ige30pLmdldCgnJywgb3MuY3VyZGlyKQoKICAgICAgICBzZWxmLmVuc3VyZV9kaXJuYW1lKCdlZ2dfYmFzZScpCiAgICAgICAgc2VsZi5lZ2dfaW5mbyA9IHRvX2ZpbGVuYW1lKHNlbGYuZWdnX25hbWUpICsgJy5lZ2ctaW5mbycKICAgICAgICBpZiBzZWxmLmVnZ19iYXNlICE9IG9zLmN1cmRpcjoKICAgICAgICAgICAgc2VsZi5lZ2dfaW5mbyA9IG9zLnBhdGguam9pbihzZWxmLmVnZ19iYXNlLCBzZWxmLmVnZ19pbmZvKQogICAgICAgIGlmICctJyBpbiBzZWxmLmVnZ19uYW1lOgogICAgICAgICAgICBzZWxmLmNoZWNrX2Jyb2tlbl9lZ2dfaW5mbygpCgogICAgICAgICMgU2V0IHBhY2thZ2UgdmVyc2lvbiBmb3IgdGhlIGJlbmVmaXQgb2YgZHVtYmVyIGNvbW1hbmRzCiAgICAgICAgIyAoZS5nLiBzZGlzdCwgYmRpc3Rfd2luaW5zdCwgZXRjLikKICAgICAgICAjCiAgICAgICAgc2VsZi5kaXN0cmlidXRpb24ubWV0YWRhdGEudmVyc2lvbiA9IHNlbGYuZWdnX3ZlcnNpb24KCiAgICAgICAgIyBJZiB3ZSBib290c3RyYXBwZWQgYXJvdW5kIHRoZSBsYWNrIG9mIGEgUEtHLUlORk8sIGFzIG1pZ2h0IGJlIHRoZQogICAgICAgICMgY2FzZSBpbiBhIGZyZXNoIGNoZWNrb3V0LCBtYWtlIHN1cmUgdGhhdCBhbnkgc3BlY2lhbCB0YWdzIGdldCBhZGRlZAogICAgICAgICMgdG8gdGhlIHZlcnNpb24gaW5mbwogICAgICAgICMKICAgICAgICBwZCA9IHNlbGYuZGlzdHJpYnV0aW9uLl9wYXRjaGVkX2Rpc3QKICAgICAgICBpZiBwZCBpcyBub3QgTm9uZSBhbmQgcGQua2V5ID09IHNlbGYuZWdnX25hbWUubG93ZXIoKToKICAgICAgICAgICAgcGQuX3ZlcnNpb24gPSBzZWxmLmVnZ192ZXJzaW9uCiAgICAgICAgICAgIHBkLl9wYXJzZWRfdmVyc2lvbiA9IHBhcnNlX3ZlcnNpb24oc2VsZi5lZ2dfdmVyc2lvbikKICAgICAgICAgICAgc2VsZi5kaXN0cmlidXRpb24uX3BhdGNoZWRfZGlzdCA9IE5vbmUKCiAgICBkZWYgd3JpdGVfb3JfZGVsZXRlX2ZpbGUoc2VsZiwgd2hhdCwgZmlsZW5hbWUsIGRhdGEsIGZvcmNlPUZhbHNlKToKICAgICAgICAiIiJXcml0ZSBgZGF0YWAgdG8gYGZpbGVuYW1lYCBvciBkZWxldGUgaWYgZW1wdHkKCiAgICAgICAgSWYgYGRhdGFgIGlzIG5vbi1lbXB0eSwgdGhpcyByb3V0aW5lIGlzIHRoZSBzYW1lIGFzIGBgd3JpdGVfZmlsZSgpYGAuCiAgICAgICAgSWYgYGRhdGFgIGlzIGVtcHR5IGJ1dCBub3QgYGBOb25lYGAsIHRoaXMgaXMgdGhlIHNhbWUgYXMgY2FsbGluZwogICAgICAgIGBgZGVsZXRlX2ZpbGUoZmlsZW5hbWUpYC4gIElmIGBkYXRhYCBpcyBgYE5vbmVgYCwgdGhlbiB0aGlzIGlzIGEgbm8tb3AKICAgICAgICB1bmxlc3MgYGZpbGVuYW1lYCBleGlzdHMsIGluIHdoaWNoIGNhc2UgYSB3YXJuaW5nIGlzIGlzc3VlZCBhYm91dCB0aGUKICAgICAgICBvcnBoYW5lZCBmaWxlIChpZiBgZm9yY2VgIGlzIGZhbHNlKSwgb3IgZGVsZXRlZCAoaWYgYGZvcmNlYCBpcyB0cnVlKS4KICAgICAgICAiIiIKICAgICAgICBpZiBkYXRhOgogICAgICAgICAgICBzZWxmLndyaXRlX2ZpbGUod2hhdCwgZmlsZW5hbWUsIGRhdGEpCiAgICAgICAgZWxpZiBvcy5wYXRoLmV4aXN0cyhmaWxlbmFtZSk6CiAgICAgICAgICAgIGlmIGRhdGEgaXMgTm9uZSBhbmQgbm90IGZvcmNlOgogICAgICAgICAgICAgICAgbG9nLndhcm4oCiAgICAgICAgICAgICAgICAgICAgIiVzIG5vdCBzZXQgaW4gc2V0dXAoKSwgYnV0ICVzIGV4aXN0cyIsIHdoYXQsIGZpbGVuYW1lCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYuZGVsZXRlX2ZpbGUoZmlsZW5hbWUpCgogICAgZGVmIHdyaXRlX2ZpbGUoc2VsZiwgd2hhdCwgZmlsZW5hbWUsIGRhdGEpOgogICAgICAgICIiIldyaXRlIGBkYXRhYCB0byBgZmlsZW5hbWVgIChpZiBub3QgYSBkcnkgcnVuKSBhZnRlciBhbm5vdW5jaW5nIGl0CgogICAgICAgIGB3aGF0YCBpcyB1c2VkIGluIGEgbG9nIG1lc3NhZ2UgdG8gaWRlbnRpZnkgd2hhdCBpcyBiZWluZyB3cml0dGVuCiAgICAgICAgdG8gdGhlIGZpbGUuCiAgICAgICAgIiIiCiAgICAgICAgbG9nLmluZm8oIndyaXRpbmcgJXMgdG8gJXMiLCB3aGF0LCBmaWxlbmFtZSkKICAgICAgICBpZiBzaXguUFkzOgogICAgICAgICAgICBkYXRhID0gZGF0YS5lbmNvZGUoInV0Zi04IikKICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICBmID0gb3BlbihmaWxlbmFtZSwgJ3diJykKICAgICAgICAgICAgZi53cml0ZShkYXRhKQogICAgICAgICAgICBmLmNsb3NlKCkKCiAgICBkZWYgZGVsZXRlX2ZpbGUoc2VsZiwgZmlsZW5hbWUpOgogICAgICAgICIiIkRlbGV0ZSBgZmlsZW5hbWVgIChpZiBub3QgYSBkcnkgcnVuKSBhZnRlciBhbm5vdW5jaW5nIGl0IiIiCiAgICAgICAgbG9nLmluZm8oImRlbGV0aW5nICVzIiwgZmlsZW5hbWUpCiAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgb3MudW5saW5rKGZpbGVuYW1lKQoKICAgIGRlZiB0YWdnZWRfdmVyc2lvbihzZWxmKToKICAgICAgICB2ZXJzaW9uID0gc2VsZi5kaXN0cmlidXRpb24uZ2V0X3ZlcnNpb24oKQogICAgICAgICMgZWdnX2luZm8gbWF5IGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZSBmb3IgYSBkaXN0cmlidXRpb24sCiAgICAgICAgIyBpbiB3aGljaCBjYXNlIHRoZSB2ZXJzaW9uIHN0cmluZyBhbHJlYWR5IGNvbnRhaW5zIGFsbCB0YWdzLgogICAgICAgIGlmIHNlbGYudnRhZ3MgYW5kIHZlcnNpb24uZW5kc3dpdGgoc2VsZi52dGFncyk6CiAgICAgICAgICAgIHJldHVybiBzYWZlX3ZlcnNpb24odmVyc2lvbikKICAgICAgICByZXR1cm4gc2FmZV92ZXJzaW9uKHZlcnNpb24gKyBzZWxmLnZ0YWdzKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgc2VsZi5ta3BhdGgoc2VsZi5lZ2dfaW5mbykKICAgICAgICBpbnN0YWxsZXIgPSBzZWxmLmRpc3RyaWJ1dGlvbi5mZXRjaF9idWlsZF9lZ2cKICAgICAgICBmb3IgZXAgaW4gaXRlcl9lbnRyeV9wb2ludHMoJ2VnZ19pbmZvLndyaXRlcnMnKToKICAgICAgICAgICAgZXAucmVxdWlyZShpbnN0YWxsZXI9aW5zdGFsbGVyKQogICAgICAgICAgICB3cml0ZXIgPSBlcC5yZXNvbHZlKCkKICAgICAgICAgICAgd3JpdGVyKHNlbGYsIGVwLm5hbWUsIG9zLnBhdGguam9pbihzZWxmLmVnZ19pbmZvLCBlcC5uYW1lKSkKCiAgICAgICAgIyBHZXQgcmlkIG9mIG5hdGl2ZV9saWJzLnR4dCBpZiBpdCB3YXMgcHV0IHRoZXJlIGJ5IG9sZGVyIGJkaXN0X2VnZwogICAgICAgIG5sID0gb3MucGF0aC5qb2luKHNlbGYuZWdnX2luZm8sICJuYXRpdmVfbGlicy50eHQiKQogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKG5sKToKICAgICAgICAgICAgc2VsZi5kZWxldGVfZmlsZShubCkKCiAgICAgICAgc2VsZi5maW5kX3NvdXJjZXMoKQoKICAgIGRlZiB0YWdzKHNlbGYpOgogICAgICAgIHZlcnNpb24gPSAnJwogICAgICAgIGlmIHNlbGYudGFnX2J1aWxkOgogICAgICAgICAgICB2ZXJzaW9uICs9IHNlbGYudGFnX2J1aWxkCiAgICAgICAgaWYgc2VsZi50YWdfZGF0ZToKICAgICAgICAgICAgdmVyc2lvbiArPSB0aW1lLnN0cmZ0aW1lKCItJVklbSVkIikKICAgICAgICByZXR1cm4gdmVyc2lvbgoKICAgIGRlZiBmaW5kX3NvdXJjZXMoc2VsZik6CiAgICAgICAgIiIiR2VuZXJhdGUgU09VUkNFUy50eHQgbWFuaWZlc3QgZmlsZSIiIgogICAgICAgIG1hbmlmZXN0X2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKHNlbGYuZWdnX2luZm8sICJTT1VSQ0VTLnR4dCIpCiAgICAgICAgbW0gPSBtYW5pZmVzdF9tYWtlcihzZWxmLmRpc3RyaWJ1dGlvbikKICAgICAgICBtbS5tYW5pZmVzdCA9IG1hbmlmZXN0X2ZpbGVuYW1lCiAgICAgICAgbW0ucnVuKCkKICAgICAgICBzZWxmLmZpbGVsaXN0ID0gbW0uZmlsZWxpc3QKCiAgICBkZWYgY2hlY2tfYnJva2VuX2VnZ19pbmZvKHNlbGYpOgogICAgICAgIGJlaSA9IHNlbGYuZWdnX25hbWUgKyAnLmVnZy1pbmZvJwogICAgICAgIGlmIHNlbGYuZWdnX2Jhc2UgIT0gb3MuY3VyZGlyOgogICAgICAgICAgICBiZWkgPSBvcy5wYXRoLmpvaW4oc2VsZi5lZ2dfYmFzZSwgYmVpKQogICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGJlaSk6CiAgICAgICAgICAgIGxvZy53YXJuKAogICAgICAgICAgICAgICAgIi0iICogNzggKyAnXG4nCiAgICAgICAgICAgICAgICAiTm90ZTogWW91ciBjdXJyZW50IC5lZ2ctaW5mbyBkaXJlY3RvcnkgaGFzIGEgJy0nIGluIGl0cyBuYW1lOyIKICAgICAgICAgICAgICAgICdcbnRoaXMgd2lsbCBub3Qgd29yayBjb3JyZWN0bHkgd2l0aCAic2V0dXAucHkgZGV2ZWxvcCIuXG5cbicKICAgICAgICAgICAgICAgICdQbGVhc2UgcmVuYW1lICVzIHRvICVzIHRvIGNvcnJlY3QgdGhpcyBwcm9ibGVtLlxuJyArICctJyAqIDc4LAogICAgICAgICAgICAgICAgYmVpLCBzZWxmLmVnZ19pbmZvCiAgICAgICAgICAgICkKICAgICAgICAgICAgc2VsZi5icm9rZW5fZWdnX2luZm8gPSBzZWxmLmVnZ19pbmZvCiAgICAgICAgICAgIHNlbGYuZWdnX2luZm8gPSBiZWkgICMgbWFrZSBpdCB3b3JrIGZvciBub3cKCgpjbGFzcyBGaWxlTGlzdChfRmlsZUxpc3QpOgogICAgIyBJbXBsZW1lbnRhdGlvbnMgb2YgdGhlIHZhcmlvdXMgTUFOSUZFU1QuaW4gY29tbWFuZHMKCiAgICBkZWYgcHJvY2Vzc190ZW1wbGF0ZV9saW5lKHNlbGYsIGxpbmUpOgogICAgICAgICMgUGFyc2UgdGhlIGxpbmU6IHNwbGl0IGl0IHVwLCBtYWtlIHN1cmUgdGhlIHJpZ2h0IG51bWJlciBvZiB3b3JkcwogICAgICAgICMgaXMgdGhlcmUsIGFuZCByZXR1cm4gdGhlIHJlbGV2YW50IHdvcmRzLiAgJ2FjdGlvbicgaXMgYWx3YXlzCiAgICAgICAgIyBkZWZpbmVkOiBpdCdzIHRoZSBmaXJzdCB3b3JkIG9mIHRoZSBsaW5lLiAgV2hpY2ggb2YgdGhlIG90aGVyCiAgICAgICAgIyB0aHJlZSBhcmUgZGVmaW5lZCBkZXBlbmRzIG9uIHRoZSBhY3Rpb247IGl0J2xsIGJlIGVpdGhlcgogICAgICAgICMgcGF0dGVybnMsIChkaXIgYW5kIHBhdHRlcm5zKSwgb3IgKGRpcl9wYXR0ZXJuKS4KICAgICAgICAoYWN0aW9uLCBwYXR0ZXJucywgZGlyLCBkaXJfcGF0dGVybikgPSBzZWxmLl9wYXJzZV90ZW1wbGF0ZV9saW5lKGxpbmUpCgogICAgICAgICMgT0ssIG5vdyB3ZSBrbm93IHRoYXQgdGhlIGFjdGlvbiBpcyB2YWxpZCBhbmQgd2UgaGF2ZSB0aGUKICAgICAgICAjIHJpZ2h0IG51bWJlciBvZiB3b3JkcyBvbiB0aGUgbGluZSBmb3IgdGhhdCBhY3Rpb24gLS0gc28gd2UKICAgICAgICAjIGNhbiBwcm9jZWVkIHdpdGggbWluaW1hbCBlcnJvci1jaGVja2luZy4KICAgICAgICBpZiBhY3Rpb24gPT0gJ2luY2x1ZGUnOgogICAgICAgICAgICBzZWxmLmRlYnVnX3ByaW50KCJpbmNsdWRlICIgKyAnICcuam9pbihwYXR0ZXJucykpCiAgICAgICAgICAgIGZvciBwYXR0ZXJuIGluIHBhdHRlcm5zOgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuaW5jbHVkZShwYXR0ZXJuKToKICAgICAgICAgICAgICAgICAgICBsb2cud2Fybigid2FybmluZzogbm8gZmlsZXMgZm91bmQgbWF0Y2hpbmcgJyVzJyIsIHBhdHRlcm4pCgogICAgICAgIGVsaWYgYWN0aW9uID09ICdleGNsdWRlJzoKICAgICAgICAgICAgc2VsZi5kZWJ1Z19wcmludCgiZXhjbHVkZSAiICsgJyAnLmpvaW4ocGF0dGVybnMpKQogICAgICAgICAgICBmb3IgcGF0dGVybiBpbiBwYXR0ZXJuczoKICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmV4Y2x1ZGUocGF0dGVybik6CiAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oKCJ3YXJuaW5nOiBubyBwcmV2aW91c2x5LWluY2x1ZGVkIGZpbGVzICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvdW5kIG1hdGNoaW5nICclcyciKSwgcGF0dGVybikKCiAgICAgICAgZWxpZiBhY3Rpb24gPT0gJ2dsb2JhbC1pbmNsdWRlJzoKICAgICAgICAgICAgc2VsZi5kZWJ1Z19wcmludCgiZ2xvYmFsLWluY2x1ZGUgIiArICcgJy5qb2luKHBhdHRlcm5zKSkKICAgICAgICAgICAgZm9yIHBhdHRlcm4gaW4gcGF0dGVybnM6CiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5nbG9iYWxfaW5jbHVkZShwYXR0ZXJuKToKICAgICAgICAgICAgICAgICAgICBsb2cud2FybigoIndhcm5pbmc6IG5vIGZpbGVzIGZvdW5kIG1hdGNoaW5nICclcycgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW55d2hlcmUgaW4gZGlzdHJpYnV0aW9uIiksIHBhdHRlcm4pCgogICAgICAgIGVsaWYgYWN0aW9uID09ICdnbG9iYWwtZXhjbHVkZSc6CiAgICAgICAgICAgIHNlbGYuZGVidWdfcHJpbnQoImdsb2JhbC1leGNsdWRlICIgKyAnICcuam9pbihwYXR0ZXJucykpCiAgICAgICAgICAgIGZvciBwYXR0ZXJuIGluIHBhdHRlcm5zOgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuZ2xvYmFsX2V4Y2x1ZGUocGF0dGVybik6CiAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oKCJ3YXJuaW5nOiBubyBwcmV2aW91c2x5LWluY2x1ZGVkIGZpbGVzIG1hdGNoaW5nICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiclcycgZm91bmQgYW55d2hlcmUgaW4gZGlzdHJpYnV0aW9uIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybikKCiAgICAgICAgZWxpZiBhY3Rpb24gPT0gJ3JlY3Vyc2l2ZS1pbmNsdWRlJzoKICAgICAgICAgICAgc2VsZi5kZWJ1Z19wcmludCgicmVjdXJzaXZlLWluY2x1ZGUgJXMgJXMiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGlyLCAnICcuam9pbihwYXR0ZXJucykpKQogICAgICAgICAgICBmb3IgcGF0dGVybiBpbiBwYXR0ZXJuczoKICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnJlY3Vyc2l2ZV9pbmNsdWRlKGRpciwgcGF0dGVybik6CiAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oKCJ3YXJuaW5nOiBubyBmaWxlcyBmb3VuZCBtYXRjaGluZyAnJXMnICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZGVyIGRpcmVjdG9yeSAnJXMnIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiwgZGlyKQoKICAgICAgICBlbGlmIGFjdGlvbiA9PSAncmVjdXJzaXZlLWV4Y2x1ZGUnOgogICAgICAgICAgICBzZWxmLmRlYnVnX3ByaW50KCJyZWN1cnNpdmUtZXhjbHVkZSAlcyAlcyIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkaXIsICcgJy5qb2luKHBhdHRlcm5zKSkpCiAgICAgICAgICAgIGZvciBwYXR0ZXJuIGluIHBhdHRlcm5zOgogICAgICAgICAgICAgICAgaWYgbm90IHNlbGYucmVjdXJzaXZlX2V4Y2x1ZGUoZGlyLCBwYXR0ZXJuKToKICAgICAgICAgICAgICAgICAgICBsb2cud2FybigoIndhcm5pbmc6IG5vIHByZXZpb3VzbHktaW5jbHVkZWQgZmlsZXMgbWF0Y2hpbmcgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyVzJyBmb3VuZCB1bmRlciBkaXJlY3RvcnkgJyVzJyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4sIGRpcikKCiAgICAgICAgZWxpZiBhY3Rpb24gPT0gJ2dyYWZ0JzoKICAgICAgICAgICAgc2VsZi5kZWJ1Z19wcmludCgiZ3JhZnQgIiArIGRpcl9wYXR0ZXJuKQogICAgICAgICAgICBpZiBub3Qgc2VsZi5ncmFmdChkaXJfcGF0dGVybik6CiAgICAgICAgICAgICAgICBsb2cud2Fybigid2FybmluZzogbm8gZGlyZWN0b3JpZXMgZm91bmQgbWF0Y2hpbmcgJyVzJyIsCiAgICAgICAgICAgICAgICAgICAgICAgICBkaXJfcGF0dGVybikKCiAgICAgICAgZWxpZiBhY3Rpb24gPT0gJ3BydW5lJzoKICAgICAgICAgICAgc2VsZi5kZWJ1Z19wcmludCgicHJ1bmUgIiArIGRpcl9wYXR0ZXJuKQogICAgICAgICAgICBpZiBub3Qgc2VsZi5wcnVuZShkaXJfcGF0dGVybik6CiAgICAgICAgICAgICAgICBsb2cud2FybigoIm5vIHByZXZpb3VzbHktaW5jbHVkZWQgZGlyZWN0b3JpZXMgZm91bmQgIgogICAgICAgICAgICAgICAgICAgICAgICAgICJtYXRjaGluZyAnJXMnIiksIGRpcl9wYXR0ZXJuKQoKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNJbnRlcm5hbEVycm9yKAogICAgICAgICAgICAgICAgInRoaXMgY2Fubm90IGhhcHBlbjogaW52YWxpZCBhY3Rpb24gJyVzJyIgJSBhY3Rpb24pCgogICAgZGVmIF9yZW1vdmVfZmlsZXMoc2VsZiwgcHJlZGljYXRlKToKICAgICAgICAiIiIKICAgICAgICBSZW1vdmUgYWxsIGZpbGVzIGZyb20gdGhlIGZpbGUgbGlzdCB0aGF0IG1hdGNoIHRoZSBwcmVkaWNhdGUuCiAgICAgICAgUmV0dXJuIFRydWUgaWYgYW55IG1hdGNoaW5nIGZpbGVzIHdlcmUgcmVtb3ZlZAogICAgICAgICIiIgogICAgICAgIGZvdW5kID0gRmFsc2UKICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5maWxlcykgLSAxLCAtMSwgLTEpOgogICAgICAgICAgICBpZiBwcmVkaWNhdGUoc2VsZi5maWxlc1tpXSk6CiAgICAgICAgICAgICAgICBzZWxmLmRlYnVnX3ByaW50KCIgcmVtb3ZpbmcgIiArIHNlbGYuZmlsZXNbaV0pCiAgICAgICAgICAgICAgICBkZWwgc2VsZi5maWxlc1tpXQogICAgICAgICAgICAgICAgZm91bmQgPSBUcnVlCiAgICAgICAgcmV0dXJuIGZvdW5kCgogICAgZGVmIGluY2x1ZGUoc2VsZiwgcGF0dGVybik6CiAgICAgICAgIiIiSW5jbHVkZSBmaWxlcyB0aGF0IG1hdGNoICdwYXR0ZXJuJy4iIiIKICAgICAgICBmb3VuZCA9IFtmIGZvciBmIGluIGdsb2IocGF0dGVybikgaWYgbm90IG9zLnBhdGguaXNkaXIoZildCiAgICAgICAgc2VsZi5leHRlbmQoZm91bmQpCiAgICAgICAgcmV0dXJuIGJvb2woZm91bmQpCgogICAgZGVmIGV4Y2x1ZGUoc2VsZiwgcGF0dGVybik6CiAgICAgICAgIiIiRXhjbHVkZSBmaWxlcyB0aGF0IG1hdGNoICdwYXR0ZXJuJy4iIiIKICAgICAgICBtYXRjaCA9IHRyYW5zbGF0ZV9wYXR0ZXJuKHBhdHRlcm4pCiAgICAgICAgcmV0dXJuIHNlbGYuX3JlbW92ZV9maWxlcyhtYXRjaC5tYXRjaCkKCiAgICBkZWYgcmVjdXJzaXZlX2luY2x1ZGUoc2VsZiwgZGlyLCBwYXR0ZXJuKToKICAgICAgICAiIiIKICAgICAgICBJbmNsdWRlIGFsbCBmaWxlcyBhbnl3aGVyZSBpbiAnZGlyLycgdGhhdCBtYXRjaCB0aGUgcGF0dGVybi4KICAgICAgICAiIiIKICAgICAgICBmdWxsX3BhdHRlcm4gPSBvcy5wYXRoLmpvaW4oZGlyLCAnKionLCBwYXR0ZXJuKQogICAgICAgIGZvdW5kID0gW2YgZm9yIGYgaW4gZ2xvYihmdWxsX3BhdHRlcm4sIHJlY3Vyc2l2ZT1UcnVlKQogICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGYpXQogICAgICAgIHNlbGYuZXh0ZW5kKGZvdW5kKQogICAgICAgIHJldHVybiBib29sKGZvdW5kKQoKICAgIGRlZiByZWN1cnNpdmVfZXhjbHVkZShzZWxmLCBkaXIsIHBhdHRlcm4pOgogICAgICAgICIiIgogICAgICAgIEV4Y2x1ZGUgYW55IGZpbGUgYW55d2hlcmUgaW4gJ2Rpci8nIHRoYXQgbWF0Y2ggdGhlIHBhdHRlcm4uCiAgICAgICAgIiIiCiAgICAgICAgbWF0Y2ggPSB0cmFuc2xhdGVfcGF0dGVybihvcy5wYXRoLmpvaW4oZGlyLCAnKionLCBwYXR0ZXJuKSkKICAgICAgICByZXR1cm4gc2VsZi5fcmVtb3ZlX2ZpbGVzKG1hdGNoLm1hdGNoKQoKICAgIGRlZiBncmFmdChzZWxmLCBkaXIpOgogICAgICAgICIiIkluY2x1ZGUgYWxsIGZpbGVzIGZyb20gJ2Rpci8nLiIiIgogICAgICAgIGZvdW5kID0gWwogICAgICAgICAgICBpdGVtCiAgICAgICAgICAgIGZvciBtYXRjaF9kaXIgaW4gZ2xvYihkaXIpCiAgICAgICAgICAgIGZvciBpdGVtIGluIGRpc3R1dGlscy5maWxlbGlzdC5maW5kYWxsKG1hdGNoX2RpcikKICAgICAgICBdCiAgICAgICAgc2VsZi5leHRlbmQoZm91bmQpCiAgICAgICAgcmV0dXJuIGJvb2woZm91bmQpCgogICAgZGVmIHBydW5lKHNlbGYsIGRpcik6CiAgICAgICAgIiIiRmlsdGVyIG91dCBmaWxlcyBmcm9tICdkaXIvJy4iIiIKICAgICAgICBtYXRjaCA9IHRyYW5zbGF0ZV9wYXR0ZXJuKG9zLnBhdGguam9pbihkaXIsICcqKicpKQogICAgICAgIHJldHVybiBzZWxmLl9yZW1vdmVfZmlsZXMobWF0Y2gubWF0Y2gpCgogICAgZGVmIGdsb2JhbF9pbmNsdWRlKHNlbGYsIHBhdHRlcm4pOgogICAgICAgICIiIgogICAgICAgIEluY2x1ZGUgYWxsIGZpbGVzIGFueXdoZXJlIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB0aGF0IG1hdGNoIHRoZQogICAgICAgIHBhdHRlcm4uIFRoaXMgaXMgdmVyeSBpbmVmZmljaWVudCBvbiBsYXJnZSBmaWxlIHRyZWVzLgogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYuYWxsZmlsZXMgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi5maW5kYWxsKCkKICAgICAgICBtYXRjaCA9IHRyYW5zbGF0ZV9wYXR0ZXJuKG9zLnBhdGguam9pbignKionLCBwYXR0ZXJuKSkKICAgICAgICBmb3VuZCA9IFtmIGZvciBmIGluIHNlbGYuYWxsZmlsZXMgaWYgbWF0Y2gubWF0Y2goZildCiAgICAgICAgc2VsZi5leHRlbmQoZm91bmQpCiAgICAgICAgcmV0dXJuIGJvb2woZm91bmQpCgogICAgZGVmIGdsb2JhbF9leGNsdWRlKHNlbGYsIHBhdHRlcm4pOgogICAgICAgICIiIgogICAgICAgIEV4Y2x1ZGUgYWxsIGZpbGVzIGFueXdoZXJlIHRoYXQgbWF0Y2ggdGhlIHBhdHRlcm4uCiAgICAgICAgIiIiCiAgICAgICAgbWF0Y2ggPSB0cmFuc2xhdGVfcGF0dGVybihvcy5wYXRoLmpvaW4oJyoqJywgcGF0dGVybikpCiAgICAgICAgcmV0dXJuIHNlbGYuX3JlbW92ZV9maWxlcyhtYXRjaC5tYXRjaCkKCiAgICBkZWYgYXBwZW5kKHNlbGYsIGl0ZW0pOgogICAgICAgIGlmIGl0ZW0uZW5kc3dpdGgoJ1xyJyk6ICAjIEZpeCBvbGRlciBzZGlzdHMgYnVpbHQgb24gV2luZG93cwogICAgICAgICAgICBpdGVtID0gaXRlbVs6LTFdCiAgICAgICAgcGF0aCA9IGNvbnZlcnRfcGF0aChpdGVtKQoKICAgICAgICBpZiBzZWxmLl9zYWZlX3BhdGgocGF0aCk6CiAgICAgICAgICAgIHNlbGYuZmlsZXMuYXBwZW5kKHBhdGgpCgogICAgZGVmIGV4dGVuZChzZWxmLCBwYXRocyk6CiAgICAgICAgc2VsZi5maWxlcy5leHRlbmQoZmlsdGVyKHNlbGYuX3NhZmVfcGF0aCwgcGF0aHMpKQoKICAgIGRlZiBfcmVwYWlyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJlcGxhY2Ugc2VsZi5maWxlcyB3aXRoIG9ubHkgc2FmZSBwYXRocwoKICAgICAgICBCZWNhdXNlIHNvbWUgb3duZXJzIG9mIEZpbGVMaXN0IG1hbmlwdWxhdGUgdGhlIHVuZGVybHlpbmcKICAgICAgICBgYGZpbGVzYGAgYXR0cmlidXRlIGRpcmVjdGx5LCB0aGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCB0bwogICAgICAgIHJlcGFpciB0aG9zZSBwYXRocy4KICAgICAgICAiIiIKICAgICAgICBzZWxmLmZpbGVzID0gbGlzdChmaWx0ZXIoc2VsZi5fc2FmZV9wYXRoLCBzZWxmLmZpbGVzKSkKCiAgICBkZWYgX3NhZmVfcGF0aChzZWxmLCBwYXRoKToKICAgICAgICBlbmNfd2FybiA9ICInJXMnIG5vdCAlcyBlbmNvZGFibGUgLS0gc2tpcHBpbmciCgogICAgICAgICMgVG8gYXZvaWQgYWNjaWRlbnRhbCB0cmFucy1jb2RpbmdzIGVycm9ycywgZmlyc3QgdG8gdW5pY29kZQogICAgICAgIHVfcGF0aCA9IHVuaWNvZGVfdXRpbHMuZmlsZXN5c19kZWNvZGUocGF0aCkKICAgICAgICBpZiB1X3BhdGggaXMgTm9uZToKICAgICAgICAgICAgbG9nLndhcm4oIiclcycgaW4gdW5leHBlY3RlZCBlbmNvZGluZyAtLSBza2lwcGluZyIgJSBwYXRoKQogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBNdXN0IGVuc3VyZSB1dGYtOCBlbmNvZGFiaWxpdHkKICAgICAgICB1dGY4X3BhdGggPSB1bmljb2RlX3V0aWxzLnRyeV9lbmNvZGUodV9wYXRoLCAidXRmLTgiKQogICAgICAgIGlmIHV0ZjhfcGF0aCBpcyBOb25lOgogICAgICAgICAgICBsb2cud2FybihlbmNfd2FybiwgcGF0aCwgJ3V0Zi04JykKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIHRyeToKICAgICAgICAgICAgIyBhY2NlcHQgaXMgZWl0aGVyIHdheSBjaGVja3Mgb3V0CiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHVfcGF0aCkgb3Igb3MucGF0aC5leGlzdHModXRmOF9wYXRoKToKICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgIyB0aGlzIHdpbGwgY2F0Y2ggYW55IGVuY29kZSBlcnJvcnMgZGVjb2RpbmcgdV9wYXRoCiAgICAgICAgZXhjZXB0IFVuaWNvZGVFbmNvZGVFcnJvcjoKICAgICAgICAgICAgbG9nLndhcm4oZW5jX3dhcm4sIHBhdGgsIHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKSkKCgpjbGFzcyBtYW5pZmVzdF9tYWtlcihzZGlzdCk6CiAgICB0ZW1wbGF0ZSA9ICJNQU5JRkVTVC5pbiIKCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIHNlbGYudXNlX2RlZmF1bHRzID0gMQogICAgICAgIHNlbGYucHJ1bmUgPSAxCiAgICAgICAgc2VsZi5tYW5pZmVzdF9vbmx5ID0gMQogICAgICAgIHNlbGYuZm9yY2VfbWFuaWZlc3QgPSAxCgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgcGFzcwoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgc2VsZi5maWxlbGlzdCA9IEZpbGVMaXN0KCkKICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc2VsZi5tYW5pZmVzdCk6CiAgICAgICAgICAgIHNlbGYud3JpdGVfbWFuaWZlc3QoKSAgIyBpdCBtdXN0IGV4aXN0IHNvIGl0J2xsIGdldCBpbiB0aGUgbGlzdAogICAgICAgIHNlbGYuYWRkX2RlZmF1bHRzKCkKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLnRlbXBsYXRlKToKICAgICAgICAgICAgc2VsZi5yZWFkX3RlbXBsYXRlKCkKICAgICAgICBzZWxmLnBydW5lX2ZpbGVfbGlzdCgpCiAgICAgICAgc2VsZi5maWxlbGlzdC5zb3J0KCkKICAgICAgICBzZWxmLmZpbGVsaXN0LnJlbW92ZV9kdXBsaWNhdGVzKCkKICAgICAgICBzZWxmLndyaXRlX21hbmlmZXN0KCkKCiAgICBkZWYgX21hbmlmZXN0X25vcm1hbGl6ZShzZWxmLCBwYXRoKToKICAgICAgICBwYXRoID0gdW5pY29kZV91dGlscy5maWxlc3lzX2RlY29kZShwYXRoKQogICAgICAgIHJldHVybiBwYXRoLnJlcGxhY2Uob3Muc2VwLCAnLycpCgogICAgZGVmIHdyaXRlX21hbmlmZXN0KHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFdyaXRlIHRoZSBmaWxlIGxpc3QgaW4gJ3NlbGYuZmlsZWxpc3QnIHRvIHRoZSBtYW5pZmVzdCBmaWxlCiAgICAgICAgbmFtZWQgYnkgJ3NlbGYubWFuaWZlc3QnLgogICAgICAgICIiIgogICAgICAgIHNlbGYuZmlsZWxpc3QuX3JlcGFpcigpCgogICAgICAgICMgTm93IF9yZXBhaXJzIHNob3VsZCBlbmNvZGFiaWxpdHksIGJ1dCBub3QgdW5pY29kZQogICAgICAgIGZpbGVzID0gW3NlbGYuX21hbmlmZXN0X25vcm1hbGl6ZShmKSBmb3IgZiBpbiBzZWxmLmZpbGVsaXN0LmZpbGVzXQogICAgICAgIG1zZyA9ICJ3cml0aW5nIG1hbmlmZXN0IGZpbGUgJyVzJyIgJSBzZWxmLm1hbmlmZXN0CiAgICAgICAgc2VsZi5leGVjdXRlKHdyaXRlX2ZpbGUsIChzZWxmLm1hbmlmZXN0LCBmaWxlcyksIG1zZykKCiAgICBkZWYgd2FybihzZWxmLCBtc2cpOgogICAgICAgIGlmIG5vdCBzZWxmLl9zaG91bGRfc3VwcHJlc3Nfd2FybmluZyhtc2cpOgogICAgICAgICAgICBzZGlzdC53YXJuKHNlbGYsIG1zZykKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX3Nob3VsZF9zdXBwcmVzc193YXJuaW5nKG1zZyk6CiAgICAgICAgIiIiCiAgICAgICAgc3VwcHJlc3MgbWlzc2luZy1maWxlIHdhcm5pbmdzIGZyb20gc2Rpc3QKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gcmUubWF0Y2gociJzdGFuZGFyZCBmaWxlIC4qbm90IGZvdW5kIiwgbXNnKQoKICAgIGRlZiBhZGRfZGVmYXVsdHMoc2VsZik6CiAgICAgICAgc2Rpc3QuYWRkX2RlZmF1bHRzKHNlbGYpCiAgICAgICAgc2VsZi5maWxlbGlzdC5hcHBlbmQoc2VsZi50ZW1wbGF0ZSkKICAgICAgICBzZWxmLmZpbGVsaXN0LmFwcGVuZChzZWxmLm1hbmlmZXN0KQogICAgICAgIHJjZmlsZXMgPSBsaXN0KHdhbGtfcmV2Y3RybCgpKQogICAgICAgIGlmIHJjZmlsZXM6CiAgICAgICAgICAgIHNlbGYuZmlsZWxpc3QuZXh0ZW5kKHJjZmlsZXMpCiAgICAgICAgZWxpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLm1hbmlmZXN0KToKICAgICAgICAgICAgc2VsZi5yZWFkX21hbmlmZXN0KCkKICAgICAgICBlaV9jbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnZWdnX2luZm8nKQogICAgICAgIHNlbGYuZmlsZWxpc3QuZ3JhZnQoZWlfY21kLmVnZ19pbmZvKQoKICAgIGRlZiBwcnVuZV9maWxlX2xpc3Qoc2VsZik6CiAgICAgICAgYnVpbGQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGQnKQogICAgICAgIGJhc2VfZGlyID0gc2VsZi5kaXN0cmlidXRpb24uZ2V0X2Z1bGxuYW1lKCkKICAgICAgICBzZWxmLmZpbGVsaXN0LnBydW5lKGJ1aWxkLmJ1aWxkX2Jhc2UpCiAgICAgICAgc2VsZi5maWxlbGlzdC5wcnVuZShiYXNlX2RpcikKICAgICAgICBzZXAgPSByZS5lc2NhcGUob3Muc2VwKQogICAgICAgIHNlbGYuZmlsZWxpc3QuZXhjbHVkZV9wYXR0ZXJuKHInKF58JyArIHNlcCArIHInKShSQ1N8Q1ZTfFwuc3ZuKScgKyBzZXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfcmVnZXg9MSkKCgpkZWYgd3JpdGVfZmlsZShmaWxlbmFtZSwgY29udGVudHMpOgogICAgIiIiQ3JlYXRlIGEgZmlsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgd3JpdGUgJ2NvbnRlbnRzJyAoYQogICAgc2VxdWVuY2Ugb2Ygc3RyaW5ncyB3aXRob3V0IGxpbmUgdGVybWluYXRvcnMpIHRvIGl0LgogICAgIiIiCiAgICBjb250ZW50cyA9ICJcbiIuam9pbihjb250ZW50cykKCiAgICAjIGFzc3VtaW5nIHRoZSBjb250ZW50cyBoYXMgYmVlbiB2ZXR0ZWQgZm9yIHV0Zi04IGVuY29kaW5nCiAgICBjb250ZW50cyA9IGNvbnRlbnRzLmVuY29kZSgidXRmLTgiKQoKICAgIHdpdGggb3BlbihmaWxlbmFtZSwgIndiIikgYXMgZjogICMgYWx3YXlzIHdyaXRlIFBPU0lYLXN0eWxlIG1hbmlmZXN0CiAgICAgICAgZi53cml0ZShjb250ZW50cykKCgpkZWYgd3JpdGVfcGtnX2luZm8oY21kLCBiYXNlbmFtZSwgZmlsZW5hbWUpOgogICAgbG9nLmluZm8oIndyaXRpbmcgJXMiLCBmaWxlbmFtZSkKICAgIGlmIG5vdCBjbWQuZHJ5X3J1bjoKICAgICAgICBtZXRhZGF0YSA9IGNtZC5kaXN0cmlidXRpb24ubWV0YWRhdGEKICAgICAgICBtZXRhZGF0YS52ZXJzaW9uLCBvbGR2ZXIgPSBjbWQuZWdnX3ZlcnNpb24sIG1ldGFkYXRhLnZlcnNpb24KICAgICAgICBtZXRhZGF0YS5uYW1lLCBvbGRuYW1lID0gY21kLmVnZ19uYW1lLCBtZXRhZGF0YS5uYW1lCiAgICAgICAgbWV0YWRhdGEubG9uZ19kZXNjcmlwdGlvbl9jb250ZW50X3R5cGUgPSBnZXRhdHRyKAogICAgICAgICAgICBjbWQuZGlzdHJpYnV0aW9uLAogICAgICAgICAgICAnbG9uZ19kZXNjcmlwdGlvbl9jb250ZW50X3R5cGUnCiAgICAgICAgKQogICAgICAgIHRyeToKICAgICAgICAgICAgIyB3cml0ZSB1bmVzY2FwZWQgZGF0YSB0byBQS0ctSU5GTywgc28gb2xkZXIgcGtnX3Jlc291cmNlcwogICAgICAgICAgICAjIGNhbiBzdGlsbCBwYXJzZSBpdAogICAgICAgICAgICBtZXRhZGF0YS53cml0ZV9wa2dfaW5mbyhjbWQuZWdnX2luZm8pCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgbWV0YWRhdGEubmFtZSwgbWV0YWRhdGEudmVyc2lvbiA9IG9sZG5hbWUsIG9sZHZlcgoKICAgICAgICBzYWZlID0gZ2V0YXR0cihjbWQuZGlzdHJpYnV0aW9uLCAnemlwX3NhZmUnLCBOb25lKQoKICAgICAgICBiZGlzdF9lZ2cud3JpdGVfc2FmZXR5X2ZsYWcoY21kLmVnZ19pbmZvLCBzYWZlKQoKCmRlZiB3YXJuX2RlcGVuZHNfb2Jzb2xldGUoY21kLCBiYXNlbmFtZSwgZmlsZW5hbWUpOgogICAgaWYgb3MucGF0aC5leGlzdHMoZmlsZW5hbWUpOgogICAgICAgIGxvZy53YXJuKAogICAgICAgICAgICAiV0FSTklORzogJ2RlcGVuZHMudHh0JyBpcyBub3QgdXNlZCBieSBzZXR1cHRvb2xzIDAuNiFcbiIKICAgICAgICAgICAgIlVzZSB0aGUgaW5zdGFsbF9yZXF1aXJlcy9leHRyYXNfcmVxdWlyZSBzZXR1cCgpIGFyZ3MgaW5zdGVhZC4iCiAgICAgICAgKQoKCmRlZiBfd3JpdGVfcmVxdWlyZW1lbnRzKHN0cmVhbSwgcmVxcyk6CiAgICBsaW5lcyA9IHlpZWxkX2xpbmVzKHJlcXMgb3IgKCkpCiAgICBhcHBlbmRfY3IgPSBsYW1iZGEgbGluZTogbGluZSArICdcbicKICAgIGxpbmVzID0gbWFwKGFwcGVuZF9jciwgbGluZXMpCiAgICBzdHJlYW0ud3JpdGVsaW5lcyhsaW5lcykKCgpkZWYgd3JpdGVfcmVxdWlyZW1lbnRzKGNtZCwgYmFzZW5hbWUsIGZpbGVuYW1lKToKICAgIGRpc3QgPSBjbWQuZGlzdHJpYnV0aW9uCiAgICBkYXRhID0gc2l4LlN0cmluZ0lPKCkKICAgIF93cml0ZV9yZXF1aXJlbWVudHMoZGF0YSwgZGlzdC5pbnN0YWxsX3JlcXVpcmVzKQogICAgZXh0cmFzX3JlcXVpcmUgPSBkaXN0LmV4dHJhc19yZXF1aXJlIG9yIHt9CiAgICBmb3IgZXh0cmEgaW4gc29ydGVkKGV4dHJhc19yZXF1aXJlKToKICAgICAgICBkYXRhLndyaXRlKCdcblt7ZXh0cmF9XVxuJy5mb3JtYXQoKip2YXJzKCkpKQogICAgICAgIF93cml0ZV9yZXF1aXJlbWVudHMoZGF0YSwgZXh0cmFzX3JlcXVpcmVbZXh0cmFdKQogICAgY21kLndyaXRlX29yX2RlbGV0ZV9maWxlKCJyZXF1aXJlbWVudHMiLCBmaWxlbmFtZSwgZGF0YS5nZXR2YWx1ZSgpKQoKCmRlZiB3cml0ZV9zZXR1cF9yZXF1aXJlbWVudHMoY21kLCBiYXNlbmFtZSwgZmlsZW5hbWUpOgogICAgZGF0YSA9IGlvLlN0cmluZ0lPKCkKICAgIF93cml0ZV9yZXF1aXJlbWVudHMoZGF0YSwgY21kLmRpc3RyaWJ1dGlvbi5zZXR1cF9yZXF1aXJlcykKICAgIGNtZC53cml0ZV9vcl9kZWxldGVfZmlsZSgic2V0dXAtcmVxdWlyZW1lbnRzIiwgZmlsZW5hbWUsIGRhdGEuZ2V0dmFsdWUoKSkKCgpkZWYgd3JpdGVfdG9wbGV2ZWxfbmFtZXMoY21kLCBiYXNlbmFtZSwgZmlsZW5hbWUpOgogICAgcGtncyA9IGRpY3QuZnJvbWtleXMoCiAgICAgICAgWwogICAgICAgICAgICBrLnNwbGl0KCcuJywgMSlbMF0KICAgICAgICAgICAgZm9yIGsgaW4gY21kLmRpc3RyaWJ1dGlvbi5pdGVyX2Rpc3RyaWJ1dGlvbl9uYW1lcygpCiAgICAgICAgXQogICAgKQogICAgY21kLndyaXRlX2ZpbGUoInRvcC1sZXZlbCBuYW1lcyIsIGZpbGVuYW1lLCAnXG4nLmpvaW4oc29ydGVkKHBrZ3MpKSArICdcbicpCgoKZGVmIG92ZXJ3cml0ZV9hcmcoY21kLCBiYXNlbmFtZSwgZmlsZW5hbWUpOgogICAgd3JpdGVfYXJnKGNtZCwgYmFzZW5hbWUsIGZpbGVuYW1lLCBUcnVlKQoKCmRlZiB3cml0ZV9hcmcoY21kLCBiYXNlbmFtZSwgZmlsZW5hbWUsIGZvcmNlPUZhbHNlKToKICAgIGFyZ25hbWUgPSBvcy5wYXRoLnNwbGl0ZXh0KGJhc2VuYW1lKVswXQogICAgdmFsdWUgPSBnZXRhdHRyKGNtZC5kaXN0cmlidXRpb24sIGFyZ25hbWUsIE5vbmUpCiAgICBpZiB2YWx1ZSBpcyBub3QgTm9uZToKICAgICAgICB2YWx1ZSA9ICdcbicuam9pbih2YWx1ZSkgKyAnXG4nCiAgICBjbWQud3JpdGVfb3JfZGVsZXRlX2ZpbGUoYXJnbmFtZSwgZmlsZW5hbWUsIHZhbHVlLCBmb3JjZSkKCgpkZWYgd3JpdGVfZW50cmllcyhjbWQsIGJhc2VuYW1lLCBmaWxlbmFtZSk6CiAgICBlcCA9IGNtZC5kaXN0cmlidXRpb24uZW50cnlfcG9pbnRzCgogICAgaWYgaXNpbnN0YW5jZShlcCwgc2l4LnN0cmluZ190eXBlcykgb3IgZXAgaXMgTm9uZToKICAgICAgICBkYXRhID0gZXAKICAgIGVsaWYgZXAgaXMgbm90IE5vbmU6CiAgICAgICAgZGF0YSA9IFtdCiAgICAgICAgZm9yIHNlY3Rpb24sIGNvbnRlbnRzIGluIHNvcnRlZChlcC5pdGVtcygpKToKICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoY29udGVudHMsIHNpeC5zdHJpbmdfdHlwZXMpOgogICAgICAgICAgICAgICAgY29udGVudHMgPSBFbnRyeVBvaW50LnBhcnNlX2dyb3VwKHNlY3Rpb24sIGNvbnRlbnRzKQogICAgICAgICAgICAgICAgY29udGVudHMgPSAnXG4nLmpvaW4oc29ydGVkKG1hcChzdHIsIGNvbnRlbnRzLnZhbHVlcygpKSkpCiAgICAgICAgICAgIGRhdGEuYXBwZW5kKCdbJXNdXG4lc1xuXG4nICUgKHNlY3Rpb24sIGNvbnRlbnRzKSkKICAgICAgICBkYXRhID0gJycuam9pbihkYXRhKQoKICAgIGNtZC53cml0ZV9vcl9kZWxldGVfZmlsZSgnZW50cnkgcG9pbnRzJywgZmlsZW5hbWUsIGRhdGEsIFRydWUpCgoKZGVmIGdldF9wa2dfaW5mb19yZXZpc2lvbigpOgogICAgIiIiCiAgICBHZXQgYSAtciMjIyBvZmYgb2YgUEtHLUlORk8gVmVyc2lvbiBpbiBjYXNlIHRoaXMgaXMgYW4gc2Rpc3Qgb2YKICAgIGEgc3VidmVyc2lvbiByZXZpc2lvbi4KICAgICIiIgogICAgd2FybmluZ3Mud2FybigiZ2V0X3BrZ19pbmZvX3JldmlzaW9uIGlzIGRlcHJlY2F0ZWQuIiwgRGVwcmVjYXRpb25XYXJuaW5nKQogICAgaWYgb3MucGF0aC5leGlzdHMoJ1BLRy1JTkZPJyk6CiAgICAgICAgd2l0aCBpby5vcGVuKCdQS0ctSU5GTycpIGFzIGY6CiAgICAgICAgICAgIGZvciBsaW5lIGluIGY6CiAgICAgICAgICAgICAgICBtYXRjaCA9IHJlLm1hdGNoKHIiVmVyc2lvbjouKi1yKFxkKylccyokIiwgbGluZSkKICAgICAgICAgICAgICAgIGlmIG1hdGNoOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnQobWF0Y2guZ3JvdXAoMSkpCiAgICByZXR1cm4gMApQSwMEFAAAAAAAAAAhAI3btT9LEgAASxIAADUAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvaW5zdGFsbC5weWZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzQXJnRXJyb3IKaW1wb3J0IGluc3BlY3QKaW1wb3J0IGdsb2IKaW1wb3J0IHdhcm5pbmdzCmltcG9ydCBwbGF0Zm9ybQppbXBvcnQgZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbCBhcyBvcmlnCgppbXBvcnQgc2V0dXB0b29scwoKIyBQcmlvciB0byBudW1weSAxLjksIE51bVB5IHJlbGllcyBvbiB0aGUgJ19pbnN0YWxsJyBuYW1lLCBzbyBwcm92aWRlIGl0IGZvcgojIG5vdy4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3NldHVwdG9vbHMvaXNzdWVzLzE5OS8KX2luc3RhbGwgPSBvcmlnLmluc3RhbGwKCgpjbGFzcyBpbnN0YWxsKG9yaWcuaW5zdGFsbCk6CiAgICAiIiJVc2UgZWFzeV9pbnN0YWxsIHRvIGluc3RhbGwgdGhlIHBhY2thZ2UsIHcvZGVwZW5kZW5jaWVzIiIiCgogICAgdXNlcl9vcHRpb25zID0gb3JpZy5pbnN0YWxsLnVzZXJfb3B0aW9ucyArIFsKICAgICAgICAoJ29sZC1hbmQtdW5tYW5hZ2VhYmxlJywgTm9uZSwgIlRyeSBub3QgdG8gdXNlIHRoaXMhIiksCiAgICAgICAgKCdzaW5nbGUtdmVyc2lvbi1leHRlcm5hbGx5LW1hbmFnZWQnLCBOb25lLAogICAgICAgICAidXNlZCBieSBzeXN0ZW0gcGFja2FnZSBidWlsZGVycyB0byBjcmVhdGUgJ2ZsYXQnIGVnZ3MiKSwKICAgIF0KICAgIGJvb2xlYW5fb3B0aW9ucyA9IG9yaWcuaW5zdGFsbC5ib29sZWFuX29wdGlvbnMgKyBbCiAgICAgICAgJ29sZC1hbmQtdW5tYW5hZ2VhYmxlJywgJ3NpbmdsZS12ZXJzaW9uLWV4dGVybmFsbHktbWFuYWdlZCcsCiAgICBdCiAgICBuZXdfY29tbWFuZHMgPSBbCiAgICAgICAgKCdpbnN0YWxsX2VnZ19pbmZvJywgbGFtYmRhIHNlbGY6IFRydWUpLAogICAgICAgICgnaW5zdGFsbF9zY3JpcHRzJywgbGFtYmRhIHNlbGY6IFRydWUpLAogICAgXQogICAgX25jID0gZGljdChuZXdfY29tbWFuZHMpCgogICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBvcmlnLmluc3RhbGwuaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpCiAgICAgICAgc2VsZi5vbGRfYW5kX3VubWFuYWdlYWJsZSA9IE5vbmUKICAgICAgICBzZWxmLnNpbmdsZV92ZXJzaW9uX2V4dGVybmFsbHlfbWFuYWdlZCA9IE5vbmUKCiAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBvcmlnLmluc3RhbGwuZmluYWxpemVfb3B0aW9ucyhzZWxmKQogICAgICAgIGlmIHNlbGYucm9vdDoKICAgICAgICAgICAgc2VsZi5zaW5nbGVfdmVyc2lvbl9leHRlcm5hbGx5X21hbmFnZWQgPSBUcnVlCiAgICAgICAgZWxpZiBzZWxmLnNpbmdsZV92ZXJzaW9uX2V4dGVybmFsbHlfbWFuYWdlZDoKICAgICAgICAgICAgaWYgbm90IHNlbGYucm9vdCBhbmQgbm90IHNlbGYucmVjb3JkOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzQXJnRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgIllvdSBtdXN0IHNwZWNpZnkgLS1yZWNvcmQgb3IgLS1yb290IHdoZW4gYnVpbGRpbmcgc3lzdGVtIgogICAgICAgICAgICAgICAgICAgICIgcGFja2FnZXMiCiAgICAgICAgICAgICAgICApCgogICAgZGVmIGhhbmRsZV9leHRyYV9wYXRoKHNlbGYpOgogICAgICAgIGlmIHNlbGYucm9vdCBvciBzZWxmLnNpbmdsZV92ZXJzaW9uX2V4dGVybmFsbHlfbWFuYWdlZDoKICAgICAgICAgICAgIyBleHBsaWNpdCBiYWNrd2FyZC1jb21wYXRpYmlsaXR5IG1vZGUsIGFsbG93IGV4dHJhX3BhdGggdG8gd29yawogICAgICAgICAgICByZXR1cm4gb3JpZy5pbnN0YWxsLmhhbmRsZV9leHRyYV9wYXRoKHNlbGYpCgogICAgICAgICMgSWdub3JlIGV4dHJhX3BhdGggd2hlbiBpbnN0YWxsaW5nIGFuIGVnZyAob3IgYmVpbmcgcnVuIGJ5IGFub3RoZXIKICAgICAgICAjIGNvbW1hbmQgd2l0aG91dCAtLXJvb3Qgb3IgLS1zaW5nbGUtdmVyc2lvbi1leHRlcm5hbGx5LW1hbmFnZWQKICAgICAgICBzZWxmLnBhdGhfZmlsZSA9IE5vbmUKICAgICAgICBzZWxmLmV4dHJhX2RpcnMgPSAnJwoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgIyBFeHBsaWNpdCByZXF1ZXN0IGZvciBvbGQtc3R5bGUgaW5zdGFsbD8gIEp1c3QgZG8gaXQKICAgICAgICBpZiBzZWxmLm9sZF9hbmRfdW5tYW5hZ2VhYmxlIG9yIHNlbGYuc2luZ2xlX3ZlcnNpb25fZXh0ZXJuYWxseV9tYW5hZ2VkOgogICAgICAgICAgICByZXR1cm4gb3JpZy5pbnN0YWxsLnJ1bihzZWxmKQoKICAgICAgICBpZiBub3Qgc2VsZi5fY2FsbGVkX2Zyb21fc2V0dXAoaW5zcGVjdC5jdXJyZW50ZnJhbWUoKSk6CiAgICAgICAgICAgICMgUnVuIGluIGJhY2t3YXJkLWNvbXBhdGliaWxpdHkgbW9kZSB0byBzdXBwb3J0IGJkaXN0XyogY29tbWFuZHMuCiAgICAgICAgICAgIG9yaWcuaW5zdGFsbC5ydW4oc2VsZikKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmRvX2VnZ19pbnN0YWxsKCkKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2NhbGxlZF9mcm9tX3NldHVwKHJ1bl9mcmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgQXR0ZW1wdCB0byBkZXRlY3Qgd2hldGhlciBydW4oKSB3YXMgY2FsbGVkIGZyb20gc2V0dXAoKSBvciBieSBhbm90aGVyCiAgICAgICAgY29tbWFuZC4gIElmIGNhbGxlZCBieSBzZXR1cCgpLCB0aGUgcGFyZW50IGNhbGxlciB3aWxsIGJlIHRoZQogICAgICAgICdydW5fY29tbWFuZCcgbWV0aG9kIGluICdkaXN0dXRpbHMuZGlzdCcsIGFuZCAqaXRzKiBjYWxsZXIgd2lsbCBiZQogICAgICAgIHRoZSAncnVuX2NvbW1hbmRzJyBtZXRob2QuICBJZiBjYWxsZWQgYW55IG90aGVyIHdheSwgdGhlCiAgICAgICAgaW1tZWRpYXRlIGNhbGxlciAqbWlnaHQqIGJlICdydW5fY29tbWFuZCcsIGJ1dCBpdCB3b24ndCBoYXZlIGJlZW4KICAgICAgICBjYWxsZWQgYnkgJ3J1bl9jb21tYW5kcycuIFJldHVybiBUcnVlIGluIHRoYXQgY2FzZSBvciBpZiBhIGNhbGwgc3RhY2sKICAgICAgICBpcyB1bmF2YWlsYWJsZS4gUmV0dXJuIEZhbHNlIG90aGVyd2lzZS4KICAgICAgICAiIiIKICAgICAgICBpZiBydW5fZnJhbWUgaXMgTm9uZToKICAgICAgICAgICAgbXNnID0gIkNhbGwgc3RhY2sgbm90IGF2YWlsYWJsZS4gYmRpc3RfKiBjb21tYW5kcyBtYXkgZmFpbC4iCiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4obXNnKQogICAgICAgICAgICBpZiBwbGF0Zm9ybS5weXRob25faW1wbGVtZW50YXRpb24oKSA9PSAnSXJvblB5dGhvbic6CiAgICAgICAgICAgICAgICBtc2cgPSAiRm9yIGJlc3QgcmVzdWx0cywgcGFzcyAtWDpGcmFtZXMgdG8gZW5hYmxlIGNhbGwgc3RhY2suIgogICAgICAgICAgICAgICAgd2FybmluZ3Mud2Fybihtc2cpCiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgcmVzID0gaW5zcGVjdC5nZXRvdXRlcmZyYW1lcyhydW5fZnJhbWUpWzJdCiAgICAgICAgY2FsbGVyLCA9IHJlc1s6MV0KICAgICAgICBpbmZvID0gaW5zcGVjdC5nZXRmcmFtZWluZm8oY2FsbGVyKQogICAgICAgIGNhbGxlcl9tb2R1bGUgPSBjYWxsZXIuZl9nbG9iYWxzLmdldCgnX19uYW1lX18nLCAnJykKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICBjYWxsZXJfbW9kdWxlID09ICdkaXN0dXRpbHMuZGlzdCcKICAgICAgICAgICAgYW5kIGluZm8uZnVuY3Rpb24gPT0gJ3J1bl9jb21tYW5kcycKICAgICAgICApCgogICAgZGVmIGRvX2VnZ19pbnN0YWxsKHNlbGYpOgoKICAgICAgICBlYXN5X2luc3RhbGwgPSBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfY29tbWFuZF9jbGFzcygnZWFzeV9pbnN0YWxsJykKCiAgICAgICAgY21kID0gZWFzeV9pbnN0YWxsKAogICAgICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbiwgYXJncz0ieCIsIHJvb3Q9c2VsZi5yb290LCByZWNvcmQ9c2VsZi5yZWNvcmQsCiAgICAgICAgKQogICAgICAgIGNtZC5lbnN1cmVfZmluYWxpemVkKCkgICMgZmluYWxpemUgYmVmb3JlIGJkaXN0X2VnZyBtdW5nZXMgaW5zdGFsbCBjbWQKICAgICAgICBjbWQuYWx3YXlzX2NvcHlfZnJvbSA9ICcuJyAgIyBtYWtlIHN1cmUgbG9jYWwtZGlyIGVnZ3MgZ2V0IGluc3RhbGxlZAoKICAgICAgICAjIHBpY2sgdXAgc2V0dXAtZGlyIC5lZ2cgZmlsZXMgb25seTogbm8gLmVnZy1pbmZvCiAgICAgICAgY21kLnBhY2thZ2VfaW5kZXguc2NhbihnbG9iLmdsb2IoJyouZWdnJykpCgogICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2JkaXN0X2VnZycpCiAgICAgICAgYXJncyA9IFtzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfY29tbWFuZF9vYmooJ2JkaXN0X2VnZycpLmVnZ19vdXRwdXRdCgogICAgICAgIGlmIHNldHVwdG9vbHMuYm9vdHN0cmFwX2luc3RhbGxfZnJvbToKICAgICAgICAgICAgIyBCb290c3RyYXAgc2VsZi1pbnN0YWxsYXRpb24gb2Ygc2V0dXB0b29scwogICAgICAgICAgICBhcmdzLmluc2VydCgwLCBzZXR1cHRvb2xzLmJvb3RzdHJhcF9pbnN0YWxsX2Zyb20pCgogICAgICAgIGNtZC5hcmdzID0gYXJncwogICAgICAgIGNtZC5ydW4oKQogICAgICAgIHNldHVwdG9vbHMuYm9vdHN0cmFwX2luc3RhbGxfZnJvbSA9IE5vbmUKCgojIFhYWCBQeXRob24gMy4xIGRvZXNuJ3Qgc2VlIF9uYyBpZiB0aGlzIGlzIGluc2lkZSB0aGUgY2xhc3MKaW5zdGFsbC5zdWJfY29tbWFuZHMgPSAoCiAgICBbY21kIGZvciBjbWQgaW4gb3JpZy5pbnN0YWxsLnN1Yl9jb21tYW5kcyBpZiBjbWRbMF0gbm90IGluIGluc3RhbGwuX25jXSArCiAgICBpbnN0YWxsLm5ld19jb21tYW5kcwopClBLAwQUAAAAAAAAACEAXNKo5ZsIAACbCAAAPgAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9pbnN0YWxsX2VnZ19pbmZvLnB5ZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZywgZGlyX3V0aWwKaW1wb3J0IG9zCgpmcm9tIHNldHVwdG9vbHMgaW1wb3J0IENvbW1hbmQKZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBuYW1lc3BhY2VzCmZyb20gc2V0dXB0b29scy5hcmNoaXZlX3V0aWwgaW1wb3J0IHVucGFja19hcmNoaXZlCmltcG9ydCBwa2dfcmVzb3VyY2VzCgoKY2xhc3MgaW5zdGFsbF9lZ2dfaW5mbyhuYW1lc3BhY2VzLkluc3RhbGxlciwgQ29tbWFuZCk6CiAgICAiIiJJbnN0YWxsIGFuIC5lZ2ctaW5mbyBkaXJlY3RvcnkgZm9yIHRoZSBwYWNrYWdlIiIiCgogICAgZGVzY3JpcHRpb24gPSAiSW5zdGFsbCBhbiAuZWdnLWluZm8gZGlyZWN0b3J5IGZvciB0aGUgcGFja2FnZSIKCiAgICB1c2VyX29wdGlvbnMgPSBbCiAgICAgICAgKCdpbnN0YWxsLWRpcj0nLCAnZCcsICJkaXJlY3RvcnkgdG8gaW5zdGFsbCB0byIpLAogICAgXQoKICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgc2VsZi5pbnN0YWxsX2RpciA9IE5vbmUKCiAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBzZWxmLnNldF91bmRlZmluZWRfb3B0aW9ucygnaW5zdGFsbF9saWInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnaW5zdGFsbF9kaXInLCAnaW5zdGFsbF9kaXInKSkKICAgICAgICBlaV9jbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgiZWdnX2luZm8iKQogICAgICAgIGJhc2VuYW1lID0gcGtnX3Jlc291cmNlcy5EaXN0cmlidXRpb24oCiAgICAgICAgICAgIE5vbmUsIE5vbmUsIGVpX2NtZC5lZ2dfbmFtZSwgZWlfY21kLmVnZ192ZXJzaW9uCiAgICAgICAgKS5lZ2dfbmFtZSgpICsgJy5lZ2ctaW5mbycKICAgICAgICBzZWxmLnNvdXJjZSA9IGVpX2NtZC5lZ2dfaW5mbwogICAgICAgIHNlbGYudGFyZ2V0ID0gb3MucGF0aC5qb2luKHNlbGYuaW5zdGFsbF9kaXIsIGJhc2VuYW1lKQogICAgICAgIHNlbGYub3V0cHV0cyA9IFtdCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdlZ2dfaW5mbycpCiAgICAgICAgaWYgb3MucGF0aC5pc2RpcihzZWxmLnRhcmdldCkgYW5kIG5vdCBvcy5wYXRoLmlzbGluayhzZWxmLnRhcmdldCk6CiAgICAgICAgICAgIGRpcl91dGlsLnJlbW92ZV90cmVlKHNlbGYudGFyZ2V0LCBkcnlfcnVuPXNlbGYuZHJ5X3J1bikKICAgICAgICBlbGlmIG9zLnBhdGguZXhpc3RzKHNlbGYudGFyZ2V0KToKICAgICAgICAgICAgc2VsZi5leGVjdXRlKG9zLnVubGluaywgKHNlbGYudGFyZ2V0LCksICJSZW1vdmluZyAiICsgc2VsZi50YXJnZXQpCiAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgcGtnX3Jlc291cmNlcy5lbnN1cmVfZGlyZWN0b3J5KHNlbGYudGFyZ2V0KQogICAgICAgIHNlbGYuZXhlY3V0ZSgKICAgICAgICAgICAgc2VsZi5jb3B5dHJlZSwgKCksICJDb3B5aW5nICVzIHRvICVzIiAlIChzZWxmLnNvdXJjZSwgc2VsZi50YXJnZXQpCiAgICAgICAgKQogICAgICAgIHNlbGYuaW5zdGFsbF9uYW1lc3BhY2VzKCkKCiAgICBkZWYgZ2V0X291dHB1dHMoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYub3V0cHV0cwoKICAgIGRlZiBjb3B5dHJlZShzZWxmKToKICAgICAgICAjIENvcHkgdGhlIC5lZ2ctaW5mbyB0cmVlIHRvIHNpdGUtcGFja2FnZXMKICAgICAgICBkZWYgc2tpbW1lcihzcmMsIGRzdCk6CiAgICAgICAgICAgICMgZmlsdGVyIG91dCBzb3VyY2UtY29udHJvbCBkaXJlY3Rvcmllczsgbm90ZSB0aGF0ICdzcmMnIGlzIGFsd2F5cwogICAgICAgICAgICAjIGEgJy8nLXNlcGFyYXRlZCBwYXRoLCByZWdhcmRsZXNzIG9mIHBsYXRmb3JtLiAgJ2RzdCcgaXMgYQogICAgICAgICAgICAjIHBsYXRmb3JtLXNwZWNpZmljIHBhdGguCiAgICAgICAgICAgIGZvciBza2lwIGluICcuc3ZuLycsICdDVlMvJzoKICAgICAgICAgICAgICAgIGlmIHNyYy5zdGFydHN3aXRoKHNraXApIG9yICcvJyArIHNraXAgaW4gc3JjOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgICAgIHNlbGYub3V0cHV0cy5hcHBlbmQoZHN0KQogICAgICAgICAgICBsb2cuZGVidWcoIkNvcHlpbmcgJXMgdG8gJXMiLCBzcmMsIGRzdCkKICAgICAgICAgICAgcmV0dXJuIGRzdAoKICAgICAgICB1bnBhY2tfYXJjaGl2ZShzZWxmLnNvdXJjZSwgc2VsZi50YXJnZXQsIHNraW1tZXIpClBLAwQUAAAAAAAAACEAkJw7UwAPAAAADwAAOQAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9pbnN0YWxsX2xpYi5weWltcG9ydCBvcwppbXBvcnQgaW1wCmZyb20gaXRlcnRvb2xzIGltcG9ydCBwcm9kdWN0LCBzdGFybWFwCmltcG9ydCBkaXN0dXRpbHMuY29tbWFuZC5pbnN0YWxsX2xpYiBhcyBvcmlnCgoKY2xhc3MgaW5zdGFsbF9saWIob3JpZy5pbnN0YWxsX2xpYik6CiAgICAiIiJEb24ndCBhZGQgY29tcGlsZWQgZmxhZ3MgdG8gZmlsZW5hbWVzIG9mIG5vbi1QeXRob24gZmlsZXMiIiIKCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgIHNlbGYuYnVpbGQoKQogICAgICAgIG91dGZpbGVzID0gc2VsZi5pbnN0YWxsKCkKICAgICAgICBpZiBvdXRmaWxlcyBpcyBub3QgTm9uZToKICAgICAgICAgICAgIyBhbHdheXMgY29tcGlsZSwgaW4gY2FzZSB3ZSBoYXZlIGFueSBleHRlbnNpb24gc3R1YnMgdG8gZGVhbCB3aXRoCiAgICAgICAgICAgIHNlbGYuYnl0ZV9jb21waWxlKG91dGZpbGVzKQoKICAgIGRlZiBnZXRfZXhjbHVzaW9ucyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gYSBjb2xsZWN0aW9ucy5TaXplZCBjb2xsZWN0aW9ucy5Db250YWluZXIgb2YgcGF0aHMgdG8gYmUKICAgICAgICBleGNsdWRlZCBmb3Igc2luZ2xlX3ZlcnNpb25fZXh0ZXJuYWxseV9tYW5hZ2VkIGluc3RhbGxhdGlvbnMuCiAgICAgICAgIiIiCiAgICAgICAgYWxsX3BhY2thZ2VzID0gKAogICAgICAgICAgICBwa2cKICAgICAgICAgICAgZm9yIG5zX3BrZyBpbiBzZWxmLl9nZXRfU1ZFTV9OU1BzKCkKICAgICAgICAgICAgZm9yIHBrZyBpbiBzZWxmLl9hbGxfcGFja2FnZXMobnNfcGtnKQogICAgICAgICkKCiAgICAgICAgZXhjbF9zcGVjcyA9IHByb2R1Y3QoYWxsX3BhY2thZ2VzLCBzZWxmLl9nZW5fZXhjbHVzaW9uX3BhdGhzKCkpCiAgICAgICAgcmV0dXJuIHNldChzdGFybWFwKHNlbGYuX2V4Y2x1ZGVfcGtnX3BhdGgsIGV4Y2xfc3BlY3MpKQoKICAgIGRlZiBfZXhjbHVkZV9wa2dfcGF0aChzZWxmLCBwa2csIGV4Y2x1c2lvbl9wYXRoKToKICAgICAgICAiIiIKICAgICAgICBHaXZlbiBhIHBhY2thZ2UgbmFtZSBhbmQgZXhjbHVzaW9uIHBhdGggd2l0aGluIHRoYXQgcGFja2FnZSwKICAgICAgICBjb21wdXRlIHRoZSBmdWxsIGV4Y2x1c2lvbiBwYXRoLgogICAgICAgICIiIgogICAgICAgIHBhcnRzID0gcGtnLnNwbGl0KCcuJykgKyBbZXhjbHVzaW9uX3BhdGhdCiAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihzZWxmLmluc3RhbGxfZGlyLCAqcGFydHMpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9hbGxfcGFja2FnZXMocGtnX25hbWUpOgogICAgICAgICIiIgogICAgICAgID4+PiBsaXN0KGluc3RhbGxfbGliLl9hbGxfcGFja2FnZXMoJ2Zvby5iYXIuYmF6JykpCiAgICAgICAgWydmb28uYmFyLmJheicsICdmb28uYmFyJywgJ2ZvbyddCiAgICAgICAgIiIiCiAgICAgICAgd2hpbGUgcGtnX25hbWU6CiAgICAgICAgICAgIHlpZWxkIHBrZ19uYW1lCiAgICAgICAgICAgIHBrZ19uYW1lLCBzZXAsIGNoaWxkID0gcGtnX25hbWUucnBhcnRpdGlvbignLicpCgogICAgZGVmIF9nZXRfU1ZFTV9OU1BzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEdldCBuYW1lc3BhY2UgcGFja2FnZXMgKGxpc3QpIGJ1dCBvbmx5IGZvcgogICAgICAgIHNpbmdsZV92ZXJzaW9uX2V4dGVybmFsbHlfbWFuYWdlZCBpbnN0YWxsYXRpb25zIGFuZCBlbXB0eSBvdGhlcndpc2UuCiAgICAgICAgIiIiCiAgICAgICAgIyBUT0RPOiBpcyBpdCBuZWNlc3NhcnkgdG8gc2hvcnQtY2lyY3VpdCBoZXJlPyBpLmUuIHdoYXQncyB0aGUgY29zdAogICAgICAgICMgaWYgZ2V0X2ZpbmFsaXplZF9jb21tYW5kIGlzIGNhbGxlZCBldmVuIHdoZW4gbmFtZXNwYWNlX3BhY2thZ2VzIGlzCiAgICAgICAgIyBGYWxzZT8KICAgICAgICBpZiBub3Qgc2VsZi5kaXN0cmlidXRpb24ubmFtZXNwYWNlX3BhY2thZ2VzOgogICAgICAgICAgICByZXR1cm4gW10KCiAgICAgICAgaW5zdGFsbF9jbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnaW5zdGFsbCcpCiAgICAgICAgc3ZlbSA9IGluc3RhbGxfY21kLnNpbmdsZV92ZXJzaW9uX2V4dGVybmFsbHlfbWFuYWdlZAoKICAgICAgICByZXR1cm4gc2VsZi5kaXN0cmlidXRpb24ubmFtZXNwYWNlX3BhY2thZ2VzIGlmIHN2ZW0gZWxzZSBbXQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfZ2VuX2V4Y2x1c2lvbl9wYXRocygpOgogICAgICAgICIiIgogICAgICAgIEdlbmVyYXRlIGZpbGUgcGF0aHMgdG8gYmUgZXhjbHVkZWQgZm9yIG5hbWVzcGFjZSBwYWNrYWdlcyAoYnl0ZWNvZGUKICAgICAgICBjYWNoZSBmaWxlcykuCiAgICAgICAgIiIiCiAgICAgICAgIyBhbHdheXMgZXhjbHVkZSB0aGUgcGFja2FnZSBtb2R1bGUgaXRzZWxmCiAgICAgICAgeWllbGQgJ19faW5pdF9fLnB5JwoKICAgICAgICB5aWVsZCAnX19pbml0X18ucHljJwogICAgICAgIHlpZWxkICdfX2luaXRfXy5weW8nCgogICAgICAgIGlmIG5vdCBoYXNhdHRyKGltcCwgJ2dldF90YWcnKToKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGJhc2UgPSBvcy5wYXRoLmpvaW4oJ19fcHljYWNoZV9fJywgJ19faW5pdF9fLicgKyBpbXAuZ2V0X3RhZygpKQogICAgICAgIHlpZWxkIGJhc2UgKyAnLnB5YycKICAgICAgICB5aWVsZCBiYXNlICsgJy5weW8nCiAgICAgICAgeWllbGQgYmFzZSArICcub3B0LTEucHljJwogICAgICAgIHlpZWxkIGJhc2UgKyAnLm9wdC0yLnB5YycKCiAgICBkZWYgY29weV90cmVlKAogICAgICAgICAgICBzZWxmLCBpbmZpbGUsIG91dGZpbGUsCiAgICAgICAgICAgIHByZXNlcnZlX21vZGU9MSwgcHJlc2VydmVfdGltZXM9MSwgcHJlc2VydmVfc3ltbGlua3M9MCwgbGV2ZWw9MQogICAgKToKICAgICAgICBhc3NlcnQgcHJlc2VydmVfbW9kZSBhbmQgcHJlc2VydmVfdGltZXMgYW5kIG5vdCBwcmVzZXJ2ZV9zeW1saW5rcwogICAgICAgIGV4Y2x1ZGUgPSBzZWxmLmdldF9leGNsdXNpb25zKCkKCiAgICAgICAgaWYgbm90IGV4Y2x1ZGU6CiAgICAgICAgICAgIHJldHVybiBvcmlnLmluc3RhbGxfbGliLmNvcHlfdHJlZShzZWxmLCBpbmZpbGUsIG91dGZpbGUpCgogICAgICAgICMgRXhjbHVkZSBuYW1lc3BhY2UgcGFja2FnZSBfX2luaXRfXy5weSogZmlsZXMgZnJvbSB0aGUgb3V0cHV0CgogICAgICAgIGZyb20gc2V0dXB0b29scy5hcmNoaXZlX3V0aWwgaW1wb3J0IHVucGFja19kaXJlY3RvcnkKICAgICAgICBmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCgogICAgICAgIG91dGZpbGVzID0gW10KCiAgICAgICAgZGVmIHBmKHNyYywgZHN0KToKICAgICAgICAgICAgaWYgZHN0IGluIGV4Y2x1ZGU6CiAgICAgICAgICAgICAgICBsb2cud2FybigiU2tpcHBpbmcgaW5zdGFsbGF0aW9uIG9mICVzIChuYW1lc3BhY2UgcGFja2FnZSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgZHN0KQogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgICAgICBsb2cuaW5mbygiY29weWluZyAlcyAtPiAlcyIsIHNyYywgb3MucGF0aC5kaXJuYW1lKGRzdCkpCiAgICAgICAgICAgIG91dGZpbGVzLmFwcGVuZChkc3QpCiAgICAgICAgICAgIHJldHVybiBkc3QKCiAgICAgICAgdW5wYWNrX2RpcmVjdG9yeShpbmZpbGUsIG91dGZpbGUsIHBmKQogICAgICAgIHJldHVybiBvdXRmaWxlcwoKICAgIGRlZiBnZXRfb3V0cHV0cyhzZWxmKToKICAgICAgICBvdXRwdXRzID0gb3JpZy5pbnN0YWxsX2xpYi5nZXRfb3V0cHV0cyhzZWxmKQogICAgICAgIGV4Y2x1ZGUgPSBzZWxmLmdldF9leGNsdXNpb25zKCkKICAgICAgICBpZiBleGNsdWRlOgogICAgICAgICAgICByZXR1cm4gW2YgZm9yIGYgaW4gb3V0cHV0cyBpZiBmIG5vdCBpbiBleGNsdWRlXQogICAgICAgIHJldHVybiBvdXRwdXRzClBLAwQUAAAAAAAAACEARj/xHocJAACHCQAAPQAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9pbnN0YWxsX3NjcmlwdHMucHlmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCmltcG9ydCBkaXN0dXRpbHMuY29tbWFuZC5pbnN0YWxsX3NjcmlwdHMgYXMgb3JpZwppbXBvcnQgb3MKaW1wb3J0IHN5cwoKZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCBEaXN0cmlidXRpb24sIFBhdGhNZXRhZGF0YSwgZW5zdXJlX2RpcmVjdG9yeQoKCmNsYXNzIGluc3RhbGxfc2NyaXB0cyhvcmlnLmluc3RhbGxfc2NyaXB0cyk6CiAgICAiIiJEbyBub3JtYWwgc2NyaXB0IGluc3RhbGwsIHBsdXMgYW55IGVnZ19pbmZvIHdyYXBwZXIgc2NyaXB0cyIiIgoKICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgb3JpZy5pbnN0YWxsX3NjcmlwdHMuaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpCiAgICAgICAgc2VsZi5ub19lcCA9IEZhbHNlCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICBpbXBvcnQgc2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbCBhcyBlaQoKICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCJlZ2dfaW5mbyIpCiAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24uc2NyaXB0czoKICAgICAgICAgICAgb3JpZy5pbnN0YWxsX3NjcmlwdHMucnVuKHNlbGYpICAjIHJ1biBmaXJzdCB0byBzZXQgdXAgc2VsZi5vdXRmaWxlcwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHNlbGYub3V0ZmlsZXMgPSBbXQogICAgICAgIGlmIHNlbGYubm9fZXA6CiAgICAgICAgICAgICMgZG9uJ3QgaW5zdGFsbCBlbnRyeSBwb2ludCBzY3JpcHRzIGludG8gLmVnZyBmaWxlIQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgZWlfY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoImVnZ19pbmZvIikKICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uKAogICAgICAgICAgICBlaV9jbWQuZWdnX2Jhc2UsIFBhdGhNZXRhZGF0YShlaV9jbWQuZWdnX2Jhc2UsIGVpX2NtZC5lZ2dfaW5mbyksCiAgICAgICAgICAgIGVpX2NtZC5lZ2dfbmFtZSwgZWlfY21kLmVnZ192ZXJzaW9uLAogICAgICAgICkKICAgICAgICBic19jbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGRfc2NyaXB0cycpCiAgICAgICAgZXhlY19wYXJhbSA9IGdldGF0dHIoYnNfY21kLCAnZXhlY3V0YWJsZScsIE5vbmUpCiAgICAgICAgYndfY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoImJkaXN0X3dpbmluc3QiKQogICAgICAgIGlzX3dpbmluc3QgPSBnZXRhdHRyKGJ3X2NtZCwgJ19pc19ydW5uaW5nJywgRmFsc2UpCiAgICAgICAgd3JpdGVyID0gZWkuU2NyaXB0V3JpdGVyCiAgICAgICAgaWYgaXNfd2luaW5zdDoKICAgICAgICAgICAgZXhlY19wYXJhbSA9ICJweXRob24uZXhlIgogICAgICAgICAgICB3cml0ZXIgPSBlaS5XaW5kb3dzU2NyaXB0V3JpdGVyCiAgICAgICAgaWYgZXhlY19wYXJhbSA9PSBzeXMuZXhlY3V0YWJsZToKICAgICAgICAgICAgIyBJbiBjYXNlIHRoZSBwYXRoIHRvIHRoZSBQeXRob24gZXhlY3V0YWJsZSBjb250YWlucyBhIHNwYWNlLCB3cmFwCiAgICAgICAgICAgICMgaXQgc28gaXQncyBub3Qgc3BsaXQgdXAuCiAgICAgICAgICAgIGV4ZWNfcGFyYW0gPSBbZXhlY19wYXJhbV0KICAgICAgICAjIHJlc29sdmUgdGhlIHdyaXRlciB0byB0aGUgZW52aXJvbm1lbnQKICAgICAgICB3cml0ZXIgPSB3cml0ZXIuYmVzdCgpCiAgICAgICAgY21kID0gd3JpdGVyLmNvbW1hbmRfc3BlY19jbGFzcy5iZXN0KCkuZnJvbV9wYXJhbShleGVjX3BhcmFtKQogICAgICAgIGZvciBhcmdzIGluIHdyaXRlci5nZXRfYXJncyhkaXN0LCBjbWQuYXNfaGVhZGVyKCkpOgogICAgICAgICAgICBzZWxmLndyaXRlX3NjcmlwdCgqYXJncykKCiAgICBkZWYgd3JpdGVfc2NyaXB0KHNlbGYsIHNjcmlwdF9uYW1lLCBjb250ZW50cywgbW9kZT0idCIsICppZ25vcmVkKToKICAgICAgICAiIiJXcml0ZSBhbiBleGVjdXRhYmxlIGZpbGUgdG8gdGhlIHNjcmlwdHMgZGlyZWN0b3J5IiIiCiAgICAgICAgZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQuZWFzeV9pbnN0YWxsIGltcG9ydCBjaG1vZCwgY3VycmVudF91bWFzawoKICAgICAgICBsb2cuaW5mbygiSW5zdGFsbGluZyAlcyBzY3JpcHQgdG8gJXMiLCBzY3JpcHRfbmFtZSwgc2VsZi5pbnN0YWxsX2RpcikKICAgICAgICB0YXJnZXQgPSBvcy5wYXRoLmpvaW4oc2VsZi5pbnN0YWxsX2Rpciwgc2NyaXB0X25hbWUpCiAgICAgICAgc2VsZi5vdXRmaWxlcy5hcHBlbmQodGFyZ2V0KQoKICAgICAgICBtYXNrID0gY3VycmVudF91bWFzaygpCiAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgZW5zdXJlX2RpcmVjdG9yeSh0YXJnZXQpCiAgICAgICAgICAgIGYgPSBvcGVuKHRhcmdldCwgInciICsgbW9kZSkKICAgICAgICAgICAgZi53cml0ZShjb250ZW50cykKICAgICAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgICAgIGNobW9kKHRhcmdldCwgMG83NzcgLSBtYXNrKQpQSwMEFAAAAAAAAAAhAH1zYL96EwAAehMAADgAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvcHkzNmNvbXBhdC5weWltcG9ydCBvcwpmcm9tIGdsb2IgaW1wb3J0IGdsb2IKZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgY29udmVydF9wYXRoCmZyb20gZGlzdHV0aWxzLmNvbW1hbmQgaW1wb3J0IHNkaXN0Cgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeC5tb3ZlcyBpbXBvcnQgZmlsdGVyCgoKY2xhc3Mgc2Rpc3RfYWRkX2RlZmF1bHRzOgogICAgIiIiCiAgICBNaXgtaW4gcHJvdmlkaW5nIGZvcndhcmQtY29tcGF0aWJpbGl0eSBmb3IgZnVuY3Rpb25hbGl0eSBhcyBmb3VuZCBpbgogICAgZGlzdHV0aWxzIG9uIFB5dGhvbiAzLjcuCgogICAgRG8gbm90IGVkaXQgdGhlIGNvZGUgaW4gdGhpcyBjbGFzcyBleGNlcHQgdG8gdXBkYXRlIGZ1bmN0aW9uYWxpdHkKICAgIGFzIGltcGxlbWVudGVkIGluIGRpc3R1dGlscy4gSW5zdGVhZCwgb3ZlcnJpZGUgaW4gdGhlIHN1YmNsYXNzLgogICAgIiIiCgogICAgZGVmIGFkZF9kZWZhdWx0cyhzZWxmKToKICAgICAgICAiIiJBZGQgYWxsIHRoZSBkZWZhdWx0IGZpbGVzIHRvIHNlbGYuZmlsZWxpc3Q6CiAgICAgICAgICAtIFJFQURNRSBvciBSRUFETUUudHh0CiAgICAgICAgICAtIHNldHVwLnB5CiAgICAgICAgICAtIHRlc3QvdGVzdCoucHkKICAgICAgICAgIC0gYWxsIHB1cmUgUHl0aG9uIG1vZHVsZXMgbWVudGlvbmVkIGluIHNldHVwIHNjcmlwdAogICAgICAgICAgLSBhbGwgZmlsZXMgcG9pbnRlZCBieSBwYWNrYWdlX2RhdGEgKGJ1aWxkX3B5KQogICAgICAgICAgLSBhbGwgZmlsZXMgZGVmaW5lZCBpbiBkYXRhX2ZpbGVzLgogICAgICAgICAgLSBhbGwgZmlsZXMgZGVmaW5lZCBhcyBzY3JpcHRzLgogICAgICAgICAgLSBhbGwgQyBzb3VyY2VzIGxpc3RlZCBhcyBwYXJ0IG9mIGV4dGVuc2lvbnMgb3IgQyBsaWJyYXJpZXMKICAgICAgICAgICAgaW4gdGhlIHNldHVwIHNjcmlwdCAoZG9lc24ndCBjYXRjaCBDIGhlYWRlcnMhKQogICAgICAgIFdhcm5zIGlmIChSRUFETUUgb3IgUkVBRE1FLnR4dCkgb3Igc2V0dXAucHkgYXJlIG1pc3Npbmc7IGV2ZXJ5dGhpbmcKICAgICAgICBlbHNlIGlzIG9wdGlvbmFsLgogICAgICAgICIiIgogICAgICAgIHNlbGYuX2FkZF9kZWZhdWx0c19zdGFuZGFyZHMoKQogICAgICAgIHNlbGYuX2FkZF9kZWZhdWx0c19vcHRpb25hbCgpCiAgICAgICAgc2VsZi5fYWRkX2RlZmF1bHRzX3B5dGhvbigpCiAgICAgICAgc2VsZi5fYWRkX2RlZmF1bHRzX2RhdGFfZmlsZXMoKQogICAgICAgIHNlbGYuX2FkZF9kZWZhdWx0c19leHQoKQogICAgICAgIHNlbGYuX2FkZF9kZWZhdWx0c19jX2xpYnMoKQogICAgICAgIHNlbGYuX2FkZF9kZWZhdWx0c19zY3JpcHRzKCkKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2NzX3BhdGhfZXhpc3RzKGZzcGF0aCk6CiAgICAgICAgIiIiCiAgICAgICAgQ2FzZS1zZW5zaXRpdmUgcGF0aCBleGlzdGVuY2UgY2hlY2sKCiAgICAgICAgPj4+IHNkaXN0X2FkZF9kZWZhdWx0cy5fY3NfcGF0aF9leGlzdHMoX19maWxlX18pCiAgICAgICAgVHJ1ZQogICAgICAgID4+PiBzZGlzdF9hZGRfZGVmYXVsdHMuX2NzX3BhdGhfZXhpc3RzKF9fZmlsZV9fLnVwcGVyKCkpCiAgICAgICAgRmFsc2UKICAgICAgICAiIiIKICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZnNwYXRoKToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgIyBtYWtlIGFic29sdXRlIHNvIHdlIGFsd2F5cyBoYXZlIGEgZGlyZWN0b3J5CiAgICAgICAgYWJzcGF0aCA9IG9zLnBhdGguYWJzcGF0aChmc3BhdGgpCiAgICAgICAgZGlyZWN0b3J5LCBmaWxlbmFtZSA9IG9zLnBhdGguc3BsaXQoYWJzcGF0aCkKICAgICAgICByZXR1cm4gZmlsZW5hbWUgaW4gb3MubGlzdGRpcihkaXJlY3RvcnkpCgogICAgZGVmIF9hZGRfZGVmYXVsdHNfc3RhbmRhcmRzKHNlbGYpOgogICAgICAgIHN0YW5kYXJkcyA9IFtzZWxmLlJFQURNRVMsIHNlbGYuZGlzdHJpYnV0aW9uLnNjcmlwdF9uYW1lXQogICAgICAgIGZvciBmbiBpbiBzdGFuZGFyZHM6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZm4sIHR1cGxlKToKICAgICAgICAgICAgICAgIGFsdHMgPSBmbgogICAgICAgICAgICAgICAgZ290X2l0ID0gRmFsc2UKICAgICAgICAgICAgICAgIGZvciBmbiBpbiBhbHRzOgogICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuX2NzX3BhdGhfZXhpc3RzKGZuKToKICAgICAgICAgICAgICAgICAgICAgICAgZ290X2l0ID0gVHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmFwcGVuZChmbikKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgICAgICAgICBpZiBub3QgZ290X2l0OgogICAgICAgICAgICAgICAgICAgIHNlbGYud2Fybigic3RhbmRhcmQgZmlsZSBub3QgZm91bmQ6IHNob3VsZCBoYXZlIG9uZSBvZiAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJywgJy5qb2luKGFsdHMpKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgaWYgc2VsZi5fY3NfcGF0aF9leGlzdHMoZm4pOgogICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZWxpc3QuYXBwZW5kKGZuKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBzZWxmLndhcm4oInN0YW5kYXJkIGZpbGUgJyVzJyBub3QgZm91bmQiICUgZm4pCgogICAgZGVmIF9hZGRfZGVmYXVsdHNfb3B0aW9uYWwoc2VsZik6CiAgICAgICAgb3B0aW9uYWwgPSBbJ3Rlc3QvdGVzdCoucHknLCAnc2V0dXAuY2ZnJ10KICAgICAgICBmb3IgcGF0dGVybiBpbiBvcHRpb25hbDoKICAgICAgICAgICAgZmlsZXMgPSBmaWx0ZXIob3MucGF0aC5pc2ZpbGUsIGdsb2IocGF0dGVybikpCiAgICAgICAgICAgIHNlbGYuZmlsZWxpc3QuZXh0ZW5kKGZpbGVzKQoKICAgIGRlZiBfYWRkX2RlZmF1bHRzX3B5dGhvbihzZWxmKToKICAgICAgICAjIGJ1aWxkX3B5IGlzIHVzZWQgdG8gZ2V0OgogICAgICAgICMgIC0gcHl0aG9uIG1vZHVsZXMKICAgICAgICAjICAtIGZpbGVzIGRlZmluZWQgaW4gcGFja2FnZV9kYXRhCiAgICAgICAgYnVpbGRfcHkgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGRfcHknKQoKICAgICAgICAjIGdldHRpbmcgcHl0aG9uIGZpbGVzCiAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24uaGFzX3B1cmVfbW9kdWxlcygpOgogICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmV4dGVuZChidWlsZF9weS5nZXRfc291cmNlX2ZpbGVzKCkpCgogICAgICAgICMgZ2V0dGluZyBwYWNrYWdlX2RhdGEgZmlsZXMKICAgICAgICAjIChjb21wdXRlZCBpbiBidWlsZF9weS5kYXRhX2ZpbGVzIGJ5IGJ1aWxkX3B5LmZpbmFsaXplX29wdGlvbnMpCiAgICAgICAgZm9yIHBrZywgc3JjX2RpciwgYnVpbGRfZGlyLCBmaWxlbmFtZXMgaW4gYnVpbGRfcHkuZGF0YV9maWxlczoKICAgICAgICAgICAgZm9yIGZpbGVuYW1lIGluIGZpbGVuYW1lczoKICAgICAgICAgICAgICAgIHNlbGYuZmlsZWxpc3QuYXBwZW5kKG9zLnBhdGguam9pbihzcmNfZGlyLCBmaWxlbmFtZSkpCgogICAgZGVmIF9hZGRfZGVmYXVsdHNfZGF0YV9maWxlcyhzZWxmKToKICAgICAgICAjIGdldHRpbmcgZGlzdHJpYnV0aW9uLmRhdGFfZmlsZXMKICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfZGF0YV9maWxlcygpOgogICAgICAgICAgICBmb3IgaXRlbSBpbiBzZWxmLmRpc3RyaWJ1dGlvbi5kYXRhX2ZpbGVzOgogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShpdGVtLCBzdHIpOgogICAgICAgICAgICAgICAgICAgICMgcGxhaW4gZmlsZQogICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBjb252ZXJ0X3BhdGgoaXRlbSkKICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShpdGVtKToKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5hcHBlbmQoaXRlbSkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIyBhIChkaXJuYW1lLCBmaWxlbmFtZXMpIHR1cGxlCiAgICAgICAgICAgICAgICAgICAgZGlybmFtZSwgZmlsZW5hbWVzID0gaXRlbQogICAgICAgICAgICAgICAgICAgIGZvciBmIGluIGZpbGVuYW1lczoKICAgICAgICAgICAgICAgICAgICAgICAgZiA9IGNvbnZlcnRfcGF0aChmKQogICAgICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShmKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZWxpc3QuYXBwZW5kKGYpCgogICAgZGVmIF9hZGRfZGVmYXVsdHNfZXh0KHNlbGYpOgogICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLmhhc19leHRfbW9kdWxlcygpOgogICAgICAgICAgICBidWlsZF9leHQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGRfZXh0JykKICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5leHRlbmQoYnVpbGRfZXh0LmdldF9zb3VyY2VfZmlsZXMoKSkKCiAgICBkZWYgX2FkZF9kZWZhdWx0c19jX2xpYnMoc2VsZik6CiAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24uaGFzX2NfbGlicmFyaWVzKCk6CiAgICAgICAgICAgIGJ1aWxkX2NsaWIgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGRfY2xpYicpCiAgICAgICAgICAgIHNlbGYuZmlsZWxpc3QuZXh0ZW5kKGJ1aWxkX2NsaWIuZ2V0X3NvdXJjZV9maWxlcygpKQoKICAgIGRlZiBfYWRkX2RlZmF1bHRzX3NjcmlwdHMoc2VsZik6CiAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24uaGFzX3NjcmlwdHMoKToKICAgICAgICAgICAgYnVpbGRfc2NyaXB0cyA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZF9zY3JpcHRzJykKICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5leHRlbmQoYnVpbGRfc2NyaXB0cy5nZXRfc291cmNlX2ZpbGVzKCkpCgoKaWYgaGFzYXR0cihzZGlzdC5zZGlzdCwgJ19hZGRfZGVmYXVsdHNfc3RhbmRhcmRzJyk6CiAgICAjIGRpc2FibGUgdGhlIGZ1bmN0aW9uYWxpdHkgYWxyZWFkeSBhdmFpbGFibGUgdXBzdHJlYW0KICAgIGNsYXNzIHNkaXN0X2FkZF9kZWZhdWx0czoKICAgICAgICBwYXNzClBLAwQUAAAAAAAAACEAzf+tkA4BAAAOAQAANgAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9yZWdpc3Rlci5weWltcG9ydCBkaXN0dXRpbHMuY29tbWFuZC5yZWdpc3RlciBhcyBvcmlnCgoKY2xhc3MgcmVnaXN0ZXIob3JpZy5yZWdpc3Rlcik6CiAgICBfX2RvY19fID0gb3JpZy5yZWdpc3Rlci5fX2RvY19fCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICAjIE1ha2Ugc3VyZSB0aGF0IHdlIGFyZSB1c2luZyB2YWxpZCBjdXJyZW50IG5hbWUvdmVyc2lvbiBpbmZvCiAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnZWdnX2luZm8nKQogICAgICAgIG9yaWcucmVnaXN0ZXIucnVuKHNlbGYpClBLAwQUAAAAAAAAACEAGcrUpHQIAAB0CAAANAAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9yb3RhdGUucHlmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBjb252ZXJ0X3BhdGgKZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwpmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc09wdGlvbkVycm9yCmltcG9ydCBvcwppbXBvcnQgc2h1dGlsCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuIGltcG9ydCBzaXgKCmZyb20gc2V0dXB0b29scyBpbXBvcnQgQ29tbWFuZAoKCmNsYXNzIHJvdGF0ZShDb21tYW5kKToKICAgICIiIkRlbGV0ZSBvbGRlciBkaXN0cmlidXRpb25zIiIiCgogICAgZGVzY3JpcHRpb24gPSAiZGVsZXRlIG9sZGVyIGRpc3RyaWJ1dGlvbnMsIGtlZXBpbmcgTiBuZXdlc3QgZmlsZXMiCiAgICB1c2VyX29wdGlvbnMgPSBbCiAgICAgICAgKCdtYXRjaD0nLCAnbScsICJwYXR0ZXJucyB0byBtYXRjaCAocmVxdWlyZWQpIiksCiAgICAgICAgKCdkaXN0LWRpcj0nLCAnZCcsICJkaXJlY3Rvcnkgd2hlcmUgdGhlIGRpc3RyaWJ1dGlvbnMgYXJlIiksCiAgICAgICAgKCdrZWVwPScsICdrJywgIm51bWJlciBvZiBtYXRjaGluZyBkaXN0cmlidXRpb25zIHRvIGtlZXAiKSwKICAgIF0KCiAgICBib29sZWFuX29wdGlvbnMgPSBbXQoKICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgc2VsZi5tYXRjaCA9IE5vbmUKICAgICAgICBzZWxmLmRpc3RfZGlyID0gTm9uZQogICAgICAgIHNlbGYua2VlcCA9IE5vbmUKCiAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBpZiBzZWxmLm1hdGNoIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKAogICAgICAgICAgICAgICAgIk11c3Qgc3BlY2lmeSBvbmUgb3IgbW9yZSAoY29tbWEtc2VwYXJhdGVkKSBtYXRjaCBwYXR0ZXJucyAiCiAgICAgICAgICAgICAgICAiKGUuZy4gJy56aXAnIG9yICcuZWdnJykiCiAgICAgICAgICAgICkKICAgICAgICBpZiBzZWxmLmtlZXAgaXMgTm9uZToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoIk11c3Qgc3BlY2lmeSBudW1iZXIgb2YgZmlsZXMgdG8ga2VlcCIpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLmtlZXAgPSBpbnQoc2VsZi5rZWVwKQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigiLS1rZWVwIG11c3QgYmUgYW4gaW50ZWdlciIpCiAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLm1hdGNoLCBzaXguc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgc2VsZi5tYXRjaCA9IFsKICAgICAgICAgICAgICAgIGNvbnZlcnRfcGF0aChwLnN0cmlwKCkpIGZvciBwIGluIHNlbGYubWF0Y2guc3BsaXQoJywnKQogICAgICAgICAgICBdCiAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoJ2JkaXN0JywgKCdkaXN0X2RpcicsICdkaXN0X2RpcicpKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgiZWdnX2luZm8iKQogICAgICAgIGZyb20gZ2xvYiBpbXBvcnQgZ2xvYgoKICAgICAgICBmb3IgcGF0dGVybiBpbiBzZWxmLm1hdGNoOgogICAgICAgICAgICBwYXR0ZXJuID0gc2VsZi5kaXN0cmlidXRpb24uZ2V0X25hbWUoKSArICcqJyArIHBhdHRlcm4KICAgICAgICAgICAgZmlsZXMgPSBnbG9iKG9zLnBhdGguam9pbihzZWxmLmRpc3RfZGlyLCBwYXR0ZXJuKSkKICAgICAgICAgICAgZmlsZXMgPSBbKG9zLnBhdGguZ2V0bXRpbWUoZiksIGYpIGZvciBmIGluIGZpbGVzXQogICAgICAgICAgICBmaWxlcy5zb3J0KCkKICAgICAgICAgICAgZmlsZXMucmV2ZXJzZSgpCgogICAgICAgICAgICBsb2cuaW5mbygiJWQgZmlsZShzKSBtYXRjaGluZyAlcyIsIGxlbihmaWxlcyksIHBhdHRlcm4pCiAgICAgICAgICAgIGZpbGVzID0gZmlsZXNbc2VsZi5rZWVwOl0KICAgICAgICAgICAgZm9yICh0LCBmKSBpbiBmaWxlczoKICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJEZWxldGluZyAlcyIsIGYpCiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZik6CiAgICAgICAgICAgICAgICAgICAgICAgIHNodXRpbC5ybXRyZWUoZikKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBvcy51bmxpbmsoZikKUEsDBBQAAAAAAAAAIQAEgdY0kgIAAJICAAA2AAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL3NhdmVvcHRzLnB5ZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQuc2V0b3B0IGltcG9ydCBlZGl0X2NvbmZpZywgb3B0aW9uX2Jhc2UKCgpjbGFzcyBzYXZlb3B0cyhvcHRpb25fYmFzZSk6CiAgICAiIiJTYXZlIGNvbW1hbmQtbGluZSBvcHRpb25zIHRvIGEgZmlsZSIiIgoKICAgIGRlc2NyaXB0aW9uID0gInNhdmUgc3VwcGxpZWQgb3B0aW9ucyB0byBzZXR1cC5jZmcgb3Igb3RoZXIgY29uZmlnIGZpbGUiCgogICAgZGVmIHJ1bihzZWxmKToKICAgICAgICBkaXN0ID0gc2VsZi5kaXN0cmlidXRpb24KICAgICAgICBzZXR0aW5ncyA9IHt9CgogICAgICAgIGZvciBjbWQgaW4gZGlzdC5jb21tYW5kX29wdGlvbnM6CgogICAgICAgICAgICBpZiBjbWQgPT0gJ3NhdmVvcHRzJzoKICAgICAgICAgICAgICAgIGNvbnRpbnVlICAjIGRvbid0IHNhdmUgb3VyIG93biBvcHRpb25zIQoKICAgICAgICAgICAgZm9yIG9wdCwgKHNyYywgdmFsKSBpbiBkaXN0LmdldF9vcHRpb25fZGljdChjbWQpLml0ZW1zKCk6CiAgICAgICAgICAgICAgICBpZiBzcmMgPT0gImNvbW1hbmQgbGluZSI6CiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3Muc2V0ZGVmYXVsdChjbWQsIHt9KVtvcHRdID0gdmFsCgogICAgICAgIGVkaXRfY29uZmlnKHNlbGYuZmlsZW5hbWUsIHNldHRpbmdzLCBzZWxmLmRyeV9ydW4pClBLAwQUAAAAAAAAACEAtx/RbjcaAAA3GgAAMwAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9zZGlzdC5weWZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKaW1wb3J0IGRpc3R1dGlscy5jb21tYW5kLnNkaXN0IGFzIG9yaWcKaW1wb3J0IG9zCmltcG9ydCBzeXMKaW1wb3J0IGlvCmltcG9ydCBjb250ZXh0bGliCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuIGltcG9ydCBzaXgKCmZyb20gLnB5MzZjb21wYXQgaW1wb3J0IHNkaXN0X2FkZF9kZWZhdWx0cwoKaW1wb3J0IHBrZ19yZXNvdXJjZXMKCl9kZWZhdWx0X3JldmN0cmwgPSBsaXN0CgoKZGVmIHdhbGtfcmV2Y3RybChkaXJuYW1lPScnKToKICAgICIiIkZpbmQgYWxsIGZpbGVzIHVuZGVyIHJldmlzaW9uIGNvbnRyb2wiIiIKICAgIGZvciBlcCBpbiBwa2dfcmVzb3VyY2VzLml0ZXJfZW50cnlfcG9pbnRzKCdzZXR1cHRvb2xzLmZpbGVfZmluZGVycycpOgogICAgICAgIGZvciBpdGVtIGluIGVwLmxvYWQoKShkaXJuYW1lKToKICAgICAgICAgICAgeWllbGQgaXRlbQoKCmNsYXNzIHNkaXN0KHNkaXN0X2FkZF9kZWZhdWx0cywgb3JpZy5zZGlzdCk6CiAgICAiIiJTbWFydCBzZGlzdCB0aGF0IGZpbmRzIGFueXRoaW5nIHN1cHBvcnRlZCBieSByZXZpc2lvbiBjb250cm9sIiIiCgogICAgdXNlcl9vcHRpb25zID0gWwogICAgICAgICgnZm9ybWF0cz0nLCBOb25lLAogICAgICAgICAiZm9ybWF0cyBmb3Igc291cmNlIGRpc3RyaWJ1dGlvbiAoY29tbWEtc2VwYXJhdGVkIGxpc3QpIiksCiAgICAgICAgKCdrZWVwLXRlbXAnLCAnaycsCiAgICAgICAgICJrZWVwIHRoZSBkaXN0cmlidXRpb24gdHJlZSBhcm91bmQgYWZ0ZXIgY3JlYXRpbmcgIiArCiAgICAgICAgICJhcmNoaXZlIGZpbGUocykiKSwKICAgICAgICAoJ2Rpc3QtZGlyPScsICdkJywKICAgICAgICAgImRpcmVjdG9yeSB0byBwdXQgdGhlIHNvdXJjZSBkaXN0cmlidXRpb24gYXJjaGl2ZShzKSBpbiAiCiAgICAgICAgICJbZGVmYXVsdDogZGlzdF0iKSwKICAgIF0KCiAgICBuZWdhdGl2ZV9vcHQgPSB7fQoKICAgIFJFQURNRV9FWFRFTlNJT05TID0gWycnLCAnLnJzdCcsICcudHh0JywgJy5tZCddCiAgICBSRUFETUVTID0gdHVwbGUoJ1JFQURNRXswfScuZm9ybWF0KGV4dCkgZm9yIGV4dCBpbiBSRUFETUVfRVhURU5TSU9OUykKCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2VnZ19pbmZvJykKICAgICAgICBlaV9jbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnZWdnX2luZm8nKQogICAgICAgIHNlbGYuZmlsZWxpc3QgPSBlaV9jbWQuZmlsZWxpc3QKICAgICAgICBzZWxmLmZpbGVsaXN0LmFwcGVuZChvcy5wYXRoLmpvaW4oZWlfY21kLmVnZ19pbmZvLCAnU09VUkNFUy50eHQnKSkKICAgICAgICBzZWxmLmNoZWNrX3JlYWRtZSgpCgogICAgICAgICMgUnVuIHN1YiBjb21tYW5kcwogICAgICAgIGZvciBjbWRfbmFtZSBpbiBzZWxmLmdldF9zdWJfY29tbWFuZHMoKToKICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZChjbWRfbmFtZSkKCiAgICAgICAgc2VsZi5tYWtlX2Rpc3RyaWJ1dGlvbigpCgogICAgICAgIGRpc3RfZmlsZXMgPSBnZXRhdHRyKHNlbGYuZGlzdHJpYnV0aW9uLCAnZGlzdF9maWxlcycsIFtdKQogICAgICAgIGZvciBmaWxlIGluIHNlbGYuYXJjaGl2ZV9maWxlczoKICAgICAgICAgICAgZGF0YSA9ICgnc2Rpc3QnLCAnJywgZmlsZSkKICAgICAgICAgICAgaWYgZGF0YSBub3QgaW4gZGlzdF9maWxlczoKICAgICAgICAgICAgICAgIGRpc3RfZmlsZXMuYXBwZW5kKGRhdGEpCgogICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBvcmlnLnNkaXN0LmluaXRpYWxpemVfb3B0aW9ucyhzZWxmKQoKICAgICAgICBzZWxmLl9kZWZhdWx0X3RvX2d6dGFyKCkKCiAgICBkZWYgX2RlZmF1bHRfdG9fZ3p0YXIoc2VsZik6CiAgICAgICAgIyBvbmx5IG5lZWRlZCBvbiBQeXRob24gcHJpb3IgdG8gMy42LgogICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPj0gKDMsIDYsIDAsICdiZXRhJywgMSk6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHNlbGYuZm9ybWF0cyA9IFsnZ3p0YXInXQoKICAgIGRlZiBtYWtlX2Rpc3RyaWJ1dGlvbihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBXb3JrYXJvdW5kIGZvciAjNTE2CiAgICAgICAgIiIiCiAgICAgICAgd2l0aCBzZWxmLl9yZW1vdmVfb3NfbGluaygpOgogICAgICAgICAgICBvcmlnLnNkaXN0Lm1ha2VfZGlzdHJpYnV0aW9uKHNlbGYpCgogICAgQHN0YXRpY21ldGhvZAogICAgQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKICAgIGRlZiBfcmVtb3ZlX29zX2xpbmsoKToKICAgICAgICAiIiIKICAgICAgICBJbiBhIGNvbnRleHQsIHJlbW92ZSBhbmQgcmVzdG9yZSBvcy5saW5rIGlmIGl0IGV4aXN0cwogICAgICAgICIiIgoKICAgICAgICBjbGFzcyBOb1ZhbHVlOgogICAgICAgICAgICBwYXNzCgogICAgICAgIG9yaWdfdmFsID0gZ2V0YXR0cihvcywgJ2xpbmsnLCBOb1ZhbHVlKQogICAgICAgIHRyeToKICAgICAgICAgICAgZGVsIG9zLmxpbmsKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBwYXNzCiAgICAgICAgdHJ5OgogICAgICAgICAgICB5aWVsZAogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGlmIG9yaWdfdmFsIGlzIG5vdCBOb1ZhbHVlOgogICAgICAgICAgICAgICAgc2V0YXR0cihvcywgJ2xpbmsnLCBvcmlnX3ZhbCkKCiAgICBkZWYgX19yZWFkX3RlbXBsYXRlX2hhY2soc2VsZik6CiAgICAgICAgIyBUaGlzIGdyb2R5IGhhY2sgY2xvc2VzIHRoZSB0ZW1wbGF0ZSBmaWxlIChNQU5JRkVTVC5pbikgaWYgYW4KICAgICAgICAjICBleGNlcHRpb24gb2NjdXJzIGR1cmluZyByZWFkX3RlbXBsYXRlLgogICAgICAgICMgRG9pbmcgc28gcHJldmVudHMgYW4gZXJyb3Igd2hlbiBlYXN5X2luc3RhbGwgYXR0ZW1wdHMgdG8gZGVsZXRlIHRoZQogICAgICAgICMgIGZpbGUuCiAgICAgICAgdHJ5OgogICAgICAgICAgICBvcmlnLnNkaXN0LnJlYWRfdGVtcGxhdGUoc2VsZikKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBfLCBfLCB0YiA9IHN5cy5leGNfaW5mbygpCiAgICAgICAgICAgIHRiLnRiX25leHQudGJfZnJhbWUuZl9sb2NhbHNbJ3RlbXBsYXRlJ10uY2xvc2UoKQogICAgICAgICAgICByYWlzZQoKICAgICMgQmVnaW5uaW5nIHdpdGggUHl0aG9uIDIuNy4yLCAzLjEuNCwgYW5kIDMuMi4xLCB0aGlzIGxlYWt5IGZpbGUgaGFuZGxlCiAgICAjICBoYXMgYmVlbiBmaXhlZCwgc28gb25seSBvdmVycmlkZSB0aGUgbWV0aG9kIGlmIHdlJ3JlIHVzaW5nIGFuIGVhcmxpZXIKICAgICMgIFB5dGhvbi4KICAgIGhhc19sZWFreV9oYW5kbGUgPSAoCiAgICAgICAgc3lzLnZlcnNpb25faW5mbyA8ICgyLCA3LCAyKQogICAgICAgIG9yICgzLCAwKSA8PSBzeXMudmVyc2lvbl9pbmZvIDwgKDMsIDEsIDQpCiAgICAgICAgb3IgKDMsIDIpIDw9IHN5cy52ZXJzaW9uX2luZm8gPCAoMywgMiwgMSkKICAgICkKICAgIGlmIGhhc19sZWFreV9oYW5kbGU6CiAgICAgICAgcmVhZF90ZW1wbGF0ZSA9IF9fcmVhZF90ZW1wbGF0ZV9oYWNrCgogICAgZGVmIF9hZGRfZGVmYXVsdHNfcHl0aG9uKHNlbGYpOgogICAgICAgICIiImdldHRpbmcgcHl0aG9uIGZpbGVzIiIiCiAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24uaGFzX3B1cmVfbW9kdWxlcygpOgogICAgICAgICAgICBidWlsZF9weSA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZF9weScpCiAgICAgICAgICAgIHNlbGYuZmlsZWxpc3QuZXh0ZW5kKGJ1aWxkX3B5LmdldF9zb3VyY2VfZmlsZXMoKSkKICAgICAgICAgICAgIyBUaGlzIGZ1bmN0aW9uYWxpdHkgaXMgaW5jb21wYXRpYmxlIHdpdGggaW5jbHVkZV9wYWNrYWdlX2RhdGEsIGFuZAogICAgICAgICAgICAjIHdpbGwgaW4gZmFjdCBjcmVhdGUgYW4gaW5maW5pdGUgcmVjdXJzaW9uIGlmIGluY2x1ZGVfcGFja2FnZV9kYXRhCiAgICAgICAgICAgICMgaXMgVHJ1ZS4gIFVzZSBvZiBpbmNsdWRlX3BhY2thZ2VfZGF0YSB3aWxsIGltcGx5IHRoYXQKICAgICAgICAgICAgIyBkaXN0dXRpbHMtc3R5bGUgYXV0b21hdGljIGhhbmRsaW5nIG9mIHBhY2thZ2VfZGF0YSBpcyBkaXNhYmxlZAogICAgICAgICAgICBpZiBub3Qgc2VsZi5kaXN0cmlidXRpb24uaW5jbHVkZV9wYWNrYWdlX2RhdGE6CiAgICAgICAgICAgICAgICBmb3IgXywgc3JjX2RpciwgXywgZmlsZW5hbWVzIGluIGJ1aWxkX3B5LmRhdGFfZmlsZXM6CiAgICAgICAgICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5leHRlbmQoW29zLnBhdGguam9pbihzcmNfZGlyLCBmaWxlbmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGZpbGVuYW1lIGluIGZpbGVuYW1lc10pCgogICAgZGVmIF9hZGRfZGVmYXVsdHNfZGF0YV9maWxlcyhzZWxmKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGlmIHNpeC5QWTI6CiAgICAgICAgICAgICAgICBzZGlzdF9hZGRfZGVmYXVsdHMuX2FkZF9kZWZhdWx0c19kYXRhX2ZpbGVzKHNlbGYpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzdXBlcigpLl9hZGRfZGVmYXVsdHNfZGF0YV9maWxlcygpCiAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKICAgICAgICAgICAgbG9nLndhcm4oImRhdGFfZmlsZXMgY29udGFpbnMgdW5leHBlY3RlZCBvYmplY3RzIikKCiAgICBkZWYgY2hlY2tfcmVhZG1lKHNlbGYpOgogICAgICAgIGZvciBmIGluIHNlbGYuUkVBRE1FUzoKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZik6CiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLndhcm4oCiAgICAgICAgICAgICAgICAic3RhbmRhcmQgZmlsZSBub3QgZm91bmQ6IHNob3VsZCBoYXZlIG9uZSBvZiAiICsKICAgICAgICAgICAgICAgICcsICcuam9pbihzZWxmLlJFQURNRVMpCiAgICAgICAgICAgICkKCiAgICBkZWYgbWFrZV9yZWxlYXNlX3RyZWUoc2VsZiwgYmFzZV9kaXIsIGZpbGVzKToKICAgICAgICBvcmlnLnNkaXN0Lm1ha2VfcmVsZWFzZV90cmVlKHNlbGYsIGJhc2VfZGlyLCBmaWxlcykKCiAgICAgICAgIyBTYXZlIGFueSBlZ2dfaW5mbyBjb21tYW5kIGxpbmUgb3B0aW9ucyB1c2VkIHRvIGNyZWF0ZSB0aGlzIHNkaXN0CiAgICAgICAgZGVzdCA9IG9zLnBhdGguam9pbihiYXNlX2RpciwgJ3NldHVwLmNmZycpCiAgICAgICAgaWYgaGFzYXR0cihvcywgJ2xpbmsnKSBhbmQgb3MucGF0aC5leGlzdHMoZGVzdCk6CiAgICAgICAgICAgICMgdW5saW5rIGFuZCByZS1jb3B5LCBzaW5jZSBpdCBtaWdodCBiZSBoYXJkLWxpbmtlZCwgYW5kCiAgICAgICAgICAgICMgd2UgZG9uJ3Qgd2FudCB0byBjaGFuZ2UgdGhlIHNvdXJjZSB2ZXJzaW9uCiAgICAgICAgICAgIG9zLnVubGluayhkZXN0KQogICAgICAgICAgICBzZWxmLmNvcHlfZmlsZSgnc2V0dXAuY2ZnJywgZGVzdCkKCiAgICAgICAgc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2VnZ19pbmZvJykuc2F2ZV92ZXJzaW9uX2luZm8oZGVzdCkKCiAgICBkZWYgX21hbmlmZXN0X2lzX25vdF9nZW5lcmF0ZWQoc2VsZik6CiAgICAgICAgIyBjaGVjayBmb3Igc3BlY2lhbCBjb21tZW50IHVzZWQgaW4gMi43LjEgYW5kIGhpZ2hlcgogICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZmlsZShzZWxmLm1hbmlmZXN0KToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCgogICAgICAgIHdpdGggaW8ub3BlbihzZWxmLm1hbmlmZXN0LCAncmInKSBhcyBmcDoKICAgICAgICAgICAgZmlyc3RfbGluZSA9IGZwLnJlYWRsaW5lKCkKICAgICAgICByZXR1cm4gKGZpcnN0X2xpbmUgIT0KICAgICAgICAgICAgICAgICcjIGZpbGUgR0VORVJBVEVEIGJ5IGRpc3R1dGlscywgZG8gTk9UIGVkaXRcbicuZW5jb2RlKCkpCgogICAgZGVmIHJlYWRfbWFuaWZlc3Qoc2VsZik6CiAgICAgICAgIiIiUmVhZCB0aGUgbWFuaWZlc3QgZmlsZSAobmFtZWQgYnkgJ3NlbGYubWFuaWZlc3QnKSBhbmQgdXNlIGl0IHRvCiAgICAgICAgZmlsbCBpbiAnc2VsZi5maWxlbGlzdCcsIHRoZSBsaXN0IG9mIGZpbGVzIHRvIGluY2x1ZGUgaW4gdGhlIHNvdXJjZQogICAgICAgIGRpc3RyaWJ1dGlvbi4KICAgICAgICAiIiIKICAgICAgICBsb2cuaW5mbygicmVhZGluZyBtYW5pZmVzdCBmaWxlICclcyciLCBzZWxmLm1hbmlmZXN0KQogICAgICAgIG1hbmlmZXN0ID0gb3BlbihzZWxmLm1hbmlmZXN0LCAncmInKQogICAgICAgIGZvciBsaW5lIGluIG1hbmlmZXN0OgogICAgICAgICAgICAjIFRoZSBtYW5pZmVzdCBtdXN0IGNvbnRhaW4gVVRGLTguIFNlZSAjMzAzLgogICAgICAgICAgICBpZiBzaXguUFkzOgogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLmRlY29kZSgnVVRGLTgnKQogICAgICAgICAgICAgICAgZXhjZXB0IFVuaWNvZGVEZWNvZGVFcnJvcjoKICAgICAgICAgICAgICAgICAgICBsb2cud2FybigiJXIgbm90IFVURi04IGRlY29kYWJsZSAtLSBza2lwcGluZyIgJSBsaW5lKQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICMgaWdub3JlIGNvbW1lbnRzIGFuZCBibGFuayBsaW5lcwogICAgICAgICAgICBsaW5lID0gbGluZS5zdHJpcCgpCiAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgnIycpIG9yIG5vdCBsaW5lOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5hcHBlbmQobGluZSkKICAgICAgICBtYW5pZmVzdC5jbG9zZSgpClBLAwQUAAAAAAAAACEAm3DLx90TAADdEwAANAAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9zZXRvcHQucHlmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBjb252ZXJ0X3BhdGgKZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwpmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc09wdGlvbkVycm9yCmltcG9ydCBkaXN0dXRpbHMKaW1wb3J0IG9zCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeC5tb3ZlcyBpbXBvcnQgY29uZmlncGFyc2VyCgpmcm9tIHNldHVwdG9vbHMgaW1wb3J0IENvbW1hbmQKCl9fYWxsX18gPSBbJ2NvbmZpZ19maWxlJywgJ2VkaXRfY29uZmlnJywgJ29wdGlvbl9iYXNlJywgJ3NldG9wdCddCgoKZGVmIGNvbmZpZ19maWxlKGtpbmQ9ImxvY2FsIik6CiAgICAiIiJHZXQgdGhlIGZpbGVuYW1lIG9mIHRoZSBkaXN0dXRpbHMsIGxvY2FsLCBnbG9iYWwsIG9yIHBlci11c2VyIGNvbmZpZwoKICAgIGBraW5kYCBtdXN0IGJlIG9uZSBvZiAibG9jYWwiLCAiZ2xvYmFsIiwgb3IgInVzZXIiCiAgICAiIiIKICAgIGlmIGtpbmQgPT0gJ2xvY2FsJzoKICAgICAgICByZXR1cm4gJ3NldHVwLmNmZycKICAgIGlmIGtpbmQgPT0gJ2dsb2JhbCc6CiAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbigKICAgICAgICAgICAgb3MucGF0aC5kaXJuYW1lKGRpc3R1dGlscy5fX2ZpbGVfXyksICdkaXN0dXRpbHMuY2ZnJwogICAgICAgICkKICAgIGlmIGtpbmQgPT0gJ3VzZXInOgogICAgICAgIGRvdCA9IG9zLm5hbWUgPT0gJ3Bvc2l4JyBhbmQgJy4nIG9yICcnCiAgICAgICAgcmV0dXJuIG9zLnBhdGguZXhwYW5kdXNlcihjb252ZXJ0X3BhdGgoIn4vJXNweWRpc3R1dGlscy5jZmciICUgZG90KSkKICAgIHJhaXNlIFZhbHVlRXJyb3IoCiAgICAgICAgImNvbmZpZ19maWxlKCkgdHlwZSBtdXN0IGJlICdsb2NhbCcsICdnbG9iYWwnLCBvciAndXNlciciLCBraW5kCiAgICApCgoKZGVmIGVkaXRfY29uZmlnKGZpbGVuYW1lLCBzZXR0aW5ncywgZHJ5X3J1bj1GYWxzZSk6CiAgICAiIiJFZGl0IGEgY29uZmlndXJhdGlvbiBmaWxlIHRvIGluY2x1ZGUgYHNldHRpbmdzYAoKICAgIGBzZXR0aW5nc2AgaXMgYSBkaWN0aW9uYXJ5IG9mIGRpY3Rpb25hcmllcyBvciBgYE5vbmVgYCB2YWx1ZXMsIGtleWVkIGJ5CiAgICBjb21tYW5kL3NlY3Rpb24gbmFtZS4gIEEgYGBOb25lYGAgdmFsdWUgbWVhbnMgdG8gZGVsZXRlIHRoZSBlbnRpcmUgc2VjdGlvbiwKICAgIHdoaWxlIGEgZGljdGlvbmFyeSBsaXN0cyBzZXR0aW5ncyB0byBiZSBjaGFuZ2VkIG9yIGRlbGV0ZWQgaW4gdGhhdCBzZWN0aW9uLgogICAgQSBzZXR0aW5nIG9mIGBgTm9uZWBgIG1lYW5zIHRvIGRlbGV0ZSB0aGF0IHNldHRpbmcuCiAgICAiIiIKICAgIGxvZy5kZWJ1ZygiUmVhZGluZyBjb25maWd1cmF0aW9uIGZyb20gJXMiLCBmaWxlbmFtZSkKICAgIG9wdHMgPSBjb25maWdwYXJzZXIuUmF3Q29uZmlnUGFyc2VyKCkKICAgIG9wdHMucmVhZChbZmlsZW5hbWVdKQogICAgZm9yIHNlY3Rpb24sIG9wdGlvbnMgaW4gc2V0dGluZ3MuaXRlbXMoKToKICAgICAgICBpZiBvcHRpb25zIGlzIE5vbmU6CiAgICAgICAgICAgIGxvZy5pbmZvKCJEZWxldGluZyBzZWN0aW9uIFslc10gZnJvbSAlcyIsIHNlY3Rpb24sIGZpbGVuYW1lKQogICAgICAgICAgICBvcHRzLnJlbW92ZV9zZWN0aW9uKHNlY3Rpb24pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWYgbm90IG9wdHMuaGFzX3NlY3Rpb24oc2VjdGlvbik6CiAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkFkZGluZyBuZXcgc2VjdGlvbiBbJXNdIHRvICVzIiwgc2VjdGlvbiwgZmlsZW5hbWUpCiAgICAgICAgICAgICAgICBvcHRzLmFkZF9zZWN0aW9uKHNlY3Rpb24pCiAgICAgICAgICAgIGZvciBvcHRpb24sIHZhbHVlIGluIG9wdGlvbnMuaXRlbXMoKToKICAgICAgICAgICAgICAgIGlmIHZhbHVlIGlzIE5vbmU6CiAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKAogICAgICAgICAgICAgICAgICAgICAgICAiRGVsZXRpbmcgJXMuJXMgZnJvbSAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24sIG9wdGlvbiwgZmlsZW5hbWUKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgb3B0cy5yZW1vdmVfb3B0aW9uKHNlY3Rpb24sIG9wdGlvbikKICAgICAgICAgICAgICAgICAgICBpZiBub3Qgb3B0cy5vcHRpb25zKHNlY3Rpb24pOgogICAgICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygiRGVsZXRpbmcgZW1wdHkgWyVzXSBzZWN0aW9uIGZyb20gJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uLCBmaWxlbmFtZSkKICAgICAgICAgICAgICAgICAgICAgICAgb3B0cy5yZW1vdmVfc2VjdGlvbihzZWN0aW9uKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoCiAgICAgICAgICAgICAgICAgICAgICAgICJTZXR0aW5nICVzLiVzIHRvICVyIGluICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbiwgb3B0aW9uLCB2YWx1ZSwgZmlsZW5hbWUKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgb3B0cy5zZXQoc2VjdGlvbiwgb3B0aW9uLCB2YWx1ZSkKCiAgICBsb2cuaW5mbygiV3JpdGluZyAlcyIsIGZpbGVuYW1lKQogICAgaWYgbm90IGRyeV9ydW46CiAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAndycpIGFzIGY6CiAgICAgICAgICAgIG9wdHMud3JpdGUoZikKCgpjbGFzcyBvcHRpb25fYmFzZShDb21tYW5kKToKICAgICIiIkFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGNvbW1hbmRzIHRoYXQgbWVzcyB3aXRoIGNvbmZpZyBmaWxlcyIiIgoKICAgIHVzZXJfb3B0aW9ucyA9IFsKICAgICAgICAoJ2dsb2JhbC1jb25maWcnLCAnZycsCiAgICAgICAgICJzYXZlIG9wdGlvbnMgdG8gdGhlIHNpdGUtd2lkZSBkaXN0dXRpbHMuY2ZnIGZpbGUiKSwKICAgICAgICAoJ3VzZXItY29uZmlnJywgJ3UnLAogICAgICAgICAic2F2ZSBvcHRpb25zIHRvIHRoZSBjdXJyZW50IHVzZXIncyBweWRpc3R1dGlscy5jZmcgZmlsZSIpLAogICAgICAgICgnZmlsZW5hbWU9JywgJ2YnLAogICAgICAgICAiY29uZmlndXJhdGlvbiBmaWxlIHRvIHVzZSAoZGVmYXVsdD1zZXR1cC5jZmcpIiksCiAgICBdCgogICAgYm9vbGVhbl9vcHRpb25zID0gWwogICAgICAgICdnbG9iYWwtY29uZmlnJywgJ3VzZXItY29uZmlnJywKICAgIF0KCiAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIHNlbGYuZ2xvYmFsX2NvbmZpZyA9IE5vbmUKICAgICAgICBzZWxmLnVzZXJfY29uZmlnID0gTm9uZQogICAgICAgIHNlbGYuZmlsZW5hbWUgPSBOb25lCgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgZmlsZW5hbWVzID0gW10KICAgICAgICBpZiBzZWxmLmdsb2JhbF9jb25maWc6CiAgICAgICAgICAgIGZpbGVuYW1lcy5hcHBlbmQoY29uZmlnX2ZpbGUoJ2dsb2JhbCcpKQogICAgICAgIGlmIHNlbGYudXNlcl9jb25maWc6CiAgICAgICAgICAgIGZpbGVuYW1lcy5hcHBlbmQoY29uZmlnX2ZpbGUoJ3VzZXInKSkKICAgICAgICBpZiBzZWxmLmZpbGVuYW1lIGlzIG5vdCBOb25lOgogICAgICAgICAgICBmaWxlbmFtZXMuYXBwZW5kKHNlbGYuZmlsZW5hbWUpCiAgICAgICAgaWYgbm90IGZpbGVuYW1lczoKICAgICAgICAgICAgZmlsZW5hbWVzLmFwcGVuZChjb25maWdfZmlsZSgnbG9jYWwnKSkKICAgICAgICBpZiBsZW4oZmlsZW5hbWVzKSA+IDE6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKAogICAgICAgICAgICAgICAgIk11c3Qgc3BlY2lmeSBvbmx5IG9uZSBjb25maWd1cmF0aW9uIGZpbGUgb3B0aW9uIiwKICAgICAgICAgICAgICAgIGZpbGVuYW1lcwogICAgICAgICAgICApCiAgICAgICAgc2VsZi5maWxlbmFtZSwgPSBmaWxlbmFtZXMKCgpjbGFzcyBzZXRvcHQob3B0aW9uX2Jhc2UpOgogICAgIiIiU2F2ZSBjb21tYW5kLWxpbmUgb3B0aW9ucyB0byBhIGZpbGUiIiIKCiAgICBkZXNjcmlwdGlvbiA9ICJzZXQgYW4gb3B0aW9uIGluIHNldHVwLmNmZyBvciBhbm90aGVyIGNvbmZpZyBmaWxlIgoKICAgIHVzZXJfb3B0aW9ucyA9IFsKICAgICAgICAoJ2NvbW1hbmQ9JywgJ2MnLCAnY29tbWFuZCB0byBzZXQgYW4gb3B0aW9uIGZvcicpLAogICAgICAgICgnb3B0aW9uPScsICdvJywgJ29wdGlvbiB0byBzZXQnKSwKICAgICAgICAoJ3NldC12YWx1ZT0nLCAncycsICd2YWx1ZSBvZiB0aGUgb3B0aW9uJyksCiAgICAgICAgKCdyZW1vdmUnLCAncicsICdyZW1vdmUgKHVuc2V0KSB0aGUgdmFsdWUnKSwKICAgIF0gKyBvcHRpb25fYmFzZS51c2VyX29wdGlvbnMKCiAgICBib29sZWFuX29wdGlvbnMgPSBvcHRpb25fYmFzZS5ib29sZWFuX29wdGlvbnMgKyBbJ3JlbW92ZSddCgogICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBvcHRpb25fYmFzZS5pbml0aWFsaXplX29wdGlvbnMoc2VsZikKICAgICAgICBzZWxmLmNvbW1hbmQgPSBOb25lCiAgICAgICAgc2VsZi5vcHRpb24gPSBOb25lCiAgICAgICAgc2VsZi5zZXRfdmFsdWUgPSBOb25lCiAgICAgICAgc2VsZi5yZW1vdmUgPSBOb25lCgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgb3B0aW9uX2Jhc2UuZmluYWxpemVfb3B0aW9ucyhzZWxmKQogICAgICAgIGlmIHNlbGYuY29tbWFuZCBpcyBOb25lIG9yIHNlbGYub3B0aW9uIGlzIE5vbmU6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKCJNdXN0IHNwZWNpZnkgLS1jb21tYW5kICphbmQqIC0tb3B0aW9uIikKICAgICAgICBpZiBzZWxmLnNldF92YWx1ZSBpcyBOb25lIGFuZCBub3Qgc2VsZi5yZW1vdmU6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKCJNdXN0IHNwZWNpZnkgLS1zZXQtdmFsdWUgb3IgLS1yZW1vdmUiKQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgZWRpdF9jb25maWcoCiAgICAgICAgICAgIHNlbGYuZmlsZW5hbWUsIHsKICAgICAgICAgICAgICAgIHNlbGYuY29tbWFuZDoge3NlbGYub3B0aW9uLnJlcGxhY2UoJy0nLCAnXycpOiBzZWxmLnNldF92YWx1ZX0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgc2VsZi5kcnlfcnVuCiAgICAgICAgKQpQSwMEFAAAAAAAAAAhAN0Z4Z7+IwAA/iMAADIAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvdGVzdC5weWltcG9ydCBvcwppbXBvcnQgb3BlcmF0b3IKaW1wb3J0IHN5cwppbXBvcnQgY29udGV4dGxpYgppbXBvcnQgaXRlcnRvb2xzCmltcG9ydCB1bml0dGVzdApmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0Vycm9yLCBEaXN0dXRpbHNPcHRpb25FcnJvcgpmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCmZyb20gdW5pdHRlc3QgaW1wb3J0IFRlc3RMb2FkZXIKCmZyb20gc2V0dXB0b29scy5leHRlcm4gaW1wb3J0IHNpeApmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeC5tb3ZlcyBpbXBvcnQgbWFwLCBmaWx0ZXIKCmZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgKHJlc291cmNlX2xpc3RkaXIsIHJlc291cmNlX2V4aXN0cywgbm9ybWFsaXplX3BhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtpbmdfc2V0LCBfbmFtZXNwYWNlX3BhY2thZ2VzLCBldmFsdWF0ZV9tYXJrZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9hY3RpdmF0aW9uX2xpc3RlbmVyLCByZXF1aXJlLCBFbnRyeVBvaW50KQpmcm9tIHNldHVwdG9vbHMgaW1wb3J0IENvbW1hbmQKCgpjbGFzcyBTY2FubmluZ0xvYWRlcihUZXN0TG9hZGVyKToKCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgVGVzdExvYWRlci5fX2luaXRfXyhzZWxmKQogICAgICAgIHNlbGYuX3Zpc2l0ZWQgPSBzZXQoKQoKICAgIGRlZiBsb2FkVGVzdHNGcm9tTW9kdWxlKHNlbGYsIG1vZHVsZSwgcGF0dGVybj1Ob25lKToKICAgICAgICAiIiJSZXR1cm4gYSBzdWl0ZSBvZiBhbGwgdGVzdHMgY2FzZXMgY29udGFpbmVkIGluIHRoZSBnaXZlbiBtb2R1bGUKCiAgICAgICAgSWYgdGhlIG1vZHVsZSBpcyBhIHBhY2thZ2UsIGxvYWQgdGVzdHMgZnJvbSBhbGwgdGhlIG1vZHVsZXMgaW4gaXQuCiAgICAgICAgSWYgdGhlIG1vZHVsZSBoYXMgYW4gYGBhZGRpdGlvbmFsX3Rlc3RzYGAgZnVuY3Rpb24sIGNhbGwgaXQgYW5kIGFkZAogICAgICAgIHRoZSByZXR1cm4gdmFsdWUgdG8gdGhlIHRlc3RzLgogICAgICAgICIiIgogICAgICAgIGlmIG1vZHVsZSBpbiBzZWxmLl92aXNpdGVkOgogICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgIHNlbGYuX3Zpc2l0ZWQuYWRkKG1vZHVsZSkKCiAgICAgICAgdGVzdHMgPSBbXQogICAgICAgIHRlc3RzLmFwcGVuZChUZXN0TG9hZGVyLmxvYWRUZXN0c0Zyb21Nb2R1bGUoc2VsZiwgbW9kdWxlKSkKCiAgICAgICAgaWYgaGFzYXR0cihtb2R1bGUsICJhZGRpdGlvbmFsX3Rlc3RzIik6CiAgICAgICAgICAgIHRlc3RzLmFwcGVuZChtb2R1bGUuYWRkaXRpb25hbF90ZXN0cygpKQoKICAgICAgICBpZiBoYXNhdHRyKG1vZHVsZSwgJ19fcGF0aF9fJyk6CiAgICAgICAgICAgIGZvciBmaWxlIGluIHJlc291cmNlX2xpc3RkaXIobW9kdWxlLl9fbmFtZV9fLCAnJyk6CiAgICAgICAgICAgICAgICBpZiBmaWxlLmVuZHN3aXRoKCcucHknKSBhbmQgZmlsZSAhPSAnX19pbml0X18ucHknOgogICAgICAgICAgICAgICAgICAgIHN1Ym1vZHVsZSA9IG1vZHVsZS5fX25hbWVfXyArICcuJyArIGZpbGVbOi0zXQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBpZiByZXNvdXJjZV9leGlzdHMobW9kdWxlLl9fbmFtZV9fLCBmaWxlICsgJy9fX2luaXRfXy5weScpOgogICAgICAgICAgICAgICAgICAgICAgICBzdWJtb2R1bGUgPSBtb2R1bGUuX19uYW1lX18gKyAnLicgKyBmaWxlCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIHRlc3RzLmFwcGVuZChzZWxmLmxvYWRUZXN0c0Zyb21OYW1lKHN1Ym1vZHVsZSkpCgogICAgICAgIGlmIGxlbih0ZXN0cykgIT0gMToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuc3VpdGVDbGFzcyh0ZXN0cykKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gdGVzdHNbMF0gICMgZG9uJ3QgY3JlYXRlIGEgbmVzdGVkIHN1aXRlIGZvciBvbmx5IG9uZSByZXR1cm4KCgojIGFkYXB0ZWQgZnJvbSBqYXJhY28uY2xhc3Nlcy5wcm9wZXJ0aWVzOk5vbkRhdGFQcm9wZXJ0eQpjbGFzcyBOb25EYXRhUHJvcGVydHkob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmZ2V0KToKICAgICAgICBzZWxmLmZnZXQgPSBmZ2V0CgogICAgZGVmIF9fZ2V0X18oc2VsZiwgb2JqLCBvYmp0eXBlPU5vbmUpOgogICAgICAgIGlmIG9iaiBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4gc2VsZgogICAgICAgIHJldHVybiBzZWxmLmZnZXQob2JqKQoKCmNsYXNzIHRlc3QoQ29tbWFuZCk6CiAgICAiIiJDb21tYW5kIHRvIHJ1biB1bml0IHRlc3RzIGFmdGVyIGluLXBsYWNlIGJ1aWxkIiIiCgogICAgZGVzY3JpcHRpb24gPSAicnVuIHVuaXQgdGVzdHMgYWZ0ZXIgaW4tcGxhY2UgYnVpbGQiCgogICAgdXNlcl9vcHRpb25zID0gWwogICAgICAgICgndGVzdC1tb2R1bGU9JywgJ20nLCAiUnVuICd0ZXN0X3N1aXRlJyBpbiBzcGVjaWZpZWQgbW9kdWxlIiksCiAgICAgICAgKCd0ZXN0LXN1aXRlPScsICdzJywKICAgICAgICAgIlJ1biBzaW5nbGUgdGVzdCwgY2FzZSBvciBzdWl0ZSAoZS5nLiAnbW9kdWxlLnRlc3Rfc3VpdGUnKSIpLAogICAgICAgICgndGVzdC1ydW5uZXI9JywgJ3InLCAiVGVzdCBydW5uZXIgdG8gdXNlIiksCiAgICBdCgogICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBzZWxmLnRlc3Rfc3VpdGUgPSBOb25lCiAgICAgICAgc2VsZi50ZXN0X21vZHVsZSA9IE5vbmUKICAgICAgICBzZWxmLnRlc3RfbG9hZGVyID0gTm9uZQogICAgICAgIHNlbGYudGVzdF9ydW5uZXIgPSBOb25lCgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CgogICAgICAgIGlmIHNlbGYudGVzdF9zdWl0ZSBhbmQgc2VsZi50ZXN0X21vZHVsZToKICAgICAgICAgICAgbXNnID0gIllvdSBtYXkgc3BlY2lmeSBhIG1vZHVsZSBvciBhIHN1aXRlLCBidXQgbm90IGJvdGgiCiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKG1zZykKCiAgICAgICAgaWYgc2VsZi50ZXN0X3N1aXRlIGlzIE5vbmU6CiAgICAgICAgICAgIGlmIHNlbGYudGVzdF9tb2R1bGUgaXMgTm9uZToKICAgICAgICAgICAgICAgIHNlbGYudGVzdF9zdWl0ZSA9IHNlbGYuZGlzdHJpYnV0aW9uLnRlc3Rfc3VpdGUKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYudGVzdF9zdWl0ZSA9IHNlbGYudGVzdF9tb2R1bGUgKyAiLnRlc3Rfc3VpdGUiCgogICAgICAgIGlmIHNlbGYudGVzdF9sb2FkZXIgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi50ZXN0X2xvYWRlciA9IGdldGF0dHIoc2VsZi5kaXN0cmlidXRpb24sICd0ZXN0X2xvYWRlcicsIE5vbmUpCiAgICAgICAgaWYgc2VsZi50ZXN0X2xvYWRlciBpcyBOb25lOgogICAgICAgICAgICBzZWxmLnRlc3RfbG9hZGVyID0gInNldHVwdG9vbHMuY29tbWFuZC50ZXN0OlNjYW5uaW5nTG9hZGVyIgogICAgICAgIGlmIHNlbGYudGVzdF9ydW5uZXIgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi50ZXN0X3J1bm5lciA9IGdldGF0dHIoc2VsZi5kaXN0cmlidXRpb24sICd0ZXN0X3J1bm5lcicsIE5vbmUpCgogICAgQE5vbkRhdGFQcm9wZXJ0eQogICAgZGVmIHRlc3RfYXJncyhzZWxmKToKICAgICAgICByZXR1cm4gbGlzdChzZWxmLl90ZXN0X2FyZ3MoKSkKCiAgICBkZWYgX3Rlc3RfYXJncyhzZWxmKToKICAgICAgICBpZiBub3Qgc2VsZi50ZXN0X3N1aXRlIGFuZCBzeXMudmVyc2lvbl9pbmZvID49ICgyLCA3KToKICAgICAgICAgICAgeWllbGQgJ2Rpc2NvdmVyJwogICAgICAgIGlmIHNlbGYudmVyYm9zZToKICAgICAgICAgICAgeWllbGQgJy0tdmVyYm9zZScKICAgICAgICBpZiBzZWxmLnRlc3Rfc3VpdGU6CiAgICAgICAgICAgIHlpZWxkIHNlbGYudGVzdF9zdWl0ZQoKICAgIGRlZiB3aXRoX3Byb2plY3Rfb25fc3lzX3BhdGgoc2VsZiwgZnVuYyk6CiAgICAgICAgIiIiCiAgICAgICAgQmFja3dhcmQgY29tcGF0aWJpbGl0eSBmb3IgcHJvamVjdF9vbl9zeXNfcGF0aCBjb250ZXh0LgogICAgICAgICIiIgogICAgICAgIHdpdGggc2VsZi5wcm9qZWN0X29uX3N5c19wYXRoKCk6CiAgICAgICAgICAgIGZ1bmMoKQoKICAgIEBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCiAgICBkZWYgcHJvamVjdF9vbl9zeXNfcGF0aChzZWxmLCBpbmNsdWRlX2Rpc3RzPVtdKToKICAgICAgICB3aXRoXzJ0bzMgPSBzaXguUFkzIGFuZCBnZXRhdHRyKHNlbGYuZGlzdHJpYnV0aW9uLCAndXNlXzJ0bzMnLCBGYWxzZSkKCiAgICAgICAgaWYgd2l0aF8ydG8zOgogICAgICAgICAgICAjIElmIHdlIHJ1biAydG8zIHdlIGNhbiBub3QgZG8gdGhpcyBpbnBsYWNlOgoKICAgICAgICAgICAgIyBFbnN1cmUgbWV0YWRhdGEgaXMgdXAtdG8tZGF0ZQogICAgICAgICAgICBzZWxmLnJlaW5pdGlhbGl6ZV9jb21tYW5kKCdidWlsZF9weScsIGlucGxhY2U9MCkKICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnYnVpbGRfcHknKQogICAgICAgICAgICBicHlfY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoImJ1aWxkX3B5IikKICAgICAgICAgICAgYnVpbGRfcGF0aCA9IG5vcm1hbGl6ZV9wYXRoKGJweV9jbWQuYnVpbGRfbGliKQoKICAgICAgICAgICAgIyBCdWlsZCBleHRlbnNpb25zCiAgICAgICAgICAgIHNlbGYucmVpbml0aWFsaXplX2NvbW1hbmQoJ2VnZ19pbmZvJywgZWdnX2Jhc2U9YnVpbGRfcGF0aCkKICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnZWdnX2luZm8nKQoKICAgICAgICAgICAgc2VsZi5yZWluaXRpYWxpemVfY29tbWFuZCgnYnVpbGRfZXh0JywgaW5wbGFjZT0wKQogICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdidWlsZF9leHQnKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgV2l0aG91dCAydG8zIGlucGxhY2Ugd29ya3MgZmluZToKICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnZWdnX2luZm8nKQoKICAgICAgICAgICAgIyBCdWlsZCBleHRlbnNpb25zIGluLXBsYWNlCiAgICAgICAgICAgIHNlbGYucmVpbml0aWFsaXplX2NvbW1hbmQoJ2J1aWxkX2V4dCcsIGlucGxhY2U9MSkKICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnYnVpbGRfZXh0JykKCiAgICAgICAgZWlfY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoImVnZ19pbmZvIikKCiAgICAgICAgb2xkX3BhdGggPSBzeXMucGF0aFs6XQogICAgICAgIG9sZF9tb2R1bGVzID0gc3lzLm1vZHVsZXMuY29weSgpCgogICAgICAgIHRyeToKICAgICAgICAgICAgcHJvamVjdF9wYXRoID0gbm9ybWFsaXplX3BhdGgoZWlfY21kLmVnZ19iYXNlKQogICAgICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgcHJvamVjdF9wYXRoKQogICAgICAgICAgICB3b3JraW5nX3NldC5fX2luaXRfXygpCiAgICAgICAgICAgIGFkZF9hY3RpdmF0aW9uX2xpc3RlbmVyKGxhbWJkYSBkaXN0OiBkaXN0LmFjdGl2YXRlKCkpCiAgICAgICAgICAgIHJlcXVpcmUoJyVzPT0lcycgJSAoZWlfY21kLmVnZ19uYW1lLCBlaV9jbWQuZWdnX3ZlcnNpb24pKQogICAgICAgICAgICB3aXRoIHNlbGYucGF0aHNfb25fcHl0aG9ucGF0aChbcHJvamVjdF9wYXRoXSk6CiAgICAgICAgICAgICAgICB5aWVsZAogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIHN5cy5wYXRoWzpdID0gb2xkX3BhdGgKICAgICAgICAgICAgc3lzLm1vZHVsZXMuY2xlYXIoKQogICAgICAgICAgICBzeXMubW9kdWxlcy51cGRhdGUob2xkX21vZHVsZXMpCiAgICAgICAgICAgIHdvcmtpbmdfc2V0Ll9faW5pdF9fKCkKCiAgICBAc3RhdGljbWV0aG9kCiAgICBAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgogICAgZGVmIHBhdGhzX29uX3B5dGhvbnBhdGgocGF0aHMpOgogICAgICAgICIiIgogICAgICAgIEFkZCB0aGUgaW5kaWNhdGVkIHBhdGhzIHRvIHRoZSBoZWFkIG9mIHRoZSBQWVRIT05QQVRIIGVudmlyb25tZW50CiAgICAgICAgdmFyaWFibGUgc28gdGhhdCBzdWJwcm9jZXNzZXMgd2lsbCBhbHNvIHNlZSB0aGUgcGFja2FnZXMgYXQKICAgICAgICB0aGVzZSBwYXRocy4KCiAgICAgICAgRG8gdGhpcyBpbiBhIGNvbnRleHQgdGhhdCByZXN0b3JlcyB0aGUgdmFsdWUgb24gZXhpdC4KICAgICAgICAiIiIKICAgICAgICBub3RoaW5nID0gb2JqZWN0KCkKICAgICAgICBvcmlnX3B5dGhvbnBhdGggPSBvcy5lbnZpcm9uLmdldCgnUFlUSE9OUEFUSCcsIG5vdGhpbmcpCiAgICAgICAgY3VycmVudF9weXRob25wYXRoID0gb3MuZW52aXJvbi5nZXQoJ1BZVEhPTlBBVEgnLCAnJykKICAgICAgICB0cnk6CiAgICAgICAgICAgIHByZWZpeCA9IG9zLnBhdGhzZXAuam9pbihwYXRocykKICAgICAgICAgICAgdG9fam9pbiA9IGZpbHRlcihOb25lLCBbcHJlZml4LCBjdXJyZW50X3B5dGhvbnBhdGhdKQogICAgICAgICAgICBuZXdfcGF0aCA9IG9zLnBhdGhzZXAuam9pbih0b19qb2luKQogICAgICAgICAgICBpZiBuZXdfcGF0aDoKICAgICAgICAgICAgICAgIG9zLmVudmlyb25bJ1BZVEhPTlBBVEgnXSA9IG5ld19wYXRoCiAgICAgICAgICAgIHlpZWxkCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgaWYgb3JpZ19weXRob25wYXRoIGlzIG5vdGhpbmc6CiAgICAgICAgICAgICAgICBvcy5lbnZpcm9uLnBvcCgnUFlUSE9OUEFUSCcsIE5vbmUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBvcy5lbnZpcm9uWydQWVRIT05QQVRIJ10gPSBvcmlnX3B5dGhvbnBhdGgKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgaW5zdGFsbF9kaXN0cyhkaXN0KToKICAgICAgICAiIiIKICAgICAgICBJbnN0YWxsIHRoZSByZXF1aXJlbWVudHMgaW5kaWNhdGVkIGJ5IHNlbGYuZGlzdHJpYnV0aW9uIGFuZAogICAgICAgIHJldHVybiBhbiBpdGVyYWJsZSBvZiB0aGUgZGlzdHMgdGhhdCB3ZXJlIGJ1aWx0LgogICAgICAgICIiIgogICAgICAgIGlyX2QgPSBkaXN0LmZldGNoX2J1aWxkX2VnZ3MoZGlzdC5pbnN0YWxsX3JlcXVpcmVzKQogICAgICAgIHRyX2QgPSBkaXN0LmZldGNoX2J1aWxkX2VnZ3MoZGlzdC50ZXN0c19yZXF1aXJlIG9yIFtdKQogICAgICAgIGVyX2QgPSBkaXN0LmZldGNoX2J1aWxkX2VnZ3MoCiAgICAgICAgICAgIHYgZm9yIGssIHYgaW4gZGlzdC5leHRyYXNfcmVxdWlyZS5pdGVtcygpCiAgICAgICAgICAgIGlmIGsuc3RhcnRzd2l0aCgnOicpIGFuZCBldmFsdWF0ZV9tYXJrZXIoa1sxOl0pCiAgICAgICAgKQogICAgICAgIHJldHVybiBpdGVydG9vbHMuY2hhaW4oaXJfZCwgdHJfZCwgZXJfZCkKCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgIGluc3RhbGxlZF9kaXN0cyA9IHNlbGYuaW5zdGFsbF9kaXN0cyhzZWxmLmRpc3RyaWJ1dGlvbikKCiAgICAgICAgY21kID0gJyAnLmpvaW4oc2VsZi5fYXJndikKICAgICAgICBpZiBzZWxmLmRyeV9ydW46CiAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UoJ3NraXBwaW5nICIlcyIgKGRyeSBydW4pJyAlIGNtZCkKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHNlbGYuYW5ub3VuY2UoJ3J1bm5pbmcgIiVzIicgJSBjbWQpCgogICAgICAgIHBhdGhzID0gbWFwKG9wZXJhdG9yLmF0dHJnZXR0ZXIoJ2xvY2F0aW9uJyksIGluc3RhbGxlZF9kaXN0cykKICAgICAgICB3aXRoIHNlbGYucGF0aHNfb25fcHl0aG9ucGF0aChwYXRocyk6CiAgICAgICAgICAgIHdpdGggc2VsZi5wcm9qZWN0X29uX3N5c19wYXRoKCk6CiAgICAgICAgICAgICAgICBzZWxmLnJ1bl90ZXN0cygpCgogICAgZGVmIHJ1bl90ZXN0cyhzZWxmKToKICAgICAgICAjIFB1cmdlIG1vZHVsZXMgdW5kZXIgdGVzdCBmcm9tIHN5cy5tb2R1bGVzLiBUaGUgdGVzdCBsb2FkZXIgd2lsbAogICAgICAgICMgcmUtaW1wb3J0IHRoZW0gZnJvbSB0aGUgYnVpbGQgbG9jYXRpb24uIFJlcXVpcmVkIHdoZW4gMnRvMyBpcyB1c2VkCiAgICAgICAgIyB3aXRoIG5hbWVzcGFjZSBwYWNrYWdlcy4KICAgICAgICBpZiBzaXguUFkzIGFuZCBnZXRhdHRyKHNlbGYuZGlzdHJpYnV0aW9uLCAndXNlXzJ0bzMnLCBGYWxzZSk6CiAgICAgICAgICAgIG1vZHVsZSA9IHNlbGYudGVzdF9zdWl0ZS5zcGxpdCgnLicpWzBdCiAgICAgICAgICAgIGlmIG1vZHVsZSBpbiBfbmFtZXNwYWNlX3BhY2thZ2VzOgogICAgICAgICAgICAgICAgZGVsX21vZHVsZXMgPSBbXQogICAgICAgICAgICAgICAgaWYgbW9kdWxlIGluIHN5cy5tb2R1bGVzOgogICAgICAgICAgICAgICAgICAgIGRlbF9tb2R1bGVzLmFwcGVuZChtb2R1bGUpCiAgICAgICAgICAgICAgICBtb2R1bGUgKz0gJy4nCiAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiBzeXMubW9kdWxlczoKICAgICAgICAgICAgICAgICAgICBpZiBuYW1lLnN0YXJ0c3dpdGgobW9kdWxlKToKICAgICAgICAgICAgICAgICAgICAgICAgZGVsX21vZHVsZXMuYXBwZW5kKG5hbWUpCiAgICAgICAgICAgICAgICBsaXN0KG1hcChzeXMubW9kdWxlcy5fX2RlbGl0ZW1fXywgZGVsX21vZHVsZXMpKQoKICAgICAgICB0ZXN0ID0gdW5pdHRlc3QubWFpbigKICAgICAgICAgICAgTm9uZSwgTm9uZSwgc2VsZi5fYXJndiwKICAgICAgICAgICAgdGVzdExvYWRlcj1zZWxmLl9yZXNvbHZlX2FzX2VwKHNlbGYudGVzdF9sb2FkZXIpLAogICAgICAgICAgICB0ZXN0UnVubmVyPXNlbGYuX3Jlc29sdmVfYXNfZXAoc2VsZi50ZXN0X3J1bm5lciksCiAgICAgICAgICAgIGV4aXQ9RmFsc2UsCiAgICAgICAgKQogICAgICAgIGlmIG5vdCB0ZXN0LnJlc3VsdC53YXNTdWNjZXNzZnVsKCk6CiAgICAgICAgICAgIG1zZyA9ICdUZXN0IGZhaWxlZDogJXMnICUgdGVzdC5yZXN1bHQKICAgICAgICAgICAgc2VsZi5hbm5vdW5jZShtc2csIGxvZy5FUlJPUikKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IobXNnKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIF9hcmd2KHNlbGYpOgogICAgICAgIHJldHVybiBbJ3VuaXR0ZXN0J10gKyBzZWxmLnRlc3RfYXJncwoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfcmVzb2x2ZV9hc19lcCh2YWwpOgogICAgICAgICIiIgogICAgICAgIExvYWQgdGhlIGluZGljYXRlZCBhdHRyaWJ1dGUgdmFsdWUsIGNhbGxlZCwgYXMgYSBhcyBpZiBpdCB3ZXJlCiAgICAgICAgc3BlY2lmaWVkIGFzIGFuIGVudHJ5IHBvaW50LgogICAgICAgICIiIgogICAgICAgIGlmIHZhbCBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBwYXJzZWQgPSBFbnRyeVBvaW50LnBhcnNlKCJ4PSIgKyB2YWwpCiAgICAgICAgcmV0dXJuIHBhcnNlZC5yZXNvbHZlKCkoKQpQSwMEFAAAAAAAAAAhANkki2eUBAAAlAQAADQAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvdXBsb2FkLnB5aW1wb3J0IGdldHBhc3MKZnJvbSBkaXN0dXRpbHMuY29tbWFuZCBpbXBvcnQgdXBsb2FkIGFzIG9yaWcKCgpjbGFzcyB1cGxvYWQob3JpZy51cGxvYWQpOgogICAgIiIiCiAgICBPdmVycmlkZSBkZWZhdWx0IHVwbG9hZCBiZWhhdmlvciB0byBvYnRhaW4gcGFzc3dvcmQKICAgIGluIGEgdmFyaWV0eSBvZiBkaWZmZXJlbnQgd2F5cy4KICAgICIiIgoKICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgogICAgICAgIG9yaWcudXBsb2FkLmZpbmFsaXplX29wdGlvbnMoc2VsZikKICAgICAgICBzZWxmLnVzZXJuYW1lID0gKAogICAgICAgICAgICBzZWxmLnVzZXJuYW1lIG9yCiAgICAgICAgICAgIGdldHBhc3MuZ2V0dXNlcigpCiAgICAgICAgKQogICAgICAgICMgQXR0ZW1wdCB0byBvYnRhaW4gcGFzc3dvcmQuIFNob3J0IGNpcmN1aXQgZXZhbHVhdGlvbiBhdCB0aGUgZmlyc3QKICAgICAgICAjIHNpZ24gb2Ygc3VjY2Vzcy4KICAgICAgICBzZWxmLnBhc3N3b3JkID0gKAogICAgICAgICAgICBzZWxmLnBhc3N3b3JkIG9yCiAgICAgICAgICAgIHNlbGYuX2xvYWRfcGFzc3dvcmRfZnJvbV9rZXlyaW5nKCkgb3IKICAgICAgICAgICAgc2VsZi5fcHJvbXB0X2Zvcl9wYXNzd29yZCgpCiAgICAgICAgKQoKICAgIGRlZiBfbG9hZF9wYXNzd29yZF9mcm9tX2tleXJpbmcoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgQXR0ZW1wdCB0byBsb2FkIHBhc3N3b3JkIGZyb20ga2V5cmluZy4gU3VwcHJlc3MgRXhjZXB0aW9ucy4KICAgICAgICAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIGtleXJpbmcgPSBfX2ltcG9ydF9fKCdrZXlyaW5nJykKICAgICAgICAgICAgcmV0dXJuIGtleXJpbmcuZ2V0X3Bhc3N3b3JkKHNlbGYucmVwb3NpdG9yeSwgc2VsZi51c2VybmFtZSkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBwYXNzCgogICAgZGVmIF9wcm9tcHRfZm9yX3Bhc3N3b3JkKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFByb21wdCBmb3IgYSBwYXNzd29yZCBvbiB0aGUgdHR5LiBTdXBwcmVzcyBFeGNlcHRpb25zLgogICAgICAgICIiIgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIGdldHBhc3MuZ2V0cGFzcygpCiAgICAgICAgZXhjZXB0IChFeGNlcHRpb24sIEtleWJvYXJkSW50ZXJydXB0KToKICAgICAgICAgICAgcGFzcwpQSwMEFAAAAAAAAAAhAPKX88aPHAAAjxwAADkAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvdXBsb2FkX2RvY3MucHkjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoiIiJ1cGxvYWRfZG9jcwoKSW1wbGVtZW50cyBhIERpc3R1dGlscyAndXBsb2FkX2RvY3MnIHN1YmNvbW1hbmQgKHVwbG9hZCBkb2N1bWVudGF0aW9uIHRvClB5UEkncyBweXRob25ob3N0ZWQub3JnKS4KIiIiCgpmcm9tIGJhc2U2NCBpbXBvcnQgc3RhbmRhcmRfYjY0ZW5jb2RlCmZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNPcHRpb25FcnJvcgppbXBvcnQgb3MKaW1wb3J0IHNvY2tldAppbXBvcnQgemlwZmlsZQppbXBvcnQgdGVtcGZpbGUKaW1wb3J0IHNodXRpbAppbXBvcnQgaXRlcnRvb2xzCmltcG9ydCBmdW5jdG9vbHMKCmZyb20gc2V0dXB0b29scy5leHRlcm4gaW1wb3J0IHNpeApmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeC5tb3ZlcyBpbXBvcnQgaHR0cF9jbGllbnQsIHVybGxpYgoKZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCBpdGVyX2VudHJ5X3BvaW50cwpmcm9tIC51cGxvYWQgaW1wb3J0IHVwbG9hZAoKCmRlZiBfZW5jb2RlKHMpOgogICAgZXJyb3JzID0gJ3N1cnJvZ2F0ZWVzY2FwZScgaWYgc2l4LlBZMyBlbHNlICdzdHJpY3QnCiAgICByZXR1cm4gcy5lbmNvZGUoJ3V0Zi04JywgZXJyb3JzKQoKCmNsYXNzIHVwbG9hZF9kb2NzKHVwbG9hZCk6CiAgICAjIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHJlcG9zaXRvcnkgYXMgdXBsb2FkX2RvY3MgaXNuJ3QKICAgICMgc3VwcG9ydGVkIGJ5IFdhcmVob3VzZSAoYW5kIHdvbid0IGJlKS4KICAgIERFRkFVTFRfUkVQT1NJVE9SWSA9ICdodHRwczovL3B5cGkucHl0aG9uLm9yZy9weXBpLycKCiAgICBkZXNjcmlwdGlvbiA9ICdVcGxvYWQgZG9jdW1lbnRhdGlvbiB0byBQeVBJJwoKICAgIHVzZXJfb3B0aW9ucyA9IFsKICAgICAgICAoJ3JlcG9zaXRvcnk9JywgJ3InLAogICAgICAgICAidXJsIG9mIHJlcG9zaXRvcnkgW2RlZmF1bHQ6ICVzXSIgJSB1cGxvYWQuREVGQVVMVF9SRVBPU0lUT1JZKSwKICAgICAgICAoJ3Nob3ctcmVzcG9uc2UnLCBOb25lLAogICAgICAgICAnZGlzcGxheSBmdWxsIHJlc3BvbnNlIHRleHQgZnJvbSBzZXJ2ZXInKSwKICAgICAgICAoJ3VwbG9hZC1kaXI9JywgTm9uZSwgJ2RpcmVjdG9yeSB0byB1cGxvYWQnKSwKICAgIF0KICAgIGJvb2xlYW5fb3B0aW9ucyA9IHVwbG9hZC5ib29sZWFuX29wdGlvbnMKCiAgICBkZWYgaGFzX3NwaGlueChzZWxmKToKICAgICAgICBpZiBzZWxmLnVwbG9hZF9kaXIgaXMgTm9uZToKICAgICAgICAgICAgZm9yIGVwIGluIGl0ZXJfZW50cnlfcG9pbnRzKCdkaXN0dXRpbHMuY29tbWFuZHMnLCAnYnVpbGRfc3BoaW54Jyk6CiAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgIHN1Yl9jb21tYW5kcyA9IFsoJ2J1aWxkX3NwaGlueCcsIGhhc19zcGhpbngpXQoKICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgdXBsb2FkLmluaXRpYWxpemVfb3B0aW9ucyhzZWxmKQogICAgICAgIHNlbGYudXBsb2FkX2RpciA9IE5vbmUKICAgICAgICBzZWxmLnRhcmdldF9kaXIgPSBOb25lCgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgdXBsb2FkLmZpbmFsaXplX29wdGlvbnMoc2VsZikKICAgICAgICBpZiBzZWxmLnVwbG9hZF9kaXIgaXMgTm9uZToKICAgICAgICAgICAgaWYgc2VsZi5oYXNfc3BoaW54KCk6CiAgICAgICAgICAgICAgICBidWlsZF9zcGhpbnggPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGRfc3BoaW54JykKICAgICAgICAgICAgICAgIHNlbGYudGFyZ2V0X2RpciA9IGJ1aWxkX3NwaGlueC5idWlsZGVyX3RhcmdldF9kaXIKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGJ1aWxkID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkJykKICAgICAgICAgICAgICAgIHNlbGYudGFyZ2V0X2RpciA9IG9zLnBhdGguam9pbihidWlsZC5idWlsZF9iYXNlLCAnZG9jcycpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5lbnN1cmVfZGlybmFtZSgndXBsb2FkX2RpcicpCiAgICAgICAgICAgIHNlbGYudGFyZ2V0X2RpciA9IHNlbGYudXBsb2FkX2RpcgogICAgICAgIGlmICdweXBpLnB5dGhvbi5vcmcnIGluIHNlbGYucmVwb3NpdG9yeToKICAgICAgICAgICAgbG9nLndhcm4oIlVwbG9hZF9kb2NzIGNvbW1hbmQgaXMgZGVwcmVjYXRlZC4gVXNlIFJURCBpbnN0ZWFkLiIpCiAgICAgICAgc2VsZi5hbm5vdW5jZSgnVXNpbmcgdXBsb2FkIGRpcmVjdG9yeSAlcycgJSBzZWxmLnRhcmdldF9kaXIpCgogICAgZGVmIGNyZWF0ZV96aXBmaWxlKHNlbGYsIGZpbGVuYW1lKToKICAgICAgICB6aXBfZmlsZSA9IHppcGZpbGUuWmlwRmlsZShmaWxlbmFtZSwgInciKQogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5ta3BhdGgoc2VsZi50YXJnZXRfZGlyKSAgIyBqdXN0IGluIGNhc2UKICAgICAgICAgICAgZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsoc2VsZi50YXJnZXRfZGlyKToKICAgICAgICAgICAgICAgIGlmIHJvb3QgPT0gc2VsZi50YXJnZXRfZGlyIGFuZCBub3QgZmlsZXM6CiAgICAgICAgICAgICAgICAgICAgdG1wbCA9ICJubyBmaWxlcyBmb3VuZCBpbiB1cGxvYWQgZGlyZWN0b3J5ICclcyciCiAgICAgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IodG1wbCAlIHNlbGYudGFyZ2V0X2RpcikKICAgICAgICAgICAgICAgIGZvciBuYW1lIGluIGZpbGVzOgogICAgICAgICAgICAgICAgICAgIGZ1bGwgPSBvcy5wYXRoLmpvaW4ocm9vdCwgbmFtZSkKICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZSA9IHJvb3RbbGVuKHNlbGYudGFyZ2V0X2Rpcik6XS5sc3RyaXAob3MucGF0aC5zZXApCiAgICAgICAgICAgICAgICAgICAgZGVzdCA9IG9zLnBhdGguam9pbihyZWxhdGl2ZSwgbmFtZSkKICAgICAgICAgICAgICAgICAgICB6aXBfZmlsZS53cml0ZShmdWxsLCBkZXN0KQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIHppcF9maWxlLmNsb3NlKCkKCiAgICBkZWYgcnVuKHNlbGYpOgogICAgICAgICMgUnVuIHN1YiBjb21tYW5kcwogICAgICAgIGZvciBjbWRfbmFtZSBpbiBzZWxmLmdldF9zdWJfY29tbWFuZHMoKToKICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZChjbWRfbmFtZSkKCiAgICAgICAgdG1wX2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQogICAgICAgIG5hbWUgPSBzZWxmLmRpc3RyaWJ1dGlvbi5tZXRhZGF0YS5nZXRfbmFtZSgpCiAgICAgICAgemlwX2ZpbGUgPSBvcy5wYXRoLmpvaW4odG1wX2RpciwgIiVzLnppcCIgJSBuYW1lKQogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5jcmVhdGVfemlwZmlsZSh6aXBfZmlsZSkKICAgICAgICAgICAgc2VsZi51cGxvYWRfZmlsZSh6aXBfZmlsZSkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBzaHV0aWwucm10cmVlKHRtcF9kaXIpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9idWlsZF9wYXJ0KGl0ZW0sIHNlcF9ib3VuZGFyeSk6CiAgICAgICAga2V5LCB2YWx1ZXMgPSBpdGVtCiAgICAgICAgdGl0bGUgPSAnXG5Db250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9IiVzIicgJSBrZXkKICAgICAgICAjIGhhbmRsZSBtdWx0aXBsZSBlbnRyaWVzIGZvciB0aGUgc2FtZSBuYW1lCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmFsdWVzLCBsaXN0KToKICAgICAgICAgICAgdmFsdWVzID0gW3ZhbHVlc10KICAgICAgICBmb3IgdmFsdWUgaW4gdmFsdWVzOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCB0dXBsZSk6CiAgICAgICAgICAgICAgICB0aXRsZSArPSAnOyBmaWxlbmFtZT0iJXMiJyAlIHZhbHVlWzBdCiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlWzFdCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB2YWx1ZSA9IF9lbmNvZGUodmFsdWUpCiAgICAgICAgICAgIHlpZWxkIHNlcF9ib3VuZGFyeQogICAgICAgICAgICB5aWVsZCBfZW5jb2RlKHRpdGxlKQogICAgICAgICAgICB5aWVsZCBiIlxuXG4iCiAgICAgICAgICAgIHlpZWxkIHZhbHVlCiAgICAgICAgICAgIGlmIHZhbHVlIGFuZCB2YWx1ZVstMTpdID09IGInXHInOgogICAgICAgICAgICAgICAgeWllbGQgYidcbicgICMgd3JpdGUgYW4gZXh0cmEgbmV3bGluZSAobHVydmUgTWFjcykKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfYnVpbGRfbXVsdGlwYXJ0KGNscywgZGF0YSk6CiAgICAgICAgIiIiCiAgICAgICAgQnVpbGQgdXAgdGhlIE1JTUUgcGF5bG9hZCBmb3IgdGhlIFBPU1QgZGF0YQogICAgICAgICIiIgogICAgICAgIGJvdW5kYXJ5ID0gYictLS0tLS0tLS0tLS0tLUdIU0tGSkRMR0RTNzU0M0ZKS0xGSFJFNzU2NDI3NTY3NDMyNTQnCiAgICAgICAgc2VwX2JvdW5kYXJ5ID0gYidcbi0tJyArIGJvdW5kYXJ5CiAgICAgICAgZW5kX2JvdW5kYXJ5ID0gc2VwX2JvdW5kYXJ5ICsgYictLScKICAgICAgICBlbmRfaXRlbXMgPSBlbmRfYm91bmRhcnksIGIiXG4iLAogICAgICAgIGJ1aWxkZXIgPSBmdW5jdG9vbHMucGFydGlhbCgKICAgICAgICAgICAgY2xzLl9idWlsZF9wYXJ0LAogICAgICAgICAgICBzZXBfYm91bmRhcnk9c2VwX2JvdW5kYXJ5LAogICAgICAgICkKICAgICAgICBwYXJ0X2dyb3VwcyA9IG1hcChidWlsZGVyLCBkYXRhLml0ZW1zKCkpCiAgICAgICAgcGFydHMgPSBpdGVydG9vbHMuY2hhaW4uZnJvbV9pdGVyYWJsZShwYXJ0X2dyb3VwcykKICAgICAgICBib2R5X2l0ZW1zID0gaXRlcnRvb2xzLmNoYWluKHBhcnRzLCBlbmRfaXRlbXMpCiAgICAgICAgY29udGVudF90eXBlID0gJ211bHRpcGFydC9mb3JtLWRhdGE7IGJvdW5kYXJ5PSVzJyAlIGJvdW5kYXJ5LmRlY29kZSgnYXNjaWknKQogICAgICAgIHJldHVybiBiJycuam9pbihib2R5X2l0ZW1zKSwgY29udGVudF90eXBlCgogICAgZGVmIHVwbG9hZF9maWxlKHNlbGYsIGZpbGVuYW1lKToKICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICdyYicpIGFzIGY6CiAgICAgICAgICAgIGNvbnRlbnQgPSBmLnJlYWQoKQogICAgICAgIG1ldGEgPSBzZWxmLmRpc3RyaWJ1dGlvbi5tZXRhZGF0YQogICAgICAgIGRhdGEgPSB7CiAgICAgICAgICAgICc6YWN0aW9uJzogJ2RvY191cGxvYWQnLAogICAgICAgICAgICAnbmFtZSc6IG1ldGEuZ2V0X25hbWUoKSwKICAgICAgICAgICAgJ2NvbnRlbnQnOiAob3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSksIGNvbnRlbnQpLAogICAgICAgIH0KICAgICAgICAjIHNldCB1cCB0aGUgYXV0aGVudGljYXRpb24KICAgICAgICBjcmVkZW50aWFscyA9IF9lbmNvZGUoc2VsZi51c2VybmFtZSArICc6JyArIHNlbGYucGFzc3dvcmQpCiAgICAgICAgY3JlZGVudGlhbHMgPSBzdGFuZGFyZF9iNjRlbmNvZGUoY3JlZGVudGlhbHMpCiAgICAgICAgaWYgc2l4LlBZMzoKICAgICAgICAgICAgY3JlZGVudGlhbHMgPSBjcmVkZW50aWFscy5kZWNvZGUoJ2FzY2lpJykKICAgICAgICBhdXRoID0gIkJhc2ljICIgKyBjcmVkZW50aWFscwoKICAgICAgICBib2R5LCBjdCA9IHNlbGYuX2J1aWxkX211bHRpcGFydChkYXRhKQoKICAgICAgICBtc2cgPSAiU3VibWl0dGluZyBkb2N1bWVudGF0aW9uIHRvICVzIiAlIChzZWxmLnJlcG9zaXRvcnkpCiAgICAgICAgc2VsZi5hbm5vdW5jZShtc2csIGxvZy5JTkZPKQoKICAgICAgICAjIGJ1aWxkIHRoZSBSZXF1ZXN0CiAgICAgICAgIyBXZSBjYW4ndCB1c2UgdXJsbGliMiBzaW5jZSB3ZSBuZWVkIHRvIHNlbmQgdGhlIEJhc2ljCiAgICAgICAgIyBhdXRoIHJpZ2h0IHdpdGggdGhlIGZpcnN0IHJlcXVlc3QKICAgICAgICBzY2hlbWEsIG5ldGxvYywgdXJsLCBwYXJhbXMsIHF1ZXJ5LCBmcmFnbWVudHMgPSBcCiAgICAgICAgICAgIHVybGxpYi5wYXJzZS51cmxwYXJzZShzZWxmLnJlcG9zaXRvcnkpCiAgICAgICAgYXNzZXJ0IG5vdCBwYXJhbXMgYW5kIG5vdCBxdWVyeSBhbmQgbm90IGZyYWdtZW50cwogICAgICAgIGlmIHNjaGVtYSA9PSAnaHR0cCc6CiAgICAgICAgICAgIGNvbm4gPSBodHRwX2NsaWVudC5IVFRQQ29ubmVjdGlvbihuZXRsb2MpCiAgICAgICAgZWxpZiBzY2hlbWEgPT0gJ2h0dHBzJzoKICAgICAgICAgICAgY29ubiA9IGh0dHBfY2xpZW50LkhUVFBTQ29ubmVjdGlvbihuZXRsb2MpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoInVuc3VwcG9ydGVkIHNjaGVtYSAiICsgc2NoZW1hKQoKICAgICAgICBkYXRhID0gJycKICAgICAgICB0cnk6CiAgICAgICAgICAgIGNvbm4uY29ubmVjdCgpCiAgICAgICAgICAgIGNvbm4ucHV0cmVxdWVzdCgiUE9TVCIsIHVybCkKICAgICAgICAgICAgY29udGVudF90eXBlID0gY3QKICAgICAgICAgICAgY29ubi5wdXRoZWFkZXIoJ0NvbnRlbnQtdHlwZScsIGNvbnRlbnRfdHlwZSkKICAgICAgICAgICAgY29ubi5wdXRoZWFkZXIoJ0NvbnRlbnQtbGVuZ3RoJywgc3RyKGxlbihib2R5KSkpCiAgICAgICAgICAgIGNvbm4ucHV0aGVhZGVyKCdBdXRob3JpemF0aW9uJywgYXV0aCkKICAgICAgICAgICAgY29ubi5lbmRoZWFkZXJzKCkKICAgICAgICAgICAgY29ubi5zZW5kKGJvZHkpCiAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciBhcyBlOgogICAgICAgICAgICBzZWxmLmFubm91bmNlKHN0cihlKSwgbG9nLkVSUk9SKQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgciA9IGNvbm4uZ2V0cmVzcG9uc2UoKQogICAgICAgIGlmIHIuc3RhdHVzID09IDIwMDoKICAgICAgICAgICAgbXNnID0gJ1NlcnZlciByZXNwb25zZSAoJXMpOiAlcycgJSAoci5zdGF0dXMsIHIucmVhc29uKQogICAgICAgICAgICBzZWxmLmFubm91bmNlKG1zZywgbG9nLklORk8pCiAgICAgICAgZWxpZiByLnN0YXR1cyA9PSAzMDE6CiAgICAgICAgICAgIGxvY2F0aW9uID0gci5nZXRoZWFkZXIoJ0xvY2F0aW9uJykKICAgICAgICAgICAgaWYgbG9jYXRpb24gaXMgTm9uZToKICAgICAgICAgICAgICAgIGxvY2F0aW9uID0gJ2h0dHBzOi8vcHl0aG9uaG9zdGVkLm9yZy8lcy8nICUgbWV0YS5nZXRfbmFtZSgpCiAgICAgICAgICAgIG1zZyA9ICdVcGxvYWQgc3VjY2Vzc2Z1bC4gVmlzaXQgJXMnICUgbG9jYXRpb24KICAgICAgICAgICAgc2VsZi5hbm5vdW5jZShtc2csIGxvZy5JTkZPKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG1zZyA9ICdVcGxvYWQgZmFpbGVkICglcyk6ICVzJyAlIChyLnN0YXR1cywgci5yZWFzb24pCiAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UobXNnLCBsb2cuRVJST1IpCiAgICAgICAgaWYgc2VsZi5zaG93X3Jlc3BvbnNlOgogICAgICAgICAgICBwcmludCgnLScgKiA3NSwgci5yZWFkKCksICctJyAqIDc1KQpQSwMEFAAAAAAAAAAhAIlHECSxPwAAsT8AACwAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbmZpZy5weWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0LCB1bmljb2RlX2xpdGVyYWxzCmltcG9ydCBpbwppbXBvcnQgb3MKaW1wb3J0IHN5cwpmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZWZhdWx0ZGljdApmcm9tIGZ1bmN0b29scyBpbXBvcnQgcGFydGlhbApmcm9tIGltcG9ydGxpYiBpbXBvcnQgaW1wb3J0X21vZHVsZQoKZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNPcHRpb25FcnJvciwgRGlzdHV0aWxzRmlsZUVycm9yCmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4IGltcG9ydCBzdHJpbmdfdHlwZXMKCgpkZWYgcmVhZF9jb25maWd1cmF0aW9uKAogICAgICAgIGZpbGVwYXRoLCBmaW5kX290aGVycz1GYWxzZSwgaWdub3JlX29wdGlvbl9lcnJvcnM9RmFsc2UpOgogICAgIiIiUmVhZCBnaXZlbiBjb25maWd1cmF0aW9uIGZpbGUgYW5kIHJldHVybnMgb3B0aW9ucyBmcm9tIGl0IGFzIGEgZGljdC4KCiAgICA6cGFyYW0gc3RyfHVuaWNvZGUgZmlsZXBhdGg6IFBhdGggdG8gY29uZmlndXJhdGlvbiBmaWxlCiAgICAgICAgdG8gZ2V0IG9wdGlvbnMgZnJvbS4KCiAgICA6cGFyYW0gYm9vbCBmaW5kX290aGVyczogV2hldGhlciB0byBzZWFyY2ggZm9yIG90aGVyIGNvbmZpZ3VyYXRpb24gZmlsZXMKICAgICAgICB3aGljaCBjb3VsZCBiZSBvbiBpbiB2YXJpb3VzIHBsYWNlcy4KCiAgICA6cGFyYW0gYm9vbCBpZ25vcmVfb3B0aW9uX2Vycm9yczogV2hldGhlciB0byBzaWxlbnRseSBpZ25vcmUKICAgICAgICBvcHRpb25zLCB2YWx1ZXMgb2Ygd2hpY2ggY291bGQgbm90IGJlIHJlc29sdmVkIChlLmcuIGR1ZSB0byBleGNlcHRpb25zCiAgICAgICAgaW4gZGlyZWN0aXZlcyBzdWNoIGFzIGZpbGU6LCBhdHRyOiwgZXRjLikuCiAgICAgICAgSWYgRmFsc2UgZXhjZXB0aW9ucyBhcmUgcHJvcGFnYXRlZCBhcyBleHBlY3RlZC4KCiAgICA6cnR5cGU6IGRpY3QKICAgICIiIgogICAgZnJvbSBzZXR1cHRvb2xzLmRpc3QgaW1wb3J0IERpc3RyaWJ1dGlvbiwgX0Rpc3RyaWJ1dGlvbgoKICAgIGZpbGVwYXRoID0gb3MucGF0aC5hYnNwYXRoKGZpbGVwYXRoKQoKICAgIGlmIG5vdCBvcy5wYXRoLmlzZmlsZShmaWxlcGF0aCk6CiAgICAgICAgcmFpc2UgRGlzdHV0aWxzRmlsZUVycm9yKAogICAgICAgICAgICAnQ29uZmlndXJhdGlvbiBmaWxlICVzIGRvZXMgbm90IGV4aXN0LicgJSBmaWxlcGF0aCkKCiAgICBjdXJyZW50X2RpcmVjdG9yeSA9IG9zLmdldGN3ZCgpCiAgICBvcy5jaGRpcihvcy5wYXRoLmRpcm5hbWUoZmlsZXBhdGgpKQoKICAgIHRyeToKICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uKCkKCiAgICAgICAgZmlsZW5hbWVzID0gZGlzdC5maW5kX2NvbmZpZ19maWxlcygpIGlmIGZpbmRfb3RoZXJzIGVsc2UgW10KICAgICAgICBpZiBmaWxlcGF0aCBub3QgaW4gZmlsZW5hbWVzOgogICAgICAgICAgICBmaWxlbmFtZXMuYXBwZW5kKGZpbGVwYXRoKQoKICAgICAgICBfRGlzdHJpYnV0aW9uLnBhcnNlX2NvbmZpZ19maWxlcyhkaXN0LCBmaWxlbmFtZXM9ZmlsZW5hbWVzKQoKICAgICAgICBoYW5kbGVycyA9IHBhcnNlX2NvbmZpZ3VyYXRpb24oCiAgICAgICAgICAgIGRpc3QsIGRpc3QuY29tbWFuZF9vcHRpb25zLAogICAgICAgICAgICBpZ25vcmVfb3B0aW9uX2Vycm9ycz1pZ25vcmVfb3B0aW9uX2Vycm9ycykKCiAgICBmaW5hbGx5OgogICAgICAgIG9zLmNoZGlyKGN1cnJlbnRfZGlyZWN0b3J5KQoKICAgIHJldHVybiBjb25maWd1cmF0aW9uX3RvX2RpY3QoaGFuZGxlcnMpCgoKZGVmIGNvbmZpZ3VyYXRpb25fdG9fZGljdChoYW5kbGVycyk6CiAgICAiIiJSZXR1cm5zIGNvbmZpZ3VyYXRpb24gZGF0YSBnYXRoZXJlZCBieSBnaXZlbiBoYW5kbGVycyBhcyBhIGRpY3QuCgogICAgOnBhcmFtIGxpc3RbQ29uZmlnSGFuZGxlcl0gaGFuZGxlcnM6IEhhbmRsZXJzIGxpc3QsCiAgICAgICAgdXN1YWxseSBmcm9tIHBhcnNlX2NvbmZpZ3VyYXRpb24oKQoKICAgIDpydHlwZTogZGljdAogICAgIiIiCiAgICBjb25maWdfZGljdCA9IGRlZmF1bHRkaWN0KGRpY3QpCgogICAgZm9yIGhhbmRsZXIgaW4gaGFuZGxlcnM6CgogICAgICAgIG9ial9hbGlhcyA9IGhhbmRsZXIuc2VjdGlvbl9wcmVmaXgKICAgICAgICB0YXJnZXRfb2JqID0gaGFuZGxlci50YXJnZXRfb2JqCgogICAgICAgIGZvciBvcHRpb24gaW4gaGFuZGxlci5zZXRfb3B0aW9uczoKICAgICAgICAgICAgZ2V0dGVyID0gZ2V0YXR0cih0YXJnZXRfb2JqLCAnZ2V0XyVzJyAlIG9wdGlvbiwgTm9uZSkKCiAgICAgICAgICAgIGlmIGdldHRlciBpcyBOb25lOgogICAgICAgICAgICAgICAgdmFsdWUgPSBnZXRhdHRyKHRhcmdldF9vYmosIG9wdGlvbikKCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICB2YWx1ZSA9IGdldHRlcigpCgogICAgICAgICAgICBjb25maWdfZGljdFtvYmpfYWxpYXNdW29wdGlvbl0gPSB2YWx1ZQoKICAgIHJldHVybiBjb25maWdfZGljdAoKCmRlZiBwYXJzZV9jb25maWd1cmF0aW9uKAogICAgICAgIGRpc3RyaWJ1dGlvbiwgY29tbWFuZF9vcHRpb25zLCBpZ25vcmVfb3B0aW9uX2Vycm9ycz1GYWxzZSk6CiAgICAiIiJQZXJmb3JtcyBhZGRpdGlvbmFsIHBhcnNpbmcgb2YgY29uZmlndXJhdGlvbiBvcHRpb25zCiAgICBmb3IgYSBkaXN0cmlidXRpb24uCgogICAgUmV0dXJucyBhIGxpc3Qgb2YgdXNlZCBvcHRpb24gaGFuZGxlcnMuCgogICAgOnBhcmFtIERpc3RyaWJ1dGlvbiBkaXN0cmlidXRpb246CiAgICA6cGFyYW0gZGljdCBjb21tYW5kX29wdGlvbnM6CiAgICA6cGFyYW0gYm9vbCBpZ25vcmVfb3B0aW9uX2Vycm9yczogV2hldGhlciB0byBzaWxlbnRseSBpZ25vcmUKICAgICAgICBvcHRpb25zLCB2YWx1ZXMgb2Ygd2hpY2ggY291bGQgbm90IGJlIHJlc29sdmVkIChlLmcuIGR1ZSB0byBleGNlcHRpb25zCiAgICAgICAgaW4gZGlyZWN0aXZlcyBzdWNoIGFzIGZpbGU6LCBhdHRyOiwgZXRjLikuCiAgICAgICAgSWYgRmFsc2UgZXhjZXB0aW9ucyBhcmUgcHJvcGFnYXRlZCBhcyBleHBlY3RlZC4KICAgIDpydHlwZTogbGlzdAogICAgIiIiCiAgICBtZXRhID0gQ29uZmlnTWV0YWRhdGFIYW5kbGVyKAogICAgICAgIGRpc3RyaWJ1dGlvbi5tZXRhZGF0YSwgY29tbWFuZF9vcHRpb25zLCBpZ25vcmVfb3B0aW9uX2Vycm9ycykKICAgIG1ldGEucGFyc2UoKQoKICAgIG9wdGlvbnMgPSBDb25maWdPcHRpb25zSGFuZGxlcigKICAgICAgICBkaXN0cmlidXRpb24sIGNvbW1hbmRfb3B0aW9ucywgaWdub3JlX29wdGlvbl9lcnJvcnMpCiAgICBvcHRpb25zLnBhcnNlKCkKCiAgICByZXR1cm4gW21ldGEsIG9wdGlvbnNdCgoKY2xhc3MgQ29uZmlnSGFuZGxlcihvYmplY3QpOgogICAgIiIiSGFuZGxlcyBtZXRhZGF0YSBzdXBwbGllZCBpbiBjb25maWd1cmF0aW9uIGZpbGVzLiIiIgoKICAgIHNlY3Rpb25fcHJlZml4ID0gTm9uZQogICAgIiIiUHJlZml4IGZvciBjb25maWcgc2VjdGlvbnMgaGFuZGxlZCBieSB0aGlzIGhhbmRsZXIuCiAgICBNdXN0IGJlIHByb3ZpZGVkIGJ5IGNsYXNzIGhlaXJzLgoKICAgICIiIgoKICAgIGFsaWFzZXMgPSB7fQogICAgIiIiT3B0aW9ucyBhbGlhc2VzLgogICAgRm9yIGNvbXBhdGliaWxpdHkgd2l0aCB2YXJpb3VzIHBhY2thZ2VzLiBFLmcuOiBkMnRvMSBhbmQgcGJyLgogICAgTm90ZTogYC1gIGluIGtleXMgaXMgcmVwbGFjZWQgd2l0aCBgX2AgYnkgY29uZmlnIHBhcnNlci4KCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgdGFyZ2V0X29iaiwgb3B0aW9ucywgaWdub3JlX29wdGlvbl9lcnJvcnM9RmFsc2UpOgogICAgICAgIHNlY3Rpb25zID0ge30KCiAgICAgICAgc2VjdGlvbl9wcmVmaXggPSBzZWxmLnNlY3Rpb25fcHJlZml4CiAgICAgICAgZm9yIHNlY3Rpb25fbmFtZSwgc2VjdGlvbl9vcHRpb25zIGluIG9wdGlvbnMuaXRlbXMoKToKICAgICAgICAgICAgaWYgbm90IHNlY3Rpb25fbmFtZS5zdGFydHN3aXRoKHNlY3Rpb25fcHJlZml4KToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICBzZWN0aW9uX25hbWUgPSBzZWN0aW9uX25hbWUucmVwbGFjZShzZWN0aW9uX3ByZWZpeCwgJycpLnN0cmlwKCcuJykKICAgICAgICAgICAgc2VjdGlvbnNbc2VjdGlvbl9uYW1lXSA9IHNlY3Rpb25fb3B0aW9ucwoKICAgICAgICBzZWxmLmlnbm9yZV9vcHRpb25fZXJyb3JzID0gaWdub3JlX29wdGlvbl9lcnJvcnMKICAgICAgICBzZWxmLnRhcmdldF9vYmogPSB0YXJnZXRfb2JqCiAgICAgICAgc2VsZi5zZWN0aW9ucyA9IHNlY3Rpb25zCiAgICAgICAgc2VsZi5zZXRfb3B0aW9ucyA9IFtdCgogICAgQHByb3BlcnR5CiAgICBkZWYgcGFyc2VycyhzZWxmKToKICAgICAgICAiIiJNZXRhZGF0YSBpdGVtIG5hbWUgdG8gcGFyc2VyIGZ1bmN0aW9uIG1hcHBpbmcuIiIiCiAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigKICAgICAgICAgICAgJyVzIG11c3QgcHJvdmlkZSAucGFyc2VycyBwcm9wZXJ0eScgJSBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXykKCiAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwgb3B0aW9uX25hbWUsIHZhbHVlKToKICAgICAgICB1bmtub3duID0gdHVwbGUoKQogICAgICAgIHRhcmdldF9vYmogPSBzZWxmLnRhcmdldF9vYmoKCiAgICAgICAgIyBUcmFuc2xhdGUgYWxpYXMgaW50byByZWFsIG5hbWUuCiAgICAgICAgb3B0aW9uX25hbWUgPSBzZWxmLmFsaWFzZXMuZ2V0KG9wdGlvbl9uYW1lLCBvcHRpb25fbmFtZSkKCiAgICAgICAgY3VycmVudF92YWx1ZSA9IGdldGF0dHIodGFyZ2V0X29iaiwgb3B0aW9uX25hbWUsIHVua25vd24pCgogICAgICAgIGlmIGN1cnJlbnRfdmFsdWUgaXMgdW5rbm93bjoKICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3Iob3B0aW9uX25hbWUpCgogICAgICAgIGlmIGN1cnJlbnRfdmFsdWU6CiAgICAgICAgICAgICMgQWxyZWFkeSBpbmhhYml0ZWQuIFNraXBwaW5nLgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgc2tpcF9vcHRpb24gPSBGYWxzZQogICAgICAgIHBhcnNlciA9IHNlbGYucGFyc2Vycy5nZXQob3B0aW9uX25hbWUpCiAgICAgICAgaWYgcGFyc2VyOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICB2YWx1ZSA9IHBhcnNlcih2YWx1ZSkKCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICAgICBza2lwX29wdGlvbiA9IFRydWUKICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmlnbm9yZV9vcHRpb25fZXJyb3JzOgogICAgICAgICAgICAgICAgICAgIHJhaXNlCgogICAgICAgIGlmIHNraXBfb3B0aW9uOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgc2V0dGVyID0gZ2V0YXR0cih0YXJnZXRfb2JqLCAnc2V0XyVzJyAlIG9wdGlvbl9uYW1lLCBOb25lKQogICAgICAgIGlmIHNldHRlciBpcyBOb25lOgogICAgICAgICAgICBzZXRhdHRyKHRhcmdldF9vYmosIG9wdGlvbl9uYW1lLCB2YWx1ZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZXR0ZXIodmFsdWUpCgogICAgICAgIHNlbGYuc2V0X29wdGlvbnMuYXBwZW5kKG9wdGlvbl9uYW1lKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9wYXJzZV9saXN0KGNscywgdmFsdWUsIHNlcGFyYXRvcj0nLCcpOgogICAgICAgICIiIlJlcHJlc2VudHMgdmFsdWUgYXMgYSBsaXN0LgoKICAgICAgICBWYWx1ZSBpcyBzcGxpdCBlaXRoZXIgYnkgc2VwYXJhdG9yIChkZWZhdWx0cyB0byBjb21tYSkgb3IgYnkgbGluZXMuCgogICAgICAgIDpwYXJhbSB2YWx1ZToKICAgICAgICA6cGFyYW0gc2VwYXJhdG9yOiBMaXN0IGl0ZW1zIHNlcGFyYXRvciBjaGFyYWN0ZXIuCiAgICAgICAgOnJ0eXBlOiBsaXN0CiAgICAgICAgIiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgbGlzdCk6ICAjIF9nZXRfcGFyc2VyX2NvbXBvdW5kIGNhc2UKICAgICAgICAgICAgcmV0dXJuIHZhbHVlCgogICAgICAgIGlmICdcbicgaW4gdmFsdWU6CiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc3BsaXRsaW5lcygpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zcGxpdChzZXBhcmF0b3IpCgogICAgICAgIHJldHVybiBbY2h1bmsuc3RyaXAoKSBmb3IgY2h1bmsgaW4gdmFsdWUgaWYgY2h1bmsuc3RyaXAoKV0KCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfcGFyc2VfZGljdChjbHMsIHZhbHVlKToKICAgICAgICAiIiJSZXByZXNlbnRzIHZhbHVlIGFzIGEgZGljdC4KCiAgICAgICAgOnBhcmFtIHZhbHVlOgogICAgICAgIDpydHlwZTogZGljdAogICAgICAgICIiIgogICAgICAgIHNlcGFyYXRvciA9ICc9JwogICAgICAgIHJlc3VsdCA9IHt9CiAgICAgICAgZm9yIGxpbmUgaW4gY2xzLl9wYXJzZV9saXN0KHZhbHVlKToKICAgICAgICAgICAga2V5LCBzZXAsIHZhbCA9IGxpbmUucGFydGl0aW9uKHNlcGFyYXRvcikKICAgICAgICAgICAgaWYgc2VwICE9IHNlcGFyYXRvcjoKICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKAogICAgICAgICAgICAgICAgICAgICdVbmFibGUgdG8gcGFyc2Ugb3B0aW9uIHZhbHVlIHRvIGRpY3Q6ICVzJyAlIHZhbHVlKQogICAgICAgICAgICByZXN1bHRba2V5LnN0cmlwKCldID0gdmFsLnN0cmlwKCkKCiAgICAgICAgcmV0dXJuIHJlc3VsdAoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9wYXJzZV9ib29sKGNscywgdmFsdWUpOgogICAgICAgICIiIlJlcHJlc2VudHMgdmFsdWUgYXMgYm9vbGVhbi4KCiAgICAgICAgOnBhcmFtIHZhbHVlOgogICAgICAgIDpydHlwZTogYm9vbAogICAgICAgICIiIgogICAgICAgIHZhbHVlID0gdmFsdWUubG93ZXIoKQogICAgICAgIHJldHVybiB2YWx1ZSBpbiAoJzEnLCAndHJ1ZScsICd5ZXMnKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9wYXJzZV9maWxlKGNscywgdmFsdWUpOgogICAgICAgICIiIlJlcHJlc2VudHMgdmFsdWUgYXMgYSBzdHJpbmcsIGFsbG93aW5nIGluY2x1ZGluZyB0ZXh0CiAgICAgICAgZnJvbSBuZWFyZXN0IGZpbGVzIHVzaW5nIGBmaWxlOmAgZGlyZWN0aXZlLgoKICAgICAgICBEaXJlY3RpdmUgaXMgc2FuZGJveGVkIGFuZCB3b24ndCByZWFjaCBhbnl0aGluZyBvdXRzaWRlCiAgICAgICAgZGlyZWN0b3J5IHdpdGggc2V0dXAucHkuCgogICAgICAgIEV4YW1wbGVzOgogICAgICAgICAgICBmaWxlOiBMSUNFTlNFCiAgICAgICAgICAgIGZpbGU6IFJFQURNRS5yc3QsIENIQU5HRUxPRy5tZCwgc3JjL2ZpbGUudHh0CgogICAgICAgIDpwYXJhbSBzdHIgdmFsdWU6CiAgICAgICAgOnJ0eXBlOiBzdHIKICAgICAgICAiIiIKICAgICAgICBpbmNsdWRlX2RpcmVjdGl2ZSA9ICdmaWxlOicKCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsIHN0cmluZ190eXBlcyk6CiAgICAgICAgICAgIHJldHVybiB2YWx1ZQoKICAgICAgICBpZiBub3QgdmFsdWUuc3RhcnRzd2l0aChpbmNsdWRlX2RpcmVjdGl2ZSk6CiAgICAgICAgICAgIHJldHVybiB2YWx1ZQoKICAgICAgICBzcGVjID0gdmFsdWVbbGVuKGluY2x1ZGVfZGlyZWN0aXZlKTpdCiAgICAgICAgZmlsZXBhdGhzID0gKG9zLnBhdGguYWJzcGF0aChwYXRoLnN0cmlwKCkpIGZvciBwYXRoIGluIHNwZWMuc3BsaXQoJywnKSkKICAgICAgICByZXR1cm4gJ1xuJy5qb2luKAogICAgICAgICAgICBjbHMuX3JlYWRfZmlsZShwYXRoKQogICAgICAgICAgICBmb3IgcGF0aCBpbiBmaWxlcGF0aHMKICAgICAgICAgICAgaWYgKGNscy5fYXNzZXJ0X2xvY2FsKHBhdGgpIG9yIFRydWUpCiAgICAgICAgICAgIGFuZCBvcy5wYXRoLmlzZmlsZShwYXRoKQogICAgICAgICkKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX2Fzc2VydF9sb2NhbChmaWxlcGF0aCk6CiAgICAgICAgaWYgbm90IGZpbGVwYXRoLnN0YXJ0c3dpdGgob3MuZ2V0Y3dkKCkpOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigKICAgICAgICAgICAgICAgICdgZmlsZTpgIGRpcmVjdGl2ZSBjYW4gbm90IGFjY2VzcyAlcycgJSBmaWxlcGF0aCkKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX3JlYWRfZmlsZShmaWxlcGF0aCk6CiAgICAgICAgd2l0aCBpby5vcGVuKGZpbGVwYXRoLCBlbmNvZGluZz0ndXRmLTgnKSBhcyBmOgogICAgICAgICAgICByZXR1cm4gZi5yZWFkKCkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBfcGFyc2VfYXR0cihjbHMsIHZhbHVlKToKICAgICAgICAiIiJSZXByZXNlbnRzIHZhbHVlIGFzIGEgbW9kdWxlIGF0dHJpYnV0ZS4KCiAgICAgICAgRXhhbXBsZXM6CiAgICAgICAgICAgIGF0dHI6IHBhY2thZ2UuYXR0cgogICAgICAgICAgICBhdHRyOiBwYWNrYWdlLm1vZHVsZS5hdHRyCgogICAgICAgIDpwYXJhbSBzdHIgdmFsdWU6CiAgICAgICAgOnJ0eXBlOiBzdHIKICAgICAgICAiIiIKICAgICAgICBhdHRyX2RpcmVjdGl2ZSA9ICdhdHRyOicKICAgICAgICBpZiBub3QgdmFsdWUuc3RhcnRzd2l0aChhdHRyX2RpcmVjdGl2ZSk6CiAgICAgICAgICAgIHJldHVybiB2YWx1ZQoKICAgICAgICBhdHRyc19wYXRoID0gdmFsdWUucmVwbGFjZShhdHRyX2RpcmVjdGl2ZSwgJycpLnN0cmlwKCkuc3BsaXQoJy4nKQogICAgICAgIGF0dHJfbmFtZSA9IGF0dHJzX3BhdGgucG9wKCkKCiAgICAgICAgbW9kdWxlX25hbWUgPSAnLicuam9pbihhdHRyc19wYXRoKQogICAgICAgIG1vZHVsZV9uYW1lID0gbW9kdWxlX25hbWUgb3IgJ19faW5pdF9fJwoKICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgb3MuZ2V0Y3dkKCkpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBtb2R1bGUgPSBpbXBvcnRfbW9kdWxlKG1vZHVsZV9uYW1lKQogICAgICAgICAgICB2YWx1ZSA9IGdldGF0dHIobW9kdWxlLCBhdHRyX25hbWUpCgogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIHN5cy5wYXRoID0gc3lzLnBhdGhbMTpdCgogICAgICAgIHJldHVybiB2YWx1ZQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9nZXRfcGFyc2VyX2NvbXBvdW5kKGNscywgKnBhcnNlX21ldGhvZHMpOgogICAgICAgICIiIlJldHVybnMgcGFyc2VyIGZ1bmN0aW9uIHRvIHJlcHJlc2VudHMgdmFsdWUgYXMgYSBsaXN0LgoKICAgICAgICBQYXJzZXMgYSB2YWx1ZSBhcHBseWluZyBnaXZlbiBtZXRob2RzIG9uZSBhZnRlciBhbm90aGVyLgoKICAgICAgICA6cGFyYW0gcGFyc2VfbWV0aG9kczoKICAgICAgICA6cnR5cGU6IGNhbGxhYmxlCiAgICAgICAgIiIiCiAgICAgICAgZGVmIHBhcnNlKHZhbHVlKToKICAgICAgICAgICAgcGFyc2VkID0gdmFsdWUKCiAgICAgICAgICAgIGZvciBtZXRob2QgaW4gcGFyc2VfbWV0aG9kczoKICAgICAgICAgICAgICAgIHBhcnNlZCA9IG1ldGhvZChwYXJzZWQpCgogICAgICAgICAgICByZXR1cm4gcGFyc2VkCgogICAgICAgIHJldHVybiBwYXJzZQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIF9wYXJzZV9zZWN0aW9uX3RvX2RpY3QoY2xzLCBzZWN0aW9uX29wdGlvbnMsIHZhbHVlc19wYXJzZXI9Tm9uZSk6CiAgICAgICAgIiIiUGFyc2VzIHNlY3Rpb24gb3B0aW9ucyBpbnRvIGEgZGljdGlvbmFyeS4KCiAgICAgICAgT3B0aW9uYWxseSBhcHBsaWVzIGEgZ2l2ZW4gcGFyc2VyIHRvIHZhbHVlcy4KCiAgICAgICAgOnBhcmFtIGRpY3Qgc2VjdGlvbl9vcHRpb25zOgogICAgICAgIDpwYXJhbSBjYWxsYWJsZSB2YWx1ZXNfcGFyc2VyOgogICAgICAgIDpydHlwZTogZGljdAogICAgICAgICIiIgogICAgICAgIHZhbHVlID0ge30KICAgICAgICB2YWx1ZXNfcGFyc2VyID0gdmFsdWVzX3BhcnNlciBvciAobGFtYmRhIHZhbDogdmFsKQogICAgICAgIGZvciBrZXksIChfLCB2YWwpIGluIHNlY3Rpb25fb3B0aW9ucy5pdGVtcygpOgogICAgICAgICAgICB2YWx1ZVtrZXldID0gdmFsdWVzX3BhcnNlcih2YWwpCiAgICAgICAgcmV0dXJuIHZhbHVlCgogICAgZGVmIHBhcnNlX3NlY3Rpb24oc2VsZiwgc2VjdGlvbl9vcHRpb25zKToKICAgICAgICAiIiJQYXJzZXMgY29uZmlndXJhdGlvbiBmaWxlIHNlY3Rpb24uCgogICAgICAgIDpwYXJhbSBkaWN0IHNlY3Rpb25fb3B0aW9uczoKICAgICAgICAiIiIKICAgICAgICBmb3IgKG5hbWUsIChfLCB2YWx1ZSkpIGluIHNlY3Rpb25fb3B0aW9ucy5pdGVtcygpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBzZWxmW25hbWVdID0gdmFsdWUKCiAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgICAgIHBhc3MgICMgS2VlcCBzaWxlbnQgZm9yIGEgbmV3IG9wdGlvbiBtYXkgYXBwZWFyIGFueXRpbWUuCgogICAgZGVmIHBhcnNlKHNlbGYpOgogICAgICAgICIiIlBhcnNlcyBjb25maWd1cmF0aW9uIGZpbGUgaXRlbXMgZnJvbSBvbmUKICAgICAgICBvciBtb3JlIHJlbGF0ZWQgc2VjdGlvbnMuCgogICAgICAgICIiIgogICAgICAgIGZvciBzZWN0aW9uX25hbWUsIHNlY3Rpb25fb3B0aW9ucyBpbiBzZWxmLnNlY3Rpb25zLml0ZW1zKCk6CgogICAgICAgICAgICBtZXRob2RfcG9zdGZpeCA9ICcnCiAgICAgICAgICAgIGlmIHNlY3Rpb25fbmFtZTogICMgW3NlY3Rpb24ub3B0aW9uXSB2YXJpYW50CiAgICAgICAgICAgICAgICBtZXRob2RfcG9zdGZpeCA9ICdfJXMnICUgc2VjdGlvbl9uYW1lCgogICAgICAgICAgICBzZWN0aW9uX3BhcnNlcl9tZXRob2QgPSBnZXRhdHRyKAogICAgICAgICAgICAgICAgc2VsZiwKICAgICAgICAgICAgICAgICMgRG90cyBpbiBzZWN0aW9uIG5hbWVzIGFyZSB0cmFubHNhdGVkIGludG8gZHVuZGVyc2NvcmVzLgogICAgICAgICAgICAgICAgKCdwYXJzZV9zZWN0aW9uJXMnICUgbWV0aG9kX3Bvc3RmaXgpLnJlcGxhY2UoJy4nLCAnX18nKSwKICAgICAgICAgICAgICAgIE5vbmUpCgogICAgICAgICAgICBpZiBzZWN0aW9uX3BhcnNlcl9tZXRob2QgaXMgTm9uZToKICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKAogICAgICAgICAgICAgICAgICAgICdVbnN1cHBvcnRlZCBkaXN0cmlidXRpb24gb3B0aW9uIHNlY3Rpb246IFslcy4lc10nICUgKAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlY3Rpb25fcHJlZml4LCBzZWN0aW9uX25hbWUpKQoKICAgICAgICAgICAgc2VjdGlvbl9wYXJzZXJfbWV0aG9kKHNlY3Rpb25fb3B0aW9ucykKCgpjbGFzcyBDb25maWdNZXRhZGF0YUhhbmRsZXIoQ29uZmlnSGFuZGxlcik6CgogICAgc2VjdGlvbl9wcmVmaXggPSAnbWV0YWRhdGEnCgogICAgYWxpYXNlcyA9IHsKICAgICAgICAnaG9tZV9wYWdlJzogJ3VybCcsCiAgICAgICAgJ3N1bW1hcnknOiAnZGVzY3JpcHRpb24nLAogICAgICAgICdjbGFzc2lmaWVyJzogJ2NsYXNzaWZpZXJzJywKICAgICAgICAncGxhdGZvcm0nOiAncGxhdGZvcm1zJywKICAgIH0KCiAgICBzdHJpY3RfbW9kZSA9IEZhbHNlCiAgICAiIiJXZSBuZWVkIHRvIGtlZXAgaXQgbG9vc2UsIHRvIGJlIHBhcnRpYWxseSBjb21wYXRpYmxlIHdpdGgKICAgIGBwYnJgIGFuZCBgZDJ0bzFgIHBhY2thZ2VzIHdoaWNoIGFsc28gdXNlcyBgbWV0YWRhdGFgIHNlY3Rpb24uCgogICAgIiIiCgogICAgQHByb3BlcnR5CiAgICBkZWYgcGFyc2VycyhzZWxmKToKICAgICAgICAiIiJNZXRhZGF0YSBpdGVtIG5hbWUgdG8gcGFyc2VyIGZ1bmN0aW9uIG1hcHBpbmcuIiIiCiAgICAgICAgcGFyc2VfbGlzdCA9IHNlbGYuX3BhcnNlX2xpc3QKICAgICAgICBwYXJzZV9maWxlID0gc2VsZi5fcGFyc2VfZmlsZQoKICAgICAgICByZXR1cm4gewogICAgICAgICAgICAncGxhdGZvcm1zJzogcGFyc2VfbGlzdCwKICAgICAgICAgICAgJ2tleXdvcmRzJzogcGFyc2VfbGlzdCwKICAgICAgICAgICAgJ3Byb3ZpZGVzJzogcGFyc2VfbGlzdCwKICAgICAgICAgICAgJ3JlcXVpcmVzJzogcGFyc2VfbGlzdCwKICAgICAgICAgICAgJ29ic29sZXRlcyc6IHBhcnNlX2xpc3QsCiAgICAgICAgICAgICdjbGFzc2lmaWVycyc6IHNlbGYuX2dldF9wYXJzZXJfY29tcG91bmQocGFyc2VfZmlsZSwgcGFyc2VfbGlzdCksCiAgICAgICAgICAgICdsaWNlbnNlJzogcGFyc2VfZmlsZSwKICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogcGFyc2VfZmlsZSwKICAgICAgICAgICAgJ2xvbmdfZGVzY3JpcHRpb24nOiBwYXJzZV9maWxlLAogICAgICAgICAgICAndmVyc2lvbic6IHNlbGYuX3BhcnNlX3ZlcnNpb24sCiAgICAgICAgfQoKICAgIGRlZiBfcGFyc2VfdmVyc2lvbihzZWxmLCB2YWx1ZSk6CiAgICAgICAgIiIiUGFyc2VzIGB2ZXJzaW9uYCBvcHRpb24gdmFsdWUuCgogICAgICAgIDpwYXJhbSB2YWx1ZToKICAgICAgICA6cnR5cGU6IHN0cgoKICAgICAgICAiIiIKICAgICAgICB2ZXJzaW9uID0gc2VsZi5fcGFyc2VfYXR0cih2YWx1ZSkKCiAgICAgICAgaWYgY2FsbGFibGUodmVyc2lvbik6CiAgICAgICAgICAgIHZlcnNpb24gPSB2ZXJzaW9uKCkKCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmVyc2lvbiwgc3RyaW5nX3R5cGVzKToKICAgICAgICAgICAgaWYgaGFzYXR0cih2ZXJzaW9uLCAnX19pdGVyX18nKToKICAgICAgICAgICAgICAgIHZlcnNpb24gPSAnLicuam9pbihtYXAoc3RyLCB2ZXJzaW9uKSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHZlcnNpb24gPSAnJXMnICUgdmVyc2lvbgoKICAgICAgICByZXR1cm4gdmVyc2lvbgoKCmNsYXNzIENvbmZpZ09wdGlvbnNIYW5kbGVyKENvbmZpZ0hhbmRsZXIpOgoKICAgIHNlY3Rpb25fcHJlZml4ID0gJ29wdGlvbnMnCgogICAgQHByb3BlcnR5CiAgICBkZWYgcGFyc2VycyhzZWxmKToKICAgICAgICAiIiJNZXRhZGF0YSBpdGVtIG5hbWUgdG8gcGFyc2VyIGZ1bmN0aW9uIG1hcHBpbmcuIiIiCiAgICAgICAgcGFyc2VfbGlzdCA9IHNlbGYuX3BhcnNlX2xpc3QKICAgICAgICBwYXJzZV9saXN0X3NlbWljb2xvbiA9IHBhcnRpYWwoc2VsZi5fcGFyc2VfbGlzdCwgc2VwYXJhdG9yPSc7JykKICAgICAgICBwYXJzZV9ib29sID0gc2VsZi5fcGFyc2VfYm9vbAogICAgICAgIHBhcnNlX2RpY3QgPSBzZWxmLl9wYXJzZV9kaWN0CgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICd6aXBfc2FmZSc6IHBhcnNlX2Jvb2wsCiAgICAgICAgICAgICd1c2VfMnRvMyc6IHBhcnNlX2Jvb2wsCiAgICAgICAgICAgICdpbmNsdWRlX3BhY2thZ2VfZGF0YSc6IHBhcnNlX2Jvb2wsCiAgICAgICAgICAgICdwYWNrYWdlX2Rpcic6IHBhcnNlX2RpY3QsCiAgICAgICAgICAgICd1c2VfMnRvM19maXhlcnMnOiBwYXJzZV9saXN0LAogICAgICAgICAgICAndXNlXzJ0bzNfZXhjbHVkZV9maXhlcnMnOiBwYXJzZV9saXN0LAogICAgICAgICAgICAnY29udmVydF8ydG8zX2RvY3Rlc3RzJzogcGFyc2VfbGlzdCwKICAgICAgICAgICAgJ3NjcmlwdHMnOiBwYXJzZV9saXN0LAogICAgICAgICAgICAnZWFnZXJfcmVzb3VyY2VzJzogcGFyc2VfbGlzdCwKICAgICAgICAgICAgJ2RlcGVuZGVuY3lfbGlua3MnOiBwYXJzZV9saXN0LAogICAgICAgICAgICAnbmFtZXNwYWNlX3BhY2thZ2VzJzogcGFyc2VfbGlzdCwKICAgICAgICAgICAgJ2luc3RhbGxfcmVxdWlyZXMnOiBwYXJzZV9saXN0X3NlbWljb2xvbiwKICAgICAgICAgICAgJ3NldHVwX3JlcXVpcmVzJzogcGFyc2VfbGlzdF9zZW1pY29sb24sCiAgICAgICAgICAgICd0ZXN0c19yZXF1aXJlJzogcGFyc2VfbGlzdF9zZW1pY29sb24sCiAgICAgICAgICAgICdwYWNrYWdlcyc6IHNlbGYuX3BhcnNlX3BhY2thZ2VzLAogICAgICAgICAgICAnZW50cnlfcG9pbnRzJzogc2VsZi5fcGFyc2VfZmlsZSwKICAgICAgICAgICAgJ3B5X21vZHVsZXMnOiBwYXJzZV9saXN0LAogICAgICAgIH0KCiAgICBkZWYgX3BhcnNlX3BhY2thZ2VzKHNlbGYsIHZhbHVlKToKICAgICAgICAiIiJQYXJzZXMgYHBhY2thZ2VzYCBvcHRpb24gdmFsdWUuCgogICAgICAgIDpwYXJhbSB2YWx1ZToKICAgICAgICA6cnR5cGU6IGxpc3QKICAgICAgICAiIiIKICAgICAgICBmaW5kX2RpcmVjdGl2ZSA9ICdmaW5kOicKCiAgICAgICAgaWYgbm90IHZhbHVlLnN0YXJ0c3dpdGgoZmluZF9kaXJlY3RpdmUpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fcGFyc2VfbGlzdCh2YWx1ZSkKCiAgICAgICAgIyBSZWFkIGZ1bmN0aW9uIGFyZ3VtZW50cyBmcm9tIGEgZGVkaWNhdGVkIHNlY3Rpb24uCiAgICAgICAgZmluZF9rd2FyZ3MgPSBzZWxmLnBhcnNlX3NlY3Rpb25fcGFja2FnZXNfX2ZpbmQoCiAgICAgICAgICAgIHNlbGYuc2VjdGlvbnMuZ2V0KCdwYWNrYWdlcy5maW5kJywge30pKQoKICAgICAgICBmcm9tIHNldHVwdG9vbHMgaW1wb3J0IGZpbmRfcGFja2FnZXMKCiAgICAgICAgcmV0dXJuIGZpbmRfcGFja2FnZXMoKipmaW5kX2t3YXJncykKCiAgICBkZWYgcGFyc2Vfc2VjdGlvbl9wYWNrYWdlc19fZmluZChzZWxmLCBzZWN0aW9uX29wdGlvbnMpOgogICAgICAgICIiIlBhcnNlcyBgcGFja2FnZXMuZmluZGAgY29uZmlndXJhdGlvbiBmaWxlIHNlY3Rpb24uCgogICAgICAgIFRvIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBfcGFyc2VfcGFja2FnZXMoKS4KCiAgICAgICAgOnBhcmFtIGRpY3Qgc2VjdGlvbl9vcHRpb25zOgogICAgICAgICIiIgogICAgICAgIHNlY3Rpb25fZGF0YSA9IHNlbGYuX3BhcnNlX3NlY3Rpb25fdG9fZGljdCgKICAgICAgICAgICAgc2VjdGlvbl9vcHRpb25zLCBzZWxmLl9wYXJzZV9saXN0KQoKICAgICAgICB2YWxpZF9rZXlzID0gWyd3aGVyZScsICdpbmNsdWRlJywgJ2V4Y2x1ZGUnXQoKICAgICAgICBmaW5kX2t3YXJncyA9IGRpY3QoCiAgICAgICAgICAgIFsoaywgdikgZm9yIGssIHYgaW4gc2VjdGlvbl9kYXRhLml0ZW1zKCkgaWYgayBpbiB2YWxpZF9rZXlzIGFuZCB2XSkKCiAgICAgICAgd2hlcmUgPSBmaW5kX2t3YXJncy5nZXQoJ3doZXJlJykKICAgICAgICBpZiB3aGVyZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgZmluZF9rd2FyZ3NbJ3doZXJlJ10gPSB3aGVyZVswXSAgIyBjYXN0IGxpc3QgdG8gc2luZ2xlIHZhbAoKICAgICAgICByZXR1cm4gZmluZF9rd2FyZ3MKCiAgICBkZWYgcGFyc2Vfc2VjdGlvbl9lbnRyeV9wb2ludHMoc2VsZiwgc2VjdGlvbl9vcHRpb25zKToKICAgICAgICAiIiJQYXJzZXMgYGVudHJ5X3BvaW50c2AgY29uZmlndXJhdGlvbiBmaWxlIHNlY3Rpb24uCgogICAgICAgIDpwYXJhbSBkaWN0IHNlY3Rpb25fb3B0aW9uczoKICAgICAgICAiIiIKICAgICAgICBwYXJzZWQgPSBzZWxmLl9wYXJzZV9zZWN0aW9uX3RvX2RpY3Qoc2VjdGlvbl9vcHRpb25zLCBzZWxmLl9wYXJzZV9saXN0KQogICAgICAgIHNlbGZbJ2VudHJ5X3BvaW50cyddID0gcGFyc2VkCgogICAgZGVmIF9wYXJzZV9wYWNrYWdlX2RhdGEoc2VsZiwgc2VjdGlvbl9vcHRpb25zKToKICAgICAgICBwYXJzZWQgPSBzZWxmLl9wYXJzZV9zZWN0aW9uX3RvX2RpY3Qoc2VjdGlvbl9vcHRpb25zLCBzZWxmLl9wYXJzZV9saXN0KQoKICAgICAgICByb290ID0gcGFyc2VkLmdldCgnKicpCiAgICAgICAgaWYgcm9vdDoKICAgICAgICAgICAgcGFyc2VkWycnXSA9IHJvb3QKICAgICAgICAgICAgZGVsIHBhcnNlZFsnKiddCgogICAgICAgIHJldHVybiBwYXJzZWQKCiAgICBkZWYgcGFyc2Vfc2VjdGlvbl9wYWNrYWdlX2RhdGEoc2VsZiwgc2VjdGlvbl9vcHRpb25zKToKICAgICAgICAiIiJQYXJzZXMgYHBhY2thZ2VfZGF0YWAgY29uZmlndXJhdGlvbiBmaWxlIHNlY3Rpb24uCgogICAgICAgIDpwYXJhbSBkaWN0IHNlY3Rpb25fb3B0aW9uczoKICAgICAgICAiIiIKICAgICAgICBzZWxmWydwYWNrYWdlX2RhdGEnXSA9IHNlbGYuX3BhcnNlX3BhY2thZ2VfZGF0YShzZWN0aW9uX29wdGlvbnMpCgogICAgZGVmIHBhcnNlX3NlY3Rpb25fZXhjbHVkZV9wYWNrYWdlX2RhdGEoc2VsZiwgc2VjdGlvbl9vcHRpb25zKToKICAgICAgICAiIiJQYXJzZXMgYGV4Y2x1ZGVfcGFja2FnZV9kYXRhYCBjb25maWd1cmF0aW9uIGZpbGUgc2VjdGlvbi4KCiAgICAgICAgOnBhcmFtIGRpY3Qgc2VjdGlvbl9vcHRpb25zOgogICAgICAgICIiIgogICAgICAgIHNlbGZbJ2V4Y2x1ZGVfcGFja2FnZV9kYXRhJ10gPSBzZWxmLl9wYXJzZV9wYWNrYWdlX2RhdGEoCiAgICAgICAgICAgIHNlY3Rpb25fb3B0aW9ucykKCiAgICBkZWYgcGFyc2Vfc2VjdGlvbl9leHRyYXNfcmVxdWlyZShzZWxmLCBzZWN0aW9uX29wdGlvbnMpOgogICAgICAgICIiIlBhcnNlcyBgZXh0cmFzX3JlcXVpcmVgIGNvbmZpZ3VyYXRpb24gZmlsZSBzZWN0aW9uLgoKICAgICAgICA6cGFyYW0gZGljdCBzZWN0aW9uX29wdGlvbnM6CiAgICAgICAgIiIiCiAgICAgICAgcGFyc2VfbGlzdCA9IHBhcnRpYWwoc2VsZi5fcGFyc2VfbGlzdCwgc2VwYXJhdG9yPSc7JykKICAgICAgICBzZWxmWydleHRyYXNfcmVxdWlyZSddID0gc2VsZi5fcGFyc2Vfc2VjdGlvbl90b19kaWN0KAogICAgICAgICAgICBzZWN0aW9uX29wdGlvbnMsIHBhcnNlX2xpc3QpClBLAwQUAAAAAAAAACEAGiIEMqcDAACnAwAALgAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvZGVwX3V0aWwucHlmcm9tIGRpc3R1dGlscy5kZXBfdXRpbCBpbXBvcnQgbmV3ZXJfZ3JvdXAKCiMgeWVzLCB0aGlzIGlzIHdhcyBhbG1vc3QgZW50aXJlbHkgY29weS1wYXN0ZWQgZnJvbQojICduZXdlcl9wYWlyd2lzZSgpJywgdGhpcyBpcyBqdXN0IGFub3RoZXIgY29udmVuaWVuY2UKIyBmdW5jdGlvbi4KZGVmIG5ld2VyX3BhaXJ3aXNlX2dyb3VwKHNvdXJjZXNfZ3JvdXBzLCB0YXJnZXRzKToKICAgICIiIldhbGsgYm90aCBhcmd1bWVudHMgaW4gcGFyYWxsZWwsIHRlc3RpbmcgaWYgZWFjaCBzb3VyY2UgZ3JvdXAgaXMgbmV3ZXIKICAgIHRoYW4gaXRzIGNvcnJlc3BvbmRpbmcgdGFyZ2V0LiBSZXR1cm5zIGEgcGFpciBvZiBsaXN0cyAoc291cmNlc19ncm91cHMsCiAgICB0YXJnZXRzKSB3aGVyZSBzb3VyY2VzIGlzIG5ld2VyIHRoYW4gdGFyZ2V0LCBhY2NvcmRpbmcgdG8gdGhlIHNlbWFudGljcwogICAgb2YgJ25ld2VyX2dyb3VwKCknLgogICAgIiIiCiAgICBpZiBsZW4oc291cmNlc19ncm91cHMpICE9IGxlbih0YXJnZXRzKToKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCInc291cmNlc19ncm91cCcgYW5kICd0YXJnZXRzJyBtdXN0IGJlIHRoZSBzYW1lIGxlbmd0aCIpCgogICAgIyBidWlsZCBhIHBhaXIgb2YgbGlzdHMgKHNvdXJjZXNfZ3JvdXBzLCB0YXJnZXRzKSB3aGVyZSBzb3VyY2UgaXMgbmV3ZXIKICAgIG5fc291cmNlcyA9IFtdCiAgICBuX3RhcmdldHMgPSBbXQogICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNvdXJjZXNfZ3JvdXBzKSk6CiAgICAgICAgaWYgbmV3ZXJfZ3JvdXAoc291cmNlc19ncm91cHNbaV0sIHRhcmdldHNbaV0pOgogICAgICAgICAgICBuX3NvdXJjZXMuYXBwZW5kKHNvdXJjZXNfZ3JvdXBzW2ldKQogICAgICAgICAgICBuX3RhcmdldHMuYXBwZW5kKHRhcmdldHNbaV0pCgogICAgcmV0dXJuIG5fc291cmNlcywgbl90YXJnZXRzClBLAwQUAAAAAAAAACEAWyktas0WAADNFgAALQAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvZGVwZW5kcy5weWltcG9ydCBzeXMKaW1wb3J0IGltcAppbXBvcnQgbWFyc2hhbApmcm9tIGRpc3R1dGlscy52ZXJzaW9uIGltcG9ydCBTdHJpY3RWZXJzaW9uCmZyb20gaW1wIGltcG9ydCBQS0dfRElSRUNUT1JZLCBQWV9DT01QSUxFRCwgUFlfU09VUkNFLCBQWV9GUk9aRU4KCmZyb20gLnB5MzNjb21wYXQgaW1wb3J0IEJ5dGVjb2RlCgoKX19hbGxfXyA9IFsKICAgICdSZXF1aXJlJywgJ2ZpbmRfbW9kdWxlJywgJ2dldF9tb2R1bGVfY29uc3RhbnQnLCAnZXh0cmFjdF9jb25zdGFudCcKXQoKCmNsYXNzIFJlcXVpcmU6CiAgICAiIiJBIHByZXJlcXVpc2l0ZSB0byBidWlsZGluZyBvciBpbnN0YWxsaW5nIGEgZGlzdHJpYnV0aW9uIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIHJlcXVlc3RlZF92ZXJzaW9uLCBtb2R1bGUsIGhvbWVwYWdlPScnLAogICAgICAgICAgICBhdHRyaWJ1dGU9Tm9uZSwgZm9ybWF0PU5vbmUpOgoKICAgICAgICBpZiBmb3JtYXQgaXMgTm9uZSBhbmQgcmVxdWVzdGVkX3ZlcnNpb24gaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGZvcm1hdCA9IFN0cmljdFZlcnNpb24KCiAgICAgICAgaWYgZm9ybWF0IGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXF1ZXN0ZWRfdmVyc2lvbiA9IGZvcm1hdChyZXF1ZXN0ZWRfdmVyc2lvbikKICAgICAgICAgICAgaWYgYXR0cmlidXRlIGlzIE5vbmU6CiAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPSAnX192ZXJzaW9uX18nCgogICAgICAgIHNlbGYuX19kaWN0X18udXBkYXRlKGxvY2FscygpKQogICAgICAgIGRlbCBzZWxmLnNlbGYKCiAgICBkZWYgZnVsbF9uYW1lKHNlbGYpOgogICAgICAgICIiIlJldHVybiBmdWxsIHBhY2thZ2UvZGlzdHJpYnV0aW9uIG5hbWUsIHcvdmVyc2lvbiIiIgogICAgICAgIGlmIHNlbGYucmVxdWVzdGVkX3ZlcnNpb24gaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiAnJXMtJXMnICUgKHNlbGYubmFtZSwgc2VsZi5yZXF1ZXN0ZWRfdmVyc2lvbikKICAgICAgICByZXR1cm4gc2VsZi5uYW1lCgogICAgZGVmIHZlcnNpb25fb2soc2VsZiwgdmVyc2lvbik6CiAgICAgICAgIiIiSXMgJ3ZlcnNpb24nIHN1ZmZpY2llbnRseSB1cC10by1kYXRlPyIiIgogICAgICAgIHJldHVybiBzZWxmLmF0dHJpYnV0ZSBpcyBOb25lIG9yIHNlbGYuZm9ybWF0IGlzIE5vbmUgb3IgXAogICAgICAgICAgICBzdHIodmVyc2lvbikgIT0gInVua25vd24iIGFuZCB2ZXJzaW9uID49IHNlbGYucmVxdWVzdGVkX3ZlcnNpb24KCiAgICBkZWYgZ2V0X3ZlcnNpb24oc2VsZiwgcGF0aHM9Tm9uZSwgZGVmYXVsdD0idW5rbm93biIpOgogICAgICAgICIiIkdldCB2ZXJzaW9uIG51bWJlciBvZiBpbnN0YWxsZWQgbW9kdWxlLCAnTm9uZScsIG9yICdkZWZhdWx0JwoKICAgICAgICBTZWFyY2ggJ3BhdGhzJyBmb3IgbW9kdWxlLiAgSWYgbm90IGZvdW5kLCByZXR1cm4gJ05vbmUnLiAgSWYgZm91bmQsCiAgICAgICAgcmV0dXJuIHRoZSBleHRyYWN0ZWQgdmVyc2lvbiBhdHRyaWJ1dGUsIG9yICdkZWZhdWx0JyBpZiBubyB2ZXJzaW9uCiAgICAgICAgYXR0cmlidXRlIHdhcyBzcGVjaWZpZWQsIG9yIHRoZSB2YWx1ZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCB3aXRob3V0CiAgICAgICAgaW1wb3J0aW5nIHRoZSBtb2R1bGUuICBUaGUgdmVyc2lvbiBpcyBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIHRoZQogICAgICAgIHJlcXVpcmVtZW50J3MgdmVyc2lvbiBmb3JtYXQgKGlmIGFueSksIHVubGVzcyBpdCBpcyAnTm9uZScgb3IgdGhlCiAgICAgICAgc3VwcGxpZWQgJ2RlZmF1bHQnLgogICAgICAgICIiIgoKICAgICAgICBpZiBzZWxmLmF0dHJpYnV0ZSBpcyBOb25lOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBmLCBwLCBpID0gZmluZF9tb2R1bGUoc2VsZi5tb2R1bGUsIHBhdGhzKQogICAgICAgICAgICAgICAgaWYgZjoKICAgICAgICAgICAgICAgICAgICBmLmNsb3NlKCkKICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0CiAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgIHYgPSBnZXRfbW9kdWxlX2NvbnN0YW50KHNlbGYubW9kdWxlLCBzZWxmLmF0dHJpYnV0ZSwgZGVmYXVsdCwgcGF0aHMpCgogICAgICAgIGlmIHYgaXMgbm90IE5vbmUgYW5kIHYgaXMgbm90IGRlZmF1bHQgYW5kIHNlbGYuZm9ybWF0IGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gc2VsZi5mb3JtYXQodikKCiAgICAgICAgcmV0dXJuIHYKCiAgICBkZWYgaXNfcHJlc2VudChzZWxmLCBwYXRocz1Ob25lKToKICAgICAgICAiIiJSZXR1cm4gdHJ1ZSBpZiBkZXBlbmRlbmN5IGlzIHByZXNlbnQgb24gJ3BhdGhzJyIiIgogICAgICAgIHJldHVybiBzZWxmLmdldF92ZXJzaW9uKHBhdGhzKSBpcyBub3QgTm9uZQoKICAgIGRlZiBpc19jdXJyZW50KHNlbGYsIHBhdGhzPU5vbmUpOgogICAgICAgICIiIlJldHVybiB0cnVlIGlmIGRlcGVuZGVuY3kgaXMgcHJlc2VudCBhbmQgdXAtdG8tZGF0ZSBvbiAncGF0aHMnIiIiCiAgICAgICAgdmVyc2lvbiA9IHNlbGYuZ2V0X3ZlcnNpb24ocGF0aHMpCiAgICAgICAgaWYgdmVyc2lvbiBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICByZXR1cm4gc2VsZi52ZXJzaW9uX29rKHZlcnNpb24pCgoKZGVmIGZpbmRfbW9kdWxlKG1vZHVsZSwgcGF0aHM9Tm9uZSk6CiAgICAiIiJKdXN0IGxpa2UgJ2ltcC5maW5kX21vZHVsZSgpJywgYnV0IHdpdGggcGFja2FnZSBzdXBwb3J0IiIiCgogICAgcGFydHMgPSBtb2R1bGUuc3BsaXQoJy4nKQoKICAgIHdoaWxlIHBhcnRzOgogICAgICAgIHBhcnQgPSBwYXJ0cy5wb3AoMCkKICAgICAgICBmLCBwYXRoLCAoc3VmZml4LCBtb2RlLCBraW5kKSA9IGluZm8gPSBpbXAuZmluZF9tb2R1bGUocGFydCwgcGF0aHMpCgogICAgICAgIGlmIGtpbmQgPT0gUEtHX0RJUkVDVE9SWToKICAgICAgICAgICAgcGFydHMgPSBwYXJ0cyBvciBbJ19faW5pdF9fJ10KICAgICAgICAgICAgcGF0aHMgPSBbcGF0aF0KCiAgICAgICAgZWxpZiBwYXJ0czoKICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoIkNhbid0IGZpbmQgJXIgaW4gJXMiICUgKHBhcnRzLCBtb2R1bGUpKQoKICAgIHJldHVybiBpbmZvCgoKZGVmIGdldF9tb2R1bGVfY29uc3RhbnQobW9kdWxlLCBzeW1ib2wsIGRlZmF1bHQ9LTEsIHBhdGhzPU5vbmUpOgogICAgIiIiRmluZCAnbW9kdWxlJyBieSBzZWFyY2hpbmcgJ3BhdGhzJywgYW5kIGV4dHJhY3QgJ3N5bWJvbCcKCiAgICBSZXR1cm4gJ05vbmUnIGlmICdtb2R1bGUnIGRvZXMgbm90IGV4aXN0IG9uICdwYXRocycsIG9yIGl0IGRvZXMgbm90IGRlZmluZQogICAgJ3N5bWJvbCcuICBJZiB0aGUgbW9kdWxlIGRlZmluZXMgJ3N5bWJvbCcgYXMgYSBjb25zdGFudCwgcmV0dXJuIHRoZQogICAgY29uc3RhbnQuICBPdGhlcndpc2UsIHJldHVybiAnZGVmYXVsdCcuIiIiCgogICAgdHJ5OgogICAgICAgIGYsIHBhdGgsIChzdWZmaXgsIG1vZGUsIGtpbmQpID0gZmluZF9tb2R1bGUobW9kdWxlLCBwYXRocykKICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAjIE1vZHVsZSBkb2Vzbid0IGV4aXN0CiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICB0cnk6CiAgICAgICAgaWYga2luZCA9PSBQWV9DT01QSUxFRDoKICAgICAgICAgICAgZi5yZWFkKDgpICAjIHNraXAgbWFnaWMgJiBkYXRlCiAgICAgICAgICAgIGNvZGUgPSBtYXJzaGFsLmxvYWQoZikKICAgICAgICBlbGlmIGtpbmQgPT0gUFlfRlJPWkVOOgogICAgICAgICAgICBjb2RlID0gaW1wLmdldF9mcm96ZW5fb2JqZWN0KG1vZHVsZSkKICAgICAgICBlbGlmIGtpbmQgPT0gUFlfU09VUkNFOgogICAgICAgICAgICBjb2RlID0gY29tcGlsZShmLnJlYWQoKSwgcGF0aCwgJ2V4ZWMnKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgTm90IHNvbWV0aGluZyB3ZSBjYW4gcGFyc2U7IHdlJ2xsIGhhdmUgdG8gaW1wb3J0IGl0LiAgOigKICAgICAgICAgICAgaWYgbW9kdWxlIG5vdCBpbiBzeXMubW9kdWxlczoKICAgICAgICAgICAgICAgIGltcC5sb2FkX21vZHVsZShtb2R1bGUsIGYsIHBhdGgsIChzdWZmaXgsIG1vZGUsIGtpbmQpKQogICAgICAgICAgICByZXR1cm4gZ2V0YXR0cihzeXMubW9kdWxlc1ttb2R1bGVdLCBzeW1ib2wsIE5vbmUpCgogICAgZmluYWxseToKICAgICAgICBpZiBmOgogICAgICAgICAgICBmLmNsb3NlKCkKCiAgICByZXR1cm4gZXh0cmFjdF9jb25zdGFudChjb2RlLCBzeW1ib2wsIGRlZmF1bHQpCgoKZGVmIGV4dHJhY3RfY29uc3RhbnQoY29kZSwgc3ltYm9sLCBkZWZhdWx0PS0xKToKICAgICIiIkV4dHJhY3QgdGhlIGNvbnN0YW50IHZhbHVlIG9mICdzeW1ib2wnIGZyb20gJ2NvZGUnCgogICAgSWYgdGhlIG5hbWUgJ3N5bWJvbCcgaXMgYm91bmQgdG8gYSBjb25zdGFudCB2YWx1ZSBieSB0aGUgUHl0aG9uIGNvZGUKICAgIG9iamVjdCAnY29kZScsIHJldHVybiB0aGF0IHZhbHVlLiAgSWYgJ3N5bWJvbCcgaXMgYm91bmQgdG8gYW4gZXhwcmVzc2lvbiwKICAgIHJldHVybiAnZGVmYXVsdCcuICBPdGhlcndpc2UsIHJldHVybiAnTm9uZScuCgogICAgUmV0dXJuIHZhbHVlIGlzIGJhc2VkIG9uIHRoZSBmaXJzdCBhc3NpZ25tZW50IHRvICdzeW1ib2wnLiAgJ3N5bWJvbCcgbXVzdAogICAgYmUgYSBnbG9iYWwsIG9yIGF0IGxlYXN0IGEgbm9uLSJmYXN0IiBsb2NhbCBpbiB0aGUgY29kZSBibG9jay4gIFRoYXQgaXMsCiAgICBvbmx5ICdTVE9SRV9OQU1FJyBhbmQgJ1NUT1JFX0dMT0JBTCcgb3Bjb2RlcyBhcmUgY2hlY2tlZCwgYW5kICdzeW1ib2wnCiAgICBtdXN0IGJlIHByZXNlbnQgaW4gJ2NvZGUuY29fbmFtZXMnLgogICAgIiIiCiAgICBpZiBzeW1ib2wgbm90IGluIGNvZGUuY29fbmFtZXM6CiAgICAgICAgIyBuYW1lJ3Mgbm90IHRoZXJlLCBjYW4ndCBwb3NzaWJseSBiZSBhbiBhc3NpZ25tZW50CiAgICAgICAgcmV0dXJuIE5vbmUKCiAgICBuYW1lX2lkeCA9IGxpc3QoY29kZS5jb19uYW1lcykuaW5kZXgoc3ltYm9sKQoKICAgIFNUT1JFX05BTUUgPSA5MAogICAgU1RPUkVfR0xPQkFMID0gOTcKICAgIExPQURfQ09OU1QgPSAxMDAKCiAgICBjb25zdCA9IGRlZmF1bHQKCiAgICBmb3IgYnl0ZV9jb2RlIGluIEJ5dGVjb2RlKGNvZGUpOgogICAgICAgIG9wID0gYnl0ZV9jb2RlLm9wY29kZQogICAgICAgIGFyZyA9IGJ5dGVfY29kZS5hcmcKCiAgICAgICAgaWYgb3AgPT0gTE9BRF9DT05TVDoKICAgICAgICAgICAgY29uc3QgPSBjb2RlLmNvX2NvbnN0c1thcmddCiAgICAgICAgZWxpZiBhcmcgPT0gbmFtZV9pZHggYW5kIChvcCA9PSBTVE9SRV9OQU1FIG9yIG9wID09IFNUT1JFX0dMT0JBTCk6CiAgICAgICAgICAgIHJldHVybiBjb25zdAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGNvbnN0ID0gZGVmYXVsdAoKCmRlZiBfdXBkYXRlX2dsb2JhbHMoKToKICAgICIiIgogICAgUGF0Y2ggdGhlIGdsb2JhbHMgdG8gcmVtb3ZlIHRoZSBvYmplY3RzIG5vdCBhdmFpbGFibGUgb24gc29tZSBwbGF0Zm9ybXMuCgogICAgWFhYIGl0J2QgYmUgYmV0dGVyIHRvIHRlc3QgYXNzZXJ0aW9ucyBhYm91dCBieXRlY29kZSBpbnN0ZWFkLgogICAgIiIiCgogICAgaWYgbm90IHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdqYXZhJykgYW5kIHN5cy5wbGF0Zm9ybSAhPSAnY2xpJzoKICAgICAgICByZXR1cm4KICAgIGluY29tcGF0aWJsZSA9ICdleHRyYWN0X2NvbnN0YW50JywgJ2dldF9tb2R1bGVfY29uc3RhbnQnCiAgICBmb3IgbmFtZSBpbiBpbmNvbXBhdGlibGU6CiAgICAgICAgZGVsIGdsb2JhbHMoKVtuYW1lXQogICAgICAgIF9fYWxsX18ucmVtb3ZlKG5hbWUpCgoKX3VwZGF0ZV9nbG9iYWxzKCkKUEsDBBQAAAAAAAAAIQAldIcFkJ0AAJCdAAAqAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9kaXN0LnB5X19hbGxfXyA9IFsnRGlzdHJpYnV0aW9uJ10KCmltcG9ydCByZQppbXBvcnQgb3MKaW1wb3J0IHdhcm5pbmdzCmltcG9ydCBudW1iZXJzCmltcG9ydCBkaXN0dXRpbHMubG9nCmltcG9ydCBkaXN0dXRpbHMuY29yZQppbXBvcnQgZGlzdHV0aWxzLmNtZAppbXBvcnQgZGlzdHV0aWxzLmRpc3QKaW1wb3J0IGl0ZXJ0b29scwpmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZWZhdWx0ZGljdApmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0ICgKICAgIERpc3R1dGlsc09wdGlvbkVycm9yLCBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yLCBEaXN0dXRpbHNTZXR1cEVycm9yLAopCmZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IHJmYzgyMl9lc2NhcGUKCmZyb20gc2V0dXB0b29scy5leHRlcm4gaW1wb3J0IHNpeApmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeC5tb3ZlcyBpbXBvcnQgbWFwLCBmaWx0ZXIsIGZpbHRlcmZhbHNlCmZyb20gcGtnX3Jlc291cmNlcy5leHRlcm4gaW1wb3J0IHBhY2thZ2luZwoKZnJvbSBzZXR1cHRvb2xzLmRlcGVuZHMgaW1wb3J0IFJlcXVpcmUKZnJvbSBzZXR1cHRvb2xzIGltcG9ydCB3aW5kb3dzX3N1cHBvcnQKZnJvbSBzZXR1cHRvb2xzLm1vbmtleSBpbXBvcnQgZ2V0X3VucGF0Y2hlZApmcm9tIHNldHVwdG9vbHMuY29uZmlnIGltcG9ydCBwYXJzZV9jb25maWd1cmF0aW9uCmltcG9ydCBwa2dfcmVzb3VyY2VzCmZyb20gLnB5MzZjb21wYXQgaW1wb3J0IERpc3RyaWJ1dGlvbl9wYXJzZV9jb25maWdfZmlsZXMKCl9faW1wb3J0X18oJ3BrZ19yZXNvdXJjZXMuZXh0ZXJuLnBhY2thZ2luZy5zcGVjaWZpZXJzJykKX19pbXBvcnRfXygncGtnX3Jlc291cmNlcy5leHRlcm4ucGFja2FnaW5nLnZlcnNpb24nKQoKCmRlZiBfZ2V0X3VucGF0Y2hlZChjbHMpOgogICAgd2FybmluZ3Mud2FybigiRG8gbm90IGNhbGwgdGhpcyBmdW5jdGlvbiIsIERlcHJlY2F0aW9uV2FybmluZykKICAgIHJldHVybiBnZXRfdW5wYXRjaGVkKGNscykKCgojIEJhc2VkIG9uIFB5dGhvbiAzLjUgdmVyc2lvbgpkZWYgd3JpdGVfcGtnX2ZpbGUoc2VsZiwgZmlsZSk6CiAgICAiIiJXcml0ZSB0aGUgUEtHLUlORk8gZm9ybWF0IGRhdGEgdG8gYSBmaWxlIG9iamVjdC4KICAgICIiIgogICAgdmVyc2lvbiA9ICcxLjAnCiAgICBpZiAoc2VsZi5wcm92aWRlcyBvciBzZWxmLnJlcXVpcmVzIG9yIHNlbGYub2Jzb2xldGVzIG9yCiAgICAgICAgICAgIHNlbGYuY2xhc3NpZmllcnMgb3Igc2VsZi5kb3dubG9hZF91cmwpOgogICAgICAgIHZlcnNpb24gPSAnMS4xJwogICAgIyBTZXR1cHRvb2xzIHNwZWNpZmljIGZvciBQRVAgMzQ1CiAgICBpZiBoYXNhdHRyKHNlbGYsICdweXRob25fcmVxdWlyZXMnKToKICAgICAgICB2ZXJzaW9uID0gJzEuMicKCiAgICBmaWxlLndyaXRlKCdNZXRhZGF0YS1WZXJzaW9uOiAlc1xuJyAlIHZlcnNpb24pCiAgICBmaWxlLndyaXRlKCdOYW1lOiAlc1xuJyAlIHNlbGYuZ2V0X25hbWUoKSkKICAgIGZpbGUud3JpdGUoJ1ZlcnNpb246ICVzXG4nICUgc2VsZi5nZXRfdmVyc2lvbigpKQogICAgZmlsZS53cml0ZSgnU3VtbWFyeTogJXNcbicgJSBzZWxmLmdldF9kZXNjcmlwdGlvbigpKQogICAgZmlsZS53cml0ZSgnSG9tZS1wYWdlOiAlc1xuJyAlIHNlbGYuZ2V0X3VybCgpKQogICAgZmlsZS53cml0ZSgnQXV0aG9yOiAlc1xuJyAlIHNlbGYuZ2V0X2NvbnRhY3QoKSkKICAgIGZpbGUud3JpdGUoJ0F1dGhvci1lbWFpbDogJXNcbicgJSBzZWxmLmdldF9jb250YWN0X2VtYWlsKCkpCiAgICBmaWxlLndyaXRlKCdMaWNlbnNlOiAlc1xuJyAlIHNlbGYuZ2V0X2xpY2Vuc2UoKSkKICAgIGlmIHNlbGYuZG93bmxvYWRfdXJsOgogICAgICAgIGZpbGUud3JpdGUoJ0Rvd25sb2FkLVVSTDogJXNcbicgJSBzZWxmLmRvd25sb2FkX3VybCkKCiAgICBsb25nX2Rlc2NfY29udGVudF90eXBlID0gZ2V0YXR0cigKICAgICAgICBzZWxmLAogICAgICAgICdsb25nX2Rlc2NyaXB0aW9uX2NvbnRlbnRfdHlwZScsCiAgICAgICAgTm9uZQogICAgKSBvciAnVU5LTk9XTicKICAgIGZpbGUud3JpdGUoJ0Rlc2NyaXB0aW9uLUNvbnRlbnQtVHlwZTogJXNcbicgJSBsb25nX2Rlc2NfY29udGVudF90eXBlKQoKICAgIGxvbmdfZGVzYyA9IHJmYzgyMl9lc2NhcGUoc2VsZi5nZXRfbG9uZ19kZXNjcmlwdGlvbigpKQogICAgZmlsZS53cml0ZSgnRGVzY3JpcHRpb246ICVzXG4nICUgbG9uZ19kZXNjKQoKICAgIGtleXdvcmRzID0gJywnLmpvaW4oc2VsZi5nZXRfa2V5d29yZHMoKSkKICAgIGlmIGtleXdvcmRzOgogICAgICAgIGZpbGUud3JpdGUoJ0tleXdvcmRzOiAlc1xuJyAlIGtleXdvcmRzKQoKICAgIHNlbGYuX3dyaXRlX2xpc3QoZmlsZSwgJ1BsYXRmb3JtJywgc2VsZi5nZXRfcGxhdGZvcm1zKCkpCiAgICBzZWxmLl93cml0ZV9saXN0KGZpbGUsICdDbGFzc2lmaWVyJywgc2VsZi5nZXRfY2xhc3NpZmllcnMoKSkKCiAgICAjIFBFUCAzMTQKICAgIHNlbGYuX3dyaXRlX2xpc3QoZmlsZSwgJ1JlcXVpcmVzJywgc2VsZi5nZXRfcmVxdWlyZXMoKSkKICAgIHNlbGYuX3dyaXRlX2xpc3QoZmlsZSwgJ1Byb3ZpZGVzJywgc2VsZi5nZXRfcHJvdmlkZXMoKSkKICAgIHNlbGYuX3dyaXRlX2xpc3QoZmlsZSwgJ09ic29sZXRlcycsIHNlbGYuZ2V0X29ic29sZXRlcygpKQoKICAgICMgU2V0dXB0b29scyBzcGVjaWZpYyBmb3IgUEVQIDM0NQogICAgaWYgaGFzYXR0cihzZWxmLCAncHl0aG9uX3JlcXVpcmVzJyk6CiAgICAgICAgZmlsZS53cml0ZSgnUmVxdWlyZXMtUHl0aG9uOiAlc1xuJyAlIHNlbGYucHl0aG9uX3JlcXVpcmVzKQoKCiMgZnJvbSBQeXRob24gMy40CmRlZiB3cml0ZV9wa2dfaW5mbyhzZWxmLCBiYXNlX2Rpcik6CiAgICAiIiJXcml0ZSB0aGUgUEtHLUlORk8gZmlsZSBpbnRvIHRoZSByZWxlYXNlIHRyZWUuCiAgICAiIiIKICAgIHdpdGggb3Blbihvcy5wYXRoLmpvaW4oYmFzZV9kaXIsICdQS0ctSU5GTycpLCAndycsCiAgICAgICAgICAgICAgZW5jb2Rpbmc9J1VURi04JykgYXMgcGtnX2luZm86CiAgICAgICAgc2VsZi53cml0ZV9wa2dfZmlsZShwa2dfaW5mbykKCgpzZXF1ZW5jZSA9IHR1cGxlLCBsaXN0CgoKZGVmIGNoZWNrX2ltcG9ydGFibGUoZGlzdCwgYXR0ciwgdmFsdWUpOgogICAgdHJ5OgogICAgICAgIGVwID0gcGtnX3Jlc291cmNlcy5FbnRyeVBvaW50LnBhcnNlKCd4PScgKyB2YWx1ZSkKICAgICAgICBhc3NlcnQgbm90IGVwLmV4dHJhcwogICAgZXhjZXB0IChUeXBlRXJyb3IsIFZhbHVlRXJyb3IsIEF0dHJpYnV0ZUVycm9yLCBBc3NlcnRpb25FcnJvcik6CiAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKICAgICAgICAgICAgIiVyIG11c3QgYmUgaW1wb3J0YWJsZSAnbW9kdWxlOmF0dHJzJyBzdHJpbmcgKGdvdCAlcikiCiAgICAgICAgICAgICUgKGF0dHIsIHZhbHVlKQogICAgICAgICkKCgpkZWYgYXNzZXJ0X3N0cmluZ19saXN0KGRpc3QsIGF0dHIsIHZhbHVlKToKICAgICIiIlZlcmlmeSB0aGF0IHZhbHVlIGlzIGEgc3RyaW5nIGxpc3Qgb3IgTm9uZSIiIgogICAgdHJ5OgogICAgICAgIGFzc2VydCAnJy5qb2luKHZhbHVlKSAhPSB2YWx1ZQogICAgZXhjZXB0IChUeXBlRXJyb3IsIFZhbHVlRXJyb3IsIEF0dHJpYnV0ZUVycm9yLCBBc3NlcnRpb25FcnJvcik6CiAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKICAgICAgICAgICAgIiVyIG11c3QgYmUgYSBsaXN0IG9mIHN0cmluZ3MgKGdvdCAlcikiICUgKGF0dHIsIHZhbHVlKQogICAgICAgICkKCgpkZWYgY2hlY2tfbnNwKGRpc3QsIGF0dHIsIHZhbHVlKToKICAgICIiIlZlcmlmeSB0aGF0IG5hbWVzcGFjZSBwYWNrYWdlcyBhcmUgdmFsaWQiIiIKICAgIG5zX3BhY2thZ2VzID0gdmFsdWUKICAgIGFzc2VydF9zdHJpbmdfbGlzdChkaXN0LCBhdHRyLCBuc19wYWNrYWdlcykKICAgIGZvciBuc3AgaW4gbnNfcGFja2FnZXM6CiAgICAgICAgaWYgbm90IGRpc3QuaGFzX2NvbnRlbnRzX2Zvcihuc3ApOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgICAgICAgICAgIkRpc3RyaWJ1dGlvbiBjb250YWlucyBubyBtb2R1bGVzIG9yIHBhY2thZ2VzIGZvciAiICsKICAgICAgICAgICAgICAgICJuYW1lc3BhY2UgcGFja2FnZSAlciIgJSBuc3AKICAgICAgICAgICAgKQogICAgICAgIHBhcmVudCwgc2VwLCBjaGlsZCA9IG5zcC5ycGFydGl0aW9uKCcuJykKICAgICAgICBpZiBwYXJlbnQgYW5kIHBhcmVudCBub3QgaW4gbnNfcGFja2FnZXM6CiAgICAgICAgICAgIGRpc3R1dGlscy5sb2cud2FybigKICAgICAgICAgICAgICAgICJXQVJOSU5HOiAlciBpcyBkZWNsYXJlZCBhcyBhIHBhY2thZ2UgbmFtZXNwYWNlLCBidXQgJXIiCiAgICAgICAgICAgICAgICAiIGlzIG5vdDogcGxlYXNlIGNvcnJlY3QgdGhpcyBpbiBzZXR1cC5weSIsIG5zcCwgcGFyZW50CiAgICAgICAgICAgICkKCgpkZWYgY2hlY2tfZXh0cmFzKGRpc3QsIGF0dHIsIHZhbHVlKToKICAgICIiIlZlcmlmeSB0aGF0IGV4dHJhc19yZXF1aXJlIG1hcHBpbmcgaXMgdmFsaWQiIiIKICAgIHRyeToKICAgICAgICBsaXN0KGl0ZXJ0b29scy5zdGFybWFwKF9jaGVja19leHRyYSwgdmFsdWUuaXRlbXMoKSkpCiAgICBleGNlcHQgKFR5cGVFcnJvciwgVmFsdWVFcnJvciwgQXR0cmlidXRlRXJyb3IpOgogICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgICAgICInZXh0cmFzX3JlcXVpcmUnIG11c3QgYmUgYSBkaWN0aW9uYXJ5IHdob3NlIHZhbHVlcyBhcmUgIgogICAgICAgICAgICAic3RyaW5ncyBvciBsaXN0cyBvZiBzdHJpbmdzIGNvbnRhaW5pbmcgdmFsaWQgcHJvamVjdC92ZXJzaW9uICIKICAgICAgICAgICAgInJlcXVpcmVtZW50IHNwZWNpZmllcnMuIgogICAgICAgICkKCgpkZWYgX2NoZWNrX2V4dHJhKGV4dHJhLCByZXFzKToKICAgIG5hbWUsIHNlcCwgbWFya2VyID0gZXh0cmEucGFydGl0aW9uKCc6JykKICAgIGlmIG1hcmtlciBhbmQgcGtnX3Jlc291cmNlcy5pbnZhbGlkX21hcmtlcihtYXJrZXIpOgogICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoIkludmFsaWQgZW52aXJvbm1lbnQgbWFya2VyOiAiICsgbWFya2VyKQogICAgbGlzdChwa2dfcmVzb3VyY2VzLnBhcnNlX3JlcXVpcmVtZW50cyhyZXFzKSkKCgpkZWYgYXNzZXJ0X2Jvb2woZGlzdCwgYXR0ciwgdmFsdWUpOgogICAgIiIiVmVyaWZ5IHRoYXQgdmFsdWUgaXMgVHJ1ZSwgRmFsc2UsIDAsIG9yIDEiIiIKICAgIGlmIGJvb2wodmFsdWUpICE9IHZhbHVlOgogICAgICAgIHRtcGwgPSAie2F0dHIhcn0gbXVzdCBiZSBhIGJvb2xlYW4gdmFsdWUgKGdvdCB7dmFsdWUhcn0pIgogICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IodG1wbC5mb3JtYXQoYXR0cj1hdHRyLCB2YWx1ZT12YWx1ZSkpCgoKZGVmIGNoZWNrX3JlcXVpcmVtZW50cyhkaXN0LCBhdHRyLCB2YWx1ZSk6CiAgICAiIiJWZXJpZnkgdGhhdCBpbnN0YWxsX3JlcXVpcmVzIGlzIGEgdmFsaWQgcmVxdWlyZW1lbnRzIGxpc3QiIiIKICAgIHRyeToKICAgICAgICBsaXN0KHBrZ19yZXNvdXJjZXMucGFyc2VfcmVxdWlyZW1lbnRzKHZhbHVlKSkKICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCAoZGljdCwgc2V0KSk6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiVW5vcmRlcmVkIHR5cGVzIGFyZSBub3QgYWxsb3dlZCIpCiAgICBleGNlcHQgKFR5cGVFcnJvciwgVmFsdWVFcnJvcikgYXMgZXJyb3I6CiAgICAgICAgdG1wbCA9ICgKICAgICAgICAgICAgInthdHRyIXJ9IG11c3QgYmUgYSBzdHJpbmcgb3IgbGlzdCBvZiBzdHJpbmdzICIKICAgICAgICAgICAgImNvbnRhaW5pbmcgdmFsaWQgcHJvamVjdC92ZXJzaW9uIHJlcXVpcmVtZW50IHNwZWNpZmllcnM7IHtlcnJvcn0iCiAgICAgICAgKQogICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IodG1wbC5mb3JtYXQoYXR0cj1hdHRyLCBlcnJvcj1lcnJvcikpCgoKZGVmIGNoZWNrX3NwZWNpZmllcihkaXN0LCBhdHRyLCB2YWx1ZSk6CiAgICAiIiJWZXJpZnkgdGhhdCB2YWx1ZSBpcyBhIHZhbGlkIHZlcnNpb24gc3BlY2lmaWVyIiIiCiAgICB0cnk6CiAgICAgICAgcGFja2FnaW5nLnNwZWNpZmllcnMuU3BlY2lmaWVyU2V0KHZhbHVlKQogICAgZXhjZXB0IHBhY2thZ2luZy5zcGVjaWZpZXJzLkludmFsaWRTcGVjaWZpZXIgYXMgZXJyb3I6CiAgICAgICAgdG1wbCA9ICgKICAgICAgICAgICAgInthdHRyIXJ9IG11c3QgYmUgYSBzdHJpbmcgIgogICAgICAgICAgICAiY29udGFpbmluZyB2YWxpZCB2ZXJzaW9uIHNwZWNpZmllcnM7IHtlcnJvcn0iCiAgICAgICAgKQogICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IodG1wbC5mb3JtYXQoYXR0cj1hdHRyLCBlcnJvcj1lcnJvcikpCgoKZGVmIGNoZWNrX2VudHJ5X3BvaW50cyhkaXN0LCBhdHRyLCB2YWx1ZSk6CiAgICAiIiJWZXJpZnkgdGhhdCBlbnRyeV9wb2ludHMgbWFwIGlzIHBhcnNlYWJsZSIiIgogICAgdHJ5OgogICAgICAgIHBrZ19yZXNvdXJjZXMuRW50cnlQb2ludC5wYXJzZV9tYXAodmFsdWUpCiAgICBleGNlcHQgVmFsdWVFcnJvciBhcyBlOgogICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoZSkKCgpkZWYgY2hlY2tfdGVzdF9zdWl0ZShkaXN0LCBhdHRyLCB2YWx1ZSk6CiAgICBpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZSwgc2l4LnN0cmluZ190eXBlcyk6CiAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigidGVzdF9zdWl0ZSBtdXN0IGJlIGEgc3RyaW5nIikKCgpkZWYgY2hlY2tfcGFja2FnZV9kYXRhKGRpc3QsIGF0dHIsIHZhbHVlKToKICAgICIiIlZlcmlmeSB0aGF0IHZhbHVlIGlzIGEgZGljdGlvbmFyeSBvZiBwYWNrYWdlIG5hbWVzIHRvIGdsb2IgbGlzdHMiIiIKICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIGRpY3QpOgogICAgICAgIGZvciBrLCB2IGluIHZhbHVlLml0ZW1zKCk6CiAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGssIHN0cik6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBpdGVyKHYpCiAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybgogICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKICAgICAgICBhdHRyICsgIiBtdXN0IGJlIGEgZGljdGlvbmFyeSBtYXBwaW5nIHBhY2thZ2UgbmFtZXMgdG8gbGlzdHMgb2YgIgogICAgICAgICJ3aWxkY2FyZCBwYXR0ZXJucyIKICAgICkKCgpkZWYgY2hlY2tfcGFja2FnZXMoZGlzdCwgYXR0ciwgdmFsdWUpOgogICAgZm9yIHBrZ25hbWUgaW4gdmFsdWU6CiAgICAgICAgaWYgbm90IHJlLm1hdGNoKHInXHcrKFwuXHcrKSonLCBwa2duYW1lKToKICAgICAgICAgICAgZGlzdHV0aWxzLmxvZy53YXJuKAogICAgICAgICAgICAgICAgIldBUk5JTkc6ICVyIG5vdCBhIHZhbGlkIHBhY2thZ2UgbmFtZTsgcGxlYXNlIHVzZSBvbmx5ICIKICAgICAgICAgICAgICAgICIuLXNlcGFyYXRlZCBwYWNrYWdlIG5hbWVzIGluIHNldHVwLnB5IiwgcGtnbmFtZQogICAgICAgICAgICApCgoKX0Rpc3RyaWJ1dGlvbiA9IGdldF91bnBhdGNoZWQoZGlzdHV0aWxzLmNvcmUuRGlzdHJpYnV0aW9uKQoKCmNsYXNzIERpc3RyaWJ1dGlvbihEaXN0cmlidXRpb25fcGFyc2VfY29uZmlnX2ZpbGVzLCBfRGlzdHJpYnV0aW9uKToKICAgICIiIkRpc3RyaWJ1dGlvbiB3aXRoIHN1cHBvcnQgZm9yIGZlYXR1cmVzLCB0ZXN0cywgYW5kIHBhY2thZ2UgZGF0YQoKICAgIFRoaXMgaXMgYW4gZW5oYW5jZWQgdmVyc2lvbiBvZiAnZGlzdHV0aWxzLmRpc3QuRGlzdHJpYnV0aW9uJyB0aGF0CiAgICBlZmZlY3RpdmVseSBhZGRzIHRoZSBmb2xsb3dpbmcgbmV3IG9wdGlvbmFsIGtleXdvcmQgYXJndW1lbnRzIHRvICdzZXR1cCgpJzoKCiAgICAgJ2luc3RhbGxfcmVxdWlyZXMnIC0tIGEgc3RyaW5nIG9yIHNlcXVlbmNlIG9mIHN0cmluZ3Mgc3BlY2lmeWluZyBwcm9qZWN0CiAgICAgICAgdmVyc2lvbnMgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIHJlcXVpcmVzIHdoZW4gaW5zdGFsbGVkLCBpbiB0aGUgZm9ybWF0CiAgICAgICAgdXNlZCBieSAncGtnX3Jlc291cmNlcy5yZXF1aXJlKCknLiAgVGhleSB3aWxsIGJlIGluc3RhbGxlZAogICAgICAgIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgcGFja2FnZSBpcyBpbnN0YWxsZWQuICBJZiB5b3Ugd2lzaCB0byB1c2UKICAgICAgICBwYWNrYWdlcyB0aGF0IGFyZSBub3QgYXZhaWxhYmxlIGluIFB5UEksIG9yIHdhbnQgdG8gZ2l2ZSB5b3VyIHVzZXJzIGFuCiAgICAgICAgYWx0ZXJuYXRlIGRvd25sb2FkIGxvY2F0aW9uLCB5b3UgY2FuIGFkZCBhICdmaW5kX2xpbmtzJyBvcHRpb24gdG8gdGhlCiAgICAgICAgJ1tlYXN5X2luc3RhbGxdJyBzZWN0aW9uIG9mIHlvdXIgcHJvamVjdCdzICdzZXR1cC5jZmcnIGZpbGUsIGFuZCB0aGVuCiAgICAgICAgc2V0dXB0b29scyB3aWxsIHNjYW4gdGhlIGxpc3RlZCB3ZWIgcGFnZXMgZm9yIGxpbmtzIHRoYXQgc2F0aXNmeSB0aGUKICAgICAgICByZXF1aXJlbWVudHMuCgogICAgICdleHRyYXNfcmVxdWlyZScgLS0gYSBkaWN0aW9uYXJ5IG1hcHBpbmcgbmFtZXMgb2Ygb3B0aW9uYWwgImV4dHJhcyIgdG8gdGhlCiAgICAgICAgYWRkaXRpb25hbCByZXF1aXJlbWVudChzKSB0aGF0IHVzaW5nIHRob3NlIGV4dHJhcyBpbmN1cnMuIEZvciBleGFtcGxlLAogICAgICAgIHRoaXM6OgoKICAgICAgICAgICAgZXh0cmFzX3JlcXVpcmUgPSBkaWN0KHJlU1QgPSBbImRvY3V0aWxzPj0wLjMiLCAicmVTVGVkaXQiXSkKCiAgICAgICAgaW5kaWNhdGVzIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiBjYW4gb3B0aW9uYWxseSBwcm92aWRlIGFuIGV4dHJhCiAgICAgICAgY2FwYWJpbGl0eSBjYWxsZWQgInJlU1QiLCBidXQgaXQgY2FuIG9ubHkgYmUgdXNlZCBpZiBkb2N1dGlscyBhbmQKICAgICAgICByZVNUZWRpdCBhcmUgaW5zdGFsbGVkLiAgSWYgdGhlIHVzZXIgaW5zdGFsbHMgeW91ciBwYWNrYWdlIHVzaW5nCiAgICAgICAgRWFzeUluc3RhbGwgYW5kIHJlcXVlc3RzIG9uZSBvZiB5b3VyIGV4dHJhcywgdGhlIGNvcnJlc3BvbmRpbmcKICAgICAgICBhZGRpdGlvbmFsIHJlcXVpcmVtZW50cyB3aWxsIGJlIGluc3RhbGxlZCBpZiBuZWVkZWQuCgogICAgICdmZWF0dXJlcycgKipkZXByZWNhdGVkKiogLS0gYSBkaWN0aW9uYXJ5IG1hcHBpbmcgb3B0aW9uIG5hbWVzIHRvCiAgICAgICAgJ3NldHVwdG9vbHMuRmVhdHVyZScKICAgICAgICBvYmplY3RzLiAgRmVhdHVyZXMgYXJlIGEgcG9ydGlvbiBvZiB0aGUgZGlzdHJpYnV0aW9uIHRoYXQgY2FuIGJlCiAgICAgICAgaW5jbHVkZWQgb3IgZXhjbHVkZWQgYmFzZWQgb24gdXNlciBvcHRpb25zLCBpbnRlci1mZWF0dXJlIGRlcGVuZGVuY2llcywKICAgICAgICBhbmQgYXZhaWxhYmlsaXR5IG9uIHRoZSBjdXJyZW50IHN5c3RlbS4gIEV4Y2x1ZGVkIGZlYXR1cmVzIGFyZSBvbWl0dGVkCiAgICAgICAgZnJvbSBhbGwgc2V0dXAgY29tbWFuZHMsIGluY2x1ZGluZyBzb3VyY2UgYW5kIGJpbmFyeSBkaXN0cmlidXRpb25zLCBzbwogICAgICAgIHlvdSBjYW4gY3JlYXRlIG11bHRpcGxlIGRpc3RyaWJ1dGlvbnMgZnJvbSB0aGUgc2FtZSBzb3VyY2UgdHJlZS4KICAgICAgICBGZWF0dXJlIG5hbWVzIHNob3VsZCBiZSB2YWxpZCBQeXRob24gaWRlbnRpZmllcnMsIGV4Y2VwdCB0aGF0IHRoZXkgbWF5CiAgICAgICAgY29udGFpbiB0aGUgJy0nIChtaW51cykgc2lnbi4gIEZlYXR1cmVzIGNhbiBiZSBpbmNsdWRlZCBvciBleGNsdWRlZAogICAgICAgIHZpYSB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMgJy0td2l0aC1YJyBhbmQgJy0td2l0aG91dC1YJywgd2hlcmUgJ1gnIGlzCiAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGZlYXR1cmUuICBXaGV0aGVyIGEgZmVhdHVyZSBpcyBpbmNsdWRlZCBieSBkZWZhdWx0LCBhbmQKICAgICAgICB3aGV0aGVyIHlvdSBhcmUgYWxsb3dlZCB0byBjb250cm9sIHRoaXMgZnJvbSB0aGUgY29tbWFuZCBsaW5lLCBpcwogICAgICAgIGRldGVybWluZWQgYnkgdGhlIEZlYXR1cmUgb2JqZWN0LiAgU2VlIHRoZSAnRmVhdHVyZScgY2xhc3MgZm9yIG1vcmUKICAgICAgICBpbmZvcm1hdGlvbi4KCiAgICAgJ3Rlc3Rfc3VpdGUnIC0tIHRoZSBuYW1lIG9mIGEgdGVzdCBzdWl0ZSB0byBydW4gZm9yIHRoZSAndGVzdCcgY29tbWFuZC4KICAgICAgICBJZiB0aGUgdXNlciBydW5zICdweXRob24gc2V0dXAucHkgdGVzdCcsIHRoZSBwYWNrYWdlIHdpbGwgYmUgaW5zdGFsbGVkLAogICAgICAgIGFuZCB0aGUgbmFtZWQgdGVzdCBzdWl0ZSB3aWxsIGJlIHJ1bi4gIFRoZSBmb3JtYXQgaXMgdGhlIHNhbWUgYXMKICAgICAgICB3b3VsZCBiZSB1c2VkIG9uIGEgJ3VuaXR0ZXN0LnB5JyBjb21tYW5kIGxpbmUuICBUaGF0IGlzLCBpdCBpcyB0aGUKICAgICAgICBkb3R0ZWQgbmFtZSBvZiBhbiBvYmplY3QgdG8gaW1wb3J0IGFuZCBjYWxsIHRvIGdlbmVyYXRlIGEgdGVzdCBzdWl0ZS4KCiAgICAgJ3BhY2thZ2VfZGF0YScgLS0gYSBkaWN0aW9uYXJ5IG1hcHBpbmcgcGFja2FnZSBuYW1lcyB0byBsaXN0cyBvZiBmaWxlbmFtZXMKICAgICAgICBvciBnbG9icyB0byB1c2UgdG8gZmluZCBkYXRhIGZpbGVzIGNvbnRhaW5lZCBpbiB0aGUgbmFtZWQgcGFja2FnZXMuCiAgICAgICAgSWYgdGhlIGRpY3Rpb25hcnkgaGFzIGZpbGVuYW1lcyBvciBnbG9icyBsaXN0ZWQgdW5kZXIgJyIiJyAodGhlIGVtcHR5CiAgICAgICAgc3RyaW5nKSwgdGhvc2UgbmFtZXMgd2lsbCBiZSBzZWFyY2hlZCBmb3IgaW4gZXZlcnkgcGFja2FnZSwgaW4gYWRkaXRpb24KICAgICAgICB0byBhbnkgbmFtZXMgZm9yIHRoZSBzcGVjaWZpYyBwYWNrYWdlLiAgRGF0YSBmaWxlcyBmb3VuZCB1c2luZyB0aGVzZQogICAgICAgIG5hbWVzL2dsb2JzIHdpbGwgYmUgaW5zdGFsbGVkIGFsb25nIHdpdGggdGhlIHBhY2thZ2UsIGluIHRoZSBzYW1lCiAgICAgICAgbG9jYXRpb24gYXMgdGhlIHBhY2thZ2UuICBOb3RlIHRoYXQgZ2xvYnMgYXJlIGFsbG93ZWQgdG8gcmVmZXJlbmNlCiAgICAgICAgdGhlIGNvbnRlbnRzIG9mIG5vbi1wYWNrYWdlIHN1YmRpcmVjdG9yaWVzLCBhcyBsb25nIGFzIHlvdSB1c2UgJy8nIGFzCiAgICAgICAgYSBwYXRoIHNlcGFyYXRvci4gIChHbG9icyBhcmUgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8KICAgICAgICBwbGF0Zm9ybS1zcGVjaWZpYyBwYXRocyBhdCBydW50aW1lLikKCiAgICBJbiBhZGRpdGlvbiB0byB0aGVzZSBuZXcga2V5d29yZHMsIHRoaXMgY2xhc3MgYWxzbyBoYXMgc2V2ZXJhbCBuZXcgbWV0aG9kcwogICAgZm9yIG1hbmlwdWxhdGluZyB0aGUgZGlzdHJpYnV0aW9uJ3MgY29udGVudHMuICBGb3IgZXhhbXBsZSwgdGhlICdpbmNsdWRlKCknCiAgICBhbmQgJ2V4Y2x1ZGUoKScgbWV0aG9kcyBjYW4gYmUgdGhvdWdodCBvZiBhcyBpbi1wbGFjZSBhZGQgYW5kIHN1YnRyYWN0CiAgICBjb21tYW5kcyB0aGF0IGFkZCBvciByZW1vdmUgcGFja2FnZXMsIG1vZHVsZXMsIGV4dGVuc2lvbnMsIGFuZCBzbyBvbiBmcm9tCiAgICB0aGUgZGlzdHJpYnV0aW9uLiAgVGhleSBhcmUgdXNlZCBieSB0aGUgZmVhdHVyZSBzdWJzeXN0ZW0gdG8gY29uZmlndXJlIHRoZQogICAgZGlzdHJpYnV0aW9uIGZvciB0aGUgaW5jbHVkZWQgYW5kIGV4Y2x1ZGVkIGZlYXR1cmVzLgogICAgIiIiCgogICAgX3BhdGNoZWRfZGlzdCA9IE5vbmUKCiAgICBkZWYgcGF0Y2hfbWlzc2luZ19wa2dfaW5mbyhzZWxmLCBhdHRycyk6CiAgICAgICAgIyBGYWtlIHVwIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBkYXRhIHRoYXQgd291bGQgbm9ybWFsbHkgY29tZSBmcm9tCiAgICAgICAgIyBQS0ctSU5GTywgYnV0IHdoaWNoIG1pZ2h0IG5vdCB5ZXQgYmUgYnVpbHQgaWYgdGhpcyBpcyBhIGZyZXNoCiAgICAgICAgIyBjaGVja291dC4KICAgICAgICAjCiAgICAgICAgaWYgbm90IGF0dHJzIG9yICduYW1lJyBub3QgaW4gYXR0cnMgb3IgJ3ZlcnNpb24nIG5vdCBpbiBhdHRyczoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAga2V5ID0gcGtnX3Jlc291cmNlcy5zYWZlX25hbWUoc3RyKGF0dHJzWyduYW1lJ10pKS5sb3dlcigpCiAgICAgICAgZGlzdCA9IHBrZ19yZXNvdXJjZXMud29ya2luZ19zZXQuYnlfa2V5LmdldChrZXkpCiAgICAgICAgaWYgZGlzdCBpcyBub3QgTm9uZSBhbmQgbm90IGRpc3QuaGFzX21ldGFkYXRhKCdQS0ctSU5GTycpOgogICAgICAgICAgICBkaXN0Ll92ZXJzaW9uID0gcGtnX3Jlc291cmNlcy5zYWZlX3ZlcnNpb24oc3RyKGF0dHJzWyd2ZXJzaW9uJ10pKQogICAgICAgICAgICBzZWxmLl9wYXRjaGVkX2Rpc3QgPSBkaXN0CgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGF0dHJzPU5vbmUpOgogICAgICAgIGhhdmVfcGFja2FnZV9kYXRhID0gaGFzYXR0cihzZWxmLCAicGFja2FnZV9kYXRhIikKICAgICAgICBpZiBub3QgaGF2ZV9wYWNrYWdlX2RhdGE6CiAgICAgICAgICAgIHNlbGYucGFja2FnZV9kYXRhID0ge30KICAgICAgICBhdHRycyA9IGF0dHJzIG9yIHt9CiAgICAgICAgaWYgJ2ZlYXR1cmVzJyBpbiBhdHRycyBvciAncmVxdWlyZV9mZWF0dXJlcycgaW4gYXR0cnM6CiAgICAgICAgICAgIEZlYXR1cmUud2Fybl9kZXByZWNhdGVkKCkKICAgICAgICBzZWxmLnJlcXVpcmVfZmVhdHVyZXMgPSBbXQogICAgICAgIHNlbGYuZmVhdHVyZXMgPSB7fQogICAgICAgIHNlbGYuZGlzdF9maWxlcyA9IFtdCiAgICAgICAgc2VsZi5zcmNfcm9vdCA9IGF0dHJzLnBvcCgic3JjX3Jvb3QiLCBOb25lKQogICAgICAgIHNlbGYucGF0Y2hfbWlzc2luZ19wa2dfaW5mbyhhdHRycykKICAgICAgICBzZWxmLmxvbmdfZGVzY3JpcHRpb25fY29udGVudF90eXBlID0gYXR0cnMuZ2V0KAogICAgICAgICAgICAnbG9uZ19kZXNjcmlwdGlvbl9jb250ZW50X3R5cGUnCiAgICAgICAgKQogICAgICAgIHNlbGYuZGVwZW5kZW5jeV9saW5rcyA9IGF0dHJzLnBvcCgnZGVwZW5kZW5jeV9saW5rcycsIFtdKQogICAgICAgIHNlbGYuc2V0dXBfcmVxdWlyZXMgPSBhdHRycy5wb3AoJ3NldHVwX3JlcXVpcmVzJywgW10pCiAgICAgICAgZm9yIGVwIGluIHBrZ19yZXNvdXJjZXMuaXRlcl9lbnRyeV9wb2ludHMoJ2Rpc3R1dGlscy5zZXR1cF9rZXl3b3JkcycpOgogICAgICAgICAgICB2YXJzKHNlbGYpLnNldGRlZmF1bHQoZXAubmFtZSwgTm9uZSkKICAgICAgICBfRGlzdHJpYnV0aW9uLl9faW5pdF9fKHNlbGYsIGF0dHJzKQogICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5tZXRhZGF0YS52ZXJzaW9uLCBudW1iZXJzLk51bWJlcik6CiAgICAgICAgICAgICMgU29tZSBwZW9wbGUgYXBwYXJlbnRseSB0YWtlICJ2ZXJzaW9uIG51bWJlciIgdG9vIGxpdGVyYWxseSA6KQogICAgICAgICAgICBzZWxmLm1ldGFkYXRhLnZlcnNpb24gPSBzdHIoc2VsZi5tZXRhZGF0YS52ZXJzaW9uKQoKICAgICAgICBpZiBzZWxmLm1ldGFkYXRhLnZlcnNpb24gaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHZlciA9IHBhY2thZ2luZy52ZXJzaW9uLlZlcnNpb24oc2VsZi5tZXRhZGF0YS52ZXJzaW9uKQogICAgICAgICAgICAgICAgbm9ybWFsaXplZF92ZXJzaW9uID0gc3RyKHZlcikKICAgICAgICAgICAgICAgIGlmIHNlbGYubWV0YWRhdGEudmVyc2lvbiAhPSBub3JtYWxpemVkX3ZlcnNpb246CiAgICAgICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigKICAgICAgICAgICAgICAgICAgICAgICAgIk5vcm1hbGl6aW5nICclcycgdG8gJyVzJyIgJSAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm1ldGFkYXRhLnZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkX3ZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgc2VsZi5tZXRhZGF0YS52ZXJzaW9uID0gbm9ybWFsaXplZF92ZXJzaW9uCiAgICAgICAgICAgIGV4Y2VwdCAocGFja2FnaW5nLnZlcnNpb24uSW52YWxpZFZlcnNpb24sIFR5cGVFcnJvcik6CiAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKAogICAgICAgICAgICAgICAgICAgICJUaGUgdmVyc2lvbiBzcGVjaWZpZWQgKCVyKSBpcyBhbiBpbnZhbGlkIHZlcnNpb24sIHRoaXMgIgogICAgICAgICAgICAgICAgICAgICJtYXkgbm90IHdvcmsgYXMgZXhwZWN0ZWQgd2l0aCBuZXdlciB2ZXJzaW9ucyBvZiAiCiAgICAgICAgICAgICAgICAgICAgInNldHVwdG9vbHMsIHBpcCwgYW5kIFB5UEkuIFBsZWFzZSBzZWUgUEVQIDQ0MCBmb3IgbW9yZSAiCiAgICAgICAgICAgICAgICAgICAgImRldGFpbHMuIiAlIHNlbGYubWV0YWRhdGEudmVyc2lvbgogICAgICAgICAgICAgICAgKQogICAgICAgIHNlbGYuX2ZpbmFsaXplX3JlcXVpcmVzKCkKCiAgICBkZWYgX2ZpbmFsaXplX3JlcXVpcmVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFNldCBgbWV0YWRhdGEucHl0aG9uX3JlcXVpcmVzYCBhbmQgZml4IGVudmlyb25tZW50IG1hcmtlcnMKICAgICAgICBpbiBgaW5zdGFsbF9yZXF1aXJlc2AgYW5kIGBleHRyYXNfcmVxdWlyZWAuCiAgICAgICAgIiIiCiAgICAgICAgaWYgZ2V0YXR0cihzZWxmLCAncHl0aG9uX3JlcXVpcmVzJywgTm9uZSk6CiAgICAgICAgICAgIHNlbGYubWV0YWRhdGEucHl0aG9uX3JlcXVpcmVzID0gc2VsZi5weXRob25fcmVxdWlyZXMKICAgICAgICBzZWxmLl9jb252ZXJ0X2V4dHJhc19yZXF1aXJlbWVudHMoKQogICAgICAgIHNlbGYuX21vdmVfaW5zdGFsbF9yZXF1aXJlbWVudHNfbWFya2VycygpCgogICAgZGVmIF9jb252ZXJ0X2V4dHJhc19yZXF1aXJlbWVudHMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgQ29udmVydCByZXF1aXJlbWVudHMgaW4gYGV4dHJhc19yZXF1aXJlYCBvZiB0aGUgZm9ybQogICAgICAgIGAiZXh0cmEiOiBbImJhcmJhenF1dXg7IHttYXJrZXJ9Il1gIHRvCiAgICAgICAgYCJleHRyYTp7bWFya2VyfSI6IFsiYmFyYmF6cXV1eCJdYC4KICAgICAgICAiIiIKICAgICAgICBzcGVjX2V4dF9yZXFzID0gZ2V0YXR0cihzZWxmLCAnZXh0cmFzX3JlcXVpcmUnLCBOb25lKSBvciB7fQogICAgICAgIHNlbGYuX3RtcF9leHRyYXNfcmVxdWlyZSA9IGRlZmF1bHRkaWN0KGxpc3QpCiAgICAgICAgZm9yIHNlY3Rpb24sIHYgaW4gc3BlY19leHRfcmVxcy5pdGVtcygpOgogICAgICAgICAgICAjIERvIG5vdCBzdHJpcCBlbXB0eSBzZWN0aW9ucy4KICAgICAgICAgICAgc2VsZi5fdG1wX2V4dHJhc19yZXF1aXJlW3NlY3Rpb25dCiAgICAgICAgICAgIGZvciByIGluIHBrZ19yZXNvdXJjZXMucGFyc2VfcmVxdWlyZW1lbnRzKHYpOgogICAgICAgICAgICAgICAgc3VmZml4ID0gc2VsZi5fc3VmZml4X2ZvcihyKQogICAgICAgICAgICAgICAgc2VsZi5fdG1wX2V4dHJhc19yZXF1aXJlW3NlY3Rpb24gKyBzdWZmaXhdLmFwcGVuZChyKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBfc3VmZml4X2ZvcihyZXEpOgogICAgICAgICIiIgogICAgICAgIEZvciBhIHJlcXVpcmVtZW50LCByZXR1cm4gdGhlICdleHRyYXNfcmVxdWlyZScgc3VmZml4IGZvcgogICAgICAgIHRoYXQgcmVxdWlyZW1lbnQuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuICc6JyArIHN0cihyZXEubWFya2VyKSBpZiByZXEubWFya2VyIGVsc2UgJycKCiAgICBkZWYgX21vdmVfaW5zdGFsbF9yZXF1aXJlbWVudHNfbWFya2VycyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNb3ZlIHJlcXVpcmVtZW50cyBpbiBgaW5zdGFsbF9yZXF1aXJlc2AgdGhhdCBhcmUgdXNpbmcgZW52aXJvbm1lbnQKICAgICAgICBtYXJrZXJzIGBleHRyYXNfcmVxdWlyZWAuCiAgICAgICAgIiIiCgogICAgICAgICMgZGl2aWRlIHRoZSBpbnN0YWxsX3JlcXVpcmVzIGludG8gdHdvIHNldHMsIHNpbXBsZSBvbmVzIHN0aWxsCiAgICAgICAgIyBoYW5kbGVkIGJ5IGluc3RhbGxfcmVxdWlyZXMgYW5kIG1vcmUgY29tcGxleCBvbmVzIGhhbmRsZWQKICAgICAgICAjIGJ5IGV4dHJhc19yZXF1aXJlLgoKICAgICAgICBkZWYgaXNfc2ltcGxlX3JlcShyZXEpOgogICAgICAgICAgICByZXR1cm4gbm90IHJlcS5tYXJrZXIKCiAgICAgICAgc3BlY19pbnN0X3JlcXMgPSBnZXRhdHRyKHNlbGYsICdpbnN0YWxsX3JlcXVpcmVzJywgTm9uZSkgb3IgKCkKICAgICAgICBpbnN0X3JlcXMgPSBsaXN0KHBrZ19yZXNvdXJjZXMucGFyc2VfcmVxdWlyZW1lbnRzKHNwZWNfaW5zdF9yZXFzKSkKICAgICAgICBzaW1wbGVfcmVxcyA9IGZpbHRlcihpc19zaW1wbGVfcmVxLCBpbnN0X3JlcXMpCiAgICAgICAgY29tcGxleF9yZXFzID0gZmlsdGVyZmFsc2UoaXNfc2ltcGxlX3JlcSwgaW5zdF9yZXFzKQogICAgICAgIHNlbGYuaW5zdGFsbF9yZXF1aXJlcyA9IGxpc3QobWFwKHN0ciwgc2ltcGxlX3JlcXMpKQoKICAgICAgICBmb3IgciBpbiBjb21wbGV4X3JlcXM6CiAgICAgICAgICAgIHNlbGYuX3RtcF9leHRyYXNfcmVxdWlyZVsnOicgKyBzdHIoci5tYXJrZXIpXS5hcHBlbmQocikKICAgICAgICBzZWxmLmV4dHJhc19yZXF1aXJlID0gZGljdCgKICAgICAgICAgICAgKGssIFtzdHIocikgZm9yIHIgaW4gbWFwKHNlbGYuX2NsZWFuX3JlcSwgdildKQogICAgICAgICAgICBmb3IgaywgdiBpbiBzZWxmLl90bXBfZXh0cmFzX3JlcXVpcmUuaXRlbXMoKQogICAgICAgICkKCiAgICBkZWYgX2NsZWFuX3JlcShzZWxmLCByZXEpOgogICAgICAgICIiIgogICAgICAgIEdpdmVuIGEgUmVxdWlyZW1lbnQsIHJlbW92ZSBlbnZpcm9ubWVudCBtYXJrZXJzIGFuZCByZXR1cm4gaXQuCiAgICAgICAgIiIiCiAgICAgICAgcmVxLm1hcmtlciA9IE5vbmUKICAgICAgICByZXR1cm4gcmVxCgogICAgZGVmIHBhcnNlX2NvbmZpZ19maWxlcyhzZWxmLCBmaWxlbmFtZXM9Tm9uZSwgaWdub3JlX29wdGlvbl9lcnJvcnM9RmFsc2UpOgogICAgICAgICIiIlBhcnNlcyBjb25maWd1cmF0aW9uIGZpbGVzIGZyb20gdmFyaW91cyBsZXZlbHMKICAgICAgICBhbmQgbG9hZHMgY29uZmlndXJhdGlvbi4KCiAgICAgICAgIiIiCiAgICAgICAgX0Rpc3RyaWJ1dGlvbi5wYXJzZV9jb25maWdfZmlsZXMoc2VsZiwgZmlsZW5hbWVzPWZpbGVuYW1lcykKCiAgICAgICAgcGFyc2VfY29uZmlndXJhdGlvbihzZWxmLCBzZWxmLmNvbW1hbmRfb3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZV9vcHRpb25fZXJyb3JzPWlnbm9yZV9vcHRpb25fZXJyb3JzKQogICAgICAgIHNlbGYuX2ZpbmFsaXplX3JlcXVpcmVzKCkKCiAgICBkZWYgcGFyc2VfY29tbWFuZF9saW5lKHNlbGYpOgogICAgICAgICIiIlByb2Nlc3MgZmVhdHVyZXMgYWZ0ZXIgcGFyc2luZyBjb21tYW5kIGxpbmUgb3B0aW9ucyIiIgogICAgICAgIHJlc3VsdCA9IF9EaXN0cmlidXRpb24ucGFyc2VfY29tbWFuZF9saW5lKHNlbGYpCiAgICAgICAgaWYgc2VsZi5mZWF0dXJlczoKICAgICAgICAgICAgc2VsZi5fZmluYWxpemVfZmVhdHVyZXMoKQogICAgICAgIHJldHVybiByZXN1bHQKCiAgICBkZWYgX2ZlYXR1cmVfYXR0cm5hbWUoc2VsZiwgbmFtZSk6CiAgICAgICAgIiIiQ29udmVydCBmZWF0dXJlIG5hbWUgdG8gY29ycmVzcG9uZGluZyBvcHRpb24gYXR0cmlidXRlIG5hbWUiIiIKICAgICAgICByZXR1cm4gJ3dpdGhfJyArIG5hbWUucmVwbGFjZSgnLScsICdfJykKCiAgICBkZWYgZmV0Y2hfYnVpbGRfZWdncyhzZWxmLCByZXF1aXJlcyk6CiAgICAgICAgIiIiUmVzb2x2ZSBwcmUtc2V0dXAgcmVxdWlyZW1lbnRzIiIiCiAgICAgICAgcmVzb2x2ZWRfZGlzdHMgPSBwa2dfcmVzb3VyY2VzLndvcmtpbmdfc2V0LnJlc29sdmUoCiAgICAgICAgICAgIHBrZ19yZXNvdXJjZXMucGFyc2VfcmVxdWlyZW1lbnRzKHJlcXVpcmVzKSwKICAgICAgICAgICAgaW5zdGFsbGVyPXNlbGYuZmV0Y2hfYnVpbGRfZWdnLAogICAgICAgICAgICByZXBsYWNlX2NvbmZsaWN0aW5nPVRydWUsCiAgICAgICAgKQogICAgICAgIGZvciBkaXN0IGluIHJlc29sdmVkX2Rpc3RzOgogICAgICAgICAgICBwa2dfcmVzb3VyY2VzLndvcmtpbmdfc2V0LmFkZChkaXN0LCByZXBsYWNlPVRydWUpCiAgICAgICAgcmV0dXJuIHJlc29sdmVkX2Rpc3RzCgogICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgX0Rpc3RyaWJ1dGlvbi5maW5hbGl6ZV9vcHRpb25zKHNlbGYpCiAgICAgICAgaWYgc2VsZi5mZWF0dXJlczoKICAgICAgICAgICAgc2VsZi5fc2V0X2dsb2JhbF9vcHRzX2Zyb21fZmVhdHVyZXMoKQoKICAgICAgICBmb3IgZXAgaW4gcGtnX3Jlc291cmNlcy5pdGVyX2VudHJ5X3BvaW50cygnZGlzdHV0aWxzLnNldHVwX2tleXdvcmRzJyk6CiAgICAgICAgICAgIHZhbHVlID0gZ2V0YXR0cihzZWxmLCBlcC5uYW1lLCBOb25lKQogICAgICAgICAgICBpZiB2YWx1ZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIGVwLnJlcXVpcmUoaW5zdGFsbGVyPXNlbGYuZmV0Y2hfYnVpbGRfZWdnKQogICAgICAgICAgICAgICAgZXAubG9hZCgpKHNlbGYsIGVwLm5hbWUsIHZhbHVlKQogICAgICAgIGlmIGdldGF0dHIoc2VsZiwgJ2NvbnZlcnRfMnRvM19kb2N0ZXN0cycsIE5vbmUpOgogICAgICAgICAgICAjIFhYWCBtYXkgY29udmVydCB0byBzZXQgaGVyZSB3aGVuIHdlIGNhbiByZWx5IG9uIHNldCBiZWluZyBidWlsdGluCiAgICAgICAgICAgIHNlbGYuY29udmVydF8ydG8zX2RvY3Rlc3RzID0gWwogICAgICAgICAgICAgICAgb3MucGF0aC5hYnNwYXRoKHApCiAgICAgICAgICAgICAgICBmb3IgcCBpbiBzZWxmLmNvbnZlcnRfMnRvM19kb2N0ZXN0cwogICAgICAgICAgICBdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5jb252ZXJ0XzJ0bzNfZG9jdGVzdHMgPSBbXQoKICAgIGRlZiBnZXRfZWdnX2NhY2hlX2RpcihzZWxmKToKICAgICAgICBlZ2dfY2FjaGVfZGlyID0gb3MucGF0aC5qb2luKG9zLmN1cmRpciwgJy5lZ2dzJykKICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZWdnX2NhY2hlX2Rpcik6CiAgICAgICAgICAgIG9zLm1rZGlyKGVnZ19jYWNoZV9kaXIpCiAgICAgICAgICAgIHdpbmRvd3Nfc3VwcG9ydC5oaWRlX2ZpbGUoZWdnX2NhY2hlX2RpcikKICAgICAgICAgICAgcmVhZG1lX3R4dF9maWxlbmFtZSA9IG9zLnBhdGguam9pbihlZ2dfY2FjaGVfZGlyLCAnUkVBRE1FLnR4dCcpCiAgICAgICAgICAgIHdpdGggb3BlbihyZWFkbWVfdHh0X2ZpbGVuYW1lLCAndycpIGFzIGY6CiAgICAgICAgICAgICAgICBmLndyaXRlKCdUaGlzIGRpcmVjdG9yeSBjb250YWlucyBlZ2dzIHRoYXQgd2VyZSBkb3dubG9hZGVkICcKICAgICAgICAgICAgICAgICAgICAgICAgJ2J5IHNldHVwdG9vbHMgdG8gYnVpbGQsIHRlc3QsIGFuZCBydW4gcGx1Zy1pbnMuXG5cbicpCiAgICAgICAgICAgICAgICBmLndyaXRlKCdUaGlzIGRpcmVjdG9yeSBjYWNoZXMgdGhvc2UgZWdncyB0byBwcmV2ZW50ICcKICAgICAgICAgICAgICAgICAgICAgICAgJ3JlcGVhdGVkIGRvd25sb2Fkcy5cblxuJykKICAgICAgICAgICAgICAgIGYud3JpdGUoJ0hvd2V2ZXIsIGl0IGlzIHNhZmUgdG8gZGVsZXRlIHRoaXMgZGlyZWN0b3J5LlxuXG4nKQoKICAgICAgICByZXR1cm4gZWdnX2NhY2hlX2RpcgoKICAgIGRlZiBmZXRjaF9idWlsZF9lZ2coc2VsZiwgcmVxKToKICAgICAgICAiIiJGZXRjaCBhbiBlZ2cgbmVlZGVkIGZvciBidWlsZGluZyIiIgogICAgICAgIGZyb20gc2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbCBpbXBvcnQgZWFzeV9pbnN0YWxsCiAgICAgICAgZGlzdCA9IHNlbGYuX19jbGFzc19fKHsnc2NyaXB0X2FyZ3MnOiBbJ2Vhc3lfaW5zdGFsbCddfSkKICAgICAgICBvcHRzID0gZGlzdC5nZXRfb3B0aW9uX2RpY3QoJ2Vhc3lfaW5zdGFsbCcpCiAgICAgICAgb3B0cy5jbGVhcigpCiAgICAgICAgb3B0cy51cGRhdGUoCiAgICAgICAgICAgIChrLCB2KQogICAgICAgICAgICBmb3IgaywgdiBpbiBzZWxmLmdldF9vcHRpb25fZGljdCgnZWFzeV9pbnN0YWxsJykuaXRlbXMoKQogICAgICAgICAgICBpZiBrIGluICgKICAgICAgICAgICAgICAgICMgZG9uJ3QgdXNlIGFueSBvdGhlciBzZXR0aW5ncwogICAgICAgICAgICAgICAgJ2ZpbmRfbGlua3MnLCAnc2l0ZV9kaXJzJywgJ2luZGV4X3VybCcsCiAgICAgICAgICAgICAgICAnb3B0aW1pemUnLCAnc2l0ZV9kaXJzJywgJ2FsbG93X2hvc3RzJywKICAgICAgICApKQogICAgICAgIGlmIHNlbGYuZGVwZW5kZW5jeV9saW5rczoKICAgICAgICAgICAgbGlua3MgPSBzZWxmLmRlcGVuZGVuY3lfbGlua3NbOl0KICAgICAgICAgICAgaWYgJ2ZpbmRfbGlua3MnIGluIG9wdHM6CiAgICAgICAgICAgICAgICBsaW5rcyA9IG9wdHNbJ2ZpbmRfbGlua3MnXVsxXSArIGxpbmtzCiAgICAgICAgICAgIG9wdHNbJ2ZpbmRfbGlua3MnXSA9ICgnc2V0dXAnLCBsaW5rcykKICAgICAgICBpbnN0YWxsX2RpciA9IHNlbGYuZ2V0X2VnZ19jYWNoZV9kaXIoKQogICAgICAgIGNtZCA9IGVhc3lfaW5zdGFsbCgKICAgICAgICAgICAgZGlzdCwgYXJncz1bIngiXSwgaW5zdGFsbF9kaXI9aW5zdGFsbF9kaXIsCiAgICAgICAgICAgIGV4Y2x1ZGVfc2NyaXB0cz1UcnVlLAogICAgICAgICAgICBhbHdheXNfY29weT1GYWxzZSwgYnVpbGRfZGlyZWN0b3J5PU5vbmUsIGVkaXRhYmxlPUZhbHNlLAogICAgICAgICAgICB1cGdyYWRlPUZhbHNlLCBtdWx0aV92ZXJzaW9uPVRydWUsIG5vX3JlcG9ydD1UcnVlLCB1c2VyPUZhbHNlCiAgICAgICAgKQogICAgICAgIGNtZC5lbnN1cmVfZmluYWxpemVkKCkKICAgICAgICByZXR1cm4gY21kLmVhc3lfaW5zdGFsbChyZXEpCgogICAgZGVmIF9zZXRfZ2xvYmFsX29wdHNfZnJvbV9mZWF0dXJlcyhzZWxmKToKICAgICAgICAiIiJBZGQgLS13aXRoLVgvLS13aXRob3V0LVggb3B0aW9ucyBiYXNlZCBvbiBvcHRpb25hbCBmZWF0dXJlcyIiIgoKICAgICAgICBnbyA9IFtdCiAgICAgICAgbm8gPSBzZWxmLm5lZ2F0aXZlX29wdC5jb3B5KCkKCiAgICAgICAgZm9yIG5hbWUsIGZlYXR1cmUgaW4gc2VsZi5mZWF0dXJlcy5pdGVtcygpOgogICAgICAgICAgICBzZWxmLl9zZXRfZmVhdHVyZShuYW1lLCBOb25lKQogICAgICAgICAgICBmZWF0dXJlLnZhbGlkYXRlKHNlbGYpCgogICAgICAgICAgICBpZiBmZWF0dXJlLm9wdGlvbmFsOgogICAgICAgICAgICAgICAgZGVzY3IgPSBmZWF0dXJlLmRlc2NyaXB0aW9uCiAgICAgICAgICAgICAgICBpbmNkZWYgPSAnIChkZWZhdWx0KScKICAgICAgICAgICAgICAgIGV4Y2RlZiA9ICcnCiAgICAgICAgICAgICAgICBpZiBub3QgZmVhdHVyZS5pbmNsdWRlX2J5X2RlZmF1bHQoKToKICAgICAgICAgICAgICAgICAgICBleGNkZWYsIGluY2RlZiA9IGluY2RlZiwgZXhjZGVmCgogICAgICAgICAgICAgICAgbmV3ID0gKAogICAgICAgICAgICAgICAgICAgICgnd2l0aC0nICsgbmFtZSwgTm9uZSwgJ2luY2x1ZGUgJyArIGRlc2NyICsgaW5jZGVmKSwKICAgICAgICAgICAgICAgICAgICAoJ3dpdGhvdXQtJyArIG5hbWUsIE5vbmUsICdleGNsdWRlICcgKyBkZXNjciArIGV4Y2RlZiksCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBnby5leHRlbmQobmV3KQogICAgICAgICAgICAgICAgbm9bJ3dpdGhvdXQtJyArIG5hbWVdID0gJ3dpdGgtJyArIG5hbWUKCiAgICAgICAgc2VsZi5nbG9iYWxfb3B0aW9ucyA9IHNlbGYuZmVhdHVyZV9vcHRpb25zID0gZ28gKyBzZWxmLmdsb2JhbF9vcHRpb25zCiAgICAgICAgc2VsZi5uZWdhdGl2ZV9vcHQgPSBzZWxmLmZlYXR1cmVfbmVnb3B0ID0gbm8KCiAgICBkZWYgX2ZpbmFsaXplX2ZlYXR1cmVzKHNlbGYpOgogICAgICAgICIiIkFkZC9yZW1vdmUgZmVhdHVyZXMgYW5kIHJlc29sdmUgZGVwZW5kZW5jaWVzIGJldHdlZW4gdGhlbSIiIgoKICAgICAgICAjIEZpcnN0LCBmbGFnIGFsbCB0aGUgZW5hYmxlZCBpdGVtcyAoYW5kIHRodXMgdGhlaXIgZGVwZW5kZW5jaWVzKQogICAgICAgIGZvciBuYW1lLCBmZWF0dXJlIGluIHNlbGYuZmVhdHVyZXMuaXRlbXMoKToKICAgICAgICAgICAgZW5hYmxlZCA9IHNlbGYuZmVhdHVyZV9pc19pbmNsdWRlZChuYW1lKQogICAgICAgICAgICBpZiBlbmFibGVkIG9yIChlbmFibGVkIGlzIE5vbmUgYW5kIGZlYXR1cmUuaW5jbHVkZV9ieV9kZWZhdWx0KCkpOgogICAgICAgICAgICAgICAgZmVhdHVyZS5pbmNsdWRlX2luKHNlbGYpCiAgICAgICAgICAgICAgICBzZWxmLl9zZXRfZmVhdHVyZShuYW1lLCAxKQoKICAgICAgICAjIFRoZW4gZGlzYWJsZSB0aGUgcmVzdCwgc28gdGhhdCBvZmYtYnktZGVmYXVsdCBmZWF0dXJlcyBkb24ndAogICAgICAgICMgZ2V0IGZsYWdnZWQgYXMgZXJyb3JzIHdoZW4gdGhleSdyZSByZXF1aXJlZCBieSBhbiBlbmFibGVkIGZlYXR1cmUKICAgICAgICBmb3IgbmFtZSwgZmVhdHVyZSBpbiBzZWxmLmZlYXR1cmVzLml0ZW1zKCk6CiAgICAgICAgICAgIGlmIG5vdCBzZWxmLmZlYXR1cmVfaXNfaW5jbHVkZWQobmFtZSk6CiAgICAgICAgICAgICAgICBmZWF0dXJlLmV4Y2x1ZGVfZnJvbShzZWxmKQogICAgICAgICAgICAgICAgc2VsZi5fc2V0X2ZlYXR1cmUobmFtZSwgMCkKCiAgICBkZWYgZ2V0X2NvbW1hbmRfY2xhc3Moc2VsZiwgY29tbWFuZCk6CiAgICAgICAgIiIiUGx1Z2dhYmxlIHZlcnNpb24gb2YgZ2V0X2NvbW1hbmRfY2xhc3MoKSIiIgogICAgICAgIGlmIGNvbW1hbmQgaW4gc2VsZi5jbWRjbGFzczoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuY21kY2xhc3NbY29tbWFuZF0KCiAgICAgICAgZXBzID0gcGtnX3Jlc291cmNlcy5pdGVyX2VudHJ5X3BvaW50cygnZGlzdHV0aWxzLmNvbW1hbmRzJywgY29tbWFuZCkKICAgICAgICBmb3IgZXAgaW4gZXBzOgogICAgICAgICAgICBlcC5yZXF1aXJlKGluc3RhbGxlcj1zZWxmLmZldGNoX2J1aWxkX2VnZykKICAgICAgICAgICAgc2VsZi5jbWRjbGFzc1tjb21tYW5kXSA9IGNtZGNsYXNzID0gZXAubG9hZCgpCiAgICAgICAgICAgIHJldHVybiBjbWRjbGFzcwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiBfRGlzdHJpYnV0aW9uLmdldF9jb21tYW5kX2NsYXNzKHNlbGYsIGNvbW1hbmQpCgogICAgZGVmIHByaW50X2NvbW1hbmRzKHNlbGYpOgogICAgICAgIGZvciBlcCBpbiBwa2dfcmVzb3VyY2VzLml0ZXJfZW50cnlfcG9pbnRzKCdkaXN0dXRpbHMuY29tbWFuZHMnKToKICAgICAgICAgICAgaWYgZXAubmFtZSBub3QgaW4gc2VsZi5jbWRjbGFzczoKICAgICAgICAgICAgICAgICMgZG9uJ3QgcmVxdWlyZSBleHRyYXMgYXMgdGhlIGNvbW1hbmRzIHdvbid0IGJlIGludm9rZWQKICAgICAgICAgICAgICAgIGNtZGNsYXNzID0gZXAucmVzb2x2ZSgpCiAgICAgICAgICAgICAgICBzZWxmLmNtZGNsYXNzW2VwLm5hbWVdID0gY21kY2xhc3MKICAgICAgICByZXR1cm4gX0Rpc3RyaWJ1dGlvbi5wcmludF9jb21tYW5kcyhzZWxmKQoKICAgIGRlZiBnZXRfY29tbWFuZF9saXN0KHNlbGYpOgogICAgICAgIGZvciBlcCBpbiBwa2dfcmVzb3VyY2VzLml0ZXJfZW50cnlfcG9pbnRzKCdkaXN0dXRpbHMuY29tbWFuZHMnKToKICAgICAgICAgICAgaWYgZXAubmFtZSBub3QgaW4gc2VsZi5jbWRjbGFzczoKICAgICAgICAgICAgICAgICMgZG9uJ3QgcmVxdWlyZSBleHRyYXMgYXMgdGhlIGNvbW1hbmRzIHdvbid0IGJlIGludm9rZWQKICAgICAgICAgICAgICAgIGNtZGNsYXNzID0gZXAucmVzb2x2ZSgpCiAgICAgICAgICAgICAgICBzZWxmLmNtZGNsYXNzW2VwLm5hbWVdID0gY21kY2xhc3MKICAgICAgICByZXR1cm4gX0Rpc3RyaWJ1dGlvbi5nZXRfY29tbWFuZF9saXN0KHNlbGYpCgogICAgZGVmIF9zZXRfZmVhdHVyZShzZWxmLCBuYW1lLCBzdGF0dXMpOgogICAgICAgICIiIlNldCBmZWF0dXJlJ3MgaW5jbHVzaW9uIHN0YXR1cyIiIgogICAgICAgIHNldGF0dHIoc2VsZiwgc2VsZi5fZmVhdHVyZV9hdHRybmFtZShuYW1lKSwgc3RhdHVzKQoKICAgIGRlZiBmZWF0dXJlX2lzX2luY2x1ZGVkKHNlbGYsIG5hbWUpOgogICAgICAgICIiIlJldHVybiAxIGlmIGZlYXR1cmUgaXMgaW5jbHVkZWQsIDAgaWYgZXhjbHVkZWQsICdOb25lJyBpZiB1bmtub3duIiIiCiAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZiwgc2VsZi5fZmVhdHVyZV9hdHRybmFtZShuYW1lKSkKCiAgICBkZWYgaW5jbHVkZV9mZWF0dXJlKHNlbGYsIG5hbWUpOgogICAgICAgICIiIlJlcXVlc3QgaW5jbHVzaW9uIG9mIGZlYXR1cmUgbmFtZWQgJ25hbWUnIiIiCgogICAgICAgIGlmIHNlbGYuZmVhdHVyZV9pc19pbmNsdWRlZChuYW1lKSA9PSAwOgogICAgICAgICAgICBkZXNjciA9IHNlbGYuZmVhdHVyZXNbbmFtZV0uZGVzY3JpcHRpb24KICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoCiAgICAgICAgICAgICAgICBkZXNjciArICIgaXMgcmVxdWlyZWQsIGJ1dCB3YXMgZXhjbHVkZWQgb3IgaXMgbm90IGF2YWlsYWJsZSIKICAgICAgICAgICAgKQogICAgICAgIHNlbGYuZmVhdHVyZXNbbmFtZV0uaW5jbHVkZV9pbihzZWxmKQogICAgICAgIHNlbGYuX3NldF9mZWF0dXJlKG5hbWUsIDEpCgogICAgZGVmIGluY2x1ZGUoc2VsZiwgKiphdHRycyk6CiAgICAgICAgIiIiQWRkIGl0ZW1zIHRvIGRpc3RyaWJ1dGlvbiB0aGF0IGFyZSBuYW1lZCBpbiBrZXl3b3JkIGFyZ3VtZW50cwoKICAgICAgICBGb3IgZXhhbXBsZSwgJ2Rpc3QuZXhjbHVkZShweV9tb2R1bGVzPVsieCJdKScgd291bGQgYWRkICd4JyB0bwogICAgICAgIHRoZSBkaXN0cmlidXRpb24ncyAncHlfbW9kdWxlcycgYXR0cmlidXRlLCBpZiBpdCB3YXMgbm90IGFscmVhZHkKICAgICAgICB0aGVyZS4KCiAgICAgICAgQ3VycmVudGx5LCB0aGlzIG1ldGhvZCBvbmx5IHN1cHBvcnRzIGluY2x1c2lvbiBmb3IgYXR0cmlidXRlcyB0aGF0IGFyZQogICAgICAgIGxpc3RzIG9yIHR1cGxlcy4gIElmIHlvdSBuZWVkIHRvIGFkZCBzdXBwb3J0IGZvciBhZGRpbmcgdG8gb3RoZXIKICAgICAgICBhdHRyaWJ1dGVzIGluIHRoaXMgb3IgYSBzdWJjbGFzcywgeW91IGNhbiBhZGQgYW4gJ19pbmNsdWRlX1gnIG1ldGhvZCwKICAgICAgICB3aGVyZSAnWCcgaXMgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4gIFRoZSBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2l0aAogICAgICAgIHRoZSB2YWx1ZSBwYXNzZWQgdG8gJ2luY2x1ZGUoKScuICBTbywgJ2Rpc3QuaW5jbHVkZShmb289eyJiYXIiOiJiYXoifSknCiAgICAgICAgd2lsbCB0cnkgdG8gY2FsbCAnZGlzdC5faW5jbHVkZV9mb28oeyJiYXIiOiJiYXoifSknLCB3aGljaCBjYW4gdGhlbgogICAgICAgIGhhbmRsZSB3aGF0ZXZlciBzcGVjaWFsIGluY2x1c2lvbiBsb2dpYyBpcyBuZWVkZWQuCiAgICAgICAgIiIiCiAgICAgICAgZm9yIGssIHYgaW4gYXR0cnMuaXRlbXMoKToKICAgICAgICAgICAgaW5jbHVkZSA9IGdldGF0dHIoc2VsZiwgJ19pbmNsdWRlXycgKyBrLCBOb25lKQogICAgICAgICAgICBpZiBpbmNsdWRlOgogICAgICAgICAgICAgICAgaW5jbHVkZSh2KQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi5faW5jbHVkZV9taXNjKGssIHYpCgogICAgZGVmIGV4Y2x1ZGVfcGFja2FnZShzZWxmLCBwYWNrYWdlKToKICAgICAgICAiIiJSZW1vdmUgcGFja2FnZXMsIG1vZHVsZXMsIGFuZCBleHRlbnNpb25zIGluIG5hbWVkIHBhY2thZ2UiIiIKCiAgICAgICAgcGZ4ID0gcGFja2FnZSArICcuJwogICAgICAgIGlmIHNlbGYucGFja2FnZXM6CiAgICAgICAgICAgIHNlbGYucGFja2FnZXMgPSBbCiAgICAgICAgICAgICAgICBwIGZvciBwIGluIHNlbGYucGFja2FnZXMKICAgICAgICAgICAgICAgIGlmIHAgIT0gcGFja2FnZSBhbmQgbm90IHAuc3RhcnRzd2l0aChwZngpCiAgICAgICAgICAgIF0KCiAgICAgICAgaWYgc2VsZi5weV9tb2R1bGVzOgogICAgICAgICAgICBzZWxmLnB5X21vZHVsZXMgPSBbCiAgICAgICAgICAgICAgICBwIGZvciBwIGluIHNlbGYucHlfbW9kdWxlcwogICAgICAgICAgICAgICAgaWYgcCAhPSBwYWNrYWdlIGFuZCBub3QgcC5zdGFydHN3aXRoKHBmeCkKICAgICAgICAgICAgXQoKICAgICAgICBpZiBzZWxmLmV4dF9tb2R1bGVzOgogICAgICAgICAgICBzZWxmLmV4dF9tb2R1bGVzID0gWwogICAgICAgICAgICAgICAgcCBmb3IgcCBpbiBzZWxmLmV4dF9tb2R1bGVzCiAgICAgICAgICAgICAgICBpZiBwLm5hbWUgIT0gcGFja2FnZSBhbmQgbm90IHAubmFtZS5zdGFydHN3aXRoKHBmeCkKICAgICAgICAgICAgXQoKICAgIGRlZiBoYXNfY29udGVudHNfZm9yKHNlbGYsIHBhY2thZ2UpOgogICAgICAgICIiIlJldHVybiB0cnVlIGlmICdleGNsdWRlX3BhY2thZ2UocGFja2FnZSknIHdvdWxkIGRvIHNvbWV0aGluZyIiIgoKICAgICAgICBwZnggPSBwYWNrYWdlICsgJy4nCgogICAgICAgIGZvciBwIGluIHNlbGYuaXRlcl9kaXN0cmlidXRpb25fbmFtZXMoKToKICAgICAgICAgICAgaWYgcCA9PSBwYWNrYWdlIG9yIHAuc3RhcnRzd2l0aChwZngpOgogICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgX2V4Y2x1ZGVfbWlzYyhzZWxmLCBuYW1lLCB2YWx1ZSk6CiAgICAgICAgIiIiSGFuZGxlICdleGNsdWRlKCknIGZvciBsaXN0L3R1cGxlIGF0dHJzIHdpdGhvdXQgYSBzcGVjaWFsIGhhbmRsZXIiIiIKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZSwgc2VxdWVuY2UpOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgICAgICAgICAgIiVzOiBzZXR0aW5nIG11c3QgYmUgYSBsaXN0IG9yIHR1cGxlICglcikiICUgKG5hbWUsIHZhbHVlKQogICAgICAgICAgICApCiAgICAgICAgdHJ5OgogICAgICAgICAgICBvbGQgPSBnZXRhdHRyKHNlbGYsIG5hbWUpCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgICAgICAgICAgIiVzOiBObyBzdWNoIGRpc3RyaWJ1dGlvbiBzZXR0aW5nIiAlIG5hbWUKICAgICAgICAgICAgKQogICAgICAgIGlmIG9sZCBpcyBub3QgTm9uZSBhbmQgbm90IGlzaW5zdGFuY2Uob2xkLCBzZXF1ZW5jZSk6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgICAgICAgICBuYW1lICsgIjogdGhpcyBzZXR0aW5nIGNhbm5vdCBiZSBjaGFuZ2VkIHZpYSBpbmNsdWRlL2V4Y2x1ZGUiCiAgICAgICAgICAgICkKICAgICAgICBlbGlmIG9sZDoKICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBuYW1lLCBbaXRlbSBmb3IgaXRlbSBpbiBvbGQgaWYgaXRlbSBub3QgaW4gdmFsdWVdKQoKICAgIGRlZiBfaW5jbHVkZV9taXNjKHNlbGYsIG5hbWUsIHZhbHVlKToKICAgICAgICAiIiJIYW5kbGUgJ2luY2x1ZGUoKScgZm9yIGxpc3QvdHVwbGUgYXR0cnMgd2l0aG91dCBhIHNwZWNpYWwgaGFuZGxlciIiIgoKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZSwgc2VxdWVuY2UpOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgICAgICAgICAgIiVzOiBzZXR0aW5nIG11c3QgYmUgYSBsaXN0ICglcikiICUgKG5hbWUsIHZhbHVlKQogICAgICAgICAgICApCiAgICAgICAgdHJ5OgogICAgICAgICAgICBvbGQgPSBnZXRhdHRyKHNlbGYsIG5hbWUpCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAogICAgICAgICAgICAgICAgIiVzOiBObyBzdWNoIGRpc3RyaWJ1dGlvbiBzZXR0aW5nIiAlIG5hbWUKICAgICAgICAgICAgKQogICAgICAgIGlmIG9sZCBpcyBOb25lOgogICAgICAgICAgICBzZXRhdHRyKHNlbGYsIG5hbWUsIHZhbHVlKQogICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2Uob2xkLCBzZXF1ZW5jZSk6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgICAgICAgICBuYW1lICsgIjogdGhpcyBzZXR0aW5nIGNhbm5vdCBiZSBjaGFuZ2VkIHZpYSBpbmNsdWRlL2V4Y2x1ZGUiCiAgICAgICAgICAgICkKICAgICAgICBlbHNlOgogICAgICAgICAgICBuZXcgPSBbaXRlbSBmb3IgaXRlbSBpbiB2YWx1ZSBpZiBpdGVtIG5vdCBpbiBvbGRdCiAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgbmFtZSwgb2xkICsgbmV3KQoKICAgIGRlZiBleGNsdWRlKHNlbGYsICoqYXR0cnMpOgogICAgICAgICIiIlJlbW92ZSBpdGVtcyBmcm9tIGRpc3RyaWJ1dGlvbiB0aGF0IGFyZSBuYW1lZCBpbiBrZXl3b3JkIGFyZ3VtZW50cwoKICAgICAgICBGb3IgZXhhbXBsZSwgJ2Rpc3QuZXhjbHVkZShweV9tb2R1bGVzPVsieCJdKScgd291bGQgcmVtb3ZlICd4JyBmcm9tCiAgICAgICAgdGhlIGRpc3RyaWJ1dGlvbidzICdweV9tb2R1bGVzJyBhdHRyaWJ1dGUuICBFeGNsdWRpbmcgcGFja2FnZXMgdXNlcwogICAgICAgIHRoZSAnZXhjbHVkZV9wYWNrYWdlKCknIG1ldGhvZCwgc28gYWxsIG9mIHRoZSBwYWNrYWdlJ3MgY29udGFpbmVkCiAgICAgICAgcGFja2FnZXMsIG1vZHVsZXMsIGFuZCBleHRlbnNpb25zIGFyZSBhbHNvIGV4Y2x1ZGVkLgoKICAgICAgICBDdXJyZW50bHksIHRoaXMgbWV0aG9kIG9ubHkgc3VwcG9ydHMgZXhjbHVzaW9uIGZyb20gYXR0cmlidXRlcyB0aGF0IGFyZQogICAgICAgIGxpc3RzIG9yIHR1cGxlcy4gIElmIHlvdSBuZWVkIHRvIGFkZCBzdXBwb3J0IGZvciBleGNsdWRpbmcgZnJvbSBvdGhlcgogICAgICAgIGF0dHJpYnV0ZXMgaW4gdGhpcyBvciBhIHN1YmNsYXNzLCB5b3UgY2FuIGFkZCBhbiAnX2V4Y2x1ZGVfWCcgbWV0aG9kLAogICAgICAgIHdoZXJlICdYJyBpcyB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLiAgVGhlIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aXRoCiAgICAgICAgdGhlIHZhbHVlIHBhc3NlZCB0byAnZXhjbHVkZSgpJy4gIFNvLCAnZGlzdC5leGNsdWRlKGZvbz17ImJhciI6ImJheiJ9KScKICAgICAgICB3aWxsIHRyeSB0byBjYWxsICdkaXN0Ll9leGNsdWRlX2Zvbyh7ImJhciI6ImJheiJ9KScsIHdoaWNoIGNhbiB0aGVuCiAgICAgICAgaGFuZGxlIHdoYXRldmVyIHNwZWNpYWwgZXhjbHVzaW9uIGxvZ2ljIGlzIG5lZWRlZC4KICAgICAgICAiIiIKICAgICAgICBmb3IgaywgdiBpbiBhdHRycy5pdGVtcygpOgogICAgICAgICAgICBleGNsdWRlID0gZ2V0YXR0cihzZWxmLCAnX2V4Y2x1ZGVfJyArIGssIE5vbmUpCiAgICAgICAgICAgIGlmIGV4Y2x1ZGU6CiAgICAgICAgICAgICAgICBleGNsdWRlKHYpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzZWxmLl9leGNsdWRlX21pc2MoaywgdikKCiAgICBkZWYgX2V4Y2x1ZGVfcGFja2FnZXMoc2VsZiwgcGFja2FnZXMpOgogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHBhY2thZ2VzLCBzZXF1ZW5jZSk6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgICAgICAgICAicGFja2FnZXM6IHNldHRpbmcgbXVzdCBiZSBhIGxpc3Qgb3IgdHVwbGUgKCVyKSIgJSAocGFja2FnZXMsKQogICAgICAgICAgICApCiAgICAgICAgbGlzdChtYXAoc2VsZi5leGNsdWRlX3BhY2thZ2UsIHBhY2thZ2VzKSkKCiAgICBkZWYgX3BhcnNlX2NvbW1hbmRfb3B0cyhzZWxmLCBwYXJzZXIsIGFyZ3MpOgogICAgICAgICMgUmVtb3ZlIC0td2l0aC1YLy0td2l0aG91dC1YIG9wdGlvbnMgd2hlbiBwcm9jZXNzaW5nIGNvbW1hbmQgYXJncwogICAgICAgIHNlbGYuZ2xvYmFsX29wdGlvbnMgPSBzZWxmLl9fY2xhc3NfXy5nbG9iYWxfb3B0aW9ucwogICAgICAgIHNlbGYubmVnYXRpdmVfb3B0ID0gc2VsZi5fX2NsYXNzX18ubmVnYXRpdmVfb3B0CgogICAgICAgICMgRmlyc3QsIGV4cGFuZCBhbnkgYWxpYXNlcwogICAgICAgIGNvbW1hbmQgPSBhcmdzWzBdCiAgICAgICAgYWxpYXNlcyA9IHNlbGYuZ2V0X29wdGlvbl9kaWN0KCdhbGlhc2VzJykKICAgICAgICB3aGlsZSBjb21tYW5kIGluIGFsaWFzZXM6CiAgICAgICAgICAgIHNyYywgYWxpYXMgPSBhbGlhc2VzW2NvbW1hbmRdCiAgICAgICAgICAgIGRlbCBhbGlhc2VzW2NvbW1hbmRdICAjIGVuc3VyZSBlYWNoIGFsaWFzIGNhbiBleHBhbmQgb25seSBvbmNlIQogICAgICAgICAgICBpbXBvcnQgc2hsZXgKICAgICAgICAgICAgYXJnc1s6MV0gPSBzaGxleC5zcGxpdChhbGlhcywgVHJ1ZSkKICAgICAgICAgICAgY29tbWFuZCA9IGFyZ3NbMF0KCiAgICAgICAgbmFyZ3MgPSBfRGlzdHJpYnV0aW9uLl9wYXJzZV9jb21tYW5kX29wdHMoc2VsZiwgcGFyc2VyLCBhcmdzKQoKICAgICAgICAjIEhhbmRsZSBjb21tYW5kcyB0aGF0IHdhbnQgdG8gY29uc3VtZSBhbGwgcmVtYWluaW5nIGFyZ3VtZW50cwogICAgICAgIGNtZF9jbGFzcyA9IHNlbGYuZ2V0X2NvbW1hbmRfY2xhc3MoY29tbWFuZCkKICAgICAgICBpZiBnZXRhdHRyKGNtZF9jbGFzcywgJ2NvbW1hbmRfY29uc3VtZXNfYXJndW1lbnRzJywgTm9uZSk6CiAgICAgICAgICAgIHNlbGYuZ2V0X29wdGlvbl9kaWN0KGNvbW1hbmQpWydhcmdzJ10gPSAoImNvbW1hbmQgbGluZSIsIG5hcmdzKQogICAgICAgICAgICBpZiBuYXJncyBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgIHJldHVybiBbXQoKICAgICAgICByZXR1cm4gbmFyZ3MKCiAgICBkZWYgZ2V0X2NtZGxpbmVfb3B0aW9ucyhzZWxmKToKICAgICAgICAiIiJSZXR1cm4gYSAne2NtZDoge29wdDp2YWx9fScgbWFwIG9mIGFsbCBjb21tYW5kLWxpbmUgb3B0aW9ucwoKICAgICAgICBPcHRpb24gbmFtZXMgYXJlIGFsbCBsb25nLCBidXQgZG8gbm90IGluY2x1ZGUgdGhlIGxlYWRpbmcgJy0tJywgYW5kCiAgICAgICAgY29udGFpbiBkYXNoZXMgcmF0aGVyIHRoYW4gdW5kZXJzY29yZXMuICBJZiB0aGUgb3B0aW9uIGRvZXNuJ3QgdGFrZQogICAgICAgIGFuIGFyZ3VtZW50IChlLmcuICctLXF1aWV0JyksIHRoZSAndmFsJyBpcyAnTm9uZScuCgogICAgICAgIE5vdGUgdGhhdCBvcHRpb25zIHByb3ZpZGVkIGJ5IGNvbmZpZyBmaWxlcyBhcmUgaW50ZW50aW9uYWxseSBleGNsdWRlZC4KICAgICAgICAiIiIKCiAgICAgICAgZCA9IHt9CgogICAgICAgIGZvciBjbWQsIG9wdHMgaW4gc2VsZi5jb21tYW5kX29wdGlvbnMuaXRlbXMoKToKCiAgICAgICAgICAgIGZvciBvcHQsIChzcmMsIHZhbCkgaW4gb3B0cy5pdGVtcygpOgoKICAgICAgICAgICAgICAgIGlmIHNyYyAhPSAiY29tbWFuZCBsaW5lIjoKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgICAgIG9wdCA9IG9wdC5yZXBsYWNlKCdfJywgJy0nKQoKICAgICAgICAgICAgICAgIGlmIHZhbCA9PSAwOgogICAgICAgICAgICAgICAgICAgIGNtZG9iaiA9IHNlbGYuZ2V0X2NvbW1hbmRfb2JqKGNtZCkKICAgICAgICAgICAgICAgICAgICBuZWdfb3B0ID0gc2VsZi5uZWdhdGl2ZV9vcHQuY29weSgpCiAgICAgICAgICAgICAgICAgICAgbmVnX29wdC51cGRhdGUoZ2V0YXR0cihjbWRvYmosICduZWdhdGl2ZV9vcHQnLCB7fSkpCiAgICAgICAgICAgICAgICAgICAgZm9yIG5lZywgcG9zIGluIG5lZ19vcHQuaXRlbXMoKToKICAgICAgICAgICAgICAgICAgICAgICAgaWYgcG9zID09IG9wdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdCA9IG5lZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gTm9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigiU2hvdWxkbid0IGJlIGFibGUgdG8gZ2V0IGhlcmUiKQoKICAgICAgICAgICAgICAgIGVsaWYgdmFsID09IDE6CiAgICAgICAgICAgICAgICAgICAgdmFsID0gTm9uZQoKICAgICAgICAgICAgICAgIGQuc2V0ZGVmYXVsdChjbWQsIHt9KVtvcHRdID0gdmFsCgogICAgICAgIHJldHVybiBkCgogICAgZGVmIGl0ZXJfZGlzdHJpYnV0aW9uX25hbWVzKHNlbGYpOgogICAgICAgICIiIllpZWxkIGFsbCBwYWNrYWdlcywgbW9kdWxlcywgYW5kIGV4dGVuc2lvbiBuYW1lcyBpbiBkaXN0cmlidXRpb24iIiIKCiAgICAgICAgZm9yIHBrZyBpbiBzZWxmLnBhY2thZ2VzIG9yICgpOgogICAgICAgICAgICB5aWVsZCBwa2cKCiAgICAgICAgZm9yIG1vZHVsZSBpbiBzZWxmLnB5X21vZHVsZXMgb3IgKCk6CiAgICAgICAgICAgIHlpZWxkIG1vZHVsZQoKICAgICAgICBmb3IgZXh0IGluIHNlbGYuZXh0X21vZHVsZXMgb3IgKCk6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXh0LCB0dXBsZSk6CiAgICAgICAgICAgICAgICBuYW1lLCBidWlsZGluZm8gPSBleHQKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIG5hbWUgPSBleHQubmFtZQogICAgICAgICAgICBpZiBuYW1lLmVuZHN3aXRoKCdtb2R1bGUnKToKICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lWzotNl0KICAgICAgICAgICAgeWllbGQgbmFtZQoKICAgIGRlZiBoYW5kbGVfZGlzcGxheV9vcHRpb25zKHNlbGYsIG9wdGlvbl9vcmRlcik6CiAgICAgICAgIiIiSWYgdGhlcmUgd2VyZSBhbnkgbm9uLWdsb2JhbCAiZGlzcGxheS1vbmx5IiBvcHRpb25zCiAgICAgICAgKC0taGVscC1jb21tYW5kcyBvciB0aGUgbWV0YWRhdGEgZGlzcGxheSBvcHRpb25zKSBvbiB0aGUgY29tbWFuZAogICAgICAgIGxpbmUsIGRpc3BsYXkgdGhlIHJlcXVlc3RlZCBpbmZvIGFuZCByZXR1cm4gdHJ1ZTsgZWxzZSByZXR1cm4KICAgICAgICBmYWxzZS4KICAgICAgICAiIiIKICAgICAgICBpbXBvcnQgc3lzCgogICAgICAgIGlmIHNpeC5QWTIgb3Igc2VsZi5oZWxwX2NvbW1hbmRzOgogICAgICAgICAgICByZXR1cm4gX0Rpc3RyaWJ1dGlvbi5oYW5kbGVfZGlzcGxheV9vcHRpb25zKHNlbGYsIG9wdGlvbl9vcmRlcikKCiAgICAgICAgIyBTdGRvdXQgbWF5IGJlIFN0cmluZ0lPIChlLmcuIGluIHRlc3RzKQogICAgICAgIGltcG9ydCBpbwogICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHN5cy5zdGRvdXQsIGlvLlRleHRJT1dyYXBwZXIpOgogICAgICAgICAgICByZXR1cm4gX0Rpc3RyaWJ1dGlvbi5oYW5kbGVfZGlzcGxheV9vcHRpb25zKHNlbGYsIG9wdGlvbl9vcmRlcikKCiAgICAgICAgIyBEb24ndCB3cmFwIHN0ZG91dCBpZiB1dGYtOCBpcyBhbHJlYWR5IHRoZSBlbmNvZGluZy4gUHJvdmlkZXMKICAgICAgICAjICB3b3JrYXJvdW5kIGZvciAjMzM0LgogICAgICAgIGlmIHN5cy5zdGRvdXQuZW5jb2RpbmcubG93ZXIoKSBpbiAoJ3V0Zi04JywgJ3V0ZjgnKToKICAgICAgICAgICAgcmV0dXJuIF9EaXN0cmlidXRpb24uaGFuZGxlX2Rpc3BsYXlfb3B0aW9ucyhzZWxmLCBvcHRpb25fb3JkZXIpCgogICAgICAgICMgUHJpbnQgbWV0YWRhdGEgaW4gVVRGLTggbm8gbWF0dGVyIHRoZSBwbGF0Zm9ybQogICAgICAgIGVuY29kaW5nID0gc3lzLnN0ZG91dC5lbmNvZGluZwogICAgICAgIGVycm9ycyA9IHN5cy5zdGRvdXQuZXJyb3JzCiAgICAgICAgbmV3bGluZSA9IHN5cy5wbGF0Zm9ybSAhPSAnd2luMzInIGFuZCAnXG4nIG9yIE5vbmUKICAgICAgICBsaW5lX2J1ZmZlcmluZyA9IHN5cy5zdGRvdXQubGluZV9idWZmZXJpbmcKCiAgICAgICAgc3lzLnN0ZG91dCA9IGlvLlRleHRJT1dyYXBwZXIoCiAgICAgICAgICAgIHN5cy5zdGRvdXQuZGV0YWNoKCksICd1dGYtOCcsIGVycm9ycywgbmV3bGluZSwgbGluZV9idWZmZXJpbmcpCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gX0Rpc3RyaWJ1dGlvbi5oYW5kbGVfZGlzcGxheV9vcHRpb25zKHNlbGYsIG9wdGlvbl9vcmRlcikKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBzeXMuc3Rkb3V0ID0gaW8uVGV4dElPV3JhcHBlcigKICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQuZGV0YWNoKCksIGVuY29kaW5nLCBlcnJvcnMsIG5ld2xpbmUsIGxpbmVfYnVmZmVyaW5nKQoKCmNsYXNzIEZlYXR1cmU6CiAgICAiIiIKICAgICoqZGVwcmVjYXRlZCoqIC0tIFRoZSBgRmVhdHVyZWAgZmFjaWxpdHkgd2FzIG5ldmVyIGNvbXBsZXRlbHkgaW1wbGVtZW50ZWQKICAgIG9yIHN1cHBvcnRlZCwgYGhhcyByZXBvcnRlZCBpc3N1ZXMKICAgIDxodHRwczovL2dpdGh1Yi5jb20vcHlwYS9zZXR1cHRvb2xzL2lzc3Vlcy81OD5gXyBhbmQgd2lsbCBiZSByZW1vdmVkIGluCiAgICBhIGZ1dHVyZSB2ZXJzaW9uLgoKICAgIEEgc3Vic2V0IG9mIHRoZSBkaXN0cmlidXRpb24gdGhhdCBjYW4gYmUgZXhjbHVkZWQgaWYgdW5uZWVkZWQvd2FudGVkCgogICAgRmVhdHVyZXMgYXJlIGNyZWF0ZWQgdXNpbmcgdGhlc2Uga2V5d29yZCBhcmd1bWVudHM6CgogICAgICAnZGVzY3JpcHRpb24nIC0tIGEgc2hvcnQsIGh1bWFuIHJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlLCB0bwogICAgICAgICBiZSB1c2VkIGluIGVycm9yIG1lc3NhZ2VzLCBhbmQgb3B0aW9uIGhlbHAgbWVzc2FnZXMuCgogICAgICAnc3RhbmRhcmQnIC0tIGlmIHRydWUsIHRoZSBmZWF0dXJlIGlzIGluY2x1ZGVkIGJ5IGRlZmF1bHQgaWYgaXQgaXMKICAgICAgICAgYXZhaWxhYmxlIG9uIHRoZSBjdXJyZW50IHN5c3RlbS4gIE90aGVyd2lzZSwgdGhlIGZlYXR1cmUgaXMgb25seQogICAgICAgICBpbmNsdWRlZCBpZiByZXF1ZXN0ZWQgdmlhIGEgY29tbWFuZCBsaW5lICctLXdpdGgtWCcgb3B0aW9uLCBvciBpZgogICAgICAgICBhbm90aGVyIGluY2x1ZGVkIGZlYXR1cmUgcmVxdWlyZXMgaXQuICBUaGUgZGVmYXVsdCBzZXR0aW5nIGlzICdGYWxzZScuCgogICAgICAnYXZhaWxhYmxlJyAtLSBpZiB0cnVlLCB0aGUgZmVhdHVyZSBpcyBhdmFpbGFibGUgZm9yIGluc3RhbGxhdGlvbiBvbiB0aGUKICAgICAgICAgY3VycmVudCBzeXN0ZW0uICBUaGUgZGVmYXVsdCBzZXR0aW5nIGlzICdUcnVlJy4KCiAgICAgICdvcHRpb25hbCcgLS0gaWYgdHJ1ZSwgdGhlIGZlYXR1cmUncyBpbmNsdXNpb24gY2FuIGJlIGNvbnRyb2xsZWQgZnJvbSB0aGUKICAgICAgICAgY29tbWFuZCBsaW5lLCB1c2luZyB0aGUgJy0td2l0aC1YJyBvciAnLS13aXRob3V0LVgnIG9wdGlvbnMuICBJZgogICAgICAgICBmYWxzZSwgdGhlIGZlYXR1cmUncyBpbmNsdXNpb24gc3RhdHVzIGlzIGRldGVybWluZWQgYXV0b21hdGljYWxseSwKICAgICAgICAgYmFzZWQgb24gJ2F2YWlsYWJpbGUnLCAnc3RhbmRhcmQnLCBhbmQgd2hldGhlciBhbnkgb3RoZXIgZmVhdHVyZQogICAgICAgICByZXF1aXJlcyBpdC4gIFRoZSBkZWZhdWx0IHNldHRpbmcgaXMgJ1RydWUnLgoKICAgICAgJ3JlcXVpcmVfZmVhdHVyZXMnIC0tIGEgc3RyaW5nIG9yIHNlcXVlbmNlIG9mIHN0cmluZ3MgbmFtaW5nIGZlYXR1cmVzCiAgICAgICAgIHRoYXQgc2hvdWxkIGFsc28gYmUgaW5jbHVkZWQgaWYgdGhpcyBmZWF0dXJlIGlzIGluY2x1ZGVkLiAgRGVmYXVsdHMgdG8KICAgICAgICAgZW1wdHkgbGlzdC4gIE1heSBhbHNvIGNvbnRhaW4gJ1JlcXVpcmUnIG9iamVjdHMgdGhhdCBzaG91bGQgYmUKICAgICAgICAgYWRkZWQvcmVtb3ZlZCBmcm9tIHRoZSBkaXN0cmlidXRpb24uCgogICAgICAncmVtb3ZlJyAtLSBhIHN0cmluZyBvciBsaXN0IG9mIHN0cmluZ3MgbmFtaW5nIHBhY2thZ2VzIHRvIGJlIHJlbW92ZWQKICAgICAgICAgZnJvbSB0aGUgZGlzdHJpYnV0aW9uIGlmIHRoaXMgZmVhdHVyZSBpcyAqbm90KiBpbmNsdWRlZC4gIElmIHRoZQogICAgICAgICBmZWF0dXJlICppcyogaW5jbHVkZWQsIHRoaXMgYXJndW1lbnQgaXMgaWdub3JlZC4gIFRoaXMgYXJndW1lbnQgZXhpc3RzCiAgICAgICAgIHRvIHN1cHBvcnQgcmVtb3ZpbmcgZmVhdHVyZXMgdGhhdCAiY3Jvc3NjdXQiIGEgZGlzdHJpYnV0aW9uLCBzdWNoIGFzCiAgICAgICAgIGRlZmluaW5nIGEgJ3Rlc3RzJyBmZWF0dXJlIHRoYXQgcmVtb3ZlcyBhbGwgdGhlICd0ZXN0cycgc3VicGFja2FnZXMKICAgICAgICAgcHJvdmlkZWQgYnkgb3RoZXIgZmVhdHVyZXMuICBUaGUgZGVmYXVsdCBmb3IgdGhpcyBhcmd1bWVudCBpcyBhbiBlbXB0eQogICAgICAgICBsaXN0LiAgKE5vdGU6IHRoZSBuYW1lZCBwYWNrYWdlKHMpIG9yIG1vZHVsZXMgbXVzdCBleGlzdCBpbiB0aGUgYmFzZQogICAgICAgICBkaXN0cmlidXRpb24gd2hlbiB0aGUgJ3NldHVwKCknIGZ1bmN0aW9uIGlzIGluaXRpYWxseSBjYWxsZWQuKQoKICAgICAgb3RoZXIga2V5d29yZHMgLS0gYW55IG90aGVyIGtleXdvcmQgYXJndW1lbnRzIGFyZSBzYXZlZCwgYW5kIHBhc3NlZCB0bwogICAgICAgICB0aGUgZGlzdHJpYnV0aW9uJ3MgJ2luY2x1ZGUoKScgYW5kICdleGNsdWRlKCknIG1ldGhvZHMgd2hlbiB0aGUKICAgICAgICAgZmVhdHVyZSBpcyBpbmNsdWRlZCBvciBleGNsdWRlZCwgcmVzcGVjdGl2ZWx5LiAgU28sIGZvciBleGFtcGxlLCB5b3UKICAgICAgICAgY291bGQgcGFzcyAncGFja2FnZXM9WyJhIiwiYiJdJyB0byBjYXVzZSBwYWNrYWdlcyAnYScgYW5kICdiJyB0byBiZQogICAgICAgICBhZGRlZCBvciByZW1vdmVkIGZyb20gdGhlIGRpc3RyaWJ1dGlvbiBhcyBhcHByb3ByaWF0ZS4KCiAgICBBIGZlYXR1cmUgbXVzdCBpbmNsdWRlIGF0IGxlYXN0IG9uZSAncmVxdWlyZXMnLCAncmVtb3ZlJywgb3Igb3RoZXIKICAgIGtleXdvcmQgYXJndW1lbnQuICBPdGhlcndpc2UsIGl0IGNhbid0IGFmZmVjdCB0aGUgZGlzdHJpYnV0aW9uIGluIGFueSB3YXkuCiAgICBOb3RlIGFsc28gdGhhdCB5b3UgY2FuIHN1YmNsYXNzICdGZWF0dXJlJyB0byBjcmVhdGUgeW91ciBvd24gc3BlY2lhbGl6ZWQKICAgIGZlYXR1cmUgdHlwZXMgdGhhdCBtb2RpZnkgdGhlIGRpc3RyaWJ1dGlvbiBpbiBvdGhlciB3YXlzIHdoZW4gaW5jbHVkZWQgb3IKICAgIGV4Y2x1ZGVkLiAgU2VlIHRoZSBkb2NzdHJpbmdzIGZvciB0aGUgdmFyaW91cyBtZXRob2RzIGhlcmUgZm9yIG1vcmUgZGV0YWlsLgogICAgQXNpZGUgZnJvbSB0aGUgbWV0aG9kcywgdGhlIG9ubHkgZmVhdHVyZSBhdHRyaWJ1dGVzIHRoYXQgZGlzdHJpYnV0aW9ucyBsb29rCiAgICBhdCBhcmUgJ2Rlc2NyaXB0aW9uJyBhbmQgJ29wdGlvbmFsJy4KICAgICIiIgoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiB3YXJuX2RlcHJlY2F0ZWQoKToKICAgICAgICBtc2cgPSAoCiAgICAgICAgICAgICJGZWF0dXJlcyBhcmUgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlICIKICAgICAgICAgICAgInZlcnNpb24uIFNlZSBodHRwczovL2dpdGh1Yi5jb20vcHlwYS9zZXR1cHRvb2xzL2lzc3Vlcy82NS4iCiAgICAgICAgKQogICAgICAgIHdhcm5pbmdzLndhcm4obXNnLCBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MykKCiAgICBkZWYgX19pbml0X18oCiAgICAgICAgICAgIHNlbGYsIGRlc2NyaXB0aW9uLCBzdGFuZGFyZD1GYWxzZSwgYXZhaWxhYmxlPVRydWUsCiAgICAgICAgICAgIG9wdGlvbmFsPVRydWUsIHJlcXVpcmVfZmVhdHVyZXM9KCksIHJlbW92ZT0oKSwgKipleHRyYXMpOgogICAgICAgIHNlbGYud2Fybl9kZXByZWNhdGVkKCkKCiAgICAgICAgc2VsZi5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uCiAgICAgICAgc2VsZi5zdGFuZGFyZCA9IHN0YW5kYXJkCiAgICAgICAgc2VsZi5hdmFpbGFibGUgPSBhdmFpbGFibGUKICAgICAgICBzZWxmLm9wdGlvbmFsID0gb3B0aW9uYWwKICAgICAgICBpZiBpc2luc3RhbmNlKHJlcXVpcmVfZmVhdHVyZXMsIChzdHIsIFJlcXVpcmUpKToKICAgICAgICAgICAgcmVxdWlyZV9mZWF0dXJlcyA9IHJlcXVpcmVfZmVhdHVyZXMsCgogICAgICAgIHNlbGYucmVxdWlyZV9mZWF0dXJlcyA9IFsKICAgICAgICAgICAgciBmb3IgciBpbiByZXF1aXJlX2ZlYXR1cmVzIGlmIGlzaW5zdGFuY2Uociwgc3RyKQogICAgICAgIF0KICAgICAgICBlciA9IFtyIGZvciByIGluIHJlcXVpcmVfZmVhdHVyZXMgaWYgbm90IGlzaW5zdGFuY2Uociwgc3RyKV0KICAgICAgICBpZiBlcjoKICAgICAgICAgICAgZXh0cmFzWydyZXF1aXJlX2ZlYXR1cmVzJ10gPSBlcgoKICAgICAgICBpZiBpc2luc3RhbmNlKHJlbW92ZSwgc3RyKToKICAgICAgICAgICAgcmVtb3ZlID0gcmVtb3ZlLAogICAgICAgIHNlbGYucmVtb3ZlID0gcmVtb3ZlCiAgICAgICAgc2VsZi5leHRyYXMgPSBleHRyYXMKCiAgICAgICAgaWYgbm90IHJlbW92ZSBhbmQgbm90IHJlcXVpcmVfZmVhdHVyZXMgYW5kIG5vdCBleHRyYXM6CiAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCiAgICAgICAgICAgICAgICAiRmVhdHVyZSAlczogbXVzdCBkZWZpbmUgJ3JlcXVpcmVfZmVhdHVyZXMnLCAncmVtb3ZlJywgb3IgIgogICAgICAgICAgICAgICAgImF0IGxlYXN0IG9uZSBvZiAncGFja2FnZXMnLCAncHlfbW9kdWxlcycsIGV0Yy4iCiAgICAgICAgICAgICkKCiAgICBkZWYgaW5jbHVkZV9ieV9kZWZhdWx0KHNlbGYpOgogICAgICAgICIiIlNob3VsZCB0aGlzIGZlYXR1cmUgYmUgaW5jbHVkZWQgYnkgZGVmYXVsdD8iIiIKICAgICAgICByZXR1cm4gc2VsZi5hdmFpbGFibGUgYW5kIHNlbGYuc3RhbmRhcmQKCiAgICBkZWYgaW5jbHVkZV9pbihzZWxmLCBkaXN0KToKICAgICAgICAiIiJFbnN1cmUgZmVhdHVyZSBhbmQgaXRzIHJlcXVpcmVtZW50cyBhcmUgaW5jbHVkZWQgaW4gZGlzdHJpYnV0aW9uCgogICAgICAgIFlvdSBtYXkgb3ZlcnJpZGUgdGhpcyBpbiBhIHN1YmNsYXNzIHRvIHBlcmZvcm0gYWRkaXRpb25hbCBvcGVyYXRpb25zIG9uCiAgICAgICAgdGhlIGRpc3RyaWJ1dGlvbi4gIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlCiAgICAgICAgcGVyIGZlYXR1cmUsIGFuZCBzbyBzaG91bGQgYmUgaWRlbXBvdGVudC4KCiAgICAgICAgIiIiCgogICAgICAgIGlmIG5vdCBzZWxmLmF2YWlsYWJsZToKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzUGxhdGZvcm1FcnJvcigKICAgICAgICAgICAgICAgIHNlbGYuZGVzY3JpcHRpb24gKyAiIGlzIHJlcXVpcmVkLCAiCiAgICAgICAgICAgICAgICAiYnV0IGlzIG5vdCBhdmFpbGFibGUgb24gdGhpcyBwbGF0Zm9ybSIKICAgICAgICAgICAgKQoKICAgICAgICBkaXN0LmluY2x1ZGUoKipzZWxmLmV4dHJhcykKCiAgICAgICAgZm9yIGYgaW4gc2VsZi5yZXF1aXJlX2ZlYXR1cmVzOgogICAgICAgICAgICBkaXN0LmluY2x1ZGVfZmVhdHVyZShmKQoKICAgIGRlZiBleGNsdWRlX2Zyb20oc2VsZiwgZGlzdCk6CiAgICAgICAgIiIiRW5zdXJlIGZlYXR1cmUgaXMgZXhjbHVkZWQgZnJvbSBkaXN0cmlidXRpb24KCiAgICAgICAgWW91IG1heSBvdmVycmlkZSB0aGlzIGluIGEgc3ViY2xhc3MgdG8gcGVyZm9ybSBhZGRpdGlvbmFsIG9wZXJhdGlvbnMgb24KICAgICAgICB0aGUgZGlzdHJpYnV0aW9uLiAgVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgYXQgbW9zdCBvbmNlIHBlcgogICAgICAgIGZlYXR1cmUsIGFuZCBvbmx5IGFmdGVyIGFsbCBpbmNsdWRlZCBmZWF0dXJlcyBoYXZlIGJlZW4gYXNrZWQgdG8KICAgICAgICBpbmNsdWRlIHRoZW1zZWx2ZXMuCiAgICAgICAgIiIiCgogICAgICAgIGRpc3QuZXhjbHVkZSgqKnNlbGYuZXh0cmFzKQoKICAgICAgICBpZiBzZWxmLnJlbW92ZToKICAgICAgICAgICAgZm9yIGl0ZW0gaW4gc2VsZi5yZW1vdmU6CiAgICAgICAgICAgICAgICBkaXN0LmV4Y2x1ZGVfcGFja2FnZShpdGVtKQoKICAgIGRlZiB2YWxpZGF0ZShzZWxmLCBkaXN0KToKICAgICAgICAiIiJWZXJpZnkgdGhhdCBmZWF0dXJlIG1ha2VzIHNlbnNlIGluIGNvbnRleHQgb2YgZGlzdHJpYnV0aW9uCgogICAgICAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgZGlzdHJpYnV0aW9uIGp1c3QgYmVmb3JlIGl0IHBhcnNlcyBpdHMKICAgICAgICBjb21tYW5kIGxpbmUuICBJdCBjaGVja3MgdG8gZW5zdXJlIHRoYXQgdGhlICdyZW1vdmUnIGF0dHJpYnV0ZSwgaWYgYW55LAogICAgICAgIGNvbnRhaW5zIG9ubHkgdmFsaWQgcGFja2FnZS9tb2R1bGUgbmFtZXMgdGhhdCBhcmUgcHJlc2VudCBpbiB0aGUgYmFzZQogICAgICAgIGRpc3RyaWJ1dGlvbiB3aGVuICdzZXR1cCgpJyBpcyBjYWxsZWQuICBZb3UgbWF5IG92ZXJyaWRlIGl0IGluIGEKICAgICAgICBzdWJjbGFzcyB0byBwZXJmb3JtIGFueSBvdGhlciByZXF1aXJlZCB2YWxpZGF0aW9uIG9mIHRoZSBmZWF0dXJlCiAgICAgICAgYWdhaW5zdCBhIHRhcmdldCBkaXN0cmlidXRpb24uCiAgICAgICAgIiIiCgogICAgICAgIGZvciBpdGVtIGluIHNlbGYucmVtb3ZlOgogICAgICAgICAgICBpZiBub3QgZGlzdC5oYXNfY29udGVudHNfZm9yKGl0ZW0pOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKICAgICAgICAgICAgICAgICAgICAiJXMgd2FudHMgdG8gYmUgYWJsZSB0byByZW1vdmUgJXMsIGJ1dCB0aGUgZGlzdHJpYnV0aW9uIgogICAgICAgICAgICAgICAgICAgICIgZG9lc24ndCBjb250YWluIGFueSBwYWNrYWdlcyBvciBtb2R1bGVzIHVuZGVyICVzIgogICAgICAgICAgICAgICAgICAgICUgKHNlbGYuZGVzY3JpcHRpb24sIGl0ZW0sIGl0ZW0pCiAgICAgICAgICAgICAgICApClBLAwQUAAAAAAAAACEAuaqR7sEGAADBBgAALwAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvZXh0ZW5zaW9uLnB5aW1wb3J0IHJlCmltcG9ydCBmdW5jdG9vbHMKaW1wb3J0IGRpc3R1dGlscy5jb3JlCmltcG9ydCBkaXN0dXRpbHMuZXJyb3JzCmltcG9ydCBkaXN0dXRpbHMuZXh0ZW5zaW9uCgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeC5tb3ZlcyBpbXBvcnQgbWFwCgpmcm9tIC5tb25rZXkgaW1wb3J0IGdldF91bnBhdGNoZWQKCgpkZWYgX2hhdmVfY3l0aG9uKCk6CiAgICAiIiIKICAgIFJldHVybiBUcnVlIGlmIEN5dGhvbiBjYW4gYmUgaW1wb3J0ZWQuCiAgICAiIiIKICAgIGN5dGhvbl9pbXBsID0gJ0N5dGhvbi5EaXN0dXRpbHMuYnVpbGRfZXh0JwogICAgdHJ5OgogICAgICAgICMgZnJvbSAoY3l0aG9uX2ltcGwpIGltcG9ydCBidWlsZF9leHQKICAgICAgICBfX2ltcG9ydF9fKGN5dGhvbl9pbXBsLCBmcm9tbGlzdD1bJ2J1aWxkX2V4dCddKS5idWlsZF9leHQKICAgICAgICByZXR1cm4gVHJ1ZQogICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICBwYXNzCiAgICByZXR1cm4gRmFsc2UKCgojIGZvciBjb21wYXRpYmlsaXR5CmhhdmVfcHlyZXggPSBfaGF2ZV9jeXRob24KCl9FeHRlbnNpb24gPSBnZXRfdW5wYXRjaGVkKGRpc3R1dGlscy5jb3JlLkV4dGVuc2lvbikKCgpjbGFzcyBFeHRlbnNpb24oX0V4dGVuc2lvbik6CiAgICAiIiJFeHRlbnNpb24gdGhhdCB1c2VzICcuYycgZmlsZXMgaW4gcGxhY2Ugb2YgJy5weXgnIGZpbGVzIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIHNvdXJjZXMsICphcmdzLCAqKmt3KToKICAgICAgICAjIFRoZSAqYXJncyBpcyBuZWVkZWQgZm9yIGNvbXBhdGliaWxpdHkgYXMgY2FsbHMgbWF5IHVzZSBwb3NpdGlvbmFsCiAgICAgICAgIyBhcmd1bWVudHMuIHB5X2xpbWl0ZWRfYXBpIG1heSBiZSBzZXQgb25seSB2aWEga2V5d29yZC4KICAgICAgICBzZWxmLnB5X2xpbWl0ZWRfYXBpID0ga3cucG9wKCJweV9saW1pdGVkX2FwaSIsIEZhbHNlKQogICAgICAgIF9FeHRlbnNpb24uX19pbml0X18oc2VsZiwgbmFtZSwgc291cmNlcywgKmFyZ3MsICoqa3cpCgogICAgZGVmIF9jb252ZXJ0X3B5eF9zb3VyY2VzX3RvX2xhbmcoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmVwbGFjZSBzb3VyY2VzIHdpdGggLnB5eCBleHRlbnNpb25zIHRvIHNvdXJjZXMgd2l0aCB0aGUgdGFyZ2V0CiAgICAgICAgbGFuZ3VhZ2UgZXh0ZW5zaW9uLiBUaGlzIG1lY2hhbmlzbSBhbGxvd3MgbGFuZ3VhZ2UgYXV0aG9ycyB0byBzdXBwbHkKICAgICAgICBwcmUtY29udmVydGVkIHNvdXJjZXMgYnV0IHRvIHByZWZlciB0aGUgLnB5eCBzb3VyY2VzLgogICAgICAgICIiIgogICAgICAgIGlmIF9oYXZlX2N5dGhvbigpOgogICAgICAgICAgICAjIHRoZSBidWlsZCBoYXMgQ3l0aG9uLCBzbyBhbGxvdyBpdCB0byBjb21waWxlIHRoZSAucHl4IGZpbGVzCiAgICAgICAgICAgIHJldHVybgogICAgICAgIGxhbmcgPSBzZWxmLmxhbmd1YWdlIG9yICcnCiAgICAgICAgdGFyZ2V0X2V4dCA9ICcuY3BwJyBpZiBsYW5nLmxvd2VyKCkgPT0gJ2MrKycgZWxzZSAnLmMnCiAgICAgICAgc3ViID0gZnVuY3Rvb2xzLnBhcnRpYWwocmUuc3ViLCAnLnB5eCQnLCB0YXJnZXRfZXh0KQogICAgICAgIHNlbGYuc291cmNlcyA9IGxpc3QobWFwKHN1Yiwgc2VsZi5zb3VyY2VzKSkKCgpjbGFzcyBMaWJyYXJ5KEV4dGVuc2lvbik6CiAgICAiIiJKdXN0IGxpa2UgYSByZWd1bGFyIEV4dGVuc2lvbiwgYnV0IGJ1aWx0IGFzIGEgbGlicmFyeSBpbnN0ZWFkIiIiClBLAwQUAAAAAAAAACEA0Ip7ZYMAAACDAAAANQAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvZXh0ZXJuL19faW5pdF9fLnB5ZnJvbSBwa2dfcmVzb3VyY2VzLmV4dGVybiBpbXBvcnQgVmVuZG9ySW1wb3J0ZXIKCm5hbWVzID0gJ3NpeCcsClZlbmRvckltcG9ydGVyKF9fbmFtZV9fLCBuYW1lcywgJ3BrZ19yZXNvdXJjZXMuX3ZlbmRvcicpLmluc3RhbGwoKQpQSwMEFAAAAAAAAAAhAATqwb1KDAAASgwAACsAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2dsaWJjLnB5IyBUaGlzIGZpbGUgb3JpZ2luYWxseSBmcm9tIHBpcDoKIyBodHRwczovL2dpdGh1Yi5jb20vcHlwYS9waXAvYmxvYi84ZjRmMTVhNWE5NWQ3ZDViNTExY2VhZWU5ZWQyNjExNzZjMTgxOTcwL3NyYy9waXAvX2ludGVybmFsL3V0aWxzL2dsaWJjLnB5CmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CgppbXBvcnQgY3R5cGVzCmltcG9ydCByZQppbXBvcnQgd2FybmluZ3MKCgpkZWYgZ2xpYmNfdmVyc2lvbl9zdHJpbmcoKToKICAgICJSZXR1cm5zIGdsaWJjIHZlcnNpb24gc3RyaW5nLCBvciBOb25lIGlmIG5vdCB1c2luZyBnbGliYy4iCgogICAgIyBjdHlwZXMuQ0RMTChOb25lKSBpbnRlcm5hbGx5IGNhbGxzIGRsb3BlbihOVUxMKSwgYW5kIGFzIHRoZSBkbG9wZW4KICAgICMgbWFucGFnZSBzYXlzLCAiSWYgZmlsZW5hbWUgaXMgTlVMTCwgdGhlbiB0aGUgcmV0dXJuZWQgaGFuZGxlIGlzIGZvciB0aGUKICAgICMgbWFpbiBwcm9ncmFtIi4gVGhpcyB3YXkgd2UgY2FuIGxldCB0aGUgbGlua2VyIGRvIHRoZSB3b3JrIHRvIGZpZ3VyZSBvdXQKICAgICMgd2hpY2ggbGliYyBvdXIgcHJvY2VzcyBpcyBhY3R1YWxseSB1c2luZy4KICAgIHByb2Nlc3NfbmFtZXNwYWNlID0gY3R5cGVzLkNETEwoTm9uZSkKICAgIHRyeToKICAgICAgICBnbnVfZ2V0X2xpYmNfdmVyc2lvbiA9IHByb2Nlc3NfbmFtZXNwYWNlLmdudV9nZXRfbGliY192ZXJzaW9uCiAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgIyBTeW1ib2wgZG9lc24ndCBleGlzdCAtPiB0aGVyZWZvcmUsIHdlIGFyZSBub3QgbGlua2VkIHRvCiAgICAgICAgIyBnbGliYy4KICAgICAgICByZXR1cm4gTm9uZQoKICAgICMgQ2FsbCBnbnVfZ2V0X2xpYmNfdmVyc2lvbiwgd2hpY2ggcmV0dXJucyBhIHN0cmluZyBsaWtlICIyLjUiCiAgICBnbnVfZ2V0X2xpYmNfdmVyc2lvbi5yZXN0eXBlID0gY3R5cGVzLmNfY2hhcl9wCiAgICB2ZXJzaW9uX3N0ciA9IGdudV9nZXRfbGliY192ZXJzaW9uKCkKICAgICMgcHkyIC8gcHkzIGNvbXBhdGliaWxpdHk6CiAgICBpZiBub3QgaXNpbnN0YW5jZSh2ZXJzaW9uX3N0ciwgc3RyKToKICAgICAgICB2ZXJzaW9uX3N0ciA9IHZlcnNpb25fc3RyLmRlY29kZSgiYXNjaWkiKQoKICAgIHJldHVybiB2ZXJzaW9uX3N0cgoKCiMgU2VwYXJhdGVkIG91dCBmcm9tIGhhdmVfY29tcGF0aWJsZV9nbGliYyBmb3IgZWFzaWVyIHVuaXQgdGVzdGluZwpkZWYgY2hlY2tfZ2xpYmNfdmVyc2lvbih2ZXJzaW9uX3N0ciwgcmVxdWlyZWRfbWFqb3IsIG1pbmltdW1fbWlub3IpOgogICAgIyBQYXJzZSBzdHJpbmcgYW5kIGNoZWNrIGFnYWluc3QgcmVxdWVzdGVkIHZlcnNpb24uCiAgICAjCiAgICAjIFdlIHVzZSBhIHJlZ2V4cCBpbnN0ZWFkIG9mIHN0ci5zcGxpdCBiZWNhdXNlIHdlIHdhbnQgdG8gZGlzY2FyZCBhbnkKICAgICMgcmFuZG9tIGp1bmsgdGhhdCBtaWdodCBjb21lIGFmdGVyIHRoZSBtaW5vciB2ZXJzaW9uIC0tIHRoaXMgbWlnaHQgaGFwcGVuCiAgICAjIGluIHBhdGNoZWQvZm9ya2VkIHZlcnNpb25zIG9mIGdsaWJjIChlLmcuIExpbmFybydzIHZlcnNpb24gb2YgZ2xpYmMKICAgICMgdXNlcyB2ZXJzaW9uIHN0cmluZ3MgbGlrZSAiMi4yMC0yMDE0LjExIikuIFNlZSBnaC0zNTg4LgogICAgbSA9IHJlLm1hdGNoKHIiKD9QPG1ham9yPlswLTldKylcLig/UDxtaW5vcj5bMC05XSspIiwgdmVyc2lvbl9zdHIpCiAgICBpZiBub3QgbToKICAgICAgICB3YXJuaW5ncy53YXJuKCJFeHBlY3RlZCBnbGliYyB2ZXJzaW9uIHdpdGggMiBjb21wb25lbnRzIG1ham9yLm1pbm9yLCIKICAgICAgICAgICAgICAgICAgICAgICIgZ290OiAlcyIgJSB2ZXJzaW9uX3N0ciwgUnVudGltZVdhcm5pbmcpCiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICByZXR1cm4gKGludChtLmdyb3VwKCJtYWpvciIpKSA9PSByZXF1aXJlZF9tYWpvciBhbmQKICAgICAgICAgICAgaW50KG0uZ3JvdXAoIm1pbm9yIikpID49IG1pbmltdW1fbWlub3IpCgoKZGVmIGhhdmVfY29tcGF0aWJsZV9nbGliYyhyZXF1aXJlZF9tYWpvciwgbWluaW11bV9taW5vcik6CiAgICB2ZXJzaW9uX3N0ciA9IGdsaWJjX3ZlcnNpb25fc3RyaW5nKCkKICAgIGlmIHZlcnNpb25fc3RyIGlzIE5vbmU6CiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICByZXR1cm4gY2hlY2tfZ2xpYmNfdmVyc2lvbih2ZXJzaW9uX3N0ciwgcmVxdWlyZWRfbWFqb3IsIG1pbmltdW1fbWlub3IpCgoKIyBwbGF0Zm9ybS5saWJjX3ZlciByZWd1bGFybHkgcmV0dXJucyBjb21wbGV0ZWx5IG5vbnNlbnNpY2FsIGdsaWJjCiMgdmVyc2lvbnMuIEUuZy4gb24gbXkgY29tcHV0ZXIsIHBsYXRmb3JtIHNheXM6CiMKIyAgIH4kIHB5dGhvbjIuNyAtYyAnaW1wb3J0IHBsYXRmb3JtOyBwcmludChwbGF0Zm9ybS5saWJjX3ZlcigpKScKIyAgICgnZ2xpYmMnLCAnMi43JykKIyAgIH4kIHB5dGhvbjMuNSAtYyAnaW1wb3J0IHBsYXRmb3JtOyBwcmludChwbGF0Zm9ybS5saWJjX3ZlcigpKScKIyAgICgnZ2xpYmMnLCAnMi45JykKIwojIEJ1dCB0aGUgdHJ1dGggaXM6CiMKIyAgIH4kIGxkZCAtLXZlcnNpb24KIyAgIGxkZCAoRGViaWFuIEdMSUJDIDIuMjItMTEpIDIuMjIKIwojIFRoaXMgaXMgdW5mb3J0dW5hdGUsIGJlY2F1c2UgaXQgbWVhbnMgdGhhdCB0aGUgbGluZWhhdWwgZGF0YSBvbiBsaWJjCiMgdmVyc2lvbnMgdGhhdCB3YXMgZ2VuZXJhdGVkIGJ5IHBpcCA4LjEuMiBhbmQgZWFybGllciBpcyB1c2VsZXNzIGFuZAojIG1pc2xlYWRpbmcuIFNvbHV0aW9uOiBpbnN0ZWFkIG9mIHVzaW5nIHBsYXRmb3JtLCB1c2Ugb3VyIGNvZGUgdGhhdCBhY3R1YWxseQojIHdvcmtzLgpkZWYgbGliY192ZXIoKToKICAgICIiIlRyeSB0byBkZXRlcm1pbmUgdGhlIGdsaWJjIHZlcnNpb24KCiAgICBSZXR1cm5zIGEgdHVwbGUgb2Ygc3RyaW5ncyAobGliLCB2ZXJzaW9uKSB3aGljaCBkZWZhdWx0IHRvIGVtcHR5IHN0cmluZ3MKICAgIGluIGNhc2UgdGhlIGxvb2t1cCBmYWlscy4KICAgICIiIgogICAgZ2xpYmNfdmVyc2lvbiA9IGdsaWJjX3ZlcnNpb25fc3RyaW5nKCkKICAgIGlmIGdsaWJjX3ZlcnNpb24gaXMgTm9uZToKICAgICAgICByZXR1cm4gKCIiLCAiIikKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuICgiZ2xpYmMiLCBnbGliY192ZXJzaW9uKQpQSwMEFAAAAAAAAAAhALxdoTlXFAAAVxQAACoAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2dsb2IucHkiIiIKRmlsZW5hbWUgZ2xvYmJpbmcgdXRpbGl0eS4gTW9zdGx5IGEgY29weSBvZiBgZ2xvYmAgZnJvbSBQeXRob24gMy41LgoKQ2hhbmdlcyBpbmNsdWRlOgogKiBgeWllbGQgZnJvbWAgYW5kIFBFUDMxMDIgYCpgIHJlbW92ZWQuCiAqIGBieXRlc2AgY2hhbmdlZCB0byBgc2l4LmJpbmFyeV90eXBlYC4KICogSGlkZGVuIGZpbGVzIGFyZSBub3QgaWdub3JlZC4KIiIiCgppbXBvcnQgb3MKaW1wb3J0IHJlCmltcG9ydCBmbm1hdGNoCmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4IGltcG9ydCBiaW5hcnlfdHlwZQoKX19hbGxfXyA9IFsiZ2xvYiIsICJpZ2xvYiIsICJlc2NhcGUiXQoKCmRlZiBnbG9iKHBhdGhuYW1lLCByZWN1cnNpdmU9RmFsc2UpOgogICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBwYXRocyBtYXRjaGluZyBhIHBhdGhuYW1lIHBhdHRlcm4uCgogICAgVGhlIHBhdHRlcm4gbWF5IGNvbnRhaW4gc2ltcGxlIHNoZWxsLXN0eWxlIHdpbGRjYXJkcyBhIGxhCiAgICBmbm1hdGNoLiBIb3dldmVyLCB1bmxpa2UgZm5tYXRjaCwgZmlsZW5hbWVzIHN0YXJ0aW5nIHdpdGggYQogICAgZG90IGFyZSBzcGVjaWFsIGNhc2VzIHRoYXQgYXJlIG5vdCBtYXRjaGVkIGJ5ICcqJyBhbmQgJz8nCiAgICBwYXR0ZXJucy4KCiAgICBJZiByZWN1cnNpdmUgaXMgdHJ1ZSwgdGhlIHBhdHRlcm4gJyoqJyB3aWxsIG1hdGNoIGFueSBmaWxlcyBhbmQKICAgIHplcm8gb3IgbW9yZSBkaXJlY3RvcmllcyBhbmQgc3ViZGlyZWN0b3JpZXMuCiAgICAiIiIKICAgIHJldHVybiBsaXN0KGlnbG9iKHBhdGhuYW1lLCByZWN1cnNpdmU9cmVjdXJzaXZlKSkKCgpkZWYgaWdsb2IocGF0aG5hbWUsIHJlY3Vyc2l2ZT1GYWxzZSk6CiAgICAiIiJSZXR1cm4gYW4gaXRlcmF0b3Igd2hpY2ggeWllbGRzIHRoZSBwYXRocyBtYXRjaGluZyBhIHBhdGhuYW1lIHBhdHRlcm4uCgogICAgVGhlIHBhdHRlcm4gbWF5IGNvbnRhaW4gc2ltcGxlIHNoZWxsLXN0eWxlIHdpbGRjYXJkcyBhIGxhCiAgICBmbm1hdGNoLiBIb3dldmVyLCB1bmxpa2UgZm5tYXRjaCwgZmlsZW5hbWVzIHN0YXJ0aW5nIHdpdGggYQogICAgZG90IGFyZSBzcGVjaWFsIGNhc2VzIHRoYXQgYXJlIG5vdCBtYXRjaGVkIGJ5ICcqJyBhbmQgJz8nCiAgICBwYXR0ZXJucy4KCiAgICBJZiByZWN1cnNpdmUgaXMgdHJ1ZSwgdGhlIHBhdHRlcm4gJyoqJyB3aWxsIG1hdGNoIGFueSBmaWxlcyBhbmQKICAgIHplcm8gb3IgbW9yZSBkaXJlY3RvcmllcyBhbmQgc3ViZGlyZWN0b3JpZXMuCiAgICAiIiIKICAgIGl0ID0gX2lnbG9iKHBhdGhuYW1lLCByZWN1cnNpdmUpCiAgICBpZiByZWN1cnNpdmUgYW5kIF9pc3JlY3Vyc2l2ZShwYXRobmFtZSk6CiAgICAgICAgcyA9IG5leHQoaXQpICAjIHNraXAgZW1wdHkgc3RyaW5nCiAgICAgICAgYXNzZXJ0IG5vdCBzCiAgICByZXR1cm4gaXQKCgpkZWYgX2lnbG9iKHBhdGhuYW1lLCByZWN1cnNpdmUpOgogICAgZGlybmFtZSwgYmFzZW5hbWUgPSBvcy5wYXRoLnNwbGl0KHBhdGhuYW1lKQogICAgaWYgbm90IGhhc19tYWdpYyhwYXRobmFtZSk6CiAgICAgICAgaWYgYmFzZW5hbWU6CiAgICAgICAgICAgIGlmIG9zLnBhdGgubGV4aXN0cyhwYXRobmFtZSk6CiAgICAgICAgICAgICAgICB5aWVsZCBwYXRobmFtZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgUGF0dGVybnMgZW5kaW5nIHdpdGggYSBzbGFzaCBzaG91bGQgbWF0Y2ggb25seSBkaXJlY3RvcmllcwogICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGRpcm5hbWUpOgogICAgICAgICAgICAgICAgeWllbGQgcGF0aG5hbWUKICAgICAgICByZXR1cm4KICAgIGlmIG5vdCBkaXJuYW1lOgogICAgICAgIGlmIHJlY3Vyc2l2ZSBhbmQgX2lzcmVjdXJzaXZlKGJhc2VuYW1lKToKICAgICAgICAgICAgZm9yIHggaW4gZ2xvYjIoZGlybmFtZSwgYmFzZW5hbWUpOgogICAgICAgICAgICAgICAgeWllbGQgeAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGZvciB4IGluIGdsb2IxKGRpcm5hbWUsIGJhc2VuYW1lKToKICAgICAgICAgICAgICAgIHlpZWxkIHgKICAgICAgICByZXR1cm4KICAgICMgYG9zLnBhdGguc3BsaXQoKWAgcmV0dXJucyB0aGUgYXJndW1lbnQgaXRzZWxmIGFzIGEgZGlybmFtZSBpZiBpdCBpcyBhCiAgICAjIGRyaXZlIG9yIFVOQyBwYXRoLiAgUHJldmVudCBhbiBpbmZpbml0ZSByZWN1cnNpb24gaWYgYSBkcml2ZSBvciBVTkMgcGF0aAogICAgIyBjb250YWlucyBtYWdpYyBjaGFyYWN0ZXJzIChpLmUuIHInXFw/XEM6JykuCiAgICBpZiBkaXJuYW1lICE9IHBhdGhuYW1lIGFuZCBoYXNfbWFnaWMoZGlybmFtZSk6CiAgICAgICAgZGlycyA9IF9pZ2xvYihkaXJuYW1lLCByZWN1cnNpdmUpCiAgICBlbHNlOgogICAgICAgIGRpcnMgPSBbZGlybmFtZV0KICAgIGlmIGhhc19tYWdpYyhiYXNlbmFtZSk6CiAgICAgICAgaWYgcmVjdXJzaXZlIGFuZCBfaXNyZWN1cnNpdmUoYmFzZW5hbWUpOgogICAgICAgICAgICBnbG9iX2luX2RpciA9IGdsb2IyCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZ2xvYl9pbl9kaXIgPSBnbG9iMQogICAgZWxzZToKICAgICAgICBnbG9iX2luX2RpciA9IGdsb2IwCiAgICBmb3IgZGlybmFtZSBpbiBkaXJzOgogICAgICAgIGZvciBuYW1lIGluIGdsb2JfaW5fZGlyKGRpcm5hbWUsIGJhc2VuYW1lKToKICAgICAgICAgICAgeWllbGQgb3MucGF0aC5qb2luKGRpcm5hbWUsIG5hbWUpCgoKIyBUaGVzZSAyIGhlbHBlciBmdW5jdGlvbnMgbm9uLXJlY3Vyc2l2ZWx5IGdsb2IgaW5zaWRlIGEgbGl0ZXJhbCBkaXJlY3RvcnkuCiMgVGhleSByZXR1cm4gYSBsaXN0IG9mIGJhc2VuYW1lcy4gYGdsb2IxYCBhY2NlcHRzIGEgcGF0dGVybiB3aGlsZSBgZ2xvYjBgCiMgdGFrZXMgYSBsaXRlcmFsIGJhc2VuYW1lIChzbyBpdCBvbmx5IGhhcyB0byBjaGVjayBmb3IgaXRzIGV4aXN0ZW5jZSkuCgoKZGVmIGdsb2IxKGRpcm5hbWUsIHBhdHRlcm4pOgogICAgaWYgbm90IGRpcm5hbWU6CiAgICAgICAgaWYgaXNpbnN0YW5jZShwYXR0ZXJuLCBiaW5hcnlfdHlwZSk6CiAgICAgICAgICAgIGRpcm5hbWUgPSBvcy5jdXJkaXIuZW5jb2RlKCdBU0NJSScpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZGlybmFtZSA9IG9zLmN1cmRpcgogICAgdHJ5OgogICAgICAgIG5hbWVzID0gb3MubGlzdGRpcihkaXJuYW1lKQogICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgcmV0dXJuIFtdCiAgICByZXR1cm4gZm5tYXRjaC5maWx0ZXIobmFtZXMsIHBhdHRlcm4pCgoKZGVmIGdsb2IwKGRpcm5hbWUsIGJhc2VuYW1lKToKICAgIGlmIG5vdCBiYXNlbmFtZToKICAgICAgICAjIGBvcy5wYXRoLnNwbGl0KClgIHJldHVybnMgYW4gZW1wdHkgYmFzZW5hbWUgZm9yIHBhdGhzIGVuZGluZyB3aXRoIGEKICAgICAgICAjIGRpcmVjdG9yeSBzZXBhcmF0b3IuICAncSp4Lycgc2hvdWxkIG1hdGNoIG9ubHkgZGlyZWN0b3JpZXMuCiAgICAgICAgaWYgb3MucGF0aC5pc2RpcihkaXJuYW1lKToKICAgICAgICAgICAgcmV0dXJuIFtiYXNlbmFtZV0KICAgIGVsc2U6CiAgICAgICAgaWYgb3MucGF0aC5sZXhpc3RzKG9zLnBhdGguam9pbihkaXJuYW1lLCBiYXNlbmFtZSkpOgogICAgICAgICAgICByZXR1cm4gW2Jhc2VuYW1lXQogICAgcmV0dXJuIFtdCgoKIyBUaGlzIGhlbHBlciBmdW5jdGlvbiByZWN1cnNpdmVseSB5aWVsZHMgcmVsYXRpdmUgcGF0aG5hbWVzIGluc2lkZSBhIGxpdGVyYWwKIyBkaXJlY3RvcnkuCgoKZGVmIGdsb2IyKGRpcm5hbWUsIHBhdHRlcm4pOgogICAgYXNzZXJ0IF9pc3JlY3Vyc2l2ZShwYXR0ZXJuKQogICAgeWllbGQgcGF0dGVybls6MF0KICAgIGZvciB4IGluIF9ybGlzdGRpcihkaXJuYW1lKToKICAgICAgICB5aWVsZCB4CgoKIyBSZWN1cnNpdmVseSB5aWVsZHMgcmVsYXRpdmUgcGF0aG5hbWVzIGluc2lkZSBhIGxpdGVyYWwgZGlyZWN0b3J5LgpkZWYgX3JsaXN0ZGlyKGRpcm5hbWUpOgogICAgaWYgbm90IGRpcm5hbWU6CiAgICAgICAgaWYgaXNpbnN0YW5jZShkaXJuYW1lLCBiaW5hcnlfdHlwZSk6CiAgICAgICAgICAgIGRpcm5hbWUgPSBiaW5hcnlfdHlwZShvcy5jdXJkaXIsICdBU0NJSScpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZGlybmFtZSA9IG9zLmN1cmRpcgogICAgdHJ5OgogICAgICAgIG5hbWVzID0gb3MubGlzdGRpcihkaXJuYW1lKQogICAgZXhjZXB0IG9zLmVycm9yOgogICAgICAgIHJldHVybgogICAgZm9yIHggaW4gbmFtZXM6CiAgICAgICAgeWllbGQgeAogICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oZGlybmFtZSwgeCkgaWYgZGlybmFtZSBlbHNlIHgKICAgICAgICBmb3IgeSBpbiBfcmxpc3RkaXIocGF0aCk6CiAgICAgICAgICAgIHlpZWxkIG9zLnBhdGguam9pbih4LCB5KQoKCm1hZ2ljX2NoZWNrID0gcmUuY29tcGlsZSgnKFsqP1tdKScpCm1hZ2ljX2NoZWNrX2J5dGVzID0gcmUuY29tcGlsZShiJyhbKj9bXSknKQoKCmRlZiBoYXNfbWFnaWMocyk6CiAgICBpZiBpc2luc3RhbmNlKHMsIGJpbmFyeV90eXBlKToKICAgICAgICBtYXRjaCA9IG1hZ2ljX2NoZWNrX2J5dGVzLnNlYXJjaChzKQogICAgZWxzZToKICAgICAgICBtYXRjaCA9IG1hZ2ljX2NoZWNrLnNlYXJjaChzKQogICAgcmV0dXJuIG1hdGNoIGlzIG5vdCBOb25lCgoKZGVmIF9pc3JlY3Vyc2l2ZShwYXR0ZXJuKToKICAgIGlmIGlzaW5zdGFuY2UocGF0dGVybiwgYmluYXJ5X3R5cGUpOgogICAgICAgIHJldHVybiBwYXR0ZXJuID09IGInKionCiAgICBlbHNlOgogICAgICAgIHJldHVybiBwYXR0ZXJuID09ICcqKicKCgpkZWYgZXNjYXBlKHBhdGhuYW1lKToKICAgICIiIkVzY2FwZSBhbGwgc3BlY2lhbCBjaGFyYWN0ZXJzLgogICAgIiIiCiAgICAjIEVzY2FwaW5nIGlzIGRvbmUgYnkgd3JhcHBpbmcgYW55IG9mICIqP1siIGJldHdlZW4gc3F1YXJlIGJyYWNrZXRzLgogICAgIyBNZXRhY2hhcmFjdGVycyBkbyBub3Qgd29y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CNCJhej9///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+bYtF5IsIg/n/dFaD+f50UYoDqAF0S6gIdQtR/xVA4EAAhcB0PIt14IvGwfgFg+YfweYGAzSFoCpBAItF5IsAiQaKA4hGBGigDwAAjUYMUOiEKgAAWVmFwA+EyQAAAP9GCP9F4EODReQEOX3gfJMz24vz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jSDl//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/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ADIALgBEAEwATAAAAAAARGVjb2RlUG9pbnRlcgAAAEZsc0ZyZWUARmxzU2V0VmFsdWUARmxzR2V0VmFsdWUARmxzQWxsb2MAAAAAcnVudGltZSBlcnJvciAAAA0KAABUTE9TUyBlcnJvcg0KAAAAU0lORyBlcnJvcg0KAAAAAERPTUFJTiBlcnJvcg0KAABSNjAzNA0KQW4gYXBwbGljYXRpb24gaGFzIG1hZGUgYW4gYXR0ZW1wdCB0byBsb2FkIHRoZSBDIHJ1bnRpbWUgbGlicmFyeSBpbmNvcnJlY3RseS4KUGxlYXNlIGNvbnRhY3QgdGhlIGFwcGxpY2F0aW9uJ3Mgc3VwcG9ydCB0ZWFtIGZvciBtb3JlIGluZm9ybWF0aW9uLg0KAAAAAAAAUjYwMzMNCi0gQXR0ZW1wdCB0byB1c2UgTVNJTCBjb2RlIGZyb20gdGhpcyBhc3NlbWJseSBkdXJpbmcgbmF0aXZlIGNvZGUgaW5pdGlhbGl6YXRpb24KVGhpcyBpbmRpY2F0ZXMgYSBidWcgaW4geW91ciBhcHBsaWNhdGlvbi4gSXQgaXMgbW9zdCBsaWtlbHkgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIGFuIE1TSUwtY29tcGlsZWQgKC9jbHIpIGZ1bmN0aW9uIGZyb20gYSBuYXRpdmUgY29uc3RydWN0b3Igb3IgZnJvbSBEbGxNYWluLg0KAABSNjAzMg0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBsb2NhbGUgaW5mb3JtYXRpb24NCgAAAAAAAFI2MDMxDQotIEF0dGVtcHQgdG8gaW5pdGlhbGl6ZSB0aGUgQ1JUIG1vcmUgdGhhbiBvbmNlLgpUaGlzIGluZGljYXRlcyBhIGJ1ZyBpbiB5b3VyIGFwcGxpY2F0aW9uLg0KAABSNjAzMA0KLSBDUlQgbm90IGluaXRpYWxpemVkDQoAAFI2MDI4DQotIHVuYWJsZSB0byBpbml0aWFsaXplIGhlYXANCgAAAABSNjAyNw0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBsb3dpbyBpbml0aWFsaXphdGlvbg0KAAAAAFI2MDI2DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIHN0ZGlvIGluaXRpYWxpemF0aW9uDQoAAAAAUjYwMjUNCi0gcHVyZSB2aXJ0dWFsIGZ1bmN0aW9uIGNhbGwNCgAAAFI2MDI0DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIF9vbmV4aXQvYXRleGl0IHRhYmxlDQoAAAAAUjYwMTkNCi0gdW5hYmxlIHRvIG9wZW4gY29uc29sZSBkZXZpY2UNCgAAAABSNjAxOA0KLSB1bmV4cGVjdGVkIGhlYXAgZXJyb3INCgAAAABSNjAxNw0KLSB1bmV4cGVjdGVkIG11bHRpdGhyZWFkIGxvY2sgZXJyb3INCgAAAABSNjAxNg0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciB0aHJlYWQgZGF0YQ0KAA0KVGhpcyBhcHBsaWNhdGlvbiBoYXMgcmVxdWVzdGVkIHRoZSBSdW50aW1lIHRvIHRlcm1pbmF0ZSBpdCBpbiBhbiB1bnVzdWFsIHdheS4KUGxlYXNlIGNvbnRhY3QgdGhlIGFwcGxpY2F0aW9uJ3Mgc3VwcG9ydCB0ZWFtIGZvciBtb3JlIGluZm9ybWF0aW9uLg0KAAAAUjYwMDkNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgZW52aXJvbm1lbnQNCgBSNjAwOA0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBhcmd1bWVudHMNCgAAAFI2MDAyDQotIGZsb2F0aW5nIHBvaW50IHN1cHBvcnQgbm90IGxvYWRlZA0KAAAAAE1pY3Jvc29mdCBWaXN1YWwgQysrIFJ1bnRpbWUgTGlicmFyeQAAAAAKCgAALi4uADxwcm9ncmFtIG5hbWUgdW5rbm93bj4AAFJ1bnRpbWUgRXJyb3IhCgpQcm9ncmFtOiAAAAAAAAAABQAAwAsAAAAAAAAAHQAAwAQAAAAAAAAAlgAAwAQAAAAAAAAAjQAAwAgAAAAAAAAAjgAAwAgAAAAAAAAAjwAAwAgAAAAAAAAAkAAAwAgAAAAAAAAAkQAAwAgAAAAAAAAAkgAAwAgAAAAAAAAAkwAAwAgAAAAAAAAABoCAhoCBgAAAEAOGgIaCgBQFBUVFRYWFhQUAADAwgFCAiAAIACgnOFBXgAAHADcwMFBQiAAAACAogIiAgAAAAGBoYGhoaAgIB3hwcHdwcAgIAAAIAAgABwgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAIAAgACAAIAAgACAAIAAgACgAKAAoACgAKAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABIABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAIQAhACEAIQAhACEAIQAhACEAIQAEAAQABAAEAAQABAAEACBAIEAgQCBAIEAgQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAEAAQABAAEAAQABAAggCCAIIAggCCAIIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABAAEAAQABAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgACAAIAAgACAAIAAgACAAIABoACgAKAAoACgAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAASAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACEAIQAhACEAIQAhACEAIQAhACEABAAEAAQABAAEAAQABAAgQGBAYEBgQGBAYEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB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AAAAyP///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/BFRsc1NldFZhbHVlAD0EVGxzRnJlZQD0A1NldExhc3RFcnJvcgAArgFHZXRDdXJyZW50VGhyZWFkSWQAAJcEV3JpdGVGaWxlAPYCTG9hZExpYnJhcnlBAAC6AkluaXRpYWxpemVDcml0aWNhbFNlY3Rpb25BbmRTcGluQ291bnQASwFGcmVlRW52aXJvbm1lbnRTdHJpbmdzQQDAAUdldEVudmlyb25tZW50U3RyaW5ncwBMAUZyZWVFbnZpcm9ubWVudFN0cmluZ3NXAIQEV2lkZUNoYXJUb011bHRpQnl0ZQDCAUdldEVudmlyb25tZW50U3RyaW5nc1cAAKQCSGVhcENyZWF0ZQAAYQRWaXJ0dWFsRnJlZQBZA1F1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyAGoCR2V0VGlja0NvdW50AACrAUdldEN1cnJlbnRQcm9jZXNzSWQAUwJHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZQCaA1J0bFVud2luZACpAkhlYXBSZUFsbG9jAF4EVmlydHVhbEFsbG9jAACEAUdldENvbnNvbGVDUAAAlgFHZXRDb25zb2xlTW9kZQAAQgFGbHVzaEZpbGVCdWZmZXJzAADmAkxDTWFwU3RyaW5nQQAAHwNNdWx0aUJ5dGVUb1dpZGVDaGFyAOgCTENNYXBTdHJpbmdXAABAAkdldFN0cmluZ1R5cGVBAABDAkdldFN0cmluZ1R5cGVXAADpAUdldExvY2FsZUluZm9BAADnA1NldEZpbGVQb2ludGVyAACrAkhlYXBTaXplAABEAENsb3NlSGFuZGxlAIwEV3JpdGVDb25zb2xlQQCaAUdldENvbnNvbGVP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AAAAAAAAUjYwMzMNCi0gQXR0ZW1wdCB0byB1c2UgTVNJTCBjb2RlIGZyb20gdGhpcyBhc3NlbWJseSBkdXJpbmcgbmF0aXZlIGNvZGUgaW5pdGlhbGl6YXRpb24KVGhpcyBpbmRpY2F0ZXMgYSBidWcgaW4geW91ciBhcHBsaWNhdGlvbi4gSXQgaXMgbW9zdCBsaWtlbHkgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIGFuIE1TSUwtY29tcGlsZWQgKC9jbHIpIGZ1bmN0aW9uIGZyb20gYSBuYXRpdmUgY29uc3RydWN0b3Igb3IgZnJvbSBEbGxNYWluLg0KAABSNjAzMg0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBsb2NhbGUgaW5mb3JtYXRpb24NCgAAAAAAAFI2MDMxDQotIEF0dGVtcHQgdG8gaW5pdGlhbGl6ZSB0aGUgQ1JUIG1vcmUgdGhhbiBvbmNlLgpUaGlzIGluZGljYXRlcyBhIGJ1ZyBpbiB5b3VyIGFwcGxpY2F0aW9uLg0KAAAAAAAAUjYwMzANCi0gQ1JUIG5vdCBpbml0aWFsaXplZA0KAABSNjAyOA0KLSB1bmFibGUgdG8gaW5pdGlhbGl6ZSBoZWFwDQoAAAAAUjYwMjcNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgbG93aW8gaW5pdGlhbGl6YXRpb24NCgAAAABSNjAyNg0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBzdGRpbyBpbml0aWFsaXphdGlvbg0KAAAAAFI2MDI1DQotIHB1cmUgdmlydHVhbCBmdW5jdGlvbiBjYWxsDQoAAABSNjAyNA0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBfb25leGl0L2F0ZXhpdCB0YWJsZQ0KAAAAAFI2MDE5DQotIHVuYWJsZSB0byBvcGVuIGNvbnNvbGUgZGV2aWNlDQoAAAAAAAAAAFI2MDE4DQotIHVuZXhwZWN0ZWQgaGVhcCBlcnJvcg0KAAAAAAAAAABSNjAxNw0KLSB1bmV4cGVjdGVkIG11bHRpdGhyZWFkIGxvY2sgZXJyb3INCgAAAABSNjAxNg0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciB0aHJlYWQgZGF0YQ0KAAAAAAAAAAAAAAAAAA0KVGhpcyBhcHBsaWNhdGlvbiBoYXMgcmVxdWVzdGVkIHRoZSBSdW50aW1lIHRvIHRlcm1pbmF0ZSBpdCBpbiBhbiB1bnVzdWFsIHdheS4KUGxlYXNlIGNvbnRhY3QgdGhlIGFwcGxpY2F0aW9uJ3Mgc3VwcG9ydCB0ZWFtIGZvciBtb3JlIGluZm9ybWF0aW9uLg0KAAAAUjYwMDkNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgZW52aXJvbm1lbnQNCgAAAAAAUjYwMDgNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgYXJndW1lbnRzDQoAAAAAAAAAUjYwMDINCi0gZmxvYXRpbmcgcG9pbnQgc3VwcG9ydCBub3QgbG9hZGVkDQoAAAAATWljcm9zb2Z0IFZpc3VhbCBDKysgUnVudGltZSBMaWJyYXJ5AAAAAAoKAAAuLi4APHByb2dyYW0gbmFtZSB1bmtub3duPgAAUnVudGltZSBFcnJvciEKClByb2dyYW06IAAAAAAAAAAFAADACwAAAAAAAAAAAAAAHQAAwAQAAAAAAAAAAAAAAJYAAMAEAAAAAAAAAAAAAACNAADACAAAAAAAAAAAAAAAjgAAwAgAAAAAAAAAAAAAAI8AAMAIAAAAAAAAAAAAAACQAADACAAAAAAAAAAAAAAAkQAAwAgAAAAAAAAAAAAAAJIAAMAIAAAAAAAAAAAAAACTAADACAAAAAAAAAAAAAAABoCAhoCBgAAAEAOGgIaCgBQFBUVFRYWFhQUAADAwgFCAiAAIACgnOFBXgAAHADcwMFBQiAAAACAogIiAgAAAAGBoYGhoaAgIB3hwcHdwcAgIAAAIAAgABwgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAIAAgACAAIAAgACAAIAAgACgAKAAoACgAKAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABIABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAIQAhACEAIQAhACEAIQAhACEAIQAEAAQABAAEAAQABAAEACBAIEAgQCBAIEAgQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAEAAQABAAEAAQABAAggCCAIIAggCCAIIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABAAEAAQABAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgACAAIAAgACAAIAAgACAAIABoACgAKAAoACgAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAASAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACEAIQAhACEAIQAhACEAIQAhACEABAAEAAQABAAEAAQABAAgQGBAYEBgQGBAYEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBARAAEAAQABAAEAAQAIIBggGCAYIBggGCAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgEQABAAEAAQACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAEgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABQAFAAQABAAEAAQABAAFAAQABAAEAAQABAAEAABAQEB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cgDQAklzRGVidWdnZXJQcmVzZW50AJ8DUnRsVmlydHVhbFVud2luZAAAmANSdGxMb29rdXBGdW5jdGlvbkVudHJ5AACRA1J0bENhcHR1cmVDb250ZXh0AOcBR2V0TGFzdEVycm9yAACmAkhlYXBGcmVlAACiAkhlYXBBbGxvYwBdAUdldENQSW5mbwBUAUdldEFDUAAAFAJHZXRPRU1DUAAA2gJJc1ZhbGlkQ29kZVBhZ2UA1wBFbmNvZGVQb2ludGVyALkARGVjb2RlUG9pbnRlcgBAAUZsc0dldFZhbHVlAEEBRmxzU2V0VmFsdWUAPwFGbHNGcmVlAPgDU2V0TGFzdEVycm9yAACvAUdldEN1cnJlbnRUaHJlYWRJZAAAPgFGbHNBbGxvYwAAmwRXcml0ZUZpbGUA8AJMb2FkTGlicmFyeUEAALoCSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbkFuZFNwaW5Db3VudABMAUZyZWVFbnZpcm9ubWVudFN0cmluZ3NBAMEBR2V0RW52aXJvbm1lbnRTdHJpbmdzAE0BRnJlZUVudmlyb25tZW50U3RyaW5nc1cAiARXaWRlQ2hhclRvTXVsdGlCeXRlAMMBR2V0RW52aXJvbm1lbnRTdHJpbmdzVwAAqgJIZWFwU2V0SW5mb3JtYXRpb24AAKQCSGVhcENyZWF0ZQAAUwNRdWVyeVBlcmZvcm1hbmNlQ291bnRlcgBqAkdldFRpY2tDb3VudAAArAFHZXRDdXJyZW50UHJvY2Vzc0lkAFMCR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUAqQJIZWFwUmVBbGxvYwCFAUdldENvbnNvbGVDUAAAlwFHZXRDb25zb2xlTW9kZQAAQwFGbHVzaEZpbGVCdWZmZXJzAADgAkxDTWFwU3RyaW5nQQAAGQNNdWx0aUJ5dGVUb1dpZGVDaGFyAOICTENNYXBTdHJpbmdXAABAAkdldFN0cmluZ1R5cGVBAABDAkdldFN0cmluZ1R5cGVXAADpAUdldExvY2FsZUluZm9BAADsA1NldEZpbGVQb2ludGVyAACrAkhlYXBTaXplAABEAENsb3NlSGFuZGxlAJAEV3JpdGVDb25zb2xlQQCbAUdldENvbnNvbGVPdXRwdXRDUAAAmgRXcml0ZUNvbnNvbGVXAAoEU2V0U3Rk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DgAAg8QUgL2w/f//AHQKi4Ws/f//g2Bw/YPI/+nICgAA9kYMQHVeVuhADQAAWbqYEkEAg/j/dBuD+P50FovIg+Efi/DB/gXB4QYDDLWgKkEA6wKLyvZBJH91kYP4/3QZg/j+dBSLyIPgH8H5BcHgBgMEjaAqQQDrAovC9kAkgA+FZ////zPJO9kPhF3///+KE4mN2P3//4mN4P3//4mNvP3//4iV7/3//4TSD4QfCgAAQ4O92P3//wCJncT9//8PjAsKAACKwiwgPFh3EQ++wg++gFjiQACD4A8z9usEM/YzwA++hMF44kAAagfB+ARZiYWU/f//O8EPh60JAAD/JIULM0AAg43o/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//6Ag9AABZhcCKhe/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//1DoSzsAAIPEEIXAdB/HhcD9//8BAAAA6xOKR/yIhfT9///HheD9//8BAAAAjYX0/f//iYXk/f//6TUEAACLB4PHBIm93P3//zvGdDuLSAQ7znQ094Xw/f//AAgAAA+/AImN5P3//3QUmSvC0fjHhcj9//8BAAAA6fADAACJtcj9///p5QMAAKGQEkEAiYXk/f//UOjCOAAAWenOAwAAg/hwD4/7AQAAD4TjAQAAg/hlD4y8AwAAg/hnD440/v//g/hpdHGD+G50KIP4bw+FoAMAAPaF8P3//4DHheD9//8IAAAAdGGBjfD9//8AAgAA61WLN4PHBIm93P3//+g6OAAAhcAPhC/6///2hfD9//8gdAxmi4XY/f//ZokG6wiLhdj9//+JBseFwP3//wEAAADppgQAAION8P3//0DHheD9//8KAAAAi43w/f//98EAgAAAD4SpAQAAiweLVwSDxwjp1QEAAHURgPpndWXHhej9//8BAAAA61k5hej9//9+BomF6P3//4G96P3//6MAAAB+P4u16P3//4HGXQEAAFboIgsAAIqV7/3//1mJhbz9//+FwHQQiYXk/f//ibWg/f//i9jrCseF6P3//6MAAAAz9osHg8cIiYWI/f//i0f8iYWM/f//jYWk/f//UP+1kP3//w++wv+16P3//4m93P3//1D/taD9//+NhYj9//9TUP81WBxBAOhBIAAAWf/Qi73w/f//g8QcgeeAAAAAdCA5tej9//91GI2FpP3//1BT/zVkHEEA6BIgAABZ/9BZWYC97/3//2d1HDv+dRiNhaT9//9QU/81YBxBAOjtHwAAWf/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//5lSUFNX6OQ3AACDwTCD+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//0ZQRujlNQAAg8QQhcB1KDmFmP3//3Qg/7WY/f//jYXY/f//jU306PH0//+DvaD9//8AWXW16xyDjdj9////6xOLjeT9//9QjYXY/f//6Mr0//9Zg73Y/f//AHwb9oXw/f//BHQSV1NqII2F2P3//+iC9P//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AABqAI2FPOX//1BqAY1F9FCLhSjl//+LAMZF9A3/NAf/FZjgQACFwA+E0AMAAIO9POX//wEPjM8DAAD/hTDl////hTjl///pgwAAADwBdAQ8AnUhD7czM8lmg/4KD5TBQ0ODhUTl//8CibVA5f//iY0g5f//PAF0BDwCdVL/tUDl///oJSUAAFlmO4VA5f//D4VoAwAAg4U45f//AoO9IOX//wB0KWoNWFCJhUDl///o+CQAAFlmO4VA5f//D4U7AwAA/4U45f///4Uw5f//i0UQOYVE5f//D4L5/f//6ScDAACLDooT/4U45f//iFQPNIsOiUQPOOkOAwAAM8mLBgPH9kAEgA+EvwIAAIuFNOX//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//91FOiytv//xwAJAAAA6Lq2//+JMOs//7VA5f//6L62//9Z6zGLtSjl//+LBvZEBwRAdA+LhTTl//+AOBp1BDPA6yTocrb//8cAHAAAAOh6tv//gyAAg8j/6wyLhTjl//8rhTDl//9fW4tN/DPNXujYnf//ycNqEGjw90AA6IS2//+LRQiD+P51G+g+tv//gyAA6CO2///HAAkAAACDyP/pnQAAADP/O8d8CDsFkCpBAHIh6BW2//+JOOj7tf//xwAJAAAAV1dXV1fog7X//4PEFOvJi8jB+QWNHI2gKkEAi/CD5h/B5gaLCw++TDEEg+EBdL9Q6DkkAABZiX38iwP2RDAEAXQW/3UQ/3UM/3UI6C74//+DxAyJReTrFuiYtf//xwAJAAAA6KC1//+JOINN5P/HRfz+////6AkAAACLReToBLb//8P/dQjogyQAAFnDahBoEPhAAOiotf//i0UIg/j+dRPoT7X//8cACQAAAIPI/+mqAAAAM9s7w3wIOwWQKkEAchroLrX//8cACQAAAFNTU1NT6La0//+DxBTr0IvIwfkFjTyNoCpBAIvwg+YfweYGiw8PvkwOBIPhAXTGUOhsIwAAWYld/IsH9kQGBAF0Mf91COjgIgAAWVD/FeTgQACFwHUL/xVc4EAAiUXk6wOJXeQ5XeR0GejNtP//i03kiQjosLT//8cACQAAAINN5P/HRfz+////6AkAAACLReToI7X//8P/dQjooiMAAFnDi/9Vi+yD7BBTM9s5XQh1HOhytP//U1NTU1PHABYAAADo+rP//4PEFDPA62pWi3UMO/N1GuhOtP//U1NTU1PHABYAAADo1rP//4PEFOsFOXUIcgQzwOs+/3UQjU3w6Mab//+LTfSNRv85WQh0HEg5RQh3Cg+2EPZECh0EdfCLzivIg+EBK/FOi8Y4Xfx0B4tN+INhcP1eW8nDi/9Vi+xqAP91DP91COhV////g8QMXcOL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hdt0aY0EP1BqAFPoTpD//4PEDFdT/3UQ/3UMagH/dRj/1oXAdBH/dRRQU/91CP8V+OBAAIlF+FPoyfr//4tF+FnrdTP2OV0cdQiLB4tAFIlFHDldGHUIiweLQASJRRj/dRzoQR0AAFmD+P91BDPA60c7RRh0HlNTjU0QUf91DFD/dRjoaR0AAIvwg8QYO/N03Il1DP91FP91EP91DP91CP91HP8V9OBAAIv4O/N0B1bohq///1mLx41l7F9eW4tN/DPN6JiT///Jw4v/VYvsg+wQ/3UIjU3w6JKT////dSSNTfD/dSD/dRz/dRj/dRT/dRD/dQzoFv7//4PEHIB9/AB0B4tN+INhcP3Jw4v/VYvsVot1CIX2D4SBAQAA/3YE6Bav////dgjoDq////92DOgGr////3YQ6P6u////dhTo9q7///92GOjurv///zbo567///92IOjfrv///3Yk6Neu////dijoz67///92LOjHrv///3Yw6L+u////djTot67///92HOivrv///3Y46Keu////djzon67//4PEQP92QOiUrv///3ZE6Iyu////dkjohK7///92TOh8rv///3ZQ6HSu////dlTobK7///92WOhkrv///3Zc6Fyu////dmDoVK7///92ZOhMrv///3Zo6ESu////dmzoPK7///92cOg0rv///3Z06Cyu////dnjoJK7///92fOgcrv//g8RA/7aAAAAA6A6u////toQAAADoA67///+2iAAAAOj4rf///7aMAAAA6O2t////tpAAAADo4q3///+2lAAAAOjXrf///7aYAAAA6Myt////tpwAAADowa3///+2oAAAAOi2rf///7akAAAA6Kut////tqgAAADooK3//4PELF5dw4v/VYvsVot1CIX2dDWLBjsFSB1BAHQHUOh9rf//WYtGBDsFTB1BAHQHUOhrrf//WYt2CDs1UB1BAHQHVuhZrf//WV5dw4v/VYvsVot1CIX2dH6LRgw7BVQdQQB0B1DoN63//1mLRhA7BVgdQQB0B1DoJa3//1mLRhQ7BVwdQQB0B1DoE63//1mLRhg7BWAdQQB0B1DoAa3//1mLRhw7BWQdQQB0B1Do76z//1mLRiA7BWgdQQB0B1Do3az//1mLdiQ7NWwdQQB0B1boy6z//1leXcOL/1WL7ItFCFMz21ZXO8N0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bHkgZHVyaW5nIG5hdGl2ZSBjb2RlIGluaXRpYWxpemF0aW9uClRoaXMgaW5kaWNhdGVzIGEgYnVnIGluIHlvdXIgYXBwbGljYXRpb24uIEl0IGlzIG1vc3QgbGlrZWx5IHRoZSByZXN1bHQgb2YgY2FsbGluZyBhbiBNU0lMLWNvbXBpbGVkICgvY2xyKSBmdW5jdGlvbiBmcm9tIGEgbmF0aXZlIGNvbnN0cnVjdG9yIG9yIGZyb20gRGxsTWFpbi4NCgAAUjYwMzINCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgbG9jYWxlIGluZm9ybWF0aW9uDQoAAAAAAABSNjAzMQ0KLSBBdHRlbXB0IHRvIGluaXRpYWxpemUgdGhlIENSVCBtb3JlIHRoYW4gb25jZS4KVGhpcyBpbmRpY2F0ZXMgYSBidWcgaW4geW91ciBhcHBsaWNhdGlvbi4NCgAAUjYwMzANCi0gQ1JUIG5vdCBpbml0aWFsaXplZA0KAABSNjAyOA0KLSB1bmFibGUgdG8gaW5pdGlhbGl6ZSBoZWFwDQoAAAAAUjYwMjcNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgbG93aW8gaW5pdGlhbGl6YXRpb24NCgAAAABSNjAyNg0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBzdGRpbyBpbml0aWFsaXphdGlvbg0KAAAAAFI2MDI1DQotIHB1cmUgdmlydHVhbCBmdW5jdGlvbiBjYWxsDQoAAABSNjAyNA0KLSBub3QgZW5vdWdoIHNwYWNlIGZvciBfb25leGl0L2F0ZXhpdCB0YWJsZQ0KAAAAAFI2MDE5DQotIHVuYWJsZSB0byBvcGVuIGNvbnNvbGUgZGV2aWNlDQoAAAAAUjYwMTgNCi0gdW5leHBlY3RlZCBoZWFwIGVycm9yDQoAAAAAUjYwMTcNCi0gdW5leHBlY3RlZCBtdWx0aXRocmVhZCBsb2NrIGVycm9yDQoAAAAAUjYwMTYNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgdGhyZWFkIGRhdGENCgANClRoaXMgYXBwbGljYXRpb24gaGFzIHJlcXVlc3RlZCB0aGUgUnVudGltZSB0byB0ZXJtaW5hdGUgaXQgaW4gYW4gdW51c3VhbCB3YXkuClBsZWFzZSBjb250YWN0IHRoZSBhcHBsaWNhdGlvbidzIHN1cHBvcnQgdGVhbSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4NCgAAAFI2MDA5DQotIG5vdCBlbm91Z2ggc3BhY2UgZm9yIGVudmlyb25tZW50DQoAUjYwMDgNCi0gbm90IGVub3VnaCBzcGFjZSBmb3IgYXJndW1lbnRzDQoAAABSNjAwMg0KLSBmbG9hdGluZyBwb2ludCBzdXBwb3J0IG5vdCBsb2FkZWQNCgAAAABNaWNyb3NvZnQgVmlzdWFsIEMrKyBSdW50aW1lIExpYnJhcnkAAAAACgoAAC4uLgA8cHJvZ3JhbSBuYW1lIHVua25vd24+AABSdW50aW1lIEVycm9yIQoKUHJvZ3JhbTogAAAAAAAAAAUAAMALAAAAAAAAAB0AAMAEAAAAAAAAAJYAAMAEAAAAAAAAAI0AAMAIAAAAAAAAAI4AAMAIAAAAAAAAAI8AAMAIAAAAAAAAAJAAAMAIAAAAAAAAAJEAAMAIAAAAAAAAAJIAAMAIAAAAAAAAAJMAAMAIAAAAAAAAAAaAgIaAgYAAABADhoCGgoAUBQVFRUWFhYUFAAAwMIBQgIgACAAoJzhQV4AABwA3MDBQUIgAAAAgKICIgIAAAABgaGBoaGgICAd4cHB3cHAICAAACAAIAAcIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgACAAIAAgACAAIAAgACAAIAAoACgAKAAoACgAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAASAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACEAIQAhACEAIQAhACEAIQAhACEABAAEAAQABAAEAAQABAAgQCBAIEAgQCBAIEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABAAEAAQABAAEAAQAIIAggCCAIIAggCCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAQABAAEAAQACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAgACAAIAAgACAAIAAgACAAaAAoACgAKAAoACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAEgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAhACEAIQAhACEAIQAhACEAIQAhAAQABAAEAAQABAAEAAQAIEBgQGBAYEBgQGBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEQABAAEAAQABAAEACCAYIBggGCAYIBggECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBEAAQABAAEAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABIABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAUABQAEAAQABAAEAAQABQAEAAQABAAEAAQABAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBARAAAQEBAQEBAQEBAQEBAQECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgECAQIBAgEQAAIBAgECAQIBAgECAQIBAgEBAQAAAACAgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/wABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5/gIGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6vsLGys7S1tre4ubq7vL2+v8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx8vP09fb3+Pn6+/z9/v+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/wABAgMEBQYHCAkKCwwNDg8QERITFBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXF1eX2BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWnt8fX5/gIGCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6vsLGys7S1tre4ubq7vL2+v8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx8vP09fb3+Pn6+/z9/v9ISDptbTpzcwAAAABkZGRkLCBNTU1NIGRkLCB5eXl5AE1NL2RkL3l5AAAAAFBNAABBTQAARGVjZW1iZXIAAAAATm92ZW1iZXIAAAAAT2N0b2JlcgBTZXB0ZW1iZXIAAABBdWd1c3QAAEp1bHkAAAAASnVuZQAAAABBcHJpbAAAAE1hcmNoAAAARmVicnVhcnkAAAAASmFudWFyeQBEZWMATm92AE9jdABTZXAAQXVnAEp1bABKdW4ATWF5AEFwcgBNYXIARmViAEphbgBTYXR1cmRheQAAAABGcmlkYXkAAFRodXJzZGF5AAAAAFdlZG5lc2RheQAAAFR1ZXNkYXkATW9uZGF5AABTdW5kYXkAAFNhdABGcmkAVGh1AFdlZABUdWUATW9uAFN1bgBHZXRQcm9jZXNzV2luZG93U3RhdGlvbgBHZXRVc2VyT2JqZWN0SW5mb3JtYXRpb25BAAAAR2V0TGFzdEFjdGl2ZVBvcHVwAABHZXRBY3RpdmVXaW5kb3cATWVzc2FnZUJveEEAVVNFUjMyLkRMTAAAU3VuTW9uVHVlV2VkVGh1RnJpU2F0AAAASmFuRmViTWFyQXByTWF5SnVuSnVsQXVnU2VwT2N0Tm92RGVjAAAAAENPTk9VVCQALmNvbQAAAAAuZXhlAAAAAC5iYXQAAAAALmNtZAAAAAAuXAAAU3lzdGVtUm9vdAAAAAAAAEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIASQQDQ9EAAAwAAAAA4AACwaQAAoJkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAA3BhAAAAAAAD+////AAAAAMj///8AAAAA/v///wAAAAC8I0AAAAAAAP7///8AAAAAiP///wAAAAD+////+iVAAP4lQAD+////wCVAANQlQAD+////AAAAAIz///8AAAAA/v///2g1QABsNUAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAABM7QAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAA4TtAAAAAAAD+////AAAAAMz///8AAAAA/v///wAAAABrPUAAAAAAAAAAAAA3PUAA/v///wAAAADU////AAAAAP7///8AAAAA8D5AAAAAAAD+////AAAAANT///8AAAAA/v///wAAAAAjQEAAAAAAAP7///8AAAAA1P///wAAAAD+////TUFAAGlBQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAXUdAAAAAAAD+////AAAAAMz///8AAAAA/v///wAAAAArS0AAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAJtOQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAA3VBAAP7///8AAAAA7FBAAP7///8AAAAA2P///wAAAAD+////AAAAAJ9SQAD+////AAAAAKtSQAD+////AAAAANT///8AAAAA/v///wAAAABlWUAAAAAAAP7///8AAAAA2P///wAAAAD+////C1tAAB9bQAAAAAAA/v///wAAAADY////AAAAAP7///9dW0AAYVtAAAAAAAD+////AAAAAMD///8AAAAA/v///wAAAAC4XkAAAAAAAP7///8AAAAA0P///wAAAAD+////SF9AAF9fQAAAAAAA/v///wAAAADU////AAAAAP7///8AAAAAuWpAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAADKbEAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAM55QAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAA3oFAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAAC/gkAAAAAAAP7///8AAAAAzP///wAAAAD+////AAAAALSVQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAATZhAAAAAAAD+////AAAAAND///8AAAAA/v///wAAAADkoUAAAAAAAP7///8AAAAA1P///wAAAAD+////AAAAAFumQAAAAAAA/v///wAAAADI////AAAAAP7///8AAAAAIahAAAAAAAAAAAAAXadAAP7///8AAAAA0P///wAAAAD+////AAAAANyuQAAAAAAA/v///wAAAADQ////AAAAAP7///8AAAAA+MJAAAAAAAD+////AAAAAMz///8AAAAA/v///wAAAACbykAAXPkAAAAAAAAAAAAAFgABAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJz6AAC4+gAAzvoAAOT6AAD2+gAADvsAACT7AAA8+wAAVPsAAGj7AABw+wAAgvsAAJD7AACi+wAAtPsAAMb7AADW+wAA5PsAAPz7AAAQ/AAAJPwAAED8AABe/AAAcvwAAIL8AACO/AAAmvwAAKb8AAC+/AAA1vwAAOD8AADs/AAA/vwAAAz9AAAY/QAAJv0AADD9AABA/QAAVv0AAGL9AABy/QAAmv0AALT9AADM/QAA5v0AAPz9AAAW/gAAJP4AADL+AABM/gAAXP4AAHL+AACM/gAAmP4AAKb+AAC2/gAAxv4AANj+AADs/gAA/P4AABL/AAAi/wAANP8AAEb/AABY/wAAav8AAHb/AACE/wAAlP8AAKr/AAC6/wAAyv8AANj/AADq/wAA/P8AACQAAQAwAAEAQAABAFIAAQAAAAAAUgFHZW5lcmF0ZUNvbnNvbGVDdHJsRXZlbnQAAMYBR2V0RXhpdENvZGVQcm9jZXNzAABuBFdhaXRGb3JTaW5nbGVPYmplY3QAlQBDcmVhdGVQcm9jZXNzQQAArwNTZXRDb25zb2xlQ3RybEhhbmRsZXIA9QFHZXRNb2R1bGVGaWxlTmFtZUEAANoARW50ZXJDcml0aWNhbFNlY3Rpb24AAPQCTGVhdmVDcml0aWNhbFNlY3Rpb24AAPoBR2V0TW9kdWxlSGFuZGxlVwAAKwRTbGVlcAAiAkdldFByb2NBZGRyZXNzAAAFAUV4aXRQcm9jZXNzAHABR2V0Q29tbWFuZExpbmVBADwCR2V0U3RhcnR1cEluZm9BAPADU2V0SGFuZGxlQ291bnQAAD4CR2V0U3RkSGFuZGxlAADYAUdldEZpbGVUeXBlAL8ARGVsZXRlQ3JpdGljYWxTZWN0aW9uADcEVGVybWluYXRlUHJvY2VzcwAAqgFHZXRDdXJyZW50UHJvY2VzcwBIBFVuaGFuZGxlZEV4Y2VwdGlvbkZpbHRlcgAAHwRTZXRVbmhhbmRsZWRFeGNlcHRpb25GaWx0ZXIA1gJJc0RlYnVnZ2VyUHJlc2VudADnAUdldExhc3RFcnJvcgAApgJIZWFwRnJlZQAAogJIZWFwQWxsb2MAXAFHZXRDUEluZm8AxQJJbnRlcmxvY2tlZEluY3JlbWVudAAAwQJJbnRlcmxvY2tlZERlY3JlbWVudAAAUwFHZXRBQ1AAABQCR2V0T0VNQ1AAAOACSXNWYWxpZENvZGVQYWdlAD4EVGxzR2V0VmFsdWUAPARUbHNBbGxvYwAAPwRUbHNTZXRWYWx1ZQA9BFRsc0ZyZWUA9ANTZXRMYXN0RXJyb3IAAK4BR2V0Q3VycmVudFRocmVhZElkAACXBFdyaXRlRmlsZQD2AkxvYWRMaWJyYXJ5QQAAugJJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uQW5kU3BpbkNvdW50AEsBRnJlZUVudmlyb25tZW50U3RyaW5nc0EAwAFHZXRFbnZpcm9ubWVudFN0cmluZ3MATAFGcmVlRW52aXJvbm1lbnRTdHJpbmdzVwCEBFdpZGVDaGFyVG9NdWx0aUJ5dGUAwgFHZXRFbnZpcm9ubWVudFN0cmluZ3NXAACkAkhlYXBDcmVhdGUAAGEEVmlydHVhbEZyZWUAWQNRdWVyeVBlcmZvcm1hbmNlQ291bnRlcgBqAkdldFRpY2tDb3VudAAAqwFHZXRDdXJyZW50UHJvY2Vzc0lkAFMCR2V0U3lzdGVtVGltZUFzRmlsZVRpbWUAmgNSdGxVbndpbmQAqQJIZWFwUmVBbGxvYwBeBFZpcnR1YWxBbGxvYwAAhAFHZXRDb25zb2xlQ1AAAJYBR2V0Q29uc29sZU1vZGUAAEIBRmx1c2hGaWxlQnVmZmVycwAA5gJMQ01hcFN0cmluZ0EAAB8DTXVsdGlCeXRlVG9XaWRlQ2hhcgDoAkxDTWFwU3RyaW5nVwAAQAJHZXRTdHJpbmdUeXBlQQAAQwJHZXRTdHJpbmdUeXBlVwAA6QFHZXRMb2NhbGVJbmZvQQAA5wNTZXRGaWxlUG9pbnRlcgAAqwJIZWFwU2l6ZQAARABDbG9zZUhhbmRsZQCMBFdyaXRlQ29uc29sZUEAmgFHZXRDb25zb2xlT3V0cHV0Q1AAAJYEV3JpdGVDb25zb2xlVwAGBFNldFN0ZEhhbmRsZQAAeQBDcmVhdGVGaWxlQQBTAENvbXBhcmVTdHJpbmdBAABWAENvbXBhcmVTdHJpbmdXAADYA1NldEVudmlyb25tZW50VmFyaWFibGVBAEtFUk5FTDMyLmRsbAAAbgNSZWFkRmlsZQAA1QNTZXRFbmRPZkZpbGUAACYCR2V0UHJvY2Vzc0hlYXAAAMoBR2V0RmlsZUF0dHJpYnV0ZXNBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAK0EAAAAAAMArQQABAQAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAIAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATuZAu7EZv0TqI0AAAgAAAGziQABc4kAA/////4AKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAWAAAAAgAAAAIAAAADAAAAAgAAAAQAAAAYAAAABQAAAA0AAAAGAAAACQAAAAcAAAAMAAAACAAAAAwAAAAJAAAADAAAAAoAAAAHAAAACwAAAAgAAAAMAAAAFgAAAA0AAAAWAAAADwAAAAIAAAAQAAAADQAAABEAAAASAAAAEgAAAAIAAAAhAAAADQAAADUAAAACAAAAQQAAAA0AAABDAAAAAgAAAFAAAAARAAAAUgAAAA0AAABTAAAADQAAAFcAAAAWAAAAWQAAAAsAAABsAAAADQAAAG0AAAAgAAAAcAAAABwAAAByAAAACQAAAAYAAAAWAAAAgAAAAAoAAACBAAAACgAAAIIAAAAJAAAAgwAAABYAAACEAAAADQAAAJEAAAApAAAAngAAAA0AAAChAAAAAgAAAKQAAAALAAAApwAAAA0AAAC3AAAAEQAAAM4AAAACAAAA1wAAAAsAAAAYBwAADAAAAAwAAAAIAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAABAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5egAAAAAAAEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQAAAAAAAAICAgICAgICAgICAgICAgICAgICAgICAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoAAAAAAABBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoFUEAAQIECKQDAABggnmCIQAAAAAAAACm3wAAAAAAAKGlAAAAAAAAgZ/g/AAAAABAfoD8AAAAAKgDAADBo9qjIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgf4AAAAAAABA/gAAAAAAALUDAADBo9qjIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgf4AAAAAAABB/gAAAAAAALYDAADPouSiGgDlouiiWwAAAAAAAAAAAAAAAAAAAAAAgf4AAAAAAABAfqH+AAAAAFEFAABR2l7aIABf2mraMgAAAAAAAAAAAAAAAAAAAAAAgdPY3uD5AAAxfoH+AAAAAGztQAD+////QwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkBpBAAAAAAAAAAAAAAAAAJAaQQAAAAAAAAAAAAAAAACQGkEAAAAAAAAAAAAAAAAAkBpBAAAAAAAAAAAAAAAAAJAaQQAAAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAAAAAAAAAAAEgdQQAAAAAAAAAAAGjrQADw70AAcPFAAIgcQQCYGkEAAQAAAJgaQQBoFUEA//////////8CAAAA+OhAAAgAAADM6EAACQAAAKDoQAAKAAAACOhAABAAAADc50AAEQAAAKznQAASAAAAiOdAABMAAABc50AAGAAAACTnQAAZAAAA/OZAABoAAADE5kAAGwAAAIzmQAAcAAAAZOZAAB4AAABE5kAAHwAAAODlQAAgAAAAqOVAACEAAACw5EAAIgAAABDkQAB4AAAAAORAAHkAAADw40AAegAAAODjQAD8AAAA3ONAAP8AAADM40AAXphAAF6YQABemEAAXphAAF6YQABemEAAXphAAF6YQABemEAAXphAAAMAAAAHAAAAeAAAAAoAAAAQAAAAAAAAAGjrQABq7UAAmPNAAJTzQACQ80AAjPNAAIjzQACE80AAgPNAAHjzQABw80AAaPNAAFzzQABQ80AASPNAADzzQAA480AANPNAADDzQAAs80AAKPNAACTzQAAg80AAHPNAABjzQAAU80AAEPNAAAzzQAAE80AA+PJAAPDyQADo8kAAKPNAAODyQADY8kAA0PJAAMTyQAC88kAAsPJAAKTyQACg8kAAnPJAAJDyQAB88kAAcPJAAAkEAAABAAAAAAAAAIgcQQAuAAAARB1BAIwpQQCMKUEAjClBAIwpQQCMKUEAjClBAIwpQQCMKUEAjClBAH9/f39/f39/SB1BAAEAAAAuAAAAAQAAAAAAAAAAAAAAAwAAACAFkxkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAgHAAAAEAAADw8f//AAAAAFBTVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQRFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0B1BABAeQQD/////AAAAAAAAAAD/////AAAAAAAAAAD+/////v////////8eAAAAOwAAAFoAAAB4AAAAlwAAALUAAADUAAAA8wAAABEBAAAwAQAATgEAAG0BAAD/////HgAAADoAAABZAAAAdwAAAJYAAAC0AAAA0wAAAPIAAAAQAQAALwEAAE0BAABsAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECAgICAgICAgICAgICAgICAwMDAwMDAwMAAAAAAAAAAGz0QABk9EAAXPRAAFT0QAACAAAAAAAAAAAAAAAAAAAAUEsDBBQAAAAAAAAAIQBk+X6bEwMAABMDAAAsAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9sYXVuY2gucHkiIiIKTGF1bmNoIHRoZSBQeXRob24gc2NyaXB0IG9uIHRoZSBjb21tYW5kIGxpbmUgYWZ0ZXIKc2V0dXB0b29scyBpcyBib290c3RyYXBwZWQgdmlhIGltcG9ydC4KIiIiCgojIE5vdGUgdGhhdCBzZXR1cHRvb2xzIGdldHMgaW1wb3J0ZWQgaW1wbGljaXRseSBieSB0aGUKIyBpbnZvY2F0aW9uIG9mIHRoaXMgc2NyaXB0IHVzaW5nIHB5dGhvbiAtbSBzZXR1cHRvb2xzLmxhdW5jaAoKaW1wb3J0IHRva2VuaXplCmltcG9ydCBzeXMKCgpkZWYgcnVuKCk6CiAgICAiIiIKICAgIFJ1biB0aGUgc2NyaXB0IGluIHN5cy5hcmd2WzFdIGFzIGlmIGl0IGhhZAogICAgYmVlbiBpbnZva2VkIG5hdHVyYWxseS4KICAgICIiIgogICAgX19idWlsdGluc19fCiAgICBzY3JpcHRfbmFtZSA9IHN5cy5hcmd2WzFdCiAgICBuYW1lc3BhY2UgPSBkaWN0KAogICAgICAgIF9fZmlsZV9fPXNjcmlwdF9uYW1lLAogICAgICAgIF9fbmFtZV9fPSdfX21haW5fXycsCiAgICAgICAgX19kb2NfXz1Ob25lLAogICAgKQogICAgc3lzLmFyZ3ZbOl0gPSBzeXMuYXJndlsxOl0KCiAgICBvcGVuXyA9IGdldGF0dHIodG9rZW5pemUsICdvcGVuJywgb3BlbikKICAgIHNjcmlwdCA9IG9wZW5fKHNjcmlwdF9uYW1lKS5yZWFkKCkKICAgIG5vcm1fc2NyaXB0ID0gc2NyaXB0LnJlcGxhY2UoJ1xcclxcbicsICdcXG4nKQogICAgY29kZSA9IGNvbXBpbGUobm9ybV9zY3JpcHQsIHNjcmlwdF9uYW1lLCAnZXhlYycpCiAgICBleGVjKGNvZGUsIG5hbWVzcGFjZSkKCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgcnVuKCkKUEsDBBQAAAAAAAAAIQCHUeui3QcAAN0HAAAwAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9saWIydG8zX2V4LnB5IiIiCkN1c3RvbWl6ZWQgTWl4aW4ydG8zIHN1cHBvcnQ6CgogLSBhZGRzIHN1cHBvcnQgZm9yIGNvbnZlcnRpbmcgZG9jdGVzdHMKCgpUaGlzIG1vZHVsZSByYWlzZXMgYW4gSW1wb3J0RXJyb3Igb24gUHl0aG9uIDIuCiIiIgoKZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgTWl4aW4ydG8zIGFzIF9NaXhpbjJ0bzMKZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZwpmcm9tIGxpYjJ0bzMucmVmYWN0b3IgaW1wb3J0IFJlZmFjdG9yaW5nVG9vbCwgZ2V0X2ZpeGVyc19mcm9tX3BhY2thZ2UKCmltcG9ydCBzZXR1cHRvb2xzCgoKY2xhc3MgRGlzdHV0aWxzUmVmYWN0b3JpbmdUb29sKFJlZmFjdG9yaW5nVG9vbCk6CiAgICBkZWYgbG9nX2Vycm9yKHNlbGYsIG1zZywgKmFyZ3MsICoqa3cpOgogICAgICAgIGxvZy5lcnJvcihtc2csICphcmdzKQoKICAgIGRlZiBsb2dfbWVzc2FnZShzZWxmLCBtc2csICphcmdzKToKICAgICAgICBsb2cuaW5mbyhtc2csICphcmdzKQoKICAgIGRlZiBsb2dfZGVidWcoc2VsZiwgbXNnLCAqYXJncyk6CiAgICAgICAgbG9nLmRlYnVnKG1zZywgKmFyZ3MpCgoKY2xhc3MgTWl4aW4ydG8zKF9NaXhpbjJ0bzMpOgogICAgZGVmIHJ1bl8ydG8zKHNlbGYsIGZpbGVzLCBkb2N0ZXN0cz1GYWxzZSk6CiAgICAgICAgIyBTZWUgb2YgdGhlIGRpc3RyaWJ1dGlvbiBvcHRpb24gaGFzIGJlZW4gc2V0LCBvdGhlcndpc2UgY2hlY2sgdGhlCiAgICAgICAgIyBzZXR1cHRvb2xzIGRlZmF1bHQuCiAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24udXNlXzJ0bzMgaXMgbm90IFRydWU6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGlmIG5vdCBmaWxlczoKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgbG9nLmluZm8oIkZpeGluZyAiICsgIiAiLmpvaW4oZmlsZXMpKQogICAgICAgIHNlbGYuX19idWlsZF9maXhlcl9uYW1lcygpCiAgICAgICAgc2VsZi5fX2V4Y2x1ZGVfZml4ZXJzKCkKICAgICAgICBpZiBkb2N0ZXN0czoKICAgICAgICAgICAgaWYgc2V0dXB0b29scy5ydW5fMnRvM19vbl9kb2N0ZXN0czoKICAgICAgICAgICAgICAgIHIgPSBEaXN0dXRpbHNSZWZhY3RvcmluZ1Rvb2woc2VsZi5maXhlcl9uYW1lcykKICAgICAgICAgICAgICAgIHIucmVmYWN0b3IoZmlsZXMsIHdyaXRlPVRydWUsIGRvY3Rlc3RzX29ubHk9VHJ1ZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBfTWl4aW4ydG8zLnJ1bl8ydG8zKHNlbGYsIGZpbGVzKQoKICAgIGRlZiBfX2J1aWxkX2ZpeGVyX25hbWVzKHNlbGYpOgogICAgICAgIGlmIHNlbGYuZml4ZXJfbmFtZXM6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHNlbGYuZml4ZXJfbmFtZXMgPSBbXQogICAgICAgIGZvciBwIGluIHNldHVwdG9vbHMubGliMnRvM19maXhlcl9wYWNrYWdlczoKICAgICAgICAgICAgc2VsZi5maXhlcl9uYW1lcy5leHRlbmQoZ2V0X2ZpeGVyc19mcm9tX3BhY2thZ2UocCkpCiAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24udXNlXzJ0bzNfZml4ZXJzIGlzIG5vdCBOb25lOgogICAgICAgICAgICBmb3IgcCBpbiBzZWxmLmRpc3RyaWJ1dGlvbi51c2VfMnRvM19maXhlcnM6CiAgICAgICAgICAgICAgICBzZWxmLmZpeGVyX25hbWVzLmV4dGVuZChnZXRfZml4ZXJzX2Zyb21fcGFja2FnZShwKSkKCiAgICBkZWYgX19leGNsdWRlX2ZpeGVycyhzZWxmKToKICAgICAgICBleGNsdWRlZF9maXhlcnMgPSBnZXRhdHRyKHNlbGYsICdleGNsdWRlX2ZpeGVycycsIFtdKQogICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLnVzZV8ydG8zX2V4Y2x1ZGVfZml4ZXJzIGlzIG5vdCBOb25lOgogICAgICAgICAgICBleGNsdWRlZF9maXhlcnMuZXh0ZW5kKHNlbGYuZGlzdHJpYnV0aW9uLnVzZV8ydG8zX2V4Y2x1ZGVfZml4ZXJzKQogICAgICAgIGZvciBmaXhlcl9uYW1lIGluIGV4Y2x1ZGVkX2ZpeGVyczoKICAgICAgICAgICAgaWYgZml4ZXJfbmFtZSBpbiBzZWxmLmZpeGVyX25hbWVzOgogICAgICAgICAgICAgICAgc2VsZi5maXhlcl9uYW1lcy5yZW1vdmUoZml4ZXJfbmFtZSkKUEsDBBQAAAAAAAAAIQCNQ3JenRYAAJ0WAAAsAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9tb25rZXkucHkiIiIKTW9ua2V5IHBhdGNoaW5nIG9mIGRpc3R1dGlscy4KIiIiCgppbXBvcnQgc3lzCmltcG9ydCBkaXN0dXRpbHMuZmlsZWxpc3QKaW1wb3J0IHBsYXRmb3JtCmltcG9ydCB0eXBlcwppbXBvcnQgZnVuY3Rvb2xzCmZyb20gaW1wb3J0bGliIGltcG9ydCBpbXBvcnRfbW9kdWxlCmltcG9ydCBpbnNwZWN0Cgpmcm9tIHNldHVwdG9vbHMuZXh0ZXJuIGltcG9ydCBzaXgKCmltcG9ydCBzZXR1cHRvb2xzCgpfX2FsbF9fID0gW10KIiIiCkV2ZXJ5dGhpbmcgaXMgcHJpdmF0ZS4gQ29udGFjdCB0aGUgcHJvamVjdCB0ZWFtCmlmIHlvdSB0aGluayB5b3UgbmVlZCB0aGlzIGZ1bmN0aW9uYWxpdHkuCiIiIgoKCmRlZiBfZ2V0X21ybyhjbHMpOgogICAgIiIiCiAgICBSZXR1cm5zIHRoZSBiYXNlcyBjbGFzc2VzIGZvciBjbHMgc29ydGVkIGJ5IHRoZSBNUk8uCgogICAgV29ya3MgYXJvdW5kIGFuIGlzc3VlIG9uIEp5dGhvbiB3aGVyZSBpbnNwZWN0LmdldG1ybyB3aWxsIG5vdCByZXR1cm4gYWxsCiAgICBiYXNlIGNsYXNzZXMgaWYgbXVsdGlwbGUgY2xhc3NlcyBzaGFyZSB0aGUgc2FtZSBuYW1lLiBJbnN0ZWFkLCB0aGlzCiAgICBmdW5jdGlvbiB3aWxsIHJldHVybiBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlIGNsYXNzIGl0c2VsZiwgYW5kIHRoZSBjb250ZW50cwogICAgb2YgY2xzLl9fYmFzZXNfXy4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9weXBhL3NldHVwdG9vbHMvaXNzdWVzLzEwMjQuCiAgICAiIiIKICAgIGlmIHBsYXRmb3JtLnB5dGhvbl9pbXBsZW1lbnRhdGlvbigpID09ICJKeXRob24iOgogICAgICAgIHJldHVybiAoY2xzLCkgKyBjbHMuX19iYXNlc19fCiAgICByZXR1cm4gaW5zcGVjdC5nZXRtcm8oY2xzKQoKCmRlZiBnZXRfdW5wYXRjaGVkKGl0ZW0pOgogICAgbG9va3VwID0gKAogICAgICAgIGdldF91bnBhdGNoZWRfY2xhc3MgaWYgaXNpbnN0YW5jZShpdGVtLCBzaXguY2xhc3NfdHlwZXMpIGVsc2UKICAgICAgICBnZXRfdW5wYXRjaGVkX2Z1bmN0aW9uIGlmIGlzaW5zdGFuY2UoaXRlbSwgdHlwZXMuRnVuY3Rpb25UeXBlKSBlbHNlCiAgICAgICAgbGFtYmRhIGl0ZW06IE5vbmUKICAgICkKICAgIHJldHVybiBsb29rdXAoaXRlbSkKCgpkZWYgZ2V0X3VucGF0Y2hlZF9jbGFzcyhjbHMpOgogICAgIiIiUHJvdGVjdCBhZ2FpbnN0IHJlLXBhdGNoaW5nIHRoZSBkaXN0dXRpbHMgaWYgcmVsb2FkZWQKCiAgICBBbHNvIGVuc3VyZXMgdGhhdCBubyBvdGhlciBkaXN0dXRpbHMgZXh0ZW5zaW9uIG1vbmtleXBhdGNoZWQgdGhlIGRpc3R1dGlscwogICAgZmlyc3QuCiAgICAiIiIKICAgIGV4dGVybmFsX2Jhc2VzID0gKAogICAgICAgIGNscwogICAgICAgIGZvciBjbHMgaW4gX2dldF9tcm8oY2xzKQogICAgICAgIGlmIG5vdCBjbHMuX19tb2R1bGVfXy5zdGFydHN3aXRoKCdzZXR1cHRvb2xzJykKICAgICkKICAgIGJhc2UgPSBuZXh0KGV4dGVybmFsX2Jhc2VzKQogICAgaWYgbm90IGJhc2UuX19tb2R1bGVfXy5zdGFydHN3aXRoKCdkaXN0dXRpbHMnKToKICAgICAgICBtc2cgPSAiZGlzdHV0aWxzIGhhcyBhbHJlYWR5IGJlZW4gcGF0Y2hlZCBieSAlciIgJSBjbHMKICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcihtc2cpCiAgICByZXR1cm4gYmFzZQoKCmRlZiBwYXRjaF9hbGwoKToKICAgICMgd2UgY2FuJ3QgcGF0Y2ggZGlzdHV0aWxzLmNtZCwgYWxhcwogICAgZGlzdHV0aWxzLmNvcmUuQ29tbWFuZCA9IHNldHVwdG9vbHMuQ29tbWFuZAoKICAgIGhhc19pc3N1ZV8xMjg4NSA9IHN5cy52ZXJzaW9uX2luZm8gPD0gKDMsIDUsIDMpCgogICAgaWYgaGFzX2lzc3VlXzEyODg1OgogICAgICAgICMgZml4IGZpbmRhbGwgYnVnIGluIGRpc3R1dGlscyAoaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTEyODg1KQogICAgICAgIGRpc3R1dGlscy5maWxlbGlzdC5maW5kYWxsID0gc2V0dXB0b29scy5maW5kYWxsCgogICAgbmVlZHNfd2FyZWhvdXNlID0gKAogICAgICAgIHN5cy52ZXJzaW9uX2luZm8gPCAoMiwgNywgMTMpCiAgICAgICAgb3IKICAgICAgICAoMywgMCkgPCBzeXMudmVyc2lvbl9pbmZvIDwgKDMsIDMsIDcpCiAgICAgICAgb3IKICAgICAgICAoMywgNCkgPCBzeXMudmVyc2lvbl9pbmZvIDwgKDMsIDQsIDYpCiAgICAgICAgb3IKICAgICAgICAoMywgNSkgPCBzeXMudmVyc2lvbl9pbmZvIDw9ICgzLCA1LCAzKQogICAgKQoKICAgIGlmIG5lZWRzX3dhcmVob3VzZToKICAgICAgICB3YXJlaG91c2UgPSAnaHR0cHM6Ly91cGxvYWQucHlwaS5vcmcvbGVnYWN5LycKICAgICAgICBkaXN0dXRpbHMuY29uZmlnLlB5UElSQ0NvbW1hbmQuREVGQVVMVF9SRVBPU0lUT1JZID0gd2FyZWhvdXNlCgogICAgX3BhdGNoX2Rpc3RyaWJ1dGlvbl9tZXRhZGF0YV93cml0ZV9wa2dfZmlsZSgpCiAgICBfcGF0Y2hfZGlzdHJpYnV0aW9uX21ldGFkYXRhX3dyaXRlX3BrZ19pbmZvKCkKCiAgICAjIEluc3RhbGwgRGlzdHJpYnV0aW9uIHRocm91Z2hvdXQgdGhlIGRpc3R1dGlscwogICAgZm9yIG1vZHVsZSBpbiBkaXN0dXRpbHMuZGlzdCwgZGlzdHV0aWxzLmNvcmUsIGRpc3R1dGlscy5jbWQ6CiAgICAgICAgbW9kdWxlLkRpc3RyaWJ1dGlvbiA9IHNldHVwdG9vbHMuZGlzdC5EaXN0cmlidXRpb24KCiAgICAjIEluc3RhbGwgdGhlIHBhdGNoZWQgRXh0ZW5zaW9uCiAgICBkaXN0dXRpbHMuY29yZS5FeHRlbnNpb24gPSBzZXR1cHRvb2xzLmV4dGVuc2lvbi5FeHRlbnNpb24KICAgIGRpc3R1dGlscy5leHRlbnNpb24uRXh0ZW5zaW9uID0gc2V0dXB0b29scy5leHRlbnNpb24uRXh0ZW5zaW9uCiAgICBpZiAnZGlzdHV0aWxzLmNvbW1hbmQuYnVpbGRfZXh0JyBpbiBzeXMubW9kdWxlczoKICAgICAgICBzeXMubW9kdWxlc1snZGlzdHV0aWxzLmNvbW1hbmQuYnVpbGRfZXh0J10uRXh0ZW5zaW9uID0gKAogICAgICAgICAgICBzZXR1cHRvb2xzLmV4dGVuc2lvbi5FeHRlbnNpb24KICAgICAgICApCgogICAgcGF0Y2hfZm9yX21zdmNfc3BlY2lhbGl6ZWRfY29tcGlsZXIoKQoKCmRlZiBfcGF0Y2hfZGlzdHJpYnV0aW9uX21ldGFkYXRhX3dyaXRlX3BrZ19maWxlKCk6CiAgICAiIiJQYXRjaCB3cml0ZV9wa2dfZmlsZSB0byBhbHNvIHdyaXRlIFJlcXVpcmVzLVB5dGhvbi9SZXF1aXJlcy1FeHRlcm5hbCIiIgogICAgZGlzdHV0aWxzLmRpc3QuRGlzdHJpYnV0aW9uTWV0YWRhdGEud3JpdGVfcGtnX2ZpbGUgPSAoCiAgICAgICAgc2V0dXB0b29scy5kaXN0LndyaXRlX3BrZ19maWxlCiAgICApCgoKZGVmIF9wYXRjaF9kaXN0cmlidXRpb25fbWV0YWRhdGFfd3JpdGVfcGtnX2luZm8oKToKICAgICIiIgogICAgV29ya2Fyb3VuZCBpc3N1ZSAjMTk3IC0gUHl0aG9uIDMgcHJpb3IgdG8gMy4yLjIgdXNlcyBhbiBlbnZpcm9ubWVudC1sb2NhbAogICAgZW5jb2RpbmcgdG8gc2F2ZSB0aGUgcGtnX2luZm8uIE1vbmtleS1wYXRjaCBpdHMgd3JpdGVfcGtnX2luZm8gbWV0aG9kIHRvCiAgICBjb3JyZWN0IHRoaXMgdW5kZXNpcmFibGUgYmVoYXZpb3IuCiAgICAiIiIKICAgIGVudmlyb25tZW50X2xvY2FsID0gKDMsKSA8PSBzeXMudmVyc2lvbl9pbmZvWzozXSA8ICgzLCAyLCAyKQogICAgaWYgbm90IGVudmlyb25tZW50X2xvY2FsOgogICAgICAgIHJldHVybgoKICAgIGRpc3R1dGlscy5kaXN0LkRpc3RyaWJ1dGlvbk1ldGFkYXRhLndyaXRlX3BrZ19pbmZvID0gKAogICAgICAgIHNldHVwdG9vbHMuZGlzdC53cml0ZV9wa2dfaW5mbwogICAgKQoKCmRlZiBwYXRjaF9mdW5jKHJlcGxhY2VtZW50LCB0YXJnZXRfbW9kLCBmdW5jX25hbWUpOgogICAgIiIiCiAgICBQYXRjaCBmdW5jX25hbWUgaW4gdGFyZ2V0X21vZCB3aXRoIHJlcGxhY2VtZW50CgogICAgSW1wb3J0YW50IC0gb3JpZ2luYWwgbXVzdCBiZSByZXNvbHZlZCBieSBuYW1lIHRvIGF2b2lkCiAgICBwYXRjaGluZyBhbiBhbHJlYWR5IHBhdGNoZWQgZnVuY3Rpb24uCiAgICAiIiIKICAgIG9yaWdpbmFsID0gZ2V0YXR0cih0YXJnZXRfbW9kLCBmdW5jX25hbWUpCgogICAgIyBzZXQgdGhlICd1bnBhdGNoZWQnIGF0dHJpYnV0ZSBvbiB0aGUgcmVwbGFjZW1lbnQgdG8KICAgICMgcG9pbnQgdG8gdGhlIG9yaWdpbmFsLgogICAgdmFycyhyZXBsYWNlbWVudCkuc2V0ZGVmYXVsdCgndW5wYXRjaGVkJywgb3JpZ2luYWwpCgogICAgIyByZXBsYWNlIHRoZSBmdW5jdGlvbiBpbiB0aGUgb3JpZ2luYWwgbW9kdWxlCiAgICBzZXRhdHRyKHRhcmdldF9tb2QsIGZ1bmNfbmFtZSwgcmVwbGFjZW1lbnQpCgoKZGVmIGdldF91bnBhdGNoZWRfZnVuY3Rpb24oY2FuZGlkYXRlKToKICAgIHJldHVybiBnZXRhdHRyKGNhbmRpZGF0ZSwgJ3VucGF0Y2hlZCcpCgoKZGVmIHBhdGNoX2Zvcl9tc3ZjX3NwZWNpYWxpemVkX2NvbXBpbGVyKCk6CiAgICAiIiIKICAgIFBhdGNoIGZ1bmN0aW9ucyBpbiBkaXN0dXRpbHMgdG8gdXNlIHN0YW5kYWxvbmUgTWljcm9zb2Z0IFZpc3VhbCBDKysKICAgIGNvbXBpbGVycy4KICAgICIiIgogICAgIyBpbXBvcnQgbGF0ZSB0byBhdm9pZCBjaXJjdWxhciBpbXBvcnRzIG9uIFB5dGhvbiA8IDMuNQogICAgbXN2YyA9IGltcG9ydF9tb2R1bGUoJ3NldHVwdG9vbHMubXN2YycpCgogICAgaWYgcGxhdGZvcm0uc3lzdGVtKCkgIT0gJ1dpbmRvd3MnOgogICAgICAgICMgQ29tcGlsZXJzIG9ubHkgYXZhaWxhYmxlcyBvbiBNaWNyb3NvZnQgV2luZG93cwogICAgICAgIHJldHVybgoKICAgIGRlZiBwYXRjaF9wYXJhbXMobW9kX25hbWUsIGZ1bmNfbmFtZSk6CiAgICAgICAgIiIiCiAgICAgICAgUHJlcGFyZSB0aGUgcGFyYW1ldGVycyBmb3IgcGF0Y2hfZnVuYyB0byBwYXRjaCBpbmRpY2F0ZWQgZnVuY3Rpb24uCiAgICAgICAgIiIiCiAgICAgICAgcmVwbF9wcmVmaXggPSAnbXN2YzlfJyBpZiAnbXN2YzknIGluIG1vZF9uYW1lIGVsc2UgJ21zdmMxNF8nCiAgICAgICAgcmVwbF9uYW1lID0gcmVwbF9wcmVmaXggKyBmdW5jX25hbWUubHN0cmlwKCdfJykKICAgICAgICByZXBsID0gZ2V0YXR0cihtc3ZjLCByZXBsX25hbWUpCiAgICAgICAgbW9kID0gaW1wb3J0X21vZHVsZShtb2RfbmFtZSkKICAgICAgICBpZiBub3QgaGFzYXR0cihtb2QsIGZ1bmNfbmFtZSk6CiAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKGZ1bmNfbmFtZSkKICAgICAgICByZXR1cm4gcmVwbCwgbW9kLCBmdW5jX25hbWUKCiAgICAjIFB5dGhvbiAyLjcgdG8gMy40CiAgICBtc3ZjOSA9IGZ1bmN0b29scy5wYXJ0aWFsKHBhdGNoX3BhcmFtcywgJ2Rpc3R1dGlscy5tc3ZjOWNvbXBpbGVyJykKCiAgICAjIFB5dGhvbiAzLjUrCiAgICBtc3ZjMTQgPSBmdW5jdG9vbHMucGFydGlhbChwYXRjaF9wYXJhbXMsICdkaXN0dXRpbHMuX21zdmNjb21waWxlcicpCgogICAgdHJ5OgogICAgICAgICMgUGF0Y2ggZGlzdHV0aWxzLm1zdmM5Y29tcGlsZXIKICAgICAgICBwYXRjaF9mdW5jKCptc3ZjOSgnZmluZF92Y3ZhcnNhbGwnKSkKICAgICAgICBwYXRjaF9mdW5jKCptc3ZjOSgncXVlcnlfdmN2YXJzYWxsJykpCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgcGFzcwoKICAgIHRyeToKICAgICAgICAjIFBhdGNoIGRpc3R1dGlscy5fbXN2Y2NvbXBpbGVyLl9nZXRfdmNfZW52CiAgICAgICAgcGF0Y2hfZnVuYygqbXN2YzE0KCdfZ2V0X3ZjX2VudicpKQogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIHBhc3MKCiAgICB0cnk6CiAgICAgICAgIyBQYXRjaCBkaXN0dXRpbHMuX21zdmNjb21waWxlci5nZW5fbGliX29wdGlvbnMgZm9yIE51bXB5CiAgICAgICAgcGF0Y2hfZnVuYygqbXN2YzE0KCdnZW5fbGliX29wdGlvbnMnKSkKICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICBwYXNzClBLAwQUAAAAAAAAACEAgsOU5rSfAAC0nwAAKgAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvbXN2Yy5weSIiIgpJbXByb3ZlZCBzdXBwb3J0IGZvciBNaWNyb3NvZnQgVmlzdWFsIEMrKyBjb21waWxlcnMuCgpLbm93biBzdXBwb3J0ZWQgY29tcGlsZXJzOgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpNaWNyb3NvZnQgVmlzdWFsIEMrKyA5LjA6CiAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyBDb21waWxlciBmb3IgUHl0aG9uIDIuNyAoeDg2LCBhbWQ2NCkKICAgIE1pY3Jvc29mdCBXaW5kb3dzIFNESyA2LjEgKHg4NiwgeDY0LCBpYTY0KQogICAgTWljcm9zb2Z0IFdpbmRvd3MgU0RLIDcuMCAoeDg2LCB4NjQsIGlhNjQpCgpNaWNyb3NvZnQgVmlzdWFsIEMrKyAxMC4wOgogICAgTWljcm9zb2Z0IFdpbmRvd3MgU0RLIDcuMSAoeDg2LCB4NjQsIGlhNjQpCgpNaWNyb3NvZnQgVmlzdWFsIEMrKyAxNC4wOgogICAgTWljcm9zb2Z0IFZpc3VhbCBDKysgQnVpbGQgVG9vbHMgMjAxNSAoeDg2LCB4NjQsIGFybSkKICAgIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIDIwMTcgKHg4NiwgeDY0LCBhcm0sIGFybTY0KQogICAgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gQnVpbGQgVG9vbHMgMjAxNyAoeDg2LCB4NjQsIGFybSwgYXJtNjQpCiIiIgoKaW1wb3J0IG9zCmltcG9ydCBzeXMKaW1wb3J0IHBsYXRmb3JtCmltcG9ydCBpdGVydG9vbHMKaW1wb3J0IGRpc3R1dGlscy5lcnJvcnMKZnJvbSBwa2dfcmVzb3VyY2VzLmV4dGVybi5wYWNrYWdpbmcudmVyc2lvbiBpbXBvcnQgTGVnYWN5VmVyc2lvbgoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXgubW92ZXMgaW1wb3J0IGZpbHRlcmZhbHNlCgpmcm9tIC5tb25rZXkgaW1wb3J0IGdldF91bnBhdGNoZWQKCmlmIHBsYXRmb3JtLnN5c3RlbSgpID09ICdXaW5kb3dzJzoKICAgIGZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCB3aW5yZWcKICAgIHNhZmVfZW52ID0gb3MuZW52aXJvbgplbHNlOgogICAgIiIiCiAgICBNb2NrIHdpbnJlZyBhbmQgZW52aXJvbiBzbyB0aGUgbW9kdWxlIGNhbiBiZSBpbXBvcnRlZAogICAgb24gdGhpcyBwbGF0Zm9ybS4KICAgICIiIgoKICAgIGNsYXNzIHdpbnJlZzoKICAgICAgICBIS0VZX1VTRVJTID0gTm9uZQogICAgICAgIEhLRVlfQ1VSUkVOVF9VU0VSID0gTm9uZQogICAgICAgIEhLRVlfTE9DQUxfTUFDSElORSA9IE5vbmUKICAgICAgICBIS0VZX0NMQVNTRVNfUk9PVCA9IE5vbmUKCiAgICBzYWZlX2VudiA9IGRpY3QoKQoKX21zdmM5X3N1cHByZXNzX2Vycm9ycyA9ICgKICAgICMgbXN2Yzljb21waWxlciBpc24ndCBhdmFpbGFibGUgb24gc29tZSBwbGF0Zm9ybXMKICAgIEltcG9ydEVycm9yLAogICAgCiAgICAjIG1zdmM5Y29tcGlsZXIgcmFpc2VzIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IgaW4gc29tZQogICAgIyBlbnZpcm9ubWVudHMuIFNlZSAjMTExOC4KICAgIGRpc3R1dGlscy5lcnJvcnMuRGlzdHV0aWxzUGxhdGZvcm1FcnJvciwKKQoKdHJ5OgogICAgZnJvbSBkaXN0dXRpbHMubXN2Yzljb21waWxlciBpbXBvcnQgUmVnCmV4Y2VwdCBfbXN2Yzlfc3VwcHJlc3NfZXJyb3JzOgogICAgcGFzcwoKCmRlZiBtc3ZjOV9maW5kX3ZjdmFyc2FsbCh2ZXJzaW9uKToKICAgICIiIgogICAgUGF0Y2hlZCAiZGlzdHV0aWxzLm1zdmM5Y29tcGlsZXIuZmluZF92Y3ZhcnNhbGwiIHRvIHVzZSB0aGUgc3RhbmRhbG9uZQogICAgY29tcGlsZXIgYnVpbGQgZm9yIFB5dGhvbiAoVkNGb3JQeXRob24pLiBGYWxsIGJhY2sgdG8gb3JpZ2luYWwgYmVoYXZpb3IKICAgIHdoZW4gdGhlIHN0YW5kYWxvbmUgY29tcGlsZXIgaXMgbm90IGF2YWlsYWJsZS4KCiAgICBSZWRpcmVjdCB0aGUgcGF0aCBvZiAidmN2YXJzYWxsLmJhdCIuCgogICAgS25vd24gc3VwcG9ydGVkIGNvbXBpbGVycwogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgTWljcm9zb2Z0IFZpc3VhbCBDKysgOS4wOgogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgQysrIENvbXBpbGVyIGZvciBQeXRob24gMi43ICh4ODYsIGFtZDY0KQoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIHZlcnNpb246IGZsb2F0CiAgICAgICAgUmVxdWlyZWQgTWljcm9zb2Z0IFZpc3VhbCBDKysgdmVyc2lvbi4KCiAgICBSZXR1cm4KICAgIC0tLS0tLQogICAgdmN2YXJzYWxsLmJhdCBwYXRoOiBzdHIKICAgICIiIgogICAgVkNfQkFTRSA9IHInU29mdHdhcmVcJXNNaWNyb3NvZnRcRGV2RGl2XFZDRm9yUHl0aG9uXCUwLjFmJwogICAga2V5ID0gVkNfQkFTRSAlICgnJywgdmVyc2lvbikKICAgIHRyeToKICAgICAgICAjIFBlci11c2VyIGluc3RhbGxzIHJlZ2lzdGVyIHRoZSBjb21waWxlciBwYXRoIGhlcmUKICAgICAgICBwcm9kdWN0ZGlyID0gUmVnLmdldF92YWx1ZShrZXksICJpbnN0YWxsZGlyIikKICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICB0cnk6CiAgICAgICAgICAgICMgQWxsLXVzZXIgaW5zdGFsbHMgb24gYSA2NC1iaXQgc3lzdGVtIHJlZ2lzdGVyIGhlcmUKICAgICAgICAgICAga2V5ID0gVkNfQkFTRSAlICgnV293NjQzMk5vZGVcXCcsIHZlcnNpb24pCiAgICAgICAgICAgIHByb2R1Y3RkaXIgPSBSZWcuZ2V0X3ZhbHVlKGtleSwgImluc3RhbGxkaXIiKQogICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgcHJvZHVjdGRpciA9IE5vbmUKCiAgICBpZiBwcm9kdWN0ZGlyOgogICAgICAgIHZjdmFyc2FsbCA9IG9zLnBhdGgub3MucGF0aC5qb2luKHByb2R1Y3RkaXIsICJ2Y3ZhcnNhbGwuYmF0IikKICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZSh2Y3ZhcnNhbGwpOgogICAgICAgICAgICByZXR1cm4gdmN2YXJzYWxsCgogICAgcmV0dXJuIGdldF91bnBhdGNoZWQobXN2YzlfZmluZF92Y3ZhcnNhbGwpKHZlcnNpb24pCgoKZGVmIG1zdmM5X3F1ZXJ5X3ZjdmFyc2FsbCh2ZXIsIGFyY2g9J3g4NicsICphcmdzLCAqKmt3YXJncyk6CiAgICAiIiIKICAgIFBhdGNoZWQgImRpc3R1dGlscy5tc3ZjOWNvbXBpbGVyLnF1ZXJ5X3ZjdmFyc2FsbCIgZm9yIHN1cHBvcnQgZXh0cmEKICAgIGNvbXBpbGVycy4KCiAgICBTZXQgZW52aXJvbm1lbnQgd2l0aG91dCB1c2Ugb2YgInZjdmFyc2FsbC5iYXQiLgoKICAgIEtub3duIHN1cHBvcnRlZCBjb21waWxlcnMKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIE1pY3Jvc29mdCBWaXN1YWwgQysrIDkuMDoKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyBDb21waWxlciBmb3IgUHl0aG9uIDIuNyAoeDg2LCBhbWQ2NCkKICAgICAgICBNaWNyb3NvZnQgV2luZG93cyBTREsgNi4xICh4ODYsIHg2NCwgaWE2NCkKICAgICAgICBNaWNyb3NvZnQgV2luZG93cyBTREsgNy4wICh4ODYsIHg2NCwgaWE2NCkKCiAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyAxMC4wOgogICAgICAgIE1pY3Jvc29mdCBXaW5kb3dzIFNESyA3LjEgKHg4NiwgeDY0LCBpYTY0KQoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIHZlcjogZmxvYXQKICAgICAgICBSZXF1aXJlZCBNaWNyb3NvZnQgVmlzdWFsIEMrKyB2ZXJzaW9uLgogICAgYXJjaDogc3RyCiAgICAgICAgVGFyZ2V0IGFyY2hpdGVjdHVyZS4KCiAgICBSZXR1cm4KICAgIC0tLS0tLQogICAgZW52aXJvbm1lbnQ6IGRpY3QKICAgICIiIgogICAgIyBUcnkgdG8gZ2V0IGVudmlyb25lbWVudCBmcm9tIHZjdmFyc2FsbC5iYXQgKENsYXNzaWNhbCB3YXkpCiAgICB0cnk6CiAgICAgICAgb3JpZyA9IGdldF91bnBhdGNoZWQobXN2YzlfcXVlcnlfdmN2YXJzYWxsKQogICAgICAgIHJldHVybiBvcmlnKHZlciwgYXJjaCwgKmFyZ3MsICoqa3dhcmdzKQogICAgZXhjZXB0IGRpc3R1dGlscy5lcnJvcnMuRGlzdHV0aWxzUGxhdGZvcm1FcnJvcjoKICAgICAgICAjIFBhc3MgZXJyb3IgaWYgVmN2YXJzYWxsLmJhdCBpcyBtaXNzaW5nCiAgICAgICAgcGFzcwogICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgIyBQYXNzIGVycm9yIGlmIGVudmlyb25tZW50IG5vdCBzZXQgYWZ0ZXIgZXhlY3V0aW5nIHZjdmFyc2FsbC5iYXQKICAgICAgICBwYXNzCgogICAgIyBJZiBlcnJvciwgdHJ5IHRvIHNldCBlbnZpcm9ubWVudCBkaXJlY3RseQogICAgdHJ5OgogICAgICAgIHJldHVybiBFbnZpcm9ubWVudEluZm8oYXJjaCwgdmVyKS5yZXR1cm5fZW52KCkKICAgIGV4Y2VwdCBkaXN0dXRpbHMuZXJyb3JzLkRpc3R1dGlsc1BsYXRmb3JtRXJyb3IgYXMgZXhjOgogICAgICAgIF9hdWdtZW50X2V4Y2VwdGlvbihleGMsIHZlciwgYXJjaCkKICAgICAgICByYWlzZQoKCmRlZiBtc3ZjMTRfZ2V0X3ZjX2VudihwbGF0X3NwZWMpOgogICAgIiIiCiAgICBQYXRjaGVkICJkaXN0dXRpbHMuX21zdmNjb21waWxlci5fZ2V0X3ZjX2VudiIgZm9yIHN1cHBvcnQgZXh0cmEKICAgIGNvbXBpbGVycy4KCiAgICBTZXQgZW52aXJvbm1lbnQgd2l0aG91dCB1c2Ugb2YgInZjdmFyc2FsbC5iYXQiLgoKICAgIEtub3duIHN1cHBvcnRlZCBjb21waWxlcnMKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIE1pY3Jvc29mdCBWaXN1YWwgQysrIDE0LjA6CiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBDKysgQnVpbGQgVG9vbHMgMjAxNSAoeDg2LCB4NjQsIGFybSkKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyAyMDE3ICh4ODYsIHg2NCwgYXJtLCBhcm02NCkKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBCdWlsZCBUb29scyAyMDE3ICh4ODYsIHg2NCwgYXJtLCBhcm02NCkKCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBwbGF0X3NwZWM6IHN0cgogICAgICAgIFRhcmdldCBhcmNoaXRlY3R1cmUuCgogICAgUmV0dXJuCiAgICAtLS0tLS0KICAgIGVudmlyb25tZW50OiBkaWN0CiAgICAiIiIKICAgICMgVHJ5IHRvIGdldCBlbnZpcm9ubWVudCBmcm9tIHZjdmFyc2FsbC5iYXQgKENsYXNzaWNhbCB3YXkpCiAgICB0cnk6CiAgICAgICAgcmV0dXJuIGdldF91bnBhdGNoZWQobXN2YzE0X2dldF92Y19lbnYpKHBsYXRfc3BlYykKICAgIGV4Y2VwdCBkaXN0dXRpbHMuZXJyb3JzLkRpc3R1dGlsc1BsYXRmb3JtRXJyb3I6CiAgICAgICAgIyBQYXNzIGVycm9yIFZjdmFyc2FsbC5iYXQgaXMgbWlzc2luZwogICAgICAgIHBhc3MKCiAgICAjIElmIGVycm9yLCB0cnkgdG8gc2V0IGVudmlyb25tZW50IGRpcmVjdGx5CiAgICB0cnk6CiAgICAgICAgcmV0dXJuIEVudmlyb25tZW50SW5mbyhwbGF0X3NwZWMsIHZjX21pbl92ZXI9MTQuMCkucmV0dXJuX2VudigpCiAgICBleGNlcHQgZGlzdHV0aWxzLmVycm9ycy5EaXN0dXRpbHNQbGF0Zm9ybUVycm9yIGFzIGV4YzoKICAgICAgICBfYXVnbWVudF9leGNlcHRpb24oZXhjLCAxNC4wKQogICAgICAgIHJhaXNlCgoKZGVmIG1zdmMxNF9nZW5fbGliX29wdGlvbnMoKmFyZ3MsICoqa3dhcmdzKToKICAgICIiIgogICAgUGF0Y2hlZCAiZGlzdHV0aWxzLl9tc3ZjY29tcGlsZXIuZ2VuX2xpYl9vcHRpb25zIiBmb3IgZml4CiAgICBjb21wYXRpYmlsaXR5IGJldHdlZW4gIm51bXB5LmRpc3R1dGlscyIgYW5kICJkaXN0dXRpbHMuX21zdmNjb21waWxlciIKICAgIChmb3IgTnVtcHkgPCAxLjExLjIpCiAgICAiIiIKICAgIGlmICJudW1weS5kaXN0dXRpbHMiIGluIHN5cy5tb2R1bGVzOgogICAgICAgIGltcG9ydCBudW1weSBhcyBucAogICAgICAgIGlmIExlZ2FjeVZlcnNpb24obnAuX192ZXJzaW9uX18pIDwgTGVnYWN5VmVyc2lvbignMS4xMS4yJyk6CiAgICAgICAgICAgIHJldHVybiBucC5kaXN0dXRpbHMuY2NvbXBpbGVyLmdlbl9saWJfb3B0aW9ucygqYXJncywgKiprd2FyZ3MpCiAgICByZXR1cm4gZ2V0X3VucGF0Y2hlZChtc3ZjMTRfZ2VuX2xpYl9vcHRpb25zKSgqYXJncywgKiprd2FyZ3MpCgoKZGVmIF9hdWdtZW50X2V4Y2VwdGlvbihleGMsIHZlcnNpb24sIGFyY2g9JycpOgogICAgIiIiCiAgICBBZGQgZGV0YWlscyB0byB0aGUgZXhjZXB0aW9uIG1lc3NhZ2UgdG8gaGVscCBndWlkZSB0aGUgdXNlcgogICAgYXMgdG8gd2hhdCBhY3Rpb24gd2lsbCByZXNvbHZlIGl0LgogICAgIiIiCiAgICAjIEVycm9yIGlmIE1TVkMrKyBkaXJlY3Rvcnkgbm90IGZvdW5kIG9yIGVudmlyb25tZW50IG5vdCBzZXQKICAgIG1lc3NhZ2UgPSBleGMuYXJnc1swXQoKICAgIGlmICJ2Y3ZhcnNhbGwiIGluIG1lc3NhZ2UubG93ZXIoKSBvciAidmlzdWFsIGMiIGluIG1lc3NhZ2UubG93ZXIoKToKICAgICAgICAjIFNwZWNpYWwgZXJyb3IgbWVzc2FnZSBpZiBNU1ZDKysgbm90IGluc3RhbGxlZAogICAgICAgIHRtcGwgPSAnTWljcm9zb2Z0IFZpc3VhbCBDKysge3ZlcnNpb246MC4xZn0gaXMgcmVxdWlyZWQuJwogICAgICAgIG1lc3NhZ2UgPSB0bXBsLmZvcm1hdCgqKmxvY2FscygpKQogICAgICAgIG1zZG93bmxvYWQgPSAnd3d3Lm1pY3Jvc29mdC5jb20vZG93bmxvYWQvZGV0YWlscy5hc3B4P2lkPSVkJwogICAgICAgIGlmIHZlcnNpb24gPT0gOS4wOgogICAgICAgICAgICBpZiBhcmNoLmxvd2VyKCkuZmluZCgnaWE2NCcpID4gLTE6CiAgICAgICAgICAgICAgICAjIEZvciBWQysrIDkuMCwgaWYgSUE2NCBzdXBwb3J0IGlzIG5lZWRlZCwgcmVkaXJlY3QgdXNlcgogICAgICAgICAgICAgICAgIyB0byBXaW5kb3dzIFNESyA3LjAKICAgICAgICAgICAgICAgIG1lc3NhZ2UgKz0gJyBHZXQgaXQgd2l0aCAiTWljcm9zb2Z0IFdpbmRvd3MgU0RLIDcuMCI6ICcKICAgICAgICAgICAgICAgIG1lc3NhZ2UgKz0gbXNkb3dubG9hZCAlIDMxMzgKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgRm9yIFZDKysgOS4wIHJlZGlyZWN0IHVzZXIgdG8gVmMrKyBmb3IgUHl0aG9uIDIuNyA6CiAgICAgICAgICAgICAgICAjIFRoaXMgcmVkaXJlY3Rpb24gbGluayBpcyBtYWludGFpbmVkIGJ5IE1pY3Jvc29mdC4KICAgICAgICAgICAgICAgICMgQ29udGFjdCB2c3B5dGhvbkBtaWNyb3NvZnQuY29tIGlmIGl0IG5lZWRzIHVwZGF0aW5nLgogICAgICAgICAgICAgICAgbWVzc2FnZSArPSAnIEdldCBpdCBmcm9tIGh0dHA6Ly9ha2EubXMvdmNweXRob24yNycKICAgICAgICBlbGlmIHZlcnNpb24gPT0gMTAuMDoKICAgICAgICAgICAgIyBGb3IgVkMrKyAxMC4wIFJlZGlyZWN0IHVzZXIgdG8gV2luZG93cyBTREsgNy4xCiAgICAgICAgICAgIG1lc3NhZ2UgKz0gJyBHZXQgaXQgd2l0aCAiTWljcm9zb2Z0IFdpbmRvd3MgU0RLIDcuMSI6ICcKICAgICAgICAgICAgbWVzc2FnZSArPSBtc2Rvd25sb2FkICUgODI3OQogICAgICAgIGVsaWYgdmVyc2lvbiA+PSAxNC4wOgogICAgICAgICAgICAjIEZvciBWQysrIDE0LjAgUmVkaXJlY3QgdXNlciB0byBWaXN1YWwgQysrIEJ1aWxkIFRvb2xzCiAgICAgICAgICAgIG1lc3NhZ2UgKz0gKCcgR2V0IGl0IHdpdGggIk1pY3Jvc29mdCBWaXN1YWwgQysrIEJ1aWxkIFRvb2xzIjogJwogICAgICAgICAgICAgICAgICAgICAgICByJ2h0dHA6Ly9sYW5kaW5naHViLnZpc3VhbHN0dWRpby5jb20vJwogICAgICAgICAgICAgICAgICAgICAgICAndmlzdWFsLWNwcC1idWlsZC10b29scycpCgogICAgZXhjLmFyZ3MgPSAobWVzc2FnZSwgKQoKCmNsYXNzIFBsYXRmb3JtSW5mbzoKICAgICIiIgogICAgQ3VycmVudCBhbmQgVGFyZ2V0IEFyY2hpdGVjdHVyZXMgaW5mb3JtYXRpb25zLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIGFyY2g6IHN0cgogICAgICAgIFRhcmdldCBhcmNoaXRlY3R1cmUuCiAgICAiIiIKICAgIGN1cnJlbnRfY3B1ID0gc2FmZV9lbnYuZ2V0KCdwcm9jZXNzb3JfYXJjaGl0ZWN0dXJlJywgJycpLmxvd2VyKCkKCiAgICBkZWYgX19pbml0X18oc2VsZiwgYXJjaCk6CiAgICAgICAgc2VsZi5hcmNoID0gYXJjaC5sb3dlcigpLnJlcGxhY2UoJ3g2NCcsICdhbWQ2NCcpCgogICAgQHByb3BlcnR5CiAgICBkZWYgdGFyZ2V0X2NwdShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5hcmNoW3NlbGYuYXJjaC5maW5kKCdfJykgKyAxOl0KCiAgICBkZWYgdGFyZ2V0X2lzX3g4NihzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi50YXJnZXRfY3B1ID09ICd4ODYnCgogICAgZGVmIGN1cnJlbnRfaXNfeDg2KHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmN1cnJlbnRfY3B1ID09ICd4ODYnCgogICAgZGVmIGN1cnJlbnRfZGlyKHNlbGYsIGhpZGV4ODY9RmFsc2UsIHg2ND1GYWxzZSk6CiAgICAgICAgIiIiCiAgICAgICAgQ3VycmVudCBwbGF0Zm9ybSBzcGVjaWZpYyBzdWJmb2xkZXIuCgogICAgICAgIFBhcmFtZXRlcnMKICAgICAgICAtLS0tLS0tLS0tCiAgICAgICAgaGlkZXg4NjogYm9vbAogICAgICAgICAgICByZXR1cm4gJycgYW5kIG5vdCAnXHg4NicgaWYgYXJjaGl0ZWN0dXJlIGlzIHg4Ni4KICAgICAgICB4NjQ6IGJvb2wKICAgICAgICAgICAgcmV0dXJuICdceDY0JyBhbmQgbm90ICdcYW1kNjQnIGlmIGFyY2hpdGVjdHVyZSBpcyBhbWQ2NC4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgc3ViZm9sZGVyOiBzdHIKICAgICAgICAgICAgJ1x0YXJnZXQnLCBvciAnJyAoc2VlIGhpZGV4ODYgcGFyYW1ldGVyKQogICAgICAgICIiIgogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgICcnIGlmIChzZWxmLmN1cnJlbnRfY3B1ID09ICd4ODYnIGFuZCBoaWRleDg2KSBlbHNlCiAgICAgICAgICAgIHInXHg2NCcgaWYgKHNlbGYuY3VycmVudF9jcHUgPT0gJ2FtZDY0JyBhbmQgeDY0KSBlbHNlCiAgICAgICAgICAgIHInXCVzJyAlIHNlbGYuY3VycmVudF9jcHUKICAgICAgICApCgogICAgZGVmIHRhcmdldF9kaXIoc2VsZiwgaGlkZXg4Nj1GYWxzZSwgeDY0PUZhbHNlKToKICAgICAgICByIiIiCiAgICAgICAgVGFyZ2V0IHBsYXRmb3JtIHNwZWNpZmljIHN1YmZvbGRlci4KCiAgICAgICAgUGFyYW1ldGVycwogICAgICAgIC0tLS0tLS0tLS0KICAgICAgICBoaWRleDg2OiBib29sCiAgICAgICAgICAgIHJldHVybiAnJyBhbmQgbm90ICdceDg2JyBpZiBhcmNoaXRlY3R1cmUgaXMgeDg2LgogICAgICAgIHg2NDogYm9vbAogICAgICAgICAgICByZXR1cm4gJ1x4NjQnIGFuZCBub3QgJ1xhbWQ2NCcgaWYgYXJjaGl0ZWN0dXJlIGlzIGFtZDY0LgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBzdWJmb2xkZXI6IHN0cgogICAgICAgICAgICAnXGN1cnJlbnQnLCBvciAnJyAoc2VlIGhpZGV4ODYgcGFyYW1ldGVyKQogICAgICAgICIiIgogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgICcnIGlmIChzZWxmLnRhcmdldF9jcHUgPT0gJ3g4NicgYW5kIGhpZGV4ODYpIGVsc2UKICAgICAgICAgICAgcidceDY0JyBpZiAoc2VsZi50YXJnZXRfY3B1ID09ICdhbWQ2NCcgYW5kIHg2NCkgZWxzZQogICAgICAgICAgICByJ1wlcycgJSBzZWxmLnRhcmdldF9jcHUKICAgICAgICApCgogICAgZGVmIGNyb3NzX2RpcihzZWxmLCBmb3JjZXg4Nj1GYWxzZSk6CiAgICAgICAgciIiIgogICAgICAgIENyb3NzIHBsYXRmb3JtIHNwZWNpZmljIHN1YmZvbGRlci4KCiAgICAgICAgUGFyYW1ldGVycwogICAgICAgIC0tLS0tLS0tLS0KICAgICAgICBmb3JjZXg4NjogYm9vbAogICAgICAgICAgICBVc2UgJ3g4NicgYXMgY3VycmVudCBhcmNoaXRlY3R1cmUgZXZlbiBpZiBjdXJyZW50IGFjcml0ZWN0dXJlIGlzCiAgICAgICAgICAgIG5vdCB4ODYuCgogICAgICAgIFJldHVybgogICAgICAgIC0tLS0tLQogICAgICAgIHN1YmZvbGRlcjogc3RyCiAgICAgICAgICAgICcnIGlmIHRhcmdldCBhcmNoaXRlY3R1cmUgaXMgY3VycmVudCBhcmNoaXRlY3R1cmUsCiAgICAgICAgICAgICdcY3VycmVudF90YXJnZXQnIGlmIG5vdC4KICAgICAgICAiIiIKICAgICAgICBjdXJyZW50ID0gJ3g4NicgaWYgZm9yY2V4ODYgZWxzZSBzZWxmLmN1cnJlbnRfY3B1CiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgJycgaWYgc2VsZi50YXJnZXRfY3B1ID09IGN1cnJlbnQgZWxzZQogICAgICAgICAgICBzZWxmLnRhcmdldF9kaXIoKS5yZXBsYWNlKCdcXCcsICdcXCVzXycgJSBjdXJyZW50KQogICAgICAgICkKCgpjbGFzcyBSZWdpc3RyeUluZm86CiAgICAiIiIKICAgIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIHJlbGF0ZWQgcmVnaXN0cnkgaW5mb3JtYXRpb25zLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIHBsYXRmb3JtX2luZm86IFBsYXRmb3JtSW5mbwogICAgICAgICJQbGF0Zm9ybUluZm8iIGluc3RhbmNlLgogICAgIiIiCiAgICBIS0VZUyA9ICh3aW5yZWcuSEtFWV9VU0VSUywKICAgICAgICAgICAgIHdpbnJlZy5IS0VZX0NVUlJFTlRfVVNFUiwKICAgICAgICAgICAgIHdpbnJlZy5IS0VZX0xPQ0FMX01BQ0hJTkUsCiAgICAgICAgICAgICB3aW5yZWcuSEtFWV9DTEFTU0VTX1JPT1QpCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHBsYXRmb3JtX2luZm8pOgogICAgICAgIHNlbGYucGkgPSBwbGF0Zm9ybV9pbmZvCgogICAgQHByb3BlcnR5CiAgICBkZWYgdmlzdWFsc3R1ZGlvKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIHJvb3QgcmVnaXN0cnkga2V5LgogICAgICAgICIiIgogICAgICAgIHJldHVybiAnVmlzdWFsU3R1ZGlvJwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHN4cyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBTeFMgcmVnaXN0cnkga2V5LgogICAgICAgICIiIgogICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oc2VsZi52aXN1YWxzdHVkaW8sICdTeFMnKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHZjKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgQysrIFZDNyByZWdpc3RyeSBrZXkuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihzZWxmLnN4cywgJ1ZDNycpCgogICAgQHByb3BlcnR5CiAgICBkZWYgdnMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gVlM3IHJlZ2lzdHJ5IGtleS4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKHNlbGYuc3hzLCAnVlM3JykKCiAgICBAcHJvcGVydHkKICAgIGRlZiB2Y19mb3JfcHl0aG9uKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgQysrIGZvciBQeXRob24gcmVnaXN0cnkga2V5LgogICAgICAgICIiIgogICAgICAgIHJldHVybiByJ0RldkRpdlxWQ0ZvclB5dGhvbicKCiAgICBAcHJvcGVydHkKICAgIGRlZiBtaWNyb3NvZnRfc2RrKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBTREsgcmVnaXN0cnkga2V5LgogICAgICAgICIiIgogICAgICAgIHJldHVybiAnTWljcm9zb2Z0IFNES3MnCgogICAgQHByb3BlcnR5CiAgICBkZWYgd2luZG93c19zZGsoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFdpbmRvd3MvUGxhdGZvcm0gU0RLIHJlZ2lzdHJ5IGtleS4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKHNlbGYubWljcm9zb2Z0X3NkaywgJ1dpbmRvd3MnKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIG5ldGZ4X3NkayhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgLk5FVCBGcmFtZXdvcmsgU0RLIHJlZ2lzdHJ5IGtleS4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKHNlbGYubWljcm9zb2Z0X3NkaywgJ05FVEZYU0RLJykKCiAgICBAcHJvcGVydHkKICAgIGRlZiB3aW5kb3dzX2tpdHNfcm9vdHMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFdpbmRvd3MgS2l0cyBSb290cyByZWdpc3RyeSBrZXkuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHInV2luZG93cyBLaXRzXEluc3RhbGxlZCBSb290cycKCiAgICBkZWYgbWljcm9zb2Z0KHNlbGYsIGtleSwgeDg2PUZhbHNlKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4ga2V5IGluIE1pY3Jvc29mdCBzb2Z0d2FyZSByZWdpc3RyeS4KCiAgICAgICAgUGFyYW1ldGVycwogICAgICAgIC0tLS0tLS0tLS0KICAgICAgICBrZXk6IHN0cgogICAgICAgICAgICBSZWdpc3RyeSBrZXkgcGF0aCB3aGVyZSBsb29rLgogICAgICAgIHg4Njogc3RyCiAgICAgICAgICAgIEZvcmNlIHg4NiBzb2Z0d2FyZSByZWdpc3RyeS4KCiAgICAgICAgUmV0dXJuCiAgICAgICAgLS0tLS0tCiAgICAgICAgc3RyOiB2YWx1ZQogICAgICAgICIiIgogICAgICAgIG5vZGU2NCA9ICcnIGlmIHNlbGYucGkuY3VycmVudF9pc194ODYoKSBvciB4ODYgZWxzZSAnV293NjQzMk5vZGUnCiAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbignU29mdHdhcmUnLCBub2RlNjQsICdNaWNyb3NvZnQnLCBrZXkpCgogICAgZGVmIGxvb2t1cChzZWxmLCBrZXksIG5hbWUpOgogICAgICAgICIiIgogICAgICAgIExvb2sgZm9yIHZhbHVlcyBpbiByZWdpc3RyeSBpbiBNaWNyb3NvZnQgc29mdHdhcmUgcmVnaXN0cnkuCgogICAgICAgIFBhcmFtZXRlcnMKICAgICAgICAtLS0tLS0tLS0tCiAgICAgICAga2V5OiBzdHIKICAgICAgICAgICAgUmVnaXN0cnkga2V5IHBhdGggd2hlcmUgbG9vay4KICAgICAgICBuYW1lOiBzdHIKICAgICAgICAgICAgVmFsdWUgbmFtZSB0byBmaW5kLgoKICAgICAgICBSZXR1cm4KICAgICAgICAtLS0tLS0KICAgICAgICBzdHI6IHZhbHVlCiAgICAgICAgIiIiCiAgICAgICAgS0VZX1JFQUQgPSB3aW5yZWcuS0VZX1JFQUQKICAgICAgICBvcGVua2V5ID0gd2lucmVnLk9wZW5LZXkKICAgICAgICBtcyA9IHNlbGYubWljcm9zb2Z0CiAgICAgICAgZm9yIGhrZXkgaW4gc2VsZi5IS0VZUzoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgYmtleSA9IG9wZW5rZXkoaGtleSwgbXMoa2V5KSwgMCwgS0VZX1JFQUQpCiAgICAgICAgICAgIGV4Y2VwdCAoT1NFcnJvciwgSU9FcnJvcik6CiAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5waS5jdXJyZW50X2lzX3g4NigpOgogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgYmtleSA9IG9wZW5rZXkoaGtleSwgbXMoa2V5LCBUcnVlKSwgMCwgS0VZX1JFQUQpCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IChPU0Vycm9yLCBJT0Vycm9yKToKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcmV0dXJuIHdpbnJlZy5RdWVyeVZhbHVlRXgoYmtleSwgbmFtZSlbMF0KICAgICAgICAgICAgZXhjZXB0IChPU0Vycm9yLCBJT0Vycm9yKToKICAgICAgICAgICAgICAgIHBhc3MKCgpjbGFzcyBTeXN0ZW1JbmZvOgogICAgIiIiCiAgICBNaWNyb3NvZnQgV2luZG93cyBhbmQgVmlzdWFsIFN0dWRpbyByZWxhdGVkIHN5c3RlbSBpbm9ybWF0aW9ucy4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICByZWdpc3RyeV9pbmZvOiBSZWdpc3RyeUluZm8KICAgICAgICAiUmVnaXN0cnlJbmZvIiBpbnN0YW5jZS4KICAgIHZjX3ZlcjogZmxvYXQKICAgICAgICBSZXF1aXJlZCBNaWNyb3NvZnQgVmlzdWFsIEMrKyB2ZXJzaW9uLgogICAgIiIiCgogICAgIyBWYXJpYWJsZXMgYW5kIHByb3BlcnRpZXMgaW4gdGhpcyBjbGFzcyB1c2Ugb3JpZ2luYWxzIENhbWVsQ2FzZSB2YXJpYWJsZXMKICAgICMgbmFtZXMgZnJvbSBNaWNyb3NvZnQgc291cmNlIGZpbGVzIGZvciBtb3JlIGVhc3kgY29tcGFyYWlzb24uCiAgICBXaW5EaXIgPSBzYWZlX2Vudi5nZXQoJ1dpbkRpcicsICcnKQogICAgUHJvZ3JhbUZpbGVzID0gc2FmZV9lbnYuZ2V0KCdQcm9ncmFtRmlsZXMnLCAnJykKICAgIFByb2dyYW1GaWxlc3g4NiA9IHNhZmVfZW52LmdldCgnUHJvZ3JhbUZpbGVzKHg4NiknLCBQcm9ncmFtRmlsZXMpCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHJlZ2lzdHJ5X2luZm8sIHZjX3Zlcj1Ob25lKToKICAgICAgICBzZWxmLnJpID0gcmVnaXN0cnlfaW5mbwogICAgICAgIHNlbGYucGkgPSBzZWxmLnJpLnBpCiAgICAgICAgc2VsZi52Y192ZXIgPSB2Y192ZXIgb3Igc2VsZi5fZmluZF9sYXRlc3RfYXZhaWxhYmxlX3ZjX3ZlcigpCgogICAgZGVmIF9maW5kX2xhdGVzdF9hdmFpbGFibGVfdmNfdmVyKHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuZmluZF9hdmFpbGFibGVfdmNfdmVycygpWy0xXQogICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgogICAgICAgICAgICBlcnIgPSAnTm8gTWljcm9zb2Z0IFZpc3VhbCBDKysgdmVyc2lvbiBmb3VuZCcKICAgICAgICAgICAgcmFpc2UgZGlzdHV0aWxzLmVycm9ycy5EaXN0dXRpbHNQbGF0Zm9ybUVycm9yKGVycikKCiAgICBkZWYgZmluZF9hdmFpbGFibGVfdmNfdmVycyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBGaW5kIGFsbCBhdmFpbGFibGUgTWljcm9zb2Z0IFZpc3VhbCBDKysgdmVyc2lvbnMuCiAgICAgICAgIiIiCiAgICAgICAgbXMgPSBzZWxmLnJpLm1pY3Jvc29mdAogICAgICAgIHZja2V5cyA9IChzZWxmLnJpLnZjLCBzZWxmLnJpLnZjX2Zvcl9weXRob24sIHNlbGYucmkudnMpCiAgICAgICAgdmNfdmVycyA9IFtdCiAgICAgICAgZm9yIGhrZXkgaW4gc2VsZi5yaS5IS0VZUzoKICAgICAgICAgICAgZm9yIGtleSBpbiB2Y2tleXM6CiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgYmtleSA9IHdpbnJlZy5PcGVuS2V5KGhrZXksIG1zKGtleSksIDAsIHdpbnJlZy5LRVlfUkVBRCkKICAgICAgICAgICAgICAgIGV4Y2VwdCAoT1NFcnJvciwgSU9FcnJvcik6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIHN1YmtleXMsIHZhbHVlcywgXyA9IHdpbnJlZy5RdWVyeUluZm9LZXkoYmtleSkKICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHZhbHVlcyk6CiAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICB2ZXIgPSBmbG9hdCh3aW5yZWcuRW51bVZhbHVlKGJrZXksIGkpWzBdKQogICAgICAgICAgICAgICAgICAgICAgICBpZiB2ZXIgbm90IGluIHZjX3ZlcnM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Y192ZXJzLmFwcGVuZCh2ZXIpCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHN1YmtleXMpOgogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgdmVyID0gZmxvYXQod2lucmVnLkVudW1LZXkoYmtleSwgaSkpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHZlciBub3QgaW4gdmNfdmVyczoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZjX3ZlcnMuYXBwZW5kKHZlcikKICAgICAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgIHJldHVybiBzb3J0ZWQodmNfdmVycykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBWU0luc3RhbGxEaXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gZGlyZWN0b3J5LgogICAgICAgICIiIgogICAgICAgICMgRGVmYXVsdCBwYXRoCiAgICAgICAgbmFtZSA9ICdNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyAlMC4xZicgJSBzZWxmLnZjX3ZlcgogICAgICAgIGRlZmF1bHQgPSBvcy5wYXRoLmpvaW4oc2VsZi5Qcm9ncmFtRmlsZXN4ODYsIG5hbWUpCgogICAgICAgICMgVHJ5IHRvIGdldCBwYXRoIGZyb20gcmVnaXN0cnksIGlmIGZhaWwgdXNlIGRlZmF1bHQgcGF0aAogICAgICAgIHJldHVybiBzZWxmLnJpLmxvb2t1cChzZWxmLnJpLnZzLCAnJTAuMWYnICUgc2VsZi52Y192ZXIpIG9yIGRlZmF1bHQKCiAgICBAcHJvcGVydHkKICAgIGRlZiBWQ0luc3RhbGxEaXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBDKysgZGlyZWN0b3J5LgogICAgICAgICIiIgogICAgICAgIHNlbGYuVlNJbnN0YWxsRGlyCgogICAgICAgIGd1ZXNzX3ZjID0gc2VsZi5fZ3Vlc3NfdmMoKSBvciBzZWxmLl9ndWVzc192Y19sZWdhY3koKQoKICAgICAgICAjIFRyeSB0byBnZXQgIlZDKysgZm9yIFB5dGhvbiIgcGF0aCBmcm9tIHJlZ2lzdHJ5IGFzIGRlZmF1bHQgcGF0aAogICAgICAgIHJlZ19wYXRoID0gb3MucGF0aC5qb2luKHNlbGYucmkudmNfZm9yX3B5dGhvbiwgJyUwLjFmJyAlIHNlbGYudmNfdmVyKQogICAgICAgIHB5dGhvbl92YyA9IHNlbGYucmkubG9va3VwKHJlZ19wYXRoLCAnaW5zdGFsbGRpcicpCiAgICAgICAgZGVmYXVsdF92YyA9IG9zLnBhdGguam9pbihweXRob25fdmMsICdWQycpIGlmIHB5dGhvbl92YyBlbHNlIGd1ZXNzX3ZjCgogICAgICAgICMgVHJ5IHRvIGdldCBwYXRoIGZyb20gcmVnaXN0cnksIGlmIGZhaWwgdXNlIGRlZmF1bHQgcGF0aAogICAgICAgIHBhdGggPSBzZWxmLnJpLmxvb2t1cChzZWxmLnJpLnZjLCAnJTAuMWYnICUgc2VsZi52Y192ZXIpIG9yIGRlZmF1bHRfdmMKCiAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIocGF0aCk6CiAgICAgICAgICAgIG1zZyA9ICdNaWNyb3NvZnQgVmlzdWFsIEMrKyBkaXJlY3Rvcnkgbm90IGZvdW5kJwogICAgICAgICAgICByYWlzZSBkaXN0dXRpbHMuZXJyb3JzLkRpc3R1dGlsc1BsYXRmb3JtRXJyb3IobXNnKQoKICAgICAgICByZXR1cm4gcGF0aAoKICAgIGRlZiBfZ3Vlc3NfdmMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTG9jYXRlIFZpc3VhbCBDIGZvciAyMDE3CiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPD0gMTQuMDoKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGRlZmF1bHQgPSByJ1ZDXFRvb2xzXE1TVkMnCiAgICAgICAgZ3Vlc3NfdmMgPSBvcy5wYXRoLmpvaW4oc2VsZi5WU0luc3RhbGxEaXIsIGRlZmF1bHQpCiAgICAgICAgIyBTdWJkaXIgd2l0aCBWQyBleGFjdCB2ZXJzaW9uIGFzIG5hbWUKICAgICAgICB0cnk6CiAgICAgICAgICAgIHZjX2V4YWN0X3ZlciA9IG9zLmxpc3RkaXIoZ3Vlc3NfdmMpWy0xXQogICAgICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKGd1ZXNzX3ZjLCB2Y19leGFjdF92ZXIpCiAgICAgICAgZXhjZXB0IChPU0Vycm9yLCBJT0Vycm9yLCBJbmRleEVycm9yKToKICAgICAgICAgICAgcGFzcwoKICAgIGRlZiBfZ3Vlc3NfdmNfbGVnYWN5KHNlbGYpOgogICAgICAgICIiIgogICAgICAgIExvY2F0ZSBWaXN1YWwgQyBmb3IgdmVyc2lvbnMgcHJpb3IgdG8gMjAxNwogICAgICAgICIiIgogICAgICAgIGRlZmF1bHQgPSByJ01pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvICUwLjFmXFZDJyAlIHNlbGYudmNfdmVyCiAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihzZWxmLlByb2dyYW1GaWxlc3g4NiwgZGVmYXVsdCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBXaW5kb3dzU2RrVmVyc2lvbihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgV2luZG93cyBTREsgdmVyc2lvbnMgZm9yIHNwZWNpZmllZCBNU1ZDKysgdmVyc2lvbi4KICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnZjX3ZlciA8PSA5LjA6CiAgICAgICAgICAgIHJldHVybiAoJzcuMCcsICc2LjEnLCAnNi4wYScpCiAgICAgICAgZWxpZiBzZWxmLnZjX3ZlciA9PSAxMC4wOgogICAgICAgICAgICByZXR1cm4gKCc3LjEnLCAnNy4wYScpCiAgICAgICAgZWxpZiBzZWxmLnZjX3ZlciA9PSAxMS4wOgogICAgICAgICAgICByZXR1cm4gKCc4LjAnLCAnOC4wYScpCiAgICAgICAgZWxpZiBzZWxmLnZjX3ZlciA9PSAxMi4wOgogICAgICAgICAgICByZXR1cm4gKCc4LjEnLCAnOC4xYScpCiAgICAgICAgZWxpZiBzZWxmLnZjX3ZlciA+PSAxNC4wOgogICAgICAgICAgICByZXR1cm4gKCcxMC4wJywgJzguMScpCgogICAgQHByb3BlcnR5CiAgICBkZWYgV2luZG93c1Nka0xhc3RWZXJzaW9uKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBXaW5kb3dzIFNESyBsYXN0IHZlcnNpb24KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5fdXNlX2xhc3RfZGlyX25hbWUob3MucGF0aC5qb2luKAogICAgICAgICAgICBzZWxmLldpbmRvd3NTZGtEaXIsICdsaWInKSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBXaW5kb3dzU2RrRGlyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBXaW5kb3dzIFNESyBkaXJlY3RvcnkuCiAgICAgICAgIiIiCiAgICAgICAgc2RrZGlyID0gJycKICAgICAgICBmb3IgdmVyIGluIHNlbGYuV2luZG93c1Nka1ZlcnNpb246CiAgICAgICAgICAgICMgVHJ5IHRvIGdldCBpdCBmcm9tIHJlZ2lzdHJ5CiAgICAgICAgICAgIGxvYyA9IG9zLnBhdGguam9pbihzZWxmLnJpLndpbmRvd3Nfc2RrLCAndiVzJyAlIHZlcikKICAgICAgICAgICAgc2RrZGlyID0gc2VsZi5yaS5sb29rdXAobG9jLCAnaW5zdGFsbGF0aW9uZm9sZGVyJykKICAgICAgICAgICAgaWYgc2RrZGlyOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBpZiBub3Qgc2RrZGlyIG9yIG5vdCBvcy5wYXRoLmlzZGlyKHNka2Rpcik6CiAgICAgICAgICAgICMgVHJ5IHRvIGdldCAiVkMrKyBmb3IgUHl0aG9uIiB2ZXJzaW9uIGZyb20gcmVnaXN0cnkKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLnJpLnZjX2Zvcl9weXRob24sICclMC4xZicgJSBzZWxmLnZjX3ZlcikKICAgICAgICAgICAgaW5zdGFsbF9iYXNlID0gc2VsZi5yaS5sb29rdXAocGF0aCwgJ2luc3RhbGxkaXInKQogICAgICAgICAgICBpZiBpbnN0YWxsX2Jhc2U6CiAgICAgICAgICAgICAgICBzZGtkaXIgPSBvcy5wYXRoLmpvaW4oaW5zdGFsbF9iYXNlLCAnV2luU0RLJykKICAgICAgICBpZiBub3Qgc2RrZGlyIG9yIG5vdCBvcy5wYXRoLmlzZGlyKHNka2Rpcik6CiAgICAgICAgICAgICMgSWYgZmFpbCwgdXNlIGRlZmF1bHQgbmV3IHBhdGgKICAgICAgICAgICAgZm9yIHZlciBpbiBzZWxmLldpbmRvd3NTZGtWZXJzaW9uOgogICAgICAgICAgICAgICAgaW50dmVyID0gdmVyWzp2ZXIucmZpbmQoJy4nKV0KICAgICAgICAgICAgICAgIHBhdGggPSByJ01pY3Jvc29mdCBTREtzXFdpbmRvd3MgS2l0c1wlcycgJSAoaW50dmVyKQogICAgICAgICAgICAgICAgZCA9IG9zLnBhdGguam9pbihzZWxmLlByb2dyYW1GaWxlcywgcGF0aCkKICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZCk6CiAgICAgICAgICAgICAgICAgICAgc2RrZGlyID0gZAogICAgICAgIGlmIG5vdCBzZGtkaXIgb3Igbm90IG9zLnBhdGguaXNkaXIoc2RrZGlyKToKICAgICAgICAgICAgIyBJZiBmYWlsLCB1c2UgZGVmYXVsdCBvbGQgcGF0aAogICAgICAgICAgICBmb3IgdmVyIGluIHNlbGYuV2luZG93c1Nka1ZlcnNpb246CiAgICAgICAgICAgICAgICBwYXRoID0gcidNaWNyb3NvZnQgU0RLc1xXaW5kb3dzXHYlcycgJSB2ZXIKICAgICAgICAgICAgICAgIGQgPSBvcy5wYXRoLmpvaW4oc2VsZi5Qcm9ncmFtRmlsZXMsIHBhdGgpCiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGQpOgogICAgICAgICAgICAgICAgICAgIHNka2RpciA9IGQKICAgICAgICBpZiBub3Qgc2RrZGlyOgogICAgICAgICAgICAjIElmIGZhaWwsIHVzZSBQbGF0Zm9ybSBTREsKICAgICAgICAgICAgc2RrZGlyID0gb3MucGF0aC5qb2luKHNlbGYuVkNJbnN0YWxsRGlyLCAnUGxhdGZvcm1TREsnKQogICAgICAgIHJldHVybiBzZGtkaXIKCiAgICBAcHJvcGVydHkKICAgIGRlZiBXaW5kb3dzU0RLRXhlY3V0YWJsZVBhdGgoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFdpbmRvd3MgU0RLIGV4ZWN1dGFibGUgZGlyZWN0b3J5LgogICAgICAgICIiIgogICAgICAgICMgRmluZCBXaW5TREsgTmV0RnggVG9vbHMgcmVnaXN0cnkgZGlyIG5hbWUKICAgICAgICBpZiBzZWxmLnZjX3ZlciA8PSAxMS4wOgogICAgICAgICAgICBuZXRmeHZlciA9IDM1CiAgICAgICAgICAgIGFyY2ggPSAnJwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG5ldGZ4dmVyID0gNDAKICAgICAgICAgICAgaGlkZXg4NiA9IFRydWUgaWYgc2VsZi52Y192ZXIgPD0gMTIuMCBlbHNlIEZhbHNlCiAgICAgICAgICAgIGFyY2ggPSBzZWxmLnBpLmN1cnJlbnRfZGlyKHg2ND1UcnVlLCBoaWRleDg2PWhpZGV4ODYpCiAgICAgICAgZnggPSAnV2luU0RLLU5ldEZ4JWRUb29scyVzJyAlIChuZXRmeHZlciwgYXJjaC5yZXBsYWNlKCdcXCcsICctJykpCgogICAgICAgICMgbGlzdGUgYWxsIHBvc3NpYmxlcyByZWdpc3RyeSBwYXRocwogICAgICAgIHJlZ3BhdGhzID0gW10KICAgICAgICBpZiBzZWxmLnZjX3ZlciA+PSAxNC4wOgogICAgICAgICAgICBmb3IgdmVyIGluIHNlbGYuTmV0RnhTZGtWZXJzaW9uOgogICAgICAgICAgICAgICAgcmVncGF0aHMgKz0gW29zLnBhdGguam9pbihzZWxmLnJpLm5ldGZ4X3NkaywgdmVyLCBmeCldCgogICAgICAgIGZvciB2ZXIgaW4gc2VsZi5XaW5kb3dzU2RrVmVyc2lvbjoKICAgICAgICAgICAgcmVncGF0aHMgKz0gW29zLnBhdGguam9pbihzZWxmLnJpLndpbmRvd3Nfc2RrLCAndiVzQScgJSB2ZXIsIGZ4KV0KCiAgICAgICAgIyBSZXR1cm4gaW5zdGFsbGF0aW9uIGZvbGRlciBmcm9tIHRoZSBtb3JlIHJlY2VudCBwYXRoCiAgICAgICAgZm9yIHBhdGggaW4gcmVncGF0aHM6CiAgICAgICAgICAgIGV4ZWNwYXRoID0gc2VsZi5yaS5sb29rdXAocGF0aCwgJ2luc3RhbGxhdGlvbmZvbGRlcicpCiAgICAgICAgICAgIGlmIGV4ZWNwYXRoOgogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICByZXR1cm4gZXhlY3BhdGgKCiAgICBAcHJvcGVydHkKICAgIGRlZiBGU2hhcnBJbnN0YWxsRGlyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgRiMgZGlyZWN0b3J5LgogICAgICAgICIiIgogICAgICAgIHBhdGggPSByJyUwLjFmXFNldHVwXEYjJyAlIHNlbGYudmNfdmVyCiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLnJpLnZpc3VhbHN0dWRpbywgcGF0aCkKICAgICAgICByZXR1cm4gc2VsZi5yaS5sb29rdXAocGF0aCwgJ3Byb2R1Y3RkaXInKSBvciAnJwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFVuaXZlcnNhbENSVFNka0RpcihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVW5pdmVyc2FsIENSVCBTREsgZGlyZWN0b3J5LgogICAgICAgICIiIgogICAgICAgICMgU2V0IEtpdCBSb290cyB2ZXJzaW9ucyBmb3Igc3BlY2lmaWVkIE1TVkMrKyB2ZXJzaW9uCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPj0gMTQuMDoKICAgICAgICAgICAgdmVycyA9ICgnMTAnLCAnODEnKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHZlcnMgPSAoKQoKICAgICAgICAjIEZpbmQgcGF0aCBvZiB0aGUgbW9yZSByZWNlbnQgS2l0CiAgICAgICAgZm9yIHZlciBpbiB2ZXJzOgogICAgICAgICAgICBzZGtkaXIgPSBzZWxmLnJpLmxvb2t1cChzZWxmLnJpLndpbmRvd3Nfa2l0c19yb290cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2tpdHNyb290JXMnICUgdmVyKQogICAgICAgICAgICBpZiBzZGtkaXI6CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgIHJldHVybiBzZGtkaXIgb3IgJycKCiAgICBAcHJvcGVydHkKICAgIGRlZiBVbml2ZXJzYWxDUlRTZGtMYXN0VmVyc2lvbihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVW5pdmVyc2FsIEMgUnVudGltZSBTREsgbGFzdCB2ZXJzaW9uCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuX3VzZV9sYXN0X2Rpcl9uYW1lKG9zLnBhdGguam9pbigKICAgICAgICAgICAgc2VsZi5Vbml2ZXJzYWxDUlRTZGtEaXIsICdsaWInKSkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBOZXRGeFNka1ZlcnNpb24oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IC5ORVQgRnJhbWV3b3JrIFNESyB2ZXJzaW9ucy4KICAgICAgICAiIiIKICAgICAgICAjIFNldCBGeFNkayB2ZXJzaW9ucyBmb3Igc3BlY2lmaWVkIE1TVkMrKyB2ZXJzaW9uCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPj0gMTQuMDoKICAgICAgICAgICAgcmV0dXJuICgnNC42LjEnLCAnNC42JykKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gKCkKCiAgICBAcHJvcGVydHkKICAgIGRlZiBOZXRGeFNka0RpcihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgLk5FVCBGcmFtZXdvcmsgU0RLIGRpcmVjdG9yeS4KICAgICAgICAiIiIKICAgICAgICBmb3IgdmVyIGluIHNlbGYuTmV0RnhTZGtWZXJzaW9uOgogICAgICAgICAgICBsb2MgPSBvcy5wYXRoLmpvaW4oc2VsZi5yaS5uZXRmeF9zZGssIHZlcikKICAgICAgICAgICAgc2RrZGlyID0gc2VsZi5yaS5sb29rdXAobG9jLCAna2l0c2luc3RhbGxhdGlvbmZvbGRlcicpCiAgICAgICAgICAgIGlmIHNka2RpcjoKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgcmV0dXJuIHNka2RpciBvciAnJwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIEZyYW1ld29ya0RpcjMyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCAuTkVUIEZyYW1ld29yayAzMmJpdCBkaXJlY3RvcnkuCiAgICAgICAgIiIiCiAgICAgICAgIyBEZWZhdWx0IHBhdGgKICAgICAgICBndWVzc19mdyA9IG9zLnBhdGguam9pbihzZWxmLldpbkRpciwgcidNaWNyb3NvZnQuTkVUXEZyYW1ld29yaycpCgogICAgICAgICMgVHJ5IHRvIGdldCBwYXRoIGZyb20gcmVnaXN0cnksIGlmIGZhaWwgdXNlIGRlZmF1bHQgcGF0aAogICAgICAgIHJldHVybiBzZWxmLnJpLmxvb2t1cChzZWxmLnJpLnZjLCAnZnJhbWV3b3JrZGlyMzInKSBvciBndWVzc19mdwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIEZyYW1ld29ya0RpcjY0KHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCAuTkVUIEZyYW1ld29yayA2NGJpdCBkaXJlY3RvcnkuCiAgICAgICAgIiIiCiAgICAgICAgIyBEZWZhdWx0IHBhdGgKICAgICAgICBndWVzc19mdyA9IG9zLnBhdGguam9pbihzZWxmLldpbkRpciwgcidNaWNyb3NvZnQuTkVUXEZyYW1ld29yazY0JykKCiAgICAgICAgIyBUcnkgdG8gZ2V0IHBhdGggZnJvbSByZWdpc3RyeSwgaWYgZmFpbCB1c2UgZGVmYXVsdCBwYXRoCiAgICAgICAgcmV0dXJuIHNlbGYucmkubG9va3VwKHNlbGYucmkudmMsICdmcmFtZXdvcmtkaXI2NCcpIG9yIGd1ZXNzX2Z3CgogICAgQHByb3BlcnR5CiAgICBkZWYgRnJhbWV3b3JrVmVyc2lvbjMyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCAuTkVUIEZyYW1ld29yayAzMmJpdCB2ZXJzaW9ucy4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5fZmluZF9kb3RfbmV0X3ZlcnNpb25zKDMyKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIEZyYW1ld29ya1ZlcnNpb242NChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgLk5FVCBGcmFtZXdvcmsgNjRiaXQgdmVyc2lvbnMuCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbmRfZG90X25ldF92ZXJzaW9ucyg2NCkKCiAgICBkZWYgX2ZpbmRfZG90X25ldF92ZXJzaW9ucyhzZWxmLCBiaXRzKToKICAgICAgICAiIiIKICAgICAgICBGaW5kIE1pY3Jvc29mdCAuTkVUIEZyYW1ld29yayB2ZXJzaW9ucy4KCiAgICAgICAgUGFyYW1ldGVycwogICAgICAgIC0tLS0tLS0tLS0KICAgICAgICBiaXRzOiBpbnQKICAgICAgICAgICAgUGxhdGZvcm0gbnVtYmVyIG9mIGJpdHM6IDMyIG9yIDY0LgogICAgICAgICIiIgogICAgICAgICMgRmluZCBhY3R1YWwgLk5FVCB2ZXJzaW9uIGluIHJlZ2lzdHJ5CiAgICAgICAgcmVnX3ZlciA9IHNlbGYucmkubG9va3VwKHNlbGYucmkudmMsICdmcmFtZXdvcmt2ZXIlZCcgJSBiaXRzKQogICAgICAgIGRvdF9uZXRfZGlyID0gZ2V0YXR0cihzZWxmLCAnRnJhbWV3b3JrRGlyJWQnICUgYml0cykKICAgICAgICB2ZXIgPSByZWdfdmVyIG9yIHNlbGYuX3VzZV9sYXN0X2Rpcl9uYW1lKGRvdF9uZXRfZGlyLCAndicpIG9yICcnCgogICAgICAgICMgU2V0IC5ORVQgdmVyc2lvbnMgZm9yIHNwZWNpZmllZCBNU1ZDKysgdmVyc2lvbgogICAgICAgIGlmIHNlbGYudmNfdmVyID49IDEyLjA6CiAgICAgICAgICAgIGZyYW1ld29ya3ZlciA9ICh2ZXIsICd2NC4wJykKICAgICAgICBlbGlmIHNlbGYudmNfdmVyID49IDEwLjA6CiAgICAgICAgICAgIGZyYW1ld29ya3ZlciA9ICgndjQuMC4zMDMxOScgaWYgdmVyLmxvd2VyKClbOjJdICE9ICd2NCcgZWxzZSB2ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndjMuNScpCiAgICAgICAgZWxpZiBzZWxmLnZjX3ZlciA9PSA5LjA6CiAgICAgICAgICAgIGZyYW1ld29ya3ZlciA9ICgndjMuNScsICd2Mi4wLjUwNzI3JykKICAgICAgICBpZiBzZWxmLnZjX3ZlciA9PSA4LjA6CiAgICAgICAgICAgIGZyYW1ld29ya3ZlciA9ICgndjMuMCcsICd2Mi4wLjUwNzI3JykKICAgICAgICByZXR1cm4gZnJhbWV3b3JrdmVyCgogICAgZGVmIF91c2VfbGFzdF9kaXJfbmFtZShzZWxmLCBwYXRoLCBwcmVmaXg9JycpOgogICAgICAgICIiIgogICAgICAgIFJldHVybiBuYW1lIG9mIHRoZSBsYXN0IGRpciBpbiBwYXRoIG9yICcnIGlmIG5vIGRpciBmb3VuZC4KCiAgICAgICAgUGFyYW1ldGVycwogICAgICAgIC0tLS0tLS0tLS0KICAgICAgICBwYXRoOiBzdHIKICAgICAgICAgICAgVXNlIGRpcnMgaW4gdGhpcyBwYXRoCiAgICAgICAgcHJlZml4OiBzdHIKICAgICAgICAgICAgVXNlIG9ubHkgZGlycyBzdGFydGluZ3MgYnkgdGhpcyBwcmVmaXgKICAgICAgICAiIiIKICAgICAgICBtYXRjaGluZ19kaXJzID0gKAogICAgICAgICAgICBkaXJfbmFtZQogICAgICAgICAgICBmb3IgZGlyX25hbWUgaW4gcmV2ZXJzZWQob3MubGlzdGRpcihwYXRoKSkKICAgICAgICAgICAgaWYgb3MucGF0aC5pc2Rpcihvcy5wYXRoLmpvaW4ocGF0aCwgZGlyX25hbWUpKSBhbmQKICAgICAgICAgICAgZGlyX25hbWUuc3RhcnRzd2l0aChwcmVmaXgpCiAgICAgICAgKQogICAgICAgIHJldHVybiBuZXh0KG1hdGNoaW5nX2RpcnMsIE5vbmUpIG9yICcnCgoKY2xhc3MgRW52aXJvbm1lbnRJbmZvOgogICAgIiIiCiAgICBSZXR1cm4gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBzcGVjaWZpZWQgTWljcm9zb2Z0IFZpc3VhbCBDKysgdmVyc2lvbgogICAgYW5kIHBsYXRmb3JtIDogTGliLCBJbmNsdWRlLCBQYXRoIGFuZCBsaWJwYXRoLgoKICAgIFRoaXMgZnVuY3Rpb24gaXMgY29tcGF0aWJsZSB3aXRoIE1pY3Jvc29mdCBWaXN1YWwgQysrIDkuMCB0byAxNC4wLgoKICAgIFNjcmlwdCBjcmVhdGVkIGJ5IGFuYWx5c2luZyBNaWNyb3NvZnQgZW52aXJvbm1lbnQgY29uZmlndXJhdGlvbiBmaWxlcyBsaWtlCiAgICAidmN2YXJzWy4uLl0uYmF0IiwgIlNldEVudi5DbWQiLCAidmNidWlsZHRvb2xzLmJhdCIsIC4uLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIGFyY2g6IHN0cgogICAgICAgIFRhcmdldCBhcmNoaXRlY3R1cmUuCiAgICB2Y192ZXI6IGZsb2F0CiAgICAgICAgUmVxdWlyZWQgTWljcm9zb2Z0IFZpc3VhbCBDKysgdmVyc2lvbi4gSWYgbm90IHNldCwgYXV0b2RldGVjdCB0aGUgbGFzdAogICAgICAgIHZlcnNpb24uCiAgICB2Y19taW5fdmVyOiBmbG9hdAogICAgICAgIE1pbmltdW0gTWljcm9zb2Z0IFZpc3VhbCBDKysgdmVyc2lvbi4KICAgICIiIgoKICAgICMgVmFyaWFibGVzIGFuZCBwcm9wZXJ0aWVzIGluIHRoaXMgY2xhc3MgdXNlIG9yaWdpbmFscyBDYW1lbENhc2UgdmFyaWFibGVzCiAgICAjIG5hbWVzIGZyb20gTWljcm9zb2Z0IHNvdXJjZSBmaWxlcyBmb3IgbW9yZSBlYXN5IGNvbXBhcmFpc29uLgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhcmNoLCB2Y192ZXI9Tm9uZSwgdmNfbWluX3Zlcj0wKToKICAgICAgICBzZWxmLnBpID0gUGxhdGZvcm1JbmZvKGFyY2gpCiAgICAgICAgc2VsZi5yaSA9IFJlZ2lzdHJ5SW5mbyhzZWxmLnBpKQogICAgICAgIHNlbGYuc2kgPSBTeXN0ZW1JbmZvKHNlbGYucmksIHZjX3ZlcikKCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPCB2Y19taW5fdmVyOgogICAgICAgICAgICBlcnIgPSAnTm8gc3VpdGFibGUgTWljcm9zb2Z0IFZpc3VhbCBDKysgdmVyc2lvbiBmb3VuZCcKICAgICAgICAgICAgcmFpc2UgZGlzdHV0aWxzLmVycm9ycy5EaXN0dXRpbHNQbGF0Zm9ybUVycm9yKGVycikKCiAgICBAcHJvcGVydHkKICAgIGRlZiB2Y192ZXIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBDKysgdmVyc2lvbi4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5zaS52Y192ZXIKCiAgICBAcHJvcGVydHkKICAgIGRlZiBWU1Rvb2xzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFRvb2xzCiAgICAgICAgIiIiCiAgICAgICAgcGF0aHMgPSBbcidDb21tb243XElERScsIHInQ29tbW9uN1xUb29scyddCgogICAgICAgIGlmIHNlbGYudmNfdmVyID49IDE0LjA6CiAgICAgICAgICAgIGFyY2hfc3ViZGlyID0gc2VsZi5waS5jdXJyZW50X2RpcihoaWRleDg2PVRydWUsIHg2ND1UcnVlKQogICAgICAgICAgICBwYXRocyArPSBbcidDb21tb243XElERVxDb21tb25FeHRlbnNpb25zXE1pY3Jvc29mdFxUZXN0V2luZG93J10KICAgICAgICAgICAgcGF0aHMgKz0gW3InVGVhbSBUb29sc1xQZXJmb3JtYW5jZSBUb29scyddCiAgICAgICAgICAgIHBhdGhzICs9IFtyJ1RlYW0gVG9vbHNcUGVyZm9ybWFuY2UgVG9vbHMlcycgJSBhcmNoX3N1YmRpcl0KCiAgICAgICAgcmV0dXJuIFtvcy5wYXRoLmpvaW4oc2VsZi5zaS5WU0luc3RhbGxEaXIsIHBhdGgpIGZvciBwYXRoIGluIHBhdGhzXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFZDSW5jbHVkZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBDKysgJiBNaWNyb3NvZnQgRm91bmRhdGlvbiBDbGFzcyBJbmNsdWRlcwogICAgICAgICIiIgogICAgICAgIHJldHVybiBbb3MucGF0aC5qb2luKHNlbGYuc2kuVkNJbnN0YWxsRGlyLCAnSW5jbHVkZScpLAogICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHNlbGYuc2kuVkNJbnN0YWxsRGlyLCByJ0FUTE1GQ1xJbmNsdWRlJyldCgogICAgQHByb3BlcnR5CiAgICBkZWYgVkNMaWJyYXJpZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBDKysgJiBNaWNyb3NvZnQgRm91bmRhdGlvbiBDbGFzcyBMaWJyYXJpZXMKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnZjX3ZlciA+PSAxNS4wOgogICAgICAgICAgICBhcmNoX3N1YmRpciA9IHNlbGYucGkudGFyZ2V0X2Rpcih4NjQ9VHJ1ZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBhcmNoX3N1YmRpciA9IHNlbGYucGkudGFyZ2V0X2RpcihoaWRleDg2PVRydWUpCiAgICAgICAgcGF0aHMgPSBbJ0xpYiVzJyAlIGFyY2hfc3ViZGlyLCByJ0FUTE1GQ1xMaWIlcycgJSBhcmNoX3N1YmRpcl0KCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPj0gMTQuMDoKICAgICAgICAgICAgcGF0aHMgKz0gW3InTGliXHN0b3JlJXMnICUgYXJjaF9zdWJkaXJdCgogICAgICAgIHJldHVybiBbb3MucGF0aC5qb2luKHNlbGYuc2kuVkNJbnN0YWxsRGlyLCBwYXRoKSBmb3IgcGF0aCBpbiBwYXRoc10KCiAgICBAcHJvcGVydHkKICAgIGRlZiBWQ1N0b3JlUmVmcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyBzdG9yZSByZWZlcmVuY2VzIExpYnJhcmllcwogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYudmNfdmVyIDwgMTQuMDoKICAgICAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgcmV0dXJuIFtvcy5wYXRoLmpvaW4oc2VsZi5zaS5WQ0luc3RhbGxEaXIsIHInTGliXHN0b3JlXHJlZmVyZW5jZXMnKV0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBWQ1Rvb2xzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBWaXN1YWwgQysrIFRvb2xzCiAgICAgICAgIiIiCiAgICAgICAgc2kgPSBzZWxmLnNpCiAgICAgICAgdG9vbHMgPSBbb3MucGF0aC5qb2luKHNpLlZDSW5zdGFsbERpciwgJ1ZDUGFja2FnZXMnKV0KCiAgICAgICAgZm9yY2V4ODYgPSBUcnVlIGlmIHNlbGYudmNfdmVyIDw9IDEwLjAgZWxzZSBGYWxzZQogICAgICAgIGFyY2hfc3ViZGlyID0gc2VsZi5waS5jcm9zc19kaXIoZm9yY2V4ODYpCiAgICAgICAgaWYgYXJjaF9zdWJkaXI6CiAgICAgICAgICAgIHRvb2xzICs9IFtvcy5wYXRoLmpvaW4oc2kuVkNJbnN0YWxsRGlyLCAnQmluJXMnICUgYXJjaF9zdWJkaXIpXQoKICAgICAgICBpZiBzZWxmLnZjX3ZlciA9PSAxNC4wOgogICAgICAgICAgICBwYXRoID0gJ0JpbiVzJyAlIHNlbGYucGkuY3VycmVudF9kaXIoaGlkZXg4Nj1UcnVlKQogICAgICAgICAgICB0b29scyArPSBbb3MucGF0aC5qb2luKHNpLlZDSW5zdGFsbERpciwgcGF0aCldCgogICAgICAgIGVsaWYgc2VsZi52Y192ZXIgPj0gMTUuMDoKICAgICAgICAgICAgaG9zdF9kaXIgPSAocidiaW5cSG9zdFg4NiVzJyBpZiBzZWxmLnBpLmN1cnJlbnRfaXNfeDg2KCkgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICByJ2JpblxIb3N0WDY0JXMnKQogICAgICAgICAgICB0b29scyArPSBbb3MucGF0aC5qb2luKAogICAgICAgICAgICAgICAgc2kuVkNJbnN0YWxsRGlyLCBob3N0X2RpciAlIHNlbGYucGkudGFyZ2V0X2Rpcih4NjQ9VHJ1ZSkpXQoKICAgICAgICAgICAgaWYgc2VsZi5waS5jdXJyZW50X2NwdSAhPSBzZWxmLnBpLnRhcmdldF9jcHU6CiAgICAgICAgICAgICAgICB0b29scyArPSBbb3MucGF0aC5qb2luKAogICAgICAgICAgICAgICAgICAgIHNpLlZDSW5zdGFsbERpciwgaG9zdF9kaXIgJSBzZWxmLnBpLmN1cnJlbnRfZGlyKHg2ND1UcnVlKSldCgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHRvb2xzICs9IFtvcy5wYXRoLmpvaW4oc2kuVkNJbnN0YWxsRGlyLCAnQmluJyldCgogICAgICAgIHJldHVybiB0b29scwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIE9TTGlicmFyaWVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBXaW5kb3dzIFNESyBMaWJyYXJpZXMKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnZjX3ZlciA8PSAxMC4wOgogICAgICAgICAgICBhcmNoX3N1YmRpciA9IHNlbGYucGkudGFyZ2V0X2RpcihoaWRleDg2PVRydWUsIHg2ND1UcnVlKQogICAgICAgICAgICByZXR1cm4gW29zLnBhdGguam9pbihzZWxmLnNpLldpbmRvd3NTZGtEaXIsICdMaWIlcycgJSBhcmNoX3N1YmRpcildCgogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGFyY2hfc3ViZGlyID0gc2VsZi5waS50YXJnZXRfZGlyKHg2ND1UcnVlKQogICAgICAgICAgICBsaWIgPSBvcy5wYXRoLmpvaW4oc2VsZi5zaS5XaW5kb3dzU2RrRGlyLCAnbGliJykKICAgICAgICAgICAgbGlidmVyID0gc2VsZi5fc2RrX3N1YmRpcgogICAgICAgICAgICByZXR1cm4gW29zLnBhdGguam9pbihsaWIsICclc3VtJXMnICUgKGxpYnZlciAsIGFyY2hfc3ViZGlyKSldCgogICAgQHByb3BlcnR5CiAgICBkZWYgT1NJbmNsdWRlcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgV2luZG93cyBTREsgSW5jbHVkZQogICAgICAgICIiIgogICAgICAgIGluY2x1ZGUgPSBvcy5wYXRoLmpvaW4oc2VsZi5zaS5XaW5kb3dzU2RrRGlyLCAnaW5jbHVkZScpCgogICAgICAgIGlmIHNlbGYudmNfdmVyIDw9IDEwLjA6CiAgICAgICAgICAgIHJldHVybiBbaW5jbHVkZSwgb3MucGF0aC5qb2luKGluY2x1ZGUsICdnbCcpXQoKICAgICAgICBlbHNlOgogICAgICAgICAgICBpZiBzZWxmLnZjX3ZlciA+PSAxNC4wOgogICAgICAgICAgICAgICAgc2RrdmVyID0gc2VsZi5fc2RrX3N1YmRpcgogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2RrdmVyID0gJycKICAgICAgICAgICAgcmV0dXJuIFtvcy5wYXRoLmpvaW4oaW5jbHVkZSwgJyVzc2hhcmVkJyAlIHNka3ZlciksCiAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKGluY2x1ZGUsICclc3VtJyAlIHNka3ZlciksCiAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKGluY2x1ZGUsICclc3dpbnJ0JyAlIHNka3ZlcildCgogICAgQHByb3BlcnR5CiAgICBkZWYgT1NMaWJwYXRoKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBXaW5kb3dzIFNESyBMaWJyYXJpZXMgUGF0aHMKICAgICAgICAiIiIKICAgICAgICByZWYgPSBvcy5wYXRoLmpvaW4oc2VsZi5zaS5XaW5kb3dzU2RrRGlyLCAnUmVmZXJlbmNlcycpCiAgICAgICAgbGlicGF0aCA9IFtdCgogICAgICAgIGlmIHNlbGYudmNfdmVyIDw9IDkuMDoKICAgICAgICAgICAgbGlicGF0aCArPSBzZWxmLk9TTGlicmFyaWVzCgogICAgICAgIGlmIHNlbGYudmNfdmVyID49IDExLjA6CiAgICAgICAgICAgIGxpYnBhdGggKz0gW29zLnBhdGguam9pbihyZWYsIHInQ29tbW9uQ29uZmlndXJhdGlvblxOZXV0cmFsJyldCgogICAgICAgIGlmIHNlbGYudmNfdmVyID49IDE0LjA6CiAgICAgICAgICAgIGxpYnBhdGggKz0gWwogICAgICAgICAgICAgICAgcmVmLAogICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHNlbGYuc2kuV2luZG93c1Nka0RpciwgJ1VuaW9uTWV0YWRhdGEnKSwKICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbigKICAgICAgICAgICAgICAgICAgICByZWYsCiAgICAgICAgICAgICAgICAgICAgJ1dpbmRvd3MuRm91bmRhdGlvbi5Vbml2ZXJzYWxBcGlDb250cmFjdCcsCiAgICAgICAgICAgICAgICAgICAgJzEuMC4wLjAnLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbigKICAgICAgICAgICAgICAgICAgICByZWYsCiAgICAgICAgICAgICAgICAgICAgJ1dpbmRvd3MuRm91bmRhdGlvbi5Gb3VuZGF0aW9uQ29udHJhY3QnLAogICAgICAgICAgICAgICAgICAgICcxLjAuMC4wJywKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oCiAgICAgICAgICAgICAgICAgICAgcmVmLAogICAgICAgICAgICAgICAgICAgICdXaW5kb3dzLk5ldHdvcmtpbmcuQ29ubmVjdGl2aXR5Lld3YW5Db250cmFjdCcsCiAgICAgICAgICAgICAgICAgICAgJzEuMC4wLjAnLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbigKICAgICAgICAgICAgICAgICAgICBzZWxmLnNpLldpbmRvd3NTZGtEaXIsCiAgICAgICAgICAgICAgICAgICAgJ0V4dGVuc2lvblNES3MnLAogICAgICAgICAgICAgICAgICAgICdNaWNyb3NvZnQuVkNMaWJzJywKICAgICAgICAgICAgICAgICAgICAnJTAuMWYnICUgc2VsZi52Y192ZXIsCiAgICAgICAgICAgICAgICAgICAgJ1JlZmVyZW5jZXMnLAogICAgICAgICAgICAgICAgICAgICdDb21tb25Db25maWd1cmF0aW9uJywKICAgICAgICAgICAgICAgICAgICAnbmV1dHJhbCcsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICBdCiAgICAgICAgcmV0dXJuIGxpYnBhdGgKCiAgICBAcHJvcGVydHkKICAgIGRlZiBTZGtUb29scyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgV2luZG93cyBTREsgVG9vbHMKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gbGlzdChzZWxmLl9zZGtfdG9vbHMoKSkKCiAgICBkZWYgX3Nka190b29scyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgV2luZG93cyBTREsgVG9vbHMgcGF0aHMgZ2VuZXJhdG9yCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPCAxNS4wOgogICAgICAgICAgICBiaW5fZGlyID0gJ0JpbicgaWYgc2VsZi52Y192ZXIgPD0gMTEuMCBlbHNlIHInQmluXHg4NicKICAgICAgICAgICAgeWllbGQgb3MucGF0aC5qb2luKHNlbGYuc2kuV2luZG93c1Nka0RpciwgYmluX2RpcikKCiAgICAgICAgaWYgbm90IHNlbGYucGkuY3VycmVudF9pc194ODYoKToKICAgICAgICAgICAgYXJjaF9zdWJkaXIgPSBzZWxmLnBpLmN1cnJlbnRfZGlyKHg2ND1UcnVlKQogICAgICAgICAgICBwYXRoID0gJ0JpbiVzJyAlIGFyY2hfc3ViZGlyCiAgICAgICAgICAgIHlpZWxkIG9zLnBhdGguam9pbihzZWxmLnNpLldpbmRvd3NTZGtEaXIsIHBhdGgpCgogICAgICAgIGlmIHNlbGYudmNfdmVyID09IDEwLjAgb3Igc2VsZi52Y192ZXIgPT0gMTEuMDoKICAgICAgICAgICAgaWYgc2VsZi5waS50YXJnZXRfaXNfeDg2KCk6CiAgICAgICAgICAgICAgICBhcmNoX3N1YmRpciA9ICcnCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBhcmNoX3N1YmRpciA9IHNlbGYucGkuY3VycmVudF9kaXIoaGlkZXg4Nj1UcnVlLCB4NjQ9VHJ1ZSkKICAgICAgICAgICAgcGF0aCA9IHInQmluXE5FVEZYIDQuMCBUb29scyVzJyAlIGFyY2hfc3ViZGlyCiAgICAgICAgICAgIHlpZWxkIG9zLnBhdGguam9pbihzZWxmLnNpLldpbmRvd3NTZGtEaXIsIHBhdGgpCgogICAgICAgIGVsaWYgc2VsZi52Y192ZXIgPj0gMTUuMDoKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLnNpLldpbmRvd3NTZGtEaXIsICdCaW4nKQogICAgICAgICAgICBhcmNoX3N1YmRpciA9IHNlbGYucGkuY3VycmVudF9kaXIoeDY0PVRydWUpCiAgICAgICAgICAgIHNka3ZlciA9IHNlbGYuc2kuV2luZG93c1Nka0xhc3RWZXJzaW9uCiAgICAgICAgICAgIHlpZWxkIG9zLnBhdGguam9pbihwYXRoLCAnJXMlcycgJSAoc2RrdmVyLCBhcmNoX3N1YmRpcikpCgogICAgICAgIGlmIHNlbGYuc2kuV2luZG93c1NES0V4ZWN1dGFibGVQYXRoOgogICAgICAgICAgICB5aWVsZCBzZWxmLnNpLldpbmRvd3NTREtFeGVjdXRhYmxlUGF0aAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIF9zZGtfc3ViZGlyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBXaW5kb3dzIFNESyB2ZXJzaW9uIHN1YmRpcgogICAgICAgICIiIgogICAgICAgIHVjcnR2ZXIgPSBzZWxmLnNpLldpbmRvd3NTZGtMYXN0VmVyc2lvbgogICAgICAgIHJldHVybiAoJyVzXFwnICUgdWNydHZlcikgaWYgdWNydHZlciBlbHNlICcnCgogICAgQHByb3BlcnR5CiAgICBkZWYgU2RrU2V0dXAoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFdpbmRvd3MgU0RLIFNldHVwCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPiA5LjA6CiAgICAgICAgICAgIHJldHVybiBbXQoKICAgICAgICByZXR1cm4gW29zLnBhdGguam9pbihzZWxmLnNpLldpbmRvd3NTZGtEaXIsICdTZXR1cCcpXQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIEZ4VG9vbHMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IC5ORVQgRnJhbWV3b3JrIFRvb2xzCiAgICAgICAgIiIiCiAgICAgICAgcGkgPSBzZWxmLnBpCiAgICAgICAgc2kgPSBzZWxmLnNpCgogICAgICAgIGlmIHNlbGYudmNfdmVyIDw9IDEwLjA6CiAgICAgICAgICAgIGluY2x1ZGUzMiA9IFRydWUKICAgICAgICAgICAgaW5jbHVkZTY0ID0gbm90IHBpLnRhcmdldF9pc194ODYoKSBhbmQgbm90IHBpLmN1cnJlbnRfaXNfeDg2KCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBpbmNsdWRlMzIgPSBwaS50YXJnZXRfaXNfeDg2KCkgb3IgcGkuY3VycmVudF9pc194ODYoKQogICAgICAgICAgICBpbmNsdWRlNjQgPSBwaS5jdXJyZW50X2NwdSA9PSAnYW1kNjQnIG9yIHBpLnRhcmdldF9jcHUgPT0gJ2FtZDY0JwoKICAgICAgICB0b29scyA9IFtdCiAgICAgICAgaWYgaW5jbHVkZTMyOgogICAgICAgICAgICB0b29scyArPSBbb3MucGF0aC5qb2luKHNpLkZyYW1ld29ya0RpcjMyLCB2ZXIpCiAgICAgICAgICAgICAgICAgICAgICBmb3IgdmVyIGluIHNpLkZyYW1ld29ya1ZlcnNpb24zMl0KICAgICAgICBpZiBpbmNsdWRlNjQ6CiAgICAgICAgICAgIHRvb2xzICs9IFtvcy5wYXRoLmpvaW4oc2kuRnJhbWV3b3JrRGlyNjQsIHZlcikKICAgICAgICAgICAgICAgICAgICAgIGZvciB2ZXIgaW4gc2kuRnJhbWV3b3JrVmVyc2lvbjY0XQogICAgICAgIHJldHVybiB0b29scwoKICAgIEBwcm9wZXJ0eQogICAgZGVmIE5ldEZ4U0RLTGlicmFyaWVzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCAuTmV0IEZyYW1ld29yayBTREsgTGlicmFyaWVzCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPCAxNC4wIG9yIG5vdCBzZWxmLnNpLk5ldEZ4U2RrRGlyOgogICAgICAgICAgICByZXR1cm4gW10KCiAgICAgICAgYXJjaF9zdWJkaXIgPSBzZWxmLnBpLnRhcmdldF9kaXIoeDY0PVRydWUpCiAgICAgICAgcmV0dXJuIFtvcy5wYXRoLmpvaW4oc2VsZi5zaS5OZXRGeFNka0RpciwgcidsaWJcdW0lcycgJSBhcmNoX3N1YmRpcildCgogICAgQHByb3BlcnR5CiAgICBkZWYgTmV0RnhTREtJbmNsdWRlcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgLk5ldCBGcmFtZXdvcmsgU0RLIEluY2x1ZGVzCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPCAxNC4wIG9yIG5vdCBzZWxmLnNpLk5ldEZ4U2RrRGlyOgogICAgICAgICAgICByZXR1cm4gW10KCiAgICAgICAgcmV0dXJuIFtvcy5wYXRoLmpvaW4oc2VsZi5zaS5OZXRGeFNka0RpciwgcidpbmNsdWRlXHVtJyldCgogICAgQHByb3BlcnR5CiAgICBkZWYgVnNURGIoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gVGVhbSBTeXN0ZW0gRGF0YWJhc2UKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gW29zLnBhdGguam9pbihzZWxmLnNpLlZTSW5zdGFsbERpciwgcidWU1RTREJcRGVwbG95JyldCgogICAgQHByb3BlcnR5CiAgICBkZWYgTVNCdWlsZChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgQnVpbGQgRW5naW5lCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPCAxMi4wOgogICAgICAgICAgICByZXR1cm4gW10KICAgICAgICBlbGlmIHNlbGYudmNfdmVyIDwgMTUuMDoKICAgICAgICAgICAgYmFzZV9wYXRoID0gc2VsZi5zaS5Qcm9ncmFtRmlsZXN4ODYKICAgICAgICAgICAgYXJjaF9zdWJkaXIgPSBzZWxmLnBpLmN1cnJlbnRfZGlyKGhpZGV4ODY9VHJ1ZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBiYXNlX3BhdGggPSBzZWxmLnNpLlZTSW5zdGFsbERpcgogICAgICAgICAgICBhcmNoX3N1YmRpciA9ICcnCgogICAgICAgIHBhdGggPSByJ01TQnVpbGRcJTAuMWZcYmluJXMnICUgKHNlbGYudmNfdmVyLCBhcmNoX3N1YmRpcikKICAgICAgICBidWlsZCA9IFtvcy5wYXRoLmpvaW4oYmFzZV9wYXRoLCBwYXRoKV0KCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPj0gMTUuMDoKICAgICAgICAgICAgIyBBZGQgUm9zbHluIEMjICYgVmlzdWFsIEJhc2ljIENvbXBpbGVyCiAgICAgICAgICAgIGJ1aWxkICs9IFtvcy5wYXRoLmpvaW4oYmFzZV9wYXRoLCBwYXRoLCAnUm9zbHluJyldCgogICAgICAgIHJldHVybiBidWlsZAoKICAgIEBwcm9wZXJ0eQogICAgZGVmIEhUTUxIZWxwV29ya3Nob3Aoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IEhUTUwgSGVscCBXb3Jrc2hvcAogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYudmNfdmVyIDwgMTEuMDoKICAgICAgICAgICAgcmV0dXJuIFtdCgogICAgICAgIHJldHVybiBbb3MucGF0aC5qb2luKHNlbGYuc2kuUHJvZ3JhbUZpbGVzeDg2LCAnSFRNTCBIZWxwIFdvcmtzaG9wJyldCgogICAgQHByb3BlcnR5CiAgICBkZWYgVUNSVExpYnJhcmllcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVW5pdmVyc2FsIEMgUnVudGltZSBTREsgTGlicmFyaWVzCiAgICAgICAgIiIiCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPCAxNC4wOgogICAgICAgICAgICByZXR1cm4gW10KCiAgICAgICAgYXJjaF9zdWJkaXIgPSBzZWxmLnBpLnRhcmdldF9kaXIoeDY0PVRydWUpCiAgICAgICAgbGliID0gb3MucGF0aC5qb2luKHNlbGYuc2kuVW5pdmVyc2FsQ1JUU2RrRGlyLCAnbGliJykKICAgICAgICB1Y3J0dmVyID0gc2VsZi5fdWNydF9zdWJkaXIKICAgICAgICByZXR1cm4gW29zLnBhdGguam9pbihsaWIsICclc3VjcnQlcycgJSAodWNydHZlciwgYXJjaF9zdWJkaXIpKV0KCiAgICBAcHJvcGVydHkKICAgIGRlZiBVQ1JUSW5jbHVkZXMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFVuaXZlcnNhbCBDIFJ1bnRpbWUgU0RLIEluY2x1ZGUKICAgICAgICAiIiIKICAgICAgICBpZiBzZWxmLnZjX3ZlciA8IDE0LjA6CiAgICAgICAgICAgIHJldHVybiBbXQoKICAgICAgICBpbmNsdWRlID0gb3MucGF0aC5qb2luKHNlbGYuc2kuVW5pdmVyc2FsQ1JUU2RrRGlyLCAnaW5jbHVkZScpCiAgICAgICAgcmV0dXJuIFtvcy5wYXRoLmpvaW4oaW5jbHVkZSwgJyVzdWNydCcgJSBzZWxmLl91Y3J0X3N1YmRpcildCgogICAgQHByb3BlcnR5CiAgICBkZWYgX3VjcnRfc3ViZGlyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIE1pY3Jvc29mdCBVbml2ZXJzYWwgQyBSdW50aW1lIFNESyB2ZXJzaW9uIHN1YmRpcgogICAgICAgICIiIgogICAgICAgIHVjcnR2ZXIgPSBzZWxmLnNpLlVuaXZlcnNhbENSVFNka0xhc3RWZXJzaW9uCiAgICAgICAgcmV0dXJuICgnJXNcXCcgJSB1Y3J0dmVyKSBpZiB1Y3J0dmVyIGVsc2UgJycKCiAgICBAcHJvcGVydHkKICAgIGRlZiBGU2hhcnAoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTWljcm9zb2Z0IFZpc3VhbCBGIwogICAgICAgICIiIgogICAgICAgIGlmIHNlbGYudmNfdmVyIDwgMTEuMCBhbmQgc2VsZi52Y192ZXIgPiAxMi4wOgogICAgICAgICAgICByZXR1cm4gW10KCiAgICAgICAgcmV0dXJuIHNlbGYuc2kuRlNoYXJwSW5zdGFsbERpcgoKICAgIEBwcm9wZXJ0eQogICAgZGVmIFZDUnVudGltZVJlZGlzdChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBNaWNyb3NvZnQgVmlzdWFsIEMrKyBydW50aW1lIHJlZGlzdHJpYnVhYmxlIGRsbAogICAgICAgICIiIgogICAgICAgIGFyY2hfc3ViZGlyID0gc2VsZi5waS50YXJnZXRfZGlyKHg2ND1UcnVlKQogICAgICAgIGlmIHNlbGYudmNfdmVyIDwgMTU6CiAgICAgICAgICAgIHJlZGlzdF9wYXRoID0gc2VsZi5zaS5WQ0luc3RhbGxEaXIKICAgICAgICAgICAgdmNydW50aW1lID0gJ3JlZGlzdCVzXFxNaWNyb3NvZnQuVkMlZDAuQ1JUXFx2Y3J1bnRpbWUlZDAuZGxsJwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJlZGlzdF9wYXRoID0gc2VsZi5zaS5WQ0luc3RhbGxEaXIucmVwbGFjZSgnXFxUb29scycsICdcXFJlZGlzdCcpCiAgICAgICAgICAgIHZjcnVudGltZSA9ICdvbmVjb3JlJXNcXE1pY3Jvc29mdC5WQyVkMC5DUlRcXHZjcnVudGltZSVkMC5kbGwnCgogICAgICAgICMgVmlzdWFsIFN0dWRpbyAyMDE3ICBpcyBzdGlsbCBWaXN1YWwgQysrIDE0LjAKICAgICAgICBkbGxfdmVyID0gMTQuMCBpZiBzZWxmLnZjX3ZlciA9PSAxNSBlbHNlIHNlbGYudmNfdmVyCgogICAgICAgIHZjcnVudGltZSA9IHZjcnVudGltZSAlIChhcmNoX3N1YmRpciwgc2VsZi52Y192ZXIsIGRsbF92ZXIpCiAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihyZWRpc3RfcGF0aCwgdmNydW50aW1lKQoKICAgIGRlZiByZXR1cm5fZW52KHNlbGYsIGV4aXN0cz1UcnVlKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gZW52aXJvbm1lbnQgZGljdC4KCiAgICAgICAgUGFyYW1ldGVycwogICAgICAgIC0tLS0tLS0tLS0KICAgICAgICBleGlzdHM6IGJvb2wKICAgICAgICAgICAgSXQgVHJ1ZSwgb25seSByZXR1cm4gZXhpc3RpbmcgcGF0aHMuCiAgICAgICAgIiIiCiAgICAgICAgZW52ID0gZGljdCgKICAgICAgICAgICAgaW5jbHVkZT1zZWxmLl9idWlsZF9wYXRocygnaW5jbHVkZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGYuVkNJbmNsdWRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5PU0luY2x1ZGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLlVDUlRJbmNsdWRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5OZXRGeFNES0luY2x1ZGVzXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdHMpLAogICAgICAgICAgICBsaWI9c2VsZi5fYnVpbGRfcGF0aHMoJ2xpYicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZi5WQ0xpYnJhcmllcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLk9TTGlicmFyaWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuRnhUb29scywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLlVDUlRMaWJyYXJpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5OZXRGeFNES0xpYnJhcmllc10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdHMpLAogICAgICAgICAgICBsaWJwYXRoPXNlbGYuX2J1aWxkX3BhdGhzKCdsaWJwYXRoJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZi5WQ0xpYnJhcmllcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5GeFRvb2xzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLlZDU3RvcmVSZWZzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLk9TTGlicGF0aF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RzKSwKICAgICAgICAgICAgcGF0aD1zZWxmLl9idWlsZF9wYXRocygncGF0aCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGYuVkNUb29scywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5WU1Rvb2xzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLlZzVERiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLlNka1Rvb2xzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLlNka1NldHVwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLkZ4VG9vbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuTVNCdWlsZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5IVE1MSGVscFdvcmtzaG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLkZTaGFycF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RzKSwKICAgICAgICApCiAgICAgICAgaWYgc2VsZi52Y192ZXIgPj0gMTQgYW5kIG9zLnBhdGguaXNmaWxlKHNlbGYuVkNSdW50aW1lUmVkaXN0KToKICAgICAgICAgICAgZW52WydweV92Y3J1bnRpbWVfcmVkaXN0J10gPSBzZWxmLlZDUnVudGltZVJlZGlzdAogICAgICAgIHJldHVybiBlbnYKCiAgICBkZWYgX2J1aWxkX3BhdGhzKHNlbGYsIG5hbWUsIHNwZWNfcGF0aF9saXN0cywgZXhpc3RzKToKICAgICAgICAiIiIKICAgICAgICBHaXZlbiBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lIGFuZCBzcGVjaWZpZWQgcGF0aHMsCiAgICAgICAgcmV0dXJuIGEgcGF0aHNlcC1zZXBhcmF0ZWQgc3RyaW5nIG9mIHBhdGhzIGNvbnRhaW5pbmcKICAgICAgICB1bmlxdWUsIGV4dGFudCwgZGlyZWN0b3JpZXMgZnJvbSB0aG9zZSBwYXRocyBhbmQgZnJvbQogICAgICAgIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZS4gUmFpc2UgYW4gZXJyb3IgaWYgbm8gcGF0aHMKICAgICAgICBhcmUgcmVzb2x2ZWQuCiAgICAgICAgIiIiCiAgICAgICAgIyBmbGF0dGVuIHNwZWNfcGF0aF9saXN0cwogICAgICAgIHNwZWNfcGF0aHMgPSBpdGVydG9vbHMuY2hhaW4uZnJvbV9pdGVyYWJsZShzcGVjX3BhdGhfbGlzdHMpCiAgICAgICAgZW52X3BhdGhzID0gc2FmZV9lbnYuZ2V0KG5hbWUsICcnKS5zcGxpdChvcy5wYXRoc2VwKQogICAgICAgIHBhdGhzID0gaXRlcnRvb2xzLmNoYWluKHNwZWNfcGF0aHMsIGVudl9wYXRocykKICAgICAgICBleHRhbnRfcGF0aHMgPSBsaXN0KGZpbHRlcihvcy5wYXRoLmlzZGlyLCBwYXRocykpIGlmIGV4aXN0cyBlbHNlIHBhdGhzCiAgICAgICAgaWYgbm90IGV4dGFudF9wYXRoczoKICAgICAgICAgICAgbXNnID0gIiVzIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIGVtcHR5IiAlIG5hbWUudXBwZXIoKQogICAgICAgICAgICByYWlzZSBkaXN0dXRpbHMuZXJyb3JzLkRpc3R1dGlsc1BsYXRmb3JtRXJyb3IobXNnKQogICAgICAgIHVuaXF1ZV9wYXRocyA9IHNlbGYuX3VuaXF1ZV9ldmVyc2VlbihleHRhbnRfcGF0aHMpCiAgICAgICAgcmV0dXJuIG9zLnBhdGhzZXAuam9pbih1bmlxdWVfcGF0aHMpCgogICAgIyBmcm9tIFB5dGhvbiBkb2NzCiAgICBkZWYgX3VuaXF1ZV9ldmVyc2VlbihzZWxmLCBpdGVyYWJsZSwga2V5PU5vbmUpOgogICAgICAgICIiIgogICAgICAgIExpc3QgdW5pcXVlIGVsZW1lbnRzLCBwcmVzZXJ2aW5nIG9yZGVyLgogICAgICAgIFJlbWVtYmVyIGFsbCBlbGVtZW50cyBldmVyIHNlZW4uCgogICAgICAgIF91bmlxdWVfZXZlcnNlZW4oJ0FBQUFCQkJDQ0RBQUJCQicpIC0tPiBBIEIgQyBECgogICAgICAgIF91bmlxdWVfZXZlcnNlZW4oJ0FCQkNjQUQnLCBzdHIubG93ZXIpIC0tPiBBIEIgQyBECiAgICAgICAgIiIiCiAgICAgICAgc2VlbiA9IHNldCgpCiAgICAgICAgc2Vlbl9hZGQgPSBzZWVuLmFkZAogICAgICAgIGlmIGtleSBpcyBOb25lOgogICAgICAgICAgICBmb3IgZWxlbWVudCBpbiBmaWx0ZXJmYWxzZShzZWVuLl9fY29udGFpbnNfXywgaXRlcmFibGUpOgogICAgICAgICAgICAgICAgc2Vlbl9hZGQoZWxlbWVudCkKICAgICAgICAgICAgICAgIHlpZWxkIGVsZW1lbnQKICAgICAgICBlbHNlOgogICAgICAgICAgICBmb3IgZWxlbWVudCBpbiBpdGVyYWJsZToKICAgICAgICAgICAgICAgIGsgPSBrZXkoZWxlbWVudCkKICAgICAgICAgICAgICAgIGlmIGsgbm90IGluIHNlZW46CiAgICAgICAgICAgICAgICAgICAgc2Vlbl9hZGQoaykKICAgICAgICAgICAgICAgICAgICB5aWVsZCBlbGVtZW50ClBLAwQUAAAAAAAAACEAYwvj1n8MAAB/DAAAMAAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvbmFtZXNwYWNlcy5weWltcG9ydCBvcwpmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCmltcG9ydCBpdGVydG9vbHMKCmZyb20gc2V0dXB0b29scy5leHRlcm4uc2l4Lm1vdmVzIGltcG9ydCBtYXAKCgpmbGF0dGVuID0gaXRlcnRvb2xzLmNoYWluLmZyb21faXRlcmFibGUKCgpjbGFzcyBJbnN0YWxsZXI6CgogICAgbnNwa2dfZXh0ID0gJy1uc3BrZy5wdGgnCgogICAgZGVmIGluc3RhbGxfbmFtZXNwYWNlcyhzZWxmKToKICAgICAgICBuc3AgPSBzZWxmLl9nZXRfYWxsX25zX3BhY2thZ2VzKCkKICAgICAgICBpZiBub3QgbnNwOgogICAgICAgICAgICByZXR1cm4KICAgICAgICBmaWxlbmFtZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChzZWxmLl9nZXRfdGFyZ2V0KCkpCiAgICAgICAgZmlsZW5hbWUgKz0gc2VsZi5uc3BrZ19leHQKICAgICAgICBzZWxmLm91dHB1dHMuYXBwZW5kKGZpbGVuYW1lKQogICAgICAgIGxvZy5pbmZvKCJJbnN0YWxsaW5nICVzIiwgZmlsZW5hbWUpCiAgICAgICAgbGluZXMgPSBtYXAoc2VsZi5fZ2VuX25zcGtnX2xpbmUsIG5zcCkKCiAgICAgICAgaWYgc2VsZi5kcnlfcnVuOgogICAgICAgICAgICAjIGFsd2F5cyBnZW5lcmF0ZSB0aGUgbGluZXMsIGV2ZW4gaW4gZHJ5IHJ1bgogICAgICAgICAgICBsaXN0KGxpbmVzKQogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAnd3QnKSBhcyBmOgogICAgICAgICAgICBmLndyaXRlbGluZXMobGluZXMpCgogICAgZGVmIHVuaW5zdGFsbF9uYW1lc3BhY2VzKHNlbGYpOgogICAgICAgIGZpbGVuYW1lLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KHNlbGYuX2dldF90YXJnZXQoKSkKICAgICAgICBmaWxlbmFtZSArPSBzZWxmLm5zcGtnX2V4dAogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhmaWxlbmFtZSk6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIGxvZy5pbmZvKCJSZW1vdmluZyAlcyIsIGZpbGVuYW1lKQogICAgICAgIG9zLnJlbW92ZShmaWxlbmFtZSkKCiAgICBkZWYgX2dldF90YXJnZXQoc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYudGFyZ2V0CgogICAgX25zcGtnX3RtcGwgPSAoCiAgICAgICAgImltcG9ydCBzeXMsIHR5cGVzLCBvcyIsCiAgICAgICAgImhhc19tZnMgPSBzeXMudmVyc2lvbl9pbmZvID4gKDMsIDUpIiwKICAgICAgICAicCA9IG9zLnBhdGguam9pbiglKHJvb3QpcywgKiUocHRoKXIpIiwKICAgICAgICAiaW1wb3J0bGliID0gaGFzX21mcyBhbmQgX19pbXBvcnRfXygnaW1wb3J0bGliLnV0aWwnKSIsCiAgICAgICAgImhhc19tZnMgYW5kIF9faW1wb3J0X18oJ2ltcG9ydGxpYi5tYWNoaW5lcnknKSIsCiAgICAgICAgIm0gPSBoYXNfbWZzIGFuZCAiCiAgICAgICAgICAgICJzeXMubW9kdWxlcy5zZXRkZWZhdWx0KCUocGtnKXIsICIKICAgICAgICAgICAgICAgICJpbXBvcnRsaWIudXRpbC5tb2R1bGVfZnJvbV9zcGVjKCIKICAgICAgICAgICAgICAgICAgICAiaW1wb3J0bGliLm1hY2hpbmVyeS5QYXRoRmluZGVyLmZpbmRfc3BlYyglKHBrZylyLCAiCiAgICAgICAgICAgICAgICAgICAgICAgICJbb3MucGF0aC5kaXJuYW1lKHApXSkpKSIsCiAgICAgICAgIm0gPSBtIG9yICIKICAgICAgICAgICAgInN5cy5tb2R1bGVzLnNldGRlZmF1bHQoJShwa2cpciwgdHlwZXMuTW9kdWxlVHlwZSglKHBrZylyKSkiLAogICAgICAgICJtcCA9IChtIG9yIFtdKSBhbmQgbS5fX2RpY3RfXy5zZXRkZWZhdWx0KCdfX3BhdGhfXycsW10pIiwKICAgICAgICAiKHAgbm90IGluIG1wKSBhbmQgbXAuYXBwZW5kKHApIiwKICAgICkKICAgICJsaW5lcyBmb3IgdGhlIG5hbWVzcGFjZSBpbnN0YWxsZXIiCgogICAgX25zcGtnX3RtcGxfbXVsdGkgPSAoCiAgICAgICAgJ20gYW5kIHNldGF0dHIoc3lzLm1vZHVsZXNbJShwYXJlbnQpcl0sICUoY2hpbGQpciwgbSknLAogICAgKQogICAgImFkZGl0aW9uYWwgbGluZShzKSB3aGVuIGEgcGFyZW50IHBhY2thZ2UgaXMgaW5kaWNhdGVkIgoKICAgIGRlZiBfZ2V0X3Jvb3Qoc2VsZik6CiAgICAgICAgcmV0dXJuICJzeXMuX2dldGZyYW1lKDEpLmZfbG9jYWxzWydzaXRlZGlyJ10iCgogICAgZGVmIF9nZW5fbnNwa2dfbGluZShzZWxmLCBwa2cpOgogICAgICAgICMgZW5zdXJlIHBrZyBpcyBub3QgYSB1bmljb2RlIHN0cmluZyB1bmRlciBQeXRob24gMi43CiAgICAgICAgcGtnID0gc3RyKHBrZykKICAgICAgICBwdGggPSB0dXBsZShwa2cuc3BsaXQoJy4nKSkKICAgICAgICByb290ID0gc2VsZi5fZ2V0X3Jvb3QoKQogICAgICAgIHRtcGxfbGluZXMgPSBzZWxmLl9uc3BrZ190bXBsCiAgICAgICAgcGFyZW50LCBzZXAsIGNoaWxkID0gcGtnLnJwYXJ0aXRpb24oJy4nKQogICAgICAgIGlmIHBhcmVudDoKICAgICAgICAgICAgdG1wbF9saW5lcyArPSBzZWxmLl9uc3BrZ190bXBsX211bHRpCiAgICAgICAgcmV0dXJuICc7Jy5qb2luKHRtcGxfbGluZXMpICUgbG9jYWxzKCkgKyAnXG4nCgogICAgZGVmIF9nZXRfYWxsX25zX3BhY2thZ2VzKHNlbGYpOgogICAgICAgICIiIlJldHVybiBzb3J0ZWQgbGlzdCBvZiBhbGwgcGFja2FnZSBuYW1lc3BhY2VzIiIiCiAgICAgICAgcGtncyA9IHNlbGYuZGlzdHJpYnV0aW9uLm5hbWVzcGFjZV9wYWNrYWdlcyBvciBbXQogICAgICAgIHJldHVybiBzb3J0ZWQoZmxhdHRlbihtYXAoc2VsZi5fcGtnX25hbWVzLCBwa2dzKSkpCgogICAgQHN0YXRpY21ldGhvZAogICAgZGVmIF9wa2dfbmFtZXMocGtnKToKICAgICAgICAiIiIKICAgICAgICBHaXZlbiBhIG5hbWVzcGFjZSBwYWNrYWdlLCB5aWVsZCB0aGUgY29tcG9uZW50cyBvZiB0aGF0CiAgICAgICAgcGFja2FnZS4KCiAgICAgICAgPj4+IG5hbWVzID0gSW5zdGFsbGVyLl9wa2dfbmFtZXMoJ2EuYi5jJykKICAgICAgICA+Pj4gc2V0KG5hbWVzKSA9PSBzZXQoWydhJywgJ2EuYicsICdhLmIuYyddKQogICAgICAgIFRydWUKICAgICAgICAiIiIKICAgICAgICBwYXJ0cyA9IHBrZy5zcGxpdCgnLicpCiAgICAgICAgd2hpbGUgcGFydHM6CiAgICAgICAgICAgIHlpZWxkICcuJy5qb2luKHBhcnRzKQogICAgICAgICAgICBwYXJ0cy5wb3AoKQoKCmNsYXNzIERldmVsb3BJbnN0YWxsZXIoSW5zdGFsbGVyKToKICAgIGRlZiBfZ2V0X3Jvb3Qoc2VsZik6CiAgICAgICAgcmV0dXJuIHJlcHIoc3RyKHNlbGYuZWdnX3BhdGgpKQoKICAgIGRlZiBfZ2V0X3RhcmdldChzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5lZ2dfbGluawpQSwMEFAAAAAAAAAAhAImwE847ngAAO54AADMAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL3BhY2thZ2VfaW5kZXgucHkiIiJQeVBJIGFuZCBkaXJlY3QgcGFja2FnZSBkb3dubG9hZGluZyIiIgppbXBvcnQgc3lzCmltcG9ydCBvcwppbXBvcnQgcmUKaW1wb3J0IHNodXRpbAppbXBvcnQgc29ja2V0CmltcG9ydCBiYXNlNjQKaW1wb3J0IGhhc2hsaWIKaW1wb3J0IGl0ZXJ0b29scwpmcm9tIGZ1bmN0b29scyBpbXBvcnQgd3JhcHMKCnRyeToKICAgIGZyb20gdXJsbGliLnBhcnNlIGltcG9ydCBzcGxpdHVzZXIKZXhjZXB0IEltcG9ydEVycm9yOgogICAgZnJvbSB1cmxsaWIyIGltcG9ydCBzcGxpdHVzZXIKCmZyb20gc2V0dXB0b29scy5leHRlcm4gaW1wb3J0IHNpeApmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeC5tb3ZlcyBpbXBvcnQgdXJsbGliLCBodHRwX2NsaWVudCwgY29uZmlncGFyc2VyLCBtYXAKCmltcG9ydCBzZXR1cHRvb2xzCmZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgKAogICAgQ0hFQ0tPVVRfRElTVCwgRGlzdHJpYnV0aW9uLCBCSU5BUllfRElTVCwgbm9ybWFsaXplX3BhdGgsIFNPVVJDRV9ESVNULAogICAgRW52aXJvbm1lbnQsIGZpbmRfZGlzdHJpYnV0aW9ucywgc2FmZV9uYW1lLCBzYWZlX3ZlcnNpb24sCiAgICB0b19maWxlbmFtZSwgUmVxdWlyZW1lbnQsIERFVkVMT1BfRElTVCwgRUdHX0RJU1QsCikKZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBzc2xfc3VwcG9ydApmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCmZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzRXJyb3IKZnJvbSBmbm1hdGNoIGltcG9ydCB0cmFuc2xhdGUKZnJvbSBzZXR1cHRvb2xzLnB5Mjdjb21wYXQgaW1wb3J0IGdldF9hbGxfaGVhZGVycwpmcm9tIHNldHVwdG9vbHMud2hlZWwgaW1wb3J0IFdoZWVsCgpFR0dfRlJBR01FTlQgPSByZS5jb21waWxlKHInXmVnZz0oWy1BLVphLXowLTlfLishXSspJCcpCkhSRUYgPSByZS5jb21waWxlKCIiImhyZWZcXHMqPVxccypbJyJdPyhbXiciPiBdKykiIiIsIHJlLkkpCiMgdGhpcyBpcyBoZXJlIHRvIGZpeCBlbWFjcycgY3J1ZGR5IGJyb2tlbiBzeW50YXggaGlnaGxpZ2h0aW5nClBZUElfTUQ1ID0gcmUuY29tcGlsZSgKICAgICc8YSBocmVmPSIoW14iI10rKSI+KFtePF0rKTwvYT5cblxccytcXCg8YSAoPzp0aXRsZT0iTUQ1IGhhc2giXG5cXHMrKScKICAgICdocmVmPSJbXj9dK1xcPzphY3Rpb249c2hvd19tZDUmYW1wO2RpZ2VzdD0oWzAtOWEtZl17MzJ9KSI+bWQ1PC9hPlxcKScKKQpVUkxfU0NIRU1FID0gcmUuY29tcGlsZSgnKFstKy5hLXowLTldezIsfSk6JywgcmUuSSkubWF0Y2gKRVhURU5TSU9OUyA9ICIudGFyLmd6IC50YXIuYnoyIC50YXIgLnppcCAudGd6Ii5zcGxpdCgpCgpfX2FsbF9fID0gWwogICAgJ1BhY2thZ2VJbmRleCcsICdkaXN0cm9zX2Zvcl91cmwnLCAncGFyc2VfYmRpc3Rfd2luaW5zdCcsCiAgICAnaW50ZXJwcmV0X2Rpc3Ryb19uYW1lJywKXQoKX1NPQ0tFVF9USU1FT1VUID0gMTUKCl90bXBsID0gInNldHVwdG9vbHMve3NldHVwdG9vbHMuX192ZXJzaW9uX199IFB5dGhvbi11cmxsaWIve3B5X21ham9yfSIKdXNlcl9hZ2VudCA9IF90bXBsLmZvcm1hdChweV9tYWpvcj1zeXMudmVyc2lvbls6M10sIHNldHVwdG9vbHM9c2V0dXB0b29scykKCgpkZWYgcGFyc2VfcmVxdWlyZW1lbnRfYXJnKHNwZWMpOgogICAgdHJ5OgogICAgICAgIHJldHVybiBSZXF1aXJlbWVudC5wYXJzZShzcGVjKQogICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoCiAgICAgICAgICAgICJOb3QgYSBVUkwsIGV4aXN0aW5nIGZpbGUsIG9yIHJlcXVpcmVtZW50IHNwZWM6ICVyIiAlIChzcGVjLCkKICAgICAgICApCgoKZGVmIHBhcnNlX2JkaXN0X3dpbmluc3QobmFtZSk6CiAgICAiIiJSZXR1cm4gKGJhc2UscHl2ZXJzaW9uKSBvciAoTm9uZSxOb25lKSBmb3IgcG9zc2libGUgLmV4ZSBuYW1lIiIiCgogICAgbG93ZXIgPSBuYW1lLmxvd2VyKCkKICAgIGJhc2UsIHB5X3ZlciwgcGxhdCA9IE5vbmUsIE5vbmUsIE5vbmUKCiAgICBpZiBsb3dlci5lbmRzd2l0aCgnLmV4ZScpOgogICAgICAgIGlmIGxvd2VyLmVuZHN3aXRoKCcud2luMzIuZXhlJyk6CiAgICAgICAgICAgIGJhc2UgPSBuYW1lWzotMTBdCiAgICAgICAgICAgIHBsYXQgPSAnd2luMzInCiAgICAgICAgZWxpZiBsb3dlci5zdGFydHN3aXRoKCcud2luMzItcHknLCAtMTYpOgogICAgICAgICAgICBweV92ZXIgPSBuYW1lWy03Oi00XQogICAgICAgICAgICBiYXNlID0gbmFtZVs6LTE2XQogICAgICAgICAgICBwbGF0ID0gJ3dpbjMyJwogICAgICAgIGVsaWYgbG93ZXIuZW5kc3dpdGgoJy53aW4tYW1kNjQuZXhlJyk6CiAgICAgICAgICAgIGJhc2UgPSBuYW1lWzotMTRdCiAgICAgICAgICAgIHBsYXQgPSAnd2luLWFtZDY0JwogICAgICAgIGVsaWYgbG93ZXIuc3RhcnRzd2l0aCgnLndpbi1hbWQ2NC1weScsIC0yMCk6CiAgICAgICAgICAgIHB5X3ZlciA9IG5hbWVbLTc6LTRdCiAgICAgICAgICAgIGJhc2UgPSBuYW1lWzotMjBdCiAgICAgICAgICAgIHBsYXQgPSAnd2luLWFtZDY0JwogICAgcmV0dXJuIGJhc2UsIHB5X3ZlciwgcGxhdAoKCmRlZiBlZ2dfaW5mb19mb3JfdXJsKHVybCk6CiAgICBwYXJ0cyA9IHVybGxpYi5wYXJzZS51cmxwYXJzZSh1cmwpCiAgICBzY2hlbWUsIHNlcnZlciwgcGF0aCwgcGFyYW1ldGVycywgcXVlcnksIGZyYWdtZW50ID0gcGFydHMKICAgIGJhc2UgPSB1cmxsaWIucGFyc2UudW5xdW90ZShwYXRoLnNwbGl0KCcvJylbLTFdKQogICAgaWYgc2VydmVyID09ICdzb3VyY2Vmb3JnZS5uZXQnIGFuZCBiYXNlID09ICdkb3dubG9hZCc6ICAjIFhYWCBZdWNrCiAgICAgICAgYmFzZSA9IHVybGxpYi5wYXJzZS51bnF1b3RlKHBhdGguc3BsaXQoJy8nKVstMl0pCiAgICBpZiAnIycgaW4gYmFzZToKICAgICAgICBiYXNlLCBmcmFnbWVudCA9IGJhc2Uuc3BsaXQoJyMnLCAxKQogICAgcmV0dXJuIGJhc2UsIGZyYWdtZW50CgoKZGVmIGRpc3Ryb3NfZm9yX3VybCh1cmwsIG1ldGFkYXRhPU5vbmUpOgogICAgIiIiWWllbGQgZWdnIG9yIHNvdXJjZSBkaXN0cmlidXRpb24gb2JqZWN0cyB0aGF0IG1pZ2h0IGJlIGZvdW5kIGF0IGEgVVJMIiIiCiAgICBiYXNlLCBmcmFnbWVudCA9IGVnZ19pbmZvX2Zvcl91cmwodXJsKQogICAgZm9yIGRpc3QgaW4gZGlzdHJvc19mb3JfbG9jYXRpb24odXJsLCBiYXNlLCBtZXRhZGF0YSk6CiAgICAgICAgeWllbGQgZGlzdAogICAgaWYgZnJhZ21lbnQ6CiAgICAgICAgbWF0Y2ggPSBFR0dfRlJBR01FTlQubWF0Y2goZnJhZ21lbnQpCiAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgIGZvciBkaXN0IGluIGludGVycHJldF9kaXN0cm9fbmFtZSgKICAgICAgICAgICAgICAgIHVybCwgbWF0Y2guZ3JvdXAoMSksIG1ldGFkYXRhLCBwcmVjZWRlbmNlPUNIRUNLT1VUX0RJU1QKICAgICAgICAgICAgKToKICAgICAgICAgICAgICAgIHlpZWxkIGRpc3QKCgpkZWYgZGlzdHJvc19mb3JfbG9jYXRpb24obG9jYXRpb24sIGJhc2VuYW1lLCBtZXRhZGF0YT1Ob25lKToKICAgICIiIllpZWxkIGVnZyBvciBzb3VyY2UgZGlzdHJpYnV0aW9uIG9iamVjdHMgYmFzZWQgb24gYmFzZW5hbWUiIiIKICAgIGlmIGJhc2VuYW1lLmVuZHN3aXRoKCcuZWdnLnppcCcpOgogICAgICAgIGJhc2VuYW1lID0gYmFzZW5hbWVbOi00XSAgIyBzdHJpcCB0aGUgLnppcAogICAgaWYgYmFzZW5hbWUuZW5kc3dpdGgoJy5lZ2cnKSBhbmQgJy0nIGluIGJhc2VuYW1lOgogICAgICAgICMgb25seSBvbmUsIHVuYW1iaWd1b3VzIGludGVycHJldGF0aW9uCiAgICAgICAgcmV0dXJuIFtEaXN0cmlidXRpb24uZnJvbV9sb2NhdGlvbihsb2NhdGlvbiwgYmFzZW5hbWUsIG1ldGFkYXRhKV0KICAgIGlmIGJhc2VuYW1lLmVuZHN3aXRoKCcud2hsJykgYW5kICctJyBpbiBiYXNlbmFtZToKICAgICAgICB3aGVlbCA9IFdoZWVsKGJhc2VuYW1lKQogICAgICAgIGlmIG5vdCB3aGVlbC5pc19jb21wYXRpYmxlKCk6CiAgICAgICAgICAgIHJldHVybiBbXQogICAgICAgIHJldHVybiBbRGlzdHJpYnV0aW9uKAogICAgICAgICAgICBsb2NhdGlvbj1sb2NhdGlvbiwKICAgICAgICAgICAgcHJvamVjdF9uYW1lPXdoZWVsLnByb2plY3RfbmFtZSwKICAgICAgICAgICAgdmVyc2lvbj13aGVlbC52ZXJzaW9uLAogICAgICAgICAgICAjIEluY3JlYXNlIHByaW9yaXR5IG92ZXIgZWdncy4KICAgICAgICAgICAgcHJlY2VkZW5jZT1FR0dfRElTVCArIDEsCiAgICAgICAgKV0KICAgIGlmIGJhc2VuYW1lLmVuZHN3aXRoKCcuZXhlJyk6CiAgICAgICAgd2luX2Jhc2UsIHB5X3ZlciwgcGxhdGZvcm0gPSBwYXJzZV9iZGlzdF93aW5pbnN0KGJhc2VuYW1lKQogICAgICAgIGlmIHdpbl9iYXNlIGlzIG5vdCBOb25lOgogICAgICAgICAgICByZXR1cm4gaW50ZXJwcmV0X2Rpc3Ryb19uYW1lKAogICAgICAgICAgICAgICAgbG9jYXRpb24sIHdpbl9iYXNlLCBtZXRhZGF0YSwgcHlfdmVyLCBCSU5BUllfRElTVCwgcGxhdGZvcm0KICAgICAgICAgICAgKQogICAgIyBUcnkgc291cmNlIGRpc3RybyBleHRlbnNpb25zICguemlwLCAudGd6LCBldGMuKQogICAgIwogICAgZm9yIGV4dCBpbiBFWFRFTlNJT05TOgogICAgICAgIGlmIGJhc2VuYW1lLmVuZHN3aXRoKGV4dCk6CiAgICAgICAgICAgIGJhc2VuYW1lID0gYmFzZW5hbWVbOi1sZW4oZXh0KV0KICAgICAgICAgICAgcmV0dXJuIGludGVycHJldF9kaXN0cm9fbmFtZShsb2NhdGlvbiwgYmFzZW5hbWUsIG1ldGFkYXRhKQogICAgcmV0dXJuIFtdICAjIG5vIGV4dGVuc2lvbiBtYXRjaGVkCgoKZGVmIGRpc3Ryb3NfZm9yX2ZpbGVuYW1lKGZpbGVuYW1lLCBtZXRhZGF0YT1Ob25lKToKICAgICIiIllpZWxkIHBvc3NpYmxlIGVnZyBvciBzb3VyY2UgZGlzdHJpYnV0aW9uIG9iamVjdHMgYmFzZWQgb24gYSBmaWxlbmFtZSIiIgogICAgcmV0dXJuIGRpc3Ryb3NfZm9yX2xvY2F0aW9uKAogICAgICAgIG5vcm1hbGl6ZV9wYXRoKGZpbGVuYW1lKSwgb3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSksIG1ldGFkYXRhCiAgICApCgoKZGVmIGludGVycHJldF9kaXN0cm9fbmFtZSgKICAgICAgICBsb2NhdGlvbiwgYmFzZW5hbWUsIG1ldGFkYXRhLCBweV92ZXJzaW9uPU5vbmUsIHByZWNlZGVuY2U9U09VUkNFX0RJU1QsCiAgICAgICAgcGxhdGZvcm09Tm9uZQopOgogICAgIiIiR2VuZXJhdGUgYWx0ZXJuYXRpdmUgaW50ZXJwcmV0YXRpb25zIG9mIGEgc291cmNlIGRpc3RybyBuYW1lCgogICAgTm90ZTogaWYgYGxvY2F0aW9uYCBpcyBhIGZpbGVzeXN0ZW0gZmlsZW5hbWUsIHlvdSBzaG91bGQgY2FsbAogICAgYGBwa2dfcmVzb3VyY2VzLm5vcm1hbGl6ZV9wYXRoKClgYCBvbiBpdCBiZWZvcmUgcGFzc2luZyBpdCB0byB0aGlzCiAgICByb3V0aW5lIQogICAgIiIiCiAgICAjIEdlbmVyYXRlIGFsdGVybmF0aXZlIGludGVycHJldGF0aW9ucyBvZiBhIHNvdXJjZSBkaXN0cm8gbmFtZQogICAgIyBCZWNhdXNlIHNvbWUgcGFja2FnZXMgYXJlIGFtYmlndW91cyBhcyB0byBuYW1lL3ZlcnNpb25zIHNwbGl0CiAgICAjIGUuZy4gImFkbnMtcHl0aG9uLTEuMS4wIiwgImVnZW5peC1teC1jb21tZXJjaWFsIiwgZXRjLgogICAgIyBTbywgd2UgZ2VuZXJhdGUgZWFjaCBwb3NzaWJsZSBpbnRlcmVwcmV0YXRpb24gKGUuZy4gImFkbnMsIHB5dGhvbi0xLjEuMCIKICAgICMgImFkbnMtcHl0aG9uLCAxLjEuMCIsIGFuZCAiYWRucy1weXRob24tMS4xLjAsIG5vIHZlcnNpb24iKS4gIEluIHByYWN0aWNlLAogICAgIyB0aGUgc3B1cmlvdXMgaW50ZXJwcmV0YXRpb25zIHNob3VsZCBiZSBpZ25vcmVkLCBiZWNhdXNlIGluIHRoZSBldmVudAogICAgIyB0aGVyZSdzIGFsc28gYW4gImFkbnMiIHBhY2thZ2UsIHRoZSBzcHVyaW91cyAicHl0aG9uLTEuMS4wIiB2ZXJzaW9uIHdpbGwKICAgICMgY29tcGFyZSBsb3dlciB0aGFuIGFueSBudW1lcmljIHZlcnNpb24gbnVtYmVyLCBhbmQgaXMgdGhlcmVmb3JlIHVubGlrZWx5CiAgICAjIHRvIG1hdGNoIGEgcmVxdWVzdCBmb3IgaXQuICBJdCdzIHN0aWxsIGEgcG90ZW50aWFsIHByb2JsZW0sIHRob3VnaCwgYW5kCiAgICAjIGluIHRoZSBsb25nIHJ1biBQeVBJIGFuZCB0aGUgZGlzdHV0aWxzIHNob3VsZCBnbyBmb3IgInNhZmUiIG5hbWVzIGFuZAogICAgIyB2ZXJzaW9ucyBpbiBkaXN0cmlidXRpb24gYXJjaGl2ZSBuYW1lcyAoc2Rpc3QgYW5kIGJkaXN0KS4KCiAgICBwYXJ0cyA9IGJhc2VuYW1lLnNwbGl0KCctJykKICAgIGlmIG5vdCBweV92ZXJzaW9uIGFuZCBhbnkocmUubWF0Y2gocidweVxkXC5cZCQnLCBwKSBmb3IgcCBpbiBwYXJ0c1syOl0pOgogICAgICAgICMgaXQgaXMgYSBiZGlzdF9kdW1iLCBub3QgYW4gc2Rpc3QgLS0gYmFpbCBvdXQKICAgICAgICByZXR1cm4KCiAgICBmb3IgcCBpbiByYW5nZSgxLCBsZW4ocGFydHMpICsgMSk6CiAgICAgICAgeWllbGQgRGlzdHJpYnV0aW9uKAogICAgICAgICAgICBsb2NhdGlvbiwgbWV0YWRhdGEsICctJy5qb2luKHBhcnRzWzpwXSksICctJy5qb2luKHBhcnRzW3A6XSksCiAgICAgICAgICAgIHB5X3ZlcnNpb249cHlfdmVyc2lvbiwgcHJlY2VkZW5jZT1wcmVjZWRlbmNlLAogICAgICAgICAgICBwbGF0Zm9ybT1wbGF0Zm9ybQogICAgICAgICkKCgojIEZyb20gUHl0aG9uIDIuNyBkb2NzCmRlZiB1bmlxdWVfZXZlcnNlZW4oaXRlcmFibGUsIGtleT1Ob25lKToKICAgICJMaXN0IHVuaXF1ZSBlbGVtZW50cywgcHJlc2VydmluZyBvcmRlci4gUmVtZW1iZXIgYWxsIGVsZW1lbnRzIGV2ZXIgc2Vlbi4iCiAgICAjIHVuaXF1ZV9ldmVyc2VlbignQUFBQUJCQkNDREFBQkJCJykgLS0+IEEgQiBDIEQKICAgICMgdW5pcXVlX2V2ZXJzZWVuKCdBQkJDY0FEJywgc3RyLmxvd2VyKSAtLT4gQSBCIEMgRAogICAgc2VlbiA9IHNldCgpCiAgICBzZWVuX2FkZCA9IHNlZW4uYWRkCiAgICBpZiBrZXkgaXMgTm9uZToKICAgICAgICBmb3IgZWxlbWVudCBpbiBzaXgubW92ZXMuZmlsdGVyZmFsc2Uoc2Vlbi5fX2NvbnRhaW5zX18sIGl0ZXJhYmxlKToKICAgICAgICAgICAgc2Vlbl9hZGQoZWxlbWVudCkKICAgICAgICAgICAgeWllbGQgZWxlbWVudAogICAgZWxzZToKICAgICAgICBmb3IgZWxlbWVudCBpbiBpdGVyYWJsZToKICAgICAgICAgICAgayA9IGtleShlbGVtZW50KQogICAgICAgICAgICBpZiBrIG5vdCBpbiBzZWVuOgogICAgICAgICAgICAgICAgc2Vlbl9hZGQoaykKICAgICAgICAgICAgICAgIHlpZWxkIGVsZW1lbnQKCgpkZWYgdW5pcXVlX3ZhbHVlcyhmdW5jKToKICAgICIiIgogICAgV3JhcCBhIGZ1bmN0aW9uIHJldHVybmluZyBhbiBpdGVyYWJsZSBzdWNoIHRoYXQgdGhlIHJlc3VsdGluZyBpdGVyYWJsZQogICAgb25seSBldmVyIHlpZWxkcyB1bmlxdWUgaXRlbXMuCiAgICAiIiIKCiAgICBAd3JhcHMoZnVuYykKICAgIGRlZiB3cmFwcGVyKCphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgcmV0dXJuIHVuaXF1ZV9ldmVyc2VlbihmdW5jKCphcmdzLCAqKmt3YXJncykpCgogICAgcmV0dXJuIHdyYXBwZXIKCgpSRUwgPSByZS5jb21waWxlKHIiIiI8KFtePl0qXHNyZWxccyo9XHMqWyciXT8oW14nIj5dKylbXj5dKik+IiIiLCByZS5JKQojIHRoaXMgbGluZSBpcyBoZXJlIHRvIGZpeCBlbWFjcycgY3J1ZGR5IGJyb2tlbiBzeW50YXggaGlnaGxpZ2h0aW5nCgoKQHVuaXF1ZV92YWx1ZXMKZGVmIGZpbmRfZXh0ZXJuYWxfbGlua3ModXJsLCBwYWdlKToKICAgICIiIkZpbmQgcmVsPSJob21lcGFnZSIgYW5kIHJlbD0iZG93bmxvYWQiIGxpbmtzIGluIGBwYWdlYCwgeWllbGRpbmcgVVJMcyIiIgoKICAgIGZvciBtYXRjaCBpbiBSRUwuZmluZGl0ZXIocGFnZSk6CiAgICAgICAgdGFnLCByZWwgPSBtYXRjaC5ncm91cHMoKQogICAgICAgIHJlbHMgPSBzZXQobWFwKHN0ci5zdHJpcCwgcmVsLmxvd2VyKCkuc3BsaXQoJywnKSkpCiAgICAgICAgaWYgJ2hvbWVwYWdlJyBpbiByZWxzIG9yICdkb3dubG9hZCcgaW4gcmVsczoKICAgICAgICAgICAgZm9yIG1hdGNoIGluIEhSRUYuZmluZGl0ZXIodGFnKToKICAgICAgICAgICAgICAgIHlpZWxkIHVybGxpYi5wYXJzZS51cmxqb2luKHVybCwgaHRtbGRlY29kZShtYXRjaC5ncm91cCgxKSkpCgogICAgZm9yIHRhZyBpbiAoIjx0aD5Ib21lIFBhZ2UiLCAiPHRoPkRvd25sb2FkIFVSTCIpOgogICAgICAgIHBvcyA9IHBhZ2UuZmluZCh0YWcpCiAgICAgICAgaWYgcG9zICE9IC0xOgogICAgICAgICAgICBtYXRjaCA9IEhSRUYuc2VhcmNoKHBhZ2UsIHBvcykKICAgICAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgICAgICB5aWVsZCB1cmxsaWIucGFyc2UudXJsam9pbih1cmwsIGh0bWxkZWNvZGUobWF0Y2guZ3JvdXAoMSkpKQoKCmNsYXNzIENvbnRlbnRDaGVja2VyKG9iamVjdCk6CiAgICAiIiIKICAgIEEgbnVsbCBjb250ZW50IGNoZWNrZXIgdGhhdCBkZWZpbmVzIHRoZSBpbnRlcmZhY2UgZm9yIGNoZWNraW5nIGNvbnRlbnQKICAgICIiIgoKICAgIGRlZiBmZWVkKHNlbGYsIGJsb2NrKToKICAgICAgICAiIiIKICAgICAgICBGZWVkIGEgYmxvY2sgb2YgZGF0YSB0byB0aGUgaGFzaC4KICAgICAgICAiIiIKICAgICAgICByZXR1cm4KCiAgICBkZWYgaXNfdmFsaWQoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgQ2hlY2sgdGhlIGhhc2guIFJldHVybiBGYWxzZSBpZiB2YWxpZGF0aW9uIGZhaWxzLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHJlcG9ydChzZWxmLCByZXBvcnRlciwgdGVtcGxhdGUpOgogICAgICAgICIiIgogICAgICAgIENhbGwgcmVwb3J0ZXIgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2hlY2tlciAoaGFzaCBuYW1lKQogICAgICAgIHN1YnN0aXR1dGVkIGludG8gdGhlIHRlbXBsYXRlLgogICAgICAgICIiIgogICAgICAgIHJldHVybgoKCmNsYXNzIEhhc2hDaGVja2VyKENvbnRlbnRDaGVja2VyKToKICAgIHBhdHRlcm4gPSByZS5jb21waWxlKAogICAgICAgIHInKD9QPGhhc2hfbmFtZT5zaGExfHNoYTIyNHxzaGEzODR8c2hhMjU2fHNoYTUxMnxtZDUpPScKICAgICAgICByJyg/UDxleHBlY3RlZD5bYS1mMC05XSspJwogICAgKQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBoYXNoX25hbWUsIGV4cGVjdGVkKToKICAgICAgICBzZWxmLmhhc2hfbmFtZSA9IGhhc2hfbmFtZQogICAgICAgIHNlbGYuaGFzaCA9IGhhc2hsaWIubmV3KGhhc2hfbmFtZSkKICAgICAgICBzZWxmLmV4cGVjdGVkID0gZXhwZWN0ZWQKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBmcm9tX3VybChjbHMsIHVybCk6CiAgICAgICAgIkNvbnN0cnVjdCBhIChwb3NzaWJseSBudWxsKSBDb250ZW50Q2hlY2tlciBmcm9tIGEgVVJMIgogICAgICAgIGZyYWdtZW50ID0gdXJsbGliLnBhcnNlLnVybHBhcnNlKHVybClbLTFdCiAgICAgICAgaWYgbm90IGZyYWdtZW50OgogICAgICAgICAgICByZXR1cm4gQ29udGVudENoZWNrZXIoKQogICAgICAgIG1hdGNoID0gY2xzLnBhdHRlcm4uc2VhcmNoKGZyYWdtZW50KQogICAgICAgIGlmIG5vdCBtYXRjaDoKICAgICAgICAgICAgcmV0dXJuIENvbnRlbnRDaGVja2VyKCkKICAgICAgICByZXR1cm4gY2xzKCoqbWF0Y2guZ3JvdXBkaWN0KCkpCgogICAgZGVmIGZlZWQoc2VsZiwgYmxvY2spOgogICAgICAgIHNlbGYuaGFzaC51cGRhdGUoYmxvY2spCgogICAgZGVmIGlzX3ZhbGlkKHNlbGYpOgogICAgICAgIHJldHVybiBzZWxmLmhhc2guaGV4ZGlnZXN0KCkgPT0gc2VsZi5leHBlY3RlZAoKICAgIGRlZiByZXBvcnQoc2VsZiwgcmVwb3J0ZXIsIHRlbXBsYXRlKToKICAgICAgICBtc2cgPSB0ZW1wbGF0ZSAlIHNlbGYuaGFzaF9uYW1lCiAgICAgICAgcmV0dXJuIHJlcG9ydGVyKG1zZykKCgpjbGFzcyBQYWNrYWdlSW5kZXgoRW52aXJvbm1lbnQpOgogICAgIiIiQSBkaXN0cmlidXRpb24gaW5kZXggdGhhdCBzY2FucyB3ZWIgcGFnZXMgZm9yIGRvd25sb2FkIFVSTHMiIiIKCiAgICBkZWYgX19pbml0X18oCiAgICAgICAgICAgIHNlbGYsIGluZGV4X3VybD0iaHR0cHM6Ly9weXBpLnB5dGhvbi5vcmcvc2ltcGxlIiwgaG9zdHM9KCcqJywpLAogICAgICAgICAgICBjYV9idW5kbGU9Tm9uZSwgdmVyaWZ5X3NzbD1UcnVlLCAqYXJncywgKiprdwogICAgKToKICAgICAgICBFbnZpcm9ubWVudC5fX2luaXRfXyhzZWxmLCAqYXJncywgKiprdykKICAgICAgICBzZWxmLmluZGV4X3VybCA9IGluZGV4X3VybCArICIvIiBbOm5vdCBpbmRleF91cmwuZW5kc3dpdGgoJy8nKV0KICAgICAgICBzZWxmLnNjYW5uZWRfdXJscyA9IHt9CiAgICAgICAgc2VsZi5mZXRjaGVkX3VybHMgPSB7fQogICAgICAgIHNlbGYucGFja2FnZV9wYWdlcyA9IHt9CiAgICAgICAgc2VsZi5hbGxvd3MgPSByZS5jb21waWxlKCd8Jy5qb2luKG1hcCh0cmFuc2xhdGUsIGhvc3RzKSkpLm1hdGNoCiAgICAgICAgc2VsZi50b19zY2FuID0gW10KICAgICAgICB1c2Vfc3NsID0gKAogICAgICAgICAgICB2ZXJpZnlfc3NsCiAgICAgICAgICAgIGFuZCBzc2xfc3VwcG9ydC5pc19hdmFpbGFibGUKICAgICAgICAgICAgYW5kIChjYV9idW5kbGUgb3Igc3NsX3N1cHBvcnQuZmluZF9jYV9idW5kbGUoKSkKICAgICAgICApCiAgICAgICAgaWYgdXNlX3NzbDoKICAgICAgICAgICAgc2VsZi5vcGVuZXIgPSBzc2xfc3VwcG9ydC5vcGVuZXJfZm9yKGNhX2J1bmRsZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLm9wZW5lciA9IHVybGxpYi5yZXF1ZXN0LnVybG9wZW4KCiAgICBkZWYgcHJvY2Vzc191cmwoc2VsZiwgdXJsLCByZXRyaWV2ZT1GYWxzZSk6CiAgICAgICAgIiIiRXZhbHVhdGUgYSBVUkwgYXMgYSBwb3NzaWJsZSBkb3dubG9hZCwgYW5kIG1heWJlIHJldHJpZXZlIGl0IiIiCiAgICAgICAgaWYgdXJsIGluIHNlbGYuc2Nhbm5lZF91cmxzIGFuZCBub3QgcmV0cmlldmU6CiAgICAgICAgICAgIHJldHVybgogICAgICAgIHNlbGYuc2Nhbm5lZF91cmxzW3VybF0gPSBUcnVlCiAgICAgICAgaWYgbm90IFVSTF9TQ0hFTUUodXJsKToKICAgICAgICAgICAgc2VsZi5wcm9jZXNzX2ZpbGVuYW1lKHVybCkKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgZWxzZToKICAgICAgICAgICAgZGlzdHMgPSBsaXN0KGRpc3Ryb3NfZm9yX3VybCh1cmwpKQogICAgICAgICAgICBpZiBkaXN0czoKICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnVybF9vayh1cmwpOgogICAgICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAgICAgc2VsZi5kZWJ1ZygiRm91bmQgbGluazogJXMiLCB1cmwpCgogICAgICAgIGlmIGRpc3RzIG9yIG5vdCByZXRyaWV2ZSBvciB1cmwgaW4gc2VsZi5mZXRjaGVkX3VybHM6CiAgICAgICAgICAgIGxpc3QobWFwKHNlbGYuYWRkLCBkaXN0cykpCiAgICAgICAgICAgIHJldHVybiAgIyBkb24ndCBuZWVkIHRoZSBhY3R1YWwgcGFnZQoKICAgICAgICBpZiBub3Qgc2VsZi51cmxfb2sodXJsKToKICAgICAgICAgICAgc2VsZi5mZXRjaGVkX3VybHNbdXJsXSA9IFRydWUKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIHNlbGYuaW5mbygiUmVhZGluZyAlcyIsIHVybCkKICAgICAgICBzZWxmLmZldGNoZWRfdXJsc1t1cmxdID0gVHJ1ZSAgIyBwcmV2ZW50IG11bHRpcGxlIGZldGNoIGF0dGVtcHRzCiAgICAgICAgdG1wbCA9ICJEb3dubG9hZCBlcnJvciBvbiAlczogJSVzIC0tIFNvbWUgcGFja2FnZXMgbWF5IG5vdCBiZSBmb3VuZCEiCiAgICAgICAgZiA9IHNlbGYub3Blbl91cmwodXJsLCB0bXBsICUgdXJsKQogICAgICAgIGlmIGYgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgc2VsZi5mZXRjaGVkX3VybHNbZi51cmxdID0gVHJ1ZQogICAgICAgIGlmICdodG1sJyBub3QgaW4gZi5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJywgJycpLmxvd2VyKCk6CiAgICAgICAgICAgIGYuY2xvc2UoKSAgIyBub3QgaHRtbCwgd2UgY2FuJ3QgcHJvY2VzcyBpdAogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgYmFzZSA9IGYudXJsICAjIGhhbmRsZSByZWRpcmVjdHMKICAgICAgICBwYWdlID0gZi5yZWFkKCkKICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShwYWdlLCBzdHIpOgogICAgICAgICAgICAjIEluIFB5dGhvbiAzIGFuZCBnb3QgYnl0ZXMgYnV0IHdhbnQgc3RyLgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGYsIHVybGxpYi5lcnJvci5IVFRQRXJyb3IpOgogICAgICAgICAgICAgICAgIyBFcnJvcnMgaGF2ZSBubyBjaGFyc2V0LCBhc3N1bWUgbGF0aW4xOgogICAgICAgICAgICAgICAgY2hhcnNldCA9ICdsYXRpbi0xJwogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgY2hhcnNldCA9IGYuaGVhZGVycy5nZXRfcGFyYW0oJ2NoYXJzZXQnKSBvciAnbGF0aW4tMScKICAgICAgICAgICAgcGFnZSA9IHBhZ2UuZGVjb2RlKGNoYXJzZXQsICJpZ25vcmUiKQogICAgICAgIGYuY2xvc2UoKQogICAgICAgIGZvciBtYXRjaCBpbiBIUkVGLmZpbmRpdGVyKHBhZ2UpOgogICAgICAgICAgICBsaW5rID0gdXJsbGliLnBhcnNlLnVybGpvaW4oYmFzZSwgaHRtbGRlY29kZShtYXRjaC5ncm91cCgxKSkpCiAgICAgICAgICAgIHNlbGYucHJvY2Vzc191cmwobGluaykKICAgICAgICBpZiB1cmwuc3RhcnRzd2l0aChzZWxmLmluZGV4X3VybCkgYW5kIGdldGF0dHIoZiwgJ2NvZGUnLCBOb25lKSAhPSA0MDQ6CiAgICAgICAgICAgIHBhZ2UgPSBzZWxmLnByb2Nlc3NfaW5kZXgodXJsLCBwYWdlKQoKICAgIGRlZiBwcm9jZXNzX2ZpbGVuYW1lKHNlbGYsIGZuLCBuZXN0ZWQ9RmFsc2UpOgogICAgICAgICMgcHJvY2VzcyBmaWxlbmFtZXMgb3IgZGlyZWN0b3JpZXMKICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZm4pOgogICAgICAgICAgICBzZWxmLndhcm4oIk5vdCBmb3VuZDogJXMiLCBmbikKICAgICAgICAgICAgcmV0dXJuCgogICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZm4pIGFuZCBub3QgbmVzdGVkOgogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5yZWFscGF0aChmbikKICAgICAgICAgICAgZm9yIGl0ZW0gaW4gb3MubGlzdGRpcihwYXRoKToKICAgICAgICAgICAgICAgIHNlbGYucHJvY2Vzc19maWxlbmFtZShvcy5wYXRoLmpvaW4ocGF0aCwgaXRlbSksIFRydWUpCgogICAgICAgIGRpc3RzID0gZGlzdHJvc19mb3JfZmlsZW5hbWUoZm4pCiAgICAgICAgaWYgZGlzdHM6CiAgICAgICAgICAgIHNlbGYuZGVidWcoIkZvdW5kOiAlcyIsIGZuKQogICAgICAgICAgICBsaXN0KG1hcChzZWxmLmFkZCwgZGlzdHMpKQoKICAgIGRlZiB1cmxfb2soc2VsZiwgdXJsLCBmYXRhbD1GYWxzZSk6CiAgICAgICAgcyA9IFVSTF9TQ0hFTUUodXJsKQogICAgICAgIGlzX2ZpbGUgPSBzIGFuZCBzLmdyb3VwKDEpLmxvd2VyKCkgPT0gJ2ZpbGUnCiAgICAgICAgaWYgaXNfZmlsZSBvciBzZWxmLmFsbG93cyh1cmxsaWIucGFyc2UudXJscGFyc2UodXJsKVsxXSk6CiAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgbXNnID0gKAogICAgICAgICAgICAiXG5Ob3RlOiBCeXBhc3NpbmcgJXMgKGRpc2FsbG93ZWQgaG9zdDsgc2VlICIKICAgICAgICAgICAgImh0dHA6Ly9iaXQubHkvMmhySW1uWSBmb3IgZGV0YWlscykuXG4iKQogICAgICAgIGlmIGZhdGFsOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcihtc2cgJSB1cmwpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi53YXJuKG1zZywgdXJsKQoKICAgIGRlZiBzY2FuX2VnZ19saW5rcyhzZWxmLCBzZWFyY2hfcGF0aCk6CiAgICAgICAgZGlycyA9IGZpbHRlcihvcy5wYXRoLmlzZGlyLCBzZWFyY2hfcGF0aCkKICAgICAgICBlZ2dfbGlua3MgPSAoCiAgICAgICAgICAgIChwYXRoLCBlbnRyeSkKICAgICAgICAgICAgZm9yIHBhdGggaW4gZGlycwogICAgICAgICAgICBmb3IgZW50cnkgaW4gb3MubGlzdGRpcihwYXRoKQogICAgICAgICAgICBpZiBlbnRyeS5lbmRzd2l0aCgnLmVnZy1saW5rJykKICAgICAgICApCiAgICAgICAgbGlzdChpdGVydG9vbHMuc3Rhcm1hcChzZWxmLnNjYW5fZWdnX2xpbmssIGVnZ19saW5rcykpCgogICAgZGVmIHNjYW5fZWdnX2xpbmsoc2VsZiwgcGF0aCwgZW50cnkpOgogICAgICAgIHdpdGggb3Blbihvcy5wYXRoLmpvaW4ocGF0aCwgZW50cnkpKSBhcyByYXdfbGluZXM6CiAgICAgICAgICAgICMgZmlsdGVyIG5vbi1lbXB0eSBsaW5lcwogICAgICAgICAgICBsaW5lcyA9IGxpc3QoZmlsdGVyKE5vbmUsIG1hcChzdHIuc3RyaXAsIHJhd19saW5lcykpKQoKICAgICAgICBpZiBsZW4obGluZXMpICE9IDI6CiAgICAgICAgICAgICMgZm9ybWF0IGlzIG5vdCByZWNvZ25pemVkOyBwdW50CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBlZ2dfcGF0aCwgc2V0dXBfcGF0aCA9IGxpbmVzCgogICAgICAgIGZvciBkaXN0IGluIGZpbmRfZGlzdHJpYnV0aW9ucyhvcy5wYXRoLmpvaW4ocGF0aCwgZWdnX3BhdGgpKToKICAgICAgICAgICAgZGlzdC5sb2NhdGlvbiA9IG9zLnBhdGguam9pbihwYXRoLCAqbGluZXMpCiAgICAgICAgICAgIGRpc3QucHJlY2VkZW5jZSA9IFNPVVJDRV9ESVNUCiAgICAgICAgICAgIHNlbGYuYWRkKGRpc3QpCgogICAgZGVmIHByb2Nlc3NfaW5kZXgoc2VsZiwgdXJsLCBwYWdlKToKICAgICAgICAiIiJQcm9jZXNzIHRoZSBjb250ZW50cyBvZiBhIFB5UEkgcGFnZSIiIgoKICAgICAgICBkZWYgc2NhbihsaW5rKToKICAgICAgICAgICAgIyBQcm9jZXNzIGEgVVJMIHRvIHNlZSBpZiBpdCdzIGZvciBhIHBhY2thZ2UgcGFnZQogICAgICAgICAgICBpZiBsaW5rLnN0YXJ0c3dpdGgoc2VsZi5pbmRleF91cmwpOgogICAgICAgICAgICAgICAgcGFydHMgPSBsaXN0KG1hcCgKICAgICAgICAgICAgICAgICAgICB1cmxsaWIucGFyc2UudW5xdW90ZSwgbGlua1tsZW4oc2VsZi5pbmRleF91cmwpOl0uc3BsaXQoJy8nKQogICAgICAgICAgICAgICAgKSkKICAgICAgICAgICAgICAgIGlmIGxlbihwYXJ0cykgPT0gMiBhbmQgJyMnIG5vdCBpbiBwYXJ0c1sxXToKICAgICAgICAgICAgICAgICAgICAjIGl0J3MgYSBwYWNrYWdlIHBhZ2UsIHNhbml0aXplIGFuZCBpbmRleCBpdAogICAgICAgICAgICAgICAgICAgIHBrZyA9IHNhZmVfbmFtZShwYXJ0c1swXSkKICAgICAgICAgICAgICAgICAgICB2ZXIgPSBzYWZlX3ZlcnNpb24ocGFydHNbMV0pCiAgICAgICAgICAgICAgICAgICAgc2VsZi5wYWNrYWdlX3BhZ2VzLnNldGRlZmF1bHQocGtnLmxvd2VyKCksIHt9KVtsaW5rXSA9IFRydWUKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9fZmlsZW5hbWUocGtnKSwgdG9fZmlsZW5hbWUodmVyKQogICAgICAgICAgICByZXR1cm4gTm9uZSwgTm9uZQoKICAgICAgICAjIHByb2Nlc3MgYW4gaW5kZXggcGFnZSBpbnRvIHRoZSBwYWNrYWdlLXBhZ2UgaW5kZXgKICAgICAgICBmb3IgbWF0Y2ggaW4gSFJFRi5maW5kaXRlcihwYWdlKToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgc2Nhbih1cmxsaWIucGFyc2UudXJsam9pbih1cmwsIGh0bWxkZWNvZGUobWF0Y2guZ3JvdXAoMSkpKSkKICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICBwYXNzCgogICAgICAgIHBrZywgdmVyID0gc2Nhbih1cmwpICAjIGVuc3VyZSB0aGlzIHBhZ2UgaXMgaW4gdGhlIHBhZ2UgaW5kZXgKICAgICAgICBpZiBwa2c6CiAgICAgICAgICAgICMgcHJvY2VzcyBpbmRpdmlkdWFsIHBhY2thZ2UgcGFnZQogICAgICAgICAgICBmb3IgbmV3X3VybCBpbiBmaW5kX2V4dGVybmFsX2xpbmtzKHVybCwgcGFnZSk6CiAgICAgICAgICAgICAgICAjIFByb2Nlc3MgdGhlIGZvdW5kIFVSTAogICAgICAgICAgICAgICAgYmFzZSwgZnJhZyA9IGVnZ19pbmZvX2Zvcl91cmwobmV3X3VybCkKICAgICAgICAgICAgICAgIGlmIGJhc2UuZW5kc3dpdGgoJy5weScpIGFuZCBub3QgZnJhZzoKICAgICAgICAgICAgICAgICAgICBpZiB2ZXI6CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld191cmwgKz0gJyNlZ2c9JXMtJXMnICUgKHBrZywgdmVyKQogICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubmVlZF92ZXJzaW9uX2luZm8odXJsKQogICAgICAgICAgICAgICAgc2VsZi5zY2FuX3VybChuZXdfdXJsKQoKICAgICAgICAgICAgcmV0dXJuIFBZUElfTUQ1LnN1YigKICAgICAgICAgICAgICAgIGxhbWJkYSBtOiAnPGEgaHJlZj0iJXMjbWQ1PSVzIj4lczwvYT4nICUgbS5ncm91cCgxLCAzLCAyKSwgcGFnZQogICAgICAgICAgICApCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuICIiICAjIG5vIHNlbnNlIGRvdWJsZS1zY2FubmluZyBub24tcGFja2FnZSBwYWdlcwoKICAgIGRlZiBuZWVkX3ZlcnNpb25faW5mbyhzZWxmLCB1cmwpOgogICAgICAgIHNlbGYuc2Nhbl9hbGwoCiAgICAgICAgICAgICJQYWdlIGF0ICVzIGxpbmtzIHRvIC5weSBmaWxlKHMpIHdpdGhvdXQgdmVyc2lvbiBpbmZvOyBhbiBpbmRleCAiCiAgICAgICAgICAgICJzY2FuIGlzIHJlcXVpcmVkLiIsIHVybAogICAgICAgICkKCiAgICBkZWYgc2Nhbl9hbGwoc2VsZiwgbXNnPU5vbmUsICphcmdzKToKICAgICAgICBpZiBzZWxmLmluZGV4X3VybCBub3QgaW4gc2VsZi5mZXRjaGVkX3VybHM6CiAgICAgICAgICAgIGlmIG1zZzoKICAgICAgICAgICAgICAgIHNlbGYud2Fybihtc2csICphcmdzKQogICAgICAgICAgICBzZWxmLmluZm8oCiAgICAgICAgICAgICAgICAiU2Nhbm5pbmcgaW5kZXggb2YgYWxsIHBhY2thZ2VzICh0aGlzIG1heSB0YWtlIGEgd2hpbGUpIgogICAgICAgICAgICApCiAgICAgICAgc2VsZi5zY2FuX3VybChzZWxmLmluZGV4X3VybCkKCiAgICBkZWYgZmluZF9wYWNrYWdlcyhzZWxmLCByZXF1aXJlbWVudCk6CiAgICAgICAgc2VsZi5zY2FuX3VybChzZWxmLmluZGV4X3VybCArIHJlcXVpcmVtZW50LnVuc2FmZV9uYW1lICsgJy8nKQoKICAgICAgICBpZiBub3Qgc2VsZi5wYWNrYWdlX3BhZ2VzLmdldChyZXF1aXJlbWVudC5rZXkpOgogICAgICAgICAgICAjIEZhbGwgYmFjayB0byBzYWZlIHZlcnNpb24gb2YgdGhlIG5hbWUKICAgICAgICAgICAgc2VsZi5zY2FuX3VybChzZWxmLmluZGV4X3VybCArIHJlcXVpcmVtZW50LnByb2plY3RfbmFtZSArICcvJykKCiAgICAgICAgaWYgbm90IHNlbGYucGFja2FnZV9wYWdlcy5nZXQocmVxdWlyZW1lbnQua2V5KToKICAgICAgICAgICAgIyBXZSBjb3VsZG4ndCBmaW5kIHRoZSB0YXJnZXQgcGFja2FnZSwgc28gc2VhcmNoIHRoZSBpbmRleCBwYWdlIHRvbwogICAgICAgICAgICBzZWxmLm5vdF9mb3VuZF9pbl9pbmRleChyZXF1aXJlbWVudCkKCiAgICAgICAgZm9yIHVybCBpbiBsaXN0KHNlbGYucGFja2FnZV9wYWdlcy5nZXQocmVxdWlyZW1lbnQua2V5LCAoKSkpOgogICAgICAgICAgICAjIHNjYW4gZWFjaCBwYWdlIHRoYXQgbWlnaHQgYmUgcmVsYXRlZCB0byB0aGUgZGVzaXJlZCBwYWNrYWdlCiAgICAgICAgICAgIHNlbGYuc2Nhbl91cmwodXJsKQoKICAgIGRlZiBvYnRhaW4oc2VsZiwgcmVxdWlyZW1lbnQsIGluc3RhbGxlcj1Ob25lKToKICAgICAgICBzZWxmLnByZXNjYW4oKQogICAgICAgIHNlbGYuZmluZF9wYWNrYWdlcyhyZXF1aXJlbWVudCkKICAgICAgICBmb3IgZGlzdCBpbiBzZWxmW3JlcXVpcmVtZW50LmtleV06CiAgICAgICAgICAgIGlmIGRpc3QgaW4gcmVxdWlyZW1lbnQ6CiAgICAgICAgICAgICAgICByZXR1cm4gZGlzdAogICAgICAgICAgICBzZWxmLmRlYnVnKCIlcyBkb2VzIG5vdCBtYXRjaCAlcyIsIHJlcXVpcmVtZW50LCBkaXN0KQogICAgICAgIHJldHVybiBzdXBlcihQYWNrYWdlSW5kZXgsIHNlbGYpLm9idGFpbihyZXF1aXJlbWVudCwgaW5zdGFsbGVyKQoKICAgIGRlZiBjaGVja19oYXNoKHNlbGYsIGNoZWNrZXIsIGZpbGVuYW1lLCB0ZnApOgogICAgICAgICIiIgogICAgICAgIGNoZWNrZXIgaXMgYSBDb250ZW50Q2hlY2tlcgogICAgICAgICIiIgogICAgICAgIGNoZWNrZXIucmVwb3J0KAogICAgICAgICAgICBzZWxmLmRlYnVnLAogICAgICAgICAgICAiVmFsaWRhdGluZyAlJXMgY2hlY2tzdW0gZm9yICVzIiAlIGZpbGVuYW1lKQogICAgICAgIGlmIG5vdCBjaGVja2VyLmlzX3ZhbGlkKCk6CiAgICAgICAgICAgIHRmcC5jbG9zZSgpCiAgICAgICAgICAgIG9zLnVubGluayhmaWxlbmFtZSkKICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoCiAgICAgICAgICAgICAgICAiJXMgdmFsaWRhdGlvbiBmYWlsZWQgZm9yICVzOyAiCiAgICAgICAgICAgICAgICAicG9zc2libGUgZG93bmxvYWQgcHJvYmxlbT8iCiAgICAgICAgICAgICAgICAlIChjaGVja2VyLmhhc2gubmFtZSwgb3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSkpCiAgICAgICAgICAgICkKCiAgICBkZWYgYWRkX2ZpbmRfbGlua3Moc2VsZiwgdXJscyk6CiAgICAgICAgIiIiQWRkIGB1cmxzYCB0byB0aGUgbGlzdCB0aGF0IHdpbGwgYmUgcHJlc2Nhbm5lZCBmb3Igc2VhcmNoZXMiIiIKICAgICAgICBmb3IgdXJsIGluIHVybHM6CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIHNlbGYudG9fc2NhbiBpcyBOb25lICAjIGlmIHdlIGhhdmUgYWxyZWFkeSAiZ29uZSBvbmxpbmUiCiAgICAgICAgICAgICAgICBvciBub3QgVVJMX1NDSEVNRSh1cmwpICAjIG9yIGl0J3MgYSBsb2NhbCBmaWxlL2RpcmVjdG9yeQogICAgICAgICAgICAgICAgb3IgdXJsLnN0YXJ0c3dpdGgoJ2ZpbGU6JykKICAgICAgICAgICAgICAgIG9yIGxpc3QoZGlzdHJvc19mb3JfdXJsKHVybCkpICAjIG9yIGEgZGlyZWN0IHBhY2thZ2UgbGluawogICAgICAgICAgICApOgogICAgICAgICAgICAgICAgIyB0aGVuIGdvIGFoZWFkIGFuZCBwcm9jZXNzIGl0IG5vdwogICAgICAgICAgICAgICAgc2VsZi5zY2FuX3VybCh1cmwpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIG90aGVyd2lzZSwgZGVmZXIgcmV0cmlldmFsIHRpbGwgbGF0ZXIKICAgICAgICAgICAgICAgIHNlbGYudG9fc2Nhbi5hcHBlbmQodXJsKQoKICAgIGRlZiBwcmVzY2FuKHNlbGYpOgogICAgICAgICIiIlNjYW4gdXJscyBzY2hlZHVsZWQgZm9yIHByZXNjYW5uaW5nIChlLmcuIC0tZmluZC1saW5rcykiIiIKICAgICAgICBpZiBzZWxmLnRvX3NjYW46CiAgICAgICAgICAgIGxpc3QobWFwKHNlbGYuc2Nhbl91cmwsIHNlbGYudG9fc2NhbikpCiAgICAgICAgc2VsZi50b19zY2FuID0gTm9uZSAgIyBmcm9tIG5vdyBvbiwgZ28gYWhlYWQgYW5kIHByb2Nlc3MgaW1tZWRpYXRlbHkKCiAgICBkZWYgbm90X2ZvdW5kX2luX2luZGV4KHNlbGYsIHJlcXVpcmVtZW50KToKICAgICAgICBpZiBzZWxmW3JlcXVpcmVtZW50LmtleV06ICAjIHdlJ3ZlIHNlZW4gYXQgbGVhc3Qgb25lIGRpc3RybwogICAgICAgICAgICBtZXRoLCBtc2cgPSBzZWxmLmluZm8sICJDb3VsZG4ndCByZXRyaWV2ZSBpbmRleCBwYWdlIGZvciAlciIKICAgICAgICBlbHNlOiAgIyBubyBkaXN0cm9zIHNlZW4gZm9yIHRoaXMgbmFtZSwgbWlnaHQgYmUgbWlzc3BlbGxlZAogICAgICAgICAgICBtZXRoLCBtc2cgPSAoCiAgICAgICAgICAgICAgICBzZWxmLndhcm4sCiAgICAgICAgICAgICAgICAiQ291bGRuJ3QgZmluZCBpbmRleCBwYWdlIGZvciAlciAobWF5YmUgbWlzc3BlbGxlZD8pIikKICAgICAgICBtZXRoKG1zZywgcmVxdWlyZW1lbnQudW5zYWZlX25hbWUpCiAgICAgICAgc2VsZi5zY2FuX2FsbCgpCgogICAgZGVmIGRvd25sb2FkKHNlbGYsIHNwZWMsIHRtcGRpcik6CiAgICAgICAgIiIiTG9jYXRlIGFuZC9vciBkb3dubG9hZCBgc3BlY2AgdG8gYHRtcGRpcmAsIHJldHVybmluZyBhIGxvY2FsIHBhdGgKCiAgICAgICAgYHNwZWNgIG1heSBiZSBhIGBgUmVxdWlyZW1lbnRgYCBvYmplY3QsIG9yIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBVUkwsCiAgICAgICAgYW4gZXhpc3RpbmcgbG9jYWwgZmlsZW5hbWUsIG9yIGEgcHJvamVjdC92ZXJzaW9uIHJlcXVpcmVtZW50IHNwZWMKICAgICAgICAoaS5lLiB0aGUgc3RyaW5nIGZvcm0gb2YgYSBgYFJlcXVpcmVtZW50YGAgb2JqZWN0KS4gIElmIGl0IGlzIHRoZSBVUkwKICAgICAgICBvZiBhIC5weSBmaWxlIHdpdGggYW4gdW5hbWJpZ3VvdXMgYGAjZWdnPW5hbWUtdmVyc2lvbmBgIHRhZyAoaS5lLiwgb25lCiAgICAgICAgdGhhdCBlc2NhcGVzIGBgLWBgIGFzIGBgX2BgIHRocm91Z2hvdXQpLCBhIHRyaXZpYWwgYGBzZXR1cC5weWBgIGlzCiAgICAgICAgYXV0b21hdGljYWxseSBjcmVhdGVkIGFsb25nc2lkZSB0aGUgZG93bmxvYWRlZCBmaWxlLgoKICAgICAgICBJZiBgc3BlY2AgaXMgYSBgYFJlcXVpcmVtZW50YGAgb2JqZWN0IG9yIGEgc3RyaW5nIGNvbnRhaW5pbmcgYQogICAgICAgIHByb2plY3QvdmVyc2lvbiByZXF1aXJlbWVudCBzcGVjLCB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBsb2NhdGlvbiBvZgogICAgICAgIGEgbWF0Y2hpbmcgZGlzdHJpYnV0aW9uIChwb3NzaWJseSBhZnRlciBkb3dubG9hZGluZyBpdCB0byBgdG1wZGlyYCkuCiAgICAgICAgSWYgYHNwZWNgIGlzIGEgbG9jYWxseSBleGlzdGluZyBmaWxlIG9yIGRpcmVjdG9yeSBuYW1lLCBpdCBpcyBzaW1wbHkKICAgICAgICByZXR1cm5lZCB1bmNoYW5nZWQuICBJZiBgc3BlY2AgaXMgYSBVUkwsIGl0IGlzIGRvd25sb2FkZWQgdG8gYSBzdWJwYXRoCiAgICAgICAgb2YgYHRtcGRpcmAsIGFuZCB0aGUgbG9jYWwgZmlsZW5hbWUgaXMgcmV0dXJuZWQuICBWYXJpb3VzIGVycm9ycyBtYXkgYmUKICAgICAgICByYWlzZWQgaWYgYSBwcm9ibGVtIG9jY3VycyBkdXJpbmcgZG93bmxvYWRpbmcuCiAgICAgICAgIiIiCiAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoc3BlYywgUmVxdWlyZW1lbnQpOgogICAgICAgICAgICBzY2hlbWUgPSBVUkxfU0NIRU1FKHNwZWMpCiAgICAgICAgICAgIGlmIHNjaGVtZToKICAgICAgICAgICAgICAgICMgSXQncyBhIHVybCwgZG93bmxvYWQgaXQgdG8gdG1wZGlyCiAgICAgICAgICAgICAgICBmb3VuZCA9IHNlbGYuX2Rvd25sb2FkX3VybChzY2hlbWUuZ3JvdXAoMSksIHNwZWMsIHRtcGRpcikKICAgICAgICAgICAgICAgIGJhc2UsIGZyYWdtZW50ID0gZWdnX2luZm9fZm9yX3VybChzcGVjKQogICAgICAgICAgICAgICAgaWYgYmFzZS5lbmRzd2l0aCgnLnB5Jyk6CiAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBzZWxmLmdlbl9zZXR1cChmb3VuZCwgZnJhZ21lbnQsIHRtcGRpcikKICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZAogICAgICAgICAgICBlbGlmIG9zLnBhdGguZXhpc3RzKHNwZWMpOgogICAgICAgICAgICAgICAgIyBFeGlzdGluZyBmaWxlIG9yIGRpcmVjdG9yeSwganVzdCByZXR1cm4gaXQKICAgICAgICAgICAgICAgIHJldHVybiBzcGVjCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzcGVjID0gcGFyc2VfcmVxdWlyZW1lbnRfYXJnKHNwZWMpCiAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZi5mZXRjaF9kaXN0cmlidXRpb24oc3BlYywgdG1wZGlyKSwgJ2xvY2F0aW9uJywgTm9uZSkKCiAgICBkZWYgZmV0Y2hfZGlzdHJpYnV0aW9uKAogICAgICAgICAgICBzZWxmLCByZXF1aXJlbWVudCwgdG1wZGlyLCBmb3JjZV9zY2FuPUZhbHNlLCBzb3VyY2U9RmFsc2UsCiAgICAgICAgICAgIGRldmVsb3Bfb2s9RmFsc2UsIGxvY2FsX2luZGV4PU5vbmUpOgogICAgICAgICIiIk9idGFpbiBhIGRpc3RyaWJ1dGlvbiBzdWl0YWJsZSBmb3IgZnVsZmlsbGluZyBgcmVxdWlyZW1lbnRgCgogICAgICAgIGByZXF1aXJlbWVudGAgbXVzdCBiZSBhIGBgcGtnX3Jlc291cmNlcy5SZXF1aXJlbWVudGBgIGluc3RhbmNlLgogICAgICAgIElmIG5lY2Vzc2FyeSwgb3IgaWYgdGhlIGBmb3JjZV9zY2FuYCBmbGFnIGlzIHNldCwgdGhlIHJlcXVpcmVtZW50IGlzCiAgICAgICAgc2VhcmNoZWQgZm9yIGluIHRoZSAob25saW5lKSBwYWNrYWdlIGluZGV4IGFzIHdlbGwgYXMgdGhlIGxvY2FsbHkKICAgICAgICBpbnN0YWxsZWQgcGFja2FnZXMuICBJZiBhIGRpc3RyaWJ1dGlvbiBtYXRjaGluZyBgcmVxdWlyZW1lbnRgIGlzIGZvdW5kLAogICAgICAgIHRoZSByZXR1cm5lZCBkaXN0cmlidXRpb24ncyBgYGxvY2F0aW9uYGAgaXMgdGhlIHZhbHVlIHlvdSB3b3VsZCBoYXZlCiAgICAgICAgZ290dGVuIGZyb20gY2FsbGluZyB0aGUgYGBkb3dubG9hZCgpYGAgbWV0aG9kIHdpdGggdGhlIG1hdGNoaW5nCiAgICAgICAgZGlzdHJpYnV0aW9uJ3MgVVJMIG9yIGZpbGVuYW1lLiAgSWYgbm8gbWF0Y2hpbmcgZGlzdHJpYnV0aW9uIGlzIGZvdW5kLAogICAgICAgIGBgTm9uZWBgIGlzIHJldHVybmVkLgoKICAgICAgICBJZiB0aGUgYHNvdXJjZWAgZmxhZyBpcyBzZXQsIG9ubHkgc291cmNlIGRpc3RyaWJ1dGlvbnMgYW5kIHNvdXJjZQogICAgICAgIGNoZWNrb3V0IGxpbmtzIHdpbGwgYmUgY29uc2lkZXJlZC4gIFVubGVzcyB0aGUgYGRldmVsb3Bfb2tgIGZsYWcgaXMKICAgICAgICBzZXQsIGRldmVsb3BtZW50IGFuZCBzeXN0ZW0gZWdncyAoaS5lLiwgdGhvc2UgdXNpbmcgdGhlIGBgLmVnZy1pbmZvYGAKICAgICAgICBmb3JtYXQpIHdpbGwgYmUgaWdub3JlZC4KICAgICAgICAiIiIKICAgICAgICAjIHByb2Nlc3MgYSBSZXF1aXJlbWVudAogICAgICAgIHNlbGYuaW5mbygiU2VhcmNoaW5nIGZvciAlcyIsIHJlcXVpcmVtZW50KQogICAgICAgIHNraXBwZWQgPSB7fQogICAgICAgIGRpc3QgPSBOb25lCgogICAgICAgIGRlZiBmaW5kKHJlcSwgZW52PU5vbmUpOgogICAgICAgICAgICBpZiBlbnYgaXMgTm9uZToKICAgICAgICAgICAgICAgIGVudiA9IHNlbGYKICAgICAgICAgICAgIyBGaW5kIGEgbWF0Y2hpbmcgZGlzdHJpYnV0aW9uOyBtYXkgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlCgogICAgICAgICAgICBmb3IgZGlzdCBpbiBlbnZbcmVxLmtleV06CgogICAgICAgICAgICAgICAgaWYgZGlzdC5wcmVjZWRlbmNlID09IERFVkVMT1BfRElTVCBhbmQgbm90IGRldmVsb3Bfb2s6CiAgICAgICAgICAgICAgICAgICAgaWYgZGlzdCBub3QgaW4gc2tpcHBlZDoKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53YXJuKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNraXBwaW5nIGRldmVsb3BtZW50IG9yIHN5c3RlbSBlZ2c6ICVzIiwgZGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICBza2lwcGVkW2Rpc3RdID0gMQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICAgICAgdGVzdCA9ICgKICAgICAgICAgICAgICAgICAgICBkaXN0IGluIHJlcQogICAgICAgICAgICAgICAgICAgIGFuZCAoZGlzdC5wcmVjZWRlbmNlIDw9IFNPVVJDRV9ESVNUIG9yIG5vdCBzb3VyY2UpCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBpZiB0ZXN0OgogICAgICAgICAgICAgICAgICAgIGxvYyA9IHNlbGYuZG93bmxvYWQoZGlzdC5sb2NhdGlvbiwgdG1wZGlyKQogICAgICAgICAgICAgICAgICAgIGRpc3QuZG93bmxvYWRfbG9jYXRpb24gPSBsb2MKICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhkaXN0LmRvd25sb2FkX2xvY2F0aW9uKToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRpc3QKCiAgICAgICAgaWYgZm9yY2Vfc2NhbjoKICAgICAgICAgICAgc2VsZi5wcmVzY2FuKCkKICAgICAgICAgICAgc2VsZi5maW5kX3BhY2thZ2VzKHJlcXVpcmVtZW50KQogICAgICAgICAgICBkaXN0ID0gZmluZChyZXF1aXJlbWVudCkKCiAgICAgICAgaWYgbm90IGRpc3QgYW5kIGxvY2FsX2luZGV4IGlzIG5vdCBOb25lOgogICAgICAgICAgICBkaXN0ID0gZmluZChyZXF1aXJlbWVudCwgbG9jYWxfaW5kZXgpCgogICAgICAgIGlmIGRpc3QgaXMgTm9uZToKICAgICAgICAgICAgaWYgc2VsZi50b19zY2FuIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgc2VsZi5wcmVzY2FuKCkKICAgICAgICAgICAgZGlzdCA9IGZpbmQocmVxdWlyZW1lbnQpCgogICAgICAgIGlmIGRpc3QgaXMgTm9uZSBhbmQgbm90IGZvcmNlX3NjYW46CiAgICAgICAgICAgIHNlbGYuZmluZF9wYWNrYWdlcyhyZXF1aXJlbWVudCkKICAgICAgICAgICAgZGlzdCA9IGZpbmQocmVxdWlyZW1lbnQpCgogICAgICAgIGlmIGRpc3QgaXMgTm9uZToKICAgICAgICAgICAgc2VsZi53YXJuKAogICAgICAgICAgICAgICAgIk5vIGxvY2FsIHBhY2thZ2VzIG9yIHdvcmtpbmcgZG93bmxvYWQgbGlua3MgZm91bmQgZm9yICVzJXMiLAogICAgICAgICAgICAgICAgKHNvdXJjZSBhbmQgImEgc291cmNlIGRpc3RyaWJ1dGlvbiBvZiAiIG9yICIiKSwKICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50LAogICAgICAgICAgICApCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi5pbmZvKCJCZXN0IG1hdGNoOiAlcyIsIGRpc3QpCiAgICAgICAgICAgIHJldHVybiBkaXN0LmNsb25lKGxvY2F0aW9uPWRpc3QuZG93bmxvYWRfbG9jYXRpb24pCgogICAgZGVmIGZldGNoKHNlbGYsIHJlcXVpcmVtZW50LCB0bXBkaXIsIGZvcmNlX3NjYW49RmFsc2UsIHNvdXJjZT1GYWxzZSk6CiAgICAgICAgIiIiT2J0YWluIGEgZmlsZSBzdWl0YWJsZSBmb3IgZnVsZmlsbGluZyBgcmVxdWlyZW1lbnRgCgogICAgICAgIERFUFJFQ0FURUQ7IHVzZSB0aGUgYGBmZXRjaF9kaXN0cmlidXRpb24oKWBgIG1ldGhvZCBub3cgaW5zdGVhZC4gIEZvcgogICAgICAgIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHRoaXMgcm91dGluZSBpcyBpZGVudGljYWwgYnV0IHJldHVybnMgdGhlCiAgICAgICAgYGBsb2NhdGlvbmBgIG9mIHRoZSBkb3dubG9hZGVkIGRpc3RyaWJ1dGlvbiBpbnN0ZWFkIG9mIGEgZGlzdHJpYnV0aW9uCiAgICAgICAgb2JqZWN0LgogICAgICAgICIiIgogICAgICAgIGRpc3QgPSBzZWxmLmZldGNoX2Rpc3RyaWJ1dGlvbihyZXF1aXJlbWVudCwgdG1wZGlyLCBmb3JjZV9zY2FuLCBzb3VyY2UpCiAgICAgICAgaWYgZGlzdCBpcyBub3QgTm9uZToKICAgICAgICAgICAgcmV0dXJuIGRpc3QubG9jYXRpb24KICAgICAgICByZXR1cm4gTm9uZQoKICAgIGRlZiBnZW5fc2V0dXAoc2VsZiwgZmlsZW5hbWUsIGZyYWdtZW50LCB0bXBkaXIpOgogICAgICAgIG1hdGNoID0gRUdHX0ZSQUdNRU5ULm1hdGNoKGZyYWdtZW50KQogICAgICAgIGRpc3RzID0gbWF0Y2ggYW5kIFsKICAgICAgICAgICAgZCBmb3IgZCBpbgogICAgICAgICAgICBpbnRlcnByZXRfZGlzdHJvX25hbWUoZmlsZW5hbWUsIG1hdGNoLmdyb3VwKDEpLCBOb25lKSBpZiBkLnZlcnNpb24KICAgICAgICBdIG9yIFtdCgogICAgICAgIGlmIGxlbihkaXN0cykgPT0gMTogICMgdW5hbWJpZ3VvdXMgYGAjZWdnYGAgZnJhZ21lbnQKICAgICAgICAgICAgYmFzZW5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKQoKICAgICAgICAgICAgIyBNYWtlIHN1cmUgdGhlIGZpbGUgaGFzIGJlZW4gZG93bmxvYWRlZCB0byB0aGUgdGVtcCBkaXIuCiAgICAgICAgICAgIGlmIG9zLnBhdGguZGlybmFtZShmaWxlbmFtZSkgIT0gdG1wZGlyOgogICAgICAgICAgICAgICAgZHN0ID0gb3MucGF0aC5qb2luKHRtcGRpciwgYmFzZW5hbWUpCiAgICAgICAgICAgICAgICBmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGwgaW1wb3J0IHNhbWVmaWxlCiAgICAgICAgICAgICAgICBpZiBub3Qgc2FtZWZpbGUoZmlsZW5hbWUsIGRzdCk6CiAgICAgICAgICAgICAgICAgICAgc2h1dGlsLmNvcHkyKGZpbGVuYW1lLCBkc3QpCiAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBkc3QKCiAgICAgICAgICAgIHdpdGggb3Blbihvcy5wYXRoLmpvaW4odG1wZGlyLCAnc2V0dXAucHknKSwgJ3cnKSBhcyBmaWxlOgogICAgICAgICAgICAgICAgZmlsZS53cml0ZSgKICAgICAgICAgICAgICAgICAgICAiZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBzZXR1cFxuIgogICAgICAgICAgICAgICAgICAgICJzZXR1cChuYW1lPSVyLCB2ZXJzaW9uPSVyLCBweV9tb2R1bGVzPVslcl0pXG4iCiAgICAgICAgICAgICAgICAgICAgJSAoCiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RzWzBdLnByb2plY3RfbmFtZSwgZGlzdHNbMF0udmVyc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5zcGxpdGV4dChiYXNlbmFtZSlbMF0KICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHJldHVybiBmaWxlbmFtZQoKICAgICAgICBlbGlmIG1hdGNoOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigKICAgICAgICAgICAgICAgICJDYW4ndCB1bmFtYmlndW91c2x5IGludGVycHJldCBwcm9qZWN0L3ZlcnNpb24gaWRlbnRpZmllciAlcjsgIgogICAgICAgICAgICAgICAgImFueSBkYXNoZXMgaW4gdGhlIG5hbWUgb3IgdmVyc2lvbiBzaG91bGQgYmUgZXNjYXBlZCB1c2luZyAiCiAgICAgICAgICAgICAgICAidW5kZXJzY29yZXMuICVyIiAlIChmcmFnbWVudCwgZGlzdHMpCiAgICAgICAgICAgICkKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigKICAgICAgICAgICAgICAgICJDYW4ndCBwcm9jZXNzIHBsYWluIC5weSBmaWxlcyB3aXRob3V0IGFuICcjZWdnPW5hbWUtdmVyc2lvbiciCiAgICAgICAgICAgICAgICAiIHN1ZmZpeCB0byBlbmFibGUgYXV0b21hdGljIHNldHVwIHNjcmlwdCBnZW5lcmF0aW9uLiIKICAgICAgICAgICAgKQoKICAgIGRsX2Jsb2Nrc2l6ZSA9IDgxOTIKCiAgICBkZWYgX2Rvd25sb2FkX3RvKHNlbGYsIHVybCwgZmlsZW5hbWUpOgogICAgICAgIHNlbGYuaW5mbygiRG93bmxvYWRpbmcgJXMiLCB1cmwpCiAgICAgICAgIyBEb3dubG9hZCB0aGUgZmlsZQogICAgICAgIGZwID0gTm9uZQogICAgICAgIHRyeToKICAgICAgICAgICAgY2hlY2tlciA9IEhhc2hDaGVja2VyLmZyb21fdXJsKHVybCkKICAgICAgICAgICAgZnAgPSBzZWxmLm9wZW5fdXJsKHVybCkKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShmcCwgdXJsbGliLmVycm9yLkhUVFBFcnJvcik6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigKICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgZG93bmxvYWQgJXM6ICVzICVzIiAlICh1cmwsIGZwLmNvZGUsIGZwLm1zZykKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgaGVhZGVycyA9IGZwLmluZm8oKQogICAgICAgICAgICBibG9ja251bSA9IDAKICAgICAgICAgICAgYnMgPSBzZWxmLmRsX2Jsb2Nrc2l6ZQogICAgICAgICAgICBzaXplID0gLTEKICAgICAgICAgICAgaWYgImNvbnRlbnQtbGVuZ3RoIiBpbiBoZWFkZXJzOgogICAgICAgICAgICAgICAgIyBTb21lIHNlcnZlcnMgcmV0dXJuIG11bHRpcGxlIENvbnRlbnQtTGVuZ3RoIGhlYWRlcnMgOigKICAgICAgICAgICAgICAgIHNpemVzID0gZ2V0X2FsbF9oZWFkZXJzKGhlYWRlcnMsICdDb250ZW50LUxlbmd0aCcpCiAgICAgICAgICAgICAgICBzaXplID0gbWF4KG1hcChpbnQsIHNpemVzKSkKICAgICAgICAgICAgICAgIHNlbGYucmVwb3J0aG9vayh1cmwsIGZpbGVuYW1lLCBibG9ja251bSwgYnMsIHNpemUpCiAgICAgICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgJ3diJykgYXMgdGZwOgogICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgICAgICAgICBibG9jayA9IGZwLnJlYWQoYnMpCiAgICAgICAgICAgICAgICAgICAgaWYgYmxvY2s6CiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZXIuZmVlZChibG9jaykKICAgICAgICAgICAgICAgICAgICAgICAgdGZwLndyaXRlKGJsb2NrKQogICAgICAgICAgICAgICAgICAgICAgICBibG9ja251bSArPSAxCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVwb3J0aG9vayh1cmwsIGZpbGVuYW1lLCBibG9ja251bSwgYnMsIHNpemUpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tfaGFzaChjaGVja2VyLCBmaWxlbmFtZSwgdGZwKQogICAgICAgICAgICByZXR1cm4gaGVhZGVycwogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIGlmIGZwOgogICAgICAgICAgICAgICAgZnAuY2xvc2UoKQoKICAgIGRlZiByZXBvcnRob29rKHNlbGYsIHVybCwgZmlsZW5hbWUsIGJsb2NrbnVtLCBibGtzaXplLCBzaXplKToKICAgICAgICBwYXNzICAjIG5vLW9wCgogICAgZGVmIG9wZW5fdXJsKHNlbGYsIHVybCwgd2FybmluZz1Ob25lKToKICAgICAgICBpZiB1cmwuc3RhcnRzd2l0aCgnZmlsZTonKToKICAgICAgICAgICAgcmV0dXJuIGxvY2FsX29wZW4odXJsKQogICAgICAgIHRyeToKICAgICAgICAgICAgcmV0dXJuIG9wZW5fd2l0aF9hdXRoKHVybCwgc2VsZi5vcGVuZXIpCiAgICAgICAgZXhjZXB0IChWYWx1ZUVycm9yLCBodHRwX2NsaWVudC5JbnZhbGlkVVJMKSBhcyB2OgogICAgICAgICAgICBtc2cgPSAnICcuam9pbihbc3RyKGFyZykgZm9yIGFyZyBpbiB2LmFyZ3NdKQogICAgICAgICAgICBpZiB3YXJuaW5nOgogICAgICAgICAgICAgICAgc2VsZi53YXJuKHdhcm5pbmcsIG1zZykKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKCclcyAlcycgJSAodXJsLCBtc2cpKQogICAgICAgIGV4Y2VwdCB1cmxsaWIuZXJyb3IuSFRUUEVycm9yIGFzIHY6CiAgICAgICAgICAgIHJldHVybiB2CiAgICAgICAgZXhjZXB0IHVybGxpYi5lcnJvci5VUkxFcnJvciBhcyB2OgogICAgICAgICAgICBpZiB3YXJuaW5nOgogICAgICAgICAgICAgICAgc2VsZi53YXJuKHdhcm5pbmcsIHYucmVhc29uKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoIkRvd25sb2FkIGVycm9yIGZvciAlczogJXMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlICh1cmwsIHYucmVhc29uKSkKICAgICAgICBleGNlcHQgaHR0cF9jbGllbnQuQmFkU3RhdHVzTGluZSBhcyB2OgogICAgICAgICAgICBpZiB3YXJuaW5nOgogICAgICAgICAgICAgICAgc2VsZi53YXJuKHdhcm5pbmcsIHYubGluZSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKAogICAgICAgICAgICAgICAgICAgICclcyByZXR1cm5lZCBhIGJhZCBzdGF0dXMgbGluZS4gVGhlIHNlcnZlciBtaWdodCBiZSAnCiAgICAgICAgICAgICAgICAgICAgJ2Rvd24sICVzJyAlCiAgICAgICAgICAgICAgICAgICAgKHVybCwgdi5saW5lKQogICAgICAgICAgICAgICAgKQogICAgICAgIGV4Y2VwdCAoaHR0cF9jbGllbnQuSFRUUEV4Y2VwdGlvbiwgc29ja2V0LmVycm9yKSBhcyB2OgogICAgICAgICAgICBpZiB3YXJuaW5nOgogICAgICAgICAgICAgICAgc2VsZi53YXJuKHdhcm5pbmcsIHYpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigiRG93bmxvYWQgZXJyb3IgZm9yICVzOiAlcyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKHVybCwgdikpCgogICAgZGVmIF9kb3dubG9hZF91cmwoc2VsZiwgc2NoZW1lLCB1cmwsIHRtcGRpcik6CiAgICAgICAgIyBEZXRlcm1pbmUgZG93bmxvYWQgZmlsZW5hbWUKICAgICAgICAjCiAgICAgICAgbmFtZSwgZnJhZ21lbnQgPSBlZ2dfaW5mb19mb3JfdXJsKHVybCkKICAgICAgICBpZiBuYW1lOgogICAgICAgICAgICB3aGlsZSAnLi4nIGluIG5hbWU6CiAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKCcuLicsICcuJykucmVwbGFjZSgnXFwnLCAnXycpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbmFtZSA9ICJfX2Rvd25sb2FkZWRfXyIgICMgZGVmYXVsdCBpZiBVUkwgaGFzIG5vIHBhdGggY29udGVudHMKCiAgICAgICAgaWYgbmFtZS5lbmRzd2l0aCgnLmVnZy56aXAnKToKICAgICAgICAgICAgbmFtZSA9IG5hbWVbOi00XSAgIyBzdHJpcCB0aGUgZXh0cmEgLnppcCBiZWZvcmUgZG93bmxvYWQKCiAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4odG1wZGlyLCBuYW1lKQoKICAgICAgICAjIERvd25sb2FkIHRoZSBmaWxlCiAgICAgICAgIwogICAgICAgIGlmIHNjaGVtZSA9PSAnc3ZuJyBvciBzY2hlbWUuc3RhcnRzd2l0aCgnc3ZuKycpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fZG93bmxvYWRfc3ZuKHVybCwgZmlsZW5hbWUpCiAgICAgICAgZWxpZiBzY2hlbWUgPT0gJ2dpdCcgb3Igc2NoZW1lLnN0YXJ0c3dpdGgoJ2dpdCsnKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2Rvd25sb2FkX2dpdCh1cmwsIGZpbGVuYW1lKQogICAgICAgIGVsaWYgc2NoZW1lLnN0YXJ0c3dpdGgoJ2hnKycpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5fZG93bmxvYWRfaGcodXJsLCBmaWxlbmFtZSkKICAgICAgICBlbGlmIHNjaGVtZSA9PSAnZmlsZSc6CiAgICAgICAgICAgIHJldHVybiB1cmxsaWIucmVxdWVzdC51cmwycGF0aG5hbWUodXJsbGliLnBhcnNlLnVybHBhcnNlKHVybClbMl0pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc2VsZi51cmxfb2sodXJsLCBUcnVlKSAgIyByYWlzZXMgZXJyb3IgaWYgbm90IGFsbG93ZWQKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2F0dGVtcHRfZG93bmxvYWQodXJsLCBmaWxlbmFtZSkKCiAgICBkZWYgc2Nhbl91cmwoc2VsZiwgdXJsKToKICAgICAgICBzZWxmLnByb2Nlc3NfdXJsKHVybCwgVHJ1ZSkKCiAgICBkZWYgX2F0dGVtcHRfZG93bmxvYWQoc2VsZiwgdXJsLCBmaWxlbmFtZSk6CiAgICAgICAgaGVhZGVycyA9IHNlbGYuX2Rvd25sb2FkX3RvKHVybCwgZmlsZW5hbWUpCiAgICAgICAgaWYgJ2h0bWwnIGluIGhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnLCAnJykubG93ZXIoKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2Rvd25sb2FkX2h0bWwodXJsLCBoZWFkZXJzLCBmaWxlbmFtZSkKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gZmlsZW5hbWUKCiAgICBkZWYgX2Rvd25sb2FkX2h0bWwoc2VsZiwgdXJsLCBoZWFkZXJzLCBmaWxlbmFtZSk6CiAgICAgICAgZmlsZSA9IG9wZW4oZmlsZW5hbWUpCiAgICAgICAgZm9yIGxpbmUgaW4gZmlsZToKICAgICAgICAgICAgaWYgbGluZS5zdHJpcCgpOgogICAgICAgICAgICAgICAgIyBDaGVjayBmb3IgYSBzdWJ2ZXJzaW9uIGluZGV4IHBhZ2UKICAgICAgICAgICAgICAgIGlmIHJlLnNlYXJjaChyJzx0aXRsZT4oW14tIF0rIC0gKT9SZXZpc2lvbiBcZCs6JywgbGluZSk6CiAgICAgICAgICAgICAgICAgICAgIyBpdCdzIGEgc3VidmVyc2lvbiBpbmRleCBwYWdlOgogICAgICAgICAgICAgICAgICAgIGZpbGUuY2xvc2UoKQogICAgICAgICAgICAgICAgICAgIG9zLnVubGluayhmaWxlbmFtZSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fZG93bmxvYWRfc3ZuKHVybCwgZmlsZW5hbWUpCiAgICAgICAgICAgICAgICBicmVhayAgIyBub3QgYW4gaW5kZXggcGFnZQogICAgICAgIGZpbGUuY2xvc2UoKQogICAgICAgIG9zLnVubGluayhmaWxlbmFtZSkKICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigiVW5leHBlY3RlZCBIVE1MIHBhZ2UgZm91bmQgYXQgIiArIHVybCkKCiAgICBkZWYgX2Rvd25sb2FkX3N2bihzZWxmLCB1cmwsIGZpbGVuYW1lKToKICAgICAgICB1cmwgPSB1cmwuc3BsaXQoJyMnLCAxKVswXSAgIyByZW1vdmUgYW55IGZyYWdtZW50IGZvciBzdm4ncyBzYWtlCiAgICAgICAgY3JlZHMgPSAnJwogICAgICAgIGlmIHVybC5sb3dlcigpLnN0YXJ0c3dpdGgoJ3N2bjonKSBhbmQgJ0AnIGluIHVybDoKICAgICAgICAgICAgc2NoZW1lLCBuZXRsb2MsIHBhdGgsIHAsIHEsIGYgPSB1cmxsaWIucGFyc2UudXJscGFyc2UodXJsKQogICAgICAgICAgICBpZiBub3QgbmV0bG9jIGFuZCBwYXRoLnN0YXJ0c3dpdGgoJy8vJykgYW5kICcvJyBpbiBwYXRoWzI6XToKICAgICAgICAgICAgICAgIG5ldGxvYywgcGF0aCA9IHBhdGhbMjpdLnNwbGl0KCcvJywgMSkKICAgICAgICAgICAgICAgIGF1dGgsIGhvc3QgPSBzcGxpdHVzZXIobmV0bG9jKQogICAgICAgICAgICAgICAgaWYgYXV0aDoKICAgICAgICAgICAgICAgICAgICBpZiAnOicgaW4gYXV0aDoKICAgICAgICAgICAgICAgICAgICAgICAgdXNlciwgcHcgPSBhdXRoLnNwbGl0KCc6JywgMSkKICAgICAgICAgICAgICAgICAgICAgICAgY3JlZHMgPSAiIC0tdXNlcm5hbWU9JXMgLS1wYXNzd29yZD0lcyIgJSAodXNlciwgcHcpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgY3JlZHMgPSAiIC0tdXNlcm5hbWU9IiArIGF1dGgKICAgICAgICAgICAgICAgICAgICBuZXRsb2MgPSBob3N0CiAgICAgICAgICAgICAgICAgICAgcGFydHMgPSBzY2hlbWUsIG5ldGxvYywgdXJsLCBwLCBxLCBmCiAgICAgICAgICAgICAgICAgICAgdXJsID0gdXJsbGliLnBhcnNlLnVybHVucGFyc2UocGFydHMpCiAgICAgICAgc2VsZi5pbmZvKCJEb2luZyBzdWJ2ZXJzaW9uIGNoZWNrb3V0IGZyb20gJXMgdG8gJXMiLCB1cmwsIGZpbGVuYW1lKQogICAgICAgIG9zLnN5c3RlbSgic3ZuIGNoZWNrb3V0JXMgLXEgJXMgJXMiICUgKGNyZWRzLCB1cmwsIGZpbGVuYW1lKSkKICAgICAgICByZXR1cm4gZmlsZW5hbWUKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgX3Zjc19zcGxpdF9yZXZfZnJvbV91cmwodXJsLCBwb3BfcHJlZml4PUZhbHNlKToKICAgICAgICBzY2hlbWUsIG5ldGxvYywgcGF0aCwgcXVlcnksIGZyYWcgPSB1cmxsaWIucGFyc2UudXJsc3BsaXQodXJsKQoKICAgICAgICBzY2hlbWUgPSBzY2hlbWUuc3BsaXQoJysnLCAxKVstMV0KCiAgICAgICAgIyBTb21lIGZyYWdtZW50IGlkZW50aWZpY2F0aW9uIGZhaWxzCiAgICAgICAgcGF0aCA9IHBhdGguc3BsaXQoJyMnLCAxKVswXQoKICAgICAgICByZXYgPSBOb25lCiAgICAgICAgaWYgJ0AnIGluIHBhdGg6CiAgICAgICAgICAgIHBhdGgsIHJldiA9IHBhdGgucnNwbGl0KCdAJywgMSkKCiAgICAgICAgIyBBbHNvLCBkaXNjYXJkIGZyYWdtZW50CiAgICAgICAgdXJsID0gdXJsbGliLnBhcnNlLnVybHVuc3BsaXQoKHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBxdWVyeSwgJycpKQoKICAgICAgICByZXR1cm4gdXJsLCByZXYKCiAgICBkZWYgX2Rvd25sb2FkX2dpdChzZWxmLCB1cmwsIGZpbGVuYW1lKToKICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnNwbGl0KCcjJywgMSlbMF0KICAgICAgICB1cmwsIHJldiA9IHNlbGYuX3Zjc19zcGxpdF9yZXZfZnJvbV91cmwodXJsLCBwb3BfcHJlZml4PVRydWUpCgogICAgICAgIHNlbGYuaW5mbygiRG9pbmcgZ2l0IGNsb25lIGZyb20gJXMgdG8gJXMiLCB1cmwsIGZpbGVuYW1lKQogICAgICAgIG9zLnN5c3RlbSgiZ2l0IGNsb25lIC0tcXVpZXQgJXMgJXMiICUgKHVybCwgZmlsZW5hbWUpKQoKICAgICAgICBpZiByZXYgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHNlbGYuaW5mbygiQ2hlY2tpbmcgb3V0ICVzIiwgcmV2KQogICAgICAgICAgICBvcy5zeXN0ZW0oIihjZCAlcyAmJiBnaXQgY2hlY2tvdXQgLS1xdWlldCAlcykiICUgKAogICAgICAgICAgICAgICAgZmlsZW5hbWUsCiAgICAgICAgICAgICAgICByZXYsCiAgICAgICAgICAgICkpCgogICAgICAgIHJldHVybiBmaWxlbmFtZQoKICAgIGRlZiBfZG93bmxvYWRfaGcoc2VsZiwgdXJsLCBmaWxlbmFtZSk6CiAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5zcGxpdCgnIycsIDEpWzBdCiAgICAgICAgdXJsLCByZXYgPSBzZWxmLl92Y3Nfc3BsaXRfcmV2X2Zyb21fdXJsKHVybCwgcG9wX3ByZWZpeD1UcnVlKQoKICAgICAgICBzZWxmLmluZm8oIkRvaW5nIGhnIGNsb25lIGZyb20gJXMgdG8gJXMiLCB1cmwsIGZpbGVuYW1lKQogICAgICAgIG9zLnN5c3RlbSgiaGcgY2xvbmUgLS1xdWlldCAlcyAlcyIgJSAodXJsLCBmaWxlbmFtZSkpCgogICAgICAgIGlmIHJldiBpcyBub3QgTm9uZToKICAgICAgICAgICAgc2VsZi5pbmZvKCJVcGRhdGluZyB0byAlcyIsIHJldikKICAgICAgICAgICAgb3Muc3lzdGVtKCIoY2QgJXMgJiYgaGcgdXAgLUMgLXIgJXMgLXEpIiAlICgKICAgICAgICAgICAgICAgIGZpbGVuYW1lLAogICAgICAgICAgICAgICAgcmV2LAogICAgICAgICAgICApKQoKICAgICAgICByZXR1cm4gZmlsZW5hbWUKCiAgICBkZWYgZGVidWcoc2VsZiwgbXNnLCAqYXJncyk6CiAgICAgICAgbG9nLmRlYnVnKG1zZywgKmFyZ3MpCgogICAgZGVmIGluZm8oc2VsZiwgbXNnLCAqYXJncyk6CiAgICAgICAgbG9nLmluZm8obXNnLCAqYXJncykKCiAgICBkZWYgd2FybihzZWxmLCBtc2csICphcmdzKToKICAgICAgICBsb2cud2Fybihtc2csICphcmdzKQoKCiMgVGhpcyBwYXR0ZXJuIG1hdGNoZXMgYSBjaGFyYWN0ZXIgZW50aXR5IHJlZmVyZW5jZSAoYSBkZWNpbWFsIG51bWVyaWMKIyByZWZlcmVuY2VzLCBhIGhleGFkZWNpbWFsIG51bWVyaWMgcmVmZXJlbmNlLCBvciBhIG5hbWVkIHJlZmVyZW5jZSkuCmVudGl0eV9zdWIgPSByZS5jb21waWxlKHInJigjKFxkK3x4W1xkYS1mQS1GXSspfFtcdy46LV0rKTs/Jykuc3ViCgoKZGVmIHVjaHIoYyk6CiAgICBpZiBub3QgaXNpbnN0YW5jZShjLCBpbnQpOgogICAgICAgIHJldHVybiBjCiAgICBpZiBjID4gMjU1OgogICAgICAgIHJldHVybiBzaXgudW5pY2hyKGMpCiAgICByZXR1cm4gY2hyKGMpCgoKZGVmIGRlY29kZV9lbnRpdHkobWF0Y2gpOgogICAgd2hhdCA9IG1hdGNoLmdyb3VwKDEpCiAgICBpZiB3aGF0LnN0YXJ0c3dpdGgoJyN4Jyk6CiAgICAgICAgd2hhdCA9IGludCh3aGF0WzI6XSwgMTYpCiAgICBlbGlmIHdoYXQuc3RhcnRzd2l0aCgnIycpOgogICAgICAgIHdoYXQgPSBpbnQod2hhdFsxOl0pCiAgICBlbHNlOgogICAgICAgIHdoYXQgPSBzaXgubW92ZXMuaHRtbF9lbnRpdGllcy5uYW1lMmNvZGVwb2ludC5nZXQod2hhdCwgbWF0Y2guZ3JvdXAoMCkpCiAgICByZXR1cm4gdWNocih3aGF0KQoKCmRlZiBodG1sZGVjb2RlKHRleHQpOgogICAgIiIiRGVjb2RlIEhUTUwgZW50aXRpZXMgaW4gdGhlIGdpdmVuIHRleHQuIiIiCiAgICByZXR1cm4gZW50aXR5X3N1YihkZWNvZGVfZW50aXR5LCB0ZXh0KQoKCmRlZiBzb2NrZXRfdGltZW91dCh0aW1lb3V0PTE1KToKICAgIGRlZiBfc29ja2V0X3RpbWVvdXQoZnVuYyk6CiAgICAgICAgZGVmIF9zb2NrZXRfdGltZW91dCgqYXJncywgKiprd2FyZ3MpOgogICAgICAgICAgICBvbGRfdGltZW91dCA9IHNvY2tldC5nZXRkZWZhdWx0dGltZW91dCgpCiAgICAgICAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dCh0aW1lb3V0KQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXR1cm4gZnVuYygqYXJncywgKiprd2FyZ3MpCiAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQob2xkX3RpbWVvdXQpCgogICAgICAgIHJldHVybiBfc29ja2V0X3RpbWVvdXQKCiAgICByZXR1cm4gX3NvY2tldF90aW1lb3V0CgoKZGVmIF9lbmNvZGVfYXV0aChhdXRoKToKICAgICIiIgogICAgQSBmdW5jdGlvbiBjb21wYXRpYmxlIHdpdGggUHl0aG9uIDIuMy0zLjMgdGhhdCB3aWxsIGVuY29kZQogICAgYXV0aCBmcm9tIGEgVVJMIHN1aXRhYmxlIGZvciBhbiBIVFRQIGhlYWRlci4KICAgID4+PiBzdHIoX2VuY29kZV9hdXRoKCd1c2VybmFtZSUzQXBhc3N3b3JkJykpCiAgICAnZFhObGNtNWhiV1U2Y0dGemMzZHZjbVE9JwoKICAgIExvbmcgYXV0aCBzdHJpbmdzIHNob3VsZCBub3QgY2F1c2UgYSBuZXdsaW5lIHRvIGJlIGluc2VydGVkLgogICAgPj4+IGxvbmdfYXV0aCA9ICd1c2VybmFtZTonICsgJ3Bhc3N3b3JkJyoxMAogICAgPj4+IGNocigxMCkgaW4gc3RyKF9lbmNvZGVfYXV0aChsb25nX2F1dGgpKQogICAgRmFsc2UKICAgICIiIgogICAgYXV0aF9zID0gdXJsbGliLnBhcnNlLnVucXVvdGUoYXV0aCkKICAgICMgY29udmVydCB0byBieXRlcwogICAgYXV0aF9ieXRlcyA9IGF1dGhfcy5lbmNvZGUoKQogICAgIyB1c2UgdGhlIGxlZ2FjeSBpbnRlcmZhY2UgZm9yIFB5dGhvbiAyLjMgc3VwcG9ydAogICAgZW5jb2RlZF9ieXRlcyA9IGJhc2U2NC5lbmNvZGVzdHJpbmcoYXV0aF9ieXRlcykKICAgICMgY29udmVydCBiYWNrIHRvIGEgc3RyaW5nCiAgICBlbmNvZGVkID0gZW5jb2RlZF9ieXRlcy5kZWNvZGUoKQogICAgIyBzdHJpcCB0aGUgdHJhaWxpbmcgY2FycmlhZ2UgcmV0dXJuCiAgICByZXR1cm4gZW5jb2RlZC5yZXBsYWNlKCdcbicsICcnKQoKCmNsYXNzIENyZWRlbnRpYWwob2JqZWN0KToKICAgICIiIgogICAgQSB1c2VybmFtZS9wYXNzd29yZCBwYWlyLiBVc2UgbGlrZSBhIG5hbWVkdHVwbGUuCiAgICAiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgdXNlcm5hbWUsIHBhc3N3b3JkKToKICAgICAgICBzZWxmLnVzZXJuYW1lID0gdXNlcm5hbWUKICAgICAgICBzZWxmLnBhc3N3b3JkID0gcGFzc3dvcmQKCiAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgeWllbGQgc2VsZi51c2VybmFtZQogICAgICAgIHlpZWxkIHNlbGYucGFzc3dvcmQKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gJyUodXNlcm5hbWUpczolKHBhc3N3b3JkKXMnICUgdmFycyhzZWxmKQoKCmNsYXNzIFB5UElDb25maWcoY29uZmlncGFyc2VyLlJhd0NvbmZpZ1BhcnNlcik6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgTG9hZCBmcm9tIH4vLnB5cGlyYwogICAgICAgICIiIgogICAgICAgIGRlZmF1bHRzID0gZGljdC5mcm9ta2V5cyhbJ3VzZXJuYW1lJywgJ3Bhc3N3b3JkJywgJ3JlcG9zaXRvcnknXSwgJycpCiAgICAgICAgY29uZmlncGFyc2VyLlJhd0NvbmZpZ1BhcnNlci5fX2luaXRfXyhzZWxmLCBkZWZhdWx0cykKCiAgICAgICAgcmMgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5leHBhbmR1c2VyKCd+JyksICcucHlwaXJjJykKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhyYyk6CiAgICAgICAgICAgIHNlbGYucmVhZChyYykKCiAgICBAcHJvcGVydHkKICAgIGRlZiBjcmVkc19ieV9yZXBvc2l0b3J5KHNlbGYpOgogICAgICAgIHNlY3Rpb25zX3dpdGhfcmVwb3NpdG9yaWVzID0gWwogICAgICAgICAgICBzZWN0aW9uIGZvciBzZWN0aW9uIGluIHNlbGYuc2VjdGlvbnMoKQogICAgICAgICAgICBpZiBzZWxmLmdldChzZWN0aW9uLCAncmVwb3NpdG9yeScpLnN0cmlwKCkKICAgICAgICBdCgogICAgICAgIHJldHVybiBkaWN0KG1hcChzZWxmLl9nZXRfcmVwb19jcmVkLCBzZWN0aW9uc193aXRoX3JlcG9zaXRvcmllcykpCgogICAgZGVmIF9nZXRfcmVwb19jcmVkKHNlbGYsIHNlY3Rpb24pOgogICAgICAgIHJlcG8gPSBzZWxmLmdldChzZWN0aW9uLCAncmVwb3NpdG9yeScpLnN0cmlwKCkKICAgICAgICByZXR1cm4gcmVwbywgQ3JlZGVudGlhbCgKICAgICAgICAgICAgc2VsZi5nZXQoc2VjdGlvbiwgJ3VzZXJuYW1lJykuc3RyaXAoKSwKICAgICAgICAgICAgc2VsZi5nZXQoc2VjdGlvbiwgJ3Bhc3N3b3JkJykuc3RyaXAoKSwKICAgICAgICApCgogICAgZGVmIGZpbmRfY3JlZGVudGlhbChzZWxmLCB1cmwpOgogICAgICAgICIiIgogICAgICAgIElmIHRoZSBVUkwgaW5kaWNhdGVkIGFwcGVhcnMgdG8gYmUgYSByZXBvc2l0b3J5IGRlZmluZWQgaW4gdGhpcwogICAgICAgIGNvbmZpZywgcmV0dXJuIHRoZSBjcmVkZW50aWFsIGZvciB0aGF0IHJlcG9zaXRvcnkuCiAgICAgICAgIiIiCiAgICAgICAgZm9yIHJlcG9zaXRvcnksIGNyZWQgaW4gc2VsZi5jcmVkc19ieV9yZXBvc2l0b3J5Lml0ZW1zKCk6CiAgICAgICAgICAgIGlmIHVybC5zdGFydHN3aXRoKHJlcG9zaXRvcnkpOgogICAgICAgICAgICAgICAgcmV0dXJuIGNyZWQKCgpkZWYgb3Blbl93aXRoX2F1dGgodXJsLCBvcGVuZXI9dXJsbGliLnJlcXVlc3QudXJsb3Blbik6CiAgICAiIiJPcGVuIGEgdXJsbGliMiByZXF1ZXN0LCBoYW5kbGluZyBIVFRQIGF1dGhlbnRpY2F0aW9uIiIiCgogICAgc2NoZW1lLCBuZXRsb2MsIHBhdGgsIHBhcmFtcywgcXVlcnksIGZyYWcgPSB1cmxsaWIucGFyc2UudXJscGFyc2UodXJsKQoKICAgICMgRG91YmxlIHNjaGVtZSBkb2VzIG5vdCByYWlzZSBvbiBNYWMgT1MgWCBhcyByZXZlYWxlZCBieSBhCiAgICAjIGZhaWxpbmcgdGVzdC4gV2Ugd291bGQgZXhwZWN0ICJub25udW1lcmljIHBvcnQiLiBSZWZzICMyMC4KICAgIGlmIG5ldGxvYy5lbmRzd2l0aCgnOicpOgogICAgICAgIHJhaXNlIGh0dHBfY2xpZW50LkludmFsaWRVUkwoIm5vbm51bWVyaWMgcG9ydDogJyciKQoKICAgIGlmIHNjaGVtZSBpbiAoJ2h0dHAnLCAnaHR0cHMnKToKICAgICAgICBhdXRoLCBob3N0ID0gc3BsaXR1c2VyKG5ldGxvYykKICAgIGVsc2U6CiAgICAgICAgYXV0aCA9IE5vbmUKCiAgICBpZiBub3QgYXV0aDoKICAgICAgICBjcmVkID0gUHlQSUNvbmZpZygpLmZpbmRfY3JlZGVudGlhbCh1cmwpCiAgICAgICAgaWYgY3JlZDoKICAgICAgICAgICAgYXV0aCA9IHN0cihjcmVkKQogICAgICAgICAgICBpbmZvID0gY3JlZC51c2VybmFtZSwgdXJsCiAgICAgICAgICAgIGxvZy5pbmZvKCdBdXRoZW50aWNhdGluZyBhcyAlcyBmb3IgJXMgKGZyb20gLnB5cGlyYyknLCAqaW5mbykKCiAgICBpZiBhdXRoOgogICAgICAgIGF1dGggPSAiQmFzaWMgIiArIF9lbmNvZGVfYXV0aChhdXRoKQogICAgICAgIHBhcnRzID0gc2NoZW1lLCBob3N0LCBwYXRoLCBwYXJhbXMsIHF1ZXJ5LCBmcmFnCiAgICAgICAgbmV3X3VybCA9IHVybGxpYi5wYXJzZS51cmx1bnBhcnNlKHBhcnRzKQogICAgICAgIHJlcXVlc3QgPSB1cmxsaWIucmVxdWVzdC5SZXF1ZXN0KG5ld191cmwpCiAgICAgICAgcmVxdWVzdC5hZGRfaGVhZGVyKCJBdXRob3JpemF0aW9uIiwgYXV0aCkKICAgIGVsc2U6CiAgICAgICAgcmVxdWVzdCA9IHVybGxpYi5yZXF1ZXN0LlJlcXVlc3QodXJsKQoKICAgIHJlcXVlc3QuYWRkX2hlYWRlcignVXNlci1BZ2VudCcsIHVzZXJfYWdlbnQpCiAgICBmcCA9IG9wZW5lcihyZXF1ZXN0KQoKICAgIGlmIGF1dGg6CiAgICAgICAgIyBQdXQgYXV0aGVudGljYXRpb24gaW5mbyBiYWNrIGludG8gcmVxdWVzdCBVUkwgaWYgc2FtZSBob3N0LAogICAgICAgICMgc28gdGhhdCBsaW5rcyBmb3VuZCBvbiB0aGUgcGFnZSB3aWxsIHdvcmsKICAgICAgICBzMiwgaDIsIHBhdGgyLCBwYXJhbTIsIHF1ZXJ5MiwgZnJhZzIgPSB1cmxsaWIucGFyc2UudXJscGFyc2UoZnAudXJsKQogICAgICAgIGlmIHMyID09IHNjaGVtZSBhbmQgaDIgPT0gaG9zdDoKICAgICAgICAgICAgcGFydHMgPSBzMiwgbmV0bG9jLCBwYXRoMiwgcGFyYW0yLCBxdWVyeTIsIGZyYWcyCiAgICAgICAgICAgIGZwLnVybCA9IHVybGxpYi5wYXJzZS51cmx1bnBhcnNlKHBhcnRzKQoKICAgIHJldHVybiBmcAoKCiMgYWRkaW5nIGEgdGltZW91dCB0byBhdm9pZCBmcmVlemluZyBwYWNrYWdlX2luZGV4Cm9wZW5fd2l0aF9hdXRoID0gc29ja2V0X3RpbWVvdXQoX1NPQ0tFVF9USU1FT1VUKShvcGVuX3dpdGhfYXV0aCkKCgpkZWYgZml4X3NmX3VybCh1cmwpOgogICAgcmV0dXJuIHVybCAgIyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CgoKZGVmIGxvY2FsX29wZW4odXJsKToKICAgICIiIlJlYWQgYSBsb2NhbCBwYXRoLCB3aXRoIHNwZWNpYWwgc3VwcG9ydCBmb3IgZGlyZWN0b3JpZXMiIiIKICAgIHNjaGVtZSwgc2VydmVyLCBwYXRoLCBwYXJhbSwgcXVlcnksIGZyYWcgPSB1cmxsaWIucGFyc2UudXJscGFyc2UodXJsKQogICAgZmlsZW5hbWUgPSB1cmxsaWIucmVxdWVzdC51cmwycGF0aG5hbWUocGF0aCkKICAgIGlmIG9zLnBhdGguaXNmaWxlKGZpbGVuYW1lKToKICAgICAgICByZXR1cm4gdXJsbGliLnJlcXVlc3QudXJsb3Blbih1cmwpCiAgICBlbGlmIHBhdGguZW5kc3dpdGgoJy8nKSBhbmQgb3MucGF0aC5pc2RpcihmaWxlbmFtZSk6CiAgICAgICAgZmlsZXMgPSBbXQogICAgICAgIGZvciBmIGluIG9zLmxpc3RkaXIoZmlsZW5hbWUpOgogICAgICAgICAgICBmaWxlcGF0aCA9IG9zLnBhdGguam9pbihmaWxlbmFtZSwgZikKICAgICAgICAgICAgaWYgZiA9PSAnaW5kZXguaHRtbCc6CiAgICAgICAgICAgICAgICB3aXRoIG9wZW4oZmlsZXBhdGgsICdyJykgYXMgZnA6CiAgICAgICAgICAgICAgICAgICAgYm9keSA9IGZwLnJlYWQoKQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZWxpZiBvcy5wYXRoLmlzZGlyKGZpbGVwYXRoKToKICAgICAgICAgICAgICAgIGYgKz0gJy8nCiAgICAgICAgICAgIGZpbGVzLmFwcGVuZCgnPGEgaHJlZj0ie25hbWV9Ij57bmFtZX08L2E+Jy5mb3JtYXQobmFtZT1mKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICB0bXBsID0gKAogICAgICAgICAgICAgICAgIjxodG1sPjxoZWFkPjx0aXRsZT57dXJsfTwvdGl0bGU+IgogICAgICAgICAgICAgICAgIjwvaGVhZD48Ym9keT57ZmlsZXN9PC9ib2R5PjwvaHRtbD4iKQogICAgICAgICAgICBib2R5ID0gdG1wbC5mb3JtYXQodXJsPXVybCwgZmlsZXM9J1xuJy5qb2luKGZpbGVzKSkKICAgICAgICBzdGF0dXMsIG1lc3NhZ2UgPSAyMDAsICJPSyIKICAgIGVsc2U6CiAgICAgICAgc3RhdHVzLCBtZXNzYWdlLCBib2R5ID0gNDA0LCAiUGF0aCBub3QgZm91bmQiLCAiTm90IGZvdW5kIgoKICAgIGhlYWRlcnMgPSB7J2NvbnRlbnQtdHlwZSc6ICd0ZXh0L2h0bWwnfQogICAgYm9keV9zdHJlYW0gPSBzaXguU3RyaW5nSU8oYm9keSkKICAgIHJldHVybiB1cmxsaWIuZXJyb3IuSFRUUEVycm9yKHVybCwgc3RhdHVzLCBtZXNzYWdlLCBoZWFkZXJzLCBib2R5X3N0cmVhbSkKUEsDBBQAAAAAAAAAIQDl5ui+gioAAIIqAAAwAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9wZXA0MjV0YWdzLnB5IyBUaGlzIGZpbGUgb3JpZ2luYWxseSBmcm9tIHBpcDoKIyBodHRwczovL2dpdGh1Yi5jb20vcHlwYS9waXAvYmxvYi84ZjRmMTVhNWE5NWQ3ZDViNTExY2VhZWU5ZWQyNjExNzZjMTgxOTcwL3NyYy9waXAvX2ludGVybmFsL3BlcDQyNXRhZ3MucHkKIiIiR2VuZXJhdGUgYW5kIHdvcmsgd2l0aCBQRVAgNDI1IENvbXBhdGliaWxpdHkgVGFncy4iIiIKZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKCmltcG9ydCBkaXN0dXRpbHMudXRpbAppbXBvcnQgcGxhdGZvcm0KaW1wb3J0IHJlCmltcG9ydCBzeXMKaW1wb3J0IHN5c2NvbmZpZwppbXBvcnQgd2FybmluZ3MKZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgT3JkZXJlZERpY3QKCmZyb20gLiBpbXBvcnQgZ2xpYmMKCl9vc3hfYXJjaF9wYXQgPSByZS5jb21waWxlKHInKC4rKV8oXGQrKV8oXGQrKV8oLispJykKCgpkZWYgZ2V0X2NvbmZpZ192YXIodmFyKToKICAgIHRyeToKICAgICAgICByZXR1cm4gc3lzY29uZmlnLmdldF9jb25maWdfdmFyKHZhcikKICAgIGV4Y2VwdCBJT0Vycm9yIGFzIGU6ICAjIElzc3VlICMxMDc0CiAgICAgICAgd2FybmluZ3Mud2Fybigie30iLmZvcm1hdChlKSwgUnVudGltZVdhcm5pbmcpCiAgICAgICAgcmV0dXJuIE5vbmUKCgpkZWYgZ2V0X2FiYnJfaW1wbCgpOgogICAgIiIiUmV0dXJuIGFiYnJldmlhdGVkIGltcGxlbWVudGF0aW9uIG5hbWUuIiIiCiAgICBpZiBoYXNhdHRyKHN5cywgJ3B5cHlfdmVyc2lvbl9pbmZvJyk6CiAgICAgICAgcHlpbXBsID0gJ3BwJwogICAgZWxpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnamF2YScpOgogICAgICAgIHB5aW1wbCA9ICdqeScKICAgIGVsaWYgc3lzLnBsYXRmb3JtID09ICdjbGknOgogICAgICAgIHB5aW1wbCA9ICdpcCcKICAgIGVsc2U6CiAgICAgICAgcHlpbXBsID0gJ2NwJwogICAgcmV0dXJuIHB5aW1wbAoKCmRlZiBnZXRfaW1wbF92ZXIoKToKICAgICIiIlJldHVybiBpbXBsZW1lbnRhdGlvbiB2ZXJzaW9uLiIiIgogICAgaW1wbF92ZXIgPSBnZXRfY29uZmlnX3ZhcigicHlfdmVyc2lvbl9ub2RvdCIpCiAgICBpZiBub3QgaW1wbF92ZXIgb3IgZ2V0X2FiYnJfaW1wbCgpID09ICdwcCc6CiAgICAgICAgaW1wbF92ZXIgPSAnJy5qb2luKG1hcChzdHIsIGdldF9pbXBsX3ZlcnNpb25faW5mbygpKSkKICAgIHJldHVybiBpbXBsX3ZlcgoKCmRlZiBnZXRfaW1wbF92ZXJzaW9uX2luZm8oKToKICAgICIiIlJldHVybiBzeXMudmVyc2lvbl9pbmZvLWxpa2UgdHVwbGUgZm9yIHVzZSBpbiBkZWNyZW1lbnRpbmcgdGhlIG1pbm9yCiAgICB2ZXJzaW9uLiIiIgogICAgaWYgZ2V0X2FiYnJfaW1wbCgpID09ICdwcCc6CiAgICAgICAgIyBhcyBwZXIgaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvcGlwL2lzc3Vlcy8yODgyCiAgICAgICAgcmV0dXJuIChzeXMudmVyc2lvbl9pbmZvWzBdLCBzeXMucHlweV92ZXJzaW9uX2luZm8ubWFqb3IsCiAgICAgICAgICAgICAgICBzeXMucHlweV92ZXJzaW9uX2luZm8ubWlub3IpCiAgICBlbHNlOgogICAgICAgIHJldHVybiBzeXMudmVyc2lvbl9pbmZvWzBdLCBzeXMudmVyc2lvbl9pbmZvWzFdCgoKZGVmIGdldF9pbXBsX3RhZygpOgogICAgIiIiCiAgICBSZXR1cm5zIHRoZSBUYWcgZm9yIHRoaXMgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24uCiAgICAiIiIKICAgIHJldHVybiAie317fSIuZm9ybWF0KGdldF9hYmJyX2ltcGwoKSwgZ2V0X2ltcGxfdmVyKCkpCgoKZGVmIGdldF9mbGFnKHZhciwgZmFsbGJhY2ssIGV4cGVjdGVkPVRydWUsIHdhcm49VHJ1ZSk6CiAgICAiIiJVc2UgYSBmYWxsYmFjayBtZXRob2QgZm9yIGRldGVybWluaW5nIFNPQUJJIGZsYWdzIGlmIHRoZSBuZWVkZWQgY29uZmlnCiAgICB2YXIgaXMgdW5zZXQgb3IgdW5hdmFpbGFibGUuIiIiCiAgICB2YWwgPSBnZXRfY29uZmlnX3Zhcih2YXIpCiAgICBpZiB2YWwgaXMgTm9uZToKICAgICAgICBpZiB3YXJuOgogICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJDb25maWcgdmFyaWFibGUgJ3swfScgaXMgdW5zZXQsIFB5dGhvbiBBQkkgdGFnIG1heSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgImJlIGluY29ycmVjdCIuZm9ybWF0KHZhciksIFJ1bnRpbWVXYXJuaW5nLCAyKQogICAgICAgIHJldHVybiBmYWxsYmFjaygpCiAgICByZXR1cm4gdmFsID09IGV4cGVjdGVkCgoKZGVmIGdldF9hYmlfdGFnKCk6CiAgICAiIiJSZXR1cm4gdGhlIEFCSSB0YWcgYmFzZWQgb24gU09BQkkgKGlmIGF2YWlsYWJsZSkgb3IgZW11bGF0ZSBTT0FCSQogICAgKENQeXRob24gMiwgUHlQeSkuIiIiCiAgICBzb2FiaSA9IGdldF9jb25maWdfdmFyKCdTT0FCSScpCiAgICBpbXBsID0gZ2V0X2FiYnJfaW1wbCgpCiAgICBpZiBub3Qgc29hYmkgYW5kIGltcGwgaW4geydjcCcsICdwcCd9IGFuZCBoYXNhdHRyKHN5cywgJ21heHVuaWNvZGUnKToKICAgICAgICBkID0gJycKICAgICAgICBtID0gJycKICAgICAgICB1ID0gJycKICAgICAgICBpZiBnZXRfZmxhZygnUHlfREVCVUcnLAogICAgICAgICAgICAgICAgICAgIGxhbWJkYTogaGFzYXR0cihzeXMsICdnZXR0b3RhbHJlZmNvdW50JyksCiAgICAgICAgICAgICAgICAgICAgd2Fybj0oaW1wbCA9PSAnY3AnKSk6CiAgICAgICAgICAgIGQgPSAnZCcKICAgICAgICBpZiBnZXRfZmxhZygnV0lUSF9QWU1BTExPQycsCiAgICAgICAgICAgICAgICAgICAgbGFtYmRhOiBpbXBsID09ICdjcCcsCiAgICAgICAgICAgICAgICAgICAgd2Fybj0oaW1wbCA9PSAnY3AnKSk6CiAgICAgICAgICAgIG0gPSAnbScKICAgICAgICBpZiBnZXRfZmxhZygnUHlfVU5JQ09ERV9TSVpFJywKICAgICAgICAgICAgICAgICAgICBsYW1iZGE6IHN5cy5tYXh1bmljb2RlID09IDB4MTBmZmZmLAogICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkPTQsCiAgICAgICAgICAgICAgICAgICAgd2Fybj0oaW1wbCA9PSAnY3AnIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy52ZXJzaW9uX2luZm8gPCAoMywgMykpKSBcCiAgICAgICAgICAgICAgICBhbmQgc3lzLnZlcnNpb25faW5mbyA8ICgzLCAzKToKICAgICAgICAgICAgdSA9ICd1JwogICAgICAgIGFiaSA9ICclcyVzJXMlcyVzJyAlIChpbXBsLCBnZXRfaW1wbF92ZXIoKSwgZCwgbSwgdSkKICAgIGVsaWYgc29hYmkgYW5kIHNvYWJpLnN0YXJ0c3dpdGgoJ2NweXRob24tJyk6CiAgICAgICAgYWJpID0gJ2NwJyArIHNvYWJpLnNwbGl0KCctJylbMV0KICAgIGVsaWYgc29hYmk6CiAgICAgICAgYWJpID0gc29hYmkucmVwbGFjZSgnLicsICdfJykucmVwbGFjZSgnLScsICdfJykKICAgIGVsc2U6CiAgICAgICAgYWJpID0gTm9uZQogICAgcmV0dXJuIGFiaQoKCmRlZiBfaXNfcnVubmluZ18zMmJpdCgpOgogICAgcmV0dXJuIHN5cy5tYXhzaXplID09IDIxNDc0ODM2NDcKCgpkZWYgZ2V0X3BsYXRmb3JtKCk6CiAgICAiIiJSZXR1cm4gb3VyIHBsYXRmb3JtIG5hbWUgJ3dpbjMyJywgJ2xpbnV4X3g4Nl82NCciIiIKICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKICAgICAgICAjIGRpc3R1dGlscy51dGlsLmdldF9wbGF0Zm9ybSgpIHJldHVybnMgdGhlIHJlbGVhc2UgYmFzZWQgb24gdGhlIHZhbHVlCiAgICAgICAgIyBvZiBNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQgb24gd2hpY2ggUHl0aG9uIHdhcyBidWlsdCwgd2hpY2ggbWF5CiAgICAgICAgIyBiZSBzaWduaWZpY2FudGx5IG9sZGVyIHRoYW4gdGhlIHVzZXIncyBjdXJyZW50IG1hY2hpbmUuCiAgICAgICAgcmVsZWFzZSwgXywgbWFjaGluZSA9IHBsYXRmb3JtLm1hY192ZXIoKQogICAgICAgIHNwbGl0X3ZlciA9IHJlbGVhc2Uuc3BsaXQoJy4nKQoKICAgICAgICBpZiBtYWNoaW5lID09ICJ4ODZfNjQiIGFuZCBfaXNfcnVubmluZ18zMmJpdCgpOgogICAgICAgICAgICBtYWNoaW5lID0gImkzODYiCiAgICAgICAgZWxpZiBtYWNoaW5lID09ICJwcGM2NCIgYW5kIF9pc19ydW5uaW5nXzMyYml0KCk6CiAgICAgICAgICAgIG1hY2hpbmUgPSAicHBjIgoKICAgICAgICByZXR1cm4gJ21hY29zeF97fV97fV97fScuZm9ybWF0KHNwbGl0X3ZlclswXSwgc3BsaXRfdmVyWzFdLCBtYWNoaW5lKQoKICAgICMgWFhYIHJlbW92ZSBkaXN0dXRpbHMgZGVwZW5kZW5jeQogICAgcmVzdWx0ID0gZGlzdHV0aWxzLnV0aWwuZ2V0X3BsYXRmb3JtKCkucmVwbGFjZSgnLicsICdfJykucmVwbGFjZSgnLScsICdfJykKICAgIGlmIHJlc3VsdCA9PSAibGludXhfeDg2XzY0IiBhbmQgX2lzX3J1bm5pbmdfMzJiaXQoKToKICAgICAgICAjIDMyIGJpdCBQeXRob24gcHJvZ3JhbSAocnVubmluZyBvbiBhIDY0IGJpdCBMaW51eCk6IHBpcCBzaG91bGQgb25seQogICAgICAgICMgaW5zdGFsbCBhbmQgcnVuIDMyIGJpdCBjb21waWxlZCBleHRlbnNpb25zIGluIHRoYXQgY2FzZS4KICAgICAgICByZXN1bHQgPSAibGludXhfaTY4NiIKCiAgICByZXR1cm4gcmVzdWx0CgoKZGVmIGlzX21hbnlsaW51eDFfY29tcGF0aWJsZSgpOgogICAgIyBPbmx5IExpbnV4LCBhbmQgb25seSB4ODYtNjQgLyBpNjg2CiAgICBpZiBnZXRfcGxhdGZvcm0oKSBub3QgaW4geyJsaW51eF94ODZfNjQiLCAibGludXhfaTY4NiJ9OgogICAgICAgIHJldHVybiBGYWxzZQoKICAgICMgQ2hlY2sgZm9yIHByZXNlbmNlIG9mIF9tYW55bGludXggbW9kdWxlCiAgICB0cnk6CiAgICAgICAgaW1wb3J0IF9tYW55bGludXgKICAgICAgICByZXR1cm4gYm9vbChfbWFueWxpbnV4Lm1hbnlsaW51eDFfY29tcGF0aWJsZSkKICAgIGV4Y2VwdCAoSW1wb3J0RXJyb3IsIEF0dHJpYnV0ZUVycm9yKToKICAgICAgICAjIEZhbGwgdGhyb3VnaCB0byBoZXVyaXN0aWMgY2hlY2sgYmVsb3cKICAgICAgICBwYXNzCgogICAgIyBDaGVjayBnbGliYyB2ZXJzaW9uLiBDZW50T1MgNSB1c2VzIGdsaWJjIDIuNS4KICAgIHJldHVybiBnbGliYy5oYXZlX2NvbXBhdGlibGVfZ2xpYmMoMiwgNSkKCgpkZWYgZ2V0X2Rhcndpbl9hcmNoZXMobWFqb3IsIG1pbm9yLCBtYWNoaW5lKToKICAgICIiIlJldHVybiBhIGxpc3Qgb2Ygc3VwcG9ydGVkIGFyY2hlcyAoaW5jbHVkaW5nIGdyb3VwIGFyY2hlcykgZm9yCiAgICB0aGUgZ2l2ZW4gbWFqb3IsIG1pbm9yIGFuZCBtYWNoaW5lIGFyY2hpdGVjdHVyZSBvZiBhbiBtYWNPUyBtYWNoaW5lLgogICAgIiIiCiAgICBhcmNoZXMgPSBbXQoKICAgIGRlZiBfc3VwcG9ydHNfYXJjaChtYWpvciwgbWlub3IsIGFyY2gpOgogICAgICAgICMgTG9va2luZyBhdCB0aGUgYXBwbGljYXRpb24gc3VwcG9ydCBmb3IgbWFjT1MgdmVyc2lvbnMgaW4gdGhlIGNoYXJ0CiAgICAgICAgIyBwcm92aWRlZCBieSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9PU19YI1ZlcnNpb25zIGl0IGFwcGVhcnMKICAgICAgICAjIG91ciB0aW1lbGluZSBsb29rcyByb3VnaGx5IGxpa2U6CiAgICAgICAgIwogICAgICAgICMgMTAuMCAtIEludHJvZHVjZXMgcHBjIHN1cHBvcnQuCiAgICAgICAgIyAxMC40IC0gSW50cm9kdWNlcyBwcGM2NCwgaTM4NiwgYW5kIHg4Nl82NCBzdXBwb3J0LCBob3dldmVyIHRoZSBwcGM2NAogICAgICAgICMgICAgICAgIGFuZCB4ODZfNjQgc3VwcG9ydCBpcyBDTEkgb25seSwgYW5kIGNhbm5vdCBiZSB1c2VkIGZvciBHVUkKICAgICAgICAjICAgICAgICBhcHBsaWNhdGlvbnMuCiAgICAgICAgIyAxMC41IC0gRXh0ZW5kcyBwcGM2NCBhbmQgeDg2XzY0IHN1cHBvcnQgdG8gY292ZXIgR1VJIGFwcGxpY2F0aW9ucy4KICAgICAgICAjIDEwLjYgLSBEcm9wcyBzdXBwb3J0IGZvciBwcGM2NAogICAgICAgICMgMTAuNyAtIERyb3BzIHN1cHBvcnQgZm9yIHBwYwogICAgICAgICMKICAgICAgICAjIEdpdmVuIHRoYXQgd2UgZG8gbm90IGtub3cgaWYgd2UncmUgaW5zdGFsbGluZyBhIENMSSBvciBhIEdVSQogICAgICAgICMgYXBwbGljYXRpb24sIHdlIG11c3QgYmUgY29uc2VydmF0aXZlIGFuZCBhc3N1bWUgaXQgbWlnaHQgYmUgYSBHVUkKICAgICAgICAjIGFwcGxpY2F0aW9uIGFuZCBiZWhhdmUgYXMgaWYgcHBjNjQgYW5kIHg4Nl82NCBzdXBwb3J0IGRpZCBub3Qgb2NjdXIKICAgICAgICAjIHVudGlsIDEwLjUuCiAgICAgICAgIwogICAgICAgICMgTm90ZTogVGhlIGFib3ZlIGluZm9ybWF0aW9uIGlzIHRha2VuIGZyb20gdGhlICJBcHBsaWNhdGlvbiBzdXBwb3J0IgogICAgICAgICMgICAgICAgY29sdW1uIGluIHRoZSBjaGFydCBub3QgdGhlICJQcm9jZXNzb3Igc3VwcG9ydCIgc2luY2UgSSBiZWxpZXZlCiAgICAgICAgIyAgICAgICB0aGF0IHdlIGNhcmUgYWJvdXQgd2hhdCBpbnN0cnVjdGlvbiBzZXRzIGFuIGFwcGxpY2F0aW9uIGNhbiB1c2UKICAgICAgICAjICAgICAgIG5vdCB3aGljaCBwcm9jZXNzb3JzIHRoZSBPUyBzdXBwb3J0cy4KICAgICAgICBpZiBhcmNoID09ICdwcGMnOgogICAgICAgICAgICByZXR1cm4gKG1ham9yLCBtaW5vcikgPD0gKDEwLCA1KQogICAgICAgIGlmIGFyY2ggPT0gJ3BwYzY0JzoKICAgICAgICAgICAgcmV0dXJuIChtYWpvciwgbWlub3IpID09ICgxMCwgNSkKICAgICAgICBpZiBhcmNoID09ICdpMzg2JzoKICAgICAgICAgICAgcmV0dXJuIChtYWpvciwgbWlub3IpID49ICgxMCwgNCkKICAgICAgICBpZiBhcmNoID09ICd4ODZfNjQnOgogICAgICAgICAgICByZXR1cm4gKG1ham9yLCBtaW5vcikgPj0gKDEwLCA1KQogICAgICAgIGlmIGFyY2ggaW4gZ3JvdXBzOgogICAgICAgICAgICBmb3IgZ2FyY2ggaW4gZ3JvdXBzW2FyY2hdOgogICAgICAgICAgICAgICAgaWYgX3N1cHBvcnRzX2FyY2gobWFqb3IsIG1pbm9yLCBnYXJjaCk6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKICAgICAgICByZXR1cm4gRmFsc2UKCiAgICBncm91cHMgPSBPcmRlcmVkRGljdChbCiAgICAgICAgKCJmYXQiLCAoImkzODYiLCAicHBjIikpLAogICAgICAgICgiaW50ZWwiLCAoIng4Nl82NCIsICJpMzg2IikpLAogICAgICAgICgiZmF0NjQiLCAoIng4Nl82NCIsICJwcGM2NCIpKSwKICAgICAgICAoImZhdDMyIiwgKCJ4ODZfNjQiLCAiaTM4NiIsICJwcGMiKSksCiAgICBdKQoKICAgIGlmIF9zdXBwb3J0c19hcmNoKG1ham9yLCBtaW5vciwgbWFjaGluZSk6CiAgICAgICAgYXJjaGVzLmFwcGVuZChtYWNoaW5lKQoKICAgIGZvciBnYXJjaCBpbiBncm91cHM6CiAgICAgICAgaWYgbWFjaGluZSBpbiBncm91cHNbZ2FyY2hdIGFuZCBfc3VwcG9ydHNfYXJjaChtYWpvciwgbWlub3IsIGdhcmNoKToKICAgICAgICAgICAgYXJjaGVzLmFwcGVuZChnYXJjaCkKCiAgICBhcmNoZXMuYXBwZW5kKCd1bml2ZXJzYWwnKQoKICAgIHJldHVybiBhcmNoZXMKCgpkZWYgZ2V0X3N1cHBvcnRlZCh2ZXJzaW9ucz1Ob25lLCBub2FyY2g9RmFsc2UsIHBsYXRmb3JtPU5vbmUsCiAgICAgICAgICAgICAgICAgIGltcGw9Tm9uZSwgYWJpPU5vbmUpOgogICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBzdXBwb3J0ZWQgdGFncyBmb3IgZWFjaCB2ZXJzaW9uIHNwZWNpZmllZCBpbgogICAgYHZlcnNpb25zYC4KCiAgICA6cGFyYW0gdmVyc2lvbnM6IGEgbGlzdCBvZiBzdHJpbmcgdmVyc2lvbnMsIG9mIHRoZSBmb3JtIFsiMzMiLCAiMzIiXSwKICAgICAgICBvciBOb25lLiBUaGUgZmlyc3QgdmVyc2lvbiB3aWxsIGJlIGFzc3VtZWQgdG8gc3VwcG9ydCBvdXIgQUJJLgogICAgOnBhcmFtIHBsYXRmb3JtOiBzcGVjaWZ5IHRoZSBleGFjdCBwbGF0Zm9ybSB5b3Ugd2FudCB2YWxpZAogICAgICAgIHRhZ3MgZm9yLCBvciBOb25lLiBJZiBOb25lLCB1c2UgdGhlIGxvY2FsIHN5c3RlbSBwbGF0Zm9ybS4KICAgIDpwYXJhbSBpbXBsOiBzcGVjaWZ5IHRoZSBleGFjdCBpbXBsZW1lbnRhdGlvbiB5b3Ugd2FudCB2YWxpZAogICAgICAgIHRhZ3MgZm9yLCBvciBOb25lLiBJZiBOb25lLCB1c2UgdGhlIGxvY2FsIGludGVycHJldGVyIGltcGwuCiAgICA6cGFyYW0gYWJpOiBzcGVjaWZ5IHRoZSBleGFjdCBhYmkgeW91IHdhbnQgdmFsaWQKICAgICAgICB0YWdzIGZvciwgb3IgTm9uZS4gSWYgTm9uZSwgdXNlIHRoZSBsb2NhbCBpbnRlcnByZXRlciBhYmkuCiAgICAiIiIKICAgIHN1cHBvcnRlZCA9IFtdCgogICAgIyBWZXJzaW9ucyBtdXN0IGJlIGdpdmVuIHdpdGggcmVzcGVjdCB0byB0aGUgcHJlZmVyZW5jZQogICAgaWYgdmVyc2lvbnMgaXMgTm9uZToKICAgICAgICB2ZXJzaW9ucyA9IFtdCiAgICAgICAgdmVyc2lvbl9pbmZvID0gZ2V0X2ltcGxfdmVyc2lvbl9pbmZvKCkKICAgICAgICBtYWpvciA9IHZlcnNpb25faW5mb1s6LTFdCiAgICAgICAgIyBTdXBwb3J0IGFsbCBwcmV2aW91cyBtaW5vciBQeXRob24gdmVyc2lvbnMuCiAgICAgICAgZm9yIG1pbm9yIGluIHJhbmdlKHZlcnNpb25faW5mb1stMV0sIC0xLCAtMSk6CiAgICAgICAgICAgIHZlcnNpb25zLmFwcGVuZCgnJy5qb2luKG1hcChzdHIsIG1ham9yICsgKG1pbm9yLCkpKSkKCiAgICBpbXBsID0gaW1wbCBvciBnZXRfYWJicl9pbXBsKCkKCiAgICBhYmlzID0gW10KCiAgICBhYmkgPSBhYmkgb3IgZ2V0X2FiaV90YWcoKQogICAgaWYgYWJpOgogICAgICAgIGFiaXNbMDowXSA9IFthYmldCgogICAgYWJpM3MgPSBzZXQoKQogICAgaW1wb3J0IGltcAogICAgZm9yIHN1ZmZpeCBpbiBpbXAuZ2V0X3N1ZmZpeGVzKCk6CiAgICAgICAgaWYgc3VmZml4WzBdLnN0YXJ0c3dpdGgoJy5hYmknKToKICAgICAgICAgICAgYWJpM3MuYWRkKHN1ZmZpeFswXS5zcGxpdCgnLicsIDIpWzFdKQoKICAgIGFiaXMuZXh0ZW5kKHNvcnRlZChsaXN0KGFiaTNzKSkpCgogICAgYWJpcy5hcHBlbmQoJ25vbmUnKQoKICAgIGlmIG5vdCBub2FyY2g6CiAgICAgICAgYXJjaCA9IHBsYXRmb3JtIG9yIGdldF9wbGF0Zm9ybSgpCiAgICAgICAgaWYgYXJjaC5zdGFydHN3aXRoKCdtYWNvc3gnKToKICAgICAgICAgICAgIyBzdXBwb3J0IG1hY29zeC0xMC42LWludGVsIG9uIG1hY29zeC0xMC45LXg4Nl82NAogICAgICAgICAgICBtYXRjaCA9IF9vc3hfYXJjaF9wYXQubWF0Y2goYXJjaCkKICAgICAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgICAgICBuYW1lLCBtYWpvciwgbWlub3IsIGFjdHVhbF9hcmNoID0gbWF0Y2guZ3JvdXBzKCkKICAgICAgICAgICAgICAgIHRwbCA9ICd7fV97fV8laV8lcycuZm9ybWF0KG5hbWUsIG1ham9yKQogICAgICAgICAgICAgICAgYXJjaGVzID0gW10KICAgICAgICAgICAgICAgIGZvciBtIGluIHJldmVyc2VkKHJhbmdlKGludChtaW5vcikgKyAxKSk6CiAgICAgICAgICAgICAgICAgICAgZm9yIGEgaW4gZ2V0X2Rhcndpbl9hcmNoZXMoaW50KG1ham9yKSwgbSwgYWN0dWFsX2FyY2gpOgogICAgICAgICAgICAgICAgICAgICAgICBhcmNoZXMuYXBwZW5kKHRwbCAlIChtLCBhKSkKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICMgYXJjaCBwYXR0ZXJuIGRpZG4ndCBtYXRjaCAoPyEpCiAgICAgICAgICAgICAgICBhcmNoZXMgPSBbYXJjaF0KICAgICAgICBlbGlmIHBsYXRmb3JtIGlzIE5vbmUgYW5kIGlzX21hbnlsaW51eDFfY29tcGF0aWJsZSgpOgogICAgICAgICAgICBhcmNoZXMgPSBbYXJjaC5yZXBsYWNlKCdsaW51eCcsICdtYW55bGludXgxJyksIGFyY2hdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYXJjaGVzID0gW2FyY2hdCgogICAgICAgICMgQ3VycmVudCB2ZXJzaW9uLCBjdXJyZW50IEFQSSAoYnVpbHQgc3BlY2lmaWNhbGx5IGZvciBvdXIgUHl0aG9uKToKICAgICAgICBmb3IgYWJpIGluIGFiaXM6CiAgICAgICAgICAgIGZvciBhcmNoIGluIGFyY2hlczoKICAgICAgICAgICAgICAgIHN1cHBvcnRlZC5hcHBlbmQoKCclcyVzJyAlIChpbXBsLCB2ZXJzaW9uc1swXSksIGFiaSwgYXJjaCkpCgogICAgICAgICMgYWJpMyBtb2R1bGVzIGNvbXBhdGlibGUgd2l0aCBvbGRlciB2ZXJzaW9uIG9mIFB5dGhvbgogICAgICAgIGZvciB2ZXJzaW9uIGluIHZlcnNpb25zWzE6XToKICAgICAgICAgICAgIyBhYmkzIHdhcyBpbnRyb2R1Y2VkIGluIFB5dGhvbiAzLjIKICAgICAgICAgICAgaWYgdmVyc2lvbiBpbiB7JzMxJywgJzMwJ306CiAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBmb3IgYWJpIGluIGFiaTNzOiAgICMgZW1wdHkgc2V0IGlmIG5vdCBQeXRob24gMwogICAgICAgICAgICAgICAgZm9yIGFyY2ggaW4gYXJjaGVzOgogICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZC5hcHBlbmQoKCIlcyVzIiAlIChpbXBsLCB2ZXJzaW9uKSwgYWJpLCBhcmNoKSkKCiAgICAgICAgIyBIYXMgYmluYXJpZXMsIGRvZXMgbm90IHVzZSB0aGUgUHl0aG9uIEFQSToKICAgICAgICBmb3IgYXJjaCBpbiBhcmNoZXM6CiAgICAgICAgICAgIHN1cHBvcnRlZC5hcHBlbmQoKCdweSVzJyAlICh2ZXJzaW9uc1swXVswXSksICdub25lJywgYXJjaCkpCgogICAgIyBObyBhYmkgLyBhcmNoLCBidXQgcmVxdWlyZXMgb3VyIGltcGxlbWVudGF0aW9uOgogICAgc3VwcG9ydGVkLmFwcGVuZCgoJyVzJXMnICUgKGltcGwsIHZlcnNpb25zWzBdKSwgJ25vbmUnLCAnYW55JykpCiAgICAjIFRhZ2dlZCBzcGVjaWZpY2FsbHkgYXMgYmVpbmcgY3Jvc3MtdmVyc2lvbiBjb21wYXRpYmxlCiAgICAjICh3aXRoIGp1c3QgdGhlIG1ham9yIHZlcnNpb24gc3BlY2lmaWVkKQogICAgc3VwcG9ydGVkLmFwcGVuZCgoJyVzJXMnICUgKGltcGwsIHZlcnNpb25zWzBdWzBdKSwgJ25vbmUnLCAnYW55JykpCgogICAgIyBObyBhYmkgLyBhcmNoLCBnZW5lcmljIFB5dGhvbgogICAgZm9yIGksIHZlcnNpb24gaW4gZW51bWVyYXRlKHZlcnNpb25zKToKICAgICAgICBzdXBwb3J0ZWQuYXBwZW5kKCgncHklcycgJSAodmVyc2lvbiwpLCAnbm9uZScsICdhbnknKSkKICAgICAgICBpZiBpID09IDA6CiAgICAgICAgICAgIHN1cHBvcnRlZC5hcHBlbmQoKCdweSVzJyAlICh2ZXJzaW9uWzBdKSwgJ25vbmUnLCAnYW55JykpCgogICAgcmV0dXJuIHN1cHBvcnRlZAoKCmltcGxlbWVudGF0aW9uX3RhZyA9IGdldF9pbXBsX3RhZygpClBLAwQUAAAAAAAAACEAsmanVxgCAAAYAgAAMAAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvcHkyN2NvbXBhdC5weSIiIgpDb21wYXRpYmlsaXR5IFN1cHBvcnQgZm9yIFB5dGhvbiAyLjcgYW5kIGVhcmxpZXIKIiIiCgppbXBvcnQgcGxhdGZvcm0KCmZyb20gc2V0dXB0b29scy5leHRlcm4gaW1wb3J0IHNpeAoKCmRlZiBnZXRfYWxsX2hlYWRlcnMobWVzc2FnZSwga2V5KToKICAgICIiIgogICAgR2l2ZW4gYW4gSFRUUE1lc3NhZ2UsIHJldHVybiBhbGwgaGVhZGVycyBtYXRjaGluZyBhIGdpdmVuIGtleS4KICAgICIiIgogICAgcmV0dXJuIG1lc3NhZ2UuZ2V0X2FsbChrZXkpCgoKaWYgc2l4LlBZMjoKICAgIGRlZiBnZXRfYWxsX2hlYWRlcnMobWVzc2FnZSwga2V5KToKICAgICAgICByZXR1cm4gbWVzc2FnZS5nZXRoZWFkZXJzKGtleSkKCgpsaW51eF9weTJfYXNjaWkgPSAoCiAgICBwbGF0Zm9ybS5zeXN0ZW0oKSA9PSAnTGludXgnIGFuZAogICAgc2l4LlBZMgopCgpybXRyZWVfc2FmZSA9IHN0ciBpZiBsaW51eF9weTJfYXNjaWkgZWxzZSBsYW1iZGEgeDogeAoiIiJXb3JrYXJvdW5kIGZvciBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMjQ2NzIiIiIKUEsDBBQAAAAAAAAAIQDQuUhaqAQAAKgEAAAwAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9weTMxY29tcGF0LnB5X19hbGxfXyA9IFsnZ2V0X2NvbmZpZ192YXJzJywgJ2dldF9wYXRoJ10KCnRyeToKICAgICMgUHl0aG9uIDIuNyBvciA+PTMuMgogICAgZnJvbSBzeXNjb25maWcgaW1wb3J0IGdldF9jb25maWdfdmFycywgZ2V0X3BhdGgKZXhjZXB0IEltcG9ydEVycm9yOgogICAgZnJvbSBkaXN0dXRpbHMuc3lzY29uZmlnIGltcG9ydCBnZXRfY29uZmlnX3ZhcnMsIGdldF9weXRob25fbGliCgogICAgZGVmIGdldF9wYXRoKG5hbWUpOgogICAgICAgIGlmIG5hbWUgbm90IGluICgncGxhdGxpYicsICdwdXJlbGliJyk6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIk5hbWUgbXVzdCBiZSBwdXJlbGliIG9yIHBsYXRsaWIiKQogICAgICAgIHJldHVybiBnZXRfcHl0aG9uX2xpYihuYW1lID09ICdwbGF0bGliJykKCgp0cnk6CiAgICAjIFB5dGhvbiA+PTMuMgogICAgZnJvbSB0ZW1wZmlsZSBpbXBvcnQgVGVtcG9yYXJ5RGlyZWN0b3J5CmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIGltcG9ydCBzaHV0aWwKICAgIGltcG9ydCB0ZW1wZmlsZQoKICAgIGNsYXNzIFRlbXBvcmFyeURpcmVjdG9yeShvYmplY3QpOgogICAgICAgICIiIgogICAgICAgIFZlcnkgc2ltcGxlIHRlbXBvcmFyeSBkaXJlY3RvcnkgY29udGV4dCBtYW5hZ2VyLgogICAgICAgIFdpbGwgdHJ5IHRvIGRlbGV0ZSBhZnRlcndhcmQsIGJ1dCB3aWxsIGFsc28gaWdub3JlIE9TIGFuZCBzaW1pbGFyCiAgICAgICAgZXJyb3JzIG9uIGRlbGV0aW9uLgogICAgICAgICIiIgoKICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgICAgIHNlbGYubmFtZSA9IE5vbmUgICMgSGFuZGxlIG1rZHRlbXAgcmFpc2luZyBhbiBleGNlcHRpb24KICAgICAgICAgICAgc2VsZi5uYW1lID0gdGVtcGZpbGUubWtkdGVtcCgpCgogICAgICAgIGRlZiBfX2VudGVyX18oc2VsZik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUKCiAgICAgICAgZGVmIF9fZXhpdF9fKHNlbGYsIGV4Y3R5cGUsIGV4Y3ZhbHVlLCBleGN0cmFjZSk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHNodXRpbC5ybXRyZWUoc2VsZi5uYW1lLCBUcnVlKQogICAgICAgICAgICBleGNlcHQgT1NFcnJvcjogICMgcmVtb3ZhbCBlcnJvcnMgYXJlIG5vdCB0aGUgb25seSBwb3NzaWJsZQogICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICBzZWxmLm5hbWUgPSBOb25lClBLAwQUAAAAAAAAACEAyWGSwOYDAADmAwAAMAAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvcHkzM2NvbXBhdC5weWltcG9ydCBkaXMKaW1wb3J0IGFycmF5CmltcG9ydCBjb2xsZWN0aW9ucwoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybiBpbXBvcnQgc2l4CgoKT3BBcmcgPSBjb2xsZWN0aW9ucy5uYW1lZHR1cGxlKCdPcEFyZycsICdvcGNvZGUgYXJnJykKCgpjbGFzcyBCeXRlY29kZV9jb21wYXQob2JqZWN0KToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb2RlKToKICAgICAgICBzZWxmLmNvZGUgPSBjb2RlCgogICAgZGVmIF9faXRlcl9fKHNlbGYpOgogICAgICAgICIiIllpZWxkICcob3AsYXJnKScgcGFpciBmb3IgZWFjaCBvcGVyYXRpb24gaW4gY29kZSBvYmplY3QgJ2NvZGUnIiIiCgogICAgICAgIGJ5dGVzID0gYXJyYXkuYXJyYXkoJ2InLCBzZWxmLmNvZGUuY29fY29kZSkKICAgICAgICBlb2YgPSBsZW4oc2VsZi5jb2RlLmNvX2NvZGUpCgogICAgICAgIHB0ciA9IDAKICAgICAgICBleHRlbmRlZF9hcmcgPSAwCgogICAgICAgIHdoaWxlIHB0ciA8IGVvZjoKCiAgICAgICAgICAgIG9wID0gYnl0ZXNbcHRyXQoKICAgICAgICAgICAgaWYgb3AgPj0gZGlzLkhBVkVfQVJHVU1FTlQ6CgogICAgICAgICAgICAgICAgYXJnID0gYnl0ZXNbcHRyICsgMV0gKyBieXRlc1twdHIgKyAyXSAqIDI1NiArIGV4dGVuZGVkX2FyZwogICAgICAgICAgICAgICAgcHRyICs9IDMKCiAgICAgICAgICAgICAgICBpZiBvcCA9PSBkaXMuRVhURU5ERURfQVJHOgogICAgICAgICAgICAgICAgICAgIGxvbmdfdHlwZSA9IHNpeC5pbnRlZ2VyX3R5cGVzWy0xXQogICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkX2FyZyA9IGFyZyAqIGxvbmdfdHlwZSg2NTUzNikKICAgICAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGFyZyA9IE5vbmUKICAgICAgICAgICAgICAgIHB0ciArPSAxCgogICAgICAgICAgICB5aWVsZCBPcEFyZyhvcCwgYXJnKQoKCkJ5dGVjb2RlID0gZ2V0YXR0cihkaXMsICdCeXRlY29kZScsIEJ5dGVjb2RlX2NvbXBhdCkKUEsDBBQAAAAAAAAAIQCFGZoLSwsAAEsLAAAwAAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9weTM2Y29tcGF0LnB5aW1wb3J0IHN5cwpmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc09wdGlvbkVycm9yCmZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IHN0cnRvYm9vbApmcm9tIGRpc3R1dGlscy5kZWJ1ZyBpbXBvcnQgREVCVUcKCgpjbGFzcyBEaXN0cmlidXRpb25fcGFyc2VfY29uZmlnX2ZpbGVzOgogICAgIiIiCiAgICBNaXgtaW4gcHJvdmlkaW5nIGZvcndhcmQtY29tcGF0aWJpbGl0eSBmb3IgZnVuY3Rpb25hbGl0eSB0byBiZQogICAgaW5jbHVkZWQgYnkgZGVmYXVsdCBvbiBQeXRob24gMy43LgoKICAgIERvIG5vdCBlZGl0IHRoZSBjb2RlIGluIHRoaXMgY2xhc3MgZXhjZXB0IHRvIHVwZGF0ZSBmdW5jdGlvbmFsaXR5CiAgICBhcyBpbXBsZW1lbnRlZCBpbiBkaXN0dXRpbHMuCiAgICAiIiIKICAgIGRlZiBwYXJzZV9jb25maWdfZmlsZXMoc2VsZiwgZmlsZW5hbWVzPU5vbmUpOgogICAgICAgIGZyb20gY29uZmlncGFyc2VyIGltcG9ydCBDb25maWdQYXJzZXIKCiAgICAgICAgIyBJZ25vcmUgaW5zdGFsbCBkaXJlY3Rvcnkgb3B0aW9ucyBpZiB3ZSBoYXZlIGEgdmVudgogICAgICAgIGlmIHN5cy5wcmVmaXggIT0gc3lzLmJhc2VfcHJlZml4OgogICAgICAgICAgICBpZ25vcmVfb3B0aW9ucyA9IFsKICAgICAgICAgICAgICAgICdpbnN0YWxsLWJhc2UnLCAnaW5zdGFsbC1wbGF0YmFzZScsICdpbnN0YWxsLWxpYicsCiAgICAgICAgICAgICAgICAnaW5zdGFsbC1wbGF0bGliJywgJ2luc3RhbGwtcHVyZWxpYicsICdpbnN0YWxsLWhlYWRlcnMnLAogICAgICAgICAgICAgICAgJ2luc3RhbGwtc2NyaXB0cycsICdpbnN0YWxsLWRhdGEnLCAncHJlZml4JywgJ2V4ZWMtcHJlZml4JywKICAgICAgICAgICAgICAgICdob21lJywgJ3VzZXInLCAncm9vdCddCiAgICAgICAgZWxzZToKICAgICAgICAgICAgaWdub3JlX29wdGlvbnMgPSBbXQoKICAgICAgICBpZ25vcmVfb3B0aW9ucyA9IGZyb3plbnNldChpZ25vcmVfb3B0aW9ucykKCiAgICAgICAgaWYgZmlsZW5hbWVzIGlzIE5vbmU6CiAgICAgICAgICAgIGZpbGVuYW1lcyA9IHNlbGYuZmluZF9jb25maWdfZmlsZXMoKQoKICAgICAgICBpZiBERUJVRzoKICAgICAgICAgICAgc2VsZi5hbm5vdW5jZSgiRGlzdHJpYnV0aW9uLnBhcnNlX2NvbmZpZ19maWxlcygpOiIpCgogICAgICAgIHBhcnNlciA9IENvbmZpZ1BhcnNlcihpbnRlcnBvbGF0aW9uPU5vbmUpCiAgICAgICAgZm9yIGZpbGVuYW1lIGluIGZpbGVuYW1lczoKICAgICAgICAgICAgaWYgREVCVUc6CiAgICAgICAgICAgICAgICBzZWxmLmFubm91bmNlKCIgIHJlYWRpbmcgJXMiICUgZmlsZW5hbWUpCiAgICAgICAgICAgIHBhcnNlci5yZWFkKGZpbGVuYW1lKQogICAgICAgICAgICBmb3Igc2VjdGlvbiBpbiBwYXJzZXIuc2VjdGlvbnMoKToKICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBwYXJzZXIub3B0aW9ucyhzZWN0aW9uKQogICAgICAgICAgICAgICAgb3B0X2RpY3QgPSBzZWxmLmdldF9vcHRpb25fZGljdChzZWN0aW9uKQoKICAgICAgICAgICAgICAgIGZvciBvcHQgaW4gb3B0aW9uczoKICAgICAgICAgICAgICAgICAgICBpZiBvcHQgIT0gJ19fbmFtZV9fJyBhbmQgb3B0IG5vdCBpbiBpZ25vcmVfb3B0aW9uczoKICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gcGFyc2VyLmdldChzZWN0aW9uLG9wdCkKICAgICAgICAgICAgICAgICAgICAgICAgb3B0ID0gb3B0LnJlcGxhY2UoJy0nLCAnXycpCiAgICAgICAgICAgICAgICAgICAgICAgIG9wdF9kaWN0W29wdF0gPSAoZmlsZW5hbWUsIHZhbCkKCiAgICAgICAgICAgICMgTWFrZSB0aGUgQ29uZmlnUGFyc2VyIGZvcmdldCBldmVyeXRoaW5nIChzbyB3ZSByZXRhaW4KICAgICAgICAgICAgIyB0aGUgb3JpZ2luYWwgZmlsZW5hbWVzIHRoYXQgb3B0aW9ucyBjb21lIGZyb20pCiAgICAgICAgICAgIHBhcnNlci5fX2luaXRfXygpCgogICAgICAgICMgSWYgdGhlcmUgd2FzIGEgImdsb2JhbCIgc2VjdGlvbiBpbiB0aGUgY29uZmlnIGZpbGUsIHVzZSBpdAogICAgICAgICMgdG8gc2V0IERpc3RyaWJ1dGlvbiBvcHRpb25zLgoKICAgICAgICBpZiAnZ2xvYmFsJyBpbiBzZWxmLmNvbW1hbmRfb3B0aW9uczoKICAgICAgICAgICAgZm9yIChvcHQsIChzcmMsIHZhbCkpIGluIHNlbGYuY29tbWFuZF9vcHRpb25zWydnbG9iYWwnXS5pdGVtcygpOgogICAgICAgICAgICAgICAgYWxpYXMgPSBzZWxmLm5lZ2F0aXZlX29wdC5nZXQob3B0KQogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGlmIGFsaWFzOgogICAgICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGFsaWFzLCBub3Qgc3RydG9ib29sKHZhbCkpCiAgICAgICAgICAgICAgICAgICAgZWxpZiBvcHQgaW4gKCd2ZXJib3NlJywgJ2RyeV9ydW4nKTogIyB1Z2ghCiAgICAgICAgICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgb3B0LCBzdHJ0b2Jvb2wodmFsKSkKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIG9wdCwgdmFsKQogICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IgYXMgbXNnOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKG1zZykKCgppZiBzeXMudmVyc2lvbl9pbmZvIDwgKDMsKToKICAgICMgUHl0aG9uIDIgYmVoYXZpb3IgaXMgc3VmZmljaWVudAogICAgY2xhc3MgRGlzdHJpYnV0aW9uX3BhcnNlX2NvbmZpZ19maWxlczoKICAgICAgICBwYXNzCgoKaWYgRmFsc2U6CiAgICAjIFdoZW4gdXBkYXRlZCBiZWhhdmlvciBpcyBhdmFpbGFibGUgdXBzdHJlYW0sCiAgICAjIGRpc2FibGUgb3ZlcnJpZGUgaGVyZS4KICAgIGNsYXNzIERpc3RyaWJ1dGlvbl9wYXJzZV9jb25maWdfZmlsZXM6CiAgICAgICAgcGFzcwpQSwMEFAAAAAAAAAAhAIxTmmPENwAAxDcAAC0AAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL3NhbmRib3gucHlpbXBvcnQgb3MKaW1wb3J0IHN5cwppbXBvcnQgdGVtcGZpbGUKaW1wb3J0IG9wZXJhdG9yCmltcG9ydCBmdW5jdG9vbHMKaW1wb3J0IGl0ZXJ0b29scwppbXBvcnQgcmUKaW1wb3J0IGNvbnRleHRsaWIKaW1wb3J0IHBpY2tsZQppbXBvcnQgdGV4dHdyYXAKCmZyb20gc2V0dXB0b29scy5leHRlcm4gaW1wb3J0IHNpeApmcm9tIHNldHVwdG9vbHMuZXh0ZXJuLnNpeC5tb3ZlcyBpbXBvcnQgYnVpbHRpbnMsIG1hcAoKaW1wb3J0IHBrZ19yZXNvdXJjZXMucHkzMWNvbXBhdAoKaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2phdmEnKToKICAgIGltcG9ydCBvcmcucHl0aG9uLm1vZHVsZXMucG9zaXguUG9zaXhNb2R1bGUgYXMgX29zCmVsc2U6CiAgICBfb3MgPSBzeXMubW9kdWxlc1tvcy5uYW1lXQp0cnk6CiAgICBfZmlsZSA9IGZpbGUKZXhjZXB0IE5hbWVFcnJvcjoKICAgIF9maWxlID0gTm9uZQpfb3BlbiA9IG9wZW4KZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNFcnJvcgpmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IHdvcmtpbmdfc2V0CgoKX19hbGxfXyA9IFsKICAgICJBYnN0cmFjdFNhbmRib3giLCAiRGlyZWN0b3J5U2FuZGJveCIsICJTYW5kYm94VmlvbGF0aW9uIiwgInJ1bl9zZXR1cCIsCl0KCgpkZWYgX2V4ZWNmaWxlKGZpbGVuYW1lLCBnbG9iYWxzLCBsb2NhbHM9Tm9uZSk6CiAgICAiIiIKICAgIFB5dGhvbiAzIGltcGxlbWVudGF0aW9uIG9mIGV4ZWNmaWxlLgogICAgIiIiCiAgICBtb2RlID0gJ3JiJwogICAgd2l0aCBvcGVuKGZpbGVuYW1lLCBtb2RlKSBhcyBzdHJlYW06CiAgICAgICAgc2NyaXB0ID0gc3RyZWFtLnJlYWQoKQogICAgaWYgbG9jYWxzIGlzIE5vbmU6CiAgICAgICAgbG9jYWxzID0gZ2xvYmFscwogICAgY29kZSA9IGNvbXBpbGUoc2NyaXB0LCBmaWxlbmFtZSwgJ2V4ZWMnKQogICAgZXhlYyhjb2RlLCBnbG9iYWxzLCBsb2NhbHMpCgoKQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKZGVmIHNhdmVfYXJndihyZXBsPU5vbmUpOgogICAgc2F2ZWQgPSBzeXMuYXJndls6XQogICAgaWYgcmVwbCBpcyBub3QgTm9uZToKICAgICAgICBzeXMuYXJndls6XSA9IHJlcGwKICAgIHRyeToKICAgICAgICB5aWVsZCBzYXZlZAogICAgZmluYWxseToKICAgICAgICBzeXMuYXJndls6XSA9IHNhdmVkCgoKQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKZGVmIHNhdmVfcGF0aCgpOgogICAgc2F2ZWQgPSBzeXMucGF0aFs6XQogICAgdHJ5OgogICAgICAgIHlpZWxkIHNhdmVkCiAgICBmaW5hbGx5OgogICAgICAgIHN5cy5wYXRoWzpdID0gc2F2ZWQKCgpAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgpkZWYgb3ZlcnJpZGVfdGVtcChyZXBsYWNlbWVudCk6CiAgICAiIiIKICAgIE1vbmtleS1wYXRjaCB0ZW1wZmlsZS50ZW1wZGlyIHdpdGggcmVwbGFjZW1lbnQsIGVuc3VyaW5nIGl0IGV4aXN0cwogICAgIiIiCiAgICBwa2dfcmVzb3VyY2VzLnB5MzFjb21wYXQubWFrZWRpcnMocmVwbGFjZW1lbnQsIGV4aXN0X29rPVRydWUpCgogICAgc2F2ZWQgPSB0ZW1wZmlsZS50ZW1wZGlyCgogICAgdGVtcGZpbGUudGVtcGRpciA9IHJlcGxhY2VtZW50CgogICAgdHJ5OgogICAgICAgIHlpZWxkCiAgICBmaW5hbGx5OgogICAgICAgIHRlbXBmaWxlLnRlbXBkaXIgPSBzYXZlZAoKCkBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCmRlZiBwdXNoZCh0YXJnZXQpOgogICAgc2F2ZWQgPSBvcy5nZXRjd2QoKQogICAgb3MuY2hkaXIodGFyZ2V0KQogICAgdHJ5OgogICAgICAgIHlpZWxkIHNhdmVkCiAgICBmaW5hbGx5OgogICAgICAgIG9zLmNoZGlyKHNhdmVkKQoKCmNsYXNzIFVucGlja2xlYWJsZUV4Y2VwdGlvbihFeGNlcHRpb24pOgogICAgIiIiCiAgICBBbiBleGNlcHRpb24gcmVwcmVzZW50aW5nIGFub3RoZXIgRXhjZXB0aW9uIHRoYXQgY291bGQgbm90IGJlIHBpY2tsZWQuCiAgICAiIiIKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgZHVtcCh0eXBlLCBleGMpOgogICAgICAgICIiIgogICAgICAgIEFsd2F5cyByZXR1cm4gYSBkdW1wZWQgKHBpY2tsZWQpIHR5cGUgYW5kIGV4Yy4gSWYgZXhjIGNhbid0IGJlIHBpY2tsZWQsCiAgICAgICAgd3JhcCBpdCBpbiBVbnBpY2tsZWFibGVFeGNlcHRpb24gZmlyc3QuCiAgICAgICAgIiIiCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gcGlja2xlLmR1bXBzKHR5cGUpLCBwaWNrbGUuZHVtcHMoZXhjKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgICMgZ2V0IFVucGlja2xlYWJsZUV4Y2VwdGlvbiBpbnNpZGUgdGhlIHNhbmRib3gKICAgICAgICAgICAgZnJvbSBzZXR1cHRvb2xzLnNhbmRib3ggaW1wb3J0IFVucGlja2xlYWJsZUV4Y2VwdGlvbiBhcyBjbHMKICAgICAgICAgICAgcmV0dXJuIGNscy5kdW1wKGNscywgY2xzKHJlcHIoZXhjKSkpCgoKY2xhc3MgRXhjZXB0aW9uU2F2ZXI6CiAgICAiIiIKICAgIEEgQ29udGV4dCBNYW5hZ2VyIHRoYXQgd2lsbCBzYXZlIGFuIGV4Y2VwdGlvbiwgc2VyaWFsaXplZCwgYW5kIHJlc3RvcmUgaXQKICAgIGxhdGVyLgogICAgIiIiCgogICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBfX2V4aXRfXyhzZWxmLCB0eXBlLCBleGMsIHRiKToKICAgICAgICBpZiBub3QgZXhjOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyBkdW1wIHRoZSBleGNlcHRpb24KICAgICAgICBzZWxmLl9zYXZlZCA9IFVucGlja2xlYWJsZUV4Y2VwdGlvbi5kdW1wKHR5cGUsIGV4YykKICAgICAgICBzZWxmLl90YiA9IHRiCgogICAgICAgICMgc3VwcHJlc3MgdGhlIGV4Y2VwdGlvbgogICAgICAgIHJldHVybiBUcnVlCgogICAgZGVmIHJlc3VtZShzZWxmKToKICAgICAgICAicmVzdG9yZSBhbmQgcmUtcmFpc2UgYW55IGV4Y2VwdGlvbiIKCiAgICAgICAgaWYgJ19zYXZlZCcgbm90IGluIHZhcnMoc2VsZik6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICB0eXBlLCBleGMgPSBtYXAocGlja2xlLmxvYWRzLCBzZWxmLl9zYXZlZCkKICAgICAgICBzaXgucmVyYWlzZSh0eXBlLCBleGMsIHNlbGYuX3RiKQoKCkBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCmRlZiBzYXZlX21vZHVsZXMoKToKICAgICIiIgogICAgQ29udGV4dCBpbiB3aGljaCBpbXBvcnRlZCBtb2R1bGVzIGFyZSBzYXZlZC4KCiAgICBUcmFuc2xhdGVzIGV4Y2VwdGlvbnMgaW50ZXJuYWwgdG8gdGhlIGNvbnRleHQgaW50byB0aGUgZXF1aXZhbGVudCBleGNlcHRpb24KICAgIG91dHNpZGUgdGhlIGNvbnRleHQuCiAgICAiIiIKICAgIHNhdmVkID0gc3lzLm1vZHVsZXMuY29weSgpCiAgICB3aXRoIEV4Y2VwdGlvblNhdmVyKCkgYXMgc2F2ZWRfZXhjOgogICAgICAgIHlpZWxkIHNhdmVkCgogICAgc3lzLm1vZHVsZXMudXBkYXRlKHNhdmVkKQogICAgIyByZW1vdmUgYW55IG1vZHVsZXMgaW1wb3J0ZWQgc2luY2UKICAgIGRlbF9tb2R1bGVzID0gKAogICAgICAgIG1vZF9uYW1lIGZvciBtb2RfbmFtZSBpbiBzeXMubW9kdWxlcwogICAgICAgIGlmIG1vZF9uYW1lIG5vdCBpbiBzYXZlZAogICAgICAgICMgZXhjbHVkZSBhbnkgZW5jb2RpbmdzIG1vZHVsZXMuIFNlZSAjMjg1CiAgICAgICAgYW5kIG5vdCBtb2RfbmFtZS5zdGFydHN3aXRoKCdlbmNvZGluZ3MuJykKICAgICkKICAgIF9jbGVhcl9tb2R1bGVzKGRlbF9tb2R1bGVzKQoKICAgIHNhdmVkX2V4Yy5yZXN1bWUoKQoKCmRlZiBfY2xlYXJfbW9kdWxlcyhtb2R1bGVfbmFtZXMpOgogICAgZm9yIG1vZF9uYW1lIGluIGxpc3QobW9kdWxlX25hbWVzKToKICAgICAgICBkZWwgc3lzLm1vZHVsZXNbbW9kX25hbWVdCgoKQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKZGVmIHNhdmVfcGtnX3Jlc291cmNlc19zdGF0ZSgpOgogICAgc2F2ZWQgPSBwa2dfcmVzb3VyY2VzLl9fZ2V0c3RhdGVfXygpCiAgICB0cnk6CiAgICAgICAgeWllbGQgc2F2ZWQKICAgIGZpbmFsbHk6CiAgICAgICAgcGtnX3Jlc291cmNlcy5fX3NldHN0YXRlX18oc2F2ZWQpCgoKQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKZGVmIHNldHVwX2NvbnRleHQoc2V0dXBfZGlyKToKICAgIHRlbXBfZGlyID0gb3MucGF0aC5qb2luKHNldHVwX2RpciwgJ3RlbXAnKQogICAgd2l0aCBzYXZlX3BrZ19yZXNvdXJjZXNfc3RhdGUoKToKICAgICAgICB3aXRoIHNhdmVfbW9kdWxlcygpOgogICAgICAgICAgICBoaWRlX3NldHVwdG9vbHMoKQogICAgICAgICAgICB3aXRoIHNhdmVfcGF0aCgpOgogICAgICAgICAgICAgICAgd2l0aCBzYXZlX2FyZ3YoKToKICAgICAgICAgICAgICAgICAgICB3aXRoIG92ZXJyaWRlX3RlbXAodGVtcF9kaXIpOgogICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHB1c2hkKHNldHVwX2Rpcik6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGVuc3VyZSBzZXR1cHRvb2xzIGNvbW1hbmRzIGFyZSBhdmFpbGFibGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faW1wb3J0X18oJ3NldHVwdG9vbHMnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQKCgpkZWYgX25lZWRzX2hpZGluZyhtb2RfbmFtZSk6CiAgICAiIiIKICAgID4+PiBfbmVlZHNfaGlkaW5nKCdzZXR1cHRvb2xzJykKICAgIFRydWUKICAgID4+PiBfbmVlZHNfaGlkaW5nKCdwa2dfcmVzb3VyY2VzJykKICAgIFRydWUKICAgID4+PiBfbmVlZHNfaGlkaW5nKCdzZXR1cHRvb2xzX3BsdWdpbicpCiAgICBGYWxzZQogICAgPj4+IF9uZWVkc19oaWRpbmcoJ3NldHVwdG9vbHMuX19pbml0X18nKQogICAgVHJ1ZQogICAgPj4+IF9uZWVkc19oaWRpbmcoJ2Rpc3R1dGlscycpCiAgICBUcnVlCiAgICA+Pj4gX25lZWRzX2hpZGluZygnb3MnKQogICAgRmFsc2UKICAgID4+PiBfbmVlZHNfaGlkaW5nKCdDeXRob24nKQogICAgVHJ1ZQogICAgIiIiCiAgICBwYXR0ZXJuID0gcmUuY29tcGlsZShyJyhzZXR1cHRvb2xzfHBrZ19yZXNvdXJjZXN8ZGlzdHV0aWxzfEN5dGhvbikoXC58JCknKQogICAgcmV0dXJuIGJvb2wocGF0dGVybi5tYXRjaChtb2RfbmFtZSkpCgoKZGVmIGhpZGVfc2V0dXB0b29scygpOgogICAgIiIiCiAgICBSZW1vdmUgcmVmZXJlbmNlcyB0byBzZXR1cHRvb2xzJyBtb2R1bGVzIGZyb20gc3lzLm1vZHVsZXMgdG8gYWxsb3cgdGhlCiAgICBpbnZvY2F0aW9uIHRvIGltcG9ydCB0aGUgbW9zdCBhcHByb3ByaWF0ZSBzZXR1cHRvb2xzLiBUaGlzIHRlY2huaXF1ZSBpcwogICAgbmVjZXNzYXJ5IHRvIGF2b2lkIGlzc3VlcyBzdWNoIGFzICMzMTUgd2hlcmUgc2V0dXB0b29scyB1cGdyYWRpbmcgaXRzZWxmCiAgICB3b3VsZCBmYWlsIHRvIGZpbmQgYSBmdW5jdGlvbiBkZWNsYXJlZCBpbiB0aGUgbWV0YWRhdGEuCiAgICAiIiIKICAgIG1vZHVsZXMgPSBmaWx0ZXIoX25lZWRzX2hpZGluZywgc3lzLm1vZHVsZXMpCiAgICBfY2xlYXJfbW9kdWxlcyhtb2R1bGVzKQoKCmRlZiBydW5fc2V0dXAoc2V0dXBfc2NyaXB0LCBhcmdzKToKICAgICIiIlJ1biBhIGRpc3R1dGlscyBzZXR1cCBzY3JpcHQsIHNhbmRib3hlZCBpbiBpdHMgZGlyZWN0b3J5IiIiCiAgICBzZXR1cF9kaXIgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5kaXJuYW1lKHNldHVwX3NjcmlwdCkpCiAgICB3aXRoIHNldHVwX2NvbnRleHQoc2V0dXBfZGlyKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHN5cy5hcmd2WzpdID0gW3NldHVwX3NjcmlwdF0gKyBsaXN0KGFyZ3MpCiAgICAgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBzZXR1cF9kaXIpCiAgICAgICAgICAgICMgcmVzZXQgdG8gaW5jbHVkZSBzZXR1cCBkaXIsIHcvY2xlYW4gY2FsbGJhY2sgbGlzdAogICAgICAgICAgICB3b3JraW5nX3NldC5fX2luaXRfXygpCiAgICAgICAgICAgIHdvcmtpbmdfc2V0LmNhbGxiYWNrcy5hcHBlbmQobGFtYmRhIGRpc3Q6IGRpc3QuYWN0aXZhdGUoKSkKCiAgICAgICAgICAgICMgX19maWxlX18gc2hvdWxkIGJlIGEgYnl0ZSBzdHJpbmcgb24gUHl0aG9uIDIgKCM3MTIpCiAgICAgICAgICAgIGR1bmRlcl9maWxlID0gKAogICAgICAgICAgICAgICAgc2V0dXBfc2NyaXB0CiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNldHVwX3NjcmlwdCwgc3RyKSBlbHNlCiAgICAgICAgICAgICAgICBzZXR1cF9zY3JpcHQuZW5jb2RlKHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKSkKICAgICAgICAgICAgKQoKICAgICAgICAgICAgd2l0aCBEaXJlY3RvcnlTYW5kYm94KHNldHVwX2Rpcik6CiAgICAgICAgICAgICAgICBucyA9IGRpY3QoX19maWxlX189ZHVuZGVyX2ZpbGUsIF9fbmFtZV9fPSdfX21haW5fXycpCiAgICAgICAgICAgICAgICBfZXhlY2ZpbGUoc2V0dXBfc2NyaXB0LCBucykKICAgICAgICBleGNlcHQgU3lzdGVtRXhpdCBhcyB2OgogICAgICAgICAgICBpZiB2LmFyZ3MgYW5kIHYuYXJnc1swXToKICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgICAgICMgTm9ybWFsIGV4aXQsIGp1c3QgcmV0dXJuCgoKY2xhc3MgQWJzdHJhY3RTYW5kYm94OgogICAgIiIiV3JhcCAnb3MnIG1vZHVsZSBhbmQgJ29wZW4oKScgYnVpbHRpbiBmb3IgdmlydHVhbGl6aW5nIHNldHVwIHNjcmlwdHMiIiIKCiAgICBfYWN0aXZlID0gRmFsc2UKCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc2VsZi5fYXR0cnMgPSBbCiAgICAgICAgICAgIG5hbWUgZm9yIG5hbWUgaW4gZGlyKF9vcykKICAgICAgICAgICAgaWYgbm90IG5hbWUuc3RhcnRzd2l0aCgnXycpIGFuZCBoYXNhdHRyKHNlbGYsIG5hbWUpCiAgICAgICAgXQoKICAgIGRlZiBfY29weShzZWxmLCBzb3VyY2UpOgogICAgICAgIGZvciBuYW1lIGluIHNlbGYuX2F0dHJzOgogICAgICAgICAgICBzZXRhdHRyKG9zLCBuYW1lLCBnZXRhdHRyKHNvdXJjZSwgbmFtZSkpCgogICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKICAgICAgICBzZWxmLl9jb3B5KHNlbGYpCiAgICAgICAgaWYgX2ZpbGU6CiAgICAgICAgICAgIGJ1aWx0aW5zLmZpbGUgPSBzZWxmLl9maWxlCiAgICAgICAgYnVpbHRpbnMub3BlbiA9IHNlbGYuX29wZW4KICAgICAgICBzZWxmLl9hY3RpdmUgPSBUcnVlCgogICAgZGVmIF9fZXhpdF9fKHNlbGYsIGV4Y190eXBlLCBleGNfdmFsdWUsIHRyYWNlYmFjayk6CiAgICAgICAgc2VsZi5fYWN0aXZlID0gRmFsc2UKICAgICAgICBpZiBfZmlsZToKICAgICAgICAgICAgYnVpbHRpbnMuZmlsZSA9IF9maWxlCiAgICAgICAgYnVpbHRpbnMub3BlbiA9IF9vcGVuCiAgICAgICAgc2VsZi5fY29weShfb3MpCgogICAgZGVmIHJ1bihzZWxmLCBmdW5jKToKICAgICAgICAiIiJSdW4gJ2Z1bmMnIHVuZGVyIG9zIHNhbmRib3hpbmciIiIKICAgICAgICB3aXRoIHNlbGY6CiAgICAgICAgICAgIHJldHVybiBmdW5jKCkKCiAgICBkZWYgX21rX2R1YWxfcGF0aF93cmFwcGVyKG5hbWUpOgogICAgICAgIG9yaWdpbmFsID0gZ2V0YXR0cihfb3MsIG5hbWUpCgogICAgICAgIGRlZiB3cmFwKHNlbGYsIHNyYywgZHN0LCAqYXJncywgKiprdyk6CiAgICAgICAgICAgIGlmIHNlbGYuX2FjdGl2ZToKICAgICAgICAgICAgICAgIHNyYywgZHN0ID0gc2VsZi5fcmVtYXBfcGFpcihuYW1lLCBzcmMsIGRzdCwgKmFyZ3MsICoqa3cpCiAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbChzcmMsIGRzdCwgKmFyZ3MsICoqa3cpCgogICAgICAgIHJldHVybiB3cmFwCgogICAgZm9yIG5hbWUgaW4gWyJyZW5hbWUiLCAibGluayIsICJzeW1saW5rIl06CiAgICAgICAgaWYgaGFzYXR0cihfb3MsIG5hbWUpOgogICAgICAgICAgICBsb2NhbHMoKVtuYW1lXSA9IF9ta19kdWFsX3BhdGhfd3JhcHBlcihuYW1lKQoKICAgIGRlZiBfbWtfc2luZ2xlX3BhdGhfd3JhcHBlcihuYW1lLCBvcmlnaW5hbD1Ob25lKToKICAgICAgICBvcmlnaW5hbCA9IG9yaWdpbmFsIG9yIGdldGF0dHIoX29zLCBuYW1lKQoKICAgICAgICBkZWYgd3JhcChzZWxmLCBwYXRoLCAqYXJncywgKiprdyk6CiAgICAgICAgICAgIGlmIHNlbGYuX2FjdGl2ZToKICAgICAgICAgICAgICAgIHBhdGggPSBzZWxmLl9yZW1hcF9pbnB1dChuYW1lLCBwYXRoLCAqYXJncywgKiprdykKICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsKHBhdGgsICphcmdzLCAqKmt3KQoKICAgICAgICByZXR1cm4gd3JhcAoKICAgIGlmIF9maWxlOgogICAgICAgIF9maWxlID0gX21rX3NpbmdsZV9wYXRoX3dyYXBwZXIoJ2ZpbGUnLCBfZmlsZSkKICAgIF9vcGVuID0gX21rX3NpbmdsZV9wYXRoX3dyYXBwZXIoJ29wZW4nLCBfb3BlbikKICAgIGZvciBuYW1lIGluIFsKICAgICAgICAic3RhdCIsICJsaXN0ZGlyIiwgImNoZGlyIiwgIm9wZW4iLCAiY2htb2QiLCAiY2hvd24iLCAibWtkaXIiLAogICAgICAgICJyZW1vdmUiLCAidW5saW5rIiwgInJtZGlyIiwgInV0aW1lIiwgImxjaG93biIsICJjaHJvb3QiLCAibHN0YXQiLAogICAgICAgICJzdGFydGZpbGUiLCAibWtmaWZvIiwgIm1rbm9kIiwgInBhdGhjb25mIiwgImFjY2VzcyIKICAgIF06CiAgICAgICAgaWYgaGFzYXR0cihfb3MsIG5hbWUpOgogICAgICAgICAgICBsb2NhbHMoKVtuYW1lXSA9IF9ta19zaW5nbGVfcGF0aF93cmFwcGVyKG5hbWUpCgogICAgZGVmIF9ta19zaW5nbGVfd2l0aF9yZXR1cm4obmFtZSk6CiAgICAgICAgb3JpZ2luYWwgPSBnZXRhdHRyKF9vcywgbmFtZSkKCiAgICAgICAgZGVmIHdyYXAoc2VsZiwgcGF0aCwgKmFyZ3MsICoqa3cpOgogICAgICAgICAgICBpZiBzZWxmLl9hY3RpdmU6CiAgICAgICAgICAgICAgICBwYXRoID0gc2VsZi5fcmVtYXBfaW5wdXQobmFtZSwgcGF0aCwgKmFyZ3MsICoqa3cpCiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fcmVtYXBfb3V0cHV0KG5hbWUsIG9yaWdpbmFsKHBhdGgsICphcmdzLCAqKmt3KSkKICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsKHBhdGgsICphcmdzLCAqKmt3KQoKICAgICAgICByZXR1cm4gd3JhcAoKICAgIGZvciBuYW1lIGluIFsncmVhZGxpbmsnLCAndGVtcG5hbSddOgogICAgICAgIGlmIGhhc2F0dHIoX29zLCBuYW1lKToKICAgICAgICAgICAgbG9jYWxzKClbbmFtZV0gPSBfbWtfc2luZ2xlX3dpdGhfcmV0dXJuKG5hbWUpCgogICAgZGVmIF9ta19xdWVyeShuYW1lKToKICAgICAgICBvcmlnaW5hbCA9IGdldGF0dHIoX29zLCBuYW1lKQoKICAgICAgICBkZWYgd3JhcChzZWxmLCAqYXJncywgKiprdyk6CiAgICAgICAgICAgIHJldHZhbCA9IG9yaWdpbmFsKCphcmdzLCAqKmt3KQogICAgICAgICAgICBpZiBzZWxmLl9hY3RpdmU6CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fcmVtYXBfb3V0cHV0KG5hbWUsIHJldHZhbCkKICAgICAgICAgICAgcmV0dXJuIHJldHZhbAoKICAgICAgICByZXR1cm4gd3JhcAoKICAgIGZvciBuYW1lIGluIFsnZ2V0Y3dkJywgJ3RtcG5hbSddOgogICAgICAgIGlmIGhhc2F0dHIoX29zLCBuYW1lKToKICAgICAgICAgICAgbG9jYWxzKClbbmFtZV0gPSBfbWtfcXVlcnkobmFtZSkKCiAgICBkZWYgX3ZhbGlkYXRlX3BhdGgoc2VsZiwgcGF0aCk6CiAgICAgICAgIiIiQ2FsbGVkIHRvIHJlbWFwIG9yIHZhbGlkYXRlIGFueSBwYXRoLCB3aGV0aGVyIGlucHV0IG9yIG91dHB1dCIiIgogICAgICAgIHJldHVybiBwYXRoCgogICAgZGVmIF9yZW1hcF9pbnB1dChzZWxmLCBvcGVyYXRpb24sIHBhdGgsICphcmdzLCAqKmt3KToKICAgICAgICAiIiJDYWxsZWQgZm9yIHBhdGggaW5wdXRzIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuX3ZhbGlkYXRlX3BhdGgocGF0aCkKCiAgICBkZWYgX3JlbWFwX291dHB1dChzZWxmLCBvcGVyYXRpb24sIHBhdGgpOgogICAgICAgICIiIkNhbGxlZCBmb3IgcGF0aCBvdXRwdXRzIiIiCiAgICAgICAgcmV0dXJuIHNlbGYuX3ZhbGlkYXRlX3BhdGgocGF0aCkKCiAgICBkZWYgX3JlbWFwX3BhaXIoc2VsZiwgb3BlcmF0aW9uLCBzcmMsIGRzdCwgKmFyZ3MsICoqa3cpOgogICAgICAgICIiIkNhbGxlZCBmb3IgcGF0aCBwYWlycyBsaWtlIHJlbmFtZSwgbGluaywgYW5kIHN5bWxpbmsgb3BlcmF0aW9ucyIiIgogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgIHNlbGYuX3JlbWFwX2lucHV0KG9wZXJhdGlvbiArICctZnJvbScsIHNyYywgKmFyZ3MsICoqa3cpLAogICAgICAgICAgICBzZWxmLl9yZW1hcF9pbnB1dChvcGVyYXRpb24gKyAnLXRvJywgZHN0LCAqYXJncywgKiprdykKICAgICAgICApCgoKaWYgaGFzYXR0cihvcywgJ2Rldm51bGwnKToKICAgIF9FWENFUFRJT05TID0gW29zLmRldm51bGwsXQplbHNlOgogICAgX0VYQ0VQVElPTlMgPSBbXQoKCmNsYXNzIERpcmVjdG9yeVNhbmRib3goQWJzdHJhY3RTYW5kYm94KToKICAgICIiIlJlc3RyaWN0IG9wZXJhdGlvbnMgdG8gYSBzaW5nbGUgc3ViZGlyZWN0b3J5IC0gcHNldWRvLWNocm9vdCIiIgoKICAgIHdyaXRlX29wcyA9IGRpY3QuZnJvbWtleXMoWwogICAgICAgICJvcGVuIiwgImNobW9kIiwgImNob3duIiwgIm1rZGlyIiwgInJlbW92ZSIsICJ1bmxpbmsiLCAicm1kaXIiLAogICAgICAgICJ1dGltZSIsICJsY2hvd24iLCAiY2hyb290IiwgIm1rZmlmbyIsICJta25vZCIsICJ0ZW1wbmFtIiwKICAgIF0pCgogICAgX2V4Y2VwdGlvbl9wYXR0ZXJucyA9IFsKICAgICAgICAjIEFsbG93IGxpYjJ0bzMgdG8gYXR0ZW1wdCB0byBzYXZlIGEgcGlja2xlZCBncmFtbWFyIG9iamVjdCAoIzEyMSkKICAgICAgICByJy4qbGliMnRvMy4qXC5waWNrbGUkJywKICAgIF0KICAgICJleGVtcHQgd3JpdGluZyB0byBwYXRocyB0aGF0IG1hdGNoIHRoZSBwYXR0ZXJuIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzYW5kYm94LCBleGNlcHRpb25zPV9FWENFUFRJT05TKToKICAgICAgICBzZWxmLl9zYW5kYm94ID0gb3MucGF0aC5ub3JtY2FzZShvcy5wYXRoLnJlYWxwYXRoKHNhbmRib3gpKQogICAgICAgIHNlbGYuX3ByZWZpeCA9IG9zLnBhdGguam9pbihzZWxmLl9zYW5kYm94LCAnJykKICAgICAgICBzZWxmLl9leGNlcHRpb25zID0gWwogICAgICAgICAgICBvcy5wYXRoLm5vcm1jYXNlKG9zLnBhdGgucmVhbHBhdGgocGF0aCkpCiAgICAgICAgICAgIGZvciBwYXRoIGluIGV4Y2VwdGlvbnMKICAgICAgICBdCiAgICAgICAgQWJzdHJhY3RTYW5kYm94Ll9faW5pdF9fKHNlbGYpCgogICAgZGVmIF92aW9sYXRpb24oc2VsZiwgb3BlcmF0aW9uLCAqYXJncywgKiprdyk6CiAgICAgICAgZnJvbSBzZXR1cHRvb2xzLnNhbmRib3ggaW1wb3J0IFNhbmRib3hWaW9sYXRpb24KICAgICAgICByYWlzZSBTYW5kYm94VmlvbGF0aW9uKG9wZXJhdGlvbiwgYXJncywga3cpCgogICAgaWYgX2ZpbGU6CgogICAgICAgIGRlZiBfZmlsZShzZWxmLCBwYXRoLCBtb2RlPSdyJywgKmFyZ3MsICoqa3cpOgogICAgICAgICAgICBpZiBtb2RlIG5vdCBpbiAoJ3InLCAncnQnLCAncmInLCAnclUnLCAnVScpIGFuZCBub3Qgc2VsZi5fb2socGF0aCk6CiAgICAgICAgICAgICAgICBzZWxmLl92aW9sYXRpb24oImZpbGUiLCBwYXRoLCBtb2RlLCAqYXJncywgKiprdykKICAgICAgICAgICAgcmV0dXJuIF9maWxlKHBhdGgsIG1vZGUsICphcmdzLCAqKmt3KQoKICAgIGRlZiBfb3BlbihzZWxmLCBwYXRoLCBtb2RlPSdyJywgKmFyZ3MsICoqa3cpOgogICAgICAgIGlmIG1vZGUgbm90IGluICgncicsICdydCcsICdyYicsICdyVScsICdVJykgYW5kIG5vdCBzZWxmLl9vayhwYXRoKToKICAgICAgICAgICAgc2VsZi5fdmlvbGF0aW9uKCJvcGVuIiwgcGF0aCwgbW9kZSwgKmFyZ3MsICoqa3cpCiAgICAgICAgcmV0dXJuIF9vcGVuKHBhdGgsIG1vZGUsICphcmdzLCAqKmt3KQoKICAgIGRlZiB0bXBuYW0oc2VsZik6CiAgICAgICAgc2VsZi5fdmlvbGF0aW9uKCJ0bXBuYW0iKQoKICAgIGRlZiBfb2soc2VsZiwgcGF0aCk6CiAgICAgICAgYWN0aXZlID0gc2VsZi5fYWN0aXZlCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLl9hY3RpdmUgPSBGYWxzZQogICAgICAgICAgICByZWFscGF0aCA9IG9zLnBhdGgubm9ybWNhc2Uob3MucGF0aC5yZWFscGF0aChwYXRoKSkKICAgICAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgICAgIHNlbGYuX2V4ZW1wdGVkKHJlYWxwYXRoKQogICAgICAgICAgICAgICAgb3IgcmVhbHBhdGggPT0gc2VsZi5fc2FuZGJveAogICAgICAgICAgICAgICAgb3IgcmVhbHBhdGguc3RhcnRzd2l0aChzZWxmLl9wcmVmaXgpCiAgICAgICAgICAgICkKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBzZWxmLl9hY3RpdmUgPSBhY3RpdmUKCiAgICBkZWYgX2V4ZW1wdGVkKHNlbGYsIGZpbGVwYXRoKToKICAgICAgICBzdGFydF9tYXRjaGVzID0gKAogICAgICAgICAgICBmaWxlcGF0aC5zdGFydHN3aXRoKGV4Y2VwdGlvbikKICAgICAgICAgICAgZm9yIGV4Y2VwdGlvbiBpbiBzZWxmLl9leGNlcHRpb25zCiAgICAgICAgKQogICAgICAgIHBhdHRlcm5fbWF0Y2hlcyA9ICgKICAgICAgICAgICAgcmUubWF0Y2gocGF0dGVybiwgZmlsZXBhdGgpCiAgICAgICAgICAgIGZvciBwYXR0ZXJuIGluIHNlbGYuX2V4Y2VwdGlvbl9wYXR0ZXJucwogICAgICAgICkKICAgICAgICBjYW5kaWRhdGVzID0gaXRlcnRvb2xzLmNoYWluKHN0YXJ0X21hdGNoZXMsIHBhdHRlcm5fbWF0Y2hlcykKICAgICAgICByZXR1cm4gYW55KGNhbmRpZGF0ZXMpCgogICAgZGVmIF9yZW1hcF9pbnB1dChzZWxmLCBvcGVyYXRpb24sIHBhdGgsICphcmdzLCAqKmt3KToKICAgICAgICAiIiJDYWxsZWQgZm9yIHBhdGggaW5wdXRzIiIiCiAgICAgICAgaWYgb3BlcmF0aW9uIGluIHNlbGYud3JpdGVfb3BzIGFuZCBub3Qgc2VsZi5fb2socGF0aCk6CiAgICAgICAgICAgIHNlbGYuX3Zpb2xhdGlvbihvcGVyYXRpb24sIG9zLnBhdGgucmVhbHBhdGgocGF0aCksICphcmdzLCAqKmt3KQogICAgICAgIHJldHVybiBwYXRoCgogICAgZGVmIF9yZW1hcF9wYWlyKHNlbGYsIG9wZXJhdGlvbiwgc3JjLCBkc3QsICphcmdzLCAqKmt3KToKICAgICAgICAiIiJDYWxsZWQgZm9yIHBhdGggcGFpcnMgbGlrZSByZW5hbWUsIGxpbmssIGFuZCBzeW1saW5rIG9wZXJhdGlvbnMiIiIKICAgICAgICBpZiBub3Qgc2VsZi5fb2soc3JjKSBvciBub3Qgc2VsZi5fb2soZHN0KToKICAgICAgICAgICAgc2VsZi5fdmlvbGF0aW9uKG9wZXJhdGlvbiwgc3JjLCBkc3QsICphcmdzLCAqKmt3KQogICAgICAgIHJldHVybiAoc3JjLCBkc3QpCgogICAgZGVmIG9wZW4oc2VsZiwgZmlsZSwgZmxhZ3MsIG1vZGU9MG83NzcsICphcmdzLCAqKmt3KToKICAgICAgICAiIiJDYWxsZWQgZm9yIGxvdy1sZXZlbCBvcy5vcGVuKCkiIiIKICAgICAgICBpZiBmbGFncyAmIFdSSVRFX0ZMQUdTIGFuZCBub3Qgc2VsZi5fb2soZmlsZSk6CiAgICAgICAgICAgIHNlbGYuX3Zpb2xhdGlvbigib3Mub3BlbiIsIGZpbGUsIGZsYWdzLCBtb2RlLCAqYXJncywgKiprdykKICAgICAgICByZXR1cm4gX29zLm9wZW4oZmlsZSwgZmxhZ3MsIG1vZGUsICphcmdzLCAqKmt3KQoKCldSSVRFX0ZMQUdTID0gZnVuY3Rvb2xzLnJlZHVjZSgKICAgIG9wZXJhdG9yLm9yXywgW2dldGF0dHIoX29zLCBhLCAwKSBmb3IgYSBpbgogICAgICAgICJPX1dST05MWSBPX1JEV1IgT19BUFBFTkQgT19DUkVBVCBPX1RSVU5DIE9fVEVNUE9SQVJZIi5zcGxpdCgpXQopCgoKY2xhc3MgU2FuZGJveFZpb2xhdGlvbihEaXN0dXRpbHNFcnJvcik6CiAgICAiIiJBIHNldHVwIHNjcmlwdCBhdHRlbXB0ZWQgdG8gbW9kaWZ5IHRoZSBmaWxlc3lzdGVtIG91dHNpZGUgdGhlIHNhbmRib3giIiIKCiAgICB0bXBsID0gdGV4dHdyYXAuZGVkZW50KCIiIgogICAgICAgIFNhbmRib3hWaW9sYXRpb246IHtjbWR9e2FyZ3Mhcn0ge2t3YXJnc30KCiAgICAgICAgVGhlIHBhY2thZ2Ugc2V0dXAgc2NyaXB0IGhhcyBhdHRlbXB0ZWQgdG8gbW9kaWZ5IGZpbGVzIG9uIHlvdXIgc3lzdGVtCiAgICAgICAgdGhhdCBhcmUgbm90IHdpdGhpbiB0aGUgRWFzeUluc3RhbGwgYnVpbGQgYXJlYSwgYW5kIGhhcyBiZWVuIGFib3J0ZWQuCgogICAgICAgIFRoaXMgcGFja2FnZSBjYW5ub3QgYmUgc2FmZWx5IGluc3RhbGxlZCBieSBFYXN5SW5zdGFsbCwgYW5kIG1heSBub3QKICAgICAgICBzdXBwb3J0IGFsdGVybmF0ZSBpbnN0YWxsYXRpb24gbG9jYXRpb25zIGV2ZW4gaWYgeW91IHJ1biBpdHMgc2V0dXAKICAgICAgICBzY3JpcHQgYnkgaGFuZC4gIFBsZWFzZSBpbmZvcm0gdGhlIHBhY2thZ2UncyBhdXRob3IgYW5kIHRoZSBFYXN5SW5zdGFsbAogICAgICAgIG1haW50YWluZXJzIHRvIGZpbmQgb3V0IGlmIGEgZml4IG9yIHdvcmthcm91bmQgaXMgYXZhaWxhYmxlLgogICAgICAgICIiIikubHN0cmlwKCkKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICBjbWQsIGFyZ3MsIGt3YXJncyA9IHNlbGYuYXJncwogICAgICAgIHJldHVybiBzZWxmLnRtcGwuZm9ybWF0KCoqbG9jYWxzKCkpClBLAwQUAAAAAAAAACEAqDO0vooAAACKAAAALgAAAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvc2NyaXB0LnRtcGwjIEVBU1ktSU5TVEFMTC1TQ1JJUFQ6ICUoc3BlYylyLCUoc2NyaXB0X25hbWUpcgpfX3JlcXVpcmVzX18gPSAlKHNwZWMpcgpfX2ltcG9ydF9fKCdwa2dfcmVzb3VyY2VzJykucnVuX3NjcmlwdCglKHNwZWMpciwgJShzY3JpcHRfbmFtZSlyKQpQSwMEFAAAAAAAAAAhAALBlOMDCQAAAwkAADAAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL3NpdGUtcGF0Y2gucHlkZWYgX19ib290KCk6CiAgICBpbXBvcnQgc3lzCiAgICBpbXBvcnQgb3MKICAgIFBZVEhPTlBBVEggPSBvcy5lbnZpcm9uLmdldCgnUFlUSE9OUEFUSCcpCiAgICBpZiBQWVRIT05QQVRIIGlzIE5vbmUgb3IgKHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInIGFuZCBub3QgUFlUSE9OUEFUSCk6CiAgICAgICAgUFlUSE9OUEFUSCA9IFtdCiAgICBlbHNlOgogICAgICAgIFBZVEhPTlBBVEggPSBQWVRIT05QQVRILnNwbGl0KG9zLnBhdGhzZXApCgogICAgcGljID0gZ2V0YXR0cihzeXMsICdwYXRoX2ltcG9ydGVyX2NhY2hlJywge30pCiAgICBzdGRwYXRoID0gc3lzLnBhdGhbbGVuKFBZVEhPTlBBVEgpOl0KICAgIG15ZGlyID0gb3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKQoKICAgIGZvciBpdGVtIGluIHN0ZHBhdGg6CiAgICAgICAgaWYgaXRlbSA9PSBteWRpciBvciBub3QgaXRlbToKICAgICAgICAgICAgY29udGludWUgICMgc2tpcCBpZiBjdXJyZW50IGRpci4gb24gV2luZG93cywgb3IgbXkgb3duIGRpcmVjdG9yeQogICAgICAgIGltcG9ydGVyID0gcGljLmdldChpdGVtKQogICAgICAgIGlmIGltcG9ydGVyIGlzIG5vdCBOb25lOgogICAgICAgICAgICBsb2FkZXIgPSBpbXBvcnRlci5maW5kX21vZHVsZSgnc2l0ZScpCiAgICAgICAgICAgIGlmIGxvYWRlciBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICMgVGhpcyBzaG91bGQgYWN0dWFsbHkgcmVsb2FkIHRoZSBjdXJyZW50IG1vZHVsZQogICAgICAgICAgICAgICAgbG9hZGVyLmxvYWRfbW9kdWxlKCdzaXRlJykKICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgZWxzZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaW1wb3J0IGltcCAgIyBBdm9pZCBpbXBvcnQgbG9vcCBpbiBQeXRob24gPj0gMy4zCiAgICAgICAgICAgICAgICBzdHJlYW0sIHBhdGgsIGRlc2NyID0gaW1wLmZpbmRfbW9kdWxlKCdzaXRlJywgW2l0ZW1dKQogICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBpZiBzdHJlYW0gaXMgTm9uZToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICMgVGhpcyBzaG91bGQgYWN0dWFsbHkgcmVsb2FkIHRoZSBjdXJyZW50IG1vZHVsZQogICAgICAgICAgICAgICAgaW1wLmxvYWRfbW9kdWxlKCdzaXRlJywgc3RyZWFtLCBwYXRoLCBkZXNjcikKICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpCiAgICAgICAgICAgIGJyZWFrCiAgICBlbHNlOgogICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCJDb3VsZG4ndCBmaW5kIHRoZSByZWFsICdzaXRlJyBtb2R1bGUiKQoKICAgIGtub3duX3BhdGhzID0gZGljdChbKG1ha2VwYXRoKGl0ZW0pWzFdLCAxKSBmb3IgaXRlbSBpbiBzeXMucGF0aF0pICAjIDIuMiBjb21wCgogICAgb2xkcG9zID0gZ2V0YXR0cihzeXMsICdfX2VnZ2luc2VydCcsIDApICAjIHNhdmUgb2xkIGluc2VydGlvbiBwb3NpdGlvbgogICAgc3lzLl9fZWdnaW5zZXJ0ID0gMCAgIyBhbmQgcmVzZXQgdGhlIGN1cnJlbnQgb25lCgogICAgZm9yIGl0ZW0gaW4gUFlUSE9OUEFUSDoKICAgICAgICBhZGRzaXRlZGlyKGl0ZW0pCgogICAgc3lzLl9fZWdnaW5zZXJ0ICs9IG9sZHBvcyAgIyByZXN0b3JlIGVmZmVjdGl2ZSBvbGQgcG9zaXRpb24KCiAgICBkLCBuZCA9IG1ha2VwYXRoKHN0ZHBhdGhbMF0pCiAgICBpbnNlcnRfYXQgPSBOb25lCiAgICBuZXdfcGF0aCA9IFtdCgogICAgZm9yIGl0ZW0gaW4gc3lzLnBhdGg6CiAgICAgICAgcCwgbnAgPSBtYWtlcGF0aChpdGVtKQoKICAgICAgICBpZiBucCA9PSBuZCBhbmQgaW5zZXJ0X2F0IGlzIE5vbmU6CiAgICAgICAgICAgICMgV2UndmUgaGl0IHRoZSBmaXJzdCAnc3lzdGVtJyBwYXRoIGVudHJ5LCBzbyBhZGRlZCBlbnRyaWVzIGdvIGhlcmUKICAgICAgICAgICAgaW5zZXJ0X2F0ID0gbGVuKG5ld19wYXRoKQoKICAgICAgICBpZiBucCBpbiBrbm93bl9wYXRocyBvciBpbnNlcnRfYXQgaXMgTm9uZToKICAgICAgICAgICAgbmV3X3BhdGguYXBwZW5kKGl0ZW0pCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBuZXcgcGF0aCBhZnRlciB0aGUgaW5zZXJ0IHBvaW50LCBiYWNrLWluc2VydCBpdAogICAgICAgICAgICBuZXdfcGF0aC5pbnNlcnQoaW5zZXJ0X2F0LCBpdGVtKQogICAgICAgICAgICBpbnNlcnRfYXQgKz0gMQoKICAgIHN5cy5wYXRoWzpdID0gbmV3X3BhdGgKCgppZiBfX25hbWVfXyA9PSAnc2l0ZSc6CiAgICBfX2Jvb3QoKQogICAgZGVsIF9fYm9vdApQSwMEFAAAAAAAAAAhAIibW04sIQAALCEAADEAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL3NzbF9zdXBwb3J0LnB5aW1wb3J0IG9zCmltcG9ydCBzb2NrZXQKaW1wb3J0IGF0ZXhpdAppbXBvcnQgcmUKaW1wb3J0IGZ1bmN0b29scwoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybi5zaXgubW92ZXMgaW1wb3J0IHVybGxpYiwgaHR0cF9jbGllbnQsIG1hcCwgZmlsdGVyCgpmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IFJlc29sdXRpb25FcnJvciwgRXh0cmFjdGlvbkVycm9yCgp0cnk6CiAgICBpbXBvcnQgc3NsCmV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgIHNzbCA9IE5vbmUKCl9fYWxsX18gPSBbCiAgICAnVmVyaWZ5aW5nSFRUUFNIYW5kbGVyJywgJ2ZpbmRfY2FfYnVuZGxlJywgJ2lzX2F2YWlsYWJsZScsICdjZXJ0X3BhdGhzJywKICAgICdvcGVuZXJfZm9yJwpdCgpjZXJ0X3BhdGhzID0gIiIiCi9ldGMvcGtpL3Rscy9jZXJ0cy9jYS1idW5kbGUuY3J0Ci9ldGMvc3NsL2NlcnRzL2NhLWNlcnRpZmljYXRlcy5jcnQKL3Vzci9zaGFyZS9zc2wvY2VydHMvY2EtYnVuZGxlLmNydAovdXNyL2xvY2FsL3NoYXJlL2NlcnRzL2NhLXJvb3QuY3J0Ci9ldGMvc3NsL2NlcnQucGVtCi9TeXN0ZW0vTGlicmFyeS9PcGVuU1NML2NlcnRzL2NlcnQucGVtCi91c3IvbG9jYWwvc2hhcmUvY2VydHMvY2Etcm9vdC1uc3MuY3J0Ci9ldGMvc3NsL2NhLWJ1bmRsZS5wZW0KIiIiLnN0cmlwKCkuc3BsaXQoKQoKdHJ5OgogICAgSFRUUFNIYW5kbGVyID0gdXJsbGliLnJlcXVlc3QuSFRUUFNIYW5kbGVyCiAgICBIVFRQU0Nvbm5lY3Rpb24gPSBodHRwX2NsaWVudC5IVFRQU0Nvbm5lY3Rpb24KZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgSFRUUFNIYW5kbGVyID0gSFRUUFNDb25uZWN0aW9uID0gb2JqZWN0Cgppc19hdmFpbGFibGUgPSBzc2wgaXMgbm90IE5vbmUgYW5kIG9iamVjdCBub3QgaW4gKEhUVFBTSGFuZGxlciwgSFRUUFNDb25uZWN0aW9uKQoKCnRyeToKICAgIGZyb20gc3NsIGltcG9ydCBDZXJ0aWZpY2F0ZUVycm9yLCBtYXRjaF9ob3N0bmFtZQpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICB0cnk6CiAgICAgICAgZnJvbSBiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lIGltcG9ydCBDZXJ0aWZpY2F0ZUVycm9yCiAgICAgICAgZnJvbSBiYWNrcG9ydHMuc3NsX21hdGNoX2hvc3RuYW1lIGltcG9ydCBtYXRjaF9ob3N0bmFtZQogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIENlcnRpZmljYXRlRXJyb3IgPSBOb25lCiAgICAgICAgbWF0Y2hfaG9zdG5hbWUgPSBOb25lCgppZiBub3QgQ2VydGlmaWNhdGVFcnJvcjoKCiAgICBjbGFzcyBDZXJ0aWZpY2F0ZUVycm9yKFZhbHVlRXJyb3IpOgogICAgICAgIHBhc3MKCgppZiBub3QgbWF0Y2hfaG9zdG5hbWU6CgogICAgZGVmIF9kbnNuYW1lX21hdGNoKGRuLCBob3N0bmFtZSwgbWF4X3dpbGRjYXJkcz0xKToKICAgICAgICAiIiJNYXRjaGluZyBhY2NvcmRpbmcgdG8gUkZDIDYxMjUsIHNlY3Rpb24gNi40LjMKCiAgICAgICAgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjEyNSNzZWN0aW9uLTYuNC4zCiAgICAgICAgIiIiCiAgICAgICAgcGF0cyA9IFtdCiAgICAgICAgaWYgbm90IGRuOgogICAgICAgICAgICByZXR1cm4gRmFsc2UKCiAgICAgICAgIyBQb3J0ZWQgZnJvbSBweXRob24zLXN5bnRheDoKICAgICAgICAjIGxlZnRtb3N0LCAqcmVtYWluZGVyID0gZG4uc3BsaXQocicuJykKICAgICAgICBwYXJ0cyA9IGRuLnNwbGl0KHInLicpCiAgICAgICAgbGVmdG1vc3QgPSBwYXJ0c1swXQogICAgICAgIHJlbWFpbmRlciA9IHBhcnRzWzE6XQoKICAgICAgICB3aWxkY2FyZHMgPSBsZWZ0bW9zdC5jb3VudCgnKicpCiAgICAgICAgaWYgd2lsZGNhcmRzID4gbWF4X3dpbGRjYXJkczoKICAgICAgICAgICAgIyBJc3N1ZSAjMTc5ODA6IGF2b2lkIGRlbmlhbHMgb2Ygc2VydmljZSBieSByZWZ1c2luZyBtb3JlCiAgICAgICAgICAgICMgdGhhbiBvbmUgd2lsZGNhcmQgcGVyIGZyYWdtZW50LiAgQSBzdXJ2ZXkgb2YgZXN0YWJsaXNoZWQKICAgICAgICAgICAgIyBwb2xpY3kgYW1vbmcgU1NMIGltcGxlbWVudGF0aW9ucyBzaG93ZWQgaXQgdG8gYmUgYQogICAgICAgICAgICAjIHJlYXNvbmFibGUgY2hvaWNlLgogICAgICAgICAgICByYWlzZSBDZXJ0aWZpY2F0ZUVycm9yKAogICAgICAgICAgICAgICAgInRvbyBtYW55IHdpbGRjYXJkcyBpbiBjZXJ0aWZpY2F0ZSBETlMgbmFtZTogIiArIHJlcHIoZG4pKQoKICAgICAgICAjIHNwZWVkIHVwIGNvbW1vbiBjYXNlIHcvbyB3aWxkY2FyZHMKICAgICAgICBpZiBub3Qgd2lsZGNhcmRzOgogICAgICAgICAgICByZXR1cm4gZG4ubG93ZXIoKSA9PSBob3N0bmFtZS5sb3dlcigpCgogICAgICAgICMgUkZDIDYxMjUsIHNlY3Rpb24gNi40LjMsIHN1Yml0ZW0gMS4KICAgICAgICAjIFRoZSBjbGllbnQgU0hPVUxEIE5PVCBhdHRlbXB0IHRvIG1hdGNoIGEgcHJlc2VudGVkIGlkZW50aWZpZXIgaW4gd2hpY2gKICAgICAgICAjIHRoZSB3aWxkY2FyZCBjaGFyYWN0ZXIgY29tcHJpc2VzIGEgbGFiZWwgb3RoZXIgdGhhbiB0aGUgbGVmdC1tb3N0IGxhYmVsLgogICAgICAgIGlmIGxlZnRtb3N0ID09ICcqJzoKICAgICAgICAgICAgIyBXaGVuICcqJyBpcyBhIGZyYWdtZW50IGJ5IGl0c2VsZiwgaXQgbWF0Y2hlcyBhIG5vbi1lbXB0eSBkb3RsZXNzCiAgICAgICAgICAgICMgZnJhZ21lbnQuCiAgICAgICAgICAgIHBhdHMuYXBwZW5kKCdbXi5dKycpCiAgICAgICAgZWxpZiBsZWZ0bW9zdC5zdGFydHN3aXRoKCd4bi0tJykgb3IgaG9zdG5hbWUuc3RhcnRzd2l0aCgneG4tLScpOgogICAgICAgICAgICAjIFJGQyA2MTI1LCBzZWN0aW9uIDYuNC4zLCBzdWJpdGVtIDMuCiAgICAgICAgICAgICMgVGhlIGNsaWVudCBTSE9VTEQgTk9UIGF0dGVtcHQgdG8gbWF0Y2ggYSBwcmVzZW50ZWQgaWRlbnRpZmllcgogICAgICAgICAgICAjIHdoZXJlIHRoZSB3aWxkY2FyZCBjaGFyYWN0ZXIgaXMgZW1iZWRkZWQgd2l0aGluIGFuIEEtbGFiZWwgb3IKICAgICAgICAgICAgIyBVLWxhYmVsIG9mIGFuIGludGVybmF0aW9uYWxpemVkIGRvbWFpbiBuYW1lLgogICAgICAgICAgICBwYXRzLmFwcGVuZChyZS5lc2NhcGUobGVmdG1vc3QpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgICMgT3RoZXJ3aXNlLCAnKicgbWF0Y2hlcyBhbnkgZG90bGVzcyBzdHJpbmcsIGUuZy4gd3d3KgogICAgICAgICAgICBwYXRzLmFwcGVuZChyZS5lc2NhcGUobGVmdG1vc3QpLnJlcGxhY2UocidcKicsICdbXi5dKicpKQoKICAgICAgICAjIGFkZCB0aGUgcmVtYWluaW5nIGZyYWdtZW50cywgaWdub3JlIGFueSB3aWxkY2FyZHMKICAgICAgICBmb3IgZnJhZyBpbiByZW1haW5kZXI6CiAgICAgICAgICAgIHBhdHMuYXBwZW5kKHJlLmVzY2FwZShmcmFnKSkKCiAgICAgICAgcGF0ID0gcmUuY29tcGlsZShyJ1xBJyArIHInXC4nLmpvaW4ocGF0cykgKyByJ1xaJywgcmUuSUdOT1JFQ0FTRSkKICAgICAgICByZXR1cm4gcGF0Lm1hdGNoKGhvc3RuYW1lKQoKICAgIGRlZiBtYXRjaF9ob3N0bmFtZShjZXJ0LCBob3N0bmFtZSk6CiAgICAgICAgIiIiVmVyaWZ5IHRoYXQgKmNlcnQqIChpbiBkZWNvZGVkIGZvcm1hdCBhcyByZXR1cm5lZCBieQogICAgICAgIFNTTFNvY2tldC5nZXRwZWVyY2VydCgpKSBtYXRjaGVzIHRoZSAqaG9zdG5hbWUqLiAgUkZDIDI4MTggYW5kIFJGQyA2MTI1CiAgICAgICAgcnVsZXMgYXJlIGZvbGxvd2VkLCBidXQgSVAgYWRkcmVzc2VzIGFyZSBub3QgYWNjZXB0ZWQgZm9yICpob3N0bmFtZSouCgogICAgICAgIENlcnRpZmljYXRlRXJyb3IgaXMgcmFpc2VkIG9uIGZhaWx1cmUuIE9uIHN1Y2Nlc3MsIHRoZSBmdW5jdGlvbgogICAgICAgIHJldHVybnMgbm90aGluZy4KICAgICAgICAiIiIKICAgICAgICBpZiBub3QgY2VydDoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZW1wdHkgb3Igbm8gY2VydGlmaWNhdGUiKQogICAgICAgIGRuc25hbWVzID0gW10KICAgICAgICBzYW4gPSBjZXJ0LmdldCgnc3ViamVjdEFsdE5hbWUnLCAoKSkKICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzYW46CiAgICAgICAgICAgIGlmIGtleSA9PSAnRE5TJzoKICAgICAgICAgICAgICAgIGlmIF9kbnNuYW1lX21hdGNoKHZhbHVlLCBob3N0bmFtZSk6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICBkbnNuYW1lcy5hcHBlbmQodmFsdWUpCiAgICAgICAgaWYgbm90IGRuc25hbWVzOgogICAgICAgICAgICAjIFRoZSBzdWJqZWN0IGlzIG9ubHkgY2hlY2tlZCB3aGVuIHRoZXJlIGlzIG5vIGROU05hbWUgZW50cnkKICAgICAgICAgICAgIyBpbiBzdWJqZWN0QWx0TmFtZQogICAgICAgICAgICBmb3Igc3ViIGluIGNlcnQuZ2V0KCdzdWJqZWN0JywgKCkpOgogICAgICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gc3ViOgogICAgICAgICAgICAgICAgICAgICMgWFhYIGFjY29yZGluZyB0byBSRkMgMjgxOCwgdGhlIG1vc3Qgc3BlY2lmaWMgQ29tbW9uIE5hbWUKICAgICAgICAgICAgICAgICAgICAjIG11c3QgYmUgdXNlZC4KICAgICAgICAgICAgICAgICAgICBpZiBrZXkgPT0gJ2NvbW1vbk5hbWUnOgogICAgICAgICAgICAgICAgICAgICAgICBpZiBfZG5zbmFtZV9tYXRjaCh2YWx1ZSwgaG9zdG5hbWUpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgICAgICAgICAgIGRuc25hbWVzLmFwcGVuZCh2YWx1ZSkKICAgICAgICBpZiBsZW4oZG5zbmFtZXMpID4gMToKICAgICAgICAgICAgcmFpc2UgQ2VydGlmaWNhdGVFcnJvcigiaG9zdG5hbWUgJXIgIgogICAgICAgICAgICAgICAgImRvZXNuJ3QgbWF0Y2ggZWl0aGVyIG9mICVzIgogICAgICAgICAgICAgICAgJSAoaG9zdG5hbWUsICcsICcuam9pbihtYXAocmVwciwgZG5zbmFtZXMpKSkpCiAgICAgICAgZWxpZiBsZW4oZG5zbmFtZXMpID09IDE6CiAgICAgICAgICAgIHJhaXNlIENlcnRpZmljYXRlRXJyb3IoImhvc3RuYW1lICVyICIKICAgICAgICAgICAgICAgICJkb2Vzbid0IG1hdGNoICVyIgogICAgICAgICAgICAgICAgJSAoaG9zdG5hbWUsIGRuc25hbWVzWzBdKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBDZXJ0aWZpY2F0ZUVycm9yKCJubyBhcHByb3ByaWF0ZSBjb21tb25OYW1lIG9yICIKICAgICAgICAgICAgICAgICJzdWJqZWN0QWx0TmFtZSBmaWVsZHMgd2VyZSBmb3VuZCIpCgoKY2xhc3MgVmVyaWZ5aW5nSFRUUFNIYW5kbGVyKEhUVFBTSGFuZGxlcik6CiAgICAiIiJTaW1wbGUgdmVyaWZ5aW5nIGhhbmRsZXI6IG5vIGF1dGgsIHN1YmNsYXNzZXMsIHRpbWVvdXRzLCBldGMuIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGNhX2J1bmRsZSk6CiAgICAgICAgc2VsZi5jYV9idW5kbGUgPSBjYV9idW5kbGUKICAgICAgICBIVFRQU0hhbmRsZXIuX19pbml0X18oc2VsZikKCiAgICBkZWYgaHR0cHNfb3BlbihzZWxmLCByZXEpOgogICAgICAgIHJldHVybiBzZWxmLmRvX29wZW4oCiAgICAgICAgICAgIGxhbWJkYSBob3N0LCAqKmt3OiBWZXJpZnlpbmdIVFRQU0Nvbm4oaG9zdCwgc2VsZi5jYV9idW5kbGUsICoqa3cpLCByZXEKICAgICAgICApCgoKY2xhc3MgVmVyaWZ5aW5nSFRUUFNDb25uKEhUVFBTQ29ubmVjdGlvbik6CiAgICAiIiJTaW1wbGUgdmVyaWZ5aW5nIGNvbm5lY3Rpb246IG5vIGF1dGgsIHN1YmNsYXNzZXMsIHRpbWVvdXRzLCBldGMuIiIiCgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3QsIGNhX2J1bmRsZSwgKiprdyk6CiAgICAgICAgSFRUUFNDb25uZWN0aW9uLl9faW5pdF9fKHNlbGYsIGhvc3QsICoqa3cpCiAgICAgICAgc2VsZi5jYV9idW5kbGUgPSBjYV9idW5kbGUKCiAgICBkZWYgY29ubmVjdChzZWxmKToKICAgICAgICBzb2NrID0gc29ja2V0LmNyZWF0ZV9jb25uZWN0aW9uKAogICAgICAgICAgICAoc2VsZi5ob3N0LCBzZWxmLnBvcnQpLCBnZXRhdHRyKHNlbGYsICdzb3VyY2VfYWRkcmVzcycsIE5vbmUpCiAgICAgICAgKQoKICAgICAgICAjIEhhbmRsZSB0aGUgc29ja2V0IGlmIGEgKHByb3h5KSB0dW5uZWwgaXMgcHJlc2VudAogICAgICAgIGlmIGhhc2F0dHIoc2VsZiwgJ190dW5uZWwnKSBhbmQgZ2V0YXR0cihzZWxmLCAnX3R1bm5lbF9ob3N0JywgTm9uZSk6CiAgICAgICAgICAgIHNlbGYuc29jayA9IHNvY2sKICAgICAgICAgICAgc2VsZi5fdHVubmVsKCkKICAgICAgICAgICAgIyBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlNzc3NjogUHl0aG9uPj0zLjQuMSBhbmQgPj0yLjcuNwogICAgICAgICAgICAjIGNoYW5nZSBzZWxmLmhvc3QgdG8gbWVhbiB0aGUgcHJveHkgc2VydmVyIGhvc3Qgd2hlbiB0dW5uZWxpbmcgaXMKICAgICAgICAgICAgIyBiZWluZyB1c2VkLiBBZGFwdCwgc2luY2Ugd2UgYXJlIGludGVyZXN0ZWQgaW4gdGhlIGRlc3RpbmF0aW9uCiAgICAgICAgICAgICMgaG9zdCBmb3IgdGhlIG1hdGNoX2hvc3RuYW1lKCkgY29tcGFyaXNvbi4KICAgICAgICAgICAgYWN0dWFsX2hvc3QgPSBzZWxmLl90dW5uZWxfaG9zdAogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGFjdHVhbF9ob3N0ID0gc2VsZi5ob3N0CgogICAgICAgIGlmIGhhc2F0dHIoc3NsLCAnY3JlYXRlX2RlZmF1bHRfY29udGV4dCcpOgogICAgICAgICAgICBjdHggPSBzc2wuY3JlYXRlX2RlZmF1bHRfY29udGV4dChjYWZpbGU9c2VsZi5jYV9idW5kbGUpCiAgICAgICAgICAgIHNlbGYuc29jayA9IGN0eC53cmFwX3NvY2tldChzb2NrLCBzZXJ2ZXJfaG9zdG5hbWU9YWN0dWFsX2hvc3QpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgIyBUaGlzIGlzIGZvciBweXRob24gPCAyLjcuOSBhbmQgPCAzLjQ/CiAgICAgICAgICAgIHNlbGYuc29jayA9IHNzbC53cmFwX3NvY2tldCgKICAgICAgICAgICAgICAgIHNvY2ssIGNlcnRfcmVxcz1zc2wuQ0VSVF9SRVFVSVJFRCwgY2FfY2VydHM9c2VsZi5jYV9idW5kbGUKICAgICAgICAgICAgKQogICAgICAgIHRyeToKICAgICAgICAgICAgbWF0Y2hfaG9zdG5hbWUoc2VsZi5zb2NrLmdldHBlZXJjZXJ0KCksIGFjdHVhbF9ob3N0KQogICAgICAgIGV4Y2VwdCBDZXJ0aWZpY2F0ZUVycm9yOgogICAgICAgICAgICBzZWxmLnNvY2suc2h1dGRvd24oc29ja2V0LlNIVVRfUkRXUikKICAgICAgICAgICAgc2VsZi5zb2NrLmNsb3NlKCkKICAgICAgICAgICAgcmFpc2UKCgpkZWYgb3BlbmVyX2ZvcihjYV9idW5kbGU9Tm9uZSk6CiAgICAiIiJHZXQgYSB1cmxvcGVuKCkgcmVwbGFjZW1lbnQgdGhhdCB1c2VzIGNhX2J1bmRsZSBmb3IgdmVyaWZpY2F0aW9uIiIiCiAgICByZXR1cm4gdXJsbGliLnJlcXVlc3QuYnVpbGRfb3BlbmVyKAogICAgICAgIFZlcmlmeWluZ0hUVFBTSGFuZGxlcihjYV9idW5kbGUgb3IgZmluZF9jYV9idW5kbGUoKSkKICAgICkub3BlbgoKCiMgZnJvbSBqYXJhY28uZnVuY3Rvb2xzCmRlZiBvbmNlKGZ1bmMpOgogICAgQGZ1bmN0b29scy53cmFwcyhmdW5jKQogICAgZGVmIHdyYXBwZXIoKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICBpZiBub3QgaGFzYXR0cihmdW5jLCAnYWx3YXlzX3JldHVybnMnKToKICAgICAgICAgICAgZnVuYy5hbHdheXNfcmV0dXJucyA9IGZ1bmMoKmFyZ3MsICoqa3dhcmdzKQogICAgICAgIHJldHVybiBmdW5jLmFsd2F5c19yZXR1cm5zCiAgICByZXR1cm4gd3JhcHBlcgoKCkBvbmNlCmRlZiBnZXRfd2luX2NlcnRmaWxlKCk6CiAgICB0cnk6CiAgICAgICAgaW1wb3J0IHdpbmNlcnRzdG9yZQogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIHJldHVybiBOb25lCgogICAgY2xhc3MgQ2VydEZpbGUod2luY2VydHN0b3JlLkNlcnRGaWxlKToKICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgICAgIHN1cGVyKENlcnRGaWxlLCBzZWxmKS5fX2luaXRfXygpCiAgICAgICAgICAgIGF0ZXhpdC5yZWdpc3RlcihzZWxmLmNsb3NlKQoKICAgICAgICBkZWYgY2xvc2Uoc2VsZik6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHN1cGVyKENlcnRGaWxlLCBzZWxmKS5jbG9zZSgpCiAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgogICAgICAgICAgICAgICAgcGFzcwoKICAgIF93aW5jZXJ0cyA9IENlcnRGaWxlKCkKICAgIF93aW5jZXJ0cy5hZGRzdG9yZSgnQ0EnKQogICAgX3dpbmNlcnRzLmFkZHN0b3JlKCdST09UJykKICAgIHJldHVybiBfd2luY2VydHMubmFtZQoKCmRlZiBmaW5kX2NhX2J1bmRsZSgpOgogICAgIiIiUmV0dXJuIGFuIGV4aXN0aW5nIENBIGJ1bmRsZSBwYXRoLCBvciBOb25lIiIiCiAgICBleHRhbnRfY2VydF9wYXRocyA9IGZpbHRlcihvcy5wYXRoLmlzZmlsZSwgY2VydF9wYXRocykKICAgIHJldHVybiAoCiAgICAgICAgZ2V0X3dpbl9jZXJ0ZmlsZSgpCiAgICAgICAgb3IgbmV4dChleHRhbnRfY2VydF9wYXRocywgTm9uZSkKICAgICAgICBvciBfY2VydGlmaV93aGVyZSgpCiAgICApCgoKZGVmIF9jZXJ0aWZpX3doZXJlKCk6CiAgICB0cnk6CiAgICAgICAgcmV0dXJuIF9faW1wb3J0X18oJ2NlcnRpZmknKS53aGVyZSgpCiAgICBleGNlcHQgKEltcG9ydEVycm9yLCBSZXNvbHV0aW9uRXJyb3IsIEV4dHJhY3Rpb25FcnJvcik6CiAgICAgICAgcGFzcwpQSwMEFAAAAAAAAAAhAJpC15rkAwAA5AMAADMAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL3VuaWNvZGVfdXRpbHMucHlpbXBvcnQgdW5pY29kZWRhdGEKaW1wb3J0IHN5cwoKZnJvbSBzZXR1cHRvb2xzLmV4dGVybiBpbXBvcnQgc2l4CgoKIyBIRlMgUGx1cyB1c2VzIGRlY29tcG9zZWQgVVRGLTgKZGVmIGRlY29tcG9zZShwYXRoKToKICAgIGlmIGlzaW5zdGFuY2UocGF0aCwgc2l4LnRleHRfdHlwZSk6CiAgICAgICAgcmV0dXJuIHVuaWNvZGVkYXRhLm5vcm1hbGl6ZSgnTkZEJywgcGF0aCkKICAgIHRyeToKICAgICAgICBwYXRoID0gcGF0aC5kZWNvZGUoJ3V0Zi04JykKICAgICAgICBwYXRoID0gdW5pY29kZWRhdGEubm9ybWFsaXplKCdORkQnLCBwYXRoKQogICAgICAgIHBhdGggPSBwYXRoLmVuY29kZSgndXRmLTgnKQogICAgZXhjZXB0IFVuaWNvZGVFcnJvcjoKICAgICAgICBwYXNzICAjIE5vdCBVVEYtOAogICAgcmV0dXJuIHBhdGgKCgpkZWYgZmlsZXN5c19kZWNvZGUocGF0aCk6CiAgICAiIiIKICAgIEVuc3VyZSB0aGF0IHRoZSBnaXZlbiBwYXRoIGlzIGRlY29kZWQsCiAgICBOT05FIHdoZW4gbm8gZXhwZWN0ZWQgZW5jb2Rpbmcgd29ya3MKICAgICIiIgoKICAgIGlmIGlzaW5zdGFuY2UocGF0aCwgc2l4LnRleHRfdHlwZSk6CiAgICAgICAgcmV0dXJuIHBhdGgKCiAgICBmc19lbmMgPSBzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkgb3IgJ3V0Zi04JwogICAgY2FuZGlkYXRlcyA9IGZzX2VuYywgJ3V0Zi04JwoKICAgIGZvciBlbmMgaW4gY2FuZGlkYXRlczoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBwYXRoLmRlY29kZShlbmMpCiAgICAgICAgZXhjZXB0IFVuaWNvZGVEZWNvZGVFcnJvcjoKICAgICAgICAgICAgY29udGludWUKCgpkZWYgdHJ5X2VuY29kZShzdHJpbmcsIGVuYyk6CiAgICAidHVybiB1bmljb2RlIGVuY29kaW5nIGludG8gYSBmdW5jdGlvbmFsIHJvdXRpbmUiCiAgICB0cnk6CiAgICAgICAgcmV0dXJuIHN0cmluZy5lbmNvZGUoZW5jKQogICAgZXhjZXB0IFVuaWNvZGVFbmNvZGVFcnJvcjoKICAgICAgICByZXR1cm4gTm9uZQpQSwMEFAAAAAAAAAAhAEixTGKQAAAAkAAAAC0AAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL3ZlcnNpb24ucHlpbXBvcnQgcGtnX3Jlc291cmNlcwoKdHJ5OgogICAgX192ZXJzaW9uX18gPSBwa2dfcmVzb3VyY2VzLmdldF9kaXN0cmlidXRpb24oJ3NldHVwdG9vbHMnKS52ZXJzaW9uCmV4Y2VwdCBFeGNlcHRpb246CiAgICBfX3ZlcnNpb25fXyA9ICd1bmtub3duJwpQSwMEFAAAAAAAAAAhAHAdCPNBHAAAQRwAACsAAABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL3doZWVsLnB5JycnV2hlZWxzIHN1cHBvcnQuJycnCgpmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBnZXRfcGxhdGZvcm0KaW1wb3J0IGVtYWlsCmltcG9ydCBpdGVydG9vbHMKaW1wb3J0IG9zCmltcG9ydCByZQppbXBvcnQgemlwZmlsZQoKZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCBEaXN0cmlidXRpb24sIFBhdGhNZXRhZGF0YSwgcGFyc2VfdmVyc2lvbgpmcm9tIHBrZ19yZXNvdXJjZXMuZXh0ZXJuLnNpeCBpbXBvcnQgUFkzCmZyb20gc2V0dXB0b29scyBpbXBvcnQgRGlzdHJpYnV0aW9uIGFzIFNldHVwdG9vbHNEaXN0cmlidXRpb24KZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBwZXA0MjV0YWdzCmZyb20gc2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvIGltcG9ydCB3cml0ZV9yZXF1aXJlbWVudHMKCgpXSEVFTF9OQU1FID0gcmUuY29tcGlsZSgKICAgIHIiIiJeKD9QPHByb2plY3RfbmFtZT4uKz8pLSg/UDx2ZXJzaW9uPlxkLio/KQogICAgKCgtKD9QPGJ1aWxkPlxkLio/KSk/LSg/UDxweV92ZXJzaW9uPi4rPyktKD9QPGFiaT4uKz8pLSg/UDxwbGF0Zm9ybT4uKz8pCiAgICApXC53aGwkIiIiLApyZS5WRVJCT1NFKS5tYXRjaAoKTkFNRVNQQUNFX1BBQ0tBR0VfSU5JVCA9ICcnJ1wKdHJ5OgogICAgX19pbXBvcnRfXygncGtnX3Jlc291cmNlcycpLmRlY2xhcmVfbmFtZXNwYWNlKF9fbmFtZV9fKQpleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBfX3BhdGhfXyA9IF9faW1wb3J0X18oJ3BrZ3V0aWwnKS5leHRlbmRfcGF0aChfX3BhdGhfXywgX19uYW1lX18pCicnJwoKCmRlZiB1bnBhY2soc3JjX2RpciwgZHN0X2Rpcik6CiAgICAnJydNb3ZlIGV2ZXJ5dGhpbmcgdW5kZXIgYHNyY19kaXJgIHRvIGBkc3RfZGlyYCwgYW5kIGRlbGV0ZSB0aGUgZm9ybWVyLicnJwogICAgZm9yIGRpcnBhdGgsIGRpcm5hbWVzLCBmaWxlbmFtZXMgaW4gb3Mud2FsayhzcmNfZGlyKToKICAgICAgICBzdWJkaXIgPSBvcy5wYXRoLnJlbHBhdGgoZGlycGF0aCwgc3JjX2RpcikKICAgICAgICBmb3IgZiBpbiBmaWxlbmFtZXM6CiAgICAgICAgICAgIHNyYyA9IG9zLnBhdGguam9pbihkaXJwYXRoLCBmKQogICAgICAgICAgICBkc3QgPSBvcy5wYXRoLmpvaW4oZHN0X2Rpciwgc3ViZGlyLCBmKQogICAgICAgICAgICBvcy5yZW5hbWVzKHNyYywgZHN0KQogICAgICAgIGZvciBuLCBkIGluIHJldmVyc2VkKGxpc3QoZW51bWVyYXRlKGRpcm5hbWVzKSkpOgogICAgICAgICAgICBzcmMgPSBvcy5wYXRoLmpvaW4oZGlycGF0aCwgZCkKICAgICAgICAgICAgZHN0ID0gb3MucGF0aC5qb2luKGRzdF9kaXIsIHN1YmRpciwgZCkKICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGRzdCk6CiAgICAgICAgICAgICAgICAjIERpcmVjdG9yeSBkb2VzIG5vdCBleGlzdCBpbiBkZXN0aW5hdGlvbiwKICAgICAgICAgICAgICAgICMgcmVuYW1lIGl0IGFuZCBwcnVuZSBpdCBmcm9tIG9zLndhbGsgbGlzdC4KICAgICAgICAgICAgICAgIG9zLnJlbmFtZXMoc3JjLCBkc3QpCiAgICAgICAgICAgICAgICBkZWwgZGlybmFtZXNbbl0KICAgICMgQ2xlYW51cC4KICAgIGZvciBkaXJwYXRoLCBkaXJuYW1lcywgZmlsZW5hbWVzIGluIG9zLndhbGsoc3JjX2RpciwgdG9wZG93bj1UcnVlKToKICAgICAgICBhc3NlcnQgbm90IGZpbGVuYW1lcwogICAgICAgIG9zLnJtZGlyKGRpcnBhdGgpCgoKY2xhc3MgV2hlZWwob2JqZWN0KToKCiAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW5hbWUpOgogICAgICAgIG1hdGNoID0gV0hFRUxfTkFNRShvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKSkKICAgICAgICBpZiBtYXRjaCBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdpbnZhbGlkIHdoZWVsIG5hbWU6ICVyJyAlIGZpbGVuYW1lKQogICAgICAgIHNlbGYuZmlsZW5hbWUgPSBmaWxlbmFtZQogICAgICAgIGZvciBrLCB2IGluIG1hdGNoLmdyb3VwZGljdCgpLml0ZW1zKCk6CiAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgaywgdikKCiAgICBkZWYgdGFncyhzZWxmKToKICAgICAgICAnJydMaXN0IHRhZ3MgKHB5X3ZlcnNpb24sIGFiaSwgcGxhdGZvcm0pIHN1cHBvcnRlZCBieSB0aGlzIHdoZWVsLicnJwogICAgICAgIHJldHVybiBpdGVydG9vbHMucHJvZHVjdChzZWxmLnB5X3ZlcnNpb24uc3BsaXQoJy4nKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hYmkuc3BsaXQoJy4nKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wbGF0Zm9ybS5zcGxpdCgnLicpKQoKICAgIGRlZiBpc19jb21wYXRpYmxlKHNlbGYpOgogICAgICAgICcnJ0lzIHRoZSB3aGVlbCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIGN1cnJlbnQgcGxhdGZvcm0/JycnCiAgICAgICAgc3VwcG9ydGVkX3RhZ3MgPSBwZXA0MjV0YWdzLmdldF9zdXBwb3J0ZWQoKQogICAgICAgIHJldHVybiBuZXh0KChUcnVlIGZvciB0IGluIHNlbGYudGFncygpIGlmIHQgaW4gc3VwcG9ydGVkX3RhZ3MpLCBGYWxzZSkKCiAgICBkZWYgZWdnX25hbWUoc2VsZik6CiAgICAgICAgcmV0dXJuIERpc3RyaWJ1dGlvbigKICAgICAgICAgICAgcHJvamVjdF9uYW1lPXNlbGYucHJvamVjdF9uYW1lLCB2ZXJzaW9uPXNlbGYudmVyc2lvbiwKICAgICAgICAgICAgcGxhdGZvcm09KE5vbmUgaWYgc2VsZi5wbGF0Zm9ybSA9PSAnYW55JyBlbHNlIGdldF9wbGF0Zm9ybSgpKSwKICAgICAgICApLmVnZ19uYW1lKCkgKyAnLmVnZycKCiAgICBkZWYgaW5zdGFsbF9hc19lZ2coc2VsZiwgZGVzdGluYXRpb25fZWdnZGlyKToKICAgICAgICAnJydJbnN0YWxsIHdoZWVsIGFzIGFuIGVnZyBkaXJlY3RvcnkuJycnCiAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoc2VsZi5maWxlbmFtZSkgYXMgemY6CiAgICAgICAgICAgIGRpc3RfYmFzZW5hbWUgPSAnJXMtJXMnICUgKHNlbGYucHJvamVjdF9uYW1lLCBzZWxmLnZlcnNpb24pCiAgICAgICAgICAgIGRpc3RfaW5mbyA9ICclcy5kaXN0LWluZm8nICUgZGlzdF9iYXNlbmFtZQogICAgICAgICAgICBkaXN0X2RhdGEgPSAnJXMuZGF0YScgJSBkaXN0X2Jhc2VuYW1lCiAgICAgICAgICAgIGRlZiBnZXRfbWV0YWRhdGEobmFtZSk6CiAgICAgICAgICAgICAgICB3aXRoIHpmLm9wZW4oJyVzLyVzJyAlIChkaXN0X2luZm8sIG5hbWUpKSBhcyBmcDoKICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGZwLnJlYWQoKS5kZWNvZGUoJ3V0Zi04JykgaWYgUFkzIGVsc2UgZnAucmVhZCgpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtYWlsLnBhcnNlci5QYXJzZXIoKS5wYXJzZXN0cih2YWx1ZSkKICAgICAgICAgICAgd2hlZWxfbWV0YWRhdGEgPSBnZXRfbWV0YWRhdGEoJ1dIRUVMJykKICAgICAgICAgICAgZGlzdF9tZXRhZGF0YSA9IGdldF9tZXRhZGF0YSgnTUVUQURBVEEnKQogICAgICAgICAgICAjIENoZWNrIHdoZWVsIGZvcm1hdCB2ZXJzaW9uIGlzIHN1cHBvcnRlZC4KICAgICAgICAgICAgd2hlZWxfdmVyc2lvbiA9IHBhcnNlX3ZlcnNpb24od2hlZWxfbWV0YWRhdGEuZ2V0KCdXaGVlbC1WZXJzaW9uJykpCiAgICAgICAgICAgIGlmIG5vdCBwYXJzZV92ZXJzaW9uKCcxLjAnKSA8PSB3aGVlbF92ZXJzaW9uIDwgcGFyc2VfdmVyc2lvbignMi4wZGV2MCcpOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigndW5zdXBwb3J0ZWQgd2hlZWwgZm9ybWF0IHZlcnNpb246ICVzJyAlIHdoZWVsX3ZlcnNpb24pCiAgICAgICAgICAgICMgRXh0cmFjdCB0byB0YXJnZXQgZGlyZWN0b3J5LgogICAgICAgICAgICBvcy5ta2RpcihkZXN0aW5hdGlvbl9lZ2dkaXIpCiAgICAgICAgICAgIHpmLmV4dHJhY3RhbGwoZGVzdGluYXRpb25fZWdnZGlyKQogICAgICAgICAgICAjIENvbnZlcnQgbWV0YWRhdGEuCiAgICAgICAgICAgIGRpc3RfaW5mbyA9IG9zLnBhdGguam9pbihkZXN0aW5hdGlvbl9lZ2dkaXIsIGRpc3RfaW5mbykKICAgICAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbi5mcm9tX2xvY2F0aW9uKAogICAgICAgICAgICAgICAgZGVzdGluYXRpb25fZWdnZGlyLCBkaXN0X2luZm8sCiAgICAgICAgICAgICAgICBtZXRhZGF0YT1QYXRoTWV0YWRhdGEoZGVzdGluYXRpb25fZWdnZGlyLCBkaXN0X2luZm8pCiAgICAgICAgICAgICkKICAgICAgICAgICAgIyBOb3RlOiB3ZSBuZWVkIHRvIGV2YWx1YXRlIGFuZCBzdHJpcCBtYXJrZXJzIG5vdywKICAgICAgICAgICAgIyBhcyB3ZSBjYW4ndCBlYXNpbHkgY29udmVydCBiYWNrIGZyb20gdGhlIHN5bnRheDoKICAgICAgICAgICAgIyBmb29iYXI7ICJsaW51eCIgaW4gc3lzX3BsYXRmb3JtIGFuZCBleHRyYSA9PSAndGVzdCcKICAgICAgICAgICAgZGVmIHJhd19yZXEocmVxKToKICAgICAgICAgICAgICAgIHJlcS5tYXJrZXIgPSBOb25lCiAgICAgICAgICAgICAgICByZXR1cm4gc3RyKHJlcSkKICAgICAgICAgICAgaW5zdGFsbF9yZXF1aXJlcyA9IGxpc3Qoc29ydGVkKG1hcChyYXdfcmVxLCBkaXN0LnJlcXVpcmVzKCkpKSkKICAgICAgICAgICAgZXh0cmFzX3JlcXVpcmUgPSB7CiAgICAgICAgICAgICAgICBleHRyYTogbGlzdChzb3J0ZWQoCiAgICAgICAgICAgICAgICAgICAgcmVxCiAgICAgICAgICAgICAgICAgICAgZm9yIHJlcSBpbiBtYXAocmF3X3JlcSwgZGlzdC5yZXF1aXJlcygoZXh0cmEsKSkpCiAgICAgICAgICAgICAgICAgICAgaWYgcmVxIG5vdCBpbiBpbnN0YWxsX3JlcXVpcmVzCiAgICAgICAgICAgICAgICApKQogICAgICAgICAgICAgICAgZm9yIGV4dHJhIGluIGRpc3QuZXh0cmFzCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWdnX2luZm8gPSBvcy5wYXRoLmpvaW4oZGVzdGluYXRpb25fZWdnZGlyLCAnRUdHLUlORk8nKQogICAgICAgICAgICBvcy5yZW5hbWUoZGlzdF9pbmZvLCBlZ2dfaW5mbykKICAgICAgICAgICAgb3MucmVuYW1lKG9zLnBhdGguam9pbihlZ2dfaW5mbywgJ01FVEFEQVRBJyksCiAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oZWdnX2luZm8sICdQS0ctSU5GTycpKQogICAgICAgICAgICBzZXR1cF9kaXN0ID0gU2V0dXB0b29sc0Rpc3RyaWJ1dGlvbihhdHRycz1kaWN0KAogICAgICAgICAgICAgICAgaW5zdGFsbF9yZXF1aXJlcz1pbnN0YWxsX3JlcXVpcmVzLAogICAgICAgICAgICAgICAgZXh0cmFzX3JlcXVpcmU9ZXh0cmFzX3JlcXVpcmUsCiAgICAgICAgICAgICkpCiAgICAgICAgICAgIHdyaXRlX3JlcXVpcmVtZW50cyhzZXR1cF9kaXN0LmdldF9jb21tYW5kX29iaignZWdnX2luZm8nKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUsIG9zLnBhdGguam9pbihlZ2dfaW5mbywgJ3JlcXVpcmVzLnR4dCcpKQogICAgICAgICAgICAjIE1vdmUgZGF0YSBlbnRyaWVzIHRvIHRoZWlyIGNvcnJlY3QgbG9jYXRpb24uCiAgICAgICAgICAgIGRpc3RfZGF0YSA9IG9zLnBhdGguam9pbihkZXN0aW5hdGlvbl9lZ2dkaXIsIGRpc3RfZGF0YSkKICAgICAgICAgICAgZGlzdF9kYXRhX3NjcmlwdHMgPSBvcy5wYXRoLmpvaW4oZGlzdF9kYXRhLCAnc2NyaXB0cycpCiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGRpc3RfZGF0YV9zY3JpcHRzKToKICAgICAgICAgICAgICAgIGVnZ19pbmZvX3NjcmlwdHMgPSBvcy5wYXRoLmpvaW4oZGVzdGluYXRpb25fZWdnZGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRUdHLUlORk8nLCAnc2NyaXB0cycpCiAgICAgICAgICAgICAgICBvcy5ta2RpcihlZ2dfaW5mb19zY3JpcHRzKQogICAgICAgICAgICAgICAgZm9yIGVudHJ5IGluIG9zLmxpc3RkaXIoZGlzdF9kYXRhX3NjcmlwdHMpOgogICAgICAgICAgICAgICAgICAgICMgUmVtb3ZlIGJ5dGVjb2RlLCBhcyBpdCdzIG5vdCBwcm9wZXJseSBoYW5kbGVkCiAgICAgICAgICAgICAgICAgICAgIyBkdXJpbmcgZWFzeV9pbnN0YWxsIHNjcmlwdHMgaW5zdGFsbCBwaGFzZS4KICAgICAgICAgICAgICAgICAgICBpZiBlbnRyeS5lbmRzd2l0aCgnLnB5YycpOgogICAgICAgICAgICAgICAgICAgICAgICBvcy51bmxpbmsob3MucGF0aC5qb2luKGRpc3RfZGF0YV9zY3JpcHRzLCBlbnRyeSkpCiAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgb3MucmVuYW1lKG9zLnBhdGguam9pbihkaXN0X2RhdGFfc2NyaXB0cywgZW50cnkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKGVnZ19pbmZvX3NjcmlwdHMsIGVudHJ5KSkKICAgICAgICAgICAgICAgIG9zLnJtZGlyKGRpc3RfZGF0YV9zY3JpcHRzKQogICAgICAgICAgICBmb3Igc3ViZGlyIGluIGZpbHRlcihvcy5wYXRoLmV4aXN0cywgKAogICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKGRpc3RfZGF0YSwgZCkKICAgICAgICAgICAgICAgIGZvciBkIGluICgnZGF0YScsICdoZWFkZXJzJywgJ3B1cmVsaWInLCAncGxhdGxpYicpCiAgICAgICAgICAgICkpOgogICAgICAgICAgICAgICAgdW5wYWNrKHN1YmRpciwgZGVzdGluYXRpb25fZWdnZGlyKQogICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhkaXN0X2RhdGEpOgogICAgICAgICAgICAgICAgb3Mucm1kaXIoZGlzdF9kYXRhKQogICAgICAgICAgICAjIEZpeCBuYW1lc3BhY2UgcGFja2FnZXMuCiAgICAgICAgICAgIG5hbWVzcGFjZV9wYWNrYWdlcyA9IG9zLnBhdGguam9pbihlZ2dfaW5mbywgJ25hbWVzcGFjZV9wYWNrYWdlcy50eHQnKQogICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhuYW1lc3BhY2VfcGFja2FnZXMpOgogICAgICAgICAgICAgICAgd2l0aCBvcGVuKG5hbWVzcGFjZV9wYWNrYWdlcykgYXMgZnA6CiAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlX3BhY2thZ2VzID0gZnAucmVhZCgpLnNwbGl0KCkKICAgICAgICAgICAgICAgIGZvciBtb2QgaW4gbmFtZXNwYWNlX3BhY2thZ2VzOgogICAgICAgICAgICAgICAgICAgIG1vZF9kaXIgPSBvcy5wYXRoLmpvaW4oZGVzdGluYXRpb25fZWdnZGlyLCAqbW9kLnNwbGl0KCcuJykpCiAgICAgICAgICAgICAgICAgICAgbW9kX2luaXQgPSBvcy5wYXRoLmpvaW4obW9kX2RpciwgJ19faW5pdF9fLnB5JykKICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhtb2RfZGlyKSBhbmQgbm90IG9zLnBhdGguZXhpc3RzKG1vZF9pbml0KToKICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBvcGVuKG1vZF9pbml0LCAndycpIGFzIGZwOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnAud3JpdGUoTkFNRVNQQUNFX1BBQ0tBR0VfSU5JVCkKUEsDBBQAAAAAAAAAIQD5y+4NygIAAMoCAAA1AAAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy93aW5kb3dzX3N1cHBvcnQucHlpbXBvcnQgcGxhdGZvcm0KaW1wb3J0IGN0eXBlcwoKCmRlZiB3aW5kb3dzX29ubHkoZnVuYyk6CiAgICBpZiBwbGF0Zm9ybS5zeXN0ZW0oKSAhPSAnV2luZG93cyc6CiAgICAgICAgcmV0dXJuIGxhbWJkYSAqYXJncywgKiprd2FyZ3M6IE5vbmUKICAgIHJldHVybiBmdW5jCgoKQHdpbmRvd3Nfb25seQpkZWYgaGlkZV9maWxlKHBhdGgpOgogICAgIiIiCiAgICBTZXQgdGhlIGhpZGRlbiBhdHRyaWJ1dGUgb24gYSBmaWxlIG9yIGRpcmVjdG9yeS4KCiAgICBGcm9tIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTk2MjIxMzMvCgogICAgYHBhdGhgIG11c3QgYmUgdGV4dC4KICAgICIiIgogICAgX19pbXBvcnRfXygnY3R5cGVzLndpbnR5cGVzJykKICAgIFNldEZpbGVBdHRyaWJ1dGVzID0gY3R5cGVzLndpbmRsbC5rZXJuZWwzMi5TZXRGaWxlQXR0cmlidXRlc1cKICAgIFNldEZpbGVBdHRyaWJ1dGVzLmFyZ3R5cGVzID0gY3R5cGVzLndpbnR5cGVzLkxQV1NUUiwgY3R5cGVzLndpbnR5cGVzLkRXT1JECiAgICBTZXRGaWxlQXR0cmlidXRlcy5yZXN0eXBlID0gY3R5cGVzLndpbnR5cGVzLkJPT0wKCiAgICBGSUxFX0FUVFJJQlVURV9ISURERU4gPSAweDAyCgogICAgcmV0ID0gU2V0RmlsZUF0dHJpYnV0ZXMocGF0aCwgRklMRV9BVFRSSUJVVEVfSElEREVOKQogICAgaWYgbm90IHJldDoKICAgICAgICByYWlzZSBjdHlwZXMuV2luRXJyb3IoKQpQSwMEFAAAAAAAAAAhAAAAAAAAAAAAAAAAACAAAABweXBpX193aGVlbF8wXzMwXzBhMC9fX2luaXRfXy5weVBLAwQUAAAAAAAAACEAiDql1FUmAABVJgAAPQAAAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsLTAuMzAuMGEwLmRpc3QtaW5mby9ERVNDUklQVElPTi5yc3RXaGVlbAo9PT09PQoKQSBidWlsdC1wYWNrYWdlIGZvcm1hdCBmb3IgUHl0aG9uLgoKQSB3aGVlbCBpcyBhIFpJUC1mb3JtYXQgYXJjaGl2ZSB3aXRoIGEgc3BlY2lhbGx5IGZvcm1hdHRlZCBmaWxlbmFtZQphbmQgdGhlIC53aGwgZXh0ZW5zaW9uLiBJdCBpcyBkZXNpZ25lZCB0byBjb250YWluIGFsbCB0aGUgZmlsZXMgZm9yIGEKUEVQIDM3NiBjb21wYXRpYmxlIGluc3RhbGwgaW4gYSB3YXkgdGhhdCBpcyB2ZXJ5IGNsb3NlIHRvIHRoZSBvbi1kaXNrCmZvcm1hdC4gTWFueSBwYWNrYWdlcyB3aWxsIGJlIHByb3Blcmx5IGluc3RhbGxlZCB3aXRoIG9ubHkgdGhlICJVbnBhY2siCnN0ZXAgKHNpbXBseSBleHRyYWN0aW5nIHRoZSBmaWxlIG9udG8gc3lzLnBhdGgpLCBhbmQgdGhlIHVucGFja2VkIGFyY2hpdmUKcHJlc2VydmVzIGVub3VnaCBpbmZvcm1hdGlvbiB0byAiU3ByZWFkIiAoY29weSBkYXRhIGFuZCBzY3JpcHRzIHRvIHRoZWlyCmZpbmFsIGxvY2F0aW9ucykgYXQgYW55IGxhdGVyIHRpbWUuCgpUaGUgd2hlZWwgcHJvamVjdCBwcm92aWRlcyBhIGBiZGlzdF93aGVlbGAgY29tbWFuZCBmb3Igc2V0dXB0b29scwoocmVxdWlyZXMgc2V0dXB0b29scyA+PSAwLjguMCkuIFdoZWVsIGZpbGVzIGNhbiBiZSBpbnN0YWxsZWQgd2l0aCBhCm5ld2VyIGBwaXBgIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvcGlwIG9yIHdpdGggd2hlZWwncyBvd24gY29tbWFuZApsaW5lIHV0aWxpdHkuCgpUaGUgd2hlZWwgZG9jdW1lbnRhdGlvbiBpcyBhdCBodHRwOi8vd2hlZWwucnRmZC5vcmcvLiBUaGUgZmlsZSBmb3JtYXQKaXMgZG9jdW1lbnRlZCBpbiBQRVAgNDI3IChodHRwOi8vd3d3LnB5dGhvbi5vcmcvZGV2L3BlcHMvcGVwLTA0MjcvKS4KClRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaXMgYXQgaHR0cHM6Ly9iaXRidWNrZXQub3JnL3B5cGEvd2hlZWwKCldoeSBub3QgZWdnPwotLS0tLS0tLS0tLS0KClB5dGhvbidzIGVnZyBmb3JtYXQgcHJlZGF0ZXMgdGhlIHBhY2thZ2luZyByZWxhdGVkIHN0YW5kYXJkcyB3ZSBoYXZlCnRvZGF5LCB0aGUgbW9zdCBpbXBvcnRhbnQgYmVpbmcgUEVQIDM3NiAiRGF0YWJhc2Ugb2YgSW5zdGFsbGVkIFB5dGhvbgpEaXN0cmlidXRpb25zIiB3aGljaCBzcGVjaWZpZXMgdGhlIC5kaXN0LWluZm8gZGlyZWN0b3J5IChpbnN0ZWFkIG9mCi5lZ2ctaW5mbykgYW5kIFBFUCA0MjYgIk1ldGFkYXRhIGZvciBQeXRob24gU29mdHdhcmUgUGFja2FnZXMgMi4wIgp3aGljaCBzcGVjaWZpZXMgaG93IHRvIGV4cHJlc3MgZGVwZW5kZW5jaWVzIChpbnN0ZWFkIG9mIHJlcXVpcmVzLnR4dAppbiAuZWdnLWluZm8pLgoKV2hlZWwgaW1wbGVtZW50cyB0aGVzZSB0aGluZ3MuIEl0IGFsc28gcHJvdmlkZXMgYSByaWNoZXIgZmlsZSBuYW1pbmcKY29udmVudGlvbiB0aGF0IGNvbW11bmljYXRlcyB0aGUgUHl0aG9uIGltcGxlbWVudGF0aW9uIGFuZCBBQkkgYXMgd2VsbAphcyBzaW1wbHkgdGhlIGxhbmd1YWdlIHZlcnNpb24gdXNlZCBpbiBhIHBhcnRpY3VsYXIgcGFja2FnZS4KClVubGlrZSAuZWdnLCB3aGVlbCB3aWxsIGJlIGEgZnVsbHktZG9jdW1lbnRlZCBzdGFuZGFyZCBhdCB0aGUgYmluYXJ5CmxldmVsIHRoYXQgaXMgdHJ1bHkgZWFzeSB0byBpbnN0YWxsIGV2ZW4gaWYgeW91IGRvIG5vdCB3YW50IHRvIHVzZSB0aGUKcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uLgoKCkNvZGUgb2YgQ29uZHVjdAotLS0tLS0tLS0tLS0tLS0KCkV2ZXJ5b25lIGludGVyYWN0aW5nIGluIHRoZSB3aGVlbCBwcm9qZWN0J3MgY29kZWJhc2VzLCBpc3N1ZSB0cmFja2VycywgY2hhdApyb29tcywgYW5kIG1haWxpbmcgbGlzdHMgaXMgZXhwZWN0ZWQgdG8gZm9sbG93IHRoZSBgUHlQQSBDb2RlIG9mIENvbmR1Y3RgXy4KCi4uIF9QeVBBIENvZGUgb2YgQ29uZHVjdDogaHR0cHM6Ly93d3cucHlwYS5pby9lbi9sYXRlc3QvY29kZS1vZi1jb25kdWN0LwoKCgowLjI5LjAKPT09PT09Ci0gRml4IGNvbXByZXNzaW9uIHR5cGUgb2YgZmlsZXMgaW4gYXJjaGl2ZSAoSXNzdWUgIzE1NSwgUHVsbCBSZXF1ZXN0ICM2MiwKICB0aGFua3MgWGF2aWVyIEZlcm5hbmRleikKCjAuMjguMAo9PT09PT0KLSBGaXggZmlsZSBtb2RlcyBpbiBhcmNoaXZlIChJc3N1ZSAjMTU0KQoKMC4yNy4wCj09PT09PQotIFN1cHBvcnQgZm9yY2luZyBhIHBsYXRmb3JtIHRhZyB1c2luZyBgLS1wbGF0LW5hbWVgIG9uIHB1cmUtUHl0aG9uIHdoZWVscywgYXMKICB3ZWxsIGFzIG5vbnN0YW5kYXJkIHBsYXRmb3JtIHRhZ3Mgb24gbm9uLXB1cmUgd2hlZWxzIChQdWxsIFJlcXVlc3QgIzYwLCBJc3N1ZQogICMxNDQsIHRoYW5rcyBBbmRyw6lzIETDrWF6KQotIEFkZCBTT0FCSSB0YWdzIHRvIHBsYXRmb3JtLXNwZWNpZmljIHdoZWVscyBidWlsdCBmb3IgUHl0aG9uIDIuWCAoUHVsbCBSZXF1ZXN0CiAgIzU1LCBJc3N1ZSAjNjMsIElzc3VlICMxMDEpCi0gU3VwcG9ydCByZXByb2R1Y2libGUgd2hlZWwgZmlsZXMsIHdoZWVscyB0aGF0IGNhbiBiZSByZWJ1aWx0IGFuZCB3aWxsIGhhc2ggdG8KICB0aGUgc2FtZSB2YWx1ZXMgYXMgcHJldmlvdXMgYnVpbGRzIChQdWxsIFJlcXVlc3QgIzUyLCBJc3N1ZSAjMTQzLCB0aGFua3MKICBCYXJyeSBXYXJzYXcpCi0gU3VwcG9ydCBmb3IgY2hhbmdlcyBpbiBrZXlyaW5nID49IDguMCAoUHVsbCBSZXF1ZXN0ICM2MSwgdGhhbmtzIEphc29uIFIuCiAgQ29vbWJzKQotIFVzZSB0aGUgZmlsZSBjb250ZXh0IG1hbmFnZXIgd2hlbiBjaGVja2luZyBpZiBkZXBlbmRlbmN5X2xpbmtzLnR4dCBpcyBlbXB0eSwKICBmaXhlcyBwcm9ibGVtcyBidWlsZGluZyB3aGVlbHMgdW5kZXIgUHlQeSBvbiBXaW5kb3dzICAoSXNzdWUgIzE1MCwgdGhhbmtzCiAgQ29zaW1vIEx1cG8pCi0gRG9uJ3QgYXR0ZW1wdCB0byAocmVjdXJzaXZlbHkpIGNyZWF0ZSBhIGJ1aWxkIGRpcmVjdG9yeSBlbmRpbmcgd2l0aCBgLi5gCiAgKGludmFsaWQgb24gYWxsIHBsYXRmb3JtcywgYnV0IGNvZGUgd2FzIG9ubHkgZXhlY3V0ZWQgb24gV2luZG93cykgKElzc3VlICM5MSkKLSBBZGRlZCB0aGUgUHlQQSBDb2RlIG9mIENvbmR1Y3QgKFB1bGwgUmVxdWVzdCAjNTYpCgowLjI2LjAKPT09PT09Ci0gRml4IG11bHRpcGxlIGVudHJ5cG9pbnQgY29tcGFyaXNvbiBmYWlsdXJlIG9uIFB5dGhvbiAzIChJc3N1ZSAjMTQ4KQoKMC4yNS4wCj09PT09PQotIEFkZCBQeXRob24gMy41IHRvIHRveCBjb25maWd1cmF0aW9uCi0gRGV0ZXJtaW5pc3RpYyAoc29ydGVkKSBtZXRhZGF0YQotIEZpeCB0YWdnaW5nIGZvciBQeXRob24gMy41IGNvbXBhdGliaWxpdHkKLSBTdXBwb3J0IHB5Mi1ub25lLSdhcmNoJyBhbmQgcHkzLW5vbmUtJ2FyY2gnIHRhZ3MKLSBUcmVhdCBkYXRhLW9ubHkgd2hlZWxzIGFzIHB1cmUKLSBXcml0ZSB0byB0ZW1wb3JhcnkgZmlsZSBhbmQgcmVuYW1lIHdoZW4gdXNpbmcgd2hlZWwgaW5zdGFsbCAtLWZvcmNlCgowLjI0LjAKPT09PT09Ci0gVGhlIHB5dGhvbiB0YWcgdXNlZCBmb3IgcHVyZS1weXRob24gcGFja2FnZXMgaXMgbm93IC5weU4gKG1ham9yIHZlcnNpb24KICBvbmx5KS4gVGhpcyBjaGFuZ2UgYWN0dWFsbHkgb2NjdXJyZWQgaW4gMC4yMy4wIHdoZW4gdGhlIC0tcHl0aG9uLXRhZwogIG9wdGlvbiB3YXMgYWRkZWQsIGJ1dCB3YXMgbm90IGV4cGxpY2l0bHkgbWVudGlvbmVkIGluIHRoZSBjaGFuZ2Vsb2cgdGhlbi4KLSB3aW5pbnN0MndoZWVsIGFuZCBlZ2cyd2hlZWwgcmVtb3ZlZC4gVXNlICJ3aGVlbCBjb252ZXJ0IFthcmNoaXZlXSIKICBpbnN0ZWFkLgotIFdoZWVsIG5vdyBzdXBwb3J0cyBzZXR1cHRvb2xzIHN0eWxlIGNvbmRpdGlvbmFsIHJlcXVpcmVtZW50cyB2aWEgdGhlCiAgZXh0cmFzX3JlcXVpcmU9e30gc3ludGF4LiBTZXBhcmF0ZSAnZXh0cmEnIG5hbWVzIGZyb20gY29uZGl0aW9ucyB1c2luZwogIHRoZSA6IGNoYXJhY3Rlci4gV2hlZWwncyBvd24gc2V0dXAucHkgZG9lcyB0aGlzLiAoVGhlIGVtcHR5LXN0cmluZwogIGV4dHJhIGlzIHRoZSBzYW1lIGFzIGluc3RhbGxfcmVxdWlyZXMuKSBUaGVzZSBjb25kaXRpb25hbCByZXF1aXJlbWVudHMKICBzaG91bGQgd29yayB0aGUgc2FtZSB3aGV0aGVyIHRoZSBwYWNrYWdlIGlzIGluc3RhbGxlZCBieSB3aGVlbCBvcgogIGJ5IHNldHVwLnB5LgoKMC4yMy4wCj09PT09PQotIENvbXBhdGliaWxpdHkgdGFnIGZsYWdzIGFkZGVkIHRvIHRoZSBiZGlzdF93aGVlbCBjb21tYW5kCi0gc2Rpc3Qgc2hvdWxkIGluY2x1ZGUgZmlsZXMgbmVjZXNzYXJ5IGZvciB0ZXN0cwotICd3aGVlbCBjb252ZXJ0JyBjYW4gbm93IGFsc28gY29udmVydCB1bnBhY2tlZCBlZ2dzIHRvIHdoZWVsCi0gUmVuYW1lIHB5ZGlzdC5qc29uIHRvIG1ldGFkYXRhLmpzb24gdG8gYXZvaWQgc3RlcHBpbmcgb24gdGhlIFBFUAotIFRoZSAtLXNraXAtc2NyaXB0cyBvcHRpb24gaGFzIGJlZW4gcmVtb3ZlZCwgYW5kIG5vdCBnZW5lcmF0aW5nIHNjcmlwdHMgaXMgbm93CiAgdGhlIGRlZmF1bHQuIFRoZSBvcHRpb24gd2FzIGEgdGVtcG9yYXJ5IGFwcHJvYWNoIHVudGlsIGluc3RhbGxlcnMgY291bGQKICBnZW5lcmF0ZSBzY3JpcHRzIHRoZW1zZWx2ZXMuIFRoYXQgaXMgbm93IHRoZSBjYXNlIHdpdGggcGlwIDEuNSBhbmQgbGF0ZXIuCiAgTm90ZSB0aGF0IHVzaW5nIHBpcCAxLjQgdG8gaW5zdGFsbCBhIHdoZWVsIHdpdGhvdXQgc2NyaXB0cyB3aWxsIGxlYXZlIHRoZQogIGluc3RhbGxhdGlvbiB3aXRob3V0IGVudHJ5LXBvaW50IHdyYXBwZXJzLiBUaGUgIndoZWVsIGluc3RhbGwtc2NyaXB0cyIKICBjb21tYW5kIGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBzY3JpcHRzIGluIHN1Y2ggY2FzZXMuCi0gVGhhbmsgeW91IGNvbnRyaWJ1dG9ycwoKMC4yMi4wCj09PT09PQotIEluY2x1ZGUgZW50cnlfcG9pbnRzLnR4dCwgc2NyaXB0cyBhLmsuYS4gY29tbWFuZHMsIGluIGV4cGVyaW1lbnRhbAogIHB5ZGlzdC5qc29uCi0gSW1wcm92ZWQgdGVzdF9yZXF1aXJlcyBwYXJzaW5nCi0gUHl0aG9uIDIuNiBmaXhlcywgIndoZWVsIHZlcnNpb24iIGNvbW1hbmQgY291cnRlc3kgcG9tYnJlZGFubmUKCjAuMjEuMAo9PT09PT0KLSBQcmVnZW5lcmF0ZWQgc2NyaXB0cyBhcmUgdGhlIGRlZmF1bHQgYWdhaW4uCi0gInNldHVwLnB5IGJkaXN0X3doZWVsIC0tc2tpcC1zY3JpcHRzIiB0dXJucyB0aGVtIG9mZi4KLSBzZXR1cHRvb2xzIGlzIG5vIGxvbmdlciBhIGxpc3RlZCByZXF1aXJlbWVudCBmb3IgdGhlICd3aGVlbCcKICBwYWNrYWdlLiBJdCBpcyBvZiBjb3Vyc2Ugc3RpbGwgcmVxdWlyZWQgaW4gb3JkZXIgZm9yIGJkaXN0X3doZWVsCiAgdG8gd29yay4KLSAicHl0aG9uIC1tIHdoZWVsIiBhdm9pZHMgaW1wb3J0aW5nIHBrZ19yZXNvdXJjZXMgdW50aWwgaXQncyBuZWNlc3NhcnkuCgowLjIwLjAKPT09PT09Ci0gTm8gbG9uZ2VyIGluY2x1ZGUgY29uc29sZV9zY3JpcHRzIGluIHdoZWVscy4gT3JkaW5hcnkgc2NyaXB0cyAoc2hlbGwgZmlsZXMsCiAgc3RhbmRhbG9uZSBQeXRob24gZmlsZXMpIGFyZSBpbmNsdWRlZCBhcyB1c3VhbC4KLSBJbmNsdWRlIG5ldyBjb21tYW5kICJweXRob24gLW0gd2hlZWwgaW5zdGFsbC1zY3JpcHRzIFtkaXN0cmlidXRpb24KICBbZGlzdHJpYnV0aW9uIC4uLl1dIiB0byBpbnN0YWxsIHRoZSBjb25zb2xlX3NjcmlwdHMgKHNldHVwdG9vbHMtc3R5bGUKICBzY3JpcHRzIHVzaW5nIHBrZ19yZXNvdXJjZXMpIGZvciBhIGRpc3RyaWJ1dGlvbi4KCjAuMTkuMAo9PT09PT0KLSBweW1ldGEuanNvbiBiZWNvbWVzIHB5ZGlzdC5qc29uCgowLjE4LjAKPT09PT09Ci0gUHl0aG9uIDMgVW5pY29kZSBpbXByb3ZlbWVudHMKCjAuMTcuMAo9PT09PT0KLSBTdXBwb3J0IGxhdGVzdCBQRVAtNDI2ICJweW1ldGEuanNvbiIgKGpzb24tZm9ybWF0IG1ldGFkYXRhKQoKMC4xNi4wCj09PT09PQotIFB5dGhvbiAyLjYgY29tcGF0aWJpbGl0eSBidWdmaXggKHRoYW5rcyBKb2huIE1jRmFybGFuZSkKLSBOb24tcHJlcmVsZWFzZSB2ZXJzaW9uIG51bWJlcgoKMS4wLjBhMgo9PT09PT09Ci0gQnVnZml4IGZvciBDLWV4dGVuc2lvbiB0YWdzIGZvciBDUHl0aG9uIDMuMyAodXNpbmcgU09BQkkpCgoxLjAuMGExCj09PT09PT0KLSBCdWdmaXggZm9yIGJkaXN0X3dpbmluc3QgY29udmVydGVyICJ3aGVlbCBjb252ZXJ0IgotIEJ1Z2ZpeCBmb3IgZGlzdHMgd2hlcmUgImlzIHB1cmUiIGlzIE5vbmUgaW5zdGVhZCBvZiBUcnVlIG9yIEZhbHNlCgoxLjAuMGEwCj09PT09PT0KLSBVcGRhdGUgZm9yIHZlcnNpb24gMS4wIG9mIFdoZWVsIChQRVAgYWNjZXB0ZWQpLgotIFB5dGhvbiAzIGZpeCBmb3IgbW92aW5nIFVuaWNvZGUgRGVzY3JpcHRpb24gdG8gbWV0YWRhdGEgYm9keQotIEluY2x1ZGUgcnVkaW1lbnRhcnkgQVBJIGRvY3VtZW50YXRpb24gaW4gU3BoaW54ICh0aGFua3MgS2V2aW4gSG9ybikKCjAuMTUuMAo9PT09PT0KLSBWYXJpb3VzIGltcHJvdmVtZW50cwoKMC4xNC4wCj09PT09PQotIENoYW5nZWQgdGhlIHNpZ25hdHVyZSBmb3JtYXQgdG8gYmV0dGVyIGNvbXBseSB3aXRoIHRoZSBjdXJyZW50IEpXUyBzcGVjLgogIEJyZWFrcyBhbGwgZXhpc3Rpbmcgc2lnbmF0dXJlcy4KLSBJbmNsdWRlIGBgd2hlZWwgdW5zaWduYGAgY29tbWFuZCB0byByZW1vdmUgUkVDT1JELmp3cyBmcm9tIGFuIGFyY2hpdmUuCi0gUHV0IHRoZSBkZXNjcmlwdGlvbiBpbiB0aGUgbmV3bHkgYWxsb3dlZCBwYXlsb2FkIHNlY3Rpb24gb2YgUEtHLUlORk8KICAoTUVUQURBVEEpIGZpbGVzLgoKMC4xMy4wCj09PT09PQotIFVzZSBkaXN0dXRpbHMgaW5zdGVhZCBvZiBzeXNjb25maWcgdG8gZ2V0IGluc3RhbGxhdGlvbiBwYXRoczsgY2FuIGluc3RhbGwKICBoZWFkZXJzLgotIEltcHJvdmUgV2hlZWxGaWxlKCkgc29ydC4KLSBBbGxvdyBib290c3RyYXAgaW5zdGFsbHMgd2l0aG91dCBhbnkgcGtnX3Jlc291cmNlcy4KCjAuMTIuMAo9PT09PT0KLSBVbml0IHRlc3QgZm9yIHdoZWVsLnRvb2wuaW5zdGFsbAoKMC4xMS4wCj09PT09PQotIEFQSSBjbGVhbnVwCgowLjEwLjMKPT09PT09Ci0gU2NyaXB0cyBmaXhlciBmaXgKCjAuMTAuMgo9PT09PT0KLSBGaXgga2V5Z2VuCgowLjEwLjEKPT09PT09Ci0gUHJlc2VydmUgYXR0cmlidXRlcyBvbiBpbnN0YWxsLgoKMC4xMC4wCj09PT09PQotIEluY2x1ZGUgYSBjb3B5IG9mIHBrZ19yZXNvdXJjZXMuIFdoZWVsIGNhbiBub3cgaW5zdGFsbCBpbnRvIGEgdmlydHVhbGVudgogIHRoYXQgZG9lcyBub3QgaGF2ZSBkaXN0cmlidXRlICh0aG91Z2ggbW9zdCBwYWNrYWdlcyBzdGlsbCByZXF1aXJlCiAgcGtnX3Jlc291cmNlcyB0byBhY3R1YWxseSB3b3JrOyB3aGVlbCBpbnN0YWxsIGRpc3RyaWJ1dGUpCi0gRGVmaW5lIGEgbmV3IHNldHVwLmNmZyBzZWN0aW9uIFt3aGVlbF0uIHVuaXZlcnNhbD0xIHdpbGwKICBhcHBseSB0aGUgcHkyLnB5My1ub25lLWFueSB0YWcgZm9yIHB1cmUgcHl0aG9uIHdoZWVscy4KCjAuOS43Cj09PT09Ci0gT25seSBpbXBvcnQgZGlyc3BlYyB3aGVuIG5lZWRlZC4gZGlyc3BlYyBpcyBvbmx5IG5lZWRlZCB0byBmaW5kIHRoZQogIGNvbmZpZ3VyYXRpb24gZm9yIGtleWdlbi9zaWduaW5nIG9wZXJhdGlvbnMuCgowLjkuNgo9PT09PQotIHJlcXVpcmVzLWRpc3QgZnJvbSBzZXR1cC5jZmcgb3ZlcndyaXRlcyBhbnkgcmVxdWlyZW1lbnRzIGZyb20gc2V0dXAucHkKICBDYXJlIG11c3QgYmUgdGFrZW4gdGhhdCB0aGUgcmVxdWlyZW1lbnRzIGFyZSB0aGUgc2FtZSBpbiBib3RoIGNhc2VzLAogIG9yIGp1c3QgYWx3YXlzIGluc3RhbGwgZnJvbSB3aGVlbC4KLSBkcm9wIGRpcnNwZWMgcmVxdWlyZW1lbnQgb24gd2luMzIKLSBpbXByb3ZlZCBjb21tYW5kIGxpbmUgdXRpbGl0eSwgYWRkcyAnd2hlZWwgY29udmVydCBbZWdnIG9yIHdpbmluc3RdJyB0bwogIGNvbnZlcnQgbGVnYWN5IGJpbmFyeSBmb3JtYXRzIHRvIHdoZWVsCgowLjkuNQo9PT09PQotIFdoZWVsJ3Mgb3duIHdoZWVsIGZpbGUgY2FuIGJlIGV4ZWN1dGVkIGJ5IFB5dGhvbiwgYW5kIGNhbiBpbnN0YWxsIGl0c2VsZjoKICBgYHB5dGhvbiB3aGVlbC0wLjkuNS1weTI3LW5vbmUtYW55L3doZWVsIGluc3RhbGwgLi4uYGAKLSBVc2UgYXJncGFyc2U7IGJhc2ljIGBgd2hlZWwgaW5zdGFsbGBgIGNvbW1hbmQgc2hvdWxkIHJ1biB3aXRoIG9ubHkgc3RkbGliCiAgZGVwZW5kZW5jaWVzLgotIEFsbG93IHJlcXVpcmVzX2Rpc3QgaW4gc2V0dXAuY2ZnJ3MgW21ldGFkYXRhXSBzZWN0aW9uLiBJbiBhZGRpdGlvbiB0bwogIGRlcGVuZGVuY2llcyBpbiBzZXR1cC5weSwgYnV0IHdpbGwgb25seSBiZSBpbnRlcnByZXRlZCB3aGVuIGluc3RhbGxpbmcKICBmcm9tIHdoZWVsLCBub3QgZnJvbSBzZGlzdC4gQ2FuIGJlIHF1YWxpZmllZCB3aXRoIGVudmlyb25tZW50IG1hcmtlcnMuCgowLjkuNAo9PT09PQotIEZpeCB3aGVlbC5zaWduYXR1cmVzIGluIHNkaXN0CgowLjkuMwo9PT09PQotIEludGVncmF0ZWQgZGlnaXRhbCBzaWduYXR1cmVzIHN1cHBvcnQgd2l0aG91dCBDIGV4dGVuc2lvbnMuCi0gSW50ZWdyYXRlZCAid2hlZWwgaW5zdGFsbCIgY29tbWFuZCAoc2luZ2xlIHBhY2thZ2UsIG5vIGRlcGVuZGVuY3kKICByZXNvbHV0aW9uKSBpbmNsdWRpbmcgY29tcGF0aWJpbGl0eSBjaGVjay4KLSBTdXBwb3J0IFB5dGhvbiAzLjMKLSBVc2UgTWV0YWRhdGEgMS4zIChQRVAgNDI2KQoKMC45LjIKPT09PT0KLSBBdXRvbWF0aWMgc2lnbmluZyBpZiBXSEVFTF9UT09MIHBvaW50cyB0byB0aGUgd2hlZWwgYmluYXJ5Ci0gRXZlbiBtb3JlIFB5dGhvbiAzIGZpeGVzCgowLjkuMQo9PT09PQotICd3aGVlbCBzaWduJyB1c2VzIHRoZSBrZXlzIGdlbmVyYXRlZCBieSAnd2hlZWwga2V5Z2VuJyAoaW5zdGVhZCBvZiBnZW5lcmF0aW5nCiAgYSBuZXcga2V5IGF0IHJhbmRvbSBlYWNoIHRpbWUpCi0gUHl0aG9uIDIvMyBlbmNvZGluZy9kZWNvZGluZyBmaXhlcwotIFJ1biB0ZXN0cyBvbiBQeXRob24gMi42ICh3aXRob3V0IHNpZ25hdHVyZSB2ZXJpZmljYXRpb24pCgowLjkKPT09Ci0gVXBkYXRlZCBkaWdpdGFsIHNpZ25hdHVyZXMgc2NoZW1lCi0gUHl0aG9uIDMgc3VwcG9ydCBmb3IgZGlnaXRhbCBzaWduYXR1cmVzCi0gQWx3YXlzIHZlcmlmeSBSRUNPUkQgaGFzaGVzIG9uIGV4dHJhY3QKLSAid2hlZWwiIGNvbW1hbmQgbGluZSB0b29sIHRvIHNpZ24sIHZlcmlmeSwgdW5wYWNrIHdoZWVsIGZpbGVzCgowLjgKPT09Ci0gbm9uZS9hbnkgZHJhZnQgcGVwIHRhZ3MgdXBkYXRlCi0gaW1wcm92ZWQgd2luaW5zdDJ3aGVlbCBzY3JpcHQKLSBkb2MgY2hhbmdlcyBhbmQgb3RoZXIgaW1wcm92ZW1lbnRzCgowLjcKPT09Ci0gc29ydCAuZGlzdC1pbmZvIGF0IGVuZCBvZiB3aGVlbCBhcmNoaXZlCi0gV2luZG93cyAmIFB5dGhvbiAzIGZpeGVzIGZyb20gUGF1bCBNb29yZQotIHBlcDgKLSBzY3JpcHRzIHRvIGNvbnZlcnQgd2luaW5zdCAmIGVnZyB0byB3aGVlbAoKMC42Cj09PQotIHJlcXVpcmUgZGlzdHJpYnV0ZSA+PSAwLjYuMjgKLSBzdG9wIHVzaW5nIHZlcmxpYgoKMC41Cj09PQotIHdvcmtpbmcgcHJldHR5IHdlbGwKCjAuNC4yCj09PT09Ci0gaHlwaGVuYXRlZCBuYW1lIGZpeAoKMC40Cj09PQotIGltcHJvdmUgdGVzdCBjb3ZlcmFnZQotIGltcHJvdmUgV2luZG93cyBjb21wYXRpYmlsaXR5Ci0gaW5jbHVkZSB0b3guaW5pIGNvdXJ0ZXN5IG9mIE1hcmMgQWJyYW1vd2l0egotIGRyYWZ0IGhtYWMgc2hhLTI1NiBzaWduaW5nIGZ1bmN0aW9uCgowLjMKPT09Ci0gcHJvdG90eXBlIGVnZzJ3aGVlbCBjb252ZXJzaW9uIHNjcmlwdAoKMC4yCj09PQotIFB5dGhvbiAzIGNvbXBhdGliaWxpdHkKCjAuMQo9PT0KLSBJbml0aWFsIHZlcnNpb24KCgpQSwMEFAAAAAAAAAAhAHD/rp9lBAAAZQQAADkAAABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC0wLjMwLjBhMC5kaXN0LWluZm8vTElDRU5TRS50eHQid2hlZWwiIGNvcHlyaWdodCAoYykgMjAxMi0yMDE0IERhbmllbCBIb2x0aCA8ZGhvbHRoQGZhc3RtYWlsLmZtPiBhbmQKY29udHJpYnV0b3JzLgoKVGhlIE1JVCBMaWNlbnNlCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQpjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAp0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCnRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAphbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCmluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMClRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCk9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLApBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgpQSwMEFAAAAAAAAAAhAERtmYENKwAADSsAADYAAABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC0wLjMwLjBhMC5kaXN0LWluZm8vTUVUQURBVEFNZXRhZGF0YS1WZXJzaW9uOiAyLjAKTmFtZTogd2hlZWwKVmVyc2lvbjogMC4zMC4wYTAKU3VtbWFyeTogQSBidWlsdC1wYWNrYWdlIGZvcm1hdCBmb3IgUHl0aG9uLgpIb21lLXBhZ2U6IGh0dHBzOi8vYml0YnVja2V0Lm9yZy9weXBhL3doZWVsLwpBdXRob3I6IERhbmllbCBIb2x0aApBdXRob3ItZW1haWw6IGRob2x0aEBmYXN0bWFpbC5mbQpMaWNlbnNlOiBNSVQKS2V5d29yZHM6IHdoZWVsLHBhY2thZ2luZwpQbGF0Zm9ybTogVU5LTk9XTgpDbGFzc2lmaWVyOiBEZXZlbG9wbWVudCBTdGF0dXMgOjogNCAtIEJldGEKQ2xhc3NpZmllcjogSW50ZW5kZWQgQXVkaWVuY2UgOjogRGV2ZWxvcGVycwpDbGFzc2lmaWVyOiBQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24KQ2xhc3NpZmllcjogUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDIKQ2xhc3NpZmllcjogUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDIuNgpDbGFzc2lmaWVyOiBQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMi43CkNsYXNzaWZpZXI6IFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzCkNsYXNzaWZpZXI6IFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjIKQ2xhc3NpZmllcjogUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuMwpDbGFzc2lmaWVyOiBQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy40ClJlcXVpcmVzLURpc3Q6IGFyZ3BhcnNlOyBweXRob25fdmVyc2lvbj09IjIuNiIKUHJvdmlkZXMtRXh0cmE6IGZhc3Rlci1zaWduYXR1cmVzClJlcXVpcmVzLURpc3Q6IGVkMjU1MTlsbDsgZXh0cmEgPT0gJ2Zhc3Rlci1zaWduYXR1cmVzJwpQcm92aWRlcy1FeHRyYTogc2lnbmF0dXJlcwpSZXF1aXJlcy1EaXN0OiBrZXlyaW5nOyBleHRyYSA9PSAnc2lnbmF0dXJlcycKUmVxdWlyZXMtRGlzdDoga2V5cmluZ3MuYWx0OyBleHRyYSA9PSAnc2lnbmF0dXJlcycKUHJvdmlkZXMtRXh0cmE6IHNpZ25hdHVyZXMKUmVxdWlyZXMtRGlzdDogaW1wb3J0bGliOyBweXRob25fdmVyc2lvbj09IjIuNiIgYW5kIGV4dHJhID09ICdzaWduYXR1cmVzJwpQcm92aWRlcy1FeHRyYTogc2lnbmF0dXJlcwpSZXF1aXJlcy1EaXN0OiBweXhkZzsgc3lzX3BsYXRmb3JtIT0id2luMzIiIGFuZCBleHRyYSA9PSAnc2lnbmF0dXJlcycKUHJvdmlkZXMtRXh0cmE6IHRvb2wKCldoZWVsCj09PT09CgpBIGJ1aWx0LXBhY2thZ2UgZm9ybWF0IGZvciBQeXRob24uCgpBIHdoZWVsIGlzIGEgWklQLWZvcm1hdCBhcmNoaXZlIHdpdGggYSBzcGVjaWFsbHkgZm9ybWF0dGVkIGZpbGVuYW1lCmFuZCB0aGUgLndobCBleHRlbnNpb24uIEl0IGlzIGRlc2lnbmVkIHRvIGNvbnRhaW4gYWxsIHRoZSBmaWxlcyBmb3IgYQpQRVAgMzc2IGNvbXBhdGlibGUgaW5zdGFsbCBpbiBhIHdheSB0aGF0IGlzIHZlcnkgY2xvc2UgdG8gdGhlIG9uLWRpc2sKZm9ybWF0LiBNYW55IHBhY2thZ2VzIHdpbGwgYmUgcHJvcGVybHkgaW5zdGFsbGVkIHdpdGggb25seSB0aGUgIlVucGFjayIKc3RlcCAoc2ltcGx5IGV4dHJhY3RpbmcgdGhlIGZpbGUgb250byBzeXMucGF0aCksIGFuZCB0aGUgdW5wYWNrZWQgYXJjaGl2ZQpwcmVzZXJ2ZXMgZW5vdWdoIGluZm9ybWF0aW9uIHRvICJTcHJlYWQiIChjb3B5IGRhdGEgYW5kIHNjcmlwdHMgdG8gdGhlaXIKZmluYWwgbG9jYXRpb25zKSBhdCBhbnkgbGF0ZXIgdGltZS4KClRoZSB3aGVlbCBwcm9qZWN0IHByb3ZpZGVzIGEgYGJkaXN0X3doZWVsYCBjb21tYW5kIGZvciBzZXR1cHRvb2xzCihyZXF1aXJlcyBzZXR1cHRvb2xzID49IDAuOC4wKS4gV2hlZWwgZmlsZXMgY2FuIGJlIGluc3RhbGxlZCB3aXRoIGEKbmV3ZXIgYHBpcGAgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vcHlwYS9waXAgb3Igd2l0aCB3aGVlbCdzIG93biBjb21tYW5kCmxpbmUgdXRpbGl0eS4KClRoZSB3aGVlbCBkb2N1bWVudGF0aW9uIGlzIGF0IGh0dHA6Ly93aGVlbC5ydGZkLm9yZy8uIFRoZSBmaWxlIGZvcm1hdAppcyBkb2N1bWVudGVkIGluIFBFUCA0MjcgKGh0dHA6Ly93d3cucHl0aG9uLm9yZy9kZXYvcGVwcy9wZXAtMDQyNy8pLgoKVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBpcyBhdCBodHRwczovL2JpdGJ1Y2tldC5vcmcvcHlwYS93aGVlbAoKV2h5IG5vdCBlZ2c/Ci0tLS0tLS0tLS0tLQoKUHl0aG9uJ3MgZWdnIGZvcm1hdCBwcmVkYXRlcyB0aGUgcGFja2FnaW5nIHJlbGF0ZWQgc3RhbmRhcmRzIHdlIGhhdmUKdG9kYXksIHRoZSBtb3N0IGltcG9ydGFudCBiZWluZyBQRVAgMzc2ICJEYXRhYmFzZSBvZiBJbnN0YWxsZWQgUHl0aG9uCkRpc3RyaWJ1dGlvbnMiIHdoaWNoIHNwZWNpZmllcyB0aGUgLmRpc3QtaW5mbyBkaXJlY3RvcnkgKGluc3RlYWQgb2YKLmVnZy1pbmZvKSBhbmQgUEVQIDQyNiAiTWV0YWRhdGEgZm9yIFB5dGhvbiBTb2Z0d2FyZSBQYWNrYWdlcyAyLjAiCndoaWNoIHNwZWNpZmllcyBob3cgdG8gZXhwcmVzcyBkZXBlbmRlbmNpZXMgKGluc3RlYWQgb2YgcmVxdWlyZXMudHh0CmluIC5lZ2ctaW5mbykuCgpXaGVlbCBpbXBsZW1lbnRzIHRoZXNlIHRoaW5ncy4gSXQgYWxzbyBwcm92aWRlcyBhIHJpY2hlciBmaWxlIG5hbWluZwpjb252ZW50aW9uIHRoYXQgY29tbXVuaWNhdGVzIHRoZSBQeXRob24gaW1wbGVtZW50YXRpb24gYW5kIEFCSSBhcyB3ZWxsCmFzIHNpbXBseSB0aGUgbGFuZ3VhZ2UgdmVyc2lvbiB1c2VkIGluIGEgcGFydGljdWxhciBwYWNrYWdlLgoKVW5saWtlIC5lZ2csIHdoZWVsIHdpbGwgYmUgYSBmdWxseS1kb2N1bWVudGVkIHN0YW5kYXJkIGF0IHRoZSBiaW5hcnkKbGV2ZWwgdGhhdCBpcyB0cnVseSBlYXN5IHRvIGluc3RhbGwgZXZlbiBpZiB5b3UgZG8gbm90IHdhbnQgdG8gdXNlIHRoZQpyZWZlcmVuY2UgaW1wbGVtZW50YXRpb24uCgoKQ29kZSBvZiBDb25kdWN0Ci0tLS0tLS0tLS0tLS0tLQoKRXZlcnlvbmUgaW50ZXJhY3RpbmcgaW4gdGhlIHdoZWVsIHByb2plY3QncyBjb2RlYmFzZXMsIGlzc3VlIHRyYWNrZXJzLCBjaGF0CnJvb21zLCBhbmQgbWFpbGluZyBsaXN0cyBpcyBleHBlY3RlZCB0byBmb2xsb3cgdGhlIGBQeVBBIENvZGUgb2YgQ29uZHVjdGBfLgoKLi4gX1B5UEEgQ29kZSBvZiBDb25kdWN0OiBodHRwczovL3d3dy5weXBhLmlvL2VuL2xhdGVzdC9jb2RlLW9mLWNvbmR1Y3QvCgoKCjAuMjkuMAo9PT09PT0KLSBGaXggY29tcHJlc3Npb24gdHlwZSBvZiBmaWxlcyBpbiBhcmNoaXZlIChJc3N1ZSAjMTU1LCBQdWxsIFJlcXVlc3QgIzYyLAogIHRoYW5rcyBYYXZpZXIgRmVybmFuZGV6KQoKMC4yOC4wCj09PT09PQotIEZpeCBmaWxlIG1vZGVzIGluIGFyY2hpdmUgKElzc3VlICMxNTQpCgowLjI3LjAKPT09PT09Ci0gU3VwcG9ydCBmb3JjaW5nIGEgcGxhdGZvcm0gdGFnIHVzaW5nIGAtLXBsYXQtbmFtZWAgb24gcHVyZS1QeXRob24gd2hlZWxzLCBhcwogIHdlbGwgYXMgbm9uc3RhbmRhcmQgcGxhdGZvcm0gdGFncyBvbiBub24tcHVyZSB3aGVlbHMgKFB1bGwgUmVxdWVzdCAjNjAsIElzc3VlCiAgIzE0NCwgdGhhbmtzIEFuZHLDqXMgRMOtYXopCi0gQWRkIFNPQUJJIHRhZ3MgdG8gcGxhdGZvcm0tc3BlY2lmaWMgd2hlZWxzIGJ1aWx0IGZvciBQeXRob24gMi5YIChQdWxsIFJlcXVlc3QKICAjNTUsIElzc3VlICM2MywgSXNzdWUgIzEwMSkKLSBTdXBwb3J0IHJlcHJvZHVjaWJsZSB3aGVlbCBmaWxlcywgd2hlZWxzIHRoYXQgY2FuIGJlIHJlYnVpbHQgYW5kIHdpbGwgaGFzaCB0bwogIHRoZSBzYW1lIHZhbHVlcyBhcyBwcmV2aW91cyBidWlsZHMgKFB1bGwgUmVxdWVzdCAjNTIsIElzc3VlICMxNDMsIHRoYW5rcwogIEJhcnJ5IFdhcnNhdykKLSBTdXBwb3J0IGZvciBjaGFuZ2VzIGluIGtleXJpbmcgPj0gOC4wIChQdWxsIFJlcXVlc3QgIzYxLCB0aGFua3MgSmFzb24gUi4KICBDb29tYnMpCi0gVXNlIHRoZSBmaWxlIGNvbnRleHQgbWFuYWdlciB3aGVuIGNoZWNraW5nIGlmIGRlcGVuZGVuY3lfbGlua3MudHh0IGlzIGVtcHR5LAogIGZpeGVzIHByb2JsZW1zIGJ1aWxkaW5nIHdoZWVscyB1bmRlciBQeVB5IG9uIFdpbmRvd3MgIChJc3N1ZSAjMTUwLCB0aGFua3MKICBDb3NpbW8gTHVwbykKLSBEb24ndCBhdHRlbXB0IHRvIChyZWN1cnNpdmVseSkgY3JlYXRlIGEgYnVpbGQgZGlyZWN0b3J5IGVuZGluZyB3aXRoIGAuLmAKICAoaW52YWxpZCBvbiBhbGwgcGxhdGZvcm1zLCBidXQgY29kZSB3YXMgb25seSBleGVjdXRlZCBvbiBXaW5kb3dzKSAoSXNzdWUgIzkxKQotIEFkZGVkIHRoZSBQeVBBIENvZGUgb2YgQ29uZHVjdCAoUHVsbCBSZXF1ZXN0ICM1NikKCjAuMjYuMAo9PT09PT0KLSBGaXggbXVsdGlwbGUgZW50cnlwb2ludCBjb21wYXJpc29uIGZhaWx1cmUgb24gUHl0aG9uIDMgKElzc3VlICMxNDgpCgowLjI1LjAKPT09PT09Ci0gQWRkIFB5dGhvbiAzLjUgdG8gdG94IGNvbmZpZ3VyYXRpb24KLSBEZXRlcm1pbmlzdGljIChzb3J0ZWQpIG1ldGFkYXRhCi0gRml4IHRhZ2dpbmcgZm9yIFB5dGhvbiAzLjUgY29tcGF0aWJpbGl0eQotIFN1cHBvcnQgcHkyLW5vbmUtJ2FyY2gnIGFuZCBweTMtbm9uZS0nYXJjaCcgdGFncwotIFRyZWF0IGRhdGEtb25seSB3aGVlbHMgYXMgcHVyZQotIFdyaXRlIHRvIHRlbXBvcmFyeSBmaWxlIGFuZCByZW5hbWUgd2hlbiB1c2luZyB3aGVlbCBpbnN0YWxsIC0tZm9yY2UKCjAuMjQuMAo9PT09PT0KLSBUaGUgcHl0aG9uIHRhZyB1c2VkIGZvciBwdXJlLXB5dGhvbiBwYWNrYWdlcyBpcyBub3cgLnB5TiAobWFqb3IgdmVyc2lvbgogIG9ubHkpLiBUaGlzIGNoYW5nZSBhY3R1YWxseSBvY2N1cnJlZCBpbiAwLjIzLjAgd2hlbiB0aGUgLS1weXRob24tdGFnCiAgb3B0aW9uIHdhcyBhZGRlZCwgYnV0IHdhcyBub3QgZXhwbGljaXRseSBtZW50aW9uZWQgaW4gdGhlIGNoYW5nZWxvZyB0aGVuLgotIHdpbmluc3Qyd2hlZWwgYW5kIGVnZzJ3aGVlbCByZW1vdmVkLiBVc2UgIndoZWVsIGNvbnZlcnQgW2FyY2hpdmVdIgogIGluc3RlYWQuCi0gV2hlZWwgbm93IHN1cHBvcnRzIHNldHVwdG9vbHMgc3R5bGUgY29uZGl0aW9uYWwgcmVxdWlyZW1lbnRzIHZpYSB0aGUKICBleHRyYXNfcmVxdWlyZT17fSBzeW50YXguIFNlcGFyYXRlICdleHRyYScgbmFtZXMgZnJvbSBjb25kaXRpb25zIHVzaW5nCiAgdGhlIDogY2hhcmFjdGVyLiBXaGVlbCdzIG93biBzZXR1cC5weSBkb2VzIHRoaXMuIChUaGUgZW1wdHktc3RyaW5nCiAgZXh0cmEgaXMgdGhlIHNhbWUgYXMgaW5zdGFsbF9yZXF1aXJlcy4pIFRoZXNlIGNvbmRpdGlvbmFsIHJlcXVpcmVtZW50cwogIHNob3VsZCB3b3JrIHRoZSBzYW1lIHdoZXRoZXIgdGhlIHBhY2thZ2UgaXMgaW5zdGFsbGVkIGJ5IHdoZWVsIG9yCiAgYnkgc2V0dXAucHkuCgowLjIzLjAKPT09PT09Ci0gQ29tcGF0aWJpbGl0eSB0YWcgZmxhZ3MgYWRkZWQgdG8gdGhlIGJkaXN0X3doZWVsIGNvbW1hbmQKLSBzZGlzdCBzaG91bGQgaW5jbHVkZSBmaWxlcyBuZWNlc3NhcnkgZm9yIHRlc3RzCi0gJ3doZWVsIGNvbnZlcnQnIGNhbiBub3cgYWxzbyBjb252ZXJ0IHVucGFja2VkIGVnZ3MgdG8gd2hlZWwKLSBSZW5hbWUgcHlkaXN0Lmpzb24gdG8gbWV0YWRhdGEuanNvbiB0byBhdm9pZCBzdGVwcGluZyBvbiB0aGUgUEVQCi0gVGhlIC0tc2tpcC1zY3JpcHRzIG9wdGlvbiBoYXMgYmVlbiByZW1vdmVkLCBhbmQgbm90IGdlbmVyYXRpbmcgc2NyaXB0cyBpcyBub3cKICB0aGUgZGVmYXVsdC4gVGhlIG9wdGlvbiB3YXMgYSB0ZW1wb3JhcnkgYXBwcm9hY2ggdW50aWwgaW5zdGFsbGVycyBjb3VsZAogIGdlbmVyYXRlIHNjcmlwdHMgdGhlbXNlbHZlcy4gVGhhdCBpcyBub3cgdGhlIGNhc2Ugd2l0aCBwaXAgMS41IGFuZCBsYXRlci4KICBOb3RlIHRoYXQgdXNpbmcgcGlwIDEuNCB0byBpbnN0YWxsIGEgd2hlZWwgd2l0aG91dCBzY3JpcHRzIHdpbGwgbGVhdmUgdGhlCiAgaW5zdGFsbGF0aW9uIHdpdGhvdXQgZW50cnktcG9pbnQgd3JhcHBlcnMuIFRoZSAid2hlZWwgaW5zdGFsbC1zY3JpcHRzIgogIGNvbW1hbmQgY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIHNjcmlwdHMgaW4gc3VjaCBjYXNlcy4KLSBUaGFuayB5b3UgY29udHJpYnV0b3JzCgowLjIyLjAKPT09PT09Ci0gSW5jbHVkZSBlbnRyeV9wb2ludHMudHh0LCBzY3JpcHRzIGEuay5hLiBjb21tYW5kcywgaW4gZXhwZXJpbWVudGFsCiAgcHlkaXN0Lmpzb24KLSBJbXByb3ZlZCB0ZXN0X3JlcXVpcmVzIHBhcnNpbmcKLSBQeXRob24gMi42IGZpeGVzLCAid2hlZWwgdmVyc2lvbiIgY29tbWFuZCBjb3VydGVzeSBwb21icmVkYW5uZQoKMC4yMS4wCj09PT09PQotIFByZWdlbmVyYXRlZCBzY3JpcHRzIGFyZSB0aGUgZGVmYXVsdCBhZ2Fpbi4KLSAic2V0dXAucHkgYmRpc3Rfd2hlZWwgLS1za2lwLXNjcmlwdHMiIHR1cm5zIHRoZW0gb2ZmLgotIHNldHVwdG9vbHMgaXMgbm8gbG9uZ2VyIGEgbGlzdGVkIHJlcXVpcmVtZW50IGZvciB0aGUgJ3doZWVsJwogIHBhY2thZ2UuIEl0IGlzIG9mIGNvdXJzZSBzdGlsbCByZXF1aXJlZCBpbiBvcmRlciBmb3IgYmRpc3Rfd2hlZWwKICB0byB3b3JrLgotICJweXRob24gLW0gd2hlZWwiIGF2b2lkcyBpbXBvcnRpbmcgcGtnX3Jlc291cmNlcyB1bnRpbCBpdCdzIG5lY2Vzc2FyeS4KCjAuMjAuMAo9PT09PT0KLSBObyBsb25nZXIgaW5jbHVkZSBjb25zb2xlX3NjcmlwdHMgaW4gd2hlZWxzLiBPcmRpbmFyeSBzY3JpcHRzIChzaGVsbCBmaWxlcywKICBzdGFuZGFsb25lIFB5dGhvbiBmaWxlcykgYXJlIGluY2x1ZGVkIGFzIHVzdWFsLgotIEluY2x1ZGUgbmV3IGNvbW1hbmQgInB5dGhvbiAtbSB3aGVlbCBpbnN0YWxsLXNjcmlwdHMgW2Rpc3RyaWJ1dGlvbgogIFtkaXN0cmlidXRpb24gLi4uXV0iIHRvIGluc3RhbGwgdGhlIGNvbnNvbGVfc2NyaXB0cyAoc2V0dXB0b29scy1zdHlsZQogIHNjcmlwdHMgdXNpbmcgcGtnX3Jlc291cmNlcykgZm9yIGEgZGlzdHJpYnV0aW9uLgoKMC4xOS4wCj09PT09PQotIHB5bWV0YS5qc29uIGJlY29tZXMgcHlkaXN0Lmpzb24KCjAuMTguMAo9PT09PT0KLSBQeXRob24gMyBVbmljb2RlIGltcHJvdmVtZW50cwoKMC4xNy4wCj09PT09PQotIFN1cHBvcnQgbGF0ZXN0IFBFUC00MjYgInB5bWV0YS5qc29uIiAoanNvbi1mb3JtYXQgbWV0YWRhdGEpCgowLjE2LjAKPT09PT09Ci0gUHl0aG9uIDIuNiBjb21wYXRpYmlsaXR5IGJ1Z2ZpeCAodGhhbmtzIEpvaG4gTWNGYXJsYW5lKQotIE5vbi1wcmVyZWxlYXNlIHZlcnNpb24gbnVtYmVyCgoxLjAuMGEyCj09PT09PT0KLSBCdWdmaXggZm9yIEMtZXh0ZW5zaW9uIHRhZ3MgZm9yIENQeXRob24gMy4zICh1c2luZyBTT0FCSSkKCjEuMC4wYTEKPT09PT09PQotIEJ1Z2ZpeCBmb3IgYmRpc3Rfd2luaW5zdCBjb252ZXJ0ZXIgIndoZWVsIGNvbnZlcnQiCi0gQnVnZml4IGZvciBkaXN0cyB3aGVyZSAiaXMgcHVyZSIgaXMgTm9uZSBpbnN0ZWFkIG9mIFRydWUgb3IgRmFsc2UKCjEuMC4wYTAKPT09PT09PQotIFVwZGF0ZSBmb3IgdmVyc2lvbiAxLjAgb2YgV2hlZWwgKFBFUCBhY2NlcHRlZCkuCi0gUHl0aG9uIDMgZml4IGZvciBtb3ZpbmcgVW5pY29kZSBEZXNjcmlwdGlvbiB0byBtZXRhZGF0YSBib2R5Ci0gSW5jbHVkZSBydWRpbWVudGFyeSBBUEkgZG9jdW1lbnRhdGlvbiBpbiBTcGhpbnggKHRoYW5rcyBLZXZpbiBIb3JuKQoKMC4xNS4wCj09PT09PQotIFZhcmlvdXMgaW1wcm92ZW1lbnRzCgowLjE0LjAKPT09PT09Ci0gQ2hhbmdlZCB0aGUgc2lnbmF0dXJlIGZvcm1hdCB0byBiZXR0ZXIgY29tcGx5IHdpdGggdGhlIGN1cnJlbnQgSldTIHNwZWMuCiAgQnJlYWtzIGFsbCBleGlzdGluZyBzaWduYXR1cmVzLgotIEluY2x1ZGUgYGB3aGVlbCB1bnNpZ25gYCBjb21tYW5kIHRvIHJlbW92ZSBSRUNPUkQuandzIGZyb20gYW4gYXJjaGl2ZS4KLSBQdXQgdGhlIGRlc2NyaXB0aW9uIGluIHRoZSBuZXdseSBhbGxvd2VkIHBheWxvYWQgc2VjdGlvbiBvZiBQS0ctSU5GTwogIChNRVRBREFUQSkgZmlsZXMuCgowLjEzLjAKPT09PT09Ci0gVXNlIGRpc3R1dGlscyBpbnN0ZWFkIG9mIHN5c2NvbmZpZyB0byBnZXQgaW5zdGFsbGF0aW9uIHBhdGhzOyBjYW4gaW5zdGFsbAogIGhlYWRlcnMuCi0gSW1wcm92ZSBXaGVlbEZpbGUoKSBzb3J0LgotIEFsbG93IGJvb3RzdHJhcCBpbnN0YWxscyB3aXRob3V0IGFueSBwa2dfcmVzb3VyY2VzLgoKMC4xMi4wCj09PT09PQotIFVuaXQgdGVzdCBmb3Igd2hlZWwudG9vbC5pbnN0YWxsCgowLjExLjAKPT09PT09Ci0gQVBJIGNsZWFudXAKCjAuMTAuMwo9PT09PT0KLSBTY3JpcHRzIGZpeGVyIGZpeAoKMC4xMC4yCj09PT09PQotIEZpeCBrZXlnZW4KCjAuMTAuMQo9PT09PT0KLSBQcmVzZXJ2ZSBhdHRyaWJ1dGVzIG9uIGluc3RhbGwuCgowLjEwLjAKPT09PT09Ci0gSW5jbHVkZSBhIGNvcHkgb2YgcGtnX3Jlc291cmNlcy4gV2hlZWwgY2FuIG5vdyBpbnN0YWxsIGludG8gYSB2aXJ0dWFsZW52CiAgdGhhdCBkb2VzIG5vdCBoYXZlIGRpc3RyaWJ1dGUgKHRob3VnaCBtb3N0IHBhY2thZ2VzIHN0aWxsIHJlcXVpcmUKICBwa2dfcmVzb3VyY2VzIHRvIGFjdHVhbGx5IHdvcms7IHdoZWVsIGluc3RhbGwgZGlzdHJpYnV0ZSkKLSBEZWZpbmUgYSBuZXcgc2V0dXAuY2ZnIHNlY3Rpb24gW3doZWVsXS4gdW5pdmVyc2FsPTEgd2lsbAogIGFwcGx5IHRoZSBweTIucHkzLW5vbmUtYW55IHRhZyBmb3IgcHVyZSBweXRob24gd2hlZWxzLgoKMC45LjcKPT09PT0KLSBPbmx5IGltcG9ydCBkaXJzcGVjIHdoZW4gbmVlZGVkLiBkaXJzcGVjIGlzIG9ubHkgbmVlZGVkIHRvIGZpbmQgdGhlCiAgY29uZmlndXJhdGlvbiBmb3Iga2V5Z2VuL3NpZ25pbmcgb3BlcmF0aW9ucy4KCjAuOS42Cj09PT09Ci0gcmVxdWlyZXMtZGlzdCBmcm9tIHNldHVwLmNmZyBvdmVyd3JpdGVzIGFueSByZXF1aXJlbWVudHMgZnJvbSBzZXR1cC5weQogIENhcmUgbXVzdCBiZSB0YWtlbiB0aGF0IHRoZSByZXF1aXJlbWVudHMgYXJlIHRoZSBzYW1lIGluIGJvdGggY2FzZXMsCiAgb3IganVzdCBhbHdheXMgaW5zdGFsbCBmcm9tIHdoZWVsLgotIGRyb3AgZGlyc3BlYyByZXF1aXJlbWVudCBvbiB3aW4zMgotIGltcHJvdmVkIGNvbW1hbmQgbGluZSB1dGlsaXR5LCBhZGRzICd3aGVlbCBjb252ZXJ0IFtlZ2cgb3Igd2luaW5zdF0nIHRvCiAgY29udmVydCBsZWdhY3kgYmluYXJ5IGZvcm1hdHMgdG8gd2hlZWwKCjAuOS41Cj09PT09Ci0gV2hlZWwncyBvd24gd2hlZWwgZmlsZSBjYW4gYmUgZXhlY3V0ZWQgYnkgUHl0aG9uLCBhbmQgY2FuIGluc3RhbGwgaXRzZWxmOgogIGBgcHl0aG9uIHdoZWVsLTAuOS41LXB5Mjctbm9uZS1hbnkvd2hlZWwgaW5zdGFsbCAuLi5gYAotIFVzZSBhcmdwYXJzZTsgYmFzaWMgYGB3aGVlbCBpbnN0YWxsYGAgY29tbWFuZCBzaG91bGQgcnVuIHdpdGggb25seSBzdGRsaWIKICBkZXBlbmRlbmNpZXMuCi0gQWxsb3cgcmVxdWlyZXNfZGlzdCBpbiBzZXR1cC5jZmcncyBbbWV0YWRhdGFdIHNlY3Rpb24uIEluIGFkZGl0aW9uIHRvCiAgZGVwZW5kZW5jaWVzIGluIHNldHVwLnB5LCBidXQgd2lsbCBvbmx5IGJlIGludGVycHJldGVkIHdoZW4gaW5zdGFsbGluZwogIGZyb20gd2hlZWwsIG5vdCBmcm9tIHNkaXN0LiBDYW4gYmUgcXVhbGlmaWVkIHdpdGggZW52aXJvbm1lbnQgbWFya2Vycy4KCjAuOS40Cj09PT09Ci0gRml4IHdoZWVsLnNpZ25hdHVyZXMgaW4gc2Rpc3QKCjAuOS4zCj09PT09Ci0gSW50ZWdyYXRlZCBkaWdpdGFsIHNpZ25hdHVyZXMgc3VwcG9ydCB3aXRob3V0IEMgZXh0ZW5zaW9ucy4KLSBJbnRlZ3JhdGVkICJ3aGVlbCBpbnN0YWxsIiBjb21tYW5kIChzaW5nbGUgcGFja2FnZSwgbm8gZGVwZW5kZW5jeQogIHJlc29sdXRpb24pIGluY2x1ZGluZyBjb21wYXRpYmlsaXR5IGNoZWNrLgotIFN1cHBvcnQgUHl0aG9uIDMuMwotIFVzZSBNZXRhZGF0YSAxLjMgKFBFUCA0MjYpCgowLjkuMgo9PT09PQotIEF1dG9tYXRpYyBzaWduaW5nIGlmIFdIRUVMX1RPT0wgcG9pbnRzIHRvIHRoZSB3aGVlbCBiaW5hcnkKLSBFdmVuIG1vcmUgUHl0aG9uIDMgZml4ZXMKCjAuOS4xCj09PT09Ci0gJ3doZWVsIHNpZ24nIHVzZXMgdGhlIGtleXMgZ2VuZXJhdGVkIGJ5ICd3aGVlbCBrZXlnZW4nIChpbnN0ZWFkIG9mIGdlbmVyYXRpbmcKICBhIG5ldyBrZXkgYXQgcmFuZG9tIGVhY2ggdGltZSkKLSBQeXRob24gMi8zIGVuY29kaW5nL2RlY29kaW5nIGZpeGVzCi0gUnVuIHRlc3RzIG9uIFB5dGhvbiAyLjYgKHdpdGhvdXQgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbikKCjAuOQo9PT0KLSBVcGRhdGVkIGRpZ2l0YWwgc2lnbmF0dXJlcyBzY2hlbWUKLSBQeXRob24gMyBzdXBwb3J0IGZvciBkaWdpdGFsIHNpZ25hdHVyZXMKLSBBbHdheXMgdmVyaWZ5IFJFQ09SRCBoYXNoZXMgb24gZXh0cmFjdAotICJ3aGVlbCIgY29tbWFuZCBsaW5lIHRvb2wgdG8gc2lnbiwgdmVyaWZ5LCB1bnBhY2sgd2hlZWwgZmlsZXMKCjAuOAo9PT0KLSBub25lL2FueSBkcmFmdCBwZXAgdGFncyB1cGRhdGUKLSBpbXByb3ZlZCB3aW5pbnN0MndoZWVsIHNjcmlwdAotIGRvYyBjaGFuZ2VzIGFuZCBvdGhlciBpbXByb3ZlbWVudHMKCjAuNwo9PT0KLSBzb3J0IC5kaXN0LWluZm8gYXQgZW5kIG9mIHdoZWVsIGFyY2hpdmUKLSBXaW5kb3dzICYgUHl0aG9uIDMgZml4ZXMgZnJvbSBQYXVsIE1vb3JlCi0gcGVwOAotIHNjcmlwdHMgdG8gY29udmVydCB3aW5pbnN0ICYgZWdnIHRvIHdoZWVsCgowLjYKPT09Ci0gcmVxdWlyZSBkaXN0cmlidXRlID49IDAuNi4yOAotIHN0b3AgdXNpbmcgdmVybGliCgowLjUKPT09Ci0gd29ya2luZyBwcmV0dHkgd2VsbAoKMC40LjIKPT09PT0KLSBoeXBoZW5hdGVkIG5hbWUgZml4CgowLjQKPT09Ci0gaW1wcm92ZSB0ZXN0IGNvdmVyYWdlCi0gaW1wcm92ZSBXaW5kb3dzIGNvbXBhdGliaWxpdHkKLSBpbmNsdWRlIHRveC5pbmkgY291cnRlc3kgb2YgTWFyYyBBYnJhbW93aXR6Ci0gZHJhZnQgaG1hYyBzaGEtMjU2IHNpZ25pbmcgZnVuY3Rpb24KCjAuMwo9PT0KLSBwcm90b3R5cGUgZWdnMndoZWVsIGNvbnZlcnNpb24gc2NyaXB0CgowLjIKPT09Ci0gUHl0aG9uIDMgY29tcGF0aWJpbGl0eQoKMC4xCj09PQotIEluaXRpYWwgdmVyc2lvbgoKClBLAwQUAAAAAAAAACEApw+7Fp0PAACdDwAANAAAAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsLTAuMzAuMGEwLmRpc3QtaW5mby9SRUNPUkR3aGVlbC9fX2luaXRfXy5weSxzaGEyNTY9ZG1ib1VEZnBiV3hlcmNWWGJiUUVMc1QxTDRaUXlPSFF2SktqdmNBS1l0Yyw5OQ0Kd2hlZWwvX19tYWluX18ucHksc2hhMjU2PUxiRERHSWQwOHFUeHVoTFlxWDVtWE8xTVVzOUQtSGh4YjVOVmM1M2VqMGssNDE2DQp3aGVlbC9hcmNoaXZlLnB5LHNoYTI1Nj1PNnVYay16Sjh5NFktMHJDb0hQN0NMS2xQcFdRQkg0NHplUmVnYUs4RkpvLDIyNDcNCndoZWVsL2JkaXN0X3doZWVsLnB5LHNoYTI1Nj11c2RGa1p2UW9wSy1TeF8zbDBURU0yWm0zM0J3MUNfb2JUSVV6N0pNN3BJLDE4NDA4DQp3aGVlbC9kZWNvcmF0b3IucHksc2hhMjU2PVUySzc3Wlo4eDN4NXZTSUdDY0VlaDhHQXhCNnJBQkI3QWxEd1J1a2FvQ2ssNTQxDQp3aGVlbC9lZ2cyd2hlZWwucHksc2hhMjU2PS03TTJKRmkyM2taLWtoYk53azFpVkw4UDE0TkZkYkFoTWMxU0hobloyZkEsMzAyNw0Kd2hlZWwvZWdnbmFtZXMudHh0LHNoYTI1Nj1YNkxZc09qTWQ4bGxyekxvM1NCM0Z3Si11TjlJc2tKcVlLSkRxMnpJY2JzLDI0OTANCndoZWVsL2luc3RhbGwucHksc2hhMjU2PWRDUjdJSG1lQXJMamdiMHlGOVltTWgzX3FJai1DOWoxcDN1UFNycHpaTzgsMTgwOTgNCndoZWVsL21ldGFkYXRhLnB5LHNoYTI1Nj1Pejh4MlZEMHhMYmFXSDA2eVRSQ2IzdlNkV25XdnBQT3dZMm85RDhpRkdVLDExNjc2DQp3aGVlbC9wYXRocy5weSxzaGEyNTY9NkFtRy1NS3gtTmVKT0M5elVKb1NTWmpZaFpZR21YMVVIR19OMElia3BsSSwxMTMwDQp3aGVlbC9wZXA0MjV0YWdzLnB5LHNoYTI1Nj1wQTFleWIxSE9BbXdTaVhUbWZRaG1BY2tma25odEVlbExEWk9jVktaYUUwLDU4MjkNCndoZWVsL3BrZ2luZm8ucHksc2hhMjU2PS1nTE9UdVFya1JmNGdlT0QwNHFtMElVa2RZQWJqZzgxai01ek50dldBOUEsMTIyNQ0Kd2hlZWwvdXRpbC5weSxzaGEyNTY9UGUySlo5Z3JOam1BY1JSSmF5MjBGbERWSlViZVBXYVI1bHR5U28zYzZ6USw0ODkwDQp3aGVlbC93aW5pbnN0MndoZWVsLnB5LHNoYTI1Nj14VmZFRUtiUzRoTXB2LXdnT1FpYjRuMHBTcGdycGpuckJESDJKRFNOY3JFLDc4NjMNCndoZWVsL3NpZ25hdHVyZXMvX19pbml0X18ucHksc2hhMjU2PWtacEtOc214QkRaaHVYZjg1X3V5eTVxQkg0MEF4VlRfMHV0YkFpVHBfeWcsMzc3OQ0Kd2hlZWwvc2lnbmF0dXJlcy9kamJlYy5weSxzaGEyNTY9NTNIVG5sTmxmcU9IRkRmOE9ZXzZLTDhzeFI0c3dpTHNXaFVqdHczVzNuSSw2NzU1DQp3aGVlbC9zaWduYXR1cmVzL2VkMjU1MTlweS5weSxzaGEyNTY9U2VUeGlNWjdrbW9NZEl1ckJTYUtiOEt1LWFtR25mNlpUUkdFbEx6VjhpSSwxNjk1DQp3aGVlbC9zaWduYXR1cmVzL2tleXMucHksc2hhMjU2PVE4RkxWeTVkaXhEaXktNW9fUm1sc0RoZ1lkRXJUQ3A1YzNaOHg3MFgxc2csMzMxNg0Kd2hlZWwvdGVzdC9fX2luaXRfXy5weSxzaGEyNTY9TTBOWnVRNy0xMTJsOEsyaDFlYXlWdlNtdlFydWZyT2NENUFZS2dJZl9JcywxDQp3aGVlbC90ZXN0L2NvbmZ0ZXN0LnB5LHNoYTI1Nj1TNzNuSHRvdFJyNl9PR0JYbWVXUFZkalZtVktaYXo0dWk0TFBZZDBhUDlVLDE2ODkNCndoZWVsL3Rlc3QvcHlkaXN0LXNjaGVtYS5qc29uLHNoYTI1Nj15bkV2TnZUaEMxelJhN0Zpb01zVzNrLTlubDk4eXRFb28xXzN4Yk9QMmVvLDExNDgzDQp3aGVlbC90ZXN0L3Rlc3QtMS4wLXB5Mi5weTMtbm9uZS13aW4zMi53aGwsc2hhMjU2PUpDX1VYVE41S2xMcmR1NDN1SDRjYVpTVXl6cnRQY1VzUmUtdlRNdW5wbEUsNTIyNg0Kd2hlZWwvdGVzdC90ZXN0X2Jhc2ljLnB5LHNoYTI1Nj1hMXVSdTRNWlBiRUVLeVVzS1l2R3R6NHFqNEtYM0U3N1Y2Sm1YSkxkWC1rLDY1MDkNCndoZWVsL3Rlc3QvdGVzdF9pbnN0YWxsLnB5LHNoYTI1Nj1jMEVFQ1hQa1ZJR2hDRDlWNWFkMnFzQlBSUFliMWVoaGFTMGs2R3Y1SlFjLDE4NjYNCndoZWVsL3Rlc3QvdGVzdF9rZXlzLnB5LHNoYTI1Nj01bUJjOXRmMlR3QzNUQ3B4MXlTVFlzQ2U1eXZkNmtNSzY0QWxVVUNjS0VZLDI1NzUNCndoZWVsL3Rlc3QvdGVzdF9wYXRocy5weSxzaGEyNTY9LVFPVlVERkpJcEY5T1BOUnpDSi1YZjRuQmliS2xVZV9nNGFhWjZzbTN3RSwxNzINCndoZWVsL3Rlc3QvdGVzdF9yYW5raW5nLnB5LHNoYTI1Nj1GU0FRWDRvSFo0NzZqTGRkcVZNbEdtUUZ0YkVlbDlhOFN6T25nSjAzVEp3LDE0OTYNCndoZWVsL3Rlc3QvdGVzdF9zaWduYXR1cmVzLnB5LHNoYTI1Nj1aNFJFWGo2MnAyOGdiU0RCMkRfT3hvcEEtVFRYSUNUWjVlMnlaM2VqRVZjLDExMjANCndoZWVsL3Rlc3QvdGVzdF90YWdvcHQucHksc2hhMjU2PXQ3QS1pUmJlM2JIMkl6Nk5LZFNFT3BGRklGU0Y5STRBVG1sclJCWG9DY1EsNTkyNw0Kd2hlZWwvdGVzdC90ZXN0X3Rvb2wucHksc2hhMjU2PXl0NWRBcjhtcDUxV29EenQwTW1sd1BrMHhmN0Z2WEFlZHktWWxOWlh2MUksNjU2DQp3aGVlbC90ZXN0L3Rlc3Rfd2hlZWxmaWxlLnB5LHNoYTI1Nj14NGV4elFZdVFCNDhZSHFoVTJOWnlONzZrLUJTSzY3ODQtN3J5ZTBxNlNzLDQ1ODUNCndoZWVsL3Rlc3QvY29tcGxleC1kaXN0L3NldHVwLnB5LHNoYTI1Nj00aTFfQUpvSnhvNGk2aWstbXZ5ZG8yM0FGOEJIemptQUVRWWE1SjRZUEs0LDg1NQ0Kd2hlZWwvdGVzdC9jb21wbGV4LWRpc3QvY29tcGxleGRpc3QvX19pbml0X18ucHksc2hhMjU2PVBHREpXUVR4akxYcW5OcmJxbVRLS195azZEVlFCTmVScC1ZcFA3dzFyVmssMjMNCndoZWVsL3Rlc3QvZXh0ZW5zaW9uLmRpc3Qvc2V0dXAucHksc2hhMjU2PXBkUmwtd3ZxNU9WTUcwNDNYcldad3o0Zml2RlpXZFdNTndMOGR5S2JUMGMsNDU2DQp3aGVlbC90ZXN0L2hlYWRlcnMuZGlzdC9oZWFkZXIuaCxzaGEyNTY9NDdERVFwajhIQlNhLV9USW1XLTVKQ2V1UWVSa201Tk1wSldaRzNoU3VGVSwwDQp3aGVlbC90ZXN0L2hlYWRlcnMuZGlzdC9oZWFkZXJzZGlzdC5weSxzaGEyNTY9NDdERVFwajhIQlNhLV9USW1XLTVKQ2V1UWVSa201Tk1wSldaRzNoU3VGVSwwDQp3aGVlbC90ZXN0L2hlYWRlcnMuZGlzdC9zZXR1cC5weSxzaGEyNTY9cDNkOVRHeTdOTFg2VG5rQkhuTkh6ZWRxWW9Pa2RHUXZ3aGV5RFFqZi1KUSwzMjQNCndoZWVsL3Rlc3Qvc2ltcGxlLmRpc3Qvc2V0dXAucHksc2hhMjU2PTh6V2VuNzFVbS1pTl9BNXRob3Q2VkZvZ3JrV3NfUkdWTy1qcl9NeGtGb2csMzgzDQp3aGVlbC90ZXN0L3NpbXBsZS5kaXN0L3NpbXBsZWRpc3QvX19pbml0X18ucHksc2hhMjU2PTQ3REVRcGo4SEJTYS1fVEltVy01SkNldVFlUmttNU5NcEpXWkczaFN1RlUsMA0Kd2hlZWwvdG9vbC9fX2luaXRfXy5weSxzaGEyNTY9cDB1bmw5TWdyYmtaWVZPRFZ4RUtNV1JJOVlhMU1fdVhjcVhuWEh6STREaywxMzIxNw0Kd2hlZWwtMC4zMC4wYTAuZGlzdC1pbmZvL0RFU0NSSVBUSU9OLnJzdCxzaGEyNTY9Skg2bW9nVUlhdFFWUWV3SWg0R0IxeXdDeHVXYm03RzRUaklfNjNkVVJwOCw5ODEzDQp3aGVlbC0wLjMwLjBhMC5kaXN0LWluZm8vTElDRU5TRS50eHQsc2hhMjU2PXpLbmlER3J4X1B2MmxBanpkM2FTaHN2dXZON1ROaEFNbTBvX05mdm1OZVEsMTEyNQ0Kd2hlZWwtMC4zMC4wYTAuZGlzdC1pbmZvL01FVEFEQVRBLHNoYTI1Nj1peDl6TjVmYTRqZU9EUXJuNjRmVUFRYV91bHJtUnBoaTRTS0hBWVVxdE53LDExMDIxDQp3aGVlbC0wLjMwLjBhMC5kaXN0LWluZm8vUkVDT1JELCwNCndoZWVsLTAuMzAuMGEwLmRpc3QtaW5mby9XSEVFTCxzaGEyNTY9NXd2ZkI3R3ZnWkFiS0JTRTl1WDlaYmk2TENMLV9LZ2V6Z0hibFhoQ1JuTSwxMTMNCndoZWVsLTAuMzAuMGEwLmRpc3QtaW5mby9lbnRyeV9wb2ludHMudHh0LHNoYTI1Nj1wVHllR1ZzdWN5ZnJfQlhlNU9RS3VBMUJwNVlLYUlBV3k1cGVqa3E0UXgwLDEwOQ0Kd2hlZWwtMC4zMC4wYTAuZGlzdC1pbmZvL21ldGFkYXRhLmpzb24sc2hhMjU2PXhfbVpqTHpPYVljZXptbnJTdkc2N2QwN1NocGNSRmRyZ1dlVWU2enBMNVksMTYyNg0Kd2hlZWwtMC4zMC4wYTAuZGlzdC1pbmZvL3RvcF9sZXZlbC50eHQsc2hhMjU2PUh4U0JJYmdFc3RNUGU0ZUZhd2hBNjZNcS1RWUhNb3BYVm9BbmNmamJfMWMsNg0KUEsDBBQAAAAAAAAAIQCU35Z7cQAAAHEAAAAzAAAAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwtMC4zMC4wYTAuZGlzdC1pbmZvL1dIRUVMV2hlZWwtVmVyc2lvbjogMS4wCkdlbmVyYXRvcjogYmRpc3Rfd2hlZWwgKDAuMzAuMC5hMCkKUm9vdC1Jcy1QdXJlbGliOiB0cnVlClRhZzogcHkyLW5vbmUtYW55ClRhZzogcHkzLW5vbmUtYW55CgpQSwMEFAAAAAAAAAAhAOJF36xtAAAAbQAAAD4AAABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC0wLjMwLjBhMC5kaXN0LWluZm8vZW50cnlfcG9pbnRzLnR4dFtjb25zb2xlX3NjcmlwdHNdCndoZWVsID0gd2hlZWwudG9vbDptYWluCgpbZGlzdHV0aWxzLmNvbW1hbmRzXQpiZGlzdF93aGVlbCA9IHdoZWVsLmJkaXN0X3doZWVsOmJkaXN0X3doZWVsCgpQSwMEFAAAAAAAAAAhAFKyTtZaBgAAWgYAADsAAABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC0wLjMwLjBhMC5kaXN0LWluZm8vbWV0YWRhdGEuanNvbnsiY2xhc3NpZmllcnMiOiBbIkRldmVsb3BtZW50IFN0YXR1cyA6OiA0IC0gQmV0YSIsICJJbnRlbmRlZCBBdWRpZW5jZSA6OiBEZXZlbG9wZXJzIiwgIlByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiIsICJQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMiIsICJQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMi42IiwgIlByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAyLjciLCAiUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMiLCAiUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuMiIsICJQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMy4zIiwgIlByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjQiXSwgImV4dGVuc2lvbnMiOiB7InB5dGhvbi5jb21tYW5kcyI6IHsid3JhcF9jb25zb2xlIjogeyJ3aGVlbCI6ICJ3aGVlbC50b29sOm1haW4ifX0sICJweXRob24uZGV0YWlscyI6IHsiY29udGFjdHMiOiBbeyJlbWFpbCI6ICJkaG9sdGhAZmFzdG1haWwuZm0iLCAibmFtZSI6ICJEYW5pZWwgSG9sdGgiLCAicm9sZSI6ICJhdXRob3IifV0sICJkb2N1bWVudF9uYW1lcyI6IHsiZGVzY3JpcHRpb24iOiAiREVTQ1JJUFRJT04ucnN0IiwgImxpY2Vuc2UiOiAiTElDRU5TRS50eHQifSwgInByb2plY3RfdXJscyI6IHsiSG9tZSI6ICJodHRwczovL2JpdGJ1Y2tldC5vcmcvcHlwYS93aGVlbC8ifX0sICJweXRob24uZXhwb3J0cyI6IHsiY29uc29sZV9zY3JpcHRzIjogeyJ3aGVlbCI6ICJ3aGVlbC50b29sOm1haW4ifSwgImRpc3R1dGlscy5jb21tYW5kcyI6IHsiYmRpc3Rfd2hlZWwiOiAid2hlZWwuYmRpc3Rfd2hlZWw6YmRpc3Rfd2hlZWwifX19LCAiZXh0cmFzIjogWyJmYXN0ZXItc2lnbmF0dXJlcyIsICJzaWduYXR1cmVzIiwgInRvb2wiXSwgImdlbmVyYXRvciI6ICJiZGlzdF93aGVlbCAoMC4zMC4wLmEwKSIsICJrZXl3b3JkcyI6IFsid2hlZWwiLCAicGFja2FnaW5nIl0sICJsaWNlbnNlIjogIk1JVCIsICJtZXRhZGF0YV92ZXJzaW9uIjogIjIuMCIsICJuYW1lIjogIndoZWVsIiwgInJ1bl9yZXF1aXJlcyI6IFt7ImV4dHJhIjogImZhc3Rlci1zaWduYXR1cmVzIiwgInJlcXVpcmVzIjogWyJlZDI1NTE5bGwiXX0sIHsiZXh0cmEiOiAic2lnbmF0dXJlcyIsICJyZXF1aXJlcyI6IFsia2V5cmluZyIsICJrZXlyaW5ncy5hbHQiXX0sIHsiZW52aXJvbm1lbnQiOiAicHl0aG9uX3ZlcnNpb249PVwiMi42XCIiLCAicmVxdWlyZXMiOiBbImFyZ3BhcnNlIl19LCB7ImVudmlyb25tZW50IjogInB5dGhvbl92ZXJzaW9uPT1cIjIuNlwiIiwgImV4dHJhIjogInNpZ25hdHVyZXMiLCAicmVxdWlyZXMiOiBbImltcG9ydGxpYiJdfSwgeyJlbnZpcm9ubWVudCI6ICJzeXNfcGxhdGZvcm0hPVwid2luMzJcIiIsICJleHRyYSI6ICJzaWduYXR1cmVzIiwgInJlcXVpcmVzIjogWyJweXhkZyJdfV0sICJzdW1tYXJ5IjogIkEgYnVpbHQtcGFja2FnZSBmb3JtYXQgZm9yIFB5dGhvbi4iLCAidGVzdF9yZXF1aXJlcyI6IFt7InJlcXVpcmVzIjogWyJjb3ZlcmFnZSIsICJqc29uc2NoZW1hIiwgInB5dGVzdCIsICJweXRlc3QtY292Il19XSwgInZlcnNpb24iOiAiMC4zMC4wYTAifVBLAwQUAAAAAAAAACEAGWPeZQYAAAAGAAAAOwAAAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsLTAuMzAuMGEwLmRpc3QtaW5mby90b3BfbGV2ZWwudHh0d2hlZWwKUEsDBBQAAAAAAAAAIQBhN6VHYwAAAGMAAAAmAAAAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvX19pbml0X18ucHkjIF9fdmFyaWFibGVzX18gd2l0aCBkb3VibGUtcXVvdGVkIHZhbHVlcyB3aWxsIGJlIGF2YWlsYWJsZSBpbiBzZXR1cC5weToKX192ZXJzaW9uX18gPSAiMC4zMC4wLmEwIgpQSwMEFAAAAAAAAAAhACRpt1SgAQAAoAEAACYAAABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC9fX21haW5fXy5weSIiIgpXaGVlbCBjb21tYW5kIGxpbmUgdG9vbCAoZW5hYmxlIHB5dGhvbiAtbSB3aGVlbCBzeW50YXgpCiIiIgoKaW1wb3J0IHN5cwoKZGVmIG1haW4oKTogIyBuZWVkZWQgZm9yIGNvbnNvbGUgc2NyaXB0CiAgICBpZiBfX3BhY2thZ2VfXyA9PSAnJzoKICAgICAgICAjIFRvIGJlIGFibGUgdG8gcnVuICdweXRob24gd2hlZWwtMC45LndobC93aGVlbCc6CiAgICAgICAgaW1wb3J0IG9zLnBhdGgKICAgICAgICBwYXRoID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpCiAgICAgICAgc3lzLnBhdGhbMDowXSA9IFtwYXRoXQogICAgaW1wb3J0IHdoZWVsLnRvb2wKICAgIHN5cy5leGl0KHdoZWVsLnRvb2wubWFpbigpKQoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgIHN5cy5leGl0KG1haW4oKSkKUEsDBBQAAAAAAAAAIQAgU4JSxwgAAMcIAAAlAAAAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvYXJjaGl2ZS5weSIiIgpBcmNoaXZlIHRvb2xzIGZvciB3aGVlbC4KIiIiCgppbXBvcnQgb3MKaW1wb3J0IHRpbWUKaW1wb3J0IGxvZ2dpbmcKaW1wb3J0IG9zLnBhdGgKaW1wb3J0IHppcGZpbGUKCmxvZyA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJ3aGVlbCIpCgoKZGVmIGFyY2hpdmVfd2hlZWxmaWxlKGJhc2VfbmFtZSwgYmFzZV9kaXIpOgogICAgJycnQXJjaGl2ZSBhbGwgZmlsZXMgdW5kZXIgYGJhc2VfZGlyYCBpbiBhIHdobCBmaWxlIGFuZCBuYW1lIGl0IGxpa2UKICAgIGBiYXNlX25hbWVgLgogICAgJycnCiAgICBvbGRkaXIgPSBvcy5wYXRoLmFic3BhdGgob3MuY3VyZGlyKQogICAgYmFzZV9uYW1lID0gb3MucGF0aC5hYnNwYXRoKGJhc2VfbmFtZSkKICAgIHRyeToKICAgICAgICBvcy5jaGRpcihiYXNlX2RpcikKICAgICAgICByZXR1cm4gbWFrZV93aGVlbGZpbGVfaW5uZXIoYmFzZV9uYW1lKQogICAgZmluYWxseToKICAgICAgICBvcy5jaGRpcihvbGRkaXIpCgoKZGVmIG1ha2Vfd2hlZWxmaWxlX2lubmVyKGJhc2VfbmFtZSwgYmFzZV9kaXI9Jy4nKToKICAgICIiIkNyZWF0ZSBhIHdobCBmaWxlIGZyb20gYWxsIHRoZSBmaWxlcyB1bmRlciAnYmFzZV9kaXInLgoKICAgIFBsYWNlcyAuZGlzdC1pbmZvIGF0IHRoZSBlbmQgb2YgdGhlIGFyY2hpdmUuIiIiCgogICAgemlwX2ZpbGVuYW1lID0gYmFzZV9uYW1lICsgIi53aGwiCgogICAgbG9nLmluZm8oImNyZWF0aW5nICclcycgYW5kIGFkZGluZyAnJXMnIHRvIGl0IiwgemlwX2ZpbGVuYW1lLCBiYXNlX2RpcikKCiAgICAjIFNvbWUgYXBwbGljYXRpb25zIG5lZWQgcmVwcm9kdWNpYmxlIC53aGwgZmlsZXMsIGJ1dCB0aGV5IGNhbid0IGRvIHRoaXMKICAgICMgd2l0aG91dCBmb3JjaW5nIHRoZSB0aW1lc3RhbXAgb2YgdGhlIGluZGl2aWR1YWwgWmlwSW5mbyBvYmplY3RzLiAgU2VlCiAgICAjIGlzc3VlICMxNDMuCiAgICB0aW1lc3RhbXAgPSBvcy5lbnZpcm9uLmdldCgnU09VUkNFX0RBVEVfRVBPQ0gnKQogICAgaWYgdGltZXN0YW1wIGlzIE5vbmU6CiAgICAgICAgZGF0ZV90aW1lID0gTm9uZQogICAgZWxzZToKICAgICAgICBkYXRlX3RpbWUgPSB0aW1lLmdtdGltZShpbnQodGltZXN0YW1wKSlbMDo2XQoKICAgICMgWFhYIHN1cHBvcnQgYnoyLCB4eiB3aGVuIGF2YWlsYWJsZQogICAgemlwID0gemlwZmlsZS5aaXBGaWxlKHppcF9maWxlbmFtZSwgInciLCBjb21wcmVzc2lvbj16aXBmaWxlLlpJUF9ERUZMQVRFRCkKCiAgICBzY29yZSA9IHsnV0hFRUwnOiAxLCAnTUVUQURBVEEnOiAyLCAnUkVDT1JEJzogM30KICAgIGRlZmVycmVkID0gW10KCiAgICBkZWYgd3JpdGVmaWxlKHBhdGgsIGRhdGVfdGltZSk6CiAgICAgICAgc3QgPSBvcy5zdGF0KHBhdGgpCiAgICAgICAgaWYgZGF0ZV90aW1lIGlzIE5vbmU6CiAgICAgICAgICAgIG10aW1lID0gdGltZS5nbXRpbWUoc3Quc3RfbXRpbWUpCiAgICAgICAgICAgIGRhdGVfdGltZSA9IG10aW1lWzA6Nl0KICAgICAgICB6aW5mbyA9IHppcGZpbGUuWmlwSW5mbyhwYXRoLCBkYXRlX3RpbWUpCiAgICAgICAgemluZm8uZXh0ZXJuYWxfYXR0ciA9IHN0LnN0X21vZGUgPDwgMTYKICAgICAgICB6aW5mby5jb21wcmVzc190eXBlID0gemlwZmlsZS5aSVBfREVGTEFURUQKICAgICAgICB3aXRoIG9wZW4ocGF0aCwgJ3JiJykgYXMgZnA6CiAgICAgICAgICAgIHppcC53cml0ZXN0cih6aW5mbywgZnAucmVhZCgpKQogICAgICAgIGxvZy5pbmZvKCJhZGRpbmcgJyVzJyIgJSBwYXRoKQoKICAgIGZvciBkaXJwYXRoLCBkaXJuYW1lcywgZmlsZW5hbWVzIGluIG9zLndhbGsoYmFzZV9kaXIpOgogICAgICAgIGZvciBuYW1lIGluIGZpbGVuYW1lczoKICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5qb2luKGRpcnBhdGgsIG5hbWUpKQoKICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUocGF0aCk6CiAgICAgICAgICAgICAgICBpZiBkaXJwYXRoLmVuZHN3aXRoKCcuZGlzdC1pbmZvJyk6CiAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQuYXBwZW5kKChzY29yZS5nZXQobmFtZSwgMCksIHBhdGgpKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICB3cml0ZWZpbGUocGF0aCwgZGF0ZV90aW1lKQoKICAgIGRlZmVycmVkLnNvcnQoKQogICAgZm9yIHNjb3JlLCBwYXRoIGluIGRlZmVycmVkOgogICAgICAgIHdyaXRlZmlsZShwYXRoLCBkYXRlX3RpbWUpCgogICAgemlwLmNsb3NlKCkKCiAgICByZXR1cm4gemlwX2ZpbGVuYW1lClBLAwQUAAAAAAAAACEASq8k0ehHAADoRwAAKQAAAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL2JkaXN0X3doZWVsLnB5IiIiCkNyZWF0ZSBhIHdoZWVsICgud2hsKSBkaXN0cmlidXRpb24uCgpBIHdoZWVsIGlzIGEgYnVpbHQgYXJjaGl2ZSBmb3JtYXQuCiIiIgoKaW1wb3J0IGNzdgppbXBvcnQgaGFzaGxpYgppbXBvcnQgb3MKaW1wb3J0IHN1YnByb2Nlc3MKaW1wb3J0IHdhcm5pbmdzCmltcG9ydCBzaHV0aWwKaW1wb3J0IGpzb24KaW1wb3J0IHN5cwppbXBvcnQgcmUKCnRyeToKICAgIGltcG9ydCBzeXNjb25maWcKZXhjZXB0IEltcG9ydEVycm9yOiAgIyBwcmFnbWEgbm9jb3ZlcgogICAgIyBQeXRob24gPCAyLjcKICAgIGltcG9ydCBkaXN0dXRpbHMuc3lzY29uZmlnIGFzIHN5c2NvbmZpZwoKaW1wb3J0IHBrZ19yZXNvdXJjZXMKCnNhZmVfbmFtZSA9IHBrZ19yZXNvdXJjZXMuc2FmZV9uYW1lCnNhZmVfdmVyc2lvbiA9IHBrZ19yZXNvdXJjZXMuc2FmZV92ZXJzaW9uCgpmcm9tIHNodXRpbCBpbXBvcnQgcm10cmVlCmZyb20gZW1haWwuZ2VuZXJhdG9yIGltcG9ydCBHZW5lcmF0b3IKCmZyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IENvbW1hbmQKZnJvbSBkaXN0dXRpbHMuc3lzY29uZmlnIGltcG9ydCBnZXRfcHl0aG9uX3ZlcnNpb24KCmZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cgYXMgbG9nZ2VyCgpmcm9tIC5wZXA0MjV0YWdzIGltcG9ydCBnZXRfYWJicl9pbXBsLCBnZXRfaW1wbF92ZXIsIGdldF9hYmlfdGFnLCBnZXRfcGxhdGZvcm0KZnJvbSAudXRpbCBpbXBvcnQgbmF0aXZlLCBvcGVuX2Zvcl9jc3YKZnJvbSAuYXJjaGl2ZSBpbXBvcnQgYXJjaGl2ZV93aGVlbGZpbGUKZnJvbSAucGtnaW5mbyBpbXBvcnQgcmVhZF9wa2dfaW5mbywgd3JpdGVfcGtnX2luZm8KZnJvbSAubWV0YWRhdGEgaW1wb3J0IHBrZ2luZm9fdG9fZGljdApmcm9tIC4gaW1wb3J0IHBlcDQyNXRhZ3MsIG1ldGFkYXRhCmZyb20gLiBpbXBvcnQgX192ZXJzaW9uX18gYXMgd2hlZWxfdmVyc2lvbgoKUFlfTElNSVRFRF9BUElfUEFUVEVSTiA9IHInY3AzXGQnCgpkZWYgc2FmZXJfbmFtZShuYW1lKToKICAgIHJldHVybiBzYWZlX25hbWUobmFtZSkucmVwbGFjZSgnLScsICdfJykKCmRlZiBzYWZlcl92ZXJzaW9uKHZlcnNpb24pOgogICAgcmV0dXJuIHNhZmVfdmVyc2lvbih2ZXJzaW9uKS5yZXBsYWNlKCctJywgJ18nKQoKY2xhc3MgYmRpc3Rfd2hlZWwoQ29tbWFuZCk6CgogICAgZGVzY3JpcHRpb24gPSAnY3JlYXRlIGEgd2hlZWwgZGlzdHJpYnV0aW9uJwoKICAgIHVzZXJfb3B0aW9ucyA9IFsoJ2JkaXN0LWRpcj0nLCAnYicsCiAgICAgICAgICAgICAgICAgICAgICJ0ZW1wb3JhcnkgZGlyZWN0b3J5IGZvciBjcmVhdGluZyB0aGUgZGlzdHJpYnV0aW9uIiksCiAgICAgICAgICAgICAgICAgICAgKCdwbGF0LW5hbWU9JywgJ3AnLAogICAgICAgICAgICAgICAgICAgICAicGxhdGZvcm0gbmFtZSB0byBlbWJlZCBpbiBnZW5lcmF0ZWQgZmlsZW5hbWVzICIKICAgICAgICAgICAgICAgICAgICAgIihkZWZhdWx0OiAlcykiICUgZ2V0X3BsYXRmb3JtKCkpLAogICAgICAgICAgICAgICAgICAgICgna2VlcC10ZW1wJywgJ2snLAogICAgICAgICAgICAgICAgICAgICAia2VlcCB0aGUgcHNldWRvLWluc3RhbGxhdGlvbiB0cmVlIGFyb3VuZCBhZnRlciAiICsKICAgICAgICAgICAgICAgICAgICAgImNyZWF0aW5nIHRoZSBkaXN0cmlidXRpb24gYXJjaGl2ZSIpLAogICAgICAgICAgICAgICAgICAgICgnZGlzdC1kaXI9JywgJ2QnLAogICAgICAgICAgICAgICAgICAgICAiZGlyZWN0b3J5IHRvIHB1dCBmaW5hbCBidWlsdCBkaXN0cmlidXRpb25zIGluIiksCiAgICAgICAgICAgICAgICAgICAgKCdza2lwLWJ1aWxkJywgTm9uZSwKICAgICAgICAgICAgICAgICAgICAgInNraXAgcmVidWlsZGluZyBldmVyeXRoaW5nIChmb3IgdGVzdGluZy9kZWJ1Z2dpbmcpIiksCiAgICAgICAgICAgICAgICAgICAgKCdyZWxhdGl2ZScsIE5vbmUsCiAgICAgICAgICAgICAgICAgICAgICJidWlsZCB0aGUgYXJjaGl2ZSB1c2luZyByZWxhdGl2ZSBwYXRocyIKICAgICAgICAgICAgICAgICAgICAgIihkZWZhdWx0OiBmYWxzZSkiKSwKICAgICAgICAgICAgICAgICAgICAoJ293bmVyPScsICd1JywKICAgICAgICAgICAgICAgICAgICAgIk93bmVyIG5hbWUgdXNlZCB3aGVuIGNyZWF0aW5nIGEgdGFyIGZpbGUiCiAgICAgICAgICAgICAgICAgICAgICIgW2RlZmF1bHQ6IGN1cnJlbnQgdXNlcl0iKSwKICAgICAgICAgICAgICAgICAgICAoJ2dyb3VwPScsICdnJywKICAgICAgICAgICAgICAgICAgICAgIkdyb3VwIG5hbWUgdXNlZCB3aGVuIGNyZWF0aW5nIGEgdGFyIGZpbGUiCiAgICAgICAgICAgICAgICAgICAgICIgW2RlZmF1bHQ6IGN1cnJlbnQgZ3JvdXBdIiksCiAgICAgICAgICAgICAgICAgICAgKCd1bml2ZXJzYWwnLCBOb25lLAogICAgICAgICAgICAgICAgICAgICAibWFrZSBhIHVuaXZlcnNhbCB3aGVlbCIKICAgICAgICAgICAgICAgICAgICAgIiAoZGVmYXVsdDogZmFsc2UpIiksCiAgICAgICAgICAgICAgICAgICAgKCdweXRob24tdGFnPScsIE5vbmUsCiAgICAgICAgICAgICAgICAgICAgICJQeXRob24gaW1wbGVtZW50YXRpb24gY29tcGF0aWJpbGl0eSB0YWciCiAgICAgICAgICAgICAgICAgICAgICIgKGRlZmF1bHQ6IHB5JXMpIiAlIGdldF9pbXBsX3ZlcigpWzBdKSwKICAgICAgICAgICAgICAgICAgICAoJ3B5LWxpbWl0ZWQtYXBpPScsIE5vbmUsCiAgICAgICAgICAgICAgICAgICAgICJQeXRob24gdGFnIChjcDMyfGNwMzN8Y3BOTikgZm9yIGFiaTMgd2hlZWwgdGFnIgogICAgICAgICAgICAgICAgICAgICAiIChkZWZhdWx0OiBmYWxzZSkiKSwKICAgICAgICAgICAgICAgICAgICBdCgogICAgYm9vbGVhbl9vcHRpb25zID0gWydrZWVwLXRlbXAnLCAnc2tpcC1idWlsZCcsICdyZWxhdGl2ZScsICd1bml2ZXJzYWwnXQoKICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CiAgICAgICAgc2VsZi5iZGlzdF9kaXIgPSBOb25lCiAgICAgICAgc2VsZi5kYXRhX2RpciA9IE5vbmUKICAgICAgICBzZWxmLnBsYXRfbmFtZSA9IE5vbmUKICAgICAgICBzZWxmLnBsYXRfdGFnID0gTm9uZQogICAgICAgIHNlbGYuZm9ybWF0ID0gJ3ppcCcKICAgICAgICBzZWxmLmtlZXBfdGVtcCA9IEZhbHNlCiAgICAgICAgc2VsZi5kaXN0X2RpciA9IE5vbmUKICAgICAgICBzZWxmLmRpc3RpbmZvX2RpciA9IE5vbmUKICAgICAgICBzZWxmLmVnZ2luZm9fZGlyID0gTm9uZQogICAgICAgIHNlbGYucm9vdF9pc19wdXJlID0gTm9uZQogICAgICAgIHNlbGYuc2tpcF9idWlsZCA9IE5vbmUKICAgICAgICBzZWxmLnJlbGF0aXZlID0gRmFsc2UKICAgICAgICBzZWxmLm93bmVyID0gTm9uZQogICAgICAgIHNlbGYuZ3JvdXAgPSBOb25lCiAgICAgICAgc2VsZi51bml2ZXJzYWwgPSBGYWxzZQogICAgICAgIHNlbGYucHl0aG9uX3RhZyA9ICdweScgKyBnZXRfaW1wbF92ZXIoKVswXQogICAgICAgIHNlbGYucHlfbGltaXRlZF9hcGkgPSBGYWxzZQogICAgICAgIHNlbGYucGxhdF9uYW1lX3N1cHBsaWVkID0gRmFsc2UKCiAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKICAgICAgICBpZiBzZWxmLmJkaXN0X2RpciBpcyBOb25lOgogICAgICAgICAgICBiZGlzdF9iYXNlID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2JkaXN0JykuYmRpc3RfYmFzZQogICAgICAgICAgICBzZWxmLmJkaXN0X2RpciA9IG9zLnBhdGguam9pbihiZGlzdF9iYXNlLCAnd2hlZWwnKQoKICAgICAgICBzZWxmLmRhdGFfZGlyID0gc2VsZi53aGVlbF9kaXN0X25hbWUgKyAnLmRhdGEnCiAgICAgICAgc2VsZi5wbGF0X25hbWVfc3VwcGxpZWQgPSBzZWxmLnBsYXRfbmFtZSBpcyBub3QgTm9uZQoKICAgICAgICBuZWVkX29wdGlvbnMgPSAoJ2Rpc3RfZGlyJywgJ3BsYXRfbmFtZScsICdza2lwX2J1aWxkJykKCiAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoJ2JkaXN0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqemlwKG5lZWRfb3B0aW9ucywgbmVlZF9vcHRpb25zKSkKCiAgICAgICAgc2VsZi5yb290X2lzX3B1cmUgPSBub3QgKHNlbGYuZGlzdHJpYnV0aW9uLmhhc19leHRfbW9kdWxlcygpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIHNlbGYuZGlzdHJpYnV0aW9uLmhhc19jX2xpYnJhcmllcygpKQoKICAgICAgICBpZiBzZWxmLnB5X2xpbWl0ZWRfYXBpIGFuZCBub3QgcmUubWF0Y2goUFlfTElNSVRFRF9BUElfUEFUVEVSTiwgc2VsZi5weV9saW1pdGVkX2FwaSk6CiAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInB5LWxpbWl0ZWQtYXBpIG11c3QgbWF0Y2ggJyVzJyIgJSBQWV9MSU1JVEVEX0FQSV9QQVRURVJOKQoKICAgICAgICAjIFN1cHBvcnQgbGVnYWN5IFt3aGVlbF0gc2VjdGlvbiBmb3Igc2V0dGluZyB1bml2ZXJzYWwKICAgICAgICB3aGVlbCA9IHNlbGYuZGlzdHJpYnV0aW9uLmdldF9vcHRpb25fZGljdCgnd2hlZWwnKQogICAgICAgIGlmICd1bml2ZXJzYWwnIGluIHdoZWVsOgogICAgICAgICAgICAjIHBsZWFzZSBkb24ndCBkZWZpbmUgdGhpcyBpbiB5b3VyIGdsb2JhbCBjb25maWdzCiAgICAgICAgICAgIHZhbCA9IHdoZWVsWyd1bml2ZXJzYWwnXVsxXS5zdHJpcCgpCiAgICAgICAgICAgIGlmIHZhbC5sb3dlcigpIGluICgnMScsICd0cnVlJywgJ3llcycpOgogICAgICAgICAgICAgICAgc2VsZi51bml2ZXJzYWwgPSBUcnVlCgogICAgQHByb3BlcnR5CiAgICBkZWYgd2hlZWxfZGlzdF9uYW1lKHNlbGYpOgogICAgICAgICIiIlJldHVybiBkaXN0cmlidXRpb24gZnVsbCBuYW1lIHdpdGggLSByZXBsYWNlZCB3aXRoIF8iIiIKICAgICAgICByZXR1cm4gJy0nLmpvaW4oKHNhZmVyX25hbWUoc2VsZi5kaXN0cmlidXRpb24uZ2V0X25hbWUoKSksCiAgICAgICAgICAgICAgICAgICAgICAgICBzYWZlcl92ZXJzaW9uKHNlbGYuZGlzdHJpYnV0aW9uLmdldF92ZXJzaW9uKCkpKSkKCiAgICBkZWYgZ2V0X3RhZyhzZWxmKToKICAgICAgICAjIGJkaXN0IHNldHMgc2VsZi5wbGF0X25hbWUgaWYgdW5zZXQsIHdlIHNob3VsZCBvbmx5IHVzZSBpdCBmb3IgcHVyZXB5CiAgICAgICAgIyB3aGVlbHMgaWYgdGhlIHVzZXIgc3VwcGxpZWQgaXQuCiAgICAgICAgaWYgc2VsZi5wbGF0X25hbWVfc3VwcGxpZWQ6CiAgICAgICAgICAgIHBsYXRfbmFtZSA9IHNlbGYucGxhdF9uYW1lCiAgICAgICAgZWxpZiBzZWxmLnJvb3RfaXNfcHVyZToKICAgICAgICAgICAgcGxhdF9uYW1lID0gJ2FueScKICAgICAgICBlbHNlOgogICAgICAgICAgICBwbGF0X25hbWUgPSBzZWxmLnBsYXRfbmFtZSBvciBnZXRfcGxhdGZvcm0oKQogICAgICAgICAgICBpZiBwbGF0X25hbWUgaW4gKCdsaW51eC14ODZfNjQnLCAnbGludXhfeDg2XzY0JykgYW5kIHN5cy5tYXhzaXplID09IDIxNDc0ODM2NDc6CiAgICAgICAgICAgICAgICBwbGF0X25hbWUgPSAnbGludXhfaTY4NicKICAgICAgICBwbGF0X25hbWUgPSBwbGF0X25hbWUucmVwbGFjZSgnLScsICdfJykucmVwbGFjZSgnLicsICdfJykKCgogICAgICAgIGlmIHNlbGYucm9vdF9pc19wdXJlOgogICAgICAgICAgICBpZiBzZWxmLnVuaXZlcnNhbDoKICAgICAgICAgICAgICAgIGltcGwgPSAncHkyLnB5MycKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGltcGwgPSBzZWxmLnB5dGhvbl90YWcKICAgICAgICAgICAgdGFnID0gKGltcGwsICdub25lJywgcGxhdF9uYW1lKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGltcGxfbmFtZSA9IGdldF9hYmJyX2ltcGwoKQogICAgICAgICAgICBpbXBsX3ZlciA9IGdldF9pbXBsX3ZlcigpCiAgICAgICAgICAgIGltcGwgPSBpbXBsX25hbWUgKyBpbXBsX3ZlcgogICAgICAgICAgICAjIFdlIGRvbid0IHdvcmsgb24gQ1B5dGhvbiAzLjEsIDMuMC4KICAgICAgICAgICAgaWYgc2VsZi5weV9saW1pdGVkX2FwaSBhbmQgKGltcGxfbmFtZSArIGltcGxfdmVyKS5zdGFydHN3aXRoKCdjcDMnKToKICAgICAgICAgICAgICAgIGltcGwgPSBzZWxmLnB5X2xpbWl0ZWRfYXBpCiAgICAgICAgICAgICAgICBhYmlfdGFnID0gJ2FiaTMnCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBhYmlfdGFnID0gc3RyKGdldF9hYmlfdGFnKCkpLmxvd2VyKCkKICAgICAgICAgICAgdGFnID0gKGltcGwsIGFiaV90YWcsIHBsYXRfbmFtZSkKICAgICAgICAgICAgc3VwcG9ydGVkX3RhZ3MgPSBwZXA0MjV0YWdzLmdldF9zdXBwb3J0ZWQoCiAgICAgICAgICAgICAgICBzdXBwbGllZF9wbGF0Zm9ybT1wbGF0X25hbWUgaWYgc2VsZi5wbGF0X25hbWVfc3VwcGxpZWQgZWxzZSBOb25lKQogICAgICAgICAgICAjIFhYWCBzd2l0Y2ggdG8gdGhpcyBhbHRlcm5hdGUgaW1wbGVtZW50YXRpb24gZm9yIG5vbi1wdXJlOgogICAgICAgICAgICBpZiBub3Qgc2VsZi5weV9saW1pdGVkX2FwaToKICAgICAgICAgICAgICAgIGFzc2VydCB0YWcgPT0gc3VwcG9ydGVkX3RhZ3NbMF0sICIlcyAhPSAlcyIgJSAodGFnLCBzdXBwb3J0ZWRfdGFnc1swXSkKICAgICAgICAgICAgYXNzZXJ0IHRhZyBpbiBzdXBwb3J0ZWRfdGFncywgIndvdWxkIGJ1aWxkIHdoZWVsIHdpdGggdW5zdXBwb3J0ZWQgdGFnICVzIiAlIHRhZwogICAgICAgIHJldHVybiB0YWcKCiAgICBkZWYgZ2V0X2FyY2hpdmVfYmFzZW5hbWUoc2VsZik6CiAgICAgICAgIiIiUmV0dXJuIGFyY2hpdmUgbmFtZSB3aXRob3V0IGV4dGVuc2lvbiIiIgoKICAgICAgICBpbXBsX3RhZywgYWJpX3RhZywgcGxhdF90YWcgPSBzZWxmLmdldF90YWcoKQoKICAgICAgICBhcmNoaXZlX2Jhc2VuYW1lID0gIiVzLSVzLSVzLSVzIiAlICgKICAgICAgICAgICAgc2VsZi53aGVlbF9kaXN0X25hbWUsCiAgICAgICAgICAgIGltcGxfdGFnLAogICAgICAgICAgICBhYmlfdGFnLAogICAgICAgICAgICBwbGF0X3RhZykKICAgICAgICByZXR1cm4gYXJjaGl2ZV9iYXNlbmFtZQoKICAgIGRlZiBydW4oc2VsZik6CiAgICAgICAgYnVpbGRfc2NyaXB0cyA9IHNlbGYucmVpbml0aWFsaXplX2NvbW1hbmQoJ2J1aWxkX3NjcmlwdHMnKQogICAgICAgIGJ1aWxkX3NjcmlwdHMuZXhlY3V0YWJsZSA9ICdweXRob24nCgogICAgICAgIGlmIG5vdCBzZWxmLnNraXBfYnVpbGQ6CiAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2J1aWxkJykKCiAgICAgICAgaW5zdGFsbCA9IHNlbGYucmVpbml0aWFsaXplX2NvbW1hbmQoJ2luc3RhbGwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW5pdF9zdWJjb21tYW5kcz1UcnVlKQogICAgICAgIGluc3RhbGwucm9vdCA9IHNlbGYuYmRpc3RfZGlyCiAgICAgICAgaW5zdGFsbC5jb21waWxlID0gRmFsc2UKICAgICAgICBpbnN0YWxsLnNraXBfYnVpbGQgPSBzZWxmLnNraXBfYnVpbGQKICAgICAgICBpbnN0YWxsLndhcm5fZGlyID0gRmFsc2UKCiAgICAgICAgIyBBIHdoZWVsIHdpdGhvdXQgc2V0dXB0b29scyBzY3JpcHRzIGlzIG1vcmUgY3Jvc3MtcGxhdGZvcm0uCiAgICAgICAgIyBVc2UgdGhlICh1bmRvY3VtZW50ZWQpIGBub19lcGAgb3B0aW9uIHRvIHNldHVwdG9vbHMnCiAgICAgICAgIyBpbnN0YWxsX3NjcmlwdHMgY29tbWFuZCB0byBhdm9pZCBjcmVhdGluZyBlbnRyeSBwb2ludCBzY3JpcHRzLgogICAgICAgIGluc3RhbGxfc2NyaXB0cyA9IHNlbGYucmVpbml0aWFsaXplX2NvbW1hbmQoJ2luc3RhbGxfc2NyaXB0cycpCiAgICAgICAgaW5zdGFsbF9zY3JpcHRzLm5vX2VwID0gVHJ1ZQoKICAgICAgICAjIFVzZSBhIGN1c3RvbSBzY2hlbWUgZm9yIHRoZSBhcmNoaXZlLCBiZWNhdXNlIHdlIGhhdmUgdG8gZGVjaWRlCiAgICAgICAgIyBhdCBpbnN0YWxsYXRpb24gdGltZSB3aGljaCBzY2hlbWUgdG8gdXNlLgogICAgICAgIGZvciBrZXkgaW4gKCdoZWFkZXJzJywgJ3NjcmlwdHMnLCAnZGF0YScsICdwdXJlbGliJywgJ3BsYXRsaWInKToKICAgICAgICAgICAgc2V0YXR0cihpbnN0YWxsLAogICAgICAgICAgICAgICAgICAgICdpbnN0YWxsXycgKyBrZXksCiAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHNlbGYuZGF0YV9kaXIsIGtleSkpCgogICAgICAgIGJhc2VkaXJfb2JzZXJ2ZWQgPSAnJwoKICAgICAgICBpZiBvcy5uYW1lID09ICdudCc6CiAgICAgICAgICAgICMgd2luMzIgYmFyZnMgaWYgYW55IG9mIHRoZXNlIGFyZSAnJzsgY291bGQgYmUgJy4nPwogICAgICAgICAgICAjIChkaXN0dXRpbHMuY29tbWFuZC5pbnN0YWxsOmNoYW5nZV9yb290cyBidWcpCiAgICAgICAgICAgIGJhc2VkaXJfb2JzZXJ2ZWQgPSBvcy5wYXRoLm5vcm1wYXRoKG9zLnBhdGguam9pbihzZWxmLmRhdGFfZGlyLCAnLi4nKSkKICAgICAgICAgICAgc2VsZi5pbnN0YWxsX2xpYmJhc2UgPSBzZWxmLmluc3RhbGxfbGliID0gYmFzZWRpcl9vYnNlcnZlZAoKICAgICAgICBzZXRhdHRyKGluc3RhbGwsCiAgICAgICAgICAgICAgICAnaW5zdGFsbF9wdXJlbGliJyBpZiBzZWxmLnJvb3RfaXNfcHVyZSBlbHNlICdpbnN0YWxsX3BsYXRsaWInLAogICAgICAgICAgICAgICAgYmFzZWRpcl9vYnNlcnZlZCkKCiAgICAgICAgbG9nZ2VyLmluZm8oImluc3RhbGxpbmcgdG8gJXMiLCBzZWxmLmJkaXN0X2RpcikKCiAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnaW5zdGFsbCcpCgogICAgICAgIGFyY2hpdmVfYmFzZW5hbWUgPSBzZWxmLmdldF9hcmNoaXZlX2Jhc2VuYW1lKCkKCiAgICAgICAgcHNldWRvaW5zdGFsbF9yb290ID0gb3MucGF0aC5qb2luKHNlbGYuZGlzdF9kaXIsIGFyY2hpdmVfYmFzZW5hbWUpCiAgICAgICAgaWYgbm90IHNlbGYucmVsYXRpdmU6CiAgICAgICAgICAgIGFyY2hpdmVfcm9vdCA9IHNlbGYuYmRpc3RfZGlyCiAgICAgICAgZWxzZToKICAgICAgICAgICAgYXJjaGl2ZV9yb290ID0gb3MucGF0aC5qb2luKAogICAgICAgICAgICAgICAgc2VsZi5iZGlzdF9kaXIsCiAgICAgICAgICAgICAgICBzZWxmLl9lbnN1cmVfcmVsYXRpdmUoaW5zdGFsbC5pbnN0YWxsX2Jhc2UpKQoKICAgICAgICBzZWxmLnNldF91bmRlZmluZWRfb3B0aW9ucygKICAgICAgICAgICAgJ2luc3RhbGxfZWdnX2luZm8nLCAoJ3RhcmdldCcsICdlZ2dpbmZvX2RpcicpKQogICAgICAgIHNlbGYuZGlzdGluZm9fZGlyID0gb3MucGF0aC5qb2luKHNlbGYuYmRpc3RfZGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclcy5kaXN0LWluZm8nICUgc2VsZi53aGVlbF9kaXN0X25hbWUpCiAgICAgICAgc2VsZi5lZ2cyZGlzdChzZWxmLmVnZ2luZm9fZGlyLAogICAgICAgICAgICAgICAgICAgICAgc2VsZi5kaXN0aW5mb19kaXIpCgogICAgICAgIHNlbGYud3JpdGVfd2hlZWxmaWxlKHNlbGYuZGlzdGluZm9fZGlyKQoKICAgICAgICBzZWxmLndyaXRlX3JlY29yZChzZWxmLmJkaXN0X2Rpciwgc2VsZi5kaXN0aW5mb19kaXIpCgogICAgICAgICMgTWFrZSB0aGUgYXJjaGl2ZQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLmRpc3RfZGlyKToKICAgICAgICAgICAgb3MubWFrZWRpcnMoc2VsZi5kaXN0X2RpcikKICAgICAgICB3aGVlbF9uYW1lID0gYXJjaGl2ZV93aGVlbGZpbGUocHNldWRvaW5zdGFsbF9yb290LCBhcmNoaXZlX3Jvb3QpCgogICAgICAgICMgU2lnbiB0aGUgYXJjaGl2ZQogICAgICAgIGlmICdXSEVFTF9UT09MJyBpbiBvcy5lbnZpcm9uOgogICAgICAgICAgICBzdWJwcm9jZXNzLmNhbGwoW29zLmVudmlyb25bJ1dIRUVMX1RPT0wnXSwgJ3NpZ24nLCB3aGVlbF9uYW1lXSkKCiAgICAgICAgIyBBZGQgdG8gJ0Rpc3RyaWJ1dGlvbi5kaXN0X2ZpbGVzJyBzbyB0aGF0IHRoZSAidXBsb2FkIiBjb21tYW5kIHdvcmtzCiAgICAgICAgZ2V0YXR0cihzZWxmLmRpc3RyaWJ1dGlvbiwgJ2Rpc3RfZmlsZXMnLCBbXSkuYXBwZW5kKAogICAgICAgICAgICAoJ2JkaXN0X3doZWVsJywgZ2V0X3B5dGhvbl92ZXJzaW9uKCksIHdoZWVsX25hbWUpKQoKICAgICAgICBpZiBub3Qgc2VsZi5rZWVwX3RlbXA6CiAgICAgICAgICAgIGlmIHNlbGYuZHJ5X3J1bjoKICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdyZW1vdmluZyAlcycsIHNlbGYuYmRpc3RfZGlyKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcm10cmVlKHNlbGYuYmRpc3RfZGlyKQoKICAgIGRlZiB3cml0ZV93aGVlbGZpbGUoc2VsZiwgd2hlZWxmaWxlX2Jhc2UsIGdlbmVyYXRvcj0nYmRpc3Rfd2hlZWwgKCcgKyB3aGVlbF92ZXJzaW9uICsgJyknKToKICAgICAgICBmcm9tIGVtYWlsLm1lc3NhZ2UgaW1wb3J0IE1lc3NhZ2UKICAgICAgICBtc2cgPSBNZXNzYWdlKCkKICAgICAgICBtc2dbJ1doZWVsLVZlcnNpb24nXSA9ICcxLjAnICAjIG9mIHRoZSBzcGVjCiAgICAgICAgbXNnWydHZW5lcmF0b3InXSA9IGdlbmVyYXRvcgogICAgICAgIG1zZ1snUm9vdC1Jcy1QdXJlbGliJ10gPSBzdHIoc2VsZi5yb290X2lzX3B1cmUpLmxvd2VyKCkKCiAgICAgICAgIyBEb2Vzbid0IHdvcmsgZm9yIGJkaXN0X3dpbmluc3QKICAgICAgICBpbXBsX3RhZywgYWJpX3RhZywgcGxhdF90YWcgPSBzZWxmLmdldF90YWcoKQogICAgICAgIGZvciBpbXBsIGluIGltcGxfdGFnLnNwbGl0KCcuJyk6CiAgICAgICAgICAgIGZvciBhYmkgaW4gYWJpX3RhZy5zcGxpdCgnLicpOgogICAgICAgICAgICAgICAgZm9yIHBsYXQgaW4gcGxhdF90YWcuc3BsaXQoJy4nKToKICAgICAgICAgICAgICAgICAgICBtc2dbJ1RhZyddID0gJy0nLmpvaW4oKGltcGwsIGFiaSwgcGxhdCkpCgogICAgICAgIHdoZWVsZmlsZV9wYXRoID0gb3MucGF0aC5qb2luKHdoZWVsZmlsZV9iYXNlLCAnV0hFRUwnKQogICAgICAgIGxvZ2dlci5pbmZvKCdjcmVhdGluZyAlcycsIHdoZWVsZmlsZV9wYXRoKQogICAgICAgIHdpdGggb3Blbih3aGVlbGZpbGVfcGF0aCwgJ3cnKSBhcyBmOgogICAgICAgICAgICBHZW5lcmF0b3IoZiwgbWF4aGVhZGVybGVuPTApLmZsYXR0ZW4obXNnKQoKICAgIGRlZiBfZW5zdXJlX3JlbGF0aXZlKHNlbGYsIHBhdGgpOgogICAgICAgICMgY29waWVkIGZyb20gZGlyX3V0aWwsIGRlbGV0ZWQKICAgICAgICBkcml2ZSwgcGF0aCA9IG9zLnBhdGguc3BsaXRkcml2ZShwYXRoKQogICAgICAgIGlmIHBhdGhbMDoxXSA9PSBvcy5zZXA6CiAgICAgICAgICAgIHBhdGggPSBkcml2ZSArIHBhdGhbMTpdCiAgICAgICAgcmV0dXJuIHBhdGgKCiAgICBkZWYgX3BrZ2luZm9fdG9fbWV0YWRhdGEoc2VsZiwgZWdnX2luZm9fcGF0aCwgcGtnaW5mb19wYXRoKToKICAgICAgICByZXR1cm4gbWV0YWRhdGEucGtnaW5mb190b19tZXRhZGF0YShlZ2dfaW5mb19wYXRoLCBwa2dpbmZvX3BhdGgpCgogICAgZGVmIGxpY2Vuc2VfZmlsZShzZWxmKToKICAgICAgICAiIiJSZXR1cm4gbGljZW5zZSBmaWxlbmFtZSBmcm9tIGEgbGljZW5zZS1maWxlIGtleSBpbiBzZXR1cC5jZmcsIG9yIE5vbmUuIiIiCiAgICAgICAgbWV0YWRhdGEgPSBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfb3B0aW9uX2RpY3QoJ21ldGFkYXRhJykKICAgICAgICBpZiBub3QgJ2xpY2Vuc2VfZmlsZScgaW4gbWV0YWRhdGE6CiAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgcmV0dXJuIG1ldGFkYXRhWydsaWNlbnNlX2ZpbGUnXVsxXQoKICAgIGRlZiBzZXR1cGNmZ19yZXF1aXJlbWVudHMoc2VsZik6CiAgICAgICAgIiIiR2VuZXJhdGUgcmVxdWlyZW1lbnRzIGZyb20gc2V0dXAuY2ZnIGFzCiAgICAgICAgKCdSZXF1aXJlcy1EaXN0JywgJ3JlcXVpcmVtZW50OyBxdWFsaWZpZXInKSB0dXBsZXMuIEZyb20gYSBtZXRhZGF0YQogICAgICAgIHNlY3Rpb24gaW4gc2V0dXAuY2ZnOgoKICAgICAgICBbbWV0YWRhdGFdCiAgICAgICAgcHJvdmlkZXMtZXh0cmEgPSBleHRyYTEKICAgICAgICAgICAgZXh0cmEyCiAgICAgICAgcmVxdWlyZXMtZGlzdCA9IHJlcXVpcmVtZW50OyBxdWFsaWZpZXIKICAgICAgICAgICAgYW5vdGhlcjsgcXVhbGlmaWVyMgogICAgICAgICAgICB1bnF1YWxpZmllZAoKICAgICAgICBZaWVsZHMKCiAgICAgICAgKCdQcm92aWRlcy1FeHRyYScsICdleHRyYTEnKSwKICAgICAgICAoJ1Byb3ZpZGVzLUV4dHJhJywgJ2V4dHJhMicpLAogICAgICAgICgnUmVxdWlyZXMtRGlzdCcsICdyZXF1aXJlbWVudDsgcXVhbGlmaWVyJyksCiAgICAgICAgKCdSZXF1aXJlcy1EaXN0JywgJ2Fub3RoZXI7IHF1YWxpZmllcjInKSwKICAgICAgICAoJ1JlcXVpcmVzLURpc3QnLCAndW5xdWFsaWZpZWQnKQogICAgICAgICIiIgogICAgICAgIG1ldGFkYXRhID0gc2VsZi5kaXN0cmlidXRpb24uZ2V0X29wdGlvbl9kaWN0KCdtZXRhZGF0YScpCgogICAgICAgICMgb3VyIC5pbmkgcGFyc2VyIGZvbGRzIC0gdG8gXyBpbiBrZXkgbmFtZXM6CiAgICAgICAgZm9yIGtleSwgdGl0bGUgaW4gKCgncHJvdmlkZXNfZXh0cmEnLCAnUHJvdmlkZXMtRXh0cmEnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdyZXF1aXJlc19kaXN0JywgJ1JlcXVpcmVzLURpc3QnKSk6CiAgICAgICAgICAgIGlmIG5vdCBrZXkgaW4gbWV0YWRhdGE6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBmaWVsZCA9IG1ldGFkYXRhW2tleV0KICAgICAgICAgICAgZm9yIGxpbmUgaW4gZmllbGRbMV0uc3BsaXRsaW5lcygpOgogICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQogICAgICAgICAgICAgICAgaWYgbm90IGxpbmU6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIHlpZWxkICh0aXRsZSwgbGluZSkKCiAgICBkZWYgYWRkX3JlcXVpcmVtZW50cyhzZWxmLCBtZXRhZGF0YV9wYXRoKToKICAgICAgICAiIiJBZGQgYWRkaXRpb25hbCByZXF1aXJlbWVudHMgZnJvbSBzZXR1cC5jZmcgdG8gZmlsZSBtZXRhZGF0YV9wYXRoIiIiCiAgICAgICAgYWRkaXRpb25hbCA9IGxpc3Qoc2VsZi5zZXR1cGNmZ19yZXF1aXJlbWVudHMoKSkKICAgICAgICBpZiBub3QgYWRkaXRpb25hbDogcmV0dXJuCiAgICAgICAgcGtnX2luZm8gPSByZWFkX3BrZ19pbmZvKG1ldGFkYXRhX3BhdGgpCiAgICAgICAgaWYgJ1Byb3ZpZGVzLUV4dHJhJyBpbiBwa2dfaW5mbyBvciAnUmVxdWlyZXMtRGlzdCcgaW4gcGtnX2luZm86CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oJ3NldHVwLmNmZyByZXF1aXJlbWVudHMgb3ZlcndyaXRlIHZhbHVlcyBmcm9tIHNldHVwLnB5JykKICAgICAgICAgICAgZGVsIHBrZ19pbmZvWydQcm92aWRlcy1FeHRyYSddCiAgICAgICAgICAgIGRlbCBwa2dfaW5mb1snUmVxdWlyZXMtRGlzdCddCiAgICAgICAgZm9yIGssIHYgaW4gYWRkaXRpb25hbDoKICAgICAgICAgICAgcGtnX2luZm9ba10gPSB2CiAgICAgICAgd3JpdGVfcGtnX2luZm8obWV0YWRhdGFfcGF0aCwgcGtnX2luZm8pCgogICAgZGVmIGVnZzJkaXN0KHNlbGYsIGVnZ2luZm9fcGF0aCwgZGlzdGluZm9fcGF0aCk6CiAgICAgICAgIiIiQ29udmVydCBhbiAuZWdnLWluZm8gZGlyZWN0b3J5IGludG8gYSAuZGlzdC1pbmZvIGRpcmVjdG9yeSIiIgogICAgICAgIGRlZiBhZGlvcyhwKToKICAgICAgICAgICAgIiIiQXBwcm9wcmlhdGVseSBkZWxldGUgZGlyZWN0b3J5LCBmaWxlIG9yIGxpbmsuIiIiCiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHApIGFuZCBub3Qgb3MucGF0aC5pc2xpbmsocCkgYW5kIG9zLnBhdGguaXNkaXIocCk6CiAgICAgICAgICAgICAgICBzaHV0aWwucm10cmVlKHApCiAgICAgICAgICAgIGVsaWYgb3MucGF0aC5leGlzdHMocCk6CiAgICAgICAgICAgICAgICBvcy51bmxpbmsocCkKCiAgICAgICAgYWRpb3MoZGlzdGluZm9fcGF0aCkKCiAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGVnZ2luZm9fcGF0aCk6CiAgICAgICAgICAgICMgVGhlcmUgaXMgbm8gZWdnLWluZm8uIFRoaXMgaXMgcHJvYmFibHkgYmVjYXVzZSB0aGUgZWdnLWluZm8KICAgICAgICAgICAgIyBmaWxlL2RpcmVjdG9yeSBpcyBub3QgbmFtZWQgbWF0Y2hpbmcgdGhlIGRpc3RyaWJ1dGlvbiBuYW1lIHVzZWQKICAgICAgICAgICAgIyB0byBuYW1lIHRoZSBhcmNoaXZlIGZpbGUuIENoZWNrIGZvciB0aGlzIGNhc2UgYW5kIHJlcG9ydAogICAgICAgICAgICAjIGFjY29yZGluZ2x5LgogICAgICAgICAgICBpbXBvcnQgZ2xvYgogICAgICAgICAgICBwYXQgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKGVnZ2luZm9fcGF0aCksICcqLmVnZy1pbmZvJykKICAgICAgICAgICAgcG9zc2libGUgPSBnbG9iLmdsb2IocGF0KQogICAgICAgICAgICBlcnIgPSAiRWdnIG1ldGFkYXRhIGV4cGVjdGVkIGF0ICVzIGJ1dCBub3QgZm91bmQiICUgKGVnZ2luZm9fcGF0aCwpCiAgICAgICAgICAgIGlmIHBvc3NpYmxlOgogICAgICAgICAgICAgICAgYWx0ID0gb3MucGF0aC5iYXNlbmFtZShwb3NzaWJsZVswXSkKICAgICAgICAgICAgICAgIGVyciArPSAiICglcyBmb3VuZCAtIHBvc3NpYmxlIG1pc25hbWVkIGFyY2hpdmUgZmlsZT8pIiAlIChhbHQsKQoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihlcnIpCgogICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGVnZ2luZm9fcGF0aCk6CiAgICAgICAgICAgICMgLmVnZy1pbmZvIGlzIGEgc2luZ2xlIGZpbGUKICAgICAgICAgICAgcGtnaW5mb19wYXRoID0gZWdnaW5mb19wYXRoCiAgICAgICAgICAgIHBrZ19pbmZvID0gc2VsZi5fcGtnaW5mb190b19tZXRhZGF0YShlZ2dpbmZvX3BhdGgsIGVnZ2luZm9fcGF0aCkKICAgICAgICAgICAgb3MubWtkaXIoZGlzdGluZm9fcGF0aCkKICAgICAgICBlbHNlOgogICAgICAgICAgICAjIC5lZ2ctaW5mbyBpcyBhIGRpcmVjdG9yeQogICAgICAgICAgICBwa2dpbmZvX3BhdGggPSBvcy5wYXRoLmpvaW4oZWdnaW5mb19wYXRoLCAnUEtHLUlORk8nKQogICAgICAgICAgICBwa2dfaW5mbyA9IHNlbGYuX3BrZ2luZm9fdG9fbWV0YWRhdGEoZWdnaW5mb19wYXRoLCBwa2dpbmZvX3BhdGgpCgogICAgICAgICAgICAjIGlnbm9yZSBjb21tb24gZWdnIG1ldGFkYXRhIHRoYXQgaXMgdXNlbGVzcyB0byB3aGVlbAogICAgICAgICAgICBzaHV0aWwuY29weXRyZWUoZWdnaW5mb19wYXRoLCBkaXN0aW5mb19wYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlPWxhbWJkYSB4LCB5OiBzZXQoKCdQS0ctSU5GTycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlcXVpcmVzLnR4dCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NPVVJDRVMudHh0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbm90LXppcC1zYWZlJywpKSkKCiAgICAgICAgICAgICMgZGVsZXRlIGRlcGVuZGVuY3lfbGlua3MgaWYgaXQgaXMgb25seSB3aGl0ZXNwYWNlCiAgICAgICAgICAgIGRlcGVuZGVuY3lfbGlua3NfcGF0aCA9IG9zLnBhdGguam9pbihkaXN0aW5mb19wYXRoLCAnZGVwZW5kZW5jeV9saW5rcy50eHQnKQogICAgICAgICAgICB3aXRoIG9wZW4oZGVwZW5kZW5jeV9saW5rc19wYXRoLCAncicpIGFzIGRlcGVuZGVuY3lfbGlua3NfZmlsZToKICAgICAgICAgICAgICAgIGRlcGVuZGVuY3lfbGlua3MgPSBkZXBlbmRlbmN5X2xpbmtzX2ZpbGUucmVhZCgpLnN0cmlwKCkKICAgICAgICAgICAgaWYgbm90IGRlcGVuZGVuY3lfbGlua3M6CiAgICAgICAgICAgICAgICBhZGlvcyhkZXBlbmRlbmN5X2xpbmtzX3BhdGgpCgogICAgICAgIHdyaXRlX3BrZ19pbmZvKG9zLnBhdGguam9pbihkaXN0aW5mb19wYXRoLCAnTUVUQURBVEEnKSwgcGtnX2luZm8pCgogICAgICAgICMgWFhYIGRlcHJlY2F0ZWQuIFN0aWxsIHVzZWZ1bCBmb3IgY3VycmVudCBkaXN0cmlidXRlL3NldHVwdG9vbHMuCiAgICAgICAgbWV0YWRhdGFfcGF0aCA9IG9zLnBhdGguam9pbihkaXN0aW5mb19wYXRoLCAnTUVUQURBVEEnKQogICAgICAgIHNlbGYuYWRkX3JlcXVpcmVtZW50cyhtZXRhZGF0YV9wYXRoKQoKICAgICAgICAjIFhYWCBpbnRlbnRpb25hbGx5IGEgZGlmZmVyZW50IHBhdGggdGhhbiB0aGUgUEVQLgogICAgICAgIG1ldGFkYXRhX2pzb25fcGF0aCA9IG9zLnBhdGguam9pbihkaXN0aW5mb19wYXRoLCAnbWV0YWRhdGEuanNvbicpCiAgICAgICAgcHltZXRhID0gcGtnaW5mb190b19kaWN0KG1ldGFkYXRhX3BhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGlvbj1zZWxmLmRpc3RyaWJ1dGlvbikKCiAgICAgICAgaWYgJ2Rlc2NyaXB0aW9uJyBpbiBweW1ldGE6CiAgICAgICAgICAgIGRlc2NyaXB0aW9uX2ZpbGVuYW1lID0gJ0RFU0NSSVBUSU9OLnJzdCcKICAgICAgICAgICAgZGVzY3JpcHRpb25fdGV4dCA9IHB5bWV0YS5wb3AoJ2Rlc2NyaXB0aW9uJykKICAgICAgICAgICAgZGVzY3JpcHRpb25fcGF0aCA9IG9zLnBhdGguam9pbihkaXN0aW5mb19wYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uX2ZpbGVuYW1lKQogICAgICAgICAgICB3aXRoIG9wZW4oZGVzY3JpcHRpb25fcGF0aCwgIndiIikgYXMgZGVzY3JpcHRpb25fZmlsZToKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uX2ZpbGUud3JpdGUoZGVzY3JpcHRpb25fdGV4dC5lbmNvZGUoJ3V0Zi04JykpCiAgICAgICAgICAgIHB5bWV0YVsnZXh0ZW5zaW9ucyddWydweXRob24uZGV0YWlscyddWydkb2N1bWVudF9uYW1lcyddWydkZXNjcmlwdGlvbiddID0gZGVzY3JpcHRpb25fZmlsZW5hbWUKCiAgICAgICAgIyBYWFggaGV1cmlzdGljYWxseSBjb3B5IGFueSBMSUNFTlNFL0xJQ0VOU0UudHh0PwogICAgICAgIGxpY2Vuc2UgPSBzZWxmLmxpY2Vuc2VfZmlsZSgpCiAgICAgICAgaWYgbGljZW5zZToKICAgICAgICAgICAgbGljZW5zZV9maWxlbmFtZSA9ICdMSUNFTlNFLnR4dCcKICAgICAgICAgICAgc2h1dGlsLmNvcHkobGljZW5zZSwgb3MucGF0aC5qb2luKHNlbGYuZGlzdGluZm9fZGlyLCBsaWNlbnNlX2ZpbGVuYW1lKSkKICAgICAgICAgICAgcHltZXRhWydleHRlbnNpb25zJ11bJ3B5dGhvbi5kZXRhaWxzJ11bJ2RvY3VtZW50X25hbWVzJ11bJ2xpY2Vuc2UnXSA9IGxpY2Vuc2VfZmlsZW5hbWUKCiAgICAgICAgd2l0aCBvcGVuKG1ldGFkYXRhX2pzb25fcGF0aCwgInciKSBhcyBtZXRhZGF0YV9qc29uOgogICAgICAgICAgICBqc29uLmR1bXAocHltZXRhLCBtZXRhZGF0YV9qc29uLCBzb3J0X2tleXM9VHJ1ZSkKCiAgICAgICAgYWRpb3MoZWdnaW5mb19wYXRoKQoKICAgIGRlZiB3cml0ZV9yZWNvcmQoc2VsZiwgYmRpc3RfZGlyLCBkaXN0aW5mb19kaXIpOgogICAgICAgIGZyb20gLnV0aWwgaW1wb3J0IHVybHNhZmVfYjY0ZW5jb2RlCgogICAgICAgIHJlY29yZF9wYXRoID0gb3MucGF0aC5qb2luKGRpc3RpbmZvX2RpciwgJ1JFQ09SRCcpCiAgICAgICAgcmVjb3JkX3JlbHBhdGggPSBvcy5wYXRoLnJlbHBhdGgocmVjb3JkX3BhdGgsIGJkaXN0X2RpcikKCiAgICAgICAgZGVmIHdhbGsoKToKICAgICAgICAgICAgZm9yIGRpciwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhiZGlzdF9kaXIpOgogICAgICAgICAgICAgICAgZGlycy5zb3J0KCkKICAgICAgICAgICAgICAgIGZvciBmIGluIHNvcnRlZChmaWxlcyk6CiAgICAgICAgICAgICAgICAgICAgeWllbGQgb3MucGF0aC5qb2luKGRpciwgZikKCiAgICAgICAgZGVmIHNraXAocGF0aCk6CiAgICAgICAgICAgICIiIldoZWVsIGhhc2hlcyBldmVyeSBwb3NzaWJsZSBmaWxlLiIiIgogICAgICAgICAgICByZXR1cm4gKHBhdGggPT0gcmVjb3JkX3JlbHBhdGgpCgogICAgICAgIHdpdGggb3Blbl9mb3JfY3N2KHJlY29yZF9wYXRoLCAndysnKSBhcyByZWNvcmRfZmlsZToKICAgICAgICAgICAgd3JpdGVyID0gY3N2LndyaXRlcihyZWNvcmRfZmlsZSkKICAgICAgICAgICAgZm9yIHBhdGggaW4gd2FsaygpOgogICAgICAgICAgICAgICAgcmVscGF0aCA9IG9zLnBhdGgucmVscGF0aChwYXRoLCBiZGlzdF9kaXIpCiAgICAgICAgICAgICAgICBpZiBza2lwKHJlbHBhdGgpOgogICAgICAgICAgICAgICAgICAgIGhhc2ggPSAnJwogICAgICAgICAgICAgICAgICAgIHNpemUgPSAnJwogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICB3aXRoIG9wZW4ocGF0aCwgJ3JiJykgYXMgZjoKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGYucmVhZCgpCiAgICAgICAgICAgICAgICAgICAgZGlnZXN0ID0gaGFzaGxpYi5zaGEyNTYoZGF0YSkuZGlnZXN0KCkKICAgICAgICAgICAgICAgICAgICBoYXNoID0gJ3NoYTI1Nj0nICsgbmF0aXZlKHVybHNhZmVfYjY0ZW5jb2RlKGRpZ2VzdCkpCiAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IGxlbihkYXRhKQogICAgICAgICAgICAgICAgcmVjb3JkX3BhdGggPSBvcy5wYXRoLnJlbHBhdGgoCiAgICAgICAgICAgICAgICAgICAgcGF0aCwgYmRpc3RfZGlyKS5yZXBsYWNlKG9zLnBhdGguc2VwLCAnLycpCiAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVyb3coKHJlY29yZF9wYXRoLCBoYXNoLCBzaXplKSkKUEsDBBQAAAAAAAAAIQCjeVJ3HQIAAB0CAAAnAAAAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvZGVjb3JhdG9yLnB5IyBmcm9tIFB5cmFtaWQKCgpjbGFzcyByZWlmeShvYmplY3QpOgogICAgIiIiUHV0IHRoZSByZXN1bHQgb2YgYSBtZXRob2Qgd2hpY2ggdXNlcyB0aGlzIChub24tZGF0YSkKICAgIGRlc2NyaXB0b3IgZGVjb3JhdG9yIGluIHRoZSBpbnN0YW5jZSBkaWN0IGFmdGVyIHRoZSBmaXJzdCBjYWxsLAogICAgZWZmZWN0aXZlbHkgcmVwbGFjaW5nIHRoZSBkZWNvcmF0b3Igd2l0aCBhbiBpbnN0YW5jZSB2YXJpYWJsZS4KICAgICIiIgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3cmFwcGVkKToKICAgICAgICBzZWxmLndyYXBwZWQgPSB3cmFwcGVkCiAgICAgICAgc2VsZi5fX2RvY19fID0gd3JhcHBlZC5fX2RvY19fCgogICAgZGVmIF9fZ2V0X18oc2VsZiwgaW5zdCwgb2JqdHlwZT1Ob25lKToKICAgICAgICBpZiBpbnN0IGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiBzZWxmCiAgICAgICAgdmFsID0gc2VsZi53cmFwcGVkKGluc3QpCiAgICAgICAgc2V0YXR0cihpbnN0LCBzZWxmLndyYXBwZWQuX19uYW1lX18sIHZhbCkKICAgICAgICByZXR1cm4gdmFsClBLAwQUAAAAAAAAACEA02EPJNMLAADTCwAAJwAAAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL2VnZzJ3aGVlbC5weSMhL3Vzci9iaW4vZW52IHB5dGhvbgppbXBvcnQgb3MucGF0aAppbXBvcnQgcmUKaW1wb3J0IHN5cwppbXBvcnQgdGVtcGZpbGUKaW1wb3J0IHppcGZpbGUKaW1wb3J0IHdoZWVsLmJkaXN0X3doZWVsCmltcG9ydCBzaHV0aWwKaW1wb3J0IGRpc3R1dGlscy5kaXN0CmZyb20gZGlzdHV0aWxzLmFyY2hpdmVfdXRpbCBpbXBvcnQgbWFrZV9hcmNoaXZlCmZyb20gYXJncGFyc2UgaW1wb3J0IEFyZ3VtZW50UGFyc2VyCmZyb20gZ2xvYiBpbXBvcnQgaWdsb2IKZnJvbSB3aGVlbC53aW5pbnN0MndoZWVsIGltcG9ydCBfYmRpc3Rfd2hlZWxfdGFnCgplZ2dfaW5mb19yZSA9IHJlLmNvbXBpbGUocicnJyg/UDxuYW1lPi4rPyktKD9QPHZlcj4uKz8pCiAgICAoLSg/UDxweXZlcj4uKz8pKT8oLSg/UDxhcmNoPi4rPykpPy5lZ2cnJycsIHJlLlZFUkJPU0UpCgpkZWYgZWdnMndoZWVsKGVnZ19wYXRoLCBkZXN0X2Rpcik6CiAgICBlZ2dfaW5mbyA9IGVnZ19pbmZvX3JlLm1hdGNoKG9zLnBhdGguYmFzZW5hbWUoZWdnX3BhdGgpKS5ncm91cGRpY3QoKQogICAgZGlyID0gdGVtcGZpbGUubWtkdGVtcChzdWZmaXg9Il9lMnciKQogICAgaWYgb3MucGF0aC5pc2ZpbGUoZWdnX3BhdGgpOgogICAgICAgICMgYXNzdW1lIHdlIGhhdmUgYSBiZGlzdF9lZ2cgb3RoZXJ3aXNlCiAgICAgICAgZWdnID0gemlwZmlsZS5aaXBGaWxlKGVnZ19wYXRoKQogICAgICAgIGVnZy5leHRyYWN0YWxsKGRpcikKICAgIGVsc2U6CiAgICAgICAgIyBzdXBwb3J0IGJ1aWxkb3V0LXN0eWxlIGluc3RhbGxlZCBlZ2dzIGRpcmVjdG9yaWVzCiAgICAgICAgZm9yIHB0aCBpbiBvcy5saXN0ZGlyKGVnZ19wYXRoKToKICAgICAgICAgICAgc3JjID0gb3MucGF0aC5qb2luKGVnZ19wYXRoLCBwdGgpCiAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKHNyYyk6CiAgICAgICAgICAgICAgICBzaHV0aWwuY29weTIoc3JjLCBkaXIpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBzaHV0aWwuY29weXRyZWUoc3JjLCBvcy5wYXRoLmpvaW4oZGlyLCBwdGgpKQoKICAgIGRpc3RfaW5mbyA9ICIlcy0lcyIgJSAoZWdnX2luZm9bJ25hbWUnXSwgZWdnX2luZm9bJ3ZlciddKQogICAgYWJpID0gJ25vbmUnCiAgICBweXZlciA9IGVnZ19pbmZvWydweXZlciddLnJlcGxhY2UoJy4nLCAnJykKICAgIGFyY2ggPSAoZWdnX2luZm9bJ2FyY2gnXSBvciAnYW55JykucmVwbGFjZSgnLicsICdfJykucmVwbGFjZSgnLScsICdfJykKICAgIGlmIGFyY2ggIT0gJ2FueSc6CiAgICAgICAgIyBhc3N1bWUgYWxsIGJpbmFyeSBlZ2dzIGFyZSBmb3IgQ1B5dGhvbgogICAgICAgIHB5dmVyID0gJ2NwJyArIHB5dmVyWzI6XQogICAgd2hlZWxfbmFtZSA9ICctJy5qb2luKCgKICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0X2luZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgcHl2ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWJpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFyY2gKICAgICAgICAgICAgICAgICAgICAgICAgICApKQogICAgcm9vdF9pc19wdXJlbGliID0gZWdnX2luZm9bJ2FyY2gnXSBpcyBOb25lCiAgICBpZiByb290X2lzX3B1cmVsaWI6CiAgICAgICAgYncgPSB3aGVlbC5iZGlzdF93aGVlbC5iZGlzdF93aGVlbChkaXN0dXRpbHMuZGlzdC5EaXN0cmlidXRpb24oKSkKICAgIGVsc2U6CiAgICAgICAgYncgPSBfYmRpc3Rfd2hlZWxfdGFnKGRpc3R1dGlscy5kaXN0LkRpc3RyaWJ1dGlvbigpKQoKICAgIGJ3LnJvb3RfaXNfcHVyZSA9IHJvb3RfaXNfcHVyZWxpYgogICAgYncucHl0aG9uX3RhZyA9IHB5dmVyCiAgICBidy5wbGF0X25hbWVfc3VwcGxpZWQgPSBUcnVlCiAgICBidy5wbGF0X25hbWUgPSBlZ2dfaW5mb1snYXJjaCddIG9yICdhbnknCiAgICBpZiBub3Qgcm9vdF9pc19wdXJlbGliOgogICAgICAgIGJ3LmZ1bGxfdGFnX3N1cHBsaWVkID0gVHJ1ZQogICAgICAgIGJ3LmZ1bGxfdGFnID0gKHB5dmVyLCBhYmksIGFyY2gpCgogICAgZGlzdF9pbmZvX2RpciA9IG9zLnBhdGguam9pbihkaXIsICclcy5kaXN0LWluZm8nICUgZGlzdF9pbmZvKQogICAgYncuZWdnMmRpc3Qob3MucGF0aC5qb2luKGRpciwgJ0VHRy1JTkZPJyksCiAgICAgICAgICAgICAgICBkaXN0X2luZm9fZGlyKQogICAgYncud3JpdGVfd2hlZWxmaWxlKGRpc3RfaW5mb19kaXIsIGdlbmVyYXRvcj0nZWdnMndoZWVsJykKICAgIGJ3LndyaXRlX3JlY29yZChkaXIsIGRpc3RfaW5mb19kaXIpCiAgICBmaWxlbmFtZSA9IG1ha2VfYXJjaGl2ZShvcy5wYXRoLmpvaW4oZGVzdF9kaXIsIHdoZWVsX25hbWUpLCAnemlwJywgcm9vdF9kaXI9ZGlyKQogICAgb3MucmVuYW1lKGZpbGVuYW1lLCBmaWxlbmFtZVs6LTNdICsgJ3dobCcpCiAgICBzaHV0aWwucm10cmVlKGRpcikKCmRlZiBtYWluKCk6CiAgICBwYXJzZXIgPSBBcmd1bWVudFBhcnNlcigpCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCdlZ2dzJywgbmFyZ3M9JyonLCBoZWxwPSJFZ2dzIHRvIGNvbnZlcnQiKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1kZXN0LWRpcicsICctZCcsIGRlZmF1bHQ9b3MucGF0aC5jdXJkaXIsCiAgICAgICAgICAgIGhlbHA9IkRpcmVjdG9yeSB0byBzdG9yZSB3aGVlbHMgKGRlZmF1bHQgJShkZWZhdWx0KXMpIikKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tdmVyYm9zZScsICctdicsIGFjdGlvbj0nc3RvcmVfdHJ1ZScpCiAgICBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQogICAgZm9yIHBhdCBpbiBhcmdzLmVnZ3M6CiAgICAgICAgZm9yIGVnZyBpbiBpZ2xvYihwYXQpOgogICAgICAgICAgICBpZiBhcmdzLnZlcmJvc2U6CiAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJ7MH0uLi4gIi5mb3JtYXQoZWdnKSkKICAgICAgICAgICAgZWdnMndoZWVsKGVnZywgYXJncy5kZXN0X2RpcikKICAgICAgICAgICAgaWYgYXJncy52ZXJib3NlOgogICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiT0tcbiIpCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgbWFpbigpClBLAwQUAAAAAAAAACEAECTyM7oJAAC6CQAAJwAAAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL2VnZ25hbWVzLnR4dHZjYXJkLTAuNy44LXB5Mi43LmVnZwpxdGFsY2hlbXktMC43LjEtcHkyLjcuZWdnCkFNUVBEZWxpdmVyLTAuMS1weTIuNy5lZ2cKaW5maS5yZWdpc3RyeS0wLjEuMS1weTIuNy5lZ2cKaW5maS5pbnN0cnVjdC0wLjUuNS1weTIuNy5lZ2cKaW5maS5kZXZpY2VtYW5hZ2VyLTAuMS4yLXB5Mi43LmVnZwpUcmFjVGl4U3VtbWFyeS0xLjAtcHkyLjcuZWdnClRvc2NhV2lkZ2V0cy0wLjkuMTItcHkyLjcuZWdnCmFyY2hpcGVsX2FnZW50X2lwaG9uZV9ub3RpZmljYXRpb24tMC41LjBiZXRhLXB5Mi43LmVnZwphcmNoaXBlbF9hZ2VudF9hY3Rpb25fc2NoZWR1bGVyLTAuNS4wYmV0YS1weTIuNy5lZ2cKYW8uc29jaWFsLTEuMC4yLXB5Mi43LmVnZwphcGdsLTAuNy1weTIuNy5lZ2cKc2F0Y2htb19wYXltZW50X3BheXdvcmxkLTAuMS4xLXB5Mi43LmVnZwpzbm1wc2ltLTAuMS4zLXB5Mi43LmVnZwpzc2hpbS0wLjItcHkyLjcuZWdnCnNob3ZlLTAuMy40LXB5Mi43LmVnZwpzaW1wbGVhdnJvLTAuMy4wLXB5Mi43LmVnZwp3a2h0bWx0b3BkZi0wLjItcHkyLjcuZWdnCndva2tlbC0wLjcuMC1weTIuNy5lZ2cKam1ib19zb2NpYWwtMC4wLjYtcHkyLjcuZWdnCmptYm9fcG9zdC0wLjAuNi1weTIuNy5lZ2cKamNyYWNrLTAuMC4yLXB5Mi43LmVnZwpyaWFrLTEuNC4wLXB5Mi43LmVnZwpyZXN0Y2xpZW50LTAuMTAuMi1weTIuNy5lZ2cKU3V0ZWtoLTAuOC4xLXB5Mi43LmVnZwp0cmF5aWZ5LTAuMC4xLXB5Mi43LmVnZwp0d2VlcHktMS45LXB5Mi43LmVnZwp0b3B6b290b29scy0wLjIuMS1weTIuNy5lZ2cKaGF5c3RhY2stMC4xNi1weTIuNy5lZ2cKem9wZS5pbnRlcmZhY2UtNC4wLjEtcHkyLjctd2luMzIuZWdnCm5ldXJvc2hhcmUtMC44LjUtcHkyLjctbWFjb3N4LTEwLjctaW50ZWwuZWdnCm5kZ19odHRwc2NsaWVudC0wLjIuMC1weTIuNy5lZ2cKbGlidGVsZS0wLjMtcHkyLjcuZWdnCmxpdGV4LmN4cG9vbC0xLjAuMi1weTIuNy5lZ2cKb2JzcHkuaXJpcy0wLjUuMS1weTIuNy5lZ2cKb2JzcHkubXNlZWQtMC42LjEtcHkyLjctd2luMzIuZWdnCm9ic3B5LmNvcmUtMC42LjItcHkyLjcuZWdnCkNvcmVQb3N0LTAuMC4zLXB5Mi43LmVnZwpmbm9yZHN0YWxrLTAuMC4zLXB5Mi43LmVnZwpQZXJzaXN0ZW5jZS0yLjEzLjItcHkyLjctd2luMzIuZWdnClB5ZGFwLTMuMS5SQzEtcHkyLjcuZWdnClB5RXhlY0pTLTEuMC40LXB5Mi43LmVnZwpXYWxseS0wLjcuMi1weTIuNy5lZ2cKRXh0ZW5zaW9uQ2xhc3MtNC4wYTEtcHkyLjctd2luMzIuZWdnCkZlZWRqYWNrLTAuOS4xNi1weTIuNy5lZ2cKTWFyczI0LTAuMy45LXB5Mi43LmVnZwpIYWxXZWItMC42LjAtcHkyLjcuZWdnCkRBUkUtMC43LjE0MC1weTIuNy5lZ2cKbWFjaG9saWItMS4zLXB5Mi43LmVnZwptYXJyb3cud3NnaS5lZ3Jlc3MuY29tcHJlc3Npb24tMS4xLXB5Mi43LmVnZwptY3MtMC4zLjctcHkyLjcuZWdnCktvb2stMC42LjAtcHkyLjcuZWdnCmVyLTAuMS1weTIuNy5lZ2cKZXZhc2lvbl9kaXJlY3Rvci0xLjEuNC1weTIuNy5lZ2cKZGpxdWVyeS0wLjFhLXB5Mi43LmVnZwpkamFuZ29fZmFjdG9yeS0wLjctcHkyLjcuZWdnCmRqYW5nb19naXptby0wLjAuMy1weTIuNy5lZ2cKZGphbmdvX2NhdGVnb3J5LTAuMS1weTIuNy5lZ2cKZGJ3cmFwLTAuMy4yLXB5Mi43LmVnZwpkamFuZ29fc3VwZXJnZW5lcmljLTEuMC1weTIuNy5lZ2cKZGphbmdvX2R5bmFtby0wLjI1LXB5Mi43LmVnZwpkamFuZ29fYWNvbGxhYmF1dGgtMC4xLXB5Mi43LmVnZwpkamFuZ29fcXJsaW5rLTAuMS4wLXB5Mi43LmVnZwpkamFuZ29fYWRkb25zLTAuNi42LXB5Mi43LmVnZwpjb3Zlcl9ncmFiYmVyLTEuMS4yLXB5Mi43LmVnZwpjaGVtLTEuMS1weTIuNy5lZ2cKY3J1ZC0wLjEtcHkyLjcuZWdnCmJvbmdvLTAuMS1weTIuNy5lZ2cKYnl0ZWNvZGVoYWNrcy1BcHJpbDIwMDAtcHkyLjcuZWdnCmdyZWVubGV0LTAuMy40LXB5Mi43LXdpbjMyLmVnZwpnaW52b2tlLTAuMy4xLXB5Mi43LmVnZwpweW9iamNfZnJhbWV3b3JrX1NjcmlwdGluZ0JyaWRnZS0yLjMtcHkyLjcuZWdnCnBlY2FuLTAuMi4wYS1weTIuNy5lZ2cKcHlyZXNzLTAuMi4wLXB5Mi43LmVnZwpweW9iamNfZnJhbWV3b3JrX1B1YlN1Yi0yLjMtcHkyLjcuZWdnCnB5b2JqY19mcmFtZXdvcmtfRXhjZXB0aW9uSGFuZGxpbmctMi4zLXB5Mi43LmVnZwpweXdwcy10cnVuay1weTIuNy5lZ2cKcHlvYmpjX2ZyYW1ld29ya19DRk5ldHdvcmstMi4zLXB5Mi43LW1hY29zeC0xMC42LWZhdC5lZ2cKcHkuc2F1bnRlci0wLjQwLXB5Mi43LmVnZwpweWZub3JkbWV0cmljLTAuMC4xLXB5Mi43LmVnZwpweXdzLTEuMS4xLXB5Mi43LmVnZwpwcmVzdGFweXQtMC40LjAtcHkyLjcuZWdnCnBhc3NsaWItMS41LjMtcHkyLjcuZWdnCnB5Z2EtMi4xLXB5Mi43LmVnZwpweWdpdGh1YjMtMC4zLXB5Mi43LmVnZwpweW9iamNfZnJhbWV3b3JrX09wZW5EaXJlY3RvcnktMi4zLXB5Mi43LmVnZwp5YXBvc2liLTAuMi43NS1weTIuNy1saW51eC14ODZfNjQuZWdnClBLAwQUAAAAAAAAACEAsby59rJGAACyRgAAJQAAAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL2luc3RhbGwucHkiIiIKT3BlcmF0aW9ucyBvbiBleGlzdGluZyB3aGVlbCBmaWxlcywgaW5jbHVkaW5nIGJhc2ljIGluc3RhbGxhdGlvbi4gCiIiIgojIFhYWCBzZWUgcGF0Y2hlZCBwaXAgdG8gaW5zdGFsbAoKaW1wb3J0IHN5cwppbXBvcnQgd2FybmluZ3MKaW1wb3J0IG9zLnBhdGgKaW1wb3J0IHJlCmltcG9ydCB6aXBmaWxlCmltcG9ydCBoYXNobGliCmltcG9ydCBjc3YKCmltcG9ydCBzaHV0aWwKCnRyeToKICAgIF9iaWdfbnVtYmVyID0gc3lzLm1heHNpemUKZXhjZXB0IE5hbWVFcnJvcjoKICAgIF9iaWdfbnVtYmVyID0gc3lzLm1heGludAoKZnJvbSAuZGVjb3JhdG9yIGltcG9ydCByZWlmeQpmcm9tIC51dGlsIGltcG9ydCAodXJsc2FmZV9iNjRlbmNvZGUsIGZyb21fanNvbiwgdXJsc2FmZV9iNjRkZWNvZGUsCiAgICAgICAgICAgICAgICAgICBuYXRpdmUsIGJpbmFyeSwgSGFzaGluZ0ZpbGUpCmZyb20gLiBpbXBvcnQgc2lnbmF0dXJlcwpmcm9tIC5wa2dpbmZvIGltcG9ydCByZWFkX3BrZ19pbmZvX2J5dGVzCmZyb20gLnV0aWwgaW1wb3J0IG9wZW5fZm9yX2NzdgoKZnJvbSAucGVwNDI1dGFncyBpbXBvcnQgZ2V0X3N1cHBvcnRlZApmcm9tIC5wYXRocyBpbXBvcnQgZ2V0X2luc3RhbGxfcGF0aHMKCiMgVGhlIG5leHQgbWFqb3IgdmVyc2lvbiBhZnRlciB0aGlzIHZlcnNpb24gb2YgdGhlICd3aGVlbCcgdG9vbDoKVkVSU0lPTl9UT09fSElHSCA9ICgxLCAwKQoKIyBOb24tZ3JlZWR5IG1hdGNoaW5nIG9mIGFuIG9wdGlvbmFsIGJ1aWxkIG51bWJlciBtYXkgYmUgdG9vIGNsZXZlciAobW9yZQojIGludmFsaWQgd2hlZWwgZmlsZW5hbWVzIHdpbGwgbWF0Y2gpLiBTZXBhcmF0ZSByZWdleCBmb3IgLmRpc3QtaW5mbz8KV0hFRUxfSU5GT19SRSA9IHJlLmNvbXBpbGUoCiAgICByIiIiXig/UDxuYW1ldmVyPig/UDxuYW1lPi4rPykoLSg/UDx2ZXI+XGQuKz8pKT8pCiAgICAoKC0oP1A8YnVpbGQ+XGQuKj8pKT8tKD9QPHB5dmVyPi4rPyktKD9QPGFiaT4uKz8pLSg/UDxwbGF0Pi4rPykKICAgIFwud2hsfFwuZGlzdC1pbmZvKSQiIiIsCiAgICByZS5WRVJCT1NFKS5tYXRjaAoKZGVmIHBhcnNlX3ZlcnNpb24odmVyc2lvbik6CiAgICAiIiJVc2UgcGFyc2VfdmVyc2lvbiBmcm9tIHBrZ19yZXNvdXJjZXMgb3IgZGlzdHV0aWxzIGFzIGF2YWlsYWJsZS4iIiIKICAgIGdsb2JhbCBwYXJzZV92ZXJzaW9uCiAgICB0cnk6CiAgICAgICAgZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCBwYXJzZV92ZXJzaW9uCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgZnJvbSBkaXN0dXRpbHMudmVyc2lvbiBpbXBvcnQgTG9vc2VWZXJzaW9uIGFzIHBhcnNlX3ZlcnNpb24KICAgIHJldHVybiBwYXJzZV92ZXJzaW9uKHZlcnNpb24pCgpjbGFzcyBCYWRXaGVlbEZpbGUoVmFsdWVFcnJvcik6CiAgICBwYXNzCgoKY2xhc3MgV2hlZWxGaWxlKG9iamVjdCk6CiAgICAiIiJQYXJzZSB3aGVlbC1zcGVjaWZpYyBhdHRyaWJ1dGVzIGZyb20gYSB3aGVlbCAoLndobCkgZmlsZSBhbmQgb2ZmZXIKICAgIGJhc2ljIGluc3RhbGxhdGlvbiBhbmQgdmVyaWZpY2F0aW9uIHN1cHBvcnQuCiAgICAKICAgIFdoZWVsRmlsZSBjYW4gYmUgdXNlZCB0byBzaW1wbHkgcGFyc2UgYSB3aGVlbCBmaWxlbmFtZSBieSBhdm9pZGluZyB0aGUKICAgIG1ldGhvZHMgdGhhdCByZXF1aXJlIHRoZSBhY3R1YWwgZmlsZSBjb250ZW50cy4iIiIKCiAgICBXSEVFTF9JTkZPID0gIldIRUVMIgogICAgUkVDT1JEID0gIlJFQ09SRCIKCiAgICBkZWYgX19pbml0X18oc2VsZiwKICAgICAgICAgICAgICAgICBmaWxlbmFtZSwKICAgICAgICAgICAgICAgICBmcD1Ob25lLAogICAgICAgICAgICAgICAgIGFwcGVuZD1GYWxzZSwKICAgICAgICAgICAgICAgICBjb250ZXh0PWdldF9zdXBwb3J0ZWQpOgogICAgICAgICIiIgogICAgICAgIDpwYXJhbSBmcDogQSBzZWVrYWJsZSBmaWxlLWxpa2Ugb2JqZWN0IG9yIE5vbmUgdG8gb3BlbihmaWxlbmFtZSkuCiAgICAgICAgOnBhcmFtIGFwcGVuZDogT3BlbiBhcmNoaXZlIGluIGFwcGVuZCBtb2RlLgogICAgICAgIDpwYXJhbSBjb250ZXh0OiBGdW5jdGlvbiByZXR1cm5pbmcgbGlzdCBvZiBzdXBwb3J0ZWQgdGFncy4gV2hlZWxzCiAgICAgICAgbXVzdCBoYXZlIHRoZSBzYW1lIGNvbnRleHQgdG8gYmUgc29ydGFibGUuCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5maWxlbmFtZSA9IGZpbGVuYW1lCiAgICAgICAgc2VsZi5mcCA9IGZwCiAgICAgICAgc2VsZi5hcHBlbmQgPSBhcHBlbmQKICAgICAgICBzZWxmLmNvbnRleHQgPSBjb250ZXh0CiAgICAgICAgYmFzZW5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKQogICAgICAgIHNlbGYucGFyc2VkX2ZpbGVuYW1lID0gV0hFRUxfSU5GT19SRShiYXNlbmFtZSkKICAgICAgICBpZiBub3QgYmFzZW5hbWUuZW5kc3dpdGgoJy53aGwnKSBvciBzZWxmLnBhcnNlZF9maWxlbmFtZSBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBCYWRXaGVlbEZpbGUoIkJhZCBmaWxlbmFtZSAnJXMnIiAlIGZpbGVuYW1lKQoKICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5maWxlbmFtZQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGRpc3RpbmZvX25hbWUoc2VsZik6CiAgICAgICAgcmV0dXJuICIlcy5kaXN0LWluZm8iICUgc2VsZi5wYXJzZWRfZmlsZW5hbWUuZ3JvdXAoJ25hbWV2ZXInKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIGRhdGFkaXJfbmFtZShzZWxmKToKICAgICAgICByZXR1cm4gIiVzLmRhdGEiICUgc2VsZi5wYXJzZWRfZmlsZW5hbWUuZ3JvdXAoJ25hbWV2ZXInKQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHJlY29yZF9uYW1lKHNlbGYpOgogICAgICAgIHJldHVybiAiJXMvJXMiICUgKHNlbGYuZGlzdGluZm9fbmFtZSwgc2VsZi5SRUNPUkQpCgogICAgQHByb3BlcnR5CiAgICBkZWYgd2hlZWxpbmZvX25hbWUoc2VsZik6CiAgICAgICAgcmV0dXJuICIlcy8lcyIgJSAoc2VsZi5kaXN0aW5mb19uYW1lLCBzZWxmLldIRUVMX0lORk8pCgogICAgQHByb3BlcnR5CiAgICBkZWYgdGFncyhzZWxmKToKICAgICAgICAiIiJBIHdoZWVsIGZpbGUgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBDYXJ0ZXNpYW4gcHJvZHVjdCBvZiB0aGUKICAgICAgICBwZXJpb2QtZGVsaW1pdGVkIHRhZ3MgaW4gaXRzIGZpbGVuYW1lLgogICAgICAgIFRvIGNob29zZSBhIHdoZWVsIGZpbGUgYW1vbmcgc2V2ZXJhbCBjYW5kaWRhdGVzIGhhdmluZyB0aGUgc2FtZQogICAgICAgIGRpc3RyaWJ1dGlvbiB2ZXJzaW9uICd2ZXInLCBhbiBpbnN0YWxsZXIgcmFua3MgZWFjaCB0cmlwbGUgb2YKICAgICAgICAocHl2ZXIsIGFiaSwgcGxhdCkgdGhhdCBpdHMgUHl0aG9uIGluc3RhbGxhdGlvbiBjYW4gcnVuLCBzb3J0aW5nCiAgICAgICAgdGhlIHdoZWVscyBieSB0aGUgYmVzdC1yYW5rZWQgdGFnIGl0IHN1cHBvcnRzIGFuZCB0aGVuIGJ5IHRoZWlyCiAgICAgICAgYXJpdHkgd2hpY2ggaXMganVzdCBsZW4obGlzdChjb21wYXRpYmlsaXR5X3RhZ3MpKS4KICAgICAgICAiIiIKICAgICAgICB0YWdzID0gc2VsZi5wYXJzZWRfZmlsZW5hbWUuZ3JvdXBkaWN0KCkKICAgICAgICBmb3IgcHl2ZXIgaW4gdGFnc1sncHl2ZXInXS5zcGxpdCgnLicpOgogICAgICAgICAgICBmb3IgYWJpIGluIHRhZ3NbJ2FiaSddLnNwbGl0KCcuJyk6CiAgICAgICAgICAgICAgICBmb3IgcGxhdCBpbiB0YWdzWydwbGF0J10uc3BsaXQoJy4nKToKICAgICAgICAgICAgICAgICAgICB5aWVsZCAocHl2ZXIsIGFiaSwgcGxhdCkKCiAgICBjb21wYXRpYmlsaXR5X3RhZ3MgPSB0YWdzCgogICAgQHByb3BlcnR5CiAgICBkZWYgYXJpdHkoc2VsZik6CiAgICAgICAgIiIiVGhlIG51bWJlciBvZiBjb21wYXRpYmlsaXR5IHRhZ3MgdGhlIHdoZWVsIGRlY2xhcmVzLiIiIgogICAgICAgIHJldHVybiBsZW4obGlzdChzZWxmLmNvbXBhdGliaWxpdHlfdGFncykpCgogICAgQHByb3BlcnR5CiAgICBkZWYgcmFuayhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBMb3dlc3QgaW5kZXggb2YgYW55IG9mIHRoaXMgd2hlZWwncyB0YWdzIGluIHNlbGYuY29udGV4dCgpLCBhbmQgdGhlCiAgICAgICAgYXJpdHkgZS5nLiAoMCwgMSkKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gc2VsZi5jb21wYXRpYmlsaXR5X3Jhbmsoc2VsZi5jb250ZXh0KCkpCgogICAgQHByb3BlcnR5CiAgICBkZWYgY29tcGF0aWJsZShzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5yYW5rWzBdICE9IF9iaWdfbnVtYmVyICAjIGJhZCBBUEkhCgogICAgIyBkZXByZWNhdGVkOgogICAgZGVmIGNvbXBhdGliaWxpdHlfcmFuayhzZWxmLCBzdXBwb3J0ZWQpOgogICAgICAgICIiIlJhbmsgdGhlIHdoZWVsIGFnYWluc3QgdGhlIHN1cHBvcnRlZCB0YWdzLiBTbWFsbGVyIHJhbmtzIGFyZSBtb3JlCiAgICAgICAgY29tcGF0aWJsZSEKCiAgICAgICAgOnBhcmFtIHN1cHBvcnRlZDogQSBsaXN0IG9mIGNvbXBhdGliaWxpdHkgdGFncyB0aGF0IHRoZSBjdXJyZW50CiAgICAgICAgICAgIFB5dGhvbiBpbXBsZW1lbmF0aW9uIGNhbiBydW4uCiAgICAgICAgIiIiCiAgICAgICAgcHJlZmVyZW5jZXMgPSBbXQogICAgICAgIGZvciB0YWcgaW4gc2VsZi5jb21wYXRpYmlsaXR5X3RhZ3M6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHByZWZlcmVuY2VzLmFwcGVuZChzdXBwb3J0ZWQuaW5kZXgodGFnKSkKICAgICAgICAgICAgIyBUYWcgbm90IHByZXNlbnQKICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgaWYgbGVuKHByZWZlcmVuY2VzKToKICAgICAgICAgICAgcmV0dXJuIChtaW4ocHJlZmVyZW5jZXMpLCBzZWxmLmFyaXR5KQogICAgICAgIHJldHVybiAoX2JpZ19udW1iZXIsIDApCgogICAgIyBkZXByZWNhdGVkCiAgICBkZWYgc3VwcG9ydHNfY3VycmVudF9weXRob24oc2VsZiwgeCk6CiAgICAgICAgYXNzZXJ0IHNlbGYuY29udGV4dCA9PSB4LCAnY29udGV4dCBtaXNtYXRjaCcKICAgICAgICByZXR1cm4gc2VsZi5jb21wYXRpYmxlCgogICAgIyBDb21wYXJhYmlsaXR5LgogICAgIyBXaGVlbHMgYXJlIGVxdWFsIGlmIHRoZXkgcmVmZXIgdG8gdGhlIHNhbWUgZmlsZS4KICAgICMgSWYgdHdvIHdoZWVscyBhcmUgbm90IGVxdWFsLCBjb21wYXJlIGJhc2VkIG9uIChpbiB0aGlzIG9yZGVyKToKICAgICMgICAxLiBOYW1lCiAgICAjICAgMi4gVmVyc2lvbgogICAgIyAgIDMuIENvbXBhdGliaWxpdHkgcmFuawogICAgIyAgIDQuIEZpbGVuYW1lIChhcyBhIHRpZWJyZWFrZXIpCiAgICBAcHJvcGVydHkKICAgIGRlZiBfc29ydF9rZXkoc2VsZik6CiAgICAgICAgcmV0dXJuIChzZWxmLnBhcnNlZF9maWxlbmFtZS5ncm91cCgnbmFtZScpLAogICAgICAgICAgICAgICAgcGFyc2VfdmVyc2lvbihzZWxmLnBhcnNlZF9maWxlbmFtZS5ncm91cCgndmVyJykpLAogICAgICAgICAgICAgICAgdHVwbGUoLXggZm9yIHggaW4gc2VsZi5yYW5rKSwKICAgICAgICAgICAgICAgIHNlbGYuZmlsZW5hbWUpCgogICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgcmV0dXJuIHNlbGYuZmlsZW5hbWUgPT0gb3RoZXIuZmlsZW5hbWUKCiAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZi5maWxlbmFtZSAhPSBvdGhlci5maWxlbmFtZQoKICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIGlmIHNlbGYuY29udGV4dCAhPSBvdGhlci5jb250ZXh0OgogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoInswfS5jb250ZXh0ICE9IHsxfS5jb250ZXh0Ii5mb3JtYXQoc2VsZiwgb3RoZXIpKQoKICAgICAgICByZXR1cm4gc2VsZi5fc29ydF9rZXkgPCBvdGhlci5fc29ydF9rZXkKCiAgICAgICAgIyBYWFggcHJ1bmUKCiAgICAgICAgc24gPSBzZWxmLnBhcnNlZF9maWxlbmFtZS5ncm91cCgnbmFtZScpCiAgICAgICAgb24gPSBvdGhlci5wYXJzZWRfZmlsZW5hbWUuZ3JvdXAoJ25hbWUnKQogICAgICAgIGlmIHNuICE9IG9uOgogICAgICAgICAgICByZXR1cm4gc24gPCBvbgogICAgICAgIHN2ID0gcGFyc2VfdmVyc2lvbihzZWxmLnBhcnNlZF9maWxlbmFtZS5ncm91cCgndmVyJykpCiAgICAgICAgb3YgPSBwYXJzZV92ZXJzaW9uKG90aGVyLnBhcnNlZF9maWxlbmFtZS5ncm91cCgndmVyJykpCiAgICAgICAgaWYgc3YgIT0gb3Y6CiAgICAgICAgICAgIHJldHVybiBzdiA8IG92CiAgICAgICAgIyBDb21wYXRpYmlsaXR5CiAgICAgICAgaWYgc2VsZi5jb250ZXh0ICE9IG90aGVyLmNvbnRleHQ6CiAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiezB9LmNvbnRleHQgIT0gezF9LmNvbnRleHQiLmZvcm1hdChzZWxmLCBvdGhlcikpCiAgICAgICAgc2MgPSBzZWxmLnJhbmsKICAgICAgICBvYyA9IG90aGVyLnJhbmsKICAgICAgICBpZiBzYyAhPSBOb25lIGFuZCBvYyAhPSBOb25lIGFuZCBzYyAhPSBvYzoKICAgICAgICAgICAgIyBTbWFsbGVyIGNvbXBhdGliaWxpdHkgcmFua3MgYXJlICJiZXR0ZXIiIHRoYW4gbGFyZ2VyIG9uZXMsCiAgICAgICAgICAgICMgc28gd2UgaGF2ZSB0byByZXZlcnNlIHRoZSBzZW5zZSBvZiB0aGUgY29tcGFyaXNvbiBoZXJlIQogICAgICAgICAgICByZXR1cm4gc2MgPiBvYwogICAgICAgIGVsaWYgc2MgPT0gTm9uZSBhbmQgb2MgIT0gTm9uZToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgcmV0dXJuIHNlbGYuZmlsZW5hbWUgPCBvdGhlci5maWxlbmFtZQoKICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOgogICAgICAgIHJldHVybiBvdGhlciA8IHNlbGYKCiAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZiA9PSBvdGhlciBvciBzZWxmIDwgb3RoZXIKCiAgICBkZWYgX19nZV9fKHNlbGYsIG90aGVyKToKICAgICAgICByZXR1cm4gc2VsZiA9PSBvdGhlciBvciBvdGhlciA8IHNlbGYKCiAgICAjCiAgICAjIE1ldGhvZHMgdXNpbmcgdGhlIGZpbGUncyBjb250ZW50czoKICAgICMKCiAgICBAcmVpZnkKICAgIGRlZiB6aXBmaWxlKHNlbGYpOgogICAgICAgIG1vZGUgPSAiciIKICAgICAgICBpZiBzZWxmLmFwcGVuZDoKICAgICAgICAgICAgbW9kZSA9ICJhIgogICAgICAgIHZ6ZiA9IFZlcmlmeWluZ1ppcEZpbGUoc2VsZi5mcCBpZiBzZWxmLmZwIGVsc2Ugc2VsZi5maWxlbmFtZSwgbW9kZSkKICAgICAgICBpZiBub3Qgc2VsZi5hcHBlbmQ6CiAgICAgICAgICAgIHNlbGYudmVyaWZ5KHZ6ZikKICAgICAgICByZXR1cm4gdnpmCgogICAgQHJlaWZ5CiAgICBkZWYgcGFyc2VkX3doZWVsX2luZm8oc2VsZik6CiAgICAgICAgIiIiUGFyc2Ugd2hlZWwgbWV0YWRhdGEgKHRoZSAuZGF0YS9XSEVFTCBmaWxlKSIiIgogICAgICAgIHJldHVybiByZWFkX3BrZ19pbmZvX2J5dGVzKHNlbGYuemlwZmlsZS5yZWFkKHNlbGYud2hlZWxpbmZvX25hbWUpKQoKICAgIGRlZiBjaGVja192ZXJzaW9uKHNlbGYpOgogICAgICAgIHZlcnNpb24gPSBzZWxmLnBhcnNlZF93aGVlbF9pbmZvWydXaGVlbC1WZXJzaW9uJ10KICAgICAgICBpZiB0dXBsZShtYXAoaW50LCB2ZXJzaW9uLnNwbGl0KCcuJykpKSA+PSBWRVJTSU9OX1RPT19ISUdIOgogICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJXaGVlbCB2ZXJzaW9uIGlzIHRvbyBoaWdoIikKCiAgICBAcmVpZnkKICAgIGRlZiBpbnN0YWxsX3BhdGhzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIENvbnN1bHQgZGlzdHV0aWxzIHRvIGdldCB0aGUgaW5zdGFsbCBwYXRocyBmb3Igb3VyIGRpc3QuICBBIGRpY3Qgd2l0aAogICAgICAgICgncHVyZWxpYicsICdwbGF0bGliJywgJ2hlYWRlcnMnLCAnc2NyaXB0cycsICdkYXRhJykuCiAgICAgICAgCiAgICAgICAgV2UgdXNlIHRoZSBuYW1lIGZyb20gb3VyIGZpbGVuYW1lIGFzIHRoZSBkaXN0IG5hbWUsIHdoaWNoIG1lYW5zIGhlYWRlcnMKICAgICAgICBjb3VsZCBiZSBpbnN0YWxsZWQgaW4gdGhlIHdyb25nIHBsYWNlIGlmIHRoZSBmaWxlc3lzdGVtLWVzY2FwZWQgbmFtZQogICAgICAgIGlzIGRpZmZlcmVudCB0aGFuIHRoZSBOYW1lLiAgV2hvIGNhcmVzPyAKICAgICAgICAiIiIKICAgICAgICBuYW1lID0gc2VsZi5wYXJzZWRfZmlsZW5hbWUuZ3JvdXAoJ25hbWUnKQogICAgICAgIHJldHVybiBnZXRfaW5zdGFsbF9wYXRocyhuYW1lKQoKICAgIGRlZiBpbnN0YWxsKHNlbGYsIGZvcmNlPUZhbHNlLCBvdmVycmlkZXM9e30pOgogICAgICAgICIiIgogICAgICAgIEluc3RhbGwgdGhlIHdoZWVsIGludG8gc2l0ZS1wYWNrYWdlcy4KICAgICAgICAiIiIKCiAgICAgICAgIyBVdGlsaXR5IHRvIGdldCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSBmb3IgYSBwYXJ0aWN1bGFyIGtleQogICAgICAgIGRlZiBnZXRfcGF0aChrZXkpOgogICAgICAgICAgICByZXR1cm4gb3ZlcnJpZGVzLmdldChrZXkpIG9yIHNlbGYuaW5zdGFsbF9wYXRoc1trZXldCgogICAgICAgICMgVGhlIGJhc2UgdGFyZ2V0IGxvY2F0aW9uIGlzIGVpdGhlciBwdXJlbGliIG9yIHBsYXRsaWIKICAgICAgICBpZiBzZWxmLnBhcnNlZF93aGVlbF9pbmZvWydSb290LUlzLVB1cmVsaWInXSA9PSAndHJ1ZSc6CiAgICAgICAgICAgIHJvb3QgPSBnZXRfcGF0aCgncHVyZWxpYicpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcm9vdCA9IGdldF9wYXRoKCdwbGF0bGliJykKCiAgICAgICAgIyBQYXJzZSBhbGwgdGhlIG5hbWVzIGluIHRoZSBhcmNoaXZlCiAgICAgICAgbmFtZV90cmFucyA9IHt9CiAgICAgICAgZm9yIGluZm8gaW4gc2VsZi56aXBmaWxlLmluZm9saXN0KCk6CiAgICAgICAgICAgIG5hbWUgPSBpbmZvLmZpbGVuYW1lCiAgICAgICAgICAgICMgWmlwIGZpbGVzIGNhbiBjb250YWluIGVudHJpZXMgcmVwcmVzZW50aW5nIGRpcmVjdG9yaWVzLgogICAgICAgICAgICAjIFRoZXNlIGVuZCBpbiBhICcvJy4KICAgICAgICAgICAgIyBXZSBpZ25vcmUgdGhlc2UsIGFzIHdlIGNyZWF0ZSBkaXJlY3RvcmllcyBvbiBkZW1hbmQuCiAgICAgICAgICAgIGlmIG5hbWUuZW5kc3dpdGgoJy8nKToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICAjIFBhdGhuYW1lcyBpbiBhIHppcGZpbGUgbmFtZWxpc3QgYXJlIGFsd2F5cyAvLXNlcGFyYXRlZC4KICAgICAgICAgICAgIyBJbiB0aGVvcnksIHBhdGhzIGNvdWxkIHN0YXJ0IHdpdGggLi8gb3IgaGF2ZSBvdGhlciBvZGRpdGllcwogICAgICAgICAgICAjIGJ1dCB0aGlzIHdvbid0IGhhcHBlbiBpbiBwcmFjdGljYWwgY2FzZXMgb2Ygd2VsbC1mb3JtZWQgd2hlZWxzLgogICAgICAgICAgICAjIFdlJ2xsIGNvdmVyIHRoZSBzaW1wbGUgY2FzZSBvZiBhbiBpbml0aWFsICcuLycgYXMgaXQncyBib3RoIGVhc3kKICAgICAgICAgICAgIyB0byBkbyBhbmQgbW9yZSBjb21tb24gdGhhbiBtb3N0IG90aGVyIG9kZGl0aWVzLgogICAgICAgICAgICBpZiBuYW1lLnN0YXJ0c3dpdGgoJy4vJyk6CiAgICAgICAgICAgICAgICBuYW1lID0gbmFtZVsyOl0KCiAgICAgICAgICAgICMgU3BsaXQgb2ZmIHRoZSBiYXNlIGRpcmVjdG9yeSB0byBpZGVudGlmeSBmaWxlcyB0aGF0IGFyZSB0byBiZQogICAgICAgICAgICAjIGluc3RhbGxlZCBpbiBub24tcm9vdCBsb2NhdGlvbnMKICAgICAgICAgICAgYmFzZWRpciwgc2VwLCBmaWxlbmFtZSA9IG5hbWUucGFydGl0aW9uKCcvJykKICAgICAgICAgICAgaWYgc2VwIGFuZCBiYXNlZGlyID09IHNlbGYuZGF0YWRpcl9uYW1lOgogICAgICAgICAgICAgICAgIyBEYXRhIGZpbGUuIFRhcmdldCBkZXN0aW5hdGlvbiBpcyBlbHNld2hlcmUKICAgICAgICAgICAgICAgIGtleSwgc2VwLCBmaWxlbmFtZSA9IGZpbGVuYW1lLnBhcnRpdGlvbignLycpCiAgICAgICAgICAgICAgICBpZiBub3Qgc2VwOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkludmFsaWQgZmlsZW5hbWUgaW4gd2hlZWw6IHswfSIuZm9ybWF0KG5hbWUpKQogICAgICAgICAgICAgICAgdGFyZ2V0ID0gZ2V0X3BhdGgoa2V5KQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIyBOb3JtYWwgZmlsZS4gVGFyZ2V0IGRlc3RpbmF0aW9uIGlzIHJvb3QKICAgICAgICAgICAgICAgIGtleSA9ICcnCiAgICAgICAgICAgICAgICB0YXJnZXQgPSByb290CiAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IG5hbWUKCiAgICAgICAgICAgICMgTWFwIHRoZSBhY3R1YWwgZmlsZW5hbWUgZnJvbSB0aGUgemlwZmlsZSB0byBpdHMgaW50ZW5kZWQgdGFyZ2V0CiAgICAgICAgICAgICMgZGlyZWN0b3J5IGFuZCB0aGUgcGF0aG5hbWUgcmVsYXRpdmUgdG8gdGhhdCBkaXJlY3RvcnkuCiAgICAgICAgICAgIGRlc3QgPSBvcy5wYXRoLm5vcm1wYXRoKG9zLnBhdGguam9pbih0YXJnZXQsIGZpbGVuYW1lKSkKICAgICAgICAgICAgbmFtZV90cmFuc1tpbmZvXSA9IChrZXksIHRhcmdldCwgZmlsZW5hbWUsIGRlc3QpCgogICAgICAgICMgV2UncmUgbm93IHJlYWR5IHRvIHN0YXJ0IHByb2Nlc3NpbmcgdGhlIGFjdHVhbCBpbnN0YWxsLiBUaGUgcHJvY2VzcwogICAgICAgICMgaXMgYXMgZm9sbG93czoKICAgICAgICAjICAgMS4gUHJlY2hlY2tzIC0gaXMgdGhlIHdoZWVsIHZhbGlkLCBpcyBpdHMgZGVjbGFyZWQgYXJjaGl0ZWN0dXJlCiAgICAgICAgIyAgICAgIE9LLCBldGMuIFtbUmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlcl1dCiAgICAgICAgIyAgIDIuIE92ZXJ3cml0ZSBjaGVjayAtIGRvIGFueSBvZiB0aGUgZmlsZXMgdG8gYmUgaW5zdGFsbGVkIGFscmVhZHkKICAgICAgICAjICAgICAgZXhpc3Q/CiAgICAgICAgIyAgIDMuIEFjdHVhbCBpbnN0YWxsIC0gcHV0IHRoZSBmaWxlcyBpbiB0aGVpciB0YXJnZXQgbG9jYXRpb25zLgogICAgICAgICMgICA0LiBVcGRhdGUgUkVDT1JEIC0gd3JpdGUgYSBzdWl0YWJseSBtb2RpZmllZCBSRUNPUkQgZmlsZSB0bwogICAgICAgICMgICAgICByZWZsZWN0IHRoZSBhY3R1YWwgaW5zdGFsbGVkIHBhdGhzLgoKICAgICAgICBpZiBub3QgZm9yY2U6CiAgICAgICAgICAgIGZvciBpbmZvLCB2IGluIG5hbWVfdHJhbnMuaXRlbXMoKToKICAgICAgICAgICAgICAgIGsgPSBpbmZvLmZpbGVuYW1lCiAgICAgICAgICAgICAgICBrZXksIHRhcmdldCwgZmlsZW5hbWUsIGRlc3QgPSB2CiAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhkZXN0KToKICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJXaGVlbCBmaWxlIHswfSB3b3VsZCBvdmVyd3JpdGUgezF9LiBVc2UgZm9yY2UgaWYgdGhpcyBpcyBpbnRlbmRlZCIuZm9ybWF0KGssIGRlc3QpKQoKICAgICAgICAjIEdldCB0aGUgbmFtZSBvZiBvdXIgZXhlY3V0YWJsZSwgZm9yIHVzZSB3aGVuIHJlcGxhY2luZyBzY3JpcHQKICAgICAgICAjIHdyYXBwZXIgaGFzaGJhbmcgbGluZXMuCiAgICAgICAgIyBXZSBlbmNvZGUgaXQgdXNpbmcgZ2V0ZmlsZXN5c3RlbWVuY29kaW5nLCBhcyB0aGF0IGlzICJ0aGUgbmFtZSBvZgogICAgICAgICMgdGhlIGVuY29kaW5nIHVzZWQgdG8gY29udmVydCBVbmljb2RlIGZpbGVuYW1lcyBpbnRvIHN5c3RlbSBmaWxlCiAgICAgICAgIyBuYW1lcyIuCiAgICAgICAgZXhlbmFtZSA9IHN5cy5leGVjdXRhYmxlLmVuY29kZShzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkpCiAgICAgICAgcmVjb3JkX2RhdGEgPSBbXQogICAgICAgIHJlY29yZF9uYW1lID0gc2VsZi5kaXN0aW5mb19uYW1lICsgJy9SRUNPUkQnCiAgICAgICAgZm9yIGluZm8sIChrZXksIHRhcmdldCwgZmlsZW5hbWUsIGRlc3QpIGluIG5hbWVfdHJhbnMuaXRlbXMoKToKICAgICAgICAgICAgbmFtZSA9IGluZm8uZmlsZW5hbWUKICAgICAgICAgICAgc291cmNlID0gc2VsZi56aXBmaWxlLm9wZW4oaW5mbykKICAgICAgICAgICAgIyBTa2lwIHRoZSBSRUNPUkQgZmlsZQogICAgICAgICAgICBpZiBuYW1lID09IHJlY29yZF9uYW1lOgogICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgZGRpciA9IG9zLnBhdGguZGlybmFtZShkZXN0KQogICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihkZGlyKToKICAgICAgICAgICAgICAgIG9zLm1ha2VkaXJzKGRkaXIpCiAgICAgICAgICAgIGRlc3RpbmF0aW9uID0gSGFzaGluZ0ZpbGUob3BlbihkZXN0LCAnd2InKSkKICAgICAgICAgICAgaWYga2V5ID09ICdzY3JpcHRzJzoKICAgICAgICAgICAgICAgIGhhc2hiYW5nID0gc291cmNlLnJlYWRsaW5lKCkKICAgICAgICAgICAgICAgIGlmIGhhc2hiYW5nLnN0YXJ0c3dpdGgoYicjIXB5dGhvbicpOgogICAgICAgICAgICAgICAgICAgIGhhc2hiYW5nID0gYicjIScgKyBleGVuYW1lICsgYmluYXJ5KG9zLmxpbmVzZXApCiAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbi53cml0ZShoYXNoYmFuZykKICAgICAgICAgICAgc2h1dGlsLmNvcHlmaWxlb2JqKHNvdXJjZSwgZGVzdGluYXRpb24pCiAgICAgICAgICAgIHJlbGRlc3QgPSBvcy5wYXRoLnJlbHBhdGgoZGVzdCwgcm9vdCkKICAgICAgICAgICAgcmVsZGVzdC5yZXBsYWNlKG9zLnNlcCwgJy8nKQogICAgICAgICAgICByZWNvcmRfZGF0YS5hcHBlbmQoKHJlbGRlc3QsIGRlc3RpbmF0aW9uLmRpZ2VzdCgpLCBkZXN0aW5hdGlvbi5sZW5ndGgpKQogICAgICAgICAgICBkZXN0aW5hdGlvbi5jbG9zZSgpCiAgICAgICAgICAgIHNvdXJjZS5jbG9zZSgpCiAgICAgICAgICAgICMgcHJlc2VydmUgYXR0cmlidXRlcyAoZXNwZWNpYWxseSAreCBiaXQgZm9yIHNjcmlwdHMpCiAgICAgICAgICAgIGF0dHJzID0gaW5mby5leHRlcm5hbF9hdHRyID4+IDE2CiAgICAgICAgICAgIGlmIGF0dHJzOiAgIyB0ZW5kcyB0byBiZSAwIGlmIFdpbmRvd3MuCiAgICAgICAgICAgICAgICBvcy5jaG1vZChkZXN0LCBpbmZvLmV4dGVybmFsX2F0dHIgPj4gMTYpCgogICAgICAgIHJlY29yZF9uYW1lID0gb3MucGF0aC5qb2luKHJvb3QsIHNlbGYucmVjb3JkX25hbWUpCiAgICAgICAgd2l0aCBvcGVuX2Zvcl9jc3YocmVjb3JkX25hbWUsICd3KycpIGFzIHJlY29yZF9maWxlOgogICAgICAgICAgICB3cml0ZXIgPSBjc3Yud3JpdGVyKHJlY29yZF9maWxlKQogICAgICAgICAgICBmb3IgcmVsZGVzdCwgZGlnZXN0LCBsZW5ndGggaW4gc29ydGVkKHJlY29yZF9kYXRhKToKICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZXJvdygocmVsZGVzdCwgZGlnZXN0LCBsZW5ndGgpKQogICAgICAgICAgICB3cml0ZXIud3JpdGVyb3coKHNlbGYucmVjb3JkX25hbWUsICcnLCAnJykpCgogICAgZGVmIHZlcmlmeShzZWxmLCB6aXBmaWxlPU5vbmUpOgogICAgICAgICIiIkNvbmZpZ3VyZSB0aGUgVmVyaWZ5aW5nWmlwRmlsZSBgemlwZmlsZWAgYnkgdmVyaWZ5aW5nIGl0cyBzaWduYXR1cmUgCiAgICAgICAgYW5kIHNldHRpbmcgZXhwZWN0ZWQgaGFzaGVzIGZvciBldmVyeSBoYXNoIGluIFJFQ09SRC4KICAgICAgICBDYWxsZXIgbXVzdCBjb21wbGV0ZSB0aGUgdmVyaWZpY2F0aW9uIHByb2Nlc3MgYnkgY29tcGxldGVseSByZWFkaW5nIAogICAgICAgIGV2ZXJ5IGZpbGUgaW4gdGhlIGFyY2hpdmUgKGUuZy4gd2l0aCBleHRyYWN0YWxsKS4iIiIKICAgICAgICBzaWcgPSBOb25lCiAgICAgICAgaWYgemlwZmlsZSBpcyBOb25lOgogICAgICAgICAgICB6aXBmaWxlID0gc2VsZi56aXBmaWxlCiAgICAgICAgemlwZmlsZS5zdHJpY3QgPSBUcnVlCgogICAgICAgIHJlY29yZF9uYW1lID0gJy8nLmpvaW4oKHNlbGYuZGlzdGluZm9fbmFtZSwgJ1JFQ09SRCcpKQogICAgICAgIHNpZ19uYW1lID0gJy8nLmpvaW4oKHNlbGYuZGlzdGluZm9fbmFtZSwgJ1JFQ09SRC5qd3MnKSkKICAgICAgICAjIHRvbGVyYXRlIHMvbWltZSBzaWduYXR1cmVzOgogICAgICAgIHNtaW1lX3NpZ19uYW1lID0gJy8nLmpvaW4oKHNlbGYuZGlzdGluZm9fbmFtZSwgJ1JFQ09SRC5wN3MnKSkKICAgICAgICB6aXBmaWxlLnNldF9leHBlY3RlZF9oYXNoKHJlY29yZF9uYW1lLCBOb25lKQogICAgICAgIHppcGZpbGUuc2V0X2V4cGVjdGVkX2hhc2goc2lnX25hbWUsIE5vbmUpCiAgICAgICAgemlwZmlsZS5zZXRfZXhwZWN0ZWRfaGFzaChzbWltZV9zaWdfbmFtZSwgTm9uZSkKICAgICAgICByZWNvcmQgPSB6aXBmaWxlLnJlYWQocmVjb3JkX25hbWUpCgogICAgICAgIHJlY29yZF9kaWdlc3QgPSB1cmxzYWZlX2I2NGVuY29kZShoYXNobGliLnNoYTI1NihyZWNvcmQpLmRpZ2VzdCgpKQogICAgICAgIHRyeToKICAgICAgICAgICAgc2lnID0gZnJvbV9qc29uKG5hdGl2ZSh6aXBmaWxlLnJlYWQoc2lnX25hbWUpKSkKICAgICAgICBleGNlcHQgS2V5RXJyb3I6ICAjIG5vIHNpZ25hdHVyZQogICAgICAgICAgICBwYXNzCiAgICAgICAgaWYgc2lnOgogICAgICAgICAgICBoZWFkZXJzLCBwYXlsb2FkID0gc2lnbmF0dXJlcy52ZXJpZnkoc2lnKQogICAgICAgICAgICBpZiBwYXlsb2FkWydoYXNoJ10gIT0gInNoYTI1Nj0iICsgbmF0aXZlKHJlY29yZF9kaWdlc3QpOgogICAgICAgICAgICAgICAgbXNnID0gIlJFQ09SRC5zaWcgY2xhaW1lZCBSRUNPUkQgaGFzaCB7MH0gIT0gY29tcHV0ZWQgaGFzaCB7MX0uIgogICAgICAgICAgICAgICAgcmFpc2UgQmFkV2hlZWxGaWxlKG1zZy5mb3JtYXQocGF5bG9hZFsnaGFzaCddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlKHJlY29yZF9kaWdlc3QpKSkKCiAgICAgICAgcmVhZGVyID0gY3N2LnJlYWRlcigobmF0aXZlKHIpIGZvciByIGluIHJlY29yZC5zcGxpdGxpbmVzKCkpKQoKICAgICAgICBmb3Igcm93IGluIHJlYWRlcjoKICAgICAgICAgICAgZmlsZW5hbWUgPSByb3dbMF0KICAgICAgICAgICAgaGFzaCA9IHJvd1sxXQogICAgICAgICAgICBpZiBub3QgaGFzaDoKICAgICAgICAgICAgICAgIGlmIGZpbGVuYW1lIG5vdCBpbiAocmVjb3JkX25hbWUsIHNpZ19uYW1lKToKICAgICAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCIlcyBoYXMgbm8gaGFzaCFcbiIgJSBmaWxlbmFtZSkKICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIGFsZ28sIGRhdGEgPSByb3dbMV0uc3BsaXQoJz0nLCAxKQogICAgICAgICAgICBhc3NlcnQgYWxnbyA9PSAic2hhMjU2IiwgIlVuc3VwcG9ydGVkIGhhc2ggYWxnb3JpdGhtIgogICAgICAgICAgICB6aXBmaWxlLnNldF9leHBlY3RlZF9oYXNoKGZpbGVuYW1lLCB1cmxzYWZlX2I2NGRlY29kZShiaW5hcnkoZGF0YSkpKQoKCmNsYXNzIFZlcmlmeWluZ1ppcEZpbGUoemlwZmlsZS5aaXBGaWxlKToKICAgICIiIlppcEZpbGUgdGhhdCBjYW4gYXNzZXJ0IHRoYXQgZWFjaCBvZiBpdHMgZXh0cmFjdGVkIGNvbnRlbnRzIG1hdGNoZXMKICAgIGFuIGV4cGVjdGVkIHNoYTI1NiBoYXNoLiBOb3RlIHRoYXQgZWFjaCBmaWxlIG11c3QgYmUgY29tcGxldGx5IHJlYWQgaW4gCiAgICBvcmRlciBmb3IgaXRzIGhhc2ggdG8gYmUgY2hlY2tlZC4iIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZSwgbW9kZT0iciIsCiAgICAgICAgICAgICAgICAgY29tcHJlc3Npb249emlwZmlsZS5aSVBfU1RPUkVELAogICAgICAgICAgICAgICAgIGFsbG93WmlwNjQ9RmFsc2UpOgogICAgICAgIHppcGZpbGUuWmlwRmlsZS5fX2luaXRfXyhzZWxmLCBmaWxlLCBtb2RlLCBjb21wcmVzc2lvbiwgYWxsb3daaXA2NCkKCiAgICAgICAgc2VsZi5zdHJpY3QgPSBGYWxzZQogICAgICAgIHNlbGYuX2V4cGVjdGVkX2hhc2hlcyA9IHt9CiAgICAgICAgc2VsZi5faGFzaF9hbGdvcml0aG0gPSBoYXNobGliLnNoYTI1NgoKICAgIGRlZiBzZXRfZXhwZWN0ZWRfaGFzaChzZWxmLCBuYW1lLCBoYXNoKToKICAgICAgICAiIiIKICAgICAgICA6cGFyYW0gbmFtZTogbmFtZSBvZiB6aXAgZW50cnkKICAgICAgICA6cGFyYW0gaGFzaDogYnl0ZXMgb2YgaGFzaCAob3IgTm9uZSBmb3IgImRvbid0IGNhcmUiKQogICAgICAgICIiIgogICAgICAgIHNlbGYuX2V4cGVjdGVkX2hhc2hlc1tuYW1lXSA9IGhhc2gKCiAgICBkZWYgb3BlbihzZWxmLCBuYW1lX29yX2luZm8sIG1vZGU9InIiLCBwd2Q9Tm9uZSk6CiAgICAgICAgIiIiUmV0dXJuIGZpbGUtbGlrZSBvYmplY3QgZm9yICduYW1lJy4iIiIKICAgICAgICAjIEEgbm9uLW1vbmtleS1wYXRjaGVkIHZlcnNpb24gd291bGQgY29udGFpbiBtb3N0IG9mIHppcGZpbGUucHkKICAgICAgICBlZiA9IHppcGZpbGUuWmlwRmlsZS5vcGVuKHNlbGYsIG5hbWVfb3JfaW5mbywgbW9kZSwgcHdkKQogICAgICAgIGlmIGlzaW5zdGFuY2UobmFtZV9vcl9pbmZvLCB6aXBmaWxlLlppcEluZm8pOgogICAgICAgICAgICBuYW1lID0gbmFtZV9vcl9pbmZvLmZpbGVuYW1lCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbmFtZSA9IG5hbWVfb3JfaW5mbwogICAgICAgIGlmIChuYW1lIGluIHNlbGYuX2V4cGVjdGVkX2hhc2hlcwogICAgICAgICAgICBhbmQgc2VsZi5fZXhwZWN0ZWRfaGFzaGVzW25hbWVdICE9IE5vbmUpOgogICAgICAgICAgICBleHBlY3RlZF9oYXNoID0gc2VsZi5fZXhwZWN0ZWRfaGFzaGVzW25hbWVdCiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIF91cGRhdGVfY3JjX29yaWcgPSBlZi5fdXBkYXRlX2NyYwogICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCdOZWVkIFppcEV4dEZpbGUuX3VwZGF0ZV9jcmMgdG8gaW1wbGVtZW50ICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZpbGUgaGFzaCB2ZXJpZmljYXRpb24gKGluIFB5dGhvbiA+PSAyLjcpJykKICAgICAgICAgICAgICAgIHJldHVybiBlZgogICAgICAgICAgICBydW5uaW5nX2hhc2ggPSBzZWxmLl9oYXNoX2FsZ29yaXRobSgpCiAgICAgICAgICAgIGlmIGhhc2F0dHIoZWYsICdfZW9mJyk6ICAjIHB5MzMKICAgICAgICAgICAgICAgIGRlZiBfdXBkYXRlX2NyYyhkYXRhKToKICAgICAgICAgICAgICAgICAgICBfdXBkYXRlX2NyY19vcmlnKGRhdGEpCiAgICAgICAgICAgICAgICAgICAgcnVubmluZ19oYXNoLnVwZGF0ZShkYXRhKQogICAgICAgICAgICAgICAgICAgIGlmIGVmLl9lb2YgYW5kIHJ1bm5pbmdfaGFzaC5kaWdlc3QoKSAhPSBleHBlY3RlZF9oYXNoOgogICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBCYWRXaGVlbEZpbGUoIkJhZCBoYXNoIGZvciBmaWxlICVyIiAlIGVmLm5hbWUpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBkZWYgX3VwZGF0ZV9jcmMoZGF0YSwgZW9mPU5vbmUpOgogICAgICAgICAgICAgICAgICAgIF91cGRhdGVfY3JjX29yaWcoZGF0YSwgZW9mPWVvZikKICAgICAgICAgICAgICAgICAgICBydW5uaW5nX2hhc2gudXBkYXRlKGRhdGEpCiAgICAgICAgICAgICAgICAgICAgaWYgZW9mIGFuZCBydW5uaW5nX2hhc2guZGlnZXN0KCkgIT0gZXhwZWN0ZWRfaGFzaDoKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgQmFkV2hlZWxGaWxlKCJCYWQgaGFzaCBmb3IgZmlsZSAlciIgJSBlZi5uYW1lKQogICAgICAgICAgICBlZi5fdXBkYXRlX2NyYyA9IF91cGRhdGVfY3JjCiAgICAgICAgZWxpZiBzZWxmLnN0cmljdCBhbmQgbmFtZSBub3QgaW4gc2VsZi5fZXhwZWN0ZWRfaGFzaGVzOgogICAgICAgICAgICByYWlzZSBCYWRXaGVlbEZpbGUoIk5vIGV4cGVjdGVkIGhhc2ggZm9yIGZpbGUgJXIiICUgZWYubmFtZSkKICAgICAgICByZXR1cm4gZWYKCiAgICBkZWYgcG9wKHNlbGYpOgogICAgICAgICIiIlRydW5jYXRlIHRoZSBsYXN0IGZpbGUgb2ZmIHRoaXMgemlwZmlsZS4KICAgICAgICBBc3N1bWVzIGluZm9saXN0KCkgaXMgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIGZpbGVzICh0cnVlIGZvcgogICAgICAgIG9yZGluYXJ5IHppcCBmaWxlcyBjcmVhdGVkIGJ5IFB5dGhvbikiIiIKICAgICAgICBpZiBub3Qgc2VsZi5mcDoKICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKAogICAgICAgICAgICAgICAgICAiQXR0ZW1wdCB0byBwb3AgZnJvbSBaSVAgYXJjaGl2ZSB0aGF0IHdhcyBhbHJlYWR5IGNsb3NlZCIpCiAgICAgICAgbGFzdCA9IHNlbGYuaW5mb2xpc3QoKS5wb3AoKQogICAgICAgIGRlbCBzZWxmLk5hbWVUb0luZm9bbGFzdC5maWxlbmFtZV0KICAgICAgICBzZWxmLmZwLnNlZWsobGFzdC5oZWFkZXJfb2Zmc2V0LCBvcy5TRUVLX1NFVCkKICAgICAgICBzZWxmLmZwLnRydW5jYXRlKCkKICAgICAgICBzZWxmLl9kaWRNb2RpZnkgPSBUcnVlClBLAwQUAAAAAAAAACEAOSh3C5wtAACcLQAAJgAAAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL21ldGFkYXRhLnB5IiIiClRvb2xzIGZvciBjb252ZXJ0aW5nIG9sZC0gdG8gbmV3LXN0eWxlIG1ldGFkYXRhLgoiIiIKCmZyb20gY29sbGVjdGlvbnMgaW1wb3J0IG5hbWVkdHVwbGUKZnJvbSAucGtnaW5mbyBpbXBvcnQgcmVhZF9wa2dfaW5mbwpmcm9tIC51dGlsIGltcG9ydCBPcmRlcmVkRGVmYXVsdERpY3QKdHJ5OgogICAgZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgT3JkZXJlZERpY3QKZXhjZXB0IEltcG9ydEVycm9yOgogICAgT3JkZXJlZERpY3QgPSBkaWN0CgppbXBvcnQgcmUKaW1wb3J0IG9zLnBhdGgKaW1wb3J0IHRleHR3cmFwCmltcG9ydCBwa2dfcmVzb3VyY2VzCmltcG9ydCBlbWFpbC5wYXJzZXIKCmZyb20gLiBpbXBvcnQgX192ZXJzaW9uX18gYXMgd2hlZWxfdmVyc2lvbgoKTUVUQURBVEFfVkVSU0lPTiA9ICIyLjAiCgpQTFVSQUxfRklFTERTID0geyAiY2xhc3NpZmllciIgOiAiY2xhc3NpZmllcnMiLAogICAgICAgICAgICAgICAgICAicHJvdmlkZXNfZGlzdCIgOiAicHJvdmlkZXMiLAogICAgICAgICAgICAgICAgICAicHJvdmlkZXNfZXh0cmEiIDogImV4dHJhcyIgfQoKU0tJUF9GSUVMRFMgPSBzZXQoKQoKQ09OVEFDVF9GSUVMRFMgPSAoKHsiZW1haWwiOiJhdXRob3JfZW1haWwiLCAibmFtZSI6ICJhdXRob3IifSwKICAgICAgICAgICAgICAgICAgICAiYXV0aG9yIiksCiAgICAgICAgICAgICAgICAgICh7ImVtYWlsIjoibWFpbnRhaW5lcl9lbWFpbCIsICJuYW1lIjogIm1haW50YWluZXIifSwKICAgICAgICAgICAgICAgICAgICAibWFpbnRhaW5lciIpKQoKIyBjb21tb25seSBmaWxsZWQgb3V0IGFzICJVTktOT1dOIiBieSBkaXN0dXRpbHM6ClVOS05PV05fRklFTERTID0gc2V0KCgiYXV0aG9yIiwgImF1dGhvcl9lbWFpbCIsICJwbGF0Zm9ybSIsICJob21lX3BhZ2UiLAogICAgICAgICAgICAgICAgICAgICAgImxpY2Vuc2UiKSkKCiMgV2hlZWwgaXRzZWxmIGlzIHByb2JhYmx5IHRoZSBvbmx5IHByb2dyYW0gdGhhdCB1c2VzIG5vbi1leHRyYXMgbWFya2VycwojIGluIE1FVEFEQVRBL1BLRy1JTkZPLiBTdXBwb3J0IGl0cyBzeW50YXggd2l0aCB0aGUgZXh0cmEgYXQgdGhlIGVuZCBvbmx5LgpFWFRSQV9SRSA9IHJlLmNvbXBpbGUoIiIiXig/UDxwYWNrYWdlPi4qPykoO1xzKig/UDxjb25kaXRpb24+Lio/KShleHRyYSA9PSAnKD9QPGV4dHJhPi4qPyknKT8pJCIiIikKS0VZV09SRFNfUkUgPSByZS5jb21waWxlKCJbXDAtLF0rIikKCk1heVJlcXVpcmVzS2V5ID0gbmFtZWR0dXBsZSgnTWF5UmVxdWlyZXNLZXknLCAoJ2NvbmRpdGlvbicsICdleHRyYScpKQoKZGVmIHVuaXF1ZShpdGVyYWJsZSk6CiAgICAiIiIKICAgIFlpZWxkIHVuaXF1ZSB2YWx1ZXMgaW4gaXRlcmFibGUsIHByZXNlcnZpbmcgb3JkZXIuCiAgICAiIiIKICAgIHNlZW4gPSBzZXQoKQogICAgZm9yIHZhbHVlIGluIGl0ZXJhYmxlOgogICAgICAgIGlmIG5vdCB2YWx1ZSBpbiBzZWVuOgogICAgICAgICAgICBzZWVuLmFkZCh2YWx1ZSkKICAgICAgICAgICAgeWllbGQgdmFsdWUKCgpkZWYgaGFuZGxlX3JlcXVpcmVzKG1ldGFkYXRhLCBwa2dfaW5mbywga2V5KToKICAgICIiIgogICAgUGxhY2UgdGhlIHJ1bnRpbWUgcmVxdWlyZW1lbnRzIGZyb20gcGtnX2luZm8gaW50byBtZXRhZGF0YS4KICAgICIiIgogICAgbWF5X3JlcXVpcmVzID0gT3JkZXJlZERlZmF1bHREaWN0KGxpc3QpCiAgICBmb3IgdmFsdWUgaW4gc29ydGVkKHBrZ19pbmZvLmdldF9hbGwoa2V5KSk6CiAgICAgICAgZXh0cmFfbWF0Y2ggPSBFWFRSQV9SRS5zZWFyY2godmFsdWUpCiAgICAgICAgaWYgZXh0cmFfbWF0Y2g6CiAgICAgICAgICAgIGdyb3VwZGljdCA9IGV4dHJhX21hdGNoLmdyb3VwZGljdCgpCiAgICAgICAgICAgIGNvbmRpdGlvbiA9IGdyb3VwZGljdFsnY29uZGl0aW9uJ10KICAgICAgICAgICAgZXh0cmEgPSBncm91cGRpY3RbJ2V4dHJhJ10KICAgICAgICAgICAgcGFja2FnZSA9IGdyb3VwZGljdFsncGFja2FnZSddCiAgICAgICAgICAgIGlmIGNvbmRpdGlvbi5lbmRzd2l0aCgnIGFuZCAnKToKICAgICAgICAgICAgICAgIGNvbmRpdGlvbiA9IGNvbmRpdGlvbls6LTVdCiAgICAgICAgZWxzZToKICAgICAgICAgICAgY29uZGl0aW9uLCBleHRyYSA9IE5vbmUsIE5vbmUKICAgICAgICAgICAgcGFja2FnZSA9IHZhbHVlCiAgICAgICAga2V5ID0gTWF5UmVxdWlyZXNLZXkoY29uZGl0aW9uLCBleHRyYSkKICAgICAgICBtYXlfcmVxdWlyZXNba2V5XS5hcHBlbmQocGFja2FnZSkKCiAgICBpZiBtYXlfcmVxdWlyZXM6CiAgICAgICAgbWV0YWRhdGFbJ3J1bl9yZXF1aXJlcyddID0gW10KICAgICAgICBkZWYgc29ydF9rZXkoaXRlbSk6CiAgICAgICAgICAgICMgQm90aCBjb25kaXRpb24gYW5kIGV4dHJhIGNvdWxkIGJlIE5vbmUsIHdoaWNoIGNhbid0IGJlIGNvbXBhcmVkCiAgICAgICAgICAgICMgYWdhaW5zdCBzdHJpbmdzIGluIFB5dGhvbiAzLgogICAgICAgICAgICBrZXksIHZhbHVlID0gaXRlbQogICAgICAgICAgICBpZiBrZXkuY29uZGl0aW9uIGlzIE5vbmU6CiAgICAgICAgICAgICAgICByZXR1cm4gJycKICAgICAgICAgICAgcmV0dXJuIGtleS5jb25kaXRpb24KICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzb3J0ZWQobWF5X3JlcXVpcmVzLml0ZW1zKCksIGtleT1zb3J0X2tleSk6CiAgICAgICAgICAgIG1heV9yZXF1aXJlbWVudCA9IE9yZGVyZWREaWN0KCgoJ3JlcXVpcmVzJywgdmFsdWUpLCkpCiAgICAgICAgICAgIGlmIGtleS5leHRyYToKICAgICAgICAgICAgICAgIG1heV9yZXF1aXJlbWVudFsnZXh0cmEnXSA9IGtleS5leHRyYQogICAgICAgICAgICBpZiBrZXkuY29uZGl0aW9uOgogICAgICAgICAgICAgICAgbWF5X3JlcXVpcmVtZW50WydlbnZpcm9ubWVudCddID0ga2V5LmNvbmRpdGlvbgogICAgICAgICAgICBtZXRhZGF0YVsncnVuX3JlcXVpcmVzJ10uYXBwZW5kKG1heV9yZXF1aXJlbWVudCkKCiAgICAgICAgaWYgbm90ICdleHRyYXMnIGluIG1ldGFkYXRhOgogICAgICAgICAgICBtZXRhZGF0YVsnZXh0cmFzJ10gPSBbXQogICAgICAgIG1ldGFkYXRhWydleHRyYXMnXS5leHRlbmQoW2tleS5leHRyYSBmb3Iga2V5IGluIG1heV9yZXF1aXJlcy5rZXlzKCkgaWYga2V5LmV4dHJhXSkKCgpkZWYgcGtnaW5mb190b19kaWN0KHBhdGgsIGRpc3RyaWJ1dGlvbj1Ob25lKToKICAgICIiIgogICAgQ29udmVydCBQS0ctSU5GTyB0byBhIHByb3RvdHlwZSBNZXRhZGF0YSAyLjAgKFBFUCA0MjYpIGRpY3QuCgogICAgVGhlIGRlc2NyaXB0aW9uIGlzIGluY2x1ZGVkIHVuZGVyIHRoZSBrZXkgWydkZXNjcmlwdGlvbiddIHJhdGhlciB0aGFuCiAgICBiZWluZyB3cml0dGVuIHRvIGEgc2VwYXJhdGUgZmlsZS4KCiAgICBwYXRoOiBwYXRoIHRvIFBLRy1JTkZPIGZpbGUKICAgIGRpc3RyaWJ1dGlvbjogb3B0aW9uYWwgZGlzdHV0aWxzIERpc3RyaWJ1dGlvbigpCiAgICAiIiIKCiAgICBtZXRhZGF0YSA9IE9yZGVyZWREZWZhdWx0RGljdChsYW1iZGE6IE9yZGVyZWREZWZhdWx0RGljdChsYW1iZGE6IE9yZGVyZWREZWZhdWx0RGljdChPcmRlcmVkRGljdCkpKQogICAgbWV0YWRhdGFbImdlbmVyYXRvciJdID0gImJkaXN0X3doZWVsICgiICsgd2hlZWxfdmVyc2lvbiArICIpIgogICAgdHJ5OgogICAgICAgIHVuaWNvZGUKICAgICAgICBwa2dfaW5mbyA9IHJlYWRfcGtnX2luZm8ocGF0aCkKICAgIGV4Y2VwdCBOYW1lRXJyb3I6CiAgICAgICAgd2l0aCBvcGVuKHBhdGgsICdyYicpIGFzIHBrZ19pbmZvX2ZpbGU6CiAgICAgICAgICAgIHBrZ19pbmZvID0gZW1haWwucGFyc2VyLlBhcnNlcigpLnBhcnNlc3RyKHBrZ19pbmZvX2ZpbGUucmVhZCgpLmRlY29kZSgndXRmLTgnKSkKICAgIGRlc2NyaXB0aW9uID0gTm9uZQoKICAgIGlmIHBrZ19pbmZvWydTdW1tYXJ5J106CiAgICAgICAgbWV0YWRhdGFbJ3N1bW1hcnknXSA9IHBrZ2luZm9fdW5pY29kZShwa2dfaW5mbywgJ1N1bW1hcnknKQogICAgICAgIGRlbCBwa2dfaW5mb1snU3VtbWFyeSddCgogICAgaWYgcGtnX2luZm9bJ0Rlc2NyaXB0aW9uJ106CiAgICAgICAgZGVzY3JpcHRpb24gPSBkZWRlbnRfZGVzY3JpcHRpb24ocGtnX2luZm8pCiAgICAgICAgZGVsIHBrZ19pbmZvWydEZXNjcmlwdGlvbiddCiAgICBlbHNlOgogICAgICAgIHBheWxvYWQgPSBwa2dfaW5mby5nZXRfcGF5bG9hZCgpCiAgICAgICAgaWYgaXNpbnN0YW5jZShwYXlsb2FkLCBieXRlcyk6CiAgICAgICAgICAgICMgQXZvaWQgYSBQeXRob24gMiBVbmljb2RlIGVycm9yLgogICAgICAgICAgICAjIFdlIHN0aWxsIHN1ZmZlciA/IGdseXBocyBvbiBQeXRob24gMy4KICAgICAgICAgICAgcGF5bG9hZCA9IHBheWxvYWQuZGVjb2RlKCd1dGYtOCcpCiAgICAgICAgaWYgcGF5bG9hZDoKICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBwYXlsb2FkCgogICAgaWYgZGVzY3JpcHRpb246CiAgICAgICAgcGtnX2luZm9bJ2Rlc2NyaXB0aW9uJ10gPSBkZXNjcmlwdGlvbgoKICAgIGZvciBrZXkgaW4gc29ydGVkKHVuaXF1ZShrLmxvd2VyKCkgZm9yIGsgaW4gcGtnX2luZm8ua2V5cygpKSk6CiAgICAgICAgbG93X2tleSA9IGtleS5yZXBsYWNlKCctJywgJ18nKQoKICAgICAgICBpZiBsb3dfa2V5IGluIFNLSVBfRklFTERTOgogICAgICAgICAgICBjb250aW51ZQoKICAgICAgICBpZiBsb3dfa2V5IGluIFVOS05PV05fRklFTERTIGFuZCBwa2dfaW5mby5nZXQoa2V5KSA9PSAnVU5LTk9XTic6CiAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgIGlmIGxvd19rZXkgaW4gc29ydGVkKFBMVVJBTF9GSUVMRFMpOgogICAgICAgICAgICBtZXRhZGF0YVtQTFVSQUxfRklFTERTW2xvd19rZXldXSA9IHBrZ19pbmZvLmdldF9hbGwoa2V5KQoKICAgICAgICBlbGlmIGxvd19rZXkgPT0gInJlcXVpcmVzX2Rpc3QiOgogICAgICAgICAgICBoYW5kbGVfcmVxdWlyZXMobWV0YWRhdGEsIHBrZ19pbmZvLCBrZXkpCgogICAgICAgIGVsaWYgbG93X2tleSA9PSAncHJvdmlkZXNfZXh0cmEnOgogICAgICAgICAgICBpZiBub3QgJ2V4dHJhcycgaW4gbWV0YWRhdGE6CiAgICAgICAgICAgICAgICBtZXRhZGF0YVsnZXh0cmFzJ10gPSBbXQogICAgICAgICAgICBtZXRhZGF0YVsnZXh0cmFzJ10uZXh0ZW5kKHBrZ19pbmZvLmdldF9hbGwoa2V5KSkKCiAgICAgICAgZWxpZiBsb3dfa2V5ID09ICdob21lX3BhZ2UnOgogICAgICAgICAgICBtZXRhZGF0YVsnZXh0ZW5zaW9ucyddWydweXRob24uZGV0YWlscyddWydwcm9qZWN0X3VybHMnXSA9IHsnSG9tZSc6cGtnX2luZm9ba2V5XX0KCiAgICAgICAgZWxpZiBsb3dfa2V5ID09ICdrZXl3b3Jkcyc6CiAgICAgICAgICAgIG1ldGFkYXRhWydrZXl3b3JkcyddID0gS0VZV09SRFNfUkUuc3BsaXQocGtnX2luZm9ba2V5XSkKCiAgICAgICAgZWxzZToKICAgICAgICAgICAgbWV0YWRhdGFbbG93X2tleV0gPSBwa2dfaW5mb1trZXldCgogICAgbWV0YWRhdGFbJ21ldGFkYXRhX3ZlcnNpb24nXSA9IE1FVEFEQVRBX1ZFUlNJT04KCiAgICBpZiAnZXh0cmFzJyBpbiBtZXRhZGF0YToKICAgICAgICBtZXRhZGF0YVsnZXh0cmFzJ10gPSBzb3J0ZWQoc2V0KG1ldGFkYXRhWydleHRyYXMnXSkpCgogICAgIyBpbmNsdWRlIG1vcmUgaW5mb3JtYXRpb24gaWYgZGlzdHJpYnV0aW9uIGlzIGF2YWlsYWJsZQogICAgaWYgZGlzdHJpYnV0aW9uOgogICAgICAgIGZvciByZXF1aXJlcywgYXR0ciBpbiAoKCd0ZXN0X3JlcXVpcmVzJywgJ3Rlc3RzX3JlcXVpcmUnKSwpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXF1aXJlbWVudHMgPSBnZXRhdHRyKGRpc3RyaWJ1dGlvbiwgYXR0cikKICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UocmVxdWlyZW1lbnRzLCBsaXN0KToKICAgICAgICAgICAgICAgICAgICBuZXdfcmVxdWlyZW1lbnRzID0gc29ydGVkKGNvbnZlcnRfcmVxdWlyZW1lbnRzKHJlcXVpcmVtZW50cykpCiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFbcmVxdWlyZXNdID0gW3sncmVxdWlyZXMnOm5ld19yZXF1aXJlbWVudHN9XQogICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgICAgICBwYXNzCgogICAgIyBoYW5kbGUgY29udGFjdHMKICAgIGNvbnRhY3RzID0gW10KICAgIGZvciBjb250YWN0X3R5cGUsIHJvbGUgaW4gQ09OVEFDVF9GSUVMRFM6CiAgICAgICAgY29udGFjdCA9IE9yZGVyZWREaWN0KCkKICAgICAgICBmb3Iga2V5IGluIHNvcnRlZChjb250YWN0X3R5cGUpOgogICAgICAgICAgICBpZiBjb250YWN0X3R5cGVba2V5XSBpbiBtZXRhZGF0YToKICAgICAgICAgICAgICAgIGNvbnRhY3Rba2V5XSA9IG1ldGFkYXRhLnBvcChjb250YWN0X3R5cGVba2V5XSkKICAgICAgICBpZiBjb250YWN0OgogICAgICAgICAgICBjb250YWN0Wydyb2xlJ10gPSByb2xlCiAgICAgICAgICAgIGNvbnRhY3RzLmFwcGVuZChjb250YWN0KQogICAgaWYgY29udGFjdHM6CiAgICAgICAgbWV0YWRhdGFbJ2V4dGVuc2lvbnMnXVsncHl0aG9uLmRldGFpbHMnXVsnY29udGFjdHMnXSA9IGNvbnRhY3RzCgogICAgIyBjb252ZXJ0IGVudHJ5IHBvaW50cyB0byBleHBvcnRzCiAgICB0cnk6CiAgICAgICAgd2l0aCBvcGVuKG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUocGF0aCksICJlbnRyeV9wb2ludHMudHh0IiksICJyIikgYXMgZXBfZmlsZToKICAgICAgICAgICAgZXBfbWFwID0gcGtnX3Jlc291cmNlcy5FbnRyeVBvaW50LnBhcnNlX21hcChlcF9maWxlLnJlYWQoKSkKICAgICAgICBleHBvcnRzID0gT3JkZXJlZERpY3QoKQogICAgICAgIGZvciBncm91cCwgaXRlbXMgaW4gc29ydGVkKGVwX21hcC5pdGVtcygpKToKICAgICAgICAgICAgZXhwb3J0c1tncm91cF0gPSBPcmRlcmVkRGljdCgpCiAgICAgICAgICAgIGZvciBpdGVtIGluIHNvcnRlZChtYXAoc3RyLCBpdGVtcy52YWx1ZXMoKSkpOgogICAgICAgICAgICAgICAgbmFtZSwgZXhwb3J0ID0gaXRlbS5zcGxpdCgnID0gJywgMSkKICAgICAgICAgICAgICAgIGV4cG9ydHNbZ3JvdXBdW25hbWVdID0gZXhwb3J0CiAgICAgICAgaWYgZXhwb3J0czoKICAgICAgICAgICAgbWV0YWRhdGFbJ2V4dGVuc2lvbnMnXVsncHl0aG9uLmV4cG9ydHMnXSA9IGV4cG9ydHMKICAgIGV4Y2VwdCBJT0Vycm9yOgogICAgICAgIHBhc3MKCiAgICAjIGNvcHkgY29uc29sZV9zY3JpcHRzIGVudHJ5IHBvaW50cyB0byBjb21tYW5kcwogICAgaWYgJ3B5dGhvbi5leHBvcnRzJyBpbiBtZXRhZGF0YVsnZXh0ZW5zaW9ucyddOgogICAgICAgIGZvciAoZXBfc2NyaXB0LCB3cmFwX3NjcmlwdCkgaW4gKCgnY29uc29sZV9zY3JpcHRzJywgJ3dyYXBfY29uc29sZScpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnZ3VpX3NjcmlwdHMnLCAnd3JhcF9ndWknKSk6CiAgICAgICAgICAgIGlmIGVwX3NjcmlwdCBpbiBtZXRhZGF0YVsnZXh0ZW5zaW9ucyddWydweXRob24uZXhwb3J0cyddOgogICAgICAgICAgICAgICAgbWV0YWRhdGFbJ2V4dGVuc2lvbnMnXVsncHl0aG9uLmNvbW1hbmRzJ11bd3JhcF9zY3JpcHRdID0gXAogICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhWydleHRlbnNpb25zJ11bJ3B5dGhvbi5leHBvcnRzJ11bZXBfc2NyaXB0XQoKICAgIHJldHVybiBtZXRhZGF0YQoKZGVmIHJlcXVpcmVzX3RvX3JlcXVpcmVzX2Rpc3QocmVxdWlyZW1lbnQpOgogICAgIiIiQ29tcG9zZSB0aGUgdmVyc2lvbiBwcmVkaWNhdGVzIGZvciByZXF1aXJlbWVudCBpbiBQRVAgMzQ1IGZhc2hpb24uIiIiCiAgICByZXF1aXJlc19kaXN0ID0gW10KICAgIGZvciBvcCwgdmVyIGluIHJlcXVpcmVtZW50LnNwZWNzOgogICAgICAgIHJlcXVpcmVzX2Rpc3QuYXBwZW5kKG9wICsgdmVyKQogICAgaWYgbm90IHJlcXVpcmVzX2Rpc3Q6CiAgICAgICAgcmV0dXJuICcnCiAgICByZXR1cm4gIiAoJXMpIiAlICcsJy5qb2luKHJlcXVpcmVzX2Rpc3QpCgpkZWYgY29udmVydF9yZXF1aXJlbWVudHMocmVxdWlyZW1lbnRzKToKICAgICIiIllpZWxkIFJlcXVpcmVzLURpc3Q6IHN0cmluZ3MgZm9yIHBhcnNlZCByZXF1aXJlbWVudHMgc3RyaW5ncy4iIiIKICAgIGZvciByZXEgaW4gcmVxdWlyZW1lbnRzOgogICAgICAgIHBhcnNlZF9yZXF1aXJlbWVudCA9IHBrZ19yZXNvdXJjZXMuUmVxdWlyZW1lbnQucGFyc2UocmVxKQogICAgICAgIHNwZWMgPSByZXF1aXJlc190b19yZXF1aXJlc19kaXN0KHBhcnNlZF9yZXF1aXJlbWVudCkKICAgICAgICBleHRyYXMgPSAiLCIuam9pbihwYXJzZWRfcmVxdWlyZW1lbnQuZXh0cmFzKQogICAgICAgIGlmIGV4dHJhczoKICAgICAgICAgICAgZXh0cmFzID0gIlslc10iICUgZXh0cmFzCiAgICAgICAgeWllbGQgKHBhcnNlZF9yZXF1aXJlbWVudC5wcm9qZWN0X25hbWUgKyBleHRyYXMgKyBzcGVjKQoKZGVmIGdlbmVyYXRlX3JlcXVpcmVtZW50cyhleHRyYXNfcmVxdWlyZSk6CiAgICAiIiIKICAgIENvbnZlcnQgcmVxdWlyZW1lbnRzIGZyb20gYSBzZXR1cCgpLXN0eWxlIGRpY3Rpb25hcnkgdG8gKCdSZXF1aXJlcy1EaXN0JywgJ3JlcXVpcmVtZW50JykKICAgIGFuZCAoJ1Byb3ZpZGVzLUV4dHJhJywgJ2V4dHJhJykgdHVwbGVzLgoKICAgIGV4dHJhc19yZXF1aXJlIGlzIGEgZGljdGlvbmFyeSBvZiB7ZXh0cmE6IFtyZXF1aXJlbWVudHNdfSBhcyBwYXNzZWQgdG8gc2V0dXAoKSwKICAgIHVzaW5nIHRoZSBlbXB0eSBleHRyYSB7Jyc6IFtyZXF1aXJlbWVudHNdfSB0byBob2xkIGluc3RhbGxfcmVxdWlyZXMuCiAgICAiIiIKICAgIGZvciBleHRyYSwgZGVwZW5kcyBpbiBleHRyYXNfcmVxdWlyZS5pdGVtcygpOgogICAgICAgIGNvbmRpdGlvbiA9ICcnCiAgICAgICAgaWYgZXh0cmEgYW5kICc6JyBpbiBleHRyYTogICMgc2V0dXB0b29scyBleHRyYTpjb25kaXRpb24gc3ludGF4CiAgICAgICAgICAgIGV4dHJhLCBjb25kaXRpb24gPSBleHRyYS5zcGxpdCgnOicsIDEpCiAgICAgICAgICAgIGV4dHJhID0gcGtnX3Jlc291cmNlcy5zYWZlX2V4dHJhKGV4dHJhKQogICAgICAgIGlmIGV4dHJhOgogICAgICAgICAgICB5aWVsZCAoJ1Byb3ZpZGVzLUV4dHJhJywgZXh0cmEpCiAgICAgICAgICAgIGlmIGNvbmRpdGlvbjoKICAgICAgICAgICAgICAgIGNvbmRpdGlvbiArPSAiIGFuZCAiCiAgICAgICAgICAgIGNvbmRpdGlvbiArPSAiZXh0cmEgPT0gJyVzJyIgJSBleHRyYQogICAgICAgIGlmIGNvbmRpdGlvbjoKICAgICAgICAgICAgY29uZGl0aW9uID0gJzsgJyArIGNvbmRpdGlvbgogICAgICAgIGZvciBuZXdfcmVxIGluIGNvbnZlcnRfcmVxdWlyZW1lbnRzKGRlcGVuZHMpOgogICAgICAgICAgICB5aWVsZCAoJ1JlcXVpcmVzLURpc3QnLCBuZXdfcmVxICsgY29uZGl0aW9uKQoKZGVmIHBrZ2luZm9fdG9fbWV0YWRhdGEoZWdnX2luZm9fcGF0aCwgcGtnaW5mb19wYXRoKToKICAgICIiIgogICAgQ29udmVydCAuZWdnLWluZm8gZGlyZWN0b3J5IHdpdGggUEtHLUlORk8gdG8gdGhlIE1ldGFkYXRhIDEuMyBha2EKICAgIG9sZC1kcmFmdCBNZXRhZGF0YSAyLjAgZm9ybWF0LgogICAgIiIiCiAgICBwa2dfaW5mbyA9IHJlYWRfcGtnX2luZm8ocGtnaW5mb19wYXRoKQogICAgcGtnX2luZm8ucmVwbGFjZV9oZWFkZXIoJ01ldGFkYXRhLVZlcnNpb24nLCAnMi4wJykKICAgIHJlcXVpcmVzX3BhdGggPSBvcy5wYXRoLmpvaW4oZWdnX2luZm9fcGF0aCwgJ3JlcXVpcmVzLnR4dCcpCiAgICBpZiBvcy5wYXRoLmV4aXN0cyhyZXF1aXJlc19wYXRoKToKICAgICAgICB3aXRoIG9wZW4ocmVxdWlyZXNfcGF0aCkgYXMgcmVxdWlyZXNfZmlsZToKICAgICAgICAgICAgcmVxdWlyZXMgPSByZXF1aXJlc19maWxlLnJlYWQoKQogICAgICAgIGZvciBleHRyYSwgcmVxcyBpbiBzb3J0ZWQocGtnX3Jlc291cmNlcy5zcGxpdF9zZWN0aW9ucyhyZXF1aXJlcyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk9bGFtYmRhIHg6IHhbMF0gb3IgJycpOgogICAgICAgICAgICBmb3IgaXRlbSBpbiBnZW5lcmF0ZV9yZXF1aXJlbWVudHMoe2V4dHJhOiByZXFzfSk6CiAgICAgICAgICAgICAgICBwa2dfaW5mb1tpdGVtWzBdXSA9IGl0ZW1bMV0KCiAgICBkZXNjcmlwdGlvbiA9IHBrZ19pbmZvWydEZXNjcmlwdGlvbiddCiAgICBpZiBkZXNjcmlwdGlvbjoKICAgICAgICBwa2dfaW5mby5zZXRfcGF5bG9hZChkZWRlbnRfZGVzY3JpcHRpb24ocGtnX2luZm8pKQogICAgICAgIGRlbCBwa2dfaW5mb1snRGVzY3JpcHRpb24nXQoKICAgIHJldHVybiBwa2dfaW5mbwoKCmRlZiBwa2dpbmZvX3VuaWNvZGUocGtnX2luZm8sIGZpZWxkKToKICAgICIiIkhhY2sgdG8gY29heCBVbmljb2RlIG91dCBvZiBhbiBlbWFpbCBNZXNzYWdlKCkgLSBQeXRob24gMy4zKyIiIgogICAgdGV4dCA9IHBrZ19pbmZvW2ZpZWxkXQogICAgZmllbGQgPSBmaWVsZC5sb3dlcigpCiAgICBpZiBub3QgaXNpbnN0YW5jZSh0ZXh0LCBzdHIpOgogICAgICAgIGlmIG5vdCBoYXNhdHRyKHBrZ19pbmZvLCAncmF3X2l0ZW1zJyk6ICAjIFB5dGhvbiAzLjIKICAgICAgICAgICAgcmV0dXJuIHN0cih0ZXh0KQogICAgICAgIGZvciBpdGVtIGluIHBrZ19pbmZvLnJhd19pdGVtcygpOgogICAgICAgICAgICBpZiBpdGVtWzBdLmxvd2VyKCkgPT0gZmllbGQ6CiAgICAgICAgICAgICAgICB0ZXh0ID0gaXRlbVsxXS5lbmNvZGUoJ2FzY2lpJywgJ3N1cnJvZ2F0ZWVzY2FwZScpXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kZWNvZGUoJ3V0Zi04JykKICAgICAgICAgICAgICAgIGJyZWFrCgogICAgcmV0dXJuIHRleHQKCgpkZWYgZGVkZW50X2Rlc2NyaXB0aW9uKHBrZ19pbmZvKToKICAgICIiIgogICAgRGVkZW50IGFuZCBjb252ZXJ0IHBrZ19pbmZvWydEZXNjcmlwdGlvbiddIHRvIFVuaWNvZGUuCiAgICAiIiIKICAgIGRlc2NyaXB0aW9uID0gcGtnX2luZm9bJ0Rlc2NyaXB0aW9uJ10KCiAgICAjIFB5dGhvbiAzIFVuaWNvZGUgaGFuZGxpbmcsIHNvcnRhLgogICAgc3Vycm9nYXRlcyA9IEZhbHNlCiAgICBpZiBub3QgaXNpbnN0YW5jZShkZXNjcmlwdGlvbiwgc3RyKToKICAgICAgICBzdXJyb2dhdGVzID0gVHJ1ZQogICAgICAgIGRlc2NyaXB0aW9uID0gcGtnaW5mb191bmljb2RlKHBrZ19pbmZvLCAnRGVzY3JpcHRpb24nKQoKICAgIGRlc2NyaXB0aW9uX2xpbmVzID0gZGVzY3JpcHRpb24uc3BsaXRsaW5lcygpCiAgICBkZXNjcmlwdGlvbl9kZWRlbnQgPSAnXG4nLmpvaW4oCiAgICAgICAgICAgICMgaWYgdGhlIGZpcnN0IGxpbmUgb2YgbG9uZ19kZXNjcmlwdGlvbiBpcyBibGFuaywKICAgICAgICAgICAgIyB0aGUgZmlyc3QgbGluZSBoZXJlIHdpbGwgYmUgaW5kZW50ZWQuCiAgICAgICAgICAgIChkZXNjcmlwdGlvbl9saW5lc1swXS5sc3RyaXAoKSwKICAgICAgICAgICAgIHRleHR3cmFwLmRlZGVudCgnXG4nLmpvaW4oZGVzY3JpcHRpb25fbGluZXNbMTpdKSksCiAgICAgICAgICAgICAnXG4nKSkKCiAgICBpZiBzdXJyb2dhdGVzOgogICAgICAgIGRlc2NyaXB0aW9uX2RlZGVudCA9IGRlc2NyaXB0aW9uX2RlZGVudFwKICAgICAgICAgICAgICAgIC5lbmNvZGUoInV0ZjgiKVwKICAgICAgICAgICAgICAgIC5kZWNvZGUoImFzY2lpIiwgInN1cnJvZ2F0ZWVzY2FwZSIpCgogICAgcmV0dXJuIGRlc2NyaXB0aW9uX2RlZGVudAoKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICBpbXBvcnQgc3lzLCBwcHJpbnQKICAgIHBwcmludC5wcHJpbnQocGtnaW5mb190b19kaWN0KHN5cy5hcmd2WzFdKSkKUEsDBBQAAAAAAAAAIQBh9jXSagQAAGoEAAAjAAAAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvcGF0aHMucHkiIiIKSW5zdGFsbGF0aW9uIHBhdGhzLgoKTWFwIHRoZSAuZGF0YS8gc3ViZGlyZWN0b3J5IG5hbWVzIHRvIGluc3RhbGwgcGF0aHMuCiIiIgoKaW1wb3J0IG9zLnBhdGgKaW1wb3J0IHN5cwppbXBvcnQgZGlzdHV0aWxzLmRpc3QgYXMgZGlzdAppbXBvcnQgZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbCBhcyBpbnN0YWxsCgpkZWYgZ2V0X2luc3RhbGxfY29tbWFuZChuYW1lKToKICAgICMgbGF0ZSBiaW5kaW5nIGR1ZSB0byBwb3RlbnRpYWwgbW9ua2V5cGF0Y2hpbmcKICAgIGQgPSBkaXN0LkRpc3RyaWJ1dGlvbih7J25hbWUnOm5hbWV9KQogICAgaSA9IGluc3RhbGwuaW5zdGFsbChkKQogICAgaS5maW5hbGl6ZV9vcHRpb25zKCkKICAgIHJldHVybiBpCgpkZWYgZ2V0X2luc3RhbGxfcGF0aHMobmFtZSk6CiAgICAiIiIKICAgIFJldHVybiB0aGUgKGRpc3R1dGlscykgaW5zdGFsbCBwYXRocyBmb3IgdGhlIG5hbWVkIGRpc3QuCiAgICAKICAgIEEgZGljdCB3aXRoICgncHVyZWxpYicsICdwbGF0bGliJywgJ2hlYWRlcnMnLCAnc2NyaXB0cycsICdkYXRhJykga2V5cy4KICAgICIiIgogICAgcGF0aHMgPSB7fQoKICAgIGkgPSBnZXRfaW5zdGFsbF9jb21tYW5kKG5hbWUpCgogICAgZm9yIGtleSBpbiBpbnN0YWxsLlNDSEVNRV9LRVlTOgogICAgICAgIHBhdGhzW2tleV0gPSBnZXRhdHRyKGksICdpbnN0YWxsXycgKyBrZXkpCgogICAgIyBwaXAgdXNlcyBhIHNpbWlsYXIgcGF0aCBhcyBhbiBhbHRlcm5hdGl2ZSB0byB0aGUgc3lzdGVtJ3MgKHJlYWQtb25seSkKICAgICMgaW5jbHVkZSBkaXJlY3Rvcnk6CiAgICBpZiBoYXNhdHRyKHN5cywgJ3JlYWxfcHJlZml4Jyk6ICAjIHZpcnR1YWxlbnYKICAgICAgICBwYXRoc1snaGVhZGVycyddID0gb3MucGF0aC5qb2luKHN5cy5wcmVmaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5jbHVkZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2l0ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHl0aG9uJyArIHN5cy52ZXJzaW9uWzozXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpCgogICAgcmV0dXJuIHBhdGhzClBLAwQUAAAAAAAAACEAa2JWfMUWAADFFgAAKAAAAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3BlcDQyNXRhZ3MucHkiIiJHZW5lcmF0ZSBhbmQgd29yayB3aXRoIFBFUCA0MjUgQ29tcGF0aWJpbGl0eSBUYWdzLiIiIgoKaW1wb3J0IHN5cwppbXBvcnQgd2FybmluZ3MKCnRyeToKICAgIGltcG9ydCBzeXNjb25maWcKZXhjZXB0IEltcG9ydEVycm9yOiAgIyBwcmFnbWEgbm9jb3ZlcgogICAgIyBQeXRob24gPCAyLjcKICAgIGltcG9ydCBkaXN0dXRpbHMuc3lzY29uZmlnIGFzIHN5c2NvbmZpZwppbXBvcnQgZGlzdHV0aWxzLnV0aWwKCgpkZWYgZ2V0X2NvbmZpZ192YXIodmFyKToKICAgIHRyeToKICAgICAgICByZXR1cm4gc3lzY29uZmlnLmdldF9jb25maWdfdmFyKHZhcikKICAgIGV4Y2VwdCBJT0Vycm9yIGFzIGU6ICAjIHBpcCBJc3N1ZSAjMTA3NAogICAgICAgIHdhcm5pbmdzLndhcm4oInswfSIuZm9ybWF0KGUpLCBSdW50aW1lV2FybmluZykKICAgICAgICByZXR1cm4gTm9uZQoKCmRlZiBnZXRfYWJicl9pbXBsKCk6CiAgICAiIiJSZXR1cm4gYWJicmV2aWF0ZWQgaW1wbGVtZW50YXRpb24gbmFtZS4iIiIKICAgIGlmIGhhc2F0dHIoc3lzLCAncHlweV92ZXJzaW9uX2luZm8nKToKICAgICAgICBweWltcGwgPSAncHAnCiAgICBlbGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdqYXZhJyk6CiAgICAgICAgcHlpbXBsID0gJ2p5JwogICAgZWxpZiBzeXMucGxhdGZvcm0gPT0gJ2NsaSc6CiAgICAgICAgcHlpbXBsID0gJ2lwJwogICAgZWxzZToKICAgICAgICBweWltcGwgPSAnY3AnCiAgICByZXR1cm4gcHlpbXBsCgoKZGVmIGdldF9pbXBsX3ZlcigpOgogICAgIiIiUmV0dXJuIGltcGxlbWVudGF0aW9uIHZlcnNpb24uIiIiCiAgICBpbXBsX3ZlciA9IGdldF9jb25maWdfdmFyKCJweV92ZXJzaW9uX25vZG90IikKICAgIGlmIG5vdCBpbXBsX3ZlciBvciBnZXRfYWJicl9pbXBsKCkgPT0gJ3BwJzoKICAgICAgICBpbXBsX3ZlciA9ICcnLmpvaW4obWFwKHN0ciwgZ2V0X2ltcGxfdmVyc2lvbl9pbmZvKCkpKQogICAgcmV0dXJuIGltcGxfdmVyCgoKZGVmIGdldF9pbXBsX3ZlcnNpb25faW5mbygpOgogICAgIiIiUmV0dXJuIHN5cy52ZXJzaW9uX2luZm8tbGlrZSB0dXBsZSBmb3IgdXNlIGluIGRlY3JlbWVudGluZyB0aGUgbWlub3IKICAgIHZlcnNpb24uIiIiCiAgICBpZiBnZXRfYWJicl9pbXBsKCkgPT0gJ3BwJzoKICAgICAgICAjIGFzIHBlciBodHRwczovL2dpdGh1Yi5jb20vcHlwYS9waXAvaXNzdWVzLzI4ODIKICAgICAgICByZXR1cm4gKHN5cy52ZXJzaW9uX2luZm9bMF0sIHN5cy5weXB5X3ZlcnNpb25faW5mby5tYWpvciwKICAgICAgICAgICAgICAgIHN5cy5weXB5X3ZlcnNpb25faW5mby5taW5vcikKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIHN5cy52ZXJzaW9uX2luZm9bMF0sIHN5cy52ZXJzaW9uX2luZm9bMV0KCgpkZWYgZ2V0X2ZsYWcodmFyLCBmYWxsYmFjaywgZXhwZWN0ZWQ9VHJ1ZSwgd2Fybj1UcnVlKToKICAgICIiIlVzZSBhIGZhbGxiYWNrIG1ldGhvZCBmb3IgZGV0ZXJtaW5pbmcgU09BQkkgZmxhZ3MgaWYgdGhlIG5lZWRlZCBjb25maWcKICAgIHZhciBpcyB1bnNldCBvciB1bmF2YWlsYWJsZS4iIiIKICAgIHZhbCA9IGdldF9jb25maWdfdmFyKHZhcikKICAgIGlmIHZhbCBpcyBOb25lOgogICAgICAgIGlmIHdhcm46CiAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkNvbmZpZyB2YXJpYWJsZSAnezB9JyBpcyB1bnNldCwgUHl0aG9uIEFCSSB0YWcgbWF5ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAiYmUgaW5jb3JyZWN0Ii5mb3JtYXQodmFyKSwgUnVudGltZVdhcm5pbmcsIDIpCiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCkKICAgIHJldHVybiB2YWwgPT0gZXhwZWN0ZWQKCgpkZWYgZ2V0X2FiaV90YWcoKToKICAgICIiIlJldHVybiB0aGUgQUJJIHRhZyBiYXNlZCBvbiBTT0FCSSAoaWYgYXZhaWxhYmxlKSBvciBlbXVsYXRlIFNPQUJJCiAgICAoQ1B5dGhvbiAyLCBQeVB5KS4iIiIKICAgIHNvYWJpID0gZ2V0X2NvbmZpZ192YXIoJ1NPQUJJJykKICAgIGltcGwgPSBnZXRfYWJicl9pbXBsKCkKICAgIGlmIG5vdCBzb2FiaSBhbmQgaW1wbCBpbiAoJ2NwJywgJ3BwJykgYW5kIGhhc2F0dHIoc3lzLCAnbWF4dW5pY29kZScpOgogICAgICAgIGQgPSAnJwogICAgICAgIG0gPSAnJwogICAgICAgIHUgPSAnJwogICAgICAgIGlmIGdldF9mbGFnKCdQeV9ERUJVRycsCiAgICAgICAgICAgICAgICAgICAgbGFtYmRhOiBoYXNhdHRyKHN5cywgJ2dldHRvdGFscmVmY291bnQnKSwKICAgICAgICAgICAgICAgICAgICB3YXJuPShpbXBsID09ICdjcCcpKToKICAgICAgICAgICAgZCA9ICdkJwogICAgICAgIGlmIGdldF9mbGFnKCdXSVRIX1BZTUFMTE9DJywKICAgICAgICAgICAgICAgICAgICBsYW1iZGE6IGltcGwgPT0gJ2NwJywKICAgICAgICAgICAgICAgICAgICB3YXJuPShpbXBsID09ICdjcCcpKToKICAgICAgICAgICAgbSA9ICdtJwogICAgICAgIGlmIGdldF9mbGFnKCdQeV9VTklDT0RFX1NJWkUnLAogICAgICAgICAgICAgICAgICAgIGxhbWJkYTogc3lzLm1heHVuaWNvZGUgPT0gMHgxMGZmZmYsCiAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQ9NCwKICAgICAgICAgICAgICAgICAgICB3YXJuPShpbXBsID09ICdjcCcgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnZlcnNpb25faW5mbyA8ICgzLCAzKSkpIFwKICAgICAgICAgICAgICAgIGFuZCBzeXMudmVyc2lvbl9pbmZvIDwgKDMsIDMpOgogICAgICAgICAgICB1ID0gJ3UnCiAgICAgICAgYWJpID0gJyVzJXMlcyVzJXMnICUgKGltcGwsIGdldF9pbXBsX3ZlcigpLCBkLCBtLCB1KQogICAgZWxpZiBzb2FiaSBhbmQgc29hYmkuc3RhcnRzd2l0aCgnY3B5dGhvbi0nKToKICAgICAgICBhYmkgPSAnY3AnICsgc29hYmkuc3BsaXQoJy0nKVsxXQogICAgZWxpZiBzb2FiaToKICAgICAgICBhYmkgPSBzb2FiaS5yZXBsYWNlKCcuJywgJ18nKS5yZXBsYWNlKCctJywgJ18nKQogICAgZWxzZToKICAgICAgICBhYmkgPSBOb25lCiAgICByZXR1cm4gYWJpCgoKZGVmIGdldF9wbGF0Zm9ybSgpOgogICAgIiIiUmV0dXJuIG91ciBwbGF0Zm9ybSBuYW1lICd3aW4zMicsICdsaW51eF94ODZfNjQnIiIiCiAgICAjIFhYWCByZW1vdmUgZGlzdHV0aWxzIGRlcGVuZGVuY3kKICAgIHJlc3VsdCA9IGRpc3R1dGlscy51dGlsLmdldF9wbGF0Zm9ybSgpLnJlcGxhY2UoJy4nLCAnXycpLnJlcGxhY2UoJy0nLCAnXycpCiAgICBpZiByZXN1bHQgPT0gImxpbnV4X3g4Nl82NCIgYW5kIHN5cy5tYXhzaXplID09IDIxNDc0ODM2NDc6CiAgICAgICAgIyBwaXAgcHVsbCByZXF1ZXN0ICMzNDk3CiAgICAgICAgcmVzdWx0ID0gImxpbnV4X2k2ODYiCiAgICByZXR1cm4gcmVzdWx0CgoKZGVmIGdldF9zdXBwb3J0ZWQodmVyc2lvbnM9Tm9uZSwgc3VwcGxpZWRfcGxhdGZvcm09Tm9uZSk6CiAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIHN1cHBvcnRlZCB0YWdzIGZvciBlYWNoIHZlcnNpb24gc3BlY2lmaWVkIGluCiAgICBgdmVyc2lvbnNgLgoKICAgIDpwYXJhbSB2ZXJzaW9uczogYSBsaXN0IG9mIHN0cmluZyB2ZXJzaW9ucywgb2YgdGhlIGZvcm0gWyIzMyIsICIzMiJdLCAKICAgICAgICBvciBOb25lLiBUaGUgZmlyc3QgdmVyc2lvbiB3aWxsIGJlIGFzc3VtZWQgdG8gc3VwcG9ydCBvdXIgQUJJLgogICAgIiIiCiAgICBzdXBwb3J0ZWQgPSBbXQogICAgCiAgICAjIFZlcnNpb25zIG11c3QgYmUgZ2l2ZW4gd2l0aCByZXNwZWN0IHRvIHRoZSBwcmVmZXJlbmNlCiAgICBpZiB2ZXJzaW9ucyBpcyBOb25lOgogICAgICAgIHZlcnNpb25zID0gW10KICAgICAgICB2ZXJzaW9uX2luZm8gPSBnZXRfaW1wbF92ZXJzaW9uX2luZm8oKQogICAgICAgIG1ham9yID0gdmVyc2lvbl9pbmZvWzotMV0KICAgICAgICAjIFN1cHBvcnQgYWxsIHByZXZpb3VzIG1pbm9yIFB5dGhvbiB2ZXJzaW9ucy4KICAgICAgICBmb3IgbWlub3IgaW4gcmFuZ2UodmVyc2lvbl9pbmZvWy0xXSwgLTEsIC0xKToKICAgICAgICAgICAgdmVyc2lvbnMuYXBwZW5kKCcnLmpvaW4obWFwKHN0ciwgbWFqb3IgKyAobWlub3IsKSkpKQogICAgICAgICAgICAKICAgIGltcGwgPSBnZXRfYWJicl9pbXBsKCkKICAgIAogICAgYWJpcyA9IFtdCgogICAgYWJpID0gZ2V0X2FiaV90YWcoKQogICAgaWYgYWJpOgogICAgICAgIGFiaXNbMDowXSA9IFthYmldCiAKICAgIGFiaTNzID0gc2V0KCkKICAgIGltcG9ydCBpbXAKICAgIGZvciBzdWZmaXggaW4gaW1wLmdldF9zdWZmaXhlcygpOgogICAgICAgIGlmIHN1ZmZpeFswXS5zdGFydHN3aXRoKCcuYWJpJyk6CiAgICAgICAgICAgIGFiaTNzLmFkZChzdWZmaXhbMF0uc3BsaXQoJy4nLCAyKVsxXSkKCiAgICBhYmlzLmV4dGVuZChzb3J0ZWQobGlzdChhYmkzcykpKQoKICAgIGFiaXMuYXBwZW5kKCdub25lJykKCiAgICBwbGF0Zm9ybXMgPSBbXQogICAgaWYgc3VwcGxpZWRfcGxhdGZvcm06CiAgICAgICAgcGxhdGZvcm1zLmFwcGVuZChzdXBwbGllZF9wbGF0Zm9ybSkKICAgIHBsYXRmb3Jtcy5hcHBlbmQoZ2V0X3BsYXRmb3JtKCkpCiAgICAKICAgICMgQ3VycmVudCB2ZXJzaW9uLCBjdXJyZW50IEFQSSAoYnVpbHQgc3BlY2lmaWNhbGx5IGZvciBvdXIgUHl0aG9uKToKICAgIGZvciBhYmkgaW4gYWJpczoKICAgICAgICBmb3IgYXJjaCBpbiBwbGF0Zm9ybXM6CiAgICAgICAgICAgIHN1cHBvcnRlZC5hcHBlbmQoKCclcyVzJyAlIChpbXBsLCB2ZXJzaW9uc1swXSksIGFiaSwgYXJjaCkpCgogICAgIyBhYmkzIG1vZHVsZXMgY29tcGF0aWJsZSB3aXRoIG9sZGVyIHZlcnNpb24gb2YgUHl0aG9uCiAgICBmb3IgdmVyc2lvbiBpbiB2ZXJzaW9uc1sxOl06CiAgICAgICAgIyBhYmkzIHdhcyBpbnRyb2R1Y2VkIGluIFB5dGhvbiAzLjIKICAgICAgICBpZiB2ZXJzaW9uIGluICgnMzEnLCAnMzAnKToKICAgICAgICAgICAgYnJlYWsKICAgICAgICBmb3IgYWJpIGluIGFiaTNzOiAgICMgZW1wdHkgc2V0IGlmIG5vdCBQeXRob24gMwogICAgICAgICAgICBmb3IgYXJjaCBpbiBwbGF0Zm9ybXM6CiAgICAgICAgICAgICAgICBzdXBwb3J0ZWQuYXBwZW5kKCgiJXMlcyIgJSAoaW1wbCwgdmVyc2lvbiksIGFiaSwgYXJjaCkpCgogICAgIyBObyBhYmkgLyBhcmNoLCBidXQgcmVxdWlyZXMgb3VyIGltcGxlbWVudGF0aW9uOgogICAgZm9yIGksIHZlcnNpb24gaW4gZW51bWVyYXRlKHZlcnNpb25zKToKICAgICAgICBzdXBwb3J0ZWQuYXBwZW5kKCgnJXMlcycgJSAoaW1wbCwgdmVyc2lvbiksICdub25lJywgJ2FueScpKQogICAgICAgIGlmIGkgPT0gMDoKICAgICAgICAgICAgIyBUYWdnZWQgc3BlY2lmaWNhbGx5IGFzIGJlaW5nIGNyb3NzLXZlcnNpb24gY29tcGF0aWJsZSAKICAgICAgICAgICAgIyAod2l0aCBqdXN0IHRoZSBtYWpvciB2ZXJzaW9uIHNwZWNpZmllZCkKICAgICAgICAgICAgc3VwcG9ydGVkLmFwcGVuZCgoJyVzJXMnICUgKGltcGwsIHZlcnNpb25zWzBdWzBdKSwgJ25vbmUnLCAnYW55JykpIAogICAgCiAgICAjIE1ham9yIFB5dGhvbiB2ZXJzaW9uICsgcGxhdGZvcm07IGUuZy4gYmluYXJpZXMgbm90IHVzaW5nIHRoZSBQeXRob24gQVBJCiAgICBzdXBwb3J0ZWQuYXBwZW5kKCgncHklcycgJSAodmVyc2lvbnNbMF1bMF0pLCAnbm9uZScsIGFyY2gpKQoKICAgICMgTm8gYWJpIC8gYXJjaCwgZ2VuZXJpYyBQeXRob24KICAgIGZvciBpLCB2ZXJzaW9uIGluIGVudW1lcmF0ZSh2ZXJzaW9ucyk6CiAgICAgICAgc3VwcG9ydGVkLmFwcGVuZCgoJ3B5JXMnICUgKHZlcnNpb24sKSwgJ25vbmUnLCAnYW55JykpCiAgICAgICAgaWYgaSA9PSAwOgogICAgICAgICAgICBzdXBwb3J0ZWQuYXBwZW5kKCgncHklcycgJSAodmVyc2lvblswXSksICdub25lJywgJ2FueScpKQogICAgICAgIAogICAgcmV0dXJuIHN1cHBvcnRlZApQSwMEFAAAAAAAAAAhAIBDGKDJBAAAyQQAACUAAABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC9wa2dpbmZvLnB5IiIiVG9vbHMgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcgUEtHLUlORk8gLyBNRVRBREFUQSB3aXRob3V0IGNhcmluZwphYm91dCB0aGUgZW5jb2RpbmcuIiIiCgpmcm9tIGVtYWlsLnBhcnNlciBpbXBvcnQgUGFyc2VyCgp0cnk6CiAgICB1bmljb2RlCiAgICBfUFkzID0gRmFsc2UKZXhjZXB0IE5hbWVFcnJvcjoKICAgIF9QWTMgPSBUcnVlCgppZiBub3QgX1BZMzoKICAgIGZyb20gZW1haWwuZ2VuZXJhdG9yIGltcG9ydCBHZW5lcmF0b3IKICAgIAogICAgZGVmIHJlYWRfcGtnX2luZm9fYnl0ZXMoYnl0ZXN0cik6CiAgICAgICAgcmV0dXJuIFBhcnNlcigpLnBhcnNlc3RyKGJ5dGVzdHIpCgogICAgZGVmIHJlYWRfcGtnX2luZm8ocGF0aCk6CiAgICAgICAgd2l0aCBvcGVuKHBhdGgsICJyIikgYXMgaGVhZGVyczoKICAgICAgICAgICAgbWVzc2FnZSA9IFBhcnNlcigpLnBhcnNlKGhlYWRlcnMpCiAgICAgICAgcmV0dXJuIG1lc3NhZ2UKCiAgICBkZWYgd3JpdGVfcGtnX2luZm8ocGF0aCwgbWVzc2FnZSk6CiAgICAgICAgd2l0aCBvcGVuKHBhdGgsICd3JykgYXMgbWV0YWRhdGE6CiAgICAgICAgICAgIEdlbmVyYXRvcihtZXRhZGF0YSwgbWF4aGVhZGVybGVuPTApLmZsYXR0ZW4obWVzc2FnZSkgCgplbHNlOgogICAgZnJvbSBlbWFpbC5nZW5lcmF0b3IgaW1wb3J0IEJ5dGVzR2VuZXJhdG9yCiAgICBkZWYgcmVhZF9wa2dfaW5mb19ieXRlcyhieXRlc3RyKToKICAgICAgICBoZWFkZXJzID0gYnl0ZXN0ci5kZWNvZGUoZW5jb2Rpbmc9ImFzY2lpIiwgZXJyb3JzPSJzdXJyb2dhdGVlc2NhcGUiKQogICAgICAgIG1lc3NhZ2UgPSBQYXJzZXIoKS5wYXJzZXN0cihoZWFkZXJzKQogICAgICAgIHJldHVybiBtZXNzYWdlCgogICAgZGVmIHJlYWRfcGtnX2luZm8ocGF0aCk6CiAgICAgICAgd2l0aCBvcGVuKHBhdGgsICJyIiwgCiAgICAgICAgICAgICAgICAgIGVuY29kaW5nPSJhc2NpaSIsIAogICAgICAgICAgICAgICAgICBlcnJvcnM9InN1cnJvZ2F0ZWVzY2FwZSIpIGFzIGhlYWRlcnM6CiAgICAgICAgICAgIG1lc3NhZ2UgPSBQYXJzZXIoKS5wYXJzZShoZWFkZXJzKQogICAgICAgIHJldHVybiBtZXNzYWdlCgogICAgZGVmIHdyaXRlX3BrZ19pbmZvKHBhdGgsIG1lc3NhZ2UpOgogICAgICAgIHdpdGggb3BlbihwYXRoLCAid2IiKSBhcyBvdXQ6CiAgICAgICAgICAgIEJ5dGVzR2VuZXJhdG9yKG91dCwgbWF4aGVhZGVybGVuPTApLmZsYXR0ZW4obWVzc2FnZSkKClBLAwQUAAAAAAAAACEA/EzmTMMOAADDDgAAMQAAAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3NpZ25hdHVyZXMvX19pbml0X18ucHkiIiIKQ3JlYXRlIGFuZCB2ZXJpZnkgandzLWpzIGZvcm1hdCBFZDI1NTE5IHNpZ25hdHVyZXMuCiIiIgoKX19hbGxfXyA9IFsgJ3NpZ24nLCAndmVyaWZ5JyBdCgppbXBvcnQganNvbgpmcm9tIC4udXRpbCBpbXBvcnQgdXJsc2FmZV9iNjRkZWNvZGUsIHVybHNhZmVfYjY0ZW5jb2RlLCBuYXRpdmUsIGJpbmFyeQoKZWQyNTUxOWxsID0gTm9uZQoKQUxHID0gIkVkMjU1MTkiCgpkZWYgZ2V0X2VkMjU1MTlsbCgpOgogICAgIiIiTGF6eSBpbXBvcnQtYW5kLXRlc3Qgb2YgZWQyNTUxOSBtb2R1bGUiIiIKICAgIGdsb2JhbCBlZDI1NTE5bGwKICAgIAogICAgaWYgbm90IGVkMjU1MTlsbDoKICAgICAgICB0cnk6CiAgICAgICAgICAgIGltcG9ydCBlZDI1NTE5bGwgIyBmYXN0ICh0aG91c2FuZHMgLyBzKQogICAgICAgIGV4Y2VwdCAoSW1wb3J0RXJyb3IsIE9TRXJyb3IpOiAjIHByYWdtYSBub2NvdmVyCiAgICAgICAgICAgIGZyb20gLiBpbXBvcnQgZWQyNTUxOXB5IGFzIGVkMjU1MTlsbCAjIHB1cmUgUHl0aG9uIChodW5kcmVkcyAvIHMpCiAgICAgICAgdGVzdCgpCiAgICAKICAgIHJldHVybiBlZDI1NTE5bGwKCmRlZiBzaWduKHBheWxvYWQsIGtleXBhaXIpOgogICAgIiIiUmV0dXJuIGEgSldTLUpTIGZvcm1hdCBzaWduYXR1cmUgZ2l2ZW4gYSBKU09OLXNlcmlhbGl6YWJsZSBwYXlsb2FkIGFuZCAKICAgIGFuIEVkMjU1MTkga2V5cGFpci4iIiIKICAgIGdldF9lZDI1NTE5bGwoKQogICAgIwogICAgaGVhZGVyID0gewogICAgICAgICAgICAgICAgImFsZyI6IEFMRywKICAgICAgICAgICAgICAgICJqd2siOiB7CiAgICAgICAgICAgICAgICAgICAgImt0eSI6IEFMRywgIyBhbGcgLT4ga3R5IGluIGp3ay0wOC4KICAgICAgICAgICAgICAgICAgICAidmsiOiBuYXRpdmUodXJsc2FmZV9iNjRlbmNvZGUoa2V5cGFpci52aykpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAKICAgIGVuY29kZWRfaGVhZGVyID0gdXJsc2FmZV9iNjRlbmNvZGUoYmluYXJ5KGpzb24uZHVtcHMoaGVhZGVyLCBzb3J0X2tleXM9VHJ1ZSkpKQogICAgZW5jb2RlZF9wYXlsb2FkID0gdXJsc2FmZV9iNjRlbmNvZGUoYmluYXJ5KGpzb24uZHVtcHMocGF5bG9hZCwgc29ydF9rZXlzPVRydWUpKSkKICAgIHNlY3VyZWRfaW5wdXQgPSBiIi4iLmpvaW4oKGVuY29kZWRfaGVhZGVyLCBlbmNvZGVkX3BheWxvYWQpKQogICAgc2lnX21zZyA9IGVkMjU1MTlsbC5jcnlwdG9fc2lnbihzZWN1cmVkX2lucHV0LCBrZXlwYWlyLnNrKQogICAgc2lnbmF0dXJlID0gc2lnX21zZ1s6ZWQyNTUxOWxsLlNJR05BVFVSRUJZVEVTXQogICAgZW5jb2RlZF9zaWduYXR1cmUgPSB1cmxzYWZlX2I2NGVuY29kZShzaWduYXR1cmUpCiAgICAKICAgIHJldHVybiB7InJlY2lwaWVudHMiOiAKICAgICAgICAgICAgW3siaGVhZGVyIjpuYXRpdmUoZW5jb2RlZF9oZWFkZXIpLAogICAgICAgICAgICAgInNpZ25hdHVyZSI6bmF0aXZlKGVuY29kZWRfc2lnbmF0dXJlKX1dLAogICAgICAgICAgICAicGF5bG9hZCI6IG5hdGl2ZShlbmNvZGVkX3BheWxvYWQpfQoKZGVmIGFzc2VydFRydWUoY29uZGl0aW9uLCBtZXNzYWdlPSIiKToKICAgIGlmIG5vdCBjb25kaXRpb246CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihtZXNzYWdlKQogICAgCmRlZiB2ZXJpZnkoandzanMpOgogICAgIiIiUmV0dXJuIChkZWNvZGVkIGhlYWRlcnMsIHBheWxvYWQpIGlmIGFsbCBzaWduYXR1cmVzIGluIGp3c2pzIGFyZQogICAgY29uc2lzdGVudCwgZWxzZSByYWlzZSBWYWx1ZUVycm9yLgogICAgCiAgICBDYWxsZXIgbXVzdCBkZWNpZGUgd2hldGhlciB0aGUga2V5cyBhcmUgYWN0dWFsbHkgdHJ1c3RlZC4iIiIKICAgIGdldF9lZDI1NTE5bGwoKSAgICAKICAgICMgWFhYIGZvcmJpZCBkdXBsaWNhdGUga2V5cyBpbiBKU09OIGlucHV0IHVzaW5nIG9iamVjdF9wYWlyc19ob29rICgyLjcrKQogICAgcmVjaXBpZW50cyA9IGp3c2pzWyJyZWNpcGllbnRzIl0KICAgIGVuY29kZWRfcGF5bG9hZCA9IGJpbmFyeShqd3Nqc1sicGF5bG9hZCJdKQogICAgaGVhZGVycyA9IFtdCiAgICBmb3IgcmVjaXBpZW50IGluIHJlY2lwaWVudHM6CiAgICAgICAgYXNzZXJ0VHJ1ZShsZW4ocmVjaXBpZW50KSA9PSAyLCAiVW5rbm93biByZWNpcGllbnQga2V5IHswfSIuZm9ybWF0KHJlY2lwaWVudCkpCiAgICAgICAgaCA9IGJpbmFyeShyZWNpcGllbnRbImhlYWRlciJdKQogICAgICAgIHMgPSBiaW5hcnkocmVjaXBpZW50WyJzaWduYXR1cmUiXSkKICAgICAgICBoZWFkZXIgPSBqc29uLmxvYWRzKG5hdGl2ZSh1cmxzYWZlX2I2NGRlY29kZShoKSkpCiAgICAgICAgYXNzZXJ0VHJ1ZShoZWFkZXJbImFsZyJdID09IEFMRywgCiAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBhbGdvcml0aG0gezB9Ii5mb3JtYXQoaGVhZGVyWyJhbGciXSkpCiAgICAgICAgaWYgImFsZyIgaW4gaGVhZGVyWyJqd2siXSBhbmQgbm90ICJrdHkiIGluIGhlYWRlclsiandrIl06CiAgICAgICAgICAgIGhlYWRlclsiandrIl1bImt0eSJdID0gaGVhZGVyWyJqd2siXVsiYWxnIl0gIyBiL3cgZm9yIEpXSyA8IC0wOAogICAgICAgIGFzc2VydFRydWUoaGVhZGVyWyJqd2siXVsia3R5Il0gPT0gQUxHLCAjIHRydWUgZm9yIEVkMjU1MTkKICAgICAgICAgICAgICAgICJVbmV4cGVjdGVkIGtleSB0eXBlIHswfSIuZm9ybWF0KGhlYWRlclsiandrIl1bImt0eSJdKSkKICAgICAgICB2ayA9IHVybHNhZmVfYjY0ZGVjb2RlKGJpbmFyeShoZWFkZXJbImp3ayJdWyJ2ayJdKSkKICAgICAgICBzZWN1cmVkX2lucHV0ID0gYiIuIi5qb2luKChoLCBlbmNvZGVkX3BheWxvYWQpKQogICAgICAgIHNpZyA9IHVybHNhZmVfYjY0ZGVjb2RlKHMpCiAgICAgICAgc2lnX21zZyA9IHNpZytzZWN1cmVkX2lucHV0CiAgICAgICAgdmVyaWZpZWRfaW5wdXQgPSBuYXRpdmUoZWQyNTUxOWxsLmNyeXB0b19zaWduX29wZW4oc2lnX21zZywgdmspKQogICAgICAgIHZlcmlmaWVkX2hlYWRlciwgdmVyaWZpZWRfcGF5bG9hZCA9IHZlcmlmaWVkX2lucHV0LnNwbGl0KCcuJykKICAgICAgICB2ZXJpZmllZF9oZWFkZXIgPSBiaW5hcnkodmVyaWZpZWRfaGVhZGVyKQogICAgICAgIGRlY29kZWRfaGVhZGVyID0gbmF0aXZlKHVybHNhZmVfYjY0ZGVjb2RlKHZlcmlmaWVkX2hlYWRlcikpCiAgICAgICAgaGVhZGVycy5hcHBlbmQoanNvbi5sb2FkcyhkZWNvZGVkX2hlYWRlcikpCgogICAgdmVyaWZpZWRfcGF5bG9hZCA9IGJpbmFyeSh2ZXJpZmllZF9wYXlsb2FkKQoKICAgICMgb25seSByZXR1cm4gaGVhZGVyLCBwYXlsb2FkIHRoYXQgaGF2ZSBwYXNzZWQgdGhyb3VnaCB0aGUgY3J5cHRvIGxpYnJhcnkuCiAgICBwYXlsb2FkID0ganNvbi5sb2FkcyhuYXRpdmUodXJsc2FmZV9iNjRkZWNvZGUodmVyaWZpZWRfcGF5bG9hZCkpKQoKICAgIHJldHVybiBoZWFkZXJzLCBwYXlsb2FkCgpkZWYgdGVzdCgpOgogICAga3AgPSBlZDI1NTE5bGwuY3J5cHRvX3NpZ25fa2V5cGFpcigpCiAgICBwYXlsb2FkID0geyd0ZXN0JzogJ29uc3RhcnR1cCd9CiAgICBqd3NqcyA9IGpzb24ubG9hZHMoanNvbi5kdW1wcyhzaWduKHBheWxvYWQsIGtwKSkpCiAgICB2ZXJpZnkoandzanMpCiAgICBqd3Nqc1sncGF5bG9hZCddICs9ICd4JwogICAgdHJ5OgogICAgICAgIHZlcmlmeShqd3NqcykKICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgIHBhc3MKICAgIGVsc2U6ICMgcHJhZ21hIG5vIGNvdmVyCiAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJObyBlcnJvciBmcm9tIGJhZCB3aGVlbC5zaWduYXR1cmVzIHBheWxvYWQuIikKClBLAwQUAAAAAAAAACEA/FD/4GMaAABjGgAALgAAAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3NpZ25hdHVyZXMvZGpiZWMucHkjIEVkMjU1MTkgZGlnaXRhbCBzaWduYXR1cmVzCiMgQmFzZWQgb24gaHR0cDovL2VkMjU1MTkuY3IueXAudG8vcHl0aG9uL2VkMjU1MTkucHkKIyBTZWUgYWxzbyBodHRwOi8vZWQyNTUxOS5jci55cC50by9zb2Z0d2FyZS5odG1sCiMgQWRhcHRlZCBieSBSb24gR2FycmV0CiMgU3BlZCB1cCBjb25zaWRlcmFibHkgdXNpbmcgY29vcmRpbmF0ZSB0cmFuc2Zvcm1zIGZvdW5kIG9uOgojIGh0dHA6Ly93d3cuaHlwZXJlbGxpcHRpYy5vcmcvRUZEL2cxcC9hdXRvLXR3aXN0ZWQtZXh0ZW5kZWQtMS5odG1sCiMgU3BlY2lmaWNhbGx5IGFkZC0yMDA4LWh3Y2QtNCBhbmQgZGJsLTIwMDgtaHdjZAoKdHJ5OiAjIHByYWdtYSBub2NvdmVyCiAgICB1bmljb2RlCiAgICBQWTMgPSBGYWxzZQogICAgZGVmIGFzYnl0ZXMoYik6CiAgICAgICAgIiIiQ29udmVydCBhcnJheSBvZiBpbnRlZ2VycyB0byBieXRlIHN0cmluZyIiIgogICAgICAgIHJldHVybiAnJy5qb2luKGNocih4KSBmb3IgeCBpbiBiKQogICAgZGVmIGpvaW5ieXRlcyhiKToKICAgICAgICAiIiJDb252ZXJ0IGFycmF5IG9mIGJ5dGVzIHRvIGJ5dGUgc3RyaW5nIiIiCiAgICAgICAgcmV0dXJuICcnLmpvaW4oYikKICAgIGRlZiBiaXQoaCwgaSk6CiAgICAgICAgIiIiUmV0dXJuIGkndGggYml0IG9mIGJ5dGVzdHJpbmcgaCIiIgogICAgICAgIHJldHVybiAob3JkKGhbaS8vOF0pID4+IChpJTgpKSAmIDEKCmV4Y2VwdCBOYW1lRXJyb3I6ICMgcHJhZ21hIG5vY292ZXIKICAgIFBZMyA9IFRydWUKICAgIGFzYnl0ZXMgPSBieXRlcwogICAgam9pbmJ5dGVzID0gYnl0ZXMKICAgIGRlZiBiaXQoaCwgaSk6CiAgICAgICAgcmV0dXJuIChoW2kvLzhdID4+IChpJTgpKSAmIDEKCmltcG9ydCBoYXNobGliCgpiID0gMjU2CnEgPSAyKioyNTUgLSAxOQpsID0gMioqMjUyICsgMjc3NDIzMTc3NzczNzIzNTM1MzU4NTE5Mzc3OTA4ODM2NDg0OTMKCmRlZiBIKG0pOgogICAgcmV0dXJuIGhhc2hsaWIuc2hhNTEyKG0pLmRpZ2VzdCgpCgpkZWYgZXhwbW9kKGIsIGUsIG0pOgogICAgaWYgZSA9PSAwOiByZXR1cm4gMQogICAgdCA9IGV4cG1vZChiLCBlIC8vIDIsIG0pICoqIDIgJSBtCiAgICBpZiBlICYgMTogdCA9ICh0ICogYikgJSBtCiAgICByZXR1cm4gdAoKIyBDYW4gcHJvYmFibHkgZ2V0IHNvbWUgZXh0cmEgc3BlZWR1cCBoZXJlIGJ5IHJlcGxhY2luZyB0aGlzIHdpdGgKIyBhbiBleHRlbmRlZC1ldWNsaWRlYW4sIGJ1dCBwZXJmb3JtYW5jZSBzZWVtcyBPSyB3aXRob3V0IHRoYXQKZGVmIGludih4KToKICAgIHJldHVybiBleHBtb2QoeCwgcS0yLCBxKQoKZCA9IC0xMjE2NjUgKiBpbnYoMTIxNjY2KQpJID0gZXhwbW9kKDIsKHEtMSkvLzQscSkKCmRlZiB4cmVjb3Zlcih5KToKICAgIHh4ID0gKHkqeS0xKSAqIGludihkKnkqeSsxKQogICAgeCA9IGV4cG1vZCh4eCwocSszKS8vOCxxKQogICAgaWYgKHgqeCAtIHh4KSAlIHEgIT0gMDogeCA9ICh4KkkpICUgcQogICAgaWYgeCAlIDIgIT0gMDogeCA9IHEteAogICAgcmV0dXJuIHgKCkJ5ID0gNCAqIGludig1KQpCeCA9IHhyZWNvdmVyKEJ5KQpCID0gW0J4ICUgcSxCeSAlIHFdCgojZGVmIGVkd2FyZHMoUCxRKToKIyAgICB4MSA9IFBbMF0KIyAgICB5MSA9IFBbMV0KIyAgICB4MiA9IFFbMF0KIyAgICB5MiA9IFFbMV0KIyAgICB4MyA9ICh4MSp5Mit4Mip5MSkgKiBpbnYoMStkKngxKngyKnkxKnkyKQojICAgIHkzID0gKHkxKnkyK3gxKngyKSAqIGludigxLWQqeDEqeDIqeTEqeTIpCiMgICAgcmV0dXJuICh4MyAlIHEseTMgJSBxKQoKI2RlZiBzY2FsYXJtdWx0KFAsZSk6CiMgICAgaWYgZSA9PSAwOiByZXR1cm4gWzAsMV0KIyAgICBRID0gc2NhbGFybXVsdChQLGUvMikKIyAgICBRID0gZWR3YXJkcyhRLFEpCiMgICAgaWYgZSAmIDE6IFEgPSBlZHdhcmRzKFEsUCkKIyAgICByZXR1cm4gUQoKIyBGYXN0ZXIgKCEpIHZlcnNpb24gYmFzZWQgb246CiMgaHR0cDovL3d3dy5oeXBlcmVsbGlwdGljLm9yZy9FRkQvZzFwL2F1dG8tdHdpc3RlZC1leHRlbmRlZC0xLmh0bWwKCmRlZiB4cHRfYWRkKHB0MSwgcHQyKToKICAgIChYMSwgWTEsIFoxLCBUMSkgPSBwdDEKICAgIChYMiwgWTIsIFoyLCBUMikgPSBwdDIKICAgIEEgPSAoKFkxLVgxKSooWTIrWDIpKSAlIHEKICAgIEIgPSAoKFkxK1gxKSooWTItWDIpKSAlIHEKICAgIEMgPSAoWjEqMipUMikgJSBxCiAgICBEID0gKFQxKjIqWjIpICUgcQogICAgRSA9IChEK0MpICUgcQogICAgRiA9IChCLUEpICUgcQogICAgRyA9IChCK0EpICUgcQogICAgSCA9IChELUMpICUgcQogICAgWDMgPSAoRSpGKSAlIHEKICAgIFkzID0gKEcqSCkgJSBxCiAgICBaMyA9IChGKkcpICUgcQogICAgVDMgPSAoRSpIKSAlIHEKICAgIHJldHVybiAoWDMsIFkzLCBaMywgVDMpCgpkZWYgeHB0X2RvdWJsZSAocHQpOgogICAgKFgxLCBZMSwgWjEsIF8pID0gcHQKICAgIEEgPSAoWDEqWDEpCiAgICBCID0gKFkxKlkxKQogICAgQyA9ICgyKloxKloxKQogICAgRCA9ICgtQSkgJSBxCiAgICBKID0gKFgxK1kxKSAlIHEKICAgIEUgPSAoSipKLUEtQikgJSBxCiAgICBHID0gKEQrQikgJSBxCiAgICBGID0gKEctQykgJSBxCiAgICBIID0gKEQtQikgJSBxCiAgICBYMyA9IChFKkYpICUgcQogICAgWTMgPSAoRypIKSAlIHEKICAgIFozID0gKEYqRykgJSBxCiAgICBUMyA9IChFKkgpICUgcQogICAgcmV0dXJuIChYMywgWTMsIFozLCBUMykKCmRlZiBwdF94Zm9ybSAocHQpOgogICAgKHgsIHkpID0gcHQKICAgIHJldHVybiAoeCwgeSwgMSwgKHgqeSklcSkKCmRlZiBwdF91bnhmb3JtIChwdCk6CiAgICAoeCwgeSwgeiwgXykgPSBwdAogICAgcmV0dXJuICgoeCppbnYoeikpJXEsICh5Kmludih6KSklcSkKCmRlZiB4cHRfbXVsdCAocHQsIG4pOgogICAgaWYgbj09MDogcmV0dXJuIHB0X3hmb3JtKCgwLDEpKQogICAgXyA9IHhwdF9kb3VibGUoeHB0X211bHQocHQsIG4+PjEpKQogICAgcmV0dXJuIHhwdF9hZGQoXywgcHQpIGlmIG4mMSBlbHNlIF8KCmRlZiBzY2FsYXJtdWx0KHB0LCBlKToKICAgIHJldHVybiBwdF91bnhmb3JtKHhwdF9tdWx0KHB0X3hmb3JtKHB0KSwgZSkpCgpkZWYgZW5jb2RlaW50KHkpOgogICAgYml0cyA9IFsoeSA+PiBpKSAmIDEgZm9yIGkgaW4gcmFuZ2UoYildCiAgICBlID0gWyhzdW0oW2JpdHNbaSAqIDggKyBqXSA8PCBqIGZvciBqIGluIHJhbmdlKDgpXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGIvLzgpXQogICAgcmV0dXJuIGFzYnl0ZXMoZSkKCmRlZiBlbmNvZGVwb2ludChQKToKICAgIHggPSBQWzBdCiAgICB5ID0gUFsxXQogICAgYml0cyA9IFsoeSA+PiBpKSAmIDEgZm9yIGkgaW4gcmFuZ2UoYiAtIDEpXSArIFt4ICYgMV0KICAgIGUgPSBbKHN1bShbYml0c1tpICogOCArIGpdIDw8IGogZm9yIGogaW4gcmFuZ2UoOCldKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoYi8vOCldCiAgICByZXR1cm4gYXNieXRlcyhlKQogICAgCmRlZiBwdWJsaWNrZXkoc2spOgogICAgaCA9IEgoc2spCiAgICBhID0gMioqKGItMikgKyBzdW0oMioqaSAqIGJpdChoLGkpIGZvciBpIGluIHJhbmdlKDMsYi0yKSkKICAgIEEgPSBzY2FsYXJtdWx0KEIsYSkKICAgIHJldHVybiBlbmNvZGVwb2ludChBKQoKZGVmIEhpbnQobSk6CiAgICBoID0gSChtKQogICAgcmV0dXJuIHN1bSgyKippICogYml0KGgsaSkgZm9yIGkgaW4gcmFuZ2UoMipiKSkKCmRlZiBzaWduYXR1cmUobSxzayxwayk6CiAgICBoID0gSChzaykKICAgIGEgPSAyKiooYi0yKSArIHN1bSgyKippICogYml0KGgsaSkgZm9yIGkgaW4gcmFuZ2UoMyxiLTIpKQogICAgaW50ZXIgPSBqb2luYnl0ZXMoW2hbaV0gZm9yIGkgaW4gcmFuZ2UoYi8vOCxiLy80KV0pCiAgICByID0gSGludChpbnRlciArIG0pCiAgICBSID0gc2NhbGFybXVsdChCLHIpCiAgICBTID0gKHIgKyBIaW50KGVuY29kZXBvaW50KFIpICsgcGsgKyBtKSAqIGEpICUgbAogICAgcmV0dXJuIGVuY29kZXBvaW50KFIpICsgZW5jb2RlaW50KFMpCgpkZWYgaXNvbmN1cnZlKFApOgogICAgeCA9IFBbMF0KICAgIHkgPSBQWzFdCiAgICByZXR1cm4gKC14KnggKyB5KnkgLSAxIC0gZCp4KngqeSp5KSAlIHEgPT0gMAoKZGVmIGRlY29kZWludChzKToKICAgIHJldHVybiBzdW0oMioqaSAqIGJpdChzLGkpIGZvciBpIGluIHJhbmdlKDAsYikpCgpkZWYgZGVjb2RlcG9pbnQocyk6CiAgICB5ID0gc3VtKDIqKmkgKiBiaXQocyxpKSBmb3IgaSBpbiByYW5nZSgwLGItMSkpCiAgICB4ID0geHJlY292ZXIoeSkKICAgIGlmIHggJiAxICE9IGJpdChzLGItMSk6IHggPSBxLXgKICAgIFAgPSBbeCx5XQogICAgaWYgbm90IGlzb25jdXJ2ZShQKTogcmFpc2UgRXhjZXB0aW9uKCJkZWNvZGluZyBwb2ludCB0aGF0IGlzIG5vdCBvbiBjdXJ2ZSIpCiAgICByZXR1cm4gUAoKZGVmIGNoZWNrdmFsaWQocywgbSwgcGspOgogICAgaWYgbGVuKHMpICE9IGIvLzQ6IHJhaXNlIEV4Y2VwdGlvbigic2lnbmF0dXJlIGxlbmd0aCBpcyB3cm9uZyIpCiAgICBpZiBsZW4ocGspICE9IGIvLzg6IHJhaXNlIEV4Y2VwdGlvbigicHVibGljLWtleSBsZW5ndGggaXMgd3JvbmciKQogICAgUiA9IGRlY29kZXBvaW50KHNbMDpiLy84XSkKICAgIEEgPSBkZWNvZGVwb2ludChwaykKICAgIFMgPSBkZWNvZGVpbnQoc1tiLy84OmIvLzRdKQogICAgaCA9IEhpbnQoZW5jb2RlcG9pbnQoUikgKyBwayArIG0pCiAgICB2MSA9IHNjYWxhcm11bHQoQixTKQojICB2MiA9IGVkd2FyZHMoUixzY2FsYXJtdWx0KEEsaCkpCiAgICB2MiA9IHB0X3VueGZvcm0oeHB0X2FkZChwdF94Zm9ybShSKSwgcHRfeGZvcm0oc2NhbGFybXVsdChBLCBoKSkpKQogICAgcmV0dXJuIHYxPT12MgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojCiMgQ3VydmUyNTUxOSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gYnkgTWF0dGhldyBEZW1wc2t5LCBmcm9tOgojIGh0dHA6Ly9jci55cC50by9oaWdoc3BlZWQvbmFjbGNyeXB0by0yMDA5MDMxMC5wZGYKCiMgUCA9IDIgKiogMjU1IC0gMTkKUCA9IHEKQSA9IDQ4NjY2MgoKI2RlZiBleHBtb2QoYiwgZSwgbSk6CiMgICAgaWYgZSA9PSAwOiByZXR1cm4gMQojICAgIHQgPSBleHBtb2QoYiwgZSAvIDIsIG0pICoqIDIgJSBtCiMgICAgaWYgZSAmIDE6IHQgPSAodCAqIGIpICUgbQojICAgIHJldHVybiB0CgojIGRlZiBpbnYoeCk6IHJldHVybiBleHBtb2QoeCwgUCAtIDIsIFApCgpkZWYgYWRkKG4sIG0sIGQpOgogICAgKHhuLCB6bikgPSBuCiAgICAoeG0sIHptKSA9IG0gCiAgICAoeGQsIHpkKSA9IGQKICAgIHggPSA0ICogKHhtICogeG4gLSB6bSAqIHpuKSAqKiAyICogemQKICAgIHogPSA0ICogKHhtICogem4gLSB6bSAqIHhuKSAqKiAyICogeGQKICAgIHJldHVybiAoeCAlIFAsIHogJSBQKQoKZGVmIGRvdWJsZShuKToKICAgICh4biwgem4pID0gbgogICAgeCA9ICh4biAqKiAyIC0gem4gKiogMikgKiogMgogICAgeiA9IDQgKiB4biAqIHpuICogKHhuICoqIDIgKyBBICogeG4gKiB6biArIHpuICoqIDIpCiAgICByZXR1cm4gKHggJSBQLCB6ICUgUCkKCmRlZiBjdXJ2ZTI1NTE5KG4sIGJhc2U9OSk6CiAgICBvbmUgPSAoYmFzZSwxKQogICAgdHdvID0gZG91YmxlKG9uZSkKICAgICMgZihtKSBldmFsdWF0ZXMgdG8gYSB0dXBsZQogICAgIyBjb250YWluaW5nIHRoZSBtdGggbXVsdGlwbGUgYW5kIHRoZQogICAgIyAobSsxKXRoIG11bHRpcGxlIG9mIGJhc2UuCiAgICBkZWYgZihtKToKICAgICAgICBpZiBtID09IDE6IHJldHVybiAob25lLCB0d28pCiAgICAgICAgKHBtLCBwbTEpID0gZihtIC8vIDIpCiAgICAgICAgaWYgKG0gJiAxKToKICAgICAgICAgICAgcmV0dXJuIChhZGQocG0sIHBtMSwgb25lKSwgZG91YmxlKHBtMSkpCiAgICAgICAgcmV0dXJuIChkb3VibGUocG0pLCBhZGQocG0sIHBtMSwgb25lKSkKICAgICgoeCx6KSwgXykgPSBmKG4pCiAgICByZXR1cm4gKHggKiBpbnYoeikpICUgUAoKaW1wb3J0IHJhbmRvbQoKZGVmIGdlbmtleShuPTApOgogICAgbiA9IG4gb3IgcmFuZG9tLnJhbmRpbnQoMCxQKQogICAgbiAmPSB+NwogICAgbiAmPSB+KDEyOCA8PCA4ICogMzEpCiAgICBuIHw9IDY0IDw8IDggKiAzMQogICAgcmV0dXJuIG4KCiNkZWYgc3RyMmludChzKToKIyAgICByZXR1cm4gaW50KGhleGxpZnkocyksIDE2KQojICAgICMgcmV0dXJuIHN1bShvcmQoc1tpXSkgPDwgKDggKiBpKSBmb3IgaSBpbiByYW5nZSgzMikpCiMKI2RlZiBpbnQyc3RyKG4pOgojICAgIHJldHVybiB1bmhleGxpZnkoIiV4IiAlIG4pCiMgICAgIyByZXR1cm4gJycuam9pbihbY2hyKChuID4+ICg4ICogaSkpICYgMjU1KSBmb3IgaSBpbiByYW5nZSgzMildKQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKZGVmIGRzYV90ZXN0KCk6CiAgICBpbXBvcnQgb3MKICAgIG1zZyA9IHN0cihyYW5kb20ucmFuZGludChxLHErcSkpLmVuY29kZSgndXRmLTgnKQogICAgc2sgPSBvcy51cmFuZG9tKDMyKQogICAgcGsgPSBwdWJsaWNrZXkoc2spCiAgICBzaWcgPSBzaWduYXR1cmUobXNnLCBzaywgcGspCiAgICByZXR1cm4gY2hlY2t2YWxpZChzaWcsIG1zZywgcGspCgpkZWYgZGhfdGVzdCgpOgogICAgc2sxID0gZ2Vua2V5KCkKICAgIHNrMiA9IGdlbmtleSgpCiAgICByZXR1cm4gY3VydmUyNTUxOShzazEsIGN1cnZlMjU1MTkoc2syKSkgPT0gY3VydmUyNTUxOShzazIsIGN1cnZlMjU1MTkoc2sxKSkKClBLAwQUAAAAAAAAACEATAElPp8GAACfBgAAMgAAAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3NpZ25hdHVyZXMvZWQyNTUxOXB5LnB5IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KCmltcG9ydCB3YXJuaW5ncwppbXBvcnQgb3MKCmZyb20gY29sbGVjdGlvbnMgaW1wb3J0IG5hbWVkdHVwbGUKZnJvbSAuIGltcG9ydCBkamJlYwoKX19hbGxfXyA9IFsnY3J5cHRvX3NpZ24nLCAnY3J5cHRvX3NpZ25fb3BlbicsICdjcnlwdG9fc2lnbl9rZXlwYWlyJywgJ0tleXBhaXInLAogICAgICAgICAgICdQVUJMSUNLRVlCWVRFUycsICdTRUNSRVRLRVlCWVRFUycsICdTSUdOQVRVUkVCWVRFUyddCgpQVUJMSUNLRVlCWVRFUz0zMgpTRUNSRVRLRVlCWVRFUz02NApTSUdOQVRVUkVCWVRFUz02NAoKS2V5cGFpciA9IG5hbWVkdHVwbGUoJ0tleXBhaXInLCAoJ3ZrJywgJ3NrJykpICMgdmVyaWZ5aW5nIGtleSwgc2VjcmV0IGtleQoKZGVmIGNyeXB0b19zaWduX2tleXBhaXIoc2VlZD1Ob25lKToKICAgICIiIlJldHVybiAodmVyaWZ5aW5nLCBzZWNyZXQpIGtleSBmcm9tIGEgZ2l2ZW4gc2VlZCwgb3Igb3MudXJhbmRvbSgzMikiIiIgICAgCiAgICBpZiBzZWVkIGlzIE5vbmU6CiAgICAgICAgc2VlZCA9IG9zLnVyYW5kb20oUFVCTElDS0VZQllURVMpCiAgICBlbHNlOgogICAgICAgIHdhcm5pbmdzLndhcm4oImVkMjU1MTlsbCBzaG91bGQgY2hvb3NlIHJhbmRvbSBzZWVkLiIsCiAgICAgICAgICAgICAgICAgICAgICBSdW50aW1lV2FybmluZykKICAgIGlmIGxlbihzZWVkKSAhPSAzMjoKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJzZWVkIG11c3QgYmUgMzIgcmFuZG9tIGJ5dGVzIG9yIE5vbmUuIikKICAgIHNrYnl0ZXMgPSBzZWVkCiAgICB2a2J5dGVzID0gZGpiZWMucHVibGlja2V5KHNrYnl0ZXMpCiAgICByZXR1cm4gS2V5cGFpcih2a2J5dGVzLCBza2J5dGVzK3ZrYnl0ZXMpCgoKZGVmIGNyeXB0b19zaWduKG1zZywgc2spOgogICAgIiIiUmV0dXJuIHNpZ25hdHVyZSttZXNzYWdlIGdpdmVuIG1lc3NhZ2UgYW5kIHNlY3JldCBrZXkuCiAgICBUaGUgc2lnbmF0dXJlIGlzIHRoZSBmaXJzdCBTSUdOQVRVUkVCWVRFUyBieXRlcyBvZiB0aGUgcmV0dXJuIHZhbHVlLgogICAgQSBjb3B5IG9mIG1zZyBpcyBpbiB0aGUgcmVtYWluZGVyLiIiIgogICAgaWYgbGVuKHNrKSAhPSBTRUNSRVRLRVlCWVRFUzoKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJCYWQgc2lnbmluZyBrZXkgbGVuZ3RoICVkIiAlIGxlbihzaykpCiAgICB2a2J5dGVzID0gc2tbUFVCTElDS0VZQllURVM6XQogICAgc2tieXRlcyA9IHNrWzpQVUJMSUNLRVlCWVRFU10KICAgIHNpZyA9IGRqYmVjLnNpZ25hdHVyZShtc2csIHNrYnl0ZXMsIHZrYnl0ZXMpCiAgICByZXR1cm4gc2lnICsgbXNnCgoKZGVmIGNyeXB0b19zaWduX29wZW4oc2lnbmVkLCB2ayk6CiAgICAiIiJSZXR1cm4gbWVzc2FnZSBnaXZlbiBzaWduYXR1cmUrbWVzc2FnZSBhbmQgdGhlIHZlcmlmeWluZyBrZXkuIiIiCiAgICBpZiBsZW4odmspICE9IFBVQkxJQ0tFWUJZVEVTOgogICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkJhZCB2ZXJpZnlpbmcga2V5IGxlbmd0aCAlZCIgJSBsZW4odmspKQogICAgcmMgPSBkamJlYy5jaGVja3ZhbGlkKHNpZ25lZFs6U0lHTkFUVVJFQllURVNdLCBzaWduZWRbU0lHTkFUVVJFQllURVM6XSwgdmspCiAgICBpZiBub3QgcmM6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigicmMgIT0gVHJ1ZSIsIHJjKSAgICAKICAgIHJldHVybiBzaWduZWRbU0lHTkFUVVJFQllURVM6XQoKUEsDBBQAAAAAAAAAIQDb2+It9AwAAPQMAAAtAAAAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvc2lnbmF0dXJlcy9rZXlzLnB5IiIiU3RvcmUgYW5kIHJldHJpZXZlIHdoZWVsIHNpZ25pbmcgLyB2ZXJpZnlpbmcga2V5cy4KCkdpdmVuIGEgc2NvcGUgKGEgcGFja2FnZSBuYW1lLCArIG1lYW5pbmcgImFsbCBwYWNrYWdlcyIsIG9yIC0gbWVhbmluZyAKIm5vIHBhY2thZ2VzIiksIHJldHVybiBhIGxpc3Qgb2YgdmVyaWZ5aW5nIGtleXMgdGhhdCBhcmUgdHJ1c3RlZCBmb3IgdGhhdCAKc2NvcGUuCgpHaXZlbiBhIHBhY2thZ2UgbmFtZSwgcmV0dXJuIGEgbGlzdCBvZiAoc2NvcGUsIGtleSkgc3VnZ2VzdGVkIGtleXMgdG8gc2lnbgp0aGF0IHBhY2thZ2UgKG9ubHkgdGhlIHZlcmlmeWluZyBrZXlzOyB0aGUgcHJpdmF0ZSBzaWduaW5nIGtleSBpcyBzdG9yZWQKZWxzZXdoZXJlKS4KCktleXMgaGVyZSBhcmUgcmVwcmVzZW50ZWQgYXMgdXJsc2FmZV9iNjRlbmNvZGVkIHN0cmluZ3Mgd2l0aCBubyBwYWRkaW5nLgoKVGVudGF0aXZlIGNvbW1hbmQgbGluZSBpbnRlcmZhY2U6CgojIGxpc3QgdHJ1c3RzCndoZWVsIHRydXN0CiMgdHJ1c3QgYSBwYXJ0aWN1bGFyIGtleSBmb3IgYWxsCndoZWVsIHRydXN0ICsga2V5CiMgdHJ1c3Qga2V5IGZvciBiZWFnbGV2b3RlCndoZWVsIHRydXN0IGJlYWdsZXZvdGUga2V5CiMgc3RvcCB0cnVzdGluZyBhIGtleSBmb3IgYWxsCndoZWVsIHVudHJ1c3QgKyBrZXkKCiMgZ2VuZXJhdGUgYSBrZXkgcGFpcgp3aGVlbCBrZXlnZW4KCiMgaW1wb3J0IGEgc2lnbmluZyBrZXkgZnJvbSBhIGZpbGUKd2hlZWwgaW1wb3J0IGtleWZpbGUKCiMgZXhwb3J0IGEgc2lnbmluZyBrZXkKd2hlZWwgZXhwb3J0IGtleQoiIiIKCmltcG9ydCBqc29uCmltcG9ydCBvcy5wYXRoCmZyb20gLi51dGlsIGltcG9ydCBuYXRpdmUsIGxvYWRfY29uZmlnX3BhdGhzLCBzYXZlX2NvbmZpZ19wYXRoCgpjbGFzcyBXaGVlbEtleXMob2JqZWN0KToKICAgIFNDSEVNQSA9IDEKICAgIENPTkZJR19OQU1FID0gJ3doZWVsLmpzb24nCiAgICAKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLmRhdGEgPSB7J3NpZ25lcnMnOltdLCAndmVyaWZpZXJzJzpbXX0KICAgICAgICAKICAgIGRlZiBsb2FkKHNlbGYpOgogICAgICAgICMgWFhYIEpTT04gaXMgbm90IGEgZ3JlYXQgZGF0YWJhc2UKICAgICAgICBmb3IgcGF0aCBpbiBsb2FkX2NvbmZpZ19wYXRocygnd2hlZWwnKToKICAgICAgICAgICAgY29uZiA9IG9zLnBhdGguam9pbihuYXRpdmUocGF0aCksIHNlbGYuQ09ORklHX05BTUUpCiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGNvbmYpOgogICAgICAgICAgICAgICAgd2l0aCBvcGVuKGNvbmYsICdyJykgYXMgaW5maWxlOgogICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IGpzb24ubG9hZChpbmZpbGUpCiAgICAgICAgICAgICAgICAgICAgZm9yIHggaW4gKCdzaWduZXJzJywgJ3ZlcmlmaWVycycpOgogICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgeCBpbiBzZWxmLmRhdGE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGFbeF0gPSBbXQogICAgICAgICAgICAgICAgICAgIGlmICdzY2hlbWEnIG5vdCBpbiBzZWxmLmRhdGE6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YVsnc2NoZW1hJ10gPSBzZWxmLlNDSEVNQQogICAgICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5kYXRhWydzY2hlbWEnXSAhPSBzZWxmLlNDSEVNQToKICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYWQgd2hlZWwuanNvbiB2ZXJzaW9uIHswfSwgZXhwZWN0ZWQgezF9Ii5mb3JtYXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhWydzY2hlbWEnXSwgc2VsZi5TQ0hFTUEpKQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICByZXR1cm4gc2VsZgoKICAgIGRlZiBzYXZlKHNlbGYpOgogICAgICAgICMgVHJ5IG5vdCB0byBjYWxsIHRoaXMgYSB2ZXJ5IGxvbmcgdGltZSBhZnRlciBsb2FkKCkgCiAgICAgICAgcGF0aCA9IHNhdmVfY29uZmlnX3BhdGgoJ3doZWVsJykKICAgICAgICBjb25mID0gb3MucGF0aC5qb2luKG5hdGl2ZShwYXRoKSwgc2VsZi5DT05GSUdfTkFNRSkKICAgICAgICB3aXRoIG9wZW4oY29uZiwgJ3crJykgYXMgb3V0OgogICAgICAgICAgICBqc29uLmR1bXAoc2VsZi5kYXRhLCBvdXQsIGluZGVudD0yKQogICAgICAgIHJldHVybiBzZWxmCiAgICAKICAgIGRlZiB0cnVzdChzZWxmLCBzY29wZSwgdmspOgogICAgICAgICIiIlN0YXJ0IHRydXN0aW5nIGEgcGFydGljdWxhciBrZXkgZm9yIGdpdmVuIHNjb3BlLiIiIgogICAgICAgIHNlbGYuZGF0YVsndmVyaWZpZXJzJ10uYXBwZW5kKHsnc2NvcGUnOnNjb3BlLCAndmsnOnZrfSkKICAgICAgICByZXR1cm4gc2VsZgogICAgCiAgICBkZWYgdW50cnVzdChzZWxmLCBzY29wZSwgdmspOgogICAgICAgICIiIlN0b3AgdHJ1c3RpbmcgYSBwYXJ0aWN1bGFyIGtleSBmb3IgZ2l2ZW4gc2NvcGUuIiIiCiAgICAgICAgc2VsZi5kYXRhWyd2ZXJpZmllcnMnXS5yZW1vdmUoeydzY29wZSc6c2NvcGUsICd2ayc6dmt9KQogICAgICAgIHJldHVybiBzZWxmCiAgICAgICAgCiAgICBkZWYgdHJ1c3RlZChzZWxmLCBzY29wZT1Ob25lKToKICAgICAgICAiIiJSZXR1cm4gbGlzdCBvZiBbKHNjb3BlLCB0cnVzdGVkIGtleSksIC4uLl0gZm9yIGdpdmVuIHNjb3BlLiIiIgogICAgICAgIHRydXN0ID0gWyh4WydzY29wZSddLCB4Wyd2ayddKSBmb3IgeCBpbiBzZWxmLmRhdGFbJ3ZlcmlmaWVycyddIGlmIHhbJ3Njb3BlJ10gaW4gKHNjb3BlLCAnKycpXQogICAgICAgIHRydXN0LnNvcnQoa2V5PWxhbWJkYSB4OiB4WzBdKQogICAgICAgIHRydXN0LnJldmVyc2UoKQogICAgICAgIHJldHVybiB0cnVzdAogICAgCiAgICBkZWYgc2lnbmVycyhzZWxmLCBzY29wZSk6CiAgICAgICAgIiIiUmV0dXJuIGxpc3Qgb2Ygc2lnbmluZyBrZXkocykuIiIiCiAgICAgICAgc2lnbiA9IFsoeFsnc2NvcGUnXSwgeFsndmsnXSkgZm9yIHggaW4gc2VsZi5kYXRhWydzaWduZXJzJ10gaWYgeFsnc2NvcGUnXSBpbiAoc2NvcGUsICcrJyldCiAgICAgICAgc2lnbi5zb3J0KGtleT1sYW1iZGEgeDogeFswXSkKICAgICAgICBzaWduLnJldmVyc2UoKQogICAgICAgIHJldHVybiBzaWduCiAgICAKICAgIGRlZiBhZGRfc2lnbmVyKHNlbGYsIHNjb3BlLCB2ayk6CiAgICAgICAgIiIiUmVtZW1iZXIgdmVyaWZ5aW5nIGtleSB2ayBhcyBiZWluZyB2YWxpZCBmb3Igc2lnbmluZyBpbiBzY29wZS4iIiIKICAgICAgICBzZWxmLmRhdGFbJ3NpZ25lcnMnXS5hcHBlbmQoeydzY29wZSc6c2NvcGUsICd2ayc6dmt9KQogICAgClBLAwQUAAAAAAAAACEA/55lcAEAAAABAAAAKwAAAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvX19pbml0X18ucHkjUEsDBBQAAAAAAAAAIQAAAAAAAAAAAAAAAAA4AAAAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9jb21wbGV4LWRpc3QvX19pbml0X18ucHlQSwMEFAAAAAAAAAAhAEoXR9IXAAAAFwAAAEQAAABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L2NvbXBsZXgtZGlzdC9jb21wbGV4ZGlzdC9fX2luaXRfXy5weWRlZiBtYWluKCk6CiAgICByZXR1cm4KUEsDBBQAAAAAAAAAIQAcChc4VwMAAFcDAAA1AAAAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9jb21wbGV4LWRpc3Qvc2V0dXAucHlmcm9tIHNldHVwdG9vbHMgaW1wb3J0IHNldHVwCgp0cnk6CiAgICB1bmljb2RlCiAgICBkZWYgdTgocyk6CiAgICAgICAgcmV0dXJuIHMuZGVjb2RlKCd1bmljb2RlLWVzY2FwZScpCmV4Y2VwdCBOYW1lRXJyb3I6CiAgICBkZWYgdTgocyk6CiAgICAgICAgcmV0dXJuIHMKCnNldHVwKG5hbWU9J2NvbXBsZXgtZGlzdCcsCiAgICAgIHZlcnNpb249JzAuMScsCiAgICAgIGRlc2NyaXB0aW9uPXU4KCdBbm90aGVyIHRlc3RpbmcgZGlzdHJpYnV0aW9uIFxOe1NOT1dNQU59JyksCiAgICAgIGxvbmdfZGVzY3JpcHRpb249dTgoJ0Fub3RoZXIgdGVzdGluZyBkaXN0cmlidXRpb24gXE57U05PV01BTn0nKSwKICAgICAgYXV0aG9yPSJJbGx1c3RyaW91cyBBdXRob3IiLAogICAgICBhdXRob3JfZW1haWw9ImlsbHVzdHJpb3VzQGV4YW1wbGUub3JnIiwKICAgICAgdXJsPSJodHRwOi8vZXhhbXBsZS5vcmcvZXhlbXBsYXJ5IiwKICAgICAgcGFja2FnZXM9Wydjb21wbGV4ZGlzdCddLAogICAgICBzZXR1cF9yZXF1aXJlcz1bIndoZWVsIiwgInNldHVwdG9vbHMiXSwKICAgICAgaW5zdGFsbF9yZXF1aXJlcz1bInF1dXgiLCAic3Bsb3J0Il0sCiAgICAgIGV4dHJhc19yZXF1aXJlPXsnc2ltcGxlJzpbJ3NpbXBsZS5kaXN0J119LAogICAgICB0ZXN0c19yZXF1aXJlPVsiZm9vIiwgImJhcj49MTAuMC4wIl0sCiAgICAgIGVudHJ5X3BvaW50cz17CiAgICAgICAgICAnY29uc29sZV9zY3JpcHRzJzogWwogICAgICAgICAgICAgICdjb21wbGV4LWRpc3Q9Y29tcGxleGRpc3Q6bWFpbicsCiAgICAgICAgICAgICAgJ2NvbXBsZXgtZGlzdDI9Y29tcGxleGRpc3Q6bWFpbicsCiAgICAgICAgICBdLAogICAgICB9LAogICAgICApCgpQSwMEFAAAAAAAAAAhAChLGGWZBgAAmQYAACsAAABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L2NvbmZ0ZXN0LnB5IiIiDQpweXRlc3QgbG9jYWwgY29uZmlndXJhdGlvbiBwbHVnLWluDQoiIiINCg0KaW1wb3J0IGdjDQppbXBvcnQgd2FybmluZ3MNCg0KaW1wb3J0IHB5dGVzdA0KDQpAcHl0ZXN0LnlpZWxkX2ZpeHR1cmUoc2NvcGU9J2Z1bmN0aW9uJywgYXV0b3VzZT1UcnVlKQ0KZGVmIGVycm9yX29uX1Jlc291cmNlV2FybmluZygpOg0KICAgICIiIlRoaXMgZml4dHVyZSBjYXB0dXJlcyBSZXNvdXJjZVdhcm5pbmcncyBhbmQgcmVwb3J0cyBhbiAiZXJyb3IiDQogICAgZGVzY3JpYmluZyB0aGUgZmlsZSBoYW5kbGVzIGxlZnQgb3Blbi4NCiAgICANCiAgICBUaGlzIGlzIHNob3duIHJlZ2FyZGxlc3Mgb2YgaG93IHN1Y2Nlc3NmdWwgdGhlIHRlc3Qgd2FzLCBpZiBhIHRlc3QgZmFpbHMNCiAgICBhbmQgbGVhdmVzIGZpbGVzIG9wZW4gdGhlbiB0aG9zZSBmaWxlcyB3aWxsIGJlIHJlcG9ydGVkLiAgSWRlYWxseSwgZXZlbg0KICAgIHRob3NlIGZpbGVzIHNob3VsZCBiZSBjbG9zZWQgcHJvcGVybHkgYWZ0ZXIgYSB0ZXN0IGZhaWx1cmUgb3IgZXhjZXB0aW9uLg0KDQogICAgU2luY2Ugb25seSBQeXRob24gMyBhbmQgUHlQeTMgaGF2ZSBSZXNvdXJjZVdhcm5pbmcncywgdGhpcyBjb250ZXh0IHdpbGwNCiAgICBoYXZlIG5vIGVmZmVjdCB3aGVuIHJ1bm5pbmcgdGVzdHMgb24gUHl0aG9uIDIgb3IgUHlQeS4NCg0KICAgIEJlY2F1c2Ugb2YgYXV0b3VzZT1UcnVlLCB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgYXV0b21hdGljYWxseSBlbmFibGVkIGZvcg0KICAgIGFsbCB0ZXN0XyogZnVuY3Rpb25zIGluIHRoaXMgbW9kdWxlLg0KDQogICAgVGhpcyBjb2RlIGlzIHByaW1hcmlseSBiYXNlZCBvbiB0aGUgZXhhbXBsZXMgZm91bmQgaGVyZToNCiAgICBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8yNDcxNzAyNy9jb252ZXJ0LXB5dGhvbi0zLXJlc291cmNld2FybmluZ3MtaW50by1leGNlcHRpb24NCiAgICAiIiINCiAgICB0cnk6DQogICAgICAgIFJlc291cmNlV2FybmluZw0KICAgIGV4Y2VwdCBOYW1lRXJyb3I6DQogICAgICAgICMgUHl0aG9uIDIsIFB5UHkNCiAgICAgICAgeWllbGQNCiAgICAgICAgcmV0dXJuDQogICAgIyBQeXRob24gMywgUHlQeTMNCiAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKHJlY29yZD1UcnVlKSBhcyBjYXVnaHQ6DQogICAgICAgIHdhcm5pbmdzLnJlc2V0d2FybmluZ3MoKSAjIGNsZWFyIGFsbCBmaWx0ZXJzDQogICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcignaWdub3JlJykgIyBpZ25vcmUgYWxsDQogICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcignYWx3YXlzJywgUmVzb3VyY2VXYXJuaW5nKSAjIGFkZCBmaWx0ZXINCiAgICAgICAgeWllbGQgIyBydW4gdGVzdHMgaW4gdGhpcyBjb250ZXh0DQogICAgICAgIGdjLmNvbGxlY3QoKSAjIHJ1biBnYXJiYWdlIGNvbGxlY3Rpb24gKGZvciBweXB5MykNCiAgICAgICAgaWYgbm90IGNhdWdodDoNCiAgICAgICAgICAgIHJldHVybg0KICAgICAgICBweXRlc3QuZmFpbCgnVGhlIGZvbGxvd2luZyBmaWxlIGRlc2NyaXB0b3JzIHdlcmUgbm90IGNsb3NlZCBwcm9wZXJseTpcbicgKw0KICAgICAgICAgICAgICAgICAgICAnXG4nLmpvaW4oKHN0cih3YXJuaW5nLm1lc3NhZ2UpIGZvciB3YXJuaW5nIGluIGNhdWdodCkpLA0KICAgICAgICAgICAgICAgICAgICBweXRyYWNlPUZhbHNlKQ0KUEsDBBQAAAAAAAAAIQAAAAAAAAAAAAAAAAA6AAAAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9leHRlbnNpb24uZGlzdC9fX2luaXRfXy5weVBLAwQUAAAAAAAAACEAX4bMT8gBAADIAQAANwAAAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvZXh0ZW5zaW9uLmRpc3Qvc2V0dXAucHlmcm9tIHNldHVwdG9vbHMgaW1wb3J0IHNldHVwLCBFeHRlbnNpb24KCnRyeToKICAgIHVuaWNvZGUKICAgIGRlZiB1OChzKToKICAgICAgICByZXR1cm4gcy5kZWNvZGUoJ3VuaWNvZGUtZXNjYXBlJykuZW5jb2RlKCd1dGYtOCcpCmV4Y2VwdCBOYW1lRXJyb3I6CiAgICBkZWYgdTgocyk6CiAgICAgICAgcmV0dXJuIHMuZW5jb2RlKCd1dGYtOCcpCgpzZXR1cChuYW1lPSdleHRlbnNpb24uZGlzdCcsCiAgICAgIHZlcnNpb249JzAuMScsCiAgICAgIGRlc2NyaXB0aW9uPXU4KCdBIHRlc3RpbmcgZGlzdHJpYnV0aW9uIFxOe1NOT1dNQU59JyksCiAgICAgIGV4dF9tb2R1bGVzPVsKICAgICAgICAgIEV4dGVuc2lvbihuYW1lPSdleHRlbnNpb24nLCAKICAgICAgICAgIHNvdXJjZXM9WydleHRlbnNpb24uYyddLCAKICAgICAgICAgIHB5X2xpbWl0ZWRfYXBpPVRydWUpCiAgICAgICAgICBdLAogICAgICApCgpQSwMEFAAAAAAAAAAhAAAAAAAAAAAAAAAAADgAAABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L2hlYWRlcnMuZGlzdC9fX2luaXRfXy5weVBLAwQUAAAAAAAAACEAAAAAAAAAAAAAAAAANQAAAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvaGVhZGVycy5kaXN0L2hlYWRlci5oUEsDBBQAAAAAAAAAIQAAAAAAAAAAAAAAAAA7AAAAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9oZWFkZXJzLmRpc3QvaGVhZGVyc2Rpc3QucHlQSwMEFAAAAAAAAAAhAJnEJyxEAQAARAEAADUAAABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L2hlYWRlcnMuZGlzdC9zZXR1cC5weWZyb20gc2V0dXB0b29scyBpbXBvcnQgc2V0dXAKCnRyeToKICAgIHVuaWNvZGUKICAgIGRlZiB1OChzKToKICAgICAgICByZXR1cm4gcy5kZWNvZGUoJ3VuaWNvZGUtZXNjYXBlJykuZW5jb2RlKCd1dGYtOCcpCmV4Y2VwdCBOYW1lRXJyb3I6CiAgICBkZWYgdTgocyk6CiAgICAgICAgcmV0dXJuIHMuZW5jb2RlKCd1dGYtOCcpCgpzZXR1cChuYW1lPSdoZWFkZXJzLmRpc3QnLAogICAgICB2ZXJzaW9uPScwLjEnLAogICAgICBkZXNjcmlwdGlvbj11OCgnQSBkaXN0cmlidXRpb24gd2l0aCBoZWFkZXJzJyksCiAgICAgIGhlYWRlcnM9WydoZWFkZXIuaCddCiAgICAgICkKClBLAwQUAAAAAAAAACEAaj7d19ssAADbLAAAMgAAAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvcHlkaXN0LXNjaGVtYS5qc29uewogICJpZCI6ICJodHRwOi8vd3d3LnB5dGhvbi5vcmcvZGV2L3BlcHMvcGVwLTA0MjYvIiwKICAiJHNjaGVtYSI6ICJodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA0L3NjaGVtYSMiLAogICJ0aXRsZSI6ICJNZXRhZGF0YSBmb3IgUHl0aG9uIFNvZnR3YXJlIFBhY2thZ2VzIDIuMCIsCiAgInR5cGUiOiAib2JqZWN0IiwKICAicHJvcGVydGllcyI6IHsKICAgICJtZXRhZGF0YV92ZXJzaW9uIjogewogICAgICAiZGVzY3JpcHRpb24iOiAiVmVyc2lvbiBvZiB0aGUgZmlsZSBmb3JtYXQiLAogICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAicGF0dGVybiI6ICJeKFxcZCsoXFwuXFxkKykqKSQiCiAgICB9LAogICAgImdlbmVyYXRvciI6IHsKICAgICAgImRlc2NyaXB0aW9uIjogIk5hbWUgYW5kIHZlcnNpb24gb2YgdGhlIHByb2dyYW0gdGhhdCBwcm9kdWNlZCB0aGlzIGZpbGUuIiwKICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgInBhdHRlcm4iOiAiXlswLTlBLVphLXpdKFswLTlBLVphLXpfLi1dKlswLTlBLVphLXpdKSggXFwoLipcXCkpPyQiCiAgICB9LAogICAgIm5hbWUiOiB7CiAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgbmFtZSBvZiB0aGUgZGlzdHJpYnV0aW9uLiIsCiAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZGlzdHJpYnV0aW9uX25hbWUiCiAgICB9LAogICAgInZlcnNpb24iOiB7CiAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgZGlzdHJpYnV0aW9uJ3MgcHVibGljIHZlcnNpb24gaWRlbnRpZmllciIsCiAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICJwYXR0ZXJuIjogIl4oXFxkKyhcXC5cXGQrKSopKChhfGJ8Y3xyYykoXFxkKykpPyhcXC4ocG9zdCkoXFxkKykpPyhcXC4oZGV2KShcXGQrKSk/JCIKICAgIH0sCiAgICAic291cmNlX2xhYmVsIjogewogICAgICAiZGVzY3JpcHRpb24iOiAiQSBjb25zdHJhaW5lZCBpZGVudGlmeWluZyB0ZXh0IHN0cmluZyIsCiAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICJwYXR0ZXJuIjogIl5bMC05YS16Xy4tK10rJCIKICAgIH0sCiAgICAic291cmNlX3VybCI6IHsKICAgICAgImRlc2NyaXB0aW9uIjogIkEgc3RyaW5nIGNvbnRhaW5pbmcgYSBmdWxsIFVSTCB3aGVyZSB0aGUgc291cmNlIGZvciB0aGlzIHNwZWNpZmljIHZlcnNpb24gb2YgdGhlIGRpc3RyaWJ1dGlvbiBjYW4gYmUgZG93bmxvYWRlZC4iLAogICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAiZm9ybWF0IjogInVyaSIKICAgIH0sCiAgICAic3VtbWFyeSI6IHsKICAgICAgImRlc2NyaXB0aW9uIjogIkEgb25lLWxpbmUgc3VtbWFyeSBvZiB3aGF0IHRoZSBkaXN0cmlidXRpb24gZG9lcy4iLAogICAgICAidHlwZSI6ICJzdHJpbmciCiAgICB9LAogICAgImV4dHJhcyI6IHsKICAgICAgImRlc2NyaXB0aW9uIjogIkEgbGlzdCBvZiBvcHRpb25hbCBzZXRzIG9mIGRlcGVuZGVuY2llcyB0aGF0IG1heSBiZSB1c2VkIHRvIGRlZmluZSBjb25kaXRpb25hbCBkZXBlbmRlbmNpZXMgaW4gXCJtYXlfcmVxdWlyZVwiIGFuZCBzaW1pbGFyIGZpZWxkcy4iLAogICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICJpdGVtcyI6IHsKICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZXh0cmFfbmFtZSIKICAgICAgfQogICAgfSwKICAgICJtZXRhX3JlcXVpcmVzIjogewogICAgICAiZGVzY3JpcHRpb24iOiAiQSBsaXN0IG9mIHN1YmRpc3RyaWJ1dGlvbnMgbWFkZSBhdmFpbGFibGUgdGhyb3VnaCB0aGlzIG1ldGFkaXN0cmlidXRpb24uIiwKICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2RlcGVuZGVuY2llcyIKICAgIH0sCiAgICAicnVuX3JlcXVpcmVzIjogewogICAgICAiZGVzY3JpcHRpb24iOiAiQSBsaXN0IG9mIG90aGVyIGRpc3RyaWJ1dGlvbnMgbmVlZGVkIHRvIHJ1biB0aGlzIGRpc3RyaWJ1dGlvbi4iLAogICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZGVwZW5kZW5jaWVzIgogICAgfSwKICAgICJ0ZXN0X3JlcXVpcmVzIjogewogICAgICAiZGVzY3JpcHRpb24iOiAiQSBsaXN0IG9mIG90aGVyIGRpc3RyaWJ1dGlvbnMgbmVlZGVkIHdoZW4gdGhpcyBkaXN0cmlidXRpb24gaXMgdGVzdGVkLiIsCiAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9kZXBlbmRlbmNpZXMiCiAgICB9LAogICAgImJ1aWxkX3JlcXVpcmVzIjogewogICAgICAiZGVzY3JpcHRpb24iOiAiQSBsaXN0IG9mIG90aGVyIGRpc3RyaWJ1dGlvbnMgbmVlZGVkIHdoZW4gdGhpcyBkaXN0cmlidXRpb24gaXMgYnVpbHQuIiwKICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2RlcGVuZGVuY2llcyIKICAgIH0sCiAgICAiZGV2X3JlcXVpcmVzIjogewogICAgICAiZGVzY3JpcHRpb24iOiAiQSBsaXN0IG9mIG90aGVyIGRpc3RyaWJ1dGlvbnMgbmVlZGVkIHdoZW4gdGhpcyBkaXN0cmlidXRpb24gaXMgZGV2ZWxvcGVkLiIsCiAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9kZXBlbmRlbmNpZXMiCiAgICB9LAogICAgInByb3ZpZGVzIjogewogICAgICAiZGVzY3JpcHRpb24iOiAiQSBsaXN0IG9mIHN0cmluZ3MgbmFtaW5nIGFkZGl0aW9uYWwgZGVwZW5kZW5jeSByZXF1aXJlbWVudHMgdGhhdCBhcmUgc2F0aXNmaWVkIGJ5IGluc3RhbGxpbmcgdGhpcyBkaXN0cmlidXRpb24uIFRoZXNlIHN0cmluZ3MgbXVzdCBiZSBvZiB0aGUgZm9ybSBOYW1lIG9yIE5hbWUgKFZlcnNpb24pIiwKICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAiaXRlbXMiOiB7CiAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3Byb3ZpZGVzX2RlY2xhcmF0aW9uIgogICAgICB9CiAgICB9LAogICAgIm1vZHVsZXMiOiB7CiAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGxpc3Qgb2YgbW9kdWxlcyBhbmQvb3IgcGFja2FnZXMgYXZhaWxhYmxlIGZvciBpbXBvcnQgYWZ0ZXIgaW5zdGFsbGluZyB0aGlzIGRpc3RyaWJ1dGlvbi4iLAogICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICJpdGVtcyI6IHsKICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvcXVhbGlmaWVkX25hbWUiCiAgICAgIH0KICAgIH0sCiAgICAibmFtZXNwYWNlcyI6IHsKICAgICAgImRlc2NyaXB0aW9uIjogIkEgbGlzdCBvZiBuYW1lc3BhY2UgcGFja2FnZXMgdGhpcyBkaXN0cmlidXRpb24gY29udHJpYnV0ZXMgdG8iLAogICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICJpdGVtcyI6IHsKICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvcXVhbGlmaWVkX25hbWUiCiAgICAgIH0KICAgIH0sCiAgICAib2Jzb2xldGVkX2J5IjogewogICAgICAiZGVzY3JpcHRpb24iOiAiQSBzdHJpbmcgdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGlzIHByb2plY3QgaXMgbm8gbG9uZ2VyIGJlaW5nIGRldmVsb3BlZC4gVGhlIG5hbWVkIHByb2plY3QgcHJvdmlkZXMgYSBzdWJzdGl0dXRlIG9yIHJlcGxhY2VtZW50LiIsCiAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvcmVxdWlyZW1lbnQiCiAgICB9LAogICAgInN1cHBvcnRzX2Vudmlyb25tZW50cyI6IHsKICAgICAgImRlc2NyaXB0aW9uIjogIkEgbGlzdCBvZiBzdHJpbmdzIHNwZWNpZnlpbmcgdGhlIGVudmlyb25tZW50cyB0aGF0IHRoZSBkaXN0cmlidXRpb24gZXhwbGljaXRseSBzdXBwb3J0cy4iLAogICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICJpdGVtcyI6IHsKICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZW52aXJvbm1lbnRfbWFya2VyIgogICAgICB9CiAgICB9LAogICAgImluc3RhbGxfaG9va3MiOiB7CiAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgaW5zdGFsbF9ob29rcyBmaWVsZCBpcyB1c2VkIHRvIGRlZmluZSB2YXJpb3VzIG9wZXJhdGlvbnMgdGhhdCBtYXkgYmUgaW52b2tlZCBvbiBhIGRpc3RyaWJ1dGlvbiBpbiBhIHBsYXRmb3JtIGluZGVwZW5kZW50IG1hbm5lci4iLAogICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAicG9zdGluc3RhbGwiOiB7CiAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9leHBvcnRfc3BlY2lmaWVyIgogICAgICAgIH0sCiAgICAgICAgInByZXVuaW5zdGFsbCI6IHsKICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2V4cG9ydF9zcGVjaWZpZXIiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgImV4dGVuc2lvbnMiOiB7CiAgICAgICJkZXNjcmlwdGlvbiI6ICJFeHRlbnNpb25zIHRvIHRoZSBtZXRhZGF0YSBtYXkgYmUgcHJlc2VudCBpbiBhIG1hcHBpbmcgdW5kZXIgdGhlICdleHRlbnNpb25zJyBrZXkuIiwKICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9leHRlbnNpb25zIgogICAgfQogIH0sCgogICJyZXF1aXJlZCI6IFsibWV0YWRhdGFfdmVyc2lvbiIsICJuYW1lIiwgInZlcnNpb24iLCAic3VtbWFyeSJdLAogICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IGZhbHNlLAoKICAiZGVmaW5pdGlvbnMiOiB7CiAgICAiY29udGFjdCI6IHsKICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgIm5hbWUiOiB7CiAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgfSwKICAgICAgICAiZW1haWwiOiB7CiAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgfSwKICAgICAgICAidXJsIjogewogICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgIH0sCiAgICAgICAgInJvbGUiOiB7CiAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgfQogICAgICB9LAogICAgICAicmVxdWlyZWQiOiBbIm5hbWUiXSwKICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogZmFsc2UKICAgIH0sCiAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICJpdGVtcyI6IHsKICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZGVwZW5kZW5jeSIKICAgICAgfQogICAgfSwKICAgICJkZXBlbmRlbmN5IjogewogICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAiZXh0cmEiOiB7CiAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9leHRyYV9uYW1lIgogICAgICAgIH0sCiAgICAgICAgImVudmlyb25tZW50IjogewogICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZW52aXJvbm1lbnRfbWFya2VyIgogICAgICAgIH0sCiAgICAgICAgInJlcXVpcmVzIjogewogICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3JlcXVpcmVtZW50IgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgInJlcXVpcmVkIjogWyJyZXF1aXJlcyJdLAogICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBmYWxzZQogICAgfSwKICAgICJleHRlbnNpb25zIjogewogICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAicGF0dGVyblByb3BlcnRpZXMiOiB7CiAgICAgICAgIl5bQS1aYS16XVswLTlBLVphLXpfXSooWy5dWzAtOUEtWmEtel9dKikqJCI6IHt9CiAgICAgIH0sCiAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICJweXRob24uZGV0YWlscyIgOiB7CiAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTW9yZSBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlIGRpc3RyaWJ1dGlvbi4iLAogICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAiZG9jdW1lbnRfbmFtZXMiOiB7CiAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk5hbWVzIG9mIHN1cHBvcnRpbmcgbWV0YWRhdGEgZG9jdW1lbnRzIiwKICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogewogICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2RvY3VtZW50X25hbWUiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImNoYW5nZWxvZyI6IHsKICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9kb2N1bWVudF9uYW1lIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJsaWNlbnNlIjogewogICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2RvY3VtZW50X25hbWUiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBmYWxzZQogICAgICAgICAgICB9LAogICAgICAgICAgICAia2V5d29yZHMiOiB7CiAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgbGlzdCBvZiBhZGRpdGlvbmFsIGtleXdvcmRzIHRvIGJlIHVzZWQgdG8gYXNzaXN0IHNlYXJjaGluZyBmb3IgdGhlIGRpc3RyaWJ1dGlvbiBpbiBhIGxhcmdlciBjYXRhbG9nLiIsCiAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJsaWNlbnNlIjogewogICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIHN0cmluZyBpbmRpY2F0aW5nIHRoZSBsaWNlbnNlIGNvdmVyaW5nIHRoZSBkaXN0cmlidXRpb24uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJjbGFzc2lmaWVycyI6IHsKICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBsaXN0IG9mIHN0cmluZ3MsIHdpdGggZWFjaCBnaXZpbmcgYSBzaW5nbGUgY2xhc3NpZmljYXRpb24gdmFsdWUgZm9yIHRoZSBkaXN0cmlidXRpb24uIiwKICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgInB5dGhvbi5wcm9qZWN0IiA6IHsKICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJNb3JlIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGUgY3JlYXRpb24gYW5kIG1haW50ZW5hbmNlIG9mIHRoZSBkaXN0cmlidXRpb24uIiwKICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvcHJvamVjdF9vcl9pbnRlZ3JhdG9yIgogICAgICAgIH0sCiAgICAgICAgInB5dGhvbi5pbnRlZ3JhdG9yIiA6IHsKICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJNb3JlIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGUgZG93bnN0cmVhbSByZWRpc3RyaWJ1dG9yIG9mIHRoZSBkaXN0cmlidXRpb24uIiwKICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvcHJvamVjdF9vcl9pbnRlZ3JhdG9yIgogICAgICAgIH0sCiAgICAgICAgInB5dGhvbi5jb21tYW5kcyIgOiB7CiAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQ29tbWFuZCBsaW5lIGludGVyZmFjZXMgcHJvdmlkZWQgYnkgdGhpcyBkaXN0cmlidXRpb24iLAogICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvY29tbWFuZHMiCiAgICAgICAgfSwKICAgICAgICAicHl0aG9uLmV4cG9ydHMiIDogewogICAgICAgICAgImRlc2NyaXB0aW9uIjogIk90aGVyIGV4cG9ydGVkIGludGVyZmFjZXMgcHJvdmlkZWQgYnkgdGhpcyBkaXN0cmlidXRpb24iLAogICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZXhwb3J0cyIKICAgICAgICB9CiAgICAgIH0sCiAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IGZhbHNlCiAgICB9LAogICAgImNvbW1hbmRzIjogewogICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAid3JhcF9jb25zb2xlIjogewogICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvY29tbWFuZF9tYXAiCiAgICAgICAgfSwKICAgICAgICAid3JhcF9ndWkiOiB7CiAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9jb21tYW5kX21hcCIKICAgICAgICB9LAogICAgICAgICJwcmVidWlsdCI6IHsKICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9yZWxhdGl2ZV9wYXRoIgogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogZmFsc2UKICAgIH0sCiAgICAiZXhwb3J0cyI6IHsKICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgInBhdHRlcm5Qcm9wZXJ0aWVzIjogewogICAgICAgICJeW0EtWmEtel1bMC05QS1aYS16X10qKFsuXVswLTlBLVphLXpfXSopKiQiOiB7CiAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgInBhdHRlcm5Qcm9wZXJ0aWVzIjogewogICAgICAgICAgICAiLiI6IHsKICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvZXhwb3J0X3NwZWNpZmllciIKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IGZhbHNlCiAgICAgICAgfQogICAgICB9LAogICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBmYWxzZQogICAgfSwKICAgICJjb21tYW5kX21hcCI6IHsKICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgInBhdHRlcm5Qcm9wZXJ0aWVzIjogewogICAgICAgICJeWzAtOUEtWmEtel0oWzAtOUEtWmEtel8uLV0qWzAtOUEtWmEtel0pPyQiOiB7CiAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9leHBvcnRfc3BlY2lmaWVyIgogICAgICAgIH0KICAgICAgfSwKICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogZmFsc2UKICAgIH0sCiAgICAicHJvamVjdF9vcl9pbnRlZ3JhdG9yIiA6IHsKICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgInByb3BlcnRpZXMiIDogewogICAgICAgICJjb250YWN0cyI6IHsKICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGxpc3Qgb2YgY29udHJpYnV0b3IgZW50cmllcyBnaXZpbmcgdGhlIHJlY29tbWVuZGVkIGNvbnRhY3QgcG9pbnRzIGZvciBnZXR0aW5nIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb2plY3QuIiwKICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9jb250YWN0IgogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgImNvbnRyaWJ1dG9ycyI6IHsKICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGxpc3Qgb2YgY29udHJpYnV0b3IgZW50cmllcyBmb3Igb3RoZXIgY29udHJpYnV0b3JzIG5vdCBhbHJlYWR5IGxpc3RlZCBhcyBjdXJyZW50IHByb2plY3QgcG9pbnRzIG9mIGNvbnRhY3QuIiwKICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9jb250YWN0IgogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgInByb2plY3RfdXJscyI6IHsKICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIG1hcHBpbmcgb2YgYXJiaXRyYXJ5IHRleHQgbGFiZWxzIHRvIGFkZGl0aW9uYWwgVVJMcyByZWxldmFudCB0byB0aGUgcHJvamVjdC4iLAogICAgICAgICAgInR5cGUiOiAib2JqZWN0IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJkaXN0cmlidXRpb25fbmFtZSI6IHsKICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgInBhdHRlcm4iOiAiXlswLTlBLVphLXpdKFswLTlBLVphLXpfLi1dKlswLTlBLVphLXpdKT8kIgogICAgfSwKICAgICJyZXF1aXJlbWVudCI6IHsKICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgfSwKICAgICJwcm92aWRlc19kZWNsYXJhdGlvbiI6IHsKICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgfSwKICAgICJlbnZpcm9ubWVudF9tYXJrZXIiOiB7CiAgICAgICJ0eXBlIjogInN0cmluZyIKICAgIH0sCiAgICAiZG9jdW1lbnRfbmFtZSI6IHsKICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgfSwKICAgICJleHRyYV9uYW1lIiA6IHsKICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgInBhdHRlcm4iOiAiXlswLTlBLVphLXpdKFswLTlBLVphLXpfLi1dKlswLTlBLVphLXpdKT8kIgogICAgfSwKICAgICJyZWxhdGl2ZV9wYXRoIiA6IHsKICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgfSwKICAgICJleHBvcnRfc3BlY2lmaWVyIjogewogICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAicGF0dGVybiI6ICJeKFtBLVphLXpfXVtBLVphLXpfMC05XSooWy5dW0EtWmEtel9dW0EtWmEtel8wLTldKikqKSg6W0EtWmEtel9dW0EtWmEtel8wLTldKihbLl1bQS1aYS16X11bQS1aYS16XzAtOV0qKSopPyhcXFtbMC05QS1aYS16XShbMC05QS1aYS16Xy4tXSpbMC05QS1aYS16XSk/XFxdKT8kIgogICAgfSwKICAgICJxdWFsaWZpZWRfbmFtZSIgOiB7CiAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICJwYXR0ZXJuIjogIl5bQS1aYS16X11bQS1aYS16XzAtOV0qKFsuXVtBLVphLXpfXVtBLVphLXpfMC05XSopKiQiCiAgICB9LAogICAgInByZWZpeGVkX25hbWUiIDogewogICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAicGF0dGVybiI6ICJeW0EtWmEtel9dW0EtWmEtel8wLTldKihbLl1bQS1aYS16XzAtOV0qKSokIgogICAgfQogIH0KfQpQSwMEFAAAAAAAAAAhAAAAAAAAAAAAAAAAADcAAABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L3NpbXBsZS5kaXN0L19faW5pdF9fLnB5UEsDBBQAAAAAAAAAIQDTTQSjfwEAAH8BAAA0AAAAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9zaW1wbGUuZGlzdC9zZXR1cC5weWZyb20gc2V0dXB0b29scyBpbXBvcnQgc2V0dXAKCnRyeToKICAgIHVuaWNvZGUKICAgIGRlZiB1OChzKToKICAgICAgICByZXR1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cnMvaGVsbG8uZGF0UEsBAhQAFAAAAAgAsbBUQOApatMgAAAAHgAAAB4AAAAAAAAAAAAAALaB3A0AAHRlc3QtMS4wLmRhdGEvc2NyaXB0cy9oZWxsby5zaFBLAQIUABQAAAAIAL15KEG/4n/ORQAAAEUAAAAYAAAAAAAAAAAAAAC2gTgOAAB0ZXN0LTEuMC5kaXN0LWluZm8vV0hFRUxQSwECFAAUAAAACAC9eShBZB4AOzUBAABVAgAAGwAAAAAAAAAAAAAAtoGzDgAAdGVzdC0xLjAuZGlzdC1pbmZvL01FVEFEQVRBUEsBAhQAFAAAAAgAvXkoQXaXGBqRAQAAkQIAABkAAAAAAAAAAAAAALaBIRAAAHRlc3QtMS4wLmRpc3QtaW5mby9SRUNPUkRQSwUGAAAAAAkACQBrAgAA6REAAAAAUEsDBBQAAAAAAAAAIQA4K+8RbRkAAG0ZAAAtAAAAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC90ZXN0X2Jhc2ljLnB5IiIiCkJhc2ljIHdoZWVsIHRlc3RzLgoiIiIKCmltcG9ydCBvcwppbXBvcnQgcGtnX3Jlc291cmNlcwppbXBvcnQganNvbgppbXBvcnQgc3lzCgpmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IHJlc291cmNlX2ZpbGVuYW1lCgppbXBvcnQgd2hlZWwudXRpbAppbXBvcnQgd2hlZWwudG9vbAoKZnJvbSB3aGVlbCBpbXBvcnQgZWdnMndoZWVsCmZyb20gd2hlZWwuaW5zdGFsbCBpbXBvcnQgV2hlZWxGaWxlCmZyb20gemlwZmlsZSBpbXBvcnQgWmlwRmlsZQpmcm9tIHNodXRpbCBpbXBvcnQgcm10cmVlCgp0ZXN0X2Rpc3RyaWJ1dGlvbnMgPSAoImNvbXBsZXgtZGlzdCIsICJzaW1wbGUuZGlzdCIsICJoZWFkZXJzLmRpc3QiKQoKZGVmIHRlYXJkb3duX21vZHVsZSgpOgogICAgIiIiRGVsZXRlIGVnZ3Mvd2hlZWxzIGNyZWF0ZWQgYnkgdGVzdHMuIiIiCiAgICBiYXNlID0gcGtnX3Jlc291cmNlcy5yZXNvdXJjZV9maWxlbmFtZSgnd2hlZWwudGVzdCcsICcnKQogICAgZm9yIGRpc3QgaW4gdGVzdF9kaXN0cmlidXRpb25zOgogICAgICAgIGZvciBzdWJkaXIgaW4gKCdidWlsZCcsICdkaXN0Jyk6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHJtdHJlZShvcy5wYXRoLmpvaW4oYmFzZSwgZGlzdCwgc3ViZGlyKSkKICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgICAgICAgICBwYXNzCgpkZWYgc2V0dXBfbW9kdWxlKCk6CiAgICBidWlsZF93aGVlbCgpCiAgICBidWlsZF9lZ2coKQoKZGVmIGJ1aWxkX3doZWVsKCk6CiAgICAiIiJCdWlsZCB3aGVlbHMgZnJvbSB0ZXN0IGRpc3RyaWJ1dGlvbnMuIiIiCiAgICBmb3IgZGlzdCBpbiB0ZXN0X2Rpc3RyaWJ1dGlvbnM6CiAgICAgICAgcHdkID0gb3MucGF0aC5hYnNwYXRoKG9zLmN1cmRpcikKICAgICAgICBkaXN0ZGlyID0gcGtnX3Jlc291cmNlcy5yZXNvdXJjZV9maWxlbmFtZSgnd2hlZWwudGVzdCcsIGRpc3QpCiAgICAgICAgb3MuY2hkaXIoZGlzdGRpcikKICAgICAgICB0cnk6CiAgICAgICAgICAgIHN5cy5hcmd2ID0gWycnLCAnYmRpc3Rfd2hlZWwnXQogICAgICAgICAgICBleGVjKGNvbXBpbGUob3Blbignc2V0dXAucHknKS5yZWFkKCksICdzZXR1cC5weScsICdleGVjJykpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgb3MuY2hkaXIocHdkKQoKZGVmIGJ1aWxkX2VnZygpOgogICAgIiIiQnVpbGQgZWdncyBmcm9tIHRlc3QgZGlzdHJpYnV0aW9ucy4iIiIKICAgIGZvciBkaXN0IGluIHRlc3RfZGlzdHJpYnV0aW9uczoKICAgICAgICBwd2QgPSBvcy5wYXRoLmFic3BhdGgob3MuY3VyZGlyKQogICAgICAgIGRpc3RkaXIgPSBwa2dfcmVzb3VyY2VzLnJlc291cmNlX2ZpbGVuYW1lKCd3aGVlbC50ZXN0JywgZGlzdCkKICAgICAgICBvcy5jaGRpcihkaXN0ZGlyKQogICAgICAgIHRyeToKICAgICAgICAgICAgc3lzLmFyZ3YgPSBbJycsICdiZGlzdF9lZ2cnXQogICAgICAgICAgICBleGVjKGNvbXBpbGUob3Blbignc2V0dXAucHknKS5yZWFkKCksICdzZXR1cC5weScsICdleGVjJykpCiAgICAgICAgZmluYWxseToKICAgICAgICAgICAgb3MuY2hkaXIocHdkKQoKZGVmIHRlc3RfZmluZGFibGUoKToKICAgICIiIk1ha2Ugc3VyZSBwa2dfcmVzb3VyY2VzIGNhbiBmaW5kIHVzLiIiIgogICAgYXNzZXJ0IHBrZ19yZXNvdXJjZXMud29ya2luZ19zZXQuYnlfa2V5Wyd3aGVlbCddLnZlcnNpb24KCmRlZiB0ZXN0X2VnZ19yZSgpOgogICAgIiIiTWFrZSBzdXJlIGVnZ19pbmZvX3JlIG1hdGNoZXMuIiIiCiAgICBlZ2dfbmFtZXNfcGF0aCA9IHBrZ19yZXNvdXJjZXMucmVzb3VyY2VfZmlsZW5hbWUoJ3doZWVsJywgJ2VnZ25hbWVzLnR4dCcpCiAgICB3aXRoIG9wZW4oZWdnX25hbWVzX3BhdGgpIGFzIGVnZ19uYW1lczoKICAgICAgICBmb3IgbGluZSBpbiBlZ2dfbmFtZXM6CiAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKICAgICAgICAgICAgaWYgbm90IGxpbmU6CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBhc3NlcnQgZWdnMndoZWVsLmVnZ19pbmZvX3JlLm1hdGNoKGxpbmUpLCBsaW5lCgpkZWYgdGVzdF9jb21wYXRpYmlsaXR5X3RhZ3MoKToKICAgICIiIlRlc3QgY29tcGF0aWJpbHR5IHRhZ3MgYXJlIHdvcmtpbmcuIiIiCiAgICB3ZiA9IFdoZWVsRmlsZSgicGFja2FnZS0xLjAuMC1jcDMyLmNwMzMtbm9hYmktbm9hcmNoLndobCIpCiAgICBhc3NlcnQgKGxpc3Qod2YuY29tcGF0aWJpbGl0eV90YWdzKSA9PQogICAgICAgICAgICAgICAgIFsoJ2NwMzInLCAnbm9hYmknLCAnbm9hcmNoJyksICgnY3AzMycsICdub2FiaScsICdub2FyY2gnKV0pCiAgICBhc3NlcnQgKHdmLmFyaXR5ID09IDIpCgogICAgd2YyID0gV2hlZWxGaWxlKCJwYWNrYWdlLTEuMC4wLTFzdC1jcDMzLW5vYWJpLW5vYXJjaC53aGwiKQogICAgd2YyX2luZm8gPSB3ZjIucGFyc2VkX2ZpbGVuYW1lLmdyb3VwZGljdCgpCiAgICBhc3NlcnQgd2YyX2luZm9bJ2J1aWxkJ10gPT0gJzFzdCcsIHdmMl9pbmZvCgpkZWYgdGVzdF9jb252ZXJ0X2VnZygpOgogICAgYmFzZSA9IHBrZ19yZXNvdXJjZXMucmVzb3VyY2VfZmlsZW5hbWUoJ3doZWVsLnRlc3QnLCAnJykKICAgIGZvciBkaXN0IGluIHRlc3RfZGlzdHJpYnV0aW9uczoKICAgICAgICBkaXN0ZGlyID0gb3MucGF0aC5qb2luKGJhc2UsIGRpc3QsICdkaXN0JykKICAgICAgICBlZ2dzID0gW2UgZm9yIGUgaW4gb3MubGlzdGRpcihkaXN0ZGlyKSBpZiBlLmVuZHN3aXRoKCcuZWdnJyldCiAgICAgICAgd2hlZWwudG9vbC5jb252ZXJ0KGVnZ3MsIGRpc3RkaXIsIHZlcmJvc2U9RmFsc2UpCgpkZWYgdGVzdF91bnBhY2soKToKICAgICIiIgogICAgTWFrZSBzdXJlICd3aGVlbCB1bnBhY2snIHdvcmtzLgogICAgVGhpcyBhbHNvIHZlcmlmaWVzIHRoZSBpbnRlZ3JpdHkgb2Ygb3VyIHRlc3Rpbmcgd2hlZWwgZmlsZXMuCiAgICAiIiIKICAgIGZvciBkaXN0IGluIHRlc3RfZGlzdHJpYnV0aW9uczoKICAgICAgICBkaXN0ZGlyID0gcGtnX3Jlc291cmNlcy5yZXNvdXJjZV9maWxlbmFtZSgnd2hlZWwudGVzdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKGRpc3QsICdkaXN0JykpCiAgICAgICAgZm9yIHdoZWVsZmlsZSBpbiAodyBmb3IgdyBpbiBvcy5saXN0ZGlyKGRpc3RkaXIpIGlmIHcuZW5kc3dpdGgoJy53aGwnKSk6CiAgICAgICAgICAgIHdoZWVsLnRvb2wudW5wYWNrKG9zLnBhdGguam9pbihkaXN0ZGlyLCB3aGVlbGZpbGUpLCBkaXN0ZGlyKQoKZGVmIHRlc3Rfbm9fc2NyaXB0cygpOgogICAgIiIiTWFrZSBzdXJlIGVudHJ5IHBvaW50IHNjcmlwdHMgYXJlIG5vdCBnZW5lcmF0ZWQuIiIiCiAgICBkaXN0ID0gImNvbXBsZXgtZGlzdCIKICAgIGJhc2VkaXIgPSBwa2dfcmVzb3VyY2VzLnJlc291cmNlX2ZpbGVuYW1lKCd3aGVlbC50ZXN0JywgZGlzdCkKICAgIGZvciAoZGlybmFtZSwgc3ViZGlycywgZmlsZW5hbWVzKSBpbiBvcy53YWxrKGJhc2VkaXIpOgogICAgICAgIGZvciBmaWxlbmFtZSBpbiBmaWxlbmFtZXM6CiAgICAgICAgICAgIGlmIGZpbGVuYW1lLmVuZHN3aXRoKCcud2hsJyk6CiAgICAgICAgICAgICAgICB3aGwgPSBaaXBGaWxlKG9zLnBhdGguam9pbihkaXJuYW1lLCBmaWxlbmFtZSkpCiAgICAgICAgICAgICAgICBmb3IgZW50cnkgaW4gd2hsLmluZm9saXN0KCk6CiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IG5vdCAnLmRhdGEvc2NyaXB0cy8nIGluIGVudHJ5LmZpbGVuYW1lCgpkZWYgdGVzdF9weWRpc3QoKToKICAgICIiIk1ha2Ugc3VyZSBweWRpc3QuanNvbiBleGlzdHMgYW5kIHZhbGlkYXRlcyBhZ2FpbnN0IG91ciBzY2hlbWEuIiIiCiAgICAjIFhYWCB0aGlzIHRlc3QgbWF5IG5lZWQgbWFudWFsIGNsZWFudXAgb2Ygb2xkZXIgd2hlZWxzCgogICAgaW1wb3J0IGpzb25zY2hlbWEKCiAgICBkZWYgb3Blbl9qc29uKGZpbGVuYW1lKToKICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICdyYicpIGFzIGpzb25fZmlsZToKICAgICAgICAgICAgcmV0dXJuIGpzb24ubG9hZHMoanNvbl9maWxlLnJlYWQoKS5kZWNvZGUoJ3V0Zi04JykpCgogICAgcHltZXRhX3NjaGVtYSA9IG9wZW5fanNvbihyZXNvdXJjZV9maWxlbmFtZSgnd2hlZWwudGVzdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdweWRpc3Qtc2NoZW1hLmpzb24nKSkKICAgIHZhbGlkID0gMAogICAgZm9yIGRpc3QgaW4gKCJzaW1wbGUuZGlzdCIsICJjb21wbGV4LWRpc3QiKToKICAgICAgICBiYXNlZGlyID0gcGtnX3Jlc291cmNlcy5yZXNvdXJjZV9maWxlbmFtZSgnd2hlZWwudGVzdCcsIGRpc3QpCiAgICAgICAgZm9yIChkaXJuYW1lLCBzdWJkaXJzLCBmaWxlbmFtZXMpIGluIG9zLndhbGsoYmFzZWRpcik6CiAgICAgICAgICAgIGZvciBmaWxlbmFtZSBpbiBmaWxlbmFtZXM6CiAgICAgICAgICAgICAgICBpZiBmaWxlbmFtZS5lbmRzd2l0aCgnLndobCcpOgogICAgICAgICAgICAgICAgICAgIHdobCA9IFppcEZpbGUob3MucGF0aC5qb2luKGRpcm5hbWUsIGZpbGVuYW1lKSkKICAgICAgICAgICAgICAgICAgICBmb3IgZW50cnkgaW4gd2hsLmluZm9saXN0KCk6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGVudHJ5LmZpbGVuYW1lLmVuZHN3aXRoKCcvbWV0YWRhdGEuanNvbicpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHltZXRhID0ganNvbi5sb2Fkcyh3aGwucmVhZChlbnRyeSkuZGVjb2RlKCd1dGYtOCcpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAganNvbnNjaGVtYS52YWxpZGF0ZShweW1ldGEsIHB5bWV0YV9zY2hlbWEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCArPSAxCiAgICBhc3NlcnQgdmFsaWQgPiAwLCAiTm8gbWV0YWRhdGEuanNvbiBmb3VuZCIKCmRlZiB0ZXN0X3V0aWwoKToKICAgICIiIlRlc3QgZnVuY3Rpb25zIGluIHV0aWwucHkuIiIiCiAgICBmb3IgaSBpbiByYW5nZSgxMCk6CiAgICAgICAgYmVmb3JlID0gYicqJyAqIGkKICAgICAgICBlbmNvZGVkID0gd2hlZWwudXRpbC51cmxzYWZlX2I2NGVuY29kZShiZWZvcmUpCiAgICAgICAgYXNzZXJ0IG5vdCBlbmNvZGVkLmVuZHN3aXRoKGInPScpCiAgICAgICAgYWZ0ZXIgPSB3aGVlbC51dGlsLnVybHNhZmVfYjY0ZGVjb2RlKGVuY29kZWQpCiAgICAgICAgYXNzZXJ0IGJlZm9yZSA9PSBhZnRlcgoKCmRlZiB0ZXN0X3BpY2tfYmVzdCgpOgogICAgIiIiVGVzdCB0aGUgd2hlZWwgcmFua2luZyBhbGdvcml0aG0uIiIiCiAgICBkZWYgZ2V0X3RhZ3MocmVzKToKICAgICAgICBpbmZvID0gcmVzWy0xXS5wYXJzZWRfZmlsZW5hbWUuZ3JvdXBkaWN0KCkKICAgICAgICByZXR1cm4gaW5mb1sncHl2ZXInXSwgaW5mb1snYWJpJ10sIGluZm9bJ3BsYXQnXQoKICAgIGNhbmRfdGFncyA9IFsoJ3B5MjcnLCAnbm9hYmknLCAnbm9hcmNoJyksICgncHkyNicsICdub2FiaScsICdub2FyY2gnKSwKICAgICAgICAgICAgICAgICAoJ2NwMjcnLCAnbm9hYmknLCAnbGludXhfaTY4NicpLAogICAgICAgICAgICAgICAgICgnY3AyNicsICdub2FiaScsICdsaW51eF9pNjg2JyksCiAgICAgICAgICAgICAgICAgKCdjcDI3JywgJ25vYWJpJywgJ2xpbnV4X3g4Nl82NCcpLAogICAgICAgICAgICAgICAgICgnY3AyNicsICdub2FiaScsICdsaW51eF94ODZfNjQnKV0KICAgIGNhbmRfd2hlZWxzID0gW1doZWVsRmlsZSgndGVzdHBrZy0xLjAtJXMtJXMtJXMud2hsJyAlIHQpCiAgICAgICAgICAgICAgICAgICBmb3IgdCBpbiBjYW5kX3RhZ3NdCgogICAgc3VwcG9ydGVkID0gWygnY3AyNycsICdub2FiaScsICdsaW51eF9pNjg2JyksICgncHkyNycsICdub2FiaScsICdub2FyY2gnKV0KICAgIHN1cHBvcnRlZDIgPSBbKCdjcDI3JywgJ25vYWJpJywgJ2xpbnV4X2k2ODYnKSwgKCdweTI3JywgJ25vYWJpJywgJ25vYXJjaCcpLAogICAgICAgICAgICAgICAgICAoJ2NwMjYnLCAnbm9hYmknLCAnbGludXhfaTY4NicpLCAoJ3B5MjYnLCAnbm9hYmknLCAnbm9hcmNoJyldCiAgICBzdXBwb3J0ZWQzID0gWygnY3AyNicsICdub2FiaScsICdsaW51eF9pNjg2JyksICgncHkyNicsICdub2FiaScsICdub2FyY2gnKSwKICAgICAgICAgICAgICAgICAgKCdjcDI3JywgJ25vYWJpJywgJ2xpbnV4X2k2ODYnKSwgKCdweTI3JywgJ25vYWJpJywgJ25vYXJjaCcpXQoKICAgIGZvciBzdXBwIGluIChzdXBwb3J0ZWQsIHN1cHBvcnRlZDIsIHN1cHBvcnRlZDMpOgogICAgICAgIGNvbnRleHQgPSBsYW1iZGE6IGxpc3Qoc3VwcCkKICAgICAgICBmb3Igd2hlZWwgaW4gY2FuZF93aGVlbHM6CiAgICAgICAgICAgIHdoZWVsLmNvbnRleHQgPSBjb250ZXh0CiAgICAgICAgYmVzdCA9IG1heChjYW5kX3doZWVscykKICAgICAgICBhc3NlcnQgbGlzdChiZXN0LnRhZ3MpWzBdID09IHN1cHBbMF0KCiAgICAgICAgIyBhc3NlcnRfZXF1YWwoCiAgICAgICAgIyAgICAgbGlzdChtYXAoZ2V0X3RhZ3MsIHBpY2tfYmVzdChjYW5kX3doZWVscywgc3VwcCwgdG9wPUZhbHNlKSkpLCBzdXBwKQpQSwMEFAAAAAAAAAAhAG0Esr5KBwAASgcAAC8AAABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L3Rlc3RfaW5zdGFsbC5weSMgVGVzdCB3aGVlbC4NCiMgVGhlIGZpbGUgaGFzIHRoZSBmb2xsb3dpbmcgY29udGVudHM6DQojICAgaGVsbG8ucHlkDQojICAgaGVsbG8vaGVsbG8ucHkNCiMgICBoZWxsby9fX2luaXRfXy5weQ0KIyAgIHRlc3QtMS4wLmRhdGEvZGF0YS9oZWxsby5kYXQNCiMgICB0ZXN0LTEuMC5kYXRhL2hlYWRlcnMvaGVsbG8uZGF0DQojICAgdGVzdC0xLjAuZGF0YS9zY3JpcHRzL2hlbGxvLnNoDQojICAgdGVzdC0xLjAuZGlzdC1pbmZvL1dIRUVMDQojICAgdGVzdC0xLjAuZGlzdC1pbmZvL01FVEFEQVRBDQojICAgdGVzdC0xLjAuZGlzdC1pbmZvL1JFQ09SRA0KIyBUaGUgcm9vdCBpcyBQTEFUTElCDQojIFNvLCBzb21lIGluIFBMQVRMSUIsIGFuZCBvbmUgaW4gZWFjaCBvZiBEQVRBLCBIRUFERVJTIGFuZCBTQ1JJUFRTLg0KDQppbXBvcnQgd2hlZWwudG9vbA0KaW1wb3J0IHdoZWVsLnBlcDQyNXRhZ3MNCmZyb20gd2hlZWwuaW5zdGFsbCBpbXBvcnQgV2hlZWxGaWxlDQpmcm9tIHRlbXBmaWxlIGltcG9ydCBta2R0ZW1wDQppbXBvcnQgc2h1dGlsDQppbXBvcnQgb3MNCg0KVEhJU0RJUiA9IG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykNClRFU1RXSEVFTCA9IG9zLnBhdGguam9pbihUSElTRElSLCAndGVzdC0xLjAtcHkyLnB5My1ub25lLXdpbjMyLndobCcpDQoNCmRlZiBjaGVjaygqcGF0aCk6DQogICAgcmV0dXJuIG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbigqcGF0aCkpDQoNCmRlZiB0ZXN0X2luc3RhbGwoKToNCiAgICB0ZW1wZGlyID0gbWtkdGVtcCgpDQogICAgZGVmIGdldF9zdXBwb3J0ZWQoKToNCiAgICAgICAgcmV0dXJuIGxpc3Qod2hlZWwucGVwNDI1dGFncy5nZXRfc3VwcG9ydGVkKCkpICsgWygncHkzJywgJ25vbmUnLCAnd2luMzInKV0NCiAgICB3aGwgPSBXaGVlbEZpbGUoVEVTVFdIRUVMLCBjb250ZXh0PWdldF9zdXBwb3J0ZWQpDQogICAgYXNzZXJ0IHdobC5zdXBwb3J0c19jdXJyZW50X3B5dGhvbihnZXRfc3VwcG9ydGVkKQ0KICAgIHRyeToNCiAgICAgICAgbG9jcyA9IHt9DQogICAgICAgIGZvciBrZXkgaW4gKCdwdXJlbGliJywgJ3BsYXRsaWInLCAnc2NyaXB0cycsICdoZWFkZXJzJywgJ2RhdGEnKToNCiAgICAgICAgICAgIGxvY3Nba2V5XSA9IG9zLnBhdGguam9pbih0ZW1wZGlyLCBrZXkpDQogICAgICAgICAgICBvcy5ta2Rpcihsb2NzW2tleV0pDQogICAgICAgIHdobC5pbnN0YWxsKG92ZXJyaWRlcz1sb2NzKQ0KICAgICAgICBhc3NlcnQgbGVuKG9zLmxpc3RkaXIobG9jc1sncHVyZWxpYiddKSkgPT0gMA0KICAgICAgICBhc3NlcnQgY2hlY2sobG9jc1sncGxhdGxpYiddLCAnaGVsbG8ucHlkJykNCiAgICAgICAgYXNzZXJ0IGNoZWNrKGxvY3NbJ3BsYXRsaWInXSwgJ2hlbGxvJywgJ2hlbGxvLnB5JykNCiAgICAgICAgYXNzZXJ0IGNoZWNrKGxvY3NbJ3BsYXRsaWInXSwgJ2hlbGxvJywgJ19faW5pdF9fLnB5JykNCiAgICAgICAgYXNzZXJ0IGNoZWNrKGxvY3NbJ2RhdGEnXSwgJ2hlbGxvLmRhdCcpDQogICAgICAgIGFzc2VydCBjaGVjayhsb2NzWydoZWFkZXJzJ10sICdoZWxsby5kYXQnKQ0KICAgICAgICBhc3NlcnQgY2hlY2sobG9jc1snc2NyaXB0cyddLCAnaGVsbG8uc2gnKQ0KICAgICAgICBhc3NlcnQgY2hlY2sobG9jc1sncGxhdGxpYiddLCAndGVzdC0xLjAuZGlzdC1pbmZvJywgJ1JFQ09SRCcpDQogICAgZmluYWxseToNCiAgICAgICAgc2h1dGlsLnJtdHJlZSh0ZW1wZGlyKQ0KDQpkZWYgdGVzdF9pbnN0YWxsX3Rvb2woKToNCiAgICAiIiJTbGlnaHRseSBpbXByb3ZlIGNvdmVyYWdlIG9mIHdoZWVsLmluc3RhbGwiIiINCiAgICB3aGVlbC50b29sLmluc3RhbGwoW1RFU1RXSEVFTF0sIGZvcmNlPVRydWUsIGRyeV9ydW49VHJ1ZSkNCg0KICAgIFBLAwQUAAAAAAAAACEA92Efkw8KAAAPCgAALAAAAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvdGVzdF9rZXlzLnB5aW1wb3J0IHRlbXBmaWxlCmltcG9ydCBvcy5wYXRoCmltcG9ydCB1bml0dGVzdAppbXBvcnQganNvbgoKZnJvbSB3aGVlbC5zaWduYXR1cmVzIGltcG9ydCBrZXlzCgp3aGVlbF9qc29uID0gIiIiCnsKICAidmVyaWZpZXJzIjogWwogICAgewogICAgICAic2NvcGUiOiAiKyIsIAogICAgICAidmsiOiAiYnAtYmpLMmZGZ3RBLThEaEtLQUFQbTktZUFaY1hfdTAzb0J2MlJsS09CYyIKICAgIH0sIAogICAgewogICAgICAic2NvcGUiOiAiKyIsIAogICAgICAidmsiOiAiS0FIWkJmeXFGVzNPY0ZEYkxTRzRuUENqWHhVUHk3MnBoUDlJNFJuOU1BbyIKICAgIH0sCiAgICB7CiAgICAgICJzY29wZSI6ICIrIiwgCiAgICAgICJ2ayI6ICJ0bUFZQ3JTZmo4Z3RKMTB2M1Zrdlc3ak9uZEttUUlZRTEyaGduRnUzY3ZrIgogICAgfSAKICBdLCAKICAic2lnbmVycyI6IFsKICAgIHsKICAgICAgInNjb3BlIjogIisiLCAKICAgICAgInZrIjogInRtQVlDclNmajhndEoxMHYzVmt2VzdqT25kS21RSVlFMTJoZ25GdTNjdmsiCiAgICB9LCAKICAgIHsKICAgICAgInNjb3BlIjogIisiLCAKICAgICAgInZrIjogIktBSFpCZnlxRlczT2NGRGJMU0c0blBDalh4VVB5NzJwaFA5STRSbjlNQW8iCiAgICB9CiAgXSwgCiAgInNjaGVtYSI6IDEKfQoiIiIKCmNsYXNzIFRlc3RXaGVlbEtleXModW5pdHRlc3QuVGVzdENhc2UpOgogICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgIHNlbGYuY29uZmlnID0gdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKHN1ZmZpeD0nLmpzb24nKQogICAgICAgIHNlbGYuY29uZmlnLmNsb3NlKCkKICAgICAgICAKICAgICAgICBzZWxmLmNvbmZpZ19wYXRoLCBzZWxmLmNvbmZpZ19maWxlbmFtZSA9IG9zLnBhdGguc3BsaXQoc2VsZi5jb25maWcubmFtZSkgCiAgICAgICAgZGVmIGxvYWQoKmFyZ3MpOgogICAgICAgICAgICByZXR1cm4gW3NlbGYuY29uZmlnX3BhdGhdCiAgICAgICAgZGVmIHNhdmUoKmFyZ3MpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5jb25maWdfcGF0aAogICAgICAgIGtleXMubG9hZF9jb25maWdfcGF0aHMgPSBsb2FkCiAgICAgICAga2V5cy5zYXZlX2NvbmZpZ19wYXRoID0gc2F2ZQogICAgICAgIHNlbGYud2sgPSBrZXlzLldoZWVsS2V5cygpCiAgICAgICAgc2VsZi53ay5DT05GSUdfTkFNRSA9IHNlbGYuY29uZmlnX2ZpbGVuYW1lCiAgICAgICAgCiAgICBkZWYgdGVhckRvd24oc2VsZik6CiAgICAgICAgb3MudW5saW5rKHNlbGYuY29uZmlnLm5hbWUpCiAgICAgICAgCiAgICBkZWYgdGVzdF9sb2FkX3NhdmUoc2VsZik6CiAgICAgICAgc2VsZi53ay5kYXRhID0ganNvbi5sb2Fkcyh3aGVlbF9qc29uKQogICAgICAgIAogICAgICAgIHNlbGYud2suYWRkX3NpZ25lcignKycsICc2Nzg5MCcpCiAgICAgICAgc2VsZi53ay5hZGRfc2lnbmVyKCdzY29wZScsICdhYmNkZWZnJykKICAgICAgICAKICAgICAgICBzZWxmLndrLnRydXN0KCdlcG9jcycsICdnZmVkY2JhJykKICAgICAgICBzZWxmLndrLnRydXN0KCcrJywgJzEyMzQ1JykKICAgICAgICAKICAgICAgICBzZWxmLndrLnNhdmUoKQogICAgICAgIAogICAgICAgIGRlbCBzZWxmLndrLmRhdGEKICAgICAgICBzZWxmLndrLmxvYWQoKQogICAgICAgIAogICAgICAgIHNpZ25lcnMgPSBzZWxmLndrLnNpZ25lcnMoJ3Njb3BlJykKICAgICAgICBzZWxmLmFzc2VydFRydWUoc2lnbmVyc1swXSA9PSAoJ3Njb3BlJywgJ2FiY2RlZmcnKSwgc2VsZi53ay5kYXRhWydzaWduZXJzJ10pCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNpZ25lcnNbMV1bMF0gPT0gJysnLCBzZWxmLndrLmRhdGFbJ3NpZ25lcnMnXSkKICAgICAgICAKICAgICAgICB0cnVzdGVkID0gc2VsZi53ay50cnVzdGVkKCdlcG9jcycpCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRydXN0ZWRbMF0gPT0gKCdlcG9jcycsICdnZmVkY2JhJykpCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRydXN0ZWRbMV1bMF0gPT0gJysnKQogICAgICAgIAogICAgICAgIHNlbGYud2sudW50cnVzdCgnZXBvY3MnLCAnZ2ZlZGNiYScpCiAgICAgICAgdHJ1c3RlZCA9IHNlbGYud2sudHJ1c3RlZCgnZXBvY3MnKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoJ2Vwb2NzJywgJ2dmZWRjYmEnKSBub3QgaW4gdHJ1c3RlZCkKICAgICAgICAKICAgIGRlZiB0ZXN0X2xvYWRfc2F2ZV9pbmNvbXBsZXRlKHNlbGYpOgogICAgICAgIHNlbGYud2suZGF0YSA9IGpzb24ubG9hZHMod2hlZWxfanNvbikKICAgICAgICBkZWwgc2VsZi53ay5kYXRhWydzaWduZXJzJ10KICAgICAgICBzZWxmLndrLmRhdGFbJ3NjaGVtYSddID0gc2VsZi53ay5TQ0hFTUErMQogICAgICAgIHNlbGYud2suc2F2ZSgpCiAgICAgICAgdHJ5OgogICAgICAgICAgICBzZWxmLndrLmxvYWQoKQogICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgICAgICBwYXNzCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJFeHBlY3RlZCBWYWx1ZUVycm9yIikKICAgICAgICAKICAgICAgICBkZWwgc2VsZi53ay5kYXRhWydzY2hlbWEnXQogICAgICAgIHNlbGYud2suc2F2ZSgpCiAgICAgICAgc2VsZi53ay5sb2FkKCkKICAgIAogICAgClBLAwQUAAAAAAAAACEAYlh0Y6wAAACsAAAALQAAAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvdGVzdF9wYXRocy5weWltcG9ydCB3aGVlbC5wYXRocwpmcm9tIGRpc3R1dGlscy5jb21tYW5kLmluc3RhbGwgaW1wb3J0IFNDSEVNRV9LRVlTCgpkZWYgdGVzdF9wYXRoKCk6CiAgICBkID0gd2hlZWwucGF0aHMuZ2V0X2luc3RhbGxfcGF0aHMoJ3doZWVsJykKICAgIGFzc2VydCBsZW4oZCkgPT0gbGVuKFNDSEVNRV9LRVlTKQpQSwMEFAAAAAAAAAAhAG2WMfnYBQAA2AUAAC8AAABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L3Rlc3RfcmFua2luZy5weWltcG9ydCB1bml0dGVzdAoKZnJvbSB3aGVlbC5wZXA0MjV0YWdzIGltcG9ydCBnZXRfc3VwcG9ydGVkCmZyb20gd2hlZWwuaW5zdGFsbCBpbXBvcnQgV2hlZWxGaWxlCgpXSEVFTFBBVCA9ICIlKG5hbWUpcy0lKHZlcilzLSUocHl2ZXIpcy0lKGFiaSlzLSUoYXJjaClzLndobCIKZGVmIG1ha2Vfd2hlZWwobmFtZSwgdmVyLCBweXZlciwgYWJpLCBhcmNoKToKICAgIG5hbWUgPSBXSEVFTFBBVCAlIGRpY3QobmFtZT1uYW1lLCB2ZXI9dmVyLCBweXZlcj1weXZlciwgYWJpPWFiaSwKICAgICAgICAgICAgYXJjaD1hcmNoKQogICAgcmV0dXJuIFdoZWVsRmlsZShuYW1lKQoKIyBUaGlzIHJlbGllcyBvbiB0aGUgZmFjdCB0aGF0IGdlbmVyYXRlX3N1cHBvcnRlZCB3aWxsIGFsd2F5cyByZXR1cm4gdGhlCiMgZXhhY3QgcHl2ZXIsIGFiaSwgYW5kIGFyY2hpdGVjdHVyZSBmb3IgaXRzIGZpcnN0IChiZXN0KSBtYXRjaC4Kc3VwID0gZ2V0X3N1cHBvcnRlZCgpCnB5dmVyLCBhYmksIGFyY2ggPSBzdXBbMF0KZ2VudmVyID0gJ3B5JyArIHB5dmVyWzI6XQptYWp2ZXIgPSBnZW52ZXJbOjNdCgpDT01CSU5BVElPTlMgPSAoCiAgICAoJ2JhcicsICcwLjknLCAncHkyLnB5MycsICdub25lJywgJ2FueScpLAogICAgKCdiYXInLCAnMC45JywgbWFqdmVyLCAnbm9uZScsICdhbnknKSwKICAgICgnYmFyJywgJzAuOScsIGdlbnZlciwgJ25vbmUnLCAnYW55JyksCiAgICAoJ2JhcicsICcwLjknLCBweXZlciwgYWJpLCBhcmNoKSwKICAgICgnYmFyJywgJzEuMy4yJywgbWFqdmVyLCAnbm9uZScsICdhbnknKSwKICAgICgnYmFyJywgJzMuMScsIGdlbnZlciwgJ25vbmUnLCAnYW55JyksCiAgICAoJ2JhcicsICczLjEnLCBweXZlciwgYWJpLCBhcmNoKSwKICAgICgnZm9vJywgJzEuMCcsIG1hanZlciwgJ25vbmUnLCAnYW55JyksCiAgICAoJ2ZvbycsICcxLjEnLCBweXZlciwgYWJpLCBhcmNoKSwKICAgICgnZm9vJywgJzIuMScsIG1hanZlciArICcwJywgJ25vbmUnLCAnYW55JyksCiAgICAjIFRoaXMgd2lsbCBub3QgYmUgY29tcGF0aWJsZSBmb3IgUHl0aG9uIHguMC4gQmV3YXJlIHdoZW4gd2UgaGl0IFB5dGhvbgogICAgIyA0LjAsIGFuZCBkb24ndCB0ZXN0IHdpdGggMy4wISEhCiAgICAoJ2ZvbycsICcyLjEnLCBtYWp2ZXIgKyAnMScsICdub25lJywgJ2FueScpLAogICAgKCdmb28nLCAnMi4xJywgcHl2ZXIgLCAnbm9uZScsICdhbnknKSwKICAgICgnZm9vJywgJzIuMScsIHB5dmVyICwgYWJpLCBhcmNoKSwKKQoKV0hFRUxTID0gWyBtYWtlX3doZWVsKCphcmdzKSBmb3IgYXJncyBpbiBDT01CSU5BVElPTlMgXQoKY2xhc3MgVGVzdFJhbmtpbmcodW5pdHRlc3QuVGVzdENhc2UpOgogICAgZGVmIHRlc3RfY29tcGFyaXNvbihzZWxmKToKICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oV0hFRUxTKS0xKToKICAgICAgICAgICAgZm9yIGogaW4gcmFuZ2UoaSk6CiAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoV0hFRUxTW2pdPFdIRUVMU1tpXSkKUEsDBBQAAAAAAAAAIQCkKX8xYAQAAGAEAAAyAAAAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC90ZXN0X3NpZ25hdHVyZXMucHlmcm9tIHdoZWVsIGltcG9ydCBzaWduYXR1cmVzCmZyb20gd2hlZWwuc2lnbmF0dXJlcyBpbXBvcnQgZGpiZWMsIGVkMjU1MTlweQpmcm9tIHdoZWVsLnV0aWwgaW1wb3J0IGJpbmFyeQoKZGVmIHRlc3RfZ2V0bGliKCk6CiAgICBzaWduYXR1cmVzLmdldF9lZDI1NTE5bGwoKQoKZGVmIHRlc3RfZGpiZWMoKToKICAgIGRqYmVjLmRzYV90ZXN0KCkgICAgCiAgICBkamJlYy5kaF90ZXN0KCkKICAgIApkZWYgdGVzdF9lZDI1NTE5cHkoKToKICAgIGtwMCA9IGVkMjU1MTlweS5jcnlwdG9fc2lnbl9rZXlwYWlyKGJpbmFyeSgnICcqMzIpKQogICAga3AgPSBlZDI1NTE5cHkuY3J5cHRvX3NpZ25fa2V5cGFpcigpCiAgICAgICAgCiAgICBzaWduZWQgPSBlZDI1NTE5cHkuY3J5cHRvX3NpZ24oYmluYXJ5KCd0ZXN0JyksIGtwLnNrKQogICAgCiAgICBlZDI1NTE5cHkuY3J5cHRvX3NpZ25fb3BlbihzaWduZWQsIGtwLnZrKQogICAgCiAgICB0cnk6CiAgICAgICAgZWQyNTUxOXB5LmNyeXB0b19zaWduX29wZW4oc2lnbmVkLCBrcDAudmspCiAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICBwYXNzCiAgICBlbHNlOgogICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiRXhwZWN0ZWQgVmFsdWVFcnJvciIpCiAgICAKICAgIHRyeToKICAgICAgICBlZDI1NTE5cHkuY3J5cHRvX3NpZ25fa2V5cGFpcihiaW5hcnkoJyAnKjMzKSkKICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgIHBhc3MKICAgIGVsc2U6CiAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJFeHBlY3RlZCBWYWx1ZUVycm9yIikKICAgIAogICAgdHJ5OgogICAgICAgIGVkMjU1MTlweS5jcnlwdG9fc2lnbihiaW5hcnkoJycpLCBiaW5hcnkoJyAnKSozMSkKICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgogICAgICAgIHBhc3MKICAgIGVsc2U6CiAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJFeHBlY3RlZCBWYWx1ZUVycm9yIikKICAgIAogICAgdHJ5OgogICAgICAgIGVkMjU1MTlweS5jcnlwdG9fc2lnbl9vcGVuKGJpbmFyeSgnJyksIGJpbmFyeSgnICcpKjMxKQogICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgcGFzcwogICAgZWxzZToKICAgICAgICByYWlzZSBFeGNlcHRpb24oIkV4cGVjdGVkIFZhbHVlRXJyb3IiKQogICAgUEsDBBQAAAAAAAAAIQCcV0LwJxcAACcXAAAuAAAAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC90ZXN0X3RhZ29wdC5weSIiIgpUZXN0cyBmb3IgdGhlIGJkaXN0X3doZWVsIHRhZyBvcHRpb25zICgtLXB5dGhvbi10YWcsIC0tdW5pdmVyc2FsLCBhbmQKLS1wbGF0LW5hbWUpCiIiIgoKaW1wb3J0IHN5cwppbXBvcnQgc2h1dGlsCmltcG9ydCBweXRlc3QKaW1wb3J0IHB5LnBhdGgKaW1wb3J0IHRlbXBmaWxlCmltcG9ydCBzdWJwcm9jZXNzCgpTRVRVUF9QWSA9ICIiIlwKZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBzZXR1cCwgRXh0ZW5zaW9uCgpzZXR1cCgKICAgIG5hbWU9IlRlc3QiLAogICAgdmVyc2lvbj0iMS4wIiwKICAgIGF1dGhvcl9lbWFpbD0iYXV0aG9yQGV4YW1wbGUuY29tIiwKICAgIHB5X21vZHVsZXM9WyJ0ZXN0Il0sCiAgICB7ZXh0X21vZHVsZXN9CikKIiIiCgpFWFRfTU9EVUxFUyA9ICJleHRfbW9kdWxlcz1bRXh0ZW5zaW9uKCdfdGVzdCcsIHNvdXJjZXM9Wyd0ZXN0LmMnXSldLCIKCkBweXRlc3QuZml4dHVyZQpkZWYgdGVtcF9wa2cocmVxdWVzdCwgZXh0PUZhbHNlKToKICAgIHRlbXBkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKICAgIGRlZiBmaW4oKToKICAgICAgICBzaHV0aWwucm10cmVlKHRlbXBkaXIpCiAgICByZXF1ZXN0LmFkZGZpbmFsaXplcihmaW4pCiAgICB0ZW1wcGF0aCA9IHB5LnBhdGgubG9jYWwodGVtcGRpcikKICAgIHRlbXBwYXRoLmpvaW4oJ3Rlc3QucHknKS53cml0ZSgncHJpbnQoIkhlbGxvLCB3b3JsZCIpJykKICAgIGlmIGV4dDoKICAgICAgICB0ZW1wcGF0aC5qb2luKCd0ZXN0LmMnKS53cml0ZSgnI2luY2x1ZGUgPHN0ZGlvLmg+JykKICAgICAgICBzZXR1cF9weSA9IFNFVFVQX1BZLmZvcm1hdChleHRfbW9kdWxlcz1FWFRfTU9EVUxFUykKICAgIGVsc2U6CiAgICAgICAgc2V0dXBfcHkgPSBTRVRVUF9QWS5mb3JtYXQoZXh0X21vZHVsZXM9JycpCiAgICB0ZW1wcGF0aC5qb2luKCdzZXR1cC5weScpLndyaXRlKHNldHVwX3B5KQogICAgcmV0dXJuIHRlbXBwYXRoCgpAcHl0ZXN0LmZpeHR1cmUKZGVmIHRlbXBfZXh0X3BrZyhyZXF1ZXN0KToKICAgIHJldHVybiB0ZW1wX3BrZyhyZXF1ZXN0LCBleHQ9VHJ1ZSkKCmRlZiB0ZXN0X2RlZmF1bHRfdGFnKHRlbXBfcGtnKToKICAgIHN1YnByb2Nlc3MuY2hlY2tfY2FsbChbc3lzLmV4ZWN1dGFibGUsICdzZXR1cC5weScsICdiZGlzdF93aGVlbCddLAogICAgICAgICAgICBjd2Q9c3RyKHRlbXBfcGtnKSkKICAgIGRpc3RfZGlyID0gdGVtcF9wa2cuam9pbignZGlzdCcpCiAgICBhc3NlcnQgZGlzdF9kaXIuY2hlY2soZGlyPTEpCiAgICB3aGVlbHMgPSBkaXN0X2Rpci5saXN0ZGlyKCkKICAgIGFzc2VydCBsZW4od2hlZWxzKSA9PSAxCiAgICBhc3NlcnQgd2hlZWxzWzBdLmJhc2VuYW1lID09ICdUZXN0LTEuMC1weSVzLW5vbmUtYW55LndobCcgJSAoc3lzLnZlcnNpb25bMF0sKQogICAgYXNzZXJ0IHdoZWVsc1swXS5leHQgPT0gJy53aGwnCgpkZWYgdGVzdF9leHBsaWNpdF90YWcodGVtcF9wa2cpOgogICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKAogICAgICAgIFtzeXMuZXhlY3V0YWJsZSwgJ3NldHVwLnB5JywgJ2JkaXN0X3doZWVsJywgJy0tcHl0aG9uLXRhZz1weTMyJ10sCiAgICAgICAgY3dkPXN0cih0ZW1wX3BrZykpCiAgICBkaXN0X2RpciA9IHRlbXBfcGtnLmpvaW4oJ2Rpc3QnKQogICAgYXNzZXJ0IGRpc3RfZGlyLmNoZWNrKGRpcj0xKQogICAgd2hlZWxzID0gZGlzdF9kaXIubGlzdGRpcigpCiAgICBhc3NlcnQgbGVuKHdoZWVscykgPT0gMQogICAgYXNzZXJ0IHdoZWVsc1swXS5iYXNlbmFtZS5zdGFydHN3aXRoKCdUZXN0LTEuMC1weTMyLScpCiAgICBhc3NlcnQgd2hlZWxzWzBdLmV4dCA9PSAnLndobCcKCmRlZiB0ZXN0X3VuaXZlcnNhbF90YWcodGVtcF9wa2cpOgogICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKAogICAgICAgIFtzeXMuZXhlY3V0YWJsZSwgJ3NldHVwLnB5JywgJ2JkaXN0X3doZWVsJywgJy0tdW5pdmVyc2FsJ10sCiAgICAgICAgY3dkPXN0cih0ZW1wX3BrZykpCiAgICBkaXN0X2RpciA9IHRlbXBfcGtnLmpvaW4oJ2Rpc3QnKQogICAgYXNzZXJ0IGRpc3RfZGlyLmNoZWNrKGRpcj0xKQogICAgd2hlZWxzID0gZGlzdF9kaXIubGlzdGRpcigpCiAgICBhc3NlcnQgbGVuKHdoZWVscykgPT0gMQogICAgYXNzZXJ0IHdoZWVsc1swXS5iYXNlbmFtZS5zdGFydHN3aXRoKCdUZXN0LTEuMC1weTIucHkzLScpCiAgICBhc3NlcnQgd2hlZWxzWzBdLmV4dCA9PSAnLndobCcKCmRlZiB0ZXN0X3VuaXZlcnNhbF9iZWF0c19leHBsaWNpdF90YWcodGVtcF9wa2cpOgogICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKAogICAgICAgIFtzeXMuZXhlY3V0YWJsZSwgJ3NldHVwLnB5JywgJ2JkaXN0X3doZWVsJywgJy0tdW5pdmVyc2FsJywgJy0tcHl0aG9uLXRhZz1weTMyJ10sCiAgICAgICAgY3dkPXN0cih0ZW1wX3BrZykpCiAgICBkaXN0X2RpciA9IHRlbXBfcGtnLmpvaW4oJ2Rpc3QnKQogICAgYXNzZXJ0IGRpc3RfZGlyLmNoZWNrKGRpcj0xKQogICAgd2hlZWxzID0gZGlzdF9kaXIubGlzdGRpcigpCiAgICBhc3NlcnQgbGVuKHdoZWVscykgPT0gMQogICAgYXNzZXJ0IHdoZWVsc1swXS5iYXNlbmFtZS5zdGFydHN3aXRoKCdUZXN0LTEuMC1weTIucHkzLScpCiAgICBhc3NlcnQgd2hlZWxzWzBdLmV4dCA9PSAnLndobCcKCmRlZiB0ZXN0X3VuaXZlcnNhbF9pbl9zZXR1cF9jZmcodGVtcF9wa2cpOgogICAgdGVtcF9wa2cuam9pbignc2V0dXAuY2ZnJykud3JpdGUoJ1tiZGlzdF93aGVlbF1cbnVuaXZlcnNhbD0xJykKICAgIHN1YnByb2Nlc3MuY2hlY2tfY2FsbCgKICAgICAgICBbc3lzLmV4ZWN1dGFibGUsICdzZXR1cC5weScsICdiZGlzdF93aGVlbCddLAogICAgICAgIGN3ZD1zdHIodGVtcF9wa2cpKQogICAgZGlzdF9kaXIgPSB0ZW1wX3BrZy5qb2luKCdkaXN0JykKICAgIGFzc2VydCBkaXN0X2Rpci5jaGVjayhkaXI9MSkKICAgIHdoZWVscyA9IGRpc3RfZGlyLmxpc3RkaXIoKQogICAgYXNzZXJ0IGxlbih3aGVlbHMpID09IDEKICAgIGFzc2VydCB3aGVlbHNbMF0uYmFzZW5hbWUuc3RhcnRzd2l0aCgnVGVzdC0xLjAtcHkyLnB5My0nKQogICAgYXNzZXJ0IHdoZWVsc1swXS5leHQgPT0gJy53aGwnCgpkZWYgdGVzdF9weXRob250YWdfaW5fc2V0dXBfY2ZnKHRlbXBfcGtnKToKICAgIHRlbXBfcGtnLmpvaW4oJ3NldHVwLmNmZycpLndyaXRlKCdbYmRpc3Rfd2hlZWxdXG5weXRob25fdGFnPXB5MzInKQogICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKAogICAgICAgIFtzeXMuZXhlY3V0YWJsZSwgJ3NldHVwLnB5JywgJ2JkaXN0X3doZWVsJ10sCiAgICAgICAgY3dkPXN0cih0ZW1wX3BrZykpCiAgICBkaXN0X2RpciA9IHRlbXBfcGtnLmpvaW4oJ2Rpc3QnKQogICAgYXNzZXJ0IGRpc3RfZGlyLmNoZWNrKGRpcj0xKQogICAgd2hlZWxzID0gZGlzdF9kaXIubGlzdGRpcigpCiAgICBhc3NlcnQgbGVuKHdoZWVscykgPT0gMQogICAgYXNzZXJ0IHdoZWVsc1swXS5iYXNlbmFtZS5zdGFydHN3aXRoKCdUZXN0LTEuMC1weTMyLScpCiAgICBhc3NlcnQgd2hlZWxzWzBdLmV4dCA9PSAnLndobCcKCmRlZiB0ZXN0X2xlZ2FjeV93aGVlbF9zZWN0aW9uX2luX3NldHVwX2NmZyh0ZW1wX3BrZyk6CiAgICB0ZW1wX3BrZy5qb2luKCdzZXR1cC5jZmcnKS53cml0ZSgnW3doZWVsXVxudW5pdmVyc2FsPTEnKQogICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKAogICAgICAgIFtzeXMuZXhlY3V0YWJsZSwgJ3NldHVwLnB5JywgJ2JkaXN0X3doZWVsJ10sCiAgICAgICAgY3dkPXN0cih0ZW1wX3BrZykpCiAgICBkaXN0X2RpciA9IHRlbXBfcGtnLmpvaW4oJ2Rpc3QnKQogICAgYXNzZXJ0IGRpc3RfZGlyLmNoZWNrKGRpcj0xKQogICAgd2hlZWxzID0gZGlzdF9kaXIubGlzdGRpcigpCiAgICBhc3NlcnQgbGVuKHdoZWVscykgPT0gMQogICAgYXNzZXJ0IHdoZWVsc1swXS5iYXNlbmFtZS5zdGFydHN3aXRoKCdUZXN0LTEuMC1weTIucHkzLScpCiAgICBhc3NlcnQgd2hlZWxzWzBdLmV4dCA9PSAnLndobCcKCmRlZiB0ZXN0X3BsYXRfbmFtZV9wdXJlcHkodGVtcF9wa2cpOgogICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKAogICAgICAgIFtzeXMuZXhlY3V0YWJsZSwgJ3NldHVwLnB5JywgJ2JkaXN0X3doZWVsJywgJy0tcGxhdC1uYW1lPXRlc3RwbGF0LnB1cmUnXSwKICAgICAgICBjd2Q9c3RyKHRlbXBfcGtnKSkKICAgIGRpc3RfZGlyID0gdGVtcF9wa2cuam9pbignZGlzdCcpCiAgICBhc3NlcnQgZGlzdF9kaXIuY2hlY2soZGlyPTEpCiAgICB3aGVlbHMgPSBkaXN0X2Rpci5saXN0ZGlyKCkKICAgIGFzc2VydCBsZW4od2hlZWxzKSA9PSAxCiAgICBhc3NlcnQgd2hlZWxzWzBdLmJhc2VuYW1lLmVuZHN3aXRoKCctdGVzdHBsYXRfcHVyZS53aGwnKQogICAgYXNzZXJ0IHdoZWVsc1swXS5leHQgPT0gJy53aGwnCgpkZWYgdGVzdF9wbGF0X25hbWVfZXh0KHRlbXBfZXh0X3BrZyk6CiAgICB0cnk6CiAgICAgICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKAogICAgICAgICAgICBbc3lzLmV4ZWN1dGFibGUsICdzZXR1cC5weScsICdiZGlzdF93aGVlbCcsICctLXBsYXQtbmFtZT10ZXN0cGxhdC5hcmNoJ10sCiAgICAgICAgICAgIGN3ZD1zdHIodGVtcF9leHRfcGtnKSkKICAgIGV4Y2VwdCBzdWJwcm9jZXNzLkNhbGxlZFByb2Nlc3NFcnJvcjoKICAgICAgICBweXRlc3Quc2tpcCgiQ2Fubm90IGNvbXBpbGUgQyBFeHRlbnNpb25zIikKICAgIGRpc3RfZGlyID0gdGVtcF9leHRfcGtnLmpvaW4oJ2Rpc3QnKQogICAgYXNzZXJ0IGRpc3RfZGlyLmNoZWNrKGRpcj0xKQogICAgd2hlZWxzID0gZGlzdF9kaXIubGlzdGRpcigpCiAgICBhc3NlcnQgbGVuKHdoZWVscykgPT0gMQogICAgYXNzZXJ0IHdoZWVsc1swXS5iYXNlbmFtZS5lbmRzd2l0aCgnLXRlc3RwbGF0X2FyY2gud2hsJykKICAgIGFzc2VydCB3aGVlbHNbMF0uZXh0ID09ICcud2hsJwoKZGVmIHRlc3RfcGxhdF9uYW1lX3B1cmVweV9pbl9zZXR1cGNmZyh0ZW1wX3BrZyk6CiAgICB0ZW1wX3BrZy5qb2luKCdzZXR1cC5jZmcnKS53cml0ZSgnW2JkaXN0X3doZWVsXVxucGxhdF9uYW1lPXRlc3RwbGF0LnB1cmUnKQogICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKAogICAgICAgIFtzeXMuZXhlY3V0YWJsZSwgJ3NldHVwLnB5JywgJ2JkaXN0X3doZWVsJ10sCiAgICAgICAgY3dkPXN0cih0ZW1wX3BrZykpCiAgICBkaXN0X2RpciA9IHRlbXBfcGtnLmpvaW4oJ2Rpc3QnKQogICAgYXNzZXJ0IGRpc3RfZGlyLmNoZWNrKGRpcj0xKQogICAgd2hlZWxzID0gZGlzdF9kaXIubGlzdGRpcigpCiAgICBhc3NlcnQgbGVuKHdoZWVscykgPT0gMQogICAgYXNzZXJ0IHdoZWVsc1swXS5iYXNlbmFtZS5lbmRzd2l0aCgnLXRlc3RwbGF0X3B1cmUud2hsJykKICAgIGFzc2VydCB3aGVlbHNbMF0uZXh0ID09ICcud2hsJwoKZGVmIHRlc3RfcGxhdF9uYW1lX2V4dF9pbl9zZXR1cGNmZyh0ZW1wX2V4dF9wa2cpOgogICAgdGVtcF9leHRfcGtnLmpvaW4oJ3NldHVwLmNmZycpLndyaXRlKCdbYmRpc3Rfd2hlZWxdXG5wbGF0X25hbWU9dGVzdHBsYXQuYXJjaCcpCiAgICB0cnk6CiAgICAgICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKAogICAgICAgICAgICBbc3lzLmV4ZWN1dGFibGUsICdzZXR1cC5weScsICdiZGlzdF93aGVlbCddLAogICAgICAgICAgICBjd2Q9c3RyKHRlbXBfZXh0X3BrZykpCiAgICBleGNlcHQgc3VicHJvY2Vzcy5DYWxsZWRQcm9jZXNzRXJyb3I6CiAgICAgICAgcHl0ZXN0LnNraXAoIkNhbm5vdCBjb21waWxlIEMgRXh0ZW5zaW9ucyIpCiAgICBkaXN0X2RpciA9IHRlbXBfZXh0X3BrZy5qb2luKCdkaXN0JykKICAgIGFzc2VydCBkaXN0X2Rpci5jaGVjayhkaXI9MSkKICAgIHdoZWVscyA9IGRpc3RfZGlyLmxpc3RkaXIoKQogICAgYXNzZXJ0IGxlbih3aGVlbHMpID09IDEKICAgIGFzc2VydCB3aGVlbHNbMF0uYmFzZW5hbWUuZW5kc3dpdGgoJy10ZXN0cGxhdF9hcmNoLndobCcpCiAgICBhc3NlcnQgd2hlZWxzWzBdLmV4dCA9PSAnLndobCcKUEsDBBQAAAAAAAAAIQDUPh9WkAIAAJACAAAsAAAAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC90ZXN0X3Rvb2wucHlmcm9tIC4uIGltcG9ydCB0b29sCgpkZWYgdGVzdF9rZXlnZW4oKToKICAgIGRlZiBnZXRfa2V5cmluZygpOgogICAgICAgIFdoZWVsS2V5cywga2V5cmluZyA9IHRvb2wuZ2V0X2tleXJpbmcoKQoKICAgICAgICBjbGFzcyBXaGVlbEtleXNUZXN0KFdoZWVsS2V5cyk6CiAgICAgICAgICAgIGRlZiBzYXZlKHNlbGYpOgogICAgICAgICAgICAgICAgcGFzcwoKICAgICAgICBjbGFzcyBrZXlyaW5nVGVzdDoKICAgICAgICAgICAgQGNsYXNzbWV0aG9kCiAgICAgICAgICAgIGRlZiBnZXRfa2V5cmluZyhjbHMpOgogICAgICAgICAgICAgICAgY2xhc3Mga2V5cmluZ1Rlc3QyOgogICAgICAgICAgICAgICAgICAgIHB3ID0gTm9uZQogICAgICAgICAgICAgICAgICAgIGRlZiBzZXRfcGFzc3dvcmQoc2VsZiwgYSwgYiwgYyk6CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucHcgPSBjCiAgICAgICAgICAgICAgICAgICAgZGVmIGdldF9wYXNzd29yZChzZWxmLCBhLCBiKToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYucHcKCiAgICAgICAgICAgICAgICByZXR1cm4ga2V5cmluZ1Rlc3QyKCkKCiAgICAgICAgcmV0dXJuIFdoZWVsS2V5c1Rlc3QsIGtleXJpbmdUZXN0CgogICAgdG9vbC5rZXlnZW4oZ2V0X2tleXJpbmc9Z2V0X2tleXJpbmcpClBLAwQUAAAAAAAAACEARWJETOkRAADpEQAAMQAAAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvdGVzdF93aGVlbGZpbGUucHlpbXBvcnQgb3MKaW1wb3J0IHdoZWVsLmluc3RhbGwKaW1wb3J0IHdoZWVsLmFyY2hpdmUKaW1wb3J0IGhhc2hsaWIKdHJ5OgogICAgZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KZXhjZXB0IEltcG9ydEVycm9yOgogICAgZnJvbSBpbyBpbXBvcnQgQnl0ZXNJTyBhcyBTdHJpbmdJTwppbXBvcnQgY29kZWNzCmltcG9ydCB6aXBmaWxlCmltcG9ydCBweXRlc3QKaW1wb3J0IHNodXRpbAppbXBvcnQgdGVtcGZpbGUKZnJvbSBjb250ZXh0bGliIGltcG9ydCBjb250ZXh0bWFuYWdlcgoKQGNvbnRleHRtYW5hZ2VyCmRlZiBlbnZpcm9uKGtleSwgdmFsdWUpOgogICAgb2xkX3ZhbHVlID0gb3MuZW52aXJvbi5nZXQoa2V5KQogICAgdHJ5OgogICAgICAgIG9zLmVudmlyb25ba2V5XSA9IHZhbHVlCiAgICAgICAgeWllbGQKICAgIGZpbmFsbHk6CiAgICAgICAgaWYgb2xkX3ZhbHVlIGlzIE5vbmU6CiAgICAgICAgICAgIGRlbCBvcy5lbnZpcm9uW2tleV0KICAgICAgICBlbHNlOgogICAgICAgICAgICBvcy5lbnZpcm9uW2tleV0gPSBvbGRfdmFsdWUKCkBjb250ZXh0bWFuYWdlcgpkZWYgdGVtcG9yYXJ5X2RpcmVjdG9yeSgpOgogICAgIyB0ZW1wZmlsZS5UZW1wb3JhcnlEaXJlY3RvcnkgZG9lc24ndCBleGlzdCBpbiBQeXRob24gMi4KICAgIHRlbXBkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKICAgIHRyeToKICAgICAgICB5aWVsZCB0ZW1wZGlyCiAgICBmaW5hbGx5OgogICAgICAgIHNodXRpbC5ybXRyZWUodGVtcGRpcikKCkBjb250ZXh0bWFuYWdlcgpkZWYgcmVhZGFibGVfemlwZmlsZShwYXRoKToKICAgICMgemlwZmlsZS5aaXBGaWxlKCkgaXNuJ3QgYSBjb250ZXh0IG1hbmFnZXIgdW5kZXIgUHl0aG9uIDIuCiAgICB6ZiA9IHppcGZpbGUuWmlwRmlsZShwYXRoLCAncicpCiAgICB0cnk6CiAgICAgICAgeWllbGQgemYKICAgIGZpbmFsbHk6CiAgICAgICAgemYuY2xvc2UoKQoKCmRlZiB0ZXN0X3ZlcmlmeWluZ196aXBmaWxlKCk6CiAgICBpZiBub3QgaGFzYXR0cih6aXBmaWxlLlppcEV4dEZpbGUsICdfdXBkYXRlX2NyYycpOgogICAgICAgIHB5dGVzdC5za2lwKCdObyBaSVAgdmVyaWZpY2F0aW9uLiBNaXNzaW5nIFppcEV4dEZpbGUuX3VwZGF0ZV9jcmMuJykKICAgIAogICAgc2lvID0gU3RyaW5nSU8oKQogICAgemYgPSB6aXBmaWxlLlppcEZpbGUoc2lvLCAndycpCiAgICB6Zi53cml0ZXN0cigib25lIiwgYiJmaXJzdCBmaWxlIikKICAgIHpmLndyaXRlc3RyKCJ0d28iLCBiInNlY29uZCBmaWxlIikKICAgIHpmLndyaXRlc3RyKCJ0aHJlZSIsIGIidGhpcmQgZmlsZSIpCiAgICB6Zi5jbG9zZSgpCiAgICAKICAgICMgSW4gZGVmYXVsdCBtb2RlLCBWZXJpZnlpbmdaaXBGaWxlIGNoZWNrcyB0aGUgaGFzaCBvZiBhbnkgcmVhZCBmaWxlCiAgICAjIG1lbnRpb25lZCB3aXRoIHNldF9leHBlY3RlZF9oYXNoKCkuIEZpbGVzIG5vdCBtZW50aW9uZWQgd2l0aAogICAgIyBzZXRfZXhwZWN0ZWRfaGFzaCgpIGFyZSBub3QgY2hlY2tlZC4KICAgIHZ6ZiA9IHdoZWVsLmluc3RhbGwuVmVyaWZ5aW5nWmlwRmlsZShzaW8sICdyJykKICAgIHZ6Zi5zZXRfZXhwZWN0ZWRfaGFzaCgib25lIiwgaGFzaGxpYi5zaGEyNTYoYiJmaXJzdCBmaWxlIikuZGlnZXN0KCkpCiAgICB2emYuc2V0X2V4cGVjdGVkX2hhc2goInRocmVlIiwgImJsdXJibGUiKQogICAgdnpmLm9wZW4oIm9uZSIpLnJlYWQoKQogICAgdnpmLm9wZW4oInR3byIpLnJlYWQoKQogICAgdHJ5OgogICAgICAgIHZ6Zi5vcGVuKCJ0aHJlZSIpLnJlYWQoKQogICAgZXhjZXB0IHdoZWVsLmluc3RhbGwuQmFkV2hlZWxGaWxlOgogICAgICAgIHBhc3MKICAgIGVsc2U6CiAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJleHBlY3RlZCBleGNlcHRpb24gJ0JhZFdoZWVsRmlsZSgpJyIpCiAgICAKICAgICMgSW4gc3RyaWN0IG1vZGUsIFZlcmlmeWluZ1ppcEZpbGUgcmVxdWlyZXMgZXZlcnkgcmVhZCBmaWxlIHRvIGJlCiAgICAjIG1lbnRpb25lZCB3aXRoIHNldF9leHBlY3RlZF9oYXNoKCkuCiAgICB2emYuc3RyaWN0ID0gVHJ1ZQogICAgdHJ5OgogICAgICAgIHZ6Zi5vcGVuKCJ0d28iKS5yZWFkKCkKICAgIGV4Y2VwdCB3aGVlbC5pbnN0YWxsLkJhZFdoZWVsRmlsZToKICAgICAgICBwYXNzCiAgICBlbHNlOgogICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiZXhwZWN0ZWQgZXhjZXB0aW9uICdCYWRXaGVlbEZpbGUoKSciKQogICAgICAgIAogICAgdnpmLnNldF9leHBlY3RlZF9oYXNoKCJ0d28iLCBOb25lKQogICAgdnpmLm9wZW4oInR3byIpLnJlYWQoKQogICAgCmRlZiB0ZXN0X3BvcF96aXBmaWxlKCk6CiAgICBzaW8gPSBTdHJpbmdJTygpCiAgICB6ZiA9IHdoZWVsLmluc3RhbGwuVmVyaWZ5aW5nWmlwRmlsZShzaW8sICd3JykKICAgIHpmLndyaXRlc3RyKCJvbmUiLCBiImZpcnN0IGZpbGUiKQogICAgemYud3JpdGVzdHIoInR3byIsIGIic2Vjb25kIGZpbGUiKQogICAgemYuY2xvc2UoKQogICAgCiAgICB0cnk6CiAgICAgICAgemYucG9wKCkKICAgIGV4Y2VwdCBSdW50aW1lRXJyb3I6CiAgICAgICAgcGFzcyAjIGFscmVhZHkgY2xvc2VkCiAgICBlbHNlOgogICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiZXhwZWN0ZWQgUnVudGltZUVycm9yIikKICAgIAogICAgemYgPSB3aGVlbC5pbnN0YWxsLlZlcmlmeWluZ1ppcEZpbGUoc2lvLCAnYScpCiAgICB6Zi5wb3AoKQogICAgemYuY2xvc2UoKQogICAgCiAgICB6ZiA9IHdoZWVsLmluc3RhbGwuVmVyaWZ5aW5nWmlwRmlsZShzaW8sICdyJykKICAgIGFzc2VydCBsZW4oemYuaW5mb2xpc3QoKSkgPT0gMQoKZGVmIHRlc3RfemlwZmlsZV90aW1lc3RhbXAoKToKICAgICMgQW4gZW52aXJvbm1lbnQgdmFyaWFibGUgY2FuIGJlIHVzZWQgdG8gaW5mbHVlbmNlIHRoZSB0aW1lc3RhbXAgb24KICAgICMgVGFySW5mbyBvYmplY3RzIGluc2lkZSB0aGUgemlwLiAgU2VlIGlzc3VlICMxNDMuICBUZW1wb3JhcnlEaXJlY3RvcnkgaXMKICAgICMgbm90IGEgY29udGV4dCBtYW5hZ2VyIHVuZGVyIFB5dGhvbiAzLgogICAgd2l0aCB0ZW1wb3JhcnlfZGlyZWN0b3J5KCkgYXMgdGVtcGRpcjoKICAgICAgICBmb3IgZmlsZW5hbWUgaW4gKCdvbmUnLCAndHdvJywgJ3RocmVlJyk6CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4odGVtcGRpciwgZmlsZW5hbWUpCiAgICAgICAgICAgIHdpdGggY29kZWNzLm9wZW4ocGF0aCwgJ3cnLCBlbmNvZGluZz0ndXRmLTgnKSBhcyBmcDoKICAgICAgICAgICAgICAgIGZwLndyaXRlKGZpbGVuYW1lICsgJ1xuJykKICAgICAgICB6aXBfYmFzZV9uYW1lID0gb3MucGF0aC5qb2luKHRlbXBkaXIsICdkdW1teScpCiAgICAgICAgIyBUaGUgZWFybGllc3QgZGF0ZSByZXByZXNlbnRhYmxlIGluIFRhckluZm9zLCAxOTgwLTAxLTAxCiAgICAgICAgd2l0aCBlbnZpcm9uKCdTT1VSQ0VfREFURV9FUE9DSCcsICczMTU1NzYwNjAnKToKICAgICAgICAgICAgemlwX2ZpbGVuYW1lID0gd2hlZWwuYXJjaGl2ZS5tYWtlX3doZWVsZmlsZV9pbm5lcigKICAgICAgICAgICAgICAgIHppcF9iYXNlX25hbWUsIHRlbXBkaXIpCiAgICAgICAgd2l0aCByZWFkYWJsZV96aXBmaWxlKHppcF9maWxlbmFtZSkgYXMgemY6CiAgICAgICAgICAgIGZvciBpbmZvIGluIHpmLmluZm9saXN0KCk6CiAgICAgICAgICAgICAgICBhc3NlcnQgaW5mby5kYXRlX3RpbWVbOjNdID09ICgxOTgwLCAxLCAxKQoKZGVmIHRlc3RfemlwZmlsZV9hdHRyaWJ1dGVzKCk6CiAgICAjIFdpdGggdGhlIGNoYW5nZSBmcm9tIFppcEZpbGUud3JpdGUoKSB0byAud3JpdGVzdHIoKSwgd2UgbmVlZCB0byBtYW51YWxseQogICAgIyBzZXQgbWVtYmVyIGF0dHJpYnV0ZXMuCiAgICB3aXRoIHRlbXBvcmFyeV9kaXJlY3RvcnkoKSBhcyB0ZW1wZGlyOgogICAgICAgIGZpbGVzID0gKCgnZm9vJywgMG82NDQpLCAoJ2JhcicsIDBvNzU1KSkKICAgICAgICBmb3IgZmlsZW5hbWUsIG1vZGUgaW4gZmlsZXM6CiAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4odGVtcGRpciwgZmlsZW5hbWUpCiAgICAgICAgICAgIHdpdGggY29kZWNzLm9wZW4ocGF0aCwgJ3cnLCBlbmNvZGluZz0ndXRmLTgnKSBhcyBmcDoKICAgICAgICAgICAgICAgIGZwLndyaXRlKGZpbGVuYW1lICsgJ1xuJykKICAgICAgICAgICAgb3MuY2htb2QocGF0aCwgbW9kZSkKICAgICAgICB6aXBfYmFzZV9uYW1lID0gb3MucGF0aC5qb2luKHRlbXBkaXIsICdkdW1teScpCiAgICAgICAgemlwX2ZpbGVuYW1lID0gd2hlZWwuYXJjaGl2ZS5tYWtlX3doZWVsZmlsZV9pbm5lcigKICAgICAgICAgICAgemlwX2Jhc2VfbmFtZSwgdGVtcGRpcikKICAgICAgICB3aXRoIHJlYWRhYmxlX3ppcGZpbGUoemlwX2ZpbGVuYW1lKSBhcyB6ZjoKICAgICAgICAgICAgZm9yIGZpbGVuYW1lLCBtb2RlIGluIGZpbGVzOgogICAgICAgICAgICAgICAgaW5mbyA9IHpmLmdldGluZm8ob3MucGF0aC5qb2luKHRlbXBkaXIsIGZpbGVuYW1lKSkKICAgICAgICAgICAgICAgIGFzc2VydCBpbmZvLmV4dGVybmFsX2F0dHIgPT0gKG1vZGUgfCAwbzEwMDAwMCkgPDwgMTYKICAgICAgICAgICAgICAgIGFzc2VydCBpbmZvLmNvbXByZXNzX3R5cGUgPT0gemlwZmlsZS5aSVBfREVGTEFURUQKUEsDBBQAAAAAAAAAIQCjLQMXoTMAAKEzAAArAAAAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdG9vbC9fX2luaXRfXy5weSIiIgpXaGVlbCBjb21tYW5kLWxpbmUgdXRpbGl0eS4KIiIiCgppbXBvcnQgb3MKaW1wb3J0IGhhc2hsaWIKaW1wb3J0IHN5cwppbXBvcnQganNvbgoKZnJvbSBnbG9iIGltcG9ydCBpZ2xvYgpmcm9tIC4uIGltcG9ydCBzaWduYXR1cmVzCmZyb20gLi51dGlsIGltcG9ydCAodXJsc2FmZV9iNjRkZWNvZGUsIHVybHNhZmVfYjY0ZW5jb2RlLCBuYXRpdmUsIGJpbmFyeSwKICAgICAgICAgICAgICAgICAgICBtYXRjaGVzX3JlcXVpcmVtZW50KQpmcm9tIC4uaW5zdGFsbCBpbXBvcnQgV2hlZWxGaWxlLCBWZXJpZnlpbmdaaXBGaWxlCmZyb20gLi5wYXRocyBpbXBvcnQgZ2V0X2luc3RhbGxfY29tbWFuZAoKZGVmIHJlcXVpcmVfcGtncmVzb3VyY2VzKG5hbWUpOgogICAgdHJ5OgogICAgICAgIGltcG9ydCBwa2dfcmVzb3VyY2VzCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCInezB9JyBuZWVkcyBwa2dfcmVzb3VyY2VzIChwYXJ0IG9mIHNldHVwdG9vbHMpLiIuZm9ybWF0KG5hbWUpKQoKaW1wb3J0IGFyZ3BhcnNlCgpjbGFzcyBXaGVlbEVycm9yKEV4Y2VwdGlvbik6IHBhc3MKCiMgRm9yIHRlc3RhYmlsaXR5CmRlZiBnZXRfa2V5cmluZygpOgogICAgdHJ5OgogICAgICAgIGZyb20gLi5zaWduYXR1cmVzIGltcG9ydCBrZXlzCiAgICAgICAgaW1wb3J0IGtleXJpbmcKICAgICAgICBhc3NlcnQga2V5cmluZy5nZXRfa2V5cmluZygpLnByaW9yaXR5CiAgICBleGNlcHQgKEltcG9ydEVycm9yLCBBc3NlcnRpb25FcnJvcik6CiAgICAgICAgcmFpc2UgV2hlZWxFcnJvcigiSW5zdGFsbCB3aGVlbFtzaWduYXR1cmVzXSAocmVxdWlyZXMga2V5cmluZywga2V5cmluZ3MuYWx0LCBweXhkZykgZm9yIHNpZ25hdHVyZXMuIikKICAgIHJldHVybiBrZXlzLldoZWVsS2V5cywga2V5cmluZwoKZGVmIGtleWdlbihnZXRfa2V5cmluZz1nZXRfa2V5cmluZyk6CiAgICAiIiJHZW5lcmF0ZSBhIHB1YmxpYy9wcml2YXRlIGtleSBwYWlyLiIiIgogICAgV2hlZWxLZXlzLCBrZXlyaW5nID0gZ2V0X2tleXJpbmcoKQoKICAgIGVkMjU1MTlsbCA9IHNpZ25hdHVyZXMuZ2V0X2VkMjU1MTlsbCgpCgogICAgd2sgPSBXaGVlbEtleXMoKS5sb2FkKCkKCiAgICBrZXlwYWlyID0gZWQyNTUxOWxsLmNyeXB0b19zaWduX2tleXBhaXIoKQogICAgdmsgPSBuYXRpdmUodXJsc2FmZV9iNjRlbmNvZGUoa2V5cGFpci52aykpCiAgICBzayA9IG5hdGl2ZSh1cmxzYWZlX2I2NGVuY29kZShrZXlwYWlyLnNrKSkKICAgIGtyID0ga2V5cmluZy5nZXRfa2V5cmluZygpCiAgICBrci5zZXRfcGFzc3dvcmQoIndoZWVsIiwgdmssIHNrKQogICAgc3lzLnN0ZG91dC53cml0ZSgiQ3JlYXRlZCBFZDI1NTE5IGtleXBhaXIgd2l0aCB2az17MH1cbiIuZm9ybWF0KHZrKSkKICAgIHN5cy5zdGRvdXQud3JpdGUoImluIHswIXJ9XG4iLmZvcm1hdChrcikpCgogICAgc2syID0ga3IuZ2V0X3Bhc3N3b3JkKCd3aGVlbCcsIHZrKQogICAgaWYgc2syICE9IHNrOgogICAgICAgIHJhaXNlIFdoZWVsRXJyb3IoIktleXJpbmcgaXMgYnJva2VuLiBDb3VsZCBub3QgcmV0cmlldmUgc2VjcmV0IGtleS4iKQoKICAgIHN5cy5zdGRvdXQud3JpdGUoIlRydXN0aW5nIHswfSB0byBzaWduIGFuZCB2ZXJpZnkgYWxsIHBhY2thZ2VzLlxuIi5mb3JtYXQodmspKQogICAgd2suYWRkX3NpZ25lcignKycsIHZrKQogICAgd2sudHJ1c3QoJysnLCB2aykKICAgIHdrLnNhdmUoKQoKZGVmIHNpZ24od2hlZWxmaWxlLCByZXBsYWNlPUZhbHNlLCBnZXRfa2V5cmluZz1nZXRfa2V5cmluZyk6CiAgICAiIiJTaWduIGEgd2hlZWwiIiIKICAgIFdoZWVsS2V5cywga2V5cmluZyA9IGdldF9rZXlyaW5nKCkKCiAgICBlZDI1NTE5bGwgPSBzaWduYXR1cmVzLmdldF9lZDI1NTE5bGwoKQoKICAgIHdmID0gV2hlZWxGaWxlKHdoZWVsZmlsZSwgYXBwZW5kPVRydWUpCiAgICB3ayA9IFdoZWVsS2V5cygpLmxvYWQoKQoKICAgIG5hbWUgPSB3Zi5wYXJzZWRfZmlsZW5hbWUuZ3JvdXAoJ25hbWUnKQogICAgc2lnbl93aXRoID0gd2suc2lnbmVycyhuYW1lKVswXQogICAgc3lzLnN0ZG91dC53cml0ZSgiU2lnbmluZyB7MH0gd2l0aCB7MX1cbiIuZm9ybWF0KG5hbWUsIHNpZ25fd2l0aFsxXSkpCgogICAgdmsgPSBzaWduX3dpdGhbMV0KICAgIGtyID0ga2V5cmluZy5nZXRfa2V5cmluZygpCiAgICBzayA9IGtyLmdldF9wYXNzd29yZCgnd2hlZWwnLCB2aykKICAgIGtleXBhaXIgPSBlZDI1NTE5bGwuS2V5cGFpcih1cmxzYWZlX2I2NGRlY29kZShiaW5hcnkodmspKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmxzYWZlX2I2NGRlY29kZShiaW5hcnkoc2spKSkKCgogICAgcmVjb3JkX25hbWUgPSB3Zi5kaXN0aW5mb19uYW1lICsgJy9SRUNPUkQnCiAgICBzaWdfbmFtZSA9IHdmLmRpc3RpbmZvX25hbWUgKyAnL1JFQ09SRC5qd3MnCiAgICBpZiBzaWdfbmFtZSBpbiB3Zi56aXBmaWxlLm5hbWVsaXN0KCk6CiAgICAgICAgcmFpc2UgV2hlZWxFcnJvcigiV2hlZWwgaXMgYWxyZWFkeSBzaWduZWQuIikKICAgIHJlY29yZF9kYXRhID0gd2YuemlwZmlsZS5yZWFkKHJlY29yZF9uYW1lKQogICAgcGF5bG9hZCA9IHsiaGFzaCI6InNoYTI1Nj0iICsgbmF0aXZlKHVybHNhZmVfYjY0ZW5jb2RlKGhhc2hsaWIuc2hhMjU2KHJlY29yZF9kYXRhKS5kaWdlc3QoKSkpfQogICAgc2lnID0gc2lnbmF0dXJlcy5zaWduKHBheWxvYWQsIGtleXBhaXIpCiAgICB3Zi56aXBmaWxlLndyaXRlc3RyKHNpZ19uYW1lLCBqc29uLmR1bXBzKHNpZywgc29ydF9rZXlzPVRydWUpKQogICAgd2YuemlwZmlsZS5jbG9zZSgpCgpkZWYgdW5zaWduKHdoZWVsZmlsZSk6CiAgICAiIiIKICAgIFJlbW92ZSBSRUNPUkQuandzIGZyb20gYSB3aGVlbCBieSB0cnVuY2F0aW5nIHRoZSB6aXAgZmlsZS4KCiAgICBSRUNPUkQuandzIG11c3QgYmUgYXQgdGhlIGVuZCBvZiB0aGUgYXJjaGl2ZS4gVGhlIHppcCBmaWxlIG11c3QgYmUgYW4KICAgIG9yZGluYXJ5IGFyY2hpdmUsIHdpdGggdGhlIGNvbXByZXNzZWQgZmlsZXMgYW5kIHRoZSBkaXJlY3RvcnkgaW4gdGhlIHNhbWUKICAgIG9yZGVyLCBhbmQgd2l0aG91dCBhbnkgbm9uLXppcCBjb250ZW50IGFmdGVyIHRoZSB0cnVuY2F0aW9uIHBvaW50LgogICAgIiIiCiAgICB2emYgPSBWZXJpZnlpbmdaaXBGaWxlKHdoZWVsZmlsZSwgImEiKQogICAgaW5mbyA9IHZ6Zi5pbmZvbGlzdCgpCiAgICBpZiBub3QgKGxlbihpbmZvKSBhbmQgaW5mb1stMV0uZmlsZW5hbWUuZW5kc3dpdGgoJy9SRUNPUkQuandzJykpOgogICAgICAgIHJhaXNlIFdoZWVsRXJyb3IoIlJFQ09SRC5qd3Mgbm90IGZvdW5kIGF0IGVuZCBvZiBhcmNoaXZlLiIpCiAgICB2emYucG9wKCkKICAgIHZ6Zi5jbG9zZSgpCgpkZWYgdmVyaWZ5KHdoZWVsZmlsZSk6CiAgICAiIiJWZXJpZnkgYSB3aGVlbC4KCiAgICBUaGUgc2lnbmF0dXJlIHdpbGwgYmUgdmVyaWZpZWQgZm9yIGludGVybmFsIGNvbnNpc3RlbmN5IE9OTFkgYW5kIHByaW50ZWQuCiAgICBXaGVlbCdzIG93biB1bnBhY2svaW5zdGFsbCBjb21tYW5kcyB2ZXJpZnkgdGhlIG1hbmlmZXN0IGFnYWluc3QgdGhlCiAgICBzaWduYXR1cmUgYW5kIGZpbGUgY29udGVudHMuCiAgICAiIiIKICAgIHdmID0gV2hlZWxGaWxlKHdoZWVsZmlsZSkKICAgIHNpZ19uYW1lID0gd2YuZGlzdGluZm9fbmFtZSArICcvUkVDT1JELmp3cycKICAgIHNpZyA9IGpzb24ubG9hZHMobmF0aXZlKHdmLnppcGZpbGUub3BlbihzaWdfbmFtZSkucmVhZCgpKSkKICAgIHZlcmlmaWVkID0gc2lnbmF0dXJlcy52ZXJpZnkoc2lnKQogICAgc3lzLnN0ZGVyci53cml0ZSgiU2lnbmF0dXJlcyBhcmUgaW50ZXJuYWxseSBjb25zaXN0ZW50LlxuIikKICAgIHN5cy5zdGRvdXQud3JpdGUoanNvbi5kdW1wcyh2ZXJpZmllZCwgaW5kZW50PTIpKQogICAgc3lzLnN0ZG91dC53cml0ZSgnXG4nKQoKZGVmIHVucGFjayh3aGVlbGZpbGUsIGRlc3Q9Jy4nKToKICAgICIiIlVucGFjayBhIHdoZWVsLgoKICAgIFdoZWVsIGNvbnRlbnQgd2lsbCBiZSB1bnBhY2tlZCB0byB7ZGVzdH0ve25hbWV9LXt2ZXJ9LCB3aGVyZSB7bmFtZX0KICAgIGlzIHRoZSBwYWNrYWdlIG5hbWUgYW5kIHt2ZXJ9IGl0cyB2ZXJzaW9uLgoKICAgIDpwYXJhbSB3aGVlbGZpbGU6IFRoZSBwYXRoIHRvIHRoZSB3aGVlbC4KICAgIDpwYXJhbSBkZXN0OiBEZXN0aW5hdGlvbiBkaXJlY3RvcnkgKGRlZmF1bHQgdG8gY3VycmVudCBkaXJlY3RvcnkpLgogICAgIiIiCiAgICB3ZiA9IFdoZWVsRmlsZSh3aGVlbGZpbGUpCiAgICBuYW1ldmVyID0gd2YucGFyc2VkX2ZpbGVuYW1lLmdyb3VwKCduYW1ldmVyJykKICAgIGRlc3RpbmF0aW9uID0gb3MucGF0aC5qb2luKGRlc3QsIG5hbWV2ZXIpCiAgICBzeXMuc3RkZXJyLndyaXRlKCJVbnBhY2tpbmcgdG86ICVzXG4iICUgKGRlc3RpbmF0aW9uKSkKICAgIHdmLnppcGZpbGUuZXh0cmFjdGFsbChkZXN0aW5hdGlvbikKICAgIHdmLnppcGZpbGUuY2xvc2UoKQoKZGVmIGluc3RhbGwocmVxdWlyZW1lbnRzLCByZXF1aXJlbWVudHNfZmlsZT1Ob25lLAogICAgICAgICAgICB3aGVlbF9kaXJzPU5vbmUsIGZvcmNlPUZhbHNlLCBsaXN0X2ZpbGVzPUZhbHNlLAogICAgICAgICAgICBkcnlfcnVuPUZhbHNlKToKICAgICIiIkluc3RhbGwgd2hlZWxzLgoKICAgIDpwYXJhbSByZXF1aXJlbWVudHM6IEEgbGlzdCBvZiByZXF1aXJlbWVudHMgb3Igd2hlZWwgZmlsZXMgdG8gaW5zdGFsbC4KICAgIDpwYXJhbSByZXF1aXJlbWVudHNfZmlsZTogQSBmaWxlIGNvbnRhaW5pbmcgcmVxdWlyZW1lbnRzIHRvIGluc3RhbGwuCiAgICA6cGFyYW0gd2hlZWxfZGlyczogQSBsaXN0IG9mIGRpcmVjdG9yaWVzIHRvIHNlYXJjaCBmb3Igd2hlZWxzLgogICAgOnBhcmFtIGZvcmNlOiBJbnN0YWxsIGEgd2hlZWwgZmlsZSBldmVuIGlmIGl0IGlzIG5vdCBjb21wYXRpYmxlLgogICAgOnBhcmFtIGxpc3RfZmlsZXM6IE9ubHkgbGlzdCB0aGUgZmlsZXMgdG8gaW5zdGFsbCwgZG9uJ3QgaW5zdGFsbCB0aGVtLgogICAgOnBhcmFtIGRyeV9ydW46IERvIGV2ZXJ5dGhpbmcgYnV0IHRoZSBhY3R1YWwgaW5zdGFsbC4KICAgICIiIgoKICAgICMgSWYgbm8gd2hlZWwgZGlyZWN0b3JpZXMgc3BlY2lmaWVkLCB1c2UgdGhlIFdIRUVMUEFUSCBlbnZpcm9ubWVudAogICAgIyB2YXJpYWJsZSwgb3IgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlmIHRoYXQgaXMgbm90IHNldC4KICAgIGlmIG5vdCB3aGVlbF9kaXJzOgogICAgICAgIHdoZWVscGF0aCA9IG9zLmdldGVudigiV0hFRUxQQVRIIikKICAgICAgICBpZiB3aGVlbHBhdGg6CiAgICAgICAgICAgIHdoZWVsX2RpcnMgPSB3aGVlbHBhdGguc3BsaXQob3MucGF0aHNlcCkKICAgICAgICBlbHNlOgogICAgICAgICAgICB3aGVlbF9kaXJzID0gWyBvcy5wYXRoLmN1cmRpciBdCgogICAgIyBHZXQgYSBsaXN0IG9mIGFsbCB2YWxpZCB3aGVlbHMgaW4gd2hlZWxfZGlycwogICAgYWxsX3doZWVscyA9IFtdCiAgICBmb3IgZCBpbiB3aGVlbF9kaXJzOgogICAgICAgIGZvciB3IGluIG9zLmxpc3RkaXIoZCk6CiAgICAgICAgICAgIGlmIHcuZW5kc3dpdGgoJy53aGwnKToKICAgICAgICAgICAgICAgIHdmID0gV2hlZWxGaWxlKG9zLnBhdGguam9pbihkLCB3KSkKICAgICAgICAgICAgICAgIGlmIHdmLmNvbXBhdGlibGU6CiAgICAgICAgICAgICAgICAgICAgYWxsX3doZWVscy5hcHBlbmQod2YpCgogICAgIyBJZiB0aGVyZSBpcyBhIHJlcXVpcmVtZW50cyBmaWxlLCBhZGQgaXQgdG8gdGhlIGxpc3Qgb2YgcmVxdWlyZW1lbnRzCiAgICBpZiByZXF1aXJlbWVudHNfZmlsZToKICAgICAgICAjIElmIHRoZSBmaWxlIGRvZXNuJ3QgZXhpc3QsIHNlYXJjaCBmb3IgaXQgaW4gd2hlZWxfZGlycwogICAgICAgICMgVGhpcyBhbGxvd3Mgc3RhbmRhcmQgcmVxdWlyZW1lbnRzIGZpbGVzIHRvIGJlIHN0b3JlZCB3aXRoIHRoZQogICAgICAgICMgd2hlZWxzLgogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhyZXF1aXJlbWVudHNfZmlsZSk6CiAgICAgICAgICAgIGZvciBkIGluIHdoZWVsX2RpcnM6CiAgICAgICAgICAgICAgICBuYW1lID0gb3MucGF0aC5qb2luKGQsIHJlcXVpcmVtZW50c19maWxlKQogICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMobmFtZSk6CiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnRzX2ZpbGUgPSBuYW1lCiAgICAgICAgICAgICAgICAgICAgYnJlYWsKCiAgICAgICAgd2l0aCBvcGVuKHJlcXVpcmVtZW50c19maWxlKSBhcyBmZDoKICAgICAgICAgICAgcmVxdWlyZW1lbnRzLmV4dGVuZChmZCkKCiAgICB0b19pbnN0YWxsID0gW10KICAgIGZvciByZXEgaW4gcmVxdWlyZW1lbnRzOgogICAgICAgIGlmIHJlcS5lbmRzd2l0aCgnLndobCcpOgogICAgICAgICAgICAjIEV4cGxpY2l0bHkgc3BlY2lmaWVkIHdoZWVsIGZpbGVuYW1lCiAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHJlcSk6CiAgICAgICAgICAgICAgICB3ZiA9IFdoZWVsRmlsZShyZXEpCiAgICAgICAgICAgICAgICBpZiB3Zi5jb21wYXRpYmxlIG9yIGZvcmNlOgogICAgICAgICAgICAgICAgICAgIHRvX2luc3RhbGwuYXBwZW5kKHdmKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBtc2cgPSAoInswfSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoaXMgUHl0aG9uLiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICItLWZvcmNlIHRvIGluc3RhbGwgYW55d2F5LiIuZm9ybWF0KHJlcSkpCiAgICAgICAgICAgICAgICAgICAgcmFpc2UgV2hlZWxFcnJvcihtc2cpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAjIFdlIGNvdWxkIHNlYXJjaCBvbiB3aGVlbF9kaXJzLCBidXQgaXQncyBwcm9iYWJseSBPSyB0bwogICAgICAgICAgICAgICAgIyBhc3N1bWUgdGhlIHVzZXIgaGFzIG1hZGUgYW4gZXJyb3IuCiAgICAgICAgICAgICAgICByYWlzZSBXaGVlbEVycm9yKCJObyBzdWNoIHdoZWVsIGZpbGU6IHt9Ii5mb3JtYXQocmVxKSkKICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgIyBXZSBoYXZlIGEgcmVxdWlyZW1lbnQgc3BlYwogICAgICAgICMgSWYgd2UgZG9uJ3QgaGF2ZSBwa2dfcmVzb3VyY2VzLCB0aGlzIHdpbGwgcmFpc2UgYW4gZXhjZXB0aW9uCiAgICAgICAgbWF0Y2hlcyA9IG1hdGNoZXNfcmVxdWlyZW1lbnQocmVxLCBhbGxfd2hlZWxzKQogICAgICAgIGlmIG5vdCBtYXRjaGVzOgogICAgICAgICAgICByYWlzZSBXaGVlbEVycm9yKCJObyBtYXRjaCBmb3IgcmVxdWlyZW1lbnQge30iLmZvcm1hdChyZXEpKQogICAgICAgIHRvX2luc3RhbGwuYXBwZW5kKG1heChtYXRjaGVzKSkKCiAgICAjIFdlIG5vdyBoYXZlIGEgbGlzdCBvZiB3aGVlbHMgdG8gaW5zdGFsbAogICAgaWYgbGlzdF9maWxlczoKICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJJbnN0YWxsaW5nOlxuIikKCiAgICBpZiBkcnlfcnVuOgogICAgICAgIHJldHVybgoKICAgIGZvciB3ZiBpbiB0b19pbnN0YWxsOgogICAgICAgIGlmIGxpc3RfZmlsZXM6CiAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIiAgICB7MH1cbiIuZm9ybWF0KHdmLmZpbGVuYW1lKSkKICAgICAgICAgICAgY29udGludWUKICAgICAgICB3Zi5pbnN0YWxsKGZvcmNlPWZvcmNlKQogICAgICAgIHdmLnppcGZpbGUuY2xvc2UoKQoKZGVmIGluc3RhbGxfc2NyaXB0cyhkaXN0cmlidXRpb25zKToKICAgICIiIgogICAgUmVnZW5lcmF0ZSB0aGUgZW50cnlfcG9pbnRzIGNvbnNvbGVfc2NyaXB0cyBmb3IgdGhlIG5hbWVkIGRpc3RyaWJ1dGlvbi4KICAgICIiIgogICAgdHJ5OgogICAgICAgIGZyb20gc2V0dXB0b29scy5jb21tYW5kIGltcG9ydCBlYXN5X2luc3RhbGwKICAgICAgICBpbXBvcnQgcGtnX3Jlc291cmNlcwogICAgZXhjZXB0IEltcG9ydEVycm9yOgogICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiJ3doZWVsIGluc3RhbGxfc2NyaXB0cycgbmVlZHMgc2V0dXB0b29scy4iKQoKICAgIGZvciBkaXN0IGluIGRpc3RyaWJ1dGlvbnM6CiAgICAgICAgcGtnX3Jlc291cmNlc19kaXN0ID0gcGtnX3Jlc291cmNlcy5nZXRfZGlzdHJpYnV0aW9uKGRpc3QpCiAgICAgICAgaW5zdGFsbCA9IGdldF9pbnN0YWxsX2NvbW1hbmQoZGlzdCkKICAgICAgICBjb21tYW5kID0gZWFzeV9pbnN0YWxsLmVhc3lfaW5zdGFsbChpbnN0YWxsLmRpc3RyaWJ1dGlvbikKICAgICAgICBjb21tYW5kLmFyZ3MgPSBbJ3doZWVsJ10gIyBkdW1teSBhcmd1bWVudAogICAgICAgIGNvbW1hbmQuZmluYWxpemVfb3B0aW9ucygpCiAgICAgICAgY29tbWFuZC5pbnN0YWxsX2VnZ19zY3JpcHRzKHBrZ19yZXNvdXJjZXNfZGlzdCkKCmRlZiBjb252ZXJ0KGluc3RhbGxlcnMsIGRlc3RfZGlyLCB2ZXJib3NlKToKICAgIHJlcXVpcmVfcGtncmVzb3VyY2VzKCd3aGVlbCBjb252ZXJ0JykKCiAgICAjIE9ubHkgc3VwcG9ydCB3aGVlbCBjb252ZXJ0IGlmIHBrZ19yZXNvdXJjZXMgaXMgcHJlc2VudAogICAgZnJvbSAuLndpbmluc3Qyd2hlZWwgaW1wb3J0IGJkaXN0X3dpbmluc3Qyd2hlZWwKICAgIGZyb20gLi5lZ2cyd2hlZWwgaW1wb3J0IGVnZzJ3aGVlbAoKICAgIGZvciBwYXQgaW4gaW5zdGFsbGVyczoKICAgICAgICBmb3IgaW5zdGFsbGVyIGluIGlnbG9iKHBhdCk6CiAgICAgICAgICAgIGlmIG9zLnBhdGguc3BsaXRleHQoaW5zdGFsbGVyKVsxXSA9PSAnLmVnZyc6CiAgICAgICAgICAgICAgICBjb252ID0gZWdnMndoZWVsCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBjb252ID0gYmRpc3Rfd2luaW5zdDJ3aGVlbAogICAgICAgICAgICBpZiB2ZXJib3NlOgogICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiezB9Li4uICIuZm9ybWF0KGluc3RhbGxlcikpCiAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKICAgICAgICAgICAgY29udihpbnN0YWxsZXIsIGRlc3RfZGlyKQogICAgICAgICAgICBpZiB2ZXJib3NlOgogICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiT0tcbiIpCgpkZWYgcGFyc2VyKCk6CiAgICBwID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQogICAgcyA9IHAuYWRkX3N1YnBhcnNlcnMoaGVscD0iY29tbWFuZHMiKQoKICAgIGRlZiBrZXlnZW5fZihhcmdzKToKICAgICAgICBrZXlnZW4oKQogICAga2V5Z2VuX3BhcnNlciA9IHMuYWRkX3BhcnNlcigna2V5Z2VuJywgaGVscD0nR2VuZXJhdGUgc2lnbmluZyBrZXknKQogICAga2V5Z2VuX3BhcnNlci5zZXRfZGVmYXVsdHMoZnVuYz1rZXlnZW5fZikKCiAgICBkZWYgc2lnbl9mKGFyZ3MpOgogICAgICAgIHNpZ24oYXJncy53aGVlbGZpbGUpCiAgICBzaWduX3BhcnNlciA9IHMuYWRkX3BhcnNlcignc2lnbicsIGhlbHA9J1NpZ24gd2hlZWwnKQogICAgc2lnbl9wYXJzZXIuYWRkX2FyZ3VtZW50KCd3aGVlbGZpbGUnLCBoZWxwPSdXaGVlbCBmaWxlJykKICAgIHNpZ25fcGFyc2VyLnNldF9kZWZhdWx0cyhmdW5jPXNpZ25fZikKCiAgICBkZWYgdW5zaWduX2YoYXJncyk6CiAgICAgICAgdW5zaWduKGFyZ3Mud2hlZWxmaWxlKQogICAgdW5zaWduX3BhcnNlciA9IHMuYWRkX3BhcnNlcigndW5zaWduJywgaGVscD11bnNpZ24uX19kb2NfXykKICAgIHVuc2lnbl9wYXJzZXIuYWRkX2FyZ3VtZW50KCd3aGVlbGZpbGUnLCBoZWxwPSdXaGVlbCBmaWxlJykKICAgIHVuc2lnbl9wYXJzZXIuc2V0X2RlZmF1bHRzKGZ1bmM9dW5zaWduX2YpCgogICAgZGVmIHZlcmlmeV9mKGFyZ3MpOgogICAgICAgIHZlcmlmeShhcmdzLndoZWVsZmlsZSkKICAgIHZlcmlmeV9wYXJzZXIgPSBzLmFkZF9wYXJzZXIoJ3ZlcmlmeScsIGhlbHA9dmVyaWZ5Ll9fZG9jX18pCiAgICB2ZXJpZnlfcGFyc2VyLmFkZF9hcmd1bWVudCgnd2hlZWxmaWxlJywgaGVscD0nV2hlZWwgZmlsZScpCiAgICB2ZXJpZnlfcGFyc2VyLnNldF9kZWZhdWx0cyhmdW5jPXZlcmlmeV9mKQoKICAgIGRlZiB1bnBhY2tfZihhcmdzKToKICAgICAgICB1bnBhY2soYXJncy53aGVlbGZpbGUsIGFyZ3MuZGVzdCkKICAgIHVucGFja19wYXJzZXIgPSBzLmFkZF9wYXJzZXIoJ3VucGFjaycsIGhlbHA9J1VucGFjayB3aGVlbCcpCiAgICB1bnBhY2tfcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1kZXN0JywgJy1kJywgaGVscD0nRGVzdGluYXRpb24gZGlyZWN0b3J5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9Jy4nKQogICAgdW5wYWNrX3BhcnNlci5hZGRfYXJndW1lbnQoJ3doZWVsZmlsZScsIGhlbHA9J1doZWVsIGZpbGUnKQogICAgdW5wYWNrX3BhcnNlci5zZXRfZGVmYXVsdHMoZnVuYz11bnBhY2tfZikKCiAgICBkZWYgaW5zdGFsbF9mKGFyZ3MpOgogICAgICAgIGluc3RhbGwoYXJncy5yZXF1aXJlbWVudHMsIGFyZ3MucmVxdWlyZW1lbnRzX2ZpbGUsCiAgICAgICAgICAgICAgICBhcmdzLndoZWVsX2RpcnMsIGFyZ3MuZm9yY2UsIGFyZ3MubGlzdF9maWxlcykKICAgIGluc3RhbGxfcGFyc2VyID0gcy5hZGRfcGFyc2VyKCdpbnN0YWxsJywgaGVscD0nSW5zdGFsbCB3aGVlbHMnKQogICAgaW5zdGFsbF9wYXJzZXIuYWRkX2FyZ3VtZW50KCdyZXF1aXJlbWVudHMnLCBuYXJncz0nKicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nUmVxdWlyZW1lbnRzIHRvIGluc3RhbGwuJykKICAgIGluc3RhbGxfcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1mb3JjZScsIGRlZmF1bHQ9RmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdJbnN0YWxsIGluY29tcGF0aWJsZSB3aGVlbCBmaWxlcy4nKQogICAgaW5zdGFsbF9wYXJzZXIuYWRkX2FyZ3VtZW50KCctLXdoZWVsLWRpcicsICctZCcsIGFjdGlvbj0nYXBwZW5kJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0PSd3aGVlbF9kaXJzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdEaXJlY3RvcmllcyBjb250YWluaW5nIHdoZWVscy4nKQogICAgaW5zdGFsbF9wYXJzZXIuYWRkX2FyZ3VtZW50KCctLXJlcXVpcmVtZW50cy1maWxlJywgJy1yJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJBIGZpbGUgY29udGFpbmluZyByZXF1aXJlbWVudHMgdG8gIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnN0YWxsLiIpCiAgICBpbnN0YWxsX3BhcnNlci5hZGRfYXJndW1lbnQoJy0tbGlzdCcsICctbCcsIGRlZmF1bHQ9RmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdD0nbGlzdF9maWxlcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJMaXN0IHdoZWVscyB3aGljaCB3b3VsZCBiZSBpbnN0YWxsZWQsICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnV0IGRvbid0IGFjdHVhbGx5IGluc3RhbGwgYW55dGhpbmcuIikKICAgIGluc3RhbGxfcGFyc2VyLnNldF9kZWZhdWx0cyhmdW5jPWluc3RhbGxfZikKCiAgICBkZWYgaW5zdGFsbF9zY3JpcHRzX2YoYXJncyk6CiAgICAgICAgaW5zdGFsbF9zY3JpcHRzKGFyZ3MuZGlzdHJpYnV0aW9ucykKICAgIGluc3RhbGxfc2NyaXB0c19wYXJzZXIgPSBzLmFkZF9wYXJzZXIoJ2luc3RhbGwtc2NyaXB0cycsIGhlbHA9J0luc3RhbGwgY29uc29sZV9zY3JpcHRzJykKICAgIGluc3RhbGxfc2NyaXB0c19wYXJzZXIuYWRkX2FyZ3VtZW50KCdkaXN0cmlidXRpb25zJywgbmFyZ3M9JyonLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nUmVnZW5lcmF0ZSBjb25zb2xlX3NjcmlwdHMgZm9yIHRoZXNlIGRpc3RyaWJ1dGlvbnMnKQogICAgaW5zdGFsbF9zY3JpcHRzX3BhcnNlci5zZXRfZGVmYXVsdHMoZnVuYz1pbnN0YWxsX3NjcmlwdHNfZikKCiAgICBkZWYgY29udmVydF9mKGFyZ3MpOgogICAgICAgIGNvbnZlcnQoYXJncy5pbnN0YWxsZXJzLCBhcmdzLmRlc3RfZGlyLCBhcmdzLnZlcmJvc2UpCiAgICBjb252ZXJ0X3BhcnNlciA9IHMuYWRkX3BhcnNlcignY29udmVydCcsIGhlbHA9J0NvbnZlcnQgZWdnIG9yIHdpbmluc3QgdG8gd2hlZWwnKQogICAgY29udmVydF9wYXJzZXIuYWRkX2FyZ3VtZW50KCdpbnN0YWxsZXJzJywgbmFyZ3M9JyonLCBoZWxwPSdJbnN0YWxsZXJzIHRvIGNvbnZlcnQnKQogICAgY29udmVydF9wYXJzZXIuYWRkX2FyZ3VtZW50KCctLWRlc3QtZGlyJywgJy1kJywgZGVmYXVsdD1vcy5wYXRoLmN1cmRpciwKICAgICAgICAgICAgaGVscD0iRGlyZWN0b3J5IHRvIHN0b3JlIHdoZWVscyAoZGVmYXVsdCAlKGRlZmF1bHQpcykiKQogICAgY29udmVydF9wYXJzZXIuYWRkX2FyZ3VtZW50KCctLXZlcmJvc2UnLCAnLXYnLCBhY3Rpb249J3N0b3JlX3RydWUnKQogICAgY29udmVydF9wYXJzZXIuc2V0X2RlZmF1bHRzKGZ1bmM9Y29udmVydF9mKQoKICAgIGRlZiB2ZXJzaW9uX2YoYXJncyk6CiAgICAgICAgZnJvbSAuLiBpbXBvcnQgX192ZXJzaW9uX18KICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJ3aGVlbCAlc1xuIiAlIF9fdmVyc2lvbl9fKQogICAgdmVyc2lvbl9wYXJzZXIgPSBzLmFkZF9wYXJzZXIoJ3ZlcnNpb24nLCBoZWxwPSdQcmludCB2ZXJzaW9uIGFuZCBleGl0JykKICAgIHZlcnNpb25fcGFyc2VyLnNldF9kZWZhdWx0cyhmdW5jPXZlcnNpb25fZikKCiAgICBkZWYgaGVscF9mKGFyZ3MpOgogICAgICAgIHAucHJpbnRfaGVscCgpCiAgICBoZWxwX3BhcnNlciA9IHMuYWRkX3BhcnNlcignaGVscCcsIGhlbHA9J1Nob3cgdGhpcyBoZWxwJykKICAgIGhlbHBfcGFyc2VyLnNldF9kZWZhdWx0cyhmdW5jPWhlbHBfZikKCiAgICByZXR1cm4gcAoKZGVmIG1haW4oKToKICAgIHAgPSBwYXJzZXIoKQogICAgYXJncyA9IHAucGFyc2VfYXJncygpCiAgICBpZiBub3QgaGFzYXR0cihhcmdzLCAnZnVuYycpOgogICAgICAgIHAucHJpbnRfaGVscCgpCiAgICBlbHNlOgogICAgICAgICMgWFhYIG9uIFB5dGhvbiAzLjMgd2UgZ2V0ICdhcmdzIGhhcyBubyBmdW5jJyByYXRoZXIgdGhhbiBzaG9ydCBoZWxwLgogICAgICAgIHRyeToKICAgICAgICAgICAgYXJncy5mdW5jKGFyZ3MpCiAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgZXhjZXB0IFdoZWVsRXJyb3IgYXMgZToKICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZShlLm1lc3NhZ2UgKyAiXG4iKQogICAgcmV0dXJuIDEKUEsDBBQAAAAAAAAAIQDP2DOyGhMAABoTAAAiAAAAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdXRpbC5weSIiIlV0aWxpdHkgZnVuY3Rpb25zLiIiIgoKaW1wb3J0IHN5cwppbXBvcnQgb3MKaW1wb3J0IGJhc2U2NAppbXBvcnQganNvbgppbXBvcnQgaGFzaGxpYgp0cnk6CiAgICBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBPcmRlcmVkRGljdApleGNlcHQgSW1wb3J0RXJyb3I6CiAgICBPcmRlcmVkRGljdCA9IGRpY3QKCl9fYWxsX18gPSBbJ3VybHNhZmVfYjY0ZW5jb2RlJywgJ3VybHNhZmVfYjY0ZGVjb2RlJywgJ3V0ZjgnLAogICAgICAgICAgICd0b19qc29uJywgJ2Zyb21fanNvbicsICdtYXRjaGVzX3JlcXVpcmVtZW50J10KCmRlZiB1cmxzYWZlX2I2NGVuY29kZShkYXRhKToKICAgICIiInVybHNhZmVfYjY0ZW5jb2RlIHdpdGhvdXQgcGFkZGluZyIiIgogICAgcmV0dXJuIGJhc2U2NC51cmxzYWZlX2I2NGVuY29kZShkYXRhKS5yc3RyaXAoYmluYXJ5KCc9JykpCgoKZGVmIHVybHNhZmVfYjY0ZGVjb2RlKGRhdGEpOgogICAgIiIidXJsc2FmZV9iNjRkZWNvZGUgd2l0aG91dCBwYWRkaW5nIiIiCiAgICBwYWQgPSBiJz0nICogKDQgLSAobGVuKGRhdGEpICYgMykpCiAgICByZXR1cm4gYmFzZTY0LnVybHNhZmVfYjY0ZGVjb2RlKGRhdGEgKyBwYWQpCgoKZGVmIHRvX2pzb24obyk6CiAgICAnJydDb252ZXJ0IGdpdmVuIGRhdGEgdG8gSlNPTi4nJycKICAgIHJldHVybiBqc29uLmR1bXBzKG8sIHNvcnRfa2V5cz1UcnVlKQoKCmRlZiBmcm9tX2pzb24oaik6CiAgICAnJydEZWNvZGUgYSBKU09OIHBheWxvYWQuJycnCiAgICByZXR1cm4ganNvbi5sb2FkcyhqKQoKZGVmIG9wZW5fZm9yX2NzdihuYW1lLCBtb2RlKToKICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzOgogICAgICAgIG5sID0ge30KICAgICAgICBiaW4gPSAnYicKICAgIGVsc2U6CiAgICAgICAgbmwgPSB7ICduZXdsaW5lJzogJycgfQogICAgICAgIGJpbiA9ICcnCiAgICByZXR1cm4gb3BlbihuYW1lLCBtb2RlICsgYmluLCAqKm5sKQoKdHJ5OgogICAgdW5pY29kZQoKICAgIGRlZiB1dGY4KGRhdGEpOgogICAgICAgICcnJ1V0Zi04IGVuY29kZSBkYXRhLicnJwogICAgICAgIGlmIGlzaW5zdGFuY2UoZGF0YSwgdW5pY29kZSk6CiAgICAgICAgICAgIHJldHVybiBkYXRhLmVuY29kZSgndXRmLTgnKQogICAgICAgIHJldHVybiBkYXRhCmV4Y2VwdCBOYW1lRXJyb3I6CiAgICBkZWYgdXRmOChkYXRhKToKICAgICAgICAnJydVdGYtOCBlbmNvZGUgZGF0YS4nJycKICAgICAgICBpZiBpc2luc3RhbmNlKGRhdGEsIHN0cik6CiAgICAgICAgICAgIHJldHVybiBkYXRhLmVuY29kZSgndXRmLTgnKQogICAgICAgIHJldHVybiBkYXRhCgoKdHJ5OgogICAgIyBGb3IgZW5jb2RpbmcgYXNjaWkgYmFjayBhbmQgZm9ydGggYmV0d2VlbiBieXRlc3RyaW5ncywgYXMgaXMgcmVwZWF0ZWRseQogICAgIyBuZWNlc3NhcnkgaW4gSlNPTi1iYXNlZCBjcnlwdG8gdW5kZXIgUHl0aG9uIDMKICAgIHVuaWNvZGUKICAgIGRlZiBuYXRpdmUocyk6CiAgICAgICAgcmV0dXJuIHMKICAgIGRlZiBiaW5hcnkocyk6CiAgICAgICAgaWYgaXNpbnN0YW5jZShzLCB1bmljb2RlKToKICAgICAgICAgICAgcmV0dXJuIHMuZW5jb2RlKCdhc2NpaScpCiAgICAgICAgcmV0dXJuIHMKZXhjZXB0IE5hbWVFcnJvcjoKICAgIGRlZiBuYXRpdmUocyk6CiAgICAgICAgaWYgaXNpbnN0YW5jZShzLCBieXRlcyk6CiAgICAgICAgICAgIHJldHVybiBzLmRlY29kZSgnYXNjaWknKQogICAgICAgIHJldHVybiBzCiAgICBkZWYgYmluYXJ5KHMpOgogICAgICAgIGlmIGlzaW5zdGFuY2Uocywgc3RyKToKICAgICAgICAgICAgcmV0dXJuIHMuZW5jb2RlKCdhc2NpaScpCgpjbGFzcyBIYXNoaW5nRmlsZShvYmplY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGZkLCBoYXNodHlwZT0nc2hhMjU2Jyk6CiAgICAgICAgc2VsZi5mZCA9IGZkCiAgICAgICAgc2VsZi5oYXNodHlwZSA9IGhhc2h0eXBlCiAgICAgICAgc2VsZi5oYXNoID0gaGFzaGxpYi5uZXcoaGFzaHR5cGUpCiAgICAgICAgc2VsZi5sZW5ndGggPSAwCiAgICBkZWYgd3JpdGUoc2VsZiwgZGF0YSk6CiAgICAgICAgc2VsZi5oYXNoLnVwZGF0ZShkYXRhKQogICAgICAgIHNlbGYubGVuZ3RoICs9IGxlbihkYXRhKQogICAgICAgIHNlbGYuZmQud3JpdGUoZGF0YSkKICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICBzZWxmLmZkLmNsb3NlKCkKICAgIGRlZiBkaWdlc3Qoc2VsZik6CiAgICAgICAgaWYgc2VsZi5oYXNodHlwZSA9PSAnbWQ1JzoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuaGFzaC5oZXhkaWdlc3QoKQogICAgICAgIGRpZ2VzdCA9IHNlbGYuaGFzaC5kaWdlc3QoKQogICAgICAgIHJldHVybiBzZWxmLmhhc2h0eXBlICsgJz0nICsgbmF0aXZlKHVybHNhZmVfYjY0ZW5jb2RlKGRpZ2VzdCkpCgpjbGFzcyBPcmRlcmVkRGVmYXVsdERpY3QoT3JkZXJlZERpY3QpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgaWYgbm90IGFyZ3M6CiAgICAgICAgICAgIHNlbGYuZGVmYXVsdF9mYWN0b3J5ID0gTm9uZQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGlmIG5vdCAoYXJnc1swXSBpcyBOb25lIG9yIGNhbGxhYmxlKGFyZ3NbMF0pKToKICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBjYWxsYWJsZSBvciBOb25lJykKICAgICAgICAgICAgc2VsZi5kZWZhdWx0X2ZhY3RvcnkgPSBhcmdzWzBdCiAgICAgICAgICAgIGFyZ3MgPSBhcmdzWzE6XQogICAgICAgIHN1cGVyKE9yZGVyZWREZWZhdWx0RGljdCwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3dhcmdzKQoKICAgIGRlZiBfX21pc3NpbmdfXyAoc2VsZiwga2V5KToKICAgICAgICBpZiBzZWxmLmRlZmF1bHRfZmFjdG9yeSBpcyBOb25lOgogICAgICAgICAgICByYWlzZSBLZXlFcnJvcihrZXkpCiAgICAgICAgc2VsZltrZXldID0gZGVmYXVsdCA9IHNlbGYuZGVmYXVsdF9mYWN0b3J5KCkKICAgICAgICByZXR1cm4gZGVmYXVsdAoKaWYgc3lzLnBsYXRmb3JtID09ICd3aW4zMic6CiAgICBpbXBvcnQgY3R5cGVzLndpbnR5cGVzCiAgICAjIENTSURMX0FQUERBVEEgZm9yIHJlZmVyZW5jZSAtIG5vdCB1c2VkIGhlcmUgZm9yIGNvbXBhdGliaWxpdHkgd2l0aAogICAgIyBkaXJzcGVjLCB3aGljaCB1c2VzIExPQ0FMX0FQUERBVEEgYW5kIENPTU1PTl9BUFBEQVRBIGluIHRoYXQgb3JkZXIKICAgIGNzaWRsID0gZGljdChDU0lETF9BUFBEQVRBPTI2LCBDU0lETF9MT0NBTF9BUFBEQVRBPTI4LAogICAgICAgICAgICBDU0lETF9DT01NT05fQVBQREFUQT0zNSkKICAgIGRlZiBnZXRfcGF0aChuYW1lKToKICAgICAgICBTSEdGUF9UWVBFX0NVUlJFTlQgPSAwCiAgICAgICAgYnVmID0gY3R5cGVzLmNyZWF0ZV91bmljb2RlX2J1ZmZlcihjdHlwZXMud2ludHlwZXMuTUFYX1BBVEgpCiAgICAgICAgY3R5cGVzLndpbmRsbC5zaGVsbDMyLlNIR2V0Rm9sZGVyUGF0aFcoMCwgY3NpZGxbbmFtZV0sIDAsIFNIR0ZQX1RZUEVfQ1VSUkVOVCwgYnVmKQogICAgICAgIHJldHVybiBidWYudmFsdWUKCiAgICBkZWYgc2F2ZV9jb25maWdfcGF0aCgqcmVzb3VyY2UpOgogICAgICAgIGFwcGRhdGEgPSBnZXRfcGF0aCgiQ1NJRExfTE9DQUxfQVBQREFUQSIpCiAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihhcHBkYXRhLCAqcmVzb3VyY2UpCiAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIocGF0aCk6CiAgICAgICAgICAgIG9zLm1ha2VkaXJzKHBhdGgpCiAgICAgICAgcmV0dXJuIHBhdGgKICAgIGRlZiBsb2FkX2NvbmZpZ19wYXRocygqcmVzb3VyY2UpOgogICAgICAgIGlkcyA9IFsiQ1NJRExfTE9DQUxfQVBQREFUQSIsICJDU0lETF9DT01NT05fQVBQREFUQSJdCiAgICAgICAgZm9yIGlkIGluIGlkczoKICAgICAgICAgICAgYmFzZSA9IGdldF9wYXRoKGlkKQogICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKGJhc2UsICpyZXNvdXJjZSkKICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocGF0aCk6CiAgICAgICAgICAgICAgICB5aWVsZCBwYXRoCmVsc2U6CiAgICBkZWYgc2F2ZV9jb25maWdfcGF0aCgqcmVzb3VyY2UpOgogICAgICAgIGltcG9ydCB4ZGcuQmFzZURpcmVjdG9yeQogICAgICAgIHJldHVybiB4ZGcuQmFzZURpcmVjdG9yeS5zYXZlX2NvbmZpZ19wYXRoKCpyZXNvdXJjZSkKICAgIGRlZiBsb2FkX2NvbmZpZ19wYXRocygqcmVzb3VyY2UpOgogICAgICAgIGltcG9ydCB4ZGcuQmFzZURpcmVjdG9yeQogICAgICAgIHJldHVybiB4ZGcuQmFzZURpcmVjdG9yeS5sb2FkX2NvbmZpZ19wYXRocygqcmVzb3VyY2UpCgpkZWYgbWF0Y2hlc19yZXF1aXJlbWVudChyZXEsIHdoZWVscyk6CiAgICAiIiJMaXN0IG9mIHdoZWVscyBtYXRjaGluZyBhIHJlcXVpcmVtZW50LgoKICAgIDpwYXJhbSByZXE6IFRoZSByZXF1aXJlbWVudCB0byBzYXRpc2Z5CiAgICA6cGFyYW0gd2hlZWxzOiBMaXN0IG9mIHdoZWVscyB0byBzZWFyY2guCiAgICAiIiIKICAgIHRyeToKICAgICAgICBmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IERpc3RyaWJ1dGlvbiwgUmVxdWlyZW1lbnQKICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIkNhbm5vdCB1c2UgcmVxdWlyZW1lbnRzIHdpdGhvdXQgcGtnX3Jlc291cmNlcyIpCgogICAgcmVxID0gUmVxdWlyZW1lbnQucGFyc2UocmVxKQoKICAgIHNlbGVjdGVkID0gW10KICAgIGZvciB3ZiBpbiB3aGVlbHM6CiAgICAgICAgZiA9IHdmLnBhcnNlZF9maWxlbmFtZQogICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24ocHJvamVjdF9uYW1lPWYuZ3JvdXAoIm5hbWUiKSwgdmVyc2lvbj1mLmdyb3VwKCJ2ZXIiKSkKICAgICAgICBpZiBkaXN0IGluIHJlcToKICAgICAgICAgICAgc2VsZWN0ZWQuYXBwZW5kKHdmKQogICAgcmV0dXJuIHNlbGVjdGVkClBLAwQUAAAAAAAAACEA87TkKLceAAC3HgAAKwAAAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3dpbmluc3Qyd2hlZWwucHkjIS91c3IvYmluL2VudiBweXRob24KaW1wb3J0IG9zLnBhdGgKaW1wb3J0IHJlCmltcG9ydCBzeXMKaW1wb3J0IHRlbXBmaWxlCmltcG9ydCB6aXBmaWxlCmltcG9ydCB3aGVlbC5iZGlzdF93aGVlbAppbXBvcnQgZGlzdHV0aWxzLmRpc3QKZnJvbSBkaXN0dXRpbHMuYXJjaGl2ZV91dGlsIGltcG9ydCBtYWtlX2FyY2hpdmUKZnJvbSBzaHV0aWwgaW1wb3J0IHJtdHJlZQpmcm9tIHdoZWVsLmFyY2hpdmUgaW1wb3J0IGFyY2hpdmVfd2hlZWxmaWxlCmZyb20gYXJncGFyc2UgaW1wb3J0IEFyZ3VtZW50UGFyc2VyCmZyb20gZ2xvYiBpbXBvcnQgaWdsb2IKCmVnZ19pbmZvX3JlID0gcmUuY29tcGlsZShyJycnKF58LykoP1A8bmFtZT5bXi9dKz8pLSg/UDx2ZXI+Lis/KQogICAgKC0oP1A8cHl2ZXI+Lis/KSk/KC0oP1A8YXJjaD4uKz8pKT8uZWdnLWluZm8oL3wkKScnJywgcmUuVkVSQk9TRSkKCmRlZiBwYXJzZV9pbmZvKHdpbmluZm9fbmFtZSwgZWdnaW5mb19uYW1lKToKICAgICIiIkV4dHJhY3QgbWV0YWRhdGEgZnJvbSBmaWxlbmFtZXMuCiAgICAKICAgIEV4dHJhY3RzIHRoZSA0IG1ldGFkYXRhaXRlbXMgbmVlZGVkIChuYW1lLCB2ZXJzaW9uLCBweXZlcnNpb24sIGFyY2gpIGZyb20KICAgIHRoZSBpbnN0YWxsZXIgZmlsZW5hbWUgYW5kIHRoZSBuYW1lIG9mIHRoZSBlZ2ctaW5mbyBkaXJlY3RvcnkgZW1iZWRkZWQgaW4KICAgIHRoZSB6aXBmaWxlIChpZiBhbnkpLgoKICAgIFRoZSBlZ2dpbmZvIGZpbGVuYW1lIGhhcyB0aGUgZm9ybWF0OjoKCiAgICAgICAgbmFtZS12ZXIoLXB5dmVyKSgtYXJjaCkuZWdnLWluZm8KCiAgICBUaGUgaW5zdGFsbGVyIGZpbGVuYW1lIGhhcyB0aGUgZm9ybWF0OjoKCiAgICAgICAgbmFtZS12ZXIuYXJjaCgtcHl2ZXIpLmV4ZQoKICAgIFNvbWUgdGhpbmdzIHRvIG5vdGU6CgogICAgMS4gVGhlIGluc3RhbGxlciBmaWxlbmFtZSBpcyBub3QgZGVmaW5pdGl2ZS4gQW4gaW5zdGFsbGVyIGNhbiBiZSByZW5hbWVkCiAgICAgICBhbmQgd29yayBwZXJmZWN0bHkgd2VsbCBhcyBhbiBpbnN0YWxsZXIuIFNvIG1vcmUgcmVsaWFibGUgZGF0YSBzaG91bGQKICAgICAgIGJlIHVzZWQgd2hlbmV2ZXIgcG9zc2libGUuCiAgICAyLiBUaGUgZWdnLWluZm8gZGF0YSBzaG91bGQgYmUgcHJlZmVycmVkIGZvciB0aGUgbmFtZSBhbmQgdmVyc2lvbiwgYmVjYXVzZQogICAgICAgdGhlc2UgY29tZSBzdHJhaWdodCBmcm9tIHRoZSBkaXN0dXRpbHMgbWV0YWRhdGEsIGFuZCBhcmUgbWFuZGF0b3J5LgogICAgMy4gVGhlIHB5dmVyIGZyb20gdGhlIGVnZy1pbmZvIGRhdGEgc2hvdWxkIGJlIGlnbm9yZWQsIGFzIGl0IGlzCiAgICAgICBjb25zdHJ1Y3RlZCBmcm9tIHRoZSB2ZXJzaW9uIG9mIFB5dGhvbiB1c2VkIHRvIGJ1aWxkIHRoZSBpbnN0YWxsZXIsCiAgICAgICB3aGljaCBpcyBpcnJlbGV2YW50IC0gdGhlIGluc3RhbGxlciBmaWxlbmFtZSBpcyBjb3JyZWN0IGhlcmUgKGV2ZW4gdG8KICAgICAgIHRoZSBwb2ludCB0aGF0IHdoZW4gaXQncyBub3QgdGhlcmUsIGFueSB2ZXJzaW9uIGlzIGltcGxpZWQpLgogICAgNC4gVGhlIGFyY2hpdGVjdHVyZSBtdXN0IGJlIHRha2VuIGZyb20gdGhlIGluc3RhbGxlciBmaWxlbmFtZSwgYXMgaXQgaXMKICAgICAgIG5vdCBpbmNsdWRlZCBpbiB0aGUgZWdnLWluZm8gZGF0YS4KICAgIDUuIEFyY2hpdGVjdHVyZS1uZXV0cmFsIGluc3RhbGxlcnMgc3RpbGwgaGF2ZSBhbiBhcmNoaXRlY3R1cmUgYmVjYXVzZSB0aGUKICAgICAgIGluc3RhbGxlciBmb3JtYXQgaXRzZWxmIChiZWluZyBleGVjdXRhYmxlKSBpcyBhcmNoaXRlY3R1cmUtc3BlY2lmaWMuIFdlCiAgICAgICBzaG91bGQgdGhlcmVmb3JlIGlnbm9yZSB0aGUgYXJjaGl0ZWN0dXJlIGlmIHRoZSBjb250ZW50IGlzIHB1cmUtcHl0aG9uLgogICAgIiIiCgogICAgZWdnaW5mbyA9IE5vbmUKICAgIGlmIGVnZ2luZm9fbmFtZToKICAgICAgICBlZ2dpbmZvID0gZWdnX2luZm9fcmUuc2VhcmNoKGVnZ2luZm9fbmFtZSkKICAgICAgICBpZiBub3QgZWdnaW5mbzoKICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiRWdnIGluZm8gZmlsZW5hbWUgJXMgaXMgbm90IHZhbGlkIiAlCiAgICAgICAgICAgICAgICAgICAgKGVnZ2luZm9fbmFtZSwpKQoKICAgICMgUGFyc2UgdGhlIHdpbmluc3QgZmlsZW5hbWUKICAgICMgMS4gRGlzdHJpYnV0aW9uIG5hbWUgKHVwIHRvIHRoZSBmaXJzdCAnLScpCiAgICB3X25hbWUsIHNlcCwgcmVzdCA9IHdpbmluZm9fbmFtZS5wYXJ0aXRpb24oJy0nKQogICAgaWYgbm90IHNlcDoKICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJbnN0YWxsZXIgZmlsZW5hbWUgJXMgaXMgbm90IHZhbGlkIiAlCiAgICAgICAgICAgICAgICAod2luaW5mb19uYW1lLCkpCiAgICAjIFN0cmlwICcuZXhlJwogICAgcmVzdCA9IHJlc3RbOi00XQogICAgIyAyLiBQeXRob24gdmVyc2lvbiAoZnJvbSB0aGUgbGFzdCAnLScsIG11c3Qgc3RhcnQgd2l0aCAncHknKQogICAgcmVzdDIsIHNlcCwgd19weXZlciA9IHJlc3QucnBhcnRpdGlvbignLScpCiAgICBpZiBzZXAgYW5kIHdfcHl2ZXIuc3RhcnRzd2l0aCgncHknKToKICAgICAgICByZXN0ID0gcmVzdDIKICAgICAgICB3X3B5dmVyID0gd19weXZlci5yZXBsYWNlKCcuJywgJycpCiAgICBlbHNlOgogICAgICAgICMgTm90IHZlcnNpb24gc3BlY2lmaWMgLSB1c2UgcHkyLnB5My4gV2hpbGUgaXQgaXMgcG9zc2libGUgdGhhdAogICAgICAgICMgcHVyZS1QeXRob24gY29kZSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIGJvdGggUHl0aG9uIDIgYW5kIDMsIHRoZXJlCiAgICAgICAgIyBpcyBubyB3YXkgb2Yga25vd2luZyBmcm9tIHRoZSB3aW5pbnN0IGZvcm1hdCwgc28gd2UgYXNzdW1lIHRoZSBiZXN0CiAgICAgICAgIyBoZXJlICh0aGUgdXNlciBjYW4gYWx3YXlzIG1hbnVhbGx5IHJlbmFtZSB0aGUgd2hlZWwgdG8gYmUgbW9yZQogICAgICAgICMgcmVzdHJpY3RpdmUgaWYgbmVlZGVkKS4KICAgICAgICB3X3B5dmVyID0gJ3B5Mi5weTMnCiAgICAjIDMuIFZlcnNpb24gYW5kIGFyY2hpdGVjdHVyZQogICAgd192ZXIsIHNlcCwgd19hcmNoID0gcmVzdC5ycGFydGl0aW9uKCcuJykKICAgIGlmIG5vdCBzZXA6CiAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSW5zdGFsbGVyIGZpbGVuYW1lICVzIGlzIG5vdCB2YWxpZCIgJQogICAgICAgICAgICAgICAgKHdpbmluZm9fbmFtZSwpKQoKICAgIGlmIGVnZ2luZm86CiAgICAgICAgd19uYW1lID0gZWdnaW5mby5ncm91cCgnbmFtZScpCiAgICAgICAgd192ZXIgPSBlZ2dpbmZvLmdyb3VwKCd2ZXInKQoKICAgIHJldHVybiBkaWN0KG5hbWU9d19uYW1lLCB2ZXI9d192ZXIsIGFyY2g9d19hcmNoLCBweXZlcj13X3B5dmVyKQoKZGVmIGJkaXN0X3dpbmluc3Qyd2hlZWwocGF0aCwgZGVzdF9kaXI9b3MucGF0aC5jdXJkaXIpOgogICAgYmR3ID0gemlwZmlsZS5aaXBGaWxlKHBhdGgpCgogICAgIyBTZWFyY2ggZm9yIGVnZy1pbmZvIGluIHRoZSBhcmNoaXZlCiAgICBlZ2dpbmZvX25hbWUgPSBOb25lCiAgICBmb3IgZmlsZW5hbWUgaW4gYmR3Lm5hbWVsaXN0KCk6CiAgICAgICAgaWYgJy5lZ2ctaW5mbycgaW4gZmlsZW5hbWU6CiAgICAgICAgICAgIGVnZ2luZm9fbmFtZSA9IGZpbGVuYW1lCiAgICAgICAgICAgIGJyZWFrCgogICAgaW5mbyA9IHBhcnNlX2luZm8ob3MucGF0aC5iYXNlbmFtZShwYXRoKSwgZWdnaW5mb19uYW1lKQoKICAgIHJvb3RfaXNfcHVyZWxpYiA9IFRydWUKICAgIGZvciB6aXBpbmZvIGluIGJkdy5pbmZvbGlzdCgpOgogICAgICAgIGlmIHppcGluZm8uZmlsZW5hbWUuc3RhcnRzd2l0aCgnUExBVExJQicpOgogICAgICAgICAgICByb290X2lzX3B1cmVsaWIgPSBGYWxzZQogICAgICAgICAgICBicmVhawogICAgaWYgcm9vdF9pc19wdXJlbGliOgogICAgICAgIHBhdGhzID0geydwdXJlbGliJzogJyd9CiAgICBlbHNlOgogICAgICAgIHBhdGhzID0geydwbGF0bGliJzogJyd9CgogICAgZGlzdF9pbmZvID0gIiUobmFtZSlzLSUodmVyKXMiICUgaW5mbwogICAgZGF0YWRpciA9ICIlcy5kYXRhLyIgJSBkaXN0X2luZm8KCiAgICAjIHJld3JpdGUgcGF0aHMgdG8gdHJpY2sgWmlwRmlsZSBpbnRvIGV4dHJhY3RpbmcgYW4gZWdnCiAgICAjIFhYWCBncmFiIHdpbmluc3QgLmluaSAtIGJldHdlZW4gLmV4ZSwgcGFkZGluZywgYW5kIGZpcnN0IHppcCBmaWxlLgogICAgbWVtYmVycyA9IFtdCiAgICBlZ2dpbmZvX25hbWUgPSAnJwogICAgZm9yIHppcGluZm8gaW4gYmR3LmluZm9saXN0KCk6CiAgICAgICAga2V5LCBiYXNlbmFtZSA9IHppcGluZm8uZmlsZW5hbWUuc3BsaXQoJy8nLCAxKQogICAgICAgIGtleSA9IGtleS5sb3dlcigpCiAgICAgICAgYmFzZXBhdGggPSBwYXRocy5nZXQoa2V5LCBOb25lKQogICAgICAgIGlmIGJhc2VwYXRoIGlzIE5vbmU6CiAgICAgICAgICAgIGJhc2VwYXRoID0gZGF0YWRpciArIGtleS5sb3dlcigpICsgJy8nCiAgICAgICAgb2xkbmFtZSA9IHppcGluZm8uZmlsZW5hbWUKICAgICAgICBuZXduYW1lID0gYmFzZXBhdGggKyBiYXNlbmFtZQogICAgICAgIHppcGluZm8uZmlsZW5hbWUgPSBuZXduYW1lCiAgICAgICAgZGVsIGJkdy5OYW1lVG9JbmZvW29sZG5hbWVdCiAgICAgICAgYmR3Lk5hbWVUb0luZm9bbmV3bmFtZV0gPSB6aXBpbmZvCiAgICAgICAgIyBDb2xsZWN0IG1lbWJlciBuYW1lcywgYnV0IG9taXQgJycgKGZyb20gYW4gZW50cnkgbGlrZSAiUExBVExJQi8iCiAgICAgICAgaWYgbmV3bmFtZToKICAgICAgICAgICAgbWVtYmVycy5hcHBlbmQobmV3bmFtZSkKICAgICAgICAjIFJlbWVtYmVyIGVnZy1pbmZvIG5hbWUgZm9yIHRoZSBlZ2cyZGlzdCBjYWxsIGJlbG93CiAgICAgICAgaWYgbm90IGVnZ2luZm9fbmFtZToKICAgICAgICAgICAgaWYgbmV3bmFtZS5lbmRzd2l0aCgnLmVnZy1pbmZvJyk6CiAgICAgICAgICAgICAgICBlZ2dpbmZvX25hbWUgPSBuZXduYW1lCiAgICAgICAgICAgIGVsaWYgJy5lZ2ctaW5mby8nIGluIG5ld25hbWU6CiAgICAgICAgICAgICAgICBlZ2dpbmZvX25hbWUsIHNlcCwgXyA9IG5ld25hbWUucnBhcnRpdGlvbignLycpCiAgICBkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKHN1ZmZpeD0iX2IydyIpCiAgICBiZHcuZXh0cmFjdGFsbChkaXIsIG1lbWJlcnMpCgogICAgIyBlZ2cyd2hlZWwKICAgIGFiaSA9ICdub25lJwogICAgcHl2ZXIgPSBpbmZvWydweXZlciddCiAgICBhcmNoID0gKGluZm9bJ2FyY2gnXSBvciAnYW55JykucmVwbGFjZSgnLicsICdfJykucmVwbGFjZSgnLScsICdfJykKICAgICMgV2luaW5zdCBpbnN0YWxsZXJzIGFsd2F5cyBoYXZlIGFyY2ggZXZlbiBpZiB0aGV5IGFyZSBub3QKICAgICMgYXJjaGl0ZWN0dXJlLXNwZWNpZmljIChiZWNhdXNlIHRoZSBmb3JtYXQgaXRzZWxmIGlzKS4KICAgICMgU28sIGFzc3VtZSB0aGUgY29udGVudCBpcyBhcmNoaXRlY3R1cmUtbmV1dHJhbCBpZiByb290IGlzIHB1cmVsaWIuCiAgICBpZiByb290X2lzX3B1cmVsaWI6CiAgICAgICAgYXJjaCA9ICdhbnknCiAgICAjIElmIHRoZSBpbnN0YWxsZXIgaXMgYXJjaGl0ZWN0dXJlLXNwZWNpZmljLCBpdCdzIGFsbW9zdCBjZXJ0YWlubHkgYWxzbwogICAgIyBDUHl0aG9uLXNwZWNpZmljLgogICAgaWYgYXJjaCAhPSAnYW55JzoKICAgICAgICBweXZlciA9IHB5dmVyLnJlcGxhY2UoJ3B5JywgJ2NwJykKICAgIHdoZWVsX25hbWUgPSAnLScuam9pbigoCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdF9pbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgIHB5dmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgIGFiaSwKICAgICAgICAgICAgICAgICAgICAgICAgICBhcmNoCiAgICAgICAgICAgICAgICAgICAgICAgICAgKSkKICAgIGlmIHJvb3RfaXNfcHVyZWxpYjoKICAgICAgICBidyA9IHdoZWVsLmJkaXN0X3doZWVsLmJkaXN0X3doZWVsKGRpc3R1dGlscy5kaXN0LkRpc3RyaWJ1dGlvbigpKQogICAgZWxzZToKICAgICAgICBidyA9IF9iZGlzdF93aGVlbF90YWcoZGlzdHV0aWxzLmRpc3QuRGlzdHJpYnV0aW9uKCkpCgogICAgYncucm9vdF9pc19wdXJlID0gcm9vdF9pc19wdXJlbGliCiAgICBidy5weXRob25fdGFnID0gcHl2ZXIKICAgIGJ3LnBsYXRfbmFtZV9zdXBwbGllZCA9IFRydWUKICAgIGJ3LnBsYXRfbmFtZSA9IGluZm9bJ2FyY2gnXSBvciAnYW55JwoKICAgIGlmIG5vdCByb290X2lzX3B1cmVsaWI6CiAgICAgICAgYncuZnVsbF90YWdfc3VwcGxpZWQgPSBUcnVlCiAgICAgICAgYncuZnVsbF90YWcgPSAocHl2ZXIsIGFiaSwgYXJjaCkKCiAgICBkaXN0X2luZm9fZGlyID0gb3MucGF0aC5qb2luKGRpciwgJyVzLmRpc3QtaW5mbycgJSBkaXN0X2luZm8pCiAgICBidy5lZ2cyZGlzdChvcy5wYXRoLmpvaW4oZGlyLCBlZ2dpbmZvX25hbWUpLCBkaXN0X2luZm9fZGlyKQogICAgYncud3JpdGVfd2hlZWxmaWxlKGRpc3RfaW5mb19kaXIsIGdlbmVyYXRvcj0nd2luaW5zdDJ3aGVlbCcpCiAgICBidy53cml0ZV9yZWNvcmQoZGlyLCBkaXN0X2luZm9fZGlyKQogICAgCiAgICBhcmNoaXZlX3doZWVsZmlsZShvcy5wYXRoLmpvaW4oZGVzdF9kaXIsIHdoZWVsX25hbWUpLCBkaXIpCiAgICBybXRyZWUoZGlyKQoKCmNsYXNzIF9iZGlzdF93aGVlbF90YWcod2hlZWwuYmRpc3Rfd2hlZWwuYmRpc3Rfd2hlZWwpOgogICAgIyBhbGxvdyB0aGUgY2xpZW50IHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGdlbmVyYXRlZCB3aGVlbCB0YWcKICAgICMgVGhlIGRlZmF1bHQgYmRpc3Rfd2hlZWwgaW1wbGVtZW50YXRpb24gdXNlcyBweXRob24gYW5kIGFiaSB0YWdzCiAgICAjIG9mIHRoZSBydW5uaW5nIHB5dGhvbiBwcm9jZXNzLiBUaGlzIGlzIG5vdCBzdWl0YWJsZSBmb3IKICAgICMgZ2VuZXJhdGluZy9yZXBhY2thZ2luZyBwcmVidWlsZCBiaW5hcmllcy4KCiAgICBmdWxsX3RhZ19zdXBwbGllZCA9IEZhbHNlCiAgICBmdWxsX3RhZyA9IE5vbmUgICMgTm9uZSBvciBhIChweXRhZywgc29hYml0YWcsIHBsYXR0YWcpIHRyaXBsZQoKICAgIGRlZiBnZXRfdGFnKHNlbGYpOgogICAgICAgIGlmIHNlbGYuZnVsbF90YWdfc3VwcGxpZWQgYW5kIHNlbGYuZnVsbF90YWcgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmZ1bGxfdGFnCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIHN1cGVyKF9iZGlzdF93aGVlbF90YWcsIHNlbGYpLmdldF90YWcoKQoKCmRlZiBtYWluKCk6CiAgICBwYXJzZXIgPSBBcmd1bWVudFBhcnNlcigpCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCdpbnN0YWxsZXJzJywgbmFyZ3M9JyonLCBoZWxwPSJJbnN0YWxsZXJzIHRvIGNvbnZlcnQiKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1kZXN0LWRpcicsICctZCcsIGRlZmF1bHQ9b3MucGF0aC5jdXJkaXIsCiAgICAgICAgICAgIGhlbHA9IkRpcmVjdG9yeSB0byBzdG9yZSB3aGVlbHMgKGRlZmF1bHQgJShkZWZhdWx0KXMpIikKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tdmVyYm9zZScsICctdicsIGFjdGlvbj0nc3RvcmVfdHJ1ZScpCiAgICBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQogICAgZm9yIHBhdCBpbiBhcmdzLmluc3RhbGxlcnM6CiAgICAgICAgZm9yIGluc3RhbGxlciBpbiBpZ2xvYihwYXQpOgogICAgICAgICAgICBpZiBhcmdzLnZlcmJvc2U6CiAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJ7MH0uLi4gIi5mb3JtYXQoaW5zdGFsbGVyKSkKICAgICAgICAgICAgYmRpc3Rfd2luaW5zdDJ3aGVlbChpbnN0YWxsZXIsIGFyZ3MuZGVzdF9kaXIpCiAgICAgICAgICAgIGlmIGFyZ3MudmVyYm9zZToKICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIk9LXG4iKQoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgIG1haW4oKQpQSwMEFAAAAAAAAAAhAAAAAAAAAAAAAAAAACIAAABydWxlc19weXRob24vcGFja2FnaW5nL19faW5pdF9fLnB5UEsDBBQAAAAAAAAAIQAzeY0bFjIAABYyAAAeAAAAcnVsZXNfcHl0aG9uL3BhY2thZ2luZy9waXB0b29sIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCgppbXBvcnQgb3MKaW1wb3J0IHJlCmltcG9ydCB0ZW1wZmlsZQppbXBvcnQgc2h1dGlsCmltcG9ydCBzeXMKaW1wb3J0IHN1YnByb2Nlc3MKaW1wb3J0IHppcGZpbGUKCiMgUmV0dXJuIFRydWUgaWYgcnVubmluZyBvbiBXaW5kb3dzCmRlZiBJc1dpbmRvd3MoKToKICByZXR1cm4gb3MubmFtZSA9PSAnbnQnCgpkZWYgR2V0V2luZG93c1BhdGhXaXRoVU5DUHJlZml4KHBhdGgpOgogICIiIgogIEFkZGluZyBVTkMgcHJlZml4IGFmdGVyIGdldHRpbmcgYSBub3JtYWxpemVkIGFic29sdXRlIFdpbmRvd3MgcGF0aCwKICBpdCdzIG5vLW9wIGZvciBub24tV2luZG93cyBwbGF0Zm9ybXMgb3IgaWYgcnVubmluZyB1bmRlciBweXRob24yLgogICIiIgogIHBhdGggPSBwYXRoLnN0cmlwKCkKCiAgIyBObyBuZWVkIHRvIGFkZCBwcmVmaXggZm9yIG5vbi1XaW5kb3dzIHBsYXRmb3Jtcy4KICAjIEFuZCBcXD9cIGRvZXNuJ3Qgd29yayBpbiBweXRob24gMgogIGlmIG5vdCBJc1dpbmRvd3MoKSBvciBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMzoKICAgIHJldHVybiBwYXRoCgogICMgTGV0cyBzdGFydCB0aGUgdW5pY29kZSBmdW4KICB1bmljb2RlX3ByZWZpeCA9ICJcXFxcP1xcIgogIGlmIHBhdGguc3RhcnRzd2l0aCh1bmljb2RlX3ByZWZpeCk6CiAgICByZXR1cm4gcGF0aAoKICAjIG9zLnBhdGguYWJzcGF0aCByZXR1cm5zIGEgbm9ybWFsaXplZCBhYnNvbHV0ZSBwYXRoCiAgcmV0dXJuIHVuaWNvZGVfcHJlZml4ICsgb3MucGF0aC5hYnNwYXRoKHBhdGgpCgpkZWYgSGFzV2luZG93c0V4ZWN1dGFibGVFeHRlbnNpb24ocGF0aCk6CiAgcmV0dXJuIHBhdGguZW5kc3dpdGgoJy5leGUnKSBvciBwYXRoLmVuZHN3aXRoKCcuY29tJykgb3IgcGF0aC5lbmRzd2l0aCgnLmJhdCcpCgpQWVRIT05fQklOQVJZID0gJ2JhemVsX3Rvb2xzL3Rvb2xzL3B5dGhvbi9weTN3cmFwcGVyLnNoJwppZiBJc1dpbmRvd3MoKSBhbmQgbm90IEhhc1dpbmRvd3NFeGVjdXRhYmxlRXh0ZW5zaW9uKFBZVEhPTl9CSU5BUlkpOgogIFBZVEhPTl9CSU5BUlkgPSBQWVRIT05fQklOQVJZICsgJy5leGUnCgojIEZpbmQgYSBmaWxlIGluIGEgZ2l2ZW4gc2VhcmNoIHBhdGguCmRlZiBTZWFyY2hQYXRoKG5hbWUpOgogIHNlYXJjaF9wYXRoID0gb3MuZ2V0ZW52KCdQQVRIJywgb3MuZGVmcGF0aCkuc3BsaXQob3MucGF0aHNlcCkKICBmb3IgZGlyZWN0b3J5IGluIHNlYXJjaF9wYXRoOgogICAgaWYgZGlyZWN0b3J5ID09ICcnOiBjb250aW51ZQogICAgcGF0aCA9IG9zLnBhdGguam9pbihkaXJlY3RvcnksIG5hbWUpCiAgICBpZiBvcy5wYXRoLmlzZmlsZShwYXRoKSBhbmQgb3MuYWNjZXNzKHBhdGgsIG9zLlhfT0spOgogICAgICByZXR1cm4gcGF0aAogIHJldHVybiBOb25lCgpkZWYgSXNSdW5uaW5nRnJvbVppcCgpOgogIHJldHVybiBGYWxzZQoKIyBGaW5kIHRoZSByZWFsIFB5dGhvbiBiaW5hcnkgaWYgaXQncyBub3QgYSBub3JtYWwgYWJzb2x1dGUgcGF0aApkZWYgRmluZFB5dGhvbkJpbmFyeShtb2R1bGVfc3BhY2UpOgogIGlmIFBZVEhPTl9CSU5BUlkuc3RhcnRzd2l0aCgnLy8nKToKICAgICMgQ2FzZSAxOiBQYXRoIGlzIGEgbGFiZWwuIE5vdCBzdXBwb3J0ZWQgeWV0LgogICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoCiAgICAgICdCYXplbCBkb2VzIG5vdCBzdXBwb3J0IGV4ZWN1dGlvbiBvZiBQeXRob24gaW50ZXJwcmV0ZXJzIHZpYSBsYWJlbHMgeWV0JykKICBlbGlmIG9zLnBhdGguaXNhYnMoUFlUSE9OX0JJTkFSWSk6CiAgICAjIENhc2UgMjogQWJzb2x1dGUgcGF0aC4KICAgIHJldHVybiBQWVRIT05fQklOQVJZCiAgIyBVc2Ugbm9ybXBhdGgoKSB0byBjb252ZXJ0IHNsYXNoZXMgdG8gb3Muc2VwIG9uIFdpbmRvd3MuCiAgZWxpZiBvcy5zZXAgaW4gb3MucGF0aC5ub3JtcGF0aChQWVRIT05fQklOQVJZKToKICAgICMgQ2FzZSAzOiBQYXRoIGlzIHJlbGF0aXZlIHRvIHRoZSByZXBvIHJvb3QuCiAgICByZXR1cm4gb3MucGF0aC5qb2luKG1vZHVsZV9zcGFjZSwgUFlUSE9OX0JJTkFSWSkKICBlbHNlOgogICAgIyBDYXNlIDQ6IFBhdGggaGFzIHRvIGJlIGxvb2tlZCB1cCBpbiB0aGUgc2VhcmNoIHBhdGguCiAgICByZXR1cm4gU2VhcmNoUGF0aChQWVRIT05fQklOQVJZKQoKZGVmIENyZWF0ZVB5dGhvblBhdGhFbnRyaWVzKHB5dGhvbl9pbXBvcnRzLCBtb2R1bGVfc3BhY2UpOgogIHBhcnRzID0gcHl0aG9uX2ltcG9ydHMuc3BsaXQoJzonKTsKICByZXR1cm4gW21vZHVsZV9zcGFjZV0gKyBbIiVzLyVzIiAlIChtb2R1bGVfc3BhY2UsIHBhdGgpIGZvciBwYXRoIGluIHBhcnRzXQoKIyBGaW5kIHRoZSBydW5maWxlcyB0cmVlCmRlZiBGaW5kTW9kdWxlU3BhY2UoKToKICBzdHViX2ZpbGVuYW1lID0gc3lzLmFyZ3ZbMF0KICBpZiBub3Qgb3MucGF0aC5pc2FicyhzdHViX2ZpbGVuYW1lKToKICAgIHN0dWJfZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4ob3MuZ2V0Y3dkKCksIHN0dWJfZmlsZW5hbWUpCgogIHdoaWxlIFRydWU6CiAgICBtb2R1bGVfc3BhY2UgPSBzdHViX2ZpbGVuYW1lICsgKCcuZXhlJyBpZiBJc1dpbmRvd3MoKSBlbHNlICcnKSArICcucnVuZmlsZXMnCiAgICBpZiBvcy5wYXRoLmlzZGlyKG1vZHVsZV9zcGFjZSk6CiAgICAgIHJldHVybiBtb2R1bGVfc3BhY2UKCiAgICBydW5maWxlc19wYXR0ZXJuID0gcicoLipcLnJ1bmZpbGVzKScgKyAocidcXCcgaWYgSXNXaW5kb3dzKCkgZWxzZSAnLycpICsgJy4qJwogICAgbWF0Y2hvYmogPSByZS5tYXRjaChydW5maWxlc19wYXR0ZXJuLCBzdHViX2ZpbGVuYW1lKQogICAgaWYgbWF0Y2hvYmo6CiAgICAgIHJldHVybiBtYXRjaG9iai5ncm91cCgxKQoKICAgIGlmIG5vdCBvcy5wYXRoLmlzbGluayhzdHViX2ZpbGVuYW1lKToKICAgICAgYnJlYWsKICAgIHRhcmdldCA9IG9zLnJlYWRsaW5rKHN0dWJfZmlsZW5hbWUpCiAgICBpZiBvcy5wYXRoLmlzYWJzKHRhcmdldCk6CiAgICAgIHN0dWJfZmlsZW5hbWUgPSB0YXJnZXQKICAgIGVsc2U6CiAgICAgIHN0dWJfZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKHN0dWJfZmlsZW5hbWUpLCB0YXJnZXQpCgogIHJhaXNlIEFzc2VydGlvbkVycm9yKCdDYW5ub3QgZmluZCAucnVuZmlsZXMgZGlyZWN0b3J5IGZvciAlcycgJSBzeXMuYXJndlswXSkKCmRlZiBFeHRyYWN0WmlwKHppcF9wYXRoLCBkZXN0X2Rpcik6CiAgIiIiRXh0cmFjdHMgdGhlIGNvbnRlbnRzIG9mIGEgemlwIGZpbGUsIHByZXNlcnZpbmcgdGhlIHVuaXggZmlsZSBtb2RlIGJpdHMuCgogIFRoZXNlIGluY2x1ZGUgdGhlIHBlcm1pc3Npb24gYml0cywgYW5kIGluIHBhcnRpY3VsYXIsIHRoZSBleGVjdXRhYmxlIGJpdC4KCiAgSWRlYWxseSB0aGUgemlwZmlsZSBtb2R1bGUgc2hvdWxkIHNldCB0aGVzZSBiaXRzLCBidXQgaXQgZG9lc24ndC4gU2VlOgogIGh0dHBzOi8vYnVncy5weXRob24ub3JnL2lzc3VlMTU3OTUuCgogIEFyZ3M6CiAgICAgIHppcF9wYXRoOiBUaGUgcGF0aCB0byB0aGUgemlwIGZpbGUgdG8gZXh0cmFjdAogICAgICBkZXN0X2RpcjogVGhlIHBhdGggdG8gdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeQogICIiIgogIHppcF9wYXRoID0gR2V0V2luZG93c1BhdGhXaXRoVU5DUHJlZml4KHppcF9wYXRoKQogIGRlc3RfZGlyID0gR2V0V2luZG93c1BhdGhXaXRoVU5DUHJlZml4KGRlc3RfZGlyKQogIHdpdGggemlwZmlsZS5aaXBGaWxlKHppcF9wYXRoKSBhcyB6ZjoKICAgIGZvciBpbmZvIGluIHpmLmluZm9saXN0KCk6CiAgICAgIHpmLmV4dHJhY3QoaW5mbywgZGVzdF9kaXIpCiAgICAgICMgVU5DLXByZWZpeGVkIHBhdGhzIG11c3QgYmUgYWJzb2x1dGUvbm9ybWFsaXplZC4gU2VlCiAgICAgICMgaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvd2luZG93cy9kZXNrdG9wL2ZpbGVpby9uYW1pbmctYS1maWxlI21heGltdW0tcGF0aC1sZW5ndGgtbGltaXRhdGlvbgogICAgICBmaWxlX3BhdGggPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5qb2luKGRlc3RfZGlyLCBpbmZvLmZpbGVuYW1lKSkKICAgICAgIyBUaGUgVW5peCBzdF9tb2RlIGJpdHMgKHNlZSAibWFuIDcgaW5vZGUiKSBhcmUgc3RvcmVkIGluIHRoZSB1cHBlciAxNgogICAgICAjIGJpdHMgb2YgZXh0ZXJuYWxfYXR0ci4gT2YgdGhvc2UsIHdlIHNldCB0aGUgbG93ZXIgMTIgYml0cywgd2hpY2ggYXJlIHRoZQogICAgICAjIGZpbGUgbW9kZSBiaXRzIChzaW5jZSB0aGUgZmlsZSB0eXBlIGJpdHMgY2FuJ3QgYmUgc2V0IGJ5IGNobW9kIGFueXdheSkuCiAgICAgIGF0dHJzID0gaW5mby5leHRlcm5hbF9hdHRyID4+IDE2CiAgICAgIGlmIGF0dHJzICE9IDA6ICAjIFJ1bW9yIGhhcyBpdCB0aGVzZSBjYW4gYmUgMCBmb3IgemlwcyBjcmVhdGVkIG9uIFdpbmRvd3MuCiAgICAgICAgb3MuY2htb2QoZmlsZV9wYXRoLCBhdHRycyAmIDBvNzc3NykKCiMgQ3JlYXRlIHRoZSBydW5maWxlcyB0cmVlIGJ5IGV4dHJhY3RpbmcgdGhlIHppcCBmaWxlCmRlZiBDcmVhdGVNb2R1bGVTcGFjZSgpOgogIHRlbXBfZGlyID0gdGVtcGZpbGUubWtkdGVtcCgiIiwgIkJhemVsLnJ1bmZpbGVzXyIpCiAgRXh0cmFjdFppcChvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLCB0ZW1wX2RpcikKICByZXR1cm4gb3MucGF0aC5qb2luKHRlbXBfZGlyLCAicnVuZmlsZXMiKQoKIyBSZXR1cm5zIHJlcG9zaXRvcnkgcm9vdHMgdG8gYWRkIHRvIHRoZSBpbXBvcnQgcGF0aC4KZGVmIEdldFJlcG9zaXRvcmllc0ltcG9ydHMobW9kdWxlX3NwYWNlLCBpbXBvcnRfYWxsKToKICBpZiBpbXBvcnRfYWxsOgogICAgcmVwb19kaXJzID0gW29zLnBhdGguam9pbihtb2R1bGVfc3BhY2UsIGQpIGZvciBkIGluIG9zLmxpc3RkaXIobW9kdWxlX3NwYWNlKV0KICAgIHJldHVybiBbZCBmb3IgZCBpbiByZXBvX2RpcnMgaWYgb3MucGF0aC5pc2RpcihkKV0KICByZXR1cm4gW29zLnBhdGguam9pbihtb2R1bGVfc3BhY2UsICJydWxlc19weXRob24iKV0KCiMgRmluZHMgdGhlIHJ1bmZpbGVzIG1hbmlmZXN0IG9yIHRoZSBydW5maWxlcyBkaXJlY3RvcnkuCmRlZiBSdW5maWxlc0VudnZhcihtb2R1bGVfc3BhY2UpOgogICMgSWYgdGhpcyBiaW5hcnkgaXMgdGhlIGRhdGEtZGVwZW5kZW5jeSBvZiBhbm90aGVyIG9uZSwgdGhlIG90aGVyIHNldHMKICAjIFJVTkZJTEVTX01BTklGRVNUX0ZJTEUgb3IgUlVORklMRVNfRElSIGZvciBvdXIgc2FrZS4KICBydW5maWxlcyA9IG9zLmVudmlyb24uZ2V0KCdSVU5GSUxFU19NQU5JRkVTVF9GSUxFJywgTm9uZSkKICBpZiBydW5maWxlczoKICAgIHJldHVybiAoJ1JVTkZJTEVTX01BTklGRVNUX0ZJTEUnLCBydW5maWxlcykKCiAgcnVuZmlsZXMgPSBvcy5lbnZpcm9uLmdldCgnUlVORklMRVNfRElSJywgTm9uZSkKICBpZiBydW5maWxlczoKICAgIHJldHVybiAoJ1JVTkZJTEVTX0RJUicsIHJ1bmZpbGVzKQoKICAjIElmIHJ1bm5pbmcgZnJvbSBhIHppcCwgdGhlcmUncyBubyBtYW5pZmVzdCBmaWxlLgogIGlmIElzUnVubmluZ0Zyb21aaXAoKToKICAgIHJldHVybiAoJ1JVTkZJTEVTX0RJUicsIG1vZHVsZV9zcGFjZSkKCiAgIyBMb29rIGZvciB0aGUgcnVuZmlsZXMgIm91dHB1dCIgbWFuaWZlc3QsIGFyZ3ZbMF0gKyAiLnJ1bmZpbGVzX21hbmlmZXN0IgogIHJ1bmZpbGVzID0gbW9kdWxlX3NwYWNlICsgJ19tYW5pZmVzdCcKICBpZiBvcy5wYXRoLmV4aXN0cyhydW5maWxlcyk6CiAgICByZXR1cm4gKCdSVU5GSUxFU19NQU5JRkVTVF9GSUxFJywgcnVuZmlsZXMpCgogICMgTG9vayBmb3IgdGhlIHJ1bmZpbGVzICJpbnB1dCIgbWFuaWZlc3QsIGFyZ3ZbMF0gKyAiLnJ1bmZpbGVzL01BTklGRVNUIgogIHJ1bmZpbGVzID0gb3MucGF0aC5qb2luKG1vZHVsZV9zcGFjZSwgJ01BTklGRVNUJykKICBpZiBvcy5wYXRoLmV4aXN0cyhydW5maWxlcyk6CiAgICByZXR1cm4gKCdSVU5GSUxFU19ESVInLCBydW5maWxlcykKCiAgIyBJZiBydW5uaW5nIGluIGEgc2FuZGJveCBhbmQgbm8gZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBzZXQsIHRoZW4KICAjIExvb2sgZm9yIHRoZSBydW5maWxlcyAgbmV4dCB0byB0aGUgYmluYXJ5LgogIGlmIG1vZHVsZV9zcGFjZS5lbmRzd2l0aCgnLnJ1bmZpbGVzJykgYW5kIG9zLnBhdGguaXNkaXIobW9kdWxlX3NwYWNlKToKICAgIHJldHVybiAoJ1JVTkZJTEVTX0RJUicsIG1vZHVsZV9zcGFjZSkKCiAgcmV0dXJuIChOb25lLCBOb25lKQoKIyBUT0RPKCM2NDQzKTogUmVtb3ZlIHRoaXMgb25jZSB0aGVyZSdzIG5vIGxvbmdlciBhIGhvc3QgY29uZmlndXJhdGlvbiBmb3IKIyBQeXRob24gdGFyZ2V0cyB0byBhcHBlYXIgaW4uCmRlZiBNYXliZUVtaXRIb3N0VmVyc2lvbldhcm5pbmcocmV0X2NvZGUpOgogICIiIldhcm4gdGhlIHVzZXIgaWYgYSBmYWlsdXJlIG1heSBiZSBkdWUgdG8gdGhlIGhvc3QgY29uZmlnJ3MgdmVyc2lvbi4KCiAgVGhpcyBlbWl0cyBhIG1lc3NhZ2UgdG8gc3RkZXJyIGlmCiAgICAxKSByZXRfY29kZSBpcyBub24temVybywKICAgIDIpIHRoZSB0YXJnZXQgd2FzIGJ1aWx0IGluIHRoZSBob3N0IGNvbmZpZyBhbmQgd2l0aCB0b29sY2hhaW5zIGVuYWJsZWQsIGFuZAogICAgMykgYXQgYW5hbHlzaXMgdGltZSB3ZSBkZXRlY3RlZCBhIG1pc21hdGNoIGJldHdlZW4gdGhlIGhvc3QgY29uZmlnJ3MgdmVyc2lvbgogICAgICAgYW5kIHRoaXMgdGFyZ2V0J3MgZXhwbGljaXRseSBkZWNsYXJlZCB2ZXJzaW9uLCBvciBlbHNlIHRoaXMgdGFyZ2V0IGRpZAogICAgICAgbm90IGV4cGxpY2l0bHkgZGVjbGFyZSBpdHMgdmVyc2lvbi4gKFRoZSBmb3JtZXIgZGlhZ25vc2VzIHRhcmdldHMKICAgICAgIGFmZmVjdGVkIGJ5ICM2NDQzLCBhbmQgdGhlIGxhdHRlciBkaWFnbm9zZXMgdGFyZ2V0cyB0aGF0IGFyZSBicm9rZW4gYnkKICAgICAgIGZpeGluZyAjNDgxNS4pCgogIFNlZSBhbHNvICM3ODk5LCAjODU0OSwgYW5kIFB5Q29tbW9uI3Nob3VsZFdhcm5BYm91dEhvc3RWZXJzaW9uVXBvbkZhaWx1cmUuCgogIFNpbmNlIHRoaXMgd2FybmluZyBpcyBlbWl0dGVkIGhlcmUgaW4gdGhlIHN0dWIgc2NyaXB0IGFuZCBub3QgaW4gQmF6ZWwgaXRzZWxmLAogIGl0IHdpbGwgYmUgcHJlc2VudCBpbiBhbGwgZmFpbGluZyBydW5zIG9mIGFmZmVjdGVkIHRhcmdldHMsIGV2ZW4gd2hlbiBleGVjdXRlZAogIGRpcmVjdGx5IGFuZCBub3QgdmlhIGBiYXplbCBydW5gLiBIb3dldmVyLCBub3RlIHRoYXQgdGhpcyB3YXJuaW5nIGlzIG5ldmVyCiAgYWRkZWQgdG8gbm9uLWhvc3QtY29uZmlndXJlZCB0YXJnZXRzLCBhbmQgdGhhdCBpdCBjYW4gYmUgZGlzYWJsZWQgYnkgZW5zdXJpbmcKICB0aGUgY29ycmVjdCBQeXRob24gdmVyc2lvbiBpcyBwYXNzZWQgdG8gLS1ob3N0X2ZvcmNlX3B5dGhvbiBhbmQgZGVjbGFyZWQgaW4KICB0b29scycgcHl0aG9uX3ZlcnNpb24gYXR0cmlidXRlcy4KCiAgQXJnczoKICAgICAgcmV0X2NvZGU6IFRoZSBleGl0IGNvZGUgb2YgdGhlIHBheWxvYWQgdXNlciBwcm9ncmFtCiAgIiIiCiAgaWYgcmV0X2NvZGUgPT0gMDoKICAgIHJldHVybgogIGlmIG5vdCBGYWxzZToKICAgIHJldHVybgoKICBob3N0X3ZlcnNpb24gPSAiMyIKICB0YXJnZXRfdmVyc2lvbiA9ICIzIgogIG9wcG9zaXRlX29mX2hvc3RfdmVyc2lvbiA9ICIyIiBpZiBob3N0X3ZlcnNpb24gPT0gIjMiIGVsc2UgIjMiCgogIGlmIEZhbHNlOgogICAgIyBNaXNtYXRjaCB3aXRoIGV4cGxpY2l0bHkgZGVjbGFyZWQgdmVyc2lvbi4KICAgIGRpYWdub3N0aWMgPSAiIiJcCk5vdGU6IFRoZSBmYWlsdXJlIG9mIHRhcmdldCB7dGFyZ2V0fSAod2l0aCBleGl0IGNvZGUge3JldF9jb2RlfSkgbWF5IGhhdmUgYmVlbiBcCmNhdXNlZCBieSB0aGUgZmFjdCB0aGF0IGl0IGlzIGEgUHl0aG9uIHt0YXJnZXRfdmVyc2lvbn0gcHJvZ3JhbSB0aGF0IHdhcyBidWlsdCBcCmluIHRoZSBob3N0IGNvbmZpZ3VyYXRpb24sIHdoaWNoIHVzZXMgUHl0aG9uIHtob3N0X3ZlcnNpb259LiBZb3UgY2FuIGNoYW5nZSBcCnRoZSBob3N0IGNvbmZpZ3VyYXRpb24gKGZvciB0aGUgZW50aXJlIGJ1aWxkKSB0byBpbnN0ZWFkIHVzZSBQeXRob24gXAp7dGFyZ2V0X3ZlcnNpb259IGJ5IHNldHRpbmcgLS1ob3N0X2ZvcmNlX3B5dGhvbj1QWXt0YXJnZXRfdmVyc2lvbn0uXAoiIiIuZm9ybWF0KAogICAgdGFyZ2V0PSIvL3BhY2thZ2luZzpwaXB0b29sIiwKICAgIHJldF9jb2RlPXJldF9jb2RlLAogICAgdGFyZ2V0X3ZlcnNpb249dGFyZ2V0X3ZlcnNpb24sCiAgICBob3N0X3ZlcnNpb249aG9zdF92ZXJzaW9uKQogIGVsc2U6CiAgICBkaWFnbm9zdGljID0gIiIiXApOb3RlOiBUaGUgZmFpbHVyZSBvZiB0YXJnZXQge3RhcmdldH0gKHdpdGggZXhpdCBjb2RlIHtyZXRfY29kZX0pIG1heSBoYXZlIGJlZW4gXApjYXVzZWQgYnkgdGhlIGZhY3QgdGhhdCBpdCBpcyBydW5uaW5nIHVuZGVyIFB5dGhvbiB7aG9zdF92ZXJzaW9ufSBpbnN0ZWFkIG9mIFwKUHl0aG9uIHtvcHBvc2l0ZV9vZl9ob3N0X3ZlcnNpb259LiBFeGFtaW5lIHRoZSBlcnJvciB0byBkZXRlcm1pbmUgaWYgdGhhdCBcCmFwcGVhcnMgdG8gYmUgdGhlIHByb2JsZW0uIFNpbmNlIHRoaXMgdGFyZ2V0IGlzIGJ1aWx0IGluIHRoZSBob3N0IFwKY29uZmlndXJhdGlvbiwgdGhlIG9ubHkgd2F5IHRvIGNoYW5nZSBpdHMgdmVyc2lvbiBpcyB0byBzZXQgXAotLWhvc3RfZm9yY2VfcHl0aG9uPVBZe29wcG9zaXRlX29mX2hvc3RfdmVyc2lvbn0sIHdoaWNoIGFmZmVjdHMgdGhlIGVudGlyZSBcCmJ1aWxkLlwKIiIiLmZvcm1hdCgKICAgIHRhcmdldD0iLy9wYWNrYWdpbmc6cGlwdG9vbCIsCiAgICByZXRfY29kZT1yZXRfY29kZSwKICAgIGhvc3RfdmVyc2lvbj1ob3N0X3ZlcnNpb24sCiAgICBvcHBvc2l0ZV9vZl9ob3N0X3ZlcnNpb249b3Bwb3NpdGVfb2ZfaG9zdF92ZXJzaW9uKQoKICAjIFRPRE8oYnJhbmRqb24pOiBDaGFuZ2UgdGhlIHdvcmRpbmcgIllvdSBhcmUgbGlrZWx5IHNlZWluZyB0aGlzIG1lc3NhZ2UKICAjIGJlY2F1c2UiIHRvIHNvbWV0aGluZyBsZXNzIHN0cm9uZyBhZnRlciBhIGZldyByZWxlYXNlcyBmcm9tIDAuMjcuIEJ5IHRoYXQKICAjIHBvaW50LCBtaWdyYXRpb24gZm9yIHRvb2xjaGFpbnMgd29uJ3QgYmUgdGhlIG1haW4gcmVhc29uIHRoaXMgZXJyb3IgaXMgc2VlbgogICMgYnkgdXNlcnMuCiAgbWVzc2FnZSA9ICIiIlwKLS0tLS0tLS0tLS0tLS0tLQp7ZGlhZ25vc3RpY30KCklmIHRoaXMgZXJyb3Igc3RhcnRlZCBvY2N1cnJpbmcgaW4gQmF6ZWwgMC4yNyBhbmQgbGF0ZXIsIGl0IG1heSBiZSBiZWNhdXNlIHRoZSBcClB5dGhvbiB0b29sY2hhaW4gbm93IGVuZm9yY2VzIHRoYXQgdGFyZ2V0cyBhbmFseXplZCBhcyBQWTIgYW5kIFBZMyBydW4gdW5kZXIgYSBcClB5dGhvbiAyIGFuZCBQeXRob24gMyBpbnRlcnByZXRlciwgcmVzcGVjdGl2ZWx5LiBTZWUgXApodHRwczovL2dpdGh1Yi5jb20vYmF6ZWxidWlsZC9iYXplbC9pc3N1ZXMvNzg5OSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLS0tLS0tLS0tLS0tLS0tLSIiIi5mb3JtYXQoZGlhZ25vc3RpYz1kaWFnbm9zdGljKQogIHByaW50KG1lc3NhZ2UsIGZpbGU9c3lzLnN0ZGVycikKCmRlZiBNYWluKCk6CiAgYXJncyA9IHN5cy5hcmd2WzE6XQoKICBuZXdfZW52ID0ge30KCiAgaWYgSXNSdW5uaW5nRnJvbVppcCgpOgogICAgbW9kdWxlX3NwYWNlID0gQ3JlYXRlTW9kdWxlU3BhY2UoKQogIGVsc2U6CiAgICBtb2R1bGVfc3BhY2UgPSBGaW5kTW9kdWxlU3BhY2UoKQoKICBweXRob25faW1wb3J0cyA9ICdweXBpX19zZXR1cHRvb2xzXzM4XzJfNDpweXBpX19waXBfOV8wXzM6cHlwaV9fd2hlZWxfMF8zMF8wYTAnCiAgcHl0aG9uX3BhdGhfZW50cmllcyA9IENyZWF0ZVB5dGhvblBhdGhFbnRyaWVzKHB5dGhvbl9pbXBvcnRzLCBtb2R1bGVfc3BhY2UpCiAgcHl0aG9uX3BhdGhfZW50cmllcyArPSBHZXRSZXBvc2l0b3JpZXNJbXBvcnRzKG1vZHVsZV9zcGFjZSwgVHJ1ZSkKCiAgcHl0aG9uX3BhdGhfZW50cmllcyA9IFtHZXRXaW5kb3dzUGF0aFdpdGhVTkNQcmVmaXgoZCkgZm9yIGQgaW4gcHl0aG9uX3BhdGhfZW50cmllc10KCiAgb2xkX3B5dGhvbl9wYXRoID0gb3MuZW52aXJvbi5nZXQoJ1BZVEhPTlBBVEgnKQogIHB5dGhvbl9wYXRoID0gb3MucGF0aHNlcC5qb2luKHB5dGhvbl9wYXRoX2VudHJpZXMpCiAgaWYgb2xkX3B5dGhvbl9wYXRoOgogICAgcHl0aG9uX3BhdGggKz0gb3MucGF0aHNlcCArIG9sZF9weXRob25fcGF0aAoKICBpZiBJc1dpbmRvd3MoKToKICAgIHB5dGhvbl9wYXRoID0gcHl0aG9uX3BhdGgucmVwbGFjZSgiLyIsIG9zLnNlcCkKCiAgbmV3X2VudlsnUFlUSE9OUEFUSCddID0gcHl0aG9uX3BhdGgKICBydW5maWxlc19lbnZrZXksIHJ1bmZpbGVzX2VudnZhbHVlID0gUnVuZmlsZXNFbnZ2YXIobW9kdWxlX3NwYWNlKQogIGlmIHJ1bmZpbGVzX2VudmtleToKICAgIG5ld19lbnZbcnVuZmlsZXNfZW52a2V5XSA9IHJ1bmZpbGVzX2VudnZhbHVlCgogICMgTm93IGxvb2sgZm9yIG15IG1haW4gcHl0aG9uIHNvdXJjZSBmaWxlLgogICMgVGhlIG1hZ2ljIHN0cmluZyBwZXJjZW50LW1haW4tcGVyY2VudCBpcyByZXBsYWNlZCB3aXRoIHRoZSBmaWxlbmFtZSBvZiB0aGUKICAjIG1haW4gZmlsZSBvZiB0aGUgUHl0aG9uIGJpbmFyeSBpbiBCYXplbFB5dGhvblNlbWFudGljcy5qYXZhLgogIHJlbF9wYXRoID0gJ3J1bGVzX3B5dGhvbi9wYWNrYWdpbmcvcGlwdG9vbC5weScKICBpZiBJc1dpbmRvd3MoKToKICAgIHJlbF9wYXRoID0gcmVsX3BhdGgucmVwbGFjZSgiLyIsIG9zLnNlcCkKCiAgbWFpbl9maWxlbmFtZSA9IG9zLnBhdGguam9pbihtb2R1bGVfc3BhY2UsIHJlbF9wYXRoKQogIG1haW5fZmlsZW5hbWUgPSBHZXRXaW5kb3dzUGF0aFdpdGhVTkNQcmVmaXgobWFpbl9maWxlbmFtZSkKICBhc3NlcnQgb3MucGF0aC5leGlzdHMobWFpbl9maWxlbmFtZSksIFwKICAgICAgICAgJ0Nhbm5vdCBleGVjKCkgJXI6IGZpbGUgbm90IGZvdW5kLicgJSBtYWluX2ZpbGVuYW1lCiAgYXNzZXJ0IG9zLmFjY2VzcyhtYWluX2ZpbGVuYW1lLCBvcy5SX09LKSwgXAogICAgICAgICAnQ2Fubm90IGV4ZWMoKSAlcjogZmlsZSBub3QgcmVhZGFibGUuJyAlIG1haW5fZmlsZW5hbWUKCiAgcHJvZ3JhbSA9IHB5dGhvbl9wcm9ncmFtID0gRmluZFB5dGhvbkJpbmFyeShtb2R1bGVfc3BhY2UpCiAgaWYgcHl0aG9uX3Byb2dyYW0gaXMgTm9uZToKICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCdDb3VsZCBub3QgZmluZCBweXRob24gYmluYXJ5OiAnICsgUFlUSE9OX0JJTkFSWSkKICBhcmdzID0gW3B5dGhvbl9wcm9ncmFtLCBtYWluX2ZpbGVuYW1lXSArIGFyZ3MKCiAgb3MuZW52aXJvbi51cGRhdGUobmV3X2VudikKCiAgdHJ5OgogICAgc3lzLnN0ZG91dC5mbHVzaCgpCiAgICBpZiBJc1J1bm5pbmdGcm9tWmlwKCk6CiAgICAgICMgSWYgUlVOX1VOREVSX1JVTkZJTEVTIGVxdWFscyAxLCBpdCBtZWFucyB3ZSBuZWVkIHRvCiAgICAgICMgY2hhbmdlIGRpcmVjdG9yeSB0byB0aGUgcmlnaHQgcnVuZmlsZXMgZGlyZWN0b3J5LgogICAgICAjIChTbyB0aGF0IHRoZSBkYXRhIGZpbGVzIGFyZSBhY2Nlc3NpYmxlKQogICAgICBpZiBvcy5lbnZpcm9uLmdldCgiUlVOX1VOREVSX1JVTkZJTEVTIikgPT0gIjEiOgogICAgICAgIG9zLmNoZGlyKG9zLnBhdGguam9pbihtb2R1bGVfc3BhY2UsICJydWxlc19weXRob24iKSkKICAgICAgcmV0X2NvZGUgPSBzdWJwcm9jZXNzLmNhbGwoYXJncykKICAgICAgc2h1dGlsLnJtdHJlZShvcy5wYXRoLmRpcm5hbWUobW9kdWxlX3NwYWNlKSwgVHJ1ZSkKICAgICAgTWF5YmVFbWl0SG9zdFZlcnNpb25XYXJuaW5nKHJldF9jb2RlKQogICAgICBzeXMuZXhpdChyZXRfY29kZSkKICAgIGVsc2U6CiAgICAgICMgT24gV2luZG93cywgb3MuZXhlY3YgZG9lc24ndCBoYW5kbGUgYXJndW1lbnRzIHdpdGggc3BhY2VzIGNvcnJlY3RseSwKICAgICAgIyBhbmQgaXQgYWN0dWFsbHkgc3RhcnRzIGEgc3VicHJvY2VzcyBqdXN0IGxpa2Ugc3VicHJvY2Vzcy5jYWxsLgogICAgICAjCiAgICAgICMgSWYgd2UgbWF5IG5lZWQgdG8gZW1pdCBhIGhvc3QgY29uZmlnIHdhcm5pbmcgYWZ0ZXIgZXhlY3V0aW9uLCBkb24ndAogICAgICAjIGV4ZWN2IGJlY2F1c2Ugd2UgbmVlZCBjb250cm9sIHRvIHJldHVybiBoZXJlLiBUaGlzIG9ubHkgaGFwcGVucyBmb3IKICAgICAgIyB0YXJnZXRzIGJ1aWx0IGluIHRoZSBob3N0IGNvbmZpZywgc28gb3RoZXIgdGFyZ2V0cyBzdGlsbCBnZXQgdG8gdGFrZQogICAgICAjIGFkdmFudGFnZSBvZiB0aGUgcGVyZm9ybWFuY2UgYmVuZWZpdHMgb2YgZXhlY3YuCiAgICAgIGlmIElzV2luZG93cygpIG9yIEZhbHNlOgogICAgICAgIHJldF9jb2RlID0gc3VicHJvY2Vzcy5jYWxsKGFyZ3MpCiAgICAgICAgTWF5YmVFbWl0SG9zdFZlcnNpb25XYXJuaW5nKHJldF9jb2RlKQogICAgICAgIHN5cy5leGl0KHJldF9jb2RlKQogICAgICBlbHNlOgogICAgICAgIG9zLmV4ZWN2KGFyZ3NbMF0sIGFyZ3MpCiAgZXhjZXB0IEVudmlyb25tZW50RXJyb3I6CiAgICAjIFRoaXMgd29ya3MgZnJvbSBQeXRob24gMi40IGFsbCB0aGUgd2F5IHRvIDMueC4KICAgIGUgPSBzeXMuZXhjX2luZm8oKVsxXQogICAgIyBUaGlzIGV4Y2VwdGlvbiBvY2N1cnMgd2hlbiBvcy5leGVjdigpIGZhaWxzIGZvciBzb21lIHJlYXNvbi4KICAgIGlmIG5vdCBnZXRhdHRyKGUsICdmaWxlbmFtZScsIE5vbmUpOgogICAgICBlLmZpbGVuYW1lID0gcHJvZ3JhbSAgIyBBZGQgaW5mbyB0byBlcnJvciBtZXNzYWdlCiAgICByYWlzZQoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICBNYWluKCkKUEsDBBQAAAAAAAAAIQCwRhTkOR4AADkeAAAhAAAAcnVsZXNfcHl0aG9uL3BhY2thZ2luZy9waXB0b29sLnB5IyBDb3B5cmlnaHQgMjAxNyBUaGUgQmF6ZWwgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIwojIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwojIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKIwojICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAojCiMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQojIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAojIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoiIiJUaGUgcGlwdG9vbCBtb2R1bGUgaW1wb3J0cyBwaXAgcmVxdWlyZW1lbnRzIGludG8gQmF6ZWwgcnVsZXMuIiIiCgppbXBvcnQgYXJncGFyc2UKaW1wb3J0IGF0ZXhpdAppbXBvcnQganNvbgppbXBvcnQgb3MKaW1wb3J0IHBrZ3V0aWwKaW1wb3J0IHBrZ19yZXNvdXJjZXMKaW1wb3J0IHJlCmltcG9ydCBzaHV0aWwKaW1wb3J0IHN5cwppbXBvcnQgdGVtcGZpbGUKaW1wb3J0IHppcGZpbGUKCiMgTm90ZTogV2UgY2FyZWZ1bGx5IGltcG9ydCB0aGUgZm9sbG93aW5nIG1vZHVsZXMgaW4gYSBwYXJ0aWN1bGFyCiMgb3JkZXIsIHNpbmNlIHRoZXNlIG1vZHVsZXMgbW9kaWZ5IHRoZSBpbXBvcnQgcGF0aCBhbmQgbWFjaGluZXJ5LgppbXBvcnQgcGtnX3Jlc291cmNlcwoKCmRlZiBleHRyYWN0X3BhY2thZ2VzKHBhY2thZ2VfbmFtZXMpOgogICAgIiIiRXh0cmFjdCB6aXBmaWxlIGNvbnRlbnRzIHRvIGRpc2sgYW5kIGFkZCB0byBpbXBvcnQgcGF0aCIiIgoKICAgICMgU2V0IGEgc2FmZSBleHRyYWN0aW9uIGRpcgogICAgZXh0cmFjdGlvbl90bXBkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKICAgIGF0ZXhpdC5yZWdpc3RlcihsYW1iZGE6IHNodXRpbC5ybXRyZWUoCiAgICAgICAgZXh0cmFjdGlvbl90bXBkaXIsIGlnbm9yZV9lcnJvcnM9VHJ1ZSkpCiAgICBwa2dfcmVzb3VyY2VzLnNldF9leHRyYWN0aW9uX3BhdGgoZXh0cmFjdGlvbl90bXBkaXIpCgogICAgIyBFeHRyYWN0IGVhY2ggcGFja2FnZSB0byBkaXNrCiAgICBkaXJzX3RvX2FkZCA9IFtdCiAgICBmb3IgcGFja2FnZV9uYW1lIGluIHBhY2thZ2VfbmFtZXM6CiAgICAgICAgcmVxID0gcGtnX3Jlc291cmNlcy5SZXF1aXJlbWVudC5wYXJzZShwYWNrYWdlX25hbWUpCiAgICAgICAgZXh0cmFjdGlvbl9kaXIgPSBwa2dfcmVzb3VyY2VzLnJlc291cmNlX2ZpbGVuYW1lKHJlcSwgJycpCiAgICAgICAgZGlyc190b19hZGQuYXBwZW5kKGV4dHJhY3Rpb25fZGlyKQoKICAgICMgQWRkIGV4dHJhY3RlZCBkaXJlY3RvcmllcyB0byBpbXBvcnQgcGF0aCBhaGVhZCBvZiB0aGVpciB6aXAgZmlsZQogICAgIyBjb3VudGVycGFydHMuCiAgICBzeXMucGF0aFswOjBdID0gZGlyc190b19hZGQKICAgIGV4aXN0aW5nX3B5dGhvbnBhdGggPSBvcy5lbnZpcm9uLmdldCgnUFlUSE9OUEFUSCcpCiAgICBpZiBleGlzdGluZ19weXRob25wYXRoOgogICAgICAgIGRpcnNfdG9fYWRkLmV4dGVuZChleGlzdGluZ19weXRob25wYXRoLnNwbGl0KCc6JykpCiAgICBvcy5lbnZpcm9uWydQWVRIT05QQVRIJ10gPSAnOicuam9pbihkaXJzX3RvX2FkZCkKCgojIFdoZWVsLCBwaXAsIGFuZCBzZXR1cHRvb2xzIGFyZSBtdWNoIGhhcHBpZXIgcnVubmluZyBmcm9tIGFjdHVhbAojIGZpbGVzIG9uIGRpc2ssIHJhdGhlciB0aGFuIGVudHJpZXMgaW4gYSB6aXBmaWxlLiAgRXh0cmFjdCB6aXBmaWxlCiMgY29udGVudHMsIGFkZCB0aG9zZSBjb250ZW50cyB0byB0aGUgcGF0aCwgdGhlbiBpbXBvcnQgdGhlbS4KZXh0cmFjdF9wYWNrYWdlcyhbJ3BpcCcsICdzZXR1cHRvb2xzJywgJ3doZWVsJ10pCgojIERlZmVhdCBwaXAncyBhdHRlbXB0IHRvIG1hbmdsZSBzeXMucGF0aApzYXZlZF9zeXNfcGF0aCA9IHN5cy5wYXRoCnN5cy5wYXRoID0gc3lzLnBhdGhbOl0KaW1wb3J0IHBpcApzeXMucGF0aCA9IHNhdmVkX3N5c19wYXRoCgppbXBvcnQgc2V0dXB0b29scwppbXBvcnQgd2hlZWwKCgpkZWYgcGlwX21haW4oYXJndik6CiAgICAjIEV4dHJhY3QgdGhlIGNlcnRpZmljYXRlcyBmcm9tIHRoZSBQQVIgZm9sbG93aW5nIHRoZSBleGFtcGxlIG9mIGdldC1waXAucHkKICAgICMgaHR0cHM6Ly9naXRodWIuY29tL3B5cGEvZ2V0LXBpcC9ibG9iLzQzMGJhMzc3NzZhZTJhZDg5L3RlbXBsYXRlLnB5I0wxNjQtTDE2OAogICAgY2VydF90bXBkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKICAgIGNlcnRfcGF0aCA9IG9zLnBhdGguam9pbihjZXJ0X3RtcGRpciwgImNhY2VydC5wZW0iKQogICAgYXRleGl0LnJlZ2lzdGVyKGxhbWJkYTogc2h1dGlsLnJtdHJlZShjZXJ0X3RtcGRpciwgaWdub3JlX2Vycm9ycz1UcnVlKSkKICAgIHdpdGggb3BlbihjZXJ0X3BhdGgsICJ3YiIpIGFzIGNlcnQ6CiAgICAgIGNlcnQud3JpdGUocGtndXRpbC5nZXRfZGF0YSgicGlwLl92ZW5kb3IucmVxdWVzdHMiLCAiY2FjZXJ0LnBlbSIpKQogICAgYXJndiA9IFsiLS1pc29sYXRlZCIsICItLWRpc2FibGUtcGlwLXZlcnNpb24tY2hlY2siLCAiLS1jZXJ0IiwgY2VydF9wYXRoXSArIGFyZ3YKICAgIHJldHVybiBwaXAubWFpbihhcmd2KQoKZnJvbSBwYWNrYWdpbmcud2hsIGltcG9ydCBXaGVlbAoKcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoCiAgICBkZXNjcmlwdGlvbj0nSW1wb3J0IFB5dGhvbiBkZXBlbmRlbmNpZXMgaW50byBCYXplbC4nKQoKcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1weXRob25faW50ZXJwcmV0ZXInLCBhY3Rpb249J3N0b3JlJywKICAgICAgICAgICAgICAgICAgICBoZWxwPSgnVGhlIFB5dGhvbiBpbnRlcnByZXRlciB0byB1c2Ugd2hlbiBleHRyYWN0aW5nICcKICAgICAgICAgICAgICAgICAgICAgICAgICAnd2hlZWxzLicpKQoKcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1uYW1lJywgYWN0aW9uPSdzdG9yZScsCiAgICAgICAgICAgICAgICAgICAgaGVscD0oJ1RoZSBuYW1lc3BhY2Ugb2YgdGhlIGltcG9ydC4nKSkKCnBhcnNlci5hZGRfYXJndW1lbnQoJy0taW5wdXQnLCBhY3Rpb249J3N0b3JlJywKICAgICAgICAgICAgICAgICAgICBoZWxwPSgnVGhlIHJlcXVpcmVtZW50cy50eHQgZmlsZSB0byBpbXBvcnQuJykpCgpwYXJzZXIuYWRkX2FyZ3VtZW50KCctLW91dHB1dCcsIGFjdGlvbj0nc3RvcmUnLAogICAgICAgICAgICAgICAgICAgIGhlbHA9KCdUaGUgcmVxdWlyZW1lbnRzLmJ6bCBmaWxlIHRvIGV4cG9ydC4nKSkKCnBhcnNlci5hZGRfYXJndW1lbnQoJy0tZGlyZWN0b3J5JywgYWN0aW9uPSdzdG9yZScsCiAgICAgICAgICAgICAgICAgICAgaGVscD0oJ1RoZSBkaXJlY3RvcnkgaW50byB3aGljaCB0byBwdXQgLndobCBmaWxlcy4nKSkKCmRlZiBkZXRlcm1pbmVfcG9zc2libGVfZXh0cmFzKHdobHMpOgogICIiIkRldGVybWluZXMgdGhlIGxpc3Qgb2YgcG9zc2libGUgImV4dHJhcyIgZm9yIGVhY2ggLndobAoKICBUaGUgcG9zc2liaWxpdHkgb2YgYW4gZXh0cmEgaXMgZGV0ZXJtaW5lZCBieSBsb29raW5nIGF0IGl0cwogIGFkZGl0aW9uYWwgcmVxdWlyZW1lbnRzLCBhbmQgZGV0ZXJtaW5pbmUgd2hldGhlciB0aGV5IGFyZQogIHNhdGlzZmllZCBieSB0aGUgY29tcGxldGUgbGlzdCBvZiBhdmFpbGFibGUgd2hlZWxzLgoKICBBcmdzOgogICAgd2hsczogYSBsaXN0IG9mIFdoZWVsIG9iamVjdHMKCiAgUmV0dXJuczoKICAgIGEgZGljdCB0aGF0IGlzIGtleWVkIGJ5IHRoZSBXaGVlbCBvYmplY3RzIGluIHdobHMsIGFuZCB3aG9zZQogICAgdmFsdWVzIGFyZSBsaXN0cyBvZiBwb3NzaWJsZSBleHRyYXMuCiAgIiIiCiAgd2hsX21hcCA9IHsKICAgIHdobC5kaXN0cmlidXRpb24oKTogd2hsCiAgICBmb3Igd2hsIGluIHdobHMKICB9CgogICMgVE9ETyhtYXR0bW9vcik6IENvbnNpZGVyIG1lbW9pemluZyBpZiB0aGlzIHJlY3Vyc2lvbiBldmVyIGJlY29tZXMKICAjIGV4cGVuc2l2ZSBlbm91Z2ggdG8gd2FycmFudCBpdC4KICBkZWYgaXNfcG9zc2libGUoZGlzdHJvLCBleHRyYSk6CiAgICBkaXN0cm8gPSBkaXN0cm8ucmVwbGFjZSgiLSIsICJfIikKICAgICMgSWYgd2UgZG9uJ3QgaGF2ZSB0aGUgLndobCBhdCBhbGwsIHRoZW4gdGhpcyBpc24ndCBwb3NzaWJsZS4KICAgIGlmIGRpc3RybyBub3QgaW4gd2hsX21hcDoKICAgICAgcmV0dXJuIEZhbHNlCiAgICB3aGwgPSB3aGxfbWFwW2Rpc3Ryb10KICAgICMgSWYgd2UgaGF2ZSB0aGUgLndobCwgYW5kIHdlIGRvbid0IG5lZWQgYW55dGhpbmcgZXh0cmEgdGhlbgogICAgIyB3ZSBjYW4gc2F0aXNmeSB0aGlzIGRlcGVuZGVuY3kuCiAgICBpZiBub3QgZXh0cmE6CiAgICAgIHJldHVybiBUcnVlCiAgICAjIElmIHdlIGRvIG5lZWQgc29tZXRoaW5nIGV4dHJhLCB0aGVuIGNoZWNrIHRoZSBleHRyYSdzCiAgICAjIGRlcGVuZGVuY2llcyB0byBtYWtlIHN1cmUgdGhleSBhcmUgZnVsbHkgc2F0aXNmaWVkLgogICAgZm9yIGV4dHJhX2RlcCBpbiB3aGwuZGVwZW5kZW5jaWVzKGV4dHJhPWV4dHJhKToKICAgICAgcmVxID0gcGtnX3Jlc291cmNlcy5SZXF1aXJlbWVudC5wYXJzZShleHRyYV9kZXApCiAgICAgICMgQ2hlY2sgdGhhdCB0aGUgZGVwIGFuZCBhbnkgZXh0cmFzIGFyZSBhbGwgcG9zc2libGUuCiAgICAgIGlmIG5vdCBpc19wb3NzaWJsZShyZXEucHJvamVjdF9uYW1lLCBOb25lKToKICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgZm9yIGUgaW4gcmVxLmV4dHJhczoKICAgICAgICBpZiBub3QgaXNfcG9zc2libGUocmVxLnByb2plY3RfbmFtZSwgZSk6CiAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICMgSWYgYWxsIG9mIHRoZSBkZXBlbmRlbmNpZXMgb2YgdGhlIGV4dHJhIGFyZSBzYXRpc2ZpYWJsZSB0aGVuCiAgICAjIGl0IGlzIHBvc3NpYmxlIHRvIGNvbnN0cnVjdCB0aGlzIGRlcGVuZGVuY3kuCiAgICByZXR1cm4gVHJ1ZQoKICByZXR1cm4gewogICAgd2hsOiBbCiAgICAgIGV4dHJhCiAgICAgIGZvciBleHRyYSBpbiB3aGwuZXh0cmFzKCkKICAgICAgaWYgaXNfcG9zc2libGUod2hsLmRpc3RyaWJ1dGlvbigpLCBleHRyYSkKICAgIF0KICAgIGZvciB3aGwgaW4gd2hscwogIH0KCmRlZiBtYWluKCk6CiAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKCiAgIyBodHRwczovL2dpdGh1Yi5jb20vcHlwYS9waXAvYmxvYi85LjAuMS9waXAvX19pbml0X18ucHkjTDIwOQogIGlmIHBpcF9tYWluKFsid2hlZWwiLCAiLXciLCBhcmdzLmRpcmVjdG9yeSwgIi1yIiwgYXJncy5pbnB1dF0pOgogICAgc3lzLmV4aXQoMSkKCiAgIyBFbnVtZXJhdGUgdGhlIC53aGwgZmlsZXMgd2UgZG93bmxvYWRlZC4KICBkZWYgbGlzdF93aGxzKCk6CiAgICBkaXIgPSBhcmdzLmRpcmVjdG9yeSArICcvJwogICAgZm9yIHJvb3QsIHVudXNlZF9kaXJuYW1lcywgZmlsZW5hbWVzIGluIG9zLndhbGsoZGlyKToKICAgICAgZm9yIGZuYW1lIGluIGZpbGVuYW1lczoKICAgICAgICBpZiBmbmFtZS5lbmRzd2l0aCgnLndobCcpOgogICAgICAgICAgeWllbGQgb3MucGF0aC5qb2luKHJvb3QsIGZuYW1lKQoKICB3aGxzID0gW1doZWVsKHBhdGgpIGZvciBwYXRoIGluIGxpc3Rfd2hscygpXQogIHBvc3NpYmxlX2V4dHJhcyA9IGRldGVybWluZV9wb3NzaWJsZV9leHRyYXMod2hscykKCiAgZGVmIHdobF9saWJyYXJ5KHdoZWVsKToKICAgICMgSW5kZW50YXRpb24gaGVyZSBtYXR0ZXJzLiAgd2hsX2xpYnJhcnkgbXVzdCBiZSB3aXRoaW4gdGhlIHNjb3BlCiAgICAjIG9mIHRoZSBmdW5jdGlvbiBiZWxvdy4gIFdlIGFsc28gYXZvaWQgcmVpbXBvcnRpbmcgYW4gZXhpc3RpbmcgV0hMLgogICAgcmV0dXJuICIiIgogIGlmICJ7cmVwb19uYW1lfSIgbm90IGluIG5hdGl2ZS5leGlzdGluZ19ydWxlcygpOgogICAgd2hsX2xpYnJhcnkoCiAgICAgICAgbmFtZSA9ICJ7cmVwb19uYW1lfSIsCiAgICAgICAgcHl0aG9uX2ludGVycHJldGVyID0gIntweXRob25faW50ZXJwcmV0ZXJ9IiwKICAgICAgICB3aGwgPSAiQHtuYW1lfS8vOntwYXRofSIsCiAgICAgICAgcmVxdWlyZW1lbnRzID0gIkB7bmFtZX0vLzpyZXF1aXJlbWVudHMuYnpsIiwKICAgICAgICBleHRyYXMgPSBbe2V4dHJhc31dCiAgICApIiIiLmZvcm1hdChuYW1lPWFyZ3MubmFtZSwgcmVwb19uYW1lPXdoZWVsLnJlcG9zaXRvcnlfbmFtZSgpLAogICAgICAgICAgICAgICAgcHl0aG9uX2ludGVycHJldGVyPWFyZ3MucHl0aG9uX2ludGVycHJldGVyLAogICAgICAgICAgICAgICAgcGF0aD13aGVlbC5iYXNlbmFtZSgpLAogICAgICAgICAgICAgICAgZXh0cmFzPScsJy5qb2luKFsKICAgICAgICAgICAgICAgICAgJyIlcyInICUgZXh0cmEKICAgICAgICAgICAgICAgICAgZm9yIGV4dHJhIGluIHBvc3NpYmxlX2V4dHJhcy5nZXQod2hlZWwsIFtdKQogICAgICAgICAgICAgICAgXSkpCgogIHdobF90YXJnZXRzID0gJywnLmpvaW4oWwogICAgJywnLmpvaW4oWwogICAgICAnIiVzIjogIkAlcy8vOnBrZyInICUgKHdobC5kaXN0cmlidXRpb24oKS5sb3dlcigpLCB3aGwucmVwb3NpdG9yeV9uYW1lKCkpCiAgICBdICsgWwogICAgICAjIEZvciBldmVyeSBleHRyYSB0aGF0IGlzIHBvc3NpYmxlIGZyb20gdGhpcyByZXF1aXJlbWVudHMudHh0CiAgICAgICciJXNbJXNdIjogIkAlcy8vOiVzIicgJSAod2hsLmRpc3RyaWJ1dGlvbigpLmxvd2VyKCksIGV4dHJhLmxvd2VyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hsLnJlcG9zaXRvcnlfbmFtZSgpLCBleHRyYSkKICAgICAgZm9yIGV4dHJhIGluIHBvc3NpYmxlX2V4dHJhcy5nZXQod2hsLCBbXSkKICAgIF0pCiAgICBmb3Igd2hsIGluIHdobHMKICBdKQoKICB3aXRoIG9wZW4oYXJncy5vdXRwdXQsICd3JykgYXMgZjoKICAgIGYud3JpdGUoIiIiXAojIEluc3RhbGwgcGlwIHJlcXVpcmVtZW50cy4KIwojIEdlbmVyYXRlZCBmcm9tIHtpbnB1dH0KCmxvYWQoIkBydWxlc19weXRob24vL3B5dGhvbjp3aGwuYnpsIiwgIndobF9saWJyYXJ5IikKCmRlZiBwaXBfaW5zdGFsbCgpOgogIHt3aGxfbGlicmFyaWVzfQoKX3JlcXVpcmVtZW50cyA9IHt7CiAge21hcHBpbmdzfQp9fQoKYWxsX3JlcXVpcmVtZW50cyA9IF9yZXF1aXJlbWVudHMudmFsdWVzKCkKCmRlZiByZXF1aXJlbWVudChuYW1lKToKICBuYW1lX2tleSA9IG5hbWUucmVwbGFjZSgiLSIsICJfIikubG93ZXIoKQogIGlmIG5hbWVfa2V5IG5vdCBpbiBfcmVxdWlyZW1lbnRzOgogICAgZmFpbCgiQ291bGQgbm90IGZpbmQgcGlwLXByb3ZpZGVkIGRlcGVuZGVuY3k6ICclcyciICUgbmFtZSkKICByZXR1cm4gX3JlcXVpcmVtZW50c1tuYW1lX2tleV0KIiIiLmZvcm1hdChpbnB1dD1hcmdzLmlucHV0LAogICAgICAgICAgIHdobF9saWJyYXJpZXM9J1xuJy5qb2luKG1hcCh3aGxfbGlicmFyeSwgd2hscykpIGlmIHdobHMgZWxzZSAicGFzcyIsCiAgICAgICAgICAgbWFwcGluZ3M9d2hsX3RhcmdldHMpKQoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICBtYWluKCkKUEsDBBQAAAAAAAAAIQDOTVmyYBYAAGAWAAAdAAAAcnVsZXNfcHl0aG9uL3BhY2thZ2luZy93aGwucHkjIENvcHlyaWdodCAyMDE3IFRoZSBCYXplbCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgojCiMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgojIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAojCiMgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiMKIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiIiIlRoZSB3aGwgbW9kdWxlcyBkZWZpbmVzIGNsYXNzZXMgZm9yIGludGVyYWN0aW5nIHdpdGggUHl0aG9uIHBhY2thZ2VzLiIiIgoKaW1wb3J0IGFyZ3BhcnNlCmltcG9ydCBqc29uCmltcG9ydCBvcwppbXBvcnQgcGtnX3Jlc291cmNlcwppbXBvcnQgcmUKaW1wb3J0IHppcGZpbGUKCgpjbGFzcyBXaGVlbChvYmplY3QpOgoKICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCk6CiAgICBzZWxmLl9wYXRoID0gcGF0aAoKICBkZWYgcGF0aChzZWxmKToKICAgIHJldHVybiBzZWxmLl9wYXRoCgogIGRlZiBiYXNlbmFtZShzZWxmKToKICAgIHJldHVybiBvcy5wYXRoLmJhc2VuYW1lKHNlbGYucGF0aCgpKQoKICBkZWYgZGlzdHJpYnV0aW9uKHNlbGYpOgogICAgIyBTZWUgaHR0cHM6Ly93d3cucHl0aG9uLm9yZy9kZXYvcGVwcy9wZXAtMDQyNy8jZmlsZS1uYW1lLWNvbnZlbnRpb24KICAgIHBhcnRzID0gc2VsZi5iYXNlbmFtZSgpLnNwbGl0KCctJykKICAgIHJldHVybiBwYXJ0c1swXQoKICBkZWYgdmVyc2lvbihzZWxmKToKICAgICMgU2VlIGh0dHBzOi8vd3d3LnB5dGhvbi5vcmcvZGV2L3BlcHMvcGVwLTA0MjcvI2ZpbGUtbmFtZS1jb252ZW50aW9uCiAgICBwYXJ0cyA9IHNlbGYuYmFzZW5hbWUoKS5zcGxpdCgnLScpCiAgICByZXR1cm4gcGFydHNbMV0KCiAgZGVmIHJlcG9zaXRvcnlfbmFtZShzZWxmKToKICAgICMgUmV0dXJucyB0aGUgY2Fub25pY2FsIG5hbWUgb2YgdGhlIEJhemVsIHJlcG9zaXRvcnkgZm9yIHRoaXMgcGFja2FnZS4KICAgIGNhbm9uaWNhbCA9ICdweXBpX197fV97fScuZm9ybWF0KHNlbGYuZGlzdHJpYnV0aW9uKCksIHNlbGYudmVyc2lvbigpKQogICAgIyBFc2NhcGUgYW55IGlsbGVnYWwgY2hhcmFjdGVycyB3aXRoIHVuZGVyc2NvcmUuCiAgICByZXR1cm4gcmUuc3ViKCdbLS4rXScsICdfJywgY2Fub25pY2FsKQoKICBkZWYgX2Rpc3RfaW5mbyhzZWxmKToKICAgICMgUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBkaXN0LWluZm8gZGlyZWN0b3J5IHdpdGhpbiB0aGUgLndobCBmaWxlLgogICAgIyBlLmcuIGdvb2dsZV9jbG91ZC0wLjI3LjAtcHkyLnB5My1ub25lLWFueS53aGwgLT4KICAgICMgICAgICBnb29nbGVfY2xvdWQtMC4yNy4wLmRpc3QtaW5mbwogICAgcmV0dXJuICd7fS17fS5kaXN0LWluZm8nLmZvcm1hdChzZWxmLmRpc3RyaWJ1dGlvbigpLCBzZWxmLnZlcnNpb24oKSkKCiAgZGVmIG1ldGFkYXRhKHNlbGYpOgogICAgIyBFeHRyYWN0IHRoZSBzdHJ1Y3R1cmVkIGRhdGEgZnJvbSBtZXRhZGF0YS5qc29uIGluIHRoZSBXSEwncyBkaXN0LWluZm8KICAgICMgZGlyZWN0b3J5LgogICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoc2VsZi5wYXRoKCksICdyJykgYXMgd2hsOgogICAgICAjIGZpcnN0IGNoZWNrIGZvciBtZXRhZGF0YS5qc29uCiAgICAgIHRyeToKICAgICAgICB3aXRoIHdobC5vcGVuKHNlbGYuX2Rpc3RfaW5mbygpICsgJy9tZXRhZGF0YS5qc29uJykgYXMgZjoKICAgICAgICAgIHJldHVybiBqc29uLmxvYWRzKGYucmVhZCgpLmRlY29kZSgidXRmLTgiKSkKICAgICAgZXhjZXB0IEtleUVycm9yOgogICAgICAgICAgcGFzcwogICAgICAjIGZhbGwgYmFjayB0byBNRVRBREFUQSBmaWxlIChodHRwczovL3d3dy5weXRob24ub3JnL2Rldi9wZXBzL3BlcC0wNDI3LykKICAgICAgd2l0aCB3aGwub3BlbihzZWxmLl9kaXN0X2luZm8oKSArICcvTUVUQURBVEEnKSBhcyBmOgogICAgICAgIHJldHVybiBzZWxmLl9wYXJzZV9tZXRhZGF0YShmLnJlYWQoKS5kZWNvZGUoInV0Zi04IikpCgogIGRlZiBuYW1lKHNlbGYpOgogICAgcmV0dXJuIHNlbGYubWV0YWRhdGEoKS5nZXQoJ25hbWUnKQoKICBkZWYgZGVwZW5kZW5jaWVzKHNlbGYsIGV4dHJhPU5vbmUpOgogICAgIiIiQWNjZXNzIHRoZSBkZXBlbmRlbmNpZXMgb2YgdGhpcyBXaGVlbC4KCiAgICBBcmdzOgogICAgICBleHRyYTogaWYgc3BlY2lmaWVkLCBpbmNsdWRlIHRoZSBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcwogICAgICAgICAgICBvZiB0aGUgbmFtZWQgImV4dHJhIi4KCiAgICBZaWVsZHM6CiAgICAgIHRoZSBuYW1lcyBvZiByZXF1aXJlbWVudHMgZnJvbSB0aGUgbWV0YWRhdGEuanNvbgogICAgIiIiCiAgICAjIFRPRE8obWF0dG1vb3IpOiBJcyB0aGVyZSBhIHNjaGVtYSB0byBmb2xsb3cgZm9yIHRoaXM/CiAgICBkZXBlbmRlbmN5X3NldCA9IHNldCgpCgogICAgcnVuX3JlcXVpcmVzID0gc2VsZi5tZXRhZGF0YSgpLmdldCgncnVuX3JlcXVpcmVzJywgW10pCiAgICBmb3IgcmVxdWlyZW1lbnQgaW4gcnVuX3JlcXVpcmVzOgogICAgICBpZiByZXF1aXJlbWVudC5nZXQoJ2V4dHJhJykgIT0gZXh0cmE6CiAgICAgICAgIyBNYXRjaCB0aGUgcmVxdWlyZW1lbnRzIGZvciB0aGUgZXh0cmEgd2UncmUgbG9va2luZyBmb3IuCiAgICAgICAgY29udGludWUKICAgICAgbWFya2VyID0gcmVxdWlyZW1lbnQuZ2V0KCdlbnZpcm9ubWVudCcpCiAgICAgIGlmIG1hcmtlciBhbmQgbm90IHBrZ19yZXNvdXJjZXMuZXZhbHVhdGVfbWFya2VyKG1hcmtlcik6CiAgICAgICAgIyBUaGUgY3VycmVudCBlbnZpcm9ubWVudCBkb2VzIG5vdCBtYXRjaCB0aGUgcHJvdmlkZWQgUEVQIDUwOCBtYXJrZXIsCiAgICAgICAgIyBzbyBpZ25vcmUgdGhpcyByZXF1aXJlbWVudC4KICAgICAgICBjb250aW51ZQogICAgICByZXF1aXJlcyA9IHJlcXVpcmVtZW50LmdldCgncmVxdWlyZXMnLCBbXSkKICAgICAgZm9yIGVudHJ5IGluIHJlcXVpcmVzOgogICAgICAgICMgU3RyaXAgb2ZmIGFueSB0cmFpbGluZyB2ZXJzaW9uaW5nIGRhdGEuCiAgICAgICAgcGFydHMgPSByZS5zcGxpdCgnWyA+PD0oKV0nLCBlbnRyeSkKICAgICAgICBkZXBlbmRlbmN5X3NldC5hZGQocGFydHNbMF0pCgogICAgcmV0dXJuIGRlcGVuZGVuY3lfc2V0CgogIGRlZiBleHRyYXMoc2VsZik6CiAgICByZXR1cm4gc2VsZi5tZXRhZGF0YSgpLmdldCgnZXh0cmFzJywgW10pCgogIGRlZiBleHBhbmQoc2VsZiwgZGlyZWN0b3J5KToKICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKHNlbGYucGF0aCgpLCAncicpIGFzIHdobDoKICAgICAgd2hsLmV4dHJhY3RhbGwoZGlyZWN0b3J5KQoKICAjIF9wYXJzZV9tZXRhZGF0YSBwYXJzZXMgTUVUQURBVEEgZmlsZXMgYWNjb3JkaW5nIHRvIGh0dHBzOi8vd3d3LnB5dGhvbi5vcmcvZGV2L3BlcHMvcGVwLTAzMTQvCiAgZGVmIF9wYXJzZV9tZXRhZGF0YShzZWxmLCBjb250ZW50KToKICAgICMgVE9ETzogaGFuZGxlIGZpZWxkcyBvdGhlciB0aGFuIGp1c3QgbmFtZQogICAgbmFtZV9wYXR0ZXJuID0gcmUuY29tcGlsZSgnTmFtZTogKC4qKScpCiAgICByZXR1cm4geyAnbmFtZSc6IG5hbWVfcGF0dGVybi5zZWFyY2goY29udGVudCkuZ3JvdXAoMSkgfQoKCnBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKAogICAgZGVzY3JpcHRpb249J1VucGFjayBhIFdITCBmaWxlIGFzIGEgcHlfbGlicmFyeS4nKQoKcGFyc2VyLmFkZF9hcmd1bWVudCgnLS13aGwnLCBhY3Rpb249J3N0b3JlJywKICAgICAgICAgICAgICAgICAgICBoZWxwPSgnVGhlIC53aGwgZmlsZSB3ZSBhcmUgZXhwYW5kaW5nLicpKQoKcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1yZXF1aXJlbWVudHMnLCBhY3Rpb249J3N0b3JlJywKICAgICAgICAgICAgICAgICAgICBoZWxwPSdUaGUgcGlwX2ltcG9ydCBmcm9tIHdoaWNoIHRvIGRyYXcgZGVwZW5kZW5jaWVzLicpCgpwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWRpcmVjdG9yeScsIGFjdGlvbj0nc3RvcmUnLCBkZWZhdWx0PScuJywKICAgICAgICAgICAgICAgICAgICBoZWxwPSdUaGUgZGlyZWN0b3J5IGludG8gd2hpY2ggdG8gZXhwYW5kIHRoaW5ncy4nKQoKcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1leHRyYXMnLCBhY3Rpb249J2FwcGVuZCcsCiAgICAgICAgICAgICAgICAgICAgaGVscD0nVGhlIHNldCBvZiBleHRyYXMgZm9yIHdoaWNoIHRvIGdlbmVyYXRlIGxpYnJhcnkgdGFyZ2V0cy4nKQoKZGVmIG1haW4oKToKICBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQogIHdobCA9IFdoZWVsKGFyZ3Mud2hsKQoKICAjIEV4dHJhY3QgdGhlIGZpbGVzIGludG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5CiAgd2hsLmV4cGFuZChhcmdzLmRpcmVjdG9yeSkKCiAgd2l0aCBvcGVuKG9zLnBhdGguam9pbihhcmdzLmRpcmVjdG9yeSwgJ0JVSUxEJyksICd3JykgYXMgZjoKICAgIGYud3JpdGUoIiIiCnBhY2thZ2UoZGVmYXVsdF92aXNpYmlsaXR5ID0gWyIvL3Zpc2liaWxpdHk6cHVibGljIl0pCgpsb2FkKCJAcnVsZXNfcHl0aG9uLy9weXRob246ZGVmcy5iemwiLCAicHlfbGlicmFyeSIpCmxvYWQoIntyZXF1aXJlbWVudHN9IiwgInJlcXVpcmVtZW50IikKCnB5X2xpYnJhcnkoCiAgICBuYW1lID0gInBrZyIsCiAgICBzcmNzID0gZ2xvYihbIioqLyoucHkiXSksCiAgICBkYXRhID0gZ2xvYihbIioqLyoiXSwgZXhjbHVkZT1bIioqLyoucHkiLCAiKiovKiAqIiwgIkJVSUxEIiwgIldPUktTUEFDRSJdKSwKICAgICMgVGhpcyBtYWtlcyB0aGlzIGRpcmVjdG9yeSBhIHRvcC1sZXZlbCBpbiB0aGUgcHl0aG9uIGltcG9ydAogICAgIyBzZWFyY2ggcGF0aCBmb3IgYW55dGhpbmcgdGhhdCBkZXBlbmRzIG9uIHRoaXMuCiAgICBpbXBvcnRzID0gWyIuIl0sCiAgICBkZXBzID0gW3tkZXBlbmRlbmNpZXN9XSwKKQp7ZXh0cmFzfSIiIi5mb3JtYXQoCiAgcmVxdWlyZW1lbnRzPWFyZ3MucmVxdWlyZW1lbnRzLAogIGRlcGVuZGVuY2llcz0nLCcuam9pbihbCiAgICAncmVxdWlyZW1lbnQoIiVzIiknICUgZAogICAgZm9yIGQgaW4gd2hsLmRlcGVuZGVuY2llcygpCiAgXSksCiAgZXh0cmFzPSdcblxuJy5qb2luKFsKICAgICIiInB5X2xpYnJhcnkoCiAgICBuYW1lID0gIntleHRyYX0iLAogICAgZGVwcyA9IFsKICAgICAgICAiOnBrZyIse2RlcHN9CiAgICBdLAopIiIiLmZvcm1hdChleHRyYT1leHRyYSwKICAgICAgICAgICAgZGVwcz0nLCcuam9pbihbCiAgICAgICAgICAgICAgICAncmVxdWlyZW1lbnQoIiVzIiknICUgZGVwCiAgICAgICAgICAgICAgICBmb3IgZGVwIGluIHdobC5kZXBlbmRlbmNpZXMoZXh0cmEpCiAgICAgICAgICAgIF0pKQogICAgZm9yIGV4dHJhIGluIGFyZ3MuZXh0cmFzIG9yIFtdCiAgXSkpKQoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICBtYWluKCkKUEsDBBQAAAAAAAAAIQAAAAAAAAAAAAAAAAASAAAAc3VicGFyL19faW5pdF9fLnB5UEsDBBQAAAAAAAAAIQAAAAAAAAAAAAAAAAAaAAAAc3VicGFyL3J1bnRpbWUvX19pbml0X18ucHlQSwMEFAAAAAAAAAAhAI+gczy3LgAAty4AABkAAABzdWJwYXIvcnVudGltZS9zdXBwb3J0LnB5IyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgojCiMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgojIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAojCiMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAojCiMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQojIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAojIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoKIiIiUnVudGltZSBzdXBwb3J0IGNvZGUgZm9yIGV4ZWN1dGFibGVzIGNyZWF0ZWQgYnkgU3VicGFyLgoKMS4gVGhpcmQtcGFydHkgbW9kdWxlcyByZXF1aXJlIHNvbWUgUFlUSE9OUEFUSCBtYW5pcHVsYXRpb24uCgoyLiBQeXRob24gY2FuIG5hdGl2ZWx5IGltcG9ydCBweXRob24gbW9kdWxlcyBmcm9tIGEgemlwIGFyY2hpdmUsIGJ1dAogICBDIGV4dGVuc2lvbiBtb2R1bGVzIHJlcXVpcmUgc29tZSBoZWxwLgoKMy4gUmVzb3VyY2VzIHN0b3JlZCBpbiBhIC5wYXIgZmlsZSBtYXkgbmVlZCB0byBiZSBleHBvc2VkIGFzIE9TLWxldmVsCiAgIGZpbGVzIGluc3RlYWQgb2YgUHl0aG9uIEZpbGUgb2JqZWN0cy4KCldlIGhvb2sgaW50byB0aGUgcGtnX3Jlc291cmNlcyBtb2R1bGUsIGlmIHByZXNlbnQsIHRvIGFjaGlldmUgMiBhbmQgMy4KCkxpbWl0YXRpb25zOgoKQS4gUmV0cmlldmluZyByZXNvdXJjZXMgZnJvbSBwYWNrYWdlcwoKSXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIGRvIHRoaXM6CiAgICBmbiA9IHBrZ19yZXNvdXJjZXMucmVzb3VyY2VfZmlsZW5hbWUoJ215cGFja2FnZScsICdteWZpbGUnKQpCdXQgaW5zdGVhZCBvbmUgbXVzdCBkbwogICAgZm4gPSBwa2dfcmVzb3VyY2VzLnJlc291cmNlX2ZpbGVuYW1lKAogICAgICAgICAgICAgcGtnX3Jlc291cmNlcy5SZXF1aXJlbWVudC5wYXJzZS5zcGVjKCdteXBhY2thZ2UnKSwKICAgICAgICAgICAgICdteWZpbGUnKQoKQi4gRXh0cmFjdGlvbiBkaXIKCllvdSBzaG91bGQgZXhwbGljaXRseSBzZXQgdGhlIGRlZmF1bHQgZXh0cmFjdGlvbiBkaXJlY3RvcnksIHZpYQpgcGtnX3Jlc291cmNlcy5zZXRfZXh0cmFjdGlvbl9wYXRoKG15X2RpcmVjdG9yeSlgLCBzaW5jZSB0aGUgZGVmYXVsdAppcyBub3Qgc2FmZS4gIEZvciBleGFtcGxlOgoKICAgIHRtcGRpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQogICAgcGtnX3Jlc291cmNlcy5zZXRfZXh0cmFjdGlvbih0bXBkaXIpCgpZb3Ugc2hvdWxkIGFycmFuZ2UgZm9yIHRoYXQgZGlyZWN0b3J5IHRvIGJlIGRlbGV0ZWQgYXQgc29tZSBwb2ludC4KTm90ZSB0aGF0IHBrZ19yZXNvdXJjZXMuY2xlYW51cF9yZXNvdXJjZXMoKSBpcyBhbiB1bmltcGxlbWVudGVkIG5vLW9wLApzbyB1c2Ugc29tZXRoaW5nIGVsc2UuICBGb3IgZXhhbXBsZToKCiAgICBhdGV4aXQucmVnaXN0ZXIobGFtYmRhOiBzaHV0aWwucm10cmVlKHRtcGRpciwgaWdub3JlX2Vycm9ycz1UcnVlKSkKCiIiIgoKaW1wb3J0IGF0ZXhpdAppbXBvcnQgb3MKaW1wb3J0IHBrZ3V0aWwKaW1wb3J0IHNodXRpbAppbXBvcnQgc3lzCmltcG9ydCB0ZW1wZmlsZQppbXBvcnQgd2FybmluZ3MKaW1wb3J0IHppcGZpbGUKaW1wb3J0IHppcGltcG9ydAoKCmRlZiBfbG9nKG1zZyk6CiAgICAiIiJQcmludCBhIGRlYnVnZ2luZyBtZXNzYWdlIGluIHRoZSBzYW1lIGZvcm1hdCBhcyBweXRob24gLXZ2IG91dHB1dCIiIgogICAgaWYgc3lzLmZsYWdzLnZlcmJvc2U6CiAgICAgICAgc3lzLnN0ZGVyci53cml0ZShtc2cpCiAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgnXG4nKQoKCmRlZiBfZmluZF9hcmNoaXZlKCk6CiAgICAiIiJGaW5kIHRoZSBwYXRoIHRvIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIC5wYXIgZmlsZQoKICAgIFdlIGRvbid0IGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBwcmVmaXggaXMgbm9uLWVtcHR5LgogICAgIiIiCiAgICBtYWluID0gc3lzLm1vZHVsZXMuZ2V0KCdfX21haW5fXycpCiAgICBpZiBub3QgbWFpbjoKICAgICAgICBfbG9nKCcjIF9fbWFpbl9fIG1vZHVsZSBub3QgZm91bmQnKQogICAgICAgIHJldHVybiBOb25lCiAgICBtYWluX2xvYWRlciA9IGdldGF0dHIobWFpbiwgJ19fbG9hZGVyX18nKQogICAgaWYgbm90IG1haW5fbG9hZGVyOgogICAgICAgIF9sb2coJyMgX19tYWluX18uX19sb2FkZXJfXyBub3Qgc2V0JykKICAgICAgICByZXR1cm4gTm9uZQogICAgcHJlZml4ID0gZ2V0YXR0cihtYWluX2xvYWRlciwgJ3ByZWZpeCcpCiAgICBpZiBwcmVmaXggIT0gJyc6CiAgICAgICAgX2xvZygnIyB1bmV4cGVjdGVkIHByZWZpeCBmb3IgX19tYWluX18uX19sb2FkZXJfXyBpcyAlcycgJQogICAgICAgICAgICAgbWFpbl9sb2FkZXIucHJlZml4KQogICAgICAgIHJldHVybiBOb25lCiAgICBhcmNoaXZlX3BhdGggPSBnZXRhdHRyKG1haW5fbG9hZGVyLCAnYXJjaGl2ZScpCiAgICBpZiBub3QgYXJjaGl2ZV9wYXRoOgogICAgICAgIF9sb2coJyMgbWlzc2luZyBhcmNoaXZlIGZvciBfX21haW5fXy5fX2xvYWRlcl9fJykKICAgICAgICByZXR1cm4gTm9uZQogICAgcmV0dXJuIGFyY2hpdmVfcGF0aAoKCmRlZiBfZXh0cmFjdF9maWxlcyhhcmNoaXZlX3BhdGgpOgogICAgIiIiRXh0cmFjdCB0aGUgY29udGVudHMgb2YgdGhpcyAucGFyIGZpbGUgdG8gZGlzay4KCiAgICBUaGlzIGNyZWF0ZXMgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5LCBhbmQgcmVnaXN0ZXJzIGFuIGF0ZXhpdAogICAgaGFuZGxlciB0byBjbGVhbiB0aGF0IGRpcmVjdG9yeSBvbiBwcm9ncmFtIGV4aXQuICBFeHRyYWN0aW9uIGFuZAogICAgY2xlYW51cCB3aWxsIHBvdGVudGlhbGx5IHVzZSBzaWduaWZpY2FudCB0aW1lIGFuZCBkaXNrIHNwYWNlLgoKICAgIFJldHVybnM6CiAgICAgICAgRGlyZWN0b3J5IHdoZXJlIGNvbnRlbnRzIHdlcmUgZXh0cmFjdGVkIHRvLgogICAgIiIiCiAgICBleHRyYWN0X2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQoKICAgIGRlZiBfZXh0cmFjdF9maWxlc19jbGVhbnVwKCk6CiAgICAgICAgc2h1dGlsLnJtdHJlZShleHRyYWN0X2RpciwgaWdub3JlX2Vycm9ycz1UcnVlKQogICAgYXRleGl0LnJlZ2lzdGVyKF9leHRyYWN0X2ZpbGVzX2NsZWFudXApCiAgICBfbG9nKCcjIGV4dHJhY3RpbmcgJXMgdG8gJXMnICUgKGFyY2hpdmVfcGF0aCwgZXh0cmFjdF9kaXIpKQoKICAgIHppcF9maWxlID0gemlwZmlsZS5aaXBGaWxlKGFyY2hpdmVfcGF0aCwgbW9kZT0ncicpCiAgICB6aXBfZmlsZS5leHRyYWN0YWxsKGV4dHJhY3RfZGlyKQogICAgemlwX2ZpbGUuY2xvc2UoKQoKICAgIHJldHVybiBleHRyYWN0X2RpcgoKCmRlZiBfdmVyc2lvbl9jaGVja19wa2dfcmVzb3VyY2VzKHBrZ19yZXNvdXJjZXMpOgogICAgIiIiQ2hlY2sgdGhhdCBwa2dfcmVzb3VyY2VzIHN1cHBvcnRzIHRoZSBBUElzIHdlIG5lZWQuIiIiCiAgICAjIENoZWNrIHRoYXQgcGtnX3Jlc291cmNlcyBpcyBuZXcgZW5vdWdoLgogICAgIwogICAgIyBEZXRlcm1pbmluZyB0aGUgdmVyc2lvbiBvZiBhbiBhcmJpdHJhcmlseSBvbGQgdmVyc2lvbiBvZgogICAgIyBwa2dfcmVzb3VyY2VzIGlzIHRvdWdoLCBzaW5jZSBpdCBkb2Vzbid0IGhhdmUgYSB2ZXJzaW9uIGxpdGVyYWwsCiAgICAjIGFuZCB0aGUgYWNjb21wYW55aW5nIHNldHVwdG9vbHMgcGFja2FnZSBjb21wdXRlcyBpdHMgdmVyc2lvbgogICAgIyBkeW5hbWljYWxseSBmcm9tIG1ldGFkYXRhIHRoYXQgbWlnaHQgbm90IGV4aXN0LiAgQWxzbyBzZXR1cHRvb2xzCiAgICAjIG1pZ2h0IG5vdCBleGlzdCwgZXNwZWNpYWxseSBpbiB0aGUgY2FzZSBvZiB0aGUgcGlwLXZlbmRvcmVkIGNvcHkKICAgICMgb2YgcGtnX3Jlc291cmNlcy4KICAgICMKICAgICMgV2UgZG8gYSBmZWF0dXJlIGRldGVjdGlvbiBpbnN0ZWFkLiAgV2UgZXhhbWluZQogICAgIyBwa2dfcmVzb3VyY2VzLldvcmtpbmdTZXQuYWRkLCBhbmQgc2VlIGlmIGl0IGhhcyBhdCBsZWFzdCB0aGUKICAgICMgdGhpcmQgZGVmYXVsdCBhcmd1bWVudCAoJ3JlcGxhY2UnKS4KICAgIHRyeToKICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMzoKICAgICAgICAgICAgZGVmYXVsdHMgPSBwa2dfcmVzb3VyY2VzLldvcmtpbmdTZXQuYWRkLmltX2Z1bmMuZnVuY19kZWZhdWx0cwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIGRlZmF1bHRzID0gcGtnX3Jlc291cmNlcy5Xb3JraW5nU2V0LmFkZC5fX2RlZmF1bHRzX18KICAgICAgICByZXR1cm4gbGVuKGRlZmF1bHRzKSA+PSAzCiAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgcmV0dXJuIEZhbHNlCgoKZGVmIF9zZXR1cF9wa2dfcmVzb3VyY2VzKHBrZ19yZXNvdXJjZXNfbmFtZSk6CiAgICAiIiJTZXR1cCBob29rcyBpbnRvIHRoZSBgcGtnX3Jlc291cmNlc2AgbW9kdWxlCgogICAgVGhpcyBlbmFibGVzIHRoZSBwa2dfcmVzb3VyY2VzIG1vZHVsZSB0byBmaW5kIG1ldGFkYXRhIGZyb20gd2hlZWxzCiAgICB0aGF0IGhhdmUgYmVlbiBpbmNsdWRlZCBpbiB0aGlzIC5wYXIgZmlsZS4KCiAgICBUaGUgZnVuY3Rpb25zIGFuZCBjbGFzc2VzIGhlcmUgYXJlIHNjb3BlZCB0byB0aGlzIGZ1bmN0aW9uLCBzaW5jZQogICAgd2UgbWlnaHQgaGF2ZSBtdWx0aXRwbGUgcGtnX3Jlc291cmNlcyBtb2R1bGVzLCBvciBub25lLgogICAgIiIiCgogICAgdHJ5OgogICAgICAgIF9faW1wb3J0X18ocGtnX3Jlc291cmNlc19uYW1lKQogICAgICAgIHBrZ19yZXNvdXJjZXMgPSBzeXMubW9kdWxlcy5nZXQocGtnX3Jlc291cmNlc19uYW1lKQogICAgICAgIGlmIHBrZ19yZXNvdXJjZXMgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuCiAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgIyBTa2lwIHNldHVwCiAgICAgICAgcmV0dXJuCgogICAgaWYgbm90IF92ZXJzaW9uX2NoZWNrX3BrZ19yZXNvdXJjZXMocGtnX3Jlc291cmNlcyk6CiAgICAgICAgIyBTa2lwIHNldHVwCiAgICAgICAgcmV0dXJuCgogICAgY2xhc3MgRGlzdEluZm9NZXRhZGF0YShwa2dfcmVzb3VyY2VzLkVnZ01ldGFkYXRhKToKICAgICAgICAiIiJNZXRhZGF0YSBwcm92aWRlciBmb3IgemlwIGZpbGVzIGNvbnRhaW5pbmcgLmRpc3QtaW5mbwoKICAgICAgICBJbiBmaW5kX2Rpc3RfaW5mb19pbl96aXAoKSwgd2UgY2FsbAogICAgICAgIG1ldGFkYXRhLnJlc291cmNlX2xpc3RkaXIoZGlyZWN0b3J5X25hbWUpLiAgSG93ZXZlciwgaXQgZG9lc24ndAogICAgICAgIHdvcmsgd2l0aCBFZ2dNZXRhZGF0YSwgYmVjYXVzZSBfemlwaW5mb19uYW1lKCkgZXhwZWN0cyB0aGUKICAgICAgICBkaXJlY3RvcnkgbmFtZSB0byBlbmQgd2l0aCBhIC8sIGJ1dCBtZXRhZGF0YS5fbGlzdGRpcigpIHdoaWNoCiAgICAgICAgZXhwZWN0cyB0aGUgZGlyZWN0b3J5IHRvIF9ub3RfIGVuZCB3aXRoIGEgLy4KCiAgICAgICAgVGhlcmVmb3JlIHRoaXMgY2xhc3MgZXhpc3RzLgogICAgICAgICIiIgoKICAgICAgICBkZWYgX3ppcGluZm9fbmFtZShzZWxmLCBmc3BhdGgpOgogICAgICAgICAgICAiIiJPdmVycmlkZXMgRWdnTWV0YWRhdGEuX3ppcGluZm9fbmFtZSIiIgogICAgICAgICAgICAjIENvbnZlcnQgYSB2aXJ0dWFsIGZpbGVuYW1lIChmdWxsIHBhdGggdG8gZmlsZSkgaW50byBhCiAgICAgICAgICAgICMgemlwZmlsZSBzdWJwYXRoIHVzYWJsZSB3aXRoIHRoZSB6aXBpbXBvcnQgZGlyZWN0b3J5CiAgICAgICAgICAgICMgY2FjaGUgZm9yIG91ciB0YXJnZXQgYXJjaGl2ZQogICAgICAgICAgICBmc3BhdGggPSBmc3BhdGgucnN0cmlwKG9zLnNlcCkKICAgICAgICAgICAgaWYgZnNwYXRoID09IHNlbGYubG9hZGVyLmFyY2hpdmU6CiAgICAgICAgICAgICAgICByZXR1cm4gJycKICAgICAgICAgICAgaWYgZnNwYXRoLnN0YXJ0c3dpdGgoc2VsZi56aXBfcHJlKToKICAgICAgICAgICAgICAgIHJldHVybiBmc3BhdGhbbGVuKHNlbGYuemlwX3ByZSk6XQogICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigKICAgICAgICAgICAgICAgICIlcyBpcyBub3QgYSBzdWJwYXRoIG9mICVzIiAlIChmc3BhdGgsIHNlbGYuemlwX3ByZSkKICAgICAgICAgICAgKQoKICAgICAgICBkZWYgX3BhcnRzKHNlbGYsIHppcF9wYXRoKToKICAgICAgICAgICAgIiIiT3ZlcnJpZGVzIEVnZ01ldGFkYXRhLl9wYXJ0cyIiIgogICAgICAgICAgICAjIENvbnZlcnQgYSB6aXBmaWxlIHN1YnBhdGggaW50byBhbiBlZ2ctcmVsYXRpdmUgcGF0aCBwYXJ0CiAgICAgICAgICAgICMgbGlzdC4KICAgICAgICAgICAgZnNwYXRoID0gc2VsZi56aXBfcHJlICsgemlwX3BhdGgKICAgICAgICAgICAgaWYgZnNwYXRoID09IHNlbGYuZWdnX3Jvb3Q6CiAgICAgICAgICAgICAgICByZXR1cm4gW10KICAgICAgICAgICAgaWYgZnNwYXRoLnN0YXJ0c3dpdGgoc2VsZi5lZ2dfcm9vdCArIG9zLnNlcCk6CiAgICAgICAgICAgICAgICByZXR1cm4gZnNwYXRoW2xlbihzZWxmLmVnZ19yb290KSArIDE6XS5zcGxpdChvcy5zZXApCiAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKAogICAgICAgICAgICAgICAgIiVzIGlzIG5vdCBhIHN1YnBhdGggb2YgJXMiICUgKGZzcGF0aCwgc2VsZi5lZ2dfcm9vdCkKICAgICAgICAgICAgKQoKICAgIGRlZiBmaW5kX2Rpc3RfaW5mb19pbl96aXAoaW1wb3J0ZXIsIHBhdGhfaXRlbSwgb25seT1GYWxzZSk6CiAgICAgICAgIiIiRmluZCBkaXN0LWluZm8gc3R5bGUgbWV0YWRhdGEgaW4gemlwIGZpbGVzLgoKICAgICAgICBpbXBvcnRlcjogUEVQIDMwMi1zdHlsZSBJbXBvcnRlciBvYmplY3QKICAgICAgICBwYXRoX2l0ZW0gKHN0cik6IGZpbGVuYW1lIG9yIHBzZXVkby1maWxlbmFtZSBsaWtlOgogICAgICAgICAgICAvdXNyL3NvbWVkaXJzL21haW4ucGFyCiAgICAgICAgICAgIG9yCiAgICAgICAgICAgIC91c3Ivc29tZWRpcnMvbWFpbi5wYXIvcHlwaV9fcG9ydHBpY2tlcl8xXzJfMAogICAgICAgIG9ubHkgKGJvb2wpOiBXZSBpZ25vcmUgdGhlIGBvbmx5YCBmbGFnIGJlY2F1c2UgaXQncyBub3QgY2xlYXIKICAgICAgICAgICAgd2hhdCBpdCBzaG91bGQgYWN0dWFsbHkgZG8gaW4gdGhpcyBjYXNlLgoKICAgICAgICBZaWVsZHMgcGtnX3Jlc291cmNlcy5EaXN0cmlidXRpb24gb2JqZWN0cwogICAgICAgICIiIgogICAgICAgIG1ldGFkYXRhID0gRGlzdEluZm9NZXRhZGF0YShpbXBvcnRlcikKICAgICAgICBmb3Igc3ViaXRlbSBpbiBtZXRhZGF0YS5yZXNvdXJjZV9saXN0ZGlyKCcvJyk6CiAgICAgICAgICAgIGJhc2VuYW1lLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KHN1Yml0ZW0pCiAgICAgICAgICAgIGlmIGV4dC5sb3dlcigpID09ICcuZGlzdC1pbmZvJzoKICAgICAgICAgICAgICAgICMgUGFyc2UgZGlzdHJpYnV0aW9uIG5hbWUKICAgICAgICAgICAgICAgIG1hdGNoID0gcGtnX3Jlc291cmNlcy5FR0dfTkFNRShiYXNlbmFtZSkKICAgICAgICAgICAgICAgIHByb2plY3RfbmFtZSA9ICd1bmtub3duJwogICAgICAgICAgICAgICAgaWYgbWF0Y2g6CiAgICAgICAgICAgICAgICAgICAgcHJvamVjdF9uYW1lID0gbWF0Y2guZ3JvdXAoJ25hbWUnKQogICAgICAgICAgICAgICAgIyBDcmVhdGUgbWV0YWRhdGEgb2JqZWN0CiAgICAgICAgICAgICAgICBzdWJwYXRoID0gb3MucGF0aC5qb2luKHBhdGhfaXRlbSwgc3ViaXRlbSkKICAgICAgICAgICAgICAgIHN1Ym1ldGEgPSBEaXN0SW5mb01ldGFkYXRhKAogICAgICAgICAgICAgICAgICAgIHppcGltcG9ydC56aXBpbXBvcnRlcihwYXRoX2l0ZW0pKQogICAgICAgICAgICAgICAgIyBPdmVycmlkZSBwa2dfcmVzb3VyY2VzIGRlZmF1bHRzIHRvIGF2b2lkCiAgICAgICAgICAgICAgICAjICJyZXNvdXJjZV9maWxlbmFtZSgpIG9ubHkgc3VwcG9ydGVkIGZvciAuZWdnLCBub3QKICAgICAgICAgICAgICAgICMgLnppcCIgbWVzc2FnZQogICAgICAgICAgICAgICAgc3VibWV0YS5lZ2dfbmFtZSA9IHByb2plY3RfbmFtZQogICAgICAgICAgICAgICAgc3VibWV0YS5lZ2dfaW5mbyA9IHN1YnBhdGgKICAgICAgICAgICAgICAgIHN1Ym1ldGEuZWdnX3Jvb3QgPSBwYXRoX2l0ZW0KICAgICAgICAgICAgICAgIGRpc3QgPSBwa2dfcmVzb3VyY2VzLkRpc3RyaWJ1dGlvbi5mcm9tX2xvY2F0aW9uKAogICAgICAgICAgICAgICAgICAgIHBhdGhfaXRlbSwgc3ViaXRlbSwgc3VibWV0YSkKICAgICAgICAgICAgICAgIHlpZWxkIGRpc3QKCiAgICBkZWYgZmluZF9lZ2dzX2FuZF9kaXN0X2luZm9faW5femlwKGltcG9ydGVyLCBwYXRoX2l0ZW0sIG9ubHk9RmFsc2UpOgogICAgICAgICIiIkNoYWluIHRvZ2V0aGVyIG91ciBmaW5kZXIgYW5kIHRoZSBzdGFuZGFyZCBwa2dfcmVzb3VyY2VzIGZpbmRlcgoKICAgICAgICBGb3Igc2ltcGxpY2l0eSwgYW5kIHNpbmNlIHBrZ19yZXNvdXJjZXMgZG9lc24ndCBwcm92aWRlIGEgcHVibGljCiAgICAgICAgaW50ZXJmYWNlIHRvIGRvIHNvLCB3ZSBoYXJkY29kZSB0aGUgY2hhaW5pbmcgKGZpbmRfZWdnc19pbl96aXApLgogICAgICAgICIiIgogICAgICAgICMgT3VyIGZpbmRlcgogICAgICAgIGZvciBkaXN0IGluIGZpbmRfZGlzdF9pbmZvX2luX3ppcChpbXBvcnRlciwgcGF0aF9pdGVtLCBvbmx5KToKICAgICAgICAgICAgeWllbGQgZGlzdAogICAgICAgICMgVGhlIHN0YW5kYXJkIHBrZ19yZXNvdXJjZXMgZmluZGVyCiAgICAgICAgZm9yIGRpc3QgaW4gcGtnX3Jlc291cmNlcy5maW5kX2VnZ3NfaW5femlwKGltcG9ydGVyLCBwYXRoX2l0ZW0sIG9ubHkpOgogICAgICAgICAgICB5aWVsZCBkaXN0CiAgICAgICAgcmV0dXJuCgogICAgIyBUaGlzIG92ZXJ3cml0ZXMgdGhlIGV4aXN0aW5nIHJlZ2lzdGVyZWQgZmluZGVyLgogICAgcGtnX3Jlc291cmNlcy5yZWdpc3Rlcl9maW5kZXIoemlwaW1wb3J0LnppcGltcG9ydGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluZF9lZ2dzX2FuZF9kaXN0X2luZm9faW5femlwKQoKICAgICMgTm90ZSB0aGF0IHRoZSBkZWZhdWx0IFdvcmtpbmdTZXQgaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkLCBhbmQKICAgICMgdGhlcmUgaXMgbm8gcHVibGljIGludGVyZmFjZSB0byBlYXNpbHkgcmVmcmVzaC9yZWxvYWQgaXQgdGhhdAogICAgIyBkb2Vzbid0IGFsc28gaGF2ZSBhICJEb24ndCB1c2UgdGhpcyIgd2FybmluZy4gIFNvIHdlIG1hbnVhbGx5CiAgICAjIGFkZCBqdXN0IHRoZSBlbnRyaWVzIHdlIGtub3cgYWJvdXQgdG8gdGhlIGV4aXN0aW5nIFdvcmtpbmdTZXQuCiAgICBmb3IgZW50cnkgaW4gc3lzLnBhdGg6CiAgICAgICAgaW1wb3J0ZXIgPSBwa2d1dGlsLmdldF9pbXBvcnRlcihlbnRyeSkKICAgICAgICBpZiBpc2luc3RhbmNlKGltcG9ydGVyLCB6aXBpbXBvcnQuemlwaW1wb3J0ZXIpOgogICAgICAgICAgICBmb3IgZGlzdCBpbiBmaW5kX2Rpc3RfaW5mb19pbl96aXAoaW1wb3J0ZXIsIGVudHJ5LCBvbmx5PVRydWUpOgogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShkaXN0Ll9wcm92aWRlciwgRGlzdEluZm9NZXRhZGF0YSk6CiAgICAgICAgICAgICAgICAgICAgcGtnX3Jlc291cmNlcy53b3JraW5nX3NldC5hZGQoZGlzdCwgZW50cnksIGluc2VydD1GYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlPVRydWUpCgoKZGVmIF9pbml0aWFsaXplX2ltcG9ydF9wYXRoKGltcG9ydF9yb290cywgaW1wb3J0X3ByZWZpeCk6CiAgICAiIiJBZGQgZXh0cmEgZW50cmllcyB0byBQWVRIT05QQVRIIHNvIHRoYXQgbW9kdWxlcyBjYW4gYmUgaW1wb3J0ZWQuIiIiCiAgICAjIFdlIHRyeSB0byBtYXRjaCB0byBvcmRlciBvZiBCYXplbCdzIHN0dWIKICAgIGZ1bGxfcm9vdHMgPSBbCiAgICAgICAgb3MucGF0aC5qb2luKGltcG9ydF9wcmVmaXgsIGltcG9ydF9yb290KQogICAgICAgIGZvciBpbXBvcnRfcm9vdCBpbiBpbXBvcnRfcm9vdHNdCiAgICBzeXMucGF0aFsxOjFdID0gZnVsbF9yb290cwogICAgX2xvZygnIyBhZGRpbmcgJXMgdG8gc3lzLnBhdGgnICUgZnVsbF9yb290cykKCgpkZWYgc2V0dXAoaW1wb3J0X3Jvb3RzLCB6aXBfc2FmZSk6CiAgICAiIiJJbml0aWFsaXplIHN1YnBhciBydW4tdGltZSBzdXBwb3J0CgogICAgQXJnczoKICAgICAgaW1wb3J0X3Jvb3QgKGxpc3QpOiBzdWJkaXJzIGluc2lkZSAucGFyIGZpbGUgdG8gYWRkIHRvIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZSBpbXBvcnQgcGF0aCBhdCBydW50aW1lLgogICAgICB6aXBfc2FmZSAoYm9vbCk6IElmIEZhbHNlLCBleHRyYWN0IHRoZSAucGFyIGZpbGUgY29udGVudHMgdG8gYQogICAgICAgICAgICAgICAgICAgICAgIHRlbXBvcmFyeSBkaXJlY3RvcnksIGFuZCBpbXBvcnQgZXZlcnl0aGluZyBmcm9tCiAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBkaXJlY3RvcnkuCgogICAgUmV0dXJuczoKICAgICAgVHJ1ZSBpZiBzZXR1cCB3YXMgc3VjY2Vzc2Z1bCwgZWxzZSBGYWxzZQogICAgIiIiCiAgICBhcmNoaXZlX3BhdGggPSBfZmluZF9hcmNoaXZlKCkKICAgIGlmIG5vdCBhcmNoaXZlX3BhdGg6CiAgICAgICAgd2FybmluZ3Mud2FybignRmFpbGVkIHRvIGluaXRpYWxpemUgLnBhciBmaWxlIHJ1bnRpbWUgc3VwcG9ydCcsCiAgICAgICAgICAgICAgICAgICAgICBVc2VyV2FybmluZykKICAgICAgICByZXR1cm4gRmFsc2UKICAgIGlmIG9zLnBhdGguYWJzcGF0aChzeXMucGF0aFswXSkgIT0gb3MucGF0aC5hYnNwYXRoKGFyY2hpdmVfcGF0aCk6CiAgICAgICAgd2FybmluZ3Mud2FybignRmFpbGVkIHRvIGluaXRpYWxpemUgLnBhciBmaWxlIHJ1bnRpbWUgc3VwcG9ydC4gJyArCiAgICAgICAgICAgICAgICAgICAgICAnYXJjaGl2ZV9wYXRoIHdhcyAlciwgc3lzLnBhdGggd2FzICVyJyAlICgKICAgICAgICAgICAgICAgICAgICAgICAgICBhcmNoaXZlX3BhdGgsIHN5cy5wYXRoKSwKICAgICAgICAgICAgICAgICAgICAgIFVzZXJXYXJuaW5nKQogICAgICAgIHJldHVybiBGYWxzZQoKICAgICMgRXh0cmFjdCBmaWxlcyB0byBkaXNrIGlmIG5lY2Vzc2FyeQogICAgaWYgbm90IHppcF9zYWZlOgogICAgICAgIGV4dHJhY3RfZGlyID0gX2V4dHJhY3RfZmlsZXMoYXJjaGl2ZV9wYXRoKQogICAgICAgICMgc3lzLnBhdGhbMF0gaXMgdGhlIG5hbWUgb2YgdGhlIGV4ZWN1dGluZyAucGFyIGZpbGUuICBQb2ludAogICAgICAgICMgaXQgdG8gdGhlIGV4dHJhY3QgZGlyZWN0b3J5IGluc3RlYWQsIHNvIHRoYXQgUHl0aG9uIHNlYXJjaGVzCiAgICAgICAgIyB0aGVyZSBmb3IgaW1wb3J0cy4KICAgICAgICBzeXMucGF0aFswXSA9IGV4dHJhY3RfZGlyCiAgICAgICAgaW1wb3J0X3ByZWZpeCA9IGV4dHJhY3RfZGlyCiAgICBlbHNlOiAgIyBJbXBvcnQgZGlyZWN0bHkgZnJvbSAucGFyIGZpbGUKICAgICAgICBleHRyYWN0X2RpciA9IE5vbmUKICAgICAgICBpbXBvcnRfcHJlZml4ID0gYXJjaGl2ZV9wYXRoCgogICAgIyBJbml0aWFsaXplIGltcG9ydCBwYXRoCiAgICBfaW5pdGlhbGl6ZV9pbXBvcnRfcGF0aChpbXBvcnRfcm9vdHMsIGltcG9ydF9wcmVmaXgpCgogICAgIyBBZGQgaG9vayBmb3IgcGFja2FnZSBtZXRhZGF0YQogICAgX3NldHVwX3BrZ19yZXNvdXJjZXMoJ3BrZ19yZXNvdXJjZXMnKQogICAgX3NldHVwX3BrZ19yZXNvdXJjZXMoJ3BpcC5fdmVuZG9yLnBrZ19yZXNvdXJjZXMnKQoKICAgIHJldHVybiBUcnVlClBLAQIUAxQAAAAAAAAAIQAAAAAAAAAAAAAAAAALAAAAAAAAAAAAAAAAABcAAABfX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQCLk5T/gx8AAIMfAAALAAAAAAAAAAAAAAAAAEAAAABfX21haW5fXy5weVBLAQIUAxQAAAAAAAAAIQBPOWlV4g0AAOINAAAmAAAAAAAAAAAAAAAAAOwfAABiYXplbF90b29scy90b29scy9weXRob24vcHkzd3JhcHBlci5zaFBLAQIUAxQAAAAAAAAAIQAAAAAAAAAAAAAAAAAbAAAAAAAAAAAAAAAAABIuAABweXBpX19waXBfOV8wXzMvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAq3E0VwcFAAAHBQAAMwAAAAAAAAAAAAAAAABLLgAAcHlwaV9fcGlwXzlfMF8zL3BpcC05LjAuMy5kaXN0LWluZm8vREVTQ1JJUFRJT04ucnN0UEsBAhQDFAAAAAAAAAAhADxQfyX5CQAA+QkAACwAAAAAAAAAAAAAAAAAozMAAHB5cGlfX3BpcF85XzBfMy9waXAtOS4wLjMuZGlzdC1pbmZvL01FVEFEQVRBUEsBAhQDFAAAAAAAAAAhAFf+I+WYYgAAmGIAACoAAAAAAAAAAAAAAAAA5j0AAHB5cGlfX3BpcF85XzBfMy9waXAtOS4wLjMuZGlzdC1pbmZvL1JFQ09SRFBLAQIUAxQAAAAAAAAAIQD23dK+bgAAAG4AAAApAAAAAAAAAAAAAAAAAMagAABweXBpX19waXBfOV8wXzMvcGlwLTkuMC4zLmRpc3QtaW5mby9XSEVFTFBLAQIUAxQAAAAAAAAAIQC0F5jERAAAAEQAAAA0AAAAAAAAAAAAAAAAAHuhAABweXBpX19waXBfOV8wXzMvcGlwLTkuMC4zLmRpc3QtaW5mby9lbnRyeV9wb2ludHMudHh0UEsBAhQDFAAAAAAAAAAhAMjgt5sdBgAAHQYAADEAAAAAAAAAAAAAAAAAEaIAAHB5cGlfX3BpcF85XzBfMy9waXAtOS4wLjMuZGlzdC1pbmZvL21ldGFkYXRhLmpzb25QSwECFAMUAAAAAAAAACEAxx+XwgQAAAAEAAAAMQAAAAAAAAAAAAAAAAB9qAAAcHlwaV9fcGlwXzlfMF8zL3BpcC05LjAuMy5kaXN0LWluZm8vdG9wX2xldmVsLnR4dFBLAQIUAxQAAAAAAAAAIQANW9B2tC4AALQuAAAfAAAAAAAAAAAAAAAAANCoAABweXBpX19waXBfOV8wXzMvcGlwL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAEtJpGVIAgAASAIAAB8AAAAAAAAAAAAAAAAAwdcAAHB5cGlfX3BpcF85XzBfMy9waXAvX19tYWluX18ucHlQSwECFAMUAAAAAAAAACEAT73MSD4SAAA+EgAAJwAAAAAAAAAAAAAAAABG2gAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAIWJlopgVwAAYFcAACYAAAAAAAAAAAAAAAAAyewAAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9hcHBkaXJzLnB5UEsBAhQDFAAAAAAAAAAhAABWrDouAQAALgEAADQAAAAAAAAAAAAAAAAAbUQBAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEA2lRGpSgFAAAoBQAAMAAAAAAAAAAAAAAAAADtRQEAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9fY21kLnB5UEsBAhQDFAAAAAAAAAAhAFDmqSwAEgAAABIAADMAAAAAAAAAAAAAAAAAY0sBAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvYWRhcHRlci5weVBLAQIUAxQAAAAAAAAAIQASqsbwFgMAABYDAAAxAAAAAAAAAAAAAAAAALRdAQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2FjaGVjb250cm9sL2NhY2hlLnB5UEsBAhQDFAAAAAAAAAAhAJ4dVvxxAQAAcQEAADsAAAAAAAAAAAAAAAAAGWEBAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvY2FjaGVzL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAMGnBv/MDQAAzA0AAD0AAAAAAAAAAAAAAAAA42IBAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvY2FjaGVzL2ZpbGVfY2FjaGUucHlQSwECFAMUAAAAAAAAACEA04jGVM0DAADNAwAAPgAAAAAAAAAAAAAAAAAKcQEAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9jYWNoZXMvcmVkaXNfY2FjaGUucHlQSwECFAMUAAAAAAAAACEALTwtM3wBAAB8AQAAMgAAAAAAAAAAAAAAAAAzdQEAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9jb21wYXQucHlQSwECFAMUAAAAAAAAACEAx2C53uAyAADgMgAANgAAAAAAAAAAAAAAAAD/dgEAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9jb250cm9sbGVyLnB5UEsBAhQDFAAAAAAAAAAhAGwmNHzjCQAA4wkAADcAAAAAAAAAAAAAAAAAM6oBAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvZmlsZXdyYXBwZXIucHlQSwECFAMUAAAAAAAAACEADlQe/C0QAAAtEAAANgAAAAAAAAAAAAAAAABrtAEAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NhY2hlY29udHJvbC9oZXVyaXN0aWNzLnB5UEsBAhQDFAAAAAAAAAAhABJhgLiIGQAAiBkAADUAAAAAAAAAAAAAAAAA7MQBAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvc2VyaWFsaXplLnB5UEsBAhQDFAAAAAAAAAAhAIt7xULyAQAA8gEAADMAAAAAAAAAAAAAAAAAx94BAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jYWNoZWNvbnRyb2wvd3JhcHBlci5weVBLAQIUAxQAAAAAAAAAIQAUcAVHPwAAAD8AAAAvAAAAAAAAAAAAAAAAAArhAQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2VydGlmaS9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQCDK9rBKQAAACkAAAAvAAAAAAAAAAAAAAAAAJbhAQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2VydGlmaS9fX21haW5fXy5weVBLAQIUAxQAAAAAAAAAIQAFodr18CIEAPAiBAAuAAAAAAAAAAAAAAAAAAziAQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2VydGlmaS9jYWNlcnQucGVtUEsBAhQDFAAAAAAAAAAhAAkTQkdEAwAARAMAACsAAAAAAAAAAAAAAAAASAUGAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jZXJ0aWZpL2NvcmUucHlQSwECFAMUAAAAAAAAACEA8M8PUxcGAAAXBgAALwAAAAAAAAAAAAAAAADVCAYAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAOb+EEBZ6AAAWegAALwAAAAAAAAAAAAAAAAA5DwYAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvYmlnNWZyZXEucHlQSwECFAMUAAAAAAAAACEAy+dnZt0GAADdBgAAMQAAAAAAAAAAAAAAAACciQYAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvYmlnNXByb2Jlci5weVBLAQIUAxQAAAAAAAAAIQDgWSg9wyQAAMMkAAA3AAAAAAAAAAAAAAAAAMiQBgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9jaGFyZGlzdHJpYnV0aW9uLnB5UEsBAhQDFAAAAAAAAAAhAIlZJIjLDgAAyw4AADkAAAAAAAAAAAAAAAAA4LUGAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2NoYXJzZXRncm91cHByb2Jlci5weVBLAQIUAxQAAAAAAAAAIQDgl2Fa9hMAAPYTAAA0AAAAAAAAAAAAAAAAAALFBgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9jaGFyc2V0cHJvYmVyLnB5UEsBAhQDFAAAAAAAAAAhAJMG1zIBAAAAAQAAADMAAAAAAAAAAAAAAAAAStkGAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2NsaS9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQBf3a25sgoAALIKAAA1AAAAAAAAAAAAAAAAAJzZBgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9jbGkvY2hhcmRldGVjdC5weVBLAQIUAxQAAAAAAAAAIQBc+zdIBg4AAAYOAAA5AAAAAAAAAAAAAAAAAKHkBgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9jb2RpbmdzdGF0ZW1hY2hpbmUucHlQSwECFAMUAAAAAAAAACEAfIblZW4EAABuBAAALQAAAAAAAAAAAAAAAAD+8gYAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvY29tcGF0LnB5UEsBAhQDFAAAAAAAAAAhAL1CmjE/BwAAPwcAADIAAAAAAAAAAAAAAAAAt/cGAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2NwOTQ5cHJvYmVyLnB5UEsBAhQDFAAAAAAAAAAhAEQErMl9BgAAfQYAACwAAAAAAAAAAAAAAAAARv8GAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2VudW1zLnB5UEsBAhQDFAAAAAAAAAAhAASIBT1uDwAAbg8AADAAAAAAAAAAAAAAAAAADQYHAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2VzY3Byb2Jlci5weVBLAQIUAxQAAAAAAAAAIQDBCmCiDikAAA4pAAAsAAAAAAAAAAAAAAAAAMkVBwBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9lc2NzbS5weVBLAQIUAxQAAAAAAAAAIQAgN8TQpQ4AAKUOAAAyAAAAAAAAAAAAAAAAACE/BwBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9ldWNqcHByb2Jlci5weVBLAQIUAxQAAAAAAAAAIQD0QQN56jQAAOo0AAAwAAAAAAAAAAAAAAAAABZOBwBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9ldWNrcmZyZXEucHlQSwECFAMUAAAAAAAAACEAJgWX+NQGAADUBgAAMgAAAAAAAAAAAAAAAABOgwcAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvZXVja3Jwcm9iZXIucHlQSwECFAMUAAAAAAAAACEAzNtJ1YV7AACFewAAMAAAAAAAAAAAAAAAAAByigcAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvZXVjdHdmcmVxLnB5UEsBAhQDFAAAAAAAAAAhAKBBjRjTBgAA0wYAADIAAAAAAAAAAAAAAAAARQYIAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2V1Y3R3cHJvYmVyLnB5UEsBAhQDFAAAAAAAAAAhABlF0tfrUAAA61AAADEAAAAAAAAAAAAAAAAAaA0IAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2diMjMxMmZyZXEucHlQSwECFAMUAAAAAAAAACEAfqv+j9oGAADaBgAAMwAAAAAAAAAAAAAAAACiXggAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvZ2IyMzEycHJvYmVyLnB5UEsBAhQDFAAAAAAAAAAhAA0p07IONgAADjYAADMAAAAAAAAAAAAAAAAAzWUIAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2hlYnJld3Byb2Jlci5weVBLAQIUAxQAAAAAAAAAIQDCGjlhsWQAALFkAAAuAAAAAAAAAAAAAAAAACycCABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9qaXNmcmVxLnB5UEsBAhQDFAAAAAAAAAAhAAZ5JWq7TAAAu0wAAC0AAAAAAAAAAAAAAAAAKQEJAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2pwY250eC5weVBLAQIUAxQAAAAAAAAAIQDwaMnKJzIAACcyAAA5AAAAAAAAAAAAAAAAAC9OCQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9sYW5nYnVsZ2FyaWFubW9kZWwucHlQSwECFAMUAAAAAAAAACEAyPFWmxxGAAAcRgAAOAAAAAAAAAAAAAAAAACtgAkAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvbGFuZ2N5cmlsbGljbW9kZWwucHlQSwECFAMUAAAAAAAAACEA/ruvKZAxAACQMQAANQAAAAAAAAAAAAAAAAAfxwkAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvbGFuZ2dyZWVrbW9kZWwucHlQSwECFAMUAAAAAAAAACEAj2atGFEsAABRLAAANgAAAAAAAAAAAAAAAAAC+QkAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvbGFuZ2hlYnJld21vZGVsLnB5UEsBAhQDFAAAAAAAAAAhAMPBVYAwMQAAMDEAADkAAAAAAAAAAAAAAAAApyUKAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2xhbmdodW5nYXJpYW5tb2RlbC5weVBLAQIUAxQAAAAAAAAAIQAiD9I/GiwAABosAAA0AAAAAAAAAAAAAAAAAC5XCgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9sYW5ndGhhaW1vZGVsLnB5UEsBAhQDFAAAAAAAAAAhALUyw2ReKwAAXisAADcAAAAAAAAAAAAAAAAAmoMKAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L2xhbmd0dXJraXNobW9kZWwucHlQSwECFAMUAAAAAAAAACEA5OzwpPoUAAD6FAAAMwAAAAAAAAAAAAAAAABNrwoAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvbGF0aW4xcHJvYmVyLnB5UEsBAhQDFAAAAAAAAAAhADZ1GE1VDQAAVQ0AADYAAAAAAAAAAAAAAAAAmMQKAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L21iY2hhcnNldHByb2Jlci5weVBLAQIUAxQAAAAAAAAAIQCt0xGo3AcAANwHAAA2AAAAAAAAAAAAAAAAAEHSCgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9tYmNzZ3JvdXBwcm9iZXIucHlQSwECFAMUAAAAAAAAACEAafbhD4ljAACJYwAALQAAAAAAAAAAAAAAAABx2goAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvbWJjc3NtLnB5UEsBAhQDFAAAAAAAAAAhAB517x4ZFgAAGRYAADYAAAAAAAAAAAAAAAAART4LAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L3NiY2hhcnNldHByb2Jlci5weVBLAQIUAxQAAAAAAAAAIQCK/k+g2g0AANoNAAA2AAAAAAAAAAAAAAAAALJUCwBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC9zYmNzZ3JvdXBwcm9iZXIucHlQSwECFAMUAAAAAAAAACEA1pFnMr4OAAC+DgAAMQAAAAAAAAAAAAAAAADgYgsAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NoYXJkZXQvc2ppc3Byb2Jlci5weVBLAQIUAxQAAAAAAAAAIQB1gEc9xTAAAMUwAAA4AAAAAAAAAAAAAAAAAO1xCwBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC91bml2ZXJzYWxkZXRlY3Rvci5weVBLAQIUAxQAAAAAAAAAIQD1v7w9zgoAAM4KAAAxAAAAAAAAAAAAAAAAAAijCwBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY2hhcmRldC91dGY4cHJvYmVyLnB5UEsBAhQDFAAAAAAAAAAhAEfHkNfyAAAA8gAAAC4AAAAAAAAAAAAAAAAAJa4LAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jaGFyZGV0L3ZlcnNpb24ucHlQSwECFAMUAAAAAAAAACEAWNRpOfAAAADwAAAAMAAAAAAAAAAAAAAAAABjrwsAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NvbG9yYW1hL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAD4Vp1/cCQAA3AkAACwAAAAAAAAAAAAAAAAAobALAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jb2xvcmFtYS9hbnNpLnB5UEsBAhQDFAAAAAAAAAAhAMdjwNnEJQAAxCUAADMAAAAAAAAAAAAAAAAAx7oLAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9jb2xvcmFtYS9hbnNpdG93aW4zMi5weVBLAQIUAxQAAAAAAAAAIQB91tgvfQcAAH0HAAAyAAAAAAAAAAAAAAAAANzgCwBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY29sb3JhbWEvaW5pdGlhbGlzZS5weVBLAQIUAxQAAAAAAAAAIQANbaI99RQAAPUUAAAtAAAAAAAAAAAAAAAAAKnoCwBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvY29sb3JhbWEvd2luMzIucHlQSwECFAMUAAAAAAAAACEAd3tnIZIYAACSGAAALwAAAAAAAAAAAAAAAADp/QsAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2NvbG9yYW1hL3dpbnRlcm0ucHlQSwECFAMUAAAAAAAAACEAJpxRl0UCAABFAgAALwAAAAAAAAAAAAAAAADIFgwAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAI+9n/BIBAAASAQAAOQAAAAAAAAAAAAAAAABaGQwAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvX2JhY2twb3J0L19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAK+KL2XLAwAAywMAADUAAAAAAAAAAAAAAAAAwxoMAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL19iYWNrcG9ydC9taXNjLnB5UEsBAhQDFAAAAAAAAAAhAOJiPdAvZAAAL2QAADcAAAAAAAAAAAAAAAAA4R4MAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL19iYWNrcG9ydC9zaHV0aWwucHlQSwECFAMUAAAAAAAAACEAbxYArTkKAAA5CgAAOwAAAAAAAAAAAAAAAABlgwwAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvX2JhY2twb3J0L3N5c2NvbmZpZy5jZmdQSwECFAMUAAAAAAAAACEANg9S1ktpAABLaQAAOgAAAAAAAAAAAAAAAAD3jQwAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvX2JhY2twb3J0L3N5c2NvbmZpZy5weVBLAQIUAxQAAAAAAAAAIQBEQh9D1GkBANRpAQA4AAAAAAAAAAAAAAAAAJr3DABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi9fYmFja3BvcnQvdGFyZmlsZS5weVBLAQIUAxQAAAAAAAAAIQBfCXNgYZ8AAGGfAAAtAAAAAAAAAAAAAAAAAMRhDgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi9jb21wYXQucHlQSwECFAMUAAAAAAAAACEAOgrDvAjCAAAIwgAALwAAAAAAAAAAAAAAAABwAQ8AcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvZGF0YWJhc2UucHlQSwECFAMUAAAAAAAAACEAgzjiLV1SAABdUgAALAAAAAAAAAAAAAAAAADFww8AcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvaW5kZXgucHlQSwECFAMUAAAAAAAAACEA0cV4r0XHAABFxwAALwAAAAAAAAAAAAAAAABsFhAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvbG9jYXRvcnMucHlQSwECFAMUAAAAAAAAACEAhpe1m9o5AADaOQAALwAAAAAAAAAAAAAAAAD+3RAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvbWFuaWZlc3QucHlQSwECFAMUAAAAAAAAACEAPRGuAooYAACKGAAALgAAAAAAAAAAAAAAAAAlGBEAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvbWFya2Vycy5weVBLAQIUAxQAAAAAAAAAIQANpmzxsZcAALGXAAAvAAAAAAAAAAAAAAAAAPswEQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi9tZXRhZGF0YS5weVBLAQIUAxQAAAAAAAAAIQDIt0WYDioAAA4qAAAwAAAAAAAAAAAAAAAAAPnIEQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi9yZXNvdXJjZXMucHlQSwECFAMUAAAAAAAAACEAuv/r23g7AAB4OwAALgAAAAAAAAAAAAAAAABV8xEAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvc2NyaXB0cy5weVBLAQIUAxQAAAAAAAAAIQD1mJAMAFwBAABcAQArAAAAAAAAAAAAAAAAABkvEgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi90MzIuZXhlUEsBAhQDFAAAAAAAAAAhAJ7ixVkAfgEAAH4BACsAAAAAAAAAAAAAAAAAYosTAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL3Q2NC5leGVQSwECFAMUAAAAAAAAACEAN9gBJf/OAAD/zgAAKwAAAAAAAAAAAAAAAACrCRUAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvdXRpbC5weVBLAQIUAxQAAAAAAAAAIQCg/QVWn1wAAJ9cAAAuAAAAAAAAAAAAAAAAAPPYFQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi92ZXJzaW9uLnB5UEsBAhQDFAAAAAAAAAAhANh9AIkATgEAAE4BACsAAAAAAAAAAAAAAAAA3jUWAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9kaXN0bGliL3czMi5leGVQSwECFAMUAAAAAAAAACEAXsxL7wBwAQAAcAEAKwAAAAAAAAAAAAAAAAAnhBcAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2Rpc3RsaWIvdzY0LmV4ZVBLAQIUAxQAAAAAAAAAIQBf1KCpy5gAAMuYAAAsAAAAAAAAAAAAAAAAAHD0GABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdGxpYi93aGVlbC5weVBLAQIUAxQAAAAAAAAAIQCRwcCuzZUAAM2VAAAlAAAAAAAAAAAAAAAAAIWNGQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvZGlzdHJvLnB5UEsBAhQDFAAAAAAAAAAhAKKbmZwMAwAADAMAADAAAAAAAAAAAAAAAAAAlSMaAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQDVeA7iQUEAAEFBAAAxAAAAAAAAAAAAAAAAAO8mGgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvX2loYXRleG1sLnB5UEsBAhQDFAAAAAAAAAAhAB4MbTUUfwAAFH8AADQAAAAAAAAAAAAAAAAAf2gaAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9faW5wdXRzdHJlYW0ucHlQSwECFAMUAAAAAAAAACEAxEZqFiQrAQAkKwEAMgAAAAAAAAAAAAAAAADl5xoAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL190b2tlbml6ZXIucHlQSwECFAMUAAAAAAAAACEA79OvDyEBAAAhAQAANgAAAAAAAAAAAAAAAABZExwAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL190cmllL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAMyVPpbTAwAA0wMAADMAAAAAAAAAAAAAAAAAzhQcAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9fdHJpZS9fYmFzZS5weVBLAQIUAxQAAAAAAAAAIQAkVZ2pmgQAAJoEAAA0AAAAAAAAAAAAAAAAAPIYHABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvX3RyaWUvZGF0cmllLnB5UEsBAhQDFAAAAAAAAAAhAEtPbs7vBgAA7wYAADAAAAAAAAAAAAAAAAAA3h0cAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9fdHJpZS9weS5weVBLAQIUAxQAAAAAAAAAIQAm465YABAAAAAQAAAuAAAAAAAAAAAAAAAAABslHABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvX3V0aWxzLnB5UEsBAhQDFAAAAAAAAAAhAMikff67RQEAu0UBADEAAAAAAAAAAAAAAAAAZzUcAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9jb25zdGFudHMucHlQSwECFAMUAAAAAAAAACEAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAABxex0AcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL2ZpbHRlcnMvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAbtB8gG0CAABtAgAARgAAAAAAAAAAAAAAAADHex0AcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL2ZpbHRlcnMvYWxwaGFiZXRpY2FsYXR0cmlidXRlcy5weVBLAQIUAxQAAAAAAAAAIQAigPvEHgEAAB4BAAA0AAAAAAAAAAAAAAAAAJh+HQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvZmlsdGVycy9iYXNlLnB5UEsBAhQDFAAAAAAAAAAhACHAPIy2CgAAtgoAAEMAAAAAAAAAAAAAAAAACIAdAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9maWx0ZXJzL2luamVjdF9tZXRhX2NoYXJzZXQucHlQSwECFAMUAAAAAAAAACEAfevStSUNAAAlDQAANAAAAAAAAAAAAAAAAAAfix0AcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL2ZpbHRlcnMvbGludC5weVBLAQIUAxQAAAAAAAAAIQAh7Z0kJikAACYpAAA8AAAAAAAAAAAAAAAAAJaYHQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvZmlsdGVycy9vcHRpb25hbHRhZ3MucHlQSwECFAMUAAAAAAAAACEAmh5UmBhiAAAYYgAAOQAAAAAAAAAAAAAAAAAWwh0AcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL2ZpbHRlcnMvc2FuaXRpemVyLnB5UEsBAhQDFAAAAAAAAAAhAJ+Oaq1zBAAAcwQAADoAAAAAAAAAAAAAAAAAhSQeAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9maWx0ZXJzL3doaXRlc3BhY2UucHlQSwECFAMUAAAAAAAAACEAY9h33LLJAQCyyQEAMwAAAAAAAAAAAAAAAABQKR4AcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL2h0bWw1cGFyc2VyLnB5UEsBAhQDFAAAAAAAAAAhANzHuzRhNwAAYTcAADIAAAAAAAAAAAAAAAAAU/MfAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi9zZXJpYWxpemVyLnB5UEsBAhQDFAAAAAAAAAAhAIIyYyTQAAAA0AAAAD0AAAAAAAAAAAAAAAAABCsgAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVlYWRhcHRlcnMvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAMSfHvhMGAAATBgAAOwAAAAAAAAAAAAAAAAAvLCAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWVhZGFwdGVycy9nZW5zaGkucHlQSwECFAMUAAAAAAAAACEA5FxfEH0GAAB9BgAAOAAAAAAAAAAAAAAAAACbMiAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWVhZGFwdGVycy9zYXgucHlQSwECFAMUAAAAAAAAACEAR9k3bk4NAABODQAAPQAAAAAAAAAAAAAAAABuOSAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWVidWlsZGVycy9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQBEylaqdjYAAHY2AAA5AAAAAAAAAAAAAAAAABdHIABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZWJ1aWxkZXJzL2Jhc2UucHlQSwECFAMUAAAAAAAAACEACOou+IMiAACDIgAAOAAAAAAAAAAAAAAAAADkfSAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWVidWlsZGVycy9kb20ucHlQSwECFAMUAAAAAAAAACEAoX2X8NwxAADcMQAAOgAAAAAAAAAAAAAAAAC9oCAAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWVidWlsZGVycy9ldHJlZS5weVBLAQIUAxQAAAAAAAAAIQDa/krQUTcAAFE3AAA/AAAAAAAAAAAAAAAAAPHSIABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaHRtbDVsaWIvdHJlZWJ1aWxkZXJzL2V0cmVlX2x4bWwucHlQSwECFAMUAAAAAAAAACEAc0QhlqgVAACoFQAAPAAAAAAAAAAAAAAAAACfCiEAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWV3YWxrZXJzL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAE0jmMBLEwAASxMAADgAAAAAAAAAAAAAAAAAoSAhAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVld2Fsa2Vycy9iYXNlLnB5UEsBAhQDFAAAAAAAAAAhAGWKb6mFBQAAhQUAADcAAAAAAAAAAAAAAAAAQjQhAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVld2Fsa2Vycy9kb20ucHlQSwECFAMUAAAAAAAAACEAIsEQMUwSAABMEgAAOQAAAAAAAAAAAAAAAAAcOiEAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2h0bWw1bGliL3RyZWV3YWxrZXJzL2V0cmVlLnB5UEsBAhQDFAAAAAAAAAAhAJYNnEelGAAApRgAAD4AAAAAAAAAAAAAAAAAv0whAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVld2Fsa2Vycy9ldHJlZV9seG1sLnB5UEsBAhQDFAAAAAAAAAAhABNfbRAFCQAABQkAADoAAAAAAAAAAAAAAAAAwGUhAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9odG1sNWxpYi90cmVld2Fsa2Vycy9nZW5zaGkucHlQSwECFAMUAAAAAAAAACEAAEdcmzoAAAA6AAAALAAAAAAAAAAAAAAAAAAdbyEAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2lkbmEvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEA80jU6eMMAADjDAAAKQAAAAAAAAAAAAAAAAChbyEAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2lkbmEvY29kZWMucHlQSwECFAMUAAAAAAAAACEAfIGWcOgAAADoAAAAKgAAAAAAAAAAAAAAAADLfCEAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2lkbmEvY29tcGF0LnB5UEsBAhQDFAAAAAAAAAAhAAku+nF+LAAAfiwAACgAAAAAAAAAAAAAAAAA+30hAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9pZG5hL2NvcmUucHlQSwECFAMUAAAAAAAAACEAY7z6EeeAAADngAAALAAAAAAAAAAAAAAAAAC/qiEAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2lkbmEvaWRuYWRhdGEucHlQSwECFAMUAAAAAAAAACEAt2P0stUGAADVBgAALQAAAAAAAAAAAAAAAADwKyIAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2lkbmEvaW50cmFuZ2VzLnB5UEsBAhQDFAAAAAAAAAAhABvnfaIVAAAAFQAAADAAAAAAAAAAAAAAAAAAEDMiAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9pZG5hL3BhY2thZ2VfZGF0YS5weVBLAQIUAxQAAAAAAAAAIQDJhYWFcNICAHDSAgAtAAAAAAAAAAAAAAAAAHMzIgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvaWRuYS91dHM0NmRhdGEucHlQSwECFAMUAAAAAAAAACEA3cSmBTA5AQAwOQEAKAAAAAAAAAAAAAAAAAAuBiUAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2lwYWRkcmVzcy5weVBLAQIUAxQAAAAAAAAAIQDzmSOAmyQAAJskAAAwAAAAAAAAAAAAAAAAAKQ/JgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvbG9ja2ZpbGUvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAK97yJ1wKAABcCgAANAAAAAAAAAAAAAAAAACNZCYAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2xvY2tmaWxlL2xpbmtsb2NrZmlsZS5weVBLAQIUAxQAAAAAAAAAIQAhJrx+GAwAABgMAAA1AAAAAAAAAAAAAAAAADtvJgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvbG9ja2ZpbGUvbWtkaXJsb2NrZmlsZS5weVBLAQIUAxQAAAAAAAAAIQAgPHItyhcAAMoXAAAzAAAAAAAAAAAAAAAAAKZ7JgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvbG9ja2ZpbGUvcGlkbG9ja2ZpbGUucHlQSwECFAMUAAAAAAAAACEAu4XwvYIVAACCFQAANgAAAAAAAAAAAAAAAADBkyYAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL2xvY2tmaWxlL3NxbGl0ZWxvY2tmaWxlLnB5UEsBAhQDFAAAAAAAAAAhAJEjCdk4CgAAOAoAADcAAAAAAAAAAAAAAAAAl6kmAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9sb2NrZmlsZS9zeW1saW5rbG9ja2ZpbGUucHlQSwECFAMUAAAAAAAAACEA1lIZI/4PAAD+DwAAKgAAAAAAAAAAAAAAAAAktCYAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL29yZGVyZWRkaWN0LnB5UEsBAhQDFAAAAAAAAAAhADwpWMbQAgAA0AIAADIAAAAAAAAAAAAAAAAAasQmAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9wYWNrYWdpbmcvX19hYm91dF9fLnB5UEsBAhQDFAAAAAAAAAAhAIF2lsoBAgAAAQIAADEAAAAAAAAAAAAAAAAAiscmAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9wYWNrYWdpbmcvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEA5mlK41wDAABcAwAAMAAAAAAAAAAAAAAAAADaySYAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3BhY2thZ2luZy9fY29tcGF0LnB5UEsBAhQDFAAAAAAAAAAhAPr9pBKIBQAAiAUAADQAAAAAAAAAAAAAAAAAhM0mAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9wYWNrYWdpbmcvX3N0cnVjdHVyZXMucHlQSwECFAMUAAAAAAAAACEAfSwrVyYgAAAmIAAAMAAAAAAAAAAAAAAAAABe0yYAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3BhY2thZ2luZy9tYXJrZXJzLnB5UEsBAhQDFAAAAAAAAAAhAK4Rn/PnEAAA5xAAADUAAAAAAAAAAAAAAAAA0vMmAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9wYWNrYWdpbmcvcmVxdWlyZW1lbnRzLnB5UEsBAhQDFAAAAAAAAAAhAHxFg4x5bQAAeW0AADMAAAAAAAAAAAAAAAAADAUnAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9wYWNrYWdpbmcvc3BlY2lmaWVycy5weVBLAQIUAxQAAAAAAAAAIQDF6icPpQEAAKUBAAAuAAAAAAAAAAAAAAAAANZyJwBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcGFja2FnaW5nL3V0aWxzLnB5UEsBAhQDFAAAAAAAAAAhAA7vxqEkLQAAJC0AADAAAAAAAAAAAAAAAAAAx3QnAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9wYWNrYWdpbmcvdmVyc2lvbi5weVBLAQIUAxQAAAAAAAAAIQDJLUAmPpMBAD6TAQA1AAAAAAAAAAAAAAAAADmiJwBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcGtnX3Jlc291cmNlcy9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQD6WnGMzwsAAM8LAAAwAAAAAAAAAAAAAAAAAMo1KQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcHJvZ3Jlc3MvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAD8NGA30KAAB9CgAAKwAAAAAAAAAAAAAAAADnQSkAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3Byb2dyZXNzL2Jhci5weVBLAQIUAxQAAAAAAAAAIQAqf/Ew3gUAAN4FAAAvAAAAAAAAAAAAAAAAAK1MKQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcHJvZ3Jlc3MvY291bnRlci5weVBLAQIUAxQAAAAAAAAAIQDO7A9OJgsAACYLAAAvAAAAAAAAAAAAAAAAANhSKQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcHJvZ3Jlc3MvaGVscGVycy5weVBLAQIUAxQAAAAAAAAAIQB3CFJ7IgUAACIFAAAvAAAAAAAAAAAAAAAAAEteKQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcHJvZ3Jlc3Mvc3Bpbm5lci5weVBLAQIUAxQAAAAAAAAAIQDBIHSOq2sDAKtrAwAoAAAAAAAAAAAAAAAAALpjKQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcHlwYXJzaW5nLnB5UEsBAhQDFAAAAAAAAAAhAGAeB40FAwAABQMAACgAAAAAAAAAAAAAAAAAq88sAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZS12ZW5kb3IucHlQSwECFAMUAAAAAAAAACEAH8buMPcNAAD3DQAAMAAAAAAAAAAAAAAAAAD20iwAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAN98eSW0AQAAtAEAADMAAAAAAAAAAAAAAAAAO+EsAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9fX3ZlcnNpb25fXy5weVBLAQIUAxQAAAAAAAAAIQCIqTm7SAQAAEgEAAA3AAAAAAAAAAAAAAAAAEDjLABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvX2ludGVybmFsX3V0aWxzLnB5UEsBAhQDFAAAAAAAAAAhACNQ3lIYUgAAGFIAADAAAAAAAAAAAAAAAAAA3ecsAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9hZGFwdGVycy5weVBLAQIUAxQAAAAAAAAAIQCYY+gvXRgAAF0YAAArAAAAAAAAAAAAAAAAAEM6LQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvYXBpLnB5UEsBAhQDFAAAAAAAAAAhAAOt8pIAJgAAACYAACwAAAAAAAAAAAAAAAAA6VItAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9hdXRoLnB5UEsBAhQDFAAAAAAAAAAhAAWh2vXwIgQA8CIEAC8AAAAAAAAAAAAAAAAAM3ktAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9jYWNlcnQucGVtUEsBAhQDFAAAAAAAAAAhAIKyos/RAQAA0QEAAC0AAAAAAAAAAAAAAAAAcJwxAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9jZXJ0cy5weVBLAQIUAxQAAAAAAAAAIQB3yWFNWgYAAFoGAAAuAAAAAAAAAAAAAAAAAIyeMQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvY29tcGF0LnB5UEsBAhQDFAAAAAAAAAAhABNDyTMgRwAAIEcAAC8AAAAAAAAAAAAAAAAAMqUxAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9jb29raWVzLnB5UEsBAhQDFAAAAAAAAAAhAPnO6dArDAAAKwwAADIAAAAAAAAAAAAAAAAAn+wxAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9leGNlcHRpb25zLnB5UEsBAhQDFAAAAAAAAAAhAIQdYOJTDgAAUw4AACwAAAAAAAAAAAAAAAAAGvkxAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9oZWxwLnB5UEsBAhQDFAAAAAAAAAAhAHnao8r/AgAA/wIAAC0AAAAAAAAAAAAAAAAAtwcyAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9ob29rcy5weVBLAQIUAxQAAAAAAAAAIQBlfUd0A4UAAAOFAAAuAAAAAAAAAAAAAAAAAAELMgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvbW9kZWxzLnB5UEsBAhQDFAAAAAAAAAAhABI83oG3AgAAtwIAADAAAAAAAAAAAAAAAAAAUJAyAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9yZXF1ZXN0cy9wYWNrYWdlcy5weVBLAQIUAxQAAAAAAAAAIQBfn2aZmmsAAJprAAAwAAAAAAAAAAAAAAAAAFWTMgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvc2Vzc2lvbnMucHlQSwECFAMUAAAAAAAAACEAQTjX4vsMAAD7DAAANAAAAAAAAAAAAAAAAAA9/zIAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JlcXVlc3RzL3N0YXR1c19jb2Rlcy5weVBLAQIUAxQAAAAAAAAAIQDmIMoPxAsAAMQLAAAyAAAAAAAAAAAAAAAAAIoMMwBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvc3RydWN0dXJlcy5weVBLAQIUAxQAAAAAAAAAIQBHwdlXBGwAAARsAAAtAAAAAAAAAAAAAAAAAJ4YMwBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvcmVxdWVzdHMvdXRpbHMucHlQSwECFAMUAAAAAAAAACEAIXu8CvQmAAD0JgAAJwAAAAAAAAAAAAAAAADthDMAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3JldHJ5aW5nLnB5UEsBAhQDFAAAAAAAAAAhAJlYTVqSdQAAknUAACIAAAAAAAAAAAAAAAAAJqwzAHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci9zaXgucHlQSwECFAMUAAAAAAAAACEAkj71hyULAAAlCwAALwAAAAAAAAAAAAAAAAD4ITQAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAABnTlNwnAADcJwAAMwAAAAAAAAAAAAAAAABqLTQAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvX2NvbGxlY3Rpb25zLnB5UEsBAhQDFAAAAAAAAAAhAGCErqfLMgAAyzIAADEAAAAAAAAAAAAAAAAAl1U0AHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL2Nvbm5lY3Rpb24ucHlQSwECFAMUAAAAAAAAACEAFxocbx6KAAAeigAANQAAAAAAAAAAAAAAAACxiDQAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvY29ubmVjdGlvbnBvb2wucHlQSwECFAMUAAAAAAAAACEAAAAAAAAAAAAAAAAANwAAAAAAAAAAAAAAAAAiEzUAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvY29udHJpYi9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQAAAAAAAAAAAAAAAABIAAAAAAAAAAAAAAAAAHcTNQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9jb250cmliL19zZWN1cmV0cmFuc3BvcnQvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAt1mLfZhEAACYRAAASAAAAAAAAAAAAAAAAADdEzUAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvY29udHJpYi9fc2VjdXJldHJhbnNwb3J0L2JpbmRpbmdzLnB5UEsBAhQDFAAAAAAAAAAhAASv3JAeLwAAHi8AAEkAAAAAAAAAAAAAAAAA21g1AHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL2NvbnRyaWIvX3NlY3VyZXRyYW5zcG9ydC9sb3dfbGV2ZWwucHlQSwECFAMUAAAAAAAAACEAGMOtk3EqAABxKgAAOAAAAAAAAAAAAAAAAABgiDUAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvY29udHJpYi9hcHBlbmdpbmUucHlQSwECFAMUAAAAAAAAACEALqVxjX4RAAB+EQAANwAAAAAAAAAAAAAAAAAnszUAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvY29udHJpYi9udGxtcG9vbC5weVBLAQIUAxQAAAAAAAAAIQDzKrZx+jsAAPo7AAA4AAAAAAAAAAAAAAAAAPrENQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9jb250cmliL3B5b3BlbnNzbC5weVBLAQIUAxQAAAAAAAAAIQDnU8DzJXcAACV3AAA+AAAAAAAAAAAAAAAAAEoBNgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9jb250cmliL3NlY3VyZXRyYW5zcG9ydC5weVBLAQIUAxQAAAAAAAAAIQDQUymZMxgAADMYAAA0AAAAAAAAAAAAAAAAAMt4NgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9jb250cmliL3NvY2tzLnB5UEsBAhQDFAAAAAAAAAAhAPKayQPLGQAAyxkAADEAAAAAAAAAAAAAAAAAUJE2AHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL2V4Y2VwdGlvbnMucHlQSwECFAMUAAAAAAAAACEAATmMsjcXAAA3FwAALQAAAAAAAAAAAAAAAABqqzYAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvZmllbGRzLnB5UEsBAhQDFAAAAAAAAAAhANdd0BcRCQAAEQkAAC8AAAAAAAAAAAAAAAAA7MI2AHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL2ZpbGVwb3N0LnB5UEsBAhQDFAAAAAAAAAAhAI9doHxtAAAAbQAAADgAAAAAAAAAAAAAAAAASsw2AHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3BhY2thZ2VzL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAAAAAAAAAAAAAAAAAEIAAAAAAAAAAAAAAAAADc02AHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3BhY2thZ2VzL2JhY2twb3J0cy9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQBSVxy5tQUAALUFAABCAAAAAAAAAAAAAAAAAG3NNgBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9wYWNrYWdlcy9iYWNrcG9ydHMvbWFrZWZpbGUucHlQSwECFAMUAAAAAAAAACEARsGmZ+ciAADnIgAAPAAAAAAAAAAAAAAAAACC0zYAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvcGFja2FnZXMvb3JkZXJlZF9kaWN0LnB5UEsBAhQDFAAAAAAAAAAhAJlYTVqSdQAAknUAADMAAAAAAAAAAAAAAAAAw/Y2AHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3BhY2thZ2VzL3NpeC5weVBLAQIUAxQAAAAAAAAAIQD7bcrlsAIAALACAABLAAAAAAAAAAAAAAAAAKZsNwBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9wYWNrYWdlcy9zc2xfbWF0Y2hfaG9zdG5hbWUvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAtTqPK0YWAABGFgAAUgAAAAAAAAAAAAAAAAC/bzcAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvcGFja2FnZXMvc3NsX21hdGNoX2hvc3RuYW1lL19pbXBsZW1lbnRhdGlvbi5weVBLAQIUAxQAAAAAAAAAIQDwrhiS2T8AANk/AAAyAAAAAAAAAAAAAAAAAHWGNwBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9wb29sbWFuYWdlci5weVBLAQIUAxQAAAAAAAAAIQDKMeTEOhcAADoXAAAuAAAAAAAAAAAAAAAAAJ7GNwBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy9yZXF1ZXN0LnB5UEsBAhQDFAAAAAAAAAAhAD9KgmF3WQAAd1kAAC8AAAAAAAAAAAAAAAAAJN43AHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3Jlc3BvbnNlLnB5UEsBAhQDFAAAAAAAAAAhAFJ14b8UBAAAFAQAADQAAAAAAAAAAAAAAAAA6Dc4AHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3V0aWwvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAq59fPY0QAACNEAAANgAAAAAAAAAAAAAAAABOPDgAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvdXRpbC9jb25uZWN0aW9uLnB5UEsBAhQDFAAAAAAAAAAhAEFhkNd5DgAAeQ4AADMAAAAAAAAAAAAAAAAAL004AHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3V0aWwvcmVxdWVzdC5weVBLAQIUAxQAAAAAAAAAIQD0ORyfJwkAACcJAAA0AAAAAAAAAAAAAAAAAPlbOABweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL3Jlc3BvbnNlLnB5UEsBAhQDFAAAAAAAAAAhAD1h79sJOQAACTkAADEAAAAAAAAAAAAAAAAAcmU4AHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3V0aWwvcmV0cnkucHlQSwECFAMUAAAAAAAAACEAfc87PZtSAACbUgAANQAAAAAAAAAAAAAAAADKnjgAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvdXRpbC9zZWxlY3RvcnMucHlQSwECFAMUAAAAAAAAACEA1e/IorAvAACwLwAAMAAAAAAAAAAAAAAAAAC48TgAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3VybGxpYjMvdXRpbC9zc2xfLnB5UEsBAhQDFAAAAAAAAAAhAFVSziAdJgAAHSYAADMAAAAAAAAAAAAAAAAAtiE5AHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci91cmxsaWIzL3V0aWwvdGltZW91dC5weVBLAQIUAxQAAAAAAAAAIQDDHm0RVxkAAFcZAAAvAAAAAAAAAAAAAAAAACRIOQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL3VybC5weVBLAQIUAxQAAAAAAAAAIQC2PCP8qwUAAKsFAAAwAAAAAAAAAAAAAAAAAMhhOQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3IvdXJsbGliMy91dGlsL3dhaXQucHlQSwECFAMUAAAAAAAAACEAb8GhOFApAABQKQAANAAAAAAAAAAAAAAAAADBZzkAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3dlYmVuY29kaW5ncy9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQDHrQiLEyMAABMjAAAyAAAAAAAAAAAAAAAAAGOROQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3Ivd2ViZW5jb2RpbmdzL2xhYmVscy5weVBLAQIUAxQAAAAAAAAAIQBQfzEfGQUAABkFAAA0AAAAAAAAAAAAAAAAAMa0OQBweXBpX19waXBfOV8wXzMvcGlwL192ZW5kb3Ivd2ViZW5jb2RpbmdzL21rbGFiZWxzLnB5UEsBAhQDFAAAAAAAAAAhABabPh2iGQAAohkAADEAAAAAAAAAAAAAAAAAMbo5AHB5cGlfX3BpcF85XzBfMy9waXAvX3ZlbmRvci93ZWJlbmNvZGluZ3MvdGVzdHMucHlQSwECFAMUAAAAAAAAACEASG9FvtIQAADSEAAAOgAAAAAAAAAAAAAAAAAi1DkAcHlwaV9fcGlwXzlfMF8zL3BpcC9fdmVuZG9yL3dlYmVuY29kaW5ncy94X3VzZXJfZGVmaW5lZC5weVBLAQIUAxQAAAAAAAAAIQCCGIv1hi4AAIYuAAAiAAAAAAAAAAAAAAAAAEzlOQBweXBpX19waXBfOV8wXzMvcGlwL2Jhc2Vjb21tYW5kLnB5UEsBAhQDFAAAAAAAAAAhAKur/jvhKAAA4SgAACEAAAAAAAAAAAAAAAAAEhQ6AHB5cGlfX3BpcF85XzBfMy9waXAvYmFzZXBhcnNlci5weVBLAQIUAxQAAAAAAAAAIQBLmTIhWkAAAFpAAAAhAAAAAAAAAAAAAAAAADI9OgBweXBpX19waXBfOV8wXzMvcGlwL2NtZG9wdGlvbnMucHlQSwECFAMUAAAAAAAAACEAkA2HQ8QIAADECAAAKAAAAAAAAAAAAAAAAADLfToAcHlwaV9fcGlwXzlfMF8zL3BpcC9jb21tYW5kcy9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQAdYTtfZgUAAGYFAAAl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AAAAAAAAAAAAAAAAADJGQwBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL19fYWJvdXRfXy5weVBLAQIUAxQAAAAAAAAAIQCBdpbKAQIAAAECAABDAAAAAAAAAAAAAAAAAGRJQwBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAOZpSuNcAwAAXAMAAEIAAAAAAAAAAAAAAAAAxktDAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvX2NvbXBhdC5weVBLAQIUAxQAAAAAAAAAIQD6/aQSiAUAAIgFAABGAAAAAAAAAAAAAAAAAIJPQwBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL19zdHJ1Y3R1cmVzLnB5UEsBAhQDFAAAAAAAAAAhADD4E9w4IAAAOCAAAEIAAAAAAAAAAAAAAAAAblVDAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3BrZ19yZXNvdXJjZXMvX3ZlbmRvci9wYWNrYWdpbmcvbWFya2Vycy5weVBLAQIUAxQAAAAAAAAAIQClhh3bAxEAAAMRAABHAAAAAAAAAAAAAAAAAAZ2QwBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL3JlcXVpcmVtZW50cy5weVBLAQIUAxQAAAAAAAAAIQB8RYOMeW0AAHltAABFAAAAAAAAAAAAAAAAAG6HQwBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL3NwZWNpZmllcnMucHlQSwECFAMUAAAAAAAAACEAxeonD6UBAAClAQAAQAAAAAAAAAAAAAAAAABK9UMAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3BhY2thZ2luZy91dGlscy5weVBLAQIUAxQAAAAAAAAAIQAO78ahJC0AACQtAABCAAAAAAAAAAAAAAAAAE33QwBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL192ZW5kb3IvcGFja2FnaW5nL3ZlcnNpb24ucHlQSwECFAMUAAAAAAAAACEAeCgUw+uBAwDrgQMAOgAAAAAAAAAAAAAAAADRJEQAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvcGtnX3Jlc291cmNlcy9fdmVuZG9yL3B5cGFyc2luZy5weVBLAQIUAxQAAAAAAAAAIQCZWE1aknUAAJJ1AAA0AAAAAAAAAAAAAAAAABSnRwBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9wa2dfcmVzb3VyY2VzL192ZW5kb3Ivc2l4LnB5UEsBAhQDFAAAAAAAAAAhAHXY8Xm3CQAAtwkAADgAAAAAAAAAAAAAAAAA+BxIAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3BrZ19yZXNvdXJjZXMvZXh0ZXJuL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAMdHfTJYAgAAWAIAADMAAAAAAAAAAAAAAAAABSdIAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3BrZ19yZXNvdXJjZXMvcHkzMWNvbXBhdC5weVBLAQIUAxQAAAAAAAAAIQB/1LpcjgUAAI4FAABDAAAAAAAAAAAAAAAAAK4pSABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzLTM4LjIuNC5kaXN0LWluZm8vREVTQ1JJUFRJT04ucnN0UEsBAhQDFAAAAAAAAAAhAFDXqwc2BAAANgQAAD8AAAAAAAAAAAAAAAAAnS9IAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMtMzguMi40LmRpc3QtaW5mby9MSUNFTlNFLnR4dFBLAQIUAxQAAAAAAAAAIQDxDJD/7goAAO4KAAA8AAAAAAAAAAAAAAAAADA0SABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzLTM4LjIuNC5kaXN0LWluZm8vTUVUQURBVEFQSwECFAMUAAAAAAAAACEAXKwmp4MeAACDHgAAOgAAAAAAAAAAAAAAAAB4P0gAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL1JFQ09SRFBLAQIUAxQAAAAAAAAAIQD23dK+bgAAAG4AAAA5AAAAAAAAAAAAAAAAAFNeSABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzLTM4LjIuNC5kaXN0LWluZm8vV0hFRUxQSwECFAMUAAAAAAAAACEAN9lf3e8AAADvAAAASAAAAAAAAAAAAAAAAAAYX0gAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy0zOC4yLjQuZGlzdC1pbmZvL2RlcGVuZGVuY3lfbGlua3MudHh0UEsBAhQDFAAAAAAAAAAhANE1jo6uCwAArgsAAEQAAAAAAAAAAAAAAAAAbWBIAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMtMzguMi40LmRpc3QtaW5mby9lbnRyeV9wb2ludHMudHh0UEsBAhQDFAAAAAAAAAAhAPvWIPUlEwAAJRMAAEEAAAAAAAAAAAAAAAAAfWxIAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMtMzguMi40LmRpc3QtaW5mby9tZXRhZGF0YS5qc29uUEsBAhQDFAAAAAAAAAAhADBcAZEmAAAAJgAAAEEAAAAAAAAAAAAAAAAAAYBIAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMtMzguMi40LmRpc3QtaW5mby90b3BfbGV2ZWwudHh0UEsBAhQDFAAAAAAAAAAhAJMG1zIBAAAAAQAAADwAAAAAAAAAAAAAAAAAhoBIAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMtMzguMi40LmRpc3QtaW5mby96aXAtc2FmZVBLAQIUAxQAAAAAAAAAIQAjC0oDRBYAAEQWAAAuAAAAAAAAAAAAAAAAAOGASABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAKWHZVHAGQAAwBkAADIAAAAAAAAAAAAAAAAAcZdIAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvYXJjaGl2ZV91dGlsLnB5UEsBAhQDFAAAAAAAAAAhAB/iPRwnFgAAJxYAADAAAAAAAAAAAAAAAAAAgbFIAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvYnVpbGRfbWV0YS5weVBLAQIUAxQAAAAAAAAAIQD1hnppAAABAAAAAQAtAAAAAAAAAAAAAAAAAPbHSABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NsaS0zMi5leGVQSwECFAMUAAAAAAAAACEAYnDO2wAkAQAAJAEALQAAAAAAAAAAAAAAAABByEkAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jbGktNjQuZXhlUEsBAhQDFAAAAAAAAAAhAPWGemkAAAEAAAABACoAAAAAAAAAAAAAAAAAjOxKAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY2xpLmV4ZVBLAQIUAxQAAAAAAAAAIQBBnBZSUgIAAFICAAA2AAAAAAAAAAAAAAAAANTsSwBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAUPgj8noJAAB6CQAAMwAAAAAAAAAAAAAAAAB670sAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL2FsaWFzLnB5UEsBAhQDFAAAAAAAAAAhAEnMK6FbRgAAW0YAADcAAAAAAAAAAAAAAAAARflLAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9iZGlzdF9lZ2cucHlQSwECFAMUAAAAAAAAACEA69J0FuQFAADkBQAANwAAAAAAAAAAAAAAAAD1P0wAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL2JkaXN0X3JwbS5weVBLAQIUAxQAAAAAAAAAIQAgjHUUfQIAAH0CAAA7AAAAAAAAAAAAAAAAAC5GTABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvYmRpc3Rfd2luaW5zdC5weVBLAQIUAxQAAAAAAAAAIQAnGo0bhBEAAIQRAAA4AAAAAAAAAAAAAAAAAARJTABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvYnVpbGRfY2xpYi5weVBLAQIUAxQAAAAAAAAAIQCRpWnn+TIAAPkyAAA3AAAAAAAAAAAAAAAAAN5aTABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvYnVpbGRfZXh0LnB5UEsBAhQDFAAAAAAAAAAhAEBGQtx8JQAAfCUAADYAAAAAAAAAAAAAAAAALI5MAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9idWlsZF9weS5weVBLAQIUAxQAAAAAAAAAIQBAXDv/bh8AAG4fAAA1AAAAAAAAAAAAAAAAAPyzTABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvZGV2ZWxvcC5weVBLAQIUAxQAAAAAAAAAIQD/6PaRwAMAAMADAAA3AAAAAAAAAAAAAAAAAL3TTABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvZGlzdF9pbmZvLnB5UEsBAhQDFAAAAAAAAAAhAKt0EulVVAEAVVQBADoAAAAAAAAAAAAAAAAA0tdMAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9lYXN5X2luc3RhbGwucHlQSwECFAMUAAAAAAAAACEATixyQnBhAABwYQAANgAAAAAAAAAAAAAAAAB/LE4AcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL2VnZ19pbmZvLnB5UEsBAhQDFAAAAAAAAAAhAI3btT9LEgAASxIAADUAAAAAAAAAAAAAAAAAQ45OAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9pbnN0YWxsLnB5UEsBAhQDFAAAAAAAAAAhAFzSqOWbCAAAmwgAAD4AAAAAAAAAAAAAAAAA4aBOAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9pbnN0YWxsX2VnZ19pbmZvLnB5UEsBAhQDFAAAAAAAAAAhAJCcO1MADwAAAA8AADkAAAAAAAAAAAAAAAAA2KlOAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9pbnN0YWxsX2xpYi5weVBLAQIUAxQAAAAAAAAAIQBGP/EehwkAAIcJAAA9AAAAAAAAAAAAAAAAAC+5TgBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvaW5zdGFsbF9zY3JpcHRzLnB5UEsBAhQDFAAAAAAAAAAhAH1zYL96EwAAehMAADgAAAAAAAAAAAAAAAAAEcNOAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9weTM2Y29tcGF0LnB5UEsBAhQDFAAAAAAAAAAhAM3/rZAOAQAADgEAADYAAAAAAAAAAAAAAAAA4dZOAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9yZWdpc3Rlci5weVBLAQIUAxQAAAAAAAAAIQAZytSkdAgAAHQIAAA0AAAAAAAAAAAAAAAAAEPYTgBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvcm90YXRlLnB5UEsBAhQDFAAAAAAAAAAhAASB1jSSAgAAkgIAADYAAAAAAAAAAAAAAAAACeFOAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC9zYXZlb3B0cy5weVBLAQIUAxQAAAAAAAAAIQC3H9FuNxoAADcaAAAzAAAAAAAAAAAAAAAAAO/jTgBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvc2Rpc3QucHlQSwECFAMUAAAAAAAAACEAm3DLx90TAADdEwAANAAAAAAAAAAAAAAAAAB3/k4AcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9jb21tYW5kL3NldG9wdC5weVBLAQIUAxQAAAAAAAAAIQDdGeGe/iMAAP4jAAAyAAAAAAAAAAAAAAAAAKYSTwBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvdGVzdC5weVBLAQIUAxQAAAAAAAAAIQDZJItnlAQAAJQEAAA0AAAAAAAAAAAAAAAAAPQ2TwBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbW1hbmQvdXBsb2FkLnB5UEsBAhQDFAAAAAAAAAAhAPKX88aPHAAAjxwAADkAAAAAAAAAAAAAAAAA2jtPAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvY29tbWFuZC91cGxvYWRfZG9jcy5weVBLAQIUAxQAAAAAAAAAIQCJRxAksT8AALE/AAAsAAAAAAAAAAAAAAAAAMBYTwBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2NvbmZpZy5weVBLAQIUAxQAAAAAAAAAIQAaIgQypwMAAKcDAAAuAAAAAAAAAAAAAAAAALuYTwBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2RlcF91dGlsLnB5UEsBAhQDFAAAAAAAAAAhAFspLWrNFgAAzRYAAC0AAAAAAAAAAAAAAAAArpxPAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvZGVwZW5kcy5weVBLAQIUAxQAAAAAAAAAIQAldIcFkJ0AAJCdAAAqAAAAAAAAAAAAAAAAAMazTwBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2Rpc3QucHlQSwECFAMUAAAAAAAAACEAuaqR7sEGAADBBgAALwAAAAAAAAAAAAAAAACeUVAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9leHRlbnNpb24ucHlQSwECFAMUAAAAAAAAACEA0Ip7ZYMAAACDAAAANQAAAAAAAAAAAAAAAACsWFAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9leHRlcm4vX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEABOrBvUoMAABKDAAAKwAAAAAAAAAAAAAAAACCWVAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9nbGliYy5weVBLAQIUAxQAAAAAAAAAIQC8XaE5VxQAAFcUAAAqAAAAAAAAAAAAAAAAABVmUABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2dsb2IucHlQSwECFAMUAAAAAAAAACEAEPn8KQAAAQAAAAEALQAAAAAAAAAAAAAAAAC0elAAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9ndWktMzIuZXhlUEsBAhQDFAAAAAAAAAAhANgOq/QAJgEAACYBAC0AAAAAAAAAAAAAAAAA/3pRAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvZ3VpLTY0LmV4ZVBLAQIUAxQAAAAAAAAAIQAQ+fwpAAABAAAAAQAqAAAAAAAAAAAAAAAAAEqhUgBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL2d1aS5leGVQSwECFAMUAAAAAAAAACEAZPl+mxMDAAATAwAALAAAAAAAAAAAAAAAAACSoVMAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9sYXVuY2gucHlQSwECFAMUAAAAAAAAACEAh1Hrot0HAADdBwAAMAAAAAAAAAAAAAAAAADvpFMAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9saWIydG8zX2V4LnB5UEsBAhQDFAAAAAAAAAAhAI1Dcl6dFgAAnRYAACwAAAAAAAAAAAAAAAAAGq1TAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvbW9ua2V5LnB5UEsBAhQDFAAAAAAAAAAhAILDlOa0nwAAtJ8AACoAAAAAAAAAAAAAAAAAAcRTAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvbXN2Yy5weVBLAQIUAxQAAAAAAAAAIQBjC+PWfwwAAH8MAAAwAAAAAAAAAAAAAAAAAP1jVABweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL25hbWVzcGFjZXMucHlQSwECFAMUAAAAAAAAACEAibATzjueAAA7ngAAMwAAAAAAAAAAAAAAAADKcFQAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9wYWNrYWdlX2luZGV4LnB5UEsBAhQDFAAAAAAAAAAhAOXm6L6CKgAAgioAADAAAAAAAAAAAAAAAAAAVg9VAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvcGVwNDI1dGFncy5weVBLAQIUAxQAAAAAAAAAIQCyZqdXGAIAABgCAAAwAAAAAAAAAAAAAAAAACY6VQBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL3B5Mjdjb21wYXQucHlQSwECFAMUAAAAAAAAACEA0LlIWqgEAACoBAAAMAAAAAAAAAAAAAAAAACMPFUAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9weTMxY29tcGF0LnB5UEsBAhQDFAAAAAAAAAAhAMlhksDmAwAA5gMAADAAAAAAAAAAAAAAAAAAgkFVAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvcHkzM2NvbXBhdC5weVBLAQIUAxQAAAAAAAAAIQCFGZoLSwsAAEsLAAAwAAAAAAAAAAAAAAAAALZFVQBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL3B5MzZjb21wYXQucHlQSwECFAMUAAAAAAAAACEAjFOaY8Q3AADENwAALQAAAAAAAAAAAAAAAABPUVUAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9zYW5kYm94LnB5UEsBAhQDFAAAAAAAAAAhAKgztL6KAAAAigAAAC4AAAAAAAAAAAAAAAAAXolVAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvc2NyaXB0LnRtcGxQSwECFAMUAAAAAAAAACEAAsGU4wMJAAADCQAAMAAAAAAAAAAAAAAAAAA0ilUAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy9zaXRlLXBhdGNoLnB5UEsBAhQDFAAAAAAAAAAhAIibW04sIQAALCEAADEAAAAAAAAAAAAAAAAAhZNVAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvc3NsX3N1cHBvcnQucHlQSwECFAMUAAAAAAAAACEAmkLXmuQDAADkAwAAMwAAAAAAAAAAAAAAAAAAtVUAcHlwaV9fc2V0dXB0b29sc18zOF8yXzQvc2V0dXB0b29scy91bmljb2RlX3V0aWxzLnB5UEsBAhQDFAAAAAAAAAAhAEixTGKQAAAAkAAAAC0AAAAAAAAAAAAAAAAANblVAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvdmVyc2lvbi5weVBLAQIUAxQAAAAAAAAAIQBwHQjzQRwAAEEcAAArAAAAAAAAAAAAAAAAABC6VQBweXBpX19zZXR1cHRvb2xzXzM4XzJfNC9zZXR1cHRvb2xzL3doZWVsLnB5UEsBAhQDFAAAAAAAAAAhAPnL7g3KAgAAygIAADUAAAAAAAAAAAAAAAAAmtZVAHB5cGlfX3NldHVwdG9vbHNfMzhfMl80L3NldHVwdG9vbHMvd2luZG93c19zdXBwb3J0LnB5UEsBAhQDFAAAAAAAAAAhAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAt9lVAHB5cGlfX3doZWVsXzBfMzBfMGEwL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAIg6pdRVJgAAVSYAAD0AAAAAAAAAAAAAAAAA9dlVAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsLTAuMzAuMGEwLmRpc3QtaW5mby9ERVNDUklQVElPTi5yc3RQSwECFAMUAAAAAAAAACEAcP+un2UEAABlBAAAOQAAAAAAAAAAAAAAAAClAFYAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwtMC4zMC4wYTAuZGlzdC1pbmZvL0xJQ0VOU0UudHh0UEsBAhQDFAAAAAAAAAAhAERtmYENKwAADSsAADYAAAAAAAAAAAAAAAAAYQVWAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsLTAuMzAuMGEwLmRpc3QtaW5mby9NRVRBREFUQVBLAQIUAxQAAAAAAAAAIQCnD7sWnQ8AAJ0PAAA0AAAAAAAAAAAAAAAAAMIwVgBweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC0wLjMwLjBhMC5kaXN0LWluZm8vUkVDT1JEUEsBAhQDFAAAAAAAAAAhAJTflntxAAAAcQAAADMAAAAAAAAAAAAAAAAAsUBWAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsLTAuMzAuMGEwLmRpc3QtaW5mby9XSEVFTFBLAQIUAxQAAAAAAAAAIQDiRd+sbQAAAG0AAAA+AAAAAAAAAAAAAAAAAHNBVgBweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC0wLjMwLjBhMC5kaXN0LWluZm8vZW50cnlfcG9pbnRzLnR4dFBLAQIUAxQAAAAAAAAAIQBSsk7WWgYAAFoGAAA7AAAAAAAAAAAAAAAAADxCVgBweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC0wLjMwLjBhMC5kaXN0LWluZm8vbWV0YWRhdGEuanNvblBLAQIUAxQAAAAAAAAAIQAZY95lBgAAAAYAAAA7AAAAAAAAAAAAAAAAAO9IVgBweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC0wLjMwLjBhMC5kaXN0LWluZm8vdG9wX2xldmVsLnR4dFBLAQIUAxQAAAAAAAAAIQBhN6VHYwAAAGMAAAAmAAAAAAAAAAAAAAAAAE5JVgBweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQAkabdUoAEAAKABAAAmAAAAAAAAAAAAAAAAAPVJVgBweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC9fX21haW5fXy5weVBLAQIUAxQAAAAAAAAAIQAgU4JSxwgAAMcIAAAlAAAAAAAAAAAAAAAAANlLVgBweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC9hcmNoaXZlLnB5UEsBAhQDFAAAAAAAAAAhAEqvJNHoRwAA6EcAACkAAAAAAAAAAAAAAAAA41RWAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL2JkaXN0X3doZWVsLnB5UEsBAhQDFAAAAAAAAAAhAKN5UncdAgAAHQIAACcAAAAAAAAAAAAAAAAAEp1WAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL2RlY29yYXRvci5weVBLAQIUAxQAAAAAAAAAIQDTYQ8k0wsAANMLAAAnAAAAAAAAAAAAAAAAAHSfVgBweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC9lZ2cyd2hlZWwucHlQSwECFAMUAAAAAAAAACEAECTyM7oJAAC6CQAAJwAAAAAAAAAAAAAAAACMq1YAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvZWdnbmFtZXMudHh0UEsBAhQDFAAAAAAAAAAhALG8ufayRgAAskYAACUAAAAAAAAAAAAAAAAAi7VWAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL2luc3RhbGwucHlQSwECFAMUAAAAAAAAACEAOSh3C5wtAACcLQAAJgAAAAAAAAAAAAAAAACA/FYAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvbWV0YWRhdGEucHlQSwECFAMUAAAAAAAAACEAYfY10moEAABqBAAAIwAAAAAAAAAAAAAAAABgKlcAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvcGF0aHMucHlQSwECFAMUAAAAAAAAACEAa2JWfMUWAADFFgAAKAAAAAAAAAAAAAAAAAALL1cAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvcGVwNDI1dGFncy5weVBLAQIUAxQAAAAAAAAAIQCAQxigyQQAAMkEAAAlAAAAAAAAAAAAAAAAABZGVwBweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC9wa2dpbmZvLnB5UEsBAhQDFAAAAAAAAAAhAPxM5kzDDgAAww4AADEAAAAAAAAAAAAAAAAAIktXAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3NpZ25hdHVyZXMvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEA/FD/4GMaAABjGgAALgAAAAAAAAAAAAAAAAA0WlcAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvc2lnbmF0dXJlcy9kamJlYy5weVBLAQIUAxQAAAAAAAAAIQBMASU+nwYAAJ8GAAAyAAAAAAAAAAAAAAAAAON0VwBweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC9zaWduYXR1cmVzL2VkMjU1MTlweS5weVBLAQIUAxQAAAAAAAAAIQDb2+It9AwAAPQMAAAtAAAAAAAAAAAAAAAAANJ7VwBweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC9zaWduYXR1cmVzL2tleXMucHlQSwECFAMUAAAAAAAAACEA/55lcAEAAAABAAAAKwAAAAAAAAAAAAAAAAARiVcAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQAAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAAAAFuJVwBweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L2NvbXBsZXgtZGlzdC9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQBKF0fSFwAAABcAAABEAAAAAAAAAAAAAAAAALGJVwBweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L2NvbXBsZXgtZGlzdC9jb21wbGV4ZGlzdC9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQAcChc4VwMAAFcDAAA1AAAAAAAAAAAAAAAAACqKVwBweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L2NvbXBsZXgtZGlzdC9zZXR1cC5weVBLAQIUAxQAAAAAAAAAIQAoSxhlmQYAAJkGAAArAAAAAAAAAAAAAAAAANSNVwBweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L2NvbmZ0ZXN0LnB5UEsBAhQDFAAAAAAAAAAhAAAAAAAAAAAAAAAAADoAAAAAAAAAAAAAAAAAtpRXAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvZXh0ZW5zaW9uLmRpc3QvX19pbml0X18ucHlQSwECFAMUAAAAAAAAACEAX4bMT8gBAADIAQAANwAAAAAAAAAAAAAAAAAOlVcAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9leHRlbnNpb24uZGlzdC9zZXR1cC5weVBLAQIUAxQAAAAAAAAAIQAAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAAAACuXVwBweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L2hlYWRlcnMuZGlzdC9fX2luaXRfXy5weVBLAQIUAxQAAAAAAAAAIQAAAAAAAAAAAAAAAAA1AAAAAAAAAAAAAAAAAIGXVwBweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L2hlYWRlcnMuZGlzdC9oZWFkZXIuaFBLAQIUAxQAAAAAAAAAIQAAAAAAAAAAAAAAAAA7AAAAAAAAAAAAAAAAANSXVwBweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L2hlYWRlcnMuZGlzdC9oZWFkZXJzZGlzdC5weVBLAQIUAxQAAAAAAAAAIQCZxCcsRAEAAEQBAAA1AAAAAAAAAAAAAAAAAC2YVwBweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L2hlYWRlcnMuZGlzdC9zZXR1cC5weVBLAQIUAxQAAAAAAAAAIQBqPt3X2ywAANssAAAyAAAAAAAAAAAAAAAAAMSZVwBweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L3B5ZGlzdC1zY2hlbWEuanNvblBLAQIUAxQAAAAAAAAAIQAAAAAAAAAAAAAAAAA3AAAAAAAAAAAAAAAAAO/GVwBweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L3NpbXBsZS5kaXN0L19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhANNNBKN/AQAAfwEAADQAAAAAAAAAAAAAAAAARMdXAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3Qvc2ltcGxlLmRpc3Qvc2V0dXAucHlQSwECFAMUAAAAAAAAACEAAAAAAAAAAAAAAAAAQgAAAAAAAAAAAAAAAAAVyVcAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC9zaW1wbGUuZGlzdC9zaW1wbGVkaXN0L19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAHbgTPpqFAAAahQAAD8AAAAAAAAAAAAAAAAAdclXAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvdGVzdC0xLjAtcHkyLnB5My1ub25lLXdpbjMyLndobFBLAQIUAxQAAAAAAAAAIQA4K+8RbRkAAG0ZAAAtAAAAAAAAAAAAAAAAADzeVwBweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90ZXN0L3Rlc3RfYmFzaWMucHlQSwECFAMUAAAAAAAAACEAbQSyvkoHAABKBwAALwAAAAAAAAAAAAAAAAD091cAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC90ZXN0X2luc3RhbGwucHlQSwECFAMUAAAAAAAAACEA92Efkw8KAAAPCgAALAAAAAAAAAAAAAAAAACL/1cAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC90ZXN0X2tleXMucHlQSwECFAMUAAAAAAAAACEAYlh0Y6wAAACsAAAALQAAAAAAAAAAAAAAAADkCVgAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC90ZXN0X3BhdGhzLnB5UEsBAhQDFAAAAAAAAAAhAG2WMfnYBQAA2AUAAC8AAAAAAAAAAAAAAAAA2wpYAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvdGVzdF9yYW5raW5nLnB5UEsBAhQDFAAAAAAAAAAhAKQpfzFgBAAAYAQAADIAAAAAAAAAAAAAAAAAABFYAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvdGVzdF9zaWduYXR1cmVzLnB5UEsBAhQDFAAAAAAAAAAhAJxXQvAnFwAAJxcAAC4AAAAAAAAAAAAAAAAAsBVYAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3Rlc3QvdGVzdF90YWdvcHQucHlQSwECFAMUAAAAAAAAACEA1D4fVpACAACQAgAALAAAAAAAAAAAAAAAAAAjLVgAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC90ZXN0X3Rvb2wucHlQSwECFAMUAAAAAAAAACEARWJETOkRAADpEQAAMQAAAAAAAAAAAAAAAAD9L1gAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvdGVzdC90ZXN0X3doZWVsZmlsZS5weVBLAQIUAxQAAAAAAAAAIQCjLQMXoTMAAKEzAAArAAAAAAAAAAAAAAAAADVCWABweXBpX193aGVlbF8wXzMwXzBhMC93aGVlbC90b29sL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAM/YM7IaEwAAGhMAACIAAAAAAAAAAAAAAAAAH3ZYAHB5cGlfX3doZWVsXzBfMzBfMGEwL3doZWVsL3V0aWwucHlQSwECFAMUAAAAAAAAACEA87TkKLceAAC3HgAAKwAAAAAAAAAAAAAAAAB5iVgAcHlwaV9fd2hlZWxfMF8zMF8wYTAvd2hlZWwvd2luaW5zdDJ3aGVlbC5weVBLAQIUAxQAAAAAAAAAIQAAAAAAAAAAAAAAAAAiAAAAAAAAAAAAAAAAAHmoWABydWxlc19weXRob24vcGFja2FnaW5nL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhADN5jRsWMgAAFjIAAB4AAAAAAAAAAAAAAAAAuahYAHJ1bGVzX3B5dGhvbi9wYWNrYWdpbmcvcGlwdG9vbFBLAQIUAxQAAAAAAAAAIQCwRhTkOR4AADkeAAAhAAAAAAAAAAAAAAAAAAvbWABydWxlc19weXRob24vcGFja2FnaW5nL3BpcHRvb2wucHlQSwECFAMUAAAAAAAAACEAzk1ZsmAWAABgFgAAHQAAAAAAAAAAAAAAAACD+VgAcnVsZXNfcHl0aG9uL3BhY2thZ2luZy93aGwucHlQSwECFAMUAAAAAAAAACEAAAAAAAAAAAAAAAAAEgAAAAAAAAAAAAAAAAAeEFkAc3VicGFyL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAAAAAAAAAAAAAAAAABoAAAAAAAAAAAAAAAAAThBZAHN1YnBhci9ydW50aW1lL19faW5pdF9fLnB5UEsBAhQDFAAAAAAAAAAhAI+gczy3LgAAty4AABkAAAAAAAAAAAAAAAAAhhBZAHN1YnBhci9ydW50aW1lL3N1cHBvcnQucHlQSwUGAAAAALIBsgEhoAAAdD9ZAAAA